summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Anthony Giusti <kgiusti@apache.org>2012-05-02 13:09:18 +0000
committerKenneth Anthony Giusti <kgiusti@apache.org>2012-05-02 13:09:18 +0000
commit71bf4631e282b6a2be55cff6c6a5719907534c5e (patch)
tree8aae83a9361b0dad3f05647c706ccc0ac5fbe9e7
parentd12b91bcc48f166c7676cdbff37cda6ed98595ec (diff)
downloadqpid-python-71bf4631e282b6a2be55cff6c6a5719907534c5e.tar.gz
QPID-3767: update (resync) this branch to latest trunk (r1332660)
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/qpid-3767@1333027 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/cpp/bindings/qmf/ruby/qmf.rb26
-rw-r--r--qpid/cpp/bindings/qpid/python/python.i42
-rw-r--r--qpid/cpp/bindings/qpid/ruby/README.rdoc2
-rw-r--r--qpid/cpp/bindings/qpid/ruby/Rakefile4
-rw-r--r--qpid/cpp/bindings/qpid/ruby/features/step_definitions/address_steps.rb19
-rw-r--r--qpid/cpp/bindings/qpid/ruby/features/step_definitions/connection_steps.rb19
-rw-r--r--qpid/cpp/bindings/qpid/ruby/features/step_definitions/receiver_steps.rb19
-rw-r--r--qpid/cpp/bindings/qpid/ruby/features/step_definitions/sender_steps.rb19
-rw-r--r--qpid/cpp/bindings/qpid/ruby/features/step_definitions/session_steps.rb19
-rw-r--r--qpid/cpp/bindings/qpid/ruby/lib/qpid/encoding.rb6
-rw-r--r--qpid/cpp/bindings/qpid/ruby/lib/qpid/version.rb2
-rw-r--r--qpid/cpp/bindings/swig_python_typemaps.i6
-rw-r--r--qpid/cpp/configure.ac44
-rw-r--r--qpid/cpp/etc/Makefile.am6
-rw-r--r--qpid/cpp/etc/cluster.conf-example.xml.in27
-rwxr-xr-xqpid/cpp/etc/qpidd.in7
-rw-r--r--qpid/cpp/include/qpid/Options.h4
-rw-r--r--qpid/cpp/include/qpid/Url.h2
-rw-r--r--qpid/cpp/include/qpid/framing/Array.h22
-rw-r--r--qpid/cpp/managementgen/qmfgen/management-types.xml2
-rwxr-xr-xqpid/cpp/managementgen/qmfgen/schema.py12
-rwxr-xr-xqpid/cpp/rubygen/framing.0-10/structs.rb26
-rw-r--r--qpid/cpp/src/CMakeLists.txt9
-rw-r--r--qpid/cpp/src/Makefile.am3
-rw-r--r--qpid/cpp/src/acl.mk2
-rw-r--r--qpid/cpp/src/ha.mk16
-rw-r--r--qpid/cpp/src/posix/QpiddBroker.cpp4
-rw-r--r--qpid/cpp/src/qpid/Options.cpp7
-rw-r--r--qpid/cpp/src/qpid/UrlArray.cpp2
-rw-r--r--qpid/cpp/src/qpid/UrlArray.h1
-rw-r--r--qpid/cpp/src/qpid/acl/Acl.cpp95
-rw-r--r--qpid/cpp/src/qpid/acl/Acl.h92
-rw-r--r--qpid/cpp/src/qpid/acl/AclConnectionCounter.cpp211
-rw-r--r--qpid/cpp/src/qpid/acl/AclConnectionCounter.h79
-rw-r--r--qpid/cpp/src/qpid/acl/AclData.cpp14
-rw-r--r--qpid/cpp/src/qpid/acl/AclPlugin.cpp4
-rw-r--r--qpid/cpp/src/qpid/acl/management-schema.xml31
-rw-r--r--qpid/cpp/src/qpid/broker/AclModule.h19
-rw-r--r--qpid/cpp/src/qpid/broker/Bridge.cpp15
-rw-r--r--qpid/cpp/src/qpid/broker/Bridge.h13
-rw-r--r--qpid/cpp/src/qpid/broker/Broker.cpp2
-rw-r--r--qpid/cpp/src/qpid/broker/ConnectionHandler.cpp1
-rw-r--r--qpid/cpp/src/qpid/broker/DtxManager.cpp29
-rw-r--r--qpid/cpp/src/qpid/broker/DtxManager.h3
-rw-r--r--qpid/cpp/src/qpid/broker/DtxWorkRecord.cpp11
-rw-r--r--qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp3
-rw-r--r--qpid/cpp/src/qpid/broker/Fairshare.cpp1
-rw-r--r--qpid/cpp/src/qpid/broker/LegacyLVQ.cpp29
-rw-r--r--qpid/cpp/src/qpid/broker/LegacyLVQ.h1
-rw-r--r--qpid/cpp/src/qpid/broker/Link.cpp257
-rw-r--r--qpid/cpp/src/qpid/broker/Link.h42
-rw-r--r--qpid/cpp/src/qpid/broker/LinkRegistry.cpp17
-rw-r--r--qpid/cpp/src/qpid/broker/MessageDeque.cpp20
-rw-r--r--qpid/cpp/src/qpid/broker/MessageDeque.h7
-rw-r--r--qpid/cpp/src/qpid/broker/MessageGroupManager.cpp8
-rw-r--r--qpid/cpp/src/qpid/broker/MessageGroupManager.h3
-rw-r--r--qpid/cpp/src/qpid/broker/MessageMap.cpp78
-rw-r--r--qpid/cpp/src/qpid/broker/MessageMap.h2
-rw-r--r--qpid/cpp/src/qpid/broker/PriorityQueue.cpp118
-rw-r--r--qpid/cpp/src/qpid/broker/PriorityQueue.h27
-rw-r--r--qpid/cpp/src/qpid/broker/Queue.cpp41
-rw-r--r--qpid/cpp/src/qpid/broker/Queue.h3
-rw-r--r--qpid/cpp/src/qpid/broker/QueuedMessage.cpp34
-rw-r--r--qpid/cpp/src/qpid/broker/QueuedMessage.h3
-rw-r--r--qpid/cpp/src/qpid/broker/SaslAuthenticator.cpp1
-rw-r--r--qpid/cpp/src/qpid/broker/SessionAdapter.cpp51
-rw-r--r--qpid/cpp/src/qpid/broker/SessionAdapter.h4
-rw-r--r--qpid/cpp/src/qpid/broker/SessionHandler.cpp5
-rw-r--r--qpid/cpp/src/qpid/broker/SessionHandler.h10
-rw-r--r--qpid/cpp/src/qpid/broker/windows/SaslAuthenticator.cpp1
-rw-r--r--qpid/cpp/src/qpid/client/ConnectionHandler.cpp10
-rw-r--r--qpid/cpp/src/qpid/client/ConnectionImpl.cpp4
-rw-r--r--qpid/cpp/src/qpid/client/LoadPlugins.cpp6
-rw-r--r--qpid/cpp/src/qpid/client/SslConnector.cpp4
-rw-r--r--qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp1
-rw-r--r--qpid/cpp/src/qpid/cluster/Cluster.cpp28
-rw-r--r--qpid/cpp/src/qpid/cluster/ClusterMap.cpp1
-rw-r--r--qpid/cpp/src/qpid/cluster/Connection.cpp49
-rw-r--r--qpid/cpp/src/qpid/cluster/Connection.h2
-rw-r--r--qpid/cpp/src/qpid/cluster/UpdateClient.cpp11
-rw-r--r--qpid/cpp/src/qpid/framing/FieldTable.cpp31
-rw-r--r--qpid/cpp/src/qpid/framing/FrameSet.cpp4
-rw-r--r--qpid/cpp/src/qpid/framing/FrameSet.h1
-rw-r--r--qpid/cpp/src/qpid/ha/Backup.cpp36
-rw-r--r--qpid/cpp/src/qpid/ha/Backup.h4
-rw-r--r--qpid/cpp/src/qpid/ha/BrokerReplicator.cpp194
-rw-r--r--qpid/cpp/src/qpid/ha/BrokerReplicator.h14
-rw-r--r--qpid/cpp/src/qpid/ha/HaBroker.cpp24
-rw-r--r--qpid/cpp/src/qpid/ha/HaBroker.h6
-rw-r--r--qpid/cpp/src/qpid/ha/HaPlugin.cpp3
-rw-r--r--qpid/cpp/src/qpid/ha/QueueReplicator.cpp55
-rw-r--r--qpid/cpp/src/qpid/ha/QueueReplicator.h3
-rw-r--r--qpid/cpp/src/qpid/ha/ReplicateLevel.cpp72
-rw-r--r--qpid/cpp/src/qpid/ha/ReplicateLevel.h52
-rw-r--r--qpid/cpp/src/qpid/ha/ReplicatingSubscription.cpp71
-rw-r--r--qpid/cpp/src/qpid/ha/ReplicatingSubscription.h2
-rw-r--r--qpid/cpp/src/qpid/ha/Settings.h4
-rw-r--r--qpid/cpp/src/qpid/ha/management-schema.xml8
-rw-r--r--qpid/cpp/src/qpid/management/ManagementAgent.cpp1
-rw-r--r--qpid/cpp/src/qpid/management/ManagementAgent.h1
-rw-r--r--qpid/cpp/src/qpid/replication/ReplicatingEventListener.cpp2
-rw-r--r--qpid/cpp/src/qpid/replication/ReplicationExchange.cpp8
-rw-r--r--qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp113
-rw-r--r--qpid/cpp/src/tests/Array.cpp4
-rw-r--r--qpid/cpp/src/tests/CMakeLists.txt6
-rw-r--r--qpid/cpp/src/tests/FieldTable.cpp4
-rw-r--r--qpid/cpp/src/tests/FramingTest.cpp1
-rw-r--r--qpid/cpp/src/tests/Makefile.am19
-rw-r--r--qpid/cpp/src/tests/MessagingSessionTests.cpp7
-rw-r--r--qpid/cpp/src/tests/QueueFlowLimitTest.cpp1
-rw-r--r--qpid/cpp/src/tests/Uuid.cpp2
-rwxr-xr-xqpid/cpp/src/tests/acl.py285
-rwxr-xr-xqpid/cpp/src/tests/ais_check34
-rw-r--r--qpid/cpp/src/tests/brokertest.py56
-rw-r--r--qpid/cpp/src/tests/cluster.cmake2
-rw-r--r--qpid/cpp/src/tests/cluster.mk11
-rwxr-xr-xqpid/cpp/src/tests/cluster_failover7
-rwxr-xr-xqpid/cpp/src/tests/cluster_python_tests3
-rwxr-xr-xqpid/cpp/src/tests/cluster_read_credit4
-rwxr-xr-xqpid/cpp/src/tests/cluster_test_logs.py6
-rwxr-xr-xqpid/cpp/src/tests/cluster_tests.py118
-rwxr-xr-xqpid/cpp/src/tests/clustered_replication_test17
-rwxr-xr-xqpid/cpp/src/tests/cpg_check.sh.in38
-rwxr-xr-xqpid/cpp/src/tests/federated_cluster_test23
-rwxr-xr-xqpid/cpp/src/tests/ha_tests.py326
-rwxr-xr-xqpid/cpp/src/tests/ipv6_test3
-rwxr-xr-xqpid/cpp/src/tests/qpid-cluster-benchmark29
-rwxr-xr-xqpid/cpp/src/tests/qpid-cpp-benchmark69
-rw-r--r--qpid/cpp/src/tests/qpid-send.cpp28
-rw-r--r--qpid/cpp/src/tests/qpid-txtest.cpp5
-rw-r--r--qpid/cpp/src/tests/qpidd-empty.conf3
-rwxr-xr-xqpid/cpp/src/tests/run_acl_tests22
-rwxr-xr-xqpid/cpp/src/tests/run_cluster_authentication_soak3
-rwxr-xr-xqpid/cpp/src/tests/run_cluster_authentication_test3
-rwxr-xr-xqpid/cpp/src/tests/run_cluster_test3
-rwxr-xr-xqpid/cpp/src/tests/run_cluster_tests4
-rwxr-xr-xqpid/cpp/src/tests/run_failover_soak3
-rwxr-xr-xqpid/cpp/src/tests/run_federation_sys_tests8
-rwxr-xr-xqpid/cpp/src/tests/run_federation_tests15
-rw-r--r--qpid/cpp/src/tests/sasl.mk21
-rwxr-xr-xqpid/cpp/src/tests/sasl_fed_ex_dynamic_cluster4
-rwxr-xr-xqpid/cpp/src/tests/sasl_fed_ex_link_cluster3
-rwxr-xr-xqpid/cpp/src/tests/sasl_fed_ex_queue_cluster3
-rwxr-xr-xqpid/cpp/src/tests/sasl_fed_ex_route_cluster3
-rwxr-xr-xqpid/cpp/src/tests/ssl_test3
-rwxr-xr-xqpid/cpp/src/tests/start_cluster3
-rw-r--r--qpid/cpp/src/tests/test_env.sh.in1
-rw-r--r--qpid/cpp/src/windows/QpiddBroker.cpp4
-rw-r--r--qpid/cpp/xml/cluster.xml6
-rw-r--r--qpid/doc/book/Makefile37
-rw-r--r--qpid/doc/book/README.txt118
-rwxr-xr-xqpid/doc/book/build-book.sh63
-rwxr-xr-xqpid/doc/book/build-chapter.sh44
-rwxr-xr-xqpid/doc/book/build.sh40
-rw-r--r--qpid/doc/book/build.xml193
-rw-r--r--qpid/doc/book/src/AMQP-Messaging-Broker-Java.xml72
-rw-r--r--qpid/doc/book/src/Active-Passive-Cluster.xml639
-rw-r--r--qpid/doc/book/src/Broker-Configuration-Guide.xml28
-rw-r--r--qpid/doc/book/src/How-to-Use-JNDI.xml175
-rw-r--r--qpid/doc/book/src/Makefile.inc63
-rw-r--r--qpid/doc/book/src/Qpid-JMX-Management-Console-User-Guide.xml793
-rw-r--r--qpid/doc/book/src/amqp-advanced-message-queueing-protocol.html237
-rw-r--r--qpid/doc/book/src/common/css/style.css279
-rw-r--r--qpid/doc/book/src/cpp-broker/AMQP-Compatibility.xml (renamed from qpid/doc/book/src/AMQP-Compatibility.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/AMQP-Messaging-Broker-CPP-Book.xml (renamed from qpid/doc/book/src/AMQP-Messaging-Broker-CPP-Book.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/Active-Active-Cluster.xml (renamed from qpid/doc/book/src/Active-Active-Cluster.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/Active-Passive-Cluster.xml661
-rw-r--r--qpid/doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Exchange-Options.xml (renamed from qpid/doc/book/src/Cheat-Sheet-for-configuring-Exchange-Options.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Queue-Options.xml (renamed from qpid/doc/book/src/Cheat-Sheet-for-configuring-Queue-Options.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/HA-Queue-Replication.xml (renamed from qpid/doc/book/src/HA-Queue-Replication.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/LVQ.xml (renamed from qpid/doc/book/src/LVQ.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/Makefile20
-rw-r--r--qpid/doc/book/src/cpp-broker/Managing-CPP-Broker.xml (renamed from qpid/doc/book/src/Managing-CPP-Broker.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/QMF-Python-Console-Tutorial.xml (renamed from qpid/doc/book/src/QMF-Python-Console-Tutorial.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/Qpid-Interoperability-Documentation.xml (renamed from qpid/doc/book/src/Qpid-Interoperability-Documentation.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/Qpid-Management-Framework.xml (renamed from qpid/doc/book/src/Qpid-Management-Framework.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/Running-CPP-Broker.xml (renamed from qpid/doc/book/src/Running-CPP-Broker.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/Security.xml (renamed from qpid/doc/book/src/Security.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/Using-Broker-Federation.xml (renamed from qpid/doc/book/src/Using-Broker-Federation.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/Using-message-groups.xml (renamed from qpid/doc/book/src/Using-message-groups.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/producer-flow-control.xml (renamed from qpid/doc/book/src/producer-flow-control.xml)0
-rw-r--r--qpid/doc/book/src/cpp-broker/queue-state-replication.xml (renamed from qpid/doc/book/src/queue-state-replication.xml)0
-rw-r--r--qpid/doc/book/src/css/style.css129
-rw-r--r--qpid/doc/book/src/java-broker/AMQP-Messaging-Broker-Java-Book.xml (renamed from qpid/doc/book/src/AMQP-Messaging-Broker-Java-Book.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Add-New-Users.xml (renamed from qpid/doc/book/src/Add-New-Users.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Broker-Configuration-Guide.xml28
-rw-r--r--qpid/doc/book/src/java-broker/Configure-ACLs.xml (renamed from qpid/doc/book/src/Configure-ACLs.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Configure-Java-Qpid-to-use-a-SSL-connection.xml (renamed from qpid/doc/book/src/Configure-Java-Qpid-to-use-a-SSL-connection.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Configure-Log4j-CompositeRolling-Appender.xml (renamed from qpid/doc/book/src/Configure-Log4j-CompositeRolling-Appender.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Configure-the-Broker-via-config.xml.xml (renamed from qpid/doc/book/src/Configure-the-Broker-via-config.xml.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml (renamed from qpid/doc/book/src/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Configuring-Management-Users.xml (renamed from qpid/doc/book/src/Configuring-Management-Users.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Configuring-Qpid-JMX-Management-Console.xml (renamed from qpid/doc/book/src/Configuring-Qpid-JMX-Management-Console.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Debug-using-log4j.xml (renamed from qpid/doc/book/src/Debug-using-log4j.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/How-to-Tune-M3-Java-Broker-Performance.xml (renamed from qpid/doc/book/src/How-to-Tune-M3-Java-Broker-Performance.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/How-to-Use-SlowConsumerDisconnect.xml (renamed from qpid/doc/book/src/How-to-Use-SlowConsumerDisconnect.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Java-Broker-Feature-Guide.xml (renamed from qpid/doc/book/src/Java-Broker-Feature-Guide.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Java-Environment-Variables.xml (renamed from qpid/doc/book/src/Java-Environment-Variables.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Makefile20
-rw-r--r--qpid/doc/book/src/java-broker/Management-Console-Security.xml (renamed from qpid/doc/book/src/Management-Console-Security.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/MessageStore-Tool.xml (renamed from qpid/doc/book/src/MessageStore-Tool.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Qpid-JMX-Management-Console-FAQ.xml (renamed from qpid/doc/book/src/Qpid-JMX-Management-Console-FAQ.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Qpid-JMX-Management-Console-User-Guide.xml793
-rw-r--r--qpid/doc/book/src/java-broker/Qpid-JMX-Management-Console.xml (renamed from qpid/doc/book/src/Qpid-JMX-Management-Console.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Qpid-Java-Broker-Management-CLI.xml (renamed from qpid/doc/book/src/Qpid-Java-Broker-Management-CLI.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Qpid-Java-Build-How-To.xml (renamed from qpid/doc/book/src/Qpid-Java-Build-How-To.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Qpid-Java-FAQ.xml (renamed from qpid/doc/book/src/Qpid-Java-FAQ.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Qpid-Management-Features.xml (renamed from qpid/doc/book/src/Qpid-Management-Features.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Qpid-Troubleshooting-Guide.xml (renamed from qpid/doc/book/src/Qpid-Troubleshooting-Guide.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Topic-Configuration.xml (renamed from qpid/doc/book/src/java/broker/configuration/Topic-Configuration.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/Use-Priority-Queues.xml (renamed from qpid/doc/book/src/Use-Priority-Queues.xml)0
-rw-r--r--qpid/doc/book/src/java-broker/images/3113098.png (renamed from qpid/doc/book/src/images/jmx_console/3113098.png)bin9805 -> 9805 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113099.png (renamed from qpid/doc/book/src/images/jmx_console/3113099.png)bin12882 -> 12882 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113100.png (renamed from qpid/doc/book/src/images/jmx_console/3113100.png)bin38529 -> 38529 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113101.png (renamed from qpid/doc/book/src/images/jmx_console/3113101.png)bin45933 -> 45933 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113102.png (renamed from qpid/doc/book/src/images/jmx_console/3113102.png)bin7126 -> 7126 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113103.png (renamed from qpid/doc/book/src/images/jmx_console/3113103.png)bin34693 -> 34693 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113104.png (renamed from qpid/doc/book/src/images/jmx_console/3113104.png)bin61810 -> 61810 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113105.png (renamed from qpid/doc/book/src/images/jmx_console/3113105.png)bin26365 -> 26365 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113106.png (renamed from qpid/doc/book/src/images/jmx_console/3113106.png)bin45911 -> 45911 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113107.png (renamed from qpid/doc/book/src/images/jmx_console/3113107.png)bin31789 -> 31789 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113108.png (renamed from qpid/doc/book/src/images/jmx_console/3113108.png)bin39198 -> 39198 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113109.png (renamed from qpid/doc/book/src/images/jmx_console/3113109.png)bin13295 -> 13295 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113110.png (renamed from qpid/doc/book/src/images/jmx_console/3113110.png)bin38715 -> 38715 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113111.png (renamed from qpid/doc/book/src/images/jmx_console/3113111.png)bin52694 -> 52694 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113112.png (renamed from qpid/doc/book/src/images/jmx_console/3113112.png)bin39276 -> 39276 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113113.png (renamed from qpid/doc/book/src/images/jmx_console/3113113.png)bin46459 -> 46459 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113114.png (renamed from qpid/doc/book/src/images/jmx_console/3113114.png)bin64661 -> 64661 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113115.png (renamed from qpid/doc/book/src/images/jmx_console/3113115.png)bin38902 -> 38902 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113116.png (renamed from qpid/doc/book/src/images/jmx_console/3113116.png)bin9252 -> 9252 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113117.png (renamed from qpid/doc/book/src/images/jmx_console/3113117.png)bin40855 -> 40855 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113118.png (renamed from qpid/doc/book/src/images/jmx_console/3113118.png)bin13796 -> 13796 bytes
-rw-r--r--qpid/doc/book/src/java-broker/images/3113119.png (renamed from qpid/doc/book/src/images/jmx_console/3113119.png)bin39115 -> 39115 bytes
-rw-r--r--qpid/doc/book/src/old/ACL.xml (renamed from qpid/doc/book/src/ACL.xml)0
-rw-r--r--qpid/doc/book/src/old/AMQP-.NET-Messaging-Client.xml (renamed from qpid/doc/book/src/AMQP-.NET-Messaging-Client.xml)0
-rw-r--r--qpid/doc/book/src/old/AMQP-C++-Messaging-Client.xml (renamed from qpid/doc/book/src/AMQP-C++-Messaging-Client.xml)0
-rw-r--r--qpid/doc/book/src/old/AMQP-Java-JMS-Messaging-Client.xml (renamed from qpid/doc/book/src/AMQP-Java-JMS-Messaging-Client.xml)0
-rw-r--r--qpid/doc/book/src/old/AMQP-Messaging-Broker-CPP.xml (renamed from qpid/doc/book/src/AMQP-Messaging-Broker-CPP.xml)0
-rw-r--r--qpid/doc/book/src/old/AMQP-Python-Messaging-Client.xml (renamed from qpid/doc/book/src/AMQP-Python-Messaging-Client.xml)0
-rw-r--r--qpid/doc/book/src/old/AMQP-Ruby-Messaging-Client.xml (renamed from qpid/doc/book/src/AMQP-Ruby-Messaging-Client.xml)0
-rw-r--r--qpid/doc/book/src/old/AMQP.xml (renamed from qpid/doc/book/src/AMQP.xml)0
-rw-r--r--qpid/doc/book/src/old/Binding-URL-Format.xml (renamed from qpid/doc/book/src/Binding-URL-Format.xml)0
-rw-r--r--qpid/doc/book/src/old/Book-Info.xml (renamed from qpid/doc/book/src/Book-Info.xml)0
-rw-r--r--qpid/doc/book/src/old/Book.xml (renamed from qpid/doc/book/src/Book.xml)0
-rw-r--r--qpid/doc/book/src/old/Broker-CPP.xml (renamed from qpid/doc/book/src/Broker-CPP.xml)0
-rw-r--r--qpid/doc/book/src/old/Broker-Java.xml (renamed from qpid/doc/book/src/Broker-Java.xml)0
-rw-r--r--qpid/doc/book/src/old/Clients.xml (renamed from qpid/doc/book/src/Clients.xml)0
-rw-r--r--qpid/doc/book/src/old/Connection-URL-Format.xml (renamed from qpid/doc/book/src/Connection-URL-Format.xml)0
-rw-r--r--qpid/doc/book/src/old/Download.xml (renamed from qpid/doc/book/src/Download.xml)0
-rw-r--r--qpid/doc/book/src/old/Excel-AddIn.xml (renamed from qpid/doc/book/src/Excel-AddIn.xml)0
-rw-r--r--qpid/doc/book/src/old/FAQ.xml (renamed from qpid/doc/book/src/FAQ.xml)0
-rw-r--r--qpid/doc/book/src/old/Getting-Started.xml (renamed from qpid/doc/book/src/Getting-Started.xml)0
-rw-r--r--qpid/doc/book/src/old/How-to-Use-JNDI.xml175
-rw-r--r--qpid/doc/book/src/old/InfoPlugin.xml (renamed from qpid/doc/book/src/InfoPlugin.xml)0
-rw-r--r--qpid/doc/book/src/old/Introduction.xml (renamed from qpid/doc/book/src/Introduction.xml)0
-rw-r--r--qpid/doc/book/src/old/Java-Broker-StatusLogMessages.xml (renamed from qpid/doc/book/src/Java-Broker-StatusLogMessages.xml)0
-rw-r--r--qpid/doc/book/src/old/Java-JMS-Selector-Syntax.xml (renamed from qpid/doc/book/src/Java-JMS-Selector-Syntax.xml)0
-rw-r--r--qpid/doc/book/src/old/Management-Design-notes.xml (renamed from qpid/doc/book/src/Management-Design-notes.xml)0
-rw-r--r--qpid/doc/book/src/old/NET-User-Guide.xml (renamed from qpid/doc/book/src/NET-User-Guide.xml)0
-rw-r--r--qpid/doc/book/src/old/PythonBrokerTest.xml (renamed from qpid/doc/book/src/PythonBrokerTest.xml)0
-rw-r--r--qpid/doc/book/src/old/QMan-Qpid-Management-bridge.xml (renamed from qpid/doc/book/src/QMan-Qpid-Management-bridge.xml)0
-rw-r--r--qpid/doc/book/src/old/Qpid-ACLs.xml (renamed from qpid/doc/book/src/Qpid-ACLs.xml)0
-rw-r--r--qpid/doc/book/src/old/Qpid-Book.xml (renamed from qpid/doc/book/src/Qpid-Book.xml)0
-rw-r--r--qpid/doc/book/src/old/Qpid-Compatibility-And-Interoperability-Book.xml (renamed from qpid/doc/book/src/Qpid-Compatibility-And-Interoperability-Book.xml)0
-rw-r--r--qpid/doc/book/src/old/SASL-Compatibility.xml (renamed from qpid/doc/book/src/SASL-Compatibility.xml)0
-rw-r--r--qpid/doc/book/src/old/SSL.xml (renamed from qpid/doc/book/src/SSL.xml)0
-rw-r--r--qpid/doc/book/src/old/Security-Plugins.xml (renamed from qpid/doc/book/src/Security-Plugins.xml)0
-rw-r--r--qpid/doc/book/src/old/System-Properties.xml (renamed from qpid/doc/book/src/System-Properties.xml)0
-rw-r--r--qpid/doc/book/src/old/Using-Qpid-with-other-JNDI-Providers.xml (renamed from qpid/doc/book/src/Using-Qpid-with-other-JNDI-Providers.xml)0
-rw-r--r--qpid/doc/book/src/old/WCF.xml (renamed from qpid/doc/book/src/WCF.xml)0
-rw-r--r--qpid/doc/book/src/old/schemas.xml (renamed from qpid/doc/book/src/schemas.xml)0
-rw-r--r--qpid/doc/book/src/programming/Makefile20
-rw-r--r--qpid/doc/book/src/programming/Message-Groups-Guide.xml (renamed from qpid/doc/book/src/Message-Groups-Guide.xml)0
-rw-r--r--qpid/doc/book/src/programming/Programming-In-Apache-Qpid-Book.xml (renamed from qpid/doc/book/src/Programming-In-Apache-Qpid.xml)0
-rw-r--r--qpid/doc/book/src/qmf/QmfBook.xml (renamed from qpid/doc/book/src/QmfBook.xml)0
-rw-r--r--qpid/doc/book/src/qmf/QmfIntroduction.xml (renamed from qpid/doc/book/src/QmfIntroduction.xml)0
-rw-r--r--qpid/doc/book/xsl/html-custom.xsl188
-rw-r--r--qpid/java/.gitignore2
-rw-r--r--qpid/java/amqp-1-0-client-jms/build.xml29
-rw-r--r--qpid/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/Hello.java178
-rw-r--r--qpid/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/hello.properties28
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/AmqpMessage.java32
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/BytesMessage.java26
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Connection.java37
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java31
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionMetaData.java28
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Destination.java28
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/JavaSerializable.java24
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MapMessage.java37
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Message.java178
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageConsumer.java36
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageProducer.java27
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ObjectMessage.java27
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Queue.java26
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueBrowser.java30
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueConnection.java30
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueReceiver.java29
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSender.java29
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSession.java42
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Session.java75
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/StreamMessage.java26
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryDestination.java33
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryQueue.java26
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryTopic.java26
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TextMessage.java26
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Topic.java26
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicConnection.java30
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicPublisher.java26
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSession.java43
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSubscriber.java29
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/AmqpMessageImpl.java78
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/BytesMessageImpl.java538
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java173
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java329
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionMetaDataImpl.java105
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java85
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MapMessageImpl.java444
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java447
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageFactory.java191
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java1209
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageProducerImpl.java362
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ObjectMessageImpl.java143
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java138
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueConnectionImpl.java48
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java56
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueReceiverImpl.java57
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSenderImpl.java36
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSessionImpl.java56
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java898
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/StreamMessageImpl.java466
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryQueueImpl.java105
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryTopicImpl.java110
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TextMessageImpl.java93
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicConnectionImpl.java48
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java56
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicPublisherImpl.java36
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSessionImpl.java55
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSubscriberImpl.java133
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java37
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java230
-rw-r--r--qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java527
-rw-r--r--qpid/java/amqp-1-0-client/build.xml29
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/AcknowledgeMode.java28
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Command.java43
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java481
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Demo.java407
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Dump.java116
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filereceiver.java327
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filesender.java276
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Message.java148
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/ReadBytes.java77
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receive.java246
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java561
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Request.java249
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Respond.java347
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Send.java244
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SendBytes.java331
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java392
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Session.java354
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Transaction.java49
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransactionController.java194
-rw-r--r--qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Util.java529
-rw-r--r--qpid/java/amqp-1-0-common/build.xml27
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractDescribedTypeWriter.java188
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractListWriter.java41
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractMapWriter.java95
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayTypeConstructor.java113
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayWriter.java82
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryString.java68
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryTypeConstructor.java80
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryWriter.java75
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanConstructor.java80
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanWriter.java70
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteArrayWriter.java66
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteBufferWriter.java75
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteTypeConstructor.java59
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteWriter.java90
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharTypeConstructor.java67
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharWriter.java53
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeAssembler.java36
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeConstructor.java192
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java420
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DecimalConstructor.java230
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DefaultDescribedTypeConstructor.java70
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DelegatingValueWriter.java52
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedType.java85
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructor.java41
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructorRegistry.java35
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleTypeConstructor.java58
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleWriter.java54
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/Encoder.java85
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedEightWriter.java108
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedFourWriter.java122
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedOneWriter.java79
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedSixteenWriter.java150
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedTwoWriter.java96
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatTypeConstructor.java58
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatWriter.java54
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FrameWriter.java245
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntTypeConstructor.java58
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntegerWriter.java106
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ListWriter.java172
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongTypeConstructor.java58
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongWriter.java111
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/MapWriter.java102
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullTypeConstructor.java44
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullWriter.java70
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHandler.java30
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHeaderHandler.java146
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/RestrictedTypeValueWriter.java55
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortTypeConstructor.java58
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortWriter.java55
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SimpleVariableWidthWriter.java68
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallIntConstructor.java58
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallLongConstructor.java58
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallUIntConstructor.java58
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallULongConstructor.java59
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringTypeConstructor.java132
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringWriter.java146
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolArrayWriter.java170
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolTypeConstructor.java109
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolWriter.java102
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampTypeConstructor.java60
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampWriter.java57
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TypeConstructor.java32
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UByteTypeConstructor.java59
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UIntTypeConstructor.java59
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ULongTypeConstructor.java61
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UShortTypeConstructor.java60
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDTypeConstructor.java62
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDWriter.java63
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedByteWriter.java92
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedIntegerWriter.java148
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java152
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedShortWriter.java56
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueHandler.java159
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueProducingProtocolHandler.java31
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueWriter.java58
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthTypeConstructor.java48
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthWriter.java169
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/WrapperTypeValueWriter.java55
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroListConstructor.java46
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroUIntConstructor.java45
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroULongConstructor.java45
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQFrame.java68
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQPProtocolHeaderHandler.java85
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java559
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameHandler.java329
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameParsingError.java34
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameTypeHandler.java31
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/OversizeFrameException.java42
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrame.java42
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrameHandler.java311
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLProtocolHeaderHandler.java86
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/TransportFrame.java51
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/MessageAttributes.java27
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoder.java35
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoderImpl.java62
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoder.java34
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoderImpl.java111
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPFrameTransport.java179
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPTransport.java170
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesProcessor.java27
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesTransport.java38
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CallbackHandlerSource.java28
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CircularBytesBuffer.java174
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEndpoint.java934
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEventListener.java43
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionState.java31
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Container.java79
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Delivery.java95
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/DeliveryStateHandler.java28
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ErrorHandler.java9
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameOutputHandler.java36
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameTransport.java37
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java542
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEventListener.java31
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Node.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ProtocolHeaderTransport.java134
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java438
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkListener.java43
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingSessionHalfEndpoint.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpoint.java39
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpointImpl.java291
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLFrameTransport.java78
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLTransport.java85
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkEndpoint.java214
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkListener.java43
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingSessionHalfEndpoint.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SequenceNumber.java110
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionAttachment.java92
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java781
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEventListener.java47
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionHalfEndpoint.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionState.java34
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/StateChangeListener.java25
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/UnsettledTransfer.java53
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/AmqpErrorException.java54
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java161
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DeliveryState.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DistributionMode.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/ErrorCondition.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/FrameBody.java29
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/GlobalTxId.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/LifetimePolicy.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Outcome.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/RestrictedType.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/SaslFrameBody.java27
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Section.java27
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Source.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Symbol.java90
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Target.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnCapability.java26
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnId.java23
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedByte.java134
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedInteger.java149
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedLong.java162
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedShort.java132
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/WrapperType.java27
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java389
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Accepted.java46
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpSequence.java70
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpValue.java66
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ApplicationProperties.java64
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Data.java68
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnClose.java46
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinks.java46
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinksOrMessages.java46
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoMessages.java46
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeliveryAnnotations.java64
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ExactSubjectFilter.java82
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Filter.java28
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Footer.java70
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Header.java161
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/JMSSelectorFilter.java77
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MatchingSubjectFilter.java81
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MessageAnnotations.java64
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Modified.java112
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/NoLocalFilter.java45
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Properties.java333
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Received.java88
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Rejected.java70
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Released.java46
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Source.java280
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/StdDistMode.java95
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Target.java196
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusDurability.java107
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusExpiryPolicy.java119
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedConstructor.java72
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedWriter.java151
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceConstructor.java68
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceWriter.java80
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueConstructor.java65
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueWriter.java80
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesConstructor.java68
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesWriter.java80
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataConstructor.java65
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataWriter.java80
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseConstructor.java72
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseWriter.java142
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksConstructor.java72
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesConstructor.java72
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesWriter.java142
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksWriter.java142
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesConstructor.java72
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesWriter.java142
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsConstructor.java68
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsWriter.java80
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterConstructor.java64
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterWriter.java78
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterConstructor.java68
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterWriter.java80
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderConstructor.java207
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderWriter.java182
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterConstructor.java66
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterWriter.java79
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterConstructor.java65
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterWriter.java79
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsConstructor.java68
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsWriter.java80
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedConstructor.java154
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedWriter.java166
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterConstructor.java56
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterWriter.java89
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesConstructor.java424
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesWriter.java246
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedConstructor.java126
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedWriter.java158
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedConstructor.java99
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedWriter.java150
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedConstructor.java72
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedWriter.java142
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceConstructor.java384
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceWriter.java230
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetConstructor.java269
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetWriter.java198
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslChallenge.java74
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslCode.java131
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslInit.java116
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java74
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslOutcome.java95
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslResponse.java74
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeConstructor.java99
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeWriter.java150
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitConstructor.java153
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitWriter.java166
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsConstructor.java106
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsWriter.java150
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeConstructor.java126
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeWriter.java158
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseConstructor.java99
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseWriter.java150
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Coordinator.java70
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declare.java66
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declared.java67
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Discharge.java87
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionErrors.java107
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionalState.java88
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapabilities.java144
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapability.java131
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorConstructor.java117
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorWriter.java150
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareConstructor.java99
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareWriter.java150
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredConstructor.java99
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredWriter.java150
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeConstructor.java126
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeWriter.java158
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateConstructor.java126
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateWriter.java158
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/AmqpError.java227
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Attach.java365
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Begin.java239
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Close.java89
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ConnectionError.java107
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Detach.java131
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Disposition.java194
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/End.java89
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Error.java111
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Flow.java302
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/LinkError.java131
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Open.java281
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ReceiverSettleMode.java95
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Role.java95
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SenderSettleMode.java107
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SessionError.java119
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Transfer.java299
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachConstructor.java465
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachWriter.java254
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginConstructor.java303
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginWriter.java206
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseConstructor.java99
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseWriter.java150
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachConstructor.java153
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachWriter.java166
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionConstructor.java234
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionWriter.java190
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndConstructor.java99
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndWriter.java150
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorConstructor.java169
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorWriter.java166
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowConstructor.java370
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowWriter.java230
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenConstructor.java371
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenWriter.java222
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferConstructor.java369
-rw-r--r--qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferWriter.java230
-rw-r--r--qpid/java/bdbstore/build.xml2
-rwxr-xr-xqpid/java/bdbstore/etc/scripts/bdbtest.sh43
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java1825
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java2044
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java40
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/BindingRecord.java62
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/ExchangeRecord.java53
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/PreparedTransaction.java12
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueEntryKey.java12
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueRecord.java66
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/AMQShortStringBinding.java51
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java37
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ExchangeBinding.java60
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/PreparedTransactionBinding.java35
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueBinding.java79
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueBindingTupleBinding.java81
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java12
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractStoreUpgrade.java42
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorOperation.java2
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/StoreUpgrade.java3
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4To5.java65
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6.java933
-rw-r--r--qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/Upgrader.java11
-rw-r--r--qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java14
-rw-r--r--qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java66
-rw-r--r--qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java1
-rw-r--r--qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBindingTest.java61
-rw-r--r--qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractUpgradeTestCase.java10
-rw-r--r--qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4to5Test.java4
-rw-r--r--qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6Test.java284
-rw-r--r--qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgraderTest.java7
-rw-r--r--qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java1
-rw-r--r--qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java9
-rw-r--r--qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java6
-rw-r--r--qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchange.java10
-rw-r--r--qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchangeType.java6
-rw-r--r--qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchange.java2
-rw-r--r--qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchangeType.java6
-rw-r--r--qpid/java/broker/build.xml2
-rw-r--r--qpid/java/broker/etc/virtualhosts.xml12
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/qmf/ManagementExchange.java17
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java74
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java8
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/Broker.java33
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java3
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java7
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/ProtocolExclusion.java3
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/binding/Binding.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/binding/BindingFactory.java94
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java11
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java9
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/connection/ConnectionRegistry.java12
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/connection/IConnectionRegistry.java9
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java27
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java27
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java53
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java11
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/Exchange.java3
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java7
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeInitialiser.java5
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java7
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeType.java4
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java10
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java10
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java10
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/federation/Bridge.java10
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java4
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java6
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java9
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java12
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/ConfigStore_logmessages.properties3
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/MessageStore_logmessages.properties6
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/TransactionLog_logmessages.properties3
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/BindingLogSubject.java3
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubject.java8
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/management/AbstractAMQManagedConnectionObject.java20
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java522
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/Binding.java75
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java38
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java229
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/Consumer.java73
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/Exchange.java91
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/IllegalStateTransitionException.java43
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/LifetimePolicy.java27
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/Publisher.java25
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/Queue.java146
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/State.java30
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/Statistics.java25
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java54
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java3
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AmqpProtocolVersion.java2
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java64
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java394
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java449
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java98
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Destination.java28
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ExchangeDestination.java108
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/LinkRegistry.java59
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Link_1_0.java26
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java172
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/QueueDestination.java100
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingDestination.java35
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLinkAttachment.java51
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLink_1_0.java305
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingDestination.java27
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLinkAttachment.java44
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java648
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java446
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java634
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/TxnCoordinatorLink_1_0.java195
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/UnsettledAction.java8
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQPriorityQueue.java9
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java58
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueue.java13
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/DefaultQueueRegistry.java38
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/OutOfOrderQueue.java29
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/PriorityQueueList.java50
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueContext.java9
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java5
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryVisitor.java22
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueRegistry.java5
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleAMQQueue.java44
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleQueueEntryList.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java11
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java3
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java5
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServerFactory.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/AbstractMessageStore.java43
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfigurationRecoveryHandler.java15
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectHelper.java183
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectRecord.java65
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java2715
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java29
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/Event.java32
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/EventListener.java25
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/EventManager.java55
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java183
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStoreFactory.java37
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageMetaDataType.java5
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java118
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreConstants.java27
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreFactory.java27
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java146
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/OperationalLoggingListener.java73
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/State.java38
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/StateManager.java151
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoreFuture.java40
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/store/StoredMemoryMessage.java4
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/store/StoredMessage.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/Transaction.java81
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogRecoveryHandler.java8
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogResource.java4
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java2449
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStoreFactory.java40
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription.java8
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/SubscriptionImpl.java14
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription_0_10.java26
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java6
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java27
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java184
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/txn/AsyncAutoCommitTransaction.java35
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/txn/AutoCommitTransaction.java11
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/txn/DistributedTransaction.java3
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/txn/DtxBranch.java9
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/txn/LocalTransaction.java3
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/txn/ServerTransaction.java5
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/util/MapJsonSerializer.java69
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/State.java29
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java7
-rwxr-xr-xqpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostConfigRecoveryHandler.java108
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java489
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java3
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/MockConnectionConfig.java20
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/VirtualHostConfigurationTest.java3
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java55
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java13
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/logging/messages/MessageStoreMessagesTest.java58
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubjectTest.java4
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java4
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java5
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactoryTest.java18
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueFactoryTest.java5
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/queue/AckTest.java11
-rwxr-xr-xqpid/java/broker/src/test/java/org/apache/qpid/server/queue/MockStoredMessage.java6
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/queue/PriorityQueueListTest.java117
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleAMQQueueTest.java36
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java20
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java30
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java377
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/store/EventManagerTest.java72
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTest.java14
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/store/OperationalLoggingListenerTest.java181
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/store/ReferenceCountingTest.java4
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/store/SkeletonMessageStore.java165
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/store/StateManagerTest.java195
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStore.java98
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStore.java49
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStoreFactory.java37
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/subscription/MockSubscription.java4
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/txn/MockStoreTransaction.java46
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/util/InternalBrokerBaseCase.java7
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/util/MapJsonSerializerTest.java53
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java18
-rw-r--r--qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java84
-rw-r--r--qpid/java/build.deps23
-rw-r--r--qpid/java/build.xml4
-rw-r--r--qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java27
-rw-r--r--qpid/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java5
-rw-r--r--qpid/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java2
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpid/codec/MarkableDataInput.java20
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java5
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpid/framing/ByteArrayDataInput.java20
-rw-r--r--qpid/java/common/src/main/java/org/apache/qpid/framing/ExtendedDataInput.java20
-rw-r--r--qpid/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java18
-rw-r--r--qpid/java/integrationtests/README.txt13
-rwxr-xr-xqpid/java/integrationtests/bin/interoptests.py180
-rw-r--r--qpid/java/integrationtests/build.xml28
-rw-r--r--qpid/java/integrationtests/docs/RunningSustainedTests.txt17
-rw-r--r--qpid/java/integrationtests/jar-with-dependencies.xml47
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase1DummyRun.java135
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase2BasicP2P.java209
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase3BasicPubSub.java239
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase4P2PMessageSize.java214
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase5PubSubMessageSize.java243
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase1DummyRun.java84
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase2BasicP2P.java90
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase3BasicPubSub.java88
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase4P2PMessageSize.java193
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase5PubSubMessageSize.java193
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedClientTestCase.java906
-rw-r--r--qpid/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedTestCase.java126
-rw-r--r--qpid/java/integrationtests/src/resources/sustained-log4j.xml69
-rw-r--r--qpid/java/jca/README.txt93
-rw-r--r--qpid/java/jca/example/.gitignore20
-rw-r--r--qpid/java/jca/example/README-EXAMPLE.txt235
-rw-r--r--qpid/java/jca/example/README-GERONIMO.txt69
-rw-r--r--qpid/java/jca/example/README-GLASSFISH.txt84
-rw-r--r--qpid/java/jca/example/README-JBOSS.txt107
-rw-r--r--qpid/java/jca/example/README-JBOSS7.txt116
-rw-r--r--qpid/java/jca/example/README.txt277
-rw-r--r--qpid/java/jca/example/build-geronimo-properties.xml19
-rw-r--r--qpid/java/jca/example/build-glassfish-properties.xml135
-rw-r--r--qpid/java/jca/example/build-jboss-properties.xml4
-rw-r--r--qpid/java/jca/example/build-jboss7-properties.xml46
-rw-r--r--qpid/java/jca/example/build.xml20
-rw-r--r--qpid/java/jca/example/conf/geronimo-application.xml2
-rw-r--r--qpid/java/jca/example/conf/geronimo-ra.xml36
-rw-r--r--qpid/java/jca/example/conf/glassfish-ejb-jar.xml70
-rw-r--r--qpid/java/jca/example/conf/glassfish-resources.xml74
-rw-r--r--qpid/java/jca/example/conf/glassfish-web.xml26
-rw-r--r--qpid/java/jca/example/conf/jboss-ejb-client.properties12
-rw-r--r--qpid/java/jca/example/conf/log4j.properties18
-rw-r--r--qpid/java/jca/example/conf/qpid-jca-ds.xml16
-rw-r--r--qpid/java/jca/example/conf/qpid-standalone.xml422
-rw-r--r--qpid/java/jca/example/conf/standalone.xml417
-rw-r--r--qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/client/QpidRequestResponseClient.java2
-rw-r--r--qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeListenerBean.java2
-rw-r--r--qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeSubscriberBean.java2
-rw-r--r--qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloListenerBean.java2
-rw-r--r--qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloSubscriberBean.java2
-rw-r--r--qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidJMSResponderBean.java2
-rw-r--r--qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidTestBean.java4
-rw-r--r--qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidRequestResponseServlet.java4
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/ConnectionFactoryProperties.java6
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAConnectionRequestInfo.java36
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java4
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAProperties.java28
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactoryImpl.java4
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidResourceAdapter.java89
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidConnectionFactoryProxy.java27
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/GlassfishTransactionManagerLocator.java63
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/JBoss7TransactionManagerLocator.java20
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/WLSTransactionManagerLocator.java64
-rwxr-xr-xqpid/java/jca/src/main/resources/META-INF/ra.xml35
-rw-r--r--qpid/java/jca/src/test/java/org/apache/qpid/ra/QpidResourceAdapterTest.java31
-rw-r--r--qpid/java/junit-toolkit/build.xml26
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/DefaultThreadFactory.java48
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/PossibleDeadlockException.java46
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/TestRunnable.java239
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestCoordinator.java486
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestExample.java145
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/package.html28
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestCase.java303
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestDecorator.java173
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BaseThrottle.java98
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BatchedThrottle.java94
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/DurationTestDecorator.java205
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/InstrumentedTest.java66
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/NullResultPrinter.java92
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ParameterVariationTestDecorator.java175
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ScaledTestDecorator.java391
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskAware.java55
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskHandler.java92
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ShutdownHookable.java42
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SleepThrottle.java81
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestResult.java654
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestRunner.java694
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestRunnerImprovedErrorHandling.java131
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestThreadAware.java54
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/Throttle.java73
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingController.java198
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingControllerAware.java43
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/WrappedSuiteTestDecorator.java134
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/CSVTestListener.java572
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/ConsoleTestListener.java274
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/TKTestListener.java142
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/XMLTestListener.java410
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/package.html27
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/package.html33
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/CommandLineParser.java787
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ContextualProperties.java494
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/MathUtils.java428
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ParsedProperties.java390
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/SizeOf.java94
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/StackQueue.java131
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestContextProperties.java202
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestUtils.java54
-rw-r--r--qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/package.html27
-rw-r--r--qpid/java/lib/gson-2.0.jarbin0 -> 202952 bytes
-rw-r--r--qpid/java/lib/jackson-core-asl-1.9.0.jarbin0 -> 228286 bytes
-rw-r--r--qpid/java/lib/jackson-mapper-asl-1.9.0.jarbin0 -> 764075 bytes
-rw-r--r--qpid/java/lib/poms/jackson-core-asl-1.9.0.xml22
-rw-r--r--qpid/java/lib/poms/jackson-mapper-asl-1.9.0.xml22
-rw-r--r--qpid/java/management/eclipse-plugin/src/test/java/org/apache/qpid/management/ui/ManagementConsoleTest.java4
-rw-r--r--qpid/java/module.xml2
-rw-r--r--qpid/java/perftests/RunningPerformanceTests.txt141
-rwxr-xr-xqpid/java/perftests/bin/monitoring/monitor-broker.sh221
-rwxr-xr-xqpid/java/perftests/bin/monitoring/runTests.sh148
-rwxr-xr-xqpid/java/perftests/bin/monitoring/stop-monitored-broker.sh124
-rwxr-xr-xqpid/java/perftests/bin/processing/process.sh388
-rwxr-xr-xqpid/java/perftests/bin/processing/processAll.sh58
-rwxr-xr-xqpid/java/perftests/bin/processing/processTests.py850
-rwxr-xr-xqpid/java/perftests/bin/run_many.sh30
-rwxr-xr-xqpid/java/perftests/bin/topicListener.sh32
-rwxr-xr-xqpid/java/perftests/bin/topicPublisher.sh31
-rw-r--r--qpid/java/perftests/build.xml318
-rw-r--r--qpid/java/perftests/dist-zip.xml45
-rw-r--r--qpid/java/perftests/etc/chartdefs/AcknowledgementModesAutoAck.chartdef28
-rw-r--r--qpid/java/perftests/etc/chartdefs/AcknowledgementModesTransacted.chartdef28
-rw-r--r--qpid/java/perftests/etc/chartdefs/BatchSize.chartdef28
-rw-r--r--qpid/java/perftests/etc/chartdefs/MessageSizeNonPersistent.chartdef27
-rw-r--r--qpid/java/perftests/etc/chartdefs/MessageSizePersistent.chartdef29
-rw-r--r--qpid/java/perftests/etc/chartdefs/QueueTypes.chartdef28
-rw-r--r--qpid/java/perftests/etc/chartdefs/VaryingNumberOfConsumers.chartdef35
-rw-r--r--qpid/java/perftests/etc/chartdefs/VaryingNumberOfProducers.chartdef35
-rw-r--r--qpid/java/perftests/etc/jndi/activemq.properties20
-rw-r--r--qpid/java/perftests/etc/jndi/failovertest.properties19
-rw-r--r--qpid/java/perftests/etc/jndi/perftests.properties19
-rw-r--r--qpid/java/perftests/etc/jndi/swiftmq.properties20
-rw-r--r--qpid/java/perftests/etc/log4j.properties28
-rw-r--r--qpid/java/perftests/etc/perftests-jndi.properties26
-rw-r--r--qpid/java/perftests/etc/perftests.log4j46
-rwxr-xr-xqpid/java/perftests/etc/scripts/CTQ-Qpid-1.sh21
-rwxr-xr-xqpid/java/perftests/etc/scripts/CTQ-Qpid-2.sh21
-rwxr-xr-xqpid/java/perftests/etc/scripts/CTQ-Qpid-3.sh21
-rwxr-xr-xqpid/java/perftests/etc/scripts/CTQ-Qpid-4.sh21
-rwxr-xr-xqpid/java/perftests/etc/scripts/CTQ-Qpid-5.sh21
-rwxr-xr-xqpid/java/perftests/etc/scripts/CTQ-Qpid-6.sh21
-rwxr-xr-xqpid/java/perftests/etc/scripts/Connections.sh20
-rwxr-xr-xqpid/java/perftests/etc/scripts/JobQueue.sh20
-rwxr-xr-xqpid/java/perftests/etc/scripts/Latency.sh21
-rwxr-xr-xqpid/java/perftests/etc/scripts/MessageSize.sh20
-rwxr-xr-xqpid/java/perftests/etc/scripts/PT-Qpid-13.sh42
-rwxr-xr-xqpid/java/perftests/etc/scripts/PT-Qpid-14.sh41
-rwxr-xr-xqpid/java/perftests/etc/scripts/Reliability.sh20
-rwxr-xr-xqpid/java/perftests/etc/scripts/RunAll.sh23
-rwxr-xr-xqpid/java/perftests/etc/scripts/RunCore.sh22
-rw-r--r--qpid/java/perftests/etc/scripts/Test-ActiveMQ.sh32
-rw-r--r--qpid/java/perftests/etc/scripts/Test-SwiftMQ.sh30
-rwxr-xr-xqpid/java/perftests/etc/scripts/Throughput.sh20
-rwxr-xr-xqpid/java/perftests/etc/scripts/drainBroker.sh41
-rwxr-xr-xqpid/java/perftests/etc/scripts/extractResults.sh34
-rwxr-xr-xqpid/java/perftests/etc/scripts/extractThroughputResults.sh51
-rwxr-xr-xqpid/java/perftests/etc/scripts/fillBroker.sh41
-rwxr-xr-xqpid/java/perftests/etc/scripts/sendAndWaitClient.sh22
-rwxr-xr-xqpid/java/perftests/etc/scripts/testWithPreFill.sh41
-rw-r--r--qpid/java/perftests/etc/testdefs/short/AcknowledgementModes.json138
-rw-r--r--qpid/java/perftests/etc/testdefs/short/BatchSize.json84
-rw-r--r--qpid/java/perftests/etc/testdefs/short/MessageSize.json213
-rw-r--r--qpid/java/perftests/etc/testdefs/short/QueueTypes.json16198
-rw-r--r--qpid/java/perftests/etc/testdefs/short/VaryingNumberOfParticipants.json2981
-rw-r--r--qpid/java/perftests/etc/testdefs/standard/AcknowledgementModes.json138
-rw-r--r--qpid/java/perftests/etc/testdefs/standard/BatchSize.json84
-rw-r--r--qpid/java/perftests/etc/testdefs/standard/MessageSize.json213
-rw-r--r--qpid/java/perftests/etc/testdefs/standard/QueueTypes.json16205
-rw-r--r--qpid/java/perftests/etc/testdefs/standard/QueuesWithSelectors.json2036
-rw-r--r--qpid/java/perftests/etc/testdefs/standard/VaryingNumberOfParticipants.json2981
-rw-r--r--qpid/java/perftests/example/PQBT-AA-Qpid-01.json795
-rw-r--r--qpid/java/perftests/example/TQBT-TX-Qpid-01.json843
-rw-r--r--qpid/java/perftests/example/brokerconfig/log4j.xml125
-rw-r--r--qpid/java/perftests/example/brokerconfig/passwd23
-rw-r--r--qpid/java/perftests/example/brokerconfig/virtualhosts.xml67
-rw-r--r--qpid/java/perftests/example/config-one-test.json55
-rw-r--r--qpid/java/perftests/example/config-stress-testing-manyp-c1-with-psfc.json162
-rw-r--r--qpid/java/perftests/example/config-stress-testing.json84
-rw-r--r--qpid/java/perftests/example/config-two-tests.json117
-rw-r--r--qpid/java/perftests/example/log4j-client.properties29
-rw-r--r--qpid/java/perftests/example/log4j.properties35
-rw-r--r--qpid/java/perftests/example/perftests-jndi.properties26
-rwxr-xr-xqpid/java/perftests/example/run-client.sh21
-rwxr-xr-xqpid/java/perftests/example/run.sh22
-rw-r--r--qpid/java/perftests/generate-scripts74
-rw-r--r--qpid/java/perftests/jar-with-dependencies.xml91
-rw-r--r--qpid/java/perftests/scripts.xml328
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/client/message/TestMessageFactory.java117
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java47
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/config/AbstractConfig.java69
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java29
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/config/Connector.java43
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/config/ConnectorConfig.java28
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java112
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/AbstractRunner.java74
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ArgumentParser.java44
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java94
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java238
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestConstants.java33
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestException.java66
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/Visitor.java76
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/Client.java208
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientCommandVisitor.java98
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientState.java25
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java251
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/MessageProvider.java212
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/Participant.java31
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java136
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutorRegistry.java45
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java100
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ProducerParticipant.java174
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertySupport.java68
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertyValue.java27
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/ListPropertyValue.java122
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/NumericGeneratedPropertySupport.java179
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValue.java27
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValueFactory.java46
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RandomPropertyValue.java47
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RangePropertyValue.java129
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/SimplePropertyValue.java79
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java96
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandForClient.java46
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandListener.java31
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/Controller.java228
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ParticipatingClients.java94
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ResultsForAllTests.java49
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestResult.java70
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java342
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunnerFactory.java31
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ClientConfig.java113
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/Config.java81
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java52
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConnectionConfig.java91
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java65
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/IterationValue.java86
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/MessageProviderConfig.java60
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ParticipantConfig.java64
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java90
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/QueueConfig.java69
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/SessionConfig.java114
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestConfig.java117
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestInstance.java102
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ClientJmsDelegate.java592
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java210
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/JmsMessageAdaptor.java124
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QpidQueueCreator.java97
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QueueCreator.java31
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/json/JsonHandler.java43
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/json/PropertyValueAdapter.java147
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/Command.java56
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CommandType.java39
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java118
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConnectionCommand.java58
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java108
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateMessageProviderCommand.java54
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateParticpantCommand.java103
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateProducerCommand.java106
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateResponderCommand.java28
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateSessionCommand.java62
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/NoOpCommand.java30
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/OutputAttribute.java35
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java70
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttributeExtractor.java89
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantResult.java272
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ProducerParticipantResult.java100
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/RegisterClientCommand.java43
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/Response.java80
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/StartTestCommand.java29
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/StopClientCommand.java28
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/TearDownTestCommand.java29
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/AggregatedTestResult.java97
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/Aggregator.java49
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ITestResult.java36
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java143
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregator.java106
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVFormater.java89
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparator.java55
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Config.java243
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Listener.java141
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/MessageFactory.java153
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Publisher.java178
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingAsyncTestPerf.java323
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingClient.java112
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java452
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingLatencyTestPerf.java311
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingSendOnlyClient.java93
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingTestPerf.java281
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongBouncer.java453
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java1818
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongTestPerf.java251
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/topic/Config.java326
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/topic/Listener.java303
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/topic/MessageFactory.java157
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/topic/Publisher.java186
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/topic/TopicWithSelectorsTransientVolumeTest.java344
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/topic/topicselectors.properties24
-rw-r--r--qpid/java/perftests/src/main/resources/perftests.properties20
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ArgumentParserTest.java96
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ConfigFileHelper.java48
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/VisitorTest.java92
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientCommandVisitorTest.java108
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientTest.java159
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java180
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/MessageProviderTest.java107
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantExecutorTest.java183
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantRegistryTest.java55
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantResultFactoryTest.java183
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantTestHelper.java83
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ProducerParticipantTest.java219
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/ListPropertyValueTest.java88
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/PropertyValueFactoryTest.java73
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RandomPropertyValueTest.java76
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RangePropertyValueTest.java153
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/SimplePropertyValueTest.java30
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java99
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ControllerTest.java198
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ParticipatingClientsTest.java144
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/TestRunnerTest.java253
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ClientConfigTest.java111
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigReaderTest.java113
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTest.java56
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTestUtils.java56
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConnectionConfigTest.java94
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConsumerConfigTest.java79
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/IterationValueTest.java78
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/MessageProviderConfigTest.java51
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java89
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/SessionConfigTest.java93
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestConfigTest.java113
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestInstanceTest.java102
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/sampleConfig.json72
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/jms/JmsMessageAdaptorTest.java40
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/message/JsonHandlerTest.java183
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/message/ParticipantResultTest.java162
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/AggregatorTest.java61
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregatorTest.java272
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java152
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java144
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparatorTest.java89
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv2
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/DistributedTestSystemTestBase.java72
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/QpidQueueCreatorTest.java116
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/SystemTestConstants.java28
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/BasicDistributedClientTest.java186
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ConsumerParticipantTest.java156
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ControllerQueue.java90
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/DistributedClientTest.java323
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/MessageProviderTest.java119
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ProducerParticipantTest.java132
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java249
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/iteratingFeature.json63
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/produceClient.json41
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json55
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndThreeConsumersInSeparateClients.json77
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/testWithTwoTests.json107
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/DistributedControllerTest.java157
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/distributedControllerTest.json17
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java95
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/endtoend.json65
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/perftests.systests.properties26
-rw-r--r--qpid/java/perftests/visualisation-jfc/build.xml142
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java26
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingException.java46
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java135
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/BarChartBuilder.java47
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilder.java30
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java40
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataPointCallback.java27
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataSetBasedChartBuilder.java68
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/LineChartBuilder.java45
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilder.java133
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinition.java85
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreator.java140
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinition.java50
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreator.java60
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactoryTest.java40
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilderTest.java90
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreatorTest.java149
-rw-r--r--qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreatorTest.java113
-rw-r--r--qpid/java/systests/build.xml2
-rwxr-xr-xqpid/java/systests/etc/bin/testclients.sh23
-rw-r--r--qpid/java/systests/etc/virtualhosts-systests-bdb-settings.xml6
-rw-r--r--qpid/java/systests/etc/virtualhosts-systests-derby-settings.xml8
-rw-r--r--qpid/java/systests/etc/virtualhosts-systests-firewall-2.xml4
-rw-r--r--qpid/java/systests/etc/virtualhosts-systests-firewall-3.xml4
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/client/redelivered/RedeliveredMessageTest.java20
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/jms/xa/XAResourceTest.java9
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/ra/QpidRAConnectionTest.java8
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java3
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java300
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java573
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java186
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/server/queue/PriorityQueueTest.java100
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java59
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStoreFactory.java37
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java2
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java54
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java39
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java66
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java70
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java42
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java63
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java109
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java95
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java156
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java51
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java204
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java299
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java48
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java173
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java320
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java167
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java104
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java684
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java112
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java74
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java92
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java88
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java86
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java200
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java45
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java124
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java69
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java73
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java169
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java468
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java472
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java94
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java94
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java333
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java546
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java164
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java241
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java210
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java69
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java510
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java107
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java414
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java137
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java313
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java176
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java149
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/package.html43
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java136
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java101
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java200
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java154
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java140
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/MessageConsumerCloseTest.java77
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/utils/JMXTestUtils.java10
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java52
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java2
-rwxr-xr-xqpid/java/test-profiles/CPPExcludes6
-rw-r--r--qpid/java/test-profiles/Excludes1
-rw-r--r--qpid/java/test-profiles/JavaBDBExcludes1
-rw-r--r--qpid/java/test-profiles/JavaDerbyExcludes4
-rw-r--r--qpid/java/test-profiles/JavaTransientExcludes6
-rw-r--r--qpid/java/test-profiles/java-bdb-spawn.0-10.testprofile2
-rw-r--r--qpid/java/test-profiles/java-bdb-spawn.0-8.testprofile4
-rw-r--r--qpid/java/test-profiles/java-bdb-spawn.0-9-1.testprofile4
-rw-r--r--qpid/java/test-profiles/java-bdb-spawn.0-9.testprofile4
-rw-r--r--qpid/java/test-profiles/java-bdb.0-10.testprofile2
-rw-r--r--qpid/java/test-profiles/java-bdb.0-8.testprofile4
-rw-r--r--qpid/java/test-profiles/java-bdb.0-9-1.testprofile4
-rw-r--r--qpid/java/test-profiles/java-bdb.0-9.testprofile4
-rw-r--r--qpid/java/test-profiles/java-dby-spawn.0-10.testprofile2
-rw-r--r--qpid/java/test-profiles/java-dby-spawn.0-8.testprofile4
-rw-r--r--qpid/java/test-profiles/java-dby-spawn.0-9-1.testprofile4
-rw-r--r--qpid/java/test-profiles/java-dby-spawn.0-9.testprofile4
-rw-r--r--qpid/java/test-profiles/java-dby.0-10.testprofile2
-rw-r--r--qpid/java/test-profiles/java-dby.0-8.testprofile4
-rw-r--r--qpid/java/test-profiles/java-dby.0-9-1.testprofile4
-rw-r--r--qpid/java/test-profiles/java-dby.0-9.testprofile4
-rw-r--r--qpid/java/test-profiles/java-mms-spawn.0-8.testprofile2
-rw-r--r--qpid/java/test-profiles/java-mms-spawn.0-9-1.testprofile2
-rw-r--r--qpid/java/test-profiles/java-mms-spawn.0-9.testprofile2
-rw-r--r--qpid/java/test-profiles/java-mms.0-8.testprofile2
-rw-r--r--qpid/java/test-profiles/java-mms.0-9-1.testprofile2
-rw-r--r--qpid/java/test-profiles/java-mms.0-9.testprofile2
-rw-r--r--qpid/java/test-profiles/testprofile.defaults2
-rwxr-xr-xqpid/java/tools/bin/jms-quick-perf-report (renamed from qpid/java/tools/bin/perf-report)0
-rw-r--r--qpid/java/tools/bin/mercury-controller (renamed from qpid/java/tools/bin/controller)0
-rw-r--r--qpid/java/tools/bin/mercury-start-consumers (renamed from qpid/java/tools/bin/start-consumers)0
-rw-r--r--qpid/java/tools/bin/mercury-start-producers (renamed from qpid/java/tools/bin/start-producers)0
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/Clock.java2
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/JVMArgConfiguration.java411
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/LatencyTest.java349
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryBase.java191
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryConsumerController.java231
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryProducerController.java210
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryTestController.java450
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfBase.java226
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfConsumer.java325
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfProducer.java358
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfTestController.java442
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/QpidReceive.java181
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/QpidSend.java291
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/TestConfiguration.java126
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/TestParams.java214
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/report/BasicReporter.java113
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/report/MercuryReporter.java167
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/report/Reporter.java40
-rw-r--r--qpid/java/tools/src/main/java/org/apache/qpid/tools/report/Statistics.java139
-rw-r--r--qpid/python/qpid/messaging/driver.py6
-rw-r--r--qpid/specs/management-schema.xml10
-rw-r--r--qpid/tests/src/py/qpid_tests/broker_0_10/management.py24
-rw-r--r--qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py2
-rwxr-xr-xqpid/tools/src/py/qmf-tool2
-rwxr-xr-xqpid/tools/src/py/qpid-ha3
-rw-r--r--qpid/tools/src/py/qpidtoollibs/broker.py14
-rw-r--r--qpid/wcf/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp7
1399 files changed, 135114 insertions, 46175 deletions
diff --git a/qpid/cpp/bindings/qmf/ruby/qmf.rb b/qpid/cpp/bindings/qmf/ruby/qmf.rb
index 34d3255d8d..9fbd50cbf6 100644
--- a/qpid/cpp/bindings/qmf/ruby/qmf.rb
+++ b/qpid/cpp/bindings/qmf/ruby/qmf.rb
@@ -26,18 +26,28 @@ module Qmf
# Pull all the TYPE_* constants into Qmf namespace. Maybe there's an easier way?
Qmfengine.constants.each do |c|
+ c = c.to_s
if c.index('TYPE_') == 0 or c.index('ACCESS_') == 0 or c.index('DIR_') == 0 or
c.index('CLASS_') == 0 or c.index('SEV_') == 0
const_set(c, Qmfengine.const_get(c))
end
end
+ module StringHelpers
+ def ensure_encoding(str)
+ enc = (Encoding.default_external.name || "UTF-8" rescue "UTF-8")
+ str.respond_to?(:force_encoding) ? str.force_encoding(enc) : str
+ end
+ end
+
class Util
+ include StringHelpers
+
def qmf_to_native(val)
case val.getType
when TYPE_UINT8, TYPE_UINT16, TYPE_UINT32 then val.asUint
when TYPE_UINT64 then val.asUint64
- when TYPE_SSTR, TYPE_LSTR then val.asString
+ when TYPE_SSTR, TYPE_LSTR then ensure_encoding(val.asString)
when TYPE_ABSTIME then val.asInt64
when TYPE_DELTATIME then val.asUint64
when TYPE_REF then ObjectId.new(val.asObjectId)
@@ -161,6 +171,7 @@ module Qmf
##==============================================================================
class ConnectionSettings
+ include StringHelpers
attr_reader :impl
def initialize(url = nil)
@@ -192,7 +203,7 @@ module Qmf
def get_attr(key)
_v = @impl.getAttr(key)
if _v.isString()
- return _v.asString()
+ return ensure_encoding(_v.asString())
elsif _v.isUint()
return _v.asUint()
elsif _v.isBool()
@@ -348,7 +359,7 @@ module Qmf
@broker = kwargs[:broker] if kwargs.include?(:broker)
@allow_sets = :true
- if cls:
+ if cls
@event_class = cls
@impl = Qmfengine::Event.new(@event_class.impl)
elsif kwargs.include?(:impl)
@@ -434,7 +445,7 @@ module Qmf
@allow_sets = :false
@broker = kwargs[:broker] if kwargs.include?(:broker)
- if cls:
+ if cls
@object_class = cls
@impl = Qmfengine::Object.new(@object_class.impl)
elsif kwargs.include?(:impl)
@@ -707,6 +718,8 @@ module Qmf
end
class MethodResponse
+ include StringHelpers
+
def initialize(impl)
@impl = Qmfengine::MethodResponse.new(impl)
end
@@ -720,7 +733,7 @@ module Qmf
end
def text
- exception.asString
+ ensure_encoding(exception.asString)
end
def args
@@ -885,6 +898,7 @@ module Qmf
end
class SchemaClassKey
+ include StringHelpers
attr_reader :impl
def initialize(i)
@impl = Qmfengine::SchemaClassKey.new(i)
@@ -899,7 +913,7 @@ module Qmf
end
def to_s
- @impl.asString
+ ensure_encoding(@impl.asString)
end
end
diff --git a/qpid/cpp/bindings/qpid/python/python.i b/qpid/cpp/bindings/qpid/python/python.i
index 9d45bf54ee..a53cf3b853 100644
--- a/qpid/cpp/bindings/qpid/python/python.i
+++ b/qpid/cpp/bindings/qpid/python/python.i
@@ -132,7 +132,10 @@ static PyObject* pTransportFailure;
# equivalent in C++, so we will translate them to sasl_mechanism
# when possible.
def __init__(self, url=None, **options):
- args = [url] if url else []
+ if url:
+ args = [url]
+ else:
+ args = []
if options :
if "sasl_mechanisms" in options :
if ' ' in options.get("sasl_mechanisms",'') :
@@ -196,7 +199,7 @@ static PyObject* pTransportFailure;
self._acknowledge_all(sync)
__swig_getmethods__["connection"] = getConnection
- if _newclass: connection = _swig_property(getConnection)
+ if _newclass: connection = property(getConnection)
%}
}
@@ -205,10 +208,10 @@ static PyObject* pTransportFailure;
%pythoncode %{
__swig_getmethods__["capacity"] = getCapacity
__swig_setmethods__["capacity"] = setCapacity
- if _newclass: capacity = _swig_property(getCapacity, setCapacity)
+ if _newclass: capacity = property(getCapacity, setCapacity)
__swig_getmethods__["session"] = getSession
- if _newclass: session = _swig_property(getSession)
+ if _newclass: session = property(getSession)
%}
%pythoncode %{
@@ -233,10 +236,10 @@ static PyObject* pTransportFailure;
__swig_getmethods__["capacity"] = getCapacity
__swig_setmethods__["capacity"] = setCapacity
- if _newclass: capacity = _swig_property(getCapacity, setCapacity)
+ if _newclass: capacity = property(getCapacity, setCapacity)
__swig_getmethods__["session"] = getSession
- if _newclass: session = _swig_property(getSession)
+ if _newclass: session = property(getSession)
%}
}
@@ -298,24 +301,23 @@ static PyObject* pTransportFailure;
self.setContent(content)
__swig_getmethods__["content"] = _get_content
__swig_setmethods__["content"] = _set_content
- if _newclass: content = _swig_property(_get_content, _set_content)
+ if _newclass: content = property(_get_content, _set_content)
__swig_getmethods__["content_type"] = getContentType
__swig_setmethods__["content_type"] = setContentType
- if _newclass: content_type = _swig_property(getContentType,
- setContentType)
+ if _newclass: content_type = property(getContentType, setContentType)
__swig_getmethods__["id"] = getMessageId
__swig_setmethods__["id"] = setMessageId
- if _newclass: id = _swig_property(getMessageId, setMessageId)
+ if _newclass: id = property(getMessageId, setMessageId)
__swig_getmethods__["subject"] = getSubject
__swig_setmethods__["subject"] = setSubject
- if _newclass: subject = _swig_property(getSubject, setSubject)
+ if _newclass: subject = property(getSubject, setSubject)
__swig_getmethods__["priority"] = getPriority
__swig_setmethods__["priority"] = setPriority
- if _newclass: priority = _swig_property(getPriority, setPriority)
+ if _newclass: priority = property(getPriority, setPriority)
def getTtl(self) :
return self._getTtl().getMilliseconds()/1000.0
@@ -323,28 +325,26 @@ static PyObject* pTransportFailure;
self._setTtl(Duration(int(1000*duration)))
__swig_getmethods__["ttl"] = getTtl
__swig_setmethods__["ttl"] = setTtl
- if _newclass: ttl = _swig_property(getTtl, setTtl)
+ if _newclass: ttl = property(getTtl, setTtl)
__swig_getmethods__["user_id"] = getUserId
__swig_setmethods__["user_id"] = setUserId
- if _newclass: user_id = _swig_property(getUserId, setUserId)
+ if _newclass: user_id = property(getUserId, setUserId)
__swig_getmethods__["correlation_id"] = getCorrelationId
__swig_setmethods__["correlation_id"] = setCorrelationId
- if _newclass: correlation_id = _swig_property(getCorrelationId,
- setCorrelationId)
+ if _newclass: correlation_id = property(getCorrelationId, setCorrelationId)
__swig_getmethods__["redelivered"] = getRedelivered
__swig_setmethods__["redelivered"] = setRedelivered
- if _newclass: redelivered = _swig_property(getRedelivered,
- setRedelivered)
+ if _newclass: redelivered = property(getRedelivered, setRedelivered)
__swig_getmethods__["durable"] = getDurable
__swig_setmethods__["durable"] = setDurable
- if _newclass: durable = _swig_property(getDurable, setDurable)
+ if _newclass: durable = property(getDurable, setDurable)
__swig_getmethods__["properties"] = getProperties
- if _newclass: properties = _swig_property(getProperties)
+ if _newclass: properties = property(getProperties)
def getReplyTo(self) :
return self._getReplyTo().str()
@@ -352,7 +352,7 @@ static PyObject* pTransportFailure;
self._setReplyTo(Address(address_str))
__swig_getmethods__["reply_to"] = getReplyTo
__swig_setmethods__["reply_to"] = setReplyTo
- if _newclass: reply_to = _swig_property(getReplyTo, setReplyTo)
+ if _newclass: reply_to = property(getReplyTo, setReplyTo)
def __repr__(self):
args = []
diff --git a/qpid/cpp/bindings/qpid/ruby/README.rdoc b/qpid/cpp/bindings/qpid/ruby/README.rdoc
index 0ae7e5cbed..478fc939d9 100644
--- a/qpid/cpp/bindings/qpid/ruby/README.rdoc
+++ b/qpid/cpp/bindings/qpid/ruby/README.rdoc
@@ -2,7 +2,7 @@
Qpid is an cross-platform enterprise messaging system.
-Version :: 0.10.0.alpha.0
+Version :: 0.17.0
= Links
diff --git a/qpid/cpp/bindings/qpid/ruby/Rakefile b/qpid/cpp/bindings/qpid/ruby/Rakefile
index df0b3970b6..99c3e13c83 100644
--- a/qpid/cpp/bindings/qpid/ruby/Rakefile
+++ b/qpid/cpp/bindings/qpid/ruby/Rakefile
@@ -120,7 +120,9 @@ spec = Gem::Specification.new do |s|
"lib/**/*.rb",
"test/**/*.rb",
"examples/**/*.rb",
- "ext/**/*"]
+ "ext/**/*",
+ "features/**/*",
+ "spec/**/*"]
end
Gem::PackageTask.new(spec) do |pkg|
diff --git a/qpid/cpp/bindings/qpid/ruby/features/step_definitions/address_steps.rb b/qpid/cpp/bindings/qpid/ruby/features/step_definitions/address_steps.rb
index e5071ca4e6..845cc2b116 100644
--- a/qpid/cpp/bindings/qpid/ruby/features/step_definitions/address_steps.rb
+++ b/qpid/cpp/bindings/qpid/ruby/features/step_definitions/address_steps.rb
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
Given /^an Address with the name "([^"]*)" and subject "([^"]*)" and option "([^"]*)" set to "([^"]*)"$/ do |name, subject, key, value|
options = Hash.new
options["#{key}"] = "#{value}"
diff --git a/qpid/cpp/bindings/qpid/ruby/features/step_definitions/connection_steps.rb b/qpid/cpp/bindings/qpid/ruby/features/step_definitions/connection_steps.rb
index b4146ac1fb..3fe3e6941f 100644
--- a/qpid/cpp/bindings/qpid/ruby/features/step_definitions/connection_steps.rb
+++ b/qpid/cpp/bindings/qpid/ruby/features/step_definitions/connection_steps.rb
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
# close all connections
After do
@connection.close if @connection
diff --git a/qpid/cpp/bindings/qpid/ruby/features/step_definitions/receiver_steps.rb b/qpid/cpp/bindings/qpid/ruby/features/step_definitions/receiver_steps.rb
index 8157fb7735..a8c8aa4a43 100644
--- a/qpid/cpp/bindings/qpid/ruby/features/step_definitions/receiver_steps.rb
+++ b/qpid/cpp/bindings/qpid/ruby/features/step_definitions/receiver_steps.rb
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
Given /^an existing receiver for "([^"]*)"$/ do |address|
steps %Q{
Given an open session
diff --git a/qpid/cpp/bindings/qpid/ruby/features/step_definitions/sender_steps.rb b/qpid/cpp/bindings/qpid/ruby/features/step_definitions/sender_steps.rb
index 3ff081c7d2..93dbd2d5c0 100644
--- a/qpid/cpp/bindings/qpid/ruby/features/step_definitions/sender_steps.rb
+++ b/qpid/cpp/bindings/qpid/ruby/features/step_definitions/sender_steps.rb
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
Given /^the message "([^"]*)" is sent$/ do |content|
@sender.send Qpid::Messaging::Message.new :content => "#{content}"
end
diff --git a/qpid/cpp/bindings/qpid/ruby/features/step_definitions/session_steps.rb b/qpid/cpp/bindings/qpid/ruby/features/step_definitions/session_steps.rb
index f97e423ee9..cf775d917d 100644
--- a/qpid/cpp/bindings/qpid/ruby/features/step_definitions/session_steps.rb
+++ b/qpid/cpp/bindings/qpid/ruby/features/step_definitions/session_steps.rb
@@ -1,3 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
Given /^a closed session/ do
steps %Q{
Given an open connection
diff --git a/qpid/cpp/bindings/qpid/ruby/lib/qpid/encoding.rb b/qpid/cpp/bindings/qpid/ruby/lib/qpid/encoding.rb
index 7b9130156d..2f20fab18e 100644
--- a/qpid/cpp/bindings/qpid/ruby/lib/qpid/encoding.rb
+++ b/qpid/cpp/bindings/qpid/ruby/lib/qpid/encoding.rb
@@ -45,8 +45,10 @@ module Qpid
content_type = message.content_type unless content_type
case content_type
- when "amqp/map": Cqpid.decodeMap message.message_impl
- when "amqp/list": Cqpid.decodeList message.message_impl
+ when "amqp/map"
+ Cqpid.decodeMap message.message_impl
+ when "amqp/list"
+ Cqpid.decodeList message.message_impl
end
message.content
diff --git a/qpid/cpp/bindings/qpid/ruby/lib/qpid/version.rb b/qpid/cpp/bindings/qpid/ruby/lib/qpid/version.rb
index f387ba98dc..39524e428f 100644
--- a/qpid/cpp/bindings/qpid/ruby/lib/qpid/version.rb
+++ b/qpid/cpp/bindings/qpid/ruby/lib/qpid/version.rb
@@ -22,7 +22,7 @@ module Qpid
module Version
NUMBERS = [MAJOR = 0,
- MINOR = 13,
+ MINOR = 17,
BUILD = 0]
end
diff --git a/qpid/cpp/bindings/swig_python_typemaps.i b/qpid/cpp/bindings/swig_python_typemaps.i
index e99ce65254..25a4e46b18 100644
--- a/qpid/cpp/bindings/swig_python_typemaps.i
+++ b/qpid/cpp/bindings/swig_python_typemaps.i
@@ -25,7 +25,11 @@ static PyObject* pUuidModule;
%}
%init %{
- pUuidModule = PyImport_ImportModule("uuid");
+ /* Instead of directly referencing the uuid module (which is not available
+ * on older versions of Python), reference the wrapper defined in
+ * qpid.datatypes.
+ */
+ pUuidModule = PyImport_ImportModule("qpid.datatypes");
/* Although it is not required, we'll publish the uuid module in our
* module, as if this module was a python module and we called
diff --git a/qpid/cpp/configure.ac b/qpid/cpp/configure.ac
index 6ba5f62f0e..c68fed932e 100644
--- a/qpid/cpp/configure.ac
+++ b/qpid/cpp/configure.ac
@@ -27,7 +27,7 @@ AC_PROG_CC_STDC
AM_PROG_CC_C_O
AC_PROG_CXX
AC_USE_SYSTEM_EXTENSIONS
-AC_LANG([C++])
+AC_LANG([C++])
# Check for optional use of help2man
AC_CHECK_PROG([HELP2MAN], [help2man], [help2man])
@@ -83,14 +83,14 @@ if test x$GXX = xyes; then
gl_COMPILER_FLAGS(-Wvolatile-register-var)
gl_COMPILER_FLAGS(-Winvalid-pch)
gl_COMPILER_FLAGS(-Wno-system-headers)
- gl_COMPILER_FLAGS(-Woverloaded-virtual)
+ gl_COMPILER_FLAGS(-Woverloaded-virtual)
AC_SUBST([WARNING_CFLAGS], [$COMPILER_FLAGS])
AC_DEFINE([lint], 1, [Define to 1 if the compiler is checking for lint.])
COMPILER_FLAGS=
fi
else
AC_CHECK_DECL([__SUNPRO_CC], [SUNCC=yes], [SUNCC=no])
-
+
# Set up for sun CC compiler
if test x$SUNCC = xyes; then
if test "${enableval}" = yes; then
@@ -118,7 +118,7 @@ LIBS=$gl_saved_libs
gl_CLOCK_TIME
-# Enable Valgrind
+# Enable Valgrind
AC_ARG_ENABLE([valgrind],
[AS_HELP_STRING([--enable-valgrind],
[run valgrind memory checker on tests, if available (default yes)])],
@@ -203,13 +203,26 @@ AM_CONDITIONAL([HAVE_RUBY_DEVEL], [test -f $RUBY_INC/ruby.h && test -n "$SWIG"])
# Python bindings: To build python wrappers, the python-devel files must be present.
AM_PATH_PYTHON()
AS_IF([test -n "$PYTHON"], [
- PKG_CHECK_MODULES([PYTHON], [python], [have_python_dev=yes],[
+ PKG_CHECK_MODULES([PYTHON], [python-$PYTHON_VERSION], [have_python_dev=yes],[
+ # We didn't find pkg-config information for python-2.7 this
+ # may mean we have an earlier python version:
+ # Try to find the include and library files directly in the default
+ # location
+ AC_MSG_WARN([Didn't find Python 2.7 developer libs - looking for older version])
+ PYTHON_INC=$($PYTHON -c 'import distutils.sysconfig; print distutils.sysconfig.get_python_inc()')
+ AC_CHECK_LIB([python$PYTHON_VERSION],[Py_Initialize])
+ AC_CHECK_FILE(["$PYTHON_INC/Python.h"],[
+ PYTHON_CFLAGS="-I$PYTHON_INC"
+ PYTHON_LIBS="-lpython$PYTHON_VERSION"
+ have_python_dev=yes
+ ],[
if test yes = "$with_python" ; then
AC_MSG_ERROR([Couldn't find Python developer libs - you probably need to install a python-dev or python-devel package])
else
AC_MSG_WARN([Couldn't find Python developer libs - you probably don't have a python-dev or python-devel package installed])
fi
])
+ ])
AC_SUBST(PYTHON_CFLAGS)
AC_SUBST(PYTHON_LIBS)
])
@@ -249,7 +262,7 @@ tmp_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS -L/usr/lib/openais -L/usr/lib64/openais -L/usr/lib/corosync -L/usr/lib64/corosync"
AC_CHECK_LIB([cpg],[cpg_local_get],[have_libcpg=yes],)
AC_CHECK_HEADERS([openais/cpg.h corosync/cpg.h],[have_cpg_h=yes],)
-AC_ARG_WITH([cpg],
+AC_ARG_WITH([cpg],
[AS_HELP_STRING([--with-cpg], [Build with CPG support for clustering.])],
[case "${withval}" in
yes) # yes - require dependencies
@@ -257,7 +270,7 @@ AC_ARG_WITH([cpg],
test x$have_cpg_h = xyes || AC_MSG_ERROR([cpg.h not found, install openais-devel or corosync-devel])
with_cpg=yes
;;
- no) with_cpg=no ;;
+ no) with_cpg=no ;;
*) AC_MSG_ERROR([Bad value ${withval} for --with-cpg option]) ;;
esac],
[ # not specified - use if present
@@ -265,12 +278,14 @@ AC_ARG_WITH([cpg],
]
)
AM_CONDITIONAL([HAVE_LIBCPG], [test x$with_cpg = xyes])
+AC_SUBST(USE_CPG, [$with_cpg])
+
# Clean up unnceccassary flags if we don't use clustering
AS_IF([test ! x$with_cpg = xyes], [LDFLAGS=$tmp_LDFLAGS])
AC_CHECK_LIB([cman],[cman_is_quorate],have_libcman=yes,)
AC_CHECK_HEADERS([libcman.h],have_libcman_h=yes,)
-AC_ARG_WITH([libcman],
+AC_ARG_WITH([libcman],
[AS_HELP_STRING([--with-libcman], [Integration with libcman quorum service.])],
[case "${withval}" in
yes) # yes - require dependencies
@@ -278,7 +293,7 @@ AC_ARG_WITH([libcman],
test x$have_libcman_h = xyes || AC_MSG_ERROR([libcman.h not found, install cman-devel or cmanlib-devel])
with_libcman=yes
;;
- no) with_libcman=no ;;
+ no) with_libcman=no ;;
*) AC_MSG_ERROR([Bad value ${withval} for --with-libcman option]) ;;
esac],
[ # not specified - use if present and we're using with_cpg
@@ -430,9 +445,9 @@ AC_ARG_WITH([ssl],
[
with_SSL=yes
AC_PATH_PROG([NSPR_CONFIG], [nspr-config])
- AS_IF([test x$NSPR_CONFIG = x], [with_SSL=no],
+ AS_IF([test x$NSPR_CONFIG = x], [with_SSL=no],
[AC_PATH_PROG([NSS_CONFIG], [nss-config])
- AS_IF([test x$NSS_CONFIG = x], [with_SSL=no],
+ AS_IF([test x$NSS_CONFIG = x], [with_SSL=no],
[SSL_CFLAGS="`$NSPR_CONFIG --cflags` `$NSS_CONFIG --cflags`"
SSL_LDFLAGS="`$NSPR_CONFIG --libs` `$NSS_CONFIG --libs`"])])
]
@@ -502,11 +517,11 @@ AC_ARG_WITH([probes],
)
# Check for some syslog capabilities not present in all systems
-AC_TRY_COMPILE([#include <sys/syslog.h>],
+AC_TRY_COMPILE([#include <sys/syslog.h>],
[int v = LOG_AUTHPRIV;],
[AC_DEFINE([HAVE_LOG_AUTHPRIV], [1], [Set to 1 whether LOG_AUTHPRIV is supported.])],)
-AC_TRY_COMPILE([#include <sys/syslog.h>],
+AC_TRY_COMPILE([#include <sys/syslog.h>],
[int v = LOG_FTP;],
[AC_DEFINE([HAVE_LOG_FTP], [1], [Set to 1 whether LOG_FTP is supported.])],)
@@ -524,8 +539,6 @@ AC_CHECK_LIB([nsl],[getipnodebyname],[NSL_LIB="-lnsl"],[NSL_LIB=""],[])
SOCKLIBS="$SOCKET_LIB $NSL_LIB"
AC_SUBST([SOCKLIBS])
-AM_PATH_PYTHON()
-
# Used by env scripts to find libraries in cmake or autoconf builds.
builddir_lib_suffix="/.libs"
AC_SUBST([builddir_lib_suffix])
@@ -560,6 +573,7 @@ AC_CONFIG_FILES([
managementgen/Makefile
etc/Makefile
src/Makefile
+ src/tests/cpg_check.sh
src/tests/Makefile
src/tests/test_env.sh
src/tests/install_env.sh
diff --git a/qpid/cpp/etc/Makefile.am b/qpid/cpp/etc/Makefile.am
index 22e9d2778c..b154a105d4 100644
--- a/qpid/cpp/etc/Makefile.am
+++ b/qpid/cpp/etc/Makefile.am
@@ -33,7 +33,6 @@ nobase_sysconf_DATA = \
if HAVE_SASL
nobase_sysconf_DATA += \
$(SASL_CONF)
-
endif
# Substitute values for directories in init scripts.
@@ -46,10 +45,11 @@ qpidd: qpidd.in
sed $(SUBST) $< > $@
qpidd-primary: qpidd-primary.in
sed $(SUBST) $< > $@
-cluster.conf-example.xml: cluster.conf-example.in
+cluster.conf-example.xml: cluster.conf-example.xml.in
sed $(SUBST) $< > $@
-CLEANFILES = qpidd qpidd-primary cluster.conf-example
+CLEANFILES = qpidd qpidd-primary cluster.conf-example.xml
initddir = $(sysconfdir)/init.d
nobase_initd_SCRIPTS = qpidd qpidd-primary
+
diff --git a/qpid/cpp/etc/cluster.conf-example.xml.in b/qpid/cpp/etc/cluster.conf-example.xml.in
index eb70ebbb1e..14b961a363 100644
--- a/qpid/cpp/etc/cluster.conf-example.xml.in
+++ b/qpid/cpp/etc/cluster.conf-example.xml.in
@@ -2,36 +2,33 @@
<!--
This is an example of a cluster.conf file to run qpidd HA under rgmanager.
This example assumes a 3 node cluster, with nodes named node1, node2 and node3.
+
+NOTE: fencing is not shown, it should be configured in a real cluster configuration.
-->
<cluster name="qpid-test" config_version="18">
- <!-- The cluster has 3 nodes. Each has a unique nodid and one vote for quorum. -->
+ <!-- The cluster has 3 nodes. Each has a unique nodid and one vote
+ for quorum. -->
<clusternodes>
- <clusternode name="node1" nodeid="1">
- <fence/>
- </clusternode>
- <clusternode name="node2" nodeid="2">
- <fence/>
- </clusternode>
- <clusternode name="node3" nodeid="3">
- <fence/>
- </clusternode>
+ <clusternode name="node1.example.com" nodeid="1"/>
+ <clusternode name="node2.example.com" nodeid="2"/>
+ <clusternode name="node3.example.com" nodeid="3"/>
</clusternodes>
<!-- Resouce Manager configuration. -->
- <rm log_level="7"> <!-- Verbose logging -->
+ <rm>
<!--
There is a failoverdomain for each node containing just that node.
- This lets us stipulate that the qpidd service should always run on all nodes.
+ This lets us stipulate that the qpidd service should always run on each node.
-->
<failoverdomains>
<failoverdomain name="node1-domain" restricted="1">
- <failoverdomainnode name="node1"/>
+ <failoverdomainnode name="node1.example.com"/>
</failoverdomain>
<failoverdomain name="node2-domain" restricted="1">
- <failoverdomainnode name="node2"/>
+ <failoverdomainnode name="node2.example.com"/>
</failoverdomain>
<failoverdomain name="node3-domain" restricted="1">
- <failoverdomainnode name="node3"/>
+ <failoverdomainnode name="node3.example.com"/>
</failoverdomain>
</failoverdomains>
diff --git a/qpid/cpp/etc/qpidd.in b/qpid/cpp/etc/qpidd.in
index 23c15283dc..2b43625b7d 100755
--- a/qpid/cpp/etc/qpidd.in
+++ b/qpid/cpp/etc/qpidd.in
@@ -39,13 +39,14 @@ prog=qpidd
lockfile=/var/lock/subsys/$prog
pidfile=/var/run/qpidd.pid
-# Source function library.
-. /etc/rc.d/init.d/functions
-
+# Source configuration
if [ -f !!sysconfdir!!/sysconfig/$prog ] ; then
. !!sysconfdir!!/sysconfig/$prog
fi
+# Source function library.
+. /etc/rc.d/init.d/functions
+
RETVAL=0
#ensure binary is present and executable
diff --git a/qpid/cpp/include/qpid/Options.h b/qpid/cpp/include/qpid/Options.h
index 63d91c2d72..9860076195 100644
--- a/qpid/cpp/include/qpid/Options.h
+++ b/qpid/cpp/include/qpid/Options.h
@@ -163,10 +163,12 @@ struct Options : public po::options_description {
*/
struct CommonOptions : public Options {
QPID_COMMON_EXTERN CommonOptions(const std::string& name=std::string(),
- const std::string& configfile=std::string());
+ const std::string& configfile=std::string(),
+ const std::string& clientConfigFile=std::string());
bool help;
bool version;
std::string config;
+ std::string clientConfig;
};
diff --git a/qpid/cpp/include/qpid/Url.h b/qpid/cpp/include/qpid/Url.h
index 6dc7c787ee..b3ff9576e2 100644
--- a/qpid/cpp/include/qpid/Url.h
+++ b/qpid/cpp/include/qpid/Url.h
@@ -39,7 +39,7 @@ struct Url : public std::vector<Address> {
* on a multi-homed host. */
QPID_COMMON_EXTERN static Url getIpAddressesUrl(uint16_t port);
- struct Invalid : public Exception { Invalid(const std::string& s); };
+ struct Invalid : public Exception { QPID_COMMON_EXTERN Invalid(const std::string& s); };
/** Convert to string form. */
QPID_COMMON_EXTERN std::string str() const;
diff --git a/qpid/cpp/include/qpid/framing/Array.h b/qpid/cpp/include/qpid/framing/Array.h
index 1e97be3bb4..4f82d4dbf0 100644
--- a/qpid/cpp/include/qpid/framing/Array.h
+++ b/qpid/cpp/include/qpid/framing/Array.h
@@ -1,3 +1,6 @@
+#ifndef QPID_FRAMING_ARRAY_H
+#define QPID_FRAMING_ARRAY_H
+
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -18,21 +21,22 @@
* under the License.
*
*/
+
#include "qpid/framing/amqp_types.h"
-#include "qpid/framing/FieldValue.h"
#include "qpid/framing/TypeCode.h"
+
#include <boost/shared_ptr.hpp>
+
#include <iostream>
#include <vector>
-#include "qpid/CommonImportExport.h"
-#ifndef _Array_
-#define _Array_
+#include "qpid/CommonImportExport.h"
namespace qpid {
namespace framing {
class Buffer;
+class FieldValue;
class QPID_COMMON_CLASS_EXTERN Array
{
@@ -75,12 +79,10 @@ class QPID_COMMON_CLASS_EXTERN Array
// Non-std interface
QPID_COMMON_INLINE_EXTERN void add(ValuePtr value) { push_back(value); }
- template <class T>
- void collect(std::vector<T>& out) const
- {
- for (ValueVector::const_iterator i = values.begin(); i != values.end(); ++i) {
- out.push_back((*i)->get<T>());
- }
+ // For use in standard algorithms
+ template <typename R, typename V>
+ static R get(const V& v) {
+ return v->get<R>();
}
private:
diff --git a/qpid/cpp/managementgen/qmfgen/management-types.xml b/qpid/cpp/managementgen/qmfgen/management-types.xml
index c88f0caeae..efa8322806 100644
--- a/qpid/cpp/managementgen/qmfgen/management-types.xml
+++ b/qpid/cpp/managementgen/qmfgen/management-types.xml
@@ -35,7 +35,7 @@
<type name="int16" base="S16" cpp="int16_t" encode="@.putInt16(#)" decode="# = @.getInt16()" stream="#" size="2" accessor="direct" init="0"/>
<type name="int32" base="S32" cpp="int32_t" encode="@.putInt32(#)" decode="# = @.getInt32()" stream="#" size="4" accessor="direct" init="0"/>
<type name="int64" base="S64" cpp="int64_t" encode="@.putInt64(#)" decode="# = @.getInt64()" stream="#" size="8" accessor="direct" init="0"/>
-<type name="bool" base="BOOL" cpp="bool" encode="@.putOctet(#?1:0)" decode="# = @.getOctet()==1" stream="#" size="1" accessor="direct" init="0"/>
+<type name="bool" base="BOOL" cpp="bool" encode="@.putOctet(#?1:0)" decode="# = @.getOctet()==1" stream="#" size="1" accessor="direct" init="false"/>
<type name="sstr" base="SSTR" cpp="std::string" encode="@.putShortString(#)" decode="@.getShortString(#)" stream="#" size="(1 + #.length())" accessor="direct" init='""' byRef="y" unmap="(#).getString()"/>
<type name="lstr" base="LSTR" cpp="std::string" encode="@.putMediumString(#)" decode="@.getMediumString(#)" stream="#" size="(2 + #.length())" accessor="direct" init='""' byRef="y" unmap="(#).getString()"/>
<type name="absTime" base="ABSTIME" cpp="int64_t" encode="@.putLongLong(#)" decode="# = @.getLongLong()" stream="#" size="8" accessor="direct" init="0"/>
diff --git a/qpid/cpp/managementgen/qmfgen/schema.py b/qpid/cpp/managementgen/qmfgen/schema.py
index c48ae572d2..dc8ffae446 100755
--- a/qpid/cpp/managementgen/qmfgen/schema.py
+++ b/qpid/cpp/managementgen/qmfgen/schema.py
@@ -225,8 +225,7 @@ class SchemaType:
def genRead (self, stream, varName, indent=" "):
stream.write(indent + self.decode.replace("@", "buf").replace("#", varName) + ";\n")
- def genUnmap (self, stream, varName, indent=" ", key=None, mapName="_map",
- _optional=False):
+ def genUnmap (self, stream, varName, indent=" ", key=None, mapName="_map", _optional=False, _default=None):
if key is None:
key = varName
stream.write(indent + "if ((_i = " + mapName + ".find(\"" + key + "\")) != " + mapName + ".end()) {\n")
@@ -234,6 +233,11 @@ class SchemaType:
self.unmap.replace("#", "_i->second") + ";\n")
if _optional:
stream.write(indent + " _found = true;\n")
+ stream.write(indent + "} else {\n")
+ default = _default
+ if not default:
+ default = self.init
+ stream.write(indent + " " + varName + " = " + default + ";\n")
stream.write(indent + "}\n")
def genWrite (self, stream, varName, indent=" "):
@@ -1405,7 +1409,9 @@ class SchemaClass:
"ioArgs." + arg.dir.lower () + "_" + arg.name,
" ",
arg.name,
- "inMap")
+ "inMap",
+ False,
+ arg.default)
stream.write (" bool allow = coreObject->AuthorizeMethod(METHOD_" +\
method.getName().upper() + ", ioArgs, userId);\n")
diff --git a/qpid/cpp/rubygen/framing.0-10/structs.rb b/qpid/cpp/rubygen/framing.0-10/structs.rb
index 62b33ce773..f93742e57e 100755
--- a/qpid/cpp/rubygen/framing.0-10/structs.rb
+++ b/qpid/cpp/rubygen/framing.0-10/structs.rb
@@ -185,6 +185,13 @@ class StructGen < CppGen
end
end
+ def check_field(f)
+ if (size = StringSizeMap[f.cpptype.encoded] and size < 4)
+ limit = 2 ** (size * 8)
+ genl "if (#{f.cppname}.size() >= #{limit}) throw IllegalArgumentException(\"Value for #{f.cppname} is too large\");"
+ end
+ end
+
def process_packed_fields(s)
s.fields.each { |f| yield f, s.fields.index(f) }
end
@@ -260,11 +267,16 @@ EOS
indent {
process_packed_fields(s) { |f, i| genl "set#{f.name.caps}(_#{f.cppname});" if f.type_ == "bit"}
process_packed_fields(s) { |f, i| genl "flags |= #{flag_mask(s, i)};" unless f.type_ == "bit"}
+ s.fields.each { |f| check_field(f) }
}
genl "}"
else
indent { gen s.fields.collect { |f| " #{f.cppname}(_#{f.cppname})" }.join(",\n") }
- genl "{}"
+ genl "{"
+ indent {
+ s.fields.each { |f| check_field(f) }
+ }
+ genl "}"
end
end
#default constructors:
@@ -298,6 +310,7 @@ EOS
indent {
genl "#{f.cppname} = _#{f.cppname};"
genl "flags |= #{flag_mask(s, i)};"
+ check_field(f)
}
genl "}"
genl "#{f.cpptype.ret} #{s.cppname}::get#{f.name.caps}() const { return #{f.cppname}; }"
@@ -329,6 +342,7 @@ EOS
indent {
genl "#{f.cppname} = _#{f.cppname};"
genl "flags |= #{flag_mask(s, i)};"
+ check_field(f)
}
genl "}"
genl "#{f.cpptype.ret} #{s.body_name}::get#{f.name.caps}() const { return #{f.cppname}; }"
@@ -364,7 +378,12 @@ EOS
end
def define_accessors(f)
- genl "void set#{f.name.caps}(#{f.cpptype.param} _#{f.cppname}) { #{f.cppname} = _#{f.cppname}; }"
+ genl "void set#{f.name.caps}(#{f.cpptype.param} _#{f.cppname}) {"
+ indent {
+ genl "#{f.cppname} = _#{f.cppname};"
+ check_field(f)
+ }
+ genl "}"
genl "#{f.cpptype.ret} get#{f.name.caps}() const { return #{f.cppname}; }"
if (f.cpptype.name == "FieldTable")
genl "#{f.cpptype.name}& get#{f.name.caps}() { return #{f.cppname}; }"
@@ -401,6 +420,7 @@ EOS
#include <ostream>
#include "qpid/framing/amqp_types_full.h"
+#include "qpid/framing/reply_exceptions.h"
#include "qpid/CommonImportExport.h"
namespace qpid {
@@ -465,7 +485,7 @@ EOS
end
gen <<EOS
#include "qpid/framing/#{classname}.h"
-#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/Buffer.h"
using namespace qpid::framing;
diff --git a/qpid/cpp/src/CMakeLists.txt b/qpid/cpp/src/CMakeLists.txt
index b6ce249708..cc882f80ca 100644
--- a/qpid/cpp/src/CMakeLists.txt
+++ b/qpid/cpp/src/CMakeLists.txt
@@ -354,6 +354,7 @@ endif (NOT Boost_REGEX_LIBRARY)
# Boost on Windows can use automatic linking to pick up the correct
# Boost libs based on compile-time touching of the headers. Since we don't
# really need to add them to the link lines, set the names to blanks.
+option(QPID_LINK_BOOST_DYNAMIC "Link with dynamic Boost libs (OFF to link static)" ON)
if (MSVC)
install (PROGRAMS
${Boost_DATE_TIME_LIBRARY_DEBUG} ${Boost_DATE_TIME_LIBRARY_RELEASE}
@@ -371,7 +372,6 @@ if (MSVC)
COMPONENT ${QPID_COMPONENT_COMMON})
endif (NOT Boost_VERSION LESS 103500)
- option(QPID_LINK_BOOST_DYNAMIC "Link with dynamic Boost libs (OFF to link static)" ON)
if (QPID_LINK_BOOST_DYNAMIC)
add_definitions( /D BOOST_ALL_DYN_LINK)
string (REPLACE .lib .dll
@@ -594,6 +594,8 @@ if (BUILD_ACL)
set (acl_SOURCES
qpid/acl/Acl.cpp
qpid/acl/Acl.h
+ qpid/acl/AclConnectionCounter.cpp
+ qpid/acl/AclConnectionCounter.h
qpid/acl/AclData.cpp
qpid/acl/AclData.h
qpid/acl/AclPlugin.cpp
@@ -632,6 +634,8 @@ if (BUILD_HA)
qpid/ha/Settings.h
qpid/ha/QueueReplicator.h
qpid/ha/QueueReplicator.cpp
+ qpid/ha/ReplicateLevel.h
+ qpid/ha/ReplicateLevel.cpp
qpid/ha/ReplicatingSubscription.h
qpid/ha/ReplicatingSubscription.cpp
qpid/ha/BrokerReplicator.cpp
@@ -642,7 +646,7 @@ if (BUILD_HA)
add_library (ha MODULE ${ha_SOURCES})
set_target_properties (ha PROPERTIES PREFIX "")
- target_link_libraries (ha qpidbroker ${Boost_PROGRAM_OPTIONS_LIBRARY})
+ target_link_libraries (ha qpidcommon qpidbroker ${Boost_PROGRAM_OPTIONS_LIBRARY})
if (CMAKE_COMPILER_IS_GNUCXX)
set_target_properties (ha PROPERTIES
PREFIX ""
@@ -1111,6 +1115,7 @@ set (qpidbroker_SOURCES
qpid/broker/NameGenerator.cpp
qpid/broker/NullMessageStore.cpp
qpid/broker/QueueBindings.cpp
+ qpid/broker/QueuedMessage.cpp
qpid/broker/QueueEvents.cpp
qpid/broker/QueuePolicy.cpp
qpid/broker/QueueRegistry.cpp
diff --git a/qpid/cpp/src/Makefile.am b/qpid/cpp/src/Makefile.am
index 5dcc4cd210..6df4bc93e7 100644
--- a/qpid/cpp/src/Makefile.am
+++ b/qpid/cpp/src/Makefile.am
@@ -140,7 +140,7 @@ tmoduleexec_LTLIBRARIES=
AM_CXXFLAGS += -DBOOST_FILESYSTEM_VERSION=2
## Automake macros to build libraries and executables.
-qpidd_CXXFLAGS = $(AM_CXXFLAGS) -DQPIDD_MODULE_DIR=\"$(dmoduleexecdir)\" -DQPIDD_CONF_FILE=\"$(sysconfdir)/qpidd.conf\"
+qpidd_CXXFLAGS = $(AM_CXXFLAGS) -DQPIDD_MODULE_DIR=\"$(dmoduleexecdir)\" -DQPIDD_CONF_FILE=\"$(sysconfdir)/qpidd.conf\" -DQPIDC_CONF_FILE=\"$(confdir)/qpidc.conf\"
libqpidclient_la_CXXFLAGS = $(AM_CXXFLAGS) -DQPIDC_MODULE_DIR=\"$(cmoduleexecdir)\" -DQPIDC_CONF_FILE=\"$(confdir)/qpidc.conf\"
qpidd_LDADD = \
@@ -634,6 +634,7 @@ libqpidbroker_la_SOURCES = \
qpid/broker/QueuePolicy.h \
qpid/broker/QueueRegistry.cpp \
qpid/broker/QueueRegistry.h \
+ qpid/broker/QueuedMessage.cpp \
qpid/broker/QueuedMessage.h \
qpid/broker/QueueFlowLimit.h \
qpid/broker/QueueFlowLimit.cpp \
diff --git a/qpid/cpp/src/acl.mk b/qpid/cpp/src/acl.mk
index b8e2ff0e13..0301f8c754 100644
--- a/qpid/cpp/src/acl.mk
+++ b/qpid/cpp/src/acl.mk
@@ -24,6 +24,8 @@ dmoduleexec_LTLIBRARIES += acl.la
acl_la_SOURCES = \
qpid/acl/Acl.cpp \
qpid/acl/Acl.h \
+ qpid/acl/AclConnectionCounter.cpp \
+ qpid/acl/AclConnectionCounter.h \
qpid/acl/AclData.cpp \
qpid/acl/AclData.h \
qpid/acl/AclPlugin.cpp \
diff --git a/qpid/cpp/src/ha.mk b/qpid/cpp/src/ha.mk
index 8a2cee30c7..be1fb73e89 100644
--- a/qpid/cpp/src/ha.mk
+++ b/qpid/cpp/src/ha.mk
@@ -25,18 +25,20 @@ dmoduleexec_LTLIBRARIES += ha.la
ha_la_SOURCES = \
qpid/ha/Backup.cpp \
qpid/ha/Backup.h \
+ qpid/ha/BrokerReplicator.cpp \
+ qpid/ha/BrokerReplicator.h \
+ qpid/ha/ConnectionExcluder.cpp \
+ qpid/ha/ConnectionExcluder.h \
qpid/ha/HaBroker.cpp \
qpid/ha/HaBroker.h \
qpid/ha/HaPlugin.cpp \
- qpid/ha/Settings.h \
- qpid/ha/QueueReplicator.h \
qpid/ha/QueueReplicator.cpp \
- qpid/ha/ReplicatingSubscription.h \
+ qpid/ha/QueueReplicator.h \
+ qpid/ha/ReplicateLevel.cpp \
+ qpid/ha/ReplicateLevel.h \
qpid/ha/ReplicatingSubscription.cpp \
- qpid/ha/BrokerReplicator.cpp \
- qpid/ha/BrokerReplicator.h \
- qpid/ha/ConnectionExcluder.cpp \
- qpid/ha/ConnectionExcluder.h
+ qpid/ha/ReplicatingSubscription.h \
+ qpid/ha/Settings.h
ha_la_LIBADD = libqpidbroker.la
ha_la_LDFLAGS = $(PLUGINLDFLAGS)
diff --git a/qpid/cpp/src/posix/QpiddBroker.cpp b/qpid/cpp/src/posix/QpiddBroker.cpp
index 694751c27c..fd2fb6184f 100644
--- a/qpid/cpp/src/posix/QpiddBroker.cpp
+++ b/qpid/cpp/src/posix/QpiddBroker.cpp
@@ -39,7 +39,7 @@ namespace broker {
BootstrapOptions::BootstrapOptions(const char* argv0)
: qpid::Options("Options"),
- common("", QPIDD_CONF_FILE),
+ common("", QPIDD_CONF_FILE, QPIDC_CONF_FILE),
module(QPIDD_MODULE_DIR),
log(argv0)
{
@@ -91,7 +91,7 @@ struct QpiddPosixOptions : public QpiddOptionsPrivate {
QpiddOptions::QpiddOptions(const char* argv0)
: qpid::Options("Options"),
- common("", QPIDD_CONF_FILE),
+ common("", QPIDD_CONF_FILE, QPIDC_CONF_FILE),
module(QPIDD_MODULE_DIR),
log(argv0)
{
diff --git a/qpid/cpp/src/qpid/Options.cpp b/qpid/cpp/src/qpid/Options.cpp
index 4b13e349f5..35787aa8f3 100644
--- a/qpid/cpp/src/qpid/Options.cpp
+++ b/qpid/cpp/src/qpid/Options.cpp
@@ -186,13 +186,14 @@ void Options::parse(int argc, char const* const* argv, const std::string& config
}
}
-CommonOptions::CommonOptions(const string& name, const string& configfile)
- : Options(name), config(configfile)
+CommonOptions::CommonOptions(const string& name, const string& configfile, const string& clientfile)
+ : Options(name), config(configfile), clientConfig(clientfile)
{
addOptions()
("help,h", optValue(help), "Displays the help message")
("version,v", optValue(version), "Displays version information")
- ("config", optValue(config, "FILE"), "Reads configuration from FILE");
+ ("config", optValue(config, "FILE"), "Reads configuration from FILE")
+ ("client-config", optValue(clientConfig, "FILE"), "Reads client configuration from FILE (for cluster interconnect)");
}
diff --git a/qpid/cpp/src/qpid/UrlArray.cpp b/qpid/cpp/src/qpid/UrlArray.cpp
index 489309c8ad..9ebacbd945 100644
--- a/qpid/cpp/src/qpid/UrlArray.cpp
+++ b/qpid/cpp/src/qpid/UrlArray.cpp
@@ -20,6 +20,8 @@
*/
#include "UrlArray.h"
+#include <qpid/framing/FieldValue.h>
+
namespace qpid {
std::vector<Url> urlArrayToVector(const framing::Array& array) {
diff --git a/qpid/cpp/src/qpid/UrlArray.h b/qpid/cpp/src/qpid/UrlArray.h
index 8b11df5c73..ce9e42f248 100644
--- a/qpid/cpp/src/qpid/UrlArray.h
+++ b/qpid/cpp/src/qpid/UrlArray.h
@@ -23,7 +23,6 @@
*/
#include "qpid/framing/Array.h"
-#include "qpid/framing/FieldValue.h"
#include "qpid/Url.h"
#include <vector>
diff --git a/qpid/cpp/src/qpid/acl/Acl.cpp b/qpid/cpp/src/qpid/acl/Acl.cpp
index 007fceb444..71e8c8b564 100644
--- a/qpid/cpp/src/qpid/acl/Acl.cpp
+++ b/qpid/cpp/src/qpid/acl/Acl.cpp
@@ -17,6 +17,7 @@
*/
#include "qpid/acl/Acl.h"
+#include "qpid/acl/AclConnectionCounter.h"
#include "qpid/acl/AclData.h"
#include "qpid/acl/AclValidator.h"
#include "qpid/sys/Mutex.h"
@@ -26,6 +27,8 @@
#include "qpid/Options.h"
#include "qpid/log/Logger.h"
#include "qpid/types/Variant.h"
+#include "qmf/org/apache/qpid/acl/ArgsAclLookup.h"
+#include "qmf/org/apache/qpid/acl/ArgsAclLookupPublish.h"
#include "qmf/org/apache/qpid/acl/Package.h"
#include "qmf/org/apache/qpid/acl/EventAllow.h"
#include "qmf/org/apache/qpid/acl/EventDeny.h"
@@ -35,7 +38,6 @@
#include <map>
#include <boost/shared_ptr.hpp>
-#include <boost/utility/in_place_factory.hpp>
using namespace std;
using namespace qpid::acl;
@@ -47,7 +49,8 @@ using qpid::management::Manageable;
using qpid::management::Args;
namespace _qmf = qmf::org::apache::qpid::acl;
-Acl::Acl (AclValues& av, Broker& b): aclValues(av), broker(&b), transferAcl(false), mgmtObject(0)
+Acl::Acl (AclValues& av, Broker& b): aclValues(av), broker(&b), transferAcl(false), mgmtObject(0),
+ connectionCounter(new ConnectionCounter(aclValues.aclMaxConnectPerUser, aclValues.aclMaxConnectPerIp))
{
agent = broker->getManagementAgent();
@@ -62,6 +65,7 @@ Acl::Acl (AclValues& av, Broker& b): aclValues(av), broker(&b), transferAcl(fals
throw Exception("Could not read ACL file " + errorString);
if (mgmtObject!=0) mgmtObject->set_enforcingAcl(0);
}
+ broker->getConnectionObservers().add(connectionCounter);
QPID_LOG(info, "ACL Plugin loaded");
if (mgmtObject!=0) mgmtObject->set_enforcingAcl(1);
}
@@ -193,14 +197,89 @@ bool Acl::readAclFile(std::string& aclFile, std::string& errorText) {
return true;
}
-Acl::~Acl(){}
+
+//
+// management lookup function performs general query on acl engine
+//
+Manageable::status_t Acl::lookup(qpid::management::Args& args, std::string& text)
+{
+ _qmf::ArgsAclLookup& ioArgs = (_qmf::ArgsAclLookup&) args;
+ Manageable::status_t result(STATUS_USER);
+
+ try {
+ ObjectType objType = AclHelper::getObjectType(ioArgs.i_object);
+ Action action = AclHelper::getAction( ioArgs.i_action);
+ std::map<Property, std::string> propertyMap;
+ for (::qpid::types::Variant::Map::const_iterator
+ iMapIter = ioArgs.i_propertyMap.begin();
+ iMapIter != ioArgs.i_propertyMap.end();
+ iMapIter++)
+ {
+ Property property = AclHelper::getProperty(iMapIter->first);
+ propertyMap.insert(make_pair(property, iMapIter->second));
+ }
+
+ boost::shared_ptr<AclData> dataLocal;
+ {
+ Mutex::ScopedLock locker(dataLock);
+ dataLocal = data; //rcu copy
+ }
+ AclResult aclResult = dataLocal->lookup(
+ ioArgs.i_userId,
+ action,
+ objType,
+ ioArgs.i_objectName,
+ &propertyMap);
+
+ ioArgs.o_result = AclHelper::getAclResultStr(aclResult);
+ result = STATUS_OK;
+
+ } catch (const std::exception& e) {
+ std::ostringstream oss;
+ oss << "AclLookup invalid name : " << e.what();
+ ioArgs.o_result = oss.str();
+ text = oss.str();
+ }
+
+ return result;
+}
+
+
+//
+// management lookupPublish function performs fastpath
+// PUBLISH EXCHANGE query on acl engine
+//
+Manageable::status_t Acl::lookupPublish(qpid::management::Args& args, std::string& /*text*/)
+{
+ _qmf::ArgsAclLookupPublish& ioArgs = (_qmf::ArgsAclLookupPublish&) args;
+ boost::shared_ptr<AclData> dataLocal;
+ {
+ Mutex::ScopedLock locker(dataLock);
+ dataLocal = data; //rcu copy
+ }
+ AclResult aclResult = dataLocal->lookup(
+ ioArgs.i_userId,
+ ACT_PUBLISH,
+ OBJ_EXCHANGE,
+ ioArgs.i_exchangeName,
+ ioArgs.i_routingKey);
+
+ ioArgs.o_result = AclHelper::getAclResultStr(aclResult);
+
+ return STATUS_OK;
+}
+
+
+Acl::~Acl(){
+ broker->getConnectionObservers().remove(connectionCounter);
+}
ManagementObject* Acl::GetManagementObject(void) const
{
return (ManagementObject*) mgmtObject;
}
-Manageable::status_t Acl::ManagementMethod (uint32_t methodId, Args& /*args*/, string& text)
+Manageable::status_t Acl::ManagementMethod (uint32_t methodId, Args& args, string& text)
{
Manageable::status_t status = Manageable::STATUS_UNKNOWN_METHOD;
QPID_LOG (debug, "ACL: Queue::ManagementMethod [id=" << methodId << "]");
@@ -214,6 +293,14 @@ Manageable::status_t Acl::ManagementMethod (uint32_t methodId, Args& /*args*/, s
else
status = Manageable::STATUS_USER;
break;
+
+ case _qmf::Acl::METHOD_LOOKUP :
+ status = lookup(args, text);
+ break;
+
+ case _qmf::Acl::METHOD_LOOKUPPUBLISH :
+ status = lookupPublish(args, text);
+ break;
}
return status;
diff --git a/qpid/cpp/src/qpid/acl/Acl.h b/qpid/cpp/src/qpid/acl/Acl.h
index cc90fa4097..c65a06d317 100644
--- a/qpid/cpp/src/qpid/acl/Acl.h
+++ b/qpid/cpp/src/qpid/acl/Acl.h
@@ -30,6 +30,7 @@
#include "qmf/org/apache/qpid/acl/Acl.h"
#include "qpid/sys/Mutex.h"
+#include <boost/shared_ptr.hpp>
#include <map>
#include <string>
@@ -40,9 +41,12 @@ class Broker;
}
namespace acl {
+class ConnectionCounter;
struct AclValues {
- std::string aclFile;
+ std::string aclFile;
+ uint32_t aclMaxConnectPerUser;
+ uint32_t aclMaxConnectPerIp;
};
@@ -50,54 +54,56 @@ class Acl : public broker::AclModule, public RefCounted, public management::Mana
{
private:
- acl::AclValues aclValues;
- broker::Broker* broker;
- bool transferAcl;
- boost::shared_ptr<AclData> data;
- qmf::org::apache::qpid::acl::Acl* mgmtObject; // mgnt owns lifecycle
- qpid::management::ManagementAgent* agent;
- mutable qpid::sys::Mutex dataLock;
+ acl::AclValues aclValues;
+ broker::Broker* broker;
+ bool transferAcl;
+ boost::shared_ptr<AclData> data;
+ qmf::org::apache::qpid::acl::Acl* mgmtObject; // mgnt owns lifecycle
+ qpid::management::ManagementAgent* agent;
+ mutable qpid::sys::Mutex dataLock;
+ boost::shared_ptr<ConnectionCounter> connectionCounter;
public:
- Acl (AclValues& av, broker::Broker& b);
-
- void initialize();
-
- inline virtual bool doTransferAcl() {return transferAcl;};
-
- // create specilied authorise methods for cases that need faster matching as needed.
- virtual bool authorise(
- const std::string& id,
- const Action& action,
- const ObjectType& objType,
- const std::string& name,
- std::map<Property,
- std::string>* params=0);
-
- virtual bool authorise(
- const std::string& id,
- const Action& action,
- const ObjectType& objType,
- const std::string& ExchangeName,
- const std::string& RoutingKey);
-
- virtual ~Acl();
+ Acl (AclValues& av, broker::Broker& b);
+
+ void initialize();
+
+ inline virtual bool doTransferAcl() {
+ return transferAcl;
+ };
+
+// create specilied authorise methods for cases that need faster matching as needed.
+ virtual bool authorise(
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& name,
+ std::map<Property, std::string>* params=0);
+
+ virtual bool authorise(
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& ExchangeName,
+ const std::string& RoutingKey);
+
+ virtual ~Acl();
private:
- bool result(
- const AclResult& aclreslt,
- const std::string& id,
- const Action& action,
- const ObjectType& objType,
- const std::string& name);
- bool readAclFile(std::string& errorText);
- bool readAclFile(std::string& aclFile, std::string& errorText);
- virtual qpid::management::ManagementObject* GetManagementObject(void) const;
- virtual management::Manageable::status_t ManagementMethod (uint32_t methodId, management::Args& args, std::string& text);
+ bool result(
+ const AclResult& aclreslt,
+ const std::string& id,
+ const Action& action,
+ const ObjectType& objType,
+ const std::string& name);
+ bool readAclFile(std::string& errorText);
+ bool readAclFile(std::string& aclFile, std::string& errorText);
+ Manageable::status_t lookup (management::Args& args, std::string& text);
+ Manageable::status_t lookupPublish(management::Args& args, std::string& text);
+ virtual qpid::management::ManagementObject* GetManagementObject(void) const;
+ virtual management::Manageable::status_t ManagementMethod (uint32_t methodId, management::Args& args, std::string& text);
};
-
-
}} // namespace qpid::acl
#endif // QPID_ACL_ACL_H
diff --git a/qpid/cpp/src/qpid/acl/AclConnectionCounter.cpp b/qpid/cpp/src/qpid/acl/AclConnectionCounter.cpp
new file mode 100644
index 0000000000..9715c472c1
--- /dev/null
+++ b/qpid/cpp/src/qpid/acl/AclConnectionCounter.cpp
@@ -0,0 +1,211 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "AclConnectionCounter.h"
+#include "qpid/broker/Connection.h"
+#include "qpid/log/Statement.h"
+#include "qpid/sys/Mutex.h"
+#include <assert.h>
+#include <sstream>
+
+using namespace qpid::sys;
+
+namespace qpid {
+namespace acl {
+
+//
+// This module instantiates a broker::ConnectionObserver and limits client
+// connections by counting connections per user name and per client IP address.
+//
+
+
+//
+//
+//
+ConnectionCounter::ConnectionCounter(uint32_t nl, uint32_t hl) :
+ nameLimit(nl), hostLimit(hl) {}
+
+ConnectionCounter::~ConnectionCounter() {}
+
+
+//
+// limitCheckLH
+//
+// Increment the name's count in map and return a comparison against the limit.
+// called with dataLock already taken
+//
+bool ConnectionCounter::limitCheckLH(
+ connectCountsMap_t& theMap, const std::string& theName, uint32_t theLimit) {
+
+ bool result(true);
+ if (theLimit > 0) {
+ connectCountsMap_t::iterator eRef = theMap.find(theName);
+ if (eRef != theMap.end()) {
+ uint32_t count = (uint32_t)(*eRef).second + 1;
+ (*eRef).second = count;
+ result = count <= theLimit;
+ } else {
+ theMap[theName] = 1;
+ }
+ }
+ return result;
+}
+
+
+//
+// releaseLH
+//
+// Decrement the name's count in map.
+// called with dataLock already taken
+//
+void ConnectionCounter::releaseLH(
+ connectCountsMap_t& theMap, const std::string& theName, uint32_t theLimit) {
+
+ if (theLimit > 0) {
+ connectCountsMap_t::iterator eRef = theMap.find(theName);
+ if (eRef != theMap.end()) {
+ uint32_t count = (uint32_t) (*eRef).second;
+ assert (count > 0);
+ if (1 == count) {
+ theMap.erase (eRef);
+ } else {
+ (*eRef).second = count - 1;
+ }
+ } else {
+ // User had no connections.
+ QPID_LOG(notice, "ACL ConnectionCounter Connection for '" << theName
+ << "' not found in connection count pool");
+ }
+ }
+}
+
+
+//
+// connection - called during Connection's constructor
+//
+void ConnectionCounter::connection(broker::Connection& connection) {
+ QPID_LOG(trace, "ACL ConnectionCounter connection IP:" << connection.getMgmtId()
+ << ", user:" << connection.getUsername());
+
+ Mutex::ScopedLock locker(dataLock);
+
+ connectProgressMap[connection.getMgmtId()] = C_CREATED;
+}
+
+
+//
+// opened - called when first AMQP frame is received over Connection
+//
+void ConnectionCounter::opened(broker::Connection& connection) {
+ QPID_LOG(trace, "ACL ConnectionCounter Opened IP:" << connection.getMgmtId()
+ << ", user:" << connection.getUsername());
+
+ Mutex::ScopedLock locker(dataLock);
+
+ const std::string& userName( connection.getUsername());
+ const std::string& hostName(getClientHost(connection.getMgmtId()));
+
+ // Bump state from CREATED to OPENED
+ (void) limitCheckLH(connectProgressMap, connection.getMgmtId(), C_OPENED);
+
+ bool nameOk = limitCheckLH(connectByNameMap, userName, nameLimit);
+ bool hostOk = limitCheckLH(connectByHostMap, hostName, hostLimit);
+
+ if (!nameOk) {
+ // User has too many
+ QPID_LOG(info, "ACL ConnectionCounter User '" << userName
+ << "' exceeded maximum allowed connections");
+ throw Exception(
+ QPID_MSG("User '" << userName
+ << "' exceeded maximum allowed connections"));
+ }
+
+ if (!hostOk) {
+ // Host has too many
+ QPID_LOG(info, "ACL ConnectionCounter Client host '" << hostName
+ << "' exceeded maximum allowed connections");
+ throw Exception(
+ QPID_MSG("Client host '" << hostName
+ << "' exceeded maximum allowed connections"));
+ }
+}
+
+
+//
+// closed - called during Connection's destructor
+//
+void ConnectionCounter::closed(broker::Connection& connection) {
+ QPID_LOG(trace, "ACL ConnectionCounter Closed IP:" << connection.getMgmtId()
+ << ", user:" << connection.getUsername());
+
+ Mutex::ScopedLock locker(dataLock);
+
+ connectCountsMap_t::iterator eRef = connectProgressMap.find(connection.getMgmtId());
+ if (eRef != connectProgressMap.end()) {
+ if ((*eRef).second == C_OPENED){
+ // Normal case: connection was created and opened.
+ // Decrement in-use counts
+ releaseLH(connectByNameMap,
+ connection.getUsername(),
+ nameLimit);
+
+ releaseLH(connectByHostMap,
+ getClientHost(connection.getMgmtId()),
+ hostLimit);
+ } else {
+ // Connection was created but not opened.
+ // Don't decrement any connection counts.
+ }
+ connectProgressMap.erase(eRef);
+
+ } else {
+ // connection not found in progress map
+ QPID_LOG(notice, "ACL ConnectionCounter info for '" << connection.getMgmtId()
+ << "' not found in connection state pool");
+ }
+}
+
+
+//
+// getClientIp - given a connection's mgmtId return the client host part.
+//
+// TODO: Ideally this would be a method of the connection itself.
+//
+std::string ConnectionCounter::getClientHost(const std::string mgmtId)
+{
+ size_t hyphen = mgmtId.find('-');
+ if (std::string::npos != hyphen) {
+ size_t colon = mgmtId.find_last_of(':');
+ if (std::string::npos != colon) {
+ // trailing colon found
+ return mgmtId.substr(hyphen+1, colon - hyphen - 1);
+ } else {
+ // colon not found - use everything after hyphen
+ return mgmtId.substr(hyphen+1);
+ }
+ }
+
+ // no hyphen found - use whole string
+ assert(false);
+ return mgmtId;
+}
+
+}} // namespace qpid::ha
diff --git a/qpid/cpp/src/qpid/acl/AclConnectionCounter.h b/qpid/cpp/src/qpid/acl/AclConnectionCounter.h
new file mode 100644
index 0000000000..b78eea022e
--- /dev/null
+++ b/qpid/cpp/src/qpid/acl/AclConnectionCounter.h
@@ -0,0 +1,79 @@
+#ifndef QPID_ACL_CONNECTIONCOUNTER_H
+#define QPID_ACL_CONNECTIONCOUNTER_H
+
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "qpid/broker/ConnectionObserver.h"
+#include "qpid/sys/Mutex.h"
+#include <boost/iterator/iterator_concepts.hpp>
+
+#include <map>
+
+namespace qpid {
+
+namespace broker {
+class Connection;
+}
+
+namespace acl {
+
+ /**
+ * Terminate client connections when a user tries to create 'too many'.
+ * Terminate hostIp connections when an IP host tries to create 'too many'.
+ */
+class ConnectionCounter : public broker::ConnectionObserver
+{
+private:
+ typedef std::map<std::string, uint32_t> connectCountsMap_t;
+ enum CONNECTION_PROGRESS { C_CREATED=1, C_OPENED=2 };
+
+ uint32_t nameLimit;
+ uint32_t hostLimit;
+ qpid::sys::Mutex dataLock;
+
+ connectCountsMap_t connectProgressMap;
+ connectCountsMap_t connectByNameMap;
+ connectCountsMap_t connectByHostMap;
+
+ std::string getClientHost(const std::string mgmtId);
+
+ bool limitCheckLH(connectCountsMap_t& theMap,
+ const std::string& theName,
+ uint32_t theLimit);
+
+ void releaseLH(connectCountsMap_t& theMap,
+ const std::string& theName,
+ uint32_t theLimit);
+
+public:
+ ConnectionCounter(uint32_t nl, uint32_t hl);
+ ~ConnectionCounter();
+
+ void connection(broker::Connection& connection);
+ void opened(broker::Connection& connection);
+ void closed(broker::Connection& connection);
+
+};
+
+}} // namespace qpid::ha
+
+#endif /*!QPID_ACL_CONNECTIONCOUNTER_H*/
diff --git a/qpid/cpp/src/qpid/acl/AclData.cpp b/qpid/cpp/src/qpid/acl/AclData.cpp
index 03a8a19db9..da7f240a9b 100644
--- a/qpid/cpp/src/qpid/acl/AclData.cpp
+++ b/qpid/cpp/src/qpid/acl/AclData.cpp
@@ -60,7 +60,7 @@ namespace acl {
// matchProp
//
// Compare a rule's property name with a lookup name,
- // The rule's name may contains a trailing '*' to specify a wildcard match.
+ // The rule's name may contain a trailing '*' to specify a wildcard match.
//
bool AclData::matchProp(const std::string& ruleStr,
const std::string& lookupStr)
@@ -312,14 +312,14 @@ namespace acl {
const Action& action,
const ObjectType& objType,
const std::string& /*Exchange*/ name,
- const std::string& RoutingKey)
+ const std::string& routingKey)
{
QPID_LOG(debug, "ACL: Lookup for id:" << id
<< " action:" << AclHelper::getActionStr((Action) action)
<< " objectType:" << AclHelper::getObjectTypeStr((ObjectType) objType)
<< " exchange name:" << name
- << " with routing key " << RoutingKey);
+ << " with routing key " << routingKey);
AclResult aclresult = decisionMode;
@@ -337,6 +337,8 @@ namespace acl {
{
rsItr--;
+ QPID_LOG(debug, "ACL: checking rule " << rsItr->toString());
+
// loop the names looking for match
bool match =true;
for (specPropertyMapItr pMItr = rsItr->props.begin();
@@ -364,17 +366,17 @@ namespace acl {
break;
case acl::SPECPROP_ROUTINGKEY:
- if (matchProp(pMItr->second, RoutingKey))
+ if (matchProp(pMItr->second, routingKey))
{
QPID_LOG(debug, "ACL: lookup key name '"
- << name << "' matched with rule routing key '"
+ << routingKey << "' matched with rule routing key '"
<< pMItr->second << "'");
}
else
{
match= false;
QPID_LOG(debug, "ACL: lookup key name '"
- << name << "' did not match with rule routing key '"
+ << routingKey << "' did not match with rule routing key '"
<< pMItr->second << "'");
}
break;
diff --git a/qpid/cpp/src/qpid/acl/AclPlugin.cpp b/qpid/cpp/src/qpid/acl/AclPlugin.cpp
index d611797c49..6c18cd2749 100644
--- a/qpid/cpp/src/qpid/acl/AclPlugin.cpp
+++ b/qpid/cpp/src/qpid/acl/AclPlugin.cpp
@@ -40,7 +40,9 @@ struct AclOptions : public Options {
AclOptions(AclValues& v) : Options("ACL Options"), values(v) {
addOptions()
- ("acl-file", optValue(values.aclFile, "FILE"), "The policy file to load from, loaded from data dir");
+ ("acl-file", optValue(values.aclFile, "FILE"), "The policy file to load from, loaded from data dir")
+ ("acl-max-connect-per-user", optValue(values.aclMaxConnectPerUser, "N"), "The maximum number of connections allowed per user")
+ ("acl-max-connect-per-ip" , optValue(values.aclMaxConnectPerIp, "N"), "The maximum number of connections allowed per host IP address");
}
};
diff --git a/qpid/cpp/src/qpid/acl/management-schema.xml b/qpid/cpp/src/qpid/acl/management-schema.xml
index 7f48a9be34..bb79568b46 100644
--- a/qpid/cpp/src/qpid/acl/management-schema.xml
+++ b/qpid/cpp/src/qpid/acl/management-schema.xml
@@ -25,6 +25,37 @@
<statistic name="aclDenyCount" type="count64" unit="request" desc="Number of ACL requests denied"/>
<method name="reloadACLFile" desc="Reload the ACL file"/>
+
+ <!--
+ Lookup is a general object lookup
+ User Name
+ Action
+ Object
+ Object Name
+ Property Map consisting of <"name" "value"> string pairs.
+ -->
+ <method name="Lookup" desc="Lookup: user action object [objectName [propertyMap]]">
+ <arg name="userId" dir="I" type="lstr"/>
+ <arg name="action" dir="I" type="lstr"/>
+ <arg name="object" dir="I" type="lstr"/>
+ <arg name="objectName" dir="I" type="lstr"/>
+ <arg name="propertyMap" dir="I" type="map"/>
+ <arg name="result" dir="O" type="lstr"/>
+ </method>
+
+ <!--
+ LookupPublish is a specific lookup for a PUBLISH EXCHANGE fastpath
+ User Name
+ Exchange Name
+ Routing Key
+ -->
+ <method name="LookupPublish" desc="Lookup PUBLISH EXCHANGE: user exchangeName routingKey">
+ <arg name="userId" dir="I" type="lstr"/>
+ <arg name="exchangeName" dir="I" type="lstr"/>
+ <arg name="routingKey" dir="I" type="lstr"/>
+ <arg name="result" dir="O" type="lstr"/>
+ </method>
+
</class>
<eventArguments>
diff --git a/qpid/cpp/src/qpid/broker/AclModule.h b/qpid/cpp/src/qpid/broker/AclModule.h
index be143a23e7..ff9281b6fc 100644
--- a/qpid/cpp/src/qpid/broker/AclModule.h
+++ b/qpid/cpp/src/qpid/broker/AclModule.h
@@ -22,6 +22,7 @@
#include "qpid/RefCounted.h"
+#include "qpid/Exception.h"
#include <boost/shared_ptr.hpp>
#include <map>
#include <set>
@@ -68,7 +69,6 @@ namespace acl {
PROP_DURABLE,
PROP_OWNER,
PROP_ROUTINGKEY,
- PROP_PASSIVE,
PROP_AUTODELETE,
PROP_EXCLUSIVE,
PROP_TYPE,
@@ -88,7 +88,6 @@ namespace acl {
SPECPROP_DURABLE = PROP_DURABLE,
SPECPROP_OWNER = PROP_OWNER,
SPECPROP_ROUTINGKEY = PROP_ROUTINGKEY,
- SPECPROP_PASSIVE = PROP_PASSIVE,
SPECPROP_AUTODELETE = PROP_AUTODELETE,
SPECPROP_EXCLUSIVE = PROP_EXCLUSIVE,
SPECPROP_TYPE = PROP_TYPE,
@@ -156,7 +155,7 @@ namespace acl {
if (str.compare("broker") == 0) return OBJ_BROKER;
if (str.compare("link") == 0) return OBJ_LINK;
if (str.compare("method") == 0) return OBJ_METHOD;
- throw str;
+ throw qpid::Exception(str);
}
static inline std::string getObjectTypeStr(const ObjectType o) {
switch (o) {
@@ -179,7 +178,7 @@ namespace acl {
if (str.compare("delete") == 0) return ACT_DELETE;
if (str.compare("purge") == 0) return ACT_PURGE;
if (str.compare("update") == 0) return ACT_UPDATE;
- throw str;
+ throw qpid::Exception(str);
}
static inline std::string getActionStr(const Action a) {
switch (a) {
@@ -201,7 +200,6 @@ namespace acl {
if (str.compare("durable") == 0) return PROP_DURABLE;
if (str.compare("owner") == 0) return PROP_OWNER;
if (str.compare("routingkey") == 0) return PROP_ROUTINGKEY;
- if (str.compare("passive") == 0) return PROP_PASSIVE;
if (str.compare("autodelete") == 0) return PROP_AUTODELETE;
if (str.compare("exclusive") == 0) return PROP_EXCLUSIVE;
if (str.compare("type") == 0) return PROP_TYPE;
@@ -212,7 +210,7 @@ namespace acl {
if (str.compare("policytype") == 0) return PROP_POLICYTYPE;
if (str.compare("maxqueuesize") == 0) return PROP_MAXQUEUESIZE;
if (str.compare("maxqueuecount") == 0) return PROP_MAXQUEUECOUNT;
- throw str;
+ throw qpid::Exception(str);
}
static inline std::string getPropertyStr(const Property p) {
switch (p) {
@@ -220,7 +218,6 @@ namespace acl {
case PROP_DURABLE: return "durable";
case PROP_OWNER: return "owner";
case PROP_ROUTINGKEY: return "routingkey";
- case PROP_PASSIVE: return "passive";
case PROP_AUTODELETE: return "autodelete";
case PROP_EXCLUSIVE: return "exclusive";
case PROP_TYPE: return "type";
@@ -240,7 +237,6 @@ namespace acl {
if (str.compare("durable") == 0) return SPECPROP_DURABLE;
if (str.compare("owner") == 0) return SPECPROP_OWNER;
if (str.compare("routingkey") == 0) return SPECPROP_ROUTINGKEY;
- if (str.compare("passive") == 0) return SPECPROP_PASSIVE;
if (str.compare("autodelete") == 0) return SPECPROP_AUTODELETE;
if (str.compare("exclusive") == 0) return SPECPROP_EXCLUSIVE;
if (str.compare("type") == 0) return SPECPROP_TYPE;
@@ -256,7 +252,7 @@ namespace acl {
// Allow old names in ACL file as aliases for newly-named properties
if (str.compare("maxqueuesize") == 0) return SPECPROP_MAXQUEUESIZEUPPERLIMIT;
if (str.compare("maxqueuecount") == 0) return SPECPROP_MAXQUEUECOUNTUPPERLIMIT;
- throw str;
+ throw qpid::Exception(str);
}
static inline std::string getPropertyStr(const SpecProperty p) {
switch (p) {
@@ -264,7 +260,6 @@ namespace acl {
case SPECPROP_DURABLE: return "durable";
case SPECPROP_OWNER: return "owner";
case SPECPROP_ROUTINGKEY: return "routingkey";
- case SPECPROP_PASSIVE: return "passive";
case SPECPROP_AUTODELETE: return "autodelete";
case SPECPROP_EXCLUSIVE: return "exclusive";
case SPECPROP_TYPE: return "type";
@@ -286,7 +281,7 @@ namespace acl {
if (str.compare("allow-log") == 0) return ALLOWLOG;
if (str.compare("deny") == 0) return DENY;
if (str.compare("deny-log") == 0) return DENYLOG;
- throw str;
+ throw qpid::Exception(str);
}
static inline std::string getAclResultStr(const AclResult r) {
switch (r) {
@@ -325,7 +320,6 @@ namespace acl {
propSetPtr p1(new propSet);
p1->insert(PROP_TYPE);
p1->insert(PROP_ALTERNATE);
- p1->insert(PROP_PASSIVE);
p1->insert(PROP_DURABLE);
propSetPtr p2(new propSet);
@@ -350,7 +344,6 @@ namespace acl {
propSetPtr p4(new propSet);
p4->insert(PROP_ALTERNATE);
- p4->insert(PROP_PASSIVE);
p4->insert(PROP_DURABLE);
p4->insert(PROP_EXCLUSIVE);
p4->insert(PROP_AUTODELETE);
diff --git a/qpid/cpp/src/qpid/broker/Bridge.cpp b/qpid/cpp/src/qpid/broker/Bridge.cpp
index 19431ce6ab..f9876d1ad8 100644
--- a/qpid/cpp/src/qpid/broker/Bridge.cpp
+++ b/qpid/cpp/src/qpid/broker/Bridge.cpp
@@ -62,7 +62,7 @@ Bridge::Bridge(const std::string& _name, Link* _link, framing::ChannelId _id,
InitializeCallback init) :
link(_link), id(_id), args(_args), mgmtObject(0),
listener(l), name(_name), queueName("qpid.bridge_queue_"), persistenceId(0),
- initialize(init)
+ initialize(init), detached(false)
{
std::stringstream title;
title << id << "_" << name;
@@ -86,11 +86,14 @@ Bridge::~Bridge()
void Bridge::create(Connection& c)
{
+ detached = false; // Reset detached in case we are recovering.
connState = &c;
conn = &c;
FieldTable options;
if (args.i_sync) options.setInt("qpid.sync_frequency", args.i_sync);
SessionHandler& sessionHandler = c.getChannel(id);
+ sessionHandler.setDetachedCallback(
+ boost::bind(&Bridge::sessionDetached, shared_from_this()));
if (args.i_srcIsLocal) {
if (args.i_dynamic)
throw Exception("Dynamic routing not supported for push routes");
@@ -182,12 +185,6 @@ void Bridge::close()
listener(this); // ask the LinkRegistry to destroy us
}
-bool Bridge::isSessionReady() const
-{
- SessionHandler& sessionHandler = conn->getChannel(id);
- return sessionHandler.ready();
-}
-
void Bridge::setPersistenceId(uint64_t pId) const
{
persistenceId = pId;
@@ -380,4 +377,8 @@ const string& Bridge::getLocalTag() const
{
return link->getBroker()->getFederationTag();
}
+void Bridge::sessionDetached() {
+ detached = true;
+}
+
}}
diff --git a/qpid/cpp/src/qpid/broker/Bridge.h b/qpid/cpp/src/qpid/broker/Bridge.h
index 1137937493..286e8935c0 100644
--- a/qpid/cpp/src/qpid/broker/Bridge.h
+++ b/qpid/cpp/src/qpid/broker/Bridge.h
@@ -33,6 +33,7 @@
#include "qmf/org/apache/qpid/broker/Bridge.h"
#include <boost/function.hpp>
+#include <boost/enable_shared_from_this.hpp>
#include <memory>
namespace qpid {
@@ -44,7 +45,10 @@ class Link;
class LinkRegistry;
class SessionHandler;
-class Bridge : public PersistableConfig, public management::Manageable, public Exchange::DynamicBridge
+class Bridge : public PersistableConfig,
+ public management::Manageable,
+ public Exchange::DynamicBridge,
+ public boost::enable_shared_from_this<Bridge>
{
public:
typedef boost::shared_ptr<Bridge> shared_ptr;
@@ -64,7 +68,7 @@ public:
const std::string getDest() const { return args.i_dest; }
const std::string getKey() const { return args.i_key; }
- bool isSessionReady() const;
+ bool isDetached() const { return detached; }
management::ManagementObject* GetManagementObject() const;
management::Manageable::status_t ManagementMethod(uint32_t methodId,
@@ -95,6 +99,9 @@ public:
const qmf::org::apache::qpid::broker::ArgsLinkBridge& getArgs() { return args; }
private:
+ // Callback when the bridge's session is detached.
+ void sessionDetached();
+
struct PushHandler : framing::FrameHandler {
PushHandler(Connection* c) { conn = c; }
void handle(framing::AMQFrame& frame);
@@ -117,7 +124,7 @@ private:
ConnectionState* connState;
Connection* conn;
InitializeCallback initialize;
-
+ bool detached; // Set when session is detached.
bool resetProxy();
// connection Management (called by owning Link)
diff --git a/qpid/cpp/src/qpid/broker/Broker.cpp b/qpid/cpp/src/qpid/broker/Broker.cpp
index 6b607f6d3d..249050d41f 100644
--- a/qpid/cpp/src/qpid/broker/Broker.cpp
+++ b/qpid/cpp/src/qpid/broker/Broker.cpp
@@ -1056,7 +1056,6 @@ std::pair<boost::shared_ptr<Queue>, bool> Broker::createQueue(
if (acl) {
std::map<acl::Property, std::string> params;
params.insert(make_pair(acl::PROP_ALTERNATE, alternateExchange));
- params.insert(make_pair(acl::PROP_PASSIVE, _FALSE));
params.insert(make_pair(acl::PROP_DURABLE, durable ? _TRUE : _FALSE));
params.insert(make_pair(acl::PROP_EXCLUSIVE, owner ? _TRUE : _FALSE));
params.insert(make_pair(acl::PROP_AUTODELETE, autodelete ? _TRUE : _FALSE));
@@ -1127,7 +1126,6 @@ std::pair<Exchange::shared_ptr, bool> Broker::createExchange(
std::map<acl::Property, std::string> params;
params.insert(make_pair(acl::PROP_TYPE, type));
params.insert(make_pair(acl::PROP_ALTERNATE, alternateExchange));
- params.insert(make_pair(acl::PROP_PASSIVE, _FALSE));
params.insert(make_pair(acl::PROP_DURABLE, durable ? _TRUE : _FALSE));
if (!acl->authorise(userId,acl::ACT_CREATE,acl::OBJ_EXCHANGE,name,&params) )
throw framing::UnauthorizedAccessException(QPID_MSG("ACL denied exchange create request from " << userId));
diff --git a/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp b/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp
index f1d43c5cdb..6894324117 100644
--- a/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp
+++ b/qpid/cpp/src/qpid/broker/ConnectionHandler.cpp
@@ -28,6 +28,7 @@
#include "qpid/framing/AllInvoker.h"
#include "qpid/framing/ConnectionStartOkBody.h"
#include "qpid/framing/enum.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Statement.h"
#include "qpid/sys/SecurityLayer.h"
#include "qpid/broker/AclModule.h"
diff --git a/qpid/cpp/src/qpid/broker/DtxManager.cpp b/qpid/cpp/src/qpid/broker/DtxManager.cpp
index febd547478..d482c2c327 100644
--- a/qpid/cpp/src/qpid/broker/DtxManager.cpp
+++ b/qpid/cpp/src/qpid/broker/DtxManager.cpp
@@ -21,6 +21,7 @@
#include "qpid/broker/DtxManager.h"
#include "qpid/broker/DtxTimeout.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/StructHelper.h"
#include "qpid/log/Statement.h"
#include "qpid/sys/Timer.h"
#include "qpid/ptr_map.h"
@@ -55,7 +56,7 @@ void DtxManager::recover(const std::string& xid, std::auto_ptr<TPCTransactionCon
bool DtxManager::prepare(const std::string& xid)
{
- QPID_LOG(debug, "preparing: " << xid);
+ QPID_LOG(debug, "preparing: " << convert(xid));
try {
return getWork(xid)->prepare();
} catch (DtxTimeoutException& e) {
@@ -66,7 +67,7 @@ bool DtxManager::prepare(const std::string& xid)
bool DtxManager::commit(const std::string& xid, bool onePhase)
{
- QPID_LOG(debug, "committing: " << xid);
+ QPID_LOG(debug, "committing: " << convert(xid));
try {
bool result = getWork(xid)->commit(onePhase);
remove(xid);
@@ -79,7 +80,7 @@ bool DtxManager::commit(const std::string& xid, bool onePhase)
void DtxManager::rollback(const std::string& xid)
{
- QPID_LOG(debug, "rolling back: " << xid);
+ QPID_LOG(debug, "rolling back: " << convert(xid));
try {
getWork(xid)->rollback();
remove(xid);
@@ -94,7 +95,7 @@ DtxWorkRecord* DtxManager::getWork(const std::string& xid)
Mutex::ScopedLock locker(lock);
WorkMap::iterator i = work.find(xid);
if (i == work.end()) {
- throw NotFoundException(QPID_MSG("Unrecognised xid " << xid));
+ throw NotFoundException(QPID_MSG("Unrecognised xid " << convert(xid)));
}
return ptr_map_ptr(i);
}
@@ -109,7 +110,7 @@ void DtxManager::remove(const std::string& xid)
Mutex::ScopedLock locker(lock);
WorkMap::iterator i = work.find(xid);
if (i == work.end()) {
- throw NotFoundException(QPID_MSG("Unrecognised xid " << xid));
+ throw NotFoundException(QPID_MSG("Unrecognised xid " << convert(xid)));
} else {
work.erase(i);
}
@@ -120,7 +121,7 @@ DtxWorkRecord* DtxManager::createWork(const std::string& xid)
Mutex::ScopedLock locker(lock);
WorkMap::iterator i = work.find(xid);
if (i != work.end()) {
- throw NotAllowedException(QPID_MSG("Xid " << xid << " is already known (use 'join' to add work to an existing xid)"));
+ throw NotAllowedException(QPID_MSG("Xid " << convert(xid) << " is already known (use 'join' to add work to an existing xid)"));
} else {
std::string ncxid = xid; // Work around const correctness problems in ptr_map.
return ptr_map_ptr(work.insert(ncxid, new DtxWorkRecord(ncxid, store)).first);
@@ -175,3 +176,19 @@ void DtxManager::setStore (TransactionalStore* _store)
{
store = _store;
}
+
+std::string DtxManager::convert(const qpid::framing::Xid& xid)
+{
+ qpid::framing::StructHelper helper;
+ std::string encoded;
+ helper.encode(xid, encoded);
+ return encoded;
+}
+
+qpid::framing::Xid DtxManager::convert(const std::string& xid)
+{
+ qpid::framing::StructHelper helper;
+ qpid::framing::Xid decoded;
+ helper.decode(decoded, xid);
+ return decoded;
+}
diff --git a/qpid/cpp/src/qpid/broker/DtxManager.h b/qpid/cpp/src/qpid/broker/DtxManager.h
index 11895695a3..6f03189f66 100644
--- a/qpid/cpp/src/qpid/broker/DtxManager.h
+++ b/qpid/cpp/src/qpid/broker/DtxManager.h
@@ -26,6 +26,7 @@
#include "qpid/broker/DtxWorkRecord.h"
#include "qpid/broker/TransactionalStore.h"
#include "qpid/framing/amqp_types.h"
+#include "qpid/framing/Xid.h"
#include "qpid/sys/Mutex.h"
#include "qpid/ptr_map.h"
@@ -74,6 +75,8 @@ public:
}
DtxWorkRecord* getWork(const std::string& xid);
bool exists(const std::string& xid);
+ static std::string convert(const framing::Xid& xid);
+ static framing::Xid convert(const std::string& xid);
};
}
diff --git a/qpid/cpp/src/qpid/broker/DtxWorkRecord.cpp b/qpid/cpp/src/qpid/broker/DtxWorkRecord.cpp
index a413fe418d..2c26fec49f 100644
--- a/qpid/cpp/src/qpid/broker/DtxWorkRecord.cpp
+++ b/qpid/cpp/src/qpid/broker/DtxWorkRecord.cpp
@@ -19,6 +19,7 @@
*
*/
#include "qpid/broker/DtxWorkRecord.h"
+#include "qpid/broker/DtxManager.h"
#include "qpid/framing/reply_exceptions.h"
#include <boost/format.hpp>
#include <boost/mem_fn.hpp>
@@ -73,7 +74,7 @@ bool DtxWorkRecord::commit(bool onePhase)
if (prepared) {
//already prepared i.e. 2pc
if (onePhase) {
- throw IllegalStateException(QPID_MSG("Branch with xid " << xid << " has been prepared, one-phase option not valid!"));
+ throw IllegalStateException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " has been prepared, one-phase option not valid!"));
}
store->commit(*txn);
@@ -84,7 +85,7 @@ bool DtxWorkRecord::commit(bool onePhase)
} else {
//1pc commit optimisation, don't need a 2pc transaction context:
if (!onePhase) {
- throw IllegalStateException(QPID_MSG("Branch with xid " << xid << " has not been prepared, one-phase option required!"));
+ throw IllegalStateException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " has not been prepared, one-phase option required!"));
}
std::auto_ptr<TransactionContext> localtxn = store->begin();
if (prepare(localtxn.get())) {
@@ -116,10 +117,10 @@ void DtxWorkRecord::add(DtxBuffer::shared_ptr ops)
{
Mutex::ScopedLock locker(lock);
if (expired) {
- throw DtxTimeoutException(QPID_MSG("Branch with xid " << xid << " has timed out."));
+ throw DtxTimeoutException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " has timed out."));
}
if (completed) {
- throw CommandInvalidException(QPID_MSG("Branch with xid " << xid << " has been completed!"));
+ throw CommandInvalidException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " has been completed!"));
}
work.push_back(ops);
}
@@ -133,7 +134,7 @@ bool DtxWorkRecord::check()
//iterate through all DtxBuffers and ensure they are all ended
for (Work::iterator i = work.begin(); i != work.end(); i++) {
if (!(*i)->isEnded()) {
- throw IllegalStateException(QPID_MSG("Branch with xid " << xid << " not completed!"));
+ throw IllegalStateException(QPID_MSG("Branch with xid " << DtxManager::convert(xid) << " not completed!"));
} else if ((*i)->isRollbackOnly()) {
rolledback = true;
}
diff --git a/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp b/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp
index fca77f7ddd..43d7268dfb 100644
--- a/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp
+++ b/qpid/cpp/src/qpid/broker/ExchangeRegistry.cpp
@@ -24,6 +24,7 @@
#include "qpid/broker/FanOutExchange.h"
#include "qpid/broker/HeadersExchange.h"
#include "qpid/broker/TopicExchange.h"
+#include "qpid/broker/Link.h"
#include "qpid/management/ManagementDirectExchange.h"
#include "qpid/management/ManagementTopicExchange.h"
#include "qpid/framing/reply_exceptions.h"
@@ -58,6 +59,8 @@ pair<Exchange::shared_ptr, bool> ExchangeRegistry::declare(const string& name, c
exchange = Exchange::shared_ptr(new ManagementDirectExchange(name, durable, args, parent, broker));
}else if (type == ManagementTopicExchange::typeName) {
exchange = Exchange::shared_ptr(new ManagementTopicExchange(name, durable, args, parent, broker));
+ }else if (type == Link::exchangeTypeName) {
+ exchange = Link::linkExchangeFactory(name);
}else{
FunctionMap::iterator i = factory.find(type);
if (i == factory.end()) {
diff --git a/qpid/cpp/src/qpid/broker/Fairshare.cpp b/qpid/cpp/src/qpid/broker/Fairshare.cpp
index 313aa746f1..7cdad1a44f 100644
--- a/qpid/cpp/src/qpid/broker/Fairshare.cpp
+++ b/qpid/cpp/src/qpid/broker/Fairshare.cpp
@@ -21,6 +21,7 @@
#include "qpid/broker/Fairshare.h"
#include "qpid/broker/QueuedMessage.h"
#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Statement.h"
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
diff --git a/qpid/cpp/src/qpid/broker/LegacyLVQ.cpp b/qpid/cpp/src/qpid/broker/LegacyLVQ.cpp
index 49c0a32c19..f1deddf4c8 100644
--- a/qpid/cpp/src/qpid/broker/LegacyLVQ.cpp
+++ b/qpid/cpp/src/qpid/broker/LegacyLVQ.cpp
@@ -28,16 +28,26 @@ namespace broker {
LegacyLVQ::LegacyLVQ(const std::string& k, bool b, Broker* br) : MessageMap(k), noBrowse(b), broker(br) {}
void LegacyLVQ::setNoBrowse(bool b)
-{
+{
noBrowse = b;
}
+bool LegacyLVQ::deleted(const QueuedMessage& message)
+{
+ Ordering::iterator i = messages.find(message.position);
+ if (i != messages.end() && i->second.payload == message.payload) {
+ erase(i);
+ return true;
+ } else {
+ return false;
+ }
+}
bool LegacyLVQ::acquire(const framing::SequenceNumber& position, QueuedMessage& message)
{
Ordering::iterator i = messages.find(position);
- if (i != messages.end() && i->second.payload == message.payload) {
+ if (i != messages.end() && i->second.payload == message.payload && i->second.status == QueuedMessage::AVAILABLE) {
+ i->second.status = QueuedMessage::ACQUIRED;
message = i->second;
- erase(i);
return true;
} else {
return false;
@@ -66,12 +76,17 @@ bool LegacyLVQ::push(const QueuedMessage& added, QueuedMessage& removed)
}
const QueuedMessage& LegacyLVQ::replace(const QueuedMessage& original, const QueuedMessage& update)
-{
+{
//add the new message into the original position of the replaced message
Ordering::iterator i = messages.find(original.position);
- i->second = update;
- i->second.position = original.position;
- return i->second;
+ if (i != messages.end()) {
+ i->second = update;
+ i->second.position = original.position;
+ return i->second;
+ } else {
+ QPID_LOG(error, "Failed to replace message at " << original.position);
+ return update;
+ }
}
void LegacyLVQ::removeIf(Predicate p)
diff --git a/qpid/cpp/src/qpid/broker/LegacyLVQ.h b/qpid/cpp/src/qpid/broker/LegacyLVQ.h
index 695e51131d..9355069f37 100644
--- a/qpid/cpp/src/qpid/broker/LegacyLVQ.h
+++ b/qpid/cpp/src/qpid/broker/LegacyLVQ.h
@@ -40,6 +40,7 @@ class LegacyLVQ : public MessageMap
{
public:
LegacyLVQ(const std::string& key, bool noBrowse = false, Broker* broker = 0);
+ bool deleted(const QueuedMessage&);
bool acquire(const framing::SequenceNumber&, QueuedMessage&);
bool browse(const framing::SequenceNumber&, QueuedMessage&, bool);
bool push(const QueuedMessage& added, QueuedMessage& removed);
diff --git a/qpid/cpp/src/qpid/broker/Link.cpp b/qpid/cpp/src/qpid/broker/Link.cpp
index 2fd889a9d9..d2dea85dbf 100644
--- a/qpid/cpp/src/qpid/broker/Link.cpp
+++ b/qpid/cpp/src/qpid/broker/Link.cpp
@@ -31,6 +31,8 @@
#include "qpid/framing/enum.h"
#include "qpid/framing/reply_exceptions.h"
#include "qpid/broker/AclModule.h"
+#include "qpid/broker/Exchange.h"
+#include "qpid/UrlArray.h"
namespace qpid {
namespace broker {
@@ -48,6 +50,13 @@ using std::stringstream;
using std::string;
namespace _qmf = ::qmf::org::apache::qpid::broker;
+
+namespace {
+ const std::string FAILOVER_EXCHANGE("amq.failover");
+ const std::string FAILOVER_HEADER_KEY("amq.failover");
+}
+
+
struct LinkTimerTask : public sys::TimerTask {
LinkTimerTask(Link& l, sys::Timer& t)
: TimerTask(int64_t(l.getBroker()->getOptions().linkMaintenanceInterval*
@@ -65,6 +74,57 @@ struct LinkTimerTask : public sys::TimerTask {
sys::Timer& timer;
};
+
+
+/** LinkExchange is used by the link to subscribe to the remote broker's amq.failover exchange.
+ */
+class LinkExchange : public broker::Exchange
+{
+public:
+ LinkExchange(const std::string& name) : Exchange(name), link(0) {}
+ ~LinkExchange() {};
+ std::string getType() const { return Link::exchangeTypeName; }
+
+ // Exchange methods - set up to prevent binding/unbinding etc from clients!
+ bool bind(boost::shared_ptr<broker::Queue>, const std::string&, const framing::FieldTable*) { return false; }
+ bool unbind(boost::shared_ptr<broker::Queue>, const std::string&, const framing::FieldTable*) { return false; }
+ bool isBound(boost::shared_ptr<broker::Queue>, const std::string* const, const framing::FieldTable* const) {return false;}
+
+ // Process messages sent from the remote's amq.failover exchange by extracting the failover URLs
+ // and saving them should the Link need to reconnect.
+ void route(broker::Deliverable& msg)
+ {
+ if (!link) return;
+ const framing::FieldTable* headers = msg.getMessage().getApplicationHeaders();
+ framing::Array addresses;
+ if (headers && headers->getArray(FAILOVER_HEADER_KEY, addresses)) {
+ // convert the Array of addresses to a single Url container for used with setUrl():
+ std::vector<Url> urlVec;
+ Url urls;
+ urlVec = urlArrayToVector(addresses);
+ for(size_t i = 0; i < urlVec.size(); ++i)
+ urls.insert(urls.end(), urlVec[i].begin(), urlVec[i].end());
+ QPID_LOG(debug, "Remote broker has provided these failover addresses= " << urls);
+ link->setUrl(urls);
+ }
+ }
+
+ void setLink(Link *_link)
+ {
+ assert(!link);
+ link = _link;
+ }
+
+private:
+ Link *link;
+};
+
+
+boost::shared_ptr<Exchange> Link::linkExchangeFactory( const std::string& _name )
+{
+ return Exchange::shared_ptr(new LinkExchange(_name));
+}
+
Link::Link(const string& _name,
LinkRegistry* _links,
const string& _host,
@@ -77,8 +137,9 @@ Link::Link(const string& _name,
const string& _password,
Broker* _broker,
Manageable* parent)
- : name(_name), links(_links), host(_host), port(_port),
- transport(_transport),
+ : name(_name), links(_links),
+ configuredTransport(_transport), configuredHost(_host), configuredPort(_port),
+ host(_host), port(_port), transport(_transport),
durable(_durable),
authMechanism(_authMechanism), username(_username), password(_password),
persistenceId(0), mgmtObject(0), broker(_broker), state(0),
@@ -90,7 +151,8 @@ Link::Link(const string& _name,
connection(0),
agent(0),
listener(l),
- timerTask(new LinkTimerTask(*this, broker->getTimer()))
+ timerTask(new LinkTimerTask(*this, broker->getTimer())),
+ failoverChannel(0)
{
if (parent != 0 && broker != 0)
{
@@ -111,15 +173,26 @@ Link::Link(const string& _name,
startConnectionLH();
}
broker->getTimer().add(timerTask);
+
+ stringstream exchangeName;
+ exchangeName << "qpid.link." << transport << ":" << host << ":" << port;
+ std::pair<Exchange::shared_ptr, bool> rc = broker->getExchanges().declare(exchangeName.str(),
+ exchangeTypeName);
+ failoverExchange = boost::static_pointer_cast<LinkExchange>(rc.first);
+ assert(failoverExchange);
+ failoverExchange->setLink(this);
}
Link::~Link ()
{
- if (state == STATE_OPERATIONAL && connection != 0)
- connection->close(CLOSE_CODE_CONNECTION_FORCED, "closed by management");
+ if (state == STATE_OPERATIONAL && connection != 0) {
+ closeConnection("closed by management");
+ }
if (mgmtObject != 0)
mgmtObject->resourceDestroy ();
+
+ broker->getExchanges().destroy(failoverExchange->getName());
}
void Link::setStateLH (int newState)
@@ -186,11 +259,21 @@ void Link::established(Connection* c)
void Link::setUrl(const Url& u) {
+ QPID_LOG(info, "Setting remote broker failover addresses for link '" << getName() << "' to these urls: " << u);
Mutex::ScopedLock mutex(lock);
url = u;
reconnectNext = 0;
}
+
+namespace {
+ /** invoked when session used to subscribe to remote's amq.failover exchange detaches */
+ void sessionDetached(Link *link) {
+ QPID_LOG(debug, "detached from 'amq.failover' for link: " << link->getName());
+ }
+}
+
+
void Link::opened() {
Mutex::ScopedLock mutex(lock);
if (!connection) return;
@@ -209,36 +292,75 @@ void Link::opened() {
reconnectNext = 0;
QPID_LOG(debug, "Known hosts for peer of inter-broker link: " << url);
}
+
+ //
+ // attempt to subscribe to failover exchange for updates from remote
+ //
+
+ const std::string queueName = "qpid.link." + framing::Uuid(true).str();
+ failoverChannel = nextChannel();
+
+ SessionHandler& sessionHandler = connection->getChannel(failoverChannel);
+ sessionHandler.setDetachedCallback( boost::bind(&sessionDetached, this) );
+ failoverSession = queueName;
+ sessionHandler.attachAs(failoverSession);
+
+ framing::AMQP_ServerProxy remoteBroker(sessionHandler.out);
+
+ remoteBroker.getQueue().declare(queueName,
+ "", // alt-exchange
+ false, // passive
+ false, // durable
+ true, // exclusive
+ true, // auto-delete
+ FieldTable());
+ remoteBroker.getExchange().bind(queueName,
+ FAILOVER_EXCHANGE,
+ "", // no key
+ FieldTable());
+ remoteBroker.getMessage().subscribe(queueName,
+ failoverExchange->getName(),
+ 1, // implied-accept mode
+ 0, // pre-acquire mode
+ false, // exclusive
+ "", // resume-id
+ 0, // resume-ttl
+ FieldTable());
+ remoteBroker.getMessage().flow(failoverExchange->getName(), 0, 0xFFFFFFFF);
+ remoteBroker.getMessage().flow(failoverExchange->getName(), 1, 0xFFFFFFFF);
}
void Link::closed(int, std::string text)
{
- Mutex::ScopedLock mutex(lock);
- QPID_LOG (info, "Inter-broker link disconnected from " << host << ":" << port << " " << text);
-
- connection = 0;
- if (state == STATE_OPERATIONAL) {
- stringstream addr;
- addr << host << ":" << port;
- if (!hideManagement() && agent)
- agent->raiseEvent(_qmf::EventBrokerLinkDown(addr.str()));
- }
+ bool isClosing = false;
+ {
+ Mutex::ScopedLock mutex(lock);
+ QPID_LOG (info, "Inter-broker link disconnected from " << host << ":" << port << " " << text);
- for (Bridges::iterator i = active.begin(); i != active.end(); i++) {
- (*i)->closed();
- created.push_back(*i);
- }
- active.clear();
+ connection = 0;
+ if (state == STATE_OPERATIONAL) {
+ stringstream addr;
+ addr << host << ":" << port;
+ if (!hideManagement() && agent)
+ agent->raiseEvent(_qmf::EventBrokerLinkDown(addr.str()));
+ }
- if (state != STATE_FAILED && state != STATE_PASSIVE)
- {
- setStateLH(STATE_WAITING);
- if (!hideManagement())
- mgmtObject->set_lastError (text);
+ for (Bridges::iterator i = active.begin(); i != active.end(); i++) {
+ (*i)->closed();
+ created.push_back(*i);
+ }
+ active.clear();
+
+ if (state != STATE_FAILED && state != STATE_PASSIVE)
+ {
+ setStateLH(STATE_WAITING);
+ if (!hideManagement())
+ mgmtObject->set_lastError (text);
+ }
mgmtObject->set_connectionRef(qpid::management::ObjectId());
}
-
- if (closing)
+ // Call destroy outside of the lock, don't want to be deleted with lock held.
+ if (isClosing)
destroy();
}
@@ -249,10 +371,8 @@ void Link::destroy ()
{
Mutex::ScopedLock mutex(lock);
- QPID_LOG (info, "Inter-broker link to " << host << ":" << port << " removed by management");
- if (connection)
- connection->close(CLOSE_CODE_CONNECTION_FORCED, "closed by management");
- connection = 0;
+ QPID_LOG (info, "Inter-broker link to " << configuredHost << ":" << configuredPort << " removed by management");
+ closeConnection("closed by management");
setStateLH(STATE_CLOSED);
// Move the bridges to be deleted into a local vector so there is no
@@ -321,7 +441,7 @@ void Link::ioThreadProcessing()
// check for bridge session errors and recover
if (!active.empty()) {
Bridges::iterator removed = std::remove_if(
- active.begin(), active.end(), !boost::bind(&Bridge::isSessionReady, _1));
+ active.begin(), active.end(), boost::bind(&Bridge::isDetached, _1));
for (Bridges::iterator i = removed; i != active.end(); ++i) {
Bridge::shared_ptr bridge = *i;
bridge->closed();
@@ -411,7 +531,8 @@ bool Link::hideManagement() const {
uint Link::nextChannel()
{
Mutex::ScopedLock mutex(lock);
-
+ if (channelCounter >= framing::CHANNEL_MAX)
+ channelCounter = 1;
return channelCounter++;
}
@@ -479,9 +600,9 @@ void Link::encode(Buffer& buffer) const
{
buffer.putShortString(ENCODED_IDENTIFIER);
buffer.putShortString(name);
- buffer.putShortString(host);
- buffer.putShort(port);
- buffer.putShortString(transport);
+ buffer.putShortString(configuredHost);
+ buffer.putShort(configuredPort);
+ buffer.putShortString(configuredTransport);
buffer.putOctet(durable ? 1 : 0);
buffer.putShortString(authMechanism);
buffer.putShortString(username);
@@ -492,10 +613,9 @@ uint32_t Link::encodedSize() const
{
return ENCODED_IDENTIFIER.size() + 1 // +1 byte length
+ name.size() + 1
- + host.size() + 1 // short-string (host)
- + 5 // short-string ("link")
+ + configuredHost.size() + 1 // short-string (host)
+ 2 // port
- + transport.size() + 1 // short-string(transport)
+ + configuredTransport.size() + 1 // short-string(transport)
+ 1 // durable
+ authMechanism.size() + 1
+ username.size() + 1
@@ -576,4 +696,63 @@ void Link::setPassive(bool passive)
}
}
+
+/** utility to clean up connection resources correctly */
+void Link::closeConnection( const std::string& reason)
+{
+ if (connection != 0) {
+ // cancel our subscription to the failover exchange
+ SessionHandler& sessionHandler = connection->getChannel(failoverChannel);
+ if (sessionHandler.getSession()) {
+ framing::AMQP_ServerProxy remoteBroker(sessionHandler.out);
+ remoteBroker.getMessage().cancel(failoverExchange->getName());
+ remoteBroker.getSession().detach(failoverSession);
+ }
+ connection->close(CLOSE_CODE_CONNECTION_FORCED, reason);
+ connection = 0;
+ }
+}
+
+/** returns the current remote's address, and connection state */
+bool Link::getRemoteAddress(qpid::Address& addr) const
+{
+ addr.protocol = transport;
+ addr.host = host;
+ addr.port = port;
+
+ return state == STATE_OPERATIONAL;
+}
+
+
+// FieldTable keys for internal state data
+namespace {
+ const std::string FAILOVER_ADDRESSES("failover-addresses");
+ const std::string FAILOVER_INDEX("failover-index");
+}
+
+void Link::getState(framing::FieldTable& state) const
+{
+ state.clear();
+ Mutex::ScopedLock mutex(lock);
+ if (!url.empty()) {
+ state.setString(FAILOVER_ADDRESSES, url.str());
+ state.setInt(FAILOVER_INDEX, reconnectNext);
+ }
+}
+
+void Link::setState(const framing::FieldTable& state)
+{
+ Mutex::ScopedLock mutex(lock);
+ if (state.isSet(FAILOVER_ADDRESSES)) {
+ Url failovers(state.getAsString(FAILOVER_ADDRESSES));
+ setUrl(failovers);
+ }
+ if (state.isSet(FAILOVER_INDEX)) {
+ reconnectNext = state.getAsInt(FAILOVER_INDEX);
+ }
+}
+
+
+const std::string Link::exchangeTypeName("qpid.LinkExchange");
+
}} // namespace qpid::broker
diff --git a/qpid/cpp/src/qpid/broker/Link.h b/qpid/cpp/src/qpid/broker/Link.h
index ecb1253522..68de0ace98 100644
--- a/qpid/cpp/src/qpid/broker/Link.h
+++ b/qpid/cpp/src/qpid/broker/Link.h
@@ -46,15 +46,23 @@ namespace broker {
class LinkRegistry;
class Broker;
class Connection;
+class LinkExchange;
class Link : public PersistableConfig, public management::Manageable {
private:
- sys::Mutex lock;
+ mutable sys::Mutex lock;
const std::string name;
LinkRegistry* links;
- std::string host;
- uint16_t port;
- std::string transport;
+
+ // these remain constant across failover - used to identify this link
+ const std::string configuredTransport;
+ const std::string configuredHost;
+ const uint16_t configuredPort;
+ // these reflect the current address of remote - will change during failover
+ std::string host;
+ uint16_t port;
+ std::string transport;
+
bool durable;
std::string authMechanism;
std::string username;
@@ -77,8 +85,10 @@ class Link : public PersistableConfig, public management::Manageable {
Connection* connection;
management::ManagementAgent* agent;
boost::function<void(Link*)> listener;
-
boost::intrusive_ptr<sys::TimerTask> timerTask;
+ boost::shared_ptr<broker::LinkExchange> failoverExchange; // subscribed to remote's amq.failover exchange
+ uint failoverChannel;
+ std::string failoverSession;
static const int STATE_WAITING = 1;
static const int STATE_CONNECTING = 2;
@@ -102,6 +112,8 @@ class Link : public PersistableConfig, public management::Manageable {
void opened(); // Called when connection is open (after create)
void closed(int, std::string); // Called when connection goes away
void notifyConnectionForced(const std::string text);
+ void closeConnection(const std::string& reason);
+
friend class LinkRegistry; // to call established, opened, closed
public:
@@ -122,9 +134,16 @@ class Link : public PersistableConfig, public management::Manageable {
management::Manageable* parent = 0);
virtual ~Link();
- std::string getHost() { return host; }
- uint16_t getPort() { return port; }
- std::string getTransport() { return transport; }
+ /** these return the *configured* transport/host/port, which does not change over the
+ lifetime of the Link */
+ std::string getHost() const { return configuredHost; }
+ uint16_t getPort() const { return configuredPort; }
+ std::string getTransport() const { return configuredTransport; }
+
+ /** returns the current address of the remote, which may be different from the
+ configured transport/host/port due to failover. Returns true if connection is
+ active */
+ bool getRemoteAddress(qpid::Address& addr) const;
bool isDurable() { return durable; }
void maintenanceVisit ();
@@ -161,6 +180,13 @@ class Link : public PersistableConfig, public management::Manageable {
management::ManagementObject* GetManagementObject(void) const;
management::Manageable::status_t ManagementMethod(uint32_t, management::Args&, std::string&);
+ // manage the exchange owned by this link
+ static const std::string exchangeTypeName;
+ static boost::shared_ptr<Exchange> linkExchangeFactory(const std::string& name);
+
+ // replicate internal state of this Link for clustering
+ void getState(framing::FieldTable& state) const;
+ void setState(const framing::FieldTable& state);
};
}
}
diff --git a/qpid/cpp/src/qpid/broker/LinkRegistry.cpp b/qpid/cpp/src/qpid/broker/LinkRegistry.cpp
index 84164841e7..e855d59fc1 100644
--- a/qpid/cpp/src/qpid/broker/LinkRegistry.cpp
+++ b/qpid/cpp/src/qpid/broker/LinkRegistry.cpp
@@ -389,22 +389,29 @@ std::string LinkRegistry::getUsername(const std::string& key)
return link->getUsername();
}
+/** note: returns the current remote host (may be different from the host originally
+ configured for the Link due to failover) */
std::string LinkRegistry::getHost(const std::string& key)
{
- Link::shared_ptr link = findLink(key);
- if (!link)
- return string();
+ Link::shared_ptr link = findLink(key);
+ if (!link)
+ return string();
- return link->getHost();
+ qpid::Address addr;
+ link->getRemoteAddress(addr);
+ return addr.host;
}
+/** returns the current remote port (ditto above) */
uint16_t LinkRegistry::getPort(const std::string& key)
{
Link::shared_ptr link = findLink(key);
if (!link)
return 0;
- return link->getPort();
+ qpid::Address addr;
+ link->getRemoteAddress(addr);
+ return addr.port;
}
std::string LinkRegistry::getPassword(const std::string& key)
diff --git a/qpid/cpp/src/qpid/broker/MessageDeque.cpp b/qpid/cpp/src/qpid/broker/MessageDeque.cpp
index 709d99876b..f70c996975 100644
--- a/qpid/cpp/src/qpid/broker/MessageDeque.cpp
+++ b/qpid/cpp/src/qpid/broker/MessageDeque.cpp
@@ -21,6 +21,7 @@
#include "qpid/broker/MessageDeque.h"
#include "qpid/broker/QueuedMessage.h"
#include "qpid/log/Statement.h"
+#include "assert.h"
namespace qpid {
namespace broker {
@@ -39,7 +40,7 @@ size_t MessageDeque::index(const framing::SequenceNumber& position)
bool MessageDeque::deleted(const QueuedMessage& m)
{
size_t i = index(m.position);
- if (i < messages.size()) {
+ if (i < messages.size() && messages[i].status != QueuedMessage::DELETED) {
messages[i].status = QueuedMessage::DELETED;
clean();
return true;
@@ -53,7 +54,7 @@ size_t MessageDeque::size()
return available;
}
-void MessageDeque::release(const QueuedMessage& message)
+QueuedMessage* MessageDeque::releasePtr(const QueuedMessage& message)
{
size_t i = index(message.position);
if (i < messages.size()) {
@@ -62,12 +63,17 @@ void MessageDeque::release(const QueuedMessage& message)
if (head > i) head = i;
m.status = QueuedMessage::AVAILABLE;
++available;
+ return &messages[i];
}
} else {
+ assert(0);
QPID_LOG(error, "Failed to release message at " << message.position << " " << message.payload->getFrames().getContent() << "; no such message (index=" << i << ", size=" << messages.size() << ")");
}
+ return 0;
}
+void MessageDeque::release(const QueuedMessage& message) { releasePtr(message); }
+
bool MessageDeque::acquire(const framing::SequenceNumber& position, QueuedMessage& message)
{
if (position < messages.front().position) return false;
@@ -129,8 +135,7 @@ QueuedMessage padding(uint32_t pos) {
}
} // namespace
-bool MessageDeque::push(const QueuedMessage& added, QueuedMessage& /*not needed*/)
-{
+QueuedMessage* MessageDeque::pushPtr(const QueuedMessage& added) {
//add padding to prevent gaps in sequence, which break the index
//calculation (needed for queue replication)
while (messages.size() && (added.position - messages.back().position) > 1)
@@ -139,7 +144,12 @@ bool MessageDeque::push(const QueuedMessage& added, QueuedMessage& /*not needed*
messages.back().status = QueuedMessage::AVAILABLE;
if (head >= messages.size()) head = messages.size() - 1;
++available;
- return false;//adding a message never causes one to be removed for deque
+ return &messages.back();
+}
+
+bool MessageDeque::push(const QueuedMessage& added, QueuedMessage& /*not needed*/) {
+ pushPtr(added);
+ return false; // adding a message never causes one to be removed for deque
}
void MessageDeque::updateAcquired(const QueuedMessage& acquired)
diff --git a/qpid/cpp/src/qpid/broker/MessageDeque.h b/qpid/cpp/src/qpid/broker/MessageDeque.h
index bb5943b09b..9b53716d4e 100644
--- a/qpid/cpp/src/qpid/broker/MessageDeque.h
+++ b/qpid/cpp/src/qpid/broker/MessageDeque.h
@@ -48,6 +48,12 @@ class MessageDeque : public Messages
void foreach(Functor);
void removeIf(Predicate);
+ // For use by other Messages implementations that use MessageDeque as a FIFO index
+ // and keep pointers to its elements in their own indexing strctures.
+ void clean();
+ QueuedMessage* releasePtr(const QueuedMessage&);
+ QueuedMessage* pushPtr(const QueuedMessage& added);
+
private:
typedef std::deque<QueuedMessage> Deque;
Deque messages;
@@ -55,7 +61,6 @@ class MessageDeque : public Messages
size_t head;
size_t index(const framing::SequenceNumber&);
- void clean();
};
}} // namespace qpid::broker
diff --git a/qpid/cpp/src/qpid/broker/MessageGroupManager.cpp b/qpid/cpp/src/qpid/broker/MessageGroupManager.cpp
index 22253532cb..15cd56a676 100644
--- a/qpid/cpp/src/qpid/broker/MessageGroupManager.cpp
+++ b/qpid/cpp/src/qpid/broker/MessageGroupManager.cpp
@@ -19,11 +19,13 @@
*
*/
+#include "qpid/broker/MessageGroupManager.h"
+
+#include "qpid/broker/Queue.h"
#include "qpid/framing/FieldTable.h"
-#include "qpid/types/Variant.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Statement.h"
-#include "qpid/broker/Queue.h"
-#include "qpid/broker/MessageGroupManager.h"
+#include "qpid/types/Variant.h"
using namespace qpid::broker;
diff --git a/qpid/cpp/src/qpid/broker/MessageGroupManager.h b/qpid/cpp/src/qpid/broker/MessageGroupManager.h
index 340ebbc56a..2dd97ea2ff 100644
--- a/qpid/cpp/src/qpid/broker/MessageGroupManager.h
+++ b/qpid/cpp/src/qpid/broker/MessageGroupManager.h
@@ -28,11 +28,14 @@
#include "qpid/broker/MessageDistributor.h"
#include "qpid/sys/unordered_map.h"
+#include <deque>
+
namespace qpid {
namespace broker {
class QueueObserver;
class MessageDistributor;
+class Messages;
class MessageGroupManager : public StatefulQueueObserver, public MessageDistributor
{
diff --git a/qpid/cpp/src/qpid/broker/MessageMap.cpp b/qpid/cpp/src/qpid/broker/MessageMap.cpp
index 048df45434..9b164d4e5c 100644
--- a/qpid/cpp/src/qpid/broker/MessageMap.cpp
+++ b/qpid/cpp/src/qpid/broker/MessageMap.cpp
@@ -20,6 +20,7 @@
*/
#include "qpid/broker/MessageMap.h"
#include "qpid/broker/QueuedMessage.h"
+#include "qpid/log/Statement.h"
namespace qpid {
namespace broker {
@@ -27,7 +28,16 @@ namespace {
const std::string EMPTY;
}
-bool MessageMap::deleted(const QueuedMessage&) { return true; }
+bool MessageMap::deleted(const QueuedMessage& message)
+{
+ Ordering::iterator i = messages.find(message.position);
+ if (i != messages.end()) {
+ erase(i);
+ return true;
+ } else {
+ return false;
+ }
+}
std::string MessageMap::getKey(const QueuedMessage& message)
{
@@ -38,30 +48,32 @@ std::string MessageMap::getKey(const QueuedMessage& message)
size_t MessageMap::size()
{
- return messages.size();
+ size_t count(0);
+ for (Ordering::iterator i = messages.begin(); i != messages.end(); ++i) {
+ if (i->second.status == QueuedMessage::AVAILABLE) ++count;
+ }
+ return count;
}
bool MessageMap::empty()
{
- return messages.empty();
+ return size() == 0;//TODO: more efficient implementation
}
void MessageMap::release(const QueuedMessage& message)
{
- std::string key = getKey(message);
- Index::iterator i = index.find(key);
- if (i == index.end()) {
- index[key] = message;
- messages[message.position] = message;
- } //else message has already been replaced
+ Ordering::iterator i = messages.find(message.position);
+ if (i != messages.end() && i->second.status == QueuedMessage::ACQUIRED) {
+ i->second.status = QueuedMessage::AVAILABLE;
+ }
}
bool MessageMap::acquire(const framing::SequenceNumber& position, QueuedMessage& message)
{
Ordering::iterator i = messages.find(position);
- if (i != messages.end()) {
+ if (i != messages.end() && i->second.status == QueuedMessage::AVAILABLE) {
+ i->second.status = QueuedMessage::ACQUIRED;
message = i->second;
- erase(i);
return true;
} else {
return false;
@@ -71,7 +83,7 @@ bool MessageMap::acquire(const framing::SequenceNumber& position, QueuedMessage&
bool MessageMap::find(const framing::SequenceNumber& position, QueuedMessage& message)
{
Ordering::iterator i = messages.find(position);
- if (i != messages.end()) {
+ if (i != messages.end() && i->second.status == QueuedMessage::AVAILABLE) {
message = i->second;
return true;
} else {
@@ -79,10 +91,10 @@ bool MessageMap::find(const framing::SequenceNumber& position, QueuedMessage& me
}
}
-bool MessageMap::browse(const framing::SequenceNumber& position, QueuedMessage& message, bool)
+bool MessageMap::browse(const framing::SequenceNumber& position, QueuedMessage& message, bool unacquired)
{
Ordering::iterator i = messages.lower_bound(position+1);
- if (i != messages.end()) {
+ if (i != messages.end() && (i->second.status == QueuedMessage::AVAILABLE || (!unacquired && i->second.status == QueuedMessage::ACQUIRED))) {
message = i->second;
return true;
} else {
@@ -92,14 +104,14 @@ bool MessageMap::browse(const framing::SequenceNumber& position, QueuedMessage&
bool MessageMap::consume(QueuedMessage& message)
{
- Ordering::iterator i = messages.begin();
- if (i != messages.end()) {
- message = i->second;
- erase(i);
- return true;
- } else {
- return false;
+ for (Ordering::iterator i = messages.begin(); i != messages.end(); ++i) {
+ if (i->second.status == QueuedMessage::AVAILABLE) {
+ i->second.status = QueuedMessage::ACQUIRED;
+ message = i->second;
+ return true;
+ }
}
+ return false;
}
const QueuedMessage& MessageMap::replace(const QueuedMessage& original, const QueuedMessage& update)
@@ -115,12 +127,17 @@ bool MessageMap::push(const QueuedMessage& added, QueuedMessage& removed)
if (result.second) {
//there was no previous message for this key; nothing needs to
//be removed, just add the message into its correct position
- messages[added.position] = added;
+ QueuedMessage& a = messages[added.position];
+ a = added;
+ a.status = QueuedMessage::AVAILABLE;
+ QPID_LOG(debug, "Added message at " << a.position);
return false;
} else {
//there is already a message with that key which needs to be replaced
removed = result.first->second;
result.first->second = replace(result.first->second, added);
+ result.first->second.status = QueuedMessage::AVAILABLE;
+ QPID_LOG(debug, "Displaced message at " << removed.position << " with " << result.first->second.position << ": " << result.first->first);
return true;
}
}
@@ -128,15 +145,24 @@ bool MessageMap::push(const QueuedMessage& added, QueuedMessage& removed)
void MessageMap::foreach(Functor f)
{
for (Ordering::iterator i = messages.begin(); i != messages.end(); ++i) {
- f(i->second);
+ if (i->second.status == QueuedMessage::AVAILABLE) f(i->second);
}
}
void MessageMap::removeIf(Predicate p)
{
- for (Ordering::iterator i = messages.begin(); i != messages.end(); i++) {
- if (p(i->second)) {
- erase(i);
+ for (Ordering::iterator i = messages.begin(); i != messages.end();) {
+ if (i->second.status == QueuedMessage::AVAILABLE && p(i->second)) {
+ index.erase(getKey(i->second));
+ //Note: Removing from messages means that the subsequent
+ //call to deleted() for the same message will return
+ //false. At present that is not a problem. If this were
+ //changed to hold onto the message until dequeued
+ //(e.g. with REMOVED state), then the erase() below would
+ //need to take that into account.
+ messages.erase(i++);
+ } else {
+ ++i;
}
}
}
diff --git a/qpid/cpp/src/qpid/broker/MessageMap.h b/qpid/cpp/src/qpid/broker/MessageMap.h
index d1b8217f9b..a668450250 100644
--- a/qpid/cpp/src/qpid/broker/MessageMap.h
+++ b/qpid/cpp/src/qpid/broker/MessageMap.h
@@ -43,7 +43,7 @@ class MessageMap : public Messages
size_t size();
bool empty();
- bool deleted(const QueuedMessage&);
+ virtual bool deleted(const QueuedMessage&);
void release(const QueuedMessage&);
virtual bool acquire(const framing::SequenceNumber&, QueuedMessage&);
bool find(const framing::SequenceNumber&, QueuedMessage&);
diff --git a/qpid/cpp/src/qpid/broker/PriorityQueue.cpp b/qpid/cpp/src/qpid/broker/PriorityQueue.cpp
index d807ef22b1..ab5ec7235a 100644
--- a/qpid/cpp/src/qpid/broker/PriorityQueue.cpp
+++ b/qpid/cpp/src/qpid/broker/PriorityQueue.cpp
@@ -3,13 +3,13 @@
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
+ * regarding copyright ownersip. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -22,96 +22,87 @@
#include "qpid/broker/Queue.h"
#include "qpid/broker/QueuedMessage.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/log/Statement.h"
#include <cmath>
namespace qpid {
namespace broker {
-PriorityQueue::PriorityQueue(int l) :
+PriorityQueue::PriorityQueue(int l) :
levels(l),
messages(levels, Deque()),
frontLevel(0), haveFront(false), cached(false) {}
-bool PriorityQueue::deleted(const QueuedMessage&) { return true; }
+bool PriorityQueue::deleted(const QueuedMessage& qm) {
+ bool deleted = fifo.deleted(qm);
+ if (deleted) erase(qm);
+ return deleted;
+}
size_t PriorityQueue::size()
{
- size_t total(0);
- for (int i = 0; i < levels; ++i) {
- total += messages[i].size();
- }
- return total;
+ return fifo.size();
+}
+
+namespace {
+bool before(QueuedMessage* a, QueuedMessage* b) { return *a < *b; }
}
void PriorityQueue::release(const QueuedMessage& message)
{
- uint p = getPriorityLevel(message);
- messages[p].insert(lower_bound(messages[p].begin(), messages[p].end(), message), message);
- clearCache();
+ QueuedMessage* qm = fifo.releasePtr(message);
+ if (qm) {
+ uint p = getPriorityLevel(message);
+ messages[p].insert(
+ lower_bound(messages[p].begin(), messages[p].end(), qm, before), qm);
+ clearCache();
+ }
}
-bool PriorityQueue::find(const framing::SequenceNumber& position, QueuedMessage& message, bool remove)
-{
- QueuedMessage comp;
- comp.position = position;
- for (int i = 0; i < levels; ++i) {
- if (!messages[i].empty()) {
- unsigned long diff = position.getValue() - messages[i].front().position.getValue();
- long maxEnd = diff < messages[i].size() ? diff : messages[i].size();
- Deque::iterator l = lower_bound(messages[i].begin(),messages[i].begin()+maxEnd,comp);
- if (l != messages[i].end() && l->position == position) {
- message = *l;
- if (remove) {
- messages[i].erase(l);
- clearCache();
- }
- return true;
- }
+
+void PriorityQueue::erase(const QueuedMessage& qm) {
+ size_t i = getPriorityLevel(qm);
+ if (!messages[i].empty()) {
+ long diff = qm.position.getValue() - messages[i].front()->position.getValue();
+ if (diff < 0) return;
+ long maxEnd = std::min(size_t(diff), messages[i].size());
+ QueuedMessage mutableQm = qm; // need non-const qm for lower_bound
+ Deque::iterator l =
+ lower_bound(messages[i].begin(),messages[i].begin()+maxEnd, &mutableQm, before);
+ if (l != messages[i].end() && (*l)->position == qm.position) {
+ messages[i].erase(l);
+ clearCache();
+ return;
}
}
- return false;
}
bool PriorityQueue::acquire(const framing::SequenceNumber& position, QueuedMessage& message)
{
- return find(position, message, true);
+ bool acquired = fifo.acquire(position, message);
+ if (acquired) erase(message); // No longer available
+ return acquired;
}
bool PriorityQueue::find(const framing::SequenceNumber& position, QueuedMessage& message)
{
- return find(position, message, false);
+ return fifo.find(position, message);
}
-bool PriorityQueue::browse(const framing::SequenceNumber& position, QueuedMessage& message, bool)
+bool PriorityQueue::browse(
+ const framing::SequenceNumber& position, QueuedMessage& message, bool unacquired)
{
- QueuedMessage match;
- match.position = position+1;
- Deque::iterator lowest;
- bool found = false;
- for (int i = 0; i < levels; ++i) {
- Deque::iterator m = lower_bound(messages[i].begin(), messages[i].end(), match);
- if (m != messages[i].end()) {
- if (m->position == match.position) {
- message = *m;
- return true;
- } else if (!found || m->position < lowest->position) {
- lowest = m;
- found = true;
- }
- }
- }
- if (found) {
- message = *lowest;
- }
- return found;
+ return fifo.browse(position, message, unacquired);
}
bool PriorityQueue::consume(QueuedMessage& message)
{
if (checkFront()) {
- message = messages[frontLevel].front();
+ QueuedMessage* pm = messages[frontLevel].front();
messages[frontLevel].pop_front();
clearCache();
+ pm->status = QueuedMessage::ACQUIRED; // Updates FIFO index
+ message = *pm;
return true;
} else {
return false;
@@ -120,23 +111,27 @@ bool PriorityQueue::consume(QueuedMessage& message)
bool PriorityQueue::push(const QueuedMessage& added, QueuedMessage& /*not needed*/)
{
- messages[getPriorityLevel(added)].push_back(added);
+ QueuedMessage* qmp = fifo.pushPtr(added);
+ messages[getPriorityLevel(added)].push_back(qmp);
clearCache();
- return false;//adding a message never causes one to be removed for deque
+ return false; // Adding a message never causes one to be removed for deque
+}
+
+void PriorityQueue::updateAcquired(const QueuedMessage& acquired) {
+ fifo.updateAcquired(acquired);
}
void PriorityQueue::foreach(Functor f)
{
- for (int i = 0; i < levels; ++i) {
- std::for_each(messages[i].begin(), messages[i].end(), f);
- }
+ fifo.foreach(f);
}
void PriorityQueue::removeIf(Predicate p)
{
for (int priority = 0; priority < levels; ++priority) {
for (Deque::iterator i = messages[priority].begin(); i != messages[priority].end();) {
- if (p(*i)) {
+ if (p(**i)) {
+ (*i)->status = QueuedMessage::DELETED; // Updates fifo index
i = messages[priority].erase(i);
clearCache();
} else {
@@ -144,6 +139,7 @@ void PriorityQueue::removeIf(Predicate p)
}
}
}
+ fifo.clean();
}
uint PriorityQueue::getPriorityLevel(const QueuedMessage& m) const
diff --git a/qpid/cpp/src/qpid/broker/PriorityQueue.h b/qpid/cpp/src/qpid/broker/PriorityQueue.h
index 67c31468d2..8628745db1 100644
--- a/qpid/cpp/src/qpid/broker/PriorityQueue.h
+++ b/qpid/cpp/src/qpid/broker/PriorityQueue.h
@@ -10,9 +10,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -21,7 +21,7 @@
* under the License.
*
*/
-#include "qpid/broker/Messages.h"
+#include "qpid/broker/MessageDeque.h"
#include "qpid/sys/IntegerTypes.h"
#include <deque>
#include <vector>
@@ -32,7 +32,10 @@ namespace broker {
/**
* Basic priority queue with a configurable number of recognised
* priority levels. This is implemented as a separate deque per
- * priority level. Browsing is FIFO not priority order.
+ * priority level.
+ *
+ * Browsing is FIFO not priority order. There is a MessageDeque
+ * for fast browsing.
*/
class PriorityQueue : public Messages
{
@@ -48,23 +51,31 @@ class PriorityQueue : public Messages
bool browse(const framing::SequenceNumber&, QueuedMessage&, bool);
bool consume(QueuedMessage&);
bool push(const QueuedMessage& added, QueuedMessage& removed);
-
+ void updateAcquired(const QueuedMessage& acquired);
void foreach(Functor);
void removeIf(Predicate);
+
static uint getPriority(const QueuedMessage&);
+
protected:
- typedef std::deque<QueuedMessage> Deque;
+ typedef std::deque<QueuedMessage*> Deque;
typedef std::vector<Deque> PriorityLevels;
virtual bool findFrontLevel(uint& p, PriorityLevels&);
const int levels;
+
private:
+ /** Available messages separated by priority and sorted in priority order.
+ * Holds pointers to the QueuedMessages in fifo
+ */
PriorityLevels messages;
+ /** FIFO index of all messsagse (including acquired messages) for fast browsing and indexing */
+ MessageDeque fifo;
uint frontLevel;
bool haveFront;
bool cached;
-
- bool find(const framing::SequenceNumber&, QueuedMessage&, bool remove);
+
+ void erase(const QueuedMessage&);
uint getPriorityLevel(const QueuedMessage&) const;
void clearCache();
bool checkFront();
diff --git a/qpid/cpp/src/qpid/broker/Queue.cpp b/qpid/cpp/src/qpid/broker/Queue.cpp
index da5b97ef4e..e7305c021d 100644
--- a/qpid/cpp/src/qpid/broker/Queue.cpp
+++ b/qpid/cpp/src/qpid/broker/Queue.cpp
@@ -19,8 +19,9 @@
*
*/
-#include "qpid/broker/Broker.h"
#include "qpid/broker/Queue.h"
+
+#include "qpid/broker/Broker.h"
#include "qpid/broker/QueueEvents.h"
#include "qpid/broker/Exchange.h"
#include "qpid/broker/Fairshare.h"
@@ -41,6 +42,7 @@
#include "qpid/management/ManagementAgent.h"
#include "qpid/framing/reply_exceptions.h"
#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/sys/ClusterSafe.h"
#include "qpid/sys/Monitor.h"
#include "qpid/sys/Time.h"
@@ -152,6 +154,7 @@ Queue::Queue(const string& _name, bool _autodelete,
store(_store),
owner(_owner),
consumerCount(0),
+ browserCount(0),
exclusive(0),
noLocal(false),
persistLastNode(false),
@@ -521,17 +524,27 @@ void Queue::consume(Consumer::shared_ptr c, bool requestExclusive){
assertClusterSafe();
{
Mutex::ScopedLock locker(messageLock);
- if(exclusive) {
- throw ResourceLockedException(
- QPID_MSG("Queue " << getName() << " has an exclusive consumer. No more consumers allowed."));
- } else if(requestExclusive) {
- if(consumerCount) {
+ // NOTE: consumerCount is actually a count of all
+ // subscriptions, both acquiring and non-acquiring (browsers).
+ // Check for exclusivity of acquiring consumers.
+ size_t acquiringConsumers = consumerCount - browserCount;
+ if (c->preAcquires()) {
+ if(exclusive) {
throw ResourceLockedException(
- QPID_MSG("Queue " << getName() << " already has consumers. Exclusive access denied."));
- } else {
- exclusive = c->getSession();
+ QPID_MSG("Queue " << getName()
+ << " has an exclusive consumer. No more consumers allowed."));
+ } else if(requestExclusive) {
+ if(acquiringConsumers) {
+ throw ResourceLockedException(
+ QPID_MSG("Queue " << getName()
+ << " already has consumers. Exclusive access denied."));
+ } else {
+ exclusive = c->getSession();
+ }
}
}
+ else
+ browserCount++;
consumerCount++;
//reset auto deletion timer if necessary
if (autoDeleteTimeout && autoDeleteTask) {
@@ -548,6 +561,7 @@ void Queue::cancel(Consumer::shared_ptr c){
{
Mutex::ScopedLock locker(messageLock);
consumerCount--;
+ if (!c->preAcquires()) browserCount--;
if(exclusive) exclusive = 0;
observeConsumerRemove(*c, locker);
}
@@ -1611,9 +1625,14 @@ Manageable::status_t Queue::ManagementMethod (uint32_t methodId, Args& args, str
{
_qmf::ArgsQueueReroute& rerouteArgs = (_qmf::ArgsQueueReroute&) args;
boost::shared_ptr<Exchange> dest;
- if (rerouteArgs.i_useAltExchange)
+ if (rerouteArgs.i_useAltExchange) {
+ if (!alternateExchange) {
+ status = Manageable::STATUS_PARAMETER_INVALID;
+ etext = "No alternate-exchange defined";
+ break;
+ }
dest = alternateExchange;
- else {
+ } else {
try {
dest = broker->getExchanges().get(rerouteArgs.i_exchange);
} catch(const std::exception&) {
diff --git a/qpid/cpp/src/qpid/broker/Queue.h b/qpid/cpp/src/qpid/broker/Queue.h
index 9b9acc677c..9869a698c1 100644
--- a/qpid/cpp/src/qpid/broker/Queue.h
+++ b/qpid/cpp/src/qpid/broker/Queue.h
@@ -97,7 +97,8 @@ class Queue : public boost::enable_shared_from_this<Queue>,
const bool autodelete;
MessageStore* store;
const OwnershipToken* owner;
- uint32_t consumerCount;
+ uint32_t consumerCount; // Actually a count of all subscriptions, acquiring or not.
+ uint32_t browserCount; // Count of non-acquiring subscriptions.
OwnershipToken* exclusive;
bool noLocal;
bool persistLastNode;
diff --git a/qpid/cpp/src/qpid/broker/QueuedMessage.cpp b/qpid/cpp/src/qpid/broker/QueuedMessage.cpp
new file mode 100644
index 0000000000..d40cc901ff
--- /dev/null
+++ b/qpid/cpp/src/qpid/broker/QueuedMessage.cpp
@@ -0,0 +1,34 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include "QueuedMessage.h"
+#include "Queue.h"
+#include <iostream>
+
+namespace qpid {
+namespace broker {
+
+std::ostream& operator<<(std::ostream& o, const QueuedMessage& qm) {
+ o << (qm.queue ? qm.queue->getName() : std::string()) << "[" << qm.position <<"]";
+ return o;
+}
+
+
+}} // namespace qpid::broker
diff --git a/qpid/cpp/src/qpid/broker/QueuedMessage.h b/qpid/cpp/src/qpid/broker/QueuedMessage.h
index 806da8e720..9d008193a0 100644
--- a/qpid/cpp/src/qpid/broker/QueuedMessage.h
+++ b/qpid/cpp/src/qpid/broker/QueuedMessage.h
@@ -22,6 +22,8 @@
#define _QueuedMessage_
#include "qpid/broker/Message.h"
+#include "BrokerImportExport.h"
+#include <iosfwd>
namespace qpid {
namespace broker {
@@ -47,6 +49,7 @@ inline bool operator<(const QueuedMessage& a, const QueuedMessage& b) {
return a.position < b.position;
}
+QPID_BROKER_EXTERN std::ostream& operator<<(std::ostream&, const QueuedMessage&);
}}
diff --git a/qpid/cpp/src/qpid/broker/SaslAuthenticator.cpp b/qpid/cpp/src/qpid/broker/SaslAuthenticator.cpp
index d7adbd68ab..80fa5e1c0e 100644
--- a/qpid/cpp/src/qpid/broker/SaslAuthenticator.cpp
+++ b/qpid/cpp/src/qpid/broker/SaslAuthenticator.cpp
@@ -26,6 +26,7 @@
#include "qpid/broker/Connection.h"
#include "qpid/log/Statement.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/sys/SecuritySettings.h"
#include <boost/format.hpp>
diff --git a/qpid/cpp/src/qpid/broker/SessionAdapter.cpp b/qpid/cpp/src/qpid/broker/SessionAdapter.cpp
index 4aad46f782..78f2e43ce0 100644
--- a/qpid/cpp/src/qpid/broker/SessionAdapter.cpp
+++ b/qpid/cpp/src/qpid/broker/SessionAdapter.cpp
@@ -21,8 +21,9 @@
#include "qpid/Exception.h"
#include "qpid/framing/reply_exceptions.h"
#include "qpid/framing/enum.h"
-#include "qpid/log/Statement.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/framing/SequenceSet.h"
+#include "qpid/log/Statement.h"
#include "qpid/management/ManagementAgent.h"
#include "qpid/broker/SessionState.h"
#include "qmf/org/apache/qpid/broker/EventExchangeDeclare.h"
@@ -73,18 +74,12 @@ void SessionAdapter::ExchangeHandlerImpl::declare(const string& exchange, const
if(passive){
AclModule* acl = getBroker().getAcl();
if (acl) {
- //TODO: why does a passive declare require create
- //permission? The purpose of the passive flag is to state
- //that the exchange should *not* created. For
- //authorisation a passive declare is similar to
- //exchange-query.
std::map<acl::Property, std::string> params;
params.insert(make_pair(acl::PROP_TYPE, type));
params.insert(make_pair(acl::PROP_ALTERNATE, alternateExchange));
- params.insert(make_pair(acl::PROP_PASSIVE, _TRUE));
params.insert(make_pair(acl::PROP_DURABLE, durable ? _TRUE : _FALSE));
- if (!acl->authorise(getConnection().getUserId(),acl::ACT_CREATE,acl::OBJ_EXCHANGE,exchange,&params) )
- throw framing::UnauthorizedAccessException(QPID_MSG("ACL denied exchange create request from " << getConnection().getUserId()));
+ if (!acl->authorise(getConnection().getUserId(),acl::ACT_ACCESS,acl::OBJ_EXCHANGE,exchange,&params) )
+ throw framing::UnauthorizedAccessException(QPID_MSG("ACL denied exchange access request from " << getConnection().getUserId()));
}
Exchange::shared_ptr actual(getBroker().getExchanges().get(exchange));
checkType(actual, type);
@@ -274,22 +269,16 @@ void SessionAdapter::QueueHandlerImpl::declare(const string& name, const string&
if (passive && !name.empty()) {
AclModule* acl = getBroker().getAcl();
if (acl) {
- //TODO: why does a passive declare require create
- //permission? The purpose of the passive flag is to state
- //that the queue should *not* created. For
- //authorisation a passive declare is similar to
- //queue-query (or indeed a qmf query).
std::map<acl::Property, std::string> params;
params.insert(make_pair(acl::PROP_ALTERNATE, alternateExchange));
- params.insert(make_pair(acl::PROP_PASSIVE, _TRUE));
params.insert(make_pair(acl::PROP_DURABLE, std::string(durable ? _TRUE : _FALSE)));
params.insert(make_pair(acl::PROP_EXCLUSIVE, std::string(exclusive ? _TRUE : _FALSE)));
params.insert(make_pair(acl::PROP_AUTODELETE, std::string(autoDelete ? _TRUE : _FALSE)));
params.insert(make_pair(acl::PROP_POLICYTYPE, arguments.getAsString("qpid.policy_type")));
params.insert(make_pair(acl::PROP_MAXQUEUECOUNT, boost::lexical_cast<string>(arguments.getAsInt("qpid.max_count"))));
params.insert(make_pair(acl::PROP_MAXQUEUESIZE, boost::lexical_cast<string>(arguments.getAsInt64("qpid.max_size"))));
- if (!acl->authorise(getConnection().getUserId(),acl::ACT_CREATE,acl::OBJ_QUEUE,name,&params) )
- throw UnauthorizedAccessException(QPID_MSG("ACL denied queue create request from " << getConnection().getUserId()));
+ if (!acl->authorise(getConnection().getUserId(),acl::ACT_ACCESS,acl::OBJ_QUEUE,name,&params) )
+ throw UnauthorizedAccessException(QPID_MSG("ACL denied queue access request from " << getConnection().getUserId()));
}
queue = getQueue(name);
//TODO: check alternate-exchange is as expected
@@ -409,6 +398,7 @@ SessionAdapter::MessageHandlerImpl::subscribe(const string& queueName,
if(!destination.empty() && state.exists(destination))
throw NotAllowedException(QPID_MSG("Consumer tags must be unique"));
+ // We allow browsing (acquireMode == 1) of exclusive queues, this is required by HA.
if (queue->hasExclusiveOwner() && !queue->isExclusiveOwner(&session) && acquireMode == 0)
throw ResourceLockedException(QPID_MSG("Cannot subscribe to exclusive queue "
<< queue->getName()));
@@ -548,13 +538,6 @@ void SessionAdapter::TxHandlerImpl::rollback()
state.rollback();
}
-std::string SessionAdapter::DtxHandlerImpl::convert(const framing::Xid& xid)
-{
- std::string encoded;
- encode(xid, encoded);
- return encoded;
-}
-
void SessionAdapter::DtxHandlerImpl::select()
{
state.selectDtx();
@@ -566,7 +549,7 @@ XaResult SessionAdapter::DtxHandlerImpl::end(const Xid& xid,
{
try {
if (fail) {
- state.endDtx(convert(xid), true);
+ state.endDtx(DtxManager::convert(xid), true);
if (suspend) {
throw CommandInvalidException(QPID_MSG("End and suspend cannot both be set."));
} else {
@@ -574,9 +557,9 @@ XaResult SessionAdapter::DtxHandlerImpl::end(const Xid& xid,
}
} else {
if (suspend) {
- state.suspendDtx(convert(xid));
+ state.suspendDtx(DtxManager::convert(xid));
} else {
- state.endDtx(convert(xid), false);
+ state.endDtx(DtxManager::convert(xid), false);
}
return XaResult(XA_STATUS_XA_OK);
}
@@ -594,9 +577,9 @@ XaResult SessionAdapter::DtxHandlerImpl::start(const Xid& xid,
}
try {
if (resume) {
- state.resumeDtx(convert(xid));
+ state.resumeDtx(DtxManager::convert(xid));
} else {
- state.startDtx(convert(xid), getBroker().getDtxManager(), join);
+ state.startDtx(DtxManager::convert(xid), getBroker().getDtxManager(), join);
}
return XaResult(XA_STATUS_XA_OK);
} catch (const DtxTimeoutException& /*e*/) {
@@ -607,7 +590,7 @@ XaResult SessionAdapter::DtxHandlerImpl::start(const Xid& xid,
XaResult SessionAdapter::DtxHandlerImpl::prepare(const Xid& xid)
{
try {
- bool ok = getBroker().getDtxManager().prepare(convert(xid));
+ bool ok = getBroker().getDtxManager().prepare(DtxManager::convert(xid));
return XaResult(ok ? XA_STATUS_XA_OK : XA_STATUS_XA_RBROLLBACK);
} catch (const DtxTimeoutException& /*e*/) {
return XaResult(XA_STATUS_XA_RBTIMEOUT);
@@ -618,7 +601,7 @@ XaResult SessionAdapter::DtxHandlerImpl::commit(const Xid& xid,
bool onePhase)
{
try {
- bool ok = getBroker().getDtxManager().commit(convert(xid), onePhase);
+ bool ok = getBroker().getDtxManager().commit(DtxManager::convert(xid), onePhase);
return XaResult(ok ? XA_STATUS_XA_OK : XA_STATUS_XA_RBROLLBACK);
} catch (const DtxTimeoutException& /*e*/) {
return XaResult(XA_STATUS_XA_RBTIMEOUT);
@@ -629,7 +612,7 @@ XaResult SessionAdapter::DtxHandlerImpl::commit(const Xid& xid,
XaResult SessionAdapter::DtxHandlerImpl::rollback(const Xid& xid)
{
try {
- getBroker().getDtxManager().rollback(convert(xid));
+ getBroker().getDtxManager().rollback(DtxManager::convert(xid));
return XaResult(XA_STATUS_XA_OK);
} catch (const DtxTimeoutException& /*e*/) {
return XaResult(XA_STATUS_XA_RBTIMEOUT);
@@ -659,7 +642,7 @@ void SessionAdapter::DtxHandlerImpl::forget(const Xid& xid)
DtxGetTimeoutResult SessionAdapter::DtxHandlerImpl::getTimeout(const Xid& xid)
{
- uint32_t timeout = getBroker().getDtxManager().getTimeout(convert(xid));
+ uint32_t timeout = getBroker().getDtxManager().getTimeout(DtxManager::convert(xid));
return DtxGetTimeoutResult(timeout);
}
@@ -667,7 +650,7 @@ DtxGetTimeoutResult SessionAdapter::DtxHandlerImpl::getTimeout(const Xid& xid)
void SessionAdapter::DtxHandlerImpl::setTimeout(const Xid& xid,
uint32_t timeout)
{
- getBroker().getDtxManager().setTimeout(convert(xid), timeout);
+ getBroker().getDtxManager().setTimeout(DtxManager::convert(xid), timeout);
}
diff --git a/qpid/cpp/src/qpid/broker/SessionAdapter.h b/qpid/cpp/src/qpid/broker/SessionAdapter.h
index 8987c4812f..bc056538b1 100644
--- a/qpid/cpp/src/qpid/broker/SessionAdapter.h
+++ b/qpid/cpp/src/qpid/broker/SessionAdapter.h
@@ -226,10 +226,8 @@ class Queue;
void rollback();
};
- class DtxHandlerImpl : public DtxHandler, public HandlerHelper, private framing::StructHelper
+ class DtxHandlerImpl : public DtxHandler, public HandlerHelper
{
- std::string convert(const framing::Xid& xid);
-
public:
DtxHandlerImpl(SemanticState& session) : HandlerHelper(session) {}
diff --git a/qpid/cpp/src/qpid/broker/SessionHandler.cpp b/qpid/cpp/src/qpid/broker/SessionHandler.cpp
index 752fa55535..b58c7c01c5 100644
--- a/qpid/cpp/src/qpid/broker/SessionHandler.cpp
+++ b/qpid/cpp/src/qpid/broker/SessionHandler.cpp
@@ -64,6 +64,7 @@ void SessionHandler::handleDetach() {
if (session.get())
connection.getBroker().getSessionManager().detach(session);
assert(!session.get());
+ if (detachedCallback) detachedCallback();
connection.closeChannel(channel.get());
}
@@ -117,4 +118,8 @@ void SessionHandler::attached(const std::string& name)
}
}
+void SessionHandler::setDetachedCallback(boost::function<void()> cb) {
+ detachedCallback = cb;
+}
+
}} // namespace qpid::broker
diff --git a/qpid/cpp/src/qpid/broker/SessionHandler.h b/qpid/cpp/src/qpid/broker/SessionHandler.h
index 8cd5072574..4e2cfaa963 100644
--- a/qpid/cpp/src/qpid/broker/SessionHandler.h
+++ b/qpid/cpp/src/qpid/broker/SessionHandler.h
@@ -10,9 +10,9 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -25,6 +25,7 @@
#include "qpid/amqp_0_10/SessionHandler.h"
#include "qpid/broker/SessionHandler.h"
#include "qpid/framing/AMQP_ClientProxy.h"
+#include <boost/function.hpp>
namespace qpid {
class SessionState;
@@ -61,7 +62,7 @@ class SessionHandler : public amqp_0_10::SessionHandler {
* This proxy is for sending such commands. In a clustered broker it will take steps
* to synchronize command order across the cluster. In a stand-alone broker
* it is just a synonym for getProxy()
- */
+ */
framing::AMQP_ClientProxy& getClusterOrderProxy() {
return clusterOrderProxy.get() ? *clusterOrderProxy : proxy;
}
@@ -70,6 +71,8 @@ class SessionHandler : public amqp_0_10::SessionHandler {
void attached(const std::string& name);//used by 'pushing' inter-broker bridges
void attachAs(const std::string& name);//used by 'pulling' inter-broker bridges
+ void setDetachedCallback(boost::function<void()> cb);
+
protected:
virtual void setState(const std::string& sessionName, bool force);
virtual qpid::SessionState* getState();
@@ -91,6 +94,7 @@ class SessionHandler : public amqp_0_10::SessionHandler {
framing::AMQP_ClientProxy proxy;
std::auto_ptr<SessionState> session;
std::auto_ptr<SetChannelProxy> clusterOrderProxy;
+ boost::function<void ()> detachedCallback;
};
}} // namespace qpid::broker
diff --git a/qpid/cpp/src/qpid/broker/windows/SaslAuthenticator.cpp b/qpid/cpp/src/qpid/broker/windows/SaslAuthenticator.cpp
index 2acc09cded..a38e6ac12a 100644
--- a/qpid/cpp/src/qpid/broker/windows/SaslAuthenticator.cpp
+++ b/qpid/cpp/src/qpid/broker/windows/SaslAuthenticator.cpp
@@ -25,6 +25,7 @@
#include "qpid/broker/Connection.h"
#include "qpid/log/Statement.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/FieldValue.h"
#include <windows.h>
diff --git a/qpid/cpp/src/qpid/client/ConnectionHandler.cpp b/qpid/cpp/src/qpid/client/ConnectionHandler.cpp
index ab0d8e0700..94561f8079 100644
--- a/qpid/cpp/src/qpid/client/ConnectionHandler.cpp
+++ b/qpid/cpp/src/qpid/client/ConnectionHandler.cpp
@@ -28,10 +28,13 @@
#include "qpid/framing/all_method_bodies.h"
#include "qpid/framing/ClientInvoker.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Helpers.h"
#include "qpid/log/Statement.h"
#include "qpid/sys/SystemInfo.h"
+#include <algorithm>
+
using namespace qpid::client;
using namespace qpid::framing;
using namespace qpid::framing::connection;
@@ -238,15 +241,16 @@ void ConnectionHandler::start(const FieldTable& /*serverProps*/, const Array& me
);
std::vector<std::string> mechlist;
+ mechlist.reserve(mechanisms.size());
if (mechanism.empty()) {
//mechlist is simply what the server offers
- mechanisms.collect(mechlist);
+ std::transform(mechanisms.begin(), mechanisms.end(), std::back_inserter(mechlist), Array::get<std::string, Array::ValuePtr>);
} else {
//mechlist is the intersection of those indicated by user and
//those supported by server, in the order listed by user
std::vector<std::string> allowed = split(mechanism, " ");
- std::vector<std::string> supported;
- mechanisms.collect(supported);
+ std::vector<std::string> supported(mechanisms.size());
+ std::transform(mechanisms.begin(), mechanisms.end(), std::back_inserter(supported), Array::get<std::string, Array::ValuePtr>);
intersection(allowed, supported, mechlist);
if (mechlist.empty()) {
throw Exception(QPID_MSG("Desired mechanism(s) not valid: " << mechanism << " (supported: " << join(supported) << ")"));
diff --git a/qpid/cpp/src/qpid/client/ConnectionImpl.cpp b/qpid/cpp/src/qpid/client/ConnectionImpl.cpp
index db97f1e0f4..85b0e8303e 100644
--- a/qpid/cpp/src/qpid/client/ConnectionImpl.cpp
+++ b/qpid/cpp/src/qpid/client/ConnectionImpl.cpp
@@ -115,8 +115,10 @@ public:
ioThreads(0),
connections(0)
{
+ CommonOptions common("", "", QPIDC_CONF_FILE);
IOThreadOptions options(c);
- options.parse(0, 0, QPIDC_CONF_FILE, true);
+ common.parse(0, 0, common.clientConfig, true);
+ options.parse(0, 0, common.clientConfig, true);
maxIOThreads = (options.maxIOThreads != -1) ?
options.maxIOThreads : 1;
}
diff --git a/qpid/cpp/src/qpid/client/LoadPlugins.cpp b/qpid/cpp/src/qpid/client/LoadPlugins.cpp
index 246eb60c67..d76e1d458e 100644
--- a/qpid/cpp/src/qpid/client/LoadPlugins.cpp
+++ b/qpid/cpp/src/qpid/client/LoadPlugins.cpp
@@ -39,10 +39,12 @@ namespace {
struct LoadtimeInitialise {
LoadtimeInitialise() {
+ CommonOptions common("", "", QPIDC_CONF_FILE);
qpid::ModuleOptions moduleOptions(QPIDC_MODULE_DIR);
string defaultPath (moduleOptions.loadDir);
- moduleOptions.parse (0, 0, QPIDC_CONF_FILE, true);
-
+ common.parse(0, 0, common.clientConfig, true);
+ moduleOptions.parse (0, 0, common.clientConfig, true);
+
for (vector<string>::iterator iter = moduleOptions.load.begin();
iter != moduleOptions.load.end();
iter++)
diff --git a/qpid/cpp/src/qpid/client/SslConnector.cpp b/qpid/cpp/src/qpid/client/SslConnector.cpp
index 6b6bf884ec..ab0c5c4957 100644
--- a/qpid/cpp/src/qpid/client/SslConnector.cpp
+++ b/qpid/cpp/src/qpid/client/SslConnector.cpp
@@ -148,8 +148,10 @@ namespace {
struct StaticInit {
StaticInit() {
try {
+ CommonOptions common("", "", QPIDC_CONF_FILE);
SslOptions options;
- options.parse (0, 0, QPIDC_CONF_FILE, true);
+ common.parse(0, 0, common.clientConfig, true);
+ options.parse (0, 0, common.clientConfig, true);
if (options.certDbPath.empty()) {
QPID_LOG(info, "SSL connector not enabled, you must set QPID_SSL_CERT_DB to enable it.");
} else {
diff --git a/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp b/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp
index 5924e30dd8..a8f4fb5237 100644
--- a/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp
+++ b/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp
@@ -32,6 +32,7 @@
#include "qpid/framing/ExchangeBoundResult.h"
#include "qpid/framing/ExchangeQueryResult.h"
#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/framing/QueueQueryResult.h"
#include "qpid/framing/ReplyTo.h"
#include "qpid/framing/reply_exceptions.h"
diff --git a/qpid/cpp/src/qpid/cluster/Cluster.cpp b/qpid/cpp/src/qpid/cluster/Cluster.cpp
index 3c1d23c842..34aaf3d341 100644
--- a/qpid/cpp/src/qpid/cluster/Cluster.cpp
+++ b/qpid/cpp/src/qpid/cluster/Cluster.cpp
@@ -131,6 +131,7 @@
#include "qpid/cluster/UpdateExchange.h"
#include "qpid/cluster/ClusterTimer.h"
#include "qpid/cluster/CredentialsExchange.h"
+#include "qpid/cluster/UpdateClient.h"
#include "qpid/assert.h"
#include "qmf/org/apache/qpid/cluster/ArgsClusterStopClusterNode.h"
@@ -202,7 +203,7 @@ namespace arg=client::arg;
* Currently use SVN revision to avoid clashes with versions from
* different branches.
*/
-const uint32_t Cluster::CLUSTER_VERSION = 1207877;
+const uint32_t Cluster::CLUSTER_VERSION = 1332342;
struct ClusterDispatcher : public framing::AMQP_AllOperations::ClusterHandler {
qpid::cluster::Cluster& cluster;
@@ -269,7 +270,6 @@ Cluster::Cluster(const ClusterSettings& set, broker::Broker& b) :
"Error delivering frames",
poller),
failoverExchange(new FailoverExchange(broker.GetVhostObject(), &broker)),
- updateDataExchange(new UpdateDataExchange(*this)),
credentialsExchange(new CredentialsExchange(*this)),
quorum(boost::bind(&Cluster::leave, this)),
decoder(boost::bind(&Cluster::deliverFrame, this, _1)),
@@ -295,15 +295,6 @@ Cluster::Cluster(const ClusterSettings& set, broker::Broker& b) :
// Failover exchange provides membership updates to clients.
broker.getExchanges().registerExchange(failoverExchange);
- // Update exchange is used during updates to replicate messages
- // without modifying delivery-properties.exchange.
- broker.getExchanges().registerExchange(
- boost::shared_ptr<broker::Exchange>(new UpdateExchange(this)));
-
- // Update-data exchange is used for passing data that may be too large
- // for single control frame.
- broker.getExchanges().registerExchange(updateDataExchange);
-
// CredentialsExchange is used to authenticate new cluster members
broker.getExchanges().registerExchange(credentialsExchange);
@@ -680,6 +671,17 @@ void Cluster::initMapCompleted(Lock& l) {
authenticate();
broker.setRecovery(false); // Ditch my current store.
broker.setClusterUpdatee(true);
+
+ // Update exchange is used during updates to replicate messages
+ // without modifying delivery-properties.exchange.
+ broker.getExchanges().registerExchange(
+ boost::shared_ptr<broker::Exchange>(new UpdateExchange(this)));
+
+ // Update-data exchange is used during update for passing data that
+ // may be too large for single control frame.
+ updateDataExchange.reset(new UpdateDataExchange(*this));
+ broker.getExchanges().registerExchange(updateDataExchange);
+
if (mAgent) mAgent->suppress(true); // Suppress mgmt output during update.
state = JOINER;
mcast.mcastControl(ClusterUpdateRequestBody(ProtocolVersion(), myUrl.str()), self);
@@ -999,6 +1001,10 @@ void Cluster::checkUpdateIn(Lock& l) {
boost::ref(broker.getExchanges())));
enableClusterSafe(); // Enable cluster-safe assertions
deliverEventQueue.start();
+ // FIXME aconway 2012-04-04: unregister/delete Update[Data]Exchange
+ updateDataExchange.reset();
+ broker.getExchanges().destroy(UpdateDataExchange::EXCHANGE_NAME);
+ broker.getExchanges().destroy(UpdateClient::UPDATE);
}
else if (updateRetracted) { // Update was retracted, request another update
updateRetracted = false;
diff --git a/qpid/cpp/src/qpid/cluster/ClusterMap.cpp b/qpid/cpp/src/qpid/cluster/ClusterMap.cpp
index 12730d20ec..d9817db35f 100644
--- a/qpid/cpp/src/qpid/cluster/ClusterMap.cpp
+++ b/qpid/cpp/src/qpid/cluster/ClusterMap.cpp
@@ -21,6 +21,7 @@
#include "qpid/cluster/ClusterMap.h"
#include "qpid/Url.h"
#include "qpid/framing/FieldTable.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Statement.h"
#include <boost/bind.hpp>
#include <algorithm>
diff --git a/qpid/cpp/src/qpid/cluster/Connection.cpp b/qpid/cpp/src/qpid/cluster/Connection.cpp
index ce4c618885..63001a3cb9 100644
--- a/qpid/cpp/src/qpid/cluster/Connection.cpp
+++ b/qpid/cpp/src/qpid/cluster/Connection.cpp
@@ -47,6 +47,7 @@
#include "qpid/framing/ClusterConnectionAnnounceBody.h"
#include "qpid/framing/ConnectionCloseBody.h"
#include "qpid/framing/ConnectionCloseOkBody.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/log/Statement.h"
#include "qpid/sys/ClusterSafe.h"
#include "qpid/types/Variant.h"
@@ -798,6 +799,54 @@ void Connection::config(const std::string& encoded) {
else throw Exception(QPID_MSG("Update failed, invalid kind of config: " << kind));
}
+namespace {
+ // find a Link that matches the given Address
+ class LinkFinder {
+ qpid::Address id;
+ boost::shared_ptr<broker::Link> link;
+ public:
+ LinkFinder(const qpid::Address& _id) : id(_id) {}
+ boost::shared_ptr<broker::Link> getLink() { return link; }
+ void operator() (boost::shared_ptr<broker::Link> l)
+ {
+ if (!link) {
+ qpid::Address addr(l->getTransport(), l->getHost(), l->getPort());
+ if (id == addr) {
+ link = l;
+ }
+ }
+ }
+ };
+}
+
+void Connection::internalState(const std::string& type,
+ const std::string& name,
+ const framing::FieldTable& state)
+{
+ if (type == "link") {
+ // name is the string representation of the Link's _configured_ destination address
+ Url dest;
+ try {
+ dest = name;
+ } catch(...) {
+ throw Exception(QPID_MSG("Update failed, invalid format for Link destination address: " << name));
+ }
+ assert(dest.size());
+ LinkFinder finder(dest[0]);
+ cluster.getBroker().getLinks().eachLink(boost::ref(finder));
+ if (finder.getLink()) {
+ try {
+ finder.getLink()->setState(state);
+ } catch(...) {
+ throw Exception(QPID_MSG("Update failed, invalid state for Link " << name << ", state: " << state));
+ }
+ QPID_LOG(debug, cluster << " updated link " << dest[0] << " with state: " << state);
+ } else throw Exception(QPID_MSG("Update failed, unable to find Link named: " << name));
+ }
+ else throw Exception(QPID_MSG("Update failed, invalid object type for internal state replication: " << type));
+}
+
+
void Connection::doCatchupIoCallbacks() {
// We need to process IO callbacks during the catch-up phase in
// order to service asynchronous completions for messages
diff --git a/qpid/cpp/src/qpid/cluster/Connection.h b/qpid/cpp/src/qpid/cluster/Connection.h
index 920c4937db..26514c76e2 100644
--- a/qpid/cpp/src/qpid/cluster/Connection.h
+++ b/qpid/cpp/src/qpid/cluster/Connection.h
@@ -200,6 +200,8 @@ class Connection :
const std::string& instance);
void config(const std::string& encoded);
+ void internalState(const std::string& type, const std::string& name,
+ const framing::FieldTable& state);
void setSecureConnection ( broker::SecureConnection * sc );
diff --git a/qpid/cpp/src/qpid/cluster/UpdateClient.cpp b/qpid/cpp/src/qpid/cluster/UpdateClient.cpp
index 95c64ff060..20684fd8a7 100644
--- a/qpid/cpp/src/qpid/cluster/UpdateClient.cpp
+++ b/qpid/cpp/src/qpid/cluster/UpdateClient.cpp
@@ -57,6 +57,7 @@
#include "qpid/framing/ClusterConnectionShadowReadyBody.h"
#include "qpid/framing/ClusterConnectionSessionStateBody.h"
#include "qpid/framing/ClusterConnectionConsumerStateBody.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/framing/enum.h"
#include "qpid/framing/ProtocolVersion.h"
#include "qpid/framing/TypeCode.h"
@@ -687,7 +688,15 @@ void UpdateClient::updateLinks() {
void UpdateClient::updateLink(const boost::shared_ptr<broker::Link>& link) {
QPID_LOG(debug, *this << " updating link "
<< link->getHost() << ":" << link->getPort());
- ClusterConnectionProxy(session).config(encode(*link));
+ ClusterConnectionProxy(session).config(encode(*link)); // push the configuration
+ // now push the current state
+ framing::FieldTable state;
+ link->getState(state);
+ std::ostringstream os;
+ os << qpid::Address(link->getTransport(), link->getHost(), link->getPort());
+ ClusterConnectionProxy(session).internalState(std::string("link"),
+ os.str(),
+ state);
}
void UpdateClient::updateBridge(const boost::shared_ptr<broker::Bridge>& bridge) {
diff --git a/qpid/cpp/src/qpid/framing/FieldTable.cpp b/qpid/cpp/src/qpid/framing/FieldTable.cpp
index 6534bec7bc..0f7140b627 100644
--- a/qpid/cpp/src/qpid/framing/FieldTable.cpp
+++ b/qpid/cpp/src/qpid/framing/FieldTable.cpp
@@ -69,7 +69,28 @@ FieldTable::FieldTable(const FieldTable& ft)
newBytes = true;
return;
}
- if (!ft.values.empty()) values = ft.values;
+ // In practice Encoding the source field table and only copying
+ // the encoded bytes is faster than copying the whole value map.
+ // (Because we nearly always copy a field table internally before
+ // encoding it to send, but don't change it after the copy)
+ if (!ft.values.empty()) {
+ // Side effect of getting encoded size will cache it in ft.cachedSize
+ ft.cachedBytes = boost::shared_array<uint8_t>(new uint8_t[ft.encodedSize()]);
+
+ Buffer buffer((char*)&ft.cachedBytes[0], ft.cachedSize);
+
+ // Cut and paste ahead...
+ buffer.putLong(ft.encodedSize() - 4);
+ buffer.putLong(ft.values.size());
+ for (ValueMap::const_iterator i = ft.values.begin(); i!=ft.values.end(); ++i) {
+ buffer.putShortString(i->first);
+ i->second->encode(buffer);
+ }
+
+ cachedBytes = ft.cachedBytes;
+ cachedSize = ft.cachedSize;
+ newBytes = true;
+ }
}
FieldTable& FieldTable::operator=(const FieldTable& ft)
@@ -254,24 +275,18 @@ bool FieldTable::getDouble(const std::string& name, double& value) const {
//}
void FieldTable::encode(Buffer& buffer) const {
- ScopedLock<Mutex> l(lock);
// If we've still got the input field table
// we can just copy it directly to the output
if (cachedBytes) {
+ ScopedLock<Mutex> l(lock);
buffer.putRawData(&cachedBytes[0], cachedSize);
} else {
- uint32_t p = buffer.getPosition();
buffer.putLong(encodedSize() - 4);
buffer.putLong(values.size());
for (ValueMap::const_iterator i = values.begin(); i!=values.end(); ++i) {
buffer.putShortString(i->first);
i->second->encode(buffer);
}
- // Now create raw bytes in case we are used again
- cachedSize = buffer.getPosition() - p;
- cachedBytes = boost::shared_array<uint8_t>(new uint8_t[cachedSize]);
- buffer.setPosition(p);
- buffer.getRawData(&cachedBytes[0], cachedSize);
}
}
diff --git a/qpid/cpp/src/qpid/framing/FrameSet.cpp b/qpid/cpp/src/qpid/framing/FrameSet.cpp
index d2612e484f..9aee7b98b9 100644
--- a/qpid/cpp/src/qpid/framing/FrameSet.cpp
+++ b/qpid/cpp/src/qpid/framing/FrameSet.cpp
@@ -102,3 +102,7 @@ std::string FrameSet::getContent() const {
getContent(out);
return out;
}
+
+bool FrameSet::hasContent() const {
+ return parts.size() >= 3;
+}
diff --git a/qpid/cpp/src/qpid/framing/FrameSet.h b/qpid/cpp/src/qpid/framing/FrameSet.h
index cae75e5ec8..3b9f60950b 100644
--- a/qpid/cpp/src/qpid/framing/FrameSet.h
+++ b/qpid/cpp/src/qpid/framing/FrameSet.h
@@ -54,6 +54,7 @@ public:
QPID_COMMON_EXTERN void getContent(std::string&) const;
QPID_COMMON_EXTERN std::string getContent() const;
+ QPID_COMMON_EXTERN bool hasContent() const;
bool isContentBearing() const;
diff --git a/qpid/cpp/src/qpid/ha/Backup.cpp b/qpid/cpp/src/qpid/ha/Backup.cpp
index 8cd82a85f6..42cb2dbbce 100644
--- a/qpid/cpp/src/qpid/ha/Backup.cpp
+++ b/qpid/cpp/src/qpid/ha/Backup.cpp
@@ -19,10 +19,11 @@
*
*/
#include "Backup.h"
-#include "Settings.h"
#include "BrokerReplicator.h"
-#include "ReplicatingSubscription.h"
#include "ConnectionExcluder.h"
+#include "HaBroker.h"
+#include "ReplicatingSubscription.h"
+#include "Settings.h"
#include "qpid/Url.h"
#include "qpid/amqp_0_10/Codecs.h"
#include "qpid/broker/Bridge.h"
@@ -43,16 +44,18 @@ using namespace broker;
using types::Variant;
using std::string;
-Backup::Backup(broker::Broker& b, const Settings& s) :
- broker(b), settings(s), excluder(new ConnectionExcluder())
+Backup::Backup(HaBroker& hb, const Settings& s) :
+ haBroker(hb), broker(hb.getBroker()), settings(s), excluder(new ConnectionExcluder())
{
+ // Exclude client connections before starting the link to avoid self-connection.
+ broker.getConnectionObservers().add(excluder);
// Empty brokerUrl means delay initialization until setUrl() is called.
if (!s.brokerUrl.empty()) initialize(Url(s.brokerUrl));
}
void Backup::initialize(const Url& url) {
- assert(!url.empty());
- QPID_LOG(notice, "HA: Backup started: " << url);
+ if (url.empty()) throw Url::Invalid("HA broker URL is empty");
+ QPID_LOG(notice, "HA: Backup initialized: " << url);
string protocol = url[0].protocol.empty() ? "tcp" : url[0].protocol;
framing::Uuid uuid(true);
// Declare the link
@@ -61,21 +64,26 @@ void Backup::initialize(const Url& url) {
url[0].host, url[0].port, protocol,
false, // durable
settings.mechanism, settings.username, settings.password);
- assert(result.second); // FIXME aconway 2011-11-23: error handling
link = result.first;
link->setUrl(url);
-
- replicator.reset(new BrokerReplicator(link));
+ replicator.reset(new BrokerReplicator(haBroker, link));
broker.getExchanges().registerExchange(replicator);
- broker.getConnectionObservers().add(excluder);
}
+Backup::~Backup() {
+ if (link) link->close();
+ if (replicator.get()) broker.getExchanges().destroy(replicator->getName());
+ replicator.reset();
+ broker.getConnectionObservers().remove(excluder); // This allows client connections.
+}
+
+
void Backup::setBrokerUrl(const Url& url) {
// Ignore empty URLs seen during start-up for some tests.
if (url.empty()) return;
sys::Mutex::ScopedLock l(lock);
if (link) { // URL changed after we initialized.
- QPID_LOG(info, "HA: Backup failover URL set to " << url);
+ QPID_LOG(info, "HA: Backup broker URL set to " << url);
link->setUrl(url);
}
else {
@@ -83,10 +91,4 @@ void Backup::setBrokerUrl(const Url& url) {
}
}
-Backup::~Backup() {
- if (link) link->close();
- if (replicator.get()) broker.getExchanges().destroy(replicator->getName());
- broker.getConnectionObservers().remove(excluder); // This allows client connections.
-}
-
}} // namespace qpid::ha
diff --git a/qpid/cpp/src/qpid/ha/Backup.h b/qpid/cpp/src/qpid/ha/Backup.h
index 526b238b82..6c36996914 100644
--- a/qpid/cpp/src/qpid/ha/Backup.h
+++ b/qpid/cpp/src/qpid/ha/Backup.h
@@ -38,6 +38,7 @@ namespace ha {
class Settings;
class ConnectionExcluder;
class BrokerReplicator;
+class HaBroker;
/**
* State associated with a backup broker. Manages connections to primary.
@@ -47,7 +48,7 @@ class BrokerReplicator;
class Backup
{
public:
- Backup(broker::Broker&, const Settings&);
+ Backup(HaBroker&, const Settings&);
~Backup();
void setBrokerUrl(const Url&);
@@ -55,6 +56,7 @@ class Backup
void initialize(const Url&);
sys::Mutex lock;
+ HaBroker& haBroker;
broker::Broker& broker;
Settings settings;
boost::shared_ptr<broker::Link> link;
diff --git a/qpid/cpp/src/qpid/ha/BrokerReplicator.cpp b/qpid/cpp/src/qpid/ha/BrokerReplicator.cpp
index 039ec8c623..690337831c 100644
--- a/qpid/cpp/src/qpid/ha/BrokerReplicator.cpp
+++ b/qpid/cpp/src/qpid/ha/BrokerReplicator.cpp
@@ -19,6 +19,7 @@
*
*/
#include "BrokerReplicator.h"
+#include "HaBroker.h"
#include "QueueReplicator.h"
#include "qpid/broker/Broker.h"
#include "qpid/broker/Queue.h"
@@ -37,6 +38,7 @@
#include "qmf/org/apache/qpid/broker/EventQueueDelete.h"
#include "qmf/org/apache/qpid/broker/EventSubscribe.h"
#include <algorithm>
+#include <sstream>
namespace qpid {
namespace ha {
@@ -87,6 +89,7 @@ const string QUEUE("queue");
const string RHOST("rhost");
const string TYPE("type");
const string USER("user");
+const string HA_BROKER("habroker");
const string AGENT_IND_EVENT_ORG_APACHE_QPID_BROKER("agent.ind.event.org_apache_qpid_broker.#");
const string QMF2("qmf2");
@@ -100,6 +103,7 @@ const string _PACKAGE_NAME("_package_name");
const string _SCHEMA_ID("_schema_id");
const string OBJECT("OBJECT");
const string ORG_APACHE_QPID_BROKER("org.apache.qpid.broker");
+const string ORG_APACHE_QPID_HA("org.apache.qpid.ha");
const string QMF_DEFAULT_DIRECT("qmf.default.direct");
const string _QUERY_REQUEST("_query_request");
const string BROKER("broker");
@@ -113,36 +117,13 @@ template <class T> bool match(Variant::Map& schema) {
return T::match(schema[CLASS_NAME], schema[PACKAGE_NAME]);
}
-enum ReplicateLevel { RL_NONE=0, RL_CONFIGURATION, RL_ALL };
-const string S_NONE="none";
-const string S_CONFIGURATION="configuration";
-const string S_ALL="all";
-
-ReplicateLevel replicateLevel(const string& level) {
- if (level == S_NONE) return RL_NONE;
- if (level == S_CONFIGURATION) return RL_CONFIGURATION;
- if (level == S_ALL) return RL_ALL;
- throw Exception("Invalid value for "+QPID_REPLICATE+": "+level);
-}
-
-ReplicateLevel replicateLevel(const framing::FieldTable& f) {
- if (f.isSet(QPID_REPLICATE)) return replicateLevel(f.getAsString(QPID_REPLICATE));
- else return RL_NONE;
-}
-
-ReplicateLevel replicateLevel(const Variant::Map& m) {
- Variant::Map::const_iterator i = m.find(QPID_REPLICATE);
- if (i != m.end()) return replicateLevel(i->second.asString());
- else return RL_NONE;
-}
-
-void sendQuery(const string className, const string& queueName, SessionHandler& sessionHandler) {
+void sendQuery(const string& packageName, const string& className, const string& queueName, SessionHandler& sessionHandler) {
framing::AMQP_ServerProxy peer(sessionHandler.out);
Variant::Map request;
request[_WHAT] = OBJECT;
Variant::Map schema;
schema[_CLASS_NAME] = className;
- schema[_PACKAGE_NAME] = ORG_APACHE_QPID_BROKER;
+ schema[_PACKAGE_NAME] = packageName;
request[_SCHEMA_ID] = schema;
AMQFrame method((MessageTransferBody(ProtocolVersion(), QMF_DEFAULT_DIRECT, 0, 0)));
@@ -181,13 +162,34 @@ Variant::Map asMapVoid(const Variant& value) {
} // namespace
+
+ReplicateLevel BrokerReplicator::replicateLevel(const std::string& str) {
+ ReplicateLevel rl;
+ if (qpid::ha::replicateLevel(str, rl)) return rl;
+ else return haBroker.getSettings().replicateDefault;
+}
+
+ReplicateLevel BrokerReplicator::replicateLevel(const framing::FieldTable& f) {
+ if (f.isSet(QPID_REPLICATE))
+ return replicateLevel(f.getAsString(QPID_REPLICATE));
+ else
+ return haBroker.getSettings().replicateDefault;
+}
+
+ReplicateLevel BrokerReplicator::replicateLevel(const Variant::Map& m) {
+ Variant::Map::const_iterator i = m.find(QPID_REPLICATE);
+ if (i != m.end())
+ return replicateLevel(i->second.asString());
+ else
+ return haBroker.getSettings().replicateDefault;
+}
+
BrokerReplicator::~BrokerReplicator() {}
-BrokerReplicator::BrokerReplicator(const boost::shared_ptr<Link>& l)
- : Exchange(QPID_CONFIGURATION_REPLICATOR), broker(*l->getBroker()), link(l)
+BrokerReplicator::BrokerReplicator(HaBroker& hb, const boost::shared_ptr<Link>& l)
+ : Exchange(QPID_CONFIGURATION_REPLICATOR),
+ haBroker(hb), broker(hb.getBroker()), link(l)
{
- QPID_LOG(info, "HA: Backup replicating from " <<
- link->getTransport() << ":" << link->getHost() << ":" << link->getPort());
framing::Uuid uuid(true);
const std::string name(QPID_CONFIGURATION_REPLICATOR + ".bridge." + uuid.str());
broker.getLinks().declare(
@@ -214,21 +216,24 @@ void BrokerReplicator::initializeBridge(Bridge& bridge, SessionHandler& sessionH
const qmf::org::apache::qpid::broker::ArgsLinkBridge& args(bridge.getArgs());
//declare and bind an event queue
- peer.getQueue().declare(queueName, "", false, false, true, true, FieldTable());
+ FieldTable declareArgs;
+ declareArgs.setString(QPID_REPLICATE, str(RL_NONE));
+ peer.getQueue().declare(queueName, "", false, false, true, true, declareArgs);
peer.getExchange().bind(queueName, QMF_DEFAULT_TOPIC, AGENT_IND_EVENT_ORG_APACHE_QPID_BROKER, FieldTable());
//subscribe to the queue
peer.getMessage().subscribe(queueName, args.i_dest, 1, 0, false, "", 0, FieldTable());
peer.getMessage().flow(args.i_dest, 0, 0xFFFFFFFF);
peer.getMessage().flow(args.i_dest, 1, 0xFFFFFFFF);
- //issue a query request for queues and another for exchanges using event queue as the reply-to address
- sendQuery(QUEUE, queueName, sessionHandler);
- sendQuery(EXCHANGE, queueName, sessionHandler);
- sendQuery(BINDING, queueName, sessionHandler);
- QPID_LOG(debug, "HA: Backup activated configuration bridge: " << queueName);
+ // Issue a query request for queues, exchanges, bindings and the habroker
+ // using event queue as the reply-to address
+ sendQuery(ORG_APACHE_QPID_HA, HA_BROKER, queueName, sessionHandler);
+ sendQuery(ORG_APACHE_QPID_BROKER, QUEUE, queueName, sessionHandler);
+ sendQuery(ORG_APACHE_QPID_BROKER, EXCHANGE, queueName, sessionHandler);
+ sendQuery(ORG_APACHE_QPID_BROKER, BINDING, queueName, sessionHandler);
+ QPID_LOG(debug, "HA: Backup configuration bridge: " << queueName);
}
-// FIXME aconway 2011-12-02: error handling in route.
void BrokerReplicator::route(Deliverable& msg) {
const framing::FieldTable* headers = msg.getMessage().getApplicationHeaders();
Variant::List list;
@@ -242,6 +247,7 @@ void BrokerReplicator::route(Deliverable& msg) {
if (headers->getAsString(QMF_CONTENT) == EVENT) {
for (Variant::List::iterator i = list.begin(); i != list.end(); ++i) {
Variant::Map& map = i->asMap();
+ QPID_LOG(trace, "HA: Backup received event: " << map);
Variant::Map& schema = map[SCHEMA_ID].asMap();
Variant::Map& values = map[VALUES].asMap();
if (match<EventQueueDeclare>(schema)) doEventQueueDeclare(values);
@@ -253,24 +259,26 @@ void BrokerReplicator::route(Deliverable& msg) {
}
} else if (headers->getAsString(QMF_OPCODE) == QUERY_RESPONSE) {
for (Variant::List::iterator i = list.begin(); i != list.end(); ++i) {
- string type = i->asMap()[SCHEMA_ID].asMap()[CLASS_NAME];
- Variant::Map& values = i->asMap()[VALUES].asMap();
+ Variant::Map& map = i->asMap();
+ QPID_LOG(trace, "HA: Backup received event: " << map);
+ string type = map[SCHEMA_ID].asMap()[CLASS_NAME];
+ Variant::Map& values = map[VALUES].asMap();
framing::FieldTable args;
amqp_0_10::translate(asMapVoid(values[ARGUMENTS]), args);
if (type == QUEUE) doResponseQueue(values);
else if (type == EXCHANGE) doResponseExchange(values);
else if (type == BINDING) doResponseBind(values);
- else QPID_LOG(error, "HA: Backup received unknown response type=" << type
- << " values=" << values);
+ else if (type == HA_BROKER) doResponseHaBroker(values);
}
- } else QPID_LOG(error, "HA: Backup received unexpected message: " << *headers);
+ }
} catch (const std::exception& e) {
- QPID_LOG(error, "HA: Backup replication error: " << e.what() << ": while handling: " << list);
+ QPID_LOG(critical, "HA: Backup configuration failed: " << e.what()
+ << ": while handling: " << list);
+ throw;
}
}
void BrokerReplicator::doEventQueueDeclare(Variant::Map& values) {
- QPID_LOG(debug, "HA: Backup queue declare event " << values);
string name = values[QNAME].asString();
Variant::Map argsMap = asMapVoid(values[ARGS]);
if (values[DISP] == CREATED && replicateLevel(argsMap)) {
@@ -287,27 +295,27 @@ void BrokerReplicator::doEventQueueDeclare(Variant::Map& values) {
values[USER].asString(),
values[RHOST].asString());
if (result.second) {
- // FIXME aconway 2011-11-22: should delete old queue and
- // re-create from event.
- // Events are always up to date, whereas responses may be
- // out of date.
- QPID_LOG(debug, "HA: Backup created queue: " << name);
+ QPID_LOG(debug, "HA: Backup queue declare event: " << name);
startQueueReplicator(result.first);
} else {
// FIXME aconway 2011-12-02: what's the right way to handle this?
- QPID_LOG(warning, "HA: Backup queue already exists: " << name);
+ // Should we delete the old & re-create form the event? Responses
+ // may be old but events are always up-to-date.
+ QPID_LOG(warning, "HA: Backup queue declare event, already exists: " << name);
}
}
}
void BrokerReplicator::doEventQueueDelete(Variant::Map& values) {
- QPID_LOG(debug, "HA: Backup queue delete event " << values);
// The remote queue has already been deleted so replicator
// sessions may be closed by a "queue deleted" exception.
string name = values[QNAME].asString();
boost::shared_ptr<Queue> queue = broker.getQueues().find(name);
- if (queue && replicateLevel(queue->getSettings())) {
- QPID_LOG(debug, "HA: Backup deleting queue: " << name);
+ if (!queue) {
+ QPID_LOG(warning, "HA: Backup queue delete event, does not exist: " << name);
+ } else if (!replicateLevel(queue->getSettings())) {
+ QPID_LOG(warning, "HA: Backup queue delete event, not replicated: " << name);
+ } else {
string rname = QueueReplicator::replicatorName(name);
boost::shared_ptr<broker::Exchange> ex = broker.getExchanges().find(rname);
boost::shared_ptr<QueueReplicator> qr = boost::dynamic_pointer_cast<QueueReplicator>(ex);
@@ -316,11 +324,11 @@ void BrokerReplicator::doEventQueueDelete(Variant::Map& values) {
// actually be destroyed, deleting the exhange
broker.getExchanges().destroy(rname);
broker.deleteQueue(name, values[USER].asString(), values[RHOST].asString());
+ QPID_LOG(debug, "HA: Backup queue delete event: " << name);
}
}
void BrokerReplicator::doEventExchangeDeclare(Variant::Map& values) {
- QPID_LOG(debug, "HA: Backup exchange declare event " << values);
Variant::Map argsMap(asMapVoid(values[ARGS]));
if (values[DISP] == CREATED && replicateLevel(argsMap)) {
string name = values[EXNAME].asString();
@@ -335,32 +343,32 @@ void BrokerReplicator::doEventExchangeDeclare(Variant::Map& values) {
values[USER].asString(),
values[RHOST].asString()).second)
{
- QPID_LOG(debug, "HA: Backup created exchange: " << name);
+ QPID_LOG(debug, "HA: Backup exchange declare event: " << name);
} else {
- // FIXME aconway 2011-11-22: should delete pre-exisitng exchange
+ // FIXME aconway 2011-11-22: should delete pre-existing exchange
// and re-create from event. See comment in doEventQueueDeclare.
- QPID_LOG(warning, "HA: Backup exchange already exists: " << name);
+ QPID_LOG(debug, "HA: Backup exchange declare event, already exists: " << name);
}
}
}
void BrokerReplicator::doEventExchangeDelete(Variant::Map& values) {
- QPID_LOG(debug, "HA: Backup exchange delete event " << values);
string name = values[EXNAME].asString();
- try {
- boost::shared_ptr<Exchange> exchange = broker.getExchanges().find(name);
- if (exchange && replicateLevel(exchange->getArgs())) {
- QPID_LOG(debug, "HA: Backup deleting exchange:" << name);
- broker.deleteExchange(
- name,
- values[USER].asString(),
- values[RHOST].asString());
- }
- } catch (const framing::NotFoundException&) {}
+ boost::shared_ptr<Exchange> exchange = broker.getExchanges().find(name);
+ if (!exchange) {
+ QPID_LOG(warning, "HA: Backup exchange delete event, does not exist: " << name);
+ } else if (!replicateLevel(exchange->getArgs())) {
+ QPID_LOG(warning, "HA: Backup exchange delete event, not replicated: " << name);
+ } else {
+ QPID_LOG(debug, "HA: Backup exchange delete event:" << name);
+ broker.deleteExchange(
+ name,
+ values[USER].asString(),
+ values[RHOST].asString());
+ }
}
void BrokerReplicator::doEventBind(Variant::Map& values) {
- QPID_LOG(debug, "HA: Backup bind event " << values);
boost::shared_ptr<Exchange> exchange =
broker.getExchanges().find(values[EXNAME].asString());
boost::shared_ptr<Queue> queue =
@@ -373,15 +381,14 @@ void BrokerReplicator::doEventBind(Variant::Map& values) {
framing::FieldTable args;
amqp_0_10::translate(asMapVoid(values[ARGS]), args);
string key = values[KEY].asString();
- QPID_LOG(debug, "HA: Backup replicated binding exchange=" << exchange->getName()
+ exchange->bind(queue, key, &args);
+ QPID_LOG(debug, "HA: Backup bind event: exchange=" << exchange->getName()
<< " queue=" << queue->getName()
<< " key=" << key);
- exchange->bind(queue, key, &args);
}
}
void BrokerReplicator::doEventUnbind(Variant::Map& values) {
- QPID_LOG(debug, "HA: Backup unbind event " << values);
boost::shared_ptr<Exchange> exchange =
broker.getExchanges().find(values[EXNAME].asString());
boost::shared_ptr<Queue> queue =
@@ -394,16 +401,14 @@ void BrokerReplicator::doEventUnbind(Variant::Map& values) {
framing::FieldTable args;
amqp_0_10::translate(asMapVoid(values[ARGS]), args);
string key = values[KEY].asString();
- QPID_LOG(debug, "HA: Backup replicated unbinding exchange=" << exchange->getName()
+ exchange->unbind(queue, key, &args);
+ QPID_LOG(debug, "HA: Backup unbind event: exchange=" << exchange->getName()
<< " queue=" << queue->getName()
<< " key=" << key);
- exchange->unbind(queue, key, &args);
}
}
void BrokerReplicator::doResponseQueue(Variant::Map& values) {
- QPID_LOG(debug, "HA: Backup queue response " << values);
- // FIXME aconway 2011-11-22: more flexible ways & defaults to indicate replication
Variant::Map argsMap(asMapVoid(values[ARGUMENTS]));
if (!replicateLevel(argsMap)) return;
framing::FieldTable args;
@@ -420,17 +425,16 @@ void BrokerReplicator::doResponseQueue(Variant::Map& values) {
""/*TODO: who is the user?*/,
""/*TODO: what should we use as connection id?*/);
if (result.second) {
- QPID_LOG(debug, "HA: Backup created catch-up queue: " << values[NAME]);
+ QPID_LOG(debug, "HA: Backup queue response: " << name);
startQueueReplicator(result.first);
} else {
// FIXME aconway 2011-11-22: Normal to find queue already
// exists if we're failing over.
- QPID_LOG(warning, "HA: Backup catch-up queue already exists: " << name);
+ QPID_LOG(warning, "HA: Backup queue response, already exists: " << name);
}
}
void BrokerReplicator::doResponseExchange(Variant::Map& values) {
- QPID_LOG(debug, "HA: Backup exchange response " << values);
Variant::Map argsMap(asMapVoid(values[ARGUMENTS]));
if (!replicateLevel(argsMap)) return;
framing::FieldTable args;
@@ -444,9 +448,10 @@ void BrokerReplicator::doResponseExchange(Variant::Map& values) {
""/*TODO: who is the user?*/,
""/*TODO: what should we use as connection id?*/).second)
{
- QPID_LOG(debug, "HA: Backup catch-up exchange: " << values[NAME]);
+ QPID_LOG(debug, "HA: Backup exchange response: " << values[NAME].asString());
} else {
- QPID_LOG(warning, "HA: Backup catch-up exchange already exists: " << values[QNAME]);
+ QPID_LOG(warning, "HA: Backup exchange query, already exists: " <<
+ values[QNAME].asString());
}
}
@@ -472,12 +477,10 @@ const std::string QUEUE_REF("queueRef");
} // namespace
void BrokerReplicator::doResponseBind(Variant::Map& values) {
- QPID_LOG(debug, "HA: Backup bind response " << values);
std::string exName = getRefName(EXCHANGE_REF_PREFIX, values[EXCHANGE_REF]);
std::string qName = getRefName(QUEUE_REF_PREFIX, values[QUEUE_REF]);
boost::shared_ptr<Exchange> exchange = broker.getExchanges().find(exName);
boost::shared_ptr<Queue> queue = broker.getQueues().find(qName);
- // FIXME aconway 2011-11-24: more flexible configuration for binding replication.
// Automatically replicate binding if queue and exchange exist and are replicated
if (exchange && replicateLevel(exchange->getArgs()) &&
@@ -487,16 +490,39 @@ void BrokerReplicator::doResponseBind(Variant::Map& values) {
amqp_0_10::translate(asMapVoid(values[ARGUMENTS]), args);
string key = values[KEY].asString();
exchange->bind(queue, key, &args);
- QPID_LOG(debug, "HA: Backup catch-up binding: exchange=" << exchange->getName()
+ QPID_LOG(debug, "HA: Backup bind response: exchange=" << exchange->getName()
<< " queue=" << queue->getName()
<< " key=" << key);
}
}
+namespace {
+const string REPLICATE_DEFAULT="replicateDefault";
+}
+
+// Received the ha-broker configuration object for the primary broker.
+void BrokerReplicator::doResponseHaBroker(Variant::Map& values) {
+ try {
+ ReplicateLevel mine = haBroker.getSettings().replicateDefault;
+ ReplicateLevel primary = replicateLevel(values[REPLICATE_DEFAULT].asString());
+ if (mine != primary) {
+ std::ostringstream os;
+ os << "Replicate default on backup (" << mine
+ << ") does not match primary (" << primary << ")";
+ haBroker.shutdown(os.str());
+ }
+ } catch (const std::exception& e) {
+ std::ostringstream os;
+ os << "Received invalid replicate default from primary: " << e.what();
+ haBroker.shutdown(os.str());
+ }
+}
+
void BrokerReplicator::startQueueReplicator(const boost::shared_ptr<Queue>& queue) {
if (replicateLevel(queue->getSettings()) == RL_ALL) {
boost::shared_ptr<QueueReplicator> qr(new QueueReplicator(queue, link));
- broker.getExchanges().registerExchange(qr);
+ if (!broker.getExchanges().registerExchange(qr))
+ throw Exception(QPID_MSG("Duplicate queue replicator " << qr->getName()));
qr->activate();
}
}
diff --git a/qpid/cpp/src/qpid/ha/BrokerReplicator.h b/qpid/cpp/src/qpid/ha/BrokerReplicator.h
index 483c251126..c9d7b9f74c 100644
--- a/qpid/cpp/src/qpid/ha/BrokerReplicator.h
+++ b/qpid/cpp/src/qpid/ha/BrokerReplicator.h
@@ -22,6 +22,7 @@
*
*/
+#include "ReplicateLevel.h"
#include "qpid/broker/Exchange.h"
#include "qpid/types/Variant.h"
#include <boost/shared_ptr.hpp>
@@ -35,7 +36,12 @@ class Bridge;
class SessionHandler;
}
+namespace framing {
+class FieldTable;
+}
+
namespace ha {
+class HaBroker;
/**
* Replicate configuration on a backup broker.
@@ -51,7 +57,7 @@ namespace ha {
class BrokerReplicator : public broker::Exchange
{
public:
- BrokerReplicator(const boost::shared_ptr<broker::Link>&);
+ BrokerReplicator(HaBroker&, const boost::shared_ptr<broker::Link>&);
~BrokerReplicator();
std::string getType() const;
@@ -64,6 +70,10 @@ class BrokerReplicator : public broker::Exchange
private:
void initializeBridge(broker::Bridge&, broker::SessionHandler&);
+ ReplicateLevel replicateLevel(const std::string&);
+ ReplicateLevel replicateLevel(const framing::FieldTable& args);
+ ReplicateLevel replicateLevel(const types::Variant::Map& args);
+
void doEventQueueDeclare(types::Variant::Map& values);
void doEventQueueDelete(types::Variant::Map& values);
void doEventExchangeDeclare(types::Variant::Map& values);
@@ -74,9 +84,11 @@ class BrokerReplicator : public broker::Exchange
void doResponseQueue(types::Variant::Map& values);
void doResponseExchange(types::Variant::Map& values);
void doResponseBind(types::Variant::Map& values);
+ void doResponseHaBroker(types::Variant::Map& values);
void startQueueReplicator(const boost::shared_ptr<broker::Queue>&);
+ HaBroker& haBroker;
broker::Broker& broker;
boost::shared_ptr<broker::Link> link;
};
diff --git a/qpid/cpp/src/qpid/ha/HaBroker.cpp b/qpid/cpp/src/qpid/ha/HaBroker.cpp
index 5c1dfec2f6..589d7ee6aa 100644
--- a/qpid/cpp/src/qpid/ha/HaBroker.cpp
+++ b/qpid/cpp/src/qpid/ha/HaBroker.cpp
@@ -27,6 +27,7 @@
#include "qpid/broker/Broker.h"
#include "qpid/broker/Link.h"
#include "qpid/broker/Queue.h"
+#include "qpid/broker/SignalHandler.h"
#include "qpid/management/ManagementAgent.h"
#include "qmf/org/apache/qpid/ha/Package.h"
#include "qmf/org/apache/qpid/ha/ArgsHaBrokerReplicate.h"
@@ -69,16 +70,18 @@ HaBroker::HaBroker(broker::Broker& b, const Settings& s)
throw Exception("Cannot start HA: management is disabled");
_qmf::Package packageInit(ma);
mgmtObject = new _qmf::HaBroker(ma, this, "ha-broker");
- // FIXME aconway 2012-03-01: should start in catch-up state and move to backup
- // only when caught up.
- mgmtObject->set_status(BACKUP);
+ mgmtObject->set_status(settings.cluster ? BACKUP : STANDALONE);
+ mgmtObject->set_replicateDefault(str(settings.replicateDefault));
ma->addObject(mgmtObject);
+
+ // NOTE: lock is not needed in a constructor but we created it just to pass
+ // to the set functions.
sys::Mutex::ScopedLock l(lock);
if (!settings.clientUrl.empty()) setClientUrl(Url(settings.clientUrl), l);
if (!settings.brokerUrl.empty()) setBrokerUrl(Url(settings.brokerUrl), l);
// If we are in a cluster, we start in backup mode.
- if (settings.cluster) backup.reset(new Backup(b, s));
+ if (settings.cluster) backup.reset(new Backup(*this, s));
}
HaBroker::~HaBroker() {}
@@ -91,7 +94,7 @@ Manageable::status_t HaBroker::ManagementMethod (uint32_t methodId, Args& args,
// NOTE: resetting backup allows client connections, so any
// primary state should be set up here before backup.reset()
backup.reset();
- QPID_LOG(notice, "HA: Primary promoted from backup");
+ QPID_LOG(notice, "HA: Promoted to primary");
mgmtObject->set_status(PRIMARY);
}
break;
@@ -126,8 +129,8 @@ Manageable::status_t HaBroker::ManagementMethod (uint32_t methodId, Args& args,
link->setUrl(url);
// Create a queue replicator
boost::shared_ptr<QueueReplicator> qr(new QueueReplicator(queue, link));
- broker.getExchanges().registerExchange(qr);
qr->activate();
+ broker.getExchanges().registerExchange(qr);
break;
}
@@ -145,7 +148,7 @@ void HaBroker::setClientUrl(const Url& url, const sys::Mutex::ScopedLock& l) {
void HaBroker::updateClientUrl(const sys::Mutex::ScopedLock&) {
Url url = clientUrl.empty() ? brokerUrl : clientUrl;
- assert(!url.empty());
+ if (url.empty()) throw Url::Invalid("HA client URL is empty");
mgmtObject->set_publicBrokers(url.str());
knownBrokers.clear();
knownBrokers.push_back(url);
@@ -153,7 +156,7 @@ void HaBroker::updateClientUrl(const sys::Mutex::ScopedLock&) {
}
void HaBroker::setBrokerUrl(const Url& url, const sys::Mutex::ScopedLock& l) {
- if (url.empty()) throw Exception("Invalid empty URL for HA broker failover");
+ if (url.empty()) throw Url::Invalid("HA broker URL is empty");
QPID_LOG(debug, "HA: Setting broker URL to: " << url);
brokerUrl = url;
mgmtObject->set_brokers(brokerUrl.str());
@@ -171,4 +174,9 @@ std::vector<Url> HaBroker::getKnownBrokers() const {
return knownBrokers;
}
+void HaBroker::shutdown(const std::string& message) {
+ QPID_LOG(critical, "Shutting down: " << message);
+ broker.shutdown();
+}
+
}} // namespace qpid::ha
diff --git a/qpid/cpp/src/qpid/ha/HaBroker.h b/qpid/cpp/src/qpid/ha/HaBroker.h
index 4f4ee4c944..99b30fd36b 100644
--- a/qpid/cpp/src/qpid/ha/HaBroker.h
+++ b/qpid/cpp/src/qpid/ha/HaBroker.h
@@ -52,6 +52,12 @@ class HaBroker : public management::Manageable
management::Manageable::status_t ManagementMethod (
uint32_t methodId, management::Args& args, std::string& text);
+ broker::Broker& getBroker() { return broker; }
+ const Settings& getSettings() const { return settings; }
+
+ // Log a critical error message and shut down the broker.
+ void shutdown(const std::string& message);
+
private:
void setClientUrl(const Url&, const sys::Mutex::ScopedLock&);
void setBrokerUrl(const Url&, const sys::Mutex::ScopedLock&);
diff --git a/qpid/cpp/src/qpid/ha/HaPlugin.cpp b/qpid/cpp/src/qpid/ha/HaPlugin.cpp
index 6a43b591b0..4da3b0d7d2 100644
--- a/qpid/cpp/src/qpid/ha/HaPlugin.cpp
+++ b/qpid/cpp/src/qpid/ha/HaPlugin.cpp
@@ -37,6 +37,9 @@ struct Options : public qpid::Options {
"URL that backup brokers use to connect and fail over.")
("ha-public-brokers", optValue(settings.clientUrl,"URL"),
"URL that clients use to connect and fail over, defaults to ha-brokers.")
+ ("ha-replicate",
+ optValue(settings.replicateDefault, "LEVEL"),
+ "Replication level for creating queues and exchanges if there is no qpid.replicate argument supplied. LEVEL is 'none', 'configuration' or 'all'")
("ha-expected-backups", optValue(settings.expectedBackups, "N"),
"Number of backups expected to be active in the HA cluster.")
("ha-username", optValue(settings.username, "USER"),
diff --git a/qpid/cpp/src/qpid/ha/QueueReplicator.cpp b/qpid/cpp/src/qpid/ha/QueueReplicator.cpp
index 0c725ebce0..c6af388d9d 100644
--- a/qpid/cpp/src/qpid/ha/QueueReplicator.cpp
+++ b/qpid/cpp/src/qpid/ha/QueueReplicator.cpp
@@ -30,6 +30,7 @@
#include "qpid/framing/SequenceSet.h"
#include "qpid/framing/FieldTable.h"
#include "qpid/log/Statement.h"
+#include "qpid/Msg.h"
#include <boost/shared_ptr.hpp>
namespace {
@@ -55,8 +56,8 @@ QueueReplicator::QueueReplicator(boost::shared_ptr<Queue> q, boost::shared_ptr<L
{
framing::Uuid uuid(true);
bridgeName = replicatorName(q->getName()) + std::string(".") + uuid.str();
- logPrefix = "HA: Backup " + queue->getName() + ": ";
- QPID_LOG(info, logPrefix << "Created, settings: " << q->getSettings());
+ logPrefix = "HA: Backup of " + queue->getName() + ": ";
+ QPID_LOG(info, logPrefix << "Created");
}
// This must be separate from the constructor so we can call shared_from_this.
@@ -78,7 +79,7 @@ void QueueReplicator::activate() {
0, // sync?
// Include shared_ptr to self to ensure we are not deleted
// before initializeBridge is called.
- boost::bind(&QueueReplicator::initializeBridge, this, _1, _2, shared_from_this())
+ boost::bind(&QueueReplicator::initializeBridge, shared_from_this(), _1, _2)
);
bridge = result.first;
}
@@ -96,9 +97,7 @@ void QueueReplicator::deactivate() {
}
// Called in a broker connection thread when the bridge is created.
-// shared_ptr to self ensures we are not deleted before initializeBridge is called.
-void QueueReplicator::initializeBridge(Bridge& bridge, SessionHandler& sessionHandler,
- boost::shared_ptr<QueueReplicator> /*self*/) {
+void QueueReplicator::initializeBridge(Bridge& bridge, SessionHandler& sessionHandler) {
sys::Mutex::ScopedLock l(lock);
framing::AMQP_ServerProxy peer(sessionHandler.out);
const qmf::org::apache::qpid::broker::ArgsLinkBridge& args(bridge.getArgs());
@@ -147,23 +146,33 @@ void QueueReplicator::dequeue(SequenceNumber n, const sys::Mutex::ScopedLock&)
// Called in connection thread of the queues bridge to primary.
void QueueReplicator::route(Deliverable& msg)
{
- const std::string& key = msg.getMessage().getRoutingKey();
- sys::Mutex::ScopedLock l(lock);
- if (key == DEQUEUE_EVENT_KEY) {
- SequenceSet dequeues = decodeContent<SequenceSet>(msg.getMessage());
- QPID_LOG(trace, logPrefix << "Dequeue: " << dequeues);
- //TODO: should be able to optimise the following
- for (SequenceSet::iterator i = dequeues.begin(); i != dequeues.end(); i++)
- dequeue(*i, l);
- } else if (key == POSITION_EVENT_KEY) {
- SequenceNumber position = decodeContent<SequenceNumber>(msg.getMessage());
- QPID_LOG(trace, logPrefix << "Position moved from " << queue->getPosition()
- << " to " << position);
- assert(queue->getPosition() <= position);
- queue->setPosition(position);
- } else {
- msg.deliverTo(queue);
- QPID_LOG(trace, logPrefix << "Enqueued message " << queue->getPosition());
+ try {
+ const std::string& key = msg.getMessage().getRoutingKey();
+ sys::Mutex::ScopedLock l(lock);
+ if (key == DEQUEUE_EVENT_KEY) {
+ SequenceSet dequeues = decodeContent<SequenceSet>(msg.getMessage());
+ QPID_LOG(trace, logPrefix << "Dequeue: " << dequeues);
+ //TODO: should be able to optimise the following
+ for (SequenceSet::iterator i = dequeues.begin(); i != dequeues.end(); i++)
+ dequeue(*i, l);
+ } else if (key == POSITION_EVENT_KEY) {
+ SequenceNumber position = decodeContent<SequenceNumber>(msg.getMessage());
+ QPID_LOG(trace, logPrefix << "Position moved from " << queue->getPosition()
+ << " to " << position);
+ if (queue->getPosition() > position) {
+ throw Exception(
+ QPID_MSG(logPrefix << "Invalid position update from "
+ << queue->getPosition() << " to " << position));
+ }
+ queue->setPosition(position);
+ } else {
+ msg.deliverTo(queue);
+ QPID_LOG(trace, logPrefix << "Enqueued message " << queue->getPosition());
+ }
+ }
+ catch (const std::exception& e) {
+ QPID_LOG(critical, logPrefix << "Replication failed: " << e.what());
+ throw;
}
}
diff --git a/qpid/cpp/src/qpid/ha/QueueReplicator.h b/qpid/cpp/src/qpid/ha/QueueReplicator.h
index 1fc43f3a45..26fb9456d1 100644
--- a/qpid/cpp/src/qpid/ha/QueueReplicator.h
+++ b/qpid/cpp/src/qpid/ha/QueueReplicator.h
@@ -70,8 +70,7 @@ class QueueReplicator : public broker::Exchange,
bool isBound(boost::shared_ptr<broker::Queue>, const std::string* const, const framing::FieldTable* const);
private:
- void initializeBridge(broker::Bridge& bridge, broker::SessionHandler& sessionHandler,
- boost::shared_ptr<QueueReplicator> self);
+ void initializeBridge(broker::Bridge& bridge, broker::SessionHandler& sessionHandler);
void dequeue(framing::SequenceNumber, const sys::Mutex::ScopedLock&);
std::string logPrefix;
diff --git a/qpid/cpp/src/qpid/ha/ReplicateLevel.cpp b/qpid/cpp/src/qpid/ha/ReplicateLevel.cpp
new file mode 100644
index 0000000000..4981577225
--- /dev/null
+++ b/qpid/cpp/src/qpid/ha/ReplicateLevel.cpp
@@ -0,0 +1,72 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+#include "ReplicateLevel.h"
+#include "qpid/Exception.h"
+#include "qpid/Msg.h"
+#include <iostream>
+#include <assert.h>
+
+namespace qpid {
+namespace ha {
+
+using namespace std;
+
+// Note replicateLevel is called during plugin-initialization which
+// happens in the static construction phase so these constants need
+// to be POD, they can't be class objects
+//
+namespace {
+const char* S_NONE="none";
+const char* S_CONFIGURATION="configuration";
+const char* S_ALL="all";
+}
+
+bool replicateLevel(const string& level, ReplicateLevel& out) {
+ if (level == S_NONE) { out = RL_NONE; return true; }
+ if (level == S_CONFIGURATION) { out = RL_CONFIGURATION; return true; }
+ if (level == S_ALL) { out = RL_ALL; return true; }
+ return false;
+}
+
+ReplicateLevel replicateLevel(const string& level) {
+ ReplicateLevel rl;
+ if (!replicateLevel(level, rl))
+ throw Exception("Invalid value for replication level: "+level);
+ return rl;
+}
+
+string str(ReplicateLevel l) {
+ const char* names[] = { S_NONE, S_CONFIGURATION, S_ALL };
+ if (l > RL_ALL)
+ throw Exception(QPID_MSG("Invalid value for replication level: " << l));
+ return names[l];
+}
+
+ostream& operator<<(ostream& o, ReplicateLevel rl) { return o << str(rl); }
+
+istream& operator>>(istream& i, ReplicateLevel& rl) {
+ string str;
+ i >> str;
+ rl = replicateLevel(str);
+ return i;
+}
+
+}} // namespace qpid::ha
diff --git a/qpid/cpp/src/qpid/ha/ReplicateLevel.h b/qpid/cpp/src/qpid/ha/ReplicateLevel.h
new file mode 100644
index 0000000000..c11e03f0ce
--- /dev/null
+++ b/qpid/cpp/src/qpid/ha/ReplicateLevel.h
@@ -0,0 +1,52 @@
+#ifndef QPID_HA_REPLICATELEVEL_H
+#define QPID_HA_REPLICATELEVEL_H
+
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include <string>
+#include <iosfwd>
+
+namespace qpid {
+namespace ha {
+
+enum ReplicateLevel { RL_NONE, RL_CONFIGURATION, RL_ALL };
+
+/**
+ * If str is a valid replicate level, set out and return true.
+ */
+bool replicateLevel(const std::string& str, ReplicateLevel& out);
+
+/**
+ *@return enum corresponding to string level.
+ *@throw qpid::Exception if level is not a valid replication level.
+ */
+ReplicateLevel replicateLevel(const std::string& level);
+
+/**@return string form of replicate level */
+std::string str(ReplicateLevel l);
+
+std::ostream& operator<<(std::ostream&, ReplicateLevel);
+std::istream& operator>>(std::istream&, ReplicateLevel&);
+
+}} // namespaces qpid::ha
+
+#endif /*!QPID_HA_REPLICATELEVEL_H*/
diff --git a/qpid/cpp/src/qpid/ha/ReplicatingSubscription.cpp b/qpid/cpp/src/qpid/ha/ReplicatingSubscription.cpp
index af6180305d..91a4538bc4 100644
--- a/qpid/cpp/src/qpid/ha/ReplicatingSubscription.cpp
+++ b/qpid/cpp/src/qpid/ha/ReplicatingSubscription.cpp
@@ -87,10 +87,13 @@ ReplicatingSubscription::ReplicatingSubscription(
events(new Queue(mask(name))),
consumer(new DelegatingConsumer(*this))
{
+ // Separate the remote part from a "local-remote" address.
+ string address = parent->getSession().getConnection().getUrl();
+ size_t i = address.find('-');
+ if (i != string::npos) address = address.substr(i+1);
+ logPrefix = "HA: Primary ";
stringstream ss;
- ss << "HA: Primary: " << getQueue()->getName() << " at "
- << parent->getSession().getConnection().getUrl() << ": ";
- logPrefix = ss.str();
+ logSuffix = " (" + address + ")";
// FIXME aconway 2011-12-09: Failover optimization removed.
// There was code here to re-use messages already on the backup
@@ -99,7 +102,7 @@ ReplicatingSubscription::ReplicatingSubscription(
// can be re-introduced later. Last revision with the optimization:
// r1213258 | QPID-3603: Fix QueueReplicator subscription parameters.
- QPID_LOG(debug, logPrefix << "Created backup subscription " << getName());
+ QPID_LOG(debug, logPrefix << "created backup subscription " << getName() << logSuffix);
// FIXME aconway 2011-12-15: ConsumerImpl::position is left at 0
// so we will start consuming from the lowest numbered message.
@@ -109,23 +112,36 @@ ReplicatingSubscription::ReplicatingSubscription(
// Message is delivered in the subscription's connection thread.
bool ReplicatingSubscription::deliver(QueuedMessage& m) {
- // Add position events for the subscribed queue, not for the internal event queue.
- if (m.queue && m.queue == getQueue().get()) {
- sys::Mutex::ScopedLock l(lock);
- assert(position == m.position);
- // m.position is the position of the newly enqueued m on the local queue.
- // backupPosition is latest position on the backup queue (before enqueueing m.)
- assert(m.position > backupPosition);
- if (m.position - backupPosition > 1) {
- // Position has advanced because of messages dequeued ahead of us.
- SequenceNumber send(m.position);
- --send; // Send the position before m was enqueued.
- sendPositionEvent(send, l);
+ try {
+ // Add position events for the subscribed queue, not for the internal event queue.
+ if (m.queue && m.queue == getQueue().get()) {
+ sys::Mutex::ScopedLock l(lock);
+ if (position != m.position)
+ throw Exception(
+ QPID_MSG("Expected position " << position
+ << " but got " << m.position));
+ // m.position is the position of the newly enqueued m on the local queue.
+ // backupPosition is latest position on the backup queue (before enqueueing m.)
+ if (m.position <= backupPosition)
+ throw Exception(
+ QPID_MSG("Expected position > " << backupPosition
+ << " but got " << m.position));
+
+ if (m.position - backupPosition > 1) {
+ // Position has advanced because of messages dequeued ahead of us.
+ SequenceNumber send(m.position);
+ --send; // Send the position before m was enqueued.
+ sendPositionEvent(send, l);
+ }
+ backupPosition = m.position;
+ QPID_LOG(trace, logPrefix << "replicating " << m << logSuffix);
}
- backupPosition = m.position;
- QPID_LOG(trace, logPrefix << "Replicating message " << m.position);
+ return ConsumerImpl::deliver(m);
+ } catch (const std::exception& e) {
+ QPID_LOG(critical, logPrefix << "error replicating " << getQueue()->getName()
+ << logSuffix << ": " << e.what());
+ throw;
}
- return ConsumerImpl::deliver(m);
}
ReplicatingSubscription::~ReplicatingSubscription() {}
@@ -139,7 +155,7 @@ void ReplicatingSubscription::complete(
{
// Handle completions for the subscribed queue, not the internal event queue.
if (qm.queue && qm.queue == getQueue().get()) {
- QPID_LOG(trace, logPrefix << "Completed message " << qm.position);
+ QPID_LOG(trace, logPrefix << "completed " << qm << logSuffix);
Delayed::iterator i= delayed.find(qm.position);
// The same message can be completed twice, by acknowledged and
// dequeued, remove it from the set so it only gets completed
@@ -157,7 +173,7 @@ void ReplicatingSubscription::complete(
void ReplicatingSubscription::enqueued(const QueuedMessage& qm) {
sys::Mutex::ScopedLock l(lock);
// Delay completion
- QPID_LOG(trace, logPrefix << "Delaying completion of message " << qm.position);
+ QPID_LOG(trace, logPrefix << "delaying completion of " << qm << logSuffix);
qm.payload->getIngressCompletion().startCompleter();
assert(delayed.find(qm.position) == delayed.end());
delayed[qm.position] = qm;
@@ -168,7 +184,7 @@ void ReplicatingSubscription::enqueued(const QueuedMessage& qm) {
void ReplicatingSubscription::cancelComplete(
const Delayed::value_type& v, const sys::Mutex::ScopedLock&)
{
- QPID_LOG(trace, logPrefix << "Cancel completed message " << v.second.position);
+ QPID_LOG(trace, logPrefix << "cancel completed " << v.second << logSuffix);
v.second.payload->getIngressCompletion().finishCompleter();
}
@@ -179,7 +195,7 @@ void ReplicatingSubscription::cancel()
boost::dynamic_pointer_cast<QueueObserver>(shared_from_this()));
{
sys::Mutex::ScopedLock l(lock);
- QPID_LOG(debug, logPrefix <<"Cancelled backup subscription " << getName());
+ QPID_LOG(debug, logPrefix << "cancel backup subscription " << getName() << logSuffix);
for_each(delayed.begin(), delayed.end(),
boost::bind(&ReplicatingSubscription::cancelComplete, this, _1, boost::ref(l)));
delayed.clear();
@@ -201,7 +217,8 @@ bool ReplicatingSubscription::hideDeletedError() { return true; }
// Called with lock held. Called in subscription's connection thread.
void ReplicatingSubscription::sendDequeueEvent(const sys::Mutex::ScopedLock& l)
{
- QPID_LOG(trace, logPrefix << "Sending dequeues " << dequeues);
+ QPID_LOG(trace, logPrefix << "sending dequeues " << dequeues
+ << " from " << getQueue()->getName() << logSuffix);
string buf(dequeues.encodedSize(),'\0');
framing::Buffer buffer(&buf[0], buf.size());
dequeues.encode(buffer);
@@ -216,7 +233,7 @@ void ReplicatingSubscription::dequeued(const QueuedMessage& qm)
{
{
sys::Mutex::ScopedLock l(lock);
- QPID_LOG(trace, logPrefix << "Dequeued message " << qm.position);
+ QPID_LOG(trace, logPrefix << "dequeued " << qm << logSuffix);
dequeues.add(qm.position);
// If we have not yet sent this message to the backup, then
// complete it now as it will never be accepted.
@@ -229,8 +246,8 @@ void ReplicatingSubscription::dequeued(const QueuedMessage& qm)
void ReplicatingSubscription::sendPositionEvent(
SequenceNumber position, const sys::Mutex::ScopedLock&l )
{
- QPID_LOG(trace, logPrefix << "Sending position " << position
- << ", was " << backupPosition);
+ QPID_LOG(trace, logPrefix << "sending position " << position
+ << ", was " << backupPosition << logSuffix);
string buf(backupPosition.encodedSize(),'\0');
framing::Buffer buffer(&buf[0], buf.size());
position.encode(buffer);
diff --git a/qpid/cpp/src/qpid/ha/ReplicatingSubscription.h b/qpid/cpp/src/qpid/ha/ReplicatingSubscription.h
index cbcb230bc1..f9176915f6 100644
--- a/qpid/cpp/src/qpid/ha/ReplicatingSubscription.h
+++ b/qpid/cpp/src/qpid/ha/ReplicatingSubscription.h
@@ -94,7 +94,7 @@ class ReplicatingSubscription : public broker::SemanticState::ConsumerImpl,
bool doDispatch();
private:
typedef std::map<framing::SequenceNumber, broker::QueuedMessage> Delayed;
- std::string logPrefix;
+ std::string logPrefix, logSuffix;
boost::shared_ptr<broker::Queue> events;
boost::shared_ptr<broker::Consumer> consumer;
Delayed delayed;
diff --git a/qpid/cpp/src/qpid/ha/Settings.h b/qpid/cpp/src/qpid/ha/Settings.h
index 7df18b4ef4..bf70c3f3f7 100644
--- a/qpid/cpp/src/qpid/ha/Settings.h
+++ b/qpid/cpp/src/qpid/ha/Settings.h
@@ -22,6 +22,7 @@
*
*/
+#include "ReplicateLevel.h"
#include <string>
namespace qpid {
@@ -33,11 +34,12 @@ namespace ha {
class Settings
{
public:
- Settings() : cluster(false), expectedBackups(0) {}
+ Settings() : cluster(false), expectedBackups(0), replicateDefault(RL_NONE) {}
bool cluster; // True if we are a cluster member.
std::string clientUrl;
std::string brokerUrl;
size_t expectedBackups;
+ ReplicateLevel replicateDefault;
std::string username, password, mechanism;
private:
};
diff --git a/qpid/cpp/src/qpid/ha/management-schema.xml b/qpid/cpp/src/qpid/ha/management-schema.xml
index 9a815b346c..363dff61fb 100644
--- a/qpid/cpp/src/qpid/ha/management-schema.xml
+++ b/qpid/cpp/src/qpid/ha/management-schema.xml
@@ -32,7 +32,11 @@
desc="Multiple-address URL used by clients to connect to the HA brokers."/>
<property name="expectedBackups" type="uint16"
- desc="Number of HA backup brokers expected."/>>
+ desc="Number of HA backup brokers expected."/>
+
+ <property
+ name="replicateDefault" type="sstr"
+ desc="Replicate value for queues/exchanges without a qpid.replicate argument"/>
<method name="promote" desc="Promote a backup broker to primary."/>
@@ -48,7 +52,7 @@
<arg name="expectedBackups" type="uint16" dir="I"/>
</method>
- <method name="replicate" desc="Replicate from a remote queue to the local broker.">
+ <method name="replicate" desc="Replicate individual queue from remote broker.">
<arg name="broker" type="sstr" dir="I"/>
<arg name="queue" type="sstr" dir="I"/>
</method>
diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.cpp b/qpid/cpp/src/qpid/management/ManagementAgent.cpp
index 29e409b204..062a530706 100644
--- a/qpid/cpp/src/qpid/management/ManagementAgent.cpp
+++ b/qpid/cpp/src/qpid/management/ManagementAgent.cpp
@@ -30,6 +30,7 @@
#include "qpid/log/Statement.h"
#include <qpid/broker/Message.h>
#include "qpid/framing/MessageTransferBody.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/sys/Time.h"
#include "qpid/sys/Thread.h"
#include "qpid/broker/ConnectionState.h"
diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.h b/qpid/cpp/src/qpid/management/ManagementAgent.h
index f01c66b4af..c7e830dcf5 100644
--- a/qpid/cpp/src/qpid/management/ManagementAgent.h
+++ b/qpid/cpp/src/qpid/management/ManagementAgent.h
@@ -36,7 +36,6 @@
#include "qpid/sys/MemStat.h"
#include "qpid/types/Variant.h"
#include <qpid/framing/AMQFrame.h>
-#include <qpid/framing/FieldValue.h>
#include <qpid/framing/ResizableBuffer.h>
#include <memory>
#include <string>
diff --git a/qpid/cpp/src/qpid/replication/ReplicatingEventListener.cpp b/qpid/cpp/src/qpid/replication/ReplicatingEventListener.cpp
index 3d84a1ce3c..9284bda388 100644
--- a/qpid/cpp/src/qpid/replication/ReplicatingEventListener.cpp
+++ b/qpid/cpp/src/qpid/replication/ReplicatingEventListener.cpp
@@ -131,7 +131,7 @@ boost::intrusive_ptr<Message> ReplicatingEventListener::cloneMessage(Queue& queu
//cloned body:
AMQFrame header(*original->getFrames().getHeaders());
header.setBof(false);
- header.setEof(!original->getFrames().getContentSize());//if there is any content then the header is not the end of the frameset
+ header.setEof(!original->getFrames().hasContent());//if there are any content frames then the header is not the end of the frameset
header.setBos(true);
header.setEos(true);
handler.handle(header);
diff --git a/qpid/cpp/src/qpid/replication/ReplicationExchange.cpp b/qpid/cpp/src/qpid/replication/ReplicationExchange.cpp
index dce0d750a4..66f4f14d0c 100644
--- a/qpid/cpp/src/qpid/replication/ReplicationExchange.cpp
+++ b/qpid/cpp/src/qpid/replication/ReplicationExchange.cpp
@@ -60,7 +60,13 @@ void ReplicationExchange::route(Deliverable& msg)
if (args) {
int eventType = args->getAsInt(REPLICATION_EVENT_TYPE);
if (eventType) {
- if (isDuplicate(args)) return;
+ if (isDuplicate(args)) {
+ if (mgmtExchange != 0) {
+ mgmtExchange->inc_msgDrops();
+ mgmtExchange->inc_byteDrops(msg.contentSize());
+ }
+ return;
+ }
switch (eventType) {
case ENQUEUE:
handleEnqueueEvent(args, msg);
diff --git a/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp b/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp
index fb8df5ddf8..ae53414e52 100644
--- a/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp
+++ b/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp
@@ -291,12 +291,12 @@ private:
volatile LONG opsInProgress;
// Is there a write in progress?
volatile bool writeInProgress;
+ // Or a read?
+ volatile bool readInProgress;
// Deletion requested, but there are callbacks in progress.
volatile bool queuedDelete;
// Socket close requested, but there are operations in progress.
volatile bool queuedClose;
- // Most recent asynch read request
- volatile AsynchReadResult* pendingRead;
private:
// Dispatch events that have completed.
@@ -346,6 +346,11 @@ private:
* Called when there's a completion to process.
*/
void completion(AsynchIoResult *result);
+
+ /**
+ * Helper function to facilitate the close operation
+ */
+ void cancelRead();
};
// This is used to encapsulate pure callbacks into a handle
@@ -374,9 +379,9 @@ AsynchIO::AsynchIO(const Socket& s,
socket(s),
opsInProgress(0),
writeInProgress(false),
+ readInProgress(false),
queuedDelete(false),
queuedClose(false),
- pendingRead(0),
working(false) {
}
@@ -392,21 +397,24 @@ AsynchIO::~AsynchIO() {
}
void AsynchIO::queueForDeletion() {
- queuedDelete = true;
- if (opsInProgress > 0) {
- QPID_LOG(info, "Delete AsynchIO queued; ops in progress");
- // AsynchIOHandler calls this then deletes itself; don't do any more
- // callbacks.
- readCallback = 0;
- eofCallback = 0;
- disCallback = 0;
- closedCallback = 0;
- emptyCallback = 0;
- idleCallback = 0;
- }
- else {
- delete this;
+ {
+ ScopedLock<Mutex> l(completionLock);
+ assert(!queuedDelete);
+ queuedDelete = true;
+ if (working || opsInProgress > 0) {
+ QPID_LOG(info, "Delete AsynchIO queued; ops in progress");
+ // AsynchIOHandler calls this then deletes itself; don't do any more
+ // callbacks.
+ readCallback = 0;
+ eofCallback = 0;
+ disCallback = 0;
+ closedCallback = 0;
+ emptyCallback = 0;
+ idleCallback = 0;
+ return;
+ }
}
+ delete this;
}
void AsynchIO::start(Poller::shared_ptr poller0) {
@@ -454,9 +462,14 @@ void AsynchIO::notifyPendingWrite() {
}
void AsynchIO::queueWriteClose() {
- queuedClose = true;
- if (!writeInProgress)
- notifyPendingWrite();
+ {
+ ScopedLock<Mutex> l(completionLock);
+ queuedClose = true;
+ if (working || writeInProgress)
+ // no need to summon an IO thread
+ return;
+ }
+ notifyPendingWrite();
}
bool AsynchIO::writeQueueEmpty() {
@@ -469,7 +482,7 @@ bool AsynchIO::writeQueueEmpty() {
* called when the read is complete and data is available.
*/
void AsynchIO::startReading() {
- if (queuedDelete)
+ if (queuedDelete || queuedClose)
return;
// (Try to) get a buffer; look on the front since there may be an
@@ -492,6 +505,7 @@ void AsynchIO::startReading() {
readCount);
DWORD bytesReceived = 0, flags = 0;
InterlockedIncrement(&opsInProgress);
+ readInProgress = true;
int status = WSARecv(toSocketHandle(socket),
const_cast<LPWSABUF>(result->getWSABUF()), 1,
&bytesReceived,
@@ -507,7 +521,6 @@ void AsynchIO::startReading() {
}
}
// On status 0 or WSA_IO_PENDING, completion will handle the rest.
- pendingRead = result;
}
else {
notifyBuffersEmpty();
@@ -620,6 +633,7 @@ void AsynchIO::close(void) {
void AsynchIO::readComplete(AsynchReadResult *result) {
int status = result->getStatus();
size_t bytes = result->getTransferred();
+ readInProgress = false;
if (status == 0 && bytes > 0) {
if (readCallback)
readCallback(*this, result->getBuff());
@@ -629,8 +643,8 @@ void AsynchIO::readComplete(AsynchReadResult *result) {
// No data read, so put the buffer back. It may be partially filled,
// so "unread" it back to the front of the queue.
unread(result->getBuff());
- if (queuedClose && status == ERROR_OPERATION_ABORTED) {
- return; // Expected reap from CancelIoEx
+ if (queuedClose) {
+ return; // Expected from cancelRead()
}
notifyEof();
if (status != 0)
@@ -687,6 +701,8 @@ void AsynchIO::writeComplete(AsynchWriteResult *result) {
}
void AsynchIO::completion(AsynchIoResult *result) {
+ bool closing = false;
+ bool deleting = false;
{
ScopedLock<Mutex> l(completionLock);
if (working) {
@@ -702,11 +718,8 @@ void AsynchIO::completion(AsynchIoResult *result) {
{
ScopedUnlock<Mutex> ul(completionLock);
AsynchReadResult *r = dynamic_cast<AsynchReadResult*>(result);
- if (r != 0) {
+ if (r != 0)
readComplete(r);
- // Set pendingRead to 0 if it's still pointing to (newly completed) r
- InterlockedCompareExchangePointer((void * volatile *)&pendingRead, 0, r);
- }
else {
AsynchWriteResult *w =
dynamic_cast<AsynchWriteResult*>(result);
@@ -721,6 +734,8 @@ void AsynchIO::completion(AsynchIoResult *result) {
delete result;
result = 0;
InterlockedDecrement(&opsInProgress);
+ if (queuedClose && opsInProgress == 1 && readInProgress)
+ cancelRead();
}
// Lock is held again.
if (completionQueue.empty())
@@ -729,26 +744,40 @@ void AsynchIO::completion(AsynchIoResult *result) {
completionQueue.pop();
}
working = false;
+ if (opsInProgress == 0) {
+ closing = queuedClose;
+ deleting = queuedDelete;
+ }
}
// Lock released; ok to close if ops are done and close requested.
// Layer above will call back to queueForDeletion() if it hasn't
// already been done. If it already has, go ahead and delete.
- if (opsInProgress == 0) {
- if (queuedClose)
- // close() may cause a delete; don't trust 'this' on return
- close();
- else if (queuedDelete)
- delete this;
- }
+ if (deleting)
+ delete this;
+ else if (closing)
+ // close() may cause a delete; don't trust 'this' on return
+ close();
+}
+
+/*
+ * NOTE - this method must be called in the same context as other completions,
+ * so that the resulting readComplete, and final AsynchIO::close() is serialized
+ * after this method returns.
+ */
+void AsynchIO::cancelRead() {
+ if (queuedDelete)
+ return; // socket already deleted
else {
- if (queuedClose && pendingRead) {
- // Force outstanding read to completion. Layer above will
- // call back.
- CancelIoEx((HANDLE)toSocketHandle(socket),
- ((AsynchReadResult *)pendingRead)->overlapped());
- pendingRead = 0;
- }
+ ScopedLock<Mutex> l(completionLock);;
+ if (!completionQueue.empty())
+ return; // process it; come back later if necessary
}
+ // Cancel outstanding read and force to completion. Otherwise, on a faulty
+ // physical link, the pending read can remain uncompleted indefinitely.
+ // Draining the pending read will result in the official close (and
+ // notifyClosed). CancelIoEX() is the natural choice, but not available in
+ // XP, so we make do with closesocket().
+ socket.close();
}
} // namespace windows
diff --git a/qpid/cpp/src/tests/Array.cpp b/qpid/cpp/src/tests/Array.cpp
index 7622b89d15..8ce7615162 100644
--- a/qpid/cpp/src/tests/Array.cpp
+++ b/qpid/cpp/src/tests/Array.cpp
@@ -58,7 +58,7 @@ QPID_AUTO_TEST_CASE(testEncodeDecode)
BOOST_CHECK_EQUAL(a, b);
std::vector<std::string> data2;
- b.collect(data2);
+ std::transform(b.begin(), b.end(), std::back_inserter(data2), Array::get<std::string, Array::ValuePtr>);
//BOOST_CHECK_EQUAL(data, data2);
BOOST_CHECK(data == data2);
}
@@ -74,7 +74,7 @@ QPID_AUTO_TEST_CASE(testArrayAssignment)
BOOST_CHECK_EQUAL(a, b);
}
std::vector<std::string> data2;
- b.collect(data2);
+ std::transform(b.begin(), b.end(), std::back_inserter(data2), Array::get<std::string, Array::ValuePtr>);
//BOOST_CHECK_EQUAL(data, data2);
BOOST_CHECK(data == data2);
}
diff --git a/qpid/cpp/src/tests/CMakeLists.txt b/qpid/cpp/src/tests/CMakeLists.txt
index bb4f52d319..5979ce42ae 100644
--- a/qpid/cpp/src/tests/CMakeLists.txt
+++ b/qpid/cpp/src/tests/CMakeLists.txt
@@ -23,7 +23,11 @@ include (CTest)
# Make sure that everything get built before the tests
# Need to create a var with all the necessary top level targets
-add_definitions(-DBOOST_TEST_DYN_LINK)
+# If we're linking Boost for DLLs, turn that on for the unit test too.
+if (QPID_LINK_BOOST_DYNAMIC)
+ add_definitions(-DBOOST_TEST_DYN_LINK)
+endif (QPID_LINK_BOOST_DYNAMIC)
+
include_directories( ${CMAKE_CURRENT_SOURCE_DIR} )
include (FindPythonInterp)
diff --git a/qpid/cpp/src/tests/FieldTable.cpp b/qpid/cpp/src/tests/FieldTable.cpp
index fe2a14ec03..c79d110ae4 100644
--- a/qpid/cpp/src/tests/FieldTable.cpp
+++ b/qpid/cpp/src/tests/FieldTable.cpp
@@ -19,11 +19,11 @@
*
*/
#include <iostream>
+#include <algorithm>
#include "qpid/framing/Array.h"
#include "qpid/framing/FieldTable.h"
#include "qpid/framing/FieldValue.h"
#include "qpid/framing/List.h"
-#include "qpid/sys/alloca.h"
#include "unit_test.h"
@@ -127,7 +127,7 @@ QPID_AUTO_TEST_CASE(testNestedValues)
BOOST_CHECK(string("B") == b.getAsString("id"));
a.getArray("C", c);
std::vector<std::string> items;
- c.collect(items);
+ std::transform(c.begin(), c.end(), std::back_inserter(items), Array::get<std::string, Array::ValuePtr>);
BOOST_CHECK((uint) 2 == items.size());
BOOST_CHECK(string("one") == items[0]);
BOOST_CHECK(string("two") == items[1]);
diff --git a/qpid/cpp/src/tests/FramingTest.cpp b/qpid/cpp/src/tests/FramingTest.cpp
index f8795316cc..2392b6fec4 100644
--- a/qpid/cpp/src/tests/FramingTest.cpp
+++ b/qpid/cpp/src/tests/FramingTest.cpp
@@ -25,6 +25,7 @@
#include "qpid/framing/all_method_bodies.h"
#include "qpid/framing/amqp_framing.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/FieldValue.h"
#include "unit_test.h"
#include <boost/bind.hpp>
diff --git a/qpid/cpp/src/tests/Makefile.am b/qpid/cpp/src/tests/Makefile.am
index 7c0afc4a63..66d2cdd5d5 100644
--- a/qpid/cpp/src/tests/Makefile.am
+++ b/qpid/cpp/src/tests/Makefile.am
@@ -149,7 +149,7 @@ endif
# Test programs that are installed and therefore built as part of make, not make check
-qpidexectest_SCRIPTS += qpid-cpp-benchmark install_env.sh
+qpidexectest_SCRIPTS += qpid-cpp-benchmark qpid-cluster-benchmark install_env.sh
EXTRA_DIST += qpid-cpp-benchmark install_env.sh
qpidexectest_PROGRAMS += receiver
@@ -320,7 +320,7 @@ EXTRA_DIST += \
header_test.py \
ssl_test \
config.null \
- ais_check \
+ cpg_check.sh.in \
run_federation_tests \
run_federation_sys_tests \
run_long_federation_sys_tests \
@@ -368,9 +368,15 @@ LONG_TESTS+=start_broker \
fanout_perftest shared_perftest multiq_perftest topic_perftest run_ring_queue_test \
run_msg_group_tests_soak \
stop_broker \
- run_long_federation_sys_tests \
- run_failover_soak reliable_replication_test \
- federated_cluster_test_with_node_failure
+ run_long_federation_sys_tests
+
+if HAVE_LIBCPG
+
+LONG_TESTS+= federated_cluster_test_with_node_failure \
+ run_failover_soak \
+ reliable_replication_test
+
+endif HAVE_LIBCPG
EXTRA_DIST+= \
fanout_perftest \
@@ -381,7 +387,8 @@ EXTRA_DIST+= \
reliable_replication_test \
federated_cluster_test_with_node_failure \
sasl_test_setup.sh \
- run_msg_group_tests_soak
+ run_msg_group_tests_soak \
+ qpidd-empty.conf
check-long:
$(MAKE) check TESTS="$(LONG_TESTS)" VALGRIND=
diff --git a/qpid/cpp/src/tests/MessagingSessionTests.cpp b/qpid/cpp/src/tests/MessagingSessionTests.cpp
index 313e8b3132..968d55fd45 100644
--- a/qpid/cpp/src/tests/MessagingSessionTests.cpp
+++ b/qpid/cpp/src/tests/MessagingSessionTests.cpp
@@ -1139,6 +1139,13 @@ QPID_AUTO_TEST_CASE(testHeadersExchange)
}
}
+QPID_AUTO_TEST_CASE(testLargeRoutingKey)
+{
+ MessagingFixture fix;
+ std::string address = "amq.direct/" + std::string(300, 'x');//routing/binding key can be at most 225 chars in 0-10
+ BOOST_CHECK_THROW(fix.session.createReceiver(address), qpid::messaging::MessagingException);
+}
+
QPID_AUTO_TEST_SUITE_END()
}} // namespace qpid::tests
diff --git a/qpid/cpp/src/tests/QueueFlowLimitTest.cpp b/qpid/cpp/src/tests/QueueFlowLimitTest.cpp
index 8a6923fb09..bd868398f8 100644
--- a/qpid/cpp/src/tests/QueueFlowLimitTest.cpp
+++ b/qpid/cpp/src/tests/QueueFlowLimitTest.cpp
@@ -27,6 +27,7 @@
#include "qpid/broker/QueueFlowLimit.h"
#include "qpid/sys/Time.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/framing/FieldValue.h"
#include "MessageUtils.h"
#include "BrokerFixture.h"
diff --git a/qpid/cpp/src/tests/Uuid.cpp b/qpid/cpp/src/tests/Uuid.cpp
index 0195455ca3..f85a297adc 100644
--- a/qpid/cpp/src/tests/Uuid.cpp
+++ b/qpid/cpp/src/tests/Uuid.cpp
@@ -48,7 +48,7 @@ QPID_AUTO_TEST_CASE(testUuidCtor) {
for_each(uuids.begin(), uuids.end(), unique);
}
-boost::array<uint8_t, 16> sample = {{'\x1b', '\x4e', '\x28', '\xba', '\x2f', '\xa1', '\x11', '\xd2', '\x88', '\x3f', '\xb9', '\xa7', '\x61', '\xbd', '\xe3', '\xfb'}};
+boost::array<uint8_t, 16> sample = {{0x1b, 0x4e, 0x28, 0xba, 0x2f, 0xa1, 0x11, 0xd2, 0x88, 0x3f, 0xb9, 0xa7, 0x61, 0xbd, 0xe3, 0xfb}};
const string sampleStr("1b4e28ba-2fa1-11d2-883f-b9a761bde3fb");
const string zeroStr("00000000-0000-0000-0000-000000000000");
diff --git a/qpid/cpp/src/tests/acl.py b/qpid/cpp/src/tests/acl.py
index a1b7f93a2e..9b170c16f5 100755
--- a/qpid/cpp/src/tests/acl.py
+++ b/qpid/cpp/src/tests/acl.py
@@ -47,6 +47,19 @@ class ACLTests(TestBase010):
connection.start()
return connection.session(str(uuid4()))
+ def port_i(self):
+ return int(self.defines["port-i"])
+
+ def port_u(self):
+ return int(self.defines["port-u"])
+
+ def get_session_by_port(self, user, passwd, byPort):
+ socket = connect(self.broker.host, byPort)
+ connection = Connection (sock=socket, username=user, password=passwd,
+ mechanism="PLAIN")
+ connection.start()
+ return connection.session(str(uuid4()))
+
def reload_acl(self):
result = None
try:
@@ -55,6 +68,24 @@ class ACLTests(TestBase010):
result = str(e)
return result
+ def acl_lookup(self, userName, action, aclObj, aclObjName, propMap):
+ result = {}
+ try:
+ result = self.broker_access.acl_lookup(userName, action, aclObj, aclObjName, propMap)
+ except Exception, e:
+ result['text'] = str(e)
+ result['result'] = str(e)
+ return result
+
+ def acl_lookupPublish(self, userName, exchange, key):
+ result = {}
+ try:
+ result = self.broker_access.acl_lookupPublish(userName, exchange, key)
+ except Exception, e:
+ result['text'] = str(e)
+ result['result'] = str(e)
+ return result
+
def get_acl_file(self):
return ACLFile(self.config.defines.get("policy-file", "data_dir/policy.acl"))
@@ -73,6 +104,37 @@ class ACLTests(TestBase010):
self.reload_acl()
TestBase010.tearDown(self)
+
+ def Lookup(self, userName, action, aclObj, aclObjName, propMap, expectedResult):
+ result = self.acl_lookup(userName, action, aclObj, aclObjName, propMap)
+ if (result['result'] != expectedResult):
+ suffix = ', [ERROR: Expected= ' + expectedResult
+ if (result['result'] is None):
+ suffix = suffix + ', Exception= ' + result['text'] + ']'
+ else:
+ suffix = suffix + ', Actual= ' + result['result'] + ']'
+ self.fail('Lookup: name=' + userName + ', action=' + action + ', aclObj=' + aclObj + ', aclObjName=' + aclObjName + ', propertyMap=' + str(propMap) + suffix)
+
+
+ def LookupPublish(self, userName, exchName, keyName, expectedResult):
+ result = self.acl_lookupPublish(userName, exchName, keyName)
+ if (result['result'] != expectedResult):
+ if (result['result'] is None):
+ suffix = suffix + ', Exception= ' + result['text'] + ']'
+ else:
+ suffix = suffix + ', Actual= ' + result['result'] + ']'
+ self.fail('LookupPublish: name=' + userName + ', exchange=' + exchName + ', key=' + keyName + suffix)
+
+ def AllBut(self, allList, removeList):
+ tmpList = allList[:]
+ for item in removeList:
+ try:
+ tmpList.remove(item)
+ except Exception, e:
+ self.fail("ERROR in AllBut() \nallList = %s \nremoveList = %s \nerror = %s " \
+ % (allList, removeList, e))
+ return tmpList
+
#=====================================
# ACL general tests
#=====================================
@@ -460,7 +522,8 @@ class ACLTests(TestBase010):
Test cases for queue acl in allow mode
"""
aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create queue name=q1 durable=true passive=true\n')
+ aclf.write('acl deny bob@QPID access queue name=q1\n')
+ aclf.write('acl deny bob@QPID create queue name=q1 durable=true\n')
aclf.write('acl deny bob@QPID create queue name=q2 exclusive=true policytype=ring\n')
aclf.write('acl deny bob@QPID access queue name=q3\n')
aclf.write('acl deny bob@QPID purge queue name=q3\n')
@@ -476,8 +539,15 @@ class ACLTests(TestBase010):
session = self.get_session('bob','bob')
try:
+ session.queue_declare(queue="q1", durable=True)
+ self.fail("ACL should deny queue create request with name=q1 durable=true");
+ except qpid.session.SessionException, e:
+ self.assertEqual(403,e.args[0].error_code)
+ session = self.get_session('bob','bob')
+
+ try:
session.queue_declare(queue="q1", durable=True, passive=True)
- self.fail("ACL should deny queue create request with name=q1 durable=true passive=true");
+ self.fail("ACL should deny queue passive declare request with name=q1 durable=true");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
@@ -563,7 +633,8 @@ class ACLTests(TestBase010):
Test cases for queue acl in deny mode
"""
aclf = self.get_acl_file()
- aclf.write('acl allow bob@QPID create queue name=q1 durable=true passive=true\n')
+ aclf.write('acl allow bob@QPID access queue name=q1\n')
+ aclf.write('acl allow bob@QPID create queue name=q1 durable=true\n')
aclf.write('acl allow bob@QPID create queue name=q2 exclusive=true policytype=ring\n')
aclf.write('acl allow bob@QPID access queue name=q3\n')
aclf.write('acl allow bob@QPID purge queue name=q3\n')
@@ -583,10 +654,16 @@ class ACLTests(TestBase010):
session = self.get_session('bob','bob')
try:
+ session.queue_declare(queue="q1", durable=True)
+ except qpid.session.SessionException, e:
+ if (403 == e.args[0].error_code):
+ self.fail("ACL should allow queue create request with name=q1 durable=true");
+
+ try:
session.queue_declare(queue="q1", durable=True, passive=True)
except qpid.session.SessionException, e:
if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request with name=q1 durable=true passive=true");
+ self.fail("ACL should allow queue passive declare request with name=q1 durable=true passive=true");
try:
session.queue_declare(queue="q1", durable=False, passive=False)
@@ -736,7 +813,8 @@ class ACLTests(TestBase010):
Test cases for exchange acl in allow mode
"""
aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create exchange name=testEx durable=true passive=true\n')
+ aclf.write('acl deny bob@QPID access exchange name=testEx\n')
+ aclf.write('acl deny bob@QPID create exchange name=testEx durable=true\n')
aclf.write('acl deny bob@QPID create exchange name=ex1 type=direct\n')
aclf.write('acl deny bob@QPID access exchange name=myEx queuename=q1 routingkey=rk1.*\n')
aclf.write('acl deny bob@QPID bind exchange name=myEx queuename=q1 routingkey=rk1\n')
@@ -755,18 +833,25 @@ class ACLTests(TestBase010):
session.exchange_declare(exchange='myEx', type='direct')
try:
+ session.exchange_declare(exchange='testEx', durable=True)
+ self.fail("ACL should deny exchange create request with name=testEx durable=true");
+ except qpid.session.SessionException, e:
+ self.assertEqual(403,e.args[0].error_code)
+ session = self.get_session('bob','bob')
+
+ try:
session.exchange_declare(exchange='testEx', durable=True, passive=True)
- self.fail("ACL should deny exchange create request with name=testEx durable=true passive=true");
+ self.fail("ACL should deny passive exchange declare request with name=testEx durable=true passive=true");
except qpid.session.SessionException, e:
self.assertEqual(403,e.args[0].error_code)
session = self.get_session('bob','bob')
try:
- session.exchange_declare(exchange='testEx', type='direct', durable=True, passive=False)
+ session.exchange_declare(exchange='testEx', type='direct', durable=False)
except qpid.session.SessionException, e:
print e
if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange create request for testEx with any parameter other than durable=true and passive=true");
+ self.fail("ACL should allow exchange create request for testEx with any parameter other than durable=true");
try:
session.exchange_declare(exchange='ex1', type='direct')
@@ -867,7 +952,7 @@ class ACLTests(TestBase010):
Test cases for exchange acl in deny mode
"""
aclf = self.get_acl_file()
- aclf.write('acl allow bob@QPID create exchange name=myEx durable=true passive=false\n')
+ aclf.write('acl allow bob@QPID create exchange name=myEx durable=true\n')
aclf.write('acl allow bob@QPID bind exchange name=amq.topic queuename=bar routingkey=foo.*\n')
aclf.write('acl allow bob@QPID unbind exchange name=amq.topic queuename=bar routingkey=foo.*\n')
aclf.write('acl allow bob@QPID access exchange name=myEx queuename=q1 routingkey=rk1.*\n')
@@ -1278,6 +1363,188 @@ class ACLTests(TestBase010):
admin.set_timestamp_cfg(ts) #should pass
+
+ #=====================================
+ # QMF Functional tests
+ #=====================================
+
+ def test_qmf_functional_tests(self):
+ """
+ Test using QMF method hooks into ACL logic
+ """
+ aclf = self.get_acl_file()
+ aclf.write('group admins moe@COMPANY.COM \\\n')
+ aclf.write(' larry@COMPANY.COM \\\n')
+ aclf.write(' curly@COMPANY.COM \\\n')
+ aclf.write(' shemp@COMPANY.COM\n')
+ aclf.write('group auditors aaudit@COMPANY.COM baudit@COMPANY.COM caudit@COMPANY.COM \\\n')
+ aclf.write(' daudit@COMPANY.COM eaduit@COMPANY.COM eaudit@COMPANY.COM\n')
+ aclf.write('group tatunghosts tatung01@COMPANY.COM \\\n')
+ aclf.write(' tatung02/x86.build.company.com@COMPANY.COM \\\n')
+ aclf.write(' tatung03/x86.build.company.com@COMPANY.COM \\\n')
+ aclf.write(' tatung04/x86.build.company.com@COMPANY.COM \n')
+ aclf.write('group publishusers publish@COMPANY.COM x-pubs@COMPANY.COM\n')
+ aclf.write('acl allow-log admins all all\n')
+ aclf.write('# begin hack alert: allow anonymous to access the lookup debug functions\n')
+ aclf.write('acl allow-log anonymous create queue\n')
+ aclf.write('acl allow-log anonymous all exchange name=qmf.*\n')
+ aclf.write('acl allow-log anonymous all exchange name=amq.direct\n')
+ aclf.write('acl allow-log anonymous all exchange name=qpid.management\n')
+ aclf.write('acl allow-log anonymous access method name=*\n')
+ aclf.write('# end hack alert\n')
+ aclf.write('acl allow-log auditors all exchange name=company.topic routingkey=private.audit.*\n')
+ aclf.write('acl allow-log tatunghosts publish exchange name=company.topic routingkey=tatung.*\n')
+ aclf.write('acl allow-log tatunghosts publish exchange name=company.direct routingkey=tatung-service-queue\n')
+ aclf.write('acl allow-log publishusers create queue\n')
+ aclf.write('acl allow-log publishusers publish exchange name=qpid.management routingkey=broker\n')
+ aclf.write('acl allow-log publishusers publish exchange name=qmf.default.topic routingkey=*\n')
+ aclf.write('acl allow-log publishusers publish exchange name=qmf.default.direct routingkey=*\n')
+ aclf.write('acl allow-log all bind exchange name=company.topic routingkey=tatung.*\n')
+ aclf.write('acl allow-log all bind exchange name=company.direct routingkey=tatung-service-queue\n')
+ aclf.write('acl allow-log all consume queue\n')
+ aclf.write('acl allow-log all access exchange\n')
+ aclf.write('acl allow-log all access queue\n')
+ aclf.write('acl allow-log all create queue name=tmp.* durable=false autodelete=true exclusive=true policytype=ring\n')
+ aclf.write('acl allow mrQ create queue queuemaxsizelowerlimit=100 queuemaxsizeupperlimit=200 queuemaxcountlowerlimit=300 queuemaxcountupperlimit=400\n')
+ aclf.write('acl deny-log all all\n')
+ aclf.close()
+
+ result = self.reload_acl()
+ if (result):
+ self.fail(result)
+
+ #
+ # define some group lists
+ #
+ g_admins = ['moe@COMPANY.COM', \
+ 'larry@COMPANY.COM', \
+ 'curly@COMPANY.COM', \
+ 'shemp@COMPANY.COM']
+
+ g_auditors = [ 'aaudit@COMPANY.COM','baudit@COMPANY.COM','caudit@COMPANY.COM', \
+ 'daudit@COMPANY.COM','eaduit@COMPANY.COM','eaudit@COMPANY.COM']
+
+ g_tatunghosts = ['tatung01@COMPANY.COM', \
+ 'tatung02/x86.build.company.com@COMPANY.COM', \
+ 'tatung03/x86.build.company.com@COMPANY.COM', \
+ 'tatung04/x86.build.company.com@COMPANY.COM']
+
+ g_publishusers = ['publish@COMPANY.COM', 'x-pubs@COMPANY.COM']
+
+ g_public = ['jpublic@COMPANY.COM', 'me@yahoo.com']
+
+ g_all = g_admins + g_auditors + g_tatunghosts + g_publishusers + g_public
+
+ action_all = ['consume','publish','create','access','bind','unbind','delete','purge','update']
+
+ #
+ # Run some tests verifying against users who are in and who are out of given groups.
+ #
+
+ for u in g_admins:
+ self.Lookup(u, "create", "queue", "anything", {"durable":"true"}, "allow-log")
+
+ uInTest = g_auditors + g_admins
+ uOutTest = self.AllBut(g_all, uInTest)
+
+ for u in uInTest:
+ self.LookupPublish(u, "company.topic", "private.audit.This", "allow-log")
+
+ for u in uInTest:
+ for a in action_all:
+ self.Lookup(u, a, "exchange", "company.topic", {"routingkey":"private.audit.This"}, "allow-log")
+
+ for u in uOutTest:
+ self.LookupPublish(u, "company.topic", "private.audit.This", "deny-log")
+ self.Lookup(u, "bind", "exchange", "company.topic", {"routingkey":"private.audit.This"}, "deny-log")
+
+ uInTest = g_admins + g_tatunghosts
+ uOutTest = self.AllBut(g_all, uInTest)
+
+ for u in uInTest:
+ self.LookupPublish(u, "company.topic", "tatung.this2", "allow-log")
+ self.LookupPublish(u, "company.direct", "tatung-service-queue", "allow-log")
+
+ for u in uOutTest:
+ self.LookupPublish(u, "company.topic", "tatung.this2", "deny-log")
+ self.LookupPublish(u, "company.direct", "tatung-service-queue", "deny-log")
+
+ for u in uOutTest:
+ for a in ["bind", "access"]:
+ self.Lookup(u, a, "exchange", "company.topic", {"routingkey":"tatung.this2"}, "allow-log")
+ self.Lookup(u, a, "exchange", "company.direct", {"routingkey":"tatung-service-queue"}, "allow-log")
+
+ uInTest = g_admins + g_publishusers
+ uOutTest = self.AllBut(g_all, uInTest)
+
+ for u in uInTest:
+ self.LookupPublish(u, "qpid.management", "broker", "allow-log")
+ self.LookupPublish(u, "qmf.default.topic", "this3", "allow-log")
+ self.LookupPublish(u, "qmf.default.direct", "this4", "allow-log")
+
+ for u in uOutTest:
+ self.LookupPublish(u, "qpid.management", "broker", "deny-log")
+ self.LookupPublish(u, "qmf.default.topic", "this3", "deny-log")
+ self.LookupPublish(u, "qmf.default.direct", "this4", "deny-log")
+
+ for u in uOutTest:
+ for a in ["bind"]:
+ self.Lookup(u, a, "exchange", "qpid.management", {"routingkey":"broker"}, "deny-log")
+ self.Lookup(u, a, "exchange", "qmf.default.topic", {"routingkey":"this3"}, "deny-log")
+ self.Lookup(u, a, "exchange", "qmf.default.direct", {"routingkey":"this4"}, "deny-log")
+ for a in ["access"]:
+ self.Lookup(u, a, "exchange", "qpid.management", {"routingkey":"broker"}, "allow-log")
+ self.Lookup(u, a, "exchange", "qmf.default.topic", {"routingkey":"this3"}, "allow-log")
+ self.Lookup(u, a, "exchange", "qmf.default.direct", {"routingkey":"this4"}, "allow-log")
+
+ # Test against queue size limits
+
+ self.Lookup('mrQ', 'create', 'queue', 'abc', {"maxqueuesize":"150", "maxqueuecount":"350"}, "allow")
+ self.Lookup('mrQ', 'create', 'queue', 'def', {"maxqueuesize":"99", "maxqueuecount":"350"}, "deny")
+ self.Lookup('mrQ', 'create', 'queue', 'uvw', {"maxqueuesize":"201", "maxqueuecount":"350"}, "deny")
+ self.Lookup('mrQ', 'create', 'queue', 'xyz', {"maxqueuesize":"150", "maxqueuecount":"299"}, "deny")
+ self.Lookup('mrQ', 'create', 'queue', '', {"maxqueuesize":"150", "maxqueuecount":"401"}, "deny")
+ self.Lookup('mrQ', 'create', 'queue', '', {"maxqueuesize":"0", "maxqueuecount":"401"}, "deny")
+ self.Lookup('mrQ', 'create', 'queue', '', {"maxqueuesize":"150", "maxqueuecount":"0" }, "deny")
+
+
+ #=====================================
+ # Connection limits
+ #=====================================
+
+ def test_connection_limits(self):
+ """
+ Test ACL control connection limits
+ """
+ # By username should be able to connect twice per user
+ try:
+ sessiona1 = self.get_session_by_port('anonymous','anonymous', self.port_u())
+ sessiona2 = self.get_session_by_port('anonymous','anonymous', self.port_u())
+ except Exception, e:
+ self.fail("Could not create two connections per user: " + str(e))
+
+ # Third session should fail
+ try:
+ sessiona3 = self.get_session_by_port('anonymous','anonymous', self.port_u())
+ self.fail("Should not be able to create third connection")
+ except Exception, e:
+ result = None
+
+ # By IP address should be able to connect twice per client address
+ try:
+ sessionb1 = self.get_session_by_port('anonymous','anonymous', self.port_i())
+ sessionb2 = self.get_session_by_port('anonymous','anonymous', self.port_i())
+ except Exception, e:
+ self.fail("Could not create two connections per user: " + str(e))
+
+ # Third session should fail
+ try:
+ sessionb3 = self.get_session_by_port('anonymous','anonymous', self.port_i())
+ self.fail("Should not be able to create third connection")
+ except Exception, e:
+ result = None
+
+
class BrokerAdmin:
def __init__(self, broker, username=None, password=None):
self.connection = qpid.messaging.Connection(broker)
diff --git a/qpid/cpp/src/tests/ais_check b/qpid/cpp/src/tests/ais_check
deleted file mode 100755
index a865260543..0000000000
--- a/qpid/cpp/src/tests/ais_check
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-srcdir=`dirname $0`
-
-# Check AIS requirements and run tests if found.
-ps -u root | grep 'aisexec\|corosync' >/dev/null || {
- echo WARNING: Skipping cluster tests, the aisexec or corosync daemon is not running.
- exit 0; # A warning, not a failure.
-}
-
-# Execute command with the ais group set if user is a member.
-with_ais_group() {
- if id -nG | grep '\<ais\>' >/dev/null; then sg ais -c "$*"
- else "$@"
- fi
-}
diff --git a/qpid/cpp/src/tests/brokertest.py b/qpid/cpp/src/tests/brokertest.py
index 3207a51b79..8255fbe9ac 100644
--- a/qpid/cpp/src/tests/brokertest.py
+++ b/qpid/cpp/src/tests/brokertest.py
@@ -436,6 +436,35 @@ class Cluster:
def __getitem__(self,index): return self._brokers[index]
def __iter__(self): return self._brokers.__iter__()
+
+def browse(session, queue, timeout=0, transform=lambda m: m.content):
+ """Return a list with the contents of each message on queue."""
+ r = session.receiver("%s;{mode:browse}"%(queue))
+ r.capacity = 100
+ try:
+ contents = []
+ try:
+ while True: contents.append(transform(r.fetch(timeout=timeout)))
+ except messaging.Empty: pass
+ finally: r.close()
+ return contents
+
+def assert_browse(session, queue, expect_contents, timeout=0, transform=lambda m: m.content, msg="browse failed"):
+ """Assert that the contents of messages on queue (as retrieved
+ using session and timeout) exactly match the strings in
+ expect_contents"""
+ actual_contents = browse(session, queue, timeout, transform=transform)
+ if msg: msg = "%s: %r != %r"%(msg, expect_contents, actual_contents)
+ assert expect_contents == actual_contents, msg
+
+def assert_browse_retry(session, queue, expect_contents, timeout=1, delay=.01, transform=lambda m:m.content, msg="browse failed"):
+ """Wait up to timeout for contents of queue to match expect_contents"""
+ test = lambda: browse(session, queue, 0, transform=transform) == expect_contents
+ retry(test, timeout, delay)
+ actual_contents = browse(session, queue, 0, transform=transform)
+ if msg: msg = "%s: %r != %r"%(msg, expect_contents, actual_contents)
+ assert expect_contents == actual_contents, msg
+
class BrokerTest(TestCase):
"""
Tracks processes started by test and kills at end of test.
@@ -501,30 +530,9 @@ class BrokerTest(TestCase):
cluster = Cluster(self, count, args, expect=expect, wait=wait, show_cmd=show_cmd)
return cluster
- def browse(self, session, queue, timeout=0, transform=lambda m: m.content):
- """Return a list with the contents of each message on queue."""
- r = session.receiver("%s;{mode:browse}"%(queue))
- r.capacity = 100
- try:
- contents = []
- try:
- while True: contents.append(transform(r.fetch(timeout=timeout)))
- except messaging.Empty: pass
- finally: r.close()
- return contents
-
- def assert_browse(self, session, queue, expect_contents, timeout=0, transform=lambda m: m.content):
- """Assert that the contents of messages on queue (as retrieved
- using session and timeout) exactly match the strings in
- expect_contents"""
- actual_contents = self.browse(session, queue, timeout, transform=transform)
- self.assertEqual(expect_contents, actual_contents)
-
- def assert_browse_retry(self, session, queue, expect_contents, timeout=1, delay=.01, transform=lambda m:m.content):
- """Wait up to timeout for contents of queue to match expect_contents"""
- test = lambda: self.browse(session, queue, 0, transform=transform) == expect_contents
- retry(test, timeout, delay)
- self.assertEqual(expect_contents, self.browse(session, queue, 0, transform=transform))
+ def browse(self, *args, **kwargs): browse(*args, **kwargs)
+ def assert_browse(self, *args, **kwargs): assert_browse(*args, **kwargs)
+ def assert_browse_retry(self, *args, **kwargs): assert_browse_retry(*args, **kwargs)
def join(thread, timeout=10):
thread.join(timeout)
diff --git a/qpid/cpp/src/tests/cluster.cmake b/qpid/cpp/src/tests/cluster.cmake
index 3471173e97..31e2d337d1 100644
--- a/qpid/cpp/src/tests/cluster.cmake
+++ b/qpid/cpp/src/tests/cluster.cmake
@@ -55,7 +55,7 @@ add_test (clustered_replication_test ${CMAKE_CURRENT_SOURCE_DIR}/clustered_repli
# CLEANFILES += cluster_test.acl cluster.ports
# EXTRA_DIST += \
-# ais_check \
+# cpg_check.sh.in \
# run_cluster_test \
# cluster_read_credit \
# test_watchdog \
diff --git a/qpid/cpp/src/tests/cluster.mk b/qpid/cpp/src/tests/cluster.mk
index 199d1e7b57..852b2dda8c 100644
--- a/qpid/cpp/src/tests/cluster.mk
+++ b/qpid/cpp/src/tests/cluster.mk
@@ -25,12 +25,11 @@
CLUSTER_TEST_SCRIPTS_LIST= \
allhosts rsynchosts \
qpid-build-rinstall qpid-src-rinstall \
- qpid-test-cluster \
- qpid-cluster-benchmark
+ qpid-test-cluster
EXTRA_DIST += \
$(CLUSTER_TEST_SCRIPTS_LIST) \
- ais_check \
+ cpg_check.sh.in \
run_cluster_test \
cluster_read_credit \
test_watchdog \
@@ -55,14 +54,12 @@ if HAVE_LIBCPG
#
# Cluster tests makefile fragment, to be included in Makefile.am
-#
+#
# NOTE: Programs using the openais library must be run with gid=ais
# You should do "newgrp ais" before running the tests to run these.
-#
-
+#
-# ais_check checks pre-requisites for cluster tests and runs them if ok.
TESTS += \
run_cluster_test \
cluster_read_credit \
diff --git a/qpid/cpp/src/tests/cluster_failover b/qpid/cpp/src/tests/cluster_failover
index 2a68d1ec79..43170c731a 100755
--- a/qpid/cpp/src/tests/cluster_failover
+++ b/qpid/cpp/src/tests/cluster_failover
@@ -11,8 +11,9 @@ echo $SEND $RECV
seq 1000000 > $SEND
-qpid-receive -f -a 'q;{create:always}' -b $URL --connection-options "{reconnect:true}" | tee $RECV &
-
-qpid-send -a 'q;{create:always}' -b $URL --connection-options "{reconnect:true}" --send-rate 10 --content-stdin < $SEND &
+qpid-send -a 'cluster_failover;{create:always}' -b $URL --connection-options "{reconnect:true}" --send-rate 10 --content-stdin < $SEND &
+while msg=$(qpid-receive -m1 -f -a 'cluster_failover;{create:always}' -b $URL --connection-options "{reconnect:true,heartbeat:1}"); do
+ echo -n $msg; date
+done
wait
diff --git a/qpid/cpp/src/tests/cluster_python_tests b/qpid/cpp/src/tests/cluster_python_tests
index 8e17ffc8bc..25c7889246 100755
--- a/qpid/cpp/src/tests/cluster_python_tests
+++ b/qpid/cpp/src/tests/cluster_python_tests
@@ -20,7 +20,8 @@
#
# Skip if cluster services not running.
-. `dirname $0`/ais_check
+. cpg_check.sh
+cpg_enabled || exit 0
FAILING=`dirname $0`/cluster_python_tests_failing.txt
source `dirname $0`/python_tests
diff --git a/qpid/cpp/src/tests/cluster_read_credit b/qpid/cpp/src/tests/cluster_read_credit
index fb3b72fbaf..552ffee53b 100755
--- a/qpid/cpp/src/tests/cluster_read_credit
+++ b/qpid/cpp/src/tests/cluster_read_credit
@@ -21,7 +21,9 @@
# Regression test for http://issues.apache.org/jira/browse/QPID-2086
srcdir=`dirname $0`
-. $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
+
$srcdir/start_cluster 1 --cluster-read-max=2 || exit 1
trap $srcdir/stop_cluster EXIT
seq 1 10000 | ./sender --port `cat cluster.ports` --routing-key no-such-queue
diff --git a/qpid/cpp/src/tests/cluster_test_logs.py b/qpid/cpp/src/tests/cluster_test_logs.py
index 3c7e8e8020..003d82c619 100755
--- a/qpid/cpp/src/tests/cluster_test_logs.py
+++ b/qpid/cpp/src/tests/cluster_test_logs.py
@@ -60,11 +60,13 @@ def filter_log(log):
'task late',
'task overran',
'warning CLOSING .* unsent data',
- 'Inter-broker link ',
+ 'Inter-broker link ', # ignore link state changes
+ 'Updated link key from ', # ignore link state changes
'Running in a cluster, marking store',
'debug Sending keepalive signal to watchdog', # Watchdog timer thread
'last broker standing joined by 1 replicas, updating queue policies.',
- 'Connection .* timed out: closing' # heartbeat connection close
+ 'Connection .* timed out: closing', # heartbeat connection close
+ "org.apache.qpid.broker:bridge:" # ignore bridge index
])
# Regex to match a UUID
uuid='\w\w\w\w\w\w\w\w-\w\w\w\w-\w\w\w\w-\w\w\w\w-\w\w\w\w\w\w\w\w\w\w\w\w'
diff --git a/qpid/cpp/src/tests/cluster_tests.py b/qpid/cpp/src/tests/cluster_tests.py
index 79df21aada..8952f5de7b 100755
--- a/qpid/cpp/src/tests/cluster_tests.py
+++ b/qpid/cpp/src/tests/cluster_tests.py
@@ -767,6 +767,124 @@ acl deny all all
cluster.start()
fetch(cluster[2])
+
+ def test_federation_failover(self):
+ """
+ Verify that federation operates across failures occuring in a cluster.
+ Specifically:
+ 1) Destination cluster learns of membership changes in the source
+ cluster
+ 2) Destination cluster replicates the current state of the source
+ cluster to newly-added members
+ """
+
+ TIMEOUT = 30
+ def verify(src_broker, src, dst_broker, dst, timeout=TIMEOUT):
+ """ Prove that traffic can pass from source fed broker to
+ destination fed broker
+ """
+ tot_time = 0
+ active = False
+ send_session = src_broker.connect().session()
+ sender = send_session.sender(src)
+ receive_session = dst_broker.connect().session()
+ receiver = receive_session.receiver(dst)
+ while not active and tot_time < timeout:
+ sender.send(Message("Hello from Source!"))
+ try:
+ receiver.fetch(timeout = 1)
+ receive_session.acknowledge()
+ # Get this far without Empty exception, and the link is good!
+ active = True
+ while True:
+ # Keep receiving msgs, as several may have accumulated
+ receiver.fetch(timeout = 1)
+ receive_session.acknowledge()
+ except Empty:
+ if not active:
+ tot_time += 1
+ receiver.close()
+ receive_session.close()
+ sender.close()
+ send_session.close()
+ self.assertTrue(active, "Bridge failed to become active")
+
+
+ # 2 node cluster source, 2 node cluster destination
+ src_cluster = self.cluster(2, expect=EXPECT_EXIT_FAIL)
+ src_cluster.ready();
+ dst_cluster = self.cluster(2, expect=EXPECT_EXIT_FAIL)
+ dst_cluster.ready();
+
+ cmd = self.popen(["qpid-config",
+ "--broker", src_cluster[0].host_port(),
+ "add", "queue", "srcQ"], EXPECT_EXIT_OK)
+ cmd.wait()
+
+ cmd = self.popen(["qpid-config",
+ "--broker", dst_cluster[0].host_port(),
+ "add", "exchange", "fanout", "destX"], EXPECT_EXIT_OK)
+ cmd.wait()
+
+ cmd = self.popen(["qpid-config",
+ "--broker", dst_cluster[0].host_port(),
+ "add", "queue", "destQ"], EXPECT_EXIT_OK)
+ cmd.wait()
+
+ cmd = self.popen(["qpid-config",
+ "--broker", dst_cluster[0].host_port(),
+ "bind", "destX", "destQ"], EXPECT_EXIT_OK)
+ cmd.wait()
+
+ # federate the srcQ to the destination exchange
+ dst_cluster[0].startQmf()
+ dst_broker = dst_cluster[0].qmf_session.getObjects(_class="broker")[0]
+ result = dst_broker.connect(src_cluster[0].host(), src_cluster[0].port(), False, "PLAIN",
+ "guest", "guest", "tcp")
+ self.assertEqual(result.status, 0, result);
+
+ link = dst_cluster[0].qmf_session.getObjects(_class="link")[0]
+ result = link.bridge(False, "srcQ", "destX", "", "", "", True, False, False, 10)
+ self.assertEqual(result.status, 0, result)
+
+ # check that traffic passes
+ verify(src_cluster[0], "srcQ", dst_cluster[0], "destQ")
+
+ # add src[2] broker to source cluster
+ src_cluster.start(expect=EXPECT_EXIT_FAIL);
+ src_cluster.ready();
+ verify(src_cluster[2], "srcQ", dst_cluster[0], "destQ")
+
+ # Kill src[0]. dst[0] should fail over to src[1]
+ src_cluster[0].kill()
+ for b in src_cluster[1:]: b.ready()
+ verify(src_cluster[1], "srcQ", dst_cluster[0], "destQ")
+
+ # Kill src[1], dst[0] should fail over to src[2]
+ src_cluster[1].kill()
+ for b in src_cluster[2:]: b.ready()
+ verify(src_cluster[2], "srcQ", dst_cluster[0], "destQ")
+
+ # Kill dest[0], force failover to dest[1]
+ dst_cluster[0].kill()
+ for b in dst_cluster[1:]: b.ready()
+ verify(src_cluster[2], "srcQ", dst_cluster[1], "destQ")
+
+ # Add dest[2]
+ # dest[1] syncs dest[2] to current remote state
+ dst_cluster.start(expect=EXPECT_EXIT_FAIL);
+ for b in dst_cluster[1:]: b.ready()
+ verify(src_cluster[2], "srcQ", dst_cluster[1], "destQ")
+
+ # Kill dest[1], force failover to dest[2]
+ dst_cluster[1].kill()
+ for b in dst_cluster[2:]: b.ready()
+ verify(src_cluster[2], "srcQ", dst_cluster[2], "destQ")
+
+ for i in range(2, len(src_cluster)): src_cluster[i].kill()
+ for i in range(2, len(dst_cluster)): dst_cluster[i].kill()
+
+
# Some utility code for transaction tests
XA_RBROLLBACK = 1
XA_RBTIMEOUT = 2
diff --git a/qpid/cpp/src/tests/clustered_replication_test b/qpid/cpp/src/tests/clustered_replication_test
index 8c8522c2eb..5a9f143eb4 100755
--- a/qpid/cpp/src/tests/clustered_replication_test
+++ b/qpid/cpp/src/tests/clustered_replication_test
@@ -8,9 +8,9 @@
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -34,11 +34,11 @@ stop_brokers() {
if [[ $PRIMARY1 ]] ; then
$QPIDD_EXEC --no-module-dir -q --port $PRIMARY1
unset PRIMARY1
- fi
+ fi
if [[ $PRIMARY2 ]] ; then
$QPIDD_EXEC --no-module-dir -q --port $PRIMARY2
unset PRIMARY2
- fi
+ fi
if [[ $DR1 ]] ; then
$QPIDD_EXEC --no-module-dir -q --port $DR1
unset DR1
@@ -50,7 +50,8 @@ stop_brokers() {
}
if test -d $PYTHON_DIR; then
- . $srcdir/ais_check
+ . cpg_check.sh
+ cpg_enabled || exit 0
#todo: these cluster names need to be unique to prevent clashes
PRIMARY_CLUSTER=PRIMARY_$(hostname)_$$
@@ -89,20 +90,20 @@ if test -d $PYTHON_DIR; then
#send more messages to primary
for i in `seq 11 20`; do echo Message$i; done | ./sender --port $PRIMARY1 --send-eos 1
- #wait for replication events to all be processed:
+ #wait for replication events to all be processed:
echo Waiting for replication to complete
echo Done | ./sender --port $PRIMARY1 --routing-key control-queue --send-eos 1
./receiver --queue control-queue --port $DR1 > /dev/null
#verify contents of test queue on dr cluster:
- echo Verifying...
+ echo Verifying...
./receiver --port $DR2 > repl.out.tmp
for i in `seq 6 20`; do echo Message$i; done | diff repl.out.tmp - || FAIL=1
if [[ $FAIL ]]; then
echo Clustered replication test failed: expectations not met!
exit 1
- else
+ else
echo Clustered replication test passed
rm -f repl*.tmp
fi
diff --git a/qpid/cpp/src/tests/cpg_check.sh.in b/qpid/cpp/src/tests/cpg_check.sh.in
new file mode 100755
index 0000000000..ed97776218
--- /dev/null
+++ b/qpid/cpp/src/tests/cpg_check.sh.in
@@ -0,0 +1,38 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+QPID_USE_CPG=${QPID_USE_CPG:-@USE_CPG@}
+
+# Check if CPG is enabled
+cpg_enabled() {
+ test x$QPID_USE_CPG = xyes || return 1 # disabled
+ ps -u root | grep 'aisexec\|corosync' >/dev/null || {
+ echo WARNING: Skip cluster tests, aisexec or corosync daemon is not running.
+ return 1; # A warning, not a failure.
+ }
+ return 0
+}
+
+# Execute command with the ais group set if user is a member.
+with_ais_group() {
+ if id -nG | grep '\<ais\>' >/dev/null; then sg ais -c "$*"
+ else "$@"
+ fi
+}
diff --git a/qpid/cpp/src/tests/federated_cluster_test b/qpid/cpp/src/tests/federated_cluster_test
index 50b877e666..f42b7501b8 100755
--- a/qpid/cpp/src/tests/federated_cluster_test
+++ b/qpid/cpp/src/tests/federated_cluster_test
@@ -8,9 +8,9 @@
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -35,7 +35,7 @@ stop_brokers() {
if [[ $BROKER_A ]] ; then
../qpidd --no-module-dir -q --port $BROKER_A
unset BROKER_A
- fi
+ fi
if [[ $NODE_1 ]] ; then
../qpidd --no-module-dir -q --port $NODE_1
unset NODE_1
@@ -92,7 +92,7 @@ run_test_pull_to_cluster_two_consumers() {
wait
sort -g -k 2 fed1.out.tmp fed2.out.tmp > fed.out.tmp
diff fed.in.tmp fed.out.tmp || fail "federated link to cluster failed: expectations not met!"
-
+
rm -f fed*.tmp #cleanup
}
@@ -106,7 +106,7 @@ run_test_pull_to_cluster() {
#verify all messages are received
diff fed.in.tmp fed.out.tmp || fail "federated link to cluster failed: expectations not met!"
-
+
rm -f fed*.tmp #cleanup
}
@@ -121,22 +121,23 @@ run_test_pull_from_cluster() {
#verify all messages are received
wait
diff fed.in.tmp fed.out.tmp || fail "federated link from cluster failed: expectations not met!"
-
+
rm -f fed*.tmp #cleanup
}
if test -d ${PYTHON_DIR}; then
- . $srcdir/ais_check
+ . cpg_check.sh
+ cpg_enabled || exit 0
rm -f fed*.tmp #cleanup any files left from previous run
start_brokers
echo "brokers started"
setup
echo "setup completed"
- run_test_pull_to_cluster_two_consumers
+ run_test_pull_to_cluster_two_consumers
echo "federated link to cluster verified"
- run_test_pull_from_cluster
+ run_test_pull_from_cluster
echo "federated link from cluster verified"
if [[ $TEST_NODE_FAILURE ]] ; then
#kill first cluster node and retest
@@ -146,7 +147,7 @@ if test -d ${PYTHON_DIR}; then
echo "retesting..."
run_test_pull_to_cluster
echo "federated link to cluster verified"
- run_test_pull_from_cluster
- echo "federated link from cluster verified"
+ run_test_pull_from_cluster
+ echo "federated link from cluster verified"
fi
fi
diff --git a/qpid/cpp/src/tests/ha_tests.py b/qpid/cpp/src/tests/ha_tests.py
index 822e07c702..827cb7dca9 100755
--- a/qpid/cpp/src/tests/ha_tests.py
+++ b/qpid/cpp/src/tests/ha_tests.py
@@ -19,27 +19,32 @@
#
import os, signal, sys, time, imp, re, subprocess, glob, random, logging, shutil, math
-from qpid.messaging import Message, NotFound, ConnectionError, Connection
+from qpid.messaging import Message, NotFound, ConnectionError, ReceiverError, Connection
from qpid.datatypes import uuid4
from brokertest import *
from threading import Thread, Lock, Condition
from logging import getLogger, WARN, ERROR, DEBUG
from qpidtoollibs import BrokerAgent
-log = getLogger("qpid.ha-tests")
+log = getLogger(__name__)
class HaBroker(Broker):
- def __init__(self, test, args=[], broker_url=None, ha_cluster=True, **kwargs):
+ def __init__(self, test, args=[], broker_url=None, ha_cluster=True,
+ ha_replicate="all", **kwargs):
assert BrokerTest.ha_lib, "Cannot locate HA plug-in"
args = copy(args)
- args.extend(["--load-module", BrokerTest.ha_lib,
- # FIXME aconway 2012-02-13: workaround slow link failover.
- "--link-maintenace-interval=0.1",
- "--ha-cluster=%s"%ha_cluster])
+ args += ["--load-module", BrokerTest.ha_lib,
+ "--log-enable=info+", "--log-enable=debug+:ha::",
+ # FIXME aconway 2012-02-13: workaround slow link failover.
+ "--link-maintenace-interval=0.1",
+ "--ha-cluster=%s"%ha_cluster]
+ if ha_replicate is not None:
+ args += [ "--ha-replicate=%s"%ha_replicate ]
if broker_url: args.extend([ "--ha-brokers", broker_url ])
Broker.__init__(self, test, args, **kwargs)
self.commands=os.getenv("PYTHON_COMMANDS")
assert os.path.isdir(self.commands)
+ getLogger().setLevel(ERROR) # Hide expected WARNING log messages from failover.
def promote(self):
assert os.system("%s/qpid-ha promote -b %s"%(self.commands, self.host_port())) == 0
@@ -64,6 +69,23 @@ class HaBroker(Broker):
assert os.system(
"%s/qpid-config --broker=%s add queue %s --replicate %s"%(self.commands, self.host_port(), queue, replication)) == 0
+ def connect_admin(self, **kwargs):
+ return Broker.connect(self, client_properties={"qpid.ha-admin":1}, **kwargs)
+
+ def wait_backup(self, address):
+ """Wait for address to become valid on a backup broker."""
+ bs = self.connect_admin().session()
+ try: wait_address(bs, address)
+ finally: bs.connection.close()
+
+ def assert_browse_backup(self, queue, expected, **kwargs):
+ """Combines wait_backup and assert_browse_retry."""
+ bs = self.connect_admin().session()
+ try:
+ wait_address(bs, queue)
+ assert_browse_retry(bs, queue, expected, **kwargs)
+ finally: bs.connection.close()
+
class HaCluster(object):
_cluster_count = 0
@@ -72,9 +94,9 @@ class HaCluster(object):
self.test = test
self._brokers = [ HaBroker(test, name="broker%s-%s"%(HaCluster._cluster_count, i), **kwargs) for i in xrange(n)]
HaCluster._cluster_count += 1
- self[0].promote()
self.url = ",".join([b.host_port() for b in self])
for b in self: b.set_broker_url(self.url)
+ self[0].promote()
def connect(self, i):
"""Connect with reconnect_urls"""
@@ -97,50 +119,29 @@ class HaCluster(object):
def __getitem__(self,index): return self._brokers[index]
def __iter__(self): return self._brokers.__iter__()
-
-def qr_node(value="all"): return "node:{x-declare:{arguments:{'qpid.replicate':%s}}}" % value
-
-class ShortTests(BrokerTest):
- """Short HA functionality tests."""
-
- # Wait for an address to become valid.
- def wait(self, session, address):
- def check():
- try:
- session.sender(address)
- return True
- except NotFound: return False
- assert retry(check), "Timed out waiting for address %s"%(address)
-
- # Wait for address to become valid on a backup broker.
- def wait_backup(self, backup, address):
- bs = self.connect_admin(backup).session()
- self.wait(bs, address)
- bs.connection.close()
-
- # Combines wait_backup and assert_browse_retry
- def assert_browse_backup(self, backup, queue, expected, **kwargs):
- bs = self.connect_admin(backup).session()
- self.wait(bs, queue)
- self.assert_browse_retry(bs, queue, expected, **kwargs)
- bs.connection.close()
-
- def assert_missing(self, session, address):
+def wait_address(session, address):
+ """Wait for an address to become valid."""
+ def check():
try:
- session.receiver(address)
- self.fail("Should not have been replicated: %s"%(address))
- except NotFound: pass
+ session.sender(address)
+ return True
+ except NotFound: return False
+ assert retry(check), "Timed out waiting for address %s"%(address)
+
+def assert_missing(session, address):
+ """Assert that the address is _not_ valid"""
+ try:
+ session.receiver(address)
+ self.fail("Expected NotFound: %s"%(address))
+ except NotFound: pass
- def connect_admin(self, backup, **kwargs):
- """Connect to a backup broker as an admin connection"""
- return backup.connect(client_properties={"qpid.ha-admin":1}, **kwargs)
+class ReplicationTests(BrokerTest):
+ """Correctness tests for HA replication."""
def test_replication(self):
"""Test basic replication of configuration and messages before and
after backup has connected"""
- getLogger().setLevel(ERROR) # Hide expected WARNING log messages from failover.
-
def queue(name, replicate):
return "%s;{create:always,node:{x-declare:{arguments:{'qpid.replicate':%s}}}}"%(name, replicate)
@@ -170,9 +171,8 @@ class ShortTests(BrokerTest):
def verify(b, prefix, p):
"""Verify setup was replicated to backup b"""
-
# Wait for configuration to replicate.
- self.wait(b, prefix+"x");
+ wait_address(b, prefix+"x");
self.assert_browse_retry(b, prefix+"q1", ["b", "1", "4"])
self.assertEqual(p.receiver(prefix+"q1").fetch(timeout=0).content, "b")
@@ -180,7 +180,7 @@ class ShortTests(BrokerTest):
self.assert_browse_retry(b, prefix+"q1", ["1", "4"])
self.assert_browse_retry(b, prefix+"q2", []) # configuration only
- self.assert_missing(b, prefix+"q3")
+ assert_missing(b, prefix+"q3")
b.sender(prefix+"e1").send(Message(prefix+"e1")) # Verify binds with replicate=all
self.assert_browse_retry(b, prefix+"q1", ["1", "4", prefix+"e1"])
b.sender(prefix+"e2").send(Message(prefix+"e2")) # Verify binds with replicate=configuration
@@ -200,12 +200,12 @@ class ShortTests(BrokerTest):
setup(p, "2", primary)
# Verify the data on the backup
- b = self.connect_admin(backup).session()
+ b = backup.connect_admin().session()
verify(b, "1", p)
verify(b, "2", p)
# Test a series of messages, enqueue all then dequeue all.
s = p.sender(queue("foo","all"))
- self.wait(b, "foo")
+ wait_address(b, "foo")
msgs = [str(i) for i in range(10)]
for m in msgs: s.send(Message(m))
self.assert_browse_retry(p, "foo", msgs)
@@ -227,12 +227,10 @@ class ShortTests(BrokerTest):
self.assert_browse_retry(b, "foo", msgs[i+1:])
def test_sync(self):
- def queue(name, replicate):
- return "%s;{create:always,%s}"%(name, qr_node(replicate))
primary = HaBroker(self, name="primary")
primary.promote()
p = primary.connect().session()
- s = p.sender(queue("q","all"))
+ s = p.sender("q;{create:always}")
for m in [str(i) for i in range(0,10)]: s.send(m)
s.sync()
backup1 = HaBroker(self, name="backup1", broker_url=primary.host_port())
@@ -243,50 +241,39 @@ class ShortTests(BrokerTest):
s.sync()
msgs = [str(i) for i in range(30)]
- b1 = self.connect_admin(backup1).session()
- self.wait(b1, "q");
+ b1 = backup1.connect_admin().session()
+ wait_address(b1, "q");
self.assert_browse_retry(b1, "q", msgs)
- b2 = self.connect_admin(backup2).session()
- self.wait(b2, "q");
+ b2 = backup2.connect_admin().session()
+ wait_address(b2, "q");
self.assert_browse_retry(b2, "q", msgs)
def test_send_receive(self):
"""Verify sequence numbers of messages sent by qpid-send"""
- getLogger().setLevel(ERROR) # Hide expected WARNING log messages from failover.
- primary = HaBroker(self, name="primary")
- primary.promote()
- backup1 = HaBroker(self, name="backup1", broker_url=primary.host_port())
- backup2 = HaBroker(self, name="backup2", broker_url=primary.host_port())
+ brokers = HaCluster(self, 3)
sender = self.popen(
["qpid-send",
- "--broker", primary.host_port(),
- "--address", "q;{create:always,%s}"%(qr_node("all")),
+ "--broker", brokers[0].host_port(),
+ "--address", "q;{create:always}",
"--messages=1000",
"--content-string=x"
])
receiver = self.popen(
["qpid-receive",
- "--broker", primary.host_port(),
- "--address", "q;{create:always,%s}"%(qr_node("all")),
+ "--broker", brokers[0].host_port(),
+ "--address", "q;{create:always}",
"--messages=990",
"--timeout=10"
])
- try:
- self.assertEqual(sender.wait(), 0)
- self.assertEqual(receiver.wait(), 0)
- expect = [long(i) for i in range(991, 1001)]
- sn = lambda m: m.properties["sn"]
- self.assert_browse_retry(self.connect_admin(backup1).session(), "q", expect, transform=sn)
- self.assert_browse_retry(self.connect_admin(backup2).session(), "q", expect, transform=sn)
- except:
- print self.browse(primary.connect().session(), "q", transform=sn)
- print self.browse(self.connect_admin(backup1).session(), "q", transform=sn)
- print self.browse(self.connect_admin(backup2).session(), "q", transform=sn)
- raise
+ self.assertEqual(sender.wait(), 0)
+ self.assertEqual(receiver.wait(), 0)
+ expect = [long(i) for i in range(991, 1001)]
+ sn = lambda m: m.properties["sn"]
+ brokers[1].assert_browse_backup("q", expect, transform=sn)
+ brokers[2].assert_browse_backup("q", expect, transform=sn)
def test_failover_python(self):
"""Verify that backups rejects connections and that fail-over works in python client"""
- getLogger().setLevel(ERROR) # Hide expected WARNING log messages from failover.
primary = HaBroker(self, name="primary", expect=EXPECT_EXIT_FAIL)
primary.promote()
backup = HaBroker(self, name="backup", broker_url=primary.host_port())
@@ -296,13 +283,13 @@ class ShortTests(BrokerTest):
self.fail("Expected connection to backup to fail")
except ConnectionError: pass
# Check that admin connections are allowed to backup.
- self.connect_admin(backup).close()
+ backup.connect_admin().close()
# Test discovery: should connect to primary after reject by backup
c = backup.connect(reconnect_urls=[primary.host_port(), backup.host_port()], reconnect=True)
s = c.session()
- sender = s.sender("q;{create:always,%s}"%(qr_node()))
- self.wait_backup(backup, "q")
+ sender = s.sender("q;{create:always}")
+ backup.wait_backup("q")
sender.send("foo")
primary.kill()
assert retry(lambda: not is_running(primary.pid))
@@ -316,14 +303,14 @@ class ShortTests(BrokerTest):
primary.promote()
backup = HaBroker(self, name="backup", broker_url=primary.host_port())
url="%s,%s"%(primary.host_port(), backup.host_port())
- primary.connect().session().sender("q;{create:always,%s}"%(qr_node()))
- self.wait_backup(backup, "q")
+ primary.connect().session().sender("q;{create:always}")
+ backup.wait_backup("q")
sender = NumberedSender(primary, url=url, queue="q", failover_updates = False)
receiver = NumberedReceiver(primary, url=url, queue="q", failover_updates = False)
receiver.start()
sender.start()
- self.wait_backup(backup, "q")
+ backup.wait_backup("q")
assert retry(lambda: receiver.received > 10) # Wait for some messages to get thru
primary.kill()
@@ -337,109 +324,107 @@ class ShortTests(BrokerTest):
def test_backup_failover(self):
"""Verify that a backup broker fails over and recovers queue state"""
brokers = HaCluster(self, 3)
- brokers[0].connect().session().sender(
- "q;{create:always,%s}"%(qr_node())).send("a")
- for b in brokers[1:]: self.assert_browse_backup(b, "q", ["a"])
+ brokers[0].connect().session().sender("q;{create:always}").send("a")
+ for b in brokers[1:]: b.assert_browse_backup("q", ["a"], msg=b)
brokers[0].expect = EXPECT_EXIT_FAIL
brokers.kill(0)
brokers[1].connect().session().sender("q").send("b")
- self.assert_browse_backup(brokers[2], "q", ["a","b"])
+ brokers[2].assert_browse_backup("q", ["a","b"])
s = brokers[1].connect().session()
self.assertEqual("a", s.receiver("q").fetch().content)
s.acknowledge()
- self.assert_browse_backup(brokers[2], "q", ["b"])
+ brokers[2].assert_browse_backup("q", ["b"])
def test_qpid_config_replication(self):
"""Set up replication via qpid-config"""
brokers = HaCluster(self,2)
brokers[0].config_declare("q","all")
brokers[0].connect().session().sender("q").send("foo")
- self.assert_browse_backup(brokers[1], "q", ["foo"])
+ brokers[1].assert_browse_backup("q", ["foo"])
def test_standalone_queue_replica(self):
"""Test replication of individual queues outside of cluster mode"""
- getLogger().setLevel(ERROR) # Hide expected WARNING log messages from failover.
- primary = HaBroker(self, name="primary", ha_cluster=False, args=["--log-enable=debug+"])
+ primary = HaBroker(self, name="primary", ha_cluster=False)
pc = primary.connect()
ps = pc.session().sender("q;{create:always}")
pr = pc.session().receiver("q;{create:always}")
- backup = HaBroker(self, name="backup", ha_cluster=False, args=["--log-enable=debug+"])
+ backup = HaBroker(self, name="backup", ha_cluster=False)
br = backup.connect().session().receiver("q;{create:always}")
# Set up replication with qpid-ha
backup.replicate(primary.host_port(), "q")
ps.send("a")
- self.assert_browse_backup(backup, "q", ["a"])
+ backup.assert_browse_backup("q", ["a"])
ps.send("b")
- self.assert_browse_backup(backup, "q", ["a", "b"])
+ backup.assert_browse_backup("q", ["a", "b"])
self.assertEqual("a", pr.fetch().content)
pr.session.acknowledge()
- self.assert_browse_backup(backup, "q", ["b"])
+ backup.assert_browse_backup("q", ["b"])
# Set up replication with qpid-config
ps2 = pc.session().sender("q2;{create:always}")
backup.config_replicate(primary.host_port(), "q2");
ps2.send("x")
- self.assert_browse_backup(backup, "q2", ["x"])
+ backup.assert_browse_backup("q2", ["x"])
def test_queue_replica_failover(self):
"""Test individual queue replication from a cluster to a standalone backup broker, verify it fails over."""
- getLogger().setLevel(ERROR) # Hide expected WARNING log messages from failover.
cluster = HaCluster(self, 2)
primary = cluster[0]
pc = cluster.connect(0)
- ps = pc.session().sender("q;{create:always,%s}"%qr_node("all"))
- pr = pc.session().receiver("q;{create:always,%s}"%qr_node("all"))
- backup = HaBroker(self, name="backup", ha_cluster=False, args=["--log-enable=debug+"])
+ ps = pc.session().sender("q;{create:always}")
+ pr = pc.session().receiver("q;{create:always}")
+ backup = HaBroker(self, name="backup", ha_cluster=False)
br = backup.connect().session().receiver("q;{create:always}")
backup.replicate(cluster.url, "q")
ps.send("a")
- self.assert_browse_backup(backup, "q", ["a"])
+ backup.assert_browse_backup("q", ["a"])
cluster.bounce(0)
- self.assert_browse_backup(backup, "q", ["a"])
+ backup.assert_browse_backup("q", ["a"])
ps.send("b")
- self.assert_browse_backup(backup, "q", ["a", "b"])
+ backup.assert_browse_backup("q", ["a", "b"])
cluster.bounce(1)
self.assertEqual("a", pr.fetch().content)
pr.session.acknowledge()
- self.assert_browse_backup(backup, "q", ["b"])
+ backup.assert_browse_backup("q", ["b"])
def test_lvq(self):
"""Verify that we replicate to an LVQ correctly"""
primary = HaBroker(self, name="primary")
primary.promote()
backup = HaBroker(self, name="backup", broker_url=primary.host_port())
- s = primary.connect().session().sender("lvq; {create:always, node:{x-declare:{arguments:{'qpid.last_value_queue_key':lvq-key, 'qpid.replicate':all}}}}")
+ s = primary.connect().session().sender("lvq; {create:always, node:{x-declare:{arguments:{'qpid.last_value_queue_key':lvq-key}}}}")
def send(key,value): s.send(Message(content=value,properties={"lvq-key":key}))
for kv in [("a","a-1"),("b","b-1"),("a","a-2"),("a","a-3"),("c","c-1"),("c","c-2")]:
send(*kv)
- self.assert_browse_backup(backup, "lvq", ["b-1", "a-3", "c-2"])
+ backup.assert_browse_backup("lvq", ["b-1", "a-3", "c-2"])
send("b","b-2")
- self.assert_browse_backup(backup, "lvq", ["a-3", "c-2", "b-2"])
+ backup.assert_browse_backup("lvq", ["a-3", "c-2", "b-2"])
send("c","c-3")
- self.assert_browse_backup(backup, "lvq", ["a-3", "b-2", "c-3"])
+ backup.assert_browse_backup("lvq", ["a-3", "b-2", "c-3"])
send("d","d-1")
- self.assert_browse_backup(backup, "lvq", ["a-3", "b-2", "c-3", "d-1"])
+ backup.assert_browse_backup("lvq", ["a-3", "b-2", "c-3", "d-1"])
def test_ring(self):
+ """Test replication with the ring queue policy"""
primary = HaBroker(self, name="primary")
primary.promote()
backup = HaBroker(self, name="backup", broker_url=primary.host_port())
- s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':ring, 'qpid.max_count':5, 'qpid.replicate':all}}}}")
+ s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':ring, 'qpid.max_count':5}}}}")
for i in range(10): s.send(Message(str(i)))
- self.assert_browse_backup(backup, "q", [str(i) for i in range(5,10)])
+ backup.assert_browse_backup("q", [str(i) for i in range(5,10)])
def test_reject(self):
- getLogger().setLevel(ERROR) # Hide expected WARNING log messages from failover.
+ """Test replication with the reject queue policy"""
primary = HaBroker(self, name="primary")
primary.promote()
backup = HaBroker(self, name="backup", broker_url=primary.host_port())
- s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':reject, 'qpid.max_count':5, 'qpid.replicate':all}}}}")
+ s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':reject, 'qpid.max_count':5}}}}")
try:
for i in range(10): s.send(Message(str(i)), sync=False)
except qpid.messaging.exceptions.TargetCapacityExceeded: pass
- self.assert_browse_backup(backup, "q", [str(i) for i in range(0,5)])
+ backup.assert_browse_backup("q", [str(i) for i in range(0,5)])
def test_priority(self):
"""Verify priority queues replicate correctly"""
@@ -447,12 +432,12 @@ class ShortTests(BrokerTest):
primary.promote()
backup = HaBroker(self, name="backup", broker_url=primary.host_port())
session = primary.connect().session()
- s = session.sender("priority-queue; {create:always, node:{x-declare:{arguments:{'qpid.priorities':10, 'qpid.replicate':all}}}}")
+ s = session.sender("priority-queue; {create:always, node:{x-declare:{arguments:{'qpid.priorities':10}}}}")
priorities = [8,9,5,1,2,2,3,4,9,7,8,9,9,2]
for p in priorities: s.send(Message(priority=p))
# Can't use browse_backup as browser sees messages in delivery order not priority.
- self.wait_backup(backup, "priority-queue")
- r = self.connect_admin(backup).session().receiver("priority-queue")
+ backup.wait_backup("priority-queue")
+ r = backup.connect_admin().session().receiver("priority-queue")
received = [r.fetch().priority for i in priorities]
self.assertEqual(sorted(priorities, reverse=True), received)
@@ -466,11 +451,11 @@ class ShortTests(BrokerTest):
priorities = [4,5,3,7,8,8,2,8,2,8,8,16,6,6,6,6,6,6,8,3,5,8,3,5,5,3,3,8,8,3,7,3,7,7,7,8,8,8,2,3]
limits={7:0,6:4,5:3,4:2,3:2,2:2,1:2}
limit_policy = ",".join(["'qpid.fairshare':5"] + ["'qpid.fairshare-%s':%s"%(i[0],i[1]) for i in limits.iteritems()])
- s = session.sender("priority-queue; {create:always, node:{x-declare:{arguments:{'qpid.priorities':%s, %s, 'qpid.replicate':all}}}}"%(levels,limit_policy))
+ s = session.sender("priority-queue; {create:always, node:{x-declare:{arguments:{'qpid.priorities':%s, %s}}}}"%(levels,limit_policy))
messages = [Message(content=str(uuid4()), priority = p) for p in priorities]
for m in messages: s.send(m)
- self.wait_backup(backup, s.target)
- r = self.connect_admin(backup).session().receiver("priority-queue")
+ backup.wait_backup(s.target)
+ r = backup.connect_admin().session().receiver("priority-queue")
received = [r.fetch().content for i in priorities]
sort = sorted(messages, key=lambda m: priority_level(m.priority, levels), reverse=True)
fair = [m.content for m in fairshare(sort, lambda l: limits.get(l,0), levels)]
@@ -480,16 +465,99 @@ class ShortTests(BrokerTest):
primary = HaBroker(self, name="primary")
primary.promote()
backup = HaBroker(self, name="backup", broker_url=primary.host_port())
- s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':ring, 'qpid.max_count':5, 'qpid.priorities':10, 'qpid.replicate':all}}}}")
+ s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':ring, 'qpid.max_count':5, 'qpid.priorities':10}}}}")
priorities = [8,9,5,1,2,2,3,4,9,7,8,9,9,2]
for p in priorities: s.send(Message(priority=p))
- # FIXME aconway 2012-02-22: there is a bug in priority ring queues that allows a low
- # priority message to displace a high one. The following commented-out assert_browse
- # is for the correct result, the uncommented one is for the actualy buggy result.
- # See https://issues.apache.org/jira/browse/QPID-3866
+
+ # FIXME aconway 2012-02-22: there is a bug in priority ring
+ # queues that allows a low priority message to displace a high
+ # one. The following commented-out assert_browse is for the
+ # correct result, the uncommented one is for the actualy buggy
+ # result. See https://issues.apache.org/jira/browse/QPID-3866
#
- # self.assert_browse_backup(backup, "q", sorted(priorities,reverse=True)[0:5], transform=lambda m: m.priority)
- self.assert_browse_backup(backup, "q", [9,9,9,9,2], transform=lambda m: m.priority)
+ # backup.assert_browse_backup("q", sorted(priorities,reverse=True)[0:5], transform=lambda m: m.priority)
+ backup.assert_browse_backup("q", [9,9,9,9,2], transform=lambda m: m.priority)
+
+ def test_backup_acquired(self):
+ """Verify that acquired messages are backed up, for all queue types."""
+ class Test:
+ def __init__(self, queue, arguments, expect):
+ self.queue = queue
+ self.address = "%s;{create:always,node:{x-declare:{arguments:{%s}}}}"%(
+ self.queue, ",".join(arguments + ["'qpid.replicate':all"]))
+ self.expect = [str(i) for i in expect]
+
+ def send(self, connection):
+ """Send messages, then acquire one but don't acknowledge"""
+ s = connection.session()
+ for m in range(10): s.sender(self.address).send(str(m))
+ s.receiver(self.address).fetch()
+
+ def wait(self, brokertest, backup):
+ backup.wait_backup(self.queue)
+
+ def verify(self, brokertest, backup):
+ backup.assert_browse_backup(self.queue, self.expect, msg=self.queue)
+
+ tests = [
+ Test("plain",[],range(10)),
+ Test("ring", ["'qpid.policy_type':ring", "'qpid.max_count':5"], range(5,10)),
+ Test("priority",["'qpid.priorities':10"], range(10)),
+ Test("fairshare", ["'qpid.priorities':10,'qpid.fairshare':5"], range(10)),
+ Test("lvq", ["'qpid.last_value_queue_key':lvq-key"], [9])
+ ]
+
+ primary = HaBroker(self, name="primary")
+ primary.promote()
+ backup1 = HaBroker(self, name="backup1", broker_url=primary.host_port())
+ c = primary.connect()
+ for t in tests: t.send(c) # Send messages, leave one unacknowledged.
+
+ backup2 = HaBroker(self, name="backup2", broker_url=primary.host_port())
+ # Wait for backups to catch up.
+ for t in tests:
+ t.wait(self, backup1)
+ t.wait(self, backup2)
+ # Verify acquired message was replicated
+ for t in tests: t.verify(self, backup1)
+ for t in tests: t.verify(self, backup2)
+
+ def test_replicate_default(self):
+ """Make sure we don't replicate if ha-replicate is unspecified or none"""
+ cluster1 = HaCluster(self, 2, ha_replicate=None)
+ c1 = cluster1[0].connect().session().sender("q;{create:always}")
+ cluster2 = HaCluster(self, 2, ha_replicate="none")
+ cluster2[0].connect().session().sender("q;{create:always}")
+ time.sleep(.1) # Give replication a chance.
+ try:
+ cluster1[1].connect_admin().session().receiver("q")
+ self.fail("Excpected no-such-queue exception")
+ except NotFound: pass
+ try:
+ cluster2[1].connect_admin().session().receiver("q")
+ self.fail("Excpected no-such-queue exception")
+ except NotFound: pass
+
+ def test_invalid_default(self):
+ """Verify that a queue with an invalid qpid.replicate gets default treatment"""
+ cluster = HaCluster(self, 2, ha_replicate="all")
+ c = cluster[0].connect().session().sender("q;{create:always, node:{x-declare:{arguments:{'qpid.replicate':XXinvalidXX}}}}")
+ cluster[1].wait_backup("q")
+
+ def test_exclusive_queue(self):
+ """Ensure that we can back-up exclusive queues, i.e. the replicating
+ subscriptions are exempt from the exclusivity"""
+ cluster = HaCluster(self, 2)
+ def test(addr):
+ c = cluster[0].connect()
+ q = addr.split(";")[0]
+ r = c.session().receiver(addr)
+ try: c.session().receiver(addr); self.fail("Expected exclusive exception")
+ except ReceiverError: pass
+ s = c.session().sender(q).send(q)
+ cluster[1].assert_browse_backup(q, [q])
+ test("excl_sub;{create:always, link:{x-subscribe:{exclusive:True}}}");
+ test("excl_queue;{create:always, node:{x-declare:{exclusive:True}}}")
def fairshare(msgs, limit, levels):
"""
diff --git a/qpid/cpp/src/tests/ipv6_test b/qpid/cpp/src/tests/ipv6_test
index 8fa272d514..6becfd8c96 100755
--- a/qpid/cpp/src/tests/ipv6_test
+++ b/qpid/cpp/src/tests/ipv6_test
@@ -113,7 +113,8 @@ fi
test -z $CLUSTER_LIB && exit 0 # Exit if cluster not supported.
## Test failover in a cluster using IPv6 only
-. $srcdir/ais_check # Will exit if clustering not enabled.
+. cpg_check.sh
+cpg_enabled || exit 0
pick_port() {
# We need a fixed port to set --cluster-url. Use qpidd to pick a free port.
diff --git a/qpid/cpp/src/tests/qpid-cluster-benchmark b/qpid/cpp/src/tests/qpid-cluster-benchmark
index d836ed709c..610beacebd 100755
--- a/qpid/cpp/src/tests/qpid-cluster-benchmark
+++ b/qpid/cpp/src/tests/qpid-cluster-benchmark
@@ -22,38 +22,45 @@
# Default options
MESSAGES="-m 10000"
-FLOW="--flow-control 100" # Flow control limit on queue depth for latency.
REPEAT="--repeat 10"
QUEUES="-q 6"
SENDERS="-s 3"
RECEIVERS="-r 3"
BROKERS= # Local broker
CLIENT_HOSTS= # No ssh, all clients are local
+# Connection options
+TCP_NODELAY=false
+RECONNECT=true
+HEARTBEAT=1
-while getopts "m:f:n:b:q:s:r:c:txyv-" opt; do
+while getopts "m:f:n:b:q:s:r:c:h:i:txyv-" opt; do
case $opt in
+ b) BROKERS="-b $OPTARG";;
+ c) CLIENT_HOSTS="-c $OPTARG";;
+ h) HEARTBEAT=$OPTARG;;
+ i) RECONNECT=$OPTARG;;
m) MESSAGES="-m $OPTARG";;
- f) FLOW="--flow-control $OPTARG";;
n) REPEAT="--repeat $OPTARG";;
- b) BROKERS="-b $OPTARG";;
q) QUEUES="-q $OPTARG";;
- s) SENDERS="-s $OPTARG";;
r) RECEIVERS="-r $OPTARG";;
- c) CLIENT_HOSTS="-c $OPTARG";;
- t) TCP_NODELAY="--connection-options {tcp-nodelay:true}";;
+ s) SENDERS="-s $OPTARG";;
+ t) TCP_NODELAY=true;;
+ v) OPTS="--verbose";;
x) SAVE_RECEIVED="--save-received";;
y) NO_DELETE="--no-delete";;
- v) OPTS="--verbose";;
-) break ;;
*) echo "Unknown option"; exit 1;;
esac
done
shift $(($OPTIND-1))
-REPLICATE="node:{x-declare:{arguments:{'qpid.replicate':all}}}"
+CONNECTION_OPTIONS="--connection-options {tcp-nodelay:$TCP_NODELAY,reconnect:$RECONNECT,heartbeat:$HEARTBEAT}"
+CREATE_OPTIONS="node:{x-declare:{arguments:{'qpid.replicate':all}}}"
+
BROKER=$(echo $BROKERS | sed s/,.*//)
run_test() { echo $*; shift; "$@"; echo; echo; echo; }
-OPTS="$OPTS $REPEAT $BROKERS --summarize $QUEUES $SENDERS $RECEIVERS $MESSAGES $CLIENT_HOSTS $SAVE_RECEIVED $TCP_NODELAY $NO_DELETE"
-OPTS="$OPTS --create-option $REPLICATE"
+OPTS="$OPTS $REPEAT $BROKERS --summarize $QUEUES $SENDERS $RECEIVERS $MESSAGES $CLIENT_HOSTS $SAVE_RECEIVED $CONNECTION_OPTIONS $NO_DELETE"
+OPTS="$OPTS --create-option $CREATE_OPTIONS"
+
run_test "Benchmark:" qpid-cpp-benchmark $OPTS "$@"
diff --git a/qpid/cpp/src/tests/qpid-cpp-benchmark b/qpid/cpp/src/tests/qpid-cpp-benchmark
index 19c01dd08a..d5ad5191ca 100755
--- a/qpid/cpp/src/tests/qpid-cpp-benchmark
+++ b/qpid/cpp/src/tests/qpid-cpp-benchmark
@@ -37,7 +37,7 @@ op.add_option("-r", "--receivers", default=1, type="int", metavar="N",
op.add_option("-m", "--messages", default=100000, type="int", metavar="N",
help="send N messages per sender (default %default)")
op.add_option("--queue-name", default="benchmark", metavar="NAME",
- help="base name for queues (default %default)")
+ help="base name for queues (default %default)")
op.add_option("--send-rate", default=0, metavar="N",
help="send rate limited to N messages/second, 0 means no limit (default %default)")
op.add_option("--receive-rate", default=0, metavar="N",
@@ -67,18 +67,16 @@ op.add_option("--sequence", dest="sequence", default=False,
action="store_true", help="add a sequence number to each message")
op.add_option("--connection-options", type="str",
help="Connection options for senders & receivers")
-op.add_option("--flow-control", default=0, type="int", metavar="N",
- help="Flow control each sender to limit queue depth to 2*N. 0 means no flow control.")
op.add_option("--durable", default=False, action="store_true",
help="Use durable queues and messages")
op.add_option("--save-received", default=False, action="store_true",
help="Save received message content to files <queuename>-receiver-<n>.msg")
-op.add_option("--group-receivers", default=False, action="store_true",
- help="Run receivers for the same queue on the same host.")
op.add_option("--verbose", default=False, action="store_true",
help="Show commands executed")
op.add_option("--no-delete", default=False, action="store_true",
help="Don't delete the test queues.")
+op.add_option("--fill-drain", default=False, action="store_true",
+ help="First fill the queues, then drain them")
single_quote_re = re.compile("'")
def posix_quote(string):
@@ -150,7 +148,6 @@ def start_send(queue, opts, broker, host):
"--report-header=no",
"--timestamp=%s"%(opts.timestamp and "yes" or "no"),
"--sequence=%s"%(opts.sequence and "yes" or "no"),
- "--flow-control", str(opts.flow_control),
"--durable", str(opts.durable)
]
command += opts.send_arg
@@ -169,18 +166,6 @@ def first_line(p):
raise Exception("Process exit %d: %s"%(p.returncode, error_msg(out,err)))
return out.split("\n")[0]
-def queue_exists(queue,broker):
- c = qpid.messaging.Connection(broker)
- c.open()
- try:
- s = c.session()
- try:
- s.sender(queue)
- return True
- except qpid.messaging.exceptions.NotFound:
- return False
- finally: c.close()
-
def recreate_queues(queues, brokers, no_delete, opts):
c = qpid.messaging.Connection(brokers[0])
c.open()
@@ -189,15 +174,9 @@ def recreate_queues(queues, brokers, no_delete, opts):
if not no_delete:
try: s.sender("%s;{delete:always}"%(q)).close()
except qpid.messaging.exceptions.NotFound: pass
- # FIXME aconway 2011-05-04: new cluster async wiring, wait for changes to propagate
- for b in brokers:
- while queue_exists(q,b): time.sleep(0.1);
address = "%s;{%s}"%(q, ",".join(opts.create_option + ["create:always"]))
if opts.verbose: print "Creating", address
s.sender(address)
- # FIXME aconway 2011-05-04: new cluster async wiring, wait for changes to propagate
- for b in brokers:
- while not queue_exists(q,b): time.sleep(0.1);
c.close()
def print_header(timestamp):
@@ -295,24 +274,32 @@ def main():
recreate_queues(queues, opts.broker, opts.no_delete, opts)
ready_receiver = ReadyReceiver(ready_queue, opts.broker[0])
- if opts.group_receivers: # Run receivers for same queue against same broker.
- receivers = []
- for q in queues:
- b = brokers.next()
- for j in xrange(opts.receivers):
- receivers.append(
- start_receive(q, j, opts, ready_queue, b, client_hosts.next()))
- else: # Don't group receivers
- receivers = [start_receive(q, j, opts, ready_queue,
- brokers.next(), client_hosts.next())
- for q in queues for j in xrange(opts.receivers)]
-
- ready_receiver.wait(filter(None, receivers)) # Wait for receivers to be ready.
- start = time.time()
- senders = [start_send(q, opts,brokers.next(), client_hosts.next())
- for q in queues for j in xrange(opts.senders)]
+ def start_receivers():
+ return [ start_receive(q, j, opts, ready_queue, brokers.next(), client_hosts.next())
+ for q in queues for j in xrange(opts.receivers) ]
+
+
+ def start_senders():
+ return [ start_send(q, opts,brokers.next(), client_hosts.next())
+ for q in queues for j in xrange(opts.senders) ]
+
if opts.report_header and i == 0: print_header(opts.timestamp)
- for p in senders + receivers: p.wait()
+
+ if opts.fill_drain:
+ # First fill the queues, then drain them
+ start = time.time()
+ senders = start_senders()
+ for p in senders: p.wait()
+ receivers = start_receivers()
+ for p in receivers: p.wait()
+ else:
+ # Run senders and receivers in parallel
+ receivers = start_receivers()
+ ready_receiver.wait(filter(None, receivers)) # Wait for receivers ready
+ start = time.time()
+ senders = start_senders()
+ for p in senders + receivers: p.wait()
+
total_sent = opts.queues * opts.senders * opts.messages
total_tp = total_sent / (time.time()-start)
send_stats=parse_senders(senders)
diff --git a/qpid/cpp/src/tests/qpid-send.cpp b/qpid/cpp/src/tests/qpid-send.cpp
index 91eef0cd71..b1c4f2be38 100644
--- a/qpid/cpp/src/tests/qpid-send.cpp
+++ b/qpid/cpp/src/tests/qpid-send.cpp
@@ -85,7 +85,6 @@ struct Options : public qpid::Options
uint reportEvery;
bool reportHeader;
uint sendRate;
- uint flowControl;
bool sequence;
bool timestamp;
std::string groupKey;
@@ -115,7 +114,6 @@ struct Options : public qpid::Options
reportEvery(0),
reportHeader(true),
sendRate(0),
- flowControl(0),
sequence(true),
timestamp(true),
groupPrefix("GROUP-"),
@@ -149,7 +147,6 @@ struct Options : public qpid::Options
("report-every", qpid::optValue(reportEvery,"N"), "Report throughput statistics every N messages")
("report-header", qpid::optValue(reportHeader, "yes|no"), "Headers on report.")
("send-rate", qpid::optValue(sendRate,"N"), "Send at rate of N messages/second. 0 means send as fast as possible.")
- ("flow-control", qpid::optValue(flowControl,"N"), "Do end to end flow control to limit queue depth to 2*N. 0 means no flow control.")
("sequence", qpid::optValue(sequence, "yes|no"), "Add a sequence number messages property (required for duplicate/lost message detection)")
("timestamp", qpid::optValue(timestamp, "yes|no"), "Add a time stamp messages property (required for latency measurement)")
("group-key", qpid::optValue(groupKey, "KEY"), "Generate groups of messages using message header 'KEY' to hold the group identifier")
@@ -371,8 +368,6 @@ int main(int argc, char ** argv)
msg.setPriority(opts.priority);
}
if (!opts.replyto.empty()) {
- if (opts.flowControl)
- throw Exception("Can't use reply-to and flow-control together");
msg.setReplyTo(Address(opts.replyto));
}
if (!opts.userid.empty()) msg.setUserId(opts.userid);
@@ -406,26 +401,10 @@ int main(int argc, char ** argv)
int64_t interval = 0;
if (opts.sendRate) interval = qpid::sys::TIME_SEC/opts.sendRate;
- Receiver flowControlReceiver;
- Address flowControlAddress("flow-"+Uuid(true).str()+";{create:always,delete:always}");
- uint flowSent = 0;
- if (opts.flowControl) {
- flowControlReceiver = session.createReceiver(flowControlAddress);
- flowControlReceiver.setCapacity(2);
- }
-
while (contentGen->setContent(msg)) {
++sent;
if (opts.sequence)
msg.getProperties()[SN] = sent;
- if (opts.flowControl) {
- if ((sent % opts.flowControl) == 0) {
- msg.setReplyTo(flowControlAddress);
- ++flowSent;
- }
- else
- msg.setReplyTo(Address()); // Clear the reply address.
- }
if (groupGen.get())
groupGen->setGroupInfo(msg);
@@ -444,19 +423,12 @@ int main(int argc, char ** argv)
}
if (opts.messages && sent >= opts.messages) break;
- if (opts.flowControl && flowSent == 2) {
- flowControlReceiver.get(Duration::SECOND);
- --flowSent;
- }
-
if (opts.sendRate) {
qpid::sys::AbsTime waitTill(start, sent*interval);
int64_t delay = qpid::sys::Duration(qpid::sys::now(), waitTill);
if (delay > 0) qpid::sys::usleep(delay/qpid::sys::TIME_USEC);
}
}
- for ( ; flowSent>0; --flowSent)
- flowControlReceiver.get(Duration::SECOND);
if (opts.reportTotal) reporter.report();
for (uint i = opts.sendEos; i > 0; --i) {
if (opts.sequence)
diff --git a/qpid/cpp/src/tests/qpid-txtest.cpp b/qpid/cpp/src/tests/qpid-txtest.cpp
index d0ba2f1245..6e7d46802c 100644
--- a/qpid/cpp/src/tests/qpid-txtest.cpp
+++ b/qpid/cpp/src/tests/qpid-txtest.cpp
@@ -33,6 +33,7 @@
#include "qpid/client/SubscriptionManager.h"
#include "qpid/framing/Array.h"
#include "qpid/framing/Buffer.h"
+#include "qpid/framing/FieldValue.h"
#include "qpid/framing/Uuid.h"
#include "qpid/sys/Thread.h"
@@ -245,10 +246,10 @@ struct Controller : public Client
// Recover DTX transactions (if any)
if (opts.dtx) {
- std::vector<std::string> inDoubtXids;
framing::DtxRecoverResult dtxRes = session.dtxRecover().get();
const framing::Array& xidArr = dtxRes.getInDoubt();
- xidArr.collect(inDoubtXids);
+ std::vector<std::string> inDoubtXids(xidArr.size());
+ std::transform(xidArr.begin(), xidArr.end(), inDoubtXids.begin(), framing::Array::get<std::string, framing::Array::ValuePtr>);
if (inDoubtXids.size()) {
if (!opts.quiet) std::cout << "Recovering DTX in-doubt transaction(s):" << std::endl;
diff --git a/qpid/cpp/src/tests/qpidd-empty.conf b/qpid/cpp/src/tests/qpidd-empty.conf
new file mode 100644
index 0000000000..bbf52bf446
--- /dev/null
+++ b/qpid/cpp/src/tests/qpidd-empty.conf
@@ -0,0 +1,3 @@
+# An empty configuration file.
+# Used when running tests to avoid picking up configuration
+# installed in the default place.
diff --git a/qpid/cpp/src/tests/run_acl_tests b/qpid/cpp/src/tests/run_acl_tests
index 8629bd0777..3a8c03eda6 100755
--- a/qpid/cpp/src/tests/run_acl_tests
+++ b/qpid/cpp/src/tests/run_acl_tests
@@ -22,16 +22,24 @@
# Run the acl tests. $srcdir is set by the Makefile.
source ./test_env.sh
DATA_DIR=`pwd`/data_dir
+DATA_DIRI=`pwd`/data_diri
+DATA_DIRU=`pwd`/data_diru
trap stop_brokers INT TERM QUIT
start_brokers() {
- ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIR --load-module $ACL_LIB --acl-file policy.acl --auth no > qpidd.port
+ ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIR --load-module $ACL_LIB --acl-file policy.acl --auth no --log-to-file local.log > qpidd.port
LOCAL_PORT=`cat qpidd.port`
+ ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIRI --load-module $ACL_LIB --acl-file policy.acl --auth no --acl-max-connect-per-ip 2 --log-to-file locali.log > qpiddi.port
+ LOCAL_PORTI=`cat qpiddi.port`
+ ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIRU --load-module $ACL_LIB --acl-file policy.acl --auth no --acl-max-connect-per-user 2 --log-to-file localu.log > qpiddu.port
+ LOCAL_PORTU=`cat qpiddu.port`
}
stop_brokers() {
$QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORT
+ $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORTI
+ $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORTU
}
test_loading_acl_from_absolute_path(){
@@ -49,14 +57,22 @@ test_loading_acl_from_absolute_path(){
if test -d ${PYTHON_DIR} ; then
rm -rf $DATA_DIR
+ rm -rf $DATA_DIRI
+ rm -rf $DATA_DIRU
mkdir -p $DATA_DIR
+ mkdir -p $DATA_DIRI
+ mkdir -p $DATA_DIRU
cp $srcdir/policy.acl $DATA_DIR
+ cp $srcdir/policy.acl $DATA_DIRI
+ cp $srcdir/policy.acl $DATA_DIRU
start_brokers
- echo "Running acl tests using brokers on ports $LOCAL_PORT"
- $QPID_PYTHON_TEST -b localhost:$LOCAL_PORT -m acl || EXITCODE=1
+ echo "Running acl tests using brokers on ports $LOCAL_PORT, $LOCAL_PORTI, and $LOCAL_PORTU"
+ $QPID_PYTHON_TEST -b localhost:$LOCAL_PORT -m acl -Dport-i=$LOCAL_PORTI -Dport-u=$LOCAL_PORTU || EXITCODE=1
stop_brokers || EXITCODE=1
test_loading_acl_from_absolute_path || EXITCODE=1
rm -rf $DATA_DIR
+ rm -rf $DATA_DIRI
+ rm -rf $DATA_DIRU
exit $EXITCODE
fi
diff --git a/qpid/cpp/src/tests/run_cluster_authentication_soak b/qpid/cpp/src/tests/run_cluster_authentication_soak
index 7bc406c4ca..24befa28ba 100755
--- a/qpid/cpp/src/tests/run_cluster_authentication_soak
+++ b/qpid/cpp/src/tests/run_cluster_authentication_soak
@@ -19,8 +19,9 @@
source ./test_env.sh
-source $srcdir/ais_check
source sasl_test_setup.sh
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group ./cluster_authentication_soak 500
diff --git a/qpid/cpp/src/tests/run_cluster_authentication_test b/qpid/cpp/src/tests/run_cluster_authentication_test
index 647200b869..844807a857 100755
--- a/qpid/cpp/src/tests/run_cluster_authentication_test
+++ b/qpid/cpp/src/tests/run_cluster_authentication_test
@@ -19,8 +19,9 @@
source ./test_env.sh
-source $srcdir/ais_check
source sasl_test_setup.sh
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group ./cluster_authentication_soak
diff --git a/qpid/cpp/src/tests/run_cluster_test b/qpid/cpp/src/tests/run_cluster_test
index c022eea1fe..11df3d63a3 100755
--- a/qpid/cpp/src/tests/run_cluster_test
+++ b/qpid/cpp/src/tests/run_cluster_test
@@ -22,5 +22,6 @@
# Run the tests
srcdir=`dirname $0`
-. $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group $srcdir/run_test ./cluster_test
diff --git a/qpid/cpp/src/tests/run_cluster_tests b/qpid/cpp/src/tests/run_cluster_tests
index e136d3810a..a5cea5ff6e 100755
--- a/qpid/cpp/src/tests/run_cluster_tests
+++ b/qpid/cpp/src/tests/run_cluster_tests
@@ -20,7 +20,9 @@
#
source ./test_env.sh
-source $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
+
test -x $QPID_PYTHON_TEST || { echo Skipping test, $QPID_PYTHON_TEST not found; exit 0; }
diff --git a/qpid/cpp/src/tests/run_failover_soak b/qpid/cpp/src/tests/run_failover_soak
index 4c2e8cc188..2c56bf7d6b 100755
--- a/qpid/cpp/src/tests/run_failover_soak
+++ b/qpid/cpp/src/tests/run_failover_soak
@@ -20,7 +20,8 @@
#
source ./test_env.sh
-. $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
host=127.0.0.1
diff --git a/qpid/cpp/src/tests/run_federation_sys_tests b/qpid/cpp/src/tests/run_federation_sys_tests
index f5f772d72e..76da176914 100755
--- a/qpid/cpp/src/tests/run_federation_sys_tests
+++ b/qpid/cpp/src/tests/run_federation_sys_tests
@@ -26,12 +26,8 @@ source ./test_env.sh
MODULENAME=federation_sys
# Test for clustering
-ps -u root | grep 'aisexec\|corosync' > /dev/null
-if (( $? == 0 )); then
- CLUSTERING_ENABLED=1
-else
- echo "WARNING: No clustering detected; tests using it will be ignored."
-fi
+source cpg_check.sh
+if cpg_enabled; then CLUSTERING_ENABLED=1; fi
# Test for long test
if [[ "$1" == "LONG_TEST" ]]; then
diff --git a/qpid/cpp/src/tests/run_federation_tests b/qpid/cpp/src/tests/run_federation_tests
index b71fa14c47..7735b559cf 100755
--- a/qpid/cpp/src/tests/run_federation_tests
+++ b/qpid/cpp/src/tests/run_federation_tests
@@ -33,16 +33,13 @@ else
SKIPTESTS='-i *_xml' # note: single quotes prevent expansion of *
fi
+QPIDD_CMD="../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no --log-enable=info+ --log-enable=debug+:Bridge --log-to-file"
start_brokers() {
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- LOCAL_PORT=`cat qpidd.port`
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- REMOTE_PORT=`cat qpidd.port`
-
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- REMOTE_B1=`cat qpidd.port`
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- REMOTE_B2=`cat qpidd.port`
+ rm -f fed_local.log fed_remote.log fed_b1.log fed_b2.log
+ LOCAL_PORT=$($QPIDD_CMD fed_local.log)
+ REMOTE_PORT=$($QPIDD_CMD fed_remote.log)
+ REMOTE_B1=$($QPIDD_CMD fed_b1.log)
+ REMOTE_B2=$($QPIDD_CMD fed_b2.log)
}
stop_brokers() {
diff --git a/qpid/cpp/src/tests/sasl.mk b/qpid/cpp/src/tests/sasl.mk
index 69b24c3f8a..11731dcf40 100644
--- a/qpid/cpp/src/tests/sasl.mk
+++ b/qpid/cpp/src/tests/sasl.mk
@@ -20,18 +20,37 @@
# Test that are only relevant if SASL is enabled.
if HAVE_SASL
+if HAVE_LIBCPG
check_PROGRAMS+=cluster_authentication_soak
cluster_authentication_soak_INCLUDES=$(PUBLIC_INCLUDES)
cluster_authentication_soak_SOURCES=cluster_authentication_soak.cpp ForkedBroker.h ForkedBroker.cpp
cluster_authentication_soak_LDADD=$(lib_client) $(lib_broker)
+endif HAVE_LIBCPG
# Note: sasl_version is not a test -- it is a tool used by tests.
check_PROGRAMS+=sasl_version
sasl_version_SOURCES=sasl_version.cpp
sasl_version_LDADD=$(lib_client)
-TESTS += run_cluster_authentication_test sasl_fed sasl_fed_ex_dynamic sasl_fed_ex_link sasl_fed_ex_queue sasl_fed_ex_route sasl_fed_ex_route_cluster sasl_fed_ex_link_cluster sasl_fed_ex_queue_cluster sasl_fed_ex_dynamic_cluster sasl_no_dir
+TESTS += sasl_fed
+ sasl_fed_ex_dynamic
+ sasl_fed_ex_link
+ sasl_fed_ex_queue
+ sasl_fed_ex_route
+ sasl_no_dir
+
+if HAVE_LIBCPG
+
+TESTS += run_cluster_authentication_test \
+ sasl_fed_ex_route_cluster \
+ sasl_fed_ex_link_cluster \
+ sasl_fed_ex_queue_cluster \
+ sasl_fed_ex_dynamic_cluster
+
LONG_TESTS += run_cluster_authentication_soak
+
+endif HAVE_LIBCPG
+
EXTRA_DIST += run_cluster_authentication_test \
sasl_fed \
sasl_fed_ex \
diff --git a/qpid/cpp/src/tests/sasl_fed_ex_dynamic_cluster b/qpid/cpp/src/tests/sasl_fed_ex_dynamic_cluster
index b0cceccecb..fd6b72a4f2 100755
--- a/qpid/cpp/src/tests/sasl_fed_ex_dynamic_cluster
+++ b/qpid/cpp/src/tests/sasl_fed_ex_dynamic_cluster
@@ -21,7 +21,9 @@
source ./test_env.sh
-source $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
+
with_ais_group ${srcdir}/sasl_fed_ex dynamic cluster
diff --git a/qpid/cpp/src/tests/sasl_fed_ex_link_cluster b/qpid/cpp/src/tests/sasl_fed_ex_link_cluster
index 4139300b12..34b2aa4a5f 100755
--- a/qpid/cpp/src/tests/sasl_fed_ex_link_cluster
+++ b/qpid/cpp/src/tests/sasl_fed_ex_link_cluster
@@ -21,7 +21,8 @@
source ./test_env.sh
-source $srcdir/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group ${srcdir}/sasl_fed_ex link cluster
diff --git a/qpid/cpp/src/tests/sasl_fed_ex_queue_cluster b/qpid/cpp/src/tests/sasl_fed_ex_queue_cluster
index f251420e08..14f36f6fc4 100755
--- a/qpid/cpp/src/tests/sasl_fed_ex_queue_cluster
+++ b/qpid/cpp/src/tests/sasl_fed_ex_queue_cluster
@@ -21,7 +21,8 @@
source ./test_env.sh
-source ${srcdir}/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group ${srcdir}/sasl_fed_ex queue cluster
diff --git a/qpid/cpp/src/tests/sasl_fed_ex_route_cluster b/qpid/cpp/src/tests/sasl_fed_ex_route_cluster
index a5d1542def..756476056e 100755
--- a/qpid/cpp/src/tests/sasl_fed_ex_route_cluster
+++ b/qpid/cpp/src/tests/sasl_fed_ex_route_cluster
@@ -21,7 +21,8 @@
source ./test_env.sh
-source ${srcdir}/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
with_ais_group ${srcdir}/sasl_fed_ex route cluster
diff --git a/qpid/cpp/src/tests/ssl_test b/qpid/cpp/src/tests/ssl_test
index ac978d3bd0..91ff8eec1e 100755
--- a/qpid/cpp/src/tests/ssl_test
+++ b/qpid/cpp/src/tests/ssl_test
@@ -192,7 +192,8 @@ stop_brokers
test -z $CLUSTER_LIB && exit 0 # Exit if cluster not supported.
## Test failover in a cluster using SSL only
-. $srcdir/ais_check # Will exit if clustering not enabled.
+source cpg_check.sh
+cpg_enabled || exit 0
PORT1=`pick_port`; ssl_cluster_broker $PORT1
echo "Running SSL cluster broker on port $PORT1"
diff --git a/qpid/cpp/src/tests/start_cluster b/qpid/cpp/src/tests/start_cluster
index 84f98b3b2d..78fd104d9c 100755
--- a/qpid/cpp/src/tests/start_cluster
+++ b/qpid/cpp/src/tests/start_cluster
@@ -24,7 +24,8 @@
# Execute command with the ais group set.
source ./test_env.sh
-. `dirname $0`/ais_check
+source cpg_check.sh
+cpg_enabled || exit 0
rm -f cluster*.log cluster.ports qpidd.port
diff --git a/qpid/cpp/src/tests/test_env.sh.in b/qpid/cpp/src/tests/test_env.sh.in
index 5c07bcdc2e..cee36843ae 100644
--- a/qpid/cpp/src/tests/test_env.sh.in
+++ b/qpid/cpp/src/tests/test_env.sh.in
@@ -75,6 +75,7 @@ exportmodule XML_LIB xml.so
# Qpid options
export QPID_NO_MODULE_DIR=1 # Don't accidentally load installed modules
export QPID_DATA_DIR=
+export QPID_CONFIG=$srcdir/qpidd-empty.conf
# Use temporary directory if $HOME does not exist
if [ ! -e "$HOME" ]; then
diff --git a/qpid/cpp/src/windows/QpiddBroker.cpp b/qpid/cpp/src/windows/QpiddBroker.cpp
index e73fcf0af5..89a8945d00 100644
--- a/qpid/cpp/src/windows/QpiddBroker.cpp
+++ b/qpid/cpp/src/windows/QpiddBroker.cpp
@@ -37,7 +37,7 @@ namespace broker {
BootstrapOptions::BootstrapOptions(const char* argv0)
: qpid::Options("Options"),
- common("", QPIDD_CONF_FILE),
+ common("", QPIDD_CONF_FILE, QPIDC_CONF_FILE),
module(QPIDD_MODULE_DIR),
log(argv0)
{
@@ -315,7 +315,7 @@ struct QpiddWindowsOptions : public QpiddOptionsPrivate {
QpiddOptions::QpiddOptions(const char* argv0)
: qpid::Options("Options"),
- common("", QPIDD_CONF_FILE),
+ common("", QPIDD_CONF_FILE, QPIDC_CONF_FILE),
module(QPIDD_MODULE_DIR),
log(argv0)
{
diff --git a/qpid/cpp/xml/cluster.xml b/qpid/cpp/xml/cluster.xml
index 7b3f2fe63b..f9b8caf185 100644
--- a/qpid/cpp/xml/cluster.xml
+++ b/qpid/cpp/xml/cluster.xml
@@ -326,6 +326,12 @@
<field name="dequeueSincePurge" type="uint32"/>
</control>
+ <!-- Replicate the internal state for an object - e.g. Links, bridges, etc -->
+ <control name="internal-state" code="0x42">
+ <field name="type" type="str8"/> <!-- The type of object the state is for (e.g. 'link') -->
+ <field name="name" type="str8"/> <!-- Identifies the particular object to be updated -->
+ <field name="state" type="map"/> <!-- The internal state for the object -->
+ </control>
</class>
diff --git a/qpid/doc/book/Makefile b/qpid/doc/book/Makefile
index db160ac6f8..8a3d4974db 100644
--- a/qpid/doc/book/Makefile
+++ b/qpid/doc/book/Makefile
@@ -17,37 +17,22 @@
# under the License.
#
-#
-# This Makefile requires the following:
-#
-# Apache FOP, version 0.95 or higher
-# Docbook 4.5
-# Docbook XSL stylesheets - tested with xsl-stylesheets (1.75.2 and 1.65.1-2)
-# xsltproc
-# xmllint
-#
-
-all: cpp java programming
+DIRS = src/java-broker src/cpp-broker src/programming
-cpp: build/AMQP-Messaging-Broker-CPP-Book
-java: build/AMQP-Messaging-Broker-Java-Book
+.PHONY: all $(DIRS)
-programming: build/Programming-In-Apache-Qpid
+all: $(DIRS)
-qmf: build/QmfBook
-
-build/AMQP-Messaging-Broker-CPP-Book:
- ./build-book.sh AMQP-Messaging-Broker-CPP-Book
+clean:
+ rm -rf build
-build/AMQP-Messaging-Broker-Java-Book:
- ./build-book.sh AMQP-Messaging-Broker-Java-Book
+html: TARGET = html
+html: all
-build/Programming-In-Apache-Qpid:
- ./build-book.sh Programming-In-Apache-Qpid
+pdf: TARGET = pdf
+pdf: all
-build/QmfBook: src/QmfBook.xml src/QmfIntroduction.xml
- ./build-book.sh QmfBook
+$(DIRS):
+ $(MAKE) -C $@ $(TARGET) OUTPUTDIR=../../build/
-clean:
- rm -rf build
diff --git a/qpid/doc/book/README.txt b/qpid/doc/book/README.txt
deleted file mode 100644
index 1fc99c94a0..0000000000
--- a/qpid/doc/book/README.txt
+++ /dev/null
@@ -1,118 +0,0 @@
-The documentation in this directory is written in DocBook 4.5. The
-original content was taken from the Apache Qpid Wiki.
-
-1. Building the Documentation
-
-You need the following to build the documentation:
-
-- Apache FOP, version 0.95 or higher
-- Docbook 4.5
-- Docbook XSL stylesheets - Tested with xsl-stylesheets (1.75.2 & 1.65.1-2)
-- xsltproc
-- xmllint
-
-On many Linux machines, these can usually be installed from standard
-repos. For instance, on Fedora they can be installed as follows:
-
-$ sudo yum install fop docbook-dtds docbook-style-xsl libxslt libxml2
-
-After installing, use make to build the documentation:
-
-$ make
-
-The Makefile supports the following targets:
-
-all Builds the cpp, java, and programming targets.
-cpp Build html+pdf for the C++ broker.
-java Build html+pdf for the Java broker.
-programming Build html+pdf for Programming In Apache Qpid.
-clean Delete the build directory
-
-
-You will see quite a few error messages. Many of these are due to
-unresolved links, and these should go away. Many are due to the
-verbosity of Apache FOP, which generates many warnings.
-
-2. Editing Tools
-
-For Emacs, I like nxml-mode, especially if you learn how to use tag
-completion, outlining, etc. This is described in some detail in
-http://www.dpawson.co.uk/relaxng/nxml/info.html.
-
-For vi, the macros described in this Linux Journal article may be
-helpful: http://www.linuxjournal.com/article/7737.
-
-Commercial XML editors provide good support for DocBook. On Windows, I
-like Stylus Studio (http://www.stylusstudio.com/). On Linux, I like
-Oxygen (http://www.oxygenxml.com/).
-
-Here's a page on authoring tools for DocBook:
-http://wiki.docbook.org/topic/DocBookAuthoringTools
-
-
-3. File Structure
-
-The source files are in qpid/doc/book/src.
-
-The following XInclude tree shows the organization of files in the
-document.
-
-Book.xml
- Book-Info.xml
- Introduction.xml
- AMQP.xml
- Getting-Started.xml
- Download.xml
- AMQP-Messaging-Broker-CPP.xml
- Running-CPP-Broker.xml
- Cheat-Sheet-for-configuring-Queue-Options.xml
- Cheat-Sheet-for-configuring-Exchange-Options.xml
- Using-Broker-Federation.xml
- SSL.xml
- LVQ.xml
- queue-state-replication.xml
- Starting-a-cluster.xml
- ACL.xml
- Managing-CPP-Broker.xml
- QMan-Qpid-Management-bridge.xml
- Qpid-Management-Framework.xml
- Management-Design-notes.xml
- QMF-Python-Console-Tutorial.xml
- AMQP-Messaging-Broker-Java.xml
- Java-Broker-Feature-Guide.xml
- Qpid-Java-FAQ.xml
- Java-Environment-Variables.xml
- Qpid-Troubleshooting-Guide.xml
- Add-New-Users.xml
- Configure-ACLs.xml
- Configure-Java-Qpid-to-use-a-SSL-connection.xml
- Configure-Log4j-CompositeRolling-Appender.xml
- Configure-the-Broker-via-config.xml.xml
- Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml
- Debug-using-log4j.xml
- How-to-Tune-M3-Java-Broker-Performance.xml
- Qpid-Java-Build-How-To.xml
- Use-Priority-Queues.xml
- Qpid-JMX-Management-Console.xml
- Configuring-Management-Users.xml
- Configuring-Qpid-JMX-Management-Console.xml
- Management-Console-Security.xml
- Qpid-JMX-Management-Console-FAQ.xml
- Qpid-JMX-Management-Console-User-Guide.xml
- Qpid-Management-Features.xml
- MessageStore-Tool.xml
- Qpid-Java-Broker-Management-CLI.xml
- AMQP-Java-JMS-Messaging-Client.xml
- System-Properties.xml
- Connection-URL-Format.xml
- Binding-URL-Format.xml
- AMQP-C++-Messaging-Client.xml
- AMQP-.NET-Messaging-Client.xml
- NET-User-Guide.xml
- Excel-AddIn.xml
- WCF.xml
- AMQP-Python-Messaging-Client.xml
- PythonBrokerTest.xml
- AMQP-Ruby-Messaging-Client.xml
- AMQP-Compatibility.xml
- Qpid-Interoperability-Documentation.xml
diff --git a/qpid/doc/book/build-book.sh b/qpid/doc/book/build-book.sh
deleted file mode 100755
index 5cc02b9fd8..0000000000
--- a/qpid/doc/book/build-book.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/bash -ex
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-########################################################################
-#
-# Build a PDF and HTML for a single chapter or section
-#
-# Specify the name of the XML file on the command line, omitting
-# the file extension, e.g.:
-#
-# $ ./build-chapter.sh src/High-Level-API
-#
-########################################################################
-
-# DOCBOOK XSL STYLESHEET LOCATION
-# Fedora, RHEL:
-DOCBOOK_XSL=/usr/share/sgml/docbook/xsl-stylesheets
-# Ubuntu:
-# DOCBOOK_XSL=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh
-# Ubuntu 10.4 installed it here:
-# DOCBOOK_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl-ns
-
-rm -rf build/$1
-mkdir -p build/$1
-mkdir -p build/$1/html-single
-mkdir -p build/$1/html
-mkdir -p build/$1/pdf
-cp -r src/images build/$1/html-single
-cp -r src/images build/$1/html
-cp -r src/css build/$1/html-single
-cp -r src/css build/$1/html
-
-# Create single-page .html
-xsltproc --xinclude --stringparam section.autolabel 1 --stringparam callout.graphics 0 --stringparam callout.unicode 0 --stringparam section.label.includes.component.label 1 ${DOCBOOK_XSL}/html/docbook.xsl src/$1.xml >build/$1/html-single/$1.html
-
-# Create chunked .html
-INFILE=$(readlink -f src/$1.xml)
-pushd build/$1/html
-xsltproc --xinclude --stringparam chunk.section.depth 1 --stringparam section.autolabel 1 --stringparam callout.graphics 0 --stringparam callout.unicode 0 --stringparam section.label.includes.component.label 1 --stringparam use.id.as.filename 1 --stringparam html.stylesheet css/style.css --stringparam section.autolabel.max.depth 3 --stringparam toc.section.depth 2 --stringparam chunker.output.encoding UTF-8 ${DOCBOOK_XSL}/html/chunk.xsl $INFILE
-popd
-
-# Create the .fo
-xsltproc --xinclude --stringparam section.autolabel 1 --stringparam callout.graphics 0 --stringparam callout.unicode 0 --stringparam section.label.includes.component.label 1 ${DOCBOOK_XSL}/fo/docbook.xsl src/$1.xml >build/$1/pdf/$1.fo
-
-# Use Apache FOP to create the PDF
-fop build/$1/pdf/$1.fo build/$1/pdf/$1.pdf
diff --git a/qpid/doc/book/build-chapter.sh b/qpid/doc/book/build-chapter.sh
deleted file mode 100755
index a2c2ad3b0c..0000000000
--- a/qpid/doc/book/build-chapter.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/bash -ex
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-########################################################################
-#
-# Build a PDF and HTML for a single chapter or section
-#
-# Specify the name of the XML file on the command line, omitting
-# the file extension, e.g.:
-#
-# $ ./build-chapter.sh src/High-Level-API
-#
-########################################################################
-
-rm -rf build
-mkdir -p build
-mkdir -p pdf
-
-
-# Create the .html
-xsltproc --stringparam section.autolabel 1 /usr/share/sgml/docbook/xsl-stylesheets/html/docbook.xsl src/$1.xml >build/$1.html
-
-# Create the .fo
-xsltproc --stringparam section.autolabel 1 /usr/share/sgml/docbook/xsl-stylesheets/fo/docbook.xsl src/$1.xml >build/$1.fo
-
-# Use Apache FOP to create the PDF
-fop build/$1.fo pdf/$1.pdf
diff --git a/qpid/doc/book/build.sh b/qpid/doc/book/build.sh
deleted file mode 100755
index 249d2c7439..0000000000
--- a/qpid/doc/book/build.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash -ex
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-########################################################################
-#
-# Build a PDF from Docbook XML
-#
-# The Makefile is cleaner ....
-#
-########################################################################
-
-rm -rf build
-mkdir -p build
-mkdir -p pdf
-
-# Assemble all documents using XInclude
-xmllint --xinclude src/Book.xml >build/qpid-book.xml
-
-# Create the .fo
-xsltproc /usr/share/sgml/docbook/xsl-stylesheets/fo/docbook.xsl build/qpid-book.xml >build/qpid-book.fo
-
-# Use Apache FOP to create the PDF
-fop build/qpid-book.fo pdf/qpid-book.pdf
diff --git a/qpid/doc/book/build.xml b/qpid/doc/book/build.xml
deleted file mode 100644
index 5acd97f982..0000000000
--- a/qpid/doc/book/build.xml
+++ /dev/null
@@ -1,193 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<!--
- Build Apache Qpid documentation.
-
- For documentation on using XSLT in ant, see http://ant.apache.org/manual/CoreTasks/style.html
-
- For documentation on using Apache FOP in ant, see http://xmlgraphics.apache.org/fop/0.94/anttask.html
-
- Note: Validation is currently off by default, too many dangling references. We will tighten this up as soon as we can.
- -->
-
-<project
- name="generate"
- basedir="."
- default="pdf">
-
- <property name="Qpid" value="http://qpid.apache.org"/>
-
-
-<!--
-###########################################################################
-#
-# Directories
-#
-# Change the directory paths in this section to the correct paths for
-# your machine.
-#
-###########################################################################
--->
-
- <property name="src.dir" location="src"/>
- <property name="build.dir" location="build"/>
- <property name="out.dir" location="out"/>
-
- <!-- Docbook schemas and stylesheets -->
- <property name="schema.dir" location="docbook"/>
- <property name="style.dir" location="docbook-xsl"/>
- <property name="fo.stylesheet" location="${style.dir}/fo/docbook.xsl" />
- <property name="html.stylesheet" location="${style.dir}/html/docbook.xsl" />
-
- <!-- ${lib.dir} has subdirectories for saxon and fop -->
- <property name="lib.dir" location="lib"/>
-
- <property name="xmllint" location="/usr/bin/xmllint"/>
-
-<!--
-###########################################################################
-#
-# Setting up tasks
-#
-# You shouldn't need to change anything in this section or following sections.
-#
-###########################################################################
--->
-
- <path id="saxon6.classpath">
- <pathelement location="${lib.dir}/saxon/resolver.jar"/>
- <pathelement location="${lib.dir}/saxon/xml-apis.jar"/>
- <pathelement location="${lib.dir}/saxon/xercesImpl.jar"/>
- <pathelement location="${lib.dir}/saxon/saxon.jar"/>
- </path>
-
-<taskdef name="fop"
- classname="org.apache.fop.tools.anttasks.Fop">
- <classpath>
- <fileset dir="${lib.dir}/fop-0.95/lib">
- <include name="*.jar"/>
- </fileset>
- <fileset dir="${lib.dir}/fop-0.95/build">
- <include name="fop.jar"/>
- <include name="fop-hyph.jar" />
- </fileset>
- </classpath>
-</taskdef>
-
-<!--
-###########################################################################
-#
-# Tasks
-#
-###########################################################################
--->
-
-<!--
- init
--->
-
-<target name="init">
- <mkdir dir="${build.dir}"/>
- <mkdir dir="${out.dir}"/>
-</target>
-
-<!--
- XInclude
--->
-
-<target name="xinclude" depends="init">
- <exec executable="${xmllint}">
- <arg value="-o"/>
- <arg value="${build.dir}/xinclude.xml"/>
- <arg value="--xinclude"/>
- <arg value="${src.dir}/Book.xml"/>
- </exec>
-</target>
-
-
-
-<!--
- FO
--->
-
- <target name="fo" depends="xinclude" description="Generates qpid-book.fo, which is needed to create a PDF">
-
- <xslt in="${build.dir}/xinclude.xml" out="${build.dir}/qpid-book.fo"
- style="${fo.stylesheet}" classpathref="saxon6.classpath">
- <param name="specdoc" expression="${spec.code}"/>
- <param name="uri" expression="${spec.uri}"/>
- </xslt>
- </target>
-
-
-<!--
- PDF
--->
-
-<target name="pdf" depends="fo" description="Generates qpid-book.pdf">
- <fop format="application/pdf"
- fofile="${build.dir}/qpid-book.fo"
- outfile="${out.dir}/qpid-book.pdf"/>
-</target
->
-<!--
- HTML
--->
-
- <target name="html" depends="xinclude" description="Generates qpid-book.html">
- <xslt in="${build.dir}/xinclude.xml" out="${out.dir}/qpid-book.html"
- style="${html.stylesheet}" classpathref="saxon6.classpath">
- </xslt>
- </target>
-
-<!--
- Validate
--->
-
-<target name="validate" depends="xinclude">
- <xmlvalidate file="${build.dir}/xinclude.xml" warn="true">
- <dtd publicId="-//OASIS//DTD DocBook V4.5//EN"
- location="docbook/docbook.dtd"/>
- </xmlvalidate>
-</target>
-
-<!--
- Clean
--->
-
-<target name="clean">
- <delete dir="${build.dir}"/>
-</target>
-
-<!--
- Check
--->
-
-<target name="check" depends="xinclude">
- <xmlvalidate file="${build.dir}/xinclude.xml" warn="false">
- <dtd publicId="-//OASIS//DTD DocBook V4.5//EN"
- location="docbook/docbook.dtd"/>
- </xmlvalidate>
-</target>
-
-
-</project>
-
diff --git a/qpid/doc/book/src/AMQP-Messaging-Broker-Java.xml b/qpid/doc/book/src/AMQP-Messaging-Broker-Java.xml
deleted file mode 100644
index 6cd7ce915e..0000000000
--- a/qpid/doc/book/src/AMQP-Messaging-Broker-Java.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<part id="Java-Broker">
- <title>AMQP Messaging Broker (Implemented in Java)</title>
- <partintro>
- <para>Qpid provides two AMQP messaging brokers:</para>
-
- <itemizedlist>
- <listitem><para>Implemented in C++ - high performance, low latency, and RDMA support.</para></listitem>
- <listitem><para>Implemented in Java - Fully JMS compliant, runs on any Java platform.</para></listitem>
- </itemizedlist>
-
- <para>Both AMQP messaging brokers support clients in multiple languages, as long as the messaging client and the messaging broker use the same version of AMQP. See <link linkend="AMQP-Compatibility"/> to see which messaging clients work with each broker.</para>
-
- <para>This section contains information specific to the broker that is implemented in Java.</para>
- </partintro>
-
-<chapter id="Java-General-User-Guides">
- <title>General User Guides</title>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Broker-Feature-Guide.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Java-FAQ.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Java-Environment-Variables.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Troubleshooting-Guide.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Broker-Configuration-Guide.xml"/>
-</chapter>
-
-<chapter id="Qpid-Java-Broker-HowTos">
-<title>How Tos</title>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Add-New-Users.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Configure-ACLs.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Configure-Java-Qpid-to-use-a-SSL-connection.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Configure-Log4j-CompositeRolling-Appender.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Configure-the-Broker-via-config.xml.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Debug-using-log4j.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="How-to-Tune-M3-Java-Broker-Performance.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Java-Build-How-To.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Use-Priority-Queues.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="How-to-Use-SlowConsumerDisconnect.xml"/>
-</chapter>
-
-
-<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-JMX-Management-Console.xml"/>
-
-<chapter id="QpidJavaBroker-ManagementTools">
-<title>Management Tools</title>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="MessageStore-Tool.xml"/>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Qpid-Java-Broker-Management-CLI.xml"/>
-</chapter>
-</part>
diff --git a/qpid/doc/book/src/Active-Passive-Cluster.xml b/qpid/doc/book/src/Active-Passive-Cluster.xml
deleted file mode 100644
index 52748b2570..0000000000
--- a/qpid/doc/book/src/Active-Passive-Cluster.xml
+++ /dev/null
@@ -1,639 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-h"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
-
--->
-
-<section id="chap-Messaging_User_Guide-Active_Passive_Cluster">
-
- <title>Active-passive Messaging Clusters (Preview)</title>
-
- <section>
- <title>Overview</title>
- <para>
- This release provides a preview of a new module for High Availability (HA). The new module is
- not yet complete or ready for production use. It being made available so that users can
- experiment with the new approach and provide feedback early in the development process.
- Feedback should go to <ulink url="mailto:user@qpid.apache.org">dev@qpid.apache.org</ulink>.
- </para>
- <para>
- The old cluster module takes an <firstterm>active-active</firstterm> approach, i.e. all the
- brokers in a cluster are able to handle client requests simultaneously. The new HA module
- takes an <firstterm>active-passive</firstterm>, <firstterm>hot-standby</firstterm> approach.
- </para>
- <para>
- In an active-passive cluster only one broker, known as the <firstterm>primary</firstterm>, is
- active and serving clients at a time. The other brokers are standing by as
- <firstterm>backups</firstterm>. Changes on the primary are immediately replicated to all the
- backups so they are always up-to-date or "hot". If the primary fails, one of the backups is
- promoted to take over as the new primary. Clients fail-over to the new primary
- automatically. If there are multiple backups, the backups also fail-over to become backups of
- the new primary. Backup brokers reject connection attempts, to enforce the requirement that
- only the primary be active.
- </para>
- <para>
- This approach depends on an external <firstterm>cluster resource manager</firstterm> to detect
- failures and choose the primary. <ulink
- url="https://fedorahosted.org/cluster/wiki/RGManager">Rgmanager</ulink> is supported
- initially, but others may be supported in future future.
- </para>
- <section>
- <title>Why the new approach?</title>
- <para>
- The new active-passive approach has several advantages compared to the
- existing active-active cluster module.
- <itemizedlist>
- <listitem>
- It does not depend directly on openais or corosync. It does not use multicast
- which simplifies deployment.
- </listitem>
- <listitem>
- It is more portable: in environments that don't support corosync, it can be
- integrated with a resource manager available in that environment.
- </listitem>
- <listitem>
- Replication to a <firstterm>disaster recovery</firstterm> site can be handled as
- simply another node in the cluster, it does not require a separate replication
- mechanism.
- </listitem>
- <listitem>
- It can take advantage of features provided by the resource manager, for example
- virtual IP addresses.
- </listitem>
- <listitem>
- Improved performance and scalability due to better use of multiple CPU s
- </listitem>
- </itemizedlist>
- </para>
- </section>
- <section>
- <title>Limitations</title>
-
- <para>
- There are a number of known limitations in the current preview implementation. These
- will be fixed in the production versions.
- </para>
-
- <itemizedlist>
- <listitem>
- Transactional changes to queue state are not replicated atomically. If the primary crashes
- during a transaction, it is possible that the backup could contain only part of the
- changes introduced by a transaction.
- </listitem>
- <listitem>
- During a fail-over one backup is promoted to primary and any other backups switch to
- the new primary. Messages sent to the new primary before all the backups have
- switched could be lost if the new primary itself fails before all the backups have
- switched.
- </listitem>
- <listitem>
- Acknowledgments are confirmed to clients before the message has been dequeued
- from replicas or indeed from the local store if that is asynchronous.
- </listitem>
- <listitem>
- When used with a persistent store: if the entire cluster fails, there are no tools to help
- identify the most recent store.
- </listitem>
- <listitem>
- A persistent broker must have its store erased before joining an existing cluster.
- In the production version a persistent broker will be able to load its store and
- avoid downloading messages that are in the store from the primary.
- </listitem>
- <listitem>
- Configuration changes (creating or deleting queues, exchanges and bindings) are
- replicated asynchronously. Management tools used to make changes will consider the
- change complete when it is complete on the primary, it may not yet be replicated
- to all the backups.
- </listitem>
- <listitem>
- Deletions made immediately after a failure (before all the backups are ready) may
- be lost on a backup. Queues, exchange or bindings that were deleted on the primary could
- re-appear if that backup is promoted to primary on a subsequent failure.
- </listitem>
- <listitem>
- Better control is needed over which queues/exchanges are replicated and which are not.
- </listitem>
- <listitem>
- There are some known issues affecting performance, both the throughput of
- replication and the time taken for backups to fail-over. Performance will improve
- in the production version.
- </listitem>
- <listitem>
- Federated links from the primary will be lost in fail over, they will not be
- re-connected on the new primary. Federation links to the primary can fail over.
- </listitem>
- <listitem>
- Only plain FIFO queues can be replicated. LVQ and ring queues are not yet supported.
- </listitem>
- </itemizedlist>
- </section>
- </section>
-
- <section>
- <title>Virtual IP Addresses</title>
- <para>
- Some resource managers (including <command>rgmanager</command>) support
- <firstterm>virtual IP addresses</firstterm>. A virtual IP address is an IP
- address that can be relocated to any of the nodes in a cluster. The
- resource manager associates this address with the primary node in the
- cluster, and relocates it to the new primary when there is a failure. This
- simplifies configuration as you can publish a single IP address rather
- than a list.
- </para>
- <para>
- A virtual IP address can be used by clients and backup brokers to connect
- to the primary. The following sections will explain how to configure
- virtual IP addresses for clients or brokers.
- </para>
- </section>
- <section>
- <title>Configuring the Brokers</title>
- <para>
- The broker must load the <filename>ha</filename> module, it is loaded by default. The
- following broker options are available for the HA module.
- </para>
- <table frame="all" id="ha-broker-options">
- <title>Options for High Availability Messaging Cluster</title>
- <tgroup align="left" cols="2" colsep="1" rowsep="1">
- <colspec colname="c1" colwidth="1*"/>
- <colspec colname="c2" colwidth="3*"/>
- <thead>
- <row>
- <entry align="center" nameend="c2" namest="c1">
- Options for High Availability Messaging Cluster
- </entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>
- <literal>--ha-cluster <replaceable>yes|no</replaceable></literal>
- </entry>
- <entry>
- Set to "yes" to have the broker join a cluster.
- </entry>
- </row>
- <row>
- <entry>
- <literal>--ha-brokers <replaceable>URL</replaceable></literal>
- </entry>
- <entry>
- URL use by brokers to connect to each other. The URL lists the addresses of
- all the brokers in the cluster
- <footnote>
- <para>
- If the resource manager supports virtual IP addresses then the URL can
- contain just the single virtual IP.
- </para>
- </footnote>
- in the following form:
- <programlisting>
- url = ["amqp:"][ user ["/" password] "@" ] addr ("," addr)*
- addr = tcp_addr / rmda_addr / ssl_addr / ...
- tcp_addr = ["tcp:"] host [":" port]
- rdma_addr = "rdma:" host [":" port]
- ssl_addr = "ssl:" host [":" port]'
- </programlisting>
- </entry>
- </row>
- <row>
- <entry> <literal>--ha-public-brokers <replaceable>URL</replaceable></literal> </entry>
- <entry>
- URL used by clients to connect to the brokers in the same format as
- <literal>--ha-brokers</literal> above. Use this option if you want client
- traffic on a different network from broker replication traffic. If this
- option is not set, clients will use the same URL as brokers.
- </entry>
- </row>
- <row>
- <entry>
- <para><literal>--ha-username <replaceable>USER</replaceable></literal></para>
- <para><literal>--ha-password <replaceable>PASS</replaceable></literal></para>
- <para><literal>--ha-mechanism <replaceable>MECH</replaceable></literal></para>
- </entry>
- <entry>
- Brokers use <replaceable>USER</replaceable>,
- <replaceable>PASS</replaceable>, <replaceable>MECH</replaceable> to
- authenticate when connecting to each other.
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>
- To configure a cluster you must set at least <literal>ha-cluster</literal> and <literal>ha-brokers</literal>.
- </para>
- </section>
-
- <section>
- <title>Creating replicated queues and exchanges</title>
- <para>
- To create a replicated queue or exchange, pass the argument
- <literal>qpid.replicate</literal> when creating the queue or exchange. It should
- have one of the following three values:
- <itemizedlist>
- <listitem>
- <firstterm>all</firstterm>: Replicate the queue or exchange, messages and bindings.
- </listitem>
- <listitem>
- <firstterm>configuration</firstterm>: Replicate the existence of the queue or
- exchange and bindings but don't replicate messages.
- </listitem>
- <listitem>
- <firstterm>none</firstterm>: Don't replicate, this is the default.
- </listitem>
- </itemizedlist>
- </para>
- <para>
- Bindings are automatically replicated if the queue and exchange being bound both have
- replication argument of <literal>all</literal> or <literal>configuration</literal>, they are
- not replicated otherwise.
- </para>
- <para>
- You can create replicated queues and exchanges with the <command>qpid-config</command>
- management tool like this:
- </para>
- <programlisting>
- qpid-config add queue myqueue --replicate all
- </programlisting>
- <para>
- To create replicated queues and exchanges via the client API, add a <literal>node</literal> entry to the address like this:
- </para>
- <programlisting>
- "myqueue;{create:always,node:{x-declare:{arguments:{'qpid.replicate':all}}}}"
- </programlisting>
- </section>
-
- <section>
- <title>Client Connection and Fail-over</title>
- <para>
- Clients can only connect to the primary broker. Backup brokers
- automatically reject any connection attempt by a client.
- </para>
- <para>
- Clients are configured with the URL for the cluster (details below for
- each type of client). There are two possibilities
- <itemizedlist>
- <listitem>
- The URL contains multiple addresses, one for each broker in the cluster.
- </listitem>
- <listitem>
- The URL contains a single <firstterm>virtual IP address</firstterm>
- that is assigned to the primary broker by the resource manager.
- <footnote><para>Only if the resource manager supports virtual IP addresses</para></footnote>
- </listitem>
- </itemizedlist>
- In the first case, clients will repeatedly re-try each address in the URL
- until they successfully connect to the primary. In the second case the
- resource manager will assign the virtual IP address to the primary broker,
- so clients only need to re-try on a single address.
- </para>
- <para>
- When the primary broker fails, clients re-try all known cluster addresses
- until they connect to the new primary. The client re-sends any messages
- that were previously sent but not acknowledged by the broker at the time
- of the failure. Similarly messages that have been sent by the broker, but
- not acknowledged by the client, are re-queued.
- </para>
- <para>
- TCP can be slow to detect connection failures. A client can configure a
- connection to use a <firstterm>heartbeat</firstterm> to detect connection
- failure, and can specify a time interval for the heartbeat. If heartbeats
- are in use, failures will be detected no later than twice the heartbeat
- interval. The following sections explain how to enable heartbeat in each
- client.
- </para>
- <para>
- See &#34;Cluster Failover&#34; in <citetitle>Programming in Apache
- Qpid</citetitle> for details on how to keep the client aware of cluster
- membership.
- </para>
- <para>
- Suppose your cluster has 3 nodes: <literal>node1</literal>, <literal>node2</literal>
- and <literal>node3</literal> all using the default AMQP port. To connect a client you
- need to specify the address(es) and set the <literal>reconnect</literal> property to
- <literal>true</literal>. Here's how to connect each type of client:
- </para>
- <section>
- <title>C++ clients</title>
- <para>
- With the C++ client, you specify multiple cluster addresses in a single URL
- <footnote>
- <para>
- The full grammar for the URL is:
- </para>
- <programlisting>
- url = ["amqp:"][ user ["/" password] "@" ] addr ("," addr)*
- addr = tcp_addr / rmda_addr / ssl_addr / ...
- tcp_addr = ["tcp:"] host [":" port]
- rdma_addr = "rdma:" host [":" port]
- ssl_addr = "ssl:" host [":" port]'
- </programlisting>
- </footnote>
- You also need to specify the connection option
- <literal>reconnect</literal> to be true. For example:
- </para>
- <programlisting>
- qpid::messaging::Connection c("node1,node2,node3","{reconnect:true}");
- </programlisting>
- <para>
- Heartbeats are disabled by default. You can enable them by specifying a
- heartbeat interval (in seconds) for the connection via the
- <literal>heartbeat</literal> option. For example:
- <programlisting>
- qpid::messaging::Connection c("node1,node2,node3","{reconnect:true,heartbeat:10}");
- </programlisting>
- </para>
- </section>
- <section>
- <title>Python clients</title>
- <para>
- With the python client, you specify <literal>reconnect=True</literal>
- and a list of <replaceable>host:port</replaceable> addresses as
- <literal>reconnect_urls</literal> when calling
- <literal>Connection.establish</literal> or
- <literal>Connection.open</literal>
- </para>
- <programlisting>
- connection = qpid.messaging.Connection.establish("node1", reconnect=True, reconnect_urls=["node1", "node2", "node3"])
- </programlisting>
- <para>
- Heartbeats are disabled by default. You can
- enable them by specifying a heartbeat interval (in seconds) for the
- connection via the &#39;heartbeat&#39; option. For example:
- </para>
- <programlisting>
- connection = qpid.messaging.Connection.establish("node1", reconnect=True, reconnect_urls=["node1", "node2", "node3"], heartbeat=10)
- </programlisting>
- </section>
- <section>
- <title>Java JMS Clients</title>
- <para>
- In Java JMS clients, client fail-over is handled automatically if it is
- enabled in the connection. You can configure a connection to use
- fail-over using the <command>failover</command> property:
- </para>
-
- <screen>
- connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;&amp;failover=&#39;failover_exchange&#39;
- </screen>
- <para>
- This property can take three values:
- </para>
- <variablelist>
- <title>Fail-over Modes</title>
- <varlistentry>
- <term>failover_exchange</term>
- <listitem>
- <para>
- If the connection fails, fail over to any other broker in the cluster.
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term>roundrobin</term>
- <listitem>
- <para>
- If the connection fails, fail over to one of the brokers specified in the <command>brokerlist</command>.
- </para>
-
- </listitem>
-
- </varlistentry>
- <varlistentry>
- <term>singlebroker</term>
- <listitem>
- <para>
- Fail-over is not supported; the connection is to a single broker only.
- </para>
-
- </listitem>
-
- </varlistentry>
-
- </variablelist>
- <para>
- In a Connection URL, heartbeat is set using the <command>idle_timeout</command> property, which is an integer corresponding to the heartbeat period in seconds. For instance, the following line from a JNDI properties file sets the heartbeat time out to 3 seconds:
- </para>
-
- <screen>
- connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;,idle_timeout=3
- </screen>
- </section>
- </section>
-
- <section>
- <title>The Cluster Resource Manager</title>
- <para>
- Broker fail-over is managed by a <firstterm>cluster resource
- manager</firstterm>. An integration with <ulink
- url="https://fedorahosted.org/cluster/wiki/RGManager">rgmanager</ulink> is
- provided, but it is possible to integrate with other resource managers.
- </para>
- <para>
- The resource manager is responsible for starting a on each node in the
- cluster. The resource manager then <firstterm>promotes</firstterm> one of
- the brokers to be the primary. The other brokers connect to the primary as
- backups, using the URL provided in the <literal>ha-brokers</literal>
- configuration option.
- </para>
- <para>
- Once connected, the backup brokers synchronize their state with the
- primary. When a backup is synchronized, or "hot", it is ready to take
- over if the primary fails. Backup brokers continually receive updates
- from the primary in order to stay synchronized.
- </para>
- <para>
- If the primary fails, backup brokers go into fail-over mode. The resource
- manager must detect the failure and promote one of the backups to be the
- new primary. The other backups connect to the new primary and synchronize
- their state so they can be backups for it.
- </para>
- <para>
- The resource manager is also responsible for protecting the cluster from
- <firstterm>split-brain</firstterm> conditions resulting from a network partition.
- A network partition divide a cluster into two sub-groups which cannot see each other.
- Usually a <firstterm>quorum</firstterm> voting algorithm is used that disables
- nodes in the inquorate sub-group.
- </para>
- </section>
- <section>
- <title>Configuring <command>rgmanager</command> as resource manager</title>
- <para>
- This section assumes that you are already familiar with setting up and
- configuring clustered services using <command>cman</command> and
- <command>rgmanager</command>. It will show you how to configure an
- active-passive, hot-standby <command>qpidd</command> HA cluster.
- </para>
- <para>
- Here is an example <literal>cluster.conf</literal> file for a cluster of 3
- nodes named node1, node2 and node3. We will go through the configuration
- step-by-step.
- </para>
- <programlisting>
- <![CDATA[
-<?xml version="1.0"?>
-<!--
-This is an example of a cluster.conf file to run qpidd HA under rgmanager.
-This example assumes a 3 node cluster, with nodes named node1, node2 and node3.
--->
-
-<cluster name="qpid-test" config_version="18">
- <!-- The cluster has 3 nodes. Each has a unique nodid and one vote for quorum. -->
- <clusternodes>
- <clusternode name="node1" nodeid="1">
- <fence/>
- </clusternode>
- <clusternode name="node2" nodeid="2">
- <fence/>
- </clusternode>
- <clusternode name="node3" nodeid="3">
- <fence/>
- </clusternode>
- </clusternodes>
- <!-- Resouce Manager configuration. -->
- <rm log_level="7"> <!-- Verbose logging -->
- <!--
- There is a failoverdomain for each node containing just that node.
- This lets us stipulate that the qpidd service should always run on all nodes.
- -->
- <failoverdomains>
- <failoverdomain name="node1-domain" restricted="1">
- <failoverdomainnode name="node1"/>
- </failoverdomain>
- <failoverdomain name="node2-domain" restricted="1">
- <failoverdomainnode name="node2"/>
- </failoverdomain>
- <failoverdomain name="node3-domain" restricted="1">
- <failoverdomainnode name="node3"/>
- </failoverdomain>
- </failoverdomains>
-
- <resources>
- <!-- This script starts a qpidd broker acting as a backup. -->
- <script file="!!sysconfdir!!/init.d/qpidd" name="qpidd"/>
-
- <!-- This script promotes the qpidd broker on this node to primary. -->
- <script file="!!sysconfdir!!/init.d/qpidd-primary" name="qpidd-primary"/>
-
- <!-- This is a virtual IP address for broker replication traffic. -->
- <ip address="20.0.10.200" monitor_link="1"/>
-
- <!-- This is a virtual IP address on a seprate network for client traffic. -->
- <ip address="20.0.20.200" monitor_link="1"/>
- </resources>
-
- <!-- There is a qpidd service on each node, it should be restarted if it fails. -->
- <service name="node1-qpidd-service" domain="node1-domain" recovery="restart">
- <script ref="qpidd"/>
- </service>
- <service name="node2-qpidd-service" domain="node2-domain" recovery="restart">
- <script ref="qpidd"/>
- </service>
- <service name="node3-qpidd-service" domain="node3-domain" recovery="restart">
- <script ref="qpidd"/>
- </service>
-
- <!-- There should always be a single qpidd-primary service, it can run on any node. -->
- <service name="qpidd-primary-service" autostart="1" exclusive="0" recovery="relocate">
- <script ref="qpidd-primary"/>
- <!-- The primary has the IP addresses for brokers and clients to connect. -->
- <ip ref="20.0.10.200"/>
- <ip ref="20.0.20.200"/>
- </service>
- </rm>
- <fencedevices/>
- <fence_daemon clean_start="0" post_fail_delay="0" post_join_delay="3"/>
-</cluster>
- ]]>
- </programlisting>
- <para>
- There is a <literal>failoverdomain</literal> for each node containing just that
- one node. This lets us stipulate that the qpidd service should always run on all
- nodes.
- </para>
- <para>
- The <literal>resources</literal> section defines the usual initialization
- script to start the <command>qpidd</command> service.
- <command>qpidd</command>. It also defines the
- <command>qpid-primary</command> script. Starting this script does not
- actually start a new service, rather it promotes the existing
- <command>qpidd</command> broker to primary status.
- </para>
- <para>
- The <literal>resources</literal> section also defines a pair of virtual IP
- addresses on different sub-nets. One will be used for broker-to-broker
- communication, the other for client-to-broker.
- </para>
- <para>
- To take advantage of the virtual IP addresses, <filename>qpidd.conf</filename>
- should contain these lines:
- </para>
- <programlisting>
- ha-cluster=yes
- ha-brokers=20.0.20.200
- ha-public-brokers=20.0.10.200
- </programlisting>
- <para>
- This configuration specifies that backup brokers will use 20.0.20.200
- to connect to the primary and will advertise 20.0.10.200 to clients.
- Clients should connect to 20.0.10.200.
- </para>
- <para>
- The <literal>service</literal> section defines 3 <command>qpidd</command>
- services, one for each node. Each service is in a restricted fail-over
- domain containing just that node, and has the <literal>restart</literal>
- recovery policy. The effect of this is that rgmanager will run
- <command>qpidd</command> on each node, restarting if it fails.
- </para>
- <para>
- There is a single <literal>qpidd-primary-service</literal> running the
- <command>qpidd-primary</command> script which is not restricted to a
- domain and has the <literal>relocate</literal> recovery policy. This means
- rgmanager will start <command>qpidd-primary</command> on one of the nodes
- when the cluster starts and will relocate it to another node if the
- original node fails. Running the <literal>qpidd-primary</literal> script
- does not start a new broker process, it promotes the existing broker to
- become the primary.
- </para>
- </section>
-
- <section>
- <title>Broker Administration</title>
- <para>
- Normally, clients are not allowed to connect to a backup broker. However management tools are
- allowed to connect to a backup brokers. If you use these tools you <emphasis>must
- not</emphasis> add or remove messages from replicated queues, or delete replicated queues or
- exchanges as this will corrupt the replication process and may cause message loss.
- </para>
- <para>
- <command>qpid-ha</command> allows you to view and change HA configuration settings.
- </para>
- <para>
- The tools <command>qpid-config</command>, <command>qpid-route</command> and
- <command>qpid-stat</command> will connect to a backup if you pass the flag <command>--ha-admin</command> on the
- command line.
- </para>
- </section>
-</section>
-
-<!-- LocalWords: scalability rgmanager multicast RGManager mailto LVQ qpidd IP dequeued Transactional username
--->
diff --git a/qpid/doc/book/src/Broker-Configuration-Guide.xml b/qpid/doc/book/src/Broker-Configuration-Guide.xml
deleted file mode 100644
index 63d2748eee..0000000000
--- a/qpid/doc/book/src/Broker-Configuration-Guide.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<section id="Java-Broker-Configuration-Guide">
- <title>Broker Configuration Guide </title>
-
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
- href="java/broker/configuration/Topic-Configuration.xml"/>
-</section>
diff --git a/qpid/doc/book/src/How-to-Use-JNDI.xml b/qpid/doc/book/src/How-to-Use-JNDI.xml
deleted file mode 100644
index 74506dde0f..0000000000
--- a/qpid/doc/book/src/How-to-Use-JNDI.xml
+++ /dev/null
@@ -1,175 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<chapter id="How-to-Use-JNDI">
- <title>
- How to Use JNDI
- </title>
- <section role="h2" id="HowtoUseJNDI-HowtousethePropertiesFileInitialContextFactory">
- <title>
- How to use the PropertiesFileInitialContextFactory
- </title>
-
- <para>
- This ContextFactory uses a java properties formatted file to
- setup initial values.
- </para>
- <section role="h3" id="HowtoUseJNDI-JNDIPropertysetup">
- <title>
- JNDI Property setup
- </title>
- <para>
- By setting the JNDI Initial Context Factory and URL as
- below it is possible to load any File from the locally
- mounted file system to use for JNDI purposes. The format
- of the file is described in the next section.
- </para>
- <programlisting>
-java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-java.naming.provider.url = &lt;path to JNDI File&gt;
-</programlisting>
- <para>
- By simply setting these two system properties you can jump
- straight to the InitialContext creation in your code.
- </para>
- </section>
- <section role="h3" id="HowtoUseJNDI-Examplepropertiesfile">
- <title>
- Example properties file </title>
- <para>
- This is the example properties file.
- </para>
- <programlisting>
-# register some connection factories
-# connectionfactory.[jndiname] = [ConnectionURL]
-connectionfactory.local = amqp://guest:guest@clientid/testpath?brokerlist='vm://:1'
-
-# register some queues in JNDI using the form
-# queue.[jndiName] = [physicalName]
-queue.MyQueue = example.MyQueue
-
-# register some topics in JNDI using the form
-# topic.[jndiName] = [physicalName]
-topic.ibmStocks = stocks.nyse.ibm
-
-# Register an AMQP destination in JNDI
-# NOTE: Qpid currently only supports direct,topics and headers
-# destination.[jniName] = [BindingURL]
-destination.direct = direct://amq.direct//directQueue
-</programlisting>
- <para>
- The property file allows a number of queues to be defined that
- can then be discovered via JNDI. There are four properties used
- by the PFICFactory.
- <emphasis>connectionfactory.&lt;jndiname&gt;</emphasis> this is the <xref linkend="Connection-URL-Format"/> that the connection
- factory will use to perform connections.
- <emphasis>queue.&lt;jndiname&gt;</emphasis> this defines a jms queue or in
- amqp a amq.direct exchange
- <emphasis>topic.&lt;jndiname&gt;</emphasis> this defines a jms topic or in
- amqp a amq.topic exchange
- <emphasis>destination.&lt;jndiname&gt;</emphasis> this takes a <xref linkend="BindingURLFormat"/>
- and so can be used for defining all amq destinations, queues,
- topics and header matching.
- </para><para>
- In all of these properties the <emphasis>&lt;jndiname&gt;</emphasis> is the
- string value that would be given when performing a lookup.
- </para><para>
- <emphasis>NOTE</emphasis>: This does not create the queue on the broker. You
- should ensure that you have created the queue before publishing
- to it. Queues can be declared in the virtualhosts.xml file so
- that they are created on broker startup, or created dynamically
- by consuming clients. Topics and other destinations that use
- temporary queues cannot be created in this way, so a consumer
- must be created first before publishing messages with mandatory
- routing.
- </para>
- </section>
- <section role="h3" id="HowtoUseJNDI-Examplelookupcode">
- <title>
- Example lookup code
- </title><!--h3-->
-
- <para>
- The <emphasis>bindingValue</emphasis> is the String that would be placed in
- <emphasis>&lt;jndiname&gt;</emphasis> above.
- </para>
-
- <example>
- <title>Simple JNDI lookup using files</title>
- <programlisting>
-//Ensure you have your system properties set
-final String INITIAL_CONTEXT_FACTORY = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
-
-System.setProperty(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
-System.setProperty(Context.PROVIDER_URL, _JNDIFile);
-
-// Create the initial context
-Context ctx = new InitialContext();
-
-// Perform the binds
-object = ctx.lookup(bindingValue);
-
-// Close the context when we're done
-ctx.close();
-</programlisting>
-</example>
-
-<example>
-<title>Simple JNDI lookup using properties</title>
-
- <programlisting>
-
-final String INITIAL_CONTEXT_FACTORY = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
-
-final String CONNECTION_JNDI_NAME = "local";
-final String CONNECTION_NAME = "amqp://guest:guest@clientid/testpath?brokerlist='vm://:1'";
-
-final String QUEUE_JNDI_NAME = "queue";
-final String QUEUE_NAME = "example.MyQueue";
-
-// Set the properties ...
-Properties properties = new Properties();
-properties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
-properties.put("connectionfactory."+CONNECTION_JNDI_NAME , CONNECTION_NAME);
-properties.put("queue."+QUEUE_JNDI_NAME , QUEUE_NAME);
-
-// Create the initial context
-Context ctx = new InitialContext(properties);
-
-// Perform the lookups
-ConnectionFactory factory = (ConnectionFactory)ctx.lookup(CONNECTION_JNDI_NAME);
-Queue queue = (Queue)ctx.lookup(QUEUE_JNDI_NAME);
-
-// Close the context when we're done
-ctx.close();
-</programlisting>
-</example>
- </section>
-
- <section>
- <title>Using Qpid with Other JNDI Providers</title>
- <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Using Qpid with other JNDI Providers.xml"/>
- </section>
-<!--h2-->
- </section>
-
-</chapter>
diff --git a/qpid/doc/book/src/Makefile.inc b/qpid/doc/book/src/Makefile.inc
new file mode 100644
index 0000000000..12cab54f8a
--- /dev/null
+++ b/qpid/doc/book/src/Makefile.inc
@@ -0,0 +1,63 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+BOOK=$(wildcard *Book.xml)
+XML=$(wildcard *.xml) $(wildcard ../common/*.xml)
+IMAGES=$(wildcard images/*.png)
+CSS=$(wilcard ../common/css/*.css)
+
+OUTPUTDIR=output
+OUTPUT= $(BOOK:%.xml=$(OUTPUTDIR)/%/)
+
+all: html pdf
+
+pdf: $(OUTPUT)/pdf $(BOOK:%.xml=$(OUTPUT)/pdf/%.pdf)
+
+html: $(OUTPUT)/html $(BOOK:%.xml=$(OUTPUT)/html/index.html)
+
+$(OUTPUT)/html/images: $(IMAGES)
+ -mkdir -p $(OUTPUT)/html/images
+ -cp images/*.png $(OUTPUT)/html/images/
+
+$(OUTPUT)/html/css: $(CSS)
+ -mkdir -p $(OUTPUT)/html/css
+ -cp ../common/css/*.css $(OUTPUT)/html/css
+
+$(OUTPUT)/html:
+ -mkdir -p $(OUTPUT)/html
+
+$(OUTPUT)/pdf:
+ -mkdir -p $(OUTPUT)/pdf
+
+$(OUTPUT)/html/index.html: $(BOOK) $(OUTPUT)/html/css $(OUTPUT)/html/images $(XML)
+ xsltproc -o $(OUTPUT)/html/ --xinclude --stringparam chunk.section.depth 1 --stringparam section.autolabel 1 --stringparam callout.graphics 0 --stringparam callout.unicode 0 --stringparam section.label.includes.component.label 1 --stringparam use.id.as.filename 1 --stringparam html.stylesheet css/style.css --stringparam section.autolabel.max.depth 3 --stringparam toc.section.depth 2 --stringparam chunker.output.encoding UTF-8 --stringparam css.decoration 0 ../../xsl/html-custom.xsl $<
+
+%.fo: %.xml
+ xsltproc --xinclude --stringparam section.autolabel 1 --stringparam callout.graphics 0 --stringparam callout.unicode 0 --stringparam section.label.includes.component.label 1 http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl $< > $@
+
+
+%.pdf: %.fo
+ fop $< $@
+
+$(OUTPUT)/pdf/%.pdf: %.pdf
+ @mv $< $@
+
+clean:
+ -rm -rf $(OUTPUT) *.fo
+
diff --git a/qpid/doc/book/src/Qpid-JMX-Management-Console-User-Guide.xml b/qpid/doc/book/src/Qpid-JMX-Management-Console-User-Guide.xml
deleted file mode 100644
index 55e1f8e829..0000000000
--- a/qpid/doc/book/src/Qpid-JMX-Management-Console-User-Guide.xml
+++ /dev/null
@@ -1,793 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<section id="Qpid-JMX-Management-Console-User-Guide"><title>
- Qpid JMX Management Console User Guide
- </title><section role="h1" id="QpidJMXManagementConsoleUserGuide-QpidJMXManagementConsoleUserGuide"><title>
- Qpid JMX Management Console User Guide
- </title>
-
-
- <para>
-
- The Qpid JMX Management Console is a standalone Eclipse RCP
- application for managing and monitoring the Qpid Java server
- utilising its JMX management interfaces.
- </para><para>
- This guide will give an overview of configuring the console, the
- features supported by it, and how to make use of the console in
- managing the various JMX Management Beans (MBeans) offered by the
- Qpid Java server.
- </para>
-<!--h1--></section>
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-Startup-26Configuration"><title>
-
- Startup &amp; Configuration
- </title>
-
- <para>
-
- </para>
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-Startup"><title>
- Startup
- </title>
-
- <para>
-
- The console can be started in the following way, depending on
- platform:
- </para><itemizedlist>
- <listitem><para>
- <emphasis>Windows:</emphasis> by running the <emphasis>qpidmc.exe</emphasis> executable
- file.
- </para></listitem>
- <listitem><para>
- <emphasis>Linux:</emphasis> by running the <emphasis>qpidmc</emphasis> executable.
- </para></listitem>
- <listitem><para>
- <emphasis>Mac OS X:</emphasis> by launching the <emphasis>Qpid Management
- Console.app</emphasis> application bundle.
- </para></listitem>
- </itemizedlist><para>
-
- </para>
- </section>
-
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-SSLconfiguration"><title>
- SSL
- configuration
- </title>
-
- <para>
-
- Newer Qpid Java servers can protect their JMX connections with
- SSL, and this is enabled by default. When attempting to connect
- to a server with this enabled, the console must be able to verify
- the SSL certificate presented to it by the server or the
- connection will fail.
- </para><para>
- If the server makes use of an SSL certificate signed by a known
- Signing CA (Certification Authority) then the console needs no
- extra configuration, and will make use of Java's default
- system-wide CA TrustStore for certificate verification (you may
- however have to update the system-wide default CA TrustStore if
- your certified is signed by a less common CA that is not already
- present in it).
- </para><para>
- If however the server is equipped with a self-signed SSL
- certificate, then the management console must be provided with an
- appropriate SSL TrustStore containing the public key for the SSL
- certificate, so that it is able to validate it when presented by
- the server. The server ships with a script to create an example
- self-signed SSL certificate, and store the relevant entries in a
- KeyStore and matching TrustStore. This script can serve as a
- guide on how to use the Java Keytool security utility to
- manipulate your own stores, and more information can be found in
- the JSSE Reference Guide:
- <ulink url="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores">http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores</ulink>.
- </para><para>
- Supplying the necessary details to the console is performed by
- setting the <emphasis>javax.net.ssl.trustStore</emphasis> and
- <emphasis>javax.net.ssl.trustStorePassword</emphasis> environment variables
- when starting it. This can be done at the command line, but the
- preferred option is to set the configuration within the
- <emphasis>qpidmc.ini</emphasis> launcher configuration file for repeated
- usage. This file is equipped with a template to ease
- configuration, this should be uncommented and edited to suit your
- needs. It can be found in the root of the console releases for
- Windows, and Linux. For Mac OS X the file is located within the
- consoles <emphasis>.app</emphasis> application bundle, and to locate and edit
- it you must select <emphasis>'Show Package Contents'</emphasis> when
- accessing the context menu of the application, then browse to the
- <emphasis>Contents/MacOS</emphasis> sub folder to locate the file.
- </para>
-<!--h2--></section>
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-JMXMPconfiguration"><title>
- JMXMP
- configuration
- </title>
-
- <para>
-
- Older releases of the Qpid Java server can make use of the Java
- Management Extensions Messaging Protocol (JMXMP) to provide
- protection for their JMX connections. This occurs when the server
- has its main configuration set with the management
- <emphasis>'security-enabled'</emphasis> property set to true.
- </para><para>
- In order to connect to this configuration of server, the console
- needs an additional library that is not included within the Java
- SE platform and cannot be distributed with the console due to
- licensing restrictions.
- </para><para>
- You can download the JMX Remote API 1.0.1_04 Reference
- Implementation from the Sun website <xref linkend="qpid_download.jsp"/>. The included
- <emphasis>jmxremote-1_0_1-bin/lib/jmxremote_optional.jar</emphasis> file must
- be added to the <emphasis>plugins/jmxremote.sasl_1.0.1</emphasis> folder of
- the console release (again, in Mac OS X you will need to select
- <emphasis>'Show package contents'</emphasis> from the context menu whilst
- selecting the management console bundle in order to reveal the
- inner file tree).
- </para><para>
- Following this the console will automatically load the JMX Remote
- Optional classes and negotiate the SASL authentication profile
- type when encountering a JMXMP enabled Qpid Java server.
- </para>
-<!--h2--></section>
-<!--h1--></section>
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingServerConnections"><title>
-
- Managing Server Connections
- </title>
-
- <para>
-
- </para>
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-MainToolbar"><title>
- Main Toolbar
- </title>
-
- <para>
-
- The main toolbar of the console can be seen in the image below.
- The left most buttons respectively allow for adding a new server
- connection, reconnecting to an existing server selected in the
- connection tree, disconnecting the selected server connection,
- and removing the server from the connection tree.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113098.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
-
-
- Beside these buttons is a combo for selecting the refresh
- interval; that is, how often the console requests updated
- information to display for the currently open area in the main
- view. Finally, the right-most button enables an immediate update.
- </para>
- </section>
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-Connectingtoanewserver"><title>
- Connecting
- to a new server
- </title>
-
- <para>
-
- To connect to a new server, press the <emphasis>Add New Server</emphasis>
- toolbar button, or select the <emphasis>Qpid Manager -&gt; Add New
- Connection</emphasis> menu item. At this point a dialog box will be
- displayed requesting the server details, namely the server
- hostname, management port, and a username and password. An
- example is shown below:
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113099.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
-
- Once all the required details are entered, pressing Connect will
- initiate a connection attempt to the server. It the attempt fails
- a reason will be shown and the server will not be added to the
- connection tree. If the attempt is successful the server will be
- added to the connections list and the entry expanded to show the
- initial administration MBeans the user has access to and any
- VirtualHosts present on the server, as can be seen in the figure
- below.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113100.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
-
- If the server supports a newer management API than the console in
- use, once connected this initial screen will contain a message on
- the right, indicating an upgraded console should be sought by the
- user to ensure all management functionality supported by the
- server is being utilised.
- </para>
-<!--h2--></section>
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-Reconnectingtoaserver"><title>
- Reconnecting
- to a server
- </title>
-
- <para>
-
- If a server has been connected to previously, it will be saved as
- an entry in the connection tree for further use. On subsequent
- connections the server can simply be selected from the tree and
- using the <emphasis>Reconnect</emphasis> toolbar button or <emphasis>Qpid Manager
- -&gt; Reconnect</emphasis> menu item. At this stage the console will
- prompt simply for the username and password with which the user
- wishes to connect, and following a successful connection the
- screen will appear as shown previously above.
- </para>
-<!--h2--></section>
-
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-Disconnectingfromaserver"><title>
- Disconnecting
- from a server
- </title>
-
- <para>
-
- To disconnect from a server, select the connection tree node for
- the server and press the <emphasis>Disconnect</emphasis> toolbar button, or
- use the <emphasis>Qpid Manager -&gt; Disconnect</emphasis> menu option.
- </para>
-<!--h2--></section>
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-Removingaserver"><title>
- Removing a
- server
- </title>
-
- <para>
-
- To remove a server from the connection list, select the
- connection tree node for the server and press the <emphasis>Remove</emphasis>
- toolbar button, or use the <emphasis>Qpid Manager -&gt; Remove
- Connection</emphasis> menu option.
- </para>
-<!--h2--></section>
-<!--h1--></section>
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-Navigatingaconnectedserver"><title>
- Navigating a connected server
- </title>
-
- <para>
-
- Once connected to a server, the various areas available for
- administration are accessed using the Qpid Connections tree at
- the left side of the application. To open a particular MBean from
- the tree for viewing, simply select it in the tree and it will be
- opened in the main view.
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113101.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- As there may be vast numbers of Queues, Connections, and
- Exchanges on the server these MBeans are not automatically added
- to the tree along with the general administration MBeans.
- Instead, dedicated selection areas are provided to allow users to
- select which Queue/Connection/Exchange they wish to view or add
- to the tree. These areas can be found by clicking on the
- Connections, Exchanges, and Queues nodes in the tree under each
- VirtualHost, as shown in the figure above. One or more MBeans may
- be selected and added to the tree as Favourites using the button
- provided. These settings are saved for future use, and each time
- the console connects to the server it will check for the presence
- of the MBean previously in the tree and add them if they are
- still present. Queue/Connection/Exchange MBeans can be removed
- from the tree by right clicking on them to expose a context menu
- allowing deletion.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113102.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- As an alternative way to open a particular MBean for viewing,
- without first adding it to the tree, you can simply double click
- an entry in the table within the Queue/Connection/Exchange
- selection areas to open it immediately. It is also possible to
- open some MBeans like this whilst viewing certain other MBeans.
- When opening an MBean in either of these ways, a Back button is
- enabled in the top right corner of the main view. Using this
- button will return you to the selection area or MBean you were
- previously viewing. The history resets each time the tree is used
- to open a new area or MBean.
- </para>
-<!--h1--></section>
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ConfigurationManagementMBean"><title>
-
- ConfigurationManagement MBean
- </title>
-
- <para>
-
- The ConfigurationManagement MBean is available on newer servers,
- to users with admin level management rights. It offers the
- ability to perform a live reload of the <emphasis>Security</emphasis>
- sections defined in the main server configuration file (e.g.
- defaults to: <emphasis>etc/config.xml</emphasis>). This is mainly to allow
- updating the server Firewall configuration to new settings
- without a restart, and can be performed by clicking the Execute
- button and confirming the prompt which follows.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113103.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para>
-<!--h1--></section>
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-LoggingManagementMBean"><title>
-
- LoggingManagement MBean
- </title>
-
- <para>
-
- The LoggingManagement MBean is available on newer servers, and
- accessible by admin level users. It allows live alteration of the
- logging behaviour, both at a Runtime-only level and at the
- configuration file level. The latter can optionally affect the
- Runtime configuration, either through use of the servers
- automated LogWatch ability which detects changes to the
- configuration file and reloads it, or by manually requesting a
- reload. This functionality is split across two management tabs,
- Runtime Options and ConfigurationFile Options.
- </para>
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-RuntimeOptions"><title>
- Runtime
- Options
- </title>
-
- <para>
-
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113104.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- The Runtime Options tab allows manipulation of the logging
- settings without affecting the configuration files (this means
- the changes will be lost when the server restarts), and gives
- individual access to every Logger active within the server.
- </para><para>
- As shown in the figure above, the table in this tab presents the
- Effective Level of each Logger. This is because the Loggers form
- a hierarchy in which those without an explicitly defined (in the
- logging configuration file) Level will inherit the Level of their
- immediate parent; that is, the Logger whose full name is a prefix
- of their own, or if none satisfy that condition then the
- RootLogger is their parent. As example, take the
- <emphasis>org.apache.qpid</emphasis> Logger. It is parent to all those below
- it which begin with <emphasis>org.apache.qpid</emphasis> and unless they have
- a specific Level of their own, they will inherit its Level. This
- can be seen in the figure, whereby all the children Loggers
- visible have a level of WARN just like their parent, but the
- RootLogger Level is INFO; the children have inherited the WARN
- level from <emphasis>org.apache.qpid</emphasis> rather than INFO from the
- RootLogger.
- </para><para>
- To aid with this distinction, the Logger Levels that are
- currently defined in the configuration file are highlighted in
- the List. Changing these levels at runtime will also change the
- Level of all their children which haven't been set their own
- Level using the runtime options. In the latest versions of the
- LoggingManagement MBean, it is possible to restore a child logger
- that has had an explicit level se, to inheriting that of its
- parent by setting it to an INHERITED level that removes any
- previously set Level of its own.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113105.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- In order to set one of more Loggers to a new Level, they should
- be selected in the table (or double click an individual Logger to
- modify it) and the <emphasis>Edit Selected Logger(s)</emphasis> button
- pressed to load the dialog shown above. At this point, any of the
- available Levels supported by the server can be applied to the
- Loggers selected and they will immediately update, as will any
- child Loggers without their own specific Level.
- </para><para>
- The RootLogger can be similarly edited using the button at the
- bottom left of the window.
- </para>
-<!--h2--></section>
-
- <section role="h2" id="QpidJMXManagementConsoleUserGuide-ConfigurationFileOptions"><title>
- ConfigurationFile
- Options
- </title>
-
- <para>
-
- The ConfigurationFile Options tab allows alteration of the Level
- settings for the Loggers defined in the configuration file,
- allowing changes to persist following a restart of the server.
- Changes made to the configuration file are only applied
- automatically while the sever is running if it was configured to
- enable the LogWatch capability, meaning it will monitor the
- configuration file for changes and apply the new configuration
- when the change is detected. If this was not enabled, the changes
- will be picked up when the server is restarted. The status of the
- LogWatch feature is shown at the bottom of the tab.
- Alternatively, in the latest versions of the LoggingManagement
- MBean it is possible to reload the logging configuration file on
- demand.
- </para><para>
- Manipulating the Levels is as on the Runtime Options tab, either
- double-click an individual Logger entry or select multiple
- Loggers and use the button to load the dialog to set the new
- Level.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113106.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- One issue to note of when reloading the configuration file
- settings, either automatically using LogWatch or manually, is
- that any Logger set to a specific Level using the Runtime Options
- tab that is not defined in the configuration file will maintain
- that Level when the configuration file is reloaded. In other
- words, if a Logger is defined in the configuration file, then the
- configuration file will take precedence at reload, otherwise the
- Runtime options take precedence.
- </para><para>
- This situation will be immediately obvious by examining the
- Runtime Options tab to see the effective Level of each Logger
- – unless it has been altered with the RuntimeOptions or
- specifically set in the configuration file, a Logger Level should
- match that of its parent. In the latest versions of the
- LoggingManagement MBean, it is possible to use the RuntimeOptions
- to restore a child logger to inheriting from its parent by
- setting it with an INHERITED level that removes any previously
- set Level of its own.
-
- </para>
-<!--h2--></section>
-<!--h1--></section>
-
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ServerInformationMBean"><title>
- ServerInformation MBean
- </title>
-
- <para>
-
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113107.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- The ServerInformation MBean currently only conveys various pieces
- of version information to allow precise identification of the
- server version and its management capabilities. In future it is
- likely to convey additional server-wide details and/or
- functionality.
- </para>
-<!--h1--></section>
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-UserManagementMBean"><title>
-
- UserManagement MBean
- </title>
-
- <para>
-
- The UserManagement MBean is accessible by admin level users, and
- allows manipulation of existing user accounts and creation of new
- user accounts.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113108.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
-
- To add a new user, press the <emphasis>Add New User</emphasis> button, which
- will load the dialog shown below.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113109.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Here you may enter the new users Username, Password, and select
- their JMX Management Rights. This controls whether or not they
- have access to the management interface, and if so what
- capabilities are accessible. <emphasis>Read Only</emphasis> access allows
- undertaking any operations that do not alter the server state,
- such as viewing messages. <emphasis>Read + Write</emphasis> access allows use
- of all operations which are not deemed admin-only (such as those
- in the UserManagement MBean itself). <emphasis>Admin</emphasis> access allows
- a user to utilize any operation, and view the admin-only MBeans
- (currently these are ConfigurationManagement, LoggingManagement,
- and UserManagement).
- </para><para>
- One or more users at a time may be deleted by selecting them in
- the table and clicking the <emphasis>Delete User(s)</emphasis> button. The
- console will then prompt for confirmation before undertaking the
- removals. Similarly, the access rights for one or more users may
- be updated by selecting them in the table and clicking the
- <emphasis>Set Rights</emphasis> button. The console will then display a
- dialog enabling selection of the new access level and
- confirmation to undertake the update.
- </para><para>
- An individual user password may be updated by selecting the user
- in the table in and clicking the <emphasis>Set Password</emphasis> button.
- The console will then display a dialog enabling input of the new
- password and confirmation to undertake the update.
- </para><para>
-
- The server caches the user details in memory to aid performance.
- If may sometimes be necessary to externally modify the password
- and access right files on disk. In order for these changes to be
- known to the server without a restart, it must be instructed to
- reload the file contents. This can be done using the provided
- <emphasis>Reload User Details</emphasis> button (on older servers, only the
- management rights file is reloaded, on newer servers both files
- are. The description on screen will indicate the behaviour).
- After pressing this button the console will seek confirmation
- before proceeding.
- </para>
-<!--h1--></section>
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-VirtualHostManagerMBean"><title>
-
- VirtualHostManager MBean
- </title>
-
- <para>
-
- Each VirtualHost in the server has an associated
- VirtualHostManager MBean. This allows viewing, creation, and
- deletion of Queues and Exchanges within the VirtualHost.
- </para><para>
- Clicking the <emphasis>Create</emphasis> button in the Queue section will
- open a dialog allowing specification of the Name, Owner
- (optional), and durability properties of the new Queue, and
- confirmation of the operation.
- </para><para>
- One or more Queues may be deleted by selecting them in the table
- and clicking the <emphasis>Delete</emphasis> button. This will unregister the
- Queue bindings, remove the subscriptions and delete the Queue(s).
- The console will prompt for confirmation before undertaking the
- operation.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113110.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Clicking the <emphasis>Create</emphasis> button in the Exchange section will
- open a dialog allowing specification of the Name, Type, and
- Durable attributes of the new Exchange, and confirmation of the
- operation.
- </para><para>
- One or more Exchanges may be deleted by selecting them in the
- table and clicking the <emphasis>Delete</emphasis> button. This will
- unregister all the related channels and Queue bindings then
- delete the Exchange(s). The console will prompt for confirmation
- before undertaking the operation.
- </para><para>
-
- Double-clicking on a particular Queue or Exchange name in the
- tables will open the MBean representing it.
- </para>
-<!--h1--></section>
-
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-Notifications"><title>
-
- Notifications
- </title>
-
- <para>
-
- MBeans on the server can potentially send Notifications that
- users may subscribe to. When managing an individual MBean that
- offers Notifications types for subscription, the console supplies
- a Notifications tab to allow (un)subscription to the
- Notifications if desired and viewing any that are received
- following subscription.
- </para><para>
- In order to provide quicker access to/awareness of any received
- Notifications, each VirtualHost area in the connection tree has a
- Notifications area that aggregates all received Notifications for
- MBeans in that VirtualHost. An example of this can be seen in the
- figure below.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113111.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- All received Notifications will be displayed until such time as
- the user removes them, either in this aggregated view, or in the
- Notifications area of the individual MBean that generated the
- Notification.
- </para><para>
- They may be cleared selectively or all at once. To clear
- particular Notifications, they should be selected in the table
- before pressing the <emphasis>Clear</emphasis> button. To clear all
- Notifications, simply press the <emphasis>Clear</emphasis> button without
- anything selected in the table, at which point the console will
- request confirmation of this clear-all action.
- </para>
-<!--h1--></section>
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingQueues"><title>
- Managing
- Queues
- </title>
-
- <para>
-
- As mentioned in earlier discussion of Navigation, Queue MBeans
- can be opened either by double clicking an entry in the Queues
- selection area, or adding a queue to the tree as a favourite and
- clicking on its tree node. Unique to the Queue selection screen
- is the ability to view additional attributes beyond just that of
- the Queue Name. This is helpful for determining which Queues
- satisfy a particular condition, e.g. having &lt;X&gt; messages on
- the queue. The example below shows the selection view with
- additional attributes <emphasis>Consumer Count, Durable, MessageCount,
- and QueueDepth</emphasis> (selected using the <emphasis>Select
- Attributes</emphasis> button at the bottom right corner of the
- table)<emphasis>.</emphasis>
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113112.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Upon opening a Queue MBean, the Attributes tab is displayed, as
- shown below. This allows viewing the value all attributes,
- editing those which are writable values (highlighted in blue) if
- the users management permissions allow, viewing descriptions of
- their purpose, and graphing certain numerical attribute values as
- they change over time.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113113.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- The next tab contains the operations that can be performed on the
- queue. The main table serves as a means of viewing the messages
- on the queue, and later for selecting specific messages to
- operate upon. It is possible to view any desired range of
- messages on the queue by specifying the visible range using the
- fields at the top and pressing the <emphasis>Set</emphasis> button. Next to
- this there are helper buttons to enable faster browsing through
- the messages on the queue; these allow moving forward and back by
- whatever number of messages is made visible by the viewing range
- set. The Queue Position column indicates the position of each
- message on the queue, but is only present when connected to newer
- servers as older versions cannot provide the necessary
- information to show this (unless only a single message position
- is requested).
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113114.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Upon selecting a message in the table, its header properties and
- redelivery status are updated in the area below the table. Double
- clicking a message in the table (or using the <emphasis>View Message
- Content</emphasis> button to its right) will open a dialog window
- displaying the contents of the message.
- </para><para>
- One or more messages can be selected in the table and moved to
- another queue in the VirtualHost by using the <emphasis>Move
- Message(s)</emphasis> button, which opens a dialog to enable selection
- of the destination and confirmation of the operation. Newer
- servers support the ability to similarly copy the selected
- messages to another queue in a similar fashion, or delete the
- selected messages from the queue after prompting for
- confirmation.
- </para><para>
- Finally, all messages (that have not been acquired by consumers)
- on the queue can be deleted using the <emphasis>Clear Queue</emphasis>
- button, which will generate a prompt for confirmation. On newer
- servers, the status bar at the lower left of the application will
- report the number of messages actually removed.
- </para>
-<!--h1--></section>
-
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingExchanges"><title>
-
- Managing Exchanges
- </title>
-
- <para>
- Exchange MBeans are opened for management operations in similar
- fashion as described for Queues, again showing an Attributes tab
- initially, with the Operations tab next:
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113115.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Of the four default Exchange Types <emphasis>(direct, fanout, headers,
- and topic)</emphasis> all but <emphasis>headers</emphasis> have their bindings
- presented in the format shown above. The left table provides the
- binding/routing keys present in the exchange. Selecting one of
- these entries in the table prompts the right table to display all
- the queues associated with this key. Pressing the <emphasis>Create</emphasis>
- button opens a dialog allowing association of an existing queue
- with the entered Binding.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113116.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- The <emphasis>headers</emphasis> Exchange type (default instantiation
- <emphasis>amq.match or amq.headers</emphasis>) is presented as below:
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113117.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- In the previous figure, the left table indicates the binding
- number, and the Queue associated with the binding. Selecting one
- of these entries in the table prompts the right table to display
- the header values that control when the binding matches an
- incoming message.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113118.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- </para><para>
- Pressing the <emphasis>Create</emphasis> button when managing a
- <emphasis>headers</emphasis> Exchange opens a dialog allowing creation of a
- new binding, associating an existing Queue with a particular set
- of header keys and values. The <emphasis>x-match</emphasis> key is required,
- and instructs the server whether to match the binding with
- incoming messages based on ANY or ALL of the further key-value
- pairs entered. If it is desired to enter more than 4 pairs, you
- may press the <emphasis>Add additional field</emphasis> button to create a
- new row as many times as is required.
-
- When managing a <emphasis>headers</emphasis> Exchange, double clicking an
- entry in the left-hand table will open the MBean for the Queue
- specified in the binding properties.
- </para><para>
- When managing another Exchange Type, double clicking the Queue
- Name in the right-hand table will open the MBean of the Queue
- specified.
- </para>
-<!--h1--></section>
-
- <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingConnections"><title>
-
- Managing Connections
- </title>
-
- <para>
-
- Exchange MBeans are opened for management operations in similar
- fashion as described for Queues, again showing an Attributes tab
- initially, with the Operations tab next, and finally a
- Notifications tab allowing subscription and viewing of
- Notifications. The Operations tab can be seen in the figure
- below.
- </para><para>
- <mediaobject><imageobject><imagedata fileref="images/jmx_console/3113119.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
- The main table shows the properties of all the Channels that are
- present on the Connection, including whether they are
- <emphasis>Transactional</emphasis>, the <emphasis>Number of Unacked Messages</emphasis>
- on them, and the <emphasis>Default Queue</emphasis> if there is one (or
- <emphasis>null</emphasis> if there is not).
- </para><para>
- The main operations supported on a connection are Commiting and
- Rolling Back of Transactions on a particular Channel, if the
- Channel is Transactional. This can be done by selecting a
- particular Channel in the table and pressing the <emphasis>Commit
- Transactions</emphasis> or <emphasis>Rollback Transactions</emphasis> buttons at
- the lower right corner of the table, at which point the console
- will prompt for confirmation of the action. These buttons are
- only active when the selected Channel in the table is
- Transactional.
- </para><para>
- The final operation supported is closing the Connection. After
- pressing the <emphasis>Close Connection</emphasis> button, the console will
- prompt for confirmation of the action. If this is carried out,
- the MBean for the Connection being managed will be removed from
- the server. The console will be notified of this by the server
- and display an information dialog to that effect, as it would if
- any other MBean were to be unregistered whilst being viewed.
- </para><para>
- Double clicking a row in the table will open the MBean of the
- associated <emphasis>Default Queue</emphasis> if there is one.
- </para>
-
-<!--h1--></section>
-</section>
diff --git a/qpid/doc/book/src/amqp-advanced-message-queueing-protocol.html b/qpid/doc/book/src/amqp-advanced-message-queueing-protocol.html
deleted file mode 100644
index 9d46429d03..0000000000
--- a/qpid/doc/book/src/amqp-advanced-message-queueing-protocol.html
+++ /dev/null
@@ -1,237 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<HTML>
- <HEAD>
- <LINK type="text/css" rel="stylesheet" href="resources/space.css">
- <STYLE type="text/css">
- .footer {
- background-image: url('http://cwiki.apache.org/confluence/images/border/border_bottom.gif');
- background-repeat: repeat-x;
- background-position: left top;
- padding-top: 4px;
- color: #666;
- clear: both;
- }
- .left {
- padding-top: 5px;
- float : left;
- width : 15em;
- }
- .pagecontent {
- float: left;
- width: 70%;
- }
- </STYLE>
- <SCRIPT type="text/javascript" language="javascript">
- var hide = null;
- var show = null;
- var children = null;
-
- function init() {
- /* Search form initialization */
- var form = document.forms['search'];
- if (form != null) {
- form.elements['domains'].value = location.hostname;
- form.elements['sitesearch'].value = location.hostname;
- }
-
- /* Children initialization */
- hide = document.getElementById('hide');
- show = document.getElementById('show');
- children = document.all != null ?
- document.all['children'] :
- document.getElementById('children');
- if (children != null) {
- children.style.display = 'none';
- show.style.display = 'inline';
- hide.style.display = 'none';
- }
- }
-
- function showChildren() {
- children.style.display = 'block';
- show.style.display = 'none';
- hide.style.display = 'inline';
- }
-
- function hideChildren() {
- children.style.display = 'none';
- show.style.display = 'inline';
- hide.style.display = 'none';
- }
- </SCRIPT>
- <TITLE>Apache Qpid: Open Source AMQP Messaging - AMQP (Advanced Message Queueing Protocol)</TITLE>
- <META http-equiv="Content-Type" content="text/html;charset=UTF-8"></HEAD>
- <BODY onload="init()">
- <TABLE border="0" cellpadding="2" cellspacing="0" width="100%">
- <TR class="topBar">
- <TD align="left" valign="middle" class="topBarDiv" align="left" nowrap="">
- &nbsp;<A href="index.html" title="Apache Qpid">Apache Qpid</A>&nbsp;&gt;&nbsp;<A href="index.html" title="Index">Index</A>&nbsp;&gt;&nbsp;<A href="" title="AMQP (Advanced Message Queueing Protocol)">AMQP (Advanced Message Queueing Protocol)</A>
- </TD>
- <TD align="right" valign="middle" nowrap="">
- <FORM name="search" action="http://www.google.com/search" method="get">
- <INPUT type="hidden" name="ie" value="UTF-8">
- <INPUT type="hidden" name="oe" value="UTF-8">
- <INPUT type="hidden" name="domains" value="">
- <INPUT type="hidden" name="sitesearch" value="">
- <INPUT type="text" name="q" maxlength="255" value="">
- <INPUT type="submit" name="btnG" value="Google Search">
- </FORM>
- </TD>
- </TR>
- </TABLE>
-
- <DIV id="PageContent">
- <DIV class="pageheader" style="padding: 6px 0px 0px 0px;">
-<DIV>
-<TABLE border="0" width="90%">
-<TR>
-<TD align="left">
-<A href="http://qpid.apache.org/">
-<IMG src="http://qpid.apache.org/images/qpid-logo.png" height="69" width="225" border="0"></A>
-</TD>
-<TD>
-</TD>
-<TD align="right"> <A href="http://www.apache.org/">
- <IMG src="http://qpid.apache.org/images/asf-logo.png" height="69" width="225" border="0"></A></TD>
-</TR>
-</TABLE>
-</DIV>
-
- </DIV>
-
-<!--
-
-
- <div class="pagesubheading" style="margin: 0px 10px 0px 10px;">
- Added by <a href="/confluence/display/~jonathan.robie@redhat.com">Jonathan Robie</a>, last edited by <a href="/confluence/display/~jonathan.robie@redhat.com">Jonathan Robie</a> on Feb 18, 2009
- &nbsp;(<a class="noprint" href="/confluence/pages/diffpages.action?pageId=110693&originalId=110695">view change</a>)
-
- </div>
--->
-
- <DIV class="left">
-
-
-
-
- <DIV class="panel" style="background-color: E0E0FF;border-color: #202080;border-style: solid;border-width: 1px;"><DIV class="panelContent" style="background-color: E0E0FF;">
-<H3><A name="Navigation-ApacheQpid"></A>Apache Qpid</H3>
-<P> <A href="index.html" title="Index">Home</A><BR>
- <A href="download.html" title="Download">Download</A><BR>
- <A href="getting-started.html" title="Getting Started">Getting Started</A> <BR>
- <A href="documentation.html" title="Documentation">Documentation</A><BR>
- <A href="mailing-lists.html" title="Mailing Lists">Mailing Lists</A><BR>
- <A href="http://issues.apache.org/jira/browse/qpid" rel="nofollow">Issue Reporting</A><BR>
- <A href="faq.html" title="FAQ">FAQ/How to</A></P>
-
-<H3><A name="Navigation-Resources"></A>Resources</H3>
-<P> <A href="getting-involved.html" title="Getting Involved">Getting Involved</A><BR>
- <A href="qpid-integrations.html" title="Qpid Integrations">Qpid Integrated with..</A><BR>
- <A href="source-repository.html" title="Source Repository">Source Repository</A><BR>
- <A href="building.html" title="Building">Building Qpid</A><BR>
- <A href="developer-pages.html" title="Developer Pages">Developer Pages</A><BR>
- <A href="qpid-management-framework.html" title="Qpid Management Framework">QMF</A></P>
-
-<H3><A name="Navigation-AboutQpid"></A>About Qpid</H3>
-<P> <A href="people.html" title="People">People</A><BR>
- <A href="license.html" title="License">License</A><BR>
- <A href="project-status.html" title="Project Status">Project Status</A><BR>
- <A href="acknowledgments.html" title="Acknowledgments">Acknowledgments</A></P>
-
-<H3><A name="Navigation-AboutAMQP"></A>About AMQP</H3>
-<P> <A href="" title="AMQP (Advanced Message Queueing Protocol)">What is AMQP ?</A><BR>
- <A href="" title="AMQP (Advanced Message Queueing Protocol)">AMQP Specification Download</A></P>
-
-<P><IMG src="navigation.data/AMQP_logo_71px-small.jpg" align="absmiddle" border="0"></P>
-</DIV></DIV>
- </DIV>
-
- <DIV class="pagecontent">
- <DIV class="wiki-content">
- <H2><A name="AMQP%28AdvancedMessageQueueingProtocol%29-WhatisAMQP%3F"></A>What is AMQP?</H2>
-
-<P>AMQP <A href="http://www.amqp.org/" rel="nofollow">Advanced Message Queuing Protocol</A> is an open standard designed to support reliable, high-performance messaging over the Internet. AMQP can be used for any distributed or business application, and supports common messaging paradigms like point-to-point, fanout, publish-subscribe, and request-response.</P>
-
-<P>Apache Qpid implements AMQP, including transaction management, queuing, clustering, federation, security, management and multi-platform support.</P>
-
-
-<P>Apache Qpid implements the latest AMQP specification, providing transaction management, queuing, distribution, security, management, clustering, federation and heterogeneous multi-platform support and a lot more. </P>
-
-<P>Apache Qpid is highly optimized, and <A href="amqp-compatibility.html" title="AMQP compatibility">aims to be 100% AMQP Compliant</A>.</P>
-
-<H2><A name="AMQP%28AdvancedMessageQueueingProtocol%29-DownloadtheAMQPSpecifications"></A>Download the AMQP Specifications</H2>
-
-<H3><A name="AMQP%28AdvancedMessageQueueingProtocol%29-AMQPversion010"></A>AMQP version 0-10</H3>
-
-
-<UL>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp.0-10.pdf?version=1" rel="nofollow">AMQP 0-10 Specification (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp.0-10.xml?version=1" rel="nofollow">AMQP 0-10 Protocol Definition XML </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp.0-10.dfd?version=1" rel="nofollow">AMQP 0-10 Protocol Definition DTD </A></LI>
-</UL>
-
-
-<H3><A name="AMQP%28AdvancedMessageQueueingProtocol%29-AMQPversion091"></A>AMQP version 0-9-1</H3>
-
-<UL>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9-1.pdf?version=1" rel="nofollow">AMQP 0-9-1 Specification (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9-1.xml?version=1" rel="nofollow">AMQP 0-9-1 Protocol Documentation (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9-1.dtd?version=1" rel="nofollow">AMQP 0-9-1 Protocol Definitions (XML) </A></LI>
-</UL>
-
-
-<H3><A name="AMQP%28AdvancedMessageQueueingProtocol%29-AMQPversion09"></A>AMQP version 0-9</H3>
-
-<UL>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9.pdf?version=1" rel="nofollow">AMQP 0-9 Specification (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9.xml?version=1" rel="nofollow">AMQP 0-9 Protocol Documentation (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-9.dtd?version=1" rel="nofollow">AMQP 0-9 Protocol Definitions (XML) </A></LI>
-</UL>
-
-
-<H3><A name="AMQP%28AdvancedMessageQueueingProtocol%29-AMQPversion08"></A>AMQP version 0-8</H3>
-
-<UL>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-8.pdf?version=1" rel="nofollow">AMQP 0-8 Specification (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-8.dtd?version=1" rel="nofollow">AMQP 0-8 Protocol Documentation (PDF) </A></LI>
- <LI><A href="https://jira.amqp.org/confluence/download/attachments/720900/amqp0-8.xml?version=1" rel="nofollow">AMQP 0-8 Protocol Definitions (XML) </A></LI>
-</UL>
-
- </DIV>
-
-<!--
- -->
-
- </DIV>
-
- <DIV class="footer">
- Apache Qpid, Enterprise AMQP Messaging
- &nbsp;
- &copy; 2004-2008 The Apache Software Foundation.
- &nbsp;
- (<A href="http://cwiki.apache.org/confluence/pages/editpage.action?pageId=110693">edit this page</A>)
- </DIV>
- </BODY>
-</HTML>
diff --git a/qpid/doc/book/src/common/css/style.css b/qpid/doc/book/src/common/css/style.css
new file mode 100644
index 0000000000..c681596592
--- /dev/null
+++ b/qpid/doc/book/src/common/css/style.css
@@ -0,0 +1,279 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+ul {
+ list-style-type:square;
+}
+
+th {
+ font-weight: bold;
+}
+
+.navfooter td {
+ font-size:10pt;
+}
+
+.navheader td {
+ font-size:10pt;
+}
+
+body {
+ margin:0;
+ background:#FFFFFF;
+ font-family:"Verdana", sans-serif;
+ font-size:10pt;
+}
+
+.container {
+ width:950px;
+ margin:0 auto;
+}
+
+body a {
+ color:#000000;
+}
+
+
+div.book {
+ margin-left:10pt;
+ margin-right:10pt;
+}
+
+div.preface {
+ margin-left:10pt;
+ margin-right:10pt;
+}
+
+div.chapter {
+ margin-left:10pt;
+ margin-right:10pt;
+}
+
+div.section {
+ margin-left:10pt;
+ margin-right:10pt;
+}
+
+div.titlepage {
+ margin-left:-10pt;
+ margin-right:-10pt;
+}
+
+.calloutlist td {
+ font-size:10pt;
+}
+
+.table-contents table {
+ border-spacing: 0px;
+}
+
+.table-contents td {
+ font-size:10pt;
+ padding-left:6px;
+ padding-right:6px;
+}
+
+div.breadcrumbs {
+ font-size:9pt;
+ margin-right:10pt;
+ padding-bottom:16px;
+}
+
+.chapter h2.title {
+ font-size:20pt;
+ color:#0c3b82;
+}
+
+.chapter .section h2.title {
+ font-size:18pt;
+ color:#0c3b82;
+}
+
+.section h2.title {
+ font-size:16pt;
+ color:#0c3b82;
+}
+
+.section h3.title {
+ font-size:14pt;
+ color:#0c3b82;
+}
+
+.section h4.title {
+ font-size:12pt;
+ color:#0c3b82;
+}
+
+.section h5.title {
+ font-size:12pt;
+ color:#0c3b82;
+}
+
+.section h6.title {
+ font-size:12pt;
+ color:#0c3b82;
+}
+
+.toc a {
+ font-size:9pt;
+}
+
+.header {
+ height:100px;
+ width:950px;
+ background:url(http://qpid.apache.org/images/header.png)
+}
+
+.logo {
+ text-align:center;
+ font-weight:600;
+ padding:0 0 0 0;
+ font-size:14px;
+ font-family:"Verdana", cursive;
+}
+
+.logo a {
+ color:#000000;
+ text-decoration:none;
+}
+
+.main_text_area {
+ margin-left:200px;
+}
+
+.main_text_area_top {
+ height:14px;
+ font-size:1px;
+}
+
+.main_text_area_bottom {
+ display:none;
+/* height:14px;
+ margin-bottom:4px;*/
+}
+
+.main_text_area_body {
+ padding:5px 24px;
+}
+
+.main_text_area_body p {
+ text-align:justify;
+}
+
+.main_text_area br {
+ line-height:10px;
+}
+
+.main_text_area h1 {
+ font-size:28px;
+ font-weight:600;
+ margin:0 0 24px 0;
+ color:#0c3b82;
+ font-family:"Verdana", Times, serif;
+}
+
+.main_text_area h2 {
+ font-size:24px;
+ font-weight:600;
+ margin:24px 0 8px 0;
+ color:#0c3b82;
+ font-family:"Verdana",Times, serif;
+}
+
+.main_text_area ol, .main_text_area ul {
+ padding:0;
+ margin:10px 0;
+ margin-left:20px;
+}
+
+.main_text_area li {
+/* margin-left:40px; */
+}
+
+.main_text_area, .menu_box {
+ font-size:13px;
+ line-height:17px;
+ color:#000000;
+}
+
+.main_text_area {
+ font-size:14px;
+}
+
+.main_text_area a {
+ color:#000000;
+}
+
+.main_text_area a:hover {
+ color:#000000;
+}
+
+.menu_box {
+ width:196px;
+ float:left;
+ margin-left:4px;
+}
+
+.menu_box_top {
+ background:url(http://qpid.apache.org/images/menu_top.png) no-repeat;
+ height:14px;
+ font-size:1px;
+}
+
+.menu_box_body {
+ background:url(http://qpid.apache.org/images/menu_body.png) repeat-y;
+ padding:5px 24px 5px 24px;
+}
+
+.menu_box_bottom {
+ background:url(http://qpid.apache.org/images/menu_bottom.png) no-repeat;
+ height:14px;
+ font-size:1px;
+ margin-bottom:1px;
+}
+
+.menu_box h3 {
+ font-size:20px;
+ font-weight:500;
+ margin:0 0 8px 0;
+ color:#0c3b82;
+ font-family:"Verdana",Times, serif;
+}
+
+.menu_box ul {
+ margin:12px;
+ padding:0px;
+}
+
+.menu_box li {
+ list-style:square;
+}
+
+.menu_box a {
+ color:#000000;
+ text-decoration:none;
+}
+
+.menu_box a:hover {
+ color:#000000;
+ text-decoration:underline;
+}
+
+
diff --git a/qpid/doc/book/src/AMQP-Compatibility.xml b/qpid/doc/book/src/cpp-broker/AMQP-Compatibility.xml
index e5aa98cf96..e5aa98cf96 100644
--- a/qpid/doc/book/src/AMQP-Compatibility.xml
+++ b/qpid/doc/book/src/cpp-broker/AMQP-Compatibility.xml
diff --git a/qpid/doc/book/src/AMQP-Messaging-Broker-CPP-Book.xml b/qpid/doc/book/src/cpp-broker/AMQP-Messaging-Broker-CPP-Book.xml
index 228c6a5e15..228c6a5e15 100644
--- a/qpid/doc/book/src/AMQP-Messaging-Broker-CPP-Book.xml
+++ b/qpid/doc/book/src/cpp-broker/AMQP-Messaging-Broker-CPP-Book.xml
diff --git a/qpid/doc/book/src/Active-Active-Cluster.xml b/qpid/doc/book/src/cpp-broker/Active-Active-Cluster.xml
index 28db3876e2..28db3876e2 100644
--- a/qpid/doc/book/src/Active-Active-Cluster.xml
+++ b/qpid/doc/book/src/cpp-broker/Active-Active-Cluster.xml
diff --git a/qpid/doc/book/src/cpp-broker/Active-Passive-Cluster.xml b/qpid/doc/book/src/cpp-broker/Active-Passive-Cluster.xml
new file mode 100644
index 0000000000..5f5823bdd2
--- /dev/null
+++ b/qpid/doc/book/src/cpp-broker/Active-Passive-Cluster.xml
@@ -0,0 +1,661 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+h"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+
+-->
+
+<section id="chap-Messaging_User_Guide-Active_Passive_Cluster">
+
+ <title>Active-passive Messaging Clusters (Preview)</title>
+
+ <section>
+ <title>Overview</title>
+ <para>
+ This release provides a preview of a new module for High Availability (HA). The new module is
+ not yet complete or ready for production use. It being made available so that users can
+ experiment with the new approach and provide feedback early in the development process.
+ Feedback should go to <ulink url="mailto:user@qpid.apache.org">dev@qpid.apache.org</ulink>.
+ </para>
+ <para>
+ The old cluster module takes an <firstterm>active-active</firstterm> approach, i.e. all the
+ brokers in a cluster are able to handle client requests simultaneously. The new HA module
+ takes an <firstterm>active-passive</firstterm>, <firstterm>hot-standby</firstterm> approach.
+ </para>
+ <para>
+ In an active-passive cluster only one broker, known as the <firstterm>primary</firstterm>, is
+ active and serving clients at a time. The other brokers are standing by as
+ <firstterm>backups</firstterm>. Changes on the primary are immediately replicated to all the
+ backups so they are always up-to-date or "hot". If the primary fails, one of the backups is
+ promoted to take over as the new primary. Clients fail-over to the new primary
+ automatically. If there are multiple backups, the backups also fail-over to become backups of
+ the new primary. Backup brokers reject connection attempts, to enforce the requirement that
+ only the primary be active.
+ </para>
+ <para>
+ This approach depends on an external <firstterm>cluster resource manager</firstterm> to detect
+ failures and choose the primary. <ulink
+ url="https://fedorahosted.org/cluster/wiki/RGManager">Rgmanager</ulink> is supported
+ initially, but others may be supported in the future.
+ </para>
+ <section>
+ <title>Why the new approach?</title>
+ <para>
+ The new active-passive approach has several advantages compared to the
+ existing active-active cluster module.
+ <itemizedlist>
+ <listitem>
+ It does not depend directly on openais or corosync. It does not use multicast
+ which simplifies deployment.
+ </listitem>
+ <listitem>
+ It is more portable: in environments that don't support corosync, it can be
+ integrated with a resource manager available in that environment.
+ </listitem>
+ <listitem>
+ Replication to a <firstterm>disaster recovery</firstterm> site can be handled as
+ simply another node in the cluster, it does not require a separate replication
+ mechanism.
+ </listitem>
+ <listitem>
+ It can take advantage of features provided by the resource manager, for example
+ virtual IP addresses.
+ </listitem>
+ <listitem>
+ Improved performance and scalability due to better use of multiple CPU s
+ </listitem>
+ </itemizedlist>
+ </para>
+ </section>
+ <section>
+ <title>Limitations</title>
+
+ <para>
+ There are a number of known limitations in the current preview implementation. These
+ will be fixed in the production versions.
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ Transactional changes to queue state are not replicated atomically. If the primary crashes
+ during a transaction, it is possible that the backup could contain only part of the
+ changes introduced by a transaction.
+ </listitem>
+ <listitem>
+ During a fail-over one backup is promoted to primary and any other backups switch to
+ the new primary. Messages sent to the new primary before all the backups have
+ switched could be lost if the new primary itself fails before all the backups have
+ switched.
+ </listitem>
+ <listitem>
+ Acknowledgments are confirmed to clients before the message has been dequeued
+ from replicas or indeed from the local store if that is asynchronous.
+ </listitem>
+ <listitem>
+ When used with a persistent store: if the entire cluster fails, there are no tools to help
+ identify the most recent store.
+ </listitem>
+ <listitem>
+ A persistent broker must have its store erased before joining an existing cluster.
+ In the production version a persistent broker will be able to load its store and
+ avoid downloading messages that are in the store from the primary.
+ </listitem>
+ <listitem>
+ Configuration changes (creating or deleting queues, exchanges and bindings) are
+ replicated asynchronously. Management tools used to make changes will consider the
+ change complete when it is complete on the primary, it may not yet be replicated
+ to all the backups.
+ </listitem>
+ <listitem>
+ Deletions made immediately after a failure (before all the backups are ready) may
+ be lost on a backup. Queues, exchange or bindings that were deleted on the primary could
+ re-appear if that backup is promoted to primary on a subsequent failure.
+ </listitem>
+ <listitem>
+ Better control is needed over which queues/exchanges are replicated and which are not.
+ </listitem>
+ <listitem>
+ There are some known issues affecting performance, both the throughput of
+ replication and the time taken for backups to fail-over. Performance will improve
+ in the production version.
+ </listitem>
+ <listitem>
+ Federated links from the primary will be lost in fail over, they will not be
+ re-connected on the new primary. Federation links to the primary can fail over.
+ </listitem>
+ <listitem>
+ Only plain FIFO queues can be replicated. LVQ and ring queues are not yet supported.
+ </listitem>
+ </itemizedlist>
+ </section>
+ </section>
+
+ <section>
+ <title>Virtual IP Addresses</title>
+ <para>
+ Some resource managers (including <command>rgmanager</command>) support
+ <firstterm>virtual IP addresses</firstterm>. A virtual IP address is an IP
+ address that can be relocated to any of the nodes in a cluster. The
+ resource manager associates this address with the primary node in the
+ cluster, and relocates it to the new primary when there is a failure. This
+ simplifies configuration as you can publish a single IP address rather
+ than a list.
+ </para>
+ <para>
+ A virtual IP address can be used by clients and backup brokers to connect
+ to the primary. The following sections will explain how to configure
+ virtual IP addresses for clients or brokers.
+ </para>
+ </section>
+
+ <section>
+ <title>Configuring the Brokers</title>
+ <para>
+ The broker must load the <filename>ha</filename> module, it is loaded by
+ default. The following broker options are available for the HA module.
+ </para>
+ <table frame="all" id="ha-broker-options">
+ <title>Options for High Availability Messaging Cluster</title>
+ <tgroup align="left" cols="2" colsep="1" rowsep="1">
+ <colspec colname="c1" colwidth="1*"/>
+ <colspec colname="c2" colwidth="3*"/>
+ <thead>
+ <row>
+ <entry align="center" nameend="c2" namest="c1">
+ Options for High Availability Messaging Cluster
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>
+ <literal>--ha-cluster <replaceable>yes|no</replaceable></literal>
+ </entry>
+ <entry>
+ Set to "yes" to have the broker join a cluster.
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <literal>--ha-brokers <replaceable>URL</replaceable></literal>
+ </entry>
+ <entry>
+ <para>
+ The URL
+ <footnote>
+ <para>
+ The full format of the URL is given by this grammar:
+ <programlisting>
+ url = ["amqp:"][ user ["/" password] "@" ] addr ("," addr)*
+ addr = tcp_addr / rmda_addr / ssl_addr / ...
+ tcp_addr = ["tcp:"] host [":" port]
+ rdma_addr = "rdma:" host [":" port]
+ ssl_addr = "ssl:" host [":" port]'
+ </programlisting>
+ </para>
+ </footnote>
+ used by brokers to connect to each other. If you use a virtual IP address
+ then this is a single address, for example
+ <literal>amqp:20.0.20.200</literal>. If you do not use a virtual IP
+ address then the URL must list all the addresses of brokers in the
+ cluster, for example <literal>amqp:node1,node2,node3</literal>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry><literal>--ha-public-brokers <replaceable>URL</replaceable></literal> </entry>
+ <entry>
+ <para>
+ The URL used by clients to connect to the brokers. This has the same
+ format as the <literal>--ha-brokers</literal> URL above.
+ </para>
+ <para>
+ If this option is not set, clients will use the same URL as brokers.
+ This option allows you to put client traffic on a different network from
+ broker traffic, which is recommended.
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry><literal>--ha-replicate</literal></entry>
+ <foo/>
+ <entry>
+ <para>
+ Specifies whether queues and exchanges are replicated by default.
+ For details see <xref linkend="creating-replicated"/>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para><literal>--ha-username <replaceable>USER</replaceable></literal></para>
+ <para><literal>--ha-password <replaceable>PASS</replaceable></literal></para>
+ <para><literal>--ha-mechanism <replaceable>MECH</replaceable></literal></para>
+ </entry>
+ <entry>
+ Authentication settings used by brokers to connect to each other.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>
+ To configure a HA cluster you must set at least <literal>ha-cluster</literal> and
+ <literal>ha-brokers</literal>.
+ </para>
+ </section>
+
+ <section>
+ <title>The Cluster Resource Manager</title>
+ <para>
+ Broker fail-over is managed by a <firstterm>cluster resource
+ manager</firstterm>. An integration with <ulink
+ url="https://fedorahosted.org/cluster/wiki/RGManager">rgmanager</ulink> is
+ provided, but it is possible to integrate with other resource managers.
+ </para>
+ <para>
+ The resource manager is responsible for starting the <command>qpidd</command> broker
+ on each node in the cluster. The resource manager <firstterm>promotes</firstterm>
+ one of the brokers to be the primary. The other brokers connect to the primary as
+ backups, using the URL provided in the <literal>ha-brokers</literal> configuration
+ option.
+ </para>
+ <para>
+ Once connected, the backup brokers synchronize their state with the
+ primary. When a backup is synchronized, or "hot", it is ready to take
+ over if the primary fails. Backup brokers continually receive updates
+ from the primary in order to stay synchronized.
+ </para>
+ <para>
+ If the primary fails, backup brokers go into fail-over mode. The resource
+ manager must detect the failure and promote one of the backups to be the
+ new primary. The other backups connect to the new primary and synchronize
+ their state with it.
+ </para>
+ <para>
+ The resource manager is also responsible for protecting the cluster from
+ <firstterm>split-brain</firstterm> conditions resulting from a network partition. A
+ network partition divide a cluster into two sub-groups which cannot see each other.
+ Usually a <firstterm>quorum</firstterm> voting algorithm is used that disables nodes
+ in the inquorate sub-group.
+ </para>
+ </section>
+
+ <section>
+ <title>Configuring <command>rgmanager</command> as resource manager</title>
+ <para>
+ This section assumes that you are already familiar with setting up and configuring
+ clustered services using <command>cman</command> and
+ <command>rgmanager</command>. It will show you how to configure an active-passive,
+ hot-standby <command>qpidd</command> HA cluster with <command>rgmanager</command>.
+ </para>
+ <para>
+ You must provide a <literal>cluster.conf</literal> file to configure
+ <command>cman</command> and <command>rgmanager</command>. Here is
+ an example <literal>cluster.conf</literal> file for a cluster of 3 nodes named
+ node1, node2 and node3. We will go through the configuration step-by-step.
+ </para>
+ <programlisting>
+ <![CDATA[
+<?xml version="1.0"?>
+<!--
+This is an example of a cluster.conf file to run qpidd HA under rgmanager.
+This example assumes a 3 node cluster, with nodes named node1, node2 and node3.
+
+NOTE: fencing is not shown, you must configure fencing appropriately for your cluster.
+-->
+
+<cluster name="qpid-test" config_version="18">
+ <!-- The cluster has 3 nodes. Each has a unique nodid and one vote
+ for quorum. -->
+ <clusternodes>
+ <clusternode name="node1.example.com" nodeid="1"/>
+ <clusternode name="node2.example.com" nodeid="2"/>
+ <clusternode name="node3.example.com" nodeid="3"/>
+ </clusternodes>
+ <!-- Resouce Manager configuration. -->
+ <rm>
+ <!--
+ There is a failoverdomain for each node containing just that node.
+ This lets us stipulate that the qpidd service should always run on each node.
+ -->
+ <failoverdomains>
+ <failoverdomain name="node1-domain" restricted="1">
+ <failoverdomainnode name="node1.example.com"/>
+ </failoverdomain>
+ <failoverdomain name="node2-domain" restricted="1">
+ <failoverdomainnode name="node2.example.com"/>
+ </failoverdomain>
+ <failoverdomain name="node3-domain" restricted="1">
+ <failoverdomainnode name="node3.example.com"/>
+ </failoverdomain>
+ </failoverdomains>
+
+ <resources>
+ <!-- This script starts a qpidd broker acting as a backup. -->
+ <script file="/etc/init.d/qpidd" name="qpidd"/>
+
+ <!-- This script promotes the qpidd broker on this node to primary. -->
+ <script file="/etc/init.d/qpidd-primary" name="qpidd-primary"/>
+
+ <!-- This is a virtual IP address for broker replication traffic. -->
+ <ip address="20.0.10.200" monitor_link="1"/>
+
+ <!-- This is a virtual IP address on a seprate network for client traffic. -->
+ <ip address="20.0.20.200" monitor_link="1"/>
+ </resources>
+
+ <!-- There is a qpidd service on each node, it should be restarted if it fails. -->
+ <service name="node1-qpidd-service" domain="node1-domain" recovery="restart">
+ <script ref="qpidd"/>
+ </service>
+ <service name="node2-qpidd-service" domain="node2-domain" recovery="restart">
+ <script ref="qpidd"/>
+ </service>
+ <service name="node3-qpidd-service" domain="node3-domain" recovery="restart">
+ <script ref="qpidd"/>
+ </service>
+
+ <!-- There should always be a single qpidd-primary service, it can run on any node. -->
+ <service name="qpidd-primary-service" autostart="1" exclusive="0" recovery="relocate">
+ <script ref="qpidd-primary"/>
+ <!-- The primary has the IP addresses for brokers and clients to connect. -->
+ <ip ref="20.0.10.200"/>
+ <ip ref="20.0.20.200"/>
+ </service>
+ </rm>
+</cluster>
+ ]]>
+ </programlisting>
+
+ <para>
+ There is a <literal>failoverdomain</literal> for each node containing just that
+ one node. This lets us stipulate that the qpidd service should always run on all
+ nodes.
+ </para>
+ <para>
+ The <literal>resources</literal> section defines the <command>qpidd</command>
+ script used to start the <command>qpidd</command> service. It also defines the
+ <command>qpid-primary</command> script which does not
+ actually start a new service, rather it promotes the existing
+ <command>qpidd</command> broker to primary status.
+ </para>
+ <para>
+ The <literal>resources</literal> section also defines a pair of virtual IP
+ addresses on different sub-nets. One will be used for broker-to-broker
+ communication, the other for client-to-broker.
+ </para>
+ <para>
+ To take advantage of the virtual IP addresses, <filename>qpidd.conf</filename>
+ should contain these lines:
+ </para>
+ <programlisting>
+ ha-cluster=yes
+ ha-brokers=20.0.20.200
+ ha-public-brokers=20.0.10.200
+ </programlisting>
+ <para>
+ This configuration specifies that backup brokers will use 20.0.20.200
+ to connect to the primary and will advertise 20.0.10.200 to clients.
+ Clients should connect to 20.0.10.200.
+ </para>
+ <para>
+ The <literal>service</literal> section defines 3 <literal>qpidd</literal>
+ services, one for each node. Each service is in a restricted fail-over
+ domain containing just that node, and has the <literal>restart</literal>
+ recovery policy. The effect of this is that rgmanager will run
+ <command>qpidd</command> on each node, restarting if it fails.
+ </para>
+ <para>
+ There is a single <literal>qpidd-primary-service</literal> using the
+ <command>qpidd-primary</command> script which is not restricted to a
+ domain and has the <literal>relocate</literal> recovery policy. This means
+ rgmanager will start <command>qpidd-primary</command> on one of the nodes
+ when the cluster starts and will relocate it to another node if the
+ original node fails. Running the <literal>qpidd-primary</literal> script
+ does not start a new broker process, it promotes the existing broker to
+ become the primary.
+ </para>
+ </section>
+
+ <section>
+ <title>Broker Administration Tools</title>
+ <para>
+ Normally, clients are not allowed to connect to a backup broker. However management tools are
+ allowed to connect to a backup brokers. If you use these tools you <emphasis>must
+ not</emphasis> add or remove messages from replicated queues, or delete replicated queues or
+ exchanges as this will corrupt the replication process and may cause message loss.
+ </para>
+ <para>
+ <command>qpid-ha</command> allows you to view and change HA configuration settings.
+ </para>
+ <para>
+ The tools <command>qpid-config</command>, <command>qpid-route</command> and
+ <command>qpid-stat</command> will connect to a backup if you pass the flag <command>--ha-admin</command> on the
+ command line.
+ </para>
+ </section>
+
+ <section id="ha-creating-replicated">
+ <title>Creating replicated queues and exchanges</title>
+ <para>
+ By default, queues and exchanges are not replicated automatically. You can change
+ the default behavior by setting the <literal>ha-replicate</literal> configuration
+ option. It has one of the following values:
+ <itemizedlist>
+ <listitem>
+ <firstterm>all</firstterm>: Replicate everything automatically: queues, exchanges, bindings and messages.
+ </listitem>
+ <listitem>
+ <firstterm>configuration</firstterm>: Replicate the existence of queues,
+ exchange and bindings but don't replicate messages.
+ </listitem>
+ <listitem>
+ <firstterm>none</firstterm>: Don't replicate anything, this is the default.
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ You can over-ride the default for a particular queue or exchange by passing the
+ argument <literal>qpid.replicate</literal> when creating the queue or exchange. It
+ takes the same values as <literal>ha-replicate</literal>
+ </para>
+ <para>
+ Bindings are automatically replicated if the queue and exchange being bound both
+ have replication <literal>all</literal> or <literal>configuration</literal>, they
+ are not replicated otherwise.
+ </para>
+ <para>
+ You can create replicated queues and exchanges with the
+ <command>qpid-config</command> management tool like this:
+ </para>
+ <programlisting>
+ qpid-config add queue myqueue --replicate all
+ </programlisting>
+ <para>
+ To create replicated queues and exchanges via the client API, add a
+ <literal>node</literal> entry to the address like this:
+ </para>
+ <programlisting>
+ "myqueue;{create:always,node:{x-declare:{arguments:{'qpid.replicate':all}}}}"
+ </programlisting>
+ </section>
+
+ <section>
+ <title>Client Connection and Fail-over</title>
+ <para>
+ Clients can only connect to the primary broker. Backup brokers
+ automatically reject any connection attempt by a client.
+ </para>
+ <para>
+ Clients are configured with the URL for the cluster (details below for
+ each type of client). There are two possibilities
+ <itemizedlist>
+ <listitem>
+ The URL contains multiple addresses, one for each broker in the cluster.
+ </listitem>
+ <listitem>
+ The URL contains a single <firstterm>virtual IP address</firstterm>
+ that is assigned to the primary broker by the resource manager.
+ <footnote><para>Only if the resource manager supports virtual IP addresses</para></footnote>
+ </listitem>
+ </itemizedlist>
+ In the first case, clients will repeatedly re-try each address in the URL
+ until they successfully connect to the primary. In the second case the
+ resource manager will assign the virtual IP address to the primary broker,
+ so clients only need to re-try on a single address.
+ </para>
+ <para>
+ When the primary broker fails, clients re-try all known cluster addresses
+ until they connect to the new primary. The client re-sends any messages
+ that were previously sent but not acknowledged by the broker at the time
+ of the failure. Similarly messages that have been sent by the broker, but
+ not acknowledged by the client, are re-queued.
+ </para>
+ <para>
+ TCP can be slow to detect connection failures. A client can configure a
+ connection to use a <firstterm>heartbeat</firstterm> to detect connection
+ failure, and can specify a time interval for the heartbeat. If heartbeats
+ are in use, failures will be detected no later than twice the heartbeat
+ interval. The following sections explain how to enable heartbeat in each
+ client.
+ </para>
+ <para>
+ See &#34;Cluster Failover&#34; in <citetitle>Programming in Apache
+ Qpid</citetitle> for details on how to keep the client aware of cluster
+ membership.
+ </para>
+ <para>
+ Suppose your cluster has 3 nodes: <literal>node1</literal>, <literal>node2</literal>
+ and <literal>node3</literal> all using the default AMQP port. To connect a client you
+ need to specify the address(es) and set the <literal>reconnect</literal> property to
+ <literal>true</literal>. Here's how to connect each type of client:
+ </para>
+ <section>
+ <title>C++ clients</title>
+ <para>
+ With the C++ client, you specify multiple cluster addresses in a single URL
+ <footnote>
+ <para>
+ The full grammar for the URL is:
+ </para>
+ <programlisting>
+ url = ["amqp:"][ user ["/" password] "@" ] addr ("," addr)*
+ addr = tcp_addr / rmda_addr / ssl_addr / ...
+ tcp_addr = ["tcp:"] host [":" port]
+ rdma_addr = "rdma:" host [":" port]
+ ssl_addr = "ssl:" host [":" port]'
+ </programlisting>
+ </footnote>
+ You also need to specify the connection option
+ <literal>reconnect</literal> to be true. For example:
+ </para>
+ <programlisting>
+ qpid::messaging::Connection c("node1,node2,node3","{reconnect:true}");
+ </programlisting>
+ <para>
+ Heartbeats are disabled by default. You can enable them by specifying a
+ heartbeat interval (in seconds) for the connection via the
+ <literal>heartbeat</literal> option. For example:
+ <programlisting>
+ qpid::messaging::Connection c("node1,node2,node3","{reconnect:true,heartbeat:10}");
+ </programlisting>
+ </para>
+ </section>
+ <section>
+ <title>Python clients</title>
+ <para>
+ With the python client, you specify <literal>reconnect=True</literal>
+ and a list of <replaceable>host:port</replaceable> addresses as
+ <literal>reconnect_urls</literal> when calling
+ <literal>Connection.establish</literal> or
+ <literal>Connection.open</literal>
+ </para>
+ <programlisting>
+ connection = qpid.messaging.Connection.establish("node1", reconnect=True, reconnect_urls=["node1", "node2", "node3"])
+ </programlisting>
+ <para>
+ Heartbeats are disabled by default. You can
+ enable them by specifying a heartbeat interval (in seconds) for the
+ connection via the &#39;heartbeat&#39; option. For example:
+ </para>
+ <programlisting>
+ connection = qpid.messaging.Connection.establish("node1", reconnect=True, reconnect_urls=["node1", "node2", "node3"], heartbeat=10)
+ </programlisting>
+ </section>
+ <section>
+ <title>Java JMS Clients</title>
+ <para>
+ In Java JMS clients, client fail-over is handled automatically if it is
+ enabled in the connection. You can configure a connection to use
+ fail-over using the <command>failover</command> property:
+ </para>
+
+ <screen>
+ connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;&amp;failover=&#39;failover_exchange&#39;
+ </screen>
+ <para>
+ This property can take three values:
+ </para>
+ <variablelist>
+ <title>Fail-over Modes</title>
+ <varlistentry>
+ <term>failover_exchange</term>
+ <listitem>
+ <para>
+ If the connection fails, fail over to any other broker in the cluster.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>roundrobin</term>
+ <listitem>
+ <para>
+ If the connection fails, fail over to one of the brokers specified in the <command>brokerlist</command>.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+ <varlistentry>
+ <term>singlebroker</term>
+ <listitem>
+ <para>
+ Fail-over is not supported; the connection is to a single broker only.
+ </para>
+
+ </listitem>
+
+ </varlistentry>
+
+ </variablelist>
+ <para>
+ In a Connection URL, heartbeat is set using the <command>idle_timeout</command> property, which is an integer corresponding to the heartbeat period in seconds. For instance, the following line from a JNDI properties file sets the heartbeat time out to 3 seconds:
+ </para>
+
+ <screen>
+ connectionfactory.qpidConnectionfactory = amqp://guest:guest@clientid/test?brokerlist=&#39;tcp://localhost:5672&#39;,idle_timeout=3
+ </screen>
+ </section>
+ </section>
+</section>
+
+<!-- LocalWords: scalability rgmanager multicast RGManager mailto LVQ qpidd IP dequeued Transactional username
+-->
diff --git a/qpid/doc/book/src/Cheat-Sheet-for-configuring-Exchange-Options.xml b/qpid/doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Exchange-Options.xml
index fccdae1b9a..fccdae1b9a 100644
--- a/qpid/doc/book/src/Cheat-Sheet-for-configuring-Exchange-Options.xml
+++ b/qpid/doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Exchange-Options.xml
diff --git a/qpid/doc/book/src/Cheat-Sheet-for-configuring-Queue-Options.xml b/qpid/doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Queue-Options.xml
index d50948e0cc..d50948e0cc 100644
--- a/qpid/doc/book/src/Cheat-Sheet-for-configuring-Queue-Options.xml
+++ b/qpid/doc/book/src/cpp-broker/Cheat-Sheet-for-configuring-Queue-Options.xml
diff --git a/qpid/doc/book/src/HA-Queue-Replication.xml b/qpid/doc/book/src/cpp-broker/HA-Queue-Replication.xml
index b7c533e4cb..b7c533e4cb 100644
--- a/qpid/doc/book/src/HA-Queue-Replication.xml
+++ b/qpid/doc/book/src/cpp-broker/HA-Queue-Replication.xml
diff --git a/qpid/doc/book/src/LVQ.xml b/qpid/doc/book/src/cpp-broker/LVQ.xml
index b57c6268be..b57c6268be 100644
--- a/qpid/doc/book/src/LVQ.xml
+++ b/qpid/doc/book/src/cpp-broker/LVQ.xml
diff --git a/qpid/doc/book/src/cpp-broker/Makefile b/qpid/doc/book/src/cpp-broker/Makefile
new file mode 100644
index 0000000000..0266a0f54d
--- /dev/null
+++ b/qpid/doc/book/src/cpp-broker/Makefile
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+include ../Makefile.inc
diff --git a/qpid/doc/book/src/Managing-CPP-Broker.xml b/qpid/doc/book/src/cpp-broker/Managing-CPP-Broker.xml
index d2abea4296..d2abea4296 100644
--- a/qpid/doc/book/src/Managing-CPP-Broker.xml
+++ b/qpid/doc/book/src/cpp-broker/Managing-CPP-Broker.xml
diff --git a/qpid/doc/book/src/QMF-Python-Console-Tutorial.xml b/qpid/doc/book/src/cpp-broker/QMF-Python-Console-Tutorial.xml
index 2cb802671b..2cb802671b 100644
--- a/qpid/doc/book/src/QMF-Python-Console-Tutorial.xml
+++ b/qpid/doc/book/src/cpp-broker/QMF-Python-Console-Tutorial.xml
diff --git a/qpid/doc/book/src/Qpid-Interoperability-Documentation.xml b/qpid/doc/book/src/cpp-broker/Qpid-Interoperability-Documentation.xml
index 74546693df..74546693df 100644
--- a/qpid/doc/book/src/Qpid-Interoperability-Documentation.xml
+++ b/qpid/doc/book/src/cpp-broker/Qpid-Interoperability-Documentation.xml
diff --git a/qpid/doc/book/src/Qpid-Management-Framework.xml b/qpid/doc/book/src/cpp-broker/Qpid-Management-Framework.xml
index 89bfe9d95e..89bfe9d95e 100644
--- a/qpid/doc/book/src/Qpid-Management-Framework.xml
+++ b/qpid/doc/book/src/cpp-broker/Qpid-Management-Framework.xml
diff --git a/qpid/doc/book/src/Running-CPP-Broker.xml b/qpid/doc/book/src/cpp-broker/Running-CPP-Broker.xml
index 7dba5b41ce..7dba5b41ce 100644
--- a/qpid/doc/book/src/Running-CPP-Broker.xml
+++ b/qpid/doc/book/src/cpp-broker/Running-CPP-Broker.xml
diff --git a/qpid/doc/book/src/Security.xml b/qpid/doc/book/src/cpp-broker/Security.xml
index 49abfbebca..49abfbebca 100644
--- a/qpid/doc/book/src/Security.xml
+++ b/qpid/doc/book/src/cpp-broker/Security.xml
diff --git a/qpid/doc/book/src/Using-Broker-Federation.xml b/qpid/doc/book/src/cpp-broker/Using-Broker-Federation.xml
index f5fedf814c..f5fedf814c 100644
--- a/qpid/doc/book/src/Using-Broker-Federation.xml
+++ b/qpid/doc/book/src/cpp-broker/Using-Broker-Federation.xml
diff --git a/qpid/doc/book/src/Using-message-groups.xml b/qpid/doc/book/src/cpp-broker/Using-message-groups.xml
index 9b904d9f18..9b904d9f18 100644
--- a/qpid/doc/book/src/Using-message-groups.xml
+++ b/qpid/doc/book/src/cpp-broker/Using-message-groups.xml
diff --git a/qpid/doc/book/src/producer-flow-control.xml b/qpid/doc/book/src/cpp-broker/producer-flow-control.xml
index fd44f51e81..fd44f51e81 100644
--- a/qpid/doc/book/src/producer-flow-control.xml
+++ b/qpid/doc/book/src/cpp-broker/producer-flow-control.xml
diff --git a/qpid/doc/book/src/queue-state-replication.xml b/qpid/doc/book/src/cpp-broker/queue-state-replication.xml
index 3ffac805eb..3ffac805eb 100644
--- a/qpid/doc/book/src/queue-state-replication.xml
+++ b/qpid/doc/book/src/cpp-broker/queue-state-replication.xml
diff --git a/qpid/doc/book/src/css/style.css b/qpid/doc/book/src/css/style.css
deleted file mode 100644
index 2a1bee8623..0000000000
--- a/qpid/doc/book/src/css/style.css
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-ul {
- list-style-type:square;
-}
-
-th {
- font-weight: bold;
-}
-
-.navfooter td {
- font-size:10pt;
-}
-
-.navheader td {
- font-size:10pt;
-}
-
-body {
- width:950px;
- margin-left:100px;
- margin-top:40px;
-
- background:#FFFFFF;
- font-family:"Verdana", sans-serif;
- font-size:10pt;
-}
-
-body a {
- color:#000000;
-}
-
-
-div.book {
- margin-left:10pt;
- margin-right:10pt;
-}
-
-div.preface {
- margin-left:10pt;
- margin-right:10pt;
-}
-
-div.chapter {
- margin-left:10pt;
- margin-right:10pt;
-}
-
-div.section {
- margin-left:10pt;
- margin-right:10pt;
-}
-
-div.titlepage {
- margin-left:-10pt;
- margin-right:-10pt;
-}
-
-.calloutlist td {
- font-size:10pt;
-}
-
-.table-contents table {
- border-spacing: 0px;
-}
-
-.table-contents td {
- font-size:10pt;
- padding-left:6px;
- padding-right:6px;
-}
-
-.chapter h2.title {
- font-size:20pt;
- color:#0c3b82;
-}
-
-.chapter .section h2.title {
- font-size:18pt;
- color:#0c3b82;
-}
-
-.section h2.title {
- font-size:16pt;
- color:#0c3b82;
-}
-
-.section h3.title {
- font-size:14pt;
- color:#0c3b82;
-}
-
-.section h4.title {
- font-size:12pt;
- color:#0c3b82;
-}
-
-.section h5.title {
- font-size:12pt;
- color:#0c3b82;
-}
-
-.section h6.title {
- font-size:12pt;
- color:#0c3b82;
-}
-
-.toc a {
- font-size:9pt;
-}
-
diff --git a/qpid/doc/book/src/AMQP-Messaging-Broker-Java-Book.xml b/qpid/doc/book/src/java-broker/AMQP-Messaging-Broker-Java-Book.xml
index 0bb40052cd..0bb40052cd 100644
--- a/qpid/doc/book/src/AMQP-Messaging-Broker-Java-Book.xml
+++ b/qpid/doc/book/src/java-broker/AMQP-Messaging-Broker-Java-Book.xml
diff --git a/qpid/doc/book/src/Add-New-Users.xml b/qpid/doc/book/src/java-broker/Add-New-Users.xml
index dc34bcc5c9..dc34bcc5c9 100644
--- a/qpid/doc/book/src/Add-New-Users.xml
+++ b/qpid/doc/book/src/java-broker/Add-New-Users.xml
diff --git a/qpid/doc/book/src/java-broker/Broker-Configuration-Guide.xml b/qpid/doc/book/src/java-broker/Broker-Configuration-Guide.xml
new file mode 100644
index 0000000000..28a2e9f2d3
--- /dev/null
+++ b/qpid/doc/book/src/java-broker/Broker-Configuration-Guide.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<section id="Java-Broker-Configuration-Guide">
+ <title>Broker Configuration Guide </title>
+
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
+ href="Topic-Configuration.xml"/>
+</section>
diff --git a/qpid/doc/book/src/Configure-ACLs.xml b/qpid/doc/book/src/java-broker/Configure-ACLs.xml
index e82f2a86d0..e82f2a86d0 100644
--- a/qpid/doc/book/src/Configure-ACLs.xml
+++ b/qpid/doc/book/src/java-broker/Configure-ACLs.xml
diff --git a/qpid/doc/book/src/Configure-Java-Qpid-to-use-a-SSL-connection.xml b/qpid/doc/book/src/java-broker/Configure-Java-Qpid-to-use-a-SSL-connection.xml
index 838b899337..838b899337 100644
--- a/qpid/doc/book/src/Configure-Java-Qpid-to-use-a-SSL-connection.xml
+++ b/qpid/doc/book/src/java-broker/Configure-Java-Qpid-to-use-a-SSL-connection.xml
diff --git a/qpid/doc/book/src/Configure-Log4j-CompositeRolling-Appender.xml b/qpid/doc/book/src/java-broker/Configure-Log4j-CompositeRolling-Appender.xml
index f52bc55399..f52bc55399 100644
--- a/qpid/doc/book/src/Configure-Log4j-CompositeRolling-Appender.xml
+++ b/qpid/doc/book/src/java-broker/Configure-Log4j-CompositeRolling-Appender.xml
diff --git a/qpid/doc/book/src/Configure-the-Broker-via-config.xml.xml b/qpid/doc/book/src/java-broker/Configure-the-Broker-via-config.xml.xml
index 6a7729acd8..6a7729acd8 100644
--- a/qpid/doc/book/src/Configure-the-Broker-via-config.xml.xml
+++ b/qpid/doc/book/src/java-broker/Configure-the-Broker-via-config.xml.xml
diff --git a/qpid/doc/book/src/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml b/qpid/doc/book/src/java-broker/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml
index 804970b923..804970b923 100644
--- a/qpid/doc/book/src/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml
+++ b/qpid/doc/book/src/java-broker/Configure-the-Virtual-Hosts-via-virtualhosts.xml.xml
diff --git a/qpid/doc/book/src/Configuring-Management-Users.xml b/qpid/doc/book/src/java-broker/Configuring-Management-Users.xml
index a2a8d46d88..a2a8d46d88 100644
--- a/qpid/doc/book/src/Configuring-Management-Users.xml
+++ b/qpid/doc/book/src/java-broker/Configuring-Management-Users.xml
diff --git a/qpid/doc/book/src/Configuring-Qpid-JMX-Management-Console.xml b/qpid/doc/book/src/java-broker/Configuring-Qpid-JMX-Management-Console.xml
index 72e4ba8969..72e4ba8969 100644
--- a/qpid/doc/book/src/Configuring-Qpid-JMX-Management-Console.xml
+++ b/qpid/doc/book/src/java-broker/Configuring-Qpid-JMX-Management-Console.xml
diff --git a/qpid/doc/book/src/Debug-using-log4j.xml b/qpid/doc/book/src/java-broker/Debug-using-log4j.xml
index 615fd9e560..615fd9e560 100644
--- a/qpid/doc/book/src/Debug-using-log4j.xml
+++ b/qpid/doc/book/src/java-broker/Debug-using-log4j.xml
diff --git a/qpid/doc/book/src/How-to-Tune-M3-Java-Broker-Performance.xml b/qpid/doc/book/src/java-broker/How-to-Tune-M3-Java-Broker-Performance.xml
index f7fffbaceb..f7fffbaceb 100644
--- a/qpid/doc/book/src/How-to-Tune-M3-Java-Broker-Performance.xml
+++ b/qpid/doc/book/src/java-broker/How-to-Tune-M3-Java-Broker-Performance.xml
diff --git a/qpid/doc/book/src/How-to-Use-SlowConsumerDisconnect.xml b/qpid/doc/book/src/java-broker/How-to-Use-SlowConsumerDisconnect.xml
index 4e0ce0f7e0..4e0ce0f7e0 100644
--- a/qpid/doc/book/src/How-to-Use-SlowConsumerDisconnect.xml
+++ b/qpid/doc/book/src/java-broker/How-to-Use-SlowConsumerDisconnect.xml
diff --git a/qpid/doc/book/src/Java-Broker-Feature-Guide.xml b/qpid/doc/book/src/java-broker/Java-Broker-Feature-Guide.xml
index bbc2a1aaf0..bbc2a1aaf0 100644
--- a/qpid/doc/book/src/Java-Broker-Feature-Guide.xml
+++ b/qpid/doc/book/src/java-broker/Java-Broker-Feature-Guide.xml
diff --git a/qpid/doc/book/src/Java-Environment-Variables.xml b/qpid/doc/book/src/java-broker/Java-Environment-Variables.xml
index 12703190f2..12703190f2 100644
--- a/qpid/doc/book/src/Java-Environment-Variables.xml
+++ b/qpid/doc/book/src/java-broker/Java-Environment-Variables.xml
diff --git a/qpid/doc/book/src/java-broker/Makefile b/qpid/doc/book/src/java-broker/Makefile
new file mode 100644
index 0000000000..0266a0f54d
--- /dev/null
+++ b/qpid/doc/book/src/java-broker/Makefile
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+include ../Makefile.inc
diff --git a/qpid/doc/book/src/Management-Console-Security.xml b/qpid/doc/book/src/java-broker/Management-Console-Security.xml
index 31f63c70da..31f63c70da 100644
--- a/qpid/doc/book/src/Management-Console-Security.xml
+++ b/qpid/doc/book/src/java-broker/Management-Console-Security.xml
diff --git a/qpid/doc/book/src/MessageStore-Tool.xml b/qpid/doc/book/src/java-broker/MessageStore-Tool.xml
index fdcb3cd560..fdcb3cd560 100644
--- a/qpid/doc/book/src/MessageStore-Tool.xml
+++ b/qpid/doc/book/src/java-broker/MessageStore-Tool.xml
diff --git a/qpid/doc/book/src/Qpid-JMX-Management-Console-FAQ.xml b/qpid/doc/book/src/java-broker/Qpid-JMX-Management-Console-FAQ.xml
index 1806ab01b1..1806ab01b1 100644
--- a/qpid/doc/book/src/Qpid-JMX-Management-Console-FAQ.xml
+++ b/qpid/doc/book/src/java-broker/Qpid-JMX-Management-Console-FAQ.xml
diff --git a/qpid/doc/book/src/java-broker/Qpid-JMX-Management-Console-User-Guide.xml b/qpid/doc/book/src/java-broker/Qpid-JMX-Management-Console-User-Guide.xml
new file mode 100644
index 0000000000..35bb5dfbe8
--- /dev/null
+++ b/qpid/doc/book/src/java-broker/Qpid-JMX-Management-Console-User-Guide.xml
@@ -0,0 +1,793 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<section id="Qpid-JMX-Management-Console-User-Guide"><title>
+ Qpid JMX Management Console User Guide
+ </title><section role="h1" id="QpidJMXManagementConsoleUserGuide-QpidJMXManagementConsoleUserGuide"><title>
+ Qpid JMX Management Console User Guide
+ </title>
+
+
+ <para>
+
+ The Qpid JMX Management Console is a standalone Eclipse RCP
+ application for managing and monitoring the Qpid Java server
+ utilising its JMX management interfaces.
+ </para><para>
+ This guide will give an overview of configuring the console, the
+ features supported by it, and how to make use of the console in
+ managing the various JMX Management Beans (MBeans) offered by the
+ Qpid Java server.
+ </para>
+<!--h1--></section>
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-Startup-26Configuration"><title>
+
+ Startup &amp; Configuration
+ </title>
+
+ <para>
+
+ </para>
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-Startup"><title>
+ Startup
+ </title>
+
+ <para>
+
+ The console can be started in the following way, depending on
+ platform:
+ </para><itemizedlist>
+ <listitem><para>
+ <emphasis>Windows:</emphasis> by running the <emphasis>qpidmc.exe</emphasis> executable
+ file.
+ </para></listitem>
+ <listitem><para>
+ <emphasis>Linux:</emphasis> by running the <emphasis>qpidmc</emphasis> executable.
+ </para></listitem>
+ <listitem><para>
+ <emphasis>Mac OS X:</emphasis> by launching the <emphasis>Qpid Management
+ Console.app</emphasis> application bundle.
+ </para></listitem>
+ </itemizedlist><para>
+
+ </para>
+ </section>
+
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-SSLconfiguration"><title>
+ SSL
+ configuration
+ </title>
+
+ <para>
+
+ Newer Qpid Java servers can protect their JMX connections with
+ SSL, and this is enabled by default. When attempting to connect
+ to a server with this enabled, the console must be able to verify
+ the SSL certificate presented to it by the server or the
+ connection will fail.
+ </para><para>
+ If the server makes use of an SSL certificate signed by a known
+ Signing CA (Certification Authority) then the console needs no
+ extra configuration, and will make use of Java's default
+ system-wide CA TrustStore for certificate verification (you may
+ however have to update the system-wide default CA TrustStore if
+ your certified is signed by a less common CA that is not already
+ present in it).
+ </para><para>
+ If however the server is equipped with a self-signed SSL
+ certificate, then the management console must be provided with an
+ appropriate SSL TrustStore containing the public key for the SSL
+ certificate, so that it is able to validate it when presented by
+ the server. The server ships with a script to create an example
+ self-signed SSL certificate, and store the relevant entries in a
+ KeyStore and matching TrustStore. This script can serve as a
+ guide on how to use the Java Keytool security utility to
+ manipulate your own stores, and more information can be found in
+ the JSSE Reference Guide:
+ <ulink url="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores">http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores</ulink>.
+ </para><para>
+ Supplying the necessary details to the console is performed by
+ setting the <emphasis>javax.net.ssl.trustStore</emphasis> and
+ <emphasis>javax.net.ssl.trustStorePassword</emphasis> environment variables
+ when starting it. This can be done at the command line, but the
+ preferred option is to set the configuration within the
+ <emphasis>qpidmc.ini</emphasis> launcher configuration file for repeated
+ usage. This file is equipped with a template to ease
+ configuration, this should be uncommented and edited to suit your
+ needs. It can be found in the root of the console releases for
+ Windows, and Linux. For Mac OS X the file is located within the
+ consoles <emphasis>.app</emphasis> application bundle, and to locate and edit
+ it you must select <emphasis>'Show Package Contents'</emphasis> when
+ accessing the context menu of the application, then browse to the
+ <emphasis>Contents/MacOS</emphasis> sub folder to locate the file.
+ </para>
+<!--h2--></section>
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-JMXMPconfiguration"><title>
+ JMXMP
+ configuration
+ </title>
+
+ <para>
+
+ Older releases of the Qpid Java server can make use of the Java
+ Management Extensions Messaging Protocol (JMXMP) to provide
+ protection for their JMX connections. This occurs when the server
+ has its main configuration set with the management
+ <emphasis>'security-enabled'</emphasis> property set to true.
+ </para><para>
+ In order to connect to this configuration of server, the console
+ needs an additional library that is not included within the Java
+ SE platform and cannot be distributed with the console due to
+ licensing restrictions.
+ </para><para>
+ You can download the JMX Remote API 1.0.1_04 Reference
+ Implementation from the Sun website <xref linkend="qpid_download.jsp"/>. The included
+ <emphasis>jmxremote-1_0_1-bin/lib/jmxremote_optional.jar</emphasis> file must
+ be added to the <emphasis>plugins/jmxremote.sasl_1.0.1</emphasis> folder of
+ the console release (again, in Mac OS X you will need to select
+ <emphasis>'Show package contents'</emphasis> from the context menu whilst
+ selecting the management console bundle in order to reveal the
+ inner file tree).
+ </para><para>
+ Following this the console will automatically load the JMX Remote
+ Optional classes and negotiate the SASL authentication profile
+ type when encountering a JMXMP enabled Qpid Java server.
+ </para>
+<!--h2--></section>
+<!--h1--></section>
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingServerConnections"><title>
+
+ Managing Server Connections
+ </title>
+
+ <para>
+
+ </para>
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-MainToolbar"><title>
+ Main Toolbar
+ </title>
+
+ <para>
+
+ The main toolbar of the console can be seen in the image below.
+ The left most buttons respectively allow for adding a new server
+ connection, reconnecting to an existing server selected in the
+ connection tree, disconnecting the selected server connection,
+ and removing the server from the connection tree.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113098.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+
+
+ Beside these buttons is a combo for selecting the refresh
+ interval; that is, how often the console requests updated
+ information to display for the currently open area in the main
+ view. Finally, the right-most button enables an immediate update.
+ </para>
+ </section>
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-Connectingtoanewserver"><title>
+ Connecting
+ to a new server
+ </title>
+
+ <para>
+
+ To connect to a new server, press the <emphasis>Add New Server</emphasis>
+ toolbar button, or select the <emphasis>Qpid Manager -&gt; Add New
+ Connection</emphasis> menu item. At this point a dialog box will be
+ displayed requesting the server details, namely the server
+ hostname, management port, and a username and password. An
+ example is shown below:
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113099.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+
+ Once all the required details are entered, pressing Connect will
+ initiate a connection attempt to the server. It the attempt fails
+ a reason will be shown and the server will not be added to the
+ connection tree. If the attempt is successful the server will be
+ added to the connections list and the entry expanded to show the
+ initial administration MBeans the user has access to and any
+ VirtualHosts present on the server, as can be seen in the figure
+ below.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113100.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+
+ If the server supports a newer management API than the console in
+ use, once connected this initial screen will contain a message on
+ the right, indicating an upgraded console should be sought by the
+ user to ensure all management functionality supported by the
+ server is being utilised.
+ </para>
+<!--h2--></section>
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-Reconnectingtoaserver"><title>
+ Reconnecting
+ to a server
+ </title>
+
+ <para>
+
+ If a server has been connected to previously, it will be saved as
+ an entry in the connection tree for further use. On subsequent
+ connections the server can simply be selected from the tree and
+ using the <emphasis>Reconnect</emphasis> toolbar button or <emphasis>Qpid Manager
+ -&gt; Reconnect</emphasis> menu item. At this stage the console will
+ prompt simply for the username and password with which the user
+ wishes to connect, and following a successful connection the
+ screen will appear as shown previously above.
+ </para>
+<!--h2--></section>
+
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-Disconnectingfromaserver"><title>
+ Disconnecting
+ from a server
+ </title>
+
+ <para>
+
+ To disconnect from a server, select the connection tree node for
+ the server and press the <emphasis>Disconnect</emphasis> toolbar button, or
+ use the <emphasis>Qpid Manager -&gt; Disconnect</emphasis> menu option.
+ </para>
+<!--h2--></section>
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-Removingaserver"><title>
+ Removing a
+ server
+ </title>
+
+ <para>
+
+ To remove a server from the connection list, select the
+ connection tree node for the server and press the <emphasis>Remove</emphasis>
+ toolbar button, or use the <emphasis>Qpid Manager -&gt; Remove
+ Connection</emphasis> menu option.
+ </para>
+<!--h2--></section>
+<!--h1--></section>
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-Navigatingaconnectedserver"><title>
+ Navigating a connected server
+ </title>
+
+ <para>
+
+ Once connected to a server, the various areas available for
+ administration are accessed using the Qpid Connections tree at
+ the left side of the application. To open a particular MBean from
+ the tree for viewing, simply select it in the tree and it will be
+ opened in the main view.
+ <mediaobject><imageobject><imagedata fileref="images/3113101.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ As there may be vast numbers of Queues, Connections, and
+ Exchanges on the server these MBeans are not automatically added
+ to the tree along with the general administration MBeans.
+ Instead, dedicated selection areas are provided to allow users to
+ select which Queue/Connection/Exchange they wish to view or add
+ to the tree. These areas can be found by clicking on the
+ Connections, Exchanges, and Queues nodes in the tree under each
+ VirtualHost, as shown in the figure above. One or more MBeans may
+ be selected and added to the tree as Favourites using the button
+ provided. These settings are saved for future use, and each time
+ the console connects to the server it will check for the presence
+ of the MBean previously in the tree and add them if they are
+ still present. Queue/Connection/Exchange MBeans can be removed
+ from the tree by right clicking on them to expose a context menu
+ allowing deletion.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113102.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ As an alternative way to open a particular MBean for viewing,
+ without first adding it to the tree, you can simply double click
+ an entry in the table within the Queue/Connection/Exchange
+ selection areas to open it immediately. It is also possible to
+ open some MBeans like this whilst viewing certain other MBeans.
+ When opening an MBean in either of these ways, a Back button is
+ enabled in the top right corner of the main view. Using this
+ button will return you to the selection area or MBean you were
+ previously viewing. The history resets each time the tree is used
+ to open a new area or MBean.
+ </para>
+<!--h1--></section>
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ConfigurationManagementMBean"><title>
+
+ ConfigurationManagement MBean
+ </title>
+
+ <para>
+
+ The ConfigurationManagement MBean is available on newer servers,
+ to users with admin level management rights. It offers the
+ ability to perform a live reload of the <emphasis>Security</emphasis>
+ sections defined in the main server configuration file (e.g.
+ defaults to: <emphasis>etc/config.xml</emphasis>). This is mainly to allow
+ updating the server Firewall configuration to new settings
+ without a restart, and can be performed by clicking the Execute
+ button and confirming the prompt which follows.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113103.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para>
+<!--h1--></section>
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-LoggingManagementMBean"><title>
+
+ LoggingManagement MBean
+ </title>
+
+ <para>
+
+ The LoggingManagement MBean is available on newer servers, and
+ accessible by admin level users. It allows live alteration of the
+ logging behaviour, both at a Runtime-only level and at the
+ configuration file level. The latter can optionally affect the
+ Runtime configuration, either through use of the servers
+ automated LogWatch ability which detects changes to the
+ configuration file and reloads it, or by manually requesting a
+ reload. This functionality is split across two management tabs,
+ Runtime Options and ConfigurationFile Options.
+ </para>
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-RuntimeOptions"><title>
+ Runtime
+ Options
+ </title>
+
+ <para>
+
+ <mediaobject><imageobject><imagedata fileref="images/3113104.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ The Runtime Options tab allows manipulation of the logging
+ settings without affecting the configuration files (this means
+ the changes will be lost when the server restarts), and gives
+ individual access to every Logger active within the server.
+ </para><para>
+ As shown in the figure above, the table in this tab presents the
+ Effective Level of each Logger. This is because the Loggers form
+ a hierarchy in which those without an explicitly defined (in the
+ logging configuration file) Level will inherit the Level of their
+ immediate parent; that is, the Logger whose full name is a prefix
+ of their own, or if none satisfy that condition then the
+ RootLogger is their parent. As example, take the
+ <emphasis>org.apache.qpid</emphasis> Logger. It is parent to all those below
+ it which begin with <emphasis>org.apache.qpid</emphasis> and unless they have
+ a specific Level of their own, they will inherit its Level. This
+ can be seen in the figure, whereby all the children Loggers
+ visible have a level of WARN just like their parent, but the
+ RootLogger Level is INFO; the children have inherited the WARN
+ level from <emphasis>org.apache.qpid</emphasis> rather than INFO from the
+ RootLogger.
+ </para><para>
+ To aid with this distinction, the Logger Levels that are
+ currently defined in the configuration file are highlighted in
+ the List. Changing these levels at runtime will also change the
+ Level of all their children which haven't been set their own
+ Level using the runtime options. In the latest versions of the
+ LoggingManagement MBean, it is possible to restore a child logger
+ that has had an explicit level se, to inheriting that of its
+ parent by setting it to an INHERITED level that removes any
+ previously set Level of its own.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113105.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ In order to set one of more Loggers to a new Level, they should
+ be selected in the table (or double click an individual Logger to
+ modify it) and the <emphasis>Edit Selected Logger(s)</emphasis> button
+ pressed to load the dialog shown above. At this point, any of the
+ available Levels supported by the server can be applied to the
+ Loggers selected and they will immediately update, as will any
+ child Loggers without their own specific Level.
+ </para><para>
+ The RootLogger can be similarly edited using the button at the
+ bottom left of the window.
+ </para>
+<!--h2--></section>
+
+ <section role="h2" id="QpidJMXManagementConsoleUserGuide-ConfigurationFileOptions"><title>
+ ConfigurationFile
+ Options
+ </title>
+
+ <para>
+
+ The ConfigurationFile Options tab allows alteration of the Level
+ settings for the Loggers defined in the configuration file,
+ allowing changes to persist following a restart of the server.
+ Changes made to the configuration file are only applied
+ automatically while the sever is running if it was configured to
+ enable the LogWatch capability, meaning it will monitor the
+ configuration file for changes and apply the new configuration
+ when the change is detected. If this was not enabled, the changes
+ will be picked up when the server is restarted. The status of the
+ LogWatch feature is shown at the bottom of the tab.
+ Alternatively, in the latest versions of the LoggingManagement
+ MBean it is possible to reload the logging configuration file on
+ demand.
+ </para><para>
+ Manipulating the Levels is as on the Runtime Options tab, either
+ double-click an individual Logger entry or select multiple
+ Loggers and use the button to load the dialog to set the new
+ Level.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113106.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ One issue to note of when reloading the configuration file
+ settings, either automatically using LogWatch or manually, is
+ that any Logger set to a specific Level using the Runtime Options
+ tab that is not defined in the configuration file will maintain
+ that Level when the configuration file is reloaded. In other
+ words, if a Logger is defined in the configuration file, then the
+ configuration file will take precedence at reload, otherwise the
+ Runtime options take precedence.
+ </para><para>
+ This situation will be immediately obvious by examining the
+ Runtime Options tab to see the effective Level of each Logger
+ – unless it has been altered with the RuntimeOptions or
+ specifically set in the configuration file, a Logger Level should
+ match that of its parent. In the latest versions of the
+ LoggingManagement MBean, it is possible to use the RuntimeOptions
+ to restore a child logger to inheriting from its parent by
+ setting it with an INHERITED level that removes any previously
+ set Level of its own.
+
+ </para>
+<!--h2--></section>
+<!--h1--></section>
+
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ServerInformationMBean"><title>
+ ServerInformation MBean
+ </title>
+
+ <para>
+
+ <mediaobject><imageobject><imagedata fileref="images/3113107.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ The ServerInformation MBean currently only conveys various pieces
+ of version information to allow precise identification of the
+ server version and its management capabilities. In future it is
+ likely to convey additional server-wide details and/or
+ functionality.
+ </para>
+<!--h1--></section>
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-UserManagementMBean"><title>
+
+ UserManagement MBean
+ </title>
+
+ <para>
+
+ The UserManagement MBean is accessible by admin level users, and
+ allows manipulation of existing user accounts and creation of new
+ user accounts.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113108.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+
+ To add a new user, press the <emphasis>Add New User</emphasis> button, which
+ will load the dialog shown below.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113109.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Here you may enter the new users Username, Password, and select
+ their JMX Management Rights. This controls whether or not they
+ have access to the management interface, and if so what
+ capabilities are accessible. <emphasis>Read Only</emphasis> access allows
+ undertaking any operations that do not alter the server state,
+ such as viewing messages. <emphasis>Read + Write</emphasis> access allows use
+ of all operations which are not deemed admin-only (such as those
+ in the UserManagement MBean itself). <emphasis>Admin</emphasis> access allows
+ a user to utilize any operation, and view the admin-only MBeans
+ (currently these are ConfigurationManagement, LoggingManagement,
+ and UserManagement).
+ </para><para>
+ One or more users at a time may be deleted by selecting them in
+ the table and clicking the <emphasis>Delete User(s)</emphasis> button. The
+ console will then prompt for confirmation before undertaking the
+ removals. Similarly, the access rights for one or more users may
+ be updated by selecting them in the table and clicking the
+ <emphasis>Set Rights</emphasis> button. The console will then display a
+ dialog enabling selection of the new access level and
+ confirmation to undertake the update.
+ </para><para>
+ An individual user password may be updated by selecting the user
+ in the table in and clicking the <emphasis>Set Password</emphasis> button.
+ The console will then display a dialog enabling input of the new
+ password and confirmation to undertake the update.
+ </para><para>
+
+ The server caches the user details in memory to aid performance.
+ If may sometimes be necessary to externally modify the password
+ and access right files on disk. In order for these changes to be
+ known to the server without a restart, it must be instructed to
+ reload the file contents. This can be done using the provided
+ <emphasis>Reload User Details</emphasis> button (on older servers, only the
+ management rights file is reloaded, on newer servers both files
+ are. The description on screen will indicate the behaviour).
+ After pressing this button the console will seek confirmation
+ before proceeding.
+ </para>
+<!--h1--></section>
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-VirtualHostManagerMBean"><title>
+
+ VirtualHostManager MBean
+ </title>
+
+ <para>
+
+ Each VirtualHost in the server has an associated
+ VirtualHostManager MBean. This allows viewing, creation, and
+ deletion of Queues and Exchanges within the VirtualHost.
+ </para><para>
+ Clicking the <emphasis>Create</emphasis> button in the Queue section will
+ open a dialog allowing specification of the Name, Owner
+ (optional), and durability properties of the new Queue, and
+ confirmation of the operation.
+ </para><para>
+ One or more Queues may be deleted by selecting them in the table
+ and clicking the <emphasis>Delete</emphasis> button. This will unregister the
+ Queue bindings, remove the subscriptions and delete the Queue(s).
+ The console will prompt for confirmation before undertaking the
+ operation.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113110.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Clicking the <emphasis>Create</emphasis> button in the Exchange section will
+ open a dialog allowing specification of the Name, Type, and
+ Durable attributes of the new Exchange, and confirmation of the
+ operation.
+ </para><para>
+ One or more Exchanges may be deleted by selecting them in the
+ table and clicking the <emphasis>Delete</emphasis> button. This will
+ unregister all the related channels and Queue bindings then
+ delete the Exchange(s). The console will prompt for confirmation
+ before undertaking the operation.
+ </para><para>
+
+ Double-clicking on a particular Queue or Exchange name in the
+ tables will open the MBean representing it.
+ </para>
+<!--h1--></section>
+
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-Notifications"><title>
+
+ Notifications
+ </title>
+
+ <para>
+
+ MBeans on the server can potentially send Notifications that
+ users may subscribe to. When managing an individual MBean that
+ offers Notifications types for subscription, the console supplies
+ a Notifications tab to allow (un)subscription to the
+ Notifications if desired and viewing any that are received
+ following subscription.
+ </para><para>
+ In order to provide quicker access to/awareness of any received
+ Notifications, each VirtualHost area in the connection tree has a
+ Notifications area that aggregates all received Notifications for
+ MBeans in that VirtualHost. An example of this can be seen in the
+ figure below.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113111.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ All received Notifications will be displayed until such time as
+ the user removes them, either in this aggregated view, or in the
+ Notifications area of the individual MBean that generated the
+ Notification.
+ </para><para>
+ They may be cleared selectively or all at once. To clear
+ particular Notifications, they should be selected in the table
+ before pressing the <emphasis>Clear</emphasis> button. To clear all
+ Notifications, simply press the <emphasis>Clear</emphasis> button without
+ anything selected in the table, at which point the console will
+ request confirmation of this clear-all action.
+ </para>
+<!--h1--></section>
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingQueues"><title>
+ Managing
+ Queues
+ </title>
+
+ <para>
+
+ As mentioned in earlier discussion of Navigation, Queue MBeans
+ can be opened either by double clicking an entry in the Queues
+ selection area, or adding a queue to the tree as a favourite and
+ clicking on its tree node. Unique to the Queue selection screen
+ is the ability to view additional attributes beyond just that of
+ the Queue Name. This is helpful for determining which Queues
+ satisfy a particular condition, e.g. having &lt;X&gt; messages on
+ the queue. The example below shows the selection view with
+ additional attributes <emphasis>Consumer Count, Durable, MessageCount,
+ and QueueDepth</emphasis> (selected using the <emphasis>Select
+ Attributes</emphasis> button at the bottom right corner of the
+ table)<emphasis>.</emphasis>
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113112.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Upon opening a Queue MBean, the Attributes tab is displayed, as
+ shown below. This allows viewing the value all attributes,
+ editing those which are writable values (highlighted in blue) if
+ the users management permissions allow, viewing descriptions of
+ their purpose, and graphing certain numerical attribute values as
+ they change over time.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113113.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ The next tab contains the operations that can be performed on the
+ queue. The main table serves as a means of viewing the messages
+ on the queue, and later for selecting specific messages to
+ operate upon. It is possible to view any desired range of
+ messages on the queue by specifying the visible range using the
+ fields at the top and pressing the <emphasis>Set</emphasis> button. Next to
+ this there are helper buttons to enable faster browsing through
+ the messages on the queue; these allow moving forward and back by
+ whatever number of messages is made visible by the viewing range
+ set. The Queue Position column indicates the position of each
+ message on the queue, but is only present when connected to newer
+ servers as older versions cannot provide the necessary
+ information to show this (unless only a single message position
+ is requested).
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113114.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Upon selecting a message in the table, its header properties and
+ redelivery status are updated in the area below the table. Double
+ clicking a message in the table (or using the <emphasis>View Message
+ Content</emphasis> button to its right) will open a dialog window
+ displaying the contents of the message.
+ </para><para>
+ One or more messages can be selected in the table and moved to
+ another queue in the VirtualHost by using the <emphasis>Move
+ Message(s)</emphasis> button, which opens a dialog to enable selection
+ of the destination and confirmation of the operation. Newer
+ servers support the ability to similarly copy the selected
+ messages to another queue in a similar fashion, or delete the
+ selected messages from the queue after prompting for
+ confirmation.
+ </para><para>
+ Finally, all messages (that have not been acquired by consumers)
+ on the queue can be deleted using the <emphasis>Clear Queue</emphasis>
+ button, which will generate a prompt for confirmation. On newer
+ servers, the status bar at the lower left of the application will
+ report the number of messages actually removed.
+ </para>
+<!--h1--></section>
+
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingExchanges"><title>
+
+ Managing Exchanges
+ </title>
+
+ <para>
+ Exchange MBeans are opened for management operations in similar
+ fashion as described for Queues, again showing an Attributes tab
+ initially, with the Operations tab next:
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113115.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Of the four default Exchange Types <emphasis>(direct, fanout, headers,
+ and topic)</emphasis> all but <emphasis>headers</emphasis> have their bindings
+ presented in the format shown above. The left table provides the
+ binding/routing keys present in the exchange. Selecting one of
+ these entries in the table prompts the right table to display all
+ the queues associated with this key. Pressing the <emphasis>Create</emphasis>
+ button opens a dialog allowing association of an existing queue
+ with the entered Binding.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113116.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ The <emphasis>headers</emphasis> Exchange type (default instantiation
+ <emphasis>amq.match or amq.headers</emphasis>) is presented as below:
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113117.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ In the previous figure, the left table indicates the binding
+ number, and the Queue associated with the binding. Selecting one
+ of these entries in the table prompts the right table to display
+ the header values that control when the binding matches an
+ incoming message.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113118.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ </para><para>
+ Pressing the <emphasis>Create</emphasis> button when managing a
+ <emphasis>headers</emphasis> Exchange opens a dialog allowing creation of a
+ new binding, associating an existing Queue with a particular set
+ of header keys and values. The <emphasis>x-match</emphasis> key is required,
+ and instructs the server whether to match the binding with
+ incoming messages based on ANY or ALL of the further key-value
+ pairs entered. If it is desired to enter more than 4 pairs, you
+ may press the <emphasis>Add additional field</emphasis> button to create a
+ new row as many times as is required.
+
+ When managing a <emphasis>headers</emphasis> Exchange, double clicking an
+ entry in the left-hand table will open the MBean for the Queue
+ specified in the binding properties.
+ </para><para>
+ When managing another Exchange Type, double clicking the Queue
+ Name in the right-hand table will open the MBean of the Queue
+ specified.
+ </para>
+<!--h1--></section>
+
+ <section role="h1" id="QpidJMXManagementConsoleUserGuide-ManagingConnections"><title>
+
+ Managing Connections
+ </title>
+
+ <para>
+
+ Exchange MBeans are opened for management operations in similar
+ fashion as described for Queues, again showing an Attributes tab
+ initially, with the Operations tab next, and finally a
+ Notifications tab allowing subscription and viewing of
+ Notifications. The Operations tab can be seen in the figure
+ below.
+ </para><para>
+ <mediaobject><imageobject><imagedata fileref="images/3113119.png" format="PNG" scalefit="1"/></imageobject><textobject><phrase/></textobject><caption><para/></caption></mediaobject>
+ The main table shows the properties of all the Channels that are
+ present on the Connection, including whether they are
+ <emphasis>Transactional</emphasis>, the <emphasis>Number of Unacked Messages</emphasis>
+ on them, and the <emphasis>Default Queue</emphasis> if there is one (or
+ <emphasis>null</emphasis> if there is not).
+ </para><para>
+ The main operations supported on a connection are Commiting and
+ Rolling Back of Transactions on a particular Channel, if the
+ Channel is Transactional. This can be done by selecting a
+ particular Channel in the table and pressing the <emphasis>Commit
+ Transactions</emphasis> or <emphasis>Rollback Transactions</emphasis> buttons at
+ the lower right corner of the table, at which point the console
+ will prompt for confirmation of the action. These buttons are
+ only active when the selected Channel in the table is
+ Transactional.
+ </para><para>
+ The final operation supported is closing the Connection. After
+ pressing the <emphasis>Close Connection</emphasis> button, the console will
+ prompt for confirmation of the action. If this is carried out,
+ the MBean for the Connection being managed will be removed from
+ the server. The console will be notified of this by the server
+ and display an information dialog to that effect, as it would if
+ any other MBean were to be unregistered whilst being viewed.
+ </para><para>
+ Double clicking a row in the table will open the MBean of the
+ associated <emphasis>Default Queue</emphasis> if there is one.
+ </para>
+
+<!--h1--></section>
+</section>
diff --git a/qpid/doc/book/src/Qpid-JMX-Management-Console.xml b/qpid/doc/book/src/java-broker/Qpid-JMX-Management-Console.xml
index fb46f4a01a..fb46f4a01a 100644
--- a/qpid/doc/book/src/Qpid-JMX-Management-Console.xml
+++ b/qpid/doc/book/src/java-broker/Qpid-JMX-Management-Console.xml
diff --git a/qpid/doc/book/src/Qpid-Java-Broker-Management-CLI.xml b/qpid/doc/book/src/java-broker/Qpid-Java-Broker-Management-CLI.xml
index 84c4b7b7a4..84c4b7b7a4 100644
--- a/qpid/doc/book/src/Qpid-Java-Broker-Management-CLI.xml
+++ b/qpid/doc/book/src/java-broker/Qpid-Java-Broker-Management-CLI.xml
diff --git a/qpid/doc/book/src/Qpid-Java-Build-How-To.xml b/qpid/doc/book/src/java-broker/Qpid-Java-Build-How-To.xml
index 9f3625760a..9f3625760a 100644
--- a/qpid/doc/book/src/Qpid-Java-Build-How-To.xml
+++ b/qpid/doc/book/src/java-broker/Qpid-Java-Build-How-To.xml
diff --git a/qpid/doc/book/src/Qpid-Java-FAQ.xml b/qpid/doc/book/src/java-broker/Qpid-Java-FAQ.xml
index 845c343350..845c343350 100644
--- a/qpid/doc/book/src/Qpid-Java-FAQ.xml
+++ b/qpid/doc/book/src/java-broker/Qpid-Java-FAQ.xml
diff --git a/qpid/doc/book/src/Qpid-Management-Features.xml b/qpid/doc/book/src/java-broker/Qpid-Management-Features.xml
index c90d7e97c6..c90d7e97c6 100644
--- a/qpid/doc/book/src/Qpid-Management-Features.xml
+++ b/qpid/doc/book/src/java-broker/Qpid-Management-Features.xml
diff --git a/qpid/doc/book/src/Qpid-Troubleshooting-Guide.xml b/qpid/doc/book/src/java-broker/Qpid-Troubleshooting-Guide.xml
index 0920f18798..0920f18798 100644
--- a/qpid/doc/book/src/Qpid-Troubleshooting-Guide.xml
+++ b/qpid/doc/book/src/java-broker/Qpid-Troubleshooting-Guide.xml
diff --git a/qpid/doc/book/src/java/broker/configuration/Topic-Configuration.xml b/qpid/doc/book/src/java-broker/Topic-Configuration.xml
index 1f73bbd7a4..1f73bbd7a4 100644
--- a/qpid/doc/book/src/java/broker/configuration/Topic-Configuration.xml
+++ b/qpid/doc/book/src/java-broker/Topic-Configuration.xml
diff --git a/qpid/doc/book/src/Use-Priority-Queues.xml b/qpid/doc/book/src/java-broker/Use-Priority-Queues.xml
index 466d958d43..466d958d43 100644
--- a/qpid/doc/book/src/Use-Priority-Queues.xml
+++ b/qpid/doc/book/src/java-broker/Use-Priority-Queues.xml
diff --git a/qpid/doc/book/src/images/jmx_console/3113098.png b/qpid/doc/book/src/java-broker/images/3113098.png
index 7de85030c6..7de85030c6 100644
--- a/qpid/doc/book/src/images/jmx_console/3113098.png
+++ b/qpid/doc/book/src/java-broker/images/3113098.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113099.png b/qpid/doc/book/src/java-broker/images/3113099.png
index fb6fc65d73..fb6fc65d73 100644
--- a/qpid/doc/book/src/images/jmx_console/3113099.png
+++ b/qpid/doc/book/src/java-broker/images/3113099.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113100.png b/qpid/doc/book/src/java-broker/images/3113100.png
index a7d727b854..a7d727b854 100644
--- a/qpid/doc/book/src/images/jmx_console/3113100.png
+++ b/qpid/doc/book/src/java-broker/images/3113100.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113101.png b/qpid/doc/book/src/java-broker/images/3113101.png
index 30731277c2..30731277c2 100644
--- a/qpid/doc/book/src/images/jmx_console/3113101.png
+++ b/qpid/doc/book/src/java-broker/images/3113101.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113102.png b/qpid/doc/book/src/java-broker/images/3113102.png
index f150a21b10..f150a21b10 100644
--- a/qpid/doc/book/src/images/jmx_console/3113102.png
+++ b/qpid/doc/book/src/java-broker/images/3113102.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113103.png b/qpid/doc/book/src/java-broker/images/3113103.png
index a91efb4306..a91efb4306 100644
--- a/qpid/doc/book/src/images/jmx_console/3113103.png
+++ b/qpid/doc/book/src/java-broker/images/3113103.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113104.png b/qpid/doc/book/src/java-broker/images/3113104.png
index c5ef12d8b1..c5ef12d8b1 100644
--- a/qpid/doc/book/src/images/jmx_console/3113104.png
+++ b/qpid/doc/book/src/java-broker/images/3113104.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113105.png b/qpid/doc/book/src/java-broker/images/3113105.png
index b155f9d9a1..b155f9d9a1 100644
--- a/qpid/doc/book/src/images/jmx_console/3113105.png
+++ b/qpid/doc/book/src/java-broker/images/3113105.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113106.png b/qpid/doc/book/src/java-broker/images/3113106.png
index 22bcdd084e..22bcdd084e 100644
--- a/qpid/doc/book/src/images/jmx_console/3113106.png
+++ b/qpid/doc/book/src/java-broker/images/3113106.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113107.png b/qpid/doc/book/src/java-broker/images/3113107.png
index cf5dd97e89..cf5dd97e89 100644
--- a/qpid/doc/book/src/images/jmx_console/3113107.png
+++ b/qpid/doc/book/src/java-broker/images/3113107.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113108.png b/qpid/doc/book/src/java-broker/images/3113108.png
index c0e5eafde2..c0e5eafde2 100644
--- a/qpid/doc/book/src/images/jmx_console/3113108.png
+++ b/qpid/doc/book/src/java-broker/images/3113108.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113109.png b/qpid/doc/book/src/java-broker/images/3113109.png
index 139d81d849..139d81d849 100644
--- a/qpid/doc/book/src/images/jmx_console/3113109.png
+++ b/qpid/doc/book/src/java-broker/images/3113109.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113110.png b/qpid/doc/book/src/java-broker/images/3113110.png
index 2207f15cd7..2207f15cd7 100644
--- a/qpid/doc/book/src/images/jmx_console/3113110.png
+++ b/qpid/doc/book/src/java-broker/images/3113110.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113111.png b/qpid/doc/book/src/java-broker/images/3113111.png
index 5737f41caf..5737f41caf 100644
--- a/qpid/doc/book/src/images/jmx_console/3113111.png
+++ b/qpid/doc/book/src/java-broker/images/3113111.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113112.png b/qpid/doc/book/src/java-broker/images/3113112.png
index d9ee094ab4..d9ee094ab4 100644
--- a/qpid/doc/book/src/images/jmx_console/3113112.png
+++ b/qpid/doc/book/src/java-broker/images/3113112.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113113.png b/qpid/doc/book/src/java-broker/images/3113113.png
index e80812f83c..e80812f83c 100644
--- a/qpid/doc/book/src/images/jmx_console/3113113.png
+++ b/qpid/doc/book/src/java-broker/images/3113113.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113114.png b/qpid/doc/book/src/java-broker/images/3113114.png
index b237181150..b237181150 100644
--- a/qpid/doc/book/src/images/jmx_console/3113114.png
+++ b/qpid/doc/book/src/java-broker/images/3113114.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113115.png b/qpid/doc/book/src/java-broker/images/3113115.png
index 84ad42b567..84ad42b567 100644
--- a/qpid/doc/book/src/images/jmx_console/3113115.png
+++ b/qpid/doc/book/src/java-broker/images/3113115.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113116.png b/qpid/doc/book/src/java-broker/images/3113116.png
index 18b979792f..18b979792f 100644
--- a/qpid/doc/book/src/images/jmx_console/3113116.png
+++ b/qpid/doc/book/src/java-broker/images/3113116.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113117.png b/qpid/doc/book/src/java-broker/images/3113117.png
index 3b33ef67ac..3b33ef67ac 100644
--- a/qpid/doc/book/src/images/jmx_console/3113117.png
+++ b/qpid/doc/book/src/java-broker/images/3113117.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113118.png b/qpid/doc/book/src/java-broker/images/3113118.png
index 60451f88cf..60451f88cf 100644
--- a/qpid/doc/book/src/images/jmx_console/3113118.png
+++ b/qpid/doc/book/src/java-broker/images/3113118.png
Binary files differ
diff --git a/qpid/doc/book/src/images/jmx_console/3113119.png b/qpid/doc/book/src/java-broker/images/3113119.png
index 16ded074bd..16ded074bd 100644
--- a/qpid/doc/book/src/images/jmx_console/3113119.png
+++ b/qpid/doc/book/src/java-broker/images/3113119.png
Binary files differ
diff --git a/qpid/doc/book/src/ACL.xml b/qpid/doc/book/src/old/ACL.xml
index ceb7cecb23..ceb7cecb23 100644
--- a/qpid/doc/book/src/ACL.xml
+++ b/qpid/doc/book/src/old/ACL.xml
diff --git a/qpid/doc/book/src/AMQP-.NET-Messaging-Client.xml b/qpid/doc/book/src/old/AMQP-.NET-Messaging-Client.xml
index 1d4001942b..1d4001942b 100644
--- a/qpid/doc/book/src/AMQP-.NET-Messaging-Client.xml
+++ b/qpid/doc/book/src/old/AMQP-.NET-Messaging-Client.xml
diff --git a/qpid/doc/book/src/AMQP-C++-Messaging-Client.xml b/qpid/doc/book/src/old/AMQP-C++-Messaging-Client.xml
index 73a2cd6c0b..73a2cd6c0b 100644
--- a/qpid/doc/book/src/AMQP-C++-Messaging-Client.xml
+++ b/qpid/doc/book/src/old/AMQP-C++-Messaging-Client.xml
diff --git a/qpid/doc/book/src/AMQP-Java-JMS-Messaging-Client.xml b/qpid/doc/book/src/old/AMQP-Java-JMS-Messaging-Client.xml
index 8c14d67e14..8c14d67e14 100644
--- a/qpid/doc/book/src/AMQP-Java-JMS-Messaging-Client.xml
+++ b/qpid/doc/book/src/old/AMQP-Java-JMS-Messaging-Client.xml
diff --git a/qpid/doc/book/src/AMQP-Messaging-Broker-CPP.xml b/qpid/doc/book/src/old/AMQP-Messaging-Broker-CPP.xml
index b4e0deb13d..b4e0deb13d 100644
--- a/qpid/doc/book/src/AMQP-Messaging-Broker-CPP.xml
+++ b/qpid/doc/book/src/old/AMQP-Messaging-Broker-CPP.xml
diff --git a/qpid/doc/book/src/AMQP-Python-Messaging-Client.xml b/qpid/doc/book/src/old/AMQP-Python-Messaging-Client.xml
index 15baf214ec..15baf214ec 100644
--- a/qpid/doc/book/src/AMQP-Python-Messaging-Client.xml
+++ b/qpid/doc/book/src/old/AMQP-Python-Messaging-Client.xml
diff --git a/qpid/doc/book/src/AMQP-Ruby-Messaging-Client.xml b/qpid/doc/book/src/old/AMQP-Ruby-Messaging-Client.xml
index 45318c0beb..45318c0beb 100644
--- a/qpid/doc/book/src/AMQP-Ruby-Messaging-Client.xml
+++ b/qpid/doc/book/src/old/AMQP-Ruby-Messaging-Client.xml
diff --git a/qpid/doc/book/src/AMQP.xml b/qpid/doc/book/src/old/AMQP.xml
index 1a609649bb..1a609649bb 100644
--- a/qpid/doc/book/src/AMQP.xml
+++ b/qpid/doc/book/src/old/AMQP.xml
diff --git a/qpid/doc/book/src/Binding-URL-Format.xml b/qpid/doc/book/src/old/Binding-URL-Format.xml
index 3d938b740a..3d938b740a 100644
--- a/qpid/doc/book/src/Binding-URL-Format.xml
+++ b/qpid/doc/book/src/old/Binding-URL-Format.xml
diff --git a/qpid/doc/book/src/Book-Info.xml b/qpid/doc/book/src/old/Book-Info.xml
index 2e02fbe8ea..2e02fbe8ea 100644
--- a/qpid/doc/book/src/Book-Info.xml
+++ b/qpid/doc/book/src/old/Book-Info.xml
diff --git a/qpid/doc/book/src/Book.xml b/qpid/doc/book/src/old/Book.xml
index ee69532152..ee69532152 100644
--- a/qpid/doc/book/src/Book.xml
+++ b/qpid/doc/book/src/old/Book.xml
diff --git a/qpid/doc/book/src/Broker-CPP.xml b/qpid/doc/book/src/old/Broker-CPP.xml
index 99584be23d..99584be23d 100644
--- a/qpid/doc/book/src/Broker-CPP.xml
+++ b/qpid/doc/book/src/old/Broker-CPP.xml
diff --git a/qpid/doc/book/src/Broker-Java.xml b/qpid/doc/book/src/old/Broker-Java.xml
index f8ce89b185..f8ce89b185 100644
--- a/qpid/doc/book/src/Broker-Java.xml
+++ b/qpid/doc/book/src/old/Broker-Java.xml
diff --git a/qpid/doc/book/src/Clients.xml b/qpid/doc/book/src/old/Clients.xml
index 3dc2d38e86..3dc2d38e86 100644
--- a/qpid/doc/book/src/Clients.xml
+++ b/qpid/doc/book/src/old/Clients.xml
diff --git a/qpid/doc/book/src/Connection-URL-Format.xml b/qpid/doc/book/src/old/Connection-URL-Format.xml
index cb772487cd..cb772487cd 100644
--- a/qpid/doc/book/src/Connection-URL-Format.xml
+++ b/qpid/doc/book/src/old/Connection-URL-Format.xml
diff --git a/qpid/doc/book/src/Download.xml b/qpid/doc/book/src/old/Download.xml
index 7bc08143ac..7bc08143ac 100644
--- a/qpid/doc/book/src/Download.xml
+++ b/qpid/doc/book/src/old/Download.xml
diff --git a/qpid/doc/book/src/Excel-AddIn.xml b/qpid/doc/book/src/old/Excel-AddIn.xml
index e38f620bd8..e38f620bd8 100644
--- a/qpid/doc/book/src/Excel-AddIn.xml
+++ b/qpid/doc/book/src/old/Excel-AddIn.xml
diff --git a/qpid/doc/book/src/FAQ.xml b/qpid/doc/book/src/old/FAQ.xml
index 5647f18f69..5647f18f69 100644
--- a/qpid/doc/book/src/FAQ.xml
+++ b/qpid/doc/book/src/old/FAQ.xml
diff --git a/qpid/doc/book/src/Getting-Started.xml b/qpid/doc/book/src/old/Getting-Started.xml
index 216a52170e..216a52170e 100644
--- a/qpid/doc/book/src/Getting-Started.xml
+++ b/qpid/doc/book/src/old/Getting-Started.xml
diff --git a/qpid/doc/book/src/old/How-to-Use-JNDI.xml b/qpid/doc/book/src/old/How-to-Use-JNDI.xml
new file mode 100644
index 0000000000..0d6315c2a3
--- /dev/null
+++ b/qpid/doc/book/src/old/How-to-Use-JNDI.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<chapter id="How-to-Use-JNDI">
+ <title>
+ How to Use JNDI
+ </title>
+ <section role="h2" id="HowtoUseJNDI-HowtousethePropertiesFileInitialContextFactory">
+ <title>
+ How to use the PropertiesFileInitialContextFactory
+ </title>
+
+ <para>
+ This ContextFactory uses a java properties formatted file to
+ setup initial values.
+ </para>
+ <section role="h3" id="HowtoUseJNDI-JNDIPropertysetup">
+ <title>
+ JNDI Property setup
+ </title>
+ <para>
+ By setting the JNDI Initial Context Factory and URL as
+ below it is possible to load any File from the locally
+ mounted file system to use for JNDI purposes. The format
+ of the file is described in the next section.
+ </para>
+ <programlisting>
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+java.naming.provider.url = &lt;path to JNDI File&gt;
+</programlisting>
+ <para>
+ By simply setting these two system properties you can jump
+ straight to the InitialContext creation in your code.
+ </para>
+ </section>
+ <section role="h3" id="HowtoUseJNDI-Examplepropertiesfile">
+ <title>
+ Example properties file </title>
+ <para>
+ This is the example properties file.
+ </para>
+ <programlisting>
+# register some connection factories
+# connectionfactory.[jndiname] = [ConnectionURL]
+connectionfactory.local = amqp://guest:guest@clientid/testpath?brokerlist='vm://:1'
+
+# register some queues in JNDI using the form
+# queue.[jndiName] = [physicalName]
+queue.MyQueue = example.MyQueue
+
+# register some topics in JNDI using the form
+# topic.[jndiName] = [physicalName]
+topic.ibmStocks = stocks.nyse.ibm
+
+# Register an AMQP destination in JNDI
+# NOTE: Qpid currently only supports direct,topics and headers
+# destination.[jniName] = [BindingURL]
+destination.direct = direct://amq.direct//directQueue
+</programlisting>
+ <para>
+ The property file allows a number of queues to be defined that
+ can then be discovered via JNDI. There are four properties used
+ by the PFICFactory.
+ <emphasis>connectionfactory.&lt;jndiname&gt;</emphasis> this is the <xref linkend="Connection-URL-Format"/> that the connection
+ factory will use to perform connections.
+ <emphasis>queue.&lt;jndiname&gt;</emphasis> this defines a jms queue or in
+ amqp a amq.direct exchange
+ <emphasis>topic.&lt;jndiname&gt;</emphasis> this defines a jms topic or in
+ amqp a amq.topic exchange
+ <emphasis>destination.&lt;jndiname&gt;</emphasis> this takes a <xref linkend="BindingURLFormat"/>
+ and so can be used for defining all amq destinations, queues,
+ topics and header matching.
+ </para><para>
+ In all of these properties the <emphasis>&lt;jndiname&gt;</emphasis> is the
+ string value that would be given when performing a lookup.
+ </para><para>
+ <emphasis>NOTE</emphasis>: This does not create the queue on the broker. You
+ should ensure that you have created the queue before publishing
+ to it. Queues can be declared in the virtualhosts.xml file so
+ that they are created on broker startup, or created dynamically
+ by consuming clients. Topics and other destinations that use
+ temporary queues cannot be created in this way, so a consumer
+ must be created first before publishing messages with mandatory
+ routing.
+ </para>
+ </section>
+ <section role="h3" id="HowtoUseJNDI-Examplelookupcode">
+ <title>
+ Example lookup code
+ </title><!--h3-->
+
+ <para>
+ The <emphasis>bindingValue</emphasis> is the String that would be placed in
+ <emphasis>&lt;jndiname&gt;</emphasis> above.
+ </para>
+
+ <example>
+ <title>Simple JNDI lookup using files</title>
+ <programlisting>
+//Ensure you have your system properties set
+final String INITIAL_CONTEXT_FACTORY = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
+
+System.setProperty(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
+System.setProperty(Context.PROVIDER_URL, _JNDIFile);
+
+// Create the initial context
+Context ctx = new InitialContext();
+
+// Perform the binds
+object = ctx.lookup(bindingValue);
+
+// Close the context when we're done
+ctx.close();
+</programlisting>
+</example>
+
+<example>
+<title>Simple JNDI lookup using properties</title>
+
+ <programlisting>
+
+final String INITIAL_CONTEXT_FACTORY = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
+
+final String CONNECTION_JNDI_NAME = "local";
+final String CONNECTION_NAME = "amqp://guest:guest@clientid/testpath?brokerlist='vm://:1'";
+
+final String QUEUE_JNDI_NAME = "queue";
+final String QUEUE_NAME = "example.MyQueue";
+
+// Set the properties ...
+Properties properties = new Properties();
+properties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
+properties.put("connectionfactory."+CONNECTION_JNDI_NAME , CONNECTION_NAME);
+properties.put("queue."+QUEUE_JNDI_NAME , QUEUE_NAME);
+
+// Create the initial context
+Context ctx = new InitialContext(properties);
+
+// Perform the lookups
+ConnectionFactory factory = (ConnectionFactory)ctx.lookup(CONNECTION_JNDI_NAME);
+Queue queue = (Queue)ctx.lookup(QUEUE_JNDI_NAME);
+
+// Close the context when we're done
+ctx.close();
+</programlisting>
+</example>
+ </section>
+
+ <section>
+ <title>Using Qpid with Other JNDI Providers</title>
+ <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="Using-Qpid-with-other-JNDI-Providers.xml"/>
+ </section>
+<!--h2-->
+ </section>
+
+</chapter>
diff --git a/qpid/doc/book/src/InfoPlugin.xml b/qpid/doc/book/src/old/InfoPlugin.xml
index aebcd08c02..aebcd08c02 100644
--- a/qpid/doc/book/src/InfoPlugin.xml
+++ b/qpid/doc/book/src/old/InfoPlugin.xml
diff --git a/qpid/doc/book/src/Introduction.xml b/qpid/doc/book/src/old/Introduction.xml
index 8f92c207cf..8f92c207cf 100644
--- a/qpid/doc/book/src/Introduction.xml
+++ b/qpid/doc/book/src/old/Introduction.xml
diff --git a/qpid/doc/book/src/Java-Broker-StatusLogMessages.xml b/qpid/doc/book/src/old/Java-Broker-StatusLogMessages.xml
index 98f876e532..98f876e532 100644
--- a/qpid/doc/book/src/Java-Broker-StatusLogMessages.xml
+++ b/qpid/doc/book/src/old/Java-Broker-StatusLogMessages.xml
diff --git a/qpid/doc/book/src/Java-JMS-Selector-Syntax.xml b/qpid/doc/book/src/old/Java-JMS-Selector-Syntax.xml
index 870e277b66..870e277b66 100644
--- a/qpid/doc/book/src/Java-JMS-Selector-Syntax.xml
+++ b/qpid/doc/book/src/old/Java-JMS-Selector-Syntax.xml
diff --git a/qpid/doc/book/src/Management-Design-notes.xml b/qpid/doc/book/src/old/Management-Design-notes.xml
index 76f0dac926..76f0dac926 100644
--- a/qpid/doc/book/src/Management-Design-notes.xml
+++ b/qpid/doc/book/src/old/Management-Design-notes.xml
diff --git a/qpid/doc/book/src/NET-User-Guide.xml b/qpid/doc/book/src/old/NET-User-Guide.xml
index 7bfa20b8c8..7bfa20b8c8 100644
--- a/qpid/doc/book/src/NET-User-Guide.xml
+++ b/qpid/doc/book/src/old/NET-User-Guide.xml
diff --git a/qpid/doc/book/src/PythonBrokerTest.xml b/qpid/doc/book/src/old/PythonBrokerTest.xml
index ae7edade40..ae7edade40 100644
--- a/qpid/doc/book/src/PythonBrokerTest.xml
+++ b/qpid/doc/book/src/old/PythonBrokerTest.xml
diff --git a/qpid/doc/book/src/QMan-Qpid-Management-bridge.xml b/qpid/doc/book/src/old/QMan-Qpid-Management-bridge.xml
index f2c366dcbb..f2c366dcbb 100644
--- a/qpid/doc/book/src/QMan-Qpid-Management-bridge.xml
+++ b/qpid/doc/book/src/old/QMan-Qpid-Management-bridge.xml
diff --git a/qpid/doc/book/src/Qpid-ACLs.xml b/qpid/doc/book/src/old/Qpid-ACLs.xml
index a2b64061c3..a2b64061c3 100644
--- a/qpid/doc/book/src/Qpid-ACLs.xml
+++ b/qpid/doc/book/src/old/Qpid-ACLs.xml
diff --git a/qpid/doc/book/src/Qpid-Book.xml b/qpid/doc/book/src/old/Qpid-Book.xml
index ee69532152..ee69532152 100644
--- a/qpid/doc/book/src/Qpid-Book.xml
+++ b/qpid/doc/book/src/old/Qpid-Book.xml
diff --git a/qpid/doc/book/src/Qpid-Compatibility-And-Interoperability-Book.xml b/qpid/doc/book/src/old/Qpid-Compatibility-And-Interoperability-Book.xml
index f382f390c7..f382f390c7 100644
--- a/qpid/doc/book/src/Qpid-Compatibility-And-Interoperability-Book.xml
+++ b/qpid/doc/book/src/old/Qpid-Compatibility-And-Interoperability-Book.xml
diff --git a/qpid/doc/book/src/SASL-Compatibility.xml b/qpid/doc/book/src/old/SASL-Compatibility.xml
index ad223792b5..ad223792b5 100644
--- a/qpid/doc/book/src/SASL-Compatibility.xml
+++ b/qpid/doc/book/src/old/SASL-Compatibility.xml
diff --git a/qpid/doc/book/src/SSL.xml b/qpid/doc/book/src/old/SSL.xml
index a9a5cb953a..a9a5cb953a 100644
--- a/qpid/doc/book/src/SSL.xml
+++ b/qpid/doc/book/src/old/SSL.xml
diff --git a/qpid/doc/book/src/Security-Plugins.xml b/qpid/doc/book/src/old/Security-Plugins.xml
index bf5cb726b3..bf5cb726b3 100644
--- a/qpid/doc/book/src/Security-Plugins.xml
+++ b/qpid/doc/book/src/old/Security-Plugins.xml
diff --git a/qpid/doc/book/src/System-Properties.xml b/qpid/doc/book/src/old/System-Properties.xml
index 40b823185f..40b823185f 100644
--- a/qpid/doc/book/src/System-Properties.xml
+++ b/qpid/doc/book/src/old/System-Properties.xml
diff --git a/qpid/doc/book/src/Using-Qpid-with-other-JNDI-Providers.xml b/qpid/doc/book/src/old/Using-Qpid-with-other-JNDI-Providers.xml
index 2bd7d761ef..2bd7d761ef 100644
--- a/qpid/doc/book/src/Using-Qpid-with-other-JNDI-Providers.xml
+++ b/qpid/doc/book/src/old/Using-Qpid-with-other-JNDI-Providers.xml
diff --git a/qpid/doc/book/src/WCF.xml b/qpid/doc/book/src/old/WCF.xml
index aaf54463db..aaf54463db 100644
--- a/qpid/doc/book/src/WCF.xml
+++ b/qpid/doc/book/src/old/WCF.xml
diff --git a/qpid/doc/book/src/schemas.xml b/qpid/doc/book/src/old/schemas.xml
index 6102e65f07..6102e65f07 100644
--- a/qpid/doc/book/src/schemas.xml
+++ b/qpid/doc/book/src/old/schemas.xml
diff --git a/qpid/doc/book/src/programming/Makefile b/qpid/doc/book/src/programming/Makefile
new file mode 100644
index 0000000000..0266a0f54d
--- /dev/null
+++ b/qpid/doc/book/src/programming/Makefile
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+include ../Makefile.inc
diff --git a/qpid/doc/book/src/Message-Groups-Guide.xml b/qpid/doc/book/src/programming/Message-Groups-Guide.xml
index 3e5c549ff9..3e5c549ff9 100644
--- a/qpid/doc/book/src/Message-Groups-Guide.xml
+++ b/qpid/doc/book/src/programming/Message-Groups-Guide.xml
diff --git a/qpid/doc/book/src/Programming-In-Apache-Qpid.xml b/qpid/doc/book/src/programming/Programming-In-Apache-Qpid-Book.xml
index 3052e2acc1..3052e2acc1 100644
--- a/qpid/doc/book/src/Programming-In-Apache-Qpid.xml
+++ b/qpid/doc/book/src/programming/Programming-In-Apache-Qpid-Book.xml
diff --git a/qpid/doc/book/src/QmfBook.xml b/qpid/doc/book/src/qmf/QmfBook.xml
index 64a6545fb5..64a6545fb5 100644
--- a/qpid/doc/book/src/QmfBook.xml
+++ b/qpid/doc/book/src/qmf/QmfBook.xml
diff --git a/qpid/doc/book/src/QmfIntroduction.xml b/qpid/doc/book/src/qmf/QmfIntroduction.xml
index db7b8949a5..db7b8949a5 100644
--- a/qpid/doc/book/src/QmfIntroduction.xml
+++ b/qpid/doc/book/src/qmf/QmfIntroduction.xml
diff --git a/qpid/doc/book/xsl/html-custom.xsl b/qpid/doc/book/xsl/html-custom.xsl
new file mode 100644
index 0000000000..94ba3b67f9
--- /dev/null
+++ b/qpid/doc/book/xsl/html-custom.xsl
@@ -0,0 +1,188 @@
+<?xml version='1.0'?>
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl"/>
+
+<xsl:template name="chunk-element-content">
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="nav.context"/>
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:call-template name="user.preroot"/>
+
+ <html>
+ <xsl:call-template name="html.head">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <body>
+<div class="container">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.navigation"/>
+
+ <xsl:call-template name="header.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+<div class="main_text_area">
+ <div class="main_text_area_top">
+ </div>
+ <div class="main_text_area_body">
+ <xsl:call-template name="user.header.content"/>
+ <xsl:copy-of select="$content"/>
+
+ <xsl:call-template name="user.footer.content"/>
+ </div>
+ <xsl:call-template name="footer.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="user.footer.navigation"/>
+ <div class="main_text_area_bottom">
+ </div>
+</div>
+</div>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+</xsl:template>
+
+<xsl:template name="breadcrumbs">
+ <xsl:param name="this.node" select="."/>
+ <DIV class="breadcrumbs">
+ <xsl:for-each select="$this.node/ancestor::*">
+ <span class="breadcrumb-link">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ <xsl:with-param name="context" select="$this.node"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </a>
+ </span>
+ <xsl:text> &gt; </xsl:text>
+ </xsl:for-each>
+ <!-- And display the current node, but not as a link -->
+ <span class="breadcrumb-node">
+ <xsl:apply-templates select="$this.node" mode="title.markup"/>
+ </span>
+ </DIV>
+</xsl:template>
+
+<xsl:template name="header.navigation">
+ <DIV class="header">
+ <DIV class="logo">
+ <H1>Apache Qpid&#8482;</H1>
+ <H2>Open Source AMQP Messaging</H2>
+ </DIV>
+ </DIV>
+
+ <DIV class="menu_box">
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>Apache Qpid</H3>
+ <UL>
+ <LI><A href="http://qpid.apache.org/index.html">Home</A></LI>
+ <LI><A href="http://qpid.apache.org/download.html">Download</A></LI>
+ <LI><A href="http://qpid.apache.org/getting_started.html">Getting Started</A></LI>
+ <LI><A href="http://www.apache.org/licenses/">License</A></LI>
+ <LI><A href="https://cwiki.apache.org/qpid/faq.html">FAQ</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>Documentation</H3>
+ <UL>
+ <LI><A href="http://qpid.apache.org/documentation.html#doc-release">0.14 Release</A></LI>
+ <LI><A href="http://qpid.apache.org/documentation.html#doc-trunk">Trunk</A></LI>
+ <LI><A href="http://qpid.apache.org/documentation.html#doc-archives">Archive</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>Community</H3>
+ <UL>
+ <LI><A href="http://qpid.apache.org/getting_involved.html">Getting Involved</A></LI>
+ <LI><A href="http://qpid.apache.org/source_repository.html">Source Repository</A></LI>
+ <LI><A href="http://qpid.apache.org/mailing_lists.html">Mailing Lists</A></LI>
+ <LI><A href="https://cwiki.apache.org/qpid/">Wiki</A></LI>
+ <LI><A href="https://issues.apache.org/jira/browse/qpid">Issue Reporting</A></LI>
+ <LI><A href="http://qpid.apache.org/people.html">People</A></LI>
+ <LI><A href="http://qpid.apache.org/acknowledgements.html">Acknowledgements</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>Developers</H3>
+ <UL>
+ <LI><A href="https://cwiki.apache.org/qpid/building.html">Building Qpid</A></LI>
+ <LI><A href="https://cwiki.apache.org/qpid/developer-pages.html">Developer Pages</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>About AMQP</H3>
+ <UL>
+ <LI><A href="http://qpid.apache.org/amqp.html">What is AMQP?</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+
+ <DIV class="menu_box_top"></DIV>
+ <DIV class="menu_box_body">
+ <H3>About Apache</H3>
+ <UL>
+ <LI><A href="http://www.apache.org">Home</A></LI>
+ <LI><A href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</A></LI>
+ <LI><A href="http://www.apache.org/foundation/thanks.html">Thanks</A></LI>
+ <LI><A href="http://www.apache.org/security/">Security</A></LI>
+ </UL>
+ </DIV>
+ <DIV class="menu_box_bottom"></DIV>
+ </DIV>
+
+</xsl:template>
+
+<xsl:template name="user.header.content">
+ <xsl:call-template name="breadcrumbs"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/qpid/java/.gitignore b/qpid/java/.gitignore
new file mode 100644
index 0000000000..36097e3820
--- /dev/null
+++ b/qpid/java/.gitignore
@@ -0,0 +1,2 @@
+*.swp
+eclipse-projects/*
diff --git a/qpid/java/amqp-1-0-client-jms/build.xml b/qpid/java/amqp-1-0-client-jms/build.xml
new file mode 100644
index 0000000000..4a685d7106
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/build.xml
@@ -0,0 +1,29 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<project name="AMQP 1.0 JMS Client" default="build">
+
+ <property name="module.genpom" value="true"/>
+ <property name="module.depends" value="amqp-1-0-common amqp-1-0-client"/>
+
+
+ <import file="../module.xml"/>
+
+</project>
diff --git a/qpid/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/Hello.java b/qpid/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/Hello.java
new file mode 100644
index 0000000000..61317e7f37
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/Hello.java
@@ -0,0 +1,178 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms.example;
+
+import javax.jms.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Properties;
+
+
+public class Hello
+{
+
+ public Hello()
+ {
+ }
+
+ public static void main(String[] args)
+ {
+ try
+ {
+ Class.forName("org.apache.qpid.amqp_1_0.jms.jndi.PropertiesFileInitialContextFactory");
+
+ Hashtable env = new Hashtable();
+ env.put("java.naming.provider.url", "hello.properties");
+ env.put("java.naming.factory.initial", "org.apache.qpid.amqp_1_0.jms.jndi.PropertiesFileInitialContextFactory");
+
+ Context context = new InitialContext(env);
+
+ ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("localhost");
+ Connection connection = connectionFactory.createConnection();
+
+ Session producersession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Queue queue = (Queue) context.lookup("queue");
+
+
+ Session consumerSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageConsumer messageConsumer = consumerSession.createConsumer(queue, "hello='true' and 7");
+
+ messageConsumer.setMessageListener(new MessageListener()
+ {
+ public void onMessage(final Message message)
+ {
+ try
+ {
+
+ if(message instanceof TextMessage)
+ {
+ System.out.println("Received text Message:");
+ System.out.println("======================");
+ System.out.println(((TextMessage) message).getText());
+ }
+ else if(message instanceof MapMessage)
+ {
+ System.out.println("Received Map Message:");
+ System.out.println("=====================");
+
+
+ MapMessage mapmessage = (MapMessage) message;
+
+ Enumeration names = mapmessage.getMapNames();
+
+ while(names.hasMoreElements())
+ {
+ String name = (String) names.nextElement();
+ System.out.println(name + " -> " + mapmessage.getObject(name));
+ }
+
+ }
+ else if(message instanceof BytesMessage)
+ {
+ System.out.println("Received Bytes Message:");
+ System.out.println("=======================");
+ System.out.println(((BytesMessage) message).readUTF());
+ }
+ else if(message instanceof StreamMessage)
+ {
+ System.out.println("Received Stream Message:");
+ System.out.println("========================");
+ StreamMessage streamMessage = (StreamMessage)message;
+ Object o = streamMessage.readObject();
+ System.out.println(o.getClass().getName() + ": " + o);
+ o = streamMessage.readObject();
+ System.out.println(o.getClass().getName() + ": " + o);
+ o = streamMessage.readObject();
+ System.out.println(o.getClass().getName() + ": " + o);
+
+ }
+ else if(message instanceof ObjectMessage)
+ {
+ System.out.println("Received Object Message:");
+ System.out.println("========================");
+ ObjectMessage objectMessage = (ObjectMessage)message;
+ Object o = objectMessage.getObject();
+ System.out.println(o.getClass().getName() + ": " + o);
+ }
+ else
+ {
+ System.out.println("Received Message " + message.getClass().getName());
+ }
+ }
+ catch (JMSException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+
+ }
+ });
+
+ connection.start();
+
+
+ MessageProducer messageProducer = producersession.createProducer(queue);
+ TextMessage message = producersession.createTextMessage("Hello world!");
+ message.setJMSType("Hello");
+ message.setStringProperty("hello","true");
+ messageProducer.send(message);
+ /*
+ MapMessage mapmessage = producersession.createMapMessage();
+ mapmessage.setBoolean("mybool", true);
+ mapmessage.setString("mystring", "hello");
+ mapmessage.setLong("mylong", -25L);
+
+
+ messageProducer.send(mapmessage);
+
+ BytesMessage bytesMessage = producersession.createBytesMessage();
+ bytesMessage.writeUTF("This is a bytes message");
+
+ messageProducer.send(bytesMessage);
+
+ ObjectMessage objectMessage = producersession.createObjectMessage();
+ objectMessage.setObject(new Double("3.14159265358979323846264338327950288"));
+
+ messageProducer.send(objectMessage);
+
+/* StreamMessage streamMessage = producersession.createStreamMessage();
+ streamMessage.writeBoolean(true);
+ streamMessage.writeLong(18031974L);
+ streamMessage.writeString("this is a stream Message");
+ streamMessage.writeChar('£');
+ messageProducer.send(streamMessage);
+*/
+ Thread.sleep(50000L);
+
+ connection.close();
+ context.close();
+ }
+ catch (Exception exp)
+ {
+ exp.printStackTrace();
+ }
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/hello.properties b/qpid/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/hello.properties
new file mode 100644
index 0000000000..930c2c15cc
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/example/src/main/java/org/apache/qpid/amqp_1_0/jms/example/hello.properties
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+java.naming.factory.initial = org.apache.qpid.amqp_1_0.jms.jndi.PropertiesFileInitialContextFactory
+
+# register some connection factories
+# connectionfactory.[jndiname] = [ConnectionURL]
+connectionfactory.localhost = http://guest:guest@localhost/test?cliendId='test-client'
+
+
+# Register an AMQP destination in JNDI
+# destination.[jniName] = [Address Format]
+queue.queue = queue
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/AmqpMessage.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/AmqpMessage.java
new file mode 100644
index 0000000000..de42b36ef2
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/AmqpMessage.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms;
+
+import org.apache.qpid.amqp_1_0.type.Section;
+
+import java.util.ListIterator;
+
+public interface AmqpMessage extends Message
+{
+ int getSectionCount();
+
+ Section getSection(int position);
+
+ ListIterator<Section> sectionIterator();
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/BytesMessage.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/BytesMessage.java
new file mode 100644
index 0000000000..3475319fe4
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/BytesMessage.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface BytesMessage extends Message, javax.jms.BytesMessage
+{
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Connection.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Connection.java
new file mode 100644
index 0000000000..97447917f6
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Connection.java
@@ -0,0 +1,37 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+
+public interface Connection extends javax.jms.Connection
+{
+
+ ConnectionMetaData getMetaData() throws JMSException;
+
+ Session createSession(boolean transacted, int acknowledgeMode) throws JMSException;
+
+ Session createSession(Session.AcknowledgeMode acknowledgeMode) throws JMSException;
+
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java
new file mode 100644
index 0000000000..752993b229
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms;
+
+
+import javax.jms.JMSException;
+
+public interface ConnectionFactory extends javax.jms.ConnectionFactory
+{
+ Connection createConnection() throws JMSException;
+
+ Connection createConnection(String username, String password) throws JMSException;
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionMetaData.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionMetaData.java
new file mode 100644
index 0000000000..3802d6e416
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionMetaData.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface ConnectionMetaData extends javax.jms.ConnectionMetaData
+{
+ int getAMQPMajorVersion();
+
+ int getAMQPMinorVersion();
+
+ int getAMQPRevisionVersion();
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Destination.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Destination.java
new file mode 100644
index 0000000000..0b467b3c99
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Destination.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface Destination extends javax.jms.Destination
+{
+ public String getAddress();
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/JavaSerializable.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/JavaSerializable.java
new file mode 100644
index 0000000000..0c9179bc2b
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/JavaSerializable.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface JavaSerializable
+{
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MapMessage.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MapMessage.java
new file mode 100644
index 0000000000..81754ecc93
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MapMessage.java
@@ -0,0 +1,37 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+import java.util.Set;
+
+public interface MapMessage extends Message, javax.jms.MapMessage
+{
+ public Object get(Object key) throws JMSException;
+
+ public Object put(Object key, Object val) throws JMSException;
+
+ public boolean itemExists(Object key) throws JMSException;
+
+ Set<Object> keySet() throws JMSException;
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Message.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Message.java
new file mode 100644
index 0000000000..1481c54ee1
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Message.java
@@ -0,0 +1,178 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import org.apache.qpid.amqp_1_0.messaging.MessageAttributes;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+
+import javax.jms.JMSException;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+public interface Message extends javax.jms.Message
+{
+
+ Destination getJMSReplyTo() throws JMSException;
+
+ Destination getJMSDestination() throws JMSException;
+
+ // properties can be keyed by any valid apache.qpid.amqp_1_0 datatype, not just strings
+
+ boolean propertyExists(Object name) throws JMSException;
+
+ boolean getBooleanProperty(Object name) throws JMSException;
+
+ byte getByteProperty(Object name) throws JMSException;
+
+ short getShortProperty(Object name) throws JMSException;
+
+ int getIntProperty(Object name) throws JMSException;
+
+ long getLongProperty(Object name) throws JMSException;
+
+ float getFloatProperty(Object name) throws JMSException;
+
+ double getDoubleProperty(Object name) throws JMSException;
+
+ String getStringProperty(Object name) throws JMSException;
+
+ Object getObjectProperty(Object name) throws JMSException;
+
+ // apache.qpid.amqp_1_0 allows for lists, maps, and unsigned integral data types
+
+ List<Object> getListProperty(Object name) throws JMSException;
+
+ Map<Object,Object> getMapProperty(Object name) throws JMSException;
+
+ UnsignedByte getUnsignedByteProperty(Object name) throws JMSException;
+
+ UnsignedShort getUnsignedShortProperty(Object name) throws JMSException;
+
+ UnsignedInteger getUnsignedIntProperty(Object name) throws JMSException;
+
+ UnsignedLong getUnsignedLongProperty(Object name) throws JMSException;
+
+ // properties can be keyed by any valid apache.qpid.amqp_1_0 datatype, not just strings
+
+ void setBooleanProperty(Object name, boolean b) throws JMSException;
+
+ void setByteProperty(Object name, byte b) throws JMSException;
+
+ void setShortProperty(Object name, short i) throws JMSException;
+
+ void setIntProperty(Object name, int i) throws JMSException;
+
+ void setLongProperty(Object name, long l) throws JMSException;
+
+ void setFloatProperty(Object name, float v) throws JMSException;
+
+ void setDoubleProperty(Object name, double v) throws JMSException;
+
+ void setStringProperty(Object name, String s1) throws JMSException;
+
+ void setObjectProperty(Object name, Object o) throws JMSException;
+
+ // apache.qpid.amqp_1_0 allows for lists, maps, and unsigned integral data types
+
+ void setListProperty(Object name, List<Object> list) throws JMSException;
+
+ void setMapProperty(Object name, Map<Object,Object> map) throws JMSException;
+
+ void setUnsignedByteProperty(Object name, UnsignedByte b) throws JMSException;
+
+ void setUnsignedShortProperty(Object name, UnsignedShort s) throws JMSException;
+
+ void setUnsignedIntProperty(Object name, UnsignedInteger i) throws JMSException;
+
+ void setUnsignedLongProperty(Object name, UnsignedLong l) throws JMSException;
+
+ // delegation accessors for Header section
+
+ UnsignedInteger getDeliveryFailures();
+
+ void setDeliveryFailures(UnsignedInteger failures);
+
+ MessageAttributes getHeaderMessageAttrs();
+
+ void setHeaderMessageAttrs(MessageAttributes messageAttrs);
+
+ MessageAttributes getHeaderDeliveryAttrs();
+
+ void setHeaderDeliveryAttrs(MessageAttributes deliveryAttrs);
+
+ Boolean getDurable();
+
+ void setDurable(Boolean durable);
+
+ UnsignedByte getPriority();
+
+ void setPriority(UnsignedByte priority);
+
+ Date getTransmitTime();
+
+ void setTransmitTime(Date transmitTime);
+
+ UnsignedInteger getTtl();
+
+ void setTtl(UnsignedInteger ttl);
+
+ UnsignedInteger getFormerAcquirers();
+
+ void setFormerAcquirers(UnsignedInteger formerAcquirers);
+
+ // delegation accessors for Properties section
+
+ Object getMessageId();
+
+ void setMessageId(Object messageId);
+
+ Binary getUserId();
+
+ void setUserId(Binary userId);
+
+ String getTo();
+
+ void setTo(String to);
+
+ String getSubject();
+
+ void setSubject(String subject);
+
+ String getReplyTo();
+
+ void setReplyTo(String replyTo);
+
+ Object getCorrelationId();
+
+ void setCorrelationId(Binary correlationId);
+
+ Symbol getContentType();
+
+ void setContentType(Symbol contentType);
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageConsumer.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageConsumer.java
new file mode 100644
index 0000000000..fe235f098f
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageConsumer.java
@@ -0,0 +1,36 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+
+public interface MessageConsumer extends javax.jms.MessageConsumer
+{
+
+ Message receive() throws JMSException;
+
+ Message receive(long l) throws JMSException;
+
+ Message receiveNoWait() throws JMSException;
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageProducer.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageProducer.java
new file mode 100644
index 0000000000..98987c2409
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/MessageProducer.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+
+public interface MessageProducer extends javax.jms.MessageProducer
+{
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ObjectMessage.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ObjectMessage.java
new file mode 100644
index 0000000000..8b59aa284a
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ObjectMessage.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface ObjectMessage extends Message, javax.jms.ObjectMessage
+{
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Queue.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Queue.java
new file mode 100644
index 0000000000..40beac08d1
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Queue.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface Queue extends Destination, javax.jms.Queue
+{
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueBrowser.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueBrowser.java
new file mode 100644
index 0000000000..5bb88569a1
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueBrowser.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface QueueBrowser extends javax.jms.QueueBrowser
+{
+ Queue getQueue() throws JMSException;
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueConnection.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueConnection.java
new file mode 100644
index 0000000000..1375f1c5f2
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueConnection.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface QueueConnection extends javax.jms.QueueConnection, Connection
+{
+ QueueSession createQueueSession(boolean b, int i) throws JMSException;
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueReceiver.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueReceiver.java
new file mode 100644
index 0000000000..9cc1a36ca7
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueReceiver.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface QueueReceiver extends MessageConsumer, javax.jms.QueueReceiver
+{
+ Queue getQueue() throws JMSException;
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSender.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSender.java
new file mode 100644
index 0000000000..824e48364c
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSender.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface QueueSender extends MessageProducer, javax.jms.QueueSender
+{
+ Queue getQueue() throws JMSException;
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSession.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSession.java
new file mode 100644
index 0000000000..28d30f60c5
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/QueueSession.java
@@ -0,0 +1,42 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+
+public interface QueueSession extends Session, javax.jms.QueueSession
+{
+ Queue createQueue(String s) throws JMSException;
+
+ QueueReceiver createReceiver(javax.jms.Queue queue) throws JMSException;
+
+ QueueReceiver createReceiver(javax.jms.Queue queue, String s) throws JMSException;
+
+ QueueSender createSender(javax.jms.Queue queue) throws JMSException;
+
+ QueueBrowser createBrowser(javax.jms.Queue queue) throws JMSException;
+
+ QueueBrowser createBrowser(javax.jms.Queue queue, String s) throws JMSException;
+
+ TemporaryQueue createTemporaryQueue() throws JMSException;
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Session.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Session.java
new file mode 100644
index 0000000000..0ce9baecea
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Session.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Queue;
+import javax.jms.Topic;
+
+
+import java.io.Serializable;
+
+public interface Session extends javax.jms.Session
+{
+ static enum AcknowledgeMode { SESSION_TRANSACTED, AUTO_ACKNOWLEDGE, CLIENT_ACKNOWLEDGE, DUPS_OK_ACKNOWLEDGE };
+
+ BytesMessage createBytesMessage() throws JMSException;
+
+ MapMessage createMapMessage() throws JMSException;
+
+ Message createMessage() throws JMSException;
+
+ ObjectMessage createObjectMessage() throws JMSException;
+
+ ObjectMessage createObjectMessage(Serializable serializable) throws JMSException;
+
+ StreamMessage createStreamMessage() throws JMSException;
+
+ TextMessage createTextMessage() throws JMSException;
+
+ TextMessage createTextMessage(String s) throws JMSException;
+
+ AmqpMessage createAmqpMessage() throws JMSException;
+
+ MessageProducer createProducer(Destination destination) throws JMSException;
+
+ MessageConsumer createConsumer(Destination destination) throws JMSException;
+
+ MessageConsumer createConsumer(Destination destination, String s) throws JMSException;
+
+ MessageConsumer createConsumer(Destination destination, String s, boolean b) throws JMSException;
+
+ TopicSubscriber createDurableSubscriber(Topic topic, String s) throws JMSException;
+
+ TopicSubscriber createDurableSubscriber(Topic topic, String s, String s1, boolean b)
+ throws JMSException;
+
+ QueueBrowser createBrowser(Queue queue) throws JMSException;
+
+ QueueBrowser createBrowser(Queue queue, String s) throws JMSException;
+
+ TemporaryQueue createTemporaryQueue() throws JMSException;
+
+ TemporaryTopic createTemporaryTopic() throws JMSException;
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/StreamMessage.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/StreamMessage.java
new file mode 100644
index 0000000000..d207a708c9
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/StreamMessage.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface StreamMessage extends Message, javax.jms.StreamMessage
+{
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryDestination.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryDestination.java
new file mode 100644
index 0000000000..025a1af806
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryDestination.java
@@ -0,0 +1,33 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface TemporaryDestination
+{
+ Session getSession();
+
+ boolean isDeleted();
+
+ void addConsumer(MessageConsumer consumer);
+
+ void removeConsumer(MessageConsumer consumer);
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryQueue.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryQueue.java
new file mode 100644
index 0000000000..182f9a4c85
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryQueue.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface TemporaryQueue extends Queue, TemporaryDestination, javax.jms.TemporaryQueue
+{
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryTopic.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryTopic.java
new file mode 100644
index 0000000000..277681079b
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TemporaryTopic.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface TemporaryTopic extends Topic, TemporaryDestination, javax.jms.TemporaryTopic
+{
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TextMessage.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TextMessage.java
new file mode 100644
index 0000000000..1dbcd5f84f
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TextMessage.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface TextMessage extends Message, javax.jms.TextMessage
+{
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Topic.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Topic.java
new file mode 100644
index 0000000000..755d698a04
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/Topic.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface Topic extends Destination, javax.jms.Topic
+{
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicConnection.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicConnection.java
new file mode 100644
index 0000000000..1431c7d2cb
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicConnection.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface TopicConnection extends Connection, javax.jms.TopicConnection
+{
+ TopicSession createTopicSession(boolean b, int i) throws JMSException;
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicPublisher.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicPublisher.java
new file mode 100644
index 0000000000..dde6c8b606
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicPublisher.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+public interface TopicPublisher extends MessageProducer, javax.jms.TopicPublisher
+{
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSession.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSession.java
new file mode 100644
index 0000000000..2c02ff199e
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSession.java
@@ -0,0 +1,43 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+
+public interface TopicSession extends Session,javax.jms.TopicSession
+{
+ Topic createTopic(String s) throws JMSException;
+
+ TopicSubscriber createSubscriber(javax.jms.Topic topic) throws JMSException;
+
+ TopicSubscriber createSubscriber(javax.jms.Topic topic, String s, boolean b) throws JMSException;
+
+ TopicSubscriber createDurableSubscriber(javax.jms.Topic topic, String s) throws JMSException;
+
+ TopicSubscriber createDurableSubscriber(javax.jms.Topic topic, String s, String s1, boolean b)
+ throws JMSException;
+
+ TopicPublisher createPublisher(javax.jms.Topic topic) throws JMSException;
+
+ TemporaryTopic createTemporaryTopic() throws JMSException;
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSubscriber.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSubscriber.java
new file mode 100644
index 0000000000..00e5e9aca9
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/TopicSubscriber.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms;
+
+import javax.jms.JMSException;
+
+public interface TopicSubscriber extends MessageConsumer, javax.jms.TopicSubscriber
+{
+ Topic getTopic() throws JMSException;
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/AmqpMessageImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/AmqpMessageImpl.java
new file mode 100644
index 0000000000..0ca629db7e
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/AmqpMessageImpl.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.AmqpMessage;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import java.util.*;
+
+public class AmqpMessageImpl extends MessageImpl implements AmqpMessage
+{
+ private List<Section> _sections;
+
+ protected AmqpMessageImpl(Header header, MessageAnnotations messageAnnotations, Properties properties, ApplicationProperties appProperties, List<Section> sections,
+ Footer footer, SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ _sections = sections;
+ }
+
+ protected AmqpMessageImpl(final SessionImpl session)
+ {
+ super(new Header(), new MessageAnnotations(new HashMap()), new Properties(), new ApplicationProperties(new HashMap()), new Footer(Collections.EMPTY_MAP),
+ session);
+ _sections = new ArrayList<Section>();
+ }
+
+ public int getSectionCount()
+ {
+ return _sections.size();
+ }
+
+ public Section getSection(final int position)
+ {
+ return _sections.get(position);
+ }
+
+ public ListIterator<Section> sectionIterator()
+ {
+ return _sections.listIterator();
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+ sections.addAll(_sections);
+ sections.add(getFooter());
+ return sections;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/BytesMessageImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/BytesMessageImpl.java
new file mode 100644
index 0000000000..83cc8eafb5
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/BytesMessageImpl.java
@@ -0,0 +1,538 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.BytesMessage;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.JMSException;
+import javax.jms.MessageEOFException;
+import javax.jms.MessageFormatException;
+import java.io.*;
+import java.util.*;
+
+public class BytesMessageImpl extends MessageImpl implements BytesMessage
+{
+ private DataInputStream _dataAsInput;
+ private DataOutputStream _dataAsOutput;
+ private ByteArrayOutputStream _bytesOut;
+ private Data _dataIn;
+
+ // message created for reading
+ protected BytesMessageImpl(Header header, MessageAnnotations messageAnnotations, Properties properties, ApplicationProperties appProperties, Data data,
+ Footer footer, SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ _dataIn = data;
+ final Binary dataBuffer = data.getValue();
+ _dataAsInput = new DataInputStream(new ByteArrayInputStream(dataBuffer.getArray(),dataBuffer.getArrayOffset(),dataBuffer.getLength()));
+
+ }
+
+ // message created to be sent
+ protected BytesMessageImpl(final SessionImpl session)
+ {
+ super(new Header(),
+ new MessageAnnotations(new HashMap()),
+ new Properties(),
+ new ApplicationProperties(new HashMap()),
+ new Footer(Collections.EMPTY_MAP),
+ session);
+
+ _bytesOut = new ByteArrayOutputStream();
+ _dataAsOutput = new DataOutputStream(_bytesOut);
+ }
+
+
+ private Data getDataSection()
+ {
+ if(_bytesOut != null)
+ {
+ return new Data(new Binary(_bytesOut.toByteArray()));
+ }
+ else
+ {
+ return _dataIn;
+ }
+ }
+
+ @Override
+ protected boolean isReadOnly()
+ {
+ return _dataIn != null;
+ }
+
+ public long getBodyLength() throws JMSException
+ {
+ checkReadable();
+ return getDataSection().getValue().getLength();
+ }
+
+ public boolean readBoolean() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readBoolean();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+
+ public byte readByte() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readByte();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public int readUnsignedByte() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readUnsignedByte();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public short readShort() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readShort();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public int readUnsignedShort() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readUnsignedShort();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public char readChar() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readChar();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public int readInt() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readInt();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public long readLong() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readLong();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public float readFloat() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readFloat();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public double readDouble() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readDouble();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public String readUTF() throws JMSException
+ {
+ checkReadable();
+ try
+ {
+ return _dataAsInput.readUTF();
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public int readBytes(byte[] bytes) throws JMSException
+ {
+
+ return readBytes(bytes, bytes.length);
+ }
+
+ public int readBytes(byte[] bytes, int length) throws JMSException
+ {
+ checkReadable();
+
+ try
+ {
+ int offset = 0;
+ while(offset < length)
+ {
+ int read = _dataAsInput.read(bytes, offset, length - offset);
+ if(read < 0)
+ {
+ break;
+ }
+ offset += read;
+ }
+
+ if(offset == 0 && length != 0)
+ {
+ return -1;
+ }
+ else
+ {
+ return offset;
+ }
+ }
+ catch (IOException e)
+ {
+ throw handleInputException(e);
+ }
+ }
+
+ public void writeBoolean(boolean b) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeBoolean(b);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+
+ }
+
+ public void writeByte(byte b) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeByte(b);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeShort(short i) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeShort(i);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeChar(char c) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeChar(c);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeInt(int i) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeInt(i);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeLong(long l) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeLong(l);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeFloat(float v) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeFloat(v);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeDouble(double v) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeDouble(v);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeUTF(String s) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.writeUTF(s);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeBytes(byte[] bytes) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.write(bytes);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeBytes(byte[] bytes, int off, int len) throws JMSException
+ {
+ checkWritable();
+ try
+ {
+ _dataAsOutput.write(bytes, off, len);
+ }
+ catch (IOException e)
+ {
+ throw handleOutputException(e);
+ }
+ }
+
+ public void writeObject(Object o) throws JMSException
+ {
+ checkWritable();
+ if(o == null)
+ {
+ throw new NullPointerException("Value passed to BytesMessage.writeObject() must be non null");
+ }
+ else if (o instanceof Boolean)
+ {
+ writeBoolean((Boolean)o);
+ }
+ else if (o instanceof Byte)
+ {
+ writeByte((Byte)o);
+ }
+ else if (o instanceof Short)
+ {
+ writeShort((Short)o);
+ }
+ else if (o instanceof Character)
+ {
+ writeChar((Character)o);
+ }
+ else if (o instanceof Integer)
+ {
+ writeInt((Integer)o);
+ }
+ else if(o instanceof Long)
+ {
+ writeLong((Long)o);
+ }
+ else if(o instanceof Float)
+ {
+ writeFloat((Float) o);
+ }
+ else if(o instanceof Double)
+ {
+ writeDouble((Double) o);
+ }
+ else if(o instanceof String)
+ {
+ writeUTF((String) o);
+ }
+ else if(o instanceof byte[])
+ {
+ writeBytes((byte[])o);
+ }
+ else
+ {
+ throw new MessageFormatException("Value passed to BytesMessage.writeObject() must be of primitive type. Type passed was " + o.getClass().getName());
+ }
+ }
+
+ public void reset() throws JMSException
+ {
+ if(_bytesOut != null)
+ {
+ byte[] data = _bytesOut.toByteArray();
+ _dataIn = new Data(new Binary(data));
+ _dataAsInput = new DataInputStream(new ByteArrayInputStream(data));
+ _dataAsOutput = null;
+ _bytesOut = null;
+ }
+ else
+ {
+
+ final Binary dataBuffer = _dataIn.getValue();
+ _dataAsInput = new DataInputStream(new ByteArrayInputStream(dataBuffer.getArray(),dataBuffer.getArrayOffset(),dataBuffer.getLength()));
+
+ }
+ }
+
+ private JMSException handleInputException(final IOException e)
+ {
+ JMSException ex;
+ if(e instanceof EOFException)
+ {
+ ex = new MessageEOFException(e.getMessage());
+ }
+ else
+ {
+ ex = new MessageFormatException(e.getMessage());
+ }
+ ex.initCause(e);
+ ex.setLinkedException(e);
+ return ex;
+ }
+
+ private JMSException handleOutputException(final IOException e)
+ {
+ JMSException ex = new JMSException(e.getMessage());
+ ex.initCause(e);
+ ex.setLinkedException(e);
+ return ex;
+ }
+
+ @Override
+ public void clearBody() throws JMSException
+ {
+ super.clearBody();
+ _bytesOut = new ByteArrayOutputStream();
+ _dataAsOutput = new DataOutputStream(_bytesOut);
+ _dataAsInput = null;
+ _dataIn = null;
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+ sections.add(getDataSection());
+ sections.add(getFooter());
+ return sections;
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java
new file mode 100644
index 0000000000..d9e6dfe36d
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java
@@ -0,0 +1,173 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.jms.JMSException;
+import javax.jms.QueueConnection;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.TopicConnection;
+import javax.jms.TopicConnectionFactory;
+import org.apache.qpid.amqp_1_0.jms.ConnectionFactory;
+
+public class ConnectionFactoryImpl implements ConnectionFactory, TopicConnectionFactory, QueueConnectionFactory
+{
+ private String _host;
+ private int _port;
+ private String _username;
+ private String _password;
+ private String _clientId;
+ private String _remoteHost;
+ private boolean _ssl;
+
+
+ public ConnectionFactoryImpl(final String host,
+ final int port,
+ final String username,
+ final String password)
+ {
+ this(host,port,username,password,null,false);
+ }
+
+ public ConnectionFactoryImpl(final String host,
+ final int port,
+ final String username,
+ final String password,
+ final String clientId)
+ {
+ this(host,port,username,password,clientId,false);
+ }
+
+ public ConnectionFactoryImpl(final String host,
+ final int port,
+ final String username,
+ final String password,
+ final String clientId,
+ final boolean ssl)
+ {
+ this(host,port,username,password,clientId,null,ssl);
+ }
+
+ public ConnectionFactoryImpl(final String host,
+ final int port,
+ final String username,
+ final String password,
+ final String clientId,
+ final String remoteHost,
+ final boolean ssl)
+ {
+ _host = host;
+ _port = port;
+ _username = username;
+ _password = password;
+ _clientId = clientId;
+ _remoteHost = remoteHost;
+ _ssl = ssl;
+ }
+
+ public ConnectionImpl createConnection() throws JMSException
+ {
+ return new ConnectionImpl(_host, _port, _username, _password, _clientId, _remoteHost, _ssl);
+ }
+
+ public ConnectionImpl createConnection(final String username, final String password) throws JMSException
+ {
+ return new ConnectionImpl(_host, _port, username, password, _clientId, _remoteHost, _ssl);
+ }
+
+ public static ConnectionFactoryImpl createFromURL(final String urlString) throws MalformedURLException
+ {
+ URL url = new URL(urlString);
+ String host = url.getHost();
+ int port = url.getPort();
+ if(port == -1)
+ {
+ port = 5672;
+ }
+ String userInfo = url.getUserInfo();
+ String username = null;
+ String password = null;
+ String clientId = null;
+ String remoteHost = null;
+ boolean ssl = false;
+ if(userInfo != null)
+ {
+ String[] components = userInfo.split(":",2);
+ username = components[0];
+ if(components.length == 2)
+ {
+ password = components[1];
+ }
+ }
+ String query = url.getQuery();
+ if(query != null)
+ {
+ for(String param : query.split("&"))
+ {
+ String[] keyValuePair = param.split("=",2);
+ if(keyValuePair[0].equalsIgnoreCase("clientid"))
+ {
+ clientId = keyValuePair[1];
+ }
+ else if(keyValuePair[0].equalsIgnoreCase("ssl"))
+ {
+ ssl = Boolean.valueOf(keyValuePair[1]);
+ }
+ else if(keyValuePair[0].equalsIgnoreCase("remote-host"))
+ {
+ remoteHost = keyValuePair[1];
+ }
+ }
+ }
+
+ return new ConnectionFactoryImpl(host, port, username, password, clientId, remoteHost, ssl);
+
+ }
+
+ public QueueConnection createQueueConnection() throws JMSException
+ {
+ final ConnectionImpl connection = createConnection();
+ connection.setQueueConnection(true);
+ return connection;
+ }
+
+ public QueueConnection createQueueConnection(final String username, final String password) throws JMSException
+ {
+ final ConnectionImpl connection = createConnection(username, password);
+ connection.setQueueConnection(true);
+ return connection;
+ }
+
+ public TopicConnection createTopicConnection() throws JMSException
+ {
+ final ConnectionImpl connection = createConnection();
+ connection.setTopicConnection(true);
+ return connection;
+ }
+
+ public TopicConnection createTopicConnection(final String username, final String password) throws JMSException
+ {
+ final ConnectionImpl connection = createConnection(username, password);
+ connection.setTopicConnection(true);
+ return connection;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java
new file mode 100644
index 0000000000..587b12b51a
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionImpl.java
@@ -0,0 +1,329 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Connection;
+import org.apache.qpid.amqp_1_0.jms.ConnectionMetaData;
+import org.apache.qpid.amqp_1_0.jms.Session;
+import org.apache.qpid.amqp_1_0.transport.Container;
+
+import javax.jms.*;
+import javax.jms.IllegalStateException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class ConnectionImpl implements Connection, QueueConnection, TopicConnection
+{
+
+ private ConnectionMetaData _connectionMetaData;
+ private volatile ExceptionListener _exceptionListener;
+
+ private final List<SessionImpl> _sessions = new ArrayList<SessionImpl>();
+
+ private final Object _lock = new Object();
+
+ private org.apache.qpid.amqp_1_0.client.Connection _conn;
+ private boolean _isQueueConnection;
+ private boolean _isTopicConnection;
+ private final Collection<CloseTask> _closeTasks = new ArrayList<CloseTask>();
+
+
+ private static enum State
+ {
+ STOPPED,
+ STARTED,
+ CLOSED
+ }
+
+ private volatile State _state = State.STOPPED;
+
+ public ConnectionImpl(String host, int port, String username, String password, String clientId) throws JMSException
+ {
+ this(host,port,username,password,clientId,false);
+ }
+
+ public ConnectionImpl(String host, int port, String username, String password, String clientId, boolean ssl) throws JMSException
+ {
+ this(host,port,username,password,clientId,null,ssl);
+ }
+
+ public ConnectionImpl(String host, int port, String username, String password, String clientId, String remoteHost, boolean ssl) throws JMSException
+ {
+ Container container = clientId == null ? new Container() : new Container(clientId);
+ // TODO - authentication, containerId, clientId, ssl?, etc
+ try
+ {
+ _conn = new org.apache.qpid.amqp_1_0.client.Connection(host, port, username, password, container, remoteHost, ssl);
+ // TODO - retrieve negotiated AMQP version
+ _connectionMetaData = new ConnectionMetaDataImpl(1,0,0);
+ }
+ catch (org.apache.qpid.amqp_1_0.client.Connection.ConnectionException e)
+ {
+ JMSException jmsEx = new JMSException(e.getMessage());
+ jmsEx.setLinkedException(e);
+ jmsEx.initCause(e);
+ throw jmsEx;
+ }
+ }
+
+ public SessionImpl createSession(final boolean transacted, final int acknowledgeMode) throws JMSException
+ {
+ Session.AcknowledgeMode ackMode;
+
+ try
+ {
+ ackMode = transacted ? Session.AcknowledgeMode.SESSION_TRANSACTED
+ : Session.AcknowledgeMode.values()[acknowledgeMode];
+ }
+ catch (IndexOutOfBoundsException e)
+ {
+ JMSException jmsEx = new JMSException("Unknown acknowledgement mode " + acknowledgeMode);
+ jmsEx.setLinkedException(e);
+ jmsEx.initCause(e);
+ throw jmsEx;
+ }
+
+ return createSession(ackMode);
+ }
+
+ public SessionImpl createSession(final Session.AcknowledgeMode acknowledgeMode) throws JMSException
+ {
+ synchronized(_lock)
+ {
+ if(_state == State.CLOSED)
+ {
+ throw new IllegalStateException("Cannot create a session on a closed connection");
+ }
+
+ SessionImpl session = new SessionImpl(this, acknowledgeMode);
+ session.setQueueSession(_isQueueConnection);
+ session.setTopicSession(_isTopicConnection);
+ _sessions.add(session);
+
+ return session;
+ }
+
+ }
+
+ public String getClientID() throws JMSException
+ {
+ checkClosed();
+ return _conn.getEndpoint().getContainer().getId();
+ }
+
+ public void setClientID(final String s) throws JMSException
+ {
+ throw new IllegalStateException("Cannot set client-id to \""
+ + s
+ + "\"; client-id must be set on connection creation");
+ }
+
+ public ConnectionMetaData getMetaData() throws JMSException
+ {
+ checkClosed();
+ return _connectionMetaData;
+ }
+
+ public ExceptionListener getExceptionListener() throws JMSException
+ {
+ checkClosed();
+ return _exceptionListener;
+ }
+
+ public void setExceptionListener(final ExceptionListener exceptionListener) throws JMSException
+ {
+ checkClosed();
+ _exceptionListener = exceptionListener;
+ }
+
+ public void start() throws JMSException
+ {
+ synchronized(_lock)
+ {
+ checkClosed();
+ if(_state == State.STOPPED)
+ {
+ // TODO
+
+ _state = State.STARTED;
+
+ for(SessionImpl session : _sessions)
+ {
+ session.start();
+ }
+
+ }
+
+ _lock.notifyAll();
+ }
+
+ }
+
+ public void stop() throws JMSException
+ {
+ synchronized(_lock)
+ {
+ switch(_state)
+ {
+ case STARTED:
+ for(SessionImpl session : _sessions)
+ {
+ session.stop();
+ }
+ _state = State.STOPPED;
+ break;
+ case CLOSED:
+ throw new javax.jms.IllegalStateException("Closed");
+ }
+
+ _lock.notifyAll();
+ }
+ }
+
+
+ static interface CloseTask
+ {
+ public void onClose() throws JMSException;
+ }
+
+ void addOnCloseTask(CloseTask task)
+ {
+ synchronized (_lock)
+ {
+ _closeTasks.add(task);
+ }
+ }
+
+
+ void removeOnCloseTask(CloseTask task)
+ {
+ synchronized (_lock)
+ {
+ _closeTasks.remove(task);
+ }
+ }
+
+ public void close() throws JMSException
+ {
+ synchronized(_lock)
+ {
+ if(_state != State.CLOSED)
+ {
+ stop();
+ for(SessionImpl session : _sessions)
+ {
+ session.close();
+ }
+ for(CloseTask task : _closeTasks)
+ {
+ task.onClose();
+ }
+ _conn.close();
+ _state = State.CLOSED;
+ }
+
+ _lock.notifyAll();
+ }
+ }
+
+ private void checkClosed() throws IllegalStateException
+ {
+ if(_state == State.CLOSED)
+ throw new IllegalStateException("Closed");
+ }
+
+ public ConnectionConsumer createConnectionConsumer(final Destination destination,
+ final String s,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ checkClosed();
+ return null; //TODO
+ }
+
+ public TopicSession createTopicSession(final boolean transacted, final int acknowledgeMode) throws JMSException
+ {
+ checkClosed();
+ SessionImpl session = createSession(transacted, acknowledgeMode);
+ session.setTopicSession(true);
+ return session;
+ }
+
+ public ConnectionConsumer createConnectionConsumer(final Topic topic,
+ final String s,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ checkClosed();
+ return null; //TODO
+ }
+
+ public ConnectionConsumer createDurableConnectionConsumer(final Topic topic,
+ final String s,
+ final String s1,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ checkClosed();
+ return null; //TODO
+ }
+
+ public QueueSession createQueueSession(final boolean transacted, final int acknowledgeMode) throws JMSException
+ {
+ checkClosed();
+ SessionImpl session = createSession(transacted, acknowledgeMode);
+ session.setQueueSession(true);
+ return session;
+ }
+
+ public ConnectionConsumer createConnectionConsumer(final Queue queue,
+ final String s,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ checkClosed();
+ return null; //TODO
+ }
+
+
+
+ protected org.apache.qpid.amqp_1_0.client.Connection getClientConnection()
+ {
+ return _conn;
+ }
+
+ public boolean isStarted()
+ {
+ synchronized (_lock)
+ {
+ return _state == State.STARTED;
+ }
+ }
+
+ void setQueueConnection(final boolean queueConnection)
+ {
+ _isQueueConnection = queueConnection;
+ }
+
+ void setTopicConnection(final boolean topicConnection)
+ {
+ _isTopicConnection = topicConnection;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionMetaDataImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionMetaDataImpl.java
new file mode 100644
index 0000000000..8159c7116b
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionMetaDataImpl.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.ConnectionMetaData;
+
+import javax.jms.JMSException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+
+public class ConnectionMetaDataImpl implements ConnectionMetaData
+{
+ private static final int JMS_MAJOR_VERSION = 1;
+ private static final int JMS_MINOR_VERSION = 1;
+
+ private static final int PROVIDER_MAJOR_VERSION = 1;
+ private static final int PROVIDER_MINOR_VERSION = 0;
+
+
+ private final int _amqpMajorVersion;
+ private final int _amqpMinorVersion;
+ private final int _amqpRevisionVersion;
+ private static final Collection<String> _jmsxProperties = Arrays.asList("JMSXGroupID", "JMSXGroupSeq");
+
+ public ConnectionMetaDataImpl(final int amqpMajorVersion, final int amqpMinorVersion, final int amqpRevisionVersion)
+ {
+ _amqpMajorVersion = amqpMajorVersion;
+ _amqpMinorVersion = amqpMinorVersion;
+ _amqpRevisionVersion = amqpRevisionVersion;
+ }
+
+ public String getJMSVersion() throws JMSException
+ {
+ return getJMSMajorVersion() + "." + getJMSMinorVersion();
+ }
+
+ public int getJMSMajorVersion() throws JMSException
+ {
+ return JMS_MAJOR_VERSION;
+ }
+
+ public int getJMSMinorVersion() throws JMSException
+ {
+ return JMS_MINOR_VERSION;
+ }
+
+ public String getJMSProviderName() throws JMSException
+ {
+ return "AMQP.ORG";
+ }
+
+ public String getProviderVersion() throws JMSException
+ {
+ return getProviderMajorVersion() + "." + getProviderMinorVersion();
+ }
+
+ public int getProviderMajorVersion() throws JMSException
+ {
+ return PROVIDER_MAJOR_VERSION;
+ }
+
+ public int getProviderMinorVersion() throws JMSException
+ {
+ return PROVIDER_MINOR_VERSION;
+ }
+
+ public Enumeration getJMSXPropertyNames() throws JMSException
+ {
+
+ return Collections.enumeration(_jmsxProperties);
+ }
+
+ public int getAMQPMajorVersion()
+ {
+ return _amqpMajorVersion;
+ }
+
+ public int getAMQPMinorVersion()
+ {
+ return _amqpMinorVersion;
+ }
+
+ public int getAMQPRevisionVersion()
+ {
+ return _amqpRevisionVersion;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java
new file mode 100644
index 0000000000..b4ca2c6302
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Destination;
+import org.apache.qpid.amqp_1_0.jms.Queue;
+import org.apache.qpid.amqp_1_0.jms.Topic;
+
+import javax.jms.JMSException;
+import java.util.WeakHashMap;
+
+public class DestinationImpl implements Destination, Queue, Topic
+{
+ private static final WeakHashMap<String, DestinationImpl> DESTINATION_CACHE =
+ new WeakHashMap<String, DestinationImpl>();
+
+ private final String _address;
+
+ protected DestinationImpl(String address)
+ {
+ _address = address;
+ }
+
+ public String getAddress()
+ {
+ return _address;
+ }
+
+ public static DestinationImpl valueOf(String address)
+ {
+ return address == null ? null : createDestination(address);
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _address.hashCode();
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ return obj != null
+ && obj.getClass() == getClass()
+ && _address.equals(((DestinationImpl)obj)._address);
+ }
+
+ public static synchronized DestinationImpl createDestination(final String address)
+ {
+ DestinationImpl destination = DESTINATION_CACHE.get(address);
+ if(destination == null)
+ {
+ destination = new DestinationImpl(address);
+ DESTINATION_CACHE.put(address, destination);
+ }
+ return destination;
+ }
+
+ public String getQueueName() throws JMSException
+ {
+ return getAddress();
+ }
+
+ public String getTopicName() throws JMSException
+ {
+ return getAddress();
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MapMessageImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MapMessageImpl.java
new file mode 100644
index 0000000000..47811a0f5a
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MapMessageImpl.java
@@ -0,0 +1,444 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.MapMessage;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.JMSException;
+import javax.jms.MessageFormatException;
+import java.util.*;
+
+public class MapMessageImpl extends MessageImpl implements MapMessage
+{
+ private Map _map;
+
+ public MapMessageImpl(Header header, MessageAnnotations messageAnnotations, Properties properties, ApplicationProperties appProperties, Map map,
+ Footer footer,
+ SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ _map = map;
+ }
+
+ MapMessageImpl(final SessionImpl session)
+ {
+ super(new Header(), new MessageAnnotations(new HashMap()),
+ new Properties(), new ApplicationProperties(new HashMap()), new Footer(Collections.EMPTY_MAP),
+ session);
+ _map = new HashMap();
+ }
+
+ public boolean getBoolean(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Boolean)
+ {
+ return ((Boolean) value).booleanValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Boolean.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to boolean.");
+ }
+ }
+
+ public byte getByte(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Byte)
+ {
+ return ((Byte) value).byteValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Byte.valueOf((String) value).byteValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to byte.");
+ } }
+
+ public short getShort(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Short)
+ {
+ return ((Short) value).shortValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).shortValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Short.valueOf((String) value).shortValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to short.");
+ } }
+
+ public char getChar(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (!itemExists(name))
+ {
+ throw new MessageFormatException("Property " + name + " not present");
+ }
+ else if (value instanceof Character)
+ {
+ return ((Character) value).charValue();
+ }
+ else if (value == null)
+ {
+ throw new NullPointerException("Property " + name + " has null value and therefore cannot "
+ + "be converted to char.");
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to boolan.");
+ } }
+
+ public int getInt(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Integer)
+ {
+ return ((Integer) value).intValue();
+ }
+ else if (value instanceof Short)
+ {
+ return ((Short) value).intValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).intValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Integer.valueOf((String) value).intValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to int.");
+ }
+ }
+
+ public long getLong(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Long)
+ {
+ return ((Long) value).longValue();
+ }
+ else if (value instanceof Integer)
+ {
+ return ((Integer) value).longValue();
+ }
+
+ if (value instanceof Short)
+ {
+ return ((Short) value).longValue();
+ }
+
+ if (value instanceof Byte)
+ {
+ return ((Byte) value).longValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Long.valueOf((String) value).longValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to long.");
+ }
+ }
+
+ public float getFloat(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Float)
+ {
+ return ((Float) value).floatValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Float.valueOf((String) value).floatValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to float.");
+ }
+ }
+
+ public double getDouble(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (value instanceof Double)
+ {
+ return ((Double) value).doubleValue();
+ }
+ else if (value instanceof Float)
+ {
+ return ((Float) value).doubleValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Double.valueOf((String) value).doubleValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to double.");
+ }
+ }
+
+ public String getString(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if ((value instanceof String) || (value == null))
+ {
+ return (String) value;
+ }
+ else if (value instanceof byte[] || value instanceof Binary)
+ {
+ throw new MessageFormatException("Property " + name + " of type byte[] " + "cannot be converted to String.");
+ }
+ else
+ {
+ return value.toString();
+ }
+ }
+
+ public byte[] getBytes(String name) throws JMSException
+ {
+ Object value = get(name);
+
+ if (!itemExists(name))
+ {
+ throw new MessageFormatException("Property " + name + " not present");
+ }
+ else if ((value instanceof byte[]) || (value == null))
+ {
+ return (byte[]) value;
+ }
+ else if(value instanceof Binary)
+ {
+ return ((Binary)value).getArray();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to byte[].");
+ } }
+
+ public Object getObject(String s) throws JMSException
+ {
+ Object val = get(s);
+ return val instanceof Binary ? ((Binary)val).getArray() : val;
+ }
+
+ public Enumeration getMapNames() throws JMSException
+ {
+ return Collections.enumeration(keySet());
+ }
+
+ public void setBoolean(String name, boolean val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setByte(String name, byte val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setShort(String name, short val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setChar(String name, char val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setInt(String name, int val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setLong(String name, long val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setFloat(String name, float val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setDouble(String name, double val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setString(String name, String val) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ put(name, val);
+ }
+
+ public void setBytes(String name, byte[] val) throws JMSException
+ {
+ setBytes(name, val, 0, val == null ? 0 : val.length);
+ }
+
+ public void setBytes(String name, byte[] bytes, int offset, int length) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ byte[] val;
+
+ if(bytes == null)
+ {
+ val = null;
+ }
+ else
+ {
+ val = new byte[length];
+ System.arraycopy(bytes,offset,val,0,length);
+ }
+
+ put(name, new Binary(val));
+ }
+
+ public void setObject(String name, Object value) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(name);
+ if ((value instanceof Boolean) || (value instanceof Byte) || (value instanceof Short) || (value instanceof Integer)
+ || (value instanceof Long) || (value instanceof Character) || (value instanceof Float)
+ || (value instanceof Double) || (value instanceof String) || (value instanceof byte[]) || (value == null))
+ {
+ put(name, value);
+ }
+ else
+ {
+ throw new MessageFormatException("Cannot set property " + name + " to value " + value + "of type "
+ + value.getClass().getName() + ".");
+ } }
+
+ public boolean itemExists(String s)
+ {
+ return _map.containsKey(s);
+ }
+
+ public Object get(final Object key)
+ {
+ return _map.get(key);
+ }
+
+ public Object put(final Object key, final Object val)
+ {
+ return _map.put(key, val);
+ }
+
+ public boolean itemExists(final Object key)
+ {
+ return _map.containsKey(key);
+ }
+
+ public Set<Object> keySet()
+ {
+ return _map.keySet();
+ }
+
+ @Override
+ public void clearBody() throws JMSException
+ {
+ super.clearBody();
+ _map.clear();
+ }
+
+ private void checkPropertyName(String propName)
+ {
+ if ((propName == null) || propName.equals(""))
+ {
+ throw new IllegalArgumentException("Property name cannot be null, or the empty String.");
+ }
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+ sections.add(new AmqpValue(_map));
+ sections.add(getFooter());
+ return sections;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java
new file mode 100644
index 0000000000..e0402cd0a7
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageConsumerImpl.java
@@ -0,0 +1,447 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.AcknowledgeMode;
+import org.apache.qpid.amqp_1_0.client.Message;
+import org.apache.qpid.amqp_1_0.client.Receiver;
+import org.apache.qpid.amqp_1_0.client.Transaction;
+import org.apache.qpid.amqp_1_0.jms.MessageConsumer;
+import org.apache.qpid.amqp_1_0.jms.QueueReceiver;
+import org.apache.qpid.amqp_1_0.jms.Queue;
+import org.apache.qpid.amqp_1_0.jms.Session;
+import org.apache.qpid.amqp_1_0.jms.TemporaryDestination;
+import org.apache.qpid.amqp_1_0.jms.Topic;
+import org.apache.qpid.amqp_1_0.jms.TopicSubscriber;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.Modified;
+import org.apache.qpid.amqp_1_0.type.messaging.NoLocalFilter;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+
+import javax.jms.Destination;
+import javax.jms.IllegalStateException;
+import javax.jms.InvalidDestinationException;
+import javax.jms.InvalidSelectorException;
+import javax.jms.JMSException;
+import javax.jms.MessageListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MessageConsumerImpl implements MessageConsumer, QueueReceiver, TopicSubscriber
+{
+ private static final Symbol NO_LOCAL_FILTER_NAME = Symbol.valueOf("no-local");
+ private static final Symbol JMS_SELECTOR_FILTER_NAME = Symbol.valueOf("jms-selector");
+ private String _selector;
+ private boolean _noLocal;
+ private DestinationImpl _destination;
+ private SessionImpl _session;
+ private Receiver _receiver;
+ private Binary _lastUnackedMessage;
+ MessageListener _messageListener;
+
+ private boolean _isQueueConsumer;
+ private boolean _isTopicSubscriber;
+
+ private boolean _closed = false;
+ private String _linkName;
+ private boolean _durable;
+ private Collection<Binary> _txnMsgs = Collections.synchronizedCollection(new ArrayList<Binary>());
+ private Binary _lastTxnUpdate;
+ private final List<Message> _recoverReplayMessages = new ArrayList<Message>();
+ private final List<Message> _replaymessages = new ArrayList<Message>();
+
+ MessageConsumerImpl(final Destination destination,
+ final SessionImpl session,
+ final String selector,
+ final boolean noLocal) throws JMSException
+ {
+ this(destination,session,selector,noLocal,null,false);
+ }
+
+ MessageConsumerImpl(final Destination destination,
+ final SessionImpl session,
+ final String selector,
+ final boolean noLocal,
+ final String linkName,
+ final boolean durable) throws JMSException
+ {
+ _selector = selector;
+ _noLocal = noLocal;
+ _linkName = linkName;
+ _durable = durable;
+ if(destination instanceof DestinationImpl)
+ {
+ _destination = (DestinationImpl) destination;
+ if(destination instanceof javax.jms.Queue)
+ {
+ _isQueueConsumer = true;
+ }
+ else if(destination instanceof javax.jms.Topic)
+ {
+ _isTopicSubscriber = true;
+ }
+ if(destination instanceof TemporaryDestination)
+ {
+ ((TemporaryDestination)destination).addConsumer(this);
+ }
+ }
+ else
+ {
+ throw new InvalidDestinationException("Invalid destination class " + destination.getClass().getName());
+ }
+ _session = session;
+
+ _receiver = createClientReceiver();
+
+
+ }
+
+ protected Receiver createClientReceiver() throws JMSException
+ {
+ try
+ {
+ return _session.getClientSession(). createReceiver(_destination.getAddress(), AcknowledgeMode.ALO,
+ _linkName, _durable, getFilters(), null);
+ }
+ catch (AmqpErrorException e)
+ {
+ Error error = e.getError();
+ if(AmqpError.INVALID_FIELD.equals(error.getCondition()))
+ {
+ throw new InvalidSelectorException(e.getMessage());
+ }
+ else
+ {
+ throw new JMSException(e.getMessage(), error.getCondition().getValue().toString());
+
+ }
+ }
+ }
+
+ Map<Symbol, Filter> getFilters()
+ {
+ if(_selector == null || _selector.trim().equals(""))
+ {
+ if(_noLocal)
+ {
+ return Collections.singletonMap(NO_LOCAL_FILTER_NAME, (Filter) NoLocalFilter.INSTANCE);
+ }
+ else
+ {
+ return null;
+
+ }
+ }
+ else if(_noLocal)
+ {
+ Map<Symbol, Filter> filters = new HashMap<Symbol, Filter>();
+ filters.put(NO_LOCAL_FILTER_NAME, NoLocalFilter.INSTANCE);
+ filters.put(JMS_SELECTOR_FILTER_NAME, new JMSSelectorFilter(_selector));
+ return filters;
+ }
+ else
+ {
+ return Collections.singletonMap(JMS_SELECTOR_FILTER_NAME, (Filter)new JMSSelectorFilter(_selector));
+ }
+
+
+ }
+
+ public String getMessageSelector() throws JMSException
+ {
+ checkClosed();
+ return _selector;
+ }
+
+ public MessageListener getMessageListener() throws IllegalStateException
+ {
+ checkClosed();
+ return _messageListener;
+ }
+
+ public void setMessageListener(final MessageListener messageListener) throws JMSException
+ {
+ checkClosed();
+ _messageListener = messageListener;
+ _session.messageListenerSet( this );
+ _receiver.setMessageArrivalListener(new Receiver.MessageArrivalListener()
+ {
+
+ public void messageArrived(final Receiver receiver)
+ {
+ _session.messageArrived(MessageConsumerImpl.this);
+ }
+ });
+ }
+
+ public MessageImpl receive() throws JMSException
+ {
+ checkClosed();
+ return receiveImpl(-1L);
+ }
+
+ public MessageImpl receive(final long timeout) throws JMSException
+ {
+ checkClosed();
+ // TODO - validate timeout > 0
+
+ return receiveImpl(timeout);
+ }
+
+ public MessageImpl receiveNoWait() throws JMSException
+ {
+ checkClosed();
+ return receiveImpl(0L);
+ }
+
+ private MessageImpl receiveImpl(long timeout) throws IllegalStateException
+ {
+ org.apache.qpid.amqp_1_0.client.Message msg;
+ boolean redelivery;
+ if(_replaymessages.isEmpty())
+ {
+ msg = receive0(timeout);
+ redelivery = false;
+ }
+ else
+ {
+ msg = _replaymessages.remove(0);
+ redelivery = true;
+ }
+
+ if(msg != null)
+ {
+ preReceiveAction(msg);
+ }
+ return createJMSMessage(msg, redelivery);
+ }
+
+ Message receive0(final long timeout)
+ {
+ Message message = _receiver.receive(timeout);
+ if(_session.getAckModeEnum() == Session.AcknowledgeMode.CLIENT_ACKNOWLEDGE)
+ {
+ _recoverReplayMessages.add(message);
+ }
+ return message;
+ }
+
+
+ void acknowledge(final org.apache.qpid.amqp_1_0.client.Message msg)
+ {
+ _receiver.acknowledge(msg.getDeliveryTag(), _session.getTxn());
+ }
+
+ MessageImpl createJMSMessage(final Message msg, boolean redelivery)
+ {
+ if(msg != null)
+ {
+ MessageFactory factory = _session.getMessageFactory();
+ final MessageImpl message = factory.createMessage(_destination, msg);
+ message.setFromQueue(_isQueueConsumer);
+ message.setFromTopic(_isTopicSubscriber);
+ if(redelivery)
+ {
+ if(!message.getJMSRedelivered())
+ {
+ message.setJMSRedelivered(true);
+ }
+ }
+
+ return message;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public void close() throws JMSException
+ {
+ if(!_closed)
+ {
+ _closed = true;
+
+ closeUnderlyingReceiver(_receiver);
+
+ if(_destination instanceof TemporaryDestination)
+ {
+ ((TemporaryDestination)_destination).removeConsumer(this);
+ }
+ }
+ }
+
+ protected void closeUnderlyingReceiver(Receiver receiver)
+ {
+ receiver.close();
+ }
+
+ private void checkClosed() throws IllegalStateException
+ {
+ if(_closed)
+ {
+ throw new javax.jms.IllegalStateException("Closed");
+ }
+ }
+
+ void setLastUnackedMessage(final Binary deliveryTag)
+ {
+ _lastUnackedMessage = deliveryTag;
+ }
+
+ void preReceiveAction(final org.apache.qpid.amqp_1_0.client.Message msg) throws IllegalStateException
+ {
+ final int acknowledgeMode = _session.getAcknowledgeMode();
+
+ if(acknowledgeMode == Session.AUTO_ACKNOWLEDGE
+ || acknowledgeMode == Session.DUPS_OK_ACKNOWLEDGE
+ || acknowledgeMode == Session.SESSION_TRANSACTED)
+ {
+ acknowledge(msg);
+ if(acknowledgeMode == Session.SESSION_TRANSACTED)
+ {
+ _txnMsgs.add(msg.getDeliveryTag());
+ }
+ }
+ else if(acknowledgeMode == Session.CLIENT_ACKNOWLEDGE)
+ {
+ setLastUnackedMessage(msg.getDeliveryTag());
+ }
+ }
+
+ void acknowledgeAll()
+ {
+ if(_lastUnackedMessage != null)
+ {
+ Transaction txn = _session.getTxn();
+ _receiver.acknowledgeAll(_lastUnackedMessage, txn, null);
+ if(txn != null)
+ {
+ _lastTxnUpdate = _lastUnackedMessage;
+ }
+ _lastUnackedMessage = null;
+
+ }
+ _recoverReplayMessages.clear();
+ if(!_replaymessages.isEmpty())
+ {
+ _recoverReplayMessages.addAll(_replaymessages);
+ }
+ }
+
+ void postRollback()
+ {
+ if(_lastTxnUpdate != null)
+ {
+ final Modified outcome = new Modified();
+ outcome.setDeliveryFailed(true);
+ _receiver.updateAll(outcome, _lastTxnUpdate);
+ _lastTxnUpdate = null;
+ }
+ for(Binary tag : _txnMsgs)
+ {
+ _receiver.modified(tag);
+ }
+ _txnMsgs.clear();
+ }
+
+ void postCommit()
+ {
+ _lastTxnUpdate = null;
+ _txnMsgs.clear();
+ }
+
+ public DestinationImpl getDestination() throws IllegalStateException
+ {
+ checkClosed();
+ return _destination;
+ }
+
+
+ public SessionImpl getSession() throws IllegalStateException
+ {
+ checkClosed();
+ return _session;
+ }
+
+ public boolean getNoLocal() throws IllegalStateException
+ {
+ checkClosed();
+ return _noLocal;
+ }
+
+ public void start()
+ {
+ _receiver.setCredit(UnsignedInteger.valueOf(100), true);
+ }
+
+ public Queue getQueue() throws JMSException
+ {
+ return (Queue) getDestination();
+ }
+
+ public Topic getTopic() throws JMSException
+ {
+ return (Topic) getDestination();
+ }
+
+ void setQueueConsumer(final boolean queueConsumer)
+ {
+ _isQueueConsumer = queueConsumer;
+ }
+
+ void setTopicSubscriber(final boolean topicSubscriber)
+ {
+ _isTopicSubscriber = topicSubscriber;
+ }
+
+ String getLinkName()
+ {
+ return _linkName;
+ }
+
+ boolean isDurable()
+ {
+ return _durable;
+ }
+
+ void doRecover()
+ {
+ _replaymessages.clear();
+ if(!_recoverReplayMessages.isEmpty())
+ {
+ _replaymessages.addAll(_recoverReplayMessages);
+ for(Message msg : _replaymessages)
+ {
+ _session.messageArrived(this);
+ }
+ }
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageFactory.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageFactory.java
new file mode 100644
index 0000000000..216107e53e
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageFactory.java
@@ -0,0 +1,191 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.Message;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+import java.util.*;
+
+class MessageFactory
+{
+ private final SessionImpl _session;
+
+
+ MessageFactory(final SessionImpl session)
+ {
+ _session = session;
+ }
+
+ public MessageImpl createMessage(final DestinationImpl destination, final Message msg)
+ {
+ MessageImpl message;
+ List<Section> payload = msg.getPayload();
+ Header header = null;
+ MessageAnnotations messageAnnotations = null;
+
+ Properties properties = null;
+ ApplicationProperties appProperties = null;
+ Footer footer;
+
+ Iterator<Section> iter = payload.iterator();
+ List<Section> body = new ArrayList<Section>();
+
+ Section section = iter.hasNext() ? iter.next() : null;
+
+ if(section instanceof Header)
+ {
+ header = (Header) section;
+ section = iter.hasNext() ? iter.next() : null;
+ }
+
+ if(section instanceof MessageAnnotations)
+ {
+ messageAnnotations = (MessageAnnotations) section;
+ section = iter.hasNext() ? iter.next() : null;
+ }
+
+ if(section instanceof Properties)
+ {
+ properties = (Properties) section;
+ section = iter.hasNext() ? iter.next() : null;
+ }
+
+ if(section instanceof ApplicationProperties)
+ {
+ appProperties = (ApplicationProperties) section;
+ section = iter.hasNext() ? iter.next() : null;
+ }
+
+ while(section != null && !(section instanceof Footer))
+ {
+ body.add(section);
+ section = iter.hasNext() ? iter.next() : null;
+ }
+
+ footer = (Footer) section;
+
+ if(body.size() == 1)
+ {
+ Section bodySection = body.get(0);
+ if(bodySection instanceof AmqpValue && ((AmqpValue)bodySection).getValue() instanceof Map)
+ {
+ message = new MapMessageImpl(header, messageAnnotations, properties, appProperties, (Map) ((AmqpValue)bodySection).getValue(), footer, _session);
+ }
+ else if(bodySection instanceof AmqpValue && ((AmqpValue)bodySection).getValue() instanceof List)
+ {
+ message = new StreamMessageImpl(header, messageAnnotations, properties, appProperties,
+ (List) ((AmqpValue)bodySection).getValue(), footer, _session);
+ }
+ else if(bodySection instanceof AmqpValue && ((AmqpValue)bodySection).getValue() instanceof String)
+ {
+ message = new TextMessageImpl(header, messageAnnotations, properties, appProperties,
+ (String) ((AmqpValue)bodySection).getValue(), footer, _session);
+ }
+ else if(bodySection instanceof AmqpValue && ((AmqpValue)bodySection).getValue() instanceof Binary)
+ {
+
+ Binary value = (Binary) ((AmqpValue) bodySection).getValue();
+ message = new BytesMessageImpl(header, messageAnnotations, properties, appProperties,
+ new Data(value), footer, _session);
+ }
+ else if(bodySection instanceof Data)
+ {
+ if(properties != null && ObjectMessageImpl.CONTENT_TYPE.equals(properties.getContentType()))
+ {
+
+
+ message = new ObjectMessageImpl(header, messageAnnotations, properties, appProperties,
+ (Data) bodySection,
+ footer,
+ _session);
+ }
+ else
+ {
+ message = new BytesMessageImpl(header, messageAnnotations, properties, appProperties, (Data) bodySection, footer, _session);
+ }
+ }
+ else if(bodySection instanceof AmqpSequence)
+ {
+ message = new StreamMessageImpl(header, messageAnnotations, properties, appProperties, ((AmqpSequence) bodySection).getValue(), footer, _session);
+ }
+
+ /*else if(bodySection instanceof AmqpDataSection)
+ {
+ AmqpDataSection dataSection = (AmqpDataSection) bodySection;
+
+ List<Object> data = new ArrayList<Object>();
+
+ ListIterator<Object> dataIter = dataSection.iterator();
+
+ while(dataIter.hasNext())
+ {
+ data.add(dataIter.next());
+ }
+
+ if(data.size() == 1)
+ {
+ final Object obj = data.get(0);
+ if( obj instanceof String)
+ {
+ message = new TextMessageImpl(header,properties,appProperties,(String) data.get(0),footer, _session);
+ }
+ else if(obj instanceof JavaSerializable)
+ {
+ // TODO - ObjectMessage
+ message = new AmqpMessageImpl(header,properties,appProperties,body,footer, _session);
+ }
+ else if(obj instanceof Serializable)
+ {
+ message = new ObjectMessageImpl(header,properties,footer,appProperties,(Serializable)obj, _session);
+ }
+ else
+ {
+ message = new AmqpMessageImpl(header,properties,appProperties,body,footer, _session);
+ }
+ }
+ else
+ {
+ // not a text message
+ message = new AmqpMessageImpl(header,properties,appProperties,body,footer, _session);
+ }
+ }*/
+ else
+ {
+ message = new AmqpMessageImpl(header,messageAnnotations, properties,appProperties,body,footer, _session);
+ }
+ }
+ else
+ {
+ message = new AmqpMessageImpl(header,messageAnnotations, properties,appProperties,body,footer, _session);
+ }
+
+ message.setReadOnly();
+
+ return message;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java
new file mode 100644
index 0000000000..f1056b94fd
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java
@@ -0,0 +1,1209 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Message;
+import org.apache.qpid.amqp_1_0.messaging.MessageAttributes;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.MessageFormatException;
+import javax.jms.MessageNotReadableException;
+import javax.jms.MessageNotWriteableException;
+import java.nio.charset.Charset;
+import java.util.*;
+
+public abstract class MessageImpl implements Message
+{
+ static final Set<Class> _supportedClasses =
+ new HashSet<Class>(Arrays.asList(Boolean.class, Byte.class, Short.class, Integer.class, Long.class,
+ Float.class, Double.class, Character.class, String.class, byte[].class));
+ private static final Symbol JMS_TYPE = Symbol.valueOf("x-opt-jms-type");
+
+ private Header _header;
+ private Properties _properties;
+ private ApplicationProperties _applicationProperties;
+ private Footer _footer;
+ public static final Charset UTF_8_CHARSET = Charset.forName("UTF-8");
+ private SessionImpl _sessionImpl;
+ private boolean _readOnly;
+ private MessageAnnotations _messageAnnotations;
+
+ private boolean _isFromQueue;
+ private boolean _isFromTopic;
+ private long _expiration;
+
+ protected MessageImpl(Header header,
+ MessageAnnotations messageAnnotations,
+ Properties properties,
+ ApplicationProperties appProperties,
+ Footer footer,
+ SessionImpl session)
+ {
+ _header = header == null ? new Header() : header;
+ _properties = properties == null ? new Properties() : properties;
+ _messageAnnotations = messageAnnotations == null ? new MessageAnnotations(new HashMap()) : messageAnnotations;
+ _footer = footer == null ? new Footer(Collections.EMPTY_MAP) : footer;
+ _applicationProperties = appProperties == null ? new ApplicationProperties(new HashMap()) : appProperties;
+ _sessionImpl = session;
+ }
+
+ public String getJMSMessageID() throws JMSException
+ {
+ Object messageId = getMessageId();
+
+ return messageId == null ? null : "ID:"+messageId.toString();
+ }
+
+ public void setJMSMessageID(String messageId) throws InvalidJMSMEssageIdException
+ {
+ if(messageId == null)
+ {
+ setMessageId(null);
+ }
+ else if(messageId.startsWith("ID:"))
+ {
+ setMessageId(messageId.substring(3));
+ }
+ else
+ {
+ throw new InvalidJMSMEssageIdException(messageId);
+ }
+ }
+
+ public long getJMSTimestamp() throws JMSException
+ {
+ Date transmitTime = getTransmitTime();
+ return transmitTime == null ? 0 : transmitTime.getTime();
+ }
+
+ public void setJMSTimestamp(long l) throws JMSException
+ {
+ setTransmitTime(new Date(l));
+ if(_expiration != 0l)
+ {
+ setTtl(UnsignedInteger.valueOf(_expiration-getTransmitTime().getTime()));
+ }
+ }
+
+ public byte[] getJMSCorrelationIDAsBytes() throws JMSException
+ {
+
+ Object o = getCorrelationId();
+ if(o instanceof Binary)
+ {
+ Binary correlationIdBinary = (Binary) o;
+ byte[] correlationId = new byte[correlationIdBinary.getLength()];
+ correlationIdBinary.asByteBuffer().get(correlationId);
+ return correlationId;
+ }
+ else
+ {
+ return o == null ? null : o.toString().getBytes();
+ }
+
+ }
+
+ public void setJMSCorrelationIDAsBytes(byte[] correlationId) throws JMSException
+ {
+ if(correlationId == null)
+ {
+ setCorrelationId(null);
+ }
+ else
+ {
+ byte[] dup = new byte[correlationId.length];
+ System.arraycopy(correlationId,0,dup,0,correlationId.length);
+ setCorrelationId(new Binary(dup));
+ }
+ }
+
+ public void setJMSCorrelationID(String s) throws JMSException
+ {
+ getProperties().setCorrelationId(s);
+ }
+
+ public String getJMSCorrelationID() throws JMSException
+ {
+ Object o = getProperties().getCorrelationId();
+ if(o instanceof Binary)
+ {
+ Binary id = (Binary) o;
+ return new String(id.getArray(), id.getArrayOffset(), id.getLength());
+ }
+ else
+ {
+ return o == null ? null : o.toString();
+ }
+ }
+
+ public DestinationImpl getJMSReplyTo() throws JMSException
+ {
+ return DestinationImpl.valueOf(getReplyTo());
+ }
+
+ public void setJMSReplyTo(Destination destination) throws NonAMQPDestinationException
+ {
+ if(destination == null)
+ {
+ setReplyTo(null);
+ }
+ else if (destination instanceof org.apache.qpid.amqp_1_0.jms.Destination)
+ {
+ setReplyTo(((org.apache.qpid.amqp_1_0.jms.Destination)destination).getAddress());
+ }
+ else
+ {
+ throw new NonAMQPDestinationException(destination);
+ }
+ }
+
+ public DestinationImpl getJMSDestination() throws JMSException
+ {
+ return _isFromQueue ? QueueImpl.valueOf(getTo())
+ : _isFromTopic ? TopicImpl.valueOf(getTo())
+ : DestinationImpl.valueOf(getTo());
+ }
+
+ public void setJMSDestination(Destination destination) throws NonAMQPDestinationException
+ {
+ if(destination == null)
+ {
+ setTo(null);
+ }
+ else if (destination instanceof org.apache.qpid.amqp_1_0.jms.Destination)
+ {
+ setTo(((org.apache.qpid.amqp_1_0.jms.Destination)destination).getAddress());
+ }
+ else
+ {
+ throw new NonAMQPDestinationException(destination);
+ }
+ }
+
+ public int getJMSDeliveryMode() throws JMSException
+ {
+ if(Boolean.FALSE.equals(getDurable()))
+ {
+ return DeliveryMode.NON_PERSISTENT;
+ }
+ else
+ {
+ return DeliveryMode.PERSISTENT;
+ }
+ }
+
+ public void setJMSDeliveryMode(int deliveryMode) throws JMSException
+ {
+ switch(deliveryMode)
+ {
+ case DeliveryMode.NON_PERSISTENT:
+ setDurable(false);
+ break;
+ case DeliveryMode.PERSISTENT:
+ setDurable(true);
+ break;
+ default:
+ //TODO
+ }
+ }
+
+ public boolean getJMSRedelivered()
+ {
+ UnsignedInteger failures = getDeliveryFailures();
+ return failures != null && (failures.intValue() != 0);
+ }
+
+ public void setJMSRedelivered(boolean redelivered)
+ {
+ UnsignedInteger failures = getDeliveryFailures();
+ if(redelivered)
+ {
+ if(failures == null || UnsignedInteger.ZERO.equals(failures))
+ {
+ setDeliveryFailures(UnsignedInteger.ONE);
+ }
+ }
+ else
+ {
+ setDeliveryFailures(null);
+ }
+ }
+
+ public String getJMSType() throws JMSException
+ {
+ Map messageAttrs = _messageAnnotations == null ? null : _messageAnnotations.getValue();
+ final Object attrValue = messageAttrs == null ? null : messageAttrs.get(JMS_TYPE);
+
+ return attrValue instanceof String ? attrValue.toString() : null;
+ }
+
+ public void setJMSType(String s) throws JMSException
+ {
+ Map messageAttrs = _messageAnnotations == null ? null : _messageAnnotations.getValue();
+ if(messageAttrs == null)
+ {
+ messageAttrs = new HashMap();
+ _messageAnnotations = new MessageAnnotations(messageAttrs);
+ }
+
+ messageAttrs.put(JMS_TYPE, s);
+ }
+
+ public long getJMSExpiration() throws JMSException
+ {
+ final UnsignedInteger ttl = getTtl();
+ return ttl == null || ttl.longValue() == 0 ? 0 : getJMSTimestamp() + ttl.longValue();
+ }
+
+ public void setJMSExpiration(long l) throws JMSException
+ {
+ _expiration = l;
+ if(l == 0)
+ {
+ setTtl(UnsignedInteger.ZERO);
+ }
+ else
+ {
+ if(getTransmitTime() == null)
+ {
+ setTransmitTime(new Date());
+ }
+ setTtl(UnsignedInteger.valueOf(l - getTransmitTime().getTime()));
+ }
+ }
+
+ public int getJMSPriority() throws JMSException
+ {
+ UnsignedByte priority = getPriority();
+ return priority == null ? DEFAULT_PRIORITY : priority.intValue();
+ }
+
+ public void setJMSPriority(int i) throws InvalidJMSPriorityException
+ {
+ if(i >= 0 && i <= 255)
+ {
+ setPriority(UnsignedByte.valueOf((byte)i));
+ }
+ else
+ {
+ throw new InvalidJMSPriorityException(i);
+ }
+ }
+
+ public void clearProperties() throws JMSException
+ {
+ _applicationProperties.getValue().clear();
+ }
+
+ public boolean propertyExists(final String s) throws JMSException
+ {
+ return propertyExists((Object) s);
+ }
+
+ public boolean getBooleanProperty(final String s) throws JMSException
+ {
+ return getBooleanProperty((Object) s);
+ }
+
+ public byte getByteProperty(final String s) throws JMSException
+ {
+ return getByteProperty((Object)s);
+ }
+
+ public short getShortProperty(final String s) throws JMSException
+ {
+ return getShortProperty((Object)s);
+ }
+
+ public int getIntProperty(final String s) throws JMSException
+ {
+ return getIntProperty((Object)s);
+ }
+
+ public long getLongProperty(final String s) throws JMSException
+ {
+ return getLongProperty((Object)s);
+ }
+
+ public float getFloatProperty(final String s) throws JMSException
+ {
+ return getFloatProperty((Object)s);
+ }
+
+ public double getDoubleProperty(final String s) throws JMSException
+ {
+ return getDoubleProperty((Object)s);
+ }
+
+ public String getStringProperty(final String s) throws JMSException
+ {
+ return getStringProperty((Object)s);
+ }
+
+ public Object getObjectProperty(final String s) throws JMSException
+ {
+ return getObjectProperty((Object)s);
+ }
+
+ public boolean propertyExists(Object name) throws JMSException
+ {
+ return _applicationProperties.getValue().containsKey(name);
+ }
+
+ public boolean getBooleanProperty(Object name) throws JMSException
+ {
+
+ Object value = getProperty(name);
+
+ if (value instanceof Boolean)
+ {
+ return ((Boolean) value).booleanValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Boolean.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to boolean.");
+ }
+ }
+
+ public byte getByteProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Byte)
+ {
+ return ((Byte) value).byteValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Byte.valueOf((String) value).byteValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to byte.");
+ }
+ }
+
+ public short getShortProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Short)
+ {
+ return ((Short) value).shortValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).shortValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Short.valueOf((String) value).shortValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to short.");
+ }
+ }
+
+ private Object getProperty(final Object name)
+ {
+ return _applicationProperties.getValue().get(name);
+ }
+
+ public int getIntProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Integer)
+ {
+ return ((Integer) value).intValue();
+ }
+ else if (value instanceof Short)
+ {
+ return ((Short) value).intValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).intValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Integer.valueOf((String) value).intValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to int.");
+ }
+ }
+
+ public long getLongProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Long)
+ {
+ return ((Long) value).longValue();
+ }
+ else if (value instanceof Integer)
+ {
+ return ((Integer) value).longValue();
+ }
+
+ if (value instanceof Short)
+ {
+ return ((Short) value).longValue();
+ }
+
+ if (value instanceof Byte)
+ {
+ return ((Byte) value).longValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Long.valueOf((String) value).longValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to long.");
+ }
+ }
+
+ public float getFloatProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Float)
+ {
+ return ((Float) value).floatValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Float.valueOf((String) value).floatValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to float.");
+ }
+ }
+
+ public double getDoubleProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Double)
+ {
+ return ((Double) value).doubleValue();
+ }
+ else if (value instanceof Float)
+ {
+ return ((Float) value).doubleValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Double.valueOf((String) value).doubleValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to double.");
+ }
+ }
+
+ public String getStringProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if ((value instanceof String) || (value == null))
+ {
+ return (String) value;
+ }
+ else if (value instanceof byte[])
+ {
+ throw new MessageFormatException("Property " + name + " of type byte[] " + "cannot be converted to String.");
+ }
+ else
+ {
+ return value.toString();
+ }
+ }
+
+ public Object getObjectProperty(Object name) throws JMSException
+ {
+ return getProperty(name);
+ }
+
+ public List<Object> getListProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+ if(value instanceof List || value == null)
+ {
+ return (List<Object>)value;
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to List.");
+ }
+ }
+
+ public Map<Object, Object> getMapProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+ if(value instanceof Map || value == null)
+ {
+ return (Map<Object,Object>)value;
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to Map.");
+ }
+ }
+
+ public UnsignedByte getUnsignedByteProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedByte)
+ {
+ return (UnsignedByte) value;
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedByte.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedByte.");
+ }
+ }
+
+ public UnsignedShort getUnsignedShortProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedShort)
+ {
+ return (UnsignedShort) value;
+ }
+ else if (value instanceof UnsignedByte)
+ {
+ return UnsignedShort.valueOf(((UnsignedByte)value).shortValue());
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedShort.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedShort.");
+ }
+ }
+
+ public UnsignedInteger getUnsignedIntProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedInteger)
+ {
+ return (UnsignedInteger) value;
+ }
+ else if (value instanceof UnsignedByte)
+ {
+ return UnsignedInteger.valueOf(((UnsignedByte)value).intValue());
+ }
+ else if (value instanceof UnsignedShort)
+ {
+ return UnsignedInteger.valueOf(((UnsignedShort)value).intValue());
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedInteger.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedShort.");
+ }
+ }
+
+ public UnsignedLong getUnsignedLongProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedLong)
+ {
+ return (UnsignedLong) value;
+ }
+ else if (value instanceof UnsignedByte)
+ {
+ return UnsignedLong.valueOf(((UnsignedByte)value).longValue());
+ }
+ else if (value instanceof UnsignedShort)
+ {
+ return UnsignedLong.valueOf(((UnsignedShort)value).longValue());
+ }
+ else if (value instanceof UnsignedInteger)
+ {
+ return UnsignedLong.valueOf(((UnsignedInteger)value).longValue());
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedLong.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedShort.");
+ }
+ }
+
+ public Enumeration getPropertyNames() throws JMSException
+ {
+ final Collection<String> names = new ArrayList<String>();
+ for(Object key : _applicationProperties.getValue().keySet())
+ {
+ if(key instanceof String)
+ {
+ names.add((String)key);
+ }
+ }
+ return Collections.enumeration(names);
+ }
+
+ public void setBooleanProperty(final String s, final boolean b) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+ setBooleanProperty((Object)s, b);
+ }
+
+ protected void checkPropertyName(CharSequence propertyName)
+ {
+ if (propertyName == null)
+ {
+ throw new IllegalArgumentException("Property name must not be null");
+ }
+ else if (propertyName.length() == 0)
+ {
+ throw new IllegalArgumentException("Property name must not be the empty string");
+ }
+
+ checkIdentiferFormat(propertyName);
+ }
+
+ protected void checkIdentiferFormat(CharSequence propertyName)
+ {
+// JMS requirements 3.5.1 Property Names
+// Identifiers:
+// - An identifier is an unlimited-length character sequence that must begin
+// with a Java identifier start character; all following characters must be Java
+// identifier part characters. An identifier start character is any character for
+// which the method Character.isJavaIdentifierStart returns true. This includes
+// '_' and '$'. An identifier part character is any character for which the
+// method Character.isJavaIdentifierPart returns true.
+// - Identifiers cannot be the names NULL, TRUE, or FALSE.
+// Identifiers cannot be NOT, AND, OR, BETWEEN, LIKE, IN, IS, or
+// ESCAPE.
+// Identifiers are either header field references or property references. The
+// type of a property value in a message selector corresponds to the type
+// used to set the property. If a property that does not exist in a message is
+// referenced, its value is NULL. The semantics of evaluating NULL values
+// in a selector are described in Section 3.8.1.2, Null Values.
+// The conversions that apply to the get methods for properties do not
+// apply when a property is used in a message selector expression. For
+// example, suppose you set a property as a string value, as in the
+// following:
+// myMessage.setStringProperty("NumberOfOrders", "2")
+// The following expression in a message selector would evaluate to false,
+// because a string cannot be used in an arithmetic expression:
+// "NumberOfOrders > 1"
+// Identifiers are case sensitive.
+// Message header field references are restricted to JMSDeliveryMode,
+// JMSPriority, JMSMessageID, JMSTimestamp, JMSCorrelationID, and
+// JMSType. JMSMessageID, JMSCorrelationID, and JMSType values may be
+// null and if so are treated as a NULL value.
+
+ // JMS start character
+ if (!(Character.isJavaIdentifierStart(propertyName.charAt(0))))
+ {
+ throw new IllegalArgumentException("Identifier '" + propertyName + "' does not start with a valid JMS identifier start character");
+ }
+
+ // JMS part character
+ int length = propertyName.length();
+ for (int c = 1; c < length; c++)
+ {
+ if (!(Character.isJavaIdentifierPart(propertyName.charAt(c))))
+ {
+ throw new IllegalArgumentException("Identifier '" + propertyName + "' contains an invalid JMS identifier character");
+ }
+ }
+
+ // JMS invalid names
+ if ((propertyName.equals("NULL")
+ || propertyName.equals("TRUE")
+ || propertyName.equals("FALSE")
+ || propertyName.equals("NOT")
+ || propertyName.equals("AND")
+ || propertyName.equals("OR")
+ || propertyName.equals("BETWEEN")
+ || propertyName.equals("LIKE")
+ || propertyName.equals("IN")
+ || propertyName.equals("IS")
+ || propertyName.equals("ESCAPE")))
+ {
+ throw new IllegalArgumentException("Identifier '" + propertyName + "' is not allowed in JMS");
+ }
+
+ }
+
+ public void setByteProperty(final String s, final byte b) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setByteProperty((Object)s, b);
+ }
+
+ public void setShortProperty(final String s, final short i) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setShortProperty((Object)s, i);
+ }
+
+ public void setIntProperty(final String s, final int i) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setIntProperty((Object)s, i);
+ }
+
+ public void setLongProperty(final String s, final long l) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setLongProperty((Object)s, l);
+ }
+
+ public void setFloatProperty(final String s, final float v) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setFloatProperty((Object) s, v);
+ }
+
+ public void setDoubleProperty(final String s, final double v) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setDoubleProperty((Object)s, v);
+ }
+
+ public void setStringProperty(final String s, final String s1) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setStringProperty((Object)s, s1);
+ }
+
+ public void setObjectProperty(final String s, final Object o) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ if(o != null && (_supportedClasses.contains(o.getClass())))
+ {
+ setObjectProperty((Object)s, o);
+ }
+ else
+ {
+ throw new MessageFormatException("Cannot call setObjectProperty with a value of " + ((o == null) ? "null" : " class "+o.getClass().getName()) + ".");
+ }
+ }
+
+ public void setBooleanProperty(Object name, boolean b) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, b);
+ }
+
+ public void setByteProperty(Object name, byte b) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, b);
+ }
+
+ public void setShortProperty(Object name, short i) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, i);
+ }
+
+ public void setIntProperty(Object name, int i) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, i);
+ }
+
+ public void setLongProperty(Object name, long l) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, l);
+ }
+
+ public void setFloatProperty(Object name, float v) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, v);
+ }
+
+ public void setDoubleProperty(Object name, double v) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, v);
+ }
+
+ public void setStringProperty(Object name, String value) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, value);
+ }
+
+ public void setObjectProperty(Object name, Object value) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, value);
+ }
+
+ public void setListProperty(final Object name, final List<Object> list) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, list);
+ }
+
+ public void setMapProperty(final Object name, final Map<Object, Object> map) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, map);
+ }
+
+ public void setUnsignedByteProperty(final Object name, final UnsignedByte b) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, b);
+ }
+
+ public void setUnsignedShortProperty(final Object name, final UnsignedShort s) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, s);
+ }
+
+ public void setUnsignedIntProperty(final Object name, final UnsignedInteger i) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, i);
+ }
+
+ public void setUnsignedLongProperty(final Object name, final UnsignedLong l) throws JMSException
+ {
+ _applicationProperties.getValue().put(name, l);
+ }
+
+ public UnsignedInteger getDeliveryFailures()
+ {
+ return _header.getDeliveryCount();
+ }
+
+ public void setDeliveryFailures(UnsignedInteger failures)
+ {
+ _header.setDeliveryCount(failures);
+ }
+
+ public MessageAttributes getHeaderMessageAttrs()
+ {
+ // TODO
+ return null ; // _header.getMessageAttrs();
+ }
+
+ public void setHeaderMessageAttrs(final MessageAttributes messageAttrs)
+ {
+ // TODO
+ }
+
+ public MessageAttributes getHeaderDeliveryAttrs()
+ {
+ // TODO
+ return null ; //_header.getDeliveryAttrs();
+ }
+
+ public void setHeaderDeliveryAttrs(final MessageAttributes deliveryAttrs)
+ {
+ //TODO
+ }
+
+ public Boolean getDurable()
+ {
+ return _header.getDurable();
+ }
+
+ public void setDurable(final Boolean durable)
+ {
+ _header.setDurable(durable);
+ }
+
+ public UnsignedByte getPriority()
+ {
+ return _header.getPriority();
+ }
+
+ public void setPriority(final UnsignedByte priority)
+ {
+ _header.setPriority(priority);
+ }
+
+ public Date getTransmitTime()
+ {
+ return _properties.getCreationTime();
+ }
+
+ public void setTransmitTime(final Date transmitTime)
+ {
+ _properties.setCreationTime(transmitTime);
+ }
+
+ public UnsignedInteger getTtl()
+ {
+ return _header.getTtl();
+ }
+
+ public void setTtl(final UnsignedInteger ttl)
+ {
+ _header.setTtl(ttl);
+ }
+
+ public UnsignedInteger getFormerAcquirers()
+ {
+ return _header.getDeliveryCount();
+ }
+
+ public void setFormerAcquirers(final UnsignedInteger formerAcquirers)
+ {
+ _header.setDeliveryCount(formerAcquirers);
+ }
+
+ public Object getMessageId()
+ {
+ return _properties.getMessageId();
+ }
+
+ public void setMessageId(final Object messageId)
+ {
+ _properties.setMessageId(messageId);
+ }
+
+ public Binary getUserId()
+ {
+ return _properties.getUserId();
+ }
+
+ public void setUserId(final Binary userId)
+ {
+ _properties.setUserId(userId);
+ }
+
+ public String getTo()
+ {
+ return _properties.getTo();
+ }
+
+ public void setTo(final String to)
+ {
+ _properties.setTo(to);
+ }
+
+ public String getSubject()
+ {
+ return _properties.getSubject();
+ }
+
+ public void setSubject(final String subject)
+ {
+ _properties.setSubject(subject);
+ }
+
+ public String getReplyTo()
+ {
+ return _properties.getReplyTo();
+ }
+
+ public void setReplyTo(final String replyTo)
+ {
+ _properties.setReplyTo(replyTo);
+ }
+
+ public Object getCorrelationId()
+ {
+ return _properties.getCorrelationId();
+ }
+
+ public void setCorrelationId(final Binary correlationId)
+ {
+ _properties.setCorrelationId(correlationId);
+ }
+
+ public Symbol getContentType()
+ {
+ return _properties.getContentType();
+ }
+
+ public void setContentType(final Symbol contentType)
+ {
+ _properties.setContentType(contentType);
+ }
+
+ public void acknowledge() throws JMSException
+ {
+ _sessionImpl.acknowledgeAll();
+ }
+
+ public void clearBody() throws JMSException
+ {
+ _readOnly = false;
+ }
+
+ protected boolean isReadOnly()
+ {
+ return _readOnly;
+ }
+
+ protected void checkReadable() throws MessageNotReadableException
+ {
+ if (!isReadOnly())
+ {
+ throw new MessageNotReadableException("You need to call reset() to make the message readable");
+ }
+ }
+
+ protected void checkWritable() throws MessageNotWriteableException
+ {
+ if (isReadOnly())
+ {
+ throw new MessageNotWriteableException("You need to call clearBody() to make the message writable");
+ }
+ }
+
+ public void setReadOnly()
+ {
+ _readOnly = true;
+ }
+
+ private static class InvalidJMSMEssageIdException extends JMSException
+ {
+ public InvalidJMSMEssageIdException(String messageId)
+ {
+ super("Invalid JMSMessageID: '" + messageId + "', JMSMessageID MUST start with 'ID:'");
+ }
+ }
+
+ private class NonAMQPDestinationException extends JMSException
+ {
+ public NonAMQPDestinationException(Destination destination)
+ {
+ super("Destinations not a valid AMQP Destination, class of type: '"
+ + destination.getClass().getName()
+ + "', require '"
+ + org.apache.qpid.amqp_1_0.jms.Destination.class.getName() + "'.");
+ }
+ }
+
+ private class InvalidJMSPriorityException extends JMSException
+ {
+ public InvalidJMSPriorityException(int priority)
+ {
+ super("The provided priority: " + priority + " is not valid in AMQP, valid values are from 0 to 255");
+ }
+ }
+
+ Header getHeader()
+ {
+ return _header;
+ }
+
+ Properties getProperties()
+ {
+ return _properties;
+ }
+
+
+ Footer getFooter()
+ {
+ return _footer;
+ }
+
+ MessageAnnotations getMessageAnnotations()
+ {
+ return _messageAnnotations;
+ }
+
+ public ApplicationProperties getApplicationProperties()
+ {
+ return _applicationProperties;
+ }
+
+ public void reset() throws JMSException
+ {
+ _readOnly = true;
+ }
+
+ void setFromQueue(final boolean fromQueue)
+ {
+ _isFromQueue = fromQueue;
+ }
+
+ void setFromTopic(final boolean fromTopic)
+ {
+ _isFromTopic = fromTopic;
+ }
+
+ abstract Collection<Section> getSections();
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageProducerImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageProducerImpl.java
new file mode 100644
index 0000000000..5bb8845eb7
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageProducerImpl.java
@@ -0,0 +1,362 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.Sender;
+import org.apache.qpid.amqp_1_0.jms.MessageProducer;
+import org.apache.qpid.amqp_1_0.jms.Queue;
+import org.apache.qpid.amqp_1_0.jms.QueueSender;
+import org.apache.qpid.amqp_1_0.jms.TemporaryDestination;
+import org.apache.qpid.amqp_1_0.jms.TopicPublisher;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+
+import javax.jms.*;
+import javax.jms.IllegalStateException;
+import java.util.UUID;
+
+public class MessageProducerImpl implements MessageProducer, QueueSender, TopicPublisher
+{
+ private boolean _disableMessageID;
+ private boolean _disableMessageTimestamp;
+ private int _deliveryMode = Message.DEFAULT_DELIVERY_MODE;
+ private int _priority = Message.DEFAULT_PRIORITY;
+ private long _timeToLive;
+
+ private DestinationImpl _destination;
+ private SessionImpl _session;
+ private Sender _sender;
+ private boolean _closed;
+
+ protected MessageProducerImpl(final Destination destination,
+ final SessionImpl session) throws JMSException
+ {
+ if(destination instanceof DestinationImpl)
+ {
+ _destination = (DestinationImpl) destination;
+ }
+ else if(destination != null)
+ {
+ throw new InvalidDestinationException("Invalid Destination Class" + destination.getClass().getName());
+ }
+ _session = session;
+
+ if(_destination != null)
+ {
+ try
+ {
+ _sender = _session.getClientSession().createSender(_destination.getAddress());
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ // TODO - refine exception
+ JMSException jmsEx = new JMSException(e.getMessage());
+ jmsEx.initCause(e);
+ jmsEx.setLinkedException(e);
+ throw jmsEx;
+ }
+ }
+ }
+
+ private void checkClosed() throws IllegalStateException
+ {
+ if(_closed)
+ {
+ throw new javax.jms.IllegalStateException("Producer closed");
+ }
+ }
+
+ public boolean getDisableMessageID() throws IllegalStateException
+ {
+ checkClosed();
+ return _disableMessageID;
+ }
+
+ public void setDisableMessageID(final boolean disableMessageID) throws IllegalStateException
+ {
+ checkClosed();
+ _disableMessageID = disableMessageID;
+ }
+
+ public boolean getDisableMessageTimestamp() throws IllegalStateException
+ {
+ checkClosed();
+ return _disableMessageTimestamp;
+ }
+
+ public void setDisableMessageTimestamp(final boolean disableMessageTimestamp) throws IllegalStateException
+ {
+ checkClosed();
+ _disableMessageTimestamp = disableMessageTimestamp;
+ }
+
+ public int getDeliveryMode() throws IllegalStateException
+ {
+ checkClosed();
+ return _deliveryMode;
+ }
+
+ public void setDeliveryMode(final int deliveryMode) throws IllegalStateException
+ {
+ checkClosed();
+ _deliveryMode = deliveryMode;
+ }
+
+ public int getPriority() throws IllegalStateException
+ {
+ checkClosed();
+ return _priority;
+ }
+
+ public void setPriority(final int priority) throws IllegalStateException
+ {
+ checkClosed();
+ _priority = priority;
+ }
+
+ public long getTimeToLive() throws IllegalStateException
+ {
+ checkClosed();
+ return _timeToLive;
+ }
+
+ public void setTimeToLive(final long timeToLive) throws IllegalStateException
+ {
+ checkClosed();
+ _timeToLive = timeToLive;
+ }
+
+ public DestinationImpl getDestination() throws JMSException
+ {
+ checkClosed();
+ return _destination;
+ }
+
+ public void close() throws JMSException
+ {
+ try
+ {
+ if(!_closed)
+ {
+ _closed = true;
+ if(_sender != null)
+ {
+ _sender.close();
+ }
+ }
+
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ final JMSException jmsException = new JMSException("error closing");
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ }
+
+ public void send(final Message message) throws JMSException
+ {
+ send(message, getDeliveryMode(), getPriority(), getTimeToLive());
+ }
+
+ public void send(final Message message, final int deliveryMode, final int priority, final long ttl) throws JMSException
+ {
+ if(_sender == null)
+ {
+ throw new UnsupportedOperationException("No Destination provided");
+ }
+ if(_destination instanceof TemporaryDestination && ((TemporaryDestination)_destination).isDeleted())
+ {
+ throw new IllegalStateException("Destination is deleted");
+ }
+
+
+ //TODO
+ MessageImpl msg;
+ if(message instanceof org.apache.qpid.amqp_1_0.jms.Message)
+ {
+ msg = (MessageImpl) message;
+ }
+ else
+ {
+ msg = _session.convertMessage(message);
+ }
+
+
+
+ msg.setJMSDeliveryMode(deliveryMode);
+ msg.setJMSPriority(priority);
+
+ msg.setJMSDestination(_destination);
+
+ long timestamp = 0l;
+
+ if(!getDisableMessageTimestamp() || ttl != 0)
+ {
+ timestamp = System.currentTimeMillis();
+ msg.setJMSTimestamp(timestamp);
+
+ }
+ if(ttl != 0)
+ {
+ msg.setTtl(UnsignedInteger.valueOf(ttl));
+ }
+ else
+ {
+ msg.setTtl(null);
+ }
+
+ if(!getDisableMessageID() && msg.getMessageId() == null)
+ {
+ final Binary messageId = generateMessageId();
+ msg.setMessageId(messageId);
+
+ }
+
+ if(message != msg)
+ {
+ message.setJMSTimestamp(msg.getJMSTimestamp());
+ message.setJMSMessageID(msg.getJMSMessageID());
+ message.setJMSDeliveryMode(msg.getJMSDeliveryMode());
+ message.setJMSPriority(msg.getJMSPriority());
+ message.setJMSExpiration(msg.getJMSExpiration());
+ }
+
+
+ final org.apache.qpid.amqp_1_0.client.Message clientMessage = new org.apache.qpid.amqp_1_0.client.Message(msg.getSections());
+
+ _sender.send(clientMessage, _session.getTxn());
+
+ if(getDestination() != null)
+ {
+ message.setJMSDestination(getDestination());
+ }
+ }
+
+ public void send(final javax.jms.Queue queue, final Message message) throws JMSException
+ {
+ send((Destination)queue, message);
+ }
+
+ public void send(final javax.jms.Queue queue, final Message message, final int deliveryMode, final int priority, final long ttl)
+ throws JMSException
+ {
+ send((Destination)queue, message, deliveryMode, priority, ttl);
+ }
+
+ private Binary generateMessageId()
+ {
+ UUID uuid = UUID.randomUUID();
+ return new Binary(uuid.toString().getBytes());
+ }
+
+ public void send(final Destination destination, final Message message) throws JMSException
+ {
+ send(destination, message, getDeliveryMode(), getPriority(), getTimeToLive());
+ }
+
+ public void send(final Destination destination, final Message message, final int deliveryMode, final int priority, final long ttl)
+ throws JMSException
+ {
+
+ checkClosed();
+ if(destination == null)
+ {
+ send(message, deliveryMode, priority, ttl);
+ }
+ else
+ {
+ if(_destination != null)
+ {
+ throw new UnsupportedOperationException("Cannot use explicit destination pon non-anonymous producer");
+ }
+ else if(!(destination instanceof DestinationImpl))
+ {
+ throw new InvalidDestinationException("Invalid Destination Class" + destination.getClass().getName());
+ }
+ else if(destination instanceof TemporaryDestination && ((TemporaryDestination)destination).isDeleted())
+ {
+ throw new IllegalStateException("Destination has been deleted");
+ }
+ try
+ {
+ _destination = (DestinationImpl) destination;
+ _sender = _session.getClientSession().createSender(_destination.getAddress());
+
+ send(message, deliveryMode, priority, ttl);
+
+ _sender.close();
+
+
+
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ // TODO - refine exception
+ JMSException jmsEx = new JMSException(e.getMessage());
+ jmsEx.initCause(e);
+ jmsEx.setLinkedException(e);
+ throw jmsEx;
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ JMSException jmsEx = new JMSException(e.getMessage());
+ jmsEx.initCause(e);
+ jmsEx.setLinkedException(e);
+ throw jmsEx;
+ }
+ finally
+ {
+ _sender = null;
+ _destination = null;
+ }
+ }
+ }
+
+ public QueueImpl getQueue() throws JMSException
+ {
+ return (QueueImpl) getDestination();
+ }
+
+ public TopicImpl getTopic() throws JMSException
+ {
+ return (TopicImpl) getDestination();
+ }
+
+ public void publish(final Message message) throws JMSException
+ {
+ send(message);
+ }
+
+ public void publish(final Message message, final int deliveryMode, final int priority, final long ttl) throws JMSException
+ {
+ send(message, deliveryMode, priority, ttl);
+ }
+
+ public void publish(final Topic topic, final Message message) throws JMSException
+ {
+ send(topic, message);
+ }
+
+ public void publish(final Topic topic, final Message message, final int deliveryMode, final int priority, final long ttl)
+ throws JMSException
+ {
+ send(topic, message, deliveryMode, priority, ttl);
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ObjectMessageImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ObjectMessageImpl.java
new file mode 100644
index 0000000000..2a52b0557a
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ObjectMessageImpl.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.ObjectMessage;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.JMSException;
+import javax.jms.MessageNotWriteableException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.*;
+
+public class ObjectMessageImpl extends MessageImpl implements ObjectMessage
+{
+ static final Symbol CONTENT_TYPE = Symbol.valueOf("application/x-java-serialized-object");
+
+ private Data _objectData;
+
+ protected ObjectMessageImpl(Header header,
+ MessageAnnotations messageAnnotations,
+ Properties properties,
+ ApplicationProperties appProperties,
+ Data dataSection,
+ Footer footer,
+ SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ getProperties().setContentType(CONTENT_TYPE);
+ Serializable serializable = null;
+ _objectData = dataSection;
+
+ }
+
+ protected ObjectMessageImpl(final SessionImpl session)
+ {
+ super(new Header(), new MessageAnnotations(new HashMap()),
+ new Properties(), new ApplicationProperties(new HashMap()), new Footer(Collections.EMPTY_MAP),
+ session);
+ getProperties().setContentType(CONTENT_TYPE);
+ }
+
+ public void setObject(final Serializable serializable) throws MessageNotWriteableException
+ {
+ checkWritable();
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try
+ {
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(serializable);
+ oos.flush();
+ oos.close();
+
+ _objectData = new Data(new Binary(baos.toByteArray()));
+
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+ }
+
+ public Serializable getObject() throws JMSException
+ {
+
+ if(_objectData == null)
+ {
+ return null;
+ }
+
+ Binary data = _objectData.getValue();
+
+ try
+ {
+ ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data.getArray(), data.getArrayOffset(), data.getLength()));
+ return (Serializable) ois.readObject();
+ }
+ catch (IOException e)
+ {
+ JMSException jmsException = new JMSException(e.getMessage());
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ catch (ClassNotFoundException e)
+ {
+
+ JMSException jmsException = new JMSException(e.getMessage());
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+
+ }
+
+ @Override
+ public void clearBody() throws JMSException
+ {
+ super.clearBody();
+ _objectData = null;
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+
+ sections.add(_objectData);
+
+ sections.add(getFooter());
+ return sections;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java
new file mode 100644
index 0000000000..527e82eaed
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueBrowserImpl.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Map;
+import javax.jms.InvalidSelectorException;
+import javax.jms.JMSException;
+import org.apache.qpid.amqp_1_0.client.AcknowledgeMode;
+import org.apache.qpid.amqp_1_0.client.Message;
+import org.apache.qpid.amqp_1_0.client.Receiver;
+import org.apache.qpid.amqp_1_0.jms.QueueBrowser;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+
+public class QueueBrowserImpl implements QueueBrowser
+{
+ private static final String JMS_SELECTOR = "jms-selector";
+ private QueueImpl _queue;
+ private String _selector;
+ private Receiver _receiver;
+ private Message _nextElement;
+ private MessageEnumeration _enumeration;
+
+ QueueBrowserImpl(final QueueImpl queue, final String selector, SessionImpl session) throws JMSException
+ {
+ _queue = queue;
+ _selector = selector;
+
+
+ Map<Symbol, Filter> filters;
+ if(selector == null || selector.trim().equals(""))
+ {
+ filters = null;
+ }
+ else
+ {
+ filters = Collections.singletonMap(Symbol.valueOf(JMS_SELECTOR),(Filter) new JMSSelectorFilter(_selector));
+ }
+
+
+ try
+ {
+ _receiver = session.getClientSession().createReceiver(queue.getAddress(),
+ StdDistMode.COPY,
+ AcknowledgeMode.AMO,null,
+ false,
+ filters, null);
+ _nextElement = _receiver.receive(0L);
+ _enumeration = new MessageEnumeration();
+ }
+ catch(AmqpErrorException e)
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = e.getError();
+ if(AmqpError.INVALID_FIELD.equals(error.getCondition()))
+ {
+ throw new InvalidSelectorException(e.getMessage());
+ }
+ else
+ {
+ throw new JMSException(e.getMessage(), error.getCondition().getValue().toString());
+ }
+
+ }
+ }
+
+ public QueueImpl getQueue()
+ {
+ return _queue;
+ }
+
+ public String getMessageSelector()
+ {
+ return _selector;
+ }
+
+ public Enumeration getEnumeration() throws JMSException
+ {
+ if(_enumeration == null)
+ {
+ throw new IllegalStateException("Browser has been closed");
+ }
+ return _enumeration;
+ }
+
+ public void close() throws JMSException
+ {
+ _receiver.close();
+ _enumeration = null;
+ }
+
+ private final class MessageEnumeration implements Enumeration<Message>
+ {
+
+ @Override
+ public boolean hasMoreElements()
+ {
+ return _nextElement != null;
+ }
+
+ @Override
+ public Message nextElement()
+ {
+
+ Message message = _nextElement;
+ if(message == null)
+ {
+ message = _receiver.receive(0l);
+ }
+ if(message != null)
+ {
+ _nextElement = _receiver.receive(0l);
+ }
+ return message;
+ }
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueConnectionImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueConnectionImpl.java
new file mode 100644
index 0000000000..657efd80a3
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueConnectionImpl.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.QueueConnection;
+
+import javax.jms.ConnectionConsumer;
+import javax.jms.JMSException;
+import javax.jms.Queue;
+import javax.jms.ServerSessionPool;
+
+public class QueueConnectionImpl extends ConnectionImpl implements QueueConnection
+{
+ QueueConnectionImpl(String host, int port, String username, String password, String clientId)
+ throws JMSException
+ {
+ super(host, port, username, password, clientId);
+ }
+
+ public QueueSessionImpl createQueueSession(final boolean b, final int i) throws JMSException
+ {
+ return null; //TODO
+ }
+
+ public ConnectionConsumer createConnectionConsumer(final Queue queue,
+ final String s,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ return null; //TODO
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java
new file mode 100644
index 0000000000..c88bd8268c
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Queue;
+
+import java.util.WeakHashMap;
+
+public class QueueImpl extends DestinationImpl implements Queue
+{
+ private static final WeakHashMap<String, QueueImpl> QUEUE_CACHE =
+ new WeakHashMap<String, QueueImpl>();
+
+ public QueueImpl(String address)
+ {
+ super(address);
+ }
+
+ public String getQueueName()
+ {
+ return getAddress();
+ }
+
+ public static synchronized QueueImpl createQueue(final String address)
+ {
+ QueueImpl queue = QUEUE_CACHE.get(address);
+ if(queue == null)
+ {
+ queue = new QueueImpl(address);
+ QUEUE_CACHE.put(address, queue);
+ }
+ return queue;
+ }
+
+ public static QueueImpl valueOf(String address)
+ {
+ return address == null ? null : createQueue(address);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueReceiverImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueReceiverImpl.java
new file mode 100644
index 0000000000..d46ed7183f
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueReceiverImpl.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.Receiver;
+import org.apache.qpid.amqp_1_0.jms.Queue;
+import org.apache.qpid.amqp_1_0.jms.QueueReceiver;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import javax.jms.*;
+
+public class QueueReceiverImpl extends MessageConsumerImpl implements QueueReceiver
+{
+ QueueReceiverImpl(final QueueImpl destination,
+ final SessionImpl session,
+ final String selector,
+ final boolean noLocal)
+ throws JMSException
+ {
+ super(destination, session, selector, noLocal);
+ setQueueConsumer(true);
+ }
+
+ protected Receiver createClientReceiver() throws JMSException
+ {
+ try
+ {
+ return getSession().getClientSession().createMovingReceiver(getDestination().getAddress());
+ }
+ catch (AmqpErrorException e)
+ {
+ throw new JMSException(e.getMessage(), e.getError().getCondition().toString());
+ }
+ }
+
+ public Queue getQueue() throws JMSException
+ {
+ return (QueueImpl) getDestination();
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSenderImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSenderImpl.java
new file mode 100644
index 0000000000..b3db43801a
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSenderImpl.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.QueueSender;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+
+public class QueueSenderImpl extends MessageProducerImpl implements QueueSender
+{
+ protected QueueSenderImpl(final Destination destination, final SessionImpl session)
+ throws JMSException
+ {
+ super(destination, session);
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSessionImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSessionImpl.java
new file mode 100644
index 0000000000..e5ed8b3b3d
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueSessionImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.QueueSession;
+
+import javax.jms.JMSException;
+import javax.jms.Queue;
+
+public class QueueSessionImpl extends SessionImpl implements QueueSession
+{
+ protected QueueSessionImpl(final ConnectionImpl connection, final AcknowledgeMode acknowledgeMode)
+ {
+ super(connection, acknowledgeMode);
+ setQueueSession(true);
+ }
+
+ public QueueReceiverImpl createReceiver(final Queue queue) throws JMSException
+ {
+ return createReceiver(queue, null);
+ }
+
+ public QueueReceiverImpl createReceiver(final Queue queue, final String selector) throws JMSException
+ {
+ // TODO - assert queue is a queueimpl and throw relevant JMS Exception
+ final QueueReceiverImpl messageConsumer;
+ synchronized(getClientSession().getEndpoint().getLock())
+ {
+ messageConsumer = new QueueReceiverImpl((QueueImpl)queue, this, selector, false);
+ addConsumer(messageConsumer);
+ }
+ return messageConsumer;
+
+ }
+
+ public QueueSenderImpl createSender(final Queue queue) throws JMSException
+ {
+ return null; //TODO
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java
new file mode 100644
index 0000000000..e321245a0e
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/SessionImpl.java
@@ -0,0 +1,898 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.UUID;
+import javax.jms.BytesMessage;
+import javax.jms.Destination;
+import javax.jms.IllegalStateException;
+import javax.jms.InvalidDestinationException;
+import javax.jms.JMSException;
+import javax.jms.MapMessage;
+import javax.jms.MessageEOFException;
+import javax.jms.MessageListener;
+import javax.jms.ObjectMessage;
+import javax.jms.Queue;
+import javax.jms.StreamMessage;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+import org.apache.qpid.amqp_1_0.client.Connection;
+import org.apache.qpid.amqp_1_0.client.Message;
+import org.apache.qpid.amqp_1_0.client.Receiver;
+import org.apache.qpid.amqp_1_0.client.Sender;
+import org.apache.qpid.amqp_1_0.client.Transaction;
+import org.apache.qpid.amqp_1_0.jms.QueueReceiver;
+import org.apache.qpid.amqp_1_0.jms.QueueSender;
+import org.apache.qpid.amqp_1_0.jms.QueueSession;
+import org.apache.qpid.amqp_1_0.jms.Session;
+import org.apache.qpid.amqp_1_0.jms.TemporaryDestination;
+import org.apache.qpid.amqp_1_0.jms.TopicPublisher;
+import org.apache.qpid.amqp_1_0.jms.TopicSession;
+import org.apache.qpid.amqp_1_0.jms.TopicSubscriber;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+
+public class SessionImpl implements Session, QueueSession, TopicSession
+{
+ private ConnectionImpl _connection;
+ private AcknowledgeMode _acknowledgeMode;
+ private org.apache.qpid.amqp_1_0.client.Session _session;
+ private MessageFactory _messageFactory;
+ private List<MessageConsumerImpl> _consumers = new ArrayList<MessageConsumerImpl>();
+ private List<MessageProducerImpl> _producers = new ArrayList<MessageProducerImpl>();
+
+ private MessageListener _messageListener;
+ private Dispatcher _dispatcher = new Dispatcher();
+ private Thread _dispatcherThread;
+
+ private boolean _closed;
+
+ private boolean _isQueueSession;
+ private boolean _isTopicSession;
+ private Transaction _txn;
+
+ protected SessionImpl(final ConnectionImpl connection, final AcknowledgeMode acknowledgeMode)
+ {
+ _connection = connection;
+ _acknowledgeMode = acknowledgeMode;
+ Connection clientConn = _connection.getClientConnection();
+ _session = clientConn.createSession();
+ if(_acknowledgeMode == AcknowledgeMode.SESSION_TRANSACTED)
+ {
+ _txn = _session.createSessionLocalTransaction();
+ }
+
+ _messageFactory = new MessageFactory(this);
+
+ _dispatcherThread = new Thread(_dispatcher);
+ _dispatcherThread.start();
+ }
+
+ public BytesMessageImpl createBytesMessage() throws IllegalStateException
+ {
+ checkClosed();
+ return new BytesMessageImpl(this);
+
+ }
+
+ public MapMessageImpl createMapMessage() throws JMSException
+ {
+ checkClosed();
+ return new MapMessageImpl(this);
+ }
+
+ public MessageImpl createMessage() throws IllegalStateException
+ {
+ return createAmqpMessage();
+ }
+
+ public ObjectMessageImpl createObjectMessage() throws JMSException
+ {
+ checkClosed();
+ return new ObjectMessageImpl(this);
+ }
+
+ public ObjectMessageImpl createObjectMessage(final Serializable serializable) throws JMSException
+ {
+ checkClosed();
+ ObjectMessageImpl msg = new ObjectMessageImpl(this);
+ msg.setObject(serializable);
+ return msg;
+ }
+
+ public StreamMessageImpl createStreamMessage() throws JMSException
+ {
+ checkClosed();
+ return new StreamMessageImpl(this);
+ }
+
+ public TextMessageImpl createTextMessage() throws JMSException
+ {
+ return createTextMessage("");
+ }
+
+ public TextMessageImpl createTextMessage(final String s) throws JMSException
+ {
+ checkClosed();
+ TextMessageImpl msg = new TextMessageImpl(this);
+ msg.setText(s);
+ return msg;
+ }
+
+ public AmqpMessageImpl createAmqpMessage() throws IllegalStateException
+ {
+ checkClosed();
+ return new AmqpMessageImpl(this);
+ }
+
+ public boolean getTransacted() throws JMSException
+ {
+ checkClosed();
+ return _acknowledgeMode == AcknowledgeMode.SESSION_TRANSACTED;
+ }
+
+ public int getAcknowledgeMode() throws IllegalStateException
+ {
+ checkClosed();
+ return _acknowledgeMode.ordinal();
+ }
+
+ AcknowledgeMode getAckModeEnum()
+ {
+ return _acknowledgeMode;
+ }
+
+ public void commit() throws JMSException
+ {
+ checkClosed();
+ checkTransactional();
+
+ _txn.commit();
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.postCommit();
+ }
+
+ _txn = _session.createSessionLocalTransaction();
+ //TODO
+ }
+
+ public void rollback() throws JMSException
+ {
+ checkClosed();
+ checkTransactional();
+
+ _txn.rollback();
+
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.postRollback();
+ }
+
+ _txn = _session.createSessionLocalTransaction();
+
+ //TODO
+ }
+
+ private void checkTransactional() throws JMSException
+ {
+ if(!getTransacted())
+ {
+ throw new IllegalStateException("Session must be transacted in order to perform this operation");
+ }
+ }
+
+ public void close() throws JMSException
+ {
+ if(!_closed)
+ {
+ _closed = true;
+ _dispatcher.close();
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.close();
+ }
+ for(MessageProducerImpl producer : _producers)
+ {
+ producer.close();
+ }
+ _session.close();
+ }
+ }
+
+ private void checkClosed() throws IllegalStateException
+ {
+ if(_closed)
+ {
+ throw new IllegalStateException("Closed");
+ }
+ }
+
+ public void recover() throws JMSException
+ {
+ checkClosed();
+ checkNotTransactional();
+
+ if(_acknowledgeMode == AcknowledgeMode.CLIENT_ACKNOWLEDGE)
+ {
+ synchronized(_session.getEndpoint().getLock())
+ {
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.doRecover();
+ }
+ }
+ }
+ else
+ {
+ if(Thread.currentThread() == _dispatcherThread)
+ {
+ _dispatcher.doRecover();
+ }
+ }
+
+ }
+
+ private void checkNotTransactional() throws JMSException
+ {
+
+ if(getTransacted())
+ {
+ throw new IllegalStateException("This operation cannot be carried out on a transacted session");
+ }
+ }
+
+ public MessageListener getMessageListener() throws JMSException
+ {
+ return _messageListener;
+ }
+
+ public void setMessageListener(final MessageListener messageListener) throws JMSException
+ {
+ if(_messageListener != null)
+ {
+ // TODO
+ }
+ else
+ {
+ _messageListener = messageListener;
+ }
+ }
+
+ public void run()
+ {
+ //TODO
+ }
+
+ public MessageProducerImpl createProducer(final Destination destination) throws JMSException
+ {
+ checkClosed();
+
+ final MessageProducerImpl messageProducer = new MessageProducerImpl(destination, this);
+
+ _producers.add(messageProducer);
+
+ return messageProducer;
+ }
+
+ public MessageConsumerImpl createConsumer(final Destination destination) throws JMSException
+ {
+ checkClosed();
+ return createConsumer(destination, null, false);
+ }
+
+ public MessageConsumerImpl createConsumer(final Destination destination, final String selector) throws JMSException
+ {
+ checkClosed();
+ return createConsumer(destination, selector, false);
+ }
+
+ public MessageConsumerImpl createConsumer(final Destination destination, final String selector, final boolean noLocal)
+ throws JMSException
+ {
+ checkClosed();
+ checkValidDestination(destination);
+ if(destination instanceof TemporaryDestination)
+ {
+ TemporaryDestination temporaryDestination = (TemporaryDestination) destination;
+ if(temporaryDestination.getSession() != this)
+ {
+ throw new JMSException("Cannot consume from a temporary destination created on another session");
+ }
+ if(temporaryDestination.isDeleted())
+ {
+ throw new IllegalStateException("Destination is deleted");
+ }
+ }
+ final MessageConsumerImpl messageConsumer;
+ synchronized(_session.getEndpoint().getLock())
+ {
+ messageConsumer = new MessageConsumerImpl(destination, this, selector, noLocal);
+ addConsumer(messageConsumer);
+ if(_connection.isStarted())
+ {
+ messageConsumer.start();
+ }
+ }
+ return messageConsumer;
+ }
+
+ private void checkValidDestination(Destination destination) throws InvalidDestinationException
+ {
+ if (destination == null || !(destination instanceof DestinationImpl))
+ {
+ throw new InvalidDestinationException("Invalid Destination");
+ }
+ }
+
+
+ protected void addConsumer(final MessageConsumerImpl messageConsumer)
+ {
+ _consumers.add(messageConsumer);
+ }
+
+ public QueueImpl createQueue(final String s) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ return new QueueImpl(s);
+ }
+
+ public QueueReceiver createReceiver(final Queue queue) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ return createConsumer(queue);
+ }
+
+ public QueueReceiver createReceiver(final Queue queue, final String selector) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ return createConsumer(queue, selector);
+ }
+
+ public QueueSender createSender(final Queue queue) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ return createProducer(queue);
+ }
+
+ public TopicImpl createTopic(final String s) throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ return new TopicImpl(s);
+ }
+
+ public TopicSubscriber createSubscriber(final Topic topic) throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ return createConsumer(topic);
+ }
+
+ public TopicSubscriber createSubscriber(final Topic topic, final String selector, final boolean noLocal) throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ return createConsumer(topic, selector, noLocal);
+ }
+
+ public TopicSubscriberImpl createDurableSubscriber(final Topic topic, final String name) throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ return createDurableSubscriber(topic, name, null, false);
+ }
+
+ private void checkNotQueueSession() throws IllegalStateException
+ {
+ if(_isQueueSession)
+ {
+ throw new IllegalStateException("Cannot perform this operation on a QueueSession");
+ }
+ }
+
+
+ private void checkNotTopicSession() throws IllegalStateException
+ {
+ if(_isTopicSession)
+ {
+ throw new IllegalStateException("Cannot perform this operation on a TopicSession");
+ }
+ }
+
+ public TopicSubscriberImpl createDurableSubscriber(final Topic topic, final String name, final String selector, final boolean noLocal)
+ throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ if(!(topic instanceof TopicImpl))
+ {
+ throw new InvalidDestinationException("invalid destination " + topic);
+ }
+ final TopicSubscriberImpl messageConsumer;
+ synchronized(_session.getEndpoint().getLock())
+ {
+ messageConsumer = new TopicSubscriberImpl(name, true, (org.apache.qpid.amqp_1_0.jms.Topic) topic, this,
+ selector,
+ noLocal);
+ addConsumer(messageConsumer);
+ if(_connection.isStarted())
+ {
+ messageConsumer.start();
+ }
+ }
+ return messageConsumer;
+ }
+
+ public TopicPublisher createPublisher(final Topic topic) throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ return createProducer(topic);
+ }
+
+ public QueueBrowserImpl createBrowser(final Queue queue) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ checkValidDestination(queue);
+ return createBrowser(queue, null);
+ }
+
+ public QueueBrowserImpl createBrowser(final Queue queue, final String selector) throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ checkValidDestination(queue);
+
+ return new QueueBrowserImpl((QueueImpl) queue, selector, this);
+
+ }
+
+ public TemporaryQueueImpl createTemporaryQueue() throws JMSException
+ {
+ checkClosed();
+ checkNotTopicSession();
+ try
+ {
+ Sender send = _session.createTemporaryQueueSender();
+
+ TemporaryQueueImpl tempQ = new TemporaryQueueImpl(((Target)send.getTarget()).getAddress(), send, this);
+ return tempQ;
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ throw new JMSException("Unable to create temporary queue");
+ }
+ }
+
+ public TemporaryTopicImpl createTemporaryTopic() throws JMSException
+ {
+ checkClosed();
+ checkNotQueueSession();
+ try
+ {
+ Sender send = _session.createTemporaryQueueSender();
+
+ TemporaryTopicImpl tempQ = new TemporaryTopicImpl(((Target)send.getTarget()).getAddress(), send, this);
+ return tempQ;
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ throw new JMSException("Unable to create temporary queue");
+ }
+ }
+
+ public void unsubscribe(final String s) throws JMSException
+ {
+ checkClosed();
+
+ checkNotQueueSession();
+
+ Target target = new Target();
+ target.setAddress(UUID.randomUUID().toString());
+
+ try
+ {
+ Receiver receiver = new Receiver(getClientSession(), s, target, null,
+ org.apache.qpid.amqp_1_0.client.AcknowledgeMode.ALO, false);
+
+ final org.apache.qpid.amqp_1_0.type.Source receiverSource = receiver.getSource();
+ if(receiverSource instanceof Source)
+ {
+ Source source = (Source) receiverSource;
+ receiver.close();
+ receiver = new Receiver(getClientSession(), s, target, source,
+ org.apache.qpid.amqp_1_0.client.AcknowledgeMode.ALO, false);
+
+ }
+ receiver.close();
+ }
+ catch(AmqpErrorException e)
+ {
+ if(e.getError().getCondition() == AmqpError.NOT_FOUND)
+ {
+ throw new InvalidDestinationException(s);
+ }
+ else
+ {
+ JMSException jmsException = new JMSException(e.getMessage());
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ }
+
+ //TODO
+ }
+
+ void stop()
+ {
+ //TODO
+ }
+
+ void start()
+ {
+ _dispatcher.start();
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.start();
+ }
+ }
+
+ org.apache.qpid.amqp_1_0.client.Session getClientSession()
+ {
+ return _session;
+ }
+
+ public MessageFactory getMessageFactory()
+ {
+ return _messageFactory;
+ }
+
+ void acknowledgeAll() throws IllegalStateException
+ {
+ synchronized(_session.getEndpoint().getLock())
+ {
+ checkClosed();
+ for(MessageConsumerImpl consumer : _consumers)
+ {
+ consumer.acknowledgeAll();
+ }
+ }
+ }
+
+ void messageListenerSet(final MessageConsumerImpl messageConsumer)
+ {
+ _dispatcher.updateMessageListener(messageConsumer);
+ }
+
+ public void messageArrived(final MessageConsumerImpl messageConsumer)
+ {
+ _dispatcher.messageArrivedAtConsumer(messageConsumer);
+ }
+
+ MessageImpl convertMessage(final javax.jms.Message message) throws JMSException
+ {
+ MessageImpl replacementMessage;
+
+ if(message instanceof BytesMessage)
+ {
+ replacementMessage = convertBytesMessage((BytesMessage) message);
+ }
+ else
+ {
+ if(message instanceof MapMessage)
+ {
+ replacementMessage = convertMapMessage((MapMessage) message);
+ }
+ else
+ {
+ if(message instanceof ObjectMessage)
+ {
+ replacementMessage = convertObjectMessage((ObjectMessage) message);
+ }
+ else
+ {
+ if(message instanceof StreamMessage)
+ {
+ replacementMessage = convertStreamMessage((StreamMessage) message);
+ }
+ else
+ {
+ if(message instanceof TextMessage)
+ {
+ replacementMessage = convertTextMessage((TextMessage) message);
+ }
+ else
+ {
+ replacementMessage = createMessage();
+ }
+ }
+ }
+ }
+ }
+
+ convertMessageProperties(message, replacementMessage);
+
+ return replacementMessage;
+ }
+
+
+ private void convertMessageProperties(final javax.jms.Message message, final MessageImpl replacementMessage)
+ throws JMSException
+ {
+ Enumeration propertyNames = message.getPropertyNames();
+ while (propertyNames.hasMoreElements())
+ {
+ String propertyName = String.valueOf(propertyNames.nextElement());
+ // TODO: Shouldn't need to check for JMS properties here as don't think getPropertyNames() should return them
+ if (!propertyName.startsWith("JMSX_"))
+ {
+ Object value = message.getObjectProperty(propertyName);
+ replacementMessage.setObjectProperty(propertyName, value);
+ }
+ }
+
+
+ replacementMessage.setJMSDeliveryMode(message.getJMSDeliveryMode());
+
+ if (message.getJMSReplyTo() != null)
+ {
+ replacementMessage.setJMSReplyTo(message.getJMSReplyTo());
+ }
+
+ replacementMessage.setJMSType(message.getJMSType());
+
+ replacementMessage.setJMSCorrelationID(message.getJMSCorrelationID());
+ }
+
+ private MessageImpl convertMapMessage(final MapMessage message) throws JMSException
+ {
+ MapMessageImpl mapMessage = createMapMessage();
+
+ Enumeration mapNames = message.getMapNames();
+ while (mapNames.hasMoreElements())
+ {
+ String name = (String) mapNames.nextElement();
+ mapMessage.setObject(name, message.getObject(name));
+ }
+
+ return mapMessage;
+ }
+
+ private MessageImpl convertBytesMessage(final BytesMessage message) throws JMSException
+ {
+ BytesMessageImpl bytesMessage = createBytesMessage();
+
+ message.reset();
+
+ byte[] buf = new byte[1024];
+
+ int len;
+
+ while ((len = message.readBytes(buf)) != -1)
+ {
+ bytesMessage.writeBytes(buf, 0, len);
+ }
+
+ return bytesMessage;
+ }
+
+ private MessageImpl convertObjectMessage(final ObjectMessage message) throws JMSException
+ {
+ ObjectMessageImpl objectMessage = createObjectMessage();
+ objectMessage.setObject(message.getObject());
+ return objectMessage;
+ }
+
+ private MessageImpl convertStreamMessage(final StreamMessage message) throws JMSException
+ {
+ StreamMessageImpl streamMessage = createStreamMessage();
+
+ try
+ {
+ message.reset();
+ while (true)
+ {
+ streamMessage.writeObject(message.readObject());
+ }
+ }
+ catch (MessageEOFException e)
+ {
+ // we're at the end so don't mind the exception
+ }
+
+ return streamMessage;
+ }
+
+ private MessageImpl convertTextMessage(final TextMessage message) throws JMSException
+ {
+ return createTextMessage(message.getText());
+ }
+
+ ConnectionImpl getConnection()
+ {
+ return _connection;
+ }
+
+ Transaction getTxn()
+ {
+ return _txn;
+ }
+
+
+ private class Dispatcher implements Runnable
+ {
+
+ private final List<MessageConsumerImpl> _messageConsumerList = new ArrayList<MessageConsumerImpl>();
+
+ private boolean _closed;
+ private boolean _started;
+
+ private Message _recoveredMessage;
+ private MessageConsumerImpl _recoveredConsumer;
+ private MessageConsumerImpl _currentConsumer;
+ private Message _currentMessage;
+
+ public void run()
+ {
+ synchronized(getLock())
+ {
+ while(!_closed)
+ {
+ while(!_started || (_recoveredMessage == null && _messageConsumerList.isEmpty()))
+ {
+ try
+ {
+ getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ return;
+ }
+ }
+ while(_started && (_recoveredMessage != null || !_messageConsumerList.isEmpty()))
+ {
+ Message msg;
+
+ MessageConsumerImpl consumer;
+
+ boolean recoveredMessage = _recoveredMessage != null;
+ if(recoveredMessage)
+ {
+ consumer = _recoveredConsumer;
+ msg = _recoveredMessage;
+ _recoveredMessage = null;
+ _recoveredConsumer = null;
+ }
+ else
+ {
+ consumer = _messageConsumerList.remove(0);
+ msg = consumer.receive0(0L);
+ }
+
+
+ MessageListener listener = consumer._messageListener;
+
+ MessageImpl message = consumer.createJMSMessage(msg, recoveredMessage);
+
+ if(message != null)
+ {
+ _currentConsumer = consumer;
+ _currentMessage = msg;
+ try
+ {
+ listener.onMessage(message);
+ }
+ finally
+ {
+ _currentConsumer = null;
+ _currentMessage = null;
+ }
+
+ if((_recoveredMessage == null) && (_acknowledgeMode == AcknowledgeMode.AUTO_ACKNOWLEDGE
+ || _acknowledgeMode == AcknowledgeMode.DUPS_OK_ACKNOWLEDGE))
+ {
+ consumer.acknowledge(msg);
+ }
+ }
+
+ }
+
+
+ }
+ }
+ }
+
+ private Object getLock()
+ {
+ return _session.getEndpoint().getLock();
+ }
+
+ public void messageArrivedAtConsumer(MessageConsumerImpl impl)
+ {
+ synchronized (getLock())
+ {
+ _messageConsumerList.add(impl);
+ getLock().notifyAll();
+ }
+ }
+
+ public void close()
+ {
+ synchronized (getLock())
+ {
+ _closed = true;
+ getLock().notifyAll();
+ }
+ }
+
+ public void updateMessageListener(final MessageConsumerImpl messageConsumer)
+ {
+ synchronized (getLock())
+ {
+ getLock().notifyAll();
+ }
+ }
+
+ public void start()
+ {
+ synchronized (getLock())
+ {
+ _started = true;
+ getLock().notifyAll();
+ }
+ }
+
+ public void stop()
+ {
+ synchronized (getLock())
+ {
+ _started = false;
+ getLock().notifyAll();
+ }
+ }
+
+ public void doRecover()
+ {
+ _recoveredConsumer = _currentConsumer;
+ _recoveredMessage = _currentMessage;
+ }
+ }
+
+ void setQueueSession(final boolean queueSession)
+ {
+ _isQueueSession = queueSession;
+ }
+
+ void setTopicSession(final boolean topicSession)
+ {
+ _isTopicSession = topicSession;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/StreamMessageImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/StreamMessageImpl.java
new file mode 100644
index 0000000000..8275de884e
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/StreamMessageImpl.java
@@ -0,0 +1,466 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.StreamMessage;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.JMSException;
+import javax.jms.MessageEOFException;
+import javax.jms.MessageFormatException;
+import java.io.EOFException;
+import java.util.*;
+
+public class StreamMessageImpl extends MessageImpl implements StreamMessage
+{
+ private List _list;
+ private boolean _readOnly;
+ private int _position = -1;
+ private int _offset = -1;
+
+
+
+ protected StreamMessageImpl(Header header, MessageAnnotations messageAnnotations, Properties properties, ApplicationProperties appProperties, List list,
+ Footer footer, SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ _list = list;
+ }
+
+ StreamMessageImpl(final SessionImpl session)
+ {
+ super(new Header(), new MessageAnnotations(new HashMap()), new Properties(),
+ new ApplicationProperties(new HashMap()), new Footer(Collections.EMPTY_MAP),
+ session);
+ _list = new ArrayList();
+ }
+
+ public StreamMessageImpl(final Header header,
+ final MessageAnnotations messageAnnotations,
+ final Properties properties,
+ final ApplicationProperties appProperties,
+ final List amqpListSection, final Footer footer)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, null);
+ _list = amqpListSection;
+ }
+
+ public boolean readBoolean() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Boolean)
+ {
+ return (Boolean) obj;
+ }
+ if(obj instanceof String || obj == null)
+ {
+ return Boolean.valueOf((String)obj);
+ }
+ else
+ {
+ throw new MessageFormatException("Cannot read " + obj.getClass().getName() + " as boolean");
+ }
+ }
+
+ @Override
+ public void clearBody() throws JMSException
+ {
+ super.clearBody();
+ _list.clear();
+ _position = -1;
+ _offset = -1;
+ }
+
+ public byte readByte() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Byte)
+ {
+ return (Byte) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Byte.valueOf((String)obj);
+ }
+ catch(RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ }
+
+ private void backup()
+ {
+ _position--;
+ }
+
+ public short readShort() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Short)
+ {
+ return (Short) obj;
+ }
+ else if(obj instanceof Byte)
+ {
+ return (Byte) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Short.valueOf((String)obj);
+ }
+ catch(RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+
+ }
+
+ public char readChar() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Character)
+ {
+ return (Character) obj;
+ }
+ if(obj == null)
+ {
+ backup();
+ throw new NullPointerException();
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot read " + obj.getClass().getName() + " as boolean");
+ }
+
+ }
+
+ public int readInt() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Integer)
+ {
+ return (Integer) obj;
+ }
+ else if(obj instanceof Short)
+ {
+ return (Short) obj;
+ }
+ else if(obj instanceof Byte)
+ {
+ return (Byte) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Integer.valueOf((String)obj);
+ }
+ catch (RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ }
+
+ public long readLong() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Long)
+ {
+ return (Long) obj;
+ }
+ else if(obj instanceof Integer)
+ {
+ return (Integer) obj;
+ }
+ else if(obj instanceof Short)
+ {
+ return (Short) obj;
+ }
+ else if(obj instanceof Byte)
+ {
+ return (Byte) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Long.valueOf((String)obj);
+ }
+ catch (RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ }
+
+ public float readFloat() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Float)
+ {
+ return (Float) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Float.valueOf((String)obj);
+ }
+ catch (RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ }
+
+ public double readDouble() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Double)
+ {
+ return (Double) obj;
+ }
+ else if(obj instanceof Float)
+ {
+ return (Float) obj;
+ }
+ else if(obj instanceof String || obj == null)
+ {
+ try
+ {
+ return Double.valueOf((String)obj);
+ }
+ catch (RuntimeException e)
+ {
+ backup();
+ throw e;
+ }
+ }
+ else
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ }
+
+ public String readString() throws JMSException
+ {
+ Object obj = readObject();
+ if(obj instanceof Binary)
+ {
+ backup();
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ return String.valueOf(obj);
+ }
+
+ public int readBytes(final byte[] bytes) throws JMSException
+ {
+ Object obj = readObject();
+ if(!(obj instanceof Binary))
+ {
+ backup();
+ if(_position > -1 && _list.get(_position) instanceof Binary)
+ {
+ return -1;
+ }
+ throw new MessageFormatException("Cannot convert value of type " + obj.getClass().getName());
+ }
+ Binary binary = (Binary) obj;
+ if(bytes.length >= binary.getLength())
+ {
+ System.arraycopy(binary.getArray(),binary.getArrayOffset(),bytes,0,binary.getLength());
+ return binary.getLength();
+ }
+ return -1;
+ }
+
+ public Object readObject() throws JMSException
+ {
+ checkReadable();
+ if(_offset == -1)
+ {
+ try
+ {
+ return _list.get(++_position);
+ }
+ catch (IndexOutOfBoundsException e)
+ {
+ throw new MessageEOFException("No more data in message stream");
+ }
+ }
+ else
+ {
+ return null; //TODO
+ }
+ }
+
+ public void writeBoolean(final boolean b) throws JMSException
+ {
+ checkWritable();
+ _list.add(b);
+ }
+
+ public void writeByte(final byte b) throws JMSException
+ {
+ checkWritable();
+ _list.add(b);
+ }
+
+ public void writeShort(final short i) throws JMSException
+ {
+ checkWritable();
+ _list.add(i);
+ }
+
+ public void writeChar(final char c) throws JMSException
+ {
+ checkWritable();
+ _list.add(c);
+ }
+
+ public void writeInt(final int i) throws JMSException
+ {
+ checkWritable();
+ _list.add(i);
+ }
+
+ public void writeLong(final long l) throws JMSException
+ {
+ checkWritable();
+ _list.add(l);
+ }
+
+ public void writeFloat(final float v) throws JMSException
+ {
+ checkWritable();
+ _list.add(v);
+ }
+
+ public void writeDouble(final double v) throws JMSException
+ {
+ checkWritable();
+ _list.add(v);
+ }
+
+ public void writeString(final String s) throws JMSException
+ {
+ checkWritable();
+ _list.add(s);
+ }
+
+ public void writeBytes(final byte[] bytes) throws JMSException
+ {
+ checkWritable();
+ writeBytes(bytes, 0, bytes.length);
+ }
+
+ public void writeBytes(final byte[] bytes, final int offset, final int size) throws JMSException
+ {
+ checkWritable();
+
+ if(!_list.isEmpty() && _list.get(_list.size()-1) instanceof byte[])
+ {
+ Binary oldVal = (Binary) _list.get(_list.size()-1);
+ byte[] allBytes = new byte[oldVal.getLength() + size];
+ System.arraycopy(oldVal.getArray(),oldVal.getArrayOffset(),allBytes,0,oldVal.getLength());
+ System.arraycopy(bytes, offset, allBytes, oldVal.getLength(), size);
+ _list.set(_list.size()-1, allBytes);
+ }
+ else
+ {
+ byte[] dup = new byte[size];
+ System.arraycopy(bytes,offset,dup,0,size);
+ _list.add(new Binary(dup));
+ }
+ }
+
+ public void writeObject(final Object o) throws JMSException
+ {
+ checkWritable();
+ if(o == null || _supportedClasses.contains(o.getClass()))
+ {
+ _list.add(o);
+ }
+ }
+
+ public void reset() throws JMSException
+ {
+ super.reset();
+ _position = -1;
+ _offset = -1;
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+ sections.add(new AmqpValue(_list));
+ sections.add(getFooter());
+ return sections;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryQueueImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryQueueImpl.java
new file mode 100644
index 0000000000..76608c421b
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryQueueImpl.java
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.Sender;
+import org.apache.qpid.amqp_1_0.jms.MessageConsumer;
+import org.apache.qpid.amqp_1_0.jms.TemporaryQueue;
+
+import javax.jms.IllegalStateException;
+import javax.jms.JMSException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class TemporaryQueueImpl extends QueueImpl implements TemporaryQueue
+{
+ private Sender _sender;
+ private SessionImpl _session;
+ private final Set<MessageConsumer> _consumers =
+ Collections.synchronizedSet(new HashSet<MessageConsumer>());
+
+ protected TemporaryQueueImpl(String address, Sender sender, SessionImpl session)
+ {
+ super(address);
+ _sender = sender;
+ _session = session;
+ _session.getConnection().addOnCloseTask(new ConnectionImpl.CloseTask()
+ {
+ public void onClose() throws JMSException
+ {
+ synchronized (TemporaryQueueImpl.this)
+ {
+ close();
+ }
+ }
+ });
+ }
+
+ public synchronized void delete() throws JMSException
+ {
+ if(_consumers.isEmpty())
+ {
+ close();
+ }
+ else
+ {
+ throw new IllegalStateException("Cannot delete destination as it has consumers");
+ }
+ }
+
+ private void close() throws JMSException
+ {
+ if(_sender != null)
+ {
+ try
+ {
+ _sender.close();
+ _sender = null;
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ final JMSException jmsException = new JMSException(e.getMessage());
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ }
+
+ }
+
+ public SessionImpl getSession()
+ {
+ return _session;
+ }
+
+ public void addConsumer(MessageConsumer consumer)
+ {
+ _consumers.add(consumer);
+ }
+
+ public void removeConsumer(MessageConsumer consumer)
+ {
+ _consumers.remove(consumer);
+ }
+
+ public boolean isDeleted()
+ {
+ return _sender == null;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryTopicImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryTopicImpl.java
new file mode 100644
index 0000000000..8e0d07e78b
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TemporaryTopicImpl.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.Sender;
+import org.apache.qpid.amqp_1_0.jms.MessageConsumer;
+import org.apache.qpid.amqp_1_0.jms.TemporaryTopic;
+
+import javax.jms.IllegalStateException;
+import javax.jms.JMSException;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class TemporaryTopicImpl extends TopicImpl implements TemporaryTopic
+{
+ private Sender _sender;
+ private SessionImpl _session;
+ private final Set<MessageConsumer> _consumers =
+ Collections.synchronizedSet(new HashSet<MessageConsumer>());
+
+ protected TemporaryTopicImpl(String address, Sender sender, SessionImpl session)
+ {
+ super(address);
+ _sender = sender;
+ _session = session;
+
+ _session.getConnection().addOnCloseTask(new ConnectionImpl.CloseTask()
+ {
+ public void onClose() throws JMSException
+ {
+ synchronized (TemporaryTopicImpl.this)
+ {
+ close();
+ }
+ }
+ });
+ }
+
+ public void delete() throws JMSException
+ {
+ if(_consumers.isEmpty())
+ {
+ close();
+ }
+ else
+ {
+ throw new IllegalStateException("Cannot delete destination as it has consumers");
+ }
+
+ }
+
+
+ private void close() throws JMSException
+ {
+ if(_sender != null)
+ {
+ try
+ {
+
+ _sender.close();
+ _sender = null;
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ final JMSException jmsException = new JMSException(e.getMessage());
+ jmsException.setLinkedException(e);
+ throw jmsException;
+ }
+ }
+
+ }
+
+ public SessionImpl getSession()
+ {
+ return _session;
+ }
+
+
+ public void addConsumer(MessageConsumer consumer)
+ {
+ _consumers.add(consumer);
+ }
+
+ public void removeConsumer(MessageConsumer consumer)
+ {
+ _consumers.remove(consumer);
+ }
+
+ public boolean isDeleted()
+ {
+ return _sender == null;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TextMessageImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TextMessageImpl.java
new file mode 100644
index 0000000000..5d9172229c
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TextMessageImpl.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.TextMessage;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.JMSException;
+import javax.jms.MessageNotWriteableException;
+import java.util.*;
+
+public class TextMessageImpl extends MessageImpl implements TextMessage
+{
+ private String _text;
+
+ protected TextMessageImpl(Header header,
+ MessageAnnotations messageAnnotations,
+ Properties properties,
+ ApplicationProperties appProperties,
+ String text,
+ Footer footer,
+ SessionImpl session)
+ {
+ super(header, messageAnnotations, properties, appProperties, footer, session);
+ _text = text;
+ }
+
+ protected TextMessageImpl(final SessionImpl session)
+ {
+ super(new Header(), new MessageAnnotations(new HashMap()),
+ new Properties(), new ApplicationProperties(new HashMap()), new Footer(Collections.EMPTY_MAP),
+ session);
+ }
+
+ public void setText(final String text) throws MessageNotWriteableException
+ {
+ if(isReadOnly())
+ {
+ throw new MessageNotWriteableException("Cannot set object, message is in read only mode");
+ }
+
+ _text = text;
+ }
+
+ public String getText() throws JMSException
+ {
+ return _text;
+ }
+
+ @Override
+ public void clearBody() throws JMSException
+ {
+ super.clearBody();
+ _text = null;
+ }
+
+ @Override Collection<Section> getSections()
+ {
+ List<Section> sections = new ArrayList<Section>();
+ sections.add(getHeader());
+ if(getMessageAnnotations() != null && getMessageAnnotations().getValue() != null && !getMessageAnnotations().getValue().isEmpty())
+ {
+ sections.add(getMessageAnnotations());
+ }
+ sections.add(getProperties());
+ sections.add(getApplicationProperties());
+ AmqpValue section = new AmqpValue(_text);
+ sections.add(section);
+ sections.add(getFooter());
+ return sections;
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicConnectionImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicConnectionImpl.java
new file mode 100644
index 0000000000..de456532cb
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicConnectionImpl.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.TopicConnection;
+
+import javax.jms.ConnectionConsumer;
+import javax.jms.JMSException;
+import javax.jms.ServerSessionPool;
+import javax.jms.Topic;
+
+public class TopicConnectionImpl extends ConnectionImpl implements TopicConnection
+{
+ TopicConnectionImpl(String host, int port, String username, String password, String clientId)
+ throws JMSException
+ {
+ super(host, port, username, password, clientId);
+ }
+
+ public TopicSessionImpl createTopicSession(final boolean b, final int i) throws JMSException
+ {
+ return null; //TODO
+ }
+
+ public ConnectionConsumer createConnectionConsumer(final Topic topic,
+ final String s,
+ final ServerSessionPool serverSessionPool,
+ final int i) throws JMSException
+ {
+ return null; //TODO
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java
new file mode 100644
index 0000000000..e54a660963
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Topic;
+
+import java.util.WeakHashMap;
+
+public class TopicImpl extends DestinationImpl implements Topic
+{
+ private static final WeakHashMap<String, TopicImpl> TOPIC_CACHE =
+ new WeakHashMap<String, TopicImpl>();
+
+
+ public TopicImpl(String address)
+ {
+ super(address);
+ }
+
+ public String getTopicName()
+ {
+ return getAddress();
+ }
+
+ public static synchronized TopicImpl createTopic(final String address)
+ {
+ TopicImpl topic = TOPIC_CACHE.get(address);
+ if(topic == null)
+ {
+ topic = new TopicImpl(address);
+ TOPIC_CACHE.put(address, topic);
+ }
+ return topic;
+ }
+
+ public static TopicImpl valueOf(String address)
+ {
+ return address == null ? null : createTopic(address);
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicPublisherImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicPublisherImpl.java
new file mode 100644
index 0000000000..a2d2f34043
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicPublisherImpl.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.TopicPublisher;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Topic;
+
+public class TopicPublisherImpl extends MessageProducerImpl implements TopicPublisher
+{
+ protected TopicPublisherImpl(final Destination destination, final SessionImpl session)
+ throws JMSException
+ {
+ super(destination, session);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSessionImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSessionImpl.java
new file mode 100644
index 0000000000..052a3f2a6b
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSessionImpl.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.TopicSession;
+
+import javax.jms.JMSException;
+import javax.jms.Topic;
+
+public class TopicSessionImpl extends SessionImpl implements TopicSession
+{
+ protected TopicSessionImpl(final ConnectionImpl connection, final AcknowledgeMode acknowledgeMode)
+ {
+ super(connection, acknowledgeMode);
+ setTopicSession(true);
+ }
+
+ public TopicSubscriberImpl createSubscriber(final Topic topic) throws JMSException
+ {
+ return createSubscriber(topic,null, false);
+ }
+
+ public TopicSubscriberImpl createSubscriber(final Topic topic, final String selector, final boolean noLocal) throws JMSException
+ {
+
+ final TopicSubscriberImpl messageConsumer;
+ synchronized(getClientSession().getEndpoint().getLock())
+ {
+ messageConsumer = new TopicSubscriberImpl((TopicImpl) topic, this, selector, noLocal);
+ addConsumer(messageConsumer);
+ }
+ return messageConsumer;
+ }
+
+ public TopicPublisherImpl createPublisher(final Topic topic) throws JMSException
+ {
+ return null; //TODO
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSubscriberImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSubscriberImpl.java
new file mode 100644
index 0000000000..52d8c412ec
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicSubscriberImpl.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.client.AcknowledgeMode;
+import org.apache.qpid.amqp_1_0.client.Receiver;
+import org.apache.qpid.amqp_1_0.jms.Topic;
+import org.apache.qpid.amqp_1_0.jms.TopicSubscriber;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+import javax.jms.*;
+import java.util.Map;
+
+public class TopicSubscriberImpl extends MessageConsumerImpl implements TopicSubscriber
+{
+
+ TopicSubscriberImpl(String name,
+ boolean durable,
+ final Topic destination,
+ final SessionImpl session,
+ final String selector,
+ final boolean noLocal)
+ throws JMSException
+ {
+ super(destination, session, selector, noLocal, name, durable);
+ setTopicSubscriber(true);
+ }
+
+ TopicSubscriberImpl(final Topic destination,
+ final SessionImpl session,
+ final String selector,
+ final boolean noLocal)
+ throws JMSException
+ {
+ super(destination, session, selector, noLocal);
+ setTopicSubscriber(true);
+ }
+
+ public TopicImpl getTopic() throws JMSException
+ {
+ return (TopicImpl) getDestination();
+ }
+
+
+ protected Receiver createClientReceiver() throws JMSException
+ {
+ try
+ {
+ String address = getDestination().getAddress();
+ Receiver receiver = getSession().getClientSession().createReceiver(address,
+ StdDistMode.COPY, AcknowledgeMode.ALO,
+ getLinkName(), isDurable(), getFilters(),
+ null);
+ String actualAddress = receiver.getAddress();
+
+ @SuppressWarnings("unchecked")
+ Map<Symbol, Filter> actualFilters = (Map<Symbol, Filter>) receiver.getFilter();
+
+ if(!address.equals(actualAddress) || !filtersEqual(getFilters(), actualFilters))
+ {
+ receiver.close();
+ if(isDurable())
+ {
+ receiver = getSession().getClientSession().createReceiver(address,
+ StdDistMode.COPY, AcknowledgeMode.ALO,
+ getLinkName(), false, getFilters(),
+ null);
+ receiver.close();
+ }
+ receiver = getSession().getClientSession().createReceiver(address,
+ StdDistMode.COPY, AcknowledgeMode.ALO,
+ getLinkName(), isDurable(), getFilters(),
+ null);
+ }
+
+
+ return receiver;
+ }
+ catch (AmqpErrorException e)
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = e.getError();
+ if(AmqpError.INVALID_FIELD.equals(error.getCondition()))
+ {
+ throw new InvalidSelectorException(e.getMessage());
+ }
+ else
+ {
+ throw new JMSException(e.getMessage(), error.getCondition().getValue().toString());
+
+ }
+
+ }
+ }
+
+ private boolean filtersEqual(Map<Symbol, Filter> filters, Map<Symbol, Filter> actualFilters)
+ {
+ if(filters == null || filters.isEmpty())
+ {
+ return actualFilters == null || actualFilters.isEmpty();
+ }
+ else
+ {
+ return actualFilters != null && filters.equals(actualFilters);
+ }
+
+ }
+
+
+ protected void closeUnderlyingReceiver(Receiver receiver)
+ {
+ receiver.close();
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java
new file mode 100644
index 0000000000..7c3857f6c9
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java
@@ -0,0 +1,37 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.jndi;
+
+import javax.naming.CompositeName;
+import javax.naming.Name;
+import javax.naming.NameParser;
+import javax.naming.NamingException;
+
+/**
+ * A default implementation of {@link NameParser}
+ * <p/>
+ * Based on class from ActiveMQ.
+ */
+public class NameParserImpl implements NameParser
+{
+ public Name parse(String name) throws NamingException
+ {
+ return new CompositeName(name);
+ }
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java
new file mode 100644
index 0000000000..31030a7d30
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java
@@ -0,0 +1,230 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms.jndi;
+
+import org.apache.qpid.amqp_1_0.jms.impl.ConnectionFactoryImpl;
+import org.apache.qpid.amqp_1_0.jms.impl.DestinationImpl;
+import org.apache.qpid.amqp_1_0.jms.impl.QueueImpl;
+import org.apache.qpid.amqp_1_0.jms.impl.TopicImpl;
+
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.Queue;
+import javax.jms.Topic;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactory;
+
+
+public class PropertiesFileInitialContextFactory implements InitialContextFactory
+{
+
+ private String CONNECTION_FACTORY_PREFIX = "connectionfactory.";
+ private String DESTINATION_PREFIX = "destination.";
+ private String QUEUE_PREFIX = "queue.";
+ private String TOPIC_PREFIX = "topic.";
+
+ public Context getInitialContext(Hashtable environment) throws NamingException
+ {
+ Map data = new ConcurrentHashMap();
+
+ String file = null;
+ try
+ {
+
+
+ if (environment.containsKey(Context.PROVIDER_URL))
+ {
+ file = (String) environment.get(Context.PROVIDER_URL);
+ }
+ else
+ {
+ file = System.getProperty(Context.PROVIDER_URL);
+ }
+
+ if (file != null)
+ {
+
+ // Load the properties specified
+ BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
+ Properties p = new Properties();
+ try
+ {
+ p.load(inputStream);
+ }
+ finally
+ {
+ inputStream.close();
+ }
+
+
+ for (Map.Entry me : p.entrySet())
+ {
+ String key = (String) me.getKey();
+ String value = (String) me.getValue();
+ environment.put(key, value);
+ if (System.getProperty(key) == null)
+ {
+ System.setProperty(key, value);
+ }
+ }
+ }
+ else
+ {
+ throw new NamingException("No Provider URL specified.");
+ }
+ }
+ catch (IOException ioe)
+ {
+ NamingException ne = new NamingException("Unable to load property file:" + file +".");
+ ne.setRootCause(ioe);
+ throw ne;
+ }
+
+ try
+ {
+ createConnectionFactories(data, environment);
+ }
+ catch (MalformedURLException e)
+ {
+ NamingException ne = new NamingException();
+ ne.setRootCause(e);
+ throw ne;
+ }
+
+ createDestinations(data, environment);
+
+ createQueues(data, environment);
+
+ createTopics(data, environment);
+
+ return createContext(data, environment);
+ }
+
+ protected ReadOnlyContext createContext(Map data, Hashtable environment)
+ {
+ return new ReadOnlyContext(environment, data);
+ }
+
+ protected void createConnectionFactories(Map data, Hashtable environment) throws MalformedURLException
+ {
+ for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) iter.next();
+ String key = entry.getKey().toString();
+ if (key.startsWith(CONNECTION_FACTORY_PREFIX))
+ {
+ String jndiName = key.substring(CONNECTION_FACTORY_PREFIX.length());
+ ConnectionFactory cf = createFactory(entry.getValue().toString().trim());
+ if (cf != null)
+ {
+ data.put(jndiName, cf);
+ }
+ }
+ }
+ }
+
+ protected void createDestinations(Map data, Hashtable environment)
+ {
+ for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) iter.next();
+ String key = entry.getKey().toString();
+ if (key.startsWith(DESTINATION_PREFIX))
+ {
+ String jndiName = key.substring(DESTINATION_PREFIX.length());
+ Destination dest = createDestination(entry.getValue().toString().trim());
+ if (dest != null)
+ {
+ data.put(jndiName, dest);
+ }
+ }
+ }
+ }
+
+ protected void createQueues(Map data, Hashtable environment)
+ {
+ for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) iter.next();
+ String key = entry.getKey().toString();
+ if (key.startsWith(QUEUE_PREFIX))
+ {
+ String jndiName = key.substring(QUEUE_PREFIX.length());
+ Queue q = createQueue(entry.getValue().toString().trim());
+ if (q != null)
+ {
+ data.put(jndiName, q);
+ }
+ }
+ }
+ }
+
+ protected void createTopics(Map data, Hashtable environment)
+ {
+ for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) iter.next();
+ String key = entry.getKey().toString();
+ if (key.startsWith(TOPIC_PREFIX))
+ {
+ String jndiName = key.substring(TOPIC_PREFIX.length());
+ Topic t = createTopic(entry.getValue().toString().trim());
+ if (t != null)
+ {
+ data.put(jndiName, t);
+ }
+ }
+ }
+ }
+
+
+ private ConnectionFactory createFactory(String url) throws MalformedURLException
+ {
+ return ConnectionFactoryImpl.createFromURL(url);
+ }
+
+ private DestinationImpl createDestination(String str)
+ {
+ return DestinationImpl.createDestination(str);
+ }
+
+ private QueueImpl createQueue(String address)
+ {
+ return QueueImpl.createQueue(address);
+ }
+
+ private TopicImpl createTopic(String address)
+ {
+ return TopicImpl.createTopic(address);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java
new file mode 100644
index 0000000000..4e0f994b94
--- /dev/null
+++ b/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java
@@ -0,0 +1,527 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms.jndi;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.naming.Binding;
+import javax.naming.CompositeName;
+import javax.naming.Context;
+import javax.naming.LinkRef;
+import javax.naming.Name;
+import javax.naming.NameClassPair;
+import javax.naming.NameNotFoundException;
+import javax.naming.NameParser;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.NotContextException;
+import javax.naming.OperationNotSupportedException;
+import javax.naming.Reference;
+import javax.naming.spi.NamingManager;
+
+/**
+ * Based on class from ActiveMQ.
+ * A read-only Context
+ * <p/>
+ * This version assumes it and all its subcontext are read-only and any attempt
+ * to modify (e.g. through bind) will result in an OperationNotSupportedException.
+ * Each Context in the tree builds a cache of the entries in all sub-contexts
+ * to optimise the performance of lookup.
+ * </p>
+ * <p>This implementation is intended to optimise the performance of lookup(String)
+ * to about the level of a HashMap get. It has been observed that the scheme
+ * resolution phase performed by the JVM takes considerably longer, so for
+ * optimum performance lookups should be coded like:</p>
+ * <code>
+ * Context componentContext = (Context)new InitialContext().lookup("java:comp");
+ * String envEntry = (String) componentContext.lookup("env/myEntry");
+ * String envEntry2 = (String) componentContext.lookup("env/myEntry2");
+ * </code>
+ */
+public class ReadOnlyContext implements Context, Serializable
+{
+ private static final long serialVersionUID = -5754338187296859149L;
+ protected static final NameParser nameParser = new NameParserImpl();
+
+ protected final Hashtable environment; // environment for this context
+ protected final Map bindings; // bindings at my level
+ protected final Map treeBindings; // all bindings under me
+
+ private boolean frozen = false;
+ private String nameInNamespace = "";
+ public static final String SEPARATOR = "/";
+
+ public ReadOnlyContext()
+ {
+ environment = new Hashtable();
+ bindings = new HashMap();
+ treeBindings = new HashMap();
+ }
+
+ public ReadOnlyContext(Hashtable env)
+ {
+ if (env == null)
+ {
+ this.environment = new Hashtable();
+ }
+ else
+ {
+ this.environment = new Hashtable(env);
+ }
+
+ this.bindings = Collections.EMPTY_MAP;
+ this.treeBindings = Collections.EMPTY_MAP;
+ }
+
+ public ReadOnlyContext(Hashtable environment, Map bindings)
+ {
+ if (environment == null)
+ {
+ this.environment = new Hashtable();
+ }
+ else
+ {
+ this.environment = new Hashtable(environment);
+ }
+
+ this.bindings = bindings;
+ treeBindings = new HashMap();
+ frozen = true;
+ }
+
+ public ReadOnlyContext(Hashtable environment, Map bindings, String nameInNamespace)
+ {
+ this(environment, bindings);
+ this.nameInNamespace = nameInNamespace;
+ }
+
+ protected ReadOnlyContext(ReadOnlyContext clone, Hashtable env)
+ {
+ this.bindings = clone.bindings;
+ this.treeBindings = clone.treeBindings;
+ this.environment = new Hashtable(env);
+ }
+
+ protected ReadOnlyContext(ReadOnlyContext clone, Hashtable env, String nameInNamespace)
+ {
+ this(clone, env);
+ this.nameInNamespace = nameInNamespace;
+ }
+
+ public void freeze()
+ {
+ frozen = true;
+ }
+
+ boolean isFrozen()
+ {
+ return frozen;
+ }
+
+ /**
+ * internalBind is intended for use only during setup or possibly by suitably synchronized superclasses.
+ * It binds every possible lookup into a map in each context. To do this, each context
+ * strips off one name segment and if necessary creates a new context for it. Then it asks that context
+ * to bind the remaining name. It returns a map containing all the bindings from the next context, plus
+ * the context it just created (if it in fact created it). (the names are suitably extended by the segment
+ * originally lopped off).
+ *
+ * @param name
+ * @param value
+ * @return
+ * @throws javax.naming.NamingException
+ */
+ protected Map internalBind(String name, Object value) throws NamingException
+ {
+ assert (name != null) && (name.length() > 0);
+ assert !frozen;
+
+ Map newBindings = new HashMap();
+ int pos = name.indexOf('/');
+ if (pos == -1)
+ {
+ if (treeBindings.put(name, value) != null)
+ {
+ throw new NamingException("Something already bound at " + name);
+ }
+
+ bindings.put(name, value);
+ newBindings.put(name, value);
+ }
+ else
+ {
+ String segment = name.substring(0, pos);
+ assert segment != null;
+ assert !segment.equals("");
+ Object o = treeBindings.get(segment);
+ if (o == null)
+ {
+ o = newContext();
+ treeBindings.put(segment, o);
+ bindings.put(segment, o);
+ newBindings.put(segment, o);
+ }
+ else if (!(o instanceof ReadOnlyContext))
+ {
+ throw new NamingException("Something already bound where a subcontext should go");
+ }
+
+ ReadOnlyContext readOnlyContext = (ReadOnlyContext) o;
+ String remainder = name.substring(pos + 1);
+ Map subBindings = readOnlyContext.internalBind(remainder, value);
+ for (Iterator iterator = subBindings.entrySet().iterator(); iterator.hasNext();)
+ {
+ Map.Entry entry = (Map.Entry) iterator.next();
+ String subName = segment + "/" + (String) entry.getKey();
+ Object bound = entry.getValue();
+ treeBindings.put(subName, bound);
+ newBindings.put(subName, bound);
+ }
+ }
+
+ return newBindings;
+ }
+
+ protected ReadOnlyContext newContext()
+ {
+ return new ReadOnlyContext();
+ }
+
+ public Object addToEnvironment(String propName, Object propVal) throws NamingException
+ {
+ return environment.put(propName, propVal);
+ }
+
+ public Hashtable getEnvironment() throws NamingException
+ {
+ return (Hashtable) environment.clone();
+ }
+
+ public Object removeFromEnvironment(String propName) throws NamingException
+ {
+ return environment.remove(propName);
+ }
+
+ public Object lookup(String name) throws NamingException
+ {
+ if (name.length() == 0)
+ {
+ return this;
+ }
+
+ Object result = treeBindings.get(name);
+ if (result == null)
+ {
+ result = bindings.get(name);
+ }
+
+ if (result == null)
+ {
+ int pos = name.indexOf(':');
+ if (pos > 0)
+ {
+ String scheme = name.substring(0, pos);
+ Context ctx = NamingManager.getURLContext(scheme, environment);
+ if (ctx == null)
+ {
+ throw new NamingException("scheme " + scheme + " not recognized");
+ }
+
+ return ctx.lookup(name);
+ }
+ else
+ {
+ // Split out the first name of the path
+ // and look for it in the bindings map.
+ CompositeName path = new CompositeName(name);
+
+ if (path.size() == 0)
+ {
+ return this;
+ }
+ else
+ {
+ String first = path.get(0);
+ Object obj = bindings.get(first);
+ if (obj == null)
+ {
+ throw new NameNotFoundException(name);
+ }
+ else if ((obj instanceof Context) && (path.size() > 1))
+ {
+ Context subContext = (Context) obj;
+ obj = subContext.lookup(path.getSuffix(1));
+ }
+
+ return obj;
+ }
+ }
+ }
+
+ if (result instanceof LinkRef)
+ {
+ LinkRef ref = (LinkRef) result;
+ result = lookup(ref.getLinkName());
+ }
+
+ if (result instanceof Reference)
+ {
+ try
+ {
+ result = NamingManager.getObjectInstance(result, null, null, this.environment);
+ }
+ catch (NamingException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ throw (NamingException) new NamingException("could not look up : " + name).initCause(e);
+ }
+ }
+
+ if (result instanceof ReadOnlyContext)
+ {
+ String prefix = getNameInNamespace();
+ if (prefix.length() > 0)
+ {
+ prefix = prefix + SEPARATOR;
+ }
+
+ result = new ReadOnlyContext((ReadOnlyContext) result, environment, prefix + name);
+ }
+
+ return result;
+ }
+
+ public Object lookup(Name name) throws NamingException
+ {
+ return lookup(name.toString());
+ }
+
+ public Object lookupLink(String name) throws NamingException
+ {
+ return lookup(name);
+ }
+
+ public Name composeName(Name name, Name prefix) throws NamingException
+ {
+ Name result = (Name) prefix.clone();
+ result.addAll(name);
+
+ return result;
+ }
+
+ public String composeName(String name, String prefix) throws NamingException
+ {
+ CompositeName result = new CompositeName(prefix);
+ result.addAll(new CompositeName(name));
+
+ return result.toString();
+ }
+
+ public NamingEnumeration list(String name) throws NamingException
+ {
+ Object o = lookup(name);
+ if (o == this)
+ {
+ return new ListEnumeration();
+ }
+ else if (o instanceof Context)
+ {
+ return ((Context) o).list("");
+ }
+ else
+ {
+ throw new NotContextException();
+ }
+ }
+
+ public NamingEnumeration listBindings(String name) throws NamingException
+ {
+ Object o = lookup(name);
+ if (o == this)
+ {
+ return new ListBindingEnumeration();
+ }
+ else if (o instanceof Context)
+ {
+ return ((Context) o).listBindings("");
+ }
+ else
+ {
+ throw new NotContextException();
+ }
+ }
+
+ public Object lookupLink(Name name) throws NamingException
+ {
+ return lookupLink(name.toString());
+ }
+
+ public NamingEnumeration list(Name name) throws NamingException
+ {
+ return list(name.toString());
+ }
+
+ public NamingEnumeration listBindings(Name name) throws NamingException
+ {
+ return listBindings(name.toString());
+ }
+
+ public void bind(Name name, Object obj) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void bind(String name, Object obj) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void close() throws NamingException
+ {
+ // ignore
+ }
+
+ public Context createSubcontext(Name name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public Context createSubcontext(String name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void destroySubcontext(Name name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void destroySubcontext(String name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public String getNameInNamespace() throws NamingException
+ {
+ return nameInNamespace;
+ }
+
+ public NameParser getNameParser(Name name) throws NamingException
+ {
+ return nameParser;
+ }
+
+ public NameParser getNameParser(String name) throws NamingException
+ {
+ return nameParser;
+ }
+
+ public void rebind(Name name, Object obj) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void rebind(String name, Object obj) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void rename(Name oldName, Name newName) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void rename(String oldName, String newName) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void unbind(Name name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ public void unbind(String name) throws NamingException
+ {
+ throw new OperationNotSupportedException();
+ }
+
+ private abstract class LocalNamingEnumeration implements NamingEnumeration
+ {
+ private Iterator i = bindings.entrySet().iterator();
+
+ public boolean hasMore() throws NamingException
+ {
+ return i.hasNext();
+ }
+
+ public boolean hasMoreElements()
+ {
+ return i.hasNext();
+ }
+
+ protected Map.Entry getNext()
+ {
+ return (Map.Entry) i.next();
+ }
+
+ public void close() throws NamingException
+ { }
+ }
+
+ private class ListEnumeration extends LocalNamingEnumeration
+ {
+ public Object next() throws NamingException
+ {
+ return nextElement();
+ }
+
+ public Object nextElement()
+ {
+ Map.Entry entry = getNext();
+
+ return new NameClassPair((String) entry.getKey(), entry.getValue().getClass().getName());
+ }
+ }
+
+ private class ListBindingEnumeration extends LocalNamingEnumeration
+ {
+ public Object next() throws NamingException
+ {
+ return nextElement();
+ }
+
+ public Object nextElement()
+ {
+ Map.Entry entry = getNext();
+
+ return new Binding((String) entry.getKey(), entry.getValue());
+ }
+ }
+}
diff --git a/qpid/java/amqp-1-0-client/build.xml b/qpid/java/amqp-1-0-client/build.xml
new file mode 100644
index 0000000000..173d7540d4
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/build.xml
@@ -0,0 +1,29 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<project name="AMQP 1.0 Client" default="build">
+
+ <property name="module.genpom" value="true"/>
+ <property name="module.depends" value="amqp-1-0-common"/>
+
+
+ <import file="../module.xml"/>
+
+</project>
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/AcknowledgeMode.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/AcknowledgeMode.java
new file mode 100644
index 0000000000..05d176bc35
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/AcknowledgeMode.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+public enum AcknowledgeMode
+{
+ AMO,
+ ALO,
+ EO
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Command.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Command.java
new file mode 100644
index 0000000000..3bb26744c4
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Command.java
@@ -0,0 +1,43 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import java.lang.reflect.InvocationTargetException;
+
+public class Command
+{
+ public static void main(String[] args) throws
+ ClassNotFoundException,
+ NoSuchMethodException,
+ InvocationTargetException,
+ IllegalAccessException,
+ InstantiationException
+ {
+ String name = args[0];
+ String[] cmdArgs = new String[args.length-1];
+ System.arraycopy(args,1,cmdArgs,0,args.length-1);
+ name = "org.apache.qpid.amqp_1_0.client." + String.valueOf(name.charAt(0)).toUpperCase() + name.substring(1).toLowerCase();
+ Class<Util> clazz = (Class<Util>) Class.forName(name);
+ Util util = clazz.getDeclaredConstructor(String[].class).newInstance((Object)cmdArgs);
+ util.run();
+
+ }
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java
new file mode 100644
index 0000000000..e3d56fae09
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Connection.java
@@ -0,0 +1,481 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.framing.ConnectionHandler;
+import org.apache.qpid.amqp_1_0.transport.AMQPTransport;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+import org.apache.qpid.amqp_1_0.transport.Container;
+import org.apache.qpid.amqp_1_0.transport.StateChangeListener;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+import org.apache.qpid.amqp_1_0.type.SaslFrameBody;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.nio.ByteBuffer;
+import java.security.Principal;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class Connection
+{
+ private static final Logger RAW_LOGGER = Logger.getLogger("RAW");
+ private static final int MAX_FRAME_SIZE = 65536;
+
+ private String _address;
+ private ConnectionEndpoint _conn;
+ private int _sessionCount;
+
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password) throws ConnectionException
+ {
+ this(address, port, username, password, MAX_FRAME_SIZE);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password, String remoteHostname) throws ConnectionException
+ {
+ this(address, port, username, password, MAX_FRAME_SIZE,new Container(),remoteHostname);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final int maxFrameSize) throws ConnectionException
+ {
+ this(address,port,username,password,maxFrameSize,new Container());
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final Container container) throws ConnectionException
+ {
+ this(address,port,username,password,MAX_FRAME_SIZE,container);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final int maxFrameSize,
+ final Container container) throws ConnectionException
+ {
+ this(address,port,username,password,maxFrameSize,container, null);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final int maxFrameSize,
+ final Container container,
+ final String remoteHostname) throws ConnectionException
+ {
+ this(address,port,username,password,maxFrameSize,container,remoteHostname,false);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final Container container,
+ final boolean ssl) throws ConnectionException
+ {
+ this(address, port, username, password, MAX_FRAME_SIZE,container,null,ssl);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final String remoteHost,
+ final boolean ssl) throws ConnectionException
+ {
+ this(address, port, username, password, MAX_FRAME_SIZE,new Container(),remoteHost,ssl);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final Container container,
+ final String remoteHost,
+ final boolean ssl) throws ConnectionException
+ {
+ this(address, port, username, password, MAX_FRAME_SIZE,container,remoteHost,ssl);
+ }
+
+ public Connection(final String address,
+ final int port,
+ final String username,
+ final String password,
+ final int maxFrameSize,
+ final Container container,
+ final String remoteHostname, boolean ssl) throws ConnectionException
+ {
+
+ _address = address;
+
+ try
+ {
+ final Socket s;
+ if(ssl)
+ {
+ s = SSLSocketFactory.getDefault().createSocket(address, port);
+ }
+ else
+ {
+ s = new Socket(address, port);
+ }
+
+
+ Principal principal = username == null ? null : new Principal()
+ {
+
+ public String getName()
+ {
+ return username;
+ }
+ };
+ _conn = new ConnectionEndpoint(container, principal, password);
+ _conn.setDesiredMaxFrameSize(UnsignedInteger.valueOf(maxFrameSize));
+ _conn.setRemoteAddress(s.getRemoteSocketAddress());
+ _conn.setRemoteHostname(remoteHostname);
+
+
+
+ ConnectionHandler.FrameOutput<FrameBody> out = new ConnectionHandler.FrameOutput<FrameBody>(_conn);
+
+
+ final OutputStream outputStream = s.getOutputStream();
+
+ ConnectionHandler.BytesSource src;
+
+ if(_conn.requiresSASL())
+ {
+ ConnectionHandler.FrameOutput<SaslFrameBody> saslOut = new ConnectionHandler.FrameOutput<SaslFrameBody>(_conn);
+
+ src = new ConnectionHandler.SequentialBytesSource(new ConnectionHandler.HeaderBytesSource(_conn, (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte)3,
+ (byte)1,
+ (byte)0,
+ (byte)0),
+ new ConnectionHandler.FrameToBytesSourceAdapter(saslOut,_conn.getDescribedTypeRegistry()),
+ new ConnectionHandler.HeaderBytesSource(_conn, (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte)0,
+ (byte)1,
+ (byte)0,
+ (byte)0),
+ new ConnectionHandler.FrameToBytesSourceAdapter(out,_conn.getDescribedTypeRegistry())
+ );
+
+ _conn.setSaslFrameOutput(saslOut);
+ }
+ else
+ {
+ src = new ConnectionHandler.SequentialBytesSource(new ConnectionHandler.HeaderBytesSource(_conn,(byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte)0,
+ (byte)1,
+ (byte)0,
+ (byte)0),
+ new ConnectionHandler.FrameToBytesSourceAdapter(out,_conn.getDescribedTypeRegistry())
+ );
+ }
+
+
+ //ConnectionHandler.OutputHandler outputHandler = new ConnectionHandler.OutputHandler(outputStream, out, _conn.getDescribedTypeRegistry());
+ ConnectionHandler.BytesOutputHandler outputHandler = new ConnectionHandler.BytesOutputHandler(outputStream, src, _conn);
+ Thread outputThread = new Thread(outputHandler);
+ outputThread.setDaemon(true);
+ outputThread.start();
+ _conn.setFrameOutputHandler(out);
+
+
+
+ final ConnectionHandler handler = new ConnectionHandler(_conn);
+ final InputStream inputStream = s.getInputStream();
+
+ //final AMQPTransport transport = new AMQPTransport(new AMQPFrameTransport(_conn));
+
+ Thread inputThread = new Thread(new Runnable()
+ {
+
+ public void run()
+ {
+ try
+ {
+ doRead(handler, inputStream);
+// doRead(transport, inputStream);
+ }
+ finally
+ {
+ if(_conn.closedForInput() && _conn.closedForOutput())
+ {
+ try
+ {
+ s.close();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+ }
+ });
+
+ inputThread.setDaemon(true);
+ inputThread.start();
+
+/*
+ Thread outputThread = new Thread(new Runnable()
+ {
+
+ private int _lastWrite;
+
+ public void run()
+ {
+ try
+ {
+// doRead(handler, inputStream);
+ final Object lock = new Object();
+ transport.setOutputStateChangeListener(new StateChangeListener()
+ {
+
+ public void onStateChange(final boolean active)
+ {
+ synchronized (lock)
+ {
+ lock.notifyAll();
+ }
+ }
+ });
+
+ synchronized(lock)
+ {
+ while(transport.isOpenForOutput())
+ {
+ _lastWrite = 0;
+ transport.getNextBytes(new BytesProcessor()
+ {
+
+ public void processBytes(final ByteBuffer buf)
+ {
+ _lastWrite = buf.remaining();
+ try
+ {
+ outputStream.write(buf.array(),
+ buf.arrayOffset() + buf.position(),
+ buf.limit() - buf.position());
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ });
+ if(_lastWrite == 0 && transport.isOpenForOutput())
+ {
+ try
+ {
+ lock.wait(1000);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+ }
+ }
+ finally
+ {
+ if(_conn.closedForInput() && _conn.closedForOutput())
+ {
+ try
+ {
+ s.close();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+ }
+ });
+*/
+
+ _conn.open();
+
+ }
+ catch (IOException e)
+ {
+ throw new ConnectionException(e);
+ }
+
+
+ }
+
+
+
+ private void doRead(final AMQPTransport transport, final InputStream inputStream)
+ {
+ byte[] buf = new byte[2<<15];
+ ByteBuffer bbuf = ByteBuffer.wrap(buf);
+ final Object lock = new Object();
+ transport.setInputStateChangeListener(new StateChangeListener(){
+
+ public void onStateChange(final boolean active)
+ {
+ synchronized(lock)
+ {
+ lock.notifyAll();
+ }
+ }
+ });
+
+ try
+ {
+ int read;
+ while((read = inputStream.read(buf)) != -1)
+ {
+ bbuf.position(0);
+ bbuf.limit(read);
+
+ while(bbuf.hasRemaining() && transport.isOpenForInput())
+ {
+ transport.processBytes(bbuf);
+ }
+
+
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+
+ }
+
+ public Session createSession()
+ {
+ Session session = new Session(this,String.valueOf(_sessionCount++));
+ return session;
+ }
+
+ public ConnectionEndpoint getEndpoint()
+ {
+ return _conn;
+ }
+
+ private void doRead(final ConnectionHandler handler, final InputStream inputStream)
+ {
+ byte[] buf = new byte[2<<15];
+
+
+ try
+ {
+ int read;
+ boolean done = false;
+ while(!done && (read = inputStream.read(buf)) != -1)
+ {
+ ByteBuffer bbuf = ByteBuffer.wrap(buf, 0, read);
+ Binary b = new Binary(buf,0,read);
+
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ RAW_LOGGER.fine("RECV [" + _conn.getRemoteAddress() + "] : " + b.toString());
+ }
+ /*System.err.println(b);
+ System.err.println("XXX: " + bbuf.hasRemaining() + "; " + handler.isDone());
+ if(handler.isDone())
+ {
+ System.err.println(handler.getClass().getName() + "IS DONE!");
+ } */
+ while(bbuf.hasRemaining() && !handler.isDone())
+ {
+ handler.parse(bbuf);
+ }
+
+
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+
+ public void close()
+ {
+ _conn.close();
+
+ synchronized (_conn.getLock())
+ {
+ while(!_conn.closedForInput())
+ {
+ try
+ {
+ _conn.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ }
+ }
+
+
+ public static class ConnectionException extends Exception
+ {
+ public ConnectionException(Throwable cause)
+ {
+ super(cause);
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Demo.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Demo.java
new file mode 100644
index 0000000000..b58ce6bfe5
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Demo.java
@@ -0,0 +1,407 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Demo extends Util
+{
+ private static final String USAGE_STRING = "demo [options] <vendor> [<content> ...]\n\nOptions:";
+ private static final String OPCODE = "opcode";
+ private static final String ACTION = "action";
+ private static final String MESSAGE_ID = "message-id";
+ private static final String VENDOR = "vendor";
+ private static final String LOG = "log";
+ private static final String RECEIVED = "received";
+ private static final String TEST = "test";
+ private static final String APACHE = "apache";
+ private static final String SENT = "sent";
+ private static final String LINK_REF = "link-ref";
+ private static final String HOST = "host";
+ private static final String PORT = "port";
+ private static final String SASL_USER = "sasl-user";
+ private static final String SASL_PASSWORD = "sasl-password";
+ private static final String ROLE = "role";
+ private static final String ADDRESS = "address";
+ private static final String SENDER = "sender";
+ private static final String SEND_MESSAGE = "send-message";
+ private static final String ANNOUNCE = "announce";
+ private static final String MESSAGE_VENDOR = "message-vendor";
+ private static final String CREATE_LINK = "create-link";
+
+ public static void main(String[] args)
+ {
+ new Demo(args).run();
+ }
+
+ public Demo(String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasWindowSizeOption()
+ {
+ return false;
+ }
+
+ public void run()
+ {
+
+ try
+ {
+
+ final String vendor = getArgs()[0];
+ final String queue = "control";
+
+ String message = "";
+
+ Connection conn = newConnection();
+ Session session = conn.createSession();
+
+
+ Receiver responseReceiver;
+
+ responseReceiver = session.createTemporaryQueueReceiver();
+
+
+
+
+ responseReceiver.setCredit(UnsignedInteger.valueOf(getWindowSize()), true);
+
+
+
+ Sender s = session.createSender(queue, getWindowSize(), getMode());
+
+
+ Properties properties = new Properties();
+ properties.setMessageId(java.util.UUID.randomUUID());
+ properties.setReplyTo(responseReceiver.getAddress());
+
+ HashMap appPropMap = new HashMap();
+ ApplicationProperties appProperties = new ApplicationProperties(appPropMap);
+
+ appPropMap.put(OPCODE, ANNOUNCE);
+ appPropMap.put(VENDOR, vendor);
+ appPropMap.put(ADDRESS,responseReceiver.getAddress());
+
+ AmqpValue amqpValue = new AmqpValue(message);
+ Section[] sections = { properties, appProperties, amqpValue};
+ final Message message1 = new Message(Arrays.asList(sections));
+
+ s.send(message1);
+
+ Map<Object, Sender> sendingLinks = new HashMap<Object, Sender>();
+ Map<Object, Receiver> receivingLinks = new HashMap<Object, Receiver>();
+
+
+ boolean done = false;
+
+ while(!done)
+ {
+ boolean wait = true;
+ Message m = responseReceiver.receive(false);
+ if(m != null)
+ {
+ List<Section> payload = m.getPayload();
+ wait = false;
+ ApplicationProperties props = m.getApplicationProperties();
+ Map map = props.getValue();
+ String op = (String) map.get(OPCODE);
+ if("reset".equals(op))
+ {
+ for(Sender sender : sendingLinks.values())
+ {
+ try
+ {
+ sender.close();
+ Session session1 = sender.getSession();
+ session1.close();
+ session1.getConnection().close();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ for(Receiver receiver : receivingLinks.values())
+ {
+ try
+ {
+ receiver.close();
+ receiver.getSession().close();
+ receiver.getSession().getConnection().close();
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ sendingLinks.clear();
+ receivingLinks.clear();
+ }
+ else if(CREATE_LINK.equals(op))
+ {
+ Object linkRef = map.get(LINK_REF);
+ String host = (String) map.get(HOST);
+ Object o = map.get(PORT);
+ int port = Integer.parseInt(String.valueOf(o));
+ String user = (String) map.get(SASL_USER);
+ String password = (String) map.get(SASL_PASSWORD);
+ String role = (String) map.get(ROLE);
+ String address = (String) map.get(ADDRESS);
+ System.err.println("Host: " + host + "\tPort: " + port + "\t user: " + user +"\t password: " + password);
+ try{
+
+
+ Connection conn2 = new Connection(host, port, user, password, host);
+ Session session2 = conn2.createSession();
+ if(sendingLinks.containsKey(linkRef))
+ {
+ try
+ {
+ sendingLinks.remove(linkRef).close();
+ }
+ catch (Exception e)
+ {
+
+ }
+ }
+ if(receivingLinks.containsKey(linkRef))
+ {
+ try
+ {
+ receivingLinks.remove(linkRef).close();
+ }
+ catch (Exception e)
+ {
+
+ }
+ }
+ if(SENDER.equals(role))
+ {
+
+ System.err.println("%%% Creating sender (" + linkRef + ")");
+ Sender sender = session2.createSender(address);
+ sendingLinks.put(linkRef, sender);
+ }
+ else
+ {
+
+ System.err.println("%%% Creating receiver (" + linkRef + ")");
+ Receiver receiver2 = session2.createReceiver(address);
+ receiver2.setCredit(UnsignedInteger.valueOf(getWindowSize()), true);
+
+ receivingLinks.put(linkRef, receiver2);
+ }
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ else if(SEND_MESSAGE.equals(op))
+ {
+ Sender sender = sendingLinks.get(map.get(LINK_REF));
+ Properties m2props = new Properties();
+ Object messageId = map.get(MESSAGE_ID);
+ m2props.setMessageId(messageId);
+ Map m2propmap = new HashMap();
+ m2propmap.put(OPCODE, TEST);
+ m2propmap.put(VENDOR, vendor);
+ ApplicationProperties m2appProps = new ApplicationProperties(m2propmap);
+ Message m2 = new Message(Arrays.asList(m2props, m2appProps, new AmqpValue("AMQP-"+messageId)));
+ sender.send(m2);
+
+ Map m3propmap = new HashMap();
+ m3propmap.put(OPCODE, LOG);
+ m3propmap.put(ACTION, SENT);
+ m3propmap.put(MESSAGE_ID, messageId);
+ m3propmap.put(VENDOR, vendor);
+ m3propmap.put(MESSAGE_VENDOR, vendor);
+
+
+ Message m3 = new Message(Arrays.asList(new ApplicationProperties(m3propmap),
+ new AmqpValue("AMQP-"+messageId)));
+ s.send(m3);
+
+ }
+
+ responseReceiver.acknowledge(m);
+ }
+ else
+ {
+ for(Map.Entry<Object, Receiver> entry : receivingLinks.entrySet())
+ {
+ m = entry.getValue().receive(false);
+ if(m != null)
+ {
+ wait = false;
+
+ System.err.println("%%% Received message from " + entry.getKey());
+
+ Properties mp = m.getProperties();
+ ApplicationProperties ap = m.getApplicationProperties();
+
+ Map m3propmap = new HashMap();
+ m3propmap.put(OPCODE, LOG);
+ m3propmap.put(ACTION, RECEIVED);
+ m3propmap.put(MESSAGE_ID, mp.getMessageId());
+ m3propmap.put(VENDOR, vendor);
+ m3propmap.put(MESSAGE_VENDOR, ap.getValue().get(VENDOR));
+
+ Message m3 = new Message(Arrays.asList(new ApplicationProperties(m3propmap),
+ new AmqpValue("AMQP-"+mp.getMessageId())));
+ s.send(m3);
+
+ entry.getValue().acknowledge(m);
+ }
+
+ }
+ }
+
+ if(wait)
+ {
+ try
+ {
+ Thread.sleep(500l);
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ }
+
+ }
+
+
+
+
+
+
+
+
+
+ s.close();
+ session.close();
+ conn.close();
+
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+ }
+
+ protected boolean hasSingleLinkPerConnectionMode()
+ {
+ return false;
+ }
+
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Dump.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Dump.java
new file mode 100644
index 0000000000..f61fd64a61
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Dump.java
@@ -0,0 +1,116 @@
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.commons.cli.Options;
+
+public class Dump extends Util
+{
+ private static final String USAGE_STRING = "dump [options] <address>\n\nOptions:";
+
+
+ protected Dump(String[] args)
+ {
+ super(args);
+ }
+
+ public static void main(String[] args)
+ {
+ new Dump(args).run();
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected void printUsage(Options options)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ @Override
+ protected void run()
+ {
+ final String queue = getArgs()[0];
+
+ try
+ {
+ Connection conn = newConnection();
+
+ Session session = conn.createSession();
+
+
+ Sender s = session.createSender(queue, 10);
+
+ Message message = new Message("dump me");
+ message.setDeliveryTag(new Binary("dump".getBytes()));
+
+ s.send(message);
+
+ s.close();
+ session.close();
+ conn.close();
+
+ } catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filereceiver.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filereceiver.java
new file mode 100644
index 0000000000..43ddd6ca25
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filereceiver.java
@@ -0,0 +1,327 @@
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.util.*;
+
+public class Filereceiver extends Util
+{
+ private static final String USAGE_STRING = "filereceiver [options] <address> <directory>\n\nOptions:";
+
+ protected Filereceiver(String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+
+ }
+
+ @Override
+ protected void run()
+ {
+ final String queue = getArgs()[0];
+ final String directoryName = getArgs()[1];
+
+ try
+ {
+ Connection conn = newConnection();
+
+ Session session = conn.createSession();
+
+ final File directory = new File(directoryName);
+ if(directory.isDirectory() && directory.canWrite())
+ {
+ File tmpDirectory = new File(directoryName, ".tmp");
+ if(!tmpDirectory.exists())
+ {
+ tmpDirectory.mkdir();
+ }
+
+ String[] unsettledFiles = tmpDirectory.list();
+
+ Map<Binary, Outcome> unsettled = new HashMap<Binary, Outcome>();
+ final Map<Binary, String> unsettledFileNames = new HashMap<Binary, String>();
+
+ Accepted accepted = new Accepted();
+
+ for(String fileName : unsettledFiles)
+ {
+ File theFile = new File(tmpDirectory, fileName);
+ if(theFile.isFile())
+ {
+ if(fileName.startsWith("~") && fileName.endsWith("~"))
+ {
+ theFile.delete();
+ }
+ else
+ {
+ int splitPoint = fileName.indexOf(".");
+ String deliveryTagStr = fileName.substring(0,splitPoint);
+ String actualFileName = fileName.substring(splitPoint+1);
+
+ byte[] bytes = new byte[deliveryTagStr.length()/2];
+
+
+ for(int i = 0; i < bytes.length; i++)
+ {
+ char c = deliveryTagStr.charAt(2*i);
+ char d = deliveryTagStr.charAt(1+(2*i));
+
+ bytes[i] = (byte) (((c <= '9' ? c - '0' : c - 'W') << 4)
+ | (d <= '9' ? d - '0' : d - 'W'));
+
+ }
+ Binary deliveryTag = new Binary(bytes);
+ unsettled.put(deliveryTag, accepted);
+ unsettledFileNames.put(deliveryTag, fileName);
+ }
+ }
+
+ }
+
+ Receiver r = session.createReceiver(queue, AcknowledgeMode.EO, getLinkName(), isDurableLink(),
+ unsettled);
+
+ Map<Binary, Outcome> remoteUnsettled = r.getRemoteUnsettled();
+
+ for(Map.Entry<Binary, String> entry : unsettledFileNames.entrySet())
+ {
+ if(remoteUnsettled == null || !remoteUnsettled.containsKey(entry.getKey()))
+ {
+
+ File tmpFile = new File(tmpDirectory, entry.getValue());
+ final File dest = new File(directory,
+ entry.getValue().substring(entry.getValue().indexOf(".") + 1));
+ if(dest.exists())
+ {
+ System.err.println("Duplicate detected - filename " + dest.getName());
+ }
+
+ tmpFile.renameTo(dest);
+ }
+ }
+
+
+ int credit = 10;
+
+ r.setCredit(UnsignedInteger.valueOf(credit), true);
+
+
+ int received = 0;
+ Message m = null;
+ do
+ {
+ m = isBlock() && received == 0 ? r.receive() : r.receive(10000);
+ if(m != null)
+ {
+ if(m.isResume() && unsettled.containsKey(m.getDeliveryTag()))
+ {
+ final String tmpFileName = unsettledFileNames.get(m.getDeliveryTag());
+ final File unsettledFile = new File(tmpDirectory,
+ tmpFileName);
+ r.acknowledge(m, new Receiver.SettledAction()
+ {
+ public void onSettled(final Binary deliveryTag)
+ {
+ int splitPoint = tmpFileName.indexOf(".");
+
+ String fileName = tmpFileName.substring(splitPoint+1);
+
+ final File dest = new File(directory, fileName);
+ if(dest.exists())
+ {
+ System.err.println("Duplicate detected - filename " + dest.getName());
+ }
+ unsettledFile.renameTo(dest);
+ unsettledFileNames.remove(deliveryTag);
+ }
+ });
+ }
+ else
+ {
+ received++;
+ List<Section> sections = m.getPayload();
+ Binary deliveryTag = m.getDeliveryTag();
+ StringBuilder tagNameBuilder = new StringBuilder();
+
+ ByteBuffer dtbuf = deliveryTag.asByteBuffer();
+ while(dtbuf.hasRemaining())
+ {
+ tagNameBuilder.append(String.format("%02x", dtbuf.get()));
+ }
+
+
+ ApplicationProperties properties = null;
+ List<Binary> data = new ArrayList<Binary>();
+ int totalSize = 0;
+ for(Section section : sections)
+ {
+ if(section instanceof ApplicationProperties)
+ {
+ properties = (ApplicationProperties) section;
+ }
+ else if(section instanceof AmqpValue)
+ {
+ AmqpValue value = (AmqpValue) section;
+ if(value.getValue() instanceof Binary)
+ {
+ Binary binary = (Binary) value.getValue();
+ data.add(binary);
+ totalSize += binary.getLength();
+
+ }
+ else
+ {
+ // TODO exception
+ }
+ }
+ else if(section instanceof Data)
+ {
+ Data value = (Data) section;
+ Binary binary = value.getValue();
+ data.add(binary);
+ totalSize += binary.getLength();
+
+ }
+ }
+ if(properties != null)
+ {
+ final String fileName = (String) properties.getValue().get("filename");
+ byte[] fileData = new byte[totalSize];
+ ByteBuffer buf = ByteBuffer.wrap(fileData);
+ int offset = 0;
+ for(Binary bin : data)
+ {
+ buf.put(bin.asByteBuffer());
+ }
+ File outputFile = new File(tmpDirectory, "~"+fileName+"~");
+ if(outputFile.exists())
+ {
+ outputFile.delete();
+ }
+ FileOutputStream fos = new FileOutputStream(outputFile);
+ fos.write(fileData);
+ fos.flush();
+ fos.close();
+
+ final File unsettledFile = new File(tmpDirectory, tagNameBuilder.toString() + "." +
+ fileName);
+ outputFile.renameTo(unsettledFile);
+ r.acknowledge(m, new Receiver.SettledAction()
+ {
+ public void onSettled(final Binary deliveryTag)
+ {
+ final File dest = new File(directory, fileName);
+ if(dest.exists())
+ {
+ System.err.println("Duplicate detected - filename " + dest.getName());
+ }
+ unsettledFile.renameTo(dest);
+
+ }
+ });
+
+ }
+ }
+ }
+ }
+ while(m != null);
+
+
+ r.close();
+ }
+ else
+ {
+ System.err.println("No such directory: " + directoryName);
+ }
+ session.close();
+ conn.close();
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace();
+ }
+ catch (FileNotFoundException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+ }
+
+ public static void main(String[] args)
+ {
+ new Filereceiver(args).run();
+ }
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filesender.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filesender.java
new file mode 100644
index 0000000000..83b305ac03
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Filesender.java
@@ -0,0 +1,276 @@
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+public class Filesender extends Util
+{
+ private static final String USAGE_STRING = "filesender [options] <address> <directory>\n\nOptions:";
+
+ protected Filesender(String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+
+ }
+
+ @Override
+ protected void run()
+ {
+ final String queue = getArgs()[0];
+ final String directoryName = getArgs()[1];
+
+ try
+ {
+ MessageDigest md5 = MessageDigest.getInstance("MD5");
+ Connection conn = newConnection();
+
+ Session session = conn.createSession();
+
+ File directory = new File(directoryName);
+ if(directory.isDirectory() && directory.canWrite())
+ {
+
+ File tmpDirectory = new File(directoryName, ".tmp");
+ if(!tmpDirectory.exists())
+ {
+ tmpDirectory.mkdir();
+ }
+
+ String[] unsettledFiles = tmpDirectory.list();
+
+
+
+ Map<Binary, Outcome> unsettled = new HashMap<Binary, Outcome>();
+ Map<Binary, String> unsettledFileNames = new HashMap<Binary, String>();
+ for(String fileName : unsettledFiles)
+ {
+ File aFile = new File(tmpDirectory, fileName);
+ if(aFile.canRead() && aFile.canWrite())
+ {
+ Binary deliveryTag = new Binary(md5.digest(fileName.getBytes()));
+ unsettled.put(deliveryTag, null);
+ unsettledFileNames.put(deliveryTag, fileName);
+ }
+ }
+
+
+ Sender s = session.createSender(queue, 10, AcknowledgeMode.EO, getLinkName(), isDurableLink(),
+ unsettled);
+
+ Map<Binary, DeliveryState> remoteUnsettled = s.getRemoteUnsettled();
+
+ for(Map.Entry<Binary, String> entry: unsettledFileNames.entrySet())
+ {
+ if(remoteUnsettled == null || !remoteUnsettled.containsKey(entry.getKey()))
+ {
+ (new File(tmpDirectory, entry.getValue())).renameTo(new File(directory, entry.getValue()));
+ }
+ }
+
+ if(remoteUnsettled != null)
+ {
+ for(Map.Entry<Binary, DeliveryState> entry : remoteUnsettled.entrySet())
+ {
+ if(entry.getValue() instanceof Accepted)
+ {
+ final String fileName = unsettledFileNames.get(entry.getKey());
+ if(fileName != null)
+ {
+
+ Message resumed = new Message();
+ resumed.setDeliveryTag(entry.getKey());
+ resumed.setDeliveryState(entry.getValue());
+ resumed.setResume(Boolean.TRUE);
+ resumed.setSettled(Boolean.TRUE);
+
+
+
+ final File unsettledFile = new File(tmpDirectory, fileName);
+ unsettledFile.delete();
+
+ s.send(resumed);
+
+ }
+
+ }
+ else if(entry.getValue() instanceof Received || entry.getValue() == null)
+ {
+ final File unsettledFile = new File(tmpDirectory, unsettledFileNames.get(entry.getKey()));
+ Message resumed = createMessageFromFile(md5, unsettledFileNames.get(entry.getKey()), unsettledFile);
+ resumed.setResume(Boolean.TRUE);
+ Sender.OutcomeAction action = new Sender.OutcomeAction()
+ {
+ public void onOutcome(Binary deliveryTag, Outcome outcome)
+ {
+ if(outcome instanceof Accepted)
+ {
+ unsettledFile.delete();
+ }
+ }
+ };
+ s.send(resumed, action);
+
+ }
+ }
+ }
+
+
+
+ String[] files = directory.list();
+
+ for(String fileName : files)
+ {
+ final File file = new File(directory, fileName);
+
+ if(file.canRead() && file.canWrite() && !file.isDirectory())
+ {
+ Message message = createMessageFromFile(md5, fileName, file);
+
+ final File unsettledFile = new File(tmpDirectory, fileName);
+
+ Sender.OutcomeAction action = new Sender.OutcomeAction()
+ {
+ public void onOutcome(Binary deliveryTag, Outcome outcome)
+ {
+ if(outcome instanceof Accepted)
+ {
+ unsettledFile.delete();
+ }
+ }
+ };
+
+ file.renameTo(unsettledFile);
+
+ s.send(message, action);
+ }
+ }
+
+ s.close();
+ }
+ else
+ {
+ System.err.println("No such directory: " + directory);
+ }
+ session.close();
+ conn.close();
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace();
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace();
+ } catch (FileNotFoundException e)
+ {
+ e.printStackTrace();
+ } catch (IOException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (NoSuchAlgorithmException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+
+ }
+
+ private Message createMessageFromFile(MessageDigest md5, String fileName, File file) throws IOException
+ {
+ FileInputStream fis = new FileInputStream(file);
+ byte[] data = new byte[(int) file.length()];
+
+ int read = fis.read(data);
+
+ fis.close();
+
+ Section applicationProperties = new ApplicationProperties(Collections.singletonMap("filename", fileName));
+ Section amqpValue = new Data(new Binary(data));
+ Message message = new Message(Arrays.asList(applicationProperties, amqpValue));
+ Binary deliveryTag = new Binary(md5.digest(fileName.getBytes()));
+ message.setDeliveryTag(deliveryTag);
+ md5.reset();
+ return message;
+ }
+
+ public static void main(String[] args)
+ {
+ new Filesender(args).run();
+ }
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Message.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Message.java
new file mode 100644
index 0000000000..7c1172898b
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Message.java
@@ -0,0 +1,148 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+public class Message
+{
+ private Binary _deliveryTag;
+ private List<Section> _payload = new ArrayList<Section>();
+ private Boolean _resume;
+ private boolean _settled;
+ private DeliveryState _deliveryState;
+ private Receiver _receiver;
+
+
+ public Message()
+ {
+ }
+
+ public Message(Collection<Section> sections)
+ {
+ _payload.addAll(sections);
+ }
+
+ public Message(Section section)
+ {
+ this(Collections.singletonList(section));
+ }
+
+ public Message(String message)
+ {
+ this(new AmqpValue(message));
+ }
+
+
+ public Binary getDeliveryTag()
+ {
+ return _deliveryTag;
+ }
+
+ public void setDeliveryTag(Binary deliveryTag)
+ {
+ _deliveryTag = deliveryTag;
+ }
+
+ public List<Section> getPayload()
+ {
+ return Collections.unmodifiableList(_payload);
+ }
+
+ private <T extends Section> T getSection(Class<T> clazz)
+ {
+ for(Section s : _payload)
+ {
+ if(clazz.isAssignableFrom(s.getClass()))
+ {
+ return (T) s;
+ }
+ }
+ return null;
+ }
+
+ public ApplicationProperties getApplicationProperties()
+ {
+ return getSection(ApplicationProperties.class);
+ }
+
+ public Properties getProperties()
+ {
+ return getSection(Properties.class);
+ }
+
+ public Header getHeader()
+ {
+ return getSection(Header.class);
+ }
+
+
+ public void setResume(final Boolean resume)
+ {
+ _resume = resume;
+ }
+
+ public boolean isResume()
+ {
+ return Boolean.TRUE.equals(_resume);
+ }
+
+ public void setDeliveryState(DeliveryState state)
+ {
+ _deliveryState = state;
+ }
+
+ public DeliveryState getDeliveryState()
+ {
+ return _deliveryState;
+ }
+
+ public void setSettled(boolean settled)
+ {
+ _settled = settled;
+ }
+
+ public boolean getSettled()
+ {
+ return _settled;
+ }
+
+ public void setReceiver(final Receiver receiver)
+ {
+ _receiver = receiver;
+ }
+
+ public Receiver getReceiver()
+ {
+ return _receiver;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/ReadBytes.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/ReadBytes.java
new file mode 100644
index 0000000000..07ae54b54f
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/ReadBytes.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+
+public class ReadBytes
+{
+
+ public static void main(String[] args) throws IOException, AmqpErrorException
+ {
+
+ if(args.length == 0)
+ {
+ readBytes(System.in);
+ }
+ else
+ {
+ for(String fileName : args)
+ {
+ System.out.println("=========================== " + fileName + " ===========================");
+ final FileInputStream fis = new FileInputStream(fileName);
+ readBytes(fis);
+ fis.close();
+ }
+ }
+
+ }
+
+ private static void readBytes(final InputStream inputStream) throws IOException, AmqpErrorException
+ {
+ byte[] bytes = new byte[4096];
+
+ ValueHandler valueHandler = new ValueHandler(AMQPDescribedTypeRegistry.newInstance());
+
+ int count;
+
+ while((count = inputStream.read(bytes))!=-1)
+ {
+ ByteBuffer buf = ByteBuffer.wrap(bytes);
+ buf.limit(count);
+ while(buf.hasRemaining())
+ {
+
+ final Object value = valueHandler.parse(buf);
+ System.out.print((value == null ? "" : value.getClass().getName() + ":") +value +"\n");
+
+ }
+ }
+
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receive.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receive.java
new file mode 100644
index 0000000000..0da9dc3fb7
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receive.java
@@ -0,0 +1,246 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.commons.cli.*;
+import org.apache.qpid.amqp_1_0.type.messaging.ExactSubjectFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.MatchingSubjectFilter;
+
+import java.util.Collections;
+
+public class Receive extends Util
+{
+ private static final String USAGE_STRING = "receive [options] <address> \n\nOptions:";
+ private static final UnsignedLong UNSIGNED_LONG_ONE = UnsignedLong.valueOf(1L);
+ private UnsignedLong _lastCorrelationId;
+
+ public static void main(String[] args)
+ {
+ new Receive(args).run();
+ }
+
+
+ public Receive(final String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasWindowSizeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasFilterOption()
+ {
+ return true;
+ }
+
+ protected void run()
+ {
+
+ try
+ {
+ final String queue = getArgs()[0];
+
+ String message = "";
+
+ Connection conn = newConnection();
+
+
+ Session session = conn.createSession();
+
+ Filter filter = null;
+ if(getFilter() != null)
+ {
+ String[] filterParts = getFilter().split("=",2);
+ if("exact-subject".equals(filterParts[0]))
+ {
+ filter = new ExactSubjectFilter(filterParts[1]);
+ }
+ else if("matching-subject".equals(filterParts[0]))
+ {
+ filter = new MatchingSubjectFilter(filterParts[1]);
+ }
+ else
+ {
+ System.err.println("Unknown filter type: " + filterParts[0]);
+ }
+ }
+
+ Receiver r =
+ filter == null
+ ? session.createReceiver(queue, getMode(), getLinkName(), isDurableLink())
+ : session.createReceiver(queue, getMode(), getLinkName(), isDurableLink(), Collections.singletonMap(Symbol.valueOf("filter"), filter), null);
+ Transaction txn = null;
+
+ int credit = 0;
+ int receivedCount = 0;
+
+ if(!useStdIn())
+ {
+ if(getArgs().length <= 2)
+ {
+
+ Transaction txn2 = null;
+ if(useTran())
+ {
+ txn = session.createSessionLocalTransaction();
+ txn2 = session.createSessionLocalTransaction();
+ }
+
+ for(int i = 0; i < getCount(); i++)
+ {
+
+ if(credit == 0)
+ {
+ if(getCount() - i <= getWindowSize())
+ {
+ credit = getCount() - i;
+
+ }
+ else
+ {
+ credit = getWindowSize();
+
+ }
+
+ {
+ r.setCredit(UnsignedInteger.valueOf(credit), false);
+ }
+ if(!isBlock())
+ r.drain();
+ }
+
+ Message m = isBlock() ? r.receive() : r.receive(1000L);
+ credit--;
+ if(m==null)
+ {
+ break;
+ }
+
+
+
+ r.acknowledge(m.getDeliveryTag(),txn);
+
+ receivedCount++;
+
+ System.out.println("Received Message : " + m.getPayload());
+ }
+
+ if(useTran())
+ {
+ txn.commit();
+ }
+ }
+ else
+ {
+ // TODO
+ }
+ }
+ else
+ {
+ // TODO
+ }
+ r.close();
+ session.close();
+ conn.close();
+ System.out.println("Total Messages Received: " + receivedCount);
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+ }
+
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java
new file mode 100644
index 0000000000..ad390fd498
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Receiver.java
@@ -0,0 +1,561 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoder;
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.LinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkListener;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+import java.util.*;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+public class Receiver implements DeliveryStateHandler
+{
+ private ReceivingLinkEndpoint _endpoint;
+ private int _id;
+ private static final UnsignedInteger DEFAULT_INITIAL_CREDIT = UnsignedInteger.valueOf(100);
+ private Session _session;
+
+ private Queue<Transfer> _prefetchQueue = new ConcurrentLinkedQueue<Transfer>();
+ private Map<Binary, SettledAction> _unsettledMap = new HashMap<Binary, SettledAction>();
+ private MessageArrivalListener _messageArrivalListener;
+ private org.apache.qpid.amqp_1_0.type.transport.Error _error;
+
+ public Receiver(final Session session,
+ final String linkName,
+ final Target target,
+ final Source source,
+ final AcknowledgeMode ackMode) throws AmqpErrorException
+ {
+ this(session, linkName, target, source, ackMode, false);
+ }
+
+ public Receiver(final Session session,
+ final String linkName,
+ final Target target,
+ final Source source,
+ final AcknowledgeMode ackMode,
+ boolean isDurable) throws AmqpErrorException
+ {
+ this(session,linkName,target,source,ackMode,isDurable,null);
+ }
+
+ public Receiver(final Session session,
+ final String linkName,
+ final Target target,
+ final Source source,
+ final AcknowledgeMode ackMode,
+ final boolean isDurable,
+ final Map<Binary,Outcome> unsettled) throws AmqpErrorException
+ {
+
+ _session = session;
+ if(isDurable)
+ {
+ source.setDurable(TerminusDurability.UNSETTLED_STATE);
+ source.setExpiryPolicy(TerminusExpiryPolicy.NEVER);
+ }
+ else if(source != null)
+ {
+ source.setDurable(TerminusDurability.NONE);
+ source.setExpiryPolicy(TerminusExpiryPolicy.LINK_DETACH);
+ }
+ _endpoint = session.getEndpoint().createReceivingLinkEndpoint(linkName, target, source,
+ UnsignedInteger.ZERO);
+
+ _endpoint.setDeliveryStateHandler(this);
+
+ switch(ackMode)
+ {
+ case ALO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.UNSETTLED);
+ _endpoint.setReceivingSettlementMode(ReceiverSettleMode.FIRST);
+ break;
+ case AMO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.SETTLED);
+ _endpoint.setReceivingSettlementMode(ReceiverSettleMode.FIRST);
+ break;
+ case EO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.UNSETTLED);
+ _endpoint.setReceivingSettlementMode(ReceiverSettleMode.SECOND);
+ break;
+
+ }
+
+ _endpoint.setLinkEventListener(new ReceivingLinkListener.DefaultLinkEventListener()
+ {
+ @Override public void messageTransfer(final Transfer xfr)
+ {
+ _prefetchQueue.add(xfr);
+ postPrefetchAction();
+ }
+
+ @Override
+ public void remoteDetached(final LinkEndpoint endpoint, final Detach detach)
+ {
+ _error = detach.getError();
+ super.remoteDetached(endpoint, detach);
+ }
+ });
+
+ _endpoint.setLocalUnsettled(unsettled);
+ _endpoint.attach();
+
+ synchronized(_endpoint.getLock())
+ {
+ while(!_endpoint.isAttached() && !_endpoint.isDetached())
+ {
+ try
+ {
+ _endpoint.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+
+ if(_endpoint.getSource() == null)
+ {
+ synchronized(_endpoint.getLock())
+ {
+ while(!_endpoint.isDetached())
+ {
+ try
+ {
+ _endpoint.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+ throw new AmqpErrorException(getError());
+ }
+ else
+ {
+
+ }
+ }
+
+ private void postPrefetchAction()
+ {
+ if(_messageArrivalListener != null)
+ {
+ _messageArrivalListener.messageArrived(this);
+ }
+ }
+
+ public void setCredit(UnsignedInteger credit, boolean window)
+ {
+ _endpoint.setLinkCredit(credit);
+ _endpoint.setCreditWindow(window);
+
+ }
+
+
+ public String getAddress()
+ {
+ return ((Source)_endpoint.getSource()).getAddress();
+ }
+
+ public Map getFilter()
+ {
+ return ((Source)_endpoint.getSource()).getFilter();
+ }
+
+ public Message receive()
+ {
+ return receive(-1L);
+ }
+
+ public Message receive(boolean wait)
+ {
+ return receive(wait ? -1L : 0L);
+ }
+
+ // 0 means no wait, -1 wait forever
+ public Message receive(long wait)
+ {
+ Message m = null;
+ Transfer xfr;
+ long endTime = wait > 0L ? System.currentTimeMillis() + wait : 0L;
+
+ while((xfr = receiveFromPrefetch(wait)) != null )
+ {
+
+ if(!Boolean.TRUE.equals(xfr.getAborted()))
+ {
+ Binary deliveryTag = xfr.getDeliveryTag();
+ Boolean resume = xfr.getResume();
+
+ List<Section> sections = new ArrayList<Section>();
+ List<ByteBuffer> payloads = new ArrayList<ByteBuffer>();
+ int totalSize = 0;
+
+ boolean hasMore;
+ do
+ {
+ hasMore = Boolean.TRUE.equals(xfr.getMore());
+
+ ByteBuffer buf = xfr.getPayload();
+
+ if(buf != null)
+ {
+
+ totalSize += buf.remaining();
+
+ payloads.add(buf);
+ }
+ if(hasMore)
+ {
+ xfr = receiveFromPrefetch(0L);
+ if(xfr== null)
+ {
+ // TODO - this is wrong!!!!
+ System.out.println("eeek");
+ }
+ }
+ }
+ while(hasMore && !Boolean.TRUE.equals(xfr.getAborted()));
+
+ if(!Boolean.TRUE.equals(xfr.getAborted()))
+ {
+ ByteBuffer allPayload = ByteBuffer.allocate(totalSize);
+ for(ByteBuffer payload : payloads)
+ {
+ allPayload.put(payload);
+ }
+ allPayload.flip();
+ SectionDecoder decoder = _session.getSectionDecoder();
+
+ try
+ {
+ sections = decoder.parseAll(allPayload);
+ }
+ catch (AmqpErrorException e)
+ {
+ // todo - throw a sensible error
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ m = new Message(sections);
+ m.setDeliveryTag(deliveryTag);
+ m.setResume(resume);
+ m.setReceiver(this);
+ break;
+ }
+ }
+
+ if(wait > 0L)
+ {
+ wait = endTime - System.currentTimeMillis();
+ if(wait <=0L)
+ {
+ break;
+ }
+ }
+ }
+
+
+ return m;
+
+ }
+
+ private Transfer receiveFromPrefetch(long wait)
+ {
+ long endTime = ((wait >0L) ? (System.currentTimeMillis() + wait) : 0L);
+ final Object lock = _endpoint.getLock();
+ synchronized(lock)
+ {
+ Transfer xfr;
+ while(((xfr = _prefetchQueue.peek()) == null) && !_endpoint.isDrained() && !_endpoint.isDetached()
+ && wait != 0)
+ {
+ try
+ {
+ if(wait>0L)
+ {
+ lock.wait(wait);
+ }
+ else if(wait<0L)
+ {
+ lock.wait();
+ }
+ }
+ catch (InterruptedException e)
+ {
+ return null;
+ }
+ if(wait > 0L)
+ {
+ wait = endTime - System.currentTimeMillis();
+ if(wait <= 0L)
+ {
+ break;
+ }
+ }
+
+ }
+ if(xfr != null)
+ {
+ _prefetchQueue.poll();
+
+ }
+
+ return xfr;
+ }
+
+ }
+
+
+ public void release(final Message m)
+ {
+ release(m.getDeliveryTag());
+ }
+
+ public void release(Binary deliveryTag)
+ {
+ update(new Released(), deliveryTag, null, null);
+ }
+
+
+ public void modified(Binary tag)
+ {
+ final Modified outcome = new Modified();
+ outcome.setDeliveryFailed(true);
+
+ update(outcome, tag, null, null);
+ }
+
+ public void acknowledge(final Message m)
+ {
+ acknowledge(m.getDeliveryTag());
+ }
+
+ public void acknowledge(final Message m, SettledAction a)
+ {
+ acknowledge(m.getDeliveryTag(), a);
+ }
+
+
+ public void acknowledge(final Message m, Transaction txn)
+ {
+ acknowledge(m.getDeliveryTag(), txn);
+ }
+
+
+ public void acknowledge(final Binary deliveryTag)
+ {
+ acknowledge(deliveryTag, null, null);
+ }
+
+
+ public void acknowledge(final Binary deliveryTag, SettledAction a)
+ {
+ acknowledge(deliveryTag, null, a);
+ }
+
+ public void acknowledge(final Binary deliveryTag, final Transaction txn)
+ {
+ acknowledge(deliveryTag, txn, null);
+ }
+
+ public void acknowledge(final Binary deliveryTag, final Transaction txn, SettledAction action)
+ {
+ update(new Accepted(), deliveryTag, txn, action);
+ }
+
+ public void update(Outcome outcome, final Binary deliveryTag, final Transaction txn, SettledAction action)
+ {
+
+ DeliveryState state;
+ if(txn != null)
+ {
+ TransactionalState txnState = new TransactionalState();
+ txnState.setOutcome(outcome);
+ txnState.setTxnId(txn.getTxnId());
+ state = txnState;
+ }
+ else
+ {
+ state = (DeliveryState) outcome;
+ }
+ boolean settled = txn == null && !ReceiverSettleMode.SECOND.equals(_endpoint.getReceivingSettlementMode());
+
+ if(!(settled || action == null))
+ {
+ _unsettledMap.put(deliveryTag, action);
+ }
+
+ _endpoint.updateDisposition(deliveryTag,state, settled);
+ }
+
+ public Error getError()
+ {
+ return _error;
+ }
+
+ public void acknowledgeAll(Message m)
+ {
+ acknowledgeAll(m.getDeliveryTag());
+ }
+
+ public void acknowledgeAll(Binary deliveryTag)
+ {
+ acknowledgeAll(deliveryTag, null, null);
+ }
+
+ public void acknowledgeAll(Binary deliveryTag, final Transaction txn, SettledAction action)
+ {
+ updateAll(new Accepted(), deliveryTag, txn, action);
+ }
+
+ public void updateAll(Outcome outcome, Binary deliveryTag)
+ {
+ updateAll(outcome, deliveryTag, null, null);
+ }
+
+ public void updateAll(Outcome outcome, Binary deliveryTag, final Transaction txn, SettledAction action)
+ {
+ DeliveryState state;
+
+ if(txn != null)
+ {
+ TransactionalState txnState = new TransactionalState();
+ txnState.setOutcome(outcome);
+ txnState.setTxnId(txn.getTxnId());
+ state = txnState;
+ }
+ else
+ {
+ state = (DeliveryState) outcome;
+ }
+ boolean settled = txn == null && !ReceiverSettleMode.SECOND.equals(_endpoint.getReceivingSettlementMode());
+
+ if(!(settled || action == null))
+ {
+ _unsettledMap.put(deliveryTag, action);
+ }
+ _endpoint.updateAllDisposition(deliveryTag, state, settled);
+ }
+
+
+
+ public void close()
+ {
+ _endpoint.setTarget(null);
+ _endpoint.close();
+ Message msg;
+ while((msg = receive(-1l)) != null)
+ {
+ release(msg);
+ }
+
+ }
+
+
+ public void detach()
+ {
+ _endpoint.setTarget(null);
+ _endpoint.detach();
+ Message msg;
+ while((msg = receive(-1l)) != null)
+ {
+ release(msg);
+ }
+
+ }
+
+ public void drain()
+ {
+ _endpoint.drain();
+ }
+
+ public void setCreditWithTransaction(final UnsignedInteger credit, final Transaction txn)
+ {
+ _endpoint.setLinkCredit(credit);
+ _endpoint.setTransactionId(txn == null ? null : txn.getTxnId());
+ _endpoint.setCreditWindow(false);
+
+ }
+
+ public void handle(final Binary deliveryTag, final DeliveryState state, final Boolean settled)
+ {
+ if(Boolean.TRUE.equals(settled))
+ {
+ SettledAction action = _unsettledMap.remove(deliveryTag);
+ if(action != null)
+ {
+ action.onSettled(deliveryTag);
+ }
+ }
+ }
+
+ public Map<Binary, Outcome> getRemoteUnsettled()
+ {
+ return _endpoint.getInitialUnsettledMap();
+ }
+
+
+ public void setMessageArrivalListener(final MessageArrivalListener messageArrivalListener)
+ {
+ synchronized(_endpoint.getLock())
+ {
+ _messageArrivalListener = messageArrivalListener;
+ }
+ }
+
+ public Session getSession()
+ {
+ return _session;
+ }
+
+ public org.apache.qpid.amqp_1_0.type.Source getSource()
+ {
+ return _endpoint.getSource();
+ }
+
+ public static interface SettledAction
+ {
+ public void onSettled(Binary deliveryTag);
+ }
+
+
+ public interface MessageArrivalListener
+ {
+ void messageArrived(Receiver receiver);
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Request.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Request.java
new file mode 100644
index 0000000000..6e1d15376c
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Request.java
@@ -0,0 +1,249 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+import org.apache.commons.cli.*;
+
+import java.util.Arrays;
+
+public class Request extends Util
+{
+ private static final String USAGE_STRING = "request [options] <address> [<content> ...]\n\nOptions:";
+
+ public static void main(String[] args)
+ {
+ new Request(args).run();
+ }
+
+ public Request(String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasWindowSizeOption()
+ {
+ return true;
+ }
+
+ public void run()
+ {
+
+ try
+ {
+
+
+ final String queue = getArgs()[0];
+
+ String message = "";
+
+ Connection conn = newConnection();
+ Session session = conn.createSession();
+
+ Connection conn2;
+ Session session2;
+ Receiver responseReceiver;
+
+ if(isUseMultipleConnections())
+ {
+ conn2 = newConnection();
+ session2 = conn2.createSession();
+ responseReceiver = session2.createTemporaryQueueReceiver();
+ }
+ else
+ {
+ conn2 = null;
+ session2 = null;
+ responseReceiver = session.createTemporaryQueueReceiver();
+ }
+
+
+
+
+ responseReceiver.setCredit(UnsignedInteger.valueOf(getWindowSize()), true);
+
+
+
+ Sender s = session.createSender(queue, getWindowSize(), getMode());
+
+ Transaction txn = null;
+
+ if(useTran())
+ {
+ txn = session.createSessionLocalTransaction();
+ }
+
+ int received = 0;
+
+ if(getArgs().length >= 2)
+ {
+ message = getArgs()[1];
+ if(message.length() < getMessageSize())
+ {
+ StringBuilder builder = new StringBuilder(getMessageSize());
+ builder.append(message);
+ for(int x = message.length(); x < getMessageSize(); x++)
+ {
+ builder.append('.');
+ }
+ message = builder.toString();
+ }
+
+ for(int i = 0; i < getCount(); i++)
+ {
+ Properties properties = new Properties();
+ properties.setMessageId(UnsignedLong.valueOf(i));
+ properties.setReplyTo(responseReceiver.getAddress());
+
+ AmqpValue amqpValue = new AmqpValue(message);
+ Section[] sections = { new Header() , properties, amqpValue};
+ final Message message1 = new Message(Arrays.asList(sections));
+
+ s.send(message1, txn);
+
+ Message responseMessage = responseReceiver.receive(false);
+ if(responseMessage != null)
+ {
+ responseReceiver.acknowledge(responseMessage.getDeliveryTag(),txn);
+ received++;
+ }
+ }
+ }
+
+ if(txn != null)
+ {
+ txn.commit();
+ }
+
+
+ while(received < getCount())
+ {
+ Message responseMessage = responseReceiver.receive();
+ responseReceiver.acknowledge(responseMessage.getDeliveryTag());
+ received++;
+ }
+
+
+
+
+ s.close();
+ session.close();
+ conn.close();
+
+ if(session2 != null)
+ {
+ session2.close();
+ conn2.close();
+ }
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+ }
+
+ protected boolean hasSingleLinkPerConnectionMode()
+ {
+ return true;
+ }
+
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Respond.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Respond.java
new file mode 100644
index 0000000000..8d9de4893f
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Respond.java
@@ -0,0 +1,347 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+import org.apache.commons.cli.*;
+
+import java.util.*;
+
+public class Respond extends Util
+{
+ private static final String USAGE_STRING = "respond [options] <address>\n\nOptions:";
+ private Connection _conn;
+ private Session _session;
+ private Receiver _receiver;
+ private Transaction _txn;
+ private Map<String,Sender> _senders;
+ private UnsignedLong _responseMsgId = UnsignedLong.ZERO;
+ private Connection _conn2;
+ private Session _session2;
+
+ public Respond(final String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasSingleLinkPerConnectionMode()
+ {
+ return true;
+ }
+
+
+ @Override
+ protected boolean hasWindowSizeOption()
+ {
+ return true;
+ }
+
+ public static void main(String[] args)
+ {
+ new Respond(args).run();
+ }
+
+ public void run()
+ {
+ try
+ {
+
+ _senders = new HashMap<String, Sender>();
+
+ final String queue = getArgs()[0];
+
+ String message = "";
+
+ _conn = newConnection();
+
+
+
+ if(isUseMultipleConnections())
+ {
+ _conn2 = newConnection();
+ _session2 = _conn2.createSession();
+ }
+
+
+ _session = _conn.createSession();
+
+
+ _receiver = _session.createReceiver(queue, getMode());
+ _txn = null;
+
+ int credit = 0;
+ int receivedCount = 0;
+ _responseMsgId = UnsignedLong.ZERO;
+
+ Random random = null;
+ int batch = 0;
+ List<Message> txnMessages = null;
+ if(useTran())
+ {
+ if(getRollbackRatio() != 0)
+ {
+ random = new Random();
+ }
+ batch = getBatchSize();
+ _txn = _session.createSessionLocalTransaction();
+ txnMessages = new ArrayList<Message>(batch);
+ }
+
+
+ for(int i = 0; receivedCount < getCount(); i++)
+ {
+
+ if(credit == 0)
+ {
+ if(getCount() - i <= getWindowSize())
+ {
+ credit = getCount() - i;
+
+ }
+ else
+ {
+ credit = getWindowSize();
+
+ }
+
+ _receiver.setCredit(UnsignedInteger.valueOf(credit), false);
+
+ if(!isBlock())
+ _receiver.drain();
+ }
+
+ Message m = isBlock() ? (receivedCount == 0 ? _receiver.receive() : _receiver.receive(10000L)) : _receiver.receive(1000L);
+ credit--;
+ if(m==null)
+ {
+ if(useTran() && batch != getBatchSize())
+ {
+ _txn.commit();
+ }
+ break;
+ }
+
+ System.out.println("Received Message: " + m.getPayload());
+
+ respond(m);
+
+
+
+ if(useTran())
+ {
+
+ txnMessages.add(m);
+
+ if(--batch == 0)
+ {
+
+ if(getRollbackRatio() == 0 || random.nextDouble() >= getRollbackRatio())
+ {
+ _txn.commit();
+ txnMessages.clear();
+ receivedCount += getBatchSize();
+ }
+ else
+ {
+ System.out.println("Random Rollback");
+ _txn.rollback();
+ double result;
+ do
+ {
+ _txn = _session.createSessionLocalTransaction();
+
+ for(Message msg : txnMessages)
+ {
+ respond(msg);
+ }
+
+ result = random.nextDouble();
+ if(result<getRollbackRatio())
+ {
+ _txn.rollback();
+ }
+ else
+ {
+ _txn.commit();
+ txnMessages.clear();
+ receivedCount += getBatchSize();
+ }
+ }
+ while(result < getRollbackRatio());
+ }
+ _txn = _session.createSessionLocalTransaction();
+
+ batch = getBatchSize();
+ }
+ }
+ else
+ {
+ receivedCount++;
+ }
+
+ }
+
+
+ for(Sender s : _senders.values())
+ {
+ s.close();
+ }
+
+ _receiver.close();
+ _session.close();
+ _conn.close();
+ System.out.println("Received: " + receivedCount);
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ }
+
+ private void respond(Message m) throws Sender.SenderCreationException
+ {
+ List<Section> sections = m.getPayload();
+ String replyTo = null;
+ Object correlationId = null;
+ for(Section section : sections)
+ {
+ if(section instanceof Properties)
+ {
+ replyTo = getResponseQueue() == null ? ((Properties)section).getReplyTo() : getResponseQueue();
+ correlationId = ((Properties) section).getMessageId();
+ break;
+ }
+ }
+
+ if(replyTo != null)
+ {
+ Sender s = _senders.get(replyTo);
+ if(s == null)
+ {
+ s = (isUseMultipleConnections() ? _session2 : _session).createSender(replyTo,getWindowSize());
+ _senders.put(replyTo, s);
+ }
+
+ List<Section> replySections = new ArrayList<Section>(sections);
+
+ ListIterator<Section> sectionIterator = replySections.listIterator();
+
+ while(sectionIterator.hasNext())
+ {
+ Section section = sectionIterator.next();
+ if(section instanceof Properties)
+ {
+ Properties newProps = new Properties();
+ newProps.setTo(replyTo);
+ newProps.setCorrelationId(correlationId);
+ newProps.setMessageId(_responseMsgId);
+ _responseMsgId = _responseMsgId.add(UnsignedLong.ONE);
+ sectionIterator.set(newProps);
+ }
+ }
+
+ Message replyMessage = new Message(replySections);
+ System.out.println("Sent Message: " + replySections);
+ s.send(replyMessage, _txn);
+
+ }
+ _receiver.acknowledge(m.getDeliveryTag(), _txn);
+ }
+
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Send.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Send.java
new file mode 100644
index 0000000000..6f6575e083
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Send.java
@@ -0,0 +1,244 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.util.Arrays;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.messaging.Data;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+import org.apache.commons.cli.*;
+
+public class Send extends Util
+{
+ private static final String USAGE_STRING = "send [options] <address> [<content> ...]\n\nOptions:";
+ private static final char[] HEX = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
+
+
+ public static void main(String[] args) throws Sender.SenderCreationException, Sender.SenderClosingException, Connection.ConnectionException
+ {
+ new Send(args).run();
+ }
+
+
+ public Send(final String[] args)
+ {
+ super(args);
+ }
+
+ @Override
+ protected boolean hasLinkDurableOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasLinkNameOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasResponseQueueOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasSizeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasBlockOption()
+ {
+ return false;
+ }
+
+ @Override
+ protected boolean hasStdInOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasTxnOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasModeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasCountOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasWindowSizeOption()
+ {
+ return true;
+ }
+
+ @Override
+ protected boolean hasSubjectOption()
+ {
+ return true;
+ }
+
+ public void run()
+ {
+
+ final String queue = getArgs()[0];
+
+ String message = "";
+
+ try
+ {
+ Connection conn = newConnection();
+
+ Session session = conn.createSession();
+
+
+ Sender s = session.createSender(queue, getWindowSize(), getMode(), getLinkName());
+
+ Transaction txn = null;
+
+ if(useTran())
+ {
+ txn = session.createSessionLocalTransaction();
+ }
+
+ if(!useStdIn())
+ {
+ if(getArgs().length <= 2)
+ {
+ if(getArgs().length == 2)
+ {
+ message = getArgs()[1];
+ }
+ for(int i = 0; i < getCount(); i++)
+ {
+
+ Properties properties = new Properties();
+ properties.setMessageId(UnsignedLong.valueOf(i));
+ if(getSubject() != null)
+ {
+ properties.setSubject(getSubject());
+ }
+ Section bodySection;
+ byte[] bytes = (message + " " + i).getBytes();
+ if(bytes.length < getMessageSize())
+ {
+ byte[] origBytes = bytes;
+ bytes = new byte[getMessageSize()];
+ System.arraycopy(origBytes,0,bytes,0,origBytes.length);
+ for(int x = origBytes.length; x < bytes.length; x++)
+ {
+ bytes[x] = (byte) '.';
+ }
+ bodySection = new Data(new Binary(bytes));
+ }
+ else
+ {
+ bodySection = new AmqpValue(message + " " + i);
+ }
+
+ Section[] sections = {properties, bodySection};
+ final Message message1 = new Message(Arrays.asList(sections));
+
+ s.send(message1, txn);
+ }
+ }
+ else
+ {
+ for(int i = 1; i < getArgs().length; i++)
+ {
+ s.send(new Message(getArgs()[i]), txn);
+ }
+
+ }
+ }
+ else
+ {
+ LineNumberReader buf = new LineNumberReader(new InputStreamReader(System.in));
+
+
+ try
+ {
+ while((message = buf.readLine()) != null)
+ {
+ s.send(new Message(message), txn);
+ }
+ }
+ catch (IOException e)
+ {
+ // TODO
+ e.printStackTrace();
+ }
+ }
+
+ if(txn != null)
+ {
+ txn.commit();
+ }
+
+ s.close();
+
+ session.close();
+ conn.close();
+ }
+ catch (Sender.SenderClosingException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Connection.ConnectionException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ catch (Sender.SenderCreationException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+
+ }
+
+ protected void printUsage(Options options)
+ {
+ HelpFormatter formatter = new HelpFormatter();
+ formatter.printHelp(USAGE_STRING, options );
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SendBytes.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SendBytes.java
new file mode 100644
index 0000000000..6f97ecd810
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/SendBytes.java
@@ -0,0 +1,331 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.codec.FrameWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+import org.apache.qpid.amqp_1_0.type.transport.Flow;
+
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class SendBytes
+{
+
+ public static void main(String[] args) throws
+ Sender.SenderCreationException,
+ Sender.SenderClosingException,
+ Connection.ConnectionException,
+ IOException, ParseException
+ {
+ Transfer xfr = new Transfer();
+ Flow fs = new Flow();
+ fs.setIncomingWindow(UnsignedInteger.valueOf(1024));
+ fs.setDeliveryCount(UnsignedInteger.valueOf(2));
+ fs.setLinkCredit(UnsignedInteger.valueOf(18));
+ fs.setAvailable(UnsignedInteger.valueOf(0));
+ fs.setDrain(false);
+
+ xfr.setHandle(UnsignedInteger.valueOf(0));
+ xfr.setDeliveryTag(new Binary("\"queue\"<-6ec024a7-d98e-4196-9348-15f6026c32ca:0".getBytes()));
+ //xfr.setDeliveryTag(new Binary(new byte[] {0}));
+ xfr.setDeliveryId(UnsignedInteger.valueOf(0));
+ xfr.setSettled(true);
+
+
+ Header h = new Header();
+ Properties p = new Properties();
+ p.setTo("queue");
+ //p.setMessageId(new Binary(UUID.randomUUID().toString().getBytes()));
+
+ Footer f = new Footer(Collections.EMPTY_MAP);
+
+ Section[] sections = new Section[] { h,p,f};
+ //Section[] sections = new Section[] { b };
+ //Section[] sections = { h,p, b};
+/*
+ Fragment[] fragments = new Fragment[5];
+
+ final AMQPDescribedTypeRegistry typeRegistry = AMQPDescribedTypeRegistry.newInstance().registerTransportLayer().registerMessagingLayer();
+
+ SectionEncoderImpl encoder = new SectionEncoderImpl(typeRegistry);
+
+ int num = 0;
+ int i = 0;
+ for(Section s : sections)
+ {
+ Fragment frag = new Fragment();
+
+ frag.setPayload(s.encode(encoder));
+ frag.setFirst(true);
+ frag.setLast(true);
+ frag.setSectionCode(s.getSectionCode());
+ frag.setSectionNumber(UnsignedInteger.valueOf(num++));
+ frag.setSectionOffset(UnsignedLong.valueOf(0L));
+ fragments[i++] =frag;
+ }
+
+ xfr.setFragments(fragments);
+*/
+
+ encodeTypes("xfr",xfr);
+
+ final byte[] result;
+ final Object input = xfr;
+/*
+ result = encode(1024, input);
+
+ boolean ok = true;
+
+ for(int j = 10; ok && j < 400; j++)
+ {
+
+ byte[] result2 = encode(j,input);
+
+ for(int i = 0; i <400; i++)
+ {
+ if(result[i] != result2[i])
+ {
+ System.out.println("result differs at " + i + " Splitting at " + j+ " [" + result[i] + " - " + result2[i] + "]");
+ //break;
+ //ok = false;
+
+ }
+ }
+ }*/
+ //System.out.println(Arrays.equals(result, result2));
+
+ //doEncodes();
+ /*OutputStream out = System.out;
+ if(args.length > 0)
+ {
+ out = new FileOutputStream(args[0]);
+ }
+
+ Transfer xfr = new Transfer();
+ fs.setSessionCredit(UnsignedInteger.valueOf(1024));
+ fs.setTransferCount(UnsignedInteger.valueOf(2));
+ fs.setLinkCredit(UnsignedInteger.valueOf(18));
+ fs.setAvailable(UnsignedInteger.valueOf(0));
+ fs.setDrain(false);
+
+ xfr.setHandle(UnsignedInteger.valueOf(0));
+ //xfr.setDeliveryTag(new Binary("\"queue\"<-6ec024a7-d98e-4196-9348-15f6026c32ca:0".getBytes()));
+ xfr.setDeliveryTag(new Binary(new byte[] {0}));
+ xfr.setTransferId(UnsignedInteger.valueOf(0));
+ xfr.setSettled(true);
+ xfr.setFlowState(fs);
+
+ Header h = new Header();
+ h.setTransmitTime(new Date(System.currentTimeMillis()));
+ Properties p = new Properties();
+ p.setTo(new Address("queue"));
+ //p.setMessageId(new Binary(UUID.randomUUID().toString().getBytes()));
+ AmqpMapSection m = new AmqpMapSection();
+ DataSection b = new DataSection("Hello World!".getBytes());
+
+ Footer f = new Footer();
+
+ Section[] sections = new Section[] { h,p,m,b,f};
+ //Section[] sections = new Section[] { b };
+ //Section[] sections = { h,p, b};
+ List<Fragment> fragments = new ArrayList<Fragment>(5);
+
+ final AMQPDescribedTypeRegistry typeRegistry = AMQPDescribedTypeRegistry.newInstance();
+
+ SectionEncoderImpl encoder = new SectionEncoderImpl(typeRegistry);
+
+ for(Section s : sections)
+ {
+ Fragment frag = new Fragment();
+
+ frag.setPayload(s.encode(encoder));
+ frag.setFirst(true);
+ frag.setLast(true);
+ frag.setFormatCode(s.getSectionCode());
+ frag.setFragmentOffset(null);
+ fragments.add(frag);
+ }
+
+ xfr.setFragments(fragments);
+
+
+ Object[] objectsToWrite = new Object[] { xfr };
+ ByteBuffer buf = ByteBuffer.allocate(4096);
+
+
+ for(Object obj : objectsToWrite)
+ {
+ ValueWriter writer = typeRegistry.getValueWriter(obj);
+
+ int count;
+
+
+ do
+ {
+ count = writer.writeToBuffer(buf);
+ out.write(buf.array(), buf.arrayOffset(), count);
+ buf.clear();
+ } while (!writer.isComplete());
+
+ }
+
+ out.flush();
+ out.close();*/
+
+ }
+
+ public static void doEncodes() throws IOException, ParseException
+ {
+ encodeTypes("boolean", Boolean.TRUE, Boolean.FALSE);
+ encodeTypes("ubyte", UnsignedByte.valueOf((byte)0), UnsignedByte.valueOf((byte)1 ),UnsignedByte.valueOf((byte)3), UnsignedByte.valueOf((byte)42), UnsignedByte.valueOf("255"));
+ encodeTypes("byte", Byte.valueOf((byte)0), Byte.valueOf( (byte)1), Byte.valueOf((byte) 3), Byte.valueOf((byte) 42), Byte.valueOf((byte) 127), Byte.valueOf((byte) -1), Byte.valueOf((byte) -3), Byte.valueOf((byte) -42), Byte.valueOf( (byte)-128));
+ encodeTypes("ushort", UnsignedShort.valueOf((short)0), UnsignedShort.valueOf((short)1), UnsignedShort.valueOf((short)3), UnsignedShort.valueOf((short)42), UnsignedShort.valueOf("65535"));
+ encodeTypes("short", Short.valueOf((short)0), Short.valueOf((short)1), Short.valueOf((short)3), Short.valueOf((short)42), Short.valueOf((short)32767), Short.valueOf((short)-1), Short.valueOf((short)-3), Short.valueOf((short)-42), Short.valueOf((short)-32768));
+ encodeTypes("uint",UnsignedInteger.valueOf(0), UnsignedInteger.valueOf(1), UnsignedInteger.valueOf(3), UnsignedInteger.valueOf(42), UnsignedInteger.valueOf("4294967295"));
+ encodeTypes("int", 0, 1, 3, 42, 2147483647, -1, -3, -42, -2147483648);
+ encodeTypes("ulong", UnsignedLong.valueOf(0), UnsignedLong.valueOf(1), UnsignedLong.valueOf(3), UnsignedLong.valueOf(42), UnsignedLong.valueOf("18446744073709551615"));
+ encodeTypes("long", 0l, 1l, 3l, 42l, 9223372036854775807l, -1l, -3l, -42l, -9223372036854775808l);
+ encodeTypes("float", 3.14159);
+ encodeTypes("double", Double.valueOf(3.14159265359));
+ encodeTypes("char", '?');
+
+ SimpleDateFormat df = new SimpleDateFormat("HHa z MMM d yyyy");
+
+ encodeTypes("timestamp", df.parse("9AM PST Dec 6 2010"), df.parse("9AM PST Dec 6 1910"));
+ encodeTypes("uuid", UUID.fromString("f275ea5e-0c57-4ad7-b11a-b20c563d3b71"));
+ encodeTypes("binary", new Binary( new byte[] {(byte)0xDE, (byte)0xAD, (byte)0xBE, (byte)0xEF}), new Binary(new byte[] { (byte)0xCA,(byte)0xFE, (byte)0xBA, (byte)0xBE}));
+ encodeTypes("string", "The quick brown fox jumped over the lazy cow.");
+ encodeTypes("symbol", Symbol.valueOf("connectathon"));
+ encodeTypes("list", Arrays.asList(new Object[] {Long.valueOf(1), "two", Double.valueOf(3.14159265359), null, Boolean.FALSE}));
+ Map map = new HashMap();
+ map.put("one", Long.valueOf(1));
+ map.put("two", Long.valueOf(2));
+ map.put("pi", Double.valueOf(3.14159265359));
+ map.put("list:", Arrays.asList(new Object[] {Long.valueOf(1), "two", Double.valueOf(3.14159265359), null, Boolean.FALSE}));
+ map.put(null, Boolean.TRUE);
+ encodeTypes("map", map);
+ encodeTypes("null", null);
+
+ }
+
+ static void encodeTypes(String name, Object... vals ) throws IOException
+ {
+ FileOutputStream out = new FileOutputStream("/home/rob/"+name+".out");
+ ByteBuffer buf = ByteBuffer.allocate(4096);
+ final AMQPDescribedTypeRegistry typeRegistry = AMQPDescribedTypeRegistry.newInstance();
+
+ if(vals != null)
+ {
+ for(Object obj : vals)
+ {
+ ValueWriter writer = typeRegistry.getValueWriter(obj);
+
+ int count;
+
+
+ do
+ {
+ count = writer.writeToBuffer(buf);
+ out.write(buf.array(), buf.arrayOffset(), count);
+ buf.clear();
+ } while (!writer.isComplete());
+
+ }
+ }
+ else
+ {
+ ValueWriter writer = typeRegistry.getValueWriter(null);
+
+ int count;
+
+
+ do
+ {
+ count = writer.writeToBuffer(buf);
+ out.write(buf.array(), buf.arrayOffset(), count);
+ buf.clear();
+ } while (!writer.isComplete());
+
+ }
+ out.flush();
+ out.close();
+
+ }
+
+ static byte[] encode(int size, Object... vals)
+ {
+ byte[] result = new byte[10000];
+ int pos = 0;
+
+ final AMQPDescribedTypeRegistry typeRegistry = AMQPDescribedTypeRegistry.newInstance();
+ AMQFrame frame = AMQFrame.createAMQFrame((short) 0, (FrameBody) vals[0]);
+ FrameWriter writer = new FrameWriter(typeRegistry);
+ /*for(Object obj : vals)
+ {
+ final AMQPDescribedTypeRegistry typeRegistry = AMQPDescribedTypeRegistry.newInstance();
+ ValueWriter writer = typeRegistry.getValueWriter(obj);
+*/
+ int count;
+
+ ByteBuffer buf = ByteBuffer.wrap(result, pos, size);
+
+ do
+ {
+
+ writer.writeToBuffer(buf);
+ pos = buf.position();
+ buf = ByteBuffer.wrap(result, pos, size);
+ if(!writer.isComplete())
+ {
+ count = 3;
+ }
+
+ } while (!writer.isComplete());
+/*
+
+ }
+*/
+
+ return result;
+
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java
new file mode 100644
index 0000000000..c20eec6c8e
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Sender.java
@@ -0,0 +1,392 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.Source;
+import org.apache.qpid.amqp_1_0.type.Target;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Sender implements DeliveryStateHandler
+{
+ private SendingLinkEndpoint _endpoint;
+ private int _id;
+ private Session _session;
+ private int _windowSize;
+ private Map<Binary, OutcomeAction> _outcomeActions = Collections.synchronizedMap(new HashMap<Binary, OutcomeAction>());
+ private boolean _closed;
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr)
+ throws SenderCreationException
+ {
+ this(session, linkName, targetAddr, sourceAddr, false);
+ }
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr,
+ boolean synchronous)
+ throws SenderCreationException
+ {
+ this(session, linkName, targetAddr, sourceAddr, synchronous ? 1 : 0);
+ }
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr,
+ int window) throws SenderCreationException
+ {
+ this(session, linkName, targetAddr, sourceAddr, window, AcknowledgeMode.ALO);
+ }
+
+
+ public Sender(final Session session, final String linkName, final org.apache.qpid.amqp_1_0.type.messaging.Target target, final org.apache.qpid.amqp_1_0.type.messaging.Source source,
+ int window) throws SenderCreationException
+ {
+ this(session, linkName, target, source, window, AcknowledgeMode.ALO);
+ }
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr,
+ int window, AcknowledgeMode mode)
+ throws SenderCreationException
+ {
+ this(session, linkName, targetAddr, sourceAddr, window, mode, null);
+ }
+
+ public Sender(final Session session, final String linkName, final org.apache.qpid.amqp_1_0.type.messaging.Target target, final org.apache.qpid.amqp_1_0.type.messaging.Source source,
+ int window, AcknowledgeMode mode)
+ throws SenderCreationException
+ {
+ this(session, linkName, target, source, window, mode, null);
+ }
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr,
+ int window, AcknowledgeMode mode, Map<Binary, Outcome> unsettled)
+ throws SenderCreationException
+ {
+ this(session, linkName, targetAddr, sourceAddr, window, mode, false, unsettled);
+ }
+
+ public Sender(final Session session, final String linkName, final String targetAddr, final String sourceAddr,
+ int window, AcknowledgeMode mode, boolean isDurable, Map<Binary, Outcome> unsettled)
+ throws SenderCreationException
+ {
+ this(session, linkName, createTarget(targetAddr, isDurable), createSource(sourceAddr), window, mode, unsettled);
+ }
+
+ private static org.apache.qpid.amqp_1_0.type.messaging.Source createSource(final String sourceAddr)
+ {
+ org.apache.qpid.amqp_1_0.type.messaging.Source source = new org.apache.qpid.amqp_1_0.type.messaging.Source();
+ source.setAddress(sourceAddr);
+ return source;
+ }
+
+ private static org.apache.qpid.amqp_1_0.type.messaging.Target createTarget(final String targetAddr, final boolean isDurable)
+ {
+ org.apache.qpid.amqp_1_0.type.messaging.Target target = new org.apache.qpid.amqp_1_0.type.messaging.Target();
+ target.setAddress(targetAddr);
+ if(isDurable)
+ {
+ target.setDurable(TerminusDurability.UNSETTLED_STATE);
+ target.setExpiryPolicy(TerminusExpiryPolicy.NEVER);
+ }
+ return target;
+ }
+
+ public Sender(final Session session, final String linkName, final org.apache.qpid.amqp_1_0.type.messaging.Target target, final org.apache.qpid.amqp_1_0.type.messaging.Source source,
+ int window, AcknowledgeMode mode, Map<Binary, Outcome> unsettled)
+ throws SenderCreationException
+ {
+
+ _session = session;
+ _endpoint = session.getEndpoint().createSendingLinkEndpoint(linkName,
+ source, target, unsettled);
+
+
+ switch(mode)
+ {
+ case ALO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.UNSETTLED);
+ _endpoint.setReceivingSettlementMode(ReceiverSettleMode.FIRST);
+ break;
+ case AMO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.SETTLED);
+ break;
+ case EO:
+ _endpoint.setSendingSettlementMode(SenderSettleMode.UNSETTLED);
+ _endpoint.setReceivingSettlementMode(ReceiverSettleMode.SECOND);
+ break;
+
+ }
+ _endpoint.setDeliveryStateHandler(this);
+ _endpoint.attach();
+ _windowSize = window;
+
+ synchronized(_endpoint.getLock())
+ {
+ while(!(_endpoint.isAttached() || _endpoint.isDetached()))
+ {
+ try
+ {
+ _endpoint.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ throw new SenderCreationException(e);
+ }
+ }
+ if(_endpoint.getTarget()== null)
+ {
+ throw new SenderCreationException("Peer did not create remote endpoint for link, target: " + target.getAddress());
+ };
+ }
+ }
+
+ public Source getSource()
+ {
+ return _endpoint.getSource();
+ }
+
+ public Target getTarget()
+ {
+ return _endpoint.getTarget();
+ }
+
+ public void send(Message message)
+ {
+ send(message, null, null);
+ }
+
+ public void send(Message message, final OutcomeAction action)
+ {
+ send(message, null, action);
+ }
+
+ public void send(Message message, final Transaction txn)
+ {
+ send(message, txn, null);
+ }
+
+ public void send(Message message, final Transaction txn, OutcomeAction action)
+ {
+
+ List<Section> sections = message.getPayload();
+
+ Transfer xfr = new Transfer();
+
+ if(sections != null && !sections.isEmpty())
+ {
+ SectionEncoder encoder = _session.getSectionEncoder();
+ encoder.reset();
+
+ int sectionNumber = 0;
+ for(Section section : sections)
+ {
+ encoder.encodeObject(section);
+ }
+
+
+ Binary encoding = encoder.getEncoding();
+ ByteBuffer payload = encoding.asByteBuffer();
+ xfr.setPayload(payload);
+ }
+ if(message.getDeliveryTag() == null)
+ {
+ message.setDeliveryTag(new Binary(String.valueOf(_id++).getBytes()));
+ }
+ if(message.isResume())
+ {
+ xfr.setResume(Boolean.TRUE);
+ }
+ if(message.getDeliveryState() != null)
+ {
+ xfr.setState(message.getDeliveryState());
+ }
+
+ xfr.setDeliveryTag(message.getDeliveryTag());
+ //xfr.setSettled(_windowSize ==0);
+ if(txn != null)
+ {
+ xfr.setSettled(false);
+ TransactionalState deliveryState = new TransactionalState();
+ deliveryState.setTxnId(txn.getTxnId());
+ xfr.setState(deliveryState);
+ }
+ else
+ {
+ xfr.setSettled(message.getSettled() || _endpoint.getSendingSettlementMode() == SenderSettleMode.SETTLED);
+ }
+ final Object lock = _endpoint.getLock();
+ synchronized(lock)
+ {
+ while(!_endpoint.hasCreditToSend())
+ {
+ try
+ {
+ lock.wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ if(action != null)
+ {
+ _outcomeActions.put(message.getDeliveryTag(), action);
+ }
+ _endpoint.transfer(xfr);
+ //TODO - rationalise sending of flows
+ // _endpoint.sendFlow();
+ }
+
+ if(_windowSize != 0)
+ {
+ synchronized(lock)
+ {
+
+
+ while(_endpoint.getUnsettledCount() >= _windowSize)
+ {
+ try
+ {
+ lock.wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+
+ }
+
+
+ }
+
+ public void close() throws SenderClosingException
+ {
+
+ if(_windowSize != 0)
+ {
+ synchronized(_endpoint.getLock())
+ {
+
+
+ while(_endpoint.getUnsettledCount() > 0)
+ {
+ try
+ {
+ _endpoint.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+
+ }
+ _session.removeSender(this);
+ _endpoint.setSource(null);
+ _endpoint.detach();
+ _closed = true;
+
+ synchronized(_endpoint.getLock())
+ {
+ while(!_endpoint.isDetached())
+ {
+ try
+ {
+ _endpoint.getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ throw new SenderClosingException(e);
+ }
+ }
+ }
+ }
+
+ public boolean isClosed()
+ {
+ return _closed;
+ }
+
+ public void handle(Binary deliveryTag, DeliveryState state, Boolean settled)
+ {
+ if(state instanceof Outcome)
+ {
+ OutcomeAction action;
+ if((action = _outcomeActions.remove(deliveryTag)) != null)
+ {
+ action.onOutcome(deliveryTag, (Outcome) state);
+ }
+ if(!Boolean.TRUE.equals(settled))
+ {
+ _endpoint.updateDisposition(deliveryTag, state, true);
+ }
+ }
+ }
+
+ public Map<Binary, DeliveryState> getRemoteUnsettled()
+ {
+ return _endpoint.getInitialUnsettledMap();
+ }
+
+ public Session getSession()
+ {
+ return _session;
+ }
+
+ public class SenderCreationException extends Exception
+ {
+ public SenderCreationException(Throwable e)
+ {
+ super(e);
+ }
+
+ public SenderCreationException(String e)
+ {
+ super(e);
+
+ }
+ }
+
+ public class SenderClosingException extends Exception
+ {
+ public SenderClosingException(Throwable e)
+ {
+ super(e);
+ }
+ }
+
+ public static interface OutcomeAction
+ {
+ public void onOutcome(Binary deliveryTag, Outcome outcome);
+ }
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Session.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Session.java
new file mode 100644
index 0000000000..5e1e1b1d7c
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Session.java
@@ -0,0 +1,354 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoder;
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoderImpl;
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoderImpl;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SessionEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SessionState;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.transaction.TxnCapability;
+import org.apache.qpid.amqp_1_0.type.transport.ReceiverSettleMode;
+import org.apache.qpid.amqp_1_0.type.transport.SenderSettleMode;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class Session
+{
+ private SessionEndpoint _endpoint;
+ private List<Receiver> _receivers = new ArrayList<Receiver>();
+ private List<Sender> _senders = new ArrayList<Sender>();
+ private SectionEncoder _sectionEncoder;
+ private SectionDecoder _sectionDecoder;
+ private TransactionController _sessionLocalTC;
+ private Connection _connection;
+
+ public Session(final Connection connection, String name)
+ {
+ _connection = connection;
+ _endpoint = connection.getEndpoint().createSession(name);
+ _sectionEncoder = new SectionEncoderImpl(connection.getEndpoint().getDescribedTypeRegistry());
+ _sectionDecoder = new SectionDecoderImpl(connection.getEndpoint().getDescribedTypeRegistry());
+ }
+
+
+ public synchronized Sender createSender(final String targetName) throws Sender.SenderCreationException
+ {
+ return createSender(targetName, false);
+ }
+
+ public synchronized Sender createSender(final String targetName, boolean synchronous) throws Sender.SenderCreationException
+ {
+
+ final String sourceName = UUID.randomUUID().toString();
+ return new Sender(this, targetName+"<-"+sourceName, targetName, sourceName, synchronous);
+
+ }
+
+ public synchronized Sender createSender(final String targetName, int window) throws Sender.SenderCreationException
+ {
+ final String sourceName = UUID.randomUUID().toString();
+ return new Sender(this, targetName+"<-"+sourceName, targetName, sourceName, window);
+
+ }
+
+ public Sender createSender(String targetName, int window, AcknowledgeMode mode) throws Sender.SenderCreationException
+ {
+
+ return createSender(targetName, window, mode, null);
+ }
+
+ public Sender createSender(String targetName, int window, AcknowledgeMode mode, String linkName) throws Sender.SenderCreationException
+ {
+ return createSender(targetName, window, mode, linkName, null);
+ }
+ public Sender createSender(String targetName, int window, AcknowledgeMode mode, String linkName, Map<Binary, Outcome> unsettled) throws Sender.SenderCreationException
+ {
+ return createSender(targetName, window, mode, linkName, false, unsettled);
+ }
+
+ public Sender createSender(String targetName, int window, AcknowledgeMode mode, String linkName,
+ boolean isDurable, Map<Binary, Outcome> unsettled) throws Sender.SenderCreationException
+ {
+ return new Sender(this, linkName == null ? "->" + targetName + '(' + UUID.randomUUID().toString()+')': linkName,
+ targetName, null, window, mode, isDurable, unsettled);
+
+ }
+
+
+ public Receiver createReceiver(final String sourceAddr) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, null, AcknowledgeMode.ALO);
+ }
+
+
+ public Receiver createReceiver(final String queue, final AcknowledgeMode mode) throws AmqpErrorException
+ {
+ return createReceiver(queue, null, mode);
+ }
+
+ public Receiver createReceiver(final String queue, final AcknowledgeMode mode, String linkName)
+ throws AmqpErrorException
+ {
+ return createReceiver(queue, null, mode, linkName);
+ }
+
+ public Receiver createReceiver(final String queue, final AcknowledgeMode mode, String linkName, boolean isDurable)
+ throws AmqpErrorException
+ {
+ return createReceiver(queue, null, mode, linkName, isDurable);
+ }
+
+ public Receiver createReceiver(final String queue, final AcknowledgeMode mode, String linkName, boolean isDurable,
+ Map<Symbol, Filter> filters, Map<Binary, Outcome> unsettled)
+ throws AmqpErrorException
+ {
+ return createReceiver(queue, null, mode, linkName, isDurable, filters, unsettled);
+ }
+
+
+ public Receiver createReceiver(final String queue, final AcknowledgeMode mode, String linkName,
+ boolean isDurable, Map<Binary, Outcome> unsettled) throws AmqpErrorException
+ {
+ return createReceiver(queue, null, mode, linkName, isDurable, unsettled);
+ }
+
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode)
+ throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, mode, AcknowledgeMode.ALO);
+ }
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode, String linkName)
+ throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, mode, AcknowledgeMode.ALO, linkName);
+ }
+
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode,
+ final AcknowledgeMode ackMode) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, mode, ackMode, null);
+ }
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode,
+ final AcknowledgeMode ackMode, String linkName) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr,mode, ackMode, linkName, false);
+ }
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode,
+ final AcknowledgeMode ackMode, String linkName, boolean isDurable)
+ throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, mode, ackMode, linkName, isDurable, null);
+ }
+
+ private synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode,
+ final AcknowledgeMode ackMode, String linkName, boolean isDurable,
+ Map<Binary, Outcome> unsettled) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr,mode,ackMode, linkName, isDurable, null, unsettled);
+ }
+
+ public synchronized Receiver createReceiver(final String sourceAddr, DistributionMode mode,
+ final AcknowledgeMode ackMode, String linkName, boolean isDurable,
+ Map<Symbol, Filter> filters, Map<Binary, Outcome> unsettled)
+ throws AmqpErrorException
+ {
+
+ final Target target = new Target();
+ final Source source = new Source();
+ source.setAddress(sourceAddr);
+ source.setDistributionMode(mode);
+ source.setFilter(filters);
+
+ if(linkName == null)
+ {
+ linkName = sourceAddr + "-> (" + UUID.randomUUID().toString() + ")";
+ }
+
+ final Receiver receiver =
+ new Receiver(this, linkName,
+ target, source, ackMode, isDurable, unsettled);
+ _receivers.add(receiver);
+
+ return receiver;
+
+ }
+
+ public synchronized Receiver createCopyingReceiver(final String sourceAddr) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, StdDistMode.COPY);
+ }
+
+ public synchronized Receiver createMovingReceiver(final String sourceAddr) throws AmqpErrorException
+ {
+ return createReceiver(sourceAddr, StdDistMode.MOVE);
+ }
+
+ public Receiver createTemporaryQueueReceiver() throws AmqpErrorException
+ {
+ Source source = new Source();
+ source.setDynamic(true);
+
+ final Receiver receiver = new Receiver(this, "tempSender"+UUID.randomUUID().toString(), new Target(),
+ source, AcknowledgeMode.ALO);
+ _receivers.add(receiver);
+ return receiver;
+ }
+
+ public Sender createTemporaryQueueSender() throws Sender.SenderCreationException
+ {
+ Target target = new Target();
+ target.setDynamic(true);
+
+ final Sender sender;
+ sender = new Sender(this, "tempSender"+ UUID.randomUUID().toString(), target,
+ new Source(), 0, AcknowledgeMode.ALO);
+ _senders.add(sender);
+ return sender;
+ }
+
+
+
+ public SessionEndpoint getEndpoint()
+ {
+ return _endpoint;
+ }
+
+ public synchronized void close()
+ {
+ try
+ {
+ for(Sender sender : new ArrayList<Sender>(_senders))
+ {
+ sender.close();
+ }
+ for(Receiver receiver : new ArrayList<Receiver>(_receivers))
+ {
+ receiver.detach();
+ }
+ if(_sessionLocalTC != null)
+ {
+ _sessionLocalTC.close();
+ }
+ _endpoint.end();
+ }
+ catch (Sender.SenderClosingException e)
+ {
+// TODO
+ e.printStackTrace();
+ }
+
+ //TODO
+
+ }
+
+ void removeSender(Sender sender)
+ {
+ _senders.remove(sender);
+ }
+
+ void removeReceiver(Receiver receiver)
+ {
+ _receivers.remove(receiver);
+ }
+
+ public SectionEncoder getSectionEncoder()
+ {
+ return _sectionEncoder;
+ }
+
+ public SectionDecoder getSectionDecoder()
+ {
+ return _sectionDecoder;
+ }
+
+
+ public Transaction createSessionLocalTransaction()
+ {
+ TransactionController localController = getSessionLocalTransactionController();
+ return localController.beginTransaction();
+ }
+
+ private TransactionController getSessionLocalTransactionController()
+ {
+ if(_sessionLocalTC == null)
+ {
+ _sessionLocalTC = createSessionLocalTransactionController();
+ }
+ return _sessionLocalTC;
+ }
+
+ private TransactionController createSessionLocalTransactionController()
+ {
+ String name = "txnControllerLink";
+ SendingLinkEndpoint tcLinkEndpoint = _endpoint.createTransactionController(name, TxnCapability.LOCAL_TXN,
+ TxnCapability.MULTI_TXNS_PER_SSN);
+ tcLinkEndpoint.setReceivingSettlementMode(ReceiverSettleMode.FIRST);
+ tcLinkEndpoint.setSendingSettlementMode(SenderSettleMode.UNSETTLED);
+ tcLinkEndpoint.attach();
+ return new TransactionController(this, tcLinkEndpoint);
+ }
+
+
+ public Message receive()
+ {
+ while(getEndpoint().getState() == SessionState.ACTIVE)
+ {
+ synchronized (getEndpoint().getLock())
+ {
+ try
+ {
+ for(Receiver r : _receivers)
+ {
+ Message m = r.receive(false);
+ if(m != null)
+ return m;
+ }
+ wait();
+ }
+ catch (InterruptedException e)
+ {
+ }
+ }
+ }
+ return null;
+ }
+
+ public Connection getConnection()
+ {
+ return _connection;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Transaction.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Transaction.java
new file mode 100644
index 0000000000..a379463710
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Transaction.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+
+public class Transaction
+{
+ private TransactionController _transactionController;
+ private Binary _txnId;
+
+ Transaction(final TransactionController transactionController, Binary txnId)
+ {
+ _transactionController = transactionController;
+ _txnId = txnId;
+ }
+
+ public void commit()
+ {
+ _transactionController.commit(this);
+ }
+
+ public void rollback()
+ {
+ _transactionController.rollback(this);
+ }
+
+ public Binary getTxnId()
+ {
+ return _txnId;
+ }
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransactionController.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransactionController.java
new file mode 100644
index 0000000000..9f2c76bc72
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/TransactionController.java
@@ -0,0 +1,194 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.transaction.Declare;
+import org.apache.qpid.amqp_1_0.type.transaction.Declared;
+import org.apache.qpid.amqp_1_0.type.transaction.Discharge;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+
+public class TransactionController implements DeliveryStateHandler
+{
+ private static final Binary DELIVERY_TAG = new Binary(new byte[]{(byte) 0});
+ private SendingLinkEndpoint _endpoint;
+ private Session _session;
+ private volatile DeliveryState _state;
+ private boolean _received;
+
+ public TransactionController(Session session, SendingLinkEndpoint tcLinkEndpoint)
+ {
+ _session = session;
+ _endpoint = tcLinkEndpoint;
+ _endpoint.setDeliveryStateHandler(this);
+ }
+
+ public Transaction beginTransaction()
+ {
+
+
+ Binary txnId = declare();
+ return new Transaction(this, txnId);
+ }
+
+ private Binary declare()
+ {
+ SectionEncoder encoder = _session.getSectionEncoder();
+
+
+ AmqpValue section = new AmqpValue(new Declare());
+
+
+ Transfer transfer = new Transfer();
+ transfer.setPayload(section.encode(encoder).asByteBuffer());
+ transfer.setDeliveryTag(DELIVERY_TAG);
+ transfer.setSettled(Boolean.FALSE);
+ final Object lock = _endpoint.getLock();
+ synchronized(lock)
+ {
+ while(!_endpoint.hasCreditToSend())
+ {
+ try
+ {
+ lock.wait();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ _state = null;
+ _received = false;
+ _endpoint.transfer(transfer);
+
+ //TODO - rationalise sending of flows
+ // _endpoint.sendFlow();
+ }
+ synchronized (this)
+ {
+ while(!_received)
+ {
+ try
+ {
+ wait();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ }
+
+
+ return ((Declared) _state).getTxnId();
+ }
+
+
+ public void commit(final Transaction transaction)
+ {
+ discharge(transaction.getTxnId(), false);
+ }
+
+ public void rollback(final Transaction transaction)
+ {
+ discharge(transaction.getTxnId(), true);
+ }
+
+ private void discharge(final Binary txnId, final boolean fail)
+ {
+ Discharge discharge = new Discharge();
+ discharge.setTxnId(txnId);
+ discharge.setFail(fail);
+ SectionEncoder encoder = _session.getSectionEncoder();
+
+
+ AmqpValue section = new AmqpValue(discharge);
+
+ Transfer transfer = new Transfer();
+ transfer.setPayload(section.encode(encoder).asByteBuffer());
+ transfer.setDeliveryTag(DELIVERY_TAG);
+ transfer.setSettled(Boolean.FALSE);
+
+ final Object lock = _endpoint.getLock();
+ synchronized(lock)
+ {
+ while(!_endpoint.hasCreditToSend())
+ {
+ try
+ {
+ lock.wait();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ _state = null;
+ _received = false;
+ _endpoint.transfer(transfer);
+
+ //TODO - rationalise sending of flows
+ // _endpoint.sendFlow();
+ }
+ synchronized (this)
+ {
+ while(!_received)
+ {
+ try
+ {
+ wait();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ }
+
+
+ }
+
+ public void handle(final Binary deliveryTag, final DeliveryState state, final Boolean settled)
+ {
+ synchronized(this)
+ {
+ _state = state;
+ _received = true;
+
+ if(!Boolean.TRUE.equals(settled))
+ {
+ _endpoint.updateDisposition(deliveryTag, state, true);
+ }
+
+ notifyAll();
+ }
+ }
+
+ public void close()
+ {
+ _endpoint.close();
+ }
+}
diff --git a/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Util.java b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Util.java
new file mode 100644
index 0000000000..6fe2a6d510
--- /dev/null
+++ b/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/client/Util.java
@@ -0,0 +1,529 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.client;
+
+import org.apache.qpid.amqp_1_0.transport.Container;
+import org.apache.commons.cli.*;
+
+import java.util.logging.*;
+
+public abstract class Util
+{
+
+ private static final Logger FRAME_LOGGER = Logger.getLogger("FRM");
+ private static final Logger RAW_LOGGER = Logger.getLogger("RAW");
+ private String _host;
+ private String _username;
+ private String _password;
+ private int _port;
+ private int _count;
+ private boolean _useStdIn;
+ private boolean _useTran;
+ private String[] _args;
+ private AcknowledgeMode _mode;
+ private boolean _block;
+ private int _frameSize;
+ private int _messageSize;
+ private String _responseQueue;
+ private int _batchSize;
+ private double _rollbackRatio;
+ private String _linkName;
+ private String _containerName;
+ private boolean _durableLink;
+ private boolean _useMultipleConnections;
+ private int _windowSize = 100;
+ private String _subject;
+ private String _filter;
+ private String _remoteHost;
+ private boolean _useSSL;
+
+ protected Util(String[] args)
+ {
+ CommandLineParser cmdLineParse = new PosixParser();
+
+ Options options = new Options();
+ options.addOption("h","help",false,"show this help message and exit");
+ options.addOption(OptionBuilder.withLongOpt("host")
+ .withDescription( "host to connect to (default 0.0.0.0)" )
+ .hasArg(true)
+ .withArgName("HOST")
+ .create('H'));
+ options.addOption(OptionBuilder.withLongOpt("username")
+ .withDescription( "username to use for authentication" )
+ .hasArg(true)
+ .withArgName("USERNAME")
+ .create('u'));
+ options.addOption(OptionBuilder.withLongOpt("password")
+ .withDescription( "password to use for authentication" )
+ .hasArg(true)
+ .withArgName("PASSWORD")
+ .create('w'));
+ options.addOption(OptionBuilder.withLongOpt("port")
+ .withDescription( "port to connect to (default 5672)" )
+ .hasArg(true)
+ .withArgName("PORT")
+ .create('p'));
+ options.addOption(OptionBuilder.withLongOpt("frame-size")
+ .withDescription( "specify the maximum frame size" )
+ .hasArg(true)
+ .withArgName("FRAME_SIZE")
+ .create('f'));
+ options.addOption(OptionBuilder.withLongOpt("container-name")
+ .withDescription( "Container name" )
+ .hasArg(true)
+ .withArgName("CONTAINER_NAME")
+ .create('C'));
+
+ options.addOption(OptionBuilder.withLongOpt("ssl")
+ .withDescription("Use SSL")
+ .create('S'));
+
+ options.addOption(OptionBuilder.withLongOpt("remote-hostname")
+ .withDescription( "hostname to supply in the open frame" )
+ .hasArg(true)
+ .withArgName("HOST")
+ .create('O'));
+
+ if(hasBlockOption())
+ options.addOption(OptionBuilder.withLongOpt("block")
+ .withDescription("block until messages arrive")
+ .create('b'));
+
+ if(hasCountOption())
+ options.addOption(OptionBuilder.withLongOpt("count")
+ .withDescription( "number of messages to send (default 1)" )
+ .hasArg(true)
+ .withArgName("COUNT")
+ .create('c'));
+ if(hasModeOption())
+ options.addOption(OptionBuilder.withLongOpt("acknowledge-mode")
+ .withDescription( "acknowledgement mode: AMO|ALO|EO (At Least Once, At Most Once, Exactly Once" )
+ .hasArg(true)
+ .withArgName("MODE")
+ .create('k'));
+
+ if(hasSubjectOption())
+ options.addOption(OptionBuilder.withLongOpt("subject")
+ .withDescription( "subject message property" )
+ .hasArg(true)
+ .withArgName("SUBJECT")
+ .create('s'));
+
+
+ if(hasSingleLinkPerConnectionMode())
+ options.addOption(OptionBuilder.withLongOpt("single-link-per-connection")
+ .withDescription("acknowledgement mode: AMO|ALO|EO (At Least Once, At Most Once, Exactly Once")
+ .hasArg(false)
+ .create('Z'));
+
+ if(hasFilterOption())
+ options.addOption(OptionBuilder.withLongOpt("filter")
+ .withDescription("filter, e.g. exact-subject=hello; matching-subject=%.a.#")
+ .hasArg(true)
+ .withArgName("<TYPE>=<VALUE>")
+ .create('F'));
+
+
+ if(hasTxnOption())
+ {
+ options.addOption("x","txn",false,"use transactions");
+ options.addOption(OptionBuilder.withLongOpt("batch-size")
+ .withDescription( "transaction batch size (default: 1)" )
+ .hasArg(true)
+ .withArgName("BATCH-SIZE")
+ .create('B'));
+ options.addOption(OptionBuilder.withLongOpt("rollback-ratio")
+ .withDescription( "rollback ratio - must be between 0 and 1 (default: 0)" )
+ .hasArg(true)
+ .withArgName("RATIO")
+ .create('R'));
+ }
+
+ if(hasLinkDurableOption())
+ {
+ options.addOption("d","durable-link",false,"use a durable link");
+ }
+
+ if(hasStdInOption())
+ options.addOption("i","stdin",false,"read messages from stdin (one message per line)");
+
+ options.addOption(OptionBuilder.withLongOpt("trace")
+ .withDescription("trace logging specified categories: RAW, FRM")
+ .hasArg(true)
+ .withArgName("TRACE")
+ .create('t'));
+ if(hasSizeOption())
+ options.addOption(OptionBuilder.withLongOpt("message-size")
+ .withDescription( "size to pad outgoing messages to" )
+ .hasArg(true)
+ .withArgName("SIZE")
+ .create('z'));
+
+ if(hasResponseQueueOption())
+ options.addOption(OptionBuilder.withLongOpt("response-queue")
+ .withDescription( "response queue to reply to" )
+ .hasArg(true)
+ .withArgName("RESPONSE_QUEUE")
+ .create('r'));
+
+ if(hasLinkNameOption())
+ {
+ options.addOption(OptionBuilder.withLongOpt("link")
+ .withDescription( "link name" )
+ .hasArg(true)
+ .withArgName("LINK")
+ .create('l'));
+ }
+
+ if(hasWindowSizeOption())
+ {
+ options.addOption(OptionBuilder.withLongOpt("window-size")
+ .withDescription("credit window size")
+ .hasArg(true)
+ .withArgName("WINDOW-SIZE")
+ .create('W'));
+ }
+
+ CommandLine cmdLine = null;
+ try
+ {
+ cmdLine = cmdLineParse.parse(options, args);
+
+ }
+ catch (ParseException e)
+ {
+ printUsage(options);
+ System.exit(-1);
+ }
+
+ if(cmdLine.hasOption('h') || cmdLine.getArgList().isEmpty())
+ {
+ printUsage(options);
+ System.exit(0);
+ }
+ _host = cmdLine.getOptionValue('H',"0.0.0.0");
+ _remoteHost = cmdLine.getOptionValue('O',null);
+ String portStr = cmdLine.getOptionValue('p',"5672");
+ String countStr = cmdLine.getOptionValue('c',"1");
+
+ _useSSL = cmdLine.hasOption('S');
+
+ if(hasWindowSizeOption())
+ {
+ String windowSizeStr = cmdLine.getOptionValue('W',"100");
+ _windowSize = Integer.parseInt(windowSizeStr);
+ }
+
+ if(hasSubjectOption())
+ {
+ _subject = cmdLine.getOptionValue('s');
+ }
+
+ if(cmdLine.hasOption('u'))
+ {
+ _username = cmdLine.getOptionValue('u');
+ }
+
+ if(cmdLine.hasOption('w'))
+ {
+ _password = cmdLine.getOptionValue('w');
+ }
+
+ if(cmdLine.hasOption('F'))
+ {
+ _filter = cmdLine.getOptionValue('F');
+ }
+
+ _port = Integer.parseInt(portStr);
+
+ _containerName = cmdLine.getOptionValue('C');
+
+ if(hasBlockOption())
+ _block = cmdLine.hasOption('b');
+
+ if(hasLinkNameOption())
+ _linkName = cmdLine.getOptionValue('l');
+
+
+ if(hasLinkDurableOption())
+ _durableLink = cmdLine.hasOption('d');
+
+ if(hasCountOption())
+ _count = Integer.parseInt(countStr);
+
+ if(hasStdInOption())
+ _useStdIn = cmdLine.hasOption('i');
+
+ if(hasSingleLinkPerConnectionMode())
+ _useMultipleConnections = cmdLine.hasOption('Z');
+
+ if(hasTxnOption())
+ {
+ _useTran = cmdLine.hasOption('x');
+ _batchSize = Integer.parseInt(cmdLine.getOptionValue('B',"1"));
+ _rollbackRatio = Double.parseDouble(cmdLine.getOptionValue('R',"0"));
+ }
+
+ if(hasModeOption())
+ {
+ _mode = AcknowledgeMode.ALO;
+
+ if(cmdLine.hasOption('k'))
+ {
+ _mode = AcknowledgeMode.valueOf(cmdLine.getOptionValue('k'));
+ }
+ }
+
+ if(hasResponseQueueOption())
+ {
+ _responseQueue = cmdLine.getOptionValue('r');
+ }
+
+ _frameSize = Integer.parseInt(cmdLine.getOptionValue('f',"65536"));
+
+ if(hasSizeOption())
+ {
+ _messageSize = Integer.parseInt(cmdLine.getOptionValue('z',"-1"));
+ }
+
+ String categoriesList = cmdLine.getOptionValue('t');
+ String[]categories = categoriesList == null ? new String[0] : categoriesList.split("[, ]");
+ for(String cat : categories)
+ {
+ if(cat.equalsIgnoreCase("FRM"))
+ {
+ FRAME_LOGGER.setLevel(Level.FINE);
+ Formatter formatter = new Formatter()
+ {
+ @Override
+ public String format(final LogRecord record)
+ {
+ return "[" + record.getMillis() + " FRM]\t" + record.getMessage() + "\n";
+ }
+ };
+ for(Handler handler : FRAME_LOGGER.getHandlers())
+ {
+ FRAME_LOGGER.removeHandler(handler);
+ }
+ Handler handler = new ConsoleHandler();
+ handler.setLevel(Level.FINE);
+ handler.setFormatter(formatter);
+ FRAME_LOGGER.addHandler(handler);
+ }
+ else if (cat.equalsIgnoreCase("RAW"))
+ {
+ RAW_LOGGER.setLevel(Level.FINE);
+ Formatter formatter = new Formatter()
+ {
+ @Override
+ public String format(final LogRecord record)
+ {
+ return "[" + record.getMillis() + " RAW]\t" + record.getMessage() + "\n";
+ }
+ };
+ for(Handler handler : RAW_LOGGER.getHandlers())
+ {
+ RAW_LOGGER.removeHandler(handler);
+ }
+ Handler handler = new ConsoleHandler();
+ handler.setLevel(Level.FINE);
+ handler.setFormatter(formatter);
+ RAW_LOGGER.addHandler(handler);
+ }
+ }
+
+
+ _args = cmdLine.getArgs();
+
+ }
+
+ protected boolean hasFilterOption()
+ {
+ return false;
+ }
+
+ protected boolean hasSubjectOption()
+ {
+ return false;
+ }
+
+ protected boolean hasWindowSizeOption()
+ {
+ return false;
+ }
+
+ protected boolean hasSingleLinkPerConnectionMode()
+ {
+ return false;
+ }
+
+ protected abstract boolean hasLinkDurableOption();
+
+ protected abstract boolean hasLinkNameOption();
+
+ protected abstract boolean hasResponseQueueOption();
+
+ protected abstract boolean hasSizeOption();
+
+ protected abstract boolean hasBlockOption();
+
+ protected abstract boolean hasStdInOption();
+
+ protected abstract boolean hasTxnOption();
+
+ protected abstract boolean hasModeOption();
+
+ protected abstract boolean hasCountOption();
+
+ public String getHost()
+ {
+ return _host;
+ }
+
+ public String getUsername()
+ {
+ return _username;
+ }
+
+ public String getPassword()
+ {
+ return _password;
+ }
+
+ public int getPort()
+ {
+ return _port;
+ }
+
+ public int getCount()
+ {
+ return _count;
+ }
+
+ public boolean useStdIn()
+ {
+ return _useStdIn;
+ }
+
+ public boolean useTran()
+ {
+ return _useTran;
+ }
+
+ public AcknowledgeMode getMode()
+ {
+ return _mode;
+ }
+
+ public boolean isBlock()
+ {
+ return _block;
+ }
+
+ public String[] getArgs()
+ {
+ return _args;
+ }
+
+ public int getMessageSize()
+ {
+ return _messageSize;
+ }
+
+ public String getResponseQueue()
+ {
+ return _responseQueue;
+ }
+
+ public int getBatchSize()
+ {
+ return _batchSize;
+ }
+
+ public double getRollbackRatio()
+ {
+ return _rollbackRatio;
+ }
+
+ public String getLinkName()
+ {
+ return _linkName;
+ }
+
+ public boolean isDurableLink()
+ {
+ return _durableLink;
+ }
+
+ public boolean isUseMultipleConnections()
+ {
+ return _useMultipleConnections;
+ }
+
+ public void setUseMultipleConnections(boolean useMultipleConnections)
+ {
+ _useMultipleConnections = useMultipleConnections;
+ }
+
+ public String getSubject()
+ {
+ return _subject;
+ }
+
+ public void setSubject(String subject)
+ {
+ _subject = subject;
+ }
+
+ protected abstract void printUsage(final Options options);
+
+ protected abstract void run();
+
+
+ public Connection newConnection() throws Connection.ConnectionException
+ {
+ Container container = getContainerName() == null ? new Container() : new Container(getContainerName());
+ return getUsername() == null ? new Connection(getHost(), getPort(), null, null, _frameSize, container,
+ _remoteHost == null ? getHost() : _remoteHost, _useSSL)
+ : new Connection(getHost(), getPort(), getUsername(), getPassword(), _frameSize,
+ container, _remoteHost == null ? getHost() : _remoteHost, _useSSL);
+ }
+
+ public String getContainerName()
+ {
+ return _containerName;
+ }
+
+ public int getWindowSize()
+ {
+ return _windowSize;
+ }
+
+ public void setWindowSize(int windowSize)
+ {
+ _windowSize = windowSize;
+ }
+
+ public String getFilter()
+ {
+ return _filter;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/build.xml b/qpid/java/amqp-1-0-common/build.xml
new file mode 100644
index 0000000000..20b8b731b0
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/build.xml
@@ -0,0 +1,27 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<project name="AMQP 1.0 Common" default="build">
+
+ <property name="module.genpom" value="true"/>
+
+ <import file="../module.xml"/>
+
+</project>
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractDescribedTypeWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractDescribedTypeWriter.java
new file mode 100644
index 0000000000..6977a40902
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractDescribedTypeWriter.java
@@ -0,0 +1,188 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class AbstractDescribedTypeWriter<V> implements ValueWriter<V>
+{
+ private int _length;
+ private Registry _registry;
+ private static final int LARGE_COMPOUND_THRESHOLD_COUNT = 10;
+ private ValueWriter _delegate;
+ private static final byte DESCRIBED_TYPE = (byte)0;
+
+ public AbstractDescribedTypeWriter(final Registry registry)
+ {
+ _registry = registry;
+ }
+
+ enum State {
+ FORMAT_CODE,
+ DESCRIPTOR,
+ DESCRIBED,
+ DONE
+ }
+
+ private State _state = State.FORMAT_CODE;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+ final int length = _length;
+
+ if(length == -1)
+ {
+ writeFirstPass(buffer);
+ }
+ else
+ {
+
+ State state = _state;
+
+ switch(state)
+ {
+ case FORMAT_CODE:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(DESCRIBED_TYPE);
+ state = State.DESCRIPTOR;
+ _delegate = createDescriptorWriter();
+ }
+ else
+ {
+ break;
+ }
+
+ case DESCRIPTOR:
+ if(buffer.hasRemaining())
+ {
+ _delegate.writeToBuffer(buffer);
+ if(_delegate.isComplete())
+ {
+ state = State.DESCRIBED;
+ _delegate = createDescribedWriter();
+ }
+ else
+ {
+ break;
+ }
+ }
+ case DESCRIBED:
+ if(buffer.hasRemaining())
+ {
+ _delegate.writeToBuffer(buffer);
+ if(_delegate.isComplete())
+ {
+ state = State.DONE;
+ _delegate = null;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ }
+
+ _state = state;
+
+ }
+
+ return _length;
+ }
+
+ private void writeFirstPass(ByteBuffer buffer)
+ {
+
+ int length = 1;
+ State state = State.FORMAT_CODE;
+
+ ValueWriter descriptorWriter = createDescriptorWriter();
+ if(buffer.hasRemaining())
+ {
+ buffer.put(DESCRIBED_TYPE);
+ state = State.DESCRIPTOR;
+ _delegate = descriptorWriter;
+ }
+ length += descriptorWriter.writeToBuffer(buffer);
+
+ ValueWriter describedWriter = createDescribedWriter();
+
+ if(descriptorWriter.isComplete())
+ {
+ state = State.DESCRIBED;
+ _delegate = describedWriter;
+ }
+
+ length += describedWriter.writeToBuffer(buffer);
+
+ if(describedWriter.isComplete())
+ {
+ _delegate = null;
+ state = State.DONE;
+ }
+
+ _state = state;
+ _length = length;
+ }
+
+ public void setValue(V value)
+ {
+ _length = -1;
+ _delegate = null;
+ _state = State.FORMAT_CODE;
+ onSetValue(value);
+ }
+
+ public void setRegistry(Registry registry)
+ {
+ _registry = registry;
+ }
+
+ protected Registry getRegistry()
+ {
+ return _registry;
+ }
+
+ protected abstract void onSetValue(final V value);
+
+ protected abstract void clear();
+
+ protected abstract ValueWriter createDescribedWriter();
+
+ protected abstract Object getDescriptor();
+
+ protected final ValueWriter createDescriptorWriter()
+ {
+ return getRegistry().getValueWriter(getDescriptor());
+ }
+
+ public boolean isComplete()
+ {
+ return _state == State.DONE;
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractListWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractListWriter.java
new file mode 100644
index 0000000000..655b1f2164
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractListWriter.java
@@ -0,0 +1,41 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+public abstract class AbstractListWriter<V> extends CompoundWriter<V>
+{
+ public AbstractListWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return (byte)0xd0;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return (byte)0xc0;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractMapWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractMapWriter.java
new file mode 100644
index 0000000000..0fa29b5210
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/AbstractMapWriter.java
@@ -0,0 +1,95 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public abstract class AbstractMapWriter<V> extends CompoundWriter<V>
+{
+ private boolean onKey;
+
+ public AbstractMapWriter(Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return (byte)0xd1;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return (byte)0xc1;
+ }
+
+ @Override
+ protected final int getCount()
+ {
+ return 2 * getMapCount();
+ }
+
+ protected abstract int getMapCount();
+
+ @Override
+ protected final boolean hasNext()
+ {
+ return onKey || hasMapNext();
+ }
+
+ protected abstract boolean hasMapNext();
+
+ @Override
+ protected final Object next()
+ {
+ if(onKey = !onKey)
+ {
+ return nextKey();
+ }
+ else
+ {
+ return nextValue();
+ }
+ }
+
+ protected abstract Object nextValue();
+
+ protected abstract Object nextKey();
+
+ @Override
+ protected final void clear()
+ {
+ onKey = false;
+ onClear();
+ }
+
+ protected abstract void onClear();
+
+ @Override
+ protected final void reset()
+ {
+ onKey = false;
+ onReset();
+ }
+
+ protected abstract void onReset();
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayTypeConstructor.java
new file mode 100644
index 0000000000..68239ad143
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayTypeConstructor.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+
+import java.lang.reflect.Array;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class ArrayTypeConstructor implements TypeConstructor<Object[]>
+{
+
+
+
+ public Object[] construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ int size = read(in);
+ if(in.remaining() < size)
+ {
+ throw new AmqpErrorException(AmqpError.DECODE_ERROR,
+ "Insufficient data to decode array - requires %d octects, only %d remaining.",
+ size, in.remaining());
+ }
+ ByteBuffer dup = in.slice();
+ dup.limit(size);
+ in.position(in.position()+size);
+ int count = read(dup);
+ TypeConstructor t = handler.readConstructor(dup);
+ List rval = new ArrayList(count);
+ for(int i = 0; i < count; i++)
+ {
+ rval.add(t.construct(dup, handler));
+ }
+ if(dup.hasRemaining())
+ {
+ throw new AmqpErrorException(AmqpError.DECODE_ERROR,
+ "Array incorrectly encoded, %d bytes remaining after decoding %d elements",
+ dup.remaining(), count);
+ }
+ if(rval.size() == 0)
+ {
+ return null;
+ }
+ else
+ {
+
+
+ return rval.toArray((Object[])Array.newInstance(rval.get(0).getClass(), rval.size()));
+ }
+ }
+
+
+ abstract int read(ByteBuffer in) throws AmqpErrorException;
+
+
+ private static final ArrayTypeConstructor ONE_BYTE_SIZE_ARRAY = new ArrayTypeConstructor()
+ {
+
+ @Override int read(final ByteBuffer in) throws AmqpErrorException
+ {
+ if(!in.hasRemaining())
+ {
+ throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Insufficient data to decode array");
+ }
+ return ((int)in.get()) & 0xff;
+ }
+
+ };
+
+ private static final ArrayTypeConstructor FOUR_BYTE_SIZE_ARRAY = new ArrayTypeConstructor()
+ {
+
+ @Override int read(final ByteBuffer in) throws AmqpErrorException
+ {
+ if(in.remaining()<4)
+ {
+ throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Insufficient data to decode array");
+ }
+ return in.getInt();
+ }
+
+ };
+
+ public static ArrayTypeConstructor getOneByteSizeTypeConstructor()
+ {
+ return ONE_BYTE_SIZE_ARRAY;
+ }
+
+ public static ArrayTypeConstructor getFourByteSizeTypeConstructor()
+ {
+ return FOUR_BYTE_SIZE_ARRAY;
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayWriter.java
new file mode 100644
index 0000000000..7766a486f0
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ArrayWriter.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class ArrayWriter implements ValueWriter<Object[]>
+{
+ private Object[] _list;
+ private int _position = 0;
+ private final Registry _registry;
+ private ValueWriter valueWriter;
+
+ public ArrayWriter(final Registry registry)
+ {
+ _registry = registry;
+ }
+
+
+ protected void onSetValue(final Object[] value)
+ {
+
+ Class clazz = value.getClass().getComponentType();
+ //valueWriter = _registry.getValueWriterByClass(clazz);
+
+
+ }
+
+
+
+
+ private static Factory<Object[]> FACTORY = new Factory<Object[]>()
+ {
+
+ public ValueWriter<Object[]> newInstance(Registry registry)
+ {
+ return new ArrayWriter(registry);
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ //registry.register(List.class, FACTORY);
+ }
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return 0; //TODO change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void setValue(final Object[] frameBody)
+ {
+ //TODO change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public boolean isComplete()
+ {
+ return false; //TODO change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public boolean isCacheable()
+ {
+ return false; //TODO change body of implemented methods use File | Settings | File Templates.
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryString.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryString.java
new file mode 100644
index 0000000000..76bdac8ed7
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryString.java
@@ -0,0 +1,68 @@
+package org.apache.qpid.amqp_1_0.codec;
+
+
+final class BinaryString
+{
+
+ private byte[] _data;
+ private int _offset;
+ private int _size;
+ private int _hashCode;
+
+ BinaryString(final byte[] data, final int offset, final int size)
+ {
+
+ setData(data, offset, size);
+ }
+
+ BinaryString()
+ {
+ }
+
+ void setData(byte[] data, int offset, int size)
+ {
+ _data = data;
+ _offset = offset;
+ _size = size;
+ int hc = 0;
+ for (int i = 0; i < size; i++)
+ {
+ hc = 31*hc + (0xFF & data[offset + i]);
+ }
+ _hashCode = hc;
+ }
+
+
+ public final int hashCode()
+ {
+ return _hashCode;
+ }
+
+ public final boolean equals(Object o)
+ {
+ BinaryString buf = (BinaryString) o;
+ final int size = _size;
+ if (size != buf._size)
+ {
+ return false;
+ }
+
+ final byte[] myData = _data;
+ final byte[] theirData = buf._data;
+ int myOffset = _offset;
+ int theirOffset = buf._offset;
+ final int myLimit = myOffset + size;
+
+ while(myOffset < myLimit)
+ {
+ if (myData[myOffset++] != theirData[theirOffset++])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryTypeConstructor.java
new file mode 100644
index 0000000000..e83718d88d
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryTypeConstructor.java
@@ -0,0 +1,80 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Binary;
+
+import java.nio.ByteBuffer;
+
+public class BinaryTypeConstructor extends VariableWidthTypeConstructor
+{
+ private static final BinaryTypeConstructor INSTANCE_1 = new BinaryTypeConstructor(1);
+ private static final BinaryTypeConstructor INSTANCE_4 = new BinaryTypeConstructor(4);
+
+ public static BinaryTypeConstructor getInstance(int i)
+ {
+ return i == 1 ? INSTANCE_1 : INSTANCE_4;
+ }
+
+
+ private BinaryTypeConstructor(int size)
+ {
+ super(size);
+ }
+
+ @Override
+ public Object construct(final ByteBuffer in, boolean isCopy, ValueHandler handler) throws AmqpErrorException
+ {
+ int size;
+
+ if(getSize() == 1)
+ {
+ size = in.get() & 0xFF;
+ }
+ else
+ {
+ size = in.getInt();
+ }
+
+ ByteBuffer inDup = in.slice();
+ inDup.limit(inDup.position()+size);
+
+ Binary binary;
+/* if(isCopy && inDup.hasArray())
+ {
+ binary= new Binary(inDup.array(), inDup.arrayOffset()+inDup.position(),size);
+ }
+ else
+ {*/
+ byte[] buf = new byte[size];
+ inDup.get(buf);
+ binary = new Binary(buf);
+ /* }*/
+
+ in.position(in.position()+size);
+
+
+ return binary;
+
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryWriter.java
new file mode 100644
index 0000000000..8ab4569646
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BinaryWriter.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+
+public class BinaryWriter extends SimpleVariableWidthWriter<Binary>
+{
+ private int _offset;
+ private int _length;
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return (byte)0xb0;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return (byte)0xa0;
+ }
+
+ @Override
+ protected byte[] getByteArray(Binary value)
+ {
+ _offset = value.getArrayOffset();
+ _length = value.getLength();
+ return value.getArray();
+ }
+
+ @Override
+ protected int getOffset()
+ {
+ return _offset;
+ }
+
+ @Override protected int getLength()
+ {
+ return _length;
+ }
+
+ private static Factory<Binary> FACTORY = new Factory<Binary>()
+ {
+
+ public ValueWriter<Binary> newInstance(Registry registry)
+ {
+ return new BinaryWriter();
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(Binary.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanConstructor.java
new file mode 100644
index 0000000000..5cad87cbd8
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanConstructor.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class BooleanConstructor
+{
+ private static final TypeConstructor<Boolean> TRUE_INSTANCE = new TypeConstructor<Boolean>()
+ {
+ public Boolean construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return Boolean.TRUE;
+ }
+ };
+
+ private static final TypeConstructor<Boolean> FALSE_INSTANCE = new TypeConstructor<Boolean>()
+ {
+ public Boolean construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return Boolean.FALSE;
+ }
+ };
+ private static final TypeConstructor<Boolean> BYTE_INSTANCE = new TypeConstructor<Boolean>()
+ {
+ public Boolean construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return b != (byte) 0;
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct boolean: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+ };
+
+
+ public static TypeConstructor<Boolean> getTrueInstance()
+ {
+ return TRUE_INSTANCE;
+ }
+
+ public static TypeConstructor<Boolean> getFalseInstance()
+ {
+ return FALSE_INSTANCE;
+ }
+
+ public static TypeConstructor<Boolean> getByteInstance()
+ {
+ return BYTE_INSTANCE;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanWriter.java
new file mode 100644
index 0000000000..fb4449fb2c
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/BooleanWriter.java
@@ -0,0 +1,70 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class BooleanWriter implements ValueWriter<Boolean>
+{
+ private boolean _complete = true;
+ private boolean _value;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+ if(!_complete & buffer.hasRemaining())
+ {
+ buffer.put(_value ? (byte)0x41 : (byte)0x42);
+ _complete = true;
+ }
+ return 1;
+ }
+
+ public void setValue(Boolean value)
+ {
+ _complete = false;
+ _value = value.booleanValue();
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ private static Factory<Boolean> FACTORY = new Factory<Boolean>()
+ {
+
+ public ValueWriter<Boolean> newInstance(Registry registry)
+ {
+ return new BooleanWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Boolean.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteArrayWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteArrayWriter.java
new file mode 100644
index 0000000000..662b4085db
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteArrayWriter.java
@@ -0,0 +1,66 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public class ByteArrayWriter extends SimpleVariableWidthWriter<byte[]>
+{
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return (byte)0xb0;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return (byte)0xa0;
+ }
+
+ @Override
+ protected byte[] getByteArray(byte[] value)
+ {
+ return value;
+ }
+
+
+ @Override
+ protected int getOffset()
+ {
+ return 0;
+ }
+
+ private static Factory<byte[]> FACTORY = new Factory<byte[]>()
+ {
+
+ public ValueWriter<byte[]> newInstance(Registry registry)
+ {
+ return new ByteArrayWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(byte[].class, FACTORY);
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteBufferWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteBufferWriter.java
new file mode 100644
index 0000000000..41bd20c0a2
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteBufferWriter.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class ByteBufferWriter extends SimpleVariableWidthWriter<ByteBuffer>
+{
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return (byte)0xb0;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return (byte)0xa0;
+ }
+
+ @Override
+ protected byte[] getByteArray(ByteBuffer value)
+ {
+ if(value.hasArray() && value.arrayOffset() == 0 && value.remaining() == value.array().length)
+ {
+ return value.array();
+ }
+ else
+ {
+ byte[] copy = new byte[value.remaining()];
+ value.duplicate().get(copy);
+ return copy;
+ }
+ }
+
+ @Override
+ protected int getOffset()
+ {
+ return 0;
+ }
+
+ private static Factory<ByteBuffer> FACTORY = new Factory<ByteBuffer>()
+ {
+
+ public ValueWriter<ByteBuffer> newInstance(Registry registry)
+ {
+ return new ByteBufferWriter();
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(ByteBuffer.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteTypeConstructor.java
new file mode 100644
index 0000000000..03db2c568c
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteTypeConstructor.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class ByteTypeConstructor implements TypeConstructor
+{
+ private static final ByteTypeConstructor INSTANCE = new ByteTypeConstructor();
+
+ public static ByteTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private ByteTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ return in.get();
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct byte: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteWriter.java
new file mode 100644
index 0000000000..6155de4d2a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ByteWriter.java
@@ -0,0 +1,90 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class ByteWriter implements ValueWriter<Byte>
+{
+ private int _written = 2;
+ private byte _value;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ switch(_written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)0x51);
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(_value);
+ _written = 2;
+ }
+ else
+ {
+ _written = 1;
+ }
+
+ }
+
+ return 2;
+ }
+
+ public void setValue(Byte value)
+ {
+ _written = 0;
+ _value = value.byteValue();
+ }
+
+ public boolean isComplete()
+ {
+ return _written == 2;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ private static Factory<Byte> FACTORY = new Factory<Byte>()
+ {
+
+ public ValueWriter<Byte> newInstance(Registry registry)
+ {
+ return new ByteWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Byte.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharTypeConstructor.java
new file mode 100644
index 0000000000..6a2ce2d725
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharTypeConstructor.java
@@ -0,0 +1,67 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+import java.nio.ByteBuffer;
+
+public class CharTypeConstructor implements TypeConstructor
+{
+ private static final CharTypeConstructor INSTANCE = new CharTypeConstructor();
+
+
+ public static CharTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private CharTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=4)
+ {
+ int codePoint = in.getInt();
+ char[] chars = Character.toChars(codePoint);
+ if(chars.length == 1)
+ {
+ return chars[0];
+ }
+ else
+ {
+ return chars;
+ }
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct char: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharWriter.java
new file mode 100644
index 0000000000..05f6e28d2f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CharWriter.java
@@ -0,0 +1,53 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public class CharWriter extends FixedFourWriter<Character>
+{
+ private static final byte FORMAT_CODE = (byte)0x73;
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ @Override
+ int convertValueToInt(Character value)
+ {
+ return (int) value.charValue();
+ }
+
+ private static Factory<Character> FACTORY = new Factory<Character>()
+ {
+
+ public ValueWriter<Character> newInstance(Registry registry)
+ {
+ return new CharWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Character.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeAssembler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeAssembler.java
new file mode 100644
index 0000000000..5625797f74
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeAssembler.java
@@ -0,0 +1,36 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+public interface CompoundTypeAssembler
+{
+
+ public static interface Factory
+ {
+ CompoundTypeAssembler newInstance();
+ }
+
+ void init(int count) throws AmqpErrorException;
+ void addItem(Object obj) throws AmqpErrorException;
+ Object complete() throws AmqpErrorException;
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeConstructor.java
new file mode 100644
index 0000000000..fc4fcdf9ee
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundTypeConstructor.java
@@ -0,0 +1,192 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Formatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class CompoundTypeConstructor extends VariableWidthTypeConstructor
+{
+ private final CompoundTypeAssembler.Factory _assemblerFactory;
+
+ public static final CompoundTypeAssembler.Factory LIST_ASSEMBLER_FACTORY =
+ new CompoundTypeAssembler.Factory()
+ {
+
+ public CompoundTypeAssembler newInstance()
+ {
+ return new ListAssembler();
+ }
+ };
+
+
+
+ private static class ListAssembler implements CompoundTypeAssembler
+ {
+ private List _list;
+
+ public void init(final int count) throws AmqpErrorException
+ {
+ _list = new ArrayList(count);
+ }
+
+ public void addItem(final Object obj) throws AmqpErrorException
+ {
+ _list.add(obj);
+ }
+
+ public Object complete() throws AmqpErrorException
+ {
+ return _list;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ListAssembler{" +
+ "_list=" + _list +
+ '}';
+ }
+ }
+
+
+ public static final CompoundTypeAssembler.Factory MAP_ASSEMBLER_FACTORY =
+ new CompoundTypeAssembler.Factory()
+ {
+
+ public CompoundTypeAssembler newInstance()
+ {
+ return new MapAssembler();
+ }
+ };
+
+ private static class MapAssembler implements CompoundTypeAssembler
+ {
+ private Map _map;
+ private Object _lastKey;
+ private static final Object NOT_A_KEY = new Object();
+
+
+ public void init(final int count) throws AmqpErrorException
+ {
+ // Can't have an odd number of elements in a map
+ if((count & 0x1) == 1)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.DECODE_ERROR);
+ Formatter formatter = new Formatter();
+ formatter.format("map cannot have odd number of elements: %d", count);
+ error.setDescription(formatter.toString());
+ throw new AmqpErrorException(error);
+ }
+ _map = new HashMap(count);
+ _lastKey = NOT_A_KEY;
+ }
+
+ public void addItem(final Object obj) throws AmqpErrorException
+ {
+ if(_lastKey != NOT_A_KEY)
+ {
+ if(_map.put(_lastKey, obj) != null)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.DECODE_ERROR);
+ Formatter formatter = new Formatter();
+ formatter.format("map cannot have duplicate keys: %s has values (%s, %s)", _lastKey, _map.get(_lastKey), obj);
+ error.setDescription(formatter.toString());
+
+ throw new AmqpErrorException(error);
+ }
+ _lastKey = NOT_A_KEY;
+ }
+ else
+ {
+ _lastKey = obj;
+ }
+
+ }
+
+ public Object complete() throws AmqpErrorException
+ {
+ return _map;
+ }
+ }
+
+
+ public static CompoundTypeConstructor getInstance(int i,
+ CompoundTypeAssembler.Factory assemblerFactory)
+ {
+ return new CompoundTypeConstructor(i, assemblerFactory);
+ }
+
+
+ private CompoundTypeConstructor(int size,
+ final CompoundTypeAssembler.Factory assemblerFactory)
+ {
+ super(size);
+ _assemblerFactory = assemblerFactory;
+ }
+
+ @Override
+ public Object construct(final ByteBuffer in, boolean isCopy, ValueHandler delegate) throws AmqpErrorException
+ {
+ int size;
+ int count;
+
+ if(getSize() == 1)
+ {
+ size = in.get() & 0xFF;
+ count = in.get() & 0xFF;
+ }
+ else
+ {
+ size = in.getInt();
+ count = in.getInt();
+ }
+
+ ByteBuffer data;
+ ByteBuffer inDup = in.slice();
+
+ inDup.limit(size-getSize());
+
+ CompoundTypeAssembler assembler = _assemblerFactory.newInstance();
+
+ assembler.init(count);
+
+ for(int i = 0; i < count; i++)
+ {
+ assembler.addItem(delegate.parse(in));
+ }
+
+ return assembler.complete();
+
+ }
+
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java
new file mode 100644
index 0000000000..39dce2b448
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/CompoundWriter.java
@@ -0,0 +1,420 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class CompoundWriter<V> implements ValueWriter<V>
+{
+ private int _length;
+ private Registry _registry;
+ private static final int LARGE_COMPOUND_THRESHOLD_COUNT = 25;
+ private ValueWriter _delegate;
+ private Map<Class, ValueWriter> _writerCache = new HashMap<Class, ValueWriter>();
+
+ public CompoundWriter(final Registry registry)
+ {
+ _registry = registry;
+ }
+
+ enum State {
+ FORMAT_CODE,
+ SIZE_0,
+ SIZE_1,
+ SIZE_2,
+ SIZE_3,
+ COUNT_0,
+ COUNT_1,
+ COUNT_2,
+ COUNT_3,
+ DELEGATING,
+ DONE
+ }
+
+ private State _state = State.FORMAT_CODE;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+ return writeToBuffer(buffer, false);
+ }
+
+ public int writeToBuffer(ByteBuffer buffer, boolean large)
+ {
+ final int length = _length;
+
+ if(length == -1)
+ {
+ writeFirstPass(buffer, (large || getCount() > LARGE_COMPOUND_THRESHOLD_COUNT) ? 4 : 1);
+ if(_delegate != null && _delegate.isComplete())
+ {
+ _delegate = null;
+ }
+ }
+ else
+ {
+ //
+
+ final int size = (length & 0xFFFFFF00) == 0 ? 1 : 4;
+ final int count = getCount();
+ final int typeLength = length - (1+size);
+
+ State state = _state;
+
+ switch(state)
+ {
+ case FORMAT_CODE:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(size == 1 ? getSingleOctetEncodingCode(): getFourOctetEncodingCode());
+ state = State.SIZE_0;
+ }
+ else
+ {
+ break;
+ }
+
+ case SIZE_0:
+ if(size == 4)
+ {
+ if(buffer.remaining()>=4)
+ {
+ buffer.putInt(typeLength);
+ state = State.COUNT_0;
+ }
+ }
+ else if(size == 1)
+ {
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)(typeLength));
+ state = State.COUNT_0;
+ }
+ else
+ {
+ break;
+ }
+
+ }
+ case SIZE_1:
+ case SIZE_2:
+ if(state != State.COUNT_0 && buffer.remaining() >= 2)
+ {
+ buffer.putShort((short)(((typeLength) >> ((3-state.ordinal())<<3)) & 0xFFFF ));
+ state = (state == State.SIZE_0)
+ ? State.SIZE_2
+ : (state == State.SIZE_1)
+ ? State.SIZE_3
+ : State.COUNT_0;
+ }
+ case SIZE_3:
+ if(state != State.COUNT_0 && buffer.hasRemaining())
+ {
+ buffer.put((byte)(((typeLength) >> ((4-state.ordinal())<<3)) & 0xFF ));
+ state = (state == State.SIZE_0)
+ ? State.SIZE_1
+ : (state == State.SIZE_1)
+ ? State.SIZE_2
+ : (state == State.SIZE_2)
+ ? State.SIZE_3
+ : State.COUNT_0;
+ }
+ case COUNT_0:
+ if(size == 4)
+ {
+ if(buffer.remaining()>=4)
+ {
+ buffer.putInt(count);
+ state = State.DELEGATING;
+ }
+ }
+ else if(size == 1)
+ {
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)count);
+ state = State.DELEGATING;
+ }
+ else
+ {
+ break;
+ }
+
+ }
+
+ case COUNT_1:
+ case COUNT_2:
+ if(state != State.DELEGATING && buffer.remaining() >= 2)
+ {
+ buffer.putShort((short)((count >> ((7-state.ordinal())<<3)) & 0xFFFF ));
+ state = state == State.COUNT_0
+ ? State.COUNT_2
+ : state == State.COUNT_1
+ ? State.COUNT_3
+ : State.DELEGATING;
+ }
+ case COUNT_3:
+ if(state != State.DELEGATING && buffer.hasRemaining())
+ {
+ buffer.put((byte)((count >> ((8-state.ordinal())<<3)) & 0xFF ));
+ state = state == State.COUNT_0
+ ? State.COUNT_1
+ : state == State.COUNT_1
+ ? State.COUNT_2
+ : state == State.COUNT_2
+ ? State.COUNT_3
+ : State.DELEGATING;
+ }
+ case DELEGATING:
+ while(state == State.DELEGATING && buffer.hasRemaining())
+ {
+ if(_delegate == null || _delegate.isComplete())
+ {
+ if(hasNext())
+ {
+ Object val = next();
+ _delegate = _registry.getValueWriter(val);
+ }
+ else
+ {
+ state = State.DONE;
+ break;
+ }
+ }
+ _delegate.writeToBuffer(buffer);
+ }
+ }
+
+ _state = state;
+
+ }
+
+ return _length;
+ }
+
+ private void writeFirstPass(ByteBuffer buffer, int size)
+ {
+
+ State state = State.FORMAT_CODE;
+ /*ByteBuffer origBuffer = buffer;
+ buffer = buffer.duplicate();*/
+ int origPosition = buffer.position();
+ int length ;
+
+
+ if(size == 4)
+ {
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFourOctetEncodingCode());
+
+ // Skip the size - we will come back and patch this
+ if(buffer.remaining() >= 4 )
+ {
+ buffer.position(buffer.position()+4);
+ state = State.COUNT_0;
+ }
+ else
+ {
+ state = State.values()[buffer.remaining()+1];
+ buffer.position(buffer.limit());
+ }
+
+
+ switch(buffer.remaining())
+ {
+ case 0:
+ break;
+ case 1:
+ buffer.put((byte)((getCount() >> 24) & 0xFF));
+ state = State.COUNT_1;
+ break;
+ case 2:
+ buffer.putShort((short)((getCount() >> 16) & 0xFFFF));
+ state = State.COUNT_2;
+ break;
+ case 3:
+ buffer.putShort((short)((getCount() >> 16) & 0xFFFF));
+ buffer.put((byte)((getCount() >> 8) & 0xFF));
+ state = State.COUNT_3;
+ break;
+ default:
+ buffer.putInt(getCount());
+ state = State.DELEGATING;
+ }
+
+
+
+ }
+ length = 9;
+
+
+
+ }
+ else
+ {
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getSingleOctetEncodingCode());
+ if(buffer.hasRemaining())
+ {
+ // Size - we will come back and patch this
+ buffer.put((byte) 0);
+
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)getCount());
+ state = State.DELEGATING;
+ }
+ else
+ {
+ state = State.COUNT_0;
+ }
+ }
+ else
+ {
+ state = State.SIZE_0;
+ }
+ }
+ length = 3;
+
+ }
+
+
+ int iterPos = -1;
+ for(int i = 0; i < getCount(); i++)
+ {
+ Object val = next();
+ ValueWriter writer = _registry.getValueWriter(val, _writerCache);
+ if(writer == null)
+ {
+ // TODO
+ System.out.println("no writer for " + val);
+ }
+ length += writer.writeToBuffer(buffer);
+ if(iterPos == -1 && !writer.isComplete())
+ {
+ iterPos = i;
+ _delegate = writer;
+ }
+
+ if(size == 1 && length > 255)
+ {
+ reset();
+ buffer.position(origPosition);
+ writeFirstPass(buffer, 4);
+ return;
+ }
+
+ }
+
+ // TODO - back-patch size
+ if(buffer.limit() - origPosition >= 2)
+ {
+ buffer.position(origPosition+1);
+ if(size == 1)
+ {
+ buffer.put((byte)((length & 0xFF)-2));
+ }
+ else
+ {
+ switch(buffer.remaining())
+ {
+ case 1:
+ buffer.put((byte)(((length-5) >> 24) & 0xFF));
+ break;
+ case 2:
+ buffer.putShort((short)(((length-5) >> 16) & 0xFFFF));
+ break;
+ case 3:
+ buffer.putShort((short)(((length-5) >> 16) & 0xFFFF));
+ buffer.put((byte)(((length-5) >> 8) & 0xFF));
+ break;
+ default:
+ buffer.putInt(length-5);
+ }
+ }
+ }
+
+ if(buffer.limit() - origPosition >= length)
+ {
+ buffer.position(origPosition+length);
+ state = State.DONE;
+ }
+ else
+ {
+ reset();
+ while(iterPos-- >= 0)
+ {
+ next();
+ }
+ buffer.position(buffer.limit());
+ }
+ _state = state;
+ _length = length;
+ }
+
+ protected abstract byte getFourOctetEncodingCode();
+
+ protected abstract byte getSingleOctetEncodingCode();
+
+ public void setValue(V value)
+ {
+ _length = -1;
+ _delegate = null;
+ _state = State.FORMAT_CODE;
+ onSetValue(value);
+ }
+
+ public void setRegistry(Registry registry)
+ {
+ _registry = registry;
+ }
+
+ public Registry getRegistry()
+ {
+ return _registry;
+ }
+
+ protected abstract void onSetValue(final V value);
+
+ protected abstract int getCount();
+
+ protected abstract boolean hasNext();
+
+ protected abstract Object next();
+
+ protected abstract void clear();
+
+ protected abstract void reset();
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+ public boolean isComplete()
+ {
+ return _state == State.DONE;
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DecimalConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DecimalConstructor.java
new file mode 100644
index 0000000000..6c3b64aa25
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DecimalConstructor.java
@@ -0,0 +1,230 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.math.BigDecimal;
+import java.nio.ByteBuffer;
+
+public abstract class DecimalConstructor implements TypeConstructor<BigDecimal>
+{
+
+ private static final DecimalConstructor DECIMAL_32 = new DecimalConstructor()
+ {
+
+ public BigDecimal construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+
+
+ int val;
+
+ if(in.remaining()>=4)
+ {
+ val = in.getInt();
+ }
+ else
+ {
+ throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Cannot construct decimal32: insufficient input data");
+ }
+
+ return constructFrom32(val);}
+
+ };
+
+
+ private static final DecimalConstructor DECIMAL_64 = new DecimalConstructor()
+ {
+
+ public BigDecimal construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ long val;
+
+ if(in.remaining()>=8)
+ {
+ val = in.getLong();
+ }
+ else
+ {
+ throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Cannot construct decimal64: insufficient input data");
+ }
+
+ return constructFrom64(val);
+
+ }
+
+ };
+
+
+ private static final DecimalConstructor DECIMAL_128 = new DecimalConstructor()
+ {
+
+ public BigDecimal construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ long high;
+ long low;
+
+ if(in.remaining()>=16)
+ {
+ high = in.getLong();
+ low = in.getLong();
+ }
+ else
+ {
+ throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Cannot construct decimal128: insufficient input data");
+ }
+
+ return constructFrom128(high, low);
+
+ }
+
+ };
+
+ private static final BigDecimal TWO_TO_THE_SIXTY_FOUR = new BigDecimal(2).pow(64);
+
+ private static BigDecimal constructFrom128(long high, long low)
+ {
+ int sign = ((high & 0x8000000000000000l) == 0) ? 1 : -1;
+
+ int exponent = 0;
+ long significand = high;
+
+ if((high & 0x6000000000000000l) != 0x6000000000000000l)
+ {
+ exponent = ((int) ((high & 0x7FFE000000000000l) >> 49)) - 6176;
+ significand = high & 0x0001ffffffffffffl;
+ }
+ else if((high & 0x7800000000000000l) != 0x7800000000000000l)
+ {
+ exponent = ((int)((high & 0x1fff800000000000l)>>47)) - 6176;
+ significand = (0x00007fffffffffffl & high) | 0x0004000000000000l;
+ }
+ else
+ {
+ // NaN or infinite
+ return null;
+ }
+
+
+ BigDecimal bigDecimal = new BigDecimal(significand).multiply(TWO_TO_THE_SIXTY_FOUR);
+ if(low >=0)
+ {
+ bigDecimal = bigDecimal.add(new BigDecimal(low));
+ }
+ else
+ {
+ bigDecimal = bigDecimal.add(TWO_TO_THE_SIXTY_FOUR.add(new BigDecimal(low)));
+ }
+ if(((high & 0x8000000000000000l) != 0))
+ {
+ bigDecimal = bigDecimal.negate();
+ }
+ bigDecimal = bigDecimal.scaleByPowerOfTen(exponent);
+ return bigDecimal;
+ }
+
+
+ private static BigDecimal constructFrom64(final long val)
+ {
+ int sign = ((val & 0x8000000000000000l) == 0) ? 1 : -1;
+
+ int exponent = 0;
+ long significand = val;
+
+ if((val & 0x6000000000000000l) != 0x6000000000000000l)
+ {
+ exponent = ((int) ((val & 0x7FE0000000000000l) >> 53)) - 398;
+ significand = val & 0x001fffffffffffffl;
+ }
+ else if((val & 0x7800000000000000l) != 0x7800000000000000l)
+ {
+ exponent = ((int)((val & 0x1ff8000000000000l)>>51)) - 398;
+ significand = (0x0007ffffffffffffl & val) | 0x0020000000000000l;
+ }
+ else
+ {
+ // NaN or infinite
+ return null;
+ }
+
+ BigDecimal bigDecimal = new BigDecimal(sign * significand);
+ bigDecimal = bigDecimal.scaleByPowerOfTen(exponent);
+ return bigDecimal;
+ }
+
+ private static BigDecimal constructFrom32(final int val)
+ {
+ int sign = ((val & 0x80000000) == 0) ? 1 : -1;
+
+ int exponent = 0;
+ int significand = val;
+
+ if((val & 0x60000000) != 0x60000000)
+ {
+ exponent = ((int) ((val & 0x7F800000) >> 23)) - 101;
+ significand = val & 0x007fffffff;
+ }
+ else if((val & 0x78000000) != 0x78000000)
+ {
+ exponent = ((int)((val & 0x1fe00000)>>21)) - 101;
+ significand = (0x001fffff & val) | 0x00800000;
+ }
+ else
+ {
+ // NaN or infinite
+ return null;
+ }
+
+ BigDecimal bigDecimal = new BigDecimal(sign * significand);
+ bigDecimal = bigDecimal.scaleByPowerOfTen(exponent);
+ return bigDecimal;
+ }
+
+/*
+
+ public static void main(String[] args)
+ {
+ System.out.println(constructFrom128(0l,0l));
+ System.out.println(constructFrom128(0x3041ED09BEAD87C0l,0x378D8E63FFFFFFFFl));
+ System.out.println(constructFrom64(0l));
+ System.out.println(constructFrom64(0x5fe0000000000001l));
+ System.out.println(constructFrom64(0xec7386F26FC0FFFFl));
+ System.out.println(constructFrom32(0));
+ System.out.println(constructFrom32(0x6cb8967f));
+
+ }
+*/
+
+ public static TypeConstructor getDecimal32Instance()
+ {
+ return DECIMAL_32;
+ }
+
+ public static TypeConstructor getDecimal64Instance()
+ {
+ return DECIMAL_64;
+ }
+
+ public static TypeConstructor getDecimal128Instance()
+ {
+ return DECIMAL_128;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DefaultDescribedTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DefaultDescribedTypeConstructor.java
new file mode 100644
index 0000000000..48b2045298
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DefaultDescribedTypeConstructor.java
@@ -0,0 +1,70 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DefaultDescribedTypeConstructor extends DescribedTypeConstructor
+{
+ private Object _descriptor;
+
+ public DefaultDescribedTypeConstructor(final Object descriptor)
+ {
+ _descriptor = descriptor;
+ }
+
+ public Object construct(final Object underlying)
+ {
+ return new DescribedType(_descriptor, underlying);
+ }
+
+
+ public static void main(String[] args) throws IOException, ParseException
+ {
+ LineNumberReader reader = new LineNumberReader(new InputStreamReader(System.in));
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
+ String line;
+ Pattern pattern = Pattern.compile("^\\d+ (\\d{4}-\\d{2}-\\d{2} \\d\\d:\\d\\d:\\d\\d,\\d\\d\\d)");
+
+ long prevTime = Long.MAX_VALUE;
+
+ while((line = reader.readLine()) != null)
+ {
+ Matcher m = pattern.matcher(line);
+ if(m.matches())
+ {
+ String timeStr = m.group(1);
+ long time = df.parse(timeStr).getTime();
+ if(time - prevTime > 20000)
+ {
+ System.out.println(df.format(prevTime) + " - " + df.format(time));
+ }
+ prevTime = time;
+ }
+ }
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DelegatingValueWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DelegatingValueWriter.java
new file mode 100644
index 0000000000..b11530d94f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DelegatingValueWriter.java
@@ -0,0 +1,52 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class DelegatingValueWriter<V> implements ValueWriter<V>
+{
+ private ValueWriter _delegate;
+ private Registry _registry;
+
+
+ protected DelegatingValueWriter(final Registry registry)
+ {
+ _registry = registry;
+ }
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(final V frameBody)
+ {
+ _delegate = _registry.getValueWriter(getUnderlyingValue(frameBody));
+ }
+
+ protected abstract Object getUnderlyingValue(final V frameBody);
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedType.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedType.java
new file mode 100644
index 0000000000..2f171c49b2
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedType.java
@@ -0,0 +1,85 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+public class DescribedType
+{
+ private final Object _descriptor;
+ private final Object _described;
+
+ public DescribedType(final Object descriptor, final Object described)
+ {
+ _descriptor = descriptor;
+ _described = described;
+ }
+
+ public Object getDescriptor()
+ {
+ return _descriptor;
+ }
+
+ public Object getDescribed()
+ {
+ return _described;
+ }
+
+ @Override
+ public boolean equals(final Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ final DescribedType that = (DescribedType) o;
+
+ if (_described != null ? !_described.equals(that._described) : that._described != null)
+ {
+ return false;
+ }
+ if (_descriptor != null ? !_descriptor.equals(that._descriptor) : that._descriptor != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int result = _descriptor != null ? _descriptor.hashCode() : 0;
+ result = 31 * result + (_described != null ? _described.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "DescribedType{"+ _descriptor +
+ ", " + _described +
+ '}';
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructor.java
new file mode 100644
index 0000000000..4093583441
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructor.java
@@ -0,0 +1,41 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import java.nio.ByteBuffer;
+
+public abstract class DescribedTypeConstructor<T extends Object>
+{
+ public TypeConstructor<T> construct(final TypeConstructor describedConstructor) throws AmqpErrorException
+ {
+ return new TypeConstructor<T>()
+ {
+ public T construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return DescribedTypeConstructor.this.construct(describedConstructor.construct(in, handler));
+ }
+ };
+ }
+
+ public abstract T construct(Object underlying);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructorRegistry.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructorRegistry.java
new file mode 100644
index 0000000000..38cfa0f5a7
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DescribedTypeConstructorRegistry.java
@@ -0,0 +1,35 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public interface DescribedTypeConstructorRegistry
+{
+ public static interface Source
+ {
+ public DescribedTypeConstructorRegistry getDescribedTypeRegistry();
+ }
+
+ void register(Object descriptor, DescribedTypeConstructor constructor);
+
+ DescribedTypeConstructor getConstructor(Object descriptor);
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleTypeConstructor.java
new file mode 100644
index 0000000000..439ad73875
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleTypeConstructor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class DoubleTypeConstructor implements TypeConstructor
+{
+ private static final DoubleTypeConstructor INSTANCE = new DoubleTypeConstructor();
+
+
+ public static DoubleTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private DoubleTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=8)
+ {
+ return in.getDouble();
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct double: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleWriter.java
new file mode 100644
index 0000000000..372e739a51
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/DoubleWriter.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public class DoubleWriter extends FixedEightWriter<Double>
+{
+ private static final byte FORMAT_CODE = (byte) 0x82;
+
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ @Override
+ long convertValueToLong(Double value)
+ {
+ return Double.doubleToLongBits(value.doubleValue());
+ }
+
+ private static Factory<Double> FACTORY = new Factory<Double>()
+ {
+
+ public ValueWriter<Double> newInstance(Registry registry)
+ {
+ return new DoubleWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Double.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/Encoder.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/Encoder.java
new file mode 100644
index 0000000000..9b2a654f10
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/Encoder.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+
+import java.nio.ByteBuffer;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface Encoder
+{
+
+ public boolean writeNull();
+
+ public boolean writeBoolean(boolean b);
+
+ public boolean writeByte(byte b);
+
+ public boolean writeUnsignedByte(ByteBuffer buf, UnsignedByte ub);
+
+ public boolean writeShort(ByteBuffer buf, short s);
+
+ public boolean writeUnsignedShort(UnsignedShort s);
+
+ public boolean writeInt(int i);
+
+ public boolean writeUnsignedInt(UnsignedInteger i);
+
+ public boolean writeLong(long l);
+
+ public boolean writeUnsignedLong(UnsignedLong l);
+
+ public boolean writeFloat(float f);
+
+ public boolean writeDouble(double d);
+
+ public boolean writeChar(char c);
+
+ public boolean writeTimestamp(Date d);
+
+ public boolean writeSymbol(Symbol s);
+
+ public boolean writeString(String s);
+
+ public boolean writeBytes(byte[] bytes);
+
+ public boolean writeBytes(Binary bin);
+
+ public boolean writeList(List l);
+
+ public boolean writeMap(Map m);
+
+ public boolean writeEncodable(EncodableValue o);
+
+ public boolean writeDescribedType(EncodableValue descriptor, EncodableValue described);
+
+ interface EncodableValue
+ {
+ void encode(Encoder encoder);
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedEightWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedEightWriter.java
new file mode 100644
index 0000000000..c9cc0b72c3
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedEightWriter.java
@@ -0,0 +1,108 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class FixedEightWriter<T extends Object> implements ValueWriter<T>
+{
+ private int _written = 9;
+ private long _value;
+
+ public final int writeToBuffer(ByteBuffer buffer)
+ {
+ int remaining = buffer.remaining();
+ int written = _written;
+ switch(written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFormatCode());
+ remaining--;
+ written = 1;
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(remaining>=8)
+ {
+ buffer.putLong(_value);
+ written = 9;
+ break;
+ }
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ if(remaining >= 4)
+ {
+ buffer.putInt((int)((_value >> ((5-written)<<3)) & 0xFFFFFFFF ));
+ remaining-=4;
+ written+=4;
+ }
+ case 6:
+ case 7:
+ if(remaining >= 2 && written <= 7)
+ {
+ buffer.putShort((short)((_value >> ((7-written)<<3)) & 0xFFFF ));
+ remaining -= 2;
+ written += 2;
+ }
+ case 8:
+ if(remaining >=1 && written != 9)
+ {
+ buffer.put((byte)((_value >> ((8-written)<<3)) & 0xFF ));
+ written++;
+ }
+
+
+ }
+ _written = written;
+
+ return 9;
+ }
+
+ abstract byte getFormatCode();
+
+ public final void setValue(T value)
+ {
+ _written = 0;
+ _value = convertValueToLong(value);
+ }
+
+ abstract long convertValueToLong(T value);
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public final boolean isComplete()
+ {
+ return _written == 9;
+ }
+
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedFourWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedFourWriter.java
new file mode 100644
index 0000000000..164a869299
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedFourWriter.java
@@ -0,0 +1,122 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class FixedFourWriter<T extends Object> implements ValueWriter<T>
+{
+ private int _written = 5;
+ private int _value;
+
+ public final int writeToBuffer(ByteBuffer buffer)
+ {
+ int remaining = buffer.remaining();
+ int written = _written;
+ switch(written)
+ {
+ case 0:
+ if(remaining-- != 0)
+ {
+ buffer.put(getFormatCode());
+ written = 1;
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(remaining>=4)
+ {
+ buffer.putInt(_value);
+ written = 5;
+ break;
+ }
+ else if(remaining-- != 0)
+ {
+ buffer.put((byte)((_value >> 24)&0xFF));
+ written = 2;
+ }
+ else
+ {
+ break;
+ }
+ case 2:
+ if(remaining-- != 0)
+ {
+ buffer.put((byte)((_value >> 16)&0xFF));
+ written = 3;
+ }
+ else
+ {
+ break;
+ }
+ case 3:
+ if(remaining-- != 0)
+ {
+ buffer.put((byte)((_value >> 8)&0xFF));
+ written = 4;
+ }
+ else
+ {
+ break;
+ }
+ case 4:
+ if(remaining-- != 0)
+ {
+ buffer.put((byte)(_value&0xFF));
+ written = 5;
+ }
+
+ }
+ _written = written;
+
+ return 5;
+ }
+
+ abstract byte getFormatCode();
+
+ public final void setValue(T value)
+ {
+ if(_written==1)
+ {
+ // TODO - remove
+ System.out.println("Remove");
+ }
+ _written = 0;
+ _value = convertValueToInt(value);
+ }
+
+ abstract int convertValueToInt(T value);
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public final boolean isComplete()
+ {
+ return _written == 5;
+ }
+
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedOneWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedOneWriter.java
new file mode 100644
index 0000000000..805b0743a4
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedOneWriter.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+
+public abstract class FixedOneWriter<T> implements ValueWriter<T>
+{
+ protected int _written = 2;
+ protected byte _value;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ switch(_written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFormatCode());
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(_value);
+ _written = 2;
+ }
+ else
+ {
+ _written = 1;
+ }
+
+ }
+
+ return 2;
+ }
+
+ protected abstract byte getFormatCode();
+
+ public boolean isComplete()
+ {
+ return _written == 2;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public void setValue(final T value)
+ {
+ _written = 0;
+ _value = convertToByte(value);
+ }
+
+ protected abstract byte convertToByte(final T value);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedSixteenWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedSixteenWriter.java
new file mode 100644
index 0000000000..20334595db
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedSixteenWriter.java
@@ -0,0 +1,150 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class FixedSixteenWriter<T extends Object> implements ValueWriter<T>
+{
+ private int _written = 17;
+ private long _msb;
+ private long _lsb;
+
+ public final int writeToBuffer(ByteBuffer buffer)
+ {
+ int remaining = buffer.remaining();
+ int written = _written;
+ switch(written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFormatCode());
+ remaining--;
+ written = 1;
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(remaining>=8)
+ {
+ buffer.putLong(_msb);
+ written = 9;
+ break;
+ }
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ if(remaining >= 4)
+ {
+ buffer.putInt((int)((_msb >> ((5-written)<<3)) & 0xFFFFFFFF ));
+ remaining-=4;
+ written+=4;
+ }
+ case 6:
+ case 7:
+ if(remaining >= 2 && written <= 7)
+ {
+ buffer.putShort((short)((_msb >> ((7-written)<<3)) & 0xFFFF ));
+ remaining -= 2;
+ written += 2;
+ }
+ case 8:
+ if(remaining >=1 && written != 9)
+ {
+ buffer.put((byte)((_msb >> ((8-written)<<3)) & 0xFF ));
+ written++;
+ }
+
+
+ }
+ if(remaining != 0)
+ {
+ switch(written)
+ {
+ case 9:
+ if(remaining>=8)
+ {
+ buffer.putLong(_lsb);
+ written = 17;
+ break;
+ }
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ if(remaining >= 4)
+ {
+ buffer.putInt((int)((_lsb >> ((13-written)<<3)) & 0xFFFFFFFF ));
+ remaining-=4;
+ written+=4;
+ }
+ case 14:
+ case 15:
+ if(remaining >= 2 && written <= 15)
+ {
+ buffer.putShort((short)((_lsb >> ((15-written)<<3)) & 0xFFFF ));
+ remaining -= 2;
+ written += 2;
+ }
+ case 16:
+ if(remaining >=1 && written != 17)
+ {
+ buffer.put((byte)((_msb >> ((16-written)<<3)) & 0xFF ));
+ written++;
+ }
+ }
+
+ }
+
+ _written = written;
+
+ return 17;
+ }
+
+ abstract byte getFormatCode();
+
+ public final void setValue(T value)
+ {
+ _written = 0;
+ _msb = convertValueToMSB(value);
+ _lsb = convertValueToLSB(value);
+ }
+
+ abstract long convertValueToMSB(T value);
+ abstract long convertValueToLSB(T value);
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public final boolean isComplete()
+ {
+ return _written == 17;
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedTwoWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedTwoWriter.java
new file mode 100644
index 0000000000..f6da0490a6
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FixedTwoWriter.java
@@ -0,0 +1,96 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class FixedTwoWriter <T extends Object> implements ValueWriter<T>
+{
+ private int _written = 3;
+ private short _value;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ switch(_written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFormatCode());
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+
+ if(buffer.remaining()>1)
+ {
+ buffer.putShort(_value);
+ _written = 3;
+ }
+ else if(buffer.hasRemaining())
+ {
+ buffer.put((byte) (0xFF & (_value >> 8)));
+ _written = 2;
+ }
+ else
+ {
+ _written = 1;
+ }
+ break;
+ case 2:
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)(0xFF & _value));
+ }
+
+
+ }
+
+ return 3;
+ }
+
+
+ public final void setValue(T value)
+ {
+ _written = 0;
+ _value = convertValueToShort(value);
+ }
+
+ abstract short convertValueToShort(T value);
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _written == 3;
+ }
+
+ abstract byte getFormatCode();
+
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatTypeConstructor.java
new file mode 100644
index 0000000000..200fead74e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatTypeConstructor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class FloatTypeConstructor implements TypeConstructor
+{
+ private static final FloatTypeConstructor INSTANCE = new FloatTypeConstructor();
+
+
+ public static FloatTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private FloatTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=4)
+ {
+ return in.getFloat();
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct float: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatWriter.java
new file mode 100644
index 0000000000..823e33c3f8
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FloatWriter.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public class FloatWriter extends FixedFourWriter<Float>
+{
+ private static final byte FORMAT_CODE = (byte)0x72;
+
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ @Override
+ int convertValueToInt(Float value)
+ {
+ return Float.floatToIntBits(value.floatValue());
+ }
+
+ private static Factory<Float> FACTORY = new Factory<Float>()
+ {
+
+ public ValueWriter<Float> newInstance(Registry registry)
+ {
+ return new FloatWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Float.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FrameWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FrameWriter.java
new file mode 100644
index 0000000000..dbf9306366
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/FrameWriter.java
@@ -0,0 +1,245 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+
+import java.nio.ByteBuffer;
+
+public class FrameWriter implements ValueWriter<AMQFrame>
+{
+ private Registry _registry;
+ private AMQFrame _frame;
+ private State _state = State.DONE;
+ private ValueWriter _typeWriter;
+ private int _size = -1;
+ private static final byte[] EMPTY_BYTE_ARRAY = new byte[] {};
+ private ByteBuffer _payload;
+
+ enum State
+ {
+ SIZE_0,
+ SIZE_1,
+ SIZE_2,
+ SIZE_3,
+ DOFF,
+ TYPE,
+ CHANNEL_0,
+ CHANNEL_1,
+ DELEGATE,
+ PAYLOAD,
+ DONE
+ }
+
+ public FrameWriter(final Registry registry)
+ {
+ _registry = registry;
+ }
+
+ public boolean isComplete()
+ {
+ return _state == State.DONE;
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+ int remaining;
+
+
+
+ while((remaining = buffer.remaining()) != 0 && _state != State.DONE)
+ {
+ switch(_state)
+ {
+ case SIZE_0:
+
+ _typeWriter.setValue(_frame.getFrameBody());
+
+ int payloadLength = _payload == null ? 0 : _payload.remaining();
+
+ _size = _typeWriter.writeToBuffer(remaining > 8
+ ? (ByteBuffer)buffer.duplicate().position(buffer.position()+8)
+ : ByteBuffer.wrap(EMPTY_BYTE_ARRAY)) + 8 + payloadLength;
+ if(remaining >= 4)
+ {
+ buffer.putInt(_size);
+
+ if(remaining >= 8)
+ {
+ buffer.put((byte)2); // DOFF
+ buffer.put(_frame.getFrameType()); // AMQP Frame Type
+ buffer.putShort(_frame.getChannel());
+
+ if(_size - payloadLength > remaining)
+ {
+ buffer.position(buffer.limit());
+ _state = State.DELEGATE;
+ }
+ else if(_size > remaining )
+ {
+ buffer.position(buffer.position()+_size-8-payloadLength);
+ if(payloadLength > 0)
+ {
+
+ ByteBuffer dup = _payload.slice();
+ int payloadUsed = buffer.remaining();
+ dup.limit(payloadUsed);
+ buffer.put(dup);
+ _payload.position(_payload.position()+payloadUsed);
+ }
+ _state = State.PAYLOAD;
+ }
+ else
+ {
+
+ buffer.position(buffer.position()+_size-8-payloadLength);
+ if(payloadLength > 0)
+ {
+ buffer.put(_payload);
+ }
+ _state = State.DONE;
+ }
+
+ }
+ else
+ {
+ _state = State.DOFF;
+ }
+ break;
+ }
+ else
+ {
+ buffer.put((byte)((_size >> 24) & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.SIZE_1;
+ break;
+ }
+ }
+
+ case SIZE_1:
+ buffer.put((byte)((_size >> 16) & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.SIZE_2;
+ break;
+ }
+ case SIZE_2:
+ buffer.put((byte)((_size >> 8) & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.SIZE_3;
+ break;
+ }
+ case SIZE_3:
+ buffer.put((byte)(_size & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.DOFF;
+ break;
+ }
+ case DOFF:
+ buffer.put((byte)2); // Always 2 (8 bytes)
+ if(!buffer.hasRemaining())
+ {
+ _state = State.TYPE;
+ break;
+ }
+ case TYPE:
+ buffer.put((byte)0);
+ if(!buffer.hasRemaining())
+ {
+ _state = State.CHANNEL_0;
+ break;
+ }
+ case CHANNEL_0:
+ buffer.put((byte)((_frame.getChannel() >> 8) & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.CHANNEL_1;
+ break;
+ }
+ case CHANNEL_1:
+ buffer.put((byte)(_frame.getChannel() & 0xFF));
+ if(!buffer.hasRemaining())
+ {
+ _state = State.DELEGATE;
+ break;
+ }
+ case DELEGATE:
+ _typeWriter.writeToBuffer(buffer);
+ if(_typeWriter.isComplete())
+ {
+ _state = State.PAYLOAD;
+ _frame = null;
+ _typeWriter = null;
+ }
+ else
+ {
+ break;
+ }
+ case PAYLOAD:
+ if(_payload == null || _payload.remaining() == 0)
+ {
+ _state = State.DONE;
+ _frame = null;
+ _typeWriter = null;
+ _payload = null;
+
+ }
+ else if(buffer.hasRemaining())
+ {
+ buffer.put(_payload);
+ if(_payload.remaining() == 0)
+ {
+ _state = State.DONE;
+ _frame = null;
+ _typeWriter = null;
+ _payload = null;
+ }
+ }
+
+ }
+ }
+ if(_size == -1)
+ {
+ _size = _typeWriter.writeToBuffer(ByteBuffer.wrap(EMPTY_BYTE_ARRAY)) + 8 + (_payload == null ? 0 : _payload.remaining());
+ }
+ return _size;
+ }
+
+ public void setValue(AMQFrame frame)
+ {
+ _frame = frame;
+ _state = State.SIZE_0;
+ _size = -1;
+ _payload = null;
+ final Object frameBody = frame.getFrameBody();
+ _typeWriter = _registry.getValueWriter(frameBody);
+ _payload = frame.getPayload() == null ? null : frame.getPayload().duplicate();
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntTypeConstructor.java
new file mode 100644
index 0000000000..b3e774de5c
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntTypeConstructor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class IntTypeConstructor implements TypeConstructor
+{
+ private static final IntTypeConstructor INSTANCE = new IntTypeConstructor();
+
+
+ public static IntTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private IntTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=4)
+ {
+ return in.getInt();
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct int: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntegerWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntegerWriter.java
new file mode 100644
index 0000000000..91c3151494
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/IntegerWriter.java
@@ -0,0 +1,106 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class IntegerWriter implements ValueWriter<Integer>
+{
+ private static final byte EIGHT_BYTE_FORMAT_CODE = (byte)0x71;
+ private static final byte ONE_BYTE_FORMAT_CODE = (byte) 0x54;
+
+ private ValueWriter<Integer> _delegate;
+
+ private final FixedFourWriter<Integer> _eightByteWriter = new FixedFourWriter<Integer>()
+ {
+
+ @Override
+ byte getFormatCode()
+ {
+ return EIGHT_BYTE_FORMAT_CODE;
+ }
+
+ @Override
+ int convertValueToInt(Integer value)
+ {
+ return value.intValue();
+ }
+ };
+
+ private final ValueWriter<Integer> _oneByteWriter = new FixedOneWriter<Integer>()
+ {
+
+ @Override protected byte getFormatCode()
+ {
+ return ONE_BYTE_FORMAT_CODE;
+ }
+
+ @Override protected byte convertToByte(final Integer value)
+ {
+ return value.byteValue();
+ }
+ };
+
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(final Integer i)
+ {
+ if(i >= -128 && i <= 127)
+ {
+ _delegate = _oneByteWriter;
+ }
+ else
+ {
+ _delegate = _eightByteWriter;
+ }
+ _delegate.setValue(i);
+ }
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+
+ private static Factory<Integer> FACTORY = new Factory<Integer>()
+ {
+
+ public ValueWriter<Integer> newInstance(Registry registry)
+ {
+ return new IntegerWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Integer.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ListWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ListWriter.java
new file mode 100644
index 0000000000..3e0164705f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ListWriter.java
@@ -0,0 +1,172 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+
+public class ListWriter implements ValueWriter<List>
+{
+ private static class NonEmptyListWriter extends AbstractListWriter<List>
+ {
+ private List _list;
+ private int _position = 0;
+
+ public NonEmptyListWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final List value)
+ {
+ _list = value;
+ _position = 0;
+
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _list.size();
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _position < getCount();
+ }
+
+ @Override
+ protected Object next()
+ {
+ return _list.get(_position++);
+ }
+
+ @Override
+ protected void clear()
+ {
+ _list = null;
+ _position = 0;
+ }
+
+ @Override
+ protected void reset()
+ {
+ _position = 0;
+ }
+
+ }
+
+ private final NonEmptyListWriter _nonEmptyListWriter;
+ private static final byte ZERO_BYTE_FORMAT_CODE = (byte) 0x45;
+
+ private final ValueWriter<List> _emptyListWriter = new EmptyListValueWriter();
+
+
+ private ValueWriter<List> _delegate;
+
+ public ListWriter(final Registry registry)
+ {
+ _nonEmptyListWriter = new NonEmptyListWriter(registry);
+
+ }
+
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(List frameBody)
+ {
+ if(frameBody.isEmpty())
+ {
+ _delegate = _emptyListWriter;
+ }
+ else
+ {
+ _delegate = _nonEmptyListWriter;
+ }
+ _delegate.setValue(frameBody);
+ }
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+
+
+ private static Factory<List> FACTORY = new Factory<List>()
+ {
+
+ public ValueWriter<List> newInstance(Registry registry)
+ {
+ return new ListWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(List.class, FACTORY);
+ }
+
+ public static class EmptyListValueWriter implements ValueWriter<List>
+ {
+ private boolean _complete;
+
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ if(!_complete && buffer.hasRemaining())
+ {
+ buffer.put(ZERO_BYTE_FORMAT_CODE);
+ _complete = true;
+ }
+
+ return 1;
+ }
+
+ public void setValue(List list)
+ {
+ _complete = false;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongTypeConstructor.java
new file mode 100644
index 0000000000..b9a4509a04
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongTypeConstructor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class LongTypeConstructor implements TypeConstructor
+{
+ private static final LongTypeConstructor INSTANCE = new LongTypeConstructor();
+
+
+ public static LongTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private LongTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=8)
+ {
+ return in.getLong();
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct long: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongWriter.java
new file mode 100644
index 0000000000..984775cc74
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/LongWriter.java
@@ -0,0 +1,111 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class LongWriter implements ValueWriter<Long>
+{
+ private static final byte EIGHT_BYTE_FORMAT_CODE = (byte) 0x81;
+
+
+ private static final byte ONE_BYTE_FORMAT_CODE = (byte) 0x55;
+
+ private ValueWriter<Long> _delegate;
+
+ private final FixedEightWriter<Long> _eightByteWriter = new FixedEightWriter<Long>()
+ {
+
+ @Override
+ byte getFormatCode()
+ {
+ return EIGHT_BYTE_FORMAT_CODE;
+ }
+
+ @Override
+ long convertValueToLong(Long value)
+ {
+ return value;
+ }
+
+ };
+
+ private final ValueWriter<Long> _oneByteWriter = new FixedOneWriter<Long>()
+ {
+
+ @Override protected byte getFormatCode()
+ {
+ return ONE_BYTE_FORMAT_CODE;
+ }
+
+ @Override protected byte convertToByte(final Long value)
+ {
+ return value.byteValue();
+ }
+ };
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(final Long l)
+ {
+ if(l >= -128 && l <= 127)
+ {
+ _delegate = _oneByteWriter;
+ }
+ else
+ {
+ _delegate = _eightByteWriter;
+ }
+ _delegate.setValue(l);
+ }
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+
+
+
+ private static Factory<Long> FACTORY = new Factory<Long>()
+ {
+
+ public ValueWriter<Long> newInstance(Registry registry)
+ {
+ return new LongWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Long.class, FACTORY);
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/MapWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/MapWriter.java
new file mode 100644
index 0000000000..b239d4a397
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/MapWriter.java
@@ -0,0 +1,102 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.util.Iterator;
+import java.util.Map;
+
+public class MapWriter extends AbstractMapWriter<Map>
+{
+ private Map _map;
+ private Object _value;
+ private Iterator<Map.Entry> _iterator;
+
+ public MapWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Map value)
+ {
+ _map = value;
+ _iterator = value.entrySet().iterator();
+ }
+
+ @Override
+ protected int getMapCount()
+ {
+ return _map.size();
+ }
+
+ @Override
+ protected boolean hasMapNext()
+ {
+ return _iterator.hasNext();
+ }
+
+ @Override
+ protected Object nextKey()
+ {
+ Map.Entry entry = _iterator.next();
+ _value = entry.getValue();
+ return entry.getKey();
+ }
+ @Override
+ protected Object nextValue()
+ {
+ Object value = _value;
+ _value = null;
+ return value;
+ }
+
+
+ @Override
+ protected void onClear()
+ {
+ _map = null;
+ _iterator = null;
+ _value = null;
+ }
+
+ @Override
+ protected void onReset()
+ {
+ _iterator = _map.entrySet().iterator();
+ _value = null;
+ }
+
+
+ private static Factory<Map> FACTORY = new Factory<Map>()
+ {
+
+ public ValueWriter<Map> newInstance(Registry registry)
+ {
+ return new MapWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Map.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullTypeConstructor.java
new file mode 100644
index 0000000000..6b46895708
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullTypeConstructor.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import java.nio.ByteBuffer;
+
+class NullTypeConstructor implements TypeConstructor<Void>
+{
+ private static final NullTypeConstructor INSTANCE = new NullTypeConstructor();
+
+ NullTypeConstructor()
+ {
+ }
+
+ public Void construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return null;
+ }
+
+ public static NullTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullWriter.java
new file mode 100644
index 0000000000..690a2222ab
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/NullWriter.java
@@ -0,0 +1,70 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public class NullWriter implements ValueWriter<Void>
+{
+ private boolean _complete = true;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ if(!_complete && buffer.hasRemaining())
+ {
+ buffer.put((byte)0x40);
+ _complete = true;
+ }
+
+ return 1;
+ }
+
+ public void setValue(Void frameBody)
+ {
+ _complete = false;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ private static Factory<Void> FACTORY = new Factory<Void>()
+ {
+
+ public ValueWriter<Void> newInstance(Registry registry)
+ {
+ return new NullWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Void.TYPE, FACTORY);
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHandler.java
new file mode 100644
index 0000000000..a954c6db50
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHandler.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public interface ProtocolHandler
+{
+ ProtocolHandler parse(ByteBuffer in);
+
+ boolean isDone();
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHeaderHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHeaderHandler.java
new file mode 100644
index 0000000000..f72fea56b2
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ProtocolHeaderHandler.java
@@ -0,0 +1,146 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.framing.AMQPProtocolHeaderHandler;
+import org.apache.qpid.amqp_1_0.framing.SASLProtocolHeaderHandler;
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+import java.nio.ByteBuffer;
+
+public class ProtocolHeaderHandler implements ProtocolHandler
+{
+ private final ConnectionEndpoint _connection;
+ private ProtocolHandler[] _protocolHandlers = new ProtocolHandler[4];
+ private boolean _done;
+
+ enum State {
+ AWAITING_A,
+ AWAITING_M,
+ AWAITING_Q,
+ AWAITING_P,
+ AWAITING_PROTOCOL_ID,
+ ERROR
+ }
+
+ private State _state = State.AWAITING_A;
+
+ public ProtocolHeaderHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ _protocolHandlers[0] = new AMQPProtocolHeaderHandler(connection);
+ _protocolHandlers[1] = null ; // historic apache.qpid.amqp_1_0
+ _protocolHandlers[2] = null ; // TLS
+ _protocolHandlers[3] = new SASLProtocolHeaderHandler(connection); // SASL
+
+
+ }
+
+ public ProtocolHandler parse(final ByteBuffer in)
+ {
+ if(!in.hasRemaining())
+ {
+ return this;
+ }
+
+ switch(_state)
+ {
+ case AWAITING_A:
+ if(transition(in, (byte)'A', State.AWAITING_M))
+ {
+ break;
+ }
+ case AWAITING_M:
+ if(transition(in, (byte)'M', State.AWAITING_Q))
+ {
+ break;
+ }
+ case AWAITING_Q:
+ if(transition(in, (byte)'Q', State.AWAITING_P))
+ {
+ break;
+ }
+
+ case AWAITING_P:
+ if(transition(in, (byte)'P', State.AWAITING_PROTOCOL_ID))
+ {
+ break;
+ }
+ case AWAITING_PROTOCOL_ID:
+ int protocolId = ((int) in.get()) & 0xff;
+ ProtocolHandler delegate;
+
+ try
+ {
+ delegate = _protocolHandlers[protocolId];
+ }
+ catch(IndexOutOfBoundsException e)
+ {
+ delegate = null;
+ }
+
+ if(delegate == null)
+ {
+ _state = State.ERROR;
+ }
+ else
+ {
+ return delegate.parse(in);
+ }
+ }
+ if(_state == State.ERROR)
+ {
+ _connection.invalidHeaderReceived();
+ _done = true;
+ }
+ return this;
+
+ }
+
+ boolean transition(ByteBuffer in, byte expected, State next)
+ {
+ byte b = in.get();
+ if(b == expected)
+ {
+ if(!in.hasRemaining())
+ {
+ _state = next;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ _state = State.ERROR;
+ return true;
+ }
+ }
+
+
+ public boolean isDone()
+ {
+ return _done;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/RestrictedTypeValueWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/RestrictedTypeValueWriter.java
new file mode 100644
index 0000000000..cbc8277dc8
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/RestrictedTypeValueWriter.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.RestrictedType;
+
+public class RestrictedTypeValueWriter<V> extends DelegatingValueWriter<RestrictedType<V>>
+{
+ public RestrictedTypeValueWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected Object getUnderlyingValue(final RestrictedType<V> restrictedType)
+ {
+ return restrictedType.getValue();
+ }
+
+ private static Factory FACTORY = new Factory()
+ {
+
+ public ValueWriter newInstance(Registry registry)
+ {
+ return new RestrictedTypeValueWriter(registry);
+ }
+ };
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public static void register(ValueWriter.Registry registry, Class clazz)
+ {
+ registry.register(clazz, FACTORY);
+ }}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortTypeConstructor.java
new file mode 100644
index 0000000000..648ed36c69
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortTypeConstructor.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class ShortTypeConstructor implements TypeConstructor
+{
+ private static final ShortTypeConstructor INSTANCE = new ShortTypeConstructor();
+
+
+ public static ShortTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private ShortTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=2)
+ {
+ return in.getShort();
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct short: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortWriter.java
new file mode 100644
index 0000000000..52ec577c3e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ShortWriter.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+public class ShortWriter extends FixedTwoWriter<Short>
+{
+
+ private static final byte FORMAT_CODE = (byte)0x61;
+
+
+ @Override
+ short convertValueToShort(Short value)
+ {
+ return value.shortValue();
+ }
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ private static Factory<Short> FACTORY = new Factory<Short>()
+ {
+
+ public ValueWriter<Short> newInstance(Registry registry)
+ {
+ return new ShortWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Short.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SimpleVariableWidthWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SimpleVariableWidthWriter.java
new file mode 100644
index 0000000000..bd14483361
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SimpleVariableWidthWriter.java
@@ -0,0 +1,68 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class SimpleVariableWidthWriter<V> extends VariableWidthWriter<V>
+{
+ private byte[] _buf;
+
+
+ public void setValue(V value)
+ {
+ _buf = getByteArray(value);
+ super.setValue(value);
+ }
+
+ protected int getLength()
+ {
+ return _buf.length;
+ }
+
+ protected void writeBytes(ByteBuffer buf, int offset, int length)
+ {
+ buf.put(_buf, getOffset()+offset, length);
+ }
+
+ @Override
+ protected void clearValue()
+ {
+ _buf = null;
+ }
+
+ @Override
+ protected boolean hasValue()
+ {
+ return _buf != null;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ protected abstract byte[] getByteArray(V value);
+
+ protected abstract int getOffset();
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallIntConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallIntConstructor.java
new file mode 100644
index 0000000000..07fa853dce
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallIntConstructor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class SmallIntConstructor implements TypeConstructor
+{
+ private static final SmallIntConstructor INSTANCE = new SmallIntConstructor();
+
+
+ public static SmallIntConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private SmallIntConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return (int) b;
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct int: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallLongConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallLongConstructor.java
new file mode 100644
index 0000000000..013b9bef64
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallLongConstructor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class SmallLongConstructor implements TypeConstructor
+{
+ private static final SmallLongConstructor INSTANCE = new SmallLongConstructor();
+
+
+ public static SmallLongConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private SmallLongConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return (long) b;
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct long: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallUIntConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallUIntConstructor.java
new file mode 100644
index 0000000000..b3a9e3ef19
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallUIntConstructor.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class SmallUIntConstructor implements TypeConstructor
+{
+ private static final SmallUIntConstructor INSTANCE = new SmallUIntConstructor();
+
+
+ public static SmallUIntConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private SmallUIntConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return UnsignedInteger.valueOf(((int) b) & 0xff);
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct uint: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallULongConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallULongConstructor.java
new file mode 100644
index 0000000000..38cd0b65ac
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SmallULongConstructor.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+
+public class SmallULongConstructor implements TypeConstructor
+{
+ private static final SmallULongConstructor INSTANCE = new SmallULongConstructor();
+
+
+ public static SmallULongConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private SmallULongConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return UnsignedLong.valueOf(((long) b) & 0xffL);
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct ulong: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringTypeConstructor.java
new file mode 100644
index 0000000000..73b85d4163
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringTypeConstructor.java
@@ -0,0 +1,132 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class StringTypeConstructor extends VariableWidthTypeConstructor
+{
+ private Charset _charSet;
+
+ private BinaryString _defaultBinaryString = new BinaryString();
+ private ValueCache<BinaryString, String> _cachedValues = new ValueCache<BinaryString, String>(10);
+
+ private static final class ValueCache<K,V> extends LinkedHashMap<K,V>
+ {
+ private final int _cacheSize;
+
+ public ValueCache(int cacheSize)
+ {
+ _cacheSize = cacheSize;
+ }
+
+ @Override
+ protected boolean removeEldestEntry(Map.Entry<K, V> eldest)
+ {
+ return size() > _cacheSize;
+ }
+
+ public boolean isFull()
+ {
+ return size() == _cacheSize;
+ }
+ }
+
+
+ public static StringTypeConstructor getInstance(int i, Charset c)
+ {
+ return new StringTypeConstructor(i, c);
+ }
+
+
+ private StringTypeConstructor(int size, Charset c)
+ {
+ super(size);
+ _charSet = c;
+ }
+
+ @Override
+ public Object construct(final ByteBuffer in, boolean isCopy, ValueHandler handler) throws AmqpErrorException
+ {
+ int size;
+
+ if(getSize() == 1)
+ {
+ size = in.get() & 0xFF;
+ }
+ else
+ {
+ size = in.getInt();
+ }
+
+ int origPosition = in.position();
+ _defaultBinaryString.setData(in.array(), in.arrayOffset()+ origPosition, size);
+
+ BinaryString binaryStr = _defaultBinaryString;
+
+ boolean isFull = _cachedValues.isFull();
+
+ String str = isFull ? _cachedValues.remove(binaryStr) : _cachedValues.get(binaryStr);
+
+ if(str == null)
+ {
+
+ ByteBuffer dup = in.duplicate();
+ try
+ {
+ dup.limit(dup.position()+size);
+ }
+ catch(IllegalArgumentException e)
+ {
+ throw new IllegalArgumentException("position: " + dup.position() + "size: " + size + " capacity: " + dup.capacity());
+ }
+ CharBuffer charBuf = _charSet.decode(dup);
+
+ str = charBuf.toString();
+
+ byte[] data = new byte[size];
+ in.get(data);
+ binaryStr = new BinaryString(data, 0, size);
+
+ _cachedValues.put(binaryStr, str);
+ }
+ else if(isFull)
+ {
+ byte[] data = new byte[size];
+ in.get(data);
+ binaryStr = new BinaryString(data, 0, size);
+
+ _cachedValues.put(binaryStr, str);
+ }
+
+ in.position(origPosition+size);
+
+ return str;
+
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringWriter.java
new file mode 100644
index 0000000000..39f759e54d
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/StringWriter.java
@@ -0,0 +1,146 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class StringWriter extends SimpleVariableWidthWriter<String>
+{
+ private static final Charset ENCODING_CHARSET;
+ private static final byte ONE_BYTE_CODE;
+ private static final byte FOUR_BYTE_CODE;
+ static
+ {
+ Charset defaultCharset = Charset.defaultCharset();
+ if(defaultCharset.name().equals("UTF-16") || defaultCharset.name().equals("UTF-16BE"))
+ {
+ ENCODING_CHARSET = defaultCharset;
+ ONE_BYTE_CODE = (byte) 0xa2;
+ FOUR_BYTE_CODE = (byte) 0xb2;
+ }
+ else
+ {
+ ENCODING_CHARSET = Charset.forName("UTF-8");
+ ONE_BYTE_CODE = (byte) 0xa1;
+ FOUR_BYTE_CODE = (byte) 0xb1;
+ }
+ }
+
+ private static final class ValueCache<K,V> extends LinkedHashMap<K,V>
+ {
+ private final int _cacheSize;
+
+ public ValueCache(int cacheSize)
+ {
+ _cacheSize = cacheSize;
+ }
+
+ @Override
+ protected boolean removeEldestEntry(Map.Entry<K, V> eldest)
+ {
+ return size() > _cacheSize;
+ }
+
+ public boolean isFull()
+ {
+ return size() == _cacheSize;
+ }
+ }
+
+ private final ValueCache<String, byte[]> _cachedEncodings = new ValueCache<String, byte[]>(10);
+
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return FOUR_BYTE_CODE;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return ONE_BYTE_CODE;
+ }
+
+ @Override
+ protected byte[] getByteArray(String value)
+ {
+
+ byte[] encoding;
+ boolean isFull = _cachedEncodings.isFull();
+ if(isFull)
+ {
+ encoding = _cachedEncodings.remove(value);
+ }
+ else
+ {
+ encoding = _cachedEncodings.get(value);
+ }
+
+
+ if(encoding == null)
+ {
+ ByteBuffer buf = ENCODING_CHARSET.encode(value);
+ if(buf.hasArray() && buf.arrayOffset() == 0 && buf.limit()==buf.capacity())
+ {
+ encoding = buf.array();
+ }
+ else
+ {
+ byte[] bufArray = new byte[buf.limit()-buf.position()];
+ buf.get(bufArray);
+ encoding = bufArray;
+ }
+ _cachedEncodings.put(value,encoding);
+
+ }
+ else if(isFull)
+ {
+ _cachedEncodings.put(value,encoding);
+ }
+
+ return encoding;
+ }
+
+ @Override
+ protected int getOffset()
+ {
+ return 0;
+ }
+
+ private static Factory<String> FACTORY = new Factory<String>()
+ {
+
+ public ValueWriter<String> newInstance(Registry registry)
+ {
+ return new StringWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(String.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolArrayWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolArrayWriter.java
new file mode 100644
index 0000000000..234a6afe24
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolArrayWriter.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.Symbol;
+
+import java.nio.ByteBuffer;
+
+public class SymbolArrayWriter extends VariableWidthWriter<Symbol[]>
+{
+
+ private int _length;
+ private byte[] _encodedVal;
+
+ @Override protected void clearValue()
+ {
+ _encodedVal = null;
+ }
+
+ @Override protected boolean hasValue()
+ {
+ return _encodedVal != null;
+ }
+
+ @Override protected byte getFourOctetEncodingCode()
+ {
+ return (byte) 0xf0;
+ }
+
+ @Override protected byte getSingleOctetEncodingCode()
+ {
+ return (byte) 0xe0;
+ }
+
+ @Override protected int getLength()
+ {
+ return _length;
+ }
+
+ @Override protected void writeBytes(final ByteBuffer buf, final int offset, final int length)
+ {
+ buf.put(_encodedVal,offset,length);
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+ public void setValue(final Symbol[] value)
+ {
+
+ boolean useSmallConstructor = useSmallConstructor(value);
+ boolean isSmall = useSmallConstructor && canFitInSmall(value);
+ if(isSmall)
+ {
+ _length = 2;
+ }
+ else
+ {
+ _length = 5;
+ }
+ for(Symbol symbol : value)
+ {
+ _length += symbol.length() ;
+ }
+ _length += value.length * (useSmallConstructor ? 1 : 4);
+
+
+ _encodedVal = new byte[_length];
+
+ ByteBuffer buf = ByteBuffer.wrap(_encodedVal);
+ if(isSmall)
+ {
+ buf.put((byte)value.length);
+ buf.put(SymbolWriter.SMALL_ENCODING_CODE);
+ }
+ else
+ {
+ buf.putInt(value.length);
+ buf.put(SymbolWriter.LARGE_ENCODING_CODE);
+ }
+
+ for(Symbol symbol : value)
+ {
+ if(isSmall)
+ {
+ buf.put((byte)symbol.length());
+ }
+ else
+ {
+ buf.putInt(symbol.length());
+ }
+
+
+ for(int i = 0; i < symbol.length(); i++)
+ {
+ buf.put((byte)symbol.charAt(i));
+ }
+ }
+
+
+
+ super.setValue(value);
+ }
+
+ private boolean useSmallConstructor(final Symbol[] value)
+ {
+ for(Symbol sym : value)
+ {
+ if(sym.length()>255)
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean canFitInSmall(final Symbol[] value)
+ {
+ if(value.length>=127)
+ {
+ return false;
+ }
+
+ int remaining = 253 - value.length;
+ for(Symbol symbol : value)
+ {
+
+ if((remaining -= symbol.length()) < 0)
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+
+ private static Factory<Symbol[]> FACTORY = new Factory<Symbol[]>()
+ {
+
+ public ValueWriter<Symbol[]> newInstance(Registry registry)
+ {
+ return new SymbolArrayWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Symbol[].class, FACTORY);
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolTypeConstructor.java
new file mode 100644
index 0000000000..ce0f5cb26b
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolTypeConstructor.java
@@ -0,0 +1,109 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class SymbolTypeConstructor extends VariableWidthTypeConstructor
+{
+ private static final Charset ASCII = Charset.forName("US-ASCII");
+
+ private BinaryString _defaultBinaryString = new BinaryString();
+
+ private static final ConcurrentHashMap<BinaryString, Symbol> SYMBOL_MAP =
+ new ConcurrentHashMap<BinaryString, Symbol>(2048);
+
+ public static SymbolTypeConstructor getInstance(int i)
+ {
+ return new SymbolTypeConstructor(i);
+ }
+
+
+ private SymbolTypeConstructor(int size)
+ {
+ super(size);
+ }
+
+ @Override
+ public Object construct(final ByteBuffer in, boolean isCopy, ValueHandler handler) throws AmqpErrorException
+ {
+ int size;
+
+ if(getSize() == 1)
+ {
+ size = in.get() & 0xFF;
+ }
+ else
+ {
+ size = in.getInt();
+ }
+
+ _defaultBinaryString.setData(in.array(), in.arrayOffset()+in.position(), size);
+
+ BinaryString binaryStr = _defaultBinaryString;
+
+ Symbol symbolVal = SYMBOL_MAP.get(binaryStr);
+ if(symbolVal == null)
+ {
+ ByteBuffer dup = in.duplicate();
+ try
+ {
+ dup.limit(in.position()+size);
+ }
+ catch (IllegalArgumentException e)
+ {
+ System.err.println("in.position(): " + in.position());
+ System.err.println("size: " + size);
+ System.err.println("dup.position(): " + dup.position());
+ System.err.println("dup.capacity(): " + dup.capacity());
+ System.err.println("dup.limit(): " + dup.limit());
+ throw e;
+
+ }
+ CharBuffer charBuf = ASCII.decode(dup);
+
+
+ symbolVal = Symbol.getSymbol(charBuf.toString());
+
+
+
+
+ byte[] data = new byte[size];
+ in.get(data);
+ binaryStr = new BinaryString(data, 0, size);
+ SYMBOL_MAP.putIfAbsent(binaryStr, symbolVal);
+ }
+ else
+ {
+ in.position(in.position()+size);
+ }
+
+ return symbolVal;
+
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolWriter.java
new file mode 100644
index 0000000000..ae43c7ebd2
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/SymbolWriter.java
@@ -0,0 +1,102 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.Symbol;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+
+public class SymbolWriter extends VariableWidthWriter<Symbol>
+{
+ private static final Charset ENCODING_CHARSET = Charset.forName("US-ASCII");
+ public static final byte LARGE_ENCODING_CODE = (byte) 0xb3;
+ public static final byte SMALL_ENCODING_CODE = (byte) 0xa3;
+ private Symbol _value;
+
+
+ @Override
+ protected byte getFourOctetEncodingCode()
+ {
+ return LARGE_ENCODING_CODE;
+ }
+
+ @Override
+ protected byte getSingleOctetEncodingCode()
+ {
+ return SMALL_ENCODING_CODE;
+ }
+
+ @Override
+ public void setValue(Symbol value)
+ {
+ _value = value;
+ super.setValue(value);
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ @Override
+ protected void clearValue()
+ {
+ _value = null;
+ }
+
+ @Override
+ protected boolean hasValue()
+ {
+ return _value != null;
+ }
+
+ @Override
+ protected int getLength()
+ {
+ return _value.length();
+ }
+
+ @Override
+ protected void writeBytes(ByteBuffer buf, int offset, int length)
+ {
+ int end = offset + length;
+ for(int i = offset; i < end; i++)
+ {
+ buf.put((byte)_value.charAt(i));
+ }
+ }
+
+ private static Factory<Symbol> FACTORY = new Factory<Symbol>()
+ {
+
+ public ValueWriter<Symbol> newInstance(Registry registry)
+ {
+ return new SymbolWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Symbol.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampTypeConstructor.java
new file mode 100644
index 0000000000..d826e0ee56
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampTypeConstructor.java
@@ -0,0 +1,60 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+import java.util.Date;
+
+public class TimestampTypeConstructor implements TypeConstructor
+{
+ private static final TimestampTypeConstructor INSTANCE = new TimestampTypeConstructor();
+
+
+ public static TimestampTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private TimestampTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=8)
+ {
+ long l = in.getLong();
+ return new Date(l);
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct timestamp: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampWriter.java
new file mode 100644
index 0000000000..153c51b7c7
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TimestampWriter.java
@@ -0,0 +1,57 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.util.Date;
+
+public class TimestampWriter extends FixedEightWriter<Date>
+{
+ private static final byte FORMAT_CODE = (byte) 0x83;
+
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ @Override
+ long convertValueToLong(Date value)
+ {
+ return value.getTime();
+ }
+
+ private static Factory<Date> FACTORY = new Factory<Date>()
+ {
+
+ public ValueWriter<Date> newInstance(Registry registry)
+ {
+ return new TimestampWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Date.class, FACTORY);
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TypeConstructor.java
new file mode 100644
index 0000000000..8b433e4b20
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/TypeConstructor.java
@@ -0,0 +1,32 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+public interface TypeConstructor<T>
+{
+
+ public T construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException;
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UByteTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UByteTypeConstructor.java
new file mode 100644
index 0000000000..7ff5abc558
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UByteTypeConstructor.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class UByteTypeConstructor implements TypeConstructor
+{
+ private static final UByteTypeConstructor INSTANCE = new UByteTypeConstructor();
+
+
+ public static UByteTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private UByteTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.hasRemaining())
+ {
+ byte b = in.get();
+ return UnsignedByte.valueOf(b);
+ }
+ else
+ {
+ Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct ubyte: insufficient input data");
+ throw new AmqpErrorException(error);
+ }
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UIntTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UIntTypeConstructor.java
new file mode 100644
index 0000000000..fc0c433d7c
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UIntTypeConstructor.java
@@ -0,0 +1,59 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class UIntTypeConstructor implements TypeConstructor
+{
+ private static final UIntTypeConstructor INSTANCE = new UIntTypeConstructor();
+
+
+ public static UIntTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private UIntTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=4)
+ {
+ final int i = in.getInt();
+ return UnsignedInteger.valueOf(i);
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct uint: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ULongTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ULongTypeConstructor.java
new file mode 100644
index 0000000000..550a61b4fa
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ULongTypeConstructor.java
@@ -0,0 +1,61 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class ULongTypeConstructor implements TypeConstructor
+{
+ private static final ULongTypeConstructor INSTANCE = new ULongTypeConstructor();
+
+
+ public static ULongTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private ULongTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=8)
+ {
+ long l = in.getLong();
+
+ return UnsignedLong.valueOf(l);
+
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct ulong: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UShortTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UShortTypeConstructor.java
new file mode 100644
index 0000000000..6cf7cb5dca
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UShortTypeConstructor.java
@@ -0,0 +1,60 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+
+public class UShortTypeConstructor implements TypeConstructor
+{
+ private static final UShortTypeConstructor INSTANCE = new UShortTypeConstructor();
+
+
+ public static UShortTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private UShortTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=2)
+ {
+ short s = in.getShort();
+ return UnsignedShort.valueOf(s);
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct ushort: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDTypeConstructor.java
new file mode 100644
index 0000000000..c34a8fca65
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDTypeConstructor.java
@@ -0,0 +1,62 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+public class UUIDTypeConstructor implements TypeConstructor
+{
+ private static final UUIDTypeConstructor INSTANCE = new UUIDTypeConstructor();
+
+
+ public static UUIDTypeConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+ private UUIDTypeConstructor()
+ {
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ if(in.remaining()>=16)
+ {
+ long msb = in.getLong();
+ long lsb = in.getLong();
+ return new UUID(msb, lsb);
+ }
+ else
+ {
+ org.apache.qpid.amqp_1_0.type.transport.Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("Cannot construct UUID: insufficient input data");
+ throw new AmqpErrorException(error);
+
+ }
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDWriter.java
new file mode 100644
index 0000000000..b900fd63ce
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UUIDWriter.java
@@ -0,0 +1,63 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.util.UUID;
+
+public class UUIDWriter extends FixedSixteenWriter<UUID>
+{
+ private static final byte FORMAT_CODE = (byte) 0x98;
+
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ @Override
+ long convertValueToMSB(UUID value)
+ {
+ return value.getMostSignificantBits();
+ }
+
+ @Override
+ long convertValueToLSB(UUID value)
+ {
+ return value.getLeastSignificantBits();
+ }
+
+ private static Factory<UUID> FACTORY = new Factory<UUID>()
+ {
+
+ public ValueWriter<UUID> newInstance(Registry registry)
+ {
+ return new UUIDWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(UUID.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedByteWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedByteWriter.java
new file mode 100644
index 0000000000..aedf3811d9
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedByteWriter.java
@@ -0,0 +1,92 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+
+import java.nio.ByteBuffer;
+
+public class UnsignedByteWriter implements ValueWriter<UnsignedByte>
+{
+ private int _written;
+ private byte _value;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ switch(_written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)0x50);
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(_value);
+ _written = 2;
+ }
+ else
+ {
+ _written = 1;
+ }
+
+ }
+
+ return 2;
+ }
+
+ public void setValue(UnsignedByte value)
+ {
+ _written = 0;
+ _value = value.byteValue();
+ }
+
+ public boolean isComplete()
+ {
+ return _written == 2;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ private static Factory<UnsignedByte> FACTORY = new Factory<UnsignedByte>()
+ {
+
+ public ValueWriter<UnsignedByte> newInstance(Registry registry)
+ {
+ return new UnsignedByteWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(UnsignedByte.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedIntegerWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedIntegerWriter.java
new file mode 100644
index 0000000000..9517bd9c6e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedIntegerWriter.java
@@ -0,0 +1,148 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+
+import java.nio.ByteBuffer;
+
+public class UnsignedIntegerWriter implements ValueWriter<UnsignedInteger>
+{
+ private static final byte EIGHT_BYTE_FORMAT_CODE = (byte)0x70;
+ private static final byte ONE_BYTE_FORMAT_CODE = (byte) 0x52;
+ private static final byte ZERO_BYTE_FORMAT_CODE = (byte) 0x43;
+
+ private ValueWriter<UnsignedInteger> _delegate;
+
+ private final FixedFourWriter<UnsignedInteger> _eightByteWriter = new FixedFourWriter<UnsignedInteger>()
+ {
+
+ @Override
+ byte getFormatCode()
+ {
+ return EIGHT_BYTE_FORMAT_CODE;
+ }
+
+ @Override
+ int convertValueToInt(UnsignedInteger value)
+ {
+ return value.intValue();
+ }
+ };
+
+ private final ValueWriter<UnsignedInteger> _oneByteWriter = new FixedOneWriter<UnsignedInteger>()
+ {
+
+ @Override protected byte getFormatCode()
+ {
+ return ONE_BYTE_FORMAT_CODE;
+ }
+
+ @Override protected byte convertToByte(final UnsignedInteger value)
+ {
+ return value.byteValue();
+ }
+ };
+
+ private final ValueWriter<UnsignedInteger> _zeroByteWriter = new ValueWriter<UnsignedInteger>()
+ {
+ private boolean _complete;
+
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ if(!_complete && buffer.hasRemaining())
+ {
+ buffer.put(ZERO_BYTE_FORMAT_CODE);
+ _complete = true;
+ }
+
+ return 1;
+ }
+
+ public void setValue(UnsignedInteger uint)
+ {
+ _complete = false;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ };
+
+
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(final UnsignedInteger uint)
+ {
+ if(uint.equals(UnsignedInteger.ZERO))
+ {
+ _delegate = _zeroByteWriter;
+ }
+ else if(uint.compareTo(UnsignedInteger.valueOf(256))<0)
+ {
+ _delegate = _oneByteWriter;
+ }
+ else
+ {
+ _delegate = _eightByteWriter;
+ }
+ _delegate.setValue(uint);
+ }
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+
+ private static Factory<UnsignedInteger> FACTORY = new Factory<UnsignedInteger>()
+ {
+
+ public ValueWriter<UnsignedInteger> newInstance(Registry registry)
+ {
+ return new UnsignedIntegerWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(UnsignedInteger.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java
new file mode 100644
index 0000000000..4345187d61
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedLongWriter.java
@@ -0,0 +1,152 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+
+import java.nio.ByteBuffer;
+
+public class UnsignedLongWriter implements ValueWriter<UnsignedLong>
+{
+
+
+ private static final byte EIGHT_BYTE_FORMAT_CODE = (byte) 0x80;
+ private static final byte ONE_BYTE_FORMAT_CODE = (byte) 0x53;
+ private static final byte ZERO_BYTE_FORMAT_CODE = (byte) 0x44;
+
+ private ValueWriter<UnsignedLong> _delegate;
+
+ private final FixedEightWriter<UnsignedLong> _eightByteWriter = new FixedEightWriter<UnsignedLong>()
+ {
+
+ @Override
+ byte getFormatCode()
+ {
+ return EIGHT_BYTE_FORMAT_CODE;
+ }
+
+ @Override
+ long convertValueToLong(UnsignedLong value)
+ {
+ return value.longValue();
+ }
+
+ };
+
+ private final ValueWriter<UnsignedLong> _oneByteWriter = new FixedOneWriter<UnsignedLong>()
+ {
+
+ @Override protected byte getFormatCode()
+ {
+ return ONE_BYTE_FORMAT_CODE;
+ }
+
+ @Override protected byte convertToByte(final UnsignedLong value)
+ {
+ return value.byteValue();
+ }
+ };
+
+ private final ValueWriter<UnsignedLong> _zeroByteWriter = new ValueWriter<UnsignedLong>()
+ {
+ private boolean _complete;
+
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ if(!_complete && buffer.hasRemaining())
+ {
+ buffer.put(ZERO_BYTE_FORMAT_CODE);
+ _complete = true;
+ }
+
+ return 1;
+ }
+
+ public void setValue(UnsignedLong ulong)
+ {
+ _complete = false;
+ }
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ };
+
+
+
+ private static Factory<UnsignedLong> FACTORY = new Factory<UnsignedLong>()
+ {
+
+ public ValueWriter<UnsignedLong> newInstance(Registry registry)
+ {
+ return new UnsignedLongWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(UnsignedLong.class, FACTORY);
+ }
+
+ public int writeToBuffer(final ByteBuffer buffer)
+ {
+ return _delegate.writeToBuffer(buffer);
+ }
+
+ public void setValue(final UnsignedLong ulong)
+ {
+ if(ulong.equals(UnsignedLong.ZERO))
+ {
+ _delegate = _zeroByteWriter;
+ }
+ else if(ulong.compareTo(UnsignedLong.valueOf(256))<0)
+ {
+ _delegate = _oneByteWriter;
+ }
+ else
+ {
+ _delegate = _eightByteWriter;
+ }
+
+ _delegate.setValue(ulong);
+ }
+
+ public boolean isComplete()
+ {
+ return _delegate.isComplete();
+ }
+
+ public boolean isCacheable()
+ {
+ return false;
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedShortWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedShortWriter.java
new file mode 100644
index 0000000000..63d8bf0d7b
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/UnsignedShortWriter.java
@@ -0,0 +1,56 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+
+public class UnsignedShortWriter extends FixedTwoWriter<UnsignedShort>
+{
+ private static final byte FORMAT_CODE = (byte)0x60;
+
+
+ @Override
+ short convertValueToShort(UnsignedShort value)
+ {
+ return value.shortValue();
+ }
+
+ @Override
+ byte getFormatCode()
+ {
+ return FORMAT_CODE;
+ }
+
+ private static Factory<UnsignedShort> FACTORY = new Factory<UnsignedShort>()
+ {
+
+ public ValueWriter<UnsignedShort> newInstance(Registry registry)
+ {
+ return new UnsignedShortWriter();
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(UnsignedShort.class, FACTORY);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueHandler.java
new file mode 100644
index 0000000000..57351a91d7
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueHandler.java
@@ -0,0 +1,159 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+
+public class ValueHandler implements DescribedTypeConstructorRegistry.Source
+{
+ private static final byte DESCRIBED_TYPE = (byte)0;
+
+ private final DescribedTypeConstructorRegistry _describedTypeConstructorRegistry;
+
+
+ private static final TypeConstructor[][] TYPE_CONSTRUCTORS =
+ {
+ {},
+ {},
+ {},
+ {},
+ { NullTypeConstructor.getInstance(), BooleanConstructor.getTrueInstance(),
+ BooleanConstructor.getFalseInstance(), ZeroUIntConstructor.getInstance(),
+ ZeroULongConstructor.getInstance(), ZeroListConstructor.getInstance() },
+ { UByteTypeConstructor.getInstance(), ByteTypeConstructor.getInstance(),
+ SmallUIntConstructor.getInstance(), SmallULongConstructor.getInstance(),
+ SmallIntConstructor.getInstance(), SmallLongConstructor.getInstance(),
+ BooleanConstructor.getByteInstance()},
+ { UShortTypeConstructor.getInstance(), ShortTypeConstructor.getInstance() },
+ { UIntTypeConstructor.getInstance(), IntTypeConstructor.getInstance(),
+ FloatTypeConstructor.getInstance(), CharTypeConstructor.getInstance(),
+ DecimalConstructor.getDecimal32Instance()},
+ { ULongTypeConstructor.getInstance(), LongTypeConstructor.getInstance(),
+ DoubleTypeConstructor.getInstance(), TimestampTypeConstructor.getInstance(),
+ DecimalConstructor.getDecimal64Instance()},
+ { null, null,
+ null, null,
+ DecimalConstructor.getDecimal128Instance(), null,
+ null, null,
+ UUIDTypeConstructor.getInstance() },
+ { BinaryTypeConstructor.getInstance(1),
+ StringTypeConstructor.getInstance(1, Charset.forName("UTF8")),
+ StringTypeConstructor.getInstance(1, Charset.forName("UTF16")),
+ SymbolTypeConstructor.getInstance(1) },
+ { BinaryTypeConstructor.getInstance(4),
+ StringTypeConstructor.getInstance(4, Charset.forName("UTF8")),
+ StringTypeConstructor.getInstance(4, Charset.forName("UTF16")),
+ SymbolTypeConstructor.getInstance(4) },
+ { CompoundTypeConstructor.getInstance(1, CompoundTypeConstructor.LIST_ASSEMBLER_FACTORY),
+ CompoundTypeConstructor.getInstance(1, CompoundTypeConstructor.MAP_ASSEMBLER_FACTORY) },
+ { CompoundTypeConstructor.getInstance(4, CompoundTypeConstructor.LIST_ASSEMBLER_FACTORY),
+ CompoundTypeConstructor.getInstance(4, CompoundTypeConstructor.MAP_ASSEMBLER_FACTORY) },
+ {
+ ArrayTypeConstructor.getOneByteSizeTypeConstructor()
+ },
+ {
+ ArrayTypeConstructor.getFourByteSizeTypeConstructor()
+ }
+ };
+
+
+ public ValueHandler(DescribedTypeConstructorRegistry registry)
+ {
+ _describedTypeConstructorRegistry = registry;
+ }
+
+ public Object parse(final ByteBuffer in) throws AmqpErrorException
+ {
+ TypeConstructor constructor = readConstructor(in);
+ return constructor.construct(in, this);
+ }
+
+
+ public TypeConstructor readConstructor(ByteBuffer in) throws AmqpErrorException
+ {
+ if(!in.hasRemaining())
+ {
+ throw new AmqpErrorException(AmqpError.DECODE_ERROR, "Insufficient data - expected type, no data remaining");
+ }
+ byte formatCode = in.get();
+
+ if(formatCode == DESCRIBED_TYPE)
+ {
+ Object descriptor = parse(in);
+ DescribedTypeConstructor describedTypeConstructor = _describedTypeConstructorRegistry.getConstructor(descriptor);
+ if(describedTypeConstructor==null)
+ {
+ describedTypeConstructor=new DefaultDescribedTypeConstructor(descriptor);
+ }
+ TypeConstructor typeConstructor = readConstructor(in);
+
+ return describedTypeConstructor.construct(typeConstructor);
+
+ }
+ else
+ {
+ int subCategory = (formatCode >> 4) & 0x0F;
+ int subtype = formatCode & 0x0F;
+
+ TypeConstructor tc;
+ try
+ {
+ tc = TYPE_CONSTRUCTORS[subCategory][subtype];
+ }
+ catch(IndexOutOfBoundsException e)
+ {
+ tc = null;
+ }
+
+ if(tc == null)
+ {
+ throw new AmqpErrorException(ConnectionError.FRAMING_ERROR,"Unknown type format-code 0x%02x", formatCode);
+ }
+
+ return tc;
+ }
+ }
+
+
+
+
+
+ @Override
+ public String toString()
+ {
+ return "ValueHandler{" +
+ ", _describedTypeConstructorRegistry=" + _describedTypeConstructorRegistry +
+ '}';
+ }
+
+
+ public DescribedTypeConstructorRegistry getDescribedTypeRegistry()
+ {
+ return _describedTypeConstructorRegistry;
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueProducingProtocolHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueProducingProtocolHandler.java
new file mode 100644
index 0000000000..48db222aa0
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueProducingProtocolHandler.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+public interface ValueProducingProtocolHandler extends ProtocolHandler
+{
+ Object getValue();
+ public boolean hasError();
+ public Error getError();
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueWriter.java
new file mode 100644
index 0000000000..7918397994
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ValueWriter.java
@@ -0,0 +1,58 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+
+public interface ValueWriter<T extends Object>
+{
+
+
+
+ public static interface Factory<V extends Object>
+ {
+ ValueWriter<V> newInstance(Registry registry);
+ }
+
+ public static interface Registry
+ {
+ public static interface Source
+ {
+ public Registry getDescribedTypeRegistry();
+ }
+
+ <V extends Object> ValueWriter<V> getValueWriter(V value);
+ <V extends Object> ValueWriter<V> getValueWriter(V value, Map<Class, ValueWriter> localCache);
+ <V extends Object> ValueWriter<V> register(Class<V> clazz, ValueWriter.Factory<V> writer);
+
+ }
+
+
+ int writeToBuffer(ByteBuffer buffer);
+
+ void setValue(T frameBody);
+
+ boolean isComplete();
+
+ boolean isCacheable();
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthTypeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthTypeConstructor.java
new file mode 100644
index 0000000000..35ce253623
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthTypeConstructor.java
@@ -0,0 +1,48 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import java.nio.ByteBuffer;
+
+public abstract class VariableWidthTypeConstructor implements TypeConstructor
+{
+ protected int _size;
+
+ public VariableWidthTypeConstructor(int size)
+ {
+ _size = size;
+ }
+
+ public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException
+ {
+ return construct(in, false, handler);
+ }
+
+ public int getSize()
+ {
+ return _size;
+ }
+
+ public abstract Object construct(ByteBuffer in, boolean isCopy, ValueHandler handler) throws AmqpErrorException;
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthWriter.java
new file mode 100644
index 0000000000..93b2b5e6d8
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/VariableWidthWriter.java
@@ -0,0 +1,169 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import java.nio.ByteBuffer;
+
+public abstract class VariableWidthWriter<V> implements ValueWriter<V>
+{
+ private int _written;
+ private int _size;
+
+ public int writeToBuffer(ByteBuffer buffer)
+ {
+
+ int written = _written;
+ final int length = getLength();
+ boolean singleOctetSize = _size == 1;
+ if(singleOctetSize)
+ {
+ switch(written)
+ {
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getSingleOctetEncodingCode());
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(buffer.hasRemaining())
+ {
+ buffer.put((byte)length);
+ written = 2;
+ }
+ else
+ {
+ written = 1;
+ break;
+ }
+ default:
+
+ final int toWrite = 2 + length - written;
+ if(buffer.remaining() >= toWrite)
+ {
+ writeBytes(buffer, written-2,toWrite);
+ written = length + 2;
+ clearValue();
+ }
+ else
+ {
+ final int remaining = buffer.remaining();
+
+ writeBytes(buffer, written-2, remaining);
+ written += remaining;
+ }
+
+ }
+ }
+ else
+ {
+
+ int remaining = buffer.remaining();
+
+ switch(written)
+ {
+
+ case 0:
+ if(buffer.hasRemaining())
+ {
+ buffer.put(getFourOctetEncodingCode());
+ remaining--;
+ written = 1;
+ }
+ else
+ {
+ break;
+ }
+ case 1:
+ if(remaining >= 4)
+ {
+ buffer.putInt(length);
+ remaining-=4;
+ written+=4;
+ }
+ case 2:
+ case 3:
+ if(remaining >= 2 && written <= 3)
+ {
+ buffer.putShort((short)((length >> ((3-written)<<3)) & 0xFFFF ));
+ remaining -= 2;
+ written += 2;
+ }
+ case 4:
+ if(remaining >=1 && written <=4)
+ {
+ buffer.put((byte)((length>> ((4-written)<<3)) & 0xFF ));
+ written++;
+ }
+
+ default:
+
+ final int toWrite = 5 + length - written;
+ if(buffer.remaining() >= toWrite)
+ {
+ writeBytes(buffer, written-5,toWrite);
+ written = length + 5;
+ clearValue();
+ }
+ else if(buffer.hasRemaining())
+ {
+ written += buffer.remaining();
+ writeBytes(buffer, written-5, buffer.remaining());
+ }
+
+ }
+
+ }
+
+ _written = written;
+ return 1 + _size + length;
+ }
+
+ protected abstract void clearValue();
+
+ protected abstract boolean hasValue();
+
+ protected abstract byte getFourOctetEncodingCode();
+
+ protected abstract byte getSingleOctetEncodingCode();
+
+ public void setValue(V value)
+ {
+ _written = 0;
+ _size = (getLength() & 0xFFFFFF00) == 0 ? 1 : 4;
+ }
+
+ protected abstract int getLength();
+
+ protected abstract void writeBytes(ByteBuffer buf, int offset, int length);
+
+
+ public boolean isComplete()
+ {
+ return !hasValue() || _written == getLength() + _size + 1;
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/WrapperTypeValueWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/WrapperTypeValueWriter.java
new file mode 100644
index 0000000000..85a3196f6c
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/WrapperTypeValueWriter.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.WrapperType;
+
+public class WrapperTypeValueWriter extends DelegatingValueWriter<WrapperType>
+{
+ public WrapperTypeValueWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected Object getUnderlyingValue(final WrapperType wrapperType)
+ {
+ return wrapperType.getValue();
+ }
+
+ private static Factory FACTORY = new Factory()
+ {
+
+ public ValueWriter newInstance(Registry registry)
+ {
+ return new WrapperTypeValueWriter(registry);
+ }
+ };
+
+ public boolean isCacheable()
+ {
+ return true;
+ }
+
+ public static void register(Registry registry, Class<? extends WrapperType> clazz)
+ {
+ registry.register(clazz, FACTORY);
+ }}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroListConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroListConstructor.java
new file mode 100644
index 0000000000..b9d6a50425
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroListConstructor.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.List;
+
+class ZeroListConstructor implements TypeConstructor<List>
+{
+ private static final ZeroListConstructor INSTANCE = new ZeroListConstructor();
+
+ ZeroListConstructor()
+ {
+ }
+
+ public List construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return Collections.EMPTY_LIST;
+ }
+
+ public static ZeroListConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroUIntConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroUIntConstructor.java
new file mode 100644
index 0000000000..b3c57ceaf7
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroUIntConstructor.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+
+import java.nio.ByteBuffer;
+
+class ZeroUIntConstructor implements TypeConstructor<UnsignedInteger>
+{
+ private static final ZeroUIntConstructor INSTANCE = new ZeroUIntConstructor();
+
+ ZeroUIntConstructor()
+ {
+ }
+
+ public UnsignedInteger construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return UnsignedInteger.ZERO;
+ }
+
+ public static ZeroUIntConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroULongConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroULongConstructor.java
new file mode 100644
index 0000000000..b2ab2a4158
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/codec/ZeroULongConstructor.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.codec;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+
+import java.nio.ByteBuffer;
+
+class ZeroULongConstructor implements TypeConstructor<UnsignedLong>
+{
+ private static final ZeroULongConstructor INSTANCE = new ZeroULongConstructor();
+
+ ZeroULongConstructor()
+ {
+ }
+
+ public UnsignedLong construct(final ByteBuffer in, final ValueHandler handler) throws AmqpErrorException
+ {
+ return UnsignedLong.ZERO;
+ }
+
+ public static ZeroULongConstructor getInstance()
+ {
+ return INSTANCE;
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQFrame.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQFrame.java
new file mode 100644
index 0000000000..769fe13d29
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQFrame.java
@@ -0,0 +1,68 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+
+import java.nio.ByteBuffer;
+
+public abstract class AMQFrame<T>
+{
+ private T _frameBody;
+ private ByteBuffer _payload;
+
+ AMQFrame(T frameBody)
+ {
+ _frameBody = frameBody;
+ }
+
+ protected AMQFrame(T frameBody, ByteBuffer payload)
+ {
+ _frameBody = frameBody;
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+ public static TransportFrame createAMQFrame(short channel, FrameBody frameBody)
+ {
+ return createAMQFrame(channel, frameBody, null);
+ }
+
+ public static TransportFrame createAMQFrame(short channel, FrameBody frameBody, ByteBuffer payload)
+ {
+ return new TransportFrame(channel, frameBody, payload);
+ }
+
+ abstract public short getChannel();
+
+ abstract public byte getFrameType();
+
+ public T getFrameBody()
+ {
+ return _frameBody;
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQPProtocolHeaderHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQPProtocolHeaderHandler.java
new file mode 100644
index 0000000000..007df77f55
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/AMQPProtocolHeaderHandler.java
@@ -0,0 +1,85 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+import java.nio.ByteBuffer;
+
+public class AMQPProtocolHeaderHandler implements ProtocolHandler
+{
+ private ConnectionEndpoint _connection;
+ private static final byte MAJOR_VERSION = (byte) 1;
+ private static final byte MINOR_VERSION = (byte) 0;
+
+ enum State {
+ AWAITING_MAJOR,
+ AWAITING_MINOR,
+ AWAITING_REVISION,
+ ERROR
+ }
+
+ private State _state = State.AWAITING_MAJOR;
+
+ public AMQPProtocolHeaderHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ }
+
+ public ProtocolHandler parse(final ByteBuffer in)
+ {
+ while(in.hasRemaining() && _state != State.ERROR)
+ {
+ switch(_state)
+ {
+ case AWAITING_MAJOR:
+ _state = in.get() == MAJOR_VERSION ? State.AWAITING_MINOR : State.ERROR;
+ if(!in.hasRemaining())
+ {
+ break;
+ }
+ case AWAITING_MINOR:
+ _state = in.get() == MINOR_VERSION ? State.AWAITING_MINOR : State.ERROR;
+ if(!in.hasRemaining())
+ {
+ break;
+ }
+ case AWAITING_REVISION:
+ byte revision = in.get();
+ _connection.protocolHeaderReceived(MAJOR_VERSION, MINOR_VERSION, revision);
+ ProtocolHandler handler = new FrameHandler(_connection);
+ return handler.parse(in);
+ }
+ }
+ if(_state == State.ERROR)
+ {
+ _connection.invalidHeaderReceived();
+ }
+ return this;
+
+ }
+
+ public boolean isDone()
+ {
+ return _state != State.ERROR && !_connection.closedForInput();
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java
new file mode 100644
index 0000000000..78bed8a71e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/ConnectionHandler.java
@@ -0,0 +1,559 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.FrameWriter;
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.codec.ProtocolHeaderHandler;
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.transport.BytesProcessor;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+import org.apache.qpid.amqp_1_0.transport.FrameOutputHandler;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.transport.Open;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class ConnectionHandler
+{
+ private final ConnectionEndpoint _connection;
+ private ProtocolHandler _delegate;
+
+ private static final Logger FRAME_LOGGER = Logger.getLogger("FRM");
+ private static final Logger RAW_LOGGER = Logger.getLogger("RAW");
+
+ public ConnectionHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ _delegate = new ProtocolHeaderHandler(connection);
+ }
+
+
+ public boolean parse(ByteBuffer in)
+ {
+
+ while(in.hasRemaining() && !isDone())
+ {
+ _delegate = _delegate.parse(in);
+
+ }
+ return isDone();
+ }
+
+ public boolean isDone()
+ {
+ return _delegate.isDone();
+ }
+
+
+ // ----------------------------------------------------------------
+
+ public static class FrameOutput<T> implements FrameOutputHandler<T>, FrameSource
+ {
+
+ private static final ByteBuffer EMPTY_BYTEBUFFER = ByteBuffer.wrap(new byte[0]);
+ private final BlockingQueue<AMQFrame<T>> _queue = new ArrayBlockingQueue<AMQFrame<T>>(100);
+ private ConnectionEndpoint _conn;
+
+ private final AMQFrame<T> _endOfFrameMarker = new AMQFrame<T>(null)
+ {
+ @Override public short getChannel()
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override public byte getFrameType()
+ {
+ throw new UnsupportedOperationException();
+ }
+ };
+
+ private boolean _setForClose;
+ private boolean _closed;
+
+ public FrameOutput(final ConnectionEndpoint conn)
+ {
+ _conn = conn;
+ }
+
+ public boolean canSend()
+ {
+ return _queue.remainingCapacity() != 0;
+ }
+
+ public void send(AMQFrame<T> frame)
+ {
+ send(frame, null);
+ }
+
+ public void send(final AMQFrame<T> frame, final ByteBuffer payload)
+ {
+ synchronized(_conn.getLock())
+ {
+ try
+ {
+// TODO HACK - check frame length
+ int size = _conn.getDescribedTypeRegistry()
+ .getValueWriter(frame.getFrameBody()).writeToBuffer(EMPTY_BYTEBUFFER) + 8;
+
+ if(size > _conn.getMaxFrameSize())
+ {
+ throw new OversizeFrameException(frame, size);
+ }
+
+ while(!_queue.offer(frame))
+ {
+ _conn.getLock().wait(1000L);
+
+ }
+ _conn.getLock().notifyAll();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+
+
+ public void close()
+ {
+ synchronized (_conn.getLock())
+ {
+ if(!_queue.offer(_endOfFrameMarker))
+ {
+ _setForClose = true;
+ }
+ _conn.getLock().notifyAll();
+ }
+ }
+
+ public AMQFrame<T> getNextFrame(final boolean wait)
+ {
+ synchronized(_conn.getLock())
+ {
+ try
+ {
+ AMQFrame frame = null;
+ while(!closed() && (frame = _queue.poll()) == null && wait)
+ {
+ _conn.getLock().wait();
+ }
+
+ if(frame == _endOfFrameMarker)
+ {
+ _closed = true;
+ frame = null;
+ }
+ else if(_setForClose && frame != null)
+ {
+ _setForClose = !_queue.offer(_endOfFrameMarker);
+ }
+
+
+ if(frame != null && FRAME_LOGGER.isLoggable(Level.FINE))
+ {
+ FRAME_LOGGER.fine("SEND[" + _conn.getRemoteAddress() + "|" + frame.getChannel() + "] : " + frame.getFrameBody());
+ }
+
+ _conn.getLock().notifyAll();
+
+ return frame;
+ }
+ catch (InterruptedException e)
+ {
+ _conn.setClosedForOutput(true);
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ return null;
+ }
+ }
+ }
+
+ public boolean closed()
+ {
+ return _closed;
+ }
+ }
+
+ public static interface FrameSource<T>
+ {
+ AMQFrame<T> getNextFrame(boolean wait);
+ boolean closed();
+ }
+
+
+ public static interface BytesSource
+ {
+ void getBytes(BytesProcessor processor, boolean wait);
+ boolean closed();
+ }
+
+ public static class FrameToBytesSourceAdapter implements BytesSource
+ {
+
+ private final FrameSource _frameSource;
+ private final FrameWriter _writer;
+ private static final int BUF_SIZE = 1<<16;
+ private final byte[] _bytes = new byte[BUF_SIZE];
+ private final ByteBuffer _buffer = ByteBuffer.wrap(_bytes);
+
+ public FrameToBytesSourceAdapter(final FrameSource frameSource, ValueWriter.Registry registry)
+ {
+ _frameSource = frameSource;
+ _writer = new FrameWriter(registry);
+ }
+
+ public void getBytes(final BytesProcessor processor, final boolean wait)
+ {
+
+ AMQFrame frame;
+
+ if(_buffer.position() == 0 && !_frameSource.closed())
+ {
+ if(!_writer.isComplete())
+ {
+ _writer.writeToBuffer(_buffer);
+ }
+
+ while(_buffer.hasRemaining())
+ {
+
+ if((frame = _frameSource.getNextFrame(wait && _buffer.position()==0)) != null)
+ {
+ _writer.setValue(frame);
+
+ try
+ {
+ _writer.writeToBuffer(_buffer);
+ }
+ catch(RuntimeException e)
+ {
+ e.printStackTrace();
+ throw e;
+ }
+ catch(Error e)
+ {
+ e.printStackTrace();
+ throw e;
+ }
+
+
+ }
+ else
+ {
+ break;
+ }
+ }
+ _buffer.flip();
+ }
+ if(_buffer.limit() != 0)
+ {
+ processor.processBytes(_buffer);
+ if(_buffer.remaining() == 0)
+ {
+ _buffer.clear();
+ }
+ }
+ }
+
+ public boolean closed()
+ {
+ return _buffer.position() == 0 && _frameSource.closed();
+ }
+ }
+
+
+ public static class HeaderBytesSource implements BytesSource
+ {
+
+ private final ByteBuffer _buffer;
+ private ConnectionEndpoint _conn;
+
+ public HeaderBytesSource(ConnectionEndpoint conn, byte... headerBytes)
+ {
+ _conn = conn;
+ _buffer = ByteBuffer.wrap(headerBytes);
+ }
+
+ public void getBytes(final BytesProcessor processor, final boolean wait)
+ {
+ if(!_conn.closedForOutput())
+ {
+ processor.processBytes(_buffer);
+ }
+ }
+
+ public boolean closed()
+ {
+ return !_conn.closedForOutput() && !_buffer.hasRemaining();
+ }
+ }
+
+ public static class SequentialBytesSource implements BytesSource
+ {
+ private Queue<BytesSource> _sources = new LinkedList<BytesSource>();
+
+ public SequentialBytesSource(BytesSource... sources)
+ {
+ _sources.addAll(Arrays.asList(sources));
+ }
+
+ public synchronized void addSource(BytesSource source)
+ {
+ _sources.add(source);
+ }
+
+ public synchronized void getBytes(final BytesProcessor processor, final boolean wait)
+ {
+ BytesSource src = _sources.peek();
+ while (src != null && src.closed())
+ {
+ _sources.poll();
+ src = _sources.peek();
+ }
+
+ if(src != null)
+ {
+ src.getBytes(processor, wait);
+ }
+ }
+
+ public boolean closed()
+ {
+ return _sources.isEmpty();
+ }
+ }
+
+
+ public static class BytesOutputHandler implements Runnable, BytesProcessor
+ {
+
+ private final OutputStream _outputStream;
+ private BytesSource _bytesSource;
+ private boolean _closed;
+ private ConnectionEndpoint _conn;
+
+ public BytesOutputHandler(OutputStream outputStream, BytesSource source, ConnectionEndpoint conn)
+ {
+ _outputStream = outputStream;
+ _bytesSource = source;
+ _conn = conn;
+ }
+
+ public void run()
+ {
+
+ final BytesSource bytesSource = _bytesSource;
+
+ while(!(_closed || bytesSource.closed()))
+ {
+ _bytesSource.getBytes(this, true);
+ }
+
+ }
+
+ public void processBytes(final ByteBuffer buf)
+ {
+ try
+ {
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ Binary bin = new Binary(buf.array(),buf.arrayOffset()+buf.position(), buf.limit()-buf.position());
+ RAW_LOGGER.fine("SEND["+ _conn.getRemoteAddress() +"] : " + bin.toString());
+ }
+ _outputStream.write(buf.array(),buf.arrayOffset()+buf.position(), buf.limit()-buf.position());
+ buf.position(buf.limit());
+ }
+ catch (IOException e)
+ {
+ _closed = true;
+ e.printStackTrace(); //TODO
+ }
+ }
+ }
+
+
+ public static class OutputHandler implements Runnable
+ {
+
+
+
+ private final OutputStream _outputStream;
+ private FrameSource _frameSource;
+
+ private static final int BUF_SIZE = 1<<16;
+ private ValueWriter.Registry _registry;
+
+
+ public OutputHandler(OutputStream outputStream, FrameSource source, ValueWriter.Registry registry)
+ {
+ _outputStream = outputStream;
+ _frameSource = source;
+ _registry = registry;
+ }
+
+ public void run()
+ {
+ int i=0;
+
+
+ try
+ {
+
+ byte[] buffer = new byte[BUF_SIZE];
+ ByteBuffer buf = ByteBuffer.wrap(buffer);
+
+ buf.put((byte)'A');
+ buf.put((byte)'M');
+ buf.put((byte)'Q');
+ buf.put((byte)'P');
+ buf.put((byte) 0);
+ buf.put((byte) 1);
+ buf.put((byte) 0);
+ buf.put((byte) 0);
+
+
+
+ final FrameSource frameSource = _frameSource;
+
+ AMQFrame frame;
+ FrameWriter writer = new FrameWriter(_registry);
+
+ while(!frameSource.closed())
+ {
+
+ if(!writer.isComplete())
+ {
+ writer.writeToBuffer(buf);
+ }
+
+ while(buf.hasRemaining())
+ {
+
+ if((frame = frameSource.getNextFrame(buf.position()==0)) != null)
+ {
+ writer.setValue(frame);
+
+ int size = writer.writeToBuffer(buf);
+
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ if(buf.limit() != 0)
+ {
+ _outputStream.write(buffer,0, buf.position());
+ buf.clear();
+ }
+ }
+
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+
+ }
+ }
+
+ public static void main(String[] args) throws AmqpErrorException
+ {
+ byte[] buffer = new byte[76];
+ ByteBuffer buf = ByteBuffer.wrap(buffer);
+ AMQPDescribedTypeRegistry registry = AMQPDescribedTypeRegistry.newInstance()
+ .registerTransportLayer()
+ .registerMessagingLayer()
+ .registerTransactionLayer();
+
+ Open open = new Open();
+ // Open(container_id="venture", channel_max=10, hostname="foo", offered_capabilities=[Symbol("one"), Symbol("two"), Symbol("three")])
+ open.setContainerId("venture");
+ open.setChannelMax(UnsignedShort.valueOf((short) 10));
+ open.setHostname("foo");
+ open.setOfferedCapabilities(new Symbol[] {Symbol.valueOf("one"),Symbol.valueOf("two"),Symbol.valueOf("three")});
+
+ ValueWriter<Open> writer = registry.getValueWriter(open);
+
+ System.out.println("------ Encode (time in ms for 1 million opens)");
+ Long myLong = Long.valueOf(32);
+ ValueWriter<Long> writer2 = registry.getValueWriter(myLong);
+ Double myDouble = Double.valueOf(3.14159265359);
+ ValueWriter<Double> writer3 = registry.getValueWriter(myDouble);
+ for(int n = 0; n < 1/*00*/; n++)
+ {
+ long startTime = System.currentTimeMillis();
+ for(int i = 1/*000000*/; i !=0; i--)
+ {
+ buf.position(0);
+ writer.setValue(open);
+ writer.writeToBuffer(buf);
+ writer2.setValue(myLong);
+ writer.writeToBuffer(buf);
+ writer3.setValue(myDouble);
+ writer3.writeToBuffer(buf);
+
+
+ }
+ long midTime = System.currentTimeMillis();
+ System.out.println((midTime - startTime));
+
+ }
+
+
+ ValueHandler handler = new ValueHandler(registry);
+ System.out.println("------ Decode (time in ms for 1 million opens)");
+ for(int n = 0; n < 100; n++)
+ {
+ long startTime = System.currentTimeMillis();
+ for(int i = 1000000; i !=0; i--)
+ {
+ buf.flip();
+ handler.parse(buf);
+ handler.parse(buf);
+ handler.parse(buf);
+
+ }
+ long midTime = System.currentTimeMillis();
+ System.out.println((midTime - startTime));
+ }
+
+
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameHandler.java
new file mode 100644
index 0000000000..76a28d23e9
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameHandler.java
@@ -0,0 +1,329 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.BinaryWriter;
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.ErrorCondition;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+import java.nio.ByteBuffer;
+import java.util.Formatter;
+
+public class FrameHandler implements ProtocolHandler
+{
+ private ConnectionEndpoint _connection;
+ private ValueHandler _typeHandler;
+
+ enum State {
+ SIZE_0,
+ SIZE_1,
+ SIZE_2,
+ SIZE_3,
+ PRE_PARSE,
+ BUFFERING,
+ PARSING,
+ ERROR
+ }
+
+ private State _state = State.SIZE_0;
+ private int _size;
+
+ private ByteBuffer _buffer;
+
+
+
+ public FrameHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ _typeHandler = new ValueHandler(connection.getDescribedTypeRegistry());
+
+ }
+
+ public ProtocolHandler parse(ByteBuffer in)
+ {
+ try
+ {
+ Error frameParsingError = null;
+ int size = _size;
+ State state = _state;
+ ByteBuffer oldIn = null;
+
+ while(in.hasRemaining() && state != State.ERROR)
+ {
+
+ final int remaining = in.remaining();
+ if(remaining == 0)
+ {
+ return this;
+ }
+
+
+ switch(state)
+ {
+ case SIZE_0:
+ if(remaining >= 4)
+ {
+ size = in.getInt();
+ state = State.PRE_PARSE;
+ break;
+ }
+ else
+ {
+ size = (in.get() << 24) & 0xFF000000;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_1;
+ break;
+ }
+ }
+ case SIZE_1:
+ size |= (in.get() << 16) & 0xFF0000;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_2;
+ break;
+ }
+ case SIZE_2:
+ size |= (in.get() << 8) & 0xFF00;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_3;
+ break;
+ }
+ case SIZE_3:
+ size |= in.get() & 0xFF;
+ state = State.PRE_PARSE;
+
+ case PRE_PARSE:
+
+ if(size < 8)
+ {
+ frameParsingError = createFramingError("specified frame size %d smaller than minimum frame header size %d", _size, 8);
+ state = State.ERROR;
+ break;
+ }
+
+ else if(size > _connection.getMaxFrameSize())
+ {
+ frameParsingError = createFramingError("specified frame size %d larger than maximum frame header size %d", size, _connection.getMaxFrameSize());
+ state = State.ERROR;
+ break;
+ }
+
+ if(in.remaining() < size-4)
+ {
+ _buffer = ByteBuffer.allocate(size-4);
+ _buffer.put(in);
+ state = State.BUFFERING;
+ break;
+ }
+ case BUFFERING:
+ if(_buffer != null)
+ {
+ if(in.remaining() < _buffer.remaining())
+ {
+ _buffer.put(in);
+ break;
+ }
+ else
+ {
+ ByteBuffer dup = in.duplicate();
+ dup.limit(dup.position()+_buffer.remaining());
+ int i = _buffer.remaining();
+ int d = dup.remaining();
+ in.position(in.position()+_buffer.remaining());
+ _buffer.put(dup);
+ oldIn = in;
+ _buffer.flip();
+ in = _buffer;
+ state = State.PARSING;
+ }
+ }
+
+ case PARSING:
+
+ int dataOffset = (in.get() << 2) & 0x3FF;
+
+ if(dataOffset < 8)
+ {
+ frameParsingError = createFramingError("specified frame data offset %d smaller than minimum frame header size %d", dataOffset, 8);
+ state = State.ERROR;
+ break;
+ }
+ else if(dataOffset > size)
+ {
+ frameParsingError = createFramingError("specified frame data offset %d larger than the frame size %d", dataOffset, _size);
+ state = State.ERROR;
+ break;
+ }
+
+ // type
+
+ int type = in.get() & 0xFF;
+ int channel = in.getShort() & 0xFF;
+
+ if(type != 0 && type != 1)
+ {
+ frameParsingError = createFramingError("unknown frame type: %d", type);
+ state = State.ERROR;
+ break;
+ }
+
+ // channel
+
+ /*if(channel > _connection.getChannelMax())
+ {
+ frameParsingError = createError(AmqpError.DECODE_ERROR,
+ "frame received on invalid channel %d above channel-max %d",
+ channel, _connection.getChannelMax());
+
+ state = State.ERROR;
+ }
+*/
+ // ext header
+ if(dataOffset!=8)
+ {
+ in.position(in.position()+dataOffset-8);
+ }
+
+ // oldIn null iff not working on duplicated buffer
+ if(oldIn == null)
+ {
+ oldIn = in;
+ in = in.duplicate();
+ final int endPos = in.position() + size - dataOffset;
+ in.limit(endPos);
+ oldIn.position(endPos);
+
+ }
+
+ int inPos = in.position();
+ int inLimit = in.limit();
+ // PARSE HERE
+ try
+ {
+ Object val = _typeHandler.parse(in);
+
+ if(in.hasRemaining())
+ {
+ if(val instanceof Transfer)
+ {
+ ByteBuffer buf = ByteBuffer.allocate(in.remaining());
+ buf.put(in);
+ buf.flip();
+ ((Transfer)val).setPayload(buf);
+ }
+ }
+
+ _connection.receive((short)channel,val);
+ reset();
+ in = oldIn;
+ oldIn = null;
+ _buffer = null;
+ state = State.SIZE_0;
+ break;
+
+
+ }
+ catch (AmqpErrorException ex)
+ {
+ state = State.ERROR;
+ frameParsingError = ex.getError();
+ }
+ catch (RuntimeException e)
+ {
+ in.position(inPos);
+ in.limit(inLimit);
+ System.err.println(toHex(in));
+ throw e;
+ }
+ }
+
+ }
+
+ _state = state;
+ _size = size;
+
+ if(_state == State.ERROR)
+ {
+ _connection.handleError(frameParsingError);
+ }
+ return this;
+ }
+ catch(RuntimeException e)
+ {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ private static String toHex(ByteBuffer in)
+ {
+ Formatter formatter = new Formatter();
+ int count = 0;
+ while(in.hasRemaining())
+ {
+ formatter.format("%02x ", in.get() & 0xFF);
+ if(count++ == 16)
+ {
+ formatter.format("\n");
+ count = 0;
+ }
+
+ }
+ return formatter.toString();
+ }
+
+ private Error createFramingError(String description, Object... args)
+ {
+ return createError(ConnectionError.FRAMING_ERROR, description, args);
+ }
+
+ private Error createError(final ErrorCondition framingError,
+ final String description,
+ final Object... args)
+ {
+ Error error = new Error();
+ error.setCondition(framingError);
+ Formatter formatter = new Formatter();
+ error.setDescription(formatter.format(description, args).toString());
+ return error;
+ }
+
+
+ private void reset()
+ {
+ _size = 0;
+ _state = State.SIZE_0;
+ }
+
+
+ public boolean isDone()
+ {
+ return _state == State.ERROR || _connection.closedForInput();
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameParsingError.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameParsingError.java
new file mode 100644
index 0000000000..e8bd462b87
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameParsingError.java
@@ -0,0 +1,34 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+public enum FrameParsingError
+{
+ UNDERSIZED_FRAME_HEADER,
+ OVERSIZED_FRAME_HEADER,
+ DATA_OFFSET_IN_HEADER,
+ DATA_OFFSET_TOO_LARGE,
+ UNKNOWN_FRAME_TYPE,
+ CHANNEL_ID_BEYOND_MAX,
+ SPARE_OCTETS_IN_FRAME_BODY,
+ INSUFFICIENT_OCTETS_IN_FRAME_BODY,
+ UNKNOWN_TYPE_CODE, UNPARSABLE_TYPE;
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameTypeHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameTypeHandler.java
new file mode 100644
index 0000000000..6d680c8b02
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/FrameTypeHandler.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+
+public interface FrameTypeHandler extends ProtocolHandler
+{
+ void setExtHeaderRemaining(int size);
+
+ void setBodySize(int size);
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/OversizeFrameException.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/OversizeFrameException.java
new file mode 100644
index 0000000000..37897d9cb5
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/OversizeFrameException.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.framing;
+
+public class OversizeFrameException extends RuntimeException
+{
+ private final AMQFrame _frame;
+ private int _size;
+
+ public OversizeFrameException(final AMQFrame frame, final int size)
+ {
+ _frame = frame;
+ _size = size;
+ }
+
+ public AMQFrame getFrame()
+ {
+ return _frame;
+ }
+
+ public int getSize()
+ {
+ return _size;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrame.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrame.java
new file mode 100644
index 0000000000..4155b605c4
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrame.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.type.SaslFrameBody;
+
+public final class SASLFrame extends AMQFrame<SaslFrameBody>
+{
+
+ public SASLFrame(SaslFrameBody frameBody)
+ {
+ super(frameBody);
+ }
+
+ @Override public short getChannel()
+ {
+ return (short)0;
+ }
+
+ @Override public byte getFrameType()
+ {
+ return (byte)1;
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrameHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrameHandler.java
new file mode 100644
index 0000000000..be7023bfdc
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLFrameHandler.java
@@ -0,0 +1,311 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.codec.ProtocolHeaderHandler;
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.ErrorCondition;
+import org.apache.qpid.amqp_1_0.type.transport.ConnectionError;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.nio.ByteBuffer;
+import java.util.Formatter;
+
+public class SASLFrameHandler implements ProtocolHandler
+{
+ private ConnectionEndpoint _connection;
+ private ValueHandler _typeHandler;
+
+ enum State {
+ SIZE_0,
+ SIZE_1,
+ SIZE_2,
+ SIZE_3,
+ PRE_PARSE,
+ BUFFERING,
+ PARSING,
+ ERROR
+ }
+
+ private State _state = State.SIZE_0;
+ private int _size;
+
+ private ByteBuffer _buffer;
+
+
+
+ public SASLFrameHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ _typeHandler = new ValueHandler(connection.getDescribedTypeRegistry());
+
+ }
+
+ public ProtocolHandler parse(ByteBuffer in)
+ {
+ try
+ {
+ Error frameParsingError = null;
+ int size = _size;
+ State state = _state;
+ ByteBuffer oldIn = null;
+
+ while(in.hasRemaining() && !_connection.isSASLComplete() && state != State.ERROR)
+ {
+
+ final int remaining = in.remaining();
+ if(remaining == 0)
+ {
+ return this;
+ }
+
+
+ switch(state)
+ {
+ case SIZE_0:
+ if(remaining >= 4)
+ {
+ size = in.getInt();
+ state = State.PRE_PARSE;
+ break;
+ }
+ else
+ {
+ size = (in.get() << 24) & 0xFF000000;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_1;
+ break;
+ }
+ }
+ case SIZE_1:
+ size |= (in.get() << 16) & 0xFF0000;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_2;
+ break;
+ }
+ case SIZE_2:
+ size |= (in.get() << 8) & 0xFF00;
+ if(!in.hasRemaining())
+ {
+ state = State.SIZE_3;
+ break;
+ }
+ case SIZE_3:
+ size |= in.get() & 0xFF;
+ state = State.PRE_PARSE;
+
+ case PRE_PARSE:
+
+ if(size < 8)
+ {
+ frameParsingError = createFramingError("specified frame size %d smaller than minimum frame header size %d", _size, 8);
+ state = State.ERROR;
+ break;
+ }
+
+ else if(size > _connection.getMaxFrameSize())
+ {
+ frameParsingError = createFramingError("specified frame size %d larger than maximum frame header size %d", size, _connection.getMaxFrameSize());
+ state = State.ERROR;
+ break;
+ }
+
+ if(in.remaining() < size-4)
+ {
+ _buffer = ByteBuffer.allocate(size-4);
+ _buffer.put(in);
+ state = State.BUFFERING;
+ break;
+ }
+ case BUFFERING:
+ if(_buffer != null)
+ {
+ if(in.remaining() < _buffer.remaining())
+ {
+ _buffer.put(in);
+ break;
+ }
+ else
+ {
+ ByteBuffer dup = in.duplicate();
+ dup.limit(dup.position()+_buffer.remaining());
+ int i = _buffer.remaining();
+ int d = dup.remaining();
+ in.position(in.position()+_buffer.remaining());
+ _buffer.put(dup);
+ oldIn = in;
+ _buffer.flip();
+ in = _buffer;
+ state = State.PARSING;
+ }
+ }
+
+ case PARSING:
+
+ int dataOffset = (in.get() << 2) & 0x3FF;
+
+ if(dataOffset < 8)
+ {
+ frameParsingError = createFramingError("specified frame data offset %d smaller than minimum frame header size %d", dataOffset, 8);
+ state = State.ERROR;
+ break;
+ }
+ else if(dataOffset > size)
+ {
+ frameParsingError = createFramingError("specified frame data offset %d larger than the frame size %d", dataOffset, _size);
+ state = State.ERROR;
+ break;
+ }
+
+ // type
+
+ int type = in.get() & 0xFF;
+ int channel = in.getShort() & 0xFF;
+
+ if(type != 0 && type != 1)
+ {
+ frameParsingError = createFramingError("unknown frame type: %d", type);
+ state = State.ERROR;
+ break;
+ }
+
+ if(type != 1)
+ {
+ System.err.println("Wrong frame type for SASL Frame");
+ }
+
+ // channel
+
+ /*if(channel > _connection.getChannelMax())
+ {
+ frameParsingError = createError(AmqpError.DECODE_ERROR,
+ "frame received on invalid channel %d above channel-max %d",
+ channel, _connection.getChannelMax());
+
+ state = State.ERROR;
+ }
+*/
+ // ext header
+ if(dataOffset!=8)
+ {
+ in.position(in.position()+dataOffset-8);
+ }
+
+ // oldIn null iff not working on duplicated buffer
+ if(oldIn == null)
+ {
+ oldIn = in;
+ in = in.duplicate();
+ final int endPos = in.position() + size - dataOffset;
+ in.limit(endPos);
+ oldIn.position(endPos);
+
+ }
+
+
+ // PARSE HERE
+ try
+ {
+ Object val = _typeHandler.parse(in);
+
+ if(in.hasRemaining())
+ {
+ state = State.ERROR;
+ frameParsingError = createFramingError("Frame length %d larger than contained frame body %s.", size, val);
+
+ }
+ else
+ {
+ _connection.receive((short)channel,val);
+ reset();
+ in = oldIn;
+ oldIn = null;
+ _buffer = null;
+ state = State.SIZE_0;
+ break;
+ }
+
+
+ }
+ catch (AmqpErrorException ex)
+ {
+ state = State.ERROR;
+ frameParsingError = ex.getError();
+ }
+ }
+
+ }
+
+ _state = state;
+ _size = size;
+
+ if(_state == State.ERROR)
+ {
+ _connection.handleError(frameParsingError);
+ }
+ if(_connection.isSASLComplete())
+ {
+ return new ProtocolHeaderHandler(_connection);
+ }
+ else
+ {
+ return this;
+ }
+ }
+ catch(RuntimeException e)
+ {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ private Error createFramingError(String description, Object... args)
+ {
+ return createError(ConnectionError.FRAMING_ERROR, description, args);
+ }
+
+ private Error createError(final ErrorCondition framingError,
+ final String description,
+ final Object... args)
+ {
+ Error error = new Error();
+ error.setCondition(framingError);
+ Formatter formatter = new Formatter();
+ error.setDescription(formatter.format(description, args).toString());
+ return error;
+ }
+
+
+ private void reset()
+ {
+ _size = 0;
+ _state = State.SIZE_0;
+ }
+
+
+ public boolean isDone()
+ {
+ return _state == State.ERROR || _connection.closedForInput();
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLProtocolHeaderHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLProtocolHeaderHandler.java
new file mode 100644
index 0000000000..4ab90df92a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/SASLProtocolHeaderHandler.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+import java.nio.ByteBuffer;
+
+public class SASLProtocolHeaderHandler implements ProtocolHandler
+{
+ private ConnectionEndpoint _connection;
+ private static final byte MAJOR_VERSION = (byte) 1;
+ private static final byte MINOR_VERSION = (byte) 0;
+
+ enum State {
+ AWAITING_MAJOR,
+ AWAITING_MINOR,
+ AWAITING_REVISION,
+ ERROR
+ }
+
+ private State _state = State.AWAITING_MAJOR;
+
+
+
+ public SASLProtocolHeaderHandler(final ConnectionEndpoint connection)
+ {
+ _connection = connection;
+ }
+
+ public ProtocolHandler parse(final ByteBuffer in)
+ {
+ while(in.hasRemaining() && _state != State.ERROR)
+ {
+ switch(_state)
+ {
+ case AWAITING_MAJOR:
+ _state = in.get() == MAJOR_VERSION ? State.AWAITING_MINOR : State.ERROR;
+ if(!in.hasRemaining())
+ {
+ break;
+ }
+ case AWAITING_MINOR:
+ _state = in.get() == MINOR_VERSION ? State.AWAITING_MINOR : State.ERROR;
+ if(!in.hasRemaining())
+ {
+ break;
+ }
+ case AWAITING_REVISION:
+ byte revision = in.get();
+ _connection.protocolHeaderReceived(MAJOR_VERSION, MINOR_VERSION, revision);
+ ProtocolHandler handler = new SASLFrameHandler(_connection);
+ return handler.parse(in);
+ }
+ }
+ if(_state == State.ERROR)
+ {
+ _connection.invalidHeaderReceived();
+ }
+ return this;
+
+ }
+
+ public boolean isDone()
+ {
+ return _state != State.ERROR && !_connection.closedForInput();
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/TransportFrame.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/TransportFrame.java
new file mode 100644
index 0000000000..b66d36ebeb
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/framing/TransportFrame.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.framing;
+
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+
+import java.nio.ByteBuffer;
+
+public final class TransportFrame extends AMQFrame<FrameBody>
+{
+
+ private final short _channel;
+
+ TransportFrame(short channel, FrameBody frameBody)
+ {
+ super(frameBody);
+ _channel = channel;
+ }
+
+ public TransportFrame(short channel, FrameBody frameBody, ByteBuffer payload)
+ {
+ super(frameBody, payload);
+ _channel = channel;
+ }
+
+ @Override public short getChannel()
+ {
+ return _channel;
+ }
+
+ @Override public byte getFrameType()
+ {
+ return (byte)0;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/MessageAttributes.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/MessageAttributes.java
new file mode 100644
index 0000000000..7c1c62388d
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/MessageAttributes.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.messaging;
+
+import org.apache.qpid.amqp_1_0.type.Symbol;
+
+import java.util.Map;
+
+public interface MessageAttributes extends Map<Symbol, Object>
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoder.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoder.java
new file mode 100644
index 0000000000..f72d5848b6
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoder.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.messaging;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+
+
+public interface SectionDecoder
+{
+
+ public List<Section> parseAll(ByteBuffer buf) throws AmqpErrorException;
+ public Section readSection(ByteBuffer buf) throws AmqpErrorException;
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoderImpl.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoderImpl.java
new file mode 100644
index 0000000000..ed2b0094f9
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionDecoderImpl.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.messaging;
+
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SectionDecoderImpl implements SectionDecoder
+{
+
+ private ValueHandler _valueHandler;
+
+
+ public SectionDecoderImpl(final AMQPDescribedTypeRegistry describedTypeRegistry)
+ {
+ _valueHandler = new ValueHandler(describedTypeRegistry);
+ }
+
+ public List<Section> parseAll(ByteBuffer buf) throws AmqpErrorException
+ {
+
+ List<Section> obj = new ArrayList<Section>();
+ while(buf.hasRemaining())
+ {
+ Section section = (Section) _valueHandler.parse(buf);
+ obj.add(section);
+ }
+
+ return obj;
+ }
+
+ public Section readSection(ByteBuffer buf) throws AmqpErrorException
+ {
+ return (Section) _valueHandler.parse(buf);
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoder.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoder.java
new file mode 100644
index 0000000000..bcb9112d14
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoder.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.messaging;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+
+
+public interface SectionEncoder
+{
+ void reset();
+
+ Binary getEncoding();
+
+ void encodeObject(Object obj);
+
+ void encodeRaw(byte[] data);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoderImpl.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoderImpl.java
new file mode 100644
index 0000000000..9636dea4b7
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/messaging/SectionEncoderImpl.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.messaging;
+
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SectionEncoderImpl implements SectionEncoder
+{
+ private static final ByteBuffer EMPTY_BYTE_BUFFER = ByteBuffer.wrap(new byte[0]);
+ private ValueWriter.Registry _registry;
+
+ private int _totalSize = 0;
+
+ private List<byte[]> _output = new ArrayList<byte[]>();
+ private static final int DEFAULT_BUFFER_SIZE = 64 * 1024;
+ private ByteBuffer _current;
+
+ public SectionEncoderImpl(final AMQPDescribedTypeRegistry describedTypeRegistry)
+ {
+ _registry = describedTypeRegistry;
+ reset();
+ }
+
+ public void reset()
+ {
+ _totalSize = 0;
+ _output.clear();
+ _current = null;
+
+ }
+
+ public Binary getEncoding()
+ {
+ byte[] data = new byte[_totalSize];
+ int offset = 0;
+ for(byte[] src : _output)
+ {
+ int length = src.length;
+ System.arraycopy(src, 0, data, offset, _totalSize - offset < length ? _totalSize - offset : length);
+ offset+= length;
+ }
+ return new Binary(data);
+ }
+
+ public void encodeObject(Object obj)
+ {
+ final ValueWriter<Object> valueWriter = _registry.getValueWriter(obj);
+ valueWriter.setValue(obj);
+ int size = valueWriter.writeToBuffer(EMPTY_BYTE_BUFFER);
+
+ byte[] data = new byte[size];
+ _current = ByteBuffer.wrap(data);
+ valueWriter.writeToBuffer(_current);
+ _output.add(data);
+
+
+ _totalSize += size;
+
+
+ }
+
+ public void encodeRaw(byte[] data)
+ {
+ if(_current == null)
+ {
+ byte[] buf = new byte[data.length];
+ _current = ByteBuffer.wrap(buf);
+ _output.add(buf);
+ }
+ int remaining = _current.remaining();
+ int length = data.length;
+
+ if(remaining < length)
+ {
+ _current.put(data,0,remaining);
+ byte[] dst = new byte[length-remaining];
+ _output.add(dst);
+ _current = ByteBuffer.wrap(dst).put(data,remaining,length-remaining);
+ }
+ else
+ {
+ _current.put(data);
+ }
+ _totalSize += data.length;
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPFrameTransport.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPFrameTransport.java
new file mode 100644
index 0000000000..7cb10b923f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPFrameTransport.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+
+
+public class AMQPFrameTransport implements FrameTransport<AMQFrame<FrameBody>>, FrameOutputHandler<FrameBody>
+{
+ private final Object _inputLock = new Object();
+ private final Object _outputLock = new Object();
+
+ private volatile boolean _inputOpen = true;
+ private volatile boolean _outputOpen = true;
+
+ private final ConnectionEndpoint _endpoint;
+ private final BlockingQueue<AMQFrame<FrameBody>> _queue = new ArrayBlockingQueue<AMQFrame<FrameBody>>(100);
+ private StateChangeListener _inputListener;
+ private StateChangeListener _outputListener;
+
+
+ public AMQPFrameTransport(final ConnectionEndpoint endpoint)
+ {
+ _endpoint = endpoint;
+
+ _endpoint.setFrameOutputHandler(this);
+ }
+
+ public boolean isOpenForInput()
+ {
+ return _inputOpen;
+ }
+
+ public void closeForInput()
+ {
+ synchronized(_inputLock)
+ {
+ _inputOpen = false;
+ _inputLock.notifyAll();
+ }
+ }
+
+ public void processIncomingFrame(final AMQFrame<FrameBody> frame)
+ {
+ frame.getFrameBody().invoke(frame.getChannel(), _endpoint);
+ }
+
+
+ public boolean canSend()
+ {
+ return _queue.remainingCapacity() != 0;
+ }
+
+ public void send(AMQFrame<FrameBody> frame)
+ {
+ send(frame, null);
+ }
+
+
+ public void send(final AMQFrame<FrameBody> frame, final ByteBuffer payload)
+ {
+ synchronized(_endpoint.getLock())
+ {
+ boolean empty = _queue.isEmpty();
+ try
+ {
+
+ while(!_queue.offer(frame))
+ {
+ _endpoint.getLock().wait(1000L);
+
+ }
+ if(empty && _outputListener != null)
+ {
+ _outputListener.onStateChange(true);
+ }
+
+ _endpoint.getLock().notifyAll();
+ }
+ catch (InterruptedException e)
+ {
+
+ }
+ }
+ }
+
+ public void close()
+ {
+ synchronized (_endpoint.getLock())
+ {
+ _endpoint.getLock().notifyAll();
+ }
+ }
+
+ public AMQFrame<FrameBody> getNextFrame()
+ {
+ synchronized(_endpoint.getLock())
+ {
+ AMQFrame<FrameBody> frame = null;
+ if(isOpenForOutput())
+ {
+ frame = _queue.poll();
+ }
+ return frame;
+ }
+ }
+
+ public void closeForOutput()
+ {
+ synchronized (_outputLock)
+ {
+ _outputOpen = false;
+ _outputLock.notifyAll();
+ }
+ }
+
+ public boolean isOpenForOutput()
+ {
+ return _outputOpen;
+ }
+
+ public ValueWriter.Registry getRegistry()
+ {
+ return _endpoint.getDescribedTypeRegistry();
+ }
+
+ public void setInputStateChangeListener(final StateChangeListener listener)
+ {
+ _inputListener = listener;
+ }
+
+ public void setOutputStateChangeListener(final StateChangeListener listener)
+ {
+ _outputListener = listener;
+ }
+
+ public void setVersion(final byte major, final byte minor, final byte revision)
+ {
+
+ }
+
+ public byte getMajorVersion()
+ {
+ return _endpoint.getMajorVersion();
+ }
+
+ public byte getMinorVersion()
+ {
+ return _endpoint.getMinorVersion();
+ }
+
+ public byte getRevision()
+ {
+ return _endpoint.getRevision();
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPTransport.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPTransport.java
new file mode 100644
index 0000000000..8327cf6f26
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/AMQPTransport.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.codec.FrameWriter;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.framing.TransportFrame;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+
+import java.nio.ByteBuffer;
+
+public class AMQPTransport implements BytesTransport
+{
+ private volatile boolean _inputOpen = true;
+ private volatile boolean _outputOpen = true;
+
+ private static final int INPUT_BUFFER_SIZE = 1 << 16;
+ private static final int OUTPUT_BUFFER_SIZE = 1 << 16;
+
+
+ private final CircularBytesBuffer _inputBuffer = new CircularBytesBuffer(INPUT_BUFFER_SIZE);
+ private TransportFrame _currentInputFrame;
+ private boolean _readingFrames;
+
+
+ private final CircularBytesBuffer _outputBuffer = new CircularBytesBuffer(OUTPUT_BUFFER_SIZE);
+
+ private AMQFrame<FrameBody> _currentOutputFrame;
+
+
+ private AMQPFrameTransport _frameTransport;
+
+ private FrameWriter _frameWriter;
+
+ private final BytesProcessor _frameWriterProcessor = new BytesProcessor()
+ {
+ public void processBytes(final ByteBuffer buf)
+ {
+ _frameWriter.writeToBuffer(buf);
+
+ if(_frameWriter.isComplete())
+ {
+ _currentOutputFrame = null;
+ }
+ }
+ };
+
+ private StateChangeListener _inputListener;
+ private StateChangeListener _outputListener;
+
+
+ public AMQPTransport(AMQPFrameTransport frameTransport)
+ {
+ _frameTransport = frameTransport;
+ _frameWriter = new FrameWriter(_frameTransport.getRegistry());
+ _outputBuffer.put( ByteBuffer.wrap( new byte[] { (byte) 'A',
+ (byte) 'M',
+ (byte) 'Q',
+ (byte) 'P',
+ (byte) 0,
+ _frameTransport.getMajorVersion(),
+ _frameTransport.getMajorVersion(),
+ _frameTransport.getRevision(),
+ } ) );
+
+
+ }
+
+ public boolean isOpenForInput()
+ {
+ return _inputOpen;
+ }
+
+ public void inputClosed()
+ {
+ _inputOpen = false;
+ }
+
+ public void processBytes(final ByteBuffer buf)
+ {
+ _inputBuffer.put(buf);
+
+ if(!_readingFrames)
+ {
+ if(_inputBuffer.size()>=8)
+ {
+ final byte[] incomingHeader = new byte[8];
+ _inputBuffer.get(new BytesProcessor()
+ {
+ public void processBytes(final ByteBuffer buf)
+ {
+ buf.get(incomingHeader);
+ }
+ });
+ _frameTransport.setVersion(incomingHeader[5], incomingHeader[6], incomingHeader[7]);
+ _readingFrames = true;
+ }
+ }
+ else
+ {
+
+ }
+
+
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void setInputStateChangeListener(final StateChangeListener listener)
+ {
+ _inputListener = listener;
+ _frameTransport.setInputStateChangeListener(listener);
+ }
+
+ public void getNextBytes(final BytesProcessor processor)
+ {
+ // First try to fill the buffer as much as possible with frames
+ while(!_outputBuffer.isFull())
+ {
+ if(_currentOutputFrame == null)
+ {
+ _currentOutputFrame = _frameTransport.getNextFrame();
+ _frameWriter.setValue(_currentOutputFrame);
+ }
+
+ if(_currentOutputFrame == null)
+ {
+ break;
+ }
+
+
+ _outputBuffer.put(_frameWriterProcessor);
+
+
+
+ }
+
+ }
+
+ public void outputClosed()
+ {
+ _outputOpen = false;
+ }
+
+ public boolean isOpenForOutput()
+ {
+ return _outputOpen;
+ }
+
+ public void setOutputStateChangeListener(final StateChangeListener listener)
+ {
+ _outputListener = listener;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesProcessor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesProcessor.java
new file mode 100644
index 0000000000..d26eda302f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesProcessor.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import java.nio.ByteBuffer;
+
+public interface BytesProcessor
+{
+ void processBytes(ByteBuffer buf);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesTransport.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesTransport.java
new file mode 100644
index 0000000000..6932e7628b
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/BytesTransport.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+
+import java.nio.ByteBuffer;
+
+public interface BytesTransport extends BytesProcessor
+{
+
+ boolean isOpenForInput();
+ void inputClosed();
+ void processBytes(ByteBuffer buf);
+ void setInputStateChangeListener(StateChangeListener listener);
+
+ void getNextBytes(BytesProcessor processor);
+ void outputClosed();
+ boolean isOpenForOutput();
+ void setOutputStateChangeListener(StateChangeListener listener);
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CallbackHandlerSource.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CallbackHandlerSource.java
new file mode 100644
index 0000000000..604279a21f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CallbackHandlerSource.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+
+import javax.security.auth.callback.CallbackHandler;
+
+public interface CallbackHandlerSource
+{
+ CallbackHandler getHandler(String mechanism);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CircularBytesBuffer.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CircularBytesBuffer.java
new file mode 100644
index 0000000000..e71eedd1e1
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/CircularBytesBuffer.java
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import java.nio.ByteBuffer;
+
+public class CircularBytesBuffer
+{
+
+ private final byte[] _buffer;
+ private final int _mask;
+ private final ByteBuffer _inputBuffer;
+ private final ByteBuffer _outputBuffer;
+
+ private volatile int _start;
+ private volatile int _size;
+
+ public CircularBytesBuffer(int size)
+ {
+ size = calculateSize(size);
+ _buffer = new byte[size];
+ _mask = size - 1;
+ _inputBuffer = ByteBuffer.wrap(_buffer);
+ _outputBuffer = ByteBuffer.wrap(_buffer);
+
+ }
+
+
+ public int size()
+ {
+ return _size;
+ }
+
+ public boolean isFull()
+ {
+ return _size == _buffer.length;
+ }
+
+ public boolean isEmpty()
+ {
+ return _size == 0;
+ }
+
+ public void put(ByteBuffer buffer)
+ {
+ if(!isFull())
+ {
+ int start;
+ int size;
+
+ synchronized(this)
+ {
+ start = _start;
+ size = _size;
+ }
+
+ int pos = (start + size) & _mask;
+ int length = ((_buffer.length - pos) > size ? start : _buffer.length) - pos;
+ int remaining = length > buffer.remaining() ? buffer.remaining() : length;
+ buffer.get(_buffer, pos, remaining);
+
+ synchronized(this)
+ {
+ _size += remaining;
+ }
+
+ // We may still have space left if we have to wrap from the end to the start of the buffer
+ if(buffer.hasRemaining())
+ {
+ put(buffer);
+ }
+ }
+ }
+
+ public synchronized void put(BytesProcessor processor)
+ {
+ if(!isFull())
+ {
+ int start;
+ int size;
+
+ synchronized(this)
+ {
+ start = _start;
+ size = _size;
+ }
+ int pos = (start + size) & _mask;
+ int length = ((_buffer.length - pos) > size ? start : _buffer.length) - pos;
+ _outputBuffer.position(pos);
+ _outputBuffer.limit(pos+length);
+ processor.processBytes(_outputBuffer);
+
+ synchronized (this)
+ {
+ _size += length - _outputBuffer.remaining();
+ }
+
+ if(_outputBuffer.remaining() == 0)
+ {
+ put(processor);
+ }
+ }
+ }
+
+ public synchronized void get(BytesProcessor processor)
+ {
+ if(!isEmpty())
+ {
+ int start;
+ int size;
+
+ synchronized(this)
+ {
+ start = _start;
+ size = _size;
+ }
+
+
+ int length = start + size > _buffer.length ? _buffer.length - start : size;
+
+ _inputBuffer.position(start);
+ _inputBuffer.limit(start+length);
+ processor.processBytes(_inputBuffer);
+ final int consumed = length - _inputBuffer.remaining();
+
+ synchronized(this)
+ {
+ _start += consumed;
+ _size -= consumed;
+ }
+
+ if(!_inputBuffer.hasRemaining())
+ {
+ get(processor);
+ }
+ }
+ }
+
+ private int calculateSize(int size)
+ {
+ int n = 0;
+ int s = size;
+ do
+ {
+ s>>=1;
+ n++;
+ }
+ while(s > 0);
+
+ s = 1 << n;
+ if(s < size)
+ {
+ s<<= 1;
+ }
+ return s;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEndpoint.java
new file mode 100644
index 0000000000..4ad8b4196e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEndpoint.java
@@ -0,0 +1,934 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.framing.SASLFrame;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslChallenge;
+import org.apache.qpid.amqp_1_0.type.security.SaslCode;
+import org.apache.qpid.amqp_1_0.type.security.SaslInit;
+import org.apache.qpid.amqp_1_0.type.security.SaslMechanisms;
+import org.apache.qpid.amqp_1_0.type.security.SaslOutcome;
+import org.apache.qpid.amqp_1_0.type.security.SaslResponse;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+
+
+import javax.security.sasl.Sasl;
+import javax.security.sasl.SaslException;
+import javax.security.sasl.SaslServer;
+import javax.security.sasl.SaslServerFactory;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+
+public class ConnectionEndpoint implements DescribedTypeConstructorRegistry.Source, ValueWriter.Registry.Source,
+ ErrorHandler, SASLEndpoint
+
+{
+ private static final short CONNECTION_CONTROL_CHANNEL = (short) 0;
+ private static final ByteBuffer EMPTY_BYTE_BUFFER = ByteBuffer.wrap(new byte[0]);
+
+ private final Container _container;
+ private Principal _user;
+
+ private static final short DEFAULT_CHANNEL_MAX = 255;
+ private static final int DEFAULT_MAX_FRAME = Integer.getInteger("amqp.max_frame_size",1<<15);
+
+
+ private ConnectionState _state = ConnectionState.UNOPENED;
+ private short _channelMax;
+ private int _maxFrameSize = 4096;
+ private String _remoteContainerId;
+
+ private SocketAddress _remoteAddress;
+
+ // positioned by the *outgoing* channel
+ private SessionEndpoint[] _sendingSessions = new SessionEndpoint[DEFAULT_CHANNEL_MAX+1];
+
+ // positioned by the *incoming* channel
+ private SessionEndpoint[] _receivingSessions = new SessionEndpoint[DEFAULT_CHANNEL_MAX+1];
+ private boolean _closedForInput;
+ private boolean _closedForOutput;
+
+ private AMQPDescribedTypeRegistry _describedTypeRegistry = AMQPDescribedTypeRegistry.newInstance()
+ .registerTransportLayer()
+ .registerMessagingLayer()
+ .registerTransactionLayer()
+ .registerSecurityLayer();
+
+ private FrameOutputHandler<FrameBody> _frameOutputHandler;
+
+ private byte _majorVersion;
+ private byte _minorVersion;
+ private byte _revision;
+ private UnsignedInteger _handleMax = UnsignedInteger.MAX_VALUE;
+ private ConnectionEventListener _connectionEventListener = ConnectionEventListener.DEFAULT;
+ private String _password;
+ private final boolean _requiresSASLClient;
+ private final boolean _requiresSASLServer;
+
+
+ private FrameOutputHandler<SaslFrameBody> _saslFrameOutput;
+
+ private boolean _saslComplete;
+
+ private UnsignedInteger _desiredMaxFrameSize = UnsignedInteger.valueOf(DEFAULT_MAX_FRAME);
+ private Runnable _onSaslCompleteTask;
+
+ private CallbackHandlerSource _callbackHandlersource;
+ private SaslServer _saslServer;
+ private boolean _authenticated;
+ private String _remoteHostname;
+
+ public ConnectionEndpoint(Container container, CallbackHandlerSource cbs)
+ {
+ _container = container;
+ _callbackHandlersource = cbs;
+ _requiresSASLClient = false;
+ _requiresSASLServer = cbs != null;
+ }
+
+ public ConnectionEndpoint(Container container, Principal user, String password)
+ {
+ _container = container;
+ _user = user;
+ _password = password;
+ _requiresSASLClient = user != null;
+ _requiresSASLServer = false;
+ }
+
+
+ public synchronized void open()
+ {
+ if(_requiresSASLClient)
+ {
+ synchronized (getLock())
+ {
+ while(!_saslComplete)
+ {
+ try
+ {
+ getLock().wait();
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ }
+ }
+ if(!_authenticated)
+ {
+ throw new RuntimeException("Could not connect - authentication error");
+ }
+ }
+ if(_state == ConnectionState.UNOPENED)
+ {
+ sendOpen(DEFAULT_CHANNEL_MAX, DEFAULT_MAX_FRAME);
+ _state = ConnectionState.AWAITING_OPEN;
+ }
+ }
+
+ public void setFrameOutputHandler(final FrameOutputHandler<FrameBody> frameOutputHandler)
+ {
+ _frameOutputHandler = frameOutputHandler;
+ }
+
+ public synchronized SessionEndpoint createSession(String name)
+ {
+ // todo assert connection state
+ SessionEndpoint endpoint = new SessionEndpoint(this);
+ short channel = getFirstFreeChannel();
+ if(channel != -1)
+ {
+ _sendingSessions[channel] = endpoint;
+ endpoint.setSendingChannel(channel);
+ Begin begin = new Begin();
+ begin.setNextOutgoingId(endpoint.getNextOutgoingId());
+ begin.setOutgoingWindow(endpoint.getOutgoingWindowSize());
+ begin.setIncomingWindow(endpoint.getIncomingWindowSize());
+
+ begin.setHandleMax(_handleMax);
+ send(channel, begin);
+
+ }
+ else
+ {
+ // todo error
+ }
+ return endpoint;
+ }
+
+
+ public Container getContainer()
+ {
+ return _container;
+ }
+
+ public Principal getUser()
+ {
+ return _user;
+ }
+
+ public short getChannelMax()
+ {
+ return _channelMax;
+ }
+
+ public int getMaxFrameSize()
+ {
+ return _maxFrameSize;
+ }
+
+ public String getRemoteContainerId()
+ {
+ return _remoteContainerId;
+ }
+
+ private void sendOpen(final short channelMax, final int maxFrameSize)
+ {
+ Open open = new Open();
+
+ open.setChannelMax(UnsignedShort.valueOf(DEFAULT_CHANNEL_MAX));
+ open.setContainerId(_container.getId());
+ open.setMaxFrameSize(getDesiredMaxFrameSize());
+ open.setHostname(getRemoteHostname());
+
+
+ send(CONNECTION_CONTROL_CHANNEL, open);
+ }
+
+ public UnsignedInteger getDesiredMaxFrameSize()
+ {
+ return _desiredMaxFrameSize;
+ }
+
+
+ public void setDesiredMaxFrameSize(UnsignedInteger size)
+ {
+ _desiredMaxFrameSize = size;
+ }
+
+
+
+
+ private void closeSender()
+ {
+ setClosedForOutput(true);
+ _frameOutputHandler.close();
+ }
+
+
+ short getFirstFreeChannel()
+ {
+ for(int i = 0; i<_sendingSessions.length;i++)
+ {
+ if(_sendingSessions[i]==null)
+ {
+ return (short) i;
+ }
+ }
+ return -1;
+ }
+
+ private SessionEndpoint getSession(final short channel)
+ {
+ // TODO assert existence, check channel state
+ return _receivingSessions[channel];
+ }
+
+
+ public synchronized void receiveOpen(short channel, Open open)
+ {
+
+ _channelMax = open.getChannelMax() == null ? DEFAULT_CHANNEL_MAX
+ : open.getChannelMax().shortValue() < DEFAULT_CHANNEL_MAX
+ ? DEFAULT_CHANNEL_MAX
+ : open.getChannelMax().shortValue();
+
+ UnsignedInteger remoteDesiredMaxFrameSize = open.getMaxFrameSize() == null ? UnsignedInteger.valueOf(DEFAULT_MAX_FRAME) : open.getMaxFrameSize();
+
+ _maxFrameSize = (remoteDesiredMaxFrameSize.compareTo(_desiredMaxFrameSize) < 0 ? remoteDesiredMaxFrameSize : _desiredMaxFrameSize).intValue();
+
+ _remoteContainerId = open.getContainerId();
+
+ switch(_state)
+ {
+ case UNOPENED:
+ sendOpen(_channelMax, _maxFrameSize);
+ case AWAITING_OPEN:
+ _state = ConnectionState.OPEN;
+ default:
+ // TODO bad stuff (connection already open)
+
+ }
+ /*if(_state == ConnectionState.AWAITING_OPEN)
+ {
+ _state = ConnectionState.OPEN;
+ }
+*/
+ }
+
+ public synchronized void receiveClose(short channel, Close close)
+ {
+ setClosedForInput(true);
+ _connectionEventListener.closeReceived();
+ switch(_state)
+ {
+ case UNOPENED:
+ case AWAITING_OPEN:
+ Error error = new Error();
+ error.setCondition(ConnectionError.CONNECTION_FORCED);
+ error.setDescription("Connection close sent before connection was opened");
+ connectionError(error);
+ break;
+ case OPEN:
+ sendClose(new Close());
+ break;
+ case CLOSE_SENT:
+ default:
+ }
+ }
+
+ protected synchronized void connectionError(Error error)
+ {
+ Close close = new Close();
+ close.setError(error);
+ switch(_state)
+ {
+ case UNOPENED:
+ _state = ConnectionState.CLOSED;
+ break;
+ case AWAITING_OPEN:
+ case OPEN:
+ sendClose(close);
+ _state = ConnectionState.CLOSE_SENT;
+ case CLOSE_SENT:
+ case CLOSED:
+ // already sent our close - too late to do anything more
+ break;
+ default:
+ // TODO Unknown state
+ }
+ }
+
+ public synchronized void inputClosed()
+ {
+ if(!_closedForInput)
+ {
+ _closedForInput = true;
+ for(int i = 0; i < _receivingSessions.length; i++)
+ {
+ if(_receivingSessions[i] != null)
+ {
+ _receivingSessions[i].end();
+ _receivingSessions[i]=null;
+
+ }
+ }
+ }
+ notifyAll();
+ }
+
+ private void sendClose(Close closeToSend)
+ {
+ send(CONNECTION_CONTROL_CHANNEL, closeToSend);
+ closeSender();
+ }
+
+ private synchronized void setClosedForInput(boolean closed)
+ {
+ _closedForInput = closed;
+
+ notifyAll();
+ }
+
+ public synchronized void receiveBegin(short channel, Begin begin)
+ {
+ short myChannelId;
+
+
+
+ if(begin.getRemoteChannel() != null)
+ {
+ myChannelId = begin.getRemoteChannel().shortValue();
+ SessionEndpoint endpoint;
+ try
+ {
+ endpoint = _sendingSessions[myChannelId];
+ }
+ catch(IndexOutOfBoundsException e)
+ {
+ final Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("BEGIN received on channel " + channel + " with given remote-channel "
+ + begin.getRemoteChannel() + " which is outside the valid range of 0 to "
+ + _channelMax + ".");
+ connectionError(error);
+ return;
+ }
+ if(endpoint != null)
+ {
+ if(_receivingSessions[channel] == null)
+ {
+ _receivingSessions[channel] = endpoint;
+ endpoint.setReceivingChannel(channel);
+ endpoint.setNextIncomingId(begin.getNextOutgoingId());
+ endpoint.setOutgoingSessionCredit(begin.getIncomingWindow());
+ }
+ else
+ {
+ final Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("BEGIN received on channel " + channel + " which is already in use.");
+ connectionError(error);
+ }
+ }
+ else
+ {
+ final Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("BEGIN received on channel " + channel + " with given remote-channel "
+ + begin.getRemoteChannel() + " which is not known as a begun session.");
+ connectionError(error);
+ }
+
+
+ }
+ else // Peer requesting session creation
+ {
+
+ myChannelId = getFirstFreeChannel();
+ if(myChannelId == -1)
+ {
+ // close any half open channel
+ myChannelId = getFirstFreeChannel();
+
+ }
+
+ if(_receivingSessions[channel] == null)
+ {
+ SessionEndpoint endpoint = new SessionEndpoint(this,begin);
+
+ _receivingSessions[channel] = endpoint;
+ _sendingSessions[myChannelId] = endpoint;
+
+ Begin beginToSend = new Begin();
+
+ endpoint.setReceivingChannel(channel);
+ endpoint.setSendingChannel(myChannelId);
+ beginToSend.setRemoteChannel(UnsignedShort.valueOf(channel));
+ beginToSend.setNextOutgoingId(endpoint.getNextOutgoingId());
+ beginToSend.setOutgoingWindow(endpoint.getOutgoingWindowSize());
+ beginToSend.setIncomingWindow(endpoint.getIncomingWindowSize());
+ send(myChannelId, beginToSend);
+
+ _connectionEventListener.remoteSessionCreation(endpoint);
+ }
+ else
+ {
+ final Error error = new Error();
+ error.setCondition(ConnectionError.FRAMING_ERROR);
+ error.setDescription("BEGIN received on channel " + channel + " which is already in use.");
+ connectionError(error);
+ }
+
+ }
+
+
+
+ }
+
+
+
+ public synchronized void receiveEnd(short channel, End end)
+ {
+ SessionEndpoint endpoint = _receivingSessions[channel];
+ if(endpoint != null)
+ {
+ _receivingSessions[channel] = null;
+
+ endpoint.end(end);
+ }
+ else
+ {
+ // TODO error
+ }
+
+ }
+
+
+ public synchronized void sendEnd(short channel, End end)
+ {
+ send(channel, end);
+ _sendingSessions[channel] = null;
+ }
+
+ public synchronized void receiveAttach(short channel, Attach attach)
+ {
+ SessionEndpoint endPoint = getSession(channel);
+ endPoint.receiveAttach(attach);
+ }
+
+
+ public synchronized void receiveDetach(short channel, Detach detach)
+ {
+ SessionEndpoint endPoint = getSession(channel);
+ endPoint.receiveDetach(detach);
+ }
+
+ public synchronized void receiveTransfer(short channel, Transfer transfer)
+ {
+ SessionEndpoint endPoint = getSession(channel);
+ endPoint.receiveTransfer(transfer);
+ }
+
+ public synchronized void receiveDisposition(short channel, Disposition disposition)
+ {
+ SessionEndpoint endPoint = getSession(channel);
+ endPoint.receiveDisposition(disposition);
+ }
+
+ public synchronized void receiveFlow(short channel, Flow flow)
+ {
+ SessionEndpoint endPoint = getSession(channel);
+ endPoint.receiveFlow(flow);
+ }
+
+
+ public synchronized void send(short channel, FrameBody body)
+ {
+ send(channel, body, null);
+ }
+
+
+ public synchronized int send(short channel, FrameBody body, ByteBuffer payload)
+ {
+ if(!_closedForOutput)
+ {
+ ValueWriter<FrameBody> writer = _describedTypeRegistry.getValueWriter(body);
+ int size = writer.writeToBuffer(EMPTY_BYTE_BUFFER);
+ ByteBuffer payloadDup = payload == null ? null : payload.duplicate();
+ int payloadSent = getMaxFrameSize() - (size + 9);
+ if(payloadSent < (payload == null ? 0 : payload.remaining()))
+ {
+
+ if(body instanceof Transfer)
+ {
+ ((Transfer)body).setMore(Boolean.TRUE);
+ }
+
+ writer = _describedTypeRegistry.getValueWriter(body);
+ size = writer.writeToBuffer(EMPTY_BYTE_BUFFER);
+ payloadSent = getMaxFrameSize() - (size + 9);
+
+ try
+ {
+ payloadDup.limit(payloadDup.position()+payloadSent);
+ }
+ catch(NullPointerException npe)
+ {
+ throw npe;
+ }
+ }
+ else
+ {
+ payloadSent = payload == null ? 0 : payload.remaining();
+ }
+ _frameOutputHandler.send(AMQFrame.createAMQFrame(channel, body, payloadDup));
+ return payloadSent;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+
+
+
+ public void invalidHeaderReceived()
+ {
+ // TODO
+ _closedForInput = true;
+ }
+
+ public synchronized boolean closedForInput()
+ {
+ return _closedForInput;
+ }
+
+ public synchronized void protocolHeaderReceived(final byte major, final byte minorVersion, final byte revision)
+ {
+ if(_requiresSASLServer && _state != ConnectionState.UNOPENED)
+ {
+ // TODO - bad stuff
+ }
+
+ _majorVersion = major;
+ _minorVersion = minorVersion;
+ _revision = revision;
+ }
+
+ public synchronized void handleError(final Error error)
+ {
+ if(!closedForOutput())
+ {
+ Close close = new Close();
+ close.setError(error);
+ send((short) 0, close);
+ }
+ _closedForInput = true;
+ }
+
+ private final Logger _logger = Logger.getLogger("FRM");
+
+ public synchronized void receive(final short channel, final Object frame)
+ {
+ if(_logger.isLoggable(Level.FINE))
+ {
+ _logger.fine("RECV["+ _remoteAddress + "|"+channel+"] : " + frame);
+ }
+ if(frame instanceof FrameBody)
+ {
+ ((FrameBody)frame).invoke(channel, this);
+ }
+ else if(frame instanceof SaslFrameBody)
+ {
+ ((SaslFrameBody)frame).invoke(this);
+ }
+ }
+
+ public AMQPDescribedTypeRegistry getDescribedTypeRegistry()
+ {
+ return _describedTypeRegistry;
+ }
+
+ public synchronized void setClosedForOutput(boolean b)
+ {
+ _closedForOutput = true;
+ notifyAll();
+ }
+
+ public synchronized boolean closedForOutput()
+ {
+ return _closedForOutput;
+ }
+
+
+ public Object getLock()
+ {
+ return this;
+ }
+
+ public synchronized void close()
+ {
+ switch(_state)
+ {
+ case AWAITING_OPEN:
+ case OPEN:
+ Close closeToSend = new Close();
+ sendClose(closeToSend);
+ _state = ConnectionState.CLOSE_SENT;
+ break;
+ case CLOSE_SENT:
+ default:
+ }
+
+ }
+
+ public void setConnectionEventListener(final ConnectionEventListener connectionEventListener)
+ {
+ _connectionEventListener = connectionEventListener;
+ }
+
+ public ConnectionEventListener getConnectionEventListener()
+ {
+ return _connectionEventListener;
+ }
+
+ public byte getMinorVersion()
+ {
+ return _minorVersion;
+ }
+
+ public byte getRevision()
+ {
+ return _revision;
+ }
+
+ public byte getMajorVersion()
+ {
+ return _majorVersion;
+ }
+
+ public void receiveSaslInit(final SaslInit saslInit)
+ {
+ Symbol mechanism = saslInit.getMechanism();
+ final Binary initialResponse = saslInit.getInitialResponse();
+ byte[] response = initialResponse == null ? new byte[0] : initialResponse.getArray();
+
+
+ try
+ {
+ _saslServer = Sasl.createSaslServer(mechanism.toString(),
+ "AMQP",
+ "localhost",
+ null,
+ _callbackHandlersource.getHandler(mechanism.toString()));
+
+ // Process response from the client
+ byte[] challenge = _saslServer.evaluateResponse(response != null ? response : new byte[0]);
+
+ if (_saslServer.isComplete())
+ {
+ SaslOutcome outcome = new SaslOutcome();
+
+ outcome.setCode(SaslCode.OK);
+ _saslFrameOutput.send(new SASLFrame(outcome), null);
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = true;
+ getLock().notifyAll();
+ }
+
+ if(_onSaslCompleteTask != null)
+ {
+ _onSaslCompleteTask.run();
+ }
+
+ }
+ else
+ {
+ SaslChallenge challengeBody = new SaslChallenge();
+ challengeBody.setChallenge(new Binary(challenge));
+ _saslFrameOutput.send(new SASLFrame(challengeBody), null);
+
+ }
+ }
+ catch (SaslException e)
+ {
+ SaslOutcome outcome = new SaslOutcome();
+
+ outcome.setCode(SaslCode.AUTH);
+ _saslFrameOutput.send(new SASLFrame(outcome), null);
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = false;
+ getLock().notifyAll();
+ }
+ if(_onSaslCompleteTask != null)
+ {
+ _onSaslCompleteTask.run();
+ }
+
+ }
+ }
+
+ public void receiveSaslMechanisms(final SaslMechanisms saslMechanisms)
+ {
+ if(Arrays.asList(saslMechanisms.getSaslServerMechanisms()).contains(Symbol.valueOf("PLAIN")))
+ {
+ SaslInit init = new SaslInit();
+ init.setMechanism(Symbol.valueOf("PLAIN"));
+ init.setHostname(_remoteHostname);
+ byte[] usernameBytes = _user.getName().getBytes(Charset.forName("UTF-8"));
+ byte[] passwordBytes = _password.getBytes(Charset.forName("UTF-8"));
+ byte[] initResponse = new byte[usernameBytes.length+passwordBytes.length+2];
+ System.arraycopy(usernameBytes,0,initResponse,1,usernameBytes.length);
+ System.arraycopy(passwordBytes,0,initResponse,usernameBytes.length+2,passwordBytes.length);
+ init.setInitialResponse(new Binary(initResponse));
+ _saslFrameOutput.send(new SASLFrame(init),null);
+ }
+ }
+
+ public void receiveSaslChallenge(final SaslChallenge saslChallenge)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void receiveSaslResponse(final SaslResponse saslResponse)
+ {
+ final Binary responseBinary = saslResponse.getResponse();
+ byte[] response = responseBinary == null ? new byte[0] : responseBinary.getArray();
+
+
+ try
+ {
+
+ // Process response from the client
+ byte[] challenge = _saslServer.evaluateResponse(response != null ? response : new byte[0]);
+
+ if (_saslServer.isComplete())
+ {
+ SaslOutcome outcome = new SaslOutcome();
+
+ outcome.setCode(SaslCode.OK);
+ _saslFrameOutput.send(new SASLFrame(outcome),null);
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = true;
+ getLock().notifyAll();
+ }
+ if(_onSaslCompleteTask != null)
+ {
+ _onSaslCompleteTask.run();
+ }
+
+ }
+ else
+ {
+ SaslChallenge challengeBody = new SaslChallenge();
+ challengeBody.setChallenge(new Binary(challenge));
+ _saslFrameOutput.send(new SASLFrame(challengeBody), null);
+
+ }
+ }
+ catch (SaslException e)
+ {
+ SaslOutcome outcome = new SaslOutcome();
+
+ outcome.setCode(SaslCode.AUTH);
+ _saslFrameOutput.send(new SASLFrame(outcome),null);
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = false;
+ getLock().notifyAll();
+ }
+ if(_onSaslCompleteTask != null)
+ {
+ _onSaslCompleteTask.run();
+ }
+
+ }
+ }
+
+ public void receiveSaslOutcome(final SaslOutcome saslOutcome)
+ {
+ if(saslOutcome.getCode() == SaslCode.OK)
+ {
+ _saslFrameOutput.close();
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = true;
+ getLock().notifyAll();
+ }
+ if(_onSaslCompleteTask != null)
+ {
+ _onSaslCompleteTask.run();
+ }
+ }
+ else
+ {
+ synchronized (getLock())
+ {
+ _saslComplete = true;
+ _authenticated = false;
+ getLock().notifyAll();
+ }
+ setClosedForInput(true);
+ _saslFrameOutput.close();
+ }
+ }
+
+ public boolean requiresSASL()
+ {
+ return _requiresSASLClient || _requiresSASLServer;
+ }
+
+ public void setSaslFrameOutput(final FrameOutputHandler<SaslFrameBody> saslFrameOutput)
+ {
+ _saslFrameOutput = saslFrameOutput;
+ }
+
+ public void setOnSaslComplete(Runnable task)
+ {
+ _onSaslCompleteTask = task;
+
+ }
+
+ public boolean isAuthenticated()
+ {
+ return _authenticated;
+ }
+
+ public void initiateSASL()
+ {
+ SaslMechanisms mechanisms = new SaslMechanisms();
+ final Enumeration<SaslServerFactory> saslServerFactories = Sasl.getSaslServerFactories();
+
+ SaslServerFactory f;
+ ArrayList<Symbol> mechanismsList = new ArrayList<Symbol>();
+ while(saslServerFactories.hasMoreElements())
+ {
+ f = saslServerFactories.nextElement();
+ final String[] mechanismNames = f.getMechanismNames(null);
+ for(String name : mechanismNames)
+ {
+ mechanismsList.add(Symbol.valueOf(name));
+ }
+
+ }
+ mechanisms.setSaslServerMechanisms(mechanismsList.toArray(new Symbol[mechanismsList.size()]));
+ _saslFrameOutput.send(new SASLFrame(mechanisms), null);
+ }
+
+ public boolean isSASLComplete()
+ {
+ return _saslComplete;
+ }
+
+ public SocketAddress getRemoteAddress()
+ {
+ return _remoteAddress;
+ }
+
+ public void setRemoteAddress(SocketAddress remoteAddress)
+ {
+ _remoteAddress = remoteAddress;
+ }
+
+ public String getRemoteHostname()
+ {
+ return _remoteHostname;
+ }
+
+ public void setRemoteHostname(final String remoteHostname)
+ {
+ _remoteHostname = remoteHostname;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEventListener.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEventListener.java
new file mode 100644
index 0000000000..17163598d2
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionEventListener.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public interface ConnectionEventListener
+{
+ class DefaultConnectionEventListener implements ConnectionEventListener
+ {
+ public void remoteSessionCreation(final SessionEndpoint endpoint)
+ {
+ endpoint.end();
+ }
+
+ public void closeReceived()
+ {
+
+ }
+ }
+
+ public static final ConnectionEventListener DEFAULT = new DefaultConnectionEventListener();
+
+ void remoteSessionCreation(SessionEndpoint endpoint);
+
+ public void closeReceived();
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionState.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionState.java
new file mode 100644
index 0000000000..a46526b58f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ConnectionState.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public enum ConnectionState
+{
+ UNOPENED,
+ AWAITING_OPEN,
+ OPEN,
+ CLOSE_SENT,
+ CLOSED
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Container.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Container.java
new file mode 100644
index 0000000000..2e7e2fe2ea
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Container.java
@@ -0,0 +1,79 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import java.lang.management.ManagementFactory;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class Container
+{
+
+ private static final AtomicInteger CONTAINER_ID = new AtomicInteger(0);
+
+ private String _id;
+
+ public Container()
+ {
+ String hostname;
+ try
+ {
+ InetAddress addr = InetAddress.getLocalHost();
+
+
+ // Get hostname
+ hostname = addr.getHostName();
+ }
+ catch (UnknownHostException e)
+ {
+ hostname="127.0.0.1";
+ }
+
+ String pid;
+ String hackForPid = ManagementFactory.getRuntimeMXBean().getName();
+ if(hackForPid != null && hackForPid.contains("@"))
+ {
+ pid = hackForPid.split("@")[0];
+ }
+ else
+ {
+ pid = "unknown";
+ }
+
+ _id = hostname + '(' + pid + ')' + ':' + CONTAINER_ID.incrementAndGet();
+
+ }
+
+
+ public Container(String id)
+ {
+ _id = id;
+ }
+
+ public String getId()
+ {
+ return _id;
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Delivery.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Delivery.java
new file mode 100644
index 0000000000..4135199045
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Delivery.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Delivery
+{
+ private boolean _complete;
+ private boolean _settled;
+ private final List<Transfer> _transfers = new ArrayList<Transfer>(1);
+ private final UnsignedInteger _deliveryId;
+ private final Binary _deliveryTag;
+ private final LinkEndpoint _linkEndpoint;
+
+ public Delivery(Transfer transfer, final LinkEndpoint endpoint)
+ {
+ _settled = Boolean.TRUE.equals(transfer.getSettled());
+ _deliveryId = transfer.getDeliveryId();
+ _deliveryTag = transfer.getDeliveryTag();
+ _linkEndpoint = endpoint;
+ addTransfer(transfer);
+ }
+
+ public boolean isComplete()
+ {
+ return _complete;
+ }
+
+ public void setComplete(final boolean complete)
+ {
+ _complete = complete;
+ }
+
+ public boolean isSettled()
+ {
+ return _settled;
+ }
+
+ public void setSettled(final boolean settled)
+ {
+ _settled = settled;
+ }
+
+ public void addTransfer(Transfer transfer)
+ {
+ _transfers.add(transfer);
+ if(Boolean.TRUE.equals(transfer.getAborted()) || !Boolean.TRUE.equals(transfer.getMore()))
+ {
+ setComplete(true);
+ }
+ }
+
+ public List<Transfer> getTransfers()
+ {
+ return _transfers;
+ }
+
+ public UnsignedInteger getDeliveryId()
+ {
+ return _deliveryId;
+ }
+
+ public LinkEndpoint getLinkEndpoint()
+ {
+ return _linkEndpoint;
+ }
+
+ public Binary getDeliveryTag()
+ {
+ return _deliveryTag;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/DeliveryStateHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/DeliveryStateHandler.java
new file mode 100644
index 0000000000..95a16d375f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/DeliveryStateHandler.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+
+public interface DeliveryStateHandler
+{
+ public void handle(final Binary deliveryTag, final DeliveryState state, final Boolean settled);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ErrorHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ErrorHandler.java
new file mode 100644
index 0000000000..e3bd37b225
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ErrorHandler.java
@@ -0,0 +1,9 @@
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+
+public interface ErrorHandler
+{
+ void handleError(org.apache.qpid.amqp_1_0.type.transport.Error error);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameOutputHandler.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameOutputHandler.java
new file mode 100644
index 0000000000..77933702ba
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameOutputHandler.java
@@ -0,0 +1,36 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+
+import java.nio.ByteBuffer;
+
+public interface FrameOutputHandler<T>
+{
+ boolean canSend();
+
+ void send(AMQFrame<T> frame);
+ void send(AMQFrame<T> frame, ByteBuffer payload);
+
+ void close();
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameTransport.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameTransport.java
new file mode 100644
index 0000000000..0f9cc8f5e8
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/FrameTransport.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+
+public interface FrameTransport<T extends AMQFrame>
+{
+ boolean isOpenForInput();
+ void closeForInput();
+ void processIncomingFrame(T frame);
+
+ T getNextFrame();
+ void closeForOutput();
+ boolean isOpenForOutput();
+
+ void setInputStateChangeListener(StateChangeListener listener);
+ void setOutputStateChangeListener(StateChangeListener listener);
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java
new file mode 100644
index 0000000000..60c1427e10
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEndpoint.java
@@ -0,0 +1,542 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class LinkEndpoint<T extends LinkEventListener>
+{
+
+ private T _linkEventListener;
+ private DeliveryStateHandler _deliveryStateHandler;
+ private Object _flowTransactionId;
+ private SenderSettleMode _sendingSettlementMode;
+ private ReceiverSettleMode _receivingSettlementMode;
+ private Map _initialUnsettledMap;
+ private Map _localUnsettled;
+ private UnsignedInteger _lastSentCreditLimit;
+
+
+ private enum State
+ {
+ DETACHED,
+ ATTACH_SENT,
+ ATTACH_RECVD,
+ ATTACHED,
+ DETACH_SENT,
+ DETACH_RECVD
+ };
+
+ private final String _name;
+
+ private SessionEndpoint _session;
+
+
+ private volatile State _state = State.DETACHED;
+
+ private Source _source;
+ private Target _target;
+ private UnsignedInteger _deliveryCount;
+ private UnsignedInteger _linkCredit;
+ private UnsignedInteger _available;
+ private Boolean _drain;
+ private UnsignedInteger _localHandle;
+ private UnsignedLong _maxMessageSize;
+
+ private Map<Binary,Delivery> _unsettledTransfers = new HashMap<Binary,Delivery>();
+
+ LinkEndpoint(final SessionEndpoint sessionEndpoint, String name, Map<Binary, Outcome> unsettled)
+ {
+ _name = name;
+ _session = sessionEndpoint;
+ _linkCredit = UnsignedInteger.valueOf(0);
+ _drain = Boolean.FALSE;
+ _localUnsettled = unsettled;
+
+ }
+
+ LinkEndpoint(final SessionEndpoint sessionEndpoint,final Attach attach)
+ {
+ _session = sessionEndpoint;
+
+ _name = attach.getName();
+ _initialUnsettledMap = attach.getUnsettled();
+
+ _state = State.ATTACH_RECVD;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public abstract Role getRole();
+
+ public Source getSource()
+ {
+ return _source;
+ }
+
+ public void setSource(final Source source)
+ {
+ _source = source;
+ }
+
+ public Target getTarget()
+ {
+ return _target;
+ }
+
+ public void setTarget(final Target target)
+ {
+ _target = target;
+ }
+
+ public void setDeliveryCount(final UnsignedInteger deliveryCount)
+ {
+ _deliveryCount = deliveryCount;
+ }
+
+ public void setLinkCredit(final UnsignedInteger linkCredit)
+ {
+ _linkCredit = linkCredit;
+ }
+
+ public void setAvailable(final UnsignedInteger available)
+ {
+ _available = available;
+ }
+
+ public void setDrain(final Boolean drain)
+ {
+ _drain = drain;
+ }
+
+ public UnsignedInteger getDeliveryCount()
+ {
+ return _deliveryCount;
+ }
+
+ public UnsignedInteger getAvailable()
+ {
+ return _available;
+ }
+
+ public Boolean getDrain()
+ {
+ return _drain;
+ }
+
+ public UnsignedInteger getLinkCredit()
+ {
+ return _linkCredit;
+ }
+
+ public void remoteDetached(Detach detach)
+ {
+ synchronized (getLock())
+ {
+ switch(_state)
+ {
+ case DETACH_SENT:
+ _state = State.DETACHED;
+ break;
+ case ATTACHED:
+ _state = State.DETACH_RECVD;
+ _linkEventListener.remoteDetached(this, detach);
+ break;
+ }
+ getLock().notifyAll();
+ }
+ }
+
+ public void receiveTransfer(final Transfer transfer, final Delivery delivery)
+ {
+ // TODO
+ }
+
+ public void settledByPeer(final Binary deliveryTag)
+ {
+ // TODO
+ }
+
+ public void receiveFlow(final Flow flow)
+ {
+ }
+
+ public void addUnsettled(final Delivery unsettled)
+ {
+ synchronized(getLock())
+ {
+ _unsettledTransfers.put(unsettled.getDeliveryTag(), unsettled);
+ getLock().notifyAll();
+ }
+ }
+
+ public void receiveDeliveryState(final Delivery unsettled,
+ final DeliveryState state,
+ final Boolean settled)
+ {
+ // TODO
+ synchronized(getLock())
+ {
+ if(_deliveryStateHandler != null)
+ {
+ _deliveryStateHandler.handle(unsettled.getDeliveryTag(), state, settled);
+ }
+
+ if(settled)
+ {
+ settle(unsettled.getDeliveryTag());
+ }
+
+ getLock().notifyAll();
+ }
+
+ }
+
+ public void settle(final Binary deliveryTag)
+ {
+ Delivery delivery = _unsettledTransfers.remove(deliveryTag);
+ if(delivery != null)
+ {
+ getSession().settle(getRole(),delivery.getDeliveryId());
+ }
+
+ }
+
+ public int getUnsettledCount()
+ {
+ synchronized(getLock())
+ {
+ return _unsettledTransfers.size();
+ }
+ }
+
+ public void setLocalHandle(final UnsignedInteger localHandle)
+ {
+ _localHandle = localHandle;
+ }
+
+ public void receiveAttach(final Attach attach)
+ {
+ synchronized(getLock())
+ {
+ switch(_state)
+ {
+ case ATTACH_SENT:
+ {
+
+ _state = State.ATTACHED;
+ getLock().notifyAll();
+
+ _initialUnsettledMap = attach.getUnsettled();
+ /* TODO - don't yet handle:
+
+ attach.getUnsettled();
+ attach.getProperties();
+ attach.getDurable();
+ attach.getExpiryPolicy();
+ attach.getTimeout();
+ */
+
+ break;
+ }
+
+ case DETACHED:
+ {
+ _state = State.ATTACHED;
+ getLock().notifyAll();
+ }
+
+
+ }
+
+ if(attach.getRole() == Role.SENDER)
+ {
+ _source = attach.getSource();
+ }
+ else
+ {
+ _target = attach.getTarget();
+ }
+
+ if(getRole() == Role.SENDER)
+ {
+ _maxMessageSize = attach.getMaxMessageSize();
+ }
+
+ }
+ }
+
+ public synchronized boolean isAttached()
+ {
+ return _state == State.ATTACHED;
+ }
+
+ public synchronized boolean isDetached()
+ {
+ return _state == State.DETACHED;
+ }
+
+ public SessionEndpoint getSession()
+ {
+ return _session;
+ }
+
+ public UnsignedInteger getLocalHandle()
+ {
+ return _localHandle;
+ }
+
+ public Object getLock()
+ {
+ return _session.getLock();
+ }
+
+ public void attach()
+ {
+ synchronized(getLock())
+ {
+ Attach attachToSend = new Attach();
+ attachToSend.setName(getName());
+ attachToSend.setRole(getRole());
+ attachToSend.setHandle(getLocalHandle());
+ attachToSend.setSource(getSource());
+ attachToSend.setTarget(getTarget());
+ attachToSend.setSndSettleMode(getSendingSettlementMode());
+ attachToSend.setRcvSettleMode(getReceivingSettlementMode());
+ attachToSend.setUnsettled(_localUnsettled);
+
+ if(getRole() == Role.SENDER)
+ {
+ attachToSend.setInitialDeliveryCount(_deliveryCount);
+ }
+
+ switch(_state)
+ {
+ case DETACHED:
+ _state = State.ATTACH_SENT;
+ break;
+ case ATTACH_RECVD:
+ _state = State.ATTACHED;
+ break;
+ default:
+ // TODO ERROR
+ }
+
+ getSession().sendAttach(attachToSend);
+
+ getLock().notifyAll();
+
+ }
+
+ }
+
+
+ public void detach()
+ {
+ detach(null, false);
+ }
+
+ public void close()
+ {
+ detach(null, true);
+ }
+
+ public void close(Error error)
+ {
+ detach(error, true);
+ }
+
+ public void detach(Error error)
+ {
+ detach(error, false);
+ }
+
+ private void detach(Error error, boolean close)
+ {
+ synchronized(getLock())
+ {
+ //TODO
+ switch(_state)
+ {
+ case ATTACHED:
+ _state = State.DETACH_SENT;
+ break;
+ case DETACH_RECVD:
+ _state = State.DETACHED;
+ break;
+ default:
+ return;
+ }
+
+ Detach detach = new Detach();
+ detach.setHandle(getLocalHandle());
+ if(close)
+ detach.setClosed(close);
+ detach.setError(error);
+
+ getSession().sendDetach(detach);
+
+ getLock().notifyAll();
+ }
+
+ }
+
+
+
+
+ public void setTransactionId(final Object txnId)
+ {
+ _flowTransactionId = txnId;
+ }
+
+ public void sendFlowConditional()
+ {
+ if(_lastSentCreditLimit != null)
+ {
+ UnsignedInteger clientsCredit = _lastSentCreditLimit.subtract(_deliveryCount);
+ int i = _linkCredit.subtract(clientsCredit).compareTo(clientsCredit);
+ if(i >=0)
+ {
+ sendFlow(_flowTransactionId != null);
+ }
+ else
+ {
+ getSession().sendFlowConditional();
+ }
+ }
+ else
+ {
+ sendFlow(_flowTransactionId != null);
+ }
+ }
+
+
+ public void sendFlow()
+ {
+ sendFlow(_flowTransactionId != null);
+ }
+
+ public void sendFlow(boolean setTransactionId)
+ {
+ if(_state == State.ATTACHED || _state == State.ATTACH_SENT)
+ {
+ Flow flow = new Flow();
+ flow.setLinkCredit(_linkCredit);
+ flow.setDeliveryCount(_deliveryCount);
+ _lastSentCreditLimit = _linkCredit.add(_deliveryCount);
+ flow.setAvailable(_available);
+ flow.setDrain(_drain);
+ if(setTransactionId)
+ {
+ flow.setProperties(Collections.singletonMap(Symbol.valueOf("txn-id"), _flowTransactionId));
+ }
+ flow.setHandle(getLocalHandle());
+ getSession().sendFlow(flow);
+ }
+ }
+
+ public T getLinkEventListener()
+ {
+ return _linkEventListener;
+ }
+
+ public void setLinkEventListener(final T linkEventListener)
+ {
+ synchronized(getLock())
+ {
+ _linkEventListener = linkEventListener;
+ }
+ }
+
+ public DeliveryStateHandler getDeliveryStateHandler()
+ {
+ return _deliveryStateHandler;
+ }
+
+ public void setDeliveryStateHandler(final DeliveryStateHandler deliveryStateHandler)
+ {
+ synchronized(getLock())
+ {
+ _deliveryStateHandler = deliveryStateHandler;
+ }
+ }
+
+ public void setSendingSettlementMode(SenderSettleMode sendingSettlementMode)
+ {
+ _sendingSettlementMode = sendingSettlementMode;
+ }
+
+ public SenderSettleMode getSendingSettlementMode()
+ {
+ return _sendingSettlementMode;
+ }
+
+ public ReceiverSettleMode getReceivingSettlementMode()
+ {
+ return _receivingSettlementMode;
+ }
+
+ public void setReceivingSettlementMode(ReceiverSettleMode receivingSettlementMode)
+ {
+ _receivingSettlementMode = receivingSettlementMode;
+ }
+
+ public Map getInitialUnsettledMap()
+ {
+ return _initialUnsettledMap;
+ }
+
+
+ public abstract void flowStateChanged();
+
+ public void setLocalUnsettled(Map unsettled)
+ {
+ _localUnsettled = unsettled;
+ }
+
+ @Override public String toString()
+ {
+ return "LinkEndpoint{" +
+ "_name='" + _name + '\'' +
+ ", _session=" + _session +
+ ", _state=" + _state +
+ ", _role=" + getRole() +
+ ", _source=" + _source +
+ ", _target=" + _target +
+ ", _transferCount=" + _deliveryCount +
+ ", _linkCredit=" + _linkCredit +
+ ", _available=" + _available +
+ ", _drain=" + _drain +
+ ", _localHandle=" + _localHandle +
+ ", _maxMessageSize=" + _maxMessageSize +
+ '}';
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEventListener.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEventListener.java
new file mode 100644
index 0000000000..c56a227e31
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/LinkEventListener.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.Detach;
+
+public interface LinkEventListener
+{
+
+
+ void remoteDetached(final LinkEndpoint endpoint, Detach detach);
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Node.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Node.java
new file mode 100644
index 0000000000..fb2270b51b
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/Node.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.transport;
+
+public class Node
+{
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ProtocolHeaderTransport.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ProtocolHeaderTransport.java
new file mode 100644
index 0000000000..f9abbeb832
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ProtocolHeaderTransport.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+
+import org.apache.qpid.amqp_1_0.type.Binary;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+
+public class ProtocolHeaderTransport implements BytesTransport
+{
+ private final Object _inputLock = new Object();
+ private final Object _outputLock = new Object();
+
+ private volatile boolean _inputOpen;
+ private volatile boolean _outputOpen;
+
+ private final Map<Binary,BytesTransport> _headersMap;
+
+ private BytesTransport _delegate;
+ private ByteBuffer _bytesToSend;
+
+ private byte[] _header = new byte[8];
+ private int _received;
+ private ByteBuffer _outputBuffer;
+
+ public ProtocolHeaderTransport(Map<Binary, BytesTransport> validHeaders)
+ {
+ _headersMap = validHeaders;
+
+ // if only one valid header then we can send, else we have to wait
+ }
+
+ public boolean isOpenForInput()
+ {
+ return _inputOpen;
+ }
+
+ public void inputClosed()
+ {
+ synchronized(_inputLock)
+ {
+ _inputOpen = false;
+ _inputLock.notifyAll();
+ }
+ }
+
+ public void processBytes(final ByteBuffer buf)
+ {
+ if(_delegate != null)
+ {
+ _delegate.processBytes(buf);
+ }
+ else
+ {
+
+ while( _received < 8 && buf.hasRemaining())
+ {
+ _header[_received++] = buf.get();
+ }
+ if(_received == 8)
+ {
+ Binary header = new Binary(_header);
+ _delegate = _headersMap.get(header);
+ if(_delegate != null)
+ {
+ _delegate.processBytes(ByteBuffer.wrap(_header));
+ _delegate.processBytes(buf);
+ }
+ else
+ {
+ inputClosed();
+ _outputBuffer = _headersMap.keySet().iterator().next().asByteBuffer();
+ }
+ }
+ }
+ }
+
+ public void setInputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public void getNextBytes(final BytesProcessor processor)
+ {
+ if(_bytesToSend != null && _bytesToSend.hasRemaining())
+ {
+ processor.processBytes(_bytesToSend);
+ }
+ else if(_delegate != null)
+ {
+ _delegate.getNextBytes(processor);
+ }
+
+ }
+
+ public void outputClosed()
+ {
+ synchronized (_outputLock)
+ {
+ _outputOpen = false;
+ _outputLock.notifyAll();
+ }
+ }
+
+ public boolean isOpenForOutput()
+ {
+ return _outputOpen;
+ }
+
+ public void setOutputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java
new file mode 100644
index 0000000000..bd9244c858
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkEndpoint.java
@@ -0,0 +1,438 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+
+import java.util.*;
+
+public class ReceivingLinkEndpoint extends LinkEndpoint<ReceivingLinkListener>
+{
+
+
+ private static class TransientState
+ {
+
+ UnsignedInteger _deliveryId;
+ int _credit = 1;
+ boolean _settled;
+
+ private TransientState(final UnsignedInteger transferId)
+ {
+ _deliveryId = transferId;
+ }
+
+ void incrementCredit()
+ {
+ _credit++;
+ }
+
+ public int getCredit()
+ {
+ return _credit;
+ }
+
+ public UnsignedInteger getDeliveryId()
+ {
+ return _deliveryId;
+ }
+
+ public boolean isSettled()
+ {
+ return _settled;
+ }
+
+ public void setSettled(boolean settled)
+ {
+ _settled = settled;
+ }
+ }
+
+ private Map<Binary, Object> _unsettledMap = new LinkedHashMap<Binary, Object>();
+ private Map<Binary, TransientState> _unsettledIds = new LinkedHashMap<Binary, TransientState>();
+ private boolean _creditWindow;
+ private boolean _remoteDrain;
+ private UnsignedInteger _remoteTransferCount;
+ private UnsignedInteger _drainLimit;
+
+
+ public ReceivingLinkEndpoint(final SessionEndpoint session, String name)
+ {
+ this(session,name,null);
+ }
+
+ public ReceivingLinkEndpoint(final SessionEndpoint session, String name, Map<Binary, Outcome> unsettledMap)
+ {
+ super(session, name, unsettledMap);
+ setDeliveryCount(UnsignedInteger.valueOf(0));
+ setLinkEventListener(ReceivingLinkListener.DEFAULT);
+ }
+
+ public ReceivingLinkEndpoint(final SessionEndpoint session, final Attach attach)
+ {
+ super(session, attach);
+ setDeliveryCount(attach.getInitialDeliveryCount());
+ setLinkEventListener(ReceivingLinkListener.DEFAULT);
+ setSendingSettlementMode(attach.getSndSettleMode());
+ setReceivingSettlementMode(attach.getRcvSettleMode());
+ }
+
+
+ @Override public Role getRole()
+ {
+ return Role.RECEIVER;
+ }
+
+ @Override
+ public void receiveTransfer(final Transfer transfer, final Delivery delivery)
+ {
+ synchronized (getLock())
+ {
+ TransientState transientState;
+ boolean existingState = _unsettledMap.containsKey(transfer.getDeliveryTag());
+ _unsettledMap.put(transfer.getDeliveryTag(), transfer.getState());
+ if(!existingState)
+ {
+ transientState = new TransientState(transfer.getDeliveryId());
+ if(Boolean.TRUE.equals(transfer.getSettled()))
+ {
+ transientState.setSettled(true);
+ }
+ _unsettledIds.put(transfer.getDeliveryTag(), transientState);
+ setLinkCredit(getLinkCredit().subtract(UnsignedInteger.ONE));
+ setDeliveryCount(getDeliveryCount().add(UnsignedInteger.ONE));
+
+ }
+ else
+ {
+ transientState = _unsettledIds.get(transfer.getDeliveryTag());
+ transientState.incrementCredit();
+ if(Boolean.TRUE.equals(transfer.getSettled()))
+ {
+ transientState.setSettled(true);
+ }
+ }
+
+ if(transientState.isSettled())
+ {
+ _unsettledMap.remove(transfer.getDeliveryTag());
+ }
+ getLinkEventListener().messageTransfer(transfer);
+
+
+ getLock().notifyAll();
+ }
+ }
+
+ @Override public void receiveFlow(final Flow flow)
+ {
+ synchronized (getLock())
+ {
+ super.receiveFlow(flow);
+ _remoteDrain = Boolean.TRUE.equals((Boolean)flow.getDrain());
+ setAvailable(flow.getAvailable());
+ _remoteTransferCount = flow.getDeliveryCount();
+ getLock().notifyAll();
+ }
+ }
+
+
+ public boolean isDrained()
+ {
+ return getDrain() && getDeliveryCount().equals(getDrainLimit());
+ }
+
+ @Override
+ public void settledByPeer(final Binary deliveryTag)
+ {
+ synchronized (getLock())
+ {
+ // TODO XXX : need to do anything about the window here?
+ if(settled(deliveryTag) && _creditWindow)
+ {
+ sendFlowConditional();
+ }
+ }
+ }
+
+ public boolean settled(final Binary deliveryTag)
+ {
+ synchronized(getLock())
+ {
+ boolean deleted;
+ if(deleted = (_unsettledIds.remove(deliveryTag) != null))
+ {
+ _unsettledMap.remove(deliveryTag);
+
+ getLock().notifyAll();
+ }
+
+ return deleted;
+ }
+ }
+
+ public void updateDisposition(final Binary deliveryTag, DeliveryState state, boolean settled)
+ {
+ synchronized(getLock())
+ {
+ if(_unsettledMap.containsKey(deliveryTag))
+ {
+ boolean outcomeUpdate = false;
+ Outcome outcome=null;
+ if(state instanceof Outcome)
+ {
+ outcome = (Outcome)state;
+ }
+ else if(state instanceof TransactionalState)
+ {
+ // TODO? Is this correct
+ outcome = ((TransactionalState)state).getOutcome();
+ }
+
+ if(outcome != null)
+ {
+ Object oldOutcome = _unsettledMap.put(deliveryTag, outcome);
+ outcomeUpdate = !outcome.equals(oldOutcome);
+ }
+
+
+
+
+ TransientState transientState = _unsettledIds.get(deliveryTag);
+ if(outcomeUpdate || settled)
+ {
+
+ final UnsignedInteger transferId = transientState.getDeliveryId();
+
+ getSession().updateDisposition(getRole(), transferId, transferId, state, settled);
+ }
+
+
+ if(settled)
+ {
+
+ if(settled(deliveryTag))
+ {
+ if(!isDetached() && _creditWindow)
+ {
+ setLinkCredit(getLinkCredit().add(UnsignedInteger.ONE));
+ sendFlowConditional();
+ }
+ else
+ {
+ getSession().sendFlowConditional();
+ }
+ }
+ }
+ getLock().notifyAll();
+ }
+ else
+ {
+ TransientState transientState = _unsettledIds.get(deliveryTag);
+ if(_creditWindow)
+ {
+ setLinkCredit(getLinkCredit().add(UnsignedInteger.ONE));
+ sendFlowConditional();
+ }
+
+ }
+ }
+
+ }
+
+
+ public void setCreditWindow()
+ {
+ setCreditWindow(true);
+ }
+ public void setCreditWindow(boolean window)
+ {
+
+ _creditWindow = window;
+ sendFlowConditional();
+
+ }
+
+ public void drain()
+ {
+ synchronized (getLock())
+ {
+ setDrain(true);
+ _creditWindow = false;
+ _drainLimit = getDeliveryCount().add(getLinkCredit());
+ sendFlow();
+ getLock().notifyAll();
+ }
+ }
+
+ @Override
+ public void receiveDeliveryState(final Delivery unsettled, final DeliveryState state, final Boolean settled)
+ {
+ super.receiveDeliveryState(unsettled, state, settled);
+ if(_creditWindow)
+ {
+ if(Boolean.TRUE.equals(settled))
+ {
+ setLinkCredit(getLinkCredit().add(UnsignedInteger.ONE));
+ sendFlowConditional();
+ }
+ }
+ }
+
+ public void requestTransactionalSend(Object txnId)
+ {
+ synchronized (getLock())
+ {
+ setDrain(true);
+ _creditWindow = false;
+ setTransactionId(txnId);
+ sendFlow();
+ getLock().notifyAll();
+ }
+ }
+
+ private void sendFlow(final Object transactionId)
+ {
+ sendFlow();
+ }
+
+
+ public void clearDrain()
+ {
+ synchronized (getLock())
+ {
+ setDrain(false);
+ sendFlow();
+ getLock().notifyAll();
+ }
+ }
+
+ public void updateAllDisposition(Binary deliveryTag, DeliveryState deliveryState, boolean settled)
+ {
+ synchronized(getLock())
+ {
+ if(!_unsettledIds.isEmpty())
+ {
+ Binary firstTag = _unsettledIds.keySet().iterator().next();
+ Binary lastTag = deliveryTag;
+ updateDispositions(firstTag, lastTag, deliveryState, settled);
+ }
+ }
+ }
+
+ private void updateDispositions(Binary firstTag, Binary lastTag, DeliveryState state, boolean settled)
+ {
+ SortedMap<UnsignedInteger, UnsignedInteger> ranges = new TreeMap<UnsignedInteger,UnsignedInteger>();
+
+ synchronized(getLock())
+ {
+
+ Iterator<Binary> iter = _unsettledIds.keySet().iterator();
+ List<Binary> tagsToUpdate = new ArrayList<Binary>();
+ Binary tag = null;
+
+ while(iter.hasNext() && !(tag = iter.next()).equals(firstTag));
+
+ if(firstTag.equals(tag))
+ {
+ tagsToUpdate.add(tag);
+
+ UnsignedInteger deliveryId = _unsettledIds.get(firstTag).getDeliveryId();
+
+ UnsignedInteger first = deliveryId;
+ UnsignedInteger last = first;
+
+ while(iter.hasNext())
+ {
+ tag = iter.next();
+ tagsToUpdate.add(tag);
+
+ deliveryId = _unsettledIds.get(firstTag).getDeliveryId();
+
+ if(deliveryId.equals(last.add(UnsignedInteger.ONE)))
+ {
+ last = deliveryId;
+ }
+ else
+ {
+ ranges.put(first,last);
+ first = last = deliveryId;
+ }
+
+ if(tag.equals(lastTag))
+ {
+ break;
+ }
+ }
+
+ ranges.put(first,last);
+ }
+
+ if(settled)
+ {
+
+ for(Binary deliveryTag : tagsToUpdate)
+ {
+ if(settled(deliveryTag) && _creditWindow)
+ {
+ setLinkCredit(getLinkCredit().add(UnsignedInteger.valueOf(1)));
+ }
+ }
+ sendFlowConditional();
+ }
+
+
+
+ for(Map.Entry<UnsignedInteger,UnsignedInteger> range : ranges.entrySet())
+ {
+ getSession().updateDisposition(getRole(), range.getKey(), range.getValue(), state, settled);
+ }
+
+
+ getLock().notifyAll();
+ }
+
+ }
+
+ @Override
+ public void settle(Binary deliveryTag)
+ {
+ super.settle(deliveryTag);
+ if(_creditWindow)
+ {
+ sendFlowConditional();
+ }
+
+ }
+
+ public void flowStateChanged()
+ {
+ }
+
+ public UnsignedInteger getDrainLimit()
+ {
+ return _drainLimit;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkListener.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkListener.java
new file mode 100644
index 0000000000..c0464fbff6
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingLinkListener.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+public interface ReceivingLinkListener extends LinkEventListener
+{
+ void messageTransfer(Transfer xfr);
+
+ class DefaultLinkEventListener implements org.apache.qpid.amqp_1_0.transport.ReceivingLinkListener
+ {
+ public void messageTransfer(final Transfer xfr)
+ {
+
+ }
+
+ public void remoteDetached(final LinkEndpoint endpoint, final Detach detach)
+ {
+ endpoint.detach();
+ }
+ }
+
+ public static final org.apache.qpid.amqp_1_0.transport.ReceivingLinkListener DEFAULT = new DefaultLinkEventListener();
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingSessionHalfEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingSessionHalfEndpoint.java
new file mode 100644
index 0000000000..d4b8e500d9
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/ReceivingSessionHalfEndpoint.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public class ReceivingSessionHalfEndpoint extends SessionHalfEndpoint
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpoint.java
new file mode 100644
index 0000000000..21c33d848d
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpoint.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.security.SaslChallenge;
+import org.apache.qpid.amqp_1_0.type.security.SaslInit;
+import org.apache.qpid.amqp_1_0.type.security.SaslMechanisms;
+import org.apache.qpid.amqp_1_0.type.security.SaslOutcome;
+import org.apache.qpid.amqp_1_0.type.security.SaslResponse;
+
+public interface SASLEndpoint
+{
+ void receiveSaslInit(SaslInit saslInit);
+
+ void receiveSaslMechanisms(SaslMechanisms saslMechanisms);
+
+ void receiveSaslChallenge(SaslChallenge saslChallenge);
+
+ void receiveSaslResponse(SaslResponse saslResponse);
+
+ void receiveSaslOutcome(SaslOutcome saslOutcome);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpointImpl.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpointImpl.java
new file mode 100644
index 0000000000..b371b1217c
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLEndpointImpl.java
@@ -0,0 +1,291 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.SaslFrameBody;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+import org.apache.qpid.amqp_1_0.type.security.SaslChallenge;
+import org.apache.qpid.amqp_1_0.type.security.SaslInit;
+import org.apache.qpid.amqp_1_0.type.security.SaslMechanisms;
+import org.apache.qpid.amqp_1_0.type.security.SaslOutcome;
+import org.apache.qpid.amqp_1_0.type.security.SaslResponse;
+
+
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.sasl.Sasl;
+import javax.security.sasl.SaslClient;
+import javax.security.sasl.SaslException;
+import javax.security.sasl.SaslServer;
+import java.io.PrintWriter;
+import java.util.Arrays;
+
+
+public class SASLEndpointImpl
+ implements DescribedTypeConstructorRegistry.Source, ValueWriter.Registry.Source, SASLEndpoint
+{
+ private static final short SASL_CONTROL_CHANNEL = (short) 0;
+
+ private static final byte[] EMPTY_CHALLENGE = new byte[0];
+
+ private FrameTransport _transport;
+
+
+ private static enum State
+ {
+ BEGIN_SERVER,
+ BEGIN_CLIENT,
+ SENT_MECHANISMS,
+ SENT_INIT,
+ SENT_REPSONSE,
+ SENT_CHALLENGE,
+ SENT_OUTCOME
+ };
+
+
+ public PrintWriter _out;
+
+
+ private State _state;
+
+ private SaslClient _saslClient;
+ private SaslServer _saslServer;
+
+ private boolean _isReadable;
+ private boolean _isWritable;
+ private boolean _closedForInput;
+ private boolean _closedForOutput;
+
+ private AMQPDescribedTypeRegistry _describedTypeRegistry = AMQPDescribedTypeRegistry.newInstance().registerSecurityLayer();
+
+ private FrameOutputHandler _frameOutputHandler;
+
+ private byte _majorVersion;
+ private byte _minorVersion;
+ private byte _revision;
+ private UnsignedInteger _handleMax = UnsignedInteger.MAX_VALUE;
+ private ConnectionEventListener _connectionEventListener = ConnectionEventListener.DEFAULT;
+ private Symbol[] _mechanisms;
+ private Symbol _mechanism;
+
+
+ private SASLEndpointImpl(FrameTransport transport, State initialState, Symbol... mechanisms)
+ {
+ _transport = transport;
+ _state = initialState;
+ _mechanisms = mechanisms;
+ }
+
+
+ public void setFrameOutputHandler(final FrameOutputHandler frameOutputHandler)
+ {
+ _frameOutputHandler = frameOutputHandler;
+ if(_state == State.BEGIN_SERVER)
+ {
+ sendMechanisms();
+ }
+ }
+
+ private synchronized void sendMechanisms()
+ {
+ SaslMechanisms saslMechanisms = new SaslMechanisms();
+
+ saslMechanisms.setSaslServerMechanisms(_mechanisms);
+
+ _state = State.SENT_MECHANISMS;
+
+ send(saslMechanisms);
+ }
+
+ public boolean isReadable()
+ {
+ return _isReadable;
+ }
+
+ public boolean isWritable()
+ {
+ return _isWritable;
+ }
+
+
+ public synchronized void send(SaslFrameBody body)
+ {
+ if(!_closedForOutput)
+ {
+ if(_out != null)
+ {
+ _out.println("SEND : " + body);
+ _out.flush();
+ }
+ //_frameOutputHandler.send(new SASLFrame(body));
+ }
+ }
+
+
+
+ public void invalidHeaderReceived()
+ {
+ // TODO
+ _closedForInput = true;
+ }
+
+ public synchronized boolean closedForInput()
+ {
+ return _closedForInput;
+ }
+
+ public synchronized void protocolHeaderReceived(final byte major, final byte minorVersion, final byte revision)
+ {
+ _majorVersion = major;
+ _minorVersion = minorVersion;
+ _revision = revision;
+ }
+
+
+ public synchronized void receive(final short channel, final Object frame)
+ {
+ if(_out != null)
+ {
+ _out.println( "RECV["+channel+"] : " + frame);
+ _out.flush();
+ }
+ if(frame instanceof SaslFrameBody)
+ {
+ ((SaslFrameBody)frame).invoke(this);
+ }
+ else
+ {
+ // TODO
+ }
+ }
+
+ public AMQPDescribedTypeRegistry getDescribedTypeRegistry()
+ {
+ return _describedTypeRegistry;
+ }
+
+ public synchronized void setClosedForOutput(boolean b)
+ {
+ _closedForOutput = true;
+ notifyAll();
+ }
+
+ public synchronized boolean closedForOutput()
+ {
+ return _closedForOutput;
+ }
+
+
+ public Object getLock()
+ {
+ return this;
+ }
+
+
+ public byte getMajorVersion()
+ {
+ return _majorVersion;
+ }
+
+
+ public byte getMinorVersion()
+ {
+ return _minorVersion;
+ }
+
+ public byte getRevision()
+ {
+ return _revision;
+ }
+
+
+ public void receiveSaslInit(final SaslInit saslInit)
+ {
+ _mechanism = saslInit.getMechanism();
+ try
+ {
+ _saslServer = Sasl.createSaslServer(_mechanism.toString(), "AMQP", "localhost", null, createServerCallbackHandler(_mechanism));
+ }
+ catch (SaslException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+ }
+
+ private CallbackHandler createServerCallbackHandler(final Symbol mechanism)
+ {
+ return null; //TODO
+ }
+
+ public synchronized void receiveSaslMechanisms(final SaslMechanisms saslMechanisms)
+ {
+ Symbol[] serverMechanisms = saslMechanisms.getSaslServerMechanisms();
+ for(Symbol mechanism : _mechanisms)
+ {
+ if(Arrays.asList(serverMechanisms).contains(mechanism))
+ {
+ _mechanism = mechanism;
+ break;
+ }
+ }
+ // TODO - no matching mechanism
+ try
+ {
+ _saslClient = Sasl.createSaslClient(new String[] { _mechanism.toString() }, null, "AMQP", "localhost", null,
+ createClientCallbackHandler(_mechanism));
+ SaslInit init = new SaslInit();
+ init.setMechanism(_mechanism);
+ init.setInitialResponse(_saslClient.hasInitialResponse() ? new Binary(_saslClient.evaluateChallenge(EMPTY_CHALLENGE)) : null);
+ send(init);
+ }
+ catch (SaslException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+ }
+
+ private CallbackHandler createClientCallbackHandler(final Symbol mechanism)
+ {
+ return null; //TODO
+ }
+
+ public void receiveSaslChallenge(final SaslChallenge saslChallenge)
+ {
+ //TODO
+ }
+
+ public void receiveSaslResponse(final SaslResponse saslResponse)
+ {
+ //TODO
+ }
+
+
+ public void receiveSaslOutcome(final SaslOutcome saslOutcome)
+ {
+ //TODO
+ }
+
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLFrameTransport.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLFrameTransport.java
new file mode 100644
index 0000000000..8299cddfbe
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLFrameTransport.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.framing.SASLFrame;
+
+public class SASLFrameTransport implements FrameTransport<SASLFrame>
+{
+ private final Object _inputLock = new Object();
+ private final Object _outputLock = new Object();
+
+ private volatile boolean _inputOpen;
+ private volatile boolean _outputOpen;
+
+ public boolean isOpenForInput()
+ {
+ return _inputOpen;
+ }
+
+ public void closeForInput()
+ {
+ synchronized(_inputLock)
+ {
+ _inputOpen = false;
+ _inputLock.notifyAll();
+ }
+ }
+ public void processIncomingFrame(final SASLFrame frame)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public SASLFrame getNextFrame()
+ {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void closeForOutput()
+ {
+ synchronized (_outputLock)
+ {
+ _outputOpen = false;
+ _outputLock.notifyAll();
+ }
+ }
+
+ public boolean isOpenForOutput()
+ {
+ return _outputOpen;
+ }
+
+ public void setInputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void setOutputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLTransport.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLTransport.java
new file mode 100644
index 0000000000..e140e3acd7
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SASLTransport.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+
+import java.nio.ByteBuffer;
+
+public class SASLTransport implements BytesTransport
+{
+ private final Object _inputLock = new Object();
+ private final Object _outputLock = new Object();
+
+ private volatile boolean _inputOpen;
+ private volatile boolean _outputOpen;
+
+ private AMQPDescribedTypeRegistry _describedTypeRegistry = AMQPDescribedTypeRegistry.newInstance()
+ .registerSecurityLayer();
+
+ public boolean isOpenForInput()
+ {
+ return _inputOpen;
+ }
+
+ public void inputClosed()
+ {
+ synchronized(_inputLock)
+ {
+ _inputOpen = false;
+ _inputLock.notifyAll();
+ }
+ }
+
+ public void processBytes(final ByteBuffer buf)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void setInputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void getNextBytes(final BytesProcessor processor)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void outputClosed()
+ {
+ synchronized (_outputLock)
+ {
+ _outputOpen = false;
+ _outputLock.notifyAll();
+ }
+ }
+
+ public boolean isOpenForOutput()
+ {
+ return _outputOpen;
+ }
+
+ public void setOutputStateChangeListener(final StateChangeListener listener)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkEndpoint.java
new file mode 100644
index 0000000000..a53b3661be
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkEndpoint.java
@@ -0,0 +1,214 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.Attach;
+import org.apache.qpid.amqp_1_0.type.transport.Flow;
+import org.apache.qpid.amqp_1_0.type.transport.Role;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class SendingLinkEndpoint extends LinkEndpoint<SendingLinkListener>
+{
+
+ private UnsignedInteger _lastDeliveryId;
+ private Binary _lastDeliveryTag;
+ private Map<Binary, UnsignedInteger> _unsettledMap = new HashMap<Binary, UnsignedInteger>();
+ private Binary _transactionId;
+
+ public SendingLinkEndpoint(final SessionEndpoint sessionEndpoint, String name)
+ {
+ this(sessionEndpoint, name, null);
+ }
+
+ public SendingLinkEndpoint(final SessionEndpoint sessionEndpoint, String name, Map<Binary, Outcome> unsettled)
+ {
+ super(sessionEndpoint, name, unsettled);
+ init();
+ }
+
+ public SendingLinkEndpoint(final SessionEndpoint sessionEndpoint, final Attach attach)
+ {
+ super(sessionEndpoint, attach);
+ setSendingSettlementMode(attach.getSndSettleMode());
+ setReceivingSettlementMode(attach.getRcvSettleMode());
+ init();
+ }
+
+ private void init()
+ {
+ setDeliveryCount(UnsignedInteger.valueOf(0));
+ setAvailable(UnsignedInteger.valueOf(0));
+ setLinkEventListener(SendingLinkListener.DEFAULT);
+ }
+
+ @Override public Role getRole()
+ {
+ return Role.SENDER;
+ }
+
+ public boolean transfer(final Transfer xfr)
+ {
+ SessionEndpoint s = getSession();
+ int transferCount;
+ transferCount = _lastDeliveryTag == null ? 1 : 1;
+ xfr.setMessageFormat(UnsignedInteger.ZERO);
+ synchronized(getLock())
+ {
+
+ final int currentCredit = getLinkCredit().intValue() - transferCount;
+
+ if(currentCredit < 0)
+ {
+ return false;
+ }
+ else
+ {
+ setLinkCredit(UnsignedInteger.valueOf((int)currentCredit));
+ }
+
+ setDeliveryCount(UnsignedInteger.valueOf((getDeliveryCount().intValue() + transferCount)));
+
+ xfr.setHandle(getLocalHandle());
+
+ s.sendTransfer(xfr, this, !xfr.getDeliveryTag().equals(_lastDeliveryTag));
+
+ if(!Boolean.TRUE.equals(xfr.getSettled()))
+ {
+ _unsettledMap.put(xfr.getDeliveryTag(), xfr.getDeliveryId());
+ }
+ }
+
+ if(Boolean.TRUE.equals(xfr.getMore()))
+ {
+ _lastDeliveryTag = xfr.getDeliveryTag();
+ }
+ else
+ {
+ _lastDeliveryTag = null;
+ }
+
+ return true;
+ }
+
+
+ public void drained()
+ {
+ synchronized (getLock())
+ {
+ setDeliveryCount(getDeliveryCount().add(getLinkCredit()));
+ setLinkCredit(UnsignedInteger.ZERO);
+ sendFlow();
+ }
+ }
+
+ @Override
+ public void receiveFlow(final Flow flow)
+ {
+ super.receiveFlow(flow);
+ UnsignedInteger t = flow.getDeliveryCount();
+ UnsignedInteger c = flow.getLinkCredit();
+ setDrain(flow.getDrain());
+
+ Map options;
+ if((options = flow.getProperties()) != null)
+ {
+ _transactionId = (Binary) options.get(Symbol.valueOf("txn-id"));
+ }
+
+ if(t == null)
+ {
+ setLinkCredit(c);
+ }
+ else
+ {
+ UnsignedInteger limit = t.add(c);
+ if(limit.compareTo(getDeliveryCount())<=0)
+ {
+ setLinkCredit(UnsignedInteger.valueOf(0));
+ }
+ else
+ {
+ setLinkCredit(limit.subtract(getDeliveryCount()));
+ }
+ }
+ getLinkEventListener().flowStateChanged();
+
+ }
+
+ @Override
+ public void flowStateChanged()
+ {
+ getLinkEventListener().flowStateChanged();
+ }
+
+ public boolean hasCreditToSend()
+ {
+ UnsignedInteger linkCredit = getLinkCredit();
+ return linkCredit != null && (linkCredit.compareTo(UnsignedInteger.valueOf(0)) > 0)
+ && getSession().hasCreditToSend();
+ }
+
+ public void receiveDeliveryState(final Delivery unsettled,
+ final DeliveryState state,
+ final Boolean settled)
+ {
+ super.receiveDeliveryState(unsettled, state, settled);
+ if(settled)
+ {
+ _unsettledMap.remove(unsettled.getDeliveryTag());
+ }
+ }
+
+ public UnsignedInteger getLastDeliveryId()
+ {
+ return _lastDeliveryId;
+ }
+
+ public void setLastDeliveryId(final UnsignedInteger deliveryId)
+ {
+ _lastDeliveryId = deliveryId;
+ }
+
+ public void updateDisposition(final Binary deliveryTag, DeliveryState state, boolean settled)
+ {
+ synchronized(getLock())
+ {
+ UnsignedInteger deliveryId;
+ if(settled && (deliveryId = _unsettledMap.remove(deliveryTag))!=null)
+ {
+ settle(deliveryTag);
+ getSession().updateDisposition(getRole(), deliveryId, deliveryId, state, settled);
+ }
+
+ }
+ }
+
+ public Binary getTransactionId()
+ {
+ return _transactionId;
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkListener.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkListener.java
new file mode 100644
index 0000000000..09a99f1ba1
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingLinkListener.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+public interface SendingLinkListener extends LinkEventListener
+{
+ void flowStateChanged();
+
+ class DefaultLinkEventListener implements org.apache.qpid.amqp_1_0.transport.SendingLinkListener
+ {
+
+ public void remoteDetached(final LinkEndpoint endpoint, final org.apache.qpid.amqp_1_0.type.transport.Detach detach)
+ {
+ endpoint.detach();
+ }
+
+ public void flowStateChanged()
+ {
+
+ }
+ }
+
+ public static final org.apache.qpid.amqp_1_0.transport.SendingLinkListener DEFAULT = new DefaultLinkEventListener();
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingSessionHalfEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingSessionHalfEndpoint.java
new file mode 100644
index 0000000000..2bc9a42dc5
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SendingSessionHalfEndpoint.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public class SendingSessionHalfEndpoint extends SessionHalfEndpoint
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SequenceNumber.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SequenceNumber.java
new file mode 100644
index 0000000000..3f6490c2aa
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SequenceNumber.java
@@ -0,0 +1,110 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public class SequenceNumber implements Comparable<SequenceNumber>, Cloneable
+{
+ private int _seqNo;
+
+ public SequenceNumber(int seqNo)
+ {
+ _seqNo = seqNo;
+ }
+
+ public SequenceNumber incr()
+ {
+ _seqNo++;
+ return this;
+ }
+
+ public SequenceNumber decr()
+ {
+ _seqNo--;
+ return this;
+ }
+
+ public static SequenceNumber add(SequenceNumber a, int i)
+ {
+ return a.clone().add(i);
+ }
+
+ public static SequenceNumber subtract(SequenceNumber a, int i)
+ {
+ return a.clone().add(-i);
+ }
+
+ private SequenceNumber add(int i)
+ {
+ _seqNo+=i;
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ SequenceNumber that = (SequenceNumber) o;
+
+ if (_seqNo != that._seqNo)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _seqNo;
+ }
+
+ public int compareTo(SequenceNumber o)
+ {
+ return _seqNo - o._seqNo;
+ }
+
+ @Override
+ public SequenceNumber clone()
+ {
+ return new SequenceNumber(_seqNo);
+ }
+
+ @Override
+ public String toString()
+ {
+ return "SN{" + _seqNo + '}';
+ }
+
+ public int intValue()
+ {
+ return _seqNo;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionAttachment.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionAttachment.java
new file mode 100644
index 0000000000..6bb1e922e5
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionAttachment.java
@@ -0,0 +1,92 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public class SessionAttachment
+{
+ private final SessionEndpoint _sessionEndpoint;
+ private final ConnectionEndpoint _connectionEndpoint;
+ private final short _channel;
+
+ public SessionAttachment(SessionEndpoint sessionEndpoint, ConnectionEndpoint connectionEndpoint, short channel)
+ {
+ _sessionEndpoint = sessionEndpoint;
+ _connectionEndpoint = connectionEndpoint;
+ _channel = channel;
+ }
+
+ public SessionEndpoint getSessionEndpoint()
+ {
+ return _sessionEndpoint;
+ }
+
+ public ConnectionEndpoint getConnectionEndpoint()
+ {
+ return _connectionEndpoint;
+ }
+
+ public short getChannel()
+ {
+ return _channel;
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ SessionAttachment that = (SessionAttachment) o;
+
+ if (_channel != that._channel)
+ {
+ return false;
+ }
+ if (_connectionEndpoint != null
+ ? !_connectionEndpoint.equals(that._connectionEndpoint)
+ : that._connectionEndpoint != null)
+ {
+ return false;
+ }
+ if (_sessionEndpoint != null ? !_sessionEndpoint.equals(that._sessionEndpoint) : that._sessionEndpoint != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int result = _sessionEndpoint != null ? _sessionEndpoint.hashCode() : 0;
+ result = 31 * result + (_connectionEndpoint != null ? _connectionEndpoint.hashCode() : 0);
+ result = 31 * result + (int) _channel;
+ return result;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java
new file mode 100644
index 0000000000..4b8bf82a4a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEndpoint.java
@@ -0,0 +1,781 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.framing.OversizeFrameException;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusDurability;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusExpiryPolicy;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.TxnCapability;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+
+import java.nio.ByteBuffer;
+import java.util.*;
+
+public class SessionEndpoint
+{
+ private SessionState _state = SessionState.INACTIVE;
+
+ private final Map<String, LinkEndpoint> _linkMap = new HashMap<String, LinkEndpoint>();
+ private final Map<LinkEndpoint, UnsignedInteger> _localLinkEndpoints = new HashMap<LinkEndpoint, UnsignedInteger>();
+ private final Map<UnsignedInteger, LinkEndpoint> _remoteLinkEndpoints = new HashMap<UnsignedInteger, LinkEndpoint>();
+
+ private long _timeout;
+
+
+ private ConnectionEndpoint _connection;
+ private long _lastAttachedTime;
+
+ private short _receivingChannel;
+ private short _sendingChannel;
+
+ private LinkedHashMap<UnsignedInteger,Delivery> _outgoingUnsettled;
+ private LinkedHashMap<UnsignedInteger,Delivery> _incomingUnsettled;
+
+ // has to be a power of two
+ private static final int DEFAULT_SESSION_BUFFER_SIZE = 1 << 11;
+ private static final int BUFFER_SIZE_MASK = DEFAULT_SESSION_BUFFER_SIZE - 1;
+
+ private SequenceNumber _nextIncomingTransferId;
+ private SequenceNumber _nextOutgoingTransferId;
+
+ private int _nextOutgoingDeliveryId;
+
+ //private SequenceNumber _incomingLWM;
+ //private SequenceNumber _outgoingLWM;
+
+ private UnsignedInteger _outgoingSessionCredit;
+
+
+
+ private UnsignedInteger _initialOutgoingId;
+
+ private SessionEventListener _sessionEventListener = SessionEventListener.DEFAULT;
+
+ private int _availableIncomingCredit;
+ private int _availableOutgoingCredit;
+ private UnsignedInteger _lastSentIncomingLimit;
+
+ public SessionEndpoint(final ConnectionEndpoint connectionEndpoint)
+ {
+ this(connectionEndpoint, UnsignedInteger.valueOf(0));
+ }
+
+ public SessionEndpoint(final ConnectionEndpoint connectionEndpoint, Begin begin)
+ {
+ this(connectionEndpoint, UnsignedInteger.valueOf(0));
+ _state = SessionState.BEGIN_RECVD;
+ _nextIncomingTransferId = new SequenceNumber(begin.getNextOutgoingId().intValue());
+ }
+
+
+ public SessionEndpoint(final ConnectionEndpoint connectionEndpoint, UnsignedInteger nextOutgoingId)
+ {
+ _connection = connectionEndpoint;
+
+ _initialOutgoingId = nextOutgoingId;
+ _nextOutgoingTransferId = new SequenceNumber(nextOutgoingId.intValue());
+
+ _outgoingUnsettled = new LinkedHashMap<UnsignedInteger,Delivery>(DEFAULT_SESSION_BUFFER_SIZE);
+ _incomingUnsettled = new LinkedHashMap<UnsignedInteger, Delivery>(DEFAULT_SESSION_BUFFER_SIZE);
+ _availableIncomingCredit = DEFAULT_SESSION_BUFFER_SIZE;
+ _availableOutgoingCredit = DEFAULT_SESSION_BUFFER_SIZE;
+ }
+
+
+ public void setReceivingChannel(final short receivingChannel)
+ {
+ _receivingChannel = receivingChannel;
+ switch(_state)
+ {
+ case INACTIVE:
+ _state = SessionState.BEGIN_RECVD;
+ break;
+ case BEGIN_SENT:
+ _state = SessionState.ACTIVE;
+ break;
+ default:
+ // TODO error
+
+ }
+ }
+
+
+ public void setSendingChannel(final short sendingChannel)
+ {
+ _sendingChannel = sendingChannel;
+ switch(_state)
+ {
+ case INACTIVE:
+ _state = SessionState.BEGIN_SENT;
+ break;
+ case BEGIN_RECVD:
+ _state = SessionState.ACTIVE;
+ break;
+ default:
+ // TODO error
+
+ }
+ }
+
+ public SessionState getState()
+ {
+ return _state;
+ }
+
+ public void end()
+ {
+ end(null);
+ }
+
+ public void end(final End end)
+ {
+ synchronized(getLock())
+ {
+ switch(_state)
+ {
+ case END_SENT:
+ _state = SessionState.ENDED;
+ break;
+ case ACTIVE:
+ detachLinks();
+ _sessionEventListener.remoteEnd(end);
+ short sendChannel = getSendingChannel();
+ _connection.sendEnd(sendChannel, new End());
+ _state = end == null ? SessionState.END_SENT : SessionState.ENDED;
+ break;
+ default:
+ sendChannel = getSendingChannel();
+ End reply = new End();
+ Error error = new Error();
+ error.setCondition(AmqpError.ILLEGAL_STATE);
+ error.setDescription("END called on Session which has not been opened");
+ reply.setError(error);
+ _connection.sendEnd(sendChannel, reply);
+ break;
+
+
+ }
+ getLock().notifyAll();
+ }
+ }
+
+ private void detachLinks()
+ {
+ Collection<UnsignedInteger> handles = new ArrayList<UnsignedInteger>(_remoteLinkEndpoints.keySet());
+ for(UnsignedInteger handle : handles)
+ {
+ detach(handle, null);
+ }
+ }
+
+ public short getSendingChannel()
+ {
+ return _sendingChannel;
+ }
+
+
+ public void receiveAttach(final Attach attach)
+ {
+ if(_state == SessionState.ACTIVE)
+ {
+ UnsignedInteger handle = attach.getHandle();
+ if(_remoteLinkEndpoints.containsKey(handle))
+ {
+ // TODO - Error - handle busy?
+ }
+ else
+ {
+ LinkEndpoint endpoint = getLinkMap().get(attach.getName());
+ if(endpoint == null)
+ {
+ endpoint = attach.getRole() == Role.RECEIVER
+ ? new SendingLinkEndpoint(this, attach)
+ : new ReceivingLinkEndpoint(this, attach);
+
+ // TODO : fix below - distinguish between local and remote owned
+ endpoint.setSource(attach.getSource());
+ endpoint.setTarget(attach.getTarget());
+
+
+ }
+
+ if(attach.getRole() == Role.SENDER)
+ {
+ endpoint.setDeliveryCount(attach.getInitialDeliveryCount());
+ }
+
+ _remoteLinkEndpoints.put(handle, endpoint);
+
+ if(!_localLinkEndpoints.containsKey(endpoint))
+ {
+ UnsignedInteger localHandle = findNextAvailableHandle();
+ endpoint.setLocalHandle(localHandle);
+ _localLinkEndpoints.put(endpoint, localHandle);
+
+ _sessionEventListener.remoteLinkCreation(endpoint);
+
+
+ }
+ else
+ {
+ endpoint.receiveAttach(attach);
+ }
+ }
+ }
+ }
+
+ private void send(final FrameBody frameBody)
+ {
+ _connection.send(this.getSendingChannel(), frameBody);
+ }
+
+
+ private int send(final FrameBody frameBody, ByteBuffer payload)
+ {
+ return _connection.send(this.getSendingChannel(), frameBody, payload);
+ }
+
+ private UnsignedInteger findNextAvailableHandle()
+ {
+ int i = 0;
+ do
+ {
+ if(!_localLinkEndpoints.containsValue(UnsignedInteger.valueOf(i)))
+ {
+ return UnsignedInteger.valueOf(i);
+ }
+ } while(++i != 0);
+
+ // TODO
+ throw new RuntimeException();
+ }
+
+ public void receiveDetach(final Detach detach)
+ {
+ UnsignedInteger handle = detach.getHandle();
+ detach(handle, detach);
+ }
+
+ private void detach(UnsignedInteger handle, Detach detach)
+ {
+ if(_remoteLinkEndpoints.containsKey(handle))
+ {
+ LinkEndpoint endpoint = _remoteLinkEndpoints.remove(handle);
+
+ endpoint.remoteDetached(detach);
+
+ _localLinkEndpoints.remove(endpoint);
+
+
+ }
+ else
+ {
+ // TODO
+ }
+ }
+
+ public void receiveTransfer(final Transfer transfer)
+ {
+ synchronized(getLock())
+ {
+ _nextIncomingTransferId.incr();
+/*
+ _availableIncomingCredit--;
+*/
+
+ UnsignedInteger handle = transfer.getHandle();
+
+
+
+ LinkEndpoint endpoint = _remoteLinkEndpoints.get(handle);
+
+ if(endpoint == null)
+ {
+ //TODO - error unknown link
+ System.err.println("Unknown endpoint " + transfer);
+
+ }
+
+ Delivery delivery = _incomingUnsettled.get(transfer.getDeliveryId());
+ if(delivery == null)
+ {
+ delivery = new Delivery(transfer, endpoint);
+ _incomingUnsettled.put(transfer.getDeliveryId(),delivery);
+ if(delivery.isSettled() || Boolean.TRUE.equals(transfer.getAborted()))
+ {
+/*
+ _availableIncomingCredit++;
+*/
+ }
+ }
+ else
+ {
+ if(delivery.getDeliveryId().equals(transfer.getDeliveryId()))
+ {
+ delivery.addTransfer(transfer);
+ if(delivery.isSettled())
+ {
+/*
+ _availableIncomingCredit++;
+*/
+ }
+ else if(Boolean.TRUE.equals(transfer.getAborted()))
+ {
+/*
+ _availableIncomingCredit += delivery.getTransfers().size();
+*/
+ }
+ }
+ else
+ {
+ // TODO - error
+ System.err.println("Incorrect transfer id " + transfer);
+ }
+ }
+
+ if(endpoint != null)
+ {
+ endpoint.receiveTransfer(transfer, delivery);
+ }
+
+ if((delivery.isComplete() && delivery.isSettled() || Boolean.TRUE.equals(transfer.getAborted())))
+ {
+ _incomingUnsettled.remove(transfer.getDeliveryId());
+ }
+ }
+ }
+
+ public void receiveFlow(final Flow flow)
+ {
+
+ synchronized(getLock())
+ {
+ UnsignedInteger handle = flow.getHandle();
+ LinkEndpoint endpoint = handle == null ? null : _remoteLinkEndpoints.get(handle);
+
+ final UnsignedInteger nextOutgoingId = flow.getNextIncomingId() == null ? _initialOutgoingId : flow.getNextIncomingId();
+ int limit = (nextOutgoingId.intValue() + flow.getIncomingWindow().intValue());
+ _outgoingSessionCredit = UnsignedInteger.valueOf(limit - _nextOutgoingTransferId.intValue());
+
+ if(endpoint != null)
+ {
+ endpoint.receiveFlow( flow );
+ }
+ else
+ {
+ for(LinkEndpoint le : _remoteLinkEndpoints.values())
+ {
+ le.flowStateChanged();
+ }
+ }
+
+ getLock().notifyAll();
+ }
+
+
+ }
+
+ public void receiveDisposition(final Disposition disposition)
+ {
+ Role dispositionRole = disposition.getRole();
+
+ LinkedHashMap<UnsignedInteger, Delivery> unsettledTransfers;
+
+ if(dispositionRole == Role.RECEIVER)
+ {
+ unsettledTransfers = _outgoingUnsettled;
+ }
+ else
+ {
+ unsettledTransfers = _incomingUnsettled;
+
+ }
+
+ UnsignedInteger deliveryId = disposition.getFirst();
+ UnsignedInteger last = disposition.getLast();
+ if(last == null)
+ {
+ last = deliveryId;
+ }
+
+
+ while(deliveryId.compareTo(last)<=0)
+ {
+
+ Delivery delivery = unsettledTransfers.get(deliveryId);
+ if(delivery != null)
+ {
+ delivery.getLinkEndpoint().receiveDeliveryState(delivery,
+ disposition.getState(),
+ disposition.getSettled());
+ }
+ deliveryId = deliveryId.add(UnsignedInteger.ONE);
+ }
+ if(disposition.getSettled())
+ {
+ checkSendFlow();
+ }
+
+ }
+
+ private void checkSendFlow()
+ {
+ //TODO
+ }
+
+ public SendingLinkEndpoint createSendingLinkEndpoint(final String name, final String targetAddr, final String sourceAddr)
+ {
+ return createSendingLinkEndpoint(name, targetAddr, sourceAddr, null);
+ }
+
+ public SendingLinkEndpoint createSendingLinkEndpoint(final String name, final String targetAddr, final String sourceAddr, Map<Binary, Outcome> unsettled)
+ {
+ return createSendingLinkEndpoint(name, targetAddr, sourceAddr, false, unsettled);
+ }
+
+ public SendingLinkEndpoint createSendingLinkEndpoint(final String name, final String targetAddr,
+ final String sourceAddr, boolean durable,
+ Map<Binary, Outcome> unsettled)
+ {
+
+ Source source = new Source();
+ source.setAddress(sourceAddr);
+ Target target = new Target();
+ target.setAddress(targetAddr);
+ if(durable)
+ {
+ target.setDurable(TerminusDurability.UNSETTLED_STATE);
+ target.setExpiryPolicy(TerminusExpiryPolicy.NEVER);
+ }
+
+ return createSendingLinkEndpoint(name, source, target, unsettled);
+
+ }
+
+ public SendingLinkEndpoint createSendingLinkEndpoint(final String name, final Source source, final org.apache.qpid.amqp_1_0.type.Target target)
+ {
+ return createSendingLinkEndpoint(name, source, target, null);
+ }
+
+ public SendingLinkEndpoint createSendingLinkEndpoint(final String name, final Source source, final org.apache.qpid.amqp_1_0.type.Target target, Map<Binary, Outcome> unsettled)
+ {
+ SendingLinkEndpoint endpoint = new SendingLinkEndpoint(this, name, unsettled);
+ endpoint.setSource(source);
+ endpoint.setTarget(target);
+ UnsignedInteger handle = findNextAvailableHandle();
+ _localLinkEndpoints.put(endpoint, handle);
+ endpoint.setLocalHandle(handle);
+ getLinkMap().put(name, endpoint);
+
+ return endpoint;
+ }
+
+ public void sendAttach(Attach attach)
+ {
+ send(attach);
+ }
+
+ public void sendTransfer(final Transfer xfr, SendingLinkEndpoint endpoint, boolean newDelivery)
+ {
+ _nextOutgoingTransferId.incr();
+ UnsignedInteger deliveryId;
+ if(newDelivery)
+ {
+ deliveryId = UnsignedInteger.valueOf(_nextOutgoingDeliveryId++);
+ endpoint.setLastDeliveryId(deliveryId);
+ }
+ else
+ {
+ deliveryId = endpoint.getLastDeliveryId();
+ }
+ xfr.setDeliveryId(deliveryId);
+
+ if(!Boolean.TRUE.equals(xfr.getSettled()))
+ {
+ Delivery delivery;
+ if((delivery = _outgoingUnsettled.get(deliveryId))== null)
+ {
+ delivery = new Delivery(xfr, endpoint);
+ _outgoingUnsettled.put(deliveryId, delivery);
+
+ }
+ else
+ {
+ delivery.addTransfer(xfr);
+ }
+ _outgoingSessionCredit = _outgoingSessionCredit.subtract(UnsignedInteger.ONE);
+ endpoint.addUnsettled(delivery);
+
+ }
+
+ try
+ {
+ ByteBuffer payload = xfr.getPayload();
+ int payloadSent = send(xfr, payload);
+
+ if(payload != null && payloadSent < payload.remaining())
+ {
+ payload = payload.duplicate();
+try
+{
+ payload.position(payload.position()+payloadSent);
+}
+catch(IllegalArgumentException e)
+{
+ System.err.println("UNEXPECTED");
+ System.err.println("Payload Position: " + payload.position());
+ System.err.println("Payload Sent: " + payloadSent);
+ System.err.println("Payload Remaining: " + payload.remaining());
+ throw e;
+
+}
+
+ Transfer secondTransfer = new Transfer();
+
+ secondTransfer.setDeliveryTag(xfr.getDeliveryTag());
+ secondTransfer.setHandle(xfr.getHandle());
+ secondTransfer.setSettled(xfr.getSettled());
+ secondTransfer.setState(xfr.getState());
+ secondTransfer.setMessageFormat(xfr.getMessageFormat());
+ secondTransfer.setPayload(payload);
+
+ sendTransfer(secondTransfer, endpoint, false);
+
+ }
+ }
+ catch(OversizeFrameException e)
+ {
+ e.printStackTrace();
+ }
+
+ }
+
+ public Object getLock()
+ {
+ return _connection.getLock();
+ }
+
+ public ReceivingLinkEndpoint createReceivingLinkEndpoint(final String name,
+ String targetAddr,
+ String sourceAddr,
+ UnsignedInteger initialCredit,
+ final DistributionMode distributionMode)
+ {
+ Source source = new Source();
+ source.setAddress(sourceAddr);
+ source.setDistributionMode(distributionMode);
+ Target target = new Target();
+ target.setAddress(targetAddr);
+
+ return createReceivingLinkEndpoint(name, target, source, initialCredit);
+ }
+
+ public ReceivingLinkEndpoint createReceivingLinkEndpoint(final String name,
+ Target target,
+ Source source,
+ UnsignedInteger initialCredit)
+ {
+ ReceivingLinkEndpoint endpoint = new ReceivingLinkEndpoint(this, name);
+ endpoint.setLinkCredit(initialCredit);
+ endpoint.setSource(source);
+ endpoint.setTarget(target);
+ UnsignedInteger handle = findNextAvailableHandle();
+ _localLinkEndpoints.put(endpoint, handle);
+ endpoint.setLocalHandle(handle);
+ getLinkMap().put(name, endpoint);
+
+ return endpoint;
+
+ }
+
+ public void updateDisposition(final Role role,
+ final UnsignedInteger first,
+ final UnsignedInteger last,
+ final DeliveryState state,
+ final boolean settled)
+ {
+
+
+ Disposition disposition = new Disposition();
+ disposition.setRole(role);
+ disposition.setFirst(first);
+ disposition.setLast(last);
+ disposition.setSettled(settled);
+
+ disposition.setState(state);
+
+
+ if(settled)
+ {
+ if(role == Role.RECEIVER)
+ {
+ SequenceNumber pos = new SequenceNumber(first.intValue());
+ SequenceNumber end = new SequenceNumber(last.intValue());
+ while(pos.compareTo(end)<=0)
+ {
+ Delivery d = _incomingUnsettled.remove(new UnsignedInteger(pos.intValue()));
+
+/*
+ _availableIncomingCredit += d.getTransfers().size();
+*/
+
+ pos.incr();
+ }
+ }
+ }
+
+ send(disposition);
+ checkSendFlow();
+ }
+
+ public void settle(Role role, final UnsignedInteger deliveryId)
+ {
+ if(role == Role.RECEIVER)
+ {
+ Delivery d = _incomingUnsettled.remove(deliveryId);
+ if(d != null)
+ {
+/*
+ _availableIncomingCredit += d.getTransfers().size();
+*/
+ }
+ }
+ else
+ {
+ Delivery d = _outgoingUnsettled.remove(deliveryId);
+/* if(d != null)
+ {
+ _availableOutgoingCredit += d.getTransfers().size();
+
+ }*/
+ }
+
+ }
+
+ public void sendFlow()
+ {
+ sendFlow(new Flow());
+ }
+ public void sendFlow(final Flow flow)
+ {
+ final int nextIncomingId = _nextIncomingTransferId.intValue();
+ flow.setNextIncomingId(UnsignedInteger.valueOf(nextIncomingId));
+ flow.setIncomingWindow(UnsignedInteger.valueOf(_availableIncomingCredit));
+ _lastSentIncomingLimit = UnsignedInteger.valueOf(nextIncomingId + _availableIncomingCredit);
+
+ flow.setNextOutgoingId(UnsignedInteger.valueOf(_nextOutgoingTransferId.intValue()));
+ flow.setOutgoingWindow(UnsignedInteger.valueOf(_availableOutgoingCredit));
+ send(flow);
+ }
+
+ public void sendFlowConditional()
+ {
+ UnsignedInteger clientsCredit = _lastSentIncomingLimit.subtract(UnsignedInteger.valueOf(_nextIncomingTransferId.intValue()));
+ int i = UnsignedInteger.valueOf(_availableIncomingCredit).subtract(clientsCredit).compareTo(clientsCredit);
+ if(i >=0)
+ {
+ sendFlow();
+ }
+
+ }
+
+ public void sendDetach(Detach detach)
+ {
+ send(detach);
+
+ }
+
+ void doEnd(End end)
+ {
+ }
+
+ public void setNextIncomingId(final UnsignedInteger nextIncomingId)
+ {
+ _nextIncomingTransferId = new SequenceNumber(nextIncomingId.intValue());
+
+ }
+
+ public void setOutgoingSessionCredit(final UnsignedInteger outgoingSessionCredit)
+ {
+ _outgoingSessionCredit = outgoingSessionCredit;
+ }
+
+ public UnsignedInteger getNextOutgoingId()
+ {
+ return UnsignedInteger.valueOf(_nextOutgoingTransferId.intValue());
+ }
+
+ public UnsignedInteger getOutgoingWindowSize()
+ {
+ return UnsignedInteger.valueOf(_availableOutgoingCredit);
+ }
+
+ public boolean hasCreditToSend()
+ {
+ boolean b = _outgoingSessionCredit != null && _outgoingSessionCredit.intValue() > 0;
+ boolean b1 = getOutgoingWindowSize() != null && getOutgoingWindowSize().compareTo(UnsignedInteger.ZERO) > 0;
+ return b && b1;
+ }
+
+ public UnsignedInteger getIncomingWindowSize()
+ {
+ return UnsignedInteger.valueOf(_availableIncomingCredit);
+ }
+
+ public SessionEventListener getSessionEventListener()
+ {
+ return _sessionEventListener;
+ }
+
+ public void setSessionEventListener(final SessionEventListener sessionEventListener)
+ {
+ _sessionEventListener = sessionEventListener;
+ }
+
+ public ConnectionEndpoint getConnection()
+ {
+ return _connection;
+ }
+
+ public SendingLinkEndpoint createTransactionController(String name, TxnCapability... capabilities)
+ {
+ Coordinator coordinator = new Coordinator();
+ coordinator.setCapabilities(capabilities);
+
+ Source src = new Source();
+
+ return createSendingLinkEndpoint(name, src, coordinator);
+ }
+
+ Map<String, LinkEndpoint> getLinkMap()
+ {
+ return _linkMap;
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEventListener.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEventListener.java
new file mode 100644
index 0000000000..81d51b5908
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionEventListener.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.End;
+
+public interface SessionEventListener
+{
+ class DefaultSessionEventListener implements SessionEventListener
+ {
+ public void remoteLinkCreation(final LinkEndpoint endpoint)
+ {
+ endpoint.attach();
+ endpoint.detach();
+ }
+
+ public void remoteEnd(End end)
+ {
+
+ }
+
+ }
+
+ public static final SessionEventListener DEFAULT = new DefaultSessionEventListener();
+
+ void remoteLinkCreation(LinkEndpoint endpoint);
+
+ void remoteEnd(End end);
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionHalfEndpoint.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionHalfEndpoint.java
new file mode 100644
index 0000000000..fce1ce021f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionHalfEndpoint.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public class SessionHalfEndpoint
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionState.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionState.java
new file mode 100644
index 0000000000..b09e27d980
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/SessionState.java
@@ -0,0 +1,34 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public enum SessionState
+{
+ ACTIVE,
+ INACTIVE,
+ BEGIN_SENT,
+ BEGIN_RECVD,
+ END_SENT,
+ END_RECVD,
+ ENDED;
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/StateChangeListener.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/StateChangeListener.java
new file mode 100644
index 0000000000..a02e110d8b
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/StateChangeListener.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.transport;
+
+public interface StateChangeListener
+{
+ void onStateChange(boolean active);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/UnsettledTransfer.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/UnsettledTransfer.java
new file mode 100644
index 0000000000..7a39fd9a54
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/transport/UnsettledTransfer.java
@@ -0,0 +1,53 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.transport;
+
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+public class UnsettledTransfer
+{
+ private final Transfer _transfer;
+ private final LinkEndpoint _linkEndpoint;
+
+ public UnsettledTransfer(final Transfer transfer, final LinkEndpoint linkEndpoint)
+ {
+ _transfer = transfer;
+ _linkEndpoint = linkEndpoint;
+ }
+
+ public Transfer getTransfer()
+ {
+ return _transfer;
+ }
+
+ public LinkEndpoint getLinkEndpoint()
+ {
+ return _linkEndpoint;
+ }
+
+ @Override public String toString()
+ {
+ return "UnsettledTransfer{" +
+ "_transfer=" + _transfer +
+ ", _linkEndpoint=" + _linkEndpoint +
+ '}';
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/AmqpErrorException.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/AmqpErrorException.java
new file mode 100644
index 0000000000..74ae7de470
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/AmqpErrorException.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+import java.util.Formatter;
+
+public class AmqpErrorException extends Exception
+{
+ private final Error _error;
+
+
+ public AmqpErrorException(final Error error)
+ {
+ _error = error;
+ }
+
+ public AmqpErrorException(ErrorCondition condition)
+ {
+ _error = new Error();
+ _error.setCondition(condition);
+ }
+
+ public AmqpErrorException(ErrorCondition condition, String format, Object... args)
+ {
+ _error = new Error();
+ _error.setCondition(condition);
+ _error.setDescription((new Formatter()).format(format, args).toString());
+ }
+
+ public Error getError()
+ {
+ return _error;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java
new file mode 100644
index 0000000000..0c8dc3444a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Binary.java
@@ -0,0 +1,161 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+
+import static java.lang.Math.min;
+
+public class Binary
+{
+
+ private final byte[] _data;
+ private final int _offset;
+ private final int _length;
+ private final int _hashCode;
+
+ public Binary(final byte[] data)
+ {
+ this(data, 0, data.length);
+ }
+
+ public Binary(final byte[] data, final int offset, final int length)
+ {
+
+ _data = data;
+ _offset = offset;
+ _length = length;
+ int hc = 0;
+ for (int i = 0; i < length; i++)
+ {
+ hc = 31*hc + (0xFF & data[offset + i]);
+ }
+ _hashCode = hc;
+ }
+
+ public ByteBuffer asByteBuffer()
+ {
+ return ByteBuffer.wrap(_data, _offset, _length);
+ }
+
+ public final int hashCode()
+ {
+ return _hashCode;
+ }
+
+ public final boolean equals(Object o)
+ {
+ Binary buf = (Binary) o;
+ if(o == null)
+ {
+ return false;
+ }
+ final int size = _length;
+ if (size != buf._length)
+ {
+ return false;
+ }
+
+ final byte[] myData = _data;
+ final byte[] theirData = buf._data;
+ int myOffset = _offset;
+ int theirOffset = buf._offset;
+ final int myLimit = myOffset + size;
+
+ while(myOffset < myLimit)
+ {
+ if (myData[myOffset++] != theirData[theirOffset++])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+
+ public int getArrayOffset()
+ {
+ return _offset;
+ }
+
+ public byte[] getArray()
+ {
+ return _data;
+ }
+
+ public int getLength()
+ {
+ return _length;
+ }
+
+ public String toString()
+ {
+ StringBuilder str = new StringBuilder();
+
+
+ for (int i = _offset; i < _length; i++)
+ {
+ byte c = _data[i];
+
+ if (c > 31 && c < 127 && c != '\\')
+ {
+ str.append((char)c);
+ }
+ else
+ {
+ str.append(String.format("\\x%02x", c));
+ }
+ }
+
+ return str.toString();
+
+ }
+
+ public static Binary combine(final Collection<Binary> binaries)
+ {
+
+ if(binaries.size() == 1)
+ {
+ return binaries.iterator().next();
+ }
+
+ int size = 0;
+ for(Binary binary : binaries)
+ {
+ size += binary.getLength();
+ }
+ byte[] data = new byte[size];
+ int offset = 0;
+ for(Binary binary : binaries)
+ {
+ System.arraycopy(binary._data, binary._offset, data, offset, binary._length);
+ offset += binary._length;
+ }
+ return new Binary(data);
+ }
+
+ public Binary subBinary(final int offset, final int length)
+ {
+ return new Binary(_data, _offset+offset, length);
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DeliveryState.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DeliveryState.java
new file mode 100644
index 0000000000..a16cc46729
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DeliveryState.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface DeliveryState
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DistributionMode.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DistributionMode.java
new file mode 100644
index 0000000000..751bdd1406
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/DistributionMode.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface DistributionMode
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/ErrorCondition.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/ErrorCondition.java
new file mode 100644
index 0000000000..a9f8115784
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/ErrorCondition.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+public interface ErrorCondition
+{
+ public Symbol getValue();
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/FrameBody.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/FrameBody.java
new file mode 100644
index 0000000000..0312378019
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/FrameBody.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+public interface FrameBody
+{
+ public void invoke(short channel, ConnectionEndpoint conn);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/GlobalTxId.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/GlobalTxId.java
new file mode 100644
index 0000000000..f17a8648c6
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/GlobalTxId.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public class GlobalTxId
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/LifetimePolicy.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/LifetimePolicy.java
new file mode 100644
index 0000000000..af13cdaffe
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/LifetimePolicy.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface LifetimePolicy
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Outcome.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Outcome.java
new file mode 100644
index 0000000000..0741ebdf70
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Outcome.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface Outcome
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/RestrictedType.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/RestrictedType.java
new file mode 100644
index 0000000000..9bcfc752a1
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/RestrictedType.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+public interface RestrictedType<V>
+{
+ V getValue();
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/SaslFrameBody.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/SaslFrameBody.java
new file mode 100644
index 0000000000..cb4332f020
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/SaslFrameBody.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+
+public interface SaslFrameBody
+{
+ public void invoke(SASLEndpoint conn);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Section.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Section.java
new file mode 100644
index 0000000000..1e2872b66a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Section.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+public interface Section
+{
+
+ Binary encode(SectionEncoder encoder);
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Source.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Source.java
new file mode 100644
index 0000000000..c033ed4d55
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Source.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface Source
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Symbol.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Symbol.java
new file mode 100644
index 0000000000..6efcdcf952
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Symbol.java
@@ -0,0 +1,90 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public final class Symbol implements Comparable<Symbol>, CharSequence
+{
+ private final String _underlying;
+ private static final ConcurrentHashMap<String, Symbol> _symbols = new ConcurrentHashMap<String, Symbol>(2048);
+
+ private Symbol(String underlying)
+ {
+ _underlying = underlying;
+ }
+
+ public int length()
+ {
+ return _underlying.length();
+ }
+
+ public int compareTo(Symbol o)
+ {
+ return _underlying.compareTo(o._underlying);
+ }
+
+ public char charAt(int index)
+ {
+ return _underlying.charAt(index);
+ }
+
+ public CharSequence subSequence(int beginIndex, int endIndex)
+ {
+ return _underlying.subSequence(beginIndex, endIndex);
+ }
+
+ @Override
+ public String toString()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _underlying.hashCode();
+ }
+
+ public static Symbol valueOf(String symbolVal)
+ {
+ return getSymbol(symbolVal);
+ }
+
+ public static Symbol getSymbol(String symbolVal)
+ {
+ Symbol symbol = _symbols.get(symbolVal);
+ if(symbol == null)
+ {
+ symbolVal = symbolVal.intern();
+ symbol = new Symbol(symbolVal);
+ Symbol existing;
+ if((existing = _symbols.putIfAbsent(symbolVal, symbol)) != null)
+ {
+ symbol = existing;
+ }
+ }
+ return symbol;
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Target.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Target.java
new file mode 100644
index 0000000000..345f6c418f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/Target.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface Target
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnCapability.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnCapability.java
new file mode 100644
index 0000000000..3d7d2137a6
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnCapability.java
@@ -0,0 +1,26 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface TxnCapability
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnId.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnId.java
new file mode 100644
index 0000000000..eef6b3a32f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/TxnId.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.amqp_1_0.type;
+
+public interface TxnId
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedByte.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedByte.java
new file mode 100644
index 0000000000..07739e068e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedByte.java
@@ -0,0 +1,134 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+public final class UnsignedByte extends Number implements Comparable<UnsignedByte>
+{
+ private final byte _underlying;
+ private static final UnsignedByte[] cachedValues = new UnsignedByte[256];
+
+ static
+ {
+ for(int i = 0; i<256; i++)
+ {
+ cachedValues[i] = new UnsignedByte((byte)i);
+ }
+ }
+
+ public UnsignedByte(byte underlying)
+ {
+ _underlying = underlying;
+ }
+
+ @Override
+ public byte byteValue()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public short shortValue()
+ {
+ return (short) intValue();
+ }
+
+ @Override
+ public int intValue()
+ {
+ return ((int)_underlying) & 0xFF;
+ }
+
+ @Override
+ public long longValue()
+ {
+ return ((long) _underlying) & 0xFFl;
+ }
+
+ @Override
+ public float floatValue()
+ {
+ return (float) longValue();
+ }
+
+ @Override
+ public double doubleValue()
+ {
+ return (double) longValue();
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ UnsignedByte that = (UnsignedByte) o;
+
+ if (_underlying != that._underlying)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int compareTo(UnsignedByte o)
+ {
+ return Integer.signum(intValue() - o.intValue());
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf(intValue());
+ }
+
+ public static UnsignedByte valueOf(byte underlying)
+ {
+ final int index = ((int) underlying) & 0xFF;
+ return cachedValues[index];
+ }
+
+ public static UnsignedByte valueOf(final String value)
+ throws NumberFormatException
+ {
+ int intVal = Integer.parseInt(value);
+ if(intVal < 0 || intVal >= (1<<8))
+ {
+ throw new NumberFormatException("Value \""+value+"\" lies outside the range [" + 0 + "-" + (1<<8) +").");
+ }
+ return valueOf((byte)intVal);
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedInteger.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedInteger.java
new file mode 100644
index 0000000000..f9a8f96868
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedInteger.java
@@ -0,0 +1,149 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+public final class UnsignedInteger extends Number implements Comparable<UnsignedInteger>
+{
+ private final int _underlying;
+ private static final UnsignedInteger[] cachedValues = new UnsignedInteger[256];
+
+ static
+ {
+ for(int i = 0; i < 256; i++)
+ {
+ cachedValues[i] = new UnsignedInteger(i);
+ }
+ }
+
+ public static final UnsignedInteger ZERO = cachedValues[0];
+ public static final UnsignedInteger ONE = cachedValues[1];
+ public static final UnsignedInteger MAX_VALUE = new UnsignedInteger(0xffffffff);
+
+
+ public UnsignedInteger(int underlying)
+ {
+ _underlying = underlying;
+ }
+
+ @Override
+ public int intValue()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public long longValue()
+ {
+ return ((long) _underlying) & 0xFFFFFFFFl;
+ }
+
+ @Override
+ public float floatValue()
+ {
+ return (float) longValue();
+ }
+
+ @Override
+ public double doubleValue()
+ {
+ return (double) longValue();
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ UnsignedInteger that = (UnsignedInteger) o;
+
+ if (_underlying != that._underlying)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int compareTo(UnsignedInteger o)
+ {
+ return Long.signum(longValue() - o.longValue());
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf(longValue());
+ }
+
+ public static UnsignedInteger valueOf(int underlying)
+ {
+ if((underlying & 0xFFFFFF00) == 0)
+ {
+ return cachedValues[underlying];
+ }
+ else
+ {
+ return new UnsignedInteger(underlying);
+ }
+ }
+
+ public UnsignedInteger add(final UnsignedInteger i)
+ {
+ int val = _underlying + i._underlying;
+ return UnsignedInteger.valueOf(val);
+ }
+
+ public UnsignedInteger subtract(final UnsignedInteger i)
+ {
+ int val = _underlying - i._underlying;
+ return UnsignedInteger.valueOf(val);
+ }
+
+ public static UnsignedInteger valueOf(final String value)
+ {
+ long longVal = Long.parseLong(value);
+ return valueOf(longVal);
+ }
+
+ public static UnsignedInteger valueOf(final long longVal)
+ {
+ if(longVal < 0L || longVal >= (1L<<32))
+ {
+ throw new NumberFormatException("Value \""+longVal+"\" lies outside the range [" + 0L + "-" + (1L<<32) +").");
+ }
+ return valueOf((int)longVal);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedLong.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedLong.java
new file mode 100644
index 0000000000..0586423fe0
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedLong.java
@@ -0,0 +1,162 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+import java.math.BigInteger;
+
+public final class UnsignedLong extends Number implements Comparable<UnsignedLong>
+{
+ private static final BigInteger TWO_TO_THE_SIXTY_FOUR = new BigInteger( new byte[] { (byte) 1, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0 });
+ private static final BigInteger LONG_MAX_VALUE = BigInteger.valueOf(Long.MAX_VALUE);
+
+ private static final UnsignedLong[] cachedValues = new UnsignedLong[256];
+
+ static
+ {
+ for(int i = 0; i<256; i++)
+ {
+ cachedValues[i] = new UnsignedLong(i);
+ }
+ }
+
+ public static final UnsignedLong ZERO = cachedValues[0];
+ public static final UnsignedLong ONE = cachedValues[1];
+
+ private final long _underlying;
+
+
+
+ public UnsignedLong(long underlying)
+ {
+ _underlying = underlying;
+ }
+
+ @Override
+ public int intValue()
+ {
+ return (int) _underlying;
+ }
+
+ @Override
+ public long longValue()
+ {
+ return _underlying;
+ }
+
+ public BigInteger bigIntegerValue()
+ {
+ if(_underlying >= 0L)
+ {
+ return BigInteger.valueOf(_underlying);
+ }
+ else
+ {
+ return TWO_TO_THE_SIXTY_FOUR.add(BigInteger.valueOf(_underlying));
+ }
+ }
+
+ @Override
+ public float floatValue()
+ {
+ return (float) longValue();
+ }
+
+ @Override
+ public double doubleValue()
+ {
+ return (double) longValue();
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ UnsignedLong that = (UnsignedLong) o;
+
+ if (_underlying != that._underlying)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int compareTo(UnsignedLong o)
+ {
+ return bigIntegerValue().compareTo(o.bigIntegerValue());
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return (int)(_underlying ^ (_underlying >>> 32));
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf(bigIntegerValue());
+ }
+
+ public static UnsignedLong valueOf(long underlying)
+ {
+ if((underlying & 0xFFL) == underlying)
+ {
+ return cachedValues[(int)underlying];
+ }
+ else
+ {
+ return new UnsignedLong(underlying);
+ }
+ }
+
+ public static UnsignedLong valueOf(final String value)
+ {
+ BigInteger bigInt = new BigInteger(value);
+ if(bigInt.signum() == -1 || bigInt.bitCount()>64)
+ {
+ throw new NumberFormatException("Value \""+value+"\" lies outside the range [" + 0L + "- 2^64).");
+ }
+ else if(bigInt.compareTo(LONG_MAX_VALUE)>=0)
+ {
+ return UnsignedLong.valueOf(bigInt.longValue());
+ }
+ else
+ {
+ return UnsignedLong.valueOf(TWO_TO_THE_SIXTY_FOUR.subtract(bigInt).negate().longValue());
+ }
+
+ }
+
+ public UnsignedLong add(UnsignedLong unsignedLong)
+ {
+ return UnsignedLong.valueOf(_underlying + unsignedLong._underlying);
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedShort.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedShort.java
new file mode 100644
index 0000000000..01c72ac159
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/UnsignedShort.java
@@ -0,0 +1,132 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.amqp_1_0.type;
+
+public final class UnsignedShort extends Number implements Comparable<UnsignedShort>
+{
+ private final short _underlying;
+ private static final UnsignedShort[] cachedValues = new UnsignedShort[256];
+
+ static
+ {
+ for(short i = 0; i < 256; i++)
+ {
+ cachedValues[i] = new UnsignedShort(i);
+ }
+ }
+
+ public UnsignedShort(short underlying)
+ {
+ _underlying = underlying;
+ }
+
+ public short shortValue()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public int intValue()
+ {
+ return _underlying & 0xFFFF;
+ }
+
+ @Override
+ public long longValue()
+ {
+ return ((long) _underlying) & 0xFFFFl;
+ }
+
+ @Override
+ public float floatValue()
+ {
+ return (float) intValue();
+ }
+
+ @Override
+ public double doubleValue()
+ {
+ return (double) intValue();
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ UnsignedShort that = (UnsignedShort) o;
+
+ if (_underlying != that._underlying)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int compareTo(UnsignedShort o)
+ {
+ return Integer.signum(intValue() - o.intValue());
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _underlying;
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.valueOf(longValue());
+ }
+
+ public static UnsignedShort valueOf(short underlying)
+ {
+ if((underlying & 0xFF00) == 0)
+ {
+ return cachedValues[underlying];
+ }
+ else
+ {
+ return new UnsignedShort(underlying);
+ }
+ }
+
+ public static UnsignedShort valueOf(final String value)
+ {
+ int intVal = Integer.parseInt(value);
+ if(intVal < 0 || intVal >= (1<<16))
+ {
+ throw new NumberFormatException("Value \""+value+"\" lies outside the range [" + 0 + "-" + (1<<16) +").");
+ }
+ return valueOf((short)intVal);
+
+ }
+} \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/WrapperType.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/WrapperType.java
new file mode 100644
index 0000000000..359926d9d4
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/WrapperType.java
@@ -0,0 +1,27 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+package org.apache.qpid.amqp_1_0.type;
+
+public interface WrapperType
+{
+ Object getValue();
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java
new file mode 100644
index 0000000000..5ffa96e094
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/codec/AMQPDescribedTypeRegistry.java
@@ -0,0 +1,389 @@
+
+
+package org.apache.qpid.amqp_1_0.type.codec;
+
+import org.apache.qpid.amqp_1_0.codec.BinaryWriter;
+import org.apache.qpid.amqp_1_0.codec.BooleanWriter;
+import org.apache.qpid.amqp_1_0.codec.ByteWriter;
+import org.apache.qpid.amqp_1_0.codec.CharWriter;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.codec.DoubleWriter;
+import org.apache.qpid.amqp_1_0.codec.FloatWriter;
+import org.apache.qpid.amqp_1_0.codec.IntegerWriter;
+import org.apache.qpid.amqp_1_0.codec.ListWriter;
+import org.apache.qpid.amqp_1_0.codec.LongWriter;
+import org.apache.qpid.amqp_1_0.codec.MapWriter;
+import org.apache.qpid.amqp_1_0.codec.NullWriter;
+import org.apache.qpid.amqp_1_0.codec.RestrictedTypeValueWriter;
+import org.apache.qpid.amqp_1_0.codec.ShortWriter;
+import org.apache.qpid.amqp_1_0.codec.StringWriter;
+import org.apache.qpid.amqp_1_0.codec.SymbolWriter;
+import org.apache.qpid.amqp_1_0.codec.SymbolArrayWriter;
+import org.apache.qpid.amqp_1_0.codec.TimestampWriter;
+import org.apache.qpid.amqp_1_0.codec.TypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.UUIDWriter;
+import org.apache.qpid.amqp_1_0.codec.UnsignedByteWriter;
+import org.apache.qpid.amqp_1_0.codec.UnsignedIntegerWriter;
+import org.apache.qpid.amqp_1_0.codec.UnsignedLongWriter;
+import org.apache.qpid.amqp_1_0.codec.UnsignedShortWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+
+import org.apache.qpid.amqp_1_0.type.RestrictedType;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.codec.*;
+
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.codec.*;
+
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.codec.*;
+
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.codec.*;
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class AMQPDescribedTypeRegistry implements DescribedTypeConstructorRegistry, ValueWriter.Registry
+{
+
+ private final Map<Object, DescribedTypeConstructor> _constructorRegistry = new HashMap<Object, DescribedTypeConstructor>();
+
+ public void register(Object descriptor, DescribedTypeConstructor constructor)
+ {
+ _constructorRegistry.put(descriptor, constructor);
+ }
+
+ public void register(Object descriptor, DescribedTypeConstructor constructor, TypeConstructor describedConstructor)
+ {
+ _constructorRegistry.put(descriptor, constructor);
+ }
+
+ public DescribedTypeConstructor getConstructor(Object descriptor)
+ {
+ return _constructorRegistry.get(descriptor);
+ }
+
+ private AMQPDescribedTypeRegistry()
+ {
+ }
+
+ public AMQPDescribedTypeRegistry registerTransportLayer()
+ {
+ registerTransportConstructors(this);
+ registerTransportWriters(this);
+ return this;
+ }
+
+ public AMQPDescribedTypeRegistry registerMessagingLayer()
+ {
+ registerMessagingConstructors(this);
+ registerMessagingWriters(this);
+ return this;
+ }
+
+ public AMQPDescribedTypeRegistry registerTransactionLayer()
+ {
+ registerTransactionsConstructors(this);
+ registerTransactionsWriters(this);
+ return this;
+ }
+
+ public AMQPDescribedTypeRegistry registerSecurityLayer()
+ {
+ registerSecurityConstructors(this);
+ registerSecurityWriters(this);
+ return this;
+ }
+
+ public static AMQPDescribedTypeRegistry newInstance()
+ {
+ AMQPDescribedTypeRegistry registry = new AMQPDescribedTypeRegistry();
+
+ NullWriter.register(registry);
+ BooleanWriter.register(registry);
+ ByteWriter.register(registry);
+ UnsignedByteWriter.register(registry);
+ ShortWriter.register(registry);
+ UnsignedShortWriter.register(registry);
+ IntegerWriter.register(registry);
+ UnsignedIntegerWriter.register(registry);
+ CharWriter.register(registry);
+ FloatWriter.register(registry);
+ LongWriter.register(registry);
+ UnsignedLongWriter.register(registry);
+ DoubleWriter.register(registry);
+ TimestampWriter.register(registry);
+ UUIDWriter.register(registry);
+ StringWriter.register(registry);
+ SymbolWriter.register(registry);
+ BinaryWriter.register(registry);
+ ListWriter.register(registry);
+ MapWriter.register(registry);
+
+ SymbolArrayWriter.register(registry);
+
+ return registry;
+ }
+
+
+
+ private static void registerTransportWriters(final AMQPDescribedTypeRegistry registry)
+ {
+
+ OpenWriter.register(registry);
+ BeginWriter.register(registry);
+ AttachWriter.register(registry);
+ FlowWriter.register(registry);
+ TransferWriter.register(registry);
+ DispositionWriter.register(registry);
+ DetachWriter.register(registry);
+ EndWriter.register(registry);
+ CloseWriter.register(registry);
+ RestrictedTypeValueWriter.register(registry,Role.class);
+ RestrictedTypeValueWriter.register(registry,SenderSettleMode.class);
+ RestrictedTypeValueWriter.register(registry,ReceiverSettleMode.class);
+ ErrorWriter.register(registry);
+ RestrictedTypeValueWriter.register(registry,AmqpError.class);
+ RestrictedTypeValueWriter.register(registry,ConnectionError.class);
+ RestrictedTypeValueWriter.register(registry,SessionError.class);
+ RestrictedTypeValueWriter.register(registry,LinkError.class);
+ }
+
+ private static void registerMessagingWriters(final AMQPDescribedTypeRegistry registry)
+ {
+
+ HeaderWriter.register(registry);
+ DeliveryAnnotationsWriter.register(registry);
+ MessageAnnotationsWriter.register(registry);
+ PropertiesWriter.register(registry);
+ ApplicationPropertiesWriter.register(registry);
+ DataWriter.register(registry);
+ AmqpSequenceWriter.register(registry);
+ AmqpValueWriter.register(registry);
+ FooterWriter.register(registry);
+ ReceivedWriter.register(registry);
+ AcceptedWriter.register(registry);
+ RejectedWriter.register(registry);
+ ReleasedWriter.register(registry);
+ ModifiedWriter.register(registry);
+ SourceWriter.register(registry);
+ TargetWriter.register(registry);
+ RestrictedTypeValueWriter.register(registry,TerminusDurability.class);
+ RestrictedTypeValueWriter.register(registry,TerminusExpiryPolicy.class);
+ RestrictedTypeValueWriter.register(registry,StdDistMode.class);
+ DeleteOnCloseWriter.register(registry);
+ DeleteOnNoLinksWriter.register(registry);
+ DeleteOnNoMessagesWriter.register(registry);
+ DeleteOnNoLinksOrMessagesWriter.register(registry);
+
+
+ ExactSubjectFilterWriter.register(registry);
+ MatchingSubjectFilterWriter.register(registry);
+ JMSSelectorFilterWriter.register(registry);
+ NoLocalFilterWriter.register(registry);
+ }
+
+ private static void registerTransactionsWriters(final AMQPDescribedTypeRegistry registry)
+ {
+
+ CoordinatorWriter.register(registry);
+ DeclareWriter.register(registry);
+ DischargeWriter.register(registry);
+ DeclaredWriter.register(registry);
+ TransactionalStateWriter.register(registry);
+ RestrictedTypeValueWriter.register(registry,TxnCapability.class);
+ RestrictedTypeValueWriter.register(registry,TransactionErrors.class);
+ }
+
+ private static void registerSecurityWriters(final AMQPDescribedTypeRegistry registry)
+ {
+
+ SaslMechanismsWriter.register(registry);
+ SaslInitWriter.register(registry);
+ SaslChallengeWriter.register(registry);
+ SaslResponseWriter.register(registry);
+ SaslOutcomeWriter.register(registry);
+ RestrictedTypeValueWriter.register(registry,SaslCode.class);
+ }
+
+ private static void registerTransportConstructors(final AMQPDescribedTypeRegistry registry)
+ {
+
+ OpenConstructor.register(registry);
+ BeginConstructor.register(registry);
+ AttachConstructor.register(registry);
+ FlowConstructor.register(registry);
+ TransferConstructor.register(registry);
+ DispositionConstructor.register(registry);
+ DetachConstructor.register(registry);
+ EndConstructor.register(registry);
+ CloseConstructor.register(registry);
+ ErrorConstructor.register(registry);
+ }
+
+ private static void registerMessagingConstructors(final AMQPDescribedTypeRegistry registry)
+ {
+
+ HeaderConstructor.register(registry);
+ DeliveryAnnotationsConstructor.register(registry);
+ MessageAnnotationsConstructor.register(registry);
+ PropertiesConstructor.register(registry);
+ ApplicationPropertiesConstructor.register(registry);
+ DataConstructor.register(registry);
+ AmqpSequenceConstructor.register(registry);
+ AmqpValueConstructor.register(registry);
+ FooterConstructor.register(registry);
+ ReceivedConstructor.register(registry);
+ AcceptedConstructor.register(registry);
+ RejectedConstructor.register(registry);
+ ReleasedConstructor.register(registry);
+ ModifiedConstructor.register(registry);
+ SourceConstructor.register(registry);
+ TargetConstructor.register(registry);
+ DeleteOnCloseConstructor.register(registry);
+ DeleteOnNoLinksConstructor.register(registry);
+ DeleteOnNoMessagesConstructor.register(registry);
+ DeleteOnNoLinksOrMessagesConstructor.register(registry);
+
+ ExactSubjectFilterConstructor.register(registry);
+ MatchingSubjectFilterConstructor.register(registry);
+ JMSSelectorFilterConstructor.register(registry);
+ NoLocalFilterConstructor.register(registry);
+ }
+
+ private static void registerTransactionsConstructors(final AMQPDescribedTypeRegistry registry)
+ {
+
+ CoordinatorConstructor.register(registry);
+ DeclareConstructor.register(registry);
+ DischargeConstructor.register(registry);
+ DeclaredConstructor.register(registry);
+ TransactionalStateConstructor.register(registry);
+ }
+
+ private static void registerSecurityConstructors(final AMQPDescribedTypeRegistry registry)
+ {
+
+ SaslMechanismsConstructor.register(registry);
+ SaslInitConstructor.register(registry);
+ SaslChallengeConstructor.register(registry);
+ SaslResponseConstructor.register(registry);
+ SaslOutcomeConstructor.register(registry);
+ }
+
+
+ private final Map<Class, ValueWriter.Factory> _writerMap = new HashMap<Class, ValueWriter.Factory>();
+ private final Map<Class, ValueWriter> _cachedWriters = new HashMap<Class,ValueWriter>();
+
+ public <V extends Object> ValueWriter<V> getValueWriter(V value, Map<Class, ValueWriter> localCache)
+ {
+ Class<? extends Object> clazz = value == null ? Void.TYPE : value.getClass();
+ ValueWriter writer = null; // TODO localCache.get(clazz);
+ if(writer == null || !writer.isComplete())
+ {
+ writer = getValueWriter(value);
+ localCache.put(clazz, writer);
+ }
+ else
+ {
+ writer.setValue(value);
+ }
+
+
+ return writer;
+ }
+
+
+ public <V extends Object> ValueWriter<V> getValueWriter(V value)
+ {
+
+ Class<? extends Object> clazz = value == null ? Void.TYPE : value.getClass();
+
+ ValueWriter writer = null; // TODO _cachedWriters.get(clazz);
+ if(writer == null || !writer.isComplete())
+ {
+ ValueWriter.Factory<V> factory = (ValueWriter.Factory<V>) (_writerMap.get(clazz));
+
+ if(factory == null)
+ {
+ if(value instanceof List)
+ {
+ factory = _writerMap.get(List.class);
+ _writerMap.put(value.getClass(), factory);
+ writer = factory.newInstance(this);
+ if(writer.isCacheable())
+ {
+ _cachedWriters.put(clazz, writer);
+ }
+ writer.setValue(value);
+
+ }
+ else if(value instanceof Map)
+ {
+ factory = _writerMap.get(Map.class);
+ _writerMap.put(value.getClass(), factory);
+ writer = factory.newInstance(this);
+ if(writer.isCacheable())
+ {
+ _cachedWriters.put(clazz, writer);
+ }
+ writer.setValue(value);
+
+ }
+ else if(value.getClass().isArray())
+ {
+ if(RestrictedType.class.isAssignableFrom(value.getClass().getComponentType()))
+ {
+ RestrictedType[] restrictedTypes = (RestrictedType[]) value;
+ Object[] newVals = (Object[]) Array.newInstance(restrictedTypes[0].getValue().getClass(),
+ restrictedTypes.length);
+ for(int i = 0; i < restrictedTypes.length; i++)
+ {
+ newVals[i] = restrictedTypes[i].getValue();
+ }
+ return (ValueWriter<V>) getValueWriter(newVals);
+ }
+ // TODO primitive array types
+ factory = _writerMap.get(List.class);
+ writer = factory.newInstance(this);
+ writer.setValue(Arrays.asList((Object[])value));
+
+ }
+ else
+ {
+ return null;
+ }
+ }
+ else
+ {
+ writer = factory.newInstance(this);
+ if(writer.isCacheable())
+ {
+ _cachedWriters.put(clazz, writer);
+ }
+ writer.setValue(value);
+ }
+ }
+ else
+ {
+ writer.setValue(value);
+ }
+
+ return writer;
+
+ }
+
+ public <V extends Object> ValueWriter<V> register(Class<V> clazz, ValueWriter.Factory<V> writer)
+ {
+ return (ValueWriter<V>) _writerMap.put(clazz, writer);
+ }
+
+}
+
+ \ No newline at end of file
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Accepted.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Accepted.java
new file mode 100644
index 0000000000..aede9df82e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Accepted.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Accepted
+ implements org.apache.qpid.amqp_1_0.type.DeliveryState, Outcome
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Accepted{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpSequence.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpSequence.java
new file mode 100644
index 0000000000..72531f3acc
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpSequence.java
@@ -0,0 +1,70 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.List;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class AmqpSequence
+ implements Section
+ {
+
+
+
+ private final List _value;
+
+ public AmqpSequence(List value)
+ {
+ _value = value;
+ }
+
+ public List getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+ @Override
+ public String toString()
+ {
+ return "AmqpSequence{" +
+ _value +
+ '}';
+ }
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpValue.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpValue.java
new file mode 100644
index 0000000000..22723decca
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/AmqpValue.java
@@ -0,0 +1,66 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class AmqpValue
+ implements Section
+ {
+
+
+
+ private final Object _value;
+
+ public AmqpValue(Object value)
+ {
+ _value = value;
+ }
+
+ public Object getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "AmqpValue{(" + _value.getClass().getName() + ')' + _value + '}';
+ }
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ApplicationProperties.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ApplicationProperties.java
new file mode 100644
index 0000000000..fb9200ecb6
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ApplicationProperties.java
@@ -0,0 +1,64 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class ApplicationProperties
+ implements Section
+ {
+
+
+
+ private final Map _value;
+
+ public ApplicationProperties(Map value)
+ {
+ _value = value;
+ }
+
+ public Map getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Data.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Data.java
new file mode 100644
index 0000000000..f4b8b78264
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Data.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Data
+ implements Section
+ {
+
+
+
+ private final Binary _value;
+
+ public Data(Binary value)
+ {
+ _value = value;
+ }
+
+ public Binary getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "Data{" +
+ _value +
+ '}';
+ }
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnClose.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnClose.java
new file mode 100644
index 0000000000..aab5cf8a27
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnClose.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class DeleteOnClose
+ implements LifetimePolicy
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("DeleteOnClose{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinks.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinks.java
new file mode 100644
index 0000000000..ab0043ea5b
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinks.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class DeleteOnNoLinks
+ implements LifetimePolicy
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("DeleteOnNoLinks{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinksOrMessages.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinksOrMessages.java
new file mode 100644
index 0000000000..591597c655
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoLinksOrMessages.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class DeleteOnNoLinksOrMessages
+ implements LifetimePolicy
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("DeleteOnNoLinksOrMessages{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoMessages.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoMessages.java
new file mode 100644
index 0000000000..9e44061928
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeleteOnNoMessages.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class DeleteOnNoMessages
+ implements LifetimePolicy
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("DeleteOnNoMessages{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeliveryAnnotations.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeliveryAnnotations.java
new file mode 100644
index 0000000000..bde1da090e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/DeliveryAnnotations.java
@@ -0,0 +1,64 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class DeliveryAnnotations
+ implements Section
+ {
+
+
+
+ private final Map _value;
+
+ public DeliveryAnnotations(Map value)
+ {
+ _value = value;
+ }
+
+ public Map getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ExactSubjectFilter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ExactSubjectFilter.java
new file mode 100644
index 0000000000..3d01a26485
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/ExactSubjectFilter.java
@@ -0,0 +1,82 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+
+public class ExactSubjectFilter implements Filter
+{
+
+
+
+ private final String _value;
+
+ public ExactSubjectFilter(String value)
+ {
+ _value = value;
+ }
+
+ public String getValue()
+ {
+ return _value;
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "ExactSubjectFilter{" + _value + '}';
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if(this == o)
+ {
+ return true;
+ }
+ if(o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ ExactSubjectFilter that = (ExactSubjectFilter) o;
+
+ if(_value != null ? !_value.equals(that._value) : that._value != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _value != null ? _value.hashCode() : 0;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Filter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Filter.java
new file mode 100644
index 0000000000..46f391bf4d
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Filter.java
@@ -0,0 +1,28 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+public interface Filter
+{
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Footer.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Footer.java
new file mode 100644
index 0000000000..25cf04763e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Footer.java
@@ -0,0 +1,70 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Footer
+ implements Section
+ {
+
+
+
+ private final Map _value;
+
+ public Footer(Map value)
+ {
+ _value = value;
+ }
+
+ public Map getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "Footer{" + _value +
+ '}';
+ }
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Header.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Header.java
new file mode 100644
index 0000000000..02b4810196
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Header.java
@@ -0,0 +1,161 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Header
+ implements Section
+ {
+
+
+ private Boolean _durable;
+
+ private UnsignedByte _priority;
+
+ private UnsignedInteger _ttl;
+
+ private Boolean _firstAcquirer;
+
+ private UnsignedInteger _deliveryCount;
+
+ public Boolean getDurable()
+ {
+ return _durable;
+ }
+
+ public void setDurable(Boolean durable)
+ {
+ _durable = durable;
+ }
+
+ public UnsignedByte getPriority()
+ {
+ return _priority;
+ }
+
+ public void setPriority(UnsignedByte priority)
+ {
+ _priority = priority;
+ }
+
+ public UnsignedInteger getTtl()
+ {
+ return _ttl;
+ }
+
+ public void setTtl(UnsignedInteger ttl)
+ {
+ _ttl = ttl;
+ }
+
+ public Boolean getFirstAcquirer()
+ {
+ return _firstAcquirer;
+ }
+
+ public void setFirstAcquirer(Boolean firstAcquirer)
+ {
+ _firstAcquirer = firstAcquirer;
+ }
+
+ public UnsignedInteger getDeliveryCount()
+ {
+ return _deliveryCount;
+ }
+
+ public void setDeliveryCount(UnsignedInteger deliveryCount)
+ {
+ _deliveryCount = deliveryCount;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Header{");
+ final int origLength = builder.length();
+
+ if(_durable != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("durable=").append(_durable);
+ }
+
+ if(_priority != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("priority=").append(_priority);
+ }
+
+ if(_ttl != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("ttl=").append(_ttl);
+ }
+
+ if(_firstAcquirer != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("firstAcquirer=").append(_firstAcquirer);
+ }
+
+ if(_deliveryCount != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("deliveryCount=").append(_deliveryCount);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/JMSSelectorFilter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/JMSSelectorFilter.java
new file mode 100644
index 0000000000..a6317c42bf
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/JMSSelectorFilter.java
@@ -0,0 +1,77 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+public class JMSSelectorFilter implements Filter
+{
+
+
+
+ private final String _value;
+
+ public JMSSelectorFilter(String value)
+ {
+ _value = value;
+ }
+
+ public String getValue()
+ {
+ return _value;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "JMSSelector{" + _value + '}';
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if(this == o)
+ {
+ return true;
+ }
+ if(o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ JMSSelectorFilter that = (JMSSelectorFilter) o;
+
+ if(_value != null ? !_value.equals(that._value) : that._value != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _value != null ? _value.hashCode() : 0;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MatchingSubjectFilter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MatchingSubjectFilter.java
new file mode 100644
index 0000000000..9504a658a9
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MatchingSubjectFilter.java
@@ -0,0 +1,81 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+
+public class MatchingSubjectFilter implements Filter
+{
+
+
+
+ private final String _value;
+
+ public MatchingSubjectFilter(String value)
+ {
+ _value = value;
+ }
+
+ public String getValue()
+ {
+ return _value;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "MatchingSubjectFilter{" + _value + '}';
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if(this == o)
+ {
+ return true;
+ }
+ if(o == null || getClass() != o.getClass())
+ {
+ return false;
+ }
+
+ MatchingSubjectFilter that = (MatchingSubjectFilter) o;
+
+ if(_value != null ? !_value.equals(that._value) : that._value != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return _value != null ? _value.hashCode() : 0;
+ }
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MessageAnnotations.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MessageAnnotations.java
new file mode 100644
index 0000000000..265beb7213
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/MessageAnnotations.java
@@ -0,0 +1,64 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class MessageAnnotations
+ implements Section
+ {
+
+
+
+ private final Map _value;
+
+ public MessageAnnotations(Map value)
+ {
+ _value = value;
+ }
+
+ public Map getValue()
+ {
+ return _value;
+ }
+
+
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Modified.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Modified.java
new file mode 100644
index 0000000000..d466cbf2b1
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Modified.java
@@ -0,0 +1,112 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Modified
+ implements org.apache.qpid.amqp_1_0.type.DeliveryState, Outcome
+ {
+
+
+ private Boolean _deliveryFailed;
+
+ private Boolean _undeliverableHere;
+
+ private Map _messageAnnotations;
+
+ public Boolean getDeliveryFailed()
+ {
+ return _deliveryFailed;
+ }
+
+ public void setDeliveryFailed(Boolean deliveryFailed)
+ {
+ _deliveryFailed = deliveryFailed;
+ }
+
+ public Boolean getUndeliverableHere()
+ {
+ return _undeliverableHere;
+ }
+
+ public void setUndeliverableHere(Boolean undeliverableHere)
+ {
+ _undeliverableHere = undeliverableHere;
+ }
+
+ public Map getMessageAnnotations()
+ {
+ return _messageAnnotations;
+ }
+
+ public void setMessageAnnotations(Map messageAnnotations)
+ {
+ _messageAnnotations = messageAnnotations;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Modified{");
+ final int origLength = builder.length();
+
+ if(_deliveryFailed != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("deliveryFailed=").append(_deliveryFailed);
+ }
+
+ if(_undeliverableHere != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("undeliverableHere=").append(_undeliverableHere);
+ }
+
+ if(_messageAnnotations != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("messageAnnotations=").append(_messageAnnotations);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/NoLocalFilter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/NoLocalFilter.java
new file mode 100644
index 0000000000..73f175e6fa
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/NoLocalFilter.java
@@ -0,0 +1,45 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+public final class NoLocalFilter implements Filter
+{
+
+
+ public static final NoLocalFilter INSTANCE = new NoLocalFilter();
+
+ private NoLocalFilter()
+ {
+ }
+
+
+ @Override
+ public String toString()
+ {
+ return "NoLocalFilter{}";
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Properties.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Properties.java
new file mode 100644
index 0000000000..bcab361a8e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Properties.java
@@ -0,0 +1,333 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+
+
+import java.util.Date;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Properties
+ implements Section
+ {
+
+
+ private Object _messageId;
+
+ private Binary _userId;
+
+ private String _to;
+
+ private String _subject;
+
+ private String _replyTo;
+
+ private Object _correlationId;
+
+ private Symbol _contentType;
+
+ private Symbol _contentEncoding;
+
+ private Date _absoluteExpiryTime;
+
+ private Date _creationTime;
+
+ private String _groupId;
+
+ private UnsignedInteger _groupSequence;
+
+ private String _replyToGroupId;
+
+ public Object getMessageId()
+ {
+ return _messageId;
+ }
+
+ public void setMessageId(Object messageId)
+ {
+ _messageId = messageId;
+ }
+
+ public Binary getUserId()
+ {
+ return _userId;
+ }
+
+ public void setUserId(Binary userId)
+ {
+ _userId = userId;
+ }
+
+ public String getTo()
+ {
+ return _to;
+ }
+
+ public void setTo(String to)
+ {
+ _to = to;
+ }
+
+ public String getSubject()
+ {
+ return _subject;
+ }
+
+ public void setSubject(String subject)
+ {
+ _subject = subject;
+ }
+
+ public String getReplyTo()
+ {
+ return _replyTo;
+ }
+
+ public void setReplyTo(String replyTo)
+ {
+ _replyTo = replyTo;
+ }
+
+ public Object getCorrelationId()
+ {
+ return _correlationId;
+ }
+
+ public void setCorrelationId(Object correlationId)
+ {
+ _correlationId = correlationId;
+ }
+
+ public Symbol getContentType()
+ {
+ return _contentType;
+ }
+
+ public void setContentType(Symbol contentType)
+ {
+ _contentType = contentType;
+ }
+
+ public Symbol getContentEncoding()
+ {
+ return _contentEncoding;
+ }
+
+ public void setContentEncoding(Symbol contentEncoding)
+ {
+ _contentEncoding = contentEncoding;
+ }
+
+ public Date getAbsoluteExpiryTime()
+ {
+ return _absoluteExpiryTime;
+ }
+
+ public void setAbsoluteExpiryTime(Date absoluteExpiryTime)
+ {
+ _absoluteExpiryTime = absoluteExpiryTime;
+ }
+
+ public Date getCreationTime()
+ {
+ return _creationTime;
+ }
+
+ public void setCreationTime(Date creationTime)
+ {
+ _creationTime = creationTime;
+ }
+
+ public String getGroupId()
+ {
+ return _groupId;
+ }
+
+ public void setGroupId(String groupId)
+ {
+ _groupId = groupId;
+ }
+
+ public UnsignedInteger getGroupSequence()
+ {
+ return _groupSequence;
+ }
+
+ public void setGroupSequence(UnsignedInteger groupSequence)
+ {
+ _groupSequence = groupSequence;
+ }
+
+ public String getReplyToGroupId()
+ {
+ return _replyToGroupId;
+ }
+
+ public void setReplyToGroupId(String replyToGroupId)
+ {
+ _replyToGroupId = replyToGroupId;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Properties{");
+ final int origLength = builder.length();
+
+ if(_messageId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("messageId=").append(_messageId);
+ }
+
+ if(_userId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("userId=").append(_userId);
+ }
+
+ if(_to != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("to=").append(_to);
+ }
+
+ if(_subject != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("subject=").append(_subject);
+ }
+
+ if(_replyTo != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("replyTo=").append(_replyTo);
+ }
+
+ if(_correlationId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("correlationId=").append(_correlationId);
+ }
+
+ if(_contentType != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("contentType=").append(_contentType);
+ }
+
+ if(_contentEncoding != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("contentEncoding=").append(_contentEncoding);
+ }
+
+ if(_absoluteExpiryTime != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("absoluteExpiryTime=").append(_absoluteExpiryTime);
+ }
+
+ if(_creationTime != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("creationTime=").append(_creationTime);
+ }
+
+ if(_groupId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("groupId=").append(_groupId);
+ }
+
+ if(_groupSequence != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("groupSequence=").append(_groupSequence);
+ }
+
+ if(_replyToGroupId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("replyToGroupId=").append(_replyToGroupId);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ public Binary encode(final SectionEncoder encoder)
+ {
+ encoder.reset();
+ encoder.encodeObject(this);
+ return encoder.getEncoding();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Received.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Received.java
new file mode 100644
index 0000000000..2e398063b8
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Received.java
@@ -0,0 +1,88 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Received
+ implements org.apache.qpid.amqp_1_0.type.DeliveryState
+ {
+
+
+ private UnsignedInteger _sectionNumber;
+
+ private UnsignedLong _sectionOffset;
+
+ public UnsignedInteger getSectionNumber()
+ {
+ return _sectionNumber;
+ }
+
+ public void setSectionNumber(UnsignedInteger sectionNumber)
+ {
+ _sectionNumber = sectionNumber;
+ }
+
+ public UnsignedLong getSectionOffset()
+ {
+ return _sectionOffset;
+ }
+
+ public void setSectionOffset(UnsignedLong sectionOffset)
+ {
+ _sectionOffset = sectionOffset;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Received{");
+ final int origLength = builder.length();
+
+ if(_sectionNumber != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("sectionNumber=").append(_sectionNumber);
+ }
+
+ if(_sectionOffset != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("sectionOffset=").append(_sectionOffset);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Rejected.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Rejected.java
new file mode 100644
index 0000000000..c895074131
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Rejected.java
@@ -0,0 +1,70 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Rejected
+ implements org.apache.qpid.amqp_1_0.type.DeliveryState, Outcome
+ {
+
+
+ private Error _error;
+
+ public Error getError()
+ {
+ return _error;
+ }
+
+ public void setError(Error error)
+ {
+ _error = error;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Rejected{");
+ final int origLength = builder.length();
+
+ if(_error != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("error=").append(_error);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Released.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Released.java
new file mode 100644
index 0000000000..ad54b6ff04
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Released.java
@@ -0,0 +1,46 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Released
+ implements org.apache.qpid.amqp_1_0.type.DeliveryState, Outcome
+ {
+
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Released{");
+ final int origLength = builder.length();
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Source.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Source.java
new file mode 100644
index 0000000000..b634542fd6
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Source.java
@@ -0,0 +1,280 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Source
+ implements org.apache.qpid.amqp_1_0.type.Source
+ {
+
+
+ private String _address;
+
+ private TerminusDurability _durable;
+
+ private TerminusExpiryPolicy _expiryPolicy;
+
+ private UnsignedInteger _timeout;
+
+ private Boolean _dynamic;
+
+ private Map _dynamicNodeProperties;
+
+ private DistributionMode _distributionMode;
+
+ private Map _filter;
+
+ private Outcome _defaultOutcome;
+
+ private Symbol[] _outcomes;
+
+ private Symbol[] _capabilities;
+
+ public String getAddress()
+ {
+ return _address;
+ }
+
+ public void setAddress(String address)
+ {
+ _address = address;
+ }
+
+ public TerminusDurability getDurable()
+ {
+ return _durable;
+ }
+
+ public void setDurable(TerminusDurability durable)
+ {
+ _durable = durable;
+ }
+
+ public TerminusExpiryPolicy getExpiryPolicy()
+ {
+ return _expiryPolicy;
+ }
+
+ public void setExpiryPolicy(TerminusExpiryPolicy expiryPolicy)
+ {
+ _expiryPolicy = expiryPolicy;
+ }
+
+ public UnsignedInteger getTimeout()
+ {
+ return _timeout;
+ }
+
+ public void setTimeout(UnsignedInteger timeout)
+ {
+ _timeout = timeout;
+ }
+
+ public Boolean getDynamic()
+ {
+ return _dynamic;
+ }
+
+ public void setDynamic(Boolean dynamic)
+ {
+ _dynamic = dynamic;
+ }
+
+ public Map getDynamicNodeProperties()
+ {
+ return _dynamicNodeProperties;
+ }
+
+ public void setDynamicNodeProperties(Map dynamicNodeProperties)
+ {
+ _dynamicNodeProperties = dynamicNodeProperties;
+ }
+
+ public DistributionMode getDistributionMode()
+ {
+ return _distributionMode;
+ }
+
+ public void setDistributionMode(DistributionMode distributionMode)
+ {
+ _distributionMode = distributionMode;
+ }
+
+ public Map getFilter()
+ {
+ return _filter;
+ }
+
+ public void setFilter(Map filter)
+ {
+ _filter = filter;
+ }
+
+ public Outcome getDefaultOutcome()
+ {
+ return _defaultOutcome;
+ }
+
+ public void setDefaultOutcome(Outcome defaultOutcome)
+ {
+ _defaultOutcome = defaultOutcome;
+ }
+
+ public Symbol[] getOutcomes()
+ {
+ return _outcomes;
+ }
+
+ public void setOutcomes(Symbol[] outcomes)
+ {
+ _outcomes = outcomes;
+ }
+
+ public Symbol[] getCapabilities()
+ {
+ return _capabilities;
+ }
+
+ public void setCapabilities(Symbol[] capabilities)
+ {
+ _capabilities = capabilities;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Source{");
+ final int origLength = builder.length();
+
+ if(_address != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("address=").append(_address);
+ }
+
+ if(_durable != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("durable=").append(_durable);
+ }
+
+ if(_expiryPolicy != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("expiryPolicy=").append(_expiryPolicy);
+ }
+
+ if(_timeout != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("timeout=").append(_timeout);
+ }
+
+ if(_dynamic != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("dynamic=").append(_dynamic);
+ }
+
+ if(_dynamicNodeProperties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("dynamicNodeProperties=").append(_dynamicNodeProperties);
+ }
+
+ if(_distributionMode != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("distributionMode=").append(_distributionMode);
+ }
+
+ if(_filter != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("filter=").append(_filter);
+ }
+
+ if(_defaultOutcome != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("defaultOutcome=").append(_defaultOutcome);
+ }
+
+ if(_outcomes != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("outcomes=").append(_outcomes);
+ }
+
+ if(_capabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("capabilities=").append(_capabilities);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/StdDistMode.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/StdDistMode.java
new file mode 100644
index 0000000000..a3fba6fe46
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/StdDistMode.java
@@ -0,0 +1,95 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class StdDistMode
+ implements DistributionMode, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final StdDistMode MOVE = new StdDistMode(Symbol.valueOf("move"));
+
+ public static final StdDistMode COPY = new StdDistMode(Symbol.valueOf("copy"));
+
+
+
+ private StdDistMode(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == MOVE)
+ {
+ return "move";
+ }
+
+ if(this == COPY)
+ {
+ return "copy";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static StdDistMode valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(MOVE._val.equals(val))
+ {
+ return MOVE;
+ }
+
+ if(COPY._val.equals(val))
+ {
+ return COPY;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Target.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Target.java
new file mode 100644
index 0000000000..ea9319d31d
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/Target.java
@@ -0,0 +1,196 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Target
+ implements org.apache.qpid.amqp_1_0.type.Target
+ {
+
+
+ private String _address;
+
+ private TerminusDurability _durable;
+
+ private TerminusExpiryPolicy _expiryPolicy;
+
+ private UnsignedInteger _timeout;
+
+ private Boolean _dynamic;
+
+ private Map _dynamicNodeProperties;
+
+ private Symbol[] _capabilities;
+
+ public String getAddress()
+ {
+ return _address;
+ }
+
+ public void setAddress(String address)
+ {
+ _address = address;
+ }
+
+ public TerminusDurability getDurable()
+ {
+ return _durable;
+ }
+
+ public void setDurable(TerminusDurability durable)
+ {
+ _durable = durable;
+ }
+
+ public TerminusExpiryPolicy getExpiryPolicy()
+ {
+ return _expiryPolicy;
+ }
+
+ public void setExpiryPolicy(TerminusExpiryPolicy expiryPolicy)
+ {
+ _expiryPolicy = expiryPolicy;
+ }
+
+ public UnsignedInteger getTimeout()
+ {
+ return _timeout;
+ }
+
+ public void setTimeout(UnsignedInteger timeout)
+ {
+ _timeout = timeout;
+ }
+
+ public Boolean getDynamic()
+ {
+ return _dynamic;
+ }
+
+ public void setDynamic(Boolean dynamic)
+ {
+ _dynamic = dynamic;
+ }
+
+ public Map getDynamicNodeProperties()
+ {
+ return _dynamicNodeProperties;
+ }
+
+ public void setDynamicNodeProperties(Map dynamicNodeProperties)
+ {
+ _dynamicNodeProperties = dynamicNodeProperties;
+ }
+
+ public Symbol[] getCapabilities()
+ {
+ return _capabilities;
+ }
+
+ public void setCapabilities(Symbol[] capabilities)
+ {
+ _capabilities = capabilities;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Target{");
+ final int origLength = builder.length();
+
+ if(_address != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("address=").append(_address);
+ }
+
+ if(_durable != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("durable=").append(_durable);
+ }
+
+ if(_expiryPolicy != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("expiryPolicy=").append(_expiryPolicy);
+ }
+
+ if(_timeout != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("timeout=").append(_timeout);
+ }
+
+ if(_dynamic != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("dynamic=").append(_dynamic);
+ }
+
+ if(_dynamicNodeProperties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("dynamicNodeProperties=").append(_dynamicNodeProperties);
+ }
+
+ if(_capabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("capabilities=").append(_capabilities);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusDurability.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusDurability.java
new file mode 100644
index 0000000000..b08c416b4a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusDurability.java
@@ -0,0 +1,107 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class TerminusDurability
+ implements RestrictedType<UnsignedInteger>
+
+ {
+
+
+
+ private final UnsignedInteger _val;
+
+
+ public static final TerminusDurability NONE = new TerminusDurability(UnsignedInteger.valueOf(0));
+
+ public static final TerminusDurability CONFIGURATION = new TerminusDurability(UnsignedInteger.valueOf(1));
+
+ public static final TerminusDurability UNSETTLED_STATE = new TerminusDurability(UnsignedInteger.valueOf(2));
+
+
+
+ private TerminusDurability(UnsignedInteger val)
+ {
+ _val = val;
+ }
+
+ public UnsignedInteger getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == NONE)
+ {
+ return "none";
+ }
+
+ if(this == CONFIGURATION)
+ {
+ return "configuration";
+ }
+
+ if(this == UNSETTLED_STATE)
+ {
+ return "unsettled-state";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static TerminusDurability valueOf(Object obj)
+ {
+ UnsignedInteger val = (UnsignedInteger) obj;
+
+ if(NONE._val.equals(val))
+ {
+ return NONE;
+ }
+
+ if(CONFIGURATION._val.equals(val))
+ {
+ return CONFIGURATION;
+ }
+
+ if(UNSETTLED_STATE._val.equals(val))
+ {
+ return UNSETTLED_STATE;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusExpiryPolicy.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusExpiryPolicy.java
new file mode 100644
index 0000000000..7ed2f84532
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/TerminusExpiryPolicy.java
@@ -0,0 +1,119 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class TerminusExpiryPolicy
+ implements RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final TerminusExpiryPolicy LINK_DETACH = new TerminusExpiryPolicy(Symbol.valueOf("link-detach"));
+
+ public static final TerminusExpiryPolicy SESSION_END = new TerminusExpiryPolicy(Symbol.valueOf("session-end"));
+
+ public static final TerminusExpiryPolicy CONNECTION_CLOSE = new TerminusExpiryPolicy(Symbol.valueOf("connection-close"));
+
+ public static final TerminusExpiryPolicy NEVER = new TerminusExpiryPolicy(Symbol.valueOf("never"));
+
+
+
+ private TerminusExpiryPolicy(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == LINK_DETACH)
+ {
+ return "link-detach";
+ }
+
+ if(this == SESSION_END)
+ {
+ return "session-end";
+ }
+
+ if(this == CONNECTION_CLOSE)
+ {
+ return "connection-close";
+ }
+
+ if(this == NEVER)
+ {
+ return "never";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static TerminusExpiryPolicy valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(LINK_DETACH._val.equals(val))
+ {
+ return LINK_DETACH;
+ }
+
+ if(SESSION_END._val.equals(val))
+ {
+ return SESSION_END;
+ }
+
+ if(CONNECTION_CLOSE._val.equals(val))
+ {
+ return CONNECTION_CLOSE;
+ }
+
+ if(NEVER._val.equals(val))
+ {
+ return NEVER;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedConstructor.java
new file mode 100644
index 0000000000..8000853a4d
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+
+
+import java.util.List;
+
+public class AcceptedConstructor extends DescribedTypeConstructor<Accepted>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:accepted:list"),UnsignedLong.valueOf(0x0000000000000024L),
+ };
+
+ private static final AcceptedConstructor INSTANCE = new AcceptedConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Accepted construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Accepted obj = new Accepted();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedWriter.java
new file mode 100644
index 0000000000..862b678b59
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AcceptedWriter.java
@@ -0,0 +1,151 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+
+public class AcceptedWriter extends AbstractDescribedTypeWriter<Accepted>
+{
+ private Accepted _value;
+ private int _count = -1;
+
+ public AcceptedWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Accepted value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000024L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ if(_count != 0)
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+ else
+ {
+ return new ListWriter.EmptyListValueWriter();
+ }
+
+ }
+
+ private class Writer extends AbstractListWriter<Accepted>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Accepted value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Accepted> FACTORY = new Factory<Accepted>()
+ {
+
+ public ValueWriter<Accepted> newInstance(Registry registry)
+ {
+ return new AcceptedWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Accepted.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceConstructor.java
new file mode 100644
index 0000000000..7304a50b18
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceConstructor.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpSequence;
+
+
+import java.util.List;
+
+public class AmqpSequenceConstructor extends DescribedTypeConstructor<AmqpSequence>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:amqp-sequence:list"),UnsignedLong.valueOf(0x0000000000000076L),
+ };
+
+ private static final AmqpSequenceConstructor INSTANCE = new AmqpSequenceConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public AmqpSequence construct(Object underlying)
+ {
+
+ if(underlying instanceof List)
+ {
+ return new AmqpSequence((List)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceWriter.java
new file mode 100644
index 0000000000..14c10ca5e6
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpSequenceWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpSequence;
+
+public class AmqpSequenceWriter extends AbstractDescribedTypeWriter<AmqpSequence>
+{
+ private AmqpSequence _value;
+
+
+
+ public AmqpSequenceWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final AmqpSequence value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000076L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value);
+ }
+
+ private static Factory<AmqpSequence> FACTORY = new Factory<AmqpSequence>()
+ {
+
+ public ValueWriter<AmqpSequence> newInstance(Registry registry)
+ {
+ return new AmqpSequenceWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(AmqpSequence.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueConstructor.java
new file mode 100644
index 0000000000..2000880361
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueConstructor.java
@@ -0,0 +1,65 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+
+public class AmqpValueConstructor extends DescribedTypeConstructor<AmqpValue>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:amqp-value:*"),UnsignedLong.valueOf(0x0000000000000077L),
+ };
+
+ private static final AmqpValueConstructor INSTANCE = new AmqpValueConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public AmqpValue construct(Object underlying)
+ {
+
+ if(underlying instanceof Object)
+ {
+ return new AmqpValue((Object)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueWriter.java
new file mode 100644
index 0000000000..f38d2edb00
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/AmqpValueWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+
+public class AmqpValueWriter extends AbstractDescribedTypeWriter<AmqpValue>
+{
+ private AmqpValue _value;
+
+
+
+ public AmqpValueWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final AmqpValue value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000077L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<AmqpValue> FACTORY = new Factory<AmqpValue>()
+ {
+
+ public ValueWriter<AmqpValue> newInstance(Registry registry)
+ {
+ return new AmqpValueWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(AmqpValue.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesConstructor.java
new file mode 100644
index 0000000000..f2bf26b7b4
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesConstructor.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+
+
+import java.util.Map;
+
+public class ApplicationPropertiesConstructor extends DescribedTypeConstructor<ApplicationProperties>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:application-properties:map"),UnsignedLong.valueOf(0x0000000000000074L),
+ };
+
+ private static final ApplicationPropertiesConstructor INSTANCE = new ApplicationPropertiesConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public ApplicationProperties construct(Object underlying)
+ {
+
+ if(underlying instanceof Map)
+ {
+ return new ApplicationProperties((Map)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesWriter.java
new file mode 100644
index 0000000000..6fff917058
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ApplicationPropertiesWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+
+public class ApplicationPropertiesWriter extends AbstractDescribedTypeWriter<ApplicationProperties>
+{
+ private ApplicationProperties _value;
+
+
+
+ public ApplicationPropertiesWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final ApplicationProperties value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000074L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<ApplicationProperties> FACTORY = new Factory<ApplicationProperties>()
+ {
+
+ public ValueWriter<ApplicationProperties> newInstance(Registry registry)
+ {
+ return new ApplicationPropertiesWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(ApplicationProperties.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataConstructor.java
new file mode 100644
index 0000000000..75e921c1b8
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataConstructor.java
@@ -0,0 +1,65 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Data;
+
+public class DataConstructor extends DescribedTypeConstructor<Data>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:data:binary"),UnsignedLong.valueOf(0x0000000000000075L),
+ };
+
+ private static final DataConstructor INSTANCE = new DataConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public Data construct(Object underlying)
+ {
+
+ if(underlying instanceof Binary)
+ {
+ return new Data((Binary)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataWriter.java
new file mode 100644
index 0000000000..5ae6eecb43
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DataWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Data;
+
+public class DataWriter extends AbstractDescribedTypeWriter<Data>
+{
+ private Data _value;
+
+
+
+ public DataWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Data value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000075L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<Data> FACTORY = new Factory<Data>()
+ {
+
+ public ValueWriter<Data> newInstance(Registry registry)
+ {
+ return new DataWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Data.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseConstructor.java
new file mode 100644
index 0000000000..31236a00cc
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnClose;
+
+
+import java.util.List;
+
+public class DeleteOnCloseConstructor extends DescribedTypeConstructor<DeleteOnClose>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:delete-on-close:list"),UnsignedLong.valueOf(0x000000000000002bL),
+ };
+
+ private static final DeleteOnCloseConstructor INSTANCE = new DeleteOnCloseConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public DeleteOnClose construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ DeleteOnClose obj = new DeleteOnClose();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseWriter.java
new file mode 100644
index 0000000000..3ea43f2565
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnCloseWriter.java
@@ -0,0 +1,142 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnClose;
+
+public class DeleteOnCloseWriter extends AbstractDescribedTypeWriter<DeleteOnClose>
+{
+ private DeleteOnClose _value;
+ private int _count = -1;
+
+ public DeleteOnCloseWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnClose value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x000000000000002bL);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<DeleteOnClose>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnClose value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<DeleteOnClose> FACTORY = new Factory<DeleteOnClose>()
+ {
+
+ public ValueWriter<DeleteOnClose> newInstance(Registry registry)
+ {
+ return new DeleteOnCloseWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(DeleteOnClose.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksConstructor.java
new file mode 100644
index 0000000000..e5ea6e923e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoLinks;
+
+
+import java.util.List;
+
+public class DeleteOnNoLinksConstructor extends DescribedTypeConstructor<DeleteOnNoLinks>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:delete-on-no-links:list"),UnsignedLong.valueOf(0x000000000000002cL),
+ };
+
+ private static final DeleteOnNoLinksConstructor INSTANCE = new DeleteOnNoLinksConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public DeleteOnNoLinks construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ DeleteOnNoLinks obj = new DeleteOnNoLinks();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesConstructor.java
new file mode 100644
index 0000000000..c9bafe9550
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoLinksOrMessages;
+
+
+import java.util.List;
+
+public class DeleteOnNoLinksOrMessagesConstructor extends DescribedTypeConstructor<DeleteOnNoLinksOrMessages>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:delete-on-no-links-or-messages:list"),UnsignedLong.valueOf(0x000000000000002eL),
+ };
+
+ private static final DeleteOnNoLinksOrMessagesConstructor INSTANCE = new DeleteOnNoLinksOrMessagesConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public DeleteOnNoLinksOrMessages construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ DeleteOnNoLinksOrMessages obj = new DeleteOnNoLinksOrMessages();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesWriter.java
new file mode 100644
index 0000000000..e77c6a3be4
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksOrMessagesWriter.java
@@ -0,0 +1,142 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoLinksOrMessages;
+
+public class DeleteOnNoLinksOrMessagesWriter extends AbstractDescribedTypeWriter<DeleteOnNoLinksOrMessages>
+{
+ private DeleteOnNoLinksOrMessages _value;
+ private int _count = -1;
+
+ public DeleteOnNoLinksOrMessagesWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoLinksOrMessages value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x000000000000002eL);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<DeleteOnNoLinksOrMessages>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoLinksOrMessages value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<DeleteOnNoLinksOrMessages> FACTORY = new Factory<DeleteOnNoLinksOrMessages>()
+ {
+
+ public ValueWriter<DeleteOnNoLinksOrMessages> newInstance(Registry registry)
+ {
+ return new DeleteOnNoLinksOrMessagesWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(DeleteOnNoLinksOrMessages.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksWriter.java
new file mode 100644
index 0000000000..cbd5048ba1
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoLinksWriter.java
@@ -0,0 +1,142 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoLinks;
+
+public class DeleteOnNoLinksWriter extends AbstractDescribedTypeWriter<DeleteOnNoLinks>
+{
+ private DeleteOnNoLinks _value;
+ private int _count = -1;
+
+ public DeleteOnNoLinksWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoLinks value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x000000000000002cL);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<DeleteOnNoLinks>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoLinks value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<DeleteOnNoLinks> FACTORY = new Factory<DeleteOnNoLinks>()
+ {
+
+ public ValueWriter<DeleteOnNoLinks> newInstance(Registry registry)
+ {
+ return new DeleteOnNoLinksWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(DeleteOnNoLinks.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesConstructor.java
new file mode 100644
index 0000000000..de8ce5b9a5
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoMessages;
+
+
+import java.util.List;
+
+public class DeleteOnNoMessagesConstructor extends DescribedTypeConstructor<DeleteOnNoMessages>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:delete-on-no-messages:list"),UnsignedLong.valueOf(0x000000000000002dL),
+ };
+
+ private static final DeleteOnNoMessagesConstructor INSTANCE = new DeleteOnNoMessagesConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public DeleteOnNoMessages construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ DeleteOnNoMessages obj = new DeleteOnNoMessages();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesWriter.java
new file mode 100644
index 0000000000..bd75ec9fa1
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeleteOnNoMessagesWriter.java
@@ -0,0 +1,142 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.DeleteOnNoMessages;
+
+public class DeleteOnNoMessagesWriter extends AbstractDescribedTypeWriter<DeleteOnNoMessages>
+{
+ private DeleteOnNoMessages _value;
+ private int _count = -1;
+
+ public DeleteOnNoMessagesWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoMessages value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x000000000000002dL);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<DeleteOnNoMessages>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeleteOnNoMessages value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<DeleteOnNoMessages> FACTORY = new Factory<DeleteOnNoMessages>()
+ {
+
+ public ValueWriter<DeleteOnNoMessages> newInstance(Registry registry)
+ {
+ return new DeleteOnNoMessagesWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(DeleteOnNoMessages.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsConstructor.java
new file mode 100644
index 0000000000..3596a1f722
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsConstructor.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.DeliveryAnnotations;
+
+
+import java.util.Map;
+
+public class DeliveryAnnotationsConstructor extends DescribedTypeConstructor<DeliveryAnnotations>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:delivery-annotations:map"),UnsignedLong.valueOf(0x0000000000000071L),
+ };
+
+ private static final DeliveryAnnotationsConstructor INSTANCE = new DeliveryAnnotationsConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public DeliveryAnnotations construct(Object underlying)
+ {
+
+ if(underlying instanceof Map)
+ {
+ return new DeliveryAnnotations((Map)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsWriter.java
new file mode 100644
index 0000000000..e22c26b290
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/DeliveryAnnotationsWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.DeliveryAnnotations;
+
+public class DeliveryAnnotationsWriter extends AbstractDescribedTypeWriter<DeliveryAnnotations>
+{
+ private DeliveryAnnotations _value;
+
+
+
+ public DeliveryAnnotationsWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final DeliveryAnnotations value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000071L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value);
+ }
+
+ private static Factory<DeliveryAnnotations> FACTORY = new Factory<DeliveryAnnotations>()
+ {
+
+ public ValueWriter<DeliveryAnnotations> newInstance(Registry registry)
+ {
+ return new DeliveryAnnotationsWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(DeliveryAnnotations.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterConstructor.java
new file mode 100644
index 0000000000..90eff967b2
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterConstructor.java
@@ -0,0 +1,64 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.messaging.ExactSubjectFilter;
+
+public class ExactSubjectFilterConstructor extends DescribedTypeConstructor<ExactSubjectFilter>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("apache.org:legacy-amqp-direct-binding:string"), 0x0000468C00000000L
+ };
+
+ private static final ExactSubjectFilterConstructor INSTANCE = new ExactSubjectFilterConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public ExactSubjectFilter construct(Object underlying)
+ {
+
+ if(underlying instanceof String)
+ {
+ return new ExactSubjectFilter((String)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterWriter.java
new file mode 100644
index 0000000000..2e95aba7a2
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ExactSubjectFilterWriter.java
@@ -0,0 +1,78 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.type.messaging.ExactSubjectFilter;
+
+public class ExactSubjectFilterWriter extends AbstractDescribedTypeWriter<ExactSubjectFilter>
+{
+ private ExactSubjectFilter _value;
+
+
+
+ public ExactSubjectFilterWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final ExactSubjectFilter value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return 0x0000468C00000000L;
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<ExactSubjectFilter> FACTORY = new Factory<ExactSubjectFilter>()
+ {
+
+ public ValueWriter<ExactSubjectFilter> newInstance(Registry registry)
+ {
+ return new ExactSubjectFilterWriter(registry);
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(ExactSubjectFilter.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterConstructor.java
new file mode 100644
index 0000000000..ed92c9f8f8
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterConstructor.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+
+
+import java.util.Map;
+
+public class FooterConstructor extends DescribedTypeConstructor<Footer>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:footer:map"),UnsignedLong.valueOf(0x0000000000000078L),
+ };
+
+ private static final FooterConstructor INSTANCE = new FooterConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public Footer construct(Object underlying)
+ {
+
+ if(underlying instanceof Map)
+ {
+ return new Footer((Map)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterWriter.java
new file mode 100644
index 0000000000..3ffde7c663
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/FooterWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+
+public class FooterWriter extends AbstractDescribedTypeWriter<Footer>
+{
+ private Footer _value;
+
+
+
+ public FooterWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Footer value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000078L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<Footer> FACTORY = new Factory<Footer>()
+ {
+
+ public ValueWriter<Footer> newInstance(Registry registry)
+ {
+ return new FooterWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Footer.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderConstructor.java
new file mode 100644
index 0000000000..5a1b4ceb1b
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderConstructor.java
@@ -0,0 +1,207 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+
+
+import java.util.List;
+
+public class HeaderConstructor extends DescribedTypeConstructor<Header>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:header:list"),UnsignedLong.valueOf(0x0000000000000070L),
+ };
+
+ private static final HeaderConstructor INSTANCE = new HeaderConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Header construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Header obj = new Header();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDurable( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setPriority( (UnsignedByte) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTtl( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setFirstAcquirer( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDeliveryCount( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderWriter.java
new file mode 100644
index 0000000000..20605293e1
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/HeaderWriter.java
@@ -0,0 +1,182 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+
+public class HeaderWriter extends AbstractDescribedTypeWriter<Header>
+{
+ private Header _value;
+ private int _count = -1;
+
+ public HeaderWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Header value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getDeliveryCount() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getFirstAcquirer() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getTtl() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getPriority() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getDurable() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000070L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Header>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Header value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getDurable();
+
+ case 1:
+ return _value.getPriority();
+
+ case 2:
+ return _value.getTtl();
+
+ case 3:
+ return _value.getFirstAcquirer();
+
+ case 4:
+ return _value.getDeliveryCount();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Header> FACTORY = new Factory<Header>()
+ {
+
+ public ValueWriter<Header> newInstance(Registry registry)
+ {
+ return new HeaderWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Header.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterConstructor.java
new file mode 100644
index 0000000000..ac377f8461
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterConstructor.java
@@ -0,0 +1,66 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter;
+
+public class JMSSelectorFilterConstructor extends DescribedTypeConstructor<JMSSelectorFilter>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("apache.org:jms-selector-filter:string"),
+ UnsignedLong.valueOf(0x0000468C00000004L)
+ };
+
+ private static final JMSSelectorFilterConstructor INSTANCE = new JMSSelectorFilterConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public JMSSelectorFilter construct(Object underlying)
+ {
+
+ if(underlying instanceof String)
+ {
+ return new JMSSelectorFilter((String)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterWriter.java
new file mode 100644
index 0000000000..f363f0f1a4
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/JMSSelectorFilterWriter.java
@@ -0,0 +1,79 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter;
+
+public class JMSSelectorFilterWriter extends AbstractDescribedTypeWriter<JMSSelectorFilter>
+{
+ private JMSSelectorFilter _value;
+
+
+
+ public JMSSelectorFilterWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final JMSSelectorFilter value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000468C00000004L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<JMSSelectorFilter> FACTORY = new Factory<JMSSelectorFilter>()
+ {
+
+ public ValueWriter<JMSSelectorFilter> newInstance(Registry registry)
+ {
+ return new JMSSelectorFilterWriter(registry);
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(JMSSelectorFilter.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterConstructor.java
new file mode 100644
index 0000000000..13e365fb5a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterConstructor.java
@@ -0,0 +1,65 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.MatchingSubjectFilter;
+
+public class MatchingSubjectFilterConstructor extends DescribedTypeConstructor<MatchingSubjectFilter>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("apache.org:legacy-amqp-topic-binding:string"), UnsignedLong.valueOf(0x0000468C00000001L)
+ };
+
+ private static final MatchingSubjectFilterConstructor INSTANCE = new MatchingSubjectFilterConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public MatchingSubjectFilter construct(Object underlying)
+ {
+
+ if(underlying instanceof String)
+ {
+ return new MatchingSubjectFilter((String)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterWriter.java
new file mode 100644
index 0000000000..3c260e66d4
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MatchingSubjectFilterWriter.java
@@ -0,0 +1,79 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.MatchingSubjectFilter;
+
+public class MatchingSubjectFilterWriter extends AbstractDescribedTypeWriter<MatchingSubjectFilter>
+{
+ private MatchingSubjectFilter _value;
+
+
+
+ public MatchingSubjectFilterWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final MatchingSubjectFilter value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000468C00000001L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<MatchingSubjectFilter> FACTORY = new Factory<MatchingSubjectFilter>()
+ {
+
+ public ValueWriter<MatchingSubjectFilter> newInstance(Registry registry)
+ {
+ return new MatchingSubjectFilterWriter(registry);
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(MatchingSubjectFilter.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsConstructor.java
new file mode 100644
index 0000000000..b2f2ec5739
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsConstructor.java
@@ -0,0 +1,68 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+
+
+import java.util.Map;
+
+public class MessageAnnotationsConstructor extends DescribedTypeConstructor<MessageAnnotations>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:message-annotations:map"),UnsignedLong.valueOf(0x0000000000000072L),
+ };
+
+ private static final MessageAnnotationsConstructor INSTANCE = new MessageAnnotationsConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public MessageAnnotations construct(Object underlying)
+ {
+
+ if(underlying instanceof Map)
+ {
+ return new MessageAnnotations((Map)underlying);
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsWriter.java
new file mode 100644
index 0000000000..400449c381
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/MessageAnnotationsWriter.java
@@ -0,0 +1,80 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+
+public class MessageAnnotationsWriter extends AbstractDescribedTypeWriter<MessageAnnotations>
+{
+ private MessageAnnotations _value;
+
+
+
+ public MessageAnnotationsWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final MessageAnnotations value)
+ {
+ _value = value;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ }
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000072L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return getRegistry().getValueWriter(_value.getValue());
+ }
+
+ private static Factory<MessageAnnotations> FACTORY = new Factory<MessageAnnotations>()
+ {
+
+ public ValueWriter<MessageAnnotations> newInstance(Registry registry)
+ {
+ return new MessageAnnotationsWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(MessageAnnotations.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedConstructor.java
new file mode 100644
index 0000000000..fb78708d7d
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedConstructor.java
@@ -0,0 +1,154 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Modified;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class ModifiedConstructor extends DescribedTypeConstructor<Modified>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:modified:list"),UnsignedLong.valueOf(0x0000000000000027L),
+ };
+
+ private static final ModifiedConstructor INSTANCE = new ModifiedConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Modified construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Modified obj = new Modified();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDeliveryFailed( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setUndeliverableHere( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMessageAnnotations( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedWriter.java
new file mode 100644
index 0000000000..df3063ee52
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ModifiedWriter.java
@@ -0,0 +1,166 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Modified;
+
+public class ModifiedWriter extends AbstractDescribedTypeWriter<Modified>
+{
+ private Modified _value;
+ private int _count = -1;
+
+ public ModifiedWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Modified value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getMessageAnnotations() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getUndeliverableHere() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getDeliveryFailed() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000027L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Modified>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Modified value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getDeliveryFailed();
+
+ case 1:
+ return _value.getUndeliverableHere();
+
+ case 2:
+ return _value.getMessageAnnotations();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Modified> FACTORY = new Factory<Modified>()
+ {
+
+ public ValueWriter<Modified> newInstance(Registry registry)
+ {
+ return new ModifiedWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Modified.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterConstructor.java
new file mode 100644
index 0000000000..b1c5e1dcfe
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterConstructor.java
@@ -0,0 +1,56 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.NoLocalFilter;
+
+public class NoLocalFilterConstructor extends DescribedTypeConstructor<NoLocalFilter>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("apache.org:jms-no-local-filter:list"), UnsignedLong.valueOf(0x0000468C00000003L)
+ };
+
+ private static final NoLocalFilterConstructor INSTANCE = new NoLocalFilterConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+
+ public NoLocalFilter construct(Object underlying)
+ {
+ return NoLocalFilter.INSTANCE;
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterWriter.java
new file mode 100644
index 0000000000..8308f63101
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/NoLocalFilterWriter.java
@@ -0,0 +1,89 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.ListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.NoLocalFilter;
+
+public class NoLocalFilterWriter extends AbstractDescribedTypeWriter<NoLocalFilter>
+{
+ private NoLocalFilter _value;
+ private int _count = -1;
+
+ public NoLocalFilterWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final NoLocalFilter value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000468C00000003L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ return new ListWriter.EmptyListValueWriter();
+ }
+
+ private static Factory<NoLocalFilter> FACTORY = new Factory<NoLocalFilter>()
+ {
+
+ public ValueWriter<NoLocalFilter> newInstance(Registry registry)
+ {
+ return new NoLocalFilterWriter(registry);
+ }
+ };
+
+ public static void register(Registry registry)
+ {
+ registry.register(NoLocalFilter.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesConstructor.java
new file mode 100644
index 0000000000..98b911f341
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesConstructor.java
@@ -0,0 +1,424 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+
+import java.util.List;
+import java.util.Date;
+
+public class PropertiesConstructor extends DescribedTypeConstructor<Properties>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:properties:list"),UnsignedLong.valueOf(0x0000000000000073L),
+ };
+
+ private static final PropertiesConstructor INSTANCE = new PropertiesConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Properties construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Properties obj = new Properties();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMessageId( val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setUserId( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTo( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSubject( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setReplyTo( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setCorrelationId( val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setContentType( (Symbol) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setContentEncoding( (Symbol) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAbsoluteExpiryTime( (Date) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setCreationTime( (Date) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setGroupId( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setGroupSequence( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setReplyToGroupId( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesWriter.java
new file mode 100644
index 0000000000..021338bcfa
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/PropertiesWriter.java
@@ -0,0 +1,246 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+public class PropertiesWriter extends AbstractDescribedTypeWriter<Properties>
+{
+ private Properties _value;
+ private int _count = -1;
+
+ public PropertiesWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Properties value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getReplyToGroupId() != null)
+ {
+ return 13;
+ }
+
+ if( _value.getGroupSequence() != null)
+ {
+ return 12;
+ }
+
+ if( _value.getGroupId() != null)
+ {
+ return 11;
+ }
+
+ if( _value.getCreationTime() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getAbsoluteExpiryTime() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getContentEncoding() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getContentType() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getCorrelationId() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getReplyTo() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getSubject() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getTo() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getUserId() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getMessageId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000073L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Properties>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Properties value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getMessageId();
+
+ case 1:
+ return _value.getUserId();
+
+ case 2:
+ return _value.getTo();
+
+ case 3:
+ return _value.getSubject();
+
+ case 4:
+ return _value.getReplyTo();
+
+ case 5:
+ return _value.getCorrelationId();
+
+ case 6:
+ return _value.getContentType();
+
+ case 7:
+ return _value.getContentEncoding();
+
+ case 8:
+ return _value.getAbsoluteExpiryTime();
+
+ case 9:
+ return _value.getCreationTime();
+
+ case 10:
+ return _value.getGroupId();
+
+ case 11:
+ return _value.getGroupSequence();
+
+ case 12:
+ return _value.getReplyToGroupId();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Properties> FACTORY = new Factory<Properties>()
+ {
+
+ public ValueWriter<Properties> newInstance(Registry registry)
+ {
+ return new PropertiesWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Properties.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedConstructor.java
new file mode 100644
index 0000000000..a515379d33
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedConstructor.java
@@ -0,0 +1,126 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Received;
+
+
+import java.util.List;
+
+public class ReceivedConstructor extends DescribedTypeConstructor<Received>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:received:list"),UnsignedLong.valueOf(0x0000000000000023L),
+ };
+
+ private static final ReceivedConstructor INSTANCE = new ReceivedConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Received construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Received obj = new Received();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSectionNumber( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSectionOffset( (UnsignedLong) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedWriter.java
new file mode 100644
index 0000000000..76af939db5
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReceivedWriter.java
@@ -0,0 +1,158 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Received;
+
+public class ReceivedWriter extends AbstractDescribedTypeWriter<Received>
+{
+ private Received _value;
+ private int _count = -1;
+
+ public ReceivedWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Received value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getSectionOffset() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getSectionNumber() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000023L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Received>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Received value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getSectionNumber();
+
+ case 1:
+ return _value.getSectionOffset();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Received> FACTORY = new Factory<Received>()
+ {
+
+ public ValueWriter<Received> newInstance(Registry registry)
+ {
+ return new ReceivedWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Received.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedConstructor.java
new file mode 100644
index 0000000000..eb923c535d
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Rejected;
+
+
+import java.util.List;
+
+public class RejectedConstructor extends DescribedTypeConstructor<Rejected>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:rejected:list"),UnsignedLong.valueOf(0x0000000000000025L),
+ };
+
+ private static final RejectedConstructor INSTANCE = new RejectedConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Rejected construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Rejected obj = new Rejected();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setError( (org.apache.qpid.amqp_1_0.type.transport.Error) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedWriter.java
new file mode 100644
index 0000000000..6e24ac2972
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/RejectedWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Rejected;
+
+public class RejectedWriter extends AbstractDescribedTypeWriter<Rejected>
+{
+ private Rejected _value;
+ private int _count = -1;
+
+ public RejectedWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Rejected value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getError() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000025L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Rejected>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Rejected value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getError();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Rejected> FACTORY = new Factory<Rejected>()
+ {
+
+ public ValueWriter<Rejected> newInstance(Registry registry)
+ {
+ return new RejectedWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Rejected.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedConstructor.java
new file mode 100644
index 0000000000..534b81efd7
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedConstructor.java
@@ -0,0 +1,72 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Released;
+
+
+import java.util.List;
+
+public class ReleasedConstructor extends DescribedTypeConstructor<Released>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:released:list"),UnsignedLong.valueOf(0x0000000000000026L),
+ };
+
+ private static final ReleasedConstructor INSTANCE = new ReleasedConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Released construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Released obj = new Released();
+ int position = 0;
+ final int size = list.size();
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedWriter.java
new file mode 100644
index 0000000000..cad602e0a6
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/ReleasedWriter.java
@@ -0,0 +1,142 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Released;
+
+public class ReleasedWriter extends AbstractDescribedTypeWriter<Released>
+{
+ private Released _value;
+ private int _count = -1;
+
+ public ReleasedWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Released value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000026L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Released>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Released value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Released> FACTORY = new Factory<Released>()
+ {
+
+ public ValueWriter<Released> newInstance(Registry registry)
+ {
+ return new ReleasedWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Released.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceConstructor.java
new file mode 100644
index 0000000000..764fa222ee
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceConstructor.java
@@ -0,0 +1,384 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class SourceConstructor extends DescribedTypeConstructor<Source>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:source:list"),UnsignedLong.valueOf(0x0000000000000028L),
+ };
+
+ private static final SourceConstructor INSTANCE = new SourceConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Source construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Source obj = new Source();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAddress( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDurable( TerminusDurability.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setExpiryPolicy( TerminusExpiryPolicy.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTimeout( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDynamic( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDynamicNodeProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDistributionMode( (DistributionMode) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setFilter( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDefaultOutcome( (Outcome) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setOutcomes( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setOutcomes( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceWriter.java
new file mode 100644
index 0000000000..7fc8cfb35e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/SourceWriter.java
@@ -0,0 +1,230 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+
+public class SourceWriter extends AbstractDescribedTypeWriter<Source>
+{
+ private Source _value;
+ private int _count = -1;
+
+ public SourceWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Source value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getCapabilities() != null)
+ {
+ return 11;
+ }
+
+ if( _value.getOutcomes() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getDefaultOutcome() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getFilter() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getDistributionMode() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getDynamicNodeProperties() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getDynamic() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getTimeout() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getExpiryPolicy() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getDurable() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getAddress() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000028L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Source>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Source value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getAddress();
+
+ case 1:
+ return _value.getDurable();
+
+ case 2:
+ return _value.getExpiryPolicy();
+
+ case 3:
+ return _value.getTimeout();
+
+ case 4:
+ return _value.getDynamic();
+
+ case 5:
+ return _value.getDynamicNodeProperties();
+
+ case 6:
+ return _value.getDistributionMode();
+
+ case 7:
+ return _value.getFilter();
+
+ case 8:
+ return _value.getDefaultOutcome();
+
+ case 9:
+ return _value.getOutcomes();
+
+ case 10:
+ return _value.getCapabilities();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Source> FACTORY = new Factory<Source>()
+ {
+
+ public ValueWriter<Source> newInstance(Registry registry)
+ {
+ return new SourceWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Source.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetConstructor.java
new file mode 100644
index 0000000000..1c89574273
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetConstructor.java
@@ -0,0 +1,269 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class TargetConstructor extends DescribedTypeConstructor<Target>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:target:list"),UnsignedLong.valueOf(0x0000000000000029L),
+ };
+
+ private static final TargetConstructor INSTANCE = new TargetConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Target construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Target obj = new Target();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAddress( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDurable( TerminusDurability.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setExpiryPolicy( TerminusExpiryPolicy.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTimeout( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDynamic( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDynamicNodeProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetWriter.java
new file mode 100644
index 0000000000..970a9f4020
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/messaging/codec/TargetWriter.java
@@ -0,0 +1,198 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.messaging.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+
+public class TargetWriter extends AbstractDescribedTypeWriter<Target>
+{
+ private Target _value;
+ private int _count = -1;
+
+ public TargetWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Target value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getCapabilities() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getDynamicNodeProperties() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getDynamic() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getTimeout() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getExpiryPolicy() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getDurable() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getAddress() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000029L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Target>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Target value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getAddress();
+
+ case 1:
+ return _value.getDurable();
+
+ case 2:
+ return _value.getExpiryPolicy();
+
+ case 3:
+ return _value.getTimeout();
+
+ case 4:
+ return _value.getDynamic();
+
+ case 5:
+ return _value.getDynamicNodeProperties();
+
+ case 6:
+ return _value.getCapabilities();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Target> FACTORY = new Factory<Target>()
+ {
+
+ public ValueWriter<Target> newInstance(Registry registry)
+ {
+ return new TargetWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Target.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslChallenge.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslChallenge.java
new file mode 100644
index 0000000000..081c00af29
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslChallenge.java
@@ -0,0 +1,74 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SaslChallenge
+ implements SaslFrameBody
+ {
+
+
+ private Binary _challenge;
+
+ public Binary getChallenge()
+ {
+ return _challenge;
+ }
+
+ public void setChallenge(Binary challenge)
+ {
+ _challenge = challenge;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("SaslChallenge{");
+ final int origLength = builder.length();
+
+ if(_challenge != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("challenge=").append(_challenge);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(SASLEndpoint conn)
+ {
+ conn.receiveSaslChallenge(this);
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslCode.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslCode.java
new file mode 100644
index 0000000000..59a24070ef
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslCode.java
@@ -0,0 +1,131 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SaslCode
+ implements RestrictedType<UnsignedByte>
+
+ {
+
+
+
+ private final UnsignedByte _val;
+
+
+ public static final SaslCode OK = new SaslCode(UnsignedByte.valueOf((byte) 0));
+
+ public static final SaslCode AUTH = new SaslCode(UnsignedByte.valueOf((byte) 1));
+
+ public static final SaslCode SYS = new SaslCode(UnsignedByte.valueOf((byte) 2));
+
+ public static final SaslCode SYS_PERM = new SaslCode(UnsignedByte.valueOf((byte) 3));
+
+ public static final SaslCode SYS_TEMP = new SaslCode(UnsignedByte.valueOf((byte) 4));
+
+
+
+ private SaslCode(UnsignedByte val)
+ {
+ _val = val;
+ }
+
+ public UnsignedByte getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == OK)
+ {
+ return "ok";
+ }
+
+ if(this == AUTH)
+ {
+ return "auth";
+ }
+
+ if(this == SYS)
+ {
+ return "sys";
+ }
+
+ if(this == SYS_PERM)
+ {
+ return "sys-perm";
+ }
+
+ if(this == SYS_TEMP)
+ {
+ return "sys-temp";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static SaslCode valueOf(Object obj)
+ {
+ UnsignedByte val = (UnsignedByte) obj;
+
+ if(OK._val.equals(val))
+ {
+ return OK;
+ }
+
+ if(AUTH._val.equals(val))
+ {
+ return AUTH;
+ }
+
+ if(SYS._val.equals(val))
+ {
+ return SYS;
+ }
+
+ if(SYS_PERM._val.equals(val))
+ {
+ return SYS_PERM;
+ }
+
+ if(SYS_TEMP._val.equals(val))
+ {
+ return SYS_TEMP;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslInit.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslInit.java
new file mode 100644
index 0000000000..9b789a4e17
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslInit.java
@@ -0,0 +1,116 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SaslInit
+ implements SaslFrameBody
+ {
+
+
+ private Symbol _mechanism;
+
+ private Binary _initialResponse;
+
+ private String _hostname;
+
+ public Symbol getMechanism()
+ {
+ return _mechanism;
+ }
+
+ public void setMechanism(Symbol mechanism)
+ {
+ _mechanism = mechanism;
+ }
+
+ public Binary getInitialResponse()
+ {
+ return _initialResponse;
+ }
+
+ public void setInitialResponse(Binary initialResponse)
+ {
+ _initialResponse = initialResponse;
+ }
+
+ public String getHostname()
+ {
+ return _hostname;
+ }
+
+ public void setHostname(String hostname)
+ {
+ _hostname = hostname;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("SaslInit{");
+ final int origLength = builder.length();
+
+ if(_mechanism != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("mechanism=").append(_mechanism);
+ }
+
+ if(_initialResponse != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("initialResponse=").append(_initialResponse);
+ }
+
+ if(_hostname != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("hostname=").append(_hostname);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(SASLEndpoint conn)
+ {
+ conn.receiveSaslInit(this);
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java
new file mode 100644
index 0000000000..9598035899
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslMechanisms.java
@@ -0,0 +1,74 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+import java.util.Arrays;
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+import org.apache.qpid.amqp_1_0.type.SaslFrameBody;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+
+public class SaslMechanisms
+ implements SaslFrameBody
+ {
+
+
+ private Symbol[] _saslServerMechanisms;
+
+ public Symbol[] getSaslServerMechanisms()
+ {
+ return _saslServerMechanisms;
+ }
+
+ public void setSaslServerMechanisms(Symbol[] saslServerMechanisms)
+ {
+ _saslServerMechanisms = saslServerMechanisms;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("SaslMechanisms{");
+ final int origLength = builder.length();
+
+ if(_saslServerMechanisms != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("saslServerMechanisms=").append(_saslServerMechanisms == null ? "" : Arrays.asList(_saslServerMechanisms));
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(SASLEndpoint conn)
+ {
+ conn.receiveSaslMechanisms(this);
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslOutcome.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslOutcome.java
new file mode 100644
index 0000000000..02d707d311
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslOutcome.java
@@ -0,0 +1,95 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SaslOutcome
+ implements SaslFrameBody
+ {
+
+
+ private SaslCode _code;
+
+ private Binary _additionalData;
+
+ public SaslCode getCode()
+ {
+ return _code;
+ }
+
+ public void setCode(SaslCode code)
+ {
+ _code = code;
+ }
+
+ public Binary getAdditionalData()
+ {
+ return _additionalData;
+ }
+
+ public void setAdditionalData(Binary additionalData)
+ {
+ _additionalData = additionalData;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("SaslOutcome{");
+ final int origLength = builder.length();
+
+ if(_code != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("code=").append(_code);
+ }
+
+ if(_additionalData != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("additionalData=").append(_additionalData);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(SASLEndpoint conn)
+ {
+ conn.receiveSaslOutcome(this);
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslResponse.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslResponse.java
new file mode 100644
index 0000000000..7ffcaba7e9
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/SaslResponse.java
@@ -0,0 +1,74 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security;
+
+
+import org.apache.qpid.amqp_1_0.transport.SASLEndpoint;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SaslResponse
+ implements SaslFrameBody
+ {
+
+
+ private Binary _response;
+
+ public Binary getResponse()
+ {
+ return _response;
+ }
+
+ public void setResponse(Binary response)
+ {
+ _response = response;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("SaslResponse{");
+ final int origLength = builder.length();
+
+ if(_response != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("response=").append(_response);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(SASLEndpoint conn)
+ {
+ conn.receiveSaslResponse(this);
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeConstructor.java
new file mode 100644
index 0000000000..400e62db5a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslChallenge;
+
+
+import java.util.List;
+
+public class SaslChallengeConstructor extends DescribedTypeConstructor<SaslChallenge>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:sasl-challenge:list"),UnsignedLong.valueOf(0x0000000000000042L),
+ };
+
+ private static final SaslChallengeConstructor INSTANCE = new SaslChallengeConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public SaslChallenge construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ SaslChallenge obj = new SaslChallenge();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setChallenge( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeWriter.java
new file mode 100644
index 0000000000..2dd0e572e4
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslChallengeWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.security.SaslChallenge;
+
+public class SaslChallengeWriter extends AbstractDescribedTypeWriter<SaslChallenge>
+{
+ private SaslChallenge _value;
+ private int _count = -1;
+
+ public SaslChallengeWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslChallenge value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getChallenge() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000042L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<SaslChallenge>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslChallenge value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getChallenge();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<SaslChallenge> FACTORY = new Factory<SaslChallenge>()
+ {
+
+ public ValueWriter<SaslChallenge> newInstance(Registry registry)
+ {
+ return new SaslChallengeWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(SaslChallenge.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitConstructor.java
new file mode 100644
index 0000000000..ff21c8e7d9
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitConstructor.java
@@ -0,0 +1,153 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslInit;
+
+
+import java.util.List;
+
+public class SaslInitConstructor extends DescribedTypeConstructor<SaslInit>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:sasl-init:list"),UnsignedLong.valueOf(0x0000000000000041L),
+ };
+
+ private static final SaslInitConstructor INSTANCE = new SaslInitConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public SaslInit construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ SaslInit obj = new SaslInit();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMechanism( (Symbol) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setInitialResponse( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHostname( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitWriter.java
new file mode 100644
index 0000000000..50c724d9ed
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslInitWriter.java
@@ -0,0 +1,166 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.security.SaslInit;
+
+public class SaslInitWriter extends AbstractDescribedTypeWriter<SaslInit>
+{
+ private SaslInit _value;
+ private int _count = -1;
+
+ public SaslInitWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslInit value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getHostname() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getInitialResponse() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getMechanism() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000041L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<SaslInit>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslInit value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getMechanism();
+
+ case 1:
+ return _value.getInitialResponse();
+
+ case 2:
+ return _value.getHostname();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<SaslInit> FACTORY = new Factory<SaslInit>()
+ {
+
+ public ValueWriter<SaslInit> newInstance(Registry registry)
+ {
+ return new SaslInitWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(SaslInit.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsConstructor.java
new file mode 100644
index 0000000000..0fcdbd2a1a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsConstructor.java
@@ -0,0 +1,106 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslMechanisms;
+
+
+import java.util.List;
+
+public class SaslMechanismsConstructor extends DescribedTypeConstructor<SaslMechanisms>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:sasl-mechanisms:list"),UnsignedLong.valueOf(0x0000000000000040L),
+ };
+
+ private static final SaslMechanismsConstructor INSTANCE = new SaslMechanismsConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public SaslMechanisms construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ SaslMechanisms obj = new SaslMechanisms();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setSaslServerMechanisms( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setSaslServerMechanisms( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsWriter.java
new file mode 100644
index 0000000000..e630cd0a2f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslMechanismsWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.security.SaslMechanisms;
+
+public class SaslMechanismsWriter extends AbstractDescribedTypeWriter<SaslMechanisms>
+{
+ private SaslMechanisms _value;
+ private int _count = -1;
+
+ public SaslMechanismsWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslMechanisms value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getSaslServerMechanisms() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000040L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<SaslMechanisms>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslMechanisms value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getSaslServerMechanisms();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<SaslMechanisms> FACTORY = new Factory<SaslMechanisms>()
+ {
+
+ public ValueWriter<SaslMechanisms> newInstance(Registry registry)
+ {
+ return new SaslMechanismsWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(SaslMechanisms.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeConstructor.java
new file mode 100644
index 0000000000..b1c4760d3e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeConstructor.java
@@ -0,0 +1,126 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslOutcome;
+
+
+import java.util.List;
+
+public class SaslOutcomeConstructor extends DescribedTypeConstructor<SaslOutcome>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:sasl-outcome:list"),UnsignedLong.valueOf(0x0000000000000044L),
+ };
+
+ private static final SaslOutcomeConstructor INSTANCE = new SaslOutcomeConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public SaslOutcome construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ SaslOutcome obj = new SaslOutcome();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setCode( SaslCode.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAdditionalData( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeWriter.java
new file mode 100644
index 0000000000..7c35900ccc
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslOutcomeWriter.java
@@ -0,0 +1,158 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.security.SaslOutcome;
+
+public class SaslOutcomeWriter extends AbstractDescribedTypeWriter<SaslOutcome>
+{
+ private SaslOutcome _value;
+ private int _count = -1;
+
+ public SaslOutcomeWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslOutcome value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getAdditionalData() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getCode() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000044L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<SaslOutcome>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslOutcome value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getCode();
+
+ case 1:
+ return _value.getAdditionalData();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<SaslOutcome> FACTORY = new Factory<SaslOutcome>()
+ {
+
+ public ValueWriter<SaslOutcome> newInstance(Registry registry)
+ {
+ return new SaslOutcomeWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(SaslOutcome.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseConstructor.java
new file mode 100644
index 0000000000..364cf59a2f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.security.*;
+import org.apache.qpid.amqp_1_0.type.security.SaslResponse;
+
+
+import java.util.List;
+
+public class SaslResponseConstructor extends DescribedTypeConstructor<SaslResponse>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:sasl-response:list"),UnsignedLong.valueOf(0x0000000000000043L),
+ };
+
+ private static final SaslResponseConstructor INSTANCE = new SaslResponseConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public SaslResponse construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ SaslResponse obj = new SaslResponse();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setResponse( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseWriter.java
new file mode 100644
index 0000000000..a8d63085c2
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/security/codec/SaslResponseWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.security.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.security.SaslResponse;
+
+public class SaslResponseWriter extends AbstractDescribedTypeWriter<SaslResponse>
+{
+ private SaslResponse _value;
+ private int _count = -1;
+
+ public SaslResponseWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslResponse value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getResponse() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000043L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<SaslResponse>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final SaslResponse value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getResponse();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<SaslResponse> FACTORY = new Factory<SaslResponse>()
+ {
+
+ public ValueWriter<SaslResponse> newInstance(Registry registry)
+ {
+ return new SaslResponseWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(SaslResponse.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Coordinator.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Coordinator.java
new file mode 100644
index 0000000000..0417cefd35
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Coordinator.java
@@ -0,0 +1,70 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import java.util.Arrays;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Coordinator
+ implements Target
+ {
+
+
+ private TxnCapability[] _capabilities;
+
+ public TxnCapability[] getCapabilities()
+ {
+ return _capabilities;
+ }
+
+ public void setCapabilities(TxnCapability[] capabilities)
+ {
+ _capabilities = capabilities;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Coordinator{");
+ final int origLength = builder.length();
+
+ if(_capabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("capabilities=").append(Arrays.asList(_capabilities));
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declare.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declare.java
new file mode 100644
index 0000000000..5ec8993392
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declare.java
@@ -0,0 +1,66 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Declare
+ {
+
+
+ private GlobalTxId _globalId;
+
+ public GlobalTxId getGlobalId()
+ {
+ return _globalId;
+ }
+
+ public void setGlobalId(GlobalTxId globalId)
+ {
+ _globalId = globalId;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Declare{");
+ final int origLength = builder.length();
+
+ if(_globalId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("globalId=").append(_globalId);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declared.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declared.java
new file mode 100644
index 0000000000..4878cc3ccf
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Declared.java
@@ -0,0 +1,67 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Declared
+ implements DeliveryState, Outcome
+ {
+
+
+ private Binary _txnId;
+
+ public Binary getTxnId()
+ {
+ return _txnId;
+ }
+
+ public void setTxnId(Binary txnId)
+ {
+ _txnId = txnId;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Declared{");
+ final int origLength = builder.length();
+
+ if(_txnId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("txnId=").append(_txnId);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Discharge.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Discharge.java
new file mode 100644
index 0000000000..356380608b
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/Discharge.java
@@ -0,0 +1,87 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Discharge
+ {
+
+
+ private Binary _txnId;
+
+ private Boolean _fail;
+
+ public Binary getTxnId()
+ {
+ return _txnId;
+ }
+
+ public void setTxnId(Binary txnId)
+ {
+ _txnId = txnId;
+ }
+
+ public Boolean getFail()
+ {
+ return _fail;
+ }
+
+ public void setFail(Boolean fail)
+ {
+ _fail = fail;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Discharge{");
+ final int origLength = builder.length();
+
+ if(_txnId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("txnId=").append(_txnId);
+ }
+
+ if(_fail != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("fail=").append(_fail);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionErrors.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionErrors.java
new file mode 100644
index 0000000000..b87a7eea91
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionErrors.java
@@ -0,0 +1,107 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class TransactionErrors
+ implements ErrorCondition, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final TransactionErrors UNKNOWN_ID = new TransactionErrors(Symbol.valueOf("amqp:transaction:unknown-id"));
+
+ public static final TransactionErrors TRANSACTION_ROLLBACK = new TransactionErrors(Symbol.valueOf("amqp:transaction:rollback"));
+
+ public static final TransactionErrors TRANSACTION_TIMEOUT = new TransactionErrors(Symbol.valueOf("amqp:transaction:timeout"));
+
+
+
+ private TransactionErrors(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == UNKNOWN_ID)
+ {
+ return "unknown-id";
+ }
+
+ if(this == TRANSACTION_ROLLBACK)
+ {
+ return "transaction-rollback";
+ }
+
+ if(this == TRANSACTION_TIMEOUT)
+ {
+ return "transaction-timeout";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static TransactionErrors valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(UNKNOWN_ID._val.equals(val))
+ {
+ return UNKNOWN_ID;
+ }
+
+ if(TRANSACTION_ROLLBACK._val.equals(val))
+ {
+ return TRANSACTION_ROLLBACK;
+ }
+
+ if(TRANSACTION_TIMEOUT._val.equals(val))
+ {
+ return TRANSACTION_TIMEOUT;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionalState.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionalState.java
new file mode 100644
index 0000000000..b4fe564cf1
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TransactionalState.java
@@ -0,0 +1,88 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class TransactionalState
+ implements DeliveryState
+ {
+
+
+ private Binary _txnId;
+
+ private Outcome _outcome;
+
+ public Binary getTxnId()
+ {
+ return _txnId;
+ }
+
+ public void setTxnId(Binary txnId)
+ {
+ _txnId = txnId;
+ }
+
+ public Outcome getOutcome()
+ {
+ return _outcome;
+ }
+
+ public void setOutcome(Outcome outcome)
+ {
+ _outcome = outcome;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("TransactionalState{");
+ final int origLength = builder.length();
+
+ if(_txnId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("txnId=").append(_txnId);
+ }
+
+ if(_outcome != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("outcome=").append(_outcome);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapabilities.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapabilities.java
new file mode 100644
index 0000000000..840cc57d27
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapabilities.java
@@ -0,0 +1,144 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.TxnCapability;
+
+public class TxnCapabilities
+ implements TxnCapability, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final TxnCapabilities LOCAL_TXN = new TxnCapabilities(Symbol.valueOf("amqp:local-transactions"));
+
+ public static final TxnCapabilities DISTRIBUTED_TXN = new TxnCapabilities(Symbol.valueOf("amqp:distributed-transactions"));
+
+ public static final TxnCapabilities PROMOTABLE_TXN = new TxnCapabilities(Symbol.valueOf("amqp:promotable-transactions"));
+
+ public static final TxnCapabilities MULTI_TXNS_PER_SSN = new TxnCapabilities(Symbol.valueOf("amqp:multi-txns-per-ssn"));
+
+ public static final TxnCapabilities MULTI_SSNS_PER_TXN = new TxnCapabilities(Symbol.valueOf("amqp:multi-ssns-per-txn"));
+
+ public static final TxnCapabilities MULTI_CONNS_PER_TXN = new TxnCapabilities(Symbol.valueOf("amqp:multi-conns-per-txn"));
+
+
+
+ private TxnCapabilities(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == LOCAL_TXN)
+ {
+ return "local-txn";
+ }
+
+ if(this == DISTRIBUTED_TXN)
+ {
+ return "distributed-txn";
+ }
+
+ if(this == PROMOTABLE_TXN)
+ {
+ return "promotable-txn";
+ }
+
+ if(this == MULTI_TXNS_PER_SSN)
+ {
+ return "multi-txns-per-ssn";
+ }
+
+ if(this == MULTI_SSNS_PER_TXN)
+ {
+ return "multi-ssns-per-txn";
+ }
+
+ if(this == MULTI_CONNS_PER_TXN)
+ {
+ return "multi-conns-per-txn";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static TxnCapabilities valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(LOCAL_TXN._val.equals(val))
+ {
+ return LOCAL_TXN;
+ }
+
+ if(DISTRIBUTED_TXN._val.equals(val))
+ {
+ return DISTRIBUTED_TXN;
+ }
+
+ if(PROMOTABLE_TXN._val.equals(val))
+ {
+ return PROMOTABLE_TXN;
+ }
+
+ if(MULTI_TXNS_PER_SSN._val.equals(val))
+ {
+ return MULTI_TXNS_PER_SSN;
+ }
+
+ if(MULTI_SSNS_PER_TXN._val.equals(val))
+ {
+ return MULTI_SSNS_PER_TXN;
+ }
+
+ if(MULTI_CONNS_PER_TXN._val.equals(val))
+ {
+ return MULTI_CONNS_PER_TXN;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapability.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapability.java
new file mode 100644
index 0000000000..19763f5b6b
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/TxnCapability.java
@@ -0,0 +1,131 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class TxnCapability
+ implements org.apache.qpid.amqp_1_0.type.TxnCapability, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final TxnCapability LOCAL_TXN = new TxnCapability(Symbol.valueOf("amqp:local-transactions"));
+
+ public static final TxnCapability DISTRIBUTED_TXN = new TxnCapability(Symbol.valueOf("amqp:distributed-transactions"));
+
+ public static final TxnCapability PROMOTABLE_TXN = new TxnCapability(Symbol.valueOf("amqp:promotable-transactions"));
+
+ public static final TxnCapability MULTI_TXNS_PER_SSN = new TxnCapability(Symbol.valueOf("amqp:multi-txns-per-ssn"));
+
+ public static final TxnCapability MULTI_SSNS_PER_TXN = new TxnCapability(Symbol.valueOf("amqp:multi-ssns-per-txn"));
+
+
+
+ private TxnCapability(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == LOCAL_TXN)
+ {
+ return "local-txn";
+ }
+
+ if(this == DISTRIBUTED_TXN)
+ {
+ return "distributed-txn";
+ }
+
+ if(this == PROMOTABLE_TXN)
+ {
+ return "promotable-txn";
+ }
+
+ if(this == MULTI_TXNS_PER_SSN)
+ {
+ return "multi-txns-per-ssn";
+ }
+
+ if(this == MULTI_SSNS_PER_TXN)
+ {
+ return "multi-ssns-per-txn";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static TxnCapability valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(LOCAL_TXN._val.equals(val))
+ {
+ return LOCAL_TXN;
+ }
+
+ if(DISTRIBUTED_TXN._val.equals(val))
+ {
+ return DISTRIBUTED_TXN;
+ }
+
+ if(PROMOTABLE_TXN._val.equals(val))
+ {
+ return PROMOTABLE_TXN;
+ }
+
+ if(MULTI_TXNS_PER_SSN._val.equals(val))
+ {
+ return MULTI_TXNS_PER_SSN;
+ }
+
+ if(MULTI_SSNS_PER_TXN._val.equals(val))
+ {
+ return MULTI_SSNS_PER_TXN;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorConstructor.java
new file mode 100644
index 0000000000..de1dbc625e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorConstructor.java
@@ -0,0 +1,117 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.Coordinator;
+import org.apache.qpid.amqp_1_0.type.transaction.TxnCapability;
+
+import java.util.List;
+
+public class CoordinatorConstructor extends DescribedTypeConstructor<Coordinator>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:coordinator:list"),UnsignedLong.valueOf(0x0000000000000030L),
+ };
+
+ private static final CoordinatorConstructor INSTANCE = new CoordinatorConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Coordinator construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Coordinator obj = new Coordinator();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof TxnCapability[] )
+ {
+ obj.setCapabilities( (TxnCapability[]) val );
+ }
+ else if (val instanceof Symbol[])
+ {
+ Symbol[] symVal = (Symbol[]) val;
+ TxnCapability[] cap = new TxnCapability[symVal.length];
+ int i = 0;
+ for(Symbol sym : symVal)
+ {
+ cap[i++] = TxnCapability.valueOf(sym);
+ }
+ obj.setCapabilities(cap);
+ }
+ else
+ {
+ try
+ {
+ obj.setCapabilities( new TxnCapability[] { (TxnCapability) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorWriter.java
new file mode 100644
index 0000000000..56e3993046
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/CoordinatorWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transaction.Coordinator;
+
+public class CoordinatorWriter extends AbstractDescribedTypeWriter<Coordinator>
+{
+ private Coordinator _value;
+ private int _count = -1;
+
+ public CoordinatorWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Coordinator value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getCapabilities() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000030L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Coordinator>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Coordinator value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getCapabilities();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Coordinator> FACTORY = new Factory<Coordinator>()
+ {
+
+ public ValueWriter<Coordinator> newInstance(Registry registry)
+ {
+ return new CoordinatorWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Coordinator.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareConstructor.java
new file mode 100644
index 0000000000..7eaf7dd9a8
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.Declare;
+
+
+import java.util.List;
+
+public class DeclareConstructor extends DescribedTypeConstructor<Declare>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:declare:list"),UnsignedLong.valueOf(0x0000000000000031L),
+ };
+
+ private static final DeclareConstructor INSTANCE = new DeclareConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Declare construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Declare obj = new Declare();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setGlobalId( (GlobalTxId) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareWriter.java
new file mode 100644
index 0000000000..bf0687fe92
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclareWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transaction.Declare;
+
+public class DeclareWriter extends AbstractDescribedTypeWriter<Declare>
+{
+ private Declare _value;
+ private int _count = -1;
+
+ public DeclareWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Declare value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getGlobalId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000031L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Declare>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Declare value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getGlobalId();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Declare> FACTORY = new Factory<Declare>()
+ {
+
+ public ValueWriter<Declare> newInstance(Registry registry)
+ {
+ return new DeclareWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Declare.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredConstructor.java
new file mode 100644
index 0000000000..1e226ff994
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.Declared;
+
+
+import java.util.List;
+
+public class DeclaredConstructor extends DescribedTypeConstructor<Declared>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:declared:list"),UnsignedLong.valueOf(0x0000000000000033L),
+ };
+
+ private static final DeclaredConstructor INSTANCE = new DeclaredConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Declared construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Declared obj = new Declared();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTxnId( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredWriter.java
new file mode 100644
index 0000000000..798ffcc72b
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DeclaredWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transaction.Declared;
+
+public class DeclaredWriter extends AbstractDescribedTypeWriter<Declared>
+{
+ private Declared _value;
+ private int _count = -1;
+
+ public DeclaredWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Declared value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getTxnId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000033L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Declared>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Declared value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getTxnId();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Declared> FACTORY = new Factory<Declared>()
+ {
+
+ public ValueWriter<Declared> newInstance(Registry registry)
+ {
+ return new DeclaredWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Declared.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeConstructor.java
new file mode 100644
index 0000000000..ab088cc74d
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeConstructor.java
@@ -0,0 +1,126 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.Discharge;
+
+
+import java.util.List;
+
+public class DischargeConstructor extends DescribedTypeConstructor<Discharge>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:discharge:list"),UnsignedLong.valueOf(0x0000000000000032L),
+ };
+
+ private static final DischargeConstructor INSTANCE = new DischargeConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Discharge construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Discharge obj = new Discharge();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTxnId( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setFail( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeWriter.java
new file mode 100644
index 0000000000..ddd8678418
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/DischargeWriter.java
@@ -0,0 +1,158 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transaction.Discharge;
+
+public class DischargeWriter extends AbstractDescribedTypeWriter<Discharge>
+{
+ private Discharge _value;
+ private int _count = -1;
+
+ public DischargeWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Discharge value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getFail() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getTxnId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000032L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Discharge>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Discharge value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getTxnId();
+
+ case 1:
+ return _value.getFail();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Discharge> FACTORY = new Factory<Discharge>()
+ {
+
+ public ValueWriter<Discharge> newInstance(Registry registry)
+ {
+ return new DischargeWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Discharge.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateConstructor.java
new file mode 100644
index 0000000000..88cddba562
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateConstructor.java
@@ -0,0 +1,126 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.*;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+
+
+import java.util.List;
+
+public class TransactionalStateConstructor extends DescribedTypeConstructor<TransactionalState>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:transactional-state:list"),UnsignedLong.valueOf(0x0000000000000034L),
+ };
+
+ private static final TransactionalStateConstructor INSTANCE = new TransactionalStateConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public TransactionalState construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ TransactionalState obj = new TransactionalState();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTxnId( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setOutcome( (Outcome) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateWriter.java
new file mode 100644
index 0000000000..ea450fcf35
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transaction/codec/TransactionalStateWriter.java
@@ -0,0 +1,158 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transaction.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+
+public class TransactionalStateWriter extends AbstractDescribedTypeWriter<TransactionalState>
+{
+ private TransactionalState _value;
+ private int _count = -1;
+
+ public TransactionalStateWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final TransactionalState value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getOutcome() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getTxnId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000034L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<TransactionalState>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final TransactionalState value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getTxnId();
+
+ case 1:
+ return _value.getOutcome();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<TransactionalState> FACTORY = new Factory<TransactionalState>()
+ {
+
+ public ValueWriter<TransactionalState> newInstance(Registry registry)
+ {
+ return new TransactionalStateWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(TransactionalState.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/AmqpError.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/AmqpError.java
new file mode 100644
index 0000000000..075a80ef90
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/AmqpError.java
@@ -0,0 +1,227 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class AmqpError
+ implements ErrorCondition, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final AmqpError INTERNAL_ERROR = new AmqpError(Symbol.valueOf("amqp:internal-error"));
+
+ public static final AmqpError NOT_FOUND = new AmqpError(Symbol.valueOf("amqp:not-found"));
+
+ public static final AmqpError UNAUTHORIZED_ACCESS = new AmqpError(Symbol.valueOf("amqp:unauthorized-access"));
+
+ public static final AmqpError DECODE_ERROR = new AmqpError(Symbol.valueOf("amqp:decode-error"));
+
+ public static final AmqpError RESOURCE_LIMIT_EXCEEDED = new AmqpError(Symbol.valueOf("amqp:resource-limit-exceeded"));
+
+ public static final AmqpError NOT_ALLOWED = new AmqpError(Symbol.valueOf("amqp:not-allowed"));
+
+ public static final AmqpError INVALID_FIELD = new AmqpError(Symbol.valueOf("amqp:invalid-field"));
+
+ public static final AmqpError NOT_IMPLEMENTED = new AmqpError(Symbol.valueOf("amqp:not-implemented"));
+
+ public static final AmqpError RESOURCE_LOCKED = new AmqpError(Symbol.valueOf("amqp:resource-locked"));
+
+ public static final AmqpError PRECONDITION_FAILED = new AmqpError(Symbol.valueOf("amqp:precondition-failed"));
+
+ public static final AmqpError RESOURCE_DELETED = new AmqpError(Symbol.valueOf("amqp:resource-deleted"));
+
+ public static final AmqpError ILLEGAL_STATE = new AmqpError(Symbol.valueOf("amqp:illegal-state"));
+
+ public static final AmqpError FRAME_SIZE_TOO_SMALL = new AmqpError(Symbol.valueOf("amqp:frame-size-too-small"));
+
+
+
+ private AmqpError(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == INTERNAL_ERROR)
+ {
+ return "internal-error";
+ }
+
+ if(this == NOT_FOUND)
+ {
+ return "not-found";
+ }
+
+ if(this == UNAUTHORIZED_ACCESS)
+ {
+ return "unauthorized-access";
+ }
+
+ if(this == DECODE_ERROR)
+ {
+ return "decode-error";
+ }
+
+ if(this == RESOURCE_LIMIT_EXCEEDED)
+ {
+ return "resource-limit-exceeded";
+ }
+
+ if(this == NOT_ALLOWED)
+ {
+ return "not-allowed";
+ }
+
+ if(this == INVALID_FIELD)
+ {
+ return "invalid-field";
+ }
+
+ if(this == NOT_IMPLEMENTED)
+ {
+ return "not-implemented";
+ }
+
+ if(this == RESOURCE_LOCKED)
+ {
+ return "resource-locked";
+ }
+
+ if(this == PRECONDITION_FAILED)
+ {
+ return "precondition-failed";
+ }
+
+ if(this == RESOURCE_DELETED)
+ {
+ return "resource-deleted";
+ }
+
+ if(this == ILLEGAL_STATE)
+ {
+ return "illegal-state";
+ }
+
+ if(this == FRAME_SIZE_TOO_SMALL)
+ {
+ return "frame-size-too-small";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static AmqpError valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(INTERNAL_ERROR._val.equals(val))
+ {
+ return INTERNAL_ERROR;
+ }
+
+ if(NOT_FOUND._val.equals(val))
+ {
+ return NOT_FOUND;
+ }
+
+ if(UNAUTHORIZED_ACCESS._val.equals(val))
+ {
+ return UNAUTHORIZED_ACCESS;
+ }
+
+ if(DECODE_ERROR._val.equals(val))
+ {
+ return DECODE_ERROR;
+ }
+
+ if(RESOURCE_LIMIT_EXCEEDED._val.equals(val))
+ {
+ return RESOURCE_LIMIT_EXCEEDED;
+ }
+
+ if(NOT_ALLOWED._val.equals(val))
+ {
+ return NOT_ALLOWED;
+ }
+
+ if(INVALID_FIELD._val.equals(val))
+ {
+ return INVALID_FIELD;
+ }
+
+ if(NOT_IMPLEMENTED._val.equals(val))
+ {
+ return NOT_IMPLEMENTED;
+ }
+
+ if(RESOURCE_LOCKED._val.equals(val))
+ {
+ return RESOURCE_LOCKED;
+ }
+
+ if(PRECONDITION_FAILED._val.equals(val))
+ {
+ return PRECONDITION_FAILED;
+ }
+
+ if(RESOURCE_DELETED._val.equals(val))
+ {
+ return RESOURCE_DELETED;
+ }
+
+ if(ILLEGAL_STATE._val.equals(val))
+ {
+ return ILLEGAL_STATE;
+ }
+
+ if(FRAME_SIZE_TOO_SMALL._val.equals(val))
+ {
+ return FRAME_SIZE_TOO_SMALL;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Attach.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Attach.java
new file mode 100644
index 0000000000..d01dd0146c
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Attach.java
@@ -0,0 +1,365 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.util.Map;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Attach
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private String _name;
+
+ private UnsignedInteger _handle;
+
+ private Role _role;
+
+ private SenderSettleMode _sndSettleMode;
+
+ private ReceiverSettleMode _rcvSettleMode;
+
+ private Source _source;
+
+ private Target _target;
+
+ private Map _unsettled;
+
+ private Boolean _incompleteUnsettled;
+
+ private UnsignedInteger _initialDeliveryCount;
+
+ private UnsignedLong _maxMessageSize;
+
+ private Symbol[] _offeredCapabilities;
+
+ private Symbol[] _desiredCapabilities;
+
+ private Map _properties;
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public void setName(String name)
+ {
+ _name = name;
+ }
+
+ public UnsignedInteger getHandle()
+ {
+ return _handle;
+ }
+
+ public void setHandle(UnsignedInteger handle)
+ {
+ _handle = handle;
+ }
+
+ public Role getRole()
+ {
+ return _role;
+ }
+
+ public void setRole(Role role)
+ {
+ _role = role;
+ }
+
+ public SenderSettleMode getSndSettleMode()
+ {
+ return _sndSettleMode;
+ }
+
+ public void setSndSettleMode(SenderSettleMode sndSettleMode)
+ {
+ _sndSettleMode = sndSettleMode;
+ }
+
+ public ReceiverSettleMode getRcvSettleMode()
+ {
+ return _rcvSettleMode;
+ }
+
+ public void setRcvSettleMode(ReceiverSettleMode rcvSettleMode)
+ {
+ _rcvSettleMode = rcvSettleMode;
+ }
+
+ public Source getSource()
+ {
+ return _source;
+ }
+
+ public void setSource(Source source)
+ {
+ _source = source;
+ }
+
+ public Target getTarget()
+ {
+ return _target;
+ }
+
+ public void setTarget(Target target)
+ {
+ _target = target;
+ }
+
+ public Map getUnsettled()
+ {
+ return _unsettled;
+ }
+
+ public void setUnsettled(Map unsettled)
+ {
+ _unsettled = unsettled;
+ }
+
+ public Boolean getIncompleteUnsettled()
+ {
+ return _incompleteUnsettled;
+ }
+
+ public void setIncompleteUnsettled(Boolean incompleteUnsettled)
+ {
+ _incompleteUnsettled = incompleteUnsettled;
+ }
+
+ public UnsignedInteger getInitialDeliveryCount()
+ {
+ return _initialDeliveryCount;
+ }
+
+ public void setInitialDeliveryCount(UnsignedInteger initialDeliveryCount)
+ {
+ _initialDeliveryCount = initialDeliveryCount;
+ }
+
+ public UnsignedLong getMaxMessageSize()
+ {
+ return _maxMessageSize;
+ }
+
+ public void setMaxMessageSize(UnsignedLong maxMessageSize)
+ {
+ _maxMessageSize = maxMessageSize;
+ }
+
+ public Symbol[] getOfferedCapabilities()
+ {
+ return _offeredCapabilities;
+ }
+
+ public void setOfferedCapabilities(Symbol[] offeredCapabilities)
+ {
+ _offeredCapabilities = offeredCapabilities;
+ }
+
+ public Symbol[] getDesiredCapabilities()
+ {
+ return _desiredCapabilities;
+ }
+
+ public void setDesiredCapabilities(Symbol[] desiredCapabilities)
+ {
+ _desiredCapabilities = desiredCapabilities;
+ }
+
+ public Map getProperties()
+ {
+ return _properties;
+ }
+
+ public void setProperties(Map properties)
+ {
+ _properties = properties;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Attach{");
+ final int origLength = builder.length();
+
+ if(_name != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("name=").append(_name);
+ }
+
+ if(_handle != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("handle=").append(_handle);
+ }
+
+ if(_role != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("role=").append(_role);
+ }
+
+ if(_sndSettleMode != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("sndSettleMode=").append(_sndSettleMode);
+ }
+
+ if(_rcvSettleMode != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("rcvSettleMode=").append(_rcvSettleMode);
+ }
+
+ if(_source != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("source=").append(_source);
+ }
+
+ if(_target != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("target=").append(_target);
+ }
+
+ if(_unsettled != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("unsettled=").append(_unsettled);
+ }
+
+ if(_incompleteUnsettled != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("incompleteUnsettled=").append(_incompleteUnsettled);
+ }
+
+ if(_initialDeliveryCount != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("initialDeliveryCount=").append(_initialDeliveryCount);
+ }
+
+ if(_maxMessageSize != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("maxMessageSize=").append(_maxMessageSize);
+ }
+
+ if(_offeredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("offeredCapabilities=").append(_offeredCapabilities);
+ }
+
+ if(_desiredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("desiredCapabilities=").append(_desiredCapabilities);
+ }
+
+ if(_properties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("properties=").append(_properties);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveAttach(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Begin.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Begin.java
new file mode 100644
index 0000000000..558fcbf780
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Begin.java
@@ -0,0 +1,239 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.util.Map;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Begin
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private UnsignedShort _remoteChannel;
+
+ private UnsignedInteger _nextOutgoingId;
+
+ private UnsignedInteger _incomingWindow;
+
+ private UnsignedInteger _outgoingWindow;
+
+ private UnsignedInteger _handleMax;
+
+ private Symbol[] _offeredCapabilities;
+
+ private Symbol[] _desiredCapabilities;
+
+ private Map _properties;
+
+ public UnsignedShort getRemoteChannel()
+ {
+ return _remoteChannel;
+ }
+
+ public void setRemoteChannel(UnsignedShort remoteChannel)
+ {
+ _remoteChannel = remoteChannel;
+ }
+
+ public UnsignedInteger getNextOutgoingId()
+ {
+ return _nextOutgoingId;
+ }
+
+ public void setNextOutgoingId(UnsignedInteger nextOutgoingId)
+ {
+ _nextOutgoingId = nextOutgoingId;
+ }
+
+ public UnsignedInteger getIncomingWindow()
+ {
+ return _incomingWindow;
+ }
+
+ public void setIncomingWindow(UnsignedInteger incomingWindow)
+ {
+ _incomingWindow = incomingWindow;
+ }
+
+ public UnsignedInteger getOutgoingWindow()
+ {
+ return _outgoingWindow;
+ }
+
+ public void setOutgoingWindow(UnsignedInteger outgoingWindow)
+ {
+ _outgoingWindow = outgoingWindow;
+ }
+
+ public UnsignedInteger getHandleMax()
+ {
+ return _handleMax;
+ }
+
+ public void setHandleMax(UnsignedInteger handleMax)
+ {
+ _handleMax = handleMax;
+ }
+
+ public Symbol[] getOfferedCapabilities()
+ {
+ return _offeredCapabilities;
+ }
+
+ public void setOfferedCapabilities(Symbol[] offeredCapabilities)
+ {
+ _offeredCapabilities = offeredCapabilities;
+ }
+
+ public Symbol[] getDesiredCapabilities()
+ {
+ return _desiredCapabilities;
+ }
+
+ public void setDesiredCapabilities(Symbol[] desiredCapabilities)
+ {
+ _desiredCapabilities = desiredCapabilities;
+ }
+
+ public Map getProperties()
+ {
+ return _properties;
+ }
+
+ public void setProperties(Map properties)
+ {
+ _properties = properties;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Begin{");
+ final int origLength = builder.length();
+
+ if(_remoteChannel != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("remoteChannel=").append(_remoteChannel);
+ }
+
+ if(_nextOutgoingId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("nextOutgoingId=").append(_nextOutgoingId);
+ }
+
+ if(_incomingWindow != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("incomingWindow=").append(_incomingWindow);
+ }
+
+ if(_outgoingWindow != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("outgoingWindow=").append(_outgoingWindow);
+ }
+
+ if(_handleMax != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("handleMax=").append(_handleMax);
+ }
+
+ if(_offeredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("offeredCapabilities=").append(_offeredCapabilities);
+ }
+
+ if(_desiredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("desiredCapabilities=").append(_desiredCapabilities);
+ }
+
+ if(_properties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("properties=").append(_properties);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveBegin(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Close.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Close.java
new file mode 100644
index 0000000000..e86342d531
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Close.java
@@ -0,0 +1,89 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Close
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private Error _error;
+
+ public Error getError()
+ {
+ return _error;
+ }
+
+ public void setError(Error error)
+ {
+ _error = error;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Close{");
+ final int origLength = builder.length();
+
+ if(_error != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("error=").append(_error);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveClose(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ConnectionError.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ConnectionError.java
new file mode 100644
index 0000000000..07f0496e23
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ConnectionError.java
@@ -0,0 +1,107 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class ConnectionError
+ implements ErrorCondition, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final ConnectionError CONNECTION_FORCED = new ConnectionError(Symbol.valueOf("amqp:connection:forced"));
+
+ public static final ConnectionError FRAMING_ERROR = new ConnectionError(Symbol.valueOf("amqp:connection:framing-error"));
+
+ public static final ConnectionError REDIRECT = new ConnectionError(Symbol.valueOf("amqp:connection:redirect"));
+
+
+
+ private ConnectionError(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == CONNECTION_FORCED)
+ {
+ return "connection-forced";
+ }
+
+ if(this == FRAMING_ERROR)
+ {
+ return "framing-error";
+ }
+
+ if(this == REDIRECT)
+ {
+ return "redirect";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static ConnectionError valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(CONNECTION_FORCED._val.equals(val))
+ {
+ return CONNECTION_FORCED;
+ }
+
+ if(FRAMING_ERROR._val.equals(val))
+ {
+ return FRAMING_ERROR;
+ }
+
+ if(REDIRECT._val.equals(val))
+ {
+ return REDIRECT;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Detach.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Detach.java
new file mode 100644
index 0000000000..f788201328
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Detach.java
@@ -0,0 +1,131 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Detach
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private UnsignedInteger _handle;
+
+ private Boolean _closed;
+
+ private Error _error;
+
+ public UnsignedInteger getHandle()
+ {
+ return _handle;
+ }
+
+ public void setHandle(UnsignedInteger handle)
+ {
+ _handle = handle;
+ }
+
+ public Boolean getClosed()
+ {
+ return _closed;
+ }
+
+ public void setClosed(Boolean closed)
+ {
+ _closed = closed;
+ }
+
+ public Error getError()
+ {
+ return _error;
+ }
+
+ public void setError(Error error)
+ {
+ _error = error;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Detach{");
+ final int origLength = builder.length();
+
+ if(_handle != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("handle=").append(_handle);
+ }
+
+ if(_closed != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("closed=").append(_closed);
+ }
+
+ if(_error != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("error=").append(_error);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveDetach(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Disposition.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Disposition.java
new file mode 100644
index 0000000000..c7f04dedca
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Disposition.java
@@ -0,0 +1,194 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Disposition
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private Role _role;
+
+ private UnsignedInteger _first;
+
+ private UnsignedInteger _last;
+
+ private Boolean _settled;
+
+ private DeliveryState _state;
+
+ private Boolean _batchable;
+
+ public Role getRole()
+ {
+ return _role;
+ }
+
+ public void setRole(Role role)
+ {
+ _role = role;
+ }
+
+ public UnsignedInteger getFirst()
+ {
+ return _first;
+ }
+
+ public void setFirst(UnsignedInteger first)
+ {
+ _first = first;
+ }
+
+ public UnsignedInteger getLast()
+ {
+ return _last;
+ }
+
+ public void setLast(UnsignedInteger last)
+ {
+ _last = last;
+ }
+
+ public Boolean getSettled()
+ {
+ return _settled;
+ }
+
+ public void setSettled(Boolean settled)
+ {
+ _settled = settled;
+ }
+
+ public DeliveryState getState()
+ {
+ return _state;
+ }
+
+ public void setState(DeliveryState state)
+ {
+ _state = state;
+ }
+
+ public Boolean getBatchable()
+ {
+ return _batchable;
+ }
+
+ public void setBatchable(Boolean batchable)
+ {
+ _batchable = batchable;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Disposition{");
+ final int origLength = builder.length();
+
+ if(_role != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("role=").append(_role);
+ }
+
+ if(_first != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("first=").append(_first);
+ }
+
+ if(_last != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("last=").append(_last);
+ }
+
+ if(_settled != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("settled=").append(_settled);
+ }
+
+ if(_state != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("state=").append(_state);
+ }
+
+ if(_batchable != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("batchable=").append(_batchable);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveDisposition(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/End.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/End.java
new file mode 100644
index 0000000000..63fc331360
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/End.java
@@ -0,0 +1,89 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class End
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private Error _error;
+
+ public Error getError()
+ {
+ return _error;
+ }
+
+ public void setError(Error error)
+ {
+ _error = error;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("End{");
+ final int origLength = builder.length();
+
+ if(_error != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("error=").append(_error);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveEnd(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Error.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Error.java
new file mode 100644
index 0000000000..6e1af84cc9
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Error.java
@@ -0,0 +1,111 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import java.util.Map;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Error
+ {
+
+
+ private ErrorCondition _condition;
+
+ private String _description;
+
+ private Map _info;
+
+ public ErrorCondition getCondition()
+ {
+ return _condition;
+ }
+
+ public void setCondition(ErrorCondition condition)
+ {
+ _condition = condition;
+ }
+
+ public String getDescription()
+ {
+ return _description;
+ }
+
+ public void setDescription(String description)
+ {
+ _description = description;
+ }
+
+ public Map getInfo()
+ {
+ return _info;
+ }
+
+ public void setInfo(Map info)
+ {
+ _info = info;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Error{");
+ final int origLength = builder.length();
+
+ if(_condition != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("condition=").append(_condition);
+ }
+
+ if(_description != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("description=").append(_description);
+ }
+
+ if(_info != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("info=").append(_info);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Flow.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Flow.java
new file mode 100644
index 0000000000..118d163841
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Flow.java
@@ -0,0 +1,302 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.util.Map;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Flow
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private UnsignedInteger _nextIncomingId;
+
+ private UnsignedInteger _incomingWindow;
+
+ private UnsignedInteger _nextOutgoingId;
+
+ private UnsignedInteger _outgoingWindow;
+
+ private UnsignedInteger _handle;
+
+ private UnsignedInteger _deliveryCount;
+
+ private UnsignedInteger _linkCredit;
+
+ private UnsignedInteger _available;
+
+ private Boolean _drain;
+
+ private Boolean _echo;
+
+ private Map _properties;
+
+ public UnsignedInteger getNextIncomingId()
+ {
+ return _nextIncomingId;
+ }
+
+ public void setNextIncomingId(UnsignedInteger nextIncomingId)
+ {
+ _nextIncomingId = nextIncomingId;
+ }
+
+ public UnsignedInteger getIncomingWindow()
+ {
+ return _incomingWindow;
+ }
+
+ public void setIncomingWindow(UnsignedInteger incomingWindow)
+ {
+ _incomingWindow = incomingWindow;
+ }
+
+ public UnsignedInteger getNextOutgoingId()
+ {
+ return _nextOutgoingId;
+ }
+
+ public void setNextOutgoingId(UnsignedInteger nextOutgoingId)
+ {
+ _nextOutgoingId = nextOutgoingId;
+ }
+
+ public UnsignedInteger getOutgoingWindow()
+ {
+ return _outgoingWindow;
+ }
+
+ public void setOutgoingWindow(UnsignedInteger outgoingWindow)
+ {
+ _outgoingWindow = outgoingWindow;
+ }
+
+ public UnsignedInteger getHandle()
+ {
+ return _handle;
+ }
+
+ public void setHandle(UnsignedInteger handle)
+ {
+ _handle = handle;
+ }
+
+ public UnsignedInteger getDeliveryCount()
+ {
+ return _deliveryCount;
+ }
+
+ public void setDeliveryCount(UnsignedInteger deliveryCount)
+ {
+ _deliveryCount = deliveryCount;
+ }
+
+ public UnsignedInteger getLinkCredit()
+ {
+ return _linkCredit;
+ }
+
+ public void setLinkCredit(UnsignedInteger linkCredit)
+ {
+ _linkCredit = linkCredit;
+ }
+
+ public UnsignedInteger getAvailable()
+ {
+ return _available;
+ }
+
+ public void setAvailable(UnsignedInteger available)
+ {
+ _available = available;
+ }
+
+ public Boolean getDrain()
+ {
+ return _drain;
+ }
+
+ public void setDrain(Boolean drain)
+ {
+ _drain = drain;
+ }
+
+ public Boolean getEcho()
+ {
+ return _echo;
+ }
+
+ public void setEcho(Boolean echo)
+ {
+ _echo = echo;
+ }
+
+ public Map getProperties()
+ {
+ return _properties;
+ }
+
+ public void setProperties(Map properties)
+ {
+ _properties = properties;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Flow{");
+ final int origLength = builder.length();
+
+ if(_nextIncomingId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("nextIncomingId=").append(_nextIncomingId);
+ }
+
+ if(_incomingWindow != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("incomingWindow=").append(_incomingWindow);
+ }
+
+ if(_nextOutgoingId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("nextOutgoingId=").append(_nextOutgoingId);
+ }
+
+ if(_outgoingWindow != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("outgoingWindow=").append(_outgoingWindow);
+ }
+
+ if(_handle != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("handle=").append(_handle);
+ }
+
+ if(_deliveryCount != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("deliveryCount=").append(_deliveryCount);
+ }
+
+ if(_linkCredit != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("linkCredit=").append(_linkCredit);
+ }
+
+ if(_available != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("available=").append(_available);
+ }
+
+ if(_drain != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("drain=").append(_drain);
+ }
+
+ if(_echo != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("echo=").append(_echo);
+ }
+
+ if(_properties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("properties=").append(_properties);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveFlow(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/LinkError.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/LinkError.java
new file mode 100644
index 0000000000..3c2d025619
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/LinkError.java
@@ -0,0 +1,131 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class LinkError
+ implements ErrorCondition, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final LinkError DETACH_FORCED = new LinkError(Symbol.valueOf("amqp:link:detach-forced"));
+
+ public static final LinkError TRANSFER_LIMIT_EXCEEDED = new LinkError(Symbol.valueOf("amqp:link:transfer-limit-exceeded"));
+
+ public static final LinkError MESSAGE_SIZE_EXCEEDED = new LinkError(Symbol.valueOf("amqp:link:message-size-exceeded"));
+
+ public static final LinkError REDIRECT = new LinkError(Symbol.valueOf("amqp:link:redirect"));
+
+ public static final LinkError STOLEN = new LinkError(Symbol.valueOf("amqp:link:stolen"));
+
+
+
+ private LinkError(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == DETACH_FORCED)
+ {
+ return "detach-forced";
+ }
+
+ if(this == TRANSFER_LIMIT_EXCEEDED)
+ {
+ return "transfer-limit-exceeded";
+ }
+
+ if(this == MESSAGE_SIZE_EXCEEDED)
+ {
+ return "message-size-exceeded";
+ }
+
+ if(this == REDIRECT)
+ {
+ return "redirect";
+ }
+
+ if(this == STOLEN)
+ {
+ return "stolen";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static LinkError valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(DETACH_FORCED._val.equals(val))
+ {
+ return DETACH_FORCED;
+ }
+
+ if(TRANSFER_LIMIT_EXCEEDED._val.equals(val))
+ {
+ return TRANSFER_LIMIT_EXCEEDED;
+ }
+
+ if(MESSAGE_SIZE_EXCEEDED._val.equals(val))
+ {
+ return MESSAGE_SIZE_EXCEEDED;
+ }
+
+ if(REDIRECT._val.equals(val))
+ {
+ return REDIRECT;
+ }
+
+ if(STOLEN._val.equals(val))
+ {
+ return STOLEN;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Open.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Open.java
new file mode 100644
index 0000000000..cabee25c73
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Open.java
@@ -0,0 +1,281 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.util.Map;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Open
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private String _containerId;
+
+ private String _hostname;
+
+ private UnsignedInteger _maxFrameSize;
+
+ private UnsignedShort _channelMax;
+
+ private UnsignedInteger _idleTimeOut;
+
+ private Symbol[] _outgoingLocales;
+
+ private Symbol[] _incomingLocales;
+
+ private Symbol[] _offeredCapabilities;
+
+ private Symbol[] _desiredCapabilities;
+
+ private Map _properties;
+
+ public String getContainerId()
+ {
+ return _containerId;
+ }
+
+ public void setContainerId(String containerId)
+ {
+ _containerId = containerId;
+ }
+
+ public String getHostname()
+ {
+ return _hostname;
+ }
+
+ public void setHostname(String hostname)
+ {
+ _hostname = hostname;
+ }
+
+ public UnsignedInteger getMaxFrameSize()
+ {
+ return _maxFrameSize;
+ }
+
+ public void setMaxFrameSize(UnsignedInteger maxFrameSize)
+ {
+ _maxFrameSize = maxFrameSize;
+ }
+
+ public UnsignedShort getChannelMax()
+ {
+ return _channelMax;
+ }
+
+ public void setChannelMax(UnsignedShort channelMax)
+ {
+ _channelMax = channelMax;
+ }
+
+ public UnsignedInteger getIdleTimeOut()
+ {
+ return _idleTimeOut;
+ }
+
+ public void setIdleTimeOut(UnsignedInteger idleTimeOut)
+ {
+ _idleTimeOut = idleTimeOut;
+ }
+
+ public Symbol[] getOutgoingLocales()
+ {
+ return _outgoingLocales;
+ }
+
+ public void setOutgoingLocales(Symbol[] outgoingLocales)
+ {
+ _outgoingLocales = outgoingLocales;
+ }
+
+ public Symbol[] getIncomingLocales()
+ {
+ return _incomingLocales;
+ }
+
+ public void setIncomingLocales(Symbol[] incomingLocales)
+ {
+ _incomingLocales = incomingLocales;
+ }
+
+ public Symbol[] getOfferedCapabilities()
+ {
+ return _offeredCapabilities;
+ }
+
+ public void setOfferedCapabilities(Symbol[] offeredCapabilities)
+ {
+ _offeredCapabilities = offeredCapabilities;
+ }
+
+ public Symbol[] getDesiredCapabilities()
+ {
+ return _desiredCapabilities;
+ }
+
+ public void setDesiredCapabilities(Symbol[] desiredCapabilities)
+ {
+ _desiredCapabilities = desiredCapabilities;
+ }
+
+ public Map getProperties()
+ {
+ return _properties;
+ }
+
+ public void setProperties(Map properties)
+ {
+ _properties = properties;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Open{");
+ final int origLength = builder.length();
+
+ if(_containerId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("containerId=").append(_containerId);
+ }
+
+ if(_hostname != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("hostname=").append(_hostname);
+ }
+
+ if(_maxFrameSize != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("maxFrameSize=").append(_maxFrameSize);
+ }
+
+ if(_channelMax != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("channelMax=").append(_channelMax);
+ }
+
+ if(_idleTimeOut != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("idleTimeOut=").append(_idleTimeOut);
+ }
+
+ if(_outgoingLocales != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("outgoingLocales=").append(_outgoingLocales);
+ }
+
+ if(_incomingLocales != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("incomingLocales=").append(_incomingLocales);
+ }
+
+ if(_offeredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("offeredCapabilities=").append(_offeredCapabilities);
+ }
+
+ if(_desiredCapabilities != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("desiredCapabilities=").append(_desiredCapabilities);
+ }
+
+ if(_properties != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("properties=").append(_properties);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveOpen(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ReceiverSettleMode.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ReceiverSettleMode.java
new file mode 100644
index 0000000000..53f0f2b931
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/ReceiverSettleMode.java
@@ -0,0 +1,95 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class ReceiverSettleMode
+ implements RestrictedType<UnsignedByte>
+
+ {
+
+
+
+ private final UnsignedByte _val;
+
+
+ public static final ReceiverSettleMode FIRST = new ReceiverSettleMode(UnsignedByte.valueOf((byte) 0));
+
+ public static final ReceiverSettleMode SECOND = new ReceiverSettleMode(UnsignedByte.valueOf((byte) 1));
+
+
+
+ private ReceiverSettleMode(UnsignedByte val)
+ {
+ _val = val;
+ }
+
+ public UnsignedByte getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == FIRST)
+ {
+ return "first";
+ }
+
+ if(this == SECOND)
+ {
+ return "second";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static ReceiverSettleMode valueOf(Object obj)
+ {
+ UnsignedByte val = (UnsignedByte) obj;
+
+ if(FIRST._val.equals(val))
+ {
+ return FIRST;
+ }
+
+ if(SECOND._val.equals(val))
+ {
+ return SECOND;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Role.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Role.java
new file mode 100644
index 0000000000..55be00b3d7
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Role.java
@@ -0,0 +1,95 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Role
+ implements RestrictedType<Boolean>
+
+ {
+
+
+
+ private final boolean _val;
+
+
+ public static final Role SENDER = new Role(false);
+
+ public static final Role RECEIVER = new Role(true);
+
+
+
+ private Role(boolean val)
+ {
+ _val = val;
+ }
+
+ public Boolean getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == SENDER)
+ {
+ return "sender";
+ }
+
+ if(this == RECEIVER)
+ {
+ return "receiver";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static Role valueOf(Object obj)
+ {
+ boolean val = (Boolean) obj;
+
+ if(SENDER._val == (val))
+ {
+ return SENDER;
+ }
+
+ if(RECEIVER._val == (val))
+ {
+ return RECEIVER;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SenderSettleMode.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SenderSettleMode.java
new file mode 100644
index 0000000000..528ec69dbc
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SenderSettleMode.java
@@ -0,0 +1,107 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SenderSettleMode
+ implements RestrictedType<UnsignedByte>
+
+ {
+
+
+
+ private final UnsignedByte _val;
+
+
+ public static final SenderSettleMode UNSETTLED = new SenderSettleMode(UnsignedByte.valueOf((byte) 0));
+
+ public static final SenderSettleMode SETTLED = new SenderSettleMode(UnsignedByte.valueOf((byte) 1));
+
+ public static final SenderSettleMode MIXED = new SenderSettleMode(UnsignedByte.valueOf((byte) 2));
+
+
+
+ private SenderSettleMode(UnsignedByte val)
+ {
+ _val = val;
+ }
+
+ public UnsignedByte getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == UNSETTLED)
+ {
+ return "unsettled";
+ }
+
+ if(this == SETTLED)
+ {
+ return "settled";
+ }
+
+ if(this == MIXED)
+ {
+ return "mixed";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static SenderSettleMode valueOf(Object obj)
+ {
+ UnsignedByte val = (UnsignedByte) obj;
+
+ if(UNSETTLED._val.equals(val))
+ {
+ return UNSETTLED;
+ }
+
+ if(SETTLED._val.equals(val))
+ {
+ return SETTLED;
+ }
+
+ if(MIXED._val.equals(val))
+ {
+ return MIXED;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SessionError.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SessionError.java
new file mode 100644
index 0000000000..b7b233c879
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/SessionError.java
@@ -0,0 +1,119 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class SessionError
+ implements ErrorCondition, RestrictedType<Symbol>
+
+ {
+
+
+
+ private final Symbol _val;
+
+
+ public static final SessionError WINDOW_VIOLATION = new SessionError(Symbol.valueOf("amqp:session:window-violation"));
+
+ public static final SessionError ERRANT_LINK = new SessionError(Symbol.valueOf("amqp:session:errant-link"));
+
+ public static final SessionError HANDLE_IN_USE = new SessionError(Symbol.valueOf("amqp:session:handle-in-use"));
+
+ public static final SessionError UNATTACHED_HANDLE = new SessionError(Symbol.valueOf("amqp:session:unattached-handle"));
+
+
+
+ private SessionError(Symbol val)
+ {
+ _val = val;
+ }
+
+ public Symbol getValue()
+ {
+ return _val;
+ }
+
+ public String toString()
+ {
+
+ if(this == WINDOW_VIOLATION)
+ {
+ return "window-violation";
+ }
+
+ if(this == ERRANT_LINK)
+ {
+ return "errant-link";
+ }
+
+ if(this == HANDLE_IN_USE)
+ {
+ return "handle-in-use";
+ }
+
+ if(this == UNATTACHED_HANDLE)
+ {
+ return "unattached-handle";
+ }
+
+ else
+ {
+ return String.valueOf(_val);
+ }
+ }
+
+ public static SessionError valueOf(Object obj)
+ {
+ Symbol val = (Symbol) obj;
+
+ if(WINDOW_VIOLATION._val.equals(val))
+ {
+ return WINDOW_VIOLATION;
+ }
+
+ if(ERRANT_LINK._val.equals(val))
+ {
+ return ERRANT_LINK;
+ }
+
+ if(HANDLE_IN_USE._val.equals(val))
+ {
+ return HANDLE_IN_USE;
+ }
+
+ if(UNATTACHED_HANDLE._val.equals(val))
+ {
+ return UNATTACHED_HANDLE;
+ }
+
+ // TODO ERROR
+ return null;
+ }
+
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Transfer.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Transfer.java
new file mode 100644
index 0000000000..a58db63a1f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/Transfer.java
@@ -0,0 +1,299 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport;
+
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+
+
+import java.nio.ByteBuffer;
+
+
+import org.apache.qpid.amqp_1_0.type.*;
+
+public class Transfer
+ implements FrameBody
+ {
+
+
+ private ByteBuffer _payload;
+
+ private UnsignedInteger _handle;
+
+ private UnsignedInteger _deliveryId;
+
+ private Binary _deliveryTag;
+
+ private UnsignedInteger _messageFormat;
+
+ private Boolean _settled;
+
+ private Boolean _more;
+
+ private ReceiverSettleMode _rcvSettleMode;
+
+ private DeliveryState _state;
+
+ private Boolean _resume;
+
+ private Boolean _aborted;
+
+ private Boolean _batchable;
+
+ public UnsignedInteger getHandle()
+ {
+ return _handle;
+ }
+
+ public void setHandle(UnsignedInteger handle)
+ {
+ _handle = handle;
+ }
+
+ public UnsignedInteger getDeliveryId()
+ {
+ return _deliveryId;
+ }
+
+ public void setDeliveryId(UnsignedInteger deliveryId)
+ {
+ _deliveryId = deliveryId;
+ }
+
+ public Binary getDeliveryTag()
+ {
+ return _deliveryTag;
+ }
+
+ public void setDeliveryTag(Binary deliveryTag)
+ {
+ _deliveryTag = deliveryTag;
+ }
+
+ public UnsignedInteger getMessageFormat()
+ {
+ return _messageFormat;
+ }
+
+ public void setMessageFormat(UnsignedInteger messageFormat)
+ {
+ _messageFormat = messageFormat;
+ }
+
+ public Boolean getSettled()
+ {
+ return _settled;
+ }
+
+ public void setSettled(Boolean settled)
+ {
+ _settled = settled;
+ }
+
+ public Boolean getMore()
+ {
+ return _more;
+ }
+
+ public void setMore(Boolean more)
+ {
+ _more = more;
+ }
+
+ public ReceiverSettleMode getRcvSettleMode()
+ {
+ return _rcvSettleMode;
+ }
+
+ public void setRcvSettleMode(ReceiverSettleMode rcvSettleMode)
+ {
+ _rcvSettleMode = rcvSettleMode;
+ }
+
+ public DeliveryState getState()
+ {
+ return _state;
+ }
+
+ public void setState(DeliveryState state)
+ {
+ _state = state;
+ }
+
+ public Boolean getResume()
+ {
+ return _resume;
+ }
+
+ public void setResume(Boolean resume)
+ {
+ _resume = resume;
+ }
+
+ public Boolean getAborted()
+ {
+ return _aborted;
+ }
+
+ public void setAborted(Boolean aborted)
+ {
+ _aborted = aborted;
+ }
+
+ public Boolean getBatchable()
+ {
+ return _batchable;
+ }
+
+ public void setBatchable(Boolean batchable)
+ {
+ _batchable = batchable;
+ }
+
+ @Override
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder("Transfer{");
+ final int origLength = builder.length();
+
+ if(_handle != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("handle=").append(_handle);
+ }
+
+ if(_deliveryId != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("deliveryId=").append(_deliveryId);
+ }
+
+ if(_deliveryTag != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("deliveryTag=").append(_deliveryTag);
+ }
+
+ if(_messageFormat != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("messageFormat=").append(_messageFormat);
+ }
+
+ if(_settled != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("settled=").append(_settled);
+ }
+
+ if(_more != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("more=").append(_more);
+ }
+
+ if(_rcvSettleMode != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("rcvSettleMode=").append(_rcvSettleMode);
+ }
+
+ if(_state != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("state=").append(_state);
+ }
+
+ if(_resume != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("resume=").append(_resume);
+ }
+
+ if(_aborted != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("aborted=").append(_aborted);
+ }
+
+ if(_batchable != null)
+ {
+ if(builder.length() != origLength)
+ {
+ builder.append(',');
+ }
+ builder.append("batchable=").append(_batchable);
+ }
+
+ builder.append('}');
+ return builder.toString();
+ }
+
+ public void invoke(short channel, ConnectionEndpoint conn)
+ {
+ conn.receiveTransfer(channel, this);
+ }
+
+ public void setPayload(ByteBuffer payload)
+ {
+ _payload = payload;
+ }
+
+ public ByteBuffer getPayload()
+ {
+ return _payload;
+ }
+
+
+ }
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachConstructor.java
new file mode 100644
index 0000000000..0df84ac820
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachConstructor.java
@@ -0,0 +1,465 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Attach;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class AttachConstructor extends DescribedTypeConstructor<Attach>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:attach:list"),UnsignedLong.valueOf(0x0000000000000012L),
+ };
+
+ private static final AttachConstructor INSTANCE = new AttachConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Attach construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Attach obj = new Attach();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setName( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHandle( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setRole( Role.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSndSettleMode( SenderSettleMode.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setRcvSettleMode( ReceiverSettleMode.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSource( (Source) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setTarget( (Target) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setUnsettled( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setIncompleteUnsettled( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setInitialDeliveryCount( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMaxMessageSize( (UnsignedLong) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setOfferedCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setOfferedCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setDesiredCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setDesiredCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachWriter.java
new file mode 100644
index 0000000000..0b67635dc0
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/AttachWriter.java
@@ -0,0 +1,254 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Attach;
+
+public class AttachWriter extends AbstractDescribedTypeWriter<Attach>
+{
+ private Attach _value;
+ private int _count = -1;
+
+ public AttachWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Attach value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getProperties() != null)
+ {
+ return 14;
+ }
+
+ if( _value.getDesiredCapabilities() != null)
+ {
+ return 13;
+ }
+
+ if( _value.getOfferedCapabilities() != null)
+ {
+ return 12;
+ }
+
+ if( _value.getMaxMessageSize() != null)
+ {
+ return 11;
+ }
+
+ if( _value.getInitialDeliveryCount() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getIncompleteUnsettled() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getUnsettled() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getTarget() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getSource() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getRcvSettleMode() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getSndSettleMode() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getRole() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getHandle() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getName() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000012L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Attach>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Attach value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getName();
+
+ case 1:
+ return _value.getHandle();
+
+ case 2:
+ return _value.getRole();
+
+ case 3:
+ return _value.getSndSettleMode();
+
+ case 4:
+ return _value.getRcvSettleMode();
+
+ case 5:
+ return _value.getSource();
+
+ case 6:
+ return _value.getTarget();
+
+ case 7:
+ return _value.getUnsettled();
+
+ case 8:
+ return _value.getIncompleteUnsettled();
+
+ case 9:
+ return _value.getInitialDeliveryCount();
+
+ case 10:
+ return _value.getMaxMessageSize();
+
+ case 11:
+ return _value.getOfferedCapabilities();
+
+ case 12:
+ return _value.getDesiredCapabilities();
+
+ case 13:
+ return _value.getProperties();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Attach> FACTORY = new Factory<Attach>()
+ {
+
+ public ValueWriter<Attach> newInstance(Registry registry)
+ {
+ return new AttachWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Attach.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginConstructor.java
new file mode 100644
index 0000000000..94470c5139
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginConstructor.java
@@ -0,0 +1,303 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Begin;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class BeginConstructor extends DescribedTypeConstructor<Begin>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:begin:list"),UnsignedLong.valueOf(0x0000000000000011L),
+ };
+
+ private static final BeginConstructor INSTANCE = new BeginConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Begin construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Begin obj = new Begin();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setRemoteChannel( (UnsignedShort) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setNextOutgoingId( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setIncomingWindow( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setOutgoingWindow( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHandleMax( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setOfferedCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setOfferedCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setDesiredCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setDesiredCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginWriter.java
new file mode 100644
index 0000000000..84abf6698e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/BeginWriter.java
@@ -0,0 +1,206 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Begin;
+
+public class BeginWriter extends AbstractDescribedTypeWriter<Begin>
+{
+ private Begin _value;
+ private int _count = -1;
+
+ public BeginWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Begin value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getProperties() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getDesiredCapabilities() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getOfferedCapabilities() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getHandleMax() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getOutgoingWindow() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getIncomingWindow() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getNextOutgoingId() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getRemoteChannel() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000011L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Begin>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Begin value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getRemoteChannel();
+
+ case 1:
+ return _value.getNextOutgoingId();
+
+ case 2:
+ return _value.getIncomingWindow();
+
+ case 3:
+ return _value.getOutgoingWindow();
+
+ case 4:
+ return _value.getHandleMax();
+
+ case 5:
+ return _value.getOfferedCapabilities();
+
+ case 6:
+ return _value.getDesiredCapabilities();
+
+ case 7:
+ return _value.getProperties();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Begin> FACTORY = new Factory<Begin>()
+ {
+
+ public ValueWriter<Begin> newInstance(Registry registry)
+ {
+ return new BeginWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Begin.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseConstructor.java
new file mode 100644
index 0000000000..69544dc96f
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Close;
+
+
+import java.util.List;
+
+public class CloseConstructor extends DescribedTypeConstructor<Close>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:close:list"),UnsignedLong.valueOf(0x0000000000000018L),
+ };
+
+ private static final CloseConstructor INSTANCE = new CloseConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Close construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Close obj = new Close();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setError( (org.apache.qpid.amqp_1_0.type.transport.Error) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseWriter.java
new file mode 100644
index 0000000000..96313efcb9
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/CloseWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Close;
+
+public class CloseWriter extends AbstractDescribedTypeWriter<Close>
+{
+ private Close _value;
+ private int _count = -1;
+
+ public CloseWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Close value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getError() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000018L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Close>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Close value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getError();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Close> FACTORY = new Factory<Close>()
+ {
+
+ public ValueWriter<Close> newInstance(Registry registry)
+ {
+ return new CloseWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Close.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachConstructor.java
new file mode 100644
index 0000000000..8d90d39769
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachConstructor.java
@@ -0,0 +1,153 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Detach;
+
+
+import java.util.List;
+
+public class DetachConstructor extends DescribedTypeConstructor<Detach>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:detach:list"),UnsignedLong.valueOf(0x0000000000000016L),
+ };
+
+ private static final DetachConstructor INSTANCE = new DetachConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Detach construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Detach obj = new Detach();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHandle( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setClosed( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setError( (org.apache.qpid.amqp_1_0.type.transport.Error) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachWriter.java
new file mode 100644
index 0000000000..620f087f98
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DetachWriter.java
@@ -0,0 +1,166 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Detach;
+
+public class DetachWriter extends AbstractDescribedTypeWriter<Detach>
+{
+ private Detach _value;
+ private int _count = -1;
+
+ public DetachWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Detach value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getError() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getClosed() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getHandle() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000016L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Detach>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Detach value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getHandle();
+
+ case 1:
+ return _value.getClosed();
+
+ case 2:
+ return _value.getError();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Detach> FACTORY = new Factory<Detach>()
+ {
+
+ public ValueWriter<Detach> newInstance(Registry registry)
+ {
+ return new DetachWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Detach.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionConstructor.java
new file mode 100644
index 0000000000..928f54ea97
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionConstructor.java
@@ -0,0 +1,234 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Disposition;
+
+
+import java.util.List;
+
+public class DispositionConstructor extends DescribedTypeConstructor<Disposition>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:disposition:list"),UnsignedLong.valueOf(0x0000000000000015L),
+ };
+
+ private static final DispositionConstructor INSTANCE = new DispositionConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Disposition construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Disposition obj = new Disposition();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setRole( Role.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setFirst( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setLast( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSettled( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setState( (DeliveryState) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setBatchable( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionWriter.java
new file mode 100644
index 0000000000..3bfdf840ab
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/DispositionWriter.java
@@ -0,0 +1,190 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Disposition;
+
+public class DispositionWriter extends AbstractDescribedTypeWriter<Disposition>
+{
+ private Disposition _value;
+ private int _count = -1;
+
+ public DispositionWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Disposition value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getBatchable() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getState() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getSettled() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getLast() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getFirst() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getRole() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000015L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Disposition>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Disposition value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getRole();
+
+ case 1:
+ return _value.getFirst();
+
+ case 2:
+ return _value.getLast();
+
+ case 3:
+ return _value.getSettled();
+
+ case 4:
+ return _value.getState();
+
+ case 5:
+ return _value.getBatchable();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Disposition> FACTORY = new Factory<Disposition>()
+ {
+
+ public ValueWriter<Disposition> newInstance(Registry registry)
+ {
+ return new DispositionWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Disposition.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndConstructor.java
new file mode 100644
index 0000000000..0f8fe63d55
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndConstructor.java
@@ -0,0 +1,99 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.End;
+
+
+import java.util.List;
+
+public class EndConstructor extends DescribedTypeConstructor<End>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:end:list"),UnsignedLong.valueOf(0x0000000000000017L),
+ };
+
+ private static final EndConstructor INSTANCE = new EndConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public End construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ End obj = new End();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setError( (org.apache.qpid.amqp_1_0.type.transport.Error) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndWriter.java
new file mode 100644
index 0000000000..af6a11ae09
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/EndWriter.java
@@ -0,0 +1,150 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.End;
+
+public class EndWriter extends AbstractDescribedTypeWriter<End>
+{
+ private End _value;
+ private int _count = -1;
+
+ public EndWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final End value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getError() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000017L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<End>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final End value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getError();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<End> FACTORY = new Factory<End>()
+ {
+
+ public ValueWriter<End> newInstance(Registry registry)
+ {
+ return new EndWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(End.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorConstructor.java
new file mode 100644
index 0000000000..6d745adb7e
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorConstructor.java
@@ -0,0 +1,169 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionErrors;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class ErrorConstructor extends DescribedTypeConstructor<org.apache.qpid.amqp_1_0.type.transport.Error>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:error:list"),UnsignedLong.valueOf(0x000000000000001dL),
+ };
+
+ private static final ErrorConstructor INSTANCE = new ErrorConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public org.apache.qpid.amqp_1_0.type.transport.Error construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ org.apache.qpid.amqp_1_0.type.transport.Error obj = new org.apache.qpid.amqp_1_0.type.transport.Error();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+ if(val instanceof ErrorCondition)
+ {
+ obj.setCondition( (ErrorCondition) val );
+ }
+ else if(val instanceof Symbol)
+ {
+ ErrorCondition condition = null;
+ condition = AmqpError.valueOf(val);
+ if(condition == null)
+ {
+ condition = ConnectionError.valueOf(val);
+ if(condition == null)
+ {
+ condition = SessionError.valueOf(val);
+ if(condition == null)
+ {
+ condition = LinkError.valueOf(val);
+ if(condition == null)
+ {
+ condition = TransactionErrors.valueOf(val);
+ }
+ }
+ }
+ }
+ obj.setCondition(condition);
+ }
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDescription( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setInfo( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorWriter.java
new file mode 100644
index 0000000000..6c5ebc5dc6
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/ErrorWriter.java
@@ -0,0 +1,166 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+
+public class ErrorWriter extends AbstractDescribedTypeWriter<Error>
+{
+ private Error _value;
+ private int _count = -1;
+
+ public ErrorWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Error value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getInfo() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getDescription() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getCondition() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x000000000000001dL);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Error>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Error value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getCondition();
+
+ case 1:
+ return _value.getDescription();
+
+ case 2:
+ return _value.getInfo();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Error> FACTORY = new Factory<Error>()
+ {
+
+ public ValueWriter<Error> newInstance(Registry registry)
+ {
+ return new ErrorWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Error.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowConstructor.java
new file mode 100644
index 0000000000..406b5a327a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowConstructor.java
@@ -0,0 +1,370 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Flow;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class FlowConstructor extends DescribedTypeConstructor<Flow>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:flow:list"),UnsignedLong.valueOf(0x0000000000000013L),
+ };
+
+ private static final FlowConstructor INSTANCE = new FlowConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Flow construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Flow obj = new Flow();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setNextIncomingId( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setIncomingWindow( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setNextOutgoingId( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setOutgoingWindow( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHandle( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDeliveryCount( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setLinkCredit( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAvailable( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDrain( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setEcho( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowWriter.java
new file mode 100644
index 0000000000..a866491cea
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/FlowWriter.java
@@ -0,0 +1,230 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Flow;
+
+public class FlowWriter extends AbstractDescribedTypeWriter<Flow>
+{
+ private Flow _value;
+ private int _count = -1;
+
+ public FlowWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Flow value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getProperties() != null)
+ {
+ return 11;
+ }
+
+ if( _value.getEcho() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getDrain() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getAvailable() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getLinkCredit() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getDeliveryCount() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getHandle() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getOutgoingWindow() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getNextOutgoingId() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getIncomingWindow() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getNextIncomingId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000013L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Flow>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Flow value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getNextIncomingId();
+
+ case 1:
+ return _value.getIncomingWindow();
+
+ case 2:
+ return _value.getNextOutgoingId();
+
+ case 3:
+ return _value.getOutgoingWindow();
+
+ case 4:
+ return _value.getHandle();
+
+ case 5:
+ return _value.getDeliveryCount();
+
+ case 6:
+ return _value.getLinkCredit();
+
+ case 7:
+ return _value.getAvailable();
+
+ case 8:
+ return _value.getDrain();
+
+ case 9:
+ return _value.getEcho();
+
+ case 10:
+ return _value.getProperties();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Flow> FACTORY = new Factory<Flow>()
+ {
+
+ public ValueWriter<Flow> newInstance(Registry registry)
+ {
+ return new FlowWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Flow.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenConstructor.java
new file mode 100644
index 0000000000..ba2df038e4
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenConstructor.java
@@ -0,0 +1,371 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Open;
+
+
+import java.util.List;
+import java.util.Map;
+
+public class OpenConstructor extends DescribedTypeConstructor<Open>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:open:list"),UnsignedLong.valueOf(0x0000000000000010L),
+ };
+
+ private static final OpenConstructor INSTANCE = new OpenConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Open construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Open obj = new Open();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setContainerId( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHostname( (String) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMaxFrameSize( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setChannelMax( (UnsignedShort) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setIdleTimeOut( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setOutgoingLocales( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setOutgoingLocales( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setIncomingLocales( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setIncomingLocales( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setOfferedCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setOfferedCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+
+ if (val instanceof Symbol[] )
+ {
+ obj.setDesiredCapabilities( (Symbol[]) val );
+ }
+ else
+ {
+ try
+ {
+ obj.setDesiredCapabilities( new Symbol[] { (Symbol) val } );
+ }
+ catch(ClassCastException e)
+ {
+ // TODO Error
+ }
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setProperties( (Map) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenWriter.java
new file mode 100644
index 0000000000..f512384a20
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/OpenWriter.java
@@ -0,0 +1,222 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Open;
+
+public class OpenWriter extends AbstractDescribedTypeWriter<Open>
+{
+ private Open _value;
+ private int _count = -1;
+
+ public OpenWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Open value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getProperties() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getDesiredCapabilities() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getOfferedCapabilities() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getIncomingLocales() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getOutgoingLocales() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getIdleTimeOut() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getChannelMax() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getMaxFrameSize() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getHostname() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getContainerId() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000010L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Open>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Open value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getContainerId();
+
+ case 1:
+ return _value.getHostname();
+
+ case 2:
+ return _value.getMaxFrameSize();
+
+ case 3:
+ return _value.getChannelMax();
+
+ case 4:
+ return _value.getIdleTimeOut();
+
+ case 5:
+ return _value.getOutgoingLocales();
+
+ case 6:
+ return _value.getIncomingLocales();
+
+ case 7:
+ return _value.getOfferedCapabilities();
+
+ case 8:
+ return _value.getDesiredCapabilities();
+
+ case 9:
+ return _value.getProperties();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Open> FACTORY = new Factory<Open>()
+ {
+
+ public ValueWriter<Open> newInstance(Registry registry)
+ {
+ return new OpenWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Open.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferConstructor.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferConstructor.java
new file mode 100644
index 0000000000..ad3812bbdc
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferConstructor.java
@@ -0,0 +1,369 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructor;
+import org.apache.qpid.amqp_1_0.codec.DescribedTypeConstructorRegistry;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+
+import java.util.List;
+
+public class TransferConstructor extends DescribedTypeConstructor<Transfer>
+{
+ private static final Object[] DESCRIPTORS =
+ {
+ Symbol.valueOf("amqp:transfer:list"),UnsignedLong.valueOf(0x0000000000000014L),
+ };
+
+ private static final TransferConstructor INSTANCE = new TransferConstructor();
+
+ public static void register(DescribedTypeConstructorRegistry registry)
+ {
+ for(Object descriptor : DESCRIPTORS)
+ {
+ registry.register(descriptor, INSTANCE);
+ }
+ }
+
+ public Transfer construct(Object underlying)
+ {
+ if(underlying instanceof List)
+ {
+ List list = (List) underlying;
+ Transfer obj = new Transfer();
+ int position = 0;
+ final int size = list.size();
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setHandle( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDeliveryId( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setDeliveryTag( (Binary) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMessageFormat( (UnsignedInteger) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setSettled( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setMore( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setRcvSettleMode( ReceiverSettleMode.valueOf( val ) );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setState( (DeliveryState) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setResume( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setAborted( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+ if(position < size)
+ {
+ Object val = list.get(position);
+ position++;
+
+ if(val != null)
+ {
+
+ try
+ {
+ obj.setBatchable( (Boolean) val );
+ }
+ catch(ClassCastException e)
+ {
+
+ // TODO Error
+ }
+
+ }
+
+
+ }
+ else
+ {
+ return obj;
+ }
+
+
+ return obj;
+ }
+ else
+ {
+ // TODO - error
+ return null;
+ }
+ }
+
+
+}
diff --git a/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferWriter.java b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferWriter.java
new file mode 100644
index 0000000000..f2252cfc4a
--- /dev/null
+++ b/qpid/java/amqp-1-0-common/src/main/java/org/apache/qpid/amqp_1_0/type/transport/codec/TransferWriter.java
@@ -0,0 +1,230 @@
+
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+
+
+package org.apache.qpid.amqp_1_0.type.transport.codec;
+
+import org.apache.qpid.amqp_1_0.codec.AbstractDescribedTypeWriter;
+import org.apache.qpid.amqp_1_0.codec.AbstractListWriter;
+import org.apache.qpid.amqp_1_0.codec.ValueWriter;
+
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+
+public class TransferWriter extends AbstractDescribedTypeWriter<Transfer>
+{
+ private Transfer _value;
+ private int _count = -1;
+
+ public TransferWriter(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Transfer value)
+ {
+ _value = value;
+ _count = calculateCount();
+ }
+
+ private int calculateCount()
+ {
+
+
+ if( _value.getBatchable() != null)
+ {
+ return 11;
+ }
+
+ if( _value.getAborted() != null)
+ {
+ return 10;
+ }
+
+ if( _value.getResume() != null)
+ {
+ return 9;
+ }
+
+ if( _value.getState() != null)
+ {
+ return 8;
+ }
+
+ if( _value.getRcvSettleMode() != null)
+ {
+ return 7;
+ }
+
+ if( _value.getMore() != null)
+ {
+ return 6;
+ }
+
+ if( _value.getSettled() != null)
+ {
+ return 5;
+ }
+
+ if( _value.getMessageFormat() != null)
+ {
+ return 4;
+ }
+
+ if( _value.getDeliveryTag() != null)
+ {
+ return 3;
+ }
+
+ if( _value.getDeliveryId() != null)
+ {
+ return 2;
+ }
+
+ if( _value.getHandle() != null)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ @Override
+ protected void clear()
+ {
+ _value = null;
+ _count = -1;
+ }
+
+
+ protected Object getDescriptor()
+ {
+ return UnsignedLong.valueOf(0x0000000000000014L);
+ }
+
+ @Override
+ protected ValueWriter createDescribedWriter()
+ {
+ final Writer writer = new Writer(getRegistry());
+ writer.setValue(_value);
+ return writer;
+ }
+
+ private class Writer extends AbstractListWriter<Transfer>
+ {
+ private int _field;
+
+ public Writer(final Registry registry)
+ {
+ super(registry);
+ }
+
+ @Override
+ protected void onSetValue(final Transfer value)
+ {
+ reset();
+ }
+
+ @Override
+ protected int getCount()
+ {
+ return _count;
+ }
+
+ @Override
+ protected boolean hasNext()
+ {
+ return _field < _count;
+ }
+
+ @Override
+ protected Object next()
+ {
+ switch(_field++)
+ {
+
+ case 0:
+ return _value.getHandle();
+
+ case 1:
+ return _value.getDeliveryId();
+
+ case 2:
+ return _value.getDeliveryTag();
+
+ case 3:
+ return _value.getMessageFormat();
+
+ case 4:
+ return _value.getSettled();
+
+ case 5:
+ return _value.getMore();
+
+ case 6:
+ return _value.getRcvSettleMode();
+
+ case 7:
+ return _value.getState();
+
+ case 8:
+ return _value.getResume();
+
+ case 9:
+ return _value.getAborted();
+
+ case 10:
+ return _value.getBatchable();
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ protected void clear()
+ {
+ }
+
+ @Override
+ protected void reset()
+ {
+ _field = 0;
+ }
+ }
+
+ private static Factory<Transfer> FACTORY = new Factory<Transfer>()
+ {
+
+ public ValueWriter<Transfer> newInstance(Registry registry)
+ {
+ return new TransferWriter(registry);
+ }
+ };
+
+ public static void register(ValueWriter.Registry registry)
+ {
+ registry.register(Transfer.class, FACTORY);
+ }
+
+}
diff --git a/qpid/java/bdbstore/build.xml b/qpid/java/bdbstore/build.xml
index d2317350ff..7e55b41b28 100644
--- a/qpid/java/bdbstore/build.xml
+++ b/qpid/java/bdbstore/build.xml
@@ -18,7 +18,7 @@
-->
<project name="bdbstore" default="build">
<property name="module.depends" value="common broker" />
- <property name="module.test.depends" value="test client common/test broker/test management/common perftests systests" />
+ <property name="module.test.depends" value="test client common/test broker/test management/common systests" />
<property name="module.genpom" value="true"/>
<import file="../module.xml" />
diff --git a/qpid/java/bdbstore/etc/scripts/bdbtest.sh b/qpid/java/bdbstore/etc/scripts/bdbtest.sh
deleted file mode 100755
index 0ccfa3cb18..0000000000
--- a/qpid/java/bdbstore/etc/scripts/bdbtest.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-if [ -z "$QPID_HOME" ]; then
- export QPID_HOME=$(dirname $(dirname $(readlink -f $0)))
- export PATH=${PATH}:${QPID_HOME}/bin
-fi
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-VERSION=0.17
-
-# Set classpath to include Qpid jar with all required jars in manifest
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar:$QPID_HOME/lib/qpid-junit-toolkit-$VERSION.jar:$QPID_HOME/lib/junit-3.8.1.jar:$QPID_HOME/lib/log4j-1.2.12.jar:$QPID_HOME/lib/qpid-systests-$VERSION.jar:$QPID_HOME/lib/qpid-perftests-$VERSION.jar:$QPID_HOME/lib/slf4j-log4j12-1.6.1.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java JAVA_MEM=-Xmx256m QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Dlog4j.configuration=perftests.log4j -Dbadger.level=warn -Damqj.test.logging.level=warn -Damqj.logging.level=warn ${JAVA_OPTS} org.apache.qpid.ping.PingDurableClient -o $QPID_WORK/results ${ARGS}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
new file mode 100644
index 0000000000..fb1d7c5265
--- /dev/null
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/AbstractBDBMessageStore.java
@@ -0,0 +1,1825 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb;
+
+import com.sleepycat.bind.tuple.ByteBinding;
+import com.sleepycat.bind.tuple.LongBinding;
+import com.sleepycat.je.Cursor;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.DatabaseException;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentConfig;
+import com.sleepycat.je.LockConflictException;
+import com.sleepycat.je.LockMode;
+import com.sleepycat.je.OperationStatus;
+import com.sleepycat.je.TransactionConfig;
+import java.io.File;
+import java.lang.ref.SoftReference;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.commons.configuration.Configuration;
+import org.apache.log4j.Logger;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.federation.Bridge;
+import org.apache.qpid.server.federation.BrokerLink;
+import org.apache.qpid.server.message.EnqueableMessage;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.BindingRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.ExchangeRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.QueueRecoveryHandler;
+import org.apache.qpid.server.store.ConfiguredObjectHelper;
+import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.store.Event;
+import org.apache.qpid.server.store.EventListener;
+import org.apache.qpid.server.store.EventManager;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler.StoredMessageRecoveryHandler;
+import org.apache.qpid.server.store.State;
+import org.apache.qpid.server.store.StateManager;
+import org.apache.qpid.server.store.StorableMessageMetaData;
+import org.apache.qpid.server.store.StoreFuture;
+import org.apache.qpid.server.store.StoredMemoryMessage;
+import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
+import org.apache.qpid.server.store.TransactionLogRecoveryHandler.QueueEntryRecoveryHandler;
+import org.apache.qpid.server.store.TransactionLogResource;
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+import org.apache.qpid.server.store.berkeleydb.entry.PreparedTransaction;
+import org.apache.qpid.server.store.berkeleydb.entry.QueueEntryKey;
+import org.apache.qpid.server.store.berkeleydb.entry.Xid;
+import org.apache.qpid.server.store.berkeleydb.tuple.ConfiguredObjectBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.ContentBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.MessageMetaDataBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.PreparedTransactionBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.QueueEntryBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.StringMapBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.UUIDTupleBinding;
+import org.apache.qpid.server.store.berkeleydb.tuple.XidBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.Upgrader;
+
+public abstract class AbstractBDBMessageStore implements MessageStore
+{
+ private static final Logger LOGGER = Logger.getLogger(AbstractBDBMessageStore.class);
+
+ private static final int LOCK_RETRY_ATTEMPTS = 5;
+
+ public static final int VERSION = 6;
+
+ public static final String ENVIRONMENT_PATH_PROPERTY = "environment-path";
+
+ private Environment _environment;
+
+ private String CONFIGURED_OBJECTS = "CONFIGURED_OBJECTS";
+ private String MESSAGEMETADATADB_NAME = "MESSAGE_METADATA";
+ private String MESSAGECONTENTDB_NAME = "MESSAGE_CONTENT";
+ private String DELIVERYDB_NAME = "QUEUE_ENTRIES";
+ private String BRIDGEDB_NAME = "BRIDGES";
+ private String LINKDB_NAME = "LINKS";
+ private String XIDDB_NAME = "XIDS";
+
+ private Database _configuredObjectsDb;
+ private Database _messageMetaDataDb;
+ private Database _messageContentDb;
+ private Database _deliveryDb;
+ private Database _bridgeDb;
+ private Database _linkDb;
+ private Database _xidDb;
+
+ /* =======
+ * Schema:
+ * =======
+ *
+ * Queue:
+ * name(AMQShortString) - name(AMQShortString), owner(AMQShortString),
+ * arguments(FieldTable encoded as binary), exclusive (boolean)
+ *
+ * Exchange:
+ * name(AMQShortString) - name(AMQShortString), typeName(AMQShortString), autodelete (boolean)
+ *
+ * Binding:
+ * exchangeName(AMQShortString), queueName(AMQShortString), routingKey(AMQShortString),
+ * arguments (FieldTable encoded as binary) - 0 (zero)
+ *
+ * QueueEntry:
+ * queueName(AMQShortString), messageId (long) - 0 (zero)
+ *
+ * Message (MetaData):
+ * messageId (long) - bodySize (integer), metaData (MessageMetaData encoded as binary)
+ *
+ * Message (Content):
+ * messageId (long), byteOffset (integer) - dataLength(integer), data(binary)
+ */
+
+ private final AtomicLong _messageId = new AtomicLong(0);
+
+ protected final StateManager _stateManager;
+
+ protected TransactionConfig _transactionConfig = new TransactionConfig();
+
+ private MessageStoreRecoveryHandler _messageRecoveryHandler;
+
+ private TransactionLogRecoveryHandler _tlogRecoveryHandler;
+
+ private ConfigurationRecoveryHandler _configRecoveryHandler;
+
+ private final EventManager _eventManager = new EventManager();
+ private String _storeLocation;
+
+ private ConfiguredObjectHelper _configuredObjectHelper = new ConfiguredObjectHelper();
+
+ public AbstractBDBMessageStore()
+ {
+ _stateManager = new StateManager(_eventManager);
+ }
+
+ public void configureConfigStore(String name,
+ ConfigurationRecoveryHandler recoveryHandler,
+ Configuration storeConfiguration) throws Exception
+ {
+ _stateManager.attainState(State.CONFIGURING);
+
+ _configRecoveryHandler = recoveryHandler;
+
+ configure(name,storeConfiguration);
+
+
+
+ }
+
+ public void configureMessageStore(String name,
+ MessageStoreRecoveryHandler messageRecoveryHandler,
+ TransactionLogRecoveryHandler tlogRecoveryHandler,
+ Configuration storeConfiguration) throws Exception
+ {
+ _messageRecoveryHandler = messageRecoveryHandler;
+ _tlogRecoveryHandler = tlogRecoveryHandler;
+
+ _stateManager.attainState(State.CONFIGURED);
+ }
+
+ public void activate() throws Exception
+ {
+ _stateManager.attainState(State.RECOVERING);
+
+ recoverConfig(_configRecoveryHandler);
+ recoverMessages(_messageRecoveryHandler);
+ recoverQueueEntries(_tlogRecoveryHandler);
+
+ _stateManager.attainState(State.ACTIVE);
+ }
+
+ public org.apache.qpid.server.store.Transaction newTransaction()
+ {
+ return new BDBTransaction();
+ }
+
+
+ /**
+ * Called after instantiation in order to configure the message store.
+ *
+ * @param name The name of the virtual host using this store
+ * @return whether a new store environment was created or not (to indicate whether recovery is necessary)
+ *
+ * @throws Exception If any error occurs that means the store is unable to configure itself.
+ */
+ public void configure(String name, Configuration storeConfig) throws Exception
+ {
+ final String storeLocation = storeConfig.getString(ENVIRONMENT_PATH_PROPERTY,
+ System.getProperty("QPID_WORK") + File.separator + "bdbstore" + File.separator + name);
+
+ File environmentPath = new File(storeLocation);
+ if (!environmentPath.exists())
+ {
+ if (!environmentPath.mkdirs())
+ {
+ throw new IllegalArgumentException("Environment path " + environmentPath + " could not be read or created. "
+ + "Ensure the path is correct and that the permissions are correct.");
+ }
+ }
+
+ _storeLocation = storeLocation;
+
+ LOGGER.info("Configuring BDB message store");
+
+ setupStore(environmentPath, name);
+ }
+
+ /**
+ * Move the store state from INITIAL to ACTIVE without actually recovering.
+ *
+ * This is required if you do not want to perform recovery of the store data
+ *
+ * @throws AMQStoreException if the store is not in the correct state
+ */
+ void startWithNoRecover() throws AMQStoreException
+ {
+ _stateManager.attainState(State.CONFIGURING);
+ _stateManager.attainState(State.CONFIGURED);
+ _stateManager.attainState(State.RECOVERING);
+ _stateManager.attainState(State.ACTIVE);
+ }
+
+ protected void setupStore(File storePath, String name) throws DatabaseException, AMQStoreException
+ {
+ _environment = createEnvironment(storePath);
+
+ new Upgrader(_environment, name).upgradeIfNecessary();
+
+ openDatabases();
+ }
+
+ protected Environment createEnvironment(File environmentPath) throws DatabaseException
+ {
+ LOGGER.info("BDB message store using environment path " + environmentPath.getAbsolutePath());
+ EnvironmentConfig envConfig = new EnvironmentConfig();
+ // This is what allows the creation of the store if it does not already exist.
+ envConfig.setAllowCreate(true);
+ envConfig.setTransactional(true);
+ envConfig.setConfigParam("je.lock.nLockTables", "7");
+
+ // Added to help diagnosis of Deadlock issue
+ // http://www.oracle.com/technology/products/berkeley-db/faq/je_faq.html#23
+ if (Boolean.getBoolean("qpid.bdb.lock.debug"))
+ {
+ envConfig.setConfigParam("je.txn.deadlockStackTrace", "true");
+ envConfig.setConfigParam("je.txn.dumpLocks", "true");
+ }
+
+ // Set transaction mode
+ _transactionConfig.setReadCommitted(true);
+
+ //This prevents background threads running which will potentially update the store.
+ envConfig.setReadOnly(false);
+ try
+ {
+ return new Environment(environmentPath, envConfig);
+ }
+ catch (DatabaseException de)
+ {
+ if (de.getMessage().contains("Environment.setAllowCreate is false"))
+ {
+ //Allow the creation this time
+ envConfig.setAllowCreate(true);
+ if (_environment != null )
+ {
+ _environment.cleanLog();
+ _environment.close();
+ }
+ return new Environment(environmentPath, envConfig);
+ }
+ else
+ {
+ throw de;
+ }
+ }
+ }
+
+ public Environment getEnvironment()
+ {
+ return _environment;
+ }
+
+ private void openDatabases() throws DatabaseException
+ {
+ DatabaseConfig dbConfig = new DatabaseConfig();
+ dbConfig.setTransactional(true);
+ dbConfig.setAllowCreate(true);
+
+ //This is required if we are wanting read only access.
+ dbConfig.setReadOnly(false);
+
+ _configuredObjectsDb = openDatabase(CONFIGURED_OBJECTS, dbConfig);
+ _messageMetaDataDb = openDatabase(MESSAGEMETADATADB_NAME, dbConfig);
+ _messageContentDb = openDatabase(MESSAGECONTENTDB_NAME, dbConfig);
+ _deliveryDb = openDatabase(DELIVERYDB_NAME, dbConfig);
+ _linkDb = openDatabase(LINKDB_NAME, dbConfig);
+ _bridgeDb = openDatabase(BRIDGEDB_NAME, dbConfig);
+ _xidDb = openDatabase(XIDDB_NAME, dbConfig);
+ }
+
+ private Database openDatabase(final String dbName, final DatabaseConfig dbConfig)
+ {
+ // if opening read-only and the database doesn't exist, then you can't create it
+ return dbConfig.getReadOnly() && !_environment.getDatabaseNames().contains(dbName)
+ ? null
+ : _environment.openDatabase(null, dbName, dbConfig);
+ }
+
+ /**
+ * Called to close and cleanup any resources used by the message store.
+ *
+ * @throws Exception If the close fails.
+ */
+ public void close() throws Exception
+ {
+ if (_stateManager.isInState(State.ACTIVE) || _stateManager.isInState(State.QUIESCED))
+ {
+ _stateManager.stateTransition(State.ACTIVE, State.CLOSING);
+
+ closeInternal();
+
+ _stateManager.stateTransition(State.CLOSING, State.CLOSED);
+ }
+ }
+
+ protected void closeInternal() throws Exception
+ {
+ if (_messageMetaDataDb != null)
+ {
+ LOGGER.info("Closing message metadata database");
+ _messageMetaDataDb.close();
+ }
+
+ if (_messageContentDb != null)
+ {
+ LOGGER.info("Closing message content database");
+ _messageContentDb.close();
+ }
+
+ if (_configuredObjectsDb != null)
+ {
+ LOGGER.info("Closing configurable objects database");
+ _configuredObjectsDb.close();
+ }
+
+ if (_deliveryDb != null)
+ {
+ LOGGER.info("Close delivery database");
+ _deliveryDb.close();
+ }
+
+ if (_bridgeDb != null)
+ {
+ LOGGER.info("Close bridge database");
+ _bridgeDb.close();
+ }
+
+ if (_linkDb != null)
+ {
+ LOGGER.info("Close link database");
+ _linkDb.close();
+ }
+
+
+ if (_xidDb != null)
+ {
+ LOGGER.info("Close xid database");
+ _xidDb.close();
+ }
+
+ closeEnvironment();
+
+ }
+
+ private void closeEnvironment() throws DatabaseException
+ {
+ if (_environment != null)
+ {
+ // Clean the log before closing. This makes sure it doesn't contain
+ // redundant data. Closing without doing this means the cleaner may not
+ // get a chance to finish.
+ _environment.cleanLog();
+ _environment.close();
+ }
+ }
+
+
+ private void recoverConfig(ConfigurationRecoveryHandler recoveryHandler) throws AMQStoreException
+ {
+ try
+ {
+ List<ConfiguredObjectRecord> configuredObjects = loadConfiguredObjects();
+ QueueRecoveryHandler qrh = recoveryHandler.begin(this);
+ _configuredObjectHelper.recoverQueues(qrh, configuredObjects);
+
+ ExchangeRecoveryHandler erh = qrh.completeQueueRecovery();
+ _configuredObjectHelper.recoverExchanges(erh, configuredObjects);
+
+ BindingRecoveryHandler brh = erh.completeExchangeRecovery();
+ _configuredObjectHelper.recoverBindings(brh, configuredObjects);
+
+ ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh = brh.completeBindingRecovery();
+ recoverBrokerLinks(lrh);
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error recovering persistent state: " + e.getMessage(), e);
+ }
+
+ }
+
+ private List<ConfiguredObjectRecord> loadConfiguredObjects() throws DatabaseException
+ {
+ Cursor cursor = null;
+ List<ConfiguredObjectRecord> results = new ArrayList<ConfiguredObjectRecord>();
+ try
+ {
+ cursor = _configuredObjectsDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ ConfiguredObjectRecord configuredObject = ConfiguredObjectBinding.getInstance().entryToObject(value);
+ UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
+ configuredObject.setId(id);
+ results.add(configuredObject);
+ }
+
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+ return results;
+ }
+
+ private void closeCursorSafely(Cursor cursor)
+ {
+ if (cursor != null)
+ {
+ cursor.close();
+ }
+ }
+
+ private void recoverBrokerLinks(final ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh)
+ {
+ Cursor cursor = null;
+
+ try
+ {
+ cursor = _linkDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
+ long createTime = LongBinding.entryToLong(value);
+ Map<String,String> arguments = StringMapBinding.getInstance().entryToObject(value);
+
+ ConfigurationRecoveryHandler.BridgeRecoveryHandler brh = lrh.brokerLink(id, createTime, arguments);
+
+ recoverBridges(brh, id);
+ }
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+
+ }
+
+ private void recoverBridges(final ConfigurationRecoveryHandler.BridgeRecoveryHandler brh, final UUID linkId)
+ {
+ Cursor cursor = null;
+
+ try
+ {
+ cursor = _bridgeDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
+
+ UUID parentId = UUIDTupleBinding.getInstance().entryToObject(value);
+ if(parentId.equals(linkId))
+ {
+
+ long createTime = LongBinding.entryToLong(value);
+ Map<String,String> arguments = StringMapBinding.getInstance().entryToObject(value);
+ brh.bridge(id,createTime,arguments);
+ }
+ }
+ brh.completeBridgeRecoveryForLink();
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+
+ }
+
+
+ private void recoverMessages(MessageStoreRecoveryHandler msrh) throws DatabaseException
+ {
+ StoredMessageRecoveryHandler mrh = msrh.begin();
+
+ Cursor cursor = null;
+ try
+ {
+ cursor = _messageMetaDataDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+ MessageMetaDataBinding valueBinding = MessageMetaDataBinding.getInstance();
+
+ long maxId = 0;
+
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ long messageId = LongBinding.entryToLong(key);
+ StorableMessageMetaData metaData = valueBinding.entryToObject(value);
+
+ StoredBDBMessage message = new StoredBDBMessage(messageId, metaData, false);
+ mrh.message(message);
+
+ maxId = Math.max(maxId, messageId);
+ }
+
+ _messageId.set(maxId);
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Database Error: " + e.getMessage(), e);
+ throw e;
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+ }
+
+ private void recoverQueueEntries(TransactionLogRecoveryHandler recoveryHandler)
+ throws DatabaseException
+ {
+ QueueEntryRecoveryHandler qerh = recoveryHandler.begin(this);
+
+ ArrayList<QueueEntryKey> entries = new ArrayList<QueueEntryKey>();
+
+ Cursor cursor = null;
+ try
+ {
+ cursor = _deliveryDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
+
+ DatabaseEntry value = new DatabaseEntry();
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ QueueEntryKey qek = keyBinding.entryToObject(key);
+
+ entries.add(qek);
+ }
+
+ try
+ {
+ cursor.close();
+ }
+ finally
+ {
+ cursor = null;
+ }
+
+ for(QueueEntryKey entry : entries)
+ {
+ UUID queueId = entry.getQueueId();
+ long messageId = entry.getMessageId();
+ qerh.queueEntry(queueId, messageId);
+ }
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Database Error: " + e.getMessage(), e);
+ throw e;
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+
+ TransactionLogRecoveryHandler.DtxRecordRecoveryHandler dtxrh = qerh.completeQueueEntryRecovery();
+
+ cursor = null;
+ try
+ {
+ cursor = _xidDb.openCursor(null, null);
+ DatabaseEntry key = new DatabaseEntry();
+ XidBinding keyBinding = XidBinding.getInstance();
+ PreparedTransactionBinding valueBinding = new PreparedTransactionBinding();
+ DatabaseEntry value = new DatabaseEntry();
+
+ while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
+ {
+ Xid xid = keyBinding.entryToObject(key);
+ PreparedTransaction preparedTransaction = valueBinding.entryToObject(value);
+ dtxrh.dtxRecord(xid.getFormat(),xid.getGlobalId(),xid.getBranchId(),
+ preparedTransaction.getEnqueues(),preparedTransaction.getDequeues());
+ }
+
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Database Error: " + e.getMessage(), e);
+ throw e;
+ }
+ finally
+ {
+ closeCursorSafely(cursor);
+ }
+
+
+ dtxrh.completeDtxRecordRecovery();
+ }
+
+ public void removeMessage(long messageId, boolean sync) throws AMQStoreException
+ {
+
+ boolean complete = false;
+ com.sleepycat.je.Transaction tx = null;
+
+ Random rand = null;
+ int attempts = 0;
+ try
+ {
+ do
+ {
+ tx = null;
+ try
+ {
+ tx = _environment.beginTransaction(null, null);
+
+ //remove the message meta data from the store
+ DatabaseEntry key = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, key);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Removing message id " + messageId);
+ }
+
+
+ OperationStatus status = _messageMetaDataDb.delete(tx, key);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ LOGGER.info("Message not found (attempt to remove failed - probably application initiated rollback) " +
+ messageId);
+ }
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Deleted metadata for message " + messageId);
+ }
+
+ //now remove the content data from the store if there is any.
+ DatabaseEntry contentKeyEntry = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, contentKeyEntry);
+ _messageContentDb.delete(tx, contentKeyEntry);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Deleted content for message " + messageId);
+ }
+
+ commit(tx, sync);
+ complete = true;
+ tx = null;
+ }
+ catch (LockConflictException e)
+ {
+ try
+ {
+ if(tx != null)
+ {
+ tx.abort();
+ }
+ }
+ catch(DatabaseException e2)
+ {
+ LOGGER.warn("Unable to abort transaction after LockConflictExcption", e2);
+ // rethrow the original log conflict exception, the secondary exception should already have
+ // been logged.
+ throw e;
+ }
+
+
+ LOGGER.warn("Lock timeout exception. Retrying (attempt "
+ + (attempts+1) + " of "+ LOCK_RETRY_ATTEMPTS +") " + e);
+
+ if(++attempts < LOCK_RETRY_ATTEMPTS)
+ {
+ if(rand == null)
+ {
+ rand = new Random();
+ }
+
+ try
+ {
+ Thread.sleep(500l + (long)(500l * rand.nextDouble()));
+ }
+ catch (InterruptedException e1)
+ {
+
+ }
+ }
+ else
+ {
+ // rethrow the lock conflict exception since we could not solve by retrying
+ throw e;
+ }
+ }
+ }
+ while(!complete);
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Unexpected BDB exception", e);
+
+ if (tx != null)
+ {
+ try
+ {
+ tx.abort();
+ tx = null;
+ }
+ catch (DatabaseException e1)
+ {
+ throw new AMQStoreException("Error aborting transaction " + e1, e1);
+ }
+ }
+
+ throw new AMQStoreException("Error removing message with id " + messageId + " from database: " + e.getMessage(), e);
+ }
+ finally
+ {
+ if (tx != null)
+ {
+ try
+ {
+ tx.abort();
+ tx = null;
+ }
+ catch (DatabaseException e1)
+ {
+ throw new AMQStoreException("Error aborting transaction " + e1, e1);
+ }
+ }
+ }
+ }
+
+ /**
+ * @see DurableConfigurationStore#createExchange(Exchange)
+ */
+ public void createExchange(Exchange exchange) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord configuredObject = _configuredObjectHelper.createExchangeConfiguredObject(exchange);
+ storeConfiguredObjectEntry(configuredObject);
+ }
+ }
+
+ /**
+ * @see DurableConfigurationStore#removeExchange(Exchange)
+ */
+ public void removeExchange(Exchange exchange) throws AMQStoreException
+ {
+ UUID id = exchange.getId();
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public void removeExchange(String name = " + exchange.getName() + ", uuid = " + id + "): called");
+ }
+ OperationStatus status = removeConfiguredObject(id);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Exchange " + exchange.getName() + " with id " + id + " not found");
+ }
+ }
+
+
+ /**
+ * @see DurableConfigurationStore#bindQueue(Binding)
+ */
+ public void bindQueue(Binding binding) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord configuredObject = _configuredObjectHelper.createBindingConfiguredObject(binding);
+ storeConfiguredObjectEntry(configuredObject);
+ }
+ }
+
+ /**
+ * @see DurableConfigurationStore#unbindQueue(Binding)
+ */
+ public void unbindQueue(Binding binding)
+ throws AMQStoreException
+ {
+ UUID id = binding.getId();
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public void unbindQueue(Binding binding = " + binding + ", uuid = " + id + "): called");
+ }
+
+ OperationStatus status = removeConfiguredObject(id);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Binding " + binding + " not found");
+ }
+ }
+
+ /**
+ * @see DurableConfigurationStore#createQueue(AMQQueue)
+ */
+ public void createQueue(AMQQueue queue) throws AMQStoreException
+ {
+ createQueue(queue, null);
+ }
+
+ /**
+ * @see DurableConfigurationStore#createQueue(AMQQueue, FieldTable)
+ */
+ public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public void createQueue(AMQQueue queue(" + queue.getName() + "), queue id" + queue.getId()
+ + ", arguments=" + arguments + "): called");
+ }
+ ConfiguredObjectRecord configuredObject = _configuredObjectHelper.createQueueConfiguredObject(queue, arguments);
+ storeConfiguredObjectEntry(configuredObject);
+ }
+ }
+
+ /**
+ * Updates the specified queue in the persistent store, IF it is already present. If the queue
+ * is not present in the store, it will not be added.
+ *
+ * @param queue The queue to update the entry for.
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ public void updateQueue(final AMQQueue queue) throws AMQStoreException
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Updating queue: " + queue.getName());
+ }
+
+ try
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding keyBinding = UUIDTupleBinding.getInstance();
+ keyBinding.objectToEntry(queue.getId(), key);
+
+ DatabaseEntry value = new DatabaseEntry();
+ DatabaseEntry newValue = new DatabaseEntry();
+ ConfiguredObjectBinding configuredObjectBinding = ConfiguredObjectBinding.getInstance();
+
+ OperationStatus status = _configuredObjectsDb.get(null, key, value, LockMode.DEFAULT);
+ if (status == OperationStatus.SUCCESS)
+ {
+ ConfiguredObjectRecord queueRecord = configuredObjectBinding.entryToObject(value);
+ ConfiguredObjectRecord newQueueRecord = _configuredObjectHelper.updateQueueConfiguredObject(queue, queueRecord);
+
+ // write the updated entry to the store
+ configuredObjectBinding.objectToEntry(newQueueRecord, newValue);
+ status = _configuredObjectsDb.put(null, key, newValue);
+ if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Error updating queue details within the store: " + status);
+ }
+ }
+ else if (status != OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Error finding queue details within the store: " + status);
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error updating queue details within the store: " + e,e);
+ }
+ }
+
+ /**
+ * Removes the specified queue from the persistent store.
+ *
+ * @param queue The queue to remove.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ public void removeQueue(final AMQQueue queue) throws AMQStoreException
+ {
+ UUID id = queue.getId();
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public void removeQueue(AMQShortString name = " + queue.getName() + ", uuid = " + id + "): called");
+ }
+
+ OperationStatus status = removeConfiguredObject(id);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Queue " + queue.getName() + " with id " + id + " not found");
+ }
+ }
+
+ public void createBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding.getInstance().objectToEntry(link.getId(), key);
+
+ DatabaseEntry value = new DatabaseEntry();
+ LongBinding.longToEntry(link.getCreateTime(),value);
+ StringMapBinding.getInstance().objectToEntry(link.getArguments(), value);
+
+ try
+ {
+ _linkDb.put(null, key, value);
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error writing Link " + link
+ + " to database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding.getInstance().objectToEntry(link.getId(), key);
+ try
+ {
+ OperationStatus status = _linkDb.delete(null, key);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Link " + link + " not found");
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error deleting the Link " + link + " from database: " + e.getMessage(), e);
+ }
+ }
+
+ public void createBridge(final Bridge bridge) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding.getInstance().objectToEntry(bridge.getId(), key);
+
+ DatabaseEntry value = new DatabaseEntry();
+ UUIDTupleBinding.getInstance().objectToEntry(bridge.getLink().getId(),value);
+ LongBinding.longToEntry(bridge.getCreateTime(),value);
+ StringMapBinding.getInstance().objectToEntry(bridge.getArguments(), value);
+
+ try
+ {
+ _bridgeDb.put(null, key, value);
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error writing Bridge " + bridge
+ + " to database: " + e.getMessage(), e);
+ }
+
+ }
+ }
+
+ public void deleteBridge(final Bridge bridge) throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding.getInstance().objectToEntry(bridge.getId(), key);
+ try
+ {
+ OperationStatus status = _bridgeDb.delete(null, key);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Bridge " + bridge + " not found");
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error deleting the Bridge " + bridge + " from database: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Places a message onto a specified queue, in a given transaction.
+ *
+ * @param tx The transaction for the operation.
+ * @param queue The the queue to place the message on.
+ * @param messageId The message to enqueue.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ public void enqueueMessage(final com.sleepycat.je.Transaction tx, final TransactionLogResource queue,
+ long messageId) throws AMQStoreException
+ {
+
+ DatabaseEntry key = new DatabaseEntry();
+ QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
+ QueueEntryKey dd = new QueueEntryKey(queue.getId(), messageId);
+ keyBinding.objectToEntry(dd, key);
+ DatabaseEntry value = new DatabaseEntry();
+ ByteBinding.byteToEntry((byte) 0, value);
+
+ try
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Enqueuing message " + messageId + " on queue "
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + queue.getId()
+ + " [Transaction" + tx + "]");
+ }
+ _deliveryDb.put(tx, key, value);
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Failed to enqueue: " + e.getMessage(), e);
+ throw new AMQStoreException("Error writing enqueued message with id " + messageId + " for queue "
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + queue.getId()
+ + " to database", e);
+ }
+ }
+
+ /**
+ * Extracts a message from a specified queue, in a given transaction.
+ *
+ * @param tx The transaction for the operation.
+ * @param queue The queue to take the message from.
+ * @param messageId The message to dequeue.
+ *
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ public void dequeueMessage(final com.sleepycat.je.Transaction tx, final TransactionLogResource queue,
+ long messageId) throws AMQStoreException
+ {
+
+ DatabaseEntry key = new DatabaseEntry();
+ QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
+ QueueEntryKey queueEntryKey = new QueueEntryKey(queue.getId(), messageId);
+ UUID id = queue.getId();
+ keyBinding.objectToEntry(queueEntryKey, key);
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Dequeue message id " + messageId + " from queue "
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + id);
+ }
+
+ try
+ {
+
+ OperationStatus status = _deliveryDb.delete(tx, key);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Unable to find message with id " + messageId + " on queue "
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + id);
+ }
+ else if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Unable to remove message with id " + messageId + " on queue"
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + id);
+ }
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Removed message " + messageId + " on queue "
+ + (queue instanceof AMQQueue ? ((AMQQueue) queue).getName() + " with id " : "") + id
+ + " from delivery db");
+
+ }
+ }
+ catch (DatabaseException e)
+ {
+
+ LOGGER.error("Failed to dequeue message " + messageId + ": " + e.getMessage(), e);
+ LOGGER.error(tx);
+
+ throw new AMQStoreException("Error accessing database while dequeuing message: " + e.getMessage(), e);
+ }
+ }
+
+
+ private void recordXid(com.sleepycat.je.Transaction txn,
+ long format,
+ byte[] globalId,
+ byte[] branchId,
+ org.apache.qpid.server.store.Transaction.Record[] enqueues,
+ org.apache.qpid.server.store.Transaction.Record[] dequeues) throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ Xid xid = new Xid(format, globalId, branchId);
+ XidBinding keyBinding = XidBinding.getInstance();
+ keyBinding.objectToEntry(xid,key);
+
+ DatabaseEntry value = new DatabaseEntry();
+ PreparedTransaction preparedTransaction = new PreparedTransaction(enqueues, dequeues);
+ PreparedTransactionBinding valueBinding = new PreparedTransactionBinding();
+ valueBinding.objectToEntry(preparedTransaction, value);
+
+ try
+ {
+ _xidDb.put(txn, key, value);
+ }
+ catch (DatabaseException e)
+ {
+ LOGGER.error("Failed to write xid: " + e.getMessage(), e);
+ throw new AMQStoreException("Error writing xid to database", e);
+ }
+ }
+
+ private void removeXid(com.sleepycat.je.Transaction txn, long format, byte[] globalId, byte[] branchId)
+ throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ Xid xid = new Xid(format, globalId, branchId);
+ XidBinding keyBinding = XidBinding.getInstance();
+
+ keyBinding.objectToEntry(xid, key);
+
+
+ try
+ {
+
+ OperationStatus status = _xidDb.delete(txn, key);
+ if (status == OperationStatus.NOTFOUND)
+ {
+ throw new AMQStoreException("Unable to find xid");
+ }
+ else if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Unable to remove xid");
+ }
+
+ }
+ catch (DatabaseException e)
+ {
+
+ LOGGER.error("Failed to remove xid ", e);
+ LOGGER.error(txn);
+
+ throw new AMQStoreException("Error accessing database while removing xid: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Commits all operations performed within a given transaction.
+ *
+ * @param tx The transaction to commit all operations for.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ private StoreFuture commitTranImpl(final com.sleepycat.je.Transaction tx, boolean syncCommit) throws AMQStoreException
+ {
+ if (tx == null)
+ {
+ throw new AMQStoreException("Fatal internal error: transactional is null at commitTran");
+ }
+
+ StoreFuture result;
+ try
+ {
+ result = commit(tx, syncCommit);
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("commitTranImpl completed for [Transaction:" + tx + "]");
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error commit tx: " + e.getMessage(), e);
+ }
+
+ return result;
+ }
+
+ /**
+ * Abandons all operations performed within a given transaction.
+ *
+ * @param tx The transaction to abandon.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ public void abortTran(final com.sleepycat.je.Transaction tx) throws AMQStoreException
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("abortTran called for [Transaction:" + tx + "]");
+ }
+
+ try
+ {
+ tx.abort();
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error aborting transaction: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Primarily for testing purposes.
+ *
+ * @param queueName
+ *
+ * @return a list of message ids for messages enqueued for a particular queue
+ */
+ List<Long> getEnqueuedMessages(UUID queueId) throws AMQStoreException
+ {
+ Cursor cursor = null;
+ try
+ {
+ cursor = _deliveryDb.openCursor(null, null);
+
+ DatabaseEntry key = new DatabaseEntry();
+
+ QueueEntryKey dd = new QueueEntryKey(queueId, 0);
+
+ QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
+ keyBinding.objectToEntry(dd, key);
+
+ DatabaseEntry value = new DatabaseEntry();
+
+ LinkedList<Long> messageIds = new LinkedList<Long>();
+
+ OperationStatus status = cursor.getSearchKeyRange(key, value, LockMode.DEFAULT);
+ dd = keyBinding.entryToObject(key);
+
+ while ((status == OperationStatus.SUCCESS) && dd.getQueueId().equals(queueId))
+ {
+
+ messageIds.add(dd.getMessageId());
+ status = cursor.getNext(key, value, LockMode.DEFAULT);
+ if (status == OperationStatus.SUCCESS)
+ {
+ dd = keyBinding.entryToObject(key);
+ }
+ }
+
+ return messageIds;
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Database error: " + e.getMessage(), e);
+ }
+ finally
+ {
+ if (cursor != null)
+ {
+ try
+ {
+ cursor.close();
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error closing cursor: " + e.getMessage(), e);
+ }
+ }
+ }
+ }
+
+ /**
+ * Return a valid, currently unused message id.
+ *
+ * @return A fresh message id.
+ */
+ public long getNewMessageId()
+ {
+ return _messageId.incrementAndGet();
+ }
+
+ /**
+ * Stores a chunk of message data.
+ *
+ * @param tx The transaction for the operation.
+ * @param messageId The message to store the data for.
+ * @param offset The offset of the data chunk in the message.
+ * @param contentBody The content of the data chunk.
+ *
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ protected void addContent(final com.sleepycat.je.Transaction tx, long messageId, int offset,
+ ByteBuffer contentBody) throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, key);
+ DatabaseEntry value = new DatabaseEntry();
+ ContentBinding messageBinding = ContentBinding.getInstance();
+ messageBinding.objectToEntry(contentBody.array(), value);
+ try
+ {
+ OperationStatus status = _messageContentDb.put(tx, key, value);
+ if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Error adding content for message id " + messageId + ": " + status);
+ }
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Storing content for message " + messageId + "[Transaction" + tx + "]");
+
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error writing AMQMessage with id " + messageId + " to database: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Stores message meta-data.
+ *
+ * @param tx The transaction for the operation.
+ * @param messageId The message to store the data for.
+ * @param messageMetaData The message meta data to store.
+ *
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ private void storeMetaData(final com.sleepycat.je.Transaction tx, long messageId,
+ StorableMessageMetaData messageMetaData)
+ throws AMQStoreException
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public void storeMetaData(Txn tx = " + tx + ", Long messageId = "
+ + messageId + ", MessageMetaData messageMetaData = " + messageMetaData + "): called");
+ }
+
+ DatabaseEntry key = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, key);
+ DatabaseEntry value = new DatabaseEntry();
+
+ MessageMetaDataBinding messageBinding = MessageMetaDataBinding.getInstance();
+ messageBinding.objectToEntry(messageMetaData, value);
+ try
+ {
+ _messageMetaDataDb.put(tx, key, value);
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Storing message metadata for message id " + messageId + "[Transaction" + tx + "]");
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error writing message metadata with id " + messageId + " to database: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Retrieves message meta-data.
+ *
+ * @param messageId The message to get the meta-data for.
+ *
+ * @return The message meta data.
+ *
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ public StorableMessageMetaData getMessageMetaData(long messageId) throws AMQStoreException
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("public MessageMetaData getMessageMetaData(Long messageId = "
+ + messageId + "): called");
+ }
+
+ DatabaseEntry key = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, key);
+ DatabaseEntry value = new DatabaseEntry();
+ MessageMetaDataBinding messageBinding = MessageMetaDataBinding.getInstance();
+
+ try
+ {
+ OperationStatus status = _messageMetaDataDb.get(null, key, value, LockMode.READ_UNCOMMITTED);
+ if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Metadata not found for message with id " + messageId);
+ }
+
+ StorableMessageMetaData mdd = messageBinding.entryToObject(value);
+
+ return mdd;
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error reading message metadata for message with id " + messageId + ": " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Fills the provided ByteBuffer with as much content for the specified message as possible, starting
+ * from the specified offset in the message.
+ *
+ * @param messageId The message to get the data for.
+ * @param offset The offset of the data within the message.
+ * @param dst The destination of the content read back
+ *
+ * @return The number of bytes inserted into the destination
+ *
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ public int getContent(long messageId, int offset, ByteBuffer dst) throws AMQStoreException
+ {
+ DatabaseEntry contentKeyEntry = new DatabaseEntry();
+ LongBinding.longToEntry(messageId, contentKeyEntry);
+ DatabaseEntry value = new DatabaseEntry();
+ ContentBinding contentTupleBinding = ContentBinding.getInstance();
+
+
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Message Id: " + messageId + " Getting content body from offset: " + offset);
+ }
+
+ try
+ {
+
+ int written = 0;
+ OperationStatus status = _messageContentDb.get(null, contentKeyEntry, value, LockMode.READ_UNCOMMITTED);
+ if (status == OperationStatus.SUCCESS)
+ {
+ byte[] dataAsBytes = contentTupleBinding.entryToObject(value);
+ int size = dataAsBytes.length;
+ if (offset > size)
+ {
+ throw new RuntimeException("Offset " + offset + " is greater than message size " + size
+ + " for message id " + messageId + "!");
+
+ }
+
+ written = size - offset;
+ if(written > dst.remaining())
+ {
+ written = dst.remaining();
+ }
+
+ dst.put(dataAsBytes, offset, written);
+ }
+ return written;
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error getting AMQMessage with id " + messageId + " to database: " + e.getMessage(), e);
+ }
+ }
+
+ public boolean isPersistent()
+ {
+ return true;
+ }
+
+ public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(T metaData)
+ {
+ if(metaData.isPersistent())
+ {
+ return (StoredMessage<T>) new StoredBDBMessage(getNewMessageId(), metaData);
+ }
+ else
+ {
+ return new StoredMemoryMessage(getNewMessageId(), metaData);
+ }
+ }
+
+ //Package getters for the various databases used by the Store
+
+ Database getMetaDataDb()
+ {
+ return _messageMetaDataDb;
+ }
+
+ Database getContentDb()
+ {
+ return _messageContentDb;
+ }
+
+ Database getDeliveryDb()
+ {
+ return _deliveryDb;
+ }
+
+ /**
+ * Makes the specified configured object persistent.
+ *
+ * @param configuredObject Details of the configured object to store.
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ private void storeConfiguredObjectEntry(ConfiguredObjectRecord configuredObject) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding keyBinding = UUIDTupleBinding.getInstance();
+ keyBinding.objectToEntry(configuredObject.getId(), key);
+
+ DatabaseEntry value = new DatabaseEntry();
+ ConfiguredObjectBinding queueBinding = ConfiguredObjectBinding.getInstance();
+
+ queueBinding.objectToEntry(configuredObject, value);
+ try
+ {
+ OperationStatus status = _configuredObjectsDb.put(null, key, value);
+ if (status != OperationStatus.SUCCESS)
+ {
+ throw new AMQStoreException("Error writing configured object " + configuredObject + " to database: "
+ + status);
+ }
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error writing configured object " + configuredObject
+ + " to database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ private OperationStatus removeConfiguredObject(UUID id) throws AMQStoreException
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ UUIDTupleBinding uuidBinding = UUIDTupleBinding.getInstance();
+ uuidBinding.objectToEntry(id, key);
+ try
+ {
+ return _configuredObjectsDb.delete(null, key);
+ }
+ catch (DatabaseException e)
+ {
+ throw new AMQStoreException("Error deleting of configured object with id " + id + " from database", e);
+ }
+ }
+
+ protected abstract StoreFuture commit(com.sleepycat.je.Transaction tx, boolean syncCommit) throws DatabaseException;
+
+
+ private class StoredBDBMessage implements StoredMessage<StorableMessageMetaData>
+ {
+
+ private final long _messageId;
+ private volatile SoftReference<StorableMessageMetaData> _metaDataRef;
+
+ private StorableMessageMetaData _metaData;
+ private volatile SoftReference<byte[]> _dataRef;
+ private byte[] _data;
+
+ StoredBDBMessage(long messageId, StorableMessageMetaData metaData)
+ {
+ this(messageId, metaData, true);
+ }
+
+
+ StoredBDBMessage(long messageId,
+ StorableMessageMetaData metaData, boolean persist)
+ {
+ try
+ {
+ _messageId = messageId;
+ _metaData = metaData;
+
+ _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
+
+ }
+ catch (DatabaseException e)
+ {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ public StorableMessageMetaData getMetaData()
+ {
+ StorableMessageMetaData metaData = _metaDataRef.get();
+ if(metaData == null)
+ {
+ try
+ {
+ metaData = AbstractBDBMessageStore.this.getMessageMetaData(_messageId);
+ }
+ catch (AMQStoreException e)
+ {
+ throw new RuntimeException(e);
+ }
+ _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
+ }
+
+ return metaData;
+ }
+
+ public long getMessageNumber()
+ {
+ return _messageId;
+ }
+
+ public void addContent(int offsetInMessage, java.nio.ByteBuffer src)
+ {
+ src = src.slice();
+
+ if(_data == null)
+ {
+ _data = new byte[src.remaining()];
+ _dataRef = new SoftReference<byte[]>(_data);
+ src.duplicate().get(_data);
+ }
+ else
+ {
+ byte[] oldData = _data;
+ _data = new byte[oldData.length + src.remaining()];
+ _dataRef = new SoftReference<byte[]>(_data);
+
+ System.arraycopy(oldData,0,_data,0,oldData.length);
+ src.duplicate().get(_data, oldData.length, src.remaining());
+ }
+
+ }
+
+ public int getContent(int offsetInMessage, java.nio.ByteBuffer dst)
+ {
+ byte[] data = _dataRef == null ? null : _dataRef.get();
+ if(data != null)
+ {
+ int length = Math.min(dst.remaining(), data.length - offsetInMessage);
+ dst.put(data, offsetInMessage, length);
+ return length;
+ }
+ else
+ {
+ try
+ {
+ return AbstractBDBMessageStore.this.getContent(_messageId, offsetInMessage, dst);
+ }
+ catch (AMQStoreException e)
+ {
+ // TODO maybe should throw a checked exception, or at least log before throwing
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ public ByteBuffer getContent(int offsetInMessage, int size)
+ {
+ byte[] data = _dataRef == null ? null : _dataRef.get();
+ if(data != null)
+ {
+ return ByteBuffer.wrap(data,offsetInMessage,size);
+ }
+ else
+ {
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ getContent(offsetInMessage, buf);
+ buf.position(0);
+ return buf;
+ }
+ }
+
+ synchronized void store(com.sleepycat.je.Transaction txn)
+ {
+
+ if(_metaData != null)
+ {
+ try
+ {
+ _dataRef = new SoftReference<byte[]>(_data);
+ AbstractBDBMessageStore.this.storeMetaData(txn, _messageId, _metaData);
+ AbstractBDBMessageStore.this.addContent(txn, _messageId, 0,
+ _data == null ? ByteBuffer.allocate(0) : ByteBuffer.wrap(_data));
+ }
+ catch(DatabaseException e)
+ {
+ throw new RuntimeException(e);
+ }
+ catch (AMQStoreException e)
+ {
+ throw new RuntimeException(e);
+ }
+ catch (RuntimeException e)
+ {
+ LOGGER.error("RuntimeException during store", e);
+ throw e;
+ }
+ finally
+ {
+ _metaData = null;
+ _data = null;
+ }
+ }
+ }
+
+ public synchronized StoreFuture flushToStore()
+ {
+ if(_metaData != null)
+ {
+ com.sleepycat.je.Transaction txn = _environment.beginTransaction(null, null);
+ store(txn);
+ AbstractBDBMessageStore.this.commit(txn,true);
+
+ }
+ return StoreFuture.IMMEDIATE_FUTURE;
+ }
+
+ public void remove()
+ {
+ try
+ {
+ AbstractBDBMessageStore.this.removeMessage(_messageId, false);
+ }
+ catch (AMQStoreException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private class BDBTransaction implements org.apache.qpid.server.store.Transaction
+ {
+ private com.sleepycat.je.Transaction _txn;
+
+ private BDBTransaction()
+ {
+ try
+ {
+ _txn = _environment.beginTransaction(null, null);
+ }
+ catch (DatabaseException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
+ {
+ if(message.getStoredMessage() instanceof StoredBDBMessage)
+ {
+ ((StoredBDBMessage)message.getStoredMessage()).store(_txn);
+ }
+
+ AbstractBDBMessageStore.this.enqueueMessage(_txn, queue, message.getMessageNumber());
+ }
+
+ public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
+ {
+ AbstractBDBMessageStore.this.dequeueMessage(_txn, queue, message.getMessageNumber());
+ }
+
+ public void commitTran() throws AMQStoreException
+ {
+ AbstractBDBMessageStore.this.commitTranImpl(_txn, true);
+ }
+
+ public StoreFuture commitTranAsync() throws AMQStoreException
+ {
+ return AbstractBDBMessageStore.this.commitTranImpl(_txn, false);
+ }
+
+ public void abortTran() throws AMQStoreException
+ {
+ AbstractBDBMessageStore.this.abortTran(_txn);
+ }
+
+ public void removeXid(long format, byte[] globalId, byte[] branchId) throws AMQStoreException
+ {
+ AbstractBDBMessageStore.this.removeXid(_txn, format, globalId, branchId);
+ }
+
+ public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues,
+ Record[] dequeues) throws AMQStoreException
+ {
+ AbstractBDBMessageStore.this.recordXid(_txn, format, globalId, branchId, enqueues, dequeues);
+ }
+ }
+
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
+ {
+ _eventManager.addEventListener(eventListener, events);
+ }
+
+ @Override
+ public String getStoreLocation()
+ {
+ return _storeLocation;
+ }
+}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java
index c6d95f7100..9f7eb4bfd9 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStore.java
@@ -21,82 +21,19 @@
package org.apache.qpid.server.store.berkeleydb;
import java.io.File;
-import java.lang.ref.SoftReference;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
import java.util.Queue;
-import java.util.Random;
-import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-import org.apache.commons.configuration.Configuration;
import org.apache.log4j.Logger;
import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.exchange.Exchange;
-import org.apache.qpid.server.federation.Bridge;
-import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogMessage;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.logging.actors.CurrentActor;
-import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
-import org.apache.qpid.server.logging.messages.MessageStoreMessages;
-import org.apache.qpid.server.logging.messages.TransactionLogMessages;
-import org.apache.qpid.server.message.EnqueableMessage;
-import org.apache.qpid.server.queue.AMQQueue;
-import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
-import org.apache.qpid.server.store.ConfigurationRecoveryHandler.BindingRecoveryHandler;
-import org.apache.qpid.server.store.ConfigurationRecoveryHandler.ExchangeRecoveryHandler;
-import org.apache.qpid.server.store.ConfigurationRecoveryHandler.QueueRecoveryHandler;
-import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
-import org.apache.qpid.server.store.MessageStoreRecoveryHandler.StoredMessageRecoveryHandler;
-import org.apache.qpid.server.store.StorableMessageMetaData;
-import org.apache.qpid.server.store.StoredMemoryMessage;
-import org.apache.qpid.server.store.StoredMessage;
-import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
-import org.apache.qpid.server.store.TransactionLogRecoveryHandler.QueueEntryRecoveryHandler;
-import org.apache.qpid.server.store.TransactionLogResource;
-import org.apache.qpid.server.store.berkeleydb.entry.BindingRecord;
-import org.apache.qpid.server.store.berkeleydb.entry.ExchangeRecord;
-import org.apache.qpid.server.store.berkeleydb.entry.PreparedTransaction;
-import org.apache.qpid.server.store.berkeleydb.entry.QueueEntryKey;
-import org.apache.qpid.server.store.berkeleydb.entry.QueueRecord;
-import org.apache.qpid.server.store.berkeleydb.entry.Xid;
-import org.apache.qpid.server.store.berkeleydb.tuple.AMQShortStringBinding;
-import org.apache.qpid.server.store.berkeleydb.tuple.ContentBinding;
-import org.apache.qpid.server.store.berkeleydb.tuple.ExchangeBinding;
-import org.apache.qpid.server.store.berkeleydb.tuple.MessageMetaDataBinding;
-import org.apache.qpid.server.store.berkeleydb.tuple.PreparedTransactionBinding;
-import org.apache.qpid.server.store.berkeleydb.tuple.QueueBinding;
-import org.apache.qpid.server.store.berkeleydb.tuple.QueueBindingTupleBinding;
-import org.apache.qpid.server.store.berkeleydb.tuple.QueueEntryBinding;
-import org.apache.qpid.server.store.berkeleydb.tuple.StringMapBinding;
-import org.apache.qpid.server.store.berkeleydb.tuple.UUIDTupleBinding;
-import org.apache.qpid.server.store.berkeleydb.tuple.XidBinding;
-import org.apache.qpid.server.store.berkeleydb.upgrade.Upgrader;
+import org.apache.qpid.server.store.StoreFuture;
-import com.sleepycat.bind.tuple.ByteBinding;
-import com.sleepycat.bind.tuple.LongBinding;
import com.sleepycat.je.CheckpointConfig;
-import com.sleepycat.je.Cursor;
-import com.sleepycat.je.Database;
-import com.sleepycat.je.DatabaseConfig;
-import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
-import com.sleepycat.je.LockConflictException;
-import com.sleepycat.je.LockMode;
-import com.sleepycat.je.OperationStatus;
-import com.sleepycat.je.TransactionConfig;
/**
* BDBMessageStore implements a persistent {@link MessageStore} using the BDB high performance log.
@@ -106,259 +43,23 @@ import com.sleepycat.je.TransactionConfig;
* exchanges. <tr><td> Store and remove messages. <tr><td> Bind and unbind queues to exchanges. <tr><td> Enqueue and
* dequeue messages to queues. <tr><td> Generate message identifiers. </table>
*/
-@SuppressWarnings({"unchecked"})
-public class BDBMessageStore implements MessageStore, DurableConfigurationStore
+public class BDBMessageStore extends AbstractBDBMessageStore
{
- private static final Logger _log = Logger.getLogger(BDBMessageStore.class);
-
- private static final int LOCK_RETRY_ATTEMPTS = 5;
-
- public static final int VERSION = 6;
-
- public static final String ENVIRONMENT_PATH_PROPERTY = "environment-path";
-
- private Environment _environment;
-
- private String MESSAGEMETADATADB_NAME = "MESSAGE_METADATA";
- private String MESSAGECONTENTDB_NAME = "MESSAGE_CONTENT";
- private String QUEUEBINDINGSDB_NAME = "QUEUE_BINDINGS";
- private String DELIVERYDB_NAME = "DELIVERIES";
- private String EXCHANGEDB_NAME = "EXCHANGES";
- private String QUEUEDB_NAME = "QUEUES";
- private String BRIDGEDB_NAME = "BRIDGES";
- private String LINKDB_NAME = "LINKS";
- private String XIDDB_NAME = "XIDS";
-
-
- private Database _messageMetaDataDb;
- private Database _messageContentDb;
- private Database _queueBindingsDb;
- private Database _deliveryDb;
- private Database _exchangeDb;
- private Database _queueDb;
- private Database _bridgeDb;
- private Database _linkDb;
- private Database _xidDb;
-
- /* =======
- * Schema:
- * =======
- *
- * Queue:
- * name(AMQShortString) - name(AMQShortString), owner(AMQShortString),
- * arguments(FieldTable encoded as binary), exclusive (boolean)
- *
- * Exchange:
- * name(AMQShortString) - name(AMQShortString), typeName(AMQShortString), autodelete (boolean)
- *
- * Binding:
- * exchangeName(AMQShortString), queueName(AMQShortString), routingKey(AMQShortString),
- * arguments (FieldTable encoded as binary) - 0 (zero)
- *
- * QueueEntry:
- * queueName(AMQShortString), messageId (long) - 0 (zero)
- *
- * Message (MetaData):
- * messageId (long) - bodySize (integer), metaData (MessageMetaData encoded as binary)
- *
- * Message (Content):
- * messageId (long), byteOffset (integer) - dataLength(integer), data(binary)
- */
-
- private LogSubject _logSubject;
-
- private final AtomicLong _messageId = new AtomicLong(0);
+ private static final Logger LOGGER = Logger.getLogger(BDBMessageStore.class);
private final CommitThread _commitThread = new CommitThread("Commit-Thread");
- private enum State
- {
- INITIAL,
- CONFIGURING,
- CONFIGURED,
- RECOVERING,
- STARTED,
- CLOSING,
- CLOSED
- }
-
- private State _state = State.INITIAL;
-
- private TransactionConfig _transactionConfig = new TransactionConfig();
-
- private boolean _readOnly = false;
-
- private boolean _configured;
-
-
- public BDBMessageStore()
- {
- }
-
-
- public void configureConfigStore(String name,
- ConfigurationRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
- CurrentActor.get().message(logSubject, ConfigStoreMessages.CREATED(this.getClass().getName()));
-
- if(!_configured)
- {
- _logSubject = logSubject;
- configure(name,storeConfiguration);
- _configured = true;
- stateTransition(State.CONFIGURING, State.CONFIGURED);
- }
-
- recover(recoveryHandler);
- stateTransition(State.RECOVERING, State.STARTED);
- }
-
- public void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
- CurrentActor.get().message(logSubject, MessageStoreMessages.CREATED(this.getClass().getName()));
-
- if(!_configured)
- {
- _logSubject = logSubject;
- configure(name,storeConfiguration);
- _configured = true;
- stateTransition(State.CONFIGURING, State.CONFIGURED);
- }
-
- recoverMessages(recoveryHandler);
- }
-
- public void configureTransactionLog(String name, TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration, LogSubject logSubject) throws Exception
- {
- CurrentActor.get().message(logSubject, TransactionLogMessages.CREATED(this.getClass().getName()));
-
-
- if(!_configured)
- {
- _logSubject = logSubject;
- configure(name,storeConfiguration);
- _configured = true;
- stateTransition(State.CONFIGURING, State.CONFIGURED);
- }
-
- recoverQueueEntries(recoveryHandler);
-
-
-
- }
-
- public org.apache.qpid.server.store.MessageStore.Transaction newTransaction()
- {
- return new BDBTransaction();
- }
-
-
- /**
- * Called after instantiation in order to configure the message store.
- *
- * @param name The name of the virtual host using this store
- * @return whether a new store environment was created or not (to indicate whether recovery is necessary)
- *
- * @throws Exception If any error occurs that means the store is unable to configure itself.
- */
- public boolean configure(String name, Configuration storeConfig) throws Exception
- {
- File environmentPath = new File(storeConfig.getString(ENVIRONMENT_PATH_PROPERTY,
- System.getProperty("QPID_WORK") + "/bdbstore/" + name));
- if (!environmentPath.exists())
- {
- if (!environmentPath.mkdirs())
- {
- throw new IllegalArgumentException("Environment path " + environmentPath + " could not be read or created. "
- + "Ensure the path is correct and that the permissions are correct.");
- }
- }
-
- message(MessageStoreMessages.STORE_LOCATION(environmentPath.getAbsolutePath()));
-
- return configure(environmentPath, false);
- }
-
- void message(final LogMessage message)
- {
- CurrentActor.message(_logSubject, message);
- }
-
- /**
- * @param environmentPath location for the store to be created in/recovered from
- * @param readonly if true then don't allow modifications to an existing store, and don't create a new store if none exists
- * @return whether or not a new store environment was created
- * @throws AMQStoreException
- * @throws DatabaseException
- */
- protected boolean configure(File environmentPath, boolean readonly) throws AMQStoreException, DatabaseException
- {
- _readOnly = readonly;
- stateTransition(State.INITIAL, State.CONFIGURING);
-
- _log.info("Configuring BDB message store");
-
- return setupStore(environmentPath, readonly);
- }
-
- /**
- * Move the store state from CONFIGURING to STARTED.
- *
- * This is required if you do not want to perform recovery of the store data
- *
- * @throws AMQStoreException if the store is not in the correct state
- */
- public void start() throws AMQStoreException
- {
- stateTransition(State.CONFIGURING, State.STARTED);
- }
-
- private boolean setupStore(File storePath, boolean readonly) throws DatabaseException, AMQStoreException
+ @Override
+ protected void setupStore(File storePath, String name) throws DatabaseException, AMQStoreException
{
- checkState(State.CONFIGURING);
-
- boolean newEnvironment = createEnvironment(storePath, readonly);
-
- new Upgrader(_environment, _logSubject).upgradeIfNecessary();
-
- openDatabases(readonly);
+ super.setupStore(storePath, name);
- if (!readonly)
- {
- _commitThread.start();
- }
-
- return newEnvironment;
+ startCommitThread();
}
- private synchronized void stateTransition(State requiredState, State newState) throws AMQStoreException
+ protected Environment createEnvironment(File environmentPath) throws DatabaseException
{
- if (_state != requiredState)
- {
- throw new AMQStoreException("Cannot transition to the state: " + newState + "; need to be in state: " + requiredState
- + "; currently in state: " + _state);
- }
-
- _state = newState;
- }
-
- private void checkState(State requiredState) throws AMQStoreException
- {
- if (_state != requiredState)
- {
- throw new AMQStoreException("Unexpected state: " + _state + "; required state: " + requiredState);
- }
- }
-
- private boolean createEnvironment(File environmentPath, boolean readonly) throws DatabaseException
- {
- _log.info("BDB message store using environment path " + environmentPath.getAbsolutePath());
+ LOGGER.info("BDB message store using environment path " + environmentPath.getAbsolutePath());
EnvironmentConfig envConfig = new EnvironmentConfig();
// This is what allows the creation of the store if it does not already exist.
envConfig.setAllowCreate(true);
@@ -377,11 +78,10 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
_transactionConfig.setReadCommitted(true);
//This prevents background threads running which will potentially update the store.
- envConfig.setReadOnly(readonly);
+ envConfig.setReadOnly(false);
try
{
- _environment = new Environment(environmentPath, envConfig);
- return false;
+ return new Environment(environmentPath, envConfig);
}
catch (DatabaseException de)
{
@@ -389,14 +89,7 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
{
//Allow the creation this time
envConfig.setAllowCreate(true);
- if (_environment != null )
- {
- _environment.cleanLog();
- _environment.close();
- }
- _environment = new Environment(environmentPath, envConfig);
-
- return true;
+ return new Environment(environmentPath, envConfig);
}
else
{
@@ -405,1464 +98,18 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
}
}
- private void openDatabases(boolean readonly) throws DatabaseException
- {
- DatabaseConfig dbConfig = new DatabaseConfig();
- dbConfig.setTransactional(true);
- dbConfig.setAllowCreate(true);
-
- //This is required if we are wanting read only access.
- dbConfig.setReadOnly(readonly);
-
- _messageMetaDataDb = openDatabase(MESSAGEMETADATADB_NAME, dbConfig);
- _queueDb = openDatabase(QUEUEDB_NAME, dbConfig);
- _exchangeDb = openDatabase(EXCHANGEDB_NAME, dbConfig);
- _queueBindingsDb = openDatabase(QUEUEBINDINGSDB_NAME, dbConfig);
- _messageContentDb = openDatabase(MESSAGECONTENTDB_NAME, dbConfig);
- _deliveryDb = openDatabase(DELIVERYDB_NAME, dbConfig);
- _linkDb = openDatabase(LINKDB_NAME, dbConfig);
- _bridgeDb = openDatabase(BRIDGEDB_NAME, dbConfig);
- _xidDb = openDatabase(XIDDB_NAME, dbConfig);
-
-
- }
-
- private Database openDatabase(final String dbName, final DatabaseConfig dbConfig)
- {
- // if opening read-only and the database doesn't exist, then you can't create it
- return dbConfig.getReadOnly() && !_environment.getDatabaseNames().contains(dbName)
- ? null
- : _environment.openDatabase(null, dbName, dbConfig);
- }
-
- /**
- * Called to close and cleanup any resources used by the message store.
- *
- * @throws Exception If the close fails.
- */
- public void close() throws Exception
- {
- if (_state != State.STARTED)
- {
- return;
- }
-
- _state = State.CLOSING;
-
- _commitThread.close();
- _commitThread.join();
-
- if (_messageMetaDataDb != null)
- {
- _log.info("Closing message metadata database");
- _messageMetaDataDb.close();
- }
-
- if (_messageContentDb != null)
- {
- _log.info("Closing message content database");
- _messageContentDb.close();
- }
-
- if (_exchangeDb != null)
- {
- _log.info("Closing exchange database");
- _exchangeDb.close();
- }
-
- if (_queueBindingsDb != null)
- {
- _log.info("Closing bindings database");
- _queueBindingsDb.close();
- }
-
- if (_queueDb != null)
- {
- _log.info("Closing queue database");
- _queueDb.close();
- }
-
- if (_deliveryDb != null)
- {
- _log.info("Close delivery database");
- _deliveryDb.close();
- }
-
- if (_bridgeDb != null)
- {
- _log.info("Close bridge database");
- _bridgeDb.close();
- }
-
- if (_linkDb != null)
- {
- _log.info("Close link database");
- _linkDb.close();
- }
-
-
- if (_xidDb != null)
- {
- _log.info("Close xid database");
- _xidDb.close();
- }
-
- closeEnvironment();
-
- _state = State.CLOSED;
-
- message(MessageStoreMessages.CLOSED());
- }
-
- private void closeEnvironment() throws DatabaseException
- {
- if (_environment != null)
- {
- if(!_readOnly)
- {
- // Clean the log before closing. This makes sure it doesn't contain
- // redundant data. Closing without doing this means the cleaner may not
- // get a chance to finish.
- _environment.cleanLog();
- }
- _environment.close();
- }
- }
-
-
- public void recover(ConfigurationRecoveryHandler recoveryHandler) throws AMQStoreException
- {
- stateTransition(State.CONFIGURED, State.RECOVERING);
-
- message(MessageStoreMessages.RECOVERY_START());
-
- try
- {
- QueueRecoveryHandler qrh = recoveryHandler.begin(this);
- loadQueues(qrh);
-
- ExchangeRecoveryHandler erh = qrh.completeQueueRecovery();
- loadExchanges(erh);
-
- BindingRecoveryHandler brh = erh.completeExchangeRecovery();
- recoverBindings(brh);
-
- ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh = brh.completeBindingRecovery();
- recoverBrokerLinks(lrh);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error recovering persistent state: " + e.getMessage(), e);
- }
-
- }
-
- private void loadQueues(QueueRecoveryHandler qrh) throws DatabaseException
- {
- Cursor cursor = null;
-
- try
- {
- cursor = _queueDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
- QueueBinding binding = QueueBinding.getInstance();
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- QueueRecord queueRecord = binding.entryToObject(value);
-
- String queueName = queueRecord.getNameShortString() == null ? null :
- queueRecord.getNameShortString().asString();
- String owner = queueRecord.getOwner() == null ? null :
- queueRecord.getOwner().asString();
- boolean exclusive = queueRecord.isExclusive();
-
- FieldTable arguments = queueRecord.getArguments();
-
- qrh.queue(queueName, owner, exclusive, arguments);
- }
-
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
- }
-
-
- private void loadExchanges(ExchangeRecoveryHandler erh) throws DatabaseException
- {
- Cursor cursor = null;
-
- try
- {
- cursor = _exchangeDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
- ExchangeBinding binding = ExchangeBinding.getInstance();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- ExchangeRecord exchangeRec = binding.entryToObject(value);
-
- String exchangeName = exchangeRec.getNameShortString() == null ? null :
- exchangeRec.getNameShortString().asString();
- String type = exchangeRec.getType() == null ? null :
- exchangeRec.getType().asString();
- boolean autoDelete = exchangeRec.isAutoDelete();
-
- erh.exchange(exchangeName, type, autoDelete);
- }
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
- }
-
- private void recoverBindings(BindingRecoveryHandler brh) throws DatabaseException
- {
- Cursor cursor = null;
- try
- {
- cursor = _queueBindingsDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
- QueueBindingTupleBinding binding = QueueBindingTupleBinding.getInstance();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- //yes, this is retrieving all the useful information from the key only.
- //For table compatibility it shall currently be left as is
- BindingRecord bindingRecord = binding.entryToObject(key);
-
- String exchangeName = bindingRecord.getExchangeName() == null ? null :
- bindingRecord.getExchangeName().asString();
- String queueName = bindingRecord.getQueueName() == null ? null :
- bindingRecord.getQueueName().asString();
- String routingKey = bindingRecord.getRoutingKey() == null ? null :
- bindingRecord.getRoutingKey().asString();
- ByteBuffer argumentsBB = (bindingRecord.getArguments() == null ? null :
- java.nio.ByteBuffer.wrap(bindingRecord.getArguments().getDataAsBytes()));
-
- brh.binding(exchangeName, queueName, routingKey, argumentsBB);
- }
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
- }
-
-
- private void recoverBrokerLinks(final ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh)
- {
- Cursor cursor = null;
-
- try
- {
- cursor = _linkDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
- long createTime = LongBinding.entryToLong(value);
- Map<String,String> arguments = StringMapBinding.getInstance().entryToObject(value);
-
- ConfigurationRecoveryHandler.BridgeRecoveryHandler brh = lrh.brokerLink(id, createTime, arguments);
-
- recoverBridges(brh, id);
- }
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
- }
-
- private void recoverBridges(final ConfigurationRecoveryHandler.BridgeRecoveryHandler brh, final UUID linkId)
- {
- Cursor cursor = null;
-
- try
- {
- cursor = _bridgeDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
-
- UUID parentId = UUIDTupleBinding.getInstance().entryToObject(value);
- if(parentId.equals(linkId))
- {
-
- long createTime = LongBinding.entryToLong(value);
- Map<String,String> arguments = StringMapBinding.getInstance().entryToObject(value);
- brh.bridge(id,createTime,arguments);
- }
- }
- brh.completeBridgeRecoveryForLink();
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
- }
-
-
- private void recoverMessages(MessageStoreRecoveryHandler msrh) throws DatabaseException
- {
- StoredMessageRecoveryHandler mrh = msrh.begin();
-
- Cursor cursor = null;
- try
- {
- cursor = _messageMetaDataDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- DatabaseEntry value = new DatabaseEntry();
- MessageMetaDataBinding valueBinding = MessageMetaDataBinding.getInstance();
-
- long maxId = 0;
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- long messageId = LongBinding.entryToLong(key);
- StorableMessageMetaData metaData = valueBinding.entryToObject(value);
-
- StoredBDBMessage message = new StoredBDBMessage(messageId, metaData, false);
- mrh.message(message);
-
- maxId = Math.max(maxId, messageId);
- }
-
- _messageId.set(maxId);
- }
- catch (DatabaseException e)
- {
- _log.error("Database Error: " + e.getMessage(), e);
- throw e;
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
- }
-
- private void recoverQueueEntries(TransactionLogRecoveryHandler recoveryHandler)
- throws DatabaseException
- {
- QueueEntryRecoveryHandler qerh = recoveryHandler.begin(this);
-
- ArrayList<QueueEntryKey> entries = new ArrayList<QueueEntryKey>();
-
- Cursor cursor = null;
- try
- {
- cursor = _deliveryDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
-
- DatabaseEntry value = new DatabaseEntry();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- QueueEntryKey qek = keyBinding.entryToObject(key);
-
- entries.add(qek);
- }
-
- try
- {
- cursor.close();
- }
- finally
- {
- cursor = null;
- }
-
- for(QueueEntryKey entry : entries)
- {
- AMQShortString queueName = entry.getQueueName();
- long messageId = entry.getMessageId();
-
- qerh.queueEntry(queueName.asString(),messageId);
- }
- }
- catch (DatabaseException e)
- {
- _log.error("Database Error: " + e.getMessage(), e);
- throw e;
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
-
-
- TransactionLogRecoveryHandler.DtxRecordRecoveryHandler dtxrh = qerh.completeQueueEntryRecovery();
-
- cursor = null;
- try
- {
- cursor = _xidDb.openCursor(null, null);
- DatabaseEntry key = new DatabaseEntry();
- XidBinding keyBinding = XidBinding.getInstance();
- PreparedTransactionBinding valueBinding = new PreparedTransactionBinding();
- DatabaseEntry value = new DatabaseEntry();
-
- while (cursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS)
- {
- Xid xid = keyBinding.entryToObject(key);
- PreparedTransaction preparedTransaction = valueBinding.entryToObject(value);
- dtxrh.dtxRecord(xid.getFormat(),xid.getGlobalId(),xid.getBranchId(),
- preparedTransaction.getEnqueues(),preparedTransaction.getDequeues());
- }
-
- try
- {
- cursor.close();
- }
- finally
- {
- cursor = null;
- }
-
- }
- catch (DatabaseException e)
- {
- _log.error("Database Error: " + e.getMessage(), e);
- throw e;
- }
- finally
- {
- if (cursor != null)
- {
- cursor.close();
- }
- }
-
-
- dtxrh.completeDtxRecordRecovery();
- }
-
- /**
- * Removes the specified message from the store.
- *
- * @param messageId Identifies the message to remove.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void removeMessage(long messageId) throws AMQStoreException
- {
- removeMessage(messageId, true);
- }
- public void removeMessage(long messageId, boolean sync) throws AMQStoreException
- {
-
- boolean complete = false;
- com.sleepycat.je.Transaction tx = null;
-
- Random rand = null;
- int attempts = 0;
- try
- {
- do
- {
- tx = null;
- try
- {
- tx = _environment.beginTransaction(null, null);
-
- //remove the message meta data from the store
- DatabaseEntry key = new DatabaseEntry();
- LongBinding.longToEntry(messageId, key);
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Removing message id " + messageId);
- }
-
-
- OperationStatus status = _messageMetaDataDb.delete(tx, key);
- if (status == OperationStatus.NOTFOUND)
- {
- _log.info("Message not found (attempt to remove failed - probably application initiated rollback) " +
- messageId);
- }
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Deleted metadata for message " + messageId);
- }
-
- //now remove the content data from the store if there is any.
- DatabaseEntry contentKeyEntry = new DatabaseEntry();
- LongBinding.longToEntry(messageId, contentKeyEntry);
- _messageContentDb.delete(tx, contentKeyEntry);
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Deleted content for message " + messageId);
- }
-
- commit(tx, sync);
- complete = true;
- tx = null;
- }
- catch (LockConflictException e)
- {
- try
- {
- if(tx != null)
- {
- tx.abort();
- }
- }
- catch(DatabaseException e2)
- {
- _log.warn("Unable to abort transaction after LockConflictExcption", e2);
- // rethrow the original log conflict exception, the secondary exception should already have
- // been logged.
- throw e;
- }
-
-
- _log.warn("Lock timeout exception. Retrying (attempt "
- + (attempts+1) + " of "+ LOCK_RETRY_ATTEMPTS +") " + e);
-
- if(++attempts < LOCK_RETRY_ATTEMPTS)
- {
- if(rand == null)
- {
- rand = new Random();
- }
-
- try
- {
- Thread.sleep(500l + (long)(500l * rand.nextDouble()));
- }
- catch (InterruptedException e1)
- {
-
- }
- }
- else
- {
- // rethrow the lock conflict exception since we could not solve by retrying
- throw e;
- }
- }
- }
- while(!complete);
- }
- catch (DatabaseException e)
- {
- _log.error("Unexpected BDB exception", e);
-
- if (tx != null)
- {
- try
- {
- tx.abort();
- tx = null;
- }
- catch (DatabaseException e1)
- {
- throw new AMQStoreException("Error aborting transaction " + e1, e1);
- }
- }
-
- throw new AMQStoreException("Error removing message with id " + messageId + " from database: " + e.getMessage(), e);
- }
- finally
- {
- if (tx != null)
- {
- try
- {
- tx.abort();
- tx = null;
- }
- catch (DatabaseException e1)
- {
- throw new AMQStoreException("Error aborting transaction " + e1, e1);
- }
- }
- }
- }
-
- /**
- * @see DurableConfigurationStore#createExchange(Exchange)
- */
- public void createExchange(Exchange exchange) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- ExchangeRecord exchangeRec = new ExchangeRecord(exchange.getNameShortString(),
- exchange.getTypeShortString(), exchange.isAutoDelete());
-
- DatabaseEntry key = new DatabaseEntry();
- AMQShortStringBinding keyBinding = AMQShortStringBinding.getInstance();
- keyBinding.objectToEntry(exchange.getNameShortString(), key);
-
- DatabaseEntry value = new DatabaseEntry();
- ExchangeBinding exchangeBinding = ExchangeBinding.getInstance();
- exchangeBinding.objectToEntry(exchangeRec, value);
-
- try
- {
- _exchangeDb.put(null, key, value);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing Exchange with name " + exchange.getName() + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- /**
- * @see DurableConfigurationStore#removeExchange(Exchange)
- */
- public void removeExchange(Exchange exchange) throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- AMQShortStringBinding keyBinding = AMQShortStringBinding.getInstance();
- keyBinding.objectToEntry(exchange.getNameShortString(), key);
- try
- {
- OperationStatus status = _exchangeDb.delete(null, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Exchange " + exchange.getName() + " not found");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing deleting with name " + exchange.getName() + " from database: " + e.getMessage(), e);
- }
- }
-
-
- /**
- * @see DurableConfigurationStore#bindQueue(Exchange, AMQShortString, AMQQueue, FieldTable)
- */
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
- bindQueue(new BindingRecord(exchange.getNameShortString(), queue.getNameShortString(), routingKey, args));
- }
-
- protected void bindQueue(final BindingRecord bindingRecord) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- DatabaseEntry key = new DatabaseEntry();
- QueueBindingTupleBinding keyBinding = QueueBindingTupleBinding.getInstance();
-
- keyBinding.objectToEntry(bindingRecord, key);
-
- //yes, this is writing out 0 as a value and putting all the
- //useful info into the key, don't ask me why. For table
- //compatibility it shall currently be left as is
- DatabaseEntry value = new DatabaseEntry();
- ByteBinding.byteToEntry((byte) 0, value);
-
- try
- {
- _queueBindingsDb.put(null, key, value);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing binding for AMQQueue with name " + bindingRecord.getQueueName() + " to exchange "
- + bindingRecord.getExchangeName() + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- /**
- * @see DurableConfigurationStore#unbindQueue(Exchange, AMQShortString, AMQQueue, FieldTable)
- */
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args)
- throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- QueueBindingTupleBinding keyBinding = QueueBindingTupleBinding.getInstance();
- keyBinding.objectToEntry(new BindingRecord(exchange.getNameShortString(), queue.getNameShortString(), routingKey, args), key);
-
- try
- {
- OperationStatus status = _queueBindingsDb.delete(null, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Queue binding for queue with name " + queue.getName() + " to exchange "
- + exchange.getName() + " not found");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error deleting queue binding for queue with name " + queue.getName() + " to exchange "
- + exchange.getName() + " from database: " + e.getMessage(), e);
- }
- }
-
- /**
- * @see DurableConfigurationStore#createQueue(AMQQueue)
- */
- public void createQueue(AMQQueue queue) throws AMQStoreException
- {
- createQueue(queue, null);
- }
-
- /**
- * @see DurableConfigurationStore#createQueue(AMQQueue, FieldTable)
- */
- public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("public void createQueue(AMQQueue queue(" + queue.getName() + ") = " + queue + "): called");
- }
-
- QueueRecord queueRecord= new QueueRecord(queue.getNameShortString(),
- queue.getOwner(), queue.isExclusive(), arguments);
-
- createQueue(queueRecord);
- }
-
- /**
- * Makes the specified queue persistent.
- *
- * Only intended for direct use during store upgrades.
- *
- * @param queueRecord Details of the queue to store.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- protected void createQueue(QueueRecord queueRecord) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- DatabaseEntry key = new DatabaseEntry();
- AMQShortStringBinding keyBinding = AMQShortStringBinding.getInstance();
- keyBinding.objectToEntry(queueRecord.getNameShortString(), key);
-
- DatabaseEntry value = new DatabaseEntry();
- QueueBinding queueBinding = QueueBinding.getInstance();
-
- queueBinding.objectToEntry(queueRecord, value);
- try
- {
- _queueDb.put(null, key, value);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing AMQQueue with name " + queueRecord.getNameShortString().asString()
- + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- /**
- * Updates the specified queue in the persistent store, IF it is already present. If the queue
- * is not present in the store, it will not be added.
- *
- * NOTE: Currently only updates the exclusivity.
- *
- * @param queue The queue to update the entry for.
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void updateQueue(final AMQQueue queue) throws AMQStoreException
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("Updating queue: " + queue.getName());
- }
-
- try
- {
- DatabaseEntry key = new DatabaseEntry();
- AMQShortStringBinding keyBinding = AMQShortStringBinding.getInstance();
- keyBinding.objectToEntry(queue.getNameShortString(), key);
-
- DatabaseEntry value = new DatabaseEntry();
- DatabaseEntry newValue = new DatabaseEntry();
- QueueBinding queueBinding = QueueBinding.getInstance();
-
- OperationStatus status = _queueDb.get(null, key, value, LockMode.DEFAULT);
- if(status == OperationStatus.SUCCESS)
- {
- //read the existing record and apply the new exclusivity setting
- QueueRecord queueRecord = queueBinding.entryToObject(value);
- queueRecord.setExclusive(queue.isExclusive());
-
- //write the updated entry to the store
- queueBinding.objectToEntry(queueRecord, newValue);
-
- _queueDb.put(null, key, newValue);
- }
- else if(status != OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Error updating queue details within the store: " + status);
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error updating queue details within the store: " + e,e);
- }
- }
-
- /**
- * Removes the specified queue from the persistent store.
- *
- * @param queue The queue to remove.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void removeQueue(final AMQQueue queue) throws AMQStoreException
- {
- AMQShortString name = queue.getNameShortString();
-
- if (_log.isDebugEnabled())
- {
- _log.debug("public void removeQueue(AMQShortString name = " + name + "): called");
- }
-
- DatabaseEntry key = new DatabaseEntry();
- AMQShortStringBinding keyBinding = AMQShortStringBinding.getInstance();
- keyBinding.objectToEntry(name, key);
- try
- {
- OperationStatus status = _queueDb.delete(null, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Queue " + name + " not found");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing deleting with name " + name + " from database: " + e.getMessage(), e);
- }
- }
-
- public void createBrokerLink(final BrokerLink link) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- DatabaseEntry key = new DatabaseEntry();
- UUIDTupleBinding.getInstance().objectToEntry(link.getId(), key);
-
- DatabaseEntry value = new DatabaseEntry();
- LongBinding.longToEntry(link.getCreateTime(),value);
- StringMapBinding.getInstance().objectToEntry(link.getArguments(), value);
-
- try
- {
- _linkDb.put(null, key, value);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing Link " + link
- + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- UUIDTupleBinding.getInstance().objectToEntry(link.getId(), key);
- try
- {
- OperationStatus status = _linkDb.delete(null, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Link " + link + " not found");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error deleting the Link " + link + " from database: " + e.getMessage(), e);
- }
- }
-
- public void createBridge(final Bridge bridge) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- DatabaseEntry key = new DatabaseEntry();
- UUIDTupleBinding.getInstance().objectToEntry(bridge.getId(), key);
-
- DatabaseEntry value = new DatabaseEntry();
- UUIDTupleBinding.getInstance().objectToEntry(bridge.getLink().getId(),value);
- LongBinding.longToEntry(bridge.getCreateTime(),value);
- StringMapBinding.getInstance().objectToEntry(bridge.getArguments(), value);
-
- try
- {
- _bridgeDb.put(null, key, value);
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing Bridge " + bridge
- + " to database: " + e.getMessage(), e);
- }
-
- }
- }
-
- public void deleteBridge(final Bridge bridge) throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- UUIDTupleBinding.getInstance().objectToEntry(bridge.getId(), key);
- try
- {
- OperationStatus status = _bridgeDb.delete(null, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Bridge " + bridge + " not found");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error deleting the Bridge " + bridge + " from database: " + e.getMessage(), e);
- }
- }
-
- /**
- * Places a message onto a specified queue, in a given transaction.
- *
- * @param tx The transaction for the operation.
- * @param queue The the queue to place the message on.
- * @param messageId The message to enqueue.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void enqueueMessage(final com.sleepycat.je.Transaction tx, final TransactionLogResource queue,
- long messageId) throws AMQStoreException
- {
- AMQShortString name = AMQShortString.valueOf(queue.getResourceName());
-
- DatabaseEntry key = new DatabaseEntry();
- QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
- QueueEntryKey dd = new QueueEntryKey(name, messageId);
- keyBinding.objectToEntry(dd, key);
- DatabaseEntry value = new DatabaseEntry();
- ByteBinding.byteToEntry((byte) 0, value);
-
- try
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("Enqueuing message " + messageId + " on queue " + name + " [Transaction" + tx + "]");
- }
- _deliveryDb.put(tx, key, value);
- }
- catch (DatabaseException e)
- {
- _log.error("Failed to enqueue: " + e.getMessage(), e);
- throw new AMQStoreException("Error writing enqueued message with id " + messageId + " for queue " + name
- + " to database", e);
- }
- }
-
- /**
- * Extracts a message from a specified queue, in a given transaction.
- *
- * @param tx The transaction for the operation.
- * @param queue The name queue to take the message from.
- * @param messageId The message to dequeue.
- *
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- public void dequeueMessage(final com.sleepycat.je.Transaction tx, final TransactionLogResource queue,
- long messageId) throws AMQStoreException
- {
- AMQShortString name = new AMQShortString(queue.getResourceName());
-
- DatabaseEntry key = new DatabaseEntry();
- QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
- QueueEntryKey queueEntryKey = new QueueEntryKey(name, messageId);
-
- keyBinding.objectToEntry(queueEntryKey, key);
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Dequeue message id " + messageId);
- }
-
- try
- {
-
- OperationStatus status = _deliveryDb.delete(tx, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Unable to find message with id " + messageId + " on queue " + name);
- }
- else if (status != OperationStatus.SUCCESS)
- {
- throw new AMQStoreException("Unable to remove message with id " + messageId + " on queue " + name);
- }
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Removed message " + messageId + ", " + name + " from delivery db");
-
- }
- }
- catch (DatabaseException e)
- {
-
- _log.error("Failed to dequeue message " + messageId + ": " + e.getMessage(), e);
- _log.error(tx);
-
- throw new AMQStoreException("Error accessing database while dequeuing message: " + e.getMessage(), e);
- }
- }
-
-
- private void recordXid(com.sleepycat.je.Transaction txn,
- long format,
- byte[] globalId,
- byte[] branchId,
- Transaction.Record[] enqueues,
- Transaction.Record[] dequeues) throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- Xid xid = new Xid(format, globalId, branchId);
- XidBinding keyBinding = XidBinding.getInstance();
- keyBinding.objectToEntry(xid,key);
-
- DatabaseEntry value = new DatabaseEntry();
- PreparedTransaction preparedTransaction = new PreparedTransaction(enqueues, dequeues);
- PreparedTransactionBinding valueBinding = new PreparedTransactionBinding();
- valueBinding.objectToEntry(preparedTransaction, value);
-
- try
- {
- _xidDb.put(txn, key, value);
- }
- catch (DatabaseException e)
- {
- _log.error("Failed to write xid: " + e.getMessage(), e);
- throw new AMQStoreException("Error writing xid to database", e);
- }
- }
-
- private void removeXid(com.sleepycat.je.Transaction txn, long format, byte[] globalId, byte[] branchId)
- throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- Xid xid = new Xid(format, globalId, branchId);
- XidBinding keyBinding = XidBinding.getInstance();
-
- keyBinding.objectToEntry(xid, key);
-
-
- try
- {
-
- OperationStatus status = _xidDb.delete(txn, key);
- if (status == OperationStatus.NOTFOUND)
- {
- throw new AMQStoreException("Unable to find xid");
- }
- else if (status != OperationStatus.SUCCESS)
- {
- throw new AMQStoreException("Unable to remove xid");
- }
-
- }
- catch (DatabaseException e)
- {
-
- _log.error("Failed to remove xid ", e);
- _log.error(txn);
-
- throw new AMQStoreException("Error accessing database while removing xid: " + e.getMessage(), e);
- }
- }
-
- /**
- * Commits all operations performed within a given transaction.
- *
- * @param tx The transaction to commit all operations for.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- private StoreFuture commitTranImpl(final com.sleepycat.je.Transaction tx, boolean syncCommit) throws AMQStoreException
- {
- if (tx == null)
- {
- throw new AMQStoreException("Fatal internal error: transactional is null at commitTran");
- }
-
- StoreFuture result;
- try
- {
- result = commit(tx, syncCommit);
-
- if (_log.isDebugEnabled())
- {
- _log.debug("commitTranImpl completed for [Transaction:" + tx + "]");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error commit tx: " + e.getMessage(), e);
- }
-
- return result;
- }
-
- /**
- * Abandons all operations performed within a given transaction.
- *
- * @param tx The transaction to abandon.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void abortTran(final com.sleepycat.je.Transaction tx) throws AMQStoreException
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("abortTran called for [Transaction:" + tx + "]");
- }
-
- try
- {
- tx.abort();
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error aborting transaction: " + e.getMessage(), e);
- }
- }
-
- /**
- * Primarily for testing purposes.
- *
- * @param queueName
- *
- * @return a list of message ids for messages enqueued for a particular queue
- */
- List<Long> getEnqueuedMessages(AMQShortString queueName) throws AMQStoreException
- {
- Cursor cursor = null;
- try
- {
- cursor = _deliveryDb.openCursor(null, null);
-
- DatabaseEntry key = new DatabaseEntry();
-
- QueueEntryKey dd = new QueueEntryKey(queueName, 0);
-
- QueueEntryBinding keyBinding = QueueEntryBinding.getInstance();
- keyBinding.objectToEntry(dd, key);
-
- DatabaseEntry value = new DatabaseEntry();
-
- LinkedList<Long> messageIds = new LinkedList<Long>();
-
- OperationStatus status = cursor.getSearchKeyRange(key, value, LockMode.DEFAULT);
- dd = keyBinding.entryToObject(key);
-
- while ((status == OperationStatus.SUCCESS) && dd.getQueueName().equals(queueName))
- {
-
- messageIds.add(dd.getMessageId());
- status = cursor.getNext(key, value, LockMode.DEFAULT);
- if (status == OperationStatus.SUCCESS)
- {
- dd = keyBinding.entryToObject(key);
- }
- }
-
- return messageIds;
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Database error: " + e.getMessage(), e);
- }
- finally
- {
- if (cursor != null)
- {
- try
- {
- cursor.close();
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error closing cursor: " + e.getMessage(), e);
- }
- }
- }
- }
-
- /**
- * Return a valid, currently unused message id.
- *
- * @return A fresh message id.
- */
- public long getNewMessageId()
- {
- return _messageId.incrementAndGet();
- }
-
- /**
- * Stores a chunk of message data.
- *
- * @param tx The transaction for the operation.
- * @param messageId The message to store the data for.
- * @param contentBody The content of the data chunk.
- *
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- protected void addContent(final com.sleepycat.je.Transaction tx, long messageId,
- ByteBuffer contentBody) throws AMQStoreException
- {
- DatabaseEntry key = new DatabaseEntry();
- LongBinding.longToEntry(messageId, key);
- DatabaseEntry value = new DatabaseEntry();
- ContentBinding messageBinding = ContentBinding.getInstance();
- messageBinding.objectToEntry(contentBody.array(), value);
- try
- {
- OperationStatus status = _messageContentDb.put(tx, key, value);
- if (status != OperationStatus.SUCCESS)
- {
- throw new AMQStoreException("Error adding content for message id " + messageId + ": " + status);
- }
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Storing content for message " + messageId + "[Transaction" + tx + "]");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing AMQMessage with id " + messageId + " to database: " + e.getMessage(), e);
- }
- }
-
- /**
- * Stores message meta-data.
- *
- * @param tx The transaction for the operation.
- * @param messageId The message to store the data for.
- * @param messageMetaData The message meta data to store.
- *
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- private void storeMetaData(final com.sleepycat.je.Transaction tx, long messageId,
- StorableMessageMetaData messageMetaData)
- throws AMQStoreException
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("public void storeMetaData(Txn tx = " + tx + ", Long messageId = "
- + messageId + ", MessageMetaData messageMetaData = " + messageMetaData + "): called");
- }
-
- DatabaseEntry key = new DatabaseEntry();
- LongBinding.longToEntry(messageId, key);
- DatabaseEntry value = new DatabaseEntry();
-
- MessageMetaDataBinding messageBinding = MessageMetaDataBinding.getInstance();
- messageBinding.objectToEntry(messageMetaData, value);
- try
- {
- _messageMetaDataDb.put(tx, key, value);
- if (_log.isDebugEnabled())
- {
- _log.debug("Storing message metadata for message id " + messageId + "[Transaction" + tx + "]");
- }
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error writing message metadata with id " + messageId + " to database: " + e.getMessage(), e);
- }
- }
-
- /**
- * Retrieves message meta-data.
- *
- * @param messageId The message to get the meta-data for.
- *
- * @return The message meta data.
- *
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- public StorableMessageMetaData getMessageMetaData(long messageId) throws AMQStoreException
- {
- if (_log.isDebugEnabled())
- {
- _log.debug("public MessageMetaData getMessageMetaData(Long messageId = "
- + messageId + "): called");
- }
-
- DatabaseEntry key = new DatabaseEntry();
- LongBinding.longToEntry(messageId, key);
- DatabaseEntry value = new DatabaseEntry();
- MessageMetaDataBinding messageBinding = MessageMetaDataBinding.getInstance();
-
- try
- {
- OperationStatus status = _messageMetaDataDb.get(null, key, value, LockMode.READ_UNCOMMITTED);
- if (status != OperationStatus.SUCCESS)
- {
- throw new AMQStoreException("Metadata not found for message with id " + messageId);
- }
-
- StorableMessageMetaData mdd = messageBinding.entryToObject(value);
-
- return mdd;
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error reading message metadata for message with id " + messageId + ": " + e.getMessage(), e);
- }
- }
-
- /**
- * Fills the provided ByteBuffer with as much content for the specified message as possible, starting
- * from the specified offset in the message.
- *
- * @param messageId The message to get the data for.
- * @param offset The offset of the data within the message.
- * @param dst The destination of the content read back
- *
- * @return The number of bytes inserted into the destination
- *
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- public int getContent(long messageId, int offset, ByteBuffer dst) throws AMQStoreException
- {
- DatabaseEntry contentKeyEntry = new DatabaseEntry();
-
- LongBinding.longToEntry(messageId, contentKeyEntry);
- DatabaseEntry value = new DatabaseEntry();
- ContentBinding contentTupleBinding = ContentBinding.getInstance();
-
- if (_log.isDebugEnabled())
- {
- _log.debug("Message Id: " + messageId + " Getting content body from offset: " + offset);
- }
-
- try
- {
- int written = 0;
- OperationStatus status = _messageContentDb.get(null, contentKeyEntry, value, LockMode.READ_UNCOMMITTED);
- if (status == OperationStatus.SUCCESS)
- {
- byte[] dataAsBytes = contentTupleBinding.entryToObject(value);
- int size = dataAsBytes.length;
- if (offset > size)
- {
- throw new RuntimeException("Offset " + offset + " is greater than message size " + size
- + " for message id " + messageId + "!");
- }
-
- written = size - offset;
- if(written > dst.remaining())
- {
- written = dst.remaining();
- }
- dst.put(dataAsBytes, offset, written);
- }
- return written;
- }
- catch (DatabaseException e)
- {
- throw new AMQStoreException("Error getting AMQMessage with id " + messageId + " to database: " + e.getMessage(), e);
- }
- }
-
- public boolean isPersistent()
- {
- return true;
- }
-
- public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(T metaData)
- {
- if(metaData.isPersistent())
- {
- return (StoredMessage<T>) new StoredBDBMessage(getNewMessageId(), metaData);
- }
- else
- {
- return new StoredMemoryMessage(getNewMessageId(), metaData);
- }
- }
-
-
- //Package getters for the various databases used by the Store
- Database getMetaDataDb()
- {
- return _messageMetaDataDb;
- }
- Database getContentDb()
+ @Override
+ protected void closeInternal() throws Exception
{
- return _messageContentDb;
- }
+ stopCommitThread();
- Database getQueuesDb()
- {
- return _queueDb;
+ super.closeInternal();
}
- Database getDeliveryDb()
- {
- return _deliveryDb;
- }
-
- Database getExchangesDb()
- {
- return _exchangeDb;
- }
-
- Database getBindingsDb()
- {
- return _queueBindingsDb;
- }
-
- Environment getEnvironment()
- {
- return _environment;
- }
-
- private StoreFuture commit(com.sleepycat.je.Transaction tx, boolean syncCommit) throws DatabaseException
+ @Override
+ protected StoreFuture commit(com.sleepycat.je.Transaction tx, boolean syncCommit) throws DatabaseException
{
tx.commitNoSync();
@@ -1872,11 +119,17 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
return commitFuture;
}
- public void startCommitThread()
+ private void startCommitThread()
{
_commitThread.start();
}
+ private void stopCommitThread() throws InterruptedException
+ {
+ _commitThread.close();
+ _commitThread.join();
+ }
+
private static final class BDBCommitFuture implements StoreFuture
{
private final CommitThread _commitThread;
@@ -1894,9 +147,9 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
public synchronized void complete()
{
- if (_log.isDebugEnabled())
+ if (LOGGER.isDebugEnabled())
{
- _log.debug("public synchronized void complete(): called (Transaction = " + _tx + ")");
+ LOGGER.debug("public synchronized void complete(): called (Transaction = " + _tx + ")");
}
_complete = true;
@@ -1917,7 +170,7 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
if(!_syncCommit)
{
- _log.debug("CommitAsync was requested, returning immediately.");
+ LOGGER.debug("CommitAsync was requested, returning immediately.");
return;
}
@@ -1959,7 +212,7 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
* continuing, but it is the responsibility of this thread to tell the commit operations when they have been
* completed by calling back on their {@link BDBCommitFuture#complete()} and {@link BDBCommitFuture#abort} methods.
*
- * <p/><table id="crc"><caption>CRC Card</caption> <tr><th> Responsibilities <th> Collarations </table>
+ * <p/><table id="crc"><caption>CRC Card</caption> <tr><th> Responsibilities <th> Collaborations </table>
*/
private class CommitThread extends Thread
{
@@ -2012,7 +265,7 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
try
{
- _environment.flushLog(true);
+ getEnvironment().flushLog(true);
for(int i = 0; i < size; i++)
{
@@ -2060,241 +313,4 @@ public class BDBMessageStore implements MessageStore, DurableConfigurationStore
}
}
-
- private class StoredBDBMessage implements StoredMessage<StorableMessageMetaData>
- {
-
- private final long _messageId;
- private volatile SoftReference<StorableMessageMetaData> _metaDataRef;
-
- private StorableMessageMetaData _metaData;
- private volatile SoftReference<byte[]> _dataRef;
- private byte[] _data;
-
- StoredBDBMessage(long messageId, StorableMessageMetaData metaData)
- {
- this(messageId, metaData, true);
- }
-
-
- StoredBDBMessage(long messageId,
- StorableMessageMetaData metaData, boolean persist)
- {
- try
- {
- _messageId = messageId;
- _metaData = metaData;
-
- _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
-
- }
- catch (DatabaseException e)
- {
- throw new RuntimeException(e);
- }
-
- }
-
- public StorableMessageMetaData getMetaData()
- {
- StorableMessageMetaData metaData = _metaDataRef.get();
- if(metaData == null)
- {
- try
- {
- metaData = BDBMessageStore.this.getMessageMetaData(_messageId);
- }
- catch (AMQStoreException e)
- {
- throw new RuntimeException(e);
- }
- _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
- }
-
- return metaData;
- }
-
- public long getMessageNumber()
- {
- return _messageId;
- }
-
- public void addContent(int offsetInMessage, java.nio.ByteBuffer src)
- {
- src = src.slice();
-
- if(_data == null)
- {
- _data = new byte[src.remaining()];
- _dataRef = new SoftReference<byte[]>(_data);
- src.duplicate().get(_data);
- }
- else
- {
- byte[] oldData = _data;
- _data = new byte[oldData.length + src.remaining()];
- _dataRef = new SoftReference<byte[]>(_data);
-
- System.arraycopy(oldData,0,_data,0,oldData.length);
- src.duplicate().get(_data, oldData.length, src.remaining());
- }
-
- }
-
- public int getContent(int offsetInMessage, java.nio.ByteBuffer dst)
- {
- byte[] data = _dataRef == null ? null : _dataRef.get();
- if(data != null)
- {
- int length = Math.min(dst.remaining(), data.length - offsetInMessage);
- dst.put(data, offsetInMessage, length);
- return length;
- }
- else
- {
- try
- {
- return BDBMessageStore.this.getContent(_messageId, offsetInMessage, dst);
- }
- catch (AMQStoreException e)
- {
- // TODO maybe should throw a checked exception, or at least log before throwing
- throw new RuntimeException(e);
- }
- }
- }
-
- public ByteBuffer getContent(int offsetInMessage, int size)
- {
- byte[] data = _dataRef == null ? null : _dataRef.get();
- if(data != null)
- {
- return ByteBuffer.wrap(data,offsetInMessage,size);
- }
- else
- {
- ByteBuffer buf = ByteBuffer.allocate(size);
- getContent(offsetInMessage, buf);
- buf.position(0);
- return buf;
- }
- }
-
- synchronized void store(com.sleepycat.je.Transaction txn)
- {
-
- if(_metaData != null)
- {
- try
- {
- _dataRef = new SoftReference<byte[]>(_data);
- BDBMessageStore.this.storeMetaData(txn, _messageId, _metaData);
- BDBMessageStore.this.addContent(txn, _messageId,
- _data == null ? ByteBuffer.allocate(0) : ByteBuffer.wrap(_data));
- }
- catch(DatabaseException e)
- {
- throw new RuntimeException(e);
- }
- catch (AMQStoreException e)
- {
- throw new RuntimeException(e);
- }
- catch (RuntimeException e)
- {
- e.printStackTrace();
- throw e;
- }
- finally
- {
- _metaData = null;
- _data = null;
- }
- }
- }
-
- public synchronized StoreFuture flushToStore()
- {
- if(_metaData != null)
- {
- com.sleepycat.je.Transaction txn = _environment.beginTransaction(null, null);
- store(txn);
- BDBMessageStore.this.commit(txn,true);
-
- }
- return IMMEDIATE_FUTURE;
- }
-
- public void remove()
- {
- try
- {
- BDBMessageStore.this.removeMessage(_messageId, false);
- }
- catch (AMQStoreException e)
- {
- throw new RuntimeException(e);
- }
- }
- }
-
- private class BDBTransaction implements Transaction
- {
- private com.sleepycat.je.Transaction _txn;
-
- private BDBTransaction()
- {
- try
- {
- _txn = _environment.beginTransaction(null, null);
- }
- catch (DatabaseException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
- if(message.getStoredMessage() instanceof StoredBDBMessage)
- {
- ((StoredBDBMessage)message.getStoredMessage()).store(_txn);
- }
-
- BDBMessageStore.this.enqueueMessage(_txn, queue, message.getMessageNumber());
- }
-
- public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
- BDBMessageStore.this.dequeueMessage(_txn, queue, message.getMessageNumber());
- }
-
- public void commitTran() throws AMQStoreException
- {
- BDBMessageStore.this.commitTranImpl(_txn, true);
- }
-
- public StoreFuture commitTranAsync() throws AMQStoreException
- {
- return BDBMessageStore.this.commitTranImpl(_txn, false);
- }
-
- public void abortTran() throws AMQStoreException
- {
- BDBMessageStore.this.abortTran(_txn);
- }
-
- public void removeXid(long format, byte[] globalId, byte[] branchId) throws AMQStoreException
- {
- BDBMessageStore.this.removeXid(_txn, format, globalId, branchId);
- }
-
- public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues,
- Record[] dequeues) throws AMQStoreException
- {
- BDBMessageStore.this.recordXid(_txn, format, globalId, branchId, enqueues, dequeues);
- }
- }
-
-
}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java
new file mode 100644
index 0000000000..7e5ef3f94c
--- /dev/null
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreFactory.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb;
+
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreFactory;
+
+public class BDBMessageStoreFactory implements MessageStoreFactory
+{
+
+ @Override
+ public MessageStore createMessageStore()
+ {
+ return new BDBMessageStore();
+ }
+
+ @Override
+ public String getStoreClassName()
+ {
+ return BDBMessageStore.class.getSimpleName();
+ }
+
+}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/BindingRecord.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/BindingRecord.java
deleted file mode 100644
index b9d868f909..0000000000
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/BindingRecord.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.entry;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-
-public class BindingRecord extends Object
-{
- private final AMQShortString _exchangeName;
- private final AMQShortString _queueName;
- private final AMQShortString _routingKey;
- private final FieldTable _arguments;
-
- public BindingRecord(AMQShortString exchangeName, AMQShortString queueName, AMQShortString routingKey, FieldTable arguments)
- {
- _exchangeName = exchangeName;
- _queueName = queueName;
- _routingKey = routingKey;
- _arguments = arguments;
- }
-
-
- public AMQShortString getExchangeName()
- {
- return _exchangeName;
- }
-
- public AMQShortString getQueueName()
- {
- return _queueName;
- }
-
- public AMQShortString getRoutingKey()
- {
- return _routingKey;
- }
-
- public FieldTable getArguments()
- {
- return _arguments;
- }
-
-}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/ExchangeRecord.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/ExchangeRecord.java
deleted file mode 100644
index 180893178d..0000000000
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/ExchangeRecord.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.entry;
-
-import org.apache.qpid.framing.AMQShortString;
-
-public class ExchangeRecord extends Object
-{
- private final AMQShortString _exchangeName;
- private final AMQShortString _exchangeType;
- private final boolean _autoDelete;
-
- public ExchangeRecord(AMQShortString exchangeName, AMQShortString exchangeType, boolean autoDelete)
- {
- _exchangeName = exchangeName;
- _exchangeType = exchangeType;
- _autoDelete = autoDelete;
- }
-
- public AMQShortString getNameShortString()
- {
- return _exchangeName;
- }
-
- public AMQShortString getType()
- {
- return _exchangeType;
- }
-
- public boolean isAutoDelete()
- {
- return _autoDelete;
- }
-
-}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/PreparedTransaction.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/PreparedTransaction.java
index 11ae8b89eb..eb5c4677ff 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/PreparedTransaction.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/PreparedTransaction.java
@@ -21,25 +21,25 @@
package org.apache.qpid.server.store.berkeleydb.entry;
-import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.Transaction;
public class PreparedTransaction
{
- private final MessageStore.Transaction.Record[] _enqueues;
- private final MessageStore.Transaction.Record[] _dequeues;
+ private final Transaction.Record[] _enqueues;
+ private final Transaction.Record[] _dequeues;
- public PreparedTransaction(MessageStore.Transaction.Record[] enqueues, MessageStore.Transaction.Record[] dequeues)
+ public PreparedTransaction(Transaction.Record[] enqueues, Transaction.Record[] dequeues)
{
_enqueues = enqueues;
_dequeues = dequeues;
}
- public MessageStore.Transaction.Record[] getEnqueues()
+ public Transaction.Record[] getEnqueues()
{
return _enqueues;
}
- public MessageStore.Transaction.Record[] getDequeues()
+ public Transaction.Record[] getDequeues()
{
return _dequeues;
}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueEntryKey.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueEntryKey.java
index a716758da3..e7cf93ff7a 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueEntryKey.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueEntryKey.java
@@ -20,22 +20,22 @@
*/
package org.apache.qpid.server.store.berkeleydb.entry;
-import org.apache.qpid.framing.AMQShortString;
+import java.util.UUID;
public class QueueEntryKey
{
- private AMQShortString _queueName;
+ private UUID _queueId;
private long _messageId;
- public QueueEntryKey(AMQShortString queueName, long messageId)
+ public QueueEntryKey(UUID queueId, long messageId)
{
- _queueName = queueName;
+ _queueId = queueId;
_messageId = messageId;
}
- public AMQShortString getQueueName()
+ public UUID getQueueId()
{
- return _queueName;
+ return _queueId;
}
public long getMessageId()
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueRecord.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueRecord.java
deleted file mode 100644
index 5ea82427dc..0000000000
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/entry/QueueRecord.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.entry;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-
-public class QueueRecord extends Object
-{
- private final AMQShortString _queueName;
- private final AMQShortString _owner;
- private final FieldTable _arguments;
- private boolean _exclusive;
-
- public QueueRecord(AMQShortString queueName, AMQShortString owner, boolean exclusive, FieldTable arguments)
- {
- _queueName = queueName;
- _owner = owner;
- _exclusive = exclusive;
- _arguments = arguments;
- }
-
- public AMQShortString getNameShortString()
- {
- return _queueName;
- }
-
- public AMQShortString getOwner()
- {
- return _owner;
- }
-
- public boolean isExclusive()
- {
- return _exclusive;
- }
-
- public void setExclusive(boolean exclusive)
- {
- _exclusive = exclusive;
- }
-
- public FieldTable getArguments()
- {
- return _arguments;
- }
-
-}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/AMQShortStringBinding.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/AMQShortStringBinding.java
deleted file mode 100644
index b57ffb0169..0000000000
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/AMQShortStringBinding.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuple;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-
-public class AMQShortStringBinding extends TupleBinding<AMQShortString>
-{
- private static final AMQShortStringBinding INSTANCE = new AMQShortStringBinding();
-
- public static AMQShortStringBinding getInstance()
- {
- return INSTANCE;
- }
-
- /** private constructor forces getInstance instead */
- private AMQShortStringBinding() { }
-
- public AMQShortString entryToObject(TupleInput tupleInput)
- {
- return AMQShortStringEncoding.readShortString(tupleInput);
- }
-
- public void objectToEntry(AMQShortString object, TupleOutput tupleOutput)
- {
- AMQShortStringEncoding.writeShortString(object, tupleOutput);
- }
-}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java
new file mode 100644
index 0000000000..8b84a4c9bb
--- /dev/null
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java
@@ -0,0 +1,37 @@
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+
+import com.sleepycat.bind.tuple.TupleBinding;
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+public class ConfiguredObjectBinding extends TupleBinding<ConfiguredObjectRecord>
+{
+ private static final ConfiguredObjectBinding INSTANCE = new ConfiguredObjectBinding();
+
+ public static ConfiguredObjectBinding getInstance()
+ {
+ return INSTANCE;
+ }
+
+ /** non-public constructor forces getInstance instead */
+ private ConfiguredObjectBinding()
+ {
+ }
+
+ public ConfiguredObjectRecord entryToObject(TupleInput tupleInput)
+ {
+ String type = tupleInput.readString();
+ String json = tupleInput.readString();
+ ConfiguredObjectRecord configuredObject = new ConfiguredObjectRecord(null, type, json);
+ return configuredObject;
+ }
+
+ public void objectToEntry(ConfiguredObjectRecord object, TupleOutput tupleOutput)
+ {
+ tupleOutput.writeString(object.getType());
+ tupleOutput.writeString(object.getAttributes());
+ }
+
+}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ExchangeBinding.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ExchangeBinding.java
deleted file mode 100644
index d4b1475ac7..0000000000
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ExchangeBinding.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuple;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
-import org.apache.qpid.server.store.berkeleydb.entry.ExchangeRecord;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-
-public class ExchangeBinding extends TupleBinding<ExchangeRecord>
-{
- private static final ExchangeBinding INSTANCE = new ExchangeBinding();
-
- public static ExchangeBinding getInstance()
- {
- return INSTANCE;
- }
-
- /** private constructor forces getInstance instead */
- private ExchangeBinding() { }
-
- public ExchangeRecord entryToObject(TupleInput tupleInput)
- {
- AMQShortString name = AMQShortStringEncoding.readShortString(tupleInput);
- AMQShortString typeName = AMQShortStringEncoding.readShortString(tupleInput);
-
- boolean autoDelete = tupleInput.readBoolean();
-
- return new ExchangeRecord(name, typeName, autoDelete);
- }
-
- public void objectToEntry(ExchangeRecord exchange, TupleOutput tupleOutput)
- {
- AMQShortStringEncoding.writeShortString(exchange.getNameShortString(), tupleOutput);
- AMQShortStringEncoding.writeShortString(exchange.getType(), tupleOutput);
-
- tupleOutput.writeBoolean(exchange.isAutoDelete());
- }
-}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/PreparedTransactionBinding.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/PreparedTransactionBinding.java
index d85bcd361e..09f2c50e2d 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/PreparedTransactionBinding.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/PreparedTransactionBinding.java
@@ -21,12 +21,14 @@
package org.apache.qpid.server.store.berkeleydb.tuple;
+import java.util.UUID;
+
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.bind.tuple.TupleInput;
import com.sleepycat.bind.tuple.TupleOutput;
import org.apache.qpid.server.message.EnqueableMessage;
-import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.Transaction;
import org.apache.qpid.server.store.TransactionLogResource;
import org.apache.qpid.server.store.berkeleydb.entry.PreparedTransaction;
@@ -35,19 +37,19 @@ public class PreparedTransactionBinding extends TupleBinding<PreparedTransaction
@Override
public PreparedTransaction entryToObject(TupleInput input)
{
- MessageStore.Transaction.Record[] enqueues = readRecords(input);
+ Transaction.Record[] enqueues = readRecords(input);
- MessageStore.Transaction.Record[] dequeues = readRecords(input);
+ Transaction.Record[] dequeues = readRecords(input);
return new PreparedTransaction(enqueues, dequeues);
}
- private MessageStore.Transaction.Record[] readRecords(TupleInput input)
+ private Transaction.Record[] readRecords(TupleInput input)
{
- MessageStore.Transaction.Record[] records = new MessageStore.Transaction.Record[input.readInt()];
+ Transaction.Record[] records = new Transaction.Record[input.readInt()];
for(int i = 0; i < records.length; i++)
{
- records[i] = new RecordImpl(input.readString(), input.readLong());
+ records[i] = new RecordImpl(new UUID(input.readLong(), input.readLong()), input.readLong());
}
return records;
}
@@ -60,7 +62,7 @@ public class PreparedTransactionBinding extends TupleBinding<PreparedTransaction
}
- private void writeRecords(MessageStore.Transaction.Record[] records, TupleOutput output)
+ private void writeRecords(Transaction.Record[] records, TupleOutput output)
{
if(records == null)
{
@@ -69,24 +71,26 @@ public class PreparedTransactionBinding extends TupleBinding<PreparedTransaction
else
{
output.writeInt(records.length);
- for(MessageStore.Transaction.Record record : records)
+ for(Transaction.Record record : records)
{
- output.writeString(record.getQueue().getResourceName());
+ UUID id = record.getQueue().getId();
+ output.writeLong(id.getMostSignificantBits());
+ output.writeLong(id.getLeastSignificantBits());
output.writeLong(record.getMessage().getMessageNumber());
}
}
}
- private static class RecordImpl implements MessageStore.Transaction.Record, TransactionLogResource, EnqueableMessage
+ private static class RecordImpl implements Transaction.Record, TransactionLogResource, EnqueableMessage
{
- private final String _queueName;
private long _messageNumber;
+ private UUID _queueId;
- public RecordImpl(String queueName, long messageNumber)
+ public RecordImpl(UUID queueId, long messageNumber)
{
- _queueName = queueName;
_messageNumber = messageNumber;
+ _queueId = queueId;
}
public TransactionLogResource getQueue()
@@ -114,9 +118,10 @@ public class PreparedTransactionBinding extends TupleBinding<PreparedTransaction
throw new UnsupportedOperationException();
}
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return _queueName;
+ return _queueId;
}
}
}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueBinding.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueBinding.java
deleted file mode 100644
index 7e1c63cc28..0000000000
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueBinding.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuple;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-import com.sleepycat.je.DatabaseException;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
-import org.apache.qpid.server.store.berkeleydb.FieldTableEncoding;
-import org.apache.qpid.server.store.berkeleydb.entry.QueueRecord;
-
-public class QueueBinding extends TupleBinding<QueueRecord>
-{
- private static final Logger _logger = Logger.getLogger(QueueBinding.class);
-
- private static final QueueBinding INSTANCE = new QueueBinding();
-
- public static QueueBinding getInstance()
- {
- return INSTANCE;
- }
-
- /** private constructor forces getInstance instead */
- private QueueBinding() { }
-
- public QueueRecord entryToObject(TupleInput tupleInput)
- {
- try
- {
- AMQShortString name = AMQShortStringEncoding.readShortString(tupleInput);
- AMQShortString owner = AMQShortStringEncoding.readShortString(tupleInput);
- // Addition for Version 2 of this table, read the queue arguments
- FieldTable arguments = FieldTableEncoding.readFieldTable(tupleInput);
- // Addition for Version 3 of this table, read the queue exclusivity
- boolean exclusive = tupleInput.readBoolean();
-
- return new QueueRecord(name, owner, exclusive, arguments);
- }
- catch (DatabaseException e)
- {
- _logger.error("Unable to create binding: " + e, e);
- return null;
- }
-
- }
-
- public void objectToEntry(QueueRecord queue, TupleOutput tupleOutput)
- {
- AMQShortStringEncoding.writeShortString(queue.getNameShortString(), tupleOutput);
- AMQShortStringEncoding.writeShortString(queue.getOwner(), tupleOutput);
- // Addition for Version 2 of this table, store the queue arguments
- FieldTableEncoding.writeFieldTable(queue.getArguments(), tupleOutput);
- // Addition for Version 3 of this table, store the queue exclusivity
- tupleOutput.writeBoolean(queue.isExclusive());
- }
-}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueBindingTupleBinding.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueBindingTupleBinding.java
deleted file mode 100644
index 6ba929a541..0000000000
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueBindingTupleBinding.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store.berkeleydb.tuple;
-
-import org.apache.log4j.Logger;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
-import org.apache.qpid.server.store.berkeleydb.FieldTableEncoding;
-import org.apache.qpid.server.store.berkeleydb.entry.BindingRecord;
-
-import com.sleepycat.bind.tuple.TupleBinding;
-import com.sleepycat.bind.tuple.TupleInput;
-import com.sleepycat.bind.tuple.TupleOutput;
-import com.sleepycat.je.DatabaseException;
-
-public class QueueBindingTupleBinding extends TupleBinding<BindingRecord>
-{
- protected static final Logger _log = Logger.getLogger(QueueBindingTupleBinding.class);
-
- private static final QueueBindingTupleBinding INSTANCE = new QueueBindingTupleBinding();
-
- public static QueueBindingTupleBinding getInstance()
- {
- return INSTANCE;
- }
-
- /** private constructor forces getInstance instead */
- private QueueBindingTupleBinding() { }
-
- public BindingRecord entryToObject(TupleInput tupleInput)
- {
- AMQShortString exchangeName = AMQShortStringEncoding.readShortString(tupleInput);
- AMQShortString queueName = AMQShortStringEncoding.readShortString(tupleInput);
- AMQShortString routingKey = AMQShortStringEncoding.readShortString(tupleInput);
-
- FieldTable arguments;
-
- // Addition for Version 2 of this table
- try
- {
- arguments = FieldTableEncoding.readFieldTable(tupleInput);
- }
- catch (DatabaseException e)
- {
- _log.error("Unable to create binding: " + e, e);
- return null;
- }
-
- return new BindingRecord(exchangeName, queueName, routingKey, arguments);
- }
-
- public void objectToEntry(BindingRecord binding, TupleOutput tupleOutput)
- {
- AMQShortStringEncoding.writeShortString(binding.getExchangeName(), tupleOutput);
- AMQShortStringEncoding.writeShortString(binding.getQueueName(), tupleOutput);
- AMQShortStringEncoding.writeShortString(binding.getRoutingKey(), tupleOutput);
-
- // Addition for Version 2 of this table
- FieldTableEncoding.writeFieldTable(binding.getArguments(), tupleOutput);
- }
-
-} \ No newline at end of file
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java
index f65df23706..22d0ede31f 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/QueueEntryBinding.java
@@ -20,12 +20,12 @@
*/
package org.apache.qpid.server.store.berkeleydb.tuple;
+import java.util.UUID;
+
import com.sleepycat.bind.tuple.TupleBinding;
import com.sleepycat.bind.tuple.TupleInput;
import com.sleepycat.bind.tuple.TupleOutput;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
import org.apache.qpid.server.store.berkeleydb.entry.QueueEntryKey;
public class QueueEntryBinding extends TupleBinding<QueueEntryKey>
@@ -43,15 +43,17 @@ public class QueueEntryBinding extends TupleBinding<QueueEntryKey>
public QueueEntryKey entryToObject(TupleInput tupleInput)
{
- AMQShortString queueName = AMQShortStringEncoding.readShortString(tupleInput);
+ UUID queueId = new UUID(tupleInput.readLong(), tupleInput.readLong());
long messageId = tupleInput.readLong();
- return new QueueEntryKey(queueName, messageId);
+ return new QueueEntryKey(queueId, messageId);
}
public void objectToEntry(QueueEntryKey mk, TupleOutput tupleOutput)
{
- AMQShortStringEncoding.writeShortString(mk.getQueueName(),tupleOutput);
+ UUID uuid = mk.getQueueId();
+ tupleOutput.writeLong(uuid.getMostSignificantBits());
+ tupleOutput.writeLong(uuid.getLeastSignificantBits());
tupleOutput.writeLong(mk.getMessageId());
}
} \ No newline at end of file
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractStoreUpgrade.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractStoreUpgrade.java
index c96c751694..43aa5aa2b4 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractStoreUpgrade.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractStoreUpgrade.java
@@ -31,39 +31,33 @@ import com.sleepycat.je.Transaction;
public abstract class AbstractStoreUpgrade implements StoreUpgrade
{
private static final Logger _logger = Logger.getLogger(AbstractStoreUpgrade.class);
- protected static final String[] USER_FRIENDLY_NAMES = new String[] { "Exchanges", "Queues", "Queue bindings",
- "Message deliveries", "Message metadata", "Message content", "Bridges", "Links", "Distributed transactions" };
- protected void reportFinished(Environment environment, String[] databaseNames, String[] userFriendlyNames)
+ protected void reportFinished(Environment environment, int version)
{
- if (_logger.isInfoEnabled())
+ _logger.info("Completed upgrade to version " + version);
+ if (_logger.isDebugEnabled())
{
- _logger.info("Upgraded:");
- List<String> databases = environment.getDatabaseNames();
- for (int i = 0; i < databaseNames.length; i++)
- {
- if (databases.contains(databaseNames[i]))
- {
- _logger.info(" " + getRowCount(databaseNames[i], environment) + " rows in " + userFriendlyNames[i]);
- }
- }
+ _logger.debug("Upgraded:");
+ reportDatabaseRowCount(environment);
}
}
+ private void reportDatabaseRowCount(Environment environment)
+ {
+ List<String> databases = environment.getDatabaseNames();
+ for (String database : databases)
+ {
+ _logger.debug(" " + getRowCount(database, environment) + " rows in " + database);
+ }
+ }
- protected void reportStarting(Environment environment, String[] databaseNames, String[] userFriendlyNames)
+ protected void reportStarting(Environment environment, int version)
{
- if (_logger.isInfoEnabled())
+ _logger.info("Starting store upgrade from version " + version);
+ if (_logger.isDebugEnabled())
{
- _logger.info("Upgrading:");
- List<String> databases = environment.getDatabaseNames();
- for (int i = 0; i < databaseNames.length; i++)
- {
- if (databases.contains(databaseNames[i]))
- {
- _logger.info(" " + getRowCount(databaseNames[i], environment) + " rows from " + userFriendlyNames[i]);
- }
- }
+ _logger.debug("Upgrading:");
+ reportDatabaseRowCount(environment);
}
}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorOperation.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorOperation.java
index 42a3173e21..925e40ea93 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorOperation.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/CursorOperation.java
@@ -48,7 +48,7 @@ public abstract class CursorOperation implements DatabaseRunnable
CursorOperation.this.processEntry(database, targetDatabase, transaction, key, value);
if (getProcessedCount() % 1000 == 0)
{
- _logger.info("Processed " + getProcessedCount() + " messages of " + getRowCount() + ".");
+ _logger.info("Processed " + getProcessedCount() + " records of " + getRowCount() + ".");
}
}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/StoreUpgrade.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/StoreUpgrade.java
index e7a34c524c..f73e2e5d78 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/StoreUpgrade.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/StoreUpgrade.java
@@ -23,10 +23,9 @@ package org.apache.qpid.server.store.berkeleydb.upgrade;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.server.logging.LogSubject;
public interface StoreUpgrade
{
- void performUpgrade(LogSubject logSubject, Environment environment, UpgradeInteractionHandler handler)
+ void performUpgrade(Environment environment, UpgradeInteractionHandler handler, String virtualHostName)
throws DatabaseException, AMQStoreException;
}
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4To5.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4To5.java
index 6b063f5c23..49e5e700c4 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4To5.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4To5.java
@@ -40,7 +40,6 @@ import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.ContentHeaderBody;
import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.framing.abstraction.MessagePublishInfo;
-import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.message.MessageMetaData;
import org.apache.qpid.server.store.StorableMessageMetaData;
import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
@@ -72,41 +71,31 @@ public class UpgradeFrom4To5 extends AbstractStoreUpgrade
private static final String OLD_CONTENT_DB_NAME = "messageContentDb_v4";
private static final String NEW_CONTENT_DB_NAME = "messageContentDb_v5";
- private static final String[] OLD_DATABASE_NAMES = new String[] { EXCHANGE_DB_NAME, OLD_QUEUE_DB_NAME,
- OLD_BINDINGS_DB_NAME, OLD_DELIVERY_DB, OLD_METADATA_DB_NAME, OLD_CONTENT_DB_NAME, "bridges_v4", "links_v4",
- "xids_v4" };
- private static final String[] NEW_DATABASE_NAMES = new String[] { "exchangeDb_v5", NEW_QUEUE_DB_NAME,
- NEW_BINDINGS_DB_NAME, NEW_DELIVERY_DB, NEW_METADATA_DB_NAME, NEW_CONTENT_DB_NAME, "bridges_v5", "links_v5",
- "xids_v5" };
-
private static final byte COLON = (byte) ':';
private static final Logger _logger = Logger.getLogger(UpgradeFrom4To5.class);
- public void performUpgrade(final LogSubject logSubject, final Environment environment,
- final UpgradeInteractionHandler handler) throws DatabaseException, AMQStoreException
+ public void performUpgrade(final Environment environment, final UpgradeInteractionHandler handler, String virtualHostName) throws DatabaseException, AMQStoreException
{
- _logger.info("Starting store upgrade from version 4");
Transaction transaction = null;
try
{
- reportStarting(environment, OLD_DATABASE_NAMES, USER_FRIENDLY_NAMES);
+ reportStarting(environment, 4);
transaction = environment.beginTransaction(null, null);
// find all queues which are bound to a topic exchange and which have a colon in their name
- final List<AMQShortString> potentialDurableSubs = findPotentialDurableSubscriptions(logSubject, environment,
- transaction);
-
- Set<String> existingQueues = upgradeQueues(logSubject, environment, handler, potentialDurableSubs, transaction);
- upgradeQueueBindings(logSubject, environment, handler, potentialDurableSubs, transaction);
- Set<Long> messagesToDiscard = upgradeDelivery(logSubject, environment, existingQueues, handler, transaction);
- upgradeContent(logSubject, environment, handler, messagesToDiscard, transaction);
- upgradeMetaData(logSubject, environment, handler, messagesToDiscard, transaction);
- renameRemainingDatabases(logSubject, environment, handler, transaction);
+ final List<AMQShortString> potentialDurableSubs = findPotentialDurableSubscriptions(environment, transaction);
+
+ Set<String> existingQueues = upgradeQueues(environment, handler, potentialDurableSubs, transaction);
+ upgradeQueueBindings(environment, handler, potentialDurableSubs, transaction);
+ Set<Long> messagesToDiscard = upgradeDelivery(environment, existingQueues, handler, transaction);
+ upgradeContent(environment, handler, messagesToDiscard, transaction);
+ upgradeMetaData(environment, handler, messagesToDiscard, transaction);
+ renameRemainingDatabases(environment, handler, transaction);
transaction.commit();
- reportFinished(environment, NEW_DATABASE_NAMES, USER_FRIENDLY_NAMES);
+ reportFinished(environment, 5);
}
catch (Exception e)
@@ -127,8 +116,8 @@ public class UpgradeFrom4To5 extends AbstractStoreUpgrade
}
}
- private void upgradeQueueBindings(LogSubject logSubject, Environment environment, UpgradeInteractionHandler handler,
- final List<AMQShortString> potentialDurableSubs, Transaction transaction)
+ private void upgradeQueueBindings(Environment environment, UpgradeInteractionHandler handler, final List<AMQShortString> potentialDurableSubs,
+ Transaction transaction)
{
if (environment.getDatabaseNames().contains(OLD_BINDINGS_DB_NAME))
{
@@ -188,8 +177,8 @@ public class UpgradeFrom4To5 extends AbstractStoreUpgrade
}
}
- private Set<String> upgradeQueues(final LogSubject logSubject, final Environment environment,
- final UpgradeInteractionHandler handler, List<AMQShortString> potentialDurableSubs, Transaction transaction)
+ private Set<String> upgradeQueues(final Environment environment, final UpgradeInteractionHandler handler,
+ List<AMQShortString> potentialDurableSubs, Transaction transaction)
{
_logger.info("Queues");
final Set<String> existingQueues = new HashSet<String>();
@@ -217,10 +206,10 @@ public class UpgradeFrom4To5 extends AbstractStoreUpgrade
return existingQueues;
}
- private List<AMQShortString> findPotentialDurableSubscriptions(final LogSubject logSubject,
- final Environment environment, Transaction transaction)
+ private List<AMQShortString> findPotentialDurableSubscriptions(final Environment environment,
+ Transaction transaction)
{
- final List<AMQShortString> exchangeNames = findTopicExchanges(logSubject, environment);
+ final List<AMQShortString> exchangeNames = findTopicExchanges(environment);
final List<AMQShortString> queues = new ArrayList<AMQShortString>();
final PartialBindingRecordBinding binding = new PartialBindingRecordBinding();
@@ -241,8 +230,8 @@ public class UpgradeFrom4To5 extends AbstractStoreUpgrade
return queues;
}
- private Set<Long> upgradeDelivery(final LogSubject logSubject, final Environment environment,
- final Set<String> existingQueues, final UpgradeInteractionHandler handler, Transaction transaction)
+ private Set<Long> upgradeDelivery(final Environment environment, final Set<String> existingQueues,
+ final UpgradeInteractionHandler handler, Transaction transaction)
{
final Set<Long> messagesToDiscard = new HashSet<Long>();
final Set<String> queuesToDiscard = new HashSet<String>();
@@ -363,7 +352,7 @@ public class UpgradeFrom4To5 extends AbstractStoreUpgrade
new DatabaseTemplate(environment, NEW_QUEUE_DB_NAME, NEW_BINDINGS_DB_NAME, transaction).run(queueCreateOperation);
}
- private List<AMQShortString> findTopicExchanges(final LogSubject logSubject, final Environment environment)
+ private List<AMQShortString> findTopicExchanges(final Environment environment)
{
final List<AMQShortString> topicExchanges = new ArrayList<AMQShortString>();
final ExchangeRecordBinding binding = new ExchangeRecordBinding();
@@ -385,8 +374,8 @@ public class UpgradeFrom4To5 extends AbstractStoreUpgrade
return topicExchanges;
}
- private void upgradeMetaData(final LogSubject logSubject, final Environment environment,
- final UpgradeInteractionHandler handler, final Set<Long> messagesToDiscard, Transaction transaction)
+ private void upgradeMetaData(final Environment environment, final UpgradeInteractionHandler handler,
+ final Set<Long> messagesToDiscard, Transaction transaction)
{
_logger.info("Message MetaData");
if (environment.getDatabaseNames().contains(OLD_METADATA_DB_NAME))
@@ -426,8 +415,8 @@ public class UpgradeFrom4To5 extends AbstractStoreUpgrade
}
}
- private void upgradeContent(final LogSubject logSubject, final Environment environment,
- final UpgradeInteractionHandler handler, final Set<Long> messagesToDiscard, Transaction transaction)
+ private void upgradeContent(final Environment environment, final UpgradeInteractionHandler handler,
+ final Set<Long> messagesToDiscard, Transaction transaction)
{
_logger.info("Message Contents");
if (environment.getDatabaseNames().contains(OLD_CONTENT_DB_NAME))
@@ -486,8 +475,8 @@ public class UpgradeFrom4To5 extends AbstractStoreUpgrade
* For all databases which haven't been otherwise upgraded, we still need to
* rename them from _v4 to _v5
*/
- private void renameRemainingDatabases(final LogSubject logSubject, final Environment environment,
- final UpgradeInteractionHandler handler, Transaction transaction)
+ private void renameRemainingDatabases(final Environment environment, final UpgradeInteractionHandler handler,
+ Transaction transaction)
{
for (String dbName : environment.getDatabaseNames())
{
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6.java
index 5aaf3675a8..3265fb6823 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6.java
@@ -24,14 +24,30 @@ import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeInteraction
import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeInteractionResponse.NO;
import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeInteractionResponse.YES;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
+import java.util.UUID;
import org.apache.log4j.Logger;
import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.server.logging.LogSubject;
+import org.apache.qpid.exchange.ExchangeDefaults;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.model.Binding;
+import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.LifetimePolicy;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.store.berkeleydb.AMQShortStringEncoding;
+import org.apache.qpid.server.store.berkeleydb.FieldTableEncoding;
+import org.apache.qpid.server.util.MapJsonSerializer;
import com.sleepycat.bind.tuple.LongBinding;
import com.sleepycat.bind.tuple.TupleBinding;
@@ -52,27 +68,71 @@ public class UpgradeFrom5To6 extends AbstractStoreUpgrade
private static final Logger _logger = Logger.getLogger(UpgradeFrom5To6.class);
- private static final String OLD_CONTENT_DB_NAME = "messageContentDb_v5";
- private static final String NEW_CONTENT_DB_NAME = "MESSAGE_CONTENT";
- private static final String META_DATA_DB_NAME = "messageMetaDataDb_v5";
+ static final String OLD_CONTENT_DB_NAME = "messageContentDb_v5";
+ static final String NEW_CONTENT_DB_NAME = "MESSAGE_CONTENT";
+ static final String NEW_METADATA_DB_NAME = "MESSAGE_METADATA";
+ static final String OLD_META_DATA_DB_NAME = "messageMetaDataDb_v5";
+ static final String OLD_EXCHANGE_DB_NAME = "exchangeDb_v5";
+ static final String OLD_QUEUE_DB_NAME = "queueDb_v5";
+ static final String OLD_DELIVERY_DB_NAME = "deliveryDb_v5";
+ static final String OLD_QUEUE_BINDINGS_DB_NAME = "queueBindingsDb_v5";
+ static final String OLD_XID_DB_NAME = "xids_v5";
+ static final String NEW_XID_DB_NAME = "XIDS";
+ static final String CONFIGURED_OBJECTS_DB_NAME = "CONFIGURED_OBJECTS";
+ static final String NEW_DELIVERY_DB_NAME = "QUEUE_ENTRIES";
+ static final String NEW_BRIDGES_DB_NAME = "BRIDGES";
+ static final String NEW_LINKS_DB_NAME = "LINKS";
+ static final String OLD_BRIDGES_DB_NAME = "bridges_v5";
+ static final String OLD_LINKS_DB_NAME = "links_v5";
- private static final String NEW_DB_NAMES[] = { "EXCHANGES", "QUEUES", "QUEUE_BINDINGS", "DELIVERIES",
- "MESSAGE_METADATA", NEW_CONTENT_DB_NAME, "BRIDGES", "LINKS", "XIDS" };
- private static final String OLD_DB_NAMES[] = { "exchangeDb_v5", "queueDb_v5", "queueBindingsDb_v5", "deliveryDb_v5",
- META_DATA_DB_NAME, OLD_CONTENT_DB_NAME, "bridges_v5", "links_v5", "xids_v5" };
+ static final String[] DEFAULT_EXCHANGES = { ExchangeDefaults.DEFAULT_EXCHANGE_NAME.asString(),
+ ExchangeDefaults.DEFAULT_EXCHANGE_NAME.asString(), ExchangeDefaults.FANOUT_EXCHANGE_NAME.asString(),
+ ExchangeDefaults.HEADERS_EXCHANGE_NAME.asString(), ExchangeDefaults.TOPIC_EXCHANGE_NAME.asString(),
+ ExchangeDefaults.DIRECT_EXCHANGE_NAME.asString() };
+ private static final Set<String> DEFAULT_EXCHANGES_SET = new HashSet<String>(Arrays.asList(DEFAULT_EXCHANGES));
- public void performUpgrade(final LogSubject logSubject, final Environment environment,
- final UpgradeInteractionHandler handler) throws DatabaseException, AMQStoreException
+ private MapJsonSerializer _serializer = new MapJsonSerializer();
+
+ /**
+ * Upgrades from a v5 database to a v6 database
+ *
+ * v6 is the first "new style" schema where we don't version every table,
+ * and the upgrade is re-runnable
+ *
+ * Change in this version:
+ *
+ * Message content is moved from the database messageContentDb_v5 to
+ * MESSAGE_CONTENT. The structure of the database changes from ( message-id:
+ * long, chunk-id: int ) -> ( size: int, byte[] data ) to ( message-id:
+ * long) -> ( byte[] data )
+ *
+ * That is we keep only one record per message, which contains all the
+ * message content
+ *
+ * Queue, Exchange, Bindings entries are stored now as configurable objects
+ * in "CONFIGURED_OBJECTS" table.
+ */
+ public void performUpgrade(final Environment environment, final UpgradeInteractionHandler handler, String virtualHostName)
+ throws DatabaseException, AMQStoreException
+ {
+ reportStarting(environment, 5);
+ upgradeMessages(environment, handler);
+ upgradeConfiguredObjectsAndDependencies(environment, handler, virtualHostName);
+ renameDatabases(environment, null);
+ reportFinished(environment, 6);
+ }
+
+ private void upgradeConfiguredObjectsAndDependencies(Environment environment, UpgradeInteractionHandler handler, String virtualHostName)
+ throws AMQStoreException
{
- _logger.info("Starting store upgrade from version 5");
Transaction transaction = null;
try
{
- reportStarting(environment, OLD_DB_NAMES, USER_FRIENDLY_NAMES);
transaction = environment.beginTransaction(null, null);
- performUpgradeInternal(logSubject, environment, handler, transaction);
+ upgradeConfiguredObjects(environment, handler, transaction, virtualHostName);
+ upgradeQueueEntries(environment, transaction, virtualHostName);
+ upgradeXidEntries(environment, transaction, virtualHostName);
transaction.commit();
- reportFinished(environment, NEW_DB_NAMES, USER_FRIENDLY_NAMES);
}
catch (Exception e)
{
@@ -92,23 +152,54 @@ public class UpgradeFrom5To6 extends AbstractStoreUpgrade
}
}
- /**
- * Upgrades from a v5 database to a v6 database
- *
- * v6 is the first "new style" schema where we don't version every table, and the upgrade is re-runnable
- *
- * Change in this version:
- *
- * Message content is moved from the database messageContentDb_v5 to MESSAGE_CONTENT.
- * The structure of the database changes from
- * ( message-id: long, chunk-id: int ) -> ( size: int, byte[] data )
- * to
- * ( message-id: long) -> ( byte[] data )
- *
- * That is we keep only one record per message, which contains all the message content
- */
- public void performUpgradeInternal(final LogSubject logSubject, final Environment environment,
- final UpgradeInteractionHandler handler, final Transaction transaction) throws AMQStoreException
+ private void upgradeMessages(final Environment environment, final UpgradeInteractionHandler handler)
+ throws AMQStoreException
+ {
+ Transaction transaction = null;
+ try
+ {
+ transaction = environment.beginTransaction(null, null);
+ upgradeMessages(environment, handler, transaction);
+ transaction.commit();
+ }
+ catch (Exception e)
+ {
+ transaction.abort();
+ if (e instanceof DatabaseException)
+ {
+ throw (DatabaseException) e;
+ }
+ else if (e instanceof AMQStoreException)
+ {
+ throw (AMQStoreException) e;
+ }
+ else
+ {
+ throw new AMQStoreException("Unexpected exception", e);
+ }
+ }
+ }
+
+ private void renameDatabases(Environment environment, Transaction transaction)
+ {
+ List<String> databases = environment.getDatabaseNames();
+ String[] oldDatabases = { OLD_META_DATA_DB_NAME, OLD_BRIDGES_DB_NAME, OLD_LINKS_DB_NAME };
+ String[] newDatabases = { NEW_METADATA_DB_NAME, NEW_BRIDGES_DB_NAME, NEW_LINKS_DB_NAME };
+
+ for (int i = 0; i < oldDatabases.length; i++)
+ {
+ String oldName = oldDatabases[i];
+ String newName = newDatabases[i];
+ if (databases.contains(oldName))
+ {
+ _logger.info("Renaming " + oldName + " into " + newName);
+ environment.renameDatabase(transaction, oldName, newName);
+ }
+ }
+ }
+
+ private void upgradeMessages(final Environment environment, final UpgradeInteractionHandler handler,
+ final Transaction transaction) throws AMQStoreException
{
_logger.info("Message Contents");
if (environment.getDatabaseNames().contains(OLD_CONTENT_DB_NAME))
@@ -131,27 +222,13 @@ public class UpgradeFrom5To6 extends AbstractStoreUpgrade
metadataDatabase);
}
};
- new DatabaseTemplate(environment, META_DATA_DB_NAME, contentTransaction).run(metaDataDatabaseOperation);
+ new DatabaseTemplate(environment, OLD_META_DATA_DB_NAME, contentTransaction)
+ .run(metaDataDatabaseOperation);
_logger.info(metaDataDatabaseOperation.getRowCount() + " Message Content Entries");
}
};
new DatabaseTemplate(environment, OLD_CONTENT_DB_NAME, NEW_CONTENT_DB_NAME, transaction).run(contentOperation);
- }
- renameDatabases(environment, transaction);
- }
-
- private void renameDatabases(Environment environment, Transaction transaction)
- {
- List<String> databases = environment.getDatabaseNames();
- for (int i = 0; i < OLD_DB_NAMES.length; i++)
- {
- String oldName = OLD_DB_NAMES[i];
- String newName = NEW_DB_NAMES[i];
- if (databases.contains(oldName))
- {
- _logger.info("Renaming " + oldName + " into " + newName);
- environment.renameDatabase(transaction, oldName, newName);
- }
+ environment.removeDatabase(transaction, OLD_CONTENT_DB_NAME);
}
}
@@ -223,7 +300,7 @@ public class UpgradeFrom5To6 extends AbstractStoreUpgrade
DatabaseEntry value = new DatabaseEntry();
dataBinding.objectToEntry(consolidatedData, value);
- newDatabase.put(txn, key, value);
+ put(newDatabase, txn, key, value);
}
/**
@@ -270,6 +347,264 @@ public class UpgradeFrom5To6 extends AbstractStoreUpgrade
return data;
}
+ private void upgradeConfiguredObjects(Environment environment, UpgradeInteractionHandler handler, Transaction transaction, String virtualHostName)
+ throws AMQStoreException
+ {
+ upgradeQueues(environment, transaction, virtualHostName);
+ upgradeExchanges(environment, transaction, virtualHostName);
+ upgradeQueueBindings(environment, transaction, handler, virtualHostName);
+ }
+
+ private void upgradeXidEntries(Environment environment, Transaction transaction, final String virtualHostName)
+ {
+ if (environment.getDatabaseNames().contains(OLD_XID_DB_NAME))
+ {
+ _logger.info("Xid Records");
+ final OldPreparedTransactionBinding oldTransactionBinding = new OldPreparedTransactionBinding();
+ final NewPreparedTransactionBinding newTransactionBinding = new NewPreparedTransactionBinding();
+ CursorOperation xidEntriesCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database oldXidDatabase, Database newXidDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ OldPreparedTransaction oldPreparedTransaction = oldTransactionBinding.entryToObject(value);
+ OldRecordImpl[] oldDequeues = oldPreparedTransaction.getDequeues();
+ OldRecordImpl[] oldEnqueues = oldPreparedTransaction.getEnqueues();
+
+ NewRecordImpl[] newEnqueues = null;
+ NewRecordImpl[] newDequeues = null;
+ if (oldDequeues != null)
+ {
+ newDequeues = new NewRecordImpl[oldDequeues.length];
+ for (int i = 0; i < newDequeues.length; i++)
+ {
+ OldRecordImpl dequeue = oldDequeues[i];
+ UUID id = UUIDGenerator.generateUUID(dequeue.getQueueName(), virtualHostName);
+ newDequeues[i] = new NewRecordImpl(id, dequeue.getMessageNumber());
+ }
+ }
+ if (oldEnqueues != null)
+ {
+ newEnqueues = new NewRecordImpl[oldEnqueues.length];
+ for (int i = 0; i < newEnqueues.length; i++)
+ {
+ OldRecordImpl enqueue = oldEnqueues[i];
+ UUID id = UUIDGenerator.generateUUID(enqueue.getQueueName(), virtualHostName);
+ newEnqueues[i] = new NewRecordImpl(id, enqueue.getMessageNumber());
+ }
+ }
+ NewPreparedTransaction newPreparedTransaction = new NewPreparedTransaction(newEnqueues, newDequeues);
+ DatabaseEntry newValue = new DatabaseEntry();
+ newTransactionBinding.objectToEntry(newPreparedTransaction, newValue);
+ put(newXidDatabase, transaction, key, newValue);
+ }
+ };
+ new DatabaseTemplate(environment, OLD_XID_DB_NAME, NEW_XID_DB_NAME, transaction).run(xidEntriesCursor);
+ environment.removeDatabase(transaction, OLD_XID_DB_NAME);
+ _logger.info(xidEntriesCursor.getRowCount() + " Xid Entries");
+ }
+ }
+
+ private void upgradeQueueEntries(Environment environment, Transaction transaction, final String virtualHostName)
+ {
+ _logger.info("Queue Delivery Records");
+ if (environment.getDatabaseNames().contains(OLD_DELIVERY_DB_NAME))
+ {
+ final OldQueueEntryBinding oldBinding = new OldQueueEntryBinding();
+ final NewQueueEntryBinding newBinding = new NewQueueEntryBinding();
+ CursorOperation queueEntriesCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database oldDeliveryDatabase, Database newDeliveryDatabase,
+ Transaction transaction, DatabaseEntry key, DatabaseEntry value)
+ {
+ OldQueueEntryKey oldEntryRecord = oldBinding.entryToObject(key);
+ UUID queueId = UUIDGenerator.generateUUID(oldEntryRecord.getQueueName().asString(), virtualHostName);
+
+ NewQueueEntryKey newEntryRecord = new NewQueueEntryKey(queueId, oldEntryRecord.getMessageId());
+ DatabaseEntry newKey = new DatabaseEntry();
+ newBinding.objectToEntry(newEntryRecord, newKey);
+ put(newDeliveryDatabase, transaction, newKey, value);
+ }
+ };
+ new DatabaseTemplate(environment, OLD_DELIVERY_DB_NAME, NEW_DELIVERY_DB_NAME, transaction)
+ .run(queueEntriesCursor);
+ environment.removeDatabase(transaction, OLD_DELIVERY_DB_NAME);
+ _logger.info(queueEntriesCursor.getRowCount() + " Queue Delivery Record Entries");
+ }
+ }
+
+ private void upgradeQueueBindings(Environment environment, Transaction transaction, final UpgradeInteractionHandler handler, final String virtualHostName)
+ {
+ _logger.info("Queue Bindings");
+ if (environment.getDatabaseNames().contains(OLD_QUEUE_BINDINGS_DB_NAME))
+ {
+ final QueueBindingBinding binding = new QueueBindingBinding();
+ CursorOperation bindingCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database exchangeDatabase, Database configuredObjectsDatabase,
+ Transaction transaction, DatabaseEntry key, DatabaseEntry value)
+ {
+ // TODO: check and remove orphaned bindings
+ BindingRecord bindingRecord = binding.entryToObject(key);
+ String exchangeName = bindingRecord.getExchangeName() == null ? ExchangeDefaults.DEFAULT_EXCHANGE_NAME
+ .asString() : bindingRecord.getExchangeName().asString();
+ String queueName = bindingRecord.getQueueName().asString();
+ String routingKey = bindingRecord.getRoutingKey().asString();
+ FieldTable arguments = bindingRecord.getArguments();
+
+ UUID bindingId = UUIDGenerator.generateUUID();
+ UpgradeConfiguredObjectRecord configuredObject = createBindingConfiguredObjectRecord(exchangeName, queueName,
+ routingKey, arguments, virtualHostName);
+ storeConfiguredObjectEntry(configuredObjectsDatabase, bindingId, configuredObject, transaction);
+ }
+
+ };
+ new DatabaseTemplate(environment, OLD_QUEUE_BINDINGS_DB_NAME, CONFIGURED_OBJECTS_DB_NAME, transaction)
+ .run(bindingCursor);
+ environment.removeDatabase(transaction, OLD_QUEUE_BINDINGS_DB_NAME);
+ _logger.info(bindingCursor.getRowCount() + " Queue Binding Entries");
+ }
+ }
+
+ private List<String> upgradeExchanges(Environment environment, Transaction transaction, final String virtualHostName)
+ {
+ final List<String> exchangeNames = new ArrayList<String>();
+ _logger.info("Exchanges");
+ if (environment.getDatabaseNames().contains(OLD_EXCHANGE_DB_NAME))
+ {
+ final ExchangeBinding exchangeBinding = new ExchangeBinding();
+ CursorOperation exchangeCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database exchangeDatabase, Database configuredObjectsDatabase,
+ Transaction transaction, DatabaseEntry key, DatabaseEntry value)
+ {
+ ExchangeRecord exchangeRecord = exchangeBinding.entryToObject(value);
+ String exchangeName = exchangeRecord.getNameShortString().asString();
+ if (!DEFAULT_EXCHANGES_SET.contains(exchangeName))
+ {
+ String exchangeType = exchangeRecord.getType().asString();
+ boolean autoDelete = exchangeRecord.isAutoDelete();
+
+ UUID exchangeId = UUIDGenerator.generateUUID(exchangeName, virtualHostName);
+
+ UpgradeConfiguredObjectRecord configuredObject = createExchangeConfiguredObjectRecord(exchangeName,
+ exchangeType, autoDelete);
+ storeConfiguredObjectEntry(configuredObjectsDatabase, exchangeId, configuredObject, transaction);
+ exchangeNames.add(exchangeName);
+ }
+ }
+ };
+ new DatabaseTemplate(environment, OLD_EXCHANGE_DB_NAME, CONFIGURED_OBJECTS_DB_NAME, transaction)
+ .run(exchangeCursor);
+ environment.removeDatabase(transaction, OLD_EXCHANGE_DB_NAME);
+ _logger.info(exchangeCursor.getRowCount() + " Exchange Entries");
+ }
+ return exchangeNames;
+ }
+
+ private List<String> upgradeQueues(Environment environment, Transaction transaction, final String virtualHostName)
+ {
+ final List<String> queueNames = new ArrayList<String>();
+ _logger.info("Queues");
+ if (environment.getDatabaseNames().contains(OLD_QUEUE_DB_NAME))
+ {
+ final UpgradeQueueBinding queueBinding = new UpgradeQueueBinding();
+ CursorOperation queueCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database queueDatabase, Database configuredObjectsDatabase,
+ Transaction transaction, DatabaseEntry key, DatabaseEntry value)
+ {
+ OldQueueRecord queueRecord = queueBinding.entryToObject(value);
+ String queueName = queueRecord.getNameShortString().asString();
+ queueNames.add(queueName);
+ String owner = queueRecord.getOwner() == null ? null : queueRecord.getOwner().asString();
+ boolean exclusive = queueRecord.isExclusive();
+ FieldTable arguments = queueRecord.getArguments();
+
+ UUID queueId = UUIDGenerator.generateUUID(queueName, virtualHostName);
+ UpgradeConfiguredObjectRecord configuredObject = createQueueConfiguredObjectRecord(queueName, owner, exclusive,
+ arguments);
+ storeConfiguredObjectEntry(configuredObjectsDatabase, queueId, configuredObject, transaction);
+ }
+ };
+ new DatabaseTemplate(environment, OLD_QUEUE_DB_NAME, CONFIGURED_OBJECTS_DB_NAME, transaction).run(queueCursor);
+ environment.removeDatabase(transaction, OLD_QUEUE_DB_NAME);
+ _logger.info(queueCursor.getRowCount() + " Queue Entries");
+ }
+ return queueNames;
+ }
+
+ private void storeConfiguredObjectEntry(Database configuredObjectsDatabase, UUID id,
+ UpgradeConfiguredObjectRecord configuredObject, Transaction transaction)
+ {
+ DatabaseEntry key = new DatabaseEntry();
+ DatabaseEntry value = new DatabaseEntry();
+ UpgradeUUIDBinding uuidBinding = new UpgradeUUIDBinding();
+ uuidBinding.objectToEntry(id, key);
+ ConfiguredObjectBinding configuredBinding = new ConfiguredObjectBinding();
+ configuredBinding.objectToEntry(configuredObject, value);
+ put(configuredObjectsDatabase, transaction, key, value);
+ }
+
+ private UpgradeConfiguredObjectRecord createQueueConfiguredObjectRecord(String queueName, String owner, boolean exclusive,
+ FieldTable arguments)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Queue.NAME, queueName);
+ attributesMap.put(Queue.OWNER, owner);
+ attributesMap.put(Queue.EXCLUSIVE, exclusive);
+ if (arguments != null)
+ {
+ attributesMap.put("ARGUMENTS", FieldTable.convertToMap(arguments));
+ }
+ String json = _serializer.serialize(attributesMap);
+ UpgradeConfiguredObjectRecord configuredObject = new UpgradeConfiguredObjectRecord(Queue.class.getName(), json);
+ return configuredObject;
+ }
+
+ private UpgradeConfiguredObjectRecord createExchangeConfiguredObjectRecord(String exchangeName, String exchangeType,
+ boolean autoDelete)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Exchange.NAME, exchangeName);
+ attributesMap.put(Exchange.TYPE, exchangeType);
+ attributesMap.put(Exchange.LIFETIME_POLICY, autoDelete ? LifetimePolicy.AUTO_DELETE.name()
+ : LifetimePolicy.PERMANENT.name());
+ String json = _serializer.serialize(attributesMap);
+ UpgradeConfiguredObjectRecord configuredObject = new UpgradeConfiguredObjectRecord(Exchange.class.getName(), json);
+ return configuredObject;
+ }
+
+ private UpgradeConfiguredObjectRecord createBindingConfiguredObjectRecord(String exchangeName, String queueName,
+ String routingKey, FieldTable arguments, String virtualHostName)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Binding.NAME, routingKey);
+ attributesMap.put(Binding.EXCHANGE, UUIDGenerator.generateUUID(exchangeName, virtualHostName));
+ attributesMap.put(Binding.QUEUE, UUIDGenerator.generateUUID(queueName, virtualHostName));
+ if (arguments != null)
+ {
+ attributesMap.put(Binding.ARGUMENTS, FieldTable.convertToMap(arguments));
+ }
+ String json = _serializer.serialize(attributesMap);
+ UpgradeConfiguredObjectRecord configuredObject = new UpgradeConfiguredObjectRecord(Binding.class.getName(), json);
+ return configuredObject;
+ }
+
+ private void put(final Database database, Transaction txn, DatabaseEntry key, DatabaseEntry value)
+ {
+ OperationStatus status = database.put(txn, key, value);
+ if (status != OperationStatus.SUCCESS)
+ {
+ throw new RuntimeException("Cannot add record into " + database.getDatabaseName() + ":" + status);
+ }
+ }
+
static final class CompoundKey
{
public final long _messageId;
@@ -369,4 +704,504 @@ public class UpgradeFrom5To6 extends AbstractStoreUpgrade
}
}
+ static class OldQueueRecord extends Object
+ {
+ private final AMQShortString _queueName;
+ private final AMQShortString _owner;
+ private final FieldTable _arguments;
+ private boolean _exclusive;
+
+ public OldQueueRecord(AMQShortString queueName, AMQShortString owner, boolean exclusive, FieldTable arguments)
+ {
+ _queueName = queueName;
+ _owner = owner;
+ _exclusive = exclusive;
+ _arguments = arguments;
+ }
+
+ public AMQShortString getNameShortString()
+ {
+ return _queueName;
+ }
+
+ public AMQShortString getOwner()
+ {
+ return _owner;
+ }
+
+ public boolean isExclusive()
+ {
+ return _exclusive;
+ }
+
+ public void setExclusive(boolean exclusive)
+ {
+ _exclusive = exclusive;
+ }
+
+ public FieldTable getArguments()
+ {
+ return _arguments;
+ }
+
+ }
+
+ static class UpgradeConfiguredObjectRecord
+ {
+ private String _attributes;
+ private String _type;
+
+ public UpgradeConfiguredObjectRecord(String type, String attributes)
+ {
+ super();
+ _attributes = attributes;
+ _type = type;
+ }
+
+ public String getAttributes()
+ {
+ return _attributes;
+ }
+
+ public String getType()
+ {
+ return _type;
+ }
+
+ }
+
+ static class UpgradeQueueBinding extends TupleBinding<OldQueueRecord>
+ {
+ public OldQueueRecord entryToObject(TupleInput tupleInput)
+ {
+ AMQShortString name = AMQShortStringEncoding.readShortString(tupleInput);
+ AMQShortString owner = AMQShortStringEncoding.readShortString(tupleInput);
+ FieldTable arguments = FieldTableEncoding.readFieldTable(tupleInput);
+ boolean exclusive = tupleInput.readBoolean();
+ return new OldQueueRecord(name, owner, exclusive, arguments);
+ }
+
+ public void objectToEntry(OldQueueRecord queue, TupleOutput tupleOutput)
+ {
+ AMQShortStringEncoding.writeShortString(queue.getNameShortString(), tupleOutput);
+ AMQShortStringEncoding.writeShortString(queue.getOwner(), tupleOutput);
+ FieldTableEncoding.writeFieldTable(queue.getArguments(), tupleOutput);
+ tupleOutput.writeBoolean(queue.isExclusive());
+ }
+ }
+
+ static class UpgradeUUIDBinding extends TupleBinding<UUID>
+ {
+ public UUID entryToObject(final TupleInput tupleInput)
+ {
+ return new UUID(tupleInput.readLong(), tupleInput.readLong());
+ }
+
+ public void objectToEntry(final UUID uuid, final TupleOutput tupleOutput)
+ {
+ tupleOutput.writeLong(uuid.getMostSignificantBits());
+ tupleOutput.writeLong(uuid.getLeastSignificantBits());
+ }
+ }
+
+ static class ConfiguredObjectBinding extends TupleBinding<UpgradeConfiguredObjectRecord>
+ {
+
+ public UpgradeConfiguredObjectRecord entryToObject(TupleInput tupleInput)
+ {
+ String type = tupleInput.readString();
+ String json = tupleInput.readString();
+ UpgradeConfiguredObjectRecord configuredObject = new UpgradeConfiguredObjectRecord(type, json);
+ return configuredObject;
+ }
+
+ public void objectToEntry(UpgradeConfiguredObjectRecord object, TupleOutput tupleOutput)
+ {
+ tupleOutput.writeString(object.getType());
+ tupleOutput.writeString(object.getAttributes());
+ }
+
+ }
+
+ static class ExchangeRecord extends Object
+ {
+ private final AMQShortString _exchangeName;
+ private final AMQShortString _exchangeType;
+ private final boolean _autoDelete;
+
+ public ExchangeRecord(AMQShortString exchangeName, AMQShortString exchangeType, boolean autoDelete)
+ {
+ _exchangeName = exchangeName;
+ _exchangeType = exchangeType;
+ _autoDelete = autoDelete;
+ }
+
+ public AMQShortString getNameShortString()
+ {
+ return _exchangeName;
+ }
+
+ public AMQShortString getType()
+ {
+ return _exchangeType;
+ }
+
+ public boolean isAutoDelete()
+ {
+ return _autoDelete;
+ }
+
+ }
+
+ static class ExchangeBinding extends TupleBinding<ExchangeRecord>
+ {
+
+ public ExchangeRecord entryToObject(TupleInput tupleInput)
+ {
+ AMQShortString name = AMQShortStringEncoding.readShortString(tupleInput);
+ AMQShortString typeName = AMQShortStringEncoding.readShortString(tupleInput);
+
+ boolean autoDelete = tupleInput.readBoolean();
+
+ return new ExchangeRecord(name, typeName, autoDelete);
+ }
+
+ public void objectToEntry(ExchangeRecord exchange, TupleOutput tupleOutput)
+ {
+ AMQShortStringEncoding.writeShortString(exchange.getNameShortString(), tupleOutput);
+ AMQShortStringEncoding.writeShortString(exchange.getType(), tupleOutput);
+
+ tupleOutput.writeBoolean(exchange.isAutoDelete());
+ }
+ }
+
+ static class BindingRecord extends Object
+ {
+ private final AMQShortString _exchangeName;
+ private final AMQShortString _queueName;
+ private final AMQShortString _routingKey;
+ private final FieldTable _arguments;
+
+ public BindingRecord(AMQShortString exchangeName, AMQShortString queueName, AMQShortString routingKey,
+ FieldTable arguments)
+ {
+ _exchangeName = exchangeName;
+ _queueName = queueName;
+ _routingKey = routingKey;
+ _arguments = arguments;
+ }
+
+ public AMQShortString getExchangeName()
+ {
+ return _exchangeName;
+ }
+
+ public AMQShortString getQueueName()
+ {
+ return _queueName;
+ }
+
+ public AMQShortString getRoutingKey()
+ {
+ return _routingKey;
+ }
+
+ public FieldTable getArguments()
+ {
+ return _arguments;
+ }
+
+ }
+
+ static class QueueBindingBinding extends TupleBinding<BindingRecord>
+ {
+
+ public BindingRecord entryToObject(TupleInput tupleInput)
+ {
+ AMQShortString exchangeName = AMQShortStringEncoding.readShortString(tupleInput);
+ AMQShortString queueName = AMQShortStringEncoding.readShortString(tupleInput);
+ AMQShortString routingKey = AMQShortStringEncoding.readShortString(tupleInput);
+
+ FieldTable arguments = FieldTableEncoding.readFieldTable(tupleInput);
+
+ return new BindingRecord(exchangeName, queueName, routingKey, arguments);
+ }
+
+ public void objectToEntry(BindingRecord binding, TupleOutput tupleOutput)
+ {
+ AMQShortStringEncoding.writeShortString(binding.getExchangeName(), tupleOutput);
+ AMQShortStringEncoding.writeShortString(binding.getQueueName(), tupleOutput);
+ AMQShortStringEncoding.writeShortString(binding.getRoutingKey(), tupleOutput);
+
+ FieldTableEncoding.writeFieldTable(binding.getArguments(), tupleOutput);
+ }
+ }
+
+ static class OldQueueEntryKey
+ {
+ private AMQShortString _queueName;
+ private long _messageId;
+
+ public OldQueueEntryKey(AMQShortString queueName, long messageId)
+ {
+ _queueName = queueName;
+ _messageId = messageId;
+ }
+
+ public AMQShortString getQueueName()
+ {
+ return _queueName;
+ }
+
+ public long getMessageId()
+ {
+ return _messageId;
+ }
+ }
+
+ static class OldQueueEntryBinding extends TupleBinding<OldQueueEntryKey>
+ {
+
+ public OldQueueEntryKey entryToObject(TupleInput tupleInput)
+ {
+ AMQShortString queueName = AMQShortStringEncoding.readShortString(tupleInput);
+ long messageId = tupleInput.readLong();
+
+ return new OldQueueEntryKey(queueName, messageId);
+ }
+
+ public void objectToEntry(OldQueueEntryKey mk, TupleOutput tupleOutput)
+ {
+ AMQShortStringEncoding.writeShortString(mk.getQueueName(), tupleOutput);
+ tupleOutput.writeLong(mk.getMessageId());
+ }
+ }
+
+ static class NewQueueEntryKey
+ {
+ private UUID _queueId;
+ private long _messageId;
+
+ public NewQueueEntryKey(UUID queueId, long messageId)
+ {
+ _queueId = queueId;
+ _messageId = messageId;
+ }
+
+ public UUID getQueueId()
+ {
+ return _queueId;
+ }
+
+ public long getMessageId()
+ {
+ return _messageId;
+ }
+ }
+
+ static class NewQueueEntryBinding extends TupleBinding<NewQueueEntryKey>
+ {
+
+ public NewQueueEntryKey entryToObject(TupleInput tupleInput)
+ {
+ UUID queueId = new UUID(tupleInput.readLong(), tupleInput.readLong());
+ long messageId = tupleInput.readLong();
+
+ return new NewQueueEntryKey(queueId, messageId);
+ }
+
+ public void objectToEntry(NewQueueEntryKey mk, TupleOutput tupleOutput)
+ {
+ UUID uuid = mk.getQueueId();
+ tupleOutput.writeLong(uuid.getMostSignificantBits());
+ tupleOutput.writeLong(uuid.getLeastSignificantBits());
+ tupleOutput.writeLong(mk.getMessageId());
+ }
+ }
+
+ static class NewPreparedTransaction
+ {
+ private final NewRecordImpl[] _enqueues;
+ private final NewRecordImpl[] _dequeues;
+
+ public NewPreparedTransaction(NewRecordImpl[] enqueues, NewRecordImpl[] dequeues)
+ {
+ _enqueues = enqueues;
+ _dequeues = dequeues;
+ }
+
+ public NewRecordImpl[] getEnqueues()
+ {
+ return _enqueues;
+ }
+
+ public NewRecordImpl[] getDequeues()
+ {
+ return _dequeues;
+ }
+ }
+
+ static class NewRecordImpl
+ {
+
+ private long _messageNumber;
+ private UUID _queueId;
+
+ public NewRecordImpl(UUID queueId, long messageNumber)
+ {
+ _messageNumber = messageNumber;
+ _queueId = queueId;
+ }
+
+ public long getMessageNumber()
+ {
+ return _messageNumber;
+ }
+
+ public UUID getId()
+ {
+ return _queueId;
+ }
+ }
+
+ static class NewPreparedTransactionBinding extends TupleBinding<NewPreparedTransaction>
+ {
+ @Override
+ public NewPreparedTransaction entryToObject(TupleInput input)
+ {
+ NewRecordImpl[] enqueues = readRecords(input);
+
+ NewRecordImpl[] dequeues = readRecords(input);
+
+ return new NewPreparedTransaction(enqueues, dequeues);
+ }
+
+ private NewRecordImpl[] readRecords(TupleInput input)
+ {
+ NewRecordImpl[] records = new NewRecordImpl[input.readInt()];
+ for (int i = 0; i < records.length; i++)
+ {
+ records[i] = new NewRecordImpl(new UUID(input.readLong(), input.readLong()), input.readLong());
+ }
+ return records;
+ }
+
+ @Override
+ public void objectToEntry(NewPreparedTransaction preparedTransaction, TupleOutput output)
+ {
+ writeRecords(preparedTransaction.getEnqueues(), output);
+ writeRecords(preparedTransaction.getDequeues(), output);
+ }
+
+ private void writeRecords(NewRecordImpl[] records, TupleOutput output)
+ {
+ if (records == null)
+ {
+ output.writeInt(0);
+ }
+ else
+ {
+ output.writeInt(records.length);
+ for (NewRecordImpl record : records)
+ {
+ UUID id = record.getId();
+ output.writeLong(id.getMostSignificantBits());
+ output.writeLong(id.getLeastSignificantBits());
+ output.writeLong(record.getMessageNumber());
+ }
+ }
+ }
+ }
+
+ static class OldRecordImpl
+ {
+
+ private long _messageNumber;
+ private String _queueName;
+
+ public OldRecordImpl(String queueName, long messageNumber)
+ {
+ _messageNumber = messageNumber;
+ _queueName = queueName;
+ }
+
+ public long getMessageNumber()
+ {
+ return _messageNumber;
+ }
+
+ public String getQueueName()
+ {
+ return _queueName;
+ }
+ }
+
+ static class OldPreparedTransaction
+ {
+ private final OldRecordImpl[] _enqueues;
+ private final OldRecordImpl[] _dequeues;
+
+ public OldPreparedTransaction(OldRecordImpl[] enqueues, OldRecordImpl[] dequeues)
+ {
+ _enqueues = enqueues;
+ _dequeues = dequeues;
+ }
+
+ public OldRecordImpl[] getEnqueues()
+ {
+ return _enqueues;
+ }
+
+ public OldRecordImpl[] getDequeues()
+ {
+ return _dequeues;
+ }
+ }
+
+ static class OldPreparedTransactionBinding extends TupleBinding<OldPreparedTransaction>
+ {
+ @Override
+ public OldPreparedTransaction entryToObject(TupleInput input)
+ {
+ OldRecordImpl[] enqueues = readRecords(input);
+
+ OldRecordImpl[] dequeues = readRecords(input);
+
+ return new OldPreparedTransaction(enqueues, dequeues);
+ }
+
+ private OldRecordImpl[] readRecords(TupleInput input)
+ {
+ OldRecordImpl[] records = new OldRecordImpl[input.readInt()];
+ for (int i = 0; i < records.length; i++)
+ {
+ records[i] = new OldRecordImpl(input.readString(), input.readLong());
+ }
+ return records;
+ }
+
+ @Override
+ public void objectToEntry(OldPreparedTransaction preparedTransaction, TupleOutput output)
+ {
+ writeRecords(preparedTransaction.getEnqueues(), output);
+ writeRecords(preparedTransaction.getDequeues(), output);
+ }
+
+ private void writeRecords(OldRecordImpl[] records, TupleOutput output)
+ {
+ if (records == null)
+ {
+ output.writeInt(0);
+ }
+ else
+ {
+ output.writeInt(records.length);
+ for (OldRecordImpl record : records)
+ {
+ output.writeString(record.getQueueName());
+ output.writeLong(record.getMessageNumber());
+ }
+ }
+ }
+ }
} \ No newline at end of file
diff --git a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/Upgrader.java b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/Upgrader.java
index aa165fea2c..e71e39cbb8 100644
--- a/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/Upgrader.java
+++ b/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/Upgrader.java
@@ -24,7 +24,6 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.store.berkeleydb.BDBMessageStore;
import com.sleepycat.bind.tuple.IntegerBinding;
@@ -39,15 +38,15 @@ import com.sleepycat.je.OperationStatus;
public class Upgrader
{
- static final String VERSION_DB_NAME = "VERSION";
+ static final String VERSION_DB_NAME = "DB_VERSION";
private Environment _environment;
- private LogSubject _logSubject;
+ private String _virtualHostName;
- public Upgrader(Environment environment, LogSubject logSubject)
+ public Upgrader(Environment environment, String virtualHostName)
{
_environment = environment;
- _logSubject = logSubject;
+ _virtualHostName = virtualHostName;
}
public void upgradeIfNecessary() throws AMQStoreException
@@ -128,7 +127,7 @@ public class Upgrader
+ "UpgradeFrom"+fromVersion+"To"+toVersion);
Constructor<StoreUpgrade> ctr = upgradeClass.getConstructor();
StoreUpgrade upgrade = ctr.newInstance();
- upgrade.performUpgrade(_logSubject, _environment, UpgradeInteractionHandler.DEFAULT_HANDLER);
+ upgrade.performUpgrade(_environment, UpgradeInteractionHandler.DEFAULT_HANDLER, _virtualHostName);
}
catch (ClassNotFoundException e)
{
diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java
new file mode 100644
index 0000000000..687c671566
--- /dev/null
+++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreConfigurationTest.java
@@ -0,0 +1,14 @@
+package org.apache.qpid.server.store.berkeleydb;
+
+import org.apache.qpid.server.store.DurableConfigurationStoreTest;
+import org.apache.qpid.server.store.MessageStore;
+
+public class BDBMessageStoreConfigurationTest extends DurableConfigurationStoreTest
+{
+ @Override
+ protected MessageStore createStore() throws Exception
+ {
+ return new BDBMessageStore();
+ }
+
+}
diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
index 74fba168a9..a318187f13 100644
--- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
+++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBMessageStoreTest.java
@@ -20,6 +20,10 @@
*/
package org.apache.qpid.server.store.berkeleydb;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
import org.apache.qpid.AMQStoreException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.BasicContentHeaderProperties;
@@ -33,10 +37,12 @@ import org.apache.qpid.server.message.MessageMetaData;
import org.apache.qpid.server.message.MessageMetaData_0_10;
import org.apache.qpid.server.message.MessageReference;
import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.store.MessageMetaDataType;
import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.store.StorableMessageMetaData;
import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.Transaction;
import org.apache.qpid.server.store.TransactionLogResource;
import org.apache.qpid.transport.DeliveryProperties;
import org.apache.qpid.transport.Header;
@@ -47,11 +53,6 @@ import org.apache.qpid.transport.MessageDeliveryPriority;
import org.apache.qpid.transport.MessageProperties;
import org.apache.qpid.transport.MessageTransfer;
-import java.io.File;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.List;
-
/**
* Subclass of MessageStoreTest which runs the standard tests from the superclass against
* the BDB Store as well as additional tests specific to the DBB store-implementation.
@@ -122,7 +123,7 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
/*
* reload the store only (read-only)
*/
- bdbStore = reloadStoreReadOnly(bdbStore);
+ bdbStore = reloadStore(bdbStore);
/*
* Read back and validate the 0-8 message metadata and content
@@ -219,14 +220,14 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
* Use this method instead of reloading the virtual host like other tests in order
* to avoid the recovery handler deleting the message for not being on a queue.
*/
- private BDBMessageStore reloadStoreReadOnly(BDBMessageStore messageStore) throws Exception
+ private BDBMessageStore reloadStore(BDBMessageStore messageStore) throws Exception
{
messageStore.close();
- File storePath = new File(String.valueOf(_config.getProperty("store.environment-path")));
BDBMessageStore newStore = new BDBMessageStore();
- newStore.configure(storePath, false);
- newStore.start();
+ newStore.configure("", _config.subset("store"));
+
+ newStore.startWithNoRecover();
return newStore;
}
@@ -366,13 +367,10 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
assertEquals("Retrieved content when none was expected",
0, bdbStore.getContent(messageid_0_8, 0, dst));
}
-
- private BDBMessageStore assertBDBStore(Object store)
+ private BDBMessageStore assertBDBStore(MessageStore store)
{
- if(!(store instanceof BDBMessageStore))
- {
- fail("Test requires an instance of BDBMessageStore to proceed");
- }
+
+ assertEquals("Test requires an instance of BDBMessageStore to proceed", BDBMessageStore.class, store.getClass());
return (BDBMessageStore) store;
}
@@ -409,23 +407,23 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
BDBMessageStore bdbStore = assertBDBStore(log);
- final AMQShortString mockQueueName = new AMQShortString("queueName");
-
+ final UUID mockQueueId = UUIDGenerator.generateUUID();
TransactionLogResource mockQueue = new TransactionLogResource()
{
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return mockQueueName.asString();
+ return mockQueueId;
}
};
- MessageStore.Transaction txn = log.newTransaction();
+ Transaction txn = log.newTransaction();
txn.enqueueMessage(mockQueue, new MockMessage(1L));
txn.enqueueMessage(mockQueue, new MockMessage(5L));
txn.commitTran();
- List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueName);
+ List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueId);
assertEquals("Number of enqueued messages is incorrect", 2, enqueuedIds.size());
Long val = enqueuedIds.get(0);
@@ -447,17 +445,17 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
BDBMessageStore bdbStore = assertBDBStore(log);
- final AMQShortString mockQueueName = new AMQShortString("queueName");
-
+ final UUID mockQueueId = UUIDGenerator.generateUUID();
TransactionLogResource mockQueue = new TransactionLogResource()
{
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return mockQueueName.asString();
+ return mockQueueId;
}
};
- MessageStore.Transaction txn = log.newTransaction();
+ Transaction txn = log.newTransaction();
txn.enqueueMessage(mockQueue, new MockMessage(21L));
txn.abortTran();
@@ -467,7 +465,7 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
txn.enqueueMessage(mockQueue, new MockMessage(23L));
txn.commitTran();
- List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueName);
+ List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueId);
assertEquals("Number of enqueued messages is incorrect", 2, enqueuedIds.size());
Long val = enqueuedIds.get(0);
@@ -488,17 +486,17 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
BDBMessageStore bdbStore = assertBDBStore(log);
- final AMQShortString mockQueueName = new AMQShortString("queueName");
-
+ final UUID mockQueueId = UUIDGenerator.generateUUID();
TransactionLogResource mockQueue = new TransactionLogResource()
{
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return mockQueueName.asString();
+ return mockQueueId;
}
};
- MessageStore.Transaction txn = log.newTransaction();
+ Transaction txn = log.newTransaction();
txn.enqueueMessage(mockQueue, new MockMessage(30L));
txn.commitTran();
@@ -511,7 +509,7 @@ public class BDBMessageStoreTest extends org.apache.qpid.server.store.MessageSto
txn.enqueueMessage(mockQueue, new MockMessage(32L));
txn.commitTran();
- List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueName);
+ List<Long> enqueuedIds = bdbStore.getEnqueuedMessages(mockQueueId);
assertEquals("Number of enqueued messages is incorrect", 2, enqueuedIds.size());
Long val = enqueuedIds.get(0);
diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java
index b906ab2474..4e201d5473 100644
--- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java
+++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBUpgradeTest.java
@@ -20,6 +20,7 @@
*/
package org.apache.qpid.server.store.berkeleydb;
+
import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.NON_DURABLE_QUEUE_NAME;
import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.QUEUE_NAME;
import static org.apache.qpid.server.store.berkeleydb.BDBStoreUpgradeTestPreparer.SELECTOR_SUB_NAME;
diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBindingTest.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBindingTest.java
new file mode 100644
index 0000000000..f8aeb7f7b0
--- /dev/null
+++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBindingTest.java
@@ -0,0 +1,61 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.berkeleydb.tuple;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+
+import com.sleepycat.bind.tuple.TupleInput;
+import com.sleepycat.bind.tuple.TupleOutput;
+
+public class ConfiguredObjectBindingTest extends TestCase
+{
+
+ private ConfiguredObjectRecord _object;
+
+ private static final String DUMMY_ATTRIBUTES_STRING = "dummyAttributes";
+ private static final String DUMMY_TYPE_STRING = "dummyType";
+ private ConfiguredObjectBinding _configuredObjectBinding;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _configuredObjectBinding = ConfiguredObjectBinding.getInstance();
+ _object = new ConfiguredObjectRecord(UUIDGenerator.generateUUID(), DUMMY_TYPE_STRING, DUMMY_ATTRIBUTES_STRING);
+ }
+
+ public void testObjectToEntryAndEntryToObject()
+ {
+ TupleOutput tupleOutput = new TupleOutput();
+
+ _configuredObjectBinding.objectToEntry(_object, tupleOutput);
+
+ byte[] entryAsBytes = tupleOutput.getBufferBytes();
+ TupleInput tupleInput = new TupleInput(entryAsBytes);
+
+ ConfiguredObjectRecord storedObject = _configuredObjectBinding.entryToObject(tupleInput);
+ assertEquals("Unexpected attributes", DUMMY_ATTRIBUTES_STRING, storedObject.getAttributes());
+ assertEquals("Unexpected type", DUMMY_TYPE_STRING, storedObject.getType());
+ }
+}
diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractUpgradeTestCase.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractUpgradeTestCase.java
index 6df2f8a8db..36991b90d0 100644
--- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractUpgradeTestCase.java
+++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/AbstractUpgradeTestCase.java
@@ -22,10 +22,9 @@ package org.apache.qpid.server.store.berkeleydb.upgrade;
import java.io.File;
-import junit.framework.TestCase;
-
import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.logging.subjects.TestBlankSubject;
+import org.apache.qpid.test.utils.QpidTestCase;
import org.apache.qpid.util.FileUtils;
import com.sleepycat.je.Database;
@@ -33,7 +32,7 @@ import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.Transaction;
-public abstract class AbstractUpgradeTestCase extends TestCase
+public abstract class AbstractUpgradeTestCase extends QpidTestCase
{
protected static final class StaticAnswerHandler implements UpgradeInteractionHandler
{
@@ -57,7 +56,6 @@ public abstract class AbstractUpgradeTestCase extends TestCase
public static int[] QUEUE_SIZES = { 1, 1, 10, 3 };
public static int TOTAL_MESSAGE_NUMBER = 15;
protected static final LogSubject LOG_SUBJECT = new TestBlankSubject();
- protected static final String TMP_FOLDER = System.getProperty("java.io.tmpdir");
// one binding per exchange
protected static final int TOTAL_BINDINGS = QUEUE_NAMES.length * 2;
@@ -148,4 +146,8 @@ public abstract class AbstractUpgradeTestCase extends TestCase
return count.longValue();
}
+ public String getVirtualHostName()
+ {
+ return getName();
+ }
}
diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4to5Test.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4to5Test.java
index 9341022a38..3f9e4e4aa1 100644
--- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4to5Test.java
+++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom4to5Test.java
@@ -66,7 +66,7 @@ public class UpgradeFrom4to5Test extends AbstractUpgradeTestCase
public void testPerformUpgradeWithHandlerAnsweringYes() throws Exception
{
UpgradeFrom4To5 upgrade = new UpgradeFrom4To5();
- upgrade.performUpgrade(LOG_SUBJECT, _environment, new StaticAnswerHandler(UpgradeInteractionResponse.YES));
+ upgrade.performUpgrade(_environment, new StaticAnswerHandler(UpgradeInteractionResponse.YES), getVirtualHostName());
assertQueues(new HashSet<String>(Arrays.asList(QUEUE_NAMES)));
@@ -93,7 +93,7 @@ public class UpgradeFrom4to5Test extends AbstractUpgradeTestCase
public void testPerformUpgradeWithHandlerAnsweringNo() throws Exception
{
UpgradeFrom4To5 upgrade = new UpgradeFrom4To5();
- upgrade.performUpgrade(LOG_SUBJECT, _environment, new StaticAnswerHandler(UpgradeInteractionResponse.NO));
+ upgrade.performUpgrade(_environment, new StaticAnswerHandler(UpgradeInteractionResponse.NO), getVirtualHostName());
assertQueues(new HashSet<String>(Arrays.asList(DURABLE_SUBSCRIPTION_QUEUE, DURABLE_SUBSCRIPTION_QUEUE_WITH_SELECTOR, DURABLE_QUEUE)));
assertDatabaseRecordCount(DELIVERY_DB_NAME, 12);
diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6Test.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6Test.java
index cca5923ffd..5297692820 100644
--- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6Test.java
+++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom5To6Test.java
@@ -20,14 +20,50 @@
*/
package org.apache.qpid.server.store.berkeleydb.upgrade;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.CONFIGURED_OBJECTS_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NEW_CONTENT_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NEW_DELIVERY_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NEW_METADATA_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NEW_XID_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.OLD_CONTENT_DB_NAME;
+import static org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.OLD_XID_DB_NAME;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+
import org.apache.log4j.Logger;
+import org.apache.qpid.server.model.Binding;
+import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.store.berkeleydb.entry.Xid;
+import org.apache.qpid.server.store.berkeleydb.tuple.XidBinding;
import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.CompoundKey;
import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.CompoundKeyBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.ConfiguredObjectBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.UpgradeConfiguredObjectRecord;
import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewDataBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewPreparedTransaction;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewPreparedTransactionBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewQueueEntryBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewQueueEntryKey;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.NewRecordImpl;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.OldPreparedTransaction;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.OldPreparedTransactionBinding;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.OldRecordImpl;
+import org.apache.qpid.server.store.berkeleydb.upgrade.UpgradeFrom5To6.UpgradeUUIDBinding;
+import org.apache.qpid.server.util.MapJsonSerializer;
import com.sleepycat.bind.tuple.LongBinding;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseEntry;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.LockMode;
import com.sleepycat.je.Transaction;
public class UpgradeFrom5To6Test extends AbstractUpgradeTestCase
@@ -43,10 +79,13 @@ public class UpgradeFrom5To6Test extends AbstractUpgradeTestCase
public void testPerformUpgrade() throws Exception
{
UpgradeFrom5To6 upgrade = new UpgradeFrom5To6();
- upgrade.performUpgrade(LOG_SUBJECT, _environment, UpgradeInteractionHandler.DEFAULT_HANDLER);
+ upgrade.performUpgrade(_environment, UpgradeInteractionHandler.DEFAULT_HANDLER, getVirtualHostName());
assertDatabaseRecordCounts();
assertContent();
+
+ assertConfiguredObjects();
+ assertQueueEntries();
}
public void testPerformUpgradeWithMissingMessageChunkKeepsIncompleteMessage() throws Exception
@@ -54,9 +93,12 @@ public class UpgradeFrom5To6Test extends AbstractUpgradeTestCase
corruptDatabase();
UpgradeFrom5To6 upgrade = new UpgradeFrom5To6();
- upgrade.performUpgrade(LOG_SUBJECT, _environment, new StaticAnswerHandler(UpgradeInteractionResponse.YES));
+ upgrade.performUpgrade(_environment, new StaticAnswerHandler(UpgradeInteractionResponse.YES), getVirtualHostName());
assertDatabaseRecordCounts();
+
+ assertConfiguredObjects();
+ assertQueueEntries();
}
public void testPerformUpgradeWithMissingMessageChunkDiscardsIncompleteMessage() throws Exception
@@ -67,10 +109,117 @@ public class UpgradeFrom5To6Test extends AbstractUpgradeTestCase
UpgradeInteractionHandler discardMessageInteractionHandler = new StaticAnswerHandler(UpgradeInteractionResponse.NO);
- upgrade.performUpgrade(LOG_SUBJECT, _environment, discardMessageInteractionHandler);
+ upgrade.performUpgrade(_environment, discardMessageInteractionHandler, getVirtualHostName());
+
+ assertDatabaseRecordCount(NEW_METADATA_DB_NAME, 11);
+ assertDatabaseRecordCount(NEW_CONTENT_DB_NAME, 11);
+
+ assertConfiguredObjects();
+ assertQueueEntries();
+ }
+
+ public void testPerformXidUpgrade() throws Exception
+ {
+ File storeLocation = new File(TMP_FOLDER, getName());
+ storeLocation.mkdirs();
+ Environment environment = createEnvironment(storeLocation);
+ try
+ {
+ populateOldXidEntries(environment);
+ UpgradeFrom5To6 upgrade = new UpgradeFrom5To6();
+ upgrade.performUpgrade(environment, UpgradeInteractionHandler.DEFAULT_HANDLER, getVirtualHostName());
+ assertXidEntries(environment);
+ }
+ finally
+ {
+ try
+ {
+ environment.close();
+ }
+ finally
+ {
+ deleteDirectoryIfExists(storeLocation);
+ }
+
+ }
+ }
+
+ private void assertXidEntries(Environment environment)
+ {
+ final DatabaseEntry value = new DatabaseEntry();
+ final DatabaseEntry key = getXidKey();
+ new DatabaseTemplate(environment, NEW_XID_DB_NAME, null).run(new DatabaseRunnable()
+ {
+
+ @Override
+ public void run(Database xidDatabase, Database nullDatabase, Transaction transaction)
+ {
+ xidDatabase.get(null, key, value, LockMode.DEFAULT);
+ }
+ });
+ NewPreparedTransactionBinding newBinding = new NewPreparedTransactionBinding();
+ NewPreparedTransaction newTransaction = newBinding.entryToObject(value);
+ NewRecordImpl[] newEnqueues = newTransaction.getEnqueues();
+ NewRecordImpl[] newDequeues = newTransaction.getDequeues();
+ assertEquals("Unxpected new enqueus number", 1, newEnqueues.length);
+ NewRecordImpl enqueue = newEnqueues[0];
+ assertEquals("Unxpected queue id", UUIDGenerator.generateUUID("TEST1", getVirtualHostName()), enqueue.getId());
+ assertEquals("Unxpected message id", 1, enqueue.getMessageNumber());
+ assertEquals("Unxpected new dequeues number", 1, newDequeues.length);
+ NewRecordImpl dequeue = newDequeues[0];
+ assertEquals("Unxpected queue id", UUIDGenerator.generateUUID("TEST2", getVirtualHostName()), dequeue.getId());
+ assertEquals("Unxpected message id", 2, dequeue.getMessageNumber());
+ }
+
+ private void populateOldXidEntries(Environment environment)
+ {
- assertDatabaseRecordCount("MESSAGE_METADATA", 11);
- assertDatabaseRecordCount("MESSAGE_CONTENT", 11);
+ final DatabaseEntry value = new DatabaseEntry();
+ OldRecordImpl[] enqueues = { new OldRecordImpl("TEST1", 1) };
+ OldRecordImpl[] dequeues = { new OldRecordImpl("TEST2", 2) };
+ OldPreparedTransaction oldPreparedTransaction = new OldPreparedTransaction(enqueues, dequeues);
+ OldPreparedTransactionBinding oldPreparedTransactionBinding = new OldPreparedTransactionBinding();
+ oldPreparedTransactionBinding.objectToEntry(oldPreparedTransaction, value);
+
+ final DatabaseEntry key = getXidKey();
+ new DatabaseTemplate(environment, OLD_XID_DB_NAME, null).run(new DatabaseRunnable()
+ {
+
+ @Override
+ public void run(Database xidDatabase, Database nullDatabase, Transaction transaction)
+ {
+ xidDatabase.put(null, key, value);
+ }
+ });
+ }
+
+ protected DatabaseEntry getXidKey()
+ {
+ final DatabaseEntry value = new DatabaseEntry();
+ byte[] globalId = { 1 };
+ byte[] branchId = { 2 };
+ Xid xid = new Xid(1l, globalId, branchId);
+ XidBinding xidBinding = XidBinding.getInstance();
+ xidBinding.objectToEntry(xid, value);
+ return value;
+ }
+
+ private void assertQueueEntries()
+ {
+ final Map<UUID, UpgradeConfiguredObjectRecord> configuredObjects = loadConfiguredObjects();
+ final NewQueueEntryBinding newBinding = new NewQueueEntryBinding();
+ CursorOperation cursorOperation = new CursorOperation()
+ {
+
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ NewQueueEntryKey newEntryRecord = newBinding.entryToObject(key);
+ assertTrue("Unexpected queue id", configuredObjects.containsKey(newEntryRecord.getQueueId()));
+ }
+ };
+ new DatabaseTemplate(_environment, NEW_DELIVERY_DB_NAME, null).run(cursorOperation);
}
/**
@@ -105,19 +254,124 @@ public class UpgradeFrom5To6Test extends AbstractUpgradeTestCase
};
Transaction transaction = _environment.beginTransaction(null, null);
- new DatabaseTemplate(_environment, "messageContentDb_v5", transaction).run(cursorOperation);
+ new DatabaseTemplate(_environment, OLD_CONTENT_DB_NAME, transaction).run(cursorOperation);
transaction.commit();
}
private void assertDatabaseRecordCounts()
{
- assertDatabaseRecordCount("EXCHANGES", 5);
- assertDatabaseRecordCount("QUEUES", 3);
- assertDatabaseRecordCount("QUEUE_BINDINGS", 6);
- assertDatabaseRecordCount("DELIVERIES", 12);
+ assertDatabaseRecordCount(CONFIGURED_OBJECTS_DB_NAME, 9);
+ assertDatabaseRecordCount(NEW_DELIVERY_DB_NAME, 12);
- assertDatabaseRecordCount("MESSAGE_METADATA", 12);
- assertDatabaseRecordCount("MESSAGE_CONTENT", 12);
+ assertDatabaseRecordCount(NEW_METADATA_DB_NAME, 12);
+ assertDatabaseRecordCount(NEW_CONTENT_DB_NAME, 12);
+ }
+
+ private void assertConfiguredObjects()
+ {
+ Map<UUID, UpgradeConfiguredObjectRecord> configuredObjects = loadConfiguredObjects();
+ assertEquals("Unexpected number of configured objects", 9, configuredObjects.size());
+
+ Set<Map<String, Object>> expected = new HashSet<Map<String, Object>>(9);
+ Map<String, Object> queue1 = new HashMap<String, Object>();
+ queue1.put("exclusive", Boolean.FALSE);
+ queue1.put("name", "myUpgradeQueue");
+ queue1.put("owner", null);
+ expected.add(queue1);
+ Map<String, Object> queue2 = new HashMap<String, Object>();
+ queue2.put("exclusive", Boolean.TRUE);
+ queue2.put("name", "clientid:mySelectorDurSubName");
+ queue2.put("owner", "clientid");
+ expected.add(queue2);
+ Map<String, Object> queue3 = new HashMap<String, Object>();
+ queue3.put("exclusive", Boolean.TRUE);
+ queue3.put("name", "clientid:myDurSubName");
+ queue3.put("owner", "clientid");
+ expected.add(queue3);
+
+ Map<String, Object> queueBinding1 = new HashMap<String, Object>();
+ queueBinding1.put("queue", UUIDGenerator.generateUUID("myUpgradeQueue", getVirtualHostName()).toString());
+ queueBinding1.put("name", "myUpgradeQueue");
+ queueBinding1.put("exchange", UUIDGenerator.generateUUID("<<default>>", getVirtualHostName()).toString());
+ expected.add(queueBinding1);
+ Map<String, Object> queueBinding2 = new HashMap<String, Object>();
+ queueBinding2.put("queue", UUIDGenerator.generateUUID("myUpgradeQueue", getVirtualHostName()).toString());
+ queueBinding2.put("name", "myUpgradeQueue");
+ queueBinding2.put("exchange", UUIDGenerator.generateUUID("amq.direct", getVirtualHostName()).toString());
+ Map<String, Object> arguments2 = new HashMap<String, Object>();
+ arguments2.put("x-filter-jms-selector", "");
+ queueBinding2.put("arguments", arguments2);
+ expected.add(queueBinding2);
+ Map<String, Object> queueBinding3 = new HashMap<String, Object>();
+ queueBinding3.put("queue", UUIDGenerator.generateUUID("clientid:myDurSubName", getVirtualHostName()).toString());
+ queueBinding3.put("name", "myUpgradeTopic");
+ queueBinding3.put("exchange", UUIDGenerator.generateUUID("amq.topic", getVirtualHostName()).toString());
+ Map<String, Object> arguments3 = new HashMap<String, Object>();
+ arguments3.put("x-filter-jms-selector", "");
+ queueBinding3.put("arguments", arguments3);
+ expected.add(queueBinding3);
+ Map<String, Object> queueBinding4 = new HashMap<String, Object>();
+ queueBinding4.put("queue", UUIDGenerator.generateUUID("clientid:mySelectorDurSubName", getVirtualHostName()).toString());
+ queueBinding4.put("name", "mySelectorUpgradeTopic");
+ queueBinding4.put("exchange", UUIDGenerator.generateUUID("amq.topic", getVirtualHostName()).toString());
+ Map<String, Object> arguments4 = new HashMap<String, Object>();
+ arguments4.put("x-filter-jms-selector", "testprop='true'");
+ queueBinding4.put("arguments", arguments4);
+ expected.add(queueBinding4);
+ Map<String, Object> queueBinding5 = new HashMap<String, Object>();
+ queueBinding5.put("queue", UUIDGenerator.generateUUID("clientid:myDurSubName", getVirtualHostName()).toString());
+ queueBinding5.put("name", "clientid:myDurSubName");
+ queueBinding5.put("exchange", UUIDGenerator.generateUUID("<<default>>", getVirtualHostName()).toString());
+ expected.add(queueBinding5);
+ Map<String, Object> queueBinding6 = new HashMap<String, Object>();
+ queueBinding6.put("queue", UUIDGenerator.generateUUID("clientid:mySelectorDurSubName", getVirtualHostName()).toString());
+ queueBinding6.put("name", "clientid:mySelectorDurSubName");
+ queueBinding6.put("exchange", UUIDGenerator.generateUUID("<<default>>", getVirtualHostName()).toString());
+ expected.add(queueBinding6);
+
+ Set<String> expectedTypes = new HashSet<String>();
+ expectedTypes.add(Queue.class.getName());
+ expectedTypes.add(Exchange.class.getName());
+ expectedTypes.add(Binding.class.getName());
+ MapJsonSerializer jsonSerializer = new MapJsonSerializer();
+ for (Entry<UUID, UpgradeConfiguredObjectRecord> entry : configuredObjects.entrySet())
+ {
+ UpgradeConfiguredObjectRecord object = entry.getValue();
+ UUID key = entry.getKey();
+ Map<String, Object> deserialized = jsonSerializer.deserialize(object.getAttributes());
+ assertTrue("Unexpected entry:" + object.getAttributes(), expected.remove(deserialized));
+ String type = object.getType();
+ assertTrue("Unexpected type:" + type, expectedTypes.contains(type));
+ if (type.equals(Exchange.class.getName()) || type.equals(Queue.class.getName()))
+ {
+ assertEquals("Unexpected key", key, UUIDGenerator.generateUUID(((String) deserialized.get("name")), getVirtualHostName()));
+ }
+ else
+ {
+ assertNotNull("Key cannot be null", key);
+ }
+ }
+ assertTrue("Not all expected configured objects found:" + expected, expected.isEmpty());
+ }
+
+ private Map<UUID, UpgradeConfiguredObjectRecord> loadConfiguredObjects()
+ {
+ final Map<UUID, UpgradeConfiguredObjectRecord> configuredObjectsRecords = new HashMap<UUID, UpgradeConfiguredObjectRecord>();
+ final ConfiguredObjectBinding binding = new ConfiguredObjectBinding();
+ final UpgradeUUIDBinding uuidBinding = new UpgradeUUIDBinding();
+ CursorOperation configuredObjectsCursor = new CursorOperation()
+ {
+ @Override
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
+ {
+ UUID id = uuidBinding.entryToObject(key);
+ UpgradeConfiguredObjectRecord object = binding.entryToObject(value);
+ configuredObjectsRecords.put(id, object);
+ }
+ };
+ new DatabaseTemplate(_environment, CONFIGURED_OBJECTS_DB_NAME, null).run(configuredObjectsCursor);
+ return configuredObjectsRecords;
}
private void assertContent()
@@ -127,8 +381,8 @@ public class UpgradeFrom5To6Test extends AbstractUpgradeTestCase
{
@Override
- public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction, DatabaseEntry key,
- DatabaseEntry value)
+ public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction,
+ DatabaseEntry key, DatabaseEntry value)
{
long id = LongBinding.entryToLong(key);
assertTrue("Unexpected id", id > 0);
@@ -136,6 +390,6 @@ public class UpgradeFrom5To6Test extends AbstractUpgradeTestCase
assertNotNull("Unexpected content", content);
}
};
- new DatabaseTemplate(_environment, "MESSAGE_CONTENT", null).run(contentCursorOperation);
+ new DatabaseTemplate(_environment, NEW_CONTENT_DB_NAME, null).run(contentCursorOperation);
}
}
diff --git a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgraderTest.java b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgraderTest.java
index 0e9d722089..ba5ca842bf 100644
--- a/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgraderTest.java
+++ b/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgraderTest.java
@@ -24,7 +24,6 @@ import java.io.File;
import java.util.ArrayList;
import java.util.List;
-import org.apache.qpid.server.logging.subjects.TestBlankSubject;
import org.apache.qpid.server.store.berkeleydb.BDBMessageStore;
import org.apache.qpid.server.store.berkeleydb.tuple.ContentBinding;
@@ -51,7 +50,7 @@ public class UpgraderTest extends AbstractUpgradeTestCase
public void setUp() throws Exception
{
super.setUp();
- _upgrader = new Upgrader(_environment, new TestBlankSubject());
+ _upgrader = new Upgrader(_environment, getVirtualHostName());
}
private int getStoreVersion()
@@ -106,12 +105,12 @@ public class UpgraderTest extends AbstractUpgradeTestCase
nonExistentStoreLocation.mkdir();
_environment = createEnvironment(nonExistentStoreLocation);
- _upgrader = new Upgrader(_environment, new TestBlankSubject());
+ _upgrader = new Upgrader(_environment, getVirtualHostName());
_upgrader.upgradeIfNecessary();
List<String> databaseNames = _environment.getDatabaseNames();
List<String> expectedDatabases = new ArrayList<String>();
- expectedDatabases.add("VERSION");
+ expectedDatabases.add(Upgrader.VERSION_DB_NAME);
assertEquals("Expectedonly VERSION table in initially empty store after upgrade: ", expectedDatabases, databaseNames);
assertEquals("Unexpected store version", BDBMessageStore.VERSION, getStoreVersion());
diff --git a/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java b/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java
index b299b62538..9a08eb6499 100644
--- a/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java
+++ b/qpid/java/broker-plugins/access-control/src/main/java/org/apache/qpid/server/security/access/config/PlainConfiguration.java
@@ -83,7 +83,6 @@ public class PlainConfiguration extends AbstractConfiguration
_st.commentChar(COMMENT); // single line comments
_st.eolIsSignificant(true); // return EOL as a token
- _st.lowerCaseMode(true); // case insensitive tokens
_st.ordinaryChar('='); // equals is a token
_st.ordinaryChar(CONTINUATION); // continuation character (when followed by EOL)
_st.quoteChar('"'); // double quote
diff --git a/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java b/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java
index 61e867f459..5db02d10ce 100644
--- a/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java
+++ b/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/AccessControlTest.java
@@ -68,7 +68,7 @@ public class AccessControlTest extends TestCase
private RuleSet createGroupRuleSet()
{
final RuleSet rs = new RuleSet();
- rs.addGroup("aclGroup1", Arrays.asList(new String[] {"member1", "member2"}));
+ rs.addGroup("aclGroup1", Arrays.asList(new String[] {"member1", "Member2"}));
// Rule expressed with username
rs.grant(0, "user1", Permission.ALLOW, Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
@@ -122,7 +122,12 @@ public class AccessControlTest extends TestCase
setUpGroupAccessControl();
SecurityManager.setThreadSubject(TestPrincipalUtils.createTestSubject("member1"));
- final Result result = _plugin.authorise(Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+ Result result = _plugin.authorise(Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
+ assertEquals(Result.ALLOWED, result);
+
+ SecurityManager.setThreadSubject(TestPrincipalUtils.createTestSubject("Member2"));
+
+ result = _plugin.authorise(Operation.ACCESS, ObjectType.VIRTUALHOST, ObjectProperties.EMPTY);
assertEquals(Result.ALLOWED, result);
}
diff --git a/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java b/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java
index aa3982df71..25f903e860 100644
--- a/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java
+++ b/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/PlainConfigurationTest.java
@@ -318,17 +318,17 @@ public class PlainConfigurationTest extends TestCase
*/
public void testMixedCaseRuleInterpretation() throws Exception
{
- final PlainConfiguration config = writeACLConfig("AcL deny-LOG user1 BiND Exchange name=AmQ.dIrect");
+ final PlainConfiguration config = writeACLConfig("AcL deny-LOG User1 BiND Exchange Name=AmQ.dIrect");
final RuleSet rs = config.getConfiguration();
assertEquals(1, rs.getRuleCount());
final Map<Integer, Rule> rules = rs.getAllRules();
assertEquals(1, rules.size());
final Rule rule = rules.get(0);
- assertEquals("Rule has unexpected identity", "user1", rule.getIdentity());
+ assertEquals("Rule has unexpected identity", "User1", rule.getIdentity());
assertEquals("Rule has unexpected operation", Operation.BIND, rule.getAction().getOperation());
assertEquals("Rule has unexpected operation", ObjectType.EXCHANGE, rule.getAction().getObjectType());
- final ObjectProperties expectedProperties = new ObjectProperties("amq.direct");
+ final ObjectProperties expectedProperties = new ObjectProperties("AmQ.dIrect");
assertEquals("Rule has unexpected object properties", expectedProperties, rule.getAction().getProperties());
}
diff --git a/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchange.java b/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchange.java
index 6e1ea25f26..af56b50437 100644
--- a/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchange.java
+++ b/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchange.java
@@ -40,6 +40,7 @@ import javax.management.openmbean.OpenDataException;
import javax.management.openmbean.TabularData;
import java.util.ArrayList;
import java.util.Map;
+import java.util.UUID;
/**
* This is a special diagnostic exchange type which doesn't actually do anything
@@ -125,14 +126,14 @@ public class DiagnosticExchange extends AbstractExchange
return DiagnosticExchange.class;
}
- public DiagnosticExchange newInstance(VirtualHost host,
+ public DiagnosticExchange newInstance(UUID id, VirtualHost host,
AMQShortString name,
boolean durable,
int ticket,
boolean autoDelete) throws AMQException
{
DiagnosticExchange exch = new DiagnosticExchange();
- exch.initialise(host,name,durable,ticket,autoDelete);
+ exch.initialise(id, host,name,durable,ticket,autoDelete);
return exch;
}
@@ -159,11 +160,6 @@ public class DiagnosticExchange extends AbstractExchange
return new DiagnosticExchange.DiagnosticExchangeMBean();
}
- public Logger getLogger()
- {
- return _logger;
- }
-
public void registerQueue(String routingKey, AMQQueue queue, Map<String, Object> args) throws AMQException
{
// No op
diff --git a/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchangeType.java b/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchangeType.java
index b4d0d1aa0d..c0f325e42f 100644
--- a/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchangeType.java
+++ b/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/diagnostic/DiagnosticExchangeType.java
@@ -21,6 +21,8 @@
package org.apache.qpid.extras.exchanges.diagnostic;
+import java.util.UUID;
+
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.exchange.ExchangeType;
@@ -42,11 +44,11 @@ public final class DiagnosticExchangeType implements ExchangeType<DiagnosticExch
return DiagnosticExchange.class;
}
- public DiagnosticExchange newInstance(VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
+ public DiagnosticExchange newInstance(UUID id, VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
throws AMQException
{
DiagnosticExchange exch = new DiagnosticExchange();
- exch.initialise(host, name, durable, ticket, autoDelete);
+ exch.initialise(id, host, name, durable, ticket, autoDelete);
return exch;
}
diff --git a/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchange.java b/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchange.java
index cf79924f3d..691f4c8d0b 100644
--- a/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchange.java
+++ b/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchange.java
@@ -255,7 +255,7 @@ public class TestExchange implements Exchange
return 0;
}
- public void initialise(VirtualHost arg0, AMQShortString arg1, boolean arg2, int arg3, boolean arg4)
+ public void initialise(UUID id, VirtualHost arg0, AMQShortString arg1, boolean arg2, int arg3, boolean arg4)
throws AMQException
{
}
diff --git a/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchangeType.java b/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchangeType.java
index db02ca13ea..5c454b9d0e 100644
--- a/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchangeType.java
+++ b/qpid/java/broker-plugins/extras/src/main/java/org/apache/qpid/extras/exchanges/example/TestExchangeType.java
@@ -21,6 +21,8 @@
package org.apache.qpid.extras.exchanges.example;
+import java.util.UUID;
+
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.exchange.Exchange;
@@ -40,12 +42,12 @@ public class TestExchangeType implements ExchangeType
return null;
}
- public Exchange newInstance(VirtualHost host, AMQShortString name, boolean durable,
+ public Exchange newInstance(UUID id, VirtualHost host, AMQShortString name, boolean durable,
int token, boolean autoDelete)
throws AMQException
{
TestExchange ex = new TestExchange();
- ex.initialise(host, name, durable, token, autoDelete);
+ ex.initialise(id, host, name, durable, token, autoDelete);
return ex;
}
diff --git a/qpid/java/broker/build.xml b/qpid/java/broker/build.xml
index bb809583ee..9e8bf12f18 100644
--- a/qpid/java/broker/build.xml
+++ b/qpid/java/broker/build.xml
@@ -19,7 +19,7 @@
-
-->
<project name="AMQ Broker" default="build">
- <property name="module.depends" value="management/common common"/>
+ <property name="module.depends" value="management/common common amqp-1-0-common"/>
<property name="module.test.depends" value="common/test" />
<property name="module.main" value="org.apache.qpid.server.Main"/>
<property name="module.genpom" value="true"/>
diff --git a/qpid/java/broker/etc/virtualhosts.xml b/qpid/java/broker/etc/virtualhosts.xml
index 4dcdcda6d2..1f7f91de9a 100644
--- a/qpid/java/broker/etc/virtualhosts.xml
+++ b/qpid/java/broker/etc/virtualhosts.xml
@@ -25,8 +25,8 @@
<name>localhost</name>
<localhost>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
- <!--<class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
+ <!--<factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
<environment-path>${QPID_WORK}/derbystore</environment-path>-->
</store>
@@ -86,8 +86,8 @@
<name>development</name>
<development>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
- <!--<class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
+ <!--<factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
<environment-path>${QPID_WORK}/derbystore</environment-path>-->
</store>
@@ -125,8 +125,8 @@
<name>test</name>
<test>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
- <!--<class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
+ <!--<factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
<environment-path>${QPID_WORK}/derbystore</environment-path>-->
</store>
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/qmf/ManagementExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/qmf/ManagementExchange.java
index 2d6f7e0946..034a4ae53c 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/qmf/ManagementExchange.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/qmf/ManagementExchange.java
@@ -37,6 +37,7 @@ import org.apache.qpid.server.exchange.topic.TopicNormalizer;
import org.apache.qpid.server.exchange.topic.TopicParser;
import org.apache.qpid.server.message.InboundMessage;
import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.virtualhost.HouseKeepingTask;
@@ -83,7 +84,8 @@ public class ManagementExchange implements Exchange, QMFService.Listener
private class ManagementQueue implements BaseQueue
{
- private final String NAME_AS_STRING = "##__mgmt_pseudo_queue__##" + UUID.randomUUID().toString();
+ private final UUID QUEUE_ID = UUIDGenerator.generateUUID();
+ private final String NAME_AS_STRING = "##__mgmt_pseudo_queue__##" + QUEUE_ID.toString();
private final AMQShortString NAME_AS_SHORT_STRING = new AMQShortString(NAME_AS_STRING);
public void enqueue(ServerMessage message) throws AMQException
@@ -129,9 +131,10 @@ public class ManagementExchange implements Exchange, QMFService.Listener
return NAME_AS_SHORT_STRING;
}
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return NAME_AS_STRING;
+ return QUEUE_ID;
}
}
@@ -155,14 +158,14 @@ public class ManagementExchange implements Exchange, QMFService.Listener
return ManagementExchange.class;
}
- public ManagementExchange newInstance(VirtualHost host,
+ public ManagementExchange newInstance(UUID id, VirtualHost host,
AMQShortString name,
boolean durable,
int ticket,
boolean autoDelete) throws AMQException
{
ManagementExchange exch = new ManagementExchange();
- exch.initialise(host, name, durable, ticket, autoDelete);
+ exch.initialise(id, host, name, durable, ticket, autoDelete);
return exch;
}
@@ -183,7 +186,7 @@ public class ManagementExchange implements Exchange, QMFService.Listener
return QPID_MANAGEMENT_TYPE;
}
- public void initialise(VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
+ public void initialise(UUID id, VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
throws AMQException
{
if(!QPID_MANAGEMENT.equals(name))
@@ -191,7 +194,7 @@ public class ManagementExchange implements Exchange, QMFService.Listener
throw new AMQException("Can't create more than one Management exchange");
}
_virtualHost = host;
- _id = host.getConfigStore().createId();
+ _id = id;
_virtualHost.scheduleHouseKeepingTask(_virtualHost.getBroker().getManagementPublishInterval(), new UpdateTask(_virtualHost));
getConfigStore().addConfiguredObject(this);
getQMFService().addListener(this);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java
index 265aa7714e..0f32b98aa8 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java
@@ -33,11 +33,11 @@ import org.apache.qpid.server.logging.actors.CurrentActor;
import org.apache.qpid.server.logging.actors.ManagementActor;
import org.apache.qpid.server.management.AMQManagedObject;
import org.apache.qpid.server.management.ManagedObject;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.queue.AMQQueueMBean;
import org.apache.qpid.server.queue.QueueRegistry;
-import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.server.virtualhost.VirtualHostImpl;
@@ -49,6 +49,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
/**
* This MBean implements the broker management interface and exposes the
@@ -60,8 +61,6 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
private final QueueRegistry _queueRegistry;
private final ExchangeRegistry _exchangeRegistry;
private final ExchangeFactory _exchangeFactory;
- private final Exchange _defaultExchange;
- private final DurableConfigurationStore _durableConfig;
private final VirtualHostImpl.VirtualHostMBean _virtualHostMBean;
@@ -75,8 +74,6 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
_queueRegistry = virtualHost.getQueueRegistry();
_exchangeRegistry = virtualHost.getExchangeRegistry();
- _defaultExchange = _exchangeRegistry.getDefaultExchange();
- _durableConfig = virtualHost.getDurableConfigurationStore();
_exchangeFactory = virtualHost.getExchangeFactory();
}
@@ -176,12 +173,12 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
Exchange exchange = _exchangeRegistry.getExchange(new AMQShortString(exchangeName));
if (exchange == null)
{
- exchange = _exchangeFactory.createExchange(new AMQShortString(exchangeName), new AMQShortString(type),
- durable, false, 0);
+ exchange = _exchangeFactory.createExchange(new AMQShortString(exchangeName),
+ new AMQShortString(type), durable, false, 0);
_exchangeRegistry.registerExchange(exchange);
if (durable)
{
- _durableConfig.createExchange(exchange);
+ getVirtualHost().getMessageStore().createExchange(exchange);
}
}
else
@@ -249,45 +246,42 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
public void createNewQueue(String queueName, String owner, boolean durable, Map<String,Object> arguments) throws JMException
{
final AMQShortString queueNameAsAMQShortString = new AMQShortString(queueName);
- AMQQueue queue = _queueRegistry.getQueue(queueNameAsAMQShortString);
- if (queue != null)
+ synchronized (_queueRegistry)
{
- throw new JMException("The queue \"" + queueName + "\" already exists.");
- }
-
- CurrentActor.set(new ManagementActor(getLogActor().getRootMessageLogger()));
- try
- {
- AMQShortString ownerShortString = null;
- if (owner != null)
+ AMQQueue queue = _queueRegistry.getQueue(queueNameAsAMQShortString);
+ if (queue != null)
{
- ownerShortString = new AMQShortString(owner);
+ throw new JMException("The queue \"" + queueName + "\" already exists.");
}
- FieldTable args = null;
- if(arguments != null)
+ CurrentActor.set(new ManagementActor(getLogActor().getRootMessageLogger()));
+ try
{
- args = FieldTable.convertToFieldTable(arguments);
- }
- final VirtualHost virtualHost = getVirtualHost();
+ FieldTable args = null;
+ if(arguments != null)
+ {
+ args = FieldTable.convertToFieldTable(arguments);
+ }
+ final VirtualHost virtualHost = getVirtualHost();
+
+ queue = AMQQueueFactory.createAMQQueueImpl(UUIDGenerator.generateUUID(), queueName, durable, owner,
+ false, false, getVirtualHost(), arguments);
+ if (queue.isDurable() && !queue.isAutoDelete())
+ {
+ getVirtualHost().getMessageStore().createQueue(queue, args);
+ }
- queue = AMQQueueFactory.createAMQQueueImpl(queueNameAsAMQShortString, durable, ownerShortString,
- false, false, getVirtualHost(), args);
- if (queue.isDurable() && !queue.isAutoDelete())
+ virtualHost.getBindingFactory().addBinding(queueName, queue, _exchangeRegistry.getDefaultExchange(), null);
+ }
+ catch (AMQException ex)
{
- _durableConfig.createQueue(queue, args);
+ JMException jme = new JMException(ex.toString());
+ throw new MBeanException(jme, "Error in creating queue " + queueName);
+ }
+ finally
+ {
+ CurrentActor.remove();
}
-
- virtualHost.getBindingFactory().addBinding(queueName, queue, _defaultExchange, null);
- }
- catch (AMQException ex)
- {
- JMException jme = new JMException(ex.toString());
- throw new MBeanException(jme, "Error in creating queue " + queueName);
- }
- finally
- {
- CurrentActor.remove();
}
}
@@ -317,7 +311,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
queue.delete();
if (queue.isDurable())
{
- _durableConfig.removeQueue(queue);
+ getVirtualHost().getMessageStore().removeQueue(queue);
}
}
catch (AMQException ex)
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java
index 22f9544b0c..8198cec821 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java
@@ -83,11 +83,13 @@ import org.apache.qpid.server.queue.IncomingMessage;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.StoreFuture;
import org.apache.qpid.server.store.StoredMessage;
import org.apache.qpid.server.subscription.ClientDeliveryMethod;
import org.apache.qpid.server.subscription.RecordDeliveryMethod;
import org.apache.qpid.server.subscription.Subscription;
import org.apache.qpid.server.subscription.SubscriptionFactoryImpl;
+import org.apache.qpid.server.subscription.SubscriptionImpl;
import org.apache.qpid.server.txn.AsyncAutoCommitTransaction;
import org.apache.qpid.server.txn.LocalTransaction;
import org.apache.qpid.server.txn.ServerTransaction;
@@ -1556,7 +1558,7 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
}
}
- public void recordFuture(final MessageStore.StoreFuture future, final ServerTransaction.Action action)
+ public void recordFuture(final StoreFuture future, final ServerTransaction.Action action)
{
_unfinishedCommandsQueue.add(new AsyncCommand(future, action));
}
@@ -1590,10 +1592,10 @@ public class AMQChannel implements SessionConfig, AMQSessionModel, AsyncAutoComm
private static class AsyncCommand
{
- private final MessageStore.StoreFuture _future;
+ private final StoreFuture _future;
private ServerTransaction.Action _action;
- public AsyncCommand(final MessageStore.StoreFuture future, final ServerTransaction.Action action)
+ public AsyncCommand(final StoreFuture future, final ServerTransaction.Action action)
{
_future = future;
_action = action;
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/Broker.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/Broker.java
index 263b7fe40a..5004d320c2 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/Broker.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/Broker.java
@@ -53,10 +53,16 @@ import java.io.InputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.EnumSet;
+import java.util.Formatter;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.FileHandler;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
public class Broker
{
@@ -159,6 +165,12 @@ public class Broker
parsePortList(sslPorts, serverConfig.getSSLPorts());
}
+ Set<Integer> exclude_1_0 = new HashSet<Integer>(options.getExcludedPorts(ProtocolExclusion.v1_0));
+ if(exclude_1_0.isEmpty())
+ {
+ parsePortList(exclude_1_0, serverConfig.getPortExclude10());
+ }
+
Set<Integer> exclude_0_10 = new HashSet<Integer>(options.getExcludedPorts(ProtocolExclusion.v0_10));
if(exclude_0_10.isEmpty())
{
@@ -208,7 +220,8 @@ public class Broker
final InetSocketAddress inetSocketAddress = new InetSocketAddress(bindAddress, port);
final Set<AmqpProtocolVersion> supported =
- getSupportedVersions(port, exclude_0_10, exclude_0_9_1, exclude_0_9, exclude_0_8, serverConfig);
+ getSupportedVersions(port, exclude_1_0, exclude_0_10, exclude_0_9_1, exclude_0_9,
+ exclude_0_8, serverConfig);
final NetworkTransportConfiguration settings =
new ServerNetworkTransportConfiguration(serverConfig, inetSocketAddress, Transport.TCP);
@@ -237,7 +250,8 @@ public class Broker
final InetSocketAddress inetSocketAddress = new InetSocketAddress(bindAddress, sslPort);
final Set<AmqpProtocolVersion> supported =
- getSupportedVersions(sslPort, exclude_0_10, exclude_0_9_1, exclude_0_9, exclude_0_8, serverConfig);
+ getSupportedVersions(sslPort, exclude_1_0, exclude_0_10, exclude_0_9_1,
+ exclude_0_9, exclude_0_8, serverConfig);
final NetworkTransportConfiguration settings =
new ServerNetworkTransportConfiguration(serverConfig, inetSocketAddress, Transport.TCP);
@@ -262,13 +276,20 @@ public class Broker
}
}
- private static Set<AmqpProtocolVersion> getSupportedVersions(final int port, final Set<Integer> exclude_0_10,
- final Set<Integer> exclude_0_9_1, final Set<Integer> exclude_0_9,
- final Set<Integer> exclude_0_8,
- final ServerConfiguration serverConfig)
+ private static Set<AmqpProtocolVersion> getSupportedVersions(final int port,
+ final Set<Integer> exclude_1_0,
+ final Set<Integer> exclude_0_10,
+ final Set<Integer> exclude_0_9_1,
+ final Set<Integer> exclude_0_9,
+ final Set<Integer> exclude_0_8,
+ final ServerConfiguration serverConfig)
{
final EnumSet<AmqpProtocolVersion> supported = EnumSet.allOf(AmqpProtocolVersion.class);
+ if(exclude_1_0.contains(port) || !serverConfig.isAmqp10enabled())
+ {
+ supported.remove(AmqpProtocolVersion.v1_0_0);
+ }
if(exclude_0_10.contains(port) || !serverConfig.isAmqp010enabled())
{
supported.remove(AmqpProtocolVersion.v0_10);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java
index 1f96a24701..d871c724fd 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/BrokerOptions.java
@@ -47,7 +47,6 @@ public class BrokerOptions
private Integer _logWatchFrequency = 0;
-
public void addPort(final int port)
{
_ports.add(port);
@@ -107,7 +106,6 @@ public class BrokerOptions
{
_jmxPortConnectorServer = jmxPortConnectorServer;
}
-
public String getQpidHome()
{
return System.getProperty(QPID_HOME);
@@ -163,5 +161,4 @@ public class BrokerOptions
{
_bundleContext = bundleContext;
}
-
} \ No newline at end of file
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java
index 5fcd8a7b52..70fa414e3c 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/Main.java
@@ -59,6 +59,12 @@ public class Main
.withDescription("SSL port. Overrides any value in the config file")
.withLongOpt("sslport").create("s");
+
+ private static final Option OPTION_EXCLUDE_1_0 =
+ OptionBuilder.withArgName("port").hasArg()
+ .withDescription("when listening on the specified port do not accept AMQP1-0 connections. The specified port must be one specified on the command line")
+ .withLongOpt("exclude-1-0").create();
+
private static final Option OPTION_EXCLUDE_0_10 =
OptionBuilder.withArgName("port").hasArg()
.withDescription("when listening on the specified port do not accept AMQP0-10 connections. The specified port must be one specified on the command line")
@@ -116,6 +122,7 @@ public class Main
OPTIONS.addOption(OPTION_LOG_WATCH);
OPTIONS.addOption(OPTION_PORT);
OPTIONS.addOption(OPTION_SSLPORT);
+ OPTIONS.addOption(OPTION_EXCLUDE_1_0);
OPTIONS.addOption(OPTION_EXCLUDE_0_10);
OPTIONS.addOption(OPTION_EXCLUDE_0_9_1);
OPTIONS.addOption(OPTION_EXCLUDE_0_9);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/ProtocolExclusion.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/ProtocolExclusion.java
index 22d97d36dd..fe6e32173f 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/ProtocolExclusion.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/ProtocolExclusion.java
@@ -28,7 +28,8 @@ public enum ProtocolExclusion
v0_8("exclude-0-8","--exclude-0-8"),
v0_9("exclude-0-9", "--exclude-0-9"),
v0_9_1("exclude-0-9-1", "--exclude-0-9-1"),
- v0_10("exclude-0-10", "--exclude-0-10");
+ v0_10("exclude-0-10", "--exclude-0-10"),
+ v1_0("exclude-1-0", "--exclude-1-0");
private static final Map<String, ProtocolExclusion> MAP = new HashMap<String,ProtocolExclusion>();
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/binding/Binding.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/binding/Binding.java
index 8e44da095a..2efd4cee26 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/binding/Binding.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/binding/Binding.java
@@ -117,7 +117,7 @@ public class Binding
public String toString()
{
- return "Binding{bindingKey="+_bindingKey+", exchange="+_exchange+", queue="+_queue+"}";
+ return "Binding{bindingKey="+_bindingKey+", exchange="+_exchange+", queue="+_queue+", id= " + _id + " }";
}
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/binding/BindingFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/binding/BindingFactory.java
index fe66a6d341..abf252c733 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/binding/BindingFactory.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/binding/BindingFactory.java
@@ -24,7 +24,6 @@ import org.apache.qpid.AMQException;
import org.apache.qpid.AMQInternalException;
import org.apache.qpid.AMQSecurityException;
import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.server.configuration.BindingConfig;
import org.apache.qpid.server.configuration.BindingConfigType;
import org.apache.qpid.server.configuration.ConfigStore;
@@ -33,58 +32,35 @@ import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.logging.actors.CurrentActor;
import org.apache.qpid.server.logging.messages.BindingMessages;
import org.apache.qpid.server.logging.subjects.BindingLogSubject;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
-import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Collections;
import java.util.Map;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class BindingFactory
{
private final VirtualHost _virtualHost;
- private final DurableConfigurationStore.Source _configSource;
- private final Exchange _defaultExchange;
private final ConcurrentHashMap<BindingImpl, BindingImpl> _bindings = new ConcurrentHashMap<BindingImpl, BindingImpl>();
-
public BindingFactory(final VirtualHost vhost)
{
- this(vhost, vhost.getExchangeRegistry().getDefaultExchange());
+ _virtualHost = vhost;
}
- public BindingFactory(final DurableConfigurationStore.Source configSource, final Exchange defaultExchange)
- {
- _configSource = configSource;
- _defaultExchange = defaultExchange;
- if (configSource instanceof VirtualHost)
- {
- _virtualHost = (VirtualHost) configSource;
- }
- else
- {
- _virtualHost = null;
- }
- }
-
- public VirtualHost getVirtualHost()
- {
- return _virtualHost;
- }
-
-
-
private final class BindingImpl extends Binding implements AMQQueue.Task, Exchange.Task, BindingConfig
{
private final BindingLogSubject _logSubject;
//TODO : persist creation time
private long _createTime = System.currentTimeMillis();
- private BindingImpl(String bindingKey, final AMQQueue queue, final Exchange exchange, final Map<String, Object> arguments)
+ private BindingImpl(UUID id, String bindingKey, final AMQQueue queue, final Exchange exchange, final Map<String, Object> arguments)
{
- super(queue.getVirtualHost().getConfigStore().createId(), bindingKey, queue, exchange, arguments);
+ super(id, bindingKey, queue, exchange, arguments);
_logSubject = new BindingLogSubject(bindingKey,exchange,queue);
}
@@ -141,48 +117,59 @@ public class BindingFactory
public boolean addBinding(String bindingKey, AMQQueue queue, Exchange exchange, Map<String, Object> arguments) throws AMQSecurityException, AMQInternalException
{
- return makeBinding(bindingKey, queue, exchange, arguments, false, false);
+ return makeBinding(null, bindingKey, queue, exchange, arguments, false, false);
}
- public boolean replaceBinding(final String bindingKey,
+ public boolean replaceBinding(final UUID id, final String bindingKey,
final AMQQueue queue,
final Exchange exchange,
final Map<String, Object> arguments) throws AMQSecurityException, AMQInternalException
{
- return makeBinding(bindingKey, queue, exchange, arguments, false, true);
+ return makeBinding(id, bindingKey, queue, exchange, arguments, false, true);
}
- private boolean makeBinding(String bindingKey, AMQQueue queue, Exchange exchange, Map<String, Object> arguments, boolean restore, boolean force) throws AMQSecurityException, AMQInternalException
+ private boolean makeBinding(UUID id, String bindingKey, AMQQueue queue, Exchange exchange, Map<String, Object> arguments, boolean restore, boolean force) throws AMQSecurityException, AMQInternalException
{
assert queue != null;
+ final Exchange defaultExchange = _virtualHost.getExchangeRegistry().getDefaultExchange();
+
if (bindingKey == null)
{
bindingKey = "";
}
if (exchange == null)
{
- exchange = _defaultExchange;
+ exchange = defaultExchange;
}
if (arguments == null)
{
arguments = Collections.emptyMap();
}
+ if (exchange == null)
+ {
+ throw new IllegalArgumentException("exchange cannot be null");
+ }
+
// The default exchange bindings must reflect the existence of queues, allow
// all operations on it to succeed. It is up to the broker to prevent illegal
// attempts at binding to this exchange, not the ACLs.
- if(exchange != _defaultExchange)
+ if(exchange != defaultExchange)
{
//Perform ACLs
- if (!getVirtualHost().getSecurityManager().authoriseBind(exchange, queue, new AMQShortString(bindingKey)))
+ if (!_virtualHost.getSecurityManager().authoriseBind(exchange, queue, new AMQShortString(bindingKey)))
{
throw new AMQSecurityException("Permission denied: binding " + bindingKey);
}
}
-
- BindingImpl b = new BindingImpl(bindingKey,queue,exchange,arguments);
- BindingImpl existingMapping = _bindings.putIfAbsent(b,b);
+
+ if (id == null)
+ {
+ id = UUIDGenerator.generateUUID();
+ }
+ BindingImpl b = new BindingImpl(id, bindingKey, queue, exchange, arguments);
+ BindingImpl existingMapping = _bindings.putIfAbsent(b, b);
if (existingMapping == null || force)
{
if (existingMapping != null)
@@ -192,7 +179,7 @@ public class BindingFactory
if (b.isDurable() && !restore)
{
- _configSource.getDurableConfigurationStore().bindQueue(exchange,new AMQShortString(bindingKey),queue,FieldTable.convertToFieldTable(arguments));
+ _virtualHost.getMessageStore().bindQueue(b);
}
queue.addQueueDeleteTask(b);
@@ -212,12 +199,12 @@ public class BindingFactory
private ConfigStore getConfigStore()
{
- return getVirtualHost().getConfigStore();
+ return _virtualHost.getConfigStore();
}
- public void restoreBinding(final String bindingKey, final AMQQueue queue, final Exchange exchange, final Map<String, Object> argumentMap) throws AMQSecurityException, AMQInternalException
+ public void restoreBinding(final UUID id, final String bindingKey, final AMQQueue queue, final Exchange exchange, final Map<String, Object> argumentMap) throws AMQSecurityException, AMQInternalException
{
- makeBinding(bindingKey,queue,exchange,argumentMap,true, false);
+ makeBinding(id, bindingKey,queue,exchange,argumentMap,true, false);
}
public void removeBinding(final Binding b) throws AMQSecurityException, AMQInternalException
@@ -229,13 +216,15 @@ public class BindingFactory
public Binding removeBinding(String bindingKey, AMQQueue queue, Exchange exchange, Map<String, Object> arguments) throws AMQSecurityException, AMQInternalException
{
assert queue != null;
+ final Exchange defaultExchange = _virtualHost.getExchangeRegistry().getDefaultExchange();
+
if (bindingKey == null)
{
bindingKey = "";
}
if (exchange == null)
{
- exchange = _defaultExchange;
+ exchange = defaultExchange;
}
if (arguments == null)
{
@@ -245,16 +234,16 @@ public class BindingFactory
// The default exchange bindings must reflect the existence of queues, allow
// all operations on it to succeed. It is up to the broker to prevent illegal
// attempts at binding to this exchange, not the ACLs.
- if(exchange != _defaultExchange)
+ if(exchange != defaultExchange)
{
// Check access
- if (!getVirtualHost().getSecurityManager().authoriseUnbind(exchange, new AMQShortString(bindingKey), queue))
+ if (!_virtualHost.getSecurityManager().authoriseUnbind(exchange, new AMQShortString(bindingKey), queue))
{
throw new AMQSecurityException("Permission denied: unbinding " + bindingKey);
}
}
- BindingImpl b = _bindings.remove(new BindingImpl(bindingKey,queue,exchange,arguments));
+ BindingImpl b = _bindings.remove(new BindingImpl(null, bindingKey,queue,exchange,arguments));
if (b != null)
{
@@ -265,10 +254,7 @@ public class BindingFactory
if (b.isDurable())
{
- _configSource.getDurableConfigurationStore().unbindQueue(exchange,
- new AMQShortString(bindingKey),
- queue,
- FieldTable.convertToFieldTable(arguments));
+ _virtualHost.getMessageStore().unbindQueue(b);
}
b.logDestruction();
getConfigStore().removeConfiguredObject(b);
@@ -280,20 +266,22 @@ public class BindingFactory
public Binding getBinding(String bindingKey, AMQQueue queue, Exchange exchange, Map<String, Object> arguments)
{
assert queue != null;
+ final Exchange defaultExchange = _virtualHost.getExchangeRegistry().getDefaultExchange();
+
if(bindingKey == null)
{
bindingKey = "";
}
if(exchange == null)
{
- exchange = _defaultExchange;
+ exchange = defaultExchange;
}
if(arguments == null)
{
arguments = Collections.emptyMap();
}
- BindingImpl b = new BindingImpl(bindingKey,queue,exchange,arguments);
+ BindingImpl b = new BindingImpl(null, bindingKey,queue,exchange,arguments);
return _bindings.get(b);
}
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java
index 5d0546f6a7..46027d02c6 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/ServerConfiguration.java
@@ -88,6 +88,7 @@ public class ServerConfiguration extends ConfigurationPlugin
public static final String MGMT_JMXPORT_CONNECTORSERVER = "management.jmxport.connectorServer";
public static final String STATUS_UPDATES = "status-updates";
public static final String ADVANCED_LOCALE = "advanced.locale";
+ public static final String CONNECTOR_AMQP10ENABLED = "connector.amqp10enabled";
public static final String CONNECTOR_AMQP010ENABLED = "connector.amqp010enabled";
public static final String CONNECTOR_AMQP091ENABLED = "connector.amqp091enabled";
public static final String CONNECTOR_AMQP09ENABLED = "connector.amqp09enabled";
@@ -667,6 +668,11 @@ public class ServerConfiguration extends ConfigurationPlugin
return getListValue("connector.port", Collections.<Integer>singletonList(DEFAULT_PORT));
}
+ public List getPortExclude10()
+ {
+ return getListValue("connector.non10port");
+ }
+
public List getPortExclude010()
{
return getListValue("connector.non010port");
@@ -843,6 +849,11 @@ public class ServerConfiguration extends ConfigurationPlugin
return getConfig().getString("deadLetterQueueSuffix", AMQQueueFactory.DEFAULT_DLQ_NAME_SUFFIX);
}
+ public boolean isAmqp10enabled()
+ {
+ return getConfig().getBoolean(CONNECTOR_AMQP10ENABLED, true);
+ }
+
public boolean isAmqp010enabled()
{
return getConfig().getBoolean(CONNECTOR_AMQP010ENABLED, true);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java
index 558311fc46..5f472b6ddd 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/VirtualHostConfiguration.java
@@ -32,6 +32,7 @@ import org.apache.qpid.server.configuration.plugins.ConfigurationPlugin;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.MemoryMessageStore;
+import org.apache.qpid.server.store.MemoryMessageStoreFactory;
import java.util.ArrayList;
import java.util.Arrays;
@@ -102,14 +103,14 @@ public class VirtualHostConfiguration extends ConfigurationPlugin
return getConfig().subset("store");
}
- public String getMessageStoreClass()
+ public String getMessageStoreFactoryClass()
{
- return getStringValue("store.class", MemoryMessageStore.class.getName());
+ return getStringValue("store.factoryclass", MemoryMessageStoreFactory.class.getName());
}
- public void setMessageStoreClass(String storeClass)
+ public void setMessageStoreFactoryClass(String storeFactoryClass)
{
- getConfig().setProperty("store.class", storeClass);
+ getConfig().setProperty("store.factoryclass", storeFactoryClass);
}
public List getExchanges()
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/connection/ConnectionRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/connection/ConnectionRegistry.java
index 9159489299..4a58314f51 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/connection/ConnectionRegistry.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/connection/ConnectionRegistry.java
@@ -46,11 +46,19 @@ public class ConnectionRegistry implements IConnectionRegistry, Closeable
/** Close all of the currently open connections. */
public void close()
{
- _logger.debug("Closing connection registry :" + _registry.size() + " connections.");
+ close(IConnectionRegistry.BROKER_SHUTDOWN_REPLY_TEXT);
+ }
+
+ public void close(final String replyText)
+ {
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Closing connection registry :" + _registry.size() + " connections.");
+ }
while (!_registry.isEmpty())
{
AMQConnectionModel connection = _registry.get(0);
- closeConnection(connection, AMQConstant.CONNECTION_FORCED, "Broker is shutting down");
+ closeConnection(connection, AMQConstant.CONNECTION_FORCED, replyText);
}
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/connection/IConnectionRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/connection/IConnectionRegistry.java
index 89582e5748..954c448b72 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/connection/IConnectionRegistry.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/connection/IConnectionRegistry.java
@@ -28,12 +28,17 @@ import java.util.List;
public interface IConnectionRegistry
{
+ public static final String BROKER_SHUTDOWN_REPLY_TEXT = "Broker is shutting down";
+ public static final String VHOST_PASSIVATE_REPLY_TEXT = "Virtual host is being passivated";
+
public void initialise();
public void close() throws AMQException;
-
+
+ public void close(String replyText) throws AMQException;
+
public void closeConnection(AMQConnectionModel connection, AMQConstant cause, String message);
-
+
public List<AMQConnectionModel> getConnections();
public void registerConnection(AMQConnectionModel connnection);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
index cae07046fa..9493f400f2 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/AbstractExchange.java
@@ -20,8 +20,6 @@
*/
package org.apache.qpid.server.exchange;
-import org.apache.log4j.Logger;
-
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.binding.Binding;
@@ -116,7 +114,7 @@ public abstract class AbstractExchange implements Exchange, Managable
*/
protected abstract AbstractExchangeMBean createMBean() throws JMException;
- public void initialise(VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
+ public void initialise(UUID id, VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
throws AMQException
{
_virtualHost = host;
@@ -125,10 +123,18 @@ public abstract class AbstractExchange implements Exchange, Managable
_autoDelete = autoDelete;
_ticket = ticket;
- // TODO - fix
- _id = getConfigStore().createId();
+ _id = id;
getConfigStore().addConfiguredObject(this);
+ createAndRegisterMBean();
+ _logSubject = new ExchangeLogSubject(this, this.getVirtualHost());
+
+ // Log Exchange creation
+ CurrentActor.get().message(ExchangeMessages.CREATED(String.valueOf(getTypeShortString()), String.valueOf(name), durable));
+ }
+
+ private void createAndRegisterMBean()
+ {
try
{
_exchangeMbean = createMBean();
@@ -136,12 +142,8 @@ public abstract class AbstractExchange implements Exchange, Managable
}
catch (JMException e)
{
- getLogger().error(e);
+ throw new RuntimeException("Failed to register mbean",e);
}
- _logSubject = new ExchangeLogSubject(this, this.getVirtualHost());
-
- // Log Exchange creation
- CurrentActor.get().message(ExchangeMessages.CREATED(String.valueOf(getTypeShortString()), String.valueOf(name), durable));
}
public ConfigStore getConfigStore()
@@ -149,8 +151,6 @@ public abstract class AbstractExchange implements Exchange, Managable
return getVirtualHost().getConfigStore();
}
- public abstract Logger getLogger();
-
public boolean isDurable()
{
return _durable;
@@ -324,8 +324,7 @@ public abstract class AbstractExchange implements Exchange, Managable
public Map<String, Object> getArguments()
{
- // TODO - Fix
- return Collections.EMPTY_MAP;
+ return Collections.emptyMap();
}
public UUID getId()
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java
index 153419de1b..5058f91995 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeFactory.java
@@ -25,9 +25,11 @@ import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
import org.apache.qpid.AMQSecurityException;
import org.apache.qpid.AMQUnknownExchangeType;
+import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.qmf.ManagementExchange;
import org.apache.qpid.server.configuration.VirtualHostConfiguration;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
@@ -35,6 +37,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
+import java.util.UUID;
public class DefaultExchangeFactory implements ExchangeFactory
{
@@ -76,17 +79,29 @@ public class DefaultExchangeFactory implements ExchangeFactory
return publicTypes;
}
-
-
public Exchange createExchange(String exchange, String type, boolean durable, boolean autoDelete)
- throws AMQException
+ throws AMQException
{
return createExchange(new AMQShortString(exchange), new AMQShortString(type), durable, autoDelete, 0);
}
- public Exchange createExchange(AMQShortString exchange, AMQShortString type, boolean durable, boolean autoDelete,
- int ticket)
+ public Exchange createExchange(UUID id, String exchange, String type, boolean durable, boolean autoDelete)
+ throws AMQException
+ {
+ return createExchange(id, new AMQShortString(exchange), new AMQShortString(type), durable, autoDelete, 0);
+ }
+
+ public Exchange createExchange(AMQShortString exchange, AMQShortString type, boolean durable,
+ boolean autoDelete, int ticket)
+ throws AMQException
+ {
+ UUID id = UUIDGenerator.generateExchangeUUID(exchange.asString(), _host.getName());
+ return createExchange(id, exchange, type, durable, autoDelete, ticket);
+ }
+
+ public Exchange createExchange(UUID id, AMQShortString exchange, AMQShortString type, boolean durable,
+ boolean autoDelete, int ticket)
throws AMQException
{
// Check access
@@ -102,7 +117,7 @@ public class DefaultExchangeFactory implements ExchangeFactory
throw new AMQUnknownExchangeType("Unknown exchange type: " + type,null);
}
- Exchange e = exchType.newInstance(_host, exchange, durable, ticket, autoDelete);
+ Exchange e = exchType.newInstance(id, _host, exchange, durable, ticket, autoDelete);
return e;
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java
index a5fa9f014e..bf4184bf0b 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DefaultExchangeRegistry.java
@@ -21,7 +21,6 @@
package org.apache.qpid.server.exchange;
import org.apache.log4j.Logger;
-
import org.apache.qpid.AMQException;
import org.apache.qpid.AMQSecurityException;
import org.apache.qpid.exchange.ExchangeDefaults;
@@ -31,12 +30,13 @@ import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Collection;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class DefaultExchangeRegistry implements ExchangeRegistry
{
- private static final Logger _log = Logger.getLogger(DefaultExchangeRegistry.class);
+ private static final Logger LOGGER = Logger.getLogger(DefaultExchangeRegistry.class);
/**
* Maps from exchange name to exchange instance
@@ -59,11 +59,9 @@ public class DefaultExchangeRegistry implements ExchangeRegistry
new ExchangeInitialiser().initialise(_host.getExchangeFactory(), this, getDurableConfigurationStore());
}
-
-
public DurableConfigurationStore getDurableConfigurationStore()
{
- return _host.getDurableConfigurationStore();
+ return _host.getMessageStore();
}
public void registerExchange(Exchange exchange) throws AMQException
@@ -153,4 +151,49 @@ public class DefaultExchangeRegistry implements ExchangeRegistry
}
}
+ @Override
+ public void clearAndUnregisterMbeans()
+ {
+ for (final AMQShortString exchangeName : getExchangeNames())
+ {
+ final Exchange exchange = getExchange(exchangeName);
+
+ if (exchange instanceof AbstractExchange)
+ {
+ AbstractExchange abstractExchange = (AbstractExchange) exchange;
+ try
+ {
+ abstractExchange.getManagedObject().unregister();
+ }
+ catch (AMQException e)
+ {
+ LOGGER.warn("Failed to unregister mbean", e);
+ }
+ }
+ }
+ _exchangeMap.clear();
+ _exchangeMapStr.clear();
+ }
+
+ @Override
+ public synchronized Exchange getExchange(UUID exchangeId)
+ {
+ if (exchangeId == null)
+ {
+ return getDefaultExchange();
+ }
+ else
+ {
+ Collection<Exchange> exchanges = _exchangeMap.values();
+ for (Exchange exchange : exchanges)
+ {
+ if (exchange.getId().equals(exchangeId))
+ {
+ return exchange;
+ }
+ }
+ return null;
+ }
+ }
+
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java
index 8c0a5001db..af9322764a 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java
@@ -36,6 +36,7 @@ import javax.management.JMException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
@@ -103,14 +104,14 @@ public class DirectExchange extends AbstractExchange
return DirectExchange.class;
}
- public DirectExchange newInstance(VirtualHost host,
+ public DirectExchange newInstance(UUID id, VirtualHost host,
AMQShortString name,
boolean durable,
int ticket,
boolean autoDelete) throws AMQException
{
DirectExchange exch = new DirectExchange();
- exch.initialise(host,name,durable,ticket,autoDelete);
+ exch.initialise(id, host,name,durable,ticket,autoDelete);
return exch;
}
@@ -131,12 +132,6 @@ public class DirectExchange extends AbstractExchange
return new DirectExchangeMBean(this);
}
- public Logger getLogger()
- {
- return _logger;
- }
-
-
public List<? extends BaseQueue> doRoute(InboundMessage payload)
{
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/Exchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/Exchange.java
index 0bcfc3a3da..289cb1a923 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/Exchange.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/Exchange.java
@@ -36,6 +36,7 @@ import javax.management.JMException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
public interface Exchange extends ExchangeReferrer, ExchangeConfig
{
@@ -50,7 +51,7 @@ public interface Exchange extends ExchangeReferrer, ExchangeConfig
AMQShortString getTypeShortString();
- void initialise(VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
+ void initialise(UUID id, VirtualHost host, AMQShortString name, boolean durable, int ticket, boolean autoDelete)
throws AMQException, JMException;
boolean isDurable();
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java
index 577da79028..aae4ae89bb 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeFactory.java
@@ -25,6 +25,7 @@ import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.configuration.VirtualHostConfiguration;
import java.util.Collection;
+import java.util.UUID;
public interface ExchangeFactory
@@ -40,4 +41,10 @@ public interface ExchangeFactory
Collection<ExchangeType<? extends Exchange>> getPublicCreatableTypes();
Exchange createExchange(String exchange, String type, boolean durable, boolean autoDelete) throws AMQException;
+
+ Exchange createExchange(UUID id, String exchange, String type, boolean durable, boolean autoDelete) throws AMQException;
+
+ Exchange createExchange(UUID id, AMQShortString exchange, AMQShortString type, boolean durable,
+ boolean autoDelete, int ticket)
+ throws AMQException;
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeInitialiser.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeInitialiser.java
index 4dfcce7bbe..ba4f57a8e0 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeInitialiser.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeInitialiser.java
@@ -20,6 +20,7 @@
*/
package org.apache.qpid.server.exchange;
+
import org.apache.qpid.AMQException;
import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.framing.AMQShortString;
@@ -27,7 +28,8 @@ import org.apache.qpid.server.store.DurableConfigurationStore;
public class ExchangeInitialiser
{
- public void initialise(ExchangeFactory factory, ExchangeRegistry registry, DurableConfigurationStore store) throws AMQException{
+ public void initialise(ExchangeFactory factory, ExchangeRegistry registry, DurableConfigurationStore store) throws AMQException
+ {
for (ExchangeType<? extends Exchange> type : factory.getRegisteredTypes())
{
define (registry, factory, type.getDefaultExchangeName(), type.getName(), store);
@@ -44,7 +46,6 @@ public class ExchangeInitialiser
{
Exchange exchange = f.createExchange(name, type, true, false, 0);
r.registerExchange(exchange);
-
if(exchange.isDurable())
{
store.createExchange(exchange);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java
index 18eb37e037..795ae2e140 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeRegistry.java
@@ -24,6 +24,7 @@ import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import java.util.Collection;
+import java.util.UUID;
public interface ExchangeRegistry
@@ -51,5 +52,9 @@ public interface ExchangeRegistry
Exchange getExchange(String exchangeName);
- void unregisterExchange(String exchange, boolean ifUnused) throws ExchangeInUseException, AMQException;;
+ void unregisterExchange(String exchange, boolean ifUnused) throws ExchangeInUseException, AMQException;
+
+ void clearAndUnregisterMbeans();
+
+ Exchange getExchange(UUID exchangeId);
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeType.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeType.java
index ce339c4e29..a01e41f039 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeType.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/ExchangeType.java
@@ -20,6 +20,8 @@
*/
package org.apache.qpid.server.exchange;
+import java.util.UUID;
+
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.virtualhost.VirtualHost;
@@ -29,7 +31,7 @@ public interface ExchangeType<T extends Exchange>
{
public AMQShortString getName();
public Class<T> getExchangeClass();
- public T newInstance(VirtualHost host, AMQShortString name,
+ public T newInstance(UUID id, VirtualHost host, AMQShortString name,
boolean durable, int ticket, boolean autoDelete) throws AMQException;
public AMQShortString getDefaultExchangeName();
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java
index 76f86ea1b4..5ebcfd095f 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java
@@ -34,6 +34,7 @@ import org.apache.qpid.server.virtualhost.VirtualHost;
import javax.management.JMException;
import java.util.ArrayList;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class FanoutExchange extends AbstractExchange
@@ -52,11 +53,6 @@ public class FanoutExchange extends AbstractExchange
return new FanoutExchangeMBean(this);
}
- public Logger getLogger()
- {
- return _logger;
- }
-
public static final ExchangeType<FanoutExchange> TYPE = new ExchangeType<FanoutExchange>()
{
@@ -70,14 +66,14 @@ public class FanoutExchange extends AbstractExchange
return FanoutExchange.class;
}
- public FanoutExchange newInstance(VirtualHost host,
+ public FanoutExchange newInstance(UUID id, VirtualHost host,
AMQShortString name,
boolean durable,
int ticket,
boolean autoDelete) throws AMQException
{
FanoutExchange exch = new FanoutExchange();
- exch.initialise(host, name, durable, ticket, autoDelete);
+ exch.initialise(id, host, name, durable, ticket, autoDelete);
return exch;
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java
index 295a7191e7..16ba3c0431 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/HeadersExchange.java
@@ -37,6 +37,7 @@ import javax.management.JMException;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
@@ -93,12 +94,12 @@ public class HeadersExchange extends AbstractExchange
return HeadersExchange.class;
}
- public HeadersExchange newInstance(VirtualHost host, AMQShortString name, boolean durable, int ticket,
+ public HeadersExchange newInstance(UUID id, VirtualHost host, AMQShortString name, boolean durable, int ticket,
boolean autoDelete) throws AMQException
{
HeadersExchange exch = new HeadersExchange();
- exch.initialise(host, name, durable, ticket, autoDelete);
+ exch.initialise(id, host, name, durable, ticket, autoDelete);
return exch;
}
@@ -231,11 +232,6 @@ public class HeadersExchange extends AbstractExchange
return new HeadersExchangeMBean(this);
}
- public Logger getLogger()
- {
- return _logger;
- }
-
protected void onBind(final Binding binding)
{
String bindingKey = binding.getBindingKey();
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java
index 27166e4384..7ea7a41826 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java
@@ -27,6 +27,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
+import java.util.UUID;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import javax.management.JMException;
@@ -70,14 +71,14 @@ public class TopicExchange extends AbstractExchange
return TopicExchange.class;
}
- public TopicExchange newInstance(VirtualHost host,
+ public TopicExchange newInstance(UUID id, VirtualHost host,
AMQShortString name,
boolean durable,
int ticket,
boolean autoDelete) throws AMQException
{
TopicExchange exch = new TopicExchange();
- exch.initialise(host, name, durable, ticket, autoDelete);
+ exch.initialise(id, host, name, durable, ticket, autoDelete);
return exch;
}
@@ -407,11 +408,6 @@ public class TopicExchange extends AbstractExchange
return new TopicExchangeMBean(this);
}
- public Logger getLogger()
- {
- return _logger;
- }
-
private Collection<AMQQueue> getMatchedQueues(InboundMessage message, AMQShortString routingKey)
{
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/federation/Bridge.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/federation/Bridge.java
index b58802e1ff..c7046f8e53 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/federation/Bridge.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/federation/Bridge.java
@@ -132,7 +132,7 @@ public class Bridge implements BridgeConfig
{
try
{
- brokerLink.getVirtualHost().getDurableConfigurationStore().createBridge(this);
+ brokerLink.getVirtualHost().getMessageStore().createBridge(this);
}
catch (AMQStoreException e)
{
@@ -220,7 +220,7 @@ public class Bridge implements BridgeConfig
{
try
{
- brokerLink.getVirtualHost().getDurableConfigurationStore().createBridge(this);
+ brokerLink.getVirtualHost().getMessageStore().createBridge(this);
}
catch (AMQStoreException e)
{
@@ -767,13 +767,13 @@ public class Bridge implements BridgeConfig
try
{
- _queue = AMQQueueFactory.createAMQQueueImpl(_tmpQueueName,
+ _queue = AMQQueueFactory.createAMQQueueImpl(null,
+ _tmpQueueName,
isDurable(),
_link.getFederationTag(),
false,
false,
- getVirtualHost(),
- options);
+ getVirtualHost(), options);
}
catch (AMQException e)
{
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java
index 032df8bb0d..4bcc0d6136 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/federation/BrokerLink.java
@@ -250,7 +250,7 @@ public class BrokerLink implements LinkConfig, ConnectionListener
{
try
{
- _virtualHost.getDurableConfigurationStore().createBrokerLink(this);
+ _virtualHost.getMessageStore().createBrokerLink(this);
}
catch (AMQStoreException e)
{
@@ -295,7 +295,7 @@ public class BrokerLink implements LinkConfig, ConnectionListener
{
try
{
- _virtualHost.getDurableConfigurationStore().createBrokerLink(this);
+ _virtualHost.getMessageStore().createBrokerLink(this);
}
catch (AMQStoreException e)
{
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java
index 18a0e4c8bf..6c158de8b5 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/filter/SimpleFilterManager.java
@@ -39,6 +39,12 @@ public class SimpleFilterManager implements FilterManager
_filters = new ConcurrentLinkedQueue<MessageFilter>();
}
+ public SimpleFilterManager(JMSSelectorFilter messageFilter)
+ {
+ this();
+ add(messageFilter);
+ }
+
public void add(MessageFilter filter)
{
_filters.add(filter);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java
index 79fcfb6d76..eab28ac9d4 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ConnectionOpenMethodHandler.java
@@ -32,6 +32,7 @@ import org.apache.qpid.server.protocol.AMQProtocolSession;
import org.apache.qpid.server.state.AMQState;
import org.apache.qpid.server.state.AMQStateManager;
import org.apache.qpid.server.state.StateAwareMethodListener;
+import org.apache.qpid.server.virtualhost.State;
import org.apache.qpid.server.virtualhost.VirtualHost;
public class ConnectionOpenMethodHandler implements StateAwareMethodListener<ConnectionOpenBody>
@@ -82,6 +83,10 @@ public class ConnectionOpenMethodHandler implements StateAwareMethodListener<Con
{
throw body.getConnectionException(AMQConstant.ACCESS_REFUSED, "Permission denied: '" + virtualHost.getName() + "'");
}
+ else if (virtualHost.getState() != State.ACTIVE)
+ {
+ throw body.getConnectionException(AMQConstant.CONNECTION_FORCED, "Virtual host '" + virtualHost.getName() + "' is not active");
+ }
session.setVirtualHost(virtualHost);
@@ -89,10 +94,10 @@ public class ConnectionOpenMethodHandler implements StateAwareMethodListener<Con
if (session.getContextKey() == null)
{
session.setContextKey(generateClientID());
- }
+ }
MethodRegistry methodRegistry = session.getMethodRegistry();
- AMQMethodBody responseBody = methodRegistry.createConnectionOpenOkBody(body.getVirtualHost());
+ AMQMethodBody responseBody = methodRegistry.createConnectionOpenOkBody(body.getVirtualHost());
stateManager.changeState(AMQState.CONNECTION_OPEN);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java
index 6d55f31ebc..8756409f64 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/ExchangeDeclareHandler.java
@@ -106,7 +106,7 @@ public class ExchangeDeclareHandler implements StateAwareMethodListener<Exchange
if (exchange.isDurable())
{
- virtualHost.getDurableConfigurationStore().createExchange(exchange);
+ virtualHost.getMessageStore().createExchange(exchange);
}
}
catch(AMQUnknownExchangeType e)
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java
index bb979d5441..49ca934966 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueBindHandler.java
@@ -134,7 +134,7 @@ public class QueueBindHandler implements StateAwareMethodListener<QueueBindBody>
Map<String, Object> oldArgs = oldBinding.getArguments();
if((oldArgs == null && !arguments.isEmpty()) || (oldArgs != null && !oldArgs.equals(arguments)))
{
- virtualHost.getBindingFactory().replaceBinding(bindingKey, queue, exch, arguments);
+ virtualHost.getBindingFactory().replaceBinding(oldBinding.getId(), bindingKey, queue, exch, arguments);
}
}
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java
index f57f7eb9e6..396829df91 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java
@@ -24,6 +24,7 @@ import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.framing.MethodRegistry;
import org.apache.qpid.framing.QueueDeclareBody;
import org.apache.qpid.framing.QueueDeclareOkBody;
@@ -31,6 +32,7 @@ import org.apache.qpid.protocol.AMQConstant;
import org.apache.qpid.server.AMQChannel;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.exchange.ExchangeRegistry;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.protocol.AMQProtocolSession;
import org.apache.qpid.server.protocol.AMQSessionModel;
import org.apache.qpid.server.queue.AMQQueue;
@@ -43,6 +45,7 @@ import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Collections;
+import java.util.Map;
import java.util.UUID;
public class QueueDeclareHandler implements StateAwareMethodListener<QueueDeclareBody>
@@ -65,7 +68,7 @@ public class QueueDeclareHandler implements StateAwareMethodListener<QueueDeclar
VirtualHost virtualHost = protocolConnection.getVirtualHost();
ExchangeRegistry exchangeRegistry = virtualHost.getExchangeRegistry();
QueueRegistry queueRegistry = virtualHost.getQueueRegistry();
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
+ DurableConfigurationStore store = virtualHost.getMessageStore();
final AMQShortString queueName;
@@ -219,10 +222,11 @@ public class QueueDeclareHandler implements StateAwareMethodListener<QueueDeclar
throws AMQException
{
final QueueRegistry registry = virtualHost.getQueueRegistry();
- AMQShortString owner = body.getExclusive() ? session.getContextKey() : null;
+ String owner = body.getExclusive() ? AMQShortString.toString(session.getContextKey()) : null;
- final AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(queueName, body.getDurable(), owner, body.getAutoDelete(),
- body.getExclusive(),virtualHost, body.getArguments());
+ Map<String, Object> arguments = FieldTable.convertToMap(body.getArguments());
+ final AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(UUIDGenerator.generateUUID(), AMQShortString.toString(queueName), body.getDurable(), owner, body.getAutoDelete(),
+ body.getExclusive(),virtualHost, arguments);
if (body.getExclusive() && !body.getDurable())
{
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java
index cc37259d54..762f090b83 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeleteHandler.java
@@ -62,7 +62,7 @@ public class QueueDeleteHandler implements StateAwareMethodListener<QueueDeleteB
AMQProtocolSession protocolConnection = stateManager.getProtocolSession();
VirtualHost virtualHost = protocolConnection.getVirtualHost();
QueueRegistry queueRegistry = virtualHost.getQueueRegistry();
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
+ DurableConfigurationStore store = virtualHost.getMessageStore();
AMQChannel channel = protocolConnection.getChannel(channelId);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/ConfigStore_logmessages.properties b/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/ConfigStore_logmessages.properties
index 3bc5074777..541f8b8c68 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/ConfigStore_logmessages.properties
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/ConfigStore_logmessages.properties
@@ -18,8 +18,7 @@
#
# Default File used for all non-defined locales.
-# 0 - name
-CREATED = CFG-1001 : Created : {0}
+CREATED = CFG-1001 : Created
# 0 - path
STORE_LOCATION = CFG-1002 : Store location : {0}
CLOSE = CFG-1003 : Closed
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/MessageStore_logmessages.properties b/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/MessageStore_logmessages.properties
index a2cedeb22a..081f2bbca3 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/MessageStore_logmessages.properties
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/MessageStore_logmessages.properties
@@ -18,11 +18,11 @@
#
# Default File used for all non-defined locales.
#
-# 0 - name
-CREATED = MST-1001 : Created : {0}
+CREATED = MST-1001 : Created
# 0 - path
STORE_LOCATION = MST-1002 : Store location : {0}
CLOSED = MST-1003 : Closed
RECOVERY_START = MST-1004 : Recovery Start
RECOVERED = MST-1005 : Recovered {0,number} messages
-RECOVERY_COMPLETE = MST-1006 : Recovery Complete \ No newline at end of file
+RECOVERY_COMPLETE = MST-1006 : Recovery Complete
+PASSIVATE = MST-1007 : Store Passivated
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/TransactionLog_logmessages.properties b/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/TransactionLog_logmessages.properties
index 9ef58df940..b9e87159a6 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/TransactionLog_logmessages.properties
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/messages/TransactionLog_logmessages.properties
@@ -19,8 +19,7 @@
# Default File used for all non-defined locales.
#
#
-# 0 - name
-CREATED = TXN-1001 : Created : {0}
+CREATED = TXN-1001 : Created
# 0 - path
STORE_LOCATION = TXN-1002 : Store location : {0}
CLOSED = TXN-1003 : Closed
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/BindingLogSubject.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/BindingLogSubject.java
index 8f0b9182a9..6f18cbcc6b 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/BindingLogSubject.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/BindingLogSubject.java
@@ -40,7 +40,8 @@ public class BindingLogSubject extends AbstractLogSubject
public BindingLogSubject(String routingKey, Exchange exchange,
AMQQueue queue)
{
- setLogStringWithFormat(BINDING_FORMAT, queue.getVirtualHost().getName(),
+ setLogStringWithFormat(BINDING_FORMAT,
+ queue.getVirtualHost().getName(),
exchange.getTypeShortString(),
exchange.getNameShortString(),
queue.getNameShortString(),
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubject.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubject.java
index 969288be00..08963bd8f1 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubject.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubject.java
@@ -20,7 +20,6 @@
*/
package org.apache.qpid.server.logging.subjects;
-import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
import static org.apache.qpid.server.logging.subjects.LogSubjectFormat.STORE_FORMAT;
@@ -28,10 +27,9 @@ import static org.apache.qpid.server.logging.subjects.LogSubjectFormat.STORE_FOR
public class MessageStoreLogSubject extends AbstractLogSubject
{
- /** Create an ExchangeLogSubject that Logs in the following format. */
- public MessageStoreLogSubject(VirtualHost vhost, MessageStore store)
+ /** Create an MessageStoreLogSubject that Logs in the following format. */
+ public MessageStoreLogSubject(VirtualHost vhost, String messageStoreName)
{
- setLogStringWithFormat(STORE_FORMAT, vhost.getName(),
- store.getClass().getSimpleName());
+ setLogStringWithFormat(STORE_FORMAT, vhost.getName(), messageStoreName);
}
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AbstractAMQManagedConnectionObject.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AbstractAMQManagedConnectionObject.java
index e7c07b6dd4..6cfc827046 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AbstractAMQManagedConnectionObject.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AbstractAMQManagedConnectionObject.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.server.management;
import org.apache.qpid.management.common.mbeans.ManagedConnection;
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java
new file mode 100755
index 0000000000..7d030fe711
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java
@@ -0,0 +1,522 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.qpid.server.message;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoder;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpSequence;
+import org.apache.qpid.amqp_1_0.type.messaging.AmqpValue;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Data;
+import org.apache.qpid.amqp_1_0.type.messaging.DeliveryAnnotations;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+import org.apache.qpid.server.store.MessageMetaDataType;
+import org.apache.qpid.server.store.StorableMessageMetaData;
+
+public class MessageMetaData_1_0 implements StorableMessageMetaData
+{
+ // TODO move to somewhere more useful
+ public static final Symbol JMS_TYPE = Symbol.valueOf("x-opt-jms-type");
+
+
+ private Header _header;
+ private Properties _properties;
+ private Map _deliveryAnnotations;
+ private Map _messageAnnotations;
+ private Map _appProperties;
+ private Map _footer;
+
+ private List<ByteBuffer> _encodedSections = new ArrayList<ByteBuffer>(3);
+
+ private volatile ByteBuffer _encoded;
+ private MessageHeader_1_0 _messageHeader;
+
+
+
+ public MessageMetaData_1_0(ByteBuffer[] fragments, SectionDecoder decoder)
+ {
+ this(fragments, decoder, new ArrayList<ByteBuffer>(3));
+ }
+
+ public MessageMetaData_1_0(ByteBuffer[] fragments, SectionDecoder decoder, List<ByteBuffer> immuatableSections)
+ {
+ this(constructSections(fragments, decoder,immuatableSections), immuatableSections);
+ }
+
+ private MessageMetaData_1_0(List<Section> sections, List<ByteBuffer> encodedSections)
+ {
+ _encodedSections = encodedSections;
+
+ Iterator<Section> sectIter = sections.iterator();
+
+ Section section = sectIter.hasNext() ? sectIter.next() : null;
+ if(section instanceof Header)
+ {
+ _header = (Header) section;
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ if(section instanceof DeliveryAnnotations)
+ {
+ _deliveryAnnotations = ((DeliveryAnnotations) section).getValue();
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ if(section instanceof MessageAnnotations)
+ {
+ _messageAnnotations = ((MessageAnnotations) section).getValue();
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ if(section instanceof Properties)
+ {
+ _properties = (Properties) section;
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ if(section instanceof ApplicationProperties)
+ {
+ _appProperties = ((ApplicationProperties) section).getValue();
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ if(section instanceof Footer)
+ {
+ _footer = ((Footer) section).getValue();
+ section = sectIter.hasNext() ? sectIter.next() : null;
+ }
+
+ _messageHeader = new MessageHeader_1_0();
+
+ }
+
+ private static List<Section> constructSections(final ByteBuffer[] fragments, final SectionDecoder decoder, List<ByteBuffer> encodedSections)
+ {
+ List<Section> sections = new ArrayList<Section>(3);
+
+ ByteBuffer src;
+ if(fragments.length == 1)
+ {
+ src = fragments[0].duplicate();
+ }
+ else
+ {
+ int size = 0;
+ for(ByteBuffer buf : fragments)
+ {
+ size += buf.remaining();
+ }
+ src = ByteBuffer.allocate(size);
+ for(ByteBuffer buf : fragments)
+ {
+ src.put(buf.duplicate());
+ }
+ src.flip();
+
+ }
+
+ try
+ {
+ int startBarePos = -1;
+ int lastPos = src.position();
+ Section s = decoder.readSection(src);
+
+
+
+ if(s instanceof Header)
+ {
+ sections.add(s);
+ lastPos = src.position();
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+
+ if(s instanceof DeliveryAnnotations)
+ {
+ sections.add(s);
+ lastPos = src.position();
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+
+ if(s instanceof MessageAnnotations)
+ {
+ sections.add(s);
+ lastPos = src.position();
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+
+ if(s instanceof Properties)
+ {
+ sections.add(s);
+ if(startBarePos == -1)
+ {
+ startBarePos = lastPos;
+ }
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+
+ if(s instanceof ApplicationProperties)
+ {
+ sections.add(s);
+ if(startBarePos == -1)
+ {
+ startBarePos = lastPos;
+ }
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+
+ if(s instanceof AmqpValue)
+ {
+ if(startBarePos == -1)
+ {
+ startBarePos = lastPos;
+ }
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+ else if(s instanceof Data)
+ {
+ if(startBarePos == -1)
+ {
+ startBarePos = lastPos;
+ }
+ do
+ {
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ } while(s instanceof Data);
+ }
+ else if(s instanceof AmqpSequence)
+ {
+ if(startBarePos == -1)
+ {
+ startBarePos = lastPos;
+ }
+ do
+ {
+ s = src.hasRemaining() ? decoder.readSection(src) : null;
+ }
+ while(s instanceof AmqpSequence);
+ }
+
+ if(s instanceof Footer)
+ {
+ sections.add(s);
+ }
+
+
+ int pos = 0;
+ for(ByteBuffer buf : fragments)
+ {
+/*
+ if(pos < startBarePos)
+ {
+ if(pos + buf.remaining() > startBarePos)
+ {
+ ByteBuffer dup = buf.duplicate();
+ dup.position(dup.position()+startBarePos-pos);
+ dup.slice();
+ encodedSections.add(dup);
+ }
+ }
+ else
+*/
+ {
+ encodedSections.add(buf.duplicate());
+ }
+ pos += buf.remaining();
+ }
+
+ return sections;
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+
+ public MessageMetaDataType getType()
+ {
+ return MessageMetaDataType.META_DATA_1_0;
+ }
+
+
+ public int getStorableSize()
+ {
+ int size = 0;
+
+ for(ByteBuffer bin : _encodedSections)
+ {
+ size += bin.limit();
+ }
+
+ return size;
+ }
+
+ private ByteBuffer encodeAsBuffer()
+ {
+ ByteBuffer buf = ByteBuffer.allocate(getStorableSize());
+
+ for(ByteBuffer bin : _encodedSections)
+ {
+ buf.put(bin.duplicate());
+ }
+
+ return buf;
+ }
+
+ public int writeToBuffer(int offsetInMetaData, ByteBuffer dest)
+ {
+ ByteBuffer buf = _encoded;
+
+ if(buf == null)
+ {
+ buf = encodeAsBuffer();
+ _encoded = buf;
+ }
+
+ buf = buf.duplicate();
+
+ buf.position(offsetInMetaData);
+
+ if(dest.remaining() < buf.limit())
+ {
+ buf.limit(dest.remaining());
+ }
+ dest.put(buf);
+ return buf.limit();
+ }
+
+ public int getContentSize()
+ {
+ ByteBuffer buf = _encoded;
+
+ if(buf == null)
+ {
+ buf = encodeAsBuffer();
+ _encoded = buf;
+ }
+ return buf.remaining();
+ }
+
+ public boolean isPersistent()
+ {
+ return _header != null && Boolean.TRUE.equals(_header.getDurable());
+ }
+
+ public MessageHeader_1_0 getMessageHeader()
+ {
+ return _messageHeader;
+ }
+
+ public static final MessageMetaDataType.Factory<MessageMetaData_1_0> FACTORY = new MetaDataFactory();
+
+
+ private static class MetaDataFactory implements MessageMetaDataType.Factory<MessageMetaData_1_0>
+ {
+ private final AMQPDescribedTypeRegistry _typeRegistry = AMQPDescribedTypeRegistry.newInstance();
+
+ public MessageMetaData_1_0 createMetaData(ByteBuffer buf)
+ {
+ ValueHandler valueHandler = new ValueHandler(_typeRegistry);
+
+ ArrayList<Section> sections = new ArrayList<Section>(3);
+ ArrayList<ByteBuffer> encodedSections = new ArrayList<ByteBuffer>(3);
+
+ while(buf.hasRemaining())
+ {
+ try
+ {
+ ByteBuffer encodedBuf = buf.duplicate();
+ sections.add((Section) valueHandler.parse(buf));
+ encodedBuf.limit(buf.position());
+ encodedSections.add(encodedBuf);
+
+ }
+ catch (AmqpErrorException e)
+ {
+ //TODO
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ return new MessageMetaData_1_0(sections,encodedSections);
+
+ }
+ }
+
+ public class MessageHeader_1_0 implements AMQMessageHeader
+ {
+
+ public String getCorrelationId()
+ {
+ if(_properties == null || _properties.getCorrelationId() == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _properties.getMessageId().toString();
+ }
+ }
+
+ public long getExpiration()
+ {
+ return 0; //TODO
+ }
+
+ public String getMessageId()
+ {
+ if(_properties == null || _properties.getCorrelationId() == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _properties.getCorrelationId().toString();
+ }
+ }
+
+ public String getMimeType()
+ {
+
+ if(_properties == null || _properties.getContentType() == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _properties.getContentType().toString();
+ }
+ }
+
+ public String getEncoding()
+ {
+ return null; //TODO
+ }
+
+ public byte getPriority()
+ {
+ if(_header == null || _header.getPriority() == null)
+ {
+ return 4; //javax.jms.Message.DEFAULT_PRIORITY;
+ }
+ else
+ {
+ return _header.getPriority().byteValue();
+ }
+ }
+
+ public long getTimestamp()
+ {
+ if(_properties == null || _properties.getCreationTime() == null)
+ {
+ return 0L;
+ }
+ else
+ {
+ return _properties.getCreationTime().getTime();
+ }
+
+ }
+
+ public String getType()
+ {
+
+ if(_messageAnnotations == null || _messageAnnotations.get(JMS_TYPE) == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _messageAnnotations.get(JMS_TYPE).toString();
+ }
+ }
+
+ public String getReplyTo()
+ {
+ if(_properties == null || _properties.getReplyTo() == null)
+ {
+ return null;
+ }
+ else
+ {
+ return _properties.getReplyTo().toString();
+ }
+ }
+
+ public String getReplyToExchange()
+ {
+ return null; //TODO
+ }
+
+ public String getReplyToRoutingKey()
+ {
+ return null; //TODO
+ }
+
+ public Object getHeader(final String name)
+ {
+ return _appProperties == null ? null : _appProperties.get(name);
+ }
+
+ public boolean containsHeaders(final Set<String> names)
+ {
+ if(_appProperties == null)
+ {
+ return false;
+ }
+
+ for(String key : names)
+ {
+ if(!_appProperties.containsKey(key))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean containsHeader(final String name)
+ {
+ return _appProperties != null && _appProperties.containsKey(name);
+ }
+
+ public String getSubject()
+ {
+ return _properties == null ? null : _properties.getSubject();
+ }
+ }
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Binding.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Binding.java
new file mode 100644
index 0000000000..fdb009386c
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Binding.java
@@ -0,0 +1,75 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+public interface Binding extends ConfiguredObject
+{
+
+ public String MATCHED_BYTES = "matchedBytes";
+ public String MATCHED_MESSAGES = "matchedMessages";
+ public String STATE_CHANGED = "stateChanged";
+
+ public static final Collection<String> AVAILABLE_STATISTICS =
+ Collections.unmodifiableCollection(
+ Arrays.asList(
+ MATCHED_BYTES,
+ MATCHED_MESSAGES,
+ STATE_CHANGED));
+
+
+ public String ARGUMENTS = "arguments";
+ public String CREATED = "created";
+ public String DURABLE = "durable";
+ public String ID = "id";
+ public String LIFETIME_POLICY = "lifetimePolicy";
+ public String NAME = "name";
+ public String STATE = "state";
+ public String TIME_TO_LIVE = "timeToLive";
+ public String UPDATED = "updated";
+ public String QUEUE = "queue";
+ public String EXCHANGE = "exchange";
+
+ public static final Collection<String> AVAILABLE_ATTRIBUTES =
+ Collections.unmodifiableCollection(
+ Arrays.asList(ID,
+ NAME,
+ STATE,
+ DURABLE,
+ LIFETIME_POLICY,
+ TIME_TO_LIVE,
+ CREATED,
+ UPDATED,
+ EXCHANGE,
+ QUEUE,
+ ARGUMENTS)
+ );
+
+
+
+ Map<String,Object> getArguments();
+
+ void delete();
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java
new file mode 100644
index 0000000000..6477633a9b
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/ConfigurationChangeListener.java
@@ -0,0 +1,38 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+public interface ConfigurationChangeListener
+{
+ /**
+ * Inform the listener that the passed object has changed state
+ *
+ * @param object the object whose state has changed
+ * @param oldState the state prior to the change
+ * @param newState the state after the change
+ */
+ void stateChanged(ConfiguredObject object, State oldState, State newState);
+
+ void childAdded(ConfiguredObject object, ConfiguredObject child);
+
+ void childRemoved(ConfiguredObject object, ConfiguredObject child);
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
new file mode 100644
index 0000000000..fb47a54d0a
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/ConfiguredObject.java
@@ -0,0 +1,229 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.security.AccessControlException;
+import java.util.Collection;
+import java.util.UUID;
+
+public interface ConfiguredObject
+{
+
+ /**
+ * Get the universally unique identifier for the object
+ *
+ * @return the objects id
+ */
+ UUID getId();
+
+ /**
+ * Get the name of the object
+ *
+ * @return the name of the object
+ */
+ String getName();
+
+
+ /**
+ * Attempt to change the name of the object
+ *
+ * Request a change to the name of the object. The caller must pass in the name it believes the object currently
+ * has. If the current name differes from this expected value, then no name change will occur
+ *
+ * @param currentName the name the caller believes the object to have
+ * @param desiredName the name the caller would like the object to have
+ * @return the new name for the object
+ * @throws IllegalStateException if the name of the object may not be changed in in the current state
+ * @throws AccessControlException if the current context does not have permission to change the name
+ * @throws IllegalArgumentException if the provided name is not legal
+ * @throws NullPointerException if the desired name is null
+ */
+ String setName(String currentName, String desiredName) throws IllegalStateException,
+ AccessControlException;
+
+
+ /**
+ * Get the desired state of the object.
+ *
+ * This is the state set at the object itself, however the object
+ * may not be able attain this state if one of its ancestors is in a different state (in particular a descendant
+ * object may not be ACTIVE if all of its ancestors are not also ACTIVE).
+ *
+ * @return the desired state of the object
+ */
+ State getDesiredState();
+
+ /**
+ * Change the desired state of the object
+ *
+ * Request a change to the current state. The caller must pass in the state it believe the object to be in, if
+ * this differs from the current desired state when the object evalues the request, then no state change will occur.
+ *
+ * @param currentState the state the caller believes the object to be in
+ * @param desiredState the state the caller wishes the object to attain
+ * @return the new current state
+ * @throws IllegalStateTransitionException the requested state tranisition is invalid
+ * @throws AccessControlException the current context does not have sufficeint permissions to change the state
+ */
+ State setDesiredState(State currentState, State desiredState) throws IllegalStateTransitionException,
+ AccessControlException;
+
+ /**
+ * Get the actual state of the object.
+ *
+ * This state is derived fromt the desired state of the object itself and
+ * the actual state of its parents. If an object "desires" to be ACTIVE, but one of its parents is STOPPED, then
+ * the actual state of the object will be STOPPED
+ *
+ * @return the actual state of the object
+ */
+ State getActualState();
+
+
+ /**
+ * Add a listener which will be informed of all changes to this configuration object
+ *
+ * @param listener the listener to add
+ */
+ void addChangeListener(ConfigurationChangeListener listener);
+
+ /**
+ * Remove a change listener
+ *
+ *
+ * @param listener the listener to remove
+ * @return true iff a listener was removed
+ */
+ boolean removeChangeListener(ConfigurationChangeListener listener);
+
+ /**
+ * Get the parent of the given type for this object
+ *
+ * @param clazz the class of parent being asked for
+ * @return the objects parent
+ */
+ <T extends ConfiguredObject> T getParent(Class<T> clazz);
+
+
+ /**
+ * Returns whether the the object configuration is durably stored
+ *
+ * @return the durablity
+ */
+ boolean isDurable();
+
+ /**
+ * Sets the durability of the object
+ *
+ * @param durable true iff the caller wishes the object to store its configuration durably
+ *
+ * @throws IllegalStateException if the durability cannot be changed in the current state
+ * @throws AccessControlException if the current context does not have sufficient permission to change the durability
+ * @throws IllegalArgumentException if the object does not support the requested durability
+ */
+ void setDurable(boolean durable) throws IllegalStateException,
+ AccessControlException,
+ IllegalArgumentException;
+
+ /**
+ * Return the lifetime policy for the object
+ *
+ * @return the lifetime policy
+ */
+ LifetimePolicy getLifetimePolicy();
+
+ /**
+ * Set the lifetime policy of the object
+ *
+ * @param expected The lifetime policy the caller believes the object currently has
+ * @param desired The lifetime policy the caller desires the object to have
+ * @return the new lifetime policy
+ * @throws IllegalStateException if the lifetime policy cannot be changed in the current state
+ * @throws AccessControlException if the caller does not have permission to change the lifetime policy
+ * @throws IllegalArgumentException if the object does not support the requested lifetime policy
+ */
+ LifetimePolicy setLifetimePolicy(LifetimePolicy expected, LifetimePolicy desired) throws IllegalStateException,
+ AccessControlException,
+ IllegalArgumentException;
+
+ /**
+ * Get the time the object will live once the lifetime policy conditions are no longer fulfilled
+ *
+ * @return the time to live
+ */
+ long getTimeToLive();
+
+ /**
+ * Set the ttl value
+ *
+ * @param expected the ttl the caller believes the object currently has
+ * @param desired the ttl value the caller
+ * @return the new ttl value
+ * @throws IllegalStateException if the ttl cannot be set in the current state
+ * @throws AccessControlException if the caller does not have permission to change the ttl
+ * @throws IllegalArgumentException if the object does not support the requested ttl value
+ */
+ long setTimeToLive(long expected, long desired) throws IllegalStateException,
+ AccessControlException,
+ IllegalArgumentException;
+
+ /**
+ * Get the names of attributes that are set on this object
+ *
+ * Not that the returned collection is correct at the time the method is called, but will not reflect future
+ * additions or removals when they occur
+ *
+ * @return the collection of attribute names
+ */
+ Collection<String> getAttributeNames();
+
+
+ /**
+ * Return the value for the given attribute
+ *
+ * @param name the name of the attribute
+ * @return the value of the attribute at the object (or null if the attribute is not set
+ */
+ Object getAttribute(String name);
+
+ /**
+ * Set the value of an attribute
+ *
+ * @param name the name of the attribute to be set
+ * @param expected the value the caller believes the attribute currently has (or null if it is expected to be unset)
+ * @param desired the desired value for the attribute (or null to unset the attribute)
+ * @return the new value for the given attribute
+ * @throws IllegalStateException if the attribute cannot be set while the object is in its current state
+ * @throws AccessControlException if the caller does not have permission to alter the value of the attribute
+ * @throws IllegalArgumentException if the provided value is not valid for the given argument
+ */
+ Object setAttribute(String name, Object expected, Object desired) throws IllegalStateException,
+ AccessControlException,
+ IllegalArgumentException;
+
+
+ /**
+ * Return the Statistics holder for the ConfiguredObject
+ *
+ * @return the Statistics holder for the ConfiguredObject (or null if none exists)
+ */
+ Statistics getStatistics();
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Consumer.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Consumer.java
new file mode 100644
index 0000000000..958177e713
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Consumer.java
@@ -0,0 +1,73 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+
+public interface Consumer extends ConfiguredObject
+{
+ public String DISTRIBUTION_MODE = "distributionMode";
+ public String EXCLUSIVE = "exclusive";
+ public String NO_LOCAL = "noLocal";
+ public String SELECTOR = "selector";
+ public String SETTLEMENT_MODE = "settlementMode";
+ public String CREATED = "created";
+ public String DURABLE = "durable";
+ public String ID = "id";
+ public String LIFETIME_POLICY = "lifetimePolicy";
+ public String NAME = "name";
+ public String STATE = "state";
+ public String TIME_TO_LIVE = "timeToLive";
+ public String UPDATED = "updated";
+
+ public Collection<String> AVAILABLE_ATTRIBUTES =
+ Collections.unmodifiableCollection(
+ Arrays.asList(ID,
+ NAME,
+ STATE,
+ DURABLE,
+ LIFETIME_POLICY,
+ TIME_TO_LIVE,
+ CREATED,
+ UPDATED,
+ DISTRIBUTION_MODE,
+ SETTLEMENT_MODE,
+ EXCLUSIVE,
+ NO_LOCAL,
+ SELECTOR));
+
+ public String BYTES_OUT = "bytesOut";
+ public String MESSAGES_OUT = "messagesOut";
+ public String STATE_CHANGED = "stateChanged";
+ public String UNACKNOWLEDGED_BYTES = "unacknowledgedBytes";
+ public String UNACKNOWLEDGED_MESSAGES = "unacknowledgedMessages";
+
+ public Collection<String> AVAILABLE_STATISTICS =
+ Collections.unmodifiableCollection(
+ Arrays.asList(BYTES_OUT,
+ MESSAGES_OUT,
+ STATE_CHANGED,
+ UNACKNOWLEDGED_BYTES,
+ UNACKNOWLEDGED_MESSAGES)
+ );
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Exchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Exchange.java
new file mode 100644
index 0000000000..e872273d05
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Exchange.java
@@ -0,0 +1,91 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+public interface Exchange extends ConfiguredObject
+{
+ String BINDING_COUNT = "bindingCount";
+ String BYTES_DROPPED = "bytesDropped";
+ String BYTES_IN = "bytesIn";
+ String MESSAGES_DROPPED = "messagesDropped";
+ String MESSAGES_IN = "messagesIn";
+ String PRODUCER_COUNT = "producerCount";
+ String STATE_CHANGED = "stateChanged";
+
+ public static final Collection<String> AVAILABLE_STATISTICS =
+ Collections.unmodifiableList(
+ Arrays.asList(BINDING_COUNT,
+ BYTES_DROPPED,
+ BYTES_IN,
+ MESSAGES_DROPPED,
+ MESSAGES_IN,
+ PRODUCER_COUNT,
+ STATE_CHANGED));
+
+ String CREATED = "created";
+ String DURABLE = "durable";
+ String ID = "id";
+ String LIFETIME_POLICY = "lifetimePolicy";
+ String NAME = "name";
+ String STATE = "state";
+ String TIME_TO_LIVE = "timeToLive";
+ String UPDATED = "updated";
+ String ALTERNATE_EXCHANGE = "alternateExchange";
+ String TYPE = "type";
+
+ // Attributes
+ public static final Collection<String> AVAILABLE_ATTRIBUTES =
+ Collections.unmodifiableList(
+ Arrays.asList(
+ ID,
+ NAME,
+ STATE,
+ DURABLE,
+ LIFETIME_POLICY,
+ TIME_TO_LIVE,
+ CREATED,
+ UPDATED,
+ ALTERNATE_EXCHANGE,
+ TYPE
+ ));
+
+ String getExchangeType();
+
+ //children
+ Collection<Binding> getBindings();
+ Collection<Publisher> getPublishers();
+
+ //operations
+ Binding createBinding(String bindingKey,
+ Queue queue,
+ Map<String,Object> bindingArguments,
+ Map<String, Object> attributes);
+
+
+ // Statistics
+
+ void delete();
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/IllegalStateTransitionException.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/IllegalStateTransitionException.java
new file mode 100644
index 0000000000..9cab5e2103
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/IllegalStateTransitionException.java
@@ -0,0 +1,43 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+public class IllegalStateTransitionException extends RuntimeException
+{
+ public IllegalStateTransitionException()
+ {
+ }
+
+ public IllegalStateTransitionException(final String message)
+ {
+ super(message);
+ }
+
+ public IllegalStateTransitionException(final String message, final Throwable cause)
+ {
+ super(message, cause);
+ }
+
+ public IllegalStateTransitionException(final Throwable cause)
+ {
+ super(cause);
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/LifetimePolicy.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/LifetimePolicy.java
new file mode 100644
index 0000000000..c9006f4e71
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/LifetimePolicy.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+public enum LifetimePolicy
+{
+ PERMANENT,
+ AUTO_DELETE
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Publisher.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Publisher.java
new file mode 100644
index 0000000000..cdb85d8023
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Publisher.java
@@ -0,0 +1,25 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+public interface Publisher extends ConfiguredObject
+{
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Queue.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Queue.java
new file mode 100644
index 0000000000..7c4f0de22b
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Queue.java
@@ -0,0 +1,146 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import org.apache.qpid.server.queue.QueueEntryVisitor;
+
+
+public interface Queue extends ConfiguredObject
+{
+ public static final String BINDING_COUNT = "bindingCount";
+ public static final String CONSUMER_COUNT = "consumerCount";
+ public static final String CONSUMER_COUNT_WITH_CREDIT = "consumerCountWithCredit";
+ public static final String DISCARDS_TTL_BYTES = "discardsTtlBytes";
+ public static final String DISCARDS_TTL_MESSAGES = "discardsTtlMessages";
+ public static final String PERSISTENT_DEQUEUED_BYTES = "persistentDequeuedBytes";
+ public static final String PERSISTENT_DEQUEUED_MESSAGES = "persistentDequeuedMessages";
+ public static final String PERSISTENT_ENQUEUED_BYTES = "persistentEnqueuedBytes";
+ public static final String PERSISTENT_ENQUEUED_MESSAGES = "persistentEnqueuedMessages";
+ public static final String QUEUE_DEPTH_BYTES = "queueDepthBytes";
+ public static final String QUEUE_DEPTH_MESSAGES = "queueDepthMessages";
+ public static final String STATE_CHANGED = "stateChanged";
+ public static final String TOTAL_DEQUEUED_BYTES = "totalDequeuedBytes";
+ public static final String TOTAL_DEQUEUED_MESSAGES = "totalDequeuedMessages";
+ public static final String TOTAL_ENQUEUED_BYTES = "totalEnqueuedBytes";
+ public static final String TOTAL_ENQUEUED_MESSAGES = "totalEnqueuedMessages";
+ public static final String UNACKNOWLEDGED_BYTES = "unacknowledgedBytes";
+ public static final String UNACKNOWLEDGED_MESSAGES = "unacknowledgedMessages";
+
+ public static final Collection<String> AVAILABLE_STATISTICS =
+ Collections.unmodifiableList(
+ Arrays.asList(BINDING_COUNT,
+ CONSUMER_COUNT,
+ CONSUMER_COUNT_WITH_CREDIT,
+ DISCARDS_TTL_BYTES,
+ DISCARDS_TTL_MESSAGES,
+ PERSISTENT_DEQUEUED_BYTES,
+ PERSISTENT_DEQUEUED_MESSAGES,
+ PERSISTENT_ENQUEUED_BYTES,
+ PERSISTENT_ENQUEUED_MESSAGES,
+ QUEUE_DEPTH_BYTES,
+ QUEUE_DEPTH_MESSAGES,
+ STATE_CHANGED,
+ TOTAL_DEQUEUED_BYTES,
+ TOTAL_DEQUEUED_MESSAGES,
+ TOTAL_ENQUEUED_BYTES,
+ TOTAL_ENQUEUED_MESSAGES,
+ UNACKNOWLEDGED_BYTES,
+ UNACKNOWLEDGED_MESSAGES));
+
+
+
+ public static final String ID = "id";
+ public static final String NAME = "name";
+ public static final String STATE = "state";
+ public static final String DURABLE = "durable";
+ public static final String LIFETIME_POLICY = "lifetimePolicy";
+ public static final String TIME_TO_LIVE = "timeToLive";
+ public static final String CREATED = "created";
+ public static final String UPDATED = "updated";
+
+ public static final String ALERT_REPEAT_GAP = "alertRepeatGap";
+ public static final String ALERT_THRESHOLD_MESSAGE_AGE = "alertThresholdMessageAge";
+ public static final String ALERT_THRESHOLD_MESSAGE_SIZE = "alertThresholdMessageSize";
+ public static final String ALERT_THRESHOLD_QUEUE_DEPTH_BYTES = "alertThresholdQueueDepthBytes";
+ public static final String ALERT_THRESHOLD_QUEUE_DEPTH_MESSAGES = "alertThresholdQueueDepthMessages";
+ public static final String ALTERNATE_EXCHANGE = "alternateExchange";
+ public static final String EXCLUSIVE = "exclusive";
+ public static final String MESSAGE_GROUP_KEY = "messageGroupKey";
+ public static final String MESSAGE_GROUP_DEFAULT_GROUP = "messageGroupDefaultGroup";
+ public static final String MESSAGE_GROUP_SHARED_GROUPS = "messageGroupSharedGroups";
+ public static final String LVQ_KEY = "lvqKey";
+ public static final String MAXIMUM_DELIVERY_ATTEMPTS = "maximumDeliveryAttempts";
+ public static final String NO_LOCAL = "noLocal";
+ public static final String OWNER = "owner";
+ public static final String QUEUE_FLOW_CONTROL_SIZE_BYTES = "queueFlowControlSizeBytes";
+ public static final String QUEUE_FLOW_RESUME_SIZE_BYTES = "queueFlowResumeSizeBytes";
+ public static final String QUEUE_FLOW_STOPPED = "queueFlowStopped";
+ public static final String SORT_KEY = "sortKey";
+ public static final String TYPE = "type";
+
+
+
+
+ public static final Collection<String> AVAILABLE_ATTRIBUTES =
+ Collections.unmodifiableList(
+ Arrays.asList(ID,
+ NAME,
+ STATE,
+ DURABLE,
+ LIFETIME_POLICY,
+ TIME_TO_LIVE,
+ CREATED,
+ UPDATED,
+ TYPE,
+ ALTERNATE_EXCHANGE,
+ EXCLUSIVE,
+ OWNER,
+ NO_LOCAL,
+ LVQ_KEY,
+ SORT_KEY,
+ MESSAGE_GROUP_KEY,
+ MESSAGE_GROUP_DEFAULT_GROUP,
+ MESSAGE_GROUP_SHARED_GROUPS,
+ MAXIMUM_DELIVERY_ATTEMPTS,
+ QUEUE_FLOW_CONTROL_SIZE_BYTES,
+ QUEUE_FLOW_RESUME_SIZE_BYTES,
+ QUEUE_FLOW_STOPPED,
+ ALERT_THRESHOLD_MESSAGE_AGE,
+ ALERT_THRESHOLD_MESSAGE_SIZE,
+ ALERT_THRESHOLD_QUEUE_DEPTH_BYTES,
+ ALERT_THRESHOLD_QUEUE_DEPTH_MESSAGES,
+ ALERT_REPEAT_GAP
+ ));
+
+ //children
+ Collection<Binding> getBindings();
+ Collection<Consumer> getConsumers();
+
+
+ //operations
+
+ void visit(QueueEntryVisitor visitor);
+
+ void delete();
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/State.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/State.java
new file mode 100644
index 0000000000..a73b2c9d3e
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/State.java
@@ -0,0 +1,30 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+public enum State
+{
+ INITIALISING,
+ QUIESCED,
+ STOPPED,
+ ACTIVE,
+ DELETED
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Statistics.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Statistics.java
new file mode 100644
index 0000000000..2cb81eae82
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Statistics.java
@@ -0,0 +1,25 @@
+package org.apache.qpid.server.model;
+
+import java.util.Collection;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+public interface Statistics
+{
+ Collection<String> getStatisticNames();
+ public Object getStatistic(String name);
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java
new file mode 100644
index 0000000000..d8493c6df4
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/model/UUIDGenerator.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.model;
+
+import java.util.UUID;
+
+import org.apache.qpid.exchange.ExchangeDefaults;
+
+
+public class UUIDGenerator
+{
+
+ public static UUID generateUUID()
+ {
+ return UUID.randomUUID();
+ }
+
+ public static UUID generateUUID(String objectName, String virtualHostName)
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append(virtualHostName).append(objectName);
+ return UUID.nameUUIDFromBytes(sb.toString().getBytes());
+ }
+
+ public static UUID generateExchangeUUID(String echangeName, String virtualHostName)
+ {
+ if(ExchangeDefaults.DEFAULT_EXCHANGE_NAME.asString().equals(echangeName) || echangeName.startsWith("amq.") || echangeName.startsWith("qpid."))
+ {
+ return generateUUID(echangeName, virtualHostName);
+ }
+ else
+ {
+ return generateUUID();
+ }
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java
index 1a055240b9..b750b29952 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java
@@ -58,6 +58,7 @@ import org.apache.qpid.server.state.AMQStateManager;
import org.apache.qpid.server.stats.StatisticsCounter;
import org.apache.qpid.server.subscription.ClientDeliveryMethod;
import org.apache.qpid.server.subscription.Subscription;
+import org.apache.qpid.server.subscription.SubscriptionImpl;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
import org.apache.qpid.transport.Sender;
@@ -1455,7 +1456,7 @@ public class AMQProtocolEngine implements ServerProtocolEngine, Managable, AMQPr
throws AMQException
{
registerMessageDelivered(entry.getMessage().getSize());
- _protocolOutputConverter.writeDeliver(entry, _channelId, deliveryTag, sub.getConsumerTag());
+ _protocolOutputConverter.writeDeliver(entry, _channelId, deliveryTag, ((SubscriptionImpl)sub).getConsumerTag());
entry.incrementDeliveryCount();
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AmqpProtocolVersion.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AmqpProtocolVersion.java
index e925d7a1ec..0a71fe257a 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AmqpProtocolVersion.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AmqpProtocolVersion.java
@@ -20,4 +20,4 @@
*/
package org.apache.qpid.server.protocol;
-public enum AmqpProtocolVersion { v0_8, v0_9, v0_9_1, v0_10 } \ No newline at end of file
+public enum AmqpProtocolVersion { v0_8, v0_9, v0_9_1, v0_10, v1_0_0 }
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java
index 3b26f05f84..652ffee004 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngine.java
@@ -175,6 +175,28 @@ public class MultiVersionProtocolEngine implements ServerProtocolEngine
(byte) 10
};
+ private static final byte[] AMQP_1_0_0_HEADER =
+ new byte[] { (byte) 'A',
+ (byte) 'M',
+ (byte) 'Q',
+ (byte) 'P',
+ (byte) 0,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ };
+
+ private static final byte[] AMQP_SASL_1_0_0_HEADER =
+ new byte[] { (byte) 'A',
+ (byte) 'M',
+ (byte) 'Q',
+ (byte) 'P',
+ (byte) 3,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ };
+
public void setNetworkConnection(NetworkConnection networkConnection)
{
setNetworkConnection(networkConnection, networkConnection.getSender());
@@ -289,8 +311,48 @@ public class MultiVersionProtocolEngine implements ServerProtocolEngine
}
};
+ private DelegateCreator creator_1_0_0 = new DelegateCreator()
+ {
+
+ public AmqpProtocolVersion getVersion()
+ {
+ return AmqpProtocolVersion.v1_0_0;
+ }
+
+
+ public byte[] getHeaderIdentifier()
+ {
+ return AMQP_1_0_0_HEADER;
+ }
+
+ public ServerProtocolEngine getProtocolEngine()
+ {
+ return new ProtocolEngine_1_0_0(_appRegistry,_id);
+ }
+ };
+
+ private DelegateCreator creator_1_0_0_SASL = new DelegateCreator()
+ {
+
+ public AmqpProtocolVersion getVersion()
+ {
+ return AmqpProtocolVersion.v1_0_0;
+ }
+
+
+ public byte[] getHeaderIdentifier()
+ {
+ return AMQP_SASL_1_0_0_HEADER;
+ }
+
+ public ServerProtocolEngine getProtocolEngine()
+ {
+ return new ProtocolEngine_1_0_0_SASL(_network, _appRegistry, _id);
+ }
+ };
+
private final DelegateCreator[] _creators =
- new DelegateCreator[] { creator_0_8, creator_0_9, creator_0_9_1, creator_0_10 };
+ new DelegateCreator[] { creator_0_8, creator_0_9, creator_0_9_1, creator_0_10, creator_1_0_0_SASL, creator_1_0_0 };
private class ClosedDelegateProtocolEngine implements ServerProtocolEngine
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java
new file mode 100755
index 0000000000..f31ad5052b
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java
@@ -0,0 +1,394 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol;
+
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.security.auth.callback.CallbackHandler;
+import org.apache.qpid.amqp_1_0.codec.FrameWriter;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.framing.FrameHandler;
+import org.apache.qpid.amqp_1_0.framing.OversizeFrameException;
+import org.apache.qpid.amqp_1_0.transport.CallbackHandlerSource;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+import org.apache.qpid.amqp_1_0.transport.Container;
+import org.apache.qpid.amqp_1_0.transport.FrameOutputHandler;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+import org.apache.qpid.protocol.ServerProtocolEngine;
+import org.apache.qpid.server.configuration.ConfigStore;
+import org.apache.qpid.server.configuration.ConnectionConfigType;
+import org.apache.qpid.server.protocol.v1_0.Connection_1_0;
+import org.apache.qpid.server.registry.IApplicationRegistry;
+import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
+import org.apache.qpid.transport.Sender;
+import org.apache.qpid.transport.network.NetworkConnection;
+
+public class ProtocolEngine_1_0_0 implements ServerProtocolEngine, FrameOutputHandler
+{
+ static final AtomicLong _connectionIdSource = new AtomicLong(0L);
+
+ //private NetworkConnection _networkDriver;
+ private long _readBytes;
+ private long _writtenBytes;
+ private final UUID _id;
+ private final IApplicationRegistry _appRegistry;
+ private long _createTime = System.currentTimeMillis();
+ private ConnectionEndpoint _conn;
+ private final long _connectionId;
+
+ private static final ByteBuffer HEADER =
+ ByteBuffer.wrap(new byte[]
+ {
+ (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte) 0,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ });
+
+ private FrameWriter _frameWriter;
+ private FrameHandler _frameHandler;
+ private Object _sendLock = new Object();
+ private byte _major;
+ private byte _minor;
+ private byte _revision;
+ private NetworkConnection _network;
+ private Sender<ByteBuffer> _sender;
+
+
+ static enum State {
+ A,
+ M,
+ Q,
+ P,
+ PROTOCOL,
+ MAJOR,
+ MINOR,
+ REVISION,
+ FRAME
+ }
+
+ private State _state = State.A;
+
+
+
+ public ProtocolEngine_1_0_0(final IApplicationRegistry appRegistry, long id)
+ {
+ _id = appRegistry.getConfigStore().createId();
+ _appRegistry = appRegistry;
+ _connectionId = id;
+ }
+
+
+ public SocketAddress getRemoteAddress()
+ {
+ return _network.getRemoteAddress();
+ }
+
+ public SocketAddress getLocalAddress()
+ {
+ return _network.getLocalAddress();
+ }
+
+ public long getReadBytes()
+ {
+ return _readBytes;
+ }
+
+ public long getWrittenBytes()
+ {
+ return _writtenBytes;
+ }
+
+ public void writerIdle()
+ {
+ //Todo
+ }
+
+ public void readerIdle()
+ {
+ //Todo
+ }
+
+ public void setNetworkConnection(final NetworkConnection network, final Sender<ByteBuffer> sender)
+ {
+ _network = network;
+ _sender = sender;
+
+ Container container = new Container(_appRegistry.getBrokerId().toString());
+
+ _conn = new ConnectionEndpoint(container,asCallbackHandlerSource(_appRegistry.getAuthenticationManager()));
+ _conn.setConnectionEventListener(new Connection_1_0(_appRegistry));
+ _conn.setFrameOutputHandler(this);
+ _conn.setRemoteAddress(_network.getRemoteAddress());
+
+ _frameWriter = new FrameWriter(_conn.getDescribedTypeRegistry());
+ _frameHandler = new FrameHandler(_conn);
+
+ _sender.send(HEADER.duplicate());
+ _sender.flush();
+ }
+
+ private CallbackHandlerSource asCallbackHandlerSource(final AuthenticationManager authenticationManager)
+ {
+ return new CallbackHandlerSource()
+ {
+ @Override
+ public CallbackHandler getHandler(String mechanism)
+ {
+ return authenticationManager.getHandler(mechanism);
+ }
+ };
+ }
+
+ public String getAddress()
+ {
+ return getRemoteAddress().toString();
+ }
+
+
+ public ConfigStore getConfigStore()
+ {
+ return _appRegistry.getConfigStore();
+ }
+
+ public UUID getId()
+ {
+ return _id;
+ }
+
+ public ConnectionConfigType getConfigType()
+ {
+ return ConnectionConfigType.getInstance();
+ }
+
+ public boolean isDurable()
+ {
+ return false;
+ }
+
+ public synchronized void received(ByteBuffer msg)
+ {
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ ByteBuffer dup = msg.duplicate();
+ byte[] data = new byte[dup.remaining()];
+ dup.get(data);
+ Binary bin = new Binary(data);
+ RAW_LOGGER.fine("RECV[" + getRemoteAddress() + "] : " + bin.toString());
+ }
+ _readBytes += msg.remaining();
+ switch(_state)
+ {
+ case A:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ break;
+ }
+ case M:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.M;
+ break;
+ }
+
+ case Q:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.Q;
+ break;
+ }
+ case P:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.P;
+ break;
+ }
+ case PROTOCOL:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.PROTOCOL;
+ break;
+ }
+ case MAJOR:
+ if(msg.hasRemaining())
+ {
+ _major = msg.get();
+ }
+ else
+ {
+ _state = State.MAJOR;
+ break;
+ }
+ case MINOR:
+ if(msg.hasRemaining())
+ {
+ _minor = msg.get();
+ }
+ else
+ {
+ _state = State.MINOR;
+ break;
+ }
+ case REVISION:
+ if(msg.hasRemaining())
+ {
+ _revision = msg.get();
+
+ _state = State.FRAME;
+ }
+ else
+ {
+ _state = State.REVISION;
+ break;
+ }
+ case FRAME:
+ if(msg.hasRemaining())
+ {
+ _frameHandler.parse(msg);
+ }
+ }
+
+ }
+
+ public void exception(Throwable t)
+ {
+ t.printStackTrace();
+ }
+
+ public void closed()
+ {
+ _conn.inputClosed();
+ if(_conn != null && _conn.getConnectionEventListener() != null)
+ {
+ ((Connection_1_0)_conn.getConnectionEventListener()).closed();
+ }
+
+ }
+
+ public long getCreateTime()
+ {
+ return _createTime;
+ }
+
+
+ public boolean canSend()
+ {
+ return true;
+ }
+
+ public void send(final AMQFrame amqFrame)
+ {
+ send(amqFrame, null);
+ }
+
+ private final Logger FRAME_LOGGER = Logger.getLogger("FRM");
+ private final Logger RAW_LOGGER = Logger.getLogger("RAW");
+
+
+ public void send(final AMQFrame amqFrame, ByteBuffer buf)
+ {
+ synchronized(_sendLock)
+ {
+
+ if(FRAME_LOGGER.isLoggable(Level.FINE))
+ {
+ FRAME_LOGGER.fine("SEND[" + getRemoteAddress() + "|" + amqFrame.getChannel() + "] : " + amqFrame.getFrameBody());
+ }
+
+
+ _frameWriter.setValue(amqFrame);
+
+
+
+ ByteBuffer dup = ByteBuffer.allocate(_conn.getMaxFrameSize());
+
+ int size = _frameWriter.writeToBuffer(dup);
+ if(size > _conn.getMaxFrameSize())
+ {
+ throw new OversizeFrameException(amqFrame,size);
+ }
+
+ dup.flip();
+ _writtenBytes += dup.limit();
+
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ ByteBuffer dup2 = dup.duplicate();
+ byte[] data = new byte[dup2.remaining()];
+ dup2.get(data);
+ Binary bin = new Binary(data);
+ RAW_LOGGER.fine("SEND[" + getRemoteAddress() + "] : " + bin.toString());
+ }
+
+
+ _sender.send(dup);
+ _sender.flush();
+
+ }
+ }
+
+ public void send(short channel, FrameBody body)
+ {
+ AMQFrame frame = AMQFrame.createAMQFrame(channel, body);
+ send(frame);
+
+ }
+
+ public void close()
+ {
+ //TODO
+ }
+
+ public long getConnectionId()
+ {
+ return _connectionId;
+ }
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java
new file mode 100644
index 0000000000..ffd5e750b4
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java
@@ -0,0 +1,449 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol;
+
+import java.io.PrintWriter;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.security.auth.callback.CallbackHandler;
+import org.apache.qpid.amqp_1_0.codec.FrameWriter;
+import org.apache.qpid.amqp_1_0.codec.ProtocolHandler;
+import org.apache.qpid.amqp_1_0.framing.AMQFrame;
+import org.apache.qpid.amqp_1_0.framing.OversizeFrameException;
+import org.apache.qpid.amqp_1_0.framing.SASLFrameHandler;
+import org.apache.qpid.amqp_1_0.transport.CallbackHandlerSource;
+import org.apache.qpid.amqp_1_0.transport.ConnectionEndpoint;
+import org.apache.qpid.amqp_1_0.transport.Container;
+import org.apache.qpid.amqp_1_0.transport.FrameOutputHandler;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.FrameBody;
+import org.apache.qpid.protocol.ServerProtocolEngine;
+import org.apache.qpid.server.configuration.ConfigStore;
+import org.apache.qpid.server.configuration.ConnectionConfigType;
+import org.apache.qpid.server.protocol.v1_0.Connection_1_0;
+import org.apache.qpid.server.registry.ApplicationRegistry;
+import org.apache.qpid.server.registry.IApplicationRegistry;
+import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
+import org.apache.qpid.transport.Sender;
+import org.apache.qpid.transport.network.NetworkConnection;
+
+public class ProtocolEngine_1_0_0_SASL implements ServerProtocolEngine, FrameOutputHandler
+{
+ private long _readBytes;
+ private long _writtenBytes;
+ private final UUID _id;
+ private final IApplicationRegistry _appRegistry;
+ private long _createTime = System.currentTimeMillis();
+ private ConnectionEndpoint _conn;
+ private long _connectionId;
+
+ private static final ByteBuffer HEADER =
+ ByteBuffer.wrap(new byte[]
+ {
+ (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte) 3,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ });
+
+ private static final ByteBuffer PROTOCOL_HEADER =
+ ByteBuffer.wrap(new byte[]
+ {
+ (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte) 0,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ });
+
+
+ private FrameWriter _frameWriter;
+ private ProtocolHandler _frameHandler;
+ private ByteBuffer _buf = ByteBuffer.allocate(1024 * 1024);
+ private Object _sendLock = new Object();
+ private byte _major;
+ private byte _minor;
+ private byte _revision;
+ private PrintWriter _out;
+ private NetworkConnection _network;
+ private Sender<ByteBuffer> _sender;
+
+
+ static enum State {
+ A,
+ M,
+ Q,
+ P,
+ PROTOCOL,
+ MAJOR,
+ MINOR,
+ REVISION,
+ FRAME
+ }
+
+ private State _state = State.A;
+
+
+ public ProtocolEngine_1_0_0_SASL(final NetworkConnection networkDriver, final IApplicationRegistry appRegistry,
+ long id)
+ {
+ _id = appRegistry.getConfigStore().createId();
+ _connectionId = id;
+ _appRegistry = appRegistry;
+
+ if(networkDriver != null)
+ {
+ setNetworkConnection(networkDriver, networkDriver.getSender());
+ }
+ }
+
+
+ public SocketAddress getRemoteAddress()
+ {
+ return _network.getRemoteAddress();
+ }
+
+ public SocketAddress getLocalAddress()
+ {
+ return _network.getLocalAddress();
+ }
+
+ public long getReadBytes()
+ {
+ return _readBytes;
+ }
+
+ public long getWrittenBytes()
+ {
+ return _writtenBytes;
+ }
+
+ public void writerIdle()
+ {
+ //Todo
+ }
+
+ public void readerIdle()
+ {
+ //Todo
+ }
+
+ public void setNetworkConnection(final NetworkConnection network, final Sender<ByteBuffer> sender)
+ {
+ _network = network;
+ _sender = sender;
+
+ Container container = new Container(_appRegistry.getBrokerId().toString());
+
+ _conn = new ConnectionEndpoint(container, asCallbackHandlerSource(ApplicationRegistry.getInstance()
+ .getAuthenticationManager()));
+ _conn.setConnectionEventListener(new Connection_1_0(_appRegistry));
+ _conn.setRemoteAddress(getRemoteAddress());
+
+
+ _conn.setFrameOutputHandler(this);
+ _conn.setSaslFrameOutput(this);
+
+ _conn.setOnSaslComplete(new Runnable()
+ {
+
+
+ public void run()
+ {
+ if(_conn.isAuthenticated())
+ {
+ _sender.send(PROTOCOL_HEADER.duplicate());
+ _sender.flush();
+ }
+ else
+ {
+ _network.close();
+ }
+ }
+ });
+ _frameWriter = new FrameWriter(_conn.getDescribedTypeRegistry());
+ _frameHandler = new SASLFrameHandler(_conn);
+
+ _sender.send(HEADER.duplicate());
+ _sender.flush();
+
+ _conn.initiateSASL();
+
+
+ }
+
+ private CallbackHandlerSource asCallbackHandlerSource(final AuthenticationManager authenticationManager)
+ {
+ return new CallbackHandlerSource()
+ {
+ @Override
+ public CallbackHandler getHandler(String mechanism)
+ {
+ return authenticationManager.getHandler(mechanism);
+ }
+ };
+ }
+
+ public String getAddress()
+ {
+ return getRemoteAddress().toString();
+ }
+
+
+ public ConfigStore getConfigStore()
+ {
+ return _appRegistry.getConfigStore();
+ }
+
+ public UUID getId()
+ {
+ return _id;
+ }
+
+ public ConnectionConfigType getConfigType()
+ {
+ return ConnectionConfigType.getInstance();
+ }
+
+ public boolean isDurable()
+ {
+ return false;
+ }
+
+ private final Logger RAW_LOGGER = Logger.getLogger("RAW");
+
+
+ public synchronized void received(ByteBuffer msg)
+ {
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ ByteBuffer dup = msg.duplicate();
+ byte[] data = new byte[dup.remaining()];
+ dup.get(data);
+ Binary bin = new Binary(data);
+ RAW_LOGGER.fine("RECV[" + getRemoteAddress() + "] : " + bin.toString());
+ }
+ _readBytes += msg.remaining();
+ switch(_state)
+ {
+ case A:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ break;
+ }
+ case M:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.M;
+ break;
+ }
+
+ case Q:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.Q;
+ break;
+ }
+ case P:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.P;
+ break;
+ }
+ case PROTOCOL:
+ if(msg.hasRemaining())
+ {
+ msg.get();
+ }
+ else
+ {
+ _state = State.PROTOCOL;
+ break;
+ }
+ case MAJOR:
+ if(msg.hasRemaining())
+ {
+ _major = msg.get();
+ }
+ else
+ {
+ _state = State.MAJOR;
+ break;
+ }
+ case MINOR:
+ if(msg.hasRemaining())
+ {
+ _minor = msg.get();
+ }
+ else
+ {
+ _state = State.MINOR;
+ break;
+ }
+ case REVISION:
+ if(msg.hasRemaining())
+ {
+ _revision = msg.get();
+
+ _state = State.FRAME;
+ }
+ else
+ {
+ _state = State.REVISION;
+ break;
+ }
+ case FRAME:
+ if(msg.hasRemaining())
+ {
+ _frameHandler = _frameHandler.parse(msg);
+ }
+ }
+
+ }
+
+ public void exception(Throwable t)
+ {
+ t.printStackTrace();
+ }
+
+ public void closed()
+ {
+ // todo
+ _conn.inputClosed();
+ if(_conn != null && _conn.getConnectionEventListener() != null)
+ {
+ ((Connection_1_0)_conn.getConnectionEventListener()).closed();
+ }
+
+ }
+
+ public long getCreateTime()
+ {
+ return _createTime;
+ }
+
+
+ public boolean canSend()
+ {
+ return true;
+ }
+
+ public void send(final AMQFrame amqFrame)
+ {
+ send(amqFrame, null);
+ }
+
+ private static final Logger FRAME_LOGGER = Logger.getLogger("FRM");
+
+
+ public void send(final AMQFrame amqFrame, ByteBuffer buf)
+ {
+
+ synchronized(_sendLock)
+ {
+
+ if(FRAME_LOGGER.isLoggable(Level.FINE))
+ {
+ FRAME_LOGGER.fine("SEND[" + getRemoteAddress() + "|" + amqFrame.getChannel() + "] : " + amqFrame.getFrameBody());
+ }
+
+
+ _frameWriter.setValue(amqFrame);
+
+
+
+ ByteBuffer dup = ByteBuffer.allocate(_conn.getMaxFrameSize());
+
+ int size = _frameWriter.writeToBuffer(dup);
+ if(size > _conn.getMaxFrameSize())
+ {
+ throw new OversizeFrameException(amqFrame,size);
+ }
+
+ dup.flip();
+ _writtenBytes += dup.limit();
+
+ if(RAW_LOGGER.isLoggable(Level.FINE))
+ {
+ ByteBuffer dup2 = dup.duplicate();
+ byte[] data = new byte[dup2.remaining()];
+ dup2.get(data);
+ Binary bin = new Binary(data);
+ RAW_LOGGER.fine("SEND[" + getRemoteAddress() + "] : " + bin.toString());
+ }
+
+
+ _sender.send(dup);
+ _sender.flush();
+
+
+ }
+ }
+
+ public void send(short channel, FrameBody body)
+ {
+ AMQFrame frame = AMQFrame.createAMQFrame(channel, body);
+ send(frame);
+
+ }
+
+ public void close()
+ {
+ _sender.close();
+ }
+
+ public void setLogOutput(final PrintWriter out)
+ {
+ _out = out;
+ }
+
+ public long getConnectionId()
+ {
+ return _connectionId;
+ }
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java
new file mode 100644
index 0000000000..318a240b27
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java
@@ -0,0 +1,98 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.transport.ConnectionEventListener;
+import org.apache.qpid.amqp_1_0.transport.SessionEndpoint;
+
+import org.apache.qpid.server.registry.IApplicationRegistry;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Connection_1_0 implements ConnectionEventListener
+{
+
+ private IApplicationRegistry _appRegistry;
+ private VirtualHost _vhost;
+
+
+ public static interface Task
+ {
+ public void doTask(Connection_1_0 connection);
+ }
+
+
+ private List<Task> _closeTasks =
+ Collections.synchronizedList(new ArrayList<Task>());
+
+
+
+ public Connection_1_0(IApplicationRegistry appRegistry)
+ {
+ _appRegistry = appRegistry;
+ _vhost = _appRegistry.getVirtualHostRegistry().getDefaultVirtualHost();
+ }
+
+ public void remoteSessionCreation(SessionEndpoint endpoint)
+ {
+ Session_1_0 session = new Session_1_0(_vhost, _appRegistry, this);
+ endpoint.setSessionEventListener(session);
+ }
+
+
+ void removeConnectionCloseTask(final Task task)
+ {
+ _closeTasks.remove( task );
+ }
+
+ void addConnectionCloseTask(final Task task)
+ {
+ _closeTasks.add( task );
+ }
+
+ public void closeReceived()
+ {
+ List<Task> taskCopy;
+ synchronized (_closeTasks)
+ {
+ taskCopy = new ArrayList<Task>(_closeTasks);
+ }
+ for(Task task : taskCopy)
+ {
+ task.doTask(this);
+ }
+ synchronized (_closeTasks)
+ {
+ _closeTasks.clear();
+ }
+
+ }
+
+ public void closed()
+ {
+ closeReceived();
+ }
+
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Destination.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Destination.java
new file mode 100644
index 0000000000..d45758391c
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Destination.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+
+public interface Destination
+{
+
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ExchangeDestination.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ExchangeDestination.java
new file mode 100644
index 0000000000..ba1a1ca45c
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ExchangeDestination.java
@@ -0,0 +1,108 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import java.util.List;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusDurability;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusExpiryPolicy;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.queue.BaseQueue;
+import org.apache.qpid.server.txn.ServerTransaction;
+
+public class ExchangeDestination implements ReceivingDestination, SendingDestination
+{
+ private static final Accepted ACCEPTED = new Accepted();
+ private static final Outcome[] OUTCOMES = { ACCEPTED };
+
+ private Exchange _exchange;
+ private TerminusDurability _durability;
+ private TerminusExpiryPolicy _expiryPolicy;
+
+ public ExchangeDestination(Exchange exchange, TerminusDurability durable, TerminusExpiryPolicy expiryPolicy)
+ {
+ _exchange = exchange;
+ _durability = durable;
+ _expiryPolicy = expiryPolicy;
+ }
+
+ public Outcome[] getOutcomes()
+ {
+ return OUTCOMES;
+ }
+
+ public Outcome send(final Message_1_0 message, ServerTransaction txn)
+ {
+ final List<? extends BaseQueue> queues = _exchange.route(message);
+
+ txn.enqueue(queues,message, new ServerTransaction.Action()
+ {
+
+ BaseQueue[] _queues = queues.toArray(new BaseQueue[queues.size()]);
+
+ public void postCommit()
+ {
+ for(int i = 0; i < _queues.length; i++)
+ {
+ try
+ {
+ _queues[i].enqueue(message);
+ }
+ catch (AMQException e)
+ {
+ // TODO
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ public void onRollback()
+ {
+ // NO-OP
+ }
+ }, System.currentTimeMillis());
+
+ return ACCEPTED;
+ }
+
+ TerminusDurability getDurability()
+ {
+ return _durability;
+ }
+
+ TerminusExpiryPolicy getExpiryPolicy()
+ {
+ return _expiryPolicy;
+ }
+
+ public int getCredit()
+ {
+ // TODO - fix
+ return 20000;
+ }
+
+ public Exchange getExchange()
+ {
+ return _exchange;
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/LinkRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/LinkRegistry.java
new file mode 100644
index 0000000000..42eea05d37
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/LinkRegistry.java
@@ -0,0 +1,59 @@
+package org.apache.qpid.server.protocol.v1_0;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class LinkRegistry
+{
+ private final Map<String, SendingLink_1_0> _sendingLinks = new HashMap<String, SendingLink_1_0>();
+ private final Map<String, ReceivingLink_1_0> _receivingLinks = new HashMap<String, ReceivingLink_1_0>();
+
+ public synchronized SendingLink_1_0 getDurableSendingLink(String name)
+ {
+ return _sendingLinks.get(name);
+ }
+
+ public synchronized boolean registerSendingLink(String name, SendingLink_1_0 link)
+ {
+ if(_sendingLinks.containsKey(name))
+ {
+ return false;
+ }
+ else
+ {
+ _sendingLinks.put(name, link);
+ return true;
+ }
+ }
+
+ public synchronized boolean unregisterSendingLink(String name)
+ {
+ if(!_sendingLinks.containsKey(name))
+ {
+ return false;
+ }
+ else
+ {
+ _sendingLinks.remove(name);
+ return true;
+ }
+ }
+
+ public synchronized ReceivingLink_1_0 getDurableReceivingLink(String name)
+ {
+ return _receivingLinks.get(name);
+ }
+
+ public synchronized boolean registerReceivingLink(String name, ReceivingLink_1_0 link)
+ {
+ if(_receivingLinks.containsKey(name))
+ {
+ return false;
+ }
+ else
+ {
+ _receivingLinks.put(name, link);
+ return true;
+ }
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Link_1_0.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Link_1_0.java
new file mode 100644
index 0000000000..db81d3b205
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Link_1_0.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+public interface Link_1_0
+{
+ void start();
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java
new file mode 100644
index 0000000000..140a815f57
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java
@@ -0,0 +1,172 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+
+import java.lang.ref.WeakReference;
+import java.nio.ByteBuffer;
+import java.util.List;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.server.configuration.SessionConfig;
+import org.apache.qpid.server.message.InboundMessage;
+import org.apache.qpid.server.message.MessageMetaData_1_0;
+import org.apache.qpid.server.message.MessageReference;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.store.StoredMessage;
+
+public class Message_1_0 implements ServerMessage, InboundMessage
+{
+ private final StoredMessage<MessageMetaData_1_0> _storedMessage;
+ private List<ByteBuffer> _fragments;
+ private WeakReference<Session_1_0> _session;
+
+
+ public Message_1_0(final StoredMessage<MessageMetaData_1_0> storedMessage,
+ final List<ByteBuffer> fragments,
+ final Session_1_0 session)
+ {
+ _storedMessage = storedMessage;
+ _fragments = fragments;
+ _session = new WeakReference<Session_1_0>(session);
+ }
+
+ public String getRoutingKey()
+ {
+ Object routingKey = getMessageHeader().getHeader("routing-key");
+ if(routingKey != null)
+ {
+ return routingKey.toString();
+ }
+ else
+ {
+ return getMessageHeader().getSubject();
+ }
+ }
+
+ public AMQShortString getRoutingKeyShortString()
+ {
+ return AMQShortString.valueOf(getRoutingKey());
+ }
+
+ private MessageMetaData_1_0 getMessageMetaData()
+ {
+ return _storedMessage.getMetaData();
+ }
+
+ public MessageMetaData_1_0.MessageHeader_1_0 getMessageHeader()
+ {
+ return getMessageMetaData().getMessageHeader();
+ }
+
+ public StoredMessage getStoredMessage()
+ {
+ return _storedMessage;
+ }
+
+ public boolean isPersistent()
+ {
+ return getMessageMetaData().isPersistent();
+ }
+
+ public boolean isRedelivered()
+ {
+ // TODO
+ return false;
+ }
+
+ public long getSize()
+ {
+ // TODO
+ return 0l;
+ }
+
+ public boolean isImmediate()
+ {
+ return false;
+ }
+
+ public long getExpiration()
+ {
+ return getMessageHeader().getExpiration();
+ }
+
+ public MessageReference<Message_1_0> newReference()
+ {
+ return new Reference(this);
+ }
+
+ public long getMessageNumber()
+ {
+ return _storedMessage.getMessageNumber();
+ }
+
+ public long getArrivalTime()
+ {
+ return 0; //TODO
+ }
+
+ public int getContent(final ByteBuffer buf, final int offset)
+ {
+ return _storedMessage.getContent(offset, buf);
+ }
+
+ public ByteBuffer getContent(int offset, int size)
+ {
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ buf.limit(getContent(buf, offset));
+
+ return buf;
+ }
+
+ public SessionConfig getSessionConfig()
+ {
+ return null; //TODO
+ }
+
+ public List<ByteBuffer> getFragments()
+ {
+ return _fragments;
+ }
+
+ public Session_1_0 getSession()
+ {
+ return _session.get();
+ }
+
+ public static class Reference extends MessageReference<Message_1_0>
+ {
+ public Reference(Message_1_0 message)
+ {
+ super(message);
+ }
+
+ protected void onReference(Message_1_0 message)
+ {
+
+ }
+
+ protected void onRelease(Message_1_0 message)
+ {
+
+ }
+
+}
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/QueueDestination.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/QueueDestination.java
new file mode 100644
index 0000000000..af3f0b7872
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/QueueDestination.java
@@ -0,0 +1,100 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+
+import org.apache.qpid.AMQException;
+import org.apache.qpid.server.queue.AMQQueue;
+
+import org.apache.qpid.server.txn.ServerTransaction;
+
+import java.util.Arrays;
+
+public class QueueDestination implements SendingDestination, ReceivingDestination
+{
+ private static final Accepted ACCEPTED = new Accepted();
+ private static final Outcome[] OUTCOMES = new Outcome[] { ACCEPTED };
+
+
+ private AMQQueue _queue;
+
+ public QueueDestination(AMQQueue queue)
+ {
+ _queue = queue;
+ }
+
+ public Outcome[] getOutcomes()
+ {
+ return OUTCOMES;
+ }
+
+ public Outcome send(final Message_1_0 message, ServerTransaction txn)
+ {
+
+ try
+ {
+ txn.enqueue(_queue,message, new ServerTransaction.Action()
+ {
+
+
+ public void postCommit()
+ {
+ try
+ {
+
+ _queue.enqueue(message);
+ }
+ catch (Exception e)
+ {
+ // TODO
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ public void onRollback()
+ {
+ // NO-OP
+ }
+ });
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ return ACCEPTED;
+ }
+
+ public int getCredit()
+ {
+ // TODO - fix
+ return 100;
+ }
+
+ public AMQQueue getQueue()
+ {
+ return _queue;
+ }
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingDestination.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingDestination.java
new file mode 100644
index 0000000000..4ae0596e25
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingDestination.java
@@ -0,0 +1,35 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.type.Outcome;
+
+import org.apache.qpid.server.txn.ServerTransaction;
+
+public interface ReceivingDestination extends Destination
+{
+
+ Outcome[] getOutcomes();
+
+ Outcome send(Message_1_0 message, ServerTransaction txn);
+
+ int getCredit();
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLinkAttachment.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLinkAttachment.java
new file mode 100644
index 0000000000..6da5081185
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLinkAttachment.java
@@ -0,0 +1,51 @@
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Source;
+import org.apache.qpid.amqp_1_0.type.Target;
+
+public class ReceivingLinkAttachment
+{
+ private final Session_1_0 _session;
+ private final ReceivingLinkEndpoint _endpoint;
+
+ public ReceivingLinkAttachment(final Session_1_0 session, final ReceivingLinkEndpoint endpoint)
+ {
+ _session = session;
+ _endpoint = endpoint;
+ }
+
+ public Session_1_0 getSession()
+ {
+ return _session;
+ }
+
+ public ReceivingLinkEndpoint getEndpoint()
+ {
+ return _endpoint;
+ }
+
+ public Source getSource()
+ {
+ return getEndpoint().getSource();
+ }
+
+ public void setDeliveryStateHandler(final DeliveryStateHandler handler)
+ {
+ getEndpoint().setDeliveryStateHandler(handler);
+ }
+
+ public void updateDisposition(final Binary deliveryTag, final DeliveryState state, final boolean settled)
+ {
+ getEndpoint().updateDisposition(deliveryTag, state, settled);
+ }
+
+ public Target getTarget()
+ {
+ return getEndpoint().getTarget();
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLink_1_0.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLink_1_0.java
new file mode 100644
index 0000000000..e097dd5c83
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/ReceivingLink_1_0.java
@@ -0,0 +1,305 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoderImpl;
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.LinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkListener;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusDurability;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+import org.apache.qpid.amqp_1_0.type.transport.Detach;
+import org.apache.qpid.amqp_1_0.type.transport.ReceiverSettleMode;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+import org.apache.qpid.server.message.MessageMetaData_1_0;
+import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.txn.AutoCommitTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+public class ReceivingLink_1_0 implements ReceivingLinkListener, Link_1_0, DeliveryStateHandler
+{
+ private VirtualHost _vhost;
+
+ private ReceivingDestination _destination;
+ private SectionDecoderImpl _sectionDecoder;
+ private volatile ReceivingLinkAttachment _attachment;
+
+
+ private ArrayList<Transfer> _incompleteMessage;
+ private TerminusDurability _durability;
+
+ private Map<Binary, Outcome> _unsettledMap = Collections.synchronizedMap(new HashMap<Binary, Outcome>());
+ private boolean _resumedMessage;
+ private Binary _messageDeliveryTag;
+ private ReceiverSettleMode _receivingSettlementMode;
+
+
+ public ReceivingLink_1_0(ReceivingLinkAttachment receivingLinkAttachment, VirtualHost vhost,
+ ReceivingDestination destination)
+ {
+ _vhost = vhost;
+ _destination = destination;
+ _attachment = receivingLinkAttachment;
+ receivingLinkAttachment.setDeliveryStateHandler(this);
+
+ _durability = ((Target)receivingLinkAttachment.getTarget()).getDurable();
+
+ _sectionDecoder = new SectionDecoderImpl(receivingLinkAttachment.getEndpoint().getSession().getConnection().getDescribedTypeRegistry());
+
+
+ }
+
+ public void messageTransfer(Transfer xfr)
+ {
+ // TODO - cope with fragmented messages
+
+ List<ByteBuffer> fragments = null;
+
+
+
+ if(Boolean.TRUE.equals(xfr.getMore()) && _incompleteMessage == null)
+ {
+ _incompleteMessage = new ArrayList<Transfer>();
+ _incompleteMessage.add(xfr);
+ _resumedMessage = Boolean.TRUE.equals(xfr.getResume());
+ _messageDeliveryTag = xfr.getDeliveryTag();
+ return;
+ }
+ else if(_incompleteMessage != null)
+ {
+ _incompleteMessage.add(xfr);
+
+ if(Boolean.TRUE.equals(xfr.getMore()))
+ {
+ return;
+ }
+
+ fragments = new ArrayList<ByteBuffer>(_incompleteMessage.size());
+ for(Transfer t : _incompleteMessage)
+ {
+ fragments.add(t.getPayload());
+ }
+ _incompleteMessage=null;
+
+ }
+ else
+ {
+ _resumedMessage = Boolean.TRUE.equals(xfr.getResume());
+ _messageDeliveryTag = xfr.getDeliveryTag();
+ fragments = Collections.singletonList(xfr.getPayload());
+ }
+
+ if(_resumedMessage)
+ {
+ if(_unsettledMap.containsKey(_messageDeliveryTag))
+ {
+ Outcome outcome = _unsettledMap.get(_messageDeliveryTag);
+ boolean settled = ReceiverSettleMode.FIRST.equals(getReceivingSettlementMode());
+ getEndpoint().updateDisposition(_messageDeliveryTag, (DeliveryState) outcome, settled);
+ if(settled)
+ {
+ _unsettledMap.remove(_messageDeliveryTag);
+ }
+ }
+ else
+ {
+ System.err.println("UNEXPECTED!!");
+ System.err.println("Delivery Tag: " + _messageDeliveryTag);
+ System.err.println("_unsettledMap: " + _unsettledMap);
+
+ }
+ }
+ else
+ {
+ MessageMetaData_1_0 mmd = null;
+ List<ByteBuffer> immutableSections = new ArrayList<ByteBuffer>(3);
+ mmd = new MessageMetaData_1_0(fragments.toArray(new ByteBuffer[fragments.size()]),
+ _sectionDecoder,
+ immutableSections);
+
+ StoredMessage<MessageMetaData_1_0> storedMessage = _vhost.getMessageStore().addMessage(mmd);
+
+ boolean skipping = true;
+ int offset = 0;
+
+ for(ByteBuffer bareMessageBuf : immutableSections)
+ {
+ storedMessage.addContent(offset, bareMessageBuf.duplicate());
+ offset += bareMessageBuf.remaining();
+ }
+
+ storedMessage.flushToStore();
+
+ Message_1_0 message = new Message_1_0(storedMessage, fragments, getSession());
+
+
+ Binary transactionId = null;
+ org.apache.qpid.amqp_1_0.type.DeliveryState xfrState = xfr.getState();
+ if(xfrState != null)
+ {
+ if(xfrState instanceof TransactionalState)
+ {
+ transactionId = ((TransactionalState)xfrState).getTxnId();
+ }
+ }
+
+ ServerTransaction transaction = null;
+ if(transactionId != null)
+ {
+ transaction = getSession().getTransaction(transactionId);
+ }
+ else
+ {
+ Session_1_0 session = getSession();
+ transaction = session != null ? session.getTransaction(null) : new AutoCommitTransaction(_vhost.getMessageStore());
+ }
+
+ Outcome outcome = _destination.send(message, transaction);
+
+ DeliveryState resultantState;
+
+ if(transactionId == null)
+ {
+ resultantState = (DeliveryState) outcome;
+ }
+ else
+ {
+ TransactionalState transactionalState = new TransactionalState();
+ transactionalState.setOutcome(outcome);
+ transactionalState.setTxnId(transactionId);
+ resultantState = transactionalState;
+
+ }
+
+
+ boolean settled = transaction instanceof AutoCommitTransaction && ReceiverSettleMode.FIRST.equals(getReceivingSettlementMode());
+
+ final Binary deliveryTag = xfr.getDeliveryTag();
+
+ if(!settled)
+ {
+ _unsettledMap.put(deliveryTag, outcome);
+ }
+
+ getEndpoint().updateDisposition(deliveryTag, resultantState, settled);
+
+ if(!(transaction instanceof AutoCommitTransaction))
+ {
+ ServerTransaction.Action a;
+ transaction.addPostTransactionAction(new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+ getEndpoint().updateDisposition(deliveryTag, null, true);
+ }
+
+ public void onRollback()
+ {
+ getEndpoint().updateDisposition(deliveryTag, null, true);
+ }
+ });
+ }
+ }
+ }
+
+ private ReceiverSettleMode getReceivingSettlementMode()
+ {
+ return _receivingSettlementMode;
+ }
+
+ public void remoteDetached(LinkEndpoint endpoint, Detach detach)
+ {
+ //TODO
+ // if not durable or close
+ if(!TerminusDurability.UNSETTLED_STATE.equals(_durability) ||
+ (detach != null && Boolean.TRUE.equals(detach.getClosed())))
+ {
+ endpoint.close();
+ }
+ else if(detach == null || detach.getError() != null)
+ {
+ _attachment = null;
+ }
+ }
+
+ public void start()
+ {
+ getEndpoint().setLinkCredit(UnsignedInteger.valueOf(_destination.getCredit()));
+ getEndpoint().setCreditWindow();
+ }
+
+ public ReceivingLinkEndpoint getEndpoint()
+ {
+ return _attachment.getEndpoint();
+ }
+
+
+ public Session_1_0 getSession()
+ {
+ ReceivingLinkAttachment attachment = _attachment;
+ return attachment == null ? null : attachment.getSession();
+ }
+
+ public void handle(Binary deliveryTag, DeliveryState state, Boolean settled)
+ {
+ if(Boolean.TRUE.equals(settled))
+ {
+ _unsettledMap.remove(deliveryTag);
+ }
+ }
+
+ public void setLinkAttachment(ReceivingLinkAttachment linkAttachment)
+ {
+ _attachment = linkAttachment;
+ _receivingSettlementMode = linkAttachment.getEndpoint().getReceivingSettlementMode();
+ ReceivingLinkEndpoint endpoint = linkAttachment.getEndpoint();
+ Map initialUnsettledMap = endpoint.getInitialUnsettledMap();
+
+ Map<Binary, Outcome> unsettledCopy = new HashMap<Binary, Outcome>(_unsettledMap);
+ for(Map.Entry<Binary, Outcome> entry : unsettledCopy.entrySet())
+ {
+ Binary deliveryTag = entry.getKey();
+ if(!initialUnsettledMap.containsKey(deliveryTag))
+ {
+ _unsettledMap.remove(deliveryTag);
+ }
+ }
+
+ }
+
+ public Map getUnsettledOutcomeMap()
+ {
+ return _unsettledMap;
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingDestination.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingDestination.java
new file mode 100644
index 0000000000..6d601c9dda
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingDestination.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+
+public interface SendingDestination extends Destination
+{
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLinkAttachment.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLinkAttachment.java
new file mode 100644
index 0000000000..9d7af24135
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLinkAttachment.java
@@ -0,0 +1,44 @@
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Source;
+
+public class SendingLinkAttachment
+{
+ private final Session_1_0 _session;
+ private final SendingLinkEndpoint _endpoint;
+
+ public SendingLinkAttachment(final Session_1_0 session, final SendingLinkEndpoint endpoint)
+ {
+ _session = session;
+ _endpoint = endpoint;
+ }
+
+ public Session_1_0 getSession()
+ {
+ return _session;
+ }
+
+ public SendingLinkEndpoint getEndpoint()
+ {
+ return _endpoint;
+ }
+
+ public Source getSource()
+ {
+ return getEndpoint().getSource();
+ }
+
+ public void setDeliveryStateHandler(final DeliveryStateHandler handler)
+ {
+ getEndpoint().setDeliveryStateHandler(handler);
+ }
+
+ public void updateDisposition(final Binary deliveryTag, final DeliveryState state, final boolean settled)
+ {
+ getEndpoint().updateDisposition(deliveryTag, state, settled);
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java
new file mode 100644
index 0000000000..b3e9a74d04
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/SendingLink_1_0.java
@@ -0,0 +1,648 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.AMQInternalException;
+import org.apache.qpid.AMQSecurityException;
+import org.apache.qpid.amqp_1_0.transport.DeliveryStateHandler;
+import org.apache.qpid.amqp_1_0.transport.LinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkListener;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+import org.apache.qpid.amqp_1_0.type.messaging.ExactSubjectFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.Filter;
+import org.apache.qpid.amqp_1_0.type.messaging.MatchingSubjectFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.Modified;
+import org.apache.qpid.amqp_1_0.type.messaging.NoLocalFilter;
+import org.apache.qpid.amqp_1_0.type.messaging.Released;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
+import org.apache.qpid.amqp_1_0.type.messaging.TerminusDurability;
+import org.apache.qpid.amqp_1_0.type.transport.AmqpError;
+import org.apache.qpid.amqp_1_0.type.transport.Detach;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+import org.apache.qpid.filter.SelectorParsingException;
+import org.apache.qpid.filter.selector.ParseException;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.DirectExchange;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.exchange.TopicExchange;
+import org.apache.qpid.server.filter.JMSSelectorFilter;
+import org.apache.qpid.server.filter.SimpleFilterManager;
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.queue.AMQQueueFactory;
+import org.apache.qpid.server.queue.QueueEntry;
+import org.apache.qpid.server.txn.AutoCommitTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+public class SendingLink_1_0 implements SendingLinkListener, Link_1_0, DeliveryStateHandler
+{
+ private VirtualHost _vhost;
+ private SendingDestination _destination;
+
+ private Subscription_1_0 _subscription;
+ private boolean _draining;
+ private final Map<Binary, QueueEntry> _unsettledMap =
+ new HashMap<Binary, QueueEntry>();
+
+ private final ConcurrentHashMap<Binary, UnsettledAction> _unsettledActionMap =
+ new ConcurrentHashMap<Binary, UnsettledAction>();
+ private volatile SendingLinkAttachment _linkAttachment;
+ private TerminusDurability _durability;
+ private List<QueueEntry> _resumeFullTransfers = new ArrayList<QueueEntry>();
+ private List<Binary> _resumeAcceptedTransfers = new ArrayList<Binary>();
+ private Runnable _closeAction;
+
+ public SendingLink_1_0(final SendingLinkAttachment linkAttachment,
+ final VirtualHost vhost,
+ final SendingDestination destination)
+ throws AmqpErrorException
+ {
+ _vhost = vhost;
+ _destination = destination;
+ _linkAttachment = linkAttachment;
+ final Source source = (Source) linkAttachment.getSource();
+ _durability = source.getDurable();
+ linkAttachment.setDeliveryStateHandler(this);
+ QueueDestination qd = null;
+ AMQQueue queue = null;
+
+
+
+ boolean noLocal = false;
+ JMSSelectorFilter messageFilter = null;
+
+ if(destination instanceof QueueDestination)
+ {
+ queue = ((QueueDestination) _destination).getQueue();
+ if(queue.getArguments() != null && queue.getArguments().containsKey("topic"))
+ {
+ source.setDistributionMode(StdDistMode.COPY);
+ }
+ qd = (QueueDestination) destination;
+
+ Map<Symbol,Filter> filters = source.getFilter();
+
+ Map<Symbol,Filter> actualFilters = new HashMap<Symbol,Filter>();
+
+ if(filters != null)
+ {
+ for(Map.Entry<Symbol,Filter> entry : filters.entrySet())
+ {
+ if(entry.getValue() instanceof NoLocalFilter)
+ {
+ actualFilters.put(entry.getKey(), entry.getValue());
+ noLocal = true;
+ }
+ else if(messageFilter == null && entry.getValue() instanceof org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter)
+ {
+
+ org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter selectorFilter = (org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter) entry.getValue();
+ try
+ {
+ messageFilter = new JMSSelectorFilter(selectorFilter.getValue());
+
+ actualFilters.put(entry.getKey(), entry.getValue());
+ }
+ catch (ParseException e)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.INVALID_FIELD);
+ error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue());
+ error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter")));
+ throw new AmqpErrorException(error);
+ }
+ catch (SelectorParsingException e)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.INVALID_FIELD);
+ error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue());
+ error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter")));
+ throw new AmqpErrorException(error);
+ }
+
+
+ }
+ }
+ }
+ source.setFilter(actualFilters.isEmpty() ? null : actualFilters);
+
+ _subscription = new Subscription_1_0(this, qd);
+ }
+ else if(destination instanceof ExchangeDestination)
+ {
+ try
+ {
+
+ ExchangeDestination exchangeDestination = (ExchangeDestination) destination;
+
+ boolean isDurable = exchangeDestination.getDurability() == TerminusDurability.CONFIGURATION
+ || exchangeDestination.getDurability() == TerminusDurability.UNSETTLED_STATE;
+ String name;
+ if(isDurable)
+ {
+ String remoteContainerId = getEndpoint().getSession().getConnection().getRemoteContainerId();
+ remoteContainerId = remoteContainerId.replace("_","__").replace(".", "_:");
+
+ String endpointName = linkAttachment.getEndpoint().getName();
+ endpointName = endpointName
+ .replace("_", "__")
+ .replace(".", "_:")
+ .replace("(", "_O")
+ .replace(")", "_C")
+ .replace("<", "_L")
+ .replace(">", "_R");
+ name = "qpid_/" + remoteContainerId + "_/" + endpointName;
+ }
+ else
+ {
+ name = UUID.randomUUID().toString();
+ }
+
+ queue = _vhost.getQueueRegistry().getQueue(name);
+ Exchange exchange = exchangeDestination.getExchange();
+
+ if(queue == null)
+ {
+ queue = AMQQueueFactory.createAMQQueueImpl(
+ UUIDGenerator.generateUUID(),
+ name,
+ isDurable,
+ null,
+ true,
+ true,
+ _vhost,
+ Collections.EMPTY_MAP);
+ }
+ else
+ {
+ List<Binding> bindings = queue.getBindings();
+ List<Binding> bindingsToRemove = new ArrayList<Binding>();
+ for(Binding existingBinding : bindings)
+ {
+ if(existingBinding.getExchange() != _vhost.getExchangeRegistry().getDefaultExchange()
+ && existingBinding.getExchange() != exchange)
+ {
+ bindingsToRemove.add(existingBinding);
+ }
+ }
+ for(Binding existingBinding : bindingsToRemove)
+ {
+ existingBinding.getExchange().removeBinding(existingBinding);
+ }
+ }
+
+
+ String binding = "";
+
+ Map<Symbol,Filter> filters = source.getFilter();
+ Map<Symbol,Filter> actualFilters = new HashMap<Symbol,Filter>();
+ boolean hasBindingFilter = false;
+ if(filters != null && !filters.isEmpty())
+ {
+
+ for(Map.Entry<Symbol,Filter> entry : filters.entrySet())
+ {
+ if(!hasBindingFilter
+ && entry.getValue() instanceof ExactSubjectFilter
+ && exchange.getType() == DirectExchange.TYPE)
+ {
+ ExactSubjectFilter filter = (ExactSubjectFilter) filters.values().iterator().next();
+ source.setFilter(filters);
+ binding = filter.getValue();
+ actualFilters.put(entry.getKey(), entry.getValue());
+ hasBindingFilter = true;
+ }
+ else if(!hasBindingFilter
+ && entry.getValue() instanceof MatchingSubjectFilter
+ && exchange.getType() == TopicExchange.TYPE)
+ {
+ MatchingSubjectFilter filter = (MatchingSubjectFilter) filters.values().iterator().next();
+ source.setFilter(filters);
+ binding = filter.getValue();
+ actualFilters.put(entry.getKey(), entry.getValue());
+ hasBindingFilter = true;
+ }
+ else if(entry.getValue() instanceof NoLocalFilter)
+ {
+ actualFilters.put(entry.getKey(), entry.getValue());
+ noLocal = true;
+ }
+ else if(messageFilter == null && entry.getValue() instanceof org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter)
+ {
+
+ org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter selectorFilter = (org.apache.qpid.amqp_1_0.type.messaging.JMSSelectorFilter) entry.getValue();
+ try
+ {
+ messageFilter = new JMSSelectorFilter(selectorFilter.getValue());
+
+ actualFilters.put(entry.getKey(), entry.getValue());
+ }
+ catch (ParseException e)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.INVALID_FIELD);
+ error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue());
+ error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter")));
+ throw new AmqpErrorException(error);
+ }
+ catch (SelectorParsingException e)
+ {
+ Error error = new Error();
+ error.setCondition(AmqpError.INVALID_FIELD);
+ error.setDescription("Invalid JMS Selector: " + selectorFilter.getValue());
+ error.setInfo(Collections.singletonMap(Symbol.valueOf("field"), Symbol.valueOf("filter")));
+ throw new AmqpErrorException(error);
+ }
+
+
+ }
+ }
+ }
+ source.setFilter(actualFilters.isEmpty() ? null : actualFilters);
+
+ vhost.getBindingFactory().addBinding(binding,queue,exchange,null);
+ source.setDistributionMode(StdDistMode.COPY);
+
+ qd = new QueueDestination(queue);
+ }
+ catch (AMQSecurityException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ catch (AMQInternalException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (AMQException e)
+ {
+ e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ }
+ _subscription = new Subscription_1_0(this, qd, true);
+
+ }
+
+ if(_subscription != null)
+ {
+ _subscription.setNoLocal(noLocal);
+ if(messageFilter!=null)
+ {
+ _subscription.setFilters(new SimpleFilterManager(messageFilter));
+ }
+
+ try
+ {
+
+ queue.registerSubscription(_subscription, false);
+ }
+ catch (AMQException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+ }
+
+ }
+
+ public void resume(SendingLinkAttachment linkAttachment)
+ {
+ _linkAttachment = linkAttachment;
+
+ }
+
+ public void remoteDetached(final LinkEndpoint endpoint, final Detach detach)
+ {
+ //TODO
+ // if not durable or close
+ if(!TerminusDurability.UNSETTLED_STATE.equals(_durability))
+ {
+ AMQQueue queue = _subscription.getQueue();
+
+ try
+ {
+
+ queue.unregisterSubscription(_subscription);
+
+ }
+ catch (AMQException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+
+ Modified state = new Modified();
+ state.setDeliveryFailed(true);
+
+ for(UnsettledAction action : _unsettledActionMap.values())
+ {
+
+ action.process(state,Boolean.TRUE);
+ }
+ _unsettledActionMap.clear();
+
+ endpoint.close();
+
+ if(_destination instanceof ExchangeDestination
+ && (_durability == TerminusDurability.CONFIGURATION
+ || _durability == TerminusDurability.UNSETTLED_STATE))
+ {
+ try
+ {
+ queue.delete();
+ }
+ catch(AMQException e)
+ {
+ e.printStackTrace(); // TODO - Implement
+ }
+ }
+
+ if(_closeAction != null)
+ {
+ _closeAction.run();
+ }
+ }
+ else if(detach == null || detach.getError() != null)
+ {
+ _linkAttachment = null;
+ _subscription.flowStateChanged();
+ }
+ else
+ {
+ endpoint.detach();
+ }
+ }
+
+ public void start()
+ {
+ //TODO
+ }
+
+ public SendingLinkEndpoint getEndpoint()
+ {
+ return _linkAttachment == null ? null : _linkAttachment.getEndpoint() ;
+ }
+
+ public Session_1_0 getSession()
+ {
+ return _linkAttachment == null ? null : _linkAttachment.getSession();
+ }
+
+ public void flowStateChanged()
+ {
+ if(Boolean.TRUE.equals(getEndpoint().getDrain())
+ && hasCredit())
+ {
+ _draining = true;
+ }
+
+ while(!_resumeAcceptedTransfers.isEmpty() && getEndpoint().hasCreditToSend())
+ {
+ Accepted accepted = new Accepted();
+ synchronized(getLock())
+ {
+
+ Transfer xfr = new Transfer();
+ Binary dt = _resumeAcceptedTransfers.remove(0);
+ xfr.setDeliveryTag(dt);
+ xfr.setState(accepted);
+ xfr.setResume(Boolean.TRUE);
+ getEndpoint().transfer(xfr);
+ }
+
+ }
+ if(_resumeAcceptedTransfers.isEmpty())
+ {
+ _subscription.flowStateChanged();
+ }
+
+ }
+
+ boolean hasCredit()
+ {
+ return getEndpoint().getLinkCredit().compareTo(UnsignedInteger.ZERO) > 0;
+ }
+
+ public boolean isDraining()
+ {
+ return false; //TODO
+ }
+
+ public boolean drained()
+ {
+ if(getEndpoint() != null)
+ {
+ synchronized(getEndpoint().getLock())
+ {
+ if(_draining)
+ {
+ //TODO
+ getEndpoint().drained();
+ _draining = false;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public void addUnsettled(Binary tag, UnsettledAction unsettledAction, QueueEntry queueEntry)
+ {
+ _unsettledActionMap.put(tag,unsettledAction);
+ if(getTransactionId() == null)
+ {
+ _unsettledMap.put(tag, queueEntry);
+ }
+ }
+
+ public void removeUnsettled(Binary tag)
+ {
+ _unsettledActionMap.remove(tag);
+ }
+
+ public void handle(Binary deliveryTag, DeliveryState state, Boolean settled)
+ {
+ UnsettledAction action = _unsettledActionMap.get(deliveryTag);
+ boolean localSettle = false;
+ if(action != null)
+ {
+ localSettle = action.process(state, settled);
+ if(localSettle && !Boolean.TRUE.equals(settled))
+ {
+ _linkAttachment.updateDisposition(deliveryTag, state, true);
+ }
+ }
+ if(Boolean.TRUE.equals(settled) || localSettle)
+ {
+ _unsettledActionMap.remove(deliveryTag);
+ _unsettledMap.remove(deliveryTag);
+ }
+ }
+
+ ServerTransaction getTransaction(Binary transactionId)
+ {
+ return _linkAttachment.getSession().getTransaction(transactionId);
+ }
+
+ public Binary getTransactionId()
+ {
+ SendingLinkEndpoint endpoint = getEndpoint();
+ return endpoint == null ? null : endpoint.getTransactionId();
+ }
+
+ public synchronized Object getLock()
+ {
+ return _linkAttachment == null ? this : getEndpoint().getLock();
+ }
+
+ public boolean isDetached()
+ {
+ return _linkAttachment == null || getEndpoint().isDetached();
+ }
+
+ public boolean isAttached()
+ {
+ return _linkAttachment != null && getEndpoint().isAttached();
+ }
+
+ public synchronized void setLinkAttachment(SendingLinkAttachment linkAttachment)
+ {
+
+ if(_subscription.isActive())
+ {
+ _subscription.suspend();
+ }
+
+ _linkAttachment = linkAttachment;
+
+ SendingLinkEndpoint endpoint = linkAttachment.getEndpoint();
+ endpoint.setDeliveryStateHandler(this);
+ Map initialUnsettledMap = endpoint.getInitialUnsettledMap();
+ Map<Binary, QueueEntry> unsettledCopy = new HashMap<Binary, QueueEntry>(_unsettledMap);
+ _resumeAcceptedTransfers.clear();
+ _resumeFullTransfers.clear();
+
+ for(Map.Entry<Binary, QueueEntry> entry : unsettledCopy.entrySet())
+ {
+ Binary deliveryTag = entry.getKey();
+ final QueueEntry queueEntry = entry.getValue();
+ if(initialUnsettledMap == null || !initialUnsettledMap.containsKey(deliveryTag))
+ {
+ queueEntry.setRedelivered();
+ queueEntry.release();
+ _unsettledMap.remove(deliveryTag);
+ }
+ else if(initialUnsettledMap != null && (initialUnsettledMap.get(deliveryTag) instanceof Outcome))
+ {
+ Outcome outcome = (Outcome) initialUnsettledMap.get(deliveryTag);
+
+ if(outcome instanceof Accepted)
+ {
+ AutoCommitTransaction txn = new AutoCommitTransaction(_vhost.getMessageStore());
+ if(_subscription.acquires())
+ {
+ txn.dequeue(Collections.singleton(queueEntry),
+ new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+ queueEntry.discard();
+ }
+
+ public void onRollback()
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+ });
+ }
+ }
+ else if(outcome instanceof Released)
+ {
+ AutoCommitTransaction txn = new AutoCommitTransaction(_vhost.getMessageStore());
+ if(_subscription.acquires())
+ {
+ txn.dequeue(Collections.singleton(queueEntry),
+ new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+ queueEntry.release();
+ }
+
+ public void onRollback()
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+ });
+ }
+ }
+ //_unsettledMap.remove(deliveryTag);
+ initialUnsettledMap.remove(deliveryTag);
+ _resumeAcceptedTransfers.add(deliveryTag);
+ }
+ else
+ {
+ _resumeFullTransfers.add(queueEntry);
+ // exists in receivers map, but not yet got an outcome ... should resend with resume = true
+ }
+ // TODO - else
+ }
+
+
+ }
+
+ public Map getUnsettledOutcomeMap()
+ {
+ Map<Binary, QueueEntry> unsettled = new HashMap<Binary, QueueEntry>(_unsettledMap);
+
+ for(Map.Entry<Binary, QueueEntry> entry : unsettled.entrySet())
+ {
+ entry.setValue(null);
+ }
+
+ return unsettled;
+ }
+
+ public void setCloseAction(Runnable action)
+ {
+ _closeAction = action;
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
new file mode 100644
index 0000000000..48a551e42a
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
@@ -0,0 +1,446 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.transport.LinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.SessionEventListener;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.Target;
+import org.apache.qpid.amqp_1_0.type.transaction.Coordinator;
+import org.apache.qpid.amqp_1_0.type.transaction.TxnCapability;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.AMQSecurityException;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.queue.AMQQueueFactory;
+import org.apache.qpid.server.registry.IApplicationRegistry;
+import org.apache.qpid.server.txn.AutoCommitTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+import java.util.*;
+
+public class Session_1_0 implements SessionEventListener
+{
+ private static final Symbol LIFETIME_POLICY = Symbol.valueOf("lifetime-policy");
+ private IApplicationRegistry _appRegistry;
+ private VirtualHost _vhost;
+ private AutoCommitTransaction _transaction;
+
+ private final LinkedHashMap<Integer, ServerTransaction> _openTransactions =
+ new LinkedHashMap<Integer, ServerTransaction>();
+ private final Connection_1_0 _connection;
+
+
+ public Session_1_0(VirtualHost vhost, IApplicationRegistry appRegistry, final Connection_1_0 connection)
+ {
+ _appRegistry = appRegistry;
+ _vhost = vhost;
+ _transaction = new AutoCommitTransaction(vhost.getMessageStore());
+ _connection = connection;
+
+ }
+
+ public void remoteLinkCreation(final LinkEndpoint endpoint)
+ {
+
+
+ Destination destination;
+ Link_1_0 link = null;
+ Error error = null;
+
+ final LinkRegistry linkRegistry = _vhost.getLinkRegistry(endpoint.getSession().getConnection().getRemoteContainerId());
+
+
+ if(endpoint.getRole() == Role.SENDER)
+ {
+
+ SendingLink_1_0 previousLink = linkRegistry.getDurableSendingLink(endpoint.getName());
+
+ if(previousLink == null)
+ {
+
+ Target target = (Target) endpoint.getTarget();
+ Source source = (Source) endpoint.getSource();
+
+
+ if(source != null)
+ {
+ if(Boolean.TRUE.equals(source.getDynamic()))
+ {
+ AMQQueue tempQueue = createTemporaryQueue(source.getDynamicNodeProperties());
+ source.setAddress(tempQueue.getName());
+ }
+ String addr = source.getAddress();
+ AMQQueue queue = _vhost.getQueueRegistry().getQueue(addr);
+ if(queue != null)
+ {
+
+ destination = new QueueDestination(queue);
+
+
+
+ }
+ else
+ {
+ Exchange exchg = _vhost.getExchangeRegistry().getExchange(addr);
+ if(exchg != null)
+ {
+ destination = new ExchangeDestination(exchg, source.getDurable(), source.getExpiryPolicy());
+ }
+ else
+ {
+
+ endpoint.setSource(null);
+ destination = null;
+ }
+ }
+
+ }
+ else
+ {
+ destination = null;
+ }
+
+ if(destination != null)
+ {
+ final SendingLinkEndpoint sendingLinkEndpoint = (SendingLinkEndpoint) endpoint;
+ try
+ {
+ final SendingLink_1_0 sendingLink = new SendingLink_1_0(new SendingLinkAttachment(this, sendingLinkEndpoint),
+ _vhost,
+ (SendingDestination) destination
+ );
+ sendingLinkEndpoint.setLinkEventListener(sendingLink);
+ link = sendingLink;
+ if(TerminusDurability.UNSETTLED_STATE.equals(source.getDurable()))
+ {
+ linkRegistry.registerSendingLink(endpoint.getName(), sendingLink);
+ }
+ }
+ catch(AmqpErrorException e)
+ {
+ e.printStackTrace();
+ destination = null;
+ sendingLinkEndpoint.setSource(null);
+ error = e.getError();
+ }
+ }
+ }
+ else
+ {
+ Source newSource = (Source) endpoint.getSource();
+
+ Source oldSource = (Source) previousLink.getEndpoint().getSource();
+ final TerminusDurability newSourceDurable = newSource == null ? null : newSource.getDurable();
+ if(newSourceDurable != null)
+ {
+ oldSource.setDurable(newSourceDurable);
+ if(newSourceDurable.equals(TerminusDurability.NONE))
+ {
+ linkRegistry.unregisterSendingLink(endpoint.getName());
+ }
+ }
+ endpoint.setSource(oldSource);
+ SendingLinkEndpoint sendingLinkEndpoint = (SendingLinkEndpoint) endpoint;
+ previousLink.setLinkAttachment(new SendingLinkAttachment(this, sendingLinkEndpoint));
+ sendingLinkEndpoint.setLinkEventListener(previousLink);
+ link = previousLink;
+ endpoint.setLocalUnsettled(previousLink.getUnsettledOutcomeMap());
+ }
+ }
+ else
+ {
+ if(endpoint.getTarget() instanceof Coordinator)
+ {
+ Coordinator coordinator = (Coordinator) endpoint.getTarget();
+ TxnCapability[] capabilities = coordinator.getCapabilities();
+ boolean localTxn = false;
+ boolean multiplePerSession = false;
+ if(capabilities != null)
+ {
+ for(TxnCapability capability : capabilities)
+ {
+ if(capability.equals(TxnCapability.LOCAL_TXN))
+ {
+ localTxn = true;
+ }
+ else if(capability.equals(TxnCapability.MULTI_TXNS_PER_SSN))
+ {
+ multiplePerSession = true;
+ }
+ else
+ {
+ error = new Error();
+ error.setCondition(AmqpError.NOT_IMPLEMENTED);
+ error.setDescription("Unsupported capability: " + capability);
+ break;
+ }
+ }
+ }
+
+ /* if(!localTxn)
+ {
+ capabilities.add(TxnCapabilities.LOCAL_TXN);
+ }*/
+
+ final ReceivingLinkEndpoint receivingLinkEndpoint = (ReceivingLinkEndpoint) endpoint;
+ final TxnCoordinatorLink_1_0 coordinatorLink =
+ new TxnCoordinatorLink_1_0(_vhost, this, receivingLinkEndpoint, _openTransactions);
+ receivingLinkEndpoint.setLinkEventListener(coordinatorLink);
+ link = coordinatorLink;
+
+
+ }
+ else
+ {
+
+ ReceivingLink_1_0 previousLink = linkRegistry.getDurableReceivingLink(endpoint.getName());
+
+ if(previousLink == null)
+ {
+
+ Target target = (Target) endpoint.getTarget();
+
+ if(target != null)
+ {
+ if(Boolean.TRUE.equals(target.getDynamic()))
+ {
+
+ AMQQueue tempQueue = createTemporaryQueue(target.getDynamicNodeProperties());
+ target.setAddress(tempQueue.getName());
+ }
+
+ String addr = target.getAddress();
+ Exchange exchg = _vhost.getExchangeRegistry().getExchange(addr);
+ if(exchg != null)
+ {
+ destination = new ExchangeDestination(exchg, target.getDurable(),
+ target.getExpiryPolicy());
+ }
+ else
+ {
+ AMQQueue queue = _vhost.getQueueRegistry().getQueue(addr);
+ if(queue != null)
+ {
+
+ destination = new QueueDestination(queue);
+ }
+ else
+ {
+ endpoint.setTarget(null);
+ destination = null;
+ }
+
+ }
+
+
+ }
+ else
+ {
+ destination = null;
+ }
+ if(destination != null)
+ {
+ final ReceivingLinkEndpoint receivingLinkEndpoint = (ReceivingLinkEndpoint) endpoint;
+ final ReceivingLink_1_0 receivingLink = new ReceivingLink_1_0(new ReceivingLinkAttachment(this, receivingLinkEndpoint), _vhost,
+ (ReceivingDestination) destination);
+ receivingLinkEndpoint.setLinkEventListener(receivingLink);
+ link = receivingLink;
+ if(TerminusDurability.UNSETTLED_STATE.equals(target.getDurable()))
+ {
+ linkRegistry.registerReceivingLink(endpoint.getName(), receivingLink);
+ }
+ }
+ }
+ else
+ {
+ ReceivingLinkEndpoint receivingLinkEndpoint = (ReceivingLinkEndpoint) endpoint;
+ previousLink.setLinkAttachment(new ReceivingLinkAttachment(this, receivingLinkEndpoint));
+ receivingLinkEndpoint.setLinkEventListener(previousLink);
+ link = previousLink;
+ endpoint.setLocalUnsettled(previousLink.getUnsettledOutcomeMap());
+
+ }
+ }
+ }
+
+ endpoint.attach();
+
+ if(link == null)
+ {
+ if(error == null)
+ {
+ error = new Error();
+ error.setCondition(AmqpError.NOT_FOUND);
+ }
+ endpoint.detach(error);
+ }
+ else
+ {
+ link.start();
+ }
+ }
+
+
+ private AMQQueue createTemporaryQueue(Map properties)
+ {
+ final String queueName = UUID.randomUUID().toString();
+ AMQQueue queue = null;
+ try
+ {
+ LifetimePolicy lifetimePolicy = properties == null
+ ? null
+ : (LifetimePolicy) properties.get(LIFETIME_POLICY);
+
+ final AMQQueue tempQueue = queue = AMQQueueFactory.createAMQQueueImpl( UUIDGenerator.generateUUID(),
+ queueName,
+ false, // durable
+ null, // owner
+ false, // autodelete
+ false, // exclusive
+ _vhost,
+ properties);
+
+
+
+ if (lifetimePolicy == null || lifetimePolicy instanceof DeleteOnClose)
+ {
+ final Connection_1_0.Task deleteQueueTask =
+ new Connection_1_0.Task()
+ {
+ public void doTask(Connection_1_0 session)
+ {
+ if (_vhost.getQueueRegistry().getQueue(queueName) == tempQueue)
+ {
+ try
+ {
+ tempQueue.delete();
+ }
+ catch (AMQException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+ }
+ }
+ };
+
+ _connection.addConnectionCloseTask(deleteQueueTask);
+
+ queue.addQueueDeleteTask(new AMQQueue.Task()
+ {
+ public void doTask(AMQQueue queue)
+ {
+ _connection.removeConnectionCloseTask(deleteQueueTask);
+ }
+
+
+ });
+ }
+ else if(lifetimePolicy instanceof DeleteOnNoLinks)
+ {
+
+ }
+ else if(lifetimePolicy instanceof DeleteOnNoMessages)
+ {
+
+ }
+ else if(lifetimePolicy instanceof DeleteOnNoLinksOrMessages)
+ {
+
+ }
+ }
+ catch (AMQSecurityException e)
+ {
+ e.printStackTrace(); //TODO.
+ } catch (AMQException e)
+ {
+ e.printStackTrace(); //TODO
+ }
+
+ return queue;
+ }
+
+ public ServerTransaction getTransaction(Binary transactionId)
+ {
+ // TODO should treat invalid id differently to null
+ ServerTransaction transaction = _openTransactions.get(binaryToInteger(transactionId));
+ return transaction == null ? _transaction : transaction;
+ }
+
+ public void remoteEnd(End end)
+ {
+ Iterator<Map.Entry<Integer, ServerTransaction>> iter = _openTransactions.entrySet().iterator();
+
+ while(iter.hasNext())
+ {
+ Map.Entry<Integer, ServerTransaction> entry = iter.next();
+ entry.getValue().rollback();
+ iter.remove();
+ }
+
+ }
+
+ Integer binaryToInteger(final Binary txnId)
+ {
+ if(txnId == null)
+ {
+ return null;
+ }
+
+ if(txnId.getLength() > 4)
+ throw new IllegalArgumentException();
+
+ int id = 0;
+ byte[] data = txnId.getArray();
+ for(int i = 0; i < txnId.getLength(); i++)
+ {
+ id <<= 8;
+ id += data[i+txnId.getArrayOffset()];
+ }
+
+ return id;
+
+ }
+
+ Binary integerToBinary(final int txnId)
+ {
+ byte[] data = new byte[4];
+ data[3] = (byte) (txnId & 0xff);
+ data[2] = (byte) ((txnId & 0xff00) >> 8);
+ data[1] = (byte) ((txnId & 0xff0000) >> 16);
+ data[0] = (byte) ((txnId & 0xff000000) >> 24);
+ return new Binary(data);
+
+ }
+
+ public void forceEnd()
+ {
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java
new file mode 100644
index 0000000000..08926d000d
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/Subscription_1_0.java
@@ -0,0 +1,634 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.ReentrantLock;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.amqp_1_0.codec.ValueHandler;
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoder;
+import org.apache.qpid.amqp_1_0.messaging.SectionEncoderImpl;
+import org.apache.qpid.amqp_1_0.transport.SendingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.type.AmqpErrorException;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.Outcome;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.codec.AMQPDescribedTypeRegistry;
+import org.apache.qpid.amqp_1_0.type.messaging.Accepted;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.Modified;
+import org.apache.qpid.amqp_1_0.type.messaging.Released;
+import org.apache.qpid.amqp_1_0.type.messaging.Source;
+import org.apache.qpid.amqp_1_0.type.messaging.StdDistMode;
+import org.apache.qpid.amqp_1_0.type.transaction.TransactionalState;
+import org.apache.qpid.amqp_1_0.type.transport.SenderSettleMode;
+import org.apache.qpid.amqp_1_0.type.transport.Transfer;
+import org.apache.qpid.server.filter.FilterManager;
+import org.apache.qpid.server.logging.LogActor;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.queue.QueueEntry;
+import org.apache.qpid.server.subscription.Subscription;
+import org.apache.qpid.server.txn.ServerTransaction;
+
+class Subscription_1_0 implements Subscription
+{
+ private SendingLink_1_0 _link;
+
+ private AMQQueue _queue;
+
+ private final AtomicReference<State> _state = new AtomicReference<State>(State.SUSPENDED);
+
+ private final QueueEntry.SubscriptionAcquiredState _owningState = new QueueEntry.SubscriptionAcquiredState(this);
+ private final QueueEntry.SubscriptionAssignedState _assignedState = new QueueEntry.SubscriptionAssignedState(this);
+ private final long _id;
+ private final boolean _acquires;
+ private AMQQueue.Context _queueContext;
+ private Map<String, Object> _properties = new ConcurrentHashMap<String, Object>();
+ private ReentrantLock _stateChangeLock = new ReentrantLock();
+
+ private boolean _noLocal;
+ private FilterManager _filters;
+
+ private long _deliveryTag = 0L;
+ private StateListener _stateListener;
+
+ private Binary _transactionId;
+ private final AMQPDescribedTypeRegistry _typeRegistry = AMQPDescribedTypeRegistry.newInstance()
+ .registerTransportLayer()
+ .registerMessagingLayer()
+ .registerTransactionLayer()
+ .registerSecurityLayer();
+ private SectionEncoder _sectionEncoder = new SectionEncoderImpl(_typeRegistry);
+
+ public Subscription_1_0(final SendingLink_1_0 link, final QueueDestination destination)
+ {
+ this(link, destination, ((Source)link.getEndpoint().getSource()).getDistributionMode() != StdDistMode.COPY);
+ }
+
+ public Subscription_1_0(final SendingLink_1_0 link, final QueueDestination destination, boolean acquires)
+ {
+ _link = link;
+ _queue = destination.getQueue();
+ _id = getEndpoint().getLocalHandle().longValue();
+ _acquires = acquires;
+ }
+
+ private SendingLinkEndpoint getEndpoint()
+ {
+ return _link.getEndpoint();
+ }
+
+ public LogActor getLogActor()
+ {
+ return null; //TODO
+ }
+
+ public boolean isTransient()
+ {
+ return true; //TODO
+ }
+
+ public AMQQueue getQueue()
+ {
+ return _queue;
+ }
+
+ public QueueEntry.SubscriptionAcquiredState getOwningState()
+ {
+ return _owningState;
+ }
+
+ public QueueEntry.SubscriptionAssignedState getAssignedState()
+ {
+ return _assignedState;
+ }
+
+ public void setQueue(final AMQQueue queue, final boolean exclusive)
+ {
+ //TODO
+ }
+
+ public void setNoLocal(final boolean noLocal)
+ {
+ _noLocal = noLocal;
+ }
+
+ public boolean isNoLocal()
+ {
+ return _noLocal;
+ }
+
+ public long getSubscriptionID()
+ {
+ return _id;
+ }
+
+ public boolean isSuspended()
+ {
+ return !isActive();// || !getEndpoint().hasCreditToSend();
+
+ }
+
+ public boolean hasInterest(final QueueEntry entry)
+ {
+ return !(_noLocal && (entry.getMessage() instanceof Message_1_0)
+ && ((Message_1_0)entry.getMessage()).getSession() == getSession())
+ && checkFilters(entry);
+
+ }
+
+ private boolean checkFilters(final QueueEntry entry)
+ {
+ return (_filters == null) || _filters.allAllow(entry);
+ }
+
+ public boolean isClosed()
+ {
+ return !getEndpoint().isAttached();
+ }
+
+ public boolean acquires()
+ {
+ return _acquires;
+ }
+
+ public boolean seesRequeues()
+ {
+ // TODO
+ return acquires();
+ }
+
+ public void close()
+ {
+ getEndpoint().detach();
+ }
+
+ public void send(QueueEntry entry, boolean batch) throws AMQException
+ {
+ // TODO
+ send(entry);
+ }
+
+ public void flushBatched()
+ {
+ // TODO
+ }
+
+ public void send(final QueueEntry queueEntry) throws AMQException
+ {
+ //TODO
+ ServerMessage serverMessage = queueEntry.getMessage();
+ if(serverMessage instanceof Message_1_0)
+ {
+ Message_1_0 message = (Message_1_0) serverMessage;
+ Transfer transfer = new Transfer();
+ //TODO
+
+
+ List<ByteBuffer> fragments = message.getFragments();
+ ByteBuffer payload;
+ if(fragments.size() == 1)
+ {
+ payload = fragments.get(0);
+ }
+ else
+ {
+ int size = 0;
+ for(ByteBuffer fragment : fragments)
+ {
+ size += fragment.remaining();
+ }
+
+ payload = ByteBuffer.allocate(size);
+
+ for(ByteBuffer fragment : fragments)
+ {
+ payload.put(fragment.duplicate());
+ }
+
+ payload.flip();
+ }
+
+ if(queueEntry.getDeliveryCount() != 0)
+ {
+ payload = payload.duplicate();
+ ValueHandler valueHandler = new ValueHandler(_typeRegistry);
+
+ Header oldHeader = null;
+ try
+ {
+ ByteBuffer encodedBuf = payload.duplicate();
+ Object value = valueHandler.parse(payload);
+ if(value instanceof Header)
+ {
+ oldHeader = (Header) value;
+ }
+ else
+ {
+ payload.position(0);
+ }
+ }
+ catch (AmqpErrorException e)
+ {
+ //TODO
+ throw new RuntimeException(e);
+ }
+
+ Header header = new Header();
+ if(oldHeader != null)
+ {
+ header.setDurable(oldHeader.getDurable());
+ header.setPriority(oldHeader.getPriority());
+ header.setTtl(oldHeader.getTtl());
+ }
+ header.setDeliveryCount(UnsignedInteger.valueOf(queueEntry.getDeliveryCount()));
+ _sectionEncoder.reset();
+ _sectionEncoder.encodeObject(header);
+ Binary encodedHeader = _sectionEncoder.getEncoding();
+
+ ByteBuffer oldPayload = payload;
+ payload = ByteBuffer.allocate(oldPayload.remaining() + encodedHeader.getLength());
+ payload.put(encodedHeader.getArray(),encodedHeader.getArrayOffset(),encodedHeader.getLength());
+ payload.put(oldPayload);
+ payload.flip();
+ }
+
+ transfer.setPayload(payload);
+ byte[] data = new byte[8];
+ ByteBuffer.wrap(data).putLong(_deliveryTag++);
+ final Binary tag = new Binary(data);
+
+ transfer.setDeliveryTag(tag);
+
+ synchronized(_link.getLock())
+ {
+ if(_link.isAttached())
+ {
+ if(SenderSettleMode.SETTLED.equals(getEndpoint().getSendingSettlementMode()))
+ {
+ transfer.setSettled(true);
+ }
+ else
+ {
+ UnsettledAction action = _acquires
+ ? new DispositionAction(tag, queueEntry)
+ : new DoNothingAction(tag, queueEntry);
+
+ _link.addUnsettled(tag, action, queueEntry);
+ }
+
+ if(_transactionId != null)
+ {
+ TransactionalState state = new TransactionalState();
+ state.setTxnId(_transactionId);
+ transfer.setState(state);
+ }
+ // TODO - need to deal with failure here
+ if(_acquires && _transactionId != null)
+ {
+ ServerTransaction txn = _link.getTransaction(_transactionId);
+ if(txn != null)
+ {
+ txn.addPostTransactionAction(new ServerTransaction.Action(){
+
+ public void postCommit()
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void onRollback()
+ {
+ if(queueEntry.isAcquiredBy(Subscription_1_0.this))
+ {
+ queueEntry.release();
+ _link.getEndpoint().updateDisposition(tag, (DeliveryState)null, true);
+
+
+ }
+ }
+ });
+ }
+
+ }
+
+ getEndpoint().transfer(transfer);
+ }
+ else
+ {
+ queueEntry.release();
+ }
+ }
+ }
+
+ }
+
+ public void queueDeleted(final AMQQueue queue)
+ {
+ //TODO
+ getEndpoint().setSource(null);
+ getEndpoint().detach();
+ }
+
+ public synchronized boolean wouldSuspend(final QueueEntry msg)
+ {
+ final boolean hasCredit = _link.isAttached() && getEndpoint().hasCreditToSend();
+ if(!hasCredit && getState() == State.ACTIVE)
+ {
+ suspend();
+ }
+
+ return !hasCredit;
+ }
+
+ public boolean trySendLock()
+ {
+ return _stateChangeLock.tryLock();
+ }
+
+ public synchronized void suspend()
+ {
+ if(_state.compareAndSet(State.ACTIVE, State.SUSPENDED))
+ {
+ _stateListener.stateChange(this, State.ACTIVE, State.SUSPENDED);
+ }
+ }
+
+ public void getSendLock()
+ {
+ _stateChangeLock.lock();
+ }
+
+ public void releaseSendLock()
+ {
+ _stateChangeLock.unlock();
+ }
+
+ public void releaseQueueEntry(QueueEntry queueEntryImpl)
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public void onDequeue(final QueueEntry queueEntry)
+ {
+ //TODO
+ }
+
+ public void restoreCredit(final QueueEntry queueEntry)
+ {
+ //TODO
+ }
+
+ public void setStateListener(final StateListener listener)
+ {
+ _stateListener = listener;
+ }
+
+ public State getState()
+ {
+ return _state.get();
+ }
+
+ public AMQQueue.Context getQueueContext()
+ {
+ return _queueContext;
+ }
+
+ public void setQueueContext(AMQQueue.Context queueContext)
+ {
+ _queueContext = queueContext;
+ }
+
+
+ public boolean isActive()
+ {
+ return getState() == State.ACTIVE;
+ }
+
+ public void set(String key, Object value)
+ {
+ _properties.put(key, value);
+ }
+
+ public Object get(String key)
+ {
+ return _properties.get(key);
+ }
+
+ public boolean isSessionTransactional()
+ {
+ return false; //TODO
+ }
+
+ public synchronized void queueEmpty()
+ {
+ if(_link.drained())
+ {
+ if(_state.compareAndSet(State.ACTIVE, State.SUSPENDED))
+ {
+ _stateListener.stateChange(this, State.ACTIVE, State.SUSPENDED);
+ }
+ }
+ }
+
+ public synchronized void flowStateChanged()
+ {
+ if(isSuspended() && getEndpoint() != null)
+ {
+ if(_state.compareAndSet(State.SUSPENDED, State.ACTIVE))
+ {
+ _stateListener.stateChange(this, State.SUSPENDED, State.ACTIVE);
+ }
+ _transactionId = _link.getTransactionId();
+ }
+ }
+
+ public Session_1_0 getSession()
+ {
+ return _link.getSession();
+ }
+
+ private class DispositionAction implements UnsettledAction
+ {
+
+ private final QueueEntry _queueEntry;
+ private final Binary _deliveryTag;
+
+ public DispositionAction(Binary tag, QueueEntry queueEntry)
+ {
+ _deliveryTag = tag;
+ _queueEntry = queueEntry;
+ }
+
+ public boolean process(DeliveryState state, final Boolean settled)
+ {
+
+ Binary transactionId = null;
+ final Outcome outcome;
+ // If disposition is settled this overrides the txn?
+ if(state instanceof TransactionalState)
+ {
+ transactionId = ((TransactionalState)state).getTxnId();
+ outcome = ((TransactionalState)state).getOutcome();
+ }
+ else if (state instanceof Outcome)
+ {
+ outcome = (Outcome) state;
+ }
+ else
+ {
+ outcome = null;
+ }
+
+
+ ServerTransaction txn = _link.getTransaction(transactionId);
+
+ if(outcome instanceof Accepted)
+ {
+ txn.dequeue(_queueEntry.getQueue(), _queueEntry.getMessage(),
+ new ServerTransaction.Action()
+ {
+
+ public void postCommit()
+ {
+ if(_queueEntry.isAcquiredBy(Subscription_1_0.this))
+ {
+ _queueEntry.discard();
+ }
+ }
+
+ public void onRollback()
+ {
+
+ }
+ });
+ txn.addPostTransactionAction(new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+ //_link.getEndpoint().settle(_deliveryTag);
+ _link.getEndpoint().updateDisposition(_deliveryTag, (DeliveryState)outcome, true);
+ _link.getEndpoint().sendFlowConditional();
+ }
+
+ public void onRollback()
+ {
+ if(Boolean.TRUE.equals(settled))
+ {
+ final Modified modified = new Modified();
+ modified.setDeliveryFailed(true);
+ _link.getEndpoint().updateDisposition(_deliveryTag, modified, true);
+ _link.getEndpoint().sendFlowConditional();
+ }
+ }
+ });
+ }
+ else if(outcome instanceof Released)
+ {
+ txn.addPostTransactionAction(new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+
+ _queueEntry.release();
+ _link.getEndpoint().settle(_deliveryTag);
+ }
+
+ public void onRollback()
+ {
+ _link.getEndpoint().settle(_deliveryTag);
+ }
+ });
+ }
+
+ else if(outcome instanceof Modified)
+ {
+ txn.addPostTransactionAction(new ServerTransaction.Action()
+ {
+ public void postCommit()
+ {
+
+ _queueEntry.release();
+ if(Boolean.TRUE.equals(((Modified)outcome).getDeliveryFailed()))
+ {
+ _queueEntry.incrementDeliveryCount();
+ }
+ _link.getEndpoint().settle(_deliveryTag);
+ }
+
+ public void onRollback()
+ {
+ if(Boolean.TRUE.equals(settled))
+ {
+ final Modified modified = new Modified();
+ modified.setDeliveryFailed(true);
+ _link.getEndpoint().updateDisposition(_deliveryTag, modified, true);
+ _link.getEndpoint().sendFlowConditional();
+ }
+ }
+ });
+ }
+
+ return (transactionId == null && outcome != null);
+ }
+ }
+
+ private class DoNothingAction implements UnsettledAction
+ {
+ public DoNothingAction(final Binary tag,
+ final QueueEntry queueEntry)
+ {
+ }
+
+ public boolean process(final DeliveryState state, final Boolean settled)
+ {
+ Binary transactionId = null;
+ Outcome outcome = null;
+ // If disposition is settled this overrides the txn?
+ if(state instanceof TransactionalState)
+ {
+ transactionId = ((TransactionalState)state).getTxnId();
+ outcome = ((TransactionalState)state).getOutcome();
+ }
+ else if (state instanceof Outcome)
+ {
+ outcome = (Outcome) state;
+ }
+ return true;
+ }
+ }
+
+ public FilterManager getFilters()
+ {
+ return _filters;
+ }
+
+ public void setFilters(final FilterManager filters)
+ {
+ _filters = filters;
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/TxnCoordinatorLink_1_0.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/TxnCoordinatorLink_1_0.java
new file mode 100644
index 0000000000..a05d14816a
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/TxnCoordinatorLink_1_0.java
@@ -0,0 +1,195 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoder;
+import org.apache.qpid.amqp_1_0.messaging.SectionDecoderImpl;
+import org.apache.qpid.amqp_1_0.transport.LinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkEndpoint;
+import org.apache.qpid.amqp_1_0.transport.ReceivingLinkListener;
+import org.apache.qpid.amqp_1_0.type.*;
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+import org.apache.qpid.amqp_1_0.type.messaging.*;
+import org.apache.qpid.amqp_1_0.type.transaction.Declare;
+import org.apache.qpid.amqp_1_0.type.transaction.Declared;
+import org.apache.qpid.amqp_1_0.type.transaction.Discharge;
+import org.apache.qpid.amqp_1_0.type.transport.*;
+import org.apache.qpid.amqp_1_0.type.transport.Error;
+import org.apache.qpid.server.txn.LocalTransaction;
+import org.apache.qpid.server.txn.ServerTransaction;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+
+import java.nio.ByteBuffer;
+import java.util.*;
+
+public class TxnCoordinatorLink_1_0 implements ReceivingLinkListener, Link_1_0
+{
+ private VirtualHost _vhost;
+ private ReceivingLinkEndpoint _endpoint;
+
+ private ArrayList<Transfer> _incompleteMessage;
+ private SectionDecoder _sectionDecoder;
+ private LinkedHashMap<Integer, ServerTransaction> _openTransactions;
+ private Session_1_0 _session;
+
+
+ public TxnCoordinatorLink_1_0(VirtualHost vhost,
+ Session_1_0 session_1_0, ReceivingLinkEndpoint endpoint,
+ LinkedHashMap<Integer, ServerTransaction> openTransactions)
+ {
+ _vhost = vhost;
+ _session = session_1_0;
+ _endpoint = endpoint;
+ _sectionDecoder = new SectionDecoderImpl(endpoint.getSession().getConnection().getDescribedTypeRegistry());
+ _openTransactions = openTransactions;
+ }
+
+ public void messageTransfer(Transfer xfr)
+ {
+ // TODO - cope with fragmented messages
+
+ ByteBuffer payload = null;
+
+
+ if(Boolean.TRUE.equals(xfr.getMore()) && _incompleteMessage == null)
+ {
+ _incompleteMessage = new ArrayList<Transfer>();
+ _incompleteMessage.add(xfr);
+ return;
+ }
+ else if(_incompleteMessage != null)
+ {
+ _incompleteMessage.add(xfr);
+ if(Boolean.TRUE.equals(xfr.getMore()))
+ {
+ return;
+ }
+
+ int size = 0;
+ for(Transfer t : _incompleteMessage)
+ {
+ size += t.getPayload().limit();
+ }
+ payload = ByteBuffer.allocate(size);
+ for(Transfer t : _incompleteMessage)
+ {
+ payload.put(t.getPayload().duplicate());
+ }
+ payload.flip();
+ _incompleteMessage=null;
+
+ }
+ else
+ {
+ payload = xfr.getPayload();
+ }
+
+
+ // Only interested int he amqp-value section that holds the message to the co-ordinator
+ try
+ {
+ List<Section> sections = _sectionDecoder.parseAll(payload);
+
+ for(Section section : sections)
+ {
+ if(section instanceof AmqpValue)
+ {
+ Object command = ((AmqpValue) section).getValue();
+
+ if(command instanceof Declare)
+ {
+ Integer txnId = Integer.valueOf(0);
+ Iterator<Integer> existingTxn = _openTransactions.keySet().iterator();
+ while(existingTxn.hasNext())
+ {
+ txnId = existingTxn.next();
+ }
+ txnId = Integer.valueOf(txnId.intValue() + 1);
+
+ _openTransactions.put(txnId, new LocalTransaction(_vhost.getMessageStore()));
+
+ Declared state = new Declared();
+
+
+
+ state.setTxnId(_session.integerToBinary(txnId));
+ _endpoint.updateDisposition(xfr.getDeliveryTag(), state, true);
+
+ }
+ else if(command instanceof Discharge)
+ {
+ Discharge discharge = (Discharge) command;
+
+ DeliveryState state = xfr.getState();
+ discharge(_session.binaryToInteger(discharge.getTxnId()), discharge.getFail());
+ _endpoint.updateDisposition(xfr.getDeliveryTag(), new Accepted(), true);
+
+ }
+ }
+ }
+
+ }
+ catch (AmqpErrorException e)
+ {
+ e.printStackTrace(); //TODO.
+ }
+
+ }
+
+ public void remoteDetached(LinkEndpoint endpoint, Detach detach)
+ {
+ //TODO
+ endpoint.detach();
+ }
+
+ private Error discharge(Integer transactionId, boolean fail)
+ {
+ Error error = null;
+ ServerTransaction txn = _openTransactions.get(transactionId);
+ if(txn != null)
+ {
+ if(fail)
+ {
+ txn.rollback();
+ }
+ else
+ {
+ txn.commit();
+ }
+ _openTransactions.remove(transactionId);
+ }
+ else
+ {
+ error = new Error();
+ error.setCondition(AmqpError.NOT_FOUND);
+ error.setDescription("Unkown transactionId" + transactionId);
+ }
+ return error;
+ }
+
+
+
+ public void start()
+ {
+ _endpoint.setLinkCredit(UnsignedInteger.ONE);
+ _endpoint.setCreditWindow();
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/UnsettledAction.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/UnsettledAction.java
new file mode 100644
index 0000000000..c497cc5146
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/UnsettledAction.java
@@ -0,0 +1,8 @@
+package org.apache.qpid.server.protocol.v1_0;
+
+import org.apache.qpid.amqp_1_0.type.DeliveryState;
+
+public interface UnsettledAction
+{
+ boolean process(DeliveryState state, Boolean settled);
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQPriorityQueue.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQPriorityQueue.java
index f6bf6626a0..46c2a635b7 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQPriorityQueue.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQPriorityQueue.java
@@ -23,19 +23,20 @@ package org.apache.qpid.server.queue;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Map;
+import java.util.UUID;
public class AMQPriorityQueue extends OutOfOrderQueue
{
- protected AMQPriorityQueue(final String name,
+ protected AMQPriorityQueue(UUID id,
+ final String name,
final boolean durable,
final String owner,
final boolean autoDelete,
boolean exclusive,
final VirtualHost virtualHost,
- Map<String, Object> arguments,
- int priorities)
+ Map<String, Object> arguments, int priorities)
{
- super(name, durable, owner, autoDelete, exclusive, virtualHost, new PriorityQueueList.Factory(priorities), arguments);
+ super(id, name, durable, owner, autoDelete, exclusive, virtualHost, new PriorityQueueList.Factory(priorities), arguments);
}
public int getPriorities()
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java
index aca5891d2e..f2b7d7c56b 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java
@@ -20,6 +20,10 @@
*/
package org.apache.qpid.server.queue;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
import org.apache.qpid.AMQException;
import org.apache.qpid.AMQSecurityException;
import org.apache.qpid.exchange.ExchangeDefaults;
@@ -30,12 +34,10 @@ import org.apache.qpid.server.configuration.ServerConfiguration;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.exchange.ExchangeFactory;
import org.apache.qpid.server.exchange.ExchangeRegistry;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
-import java.util.HashMap;
-import java.util.Map;
-
public class AMQQueueFactory
{
public static final String X_QPID_PRIORITIES = "x-qpid-priorities";
@@ -166,8 +168,13 @@ public class AMQQueueFactory
}
};
-
- /** @see #createAMQQueueImpl(String, boolean, String, boolean, boolean, VirtualHost, Map) */
+ /**
+ * Creates a new queue with a random id.
+ *
+ * @see #createAMQQueueImpl(UUID, String, boolean, String, boolean, boolean, VirtualHost, Map)
+ * @deprecated because only called from unit tests
+ * */
+ @Deprecated
public static AMQQueue createAMQQueueImpl(AMQShortString name,
boolean durable,
AMQShortString owner,
@@ -175,22 +182,28 @@ public class AMQQueueFactory
boolean exclusive,
VirtualHost virtualHost, final FieldTable arguments) throws AMQException
{
- return createAMQQueueImpl(name == null ? null : name.toString(),
+ return createAMQQueueImpl(UUIDGenerator.generateUUID(),
+ name == null ? null : name.toString(),
durable,
owner == null ? null : owner.toString(),
autoDelete,
- exclusive,
- virtualHost, FieldTable.convertToMap(arguments));
+ exclusive, virtualHost, FieldTable.convertToMap(arguments));
}
-
- public static AMQQueue createAMQQueueImpl(String queueName,
+ /**
+ * @param id the id to use. If default then one is generated from queueName. TODO check correctness of calls that pass a null value.
+ */
+ public static AMQQueue createAMQQueueImpl(UUID id,
+ String queueName,
boolean durable,
String owner,
boolean autoDelete,
- boolean exclusive,
- VirtualHost virtualHost, Map<String, Object> arguments) throws AMQSecurityException, AMQException
+ boolean exclusive, VirtualHost virtualHost, Map<String, Object> arguments) throws AMQSecurityException, AMQException
{
+ if (id == null)
+ {
+ throw new IllegalArgumentException("Queue id must not be null");
+ }
if (queueName == null)
{
throw new IllegalArgumentException("Queue name must not be null");
@@ -241,19 +254,19 @@ public class AMQQueueFactory
AMQQueue q;
if(sortingKey != null)
{
- q = new SortedQueue(queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, sortingKey);
+ q = new SortedQueue(id, queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, sortingKey);
}
else if(conflationKey != null)
{
- q = new ConflationQueue(queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, conflationKey);
+ q = new ConflationQueue(id, queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, conflationKey);
}
else if(priorities > 1)
{
- q = new AMQPriorityQueue(queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, priorities);
+ q = new AMQPriorityQueue(id, queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments, priorities);
}
else
{
- q = new SimpleAMQQueue(queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments);
+ q = new SimpleAMQQueue(id, queueName, durable, owner, autoDelete, exclusive, virtualHost, arguments);
}
//Register the new queue
@@ -287,12 +300,12 @@ public class AMQQueueFactory
if(dlExchange == null)
{
- dlExchange = exchangeFactory.createExchange(new AMQShortString(dlExchangeName), ExchangeDefaults.FANOUT_EXCHANGE_CLASS, true, false, 0);
+ dlExchange = exchangeFactory.createExchange(UUIDGenerator.generateUUID(dlExchangeName, virtualHost.getName()), new AMQShortString(dlExchangeName), ExchangeDefaults.FANOUT_EXCHANGE_CLASS, true, false, 0);
exchangeRegistry.registerExchange(dlExchange);
//enter the dle in the persistent store
- virtualHost.getDurableConfigurationStore().createExchange(dlExchange);
+ virtualHost.getMessageStore().createExchange(dlExchange);
}
}
@@ -309,10 +322,10 @@ public class AMQQueueFactory
args.put(X_QPID_DLQ_ENABLED, false);
args.put(X_QPID_MAXIMUM_DELIVERY_COUNT, 0);
- dlQueue = createAMQQueueImpl(dlQueueName, true, owner, false, exclusive, virtualHost, args);
+ dlQueue = createAMQQueueImpl(UUIDGenerator.generateUUID(dlQueueName, virtualHost.getName()), dlQueueName, true, owner, false, exclusive, virtualHost, args);
//enter the dlq in the persistent store
- virtualHost.getDurableConfigurationStore().createQueue(dlQueue, FieldTable.convertToFieldTable(args));
+ virtualHost.getMessageStore().createQueue(dlQueue, FieldTable.convertToFieldTable(args));
}
}
@@ -364,7 +377,10 @@ public class AMQQueueFactory
arguments.put(X_QPID_DLQ_ENABLED, true);
}
- AMQQueue q = createAMQQueueImpl(queueName, durable, owner, autodelete, exclusive, host, arguments);
+ // we need queues that are defined in config to have deterministic ids.
+ UUID id = UUIDGenerator.generateUUID(queueName, host.getName());
+
+ AMQQueue q = createAMQQueueImpl(id, queueName, durable, owner, autodelete, exclusive, host, arguments);
q.configure(config);
return q;
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueue.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueue.java
index 2c645cc555..c2813bb7a5 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueue.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ConflationQueue.java
@@ -21,22 +21,23 @@
package org.apache.qpid.server.queue;
-import org.apache.qpid.server.virtualhost.VirtualHost;
-
import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.virtualhost.VirtualHost;
public class ConflationQueue extends SimpleAMQQueue
{
- protected ConflationQueue(String name,
+ protected ConflationQueue(UUID id,
+ String name,
boolean durable,
String owner,
boolean autoDelete,
boolean exclusive,
VirtualHost virtualHost,
- Map<String, Object> args,
- String conflationKey)
+ Map<String, Object> args, String conflationKey)
{
- super(name, durable, owner, autoDelete, exclusive, virtualHost, new ConflationQueueList.Factory(conflationKey), args);
+ super(id, name, durable, owner, autoDelete, exclusive, virtualHost, new ConflationQueueList.Factory(conflationKey), args);
}
public String getConflationKey()
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/DefaultQueueRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/DefaultQueueRegistry.java
index d76487073d..2493974d45 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/DefaultQueueRegistry.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/DefaultQueueRegistry.java
@@ -20,15 +20,21 @@
*/
package org.apache.qpid.server.queue;
+import org.apache.log4j.Logger;
+import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.server.exchange.DefaultExchangeRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Collection;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class DefaultQueueRegistry implements QueueRegistry
{
+ private static final Logger LOGGER = Logger.getLogger(DefaultExchangeRegistry.class);
+
private ConcurrentMap<AMQShortString, AMQQueue> _queueMap = new ConcurrentHashMap<AMQShortString, AMQQueue>();
private final VirtualHost _virtualHost;
@@ -72,4 +78,36 @@ public class DefaultQueueRegistry implements QueueRegistry
{
return getQueue(new AMQShortString(queue));
}
+
+ @Override
+ public void stopAllAndUnregisterMBeans()
+ {
+ for (final AMQQueue queue : getQueues())
+ {
+ queue.stop();
+ try
+ {
+ queue.getManagedObject().unregister();
+ }
+ catch (AMQException e)
+ {
+ LOGGER.warn("Failed to unregister mbean", e);
+ }
+ }
+ _queueMap.clear();
+ }
+
+ @Override
+ public synchronized AMQQueue getQueue(UUID queueId)
+ {
+ Collection<AMQQueue> queues = _queueMap.values();
+ for (AMQQueue queue : queues)
+ {
+ if (queue.getId().equals(queueId))
+ {
+ return queue;
+ }
+ }
+ return null;
+ }
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/OutOfOrderQueue.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/OutOfOrderQueue.java
index 53121fc031..daa5db393a 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/OutOfOrderQueue.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/OutOfOrderQueue.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.server.queue;
import org.apache.qpid.server.subscription.Subscription;
@@ -5,15 +25,16 @@ import org.apache.qpid.server.subscription.SubscriptionList;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Map;
+import java.util.UUID;
public abstract class OutOfOrderQueue extends SimpleAMQQueue
{
- protected OutOfOrderQueue(String name, boolean durable, String owner,
- boolean autoDelete, boolean exclusive, VirtualHost virtualHost,
- QueueEntryListFactory entryListFactory, Map<String, Object> arguments)
+ protected OutOfOrderQueue(UUID id, String name, boolean durable,
+ String owner, boolean autoDelete, boolean exclusive,
+ VirtualHost virtualHost, QueueEntryListFactory entryListFactory, Map<String, Object> arguments)
{
- super(name, durable, owner, autoDelete, exclusive, virtualHost, entryListFactory, arguments);
+ super(id, name, durable, owner, autoDelete, exclusive, virtualHost, entryListFactory, arguments);
}
@Override
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/PriorityQueueList.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/PriorityQueueList.java
index 05141a48a1..1d13ee66c0 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/PriorityQueueList.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/PriorityQueueList.java
@@ -25,19 +25,19 @@ import org.apache.qpid.server.message.ServerMessage;
public class PriorityQueueList implements QueueEntryList<SimpleQueueEntryImpl>
{
private final AMQQueue _queue;
- private final SimpleQueueEntryList[] _priorityLists;
+ private final PriorityQueueEntrySubList[] _priorityLists;
private final int _priorities;
private final int _priorityOffset;
public PriorityQueueList(AMQQueue queue, int priorities)
{
_queue = queue;
- _priorityLists = new SimpleQueueEntryList[priorities];
+ _priorityLists = new PriorityQueueEntrySubList[priorities];
_priorities = priorities;
_priorityOffset = 5-((priorities + 1)/2);
for(int i = 0; i < priorities; i++)
{
- _priorityLists[i] = new SimpleQueueEntryList(queue);
+ _priorityLists[i] = new PriorityQueueEntrySubList(queue);
}
}
@@ -161,4 +161,48 @@ public class PriorityQueueList implements QueueEntryList<SimpleQueueEntryImpl>
return new PriorityQueueList(queue, _priorities);
}
}
+
+ private static class PriorityQueueEntrySubList extends SimpleQueueEntryList
+ {
+ public PriorityQueueEntrySubList(AMQQueue queue)
+ {
+ super(queue);
+ }
+
+ @Override
+ protected PriorityQueueEntryImpl createQueueEntry(ServerMessage<?> message)
+ {
+ return new PriorityQueueEntryImpl(this, message);
+ }
+ }
+
+ private static class PriorityQueueEntryImpl extends SimpleQueueEntryImpl
+ {
+ public PriorityQueueEntryImpl(PriorityQueueEntrySubList queueEntryList, ServerMessage<?> message)
+ {
+ super(queueEntryList, message);
+ }
+
+ @Override
+ public int compareTo(final QueueEntry o)
+ {
+ byte thisPriority = getMessageHeader().getPriority();
+ byte otherPriority = o.getMessageHeader().getPriority();
+
+ if(thisPriority != otherPriority)
+ {
+ /*
+ * Different priorities, so answer can only be greater than or less than
+ *
+ * A message with higher priority (e.g. 5) is conceptually 'earlier' in the
+ * priority queue than one with a lower priority (e.g. 4).
+ */
+ return thisPriority > otherPriority ? -1 : 1;
+ }
+ else
+ {
+ return super.compareTo(o);
+ }
+ }
+ }
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueContext.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueContext.java
index c8f04c7b96..79279b44c7 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueContext.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueContext.java
@@ -52,4 +52,13 @@ final class QueueContext implements AMQQueue.Context
{
return _releasedEntry;
}
+
+ @Override
+ public String toString()
+ {
+ return "QueueContext{" +
+ "_lastSeenEntry=" + _lastSeenEntry +
+ ", _releasedEntry=" + _releasedEntry +
+ '}';
+ }
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java
index 6c9e918324..209553e8fa 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryImpl.java
@@ -227,9 +227,10 @@ public abstract class QueueEntryImpl implements QueueEntry
public void release()
{
EntryState state = _state;
-
+
if((state.getState() == State.ACQUIRED) &&_stateUpdater.compareAndSet(this, state, AVAILABLE_STATE))
{
+
if(state instanceof SubscriptionAcquiredState)
{
getQueue().decrementUnackedMsgCount();
@@ -254,6 +255,7 @@ public abstract class QueueEntryImpl implements QueueEntry
routeToAlternate();
}
}
+
}
public boolean releaseButRetain()
@@ -267,7 +269,6 @@ public abstract class QueueEntryImpl implements QueueEntry
Subscription sub = ((SubscriptionAcquiredState) state).getSubscription();
if(_stateUpdater.compareAndSet(this, state, sub.getAssignedState()))
{
- System.err.println("Message released (and retained)" + getMessage().getMessageNumber());
getQueue().requeue(this);
if(_stateChangeListeners != null)
{
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryVisitor.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryVisitor.java
new file mode 100644
index 0000000000..1578d21321
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueEntryVisitor.java
@@ -0,0 +1,22 @@
+package org.apache.qpid.server.queue;
+
+/**
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+* <p/>
+* http://www.apache.org/licenses/LICENSE-2.0
+* <p/>
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+public interface QueueEntryVisitor
+{
+ boolean visit(QueueEntry entry);
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueRegistry.java
index 80f6bd1493..72a54c9889 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueRegistry.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/QueueRegistry.java
@@ -24,6 +24,7 @@ import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Collection;
+import java.util.UUID;
public interface QueueRegistry
{
@@ -40,4 +41,8 @@ public interface QueueRegistry
Collection<AMQQueue> getQueues();
AMQQueue getQueue(String queue);
+
+ void stopAllAndUnregisterMBeans();
+
+ AMQQueue getQueue(UUID queueId);
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleAMQQueue.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleAMQQueue.java
index cc1041d9de..d7eb304c92 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleAMQQueue.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleAMQQueue.java
@@ -191,29 +191,29 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
private int _maximumDeliveryCount = ApplicationRegistry.getInstance().getConfiguration().getMaxDeliveryCount();
private final MessageGroupManager _messageGroupManager;
- protected SimpleAMQQueue(AMQShortString name, boolean durable, AMQShortString owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, Map<String,Object> arguments)
+ protected SimpleAMQQueue(UUID id, AMQShortString name, boolean durable, AMQShortString owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, Map<String,Object> arguments)
{
- this(name, durable, owner, autoDelete, exclusive, virtualHost,new SimpleQueueEntryList.Factory(), arguments);
+ this(id, name, durable, owner, autoDelete, exclusive,virtualHost, new SimpleQueueEntryList.Factory(), arguments);
}
- public SimpleAMQQueue(String queueName, boolean durable, String owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, Map<String, Object> arguments)
+ public SimpleAMQQueue(UUID id, String queueName, boolean durable, String owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, Map<String, Object> arguments)
{
- this(queueName, durable, owner, autoDelete, exclusive, virtualHost, new SimpleQueueEntryList.Factory(), arguments);
+ this(id, queueName, durable, owner, autoDelete, exclusive, virtualHost, new SimpleQueueEntryList.Factory(), arguments);
}
- public SimpleAMQQueue(String queueName, boolean durable, String owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, QueueEntryListFactory entryListFactory, Map<String, Object> arguments)
+ public SimpleAMQQueue(UUID id, String queueName, boolean durable, String owner, boolean autoDelete, boolean exclusive, VirtualHost virtualHost, QueueEntryListFactory entryListFactory, Map<String, Object> arguments)
{
- this(queueName == null ? null : new AMQShortString(queueName), durable, owner == null ? null : new AMQShortString(owner), autoDelete, exclusive, virtualHost, entryListFactory, arguments);
+ this(id, queueName == null ? null : new AMQShortString(queueName), durable, owner == null ? null : new AMQShortString(owner), autoDelete, exclusive, virtualHost, entryListFactory, arguments);
}
- protected SimpleAMQQueue(AMQShortString name,
+ protected SimpleAMQQueue(UUID id,
+ AMQShortString name,
boolean durable,
AMQShortString owner,
boolean autoDelete,
boolean exclusive,
VirtualHost virtualHost,
- QueueEntryListFactory entryListFactory,
- Map<String,Object> arguments)
+ QueueEntryListFactory entryListFactory, Map<String,Object> arguments)
{
if (name == null)
@@ -236,7 +236,7 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
_entries = entryListFactory.createQueueEntryList(this);
_arguments = arguments;
- _id = virtualHost.getConfigStore().createId();
+ _id = id;
_asyncDelivery = ReferenceCountingExecutorService.getInstance().acquireExecutorService();
@@ -346,7 +346,7 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
if(isDurable())
{
- getVirtualHost().getDurableConfigurationStore().updateQueue(this);
+ getVirtualHost().getMessageStore().updateQueue(this);
}
}
@@ -862,7 +862,6 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
public void requeue(QueueEntry entry)
{
-
SubscriptionList.SubscriptionNodeIterator subscriberIter = _subscriptionList.iterator();
// iterate over all the subscribers, and if they are in advance of this queue entry then move them backwards
while (subscriberIter.advance() && entry.isAvailable())
@@ -1743,6 +1742,7 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
{
boolean atTail = false;
final boolean keepSendLockHeld = iterations <= SimpleAMQQueue.MAX_ASYNC_DELIVERIES;
+ boolean queueEmpty = false;
try
{
@@ -1760,12 +1760,9 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
}
atTail = attemptDelivery(sub, true);
- if (atTail && !sub.isSuspended() && sub.isAutoClose())
+ if (atTail && getNextAvailableEntry(sub) == null)
{
- unregisterSubscription(sub);
-
- sub.confirmAutoClose();
-
+ queueEmpty = true;
}
else if (!atTail)
{
@@ -1787,6 +1784,11 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
{
sub.releaseSendLock();
}
+ if(queueEmpty)
+ {
+ sub.queueEmpty();
+ }
+
sub.flushBatched();
}
@@ -2009,13 +2011,9 @@ public class SimpleAMQQueue implements AMQQueue, Subscription.StateListener, Mes
if (subscriptionDone)
{
sub.flushBatched();
- //close autoClose subscriptions if we are not currently intent on continuing
- if (lastLoop && !sub.isSuspended() && sub.isAutoClose())
+ if (lastLoop && !sub.isSuspended())
{
-
- unregisterSubscription(sub);
-
- sub.confirmAutoClose();
+ sub.queueEmpty();
}
break;
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleQueueEntryList.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleQueueEntryList.java
index c82d1b984a..b8d8ec19f4 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleQueueEntryList.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SimpleQueueEntryList.java
@@ -104,7 +104,7 @@ public class SimpleQueueEntryList implements QueueEntryList<SimpleQueueEntryImpl
}
}
- protected SimpleQueueEntryImpl createQueueEntry(ServerMessage message)
+ protected SimpleQueueEntryImpl createQueueEntry(ServerMessage<?> message)
{
return new SimpleQueueEntryImpl(this, message);
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java
index 446f57b142..b3566df0c4 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/SortedQueue.java
@@ -24,6 +24,7 @@ import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.virtualhost.VirtualHost;
import java.util.Map;
+import java.util.UUID;
public class SortedQueue extends OutOfOrderQueue
{
@@ -33,12 +34,12 @@ public class SortedQueue extends OutOfOrderQueue
private final Object _sortedQueueLock = new Object();
private final String _sortedPropertyName;
- protected SortedQueue(final String name, final boolean durable,
- final String owner, final boolean autoDelete, final boolean exclusive,
- final VirtualHost virtualHost, Map<String, Object> arguments, String sortedPropertyName)
+ protected SortedQueue(UUID id, final String name,
+ final boolean durable, final String owner, final boolean autoDelete,
+ final boolean exclusive, final VirtualHost virtualHost, Map<String, Object> arguments, String sortedPropertyName)
{
- super(name, durable, owner, autoDelete, exclusive, virtualHost,
- new SortedQueueEntryListFactory(sortedPropertyName), arguments);
+ super(id, name, durable, owner, autoDelete, exclusive,
+ virtualHost, new SortedQueueEntryListFactory(sortedPropertyName), arguments);
this._sortedPropertyName = sortedPropertyName;
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
index 9951f7d3c8..4ed28b965d 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
@@ -664,7 +664,7 @@ public abstract class ApplicationRegistry implements IApplicationRegistry
public VirtualHost createVirtualHost(final VirtualHostConfiguration vhostConfig) throws Exception
{
- VirtualHostImpl virtualHost = new VirtualHostImpl(this, vhostConfig, null);
+ VirtualHostImpl virtualHost = new VirtualHostImpl(this, vhostConfig);
_virtualHostRegistry.registerVirtualHost(virtualHost);
getBroker().addVirtualHost(virtualHost);
return virtualHost;
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java
index 4ffa5a4bc2..6c1a917d5b 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/AuthenticationManager.java
@@ -24,6 +24,7 @@ import org.apache.qpid.common.Closeable;
import org.apache.qpid.server.plugins.Plugin;
import org.apache.qpid.server.security.auth.AuthenticationResult;
+import javax.security.auth.callback.CallbackHandler;
import javax.security.sasl.SaslException;
import javax.security.sasl.SaslServer;
@@ -88,4 +89,6 @@ public interface AuthenticationManager extends Closeable, Plugin
* @return authentication result
*/
AuthenticationResult authenticate(String username, String password);
+
+ CallbackHandler getHandler(String mechanism);
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java
index 3fa0de2af0..b5d70d9200 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/PrincipalDatabaseAuthenticationManager.java
@@ -300,6 +300,11 @@ public class PrincipalDatabaseAuthenticationManager implements AuthenticationMan
}
}
+ public CallbackHandler getHandler(String mechanism)
+ {
+ return _callbackHandlerMap.get(mechanism);
+ }
+
/**
* @see org.apache.qpid.server.security.auth.manager.AuthenticationManager#authenticate(String, String)
*/
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServerFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServerFactory.java
index 3664568b75..4650234972 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServerFactory.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/sasl/anonymous/AnonymousSaslServerFactory.java
@@ -58,4 +58,4 @@ public class AnonymousSaslServerFactory implements SaslServerFactory
return new String[]{AnonymousSaslServer.MECHANISM};
}
}
-} \ No newline at end of file
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/AbstractMessageStore.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/AbstractMessageStore.java
deleted file mode 100644
index fc5d2a4e42..0000000000
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/AbstractMessageStore.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store;
-
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.logging.actors.CurrentActor;
-import org.apache.qpid.server.logging.messages.MessageStoreMessages;
-import org.apache.qpid.server.logging.subjects.MessageStoreLogSubject;
-import org.apache.qpid.server.virtualhost.VirtualHost;
-
-public abstract class AbstractMessageStore implements MessageStore
-{
- private LogSubject _logSubject;
-
- public void configure(VirtualHost virtualHost) throws Exception
- {
- _logSubject = new MessageStoreLogSubject(virtualHost, this);
- CurrentActor.get().message(_logSubject, MessageStoreMessages.CREATED(this.getClass().getName()));
- }
-
- public void close() throws Exception
- {
- CurrentActor.get().message(_logSubject,MessageStoreMessages.CLOSED());
- }
-}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfigurationRecoveryHandler.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfigurationRecoveryHandler.java
index fb67500da9..1307b1dbd4 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfigurationRecoveryHandler.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfigurationRecoveryHandler.java
@@ -32,19 +32,19 @@ public interface ConfigurationRecoveryHandler
public static interface QueueRecoveryHandler
{
- void queue(String queueName, String owner, boolean exclusive, FieldTable arguments);
+ void queue(UUID id, String queueName, String owner, boolean exclusive, FieldTable arguments);
ExchangeRecoveryHandler completeQueueRecovery();
}
public static interface ExchangeRecoveryHandler
{
- void exchange(String exchangeName, String type, boolean autoDelete);
+ void exchange(UUID id, String exchangeName, String type, boolean autoDelete);
BindingRecoveryHandler completeExchangeRecovery();
}
public static interface BindingRecoveryHandler
{
- void binding(String exchangeName, String queueName, String bindingKey, ByteBuffer buf);
+ void binding(UUID bindingId, UUID exchangeId, UUID queueId, String bindingName, ByteBuffer buf);
BrokerLinkRecoveryHandler completeBindingRecovery();
}
@@ -60,13 +60,4 @@ public interface ConfigurationRecoveryHandler
void completeBridgeRecoveryForLink();
}
- public static interface QueueEntryRecoveryHandler
- {
- void complete();
-
- void queueEntry(String queueName, long messageId);
- }
-
-
-
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectHelper.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectHelper.java
new file mode 100644
index 0000000000..1a67fdf540
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectHelper.java
@@ -0,0 +1,183 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.model.Binding;
+import org.apache.qpid.server.model.Exchange;
+import org.apache.qpid.server.model.LifetimePolicy;
+import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.BindingRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.ExchangeRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.QueueRecoveryHandler;
+import org.apache.qpid.server.util.MapJsonSerializer;
+
+public class ConfiguredObjectHelper
+{
+ /**
+ * Name of queue attribute to store queue creation arguments.
+ * <p>
+ * This attribute is not defined yet on Queue configured object interface.
+ */
+ private static final String QUEUE_ARGUMENTS = "ARGUMENTS";
+
+ private MapJsonSerializer _serializer = new MapJsonSerializer();
+
+ public void loadQueue(ConfiguredObjectRecord configuredObject, QueueRecoveryHandler qrh)
+ {
+ if (Queue.class.getName().equals(configuredObject.getType()))
+ {
+ Map<String, Object> attributeMap = _serializer.deserialize(configuredObject.getAttributes());
+ String queueName = (String) attributeMap.get(Queue.NAME);
+ String owner = (String) attributeMap.get(Queue.OWNER);
+ boolean exclusive = (Boolean) attributeMap.get(Queue.EXCLUSIVE);
+ @SuppressWarnings("unchecked")
+ Map<String, Object> queueArgumentsMap = (Map<String, Object>) attributeMap.get(QUEUE_ARGUMENTS);
+ FieldTable arguments = null;
+ if (queueArgumentsMap != null)
+ {
+ arguments = FieldTable.convertToFieldTable(queueArgumentsMap);
+ }
+ qrh.queue(configuredObject.getId(), queueName, owner, exclusive, arguments);
+ }
+ }
+
+ public ConfiguredObjectRecord updateQueueConfiguredObject(final AMQQueue queue, ConfiguredObjectRecord queueRecord)
+ {
+ Map<String, Object> attributesMap = _serializer.deserialize(queueRecord.getAttributes());
+ attributesMap.put(Queue.NAME, queue.getName());
+ attributesMap.put(Queue.EXCLUSIVE, queue.isExclusive());
+ String newJson = _serializer.serialize(attributesMap);
+ ConfiguredObjectRecord newQueueRecord = new ConfiguredObjectRecord(queue.getId(), queueRecord.getType(), newJson);
+ return newQueueRecord;
+ }
+
+ public ConfiguredObjectRecord createQueueConfiguredObject(AMQQueue queue, FieldTable arguments)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Queue.NAME, queue.getName());
+ attributesMap.put(Queue.OWNER, AMQShortString.toString(queue.getOwner()));
+ attributesMap.put(Queue.EXCLUSIVE, queue.isExclusive());
+ if (arguments != null)
+ {
+ attributesMap.put(QUEUE_ARGUMENTS, FieldTable.convertToMap(arguments));
+ }
+ String json = _serializer.serialize(attributesMap);
+ ConfiguredObjectRecord configuredObject = new ConfiguredObjectRecord(queue.getId(), Queue.class.getName(), json);
+ return configuredObject;
+ }
+
+ public void loadExchange(ConfiguredObjectRecord configuredObject, ExchangeRecoveryHandler erh)
+ {
+ if (Exchange.class.getName().equals(configuredObject.getType()))
+ {
+ Map<String, Object> attributeMap = _serializer.deserialize(configuredObject.getAttributes());
+ String exchangeName = (String) attributeMap.get(Exchange.NAME);
+ String exchangeType = (String) attributeMap.get(Exchange.TYPE);
+ String lifeTimePolicy = (String) attributeMap.get(Exchange.LIFETIME_POLICY);
+ boolean autoDelete = lifeTimePolicy == null
+ || LifetimePolicy.valueOf(lifeTimePolicy) == LifetimePolicy.AUTO_DELETE;
+ erh.exchange(configuredObject.getId(), exchangeName, exchangeType, autoDelete);
+ }
+ }
+
+ public ConfiguredObjectRecord createExchangeConfiguredObject(org.apache.qpid.server.exchange.Exchange exchange)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Exchange.NAME, exchange.getName());
+ attributesMap.put(Exchange.TYPE, AMQShortString.toString(exchange.getTypeShortString()));
+ attributesMap.put(Exchange.LIFETIME_POLICY, exchange.isAutoDelete() ? LifetimePolicy.AUTO_DELETE.name()
+ : LifetimePolicy.PERMANENT.name());
+ String json = _serializer.serialize(attributesMap);
+ ConfiguredObjectRecord configuredObject = new ConfiguredObjectRecord(exchange.getId(), Exchange.class.getName(), json);
+ return configuredObject;
+ }
+
+ public void loadQueueBinding(ConfiguredObjectRecord configuredObject, BindingRecoveryHandler brh)
+ {
+ if (Binding.class.getName().equals(configuredObject.getType()))
+ {
+ Map<String, Object> attributeMap = _serializer.deserialize(configuredObject.getAttributes());
+ UUID exchangeId = UUID.fromString((String)attributeMap.get(Binding.EXCHANGE));
+ UUID queueId = UUID.fromString((String) attributeMap.get(Binding.QUEUE));
+ String bindingName = (String) attributeMap.get(Binding.NAME);
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> bindingArgumentsMap = (Map<String, Object>) attributeMap.get(Binding.ARGUMENTS);
+ FieldTable arguments = null;
+ if (bindingArgumentsMap != null)
+ {
+ arguments = FieldTable.convertToFieldTable(bindingArgumentsMap);
+ }
+ ByteBuffer argumentsBB = (arguments == null ? null : ByteBuffer.wrap(arguments.getDataAsBytes()));
+
+ brh.binding(configuredObject.getId(), exchangeId, queueId, bindingName, argumentsBB);
+ }
+ }
+
+ public ConfiguredObjectRecord createBindingConfiguredObject(org.apache.qpid.server.binding.Binding binding)
+ {
+ Map<String, Object> attributesMap = new HashMap<String, Object>();
+ attributesMap.put(Binding.NAME, binding.getBindingKey());
+ attributesMap.put(Binding.EXCHANGE, binding.getExchange().getId());
+ attributesMap.put(Binding.QUEUE, binding.getQueue().getId());
+ Map<String, Object> arguments = binding.getArguments();
+ if (arguments != null)
+ {
+ attributesMap.put(Binding.ARGUMENTS, arguments);
+ }
+ String json = _serializer.serialize(attributesMap);
+ ConfiguredObjectRecord configuredObject = new ConfiguredObjectRecord(binding.getId(), Binding.class.getName(), json);
+ return configuredObject;
+ }
+
+ public void recoverQueues(QueueRecoveryHandler qrh, List<ConfiguredObjectRecord> configuredObjects)
+ {
+ for (ConfiguredObjectRecord configuredObjectRecord : configuredObjects)
+ {
+ loadQueue(configuredObjectRecord, qrh);
+ }
+ }
+
+ public void recoverExchanges(ExchangeRecoveryHandler erh, List<ConfiguredObjectRecord> configuredObjects)
+ {
+ for (ConfiguredObjectRecord configuredObjectRecord : configuredObjects)
+ {
+ loadExchange(configuredObjectRecord, erh);
+ }
+ }
+
+ public void recoverBindings(BindingRecoveryHandler brh, List<ConfiguredObjectRecord> configuredObjects)
+ {
+ for (ConfiguredObjectRecord configuredObjectRecord : configuredObjects)
+ {
+ loadQueueBinding(configuredObjectRecord, brh);
+ }
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectRecord.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectRecord.java
new file mode 100644
index 0000000000..95e1713d78
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/ConfiguredObjectRecord.java
@@ -0,0 +1,65 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import java.util.UUID;
+
+public class ConfiguredObjectRecord
+{
+ private UUID _id;
+ private String _type;
+ private String _attributes;
+
+ public ConfiguredObjectRecord(UUID id, String type, String attributes)
+ {
+ super();
+ _id = id;
+ _type = type;
+ _attributes = attributes;
+ }
+
+ public UUID getId()
+ {
+ return _id;
+ }
+
+ public void setId(UUID id)
+ {
+ _id = id;
+ }
+
+ public String getType()
+ {
+ return _type;
+ }
+
+ public String getAttributes()
+ {
+ return _attributes;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ConfiguredObjectRecord [id=" + _id + ", type=" + _type + ", attributes=" + _attributes + "]";
+ }
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java
deleted file mode 100644
index 4d63136a9d..0000000000
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java
+++ /dev/null
@@ -1,2715 +0,0 @@
-/*
-*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*
-*/
-package org.apache.qpid.server.store;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.AMQException;
-import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.exchange.Exchange;
-import org.apache.qpid.server.federation.Bridge;
-import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.logging.actors.CurrentActor;
-import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
-import org.apache.qpid.server.logging.messages.MessageStoreMessages;
-import org.apache.qpid.server.logging.messages.TransactionLogMessages;
-import org.apache.qpid.server.message.EnqueableMessage;
-import org.apache.qpid.server.queue.AMQQueue;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.lang.ref.SoftReference;
-import java.nio.ByteBuffer;
-import java.sql.Blob;
-import java.sql.Connection;
-import java.sql.Driver;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * An implementation of a {@link MessageStore} that uses Apache Derby as the persistance
- * mechanism.
- *
- * TODO extract the SQL statements into a generic JDBC store
- */
-public class DerbyMessageStore implements MessageStore, DurableConfigurationStore
-{
-
- private static final Logger _logger = Logger.getLogger(DerbyMessageStore.class);
-
- public static final String ENVIRONMENT_PATH_PROPERTY = "environment-path";
-
-
- private static final String SQL_DRIVER_NAME = "org.apache.derby.jdbc.EmbeddedDriver";
-
- private static final String DB_VERSION_TABLE_NAME = "QPID_DB_VERSION";
-
- private static final String EXCHANGE_TABLE_NAME = "QPID_EXCHANGE";
- private static final String QUEUE_TABLE_NAME = "QPID_QUEUE";
- private static final String BINDINGS_TABLE_NAME = "QPID_BINDINGS";
- private static final String QUEUE_ENTRY_TABLE_NAME = "QPID_QUEUE_ENTRY";
-
- private static final String META_DATA_TABLE_NAME = "QPID_META_DATA";
- private static final String MESSAGE_CONTENT_TABLE_NAME = "QPID_MESSAGE_CONTENT";
-
- private static final String LINKS_TABLE_NAME = "QPID_LINKS";
- private static final String BRIDGES_TABLE_NAME = "QPID_BRIDGES";
-
- private static final String XID_TABLE_NAME = "QPID_XIDS";
- private static final String XID_ACTIONS_TABLE_NAME = "QPID_XID_ACTIONS";
-
- private static final int DB_VERSION = 3;
-
-
-
- private static Class<Driver> DRIVER_CLASS;
-
- private final AtomicLong _messageId = new AtomicLong(0);
- private AtomicBoolean _closed = new AtomicBoolean(false);
-
- private String _connectionURL;
-
- private static final String TABLE_EXISTANCE_QUERY = "SELECT 1 FROM SYS.SYSTABLES WHERE TABLENAME = ?";
-
- private static final String CREATE_DB_VERSION_TABLE = "CREATE TABLE "+DB_VERSION_TABLE_NAME+" ( version int not null )";
- private static final String INSERT_INTO_DB_VERSION = "INSERT INTO "+DB_VERSION_TABLE_NAME+" ( version ) VALUES ( ? )";
-
- private static final String CREATE_EXCHANGE_TABLE = "CREATE TABLE "+EXCHANGE_TABLE_NAME+" ( name varchar(255) not null, type varchar(255) not null, autodelete SMALLINT not null, PRIMARY KEY ( name ) )";
- private static final String CREATE_QUEUE_TABLE = "CREATE TABLE "+QUEUE_TABLE_NAME+" ( name varchar(255) not null, owner varchar(255), exclusive SMALLINT not null, arguments blob, PRIMARY KEY ( name ))";
- private static final String CREATE_BINDINGS_TABLE = "CREATE TABLE "+BINDINGS_TABLE_NAME+" ( exchange_name varchar(255) not null, queue_name varchar(255) not null, binding_key varchar(255) not null, arguments blob , PRIMARY KEY ( exchange_name, queue_name, binding_key ) )";
- private static final String SELECT_FROM_QUEUE = "SELECT name, owner, exclusive, arguments FROM " + QUEUE_TABLE_NAME;
- private static final String FIND_QUEUE = "SELECT name, owner FROM " + QUEUE_TABLE_NAME + " WHERE name = ?";
- private static final String UPDATE_QUEUE_EXCLUSIVITY = "UPDATE " + QUEUE_TABLE_NAME + " SET exclusive = ? WHERE name = ?";
- private static final String SELECT_FROM_EXCHANGE = "SELECT name, type, autodelete FROM " + EXCHANGE_TABLE_NAME;
- private static final String SELECT_FROM_BINDINGS =
- "SELECT exchange_name, queue_name, binding_key, arguments FROM " + BINDINGS_TABLE_NAME + " ORDER BY exchange_name";
- private static final String FIND_BINDING =
- "SELECT * FROM " + BINDINGS_TABLE_NAME + " WHERE exchange_name = ? AND queue_name = ? AND binding_key = ? ";
- private static final String INSERT_INTO_EXCHANGE = "INSERT INTO " + EXCHANGE_TABLE_NAME + " ( name, type, autodelete ) VALUES ( ?, ?, ? )";
- private static final String DELETE_FROM_EXCHANGE = "DELETE FROM " + EXCHANGE_TABLE_NAME + " WHERE name = ?";
- private static final String FIND_EXCHANGE = "SELECT name FROM " + EXCHANGE_TABLE_NAME + " WHERE name = ?";
- private static final String INSERT_INTO_BINDINGS = "INSERT INTO " + BINDINGS_TABLE_NAME + " ( exchange_name, queue_name, binding_key, arguments ) values ( ?, ?, ?, ? )";
- private static final String DELETE_FROM_BINDINGS = "DELETE FROM " + BINDINGS_TABLE_NAME + " WHERE exchange_name = ? AND queue_name = ? AND binding_key = ?";
- private static final String INSERT_INTO_QUEUE = "INSERT INTO " + QUEUE_TABLE_NAME + " (name, owner, exclusive, arguments) VALUES (?, ?, ?, ?)";
- private static final String DELETE_FROM_QUEUE = "DELETE FROM " + QUEUE_TABLE_NAME + " WHERE name = ?";
-
- private static final String CREATE_QUEUE_ENTRY_TABLE = "CREATE TABLE "+QUEUE_ENTRY_TABLE_NAME+" ( queue_name varchar(255) not null, message_id bigint not null, PRIMARY KEY (queue_name, message_id) )";
- private static final String INSERT_INTO_QUEUE_ENTRY = "INSERT INTO " + QUEUE_ENTRY_TABLE_NAME + " (queue_name, message_id) values (?,?)";
- private static final String DELETE_FROM_QUEUE_ENTRY = "DELETE FROM " + QUEUE_ENTRY_TABLE_NAME + " WHERE queue_name = ? AND message_id =?";
- private static final String SELECT_FROM_QUEUE_ENTRY = "SELECT queue_name, message_id FROM " + QUEUE_ENTRY_TABLE_NAME + " ORDER BY queue_name, message_id";
-
-
- private static final String CREATE_META_DATA_TABLE = "CREATE TABLE "+META_DATA_TABLE_NAME+" ( message_id bigint not null, meta_data blob, PRIMARY KEY ( message_id ) )";
- private static final String CREATE_MESSAGE_CONTENT_TABLE = "CREATE TABLE "+MESSAGE_CONTENT_TABLE_NAME+" ( message_id bigint not null, offset int not null, last_byte int not null, content blob , PRIMARY KEY (message_id, offset) )";
-
- private static final String INSERT_INTO_MESSAGE_CONTENT = "INSERT INTO " + MESSAGE_CONTENT_TABLE_NAME + "( message_id, offset, last_byte, content ) values (?, ?, ?, ?)";
- private static final String SELECT_FROM_MESSAGE_CONTENT =
- "SELECT offset, content FROM " + MESSAGE_CONTENT_TABLE_NAME + " WHERE message_id = ? AND last_byte > ? AND offset < ? ORDER BY message_id, offset";
- private static final String DELETE_FROM_MESSAGE_CONTENT = "DELETE FROM " + MESSAGE_CONTENT_TABLE_NAME + " WHERE message_id = ?";
-
- private static final String INSERT_INTO_META_DATA = "INSERT INTO " + META_DATA_TABLE_NAME + "( message_id , meta_data ) values (?, ?)";;
- private static final String SELECT_FROM_META_DATA =
- "SELECT meta_data FROM " + META_DATA_TABLE_NAME + " WHERE message_id = ?";
- private static final String DELETE_FROM_META_DATA = "DELETE FROM " + META_DATA_TABLE_NAME + " WHERE message_id = ?";
- private static final String SELECT_ALL_FROM_META_DATA = "SELECT message_id, meta_data FROM " + META_DATA_TABLE_NAME;
-
- private static final String CREATE_LINKS_TABLE =
- "CREATE TABLE "+LINKS_TABLE_NAME+" ( id_lsb bigint not null,"
- + " id_msb bigint not null,"
- + " create_time bigint not null,"
- + " arguments blob, PRIMARY KEY ( id_lsb, id_msb ))";
- private static final String SELECT_FROM_LINKS =
- "SELECT create_time, arguments FROM " + LINKS_TABLE_NAME + " WHERE id_lsb = ? and id_msb";
- private static final String DELETE_FROM_LINKS = "DELETE FROM " + LINKS_TABLE_NAME
- + " WHERE id_lsb = ? and id_msb = ?";
- private static final String SELECT_ALL_FROM_LINKS = "SELECT id_lsb, id_msb, create_time, "
- + "arguments FROM " + LINKS_TABLE_NAME;
- private static final String FIND_LINK = "SELECT id_lsb, id_msb FROM " + LINKS_TABLE_NAME + " WHERE id_lsb = ? and"
- + " id_msb = ?";
- private static final String INSERT_INTO_LINKS = "INSERT INTO " + LINKS_TABLE_NAME + "( id_lsb, "
- + "id_msb, create_time, arguments ) values (?, ?, ?, ?)";
-
-
- private static final String CREATE_BRIDGES_TABLE =
- "CREATE TABLE "+BRIDGES_TABLE_NAME+" ( id_lsb bigint not null,"
- + " id_msb bigint not null,"
- + " create_time bigint not null,"
- + " link_id_lsb bigint not null,"
- + " link_id_msb bigint not null,"
- + " arguments blob, PRIMARY KEY ( id_lsb, id_msb ))";
- private static final String SELECT_FROM_BRIDGES =
- "SELECT create_time, link_id_lsb, link_id_msb, arguments FROM "
- + BRIDGES_TABLE_NAME + " WHERE id_lsb = ? and id_msb = ?";
- private static final String DELETE_FROM_BRIDGES = "DELETE FROM " + BRIDGES_TABLE_NAME
- + " WHERE id_lsb = ? and id_msb = ?";
- private static final String SELECT_ALL_FROM_BRIDGES = "SELECT id_lsb, id_msb, "
- + " create_time,"
- + " link_id_lsb, link_id_msb, "
- + "arguments FROM " + BRIDGES_TABLE_NAME
- + " WHERE link_id_lsb = ? and link_id_msb = ?";
- private static final String FIND_BRIDGE = "SELECT id_lsb, id_msb FROM " + BRIDGES_TABLE_NAME +
- " WHERE id_lsb = ? and id_msb = ?";
- private static final String INSERT_INTO_BRIDGES = "INSERT INTO " + BRIDGES_TABLE_NAME + "( id_lsb, id_msb, "
- + "create_time, "
- + "link_id_lsb, link_id_msb, "
- + "arguments )"
- + " values (?, ?, ?, ?, ?, ?)";
-
- private static final String CREATE_XIDS_TABLE =
- "CREATE TABLE "+XID_TABLE_NAME+" ( format bigint not null,"
- + " global_id varchar(64) for bit data, branch_id varchar(64) for bit data, PRIMARY KEY ( format, " +
- "global_id, branch_id ))";
- private static final String INSERT_INTO_XIDS =
- "INSERT INTO "+XID_TABLE_NAME+" ( format, global_id, branch_id ) values (?, ?, ?)";
- private static final String DELETE_FROM_XIDS = "DELETE FROM " + XID_TABLE_NAME
- + " WHERE format = ? and global_id = ? and branch_id = ?";
- private static final String SELECT_ALL_FROM_XIDS = "SELECT format, global_id, branch_id FROM " + XID_TABLE_NAME;
-
-
- private static final String CREATE_XID_ACTIONS_TABLE =
- "CREATE TABLE "+XID_ACTIONS_TABLE_NAME+" ( format bigint not null,"
- + " global_id varchar(64) for bit data not null, branch_id varchar(64) for bit data not null, " +
- "action_type char not null, queue_name varchar(255) not null, message_id bigint not null" +
- ", PRIMARY KEY ( " +
- "format, global_id, branch_id, action_type, queue_name, message_id))";
- private static final String INSERT_INTO_XID_ACTIONS =
- "INSERT INTO "+XID_ACTIONS_TABLE_NAME+" ( format, global_id, branch_id, action_type, " +
- "queue_name, message_id ) values (?,?,?,?,?,?) ";
- private static final String DELETE_FROM_XID_ACTIONS = "DELETE FROM " + XID_ACTIONS_TABLE_NAME
- + " WHERE format = ? and global_id = ? and branch_id = ?";
- private static final String SELECT_ALL_FROM_XID_ACTIONS =
- "SELECT action_type, queue_name, message_id FROM " + XID_ACTIONS_TABLE_NAME +
- " WHERE format = ? and global_id = ? and branch_id = ?";
-
- private static final String DERBY_SINGLE_DB_SHUTDOWN_CODE = "08006";
-
-
- private LogSubject _logSubject;
- private boolean _configured;
-
-
- private static final class CommitStoreFuture implements StoreFuture
- {
- public boolean isComplete()
- {
- return true;
- }
-
- public void waitForCompletion()
- {
-
- }
- }
-
- private enum State
- {
- INITIAL,
- CONFIGURING,
- RECOVERING,
- STARTED,
- CLOSING,
- CLOSED
- }
-
- private State _state = State.INITIAL;
-
-
- public void configureConfigStore(String name,
- ConfigurationRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
- stateTransition(State.INITIAL, State.CONFIGURING);
- _logSubject = logSubject;
- CurrentActor.get().message(_logSubject, ConfigStoreMessages.CREATED(this.getClass().getName()));
-
- if(!_configured)
- {
- commonConfiguration(name, storeConfiguration, logSubject);
- _configured = true;
- }
-
- // this recovers durable exchanges, queues, and bindings
- recover(recoveryHandler);
-
-
- stateTransition(State.RECOVERING, State.STARTED);
-
- }
-
-
- public void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
- if(!_configured)
- {
-
- _logSubject = logSubject;
- }
-
- CurrentActor.get().message(_logSubject, MessageStoreMessages.CREATED(this.getClass().getName()));
-
- if(!_configured)
- {
-
- commonConfiguration(name, storeConfiguration, logSubject);
- _configured = true;
- }
-
- recoverMessages(recoveryHandler);
-
- }
-
-
-
- public void configureTransactionLog(String name,
- TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
-
- if(!_configured)
- {
- _logSubject = logSubject;
- }
- CurrentActor.get().message(_logSubject, TransactionLogMessages.CREATED(this.getClass().getName()));
-
- if(!_configured)
- {
-
- _logSubject = logSubject;
-
- commonConfiguration(name, storeConfiguration, logSubject);
- _configured = true;
- }
-
- TransactionLogRecoveryHandler.DtxRecordRecoveryHandler dtxrh = recoverQueueEntries(recoveryHandler);
- recoverXids(dtxrh);
-
- }
-
-
-
- private void commonConfiguration(String name, Configuration storeConfiguration, LogSubject logSubject)
- throws ClassNotFoundException, SQLException
- {
- initialiseDriver();
-
- //Update to pick up QPID_WORK and use that as the default location not just derbyDB
-
- final String databasePath = storeConfiguration.getString(ENVIRONMENT_PATH_PROPERTY, System.getProperty("QPID_WORK")
- + File.separator + "derbyDB");
-
- File environmentPath = new File(databasePath);
- if (!environmentPath.exists())
- {
- if (!environmentPath.mkdirs())
- {
- throw new IllegalArgumentException("Environment path " + environmentPath + " could not be read or created. "
- + "Ensure the path is correct and that the permissions are correct.");
- }
- }
-
- CurrentActor.get().message(_logSubject, MessageStoreMessages.STORE_LOCATION(environmentPath.getAbsolutePath()));
-
- createOrOpenDatabase(name, databasePath);
- }
-
- private static synchronized void initialiseDriver() throws ClassNotFoundException
- {
- if(DRIVER_CLASS == null)
- {
- DRIVER_CLASS = (Class<Driver>) Class.forName(SQL_DRIVER_NAME);
- }
- }
-
- private void createOrOpenDatabase(String name, final String environmentPath) throws SQLException
- {
- //FIXME this the _vhost name should not be added here, but derby wont use an empty directory as was possibly just created.
- _connectionURL = "jdbc:derby:" + environmentPath + "/" + name + ";create=true";
-
- Connection conn = newAutoCommitConnection();
-
- createVersionTable(conn);
- createExchangeTable(conn);
- createQueueTable(conn);
- createBindingsTable(conn);
- createQueueEntryTable(conn);
- createMetaDataTable(conn);
- createMessageContentTable(conn);
- createLinkTable(conn);
- createBridgeTable(conn);
- createXidTable(conn);
- createXidActionTable(conn);
- conn.close();
- }
-
-
-
- private void createVersionTable(final Connection conn) throws SQLException
- {
- if(!tableExists(DB_VERSION_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_DB_VERSION_TABLE);
- }
- finally
- {
- stmt.close();
- }
-
- PreparedStatement pstmt = conn.prepareStatement(INSERT_INTO_DB_VERSION);
- try
- {
- pstmt.setInt(1, DB_VERSION);
- pstmt.execute();
- }
- finally
- {
- pstmt.close();
- }
- }
-
- }
-
-
- private void createExchangeTable(final Connection conn) throws SQLException
- {
- if(!tableExists(EXCHANGE_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_EXCHANGE_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
- }
-
- private void createQueueTable(final Connection conn) throws SQLException
- {
- if(!tableExists(QUEUE_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_QUEUE_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
- }
-
- private void createBindingsTable(final Connection conn) throws SQLException
- {
- if(!tableExists(BINDINGS_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_BINDINGS_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
-
- }
-
- private void createQueueEntryTable(final Connection conn) throws SQLException
- {
- if(!tableExists(QUEUE_ENTRY_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_QUEUE_ENTRY_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
-
- }
-
- private void createMetaDataTable(final Connection conn) throws SQLException
- {
- if(!tableExists(META_DATA_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_META_DATA_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
-
- }
-
-
- private void createMessageContentTable(final Connection conn) throws SQLException
- {
- if(!tableExists(MESSAGE_CONTENT_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_MESSAGE_CONTENT_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
-
- }
-
- private void createLinkTable(final Connection conn) throws SQLException
- {
- if(!tableExists(LINKS_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_LINKS_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
- }
-
-
- private void createBridgeTable(final Connection conn) throws SQLException
- {
- if(!tableExists(BRIDGES_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_BRIDGES_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
- }
-
- private void createXidTable(final Connection conn) throws SQLException
- {
- if(!tableExists(XID_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_XIDS_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
- }
-
-
- private void createXidActionTable(final Connection conn) throws SQLException
- {
- if(!tableExists(XID_ACTIONS_TABLE_NAME, conn))
- {
- Statement stmt = conn.createStatement();
- try
- {
- stmt.execute(CREATE_XID_ACTIONS_TABLE);
- }
- finally
- {
- stmt.close();
- }
- }
- }
-
- private boolean tableExists(final String tableName, final Connection conn) throws SQLException
- {
- PreparedStatement stmt = conn.prepareStatement(TABLE_EXISTANCE_QUERY);
- try
- {
- stmt.setString(1, tableName);
- ResultSet rs = stmt.executeQuery();
- try
- {
- return rs.next();
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- }
-
- public void recover(ConfigurationRecoveryHandler recoveryHandler) throws AMQException
- {
- stateTransition(State.CONFIGURING, State.RECOVERING);
-
- CurrentActor.get().message(_logSubject,MessageStoreMessages.RECOVERY_START());
-
- try
- {
- ConfigurationRecoveryHandler.QueueRecoveryHandler qrh = recoveryHandler.begin(this);
- loadQueues(qrh);
-
- ConfigurationRecoveryHandler.ExchangeRecoveryHandler erh = qrh.completeQueueRecovery();
- List<String> exchanges = loadExchanges(erh);
- ConfigurationRecoveryHandler.BindingRecoveryHandler brh = erh.completeExchangeRecovery();
- recoverBindings(brh, exchanges);
- ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh = brh.completeBindingRecovery();
- recoverBrokerLinks(lrh);
- }
- catch (SQLException e)
- {
-
- throw new AMQStoreException("Error recovering persistent state: " + e.getMessage(), e);
- }
-
-
- }
-
- private void recoverBrokerLinks(final ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh)
- throws SQLException
- {
- _logger.info("Recovering broker links...");
-
- Connection conn = null;
- try
- {
- conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(SELECT_ALL_FROM_LINKS);
-
- try
- {
- ResultSet rs = stmt.executeQuery();
-
- try
- {
-
- while(rs.next())
- {
- UUID id = new UUID(rs.getLong(2), rs.getLong(1));
- long createTime = rs.getLong(3);
- Blob argumentsAsBlob = rs.getBlob(4);
-
- byte[] dataAsBytes = argumentsAsBlob.getBytes(1,(int) argumentsAsBlob.length());
-
- DataInputStream dis = new DataInputStream(new ByteArrayInputStream(dataAsBytes));
- int size = dis.readInt();
-
- Map<String,String> arguments = new HashMap<String, String>();
-
- for(int i = 0; i < size; i++)
- {
- arguments.put(dis.readUTF(), dis.readUTF());
- }
-
- ConfigurationRecoveryHandler.BridgeRecoveryHandler brh = lrh.brokerLink(id, createTime, arguments);
-
- recoverBridges(brh, id);
-
- }
- }
- catch (IOException e)
- {
- throw new SQLException(e.getMessage(), e);
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- }
- finally
- {
- if(conn != null)
- {
- conn.close();
- }
- }
-
- }
-
- private void recoverBridges(final ConfigurationRecoveryHandler.BridgeRecoveryHandler brh, final UUID linkId)
- throws SQLException
- {
- _logger.info("Recovering bridges for link " + linkId + "...");
-
- Connection conn = null;
- try
- {
- conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(SELECT_ALL_FROM_BRIDGES);
-
- try
- {
- stmt.setLong(1, linkId.getLeastSignificantBits());
- stmt.setLong(2, linkId.getMostSignificantBits());
-
- ResultSet rs = stmt.executeQuery();
-
- try
- {
-
- while(rs.next())
- {
- UUID id = new UUID(rs.getLong(2), rs.getLong(1));
- long createTime = rs.getLong(3);
- Blob argumentsAsBlob = rs.getBlob(6);
-
- byte[] dataAsBytes = argumentsAsBlob.getBytes(1,(int) argumentsAsBlob.length());
-
- DataInputStream dis = new DataInputStream(new ByteArrayInputStream(dataAsBytes));
- int size = dis.readInt();
-
- Map<String,String> arguments = new HashMap<String, String>();
-
- for(int i = 0; i < size; i++)
- {
- arguments.put(dis.readUTF(), dis.readUTF());
- }
-
- brh.bridge(id, createTime, arguments);
-
- }
- brh.completeBridgeRecoveryForLink();
- }
- catch (IOException e)
- {
- throw new SQLException(e.getMessage(), e);
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- }
- finally
- {
- if(conn != null)
- {
- conn.close();
- }
- }
-
- }
-
- private void loadQueues(ConfigurationRecoveryHandler.QueueRecoveryHandler qrh) throws SQLException
- {
- Connection conn = newAutoCommitConnection();
- try
- {
- Statement stmt = conn.createStatement();
- try
- {
- ResultSet rs = stmt.executeQuery(SELECT_FROM_QUEUE);
- try
- {
-
- while(rs.next())
- {
- String queueName = rs.getString(1);
- String owner = rs.getString(2);
- boolean exclusive = rs.getBoolean(3);
- Blob argumentsAsBlob = rs.getBlob(4);
-
- byte[] dataAsBytes = argumentsAsBlob.getBytes(1,(int) argumentsAsBlob.length());
- FieldTable arguments;
- if(dataAsBytes.length > 0)
- {
-
- try
- {
- arguments = new FieldTable(new DataInputStream(new ByteArrayInputStream(dataAsBytes)),dataAsBytes.length);
- }
- catch (IOException e)
- {
- throw new RuntimeException("IO Exception should not be thrown",e);
- }
- }
- else
- {
- arguments = null;
- }
-
- qrh.queue(queueName, owner, exclusive, arguments);
-
- }
-
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
-
-
- private List<String> loadExchanges(ConfigurationRecoveryHandler.ExchangeRecoveryHandler erh) throws SQLException
- {
-
- List<String> exchanges = new ArrayList<String>();
- Connection conn = null;
- try
- {
- conn = newAutoCommitConnection();
-
- Statement stmt = conn.createStatement();
- try
- {
- ResultSet rs = stmt.executeQuery(SELECT_FROM_EXCHANGE);
- try
- {
- while(rs.next())
- {
- String exchangeName = rs.getString(1);
- String type = rs.getString(2);
- boolean autoDelete = rs.getShort(3) != 0;
-
- exchanges.add(exchangeName);
-
- erh.exchange(exchangeName, type, autoDelete);
-
- }
- return exchanges;
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- if(conn != null)
- {
- conn.close();
- }
- }
-
- }
-
- private void recoverBindings(ConfigurationRecoveryHandler.BindingRecoveryHandler brh, List<String> exchanges) throws SQLException
- {
- _logger.info("Recovering bindings...");
-
- Connection conn = null;
- try
- {
- conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(SELECT_FROM_BINDINGS);
-
- try
- {
- ResultSet rs = stmt.executeQuery();
-
- try
- {
-
- while(rs.next())
- {
- String exchangeName = rs.getString(1);
- String queueName = rs.getString(2);
- String bindingKey = rs.getString(3);
- Blob arguments = rs.getBlob(4);
- java.nio.ByteBuffer buf;
-
- if(arguments != null && arguments.length() != 0)
- {
- byte[] argumentBytes = arguments.getBytes(1, (int) arguments.length());
- buf = java.nio.ByteBuffer.wrap(argumentBytes);
- }
- else
- {
- buf = null;
- }
-
- brh.binding(exchangeName, queueName, bindingKey, buf);
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- }
- finally
- {
- if(conn != null)
- {
- conn.close();
- }
- }
- }
-
-
-
- public void close() throws Exception
- {
- CurrentActor.get().message(_logSubject,MessageStoreMessages.CLOSED());
- _closed.getAndSet(true);
-
- try
- {
- Connection conn = DriverManager.getConnection(_connectionURL + ";shutdown=true");
- // Shouldn't reach this point - shutdown=true should throw SQLException
- conn.close();
- _logger.error("Unable to shut down the store");
- }
- catch (SQLException e)
- {
- if (e.getSQLState().equalsIgnoreCase(DERBY_SINGLE_DB_SHUTDOWN_CODE))
- {
- //expected and represents a clean shutdown of this database only, do nothing.
- }
- else
- {
- _logger.error("Exception whilst shutting down the store: " + e);
- }
- }
- }
-
- public StoredMessage addMessage(StorableMessageMetaData metaData)
- {
- if(metaData.isPersistent())
- {
- return new StoredDerbyMessage(_messageId.incrementAndGet(), metaData);
- }
- else
- {
- return new StoredMemoryMessage(_messageId.incrementAndGet(), metaData);
- }
- }
-
- public StoredMessage getMessage(long messageNumber)
- {
- return null;
- }
-
- public void removeMessage(long messageId)
- {
- try
- {
- Connection conn = newConnection();
- try
- {
- PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_META_DATA);
- try
- {
- stmt.setLong(1,messageId);
- int results = stmt.executeUpdate();
- stmt.close();
-
- if (results == 0)
- {
- _logger.warn("Message metadata not found for message id " + messageId);
- }
-
- if (_logger.isDebugEnabled())
- {
- _logger.debug("Deleted metadata for message " + messageId);
- }
-
- stmt = conn.prepareStatement(DELETE_FROM_MESSAGE_CONTENT);
- stmt.setLong(1,messageId);
- results = stmt.executeUpdate();
- }
- finally
- {
- stmt.close();
- }
- conn.commit();
- }
- catch(SQLException e)
- {
- try
- {
- conn.rollback();
- }
- catch(SQLException t)
- {
- // ignore - we are re-throwing underlying exception
- }
-
- throw e;
-
- }
- finally
- {
- conn.close();
- }
- }
- catch (SQLException e)
- {
- throw new RuntimeException("Error removing message with id " + messageId + " from database: " + e.getMessage(), e);
- }
-
- }
-
- public void createExchange(Exchange exchange) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- try
- {
-
-
- PreparedStatement stmt = conn.prepareStatement(FIND_EXCHANGE);
- try
- {
- stmt.setString(1, exchange.getNameShortString().toString());
- ResultSet rs = stmt.executeQuery();
- try
- {
-
- // If we don't have any data in the result set then we can add this exchange
- if (!rs.next())
- {
-
- PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_EXCHANGE);
- try
- {
- insertStmt.setString(1, exchange.getName().toString());
- insertStmt.setString(2, exchange.getTypeShortString().asString());
- insertStmt.setShort(3, exchange.isAutoDelete() ? (short) 1 : (short) 0);
- insertStmt.execute();
- }
- finally
- {
- insertStmt.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- }
- finally
- {
- conn.close();
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error writing Exchange with name " + exchange.getNameShortString() + " to database: " + e.getMessage(), e);
- }
- }
-
- }
-
- public void removeExchange(Exchange exchange) throws AMQStoreException
- {
-
- try
- {
- Connection conn = newAutoCommitConnection();
- try
- {
- PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_EXCHANGE);
- try
- {
- stmt.setString(1, exchange.getNameShortString().toString());
- int results = stmt.executeUpdate();
- stmt.close();
- if(results == 0)
- {
- throw new AMQStoreException("Exchange " + exchange.getNameShortString() + " not found");
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error deleting Exchange with name " + exchange.getNameShortString() + " from database: " + e.getMessage(), e);
- }
- }
-
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args)
- throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- try
- {
-
- PreparedStatement stmt = conn.prepareStatement(FIND_BINDING);
- try
- {
- stmt.setString(1, exchange.getNameShortString().toString() );
- stmt.setString(2, queue.getNameShortString().toString());
- stmt.setString(3, routingKey == null ? null : routingKey.toString());
-
- ResultSet rs = stmt.executeQuery();
- try
- {
- // If this binding is not already in the store then create it.
- if (!rs.next())
- {
- PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_BINDINGS);
- try
- {
- insertStmt.setString(1, exchange.getNameShortString().toString() );
- insertStmt.setString(2, queue.getNameShortString().toString());
- insertStmt.setString(3, routingKey == null ? null : routingKey.toString());
- if(args != null)
- {
- // TODO - In Java 6 we could use create/set Blob
- byte[] bytes = args.getDataAsBytes();
- ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
- insertStmt.setBinaryStream(4, bis, bytes.length);
- }
- else
- {
- insertStmt.setNull(4, Types.BLOB);
- }
-
- insertStmt.executeUpdate();
- }
- finally
- {
- insertStmt.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error writing binding for AMQQueue with name " + queue.getNameShortString() + " to exchange "
- + exchange.getNameShortString() + " to database: " + e.getMessage(), e);
- }
-
- }
-
-
- }
-
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args)
- throws AMQStoreException
- {
- Connection conn = null;
- PreparedStatement stmt = null;
-
- try
- {
- conn = newAutoCommitConnection();
- // exchange_name varchar(255) not null, queue_name varchar(255) not null, binding_key varchar(255), arguments blob
- stmt = conn.prepareStatement(DELETE_FROM_BINDINGS);
- stmt.setString(1, exchange.getNameShortString().toString() );
- stmt.setString(2, queue.getNameShortString().toString());
- stmt.setString(3, routingKey == null ? null : routingKey.toString());
-
- int result = stmt.executeUpdate();
-
- if(result != 1)
- {
- throw new AMQStoreException("Queue binding for queue with name " + queue.getNameShortString() + " to exchange "
- + exchange.getNameShortString() + " not found");
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error removing binding for AMQQueue with name " + queue.getNameShortString() + " to exchange "
- + exchange.getNameShortString() + " in database: " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- closeConnection(conn);
- }
- }
-
- public void createQueue(AMQQueue queue) throws AMQStoreException
- {
- createQueue(queue, null);
- }
-
- public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
- {
- _logger.debug("public void createQueue(AMQQueue queue = " + queue + "): called");
-
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(FIND_QUEUE);
- try
- {
- stmt.setString(1, queue.getNameShortString().toString());
- ResultSet rs = stmt.executeQuery();
- try
- {
-
- // If we don't have any data in the result set then we can add this queue
- if (!rs.next())
- {
- PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_QUEUE);
-
- try
- {
- String owner = queue.getOwner() == null ? null : queue.getOwner().toString();
-
- insertStmt.setString(1, queue.getNameShortString().toString());
- insertStmt.setString(2, owner);
- insertStmt.setBoolean(3,queue.isExclusive());
-
- final byte[] underlying;
- if(arguments != null)
- {
- underlying = arguments.getDataAsBytes();
- }
- else
- {
- underlying = new byte[0];
- }
-
- ByteArrayInputStream bis = new ByteArrayInputStream(underlying);
- insertStmt.setBinaryStream(4,bis,underlying.length);
-
- insertStmt.execute();
- }
- finally
- {
- insertStmt.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- conn.close();
-
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error writing AMQQueue with name " + queue.getNameShortString() + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- /**
- * Updates the specified queue in the persistent store, IF it is already present. If the queue
- * is not present in the store, it will not be added.
- *
- * NOTE: Currently only updates the exclusivity.
- *
- * @param queue The queue to update the entry for.
- * @throws AMQStoreException If the operation fails for any reason.
- */
- public void updateQueue(final AMQQueue queue) throws AMQStoreException
- {
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- try
- {
- PreparedStatement stmt = conn.prepareStatement(FIND_QUEUE);
- try
- {
- stmt.setString(1, queue.getNameShortString().toString());
-
- ResultSet rs = stmt.executeQuery();
- try
- {
- if (rs.next())
- {
- PreparedStatement stmt2 = conn.prepareStatement(UPDATE_QUEUE_EXCLUSIVITY);
- try
- {
- stmt2.setBoolean(1,queue.isExclusive());
- stmt2.setString(2, queue.getNameShortString().toString());
-
- stmt2.execute();
- }
- finally
- {
- stmt2.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error updating AMQQueue with name " + queue.getNameShortString() + " to database: " + e.getMessage(), e);
- }
- }
-
- }
-
- /**
- * Convenience method to create a new Connection configured for TRANSACTION_READ_COMMITED
- * isolation and with auto-commit transactions enabled.
- */
- private Connection newAutoCommitConnection() throws SQLException
- {
- final Connection connection = newConnection();
- try
- {
- connection.setAutoCommit(true);
- }
- catch (SQLException sqlEx)
- {
-
- try
- {
- connection.close();
- }
- finally
- {
- throw sqlEx;
- }
- }
-
- return connection;
- }
-
- /**
- * Convenience method to create a new Connection configured for TRANSACTION_READ_COMMITED
- * isolation and with auto-commit transactions disabled.
- */
- private Connection newConnection() throws SQLException
- {
- final Connection connection = DriverManager.getConnection(_connectionURL);
- try
- {
- connection.setAutoCommit(false);
- connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
- }
- catch (SQLException sqlEx)
- {
- try
- {
- connection.close();
- }
- finally
- {
- throw sqlEx;
- }
- }
- return connection;
- }
-
- public void removeQueue(final AMQQueue queue) throws AMQStoreException
- {
- AMQShortString name = queue.getNameShortString();
- _logger.debug("public void removeQueue(AMQShortString name = " + name + "): called");
- Connection conn = null;
- PreparedStatement stmt = null;
- try
- {
- conn = newAutoCommitConnection();
- stmt = conn.prepareStatement(DELETE_FROM_QUEUE);
- stmt.setString(1, name.toString());
- int results = stmt.executeUpdate();
-
- if (results == 0)
- {
- throw new AMQStoreException("Queue " + name + " not found");
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error deleting AMQQueue with name " + name + " from database: " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- closeConnection(conn);
- }
-
-
- }
-
- public void createBrokerLink(final BrokerLink link) throws AMQStoreException
- {
- _logger.debug("public void createBrokerLink(BrokerLink = " + link + "): called");
-
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(FIND_LINK);
- try
- {
-
- stmt.setLong(1, link.getId().getLeastSignificantBits());
- stmt.setLong(2, link.getId().getMostSignificantBits());
- ResultSet rs = stmt.executeQuery();
- try
- {
-
- // If we don't have any data in the result set then we can add this queue
- if (!rs.next())
- {
- PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_LINKS);
-
- try
- {
-
- insertStmt.setLong(1, link.getId().getLeastSignificantBits());
- insertStmt.setLong(2, link.getId().getMostSignificantBits());
- insertStmt.setLong(3, link.getCreateTime());
-
- byte[] argumentBytes = convertStringMapToBytes(link.getArguments());
- ByteArrayInputStream bis = new ByteArrayInputStream(argumentBytes);
-
- insertStmt.setBinaryStream(4,bis,argumentBytes.length);
-
- insertStmt.execute();
- }
- finally
- {
- insertStmt.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- conn.close();
-
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error writing " + link + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- private byte[] convertStringMapToBytes(final Map<String, String> arguments) throws AMQStoreException
- {
- byte[] argumentBytes;
- if(arguments == null)
- {
- argumentBytes = new byte[0];
- }
- else
- {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- DataOutputStream dos = new DataOutputStream(bos);
-
-
- try
- {
- dos.writeInt(arguments.size());
- for(Map.Entry<String,String> arg : arguments.entrySet())
- {
- dos.writeUTF(arg.getKey());
- dos.writeUTF(arg.getValue());
- }
- }
- catch (IOException e)
- {
- // This should never happen
- throw new AMQStoreException(e.getMessage(), e);
- }
- argumentBytes = bos.toByteArray();
- }
- return argumentBytes;
- }
-
- public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
- {
- _logger.debug("public void deleteBrokerLink( " + link + "): called");
- Connection conn = null;
- PreparedStatement stmt = null;
- try
- {
- conn = newAutoCommitConnection();
- stmt = conn.prepareStatement(DELETE_FROM_LINKS);
- stmt.setLong(1, link.getId().getLeastSignificantBits());
- stmt.setLong(2, link.getId().getMostSignificantBits());
- int results = stmt.executeUpdate();
-
- if (results == 0)
- {
- throw new AMQStoreException("Link " + link + " not found");
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error deleting Link " + link + " from database: " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- closeConnection(conn);
- }
-
-
- }
-
- public void createBridge(final Bridge bridge) throws AMQStoreException
- {
- _logger.debug("public void createBridge(BrokerLink = " + bridge + "): called");
-
- if (_state != State.RECOVERING)
- {
- try
- {
- Connection conn = newAutoCommitConnection();
-
- PreparedStatement stmt = conn.prepareStatement(FIND_BRIDGE);
- try
- {
-
- UUID id = bridge.getId();
- stmt.setLong(1, id.getLeastSignificantBits());
- stmt.setLong(2, id.getMostSignificantBits());
- ResultSet rs = stmt.executeQuery();
- try
- {
-
- // If we don't have any data in the result set then we can add this queue
- if (!rs.next())
- {
- PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_BRIDGES);
-
- try
- {
-
- insertStmt.setLong(1, id.getLeastSignificantBits());
- insertStmt.setLong(2, id.getMostSignificantBits());
-
- insertStmt.setLong(3, bridge.getCreateTime());
-
- UUID linkId = bridge.getLink().getId();
- insertStmt.setLong(4, linkId.getLeastSignificantBits());
- insertStmt.setLong(5, linkId.getMostSignificantBits());
-
- byte[] argumentBytes = convertStringMapToBytes(bridge.getArguments());
- ByteArrayInputStream bis = new ByteArrayInputStream(argumentBytes);
-
- insertStmt.setBinaryStream(6,bis,argumentBytes.length);
-
- insertStmt.execute();
- }
- finally
- {
- insertStmt.close();
- }
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- conn.close();
-
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error writing " + bridge + " to database: " + e.getMessage(), e);
- }
- }
- }
-
- public void deleteBridge(final Bridge bridge) throws AMQStoreException
- {
- _logger.debug("public void deleteBridge( " + bridge + "): called");
- Connection conn = null;
- PreparedStatement stmt = null;
- try
- {
- conn = newAutoCommitConnection();
- stmt = conn.prepareStatement(DELETE_FROM_BRIDGES);
- stmt.setLong(1, bridge.getId().getLeastSignificantBits());
- stmt.setLong(2, bridge.getId().getMostSignificantBits());
- int results = stmt.executeUpdate();
-
- if (results == 0)
- {
- throw new AMQStoreException("Bridge " + bridge + " not found");
- }
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error deleting bridge " + bridge + " from database: " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- closeConnection(conn);
- }
-
- }
-
- public Transaction newTransaction()
- {
- return new DerbyTransaction();
- }
-
- public void enqueueMessage(ConnectionWrapper connWrapper, final TransactionLogResource queue, Long messageId) throws AMQStoreException
- {
- String name = queue.getResourceName();
-
- Connection conn = connWrapper.getConnection();
-
-
- try
- {
- if (_logger.isDebugEnabled())
- {
- _logger.debug("Enqueuing message " + messageId + " on queue " + name + "[Connection" + conn + "]");
- }
-
- PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_QUEUE_ENTRY);
- try
- {
- stmt.setString(1,name);
- stmt.setLong(2,messageId);
- stmt.executeUpdate();
- }
- finally
- {
- stmt.close();
- }
- }
- catch (SQLException e)
- {
- _logger.error("Failed to enqueue: " + e.getMessage(), e);
- throw new AMQStoreException("Error writing enqueued message with id " + messageId + " for queue " + name
- + " to database", e);
- }
-
- }
-
- public void dequeueMessage(ConnectionWrapper connWrapper, final TransactionLogResource queue, Long messageId) throws AMQStoreException
- {
- String name = queue.getResourceName();
-
-
- Connection conn = connWrapper.getConnection();
-
-
- try
- {
- PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_QUEUE_ENTRY);
- try
- {
- stmt.setString(1,name);
- stmt.setLong(2,messageId);
- int results = stmt.executeUpdate();
-
-
-
- if(results != 1)
- {
- throw new AMQStoreException("Unable to find message with id " + messageId + " on queue " + name);
- }
-
- if (_logger.isDebugEnabled())
- {
- _logger.debug("Dequeuing message " + messageId + " on queue " + name );
- }
- }
- finally
- {
- stmt.close();
- }
- }
- catch (SQLException e)
- {
- _logger.error("Failed to dequeue: " + e.getMessage(), e);
- throw new AMQStoreException("Error deleting enqueued message with id " + messageId + " for queue " + name
- + " from database", e);
- }
-
- }
-
-
- private void removeXid(ConnectionWrapper connWrapper, long format, byte[] globalId, byte[] branchId)
- throws AMQStoreException
- {
- Connection conn = connWrapper.getConnection();
-
-
- try
- {
- PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_XIDS);
- try
- {
- stmt.setLong(1,format);
- stmt.setBytes(2,globalId);
- stmt.setBytes(3,branchId);
- int results = stmt.executeUpdate();
-
-
-
- if(results != 1)
- {
- throw new AMQStoreException("Unable to find message with xid");
- }
- }
- finally
- {
- stmt.close();
- }
-
- stmt = conn.prepareStatement(DELETE_FROM_XID_ACTIONS);
- try
- {
- stmt.setLong(1,format);
- stmt.setBytes(2,globalId);
- stmt.setBytes(3,branchId);
- int results = stmt.executeUpdate();
-
- }
- finally
- {
- stmt.close();
- }
-
- }
- catch (SQLException e)
- {
- _logger.error("Failed to dequeue: " + e.getMessage(), e);
- throw new AMQStoreException("Error deleting enqueued message with xid", e);
- }
-
- }
-
-
- private void recordXid(ConnectionWrapper connWrapper, long format, byte[] globalId, byte[] branchId,
- Transaction.Record[] enqueues, Transaction.Record[] dequeues) throws AMQStoreException
- {
- Connection conn = connWrapper.getConnection();
-
-
- try
- {
-
- PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_XIDS);
- try
- {
- stmt.setLong(1,format);
- stmt.setBytes(2, globalId);
- stmt.setBytes(3, branchId);
- stmt.executeUpdate();
- }
- finally
- {
- stmt.close();
- }
-
- stmt = conn.prepareStatement(INSERT_INTO_XID_ACTIONS);
-
- try
- {
- stmt.setLong(1,format);
- stmt.setBytes(2, globalId);
- stmt.setBytes(3, branchId);
-
- if(enqueues != null)
- {
- stmt.setString(4, "E");
- for(Transaction.Record record : enqueues)
- {
- stmt.setString(5, record.getQueue().getResourceName());
- stmt.setLong(6, record.getMessage().getMessageNumber());
- stmt.executeUpdate();
- }
- }
-
- if(dequeues != null)
- {
- stmt.setString(4, "D");
- for(Transaction.Record record : dequeues)
- {
- stmt.setString(5, record.getQueue().getResourceName());
- stmt.setLong(6, record.getMessage().getMessageNumber());
- stmt.executeUpdate();
- }
- }
-
- }
- finally
- {
- stmt.close();
- }
-
- }
- catch (SQLException e)
- {
- _logger.error("Failed to enqueue: " + e.getMessage(), e);
- throw new AMQStoreException("Error writing xid ", e);
- }
-
- }
-
- private static final class ConnectionWrapper
- {
- private final Connection _connection;
-
- public ConnectionWrapper(Connection conn)
- {
- _connection = conn;
- }
-
- public Connection getConnection()
- {
- return _connection;
- }
- }
-
-
- public void commitTran(ConnectionWrapper connWrapper) throws AMQStoreException
- {
-
- try
- {
- Connection conn = connWrapper.getConnection();
- conn.commit();
-
- if (_logger.isDebugEnabled())
- {
- _logger.debug("commit tran completed");
- }
-
- conn.close();
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error commit tx: " + e.getMessage(), e);
- }
- finally
- {
-
- }
- }
-
- public StoreFuture commitTranAsync(ConnectionWrapper connWrapper) throws AMQStoreException
- {
- commitTran(connWrapper);
- return new CommitStoreFuture();
- }
-
- public void abortTran(ConnectionWrapper connWrapper) throws AMQStoreException
- {
- if (connWrapper == null)
- {
- throw new AMQStoreException("Fatal internal error: transactional context is empty at abortTran");
- }
-
- if (_logger.isDebugEnabled())
- {
- _logger.debug("abort tran called: " + connWrapper.getConnection());
- }
-
- try
- {
- Connection conn = connWrapper.getConnection();
- conn.rollback();
- conn.close();
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Error aborting transaction: " + e.getMessage(), e);
- }
-
- }
-
- public Long getNewMessageId()
- {
- return _messageId.incrementAndGet();
- }
-
-
- private void storeMetaData(Connection conn, long messageId, StorableMessageMetaData metaData)
- throws SQLException
- {
- if(_logger.isDebugEnabled())
- {
- _logger.debug("Adding metadata for message " +messageId);
- }
-
- PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_META_DATA);
- try
- {
- stmt.setLong(1,messageId);
-
- final int bodySize = 1 + metaData.getStorableSize();
- byte[] underlying = new byte[bodySize];
- underlying[0] = (byte) metaData.getType().ordinal();
- java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(underlying);
- buf.position(1);
- buf = buf.slice();
-
- metaData.writeToBuffer(0, buf);
- ByteArrayInputStream bis = new ByteArrayInputStream(underlying);
- try
- {
- stmt.setBinaryStream(2,bis,underlying.length);
- int result = stmt.executeUpdate();
-
- if(result == 0)
- {
- throw new RuntimeException("Unable to add meta data for message " +messageId);
- }
- }
- finally
- {
- try
- {
- bis.close();
- }
- catch (IOException e)
- {
-
- throw new SQLException(e);
- }
- }
-
- }
- finally
- {
- stmt.close();
- }
-
- }
-
-
-
-
- private void recoverMessages(MessageStoreRecoveryHandler recoveryHandler) throws SQLException
- {
- Connection conn = newAutoCommitConnection();
- try
- {
- MessageStoreRecoveryHandler.StoredMessageRecoveryHandler messageHandler = recoveryHandler.begin();
-
- Statement stmt = conn.createStatement();
- try
- {
- ResultSet rs = stmt.executeQuery(SELECT_ALL_FROM_META_DATA);
- try
- {
-
- long maxId = 0;
-
- while(rs.next())
- {
-
- long messageId = rs.getLong(1);
- Blob dataAsBlob = rs.getBlob(2);
-
- if(messageId > maxId)
- {
- maxId = messageId;
- }
-
- byte[] dataAsBytes = dataAsBlob.getBytes(1,(int) dataAsBlob.length());
- java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(dataAsBytes);
- buf.position(1);
- buf = buf.slice();
- MessageMetaDataType type = MessageMetaDataType.values()[dataAsBytes[0]];
- StorableMessageMetaData metaData = type.getFactory().createMetaData(buf);
- StoredDerbyMessage message = new StoredDerbyMessage(messageId, metaData, false);
- messageHandler.message(message);
- }
-
- _messageId.set(maxId);
-
- messageHandler.completeMessageRecovery();
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
-
-
-
- private TransactionLogRecoveryHandler.DtxRecordRecoveryHandler recoverQueueEntries(TransactionLogRecoveryHandler recoveryHandler) throws SQLException
- {
- Connection conn = newAutoCommitConnection();
- try
- {
- TransactionLogRecoveryHandler.QueueEntryRecoveryHandler queueEntryHandler = recoveryHandler.begin(this);
-
- Statement stmt = conn.createStatement();
- try
- {
- ResultSet rs = stmt.executeQuery(SELECT_FROM_QUEUE_ENTRY);
- try
- {
- while(rs.next())
- {
-
- String queueName = rs.getString(1);
- long messageId = rs.getLong(2);
- queueEntryHandler.queueEntry(queueName,messageId);
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
- return queueEntryHandler.completeQueueEntryRecovery();
- }
- finally
- {
- conn.close();
- }
- }
-
- private static final class Xid
- {
-
- private final long _format;
- private final byte[] _globalId;
- private final byte[] _branchId;
-
- public Xid(long format, byte[] globalId, byte[] branchId)
- {
- _format = format;
- _globalId = globalId;
- _branchId = branchId;
- }
-
- public long getFormat()
- {
- return _format;
- }
-
- public byte[] getGlobalId()
- {
- return _globalId;
- }
-
- public byte[] getBranchId()
- {
- return _branchId;
- }
- }
-
- private static class RecordImpl implements MessageStore.Transaction.Record, TransactionLogResource, EnqueableMessage
- {
-
- private final String _queueName;
- private long _messageNumber;
-
- public RecordImpl(String queueName, long messageNumber)
- {
- _queueName = queueName;
- _messageNumber = messageNumber;
- }
-
- public TransactionLogResource getQueue()
- {
- return this;
- }
-
- public EnqueableMessage getMessage()
- {
- return this;
- }
-
- public long getMessageNumber()
- {
- return _messageNumber;
- }
-
- public boolean isPersistent()
- {
- return true;
- }
-
- public StoredMessage getStoredMessage()
- {
- throw new UnsupportedOperationException();
- }
-
- public String getResourceName()
- {
- return _queueName;
- }
- }
-
- private void recoverXids(TransactionLogRecoveryHandler.DtxRecordRecoveryHandler dtxrh) throws SQLException
- {
- Connection conn = newAutoCommitConnection();
- try
- {
- List<Xid> xids = new ArrayList<Xid>();
-
- Statement stmt = conn.createStatement();
- try
- {
- ResultSet rs = stmt.executeQuery(SELECT_ALL_FROM_XIDS);
- try
- {
- while(rs.next())
- {
-
- long format = rs.getLong(1);
- byte[] globalId = rs.getBytes(2);
- byte[] branchId = rs.getBytes(3);
- xids.add(new Xid(format, globalId, branchId));
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
-
-
-
- for(Xid xid : xids)
- {
- List<RecordImpl> enqueues = new ArrayList<RecordImpl>();
- List<RecordImpl> dequeues = new ArrayList<RecordImpl>();
-
- PreparedStatement pstmt = conn.prepareStatement(SELECT_ALL_FROM_XID_ACTIONS);
-
- try
- {
- pstmt.setLong(1, xid.getFormat());
- pstmt.setBytes(2, xid.getGlobalId());
- pstmt.setBytes(3, xid.getBranchId());
-
- ResultSet rs = pstmt.executeQuery();
- try
- {
- while(rs.next())
- {
-
- String actionType = rs.getString(1);
- String queueName = rs.getString(2);
- long messageId = rs.getLong(3);
-
- RecordImpl record = new RecordImpl(queueName, messageId);
- List<RecordImpl> records = "E".equals(actionType) ? enqueues : dequeues;
- records.add(record);
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- pstmt.close();
- }
-
- dtxrh.dtxRecord(xid.getFormat(), xid.getGlobalId(), xid.getBranchId(),
- enqueues.toArray(new RecordImpl[enqueues.size()]),
- dequeues.toArray(new RecordImpl[dequeues.size()]));
- }
-
-
- dtxrh.completeDtxRecordRecovery();
- }
- finally
- {
- conn.close();
- }
-
- }
-
- StorableMessageMetaData getMetaData(long messageId) throws SQLException
- {
-
- Connection conn = newAutoCommitConnection();
- try
- {
- PreparedStatement stmt = conn.prepareStatement(SELECT_FROM_META_DATA);
- try
- {
- stmt.setLong(1,messageId);
- ResultSet rs = stmt.executeQuery();
- try
- {
-
- if(rs.next())
- {
- Blob dataAsBlob = rs.getBlob(1);
-
- byte[] dataAsBytes = dataAsBlob.getBytes(1,(int) dataAsBlob.length());
- java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(dataAsBytes);
- buf.position(1);
- buf = buf.slice();
- MessageMetaDataType type = MessageMetaDataType.values()[dataAsBytes[0]];
- StorableMessageMetaData metaData = type.getFactory().createMetaData(buf);
-
- return metaData;
- }
- else
- {
- throw new RuntimeException("Meta data not found for message with id " + messageId);
- }
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- stmt.close();
- }
- }
- finally
- {
- conn.close();
- }
- }
-
-
- private void addContent(Connection conn, long messageId, int offset, ByteBuffer src)
- {
- if(_logger.isDebugEnabled())
- {
- _logger.debug("Adding content chunk offset " + offset + " for message " +messageId);
- }
- PreparedStatement stmt = null;
-
- try
- {
- src = src.slice();
-
- byte[] chunkData = new byte[src.limit()];
- src.duplicate().get(chunkData);
-
- stmt = conn.prepareStatement(INSERT_INTO_MESSAGE_CONTENT);
- stmt.setLong(1,messageId);
- stmt.setInt(2, offset);
- stmt.setInt(3, offset+chunkData.length);
-
-
- // TODO in Java 6 we could just use blobs
-
- ByteArrayInputStream bis = new ByteArrayInputStream(chunkData);
- stmt.setBinaryStream(4, bis, chunkData.length);
- stmt.executeUpdate();
- }
- catch (SQLException e)
- {
- closeConnection(conn);
- throw new RuntimeException("Error adding content chunk offset " + offset + " for message " + messageId + ": " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- }
-
- }
-
-
- public int getContent(long messageId, int offset, ByteBuffer dst)
- {
- Connection conn = null;
- PreparedStatement stmt = null;
-
- try
- {
- conn = newAutoCommitConnection();
-
- stmt = conn.prepareStatement(SELECT_FROM_MESSAGE_CONTENT);
- stmt.setLong(1,messageId);
- stmt.setInt(2, offset);
- stmt.setInt(3, offset+dst.remaining());
- ResultSet rs = stmt.executeQuery();
-
- int written = 0;
-
- while(rs.next())
- {
- int offsetInMessage = rs.getInt(1);
- Blob dataAsBlob = rs.getBlob(2);
-
- final int size = (int) dataAsBlob.length();
- byte[] dataAsBytes = dataAsBlob.getBytes(1, size);
-
- int posInArray = offset + written - offsetInMessage;
- int count = size - posInArray;
- if(count > dst.remaining())
- {
- count = dst.remaining();
- }
- dst.put(dataAsBytes,posInArray,count);
- written+=count;
-
- if(dst.remaining() == 0)
- {
- break;
- }
- }
-
- return written;
-
- }
- catch (SQLException e)
- {
- throw new RuntimeException("Error retrieving content from offset " + offset + " for message " + messageId + ": " + e.getMessage(), e);
- }
- finally
- {
- closePreparedStatement(stmt);
- closeConnection(conn);
- }
-
-
- }
-
- public boolean isPersistent()
- {
- return true;
- }
-
-
- private synchronized void stateTransition(State requiredState, State newState) throws AMQStoreException
- {
- if (_state != requiredState)
- {
- throw new AMQStoreException("Cannot transition to the state: " + newState + "; need to be in state: " + requiredState
- + "; currently in state: " + _state);
- }
-
- _state = newState;
- }
-
-
- private class DerbyTransaction implements Transaction
- {
- private final ConnectionWrapper _connWrapper;
-
-
- private DerbyTransaction()
- {
- try
- {
- _connWrapper = new ConnectionWrapper(newConnection());
- }
- catch (SQLException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
- if(message.getStoredMessage() instanceof StoredDerbyMessage)
- {
- try
- {
- ((StoredDerbyMessage)message.getStoredMessage()).store(_connWrapper.getConnection());
- }
- catch (SQLException e)
- {
- throw new AMQStoreException("Exception on enqueuing message " + _messageId, e);
- }
- }
-
- DerbyMessageStore.this.enqueueMessage(_connWrapper, queue, message.getMessageNumber());
- }
-
- public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
- DerbyMessageStore.this.dequeueMessage(_connWrapper, queue, message.getMessageNumber());
-
- }
-
- public void commitTran() throws AMQStoreException
- {
- DerbyMessageStore.this.commitTran(_connWrapper);
- }
-
- public StoreFuture commitTranAsync() throws AMQStoreException
- {
- return DerbyMessageStore.this.commitTranAsync(_connWrapper);
- }
-
- public void abortTran() throws AMQStoreException
- {
- DerbyMessageStore.this.abortTran(_connWrapper);
- }
-
- public void removeXid(long format, byte[] globalId, byte[] branchId) throws AMQStoreException
- {
- DerbyMessageStore.this.removeXid(_connWrapper, format, globalId, branchId);
- }
-
- public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues, Record[] dequeues)
- throws AMQStoreException
- {
- DerbyMessageStore.this.recordXid(_connWrapper, format, globalId, branchId, enqueues, dequeues);
- }
- }
-
-
-
- private class StoredDerbyMessage implements StoredMessage
- {
-
- private final long _messageId;
- private StorableMessageMetaData _metaData;
- private volatile SoftReference<StorableMessageMetaData> _metaDataRef;
- private byte[] _data;
- private volatile SoftReference<byte[]> _dataRef;
-
-
- StoredDerbyMessage(long messageId, StorableMessageMetaData metaData)
- {
- this(messageId, metaData, true);
- }
-
-
- StoredDerbyMessage(long messageId,
- StorableMessageMetaData metaData, boolean persist)
- {
- _messageId = messageId;
-
-
- _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
- if(persist)
- {
- _metaData = metaData;
- }
- }
-
- public StorableMessageMetaData getMetaData()
- {
- StorableMessageMetaData metaData = _metaData == null ? _metaDataRef.get() : _metaData;
- if(metaData == null)
- {
- try
- {
- metaData = DerbyMessageStore.this.getMetaData(_messageId);
- }
- catch (SQLException e)
- {
- throw new RuntimeException(e);
- }
- _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
- }
-
- return metaData;
- }
-
- public long getMessageNumber()
- {
- return _messageId;
- }
-
- public void addContent(int offsetInMessage, java.nio.ByteBuffer src)
- {
- src = src.slice();
-
- if(_data == null)
- {
- _data = new byte[src.remaining()];
- _dataRef = new SoftReference<byte[]>(_data);
- src.duplicate().get(_data);
- }
- else
- {
- byte[] oldData = _data;
- _data = new byte[oldData.length + src.remaining()];
- _dataRef = new SoftReference<byte[]>(_data);
-
- System.arraycopy(oldData,0,_data,0,oldData.length);
- src.duplicate().get(_data, oldData.length, src.remaining());
- }
-
- }
-
- public int getContent(int offsetInMessage, java.nio.ByteBuffer dst)
- {
- byte[] data = _dataRef == null ? null : _dataRef.get();
- if(data != null)
- {
- int length = Math.min(dst.remaining(), data.length - offsetInMessage);
- dst.put(data, offsetInMessage, length);
- return length;
- }
- else
- {
- return DerbyMessageStore.this.getContent(_messageId, offsetInMessage, dst);
- }
- }
-
-
- public ByteBuffer getContent(int offsetInMessage, int size)
- {
- ByteBuffer buf = ByteBuffer.allocate(size);
- getContent(offsetInMessage, buf);
- buf.position(0);
- return buf;
- }
-
- public synchronized StoreFuture flushToStore()
- {
- try
- {
- if(_metaData != null)
- {
- Connection conn = newConnection();
-
- store(conn);
-
- conn.commit();
- conn.close();
- }
- }
- catch (SQLException e)
- {
- if(_logger.isDebugEnabled())
- {
- _logger.debug("Error when trying to flush message " + _messageId + " to store: " + e);
- }
- throw new RuntimeException(e);
- }
- return IMMEDIATE_FUTURE;
- }
-
- private synchronized void store(final Connection conn) throws SQLException
- {
- if(_metaData != null)
- {
- try
- {
- storeMetaData(conn, _messageId, _metaData);
- DerbyMessageStore.this.addContent(conn, _messageId, 0,
- _data == null ? ByteBuffer.allocate(0) : ByteBuffer.wrap(_data));
- }
- finally
- {
- _metaData = null;
- _data = null;
- }
- }
-
- if(_logger.isDebugEnabled())
- {
- _logger.debug("Storing message " + _messageId + " to store");
- }
- }
-
- public void remove()
- {
- DerbyMessageStore.this.removeMessage(_messageId);
- }
- }
-
- private void closeConnection(final Connection conn)
- {
- if(conn != null)
- {
- try
- {
- conn.close();
- }
- catch (SQLException e)
- {
- _logger.error("Problem closing connection", e);
- }
- }
- }
-
- private void closePreparedStatement(final PreparedStatement stmt)
- {
- if (stmt != null)
- {
- try
- {
- stmt.close();
- }
- catch(SQLException e)
- {
- _logger.error("Problem closing prepared statement", e);
- }
- }
- }
-
-} \ No newline at end of file
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java
index 123ecd8145..655887e5c2 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java
@@ -23,12 +23,11 @@ package org.apache.qpid.server.store;
import org.apache.commons.configuration.Configuration;
import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.federation.Bridge;
import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.queue.AMQQueue;
public interface DurableConfigurationStore
@@ -36,23 +35,21 @@ public interface DurableConfigurationStore
public static interface Source
{
- DurableConfigurationStore getDurableConfigurationStore();
+ DurableConfigurationStore getMessageStore();
}
/**
* Called after instantiation in order to configure the message store. A particular implementation can define
* whatever parameters it wants.
*
- * @param name The name to be used by this storem
+ * @param name The name to be used by this store
* @param recoveryHandler Handler to be called as the store recovers on start up
* @param config The apache commons configuration object.
- *
* @throws Exception If any error occurs that means the store is unable to configure itself.
*/
void configureConfigStore(String name,
ConfigurationRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception;
+ Configuration config) throws Exception;
/**
* Makes the specified exchange persistent.
*
@@ -72,28 +69,22 @@ public interface DurableConfigurationStore
void removeExchange(Exchange exchange) throws AMQStoreException;
/**
- * Binds the specified queue to an exchange with a routing key.
+ * Store the queue binding.
*
- * @param exchange The exchange to bind to.
- * @param routingKey The routing key to bind by.
- * @param queue The queue to bind.
- * @param args Additional parameters.
+ * @param binding queue binding
*
* @throws AMQStoreException if the operation fails for any reason.
*/
- void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException;
+ void bindQueue(Binding binding) throws AMQStoreException;
/**
- * Unbinds the specified from an exchange under a particular routing key.
+ * Removes queue binding
*
- * @param exchange The exchange to unbind from.
- * @param routingKey The routing key to unbind.
- * @param queue The queue to unbind.
- * @param args Additonal parameters.
+ * @param binding queue binding to remove
*
* @throws AMQStoreException If the operation fails for any reason.
*/
- void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException;
+ void unbindQueue(Binding binding) throws AMQStoreException;
/**
* Makes the specified queue persistent.
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/Event.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/Event.java
new file mode 100644
index 0000000000..bbde11ab4c
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/Event.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public enum Event
+{
+ BEFORE_INIT,
+ AFTER_INIT,
+ BEFORE_ACTIVATE,
+ AFTER_ACTIVATE,
+ BEFORE_PASSIVATE,
+ AFTER_PASSIVATE,
+ BEFORE_CLOSE,
+ AFTER_CLOSE
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/EventListener.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/EventListener.java
new file mode 100644
index 0000000000..33ae7b5b24
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/EventListener.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public interface EventListener
+{
+ public void event(Event event);
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/EventManager.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/EventManager.java
new file mode 100644
index 0000000000..21ae3924b8
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/EventManager.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+
+public class EventManager
+{
+ private Map<Event, List<EventListener>> _listeners = new EnumMap<Event, List<EventListener>> (Event.class);
+
+ public synchronized void addEventListener(EventListener listener, Event... events)
+ {
+ for(Event event : events)
+ {
+ List<EventListener> list = _listeners.get(event);
+ if(list == null)
+ {
+ list = new ArrayList<EventListener>();
+ _listeners.put(event,list);
+ }
+ list.add(listener);
+ }
+ }
+
+ public synchronized void notifyEvent(Event event)
+ {
+ if (_listeners.containsKey(event))
+ {
+ for (EventListener listener : _listeners.get(event))
+ {
+ listener.event(event);
+ }
+ }
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java
index b01e5aa954..59624b7a75 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStore.java
@@ -21,102 +21,86 @@
package org.apache.qpid.server.store;
import org.apache.commons.configuration.Configuration;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.AMQException;
import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.exchange.Exchange;
-import org.apache.qpid.server.federation.Bridge;
-import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.logging.actors.CurrentActor;
-import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
-import org.apache.qpid.server.logging.messages.MessageStoreMessages;
import org.apache.qpid.server.message.EnqueableMessage;
-import org.apache.qpid.server.queue.AMQQueue;
-import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
-/** A simple message store that stores the messages in a threadsafe structure in memory. */
-public class MemoryMessageStore implements MessageStore, DurableConfigurationStore
+/** A simple message store that stores the messages in a thread-safe structure in memory. */
+public class MemoryMessageStore extends NullMessageStore
{
- private static final Logger _log = Logger.getLogger(MemoryMessageStore.class);
-
- private static final int DEFAULT_HASHTABLE_CAPACITY = 50000;
-
- private static final String HASHTABLE_CAPACITY_CONFIG = "hashtable-capacity";
-
-
private final AtomicLong _messageId = new AtomicLong(1);
- private AtomicBoolean _closed = new AtomicBoolean(false);
- private LogSubject _logSubject;
+ private final AtomicBoolean _closed = new AtomicBoolean(false);
private static final Transaction IN_MEMORY_TRANSACTION = new Transaction()
{
- public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
+ @Override
+ public StoreFuture commitTranAsync() throws AMQStoreException
{
+ return StoreFuture.IMMEDIATE_FUTURE;
}
- public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
+ @Override
+ public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
{
}
- public void commitTran() throws AMQStoreException
+ @Override
+ public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
{
}
- public StoreFuture commitTranAsync() throws AMQStoreException
+ @Override
+ public void commitTran() throws AMQStoreException
{
- return IMMEDIATE_FUTURE;
}
+ @Override
public void abortTran() throws AMQStoreException
{
}
+ @Override
public void removeXid(long format, byte[] globalId, byte[] branchId)
{
}
+ @Override
public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues, Record[] dequeues)
{
}
-
};
- public void configureConfigStore(String name, ConfigurationRecoveryHandler handler, Configuration configuration, LogSubject logSubject) throws Exception
- {
- _logSubject = logSubject;
- CurrentActor.get().message(_logSubject, ConfigStoreMessages.CREATED(this.getClass().getName()));
-
+ private final StateManager _stateManager;
+ private final EventManager _eventManager = new EventManager();
+ public MemoryMessageStore()
+ {
+ _stateManager = new StateManager(_eventManager);
}
- public void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
+ @Override
+ public void configureConfigStore(String name, ConfigurationRecoveryHandler recoveryHandler, Configuration config) throws Exception
{
- if(_logSubject == null)
- {
- _logSubject = logSubject;
- }
- int hashtableCapacity = config.getInt(name + "." + HASHTABLE_CAPACITY_CONFIG, DEFAULT_HASHTABLE_CAPACITY);
- _log.info("Using capacity " + hashtableCapacity + " for hash tables");
- CurrentActor.get().message(_logSubject, MessageStoreMessages.CREATED(this.getClass().getName()));
+ _stateManager.attainState(State.CONFIGURING);
}
- public void close() throws Exception
+ @Override
+ public void configureMessageStore(String name, MessageStoreRecoveryHandler recoveryHandler, TransactionLogRecoveryHandler tlogRecoveryHandler, Configuration config) throws Exception
{
- _closed.getAndSet(true);
- CurrentActor.get().message(_logSubject,MessageStoreMessages.CLOSED());
+ _stateManager.attainState(State.CONFIGURED);
+ }
+ @Override
+ public void activate() throws Exception
+ {
+ _stateManager.attainState(State.RECOVERING);
+
+ _stateManager.attainState(State.ACTIVE);
}
+ @Override
public StoredMessage addMessage(StorableMessageMetaData metaData)
{
final long id = _messageId.getAndIncrement();
@@ -125,104 +109,29 @@ public class MemoryMessageStore implements MessageStore, DurableConfigurationSto
return message;
}
-
- public void createExchange(Exchange exchange) throws AMQStoreException
- {
-
- }
-
- public void removeExchange(Exchange exchange) throws AMQStoreException
- {
-
- }
-
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
-
- }
-
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
-
- }
-
-
- public void createQueue(AMQQueue queue) throws AMQStoreException
- {
- // Not requred to do anything
- }
-
- public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
- {
- // Not required to do anything
- }
-
- public void removeQueue(final AMQQueue queue) throws AMQStoreException
- {
- // Not required to do anything
- }
-
- public void updateQueue(final AMQQueue queue) throws AMQStoreException
- {
- // Not required to do anything
- }
-
- public void createBrokerLink(final BrokerLink link) throws AMQStoreException
- {
-
- }
-
- public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
- {
-
- }
-
- public void createBridge(final Bridge bridge) throws AMQStoreException
- {
-
- }
-
- public void deleteBridge(final Bridge bridge) throws AMQStoreException
- {
-
- }
-
- public void configureTransactionLog(String name,
- TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
+ @Override
public Transaction newTransaction()
{
return IN_MEMORY_TRANSACTION;
}
-
- public List<AMQQueue> createQueues() throws AMQException
+ @Override
+ public boolean isPersistent()
{
- return null;
+ return false;
}
- public Long getNewMessageId()
+ @Override
+ public void close() throws Exception
{
- return _messageId.getAndIncrement();
+ _stateManager.attainState(State.CLOSING);
+ _closed.getAndSet(true);
+ _stateManager.attainState(State.CLOSED);
}
- public boolean isPersistent()
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
{
- return false;
- }
-
- private void checkNotClosed() throws MessageStoreClosedException
- {
- if (_closed.get())
- {
- throw new MessageStoreClosedException();
- }
+ _eventManager.addEventListener(eventListener, events);
}
-
-
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStoreFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStoreFactory.java
new file mode 100644
index 0000000000..8724f102c6
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MemoryMessageStoreFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public class MemoryMessageStoreFactory implements MessageStoreFactory
+{
+
+ @Override
+ public MessageStore createMessageStore()
+ {
+ return new MemoryMessageStore();
+ }
+
+ @Override
+ public String getStoreClassName()
+ {
+ return MemoryMessageStore.class.getSimpleName();
+ }
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageMetaDataType.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageMetaDataType.java
index 428bb1e41b..0fab60b6f3 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageMetaDataType.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageMetaDataType.java
@@ -22,13 +22,16 @@ package org.apache.qpid.server.store;
import org.apache.qpid.server.message.MessageMetaData;
import org.apache.qpid.server.message.MessageMetaData_0_10;
+import org.apache.qpid.server.message.MessageMetaData_1_0;
import java.nio.ByteBuffer;
public enum MessageMetaDataType
{
META_DATA_0_8 { public Factory<MessageMetaData> getFactory() { return MessageMetaData.FACTORY; } },
- META_DATA_0_10 { public Factory<MessageMetaData_0_10> getFactory() { return MessageMetaData_0_10.FACTORY; } };
+ META_DATA_0_10 { public Factory<MessageMetaData_0_10> getFactory() { return MessageMetaData_0_10.FACTORY; } },
+ META_DATA_1_0 { public Factory<MessageMetaData_1_0> getFactory() { return MessageMetaData_1_0.FACTORY; } };
+
public static interface Factory<M extends StorableMessageMetaData>
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java
index 00bb0449d6..cf08ee00ff 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java
@@ -21,52 +21,29 @@
package org.apache.qpid.server.store;
import org.apache.commons.configuration.Configuration;
-import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.message.EnqueableMessage;
/**
* MessageStore defines the interface to a storage area, which can be used to preserve the state of messages.
*
*/
-public interface MessageStore
+public interface MessageStore extends DurableConfigurationStore
{
- StoreFuture IMMEDIATE_FUTURE = new StoreFuture()
- {
- public boolean isComplete()
- {
- return true;
- }
-
- public void waitForCompletion()
- {
-
- }
- };
-
-
/**
* Called after instantiation in order to configure the message store. A particular implementation can define
* whatever parameters it wants.
*
- * @param name The name to be used by this storem
- * @param recoveryHandler Handler to be called as the store recovers on start up
+ * @param name The name to be used by this store
+ * @param messageRecoveryHandler Handler to be called as the store recovers on start up
+ * @param tlogRecoveryHandler
* @param config The apache commons configuration object.
- *
* @throws Exception If any error occurs that means the store is unable to configure itself.
*/
void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception;
-
- /**
- * Called to close and cleanup any resources used by the message store.
- *
- * @throws Exception If the close fails.
- */
- void close() throws Exception;
+ MessageStoreRecoveryHandler messageRecoveryHandler,
+ TransactionLogRecoveryHandler tlogRecoveryHandler,
+ Configuration config) throws Exception;
+ void activate() throws Exception;
public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(T metaData);
@@ -78,79 +55,16 @@ public interface MessageStore
*/
boolean isPersistent();
-
-
- public static interface Transaction
- {
- /**
- * Places a message onto a specified queue, in a given transactional context.
- *
- *
- *
- * @param queue The queue to place the message on.
- * @param message
- * @throws org.apache.qpid.AMQStoreException If the operation fails for any reason.
- */
- void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException;
-
- /**
- * Extracts a message from a specified queue, in a given transactional context.
- *
- * @param queue The queue to place the message on.
- * @param message The message to dequeue.
- * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
- */
- void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException;
-
-
- /**
- * Commits all operations performed within a given transactional context.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- void commitTran() throws AMQStoreException;
-
- /**
- * Commits all operations performed within a given transactional context.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- StoreFuture commitTranAsync() throws AMQStoreException;
-
- /**
- * Abandons all operations performed within a given transactional context.
- *
- * @throws AMQStoreException If the operation fails for any reason.
- */
- void abortTran() throws AMQStoreException;
-
-
- public static interface Record
- {
- TransactionLogResource getQueue();
- EnqueableMessage getMessage();
- }
-
- void removeXid(long format, byte[] globalId, byte[] branchId) throws AMQStoreException;
-
- void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues, Record[] dequeues)
- throws AMQStoreException;
- }
-
- public void configureTransactionLog(String name,
- TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception;
-
Transaction newTransaction();
+ /**
+ * Called to close and cleanup any resources used by the message store.
+ *
+ * @throws Exception If the close fails.
+ */
+ void close() throws Exception;
+ void addEventListener(EventListener eventListener, Event... events);
- public static interface StoreFuture
- {
- boolean isComplete();
-
- void waitForCompletion();
- }
-
+ String getStoreLocation();
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreConstants.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreConstants.java
new file mode 100644
index 0000000000..aba7456a44
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreConstants.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public class MessageStoreConstants
+{
+
+ public static final String ENVIRONMENT_PATH_PROPERTY = "environment-path";
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreFactory.java
new file mode 100644
index 0000000000..a35db62b03
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreFactory.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public interface MessageStoreFactory
+{
+ MessageStore createMessageStore();
+
+ String getStoreClassName();
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java
new file mode 100644
index 0000000000..34c7d2d933
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.federation.Bridge;
+import org.apache.qpid.server.federation.BrokerLink;
+import org.apache.qpid.server.queue.AMQQueue;
+
+public class NullMessageStore implements MessageStore
+{
+ @Override
+ public void configureConfigStore(String name,
+ ConfigurationRecoveryHandler recoveryHandler,
+ Configuration config) throws Exception
+ {
+ }
+
+ @Override
+ public void createExchange(Exchange exchange) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void removeExchange(Exchange exchange) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void bindQueue(Binding binding) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void unbindQueue(Binding binding) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void createQueue(AMQQueue queue) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void removeQueue(AMQQueue queue) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void updateQueue(AMQQueue queue) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void createBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void createBridge(final Bridge bridge) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void deleteBridge(final Bridge bridge) throws AMQStoreException
+ {
+ }
+
+ @Override
+ public void configureMessageStore(String name,
+ MessageStoreRecoveryHandler recoveryHandler,
+ TransactionLogRecoveryHandler tlogRecoveryHandler, Configuration config) throws Exception
+ {
+ }
+
+ @Override
+ public void close() throws Exception
+ {
+ }
+
+ @Override
+ public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(T metaData)
+ {
+ return null;
+ }
+
+ @Override
+ public boolean isPersistent()
+ {
+ return false;
+ }
+
+ @Override
+ public Transaction newTransaction()
+ {
+ return null;
+ }
+
+ @Override
+ public void activate() throws Exception
+ {
+ }
+
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
+ {
+ }
+
+ @Override
+ public String getStoreLocation()
+ {
+ return null;
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/OperationalLoggingListener.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/OperationalLoggingListener.java
new file mode 100644
index 0000000000..caff17daa5
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/OperationalLoggingListener.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import org.apache.qpid.server.logging.LogSubject;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
+import org.apache.qpid.server.logging.messages.MessageStoreMessages;
+import org.apache.qpid.server.logging.messages.TransactionLogMessages;
+
+public class OperationalLoggingListener implements EventListener
+{
+ protected final LogSubject _logSubject;
+ private MessageStore _store;
+
+ private OperationalLoggingListener(final MessageStore store, LogSubject logSubject)
+ {
+ _logSubject = logSubject;
+ store.addEventListener(this, Event.BEFORE_INIT, Event.AFTER_INIT, Event.BEFORE_ACTIVATE, Event.AFTER_ACTIVATE, Event.AFTER_CLOSE);
+ _store = store;
+ }
+
+ public void event(Event event)
+ {
+ switch(event)
+ {
+ case BEFORE_INIT:
+ CurrentActor.get().message(_logSubject, ConfigStoreMessages.CREATED());
+ break;
+ case AFTER_INIT:
+ CurrentActor.get().message(_logSubject, MessageStoreMessages.CREATED());
+ CurrentActor.get().message(_logSubject, TransactionLogMessages.CREATED());
+ String storeLocation = _store.getStoreLocation();
+ if (storeLocation != null)
+ {
+ CurrentActor.get().message(_logSubject, MessageStoreMessages.STORE_LOCATION(storeLocation));
+ }
+ break;
+ case BEFORE_ACTIVATE:
+ CurrentActor.get().message(_logSubject, MessageStoreMessages.RECOVERY_START());
+ break;
+ case AFTER_ACTIVATE:
+ CurrentActor.get().message(_logSubject, MessageStoreMessages.RECOVERY_COMPLETE());
+ break;
+ case AFTER_CLOSE:
+ CurrentActor.get().message(_logSubject,MessageStoreMessages.CLOSED());
+ break;
+
+ }
+ }
+
+ public static void listen(final MessageStore store, LogSubject logSubject)
+ {
+ new OperationalLoggingListener(store, logSubject);
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/State.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/State.java
new file mode 100644
index 0000000000..7cbdede85e
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/State.java
@@ -0,0 +1,38 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public enum State
+{
+
+ INITIAL,
+ CONFIGURING,
+ CONFIGURED,
+ RECOVERING,
+ ACTIVE,
+ QUIESCING,
+ QUIESCED,
+ CLOSING,
+ CLOSED;
+
+
+
+} \ No newline at end of file
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StateManager.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StateManager.java
new file mode 100644
index 0000000000..5998be5bb6
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StateManager.java
@@ -0,0 +1,151 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+
+import java.util.EnumMap;
+import java.util.Map;
+
+public class StateManager
+{
+ private State _state = State.INITIAL;
+ private EventListener _eventListener;
+
+ private static final Map<State,Map<State, Transition>> _validTransitions = new EnumMap<State, Map<State, Transition>>(State.class);
+
+
+ static class Transition
+ {
+ private final Event _event;
+ private final State _endState;
+ private final State _startState;
+
+ public Transition(State startState, State endState, Event event)
+ {
+ _event = event;
+ _startState = startState;
+ _endState = endState;
+
+ Map<State, Transition> stateTransitions = _validTransitions.get(startState);
+ if(stateTransitions == null)
+ {
+ stateTransitions = new EnumMap<State, Transition>(State.class);
+ _validTransitions.put(startState, stateTransitions);
+ }
+ stateTransitions.put(endState, this);
+ }
+
+ public Event getEvent()
+ {
+ return _event;
+ }
+
+ public State getStartState()
+ {
+ return _startState;
+ }
+
+ public State getEndState()
+ {
+ return _endState;
+ }
+
+ }
+
+ public static final Transition CONFIGURE = new Transition(State.INITIAL, State.CONFIGURING, Event.BEFORE_INIT);
+ public static final Transition CONFIGURE_COMPLETE = new Transition(State.CONFIGURING, State.CONFIGURED, Event.AFTER_INIT);
+ public static final Transition RECOVER = new Transition(State.CONFIGURED, State.RECOVERING, Event.BEFORE_ACTIVATE);
+ public static final Transition ACTIVATE = new Transition(State.RECOVERING, State.ACTIVE, Event.AFTER_ACTIVATE);
+ public static final Transition CLOSE_ACTIVE = new Transition(State.ACTIVE, State.CLOSING, Event.BEFORE_CLOSE);
+ public static final Transition CLOSE_QUIESCED = new Transition(State.QUIESCED, State.CLOSING, Event.BEFORE_CLOSE);
+ public static final Transition CLOSE_COMPLETE = new Transition(State.CLOSING, State.CLOSED, Event.AFTER_CLOSE);
+ public static final Transition QUIESCE = new Transition(State.ACTIVE, State.QUIESCING, Event.BEFORE_PASSIVATE);
+ public static final Transition QUIESCE_COMPLETE = new Transition(State.QUIESCING, State.QUIESCED, Event.BEFORE_PASSIVATE);
+ public static final Transition RESTART = new Transition(State.QUIESCED, State.RECOVERING, Event.BEFORE_ACTIVATE);
+
+
+ public StateManager(final EventManager eventManager)
+ {
+ this(new EventListener()
+ {
+ @Override
+ public void event(Event event)
+ {
+ eventManager.notifyEvent(event);
+ }
+ });
+ }
+
+
+ public StateManager(EventListener eventListener)
+ {
+ _eventListener = eventListener;
+ }
+
+ public synchronized State getState()
+ {
+ return _state;
+ }
+
+ public synchronized void stateTransition(final State current, final State desired)
+ {
+ if (_state != current)
+ {
+ throw new IllegalStateException("Cannot transition to the state: " + desired + "; need to be in state: " + current
+ + "; currently in state: " + _state);
+ }
+ attainState(desired);
+ }
+
+ public synchronized void attainState(State desired)
+ {
+ Transition transition = null;
+ final Map<State, Transition> stateTransitionMap = _validTransitions.get(_state);
+ if(stateTransitionMap != null)
+ {
+ transition = stateTransitionMap.get(desired);
+ }
+ if(transition == null)
+ {
+ throw new IllegalStateException("No valid transition from state " + _state + " to state " + desired);
+ }
+ _state = desired;
+ _eventListener.event(transition.getEvent());
+ }
+
+ public synchronized boolean isInState(State testedState)
+ {
+ return _state.equals(testedState);
+ }
+
+ public synchronized boolean isNotInState(State testedState)
+ {
+ return !isInState(testedState);
+ }
+
+ public synchronized void checkInState(State checkedState)
+ {
+ if (isNotInState(checkedState))
+ {
+ throw new IllegalStateException("Unexpected state. Was : " + _state + " but expected : " + checkedState);
+ }
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoreFuture.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoreFuture.java
new file mode 100644
index 0000000000..7d3bf90a75
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoreFuture.java
@@ -0,0 +1,40 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.qpid.server.store;
+
+public interface StoreFuture
+{
+ StoreFuture IMMEDIATE_FUTURE = new StoreFuture()
+ {
+ public boolean isComplete()
+ {
+ return true;
+ }
+
+ public void waitForCompletion()
+ {
+ }
+ };
+
+ boolean isComplete();
+
+ void waitForCompletion();
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoredMemoryMessage.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoredMemoryMessage.java
index 144cc629bd..e7302270bb 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoredMemoryMessage.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoredMemoryMessage.java
@@ -122,9 +122,9 @@ public class StoredMemoryMessage implements StoredMessage
return buf;
}
- public MessageStore.StoreFuture flushToStore()
+ public StoreFuture flushToStore()
{
- return MessageStore.IMMEDIATE_FUTURE;
+ return StoreFuture.IMMEDIATE_FUTURE;
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoredMessage.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoredMessage.java
index d4a0381929..7909003855 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoredMessage.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/StoredMessage.java
@@ -34,7 +34,7 @@ public interface StoredMessage<M extends StorableMessageMetaData>
ByteBuffer getContent(int offsetInMessage, int size);
- MessageStore.StoreFuture flushToStore();
+ StoreFuture flushToStore();
void remove();
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/Transaction.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/Transaction.java
new file mode 100644
index 0000000000..ed6b89e373
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/Transaction.java
@@ -0,0 +1,81 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.server.message.EnqueableMessage;
+
+public interface Transaction
+{
+ /**
+ * Places a message onto a specified queue, in a given transactional context.
+ *
+ *
+ *
+ * @param queue The queue to place the message on.
+ * @param message
+ * @throws org.apache.qpid.AMQStoreException If the operation fails for any reason.
+ */
+ void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException;
+
+ /**
+ * Extracts a message from a specified queue, in a given transactional context.
+ *
+ * @param queue The queue to place the message on.
+ * @param message The message to dequeue.
+ * @throws AMQStoreException If the operation fails for any reason, or if the specified message does not exist.
+ */
+ void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException;
+
+
+ /**
+ * Commits all operations performed within a given transactional context.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ void commitTran() throws AMQStoreException;
+
+ /**
+ * Commits all operations performed within a given transactional context.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ StoreFuture commitTranAsync() throws AMQStoreException;
+
+ /**
+ * Abandons all operations performed within a given transactional context.
+ *
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ void abortTran() throws AMQStoreException;
+
+
+ public static interface Record
+ {
+ TransactionLogResource getQueue();
+ EnqueableMessage getMessage();
+ }
+
+ void removeXid(long format, byte[] globalId, byte[] branchId) throws AMQStoreException;
+
+ void recordXid(long format, byte[] globalId, byte[] branchId, Transaction.Record[] enqueues, Transaction.Record[] dequeues)
+ throws AMQStoreException;
+} \ No newline at end of file
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogRecoveryHandler.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogRecoveryHandler.java
index 48ca72718b..bd4da648f9 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogRecoveryHandler.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogRecoveryHandler.java
@@ -20,20 +20,22 @@
*/
package org.apache.qpid.server.store;
+import java.util.UUID;
+
public interface TransactionLogRecoveryHandler
{
QueueEntryRecoveryHandler begin(MessageStore log);
public static interface QueueEntryRecoveryHandler
{
- void queueEntry(String queuename, long messageId);
-
DtxRecordRecoveryHandler completeQueueEntryRecovery();
+
+ void queueEntry(UUID queueId, long messageId);
}
public static interface DtxRecordRecoveryHandler
{
- void dtxRecord(long format, byte[] globalId, byte[] branchId, MessageStore.Transaction.Record[] enqueues, MessageStore.Transaction.Record[] dequeues);
+ void dtxRecord(long format, byte[] globalId, byte[] branchId, Transaction.Record[] enqueues, Transaction.Record[] dequeues);
void completeDtxRecordRecovery();
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogResource.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogResource.java
index 0d81dd151d..576dca847d 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogResource.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/TransactionLogResource.java
@@ -20,7 +20,9 @@
*/
package org.apache.qpid.server.store;
+import java.util.UUID;
+
public interface TransactionLogResource
{
- public String getResourceName();
+ public UUID getId();
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java
new file mode 100644
index 0000000000..0371cdcfcb
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java
@@ -0,0 +1,2449 @@
+/*
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*
+*/
+package org.apache.qpid.server.store.derby;
+
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.lang.ref.SoftReference;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.sql.Blob;
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.commons.configuration.Configuration;
+import org.apache.log4j.Logger;
+import org.apache.qpid.AMQException;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.federation.Bridge;
+import org.apache.qpid.server.federation.BrokerLink;
+import org.apache.qpid.server.message.EnqueableMessage;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
+import org.apache.qpid.server.store.ConfiguredObjectHelper;
+import org.apache.qpid.server.store.ConfiguredObjectRecord;
+import org.apache.qpid.server.store.Event;
+import org.apache.qpid.server.store.EventListener;
+import org.apache.qpid.server.store.EventManager;
+import org.apache.qpid.server.store.MessageMetaDataType;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreConstants;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
+import org.apache.qpid.server.store.State;
+import org.apache.qpid.server.store.StateManager;
+import org.apache.qpid.server.store.StorableMessageMetaData;
+import org.apache.qpid.server.store.StoreFuture;
+import org.apache.qpid.server.store.StoredMemoryMessage;
+import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.Transaction;
+import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
+import org.apache.qpid.server.store.TransactionLogResource;
+
+/**
+ * An implementation of a {@link MessageStore} that uses Apache Derby as the persistence
+ * mechanism.
+ *
+ * TODO extract the SQL statements into a generic JDBC store
+ */
+public class DerbyMessageStore implements MessageStore
+{
+
+ private static final Logger _logger = Logger.getLogger(DerbyMessageStore.class);
+
+ private static final String SQL_DRIVER_NAME = "org.apache.derby.jdbc.EmbeddedDriver";
+
+ private static final String DB_VERSION_TABLE_NAME = "QPID_DB_VERSION";
+
+ private static final String QUEUE_ENTRY_TABLE_NAME = "QPID_QUEUE_ENTRIES";
+
+ private static final String META_DATA_TABLE_NAME = "QPID_MESSAGE_METADATA";
+ private static final String MESSAGE_CONTENT_TABLE_NAME = "QPID_MESSAGE_CONTENT";
+
+ private static final String LINKS_TABLE_NAME = "QPID_LINKS";
+ private static final String BRIDGES_TABLE_NAME = "QPID_BRIDGES";
+
+ private static final String XID_TABLE_NAME = "QPID_XIDS";
+ private static final String XID_ACTIONS_TABLE_NAME = "QPID_XID_ACTIONS";
+
+ private static final String CONFIGURED_OBJECTS_TABLE_NAME = "QPID_CONFIGURED_OBJECTS";
+
+ private static final int DB_VERSION = 6;
+
+
+
+ private static Class<Driver> DRIVER_CLASS;
+
+ private final AtomicLong _messageId = new AtomicLong(0);
+ private AtomicBoolean _closed = new AtomicBoolean(false);
+
+ private String _connectionURL;
+
+ private static final String TABLE_EXISTANCE_QUERY = "SELECT 1 FROM SYS.SYSTABLES WHERE TABLENAME = ?";
+
+ private static final String CREATE_DB_VERSION_TABLE = "CREATE TABLE "+DB_VERSION_TABLE_NAME+" ( version int not null )";
+ private static final String INSERT_INTO_DB_VERSION = "INSERT INTO "+DB_VERSION_TABLE_NAME+" ( version ) VALUES ( ? )";
+
+ private static final String CREATE_QUEUE_ENTRY_TABLE = "CREATE TABLE "+QUEUE_ENTRY_TABLE_NAME+" ( queue_id varchar(36) not null, message_id bigint not null, PRIMARY KEY (queue_id, message_id) )";
+ private static final String INSERT_INTO_QUEUE_ENTRY = "INSERT INTO " + QUEUE_ENTRY_TABLE_NAME + " (queue_id, message_id) values (?,?)";
+ private static final String DELETE_FROM_QUEUE_ENTRY = "DELETE FROM " + QUEUE_ENTRY_TABLE_NAME + " WHERE queue_id = ? AND message_id =?";
+ private static final String SELECT_FROM_QUEUE_ENTRY = "SELECT queue_id, message_id FROM " + QUEUE_ENTRY_TABLE_NAME + " ORDER BY queue_id, message_id";
+
+
+ private static final String CREATE_META_DATA_TABLE = "CREATE TABLE " + META_DATA_TABLE_NAME
+ + " ( message_id bigint not null, meta_data blob, PRIMARY KEY ( message_id ) )";
+ private static final String CREATE_MESSAGE_CONTENT_TABLE = "CREATE TABLE " + MESSAGE_CONTENT_TABLE_NAME
+ + " ( message_id bigint not null, content blob , PRIMARY KEY (message_id) )";
+
+ private static final String INSERT_INTO_MESSAGE_CONTENT = "INSERT INTO " + MESSAGE_CONTENT_TABLE_NAME
+ + "( message_id, content ) values (?, ?)";
+ private static final String SELECT_FROM_MESSAGE_CONTENT = "SELECT content FROM " + MESSAGE_CONTENT_TABLE_NAME
+ + " WHERE message_id = ?";
+ private static final String DELETE_FROM_MESSAGE_CONTENT = "DELETE FROM " + MESSAGE_CONTENT_TABLE_NAME
+ + " WHERE message_id = ?";
+
+ private static final String INSERT_INTO_META_DATA = "INSERT INTO " + META_DATA_TABLE_NAME + "( message_id , meta_data ) values (?, ?)";;
+ private static final String SELECT_FROM_META_DATA =
+ "SELECT meta_data FROM " + META_DATA_TABLE_NAME + " WHERE message_id = ?";
+ private static final String DELETE_FROM_META_DATA = "DELETE FROM " + META_DATA_TABLE_NAME + " WHERE message_id = ?";
+ private static final String SELECT_ALL_FROM_META_DATA = "SELECT message_id, meta_data FROM " + META_DATA_TABLE_NAME;
+
+ private static final String CREATE_LINKS_TABLE =
+ "CREATE TABLE "+LINKS_TABLE_NAME+" ( id_lsb bigint not null,"
+ + " id_msb bigint not null,"
+ + " create_time bigint not null,"
+ + " arguments blob, PRIMARY KEY ( id_lsb, id_msb ))";
+ private static final String SELECT_FROM_LINKS =
+ "SELECT create_time, arguments FROM " + LINKS_TABLE_NAME + " WHERE id_lsb = ? and id_msb";
+ private static final String DELETE_FROM_LINKS = "DELETE FROM " + LINKS_TABLE_NAME
+ + " WHERE id_lsb = ? and id_msb = ?";
+ private static final String SELECT_ALL_FROM_LINKS = "SELECT id_lsb, id_msb, create_time, "
+ + "arguments FROM " + LINKS_TABLE_NAME;
+ private static final String FIND_LINK = "SELECT id_lsb, id_msb FROM " + LINKS_TABLE_NAME + " WHERE id_lsb = ? and"
+ + " id_msb = ?";
+ private static final String INSERT_INTO_LINKS = "INSERT INTO " + LINKS_TABLE_NAME + "( id_lsb, "
+ + "id_msb, create_time, arguments ) values (?, ?, ?, ?)";
+
+
+ private static final String CREATE_BRIDGES_TABLE =
+ "CREATE TABLE "+BRIDGES_TABLE_NAME+" ( id_lsb bigint not null,"
+ + " id_msb bigint not null,"
+ + " create_time bigint not null,"
+ + " link_id_lsb bigint not null,"
+ + " link_id_msb bigint not null,"
+ + " arguments blob, PRIMARY KEY ( id_lsb, id_msb ))";
+ private static final String SELECT_FROM_BRIDGES =
+ "SELECT create_time, link_id_lsb, link_id_msb, arguments FROM "
+ + BRIDGES_TABLE_NAME + " WHERE id_lsb = ? and id_msb = ?";
+ private static final String DELETE_FROM_BRIDGES = "DELETE FROM " + BRIDGES_TABLE_NAME
+ + " WHERE id_lsb = ? and id_msb = ?";
+ private static final String SELECT_ALL_FROM_BRIDGES = "SELECT id_lsb, id_msb, "
+ + " create_time,"
+ + " link_id_lsb, link_id_msb, "
+ + "arguments FROM " + BRIDGES_TABLE_NAME
+ + " WHERE link_id_lsb = ? and link_id_msb = ?";
+ private static final String FIND_BRIDGE = "SELECT id_lsb, id_msb FROM " + BRIDGES_TABLE_NAME +
+ " WHERE id_lsb = ? and id_msb = ?";
+ private static final String INSERT_INTO_BRIDGES = "INSERT INTO " + BRIDGES_TABLE_NAME + "( id_lsb, id_msb, "
+ + "create_time, "
+ + "link_id_lsb, link_id_msb, "
+ + "arguments )"
+ + " values (?, ?, ?, ?, ?, ?)";
+
+ private static final String CREATE_XIDS_TABLE =
+ "CREATE TABLE "+XID_TABLE_NAME+" ( format bigint not null,"
+ + " global_id varchar(64) for bit data, branch_id varchar(64) for bit data, PRIMARY KEY ( format, " +
+ "global_id, branch_id ))";
+ private static final String INSERT_INTO_XIDS =
+ "INSERT INTO "+XID_TABLE_NAME+" ( format, global_id, branch_id ) values (?, ?, ?)";
+ private static final String DELETE_FROM_XIDS = "DELETE FROM " + XID_TABLE_NAME
+ + " WHERE format = ? and global_id = ? and branch_id = ?";
+ private static final String SELECT_ALL_FROM_XIDS = "SELECT format, global_id, branch_id FROM " + XID_TABLE_NAME;
+
+
+ private static final String CREATE_XID_ACTIONS_TABLE =
+ "CREATE TABLE "+XID_ACTIONS_TABLE_NAME+" ( format bigint not null,"
+ + " global_id varchar(64) for bit data not null, branch_id varchar(64) for bit data not null, " +
+ "action_type char not null, queue_id varchar(36) not null, message_id bigint not null" +
+ ", PRIMARY KEY ( " +
+ "format, global_id, branch_id, action_type, queue_id, message_id))";
+ private static final String INSERT_INTO_XID_ACTIONS =
+ "INSERT INTO "+XID_ACTIONS_TABLE_NAME+" ( format, global_id, branch_id, action_type, " +
+ "queue_id, message_id ) values (?,?,?,?,?,?) ";
+ private static final String DELETE_FROM_XID_ACTIONS = "DELETE FROM " + XID_ACTIONS_TABLE_NAME
+ + " WHERE format = ? and global_id = ? and branch_id = ?";
+ private static final String SELECT_ALL_FROM_XID_ACTIONS =
+ "SELECT action_type, queue_id, message_id FROM " + XID_ACTIONS_TABLE_NAME +
+ " WHERE format = ? and global_id = ? and branch_id = ?";
+
+ private static final String CREATE_CONFIGURED_OBJECTS_TABLE = "CREATE TABLE " + CONFIGURED_OBJECTS_TABLE_NAME
+ + " ( id VARCHAR(36) not null, object_type varchar(255), attributes blob, PRIMARY KEY (id))";
+ private static final String INSERT_INTO_CONFIGURED_OBJECTS = "INSERT INTO " + CONFIGURED_OBJECTS_TABLE_NAME
+ + " ( id, object_type, attributes) VALUES (?,?,?)";
+ private static final String UPDATE_CONFIGURED_OBJECTS = "UPDATE " + CONFIGURED_OBJECTS_TABLE_NAME
+ + " set object_type =?, attributes = ? where id = ?";
+ private static final String DELETE_FROM_CONFIGURED_OBJECTS = "DELETE FROM " + CONFIGURED_OBJECTS_TABLE_NAME
+ + " where id = ?";
+ private static final String FIND_CONFIGURED_OBJECT = "SELECT object_type, attributes FROM " + CONFIGURED_OBJECTS_TABLE_NAME
+ + " where id = ?";
+ private static final String SELECT_FROM_CONFIGURED_OBJECTS = "SELECT id, object_type, attributes FROM " + CONFIGURED_OBJECTS_TABLE_NAME;
+
+ private final Charset UTF8_CHARSET = Charset.forName("UTF-8");
+
+ private static final String DERBY_SINGLE_DB_SHUTDOWN_CODE = "08006";
+
+ private final StateManager _stateManager;
+
+ private final EventManager _eventManager = new EventManager();
+
+ private MessageStoreRecoveryHandler _messageRecoveryHandler;
+
+ private TransactionLogRecoveryHandler _tlogRecoveryHandler;
+
+ private ConfigurationRecoveryHandler _configRecoveryHandler;
+ private String _storeLocation;
+
+ public DerbyMessageStore()
+ {
+ _stateManager = new StateManager(_eventManager);
+ }
+
+ private ConfiguredObjectHelper _configuredObjectHelper = new ConfiguredObjectHelper();
+
+ @Override
+ public void configureConfigStore(String name,
+ ConfigurationRecoveryHandler configRecoveryHandler,
+ Configuration storeConfiguration) throws Exception
+ {
+ _stateManager.attainState(State.CONFIGURING);
+ _configRecoveryHandler = configRecoveryHandler;
+
+ commonConfiguration(name, storeConfiguration);
+
+ }
+
+ @Override
+ public void configureMessageStore(String name,
+ MessageStoreRecoveryHandler recoveryHandler,
+ TransactionLogRecoveryHandler tlogRecoveryHandler,
+ Configuration storeConfiguration) throws Exception
+ {
+ _tlogRecoveryHandler = tlogRecoveryHandler;
+ _messageRecoveryHandler = recoveryHandler;
+
+ _stateManager.attainState(State.CONFIGURED);
+ }
+
+ @Override
+ public void activate() throws Exception
+ {
+ _stateManager.attainState(State.RECOVERING);
+
+ // this recovers durable exchanges, queues, and bindings
+ recoverConfiguration(_configRecoveryHandler);
+ recoverMessages(_messageRecoveryHandler);
+ TransactionLogRecoveryHandler.DtxRecordRecoveryHandler dtxrh = recoverQueueEntries(_tlogRecoveryHandler);
+ recoverXids(dtxrh);
+
+ _stateManager.attainState(State.ACTIVE);
+ }
+
+ private void commonConfiguration(String name, Configuration storeConfiguration)
+ throws ClassNotFoundException, SQLException
+ {
+ initialiseDriver();
+
+ //Update to pick up QPID_WORK and use that as the default location not just derbyDB
+
+ final String databasePath = storeConfiguration.getString(MessageStoreConstants.ENVIRONMENT_PATH_PROPERTY, System.getProperty("QPID_WORK")
+ + File.separator + "derbyDB");
+
+ File environmentPath = new File(databasePath);
+ if (!environmentPath.exists())
+ {
+ if (!environmentPath.mkdirs())
+ {
+ throw new IllegalArgumentException("Environment path " + environmentPath + " could not be read or created. "
+ + "Ensure the path is correct and that the permissions are correct.");
+ }
+ }
+
+ _storeLocation = databasePath;
+
+ createOrOpenDatabase(name, databasePath);
+ }
+
+ private static synchronized void initialiseDriver() throws ClassNotFoundException
+ {
+ if(DRIVER_CLASS == null)
+ {
+ DRIVER_CLASS = (Class<Driver>) Class.forName(SQL_DRIVER_NAME);
+ }
+ }
+
+ private void createOrOpenDatabase(String name, final String environmentPath) throws SQLException
+ {
+ //FIXME this the _vhost name should not be added here, but derby wont use an empty directory as was possibly just created.
+ _connectionURL = "jdbc:derby:" + environmentPath + "/" + name + ";create=true";
+
+ Connection conn = newAutoCommitConnection();
+
+ createVersionTable(conn);
+ createConfiguredObjectsTable(conn);
+ createQueueEntryTable(conn);
+ createMetaDataTable(conn);
+ createMessageContentTable(conn);
+ createLinkTable(conn);
+ createBridgeTable(conn);
+ createXidTable(conn);
+ createXidActionTable(conn);
+ conn.close();
+ }
+
+
+
+ private void createVersionTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(DB_VERSION_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_DB_VERSION_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ PreparedStatement pstmt = conn.prepareStatement(INSERT_INTO_DB_VERSION);
+ try
+ {
+ pstmt.setInt(1, DB_VERSION);
+ pstmt.execute();
+ }
+ finally
+ {
+ pstmt.close();
+ }
+ }
+
+ }
+
+ private void createConfiguredObjectsTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(CONFIGURED_OBJECTS_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_CONFIGURED_OBJECTS_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ }
+
+ private void createQueueEntryTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(QUEUE_ENTRY_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_QUEUE_ENTRY_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+
+ }
+
+ private void createMetaDataTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(META_DATA_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_META_DATA_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+
+ }
+
+
+ private void createMessageContentTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(MESSAGE_CONTENT_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_MESSAGE_CONTENT_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+
+ }
+
+ private void createLinkTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(LINKS_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_LINKS_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ }
+
+
+ private void createBridgeTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(BRIDGES_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_BRIDGES_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ }
+
+ private void createXidTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(XID_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_XIDS_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ }
+
+
+ private void createXidActionTable(final Connection conn) throws SQLException
+ {
+ if(!tableExists(XID_ACTIONS_TABLE_NAME, conn))
+ {
+ Statement stmt = conn.createStatement();
+ try
+ {
+ stmt.execute(CREATE_XID_ACTIONS_TABLE);
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ }
+
+ private boolean tableExists(final String tableName, final Connection conn) throws SQLException
+ {
+ PreparedStatement stmt = conn.prepareStatement(TABLE_EXISTANCE_QUERY);
+ try
+ {
+ stmt.setString(1, tableName);
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+ return rs.next();
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+
+ private void recoverConfiguration(ConfigurationRecoveryHandler recoveryHandler) throws AMQException
+ {
+ try
+ {
+ List<ConfiguredObjectRecord> configuredObjects = loadConfiguredObjects();
+ ConfigurationRecoveryHandler.QueueRecoveryHandler qrh = recoveryHandler.begin(this);
+ _configuredObjectHelper.recoverQueues(qrh, configuredObjects);
+
+ ConfigurationRecoveryHandler.ExchangeRecoveryHandler erh = qrh.completeQueueRecovery();
+ _configuredObjectHelper.recoverExchanges(erh, configuredObjects);
+
+ ConfigurationRecoveryHandler.BindingRecoveryHandler brh = erh.completeExchangeRecovery();
+ _configuredObjectHelper.recoverBindings(brh, configuredObjects);
+
+ ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh = brh.completeBindingRecovery();
+ recoverBrokerLinks(lrh);
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error recovering persistent state: " + e.getMessage(), e);
+ }
+ }
+
+ private void recoverBrokerLinks(final ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler lrh)
+ throws SQLException
+ {
+ _logger.info("Recovering broker links...");
+
+ Connection conn = null;
+ try
+ {
+ conn = newAutoCommitConnection();
+
+ PreparedStatement stmt = conn.prepareStatement(SELECT_ALL_FROM_LINKS);
+
+ try
+ {
+ ResultSet rs = stmt.executeQuery();
+
+ try
+ {
+
+ while(rs.next())
+ {
+ UUID id = new UUID(rs.getLong(2), rs.getLong(1));
+ long createTime = rs.getLong(3);
+ Blob argumentsAsBlob = rs.getBlob(4);
+
+ byte[] dataAsBytes = argumentsAsBlob.getBytes(1,(int) argumentsAsBlob.length());
+
+ DataInputStream dis = new DataInputStream(new ByteArrayInputStream(dataAsBytes));
+ int size = dis.readInt();
+
+ Map<String,String> arguments = new HashMap<String, String>();
+
+ for(int i = 0; i < size; i++)
+ {
+ arguments.put(dis.readUTF(), dis.readUTF());
+ }
+
+ ConfigurationRecoveryHandler.BridgeRecoveryHandler brh = lrh.brokerLink(id, createTime, arguments);
+
+ recoverBridges(brh, id);
+
+ }
+ }
+ catch (IOException e)
+ {
+ throw new SQLException(e.getMessage(), e);
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ }
+ finally
+ {
+ if(conn != null)
+ {
+ conn.close();
+ }
+ }
+
+ }
+
+ private void recoverBridges(final ConfigurationRecoveryHandler.BridgeRecoveryHandler brh, final UUID linkId)
+ throws SQLException
+ {
+ _logger.info("Recovering bridges for link " + linkId + "...");
+
+ Connection conn = null;
+ try
+ {
+ conn = newAutoCommitConnection();
+
+ PreparedStatement stmt = conn.prepareStatement(SELECT_ALL_FROM_BRIDGES);
+
+ try
+ {
+ stmt.setLong(1, linkId.getLeastSignificantBits());
+ stmt.setLong(2, linkId.getMostSignificantBits());
+
+ ResultSet rs = stmt.executeQuery();
+
+ try
+ {
+
+ while(rs.next())
+ {
+ UUID id = new UUID(rs.getLong(2), rs.getLong(1));
+ long createTime = rs.getLong(3);
+ Blob argumentsAsBlob = rs.getBlob(6);
+
+ byte[] dataAsBytes = argumentsAsBlob.getBytes(1,(int) argumentsAsBlob.length());
+
+ DataInputStream dis = new DataInputStream(new ByteArrayInputStream(dataAsBytes));
+ int size = dis.readInt();
+
+ Map<String,String> arguments = new HashMap<String, String>();
+
+ for(int i = 0; i < size; i++)
+ {
+ arguments.put(dis.readUTF(), dis.readUTF());
+ }
+
+ brh.bridge(id, createTime, arguments);
+
+ }
+ brh.completeBridgeRecoveryForLink();
+ }
+ catch (IOException e)
+ {
+ throw new SQLException(e.getMessage(), e);
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ }
+ finally
+ {
+ if(conn != null)
+ {
+ conn.close();
+ }
+ }
+
+ }
+
+ @Override
+ public void close() throws Exception
+ {
+ _closed.getAndSet(true);
+ _stateManager.stateTransition(State.ACTIVE, State.CLOSING);
+
+ try
+ {
+ Connection conn = DriverManager.getConnection(_connectionURL + ";shutdown=true");
+ // Shouldn't reach this point - shutdown=true should throw SQLException
+ conn.close();
+ _logger.error("Unable to shut down the store");
+ }
+ catch (SQLException e)
+ {
+ if (e.getSQLState().equalsIgnoreCase(DERBY_SINGLE_DB_SHUTDOWN_CODE))
+ {
+ //expected and represents a clean shutdown of this database only, do nothing.
+ }
+ else
+ {
+ _logger.error("Exception whilst shutting down the store: " + e);
+ }
+ }
+
+ _stateManager.stateTransition(State.CLOSING, State.CLOSED);
+ }
+
+ @Override
+ public StoredMessage addMessage(StorableMessageMetaData metaData)
+ {
+ if(metaData.isPersistent())
+ {
+ return new StoredDerbyMessage(_messageId.incrementAndGet(), metaData);
+ }
+ else
+ {
+ return new StoredMemoryMessage(_messageId.incrementAndGet(), metaData);
+ }
+ }
+
+ public StoredMessage getMessage(long messageNumber)
+ {
+ return null;
+ }
+
+ public void removeMessage(long messageId)
+ {
+ try
+ {
+ Connection conn = newConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_META_DATA);
+ try
+ {
+ stmt.setLong(1,messageId);
+ int results = stmt.executeUpdate();
+ stmt.close();
+
+ if (results == 0)
+ {
+ _logger.warn("Message metadata not found for message id " + messageId);
+ }
+
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Deleted metadata for message " + messageId);
+ }
+
+ stmt = conn.prepareStatement(DELETE_FROM_MESSAGE_CONTENT);
+ stmt.setLong(1,messageId);
+ results = stmt.executeUpdate();
+ }
+ finally
+ {
+ stmt.close();
+ }
+ conn.commit();
+ }
+ catch(SQLException e)
+ {
+ try
+ {
+ conn.rollback();
+ }
+ catch(SQLException t)
+ {
+ // ignore - we are re-throwing underlying exception
+ }
+
+ throw e;
+
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException("Error removing message with id " + messageId + " from database: " + e.getMessage(), e);
+ }
+
+ }
+
+ @Override
+ public void createExchange(Exchange exchange) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord configuredObject = _configuredObjectHelper.createExchangeConfiguredObject(exchange);
+ insertConfiguredObject(configuredObject);
+ }
+
+ }
+
+ @Override
+ public void removeExchange(Exchange exchange) throws AMQStoreException
+ {
+ int results = removeConfiguredObject(exchange.getId());
+ if (results == 0)
+ {
+ throw new AMQStoreException("Exchange " + exchange.getName() + " with id " + exchange.getId() + " not found");
+ }
+ }
+
+ @Override
+ public void bindQueue(Binding binding)
+ throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord configuredObject = _configuredObjectHelper.createBindingConfiguredObject(binding);
+ insertConfiguredObject(configuredObject);
+ }
+ }
+
+ @Override
+ public void unbindQueue(Binding binding)
+ throws AMQStoreException
+ {
+ int results = removeConfiguredObject(binding.getId());
+ if (results == 0)
+ {
+ throw new AMQStoreException("Binding " + binding + " not found");
+ }
+ }
+
+ @Override
+ public void createQueue(AMQQueue queue) throws AMQStoreException
+ {
+ createQueue(queue, null);
+ }
+
+ @Override
+ public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
+ {
+ _logger.debug("public void createQueue(AMQQueue queue = " + queue + "): called");
+
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord queueConfiguredObject = _configuredObjectHelper.createQueueConfiguredObject(queue, arguments);
+ insertConfiguredObject(queueConfiguredObject);
+ }
+ }
+
+ /**
+ * Updates the specified queue in the persistent store, IF it is already present. If the queue
+ * is not present in the store, it will not be added.
+ *
+ * NOTE: Currently only updates the exclusivity.
+ *
+ * @param queue The queue to update the entry for.
+ * @throws AMQStoreException If the operation fails for any reason.
+ */
+ @Override
+ public void updateQueue(final AMQQueue queue) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ ConfiguredObjectRecord queueConfiguredObject = loadConfiguredObject(queue.getId());
+ if (queueConfiguredObject != null)
+ {
+ ConfiguredObjectRecord newQueueRecord = _configuredObjectHelper.updateQueueConfiguredObject(queue, queueConfiguredObject);
+ updateConfiguredObject(newQueueRecord);
+ }
+ }
+
+ }
+
+ /**
+ * Convenience method to create a new Connection configured for TRANSACTION_READ_COMMITED
+ * isolation and with auto-commit transactions enabled.
+ */
+ private Connection newAutoCommitConnection() throws SQLException
+ {
+ final Connection connection = newConnection();
+ try
+ {
+ connection.setAutoCommit(true);
+ }
+ catch (SQLException sqlEx)
+ {
+
+ try
+ {
+ connection.close();
+ }
+ finally
+ {
+ throw sqlEx;
+ }
+ }
+
+ return connection;
+ }
+
+ /**
+ * Convenience method to create a new Connection configured for TRANSACTION_READ_COMMITED
+ * isolation and with auto-commit transactions disabled.
+ */
+ private Connection newConnection() throws SQLException
+ {
+ final Connection connection = DriverManager.getConnection(_connectionURL);
+ try
+ {
+ connection.setAutoCommit(false);
+ connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+ }
+ catch (SQLException sqlEx)
+ {
+ try
+ {
+ connection.close();
+ }
+ finally
+ {
+ throw sqlEx;
+ }
+ }
+ return connection;
+ }
+
+ @Override
+ public void removeQueue(final AMQQueue queue) throws AMQStoreException
+ {
+ AMQShortString name = queue.getNameShortString();
+ _logger.debug("public void removeQueue(AMQShortString name = " + name + "): called");
+ int results = removeConfiguredObject(queue.getId());
+ if (results == 0)
+ {
+ throw new AMQStoreException("Queue " + name + " with id " + queue.getId() + " not found");
+ }
+ }
+
+ @Override
+ public void createBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ _logger.debug("public void createBrokerLink(BrokerLink = " + link + "): called");
+
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+
+ PreparedStatement stmt = conn.prepareStatement(FIND_LINK);
+ try
+ {
+
+ stmt.setLong(1, link.getId().getLeastSignificantBits());
+ stmt.setLong(2, link.getId().getMostSignificantBits());
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+
+ // If we don't have any data in the result set then we can add this queue
+ if (!rs.next())
+ {
+ PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_LINKS);
+
+ try
+ {
+
+ insertStmt.setLong(1, link.getId().getLeastSignificantBits());
+ insertStmt.setLong(2, link.getId().getMostSignificantBits());
+ insertStmt.setLong(3, link.getCreateTime());
+
+ byte[] argumentBytes = convertStringMapToBytes(link.getArguments());
+ ByteArrayInputStream bis = new ByteArrayInputStream(argumentBytes);
+
+ insertStmt.setBinaryStream(4,bis,argumentBytes.length);
+
+ insertStmt.execute();
+ }
+ finally
+ {
+ insertStmt.close();
+ }
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ conn.close();
+
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error writing " + link + " to database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ private byte[] convertStringMapToBytes(final Map<String, String> arguments) throws AMQStoreException
+ {
+ byte[] argumentBytes;
+ if(arguments == null)
+ {
+ argumentBytes = new byte[0];
+ }
+ else
+ {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(bos);
+
+
+ try
+ {
+ dos.writeInt(arguments.size());
+ for(Map.Entry<String,String> arg : arguments.entrySet())
+ {
+ dos.writeUTF(arg.getKey());
+ dos.writeUTF(arg.getValue());
+ }
+ }
+ catch (IOException e)
+ {
+ // This should never happen
+ throw new AMQStoreException(e.getMessage(), e);
+ }
+ argumentBytes = bos.toByteArray();
+ }
+ return argumentBytes;
+ }
+
+ @Override
+ public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
+ {
+ _logger.debug("public void deleteBrokerLink( " + link + "): called");
+ Connection conn = null;
+ PreparedStatement stmt = null;
+ try
+ {
+ conn = newAutoCommitConnection();
+ stmt = conn.prepareStatement(DELETE_FROM_LINKS);
+ stmt.setLong(1, link.getId().getLeastSignificantBits());
+ stmt.setLong(2, link.getId().getMostSignificantBits());
+ int results = stmt.executeUpdate();
+
+ if (results == 0)
+ {
+ throw new AMQStoreException("Link " + link + " not found");
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error deleting Link " + link + " from database: " + e.getMessage(), e);
+ }
+ finally
+ {
+ closePreparedStatement(stmt);
+ closeConnection(conn);
+ }
+
+
+ }
+
+ @Override
+ public void createBridge(final Bridge bridge) throws AMQStoreException
+ {
+ _logger.debug("public void createBridge(BrokerLink = " + bridge + "): called");
+
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+
+ PreparedStatement stmt = conn.prepareStatement(FIND_BRIDGE);
+ try
+ {
+
+ UUID id = bridge.getId();
+ stmt.setLong(1, id.getLeastSignificantBits());
+ stmt.setLong(2, id.getMostSignificantBits());
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+
+ // If we don't have any data in the result set then we can add this queue
+ if (!rs.next())
+ {
+ PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_BRIDGES);
+
+ try
+ {
+
+ insertStmt.setLong(1, id.getLeastSignificantBits());
+ insertStmt.setLong(2, id.getMostSignificantBits());
+
+ insertStmt.setLong(3, bridge.getCreateTime());
+
+ UUID linkId = bridge.getLink().getId();
+ insertStmt.setLong(4, linkId.getLeastSignificantBits());
+ insertStmt.setLong(5, linkId.getMostSignificantBits());
+
+ byte[] argumentBytes = convertStringMapToBytes(bridge.getArguments());
+ ByteArrayInputStream bis = new ByteArrayInputStream(argumentBytes);
+
+ insertStmt.setBinaryStream(6,bis,argumentBytes.length);
+
+ insertStmt.execute();
+ }
+ finally
+ {
+ insertStmt.close();
+ }
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ conn.close();
+
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error writing " + bridge + " to database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ @Override
+ public void deleteBridge(final Bridge bridge) throws AMQStoreException
+ {
+ _logger.debug("public void deleteBridge( " + bridge + "): called");
+ Connection conn = null;
+ PreparedStatement stmt = null;
+ try
+ {
+ conn = newAutoCommitConnection();
+ stmt = conn.prepareStatement(DELETE_FROM_BRIDGES);
+ stmt.setLong(1, bridge.getId().getLeastSignificantBits());
+ stmt.setLong(2, bridge.getId().getMostSignificantBits());
+ int results = stmt.executeUpdate();
+
+ if (results == 0)
+ {
+ throw new AMQStoreException("Bridge " + bridge + " not found");
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error deleting bridge " + bridge + " from database: " + e.getMessage(), e);
+ }
+ finally
+ {
+ closePreparedStatement(stmt);
+ closeConnection(conn);
+ }
+
+ }
+
+ @Override
+ public Transaction newTransaction()
+ {
+ return new DerbyTransaction();
+ }
+
+ public void enqueueMessage(ConnectionWrapper connWrapper, final TransactionLogResource queue, Long messageId) throws AMQStoreException
+ {
+ Connection conn = connWrapper.getConnection();
+
+
+ try
+ {
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Enqueuing message " + messageId + " on queue " + (queue instanceof AMQQueue ? ((AMQQueue)queue).getName() : "" ) + queue.getId()+ "[Connection" + conn + "]");
+ }
+
+ PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_QUEUE_ENTRY);
+ try
+ {
+ stmt.setString(1, queue.getId().toString());
+ stmt.setLong(2,messageId);
+ stmt.executeUpdate();
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ _logger.error("Failed to enqueue: " + e.getMessage(), e);
+ throw new AMQStoreException("Error writing enqueued message with id " + messageId + " for queue " + (queue instanceof AMQQueue ? ((AMQQueue)queue).getName() : "" ) + " with id " + queue.getId()
+ + " to database", e);
+ }
+
+ }
+
+ public void dequeueMessage(ConnectionWrapper connWrapper, final TransactionLogResource queue, Long messageId) throws AMQStoreException
+ {
+
+ Connection conn = connWrapper.getConnection();
+
+
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_QUEUE_ENTRY);
+ try
+ {
+ stmt.setString(1, queue.getId().toString());
+ stmt.setLong(2,messageId);
+ int results = stmt.executeUpdate();
+
+
+
+ if(results != 1)
+ {
+ throw new AMQStoreException("Unable to find message with id " + messageId + " on queue " + (queue instanceof AMQQueue ? ((AMQQueue)queue).getName() : "" )
+ + " with id " + queue.getId());
+ }
+
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Dequeuing message " + messageId + " on queue " + (queue instanceof AMQQueue ? ((AMQQueue)queue).getName() : "" )
+ + " with id " + queue.getId());
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ _logger.error("Failed to dequeue: " + e.getMessage(), e);
+ throw new AMQStoreException("Error deleting enqueued message with id " + messageId + " for queue " + (queue instanceof AMQQueue ? ((AMQQueue)queue).getName() : "" )
+ + " with id " + queue.getId() + " from database", e);
+ }
+
+ }
+
+
+ private void removeXid(ConnectionWrapper connWrapper, long format, byte[] globalId, byte[] branchId)
+ throws AMQStoreException
+ {
+ Connection conn = connWrapper.getConnection();
+
+
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_XIDS);
+ try
+ {
+ stmt.setLong(1,format);
+ stmt.setBytes(2,globalId);
+ stmt.setBytes(3,branchId);
+ int results = stmt.executeUpdate();
+
+
+
+ if(results != 1)
+ {
+ throw new AMQStoreException("Unable to find message with xid");
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ stmt = conn.prepareStatement(DELETE_FROM_XID_ACTIONS);
+ try
+ {
+ stmt.setLong(1,format);
+ stmt.setBytes(2,globalId);
+ stmt.setBytes(3,branchId);
+ int results = stmt.executeUpdate();
+
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ }
+ catch (SQLException e)
+ {
+ _logger.error("Failed to dequeue: " + e.getMessage(), e);
+ throw new AMQStoreException("Error deleting enqueued message with xid", e);
+ }
+
+ }
+
+
+ private void recordXid(ConnectionWrapper connWrapper, long format, byte[] globalId, byte[] branchId,
+ Transaction.Record[] enqueues, Transaction.Record[] dequeues) throws AMQStoreException
+ {
+ Connection conn = connWrapper.getConnection();
+
+
+ try
+ {
+
+ PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_XIDS);
+ try
+ {
+ stmt.setLong(1,format);
+ stmt.setBytes(2, globalId);
+ stmt.setBytes(3, branchId);
+ stmt.executeUpdate();
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ stmt = conn.prepareStatement(INSERT_INTO_XID_ACTIONS);
+
+ try
+ {
+ stmt.setLong(1,format);
+ stmt.setBytes(2, globalId);
+ stmt.setBytes(3, branchId);
+
+ if(enqueues != null)
+ {
+ stmt.setString(4, "E");
+ for(Transaction.Record record : enqueues)
+ {
+ stmt.setString(5, record.getQueue().getId().toString());
+ stmt.setLong(6, record.getMessage().getMessageNumber());
+ stmt.executeUpdate();
+ }
+ }
+
+ if(dequeues != null)
+ {
+ stmt.setString(4, "D");
+ for(Transaction.Record record : dequeues)
+ {
+ stmt.setString(5, record.getQueue().getId().toString());
+ stmt.setLong(6, record.getMessage().getMessageNumber());
+ stmt.executeUpdate();
+ }
+ }
+
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ }
+ catch (SQLException e)
+ {
+ _logger.error("Failed to enqueue: " + e.getMessage(), e);
+ throw new AMQStoreException("Error writing xid ", e);
+ }
+
+ }
+
+ private static final class ConnectionWrapper
+ {
+ private final Connection _connection;
+
+ public ConnectionWrapper(Connection conn)
+ {
+ _connection = conn;
+ }
+
+ public Connection getConnection()
+ {
+ return _connection;
+ }
+ }
+
+
+ public void commitTran(ConnectionWrapper connWrapper) throws AMQStoreException
+ {
+
+ try
+ {
+ Connection conn = connWrapper.getConnection();
+ conn.commit();
+
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("commit tran completed");
+ }
+
+ conn.close();
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error commit tx: " + e.getMessage(), e);
+ }
+ finally
+ {
+
+ }
+ }
+
+ public StoreFuture commitTranAsync(ConnectionWrapper connWrapper) throws AMQStoreException
+ {
+ commitTran(connWrapper);
+ return StoreFuture.IMMEDIATE_FUTURE;
+ }
+
+ public void abortTran(ConnectionWrapper connWrapper) throws AMQStoreException
+ {
+ if (connWrapper == null)
+ {
+ throw new AMQStoreException("Fatal internal error: transactional context is empty at abortTran");
+ }
+
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("abort tran called: " + connWrapper.getConnection());
+ }
+
+ try
+ {
+ Connection conn = connWrapper.getConnection();
+ conn.rollback();
+ conn.close();
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error aborting transaction: " + e.getMessage(), e);
+ }
+
+ }
+
+ public Long getNewMessageId()
+ {
+ return _messageId.incrementAndGet();
+ }
+
+
+ private void storeMetaData(Connection conn, long messageId, StorableMessageMetaData metaData)
+ throws SQLException
+ {
+ if(_logger.isDebugEnabled())
+ {
+ _logger.debug("Adding metadata for message " +messageId);
+ }
+
+ PreparedStatement stmt = conn.prepareStatement(INSERT_INTO_META_DATA);
+ try
+ {
+ stmt.setLong(1,messageId);
+
+ final int bodySize = 1 + metaData.getStorableSize();
+ byte[] underlying = new byte[bodySize];
+ underlying[0] = (byte) metaData.getType().ordinal();
+ java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(underlying);
+ buf.position(1);
+ buf = buf.slice();
+
+ metaData.writeToBuffer(0, buf);
+ ByteArrayInputStream bis = new ByteArrayInputStream(underlying);
+ try
+ {
+ stmt.setBinaryStream(2,bis,underlying.length);
+ int result = stmt.executeUpdate();
+
+ if(result == 0)
+ {
+ throw new RuntimeException("Unable to add meta data for message " +messageId);
+ }
+ }
+ finally
+ {
+ try
+ {
+ bis.close();
+ }
+ catch (IOException e)
+ {
+
+ throw new SQLException(e);
+ }
+ }
+
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ }
+
+
+
+
+ private void recoverMessages(MessageStoreRecoveryHandler recoveryHandler) throws SQLException
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ MessageStoreRecoveryHandler.StoredMessageRecoveryHandler messageHandler = recoveryHandler.begin();
+
+ Statement stmt = conn.createStatement();
+ try
+ {
+ ResultSet rs = stmt.executeQuery(SELECT_ALL_FROM_META_DATA);
+ try
+ {
+
+ long maxId = 0;
+
+ while(rs.next())
+ {
+
+ long messageId = rs.getLong(1);
+ Blob dataAsBlob = rs.getBlob(2);
+
+ if(messageId > maxId)
+ {
+ maxId = messageId;
+ }
+
+ byte[] dataAsBytes = dataAsBlob.getBytes(1,(int) dataAsBlob.length());
+ java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(dataAsBytes);
+ buf.position(1);
+ buf = buf.slice();
+ MessageMetaDataType type = MessageMetaDataType.values()[dataAsBytes[0]];
+ StorableMessageMetaData metaData = type.getFactory().createMetaData(buf);
+ StoredDerbyMessage message = new StoredDerbyMessage(messageId, metaData, false);
+ messageHandler.message(message);
+ }
+
+ _messageId.set(maxId);
+
+ messageHandler.completeMessageRecovery();
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+
+
+
+ private TransactionLogRecoveryHandler.DtxRecordRecoveryHandler recoverQueueEntries(TransactionLogRecoveryHandler recoveryHandler) throws SQLException
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ TransactionLogRecoveryHandler.QueueEntryRecoveryHandler queueEntryHandler = recoveryHandler.begin(this);
+
+ Statement stmt = conn.createStatement();
+ try
+ {
+ ResultSet rs = stmt.executeQuery(SELECT_FROM_QUEUE_ENTRY);
+ try
+ {
+ while(rs.next())
+ {
+
+ String id = rs.getString(1);
+ long messageId = rs.getLong(2);
+ queueEntryHandler.queueEntry(UUID.fromString(id), messageId);
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+ return queueEntryHandler.completeQueueEntryRecovery();
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+
+ private static final class Xid
+ {
+
+ private final long _format;
+ private final byte[] _globalId;
+ private final byte[] _branchId;
+
+ public Xid(long format, byte[] globalId, byte[] branchId)
+ {
+ _format = format;
+ _globalId = globalId;
+ _branchId = branchId;
+ }
+
+ public long getFormat()
+ {
+ return _format;
+ }
+
+ public byte[] getGlobalId()
+ {
+ return _globalId;
+ }
+
+ public byte[] getBranchId()
+ {
+ return _branchId;
+ }
+ }
+
+ private static class RecordImpl implements Transaction.Record, TransactionLogResource, EnqueableMessage
+ {
+
+ private long _messageNumber;
+ private UUID _queueId;
+
+ public RecordImpl(UUID queueId, long messageNumber)
+ {
+ _messageNumber = messageNumber;
+ _queueId = queueId;
+ }
+
+ @Override
+ public TransactionLogResource getQueue()
+ {
+ return this;
+ }
+
+ @Override
+ public EnqueableMessage getMessage()
+ {
+ return this;
+ }
+
+ @Override
+ public long getMessageNumber()
+ {
+ return _messageNumber;
+ }
+
+ @Override
+ public boolean isPersistent()
+ {
+ return true;
+ }
+
+ @Override
+ public StoredMessage getStoredMessage()
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public UUID getId()
+ {
+ return _queueId;
+ }
+ }
+
+ private void recoverXids(TransactionLogRecoveryHandler.DtxRecordRecoveryHandler dtxrh) throws SQLException
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ List<Xid> xids = new ArrayList<Xid>();
+
+ Statement stmt = conn.createStatement();
+ try
+ {
+ ResultSet rs = stmt.executeQuery(SELECT_ALL_FROM_XIDS);
+ try
+ {
+ while(rs.next())
+ {
+
+ long format = rs.getLong(1);
+ byte[] globalId = rs.getBytes(2);
+ byte[] branchId = rs.getBytes(3);
+ xids.add(new Xid(format, globalId, branchId));
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+
+
+
+ for(Xid xid : xids)
+ {
+ List<RecordImpl> enqueues = new ArrayList<RecordImpl>();
+ List<RecordImpl> dequeues = new ArrayList<RecordImpl>();
+
+ PreparedStatement pstmt = conn.prepareStatement(SELECT_ALL_FROM_XID_ACTIONS);
+
+ try
+ {
+ pstmt.setLong(1, xid.getFormat());
+ pstmt.setBytes(2, xid.getGlobalId());
+ pstmt.setBytes(3, xid.getBranchId());
+
+ ResultSet rs = pstmt.executeQuery();
+ try
+ {
+ while(rs.next())
+ {
+
+ String actionType = rs.getString(1);
+ UUID queueId = UUID.fromString(rs.getString(2));
+ long messageId = rs.getLong(3);
+
+ RecordImpl record = new RecordImpl(queueId, messageId);
+ List<RecordImpl> records = "E".equals(actionType) ? enqueues : dequeues;
+ records.add(record);
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ pstmt.close();
+ }
+
+ dtxrh.dtxRecord(xid.getFormat(), xid.getGlobalId(), xid.getBranchId(),
+ enqueues.toArray(new RecordImpl[enqueues.size()]),
+ dequeues.toArray(new RecordImpl[dequeues.size()]));
+ }
+
+
+ dtxrh.completeDtxRecordRecovery();
+ }
+ finally
+ {
+ conn.close();
+ }
+
+ }
+
+ StorableMessageMetaData getMetaData(long messageId) throws SQLException
+ {
+
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(SELECT_FROM_META_DATA);
+ try
+ {
+ stmt.setLong(1,messageId);
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+
+ if(rs.next())
+ {
+ Blob dataAsBlob = rs.getBlob(1);
+
+ byte[] dataAsBytes = dataAsBlob.getBytes(1,(int) dataAsBlob.length());
+ java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(dataAsBytes);
+ buf.position(1);
+ buf = buf.slice();
+ MessageMetaDataType type = MessageMetaDataType.values()[dataAsBytes[0]];
+ StorableMessageMetaData metaData = type.getFactory().createMetaData(buf);
+
+ return metaData;
+ }
+ else
+ {
+ throw new RuntimeException("Meta data not found for message with id " + messageId);
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+
+
+ private void addContent(Connection conn, long messageId, ByteBuffer src)
+ {
+ if(_logger.isDebugEnabled())
+ {
+ _logger.debug("Adding content for message " +messageId);
+ }
+ PreparedStatement stmt = null;
+
+ try
+ {
+ src = src.slice();
+
+ byte[] chunkData = new byte[src.limit()];
+ src.duplicate().get(chunkData);
+
+ stmt = conn.prepareStatement(INSERT_INTO_MESSAGE_CONTENT);
+ stmt.setLong(1,messageId);
+
+ ByteArrayInputStream bis = new ByteArrayInputStream(chunkData);
+ stmt.setBinaryStream(2, bis, chunkData.length);
+ stmt.executeUpdate();
+ }
+ catch (SQLException e)
+ {
+ closeConnection(conn);
+ throw new RuntimeException("Error adding content for message " + messageId + ": " + e.getMessage(), e);
+ }
+ finally
+ {
+ closePreparedStatement(stmt);
+ }
+
+ }
+
+
+ public int getContent(long messageId, int offset, ByteBuffer dst)
+ {
+ Connection conn = null;
+ PreparedStatement stmt = null;
+
+ try
+ {
+ conn = newAutoCommitConnection();
+
+ stmt = conn.prepareStatement(SELECT_FROM_MESSAGE_CONTENT);
+ stmt.setLong(1,messageId);
+ ResultSet rs = stmt.executeQuery();
+
+ int written = 0;
+
+ if (rs.next())
+ {
+
+ Blob dataAsBlob = rs.getBlob(1);
+
+ final int size = (int) dataAsBlob.length();
+ byte[] dataAsBytes = dataAsBlob.getBytes(1, size);
+
+ if (offset > size)
+ {
+ throw new RuntimeException("Offset " + offset + " is greater than message size " + size
+ + " for message id " + messageId + "!");
+
+ }
+
+ written = size - offset;
+ if(written > dst.remaining())
+ {
+ written = dst.remaining();
+ }
+
+ dst.put(dataAsBytes, offset, written);
+ }
+
+ return written;
+
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException("Error retrieving content from offset " + offset + " for message " + messageId + ": " + e.getMessage(), e);
+ }
+ finally
+ {
+ closePreparedStatement(stmt);
+ closeConnection(conn);
+ }
+
+
+ }
+
+ @Override
+ public boolean isPersistent()
+ {
+ return true;
+ }
+
+
+ private class DerbyTransaction implements Transaction
+ {
+ private final ConnectionWrapper _connWrapper;
+
+
+ private DerbyTransaction()
+ {
+ try
+ {
+ _connWrapper = new ConnectionWrapper(newConnection());
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
+ {
+ if(message.getStoredMessage() instanceof StoredDerbyMessage)
+ {
+ try
+ {
+ ((StoredDerbyMessage)message.getStoredMessage()).store(_connWrapper.getConnection());
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Exception on enqueuing message " + _messageId, e);
+ }
+ }
+
+ DerbyMessageStore.this.enqueueMessage(_connWrapper, queue, message.getMessageNumber());
+ }
+
+ @Override
+ public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
+ {
+ DerbyMessageStore.this.dequeueMessage(_connWrapper, queue, message.getMessageNumber());
+
+ }
+
+ @Override
+ public void commitTran() throws AMQStoreException
+ {
+ DerbyMessageStore.this.commitTran(_connWrapper);
+ }
+
+ @Override
+ public StoreFuture commitTranAsync() throws AMQStoreException
+ {
+ return DerbyMessageStore.this.commitTranAsync(_connWrapper);
+ }
+
+ @Override
+ public void abortTran() throws AMQStoreException
+ {
+ DerbyMessageStore.this.abortTran(_connWrapper);
+ }
+
+ @Override
+ public void removeXid(long format, byte[] globalId, byte[] branchId) throws AMQStoreException
+ {
+ DerbyMessageStore.this.removeXid(_connWrapper, format, globalId, branchId);
+ }
+
+ @Override
+ public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues, Record[] dequeues)
+ throws AMQStoreException
+ {
+ DerbyMessageStore.this.recordXid(_connWrapper, format, globalId, branchId, enqueues, dequeues);
+ }
+ }
+
+
+
+ private class StoredDerbyMessage implements StoredMessage
+ {
+
+ private final long _messageId;
+ private StorableMessageMetaData _metaData;
+ private volatile SoftReference<StorableMessageMetaData> _metaDataRef;
+ private byte[] _data;
+ private volatile SoftReference<byte[]> _dataRef;
+
+
+ StoredDerbyMessage(long messageId, StorableMessageMetaData metaData)
+ {
+ this(messageId, metaData, true);
+ }
+
+
+ StoredDerbyMessage(long messageId,
+ StorableMessageMetaData metaData, boolean persist)
+ {
+ _messageId = messageId;
+
+
+ _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
+ if(persist)
+ {
+ _metaData = metaData;
+ }
+ }
+
+ @Override
+ public StorableMessageMetaData getMetaData()
+ {
+ StorableMessageMetaData metaData = _metaData == null ? _metaDataRef.get() : _metaData;
+ if(metaData == null)
+ {
+ try
+ {
+ metaData = DerbyMessageStore.this.getMetaData(_messageId);
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException(e);
+ }
+ _metaDataRef = new SoftReference<StorableMessageMetaData>(metaData);
+ }
+
+ return metaData;
+ }
+
+ @Override
+ public long getMessageNumber()
+ {
+ return _messageId;
+ }
+
+ @Override
+ public void addContent(int offsetInMessage, java.nio.ByteBuffer src)
+ {
+ src = src.slice();
+
+ if(_data == null)
+ {
+ _data = new byte[src.remaining()];
+ _dataRef = new SoftReference<byte[]>(_data);
+ src.duplicate().get(_data);
+ }
+ else
+ {
+ byte[] oldData = _data;
+ _data = new byte[oldData.length + src.remaining()];
+ _dataRef = new SoftReference<byte[]>(_data);
+
+ System.arraycopy(oldData,0,_data,0,oldData.length);
+ src.duplicate().get(_data, oldData.length, src.remaining());
+ }
+
+ }
+
+ @Override
+ public int getContent(int offsetInMessage, java.nio.ByteBuffer dst)
+ {
+ byte[] data = _dataRef == null ? null : _dataRef.get();
+ if(data != null)
+ {
+ int length = Math.min(dst.remaining(), data.length - offsetInMessage);
+ dst.put(data, offsetInMessage, length);
+ return length;
+ }
+ else
+ {
+ return DerbyMessageStore.this.getContent(_messageId, offsetInMessage, dst);
+ }
+ }
+
+
+ @Override
+ public ByteBuffer getContent(int offsetInMessage, int size)
+ {
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ getContent(offsetInMessage, buf);
+ buf.position(0);
+ return buf;
+ }
+
+ @Override
+ public synchronized StoreFuture flushToStore()
+ {
+ try
+ {
+ if(_metaData != null)
+ {
+ Connection conn = newConnection();
+
+ store(conn);
+
+ conn.commit();
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ if(_logger.isDebugEnabled())
+ {
+ _logger.debug("Error when trying to flush message " + _messageId + " to store: " + e);
+ }
+ throw new RuntimeException(e);
+ }
+ return StoreFuture.IMMEDIATE_FUTURE;
+ }
+
+ private synchronized void store(final Connection conn) throws SQLException
+ {
+ if(_metaData != null)
+ {
+ try
+ {
+ storeMetaData(conn, _messageId, _metaData);
+ DerbyMessageStore.this.addContent(conn, _messageId,
+ _data == null ? ByteBuffer.allocate(0) : ByteBuffer.wrap(_data));
+ }
+ finally
+ {
+ _metaData = null;
+ _data = null;
+ }
+ }
+
+ if(_logger.isDebugEnabled())
+ {
+ _logger.debug("Storing message " + _messageId + " to store");
+ }
+ }
+
+ @Override
+ public void remove()
+ {
+ DerbyMessageStore.this.removeMessage(_messageId);
+ }
+ }
+
+ private void closeConnection(final Connection conn)
+ {
+ if(conn != null)
+ {
+ try
+ {
+ conn.close();
+ }
+ catch (SQLException e)
+ {
+ _logger.error("Problem closing connection", e);
+ }
+ }
+ }
+
+ private void closePreparedStatement(final PreparedStatement stmt)
+ {
+ if (stmt != null)
+ {
+ try
+ {
+ stmt.close();
+ }
+ catch(SQLException e)
+ {
+ _logger.error("Problem closing prepared statement", e);
+ }
+ }
+ }
+
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
+ {
+ _eventManager.addEventListener(eventListener, events);
+ }
+
+ @Override
+ public String getStoreLocation()
+ {
+ return _storeLocation;
+ }
+
+ private void insertConfiguredObject(ConfiguredObjectRecord configuredObject) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(FIND_CONFIGURED_OBJECT);
+ try
+ {
+ stmt.setString(1, configuredObject.getId().toString());
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+ // If we don't have any data in the result set then we can add this configured object
+ if (!rs.next())
+ {
+ PreparedStatement insertStmt = conn.prepareStatement(INSERT_INTO_CONFIGURED_OBJECTS);
+ try
+ {
+ insertStmt.setString(1, configuredObject.getId().toString());
+ insertStmt.setString(2, configuredObject.getType());
+ if(configuredObject.getAttributes() == null)
+ {
+ insertStmt.setNull(3, Types.BLOB);
+ }
+ else
+ {
+ byte[] attributesAsBytes = configuredObject.getAttributes().getBytes(UTF8_CHARSET);
+ ByteArrayInputStream bis = new ByteArrayInputStream(attributesAsBytes);
+ insertStmt.setBinaryStream(3, bis, attributesAsBytes.length);
+ }
+ insertStmt.execute();
+ }
+ finally
+ {
+ insertStmt.close();
+ }
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error inserting of configured object " + configuredObject + " into database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ private int removeConfiguredObject(UUID id) throws AMQStoreException
+ {
+ int results = 0;
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(DELETE_FROM_CONFIGURED_OBJECTS);
+ try
+ {
+ stmt.setString(1, id.toString());
+ results = stmt.executeUpdate();
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error deleting of configured object with id " + id + " from database: " + e.getMessage(), e);
+ }
+ return results;
+ }
+
+ private void updateConfiguredObject(final ConfiguredObjectRecord configuredObject) throws AMQStoreException
+ {
+ if (_stateManager.isInState(State.ACTIVE))
+ {
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(FIND_CONFIGURED_OBJECT);
+ try
+ {
+ stmt.setString(1, configuredObject.getId().toString());
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+ if (rs.next())
+ {
+ PreparedStatement stmt2 = conn.prepareStatement(UPDATE_CONFIGURED_OBJECTS);
+ try
+ {
+ stmt2.setString(1, configuredObject.getType());
+ if (configuredObject.getAttributes() != null)
+ {
+ byte[] attributesAsBytes = configuredObject.getAttributes().getBytes(UTF8_CHARSET);
+ ByteArrayInputStream bis = new ByteArrayInputStream(attributesAsBytes);
+ stmt2.setBinaryStream(2, bis, attributesAsBytes.length);
+ }
+ else
+ {
+ stmt2.setNull(2, Types.BLOB);
+ }
+ stmt2.setString(3, configuredObject.getId().toString());
+ stmt2.execute();
+ }
+ finally
+ {
+ stmt2.close();
+ }
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error updating configured object " + configuredObject + " in database: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ private ConfiguredObjectRecord loadConfiguredObject(final UUID id) throws AMQStoreException
+ {
+ ConfiguredObjectRecord result = null;
+ try
+ {
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(FIND_CONFIGURED_OBJECT);
+ try
+ {
+ stmt.setString(1, id.toString());
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+ if (rs.next())
+ {
+ String type = rs.getString(1);
+ Blob blob = rs.getBlob(2);
+ String attributes = null;
+ if (blob != null)
+ {
+ attributes = blobToString(blob);
+ }
+ result = new ConfiguredObjectRecord(id, type, attributes);
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new AMQStoreException("Error loading of configured object with id " + id + " from database: "
+ + e.getMessage(), e);
+ }
+ return result;
+ }
+
+ private String blobToString(Blob blob) throws SQLException
+ {
+ byte[] bytes = blob.getBytes(1, (int)blob.length());
+ return new String(bytes, UTF8_CHARSET);
+ }
+
+ private List<ConfiguredObjectRecord> loadConfiguredObjects() throws SQLException
+ {
+ ArrayList<ConfiguredObjectRecord> results = new ArrayList<ConfiguredObjectRecord>();
+ Connection conn = newAutoCommitConnection();
+ try
+ {
+ PreparedStatement stmt = conn.prepareStatement(SELECT_FROM_CONFIGURED_OBJECTS);
+ try
+ {
+ ResultSet rs = stmt.executeQuery();
+ try
+ {
+ while (rs.next())
+ {
+ String id = rs.getString(1);
+ String objectType = rs.getString(2);
+ String attributes = blobToString(rs.getBlob(3));
+ results.add(new ConfiguredObjectRecord(UUID.fromString(id), objectType, attributes));
+ }
+ }
+ finally
+ {
+ rs.close();
+ }
+ }
+ finally
+ {
+ stmt.close();
+ }
+ }
+ finally
+ {
+ conn.close();
+ }
+ return results;
+ }
+} \ No newline at end of file
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStoreFactory.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStoreFactory.java
new file mode 100644
index 0000000000..12d7f64a8d
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStoreFactory.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store.derby;
+
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreFactory;
+
+public class DerbyMessageStoreFactory implements MessageStoreFactory
+{
+
+ @Override
+ public MessageStore createMessageStore()
+ {
+ return new DerbyMessageStore();
+ }
+
+ @Override
+ public String getStoreClassName()
+ {
+ return DerbyMessageStore.class.getSimpleName();
+ }
+
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription.java
index f8a585b562..66825caa24 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription.java
@@ -54,16 +54,12 @@ public interface Subscription
void setNoLocal(boolean noLocal);
- AMQShortString getConsumerTag();
-
long getSubscriptionID();
boolean isSuspended();
boolean hasInterest(QueueEntry msg);
- boolean isAutoClose();
-
boolean isClosed();
boolean acquires();
@@ -105,11 +101,11 @@ public interface Subscription
boolean isActive();
- void confirmAutoClose();
-
public void set(String key, Object value);
public Object get(String key);
boolean isSessionTransactional();
+
+ void queueEmpty() throws AMQException;
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/SubscriptionImpl.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/SubscriptionImpl.java
index 32baa17fc7..1f25c215cc 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/SubscriptionImpl.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/SubscriptionImpl.java
@@ -375,7 +375,7 @@ public abstract class SubscriptionImpl implements Subscription, FlowCreditManage
{
return getQueue().getConfigStore();
}
-
+
public Long getDelivered()
{
return _deliveredCount.get();
@@ -810,12 +810,22 @@ public abstract class SubscriptionImpl implements Subscription, FlowCreditManage
{
return _channel.isTransactional();
}
-
+
public long getCreateTime()
{
return _createTime;
}
+ public void queueEmpty() throws AMQException
+ {
+ if (isAutoClose())
+ {
+ _queue.unregisterSubscription(this);
+
+ confirmAutoClose();
+ }
+ }
+
public void flushBatched()
{
_channel.getProtocolSession().setDeferFlush(false);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription_0_10.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription_0_10.java
index a75467ac42..76d975a789 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription_0_10.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/subscription/Subscription_0_10.java
@@ -109,7 +109,7 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
public void stateChange(Subscription sub, State oldState, State newState)
{
- CurrentActor.get().message(SubscriptionMessages.STATE(newState.toString()));
+ CurrentActor.get().message(SubscriptionMessages.STATE(newState.toString()));
}
};
private AMQQueue _queue;
@@ -199,12 +199,7 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
CurrentActor.get().message(this, SubscriptionMessages.CREATE(filterLogString, queue.isDurable() && exclusive,
filterLogString.length() > 0));
}
-
- }
- public AMQShortString getConsumerTag()
- {
- return new AMQShortString(_destination);
}
public boolean isSuspended()
@@ -244,12 +239,6 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
return (_filters == null) || _filters.allAllow(entry);
}
- public boolean isAutoClose()
- {
- // no such thing in 0-10
- return false;
- }
-
public boolean isClosed()
{
return getState() == State.CLOSED;
@@ -302,7 +291,7 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
{
return getQueue().getConfigStore();
}
-
+
public Long getDelivered()
{
return _deliveredCount.get();
@@ -823,11 +812,6 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
return getState() == State.ACTIVE;
}
- public void confirmAutoClose()
- {
- //No such thing in 0-10
- }
-
public void set(String key, Object value)
{
_properties.put(key, value);
@@ -1026,6 +1010,10 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
return _session.isTransactional();
}
+ public void queueEmpty()
+ {
+ }
+
public long getCreateTime()
{
return _createTime;
@@ -1033,7 +1021,7 @@ public class Subscription_0_10 implements Subscription, FlowCreditManager.FlowCr
public String toLogString()
{
- String queueInfo = MessageFormat.format(QUEUE_FORMAT, _queue.getVirtualHost().getName(),
+ String queueInfo = MessageFormat.format(QUEUE_FORMAT, _queue.getVirtualHost().getName(),
_queue.getNameShortString());
String result = "[" + MessageFormat.format(SUBSCRIPTION_FORMAT, getSubscriptionID()) + "("
// queueString is "vh(/{0})/qu({1}) " so need to trim
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java
index 28d8cb2ec7..5460c89eab 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerConnectionDelegate.java
@@ -33,6 +33,7 @@ import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.security.auth.AuthenticationResult;
import org.apache.qpid.server.security.auth.AuthenticationResult.AuthenticationStatus;
import org.apache.qpid.server.subscription.Subscription_0_10;
+import org.apache.qpid.server.virtualhost.State;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.transport.*;
import org.slf4j.Logger;
@@ -177,6 +178,11 @@ public class ServerConnectionDelegate extends ServerDelegate
sconn.setState(Connection.State.CLOSING);
sconn.invoke(new ConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, "Permission denied '"+vhostName+"'"));
}
+ else if (vhost.getState() != State.ACTIVE)
+ {
+ sconn.setState(Connection.State.CLOSING);
+ sconn.invoke(new ConnectionClose(ConnectionCloseCode.CONNECTION_FORCED, "Virtual host '"+vhostName+"' is not active"));
+ }
else
{
sconn.setState(Connection.State.OPEN);
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java
index 462e880e5f..6f979e035e 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java
@@ -72,6 +72,7 @@ import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.security.AuthorizationHolder;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.StoreFuture;
import org.apache.qpid.server.subscription.Subscription_0_10;
import org.apache.qpid.server.txn.AlreadyKnownDtxException;
import org.apache.qpid.server.txn.AsyncAutoCommitTransaction;
@@ -133,7 +134,7 @@ public class ServerSession extends Session
new ConcurrentSkipListMap<Integer, MessageDispositionChangeListener>();
private ServerTransaction _transaction;
-
+
private final AtomicLong _txnStarts = new AtomicLong(0);
private final AtomicLong _txnCommits = new AtomicLong(0);
private final AtomicLong _txnRejects = new AtomicLong(0);
@@ -152,7 +153,7 @@ public class ServerSession extends Session
public ServerSession(Connection connection, SessionDelegate delegate, Binary name, long expiry, ConnectionConfig connConfig)
{
super(connection, delegate, name, expiry);
- _connectionConfig = connConfig;
+ _connectionConfig = connConfig;
_transaction = new AsyncAutoCommitTransaction(this.getMessageStore(),this);
_logSubject = new ChannelLogSubject(this);
_id = getConfigStore().createId();
@@ -352,7 +353,7 @@ public class ServerSession extends Session
}
}
- public void removeDispositionListener(Method method)
+ public void removeDispositionListener(Method method)
{
_messageDispositionListenerMap.remove(method.getId());
}
@@ -380,7 +381,7 @@ public class ServerSession extends Session
{
task.doTask(this);
}
-
+
CurrentActor.get().message(getLogSubject(), ChannelMessages.CLOSE());
}
@@ -429,7 +430,7 @@ public class ServerSession extends Session
public void unregister(Subscription_0_10 sub)
{
- _subscriptions.remove(sub.getConsumerTag().toString());
+ _subscriptions.remove(sub.getName());
try
{
sub.getSendLock();
@@ -558,7 +559,7 @@ public class ServerSession extends Session
public void commit()
{
_transaction.commit();
-
+
_txnCommits.incrementAndGet();
_txnStarts.incrementAndGet();
decrementOutstandingTxnsIfNecessary();
@@ -567,13 +568,13 @@ public class ServerSession extends Session
public void rollback()
{
_transaction.rollback();
-
+
_txnRejects.incrementAndGet();
_txnStarts.incrementAndGet();
decrementOutstandingTxnsIfNecessary();
}
-
+
private void incrementOutstandingTxnsIfNecessary()
{
if(isTransactional())
@@ -583,7 +584,7 @@ public class ServerSession extends Session
_txnCount.compareAndSet(0,1);
}
}
-
+
private void decrementOutstandingTxnsIfNecessary()
{
if(isTransactional())
@@ -624,7 +625,7 @@ public class ServerSession extends Session
{
return _txnCount.get();
}
-
+
public Principal getAuthorizedPrincipal()
{
return getConnection().getAuthorizedPrincipal();
@@ -975,17 +976,17 @@ public class ServerSession extends Session
return _unfinishedCommandsQueue.isEmpty() ? null : _unfinishedCommandsQueue.getLast();
}
- public void recordFuture(final MessageStore.StoreFuture future, final ServerTransaction.Action action)
+ public void recordFuture(final StoreFuture future, final ServerTransaction.Action action)
{
_unfinishedCommandsQueue.add(new AsyncCommand(future, action));
}
private static class AsyncCommand
{
- private final MessageStore.StoreFuture _future;
+ private final StoreFuture _future;
private ServerTransaction.Action _action;
- public AsyncCommand(final MessageStore.StoreFuture future, final ServerTransaction.Action action)
+ public AsyncCommand(final StoreFuture future, final ServerTransaction.Action action)
{
_future = future;
_action = action;
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java
index c94a476712..79a8bc0e4c 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java
@@ -40,6 +40,7 @@ import org.apache.qpid.server.flow.WindowCreditManager;
import org.apache.qpid.server.logging.messages.ExchangeMessages;
import org.apache.qpid.server.message.MessageMetaData_0_10;
import org.apache.qpid.server.message.MessageTransferMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.queue.BaseQueue;
@@ -48,6 +49,7 @@ import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.StoreFuture;
import org.apache.qpid.server.store.StoredMessage;
import org.apache.qpid.server.subscription.SubscriptionFactoryImpl;
import org.apache.qpid.server.subscription.Subscription_0_10;
@@ -126,7 +128,7 @@ public class ServerSessionDelegate extends SessionDelegate
serverSession.accept(method.getTransfers());
if(!serverSession.isTransactional())
{
- serverSession.recordFuture(MessageStore.IMMEDIATE_FUTURE,
+ serverSession.recordFuture(StoreFuture.IMMEDIATE_FUTURE,
new CommandProcessedAction(serverSession, method));
}
}
@@ -356,7 +358,7 @@ public class ServerSessionDelegate extends SessionDelegate
}
else
{
- serverSession.recordFuture(MessageStore.IMMEDIATE_FUTURE, new CommandProcessedAction(serverSession, xfr));
+ serverSession.recordFuture(StoreFuture.IMMEDIATE_FUTURE, new CommandProcessedAction(serverSession, xfr));
}
}
@@ -682,13 +684,12 @@ public class ServerSessionDelegate extends SessionDelegate
{
String exchangeName = method.getExchange();
VirtualHost virtualHost = getVirtualHost(session);
- Exchange exchange = getExchange(session, exchangeName);
+ ExchangeRegistry exchangeRegistry = getExchangeRegistry(session);
//we must check for any unsupported arguments present and throw not-implemented
if(method.hasArguments())
{
Map<String,Object> args = method.getArguments();
-
//QPID-3392: currently we don't support any!
if(!args.isEmpty())
{
@@ -696,120 +697,113 @@ public class ServerSessionDelegate extends SessionDelegate
return;
}
}
-
- if(method.getPassive())
+ synchronized(exchangeRegistry)
{
- if(exchange == null)
- {
- exception(session, method, ExecutionErrorCode.NOT_FOUND, "not-found: exchange-name '"+exchangeName+"'");
-
- }
- else
- {
- if(!exchange.getTypeShortString().toString().equals(method.getType()) && (method.getType() != null && method.getType().length() > 0))
- {
- exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to redeclare exchange: " + exchangeName + " of type " + exchange.getTypeShortString() + " to " + method.getType() +".");
- }
- }
+ Exchange exchange = getExchange(session, exchangeName);
- }
- else
- {
- if (exchange == null)
+ if(method.getPassive())
{
- if(exchangeName.startsWith("amq."))
+ if(exchange == null)
{
- exception(session, method, ExecutionErrorCode.NOT_ALLOWED,
- "Attempt to declare exchange: " + exchangeName +
- " which begins with reserved prefix 'amq.'.");
+ exception(session, method, ExecutionErrorCode.NOT_FOUND, "not-found: exchange-name '" + exchangeName + "'");
}
- else if(exchangeName.startsWith("qpid."))
+ else
{
- exception(session, method, ExecutionErrorCode.NOT_ALLOWED,
- "Attempt to declare exchange: " + exchangeName +
- " which begins with reserved prefix 'qpid.'.");
+ if (!exchange.getTypeShortString().toString().equals(method.getType())
+ && (method.getType() != null && method.getType().length() > 0))
+ {
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to redeclare exchange: "
+ + exchangeName + " of type " + exchange.getTypeShortString() + " to " + method.getType() + ".");
+ }
}
- else
+ }
+ else
+ {
+ if (exchange == null)
{
- ExchangeRegistry exchangeRegistry = getExchangeRegistry(session);
- ExchangeFactory exchangeFactory = virtualHost.getExchangeFactory();
-
-
-
- try
+ if (exchangeName.startsWith("amq."))
{
-
- exchange = exchangeFactory.createExchange(method.getExchange(),
- method.getType(),
- method.getDurable(),
- method.getAutoDelete());
-
- String alternateExchangeName = method.getAlternateExchange();
- boolean validAlternate;
- if(alternateExchangeName != null && alternateExchangeName.length() != 0)
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to declare exchange: "
+ + exchangeName + " which begins with reserved prefix 'amq.'.");
+ }
+ else if (exchangeName.startsWith("qpid."))
+ {
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED, "Attempt to declare exchange: "
+ + exchangeName + " which begins with reserved prefix 'qpid.'.");
+ }
+ else
+ {
+ ExchangeFactory exchangeFactory = virtualHost.getExchangeFactory();
+ try
{
- Exchange alternate = getExchange(session, alternateExchangeName);
- if(alternate == null)
+ exchange = exchangeFactory.createExchange(method.getExchange(),
+ method.getType(),
+ method.getDurable(),
+ method.getAutoDelete());
+ String alternateExchangeName = method.getAlternateExchange();
+ boolean validAlternate;
+ if(alternateExchangeName != null && alternateExchangeName.length() != 0)
{
- validAlternate = false;
+ Exchange alternate = getExchange(session, alternateExchangeName);
+ if(alternate == null)
+ {
+ validAlternate = false;
+ }
+ else
+ {
+ exchange.setAlternateExchange(alternate);
+ validAlternate = true;
+ }
}
else
{
- exchange.setAlternateExchange(alternate);
validAlternate = true;
}
- }
- else
- {
- validAlternate = true;
- }
-
- if(validAlternate)
- {
- if (exchange.isDurable())
+ if(validAlternate)
{
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
- store.createExchange(exchange);
+ if (exchange.isDurable())
+ {
+ DurableConfigurationStore store = virtualHost.getMessageStore();
+ store.createExchange(exchange);
+ }
+ exchangeRegistry.registerExchange(exchange);
}
-
- exchangeRegistry.registerExchange(exchange);
+ else
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND,
+ "Unknown alternate exchange " + alternateExchangeName);
+ }
+ }
+ catch(AMQUnknownExchangeType e)
+ {
+ exception(session, method, ExecutionErrorCode.NOT_FOUND, "Unknown Exchange Type: " + method.getType());
}
- else
+ catch (AMQException e)
{
- exception(session, method, ExecutionErrorCode.NOT_FOUND,
- "Unknown alternate exchange " + alternateExchangeName);
+ exception(session, method, e, "Cannot declare exchange '" + exchangeName);
}
}
- catch(AMQUnknownExchangeType e)
+ }
+ else
+ {
+ if(!exchange.getTypeShortString().toString().equals(method.getType()))
{
- exception(session, method, ExecutionErrorCode.NOT_FOUND, "Unknown Exchange Type: " + method.getType());
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED,
+ "Attempt to redeclare exchange: " + exchangeName
+ + " of type " + exchange.getTypeShortString()
+ + " to " + method.getType() +".");
}
- catch (AMQException e)
+ else if(method.hasAlternateExchange()
+ && (exchange.getAlternateExchange() == null ||
+ !method.getAlternateExchange().equals(exchange.getAlternateExchange().getName())))
{
- exception(session, method, e, "Cannot declare exchange '" + exchangeName);
+ exception(session, method, ExecutionErrorCode.NOT_ALLOWED,
+ "Attempt to change alternate exchange of: " + exchangeName
+ + " from " + exchange.getAlternateExchange()
+ + " to " + method.getAlternateExchange() +".");
}
}
}
- else
- {
- if(!exchange.getTypeShortString().toString().equals(method.getType()))
- {
- exception(session, method, ExecutionErrorCode.NOT_ALLOWED,
- "Attempt to redeclare exchange: " + exchangeName
- + " of type " + exchange.getTypeShortString()
- + " to " + method.getType() +".");
- }
- else if(method.hasAlternateExchange()
- && (exchange.getAlternateExchange() == null ||
- !method.getAlternateExchange().equals(exchange.getAlternateExchange().getName())))
- {
- exception(session, method, ExecutionErrorCode.NOT_ALLOWED,
- "Attempt to change alternate exchange of: " + exchangeName
- + " from " + exchange.getAlternateExchange()
- + " to " + method.getAlternateExchange() +".");
- }
- }
-
}
}
@@ -924,7 +918,7 @@ public class ServerSessionDelegate extends SessionDelegate
if (exchange.isDurable() && !exchange.isAutoDelete())
{
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
+ DurableConfigurationStore store = virtualHost.getMessageStore();
store.removeExchange(exchange);
}
}
@@ -1205,7 +1199,7 @@ public class ServerSessionDelegate extends SessionDelegate
{
VirtualHost virtualHost = getVirtualHost(session);
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
+ DurableConfigurationStore store = virtualHost.getMessageStore();
String queueName = method.getQueue();
AMQQueue queue;
@@ -1395,8 +1389,8 @@ public class ServerSessionDelegate extends SessionDelegate
{
String owner = body.getExclusive() ? session.getClientID() : null;
- final AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(queueName, body.getDurable(), owner, body.getAutoDelete(),
- body.getExclusive(), virtualHost, body.getArguments());
+ final AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(UUIDGenerator.generateUUID(), queueName, body.getDurable(), owner,
+ body.getAutoDelete(), body.getExclusive(), virtualHost, body.getArguments());
return queue;
}
@@ -1448,7 +1442,7 @@ public class ServerSessionDelegate extends SessionDelegate
queue.delete();
if (queue.isDurable() && !queue.isAutoDelete())
{
- DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
+ DurableConfigurationStore store = virtualHost.getMessageStore();
store.removeQueue(queue);
}
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/AsyncAutoCommitTransaction.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/AsyncAutoCommitTransaction.java
index a062c6732f..d446434d24 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/AsyncAutoCommitTransaction.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/AsyncAutoCommitTransaction.java
@@ -29,7 +29,8 @@ import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.MessageStore.StoreFuture;
+import org.apache.qpid.server.store.StoreFuture;
+import org.apache.qpid.server.store.Transaction;
import java.util.Collection;
import java.util.List;
@@ -71,16 +72,16 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
*/
public void addPostTransactionAction(final Action immediateAction)
{
- addFuture(MessageStore.IMMEDIATE_FUTURE, immediateAction);
+ addFuture(StoreFuture.IMMEDIATE_FUTURE, immediateAction);
}
public void dequeue(BaseQueue queue, EnqueableMessage message, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
- MessageStore.StoreFuture future;
+ StoreFuture future;
if(message.isPersistent() && queue.isDurable())
{
if (_logger.isDebugEnabled())
@@ -96,7 +97,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
else
{
- future = MessageStore.IMMEDIATE_FUTURE;
+ future = StoreFuture.IMMEDIATE_FUTURE;
}
addFuture(future, postTransactionAction);
postTransactionAction = null;
@@ -113,7 +114,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
- private void addFuture(final MessageStore.StoreFuture future, final Action action)
+ private void addFuture(final StoreFuture future, final Action action)
{
if(action != null)
{
@@ -130,7 +131,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
public void dequeue(Collection<QueueEntry> queueEntries, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
for(QueueEntry entry : queueEntries)
@@ -154,7 +155,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
}
- MessageStore.StoreFuture future;
+ StoreFuture future;
if(txn != null)
{
future = txn.commitTranAsync();
@@ -162,7 +163,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
else
{
- future = MessageStore.IMMEDIATE_FUTURE;
+ future = StoreFuture.IMMEDIATE_FUTURE;
}
addFuture(future, postTransactionAction);
postTransactionAction = null;
@@ -182,10 +183,10 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
public void enqueue(BaseQueue queue, EnqueableMessage message, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
- MessageStore.StoreFuture future;
+ StoreFuture future;
if(message.isPersistent() && queue.isDurable())
{
if (_logger.isDebugEnabled())
@@ -200,7 +201,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
else
{
- future = MessageStore.IMMEDIATE_FUTURE;
+ future = StoreFuture.IMMEDIATE_FUTURE;
}
addFuture(future, postTransactionAction);
postTransactionAction = null;
@@ -220,7 +221,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
public void enqueue(List<? extends BaseQueue> queues, EnqueableMessage message, Action postTransactionAction, long currentTime)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
@@ -246,7 +247,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
}
- MessageStore.StoreFuture future;
+ StoreFuture future;
if (txn != null)
{
future = txn.commitTranAsync();
@@ -254,7 +255,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
}
else
{
- future = MessageStore.IMMEDIATE_FUTURE;
+ future = StoreFuture.IMMEDIATE_FUTURE;
}
addFuture(future, postTransactionAction);
postTransactionAction = null;
@@ -278,7 +279,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
{
if(immediatePostTransactionAction != null)
{
- addFuture(MessageStore.IMMEDIATE_FUTURE, new Action()
+ addFuture(StoreFuture.IMMEDIATE_FUTURE, new Action()
{
public void postCommit()
{
@@ -305,7 +306,7 @@ public class AsyncAutoCommitTransaction implements ServerTransaction
return false;
}
- private void rollbackIfNecessary(Action postTransactionAction, MessageStore.Transaction txn)
+ private void rollbackIfNecessary(Action postTransactionAction, Transaction txn)
{
if (txn != null)
{
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/AutoCommitTransaction.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/AutoCommitTransaction.java
index 597797b5f8..e5a7df6880 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/AutoCommitTransaction.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/AutoCommitTransaction.java
@@ -29,6 +29,7 @@ import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.Transaction;
import java.util.Collection;
import java.util.List;
@@ -67,7 +68,7 @@ public class AutoCommitTransaction implements ServerTransaction
public void dequeue(BaseQueue queue, EnqueableMessage message, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
if(message.isPersistent() && queue.isDurable())
@@ -99,7 +100,7 @@ public class AutoCommitTransaction implements ServerTransaction
public void dequeue(Collection<QueueEntry> queueEntries, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
for(QueueEntry entry : queueEntries)
@@ -146,7 +147,7 @@ public class AutoCommitTransaction implements ServerTransaction
public void enqueue(BaseQueue queue, EnqueableMessage message, Action postTransactionAction)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
if(message.isPersistent() && queue.isDurable())
@@ -179,7 +180,7 @@ public class AutoCommitTransaction implements ServerTransaction
public void enqueue(List<? extends BaseQueue> queues, EnqueableMessage message, Action postTransactionAction, long currentTime)
{
- MessageStore.Transaction txn = null;
+ Transaction txn = null;
try
{
@@ -247,7 +248,7 @@ public class AutoCommitTransaction implements ServerTransaction
return false;
}
- private void rollbackIfNecessary(Action postTransactionAction, MessageStore.Transaction txn)
+ private void rollbackIfNecessary(Action postTransactionAction, Transaction txn)
{
if (txn != null)
{
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/DistributedTransaction.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/DistributedTransaction.java
index 36f5f7b58f..05d0110e9b 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/DistributedTransaction.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/DistributedTransaction.java
@@ -26,6 +26,7 @@ import org.apache.qpid.server.protocol.AMQSessionModel;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.Transaction;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.transport.Xid;
@@ -38,7 +39,7 @@ public class DistributedTransaction implements ServerTransaction
private final AutoCommitTransaction _autoCommitTransaction;
- private volatile MessageStore.Transaction _transaction;
+ private volatile Transaction _transaction;
private long _txnStartTime = 0L;
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/DtxBranch.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/DtxBranch.java
index 99bb639261..3ac71fc6a6 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/DtxBranch.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/DtxBranch.java
@@ -33,6 +33,7 @@ import org.apache.qpid.server.message.EnqueableMessage;
import org.apache.qpid.server.protocol.AMQSessionModel;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.Transaction;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.transport.Xid;
@@ -48,7 +49,7 @@ public class DtxBranch
private final List<Record> _enqueueRecords = new ArrayList<Record>();
private final List<Record> _dequeueRecords = new ArrayList<Record>();
- private MessageStore.Transaction _transaction;
+ private Transaction _transaction;
private long _expiration;
private VirtualHost _vhost;
private ScheduledFuture<?> _timeoutFuture;
@@ -199,7 +200,7 @@ public class DtxBranch
public void prepare() throws AMQStoreException
{
- MessageStore.Transaction txn = _store.newTransaction();
+ Transaction txn = _store.newTransaction();
txn.recordXid(_xid.getFormat(),
_xid.getGlobalId(),
_xid.getBranchId(),
@@ -223,7 +224,7 @@ public class DtxBranch
{
// prepare has previously been called
- MessageStore.Transaction txn = _store.newTransaction();
+ Transaction txn = _store.newTransaction();
txn.removeXid(_xid.getFormat(), _xid.getGlobalId(), _xid.getBranchId());
txn.commitTran();
@@ -302,7 +303,7 @@ public class DtxBranch
_enqueueRecords.add(new Record(queue, message));
}
- private static final class Record implements MessageStore.Transaction.Record
+ private static final class Record implements Transaction.Record
{
private final BaseQueue _queue;
private final EnqueableMessage _message;
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/LocalTransaction.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/LocalTransaction.java
index 9b61f7543f..11401ebd65 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/LocalTransaction.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/LocalTransaction.java
@@ -29,6 +29,7 @@ import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.Transaction;
import java.util.ArrayList;
import java.util.Collection;
@@ -46,7 +47,7 @@ public class LocalTransaction implements ServerTransaction
private final List<Action> _postTransactionActions = new ArrayList<Action>();
- private volatile MessageStore.Transaction _transaction;
+ private volatile Transaction _transaction;
private MessageStore _transactionLog;
private long _txnStartTime = 0L;
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/ServerTransaction.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/ServerTransaction.java
index 7617544451..c568ae67aa 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/ServerTransaction.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/txn/ServerTransaction.java
@@ -20,13 +20,12 @@
*/
package org.apache.qpid.server.txn;
+import java.util.Collection;
+import java.util.List;
import org.apache.qpid.server.message.EnqueableMessage;
import org.apache.qpid.server.queue.BaseQueue;
import org.apache.qpid.server.queue.QueueEntry;
-import java.util.Collection;
-import java.util.List;
-
/**
* The ServerTransaction interface allows a set enqueue/dequeue operations to be
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/util/MapJsonSerializer.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/util/MapJsonSerializer.java
new file mode 100644
index 0000000000..2d9ba38555
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/util/MapJsonSerializer.java
@@ -0,0 +1,69 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.util;
+
+import java.io.StringWriter;
+import java.util.Map;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.TypeReference;
+
+public class MapJsonSerializer
+{
+ private static final TypeReference<Map<String, Object>> MAP_TYPE_REFERENCE = new TypeReference<Map<String, Object>>()
+ {
+ };
+
+ private ObjectMapper _mapper;
+
+ public MapJsonSerializer()
+ {
+ _mapper = new ObjectMapper();
+ }
+
+ public String serialize(Map<String, Object> attributeMap)
+ {
+ StringWriter stringWriter = new StringWriter();
+ try
+ {
+ _mapper.writeValue(stringWriter, attributeMap);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Failure to serialize map:" + attributeMap, e);
+ }
+ return stringWriter.toString();
+ }
+
+ public Map<String, Object> deserialize(String json)
+ {
+ Map<String, Object> attributesMap = null;
+ try
+ {
+ attributesMap = _mapper.readValue(json, MAP_TYPE_REFERENCE);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Failure to deserialize json:" + json, e);
+ }
+ return attributesMap;
+ }
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/State.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/State.java
new file mode 100644
index 0000000000..fb50b3e289
--- /dev/null
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/State.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.virtualhost;
+
+public enum State
+{
+ INITIALISING,
+ ACTIVE,
+ PASSIVE,
+ STOPPED
+}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java
index 5e4a4f2db6..489b985222 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java
@@ -33,6 +33,7 @@ import org.apache.qpid.server.exchange.ExchangeFactory;
import org.apache.qpid.server.exchange.ExchangeRegistry;
import org.apache.qpid.server.federation.BrokerLink;
import org.apache.qpid.server.management.ManagedObject;
+import org.apache.qpid.server.protocol.v1_0.LinkRegistry;
import org.apache.qpid.server.queue.QueueRegistry;
import org.apache.qpid.server.registry.IApplicationRegistry;
import org.apache.qpid.server.security.SecurityManager;
@@ -57,8 +58,6 @@ public interface VirtualHost extends DurableConfigurationStore.Source, VirtualHo
MessageStore getMessageStore();
- DurableConfigurationStore getDurableConfigurationStore();
-
SecurityManager getSecurityManager();
void close();
@@ -98,5 +97,9 @@ public interface VirtualHost extends DurableConfigurationStore.Source, VirtualHo
void removeBrokerConnection(BrokerLink brokerLink);
+ LinkRegistry getLinkRegistry(String remoteContainerId);
+
ScheduledFuture<?> scheduleTask(long delay, Runnable timeoutTask);
+
+ State getState();
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostConfigRecoveryHandler.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostConfigRecoveryHandler.java
index 0e965472d5..e956806823 100755
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostConfigRecoveryHandler.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostConfigRecoveryHandler.java
@@ -23,12 +23,11 @@ package org.apache.qpid.server.virtualhost;
import java.io.DataInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.UUID;
+
import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
import org.apache.qpid.AMQStoreException;
@@ -52,6 +51,7 @@ import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
import org.apache.qpid.server.store.StoredMessage;
+import org.apache.qpid.server.store.Transaction;
import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
import org.apache.qpid.server.store.TransactionLogResource;
import org.apache.qpid.server.txn.DtxBranch;
@@ -74,11 +74,9 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
{
private static final Logger _logger = Logger.getLogger(VirtualHostConfigRecoveryHandler.class);
-
private final VirtualHost _virtualHost;
private MessageStoreLogSubject _logSubject;
- private List<ProcessAction> _actions;
private MessageStore _store;
@@ -95,14 +93,14 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
public VirtualHostConfigRecoveryHandler begin(MessageStore store)
{
- _logSubject = new MessageStoreLogSubject(_virtualHost,store);
+ _logSubject = new MessageStoreLogSubject(_virtualHost,store.getClass().getSimpleName());
_store = store;
CurrentActor.get().message(_logSubject, TransactionLogMessages.RECOVERY_START(null, false));
return this;
}
- public void queue(String queueName, String owner, boolean exclusive, FieldTable arguments)
+ public void queue(UUID id, String queueName, String owner, boolean exclusive, FieldTable arguments)
{
try
{
@@ -110,7 +108,7 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
if (q == null)
{
- q = AMQQueueFactory.createAMQQueueImpl(queueName, true, owner, false, exclusive, _virtualHost,
+ q = AMQQueueFactory.createAMQQueueImpl(id, queueName, true, owner, false, exclusive, _virtualHost,
FieldTable.convertToMap(arguments));
_virtualHost.getQueueRegistry().registerQueue(q);
}
@@ -132,7 +130,7 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
return this;
}
- public void exchange(String exchangeName, String type, boolean autoDelete)
+ public void exchange(UUID id, String exchangeName, String type, boolean autoDelete)
{
try
{
@@ -141,7 +139,7 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
exchange = _virtualHost.getExchangeRegistry().getExchange(exchangeNameSS);
if (exchange == null)
{
- exchange = _virtualHost.getExchangeFactory().createExchange(exchangeNameSS, new AMQShortString(type), true, autoDelete, 0);
+ exchange = _virtualHost.getExchangeFactory().createExchange(id, exchangeNameSS, new AMQShortString(type), true, autoDelete, 0);
_virtualHost.getExchangeRegistry().registerExchange(exchange);
}
}
@@ -201,8 +199,8 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
}
public void dtxRecord(long format, byte[] globalId, byte[] branchId,
- MessageStore.Transaction.Record[] enqueues,
- MessageStore.Transaction.Record[] dequeues)
+ Transaction.Record[] enqueues,
+ Transaction.Record[] dequeues)
{
Xid id = new Xid(format, globalId, branchId);
DtxRegistry dtxRegistry = _virtualHost.getDtxRegistry();
@@ -212,9 +210,9 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
branch = new DtxBranch(id, _store, _virtualHost);
dtxRegistry.registerBranch(branch);
}
- for(MessageStore.Transaction.Record record : enqueues)
+ for(Transaction.Record record : enqueues)
{
- final AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(record.getQueue().getResourceName());
+ final AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(record.getQueue().getId());
if(queue != null)
{
final long messageId = record.getMessage().getMessageNumber();
@@ -255,10 +253,9 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
else
{
StringBuilder xidString = xidAsString(id);
- String messageNumberString = String.valueOf(message.getMessageNumber());
CurrentActor.get().message(_logSubject,
TransactionLogMessages.XA_INCOMPLETE_MESSAGE(xidString.toString(),
- messageNumberString));
+ Long.toString(messageId)));
}
@@ -268,13 +265,13 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
StringBuilder xidString = xidAsString(id);
CurrentActor.get().message(_logSubject,
TransactionLogMessages.XA_INCOMPLETE_QUEUE(xidString.toString(),
- record.getQueue().getResourceName()));
+ record.getQueue().getId().toString()));
}
}
- for(MessageStore.Transaction.Record record : dequeues)
+ for(Transaction.Record record : dequeues)
{
- final AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(record.getQueue().getResourceName());
+ final AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(record.getQueue().getId());
if(queue != null)
{
final long messageId = record.getMessage().getMessageNumber();
@@ -306,10 +303,9 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
else
{
StringBuilder xidString = xidAsString(id);
- String messageNumberString = String.valueOf(message.getMessageNumber());
CurrentActor.get().message(_logSubject,
TransactionLogMessages.XA_INCOMPLETE_MESSAGE(xidString.toString(),
- messageNumberString));
+ Long.toString(messageId)));
}
@@ -319,7 +315,7 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
StringBuilder xidString = xidAsString(id);
CurrentActor.get().message(_logSubject,
TransactionLogMessages.XA_INCOMPLETE_QUEUE(xidString.toString(),
- queue.getName()));
+ record.getQueue().getId().toString()));
}
}
@@ -358,47 +354,22 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
CurrentActor.get().message(_logSubject, TransactionLogMessages.RECOVERY_COMPLETE(null, false));
}
- private static final class ProcessAction
+ @Override
+ public void binding(UUID bindingId, UUID exchangeId, UUID queueId, String bindingKey, ByteBuffer buf)
{
- private final AMQQueue _queue;
- private final AMQMessage _message;
-
- public ProcessAction(AMQQueue queue, AMQMessage message)
- {
- _queue = queue;
- _message = message;
- }
-
- public void process()
- {
- try
- {
- _queue.enqueue(_message);
- }
- catch(AMQException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- }
-
- public void binding(String exchangeName, String queueName, String bindingKey, ByteBuffer buf)
- {
- _actions = new ArrayList<ProcessAction>();
try
{
- Exchange exchange = _virtualHost.getExchangeRegistry().getExchange(exchangeName);
+ Exchange exchange = _virtualHost.getExchangeRegistry().getExchange(exchangeId);
if (exchange == null)
{
- _logger.error("Unknown exchange: " + exchangeName + ", cannot bind queue : " + queueName);
+ _logger.error("Unknown exchange id " + exchangeId + ", cannot bind queue with id " + queueId);
return;
}
-
- AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(new AMQShortString(queueName));
+
+ AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(queueId);
if (queue == null)
{
- _logger.error("Unknown queue: " + queueName + ", cannot be bound to exchange: " + exchangeName);
+ _logger.error("Unknown queue id " + queueId + ", cannot be bound to exchange: " + exchange.getName());
}
else
{
@@ -422,10 +393,10 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
if(bf.getBinding(bindingKey, queue, exchange, argumentMap) == null)
{
- _logger.info("Restoring binding: (Exchange: " + exchange.getNameShortString() + ", Queue: " + queueName
+ _logger.info("Restoring binding: (Exchange: " + exchange.getNameShortString() + ", Queue: " + queue.getName()
+ ", Routing Key: " + bindingKey + ", Arguments: " + argumentsFT + ")");
- bf.restoreBinding(bindingKey, queue, exchange, argumentMap);
+ bf.restoreBinding(bindingId, bindingKey, queue, exchange, argumentMap);
}
}
}
@@ -447,16 +418,14 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
}
- public void queueEntry(final String queueName, long messageId)
+ public void queueEntry(final UUID queueId, long messageId)
{
- AMQShortString queueNameShortString = new AMQShortString(queueName);
-
- AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(queueNameShortString);
-
+ AMQQueue queue = _virtualHost.getQueueRegistry().getQueue(queueId);
try
{
if(queue != null)
{
+ String queueName = queue.getName();
ServerMessage message = _recoveredMessages.get(messageId);
_unusedMessages.remove(messageId);
@@ -466,7 +435,7 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
if (_logger.isDebugEnabled())
{
- _logger.debug("On recovery, delivering " + message.getMessageNumber() + " to " + queue.getNameShortString());
+ _logger.debug("On recovery, delivering " + message.getMessageNumber() + " to " + queueName);
}
Integer count = _queueRecoveries.get(queueName);
@@ -481,23 +450,23 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
}
else
{
- _logger.warn("Message id " + messageId + " referenced in log as enqueued in queue " + queue.getNameShortString() + " is unknown, entry will be discarded");
- MessageStore.Transaction txn = _store.newTransaction();
+ _logger.warn("Message id " + messageId + " referenced in log as enqueued in queue " + queueName + " is unknown, entry will be discarded");
+ Transaction txn = _store.newTransaction();
txn.dequeueMessage(queue, new DummyMessage(messageId));
txn.commitTranAsync();
}
}
else
{
- _logger.warn("Message id " + messageId + " in log references queue " + queueName + " which is not in the configuration, entry will be discarded");
- MessageStore.Transaction txn = _store.newTransaction();
+ _logger.warn("Message id " + messageId + " in log references queue with id " + queueId + " which is not in the configuration, entry will be discarded");
+ Transaction txn = _store.newTransaction();
TransactionLogResource mockQueue =
new TransactionLogResource()
{
-
- public String getResourceName()
+ @Override
+ public UUID getId()
{
- return queueName;
+ return queueId;
}
};
txn.dequeueMessage(mockQueue, new DummyMessage(messageId));
@@ -509,9 +478,6 @@ public class VirtualHostConfigRecoveryHandler implements ConfigurationRecoveryHa
{
throw new RuntimeException(e);
}
-
-
-
}
public DtxRecordRecoveryHandler completeQueueEntryRecovery()
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
index fcad1550e1..9b113525d4 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java
@@ -20,15 +20,11 @@
*/
package org.apache.qpid.server.virtualhost;
-import java.util.concurrent.ScheduledFuture;
-import org.apache.commons.configuration.Configuration;
+
import org.apache.commons.configuration.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.qpid.AMQException;
-import org.apache.qpid.AMQStoreException;
import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.server.AMQBrokerManagerMBean;
import org.apache.qpid.server.binding.BindingFactory;
import org.apache.qpid.server.configuration.BrokerConfig;
@@ -45,14 +41,13 @@ import org.apache.qpid.server.exchange.DefaultExchangeRegistry;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.exchange.ExchangeFactory;
import org.apache.qpid.server.exchange.ExchangeRegistry;
-import org.apache.qpid.server.federation.Bridge;
import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.logging.actors.CurrentActor;
import org.apache.qpid.server.logging.messages.VirtualHostMessages;
import org.apache.qpid.server.logging.subjects.MessageStoreLogSubject;
import org.apache.qpid.server.management.AMQManagedObject;
import org.apache.qpid.server.management.ManagedObject;
+import org.apache.qpid.server.protocol.v1_0.LinkRegistry;
import org.apache.qpid.server.protocol.AMQConnectionModel;
import org.apache.qpid.server.protocol.AMQSessionModel;
import org.apache.qpid.server.queue.AMQQueue;
@@ -62,22 +57,29 @@ import org.apache.qpid.server.queue.QueueRegistry;
import org.apache.qpid.server.registry.IApplicationRegistry;
import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.stats.StatisticsCounter;
-import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
-import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.store.Event;
+import org.apache.qpid.server.store.EventListener;
import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreFactory;
+import org.apache.qpid.server.store.OperationalLoggingListener;
import org.apache.qpid.server.txn.DtxRegistry;
import org.apache.qpid.server.virtualhost.plugins.VirtualHostPlugin;
import org.apache.qpid.server.virtualhost.plugins.VirtualHostPluginFactory;
+import javax.management.JMException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
+import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+
public class VirtualHostImpl implements VirtualHost
{
private static final Logger _logger = Logger.getLogger(VirtualHostImpl.class);
@@ -100,97 +102,80 @@ public class VirtualHostImpl implements VirtualHost
private final BrokerConfig _brokerConfig;
- private final VirtualHostConfiguration _configuration;
+ private final VirtualHostConfiguration _vhostConfig;
- private ConnectionRegistry _connectionRegistry;
+ private final VirtualHostMBean _virtualHostMBean;
- private QueueRegistry _queueRegistry;
+ private final AMQBrokerManagerMBean _brokerMBean;
- private ExchangeRegistry _exchangeRegistry;
+ private final QueueRegistry _queueRegistry;
- private ExchangeFactory _exchangeFactory;
+ private final ExchangeRegistry _exchangeRegistry;
- private MessageStore _messageStore;
+ private final ExchangeFactory _exchangeFactory;
- private DtxRegistry _dtxRegistry;
+ private final ConnectionRegistry _connectionRegistry;
- private VirtualHostMBean _virtualHostMBean;
+ private final BindingFactory _bindingFactory;
- private AMQBrokerManagerMBean _brokerMBean;
+ private final DtxRegistry _dtxRegistry;
+ private final MessageStore _messageStore;
- private DurableConfigurationStore _durableConfigurationStore;
- private BindingFactory _bindingFactory;
+ private State _state = State.INITIALISING;
private boolean _statisticsEnabled = false;
+
private StatisticsCounter _messagesDelivered, _dataDelivered, _messagesReceived, _dataReceived;
+ private final Map<String, LinkRegistry> _linkRegistry = new HashMap<String, LinkRegistry>();
- public VirtualHostImpl(IApplicationRegistry appRegistry, VirtualHostConfiguration hostConfig, MessageStore store) throws Exception
+ public VirtualHostImpl(IApplicationRegistry appRegistry, VirtualHostConfiguration hostConfig) throws Exception
{
if (hostConfig == null)
{
throw new IllegalArgumentException("HostConfig cannot be null");
}
+ if (hostConfig.getName() == null || hostConfig.getName().length() == 0)
+ {
+ throw new IllegalArgumentException("Illegal name (" + hostConfig.getName() + ") for virtualhost.");
+ }
+
_appRegistry = appRegistry;
_brokerConfig = _appRegistry.getBroker();
- _configuration = hostConfig;
- _name = _configuration.getName();
+ _vhostConfig = hostConfig;
+ _name = _vhostConfig.getName();
_dtxRegistry = new DtxRegistry();
_id = _appRegistry.getConfigStore().createId();
CurrentActor.get().message(VirtualHostMessages.CREATED(_name));
- if (_name == null || _name.length() == 0)
- {
- throw new IllegalArgumentException("Illegal name (" + _name + ") for virtualhost.");
- }
-
- _securityManager = new SecurityManager(_appRegistry.getSecurityManager());
- _securityManager.configureHostPlugins(_configuration);
-
_virtualHostMBean = new VirtualHostMBean();
+ _securityManager = new SecurityManager(_appRegistry.getSecurityManager());
+ _securityManager.configureHostPlugins(_vhostConfig);
_connectionRegistry = new ConnectionRegistry();
- _houseKeepingTasks = new ScheduledThreadPoolExecutor(_configuration.getHouseKeepingThreadCount());
+ _houseKeepingTasks = new ScheduledThreadPoolExecutor(_vhostConfig.getHouseKeepingThreadCount());
_queueRegistry = new DefaultQueueRegistry(this);
_exchangeFactory = new DefaultExchangeFactory(this);
- _exchangeFactory.initialise(_configuration);
+ _exchangeFactory.initialise(_vhostConfig);
_exchangeRegistry = new DefaultExchangeRegistry(this);
- StartupRoutingTable configFileRT = new StartupRoutingTable();
-
- _durableConfigurationStore = configFileRT;
-
- // This needs to be after the RT has been defined as it creates the default durable exchanges.
- _exchangeRegistry.initialise();
-
_bindingFactory = new BindingFactory(this);
- initialiseModel(_configuration);
+ _brokerMBean = new AMQBrokerManagerMBean(_virtualHostMBean);
- if (store != null)
- {
- _messageStore = store;
- if(store instanceof DurableConfigurationStore)
- {
- _durableConfigurationStore = (DurableConfigurationStore) store;
- }
- }
- else
- {
- initialiseMessageStore(hostConfig);
- }
+ _messageStore = initialiseMessageStore(hostConfig.getMessageStoreFactoryClass());
- _brokerMBean = new AMQBrokerManagerMBean(_virtualHostMBean);
- _brokerMBean.register();
- initialiseHouseKeeping(hostConfig.getHousekeepingCheckPeriod());
+ configureMessageStore(hostConfig);
+
+ activateNonHAMessageStore();
initialiseStatistics();
}
@@ -202,7 +187,7 @@ public class VirtualHostImpl implements VirtualHost
public VirtualHostConfiguration getConfiguration()
{
- return _configuration;
+ return _vhostConfig;
}
public UUID getId()
@@ -226,47 +211,16 @@ public class VirtualHostImpl implements VirtualHost
}
/**
- * Virtual host JMX MBean class.
- *
- * This has some of the methods implemented from management intrerface for exchanges. Any
- * implementaion of an Exchange MBean should extend this class.
- */
- public class VirtualHostMBean extends AMQManagedObject implements ManagedVirtualHost
- {
- public VirtualHostMBean() throws NotCompliantMBeanException
- {
- super(ManagedVirtualHost.class, ManagedVirtualHost.TYPE);
- }
-
- public String getObjectInstanceName()
- {
- return ObjectName.quote(_name);
- }
-
- public String getName()
- {
- return _name;
- }
-
- public VirtualHostImpl getVirtualHost()
- {
- return VirtualHostImpl.this;
- }
- }
-
-
- /**
* Initialise a housekeeping task to iterate over queues cleaning expired messages with no consumers
* and checking for idle or open transactions that have exceeded the permitted thresholds.
*
* @param period
*/
- private void initialiseHouseKeeping(long period)
+ private void initialiseHouseKeeping(long period)
{
+
if (period != 0L)
{
-
-
scheduleHouseKeepingTask(period, new VirtualHostHouseKeepingTask());
Map<String, VirtualHostPluginFactory> plugins = _appRegistry.getPluginManager().getVirtualHostPlugins();
@@ -299,50 +253,30 @@ public class VirtualHostImpl implements VirtualHost
}
}
- private class VirtualHostHouseKeepingTask extends HouseKeepingTask
+ private void shutdownHouseKeeping()
{
- public VirtualHostHouseKeepingTask()
- {
- super(VirtualHostImpl.this);
- }
+ _houseKeepingTasks.shutdown();
- public void execute()
+ try
+ {
+ if (!_houseKeepingTasks.awaitTermination(HOUSEKEEPING_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS))
+ {
+ _houseKeepingTasks.shutdownNow();
+ }
+ }
+ catch (InterruptedException e)
+ {
+ _logger.warn("Interrupted during Housekeeping shutdown:", e);
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ private void removeHouseKeepingTasks()
+ {
+ BlockingQueue<Runnable> taskQueue = _houseKeepingTasks.getQueue();
+ for (final Runnable runnable : taskQueue)
{
- for (AMQQueue q : _queueRegistry.getQueues())
- {
- _logger.debug("Checking message status for queue: "
- + q.getName());
- try
- {
- q.checkMessageStatus();
- }
- catch (Exception e)
- {
- _logger.error("Exception in housekeeping for queue: "
- + q.getNameShortString().toString(), e);
- //Don't throw exceptions as this will stop the
- // house keeping task from running.
- }
- }
- for (AMQConnectionModel connection : getConnectionRegistry().getConnections())
- {
- _logger.debug("Checking for long running open transactions on connection " + connection);
- for (AMQSessionModel session : connection.getSessionModels())
- {
- _logger.debug("Checking for long running open transactions on session " + session);
- try
- {
- session.checkTransactionStatus(_configuration.getTransactionTimeoutOpenWarn(),
- _configuration.getTransactionTimeoutOpenClose(),
- _configuration.getTransactionTimeoutIdleWarn(),
- _configuration.getTransactionTimeoutIdleClose());
- }
- catch (Exception e)
- {
- _logger.error("Exception in housekeeping for connection: " + connection.toString(), e);
- }
- }
- }
+ _houseKeepingTasks.remove(runnable);
}
}
@@ -390,48 +324,44 @@ public class VirtualHostImpl implements VirtualHost
}
- private void initialiseMessageStore(VirtualHostConfiguration hostConfig) throws Exception
+ private MessageStore initialiseMessageStore(final String messageStoreFactoryClass) throws Exception
{
- String messageStoreClass = hostConfig.getMessageStoreClass();
+ final Class<?> clazz = Class.forName(messageStoreFactoryClass);
+ final Object o = clazz.newInstance();
- Class<?> clazz = Class.forName(messageStoreClass);
- Object o = clazz.newInstance();
-
- if (!(o instanceof MessageStore))
+ if (!(o instanceof MessageStoreFactory))
{
- throw new ClassCastException("Message store class must implement " + MessageStore.class + ". Class " + clazz +
- " does not.");
+ throw new ClassCastException("Message store factory class must implement " + MessageStoreFactory.class +
+ ". Class " + clazz + " does not.");
}
- MessageStore messageStore = (MessageStore) o;
- VirtualHostConfigRecoveryHandler recoveryHandler = new VirtualHostConfigRecoveryHandler(this);
- MessageStoreLogSubject storeLogSubject = new MessageStoreLogSubject(this, messageStore);
+ final MessageStoreFactory messageStoreFactory = (MessageStoreFactory) o;
+ final MessageStore messageStore = messageStoreFactory.createMessageStore();
+ final MessageStoreLogSubject storeLogSubject = new MessageStoreLogSubject(this, messageStoreFactory.getStoreClassName());
+ OperationalLoggingListener.listen(messageStore, storeLogSubject);
+ messageStore.addEventListener(new BeforeActivationListener(), Event.BEFORE_ACTIVATE);
+ messageStore.addEventListener(new AfterActivationListener(), Event.AFTER_ACTIVATE);
+ messageStore.addEventListener(new BeforeCloseListener(), Event.BEFORE_CLOSE);
+ messageStore.addEventListener(new BeforePassivationListener(), Event.BEFORE_PASSIVATE);
- if(messageStore instanceof DurableConfigurationStore)
- {
- DurableConfigurationStore durableConfigurationStore = (DurableConfigurationStore) messageStore;
-
- durableConfigurationStore.configureConfigStore(this.getName(),
- recoveryHandler,
- hostConfig.getStoreConfiguration(),
- storeLogSubject);
+ return messageStore;
+ }
- _durableConfigurationStore = durableConfigurationStore;
- }
+ private void configureMessageStore(VirtualHostConfiguration hostConfig) throws Exception
+ {
- messageStore.configureMessageStore(this.getName(),
- recoveryHandler,
- hostConfig.getStoreConfiguration(),
- storeLogSubject);
- messageStore.configureTransactionLog(this.getName(),
- recoveryHandler,
- hostConfig.getStoreConfiguration(),
- storeLogSubject);
+ VirtualHostConfigRecoveryHandler recoveryHandler = new VirtualHostConfigRecoveryHandler(this);
- _messageStore = messageStore;
+ // TODO perhaps pass config on construction??
+ _messageStore.configureConfigStore(getName(), recoveryHandler, hostConfig.getStoreConfiguration());
+ _messageStore.configureMessageStore(getName(), recoveryHandler, recoveryHandler, hostConfig.getStoreConfiguration());
+ }
+ private void activateNonHAMessageStore() throws Exception
+ {
+ _messageStore.activate();
}
private void initialiseModel(VirtualHostConfiguration config) throws ConfigurationException, AMQException
@@ -445,7 +375,7 @@ public class VirtualHostImpl implements VirtualHost
configureExchange(config.getExchangeConfiguration(exchangeName));
}
- String[] queueNames = config.getQueueNames();
+ String[] queueNames = config.getQueueNames();
for (Object queueNameObj : queueNames)
{
@@ -456,45 +386,45 @@ public class VirtualHostImpl implements VirtualHost
private void configureExchange(ExchangeConfiguration exchangeConfiguration) throws AMQException
{
- AMQShortString exchangeName = new AMQShortString(exchangeConfiguration.getName());
+ AMQShortString exchangeName = new AMQShortString(exchangeConfiguration.getName());
Exchange exchange;
exchange = _exchangeRegistry.getExchange(exchangeName);
if (exchange == null)
{
- AMQShortString type = new AMQShortString(exchangeConfiguration.getType());
- boolean durable = exchangeConfiguration.getDurable();
- boolean autodelete = exchangeConfiguration.getAutoDelete();
+ AMQShortString type = new AMQShortString(exchangeConfiguration.getType());
+ boolean durable = exchangeConfiguration.getDurable();
+ boolean autodelete = exchangeConfiguration.getAutoDelete();
Exchange newExchange = _exchangeFactory.createExchange(exchangeName, type, durable, autodelete, 0);
_exchangeRegistry.registerExchange(newExchange);
if (newExchange.isDurable())
{
- _durableConfigurationStore.createExchange(newExchange);
+ _messageStore.createExchange(newExchange);
}
}
}
private void configureQueue(QueueConfiguration queueConfiguration) throws AMQException, ConfigurationException
{
- AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(queueConfiguration, this);
+ AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(queueConfiguration, this);
String queueName = queue.getName();
- if (queue.isDurable())
- {
- getDurableConfigurationStore().createQueue(queue);
- }
+ if (queue.isDurable())
+ {
+ getMessageStore().createQueue(queue);
+ }
//get the exchange name (returns default exchange name if none was specified)
- String exchangeName = queueConfiguration.getExchange();
+ String exchangeName = queueConfiguration.getExchange();
Exchange exchange = _exchangeRegistry.getExchange(exchangeName);
- if (exchange == null)
- {
+ if (exchange == null)
+ {
throw new ConfigurationException("Attempt to bind queue '" + queueName + "' to unknown exchange:" + exchangeName);
- }
+ }
Exchange defaultExchange = _exchangeRegistry.getDefaultExchange();
@@ -573,11 +503,6 @@ public class VirtualHostImpl implements VirtualHost
return _messageStore;
}
- public DurableConfigurationStore getDurableConfigurationStore()
- {
- return _durableConfigurationStore;
- }
-
public SecurityManager getSecurityManager()
{
return _securityManager;
@@ -587,39 +512,8 @@ public class VirtualHostImpl implements VirtualHost
{
//Stop Connections
_connectionRegistry.close();
-
- //Stop the Queues processing
- if (_queueRegistry != null)
- {
- for (AMQQueue queue : _queueRegistry.getQueues())
- {
- queue.stop();
- }
- }
-
- //Stop Housekeeping
- if (_houseKeepingTasks != null)
- {
- _houseKeepingTasks.shutdown();
-
- try
- {
- if (!_houseKeepingTasks.awaitTermination(HOUSEKEEPING_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS))
- {
- _houseKeepingTasks.shutdownNow();
- }
- }
- catch (InterruptedException e)
- {
- _logger.warn("Interrupted during Housekeeping shutdown:" + e.getMessage());
- // Swallowing InterruptedException ok as we are shutting down.
- }
- }
-
- if(_dtxRegistry != null)
- {
- _dtxRegistry.close();
- }
+ _queueRegistry.stopAllAndUnregisterMBeans();
+ _dtxRegistry.close();
//Close MessageStore
if (_messageStore != null)
@@ -635,6 +529,8 @@ public class VirtualHostImpl implements VirtualHost
}
}
+ _state = State.STOPPED;
+
CurrentActor.get().message(VirtualHostMessages.CLOSED());
}
@@ -746,7 +642,6 @@ public class VirtualHostImpl implements VirtualHost
return blink;
}
-
public void createBrokerConnection(final String transport,
final String host,
final int port,
@@ -783,6 +678,17 @@ public class VirtualHostImpl implements VirtualHost
}
}
+ public synchronized LinkRegistry getLinkRegistry(String remoteContainerId)
+ {
+ LinkRegistry linkRegistry = _linkRegistry.get(remoteContainerId);
+ if(linkRegistry == null)
+ {
+ linkRegistry = new LinkRegistry();
+ _linkRegistry.put(remoteContainerId, linkRegistry);
+ }
+ return linkRegistry;
+ }
+
public ConfigStore getConfigStore()
{
return getApplicationRegistry().getConfigStore();
@@ -793,74 +699,161 @@ public class VirtualHostImpl implements VirtualHost
return _dtxRegistry;
}
+ @Override
+ public String toString()
+ {
+ return _name;
+ }
+
+ @Override
+ public State getState()
+ {
+ return _state;
+ }
+
+
/**
- * Temporary Startup RT class to record the creation of persistent queues / exchanges.
- *
+ * Virtual host JMX MBean class.
*
- * This is so we can replay the creation of queues/exchanges in to the real _RT after it has been loaded.
- * This should be removed after the _RT has been fully split from the the TL
+ * This has some of the methods implemented from management interface for exchanges. Any
+ * Implementation of an Exchange MBean should extend this class.
*/
- private static class StartupRoutingTable implements DurableConfigurationStore
+ public class VirtualHostMBean extends AMQManagedObject implements ManagedVirtualHost
{
- public void configureConfigStore(String name,
- ConfigurationRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
+ public VirtualHostMBean() throws NotCompliantMBeanException
{
+ super(ManagedVirtualHost.class, ManagedVirtualHost.TYPE);
}
- public void createExchange(Exchange exchange) throws AMQStoreException
+ public String getObjectInstanceName()
{
+ return ObjectName.quote(_name);
}
- public void removeExchange(Exchange exchange) throws AMQStoreException
+ public String getName()
{
+ return _name;
}
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
+ public VirtualHostImpl getVirtualHost()
{
+ return VirtualHostImpl.this;
}
+ }
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
+ private final class BeforeActivationListener implements EventListener
+ {
+ @Override
+ public void event(Event event)
{
+ try
+ {
+ _exchangeRegistry.initialise();
+ initialiseModel(_vhostConfig);
+ } catch (Exception e)
+ {
+ throw new RuntimeException("Failed to initialise virtual host after state change", e);
+ }
}
+ }
- public void createQueue(AMQQueue queue) throws AMQStoreException
+ private final class AfterActivationListener implements EventListener
+ {
+ @Override
+ public void event(Event event)
{
- }
+ initialiseHouseKeeping(_vhostConfig.getHousekeepingCheckPeriod());
+ try
+ {
+ _brokerMBean.register();
+ } catch (JMException e)
+ {
+ throw new RuntimeException("Failed to register virtual host mbean for virtual host " + getName(), e);
+ }
- public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
- {
+ _state = State.ACTIVE;
}
+ }
- public void removeQueue(AMQQueue queue) throws AMQStoreException
- {
- }
+ public class BeforePassivationListener implements EventListener
+ {
- public void updateQueue(AMQQueue queue) throws AMQStoreException
+ @Override
+ public void event(Event event)
{
- }
+ _connectionRegistry.close(IConnectionRegistry.VHOST_PASSIVATE_REPLY_TEXT);
+ _brokerMBean.unregister();
+ removeHouseKeepingTasks();
- public void createBrokerLink(final BrokerLink link) throws AMQStoreException
- {
+ _queueRegistry.stopAllAndUnregisterMBeans();
+ _exchangeRegistry.clearAndUnregisterMbeans();
+ _dtxRegistry.close();
+
+ _state = State.PASSIVE;
}
+ }
- public void deleteBrokerLink(final BrokerLink link) throws AMQStoreException
+ private final class BeforeCloseListener implements EventListener
+ {
+ @Override
+ public void event(Event event)
{
+ _brokerMBean.unregister();
+ shutdownHouseKeeping();
}
+ }
- public void createBridge(final Bridge bridge) throws AMQStoreException
+ private class VirtualHostHouseKeepingTask extends HouseKeepingTask
+ {
+ public VirtualHostHouseKeepingTask()
{
+ super(VirtualHostImpl.this);
}
- public void deleteBridge(final Bridge bridge) throws AMQStoreException
+ public void execute()
{
+ for (AMQQueue q : _queueRegistry.getQueues())
+ {
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Checking message status for queue: "
+ + q.getName());
+ }
+ try
+ {
+ q.checkMessageStatus();
+ } catch (Exception e)
+ {
+ _logger.error("Exception in housekeeping for queue: "
+ + q.getNameShortString().toString(), e);
+ //Don't throw exceptions as this will stop the
+ // house keeping task from running.
+ }
+ }
+ for (AMQConnectionModel connection : getConnectionRegistry().getConnections())
+ {
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Checking for long running open transactions on connection " + connection);
+ }
+ for (AMQSessionModel session : connection.getSessionModels())
+ {
+ if (_logger.isDebugEnabled())
+ {
+ _logger.debug("Checking for long running open transactions on session " + session);
+ }
+ try
+ {
+ session.checkTransactionStatus(_vhostConfig.getTransactionTimeoutOpenWarn(),
+ _vhostConfig.getTransactionTimeoutOpenClose(),
+ _vhostConfig.getTransactionTimeoutIdleWarn(),
+ _vhostConfig.getTransactionTimeoutIdleClose());
+ } catch (Exception e)
+ {
+ _logger.error("Exception in housekeeping for connection: " + connection.toString(), e);
+ }
+ }
+ }
}
}
-
- @Override
- public String toString()
- {
- return _name;
- }
}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java
index d34d1bbef3..5c500771c2 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/AMQBrokerManagerMBeanTest.java
@@ -37,6 +37,7 @@ import org.apache.qpid.server.queue.QueueRegistry;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.registry.IApplicationRegistry;
import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStoreFactory;
import org.apache.qpid.server.util.TestApplicationRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.server.virtualhost.VirtualHostImpl;
@@ -165,7 +166,7 @@ public class AMQBrokerManagerMBeanTest extends QpidTestCase
XMLConfiguration configXml = new XMLConfiguration();
configXml.addProperty("virtualhosts.virtualhost(-1).name", "test");
- configXml.addProperty("virtualhosts.virtualhost(-1).test.store.class", TestableMemoryMessageStore.class.getName());
+ configXml.addProperty("virtualhosts.virtualhost(-1).test.store.factoryclass", TestableMemoryMessageStoreFactory.class.getName());
ServerConfiguration configuration = new ServerConfiguration(configXml);
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/MockConnectionConfig.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/MockConnectionConfig.java
index 73e0bc5d27..c0777d2f8f 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/MockConnectionConfig.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/MockConnectionConfig.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.server.configuration;
import java.util.UUID;
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/VirtualHostConfigurationTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/VirtualHostConfigurationTest.java
index 50e7f0588b..c4c93acfb6 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/VirtualHostConfigurationTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/VirtualHostConfigurationTest.java
@@ -27,6 +27,7 @@ import org.apache.qpid.server.queue.AMQPriorityQueue;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStoreFactory;
import org.apache.qpid.server.util.InternalBrokerBaseCase;
import org.apache.qpid.server.virtualhost.VirtualHost;
@@ -161,7 +162,7 @@ public class VirtualHostConfigurationTest extends InternalBrokerBaseCase
getConfigXml().addProperty("virtualhosts.virtualhost." + getName() + "Extra.queues(-1).queue(-1).name", "r2d2");
getConfigXml().addProperty("virtualhosts.virtualhost." + getName() + "Extra.queues.queue.r2d2.deadLetterQueues", "true");
getConfigXml().addProperty("virtualhosts.virtualhost." + getName() + "Extra.queues(-1).queue(-1).name", "c3p0");
- getConfigXml().addProperty("virtualhosts.virtualhost." + getName() + "Extra.store.class", TestableMemoryMessageStore.class.getName());
+ getConfigXml().addProperty("virtualhosts.virtualhost." + getName() + "Extra.store.factoryclass", TestableMemoryMessageStoreFactory.class.getName());
// Start the broker now.
super.createBroker();
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java
index 7c7645e9e6..afd8fd9ed2 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/AbstractHeadersExchangeTestBase.java
@@ -20,8 +20,19 @@
*/
package org.apache.qpid.server.exchange;
-import org.apache.log4j.Logger;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.BasicContentHeaderProperties;
@@ -31,11 +42,11 @@ import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.framing.FieldTableFactory;
import org.apache.qpid.framing.abstraction.MessagePublishInfo;
import org.apache.qpid.server.binding.Binding;
-import org.apache.qpid.server.binding.BindingFactory;
import org.apache.qpid.server.message.AMQMessage;
import org.apache.qpid.server.message.AMQMessageHeader;
import org.apache.qpid.server.message.MessageMetaData;
import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.protocol.AMQProtocolSession;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.BaseQueue;
@@ -44,23 +55,10 @@ import org.apache.qpid.server.queue.MockStoredMessage;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.queue.SimpleAMQQueue;
import org.apache.qpid.server.registry.ApplicationRegistry;
-import org.apache.qpid.server.store.DurableConfigurationStore;
-import org.apache.qpid.server.store.MemoryMessageStore;
import org.apache.qpid.server.store.StoredMessage;
import org.apache.qpid.server.subscription.Subscription;
import org.apache.qpid.server.util.InternalBrokerBaseCase;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicLong;
-
public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
{
private static final Logger _log = Logger.getLogger(AbstractHeadersExchangeTestBase.class);
@@ -68,24 +66,6 @@ public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
private final HeadersExchange exchange = new HeadersExchange();
protected final Set<TestQueue> queues = new HashSet<TestQueue>();
-
-
- /**
- * Not used in this test, just there to stub out the routing calls
- */
- private MemoryMessageStore _store = new MemoryMessageStore();
-
-
- private BindingFactory bindingFactory = new BindingFactory(new DurableConfigurationStore.Source()
- {
-
- public DurableConfigurationStore getDurableConfigurationStore()
- {
- return _store;
- }
- },
- exchange);
-
private int count;
public void testDoNothing()
@@ -103,7 +83,6 @@ public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
protected void unbind(TestQueue queue, String... bindings) throws AMQException
{
String queueName = queue.getName();
- //TODO - check this
exchange.onUnbind(new Binding(null,queueName, queue, exchange, getHeadersMap(bindings)));
}
@@ -297,7 +276,7 @@ public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
public TestQueue(AMQShortString name) throws AMQException
{
- super(name, false, new AMQShortString("test"), true, false,ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHost("test"), Collections.EMPTY_MAP);
+ super(UUIDGenerator.generateUUID(), name, false, new AMQShortString("test"), true, false,ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHost("test"), Collections.EMPTY_MAP);
ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHost("test").getQueueRegistry().registerQueue(this);
}
@@ -538,12 +517,6 @@ public class AbstractHeadersExchangeTestBase extends InternalBrokerBaseCase
}
- public AMQMessage getUnderlyingMessage()
- {
- return Message.this;
- }
-
-
public ContentHeaderBody getContentHeader()
{
try
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java
index 1fac4afe29..9034bf9c3a 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/exchange/ExchangeMBeanTest.java
@@ -26,6 +26,7 @@ import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.management.common.mbeans.ManagedExchange;
import org.apache.qpid.server.management.ManagedObject;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.queue.QueueRegistry;
@@ -52,7 +53,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testGeneralProperties() throws Exception
{
DirectExchange exchange = new DirectExchange();
- exchange.initialise(_virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
@@ -67,7 +68,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testDirectExchangeMBean() throws Exception
{
DirectExchange exchange = new DirectExchange();
- exchange.initialise(_virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
@@ -82,7 +83,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testTopicExchangeMBean() throws Exception
{
TopicExchange exchange = new TopicExchange();
- exchange.initialise(_virtualHost,ExchangeDefaults.TOPIC_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost,ExchangeDefaults.TOPIC_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
@@ -97,7 +98,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testHeadersExchangeMBean() throws Exception
{
HeadersExchange exchange = new HeadersExchange();
- exchange.initialise(_virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
@@ -119,7 +120,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testHeadersExchangeMBeanMatchPropertyNoValue() throws Exception
{
HeadersExchange exchange = new HeadersExchange();
- exchange.initialise(_virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
@@ -137,7 +138,7 @@ public class ExchangeMBeanTest extends InternalBrokerBaseCase
public void testInvalidHeaderBindingMalformed() throws Exception
{
HeadersExchange exchange = new HeadersExchange();
- exchange.initialise(_virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost,ExchangeDefaults.HEADERS_EXCHANGE_NAME, false, 0, true);
ManagedObject managedObj = exchange.getManagedObject();
ManagedExchange mbean = (ManagedExchange)managedObj;
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/messages/MessageStoreMessagesTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/messages/MessageStoreMessagesTest.java
index cc032a0430..3377573b9d 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/messages/MessageStoreMessagesTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/messages/MessageStoreMessagesTest.java
@@ -29,12 +29,10 @@ public class MessageStoreMessagesTest extends AbstractTestMessages
{
public void testMessageStoreCreated()
{
- String name = "DerbyMessageStore";
-
- _logMessage = MessageStoreMessages.CREATED(name);
+ _logMessage = MessageStoreMessages.CREATED();
List<Object> log = performLog();
- String[] expected = {"Created :", name};
+ String[] expected = {"Created"};
validateLogMessage(log, "MST-1001", expected);
}
@@ -70,56 +68,4 @@ public class MessageStoreMessagesTest extends AbstractTestMessages
validateLogMessage(log, "MST-1004", expected);
}
-/*
- public void testMessageStoreRecoveryStart_withQueue()
- {
- String queueName = "testQueue";
-
- _logMessage = MessageStoreMessages.RECOVERY_START(queueName, true);
- List<Object> log = performLog();
-
- String[] expected = {"Recovery Start :", queueName};
-
- validateLogMessage(log, "MST-1004", expected);
- }
-
- public void testMessageStoreRecovered()
- {
- String queueName = "testQueue";
- Integer messasgeCount = 2000;
-
- _logMessage = MessageStoreMessages.MST_RECOVERED(messasgeCount, queueName);
- List<Object> log = performLog();
-
- // Here we use MessageFormat to ensure the messasgeCount of 2000 is
- // reformated for display as '2,000'
- String[] expected = {"Recovered ",
- MessageFormat.format("{0,number}", messasgeCount),
- "messages for queue", queueName};
-
- validateLogMessage(log, "MST-1005", expected);
- }
-
- public void testMessageStoreRecoveryComplete()
- {
- _logMessage = MessageStoreMessages.MST_RECOVERY_COMPLETE(null,false);
- List<Object> log = performLog();
-
- String[] expected = {"Recovery Complete"};
-
- validateLogMessage(log, "MST-1006", expected);
- }
-
- public void testMessageStoreRecoveryComplete_withQueue()
- {
- String queueName = "testQueue";
-
- _logMessage = MessageStoreMessages.MST_RECOVERY_COMPLETE(queueName, true);
- List<Object> log = performLog();
-
- String[] expected = {"Recovery Complete :", queueName};
-
- validateLogMessage(log, "MST-1006", expected);
- }
- */
}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubjectTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubjectTest.java
index 158fb667a9..c62b24c3b9 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubjectTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/logging/subjects/MessageStoreLogSubjectTest.java
@@ -37,13 +37,13 @@ public class MessageStoreLogSubjectTest extends AbstractTestLogSubject
_testVhost = ApplicationRegistry.getInstance().getVirtualHostRegistry().
getVirtualHost("test");
- _subject = new MessageStoreLogSubject(_testVhost, _testVhost.getMessageStore());
+ _subject = new MessageStoreLogSubject(_testVhost, _testVhost.getMessageStore().getClass().getSimpleName());
}
/**
* Validate that the logged Subject message is as expected:
* MESSAGE [Blank][vh(/test)/ms(MemoryMessageStore)] <Log Message>
- * @param message the message whos format needs validation
+ * @param message the message who's format needs validation
*/
@Override
protected void validateLogStatement(String message)
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java
index 71d5211470..fe9bcc57a6 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBeanTest.java
@@ -30,7 +30,7 @@ import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.SkeletonMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStore;
import org.apache.qpid.server.util.InternalBrokerBaseCase;
import org.apache.qpid.server.virtualhost.VirtualHost;
@@ -45,7 +45,7 @@ public class AMQProtocolSessionMBeanTest extends InternalBrokerBaseCase
/** Used for debugging. */
private static final Logger log = Logger.getLogger(AMQProtocolSessionMBeanTest.class);
- private MessageStore _messageStore = new SkeletonMessageStore();
+ private MessageStore _messageStore = new TestableMemoryMessageStore();
private AMQProtocolEngine _protocolSession;
private AMQChannel _channel;
private AMQProtocolSessionMBean _mbean;
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java
index db37cc0965..96c67941f9 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/InternalTestProtocolSession.java
@@ -34,6 +34,7 @@ import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.security.auth.sasl.UsernamePrincipal;
import org.apache.qpid.server.subscription.ClientDeliveryMethod;
import org.apache.qpid.server.subscription.Subscription;
+import org.apache.qpid.server.subscription.SubscriptionImpl;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.transport.TestNetworkConnection;
@@ -239,12 +240,12 @@ public class InternalTestProtocolSession extends AMQProtocolEngine implements Pr
_channelDelivers.put(_channelId, consumers);
}
- LinkedList<DeliveryPair> consumerDelivers = consumers.get(sub.getConsumerTag());
+ LinkedList<DeliveryPair> consumerDelivers = consumers.get(((SubscriptionImpl)sub).getConsumerTag());
if (consumerDelivers == null)
{
consumerDelivers = new LinkedList<DeliveryPair>();
- consumers.put(sub.getConsumerTag(), consumerDelivers);
+ consumers.put(((SubscriptionImpl)sub).getConsumerTag(), consumerDelivers);
}
consumerDelivers.add(new DeliveryPair(deliveryTag, (AMQMessage)entry.getMessage()));
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactoryTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactoryTest.java
index d8b5cd02cf..6081be8efd 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactoryTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/protocol/MultiVersionProtocolEngineFactoryTest.java
@@ -35,6 +35,7 @@ import java.util.Set;
public class MultiVersionProtocolEngineFactoryTest extends QpidTestCase
{
+
protected void setUp() throws Exception
{
super.setUp();
@@ -93,7 +94,20 @@ public class MultiVersionProtocolEngineFactoryTest extends QpidTestCase
(byte) 0,
(byte) 10
};
-
+
+
+ private static final byte[] AMQP_1_0_0_HEADER =
+ new byte[] {
+ (byte)'A',
+ (byte)'M',
+ (byte)'Q',
+ (byte)'P',
+ (byte) 0,
+ (byte) 1,
+ (byte) 0,
+ (byte) 0
+ };
+
private byte[] getAmqpHeader(final AmqpProtocolVersion version)
{
switch(version)
@@ -106,6 +120,8 @@ public class MultiVersionProtocolEngineFactoryTest extends QpidTestCase
return AMQP_0_9_1_HEADER;
case v0_10:
return AMQP_0_10_HEADER;
+ case v1_0_0:
+ return AMQP_1_0_0_HEADER;
default:
fail("unknown AMQP version, appropriate header must be added for new protocol version");
return null;
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueFactoryTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueFactoryTest.java
index 337ff194c3..e123a968a4 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueFactoryTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/AMQQueueFactoryTest.java
@@ -20,6 +20,8 @@
*/
package org.apache.qpid.server.queue;
+import java.util.UUID;
+
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.qpid.AMQException;
@@ -35,6 +37,7 @@ import org.apache.qpid.server.logging.actors.CurrentActor;
import org.apache.qpid.server.logging.actors.TestLogActor;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStoreFactory;
import org.apache.qpid.server.util.TestApplicationRegistry;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.test.utils.QpidTestCase;
@@ -53,7 +56,7 @@ public class AMQQueueFactoryTest extends QpidTestCase
XMLConfiguration configXml = new XMLConfiguration();
configXml.addProperty("virtualhosts.virtualhost(-1).name", getName());
- configXml.addProperty("virtualhosts.virtualhost(-1)."+getName()+".store.class", TestableMemoryMessageStore.class.getName());
+ configXml.addProperty("virtualhosts.virtualhost(-1)."+getName()+".store.factoryclass", TestableMemoryMessageStoreFactory.class.getName());
ServerConfiguration configuration = new ServerConfiguration(configXml);
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/AckTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/AckTest.java
index 273f0dc018..409b9fd92e 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/AckTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/AckTest.java
@@ -20,7 +20,6 @@
*/
package org.apache.qpid.server.queue;
-import org.apache.log4j.Logger;
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
@@ -37,7 +36,7 @@ import org.apache.qpid.server.protocol.AMQProtocolSession;
import org.apache.qpid.server.protocol.InternalTestProtocolSession;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.StoredMessage;
-import org.apache.qpid.server.store.TestMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStore;
import org.apache.qpid.server.subscription.Subscription;
import org.apache.qpid.server.subscription.SubscriptionFactoryImpl;
import org.apache.qpid.server.txn.AutoCommitTransaction;
@@ -53,13 +52,11 @@ import java.util.Set;
*/
public class AckTest extends InternalBrokerBaseCase
{
- private static final Logger _log = Logger.getLogger(AckTest.class);
-
private Subscription _subscription;
private AMQProtocolSession _protocolSession;
- private TestMemoryMessageStore _messageStore;
+ private TestableMemoryMessageStore _messageStore;
private AMQChannel _channel;
@@ -73,7 +70,7 @@ public class AckTest extends InternalBrokerBaseCase
{
super.setUp();
_virtualHost = ApplicationRegistry.getInstance().getVirtualHostRegistry().getVirtualHost("test");
- _messageStore = new TestMemoryMessageStore();
+ _messageStore = new TestableMemoryMessageStore();
_protocolSession = new InternalTestProtocolSession(_virtualHost);
_channel = new AMQChannel(_protocolSession,5, _messageStore /*dont need exchange registry*/);
@@ -180,7 +177,7 @@ public class AckTest extends InternalBrokerBaseCase
}
catch (InterruptedException e)
{
- e.printStackTrace(); //TODO.
+ Thread.currentThread().interrupt();
}
}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/MockStoredMessage.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/MockStoredMessage.java
index fba3851507..950d59bef5 100755
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/MockStoredMessage.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/MockStoredMessage.java
@@ -25,7 +25,7 @@ import org.apache.qpid.framing.ContentHeaderBody;
import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.framing.abstraction.MessagePublishInfo;
import org.apache.qpid.server.message.MessageMetaData;
-import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.StoreFuture;
import org.apache.qpid.server.store.StoredMessage;
import java.nio.ByteBuffer;
@@ -105,9 +105,9 @@ public class MockStoredMessage implements StoredMessage<MessageMetaData>
return buf;
}
- public MessageStore.StoreFuture flushToStore()
+ public StoreFuture flushToStore()
{
- return MessageStore.IMMEDIATE_FUTURE;
+ return StoreFuture.IMMEDIATE_FUTURE;
}
public void remove()
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/PriorityQueueListTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/PriorityQueueListTest.java
new file mode 100644
index 0000000000..e8c0470915
--- /dev/null
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/PriorityQueueListTest.java
@@ -0,0 +1,117 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.queue;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.qpid.server.message.AMQMessageHeader;
+import org.apache.qpid.server.message.MessageReference;
+import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class PriorityQueueListTest extends QpidTestCase
+{
+ private static final byte[] PRIORITIES = {4, 5, 5, 4};
+ PriorityQueueList _list = new PriorityQueueList(null, 10);
+
+ private QueueEntry _priority4message1;
+ private QueueEntry _priority4message2;
+ private QueueEntry _priority5message1;
+ private QueueEntry _priority5message2;
+
+ protected void setUp()
+ {
+ QueueEntry[] entries = new QueueEntry[PRIORITIES.length];
+
+ for (int i = 0; i < PRIORITIES.length; i++)
+ {
+ ServerMessage<?> message = mock(ServerMessage.class);
+ AMQMessageHeader header = mock(AMQMessageHeader.class);
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ MessageReference<ServerMessage> ref = mock(MessageReference.class);
+
+ when(message.getMessageHeader()).thenReturn(header);
+ when(message.newReference()).thenReturn(ref);
+ when(ref.getMessage()).thenReturn(message);
+ when(header.getPriority()).thenReturn(PRIORITIES[i]);
+
+ entries[i] = _list.add(message);
+ }
+
+ _priority4message1 = entries[0];
+ _priority4message2 = entries[3];
+ _priority5message1 = entries[1];
+ _priority5message2 = entries[2];
+ }
+
+ public void testPriorityQueueEntryCompareToItself()
+ {
+ //check messages compare to themselves properly
+ assertEquals("message should compare 'equal' to itself",
+ 0, _priority4message1.compareTo(_priority4message1));
+
+ assertEquals("message should compare 'equal' to itself",
+ 0, _priority5message2.compareTo(_priority5message2));
+ }
+
+ public void testPriorityQueueEntryCompareToSamePriority()
+ {
+ //check messages with the same priority are ordered properly
+ assertEquals("first message should be 'earlier' than second message of the same priority",
+ -1, _priority4message1.compareTo(_priority4message2));
+
+ assertEquals("first message should be 'earlier' than second message of the same priority",
+ -1, _priority5message1.compareTo(_priority5message2));
+
+ //and in reverse
+ assertEquals("second message should be 'later' than first message of the same priority",
+ 1, _priority4message2.compareTo(_priority4message1));
+
+ assertEquals("second message should be 'later' than first message of the same priority",
+ 1, _priority5message2.compareTo(_priority5message1));
+ }
+
+ public void testPriorityQueueEntryCompareToDifferentPriority()
+ {
+ //check messages with higher priority are ordered 'earlier' than those with lower priority
+ assertEquals("first message with priority 5 should be 'earlier' than first message of priority 4",
+ -1, _priority5message1.compareTo(_priority4message1));
+ assertEquals("first message with priority 5 should be 'earlier' than second message of priority 4",
+ -1, _priority5message1.compareTo(_priority4message2));
+
+ assertEquals("second message with priority 5 should be 'earlier' than first message of priority 4",
+ -1, _priority5message2.compareTo(_priority4message1));
+ assertEquals("second message with priority 5 should be 'earlier' than second message of priority 4",
+ -1, _priority5message2.compareTo(_priority4message2));
+
+ //and in reverse
+ assertEquals("first message with priority 4 should be 'later' than first message of priority 5",
+ 1, _priority4message1.compareTo(_priority5message1));
+ assertEquals("first message with priority 4 should be 'later' than second message of priority 5",
+ 1, _priority4message1.compareTo(_priority5message2));
+
+ assertEquals("second message with priority 4 should be 'later' than first message of priority 5",
+ 1, _priority4message2.compareTo(_priority5message1));
+ assertEquals("second message with priority 4 should be 'later' than second message of priority 5",
+ 1, _priority4message2.compareTo(_priority5message2));
+ }
+}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleAMQQueueTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleAMQQueueTest.java
index 79c744902d..52ad4a7c5b 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleAMQQueueTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleAMQQueueTest.java
@@ -37,11 +37,13 @@ import org.apache.qpid.server.exchange.DirectExchange;
import org.apache.qpid.server.message.AMQMessage;
import org.apache.qpid.server.message.MessageMetaData;
import org.apache.qpid.server.message.ServerMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.BaseQueue.PostEnqueueAction;
import org.apache.qpid.server.queue.SimpleAMQQueue.QueueEntryFilter;
import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.store.StoredMessage;
import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStoreFactory;
import org.apache.qpid.server.subscription.MockSubscription;
import org.apache.qpid.server.subscription.Subscription;
import org.apache.qpid.server.txn.AutoCommitTransaction;
@@ -61,7 +63,6 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
protected SimpleAMQQueue _queue;
protected VirtualHost _virtualHost;
- protected TestableMemoryMessageStore _store = new TestableMemoryMessageStore();
protected AMQShortString _qname = new AMQShortString("qname");
protected AMQShortString _owner = new AMQShortString("owner");
protected AMQShortString _routingKey = new AMQShortString("routing key");
@@ -106,7 +107,9 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
ApplicationRegistry applicationRegistry = (ApplicationRegistry)ApplicationRegistry.getInstance();
PropertiesConfiguration env = new PropertiesConfiguration();
- _virtualHost = new VirtualHostImpl(ApplicationRegistry.getInstance(), new VirtualHostConfiguration(getClass().getName(), env), _store);
+ final VirtualHostConfiguration vhostConfig = new VirtualHostConfiguration(getClass().getName(), env);
+ vhostConfig.setMessageStoreFactoryClass(TestableMemoryMessageStoreFactory.class.getName());
+ _virtualHost = new VirtualHostImpl(ApplicationRegistry.getInstance(), vhostConfig);
applicationRegistry.getVirtualHostRegistry().registerVirtualHost(_virtualHost);
_queue = (SimpleAMQQueue) AMQQueueFactory.createAMQQueueImpl(_qname, false, _owner, false, false, _virtualHost, _arguments);
@@ -135,7 +138,7 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
}
try {
- _queue = new SimpleAMQQueue(_qname, false, _owner, false, false,null, Collections.EMPTY_MAP);
+ _queue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), _qname, false, _owner, false,false, null, Collections.EMPTY_MAP);
assertNull("Queue was created", _queue);
}
catch (IllegalArgumentException e)
@@ -477,7 +480,7 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
public void testAutoDeleteQueue() throws Exception
{
_queue.stop();
- _queue = new SimpleAMQQueue(_qname, false, null, true, false, _virtualHost, Collections.EMPTY_MAP);
+ _queue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), _qname, false, null, true, false, _virtualHost, Collections.EMPTY_MAP);
_queue.setDeleteOnNoConsumers(true);
_queue.registerSubscription(_subscription, false);
AMQMessage message = createMessage(new Long(25));
@@ -634,11 +637,12 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
qs.add(_queue);
MessageMetaData metaData = msg.headersReceived(System.currentTimeMillis());
- StoredMessage handle = _store.addMessage(metaData);
+ TestableMemoryMessageStore store = (TestableMemoryMessageStore) _virtualHost.getMessageStore();
+ StoredMessage handle = store.addMessage(metaData);
msg.setStoredMessage(handle);
- ServerTransaction txn = new AutoCommitTransaction(_store);
+ ServerTransaction txn = new AutoCommitTransaction(store);
txn.enqueue(qs, msg, new ServerTransaction.Action()
{
@@ -653,7 +657,7 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
}, 0L);
// Check that it is enqueued
- AMQQueue data = _store.getMessages().get(1L);
+ AMQQueue data = store.getMessages().get(1L);
assertNull(data);
// Dequeue message
@@ -664,7 +668,7 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
_queue.dequeue(entry,null);
// Check that it is dequeued
- data = _store.getMessages().get(1L);
+ data = store.getMessages().get(1L);
assertNull(data);
}
@@ -688,8 +692,8 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
public void testProcessQueueWithUniqueSelectors() throws Exception
{
TestSimpleQueueEntryListFactory factory = new TestSimpleQueueEntryListFactory();
- SimpleAMQQueue testQueue = new SimpleAMQQueue("testQueue", false, "testOwner",false,
- false, _virtualHost, factory, null)
+ SimpleAMQQueue testQueue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), "testQueue", false,"testOwner",
+ false, false, _virtualHost, factory, null)
{
@Override
public void deliverAsync(Subscription sub)
@@ -1025,8 +1029,8 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
int dequeueMessageIndex = 1;
// create queue with overridden method deliverAsync
- SimpleAMQQueue testQueue = new SimpleAMQQueue(new AMQShortString("test"), false,
- new AMQShortString("testOwner"), false, false, _virtualHost, null)
+ SimpleAMQQueue testQueue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), new AMQShortString("test"),
+ false, new AMQShortString("testOwner"), false, false, _virtualHost, null)
{
@Override
public void deliverAsync(Subscription sub)
@@ -1096,8 +1100,8 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
public void testEqueueDequeuedEntry()
{
// create a queue where each even entry is considered a dequeued
- SimpleAMQQueue queue = new SimpleAMQQueue(new AMQShortString("test"), false, new AMQShortString("testOwner"),
- false, false, _virtualHost, new QueueEntryListFactory()
+ SimpleAMQQueue queue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), new AMQShortString("test"), false,
+ new AMQShortString("testOwner"), false, false, _virtualHost, new QueueEntryListFactory()
{
public QueueEntryList createQueueEntryList(AMQQueue queue)
{
@@ -1174,8 +1178,8 @@ public class SimpleAMQQueueTest extends InternalBrokerBaseCase
public void testActiveConsumerCount() throws Exception
{
- final SimpleAMQQueue queue = new SimpleAMQQueue(new AMQShortString("testActiveConsumerCount"), false, new AMQShortString("testOwner"),
- false, false, _virtualHost, new SimpleQueueEntryList.Factory(), null);
+ final SimpleAMQQueue queue = new SimpleAMQQueue(UUIDGenerator.generateUUID(), new AMQShortString("testActiveConsumerCount"), false,
+ new AMQShortString("testOwner"), false, false, _virtualHost, new SimpleQueueEntryList.Factory(), null);
//verify adding an active subscription increases the count
final MockSubscription subscription1 = new MockSubscription();
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java
index d8d78bbb84..ac18bbe687 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/queue/SimpleQueueEntryImplTest.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.server.queue;
import org.apache.qpid.AMQException;
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java
index ba0a715001..bef03057ec 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/security/auth/rmi/RMIPasswordAuthenticatorTest.java
@@ -22,13 +22,19 @@ package org.apache.qpid.server.security.auth.rmi;
import junit.framework.TestCase;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.qpid.server.configuration.ServerConfiguration;
import org.apache.qpid.server.configuration.plugins.ConfigurationPlugin;
+import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.security.auth.AuthenticationResult;
import org.apache.qpid.server.security.auth.AuthenticationResult.AuthenticationStatus;
import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
+import org.apache.qpid.server.util.TestApplicationRegistry;
import javax.management.remote.JMXPrincipal;
import javax.security.auth.Subject;
+import javax.security.auth.callback.CallbackHandler;
import javax.security.sasl.SaslException;
import javax.security.sasl.SaslServer;
import java.util.Collections;
@@ -47,7 +53,7 @@ public class RMIPasswordAuthenticatorTest extends TestCase
protected void setUp() throws Exception
{
_rmipa = new RMIPasswordAuthenticator();
-
+
_credentials = new String[] {USERNAME, PASSWORD};
}
@@ -114,8 +120,19 @@ public class RMIPasswordAuthenticatorTest extends TestCase
/**
* Tests case where authentication manager is not set.
*/
- public void testNullAuthenticationManager()
+ public void testNullAuthenticationManager() throws Exception
{
+ ServerConfiguration serverConfig = new ServerConfiguration(new XMLConfiguration());
+ TestApplicationRegistry reg = new TestApplicationRegistry(serverConfig)
+ {
+ @Override
+ protected AuthenticationManager createAuthenticationManager() throws ConfigurationException
+ {
+ return null;
+ }
+ };
+ ApplicationRegistry.initialise(reg);
+
try
{
_rmipa.authenticate(_credentials);
@@ -126,6 +143,10 @@ public class RMIPasswordAuthenticatorTest extends TestCase
assertEquals("Unexpected exception message",
RMIPasswordAuthenticator.UNABLE_TO_LOOKUP, se.getMessage());
}
+ finally
+ {
+ ApplicationRegistry.remove();
+ }
}
/**
@@ -254,6 +275,11 @@ public class RMIPasswordAuthenticatorTest extends TestCase
return new AuthenticationResult(AuthenticationStatus.CONTINUE);
}
}
+
+ public CallbackHandler getHandler(String mechanism)
+ {
+ return null;
+ }
};
}
}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java
new file mode 100644
index 0000000000..a1cbb2cbc8
--- /dev/null
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java
@@ -0,0 +1,377 @@
+package org.apache.qpid.server.store;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.times;
+
+import java.io.File;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.qpid.AMQStoreException;
+import org.apache.qpid.common.AMQPFilterTypes;
+import org.apache.qpid.framing.AMQShortString;
+import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
+import org.apache.qpid.server.exchange.Exchange;
+import org.apache.qpid.server.logging.SystemOutMessageLogger;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.actors.TestLogActor;
+import org.apache.qpid.server.logging.subjects.TestBlankSubject;
+import org.apache.qpid.server.message.EnqueableMessage;
+import org.apache.qpid.server.model.UUIDGenerator;
+import org.apache.qpid.server.queue.AMQQueue;
+import org.apache.qpid.server.queue.MockStoredMessage;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
+import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.BindingRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.ExchangeRecoveryHandler;
+import org.apache.qpid.server.store.ConfigurationRecoveryHandler.QueueRecoveryHandler;
+import org.apache.qpid.server.store.MessageStoreRecoveryHandler.StoredMessageRecoveryHandler;
+import org.apache.qpid.server.store.Transaction.Record;
+import org.apache.qpid.server.store.derby.DerbyMessageStoreFactory;
+import org.apache.qpid.test.utils.QpidTestCase;
+import org.apache.qpid.util.FileUtils;
+
+public class DurableConfigurationStoreTest extends QpidTestCase
+{
+ private static final String EXCHANGE_NAME = "exchangeName";
+ private String _storePath;
+ private String _storeName;
+ private MessageStore _store;
+ private Configuration _configuration;
+
+ private ConfigurationRecoveryHandler _recoveryHandler;
+ private QueueRecoveryHandler _queueRecoveryHandler;
+ private ExchangeRecoveryHandler _exchangeRecoveryHandler;
+ private BindingRecoveryHandler _bindingRecoveryHandler;
+ private ConfigurationRecoveryHandler.BrokerLinkRecoveryHandler _linkRecoveryHandler;
+ private MessageStoreRecoveryHandler _messageStoreRecoveryHandler;
+ private StoredMessageRecoveryHandler _storedMessageRecoveryHandler;
+ private TransactionLogRecoveryHandler _logRecoveryHandler;
+ private TransactionLogRecoveryHandler.QueueEntryRecoveryHandler _queueEntryRecoveryHandler;
+ private TransactionLogRecoveryHandler.DtxRecordRecoveryHandler _dtxRecordRecoveryHandler;
+
+ private Exchange _exchange = mock(Exchange.class);
+ private static final String ROUTING_KEY = "routingKey";
+ private static final String QUEUE_NAME = "queueName";
+ private FieldTable _bindingArgs;
+ private UUID _queueId;
+ private UUID _exchangeId;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+
+ _queueId = UUIDGenerator.generateUUID();
+ _exchangeId = UUIDGenerator.generateUUID();
+
+ _storeName = getName();
+ _storePath = TMP_FOLDER + "/" + _storeName;
+ FileUtils.delete(new File(_storePath), true);
+ setTestSystemProperty("QPID_WORK", TMP_FOLDER);
+ _configuration = mock(Configuration.class);
+ _recoveryHandler = mock(ConfigurationRecoveryHandler.class);
+ _queueRecoveryHandler = mock(QueueRecoveryHandler.class);
+ _exchangeRecoveryHandler = mock(ExchangeRecoveryHandler.class);
+ _bindingRecoveryHandler = mock(BindingRecoveryHandler.class);
+ _storedMessageRecoveryHandler = mock(StoredMessageRecoveryHandler.class);
+ _logRecoveryHandler = mock(TransactionLogRecoveryHandler.class);
+ _messageStoreRecoveryHandler = mock(MessageStoreRecoveryHandler.class);
+ _queueEntryRecoveryHandler = mock(TransactionLogRecoveryHandler.QueueEntryRecoveryHandler.class);
+ _dtxRecordRecoveryHandler = mock(TransactionLogRecoveryHandler.DtxRecordRecoveryHandler.class);
+
+ when(_messageStoreRecoveryHandler.begin()).thenReturn(_storedMessageRecoveryHandler);
+ when(_recoveryHandler.begin(isA(MessageStore.class))).thenReturn(_queueRecoveryHandler);
+ when(_queueRecoveryHandler.completeQueueRecovery()).thenReturn(_exchangeRecoveryHandler);
+ when(_exchangeRecoveryHandler.completeExchangeRecovery()).thenReturn(_bindingRecoveryHandler);
+ when(_bindingRecoveryHandler.completeBindingRecovery()).thenReturn(_linkRecoveryHandler);
+ when(_logRecoveryHandler.begin(any(MessageStore.class))).thenReturn(_queueEntryRecoveryHandler);
+ when(_queueEntryRecoveryHandler.completeQueueEntryRecovery()).thenReturn(_dtxRecordRecoveryHandler);
+ when(_exchange.getNameShortString()).thenReturn(AMQShortString.valueOf(EXCHANGE_NAME));
+ when(_exchange.getId()).thenReturn(_exchangeId);
+ when(_configuration.getString(eq(MessageStoreConstants.ENVIRONMENT_PATH_PROPERTY), anyString())).thenReturn(
+ _storePath);
+
+ _bindingArgs = new FieldTable();
+ AMQShortString argKey = AMQPFilterTypes.JMS_SELECTOR.getValue();
+ String argValue = "some selector expression";
+ _bindingArgs.put(argKey, argValue);
+
+ reopenStore();
+ }
+
+ public void tearDown() throws Exception
+ {
+ FileUtils.delete(new File(_storePath), true);
+ super.tearDown();
+ }
+
+ public void testCreateExchange() throws Exception
+ {
+ Exchange exchange = createTestExchange();
+ _store.createExchange(exchange);
+
+ reopenStore();
+ verify(_exchangeRecoveryHandler).exchange(_exchangeId, getName(), getName() + "Type", true);
+ }
+
+ public void testRemoveExchange() throws Exception
+ {
+ Exchange exchange = createTestExchange();
+ _store.createExchange(exchange);
+
+ _store.removeExchange(exchange);
+
+ reopenStore();
+ verify(_exchangeRecoveryHandler, never()).exchange(any(UUID.class), anyString(), anyString(), anyBoolean());
+ }
+
+ public void testBindQueue() throws Exception
+ {
+ AMQQueue queue = createTestQueue(QUEUE_NAME, "queueOwner", false);
+ Binding binding = new Binding(UUIDGenerator.generateUUID(), ROUTING_KEY, queue, _exchange,
+ FieldTable.convertToMap(_bindingArgs));
+ _store.bindQueue(binding);
+
+ reopenStore();
+
+ ByteBuffer argsAsBytes = ByteBuffer.wrap(_bindingArgs.getDataAsBytes());
+
+ verify(_bindingRecoveryHandler).binding(binding.getId(), _exchange.getId(), queue.getId(), ROUTING_KEY, argsAsBytes);
+ }
+
+ public void testUnbindQueue() throws Exception
+ {
+ AMQQueue queue = createTestQueue(QUEUE_NAME, "queueOwner", false);
+ Binding binding = new Binding(UUIDGenerator.generateUUID(), ROUTING_KEY, queue, _exchange,
+ FieldTable.convertToMap(_bindingArgs));
+ _store.bindQueue(binding);
+
+ _store.unbindQueue(binding);
+ reopenStore();
+
+ verify(_bindingRecoveryHandler, never()).binding(any(UUID.class), any(UUID.class), any(UUID.class), anyString(),
+ isA(ByteBuffer.class));
+ }
+
+ public void testCreateQueueAMQQueue() throws Exception
+ {
+ AMQQueue queue = createTestQueue(getName(), getName() + "Owner", true);
+ _store.createQueue(queue);
+
+ reopenStore();
+ verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", true, null);
+ }
+
+ public void testCreateQueueAMQQueueFieldTable() throws Exception
+ {
+ AMQQueue queue = createTestQueue(getName(), getName() + "Owner", true);
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put("x-qpid-dlq-enabled", Boolean.TRUE);
+ attributes.put("x-qpid-maximum-delivery-count", new Integer(10));
+
+ FieldTable arguments = FieldTable.convertToFieldTable(attributes);
+ _store.createQueue(queue, arguments);
+
+ reopenStore();
+ verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", true, arguments);
+ }
+
+ public void testUpdateQueue() throws Exception
+ {
+ // create queue
+ AMQQueue queue = createTestQueue(getName(), getName() + "Owner", true);
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put("x-qpid-dlq-enabled", Boolean.TRUE);
+ attributes.put("x-qpid-maximum-delivery-count", new Integer(10));
+ FieldTable arguments = FieldTable.convertToFieldTable(attributes);
+ _store.createQueue(queue, arguments);
+
+ // update the queue to have exclusive=false
+ queue = createTestQueue(getName(), getName() + "Owner", false);
+ _store.updateQueue(queue);
+
+ reopenStore();
+ verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", false, arguments);
+ }
+
+ public void testRemoveQueue() throws Exception
+ {
+ // create queue
+ AMQQueue queue = createTestQueue(getName(), getName() + "Owner", true);
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put("x-qpid-dlq-enabled", Boolean.TRUE);
+ attributes.put("x-qpid-maximum-delivery-count", new Integer(10));
+ FieldTable arguments = FieldTable.convertToFieldTable(attributes);
+ _store.createQueue(queue, arguments);
+
+ // remove queue
+ _store.removeQueue(queue);
+ reopenStore();
+ verify(_queueRecoveryHandler, never()).queue(any(UUID.class), anyString(), anyString(), anyBoolean(),
+ any(FieldTable.class));
+ }
+
+ private AMQQueue createTestQueue(String queueName, String queueOwner, boolean exclusive) throws AMQStoreException
+ {
+ AMQQueue queue = mock(AMQQueue.class);
+ when(queue.getName()).thenReturn(queueName);
+ when(queue.getNameShortString()).thenReturn(AMQShortString.valueOf(queueName));
+ when(queue.getOwner()).thenReturn(AMQShortString.valueOf(queueOwner));
+ when(queue.isExclusive()).thenReturn(exclusive);
+ when(queue.getId()).thenReturn(_queueId);
+ return queue;
+ }
+
+ private Exchange createTestExchange()
+ {
+ Exchange exchange = mock(Exchange.class);
+ when(exchange.getNameShortString()).thenReturn(AMQShortString.valueOf(getName()));
+ when(exchange.getName()).thenReturn(getName());
+ when(exchange.getTypeShortString()).thenReturn(AMQShortString.valueOf(getName() + "Type"));
+ when(exchange.isAutoDelete()).thenReturn(true);
+ when(exchange.getId()).thenReturn(_exchangeId);
+ return exchange;
+ }
+
+ private void reopenStore() throws Exception
+ {
+ if (_store != null)
+ {
+ _store.close();
+ }
+ _store = createStore();
+
+ _store.configureConfigStore(_storeName, _recoveryHandler, _configuration);
+ _store.configureMessageStore(_storeName, _messageStoreRecoveryHandler, _logRecoveryHandler, _configuration);
+ _store.activate();
+ }
+
+ protected MessageStore createStore() throws Exception
+ {
+ String storeFactoryClass = System.getProperty(MS_FACTORY_CLASS_NAME_KEY);
+ if (storeFactoryClass == null)
+ {
+ storeFactoryClass = DerbyMessageStoreFactory.class.getName();
+ }
+ CurrentActor.set(new TestLogActor(new SystemOutMessageLogger()));
+ MessageStoreFactory factory = (MessageStoreFactory) Class.forName(storeFactoryClass).newInstance();
+ return factory.createMessageStore();
+ }
+
+ public void testRecordXid() throws Exception
+ {
+ Record enqueueRecord = getTestRecord(1);
+ Record dequeueRecord = getTestRecord(2);
+ Record[] enqueues = { enqueueRecord };
+ Record[] dequeues = { dequeueRecord };
+ byte[] globalId = new byte[] { 1 };
+ byte[] branchId = new byte[] { 2 };
+
+ Transaction transaction = _store.newTransaction();
+ transaction.recordXid(1l, globalId, branchId, enqueues, dequeues);
+ transaction.commitTran();
+ reopenStore();
+ verify(_dtxRecordRecoveryHandler).dtxRecord(1l, globalId, branchId, enqueues, dequeues);
+
+ transaction = _store.newTransaction();
+ transaction.removeXid(1l, globalId, branchId);
+ transaction.commitTran();
+
+ reopenStore();
+ verify(_dtxRecordRecoveryHandler, times(1)).dtxRecord(1l, globalId, branchId, enqueues, dequeues);
+ }
+
+ private Record getTestRecord(long messageNumber)
+ {
+ UUID queueId1 = UUIDGenerator.generateUUID();
+ TransactionLogResource queue1 = mock(TransactionLogResource.class);
+ when(queue1.getId()).thenReturn(queueId1);
+ EnqueableMessage message1 = mock(EnqueableMessage.class);
+ when(message1.isPersistent()).thenReturn(true);
+ when(message1.getMessageNumber()).thenReturn(messageNumber);
+ when(message1.getStoredMessage()).thenReturn(new MockStoredMessage(messageNumber));
+ Record enqueueRecord = new TestRecord(queue1, message1);
+ return enqueueRecord;
+ }
+
+ private static class TestRecord implements Record
+ {
+ private TransactionLogResource _queue;
+ private EnqueableMessage _message;
+
+ public TestRecord(TransactionLogResource queue, EnqueableMessage message)
+ {
+ super();
+ _queue = queue;
+ _message = message;
+ }
+
+ @Override
+ public TransactionLogResource getQueue()
+ {
+ return _queue;
+ }
+
+ @Override
+ public EnqueableMessage getMessage()
+ {
+ return _message;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((_message == null) ? 0 : new Long(_message.getMessageNumber()).hashCode());
+ result = prime * result + ((_queue == null) ? 0 : _queue.getId().hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if (!(obj instanceof Record))
+ {
+ return false;
+ }
+ Record other = (Record) obj;
+ if (_message == null && other.getMessage() != null)
+ {
+ return false;
+ }
+ if (_queue == null && other.getQueue() != null)
+ {
+ return false;
+ }
+ if (_message.getMessageNumber() != other.getMessage().getMessageNumber())
+ {
+ return false;
+ }
+ return _queue.getId().equals(other.getQueue().getId());
+ }
+
+ }
+}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/EventManagerTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/EventManagerTest.java
new file mode 100644
index 0000000000..2be79c5839
--- /dev/null
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/EventManagerTest.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.apache.qpid.server.store.Event.AFTER_ACTIVATE;
+import static org.apache.qpid.server.store.Event.BEFORE_ACTIVATE;
+import junit.framework.TestCase;
+
+public class EventManagerTest extends TestCase
+{
+ private EventManager _eventManager = new EventManager();
+ private EventListener _mockListener = mock(EventListener.class);
+
+ public void testEventListenerFires()
+ {
+ _eventManager.addEventListener(_mockListener, BEFORE_ACTIVATE);
+ _eventManager.notifyEvent(BEFORE_ACTIVATE);
+ verify(_mockListener).event(BEFORE_ACTIVATE);
+ }
+
+ public void testEventListenerDoesntFire()
+ {
+ _eventManager.addEventListener(_mockListener, BEFORE_ACTIVATE);
+ _eventManager.notifyEvent(AFTER_ACTIVATE);
+ verifyZeroInteractions(_mockListener);
+ }
+
+ public void testEventListenerFiresMulitpleTimes()
+ {
+ _eventManager.addEventListener(_mockListener, BEFORE_ACTIVATE);
+ _eventManager.addEventListener(_mockListener, AFTER_ACTIVATE);
+
+ _eventManager.notifyEvent(BEFORE_ACTIVATE);
+ verify(_mockListener).event(BEFORE_ACTIVATE);
+
+ _eventManager.notifyEvent(AFTER_ACTIVATE);
+ verify(_mockListener).event(AFTER_ACTIVATE);
+ }
+
+ public void testMultipleListenersFireForSameEvent()
+ {
+ final EventListener mockListener1 = mock(EventListener.class);
+ final EventListener mockListener2 = mock(EventListener.class);
+
+ _eventManager.addEventListener(mockListener1, BEFORE_ACTIVATE);
+ _eventManager.addEventListener(mockListener2, BEFORE_ACTIVATE);
+ _eventManager.notifyEvent(BEFORE_ACTIVATE);
+
+ verify(mockListener1).event(BEFORE_ACTIVATE);
+ verify(mockListener2).event(BEFORE_ACTIVATE);
+ }
+}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTest.java
index d49f0586ba..3fb0776083 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreTest.java
@@ -39,6 +39,7 @@ import org.apache.qpid.server.exchange.ExchangeType;
import org.apache.qpid.server.exchange.TopicExchange;
import org.apache.qpid.server.message.AMQMessage;
import org.apache.qpid.server.message.MessageMetaData;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQPriorityQueue;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
@@ -58,6 +59,7 @@ import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
/**
* This tests the MessageStores by using the available interfaces.
@@ -101,7 +103,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
String storePath = System.getProperty("QPID_WORK") + "/" + getName();
_config = new PropertiesConfiguration();
- _config.addProperty("store.class", getTestProfileMessageStoreClassName());
+ _config.addProperty("store.factoryclass", getTestProfileMessageStoreFactoryClassName());
_config.addProperty("store.environment-path", storePath);
cleanup(new File(storePath));
@@ -298,7 +300,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
1, queueRegistry.getQueues().size());
//test that removing the queue means it is not recovered next time
- getVirtualHost().getDurableConfigurationStore().removeQueue(queueRegistry.getQueue(durableQueueName));
+ getVirtualHost().getMessageStore().removeQueue(queueRegistry.getQueue(durableQueueName));
reloadVirtualHost();
@@ -351,7 +353,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
origExchangeCount + 1, exchangeRegistry.getExchangeNames().size());
//test that removing the exchange means it is not recovered next time
- getVirtualHost().getDurableConfigurationStore().removeExchange(exchangeRegistry.getExchange(directExchangeName));
+ getVirtualHost().getMessageStore().removeExchange(exchangeRegistry.getExchange(directExchangeName));
reloadVirtualHost();
@@ -707,7 +709,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
if (queue.isDurable() && !queue.isAutoDelete())
{
- getVirtualHost().getDurableConfigurationStore().createQueue(queue, queueArguments);
+ getVirtualHost().getMessageStore().createQueue(queue, queueArguments);
}
}
catch (AMQException e)
@@ -739,7 +741,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
try
{
- exchange = type.newInstance(getVirtualHost(), name, durable, 0, false);
+ exchange = type.newInstance(UUIDGenerator.generateUUID(), getVirtualHost(), name, durable, 0, false);
}
catch (AMQException e)
{
@@ -751,7 +753,7 @@ public class MessageStoreTest extends InternalBrokerBaseCase
getVirtualHost().getExchangeRegistry().registerExchange(exchange);
if (durable)
{
- getVirtualHost().getDurableConfigurationStore().createExchange(exchange);
+ getVirtualHost().getMessageStore().createExchange(exchange);
}
}
catch (AMQException e)
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/OperationalLoggingListenerTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/OperationalLoggingListenerTest.java
new file mode 100644
index 0000000000..42746f9119
--- /dev/null
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/OperationalLoggingListenerTest.java
@@ -0,0 +1,181 @@
+package org.apache.qpid.server.store;
+
+import java.util.ArrayList;
+import java.util.List;
+import junit.framework.TestCase;
+import org.apache.qpid.server.logging.LogActor;
+import org.apache.qpid.server.logging.LogMessage;
+import org.apache.qpid.server.logging.LogSubject;
+import org.apache.qpid.server.logging.RootMessageLogger;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
+import org.apache.qpid.server.logging.messages.MessageStoreMessages;
+import org.apache.qpid.server.logging.messages.TransactionLogMessages;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+public class OperationalLoggingListenerTest extends TestCase
+{
+
+
+ public static final String STORE_LOCATION = "The moon!";
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ }
+
+ public void testOperationalLoggingWithStoreLocation() throws Exception
+ {
+ TestMessageStore messageStore = new TestMessageStore();
+ LogSubject logSubject = LOG_SUBJECT;
+
+ OperationalLoggingListener.listen(messageStore, logSubject);
+
+ performTests(messageStore, true);
+
+ }
+
+ public void testOperationalLogging() throws Exception
+ {
+ TestMessageStore messageStore = new TestMessageStore();
+ LogSubject logSubject = LOG_SUBJECT;
+
+ OperationalLoggingListener.listen(messageStore, logSubject);
+
+ performTests(messageStore, false);
+ }
+
+ private void performTests(TestMessageStore messageStore, boolean setStoreLocation)
+ {
+ final List<LogMessage> messages = new ArrayList<LogMessage>();
+
+ CurrentActor.set(new TestActor(messages));
+
+ if(setStoreLocation)
+ {
+ messageStore.setStoreLocation(STORE_LOCATION);
+ }
+
+
+ messageStore.attainState(State.CONFIGURING);
+ assertEquals("Unexpected number of operational log messages on configuring", 1, messages.size());
+ assertEquals(messages.remove(0).toString(), ConfigStoreMessages.CREATED().toString());
+
+ messageStore.attainState(State.CONFIGURED);
+ assertEquals("Unexpected number of operational log messages on CONFIGURED", setStoreLocation ? 3 : 2, messages.size());
+ assertEquals(messages.remove(0).toString(), MessageStoreMessages.CREATED().toString());
+ assertEquals(messages.remove(0).toString(), TransactionLogMessages.CREATED().toString());
+ if(setStoreLocation)
+ {
+ assertEquals(messages.remove(0).toString(), MessageStoreMessages.STORE_LOCATION(STORE_LOCATION).toString());
+ }
+
+ messageStore.attainState(State.RECOVERING);
+ assertEquals("Unexpected number of operational log messages on RECOVERING", 1, messages.size());
+ assertEquals(messages.remove(0).toString(), MessageStoreMessages.RECOVERY_START().toString());
+
+
+ messageStore.attainState(State.ACTIVE);
+ assertEquals("Unexpected number of operational log messages on ACTIVE", 1, messages.size());
+ assertEquals(messages.remove(0).toString(), MessageStoreMessages.RECOVERY_COMPLETE().toString());
+
+ messageStore.attainState(State.CLOSING);
+ assertEquals("Unexpected number of operational log messages on CLOSING", 0, messages.size());
+
+ messageStore.attainState(State.CLOSED);
+ assertEquals("Unexpected number of operational log messages on CLOSED", 1, messages.size());
+ assertEquals(messages.remove(0).toString(), MessageStoreMessages.CLOSED().toString());
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ super.tearDown();
+ CurrentActor.remove();
+ }
+
+
+ private static final LogSubject LOG_SUBJECT = new LogSubject()
+ {
+ public String toLogString()
+ {
+ return "";
+ }
+ };
+
+ private static final class TestMessageStore extends NullMessageStore
+ {
+
+ private final EventManager _eventManager = new EventManager();
+ private final StateManager _stateManager = new StateManager(_eventManager);
+ private String _storeLocation;
+
+ public void attainState(State state)
+ {
+ _stateManager.attainState(state);
+ }
+
+ @Override
+ public String getStoreLocation()
+ {
+ return _storeLocation;
+ }
+
+ public void setStoreLocation(String storeLocation)
+ {
+ _storeLocation = storeLocation;
+ }
+
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
+ {
+ _eventManager.addEventListener(eventListener, events);
+ }
+ }
+
+ private static class TestActor implements LogActor
+ {
+ private final List<LogMessage> _messages;
+
+ public TestActor(List<LogMessage> messages)
+ {
+ _messages = messages;
+ }
+
+ public void message(LogSubject subject, LogMessage message)
+ {
+ _messages.add(message);
+ }
+
+ public void message(LogMessage message)
+ {
+ _messages.add(message);
+ }
+
+ public RootMessageLogger getRootMessageLogger()
+ {
+ return null;
+ }
+
+ public String getLogMessage()
+ {
+ return null;
+ }
+ }
+}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/ReferenceCountingTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/ReferenceCountingTest.java
index 2ffa157ca8..4aa023a25c 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/ReferenceCountingTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/ReferenceCountingTest.java
@@ -34,12 +34,12 @@ import org.apache.qpid.test.utils.QpidTestCase;
*/
public class ReferenceCountingTest extends QpidTestCase
{
- private TestMemoryMessageStore _store;
+ private TestableMemoryMessageStore _store;
protected void setUp() throws Exception
{
- _store = new TestMemoryMessageStore();
+ _store = new TestableMemoryMessageStore();
}
/**
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/SkeletonMessageStore.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/SkeletonMessageStore.java
deleted file mode 100644
index 09d865cb05..0000000000
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/SkeletonMessageStore.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store;
-
-import org.apache.commons.configuration.Configuration;
-
-import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.framing.FieldTable;
-import org.apache.qpid.server.exchange.Exchange;
-import org.apache.qpid.server.logging.LogSubject;
-import org.apache.qpid.server.message.EnqueableMessage;
-import org.apache.qpid.server.queue.AMQQueue;
-
-/**
- * A message store that does nothing. Designed to be used in tests that do not want to use any message store
- * functionality.
- */
-public class SkeletonMessageStore implements MessageStore
-{
- public void configureConfigStore(String name,
- ConfigurationRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
- {
- }
-
- public void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
- {
- }
-
- public void close() throws Exception
- {
- }
-
- public <M extends StorableMessageMetaData> StoredMessage<M> addMessage(M metaData)
- {
- return null;
- }
-
-
- public void createExchange(Exchange exchange) throws AMQStoreException
- {
-
- }
-
- public void removeExchange(Exchange exchange) throws AMQStoreException
- {
-
- }
-
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
-
- }
-
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
- {
-
- }
-
- public void createQueue(AMQQueue queue) throws AMQStoreException
- {
- }
-
- public void createQueue(AMQQueue queue, FieldTable arguments) throws AMQStoreException
- {
- }
-
- public boolean isPersistent()
- {
- return false;
- }
-
- public void removeQueue(final AMQQueue queue) throws AMQStoreException
- {
-
- }
-
- public void configureTransactionLog(String name,
- TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration,
- LogSubject logSubject) throws Exception
- {
-
- }
-
- public Transaction newTransaction()
- {
- return new Transaction()
- {
-
- public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
-
- }
-
- public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
- {
-
- }
-
- public void commitTran() throws AMQStoreException
- {
-
- }
-
- public StoreFuture commitTranAsync() throws AMQStoreException
- {
- return new StoreFuture()
- {
- public boolean isComplete()
- {
- return true;
- }
-
- public void waitForCompletion()
- {
-
- }
- };
- }
-
- public void abortTran() throws AMQStoreException
- {
-
- }
-
- public void removeXid(long format, byte[] globalId, byte[] branchId)
- {
- }
-
- public void recordXid(long format, byte[] globalId, byte[] branchId, Record[] enqueues, Record[] dequeues)
- {
- }
- };
- }
-
- public void updateQueue(AMQQueue queue) throws AMQStoreException
- {
-
- }
-
-}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/StateManagerTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/StateManagerTest.java
new file mode 100644
index 0000000000..97c88ca1d3
--- /dev/null
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/StateManagerTest.java
@@ -0,0 +1,195 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+
+import java.util.EnumSet;
+import junit.framework.TestCase;
+
+public class StateManagerTest extends TestCase implements EventListener
+{
+
+ private StateManager _manager;
+ private Event _event;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _manager = new StateManager(this);
+ }
+
+ public void testInitialState()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+ }
+
+ public void testStateTransitionAllowed()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+
+ _manager.stateTransition(State.INITIAL, State.CONFIGURING);
+ assertEquals(State.CONFIGURING, _manager.getState());
+ }
+
+ public void testStateTransitionDisallowed()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+
+ try
+ {
+ _manager.stateTransition(State.ACTIVE, State.CLOSING);
+ fail("Exception not thrown");
+ }
+ catch (IllegalStateException e)
+ {
+ // PASS
+ }
+ assertEquals(State.INITIAL, _manager.getState());
+ }
+
+ public void testIsInState()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+ assertFalse(_manager.isInState(State.ACTIVE));
+ assertTrue(_manager.isInState(State.INITIAL));
+ }
+
+ public void testIsNotInState()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+ assertTrue(_manager.isNotInState(State.ACTIVE));
+ assertFalse(_manager.isNotInState(State.INITIAL));
+ }
+
+ public void testCheckInState()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+
+ try
+ {
+ _manager.checkInState(State.ACTIVE);
+ fail("Exception not thrown");
+ }
+ catch (IllegalStateException e)
+ {
+ // PASS
+ }
+ assertEquals(State.INITIAL, _manager.getState());
+ }
+
+ public void testValidStateTransitions()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+ performValidTransition(StateManager.CONFIGURE);
+ performValidTransition(StateManager.CONFIGURE_COMPLETE);
+ performValidTransition(StateManager.RECOVER);
+ performValidTransition(StateManager.ACTIVATE);
+ performValidTransition(StateManager.QUIESCE);
+ performValidTransition(StateManager.QUIESCE_COMPLETE);
+ performValidTransition(StateManager.RESTART);
+ performValidTransition(StateManager.ACTIVATE);
+ performValidTransition(StateManager.CLOSE_ACTIVE);
+ performValidTransition(StateManager.CLOSE_COMPLETE);
+
+ _manager = new StateManager(this);
+ performValidTransition(StateManager.CONFIGURE);
+ performValidTransition(StateManager.CONFIGURE_COMPLETE);
+ performValidTransition(StateManager.RECOVER);
+ performValidTransition(StateManager.ACTIVATE);
+ performValidTransition(StateManager.QUIESCE);
+ performValidTransition(StateManager.QUIESCE_COMPLETE);
+ performValidTransition(StateManager.CLOSE_QUIESCED);
+ performValidTransition(StateManager.CLOSE_COMPLETE);
+ }
+
+ private void performValidTransition(StateManager.Transition transition)
+ {
+ _manager.attainState(transition.getEndState());
+ assertEquals("Unexpected end state", transition.getEndState(), _manager.getState());
+ assertEquals("Unexpected event", transition.getEvent(), _event);
+ _event = null;
+ }
+
+ public void testInvalidStateTransitions()
+ {
+ assertEquals(State.INITIAL, _manager.getState());
+
+
+ performInvalidTransitions(StateManager.CONFIGURE, State.CONFIGURED);
+ performInvalidTransitions(StateManager.CONFIGURE_COMPLETE, State.RECOVERING);
+ performInvalidTransitions(StateManager.RECOVER, State.ACTIVE);
+ performInvalidTransitions(StateManager.ACTIVATE, State.QUIESCING, State.CLOSING);
+ performInvalidTransitions(StateManager.QUIESCE, State.QUIESCED);
+ performInvalidTransitions(StateManager.QUIESCE_COMPLETE, State.RECOVERING, State.CLOSING);
+ performInvalidTransitions(StateManager.CLOSE_QUIESCED, State.CLOSED);
+ performInvalidTransitions(StateManager.CLOSE_COMPLETE);
+
+
+
+
+ }
+
+ private void performInvalidTransitions(StateManager.Transition preTransition, State... validTransitions)
+ {
+ if(preTransition != null)
+ {
+ performValidTransition(preTransition);
+ }
+
+ EnumSet<State> nextStates = EnumSet.allOf(State.class);
+
+ if(validTransitions != null)
+ {
+ for(State state: validTransitions)
+ {
+ nextStates.remove(state);
+ }
+ }
+
+ for(State nextState : nextStates)
+ {
+ performInvalidStateTransition(nextState);
+ }
+
+
+ }
+
+ private void performInvalidStateTransition(State state)
+ {
+ try
+ {
+ _event = null;
+ State startState = _manager.getState();
+ _manager.attainState(state);
+ fail("Invalid state transition performed: " + startState + " to " + state);
+ }
+ catch(IllegalStateException e)
+ {
+ // pass
+ }
+ assertNull("No event should have be fired", _event);
+ }
+
+ public void event(Event event)
+ {
+ _event = event;
+ }
+}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStore.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStore.java
deleted file mode 100644
index 8a261b3b86..0000000000
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestMemoryMessageStore.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.store;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Adds some extra methods to the memory message store for testing purposes.
- */
-public class TestMemoryMessageStore extends MemoryMessageStore
-{
- private AtomicInteger _messageCount = new AtomicInteger(0);
-
-
- public TestMemoryMessageStore()
- {
- }
-
- @Override
- public StoredMessage addMessage(StorableMessageMetaData metaData)
- {
- return new TestableStoredMessage(super.addMessage(metaData));
- }
-
- public int getMessageCount()
- {
- return _messageCount.get();
- }
-
- private class TestableStoredMessage implements StoredMessage
- {
- private final StoredMessage _storedMessage;
-
- public TestableStoredMessage(StoredMessage storedMessage)
- {
- _messageCount.incrementAndGet();
- _storedMessage = storedMessage;
- }
-
- public StorableMessageMetaData getMetaData()
- {
- return _storedMessage.getMetaData();
- }
-
- public long getMessageNumber()
- {
- return _storedMessage.getMessageNumber();
- }
-
- public void addContent(int offsetInMessage, ByteBuffer src)
- {
- _storedMessage.addContent(offsetInMessage, src);
- }
-
- public int getContent(int offsetInMessage, ByteBuffer dst)
- {
- return _storedMessage.getContent(offsetInMessage, dst);
- }
-
-
- public ByteBuffer getContent(int offsetInMessage, int size)
- {
- return _storedMessage.getContent(offsetInMessage, size);
- }
-
- public StoreFuture flushToStore()
- {
- return _storedMessage.flushToStore();
- }
-
- public void remove()
- {
- _storedMessage.remove();
- _messageCount.decrementAndGet();
- }
-
- }
-
-}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStore.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStore.java
index 104e06d29a..210408f490 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStore.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStore.java
@@ -26,6 +26,7 @@ import org.apache.qpid.server.queue.AMQQueue;
import java.nio.ByteBuffer;
import java.util.HashMap;
+import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -33,26 +34,8 @@ import java.util.concurrent.atomic.AtomicInteger;
*/
public class TestableMemoryMessageStore extends MemoryMessageStore
{
-
- private MemoryMessageStore _mms = null;
- private HashMap<Long, AMQQueue> _messages = new HashMap<Long, AMQQueue>();
- private AtomicInteger _messageCount = new AtomicInteger(0);
-
- public TestableMemoryMessageStore(MemoryMessageStore mms)
- {
- _mms = mms;
- }
-
- public TestableMemoryMessageStore()
- {
-
- }
-
- @Override
- public void close() throws Exception
- {
- // Not required to do anything
- }
+ private final Map<Long, AMQQueue> _messages = new HashMap<Long, AMQQueue>();
+ private final AtomicInteger _messageCount = new AtomicInteger(0);
@Override
public StoredMessage addMessage(StorableMessageMetaData metaData)
@@ -65,36 +48,34 @@ public class TestableMemoryMessageStore extends MemoryMessageStore
return _messageCount.get();
}
+ public Map<Long, AMQQueue> getMessages()
+ {
+ return _messages;
+ }
+
private class TestableTransaction implements Transaction
{
+ @Override
public void enqueueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
{
getMessages().put(message.getMessageNumber(), (AMQQueue)queue);
}
+ @Override
public void dequeueMessage(TransactionLogResource queue, EnqueableMessage message) throws AMQStoreException
{
getMessages().remove(message.getMessageNumber());
}
+ @Override
public void commitTran() throws AMQStoreException
{
}
+ @Override
public StoreFuture commitTranAsync() throws AMQStoreException
{
- return new StoreFuture()
- {
- public boolean isComplete()
- {
- return true;
- }
-
- public void waitForCompletion()
- {
-
- }
- };
+ return StoreFuture.IMMEDIATE_FUTURE;
}
public void abortTran() throws AMQStoreException
@@ -117,10 +98,6 @@ public class TestableMemoryMessageStore extends MemoryMessageStore
return new TestableTransaction();
}
- public HashMap<Long, AMQQueue> getMessages()
- {
- return _messages;
- }
private class TestableStoredMessage implements StoredMessage
{
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStoreFactory.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStoreFactory.java
new file mode 100644
index 0000000000..44070f22ad
--- /dev/null
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/store/TestableMemoryMessageStoreFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public class TestableMemoryMessageStoreFactory implements MessageStoreFactory
+{
+
+ @Override
+ public MessageStore createMessageStore()
+ {
+ return new TestableMemoryMessageStore();
+ }
+
+ @Override
+ public String getStoreClassName()
+ {
+ return TestableMemoryMessageStore.class.getSimpleName();
+ }
+
+}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/subscription/MockSubscription.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/subscription/MockSubscription.java
index 1d6ccfbbc2..5ba9c0c015 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/subscription/MockSubscription.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/subscription/MockSubscription.java
@@ -277,6 +277,10 @@ public class MockSubscription implements Subscription
return false;
}
+ public void queueEmpty() throws AMQException
+ {
+ }
+
public void setActive(final boolean isActive)
{
_isActive = isActive;
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/txn/MockStoreTransaction.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/txn/MockStoreTransaction.java
index 801549e561..af49238998 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/txn/MockStoreTransaction.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/txn/MockStoreTransaction.java
@@ -20,19 +20,13 @@
*/
package org.apache.qpid.server.txn;
-import org.apache.commons.configuration.Configuration;
import org.apache.commons.lang.NotImplementedException;
-
import org.apache.qpid.AMQStoreException;
-import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.message.EnqueableMessage;
import org.apache.qpid.server.store.MessageStore;
-import org.apache.qpid.server.store.MessageStore.StoreFuture;
-import org.apache.qpid.server.store.MessageStore.Transaction;
-import org.apache.qpid.server.store.MessageStoreRecoveryHandler;
-import org.apache.qpid.server.store.StorableMessageMetaData;
-import org.apache.qpid.server.store.StoredMessage;
-import org.apache.qpid.server.store.TransactionLogRecoveryHandler;
+import org.apache.qpid.server.store.NullMessageStore;
+import org.apache.qpid.server.store.StoreFuture;
+import org.apache.qpid.server.store.Transaction;
import org.apache.qpid.server.store.TransactionLogResource;
/**
@@ -122,42 +116,14 @@ class MockStoreTransaction implements Transaction
public static MessageStore createTestTransactionLog(final MockStoreTransaction storeTransaction)
{
- return new MessageStore()
+ return new NullMessageStore()
{
- public void configureMessageStore(final String name,
- final MessageStoreRecoveryHandler recoveryHandler,
- final Configuration config,
- final LogSubject logSubject) throws Exception
- {
- //TODO.
- }
-
- public void close() throws Exception
- {
- //TODO.
- }
-
- public <T extends StorableMessageMetaData> StoredMessage<T> addMessage(final T metaData)
- {
- return null; //TODO.
- }
-
- public boolean isPersistent()
- {
- return false; //TODO.
- }
-
- public void configureTransactionLog(String name, TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration, LogSubject logSubject) throws Exception
- {
- }
-
+ @Override
public Transaction newTransaction()
{
storeTransaction.setState(TransactionState.STARTED);
return storeTransaction;
}
-
- };
+ };
}
} \ No newline at end of file
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/util/InternalBrokerBaseCase.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/util/InternalBrokerBaseCase.java
index 9df0aec545..8a34e92985 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/util/InternalBrokerBaseCase.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/util/InternalBrokerBaseCase.java
@@ -20,6 +20,8 @@
*/
package org.apache.qpid.server.util;
+import java.util.UUID;
+
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.qpid.AMQException;
@@ -43,6 +45,7 @@ import org.apache.qpid.server.registry.ApplicationRegistry;
import org.apache.qpid.server.registry.IApplicationRegistry;
import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.TestableMemoryMessageStoreFactory;
import org.apache.qpid.server.virtualhost.VirtualHost;
import org.apache.qpid.test.utils.QpidTestCase;
@@ -65,10 +68,10 @@ public class InternalBrokerBaseCase extends QpidTestCase
super.setUp();
_configXml.addProperty("virtualhosts.virtualhost.name", "test");
- _configXml.addProperty("virtualhosts.virtualhost.test.store.class", TestableMemoryMessageStore.class.getName());
+ _configXml.addProperty("virtualhosts.virtualhost.test.store.factoryclass", TestableMemoryMessageStoreFactory.class.getName());
_configXml.addProperty("virtualhosts.virtualhost(-1).name", getName());
- _configXml.addProperty("virtualhosts.virtualhost(-1)."+getName()+".store.class", TestableMemoryMessageStore.class.getName());
+ _configXml.addProperty("virtualhosts.virtualhost(-1)."+getName()+".store.factoryclass", TestableMemoryMessageStoreFactory.class.getName());
createBroker();
}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/util/MapJsonSerializerTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/util/MapJsonSerializerTest.java
new file mode 100644
index 0000000000..56567523df
--- /dev/null
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/util/MapJsonSerializerTest.java
@@ -0,0 +1,53 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+public class MapJsonSerializerTest extends TestCase
+{
+ private MapJsonSerializer _serializer;
+
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _serializer = new MapJsonSerializer();
+
+ }
+
+ public void testSerializeDeserialize()
+ {
+ Map<String, Object> testMap = new HashMap<String, Object>();
+ testMap.put("string", "Test String");
+ testMap.put("integer", new Integer(10));
+ testMap.put("long", new Long(Long.MAX_VALUE));
+ testMap.put("boolean", Boolean.TRUE);
+
+ String jsonString = _serializer.serialize(testMap);
+ Map<String, Object> deserializedMap = _serializer.deserialize(jsonString);
+
+ assertEquals(deserializedMap, testMap);
+ }
+
+}
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java
index af742532e2..91174c5d10 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/MockVirtualHost.java
@@ -33,12 +33,12 @@ import org.apache.qpid.server.exchange.ExchangeFactory;
import org.apache.qpid.server.exchange.ExchangeRegistry;
import org.apache.qpid.server.federation.BrokerLink;
import org.apache.qpid.server.management.ManagedObject;
+import org.apache.qpid.server.protocol.v1_0.LinkRegistry;
import org.apache.qpid.server.queue.QueueRegistry;
import org.apache.qpid.server.registry.IApplicationRegistry;
import org.apache.qpid.server.security.SecurityManager;
import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
import org.apache.qpid.server.stats.StatisticsCounter;
-import org.apache.qpid.server.store.DurableConfigurationStore;
import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.txn.DtxRegistry;
@@ -111,11 +111,6 @@ public class MockVirtualHost implements VirtualHost
return null;
}
- public DurableConfigurationStore getDurableConfigurationStore()
- {
- return null;
- }
-
public ExchangeFactory getExchangeFactory()
{
return null;
@@ -177,6 +172,11 @@ public class MockVirtualHost implements VirtualHost
}
+ public LinkRegistry getLinkRegistry(String remoteContainerId)
+ {
+ return null;
+ }
+
public ScheduledFuture<?> scheduleTask(long delay, Runnable timeoutTask)
{
return null;
@@ -281,4 +281,10 @@ public class MockVirtualHost implements VirtualHost
{
}
+
+ @Override
+ public State getState()
+ {
+ return State.ACTIVE;
+ }
} \ No newline at end of file
diff --git a/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java b/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java
index df7b4da426..87eb0f9d16 100644
--- a/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java
+++ b/qpid/java/broker/src/test/java/org/apache/qpid/server/virtualhost/VirtualHostImplTest.java
@@ -27,7 +27,7 @@ import org.apache.qpid.server.configuration.ServerConfiguration;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.registry.ApplicationRegistry;
-import org.apache.qpid.server.store.TestableMemoryMessageStore;
+import org.apache.qpid.server.store.MemoryMessageStoreFactory;
import org.apache.qpid.server.util.TestApplicationRegistry;
import org.apache.qpid.test.utils.QpidTestCase;
@@ -68,31 +68,6 @@ public class VirtualHostImplTest extends QpidTestCase
customBindingTestImpl(new String[0]);
}
- private void customBindingTestImpl(final String[] routingKeys) throws Exception
- {
- String exchangeName = getName() +".direct";
- String vhostName = getName();
- String queueName = getName();
-
- File config = writeConfigFile(vhostName, queueName, exchangeName, false, routingKeys);
- VirtualHost vhost = createVirtualHost(vhostName, config);
- assertNotNull("virtualhost should exist", vhost);
-
- AMQQueue queue = vhost.getQueueRegistry().getQueue(queueName);
- assertNotNull("queue should exist", queue);
-
- Exchange defaultExch = vhost.getExchangeRegistry().getDefaultExchange();
- assertTrue("queue should have been bound to default exchange with its name", defaultExch.isBound(queueName, queue));
-
- Exchange exch = vhost.getExchangeRegistry().getExchange(exchangeName);
- assertTrue("queue should have been bound to " + exchangeName + " with its name", exch.isBound(queueName, queue));
-
- for(String key: routingKeys)
- {
- assertTrue("queue should have been bound to " + exchangeName + " with key " + key, exch.isBound(key, queue));
- }
- }
-
/**
* Tests that specifying custom routing keys for a queue in the configuration file results in failure
* to create the vhost (since this is illegal, only queue names are used with the default exchange)
@@ -106,12 +81,32 @@ public class VirtualHostImplTest extends QpidTestCase
createVirtualHost(getName(), config);
fail("virtualhost creation should have failed due to illegal configuration");
}
- catch (ConfigurationException e)
+ catch (RuntimeException e)
{
+ assertEquals(ConfigurationException.class, e.getCause().getClass());
//expected
}
}
+ public void testVirtualHostBecomesActive() throws Exception
+ {
+ File config = writeConfigFile(getName(), getName(), getName() +".direct", false, new String[0]);
+ VirtualHost vhost = createVirtualHost(getName(), config);
+ assertNotNull(vhost);
+ assertEquals(State.ACTIVE, vhost.getState());
+ }
+
+ public void testVirtualHostBecomesStoppedOnClose() throws Exception
+ {
+ File config = writeConfigFile(getName(), getName(), getName() +".direct", false, new String[0]);
+ VirtualHost vhost = createVirtualHost(getName(), config);
+ assertNotNull(vhost);
+ assertEquals(State.ACTIVE, vhost.getState());
+ vhost.close();
+ assertEquals(State.STOPPED, vhost.getState());
+ assertEquals(0, vhost.getHouseKeepingActiveCount());
+ }
+
/**
* Tests that specifying an unknown exchange to bind the queue to results in failure to create the vhost
*/
@@ -124,12 +119,39 @@ public class VirtualHostImplTest extends QpidTestCase
createVirtualHost(getName(), config);
fail("virtualhost creation should have failed due to illegal configuration");
}
- catch (ConfigurationException e)
+ catch (RuntimeException e)
{
+ assertEquals(ConfigurationException.class, e.getCause().getClass());
//expected
}
}
+ private void customBindingTestImpl(final String[] routingKeys) throws Exception
+ {
+ String exchangeName = getName() +".direct";
+ String vhostName = getName();
+ String queueName = getName();
+
+ File config = writeConfigFile(vhostName, queueName, exchangeName, false, routingKeys);
+ VirtualHost vhost = createVirtualHost(vhostName, config);
+ assertNotNull("virtualhost should exist", vhost);
+
+ AMQQueue queue = vhost.getQueueRegistry().getQueue(queueName);
+ assertNotNull("queue should exist", queue);
+
+ Exchange defaultExch = vhost.getExchangeRegistry().getDefaultExchange();
+ assertTrue("queue should have been bound to default exchange with its name", defaultExch.isBound(queueName, queue));
+
+ Exchange exch = vhost.getExchangeRegistry().getExchange(exchangeName);
+ assertTrue("queue should have been bound to " + exchangeName + " with its name", exch.isBound(queueName, queue));
+
+ for(String key: routingKeys)
+ {
+ assertTrue("queue should have been bound to " + exchangeName + " with key " + key, exch.isBound(key, queue));
+ }
+ }
+
+
private VirtualHost createVirtualHost(String vhostName, File config) throws Exception
{
_configuration = new ServerConfiguration(new XMLConfiguration(config));
@@ -167,11 +189,11 @@ public class VirtualHostImplTest extends QpidTestCase
writer.write("<virtualhosts>");
writer.write(" <default>" + vhostName + "</default>");
writer.write(" <virtualhost>");
- writer.write(" <store>");
- writer.write(" <class>" + TestableMemoryMessageStore.class.getName() + "</class>");
- writer.write(" </store>");
writer.write(" <name>" + vhostName + "</name>");
writer.write(" <" + vhostName + ">");
+ writer.write(" <store>");
+ writer.write(" <factoryclass>" + MemoryMessageStoreFactory.class.getName() + "</factoryclass>");
+ writer.write(" </store>");
if(exchangeName != null && !dontDeclare)
{
writer.write(" <exchanges>");
diff --git a/qpid/java/build.deps b/qpid/java/build.deps
index ec9eacb169..76b1461fe2 100644
--- a/qpid/java/build.deps
+++ b/qpid/java/build.deps
@@ -37,6 +37,8 @@ geronimo-openejb=lib/geronimo-ejb_3.0_spec-1.0.1.jar
junit=lib/junit-3.8.1.jar
mockito-all=lib/mockito-all-1.9.0.jar
+gson-all=lib/gson-2.0.jar
+
log4j=lib/log4j-1.2.12.jar
slf4j-api=lib/slf4j-api-1.6.1.jar
@@ -48,19 +50,27 @@ felix-main=lib/org.apache.felix.main-2.0.5.jar
felix.libs=${felix-main}
+jackson-core=lib/jackson-core-asl-1.9.0.jar
+jackson-mapper=lib/jackson-mapper-asl-1.9.0.jar
+
commons-configuration.libs = ${commons-beanutils-core} ${commons-digester} \
${commons-codec} ${commons-lang} ${commons-collections} ${commons-configuration}
common.libs=${slf4j-api}
client.libs=${geronimo-jms}
+amqp-1-0-common.libs=
+amqp-1-0-client.libs=${commons-cli}
+amqp-1-0-client-jms.libs=${geronimo-jms}
tools.libs=${commons-configuration.libs} ${log4j}
broker.libs=${commons-cli} ${commons-logging} ${log4j} ${slf4j-log4j} \
- ${xalan} ${felix.libs} ${derby-db} ${commons-configuration.libs}
+ ${xalan} ${felix.libs} ${derby-db} ${commons-configuration.libs} \
+ ${jackson-core} ${jackson-mapper}
broker-plugins.libs=${felix.libs} ${log4j} ${commons-configuration.libs}
-junit-toolkit.libs=${log4j} ${junit} ${slf4j-api} ${mockito-all}
-test.libs=${slf4j-log4j} ${junit-toolkit.libs}
+test.libs=${slf4j-log4j} ${log4j} ${junit} ${slf4j-api} ${mockito-all}
+
+perftests.libs=${geronimo-jms} ${slf4j-api} ${commons-collections} ${commons-beanutils-core} ${commons-lang} ${gson-all}
ibm-icu=lib/com.ibm.icu_3.8.1.v20080530.jar
ecl-core-jface=lib/org.eclipse.jface_3.4.1.M20080827-2000.jar
@@ -127,6 +137,7 @@ client-example.test.libs=${test.libs}
tools.test.libs=
testkit.test.libs=${test.libs}
systests.libs=${test.libs}
+perftests.test.libs=${test.libs}
broker-plugins.test.libs=${test.libs}
@@ -146,3 +157,9 @@ bdb-je=lib/bdbstore/je-5.0.34.jar
bdbstore.libs=${bdb-je}
bdbstore.test.libs=${test.libs}
+# optional perftests-visualisation-jfc module deps
+jfreechart.jar=lib/jfree/jfreechart-1.0.13.jar
+jfreecommon.jar=lib/jfree/jfreecommon-1.0.16.jar
+csvjdbc.jar=lib/csvjdbc/csvjdbc-1.0.8.jar
+perftests-visualisation-jfc.libs=${jfreechart.jar} ${jfreecommon.jar} ${csvjdbc.jar}
+perftests-visualisation-jfc.test.libs=${test.libs}
diff --git a/qpid/java/build.xml b/qpid/java/build.xml
index 36e34f4071..1de6c8f49c 100644
--- a/qpid/java/build.xml
+++ b/qpid/java/build.xml
@@ -26,9 +26,9 @@
<findSubProjects name="client-plugins" dir="client-plugins"/>
<findSubProjects name="management" dir="management" excludes="common,example"/>
- <property name="modules.core" value="junit-toolkit common management/common broker client tools"/>
+ <property name="modules.core" value="common management/common amqp-1-0-common broker client amqp-1-0-client amqp-1-0-client-jms tools"/>
<property name="modules.examples" value="client/example management/example"/>
- <property name="modules.tests" value="systests perftests integrationtests"/>
+ <property name="modules.tests" value="systests perftests"/>
<property name="modules.management" value="${management}"/>
<property name="modules.plugin" value="${broker-plugins} ${client-plugins}"/>
<property name="modules.opt" value=""/>
diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java
index ce624cb91b..55d3ccb6e7 100644
--- a/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java
+++ b/qpid/java/client/src/main/java/org/apache/qpid/client/AMQSession.java
@@ -3212,28 +3212,15 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
public void rejectPending(C consumer)
{
- synchronized (_lock)
- {
- boolean stopped = connectionStopped();
+ // Reject messages on pre-receive queue
+ consumer.rollbackPendingMessages();
- if (!stopped)
- {
- setConnectionStopped(true);
- }
+ // Reject messages on pre-dispatch queue
+ rejectMessagesForConsumerTag(consumer.getConsumerTag(), true, false);
- // Reject messages on pre-receive queue
- consumer.rollbackPendingMessages();
+ // closeConsumer
+ consumer.markClosed();
- // Reject messages on pre-dispatch queue
- rejectMessagesForConsumerTag(consumer.getConsumerTag(), true, false);
- //Let the dispatcher deal with this when it gets to them.
-
- // closeConsumer
- consumer.markClosed();
-
- setConnectionStopped(stopped);
-
- }
}
public void rollback()
@@ -3425,7 +3412,7 @@ public abstract class AMQSession<C extends BasicMessageConsumer, P extends Basic
{
final C consumer = _consumers.get(message.getConsumerTag());
- if ((consumer == null) || consumer.isClosed())
+ if ((consumer == null) || consumer.isClosed() || consumer.isClosing())
{
if (_dispatcherLogger.isInfoEnabled())
{
diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java b/qpid/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java
index 0d717a3216..0f8b5717d6 100644
--- a/qpid/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java
+++ b/qpid/java/client/src/main/java/org/apache/qpid/client/BasicMessageConsumer.java
@@ -593,7 +593,10 @@ public abstract class BasicMessageConsumer<U> extends Closeable implements Messa
// no point otherwise as the connection will be gone
if (!_session.isClosed() || _session.isClosing())
{
- sendCancel();
+ synchronized(_session.getMessageDeliveryLock())
+ {
+ sendCancel();
+ }
cleanupQueue();
}
}
diff --git a/qpid/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java b/qpid/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java
index 6d5bf9ad67..f2efb6e8a5 100644
--- a/qpid/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java
+++ b/qpid/java/client/src/main/java/org/apache/qpid/client/XASessionImpl.java
@@ -6,7 +6,7 @@
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE 2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
diff --git a/qpid/java/common/src/main/java/org/apache/qpid/codec/MarkableDataInput.java b/qpid/java/common/src/main/java/org/apache/qpid/codec/MarkableDataInput.java
index 2a243a810d..a1513135a3 100644
--- a/qpid/java/common/src/main/java/org/apache/qpid/codec/MarkableDataInput.java
+++ b/qpid/java/common/src/main/java/org/apache/qpid/codec/MarkableDataInput.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.codec;
import org.apache.qpid.framing.AMQShortString;
diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java
index 85870e68c5..fdc71e31f9 100644
--- a/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java
+++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/AMQShortString.java
@@ -858,4 +858,9 @@ public final class AMQShortString implements CharSequence, Comparable<AMQShortSt
}
}
+ public static String toString(AMQShortString amqShortString)
+ {
+ return amqShortString == null ? null : amqShortString.asString();
+ }
+
}
diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/ByteArrayDataInput.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/ByteArrayDataInput.java
index 196ab422a3..854f77e135 100644
--- a/qpid/java/common/src/main/java/org/apache/qpid/framing/ByteArrayDataInput.java
+++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/ByteArrayDataInput.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.framing;
import org.apache.qpid.codec.MarkableDataInput;
diff --git a/qpid/java/common/src/main/java/org/apache/qpid/framing/ExtendedDataInput.java b/qpid/java/common/src/main/java/org/apache/qpid/framing/ExtendedDataInput.java
index c789d9275e..04c1677892 100644
--- a/qpid/java/common/src/main/java/org/apache/qpid/framing/ExtendedDataInput.java
+++ b/qpid/java/common/src/main/java/org/apache/qpid/framing/ExtendedDataInput.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.framing;
import java.io.DataInput;
diff --git a/qpid/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java b/qpid/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java
index 94db7d8dde..cbf6caf141 100644
--- a/qpid/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java
+++ b/qpid/java/common/src/test/java/org/apache/qpid/test/utils/QpidTestCase.java
@@ -42,6 +42,7 @@ public class QpidTestCase extends TestCase
{
public static final String QPID_HOME = System.getProperty("QPID_HOME");
public static final String TEST_RESOURCES_DIR = QPID_HOME + "/../test-profiles/test_resources/";
+ public static final String TMP_FOLDER = System.getProperty("java.io.tmpdir");
private static final Logger _logger = Logger.getLogger(QpidTestCase.class);
@@ -108,10 +109,10 @@ public class QpidTestCase extends TestCase
_exclusionList = exclusionList;
}
}
-
- protected static final String MS_CLASS_NAME_KEY = "messagestore.class.name";
- protected static final String MEMORY_STORE_CLASS_NAME = "org.apache.qpid.server.store.MemoryMessageStore";
-
+
+ protected static final String MS_FACTORY_CLASS_NAME_KEY = "messagestorefactory.class.name";
+ protected static final String MEMORY_STORE_FACTORY_CLASS_NAME = "org.apache.qpid.server.store.MemoryMessageStoreFactory";
+
private static List<String> _exclusionList;
public QpidTestCase()
@@ -139,11 +140,12 @@ public class QpidTestCase extends TestCase
}
}
- public String getTestProfileMessageStoreClassName()
+ public String getTestProfileMessageStoreFactoryClassName()
{
- String storeClass = System.getProperty(MS_CLASS_NAME_KEY);
+ final String storeFactoryClass = System.getProperty(MS_FACTORY_CLASS_NAME_KEY);
+ _logger.debug("MS_FACTORY_CLASS_NAME_KEY " + storeFactoryClass);
- return storeClass != null ? storeClass : MEMORY_STORE_CLASS_NAME ;
+ return storeFactoryClass != null ? storeFactoryClass : MEMORY_STORE_FACTORY_CLASS_NAME ;
}
@@ -157,7 +159,7 @@ public class QpidTestCase extends TestCase
* @param fromPort the port to scan for availability
* @throws NoSuchElementException if there are no ports available
*/
- protected int getNextAvailable(int fromPort)
+ public int getNextAvailable(int fromPort)
{
if ((fromPort < MIN_PORT_NUMBER) || (fromPort > MAX_PORT_NUMBER))
{
diff --git a/qpid/java/integrationtests/README.txt b/qpid/java/integrationtests/README.txt
deleted file mode 100644
index 00a21883a9..0000000000
--- a/qpid/java/integrationtests/README.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-This module contains integration tests, for testing a java client againt *any* broker
-implementation or against other clients. These tests must not rely on starting the
-Java broker in-vm but must depend on a broker being started independantly before running
-the tests in this module. By default tests in this module will expect the broker to be
-started on localhost on the default port, but this can be overridden by passing in a
-sys property to maven. Interop tests are in this module. Java broker specific tests that
-use an in-vm broker should go in the systests module.
-
-Don't set the tests in this module to run by default as part of the maven build, until
-there is a script to start and stop the broker; needed to fully automate these tests.
-Interop tests will always be run using a seperate script (not from maven) but it might
-be worthwile to script into the maven build starting of the Java broker, and running
-these tests against it. \ No newline at end of file
diff --git a/qpid/java/integrationtests/bin/interoptests.py b/qpid/java/integrationtests/bin/interoptests.py
deleted file mode 100755
index a883a22a5f..0000000000
--- a/qpid/java/integrationtests/bin/interoptests.py
+++ /dev/null
@@ -1,180 +0,0 @@
-#!/usr/bin/env python
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import glob, os, subprocess
-from subprocess import Popen
-from optparse import OptionParser
-
-interop_cases = ["InteropTestCase1DummyRun", "InteropTestCase2BasicP2P", "InteropTestCase3BasicPubSub", "InteropTestCase4P2PMessageSize", "InteropTestCase5PubSubMessageSize"]
-
-interop_command = "java -cp %s org.apache.qpid.test.framework.distributedtesting.Coordinator --xml -e interop -o . -n interop org.apache.qpid.interop.testcases.%s"
-
-# TODO: read this from the ant properties file
-clientlibs = ["qpid-integrationtests-M4.jar",
- "qpid-junit-toolkit-M4.jar",
- "junit-3.8.1.jar",
- "qpid-systests-M4.jar",
- "qpid-junit-toolkit-M4.jar",
- "geronimo-jms_1.1_spec-1.0.jar",
- "log4j-1.2.12.jar"]
-
-def main():
- parser = OptionParser()
- parser.add_option("-t", "--testlib", dest="testlib", action="store",
- type="string",
- help="The directory containing the test classes to run")
- parser.add_option("-b", "--brokers", dest="brokers", action="store",
- type="string",
- help="The directory containing the unpacked brokers to test")
- parser.add_option("-j", "--java", dest="java", action="store",
- type="string",
- help="The directory containing the java client to test")
- parser.add_option("-d", "--dotnet", dest="dotnet", action="store",
- type="string",
- help="The directory containing the .Net client to test")
- parser.add_option("-c", "--cpp", dest="cpp", action="store",
- type="string",
- help="The directory containing the C++ client to test")
- (options, args) = parser.parse_args()
-
- # check available brokers
- if (options.brokers == None or
- not os.path.exists(options.brokers) or
- not os.path.isdir(options.brokers)):
- parser.error("Broker directory must be specified and must exist")
-
- # check available clients
- if (options.java == None or
- not os.path.exists(options.java) or
- not os.path.isdir(options.java)):
- parser.error("Java client directory must be specified and must exist")
-
- # check available tests
- if (options.testlib == None or
- not os.path.exists(options.testlib) or
- not os.path.isdir(options.testlib)):
- parser.error("Test directory must be specified and must exist")
-
- # check dotnet test client
- if (options.dotnet == None or
- not os.path.exists(options.dotnet) or
- not os.path.exists(options.dotnet+"/TestClient.exe")):
- parser.error(".Net test directory must be specified and must contain TestClient.exe")
-
- # check cpp test client
- if (options.cpp == None or
- not os.path.exists(options.cpp) or
- not os.path.exists(options.cpp+"/src/tests/interop_runner")):
- parser.error("C++ test directory must be specified and must contain test client")
-
- # Get list of available broker and client versions
- brokers = glob.glob(options.brokers+"/qpid-[0-9].[0-9].[0-9].[0-9]")
- java_clients = glob.glob(options.java+"/qpid-[0-9].[0-9].[0-9].[0-9]*")
-
- if (not len(brokers) > 0):
- parser.error("Broker directory did not contain any brokers!")
-
- if (not len(java_clients) > 0):
- parser.error("Broker directory did not contain any brokers!")
-
- for broker in brokers:
- for client in java_clients:
- test(options.testlib, broker, client, options.dotnet,
- options.cpp)
-
-def start_dotnet(dotnetpath):
- return Popen(["%s/TestClient.exe" % os.path.abspath(dotnetpath),
- "-bamqp://guest:guest@clientid/?brokerlist=\'tcp://localhost:5672\'"],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
-
-def start_java(javapath):
- # Setup classpath
- classpath = ""
- for lib in clientlibs:
- classpath = classpath + testlibdir+"/"+lib+";"
-
- classpath = classpath + javapath+"/lib/qpid-all.jar"
-
- # Add qpid common since the tests need that, classpath hatefulness
- classpath = classpath + ";"+testlibdir+"/qpid-common-M4.jar"
-
- return Popen(["java", "-cp","\""+classpath+"\"",
- "org.apache.qpid.test.framework.distributedtesting.TestClient"],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
-
-def start_cpp(cpppath):
- return Popen([cpppath+"tests/interop_runner"],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
-
-def run_tests():
- for testcase in interop_cases:
- cmd = " ".join(["java", "-cp","\""+classpath+"\"", "org.apache.qpid.test.framework.distributedtesting.Coordinator",
- "--xml", "-e", "interop", "-o", ".", "-n", "interop", ("org.apache.qpid.interop.testcases.%s" % testcase)])
- fd = os.popen(cmd, "r")
- output = fd.read()
- fd.close()
-
-def test(testlibdir, brokerpath, javapath, dotnetpath, cpppath):
- print ("Testing broker in %s\nclient in %s" % (brokerpath, javapath))
- print ("Logging too %s" % ("/tmp/qpid-interop-tests/%s-%s" %
- (os.path.basename(brokerpath), os.path.basename(javapath))))
- os.environ["QPID_HOME"] = brokerpath
- os.environ["QPID_WORK"] = ("/tmp/qpid-interop-tests/%s-%s" %
- (os.path.basename(brokerpath), os.path.basename(javapath)))
-
- brokerp, javacp, dotnetp, cppp, coordinatorp = (None, None, None, None, None)
-
- try:
- # Start broker
- brokerp = Popen(brokerpath+"/bin/qpid-server",
- stdin=subprocess.PIPE, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- print ("Started broker, pid %s" % brokerp.pid)
-
- cppp = start_cpp(cpppath)
- print ("Started C++ client, pid %s" % cppp.pid)
-
- dotnetp = start_dotnet(dotnetpath)
- print ("Started .Net client, pid %s" % dotnetp.pid)
-
- javacp = start_java(javapath)
- print ("Started client, pid %s" % javacp.pid)
-
- run_tests()
-
- finally:
- # Shutdown broker and clients
- if javacp != None:
- os.kill(javacp.pid, 9)
- if dotnetp != None:
- os.kill(dotnetp.pid, 9)
- if coordinatorp != None:
- os.kill(coordinatorp.pid, 9)
- if brokerp != None:
- os.kill(brokerp.pid, 9)
-
- # Start coordinator
-
-
-if __name__ == "__main__":
- main()
diff --git a/qpid/java/integrationtests/build.xml b/qpid/java/integrationtests/build.xml
deleted file mode 100644
index ae870c5675..0000000000
--- a/qpid/java/integrationtests/build.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<project name="Integration Tests" default="build">
-
- <property name="module.depends" value="systests client common common/test junit-toolkit"/>
- <property name="module.dist" value="false"/>
-
- <import file="../module.xml"/>
-
-</project>
diff --git a/qpid/java/integrationtests/docs/RunningSustainedTests.txt b/qpid/java/integrationtests/docs/RunningSustainedTests.txt
deleted file mode 100644
index db4405a32d..0000000000
--- a/qpid/java/integrationtests/docs/RunningSustainedTests.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-In addition to the integration tests the framework provided by this package also allows for
-sustained tests to be run. Currently avaible tests:
-- org.apache.qpid.sustained.SustainedClientTestCase : Pub Sub test to determine steady state throughput.
-
-
-Running Tests.
-
-Run the tests as per the integration tests.
-- Start a broker
-- Start at least one test client [java org.apache.qpid.interop.TestClient], ensuring unique naming.
-
-- Start the test coordinator with the 'fanout' engine, on the sustained test case [java org.apache.qpid.test.framework.distributedtesting.Coordinator]
-
-- Additional Test clients can be started and joined into the running test: [java org.apache.qpid.interop.TestClient -j]
-
-
-
diff --git a/qpid/java/integrationtests/jar-with-dependencies.xml b/qpid/java/integrationtests/jar-with-dependencies.xml
deleted file mode 100644
index 3e95e7ab22..0000000000
--- a/qpid/java/integrationtests/jar-with-dependencies.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<!-- This is an assembly descriptor that produces a jar file that contains all the
- dependencies, fully expanded into a single jar, required to run the tests of
- a maven project.
- -->
-<assembly>
- <id>all-test-deps</id>
- <formats>
- <format>jar</format>
- </formats>
- <includeBaseDirectory>false</includeBaseDirectory>
- <dependencySets>
- <dependencySet>
- <outputDirectory></outputDirectory>
- <outputFileNameMapping></outputFileNameMapping>
- <unpack>true</unpack>
- <scope>test</scope>
- </dependencySet>
- </dependencySets>
- <fileSets>
- <fileSet>
- <directory>target/classes</directory>
- <outputDirectory></outputDirectory>
- </fileSet>
- <fileSet>
- <directory>target/test-classes</directory>
- <outputDirectory></outputDirectory>
- </fileSet>
- </fileSets>
-</assembly>
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase1DummyRun.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase1DummyRun.java
deleted file mode 100644
index db17c7aacc..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase1DummyRun.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.clienttestcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-
-/**
- * Implements tet case 1, dummy run. This test case sends no test messages, it exists to confirm that the test harness
- * is interacting with the coordinator correctly.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Perform test case actions.
- * <tr><td> Generate test reports.
- * </table>
- */
-public class TestCase1DummyRun implements TestClientControlledTest
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestCase1DummyRun.class);
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "TC1_DummyRun";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage): called");
-
- // Test parameters don't matter, accept all invites.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role, Message assignRoleMessage): called");
-
- // Do nothing, both roles are the same.
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- */
- public void start(int numMessages)
- {
- log.debug("public void start(): called");
-
- // Do nothing.
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Generate a dummy report, the coordinator expects a report but doesn't care what it is.
- return session.createTextMessage("Dummy Run, Ok.");
- }
-
- /**
- * Handles incoming test messages. Does nothing.
- *
- * @param message The incoming test message.
- */
- public void onMessage(Message message)
- {
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- // Ignore any messages.
- }
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase2BasicP2P.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase2BasicP2P.java
deleted file mode 100644
index 36d3cce7f7..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase2BasicP2P.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.clienttestcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedtesting.TestClient;
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.*;
-
-/**
- * Implements test case 2, basic P2P. Sends/received a specified number of messages to a specified route on the
- * default direct exchange. Produces reports on the actual number of messages sent/received.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Send required number of test messages.
- * <tr><td> Generate test reports.
- * </table>
- */
-public class TestCase2BasicP2P implements TestClientControlledTest, MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestCase2BasicP2P.class);
-
- /** Holds the count of test messages received. */
- private int messageCount;
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The number of test messages to send. */
- private int numMessages;
-
- /** The connection to send the test messages on. */
- private Connection connection;
-
- /** The controlSession to send the test messages on. */
- private Session session;
-
- /** The producer to send the test messages with. */
- MessageProducer producer;
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "TC2_BasicP2P";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage = " + inviteMessage + "): called");
-
- // All invites are acceptable.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- *
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
- + "): called");
-
- // Reset the message count for a new test.
- messageCount = 0;
-
- // Take note of the role to be played.
- this.role = role;
-
- // Create a new connection to pass the test messages on.
- connection = TestUtils.createConnection(TestClient.testContextProperties);
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- // Extract and retain the test parameters.
- numMessages = assignRoleMessage.getIntProperty("P2P_NUM_MESSAGES");
- Destination sendDestination = session.createQueue(assignRoleMessage.getStringProperty("P2P_QUEUE_AND_KEY_NAME"));
-
- log.debug("numMessages = " + numMessages);
- log.debug("sendDestination = " + sendDestination);
- log.debug("role = " + role);
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a message producer if so.
- case SENDER:
- producer = session.createProducer(sendDestination);
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages.
- case RECEIVER:
- MessageConsumer consumer = session.createConsumer(sendDestination);
- consumer.setMessageListener(this);
- break;
- }
-
- connection.start();
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // Check that the sender role is being performed.
- if (role.equals(Roles.SENDER))
- {
- Message testMessage = session.createTextMessage("test");
-
- for (int i = 0; i < this.numMessages; i++)
- {
- producer.send(testMessage);
-
- // Increment the message count.
- messageCount++;
- }
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Close the test connection.
- connection.close();
-
- // Generate a report message containing the count of the number of messages passed.
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
- report.setIntProperty("MESSAGE_COUNT", messageCount);
-
- return report;
- }
-
- /**
- * Counts incoming test messages.
- *
- * @param message The incoming test message.
- */
- public void onMessage(Message message)
- {
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- // Increment the message count.
- messageCount++;
- }
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase3BasicPubSub.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase3BasicPubSub.java
deleted file mode 100644
index 205472716b..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase3BasicPubSub.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.clienttestcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedtesting.TestClient;
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.*;
-
-/**
- * Implements test case 3, basic pub/sub. Sends/received a specified number of messages to a specified route on the
- * default topic exchange, using the specified number of receivers connections. Produces reports on the actual number of
- * messages sent/received.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Send required number of test messages using pub/sub.
- * <tr><td> Generate test reports.
- * </table>
- */
-public class TestCase3BasicPubSub implements TestClientControlledTest, MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestCase3BasicPubSub.class);
-
- /** Holds the count of test messages received. */
- private int messageCount;
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The number of test messages to send. */
- private int numMessages;
-
- /** The connections to send/receive the test messages on. */
- private Connection[] connection;
-
- /** The sessions to send/receive the test messages on. */
- private Session[] session;
-
- /** The producer to send the test messages with. */
- MessageProducer producer;
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "TC3_BasicPubSub";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws javax.jms.JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage = " + inviteMessage + "): called");
-
- // All invites are acceptable.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- *
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
- + "): called");
-
- // Reset the message count for a new test.
- messageCount = 0;
-
- // Take note of the role to be played.
- this.role = role;
-
- // Extract and retain the test parameters.
- numMessages = assignRoleMessage.getIntProperty("PUBSUB_NUM_MESSAGES");
- int numReceivers = assignRoleMessage.getIntProperty("PUBSUB_NUM_RECEIVERS");
- String sendKey = assignRoleMessage.getStringProperty("PUBSUB_KEY");
-
- log.debug("numMessages = " + numMessages);
- log.debug("numReceivers = " + numReceivers);
- log.debug("sendKey = " + sendKey);
- log.debug("role = " + role);
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a single message producer if so.
- case SENDER:
- // Create a new connection to pass the test messages on.
- connection = new Connection[1];
- session = new Session[1];
-
- connection[0] = TestUtils.createConnection(TestClient.testContextProperties);
- session[0] = connection[0].createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- // Extract and retain the test parameters.
- Destination sendDestination = session[0].createTopic(sendKey);
-
- producer = session[0].createProducer(sendDestination);
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages on the required number
- // of receivers connections.
- case RECEIVER:
- // Create the required number of receivers connections.
- connection = new Connection[numReceivers];
- session = new Session[numReceivers];
-
- for (int i = 0; i < numReceivers; i++)
- {
- connection[i] = TestUtils.createConnection(TestClient.testContextProperties);
- session[i] = connection[i].createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- sendDestination = session[i].createTopic(sendKey);
-
- MessageConsumer consumer = session[i].createConsumer(sendDestination);
- consumer.setMessageListener(this);
- }
-
- break;
- }
-
- // Start all the connection dispatcher threads running.
- for (Connection conn : connection)
- {
- conn.start();
- }
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // Check that the sender role is being performed.
- if (role.equals(Roles.SENDER))
- {
- Message testMessage = session[0].createTextMessage("test");
-
- for (int i = 0; i < this.numMessages; i++)
- {
- producer.send(testMessage);
-
- // Increment the message count.
- messageCount++;
- }
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Close the test connections.
- for (Connection conn : connection)
- {
- conn.close();
- }
-
- // Generate a report message containing the count of the number of messages passed.
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
- report.setIntProperty("MESSAGE_COUNT", messageCount);
-
- return report;
- }
-
- /**
- * Counts incoming test messages.
- *
- * @param message The incoming test message.
- */
- public void onMessage(Message message)
- {
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- // Increment the message count.
- messageCount++;
- }
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase4P2PMessageSize.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase4P2PMessageSize.java
deleted file mode 100644
index 3730233264..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase4P2PMessageSize.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.clienttestcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedtesting.TestClient;
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.*;
-
-/**
- * Implements test case 4, P2P messages with message size. Sends/received a specified number of messages to a specified
- * route on the default direct exchange, of a specified size. Produces reports on the actual number of messages
- * sent/received.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Send required number of test messages.
- * <tr><td> Generate test reports.
- * </table>
- */
-public class TestCase4P2PMessageSize implements TestClientControlledTest, MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestCase4P2PMessageSize.class);
-
- /** Holds the count of test messages received. */
- private int messageCount;
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The number of test messages to send. */
- private int numMessages;
-
- /** The size of the test messages to send. */
- private int messageSize;
-
- /** The connection to send the test messages on. */
- private Connection connection;
-
- /** The controlSession to send the test messages on. */
- private Session session;
-
- /** The producer to send the test messages with. */
- MessageProducer producer;
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "TC4_P2PMessageSize";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage = " + inviteMessage + "): called");
-
- // All invites are acceptable.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- *
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
- + "): called");
-
- // Reset the message count for a new test.
- messageCount = 0;
-
- // Take note of the role to be played.
- this.role = role;
-
- // Create a new connection to pass the test messages on.
- connection = TestUtils.createConnection(TestClient.testContextProperties);
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- // Extract and retain the test parameters.
- numMessages = assignRoleMessage.getIntProperty("P2P_NUM_MESSAGES");
- messageSize = assignRoleMessage.getIntProperty("messageSize");
- Destination sendDestination = session.createQueue(assignRoleMessage.getStringProperty("P2P_QUEUE_AND_KEY_NAME"));
-
- log.debug("numMessages = " + numMessages);
- log.debug("sendDestination = " + sendDestination);
- log.debug("role = " + role);
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a message producer if so.
- case SENDER:
- producer = session.createProducer(sendDestination);
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages.
- case RECEIVER:
- MessageConsumer consumer = session.createConsumer(sendDestination);
- consumer.setMessageListener(this);
- break;
- }
-
- connection.start();
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // Check that the sender role is being performed.
- if (role.equals(Roles.SENDER))
- {
- Message testMessage = TestUtils.createTestMessageOfSize(session, messageSize);
-
- for (int i = 0; i < this.numMessages; i++)
- {
- producer.send(testMessage);
-
- // Increment the message count.
- messageCount++;
- }
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Close the test connection.
- connection.close();
-
- // Generate a report message containing the count of the number of messages passed.
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
- report.setIntProperty("MESSAGE_COUNT", messageCount);
-
- return report;
- }
-
- /**
- * Counts incoming test messages.
- *
- * @param message The incoming test message.
- */
- public void onMessage(Message message)
- {
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- // Increment the message count.
- messageCount++;
- }
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase5PubSubMessageSize.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase5PubSubMessageSize.java
deleted file mode 100644
index f601712bc9..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/clienttestcases/TestCase5PubSubMessageSize.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.clienttestcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedtesting.TestClient;
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.*;
-
-/**
- * Implements test case 5, pub/sub with message size. Sends/received a specified number of messages to a specified route
- * on the default topic exchange, using the specified number of receivers connections, and the specified message size.
- * Produces reports on the actual number of messages sent/received.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Send required number of test messages using pub/sub.
- * <tr><td> Generate test reports.
- * </table>
- */
-public class TestCase5PubSubMessageSize implements TestClientControlledTest, MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestCase5PubSubMessageSize.class);
-
- /** Holds the count of test messages received. */
- private int messageCount;
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The number of test messages to send. */
- private int numMessages;
-
- /** The size of the test messages to send. */
- private int messageSize;
-
- /** The connections to send/receive the test messages on. */
- private Connection[] connection;
-
- /** The sessions to send/receive the test messages on. */
- private Session[] session;
-
- /** The producer to send the test messages with. */
- MessageProducer producer;
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "TC5_PubSubMessageSize";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws javax.jms.JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage = " + inviteMessage + "): called");
-
- // All invites are acceptable.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- *
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws javax.jms.JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
- + "): called");
-
- // Reset the message count for a new test.
- messageCount = 0;
-
- // Take note of the role to be played.
- this.role = role;
-
- // Extract and retain the test parameters.
- numMessages = assignRoleMessage.getIntProperty("PUBSUB_NUM_MESSAGES");
- messageSize = assignRoleMessage.getIntProperty("messageSize");
- int numReceivers = assignRoleMessage.getIntProperty("PUBSUB_NUM_RECEIVERS");
- String sendKey = assignRoleMessage.getStringProperty("PUBSUB_KEY");
-
- log.debug("numMessages = " + numMessages);
- log.debug("numReceivers = " + numReceivers);
- log.debug("sendKey = " + sendKey);
- log.debug("role = " + role);
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a single message producer if so.
- case SENDER:
- // Create a new connection to pass the test messages on.
- connection = new Connection[1];
- session = new Session[1];
-
- connection[0] = TestUtils.createConnection(TestClient.testContextProperties);
- session[0] = connection[0].createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- // Extract and retain the test parameters.
- Destination sendDestination = session[0].createTopic(sendKey);
-
- producer = session[0].createProducer(sendDestination);
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages on the required number
- // of receivers connections.
- case RECEIVER:
- // Create the required number of receivers connections.
- connection = new Connection[numReceivers];
- session = new Session[numReceivers];
-
- for (int i = 0; i < numReceivers; i++)
- {
- connection[i] = TestUtils.createConnection(TestClient.testContextProperties);
- session[i] = connection[i].createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- sendDestination = session[i].createTopic(sendKey);
-
- MessageConsumer consumer = session[i].createConsumer(sendDestination);
- consumer.setMessageListener(this);
- }
-
- break;
- }
-
- // Start all the connection dispatcher threads running.
- for (Connection conn : connection)
- {
- conn.start();
- }
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // Check that the sender role is being performed.
- if (role.equals(Roles.SENDER))
- {
- Message testMessage = TestUtils.createTestMessageOfSize(session[0], messageSize);
-
- for (int i = 0; i < this.numMessages; i++)
- {
- producer.send(testMessage);
-
- // Increment the message count.
- messageCount++;
- }
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws javax.jms.JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Close the test connections.
- for (Connection conn : connection)
- {
- conn.close();
- }
-
- // Generate a report message containing the count of the number of messages passed.
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
- report.setIntProperty("MESSAGE_COUNT", messageCount);
-
- return report;
- }
-
- /**
- * Counts incoming test messages.
- *
- * @param message The incoming test message.
- */
- public void onMessage(Message message)
- {
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- // Increment the message count.
- messageCount++;
- }
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase1DummyRun.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase1DummyRun.java
deleted file mode 100644
index a2e4a00aa6..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase1DummyRun.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.testcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import java.util.Properties;
-
-/**
- * Coordinates test case 1, from the interop test specification. This test connects up the sender and receivers roles,
- * and gets some dummy test reports from them, in order to check that the test framework itself is operational.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Exercises the interop testing framework without actually sending any test messages.
- * <td> {@link FrameworkBaseCase}
- * </table>
- */
-public class InteropTestCase1DummyRun extends FrameworkBaseCase
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestCase1DummyRun.class);
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public InteropTestCase1DummyRun(String name)
- {
- super(name);
- }
-
- /**
- * Performs the basic P2P test case, "Test Case 2" in the specification.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testDummyRun() throws Exception
- {
- log.debug("public void testDummyRun(): called");
-
- Properties testConfig = new Properties();
- testConfig.put("TEST_NAME", "TC1_DummyRun");
-
- /*Message[] reports =*/ getCircuitFactory().sequenceTest(null, null, testConfig);
-
- // Compare sender and receivers reports.
- // Assert.assertEquals("Expected to get 2 dummy reports.", 2, reports.length);
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "TC1_DummyRun";
- }
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase2BasicP2P.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase2BasicP2P.java
deleted file mode 100644
index 6d6515f1fd..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase2BasicP2P.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.testcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import java.util.Properties;
-
-/**
- * Implements test case 2, from the interop test specification. This test sets up the TC2_BasicP2P test for 50
- * messages. It checks that the sender and receivers reports both indicate that all the test messages were transmitted
- * successfully.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Setup p2p test parameters and compare with test output. <td> {@link FrameworkBaseCase}
- * </table>
- */
-public class InteropTestCase2BasicP2P extends FrameworkBaseCase
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestCase2BasicP2P.class);
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public InteropTestCase2BasicP2P(String name)
- {
- super(name);
- }
-
- /**
- * Performs the basic P2P test case, "Test Case 2" in the specification.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testBasicP2P() throws Exception
- {
- log.debug("public void testBasicP2P(): called");
-
- Properties testConfig = new Properties();
- testConfig.setProperty("TEST_NAME", "TC2_BasicP2P");
- testConfig.setProperty("P2P_QUEUE_AND_KEY_NAME", "tc2queue");
- testConfig.put("P2P_NUM_MESSAGES", 50);
-
- /*Message[] reports =*/ getCircuitFactory().sequenceTest(null, null, testConfig);
-
- // Compare sender and receivers reports.
- /*int messagesSent = reports[0].getIntProperty("MESSAGE_COUNT");
- int messagesReceived = reports[1].getIntProperty("MESSAGE_COUNT");
-
- Assert.assertEquals("The requested number of messages were not sent.", 50, messagesSent);
- Assert.assertEquals("Sender and receivers messages sent did not match up.", messagesSent, messagesReceived);*/
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "TC2_BasicP2P";
- }
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase3BasicPubSub.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase3BasicPubSub.java
deleted file mode 100644
index 2faca91e73..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase3BasicPubSub.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.testcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import java.util.Properties;
-
-/**
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Setup pub/sub test parameters and compare with test output. <td> {@link FrameworkBaseCase}
- * </table>
- */
-public class InteropTestCase3BasicPubSub extends FrameworkBaseCase
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestCase3BasicPubSub.class);
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public InteropTestCase3BasicPubSub(String name)
- {
- super(name);
- }
-
- /**
- * Performs the basic P2P test case, "Test Case 2" in the specification.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testBasicPubSub() throws Exception
- {
- log.debug("public void testBasicPubSub(): called");
-
- Properties testConfig = new Properties();
- testConfig.put("TEST_NAME", "TC3_BasicPubSub");
- testConfig.put("PUBSUB_KEY", "tc3route");
- testConfig.put("PUBSUB_NUM_MESSAGES", 10);
- testConfig.put("PUBSUB_NUM_RECEIVERS", 5);
-
- /*Message[] reports =*/ getCircuitFactory().sequenceTest(null, null, testConfig);
-
- // Compare sender and receivers reports.
- /*int messagesSent = reports[0].getIntProperty("MESSAGE_COUNT");
- int messagesReceived = reports[1].getIntProperty("MESSAGE_COUNT");
-
- Assert.assertEquals("The requested number of messages were not sent.", 10, messagesSent);
- Assert.assertEquals("Received messages did not match up to num sent * num receivers.", messagesSent * 5,
- messagesReceived);*/
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "TC3_BasicPubSub";
- }
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase4P2PMessageSize.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase4P2PMessageSize.java
deleted file mode 100644
index 2d64f2b805..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase4P2PMessageSize.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.testcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import java.util.Properties;
-
-/**
- * Implements test case 4, from the interop test specification. This test sets up the TC2_P2PMessageSize test for 50
- * messages, and a variety of message sizes. It checks that the sender and receivers reports both indicate that all
- * the test messages were transmitted successfully.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Setup p2p test parameters and compare with test output. <td> {@link FrameworkBaseCase}
- * </table>
- */
-public class InteropTestCase4P2PMessageSize extends FrameworkBaseCase
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestCase4P2PMessageSize.class);
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public InteropTestCase4P2PMessageSize(String name)
- {
- super(name);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 0K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize0K() throws Exception
- {
- runTestForMessagesOfSize(0);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 63K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize63K() throws Exception
- {
- runTestForMessagesOfSize(63 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 64K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize64K() throws Exception
- {
- runTestForMessagesOfSize(64 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 65K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize65K() throws Exception
- {
- runTestForMessagesOfSize(65 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 127K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize127K() throws Exception
- {
- runTestForMessagesOfSize(127 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 128K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize128K() throws Exception
- {
- runTestForMessagesOfSize(128 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 129K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize129K() throws Exception
- {
- runTestForMessagesOfSize(129 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 255K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize255K() throws Exception
- {
- runTestForMessagesOfSize(255 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 256K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize256K() throws Exception
- {
- runTestForMessagesOfSize(256 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 257K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testP2PMessageSize257K() throws Exception
- {
- runTestForMessagesOfSize(257 * 1024);
- }
-
- /**
- * Sends 50 test messages of the specified size, and asserts that all were received.
- *
- * @param size The size of the messages to send in bytes.
- */
- private void runTestForMessagesOfSize(int size)
- {
- Properties testConfig = new Properties();
- testConfig.setProperty("TEST_NAME", "TC4_P2PMessageSize");
- testConfig.setProperty("P2P_QUEUE_AND_KEY_NAME", "tc2queue");
- testConfig.put("P2P_NUM_MESSAGES", 50);
- testConfig.put("messageSize", size);
-
- /*Message[] reports =*/
- getCircuitFactory().sequenceTest(null, null, testConfig);
-
- // Compare sender and receivers reports.
- /*
- int messagesSent = reports[0].getIntProperty("MESSAGE_COUNT");
- int messagesReceived = reports[1].getIntProperty("MESSAGE_COUNT");
-
- Assert.assertEquals("The requested number of messages were not sent.", 50, messagesSent);
- Assert.assertEquals("Sender and receivers messages sent did not match up.", messagesSent, messagesReceived);
- */
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- *
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "TC4_P2PMessageSize";
- }
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase5PubSubMessageSize.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase5PubSubMessageSize.java
deleted file mode 100644
index 23d33fc115..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/interop/testcases/InteropTestCase5PubSubMessageSize.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.interop.testcases;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import java.util.Properties;
-
-/**
- * Implements test case 5, from the interop test specification. This test sets up the TC2_PubSubMessageSize test for 10
- * messages, sent to 5 consumers, and a variety of message sizes. It checks that the sender and receivers reports both
- * indicate that all the test messages were transmitted successfully.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Setup pub/sub test parameters and compare with test output. <td> {@link FrameworkBaseCase}
- * </table>
- */
-public class InteropTestCase5PubSubMessageSize extends FrameworkBaseCase
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestCase5PubSubMessageSize.class);
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public InteropTestCase5PubSubMessageSize(String name)
- {
- super(name);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 0K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize0K() throws Exception
- {
- runTestForMessagesOfSize(0);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 63K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize63K() throws Exception
- {
- runTestForMessagesOfSize(63 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 64K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize64K() throws Exception
- {
- runTestForMessagesOfSize(64 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 65K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize65K() throws Exception
- {
- runTestForMessagesOfSize(65 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 127K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize127K() throws Exception
- {
- runTestForMessagesOfSize(127 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 128K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize128K() throws Exception
- {
- runTestForMessagesOfSize(128 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 129K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize129K() throws Exception
- {
- runTestForMessagesOfSize(129 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 255K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize255K() throws Exception
- {
- runTestForMessagesOfSize(255 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 256K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize256K() throws Exception
- {
- runTestForMessagesOfSize(256 * 1024);
- }
-
- /**
- * Performs the P2P message test case, "Test Case 4" in the specification, for messages 257K in size.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testPubSubMessageSize257K() throws Exception
- {
- runTestForMessagesOfSize(257 * 1024);
- }
-
- /**
- * Sends 50 test messages of the specified size, and asserts that all were received.
- *
- * @param size The size of the messages to send in bytes.
- */
- private void runTestForMessagesOfSize(int size)
- {
- Properties testConfig = new Properties();
- testConfig.put("TEST_NAME", "TC5_PubSubMessageSize");
- testConfig.put("PUBSUB_KEY", "tc3route");
- testConfig.put("PUBSUB_NUM_MESSAGES", 10);
- testConfig.put("PUBSUB_NUM_RECEIVERS", 5);
- testConfig.put("messageSize", size);
-
- /*Message[] reports =*/
- getCircuitFactory().sequenceTest(null, null, testConfig);
-
- // Compare sender and receivers reports.
- /*
- int messagesSent = reports[0].getIntProperty("MESSAGE_COUNT");
- int messagesReceived = reports[1].getIntProperty("MESSAGE_COUNT");
-
- Assert.assertEquals("The requested number of messages were not sent.", 50, messagesSent);
- Assert.assertEquals("Sender and receivers messages sent did not match up.", messagesSent, messagesReceived);
- */
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "TC5_PubSubMessageSize";
- }
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedClientTestCase.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedClientTestCase.java
deleted file mode 100644
index 63e2c75509..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedClientTestCase.java
+++ /dev/null
@@ -1,906 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.sustained;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.AMQNoConsumersException;
-import org.apache.qpid.client.AMQNoRouteException;
-import org.apache.qpid.test.framework.distributedtesting.TestClient;
-import org.apache.qpid.interop.clienttestcases.TestCase3BasicPubSub;
-import org.apache.qpid.test.framework.TestUtils;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.ExceptionListener;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-import javax.jms.TextMessage;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * Implements test case 3, basic pub/sub. Sends/received a specified number of messages to a specified route on the
- * default topic exchange, using the specified number of receivers connections. Produces reports on the actual number of
- * messages sent/received.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Send required number of test messages using pub/sub. <tr><td> Generate test reports.
- * </table>
- */
-public class SustainedClientTestCase extends TestCase3BasicPubSub implements ExceptionListener, MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(SustainedClientTestCase.class);
-
- /** Used to log to the console. */
- private static final Logger console = Logger.getLogger("SustainedTest");
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The number of receivers connection to use. */
- private int numReceivers;
-
- /** The routing key to send them to on the default direct exchange. */
- private Destination sendDestination;
-
- /** The routing key to send updates to on the default direct exchange. */
- private Destination sendUpdateDestination;
-
- /** The connections to send/receive the test messages on. */
- private Connection[] connection;
-
- /** The sessions to send/receive the test messages on. */
- private Session[] session;
-
- /** The producer to send the test messages with. */
- MessageProducer producer;
-
- /** Adapter that adjusts the send rate based on the updates from clients. */
- SustainedRateAdapter _rateAdapter;
-
- /** */
- int _batchSize;
-
- private static final long TEN_MILLI_SEC = 10000000;
- private static final int DEBUG_LOG_UPATE_INTERVAL = 10;
- private static final int LOG_UPATE_INTERVAL = 10;
- private static final boolean SLEEP_PER_MESSAGE = Boolean.getBoolean("sleepPerMessage");
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the interop
- * testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- log.debug("public String getName(): called");
-
- return "Perf_SustainedPubSub";
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the assignment
- * message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role = " + role + ", Message assignRoleMessage = " + assignRoleMessage
- + "): called");
-
- // Take note of the role to be played.
- this.role = role;
-
- // Extract and retain the test parameters.
- numReceivers = assignRoleMessage.getIntProperty("SUSTAINED_NUM_RECEIVERS");
- _batchSize = assignRoleMessage.getIntProperty("SUSTAINED_UPDATE_INTERVAL");
- String sendKey = assignRoleMessage.getStringProperty("SUSTAINED_KEY");
- String sendUpdateKey = assignRoleMessage.getStringProperty("SUSTAINED_UPDATE_KEY");
- int ackMode = assignRoleMessage.getIntProperty("ACKNOWLEDGE_MODE");
- String clientName = assignRoleMessage.getStringProperty("CLIENT_NAME");
-
- if (log.isDebugEnabled())
- {
- log.debug("numReceivers = " + numReceivers);
- log.debug("_batchSize = " + _batchSize);
- log.debug("ackMode = " + ackMode);
- log.debug("sendKey = " + sendKey);
- log.debug("sendUpdateKey = " + sendUpdateKey);
- log.debug("role = " + role);
- }
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a single message producer if so.
- case SENDER:
- console.info("Creating Sender");
- // Create a new connection to pass the test messages on.
- connection = new Connection[1];
- session = new Session[1];
-
- connection[0] = TestUtils.createConnection(TestClient.testContextProperties);
- session[0] = connection[0].createSession(false, ackMode);
-
- // Extract and retain the test parameters.
- sendDestination = session[0].createTopic(sendKey);
-
- connection[0].setExceptionListener(this);
-
- producer = session[0].createProducer(sendDestination);
-
- sendUpdateDestination = session[0].createTopic(sendUpdateKey);
- MessageConsumer updateConsumer = session[0].createConsumer(sendUpdateDestination);
-
- _rateAdapter = new SustainedRateAdapter(this);
- updateConsumer.setMessageListener(_rateAdapter);
-
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages on the required number
- // of receivers connections.
- case RECEIVER:
- console.info("Creating Receiver");
- // Create the required number of receivers connections.
- connection = new Connection[numReceivers];
- session = new Session[numReceivers];
-
- for (int i = 0; i < numReceivers; i++)
- {
- connection[i] = TestUtils.createConnection(TestClient.testContextProperties);
- session[i] = connection[i].createSession(false, ackMode);
-
- sendDestination = session[i].createTopic(sendKey);
-
- sendUpdateDestination = session[i].createTopic(sendUpdateKey);
-
- MessageConsumer consumer = session[i].createConsumer(sendDestination);
-
- consumer.setMessageListener(new SustainedListener(clientName + "-" + i, _batchSize, session[i],
- sendUpdateDestination));
- }
-
- break;
- }
-
- // Start all the connection dispatcher threads running.
- for (int i = 0; i < connection.length; i++)
- {
- connection[i].start();
- }
- }
-
- /** Performs the test case actions.
- * @param numMessages*/
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // Check that the sender role is being performed.
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a single message producer if so.
- case SENDER:
- _rateAdapter.run();
- break;
- case RECEIVER:
-
- }
-
- // return from here when you have finished the test.. this will signal the controller and
- }
-
- public void terminate() throws JMSException, InterruptedException
- {
- if (_rateAdapter != null)
- {
- _rateAdapter.stop();
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- log.debug("public Message getReport(Session controlSession): called");
-
- // Close the test connections.
- for (int i = 0; i < connection.length; i++)
- {
- connection[i].close();
- }
-
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
-
- return report;
- }
-
- public void onException(JMSException jmsException)
- {
- Exception linked = jmsException.getLinkedException();
-
- if (linked != null)
- {
- if (log.isDebugEnabled())
- {
- log.debug("Linked Exception:" + linked);
- }
-
- if ((linked instanceof AMQNoRouteException) || (linked instanceof AMQNoConsumersException))
- {
- if (log.isDebugEnabled())
- {
- if (linked instanceof AMQNoConsumersException)
- {
- log.warn("No clients currently available for message:"
- + ((AMQNoConsumersException) linked).getUndeliveredMessage());
- }
- else
- {
- log.warn("No route for message");
- }
- }
-
- // Tell the rate adapter that there are no clients ready yet
- _rateAdapter.NO_CLIENTS = true;
- }
- }
- else
- {
- log.warn("Exception:" + linked);
- }
- }
-
- /**
- * Inner class that listens for messages and sends a report for the time taken between receiving the 'start' and
- * 'end' messages.
- */
- class SustainedListener implements MessageListener
- {
- /** Number of messages received */
- private long _received = 0;
- /** The number of messages in the batch */
- private int _batchSize = 0;
- /** Record of the when the 'start' messagse was sen */
- private Long _startTime;
- /** Message producer to use to send reports */
- MessageProducer _updater;
- /** Session to create the report message on */
- Session _session;
- /** Record of the client ID used for this SustainedListnener */
- String _client;
-
- /**
- * Main Constructor
- *
- * @param clientname The _client id used to identify this connection.
- * @param batchSize The number of messages that are to be sent per batch. Note: This is not used to
- * control the interval between sending reports.
- * @param session The controlSession used for communication.
- * @param sendDestination The destination that update reports should be sent to.
- *
- * @throws JMSException My occur if creatingthe Producer fails
- */
- public SustainedListener(String clientname, int batchSize, Session session, Destination sendDestination)
- throws JMSException
- {
- _batchSize = batchSize;
- _client = clientname;
- _session = session;
- _updater = session.createProducer(sendDestination);
- }
-
- public void onMessage(Message message)
- {
- if (log.isDebugEnabled())
- {
- log.debug("Message " + _received + "received in listener");
- }
-
- if (message instanceof TextMessage)
- {
- try
- {
- _received++;
- if (((TextMessage) message).getText().equals("start"))
- {
- log.debug("Starting Batch");
- _startTime = System.nanoTime();
- }
- else if (((TextMessage) message).getText().equals("end"))
- {
- if (_startTime != null)
- {
- long currentTime = System.nanoTime();
- sendStatus(currentTime - _startTime, _received, message.getIntProperty("BATCH"));
- log.debug("End Batch");
- }
- }
- }
- catch (JMSException e)
- {
- // ignore error
- }
- }
-
- }
-
- /**
- * sendStatus creates and sends the report back to the publisher
- *
- * @param time taken for the the last batch
- * @param received Total number of messages received.
- * @param batchNumber the batch number
- * @throws JMSException if an error occurs during the send
- */
- private void sendStatus(long time, long received, int batchNumber) throws JMSException
- {
- Message updateMessage = _session.createTextMessage("update");
- updateMessage.setStringProperty("CLIENT_ID", ":" + _client);
- updateMessage.setStringProperty("CONTROL_TYPE", "UPDATE");
- updateMessage.setLongProperty("RECEIVED", received);
- updateMessage.setIntProperty("BATCH", batchNumber);
- updateMessage.setLongProperty("DURATION", time);
-
- if (log.isInfoEnabled())
- {
- log.info("**** SENDING [" + batchNumber + "]**** " + "CLIENT_ID:" + _client + " RECEIVED:" + received
- + " BATCH:" + batchNumber + " DURATION:" + time);
- }
-
- // Output on the main console.info the details of this batch
- if ((batchNumber % 10) == 0)
- {
- console.info("Sending Report [" + batchNumber + "] " + "CLIENT_ID:" + _client + " RECEIVED:" + received
- + " BATCH:" + batchNumber + " DURATION:" + time);
- }
-
- _updater.send(updateMessage);
- }
- }
-
- /**
- * This class is used here to adjust the _delay value which in turn is used to control the number of messages/second
- * that are sent through the test system.
- *
- * By keeping a record of the messages recevied and the average time taken to process the batch size can be
- * calculated and so the delay can be adjusted to maintain that rate.
- *
- * Given that delays of < 10ms can be rounded up the delay is only used between messages if the _delay > 10ms * no
- * messages in the batch. Otherwise the delay is used at the end of the batch.
- */
- class SustainedRateAdapter implements MessageListener, Runnable
- {
- private SustainedClientTestCase _client;
- private long _batchVariance = Integer.getInteger("batchVariance", 3); // no. batches to allow drifting
- private long _timeVariance = TEN_MILLI_SEC * 5; // no. nanos between send and report delay (10ms)
- private volatile long _delay; // in nanos
- private long _sent;
- private Map<String, Long> _slowClients = new HashMap<String, Long>();
- private static final long PAUSE_SLEEP = TEN_MILLI_SEC / 1000; // 10 ms
- private static final long NO_CLIENT_SLEEP = 1000; // 1s
- private volatile boolean NO_CLIENTS = true;
- private int _delayShifting;
- private final int REPORTS_WITHOUT_CHANGE = Integer.getInteger("stableReportCount", 5);
- private boolean _warmedup = false;
- private static final long EXPECTED_TIME_PER_BATCH = 100000L;
- private int _warmUpBatches = Integer.getInteger("warmUpBatches", 10);
-
- SustainedRateAdapter(SustainedClientTestCase client)
- {
- _client = client;
- }
-
- public void onMessage(Message message)
- {
- if (log.isDebugEnabled())
- {
- log.debug("SustainedRateAdapter onMessage(Message message = " + message + "): called");
- }
-
- try
- {
- String controlType = message.getStringProperty("CONTROL_TYPE");
-
- // Check if the message is a test invite.
- if ("UPDATE".equals(controlType))
- {
- NO_CLIENTS = false;
- long duration = message.getLongProperty("DURATION");
- long totalReceived = message.getLongProperty("RECEIVED");
- String client = message.getStringProperty("CLIENT_ID");
- int batchNumber = message.getIntProperty("BATCH");
-
- if (log.isInfoEnabled() && ((batchNumber % DEBUG_LOG_UPATE_INTERVAL) == 0))
- {
- log.info("Update Report: CLIENT_ID:" + client + " RECEIVED:" + totalReceived + " Recevied BATCH:"
- + batchNumber + " DURATION:" + duration);
- }
-
- recordSlow(client, totalReceived, batchNumber);
-
- adjustDelay(client, batchNumber, duration);
-
- // Warm up completes when:
- // we haven't warmed up
- // and the number of batches sent to each client is at least half of the required warmup batches
- if (!_warmedup && (batchNumber >= _warmUpBatches))
- {
- _warmedup = true;
- _warmup.countDown();
-
- }
- }
- }
- catch (JMSException e)
- {
- //
- }
- }
-
- CountDownLatch _warmup = new CountDownLatch(1);
-
- int _numBatches = 10000;
-
- // long[] _timings = new long[_numBatches];
- private boolean _running = true;
-
- public void run()
- {
- console.info("Warming up");
-
- doBatch(_warmUpBatches);
-
- try
- {
- // wait for warmup to complete.
- _warmup.await();
-
- // set delay to the average length of the batches
- _delay = _totalDuration / _warmUpBatches / delays.size();
-
- console.info("Warmup complete delay set : " + _delay + " based on _totalDuration: " + _totalDuration
- + " over no. batches: " + _warmUpBatches + " with client count: " + delays.size());
-
- _totalDuration = 0L;
- _totalReceived = 0L;
- _sent = 0L;
- }
- catch (InterruptedException e)
- {
- //
- }
-
- doBatch(_numBatches);
-
- }
-
- private void doBatch(int batchSize) // long[] timings,
- {
- TextMessage testMessage = null;
- try
- {
- testMessage = _client.session[0].createTextMessage("start");
-
- for (int batch = 0; batch <= batchSize; batch++)
- // while (_running)
- {
- long start = System.nanoTime();
-
- testMessage.setText("start");
- testMessage.setIntProperty("BATCH", batch);
-
- _client.producer.send(testMessage);
- _rateAdapter.sentMessage();
-
- testMessage.setText("test");
- // start at 2 so start and end count as part of batch
- for (int m = 2; m < _batchSize; m++)
- {
- _client.producer.send(testMessage);
- _rateAdapter.sentMessage();
- }
-
- testMessage.setText("end");
- _client.producer.send(testMessage);
- _rateAdapter.sentMessage();
-
- long end = System.nanoTime();
-
- long sendtime = end - start;
-
- if (log.isDebugEnabled())
- {
- log.info("Sent batch[" + batch + "](" + _batchSize + ") in " + sendtime); // timings[batch]);
- }
-
- if ((batch % LOG_UPATE_INTERVAL) == 0)
- {
- console.info("Sent Batch[" + batch + "](" + _batchSize + ")" + status());
- }
-
- _rateAdapter.sleepBatch();
-
- }
- }
- catch (JMSException e)
- {
- console.error("Runner ended");
- }
- }
-
- private String status()
- {
- return " TotalDuration: " + _totalDuration + " for " + delays.size() + " consumers" + " Delay is " + _delay
- + " resulting in "
- + ((_delay > (TEN_MILLI_SEC * _batchSize)) ? ((_delay / _batchSize) + "/msg") : (_delay + "/batch"));
- }
-
- private void sleepBatch()
- {
- if (checkForSlowClients())
- { // if there werwe slow clients we have already slept so don't sleep anymore again.
- return;
- }
-
- if (!SLEEP_PER_MESSAGE)
- {
- // per batch sleep.. if sleep is to small to spread over the batch.
- if (_delay <= (TEN_MILLI_SEC * _batchSize))
- {
- sleepLong(_delay);
- }
- else
- {
- log.info("Not sleeping _delay > ten*batch is:" + _delay);
- }
- }
- }
-
- public void stop()
- {
- _running = false;
- }
-
- Map<String, Long> delays = new HashMap<String, Long>();
- Long _totalReceived = 0L;
- Long _totalDuration = 0L;
- int _skipUpdate = 0;
-
- /**
- * Adjust the delay for sending messages based on this update from the client
- *
- * @param client The client that send this update
- * @param duration The time taken for the last batch of messagse
- * @param batchNumber The reported batchnumber from the client
- */
- private void adjustDelay(String client, int batchNumber, long duration)
- {
- // Retrieve the current total time taken for this client.
- Long currentTime = delays.get(client);
-
- // Add the new duration time to this client
- if (currentTime == null)
- {
- currentTime = duration;
- }
- else
- {
- currentTime += duration;
- }
-
- delays.put(client, currentTime);
-
- long batchesSent = _sent / _batchSize;
-
- // ensure we don't divide by zero
- if (batchesSent == 0)
- {
- batchesSent = 1L;
- }
-
- _totalReceived += _batchSize;
- _totalDuration += duration;
-
- // calculate average duration accross clients per batch
- long averageDuration = _totalDuration / delays.size() / batchesSent;
-
- // calculate the difference between current send delay and average report delay
- long diff = (duration) - averageDuration;
-
- if (log.isInfoEnabled() && ((batchNumber % DEBUG_LOG_UPATE_INTERVAL) == 0))
- {
- log.info("TotalDuration:" + _totalDuration + " for " + delays.size() + " consumers." + " on batch: "
- + batchesSent + " received batch: " + batchNumber + " Batch Duration: " + duration + " Average: "
- + averageDuration + " so diff: " + diff + " for : " + client + " Delay is " + _delay + " resulting in "
- + ((_delay > (TEN_MILLI_SEC * _batchSize)) ? ((_delay / _batchSize) + "/msg") : (_delay + "/batch")));
- }
-
- // if the averageDuration differs from the current by more than the specified variane then adjust delay.
- if (Math.abs(diff) > _timeVariance)
- {
-
- // if the the _delay is larger than the required duration to send report
- // speed up
- if (diff > TEN_MILLI_SEC)
- {
- _delay -= TEN_MILLI_SEC;
-
- if (_delay < 0)
- {
- _delay = 0;
- log.info("Reset _delay to 0");
- delayStable();
- }
- else
- {
- delayChanged();
- }
-
- }
- else if (diff < 0) // diff < 0 diff cannot be 0 as it is > _timeVariance
- {
- // the report took longer
- _delay += TEN_MILLI_SEC;
- delayChanged();
- }
- }
- else
- {
- delayStable();
- }
-
- // If we have a consumer that is behind with the batches.
- if ((batchesSent - batchNumber) > _batchVariance)
- {
- log.debug("Increasing _delay as sending more than receiving");
-
- _delay += 2 * TEN_MILLI_SEC;
- delayChanged();
- }
-
- }
-
- /** Reset the number of iterations before we say the delay has stabilised. */
- private void delayChanged()
- {
- _delayShifting = REPORTS_WITHOUT_CHANGE;
- }
-
- /**
- * Record the fact that delay has stabilised If delay has stablised for REPORTS_WITHOUT_CHANGE then it will
- * output Delay stabilised
- */
- private void delayStable()
- {
- _delayShifting--;
-
- if (_delayShifting < 0)
- {
- _delayShifting = 0;
- console.debug("Delay stabilised:" + _delay);
- }
- }
-
- /**
- * Checks that the client has received enough messages. If the client has fallen behind then they are put in the
- * _slowClients lists which will increase the delay.
- *
- * @param client The client identifier to check
- * @param received the number of messages received by that client
- * @param batchNumber
- */
- private void recordSlow(String client, long received, int batchNumber)
- {
- if (Math.abs(batchNumber - (_sent / _batchSize)) > _batchVariance)
- {
- _slowClients.put(client, received);
- }
- else
- {
- _slowClients.remove(client);
- }
- }
-
- /** Incrment the number of sent messages and then sleep, if required. */
- public void sentMessage()
- {
-
- _sent++;
-
- if (_delay > (TEN_MILLI_SEC * _batchSize))
- {
- long batchDelay = _delay / _batchSize;
- // less than 10ms sleep doesn't always work.
- // _delay is in nano seconds
- // if (batchDelay < (TEN_MILLI_SEC))
- // {
- // sleep(0, (int) batchDelay);
- // }
- // else
- {
- // if (batchDelay < 30000000000L)
- {
- sleepLong(batchDelay);
- }
- }
- }
- else
- {
- if (SLEEP_PER_MESSAGE && (_delay > 0))
- {
- sleepLong(_delay / _batchSize);
- }
- }
- }
-
- /**
- * Check at the end of each batch and pause sending messages to allow slow clients to catch up.
- *
- * @return true if there were slow clients that caught up.
- */
- private boolean checkForSlowClients()
- {
- // This will allways be true as we are running this at the end of each batchSize
- // if (_sent % _batchSize == 0)
- {
- // Cause test to pause when we have slow
- if (!_slowClients.isEmpty() || NO_CLIENTS)
- {
-
- while (!_slowClients.isEmpty())
- {
- if (log.isInfoEnabled() && ((_sent / _batchSize % DEBUG_LOG_UPATE_INTERVAL) == 0))
- {
- String clients = "";
- Iterator it = _slowClients.keySet().iterator();
- while (it.hasNext())
- {
- clients += it.next();
- if (it.hasNext())
- {
- clients += ", ";
- }
- }
-
- log.info("Pausing for slow clients:" + clients);
- }
-
- if (console.isDebugEnabled() && ((_sent / _batchSize % LOG_UPATE_INTERVAL) == 0))
- {
- console.debug(_slowClients.size() + " slow clients.");
- }
-
- sleep(PAUSE_SLEEP);
- }
-
- if (NO_CLIENTS)
- {
- sleep(NO_CLIENT_SLEEP);
- }
-
- log.debug("Continuing");
-
- return true;
- }
- else
- {
- if ((_sent / _batchSize % LOG_UPATE_INTERVAL) == 0)
- {
- console.info("Total Delay :" + _delay + " "
- + ((_delayShifting == 0) ? "Stablised" : ("Not Stablised(" + _delayShifting + ")")));
- }
- }
-
- }
-
- return false;
- }
-
- /**
- * Sleep normally takes micro-seconds this allows the use of a nano-second value.
- *
- * @param delay nanoseconds to sleep for.
- */
- private void sleepLong(long delay)
- {
- sleep(delay / 1000000, (int) (delay % 1000000));
- }
-
- /**
- * Sleep for the specified micro-seconds.
- * @param sleep microseconds to sleep for.
- */
- private void sleep(long sleep)
- {
- sleep(sleep, 0);
- }
-
- /**
- * Perform the sleep , swallowing any InteruptException.
- *
- * NOTE: If a sleep request is > 10s then reset only sleep for 5s
- *
- * @param milli to sleep for
- * @param nano sub miliseconds to sleep for
- */
- private void sleep(long milli, int nano)
- {
- try
- {
- log.debug("Sleep:" + milli + ":" + nano);
- if (milli > 10000)
- {
-
- if (_delay == milli)
- {
- _totalDuration = _totalReceived / _batchSize * EXPECTED_TIME_PER_BATCH;
- log.error("Sleeping for more than 10 seconds adjusted to 5s!:" + (milli / 1000)
- + "s. Reset _totalDuration:" + _totalDuration);
- }
- else
- {
- log.error("Sleeping for more than 10 seconds adjusted to 5s!:" + (milli / 1000) + "s");
- }
-
- milli = 5000;
- }
-
- Thread.sleep(milli, nano);
- }
- catch (InterruptedException e)
- {
- //
- }
- }
-
- public void setClient(SustainedClientTestCase client)
- {
- _client = client;
- }
- }
-
-}
diff --git a/qpid/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedTestCase.java b/qpid/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedTestCase.java
deleted file mode 100644
index 0077b4727a..0000000000
--- a/qpid/java/integrationtests/src/main/java/org/apache/qpid/sustained/SustainedTestCase.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.sustained;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.test.framework.DropInTest;
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-
-import java.util.Properties;
-
-/**
- * SustainedTestCase is a {@link FrameworkBaseCase} that runs the "Perf_SustainedPubSub" test case. This consists of one
- * test client sending, and several receiving, and attempts to find the highest rate at which messages can be broadcast
- * to the receivers. It is also a {@link DropInTest} to which more test clients may be added during a test run.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td>
- * </table>
- */
-public class SustainedTestCase extends FrameworkBaseCase implements DropInTest
-{
- /** Used for debugging. */
- Logger log = Logger.getLogger(SustainedTestCase.class);
-
- /** Holds the root name of the topic on which to send the test messages. */
- private static final String SUSTAINED_KEY = "Perf_SustainedPubSub";
-
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public SustainedTestCase(String name)
- {
- super(name);
- }
-
- /**
- * Performs a single test run of the sustained test.
- *
- * @throws Exception Any exceptions are allowed to fall through and fail the test.
- */
- public void testBasicPubSub() throws Exception
- {
- log.debug("public void testSinglePubSubCycle(): called");
-
- Properties testConfig = new Properties();
- testConfig.put("TEST_NAME", "Perf_SustainedPubSub");
- testConfig.put("SUSTAINED_KEY", SUSTAINED_KEY);
- testConfig.put("SUSTAINED_NUM_RECEIVERS", Integer.getInteger("numReceives", 2));
- testConfig.put("SUSTAINED_UPDATE_INTERVAL", Integer.getInteger("batchSize", 1000));
- testConfig.put("SUSTAINED_UPDATE_KEY", SUSTAINED_KEY + ".UPDATE");
- testConfig.put("ACKNOWLEDGE_MODE", Integer.getInteger("ackMode", AMQSession.AUTO_ACKNOWLEDGE));
-
- log.info("Created Config: " + testConfig.entrySet().toArray());
-
- getCircuitFactory().sequenceTest(null, null, testConfig);
- }
-
- /**
- * Accepts a late joining client into this test case. The client will be enlisted with a control message
- * with the 'CONTROL_TYPE' field set to the value 'LATEJOIN'. It should also provide values for the fields:
- *
- * <p/><table>
- * <tr><td> CLIENT_NAME <td> A unique name for the new client.
- * <tr><td> CLIENT_PRIVATE_CONTROL_KEY <td> The key for the route on which the client receives its control messages.
- * </table>
- *
- * @param message The late joiners join message.
- *
- * @throws JMSException Any JMS Exception are allowed to fall through, indicating that the join failed.
- */
- public void lateJoin(Message message) throws JMSException
- {
- throw new RuntimeException("Not implemented.");
- /*
- // Extract the joining clients details from its join request message.
- TestClientDetails clientDetails = new TestClientDetails();
- clientDetails.clientName = message.getStringProperty("CLIENT_NAME");
- clientDetails.privateControlKey = message.getStringProperty("CLIENT_PRIVATE_CONTROL_KEY");
-
- // Register the joining client, but do block for confirmation as cannot do a synchronous receivers during this
- // method call, as it may have been called from an 'onMessage' method.
- assignReceiverRole(clientDetails, new Properties(), false);
- */
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as known to the test
- * clients that will run the test. The purpose of this is to convert the JUnit method name into the correct test
- * case name to place into the test invite. For example the method "testP2P" might map onto the interop test case
- * name "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- *
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "Perf_SustainedPubSub";
- }
-}
diff --git a/qpid/java/integrationtests/src/resources/sustained-log4j.xml b/qpid/java/integrationtests/src/resources/sustained-log4j.xml
deleted file mode 100644
index c5ab3137bf..0000000000
--- a/qpid/java/integrationtests/src/resources/sustained-log4j.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0"?>
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
-
-
- <appender name="FileAppender" class="org.apache.log4j.FileAppender">
- <param name="File" value="${QPID_WORK}/log/${logprefix}qpid${logsuffix}.log"/>
- <param name="Append" value="false"/>
-
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
- </layout>
- </appender>
-
- <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
-
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d %-5p (%F:%L) - %m%n"/>
- <!--param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/-->
- </layout>
- </appender>
-
- <category name="SustainedTest">
- <priority value="${sustained.level}"/>
- </category>
-
- <category name="org.apache">
- <priority value="warn"/>
- </category>
-
- <category name="org.apache.qpid.interop">
- <priority value="${interop.logging.level}"/>
- </category>
-
-
- <category name="org.apache.qpid.sustained">
- <priority value="${amqj.logging.level}"/>
- </category>
-
- <!--category name="org.apache.qpid.server.txn">
- <priority value="debug"/>
- </category>-->
-
- <root>
- <priority value="all"/>
- <appender-ref ref="STDOUT"/>
- <!--appender-ref ref="ArchivingFileAppender"/-->
- </root>
-</log4j:configuration>
diff --git a/qpid/java/jca/README.txt b/qpid/java/jca/README.txt
index 29e6825c4c..6fdd028349 100644
--- a/qpid/java/jca/README.txt
+++ b/qpid/java/jca/README.txt
@@ -5,7 +5,7 @@ Overview
The Qpid Resource Adapter is a JCA 1.5 compliant resource adapter that allows
for JEE integration between EE applications and AMQP 0.10 message brokers.
-The adapter provides both outbound and inbound connectivity and
+The Qpid JCA adapter provides both outbound and inbound connectivity and
exposes a variety of options to fine tune your messaging applications. Currently
the adapter only supports C++ based brokers and has only been tested with Apache Qpid C++ broker.
@@ -31,10 +31,9 @@ When a ManagedConnectionFactory JavaBean or ActivationSpec JavaBean are deployed
the configuration properties from the ResourceAdapter or provide specific properties which in turn will override
the defaults.
-While some of the properties from the three componets are specific to the JCA adapter, a majority of the
-properties directly correspond the the Qpid JMS client. As such, it is strongly encouraged your familiarize
-yourself with the correct syntax, configuration options for the JMS client as well as the JCA adapter. Similarly,
-familiarity with the 1.5 JCA specification is encouraged though not strictly required.
+While some of the properties from the three components are specific to the JCA adapter, a majority of the
+properties directly correspond the the Qpid JMS client. As such, familiarity with the Qpid JMS Client is strongly
+encouraged. Similarly, familiarity with the JCA 1.5 specification is encouraged though not strictly required.
The ResourceAdapter JavaBean
============================
@@ -65,14 +64,6 @@ UseLocalTx
Whether or not to use local transactions instead of XA.
Default: false
-DefaultUserName
- The default user name to use.
-Default: guest
-
-DefaultPassword
- The default password to use.
-Default: guest
-
Host
The hostname/ip address of the broker.
Default: localhost
@@ -87,23 +78,23 @@ Default: test
ConnectionURL
The full connection URL to the broker.
-Default:amqp://guest:guest@/test?brokerlist='tcp://localhost:5672'
+Default: amqp://anonymous:passwd@client/test?brokerlist='tcp://localhost?sasl_mechs='PLAIN''
TransactionManagerLocatorClass
- The class responsible for locating the transaction manager within a specific application server. This is a ResourceAdapter
- Java Bean specific property and is application server specific. As such, it is currently commented out. Two examples have
- been provided.
+ The class responsible for locating the transaction manager within a specific application server.
+ This is a ResourceAdapter Java Bean specific property and is application server specific, as such,
+ no default is provided.
Default: none
TransactionManagerLocatorMethod
- The specific method on the class above used to acquire a reference to the platform specific transaction manager.
- This is a ResourceAdapter Java Bean specific property and is application server specific.
- As such, it is currently commented out. Two examples have been provided.
+ The specific method on the TransactionManagerLocatorClass used to acquire a reference to the platform
+ specific transaction manager. This is a ResourceAdapter Java Bean specific property and is application
+ server specific as such, no default is provided.
Default:none
-Note, if you require XA support, both the TransactionManagerLocatorClass and the TransactionManagerLocatorMethod
-properties MUST be set. While application servers typically provide a mechanism to do this in the form of a specific
-deployment descriptor, or GUI console, the ra.xml file can also be modified directly.
+Note, both the TransactionManagerLocatorClass and the TransactionManagerLocatorMethod
+properties must be set. While application servers typically provide a mechanism to do this in the form of
+a specific deployment descriptor, or GUI console, the ra.xml file can also be modified directly.
The ManagedConnectionFactory JavaBean
=====================================
@@ -112,28 +103,16 @@ The ManagedConnectionFactory JavaBean provides outbound connectivity for the Qpi
inherited from the ResourceAdapter JavaBean, the ManagedConnectionFactory JavaBean provides specific properties only applicable
to outbound connectivity.
-sessionDefaulType
+SessionDefaulType
The default type of Session. Currently unused.
Default: java.jms.Queue
-useTryLock
+UseTryLock
Multi-purpose property used to specify both that a lock on the underlying managed connection should be used, as well as the
wait duration to aquire the lock. Primarily used for transaction management. A null or zero value will atttempt to acquire
the lock without a duration. Anything greater than zero will wait n number of seconds before failing to acquire the lock.
Default:0
-KeyStorePassword
- The KeyStore password for SSL
-Default:none
-
-KeyStorePath
- The path to the KeyStore.
-Default:none
-
-CertType
- The type of certificate.
-Default:SunX509
-
The ActivationSpec JavaBean
===========================
The ActivationSpec JavaBean provides inbound connectivity for the Qpid JCA adapter. In addition to most of the properties
@@ -149,7 +128,7 @@ UseJNDI
Default: true
Destination
- The name of the destination on which to listen for messages.
+ The JNDI name of the destination on which to listen for messages.
Default:none
DestinationType
@@ -187,49 +166,49 @@ PrefetchLow
PrefetchHigh
Qpid specific -- TODO more explanation
-
+SetupA
Administered Objects
======================
The JCA specification provides for administered objects. Ass per the specification, administered objects are
-JavaBeans that specific to the messaging provider. The Qpid JCA Resource Adapter provides two administered
+JavaBeans that specific to the messaging provider. The Qpid JCA Resource Adapter provides three administered
objects that can be used to configure JMS destinations and a specialized JMS Connection Factory respectively.
Both these administered objects have properities to support configuration and deployment.
-QpidDestinationProxy
+QpidQueue/QpidTopic
====================
- The QpidDestinationProxy allows a developer, deployer or adminstrator to create destinations (queues or topic) and
- bind these destinations into JNDI. The following lists the properties applicable to the QpidDestinationProxy
-
-destinationType
- The type of destination to create. Valid values are QUEUE or TOPIC.
+ The QpidQueue/QpidTopic AdminObjects allow a developer, deployer or adminstrator to create destinations
+ (queues or topic) and bind these destinations into JNDI. Only one property is required:
-destinationAddress
+DestinationAddress
The address string of the destination. Please see the Qpid Java JMS client documentation for valid values.
+Example:
+ DestinationAddress=hello.Queue;{create:always, node:{type:queue, x-declare:{auto-delete:true}}}
+ DestinationAddress=amq.topic/hello.Topic
+
QpidConnectionFactoryProxy
+==========================
The QpidConnectionFactoryProxy allows for a non-JCA ConnectionFactory to be bound into the JNDI tree. This
ConnectionFactory can in turn be used outside of the application server. Typically a ConnectionFactory of
- this sort is used by Swing or other two-tier clients not requiring JCA. The QpidConnectionFactoryProxy provides
- one property
+ this sort is used by Java Swing or other non-managed clients not requiring JCA. One one property is
+ required:
-connectionURL
+ConnectionURL
This is the url used to configure the connection factory. Please see the Qpid Java Client documentation for
further details.
+Example:
+ amqp://anonymous:passwd@client/test?brokerlist='tcp://localhost:5672?sasl_mechs='PLAIN''
Transaction Support
===================
The Qpid JCA Resource Adapter provides three levels of transaction support: XA, LocalTransactions and NoTransaction.
Typical usage of the Qpid JCA Resource adapter implies the use of XA transactions, though there are certain scenarios
where this is not preferred. Transaction support configuration is application server specific and as such, is explained
-in the corresponding documentation for each supported application server. However, there are two limitations with
-the Qpid JCA adapter at this time:
-
-1) Currently, the Qpid C++ broker does not support he use of XA within the context of clustered brokers. As such, if
-you are running in a cluster, you will need to configure the adapter to use LocalTransactions.
+in the corresponding documentation for each supported application server. Current limitations with XA are listed
+below:
-2)XARecovery is currently not implemented. In the case of a system failure, in doubt transactions will have to be
-manually resolved by and administrator or otherwise qualified personnel.
+1)XARecovery is currently only supported for JBoss EAP 5.x and is not supported for clustered broker configurations.
Conclusion
==========
diff --git a/qpid/java/jca/example/.gitignore b/qpid/java/jca/example/.gitignore
index 71337b619c..624fd61581 100644
--- a/qpid/java/jca/example/.gitignore
+++ b/qpid/java/jca/example/.gitignore
@@ -1,3 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
build/*
lib/*
+*.swp
build-properties.xml
diff --git a/qpid/java/jca/example/README-EXAMPLE.txt b/qpid/java/jca/example/README-EXAMPLE.txt
new file mode 100644
index 0000000000..3a2ee0c38e
--- /dev/null
+++ b/qpid/java/jca/example/README-EXAMPLE.txt
@@ -0,0 +1,235 @@
+Qpid JCA Example
+
+Overview
+========
+The Qpid JCA example provides a sample JEE application that demonstrates how to
+configure, install and run applications using the Qpid JCA adapter for JEE
+connectivity and the Apache Qpid C++ Broker. This example code can be used as a
+convenient starting point for your own development and deployment
+efforts.
+
+Example Components
+===================
+Currently the example application consists of the following components:
+
+Destinations
+============
+Any messaging application relies on destinations (queues or topics )
+in order to produce or consume messages.The Qpid JCA example provides
+the following destinations:
+
+ HelloTopic
+ GoodByeTopic
+ HelloQueue
+ GoodByeQueue
+ QpidRequestQueue
+ QpidResponseQueue
+
+Each destination is configured for the respective application server in which
+the examples will be run. Generally the example application allows for sending
+messages to a Hello<DestinationType>. Depending on a configuration option, once
+a message is received by the Hello component, the Hello component can also be
+sent to a GoodBye<DestinationType> component.
+
+The QpidRequest/Response destinations provide the destinations for the
+request/reponse messaging pattern.
+
+
+ConnectionFactories
+===================
+Similar to destinations, ConnectionFactories are a core component of both JMS
+and JCA. ConnectionFactories provide the necessary starting point to make a
+connection, establish a session and produce or consume (or both) messages from
+your JMS provider.
+
+The Qpid JCA example provides three connection factories by default:
+
+ QpidJMSXA
+ QpidJMS
+ QpidConnectionFactory
+
+Each of these ConnectionFactories varies in their capabilities and the context in which
+they should be used. By default, the Qpid JCA examples use the QpidJMSXA connection factory
+which provides for full XA transaction support. The QpidJMS connection factory provides a
+local JMS transaction CF and is currently deprecated, though it has been maintained for
+backwards compatibility. The QpidConnectionFactory is a specialized ConnectionFactory designed
+to be used outside of a JEE application server. This CF has been provided to support non-managed
+clients that want to use the JNDI facilities of JEE.
+
+The deployment configuration for destinations, and ConnectionFactories varies by JEE platform.
+Please see the application server specific documentation for specific instructions.
+
+EJB 3.x
+
+There are a six EJB 3.x components provided as part of the example.
+
+ QpidHelloSubscriberBean - MessageDrivenBean (MDB)
+ QpidGoodByeSubscriberBean - (MDB)
+ QpidHelloListenerBean - (MDB)
+ QpidGoodByeListenerBean - (MDB)
+ QpidJMSResponderBean - (MDB)
+ QpidTestBean - Stateless Session Bean (SLSB)
+
+Generally, the name of the EJB component corresponds to the aforementioned destinations
+listed above in the consumption of messages.
+
+QpidTestServlet
+A sample EE 2.5 servlet is provided allowing testing from a browser versus a RMI or JMS
+based client.
+
+QpidTestClient
+A Java based client allowing for both RMI or JMS access to the sample application. RMI or
+JMS access is based on configuration options.
+
+QpidRequestResponseClient
+A Java based client allowing for a request/response application.
+
+EE EAR archive
+ An EAR wrapper for the ejb and web components.
+
+A build.xml file
+ An ant build.xml file to configure, install and deploy the aforementioned components.
+
+Requirements
+============
+Apache Qpid Broker
+To run the sample it is assumed you have an Apache Qpid C++ broker configured and running.
+The example code assumes that the broker will run at localhost on port 5672. The broker
+address can be modified in the build-properties.xml file.
+
+Examples
+===============
+Using the Qpid JCA examples is the same regardless of preferred JEE application server.
+The provided clients and supported options are listed below.
+
+QpidTestClient
+==============
+As previously mentioned, the Qpid JCA example provides an RMI/JMS Java client to test
+the application. Executing the command
+
+ant-run client
+
+will execute the QpidTestClient client with the default options.
+
+QpidTestClient Options
+
+client.use.ejb (build.xml)
+Setting this value to false will result in the QpidTestClient using JMS to send messages to
+the configured destination.
+Default:true
+
+client.message
+The text content of the JMS message sent to the configured destination.
+Default: Hello Qpid World!
+
+client.message.count
+The number of messages that will be sent to the configured destionation.
+Default: 1
+
+client.use.topic
+Setting this value to true will send messages to HelloTopic versus HelloQueue.
+Default:false
+
+client.say.goodbye
+Setting this value to true will cause the listener on the Hello Queue/Topic to send a
+message to the GoodBye Queue/Topic
+Default:false
+
+
+QpidRequestResponseClient
+=========================
+Similar to the QpidTestClient, the QpidRequestResponseClient is a Java based application that allows for
+sending messages to a destination. The QpidRequestResponseClient also provides the capability for the
+application to listen for a response. Executing the command
+
+ant run-reqresp
+
+will run the application with the default options.
+
+QpidRequestResponseClient Options
+
+QpidTestServlet
+===============
+Similar to the QpidTestClient application, the Qpid JCA examples also provides a JEE Servlet to test and run the
+application. This Servlet can be used as an alternative, or in conjunction with the Java application. The Servlet
+can be reached via the following URL:
+
+http://<server-host-name>:<server-port>/qpid-jca-web/qpid
+
+where server-host and server-port are the host and port where you are running your application server.
+
+QpidTestServlet Options
+
+The QpidTestServlet options can be configured by appending certain values to the above URL. These values are
+listed below and generally correspond, both in name and purpose, to the Java application configuration options.
+
+message
+The text content of the JMS message sent to the configured destination.
+Default: Hello World!
+
+useEJB
+Setting this value to true will result in the QpidTestServlet using the QpidTestBean SLSB to
+send the message to the configured destination. By default the QpidTestServlet uses JMS.
+Default:false
+
+count
+The number of messages that will be sent to the configured destionation.
+Default: 1
+
+useTopic
+Setting this value to true will send messages to HelloTopic versus HelloQueue.
+Default:false
+
+sayGoodBye
+Setting this value to true will cause the listener on the Hello Queue/Topic to send a
+message to the GoodBye Queue/Topic
+Default:false
+
+useXA
+Setting this value to true will cause the QpidTestServlet to do all activity within the
+context of an XA transaction.
+Default:false
+
+useTX
+Setting this value to true will cause the QpidTestServlet to do all activity within the
+context of a JMS transation.
+Default:false
+
+
+Note, the useXA and useTX are mutually exclusive. Setting both to true, the QpidTestServlet
+will choose XA over a JMS transaction.
+
+QpidRequestResponseServlet
+==========================
+Similar to the QpidRequestResponseClient application, the Qpid JCA examples also provides a JEE Servlet
+to execute the request/response type messaging pattern. The Servlet can be reached via the following url:
+
+http://<server-host-name>:<server-port>/qpid-jca-web/qpid-reqresp
+
+where server-host and server-port are the host and port where you are running your application server.
+
+QpidRequestResponseServlet Options
+
+message
+The text content of the JMS message sent to the configured destination.
+Default: Hello World!
+
+count
+The number of messages that will be sent to the configured destionation.
+Default: 1
+
+useXA
+Setting this value to true will cause the QpidTestServlet to do all activity within the
+context of an XA transaction.
+Default:false
+
+Summary
+=======
+While conceptually simple, the Qpid JCA examples provide a majority of the component types and messaging patterns
+you are most likely to use your development efforts. With the Web and EJB components, you can experiment with
+various aspects of JCA as well as EE development in general using the Qpid Broker as your messaging provider.
+While this documentation highlights the major components and steps needed to take to get the example running,
+the possiblities for modifcation are numerous. You are encouraged to experiment with the example as you work
+to develop your own messaging applications.
+
+
diff --git a/qpid/java/jca/example/README-GERONIMO.txt b/qpid/java/jca/example/README-GERONIMO.txt
new file mode 100644
index 0000000000..d58d034c79
--- /dev/null
+++ b/qpid/java/jca/example/README-GERONIMO.txt
@@ -0,0 +1,69 @@
+Qpid JCA Example - Apache Geronimo 2.x
+
+Overview
+========
+This document explains the steps required to configure and
+deploy the Qpid JCA examples for the Apache Geronimo environment.
+General information can be found in the README.txt file.
+
+The Apache Geronimo environment provides two methods for deploying
+JEE application components: the web-based administration console and the
+command line based deployment environment. This document only explains
+the command line environment. Please see the Apache Geronimo 2.x
+documentation for the web-based console.
+
+Requirements
+============
+In order to deploy the Qpid JCA adapter, as well as the example application,
+the GERONIMO_HOME environemnt variable must be set. The environment variable
+should point to the root of your Apache Geronimo 2.x install directory.
+
+In order to automatically deploy the Qpid JCA Adapter, the QPID_JCA_HOME
+environment variable needs to be set. The environment variable should point
+to the directory which contains the Qpid JCA Adapter. If building from the
+source tree, by default this can be found at
+
+QPID_ROOT/java/build/lib
+
+If installing from RPM or other binary distribution, this can vary by platform.
+
+Prior to deploying any application component, the Apache Geronimo application
+should be started and available for requests.
+
+
+Deploy the Qpid JCA Adapter
+==============================
+Once the above requirements are satisfied the command
+
+ant deploy-rar
+
+will attempt to use the Apache Geronimo deployer to install the Qpid JCA
+adapter into the Apache Geronimo environment. Any errors will be reported
+back to the client for further examination. Once the above command executes
+successfully, the Qpid JCA adapter has been deployed, configured and is ready
+for use.
+
+
+Deploy the Qpid JCA Examples
+============================
+After the Qpid JCA adapter is deployed, executing the command
+
+ant deploy-ear
+
+will attempt to use the Apache Geronimo deploy to install the Qpid JCA
+example EAR into the Apache Geronimo environment. Any errors will be reported
+back to the client for further examination. Once the above command executes
+successfully, the Qpid JCA example application is deployed, configured and ready
+for use.
+
+The build-geronimo-properties.xml file contain Apache Geronimo specific values
+and Ant targets that can be used to suit your development requirements.
+
+The README.txt file in this directory provides the necessary instructions for using the Qpid JCA
+adapter and example application.
+
+
+
+
+
+
diff --git a/qpid/java/jca/example/README-GLASSFISH.txt b/qpid/java/jca/example/README-GLASSFISH.txt
new file mode 100644
index 0000000000..1b73ba68fd
--- /dev/null
+++ b/qpid/java/jca/example/README-GLASSFISH.txt
@@ -0,0 +1,84 @@
+Qpid JCA Example - Glassfish 3.x
+
+Overview
+========
+This document explains the steps required to configure and
+deploy the Qpid JCA examples for the Glassfish 3.x environment.
+
+The Glassfish environment provides two methods for deploying
+JEE application components: the web-based administration console
+and the asadmin command line utility. This document only explains
+the command line utility. Please see the Glassfish 3.x
+documentation for the web-based console approach.
+
+Requirements
+============
+In order to deploy the Qpid JCA adapter, as well as the example application,
+the GLASSFISH_HOME environemnt variable must be set. The environment variable
+should point to the root of your Glassfish installation.
+
+In order to automatically deploy the Qpid JCA Adapter from the build system,
+the QPID_JCA_HOME environment variable needs to be set.
+The environment variable should point to the directory which contains the
+Qpid JCA Adapter. If building from the source tree, by default this can be found at
+
+QPID_ROOT/java/build/lib
+
+If installing from RPM or other binary distribution, this can vary by OS platform.
+
+The Qpid JCA examples assume the Apache Geronimo application server as the default
+target platform. This can be modified in two ways:
+
+1) Modify the build.xml file and change the target.platform property:
+
+Example:
+
+ <!-- Valid target platforms are currently geronimo, jboss, jboss7, glassfish -->
+ <property name="target.platform" value="glassfish"/>
+
+2) Set the target.platform property via the command line:
+
+Example:
+
+ant -Dtarget.platform=glassfish <target>
+
+Note, if you choose the second method, all command line invocations must include
+the target.platform variable. For the remainder of this document, we will assume
+the second approach.
+
+Prior to deploying any application component, the Glassfish application server
+should be started and available for requests.
+
+
+Deploy and configure the Qpid JCA Adapter
+==============================
+Once the above requirements are satisfied the command
+
+ant -Dtarget.platform=glassfish deploy-rar
+
+will attempt to invoke the asadmin utility to deploy and configure the
+Qpid JCA adapter. Once this step completes succesfully the Qpid JCA adapter
+is deployed, configured and ready for use.
+
+
+Deploy the Qpid JCA Examples
+============================
+After the Qpid JCA adapter is deployed, executing the command
+
+ant -Dtarget.platform=glassfish deploy-ear
+
+will attempt to deploy the Qpid JCA example EAR into the Glassfish environment.
+Once the above command executes successfully, the Qpid JCA example application
+is deployed, configured and ready for use.
+
+The build-glassfish-properties.xml file contains Glassfish specific configuration options
+and Ant targets that can be used to suit your development requirements. Executing
+
+ant -Dtarget.platform=glassfish -p
+
+will list the appropriate targets and provide a simple description for each.
+
+The README.txt file in this directory provides the necessary instructions for using
+the Qpid JCA adapter and example application which is consistent across all supported
+JEE platforms.
+
diff --git a/qpid/java/jca/example/README-JBOSS.txt b/qpid/java/jca/example/README-JBOSS.txt
new file mode 100644
index 0000000000..e23b3ba308
--- /dev/null
+++ b/qpid/java/jca/example/README-JBOSS.txt
@@ -0,0 +1,107 @@
+Qpid JCA Example - JBoss EAP 5.x, JBoss 5.x, 6.x
+
+Overview
+========
+This document explains the steps required to configure and
+deploy the Qpid JCA examples for both the JBoss EAP 5.x
+environment as well as the JBoss 5.x/6.x community edition
+(herafter simply referred to as JBoss). General information
+can be found in the README.txt file.
+
+Requirements
+============
+In order to deploy the Qpid JCA adapter, as well as the example application,
+the JBOSS_HOME environemnt variable must be set. The environment variable
+should point to the root of your JBoss installation.
+
+In order to automatically deploy the Qpid JCA Adapter from the build system,
+the QPID_JCA_HOME environment variable needs to be set.
+The environment variable should point to the directory which contains the
+Qpid JCA Adapter. If building from the source tree, by default this can be found at
+
+QPID_ROOT/java/build/lib
+
+If installing from RPM or other binary distribution, this can vary by platform.
+
+If you do not want to use the build system to deploy the Qpid JCA adapter, you
+can simply copy the qpid-ra-0.<version>.rar file to the
+
+JBOSS_HOME/server/<server-name>/deploy
+
+directory. By default, the example assumes the JBoss 'default' server profile will
+be used. This can be modified in the build-jboss-properties.xml file.
+
+The Qpid JCA examples assume the Apache Geronimo application server as the default
+target platform. This can be modified in two ways:
+
+1) Modify the build.xml file and change the target.platform property:
+
+Example:
+
+ <!-- Valid target platforms are currently geronimo, jboss, jboss7, glassfish -->
+ <property name="target.platform" value="jboss"/>
+
+2) Set the target.platform property via the command line:
+
+Example:
+
+ant -Dtarget.platform=jboss <target>
+
+Note, if you choose the second method, all command line invocations must include
+the target.platform. For the remainder of this document, we will assume the second
+approach.
+
+Prior to deploying any application component, the JBoss application server
+should be started and available for requests.
+
+
+
+
+Deploy and configure the Qpid JCA Adapter
+==============================
+Once the above requirements are satisfied the command
+
+ant -Dtarget.platform= jboss deploy-rar
+
+will copy the Qpid JCA adapter to JBoss server deploy directory.
+
+To configure JCA resources in the JBoss environment, the *-ds.xml configuration file
+is used. The command
+
+ant -Dtarget.platform=jboss deploy-ds
+
+will accomplish this task using the defaults provided. Any errors will be reported
+in the
+
+JBOSS_HOME/server/<server-name>/log/server.log
+
+file or on the console.
+
+Once the above commands execute successfully, the Qpid JCA adapter is deployed, configured
+and ready for use.
+
+
+Deploy the Qpid JCA Examples
+============================
+After the Qpid JCA adapter is deployed, executing the command
+
+ant -Dtarget.platform=jboss deploy-ear
+
+will attempt to deploy the Qpid JCA example EAR into the JBoss environment.
+Once the above command executes successfully, the Qpid JCA example application is deployed,
+configured and ready for use.
+
+Note, if making modifications to either the Qpid JCA adapter or *-ds.xml configuration, the
+EAR archive will need to be redeployed. This is a JBoss JCA issue and not due to the Qpid JCA
+adapter.
+
+The build-jboss-properties.xml file contains JBoss specific configuration options
+and Ant targets that can be used to suit your development requirements.
+
+The README.txt file in this directory provides the necessary instructions for using the Qpid JCA
+adapter and example application which is consistent across all supported JEE platforms.
+
+
+
+
+
diff --git a/qpid/java/jca/example/README-JBOSS7.txt b/qpid/java/jca/example/README-JBOSS7.txt
new file mode 100644
index 0000000000..7a3e0db01a
--- /dev/null
+++ b/qpid/java/jca/example/README-JBOSS7.txt
@@ -0,0 +1,116 @@
+Qpid JCA Example - JBoss AS 7
+
+Overview
+========
+This document explains the steps required to configure and
+deploy the Qpid JCA examples for the JBoss AS 7 environment.
+General information about the example can be found in the
+README-EXAMPLE.txt file.
+
+Requirements
+============
+In order to deploy the Qpid JCA adapter, as well as the example application,
+the JBOSS_HOME environemnt variable must be set. The environment variable
+should point to the root of your JBoss installation.
+
+In order to automatically deploy the Qpid JCA Adapter from the build system,
+the QPID_JCA_HOME environment variable needs to be set.
+The environment variable should point to the directory which contains the
+Qpid JCA Adapter. If building from the source tree, by default this can be found at
+
+QPID_ROOT/java/build/lib
+
+If installing from RPM or other binary distribution, this can vary by platform.
+
+If you do not want to use the build system to deploy the Qpid JCA adapter, you
+can simply copy the qpid-ra-0.<version>.rar file to the
+
+JBOSS_HOME/<server-profile>/deployments
+
+directory. By default, the example assumes the JBoss 'standalone' server profile will
+be used. This can be modified in the build-jboss7-properties.xml file.
+
+The Qpid JCA examples assume the Apache Geronimo application server as the default
+target platform. This can be modified in two ways:
+
+1) Modify the build.xml file and change the target.platform property:
+
+Example:
+
+ <!-- Valid target platforms are currently geronimo, jboss, jboss7, glassfish -->
+ <property name="target.platform" value="jboss7"/>
+
+2) Set the target.platform property via the command line:
+
+Example:
+
+ant -Dtarget.platform=jboss7 <target>
+
+Note, if you choose the second method, all command line invocations must include
+the target.platform. For the remainder of this document, we will assume the second
+approach.
+
+As opposed to earlier versions of JBoss AS, JBoss AS 7 uses a different approach for
+configuring JCA resources. JBoss AS 7 provides support for different server profiles
+each configured through an XML based configuration file. In order to configure the
+Qpid JCA adapter for the JBoss AS 7 environment, a complete XML configuration has been
+provided in the conf/ directory as conf/qpid-standalone.xml. In order to configure this
+file execute the following command:
+
+ant -Dtarget.platform=jboss7 generate
+
+The result of this command will produce a file build/gen/qpid-standalone.xml file. To
+deploy this file copy the file to:
+
+JBOSS_HOME/standalone/configuration
+
+directory.
+
+Prior to deploying any application component, the JBoss application server
+should be started and available for requests. In order to use the qpid-standalone.xml
+file generated in the previous step, when starting JBoss AS 7 invoke the following:
+
+./standalone.sh -c qpid-standalone.xml
+
+
+Note, the above method completely replaces the default messaging provider in JBoss AS 7.
+Currently there is no way to have two separate messaging providers deployed within the same
+server. It assumed that this will be addressed in a later version of JBoss AS 7.
+
+
+Deploy the Qpid JCA Adapter
+==============================
+Once the above requirements are satisfied the command
+
+ant -Dtarget.platform=jboss7 deploy-rar
+
+will copy the Qpid JCA adapter to JBoss AS 7 server deploy directory.
+
+Once the above commands execute successfully, the Qpid JCA adapter is deployed, configured
+and ready for use.
+
+
+Deploy the Qpid JCA Examples
+============================
+After the Qpid JCA adapter is deployed, executing the command
+
+ant -Dtarget.platform=jboss7 deploy-ear
+
+will attempt to deploy the Qpid JCA example EAR into the JBoss AS 7 environment.
+Once the above command executes successfully, the Qpid JCA example application is
+deployed, configured and ready for use.
+
+Note, currently there is an issue with 'hot-deployment' in the JBoss AS 7 environment.
+If you need to re-deploy the EAR file, restarting JBoss AS 7 is required.
+
+The build-jboss7-properties.xml file contains JBoss AS 7 specific configuration options
+and Apache Ant targets that can be used to suit your development requirements.
+
+The README.txt file in this directory provides the necessary instructions for using the Qpid JCA
+adapter and example application which is consistent across all supported JEE platforms.
+
+
+
+
+
+
diff --git a/qpid/java/jca/example/README.txt b/qpid/java/jca/example/README.txt
deleted file mode 100644
index d94bbfa7e5..0000000000
--- a/qpid/java/jca/example/README.txt
+++ /dev/null
@@ -1,277 +0,0 @@
-Qpid JCA Example
-
-Overview
-=======
-The Qpid JCA example provides a sample JEE application that demonstrates how to
-configure, install and run applications using the Qpid JCA adapter for EE
-connectivity and the Apache Qpid C++ Broker. This example code can be used as a
-convenient starting point for your own development and deployment
-efforts. Currently the example is supported on JBoss EAP 5.x, JBoss 6.x and
-Apache Geronimo 2.x.
-
-Example Components
-===================
-Currently the example application consists of the following components:
-
-Destinations and ConnectionFactories
-
-Any messaging application relies on destinations (queues or topics )
-in order to produce or consume messages.The Qpid JCA example provides
-five destinations by default:
-
- HelloTopic
- GoodByeTopic
- HelloGoodByeTopic
- HelloQueue
- GoodByeQueue
- QpidResponderQueue
-
-
-Similar to destinations, ConnectionFactories are a core component of both JMS
-and JCA. ConnectionFactories provide the necessary starting point to make a connection,
-establish a session and produce or consume (or both) messages from your JMS provider.
-
-The Qpid JCA example provides three connection factories by default:
-
- QpidJMSXA
- QpidJMS
- QpidConnectionFactory
-
-Each of these ConnectionFactories varies in their capabilities and the context in which
-they should be used. These concepts will be explained later in this document.
-
-The deployment configuration for destinations, and ConnectionFactories varies by platform.
-In JBossEAP, the configuration mechanism is a *-ds.xml file. Geronimo 2.2.x has the notion
-of a deployment plan in the form of a geronimo-ra.xml file.
-
-The Qpid JCA Example provides both a qpid-jca-ds.xml file as well as a geronimo-ra.xml deployment
-plan. Both mechanisms provide a reasonable set of defaults to allow you to deploy the Qpid JCA
-adapter in either environment and get up and running quickly.
-
-EJB 3.x
-
-There are a six EJB 3.x components provided as part of the example.
-
- QpidHelloSubscriberBean - MessageDrivenBean (MDB)
- QpidGoodByeSubscriberBean - (MDB)
- QpidHelloListenerBean - (MDB)
- QpidGoodByeListenerBean - (MDB)
- QpidJMSResponderBean - (MDB)
- QpidTestBean - Stateless Session Bean (SLSB)
-
-Servlet 2.5
-
- QpidTestServlet
-
-A sample EE 2.5 servlet is provided allowing testing from a browser versus a JNDI
-client
-
-EE EAR archive
- An EAR wrapper for the ejb and web components.
-
-
- An RMI client used to excercise the EJB 3.x component.
-
-Sample *-ds.xml file
- A sample *-ds.xml file is provided to create destinations and ManagedConnectionFactories
- in the JBoss environment.
-
-Sample geronimo-ra.xml
- A sample geronimo-ra.xml file is provided to create destinations and ManagedConnectionFactories
- in the Geronimo environment. This file is semantically equivalent to the JBoss *-ds.xml artifact.
-
-A build.xml file
- An ant build.xml file to configure, install and deploy the aforementioned components.
-
-
-Requirements
-============
-
-Depending upon your target platform (eg. JBoss EAP or Geronimo) you will need to set either
-the JBOSS_HOME or GERONIMO_HOME property. By default, these properties are assumed to be
-set from your environment. This can be modified in the build.xml file.
-
-JBoss EAP 5.x, JBoss 6.x
- To use the sample application you will need to have JBoss EAP 5.x or JBoss 6.x running.
-
-Geronimo 2.x
- To use the sample application you will need to have Geronimo 2.x running.
-
-Apache Qpid Broker
- To run the sample it is assumed you have an Apache Qpid C++ broker configured and running.
- The example code assumes that the broker will run at localhost on port 5672. This can be
- modified within the build.xml file if this does not suit your particular environment.
-
-
-Quickstart
-==========
-After satifsying the above requirements you are ready to deploy and run the example application.
-The steps to deploy and run in the supported application servers are largely the same, however,
-if you are targeting JBoss you will either need to modify the property in the example build.xml file
-
-
- <property name="target.platform" value="geronimo"/>
-
-to be jboss
-
- <property name="target.platform" value="jboss"/>
-
-or set this property via the command line.
-
-Example:
-
- ant -Dtarget.platform=jboss <target>
-
-**Note**
-Any time you wish to change platforms, this property needs to be modified and a complete clean
-and rebuild needs to be performed.
-
-Step 1 -- Package, Deploy and configure the Qpid JCA adapter
-
-The core component of the example is the Qpid JCA adapter. The following lists the steps
-for the respective platforms
-
-**Note**
-
-Regardless of platform, if you are building the Qpid JCA adapter from source code
-you will need to use to package the RAR file via the Ant build system. To do this, from
-the example directory execute
-
- ant deploy-rar
-
-This task packages the adapter and includes the necessary dependent jar files.
-
-
-JBoss
- There are no additional steps to package the adapter for JBoss deployment. Simply copy
- the qpid-ra-<qpid.version>rar to your JBoss deploy directory.
-
- To configure the Qpid JCA Adapter in JBoss the *-ds.xml file mechanism is used. A sample
- file is provided in the conf directory.
-
- If the defaults are suitable, you can simply execute
-
- ant deploy-ds
-
- While any property can be modified in the qpid-jca-ds.xml file, typically you will want to
- change the URL of the broker to which you are trying to connect. Rather than modifying
- the qpid-jca-ds.xml file directly you can modify the
-
- <property name="broker.url" value="amqp://anonymous:@client/test?brokerlist='tcp://localhost:5672?sasl_mechs='ANONYMOUS''"/>
-
- line in the build.xml file. This will dynamically insert the broker.url value into the qpid-jca-ds.xml file.
-
- Once this file is copied to your JBoss deploy directory and you received no exceptions, the adapter is now deployed, configured
- and ready for use.
-
-Geronimo
- By default, the Qpid JCA adapter ships with the geronimo-ra.xml deployment plan embedded
- in the RAR file. This file is located in the META-INF directory alongside the ra.xml file.
- By default the adapter is configured to access a broker located at localhost with the
- default port of 5672. The ANONYMOUS security mechanism is also in use. If this is not
- desirable, you have two approaches to configure the adapter.
-
-
- 1) Extract the META-INF/ra.xml file from the RAR file, modify and recompress the RAR archive
- with the updated contents.
-
- 2) Use the example build system to package the adapter. The example build.xml file includes
- a target
-
- package-rar
-
- that can be used to package the RAR file as well as allowing changes to the geronimo-ra.xml
- file without having to extract the RAR file by hand. The conf/geronimo-ra.xml file is used
- when you use the example build system.
-
- While any property can be modified in the geronimo-ra.xml file, typically you will want to
- change the URL of the broker to which you are trying to connect. Rather than modifying
- the geronimo-ra.xml file directly you can modify the
-
-
- <property name="broker.url" value="amqp://anonymous:@client/test?brokerlist='tcp://10.0.1.44:5672?sasl_mechs='ANONYMOUS''"/>
-
- line in the build.xml file. This will dynamically insert the broker.url value into the geronimo-ra.xml file.
-
- Once you have made your modifications you can execute
-
-
- ant clean package-rar deploy-rar
-
- Note, your Geronimo server must be running and your GERONIMO_HOME environment variable must be set. Barring any exceptions, the
- adapter is now deployed and ready for use in Geronimo.
-
-
-Step 2 -- Deploy the application component(s).
-
-As previously mentioned, the adapter comes with a variety of EE components for use in your respective application server. You can choose to deploy
-these components individually, or as a single EAR archive. This document assumes that you will use the EAR to deploy and run the example.
-
-The command to package and deploy the EAR archive is the same across application servers. Executing the following command
-
-ant deploy-ear
-
-will, depending upon platform, package the EAR and deploy the archive in your respective environment. Once this step is executed, the example
-is ready for use.
-
-
-Step 3 -- Test the Example
-
-The Qpid JCA example provides an EJB application, as well as a Web application. Both can be used to test/run the example:
-
-EJB
-If you want to use the EJB application to test the example you can execute
-
- ant run-client
-
-Running this command will perform a JNDI lookup of the SLSB in either JBoss or Geronimo and send a simple string to the SLSB. The SLSB will receive
-this string, construct a JMS message and place this message on a configured queue. The MDB will in turn receive this message and print the contents
-to the console.
-
-The main properties involved in this task are
-
-server.host
-jndi.context
-
-These vary depending upon which application server you are runnning. These can be modified to suit your environment. Looking at the run-client task you
-will see the following:
-
-
- <sysproperty key="qpid.ejb.name" value="qpid-jcaex/QpidTestBean/remote"/>
-
-This is the JNDI name of the SLSB component and it varies by application server. Typically you do not have to change this. Also, the task supports another property
-
-
- <sysproperty key="qpid.message" value="insert-value-here"/>
-
-You can set this property if you want to modify the message contents being routed through the system.
-
-Web
-The Qpid JCA Example comes with a web application. To access the web component, simply use a browser of your choice and navigate to
-
-http://<server-host-name>:<server-port>/qpid-jca-web/qpid
-
-where server-host and server-port are the host and port where you are running your application server. By default this is localhost:8080. Similar to the EJB component,
-the web application supports a few options:
-
-
-http://<server-host-name>:<server-port>/qpid-jca-web/qpid?messsage=<yourmessage>
-
-will allow you to customize the message contents that are routed through the system. By default, the Web application posts to a configured queue in the system. If you want to
-test XA functionality, or use an alternate approach, you can specify
-
-
-http://<server-host-name>:<server-port>/qpid-jca-web/qpid?useEJB=true
-
-instead of posting to a queue, the web application will use the local interface of the EJB component to send the message. This is functionally equivalent to running the
-RMI client.
-
-
-Summary
-=======
-While conceptually simple, the Qpid JCA example provides a majority of the component types and messaging patterns you are most likely to use your development efforts.
-With the Web and EJB components, you can experiment with various aspects of JCA as well as EE development in general using the Qpid Broker as your messaging provider.
-While this documentation highlights the major components and steps needed to take to get the example running, the possiblities for modifcation are numerous. You are
-encouraged to experiment with the example as you develop your own messaging applications.
-
-
diff --git a/qpid/java/jca/example/build-geronimo-properties.xml b/qpid/java/jca/example/build-geronimo-properties.xml
index 7c5bd33cb0..02ecb53134 100644
--- a/qpid/java/jca/example/build-geronimo-properties.xml
+++ b/qpid/java/jca/example/build-geronimo-properties.xml
@@ -22,10 +22,19 @@
<property name="jndi.scheme" value="name"/>
- <!--
- <property name="qpid.xacf.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAManagedConnectionFactory/QpidJMSXA"/>
- -->
<property name="qpid.xacf.jndi.name" value="QpidJMSXA"/>
+
+ <property name="jndi.prefix" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/"/>
+
+
+ <property name="qpid.hello.queue.jndi.name" value="HelloQueue"/>
+ <property name="qpid.goodbye.queue.jndi.name" value="GoodByeQueue"/>
+ <property name="qpid.hello.topic.jndi.name" value="HelloTopic"/>
+ <property name="qpid.goodbye.topic.jndi.name" value="GoodByeTopic"/>
+ <property name="qpid.request.queue.jndi.name" value="RequestQueue"/>
+ <property name="qpid.response.queue.jndi.name" value="ResponseQueue"/>
+
+ <!--
<property name="qpid.cf.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/QpidConnectionFactory"/>
<property name="qpid.hello.queue.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/HelloQueue"/>
<property name="qpid.goodbye.queue.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/GoodByeQueue"/>
@@ -33,9 +42,11 @@
<property name="qpid.goodbye.topic.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/GoodByeTopic"/>
<property name="qpid.request.queue.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/RequestQueue"/>
<property name="qpid.response.queue.jndi.name" value="jca:/qpid.jca/QpidJCAAdapter/JCAAdminObject/ResponseQueue"/>
-
+ -->
<property name="qpid.ejb.jndi.name" value="name=&quot;QpidTestEJB&quot;"/>
<property name="qpid.ejb.name" value="QpidTestBeanRemote"/>
+ <property name="qpid.client.cf.jndi.name" value="${jndi.prefix}/QpidConnectionFactory"/>
+ <property name="qpid.client.dest.jndi.name" value="${jndi.prefix}/${qpid.hello.queue.jndi.name}"/>
<property name="jndi.context" value="org.openejb.client.RemoteInitialContextFactory"/>
<property name="server.host" value="ejbd://localhost:4201"/>
diff --git a/qpid/java/jca/example/build-glassfish-properties.xml b/qpid/java/jca/example/build-glassfish-properties.xml
new file mode 100644
index 0000000000..94c79be931
--- /dev/null
+++ b/qpid/java/jca/example/build-glassfish-properties.xml
@@ -0,0 +1,135 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+-->
+<project name="qpid-jca-example-glassfish-properties" basedir="." default="">
+
+ <property name="jndi.scheme" value="name"/>
+ <property name="jndi.prefix" value=""/>
+
+ <property name="qpid.xacf.jndi.name" value="QpidJMSXA"/>
+ <property name="qpid.hello.topic.jndi.name" value="HelloTopic"/>
+ <property name="qpid.goodbye.topic.jndi.name" value="GoodByeTopic"/>
+ <property name="qpid.hello.queue.jndi.name" value="HelloQueue"/>
+ <property name="qpid.goodbye.queue.jndi.name" value="GoodByeQueue"/>
+ <property name="qpid.request.queue.jndi.name" value="QpidRequestQueue"/>
+ <property name="qpid.response.queue.jndi.name" value="QpidResponseQueue"/>
+ <property name="qpid.ejb.jndi.name" value="mappedName=&quot;QpidTestEJB&quot;"/>
+ <property name="qpid.ejb.ref.name" value="QpidTestBean/local"/>
+ <property name="qpid.ejb.name" value="QpidTestBean#org.apache.qpid.jca.example.ejb.QpidTestRemote"/>
+ <property name="qpid.client.cf.jndi.name" value="QpidConnectionFactory"/>
+ <property name="qpid.client.dest.jndi.name" value="${qpid.hello.queue.jndi.name}"/>
+
+ <property name="jndi.context" value="com.sun.enterprise.naming.SerialInitContextFactory"/>
+ <property name="server.host" value="iiop://localhost:3700"/>
+ <property name="glassfish.home" value="${env.GLASSFISH_HOME}"/>
+ <property name="glassfish.domain" value="domain1"/>
+ <property name="glassfish.user" value=""/>
+ <property name="glassfish.password" value=""/>
+
+ <path id="compile.classpath">
+ <fileset dir="${glassfish.home}/glassfish/modules">
+ <include name="javax.ejb.jar"/>
+ <include name="javax.transaction.jar"/>
+ <include name="javax.jms.jar"/>
+ <include name="javax.resource.jar"/>
+ <include name="javax.servlet.jar"/>
+ </fileset>
+
+ <fileset dir="${glassfish.home}/glassfish/domains/${glassfish.domain}/lib/ext">
+ <include name="slf4j-api-*.jar"/>
+ </fileset>
+ </path>
+
+ <path id="run.classpath">
+ <fileset dir="${lib.dir}">
+ <include name="qpid-ra-*.jar"/>
+ <include name="qpid-client-*.jar"/>
+ <include name="qpid-common-*.jar"/>
+ </fileset>
+
+ <fileset dir="${glassfish.home}/glassfish/lib/">
+ <include name="gf-client.jar"/>
+ </fileset>
+
+ <fileset dir="${glassfish.home}/glassfish/modules">
+ <include name="javax.ejb.jar"/>
+ <include name="javax.transaction.jar"/>
+ <include name="javax.jms.jar"/>
+ <include name="javax.resource.jar"/>
+ <include name="javax.servlet.jar"/>
+ </fileset>
+ <fileset dir="${glassfish.home}/glassfish/domains/${glassfish.domain}/lib/ext">
+ <include name="slf4j-api-*.jar"/>
+ </fileset>
+ </path>
+
+ <filterset id="extra.filterset">
+ <filter token="rar.ver" value="${qpid.ver}"/>
+ </filterset>
+
+ <macrodef name="glassfish">
+ <attribute name="user" default="${glassfish.user}"/>
+ <attribute name="password" default="${glassfish.password}"/>
+ <attribute name="action" default="list-applications"/>
+ <attribute name="module"/>
+ <attribute name="plan" default=""/>
+ <sequential>
+ <exec executable="${glassfish.home}/bin/asadmin">
+ <arg line="@{action} @{module} @{plan}"/>
+ </exec>
+ </sequential>
+ </macrodef>
+
+ <target name="package-rar" depends="compile">
+ <jar destfile="${build.dir}/${rar.name}"/>
+ </target>
+
+ <target name="deploy-rar" depends="package-rar" description="Deploy the RAR file.">
+ <glassfish action="deploy" module="${qpid.jca.dir}/${rar.name}"/>
+ <glassfish action="add-resources" module="${gen.dir}/glassfish-resources.xml"/>
+ </target>
+
+
+ <target name="undeploy-resources">
+ <glassfish action="delete-admin-object" module="${qpid.hello.topic.jndi.name}"/>
+ <glassfish action="delete-admin-object" module="${qpid.goodbye.topic.jndi.name}"/>
+ <glassfish action="delete-admin-object" module="${qpid.hello.queue.jndi.name}"/>
+ <glassfish action="delete-admin-object" module="${qpid.goodbye.queue.jndi.name}"/>
+ <glassfish action="delete-admin-object" module="${qpid.request.queue.jndi.name}"/>
+ <glassfish action="delete-admin-object" module="${qpid.response.queue.jndi.name}"/>
+ <glassfish action="delete-connector-connection-pool" module="--cascade true QpidJMSXAPool"/>
+ <glassfish action="delete-connector-connection-pool" module="--cascade true QpidJMSPool"/>
+ <glassfish action="delete-resource-adapter-config" module="QpidResourceAdapter"/>
+ </target>
+
+ <target name="undeploy-rar" description="Deploy the RAR file.">
+ <glassfish action="undeploy" module="--cascade true qpid-ra-${qpid.ver}"/>
+ </target>
+
+ <target name="deploy-ear" description="Deploy the EAR file." depends="package-ear">
+ <glassfish action="deploy" module="${build.dir}/${ear.name}"/>
+ </target>
+
+ <target name="undeploy-ear" description="Undeploy the EAR file.">
+ <glassfish action="undeploy" module="qpid-jcaex"/>
+ </target>
+</project>
+
+
diff --git a/qpid/java/jca/example/build-jboss-properties.xml b/qpid/java/jca/example/build-jboss-properties.xml
index ce0cec2b35..fd38274630 100644
--- a/qpid/java/jca/example/build-jboss-properties.xml
+++ b/qpid/java/jca/example/build-jboss-properties.xml
@@ -21,6 +21,7 @@
<project name="qpid-jca-example-jboss-properties" basedir="." default="">
<property name="jndi.scheme" value="mappedName"/>
+ <property name="jndi.prefix" value=""/>
<property name="qpid.xacf.jndi.name" value="java:QpidJMSXA"/>
<property name="qpid.cf.jndi.name" value="QpidConnectionFactory"/>
@@ -29,9 +30,12 @@
<property name="qpid.hello.queue.jndi.name" value="HelloQueue"/>
<property name="qpid.goodbye.queue.jndi.name" value="GoodByeQueue"/>
<property name="qpid.request.queue.jndi.name" value="QpidRequestQueue"/>
+ <property name="qpid.response.queue.jndi.name" value="QpidResponseQueue"/>
<property name="qpid.ejb.jndi.name" value="mappedName=&quot;QpidTestEJB&quot;"/>
<property name="qpid.ejb.ref.name" value="QpidTestBean/local"/>
<property name="qpid.ejb.name" value="qpid-jcaex/QpidTestBean/remote"/>
+ <property name="qpid.client.cf.jndi.name" value="${jndi.prefix}/QpidConnectionFactory"/>
+ <property name="qpid.client.dest.jndi.name" value="${jndi.prefix}/${qpid.hello.queue.jndi.name}"/>
<property name="jndi.context" value="org.jnp.interfaces.NamingContextFactory"/>
<property name="server.host" value="jnp://localhost:1099"/>
diff --git a/qpid/java/jca/example/build-jboss7-properties.xml b/qpid/java/jca/example/build-jboss7-properties.xml
index cfbaa9b473..68ecd8a4f4 100644
--- a/qpid/java/jca/example/build-jboss7-properties.xml
+++ b/qpid/java/jca/example/build-jboss7-properties.xml
@@ -21,20 +21,25 @@
<project name="qpid-jca-example-jboss7-properties" basedir="." default="">
<property name="jndi.scheme" value="name"/>
+ <property name="jndi.prefix" value=""/>
<property name="qpid.xacf.jndi.name" value="java:/QpidJMSXA"/>
<property name="qpid.cf.jndi.name" value="QpidConnectionFactory"/>
- <property name="qpid.hello.topic.jndi.name" value="java:/HelloTopic"/>
- <property name="qpid.goodbye.topic.jndi.name" value="java:/GoodByeTopic"/>
- <property name="qpid.hello.queue.jndi.name" value="java:/HelloQueue"/>
- <property name="qpid.goodbye.queue.jndi.name" value="java:/GoodByeQueue"/>
- <property name="qpid.responder.queue.jndi.name" value="java:/QpidResponderQueue"/>
+ <property name="qpid.hello.topic.jndi.name" value="java:jboss/exported/HelloTopic"/>
+ <property name="qpid.goodbye.topic.jndi.name" value="java:jboss/exported/GoodByeTopic"/>
+ <property name="qpid.hello.queue.jndi.name" value="java:jboss/exported/HelloQueue"/>
+ <property name="qpid.goodbye.queue.jndi.name" value="java:jboss/exported/GoodByeQueue"/>
+ <property name="qpid.request.queue.jndi.name" value="java:jboss/exported/QpidRequestQueue"/>
+ <property name="qpid.response.queue.jndi.name" value="java:jboss/exported/QpidResponseQueue"/>
+
<property name="qpid.ejb.jndi.name" value="mappedName=&quot;QpidTestEJB&quot;"/>
<property name="qpid.ejb.ref.name" value="QpidTestBean/local"/>
- <property name="qpid.ejb.name" value="qpid-jcaex/QpidTestBean/remote"/>
+ <property name="qpid.ejb.name" value="ejb:qpid-jcaex/qpid-jcaex-ejb/QpidTestBean!org.apache.qpid.jca.example.ejb.QpidTestRemote"/>
- <property name="jndi.context" value="org.jnp.interfaces.NamingContextFactory"/>
- <property name="server.host" value="jnp://localhost:1099"/>
+ <property name="qpid.client.cf.jndi.name" value="${jndi.prefix}/QpidConnectionFactory"/>
+ <property name="qpid.client.dest.jndi.name" value="${jndi.prefix}/HelloQueue"/>
+ <property name="jndi.context" value="org.jboss.naming.remote.client.InitialContextFactory"/>
+ <property name="server.host" value="remote://localhost:4447"/>
<property name="jboss.server.config" value="standalone"/>
@@ -44,19 +49,20 @@
<property name="jboss.deploy" location="${jboss.home}/${jboss.server}/deployments"/>
<property name="jboss.modules" location="${jboss.home}/modules"/>
<property name="jboss.config.dir" location="${jboss.home}/${jboss.server}/configuration/"/>
+ <property name="jboss.client" location="${jboss.home}/bin/client"/>
<path id="compile.classpath">
<fileset dir="${jboss.modules}/javax/jms/api/main">
- <include name="jboss-jms-api_1.1_spec-1.0.0.Final.jar"/>
+ <include name="jboss-jms-api_1.1_spec-1.0.1.Final.jar"/>
</fileset>
<fileset dir="${jboss.modules}/javax/ejb/api/main">
- <include name="jboss-ejb-api_3.1_spec-1.0.1.Final.jar"/>
+ <include name="jboss-ejb-api_3.1_spec-1.0.2.Final.jar"/>
</fileset>
<fileset dir="${jboss.modules}/javax/servlet/api/main">
- <include name="jboss-servlet-api_3.0_spec-1.0.0.Final.jar"/>
+ <include name="jboss-servlet-api_3.0_spec-1.0.1.Final.jar"/>
</fileset>
<fileset dir="${jboss.modules}/javax/transaction/api/main">
- <include name="jboss-transaction-api_1.1_spec-1.0.0.Final.jar"/>
+ <include name="jboss-transaction-api_1.1_spec-1.0.1.Final.jar"/>
</fileset>
<fileset dir="${jboss.modules}/org/slf4j/main">
<include name="slf4j-api-1.6.1.jar"/>
@@ -64,15 +70,25 @@
</path>
<path id="run.classpath">
+ <fileset dir="${jboss.client}">
+ <include name="jboss-client.jar"/>
+ </fileset>
<fileset dir="${lib.dir}">
<include name="qpid-ra-*.jar"/>
<include name="qpid-client-*.jar"/>
<include name="qpid-common-*.jar"/>
</fileset>
- <fileset dir="${jboss.client}">
- <!-- Shortcut to get it working!-->
- <include name="jbossall-client.jar"/>
+ <fileset dir="${jboss.modules}/org/slf4j/main">
+ <include name="slf4j-api-1.6.1.jar"/>
+ </fileset>
+ <fileset dir="../../build/lib">
+ <include name="slf4j*.jar"/>
+ <include name="log4j*.jar"/>
</fileset>
+ <fileset dir="${jboss.modules}/org/jboss/ejb-client/main/">
+ <include name="jboss-ejb-client-1.0.6.CR1.jar"/>
+ </fileset>
+
</path>
<filterset id="extra.filterset"/>
diff --git a/qpid/java/jca/example/build.xml b/qpid/java/jca/example/build.xml
index ab70ee45fc..7a75f9abc6 100644
--- a/qpid/java/jca/example/build.xml
+++ b/qpid/java/jca/example/build.xml
@@ -20,7 +20,7 @@
-->
<project name="qpid-jca-example" default="help" basedir="">
- <!-- Valid target platforms are currently geronimo & jboss -->
+ <!-- Valid target platforms are currently geronimo, jboss, jboss7, glassfish -->
<property name="target.platform" value="geronimo"/>
<!-- Change to BURL for older syntax support -->
@@ -72,7 +72,6 @@
<filter token="rar.name" value="${rar.name}"/>
<filter token="ejb.name" value="${ejb.name}"/>
<filter token="war.name" value="${war.name}"/>
-
<filter token="broker.url" value="${broker.url}"/>
<filter token="qpid.hello.topic.dest.address" value="${qpid.hello.topic.dest.address}"/>
@@ -92,12 +91,14 @@
<filter token="rar.name" value="${rar.name}"/>
<filter token="broker.url" value="${broker.url}"/>
<filter token="jndi.scheme" value="${jndi.scheme}"/>
+ <filter token="jndi.prefix" value="${jndi.prefix}"/>
<filter token="qpid.xacf.jndi.name" value="${qpid.xacf.jndi.name}"/>
<filter token="qpid.hello.topic.jndi.name" value="${qpid.hello.topic.jndi.name}"/>
<filter token="qpid.goodbye.topic.jndi.name" value="${qpid.goodbye.topic.jndi.name}"/>
<filter token="qpid.hello.queue.jndi.name" value="${qpid.hello.queue.jndi.name}"/>
<filter token="qpid.goodbye.queue.jndi.name" value="${qpid.goodbye.queue.jndi.name}"/>
<filter token="qpid.request.queue.jndi.name" value="${qpid.request.queue.jndi.name}"/>
+ <filter token="qpid.response.queue.jndi.name" value="${qpid.response.queue.jndi.name}"/>
<filter token="qpid.ejb.jndi.name" value="${qpid.ejb.jndi.name}"/>
</filterset>
</copy>
@@ -112,6 +113,9 @@
<classes dir="${build.classes.dir}">
<include name="org/apache/qpid/jca/example/web/**"/>
</classes>
+ <metainf dir="${gen.dir}">
+ <include name="glassfish-web.xml"/>
+ </metainf>
</war>
</target>
@@ -120,6 +124,7 @@
<include name="org/apache/qpid/jca/example/ejb/**/*.class"/>
<metainf dir="${gen.dir}">
<include name="jboss.xml"/>
+ <include name="glassfish-ejb-jar.xml"/>
</metainf>
</jar>
</target>
@@ -142,10 +147,13 @@
</classpath>
<sysproperty key="java.naming.factory.initial" value="${jndi.context}"/>
<sysproperty key="java.naming.provider.url" value="${server.host}"/>
+ <sysproperty key="java.naming.factory.url.pkgs" value="org.jboss.ejb.client.naming"/>
+ <sysproperty key="jboss.ejb.client.properties.file.path" value="${conf.dir}/jboss-ejb-client.properties"/>
+
<sysproperty key="qpid.ejb.name" value="${qpid.ejb.name}"/>
- <sysproperty key="qpid.cf.name" value="${qpid.cf.jndi.name}"/>
+ <sysproperty key="qpid.cf.name" value="${qpid.client.cf.jndi.name}"/>
+ <sysproperty key="qpid.dest.name" value="${qpid.client.dest.jndi.name}"/>
<sysproperty key="qpid.dest_syntax" value="${qpid.dest_syntax}"/>
- <sysproperty key="qpid.dest.name" value="${qpid.hello.queue.jndi.name}"/>
<sysproperty key="log4j.configuration" value="file://${conf.dir}/log4j.properties"/>
<sysproperty key="qpid.message" value="${client.message}"/>
@@ -167,8 +175,8 @@
<sysproperty key="qpid.message" value="Hello, World"/>
<sysproperty key="message.count" value="1"/>
<sysproperty key="thread.count" value="5"/>
- <sysproperty key="qpid.cf.name" value="${qpid.cf.jndi.name}"/>
- <sysproperty key="qpid.dest.name" value="${qpid.responder.queue.jndi.name}"/>
+ <sysproperty key="qpid.cf.name" value="${qpid.client.cf.jndi.name}"/>
+ <sysproperty key="qpid.dest.name" value="${qpid.client.dest.jndi.name}"/>
<sysproperty key="log4j.configuration" value="file://${conf.dir}/log4j.properties"/>
<sysproperty key="qpid.dest_syntax" value="${qpid.dest_syntax}"/>
</java>
diff --git a/qpid/java/jca/example/conf/geronimo-application.xml b/qpid/java/jca/example/conf/geronimo-application.xml
index a855e0fae8..384f6b2e75 100644
--- a/qpid/java/jca/example/conf/geronimo-application.xml
+++ b/qpid/java/jca/example/conf/geronimo-application.xml
@@ -21,7 +21,7 @@
-->
<application xmlns="http://geronimo.apache.org/xml/ns/j2ee/application-2.0"
xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.2"
- xmlns:naming="http://geronimo.apache.org/xml/ns/naming-1.2"
+ xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.2"
application-name="QpidJCAExampleApplication">
<sys:environment>
diff --git a/qpid/java/jca/example/conf/geronimo-ra.xml b/qpid/java/jca/example/conf/geronimo-ra.xml
index 1c7210d2ee..a7511f647f 100644
--- a/qpid/java/jca/example/conf/geronimo-ra.xml
+++ b/qpid/java/jca/example/conf/geronimo-ra.xml
@@ -67,71 +67,73 @@
<adminobject-class>org.apache.qpid.ra.admin.QpidTopicImpl</adminobject-class>
<adminobject-instance>
<message-destination-name>Dummy</message-destination-name>
- <config-property-setting name="destinationAddress">amq.topic</config-property-setting>
+ <config-property-setting name="DestinationAddress">amq.topic</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidTopic</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidTopicImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>HelloTopic</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.hello.topic.dest.address@</config-property-setting>
+ <message-destination-name>HelloTopic</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.hello.topic.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidTopic</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidTopicImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>GoodByeTopic</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.goodbye.topic.dest.address@</config-property-setting>
+ <message-destination-name>GoodByeTopic</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.goodbye.topic.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
+ <!--
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidTopic</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidTopicImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>HelloGoodByeTopic</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.hellogoodbye.topic.dest.address@</config-property-setting>
+ <message-destination-name>jms/HelloGoodByeTopic</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.hellogoodbye.topic.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
+ -->
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidQueue</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidQueueImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>HelloQueue</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.hello.queue.dest.address@</config-property-setting>
+ <message-destination-name>HelloQueue</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.hello.queue.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidQueue</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidQueueImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>GoodByeQueue</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.goodbye.queue.dest.address@</config-property-setting>
+ <message-destination-name>GoodByeQueue</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.goodbye.queue.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidQueue</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidQueueImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>RequestQueue</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.request.queue.dest.address@</config-property-setting>
+ <message-destination-name>RequestQueue</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.request.queue.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidQueue</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidQueueImpl</adminobject-class>
<adminobject-instance>
- <message-destination-name>ResponseQueue</message-destination-name>
- <config-property-setting name="destinationAddress">@qpid.response.queue.dest.address@</config-property-setting>
+ <message-destination-name>ResponseQueue</message-destination-name>
+ <config-property-setting name="DestinationAddress">@qpid.response.queue.dest.address@</config-property-setting>
</adminobject-instance>
</adminobject>
<adminobject>
<adminobject-interface>javax.jms.ConnectionFactory</adminobject-interface>
<adminobject-class>org.apache.qpid.ra.admin.QpidConnectionFactoryProxy</adminobject-class>
<adminobject-instance>
- <message-destination-name>QpidConnectionFactory</message-destination-name>
- <config-property-setting name="connectionURL">@broker.url@</config-property-setting>
+ <message-destination-name>QpidConnectionFactory</message-destination-name>
+ <config-property-setting name="ConnectionURL">@broker.url@</config-property-setting>
</adminobject-instance>
</adminobject>
</resourceadapter>
diff --git a/qpid/java/jca/example/conf/glassfish-ejb-jar.xml b/qpid/java/jca/example/conf/glassfish-ejb-jar.xml
new file mode 100644
index 0000000000..e3ea140472
--- /dev/null
+++ b/qpid/java/jca/example/conf/glassfish-ejb-jar.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd">
+<glassfish-ejb-jar>
+ <enterprise-beans>
+ <ejb>
+ <ejb-name>QpidHelloListenerBean</ejb-name>
+ <jndi-name>HelloQueue</jndi-name>
+ <mdb-resource-adapter>
+ <resource-adapter-mid>qpid-ra-@rar.ver@</resource-adapter-mid>
+ </mdb-resource-adapter>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ <ejb>
+ <ejb-name>QpidGoodByeListenerBean</ejb-name>
+ <jndi-name>GoodByeQueue</jndi-name>
+ <mdb-resource-adapter>
+ <resource-adapter-mid>qpid-ra-@rar.ver@</resource-adapter-mid>
+ </mdb-resource-adapter>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ <ejb>
+ <ejb-name>QpidHelloSubscriberBean</ejb-name>
+ <jndi-name>HelloTopic</jndi-name>
+ <mdb-resource-adapter>
+ <resource-adapter-mid>qpid-ra-@rar.ver@</resource-adapter-mid>
+ </mdb-resource-adapter>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ <ejb>
+ <ejb-name>QpidGoodByeSubscriberBean</ejb-name>
+ <jndi-name>GoodByeTopic</jndi-name>
+ <mdb-resource-adapter>
+ <resource-adapter-mid>qpid-ra-@rar.ver@</resource-adapter-mid>
+ </mdb-resource-adapter>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ <ejb>
+ <ejb-name>QpidJMSResponderBean</ejb-name>
+ <jndi-name>QpidResponderQueue</jndi-name>
+ <mdb-resource-adapter>
+ <resource-adapter-mid>qpid-ra-@rar.ver@</resource-adapter-mid>
+ </mdb-resource-adapter>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ <ejb>
+ <ejb-name>QpidTestBean</ejb-name>
+ <jndi-name>QpidTestBean</jndi-name>
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ </ejb>
+ </enterprise-beans>
+</glassfish-ejb-jar>
+
diff --git a/qpid/java/jca/example/conf/glassfish-resources.xml b/qpid/java/jca/example/conf/glassfish-resources.xml
new file mode 100644
index 0000000000..9eab4302d5
--- /dev/null
+++ b/qpid/java/jca/example/conf/glassfish-resources.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
+<resources>
+
+
+ <resource-adapter-config name="QpidResourceAdapter" resource-adapter-name="qpid-ra-@rar.ver@" thread-pool-ids="thread-pool-1">
+ <property name="TransactionManagerLocatorClass" value="org.apache.qpid.ra.tm.GlassfishTransactionManagerLocator"/>
+ <property name="TransactionManagerLocatorMethod" value="getTm"/>
+ </resource-adapter-config>
+
+ <!--XAConnectionFactory-->
+ <connector-connection-pool
+ name="QpidJMSXAPool"
+ resource-adapter-name="qpid-ra-@rar.ver@"
+ connection-definition-name="org.apache.qpid.ra.QpidRAConnectionFactory"
+ transaction-support="XATransaction"
+ ping="true">
+ <property name="connectionURL" value="@broker.url@"/>
+ <property name="SessionDefaultType" value="javax.jms.Queue"/>
+ </connector-connection-pool>
+
+ <connector-resource jndi-name="QpidJMSXA" pool-name="QpidJMSXAPool"/>
+
+ <!--LocalTransaction ConnectionFactory
+ <connector-connection-pool
+ name="QpidJMSPool"
+ resource-adapter-name="qpid-ra-@rar.ver@"
+ connection-definition-name="org.apache.qpid.ra.QpidRAConnectionFactory"
+ transaction-support="LocalTransaction"
+ ping="true">
+ <property name="connectionURL" value="@broker.url@"/>
+ <property name="SessionDefaultType" value="javax.jms.Queue"/>
+ <property name="UseLocalTx" value="true"/>
+ </connector-connection-pool>
+
+
+ <connector-resource jndi-name="QpidJMS" pool-name="QpidJMSPool"/>
+
+ -->
+ <!--Destinations-->
+ <admin-object-resource jndi-name="HelloQueue" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidQueue" class-name="org.apache.qpid.ra.admin.QpidQueueImpl">
+ <property name="DestinationAddress" value="@qpid.hello.queue.dest.address@"/>
+ </admin-object-resource>
+
+ <admin-object-resource jndi-name="GoodByeQueue" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidQueue" class-name="org.apache.qpid.ra.admin.QpidQueueImpl">
+ <property name="DestinationAddress" value="@qpid.goodbye.queue.dest.address@"/>
+ </admin-object-resource>
+
+ <admin-object-resource jndi-name="HelloTopic" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidTopic" class-name="org.apache.qpid.ra.admin.QpidTopicImpl">
+ <property name="DestinationAddress" value="@qpid.hello.topic.dest.address@"/>
+ </admin-object-resource>
+
+ <admin-object-resource jndi-name="GoodByeTopic" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidTopic" class-name="org.apache.qpid.ra.admin.QpidTopicImpl">
+ <property name="DestinationAddress" value="@qpid.goodbye.topic.dest.address@"/>
+ </admin-object-resource>
+
+ <!--
+ <admin-object-resource jndi-name="HelloGoodByeTopic" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidTopic" class-name="org.apache.qpid.ra.admin.QpidTopicImpl">
+ <property name="DestinationAddress" value="@qpid.hellogoodbye.topic.dest.address@"/>
+ </admin-object-resource>
+ -->
+ <admin-object-resource jndi-name="QpidRequestQueue" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidQueue" class-name="org.apache.qpid.ra.admin.QpidQueueImpl">
+ <property name="DestinationAddress" value="@qpid.request.queue.dest.address@"/>
+ </admin-object-resource>
+
+ <admin-object-resource jndi-name="QpidResponseQueue" res-adapter="qpid-ra-@rar.ver@" res-type="org.apache.qpid.ra.admin.QpidQueue" class-name="org.apache.qpid.ra.admin.QpidQueueImpl">
+ <property name="DestinationAddress" value="@qpid.response.queue.dest.address@"/>
+ </admin-object-resource>
+
+ <admin-object-resource jndi-name="QpidConnectionFactory" res-adapter="qpid-ra-@rar.ver@" res-type="javax.jms.ConnectionFactory" class-name="org.apache.qpid.ra.admin.QpidConnectionFactoryProxy">
+ <property name="ConnectionURL" value="@broker.url@"/>
+ </admin-object-resource>
+
+</resources>
diff --git a/qpid/java/jca/example/conf/glassfish-web.xml b/qpid/java/jca/example/conf/glassfish-web.xml
new file mode 100644
index 0000000000..950ee73d51
--- /dev/null
+++ b/qpid/java/jca/example/conf/glassfish-web.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
+<glassfish-web-app>
+
+ <context-root>qpid-jca-web</context-root>
+
+ <ejb-ref>
+ <ejb-ref-name>QpidTestBean</ejb-ref-name>
+ <jndi-name>QpidTestBean</jndi-name>
+ </ejb-ref>
+
+ <resource-ref>
+ <res-ref-name>QpidJMSXA</res-ref-name>
+ <jndi-name>QpidJMSXA</jndi-name>
+ </resource-ref>
+ <resource-env-ref>
+ <res-env-ref-name>HelloQueue</res-env-ref-name>
+ <jndi-name>HelloQueue</jndi-name>
+ </resource-env-ref>
+ <resource-ref>
+ <res-ref-name>HelloTopic</res-ref-name>
+ <jndi-name>HelloTopic</jndi-name>
+ </resource-ref>
+
+
+</glassfish-web-app>
diff --git a/qpid/java/jca/example/conf/jboss-ejb-client.properties b/qpid/java/jca/example/conf/jboss-ejb-client.properties
new file mode 100644
index 0000000000..8bf1075c14
--- /dev/null
+++ b/qpid/java/jca/example/conf/jboss-ejb-client.properties
@@ -0,0 +1,12 @@
+endpoint.name=client-endpoint
+remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
+
+remote.connections=default
+
+remote.connection.default.host=localhost
+remote.connection.default.port = 4447
+remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
+
+remote.connection.default.username=wmprice
+remote.connection.default.password=72whtu78
+
diff --git a/qpid/java/jca/example/conf/log4j.properties b/qpid/java/jca/example/conf/log4j.properties
index f1847f4418..1139ab9e85 100644
--- a/qpid/java/jca/example/conf/log4j.properties
+++ b/qpid/java/jca/example/conf/log4j.properties
@@ -1,3 +1,21 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
log4j.rootLogger=DEBUG, CONSOLE, FILE
#Console Appender
diff --git a/qpid/java/jca/example/conf/qpid-jca-ds.xml b/qpid/java/jca/example/conf/qpid-jca-ds.xml
index 3c12e25020..ad75876808 100644
--- a/qpid/java/jca/example/conf/qpid-jca-ds.xml
+++ b/qpid/java/jca/example/conf/qpid-jca-ds.xml
@@ -27,7 +27,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidTopic</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.hello.topic.dest.address@
+ DestinationAddress=@qpid.hello.topic.dest.address@
</attribute>
</mbean>
@@ -37,7 +37,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidTopic</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.goodbye.topic.dest.address@
+ DestinationAddress=@qpid.goodbye.topic.dest.address@
</attribute>
</mbean>
@@ -47,7 +47,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidTopic</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.hellogoodbye.topic.dest.address@
+ DestinationAddress=@qpid.hellogoodbye.topic.dest.address@
</attribute>
</mbean>
@@ -57,7 +57,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidQueue</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.hello.queue.dest.address@
+ DestinationAddress=@qpid.hello.queue.dest.address@
</attribute>
</mbean>
@@ -67,7 +67,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidQueue</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.goodbye.queue.dest.address@
+ DestinationAddress=@qpid.goodbye.queue.dest.address@
</attribute>
</mbean>
@@ -77,7 +77,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidQueue</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.request.queue.dest.address@
+ DestinationAddress=@qpid.request.queue.dest.address@
</attribute>
</mbean>
@@ -87,7 +87,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">org.apache.qpid.ra.admin.QpidQueue</attribute>
<attribute name="Properties">
- destinationAddress=@qpid.response.queue.dest.address@
+ DestinationAddress=@qpid.response.queue.dest.address@
</attribute>
</mbean>
<mbean code="org.jboss.resource.deployment.AdminObject"
@@ -96,7 +96,7 @@
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='@rar.name@'</depends>
<attribute name="Type">javax.jms.ConnectionFactory</attribute>
<attribute name="Properties">
- connectionURL=@broker.url@
+ ConnectionURL=@broker.url@
</attribute>
</mbean>
diff --git a/qpid/java/jca/example/conf/qpid-standalone.xml b/qpid/java/jca/example/conf/qpid-standalone.xml
new file mode 100644
index 0000000000..8d6137aea7
--- /dev/null
+++ b/qpid/java/jca/example/conf/qpid-standalone.xml
@@ -0,0 +1,422 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+-->
+<?xml version='1.0' encoding='UTF-8'?>
+
+<server xmlns="urn:jboss:domain:1.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">
+
+ <extensions>
+ <extension module="org.jboss.as.clustering.infinispan"/>
+ <extension module="org.jboss.as.connector"/>
+ <extension module="org.jboss.as.configadmin"/>
+ <extension module="org.jboss.as.deployment-scanner"/>
+ <extension module="org.jboss.as.ee"/>
+ <extension module="org.jboss.as.ejb3"/>
+ <extension module="org.jboss.as.jaxr"/>
+ <extension module="org.jboss.as.jaxrs"/>
+ <extension module="org.jboss.as.jdr"/>
+ <extension module="org.jboss.as.jmx"/>
+ <extension module="org.jboss.as.jpa"/>
+ <extension module="org.jboss.as.logging"/>
+ <extension module="org.jboss.as.mail"/>
+ <extension module="org.jboss.as.naming"/>
+ <extension module="org.jboss.as.osgi"/>
+ <extension module="org.jboss.as.pojo"/>
+ <extension module="org.jboss.as.remoting"/>
+ <extension module="org.jboss.as.sar"/>
+ <extension module="org.jboss.as.security"/>
+ <extension module="org.jboss.as.threads"/>
+ <extension module="org.jboss.as.transactions"/>
+ <extension module="org.jboss.as.web"/>
+ <extension module="org.jboss.as.webservices"/>
+ <extension module="org.jboss.as.weld"/>
+ </extensions>
+
+ <management>
+ <security-realms>
+ <security-realm name="ManagementRealm">
+ <authentication>
+ <properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/>
+ </authentication>
+ </security-realm>
+ </security-realms>
+ <management-interfaces>
+ <native-interface security-realm="ManagementRealm">
+ <socket-binding native="management-native"/>
+ </native-interface>
+ <http-interface security-realm="ManagementRealm">
+ <socket-binding http="management-http"/>
+ </http-interface>
+ </management-interfaces>
+ </management>
+
+ <profile>
+ <subsystem xmlns="urn:jboss:domain:logging:1.1">
+ <console-handler name="CONSOLE">
+ <level name="INFO"/>
+ <formatter>
+ <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
+ </formatter>
+ </console-handler>
+ <periodic-rotating-file-handler name="FILE">
+ <formatter>
+ <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
+ </formatter>
+ <file relative-to="jboss.server.log.dir" path="server.log"/>
+ <suffix value=".yyyy-MM-dd"/>
+ <append value="true"/>
+ </periodic-rotating-file-handler>
+ <logger category="com.arjuna">
+ <level name="WARN"/>
+ </logger>
+ <logger category="org.apache.tomcat.util.modeler">
+ <level name="WARN"/>
+ </logger>
+ <logger category="sun.rmi">
+ <level name="WARN"/>
+ </logger>
+ <logger category="jacorb">
+ <level name="WARN"/>
+ </logger>
+ <logger category="jacorb.config">
+ <level name="ERROR"/>
+ </logger>
+ <root-logger>
+ <level name="DEBUG"/>
+ <handlers>
+ <handler name="CONSOLE"/>
+ <handler name="FILE"/>
+ </handlers>
+ </root-logger>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:configadmin:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:datasources:1.0">
+ <datasources>
+ <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
+ <connection-url>
+ jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
+ </connection-url>
+ <driver>
+ h2
+ </driver>
+ <security>
+ <user-name>
+ sa
+ </user-name>
+ <password>
+ sa
+ </password>
+ </security>
+ </datasource>
+ <drivers>
+ <driver name="h2" module="com.h2database.h2">
+ <xa-datasource-class>
+ org.h2.jdbcx.JdbcDataSource
+ </xa-datasource-class>
+ </driver>
+ </drivers>
+ </datasources>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:deployment-scanner:1.1">
+ <deployment-scanner name="default" path="deployments" scan-interval="5000" relative-to="jboss.server.base.dir"/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:ee:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:ejb3:1.2">
+ <session-bean>
+ <stateless>
+ <bean-instance-pool-ref pool-name="slsb-strict-max-pool"/>
+ </stateless>
+ <stateful default-access-timeout="5000" cache-ref="simple"/>
+ <singleton default-access-timeout="5000"/>
+ </session-bean>
+ <mdb>
+ <resource-adapter-ref resource-adapter-name="@rar.name@"/>
+ <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
+ </mdb>
+ <pools>
+ <bean-instance-pools>
+ <strict-max-pool name="slsb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
+ <strict-max-pool name="mdb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
+ </bean-instance-pools>
+ </pools>
+ <caches>
+ <cache name="simple" aliases="NoPassivationCache"/>
+ <cache name="passivating" passivation-store-ref="file" aliases="SimpleStatefulCache"/>
+ </caches>
+ <passivation-stores>
+ <file-passivation-store name="file"/>
+ </passivation-stores>
+ <async thread-pool-name="default"/>
+ <timer-service thread-pool-name="default">
+ <data-store path="timer-service-data" relative-to="jboss.server.data.dir"/>
+ </timer-service>
+ <remote connector-ref="remoting-connector" thread-pool-name="default"/>
+ <thread-pools>
+ <thread-pool name="default">
+ <max-threads count="10"/>
+ <keepalive-time time="100" unit="milliseconds"/>
+ </thread-pool>
+ </thread-pools>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:infinispan:1.1" default-cache-container="hibernate">
+ <cache-container name="hibernate" default-cache="local-query">
+ <local-cache name="entity">
+ <transaction mode="NON_XA"/>
+ <eviction strategy="LRU" max-entries="10000"/>
+ <expiration max-idle="100000"/>
+ </local-cache>
+ <local-cache name="local-query">
+ <transaction mode="NONE"/>
+ <eviction strategy="LRU" max-entries="10000"/>
+ <expiration max-idle="100000"/>
+ </local-cache>
+ <local-cache name="timestamps">
+ <transaction mode="NONE"/>
+ <eviction strategy="NONE"/>
+ </local-cache>
+ </cache-container>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:jaxr:1.0">
+ <connection-factory jndi-name="java:jboss/jaxr/ConnectionFactory"/>
+ <juddi-server publish-url="http://localhost:8080/juddi/publish" query-url="http://localhost:8080/juddi/query"/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:jca:1.1">
+ <archive-validation enabled="false"/>
+ <bean-validation enabled="false"/>
+ <default-workmanager>
+ <short-running-threads>
+ <core-threads count="50"/>
+ <queue-length count="50"/>
+ <max-threads count="50"/>
+ <keepalive-time time="10" unit="seconds"/>
+ </short-running-threads>
+ <long-running-threads>
+ <core-threads count="50"/>
+ <queue-length count="50"/>
+ <max-threads count="50"/>
+ <keepalive-time time="10" unit="seconds"/>
+ </long-running-threads>
+ </default-workmanager>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:jdr:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:jmx:1.1">
+ <show-model value="true"/>
+ <remoting-connector/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:jpa:1.0">
+ <jpa default-datasource=""/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:mail:1.0">
+ <mail-session jndi-name="java:jboss/mail/Default">
+ <smtp-server outbound-socket-binding-ref="mail-smtp"/>
+ </mail-session>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:naming:1.1"/>
+ <subsystem xmlns="urn:jboss:domain:osgi:1.2" activation="lazy">
+ <properties>
+ <property name="org.osgi.framework.startlevel.beginning">
+ 1
+ </property>
+ </properties>
+ <capabilities>
+ <capability name="javax.servlet.api"/>
+ <capability name="javax.transaction.api"/>
+ <capability name="org.apache.felix.log" startlevel="1"/>
+ <capability name="org.jboss.osgi.logging" startlevel="1"/>
+ <capability name="org.apache.felix.configadmin" startlevel="1"/>
+ <capability name="org.jboss.as.osgi.configadmin" startlevel="1"/>
+ <capability name="org.jboss.osgi.repository" startlevel="1"/>
+ </capabilities>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:pojo:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:remoting:1.1">
+ <connector name="remoting-connector" socket-binding="remoting"/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:resource-adapters:1.0">
+ <resource-adapters>
+ <resource-adapter>
+ <archive>
+ @rar.name@
+ </archive>
+ <transaction-support>
+ XATransaction
+ </transaction-support>
+ <config-property name="connectionURL">
+ @broker.url@
+ </config-property>
+ <config-property name="TransactionManagerLocatorClass">
+ org.apache.qpid.ra.tm.JBoss7TransactionManagerLocator
+ </config-property>
+ <config-property name="TransactionManagerLocatorMethod">
+ getTm
+ </config-property>
+ <connection-definitions>
+ <connection-definition class-name="org.apache.qpid.ra.QpidRAManagedConnectionFactory" jndi-name="QpidJMSXA" pool-name="QpidJMSXA">
+ <config-property name="connectionURL">
+ @broker.url@
+ </config-property>
+ <config-property name="SessionDefaultType">
+ javax.jms.Queue
+ </config-property>
+ </connection-definition>
+ </connection-definitions>
+ <admin-objects>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidConnectionFactoryProxy" jndi-name="java:jboss/exported/QpidConnectionFactory" use-java-context="false">
+ <config-property name="ConnectionURL">
+ @broker.url@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidTopicImpl" jndi-name="java:jboss/exported/GoodByeTopic" use-java-context="false" pool-name="GoodByeTopic">
+ <config-property name="DestinationAddress">
+ @qpid.hello.topic.dest.address@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidTopicImpl" jndi-name="java:jboss/exported/HelloTopic" use-java-context="false" pool-name="HelloTopic">
+ <config-property name="DestinationAddress">
+ @qpid.goodbye.topic.dest.address@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="java:jboss/exported/GoodByeQueue" use-java-context="false" pool-name="GoodByeQueue">
+ <config-property name="DestinationAddress">
+ @qpid.goodbye.queue.dest.address@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="java:jboss/exported/HelloQueue" use-java-context="false" pool-name="HelloQueue">
+ <config-property name="DestinationAddress">
+ @qpid.hello.queue.dest.address@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="java:jboss/exported/QpidRequestQueue" use-java-context="false" pool-name="QpidRequestQueue">
+ <config-property name="DestinationAddress">
+ @qpid.request.queue.dest.address@
+ </config-property>
+ </admin-object>
+ <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="java:jboss/exported/QpidResponseQueue" use-java-context="false" pool-name="QpidResponseQueue">
+ <config-property name="DestinationAddress">
+ @qpid.response.queue.dest.address@
+ </config-property>
+ </admin-object>
+ </admin-objects>
+ </resource-adapter>
+ </resource-adapters>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:sar:1.0"/>
+ <subsystem xmlns="urn:jboss:domain:security:1.1">
+ <security-domains>
+ <security-domain name="other" cache-type="default">
+ <authentication>
+ <login-module code="UsersRoles" flag="required"/>
+ </authentication>
+ </security-domain>
+ <security-domain name="jboss-web-policy" cache-type="default">
+ <authorization>
+ <policy-module code="Delegating" flag="required"/>
+ </authorization>
+ </security-domain>
+ <security-domain name="jboss-ejb-policy" cache-type="default">
+ <authorization>
+ <policy-module code="Delegating" flag="required"/>
+ </authorization>
+ </security-domain>
+ </security-domains>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:threads:1.1"/>
+ <subsystem xmlns="urn:jboss:domain:transactions:1.1">
+ <core-environment>
+ <process-id>
+ <uuid/>
+ </process-id>
+ </core-environment>
+ <recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/>
+ <coordinator-environment default-timeout="300"/>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host">
+ <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
+ <virtual-server name="default-host" enable-welcome-root="true">
+ <alias name="localhost"/>
+ <alias name="example.com"/>
+ </virtual-server>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:webservices:1.0" xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:jaxwsconfig="urn:jboss:jbossws-jaxws-config:4.0">
+ <modify-wsdl-address>
+ true
+ </modify-wsdl-address>
+ <wsdl-host>
+ ${jboss.bind.address:127.0.0.1}
+ </wsdl-host>
+ <endpoint-config>
+ <jaxwsconfig:config-name>
+ Standard-Endpoint-Config
+ </jaxwsconfig:config-name>
+ </endpoint-config>
+ <endpoint-config>
+ <jaxwsconfig:config-name>
+ Recording-Endpoint-Config
+ </jaxwsconfig:config-name>
+ <jaxwsconfig:pre-handler-chains>
+ <javaee:handler-chain id="recording-handlers">
+ <javaee:protocol-bindings>
+ ##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM
+ </javaee:protocol-bindings>
+ <javaee:handler>
+ <javaee:handler-name>
+ RecordingHandler
+ </javaee:handler-name>
+ <javaee:handler-class>
+ org.jboss.ws.common.invocation.RecordingServerHandler
+ </javaee:handler-class>
+ </javaee:handler>
+ </javaee:handler-chain>
+ </jaxwsconfig:pre-handler-chains>
+ </endpoint-config>
+ </subsystem>
+ <subsystem xmlns="urn:jboss:domain:weld:1.0"/>
+ </profile>
+
+ <interfaces>
+ <interface name="management">
+ <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
+ </interface>
+ <interface name="public">
+ <inet-address value="${jboss.bind.address:127.0.0.1}"/>
+ </interface>
+ </interfaces>
+
+ <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
+ <socket-binding name="http" port="8080"/>
+ <socket-binding name="https" port="8443"/>
+ <socket-binding name="jacorb" port="3528"/>
+ <socket-binding name="jacorb-ssl" port="3529"/>
+ <socket-binding name="management-native" interface="management" port="${jboss.management.native.port:9999}"/>
+ <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
+ <socket-binding name="messaging" port="5445"/>
+ <socket-binding name="messaging-throughput" port="5455"/>
+ <socket-binding name="osgi-http" interface="management" port="8090"/>
+ <socket-binding name="remoting" port="4447"/>
+ <socket-binding name="txn-recovery-environment" port="4712"/>
+ <socket-binding name="txn-status-manager" port="4713"/>
+ <outbound-socket-binding name="mail-smtp">
+ <remote-destination host="localhost" port="25"/>
+ </outbound-socket-binding>
+ </socket-binding-group>
+
+
+</server>
diff --git a/qpid/java/jca/example/conf/standalone.xml b/qpid/java/jca/example/conf/standalone.xml
deleted file mode 100644
index 5d4256f8e7..0000000000
--- a/qpid/java/jca/example/conf/standalone.xml
+++ /dev/null
@@ -1,417 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
--->
-<?xml version='1.0' encoding='UTF-8'?>
-
-<server xmlns="urn:jboss:domain:1.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance">
-
- <extensions>
- <extension module="org.jboss.as.clustering.infinispan"/>
- <extension module="org.jboss.as.connector"/>
- <extension module="org.jboss.as.configadmin"/>
- <extension module="org.jboss.as.deployment-scanner"/>
- <extension module="org.jboss.as.ee"/>
- <extension module="org.jboss.as.ejb3"/>
- <extension module="org.jboss.as.jaxr"/>
- <extension module="org.jboss.as.jaxrs"/>
- <extension module="org.jboss.as.jdr"/>
- <extension module="org.jboss.as.jmx"/>
- <extension module="org.jboss.as.jpa"/>
- <extension module="org.jboss.as.logging"/>
- <extension module="org.jboss.as.mail"/>
- <extension module="org.jboss.as.naming"/>
- <extension module="org.jboss.as.osgi"/>
- <extension module="org.jboss.as.pojo"/>
- <extension module="org.jboss.as.remoting"/>
- <extension module="org.jboss.as.sar"/>
- <extension module="org.jboss.as.security"/>
- <extension module="org.jboss.as.threads"/>
- <extension module="org.jboss.as.transactions"/>
- <extension module="org.jboss.as.web"/>
- <extension module="org.jboss.as.webservices"/>
- <extension module="org.jboss.as.weld"/>
- </extensions>
-
- <management>
- <security-realms>
- <security-realm name="ManagementRealm">
- <authentication>
- <properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/>
- </authentication>
- </security-realm>
- </security-realms>
- <management-interfaces>
- <native-interface security-realm="ManagementRealm">
- <socket-binding native="management-native"/>
- </native-interface>
- <http-interface security-realm="ManagementRealm">
- <socket-binding http="management-http"/>
- </http-interface>
- </management-interfaces>
- </management>
-
- <profile>
- <subsystem xmlns="urn:jboss:domain:logging:1.1">
- <console-handler name="CONSOLE">
- <level name="INFO"/>
- <formatter>
- <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
- </formatter>
- </console-handler>
- <periodic-rotating-file-handler name="FILE">
- <formatter>
- <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
- </formatter>
- <file relative-to="jboss.server.log.dir" path="server.log"/>
- <suffix value=".yyyy-MM-dd"/>
- <append value="true"/>
- </periodic-rotating-file-handler>
- <logger category="com.arjuna">
- <level name="WARN"/>
- </logger>
- <logger category="org.apache.tomcat.util.modeler">
- <level name="WARN"/>
- </logger>
- <logger category="sun.rmi">
- <level name="WARN"/>
- </logger>
- <logger category="jacorb">
- <level name="WARN"/>
- </logger>
- <logger category="jacorb.config">
- <level name="ERROR"/>
- </logger>
- <root-logger>
- <level name="DEBUG"/>
- <handlers>
- <handler name="CONSOLE"/>
- <handler name="FILE"/>
- </handlers>
- </root-logger>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:configadmin:1.0"/>
- <subsystem xmlns="urn:jboss:domain:datasources:1.0">
- <datasources>
- <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
- <connection-url>
- jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
- </connection-url>
- <driver>
- h2
- </driver>
- <security>
- <user-name>
- sa
- </user-name>
- <password>
- sa
- </password>
- </security>
- </datasource>
- <drivers>
- <driver name="h2" module="com.h2database.h2">
- <xa-datasource-class>
- org.h2.jdbcx.JdbcDataSource
- </xa-datasource-class>
- </driver>
- </drivers>
- </datasources>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:deployment-scanner:1.1">
- <deployment-scanner name="default" path="deployments" scan-interval="5000" relative-to="jboss.server.base.dir"/>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:ee:1.0"/>
- <subsystem xmlns="urn:jboss:domain:ejb3:1.2">
- <session-bean>
- <stateless>
- <bean-instance-pool-ref pool-name="slsb-strict-max-pool"/>
- </stateless>
- <stateful default-access-timeout="5000" cache-ref="simple"/>
- <singleton default-access-timeout="5000"/>
- </session-bean>
- <mdb>
- <resource-adapter-ref resource-adapter-name="@rar.name@"/>
- <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
- </mdb>
- <pools>
- <bean-instance-pools>
- <strict-max-pool name="slsb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
- <strict-max-pool name="mdb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
- </bean-instance-pools>
- </pools>
- <caches>
- <cache name="simple" aliases="NoPassivationCache"/>
- <cache name="passivating" passivation-store-ref="file" aliases="SimpleStatefulCache"/>
- </caches>
- <passivation-stores>
- <file-passivation-store name="file"/>
- </passivation-stores>
- <async thread-pool-name="default"/>
- <timer-service thread-pool-name="default">
- <data-store path="timer-service-data" relative-to="jboss.server.data.dir"/>
- </timer-service>
- <remote connector-ref="remoting-connector" thread-pool-name="default"/>
- <thread-pools>
- <thread-pool name="default">
- <max-threads count="10"/>
- <keepalive-time time="100" unit="milliseconds"/>
- </thread-pool>
- </thread-pools>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:infinispan:1.1" default-cache-container="hibernate">
- <cache-container name="hibernate" default-cache="local-query">
- <local-cache name="entity">
- <transaction mode="NON_XA"/>
- <eviction strategy="LRU" max-entries="10000"/>
- <expiration max-idle="100000"/>
- </local-cache>
- <local-cache name="local-query">
- <transaction mode="NONE"/>
- <eviction strategy="LRU" max-entries="10000"/>
- <expiration max-idle="100000"/>
- </local-cache>
- <local-cache name="timestamps">
- <transaction mode="NONE"/>
- <eviction strategy="NONE"/>
- </local-cache>
- </cache-container>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:jaxr:1.0">
- <connection-factory jndi-name="java:jboss/jaxr/ConnectionFactory"/>
- <juddi-server publish-url="http://localhost:8080/juddi/publish" query-url="http://localhost:8080/juddi/query"/>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>
- <subsystem xmlns="urn:jboss:domain:jca:1.1">
- <archive-validation enabled="false"/>
- <bean-validation enabled="false"/>
- <default-workmanager>
- <short-running-threads>
- <core-threads count="50"/>
- <queue-length count="50"/>
- <max-threads count="50"/>
- <keepalive-time time="10" unit="seconds"/>
- </short-running-threads>
- <long-running-threads>
- <core-threads count="50"/>
- <queue-length count="50"/>
- <max-threads count="50"/>
- <keepalive-time time="10" unit="seconds"/>
- </long-running-threads>
- </default-workmanager>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:jdr:1.0"/>
- <subsystem xmlns="urn:jboss:domain:jmx:1.1">
- <show-model value="true"/>
- <remoting-connector/>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:jpa:1.0">
- <jpa default-datasource=""/>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:mail:1.0">
- <mail-session jndi-name="java:jboss/mail/Default">
- <smtp-server outbound-socket-binding-ref="mail-smtp"/>
- </mail-session>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:naming:1.1"/>
- <subsystem xmlns="urn:jboss:domain:osgi:1.2" activation="lazy">
- <properties>
- <property name="org.osgi.framework.startlevel.beginning">
- 1
- </property>
- </properties>
- <capabilities>
- <capability name="javax.servlet.api"/>
- <capability name="javax.transaction.api"/>
- <capability name="org.apache.felix.log" startlevel="1"/>
- <capability name="org.jboss.osgi.logging" startlevel="1"/>
- <capability name="org.apache.felix.configadmin" startlevel="1"/>
- <capability name="org.jboss.as.osgi.configadmin" startlevel="1"/>
- <capability name="org.jboss.osgi.repository" startlevel="1"/>
- </capabilities>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:pojo:1.0"/>
- <subsystem xmlns="urn:jboss:domain:remoting:1.1">
- <connector name="remoting-connector" socket-binding="remoting"/>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:resource-adapters:1.0">
- <resource-adapters>
- <resource-adapter>
- <archive>
- @rar.name@
- </archive>
- <transaction-support>
- XATransaction
- </transaction-support>
- <config-property name="connectionURL">
- @broker.url@
- </config-property>
- <config-property name="TransactionManagerLocatorClass">
- org.apache.qpid.ra.tm.JBoss7TransactionManagerLocator
- </config-property>
- <config-property name="TransactionManagerLocatorMethod">
- getTm
- </config-property>
- <connection-definitions>
- <connection-definition class-name="org.apache.qpid.ra.QpidRAManagedConnectionFactory" jndi-name="QpidJMSXA" pool-name="QpidJMSXA">
- <config-property name="connectionURL">
- @broker.url@
- </config-property>
- <config-property name="SessionDefaultType">
- javax.jms.Queue
- </config-property>
- </connection-definition>
- </connection-definitions>
- <admin-objects>
- <admin-object class-name="org.apache.qpid.ra.admin.QpidConnectionFactoryProxy" jndi-name="QpidJMS" use-java-context="false">
- <config-property name="ConnectionURL">
- @broker.url@
- </config-property>
- </admin-object>
- <admin-object class-name="org.apache.qpid.ra.admin.QpidTopicImpl" jndi-name="GoodByeTopic" use-java-context="false" pool-name="GoodByeTopic">
- <config-property name="destinationAddress">
- @qpid.hello.topic.dest.address@
- </config-property>
- </admin-object>
- <admin-object class-name="org.apache.qpid.ra.admin.QpidTopicImpl" jndi-name="HelloTopic" use-java-context="false" pool-name="HelloTopic">
- <config-property name="destinationAddress">
- @qpid.goodbye.topic.dest.address@
- </config-property>
- </admin-object>
- <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="GoodByeQueue" use-java-context="false" pool-name="GoodByeQueue">
- <config-property name="destinationAddress">
- @qpid.goodbye.queue.dest.address@
- </config-property>
- </admin-object>
- <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="HelloQueue" use-java-context="false" pool-name="HelloQueue">
- <config-property name="destinationAddress">
- @qpid.hello.queue.dest.address@
- </config-property>
- </admin-object>
- <admin-object class-name="org.apache.qpid.ra.admin.QpidQueueImpl" jndi-name="QpidResponderQueue" use-java-context="false" pool-name="QpidResponderQueue">
- <config-property name="destinationAddress">
- @qpid.responder.queue.dest.address@
- </config-property>
- </admin-object>
- </admin-objects>
- </resource-adapter>
- </resource-adapters>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:sar:1.0"/>
- <subsystem xmlns="urn:jboss:domain:security:1.1">
- <security-domains>
- <security-domain name="other" cache-type="default">
- <authentication>
- <login-module code="UsersRoles" flag="required"/>
- </authentication>
- </security-domain>
- <security-domain name="jboss-web-policy" cache-type="default">
- <authorization>
- <policy-module code="Delegating" flag="required"/>
- </authorization>
- </security-domain>
- <security-domain name="jboss-ejb-policy" cache-type="default">
- <authorization>
- <policy-module code="Delegating" flag="required"/>
- </authorization>
- </security-domain>
- </security-domains>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:threads:1.1"/>
- <subsystem xmlns="urn:jboss:domain:transactions:1.1">
- <core-environment>
- <process-id>
- <uuid/>
- </process-id>
- </core-environment>
- <recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/>
- <coordinator-environment default-timeout="300"/>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host">
- <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
- <virtual-server name="default-host" enable-welcome-root="true">
- <alias name="localhost"/>
- <alias name="example.com"/>
- </virtual-server>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:webservices:1.0" xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:jaxwsconfig="urn:jboss:jbossws-jaxws-config:4.0">
- <modify-wsdl-address>
- true
- </modify-wsdl-address>
- <wsdl-host>
- ${jboss.bind.address:127.0.0.1}
- </wsdl-host>
- <endpoint-config>
- <jaxwsconfig:config-name>
- Standard-Endpoint-Config
- </jaxwsconfig:config-name>
- </endpoint-config>
- <endpoint-config>
- <jaxwsconfig:config-name>
- Recording-Endpoint-Config
- </jaxwsconfig:config-name>
- <jaxwsconfig:pre-handler-chains>
- <javaee:handler-chain id="recording-handlers">
- <javaee:protocol-bindings>
- ##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM
- </javaee:protocol-bindings>
- <javaee:handler>
- <javaee:handler-name>
- RecordingHandler
- </javaee:handler-name>
- <javaee:handler-class>
- org.jboss.ws.common.invocation.RecordingServerHandler
- </javaee:handler-class>
- </javaee:handler>
- </javaee:handler-chain>
- </jaxwsconfig:pre-handler-chains>
- </endpoint-config>
- </subsystem>
- <subsystem xmlns="urn:jboss:domain:weld:1.0"/>
- </profile>
-
- <interfaces>
- <interface name="management">
- <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
- </interface>
- <interface name="public">
- <inet-address value="${jboss.bind.address:127.0.0.1}"/>
- </interface>
- </interfaces>
-
- <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
- <socket-binding name="http" port="8080"/>
- <socket-binding name="https" port="8443"/>
- <socket-binding name="jacorb" port="3528"/>
- <socket-binding name="jacorb-ssl" port="3529"/>
- <socket-binding name="management-native" interface="management" port="${jboss.management.native.port:9999}"/>
- <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
- <socket-binding name="messaging" port="5445"/>
- <socket-binding name="messaging-throughput" port="5455"/>
- <socket-binding name="osgi-http" interface="management" port="8090"/>
- <socket-binding name="remoting" port="4447"/>
- <socket-binding name="txn-recovery-environment" port="4712"/>
- <socket-binding name="txn-status-manager" port="4713"/>
- <outbound-socket-binding name="mail-smtp">
- <remote-destination host="localhost" port="25"/>
- </outbound-socket-binding>
- </socket-binding-group>
-
-
-</server>
diff --git a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/client/QpidRequestResponseClient.java b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/client/QpidRequestResponseClient.java
index 734df1c0f3..fd5b3efff0 100644
--- a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/client/QpidRequestResponseClient.java
+++ b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/client/QpidRequestResponseClient.java
@@ -42,7 +42,7 @@ public class QpidRequestResponseClient implements MessageListener, Runnable
private static final Logger _log = LoggerFactory.getLogger(QpidRequestResponseClient.class);
private static final String DEFAULT_CF_JNDI = "QpidConnectionFactory";
- private static final String DEFAULT_DESTINATION_JNDI = "QpidResponderQueue";
+ private static final String DEFAULT_DESTINATION_JNDI = "QpidRequestQueue";
private static final String DEFAULT_MESSAGE = "Hello, World!";
private static final int DEFAULT_MESSAGE_COUNT = 1;
private static final int DEFAULT_THREAD_COUNT = 1;
diff --git a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeListenerBean.java b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeListenerBean.java
index 9cf220de2a..bdb722a87b 100644
--- a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeListenerBean.java
+++ b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeListenerBean.java
@@ -34,7 +34,7 @@ import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
- @ActivationConfigProperty(propertyName = "destination", propertyValue = "@qpid.goodbye.queue.jndi.name@"),
+ @ActivationConfigProperty(propertyName = "destination", propertyValue = "@jndi.prefix@@qpid.goodbye.queue.jndi.name@"),
@ActivationConfigProperty(propertyName = "connectionURL", propertyValue = "@broker.url@"),
@ActivationConfigProperty(propertyName = "useLocalTx", propertyValue = "false"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10")
diff --git a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeSubscriberBean.java b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeSubscriberBean.java
index 2e43898ed7..f2e4d6aaa5 100644
--- a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeSubscriberBean.java
+++ b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidGoodByeSubscriberBean.java
@@ -34,7 +34,7 @@ import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
- @ActivationConfigProperty(propertyName = "destination", propertyValue = "@qpid.goodbye.topic.jndi.name@"),
+ @ActivationConfigProperty(propertyName = "destination", propertyValue = "@jndi.prefix@@qpid.goodbye.topic.jndi.name@"),
@ActivationConfigProperty(propertyName = "connectionURL", propertyValue = "@broker.url@"),
@ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "NotDurable"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10")
diff --git a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloListenerBean.java b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloListenerBean.java
index 7cb7095ff4..42a9ab6f60 100644
--- a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloListenerBean.java
+++ b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloListenerBean.java
@@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
- @ActivationConfigProperty(propertyName = "destination", propertyValue = "@qpid.hello.queue.jndi.name@"),
+ @ActivationConfigProperty(propertyName = "destination", propertyValue = "@jndi.prefix@@qpid.hello.queue.jndi.name@"),
@ActivationConfigProperty(propertyName = "connectionURL", propertyValue = "@broker.url@"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10")
})
diff --git a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloSubscriberBean.java b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloSubscriberBean.java
index 768cf25c3c..882c85fa18 100644
--- a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloSubscriberBean.java
+++ b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidHelloSubscriberBean.java
@@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
- @ActivationConfigProperty(propertyName = "destination", propertyValue = "@qpid.hello.topic.jndi.name@"),
+ @ActivationConfigProperty(propertyName = "destination", propertyValue = "@jndi.prefix@@qpid.hello.topic.jndi.name@"),
@ActivationConfigProperty(propertyName = "connectionURL", propertyValue = "@broker.url@"),
@ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "NotDurable"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10")
diff --git a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidJMSResponderBean.java b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidJMSResponderBean.java
index d4562511d0..6e99d4fe7f 100644
--- a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidJMSResponderBean.java
+++ b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidJMSResponderBean.java
@@ -41,7 +41,7 @@ import org.slf4j.LoggerFactory;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
- @ActivationConfigProperty(propertyName = "destination", propertyValue = "@qpid.request.queue.jndi.name@"),
+ @ActivationConfigProperty(propertyName = "destination", propertyValue = "@jndi.prefix@@qpid.request.queue.jndi.name@"),
@ActivationConfigProperty(propertyName = "connectionURL", propertyValue = "@broker.url@"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "10")
})
diff --git a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidTestBean.java b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidTestBean.java
index 014b459699..a5f4770257 100644
--- a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidTestBean.java
+++ b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/ejb/QpidTestBean.java
@@ -43,10 +43,10 @@ public class QpidTestBean implements QpidTestRemote, QpidTestLocal
@Resource(@jndi.scheme@="@qpid.xacf.jndi.name@")
private ConnectionFactory _connectionFactory;
- @Resource(@jndi.scheme@="HelloQueue")
+ @Resource(@jndi.scheme@="@qpid.hello.queue.jndi.name@")
private Destination _queue;
- @Resource(@jndi.scheme@="HelloTopic")
+ @Resource(@jndi.scheme@="@qpid.hello.topic.jndi.name@")
private Destination _topic;
@Override
diff --git a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidRequestResponseServlet.java b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidRequestResponseServlet.java
index 195a54242f..d069a0c943 100644
--- a/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidRequestResponseServlet.java
+++ b/qpid/java/jca/example/src/main/java/org/apache/qpid/jca/example/web/QpidRequestResponseServlet.java
@@ -59,10 +59,10 @@ public class QpidRequestResponseServlet extends HttpServlet
@Resource(@jndi.scheme@="@qpid.xacf.jndi.name@")
private ConnectionFactory _connectionFactory;
- @Resource(@jndi.scheme@="QpidRequestQueue")
+ @Resource(@jndi.scheme@="@qpid.request.queue.jndi.name@")
private Destination _queue;
- @Resource(@jndi.scheme@="QpidResponseQueue")
+ @Resource(@jndi.scheme@="@qpid.response.queue.jndi.name@")
private Destination _responseQueue;
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/ConnectionFactoryProperties.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/ConnectionFactoryProperties.java
index a7b36bc98c..3bddfd80a4 100644
--- a/qpid/java/jca/src/main/java/org/apache/qpid/ra/ConnectionFactoryProperties.java
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/ConnectionFactoryProperties.java
@@ -34,7 +34,7 @@ public class ConnectionFactoryProperties
private boolean _hasBeenUpdated = false;
- private String _clientID;
+ private String _clientId;
private String _connectionURL;
@@ -56,7 +56,7 @@ public class ConnectionFactoryProperties
{
_log.trace("getClientID()");
}
- return _clientID;
+ return _clientId;
}
public void setClientId(final String clientID)
@@ -66,7 +66,7 @@ public class ConnectionFactoryProperties
_log.trace("setClientID(" + clientID + ")");
}
_hasBeenUpdated = true;
- this._clientID = clientID;
+ this._clientId = clientID;
}
public boolean isHasBeenUpdated()
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAConnectionRequestInfo.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAConnectionRequestInfo.java
index c37a264ebc..779709839a 100644
--- a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAConnectionRequestInfo.java
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAConnectionRequestInfo.java
@@ -45,7 +45,7 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
private String _password;
/** The client id */
- private String _clientID;
+ private String _clientId;
/** The type */
private final int _type;
@@ -76,13 +76,13 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
final ConnectionURL connectionURL = ra.getDefaultAMQConnectionFactory().getConnectionURL() ;
_userName = connectionURL.getUsername();
_password = connectionURL.getPassword();
- _clientID = connectionURL.getClientName();
+ _clientId = connectionURL.getClientName();
}
else
{
- _userName = ra.getDefaultUserName();
- _password = ra.getDefaultPassword();
- _clientID = ra.getClientId();
+ _userName = ra.getUserName();
+ _password = ra.getPassword();
+ _clientId = ra.getClientId();
}
this._type = type;
_transacted = true;
@@ -142,9 +142,9 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
{
_password = connectionURL.getPassword();
}
- if (_clientID == null)
+ if (_clientId == null)
{
- _clientID = connectionURL.getClientName();
+ _clientId = connectionURL.getClientName();
}
}
@@ -170,15 +170,15 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
{
if (_userName == null)
{
- _userName = ra.getDefaultUserName();
+ _userName = ra.getUserName();
}
if (_password == null)
{
- _password = ra.getDefaultPassword();
+ _password = ra.getPassword();
}
- if (_clientID == null)
+ if (_clientId == null)
{
- _clientID = ra.getClientId();
+ _clientId = ra.getClientId();
}
}
}
@@ -243,28 +243,28 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
* Get the client id
* @return The value
*/
- public String getClientID()
+ public String getClientId()
{
if (_log.isTraceEnabled())
{
_log.trace("getClientID()");
}
- return _clientID;
+ return _clientId;
}
/**
* Set the client id
* @param clientID The value
*/
- public void setClientID(final String clientID)
+ public void setClientId(final String clientID)
{
if (_log.isTraceEnabled())
{
_log.trace("setClientID(" + clientID + ")");
}
- this._clientID = clientID;
+ this._clientId = clientID;
}
/**
@@ -321,7 +321,7 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
{
QpidRAConnectionRequestInfo you = (QpidRAConnectionRequestInfo)obj;
return Util.compare(_userName, you.getUserName()) && Util.compare(_password, you.getPassword()) &&
- Util.compare(_clientID, you.getClientID()) &&
+ Util.compare(_clientId, you.getClientId()) &&
_type == you.getType() &&
_transacted == you.isTransacted() &&
_acknowledgeMode == you.getAcknowledgeMode();
@@ -343,7 +343,7 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
hash += 31 * hash + (_userName != null ? _userName.hashCode() : 0);
hash += 31 * hash + (_password != null ? _password.hashCode() : 0);
- hash += 31 * hash + (_clientID != null ? _clientID.hashCode() : 0);
+ hash += 31 * hash + (_clientId != null ? _clientId.hashCode() : 0);
hash += 31 * hash + _type;
hash += 31 * hash + (_transacted ? 1 : 0);
hash += 31 * hash + _acknowledgeMode;
@@ -356,6 +356,6 @@ public class QpidRAConnectionRequestInfo implements ConnectionRequestInfo
{
return "QpidRAConnectionRequestInfo[type=" + _type +
", transacted=" + _transacted + ", acknowledgeMode=" + _acknowledgeMode +
- ", clientID=" + _clientID + ", userName=" + _userName + ((_password != null) ? ", password=********]" :"]");
+ ", clientID=" + _clientId + ", userName=" + _userName + ((_password != null) ? ", password=********]" :"]");
}
}
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java
index 318485a7f2..8744a9deec 100644
--- a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java
@@ -365,12 +365,12 @@ public class QpidRAManagedConnectionFactory implements ManagedConnectionFactory,
_mcfProperties.setSessionDefaultType(type);
}
- public String getClientID()
+ public String getClientId()
{
return _mcfProperties.getClientId();
}
- public void setClientID(final String clientID)
+ public void setClientId(final String clientID)
{
_mcfProperties.setClientId(clientID);
}
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAProperties.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAProperties.java
index 21f7d2574f..1ded1a8db2 100644
--- a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAProperties.java
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAProperties.java
@@ -66,34 +66,6 @@ public class QpidRAProperties extends ConnectionFactoryProperties implements Ser
}
}
- /**
- * Get the use XA flag
- * @return The value
- */
- public Boolean getUseLocalTx()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("getUseLocalTx()");
- }
-
- return _localTx;
- }
-
- /**
- * Set the use XA flag
- * @param localTx The value
- */
- public void setUseLocalTx(final Boolean localTx)
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("setUseLocalTx(" + localTx + ")");
- }
-
- this._localTx = localTx;
- }
-
public void setTransactionManagerLocatorClass(final String transactionManagerLocatorClass)
{
if (_log.isTraceEnabled())
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactoryImpl.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactoryImpl.java
index 6d7a8d26bd..f3253e1400 100644
--- a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactoryImpl.java
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRASessionFactoryImpl.java
@@ -742,7 +742,7 @@ public class QpidRASessionFactoryImpl implements QpidRASessionFactory, Reference
QpidRAConnectionRequestInfo info = new QpidRAConnectionRequestInfo(sessionType);
info.setUserName(_userName);
info.setPassword(_password);
- info.setClientID(_clientID);
+ info.setClientId(_clientID);
info.setDefaults(_mcf.getDefaultAMQConnectionFactory().getConnectionURL());
if (_log.isTraceEnabled())
@@ -839,7 +839,7 @@ public class QpidRASessionFactoryImpl implements QpidRASessionFactory, Reference
sessionType);
info.setUserName(_userName);
info.setPassword(_password);
- info.setClientID(_clientID);
+ info.setClientId(_clientID);
info.setDefaults(_mcf.getDefaultAMQConnectionFactory().getConnectionURL());
if (_log.isTraceEnabled())
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidResourceAdapter.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidResourceAdapter.java
index 363af1bbcd..14b5354062 100644
--- a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidResourceAdapter.java
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidResourceAdapter.java
@@ -223,65 +223,6 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
_log.info("Qpid resource adapter stopped");
}
- /**
- * Get the user name
- *
- * @return The value
- */
- public String getDefaultUserName()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("getUserName()");
- }
-
- return _raProperties.getUserName();
- }
-
- /**
- * Set the user name
- *
- * @param userName The value
- */
- public void setDefaultUserName(final String userName)
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("setUserName(" + userName + ")");
- }
-
- _raProperties.setUserName(userName);
- }
-
- /**
- * Get the password
- *
- * @return The value
- */
- public String getDefaultPassword()
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("getPassword()");
- }
-
- return _raProperties.getPassword();
- }
-
- /**
- * Set the password
- *
- * @param password The value
- */
- public void setDefaultPassword(final String password)
- {
- if (_log.isTraceEnabled())
- {
- _log.trace("setPassword(****)");
- }
-
- _raProperties.setPassword(password);
- }
/**
* Get the client ID
@@ -403,6 +344,26 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
_raProperties.setPath(path);
}
+ public String getUserName()
+ {
+ return _raProperties.getUserName();
+ }
+
+ public void setUserName(String userName)
+ {
+ _raProperties.setUserName(userName);
+ }
+
+ public String getPassword()
+ {
+ return _raProperties.getPassword();
+ }
+
+ public void setPassword(String password)
+ {
+ _raProperties.setPassword(password);
+ }
+
/**
* Get the connection url
*
@@ -493,14 +454,14 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
*
* @return The value
*/
- public Boolean getUseLocalTx()
+ public Boolean isUseLocalTx()
{
if (_log.isTraceEnabled())
{
_log.trace("getUseLocalTx()");
}
- return _raProperties.getUseLocalTx();
+ return _raProperties.isUseLocalTx();
}
/**
@@ -720,7 +681,7 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
return map;
}
- private void locateTM()
+ private void locateTM() throws ResourceAdapterInternalException
{
if(_raProperties.getTransactionManagerLocatorClass() != null && _raProperties.getTransactionManagerLocatorMethod() != null)
{
@@ -742,8 +703,8 @@ public class QpidResourceAdapter implements ResourceAdapter, Serializable
if (_tm == null)
{
- _log.warn("It wasn't possible to lookup a Transaction Manager through the configured properties TransactionManagerLocatorClass and TransactionManagerLocatorMethod");
- _log.warn("Qpid Resource Adapter won't be able to set and verify transaction timeouts in certain cases.");
+ _log.error("It wasn't possible to locate javax.transaction.TransactionManager via the RA properties TransactionManagerLocatorClass and TransactionManagerLocatorMethod");
+ throw new ResourceAdapterInternalException("Could not locate javax.transaction.TransactionManager");
}
else
{
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidConnectionFactoryProxy.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidConnectionFactoryProxy.java
index 41242fefae..a948948d6a 100644
--- a/qpid/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidConnectionFactoryProxy.java
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/admin/QpidConnectionFactoryProxy.java
@@ -77,17 +77,17 @@ public class QpidConnectionFactoryProxy implements Externalizable, Referenceable
public void writeExternal(ObjectOutput out) throws IOException
{
- if (_delegate == null)
- {
- _log.error("Null Destination ");
- throw new IOException("Null ConnectionFactory!");
- }
try
{
+ if(_delegate == null)
+ {
+ getReference();
+ }
+
out.writeObject(((Referenceable) _delegate).getReference());
}
- catch (NamingException e)
+ catch (Exception e)
{
_log.error("Failed to dereference ConnectionFactory " + e.getMessage(), e);
throw new IOException("Failed to dereference ConnectionFactory: " + e.getMessage());
@@ -137,7 +137,20 @@ public class QpidConnectionFactoryProxy implements Externalizable, Referenceable
*/
public Connection createConnection() throws JMSException
{
- return _delegate.createConnection();
+ try
+ {
+ if(_delegate == null)
+ {
+ getReference();
+ }
+
+ return _delegate.createConnection();
+ }
+ catch(Exception e)
+ {
+ throw new JMSException(e.getMessage());
+ }
+
}
/**
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/GlassfishTransactionManagerLocator.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/GlassfishTransactionManagerLocator.java
new file mode 100644
index 0000000000..cff53d2710
--- /dev/null
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/GlassfishTransactionManagerLocator.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.ra.tm;
+
+
+import javax.naming.InitialContext;
+import javax.transaction.TransactionManager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GlassfishTransactionManagerLocator
+{
+ private static final Logger _log = LoggerFactory.getLogger(GlassfishTransactionManagerLocator.class);
+
+ private static final String TM_JNDI_NAME = "java:appserver/TransactionManager";
+
+ public TransactionManager getTm() throws Exception
+ {
+ InitialContext ctx = null;
+ TransactionManager tm = null;
+
+ try
+ {
+ ctx = new InitialContext();
+ tm = (TransactionManager)ctx.lookup(TM_JNDI_NAME);
+ }
+ catch(Exception e)
+ {
+ _log.error("Error attempting to location TM " + e.getMessage());
+ }
+ finally
+ {
+ try
+ {
+ if(ctx != null)
+ {
+ ctx.close();
+ }
+ }
+ catch(Exception ignore){}
+ }
+
+ return tm;
+ }
+}
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/JBoss7TransactionManagerLocator.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/JBoss7TransactionManagerLocator.java
index 266c56bd63..6103433cbf 100644
--- a/qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/JBoss7TransactionManagerLocator.java
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/JBoss7TransactionManagerLocator.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.ra.tm;
import javax.naming.InitialContext;
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/WLSTransactionManagerLocator.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/WLSTransactionManagerLocator.java
new file mode 100644
index 0000000000..29e673d28e
--- /dev/null
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/tm/WLSTransactionManagerLocator.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.ra.tm;
+
+
+import javax.naming.InitialContext;
+import javax.transaction.TransactionManager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WLSTransactionManagerLocator
+{
+ private static final Logger _log = LoggerFactory.getLogger(WLSTransactionManagerLocator.class);
+
+ private static final String TM_JNDI_NAME = "javax.transaction.TransactionManager";
+
+ public TransactionManager getTm() throws Exception
+ {
+ InitialContext ctx = null;
+ TransactionManager tm = null;
+
+ try
+ {
+ ctx = new InitialContext();
+ tm = (TransactionManager)ctx.lookup(TM_JNDI_NAME);
+ }
+ catch(Exception e)
+ {
+ _log.error("Unable to locate javax.transaction.TransactionManager " + e.getMessage());
+ }
+ finally
+ {
+ try
+ {
+ if(ctx != null)
+ {
+ ctx.close();
+ }
+ }
+ catch(Exception ignore){}
+ }
+
+ return tm;
+ }
+}
+
diff --git a/qpid/java/jca/src/main/resources/META-INF/ra.xml b/qpid/java/jca/src/main/resources/META-INF/ra.xml
index 2c8344c8f0..01f5eceecf 100755
--- a/qpid/java/jca/src/main/resources/META-INF/ra.xml
+++ b/qpid/java/jca/src/main/resources/META-INF/ra.xml
@@ -69,7 +69,7 @@
</config-property>
<config-property>
- <description>Interval between setup attempts</description>
+ <description>Interval between setup attempts in milliseconds</description>
<config-property-name>SetupInterval</config-property-name>
<config-property-type>java.lang.Long</config-property-type>
<config-property-value>5000</config-property-value>
@@ -104,10 +104,10 @@
</config-property>
<config-property>
- <description>connection URL</description>
+ <description>Connection URL</description>
<config-property-name>ConnectionURL</config-property-name>
<config-property-type>java.lang.String</config-property-type>
- <config-property-value>amqp://guest:guest@/test?brokerlist='tcp://localhost:5672'</config-property-value>
+ <config-property-value>amqp://anonymous:passwd@client/test?brokerlist='tcp://localhost?sasl_mechs='PLAIN''</config-property-value>
</config-property>
<outbound-resourceadapter>
@@ -116,14 +116,14 @@
<config-property>
<description>Default session type</description>
- <config-property-name>sessionDefaultType</config-property-name>
+ <config-property-name>SessionDefaultType</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>javax.jms.Queue</config-property-value>
</config-property>
<config-property>
<description>Specify lock timeout in seconds</description>
- <config-property-name>useTryLock</config-property-name>
+ <config-property-name>UseTryLock</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
<config-property-value>0</config-property-value>
</config-property>
@@ -137,7 +137,7 @@
<config-property>
<description>Client ID for the connection</description>
- <config-property-name>ClientID</config-property-name>
+ <config-property-name>ClientId</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>client_id</config-property-value>
</config-property>
@@ -195,12 +195,11 @@
</messagelistener>
</messageadapter>
</inbound-resourceadapter>
-
<adminobject>
<adminobject-interface>org.apache.qpid.ra.admin.QpidQueue</adminobject-interface>
<adminobject-class> org.apache.qpid.ra.admin.QpidQueueImpl</adminobject-class>
<config-property>
- <config-property-name>destinationAddress </config-property-name>
+ <config-property-name>DestinationAddress </config-property-name>
<config-property-type>java.lang.String </config-property-type>
</config-property>
</adminobject>
@@ -208,30 +207,16 @@
<adminobject-interface>org.apache.qpid.ra.admin.QpidTopic</adminobject-interface>
<adminobject-class> org.apache.qpid.ra.admin.QpidTopicImpl</adminobject-class>
<config-property>
- <config-property-name>destinationAddress </config-property-name>
- <config-property-type>java.lang.String </config-property-type>
- </config-property>
- </adminobject>
- <!--
- <adminobject>
- <adminobject-interface>javax.jms.Destination</adminobject-interface>
- <adminobject-class> org.apache.qpid.ra.admin.QpidDestinationProxy</adminobject-class>
- <config-property>
- <config-property-name>destinationAddress </config-property-name>
- <config-property-type>java.lang.String </config-property-type>
- </config-property>
- <config-property>
- <config-property-name>destinationType</config-property-name>
+ <config-property-name>DestinationAddress </config-property-name>
<config-property-type>java.lang.String </config-property-type>
</config-property>
</adminobject>
- -->
<adminobject>
<adminobject-interface>javax.jms.ConnectionFactory</adminobject-interface>
<adminobject-class> org.apache.qpid.ra.admin.QpidConnectionFactoryProxy</adminobject-class>
<config-property>
- <config-property-name>connectionURL</config-property-name>
- <config-property-type>java.lang.String </config-property-type>
+ <config-property-name>ConnectionURL</config-property-name>
+ <config-property-type>java.lang.String</config-property-type>
</config-property>
</adminobject>
</resourceadapter>
diff --git a/qpid/java/jca/src/test/java/org/apache/qpid/ra/QpidResourceAdapterTest.java b/qpid/java/jca/src/test/java/org/apache/qpid/ra/QpidResourceAdapterTest.java
index 0db7c710d9..ccad952d64 100644
--- a/qpid/java/jca/src/test/java/org/apache/qpid/ra/QpidResourceAdapterTest.java
+++ b/qpid/java/jca/src/test/java/org/apache/qpid/ra/QpidResourceAdapterTest.java
@@ -20,9 +20,11 @@
*/
package org.apache.qpid.ra;
+import javax.resource.spi.ResourceAdapterInternalException;
import junit.framework.TestCase;
+
public class QpidResourceAdapterTest extends TestCase
{
public void testGetXAResources() throws Exception
@@ -31,4 +33,33 @@ public class QpidResourceAdapterTest extends TestCase
assertNull(ra.getXAResources(null));
}
+ public void testTransactionManagerLocatorException() throws Exception
+ {
+
+ QpidResourceAdapter ra = new QpidResourceAdapter();
+ assertNull(ra.getTransactionManagerLocatorClass());
+ assertNull(ra.getTransactionManagerLocatorMethod());
+
+ try
+ {
+ ra.start(null);
+ }
+ catch(ResourceAdapterInternalException e)
+ {
+
+ }
+
+ ra.setTransactionManagerLocatorClass("DummyLocator");
+
+ try
+ {
+ ra.start(null);
+ }
+ catch(ResourceAdapterInternalException e)
+ {
+
+ }
+
+ }
+
}
diff --git a/qpid/java/junit-toolkit/build.xml b/qpid/java/junit-toolkit/build.xml
deleted file mode 100644
index a2f352c4b7..0000000000
--- a/qpid/java/junit-toolkit/build.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-<project name="Junit Toolkit" default="build">
- <property name="module.src" value="src/main"/>
-
- <import file="../module.xml"/>
-
-</project>
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/DefaultThreadFactory.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/DefaultThreadFactory.java
deleted file mode 100644
index 8fb0a6a90e..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/DefaultThreadFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.concurrency;
-
-import java.util.concurrent.ThreadFactory;
-
-/**
- * Implements a default thread factory.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create default threads with no specialization.
- * </table>
- *
- * @author Rupert Smith
- */
-public class DefaultThreadFactory implements ThreadFactory
-{
- /**
- * Constructs a new <tt>Thread</tt>.
- *
- * @param r A runnable to be executed by new thread instance.
- *
- * @return The constructed thread.
- */
- public Thread newThread(Runnable r)
- {
- return new Thread(r);
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/PossibleDeadlockException.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/PossibleDeadlockException.java
deleted file mode 100644
index 3bbfc2d502..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/PossibleDeadlockException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.concurrency;
-
-/**
- * PossibleDeadlockException is used to signal that two test threads being executed by a {@link ThreadTestCoordinator}
- * may be in a state of deadlock because they are mutually blocking each other or one is waiting on the other and the
- * other has been blocked elsewhere for longer than a specified timeout.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Signal a possible state of deadlock between coordinated test threads.
- * </table>
- *
- * @author Rupert Smith
- */
-public class PossibleDeadlockException extends RuntimeException
-{
- /**
- * Create a new possible deadlock execption.
- *
- * @param message The exception message.
- */
- public PossibleDeadlockException(String message)
- {
- super(message);
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/TestRunnable.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/TestRunnable.java
deleted file mode 100644
index 02e776a4ea..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/TestRunnable.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.concurrency;
-
-/**
- * TestRunnable is an extension of java.util.Runnable that adds some features to make it easier to coordinate the
- * activities of threads in such a way as to expose bugs in multi threaded code.
- *
- * <p/>Sometimes several threads will run in a particular order so that a bug is not revealed. Other times the ordering
- * of the threads will expose a bug. Such bugs can be hard to replicate as the exact execution ordering of threads is not
- * usually controlled. This class adds some methods that allow threads to synchronize other threads, either allowing them
- * to run, or waiting for them to allow this thread to run. It also provides convenience methods to gather error messages
- * and exceptions from threads, which will often be reported in unit testing code.
- *
- * <p/>Coordination between threads is handled by the {@link ThreadTestCoordinator}. It is called through the convenience
- * methods {@link #allow} and {@link #waitFor}. Threads to be coordinated must be set up with the coordinator and assigned
- * integer ids. It is then possible to call the coordinator with an array of thread ids requesting that those threads
- * be allowed to continue, or to wait until one of them allows this thread to continue. The otherwise non-deterministic
- * execution order of threads can be controlled into a carefully determined sequence using these methods in order
- * to reproduce race conditions, dead locks, live locks, dirty reads, phantom reads, non repeatable reads and so on.
- *
- * <p/>When waiting for another thread to give a signal to continue it is sometimes the case that the other thread has
- * become blocked by the code under test. For example in testing for a dirty read (for example in database code),
- * thread 1 lets thread 2 perform a write but not commit it, then thread 2 lets thread 1 run and attempt to perform a
- * dirty read on its uncommitted write. Transaction synchronization code being tested against the possibility of a dirty
- * write may make use of snapshots in which case both threads should be able to read and write without blocking. It may
- * make use of explicit keys in which case thread 2 may become blocked on its write attempt because thread 1 holds a
- * read lock and it must wait until thread 1 completes its transaction before it can acquire this lock. The
- * {@link #waitFor} method accepts a boolean parameter to indicate that threads being blocked (other than on the
- * coordinator) can be interpreted the same as if the thread explicitly allows the thread calling waitFor to continue.
- * Using this technique a dirty read test could be written that works against either the snapshot or the locking
- * implementation, allowing both approaches to pass the test yet arranging for multiple threads to run against the
- * implementation in such a way that a potential dirty read bug is exposed.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Wait for another thread to allow this one to continue.
- * <tr><td> Allow another thread to continue.
- * <tr><td> Accumulate error messages.
- * <tr><td> Record exceptions from thread run.
- * <tr><td> Maintain link to thread coordinator.
- * <tr><td> Explicitly mark a thread with an integer id.
- * <tr><td> Maintian a flag to indicate whether or not this thread is waiting on the coordinator.
- * </table>
- *
- * @todo The allow then waitFor operations are very often used as a pair. So create a method allowAndWait that combines
- * them into a single method call.
- *
- * @author Rupert Smith
- */
-public abstract class TestRunnable implements Runnable
-{
- /** Holds a reference to the thread coordinator. */
- private ThreadTestCoordinator coordinator;
-
- /** Holds the explicit integer id of this thread. */
- private int id;
-
- /** Used to indicate that this thread is waiting on the coordinator and not elsewhere. */
- private boolean waitingOnCoordinator = false;
-
- /** Used to accumulate error messsages. */
- private String errorMessage = "";
-
- /** Holds the Java thread object that this is running under. */
- private Thread thisThread;
-
- /** Used to hold any exceptions resulting from the run method. */
- private Exception runException = null;
-
- /**
- * Implementations override this to perform coordinated thread sequencing.
- *
- * @throws Exception Any exception raised by the implementation will be caught by the default {@link #run()}
- * implementation for later querying by the {@link #getException()} method.
- */
- public abstract void runWithExceptions() throws Exception;
-
- /**
- * Provides a default implementation of the run method that allows exceptions to be thrown and keeps a record
- * of those exceptions. Defers to the {@link #runWithExceptions()} method to provide the thread body implementation
- * and catches any exceptions thrown by it.
- */
- public void run()
- {
- try
- {
- runWithExceptions();
- }
- catch (Exception e)
- {
- this.runException = e;
- }
- }
-
- /**
- * Attempt to consume an allow event from one of the specified threads and blocks until such an event occurrs.
- *
- * @param threads The set of threads that can allow this one to continue.
- * @param otherWaitIsAllow If set to <tt>true</tt> if the threads being waited on are blocked other than on
- * the coordinator itself then this is to be interpreted as allowing this thread to
- * continue.
- *
- * @return If the <tt>otherWaitIsAllow</tt> flag is set, then <tt>true</tt> is returned when the thread being waited on is found
- * to be blocked outside of the thread test coordinator. <tt>false</tt> under all other conditions.
- */
- protected boolean waitFor(int[] threads, boolean otherWaitIsAllow)
- {
- return coordinator.consumeAllowEvent(threads, otherWaitIsAllow, id, this);
- }
-
- /**
- * Produces allow events on each of the specified threads.
- *
- * @param threads The set of threads that are to be allowed to continue.
- */
- protected void allow(int[] threads)
- {
- coordinator.produceAllowEvents(threads, id, this);
- }
-
- /**
- * Keeps the error message for later reporting by the coordinator.
- *
- * @param message The error message to keep.
- */
- protected void addErrorMessage(String message)
- {
- errorMessage += message;
- }
-
- /**
- * Sets the coordinator for this thread.
- *
- * @param coordinator The coordinator for this thread.
- */
- void setCoordinator(ThreadTestCoordinator coordinator)
- {
- this.coordinator = coordinator;
- }
-
- /**
- * Reports whether or not this thread is waiting on the coordinator.
- *
- * @return <tt>If this thread is waiting on the coordinator.
- */
- boolean isWaitingOnCoordinator()
- {
- return waitingOnCoordinator;
- }
-
- /**
- * Sets the value of the waiting on coordinator flag.
- *
- * @param waiting The value of the waiting on coordinator flag.
- */
- void setWaitingOnCoordinator(boolean waiting)
- {
- waitingOnCoordinator = waiting;
- }
-
- /**
- * Sets up the explicit int id for this thread.
- *
- * @param id The integer id.
- */
- void setId(int id)
- {
- this.id = id;
- }
-
- /**
- * Reports any accumulated error messages.
- *
- * @return Any accumulated error messages.
- */
- String getErrorMessage()
- {
- return errorMessage;
- }
-
- /**
- * Reports any exception thrown by the {@link #runWithExceptions} method.
- *
- * @return Any exception thrown by the {@link #runWithExceptions} method.
- */
- Exception getException()
- {
- return runException;
- }
-
- /**
- * Sets the Java thread under which this runs.
- *
- * @param thread The Java thread under which this runs.
- */
- void setThread(Thread thread)
- {
- thisThread = thread;
- }
-
- /**
- * Gets the Java thread under which this runs.
- *
- * @return The Java thread under which this runs.
- */
- Thread getThread()
- {
- return thisThread;
- }
-
- /**
- * Provides a string summary of this test threads status.
- *
- * @return Summarizes this threads status.
- */
- public String toString()
- {
- return "id = " + id + ", waitingOnCoordinator = " + waitingOnCoordinator;
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestCoordinator.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestCoordinator.java
deleted file mode 100644
index 3cf8543656..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestCoordinator.java
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.concurrency;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.concurrent.ThreadFactory;
-
-/**
- * ThreadTestCoordinator provides an array of binary latches that allows threads to wait for other threads or to send
- * them a signal that allows them to continue running or to wait for another thread to signal them. The binary latch
- * array is always a square array, allowing one latch from and to every thread. Upon accepting an allow signal from one
- * sender the latches for all senders for a are cleared. This class is always used in conjunction with
- * {@link TestRunnable} for writing concurrent test code that coordinates multi-threaded activity in order to reproduce
- * concurrency bugs.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Accept test threads to coordinate.
- * <tr><td> Allow test threads to send 'allow to continue' signals.
- * <tr><td> Allow test threads to wait on this coordinator for 'allow to continue' signals.
- * <tr><td> Report error messages from test threads.
- * <tr><td> Report exceptions from test threads.
- * <tr><td> Provide method to wait until all test threads have completed.
- * </table>
- *
- * @todo This code was hacked together as a bit of an experiment, because I wasn't sure if this idea would work. It has
- * proved extremely usefull. Some documentation for this needs to be written to explain it better.
- *
- * @todo Consider how deadlock detection will be handled. If all threads are blocking on the coordinator, waiting for
- * each other, they are deadlocked and there is something wrong with the test code that put them in that
- * situation. If they are all blocked elsewhere, they may be deadlocked, or could just be waiting on some
- * external event. A timeout should be used. Timeout is already implemented, just need to sanity check how
- * this is working and document it.
- *
- * @todo Consider how livelock detection could be implemented? LockFree data structures might cause live locks. I
- * guess a longish timeout is the only thing that can be done for that.
- *
- * @todo Only course grained synchronous at the method class level can be obtained. This is because test code can
- * only insert synchronization points between method calls it makes. So this code will not be usefull for
- * checking sequences of events within methods, unless the code under test is explicitly instrumented for it.
- * It might be possible to instrument code by using labels, and then use the debugger/profiler interface to
- * put breakpoints on the labels and use them as synchronization points. Not perfect, but at the unused labels
- * can be left in the code, without altering its behaviour.
- *
- * @author Rupert Smith
- */
-public class ThreadTestCoordinator
-{
- /** Used for logging. */
- private static final Logger log = LoggerFactory.getLogger(ThreadTestCoordinator.class);
-
- /** Keeps track of the test threads by their ids. */
- private TestRunnable[] testThreads; // = new TestRunnable[2];
-
- /** An explicit thread monitor for the coordinator. Threads wait on the coordinator whilst waiting for events. */
- private final Object coordinatorLock = new Object();
-
- /** A set of monitors for each test thread. */
- private Object[] locks;
-
- /** The binary latch array, this is always a square array allowing one event from and to every thread. */
- private boolean[][] allowEvents;
-
- /** Keeps track of the number of threads being coordinated. */
- private int threadCount = 0;
-
- /** Accumulates any exceptions resulting from the threads run methods. */
- private Collection<Exception> exceptions = new ArrayList<Exception>();
-
- /**
- * Holds the deadlock timeout after which threads are given a runtime exception to signal that a potential
- * deadlock may be happening.
- */
- private long deadlockTimeout = 1000 * 1000000;
-
- /** Holds the factory to create test thread with. */
- private ThreadFactory threadFactory;
-
- /**
- * Creates a new test thread coordinator. The number of threads to run must be specified here.
- *
- * @param numThreads The number of threads to run.
- */
- public ThreadTestCoordinator(int numThreads)
- {
- this.threadCount = numThreads;
-
- // Create an array big enough to hold all the test threads.
- testThreads = new TestRunnable[threadCount];
-
- // Use the default thread factory, as none specified.
- threadFactory = new DefaultThreadFactory();
- }
-
- /**
- * Creates a new test thread coordinator with a specific thread factory. The number of threads to run must be
- * specified here.
- *
- * @param numThreads The number of threads to run.
- * @param threadFactory The factory to use to create the test threads.
- */
- public ThreadTestCoordinator(int numThreads, ThreadFactory threadFactory)
- {
- this.threadCount = numThreads;
-
- // Create an array big enough to hold all the test threads.
- testThreads = new TestRunnable[threadCount];
-
- // Use the specified thread factory.
- this.threadFactory = threadFactory;
- }
-
- /**
- * Adds a thread to this coordinator and assigns an id to it. The ids must be numbered sequentially from 0 and
- * it is up to the caller to do this.
- *
- * @param runnable The test thread.
- * @param id The explicit id to assign to the test thread.
- */
- public void addTestThread(TestRunnable runnable, int id)
- {
- testThreads[id] = runnable;
- runnable.setCoordinator(this);
- runnable.setId(id);
- }
-
- /**
- * Starts all the coordinated threads running.
- */
- public void run()
- {
- // Create the monitors for each thread.
- locks = new Object[threadCount];
-
- // Create an appropriately sized event queue to allow one event from and to each thread.
- allowEvents = new boolean[threadCount][threadCount];
-
- // Initialize the monitors and clear the event queues.
- for (int i = 0; i < locks.length; i++)
- {
- locks[i] = new Object();
-
- for (int j = 0; j < locks.length; j++)
- {
- allowEvents[i][j] = false;
- }
- }
-
- // Start all the threads running.
- for (TestRunnable nextRunnable : testThreads)
- {
- // Create a Java thread for the test thread.
- Thread newThread = threadFactory.newThread(nextRunnable);
- nextRunnable.setThread(newThread);
-
- // Start it running.
- newThread.start();
- }
- }
-
- /**
- * Waits until all the test threads have completed and returns any accumulated error messages from them. Any
- * exceptions thrown by their run methods are also kept at this point.
- *
- * @return The accumulated error messages from all the threads concatenated together.
- */
- public String joinAndRetrieveMessages()
- {
- // Create an empty error message.
- String errorMessage = "";
-
- // Join all the test threads.
- for (TestRunnable r : testThreads)
- {
- Thread t = r.getThread();
-
- try
- {
- t.join();
- }
- catch (InterruptedException e)
- { }
-
- // Add any accumulated error messages to the return value.
- errorMessage += r.getErrorMessage();
-
- // Keep any exceptions resulting from the threads run method.
- Exception e = r.getException();
-
- if (e != null)
- {
- exceptions.add(e);
- }
- }
-
- return errorMessage;
- }
-
- /**
- * Reports any accumulated exceptions from the test threads run methods. This method must be called after
- * {@link #joinAndRetrieveMessages}.
- *
- * @return Any accumulated exceptions from the test threads run methods. This method must be called after
- */
- public Collection<Exception> getExceptions()
- {
- return exceptions;
- }
-
- /**
- * Sets a timeout to break out of potential deadlocks. If all threads are waiting for other threads to send
- * them continue events for longer than this timeout then the threads are all terminated.
- *
- * @param millis The minimum time to allow to pass before breaking out of any potential deadlocks.
- *
- * @todo This has not been implemented yet. If a potential deadlock happens then the joinAndRetrieveMessages
- * method should throw a PotentialDeadlockException.
- */
- public void setDeadlockTimeout(long millis)
- {
- deadlockTimeout = millis * 1000000;
- }
-
- /**
- * Creates a set of 'allow to continue' events on the event queues of the specified threads.
- *
- * @param threads The set of threads to allow to continue.
- * @param callerId The explicit id of the calling test thread.
- * @param caller The calling test thread.
- */
- void produceAllowEvents(int[] threads, int callerId, TestRunnable caller)
- {
- // Generate some debugging messages. Very usefull to know how thread synchronization is progressing.
- String message = "Thread " + callerId + " is allowing threads [ ";
-
- for (int j = 0; j < threads.length; j++)
- {
- message += threads[j] + ((j < (threads.length - 1)) ? ", " : "");
- }
-
- message += " ] to continue.";
- log.debug(message);
-
- // For each allow event, synchronize on the threads lock then set the event flag to true.
- for (int id : threads)
- {
- // Set the waiting on coordinator flag to true in case the coordinator tries to test this thread for
- // being blocked at this time.
- caller.setWaitingOnCoordinator(true);
-
- synchronized (locks[id])
- {
- // Release the wating on coordinator flag now that this thread is running again.
- caller.setWaitingOnCoordinator(false);
-
- // Send the allow to continue event to the receiving thread.
- allowEvents[id][callerId] = true;
- }
- }
-
- // Wake up any threads waiting on the coordinator lock to recheck their event queues.
- // Set the waiting on coordinator flag to true in case the coordinator tries to test this thread for
- // being blocked at this time.
- caller.setWaitingOnCoordinator(true);
-
- synchronized (coordinatorLock)
- {
- // Release the wating on coordinator flag now that this thread is running again.
- caller.setWaitingOnCoordinator(false);
- coordinatorLock.notifyAll();
- }
- }
-
- /**
- * Consumes an 'allow to continue' from one of the specified threads or waits until one is available or in some
- * cases if one of the specified threads is blocked elsewhere to accept that as an 'allow to continue' event.
- *
- * @param threads The set of threads to accept an allow to continue event from.
- * @param otherWaitIsAllow Whether or not to accept threads being blocked elsewhere as permission to continue.
- * @param callerId The explicit id of the calling test thread.
- * @param caller The calling test thread.
- *
- * @return If the <tt>otherWaitIsAllow</tt> flag is set, then <tt>true</tt> is returned when the thread being waited on is found
- * to be blocked outside of the thread test coordinator. <tt>false</tt> under all other conditions.
- */
- boolean consumeAllowEvent(int[] threads, boolean otherWaitIsAllow, int callerId, TestRunnable caller)
- {
- // Generate some debugging messages. Very usefull to know how thread synchronization is progressing.
- String message = "Thread " + callerId + " is requesting threads [ ";
-
- // Record the time at which this method was called. Will be used for breaking out of potential deadlocks.
- long startTime = System.nanoTime();
-
- for (int j = 0; j < threads.length; j++)
- {
- message += threads[j] + ((j < (threads.length - 1)) ? ", " : "");
- }
-
- message += " ] to allow it to continue.";
- log.debug(message);
-
- // Loop until an allow to continue event is received.
- while (true)
- {
- // Look at all the allowing thread to see if one has created an event for consumption.
- for (int allowerId : threads)
- {
- // Get the threads lock for the event to consume.
- // Set the waiting on coordinator flag to true in case the coordinator tries to test this thread for
- // being blocked at this time.
- caller.setWaitingOnCoordinator(true);
-
- synchronized (locks[callerId])
- {
- // Release the wating on coordinator flag now that this thread is running again.
- caller.setWaitingOnCoordinator(false);
-
- // Check if there is an event on the queue from the allowing thread to this one.
- if (allowEvents[callerId][allowerId])
- {
- log.debug("Found an allow event, thread " + allowerId + ", is allowing thread " + callerId
- + ", to continue.");
-
- // Consume all the allow events for this thread.
- /*for (int i = 0; i < allowEvents[callerId].length; i++)
- {
- allowEvents[callerId][i] = false;
- }*/
-
- // Consume just the event from the allower to the consumer, leaving other pending allow events alone.
- allowEvents[callerId][allowerId] = false;
-
- return false;
- }
- }
- }
-
- // If waiting elsewhere is to be interpreted as an 'allow to continue' event, then look at the thread status
- // for the threads being waited on to see if any are blocked on other resources.
- if (otherWaitIsAllow)
- {
- log.debug("Other wait is to be interpreted as an allow event.");
-
- // Look at all the potential allower threads.
- for (int allowerId : threads)
- {
- // Get the Java thread state for the allowing thread.
- Thread threadToTest = testThreads[allowerId].getThread();
- Thread.State state = threadToTest.getState();
-
- // Check if the thread is blocked and so a potential candidate for releasing this one.
- if ((state == Thread.State.BLOCKED) || (state == Thread.State.WAITING)
- || (state == Thread.State.TIMED_WAITING))
- {
- log.debug("Found an allower thread, id = " + allowerId + ", that is blocked or wating.");
-
- // Check that the allower thread is not waiting on the coordinator lock or any of the
- // individual thread locks. It must be waiting or blocked on another monitor.
- TestRunnable allowingRunnable = testThreads[allowerId];
- boolean isWaitingOnCoordinator = allowingRunnable.isWaitingOnCoordinator();
-
- if (!isWaitingOnCoordinator)
- {
- log.debug("The allower thread, id = " + allowerId
- + ", is blocked or waiting other than on the coordinator.");
-
- // Get the threads lock for the event to consume.
- caller.setWaitingOnCoordinator(true);
-
- synchronized (locks[callerId])
- {
- caller.setWaitingOnCoordinator(false);
-
- // Consume all the allow events for this thread.
- for (int i = 0; i < allowEvents[callerId].length; i++)
- {
- allowEvents[callerId][i] = false;
- }
-
- return true;
- }
- }
- else
- {
- log.debug("The waiting allower thread, " + allowerId
- + ", is waiting on the coordinator so does not allow thread " + callerId + " to continue.");
- }
- }
- }
- }
-
- // Keep waiting until an 'allow to continue' event can be consumed.
- try
- {
- // Set the waiting on coordinator flag to true in case the coordinator tries to test this thread for
- // being blocked at this time.
- caller.setWaitingOnCoordinator(true);
-
- synchronized (coordinatorLock)
- {
- // Release the wating on coordinator flag now that this thread is running again.
- caller.setWaitingOnCoordinator(false);
-
- log.debug("Thread " + callerId + " is waiting on coordinator lock for more allow events.");
-
- // Set the waiting on coordinator flag to true in case the coordinator tries to test this thread for
- // being blocked at this time.
- caller.setWaitingOnCoordinator(true);
- coordinatorLock.wait(10);
- }
- }
- catch (InterruptedException e)
- { }
-
- // Release the waiting on coordinator flag now that this thread is running again.
- caller.setWaitingOnCoordinator(false);
-
- // Check if this thread has been waiting for longer than the deadlock timeout and raise a possible
- // deadlock exception if so.
- long waitTime = System.nanoTime() - startTime;
- log.debug("Thread " + callerId + " has been waiting for " + (waitTime / 1000000) + " milliseconds.");
-
- if (waitTime > deadlockTimeout)
- {
- // Throw a possible deadlock exception.
- throw new PossibleDeadlockException("Possible deadlock due to timeout with state:\n" + this);
- }
-
- log.debug("Thread " + callerId + " has woken up, was waiting for more allow events to become available.");
- }
- }
-
- /**
- * Pretty prints the state of the thread test coordinator, for debugging purposes.
- *
- * @return Pretty printed state of the thread test coordinator.
- */
- public String toString()
- {
- String result = "[";
-
- for (int i = 0; i < allowEvents.length; i++)
- {
- for (int j = 0; j < allowEvents[i].length; j++)
- {
- result += allowEvents[i][j];
-
- result += (j < (allowEvents[i].length - 1)) ? ", " : "";
- }
-
- result += (i < (allowEvents.length - 1)) ? ",\n " : "";
- }
-
- result += "]";
-
- for (int i = 0; i < testThreads.length; i++)
- {
- result += "thread[" + i + "] = " + testThreads[i].toString();
- }
-
- return result;
- }
-
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestExample.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestExample.java
deleted file mode 100644
index b9865f2e22..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/ThreadTestExample.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.concurrency;
-
-import org.apache.log4j.Logger;
-
-/**
- * An example to illustrate the use of the {@link ThreadTestCoordinator} and {@link TestRunnable}s.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Demo multi-threaded testing.
- * </table>
- *
- * @author Rupert Smith
- */
-public class ThreadTestExample
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(ThreadTestExample.class);
-
- /** Test thread 1. */
- TestRunnable testThread1 =
- new TestRunnable()
- {
- public void runWithExceptions() throws Exception
- {
- log.debug("public void run(): called");
- log.info("in testThread0, block 1");
-
- // Wait for t2 to allow t1 to continue.
- allow(new int[] { 1 });
- waitFor(new int[] { 1 }, false);
-
- log.info("in testThread0, block 2");
-
- // Wait for t2 to allow t1 to continue. T2 is allowed to be blocked elsewhere than giving explicit
- // permission to allow t1 to continue.
- allow(new int[] { 1 });
- waitFor(new int[] { 1 }, true);
-
- log.info("in testThread0, block 3");
-
- // Release thread 2 from waiting on the shared lock.
- synchronized (sharedLock)
- {
- sharedLock.notifyAll();
- }
-
- allow(new int[] { 1 });
- }
- };
-
- /** A shared lock between the test threads. */
- final Object sharedLock = new Object();
-
- /** Test thread 2. */
- TestRunnable testThread2 =
- new TestRunnable()
- {
- public void runWithExceptions() throws Exception
- {
- log.debug("public void run(): called");
- log.info("in testThread1, block 1");
-
- // Wait for t1 to allow t2 to continue.
- allow(new int[] { 0 });
- waitFor(new int[] { 0 }, false);
-
- log.info("in testThread1, block 2");
-
- // Wait on another resource. T1 should accept this as permission to continue.
- try
- {
- synchronized (sharedLock)
- {
- log.debug("in testThread1, waiting on shared lock.");
- sharedLock.wait();
- }
- }
- catch (InterruptedException e)
- {
- // Bail-out with a runtime if this happens.
- throw new RuntimeException("Interrupted whilst waiting for shared lock.", e);
- }
-
- log.info("in testThread1, finished waiting on shared lock.");
-
- // allow(new int[] { 0 });
-
- // Wait for t1 to allow t2 to continue.
- waitFor(new int[] { 0 }, false);
-
- log.info("in testThread1, block 3");
-
- allow(new int[] { 0 });
- }
- };
-
- /**
- * Executes the test threads with coordination.
- *
- * @param args Ignored.
- */
- public void main(String[] args)
- {
- ThreadTestCoordinator tt = new ThreadTestCoordinator(2);
-
- tt.addTestThread(testThread1, 0);
- tt.addTestThread(testThread2, 1);
- tt.setDeadlockTimeout(500);
- tt.run();
-
- String errorMessage = tt.joinAndRetrieveMessages();
-
- // Print any error messages or exceptions.
- log.info(errorMessage);
-
- if (!tt.getExceptions().isEmpty())
- {
- for (Exception e : tt.getExceptions())
- {
- log.warn("Exception thrown during test thread: ", e);
- }
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/package.html b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/package.html
deleted file mode 100644
index 904fd0fd05..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/concurrency/package.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<html>
-<body>
-Contains code to assist in testing concurrency issues using coordinated threads to present code under test with
-oportunities to expose concurrency bugs. Some example concurrency bugs that may be tested using these techniques are
-race conditions, dead locks, live locks, dirty reads, phantom reads, non repeatable reads and so on.
-</body>
-</html>
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestCase.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestCase.java
deleted file mode 100644
index 58a7f60f3c..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestCase.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.TestCase;
-
-import org.apache.log4j.Logger;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-/**
- * AsymptoticTestCase is an extension of TestCase for writing unit tests to analyze asymptotic time and space behaviour.
- *
- * <p>ParameterizedTestCases allow tests to be defined which have test methods that take a single int argument. Normal
- * JUnit test methods do not take any arguments. This int argument can be interpreted in any way by the test but it is
- * intended to denote the 'size' of the test to be run. For example, when testing the performance of a data structure
- * for different numbers of data elements held in the data structure the int parameter should be interpreted as the
- * number of elements. Test timings for different numbers of elements can then be captured and the asymptotic behaviour
- * of the data structure with respect to time analyzed. Any non-parameterized tests defined in extensions of this class
- * will also be run.
- *
- * <p>TestCases derived from this class may also define tear down methods to clean up their memory usage. This is
- * intended to be used in conjunction with memory listeners that report the amount of memory a test uses. The idea is
- * to write a test that allocates memory in the main test method in such a way that it leaves that memory still
- * allocated at the end of the test. The amount of memory used can then be measured before calling the tear down method
- * to clean it up. In the data structure example above, a test will allocate as many elements as are requested by the
- * int parameter and deallocate them in the tear down method. In this way memory readings for different numbers of
- * elements can be captured and the asymptotic behaviour of the data structure with respect to space analyzed.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Store the current int parameter value. <td> {@link TKTestResult} and see {@link AsymptoticTestDecorator} too.
- * <tr><td> Invoke parameterized test methods.
- * </table>
- *
- * @todo If possible try to move the code that invokes the test and setup/teardown methods into {@link TKTestResult} or
- * {@link AsymptoticTestDecorator} rather than this class. This would mean that tests don't have to extend this
- * class to do time and space performance analysis, these methods could be added to any JUnit TestCase class
- * instead. This would be an improvement because existing unit tests wouldn't have to extend a different class to
- * work with this extension, and also tests that extend other junit extension classes could have parameterized
- * and tear down methods too.
- *
- * @author Rupert Smith
- */
-public class AsymptoticTestCase extends TestCase implements InstrumentedTest
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(AsymptoticTestCase.class);
-
- /** The name of the test case. */
- private String testCaseName;
-
- /** Thread local for holding measurements on a per thread basis. */
- ThreadLocal<TestMeasurements> threadLocalMeasurement =
- new ThreadLocal<TestMeasurements>()
- {
- /**
- * Sets up a default set test measurements (zeroed, apart from the size param which defaults to 1).
- *
- * @return A set of default test measurements.
- */
- protected synchronized TestMeasurements initialValue()
- {
- return new TestMeasurements();
- }
- };
-
- /**
- * Constructs a test case with the given name.
- *
- * @param name The name of the test.
- */
- public AsymptoticTestCase(String name)
- {
- super(name);
-
- log.debug("public AsymptoticTestCase(String " + name + "): called");
- testCaseName = name;
- }
-
- /**
- * Gets the current value of the integer parameter to be passed to the parameterized test.
- *
- * @return The current value of the integer parameter.
- */
- public int getN()
- {
- log.debug("public int getN(): called");
- int n = threadLocalMeasurement.get().n;
-
- log.debug("return: " + n);
-
- return n;
- }
-
- /**
- * Sets the current value of the integer parameter to be passed to the parameterized test.
- *
- * @param n The new current value of the integer parameter.
- */
- public void setN(int n)
- {
- log.debug("public void setN(int " + n + "): called");
- threadLocalMeasurement.get().n = n;
- }
-
- /**
- * Reports how long the test took to run.
- *
- * @return The time in milliseconds that the test took to run.
- */
- public long getTestTime()
- {
- log.debug("public long getTestTime(): called");
- long startTime = threadLocalMeasurement.get().startTime;
- long endTime = threadLocalMeasurement.get().endTime;
- long testTime = endTime - startTime;
-
- log.debug("return: " + testTime);
-
- return testTime;
- }
-
- /**
- * Reports the memory usage at the start of the test.
- *
- * @return The memory usage at the start of the test.
- */
- public long getTestStartMemory()
- {
- // log.debug("public long getTestStartMemory(): called");
- long startMem = threadLocalMeasurement.get().startMem;
-
- // log.debug("return: " + startMem);
-
- return startMem;
- }
-
- /**
- * Reports the memory usage at the end of the test.
- *
- * @return The memory usage at the end of the test.
- */
- public long getTestEndMemory()
- {
- // log.debug("public long getTestEndMemory(): called");
- long endMem = threadLocalMeasurement.get().endMem;
-
- // log.debug("return: " + endMem);
- return endMem;
- }
-
- /**
- * Resets the instrumentation values to zero, and nulls any references to held measurements so that the memory
- * can be reclaimed.
- */
- public void reset()
- {
- log.debug("public void reset(): called");
- threadLocalMeasurement.remove();
- }
-
- /**
- * Runs the test method for this test case.
- *
- * @throws Throwable Any Throwables from the test methods invoked are allowed to fall through.
- */
- protected void runTest() throws Throwable
- {
- log.debug("protected void runTest(): called");
-
- // Check that a test name has been set. This is used to define which method to run.
- assertNotNull(testCaseName);
- log.debug("testCaseName = " + testCaseName);
-
- // Try to get the method with matching name.
- Method runMethod = null;
- boolean isParameterized = false;
-
- // Check if a parameterized test method is available.
- try
- {
- // Use getMethod to get all public inherited methods. getDeclaredMethods returns all
- // methods of this class but excludes the inherited ones.
- runMethod = getClass().getMethod(testCaseName, int.class);
- isParameterized = true;
- }
- catch (NoSuchMethodException e)
- {
- // log.debug("Parameterized method \"" + testCaseName + "\" not found.");
- // Set run method to null (it already will be but...) to indicate that no parameterized method
- // version could be found.
- runMethod = null;
- }
-
- // If no parameterized method is available, try and get the unparameterized method.
- if (runMethod == null)
- {
- try
- {
- runMethod = getClass().getMethod(testCaseName);
- isParameterized = false;
-
- }
- catch (NoSuchMethodException e)
- {
- fail("Method \"" + testCaseName + "\" not found.");
- }
- }
-
- // Check that the method is publicly accessable.
- if (!Modifier.isPublic(runMethod.getModifiers()))
- {
- fail("Method \"" + testCaseName + "\" should be public.");
- }
-
- // Try to execute the method, passing it the current int parameter value. Allow any invocation exceptions or
- // resulting exceptions from the method to fall through.
- try
- {
- Integer paramN = getN();
- log.debug("paramN = " + paramN);
-
- // Calculate parameters for parameterized tests so new does not get called during memory measurement.
- Object[] params = new Object[] { paramN };
-
- // Take the test start memory and start time.
- threadLocalMeasurement.get().startMem = 0; // SizeOf.getUsedMemory();
-
- threadLocalMeasurement.get().startTime = System.nanoTime();
-
- if (isParameterized)
- {
- runMethod.invoke(this, params);
- }
- else
- {
- runMethod.invoke(this);
- }
- }
- catch (InvocationTargetException e)
- {
- e.fillInStackTrace();
- throw e.getTargetException();
- }
- catch (IllegalAccessException e)
- {
- e.fillInStackTrace();
- throw e;
- }
- finally
- {
- // Take the test end memory and end time and calculate how long it took to run.
- long endTime = System.nanoTime();
- threadLocalMeasurement.get().endTime = endTime;
- log.debug("startTime = " + threadLocalMeasurement.get().startTime + ", endTime = " + endTime + ", testTime = "
- + getTestTime());
-
- threadLocalMeasurement.get().endMem = 0; // SizeOf.getUsedMemory();
- }
- }
-
- /**
- * The test parameters, encapsulated as a unit for attaching on a per thread basis.
- */
- private static class TestMeasurements
- {
- /** Holds the current value of the integer parameter to run tests on. */
- public int n = 1;
-
- /** Holds the test start memory. */
- public long startTime = 0;
-
- /** Holds the test end memory. */
- public long endTime = 0;
-
- /** Holds the test start memory. */
- public long startMem = 0;
-
- /** Holds the test end memory. */
- public long endMem = 0;
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestDecorator.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestDecorator.java
deleted file mode 100644
index 8869d25be3..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/AsymptoticTestDecorator.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.TestResult;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.MathUtils;
-
-/**
- * A Decorator that runs a test repeatedly on an increasing int parameter, or for a fixed number of repeats. If both
- * a set of integer parameters and a repeat count are specified, then each test is run for the repeat count at each
- * integer parameter.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Repeat a test for each of a set of integer parameters. <td> {@link TKTestResult}
- * <tr><td> Repeat a test multiple times.
- * <tr><td>
- * </table>
- *
- * @author Rupert Smith
- */
-public class AsymptoticTestDecorator extends WrappedSuiteTestDecorator
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(AsymptoticTestDecorator.class);
-
- /** The int size parameters to run the test with. */
- private int[] params;
-
- /** The number of times the whole test should be repeated. */
- private int repeat;
-
- /**
- * Creates an asymptotic test decorator that wraps a test with repeats and a set of integer 'size' paramters
- * to call the test with.
- *
- * @param test The test to wrap.
- * @param params The integer 'size' parameters.
- * @param repeat The number of times to repeat the test.
- */
- public AsymptoticTestDecorator(WrappedSuiteTestDecorator test, int[] params, int repeat)
- {
- super(test);
-
- log.debug("public AsymptoticTestDecorator(Test \"" + test + "\", int[] "
- + ((params == null) ? null : MathUtils.printArray(params)) + ", int " + repeat + "): called");
-
- this.params = params;
- this.repeat = repeat;
- }
-
- /**
- * Creates a new AsymptoticTestDecorator object.
- *
- * @param test The test to decorate.
- * @param start The starting asymptotic integer parameter value.
- * @param end The ending asymptotic integer parameter value.
- * @param step The increment size to move from the start to end values by.
- * @param repeat The number of times to repeat the test at each step of the cycle.
- */
- public AsymptoticTestDecorator(WrappedSuiteTestDecorator test, int start, int end, int step, int repeat)
- {
- super(test);
-
- if (start < 0)
- {
- throw new IllegalArgumentException("Start must be >= 0");
- }
-
- if (end < start)
- {
- throw new IllegalArgumentException("End must be >= start");
- }
-
- if (step < 1)
- {
- throw new IllegalArgumentException("Step must be >= 1");
- }
-
- if (repeat < 1)
- {
- throw new IllegalArgumentException("Repeat must be >= 1");
- }
-
- // Generate the sequence.
- params = new int[((end - start) / step) + 1];
- int i = 0;
- for (int n = start; n <= end; n += step)
- {
- params[i++] = n;
- }
-
- this.repeat = repeat;
- }
-
- /**
- * Runs the test repeatedly for each value of the int parameter specified and for the correct number of test
- * repeats.
- *
- * @param result The test result object that the tests will indicate their results to. This is also used
- * to pass the int parameter from this class to the decorated test class.
- */
- public void run(TestResult result)
- {
- log.debug("public void run(TestResult result): called");
-
- if (!(result instanceof TKTestResult))
- {
- throw new IllegalArgumentException("AsymptoticTestDecorator only works with TKTestResult");
- }
-
- // Cast the test result into a TKTestResult to place the current parameter into.
- TKTestResult tkResult = (TKTestResult) result;
-
- log.debug("params = " + ((params == null) ? null : MathUtils.printArray(params)));
- log.debug("repeat = " + repeat);
-
- if(params != null)
- {
- for (int n : params)
- {
- for (int j = 0; j < repeat; j++)
- {
- log.debug("n = " + n);
-
- // Set the integer parameter in the TKTestResult to be passed to the tests.
- tkResult.setN(n);
-
- if (tkResult.shouldStop())
- {
- log.debug("tkResult.shouldStop = " + true);
-
- break;
- }
-
- log.debug("Calling super#run");
- super.run(tkResult);
- }
- }
- }
- }
-
- /**
- * Prints out the name of this test with the string "(parameterized)" appended onto it for debugging purposes.
- *
- * @return The name of this test with the string "(parameterized)" appended onto it.
- */
- public String toString()
- {
- return super.toString() + "(parameterized)";
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BaseThrottle.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BaseThrottle.java
deleted file mode 100644
index 61d5746421..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BaseThrottle.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * Provides a base implementation of the non-waiting throttle checking method, using the system nano timer.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Check against a throttle speed without waiting.
- * </table>
- *
- * @author Rupert Smith
- */
-public abstract class BaseThrottle implements Throttle
-{
- /** Holds the length of a single cycle in nano seconds. */
- protected long cycleTimeNanos;
-
- /** Holds the time of the last succesfull call to the check method. */
- private long lastCheckTimeNanos;
-
- /** Flag used to detect the first call to the {@link #checkThrottle()} method. */
- boolean firstCheckCall = true;
-
- /**
- * Flag used to detect the first call to the {@link #throttle()} method. Zero or negative start time cannot be
- * relied on to detect this as System.nanoTime can return zero or negative values.
- */
- boolean firstCall = true;
-
- /**
- * Specifies the throttling rate in operations per second. This must be called with with a value, the inverse
- * of which is a measurement in nano seconds, such that the number of nano seconds do not overflow a long integer.
- * The value must also be larger than zero.
- *
- * @param hertz The throttling rate in cycles per second.
- */
- public void setRate(float hertz)
- {
- // Check that the argument is above zero.
- if (hertz <= 0.0f)
- {
- throw new IllegalArgumentException("The throttle rate must be above zero.");
- }
-
- // Calculate the cycle time.
- cycleTimeNanos = (long) (1000000000f / hertz);
-
- // Reset the first pass flag.
- firstCall = false;
- firstCheckCall = false;
- }
-
- /**
- * Checks but does not enforce the throttle rate. When this method is called, it checks if a length of time greater
- * than that equal to the inverse of the throttling rate has passed since it was last called and returned <tt>true</tt>
- *
- * @return <tt>true</tt> if a length of time greater than that equal to the inverse of the throttling rate has
- * passed since this method was last called and returned <tt>true</tt>, <tt>false</tt> otherwise. The very
- * first time this method is called on a throttle, it returns <tt>true</tt> as the base case to the above
- * self-referential definition.
- */
- public boolean checkThrottle()
- {
- long now = System.nanoTime();
-
- if ((now > (cycleTimeNanos + lastCheckTimeNanos)) || firstCheckCall)
- {
- firstCheckCall = false;
- lastCheckTimeNanos = now;
-
- return true;
- }
- else
- {
- return false;
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BatchedThrottle.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BatchedThrottle.java
deleted file mode 100644
index 241e7aa2b7..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/BatchedThrottle.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * BatchedThrottle is a {@link SleepThrottle} that uses batching to achieve much higher throttling rates than a sleep
- * throttle can. Sleep throttle has difficulties once the rate gets above a few hundred hertz, because the JVM cannot
- * generate timed pauses that are that short. BatchedThrottle gets around this by only inserting pauses once every so
- * many calls to the {@link #throttle()} method, and using a sleep throttle run at a lower rate. The rate for the sleep
- * throttle is chosen so that it remains under 100hz. The final throttling rate of this throttle is equal to the batch
- * size times the rate of the underlying sleep throttle.
- *
- * <p/>The batching calculation involves taking the log to the base 100 of the desired rate and rounding this to
- * an integer. The batch size is always an exact power of 100 because of the rounding. The rate for an underlying
- * sleep throttle is then chosen appropriately.
- *
- * <p/>In practice, the accuracy of a BacthedThrottle skews off but can sometimes even be reasonable up to ten thousand
- * hertz compared with 100 Hz for a {@link SleepThrottle}.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Accept throttling rate in operations per second.
- * <tr><td> Inject short pauses, occasionaly, to fill out processing cycles to a specified rate.
- * <tr><td> Check against a throttle speed without waiting.
- * </table>
- *
- * @todo Should always round the log base 100 down to the nearest integer?
- *
- * @author Rupert Smith
- */
-public class BatchedThrottle extends BaseThrottle
-{
- /** Holds the batch size. */
- int batchSize;
-
- /** The call count within the current batch. */
- long callCount;
-
- /** Holds a sleep throttle configured to run at the batched rate. */
- private Throttle batchRateThrottle = new SleepThrottle();
-
- /**
- * Specifies the throttling rate in operations per second.
- *
- * @param hertz The throttling rate in cycles per second.
- */
- public void setRate(float hertz)
- {
- // Pass the rate unaltered down to the base implementation, for the check method.
- super.setRate(hertz);
-
- // Log base 10 over 2 is used here to get a feel for what power of 100 the total rate is.
- // As the total rate goes up the powers of 100 the batch size goes up by powers of 100 to keep the
- // throttle rate in the range 1 to 100.
- int x = (int) (Math.log10(hertz) / 2);
- batchSize = (int) Math.pow(100, x);
- float throttleRate = hertz / batchSize;
-
- // Reset the call count.
- callCount = 0;
-
- // Set the sleep throttle wrapped implementation at a rate within its abilities.
- batchRateThrottle.setRate(throttleRate);
- }
-
- /**
- * Throttle calls to this method to the rate specified by the {@link #setRate(float)} method.
- */
- public void throttle()
- {
- if ((callCount++ % batchSize) == 0)
- {
- batchRateThrottle.throttle();
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/DurationTestDecorator.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/DurationTestDecorator.java
deleted file mode 100644
index e99fcce752..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/DurationTestDecorator.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-
-import org.apache.log4j.Logger;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-/**
- * A test decorator that runs a test repeatedly until a specified length of time has passed.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Repeatedly run a test for a fixed length of time.
- * </table>
- *
- * @todo The count of the number of tests run is an important number to keep. Also num passed/error/failed is also
- * important to record. What to do with these numbers? They are already logged to the test listeners.
- *
- * @todo The duration test runner wraps on top of size, repeat or thread wrappers, need a way for it to tell
- * TKTestResult when the duration is up, so that it can terminate any repeats in progress. It should end
- * as soon as possible once the test method exits.
- *
- * @author Rupert Smith
- */
-public class DurationTestDecorator extends WrappedSuiteTestDecorator implements ShutdownHookable
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(DurationTestDecorator.class);
-
- /** The test to run. */
- private Test test;
-
- /** The length of time to run the test for. */
- private long duration;
-
- /** Flag set by the shutdown hook. This decorator will not start any new tests when this is set. */
- private boolean shutdown = false;
-
- /**
- * Creates an active test with default multiplier (1).
- *
- * @param test The target test.
- */
- public DurationTestDecorator(WrappedSuiteTestDecorator test)
- {
- super(test);
- this.test = test;
- }
-
- /**
- * Creates active test with default multiplier (1).
- *
- * @param test The target test.
- * @param duration The duration in milliseconds.
- */
- public DurationTestDecorator(WrappedSuiteTestDecorator test, long duration)
- {
- super(test);
-
- // log.debug("public DurationTestDecorator(Test \"" + test + "\", long " + duration + "): called");
-
- this.test = test;
- this.duration = duration;
- }
-
- /**
- * Runs the test repeatedly for the fixed duration.
- *
- * @param testResult The the results object to monitor the test results with.
- */
- public void run(TestResult testResult)
- {
- log.debug("public void run(TestResult testResult): called");
-
-// Removing the durationTimer as this addition prevents this TestDecorator being wrapped with a Scaled Test Decorator.
- // This change will cause the tests to run for at least the specified duration
- // If we need the test to stop much closer to the specified duration then we need to
- // ensure that the solution doesn't prevent this Decorator being wrapped with other Decorators.
-
-// // Cast the test result to expose it as a TKTestResult if the test is running under the TKTestRunner.
-// TKTestResult tkTestResult = null;
-//
-// if (testResult instanceof TKTestResult)
-// {
-// tkTestResult = (TKTestResult) testResult;
-// }
-//
-// // If running under the TKTestRunner, set up a timer to notify the test framework when the test reaches its
-// // completion time.
-// Timer durationTimer = null;
-//
-// if (tkTestResult != null)
-// {
-// log.debug("Creating duration timer.");
-//
-// durationTimer = new Timer();
-// durationTimer.schedule(new DurationTimerTask((TKTestResult) testResult), duration);
-// }
-
-
- // Work out when the test should end.
- long now = System.nanoTime();
- long end = (duration * 1000000) + now;
-
- // Run the test until the duration times out or the shutdown flag is set. The test method may not exit until
- // interrupted in some cases, in which case the timer will do the interrupting.
- while ((now < end) && !shutdown)
- {
- test.run(testResult);
-
- now = System.nanoTime();
- }
-
-// // Clean up any timer that was used.
-// if (durationTimer != null)
-// {
-// log.debug("Cancelling duration timer.");
-//
-// durationTimer.cancel();
-// }
- }
-
- /**
- * Supplies the shutdown hook. This shutdown hook does not call {@link TKTestResult#shutdownNow()} because the
- * {@link ScaledTestDecorator} already takes care of that.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- // log.debug("DurationTestDecorator::ShutdownHook: called");
-
- // Set the shutdown flag so that no new tests are started.
- shutdown = true;
- }
- });
- }
-
-// /**
-// * DurationTimerTask is a timer task that is configured, upon expiry of its timer, to invoke
-// * {@link TKTestResult#shutdownNow()}, for the test result object on which it is set. It also sets
-// * the {@link DurationTestDecorator#shutdown} flag to indicate that no new tests should be run.
-// *
-// * <p/>The test loop implemented by DurationTestDecorator checks that the duration has not expired, on each
-// * test case that it runs. However, it is possible to write test cases that never return until explicitly
-// * interrupted by the test framework. This timer task exists to notify the test framework
-// */
-// private class DurationTimerTask extends TimerTask
-// {
-// /** Used for debugging purposes. */
-// private final Logger log = Logger.getLogger(DurationTimerTask.class);
-//
-// /** Holds the test result for the test to which a duration limit is being applied. */
-// TKTestResult testResult;
-//
-// /**
-// * Creates a duration limit timer which will notify the specified test result when the duration has
-// * expired.
-// *
-// * @param testResult The test result to notify upon expiry of the test duration.
-// */
-// public DurationTimerTask(TKTestResult testResult)
-// {
-// this.testResult = testResult;
-// }
-//
-// /**
-// * The action to be performed by this timer task.
-// */
-// public void run()
-// {
-// log.debug("public void run(): called");
-//
-// shutdown = true;
-// testResult.shutdownNow();
-// }
-// }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/InstrumentedTest.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/InstrumentedTest.java
deleted file mode 100644
index 0804757dce..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/InstrumentedTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-
-/**
- * An InstrumentedTest is one which can supply some additional instrumentation on top of the pass/fail/error behaviour
- * of normal junit tests. Tests implementing this interface must additionally supply information about how long they
- * took to run and how much memory they used.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Report test run time.
- * <tr><td> Report test memory usage.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface InstrumentedTest extends Test
-{
- /**
- * Reports how long the test took to run.
- *
- * @return The time in milliseconds that the test took to run.
- */
- public long getTestTime();
-
- /**
- * Reports the memory usage at the start of the test.
- *
- * @return The memory usage at the start of the test.
- */
- public long getTestStartMemory();
-
- /**
- * Reports the memory usage at the end of the test.
- *
- * @return The memory usage at the end of the test.
- */
- public long getTestEndMemory();
-
- /**
- * Resets the instrumentation values to zero, and nulls any references to held measurements so that the memory
- * can be reclaimed.
- */
- public void reset();
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/NullResultPrinter.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/NullResultPrinter.java
deleted file mode 100644
index 6727f6f152..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/NullResultPrinter.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-
-import junit.textui.ResultPrinter;
-
-import java.io.PrintStream;
-
-/**
- * A ResultPrinter that prints nothing. This exists, in order to provide a replacement to JUnit's ResultPrinter, which
- * is refered to directly by JUnit code, rather that as an abstracted TestListener. JUnit's text ui TestRunner must
- * have a ResultPrinter. This provides an implementation of it that prints nothing, so that a better mechanism can
- * be used for providing feedback to the console instead.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td>
- * </table>
- *
- * @todo See todo in TKTestRunner about completely replacing the test ui runner. Doing things like this in order to
- * extend JUnit is not nice, and there needs to be a better way to do it. Delete this class and use a listener
- * instead.
- *
- * @author Rupert Smith
- */
-public class NullResultPrinter extends ResultPrinter
-{
- /**
- * Builds a fake ResultPrinter that prints nothing.
- *
- * @param writer The writer to send output to.
- */
- public NullResultPrinter(PrintStream writer)
- {
- super(writer);
- }
-
- /**
- * Does nothing.
- *
- * @param test Ignored.
- * @param t Ignored.
- */
- public void addError(Test test, Throwable t)
- { }
-
- /**
- * Does nothing.
- *
- * @param test Ignored.
- * @param t Ignored.
- */
- public void addFailure(Test test, AssertionFailedError t)
- { }
-
- /**
- * Does nothing.
- *
- * @param test Ignored.
- */
- public void endTest(Test test)
- { }
-
- /**
- * Does nothing.
- *
- * @param test Ignored.
- */
- public void startTest(Test test)
- { }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ParameterVariationTestDecorator.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ParameterVariationTestDecorator.java
deleted file mode 100644
index 7da4667928..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ParameterVariationTestDecorator.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.TestResult;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.MathUtils;
-
-/**
- * ParameterVariationTestDecorator is a test decorator that runs a test repeatedly under all permutations of its
- * test parameters.
- *
- * a set of integer parameters and a repeat count are specified, then each test is run for the repeat count at each
- * integer parameter.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Repeat a test for each of a set of integer parameters. <td> {@link org.apache.qpid.junit.extensions.TKTestResult}
- * <tr><td> Repeat a test multiple times.
- * <tr><td>
- * </table>
- *
- * @author Rupert Smith
- */
-public class ParameterVariationTestDecorator extends WrappedSuiteTestDecorator
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(ParameterVariationTestDecorator.class);
-
- /** The int size parameters to run the test with. */
- private int[] params;
-
- /** The number of times the whole test should be repeated. */
- private int repeat;
-
- /**
- * Creates an asymptotic test decorator that wraps a test with repeats and a set of integer 'size' paramters
- * to call the test with.
- *
- * @param test The test to wrap.
- * @param params The integer 'size' parameters.
- * @param repeat The number of times to repeat the test.
- */
- public ParameterVariationTestDecorator(WrappedSuiteTestDecorator test, int[] params, int repeat)
- {
- super(test);
-
- log.debug("public AsymptoticTestDecorator(Test \"" + test + "\", int[] "
- + ((params == null) ? null : MathUtils.printArray(params)) + ", int " + repeat + "): called");
-
- this.params = params;
- this.repeat = repeat;
- }
-
- /**
- * Creates a new AsymptoticTestDecorator object.
- *
- * @param test The test to decorate.
- * @param start The starting asymptotic integer parameter value.
- * @param end The ending asymptotic integer parameter value.
- * @param step The increment size to move from the start to end values by.
- * @param repeat The number of times to repeat the test at each step of the cycle.
- */
- public ParameterVariationTestDecorator(WrappedSuiteTestDecorator test, int start, int end, int step, int repeat)
- {
- super(test);
-
- if (start < 0)
- {
- throw new IllegalArgumentException("Start must be >= 0");
- }
-
- if (end < start)
- {
- throw new IllegalArgumentException("End must be >= start");
- }
-
- if (step < 1)
- {
- throw new IllegalArgumentException("Step must be >= 1");
- }
-
- if (repeat < 1)
- {
- throw new IllegalArgumentException("Repeat must be >= 1");
- }
-
- // Generate the sequence.
- params = new int[((end - start) / step) + 1];
- int i = 0;
- for (int n = start; n <= end; n += step)
- {
- params[i++] = n;
- }
-
- this.repeat = repeat;
- }
-
- /**
- * Runs the test repeatedly for each value of the int parameter specified and for the correct number of test
- * repeats.
- *
- * @param result The test result object that the tests will indicate their results to. This is also used
- * to pass the int parameter from this class to the decorated test class.
- */
- public void run(TestResult result)
- {
- log.debug("public void run(TestResult result): called");
-
- if (!(result instanceof TKTestResult))
- {
- throw new IllegalArgumentException("AsymptoticTestDecorator only works with TKTestResult");
- }
-
- // Cast the test result into a TKTestResult to place the current parameter into.
- TKTestResult tkResult = (TKTestResult) result;
-
- log.debug("params = " + ((params == null) ? null : MathUtils.printArray(params)));
- log.debug("repeat = " + repeat);
-
- if(params != null)
- {
- for (int n : params)
- {
- for (int j = 0; j < repeat; j++)
- {
- log.debug("n = " + n);
-
- // Set the integer parameter in the TKTestResult to be passed to the tests.
- tkResult.setN(n);
-
- if (tkResult.shouldStop())
- {
- log.debug("tkResult.shouldStop = " + true);
-
- break;
- }
-
- log.debug("Calling super#run");
- super.run(tkResult);
- }
- }
- }
- }
-
- /**
- * Prints out the name of this test with the string "(parameterized)" appended onto it for debugging purposes.
- *
- * @return The name of this test with the string "(parameterized)" appended onto it.
- */
- public String toString()
- {
- return super.toString() + "(parameterized)";
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ScaledTestDecorator.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ScaledTestDecorator.java
deleted file mode 100644
index 93e2a3c855..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ScaledTestDecorator.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-
-import java.util.concurrent.BrokenBarrierException;
-import java.util.concurrent.CyclicBarrier;
-
-/**
- * A test decorator that runs a test many times simultaneously in many threads.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Clone a test run into many threads and run them simultaneously.
- * <tr><td> Inform the test results of the start and end of each concurrent test batch. <td> {@link TKTestResult}
- * <tr><td> Inform the test results of the concurrency level. <td> {@link TKTestResult}
- * </table>
- *
- * @author Rupert Smith
- */
-public class ScaledTestDecorator extends WrappedSuiteTestDecorator implements ShutdownHookable // TestDecorator
-{
- /** Used for logging. */
- // private static final Logger log = Logger.getLogger(ScaledTestDecorator.class);
-
- /** Determines how long to wait for tests to cleanly exit on shutdown. */
- private static final long SHUTDOWN_PAUSE = 3000;
-
- /**
- * The stress levels or numbers of simultaneous threads to run the test in. The test is repeated at each of
- * the concurrency levels specified here. Defaults to 1 thread.
- */
- private int[] threads = new int[] { 1 };
-
- /** Used to hold the number of tests currently being run in parallel. */
- private int concurrencyLevel;
-
- /** The test to run. */
- private WrappedSuiteTestDecorator test;
-
- /**
- * Used to hold the current {@link TKTestResult} for the tests currently being run. This is made available so that
- * the shutdown hook can ask it to cleanly end the current tests in the event of a shutdown.
- */
- private TKTestResult currentTestResult;
-
- /** Flag set by the shutdown hook. This decorator will not start any new tests when this is set. */
- private boolean shutdown = false;
-
- /**
- * Creates an active test with default multiplier (1).
- *
- * @param test The target test.
- */
- public ScaledTestDecorator(WrappedSuiteTestDecorator test)
- {
- super(test);
- this.test = test;
- }
-
- /**
- * Creates a concurrently scaled test with the specified number of threads.
- *
- * @param test The target test.
- * @param numThreads The stress level.
- */
- public ScaledTestDecorator(WrappedSuiteTestDecorator test, int numThreads)
- {
- this(test, new int[] { numThreads });
- }
-
- /**
- * Creates a concurrently scaled test with the specified thread levels, the test is repeated at each level.
- *
- * @param test The target test.
- * @param threads The concurrency levels.
- */
- public ScaledTestDecorator(WrappedSuiteTestDecorator test, int[] threads)
- {
- super(test);
-
- /*log.debug("public ScaledTestDecorator(WrappedSuiteTestDecorator test = \"" + test + "\", int[] threads = "
- + MathUtils.printArray(threads) + "): called");*/
-
- this.test = test;
- this.threads = threads;
- }
-
- /**
- * Runs the test simultaneously in at the specified concurrency levels.
- *
- * @param testResult The results object to monitor the test results with.
- */
- public void run(TestResult testResult)
- {
- // log.debug("public void run(TestResult testResult = " + testResult + "): called");
-
- // Loop through all of the specified concurrent levels for the test, provided shutdown has not been called.
- for (int i = 0; (i < threads.length) && !shutdown; i++)
- {
- // Get the number of threads for this run.
- int numThreads = threads[i];
-
- // Create test thread handlers for all the threads.
- TestThreadHandler[] threadHandlers = new TestThreadHandler[numThreads];
-
- // Create a cyclic barrier for the test threads to synch their setups and teardowns on.
- CyclicBarrier barrier = new CyclicBarrier(numThreads);
-
- // Set up the test thread handlers to output results to the same test results object.
- for (int j = 0; j < numThreads; j++)
- {
- threadHandlers[j] = new TestThreadHandler(testResult, test, barrier);
- }
-
- // Ensure the concurrency level statistic is set up correctly.
- concurrencyLevel = numThreads;
-
- // Begin batch.
- if (testResult instanceof TKTestResult)
- {
- TKTestResult tkResult = (TKTestResult) testResult;
- // tkResult.notifyStartBatch();
- tkResult.setConcurrencyLevel(numThreads);
-
- // Set the test result for the currently running tests, so that the shutdown hook can call it if necessary.
- currentTestResult = tkResult;
- }
-
- // Run all the tests and wait for them all to finish.
- executeAndWaitForRunnables(threadHandlers);
-
- // Clear the test result for the currently running tests.
- currentTestResult = null;
-
- // End batch.
- if (testResult instanceof TKTestResult)
- {
- TKTestResult tkResult = (TKTestResult) testResult;
- tkResult.notifyEndBatch();
- }
-
- // Clear up all the test threads, they hold references to their associated TestResult object and Test object,
- // which may prevent them from being garbage collected as the TestResult and Test objects are long lived.
- for (int j = 0; j < numThreads; j++)
- {
- threadHandlers[j].testResult = null;
- threadHandlers[j].test = null;
- threadHandlers[j] = null;
- }
- }
- }
-
- /**
- * Reports the number of tests that the scaled decorator is currently running concurrently.
- *
- * @return The number of tests that the scaled decorator is currently running concurrently.
- */
- public int getConcurrencyLevel()
- {
- return concurrencyLevel;
- }
-
- /**
- * Executes all of the specifed runnable using the thread pool and waits for them all to complete.
- *
- * @param runnables The set of runnables to execute concurrently.
- */
- private void executeAndWaitForRunnables(Runnable[] runnables)
- {
- int numThreads = runnables.length;
-
- // Used to keep track of the test threads in order to know when they have all completed.
- Thread[] threads = new Thread[numThreads];
-
- // Create all the test threads.
- for (int j = 0; j < numThreads; j++)
- {
- threads[j] = new Thread(runnables[j]);
- }
-
- // Start all the test threads.
- for (int j = 0; j < numThreads; j++)
- {
- threads[j].start();
- }
-
- // Wait for all the test threads to complete.
- for (int j = 0; j < numThreads; j++)
- {
- try
- {
- threads[j].join();
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted state of the thread.
- Thread.currentThread().interrupt();
- }
- }
- }
-
- /**
- * Supplies the shut-down hook.
- *
- * @return The shut-down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- // log.debug("ScaledTestDecorator::ShutdownHook: called");
-
- // Set the shutdown flag so that no new tests are started.
- shutdown = true;
-
- // Check if tests are currently running, and ask them to complete as soon as possible. Allow
- // a short pause for this to happen.
- TKTestResult testResult = currentTestResult;
-
- if (testResult != null)
- {
- // log.debug("There is a test result currently running tests, asking it to terminate ASAP.");
- testResult.shutdownNow();
-
- try
- {
- Thread.sleep(SHUTDOWN_PAUSE);
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted state of the thread.
- Thread.currentThread().interrupt();
- }
- }
- }
- });
- }
-
- /**
- * Prints a string summarizing this test decorator, mainly for debugging purposes.
- *
- * @return String representation for debugging purposes.
- */
- public String toString()
- {
- return "ScaledTestDecorator: [ test = " + test + ", concurrencyLevel = " + concurrencyLevel + " ]";
- }
-
- /**
- * TestThreadHandler is a runnable used to execute a test in. This is static to avoid implicit 'this' reference to
- * the longer lived ScaledTestDecorator class. The scaled test decorator may execute many repeats but creates fresh
- * handlers for each one. It re-uses the threads in a pool but does not re-use these handlers.
- */
- private static class TestThreadHandler implements Runnable
- {
- /** The test result object for the test to be run with. */
- TestResult testResult;
-
- /** The test to run. */
- WrappedSuiteTestDecorator test;
-
- /** Holds the cyclic barrier to synchronize on the end of the setups and before the tear downs. */
- CyclicBarrier barrier;
-
- /**
- * Creates a new TestThreadHandler object.
- *
- * @param testResult The test result object for the test to be run with.
- * @param test The test to run in a sperate thread.
- * @param barrier The barrier implementation to use to synchronize per-thread setup completion and test
- * completion before moving on through the setup, test, teardown phases. The barrier should
- * be configured for the number of test threads.
- */
- TestThreadHandler(TestResult testResult, WrappedSuiteTestDecorator test, CyclicBarrier barrier)
- {
- this.testResult = testResult;
- this.test = test;
- this.barrier = barrier;
- }
-
- /**
- * Runs the test associated with this pool.
- */
- public void run()
- {
- try
- {
- // Call setup on all underlying tests in the suite that are thread aware.
- for (Test childTest : test.getAllUnderlyingTests())
- {
- // Check that the test is concurrency aware, so provides a setup method to call.
- if (childTest instanceof TestThreadAware)
- {
- // Call the tests per thread setup.
- TestThreadAware setupTest = (TestThreadAware) childTest;
- setupTest.threadSetUp();
- }
- }
-
- // Wait until all test threads have completed their setups.
- barrier.await();
-
-
- // Call setup on all underlying tests in the suite that are thread aware.
- for (Test childTest : test.getAllUnderlyingTests())
- {
- // Check that the test is concurrency aware, so provides a setup method to call.
- if (childTest instanceof TestThreadAware)
- {
- // Call the tests post thread setup.
- TestThreadAware setupTest = (TestThreadAware) childTest;
- setupTest.postThreadSetUp();
- }
- }
-
- // Wait until all test threads have completed their prefill.
- barrier.await();
-
- // Start timing the test batch, only after thread setups have completed.
- if (testResult instanceof TKTestResult)
- {
- ((TKTestResult) testResult).notifyStartBatch();
- }
-
- // Run the tests.
- test.run(testResult);
-
- // Wait unitl all test threads have completed their tests.
- barrier.await();
-
- // Call tear down on all underlying tests in the suite that are thread aware.
- for (Test childTest : test.getAllUnderlyingTests())
- {
- // Check that the test is concurrency aware, so provides a teardown method to call.
- if (childTest instanceof TestThreadAware)
- {
- // Call the tests per thread tear down.
- TestThreadAware setupTest = (TestThreadAware) childTest;
- setupTest.threadTearDown();
- }
- }
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted state of the thread.
- Thread.currentThread().interrupt();
- }
- catch (BrokenBarrierException e)
- {
- // Set the interrupted state on the thread. The BrokenBarrierException may be caused where one thread
- // waiting for the barrier is interrupted, causing the remaining threads correctly waiting on the
- // barrier to fail. This condition is expected during test interruptions, and the response to it is to
- // interrupt all the other threads running in the same scaled test.
- Thread.currentThread().interrupt();
- }
- }
-
- /**
- * Prints the name of the test for debugging purposes.
- *
- * @return The name of the test.
- */
- public String toString()
- {
- return "ScaledTestDecorator: [test = \"" + test + "\"]";
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskAware.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskAware.java
deleted file mode 100644
index e462145d7d..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskAware.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * SetupTaskAware is an interface that tests that can accept injectable setup tasks may implement. Typically this
- * is used by configurable decorator stack to inject setup tasks into tests. It is then up to the test case to run
- * the tasks in the setup or threadSetup methods as it chooses.
- *
- * <p/>Set up tasks should be chained so that they are executed in the order that they are applied. Tear down tasks
- * should be chained so that they are executed in the reverse order to which they are applied. That way the set up and
- * tear down tasks act as a 'task' stack, with nested setups and tear downs.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities.
- * <tr><td> Handle injection of set up tasks.
- * <tr><td> Handle injection of tear down tasks.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface SetupTaskAware
-{
- /**
- * Adds the specified task to the tests setup.
- *
- * @param task The task to add to the tests setup.
- */
- public void chainSetupTask(Runnable task);
-
- /**
- * Adds the specified task to the tests tear down.
- *
- * @param task The task to add to the tests tear down.
- */
- public void chainTearDownTask(Runnable task);
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskHandler.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskHandler.java
deleted file mode 100644
index 631f4dcdf0..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SetupTaskHandler.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import org.apache.qpid.junit.extensions.util.StackQueue;
-
-import java.util.LinkedList;
-import java.util.Queue;
-
-/**
- * SetupTaskHandler implements a task stack. It can be used, by delegation, as a base implementation for tests that want
- * to have configurable setup/teardown task stacks. Typically it is up to the test implementation to decide whether the
- * stack is executed in the setup/teardown methods or in the threadSetup/threadTeaddown methods.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Handle injection of set up tasks.
- * <tr><td> Handle injection of tear down tasks.
- * <tr><td> Run set up tasks in chain order.
- * <tr><td> Run tear down tasks in reverse chain order.
- * </table>
- *
- * @author Rupert Smith
- */
-public class SetupTaskHandler implements SetupTaskAware
-{
- /** Holds the set up tasks. */
- private Queue<Runnable> setups = new LinkedList<Runnable>();
-
- /** Holds the tear down tasks. */
- private Queue<Runnable> teardowns = new StackQueue<Runnable>();
-
- /**
- * Adds the specified task to the tests setup.
- *
- * @param task The task to add to the tests setup.
- */
- public void chainSetupTask(Runnable task)
- {
- setups.offer(task);
- }
-
- /**
- * Adds the specified task to the tests tear down.
- *
- * @param task The task to add to the tests tear down.
- */
- public void chainTearDownTask(Runnable task)
- {
- teardowns.offer(task);
- }
-
- /**
- * Runs the set up tasks in the order that they way chained.
- */
- public void runSetupTasks()
- {
- while (!setups.isEmpty())
- {
- setups.remove().run();
- }
- }
-
- /**
- * Runs the tear down tasks in the reverse of the order in which they were chained.
- */
- public void runTearDownTasks()
- {
- while (!teardowns.isEmpty())
- {
- teardowns.remove().run();
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ShutdownHookable.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ShutdownHookable.java
deleted file mode 100644
index dc6aa3c291..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/ShutdownHookable.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * Defines an interface that classes which supply shutdown hooks implement. Code that creates these classes can check
- * if they supply a shutdown hook and register these hooks when the obejct are created.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Supply a shutdown hook.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface ShutdownHookable
-{
- /**
- * Supplies the shutdown hook.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook();
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SleepThrottle.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SleepThrottle.java
deleted file mode 100644
index 2dc4c0e272..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/SleepThrottle.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * SleepThrottle is a Throttle implementation that generates short pauses using the thread sleep methods. As the pauses
- * get shorter, this technique gets more innacurate. In practice, around 100 Hz is the cap rate for accuracy.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Accept throttling rate in operations per second.
- * <tr><td> Inject short pauses to fill out processing cycles to a specified rate.
- * <tr><td> Check against a throttle speed without waiting.
- * </table>
- *
- * @author Rupert Smith
- */
-public class SleepThrottle extends BaseThrottle implements Throttle
-{
- /** Holds the time of the last call to the throttle method in nano seconds. */
- private long lastTimeNanos;
-
- /**
- * This method can only be called at the rate set by the {@link #setRate} method, if it is called faster than this
- * it will inject short pauses to restrict the call rate to that rate.
- */
- public void throttle()
- {
- // Get the current time in nanos.
- long currentTimeNanos = System.nanoTime();
-
- // Don't introduce any pause on the first call.
- if (!firstCall)
- {
- // Check if there is any time left in the cycle since the last call to this method and introduce a short pause
- // to fill that time if there is.
- long remainingTimeNanos = cycleTimeNanos - (currentTimeNanos - lastTimeNanos);
-
- if (remainingTimeNanos > 0)
- {
- long milliPause = remainingTimeNanos / 1000000;
- int nanoPause = (int) (remainingTimeNanos % 1000000);
-
- try
- {
- Thread.sleep(milliPause, nanoPause);
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted thread, in-case the caller is checking for it.
- Thread.currentThread().interrupt();
- }
- }
- }
- else
- {
- firstCall = false;
- }
-
- // Update the last time stamp.
- lastTimeNanos = System.nanoTime();
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestResult.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestResult.java
deleted file mode 100644
index 5ce56a690e..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestResult.java
+++ /dev/null
@@ -1,654 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestResult;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.listeners.TKTestListener;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Properties;
-
-/**
- * TKTestResult extends TestResult in order to calculate test timings, to pass the variable integer parameter for
- * parameterized test cases to those test cases and to introduce an optional delay before test starts. Interested
- * {@link TKTestListener}s may be attached to this and will be informed of all relevant test statistics.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Calculate test timings.
- * <tr><td> Inform timing listeners of timings.
- * <tr><td> Inform memory listeners of memory readings.
- * <tr><td> Inform parameters listeners of parameters.
- * <tr><td> Pass the integer parameter to parameterized test cases.
- * <tr><td> Provide verbose test information on test start and end.
- * </table>
- *
- * @todo Move the verbose test information on test start/end into a test listener instead. It confuses the intention
- * of this class. Could also move the delay into a listener but that seems less appropriate as it would be a
- * side-effecting listener. Delay and timing calculation are fundamental enough to this class.
- *
- * @todo The need for this class to act as a place-holder for the integer parameter for parameterized test cases is
- * because this behaviour has been factored out into a test decorator class, see {@link AsymptoticTestDecorator}.
- * The {@link AsymptoticTestDecorator#run} method takes a TestResult as an argument and cannot easily get to the
- * {@link AsymptoticTestCase} class other than through this class. The option of using this class as a place hold
- * for this value was chosen. Alternatively this class could provide a method for decorators to access the
- * underlying test case through and then leave the setting of this parameter to the decorator which is a more
- * natural home for this behaviour. It would also provide a more general framework for decorators.
- *
- * @todo The memory usage may need to be moved in closer to the test method invocation so that as little code as possible
- * exists between it and the test or the results may be obscured. In fact it certainly does as the teardown method
- * is getting called first. Wouldn't be a bad idea to move the timing code in closer too.
- *
- * @todo Get rid of the delay logic. Will be replaced by throttle control.
- *
- * @author Rupert Smith
- */
-public class TKTestResult extends TestResult
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(TKTestResult.class);
-
- /** The delay between two tests. */
- private int delay = 0;
-
- /**
- * This flag indicates that the #completeTest method of the timing controller has been called. Once this has
- * been called once, the end test event for the whole test method should be ignored because tests have taken
- * charge of outputing their own timings.
- */
- private boolean completeTestUsed = false;
-
- /**
- * Thread locals to hold test start time for non-instrumented tests. (Instrumented tests hold their own
- * measurement data).
- */
- // private Hashtable threadStartTimeMap = new Hashtable();
- private ThreadLocal<ThreadLocalSettings> threadLocals = new ThreadLocal<ThreadLocalSettings>();
-
- /** Used to hold the current integer parameter to pass to parameterized tests. This defaults to 1. */
- private int n = 1;
-
- /** The timing listeners. */
- private Collection<TKTestListener> tkListeners;
-
- /** The test case name. */
- private String testCaseName;
-
- /** Used to hold the current concurrency level, set by the {@link ScaledTestDecorator}. */
- private int concurrencyLevel = 1;
-
- /** Flag used to indicate that this test result should attempt to complete its current tests as soon as possible. */
- private boolean shutdownNow = false;
-
- /** Holds the parametes that the test is run with. */
- private Properties testParameters;
-
- /**
- * Creates a new TKTestResult object.
- *
- * @param delay A delay in milliseconds to introduce before every test start.
- * @param testCaseName The name of the test case that this is the TestResult object for.
- */
- public TKTestResult(int delay, String testCaseName)
- {
- super();
-
- /*log.debug("public TKTestResult(PrintStream writer, int " + delay + ", boolean " + verbose + ", String "
- + testCaseName + "): called");*/
-
- // Keep all the parameters that this is created with.
- this.delay = delay;
- this.testCaseName = testCaseName;
- }
-
- /**
- * Callback method use to inform this test result that a test will be started. Waits for the configured delay time
- * if one has been set, starts the timer, then delegates to the super class implementation.
- *
- * @param test The test to be started.
- */
- public void startTest(Test test)
- {
- // log.debug("public void startTest(Test test): called");
-
- // If a delay time has been specified then wait for that length of time.
- if (this.delay > 0)
- {
- try
- {
- Thread.sleep(delay);
- }
- catch (InterruptedException e)
- {
- // Ignore, but restore the interrupted flag.
- Thread.currentThread().interrupt();
- }
- }
-
- // Create the thread local settings for the test.
- ThreadLocalSettings threadLocalSettings = new ThreadLocalSettings();
- threadLocals.set(threadLocalSettings);
-
- // Record the test start time against this thread for calculating the test timing. (Consider using ThreadLocal
- // instead?)
- Long startTime = System.nanoTime();
- threadLocalSettings.startTime = startTime;
- // log.debug("startTime = " + startTime);
-
- // Check if the test is timing controller aware, in which case set up a new timing controller and hold it
- // in the thread local settings.
- if (test instanceof TimingControllerAware)
- {
- TimingControllerAware controllerAware = (TimingControllerAware) test;
- TimingControllerImpl controller =
- new TimingControllerImpl(this, test, startTime, Thread.currentThread().getId());
- controllerAware.setTimingController(controller);
-
- threadLocalSettings.timingController = controller;
- }
-
- // Delegate to the super method to notify test event listeners.
- super.startTest(test);
- }
-
- /**
- * Callback method use to inform this result that a test was completed. This calculates how long the test took
- * to run, then delegates to the super class implementation.
- *
- * @param test The test that has ended.
- */
- public void endTest(Test test)
- {
- // log.debug("public void endTest(Test test): called");
-
- long runTime = 0;
-
- // Recover the thread local settings.
- ThreadLocalSettings threadLocalSettings = threadLocals.get();
-
- // Check if the test is an instrumented test and get the timing information from the instrumentation as this
- // will be more accurate.
- if (test instanceof InstrumentedTest)
- {
- InstrumentedTest iTest = (InstrumentedTest) test;
-
- // Calculate the test run time.
- runTime = iTest.getTestTime();
- // log.debug("runTime = " + runTime);
-
- // Calculate the test memory usage.
- long startMem = iTest.getTestStartMemory();
- long endMem = iTest.getTestEndMemory();
-
- // log.debug("startMem = " + startMem);
- // log.debug("endMem = " + endMem);
-
- // Inform any memory listeners of the test memory.
- if (tkListeners != null)
- {
- for (TKTestListener memoryListener : tkListeners)
- {
- memoryListener.memoryUsed(test, startMem, endMem, null);
- }
- }
- }
- else
- {
- // Calculate the test run time.
- long endTime = System.nanoTime();
- Long startTime = threadLocalSettings.startTime;
- runTime = endTime - startTime;
- // log.debug("runTime = " + runTime);
-
- threadLocals.remove();
- }
-
- // Output end test stats. This is only done when the tests have not used the timing controller to output
- // mutiple timings.
- if (!completeTestUsed)
- {
- // Check if the test is an asymptotic test case and get its int parameter if so.
- if (test instanceof AsymptoticTestCase)
- {
- AsymptoticTestCase pTest = (AsymptoticTestCase) test;
-
- // Set the parameter.
- int paramValue = pTest.getN();
-
- // Inform any parameter listeners of the test parameter.
- if (tkListeners != null)
- {
- for (TKTestListener parameterListener : tkListeners)
- {
- parameterListener.parameterValue(test, paramValue, null);
- }
- }
- }
-
- // Inform any timing listeners of the test timing and concurrency level.
- if (tkListeners != null)
- {
- for (TKTestListener tkListener : tkListeners)
- {
- TKTestListener next = tkListener;
-
- next.timing(test, runTime, null);
- next.concurrencyLevel(test, concurrencyLevel, null);
- }
- }
-
- // Call the super method to notify test event listeners of the end event.
- super.endTest(test);
- }
- }
-
- /**
- * Gets the integer parameter to pass to parameterized test cases.
- *
- * @return The value of the integer parameter.
- */
- public int getN()
- {
- return n;
- }
-
- /**
- * Sets the integer parameter to pass to parameterized test cases.
- *
- * @param n The new value of the integer parameter.
- */
- public void setN(int n)
- {
- // log.debug("public void setN(int " + n + "): called");
-
- this.n = n;
- }
-
- /**
- * Adds a timing listener to pass all timing events to.
- *
- * @param listener The timing listener to register.
- */
- public void addTKTestListener(TKTestListener listener)
- {
- // Create the collection to hold the timing listeners if it does not already exist.
- if (tkListeners == null)
- {
- tkListeners = new ArrayList<TKTestListener>();
- }
-
- // Keep the new timing listener.
- tkListeners.add(listener);
- }
-
- /**
- * Called by the test runner to notify this that a new test batch is being begun. This method forwards this
- * notification to all batch listeners.
- */
- public void notifyStartBatch()
- {
- if (tkListeners != null)
- {
- for (TKTestListener batchListener : tkListeners)
- {
- batchListener.startBatch();
- }
- }
- }
-
- /**
- * Called by the test runner to notify this that the current test batch has been ended. This method forwards this
- * notification to all batch listener.
- */
- public void notifyEndBatch()
- {
- // log.debug("public void notifyEndBatch(): called");
-
- if (tkListeners != null)
- {
- for (TKTestListener batchListener : tkListeners)
- {
- batchListener.endBatch(testParameters);
- }
- }
- }
-
- /**
- * Called by the test runner to notify this of the properties that the test is using.
- *
- * @param properties The tests set/read properties.
- */
- public void notifyTestProperties(Properties properties)
- {
- // log.debug("public void notifyTestProperties(Properties properties): called");
-
- this.testParameters = properties;
-
- /*
- if (tkListeners != null)
- {
- for (TKTestListener batchListener : tkListeners)
- {
- batchListener.properties(properties);
- }
- }
- */
- }
-
- /**
- * Intercepts the execution of a test case to pass the variable integer parameter to a test if it is a parameterized
- * test case.
- *
- * @param test The test to run.
- */
- protected void run(final TestCase test)
- {
- // log.debug("protected void run(final TestCase test): called");
-
- // Check if the test case is a parameterized test and set its integer parameter if so.
- if (test instanceof AsymptoticTestCase)
- {
- AsymptoticTestCase pTest = (AsymptoticTestCase) test;
-
- // Set up the integer parameter.
- pTest.setN(n);
- }
-
- // Delegate to the super method to run the test.
- super.run(test);
- }
-
- /**
- * Helper method that generats a String of verbose information about a test. This includes the thread name, test
- * class name and test method name.
- *
- * @param test The test to generate the info string for.
- *
- * @return Returns a string with the thread name, test class name and test method name.
- */
- protected String getTestInfo(Test test)
- {
- // log.debug("protected String getTestInfo(Test test): called");
-
- return "[" + Thread.currentThread().getName() + "@" + test.getClass().getName() + "."
- + ((test instanceof TestCase) ? ((TestCase) test).getName() : "") + "]";
- }
-
- /**
- * Sets the concurrency level to pass into the test result.
- *
- * @param concurrencyLevel The concurrency level the tests are running out.
- */
- public void setConcurrencyLevel(int concurrencyLevel)
- {
- this.concurrencyLevel = concurrencyLevel;
- }
-
- /**
- * Tells this test result that it should stop running tests. Once this method has been called this test result
- * will not start any new tests, and any tests that use the timing controller will be passed interrupted exceptions,
- * to indicate that they should end immediately. Usually the caller of this method will introduce a short wait
- * to allow an opporunity for running tests to complete, before forcing the shutdown of the JVM.
- */
- public void shutdownNow()
- {
- log.debug("public void shutdownNow(): called on " + this);
-
- shutdownNow = true;
- }
-
- /**
- * Prints a string summary of this class, mainly for debugging purposes.
- *
- * @return A string summary of this class, mainly for debugging purposes.
- */
- public String toString()
- {
- return "TKTestResult@" + Integer.toString(hashCode(), 16) + ": [ testCaseName = " + testCaseName + ", n = " + n
- + ", tkListeners = " + tkListeners + " ]";
- }
-
- /**
- * Holds things that need to be kept on a per thread basis for each test invocation, such as the test start
- * time and its timing controller.
- */
- private static class ThreadLocalSettings
- {
- /** Holds the test start time. */
- Long startTime;
-
- /** Holds the test threads timing controller. */
- TimingController timingController;
- }
-
- /**
- * Provides an implementation of the {@link TimingController} interface that timing aware tests can use to call
- * back to reset timers, and register additional test timings.
- */
- private static class TimingControllerImpl implements TimingController
- {
- /** Holds an explicit reference to the test TKTestResult that created this. */
- TKTestResult testResult;
-
- /** Holds a reference to the test that this is the timing controller for. */
- Test test;
-
- /** Holds the start time for this timing controller. This gets reset to now on each completed test. */
- long startTime;
-
- /**
- * Holds the thread id of the thread that started the test, so that this controller may be called from other
- * threads but still identify itself correctly to {@link TKTestListener}s as being associated with the
- * thread that called the test method.
- */
- long threadId;
-
- /**
- * Creates a timing controller on a specified TKTestResult and a test.
- *
- * @param testResult The TKTestResult that this controller interacts with.
- * @param test The test that this is the timing controller for.
- * @param startTime The test start time in nanoseconds.
- * @param threadId The thread id of the thread that is calling the test method.
- */
- public TimingControllerImpl(TKTestResult testResult, Test test, long startTime, long threadId)
- {
- this.testResult = testResult;
- this.test = test;
- this.startTime = startTime;
- this.threadId = threadId;
- }
-
- /**
- * Gets the timing controller associated with the current test thread. Tests that use timing controller should
- * always get the timing controller from this method in the same thread that called the setUp, tearDown or test
- * method. The controller returned by this method may be called from any thread because it remembers the thread
- * id of the original test thread.
- *
- * @return The timing controller associated with the current test thread.
- */
- public TimingController getControllerForCurrentThread()
- {
- // Recover the thread local settings and extract the timing controller from them.
- ThreadLocalSettings threadLocalSettings = testResult.threadLocals.get();
-
- return threadLocalSettings.timingController;
- }
-
- /**
- * Not implemented yet.
- *
- * @return Nothing.
- */
- public long suspend()
- {
- throw new RuntimeException("Method not implemented.");
- }
-
- /**
- * Not implemented yet.
- *
- * @return Nothing.
- */
- public long resume()
- {
- throw new RuntimeException("Method not implemented.");
- }
-
- /**
- * Resets the timer start time to now.
- *
- * @return The new value of the start time.
- */
- public long restart()
- {
- startTime = System.nanoTime();
-
- return startTime;
- }
-
- /**
- * Register an additional pass/fail for the current test. The test result is assumed to apply to a test of
- * 'size' parmeter 1. Use the {@link #completeTest(boolean, int)} method to register timings with parameters.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed) throws InterruptedException
- {
- completeTest(testPassed, 1);
- }
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param) throws InterruptedException
- {
- completeTest(testPassed, param, null, null);
- }
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter and allows the caller to sepecify the timing to log.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- * @param timeNanos The time in nano-seconds to log the test result with.
- *
- * A null value for timeNanos is a request to this method that it should
- * calculate the time for the given test run.
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param, Long timeNanos) throws InterruptedException
- {
- completeTest(testPassed, param, timeNanos, null);
- }
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter and allows the caller to sepecify the timing to log.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- * @param timeNanos The time in nano seconds to log the test result with.
- *
- * A null value for timeNanos is a request to this method that it should
- * calculate the time for the given test run.
- * A null value for timeNanos2 means this test does not provide a second
- * timing value so a '-' is printed in the log.
- *
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param, Long timeNanos, Long time2Nanos) throws InterruptedException
- {
- log.debug("public void completeTest(boolean testPassed, int param, long timeNanos): called");
- log.debug("testResult = " + testResult);
-
- /*log.debug("public long completeTest(boolean testPassed = " + testPassed + ", int param = " + param
- + "): called");*/
-
- // Calculate the test run time.
- long endTime = System.nanoTime();
- long runTime = endTime - startTime;
- startTime = endTime;
-
- //
- if (timeNanos != null)
- {
- runTime = timeNanos;
- }
-
- // Tell the test result that completeTest has been used, so to not register end test events for the whole
- // test method.
- testResult.completeTestUsed = true;
-
- // Inform any timing listeners of the test timings and parameters and send an end test notification using
- // the thread id of the thread that started the test.
- if (testResult.tkListeners != null)
- {
- for (TKTestListener listener : testResult.tkListeners)
- {
- listener.reset(test, threadId);
- listener.timing(test, runTime, threadId);
- listener.timing2(test, time2Nanos, threadId);
- listener.parameterValue(test, param, threadId);
- listener.concurrencyLevel(test, testResult.concurrencyLevel, threadId);
-
- if (!testPassed)
- {
- listener.addFailure(test, null, threadId);
- }
-
- listener.endTest(test, threadId);
- }
- }
-
- // log.debug("testResult.shutdownNow = " + testResult.shutdownNow);
-
- // Check if the test runner has been asked to shutdown and raise an interuppted exception if so.
- if (testResult.shutdownNow)
- {
- // log.debug("The shutdown flag is set.");
-
- throw new InterruptedException("Attempting clean shutdown by suspending current test.");
- }
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestRunner.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestRunner.java
deleted file mode 100644
index 671d33feed..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TKTestRunner.java
+++ /dev/null
@@ -1,694 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.listeners.CSVTestListener;
-import org.apache.qpid.junit.extensions.listeners.ConsoleTestListener;
-import org.apache.qpid.junit.extensions.listeners.XMLTestListener;
-import org.apache.qpid.junit.extensions.util.CommandLineParser;
-import org.apache.qpid.junit.extensions.util.MathUtils;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-
-import java.io.*;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * TKTestRunner extends {@link junit.textui.TestRunner} with the ability to run tests multiple times, to execute a test
- * simultaneously using many threads, to put a delay between test runs and adds support for tests that take integer
- * parameters that can be 'stepped' through on multiple test runs. These features can be accessed by using this class
- * as an entry point and passing command line arguments to specify which features to use:
- *
- * <pre>
- * -w ms The number of milliseconds between invocations of test cases.
- * -c pattern The number of tests to run concurrently.
- * -r num The number of times to repeat each test.
- * -d duration The length of time to run the tests for.
- * -t name The name of the test case to execute.
- * -s pattern The size parameter to run tests with.
- * -o dir The name of the directory to output test timings to.
- * --csv Output test results in CSV format.
- * --xml Output test results in XML format.
- * </pre>
- *
- * <p/>This command line may also have trailing 'name=value' parameters added to it. All of these values are added
- * to the test context properties and passed to the test, which can access them by name.
- *
- * <p/>The pattern arguments are of the form [lowest(: ...)(: highest)](:sample=s)(:exp), where round brackets
- * enclose optional values. Using this pattern form it is possible to specify a single value, a range of values divided
- * into s samples, a range of values divided into s samples but distributed exponentially, or a fixed set of samples.
- *
- * <p/>The duration arguments are of the form (dD)(hH)(mM)(sS), where round brackets enclose optional values. At least
- * one of the optional values must be present.
- *
- * <p/>When specifying optional test parameters on the command line, in 'name=value' format, it is also possible to use
- * the format 'name=[value1:value2:value3:...]', to specify multiple values for a parameter. All permutations of all
- * parameters with multiple values will be created and tested. If the values are numerical, it is also possible to use
- * the sequence generation patterns instead of fully specifying all of the values.
- *
- * <p/>Here are some examples:
- *
- * <p/><table>
- * <tr><td><pre> -c [10:20:30:40:50] </pre><td> Runs the test with 10,20,...,50 threads.
- * <tr><td><pre> -s [1:100]:samples=10 </pre>
- * <td> Runs the test with ten different size parameters evenly spaced between 1 and 100.
- * <tr><td><pre> -s [1:1000000]:samples=10:exp </pre>
- * <td> Runs the test with ten different size parameters exponentially spaced between 1 and 1000000.
- * <tr><td><pre> -r 10 </pre><td> Runs each test ten times.
- * <tr><td><pre> -d 10H </pre><td> Runs the test repeatedly for 10 hours.
- * <tr><td><pre> -d 1M, -r 10 </pre>
- * <td> Runs the test repeatedly for 1 minute but only takes a timing sample every 10 test runs.
- * <tr><td><pre> -r 10, -c [1:5:10:50], -s [100:1000:10000] </pre>
- * <td> Runs 12 test cycles (4 concurrency samples * 3 size sample), with 10 repeats each. In total the test
- * will be run 199 times (3 + 15 + 30 + 150)
- * <tr><td><pre> cache=true </pre><td> Passes the 'cache' parameter with value 'true' to the test.
- * <tr><td><pre> cache=[true:false] </pre><td> Runs the test with the 'cache' parameter set to 'true' and 'false'.
- * <tr><td><pre> cacheSize=[1000:1000000],samples=4,exp </pre>
- * <td> Runs the test with the 'cache' parameter set to a series of exponentially increasing sizes.
- * </table>
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create the test configuration specified by the command line parameters.
- * </table>
- *
- * @todo Verify that the output directory exists or can be created.
- *
- * @todo Verify that the specific named test case to execute exists.
- *
- * @todo Drop the delay parameter as it is being replaced by throttling.
- *
- * @todo Completely replace the test ui test runner, instead of having TKTestRunner inherit from it, its just not
- * good code to extend.
- *
- * @author Rupert Smith
- */
-public class TKTestRunner extends TestRunnerImprovedErrorHandling
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TKTestRunner.class);
-
- /** Used for displaying information on the console. */
- // private static final Logger console = Logger.getLogger("CONSOLE." + TKTestRunner.class.getName());
-
- /** Used for generating the timestamp when naming output files. */
- protected static final DateFormat TIME_STAMP_FORMAT = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss");
-
- /** Number of times to rerun the test. */
- protected Integer repetitions = 1;
-
- /** The length of time to run the tests for. */
- protected Long duration;
-
- /** Number of threads running the tests. */
- protected int[] threads;
-
- /** Delay in ms to wait between two test cases. */
- protected int delay = 0;
-
- /** The parameter values to pass to parameterized tests. */
- protected int[] params;
-
- /** Name of the single test case to execute. */
- protected String testCaseName = null;
-
- /** Name of the test class. */
- protected String testClassName = null;
-
- /** Name of the test run. */
- protected String testRunName = null;
-
- /** Directory to output XML reports into, if specified. */
- protected String reportDir = null;
-
- /** Flag that indicates the CSV results listener should be used to output results. */
- protected boolean csvResults;
-
- /** Flag that indiciates the XML results listener should be used to output results. */
- protected boolean xmlResults;
-
- /**
- * Holds the name of the class of the test currently being run. Ideally passed into the {@link #createTestResult}
- * method, but as the signature is already fixed for this, the current value gets pushed here as a member variable.
- */
- protected String currentTestClassName;
-
- /** Holds the test results object, which is reponsible for instrumenting tests/threads to record results. */
- protected TKTestResult result;
-
- /** Holds a list of factories for instantiating optional user specified test decorators. */
- protected List<TestDecoratorFactory> decoratorFactories;
-
- /**
- * Constructs a TKTestRunner using System.out for all the output.
- *
- * @param repetitions The number of times to repeat the test, or test batch size.
- * @param duration The length of time to run the tests for. -1 means no duration has been set.
- * @param threads The concurrency levels to ramp up to.
- * @param delay A delay in milliseconds between test runs.
- * @param params The sets of 'size' parameters to pass to test.
- * @param testCaseName The name of the test case to run.
- * @param reportDir The directory to output the test results to.
- * @param runName The name of the test run; used to name the output file.
- * @param csvResults <tt>true</tt> if the CSV results listener should be attached.
- * @param xmlResults <tt>true</tt> if the XML results listener should be attached.
- * @param decoratorFactories List of factories for user specified decorators.
- */
- public TKTestRunner(Integer repetitions, Long duration, int[] threads, int delay, int[] params, String testCaseName,
- String reportDir, String runName, boolean csvResults, boolean xmlResults,
- List<TestDecoratorFactory> decoratorFactories)
- {
- super(new NullResultPrinter(System.out));
-
- log.debug("public TKTestRunner(): called");
-
- // Keep all the test parameters.
- this.repetitions = repetitions;
- this.duration = duration;
- this.threads = threads;
- this.delay = delay;
- this.params = params;
- this.testCaseName = testCaseName;
- this.reportDir = reportDir;
- this.testRunName = runName;
- this.csvResults = csvResults;
- this.xmlResults = xmlResults;
- this.decoratorFactories = decoratorFactories;
- }
-
- /**
- * The entry point for the toolkit test runner.
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- // Use the command line parser to evaluate the command line.
- CommandLineParser commandLine =
- new CommandLineParser(
- new String[][]
- {
- { "w", "The number of milliseconds between invocations of test cases.", "ms", "false" },
- { "c", "The number of tests to run concurrently.", "num", "false", MathUtils.SEQUENCE_REGEXP },
- { "r", "The number of times to repeat each test.", "num", "false" },
- { "d", "The length of time to run the tests for.", "duration", "false", MathUtils.DURATION_REGEXP },
- { "f", "The maximum rate to call the tests at.", "frequency", "false", "^([1-9][0-9]*)/([1-9][0-9]*)$" },
- { "s", "The size parameter to run tests with.", "size", "false", MathUtils.SEQUENCE_REGEXP },
- { "t", "The name of the test case to execute.", "name", "false" },
- { "o", "The name of the directory to output test timings to.", "dir", "false" },
- { "n", "A name for this test run, used to name the output file.", "name", "true" },
- {
- "X:decorators", "A list of additional test decorators to wrap the tests in.",
- "\"class.name[:class.name]*\"", "false"
- },
- { "1", "Test class.", "class", "true" },
- { "-csv", "Output test results in CSV format.", null, "false" },
- { "-xml", "Output test results in XML format.", null, "false" }
- });
-
- // Capture the command line arguments or display errors and correct usage and then exit.
- ParsedProperties options = null;
-
- try
- {
- options = new ParsedProperties(commandLine.parseCommandLine(args));
- }
- catch (IllegalArgumentException e)
- {
- System.out.println(commandLine.getErrors());
- System.out.println(commandLine.getUsage());
- System.exit(FAILURE_EXIT);
- }
-
- // Extract the command line options.
- Integer delay = options.getPropertyAsInteger("w");
- String threadsString = options.getProperty("c");
- Integer repetitions = options.getPropertyAsInteger("r");
- String durationString = options.getProperty("d");
- String paramsString = options.getProperty("s");
- String testCaseName = options.getProperty("t");
- String reportDir = options.getProperty("o");
- String testRunName = options.getProperty("n");
- String decorators = options.getProperty("X:decorators");
- String testClassName = options.getProperty("1");
- boolean csvResults = options.getPropertyAsBoolean("-csv");
- boolean xmlResults = options.getPropertyAsBoolean("-xml");
-
- int[] threads = (threadsString == null) ? null : MathUtils.parseSequence(threadsString);
- int[] params = (paramsString == null) ? null : MathUtils.parseSequence(paramsString);
- Long duration = (durationString == null) ? null : MathUtils.parseDuration(durationString);
-
- // The test run name defaults to the test class name unless a value was specified for it.
- testRunName = (testRunName == null) ? testClassName : testRunName;
-
- // Add all the command line options and trailing settings to test context properties. Tests may pick up
- // overridden values from there, and these values will be logged in the test results, for analysis and
- // to make tests repeatable.
- commandLine.addTrailingPairsToProperties(TestContextProperties.getInstance());
- commandLine.addOptionsToProperties(TestContextProperties.getInstance());
-
- // Create and start the test runner.
- try
- {
- // Create a list of test decorator factories for use specified decorators to be applied.
- List<TestDecoratorFactory> decoratorFactories = parseDecorators(decorators);
-
- TKTestRunner testRunner =
- new TKTestRunner(repetitions, duration, threads, (delay == null) ? 0 : delay, params, testCaseName,
- reportDir, testRunName, csvResults, xmlResults, decoratorFactories);
-
- TestResult testResult = testRunner.start(testClassName);
-
- if (!testResult.wasSuccessful())
- {
- System.exit(FAILURE_EXIT);
- }
- }
- catch (Exception e)
- {
- System.err.println(e.getMessage());
- e.printStackTrace(new PrintStream(System.err));
- System.exit(EXCEPTION_EXIT);
- }
- }
-
- /**
- * Parses a list of test decorators, in the form "class.name[:class.name]*", and creates factories for those
- * TestDecorator classes , and returns a list of the factories. This list of factories will be in the same
- * order as specified in the string. The factories can be used to succesively wrap tests in layers of
- * decorators, as decorators themselves implement the 'Test' interface.
- *
- * <p/>If the string fails to parse, or if any of the decorators specified in it are cannot be loaded, or are not
- * TestDecorators, a runtime exception with a suitable error message will be thrown. The factories themselves
- * throw runtimes if the constructor method calls on the decorators fail.
- *
- * @param decorators The decorators list to be parsed.
- *
- * @return A list of instantiated decorators.
- */
- protected static List<TestDecoratorFactory> parseDecorators(String decorators)
- {
- List<TestDecoratorFactory> result = new LinkedList<TestDecoratorFactory>();
- String toParse = decorators;
-
- // Check that the decorators string is not null or empty, returning an empty list of decorator factories it
- // it is.
- if ((decorators == null) || "".equals(decorators))
- {
- return result;
- }
-
- // Strip any leading and trailing quotes from the string.
- if (toParse.charAt(0) == '\"')
- {
- toParse = toParse.substring(1, toParse.length() - 1);
- }
-
- if (toParse.charAt(toParse.length() - 1) == '\"')
- {
- toParse = toParse.substring(0, toParse.length() - 2);
- }
-
- // Instantiate all decorators.
- for (String decoratorClassName : toParse.split(":"))
- {
- try
- {
- Class decoratorClass = Class.forName(decoratorClassName);
- final Constructor decoratorConstructor = decoratorClass.getConstructor(WrappedSuiteTestDecorator.class);
-
- // Check that the decorator is an instance of WrappedSuiteTestDecorator.
- if (!WrappedSuiteTestDecorator.class.isAssignableFrom(decoratorClass))
- {
- throw new RuntimeException("The decorator class " + decoratorClassName
- + " is not a sub-class of WrappedSuiteTestDecorator, which it needs to be.");
- }
-
- result.add(new TestDecoratorFactory()
- {
- public WrappedSuiteTestDecorator decorateTest(Test test)
- {
- try
- {
- return (WrappedSuiteTestDecorator) decoratorConstructor.newInstance(test);
- }
- catch (InstantiationException e)
- {
- throw new RuntimeException(
- "The decorator class " + decoratorConstructor.getDeclaringClass().getName()
- + " cannot be instantiated.", e);
- }
- catch (IllegalAccessException e)
- {
- throw new RuntimeException(
- "The decorator class " + decoratorConstructor.getDeclaringClass().getName()
- + " does not have a publicly accessable constructor.", e);
- }
- catch (InvocationTargetException e)
- {
- throw new RuntimeException(
- "The decorator class " + decoratorConstructor.getDeclaringClass().getName()
- + " cannot be invoked.", e);
- }
- }
- });
- }
- catch (ClassNotFoundException e)
- {
- throw new RuntimeException("The decorator class " + decoratorClassName + " could not be found.", e);
- }
- catch (NoSuchMethodException e)
- {
- throw new RuntimeException("The decorator class " + decoratorClassName
- + " does not have a constructor that accepts a single 'WrappedSuiteTestDecorator' argument.", e);
- }
- }
-
- return result;
- }
-
- /**
- * TestDecoratorFactory is a factory for creating test decorators from tests.
- */
- protected interface TestDecoratorFactory
- {
- /**
- * Decorates the specified test with a new decorator.
- *
- * @param test The test to decorate.
- *
- * @return The decorated test.
- */
- public WrappedSuiteTestDecorator decorateTest(Test test);
- }
-
- /**
- * Runs a test or suite of tests, using the super class implemenation. This method wraps the test to be run
- * in any test decorators needed to add in the configured toolkits enhanced junit functionality.
- *
- * @param test The test to run.
- * @param wait Undocumented. Nothing in the JUnit javadocs to say what this is for.
- *
- * @return The results of the test run.
- */
- public TestResult doRun(Test test, boolean wait)
- {
- log.debug("public TestResult doRun(Test \"" + test + "\", boolean " + wait + "): called");
-
- // Wrap the tests in decorators for duration, scaling, repetition, parameterization etc.
- WrappedSuiteTestDecorator targetTest = decorateTests(test);
-
- // Delegate to the super method to run the decorated tests.
- log.debug("About to call super.doRun");
-
- TestResult result = super.doRun(targetTest, wait);
- log.debug("super.doRun returned.");
-
- /*if (result instanceof TKTestResult)
- {
- TKTestResult tkResult = (TKTestResult) result;
-
- tkResult.notifyEndBatch();
- }*/
-
- return result;
- }
-
- /**
- * Applies test decorators to the tests for parameterization, duration, scaling and repetition.
- *
- * @param test The test to decorat.
- *
- * @return The decorated test.
- */
- protected WrappedSuiteTestDecorator decorateTests(Test test)
- {
- log.debug("params = " + ((params == null) ? null : MathUtils.printArray(params)));
- log.debug("repetitions = " + repetitions);
- log.debug("threads = " + ((threads == null) ? null : MathUtils.printArray(threads)));
- log.debug("duration = " + duration);
-
- // Wrap all tests in the test suite with WrappedSuiteTestDecorators. This is quite ugly and a bit baffling,
- // but the reason it is done is because the JUnit implementation of TestDecorator has some bugs in it.
- WrappedSuiteTestDecorator targetTest = null;
-
- if (test instanceof TestSuite)
- {
- log.debug("targetTest is a TestSuite");
-
- TestSuite suite = (TestSuite) test;
-
- int numTests = suite.countTestCases();
- log.debug("There are " + numTests + " in the suite.");
-
- for (int i = 0; i < numTests; i++)
- {
- Test nextTest = suite.testAt(i);
- log.debug("suite.testAt(" + i + ") = " + nextTest);
-
- if (nextTest instanceof TimingControllerAware)
- {
- log.debug("nextTest is TimingControllerAware");
- }
-
- if (nextTest instanceof TestThreadAware)
- {
- log.debug("nextTest is TestThreadAware");
- }
- }
-
- targetTest = new WrappedSuiteTestDecorator(suite);
- log.debug("Wrapped with a WrappedSuiteTestDecorator.");
- }
- // If the test has already been wrapped, no need to do it again.
- else if (test instanceof WrappedSuiteTestDecorator)
- {
- targetTest = (WrappedSuiteTestDecorator) test;
- }
-
- // If size parameter values have been set, then wrap the test in an asymptotic test decorator.
- if (params != null)
- {
- targetTest = new AsymptoticTestDecorator(targetTest, params, (repetitions == null) ? 1 : repetitions);
- log.debug("Wrapped with asymptotic test decorator.");
- log.debug("targetTest = " + targetTest);
- }
-
- // If no size parameters are set but the repitions parameter is, then wrap the test in an asymptotic test decorator.
- else if ((repetitions != null) && (repetitions > 1))
- {
- targetTest = new AsymptoticTestDecorator(targetTest, new int[] { 1 }, repetitions);
- log.debug("Wrapped with asymptotic test decorator.");
- log.debug("targetTest = " + targetTest);
- }
-
- // Apply any optional user specified decorators.
- targetTest = applyOptionalUserDecorators(targetTest);
-
- // If a test run duration has been set then wrap the test in a duration test decorator. This will wrap on
- // top of size, repeat or concurrency wrappings already applied.
- if (duration != null)
- {
- DurationTestDecorator durationTest = new DurationTestDecorator(targetTest, duration);
- targetTest = durationTest;
-
- log.debug("Wrapped with duration test decorator.");
- log.debug("targetTest = " + targetTest);
-
- registerShutdownHook(durationTest);
- }
-
- // ParameterVariationTestDecorator...
-
- // If a test thread concurrency level is set then wrap the test in a scaled test decorator. This will wrap on
- // top of size scaling or repetition wrappings.
- ScaledTestDecorator scaledDecorator;
-
- if ((threads != null) && ((threads.length > 1) || (MathUtils.maxInArray(threads) > 1)))
- {
- scaledDecorator = new ScaledTestDecorator(targetTest, threads);
- targetTest = scaledDecorator;
- log.debug("Wrapped with scaled test decorator.");
- log.debug("targetTest = " + targetTest);
- }
- else
- {
- scaledDecorator = new ScaledTestDecorator(targetTest, new int[] { 1 });
- targetTest = scaledDecorator;
- log.debug("Wrapped with scaled test decorator with default of 1 thread.");
- log.debug("targetTest = " + targetTest);
- }
-
- // Register the scaled test decorators shutdown hook.
- registerShutdownHook(scaledDecorator);
-
- return targetTest;
- }
-
- /**
- * If there were any user specified test decorators on the command line, this method instantiates them and wraps
- * the test in them, from inner-most to outer-most in the order in which the decorators were supplied on the
- * command line.
- *
- * @param targetTest The test to wrap.
- *
- * @return A wrapped test.
- */
- protected WrappedSuiteTestDecorator applyOptionalUserDecorators(WrappedSuiteTestDecorator targetTest)
- {
- // If there are user defined test decorators apply them in order now.
- for (TestDecoratorFactory factory : decoratorFactories)
- {
- targetTest = factory.decorateTest(targetTest);
- }
-
- return targetTest;
- }
-
- /**
- * Creates the TestResult object to be used for test runs. See {@link TKTestResult} for more information and the
- * enhanced test result class that this uses.
- *
- * @return An instance of the enhanced test result object, {@link TKTestResult}.
- */
- protected TestResult createTestResult()
- {
- log.debug("protected TestResult createTestResult(): called");
-
- TKTestResult result = new TKTestResult(delay, testCaseName);
-
- // Check if a directory to output reports to has been specified and attach test listeners if so.
- if (reportDir != null)
- {
- // Create the report directory if it does not already exist.
- File reportDirFile = new File(reportDir);
-
- if (!reportDirFile.exists())
- {
- reportDirFile.mkdir();
- }
-
- // Create the results file (make the name of this configurable as a command line parameter).
- Writer timingsWriter;
-
- // Always set up a console feedback listener.
- ConsoleTestListener feedbackListener = new ConsoleTestListener();
- result.addListener(feedbackListener);
- result.addTKTestListener(feedbackListener);
-
- // Set up an XML results listener to output the timings to the results file, if requested on the command line.
- if (xmlResults)
- {
- try
- {
- File timingsFile = new File(reportDirFile, "TEST-" + currentTestClassName + ".xml");
- timingsWriter = new BufferedWriter(new FileWriter(timingsFile), 20000);
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to create the log file to write test results to: " + e, e);
- }
-
- XMLTestListener listener = new XMLTestListener(timingsWriter, currentTestClassName);
- result.addListener(listener);
- result.addTKTestListener(listener);
-
- registerShutdownHook(listener);
- }
-
- // Set up an CSV results listener to output the timings to the results file, if requested on the command line.
- if (csvResults)
- {
- try
- {
- File timingsFile =
- new File(reportDirFile, testRunName + "-" + TIME_STAMP_FORMAT.format(new Date()) + "-timings.csv");
- timingsWriter = new BufferedWriter(new FileWriter(timingsFile), 20000);
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to create the log file to write test results to: " + e, e);
- }
-
- CSVTestListener listener = new CSVTestListener(timingsWriter);
- result.addListener(listener);
- result.addTKTestListener(listener);
-
- // Register the results listeners shutdown hook to flush its data if the test framework is shutdown
- // prematurely.
- registerShutdownHook(listener);
- }
-
- // Register the results listeners shutdown hook to flush its data if the test framework is shutdown
- // prematurely.
- // registerShutdownHook(listener);
-
- // Record the start time of the batch.
- // result.notifyStartBatch();
-
- // At this point in time the test class has been instantiated, giving it an opportunity to read its parameters.
- // Inform any test listers of the test properties.
- result.notifyTestProperties(TestContextProperties.getAccessedProps());
- }
-
- return result;
- }
-
- /**
- * Registers the shutdown hook of a {@link ShutdownHookable}.
- *
- * @param hookable The hookable to register.
- */
- protected void registerShutdownHook(ShutdownHookable hookable)
- {
- Runtime.getRuntime().addShutdownHook(hookable.getShutdownHook());
- }
-
- /**
- * Initializes the test runner with the provided command line arguments and and starts the test run.
- *
- * @param testClassName The fully qualified name of the test class to run.
- *
- * @return The test results.
- *
- * @throws Exception Any exceptions from running the tests are allowed to fall through.
- */
- protected TestResult start(String testClassName) throws Exception
- {
- // Record the current test class, so that the test results can be output to a file incorporating this name.
- this.currentTestClassName = testClassName;
-
- // Delegate to the super method to run the tests.
- return super.start(new String[] { testClassName });
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestRunnerImprovedErrorHandling.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestRunnerImprovedErrorHandling.java
deleted file mode 100644
index c68405bd06..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestRunnerImprovedErrorHandling.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-
-import junit.runner.Version;
-
-import junit.textui.ResultPrinter;
-import junit.textui.TestRunner;
-
-import org.apache.log4j.Logger;
-
-import java.io.PrintStream;
-
-/**
- * The {@link junit.textui.TestRunner} does not provide very good error handling. It does not wrap exceptions and
- * does not print out stack traces, losing valuable error tracing information. This class overrides methods in it
- * in order to improve their error handling. The {@link TKTestRunner} is then built on top of this.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * </table>
- *
- * @author Rupert Smith
- */
-public class TestRunnerImprovedErrorHandling extends TestRunner
-{
- /** Used for logging. */
- Logger log = Logger.getLogger(TestRunnerImprovedErrorHandling.class);
-
- /**
- * Delegates to the super constructor.
- */
- public TestRunnerImprovedErrorHandling()
- {
- super();
- }
-
- /**
- * Delegates to the super constructor.
- *
- * @param printStream The location to write test results to.
- */
- public TestRunnerImprovedErrorHandling(PrintStream printStream)
- {
- super(printStream);
- }
-
- /**
- * Delegates to the super constructor.
- *
- * @param resultPrinter The location to write test results to.
- */
- public TestRunnerImprovedErrorHandling(ResultPrinter resultPrinter)
- {
- super(resultPrinter);
- }
-
- /**
- * Starts a test run. Analyzes the command line arguments
- * and runs the given test suite.
- *
- * @param args The command line arguments.
- *
- * @return The test results.
- *
- * @throws Exception Any exceptions falling through the tests are wrapped in Exception and rethrown.
- */
- public TestResult start(String[] args) throws Exception
- {
- String testCase = "";
- boolean wait = false;
-
- for (int i = 0; i < args.length; i++)
- {
- if (args[i].equals("-wait"))
- {
- wait = true;
- }
- else if (args[i].equals("-c"))
- {
- testCase = extractClassName(args[++i]);
- }
- else if (args[i].equals("-v"))
- {
- System.err.println("JUnit " + Version.id() + " by Kent Beck and Erich Gamma");
- }
- else
- {
- testCase = args[i];
- }
- }
-
- if (testCase.equals(""))
- {
- throw new Exception("Usage: TestRunner [-wait] testCaseName, where name is the name of the TestCase class");
- }
-
- try
- {
- Test suite = getTest(testCase);
-
- return doRun(suite, wait);
- }
- catch (Exception e)
- {
- log.warn("Got exception whilst creating and running test suite.", e);
- throw new Exception("Could not create and run the test suite.", e);
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestThreadAware.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestThreadAware.java
deleted file mode 100644
index 94dcf5499b..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TestThreadAware.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * This interface can be implemented by tests that want to know if they are being run concurrently. It provides
- * lifecycle notification events to tell the test implementation when test threads are being created and destroyed.
- * This can assist tests in creating and destroying resources that exist over the life of a test thread. A single
- * test thread can excute the same test many times, and often it is convenient to keep resources, for example network
- * connections, open over many test calls.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Set up per thread test fixtures.
- * <tr><td> Clean up per thread test fixtures.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface TestThreadAware
-{
- /**
- * Called when a test thread is created.
- */
- public void threadSetUp();
-
- /**
- * Called after all threads have completed their setup.
- */
- public void postThreadSetUp();
-
- /**
- * Called when a test thread is destroyed.
- */
- public void threadTearDown();
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/Throttle.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/Throttle.java
deleted file mode 100644
index 1ea8e8e2be..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/Throttle.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * Throttle is an interface that supplies a {@link #throttle} method, that can only be called at the rate specified
- * in a call to the {@link #setRate} method. This can be used to restict processing to run at a certain number
- * of operations per second.
- *
- * <p/>Throttle also supplies a method to check the throttle rate, without waiting. This could be used to update a user
- * interface every time an event occurs, but only up to a maximum rate. For example, as elements are added to a list,
- * a count of elements is updated for the user to see, but only up to a maximum rate of ten updates a second, as updating
- * faster than that slows the processing of element-by-element additions to the list unnecessarily.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Accept throttling rate in operations per second.
- * <tr><td> Inject short pauses to fill-out processing cycles to a specified rate.
- * <tr><td> Check against a throttle speed without waiting.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface Throttle
-{
- /**
- * Specifies the throttling rate in operations per second. This must be called with with a value, the inverse
- * of which is a measurement in nano seconds, such that the number of nano seconds do not overflow a long integer.
- * The value must also be larger than zero.
- *
- * @param hertz The throttling rate in cycles per second.
- */
- public void setRate(float hertz);
-
- /**
- * This method can only be called at the rate set by the {@link #setRate} method, if it is called faster than this
- * it will inject short pauses to restrict the call rate to that rate.
- *
- * <p/>If the thread executing this method is interrupted, it must ensure that the threads interrupt thread
- * remains set upon exit from the method. This method does not expose InterruptedException, to indicate interruption
- * of the throttle during a timed wait. It may be changed so that it does.
- */
- public void throttle();
-
- /**
- * Checks but does not enforce the throttle rate. When this method is called, it checks if a length of time greater
- * than that equal to the inverse of the throttling rate has passed since it was last called and returned <tt>true</tt>
- *
- * @return <tt>true</tt> if a length of time greater than that equal to the inverse of the throttling rate has
- * passed since this method was last called and returned <tt>true</tt>, <tt>false</tt> otherwise. The very
- * first time this method is called on a throttle, it returns <tt>true</tt> as the base case to the above
- * self-referential definition.
- */
- public boolean checkThrottle();
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingController.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingController.java
deleted file mode 100644
index 27e43a10a4..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingController.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * A TimingController is a interface that a test that is aware of the fact that it is being timed can use to manage
- * the timer. Using this interface tests can suspend and resume test timers. This is usefull if you want to exclude
- * some expensive preparation from being timed as part of a test. In general when timing tests to measure the
- * performance of code, you should try to set up data in the #setUp where possible, or as static members in the test
- * class. This is not always convenient, this interface gives you a way to suspend and resume, or event completely
- * restart test timers, to get accurate measurements.
- *
- * <p/>The interface can also be used to register multiple test pass/fails and timings from a single test method.
- * In some cases it is easier to write tests in this way. For example a concurrent and asynchronous test may make
- * many asynchronous requests and then wait for replies to all its requests. Writing such a test with one send/reply
- * per test method and trying to scale up using many threads will quickly run into limitations if more than about
- * 100 asynchronous calls need to be made at once. A better way to write such a test is as a single method that sends
- * many (perhaps thousands or millions) and waits for replies in two threads, one for send, one for replies. It can
- * then log pass/fails and timings on each individual reply as they come back in, even though the test has been written
- * to send thousands of requests per test method in order to do volume testing.
- *
- * <p/>If when the {@link #completeTest(boolean)} is called, the test runner decides that testing should stop (perhaps
- * because a duration test has expired), it throws an InterruptedException to indicate that the test method should stop
- * immediately. The test method can do this by allowing this exception to fall through, if no other clean-up handling
- * is necessary, or it can simply return as soon as it possibly can. The test runner will still call the tearDown
- * method in the usual way when this happens.
- *
- * <p/>Below are some examples of how this can be used. Not how checking that the timing controller is really available
- * rather than assuming it is, means that the test can run as an ordinary JUnit test under the default test runners. In
- * general code should be written to take advantage of the extended capabilities of junit toolkit, without assuming they
- * are going to be run under its test runner.
- *
- * <pre>
- * public class MyTest extends TestCase implements TimingControllerAware {
- * ...
- *
- * timingUtils = this.getTimingController();
- *
- * // Do expensive data preparation here...
- *
- * if (timingUtils != null)
- * timingUtils.restart();
- * </pre>
- *
- * <pre>
- * public class MyTest extends TestCase implements TimingControllerAware {
- * ...
- *
- * public void myVolumeTest(int size) {
- *
- * timingUtils = this.getTimingController();
- *
- * boolean stopNow = false;
- *
- * // In Sender thread.
- * for(int i = 0; !stopNow && i < size; i++)
- * // Send request i.
- * ...
- *
- * // In Receiver thread.
- * onReceive(Object o) {
- * try {
- * // Check o is as expected.
- * if (....)
- * {
- * if (timingUtils != null)
- * timingUtils.completeTest(true);
- * }
- * else
- * {
- * if (timingUtils != null)
- * timingUtils.completeTest(false);
- * }
- * } catch (InterruptedException e) {
- * stopNow = true;
- * return;
- * }
- * }
- * </pre>
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Allow test timers to be suspended, restarted or reset.
- * <tr><td> Allow tests to register multiple pass/fails and timings.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface TimingController
-{
- /**
- * Gets the timing controller associated with the current test thread. Tests that use timing controller should
- * always get the timing controller from this method in the same thread that called the setUp, tearDown or test
- * method. The controller returned by this method may be called from any thread because it remembers the thread
- * id of the original test thread.
- *
- * @return The timing controller associated with the current test thread.
- */
- public TimingController getControllerForCurrentThread();
-
- /**
- * Suspends the test timer.
- *
- * @return The current time in nanoseconds.
- */
- public long suspend();
-
- /**
- * Allows the test timer to continue running after a suspend.
- *
- * @return The current time in nanoseconds.
- */
- public long resume();
-
- /**
- * Completely restarts the test timer from zero.
- *
- * @return The current time in nanoseconds.
- */
- public long restart();
-
- /**
- * Register an additional pass/fail for the current test. The test result is assumed to apply to a test of
- * 'size' parmeter 1. Use the {@link #completeTest(boolean, int)} method to register timings with parameters.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed) throws InterruptedException;
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param) throws InterruptedException;
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter and allows the caller to sepecify the timing to log.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- * @param timeNanos The time in nano seconds to log the test result with.
- *
- * A null value for timeNanos is a request to this method that it should
- * calculate the time for the given test run.
- *
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param, Long timeNanos) throws InterruptedException;
-
- /**
- * Register an additional pass/fail for the current test. The test result is applies to a test of the specified
- * 'size' parmeter and allows the caller to sepecify the timing to log.
- *
- * @param testPassed Whether or not this timing is for a test pass or fail.
- * @param param The test parameter size for parameterized tests.
- * @param timeNanos The time in nano seconds to log the test result with.
- *
- * A null value for timeNanos is a request to this method that it should
- * calculate the time for the given test run.
- * A null value for timeNanos2 means this test does not provide a second
- * timing value so a '-' is printed in the log.
- *
- *
- * @throws InterruptedException If the test runner decides that testing should stop it throws this exception to
- * indicate to the test method that it should stop immediately.
- */
- public void completeTest(boolean testPassed, int param, Long timeNanos, Long time2Nanos) throws InterruptedException;
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingControllerAware.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingControllerAware.java
deleted file mode 100644
index 11db87e073..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/TimingControllerAware.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-/**
- * TimingControllerAware is an interface that tests that manipulate the timing controller should implement. It enables
- * the TK test runner to set the test up with a handle on the timing controller which the test can use to call back
- * to the test runner to manage the timers.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide timing controller insertion point for tests.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface TimingControllerAware
-{
- /**
- * Used by test runners that can supply a {@link TimingController} to set the controller on an aware test.
- *
- * @param controller The timing controller.
- */
- public void setTimingController(TimingController controller);
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/WrappedSuiteTestDecorator.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/WrappedSuiteTestDecorator.java
deleted file mode 100644
index d5690fc24a..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/WrappedSuiteTestDecorator.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions;
-
-import junit.extensions.TestDecorator;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * WrappedSuiteTestDecorator is a test decorator that wraps a test suite, or another wrapped suite, but provides the
- * same functionality for the {@link junit.extensions.TestDecorator#countTestCases()} and {@link TestSuite#testAt(int)}
- * methods as the underlying suite. It returns the values that these methods provide, to enable classes using decorated
- * tests to drill down to the underlying tests in the suite. That is to say that it indexes and reports the number of
- * distinct tests in the suite, not the number of test runs that would result from, for example, wrapping the suite in a
- * repeating decorator.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide access to the underlying tests in a suite.
- * </table>
- *
- * @author Rupert Smith
- */
-public class WrappedSuiteTestDecorator extends TestDecorator
-{
- /** Used for logging. */
- private static Logger log = Logger.getLogger(WrappedSuiteTestDecorator.class);
-
- /** Holds the test suite that this supplies access to. */
- protected Test suite;
-
- /**
- * Creates a wrappred suite test decorator from a test suite.
- *
- * @param suite The test suite.
- */
- public WrappedSuiteTestDecorator(TestSuite suite)
- {
- super(suite);
- this.suite = suite;
- }
-
- /**
- * Creates a wrapped suite test decorator from another one.
- *
- * @param suite The test suite.
- */
- public WrappedSuiteTestDecorator(WrappedSuiteTestDecorator suite)
- {
- super(suite);
- this.suite = suite;
- }
-
- /**
- * Returns the test count of the wrapped suite.
- *
- * @return The test count of the wrapped suite.
- */
- public int countTestCases()
- {
- return suite.countTestCases();
- }
-
- /**
- * Gets the ith test from the test suite.
- *
- * @param i The index of the test within the suite to get.
- *
- * @return The test with the specified index.
- */
- public Test testAt(int i)
- {
- log.debug("public Test testAt(int i = " + i + "): called");
-
- if (suite instanceof WrappedSuiteTestDecorator)
- {
- return ((WrappedSuiteTestDecorator) suite).testAt(i);
- }
- else if (suite instanceof TestSuite)
- {
- return ((TestSuite) suite).testAt(i);
- }
-
- // This should never happen.
- return null;
- }
-
- /**
- * Gets all the tests from the underlying test suite.
- *
- * @return All the tests from the underlying test suite.
- */
- public Collection<Test> getAllUnderlyingTests()
- {
- log.debug("public Collection<Test> getAllUnderlyingTests(): called");
-
- List<Test> tests = new ArrayList<Test>();
-
- int numTests = countTestCases();
- log.debug("numTests = " + numTests);
-
- for (int i = 0; i < numTests; i++)
- {
- tests.add(testAt(i));
- }
-
- return tests;
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/CSVTestListener.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/CSVTestListener.java
deleted file mode 100644
index 40841189a3..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/CSVTestListener.java
+++ /dev/null
@@ -1,572 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.listeners;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestListener;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.ShutdownHookable;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * CSVTestListener is both a test listener, a timings listener, a memory listener and a parameter listener. It listens for test completion events and
- * then writes out all the data that it has listened to into a '.csv' (comma seperated values) file.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Listen to test events; start, end, fail, error.
- * <tr><td> Listen to test timings.
- * <tr><td> Listen to test memory usage.
- * <tr><td> Listen to parameterized test parameters.
- * <tr><td> Output all test data to a CSV file.
- * </table>
- *
- * @author Rupert Smith
- *
- * @todo Write an XML output class. Write a transform to convert it into an HTML page with timings as graphs.
- */
-public class CSVTestListener implements TestListener, TKTestListener, ShutdownHookable
-{
- /** Used for logging. */
- private static final Logger log = Logger.getLogger(CSVTestListener.class);
-
- /** The timings file writer. */
- private Writer timingsWriter;
-
- /**
- * Map for holding results on a per thread basis as they come in. A ThreadLocal is not used as sometimes an
- * explicit thread id must be used, where notifications come from different threads than the ones that called
- * the test method.
- */
- Map<Long, TestResult> threadLocalResults = Collections.synchronizedMap(new HashMap<Long, TestResult>());
-
- /** Used to record the start time of a complete test run, for outputing statistics at the end of the test run. */
- private long batchStartTime;
-
- /** Used to record the number of errors accross a complete test run. */
- private int numError;
-
- /** Used to record the number of failures accross a complete test run. */
- private int numFailed;
-
- /** Used to record the number of passes accross a complete test run. */
- private int numPassed;
-
- /** Used to record the total tests run accross a complete test run. Always equal to passes + errors + fails. */
- private int totalTests;
-
- /** Used to recrod the current concurrency level for the test batch. */
- private int concurrencyLevel;
-
- /**
- * Used to record the total 'size' of the tests run, this is the number run times the average value of the test
- * size parameters.
- */
- private int totalSize;
-
- /**
- * Used to record the summation of all of the individual test timings. Note that total time and summed time
- * are unlikely to be in agreement, exception for a single threaded test (with no setup time). Total time is
- * the time taken to run all the tests, summed time is the added up time that each individual test took. So if
- * two tests run in parallel and take one second each, total time will be one seconds, summed time will be two
- * seconds.
- */
- private long summedTime;
-
- /**
- * Used to record the summation of all of the second test timing information.
- * One use of the second timing would be to provide latency as well as test timing.
- */
- private long summedTime2;
-
- /** Flag to indicate when batch has been started but not ended to ensure end batch stats are output only once. */
- private boolean batchStarted = false;
-
- /**
- * Creates a new CSVTestListener object.
- *
- * @param writer A writer where this CSV listener should write out its output to.
- */
- public CSVTestListener(Writer writer)
- {
- // log.debug("public CSVTestListener(Writer writer): called");
-
- // Keep the writer.
- this.timingsWriter = writer;
- }
-
- /**
- * Resets the test results to the default state of time zero, memory usage zero, test passed.
- *
- * @param test The test to resest any results for.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void reset(Test test, Long threadId)
- {
- // log.debug("public void reset(Test test = \"" + test + "\", Long threadId = " + threadId + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testTime = 0L;
- r.testTime2 = null;
- r.testStartMem = 0L;
- r.testEndMem = 0L;
- r.testState = "Pass";
- r.testParam = 0;
- }
-
- /**
- * Called when a test results in an error.
- *
- * @param test The test which is in error.
- * @param t Any Throwable raised by the test in error.
- */
- public void addError(Test test, Throwable t)
- {
- // log.debug("public void addError(Test test, Throwable t): called");
-
- TestResult r = threadLocalResults.get(Thread.currentThread().getId());
- r.testState = "Error";
- }
-
- /**
- * Called when a test results in a failure.
- *
- * @param test The test which failed.
- * @param t The AssertionFailedError that encapsulates the test failure.
- */
- public void addFailure(Test test, AssertionFailedError t)
- {
- // log.debug("public void addFailure(Test \"" + test + "\", AssertionFailedError t): called");
-
- TestResult r = threadLocalResults.get(Thread.currentThread().getId());
- r.testState = "Failure";
- }
-
- /**
- * Called when a test completes to mark it as a test fail. This method should be used when registering a
- * failure from a different thread than the one that started the test.
- *
- * @param test The test which failed.
- * @param e The assertion that failed the test.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void addFailure(Test test, AssertionFailedError e, Long threadId)
- {
- // log.debug("public void addFailure(Test test = \"" + test + "\", AssertionFailedError e, Long threadId = " + threadId
- // + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testState = "Failure";
- }
-
- /**
- * Called when a test completes. Success, failure and errors.
- *
- * @param test The test which completed.
- */
- public void endTest(Test test)
- {
- // log.debug("public void endTest(Test \"" + test + "\"): called");
-
- TestResult r = threadLocalResults.get(Thread.currentThread().getId());
-
- writeTestResults(r, test);
-
- // Clear all the test results for the thread.
- threadLocalResults.remove(Thread.currentThread().getId());
- }
-
- /**
- * Called when a test starts.
- *
- * @param test The test wich has started.
- */
- public void startTest(Test test)
- {
- // log.debug("public void startTest(Test \"" + test + "\"): called");
-
- // Initialize the thread local test results.
- threadLocalResults.put(Thread.currentThread().getId(), new TestResult());
- }
-
- /**
- * Should be called every time a test completes with the run time of that test.
- *
- * @param test The name of the test.
- * @param nanos The run time of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing(Test test, long nanos, Long threadId)
- {
- // log.debug("public void timing(String \"" + test + "\", long " + nanos + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testTime = nanos;
- summedTime += nanos;
- }
-
- /**
- * Optionally called every time a test completes with the second timing test.
- *
- * @param test The name of the test.
- * @param nanos The second timing information of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing2(Test test, Long nanos, Long threadId)
- {
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
-
- if (nanos != null)
- {
- r.testTime2 = nanos;
- summedTime2 += nanos;
- }
- }
-
- /**
- * Should be called every time a test completed with the amount of memory used before and after the test was run.
- *
- * @param test The test which memory was measured for.
- * @param memStart The total JVM memory used before the test was run.
- * @param memEnd The total JVM memory used after the test was run.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void memoryUsed(Test test, long memStart, long memEnd, Long threadId)
- {
- // log.debug("public void memoryUsed(Test \"" + test + "\", long " + memStart + ", long " + memEnd + ", Long "
- // + threadId + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testStartMem = memStart;
- r.testEndMem = memEnd;
- }
-
- /**
- * Should be called every time a parameterized test completed with the int value of its test parameter.
- *
- * @param test The test which memory was measured for.
- * @param parameter The int parameter value.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void parameterValue(Test test, int parameter, Long threadId)
- {
- // log.debug("public void parameterValue(Test test = \"" + test + "\", int parameter = " + parameter + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testParam = parameter;
- totalSize += parameter;
- }
-
- /**
- * Should be called every time a test completes with the current number of test threads running. This should not
- * change within a test batch, therefore it is safe to take this as a batch level property value too.
- *
- * @param test The test for which the measurement is being generated.
- * @param threads The number of tests being run concurrently.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void concurrencyLevel(Test test, int threads, Long threadId)
- {
- // log.debug("public void concurrencyLevel(Test test = \"" + test + "\", int threads = " + threads + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.testConcurrency = threads;
- concurrencyLevel = threads;
-
- }
-
- /**
- * Called when a test completes. Success, failure and errors. This method should be used when registering an
- * end test from a different thread than the one that started the test.
- *
- * @param test The test which completed.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void endTest(Test test, Long threadId)
- {
- // log.debug("public void endTest(Test test = \"" + test + "\", Long threadId " + threadId + "): called");
-
- TestResult r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- writeTestResults(r, test);
- }
-
- /**
- * Takes a time stamp for the beginning of the batch and resets stats counted for the batch.
- */
- public synchronized void startBatch()
- {
- numError = 0;
- numFailed = 0;
- numPassed = 0;
- totalTests = 0;
- totalSize = 0;
- batchStartTime = System.nanoTime();
- summedTime = 0;
- summedTime2 = 0;
- batchStarted = true;
-
- // Write out the column headers for the batch.
- writeColumnHeaders();
- }
-
- /**
- * Takes a time stamp for the end of the batch to calculate the total run time.
- * Write this and other stats out to the tail of the csv file.
- *
- * @param parameters The optional test parameters, may be null.
- */
- public synchronized void endBatch(Properties parameters)
- {
- boolean noParams = (parameters == null) || (parameters.size() == 0);
-
- // Check that a batch has been started but not ended.
- if (batchStarted)
- {
- long batchEndTime = System.nanoTime();
- float totalTimeMillis = ((float) (batchEndTime - batchStartTime)) / 1000000f;
- float summedTimeMillis = ((float) summedTime) / 1000000f;
- float summedTime2Millis = ((float) summedTime2) / 1000000f;
-
-
- // Write the stats for the batch out.
- try
- {
- synchronized (this.getClass())
- {
- timingsWriter.write("Total Tests:, " + totalTests + ", ");
- timingsWriter.write("Total Passed:, " + numPassed + ", ");
- timingsWriter.write("Total Failed:, " + numFailed + ", ");
- timingsWriter.write("Total Error:, " + numError + ", ");
- timingsWriter.write("Total Size:, " + totalSize + ", ");
- timingsWriter.write("Summed Time:, " + summedTimeMillis + ", ");
- timingsWriter.write("Summed Custom Time:, " + summedTime2Millis + ", ");
- timingsWriter.write("Concurrency Level:, " + concurrencyLevel + ", ");
- timingsWriter.write("Total Time:, " + totalTimeMillis + ", ");
- timingsWriter.write("Average Custom Time:, " + ((summedTime2Millis/ (float) totalTests)) + ", ");
- timingsWriter.write("Test Throughput:, " + (((float) totalTests) / totalTimeMillis) + ", ");
- timingsWriter.write("Test * Size Throughput:, " + (((float) totalSize) / totalTimeMillis)
- + (noParams ? "\n\n" : ", "));
-
- // Write out the test parameters if there are any specified.
- if (!noParams)
- {
- properties(parameters);
- }
-
- timingsWriter.flush();
- }
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write out end batch statistics: " + e, e);
- }
- }
-
- // Reset the batch started flag to ensure stats are only output once.
- batchStarted = false;
- }
-
- /**
- * Notifies listeners of the tests read/set properties.
- *
- * @param properties The tests read/set properties.
- */
- public void properties(Properties properties)
- {
- // log.debug("public void properties(Properties properties): called");
-
- // Write the properties out to the results file.
- try
- {
- synchronized (this.getClass())
- {
- Set keySet = new TreeSet(properties.keySet());
-
- // timingsWriter.write("\n");
-
- for (Object key : keySet)
- {
- timingsWriter.write(key + " = , " + properties.getProperty((String) key) + ", ");
- }
-
- timingsWriter.write("\n\n");
- // timingsWriter.flush();
- }
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write out test parameters: " + e, e);
- }
-
- // Write out the column headers after the properties.
- // writeColumnHeaders();
- }
-
- /**
- * Writes out and flushes the column headers for raw test data.
- */
- private void writeColumnHeaders()
- {
- // Write the column headers for the CSV file. Any IO exceptions are ignored.
- try
- {
- timingsWriter.write("Class, ");
- timingsWriter.write("Method, ");
- timingsWriter.write("Thread, ");
- timingsWriter.write("Test Outcome, ");
- timingsWriter.write("Time (milliseconds), ");
- timingsWriter.write("Custom Time (milliseconds), ");
- timingsWriter.write("Memory Used (bytes), ");
- timingsWriter.write("Concurrency level, ");
- timingsWriter.write("Test Size\n");
-
- timingsWriter.flush();
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write out column headers: " + e, e);
- }
- }
-
- /**
- * Writes out the test results for the specified test. This outputs a single line of results to the csv file.
- *
- * @param r The test results to write out.
- * @param test The test to write them out for.
- */
- private void writeTestResults(TestResult r, Test test)
- {
- // Update the running stats for this batch.
- if ("Error".equals(r.testState))
- {
- numError++;
- }
- else if ("Failure".equals(r.testState))
- {
- numFailed++;
- }
- else if ("Pass".equals(r.testState))
- {
- numPassed++;
- }
-
- totalTests++;
-
- // Write the test name and thread information plus all instrumenation a line of the CSV ouput. Any IO
- // exceptions are ignored.
- try
- {
- synchronized (this.getClass())
- {
- timingsWriter.write(test.getClass().getName() + ", ");
- timingsWriter.write(((test instanceof TestCase) ? ((TestCase) test).getName() : "") + ", ");
- timingsWriter.write(Thread.currentThread().getName() + ", ");
- timingsWriter.write(r.testState + ", ");
- timingsWriter.write((((float) r.testTime) / 1000000f) + ", ");
-
- timingsWriter.write(r.testTime2 == null ? "- , " :
- (((float) r.testTime2) / 1000000f) + ", ");
- timingsWriter.write((r.testEndMem - r.testStartMem) + ", ");
- timingsWriter.write(r.testConcurrency + ", ");
- timingsWriter.write(r.testParam + "\n");
- }
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write out test results: " + e, e);
- }
- }
-
- /**
- * Supplies the shutdown hook. This attempts to flush the results in the event of the test runner being prematurely
- * suspended before the end of the current test batch.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- log.debug("CSVTestListener::ShutdownHook: called");
-
- // Complete the current test batch stats.
- endBatch(TestContextProperties.getInstance());
- }
- });
- }
-
- /** Captures test results packaged into a single object, so that it can be set up as a thread local. */
- private static class TestResult
- {
- /** Used to hold the test timing. */
- public long testTime;
-
- /** Use to hold the second timing information. */
- public Long testTime2;
-
- /** Used to hold the test start memory usage. */
- public long testStartMem;
-
- /** Used to hold the test end memory usage. */
- public long testEndMem;
-
- /** Used to hold the test pass/fail/error state. */
- public String testState = "Pass";
-
- /** Used to hold the test parameter value. */
- public int testParam;
-
- /** Used to hold the concurrency level under which the test was run. */
- public int testConcurrency;
-
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/ConsoleTestListener.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/ConsoleTestListener.java
deleted file mode 100644
index 276fec328e..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/ConsoleTestListener.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.listeners;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestListener;
-
-import org.apache.qpid.junit.extensions.SleepThrottle;
-import org.apache.qpid.junit.extensions.Throttle;
-
-import java.util.Properties;
-
-/**
- * ConsoleTestListener provides feedback to the console, as test timings are taken, by drawing a '.', or an 'E', or an
- * 'F', for each test that passes, is in error or fails. It does this for every test result registered with the framework,
- * not just on the completion of each test method as the JUnit one does. It also uses a throttle to cap the rate of
- * dot drawing, as exessively high rates can degrade test performance without providing much usefull feedback to the user.
- * Unlike the JUnit dot drawing feedback, this one will correctly wrap lines when tests are run concurrently (the
- * rate capping ensures that this does not become a hot-spot for thread contention).
- *
- * <p/>Where rate capping causes the conflation of multiple requested dots into a single dot, the dot that is actually
- * drawn will be the worst result within the conflation period, that is, error is worse than fail which is worse than pass.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Draw dots as each test result completes, at a capped rate.
- * </table>
- *
- * @author Rupert Smith
- */
-public class ConsoleTestListener implements TestListener, TKTestListener
-{
- /** Used to indicate a test pass. */
- private static final int PASS = 1;
-
- /** Used to indicate a test failure. */
- private static final int FAIL = 2;
-
- /** Used to indicate a test error. */
- private static final int ERROR = 3;
-
- /** Defines the maximum number of columns of dots to print. */
- private static final int MAX_COLUMNS = 80;
-
- /** Used to throttle the dot writing rate. */
- Throttle throttle;
-
- /** Tracks the worst test result so far, when the throttled print method must conflate results due to throttling. */
- private int conflatedResult = 0;
-
- /** Tracks the column count as dots are printed, so that newlines can be inserted at the right margin. */
- private int columnCount = 0;
-
- /** Used as a monitor on the print method criticial section, to ensure that line ends always happen in the right place. */
- private final Object printMonitor = new Object();
-
- /**
- * Creates a dot drawing feedback test listener, set by default to 80 columns at 80 dots per second capped rate.
- */
- public ConsoleTestListener()
- {
- throttle = new SleepThrottle();
- throttle.setRate(80f);
- }
-
- /**
- * Prints dots at a capped rate, conflating the requested type of dot to draw if this method is called at a rate
- * higher than the capped rate. The conflation works by always printing the worst result that occurs within the
- * conflation period, that is, error is worse than fail which is worse than a pass.
- *
- * @param result The type of dot to draw, {@link #PASS}, {@link #FAIL} or {@link #ERROR}.
- */
- private void throttledPrint(int result)
- {
- conflatedResult = (result > conflatedResult) ? result : conflatedResult;
-
- if (throttle.checkThrottle())
- {
- synchronized (printMonitor)
- {
- switch (conflatedResult)
- {
- default:
- case PASS:
- System.out.print('.');
- break;
-
- case FAIL:
- System.out.print('F');
- break;
-
- case ERROR:
- System.out.print('E');
- break;
- }
-
- columnCount = (columnCount >= MAX_COLUMNS) ? 0 : (columnCount + 1);
-
- if (columnCount == 0)
- {
- System.out.print('\n');
- }
-
- conflatedResult = 0;
- }
- }
- }
-
- /**
- * An error occurred.
- *
- * @param test The test in error. Ignored.
- * @param t The error that the test threw. Ignored.
- */
- public void addError(Test test, Throwable t)
- {
- throttledPrint(ERROR);
- }
-
- /**
- * A failure occurred.
- *
- * @param test The test that failed. Ignored.
- * @param t The assertion failure that the test threw. Ignored.
- */
- public void addFailure(Test test, AssertionFailedError t)
- {
- throttledPrint(FAIL);
- }
-
- /**
- * A test ended.
- *
- * @param test The test that ended. Ignored.
- */
- public void endTest(Test test)
- {
- throttledPrint(PASS);
- }
-
- /**
- * A test started.
- *
- * @param test The test that started. Ignored.
- */
- public void startTest(Test test)
- { }
-
- /**
- * Resets the test results to the default state of time zero, memory usage zero, parameter zero, test passed.
- *
- * @param test The test to resest any results for.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void reset(Test test, Long threadId)
- { }
-
- /**
- * Should be called every time a test completes with the run time of that test.
- *
- * @param test The name of the test.
- * @param nanos The run time of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing(Test test, long nanos, Long threadId)
- { }
-
- /**
- * Optionally called every time a test completes with the second timing test.
- *
- * @param test The name of the test.
- * @param nanos The second timing information of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing2(Test test, Long nanos, Long threadId)
- { }
-
- /**
- * Should be called every time a test completed with the amount of memory used before and after the test was run.
- *
- * @param test The test which memory was measured for.
- * @param memStart The total JVM memory used before the test was run.
- * @param memEnd The total JVM memory used after the test was run.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void memoryUsed(Test test, long memStart, long memEnd, Long threadId)
- { }
-
- /**
- * Should be called every time a parameterized test completed with the int value of its test parameter.
- *
- * @param test The test which memory was measured for.
- * @param parameter The int parameter value.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void parameterValue(Test test, int parameter, Long threadId)
- { }
-
- /**
- * Should be called every time a test completes with the current number of test threads running.
- *
- * @param test The test for which the measurement is being generated.
- * @param threads The number of tests being run concurrently.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void concurrencyLevel(Test test, int threads, Long threadId)
- { }
-
- /**
- * Called when a test completes. Success, failure and errors. This method should be used when registering an
- * end test from a different thread than the one that started the test.
- *
- * @param test The test which completed.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void endTest(Test test, Long threadId)
- {
- throttledPrint(PASS);
- }
-
- /**
- * Called when a test completes to mark it as a test fail. This method should be used when registering a
- * failure from a different thread than the one that started the test.
- *
- * @param test The test which failed.
- * @param e The assertion that failed the test.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void addFailure(Test test, AssertionFailedError e, Long threadId)
- {
- throttledPrint(FAIL);
- }
-
- /**
- * Notifies listeners of the start of a complete run of tests.
- */
- public void startBatch()
- { }
-
- /**
- * Notifies listeners of the end of a complete run of tests.
- *
- * @param parameters The optional test parameters to log out with the batch results.
- */
- public void endBatch(Properties parameters)
- { }
-
- /**
- * Notifies listeners of the tests read/set properties.
- *
- * @param properties The tests read/set properties.
- */
- public void properties(Properties properties)
- { }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/TKTestListener.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/TKTestListener.java
deleted file mode 100644
index 63b042db10..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/TKTestListener.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.listeners;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestListener;
-
-import java.util.Properties;
-
-/**
- * TKTestListener is a listener interface for listeners that want to be informed of the run times of tests, the memory
- * usage of tests, the 'size' parameters of parameterized tests and the begin and end events of complete test runs.
- * {@link org.apache.qpid.junit.extensions.TKTestResult} is an example of a test result class that listeners
- * interested in these events can be attached to.
- *
- * The {@link #timing(junit.framework.Test, long, Long)}, {@link #memoryUsed(junit.framework.Test, long, long, Long)},
- * {@link #parameterValue(junit.framework.Test, int, Long)} and {@link #endTest(junit.framework.Test, Long)} methods
- * all accept on optional thread id parameter.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Listen to test timings.
- * <tr><td> Listen to test memory usages.
- * <tr><td> Listen to parameterized test parameters.
- * </table>
- *
- * @author Rupert Smith
- */
-public interface TKTestListener extends TestListener
-{
- /**
- * Resets the test results to the default state of time zero, memory usage zero, parameter zero, test passed.
- *
- * @param test The test to resest any results for.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void reset(Test test, Long threadId);
-
- /**
- * Should be called every time a test completes with the run time of that test.
- *
- * @param test The name of the test.
- * @param nanos The run time of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing(Test test, long nanos, Long threadId);
-
-
- /**
- * Optionally called every time a test completes with the second timing test.
- *
- * @param test The name of the test.
- * @param nanos The second timing information of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing2(Test test, Long nanos, Long threadId);
-
- /**
- * Should be called every time a test completed with the amount of memory used before and after the test was run.
- *
- * @param test The test which memory was measured for.
- * @param memStart The total JVM memory used before the test was run.
- * @param memEnd The total JVM memory used after the test was run.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void memoryUsed(Test test, long memStart, long memEnd, Long threadId);
-
- /**
- * Should be called every time a parameterized test completed with the int value of its test parameter.
- *
- * @param test The test which memory was measured for.
- * @param parameter The int parameter value.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void parameterValue(Test test, int parameter, Long threadId);
-
- /**
- * Should be called every time a test completes with the current number of test threads running.
- *
- * @param test The test for which the measurement is being generated.
- * @param threads The number of tests being run concurrently.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void concurrencyLevel(Test test, int threads, Long threadId);
-
- /**
- * Called when a test completes. Success, failure and errors. This method should be used when registering an
- * end test from a different thread than the one that started the test.
- *
- * @param test The test which completed.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void endTest(Test test, Long threadId);
-
- /**
- * Called when a test completes to mark it as a test fail. This method should be used when registering a
- * failure from a different thread than the one that started the test.
- *
- * @param test The test which failed.
- * @param e The assertion that failed the test.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void addFailure(Test test, AssertionFailedError e, Long threadId);
-
- /**
- * Notifies listeners of the start of a complete run of tests.
- */
- public void startBatch();
-
- /**
- * Notifies listeners of the end of a complete run of tests.
- *
- * @param parameters The optional test parameters to log out with the batch results.
- */
- public void endBatch(Properties parameters);
-
- /**
- * Notifies listeners of the tests read/set properties.
- *
- * @param properties The tests read/set properties.
- */
- public void properties(Properties properties);
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/XMLTestListener.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/XMLTestListener.java
deleted file mode 100644
index 003bd0cecc..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/XMLTestListener.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.listeners;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestCase;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.ShutdownHookable;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.util.*;
-
-/**
- * Listens for test results for a named test and outputs these in the standard JUnit XML format to the specified
- * writer.
- *
- * <p/>The API for this listener accepts notifications about different aspects of a tests results through different
- * methods, so some assumption needs to be made as to which test result a notification refers to. For example
- * {@link #startTest} will be called, then possibly {@link #timing} will be called, even though the test instance is
- * passed in both cases, it is not enough to distinguish a particular run of the test, as the test case instance may
- * be being shared between multiple threads, or being run a repeated number of times, and can therfore be re-used
- * between calls. The listeners make the assumption that, for every test, a unique thread will call {@link #startTest}
- * and {@link #endTest} to delimit each test. All calls to set test parameters, timings, state and so on, will occur
- * between the start and end and will be given with the same thread id as the start and end, so the thread id provides
- * a unqiue value to identify a particular test run against.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Listen to test lifecycle notifications.
- * <tr><td> Listen to test errors and failures.
- * <tr><td> Listen to test timings.
- * <tr><td> Listen to test memory usages.
- * <tr><td> Listen to parameterized test parameters.
- * <tr><th> Responsibilities
- * </table>
- *
- * @todo Merge this class with CSV test listener, making the collection of results common to both, and only factoring
- * out the results printing code into sub-classes. Provide a simple XML results formatter with the same format as
- * the ant XML formatter, and a more structured one for outputing results with timings and summaries from
- * performance tests.
- *
- * @author Rupert Smith
- */
-public class XMLTestListener implements TKTestListener, ShutdownHookable
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(XMLTestListener.class);
-
- /** The results file writer. */
- protected Writer writer;
-
- /** Holds the results for individual tests. */
- // protected Map<Result, Result> results = new LinkedHashMap<Result, Result>();
- // protected List<Result> results = new ArrayList<Result>();
-
- /**
- * Map for holding results on a per thread basis as they come in. A ThreadLocal is not used as sometimes an
- * explicit thread id must be used, where notifications come from different threads than the ones that called
- * the test method.
- */
- private Map<Long, Result> threadLocalResults = Collections.synchronizedMap(new LinkedHashMap<Long, Result>());
-
- /**
- * Holds results for tests that have ended. Transferring these results here from the per-thread results map, means
- * that the thread id is freed for the thread to generate more results.
- */
- private List<Result> results = new ArrayList<Result>();
-
- /** Holds the overall error count. */
- private int errors = 0;
-
- /** Holds the overall failure count. */
- private int failures = 0;
-
- /** Holds the overall tests run count. */
- private int runs = 0;
-
- /** Holds the name of the class that tests are being run for. */
- private String testClassName;
-
- /**
- * Creates a new XML results output listener that writes to the specified location.
- *
- * @param writer The location to write results to.
- * @param testClassName The name of the test class to include in the test results.
- */
- public XMLTestListener(Writer writer, String testClassName)
- {
- log.debug("public XMLTestListener(Writer writer, String testClassName = " + testClassName + "): called");
-
- this.writer = writer;
- this.testClassName = testClassName;
- }
-
- /**
- * Resets the test results to the default state of time zero, memory usage zero, parameter zero, test passed.
- *
- * @param test The test to resest any results for.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void reset(Test test, Long threadId)
- {
- log.debug("public void reset(Test test = " + test + ", Long threadId = " + threadId + "): called");
-
- XMLTestListener.Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.error = null;
- r.failure = null;
-
- }
-
- /**
- * Notification that a test started.
- *
- * @param test The test that started.
- */
- public void startTest(Test test)
- {
- log.debug("public void startTest(Test test = " + test + "): called");
-
- Result newResult = new Result(test.getClass().getName(), ((TestCase) test).getName());
-
- // Initialize the thread local test results.
- threadLocalResults.put(Thread.currentThread().getId(), newResult);
- runs++;
- }
-
- /**
- * Should be called every time a test completes with the run time of that test.
- *
- * @param test The name of the test.
- * @param nanos The run time of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing(Test test, long nanos, Long threadId)
- { }
-
- /**
- * Optionally called every time a test completes with the second timing test.
- *
- * @param test The name of the test.
- * @param nanos The second timing information of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing2(Test test, Long nanos, Long threadId)
- { }
-
- /**
- * Should be called every time a test completed with the amount of memory used before and after the test was run.
- *
- * @param test The test which memory was measured for.
- * @param memStart The total JVM memory used before the test was run.
- * @param memEnd The total JVM memory used after the test was run.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void memoryUsed(Test test, long memStart, long memEnd, Long threadId)
- { }
-
- /**
- * Should be called every time a parameterized test completed with the int value of its test parameter.
- *
- * @param test The test which memory was measured for.
- * @param parameter The int parameter value.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void parameterValue(Test test, int parameter, Long threadId)
- { }
-
- /**
- * Should be called every time a test completes with the current number of test threads running.
- *
- * @param test The test for which the measurement is being generated.
- * @param threads The number of tests being run concurrently.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void concurrencyLevel(Test test, int threads, Long threadId)
- { }
-
- /**
- * Notifies listeners of the tests read/set properties.
- *
- * @param properties The tests read/set properties.
- */
- public void properties(Properties properties)
- { }
-
- /**
- * Notification that a test ended.
- *
- * @param test The test that ended.
- */
- public void endTest(Test test)
- {
- log.debug("public void endTest(Test test = " + test + "): called");
-
- // Move complete test results into the completed tests list.
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- results.add(r);
-
- // Clear all the test results for the thread.
- threadLocalResults.remove(Thread.currentThread().getId());
- }
-
- /**
- * Called when a test completes. Success, failure and errors. This method should be used when registering an
- * end test from a different thread than the one that started the test.
- *
- * @param test The test which completed.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void endTest(Test test, Long threadId)
- {
- log.debug("public void endTest(Test test = " + test + ", Long threadId = " + threadId + "): called");
-
- // Move complete test results into the completed tests list.
- Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
- results.add(r);
-
- // Clear all the test results for the thread.
- threadLocalResults.remove(Thread.currentThread().getId());
- }
-
- /**
- * An error occurred.
- *
- * @param test The test in which the error occurred.
- * @param t The throwable that resulted from the error.
- */
- public void addError(Test test, Throwable t)
- {
- log.debug("public void addError(Test test = " + test + ", Throwable t = " + t + "): called");
-
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- r.error = t;
- errors++;
- }
-
- /**
- * A failure occurred.
- *
- * @param test The test in which the failure occurred.
- * @param t The JUnit assertions that led to the failure.
- */
- public void addFailure(Test test, AssertionFailedError t)
- {
- log.debug("public void addFailure(Test test = " + test + ", AssertionFailedError t = " + t + "): called");
-
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- r.failure = t;
- failures++;
- }
-
- /**
- * Called when a test completes to mark it as a test fail. This method should be used when registering a
- * failure from a different thread than the one that started the test.
- *
- * @param test The test which failed.
- * @param e The assertion that failed the test.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void addFailure(Test test, AssertionFailedError e, Long threadId)
- {
- log.debug("public void addFailure(Test test, AssertionFailedError e, Long threadId): called");
-
- Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
- r.failure = e;
- failures++;
- }
-
- /**
- * Notifies listeners of the start of a complete run of tests.
- */
- public void startBatch()
- {
- log.debug("public void startBatch(): called");
-
- // Reset all results counts.
- threadLocalResults = Collections.synchronizedMap(new HashMap<Long, Result>());
- errors = 0;
- failures = 0;
- runs = 0;
-
- // Write out the file header.
- try
- {
- writer.write("<?xml version=\"1.0\" ?>\n");
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write the test results.", e);
- }
- }
-
- /**
- * Notifies listeners of the end of a complete run of tests.
- *
- * @param parameters The optional test parameters to log out with the batch results.
- */
- public void endBatch(Properties parameters)
- {
- log.debug("public void endBatch(Properties parameters = " + parameters + "): called");
-
- // Write out the results.
- try
- {
- // writer.write("<?xml version=\"1.0\" ?>\n");
- writer.write("<testsuite errors=\"" + errors + "\" failures=\"" + failures + "\" tests=\"" + runs + "\" name=\""
- + testClassName + "\">\n");
-
- for (Result result : results)
- {
- writer.write(" <testcase classname=\"" + result.testClass + "\" name=\"" + result.testName + "\">\n");
-
- if (result.error != null)
- {
- writer.write(" <error type=\"" + result.error.getClass() + "\">");
- result.error.printStackTrace(new PrintWriter(writer));
- writer.write(" </error>");
- }
- else if (result.failure != null)
- {
- writer.write(" <failure type=\"" + result.failure.getClass() + "\">");
- result.failure.printStackTrace(new PrintWriter(writer));
- writer.write(" </failure>");
- }
-
- writer.write(" </testcase>\n");
- }
-
- writer.write("</testsuite>\n");
- writer.flush();
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write the test results.", e);
- }
- }
-
- /**
- * Supplies the shutdown hook.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- log.debug("XMLTestListener::ShutdownHook: called");
- }
- });
- }
-
- /**
- * Used to capture the results of a particular test run.
- */
- protected static class Result
- {
- /** Holds the name of the test class. */
- public String testClass;
-
- /** Holds the name of the test method. */
- public String testName;
-
- /** Holds the exception that caused error in this test. */
- public Throwable error;
-
- /** Holds the assertion exception that caused failure in this test. */
- public AssertionFailedError failure;
-
- /**
- * Creates a placeholder for the results of a test.
- *
- * @param testClass The test class.
- * @param testName The name of the test that was run.
- */
- public Result(String testClass, String testName)
- {
- this.testClass = testClass;
- this.testName = testName;
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/package.html b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/package.html
deleted file mode 100644
index 15acc02ab1..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/listeners/package.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<html>
-<body>
-Listners for test statistics are defined in this package. At the moment there is only one listener which writes all test
-statistics out to a CSV (comma seperated values) file which can be loaded by most spread sheets.
-</body>
-</html>
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/package.html b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/package.html
deleted file mode 100644
index 4cab8d936a..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/package.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<html>
-<body>
-Basic JUnit is enahanced with test runners to run tests repeatedly, simultaneously in many threads and with increasing
-test sizes for asymptotic performance measurements. There are features to measure the time and amount of memory that
-tests use as well as to record the asymptotic test size parameters. There are some utilities to write these test
-statistics to various file formats too and these can be found in the listeners package.
-
-</p>The main test runner class is TKTestRunner which can be called with command line parameters to specify how tests
-should be run.
-
-</body>
-</html>
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/CommandLineParser.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/CommandLineParser.java
deleted file mode 100644
index f158090e96..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/CommandLineParser.java
+++ /dev/null
@@ -1,787 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.text.CharacterIterator;
-import java.text.StringCharacterIterator;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * CommandLineParser provides a utility for specifying the format of a command line and parsing command lines to ensure
- * that they fit their specified format. A command line is made up of flags and options, both may be refered to as
- * options. A flag is an option that does not take an argument (specifying it means it has the value 'true' and not
- * specifying it means it has the value 'false'). Options must take arguments but they can be set up with defaults so
- * that they take a default value when not set. Options may be mandatory in wich case it is an error not to specify
- * them on the command line. Flags are never mandatory because they are implicitly set to false when not specified.
- *
- * <p/>Some examples command line are:
- *
- * <ul>
- * <li>This one has two options that expect arguments:
- * <pre>
- * cruisecontrol -configfile cruisecontrol.xml -port 9000
- * </pre>
- * <li>This has one no-arg flag and two 'free' arguments:
- * <pre>
- * zip -r project.zip project/*
- * </pre>
- * <li>This one concatenates multiple flags into a single block with only one '-':
- * <pre>
- * jar -tvf mytar.tar
- * </pre>
- *
- * <p/>The parsing rules are:
- *
- * <ol>
- * <li>Flags may be combined after a single '-' because they never take arguments. Normally such flags are single letter
- * flags but this is only a convention and not enforced. Flags of more than one letter are usually specified on their own.
- * <li>Options expecting arguments must always be on their own.
- * <li>The argument to an option may be seperated from it by whitespace or appended directly onto the option.
- * <li>The argument to an option may never begin with a '-' character.
- * <li>All other arguments not beginning with a '-' character are free arguments that do not belong to any option.
- * <li>The second or later of a set of duplicate or repeated flags override earlier ones.
- * <li>Options are matched up to the shortest matching option. This is because of the possibility of having no space
- * between an option and its argument. This rules out the possibility of using two options where one is an opening
- * substring of the other. For example, the options "foo" and "foobar" cannot be used on the same command line because
- * it is not possible to distinguish the argument "-foobar" from being the "foobar" option or the "foo" option with
- * the "bar" argument.
- * </ol>
- *
- * <p/>By default, unknown options are simply ignored if specified on the command line. This behaviour may be changed
- * so that the parser reports all unknowns as errors by using the {@link #setErrorsOnUnknowns} method.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Accept a command line specification.
- * <tr><td> Parse a command line into properties, validating it against its specification.
- * <tr><td> Report all errors between a command line and its specification.
- * <tr><td> Provide a formatted usage string for a command line.
- * <tr><td> Provide a formatted options in force string for a command line.
- * <tr><td> Allow errors on unknowns behaviour to be turned on or off.
- * </table>
- *
- * @author Rupert Smith
- */
-public class CommandLineParser
-{
- /**
- * Holds a mapping from command line option names to detailed information about those options.
- * Use of a tree map ensures that the options are easy to print in alphabetical order as a usage string.
- * An alternative might be to use a LinkedHashMap to print them in the order they are specified.
- */
- private Map<String, CommandLineOption> optionMap = new TreeMap<String, CommandLineOption>();
-
- /** Holds a list of parsing errors. */
- private List<String> parsingErrors = new ArrayList<String>();
-
- /** Holds the regular head matcher to match command line options with. */
- private Matcher optionMatcher = null;
-
- /** Holds the parsed command line properties after parsing. */
- private Properties parsedProperties = null;
-
- /** Holds any trailing name=value pairs specified in the free arguments. */
- private Properties trailingProperties = null;
-
- /** Flag used to indicate that errors should be created for unknown options. False by default. */
- private boolean errorsOnUnknowns = false;
-
- /**
- * Creates a command line options parser from a command line specification. This is passed to this constructor
- * as an array of arrays of strings. Each array of strings specifies the command line for a single option. A static
- * array may therefore easily be used to configure the command line parser in a single method call with an easily
- * readable format.
- *
- * <p/>Each array of strings must be 2, 3, 4 or 5 elements long. If any of the last three elements are missing they
- * are assumed to be null. The elements specify the following parameters:
- * <ol>
- * <li>The name of the option without the leading '-'. For example, "file". To specify the format of the 'free'
- * arguments use the option names "1", "2", ... and so on.
- * <li>The option comment. A line of text describing the usage of the option. For example, "The file to be processed."
- * <li>The options argument. This is a very short description of the argument to the option, often a single word
- * or a reminder as to the arguments format. When this element is null the option is a flag and does not
- * accept any arguments. For example, "filename" or "(unix | windows)" or null. The actual text specified
- * is only used to print in the usage message to remind the user of the usage of the option.
- * <li>The mandatory flag. When set to "true" an option must always be specified. Any other value, including null,
- * means that the option is mandatory. Flags are always mandatory (see class javadoc for explanation of why) so
- * this is ignored for flags.
- * <li>A regular head describing the format that the argument must take. Ignored if null.
- * </ol>
- * <p/>An example call to this constructor is:
- *
- * <pre>
- * CommandLineParser commandLine = new CommandLineParser(
- * new String[][] {{"file", "The file to be processed. ", "filename", "true"},
- * {"dir", "Directory to store results in. Current dir used if not set.", "out dir"},
- * {"os", "Operating system EOL format to use.", "(windows | unix)", null, "windows\|unix"},
- * {"v", "Verbose mode. Prints information about the processing as it goes."},
- * {"1", "The processing command to run.", "command", "true", "add\|remove\|list"}});
- * </pre>
- *
- * @param config The configuration as an array of arrays of strings.
- */
- public CommandLineParser(String[][] config)
- {
- // Loop through all the command line option specifications creating details for each in the options map.
- for (String[] nextOptionSpec : config)
- {
- addOption(nextOptionSpec[0], nextOptionSpec[1], (nextOptionSpec.length > 2) ? nextOptionSpec[2] : null,
- (nextOptionSpec.length > 3) && ("true".equals(nextOptionSpec[3])),
- (nextOptionSpec.length > 4) ? nextOptionSpec[4] : null);
- }
- }
-
- /**
- * Extracts all name=value pairs from the command line, sets them all as system properties and also returns
- * a map of properties containing them.
- *
- * @param args The command line.
- * @param commandLine The command line parser.
- * @param properties The properties object to inject all parsed properties into (optional may be <tt>null</tt>).
- *
- * @return A set of properties containing all name=value pairs from the command line.
- */
- public static Properties processCommandLine(String[] args, CommandLineParser commandLine, Properties properties)
- {
- // Capture the command line arguments or display errors and correct usage and then exit.
- Properties options = null;
-
- try
- {
- options = commandLine.parseCommandLine(args);
-
- // Add all the command line options and trailing settings to properties if the optional properties object
- // to copy them into has been set.
- if (properties != null)
- {
- commandLine.addTrailingPairsToProperties(properties);
- commandLine.addOptionsToProperties(properties);
- }
- }
- catch (IllegalArgumentException e)
- {
- System.out.println(commandLine.getErrors());
- System.out.println(commandLine.getUsage());
- System.exit(1);
- }
-
- return options;
- }
-
- /**
- * Lists all the parsing errors from the most recent parsing in a string.
- *
- * @return All the parsing errors from the most recent parsing.
- */
- public String getErrors()
- {
- // Return the empty string if there are no errors.
- if (parsingErrors.isEmpty())
- {
- return "";
- }
-
- // Concatenate all the parsing errors together.
- String result = "";
-
- for (String s : parsingErrors)
- {
- result += s;
- }
-
- return result;
- }
-
- /**
- * Lists the properties set from the most recent parsing or an empty string if no parsing has been done yet.
- *
- * @return The properties set from the most recent parsing or an empty string if no parsing has been done yet.
- */
- public String getOptionsInForce()
- {
- // Check if there are no properties to report and return and empty string if so.
- if (parsedProperties == null)
- {
- return "";
- }
-
- // List all the properties.
- String result = "Options in force:\n";
-
- for (Map.Entry<Object, Object> property : parsedProperties.entrySet())
- {
- result += property.getKey() + " = " + property.getValue() + "\n";
- }
-
- return result;
- }
-
- /**
- * Generates a usage string consisting of the name of each option and each options argument description and
- * comment.
- *
- * @return A usage string for all the options.
- */
- public String getUsage()
- {
- String result = "Options:\n";
-
- int optionWidth = 0;
- int argumentWidth = 0;
-
- // Calculate the column widths required for aligned layout.
- for (CommandLineOption optionInfo : optionMap.values())
- {
- int oWidth = optionInfo.option.length();
- int aWidth = (optionInfo.argument != null) ? (optionInfo.argument.length()) : 0;
-
- optionWidth = (oWidth > optionWidth) ? oWidth : optionWidth;
- argumentWidth = (aWidth > argumentWidth) ? aWidth : argumentWidth;
- }
-
- // Print usage on each of the command line options.
- for (CommandLineOption optionInfo : optionMap.values())
- {
- String argString = ((optionInfo.argument != null) ? (optionInfo.argument) : "");
- String optionString = optionInfo.option;
-
- argString = rightPad(argString, " ", argumentWidth);
- optionString = rightPad(optionString, " ", optionWidth);
-
- result += "-" + optionString + " " + argString + " " + optionInfo.comment + "\n";
- }
-
- return result;
- }
-
- /**
- * Right pads a string with a given string to a given size. This method will repeat the padder string as many
- * times as is necessary until the exact specified size is reached. If the specified size is less than the size
- * of the original string then the original string is returned unchanged.
- *
- * <pre>
- * Example1 - original string "cat", padder string "white", size 8 gives "catwhite".
- * Example2 - original string "cat", padder string "white", size 15 gives "catwhitewhitewh".
- * Example3 - original string "cat", padder string "white", size 2 gives "cat".
- * </pre>
- *
- * @param stringToPad The original string.
- * @param padder The string to pad onto the original string.
- * @param size The required size of the new string.
- *
- * @return The newly padded string.
- */
- public static String rightPad(String stringToPad, String padder, int size)
- {
- if (padder.length() == 0)
- {
- return stringToPad;
- }
-
- StringBuffer strb = new StringBuffer(stringToPad);
- StringCharacterIterator sci = new StringCharacterIterator(padder);
-
- while (strb.length() < size)
- {
- for (char ch = sci.first(); ch != CharacterIterator.DONE; ch = sci.next())
- {
- if (strb.length() < size)
- {
- strb.append(String.valueOf(ch));
- }
- }
- }
-
- return strb.toString();
- }
-
- /**
- * Control the behaviour of the errors on unkowns reporting. When turned on this reports all unkowns options
- * as errors. When turned off, all unknowns are simply ignored.
- *
- * @param errors The setting of the errors on unkown flag. True to turn it on.
- */
- public void setErrorsOnUnknowns(boolean errors)
- {
- errorsOnUnknowns = errors;
- }
-
- /**
- * Parses a set of command line arguments into a set of properties, keyed by the argument flag. The free arguments
- * are keyed by integers as strings starting at "1" and then "2", ... and so on.
- *
- * <p/>See the class level comment for a description of the parsing rules.
- *
- * @param args The command line arguments.
- *
- * @return The arguments as a set of properties.
- *
- * @throws IllegalArgumentException If the command line cannot be parsed against its specification. If this exception
- * is thrown a call to {@link #getErrors} will provide a diagnostic of the command
- * line errors.
- */
- public Properties parseCommandLine(String[] args) throws IllegalArgumentException
- {
- Properties options = new Properties();
-
- // Used to keep count of the current 'free' argument.
- int free = 1;
-
- // Used to indicate that the most recently parsed option is expecting arguments.
- boolean expectingArgs = false;
-
- // The option that is expecting arguments from the next element of the command line.
- String optionExpectingArgs = null;
-
- // Used to indicate that the most recently parsed option is a duplicate and should be ignored.
- // boolean ignore = false;
-
- // Create the regular head matcher for the command line options.
- String regexp = "^(";
- int optionsAdded = 0;
-
- for (Iterator<String> i = optionMap.keySet().iterator(); i.hasNext();)
- {
- String nextOption = i.next();
-
- // Check that the option is not a free argument definition.
- boolean notFree = false;
-
- try
- {
- Integer.parseInt(nextOption);
- }
- catch (NumberFormatException e)
- {
- notFree = true;
- }
-
- // Add the option to the regular head matcher if it is not a free argument definition.
- if (notFree)
- {
- regexp += nextOption + (i.hasNext() ? "|" : "");
- optionsAdded++;
- }
- }
-
- // There has to be more that one option in the regular head or else the compiler complains that the close
- // cannot be nullable if the '?' token is used to make the matched option string optional.
- regexp += ")" + ((optionsAdded > 0) ? "?" : "") + "(.*)";
- Pattern pattern = Pattern.compile(regexp);
-
- // Loop through all the command line arguments.
- for (String arg1 : args)
- {
- // Check if the next command line argument begins with a '-' character and is therefore the start of
- // an option.
- if (arg1.startsWith("-"))
- {
- // Extract the value of the option without the leading '-'.
- String arg = arg1.substring(1);
-
- // Match up to the longest matching option.
- optionMatcher = pattern.matcher(arg);
- optionMatcher.matches();
-
- String matchedOption = optionMatcher.group(1);
-
- // Match any argument directly appended onto the longest matching option.
- String matchedArg = optionMatcher.group(2);
-
- // Check that a known option was matched.
- if ((matchedOption != null) && !"".equals(matchedOption))
- {
- // Get the command line option information for the matched option.
- CommandLineOption optionInfo = optionMap.get(matchedOption);
-
- // Check if this option is expecting arguments.
- if (optionInfo.expectsArgs)
- {
- // The option is expecting arguments so swallow the next command line argument as an
- // argument to this option.
- expectingArgs = true;
- optionExpectingArgs = matchedOption;
-
- // In the mean time set this options argument to the empty string in case no argument is ever
- // supplied.
- // options.put(matchedOption, "");
- }
-
- // Check if the option was matched on its own and is a flag in which case set that flag.
- if ("".equals(matchedArg) && !optionInfo.expectsArgs)
- {
- options.put(matchedOption, "true");
- }
- // The option was matched as a substring with its argument appended to it or is a flag that is
- // condensed together with other flags.
- else if (!"".equals(matchedArg))
- {
- // Check if the option is a flag and therefore is allowed to be condensed together
- // with other flags.
- if (!optionInfo.expectsArgs)
- {
- // Set the first matched flag.
- options.put(matchedOption, "true");
-
- // Repeat the longest matching process on the remainder but ensure that the remainder
- // consists only of flags as only flags may be condensed together in this fashion.
- do
- {
- // Match the remainder against the options.
- optionMatcher = pattern.matcher(matchedArg);
- optionMatcher.matches();
-
- matchedOption = optionMatcher.group(1);
- matchedArg = optionMatcher.group(2);
-
- // Check that an option was matched.
- if (matchedOption != null)
- {
- // Get the command line option information for the next matched option.
- optionInfo = optionMap.get(matchedOption);
-
- // Ensure that the next option is a flag or raise an error if not.
- if (optionInfo.expectsArgs)
- {
- parsingErrors.add("Option " + matchedOption + " cannot be combined with flags.\n");
- }
-
- options.put(matchedOption, "true");
- }
- // The remainder could not be matched against a flag it is either an unknown flag
- // or an illegal argument to a flag.
- else
- {
- parsingErrors.add("Illegal argument to a flag in the option " + arg + "\n");
-
- break;
- }
- }
- // Continue until the remainder of the argument has all been matched with flags.
- while (!"".equals(matchedArg));
- }
- // The option is expecting an argument, so store the unmatched portion against it
- // as its argument.
- else
- {
- // Check the arguments format is correct against any specified format.
- checkArgumentFormat(optionInfo, matchedArg);
-
- // Store the argument against its option (regardless of its format).
- options.put(matchedOption, matchedArg);
-
- // The argument to this flag has already been supplied to it. Do not swallow the
- // next command line argument as an argument to this flag.
- expectingArgs = false;
- }
- }
- }
- else // No matching option was found.
- {
- // Add this to the list of parsing errors if errors on unkowns is being used.
- if (errorsOnUnknowns)
- {
- parsingErrors.add("Option " + matchedOption + " is not a recognized option.\n");
- }
- }
- }
- // The command line argument did not being with a '-' so it is an argument to the previous flag or it
- // is a free argument.
- else
- {
- // Check if a previous flag is expecting to swallow this next argument as its argument.
- if (expectingArgs)
- {
- // Get the option info for the option waiting for arguments.
- CommandLineOption optionInfo = optionMap.get(optionExpectingArgs);
-
- // Check the arguments format is correct against any specified format.
- checkArgumentFormat(optionInfo, arg1);
-
- // Store the argument against its option (regardless of its format).
- options.put(optionExpectingArgs, arg1);
-
- // Clear the expecting args flag now that the argument has been swallowed.
- expectingArgs = false;
- optionExpectingArgs = null;
- }
- // This command line option is not an argument to any option. Add it to the set of 'free' options.
- else
- {
- // Get the option info for the free option, if there is any.
- CommandLineOption optionInfo = optionMap.get(Integer.toString(free));
-
- if (optionInfo != null)
- {
- // Check the arguments format is correct against any specified format.
- checkArgumentFormat(optionInfo, arg1);
- }
-
- // Add to the list of free options.
- options.put(Integer.toString(free), arg1);
-
- // Move on to the next free argument.
- free++;
- }
- }
- }
-
- // Scan through all the specified options to check that all mandatory options have been set and that all flags
- // that were not set are set to false in the set of properties.
- for (CommandLineOption optionInfo : optionMap.values())
- {
- // Check if this is a flag.
- if (!optionInfo.expectsArgs)
- {
- // Check if the flag is not set in the properties and set it to false if so.
- if (!options.containsKey(optionInfo.option))
- {
- options.put(optionInfo.option, "false");
- }
- }
- // Check if this is a mandatory option and was not set.
- else if (optionInfo.mandatory && !options.containsKey(optionInfo.option))
- {
- // Create an error for the missing option.
- parsingErrors.add("Option " + optionInfo.option + " is mandatory but not was not specified.\n");
- }
- }
-
- // Check if there were any errors.
- if (!parsingErrors.isEmpty())
- {
- // Throw an illegal argument exception to signify that there were parsing errors.
- throw new IllegalArgumentException();
- }
-
- // Convert any name/value pairs in the free arguments into properties in the parsed options.
- trailingProperties = takeFreeArgsAsProperties(options, 1);
-
- parsedProperties = options;
-
- return options;
- }
-
- /**
- * If a command line has been parsed, calling this method sets all of its free arguments that were name=value pairs
- * on the specified properties.
- *
- * @param properties The property set to add the name=value pairs to.
- */
- public void addTrailingPairsToProperties(Properties properties)
- {
- if (trailingProperties != null)
- {
- for (Object propKey : trailingProperties.keySet())
- {
- String name = (String) propKey;
- String value = trailingProperties.getProperty(name);
-
- properties.setProperty(name, value);
- }
- }
- }
-
- /**
- * If a command line has been parsed, calling this method sets all of its options that were set to the specified
- * properties.
- *
- * @param properties The property set to the options to.
- */
- public void addOptionsToProperties(Properties properties)
- {
- if (parsedProperties != null)
- {
- for (Object propKey : parsedProperties.keySet())
- {
- String name = (String) propKey;
- String value = parsedProperties.getProperty(name);
-
- // This filters out all trailing items.
- if (!name.matches("^[0-9]+$"))
- {
- properties.setProperty(name, value);
- }
- }
- }
- }
-
- /**
- * Resets this command line parser after it has been used to parse a command line. This method will only need
- * to be called to use this parser a second time which is not likely seeing as a command line is usually only
- * specified once. However, it is exposed as a public method for the rare case where this may be done.
- *
- * <p/>Cleans the internal state of this parser, removing all stored errors and information about the options in
- * force.
- */
- public void reset()
- {
- parsingErrors = new ArrayList<String>();
- parsedProperties = null;
- }
-
- /**
- * Adds the option to list of available command line options.
- *
- * @param option The option to add as an available command line option.
- * @param comment A comment for the option.
- * @param argument The text that appears after the option in the usage string.
- * @param mandatory When true, indicates that this option is mandatory.
- * @param formatRegexp The format that the argument must take, defined as a regular head.
- */
- protected void addOption(String option, String comment, String argument, boolean mandatory, String formatRegexp)
- {
- // Check if usage text has been set in which case this option is expecting arguments.
- boolean expectsArgs = (!((argument == null) || argument.equals("")));
-
- // Add the option to the map of command line options.
- CommandLineOption opt = new CommandLineOption(option, expectsArgs, comment, argument, mandatory, formatRegexp);
- optionMap.put(option, opt);
- }
-
- /**
- * Converts the free arguments into property declarations. After parsing the command line the free arguments
- * are numbered from 1, such that the parsed properties contain values for the keys "1", "2", ... This method
- * converts any free arguments declared using the 'name=value' syntax into properties with key 'name', value
- * 'value'.
- *
- * <p/>For example the comand line:
- * <pre>
- * ... debug=true
- * </pre>
- *
- * <p/>After parsing has properties:
- * <pre>[[1, debug=true]]</pre>
- *
- * <p/>After applying this method the properties are:
- * <pre>[[1, debug=true], [debug, true]]</pre>
- *
- * @param properties The parsed command line properties.
- * @param from The free argument index to convert to properties from.
- *
- * @return The parsed command line properties, with free argument name value pairs too.
- */
- private Properties takeFreeArgsAsProperties(Properties properties, int from)
- {
- Properties result = new Properties();
-
- for (int i = from; true; i++)
- {
- String nextFreeArg = properties.getProperty(Integer.toString(i));
-
- // Terminate the loop once all free arguments have been consumed.
- if (nextFreeArg == null)
- {
- break;
- }
-
- // Split it on the =, strip any whitespace and set it as a system property.
- String[] nameValuePair = nextFreeArg.split("=");
-
- if (nameValuePair.length == 2)
- {
- result.setProperty(nameValuePair[0], nameValuePair[1]);
- }
- }
-
- return result;
- }
-
- /**
- * Checks the format of an argument to an option against its specified regular head format if one has
- * been set. Any errors are added to the list of parsing errors.
- *
- * @param optionInfo The command line option information for the option which is havings its argument checked.
- * @param matchedArg The string argument to the option.
- */
- private void checkArgumentFormat(CommandLineOption optionInfo, String matchedArg)
- {
- // Check if this option enforces a format for its argument.
- if (optionInfo.argumentFormatRegexp != null)
- {
- Pattern pattern = Pattern.compile(optionInfo.argumentFormatRegexp);
- Matcher argumentMatcher = pattern.matcher(matchedArg);
-
- // Check if the argument does not meet its required format.
- if (!argumentMatcher.matches())
- {
- // Create an error for this badly formed argument.
- parsingErrors.add("The argument to option " + optionInfo.option + " does not meet its required format.\n");
- }
- }
- }
-
- /**
- * Holds information about a command line options. This includes what its name is, whether or not it is a flag,
- * whether or not it is mandatory, what its user comment is, what its argument reminder text is and what its
- * regular head format is.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Hold details of a command line option.
- * </table>
- *
- * @author Rupert Smith
- */
- protected class CommandLineOption
- {
- /** Holds the text for the flag to match this argument with. */
- public String option = null;
-
- /** Holds a string describing how to use this command line argument. */
- public String argument = null;
-
- /** Flag that determines whether or not this command line argument can take arguments. */
- public boolean expectsArgs = false;
-
- /** Holds a short comment describing what this command line argument is for. */
- public String comment = null;
-
- /** Flag that determines whether or not this is an mandatory command line argument. */
- public boolean mandatory = false;
-
- /** A regular head describing what format the argument to this option muist have. */
- public String argumentFormatRegexp = null;
-
- /**
- * Create a command line option object that holds specific information about a command line option.
- *
- * @param option The text that matches the option.
- * @param expectsArgs Whether or not the option expects arguments. It is a flag if this is false.
- * @param comment A comment explaining how to use this option.
- * @param argument A short reminder of the format of the argument to this option/
- * @param mandatory Set to true if this option is mandatory.
- * @param formatRegexp The regular head that the argument to this option must meet to be valid.
- */
- public CommandLineOption(String option, boolean expectsArgs, String comment, String argument, boolean mandatory,
- String formatRegexp)
- {
- this.option = option;
- this.expectsArgs = expectsArgs;
- this.comment = comment;
- this.argument = argument;
- this.mandatory = mandatory;
- this.argumentFormatRegexp = formatRegexp;
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ContextualProperties.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ContextualProperties.java
deleted file mode 100644
index 14de96d165..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ContextualProperties.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * ContextualProperties is an extension of {@link java.util.Properties} that automatically selects properties based on an
- * environment parameter (defined by the system property {@link #ENV_SYS_PROPERTY}), the name of a class, plus a modifier
- * (which can be used to name a method of a class) and a property key. It also supports the definition of arrays of
- * property values using indexes. The properties are searched in the following order until a match is found:
- *
- * <ol>
- * <li>environment + class name with package name + modifier + key
- * <li>environment + class name with package name + key
- * <li>environment + key
- * <li>class name with package name + modifier + key
- * <li>class name with package name + key
- * <li>key
- * </ol>
- *
- * <p>To create arrays of property values add index numbers onto the end of the property keys. An array of string values
- * will be created with the elements of the array set to the value of the property at the matching index. Ideally the
- * index values will be contiguous, starting at 0. This does not need to be the case however. If an array definition
- * begins at index n, and ends at index m, Then an array big enough to hold m + 1 elements will be created and populated
- * with values from n to m. Values before n and any missing values between n and m will be null in the array.
- *
- * <p>To give an example, suppose you have two different environments 'DEVELOPMENT' and 'PRODUCTION' and they each need
- * the same properties but set to different values for each environment and some properties the same in both, you could
- * create a properties file like:
- *
- * <p><code>
- * # Project configuration properties file.<br/>
- * <br/>
- * # These properties are environment specific.<br/>
- * DEVELOPMENT.debug=true<br/>
- * PRODUCTION.debug=false<br/>
- * <br/>
- * # Always debug MyClass in all environments but not the myMethod method.<br/>
- * MyClass.debug=true<br/>
- * MyClass.myMethod.debug=false<br/>
- * <br/>
- * # Set up an array of my ten favourite animals. Leave elements 3 to 8 as null as I haven't decided on them yet.<br/>
- * animals.0=cat<br/>
- * animals.1=dog<br/>
- * animals.2=elephant<br/>
- * animals.9=lion<br/>
- * <br/>
- * # This is a default value that will be used when the environment is not known.<br/>
- * debug=false<br/>
- * </code>
- *
- * <p>The most specific definition of a property is searched for first moving out to the most general. This allows
- * general property defaults to be set and then overiden for specific uses by some classes and modifiers.
- *
- * <p>A ContextualProperties object can be loaded in the same way as a java.utils.Properties. A recommended way to do
- * this that does not assume that the properties file is a file (it could be in a jar) is to load the properties from the
- * url for the resource lookup up on the classpath:
- *
- * <p><code>
- * Properties configProperties = new ContextualProperties();<br/>
- * configProperties.load(this.getClass().getClassLoader().getResourceAsStream("config.properties"));<br/>
- * </code>
- *
- * <p>EnvironmentProperties will load the 'DEVELOPMENT.debug' property or 'PROUCTION.debug' property based on the setting
- * of the system environment property. If a matching property for the environment cannot be found then the simple property
- * name without the environment pre-pended onto it will be used instead. This 'use of default environments' behaviour is
- * turned on initially but it can be disabled by calling the {@link #useDefaultEnvironments} method.
- *
- * <p>When a property matching a key cannot be found then the property accessor methods will always return null. If a
- * default value for a property exists but the 'use of default environments' behavious prevents it being used then the
- * accessor methods will return null.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Automatically select properties dependant on environment, class name and modifier as well as property key.
- * <tr><td> Convert indexed properties into arrays.
- * </table>
- *
- * @author Rupert Smith
- */
-public class ContextualProperties extends ParsedProperties
-{
- /** The name of the system property that is used to define the environment. */
- public static final String ENV_SYS_PROPERTY = "environment";
-
- /**
- * <p>Holds the iteration count down order.
- *
- * <p>If e = 4, b = 2, m = 1 then the iteration order or i is 7,6,4 and then if using environment defaults 3,2,0
- * where the accessor key is:
- * (i & e != 0 ? environment : "") + (i & b != 0 ? base : "") + (1 + m != 0 ? modifier : "") + key
- *
- * <p>In other words the presence or otherwise of the three least significant bits when counting down from 7
- * specifies which of the environment, base and modifier are to be included in the key where the environment, base
- * and modifier stand for the bits in positions 2, 1 and 0. The numbers 5 and 1 are missed out of the count because
- * they stand for the case where the modifier is used without the base which is not done.
- */
- private static final int[] ORDER = new int[] { 7, 6, 4, 3, 2, 0 };
-
- /**
- * Defines the point in the iteration count order below which the 'use environment defaults' feature is being used.
- */
- private static final int ENVIRONMENT_DEFAULTS_CUTOFF = 4;
-
- /** Defines the bit representation for the environment in the key ordering. See {@link #ORDER}. */
- private static final int E = 4;
-
- /** Defines the bit representation for the base in the key ordering. See {@link #ORDER}. */
- private static final int B = 2;
-
- /** Defines the bit representation for the modifier in the key ordering. See {@link #ORDER}. */
- private static final int M = 1;
-
- /** Used to hold the value of the environment system property. */
- private String environment;
-
- /** Used to indicate that the 'use of defaults' behaviour should be used. */
- private boolean useDefaults = true;
-
- /** Used to hold all the array properties. This is a mapping from property names to ArrayLists of Strings. */
- protected Map arrayProperties = new HashMap();
-
- /**
- * Default constructor that builds a ContextualProperties that uses environment defaults.
- */
- public ContextualProperties()
- {
- super();
-
- // Keep the value of the system environment property.
- environment = System.getProperty(ENV_SYS_PROPERTY);
- }
-
- /**
- * Creates a ContextualProperties that uses environment defaults and is initialized with the specified properties.
- *
- * @param props The properties to initialize this with.
- */
- public ContextualProperties(Properties props)
- {
- super(props);
-
- // Keep the value of the system environment property.
- environment = System.getProperty(ENV_SYS_PROPERTY);
-
- // Extract any array properties as arrays.
- createArrayProperties();
- }
-
- /**
- * Parses an input stream as properties.
- *
- * @param inStream The input stream to read the properties from.
- *
- * @exception IOException If there is an IO error during reading from the input stream.
- */
- public void load(InputStream inStream) throws IOException
- {
- super.load(inStream);
-
- // Extract any array properties as arrays.
- createArrayProperties();
- }
-
- /**
- * Tells this environment aware properties object whether it should use default environment properties without a
- * pre-pended environment when a property for the current environment cannot be found.
- *
- * @param flag True to use defaults, false to not use defaults.
- */
- public void useDefaultEnvironments(boolean flag)
- {
- useDefaults = flag;
- }
-
- /**
- * Looks up a property value relative to the environment, callers class and method. The default environment will be
- * checked for a matching property if defaults are being used. In order to work out the callers class and method this
- * method throws an exception and then searches one level up its stack frames.
- *
- * @param key The property key.
- *
- * @return The value of this property searching from the most specific definition (environment, class, method, key)
- * to the most general (key only), unless use of default environments is turned off in which case the most general
- * proeprty searched is (environment, key).
- */
- public String getProperty(String key)
- {
- // Try to get the callers class name and method name by examing the stack.
- String className = null;
- String methodName = null;
-
- // Java 1.4 onwards only.
- /*try
- {
- throw new Exception();
- }
- catch (Exception e)
- {
- StackTraceElement[] stack = e.getStackTrace();
-
- // Check that the stack trace contains at least two elements, one for this method and one for the caller.
- if (stack.length >= 2)
- {
- className = stack[1].getClassName();
- methodName = stack[1].getMethodName();
- }
- }*/
-
- // Java 1.5 onwards only.
- StackTraceElement[] stack = Thread.currentThread().getStackTrace();
-
- // Check that the stack trace contains at least two elements, one for this method and one for the caller.
- if (stack.length >= 2)
- {
- className = stack[1].getClassName();
- methodName = stack[1].getMethodName();
- }
-
- // Java 1.3 and before? Not sure, some horrible thing that parses the text spat out by printStackTrace?
-
- return getProperty(className, methodName, key);
- }
-
- /**
- * Looks up a property value relative to the environment, base class and modifier. The default environment will be
- * checked for a matching property if defaults are being used.
- *
- * @param base An object of the class to retrieve properties relative to.
- * @param modifier The modifier (which may stand for a method of the class).
- * @param key The property key.
- *
- * @return The value of this property searching from the most specific definition (environment, class, modifier, key)
- * to the most general (key only), unless use of default environments is turned off in which case the most general
- * property searched is (environment, key).
- */
- public String getProperty(Object base, String modifier, String key)
- {
- return getProperty(base.getClass().getName(), modifier, key);
- }
-
- /**
- * Looks up a property value relative to the environment, base class and modifier. The default environment will be
- * checked for a matching property if defaults are being used.
- *
- * @param base The name of the class to retrieve properties relative to.
- * @param modifier The modifier (which may stand for a method of the class).
- * @param key The property key.
- *
- * @return The value of this property searching from the most specific definition (environment, class, modifier, key)
- * to the most general (key only), unless use of default environments is turned off in which case the most general
- * property searched is (environment, key).
- */
- public String getProperty(String base, String modifier, String key)
- {
- String result = null;
-
- // Loop over the key orderings, from the most specific to the most general, until a matching value is found.
- for (Iterator i = getKeyIterator(base, modifier, key); i.hasNext();)
- {
- String nextKey = (String) i.next();
-
- result = super.getProperty(nextKey);
-
- if (result != null)
- {
- break;
- }
- }
-
- return result;
- }
-
- /**
- * Looks up an array property value relative to the environment, callers class and method. The default environment
- * will be checked for a matching array property if defaults are being used. In order to work out the callers class
- * and method this method throws an exception and then searches one level up its stack frames.
- *
- * @param key The property key.
- *
- * @return The array value of this indexed property searching from the most specific definition (environment, class,
- * method, key) to the most general (key only), unless use of default environments is turned off in which
- * case the most general proeprty searched is (environment, key).
- */
- public String[] getProperties(String key)
- {
- // Try to get the callers class name and method name by throwing an exception an searching the stack frames.
- String className = null;
- String methodName = null;
-
- /* Java 1.4 onwards only.
- try {
- throw new Exception();
- } catch (Exception e) {
- StackTraceElement[] stack = e.getStackTrace();
- // Check that the stack trace contains at least two elements, one for this method and one for the caller.
- if (stack.length >= 2) {
- className = stack[1].getClassName();
- methodName = stack[1].getMethodName();
- }
- }*/
- return getProperties(className, methodName, key);
- }
-
- /**
- * Looks up an array property value relative to the environment, base class and modifier. The default environment will
- * be checked for a matching array property if defaults are being used.
- *
- * @param base An object of the class to retrieve properties relative to.
- * @param modifier The modifier (which may stand for a method of the class).
- * @param key The property key.
- *
- * @return The array value of this indexed property searching from the most specific definition (environment, class,
- * modifier, key) to the most general (key only), unless use of default environments is turned off in which
- * case the most general proeprty searched is (environment, key).
- */
- public String[] getProperties(Object base, String modifier, String key)
- {
- return getProperties(base.getClass().getName(), modifier, key);
- }
-
- /**
- * Looks up an array property value relative to the environment, base class and modifier. The default environment will
- * be checked for a matching array property if defaults are being used.
- *
- * @param base The name of the class to retrieve properties relative to.
- * @param modifier The modifier (which may stand for a method of the class).
- * @param key The property key.
- *
- * @return The array value of this indexed property searching from the most specific definition (environment, class,
- * modifier, key) to the most general (key only), unless use of default environments is turned off in which
- * case the most general property searched is (environment, key).
- */
- public String[] getProperties(String base, String modifier, String key)
- {
- String[] result = null;
-
- // Loop over the key orderings, from the most specific to the most general, until a matching value is found.
- for (Iterator i = getKeyIterator(base, modifier, key); i.hasNext();)
- {
- String nextKey = (String) i.next();
- ArrayList arrayList = (ArrayList) arrayProperties.get(nextKey);
-
- if (arrayList != null)
- {
- result = (String[]) arrayList.toArray(new String[] {});
-
- break;
- }
- }
-
- return result;
- }
-
- /**
- * For a given environment, base, modifier and key and setting of the use of default environments feature this
- * generates an iterator that walks over the order in which to try and access properties.
- *
- * <p>See the {@link #ORDER} constant for an explanation of how the key ordering is generated.
- *
- * @param base The name of the class to retrieve properties relative to.
- * @param modifier The modifier (which may stand for a method of the class).
- * @param key The property key.
- *
- * @return An Iterator over String keys defining the order in which properties should be accessed.
- */
- protected Iterator getKeyIterator(final String base, final String modifier, final String key)
- {
- return new Iterator()
- {
- // The key ordering count always begins at the start of the ORDER array.
- private int i = 0;
-
- public boolean hasNext()
- {
- return (useDefaults ? ((i < ORDER.length) && (ORDER[i] > ENVIRONMENT_DEFAULTS_CUTOFF))
- : (i < ORDER.length));
- }
-
- public Object next()
- {
- // Check that there is a next element and return null if not.
- if (!hasNext())
- {
- return null;
- }
-
- // Get the next ordering count.
- int o = ORDER[i];
-
- // Do bit matching on the count to choose which elements to include in the key.
- String result =
- (((o & E) != 0) ? (environment + ".") : "") + (((o & B) != 0) ? (base + ".") : "")
- + (((o & M) != 0) ? (modifier + ".") : "") + key;
-
- // Increment the iterator to get the next key on the next call.
- i++;
-
- return result;
- }
-
- public void remove()
- {
- // This method is not supported.
- throw new UnsupportedOperationException("remove() is not supported on this key order iterator as "
- + "the ordering cannot be changed");
- }
- };
- }
-
- /**
- * Scans all the properties in the parent Properties object and creates arrays for any array property definitions.
- *
- * <p>Array properties are defined with indexes. For example:
- *
- * <p><code>
- * property.1=one<br/>
- * property.2=two<br/>
- * property.3=three<br/>
- * </code>
- *
- * <p>Note that these properties will be stored as the 'empty string' or "" property array.
- *
- * <p><code>
- * .1=one<br/>
- * 2=two<br/>
- * </code>
- */
- protected void createArrayProperties()
- {
- // Scan through all defined properties.
- for (Object o : keySet())
- {
- String key = (String) o;
- String value = super.getProperty(key);
-
- // Split the property key into everything before the last '.' and after it.
- int lastDotIndex = key.lastIndexOf('.');
- String keyEnding = key.substring(lastDotIndex + 1, key.length());
- String keyStart = key.substring(0, (lastDotIndex == -1) ? 0 : lastDotIndex);
-
- // Check if the property key ends in an integer, in which case it is an array property.
- int index = 0;
-
- try
- {
- index = Integer.parseInt(keyEnding);
- }
- // The ending is not an integer so its not an array.
- catch (NumberFormatException e)
- {
- // Scan the next property.
- continue;
- }
-
- // Check if an array property already exists for this base name and create one if not.
- ArrayList propArray = (ArrayList) arrayProperties.get(keyStart);
-
- if (propArray == null)
- {
- propArray = new ArrayList();
- arrayProperties.put(keyStart, propArray);
- }
-
- // Add the new property value to the array property for the index.
- propArray.set(index, value);
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/MathUtils.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/MathUtils.java
deleted file mode 100644
index 7c803294f4..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/MathUtils.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.util.ArrayList;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Mathematical support methods for the toolkit. Caculating averages, variances, min/max for test latencies and
- * generating linear/exponential sequences for test size/concurrency ramping up.
- *
- * <p/>The sequence specifications are of the form [lowest(, ...)(, highest)](,sample=s)(,exp), where round brackets
- * enclose optional values. Using this pattern form it is possible to specify a single value, a range of values divided
- * into s samples, a range of values divided into s samples but distributed exponentially, or a fixed set of samples.
- *
- * <p/>The duration arguments are of the form (dD)(hH)(mM)(sS), where round brackets enclose optional values. At least
- * one of the optional values must be present.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Generate a sequene of integers from a sequence specification.
- * <tr><td> Parse an encoded duration into milliseconds.
- * </table>
- *
- * @author Rupert Smith
- */
-public class MathUtils
-{
- /** Used for debugging. */
- // private static final Logger log = Logger.getLogger(MathUtils.class);
-
- /** The sequence defintion matching regular expression. */
- public static final String SEQUENCE_REGEXP = "^(\\[[0-9:]+\\])(:samples=[0-9]+)?(:exp)?$";
-
- /** The regular expression that matches sequence definitions. */
- private static final Pattern SEQUENCE_PATTERN = Pattern.compile(SEQUENCE_REGEXP);
-
- /** The duration definition matching regular expression. */
- public static final String DURATION_REGEXP = "^(\\d+D)?(\\d+H)?(\\d+M)?(\\d+S)?$";
-
- /** The regular expression that matches the duration expression. */
- public static final Pattern DURATION_PATTERN = Pattern.compile(DURATION_REGEXP);
-
- /** For matching name=value pairs. */
- public static final String NAME_VALUE_REGEXP = "^\\w+=\\w+$";
-
- /** For matching name=[value1: value2: ...] variations. */
- public static final String NAME_VALUE_VARIATION_REGEXP = "^\\w+=\\[[\\w:]+\\]$";
-
- /** For matching name=[n: ... :m](:sample=s)(:exp) sequences. */
- public static final String NAME_VALUE_SEQUENCE_REGEXP = "^\\w+=(\\[[0-9:]+\\])(:samples=[0-9]+)?(:exp)?$";
-
- /** The regular expression that matches name=value pairs and variations. */
- public static final Pattern NAME_VALUE_PATTERN =
- Pattern.compile("(" + NAME_VALUE_REGEXP + ")|(" + NAME_VALUE_VARIATION_REGEXP + ")|(" + NAME_VALUE_SEQUENCE_REGEXP
- + ")");
-
- /**
- * Runs a quick test of the sequence generation methods to confirm that they work as expected.
- *
- * @param args The command line parameters.
- */
- public static void main(String[] args)
- {
- // Use the command line parser to evaluate the command line.
- CommandLineParser commandLine =
- new CommandLineParser(
- new String[][]
- {
- { "s", "The sequence definition.", "[m:...:n](:sample=s)(:exp)", "true", MathUtils.SEQUENCE_REGEXP },
- { "d", "The duration definition.", "dDhHmMsS", "false", MathUtils.DURATION_REGEXP }
- });
-
- // Capture the command line arguments or display errors and correct usage and then exit.
- ParsedProperties options = null;
-
- try
- {
- options = new ParsedProperties(commandLine.parseCommandLine(args));
- }
- catch (IllegalArgumentException e)
- {
- System.out.println(commandLine.getErrors());
- System.out.println(commandLine.getUsage());
- System.exit(-1);
- }
-
- // Extract the command line options.
- String sequence = options.getProperty("s");
- String durationString = options.getProperty("d");
-
- System.out.println("Sequence is: " + printArray(parseSequence(sequence)));
-
- if (durationString != null)
- {
- System.out.println("Duration is: " + parseDuration(durationString));
- }
- }
-
- /**
- * Given a start and end and a number of steps this method generates a sequence of evenly spaced integer
- * values, starting at the start (inclusive) and finishing at the end (inclusive) with the specified number
- * of values in the sequence. The sequence returned may contain less than the specified number where the integer
- * range between start and end is too small to contain that many.
- *
- * <p/>As the results are integers, they will not be perfectly evenly spaced but a best-fit.
- *
- * @param start The sequence start.
- * @param end The sequence end.
- * @param steps The number of steps.
- *
- * @return The sequence.
- */
- public static int[] generateSequence(int start, int end, int steps)
- {
- // Check that there are at least two steps.
- if (steps < 2)
- {
- throw new IllegalArgumentException("There must be at least 2 steps.");
- }
-
- ArrayList<Integer> result = new ArrayList<Integer>();
-
- // Calculate the sequence using floating point, then round into the results.
- double fStart = start;
- double fEnd = end;
- double fCurrent = start;
-
- for (int i = 0; i < steps; i++)
- {
- fCurrent = (((fEnd - fStart) / (steps - 1)) * i) + fStart;
-
- roundAndAdd(result, fCurrent);
- }
-
- // Return the results after converting to a primitive array.
- return intListToPrimitiveArray(result);
- }
-
- /**
- * Given a start and end and a number of steps this method generates a sequence of expontentially spaced integer
- * values, starting at the start (inclusive) and finishing at the end (inclusive) with the specified number
- * of values in the sequence. An exponentially spaced sequence is one where the ratio between any two consecutive
- * numbers in the sequence remains constant. The sequence returned may contain less than the specified number where
- * the difference between two consecutive values is too small (this is more likely at the start of the sequence,
- * where the values are closer together).
- *
- * <p/>As the results are integers, they will not be perfectly exponentially spaced but a best-fit.
- *
- * @param start The sequence start.
- * @param end The sequence end.
- * @param steps The number of steps.
- *
- * @return The sequence.
- */
- public static int[] generateExpSequence(int start, int end, int steps)
- {
- // Check that there are at least two steps.
- if (steps < 2)
- {
- throw new IllegalArgumentException("There must be at least 2 steps.");
- }
-
- ArrayList<Integer> result = new ArrayList<Integer>();
-
- // Calculate the sequence using floating point, then round into the results.
- double fStart = start;
- double fEnd = end;
- // float fCurrent = start;
- double diff = fEnd - fStart;
- double factor = java.lang.Math.pow(diff, (1.0f / (steps - 1)));
-
- for (int i = 0; i < steps; i++)
- {
- // This is a cheat to get the end exactly on and lose the accumulated rounding error.
- if (i == (steps - 1))
- {
- result.add(end);
- }
- else
- {
- roundAndAdd(result, fStart - 1.0f + java.lang.Math.pow(factor, i));
- }
- }
-
- // Return the results after converting to a primitive array.
- return intListToPrimitiveArray(result);
- }
-
- /**
- * Parses a string defintion of a sequence into an int array containing the sequence. The definition will conform
- * to the regular expression: "^(\[[0-9,]+\])(,samples=[0-9]+)?(,exp)?$". This splits it into three parts,
- * an array of integers, the optional sample count and the optional exponential flag.
- *
- * @param sequenceDef The sequence definition.
- *
- * @return The sequence as a fully expanded int array.
- */
- public static int[] parseSequence(String sequenceDef)
- {
- // Match the sequence definition against the regular expression for sequences.
- Matcher matcher = SEQUENCE_PATTERN.matcher(sequenceDef);
-
- // Check that the argument is of the right format accepted by this method.
- if (!matcher.matches())
- {
- throw new IllegalArgumentException("The sequence definition is not in the correct format.");
- }
-
- // Get the total number of matching groups to see if either of the optional samples or exponential flag
- // goups were set.
- int numGroups = matcher.groupCount();
-
- // Split the array of integers on commas.
- String intArrayString = matcher.group(1);
-
- String[] intSplits = intArrayString.split("[:\\[\\]]");
-
- int[] sequence = new int[intSplits.length - 1];
-
- for (int i = 1; i < intSplits.length; i++)
- {
- sequence[i - 1] = Integer.parseInt(intSplits[i]);
- }
-
- // Check for the optional samples count.
- int samples = 0;
-
- if ((numGroups > 1) && (matcher.group(2) != null))
- {
- String samplesGroup = matcher.group(2);
-
- String samplesString = samplesGroup.substring(",samples=".length());
- samples = Integer.parseInt(samplesString);
- }
-
- // Check for the optional exponential flag.
- boolean expFlag = false;
-
- if ((numGroups > 2) && (matcher.group(3) != null))
- {
- expFlag = true;
- }
-
- // If there is a sample count and 2 or more sequence values defined, then generate the sequence from the first
- // and last sequence values.
- if ((samples != 0) && (sequence.length >= 2))
- {
- int start = sequence[0];
- int end = sequence[sequence.length - 1];
-
- if (!expFlag)
- {
- sequence = generateSequence(start, end, samples);
- }
- else
- {
- sequence = generateExpSequence(start, end, samples);
- }
- }
-
- return sequence;
- }
-
- /**
- * Parses a duration defined as a string, giving a duration in days, hours, minutes and seconds into a number
- * of milliseconds equal to that duration.
- *
- * @param duration The duration definition string.
- *
- * @return The duration in millliseconds.
- */
- public static long parseDuration(String duration)
- {
- // Match the duration against the regular expression.
- Matcher matcher = DURATION_PATTERN.matcher(duration);
-
- // Check that the argument is of the right format accepted by this method.
- if (!matcher.matches())
- {
- throw new IllegalArgumentException("The duration definition is not in the correct format.");
- }
-
- // This accumulates the duration.
- long result = 0;
-
- int numGroups = matcher.groupCount();
-
- // Extract the days.
- if (numGroups >= 1)
- {
- String daysString = matcher.group(1);
- result +=
- (daysString == null)
- ? 0 : (Long.parseLong(daysString.substring(0, daysString.length() - 1)) * 24 * 60 * 60 * 1000);
- }
-
- // Extract the hours.
- if (numGroups >= 2)
- {
- String hoursString = matcher.group(2);
- result +=
- (hoursString == null) ? 0
- : (Long.parseLong(hoursString.substring(0, hoursString.length() - 1)) * 60 * 60 * 1000);
- }
-
- // Extract the minutes.
- if (numGroups >= 3)
- {
- String minutesString = matcher.group(3);
- result +=
- (minutesString == null)
- ? 0 : (Long.parseLong(minutesString.substring(0, minutesString.length() - 1)) * 60 * 1000);
- }
-
- // Extract the seconds.
- if (numGroups >= 4)
- {
- String secondsString = matcher.group(4);
- result +=
- (secondsString == null) ? 0 : (Long.parseLong(secondsString.substring(0, secondsString.length() - 1)) * 1000);
- }
-
- return result;
- }
-
- /**
- * Pretty prints an array of ints as a string.
- *
- * @param array The array to pretty print.
- *
- * @return The pretty printed string.
- */
- public static String printArray(int[] array)
- {
- String result = "[";
- for (int i = 0; i < array.length; i++)
- {
- result += array[i];
- result += (i < (array.length - 1)) ? ", " : "";
- }
-
- result += "]";
-
- return result;
- }
-
- /**
- * Returns the maximum value in an array of integers.
- *
- * @param values The array to find the amx in.
- *
- * @return The max value.
- */
- public static int maxInArray(int[] values)
- {
- if ((values == null) || (values.length == 0))
- {
- throw new IllegalArgumentException("Cannot find the max of a null or empty array.");
- }
-
- int max = values[0];
-
- for (int value : values)
- {
- max = (max < value) ? value : max;
- }
-
- return max;
- }
-
- /**
- * The #toArray methods of collections cannot be used with primitive arrays. This loops over and array list
- * of Integers and outputs and array of int.
- *
- * @param result The array of Integers to convert.
- *
- * @return An array of int.
- */
- private static int[] intListToPrimitiveArray(ArrayList<Integer> result)
- {
- int[] resultArray = new int[result.size()];
- int index = 0;
- for (int r : result)
- {
- resultArray[index] = result.get(index);
- index++;
- }
-
- return resultArray;
- }
-
- /**
- * Rounds the specified floating point value to the nearest integer and adds it to the specified list of
- * integers, provided it is not already in the list.
- *
- * @param result The list of integers to add to.
- * @param value The new candidate to round and add to the list.
- */
- private static void roundAndAdd(ArrayList<Integer> result, double value)
- {
- int roundedValue = (int) Math.round(value);
-
- if (!result.contains(roundedValue))
- {
- result.add(roundedValue);
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ParsedProperties.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ParsedProperties.java
deleted file mode 100644
index 1cc6757675..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/ParsedProperties.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.util.Properties;
-
-/**
- * ParsedProperties extends the basic Properties class with methods to extract properties, not as strings but as strings
- * parsed into basic types.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * </table>
- *
- * @author Rupert Smith
- */
-public class ParsedProperties extends Properties
-{
- /**
- * Creates an empty ParsedProperties.
- */
- public ParsedProperties()
- {
- super();
- }
-
- /**
- * Creates a ParsedProperties initialized with the specified properties.
- *
- * @param props The properties to initialize this with.
- */
- public ParsedProperties(Properties props)
- {
- super(props);
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static boolean setSysPropertyIfNull(String propname, boolean value)
- {
- return Boolean.parseBoolean(setSysPropertyIfNull(propname, Boolean.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static short setSysPropertyIfNull(String propname, short value)
- {
- return Short.parseShort(setSysPropertyIfNull(propname, Short.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static int setSysPropertyIfNull(String propname, int value)
- {
- return Integer.parseInt(setSysPropertyIfNull(propname, Integer.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static long setSysPropertyIfNull(String propname, long value)
- {
- return Long.parseLong(setSysPropertyIfNull(propname, Long.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static float setSysPropertyIfNull(String propname, float value)
- {
- return Float.parseFloat(setSysPropertyIfNull(propname, Float.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public static double setSysPropertyIfNull(String propname, double value)
- {
- return Double.parseDouble(setSysPropertyIfNull(propname, Double.toString(value)));
- }
-
- /**
- * Helper method for setting system properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the system property after this method call.
- */
- public static String setSysPropertyIfNull(String propname, String value)
- {
- String property = System.getProperty(propname);
-
- if (property == null)
- {
- System.setProperty(propname, value);
-
- return value;
- }
- else
- {
- return property;
- }
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public boolean setPropertyIfNull(String propname, boolean value)
- {
- return Boolean.parseBoolean(setPropertyIfNull(propname, Boolean.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public short setPropertyIfNull(String propname, short value)
- {
- return Short.parseShort(setPropertyIfNull(propname, Short.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public int setPropertyIfNull(String propname, int value)
- {
- return Integer.parseInt(setPropertyIfNull(propname, Integer.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public long setPropertyIfNull(String propname, long value)
- {
- return Long.parseLong(setPropertyIfNull(propname, Long.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public float setPropertyIfNull(String propname, float value)
- {
- return Float.parseFloat(setPropertyIfNull(propname, Float.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public double setPropertyIfNull(String propname, double value)
- {
- return Double.parseDouble(setPropertyIfNull(propname, Double.toString(value)));
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public String setPropertyIfNull(String propname, String value)
- {
- String property = super.getProperty(propname);
-
- if (property == null)
- {
- super.setProperty(propname, value);
-
- return value;
- }
- else
- {
- return property;
- }
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public boolean setProperty(String propname, boolean value)
- {
- setProperty(propname, Boolean.toString(value));
-
- return value;
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public short setProperty(String propname, short value)
- {
- setProperty(propname, Short.toString(value));
-
- return value;
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public int setProperty(String propname, int value)
- {
- setProperty(propname, Integer.toString(value));
-
- return value;
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public long setProperty(String propname, long value)
- {
- setProperty(propname, Long.toString(value));
-
- return value;
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public float setProperty(String propname, float value)
- {
- setProperty(propname, Float.toString(value));
-
- return value;
- }
-
- /**
- * Helper method for setting properties.
- *
- * @param propname The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property after this method call.
- */
- public double setProperty(String propname, double value)
- {
- setProperty(propname, Double.toString(value));
-
- return value;
- }
-
- /**
- * Parses a property as a boolean.
- *
- * @param propName The property.
- *
- * @return The property as a boolean, or false if it does not exist.
- */
- public boolean getPropertyAsBoolean(String propName)
- {
- String prop = getProperty(propName);
-
- return (prop != null) && Boolean.parseBoolean(prop);
- }
-
- /**
- * Parses a property as an integer.
- *
- * @param propName The property.
- *
- * @return The property as a integer, or null if it does not exist.
- */
- public Integer getPropertyAsInteger(String propName)
- {
- String prop = getProperty(propName);
-
- return (prop != null) ? new Integer(prop) : null;
- }
-
- /**
- * Parses a property as a long.
- *
- * @param propName The property.
- *
- * @return The property as a long, or null if it does not exist.
- */
- public Long getPropertyAsLong(String propName)
- {
- String prop = getProperty(propName);
-
- return (prop != null) ? new Long(prop) : null;
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/SizeOf.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/SizeOf.java
deleted file mode 100644
index ecc08770a9..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/SizeOf.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-/**
- * SizeOf provides a static method that does its best to return an accurate measure of the total amount of memory used by
- * the virtual machine. This is calculated as the total memory available to the VM minus the actual amount used by it.
- * Before this measurement is taken the garbage collector is run many times until the used memory calculation stabilizes.
- * Generally, this trick works quite well to provide an accurate reading, however, it cannot be relied upon to be totally
- * accurate. It is also quite slow.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Calculate total memory used.
- * </table>
- *
- * @author Rupert Smith
- */
-public class SizeOf
-{
- /** Holds a reference to the runtime object. */
- private static final Runtime RUNTIME = Runtime.getRuntime();
-
- /**
- * Makes 4 calls the {@link #runGCTillStable} method.
- */
- public static void runGCTillStableSeveralTimes()
- {
- // It helps to call Runtime.gc() using several method calls.
- for (int r = 0; r < 4; ++r)
- {
- runGCTillStable();
- }
- }
-
- /**
- * Runs the garbage collector until the used memory reading stabilizes. It may run the garbage collector up
- * to 500 times.
- */
- public static void runGCTillStable()
- {
- long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE;
-
- for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i)
- {
- RUNTIME.runFinalization();
- RUNTIME.gc();
- Thread.currentThread().yield();
-
- usedMem2 = usedMem1;
- usedMem1 = usedMemory();
- }
- }
-
- /**
- * Runs the garbage collector until the used memory stabilizes and then measures it.
- *
- * @return The amount of memory used by the virtual machine.
- */
- public static long getUsedMemory()
- {
- runGCTillStableSeveralTimes();
-
- return usedMemory();
- }
-
- /**
- * Returns the amount of memory used by subtracting the free memory from the total available memory.
- *
- * @return The amount of memory used.
- */
- private static long usedMemory()
- {
- return RUNTIME.totalMemory() - RUNTIME.freeMemory();
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/StackQueue.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/StackQueue.java
deleted file mode 100644
index acc1e2c218..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/StackQueue.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.util.EmptyStackException;
-import java.util.NoSuchElementException;
-import java.util.Queue;
-import java.util.Stack;
-
-/**
- * The Stack class in java.util (most unhelpfully) does not implement the Queue interface. This is an adaption of that
- * class as a queue.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Turn a stack into a queue.
- * </table>
- *
- * @todo Need to override the add method, and iterator and consider other methods too. They work like LIFO but
- * really wany FIFO behaviour accross the whole data structure.
- *
- * @author Rupert Smith
- */
-public class StackQueue<E> extends Stack<E> implements Queue<E>
-{
- /**
- * Retrieves, but does not remove, the head of this queue.
- *
- * @return The element at the top of the stack.
- */
- public E element()
- {
- try
- {
- return super.peek();
- }
- catch (EmptyStackException e)
- {
- NoSuchElementException t = new NoSuchElementException();
- t.initCause(e);
- throw t;
- }
- }
-
- /**
- * Inserts the specified element into this queue, if possible.
- *
- * @param o The data element to push onto the stack.
- *
- * @return True if it was added to the stack, false otherwise (this implementation always returns true).
- */
- public boolean offer(E o)
- {
- push(o);
-
- return true;
- }
-
- /**
- * Retrieves, but does not remove, the head of this queue, returning null if this queue is empty.
- *
- * @return The top element from the stack, or null if the stack is empty.
- */
- public E peek()
- {
- try
- {
- return super.peek();
- }
- catch (EmptyStackException e)
- {
- return null;
- }
- }
-
- /**
- * Retrieves and removes the head of this queue, or null if this queue is empty.
- *
- * @return The top element from the stack, or null if the stack is empty.
- */
- public E poll()
- {
- try
- {
- return super.pop();
- }
- catch (EmptyStackException e)
- {
- return null;
- }
- }
-
- /**
- * Retrieves and removes the head of this queue.
- *
- * @return The top element from the stack, or null if the stack is empty.
- *
- * @throws NoSuchElementException If the stack is empty so no element can be removed from it.
- */
- public E remove()
- {
- try
- {
- return super.pop();
- }
- catch (EmptyStackException e)
- {
- NoSuchElementException t = new NoSuchElementException();
- t.initCause(e);
- throw t;
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestContextProperties.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestContextProperties.java
deleted file mode 100644
index d402077963..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestContextProperties.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-import java.util.Properties;
-
-/**
- * TestContextProperties is an extension of {@link ParsedProperties} that keeps track of property key/value pairs
- * that are used by tests being run under the {@link org.apache.qpid.junit.extensions.TKTestRunner}. To keep the
- * test runner notified of configurable test parameters, tests should establish their required property values by
- * initiliazing fields or statics or in the constructor, through this class. The tk test runner automatically places
- * any additional properties specified on the command line into the this class, and these are held statically.
- *
- * <p/>Here is an example:
- *
- * <pre>
- * public class MyTestClass extends TestCase {
- * ParsedProperties testProps = TestContextProperties.getInstance();
- * private int testParam = testProps.setPropertyIfNull("testParam", 1);
- * ...
- * </pre>
- *
- * <p/>This has the effect of setting up the field testParam with the default value of 1, unless it is overridden
- * by values passed to the tk test runner. It also notifies the tk test runner of the name and value of the test
- * parameter actually used for the test, so that this can be logged in the test output file.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Log all name/value pairs read or written.
- * </table>
- *
- * @author Rupert Smith
- */
-public class TestContextProperties extends ParsedProperties
-{
- /** Used for debugging. */
- // Logger log = Logger.getLogger(TestContextProperties.class);
-
- /** Holds all properties set or read through this property extension class. */
- private Properties accessedProps = new Properties();
-
- /** The singleton instance of the test context properties. */
- private static TestContextProperties singleton = null;
-
- /**
- * Default constructor that builds a ContextualProperties that uses environment defaults.
- */
- private TestContextProperties()
- {
- super();
- }
-
- /**
- * Gets the singleton instance of the test context properties.
- *
- * @return The singleton instance of the test context properties.
- */
- public static synchronized ParsedProperties getInstance()
- {
- if (singleton == null)
- {
- singleton = new TestContextProperties();
- }
-
- return singleton;
- }
-
- /**
- * Gets the singleton instance of the test context properties, applying a specified set of default properties to
- * it, if they are not already set.
- *
- * @param defaults The defaults to apply for properties not already set.
- *
- * @return The singleton instance of the test context properties.
- */
- public static synchronized ParsedProperties getInstance(Properties defaults)
- {
- ParsedProperties props = getInstance();
-
- for (Object key : defaults.keySet())
- {
- String stringKey = (String) key;
- String value = defaults.getProperty(stringKey);
-
- props.setPropertyIfNull(stringKey, value);
- }
-
- return props;
- }
-
- /*
- * Creates a ContextualProperties that uses environment defaults and is initialized with the specified properties.
- *
- * @param props The properties to initialize this with.
- */
- /*public TestContextProperties(Properties props)
- {
- super();
- }*/
-
- /**
- * Gets all of the properties (with their most recent values) that have been set or read through this class.
- *
- * @return All of the properties accessed through this class.
- */
- public static Properties getAccessedProps()
- {
- return (singleton == null) ? new Properties() : singleton;
- // return accessedProps;
- }
-
- /**
- * Looks up a property value relative to the environment, callers class and method. The default environment will be
- * checked for a matching property if defaults are being used. The property key/value pair is remembered and made
- * available to {@link org.apache.qpid.junit.extensions.TKTestRunner}.
- *
- * @param key The property key.
- *
- * @return The value of this property searching from the most specific definition (environment, class, method, key)
- * to the most general (key only), unless use of default environments is turned off in which case the most general
- * proeprty searched is (environment, key).
- */
- public String getProperty(String key)
- {
- // log.debug("public String getProperty(String key = " + key + "): called");
-
- String value = super.getProperty(key);
-
- if (value != null)
- {
- accessedProps.setProperty(key, value);
- }
-
- // log.debug("value = " + value);
-
- return value;
- }
-
- /**
- * Calls the <tt>Hashtable</tt> method <code>put</code>. Provided for parallelism with the <tt>getProperty</tt>
- * method. Enforces use of strings for property keys and values. The value returned is the result of the
- * <tt>Hashtable</tt> call to <code>put</code>. The property key/value pair is remembered and made
- * available to {@link org.apache.qpid.junit.extensions.TKTestRunner}.
- *
- * @param key The key to be placed into this property list.
- * @param value The value corresponding to <tt>key</tt>.
- *
- * @return The previous value of the specified key in this property list, or <code>null</code> if it did not have one.
- */
- public synchronized Object setProperty(String key, String value)
- {
- // log.debug("public synchronized Object setProperty(String key = " + key + ", String value = " + value + "): called");
-
- Object result = super.setProperty(key, value);
- accessedProps.setProperty(key, value);
-
- return result;
- }
-
- /**
- * Helper method for setting properties to defaults when they are not already set. The property key/value pair is
- * remembered and made available to {@link org.apache.qpid.junit.extensions.TKTestRunner}.
- *
- * @param key The name of the system property to set.
- * @param value The value to set it to.
- *
- * @return The value of the property, which will be the value passed in if it was null, or the existing value otherwise.
- */
- public String setPropertyIfNull(String key, String value)
- {
- // log.debug("public String setPropertyIfNull(String key = " + key + ", String value = " + value + "): called");
-
- String result = super.setPropertyIfNull(key, value);
-
- if (value != null)
- {
- accessedProps.setProperty(key, result);
- }
-
- // log.debug("result = " + result);
-
- return result;
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestUtils.java b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestUtils.java
deleted file mode 100644
index 553a41ecae..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/TestUtils.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.junit.extensions.util;
-
-/**
- * Provides commonly used functions that aid testing.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a short pause.
- * </table>
- *
- * @author Rupert Smith
- */
-public class TestUtils
-{
- /**
- * Injects a short pause. The pause may not complete its full length, if the thread is interrupted when waiting.
- * In most cases, this will not happen and this method is a vry adequate pause implementation, without the
- * need to handle interrupted exceptions.
- *
- * @param millis The length of the pause in milliseconds.
- */
- public static void pause(long millis)
- {
- try
- {
- Thread.sleep(millis);
- }
- catch (InterruptedException e)
- {
- // Clear the flag and ignore.
- Thread.interrupted();
- }
- }
-}
diff --git a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/package.html b/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/package.html
deleted file mode 100644
index f39b892e2d..0000000000
--- a/qpid/java/junit-toolkit/src/main/org/apache/qpid/junit/extensions/util/package.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<html>
-<body>
-Provides some helper classes. ContextualProperties allows a hierarchy of properties to be used in properties file with
-default overrides. SizeOf takes memeory measurements by stabilizing the garbage collector.
-</body>
-</html>
diff --git a/qpid/java/lib/gson-2.0.jar b/qpid/java/lib/gson-2.0.jar
new file mode 100644
index 0000000000..7b413f9570
--- /dev/null
+++ b/qpid/java/lib/gson-2.0.jar
Binary files differ
diff --git a/qpid/java/lib/jackson-core-asl-1.9.0.jar b/qpid/java/lib/jackson-core-asl-1.9.0.jar
new file mode 100644
index 0000000000..e9456ad887
--- /dev/null
+++ b/qpid/java/lib/jackson-core-asl-1.9.0.jar
Binary files differ
diff --git a/qpid/java/lib/jackson-mapper-asl-1.9.0.jar b/qpid/java/lib/jackson-mapper-asl-1.9.0.jar
new file mode 100644
index 0000000000..f8beebcfea
--- /dev/null
+++ b/qpid/java/lib/jackson-mapper-asl-1.9.0.jar
Binary files differ
diff --git a/qpid/java/lib/poms/jackson-core-asl-1.9.0.xml b/qpid/java/lib/poms/jackson-core-asl-1.9.0.xml
new file mode 100644
index 0000000000..cc5947b72b
--- /dev/null
+++ b/qpid/java/lib/poms/jackson-core-asl-1.9.0.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<dep>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-core-asl</artifactId>
+ <version>1.9.0</version>
+</dep>
diff --git a/qpid/java/lib/poms/jackson-mapper-asl-1.9.0.xml b/qpid/java/lib/poms/jackson-mapper-asl-1.9.0.xml
new file mode 100644
index 0000000000..ff74f5a503
--- /dev/null
+++ b/qpid/java/lib/poms/jackson-mapper-asl-1.9.0.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<dep>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-mapper-asl</artifactId>
+ <version>1.9.0</version>
+</dep>
diff --git a/qpid/java/management/eclipse-plugin/src/test/java/org/apache/qpid/management/ui/ManagementConsoleTest.java b/qpid/java/management/eclipse-plugin/src/test/java/org/apache/qpid/management/ui/ManagementConsoleTest.java
index 6065a04576..eef6356642 100644
--- a/qpid/java/management/eclipse-plugin/src/test/java/org/apache/qpid/management/ui/ManagementConsoleTest.java
+++ b/qpid/java/management/eclipse-plugin/src/test/java/org/apache/qpid/management/ui/ManagementConsoleTest.java
@@ -24,6 +24,7 @@ import org.apache.qpid.exchange.ExchangeDefaults;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.server.exchange.DirectExchange;
import org.apache.qpid.server.management.AMQManagedObject;
+import org.apache.qpid.server.model.UUIDGenerator;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.AMQQueueFactory;
import org.apache.qpid.server.queue.AMQQueueMBean;
@@ -36,6 +37,7 @@ import javax.management.MBeanFeatureInfo;
import javax.management.MBeanInfo;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
/**
@@ -86,7 +88,7 @@ public class ManagementConsoleTest extends InternalBrokerBaseCase
// If this test fails due to changes in the broker code,
// then the constants in the Constants.java shoule be updated accordingly
DirectExchange exchange = new DirectExchange();
- exchange.initialise(_virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
+ exchange.initialise(UUIDGenerator.generateUUID(), _virtualHost, ExchangeDefaults.DIRECT_EXCHANGE_NAME, false, 0, true);
AMQManagedObject mbean = (AMQManagedObject)exchange.getManagedObject();
MBeanInfo mbeanInfo = mbean.getMBeanInfo();
diff --git a/qpid/java/module.xml b/qpid/java/module.xml
index 438d4fc5a7..1aea77b488 100644
--- a/qpid/java/module.xml
+++ b/qpid/java/module.xml
@@ -349,7 +349,7 @@
<sysproperty key="log4j.configuration" value="${log4j.configuration}"/>
<sysproperty key="java.naming.factory.initial" value="${java.naming.factory.initial}"/>
<sysproperty key="java.naming.provider.url" value="${java.naming.provider.url}"/>
- <sysproperty key="messagestore.class.name" value="${messagestore.class.name}" />
+ <sysproperty key="messagestorefactory.class.name" value="${messagestorefactory.class.name}" />
<sysproperty key="test.output" value="${module.results}"/>
<sysproperty key="qpid.amqp.version" value="${qpid.amqp.version}"/>
diff --git a/qpid/java/perftests/RunningPerformanceTests.txt b/qpid/java/perftests/RunningPerformanceTests.txt
deleted file mode 100644
index 2bc9220774..0000000000
--- a/qpid/java/perftests/RunningPerformanceTests.txt
+++ /dev/null
@@ -1,141 +0,0 @@
-The Performance Tests
--------------------------
-
-Building the Tests (Only develoeprs need to know how to do this).
------------------------------------------------------------------
-
-The performance tests are compiled as part of the Maven build by default, but the performance test scripts are not. There is also an additional step to perform, that generates a convenient Jar file containing all of the test dependencies, to simplify invoking Java with a very long command line. The steps to build the performance test suite are:
-
- 1. Cd to the /java/perftests directory.
- 2. Execute: mvn org.apache.qpid:junit-toolkit-maven-plugin:tkscriptgen (this generates the scripts).
- 3. Execute: mvn assembly:assembly
-
-The assembly:assembly step generates a Jar with all the dependecies in it in a file name ending with -all-test-deps.jar, which contains the client code and all its dependencies, plus JUnit and the toolkit test runners. The generated scripts expect to find the jar in the current directory. You can Cd to the /target directory and run the scripts from there. The assembly:assembly step also outputs some archives that contain all the scripts and required Jar for convenient shipping of the test suite. Unpack this anywhere you like and run the tests from there.
-
-Running the Tests
------------------
-
-All the performance tests are run through shell scripts, that have been configured with parameters set up in the pom.xml file. You can override any of these parameters on the command line. It is also possible to pass parameters through the script to the JVM that is running the test. For example to change the heap size you might do:
-
-./Ping-Once.sh -java:Xmx1024M
-
-The tests have all been set up to accept a single integer 'size' parameter, passed to the JUnit TestCase for the test, through the JUnit Toolkit asymptotic test case extension. The 'size' parameter is always interpreted in the performance tests as standing for the number of messages to send per test method invocation. Therefore, in the results of the test the throughput of messages is equal to the number of test method invocations times the 'size' divided by the time taken.
-
-** TODO: Change this, use seconds not millis.
-
-Test timing results are output to .csv files, which can easily be imported into a spreadsheet for graphing and analysis. The timings in this file are always given in milliseconds, which may be a bit confusing and should really be changed to seconds.
-
-The JUnit Toolkit provides a framework for controlling how long tests are run for, how many are run at once and what the 'size' parameter is, which is general enough to handle a wide variety of performance tests. Here is the documentation from the TKTestRunner class that explains what its command line parameters are:
-
- ...
- * TKTestRunner extends {@link junit.textui.TestRunner} with the ability to run tests multiple times, to execute a test
- * simultaneously using many threads, to put a delay between test runs and adds support for tests that take integer
- * parameters that can be 'stepped' through on multiple test runs. These features can be accessed by using this class
- * as an entry point and passing command line arguments to specify which features to use:
- *
- * <pre>
- * -w ms The number of milliseconds between invocations of test cases.
- * -c pattern The number of tests to run concurrently.
- * -r num The number of times to repeat each test.
- * -d duration The length of time to run the tests for.
- * -t name The name of the test case to execute.
- * -s pattern The size parameter to run tests with.
- * -o dir The name of the directory to output test timings to.
- * -v Verbose mode.
- * </pre>
- *
- * <p/>The pattern arguments are of the form [lowest(, ...)(, highest)](,sample=s)(,exp), where round brackets
- * enclose optional values. Using this pattern form it is possible to specify a single value, a range of values divided
- * into s samples, a range of values divided into s samples but distributed exponentially, or a fixed set of samples.
- *
- * <p/>The duration arguments are of the form dD(:hH)(:mM)(:sS), where round brackets enclose optional values.
- *
- * <p/>Here are some examples:
- *
- * <p/><table>
- * <tr><td><pre> -c [10,20,30,40,50] </pre><td> Runs the test with 10,20,...,50 threads.
- * <tr><td><pre> -s [1,100],samples=10 </pre>
- * <td> Runs the test with ten different size parameters evenly spaced between 1 and 100.
- * <tr><td><pre> -s [1,1000000],samples=10,exp </pre>
- * <td> Runs the test with ten different size parameters exponentially spaced between 1 and 1000000.
- * <tr><td><pre> -r 10 </pre><td> Runs each test ten times.
- * <tr><td><pre> -d 10H </pre><td> Runs the test repeatedly for 10 hours.
- * <tr><td><pre> -d 1M, -r 10 </pre>
- * <td> Runs the test repeatedly for 1 minute but only takes a timing sample every 10 test runs.
- * <tr><td><pre> -r 10, -c [1, 5, 10, 50], -s [100, 1000, 10000] </pre>
- * <td> Runs 12 test cycles (4 concurrency samples * 3 size sample), with 10 repeats each. In total the test
- * will be run 199 times (3 + 15 + 30 + 150)
- * </table>
- ...
-
-The specific performance test cases for QPid are implemented as extensions to JUnit TestCase (asymptotic test cases), and also accept a large number of different parameters to control the characteristics of the test. The are passed into the test scripts as name=value pairs. Here is the documentation from the PingPongProducer class that explains what the available parameters and default values are:
-
- ...
- * <p/>This ping tool accepts a vast number of configuration options, all of which are passed in to the constructor. It
- * can ping topics or queues; ping multiple destinations; do persistent pings; send messages of any size; do pings within
- * transactions; control the number of pings to send in each transaction; limit its sending rate; and perform failover
- * testing. A complete list of accepted parameters, default values and comments on their usage is provided here:
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> messageSize <td> 0 <td> Message size in bytes. Not including any headers.
- * <tr><td> destinationName <td> ping <td> The root name to use to generate destination names to ping.
- * <tr><td> persistent <td> false <td> Determines whether peristent delivery is used.
- * <tr><td> transacted <td> false <td> Determines whether messages are sent/received in transactions.
- * <tr><td> broker <td> tcp://localhost:5672 <td> Determines the broker to connect to.
- * <tr><td> virtualHost <td> test <td> Determines the virtual host to send all ping over.
- * <tr><td> rate <td> 0 <td> The maximum rate (in hertz) to send messages at. 0 means no limit.
- * <tr><td> verbose <td> false <td> The verbose flag for debugging. Prints to console on every message.
- * <tr><td> pubsub <td> false <td> Whether to ping topics or queues. Uses p2p by default.
- * <tr><td> failAfterCommit <td> false <td> Whether to prompt user to kill broker after a commit batch.
- * <tr><td> failBeforeCommit <td> false <td> Whether to prompt user to kill broker before a commit batch.
- * <tr><td> failAfterSend <td> false <td> Whether to prompt user to kill broker after a send.
- * <tr><td> failBeforeSend <td> false <td> Whether to prompt user to kill broker before a send.
- * <tr><td> failOnce <td> true <td> Whether to prompt for failover only once.
- * <tr><td> username <td> guest <td> The username to access the broker with.
- * <tr><td> password <td> guest <td> The password to access the broker with.
- * <tr><td> selector <td> null <td> Not used. Defines a message selector to filter pings with.
- * <tr><td> destinationCount <td> 1 <td> The number of receivers listening to the pings.
- * <tr><td> timeout <td> 30000 <td> In milliseconds. The timeout to stop waiting for replies.
- * <tr><td> commitBatchSize <td> 1 <td> The number of messages per transaction in transactional mode.
- * <tr><td> uniqueDests <td> true <td> Whether each receiver only listens to one ping destination or all.
- * <tr><td> durableDests <td> false <td> Whether or not durable destinations are used.
- * <tr><td> ackMode <td> AUTO_ACK <td> The message acknowledgement mode. Possible values are:
- * 0 - SESSION_TRANSACTED
- * 1 - AUTO_ACKNOWLEDGE
- * 2 - CLIENT_ACKNOWLEDGE
- * 3 - DUPS_OK_ACKNOWLEDGE
- * 257 - NO_ACKNOWLEDGE
- * 258 - PRE_ACKNOWLEDGE
- * <tr><td> maxPending <td> 0 <td> The maximum size in bytes, of messages sent but not yet received.
- * Limits the volume of messages currently buffered on the client
- * or broker. Can help scale test clients by limiting amount of buffered
- * data to avoid out of memory errors.
- * </table>
- ...
-
-The most common test case to run is implemented in the class PingAsyncTestPerf, which sends and recieves messages simultaneously. This class uses a PingPongProdicer to do its sending and receiving, and wraps it in a suitable way to make it callable through the extended JUnit test runner. This class also accpets another parameter "batchSize" with a default of "1000". This tells the test how many messages to send before stopping sending and waiting for them all to come back. The actual value entered does not matter too much, but typically values larger than 1000 are used to ensure that there is a reasonable opportunity for simultaneous sending and receiving, and less than 10000 to ensure that each test method invocation does not go on for too long.
-
-The test script parameters can all be seen in the pom.xml file. A three letter code is used on the test scripts, first letter P or T for persistent or transient, second letter Q or T for queue (p2p) or topic (pub/sub), third letter R for reliability tests, C for client scaling tests, M for message size tests.Typically tests run and sample their results for 10 minutes, to get a reasonable measurement of a broker running under a steady load. The tests as configured do not measure 'burst' performance.
-
-The reliability/burn in tests, test the broker running at slightly below its maximum throughput for a period of 24 hours. Their purpose is to check that the broker remains stable under load for a reasonable duration, in order to provide some confidence in the long-term stability of its process. These tests are intended to be run as a two step process. The first two tests run for 10 minutes and are used to asses the broker throughput for the test. The output from these tests are to be fed into the rate limiter for the second set of tests, so that the broker may be set up to run at slightly below its maximum throughput for the 24 hour duration. It is suggested that 90% of the rate achieved by the first two tests should be used for this.
-
-The client scaling tests are split into two sub-sections. The first section tests the performance of increasing numbers of client connections, each sending at a fixed rate. The purpose of this is to determine the brokers saturation load, and to evaluate how its performance degrades uder higher loads. The second section varies the fan-out or fan-in ratio of the number of sending clients to receving clients. This is primarily intended to test the pubsub messaging model, but the tests are also run in p2p mode (with each message being received by one consumer), for completeness and to provide a comparison with the pubsub performance.
-
-The message size scaling tests, examine the brokers performance with different message payload sizes. The purpose of these tests is to evaluate where the broker process switches from being an io-bound to a cpu-bound process (if at all). The expected model is that the amount of CPU processing the broker has to carry out depends largely on the number of messages, and not on their size, because it carries out de-framing and routing for each message header but just copies payloads in-place or in a tight instruction loop. Therefore large message should be io-bound and a constant data rate through the broker should be seen for messages larger than the io/cpu threshold. Small messages require more processing so a constant message rate should be seen for message smaller than the io/cpu threshold. If the broker implementation is extremely efficient the threshold may dissapear altogether and the broker will be purely io-bound.
-The final variation, which is applied to all tests, is to run a transactional and non-transactional version of each. Messages are always batched into transactions of 100 messages each.
-
-Running the entire test suite can take some time, in particular their are about 4 24 hour burn-in tests. There are also 8 30 minute client scaling ramp up tests. If you want to run the test for a short time, to skim test that they work on your environment a command line like the following is usefull:
-
-> find . -name '*.sh' -exec {} -d10S \;
-
-If you want to run just a sub-set of the tests, you can use variations of the above command line. For example, to run just the message size tests using persistent p2p messaging do:
-
-> find . -name 'PPM-*.sh' -exec {} \;
-
-and so on.
-
-Interpreting the Results
-------------------------
-
-TODO: Explain what the results are expected to show and how to look for it. What should be graphed to get a visualization of the broker performance. How to turn the measurements into a description of the performance 'envelope'. \ No newline at end of file
diff --git a/qpid/java/perftests/bin/monitoring/monitor-broker.sh b/qpid/java/perftests/bin/monitoring/monitor-broker.sh
deleted file mode 100755
index 27c8ff25f6..0000000000
--- a/qpid/java/perftests/bin/monitoring/monitor-broker.sh
+++ /dev/null
@@ -1,221 +0,0 @@
-#!/bin/bash
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-#
-# This script starts a broker and then starts additional logging as required.
-# *.pid files are generated in the LOG_DIR for later use by the stop-monitored-broker
-# script.
-#
-# Currently this process starts:
-# - The broker with additional QPID_OPTS for gc logging
-# - Top to monitoring the CPU usage
-#
-# Additional processes can be started and as long as they write a PID into LOG_DIR/*.pid
-# it will be shutdown with the stop script
-#
-
-#
-# Output the broker log file to aid problem diagnosis
-# then exit.
-#
-brokerFailExit()
-{
- echo "Broker failed to start up."
- cat $BROKER_LOG
- exit 1
-}
-
-showUsageExit()
-{
- echo "Usage $0 <Path to Test Broker> <LOG DIR> <CPU Monitor Rate (s)> [Additional options to
- pass to Qpid broker startup]"
- exit 1
-}
-
-#
-# Perform 3 attempts to get the broker PID via ps and grep
-# if unable the output broker log and exit
-#
-getBrokerPID()
-{
- attempts=3
- ready=0
- while [ $ready == 0 ] ; do
-
- PID=`ps auxwww| grep java | grep Xloggc | awk '{print $2}'`
-
- if [ ! $PID == 0 ] ; then
- ready=1
- else
- attempts=$[ $attempts - 1 ]
-
- if [ $attempts == 0 ] ; then
- brokerFailExit
- fi
-
- sleep 1
- fi
- done
-
-}
-
-
-#
-# Additional Check to ensure that the broker process
-# has correctly written 'Ready' to the log file.
-#
-checkBrokerStarted()
-{
- attempts=3
- ready=0
- while [ $ready == 0 ] ; do
-
- grep Ready $BROKER_LOG > /dev/null
-
- if [ $? == 0 ] ; then
- ready=1
- else
- attempts=$[ $attempts - 1 ]
-
- if [ $attempts == 0 ] ; then
- brokerFailExit
- fi
-
- echo "Broker not ready sleeping 1s"
- sleep 1
- fi
- done
-}
-
-#
-# Command Line setup
-#
-
-# Ensure we have minimum of three arguments
-if [[ $# > 2 ]] ; then
- BROKER_VERSION=$1
- LOG_DIR=$2
- CPU_MONITOR_RATE=$3
- # Remove these arguments from the $@ variable
- shift
- shift
- shift
-else
- # If we have no arguments then use these as the default
- CPU_MONITOR_RATE=0.5
- LOG_DIR=$QPID_WORK/logging
- BROKER_VERSION=qpid-0.5
-fi
-
-
-#
-# Check the specified broker is reachable
-# it it is not the log and show usage
-#
-if [ ! -d $BROKER_VERSION ] ; then
- echo "Broker not available at: $BROKER_VERSION"
- showUsageExit
-fi
-
-#
-# Check to see if we have an absolute path for logging
-#
-logStart=`echo $LOG_DIR|cut -c 1`
-
-
-#
-# If we don't have an absolute path then add the current
-# directory path to the start.
-#
-if [[ $logStart != '/' ]] ; then
- echo -n "$LOG_DIR is not absolute, using "
- LOG_DIR=`pwd`/$LOG_DIR
- echo $LOG_DIR
-fi
-
-#
-# Validate that the directory does not exist
-# - this is so we can guarrantee a clean run.
-# If it does exit then log and show usage
-#
-if [ -d $LOG_DIR ] ; then
- echo "Log directory already exists : $LOG_DIR"
- showUsageExit
-fi
-
-#
-# Create the logging directory
-#
-mkdir -p $LOG_DIR
-
-#
-# Variable for broker log
-#
-BROKER_LOG=$LOG_DIR/broker.log
-
-# Variable to hold broker PID
-PID=0
-
-export QPID_OPTS="-Xloggc:$LOG_DIR/gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"
-
-#
-# Start Qpid Broker
-#
-echo "Starting Broker : $BROKER_VERSION"
-pushd $BROKER_VERSION/bin > /dev/null
-./qpid-server $@ 2> $BROKER_LOG >&2 &
-popd > /dev/null
-
-# Wait and check startup was ok
-echo "Waiting for broker startup"
-getBrokerPID
-
-checkBrokerStarted
-
-echo $PID > $LOG_DIR/broker.pid
-
-#
-# Start CPU Monitoring via TOP
-#
-echo "Starting CPU Monitor at RATE:$CPU_MONITOR_RATE on $SERVER1"
-pushd $LOG_DIR > /dev/null
-
-echo $CPU_MONITOR_RATE > top.rate
-
-top -d $CPU_MONITOR_RATE -S -c -p $PID -b > broker_cpu.log &
-
-#
-# Get top pid using $!
-#
-echo $! > $LOG_DIR/top.pid
-
-popd > /dev/null
-
-
-#
-# Generate Stat files
-#
-echo "Generating Stat data"
-stat $BROKER_LOG > $BROKER_LOG.stat
-stat $LOG_DIR/broker_cpu.log > $LOG_DIR/broker_cpu.log.stat
-stat $LOG_DIR/gc.log > $LOG_DIR/gc.log.stat
-
diff --git a/qpid/java/perftests/bin/monitoring/runTests.sh b/qpid/java/perftests/bin/monitoring/runTests.sh
deleted file mode 100755
index 676db0d4fa..0000000000
--- a/qpid/java/perftests/bin/monitoring/runTests.sh
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/bin/bash
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-#
-# Run specified performance tests and
-# gather details about the test run
-#
-
-
-runTest()
-{
- echo "$@"
- echo "$@ --csv -o $LOG_DIR" >> $LOG_DIR/TestRun.log 2>&1
- ./$@ --csv -o $LOG_DIR >> $LOG_DIR/TestRun.log 2>&1
-}
-
-showUsageExit()
-{
- echo "Usage $0 <Path to Test Pack> <LOG DIR> <TEST LIST FILE>"
- exit 1
-}
-
-# Ensure we have minimum of three arguments
-if [[ $# > 2 ]] ; then
- TEST_VERSION=$1
- LOG_DIR=$2
- TEST_LIST=$3
- # Remove these arguments from the $@ variable
- shift
- shift
- shift
-else
- showUsageExit
-fi
-
-#
-# Check the specified broker is reachable
-# it it is not the log and show usage
-#
-if [ ! -d $TEST_VERSION ] ; then
- echo "Tests not available at: $TEST_VERSION"
- showUsageExit
-fi
-
-
-#
-# Check to see if we have an absolute path for logging
-#
-logStart=`echo $LOG_DIR|cut -c 1`
-
-#
-# If we don't have an absolute path then add the current
-# directory path to the start.
-#
-if [[ $logStart != '/' ]] ; then
- echo -n "$LOG_DIR is not absolute, using "
- LOG_DIR=`pwd`/$LOG_DIR
- echo $LOG_DIR
-fi
-
-#
-# Validate that the directory does not exist
-# - this is so we can guarrantee a clean run.
-# If it does exit then log and show usage
-#
-if [ -d $LOG_DIR ] ; then
- echo "Log directory already exists : $LOG_DIR"
- showUsageExit
-fi
-
-#
-# Check to see if we have an absolute path for test list
-#
-testListStart=`echo $TEST_LIST|cut -c 1`
-
-#
-# If we don't have an absolute path then add the current
-# directory path to the start.
-#
-if [[ $testListStart != '/' ]] ; then
- echo -n "$TEST_LIST is not absolute, using "
- TEST_LIST=`pwd`/$TEST_LIST
- echo $TEST_LIST
-fi
-
-#
-# Validate that the directory does not exist
-# - this is so we can guarrantee a clean run.
-# If it does exit then log and show usage
-#
-# -r Check file exists and is readable
-if [ ! -r $TEST_LIST ] ; then
- echo "Test file is not readable : $TEST_LIST"
- showUsageExit
-fi
-
-
-
-#
-# Create the logging directory
-#
-mkdir -p $LOG_DIR
-
-
-
-echo "Starting Test Run in : $TEST_VERSION"
-pushd $TEST_VERSION/bin > /dev/null
-
-#
-# Run tests
-#
-
-
-while read testCommand
-do
- runTest $testCommand
-done < "$TEST_LIST"
-
-
-popd > /dev/null
-
-
-#
-# Generate Stat files
-#
-echo "Generating Stat data"
-for file in `find $LOG_DIR -name "*.csv"` ; do
- stat $file > $file.stat
-done
diff --git a/qpid/java/perftests/bin/monitoring/stop-monitored-broker.sh b/qpid/java/perftests/bin/monitoring/stop-monitored-broker.sh
deleted file mode 100755
index ad882b0bea..0000000000
--- a/qpid/java/perftests/bin/monitoring/stop-monitored-broker.sh
+++ /dev/null
@@ -1,124 +0,0 @@
-#!/bin/bash
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-#
-# Script to stop the running of a monitored broker
-# and the associated monitoring processes.
-#
-# Looks in the specifed directory for pid files and
-# stops those proceses
-#
-
-
-usage()
-{
- echo "Usage: $0 <LOG_DIR>"
-}
-
-#
-# Attempt to gracefully kill processs
-#
-stopRun()
-{
- kill $PIDS
-}
-
-
-#
-# Forcibly stop processes
-#
-forceStopRun()
-{
- kill -9 $PIDS
-}
-
-#
-# Show usage if we are not started correctly
-#
-if [ $# != 1 ] ; then
- usage
- exit 1
-fi
-
-LOG_DIR=$1
-
-
-PIDS=`cat $LOG_DIR/*.pid`
-
-echo "Preparing to stop:"
-#
-# Escape the path so we can use sed to remove it.
-#
-path=`echo $LOG_DIR|sed -e s/\\\//\\\\\\\\\\\//g`
-
-for i in `ls $LOG_DIR/*.pid` ; do
- # Remove path from pid item then remove any final '/'
- echo $i|cut -d '.' -f 1| sed -e s/$path// |tr '/' ' '
-done
-
-status=`ps $PIDS |wc -l`
-
-if [ $status == 1 ] ; then
- echo "Processes do not appear to be running."
- echo "Have they already been stopped?"
- exit 0
-fi
-
-attempts=3
-
-while [ ! $status == 1 ] ; do
- stopRun
- sleep 1
- status=`ps $PIDS |wc -l`
-
- if [ $status == 1 ] ; then
- echo "Done"
- exit 0
- else
- attempts=$[ $attempts - 1 ]
-
- if [ $attempts == 0 ] ; then
- break
- fi
-
- echo "Sleeping as processes not stopped"
- sleep 2
-
- fi
-done
-
-# If we haven't been able to kill the processes then
-# forcibly do it
-if [ ! $status == 1 ] ; then
- forceStopRun
- sleep 1
- status=`ps $PIDS |wc -l`
-
- if [ $status == 1 ] ; then
- echo "Done"
- else
- echo "Stop failed"
- exit 1
- fi
-else
- echo "Done"
-fi
diff --git a/qpid/java/perftests/bin/processing/process.sh b/qpid/java/perftests/bin/processing/process.sh
deleted file mode 100755
index 6dbf9b9ea8..0000000000
--- a/qpid/java/perftests/bin/processing/process.sh
+++ /dev/null
@@ -1,388 +0,0 @@
-#!/bin/bash
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-
-usage()
-{
- echo "usage: process.sh <Qpid Version> <Test Type Queue/Topic/Latency..> <Volume of data %age> <broker details>"
- echo "These parameters are used to title and name the graphs:"
- echo 'Title = $<Qpid Version> $<Test Type> : $<Volume>% volume'
- echo 'File = $<Qpid Version>-$<Broker Details>-$<Test Type>-$<Volume>'
- exit 1
-}
-
-processCMSGCFile()
-{
- # Extract all the ParNew timings: Ignore any lines corrupted by concurrent CMS logging.
- grep -v CMS gc.log|grep ParNew > $work/parnew.gc.log
-
- # Calculate Full GC Data
- grep failure -B 1 gc.log | sed -e :a -e '$!N;s/\n.(concurrent/ /;ta' -e 'P;D' |grep -v ^\- > $work/full.gc.log
- cut -d ':' -f 1 $work/full.gc.log > $work/full.time.log
- sed -e 's/failure)/\#/g' $work/full.gc.log |cut -d '#' -f 2- |awk '{print $3}' > $work/full.dur.log
-
- # Move to the working directory to further process the gathered data.
- pushd $work &> /dev/null
-
- # Extract the Heap and timing data.
- #8 is the full gc data
- #5 is the paranew gc data
- cat parnew.gc.log | awk '{print $8}' | cut -d '(' -f 2 | cut -d 'K' -f 1 > HEAP_MAX.log
- cat parnew.gc.log | awk '{print $8}' | cut -d 'K' -f 1 > HEAP_PRE_GC.log
- cat parnew.gc.log | awk '{print $8}' | cut -d 'K' -f 2 | cut -d '>' -f 2 > HEAP_POST_GC.log
- cat parnew.gc.log | awk '{print $1}' | cut -d ':' -f 1 > GC_TIME.log
-
- calculateStats "MEM_PRE" HEAP_PRE_GC.log
- calculateStats "MEM_POST" HEAP_POST_GC.log
- calculateStatsBC "GC_FREQ" GC_TIME.log
-
-
- # Calculate ParNew GC Cumulative total
- cat parnew.gc.log |awk '{sum=sum+$6; print $6, sum}' > GC_DUR.log
- # Give a count of GC occurances
- parNewGCCount=`wc -l GC_DUR.log| awk '{print $1}'`
-
- # Create the Heap data file
- paste GC_TIME.log HEAP_POST_GC.log HEAP_PRE_GC.log HEAP_MAX.log > GC.Heap.data
- # Create ParNew GC Duration data file for graphing
- paste GC_TIME.log GC_DUR.log > GC.Dur.data
- # Create Full GC occurance log file for plotting
- paste full.time.log full.dur.log > GC.Full.data
-
- # Calculate All GC Timing and give a count of their occurance
- awk '{print $1}' GC_DUR.log > gc_dur.log
- paste GC_TIME.log gc_dur.log > gc_all.log
- cat GC.Full.data >> gc_all.log
- sort -n gc_all.log | awk '{sum=sum+$2;print $1 , sum}' > GC.Dur.All.data
- fullGCCount=`wc -l GC.Full.data| awk '{print $1}'`
-}
-
-processG1GCFile()
-{
- cat gc.log | grep -e \^[0-9]*.[0-9]*\: -e \^.*[0-9]*.\-\> > $work/g1.gc.log
-
- # Move to the working directory to further process the gathered data.
- pushd $work &> /dev/null
-
- # Calculate Full GC Data
- cat g1.gc.log | sed -e :a -e '$!N;s/\n.\ *\[/ \[/;ta' -e 'P;D' > full.gc.log
- grep Full full.gc.log |awk '{print $1}'| tr ':' ' ' > full.time.log
- grep Full full.gc.log |awk '{print $5}' > full.dur.log
- fullGCCount=`wc -l GC.Full.data| awk '{print $1}'`
-
- # Create Full GC occurance log file for plotting
- paste full.time.log full.dur.log > GC.Full.data
-
- # Extract the Heap and timing data.
- # Create G1 Young Duration data file for graphing
- grep "(young)," full.gc.log |awk '{print $1}' | tr ':' ' ' > GC_TIME.log
- grep "(young)," full.gc.log |awk '{print $5}' > young.gc.time.log
- # Calculate G1 young Cumulative total
- cat young.gc.time.log |awk '{sum=sum+$1; print $1, sum}' > GC_DUR.log
- # Create G1 Young Duration data file for graphing
- paste GC_TIME.log GC_DUR.log > GC.Dur.data
-
- # Give a count of GC occurances
- youngGCCount=`wc -l GC_DUR.log| awk '{print $1}'`
-
- #
- # If we have no GCs then something is wrong
- if [ $youngGCCount == 0 ] ; then
- echo "Error no YoungGC log entries to proceses"
- return
- fi
-
- # Gather the Heap Size data
-
- grep "(young)," full.gc.log | awk '{print $8}' | cut -d '(' -f 2 | cut -d ')' -f 1 > HEAP_MAX.Sized.log
- grep "(young)," full.gc.log | awk '{print $8}' | cut -d '-' -f 1 > HEAP_PRE_GC.Sized.log
- grep "(young)," full.gc.log | awk '{print $8}' | cut -d '>' -f 2| cut -d '(' -f 1 > HEAP_POST_GC.Sized.log
-
- normaliseSizeMemFile HEAP_MAX.Sized.log HEAP_MAX.log
- normaliseSizeMemFile HEAP_PRE_GC.Sized.log HEAP_PRE_GC.log
- normaliseSizeMemFile HEAP_POST_GC.Sized.log HEAP_POST_GC.log
-
-
- # Create the Heap data file
- paste GC_TIME.log HEAP_POST_GC.log HEAP_PRE_GC.log HEAP_MAX.log > GC.Heap.data
-
- # Calculate All GC Timing and give a count of their occurance
- awk '{print $1}' GC_DUR.log > gc_dur.log
- paste GC_TIME.log gc_dur.log > gc_all.log
- cat GC.Full.data >> gc_all.log
- sort -n gc_all.log | awk '{sum=sum+$2;print $1 , sum}' > GC.Dur.All.data
-
-}
-
-calculateStatsBC()
-{
-label=$1
-statFile=$2
-# Calculate GC Frequencies
- prevFreq=0
- countFreq=0
- gcFreqTotal=0
- minFreq=99999999
- maxFreq=0
-
- echo "" > GC_FREQ.log
- for time in `cat $statFile` ; do
- if [ $prevFreq == 0 ] ; then
- prevFreq=$time
- else
- freq=`echo $time - $prevFreq | bc`
- echo $freq >> GC_FREQ.log
-
- prevFreq=$time
- gcFreqTotal=`echo $gcFreqTotal + $freq | bc`
- countFreq=$[$countFreq + 1]
-
- if [ `echo "$freq > $maxFreq " | bc` == 1 ] ; then
- maxFreq=$freq
- fi
-
- if [ `echo "$freq < $minFreq " | bc ` == 1 ] ; then
- minFreq=$freq
- fi
- fi
- done
-
- # Extract Min/Max/Avg
- echo "#type:min/max/avg" > $statFile.stats
-
- if [ $countFreq != 0 ] ; then
- avgFreq=`echo $gcFreqTotal / $countFreq | bc -l 2&> /dev/null`
- echo "$label:$minFreq/$maxFreq/$avgFreq" >> $statFile.stats
- echo "Done GC Freq Stat generation for $statFile"
- else
- echo "$label:-/-/-" >> $statFile.stats
- echo "Unable to calculate GC Freq stats as no freq entries found."
- fi
-}
-
-calculateStats()
-{
-label=$1
-statFile=$2
-
-# Calculate GC Frequencies
- count=0
- gcTotal=0
- min=0
- max=0
-
-
- for item in `cat $statFile` ; do
- if [ $min == 0 ] ; then
- min=$item
- fi
-
- gcTotal=$[$gcTotal + $item]
- count=$[$count + 1]
-
- if [ $item -gt $max ] ; then
- max=$item
- fi
-
- if [ $item -lt $min ] ; then
- min=$item
- fi
- done
-
- # Extract Min/Max/Avg
- echo "#type:min/max/avg" > $statFile.stats
-
- if [ $count != 0 ] ; then
- avg=`echo $gcTotal / $count | bc -l`
-
- echo "$label:$min/$max/$avg" >> $statFile.stats
- echo "Done $label Stat generation for $statFile"
- else
- echo "$label:-/-/-" >> $statFile.stats
- echo "Unable to calculate $label stats as no entries found."
- fi
-
-}
-
-#
-# Take an input file ($1) of lines
-# <value><K|M>
-# and output file $2 of <value> in whole M
-#
-normaliseSizeMemFile()
-{
-rm -f $2
-for i in `cat $1` ; do
- if [[ `echo $i | grep -c "K" ` == 1 ]] ; then
- kb=`echo $i|cut -d 'K' -f 1`
- echo $[ $kb / 1024 ] >> $2
- else
- echo $i|cut -d 'M' -f 1 >> $2
- fi
-done
-
-
-}
-
-
-# Parse command line
-# TODO more advanced processing
-# Check we have enough parameters
-if [ $# != 4 ] ; then
- # Take one arg to be a graph data file.
- if [ $# == 1 ] ; then
- textArray[0]="" # hold text
- length=0
- # read whole file in loop
- while read line
- do
- textArray[$length]=$line # store line
- length=$(expr $length + 1) # increase length by 1
- done < $1
-
- if [ $length != 2 ] ; then
- usage
- fi
-
- #Get Title and file name
- title=${textArray[0]}
- file=${textArray[1]}
-
- pushd `dirname $1`
-
- else
- usage
- fi
-else
- version=$1
- type=$2
- volume=$3
- brokerState=$4
-
-
- # Configure Graph Title and image file names
- title="$version $type : $volume% volume"
- file="$version-$brokerState-$type-$volume"
-fi
-
-work=work
-
-mkdir -p $work
-
-echo -n "Processing GC Usage Data : "
-ParNew=`grep -c ParNew gc.log`
-
-if [ $ParNew != 0 ] ; then
- echo "CMS log file"
- processCMSGCFile
- PLOT="\"GC.Dur.data\" with lines axis x1y1 ti \"ParNew GC Time ($parNewGCCount)\", "
-else
- echo "G1 log file"
- processG1GCFile
- PLOT="\"GC.Dur.data\" with lines axis x1y1 ti \"G1 Young Time ($youngGCCount)\", "
-fi
-
-#
-# Colate Stats
-#
-echo -n "Colating stat Data : "
-echo "#type:min/max/avg" > $file.statistics.txt
-find .. -name "*stats" -exec grep -v "type" {} >> $file.statistics.txt \;
-
-
-# Prepare the plot command
-# If a Full GC occured during this test then plot those
-if [[ $fullGCCount > 0 ]] ; then
-PLOT=$PLOT"\"GC.Dur.data\" using 1:3 with lines axis x1y2 ti \"Cumulative Total Time(ParNew)\", \
- \"GC.Dur.All.data\" with lines axis x1y2 ti \"Cumulative Total Time(All)\", \
- \"GC.Full.data\" with points ti \"Full GCs Time ($fullGCCount)\" "
-else
-PLOT=$PLOT"\"GC.Dur.data\" using 1:3 with lines axis x1y2 ti \"Cumulative Total Time(ParNew)\", \
- \"GC.Dur.All.data\" with lines axis x1y2 ti \"Cumulative Total Time(All)\" "
-fi
-
-if [ $ParNew != 0 ] ; then
- gcs=$parNewGCCount
-else
- gcs=$youngGCCount
-fi
-
-# Call out to gnuplot to generate graphs
-# Only do this if we have data
-if [ $gcs != 0 ] ; then
- # Generate the Heap Graph and the GC Duration Graph
- gnuplot << EOGNUPLOT
-set xlabel "Run Time(s)"
-
-set title "$title : Heap Size"
-set term png
-set output "$file-Heap.png"
-set ylabel "MB" +0.5,0
-plot "GC.Heap.data" using 1:2 with lines axis x1y1 ti "GC Size Post",\
- "GC.Heap.data" using 1:4 with lines axis x1y1 ti "GC Size Max ", \
- "GC.Heap.data" using 1:3 with lines axis x1y1 ti "GC Size Pre "
-
-set y2tics nomirror
-set ytics nomirror
-set key top left
-set title "$title GC Time"
-set ylabel "Time(s)" +0.5,0
-set y2label "Total Time(s)"
-set output "$file-GCDuration.png"
-plot $PLOT
-EOGNUPLOT
-
-else
- echo "Warning: No GC Data to graph"
-fi
-
-# pop back to further process for CPU usage
-popd &> /dev/null
-
-echo "Processing CPU Usage Data"
-
-# CPU.data is just TimeStamp + %age
-cat broker_cpu.log |awk '{print $1 "T" $2 " " $3}' > $work/CPU.data
-
-# Move to work directory to run gnuplot
-pushd $work &> /dev/null
-
-# Call out to gnuplot to generate graphs
-# Generate the Heap Graph and the GC Duration Graph
-gnuplot << EOGNUPLOT
-set term png
-set title "$title : CPU"
-set output "$file-CPU.png"
-unset key
-set xlabel "Real Time(h:m)"
-set ylabel "Usage(%)"
-
-set xdata time
-set timefmt "%Y-%m-%dT%H:%M:%S"
-set format x "%H:%M"
-plot "CPU.data" using 1:2 with lines
-EOGNUPLOT
-
-#"
-# Pop out of $work directory.
-#
-popd &> /dev/null \ No newline at end of file
diff --git a/qpid/java/perftests/bin/processing/processAll.sh b/qpid/java/perftests/bin/processing/processAll.sh
deleted file mode 100755
index 895d59c316..0000000000
--- a/qpid/java/perftests/bin/processing/processAll.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/bash
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-
-usage()
-{
- echo "processResults.sh <search dir>"
- exit 1
-}
-
-root=`pwd`
-echo $root
-graphFile=graph.data
-
-if [ $# != 1 ] ; then
- usage
-fi
-
-mkdir -p results
-
-for file in `find $1 -name $graphFile` ; do
-
- dir=`dirname $file`
-
- echo Processing : $dir
- pushd $dir &> /dev/null
-
- $root/process.sh $graphFile
-
- echo Copying Images
- cp work/*png $root/results/
-
- echo Copying Stats
- cp work/*.statistics.txt $root/results/
-
-
- popd &> /dev/null
- echo Done
-done \ No newline at end of file
diff --git a/qpid/java/perftests/bin/processing/processTests.py b/qpid/java/perftests/bin/processing/processTests.py
deleted file mode 100755
index 8db44eda79..0000000000
--- a/qpid/java/perftests/bin/processing/processTests.py
+++ /dev/null
@@ -1,850 +0,0 @@
-#!/usr/bin/env python
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import os
-import re
-import datetime
-import sys
-import string
-from optparse import OptionParser
-from datetime import datetime, timedelta
-import shutil
-
-
-def showUsage():
- log("./processTests.py [-b|--broker-log-dir] <dir> [-t|--test-dir] <dir>")
-
-
-ACCESS="Access"
-MODIFY="Modify"
-
-BROKER_LOG="broker.log"
-BROKER_PID="broker.pid"
-BROKER_CPU="broker_cpu.log"
-BROKER_CPU_DATED="broker_cpu.log.dated"
-BROKER_STATS="broker.stats"
-BROKER_GC="gc.log"
-
-GRAPH_DATA="graph.data"
-
-_verbose = False
-_debug = False
-_brokerLogs = ""
-
-def exitError(message):
- log(message)
- sys.exit(1)
-
-def main():
- global _log, _verbose, _debug, _brokerLogs
-
- # Load the
- parser = OptionParser()
-
- parser.add_option("-v", "--verbose", dest="verbose",
- action="store_true", default=False, help="enable verbose output")
-
- parser.add_option("-d", "--debug", dest="debug",
- action="store_true", default=False, help="enable debug output")
-
- parser.add_option("-b", "--broker-log-dir", dest="brokerLogs",
- action="store", default=True, help="Broker Logs")
-
- parser.add_option("-t", "--test-dir", dest="testDir",
- action="store", default="", help="Test Results")
-
-
- (options, args) = parser.parse_args()
-
- _verbose = options.verbose
- _debug = options.debug
- testDir = options.testDir
- _brokerLogs = options.brokerLogs
-
- if testDir == "" or _brokerLogs == "" :
- log("Broker Log Dir and Test Dir are both requried.")
- showUsage()
-
- if not os.path.exists(testDir):
- exitError("Test directory does not exist:" + testDir)
-
- if not os.path.exists(_brokerLogs):
- exitError("Broker log directory does not exist:" + _brokerLogs)
-
-
- # Standardize the format of the broker logs
- preProcessBrokerLogs(_brokerLogs)
-
- # Get list of test results from test_dir
- processTestResults(testDir)
-
-#
-# Process the log files we know of
-#
-def preProcessBrokerLogs(resultDir):
-
- print "Pre Processing Broker Logs"
- # Pre-Process GC - no pre processing required
-
- # Process Log4j - no processing required as file is already time stamped.
-
- # Pre-Process broker_cpu
- processCPUUsage(resultDir)
-
-#
-# Process the broker CPU log file and create an output file of format
-# <Date Time> <CPU Usage>
-#
-#
-def processCPUUsage(resultDir):
- logfile=resultDir+os.sep+BROKER_CPU
- datedFile=resultDir+os.sep+BROKER_CPU_DATED
-
- start = extractTime(ACCESS, logfile+".stat")
-
- pid = getPID(BROKER_PID)
-
- topRate = getFirstLine(_brokerLogs+os.sep+"top.rate")
-
- #
- # Calulate addition required per process line output
- #
- if topRate.find(".") == -1:
- seconds = topRate
- millis = 0
- else:
- split = topRate.split('.')
- seconds = split[0]
- # Convert
- millis = float("0."+split[1]) * 1000
-
- offset = timedelta(seconds=int(seconds),milliseconds=int(millis))
-
- #
- # Process the CPU log file and make a file of format:
- # datetime <CPU% usage> <MEM% usage>
- #
- # Open log CPU file for reading
- logfile = open(logfile, "r")
-
- # Open the output file, erasing any existing version
- # Keep track of the min/max sum and entries,.
- minCPU=float(sys.maxint)
- maxCPU=0.0
- minMem=float(sys.maxint)
- maxMem=0.0
-
- entries=0
- sumCPU=0.0
- sumMem=0.0
-
- output= open(datedFile, "w")
- for line in logfile:
- #
- # Data format
- # 0 1 2 3 4 5 6 7 8 9 10 11
- # PID USER PR NI %CPU TIME+ %MEM VIRT RES SHR S COMMAND
- # PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- #
- # %CPU and %MEM are vary, probably based on os/version of top.
- # lets auto-detect where it is.
- #
- # Index is 0 based for array usage.
- index = 0
- if line.find("PID") != -1:
- for key in line.split(" "):
- strippedKey = key.lstrip()
- if len(strippedKey) > 0:
- # Record the key index
- if (strippedKey == "%CPU"):
- cpuIndex=index
- if (strippedKey == "%MEM"):
- memIndex=index
- # Increase count for next key
- index = index + 1
-
-
- # Find lines that contain our broker process
- if line.find("QPBRKR") != -1:
-
- # Split line on whitespace
- data = line.split()
-
- #Write out the date time (ISO-8601 format)
- output.write(str(start))
- # Output the %CPU value
- output.write(" "+str(data[cpuIndex]))
- # Output the %MEM value
- output.write(" "+str(data[memIndex]))
- output.write('\n')
-
- # Add the offset based on the logging rate
- start = start + offset
-
- # Record entires
- entries = entries + 1
-
- # Record Metrics
- # Record CPU data
- cpu = float(data[cpuIndex])
- if (cpu < minCPU):
- minCPU = cpu
-
- if (cpu > maxCPU):
- maxCPU = cpu
-
- sumCPU = sumCPU + cpu
-
- # Record Mem data
- mem = float(data[memIndex])
-
- if (mem < minMem):
- minMem = mem
-
- if (mem > maxMem):
- maxMem = mem
-
- sumMem = sumMem + mem
-
-
- #end for
-
- # Close the files
- logfile.close
- output.close
-
- # Output stats file
- statFile=resultDir+os.sep+BROKER_CPU+".stats"
- output= open(statFile, "w")
- output.write("#type:min/max/avg")
- output.write('\n')
- output.write("CPU:"+str(minCPU)+"/"+str(maxCPU)+"/"+str(float(sumCPU)/float(entries)))
- output.write('\n')
- output.write("MEM:"+str(minMem)+"/"+str(maxMem)+"/"+str(float(sumMem)/float(entries)))
- output.write('\n')
- output.close
-
- log("Pre Process of CPU Log file '"+BROKER_CPU+"' complete")
-
-
-#
-# Give an known process type get the recorded PID.
-#
-def getPID(process):
- return getFirstLine(_brokerLogs+os.sep+process)
-
-#
-# Get the first line of the file without EOL chars.
-# NOTE: this will load the entire file into memory to do it.
-#
-def getFirstLine(fileName):
- f = open(fileName,"r")
- line = f.read().splitlines()[0]
- f.close
- return line
-
-
-#
-# Walk the directory given and process all csv test results
-#
-def processTestResults(resultDir):
- for root, dirs, files in os.walk(resultDir, topdown=False):
- if len(files) == 0:
- exitError("Test result directory is empty:" + resultDir)
- for file in files:
- if file.endswith(".csv"):
- processTestResult(root , file)
-
-def processTestResult(root, resultFile):
- # Open stat file and extract test times, we determine:
- # -start time based on the 'Access' value
- # -end time based on the 'Modify' value 'Change' would also work
-
- statFile=root+os.sep+resultFile+".stat"
-
- if not os.path.exists(statFile):
- log("Unable to process : Unable to open stat file:" + statFile)
- return
-
-
- createResultSetPackage(root, resultFile)
-
-
-def extractTime(field, statFile):
- stats = open(statFile, "r")
- for line in stats:
- if line.startswith(field):
- if line.find("(") == -1:
- dt = lineToDate(" ".join(line.split()[1:]))
-
- #
- # TODO We need to handle time time zone issues as I'm sure we will have issues with the
- # log4j matching.
-
- stats.close
- return dt
-
-#
-# Given a text line in ISO format convert it to a date object
-#
-def lineToDate(line):
- #2009-06-22 17:04:44,320
- #2009-06-22 17:04:44.320
- pattern = re.compile(r'(?P<year>^[0-9][0-9][0-9][0-9])-(?P<month>[0-9][0-9])-(?P<day>[0-9][0-9]) (?P<hour>[0-9][0-9]):(?P<minute>[0-9][0-9]):(?P<seconds>[0-9][0-9])')
-
-
- m = pattern.match(line)
- if m:
- year = int(m.group('year'))
- month = int(m.group('month'))
- day = int(m.group('day'))
- hour = int(m.group('hour'))
- minute = int(m.group('minute'))
- seconds = int(m.group('seconds'))
-
- pattern = re.compile(r'(?P<year>^[0-9][0-9][0-9][0-9])-(?P<month>[0-9][0-9])-(?P<day>[0-9][0-9]) (?P<hour>[0-9][0-9]):(?P<minute>[0-9][0-9]):(?P<seconds>[0-9][0-9])[.|,](?P<micro>[0-9]+)')
- m = pattern.match(line)
- micro = None
- if m:
- micro = m.group('micro')
-
- if micro == None:
- micro = 0
-
- # Correct issue where micros are actually nanos
- if int(micro) > 999999:
- micro = int(micro) / 1000
-
- return datetime(year,month,day,hour,minute,seconds,int(micro))
- else:
- # Error we shouldn't get here
- return null
-
-def createResultSetPackage(root, resultFile):
- # Get the Name of the test to make a directory with said name
- testName = resultFile.split(".csv")[0]
- resultDir = root+ os.sep + testName
-
- log("Processing Result set for:"+ testName)
-
- mkdir(resultDir)
-
- # Move result file to new directory
- shutil.move(root + os.sep + resultFile, resultDir)
-
- # Move stat file to new directory
- shutil.move(root + os.sep + resultFile + ".stat", resultDir)
-
- statFile=resultDir + os.sep + resultFile + ".stat"
-
- #
- # Get start and end time for test run
- #
- start = extractTime(ACCESS, statFile)
- end = extractTime(MODIFY, statFile)
-
- sliceBrokerLogs(resultDir, start, end)
- createGraphData(resultDir, testName)
- createTestStatData(resultDir, testName)
-
- log("Created Result Package for:"+ testName)
-
-def sliceBrokerLogs(resultDir, start, end):
- sliceCPULog(resultDir, start, end)
- sliceLog4j(resultDir, start, end)
- sliceGCLog(resultDir, start, end)
-
-
-def sliceCPULog(resultDir, start, end):
- global _brokerLogs
- logfilePath=_brokerLogs+os.sep+BROKER_CPU_DATED
- cpuSliceFile=resultDir+os.sep+BROKER_CPU
-
- # Process the CPU log file and make a file of format:
- # datetime <CPU% usage> <MEM% usage>
- #
- # Open log CPU file for reading
- logFile = open(logfilePath, "r")
-
- # Open the output file, erasing any existing version
- # Keep track of the min/max sum and entries,.
- minCPU=float(sys.maxint)
- maxCPU=0.0
- minMem=float(sys.maxint)
- maxMem=0.0
-
- entries=0
- sumCPU=0.0
- sumMem=0.0
-
- #
- # Create outputfile
- #
- cpuslice = open(cpuSliceFile,"w")
- for line in logFile:
- data = line.split()
- #
- # //fixme remove tz addition.
- #
- lineTime = lineToDate(" ".join(data[0:2])+" +0000")
-
- if lineTime > start:
- if lineTime < end:
- # Write the data though to the new file
- cpuslice.writelines(line)
-
- # Perform stat processing for the min/max/avg
-
- data = line.split()
-
- #
- # Data format is
- # <Date> <Time> <%CPU> <%MEM>
- # 2010-02-19 10:16:17 157 28.1
- #
- cpuIndex = 2
- memIndex = 3
-
- # Record entires
- entries = entries + 1
-
- # Record Metrics
- # Record CPU data
- cpu = float(data[cpuIndex])
- if (cpu < minCPU):
- minCPU = cpu
-
- if (cpu > maxCPU):
- maxCPU = cpu
-
- sumCPU = sumCPU + cpu
-
- # Record Mem data
- mem = float(data[memIndex])
-
- if (mem < minMem):
- minMem = mem
-
- if (mem > maxMem):
- maxMem = mem
-
- sumMem = sumMem + mem
-
- logFile.close()
- cpuslice.close()
- log("Sliced CPU log")
-
- # Output stats file
- statFile=cpuSliceFile+".stats"
- output= open(statFile, "w")
- output.write("#type:min/max/avg")
- output.write('\n')
- output.write("CPU:"+str(minCPU)+"/"+str(maxCPU)+"/"+str(float(sumCPU)/float(entries)))
- output.write('\n')
- output.write("MEM:"+str(minMem)+"/"+str(maxMem)+"/"+str(float(sumMem)/float(entries)))
- output.write('\n')
- output.close
-
- log("Generated stat data from CPU Log file")
-
-
-def sliceGCLog(resultDir, start, end):
- global _brokerLogs
- logfilePath=_brokerLogs+os.sep+BROKER_GC
- sliceFile=resultDir+os.sep+BROKER_GC
-
- gcstart = extractTime(ACCESS, logfilePath+".stat")
-
- # Open the output file, erasing any existing version
- # Keep track of the min/max sum and entries,.
- minGCDuration=float(sys.maxint)
- maxGCDuration=0.0
- sumGCDuration=0.0
- entriesGCDuration = 0
-
-
- # Open log GC file for reading
- logFile = open(logfilePath, "r")
-
- # Open the output file, erasing any existing version
- output= open(sliceFile, "w")
-
- # Use a regular expression to pull out the Seconds.Millis values from the
- # Start of the gc log line.
- pattern = re.compile(r'(?P<seconds>^[0-9]+)\.(?P<millis>[0-9]+):')
-
- for line in logFile:
- m = pattern.match(line)
-
- if m:
- seconds = m.group('seconds');
- millis = m.group('millis');
-
- offset = timedelta(seconds=int(seconds),milliseconds=int(millis))
-
- lineTime = gcstart + offset
-
- if lineTime > start:
- if lineTime < end:
- output.writelines(line)
- # Perform stat processing for the min/max/avg
-
- # Process GC Duration lines in ParNew gc ,
- # ensure we do not have CMS printed as that means the line line has been corrupted
- if line.find("ParNew") != -1 & line.find("CMS") == -1:
-
- #
- # Example data line
- # 7.646: [GC 7.646: [ParNew: 14778K->461K(14784K), 0.0026610 secs] 49879K->36609K(73288K), 0.0027560 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
- #
- # So entry 5 is the ParNew time and 8 is the whole GC cycle. 14 entries total
-
- data = line.split()
-
- gcTime = 0
- # Check we have a valid ParNew Line
- if (len(data) == 15):
-
- # Record entires
- # Record GC Duration data
-
- entriesGCDuration = entriesGCDuration + 1
- gcTime = float(data[8])
-
- if (gcTime < minGCDuration):
- minGCDuration = gcTime
-
- if (gcTime > maxGCDuration):
- maxGCDuration = gcTime
-
- sumGCDuration = sumGCDuration + gcTime
-
-
-
- # Close the files
- logFile.close
- output.close()
-
- log("Sliced gc log")
-
- # Output stats file
- statFile=sliceFile+".stats"
- output= open(statFile, "w")
- output.write("#type:min/max/avg")
- output.write('\n')
- #
- # Only provide GCDuration if it was processed
- #
- output.write("GC_DUR:%.14f/%.14f/%.14f" % (minGCDuration, maxGCDuration , (sumGCDuration/float(entriesGCDuration))))
- output.write('\n')
- output.close
-
- log("Generated stat data from CPU Log file")
-
-
-def sliceLog4j(resultDir, start, end):
- global _brokerLogs
- logfilePath=_brokerLogs+os.sep+BROKER_LOG
- log4jSliceFile=resultDir+os.sep+BROKER_LOG
-
- log4jstart = extractTime(ACCESS, logfilePath+".stat")
-
- #
- # Say that first line is the start of the file,
- # This value will give a time value to the initial
- # logging before Log4j kicks in.
- #
- lineTime = log4jstart
-
- # Process the broker log4j file
- # Open log CPU file for reading
- logFile = open(logfilePath, "r")
-
- #
- # Create outputfile
- #
- log4jslice = open(log4jSliceFile,"w")
-
- for line in logFile:
- data = line.split()
-
- #
- # If the line has a time at the start then process it
- # otherwise use the previous time. This means if there is
- # a stack trace in the middle of the log file then it will
- # be copied over to the split file as long as it is in the
- # split time.
- #
- if (hasTime(data)):
- #
- # //fixme remove tz addition.
- #
- lineTime = lineToDate(" ".join(data[0:2])+" +0000")
-
- if lineTime > start:
- if lineTime < end:
- print line
- log4jslice.writelines(line)
-
- logFile.close()
- log4jslice.close()
- log("Sliced broker log")
-
-
-#
-# Check the first two entries of data can make a datetime object
-#
-def hasTime(data):
- date = data[0]
- time = data[1]
-
- # Examples:
- # 2009-06-22 17:04:44,246
- # 2009-06-22 17:04:44.2464
- # 2009-06-22 17:04:44
-
- # ISO-8601 '-' format date
- dateRE = re.compile('[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]')
-
- #
- # Check for times with/out millis
- # e.g.
- # 10:00:00,000 - log4j
- # 10:00:00.0000 - generated in script for cpu time
- #
- timeRE = re.compile('[0-9][0-9]:[0-9][0-9]:[0-9][0-9]?[0-9]*')
-
- return dateRE.match(date) and timeRE.match(time)
-
-def createGraphData(resultDir, testName):
- # Create graph.data file for process.sh
- # Format two lines : Title and filename
- # $version $type : $volume% volume
- # $version-$brokerState-$type-$volume
- version=getBrokerVersion()
-
- test= extractTestValue("n",resultDir, testName)
- volume = int(float(extractTestResult("Test * Size Throughput", resultDir, testName)) * 1000)
- messageSize = extractTestValue("messageSize",resultDir, testName)
- ackMode = ackModeToString(extractTestValue("consAckMode",resultDir, testName))
-
- graphDataFile=resultDir+os.sep+GRAPH_DATA
-
- graphData = open(graphDataFile, "w")
-
- #
- # Write Title
- graphData.write(version+":"+test+":"+str(messageSize)+"kb x "+str(volume)+" msg/sec using "+ackMode)
- graphData.write('\n')
-
- #
- # Write FileName
- graphData.writelines(version+"-"+testName)
- graphData.write('\n')
- graphData.close
- log("Created graph.data")
-
-
-def getBrokerVersion():
- global _brokerLogs
- READY = "Qpid Broker Ready"
- brokerLogFile = _brokerLogs + os.sep + BROKER_LOG
-
- log = open(brokerLogFile, "r")
-
- dataLine = ""
- for line in log:
- if line.find(READY) != -1:
- dataLine = line
- break
-
- # Log Entry
- #2009-06-19 17:04:02,493 INFO [main] server.Main (Main.java:456) - Qpid Broker Ready :2.3.0.1 build: 727403M
- # Split on READY
- data = dataLine.split(READY)
-
- # So [1] should be
- # :2.3.0.1 build: 727403M
- readyEntries = data[1].split()
-
- # so spliting on white space should give us ':version'
- # and a quick split on ':' will give us the version
- version = readyEntries[0].split(':')[1]
-
- # Strip to ensure we have no whitespace
- return version.strip()
-
-
-def extractTestValue(property,resultDir,testName):
- return extractTestData(property,resultDir,testName," =")
-
-def extractTestResult(property,resultDir,testName):
- return extractTestData(property,resultDir,testName,":")
-
-def extractTestData(property,resultDir,testName,type):
- resultFile = resultDir + os.sep + testName+".csv"
-
- results = open(resultFile, "r")
-
- dataLine = ""
- for line in results:
- if line.find("Total Tests:") == 0:
- dataLine = line
-
- results.close()
-
- # Data is CSV
- data = dataLine.split(',')
-
- found = False
- result = ""
- searchProperty = property+type
-
- for entry in data:
- if found:
- result = entry
- break
- if entry.strip() == searchProperty:
- found=True
-
- return result.strip()
-
-def createTestStatData(resultDir, testName):
- csvFilePath=resultDir + os.sep + testName + ".csv"
-
- # Open the output file, erasing any existing version
- # Keep track of the min/max sum and entries,.
- minLatency=float(sys.maxint)
- maxLatency=0.0
- minThroughput=float(sys.maxint)
- maxThroughput=0.0
-
- entries=0
- sumLatency=0.0
- sumThroughput=0.0
-
- #
- # Open csv File
- #
- csvFile = open(csvFilePath,"r")
- for line in csvFile:
-
- # The PingAsyncTestPerf test class outputs the latency and throughput data.
- if line.find("PingAsyncTestPerf") != -1:
- #
- # Data format is
- # <Test> <TestName> <Thread> <Status> <Time> <Latency> <Concurrency> <Thread> <TestSize>
- #org.apache.qpid.ping.PingAsyncTestPerf, testAsyncPingOk, Dispatcher-Channel-1, Pass, 209.074, 219.706, 0, 1, 10
- LatencyIndex = 5
- ThroughputIndex = 4
-
- # The PingLatencyTestPerf test class just outputs the latency data.
- if line.find("PingLatencyTestPerf") != -1:
- #
- # Data format is
- # <Test> <TestName> <Thread> <Status> <Time> <Latency> <Concurrency> <Thread> <TestSize>
- # org.apache.qpid.ping.PingLatencyTestPerf, testPingLatency, Dispatcher-Channel-1, Pass, 397.05502, 0, 2, 1000
- LatencyIndex = 4
- ThroughputIndex = -1
-
-
- # Only process the test lines that have 'org.apache.qpid.ping', i.e. skip header and footer.
- if line.find("org.apache.qpid.ping") != -1:
- # Perform stat processing for the min/max/avg
- data = line.split(",")
-
- # Record entires
- entries = entries + 1
-
- # Record Metrics
- # Record Latency data
- latency = float(data[LatencyIndex])
- if (latency < minLatency):
- minLatency = latency
-
- if (latency > maxLatency):
- maxLatency = latency
-
- sumLatency = sumLatency + latency
-
- if (ThroughputIndex != -1):
- # Record Latency data
- throughput = float(data[ThroughputIndex])
- if (throughput < minThroughput):
- minThroughput = throughput
-
- if (throughput > maxThroughput):
- maxThroughput = throughput
-
- sumThroughput = sumThroughput + throughput
-
-
- csvFile.close()
-
- # Output stats file
- statFile=resultDir + os.sep + testName+".stats"
- output= open(statFile, "w")
- output.write("#type:min/max/avg")
- output.write('\n')
- output.write("LATENCY:"+str(minLatency)+"/"+str(maxLatency)+"/"+str(float(sumLatency)/float(entries)))
- output.write('\n')
-
- if (ThroughputIndex != -1):
- # Output msgs/sec based on time for a batch of msgs
- output.write("THROUGHPUT:"+str(float(1000)/maxThroughput)+"/"+str(float(1000)/minThroughput)+"/"+str(float(1000)/(float(sumThroughput)/float(entries))))
- output.write('\n')
-
- output.close
-
- log("Generated stat data from test "+testName+" CSV file")
-
-
-def ackModeToString(ackMode):
- if ackMode == '0':
- return "Transacted"
- elif ackMode == '1':
- return "AutoAck"
- elif ackMode == '2':
- return "ClientAck"
- elif ackMode == '3':
- return "DupsOK"
- elif ackMode == '257':
- return "NoAck"
- elif ackMode == '258':
- return "PreAck"
- else:
- return str(ackMode)
-
-
-
-def debug(msg):
- global _debug
- if _debug:
- log(msg)
-
-def log(msg):
- print msg
-
-def mkdir(dir):
- if not os.path.exists(dir):
- os.mkdir(dir)
-
-if __name__ == "__main__":
- main() \ No newline at end of file
diff --git a/qpid/java/perftests/bin/run_many.sh b/qpid/java/perftests/bin/run_many.sh
deleted file mode 100755
index cca2ffec21..0000000000
--- a/qpid/java/perftests/bin/run_many.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-
-# args:
-# <number of processes to start>
-# <name of run>
-# <command ro run>
-
-for i in `seq 1 $1`; do
- $3 >$2.$i.out 2>>$2.err &
- echo $! > $2.$i.pid
-done;
diff --git a/qpid/java/perftests/bin/topicListener.sh b/qpid/java/perftests/bin/topicListener.sh
deleted file mode 100755
index 3a925910ad..0000000000
--- a/qpid/java/perftests/bin/topicListener.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-
-# XXX -Xmx512m -Xms512m -XX:NewSize=150m
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java \
- JAVA_VM=-server \
- JAVA_MEM="-Xmx128m -Dlog4j.configuration=$HOME/log4j.properties" \
- JAVA_GC="-XX:-UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError" \
- QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Damqj.logging.level="INFO" org.apache.qpid.oldtopic.Listener $*
diff --git a/qpid/java/perftests/bin/topicPublisher.sh b/qpid/java/perftests/bin/topicPublisher.sh
deleted file mode 100755
index e4e9981a75..0000000000
--- a/qpid/java/perftests/bin/topicPublisher.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# XXX -Xmx512m -Xms512m -XX:NewSize=150m
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java \
- JAVA_VM=-server \
- JAVA_MEM=-Xmx128m \
- JAVA_GC="-XX:-UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError" \
- QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Damqj.logging.level="INFO" org.apache.qpid.oldtopic.Publisher $*
diff --git a/qpid/java/perftests/build.xml b/qpid/java/perftests/build.xml
index 497bfc8035..75d75b4f5a 100644
--- a/qpid/java/perftests/build.xml
+++ b/qpid/java/perftests/build.xml
@@ -7,9 +7,9 @@
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- -
+ -
- http://www.apache.org/licenses/LICENSE-2.0
- -
+ -
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -19,8 +19,15 @@
-
-->
<project name="Performance Tests" default="build">
+ <condition property="perftests.optional.test.depends" value="bdbstore" else="">
+ <and>
+ <contains string="${modules.opt}" substring="bdbstore"/>
+ <contains string="${profile}" substring="bdb"/>
+ </and>
+ </condition>
- <property name="module.depends" value="systests client broker common common/test junit-toolkit"/>
+ <property name="module.depends" value="client common"/>
+ <property name="module.test.depends" value="systests broker common/test management/common ${perftests.optional.test.depends}"/>
<import file="../module.xml"/>
@@ -30,310 +37,5 @@
<property name="qpid.logging.level" value="-Damqj.logging.level=warn"/>
<property name="log4j.config" value="-Dlog4j.configuration=perftests.log4j"/>
<property name="properties" value="perftests.properties"/>
- <property name="scripts.dir" value="${build.bin}/${module.name}"/>
-
- <condition property="results" value="${result-path}/results" else="${project.root}/${module}/results">
- <isset property="result-path"/>
- </condition>
-
- <property name="scripts.timestamp" location="${build.scratch}/perftests/scripts.timestamp" />
-
- <target name="check_scripts_uptodate">
- <uptodate property="scripts.notRequired" targetfile="${scripts.timestamp}">
- <srcfiles dir="${scripts.dir}" includes="**.sh" />
- <srcfiles dir="${project.root}/perftests/" includes="scripts.xml" />
- </uptodate>
- </target>
-
- <target name="precompile" depends="check_scripts_uptodate" unless="scripts.notRequired">
- <mkdir dir="${scripts.dir}"/>
- <jython path="${mllib.dir}">
- <args>
- <arg value="generate-scripts"/>
- <arg value="scripts.xml"/>
- <arg value="${scripts.dir}"/>
- </args>
- </jython>
- <touch file="${scripts.timestamp}" />
- </target>
-
- <target name="all-tests" depends="all-queue-tests,all-topic-tests"/>
-
- <target name="all-queue-tests" depends="Queue-Duration-Persistent,Queue-Concurrent,
- Queue-Duration,Queue-Latency,Queue-Duration-Transacted,Queue-LargeMessage-Persistent"/>
-
- <target name="all-topic-tests" depends="Topic-Concurrent,Topic-Duration,Topic-Latency,
- Topic-Duration-Transacted"/>
-
- <!-- Queue tests -->
-
- <!--
- Send 10000 (.5K) messages and measure the time for receiving 1000 messages (10 intervals)
- the overall latency is also calculated (See Test * Size Throughput)
- Note that "Test Throughput" is the average time for receiving 1000 messages
- -->
- <target name="Queue-Latency" depends="build" description="Run Queue-Latency">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-n Queue-Latency"/>
- <arg value="-s[10000]"/>
- <arg value="-t testPingLatency"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingLatencyTestPerf"/>
- <arg value="rate=100"/>
- <arg value="batchSize=1000"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one producer/consumer pair
- for sending and receiving 10000 transient messages.
- The test last for 5 minutes.
- -->
- <target name="Queue-Duration" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Queue-Duration"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one producer/consumer pair
- for sending and receiving 10000 0.5K persistent messages.
- The test last for 5 minutes.
- -->
- <target name="Queue-Duration-Persistent" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Queue-Duration-Persistent"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="persistent=true"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one producer/consumer pair
- for sending and receiving 10000 100K persistent messages.
- The test last for 5 minutes.
- -->
- <target name="Queue-LargeMessage-Persistent" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Queue-LargeMessage-Persistent"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="persistent=true"/>
- <arg value="messageSize=102400"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one (transacted producer)/(Transacted consumer) pair
- for sending and receiving 10000 (0.5K) persistent messages.
- Tx batch size is 100 (consumer and producer)
- The test last for 5 minutes.
- -->
- <target name="Queue-Duration-Transacted" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Queue-Duration-Transacted"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="persistent=true"/>
- <arg value="transacted=true"/>
- <arg value="batchSize=100"/>
- <arg value="consTransacted=true"/>
- <arg value="commitBatchSize=100"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
- <!--
- Measure the time for four concurrent producer/receiver pairs to send and receive 1000 transient messages
- -->
- <target name="Queue-Concurrent" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-r1"/>
- <arg value="-n Queue-Concurrent"/>
- <arg value="-s[1000]"/>
- <arg value="-c[4]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
-
- <!-- Topic tests -->
-
- <!--
- Send 10000 (.5K) messages and measure the time for receiving 1000 messages (10 intervals)
- the overall latency is also calculated (See Test * Size Throughput)
- Note that "Test Throughput" is the average time for receiving 1000 messages
- -->
- <target name="Topic-Latency" depends="build" description="Run Queue-Latency">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-n Topic-Latency"/>
- <arg value="-s[10000]"/>
- <arg value="-t testPingLatency"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingLatencyTestPerf"/>
- <arg value="rate=100"/>
- <arg value="batchSize=1000"/>
- <arg value="messageSize=512"/>
- <arg value="pubsub=true"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one producer/consumer pair
- for sending and receiving 10000 transient messages.
- The test last for 5 minutes.
- -->
- <target name="Topic-Duration" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Topic-Duration"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="messageSize=512"/>
- <arg value="pubsub=true"/>
- </java>
- </target>
-
- <!--
- Measure the time required for one (transacted producer)/(Transacted consumer) pair
- for sending and receiving 10000 (0.5K) persistent messages.
- Tx batch size is 100 (consumer and producer)
- The test last for 5 minutes.
- -->
- <target name="Topic-Duration-Transacted" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-d5M"/>
- <arg value="-n Topic-Duration-Transacted"/>
- <arg value="-s[1000]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="persistent=true"/>
- <arg value="transacted=true"/>
- <arg value="batchSize=100"/>
- <arg value="consTransacted=true"/>
- <arg value="commitBatchSize=100"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
-
- <!--
- Measure the time for four concurrent producer/receiver pairs to send and receive 1000 transient messages
- -->
- <target name="Topic-Concurrent" depends="build" description="">
- <java classname="org.apache.qpid.junit.extensions.TKTestRunner" fork="true">
- <classpath refid="module.test.path"/>
- <jvmarg value="${xms}"/>
- <jvmarg value="${xmx}"/>
- <jvmarg value="${test.logging.level}"/>
- <jvmarg value="${qpid.logging.level}"/>
- <jvmarg value="${log4j.config}"/>
- <!-- args -->
- <arg value="-r1"/>
- <arg value="-n Topic-Concurrent"/>
- <arg value="-s[1000]"/>
- <arg value="-c[4]"/>
- <arg value="-t testAsyncPingOk"/>
- <arg value="-o${results}"/>
- <arg value="--csv"/>
- <arg value="org.apache.qpid.ping.PingAsyncTestPerf"/>
- <arg value="messageSize=512"/>
- </java>
- </target>
</project>
diff --git a/qpid/java/perftests/dist-zip.xml b/qpid/java/perftests/dist-zip.xml
deleted file mode 100644
index 0039bfb157..0000000000
--- a/qpid/java/perftests/dist-zip.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<!-- This is an assembly descriptor that produces a zip containing all the test scripts and
- the all dependencies jar. -->
-<assembly>
- <id>perftests</id>
- <formats>
- <format>zip</format>
- <format>tar.gz</format>
- </formats>
- <includeBaseDirectory>false</includeBaseDirectory>
- <fileSets>
- <fileSet>
- <directory>target</directory>
- <outputDirectory>PerformanceTests</outputDirectory>
- <includes>
- <include>qpid-perftests-${qpid.version}-all-test-deps.jar</include>
- <include>*.sh</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>etc/scripts</directory>
- <outputDirectory>PerformanceTests</outputDirectory>
- <includes>
- <include>*.sh</include>
- </includes>
- </fileSet>
- </fileSets>
-</assembly>
diff --git a/qpid/java/perftests/etc/chartdefs/AcknowledgementModesAutoAck.chartdef b/qpid/java/perftests/etc/chartdefs/AcknowledgementModesAutoAck.chartdef
new file mode 100644
index 0000000000..42e4a0c11e
--- /dev/null
+++ b/qpid/java/perftests/etc/chartdefs/AcknowledgementModesAutoAck.chartdef
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=BAR
+chartTitle=Performance of acknowledgement modes (Auto-acknowledgement)
+xAxisTitle=Persistence
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT testName, throughputKbPerS FROM AcknowledgementModes WHERE acknowledgeMode = '1' AND participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
+
diff --git a/qpid/java/perftests/etc/chartdefs/AcknowledgementModesTransacted.chartdef b/qpid/java/perftests/etc/chartdefs/AcknowledgementModesTransacted.chartdef
new file mode 100644
index 0000000000..3bbee462a0
--- /dev/null
+++ b/qpid/java/perftests/etc/chartdefs/AcknowledgementModesTransacted.chartdef
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=BAR
+chartTitle=Performance of acknowledgement modes (Transacted)
+xAxisTitle=Persistence
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT testName, throughputKbPerS FROM AcknowledgementModes WHERE acknowledgeMode = '0' AND participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
+
diff --git a/qpid/java/perftests/etc/chartdefs/BatchSize.chartdef b/qpid/java/perftests/etc/chartdefs/BatchSize.chartdef
new file mode 100644
index 0000000000..13c42b2ebf
--- /dev/null
+++ b/qpid/java/perftests/etc/chartdefs/BatchSize.chartdef
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=LINE
+chartTitle=Transaction Batch Size
+xAxisTitle=Batch Size
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT batchSize, throughputKbPerS FROM BatchSize WHERE participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
+
diff --git a/qpid/java/perftests/etc/chartdefs/MessageSizeNonPersistent.chartdef b/qpid/java/perftests/etc/chartdefs/MessageSizeNonPersistent.chartdef
new file mode 100644
index 0000000000..22d78042d8
--- /dev/null
+++ b/qpid/java/perftests/etc/chartdefs/MessageSizeNonPersistent.chartdef
@@ -0,0 +1,27 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=LINE
+chartTitle=Impact of Message Size (Non-Persistent)
+xAxisTitle=Message Size (B)
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT payloadSizeB, throughputKbPerS FROM MessageSize WHERE testName like '%NON_PERSISTENT' AND participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
diff --git a/qpid/java/perftests/etc/chartdefs/MessageSizePersistent.chartdef b/qpid/java/perftests/etc/chartdefs/MessageSizePersistent.chartdef
new file mode 100644
index 0000000000..4a57215714
--- /dev/null
+++ b/qpid/java/perftests/etc/chartdefs/MessageSizePersistent.chartdef
@@ -0,0 +1,29 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=LINE
+chartTitle=Impact of Message Size (Persistent)
+xAxisTitle=Message Size (B)
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT payloadSizeB, throughputKbPerS FROM MessageSize WHERE testName like '% PERSISTENT' AND participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
+
+# Define series3/4 to chart the baseline
diff --git a/qpid/java/perftests/etc/chartdefs/QueueTypes.chartdef b/qpid/java/perftests/etc/chartdefs/QueueTypes.chartdef
new file mode 100644
index 0000000000..770b5cc719
--- /dev/null
+++ b/qpid/java/perftests/etc/chartdefs/QueueTypes.chartdef
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=BAR
+chartTitle=Queue Types
+xAxisTitle=Queue Types
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT testName, throughputKbPerS FROM QueueTypes WHERE participantName = 'All'
+series.1.legend=Current
+series.1.dir=${csvCurrentDir}
+
diff --git a/qpid/java/perftests/etc/chartdefs/VaryingNumberOfConsumers.chartdef b/qpid/java/perftests/etc/chartdefs/VaryingNumberOfConsumers.chartdef
new file mode 100644
index 0000000000..83d6fe2659
--- /dev/null
+++ b/qpid/java/perftests/etc/chartdefs/VaryingNumberOfConsumers.chartdef
@@ -0,0 +1,35 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=LINE
+chartTitle=Varying number of consumers
+xAxisTitle=Consumers
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT totalNumberOfConsumers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfProducers = '1'
+series.1.legend=1 Producer
+series.1.dir=${csvCurrentDir}
+
+series.2.statement=SELECT totalNumberOfConsumers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfProducers = '5'
+series.2.legend=5 Producers
+series.2.dir=${csvCurrentDir}
+
+series.3.statement=SELECT totalNumberOfConsumers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfProducers = '10'
+series.3.legend=10 Producers
+series.3.dir=${csvCurrentDir}
diff --git a/qpid/java/perftests/etc/chartdefs/VaryingNumberOfProducers.chartdef b/qpid/java/perftests/etc/chartdefs/VaryingNumberOfProducers.chartdef
new file mode 100644
index 0000000000..51ea92b909
--- /dev/null
+++ b/qpid/java/perftests/etc/chartdefs/VaryingNumberOfProducers.chartdef
@@ -0,0 +1,35 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+chartType=LINE
+chartTitle=Varying number of producers
+xAxisTitle=Producers
+yAxisTitle=Throughput (KB/s)
+
+series.1.statement=SELECT totalNumberOfProducers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfConsumers = '1'
+series.1.legend=1 Consumer
+series.1.dir=${csvCurrentDir}
+
+series.2.statement=SELECT totalNumberOfProducers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfConsumers = '5'
+series.2.legend=5 Consumer
+series.2.dir=${csvCurrentDir}
+
+series.3.statement=SELECT totalNumberOfProducers, throughputKbPerS FROM VaryingNumberOfParticipants WHERE participantName = 'All' and totalNumberOfConsumers = '10'
+series.3.legend=10 Consumer
+series.3.dir=${csvCurrentDir}
diff --git a/qpid/java/perftests/etc/jndi/activemq.properties b/qpid/java/perftests/etc/jndi/activemq.properties
deleted file mode 100644
index 281577c4a8..0000000000
--- a/qpid/java/perftests/etc/jndi/activemq.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
-java.naming.provider.url= tcp://localhost:61616
-
diff --git a/qpid/java/perftests/etc/jndi/failovertest.properties b/qpid/java/perftests/etc/jndi/failovertest.properties
deleted file mode 100644
index b437d12062..0000000000
--- a/qpid/java/perftests/etc/jndi/failovertest.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-connectionfactory.local = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5001;tcp://localhost:5002'
diff --git a/qpid/java/perftests/etc/jndi/perftests.properties b/qpid/java/perftests/etc/jndi/perftests.properties
deleted file mode 100644
index a2348f4547..0000000000
--- a/qpid/java/perftests/etc/jndi/perftests.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-connectionfactory.local = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
diff --git a/qpid/java/perftests/etc/jndi/swiftmq.properties b/qpid/java/perftests/etc/jndi/swiftmq.properties
deleted file mode 100644
index 2d037a2513..0000000000
--- a/qpid/java/perftests/etc/jndi/swiftmq.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-java.naming.factory.initial = com.swiftmq.jndi.InitialContextFactoryImpl
-java.naming.provider.url=smqp://localhost:4001/timeout=10000
-#connectionfactory.local = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
diff --git a/qpid/java/perftests/etc/log4j.properties b/qpid/java/perftests/etc/log4j.properties
new file mode 100644
index 0000000000..60e15d0817
--- /dev/null
+++ b/qpid/java/perftests/etc/log4j.properties
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+log4j.rootLogger=ERROR,console
+
+log4j.logger.org.apache.qpid=WARN
+log4j.logger.org.apache.qpid.disttest=INFO
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=all
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+
+log4j.appender.console.layout.ConversionPattern=%d %p [%c{1}] %m%n \ No newline at end of file
diff --git a/qpid/java/perftests/etc/perftests-jndi.properties b/qpid/java/perftests/etc/perftests-jndi.properties
new file mode 100644
index 0000000000..8ad0decaad
--- /dev/null
+++ b/qpid/java/perftests/etc/perftests-jndi.properties
@@ -0,0 +1,26 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# this file is used for running system tests of the performance test framework,
+# (i.e. not for running the performance tests themselves!)
+
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+# use QpidBrokerTestCase's default port
+connectionfactory.connectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
+
+destination.controllerqueue = direct://amq.direct//controllerqueue
diff --git a/qpid/java/perftests/etc/perftests.log4j b/qpid/java/perftests/etc/perftests.log4j
deleted file mode 100644
index af8c1b0784..0000000000
--- a/qpid/java/perftests/etc/perftests.log4j
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-log4j.rootLogger=${root.logging.level}
-
-
-log4j.logger.org.apache.mina=${amqj.logging.level}
-
-log4j.logger.org.apache.qpid=${amqj.logging.level}, console
-log4j.additivity.org.apache.qpid=false
-
-log4j.logger.org.apache.qpid.requestreply=${amqj.test.logging.level}
-log4j.logger.org.apache.qpid.pingpong=${amqj.test.logging.level}
-log4j.logger.org.apache.qpid.ping=${amqj.test.logging.level}
-log4j.logger.org.apache.qpid.topic=${amqj.test.logging.level}
-
-log4j.logger.org.apache.qpid.junit.extensions=${badger.level}, console
-log4j.additivity.org.apache.qpid.junit.extensions=false
-
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.Threshold=all
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-
-log4j.appender.console.layout.ConversionPattern=%t %d %p [%c{4}] %m%n
-#log4j.appender.console.layout.ConversionPattern=%t %p [%c] %m%n
-
-log4j.appender.fileApp=org.apache.log4j.FileAppender
-log4j.appender.fileApp.file=${log.dir}/perftests.volumetest.log
-log4j.appender.fileApp.Threshold=info
-log4j.appender.fileApp.append=false
-log4j.appender.fileApp.layout=org.apache.log4j.PatternLayout
diff --git a/qpid/java/perftests/etc/scripts/CTQ-Qpid-1.sh b/qpid/java/perftests/etc/scripts/CTQ-Qpid-1.sh
deleted file mode 100755
index 057dec5c63..0000000000
--- a/qpid/java/perftests/etc/scripts/CTQ-Qpid-1.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-1.sh $@ & ./PQ-Qpid-1-P.sh $@
diff --git a/qpid/java/perftests/etc/scripts/CTQ-Qpid-2.sh b/qpid/java/perftests/etc/scripts/CTQ-Qpid-2.sh
deleted file mode 100755
index 08057cbf44..0000000000
--- a/qpid/java/perftests/etc/scripts/CTQ-Qpid-2.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-2.sh $@ & ./PQ-Qpid-2-P.sh $@
diff --git a/qpid/java/perftests/etc/scripts/CTQ-Qpid-3.sh b/qpid/java/perftests/etc/scripts/CTQ-Qpid-3.sh
deleted file mode 100755
index 0bb7e25197..0000000000
--- a/qpid/java/perftests/etc/scripts/CTQ-Qpid-3.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-3.sh $@ & ./PQ-Qpid-3-P.sh $@
diff --git a/qpid/java/perftests/etc/scripts/CTQ-Qpid-4.sh b/qpid/java/perftests/etc/scripts/CTQ-Qpid-4.sh
deleted file mode 100755
index 278e44d12b..0000000000
--- a/qpid/java/perftests/etc/scripts/CTQ-Qpid-4.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-4.sh $@ & ./PQ-Qpid-4-P.sh $@
diff --git a/qpid/java/perftests/etc/scripts/CTQ-Qpid-5.sh b/qpid/java/perftests/etc/scripts/CTQ-Qpid-5.sh
deleted file mode 100755
index 5dee0176b2..0000000000
--- a/qpid/java/perftests/etc/scripts/CTQ-Qpid-5.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-5.sh $@ & ./PQ-Qpid-5-P.sh $@
diff --git a/qpid/java/perftests/etc/scripts/CTQ-Qpid-6.sh b/qpid/java/perftests/etc/scripts/CTQ-Qpid-6.sh
deleted file mode 100755
index b9996da77d..0000000000
--- a/qpid/java/perftests/etc/scripts/CTQ-Qpid-6.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-./PQ-Qpid-6.sh $@ & ./PQ-Qpid-6-P.sh $@
diff --git a/qpid/java/perftests/etc/scripts/Connections.sh b/qpid/java/perftests/etc/scripts/Connections.sh
deleted file mode 100755
index 17e69166bf..0000000000
--- a/qpid/java/perftests/etc/scripts/Connections.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-find . -regex '\.\/[P|T].CT-.*\.sh' -exec {} -o results-Connections/ --csv \;
diff --git a/qpid/java/perftests/etc/scripts/JobQueue.sh b/qpid/java/perftests/etc/scripts/JobQueue.sh
deleted file mode 100755
index 312037f5ab..0000000000
--- a/qpid/java/perftests/etc/scripts/JobQueue.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-find . -regex '.*BL-.*\.sh' -exec {} -o results-JobQueue/ --csv \;
diff --git a/qpid/java/perftests/etc/scripts/Latency.sh b/qpid/java/perftests/etc/scripts/Latency.sh
deleted file mode 100755
index f70131de38..0000000000
--- a/qpid/java/perftests/etc/scripts/Latency.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-find . -regex '\.\/[P|T].CL-.*\.sh' -exec {} -o results-Latency/ --csv \;
diff --git a/qpid/java/perftests/etc/scripts/MessageSize.sh b/qpid/java/perftests/etc/scripts/MessageSize.sh
deleted file mode 100755
index bb10822257..0000000000
--- a/qpid/java/perftests/etc/scripts/MessageSize.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-find . -regex '.*M-Qpid-.*\.sh' -exec {} -o results-messageSize/ --csv $* \;
diff --git a/qpid/java/perftests/etc/scripts/PT-Qpid-13.sh b/qpid/java/perftests/etc/scripts/PT-Qpid-13.sh
deleted file mode 100755
index df35f718b9..0000000000
--- a/qpid/java/perftests/etc/scripts/PT-Qpid-13.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-echo "Starting 6 parallel tests"
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.1 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=newd1 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.2 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=newd2 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.3 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=newd3 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.4 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinatioNname=newd4 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.5 -s [250] -c[100] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=newd5 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-13.6 -s [250] -c[100] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=newd6 uniqueDests=true batchSize=250 transacted=true commitBatchSize=50 -o $QPID_WORK/results ${ARGS}
-
diff --git a/qpid/java/perftests/etc/scripts/PT-Qpid-14.sh b/qpid/java/perftests/etc/scripts/PT-Qpid-14.sh
deleted file mode 100755
index ff5b8a76f9..0000000000
--- a/qpid/java/perftests/etc/scripts/PT-Qpid-14.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-echo "Starting 6 parallel tests"
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=ping1 batchSize=250 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=ping2 batchSize=250 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=ping3 batchSize=250 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[200] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256destinationname=ping4 batchSize=250 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[100] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=ping5 batchSize=250 -o $QPID_WORK/results ${ARGS} &
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx3072m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.junit.extensions.TKTestRunner -n PT-Qpid-14 -s [250] -c[100] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true messageSize=256 destinationName=ping6 batchSize=250 -o $QPID_WORK/results ${ARGS}
diff --git a/qpid/java/perftests/etc/scripts/Reliability.sh b/qpid/java/perftests/etc/scripts/Reliability.sh
deleted file mode 100755
index 9e5e508743..0000000000
--- a/qpid/java/perftests/etc/scripts/Reliability.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-find . -regex '.*R-Qpid-0[1-8].*\.sh' -exec {} -o results-Reliability/ --csv \;
diff --git a/qpid/java/perftests/etc/scripts/RunAll.sh b/qpid/java/perftests/etc/scripts/RunAll.sh
deleted file mode 100755
index 8b0d8b6e7c..0000000000
--- a/qpid/java/perftests/etc/scripts/RunAll.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-./RunCore.sh
-./Connections.sh
-./JobQueue.sh
-./MessageSize.sh
diff --git a/qpid/java/perftests/etc/scripts/RunCore.sh b/qpid/java/perftests/etc/scripts/RunCore.sh
deleted file mode 100755
index fcc45aacf0..0000000000
--- a/qpid/java/perftests/etc/scripts/RunCore.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-./Throughput.sh
-./Latency.sh
-./Reliability.sh
diff --git a/qpid/java/perftests/etc/scripts/Test-ActiveMQ.sh b/qpid/java/perftests/etc/scripts/Test-ActiveMQ.sh
deleted file mode 100644
index 27e0411870..0000000000
--- a/qpid/java/perftests/etc/scripts/Test-ActiveMQ.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx1024m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp "qpid-perftests-1.0-incubating-M2.1-SNAPSHOT.jar;activemq-jars/apache-activemq-4.1.1.jar" org.apache.qpid.junit.extensions.TKTestRunner -n Test-ActiveMQ -s[1] -r 1 -t testAsyncPingOk -o . org.apache.qpid.ping.PingAsyncTestPerf properties=activemq.properties factoryName=ConnectionFactory ${ARGS}
-
-# queueNamePostfix=@router1 overrideClientId=true
diff --git a/qpid/java/perftests/etc/scripts/Test-SwiftMQ.sh b/qpid/java/perftests/etc/scripts/Test-SwiftMQ.sh
deleted file mode 100644
index 1f0b38ccc2..0000000000
--- a/qpid/java/perftests/etc/scripts/Test-SwiftMQ.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-java -Xms256m -Dlog4j.configuration=perftests.log4j -Xmx1024m -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn ${JAVA_OPTS} -cp "qpid-perftests-1.0-incubating-M2.1-SNAPSHOT.jar;swiftmqjars/swiftmq.jar" org.apache.qpid.junit.extensions.TKTestRunner -n Test-SwiftMQ -s[1] -r 1 -t testAsyncPingOk -o . org.apache.qpid.ping.PingAsyncTestPerf properties=swiftmq.properties factoryName=ConnectionFactory queueNamePostfix=@router1 overrideClientId=true ${ARGS}
diff --git a/qpid/java/perftests/etc/scripts/Throughput.sh b/qpid/java/perftests/etc/scripts/Throughput.sh
deleted file mode 100755
index d08ad248a5..0000000000
--- a/qpid/java/perftests/etc/scripts/Throughput.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-find . -regex '.*[P|T].BT-.*\.sh' -exec {} -o results-throughput/ --csv $* \;
diff --git a/qpid/java/perftests/etc/scripts/drainBroker.sh b/qpid/java/perftests/etc/scripts/drainBroker.sh
deleted file mode 100755
index eea7209f03..0000000000
--- a/qpid/java/perftests/etc/scripts/drainBroker.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-if [ -z "$QPID_HOME" ]; then
- export QPID_HOME=$(dirname $(dirname $(dirname $(readlink -f $0))))
- export PATH=${PATH}:${QPID_HOME}/bin
-fi
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-# Set classpath to include Qpid jar with all required jars in manifest
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java JAVA_VM=-server JAVA_MEM=-Xmx1024m QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Xms256m -Dlog4j.configuration=file://${QPID_HOME}/etc/perftests.log4j -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn org.apache.qpid.junit.extensions.TKTestRunner -n PQBT-TX-Qpid-01 -s[1000] -c[1] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=0 consumeOnly=true consumeOnly=true${ARGS}
diff --git a/qpid/java/perftests/etc/scripts/extractResults.sh b/qpid/java/perftests/etc/scripts/extractResults.sh
deleted file mode 100755
index 4fc74059af..0000000000
--- a/qpid/java/perftests/etc/scripts/extractResults.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash +x
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-#
-# Process a given directory (defaults to '.') and provide a list of the tests run so
-# identification of any failures can be seen.
-#
-
-if [ $# == 0 ] ; then
- dir=.
-else
- dir=$1
-fi
-
-grep 'Total Tests:' $dir/*Qpid* | sed -e 's/^.*\/\([A-Z\-]*-Qpid-[0-9]*\).*Total Tests:, \([0-9.]*\).*Total Passed:, \([0-9.]*\).*Total Failed:, \([0-9.]*\).*Total Error:, \([0-9.]*\).*$/\1, Total:\t\2,\tPassed:\t\3,\tFailed:\t\4,\tError:\t\5/'
diff --git a/qpid/java/perftests/etc/scripts/extractThroughputResults.sh b/qpid/java/perftests/etc/scripts/extractThroughputResults.sh
deleted file mode 100755
index 14236c68bc..0000000000
--- a/qpid/java/perftests/etc/scripts/extractThroughputResults.sh
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/bash +x
-#
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-#
-# Process a given directory (defaults to '.') and provides the throughput results as
-# reported by the tests.
-#
-# if a second argument of -n is provided then it will only list the number output for
-# easy copy/paste
-#
-
-if [ $# == 0 ] ; then
- dir=.
-else
- dir=$1
-fi
-
-numeric=0
-if [ "$dir" == "-n" ] ; then
- numeric=1
- dir=.
-fi
-
-if [ "$2" == "-n" ] ; then
- numeric=1
-fi
-
-if [ $numeric == 1 ] ; then
- grep 'Total Tests:' $dir/*Qpid* | sed -e 's/^.*\/\([A-Z]*-[A-Z][A-Z]-Qpid-01\).*Size Throughput:, \([0-9.]*\).*$/\1, \2/' | sed -e 's/\.\([0-9][0-9][0-9]\)/\1\./' | sed -e 's/, 0/, /' | awk '{print $2}'
-else
- grep 'Total Tests:' $dir/*Qpid* | sed -e 's/^.*\/\([A-Z]*-[A-Z][A-Z]-Qpid-01\).*Size Throughput:, \([0-9.]*\).*$/\1, \2/' | sed -e 's/\.\([0-9][0-9][0-9]\)/\1\./' | sed -e 's/, 0/, /'
-fi
diff --git a/qpid/java/perftests/etc/scripts/fillBroker.sh b/qpid/java/perftests/etc/scripts/fillBroker.sh
deleted file mode 100755
index 5b7de6f999..0000000000
--- a/qpid/java/perftests/etc/scripts/fillBroker.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-if [ -z "$QPID_HOME" ]; then
- export QPID_HOME=$(dirname $(dirname $(dirname $(readlink -f $0))))
- export PATH=${PATH}:${QPID_HOME}/bin
-fi
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-# Set classpath to include Qpid jar with all required jars in manifest
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java JAVA_VM=-server JAVA_MEM=-Xmx1024m QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Xms256m -Dlog4j.configuration=file://${QPID_HOME}/etc/perftests.log4j -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn org.apache.qpid.junit.extensions.TKTestRunner -n PQBT-TX-Qpid-01 -s[1000] -c[1] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=0 transacted=true consTransacted=true consAckMode=0 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=0 ${ARGS}
diff --git a/qpid/java/perftests/etc/scripts/sendAndWaitClient.sh b/qpid/java/perftests/etc/scripts/sendAndWaitClient.sh
deleted file mode 100755
index af4b788658..0000000000
--- a/qpid/java/perftests/etc/scripts/sendAndWaitClient.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-#
-
-$JAVA_HOME/bin/java -Dlog4j.configuration=backup-log4j.xml -cp qpid-perftests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar org.apache.qpid.ping.PingSendOnlyClient messageSize=512
diff --git a/qpid/java/perftests/etc/scripts/testWithPreFill.sh b/qpid/java/perftests/etc/scripts/testWithPreFill.sh
deleted file mode 100755
index 721ecf6ecc..0000000000
--- a/qpid/java/perftests/etc/scripts/testWithPreFill.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-if [ -z "$QPID_HOME" ]; then
- export QPID_HOME=$(dirname $(dirname $(dirname $(readlink -f $0))))
- export PATH=${PATH}:${QPID_HOME}/bin
-fi
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-# Set classpath to include Qpid jar with all required jars in manifest
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java JAVA_VM=-server JAVA_MEM=-Xmx1024m QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Xms256m -Dlog4j.configuration=file://${QPID_HOME}/etc/perftests.log4j -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn org.apache.qpid.junit.extensions.TKTestRunner -n PQBT-TX-Qpid-01 -s[1000] -c[1] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=0 preFill=1000 delayBeforeConsume=1000 ${ARGS}
diff --git a/qpid/java/perftests/etc/testdefs/short/AcknowledgementModes.json b/qpid/java/perftests/etc/testdefs/short/AcknowledgementModes.json
new file mode 100644
index 0000000000..d504c486aa
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/short/AcknowledgementModes.json
@@ -0,0 +1,138 @@
+{
+ "_tests":[
+ {
+ "_name": "Acknowledgement Modes - NON_PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 1000000,
+ "_acknowledgeMode": 1,
+ "_deliveryMode": 1
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 250000,
+ "_acknowledgeMode": 0,
+ "_deliveryMode": 1
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Acknowledgement Modes - PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 100000,
+ "_acknowledgeMode": 1,
+ "_deliveryMode": 2
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 25000,
+ "_acknowledgeMode": 0,
+ "_deliveryMode": 2
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue?durable='true'",
+ "_durable" : "true"
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/etc/testdefs/short/BatchSize.json b/qpid/java/perftests/etc/testdefs/short/BatchSize.json
new file mode 100644
index 0000000000..eeb446bad6
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/short/BatchSize.json
@@ -0,0 +1,84 @@
+{
+ "_tests":[
+ {
+ "_name": "Batch Size- PERSISTENT";
+ "_iterations":[
+ {
+ "_batchSize": 1
+ },
+ {
+ "_batchSize": 2
+ },
+ {
+ "_batchSize": 5
+ },
+ {
+ "_batchSize": 10
+ },
+ {
+ "_batchSize": 20
+ },
+ {
+ "_batchSize": 50
+ },
+ {
+ "_batchSize": 100
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//batchSize?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//batchSize?durable='true'",
+ "_messageSize": 1024,
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//batchSize?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/etc/testdefs/short/MessageSize.json b/qpid/java/perftests/etc/testdefs/short/MessageSize.json
new file mode 100644
index 0000000000..3354d72d3e
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/short/MessageSize.json
@@ -0,0 +1,213 @@
+{
+ "_tests":[
+ {
+ "_name": "Message Size - 1P-1C - NON_PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 256,
+ "_numberOfMessages": 1000000
+ },
+ {
+ "_messageSize": 512,
+ "_numberOfMessages": 500000
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": "250000"
+ },
+ {
+ "_messageSize": 2048,
+ "_numberOfMessages": "125000"
+ },
+ {
+ "_messageSize": 4096,
+ "_numberOfMessages": "62500"
+ },
+ {
+ "_messageSize": 8192,
+ "_numberOfMessages": 31250
+ },
+ {
+ "_messageSize": 16384,
+ "_numberOfMessages": 15625
+ },
+ {
+ "_messageSize": 32768,
+ "_numberOfMessages": 7812
+ },
+ {
+ "_messageSize": 65536,
+ "_numberOfMessages": 3906
+ },
+ {
+ "_messageSize": 131072,
+ "_numberOfMessages": 195
+ },
+ {
+ "_messageSize": 262144,
+ "_numberOfMessages": 97
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//messageSize",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//messageSize",
+ "_deliveryMode": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//messageSize"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Message Size - 1P-1C - PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 256,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 512,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 2048,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 4096,
+ "_numberOfMessages": 4000
+ },
+ {
+ "_messageSize": 8192,
+ "_numberOfMessages": 4000
+ },
+ {
+ "_messageSize": 16384,
+ "_numberOfMessages": 4000
+ },
+ {
+ "_messageSize": 32768,
+ "_numberOfMessages": 2000
+ },
+ {
+ "_messageSize": 65536,
+ "_numberOfMessages": 2000
+ },
+ {
+ "_messageSize": 131072,
+ "_numberOfMessages": 2000
+ },
+ {
+ "_messageSize": 262144,
+ "_numberOfMessages": 2000
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//messageSize?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//messageSize?durable='true'",
+ "_deliveryMode": 2
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//messageSize?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/etc/testdefs/short/QueueTypes.json b/qpid/java/perftests/etc/testdefs/short/QueueTypes.json
new file mode 100644
index 0000000000..2237e8d8b9
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/short/QueueTypes.json
@@ -0,0 +1,16198 @@
+{
+ "_tests":[
+ {
+ "_name": "queue-type:sorted-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//sorted-queue?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "qpid.queue_sort_key": "sort-key"
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "sort-key": {"@def": "list", "_items": [
+"GWqqXCp3mZ","b29RJ45cIH","7hyVvgtCA5","16lHcCxVEf","jzUqRuPX7G","0Wr5y4QMc9","pWiOsLbRTH","Dz1R3BGaQY","Cfgr39y4lw","Zv7z0FxX9q",
+"lj07QxXTI4","RACuj9XyT9","MGlTF55rfB","0Wr5yW3VFH","lweGyVprf2","lpF6WuJScX","lCMxy2TRI7","KZamHl83Ud","5drc6jiVBP","rKDLJwDajX",
+"CK5W7MezSW","2TRI7LbRTH","zqH0WiwzGk","hYBCKUvlv4","Mkgy8Q6hMC","8FmFHjtn0X","8FmFH5Mg9r","hUTw7rz7Ut","pmeCdQnJ1S","euZA5dQ586",
+"sqVrfQWxoT","RsQUqTwano","7ku1ptlILt","jzUqRpiJSk","0YAGH5Drn0","7ku1pCxVEf","QbxXc8hJdt","4W0Tldpe1v","MK07Ys7Mxk","zHF1qCNHmv",
+"uoStwRzaZA","KZamHVLTy6","XyPZN5Drn0","7fKYU07n1c","HfyNQiwzGk","mX2GEoGu6x","9eoRcydG8U","pAhR1iKqhr","LbRTHb29RJ","Waim6DLhzM",
+"bgJAzReKEW","pmeCdjeskS","gdQsSguMb8","Oz8yZI7p2a","ogLgculk41","HfyNQ0MR5X","24ARFWDVWJ","uAWypwDajX","lH1kt6AFT0","EOE1oZhwG1",
+"AIYUu0Kyfs","prNT6uTacx","TwanoFPfSE","OUYuFAXpwE","euZA5FVMxo","ni2v10BmCy","5Mg9rJRJQB","nlaBya00b5","7X3uyL7cGc","ECMvU55rfB",
+"JXljW2TRI7","Z4I1vY1mC0","lj07QFhtgl","fqypycmXIX","Ul4a1GrDg7","LDk6fulk41","2Nslm2hEEU","LbRTHuTacx","gIYvEK4GS8","Cfgr3i7WMQ",
+"pWiOss4786","mX2GETCgPp","8xEKzjeskS","uTacxDQimp","ksJbyfFDrJ","7fKYUAOgEe","5Drn0azIWp","he9IAIKxdL","HfyNQTwano","FcWrW0ao3l",
+"iKqhrn8pJ9","BbwgArhl0J","M6qcGjiVBP","b29RJ8U2nU","MK07Y8cVD3","dhSuHjfREu","azIWpjS1aj","qQxHPTwano","QChxsJRJQB","YjB9tuZPqg",
+"FVMxoMmKGJ","JKWYRZUnqt","AIYUuhUTw7","U3yw5Cp3mZ","zz4ZUGXdoH","8hJdtBbwgA","Ul4a155rfB","oVQp6DLhzM","DG4sTfmIK1","zY1GYAXpwE",
+"M3zXLGrDg7","CK5W7jSjS3","fmIK1uTacx","OxWIHkB5nP","xXTI4BFkb8","OUYuFblLA9","RkQkeqaofN","YjB9tuTacx","uLtKsW7cTs","l83UdDcpWB",
+"brhlQRsQUq","GSQwjCIShG","GSQwjFwEJz","HlUbF2DREs","Mkgy8xReec","16lHcwDajX","MaJQs5IhmG","9iGoTdmoS7","DQimplpF6W","bgJAzVjCZq",
+"vLsmSwDajX","DG4sTciuWz","ECMvU48cHL","nlaByqaofN","QWxoTv1Hln","WaWsvqUJMd","F6PT28cVD3","lweGyLewvM","IRh48xciqp","9y4lw8U2nU",
+"2TRI7NOHsz","uAWypuTacx","FhtglcQOnv","bZLvS0PktI","v2eC3DcpWB","ReKEWksJby","ECMvUPOUYS","8RCUATa8f6","gjUTu0YAGH","FcWrWcmXIX",
+"QYxC0zQt6Q","MK07Y7fKYU","qQxHPoGu6x","faHirNo0Qb","aFFss0MR5X","RpBQmokgRi","IBe8kVerEA","OHaBzy94nw","0ao3lDLhzM","tuDySpT8wu",
+"jSjS3JJs5m","VerEA7Ow5C","5NammJXljW","gf8rIhi5X7","M3zXLRsQUq","K4GS8y94nw","aez9yvkCHH","uTacxix74r","RpBQmCqqaD","4dEz6L7cGc",
+"ix74rJKWYR","4W0TlNhXdu","VjCZqogLgc","45cIHNcICA","pT8wufqypy","nnP8odQ586","dpe1vGSQwj","2ZHdkvkCHH","zz4ZUhe9IA","nnP8oCqqaD",
+"vLsmSYw2oU","4QMc9GSQwj","yluBxOz8yZ","0ao3lsqVrf","K20wKCK5W7","fcwDa8FmFH","GWqqXX6Pin","faHird7vjM","RBhp0ZzJHW","EOE1owDajX",
+"QssNC0Kyfs","iqv4kCp3mZ","4W0TlMkgy8","aDGtSdhSuH","uQIcz5Drn0","1v5hHUmaEv","pAhR1MmKGJ","2Yz7EQWxoT","nFqikKASQ8","ZJTXHpT8wu",
+"5iGN5MojnP","gf8rIsuY4x","l83UdHzZT8","uoStwtAOsr","wDajXzFgtB","mz8gxAOgEe","dhSuHMm8si","ZzJHW6q6L9","FjHXRuPX7G","8cVD3MmsIo",
+"Pb1pagdQsS","m4bxUuAWyp","4QMc9suY4x","nnP8ouZPqg","7X3uynFqik","FnPFBRxrsm","Waim6NcICA","KASQ8JIqXi","s7MxkguMb8","KASQ8AkKTk",
+"fFDrJtuDyS","l83UdD6rBy","ZhwG1dmoS7","7ku1pnnP8o","uPX7GpFrrl","7ku1p4W0Tl","zmLYDQbxXc","zY1GYPb1pa","x3LDe3weIF","zbIYYKsjRK",
+"7Ow5COHaBz","dhSuHJJs5m","RzaZAZhwG1","HRxd8DQimp","IjTwPCK5W7","AOgEelpF6W","8FmFHn1pmO","e6e4z0Kyfs","blLA95nmWv","s4786LbRTH",
+"VBjhzuPX7G","WPmlx7Ow5C","soy9tK4GS8","qaofNfcwDa","iB08lOHaBz","4W0Tl0MR5X","FLsphNo0Qb","kZANmZJTXH","fmIK19iGoT","zFgtB7fsYM",
+"tlILtKZamH","zHF1qvkCHH","HzZT8O3iyQ","i3pydMkgy8","GXdoHy94nw","HlUbFyToGW","e6e4za00b5","aDGtSi3pyd","ZJTXHjzUqR","pAhR1FNYIM",
+"5Mg9rhUTw7","QWxoTL7cGc","aFFssfcwDa","GSQwjni2v1","Vprf2Nxx9V","7ku1peuZA5","MaJQsokgRi","DcpWBQ6hMC","HlUbFM6qcG","iqv4kKr8ys",
+"hi5X7cL0aE","fLNg8Nxx9V","zHF1qQbxXc","Yf2EcB3qem","gIYvEQWxoT","CIShGlViBv","8xEKzBCxeC","UmaEvh1zcH","ogLgcfcJOy","ZUnqtGSQwj",
+"2hEEUzQt6Q","rKDLJTXQ0Z","MmsIoru4UG","mz8gxOxWIH","zFgtBhYBCK","bZLvSqUJMd","hi5X7lsQGo","hSSvQs4786","SjskQoGu6x","07n1cJ2mQi",
+"hYBCKjeskS","Chuy324ARF","s4786UlU3M","AkKTkBFkb8","W3VFHulk41","tl72W7fsYM","ZhwG1Rxrsm","K4GS8YOfrY","0PktIxciqp","9rlg90h1b1",
+"Pb1paAgJHQ","WmadAsx5Gl","GWqqXnFqik","QnJ1SFcWrW","XyPZNNo0Qb","9rlg9TXQ0Z","4dEz6oQ87r","WaWsvZ4I1v","7hyVv4dEz6","a00b5TXQ0Z",
+"iqv4kblLA9","pv0i7ciuWz","9GXkXsx5Gl","Yh1hFyEfy9","SWfouQssNC","5NammlsQGo","ciuWzJKWYR","RmDcrWmadA","s47862ZHdk","RACujo8Uyd",
+"hYBCKm4bxU","l83UdMaJQs","9rlg9Qworu","J2mQiTa8f6","jzUqR7ku1p","64s8NSmGzv","ZhwG1NOHsz","fFDrJuoStw","Chuy3RACuj","aL6AJ5drc6",
+"hYBCKS2Dfu","OHaBzJXljW","djsrv0ao3l","zz4ZUsqVrf","TXQ0ZIBe8k","lViBv2Yz7E","cQOnvMm8si","aL6AJLDk6f","ThjNnru4UG","14FLRo8Uyd",
+"pv0i7rz7Ut","tlILtCIShG","WMiS37fKYU","xXTI4b29RJ","8FmFHThjNn","8cVD34QMc9","8xEKzqaofN","Oz8yZs93Ml","tjQxsJRJQB","Chuy3TCgPp",
+"P6bcgfmIK1","OUYuFI7p2a","tlILtQssNC","k85Aem4bxU","RpBQm7lUXZ","StlDJyvOMI","DcpWBFxX9q","iwzGk0ao3l","KASQ8BbwgA","gdQsS45cIH",
+"bZLvSpWiOs","RACujGrDg7","tuDySZv7z0","d85a9Pb1pa","0BmCyQWxoT","ECMvUs93Ml","CIShGmX2GE","uupzktAOsr","1LB1Lgf8rI","24ARFbgJAz",
+"HRxd8hi5X7","1v5hHyluBx","RACujWreyP","vLsmS0ao3l","BFkb8uTacx","7lUXZVjCZq","RACujSbRYy","K20wK1v5hH","uPX7GUvlv4","tvdkDOHaBz",
+"dpe1vKr8ys","5NammJ2mQi","aDGtSQClRL","M6qcGRzaZA","WMiS3SWfou","0KyfsSmGzv","P6bcg0Wr5y","pvgjSfLNg8","RpBQmCK5W7","gf8rIFxX9q",
+"sqVrf8FmFH","lpF6Wzz4ZU","AOgEeTwano","7lUXZNhXdu","64s8NJIqXi","ni2v1d85a9","2DREscQOnv","Mm8silm0pD","xXTI4MK07Y","Q6Lix9XyT9",
+"64s8NG1RhS","RkQkevOqCE","zz4ZUpv0i7","QnJ1SBpYhV","a00b5IKxdL","BpYhV8xEKz","s7MxkPYBf4","ThjNn5Drn0","jfREu7Ow5C","cShY2VjCZq",
+"M3zXLtAOsr","ru4UGRzaZA","5NammF6PT2","CNHmvtjQxs","MmsIoFxX9q","fqypyWPmlx","K20wKMaJQs","7lUXZ0h1b1","sx5Gln1pmO","ZhwG14QMc9",
+"45cIHUvlv4","i3pyd8U2nU","RmDcrXyPZN","Nxx9Ve6e4z","uPX7GO3iyQ","5VZjSbZLvS","jS1ajh1zcH","0Kyfs5iGN5","7X3uyn8pJ9","3weIFOHaBz",
+"IjTwPIRh48","CdyBV1v5hH","hi5X72Nslm","atef2KsjRK","K20wKMmKGJ","nnP8o4QMc9","7ku1pcShY2","Mm8siGv3Fq","dhSuHrz7Ut","5drc6IjTwP",
+"lkMUAjzUqR","lweGyiKqhr","7Ow5Czz4ZU","AmdQdCfgr3","aFFssL7cGc","P6bcggjUTu","s7MxkY1mC0","FVMxoQbxXc","uPX7GblLA9","BFkb8jeskS",
+"8FmFHt59lR","hi5X7pv0i7","DQimpuvf7A","MezSWHlUbF","9y4lw2Yz7E","QssNC2TRI7","HzZT8EOE1o","Ta8f65drc6","WMiS35VZjS","LDk6fGSQwj",
+"uTacxgjUTu","n8pJ9L7cGc","fcJOyQYxC0","8RCUApFrrl","azIWpReKEW","uN6r3Chuy3","CNHmvL7cGc","jzUqR2Nslm","uPX7GGv3Fq","CqqaDlkMUA",
+"zY1GYSbRYy","AgJHQMGlTF","0PktIpT8wu","RxrsmU3yw5","yvOMI6q6L9","Kr8ysStlDJ","QClRLsqVrf","2Yz7EyofH3","7Ow5CprNT6","IKxdLTa8f6",
+"n8pJ92TRI7","qUJMdvOqCE","jSjS3pT8wu","S2DfusuY4x","AXpwEAgJHQ","1j5L8ZhwG1","uAWyp2Nslm","IRh488FmFH","dmoS7VLTy6","CNHmvECMvU",
+"RACujhUTw7","Uvlv4ix74r","Gv3FqaL6AJ","Waim6DG4sT","QYxC0gdQsS","3weIFzY1GY","pvgjSCfgr3","ZJTXHlj07Q","2hEEU29QAz","Cfgr3s93Ml",
+"wiHrZMmKGJ","XyPZNMaJQs","zbIYYNOHsz","brhlQECMvU","J2mQilweGy","fqypyOxWIH","BbwgAyofH3","W3VFHrKDLJ","sx5Gl2TRI7","AXpwE8TxD7",
+"I7p2anlaBy","NhXduqQxHP","fcJOy4QMc9","SWfouKZamH","GSQwjuoStw","fmIK17X3uy","tAOsrQ6hMC","k85Ae45cIH","Y1mC0uQIcz","zbIYY8FmFH",
+"uZPqg3weIF","8TxD7OHaBz","pmeCd4W0Tl","WaWsv0Wr5y","IRh482TRI7","nlaByvLsmS","hSSvQdpe1v","hi5X7xciqp","tl72WAIYUu","OUqFM9rlg9",
+"VBjhzQ6Lix","Cp3mZSWfou","5drc6ksJby","faHirMmsIo","fFDrJvLsmS","ReKEWfqypy","QWxoTGrDg7","2DREsRpBQm","WaWsvZv7z0","8U2nU3weIF",
+"Rxrsmv2eC3","7X3uyaez9y","0MR5XJJs5m","5IhmGdQ586","BpYhVoQ87r","8FmFH8xEKz","ZUnqtqaofN","45cIHlH1kt","48cHLhUTw7","LewvMnnP8o",
+"CNHmvHzZT8","WMiS39iGoT","QChxsjfREu","RmDcr5iGN5","4dEz68RCUA","64s8NOz8yZ","yluBxuoStw","7hyVvWPmlx","FLsphprNT6","ogLgchE1Ql",
+"uPX7G2TRI7","M6qcGv1Hln","n8pJ9t59lR","cmXIXaL6AJ","1j5L8ni2v1","zz4ZUJKWYR","VBjhzru4UG","oVQp6CNHmv","lViBvTXQ0Z","Pb1paGrDg7",
+"FjHXRFjHXR","yEfy9MmsIo","hE1QlJRJQB","xXTI407n1c","8FmFHtaOXK","fqypyReKEW","AXpwEVprf2","RBhp0ECMvU","Chuy3K4GS8","nFqikTa8f6",
+"lkMUARxrsm","a00b5ulk41","64s8NciuWz","IKxdLHfyNQ","2Nslmt59lR","5drc6580YD","uupzk0h1b1","7fsYMdjsrv","CdyBVoQ87r","Yh1hFMezSW",
+"prNT6hE1Ql","Yh1hFSWfou","CIShGG1RhS","2Yz7EJkzUn","zHF1qZUnqt","xXTI4tjQxs","ZzJHWCxVEf","I7p2akB5nP","2NslmMkgy8","KsjRKVLTy6",
+"TXQ0ZFwEJz","HlUbFazIWp","M3zXLs4786","VerEAzFgtB","VNCPdJIqXi","Pb1pafLNg8","8TxD74QMc9","gIYvEv8yFN","FNYIMgIYvE","YOfrYd7vjM",
+"9rlg914FLR","zFgtBC2Irc","4QMc9D6rBy","uLtKsQssNC","Yw2oUWreyP","WaWsvFhtgl","MGlTFdjsrv","tlILtLDk6f","QClRLhSSvQ","QssNCaL6AJ",
+"fcJOy2ZHdk","d85a9RBhp0","lpF6W7fKYU","qUJMdlXFOB","JIqXidpe1v","45cIHCxVEf","t59lR0Wr5y","zFgtBhe9IA","uLtKsCfgr3","YOfrYReKEW",
+"AgJHQhE1Ql","2ZHdk6q6L9","AgJHQChuy3","RACujuAWyp","Yw2oUDz1R3","pAhR1HfyNQ","jeskSaDGtS","CK5W7Dz1R3","3otm6blLA9","X6PinKASQ8",
+"aez9ygIYvE","K20wKhi5X7","suY4xiKqhr","s4786Z4I1v","gIYvEydG8U","AmdQdQ6hMC","gjUTuAXpwE","FPfSEW3VFH","bgJAzatef2","gf8rIO3iyQ",
+"gtCA5blLA9","FVMxoVjCZq","7hyVvfLNg8","zqH0WC2Irc","yEfy9lweGy","JXljWDQimp","wDajXGXdoH","s93MlFwEJz","G1RhS618Di","l83Ud5IhmG",
+"45cIHzFgtB","8RCUAlsQGo","ni2v11LB1L","yvOMI2Yz7E","zz4ZUnnP8o","L7cGcRsQUq","v8yFNdhSuH","5IhmGzz4ZU","yvOMIo8Uyd","Cp3mZS77LH",
+"zz4ZUGSQwj","P6bcgIjTwP","hYBCKDQimp","8cVD3SjskQ","EoToP64s8N","6q6L9QbxXc","wiHrZqaofN","cmXIXxXTI4","3otm6zqH0W","24ARFulk41",
+"VLTy6cShY2","soy9tOHaBz","StlDJ2Nslm","AkKTkwiHrZ","VerEAyEfy9","HfyNQCK5W7","cShY2M6qcG","bZLvSXyPZN","J2mQiWmadA","0ao3lRxrsm",
+"QChxs4dEz6","0ao3lhi5X7","yvOMITa8f6","hSSvQMmKGJ","OHaBzFNYIM","16lHcy94nw","1LB1L8hJdt","SbRYyWmadA","MGlTFKZamH","rKDLJGWqqX",
+"IjTwPdjsrv","EOE1oHP433","Gv3FqZzJHW","RsQUqfLNg8","G1RhS5ZaEz","JKWYR7fKYU","JXljWTa8f6","FPfSEo8Uyd","4QMc9yToGW","HfyNQM6qcG",
+"S77LHFPfSE","fqypyvkCHH","tuDySfFDrJ","gf8rIuQIcz","Oz8yZFNYIM","FGzgpyToGW","8hJdtKr8ys","pAhR1618Di","pmeCdfFDrJ","AkKTkhUTw7",
+"0MR5XoQ87r","RACujs93Ml","dQ586kB5nP","uoStwYOfrY","UmaEvUlU3M","9GXkXxReec","pv0i7tjQxs","OUqFMQssNC","FnPFBuAWyp","WreyPiKqhr",
+"aFFssUlU3M","dhSuHS77LH","vkCHHFNYIM","Oz8yZG1RhS","C2Irc6AFT0","2ZHdkzbIYY","BpYhVTwano","Mkgy8yEfy9","PYBf4RsQUq","FxX9qlpF6W",
+"WaWsvjfREu","M3zXLU3yw5","VjCZqfcJOy","mz8gxIKxdL","WPmlxCNHmv","1v5hHzqH0W","v1HlnjzUqR","G1RhSNo0Qb","Yh1hFNo0Qb","6AFT0ksJby",
+"dhSuHAOgEe","pv0i7JXljW","djsrv29QAz","D6rByix74r","M6qcG4W0Tl","ThjNneuZA5","5drc6S77LH","TXQ0ZfcJOy","UlU3MgIYvE","ReKEW16lHc",
+"lXFOBSmGzv","aL6AJMGlTF","Yf2Ec7fKYU","0MR5XvLsmS","HzZT8NAFuw","gdQsSIRh48","TXQ0ZAOgEe","HfyNQQWxoT","2TRI7aFFss","xXTI4ReKEW",
+"2Yz7EpT8wu","Ta8f6lXFOB","blLA9pFrrl","0h1b1WMiS3","ThjNnAmdQd","FnPFBsoy9t","hUTw7M3zXL","ksJbyZUnqt","taOXKVIlwP","XflUqtlILt",
+"BpYhVpmeCd","zHF1q5IhmG","gdQsSZzJHW","uAWypYh1hF","BCxeCTXQ0Z","yluBxPOUYS","nnP8oaL6AJ","qQxHPFnPFB","VNCPdcL0aE","s93Ml5VZjS",
+"zHF1qIn3NS","jeskSTXQ0Z","v2eC3sqVrf","uAWyp8hJdt","lXFOB5Drn0","OHaBzAXpwE","uTacxGSQwj","Dz1R3VLTy6","zHF1qulk41","EdBKcRpBQm",
+"Gv3Fq5nmWv","Y1mC01j5L8","45cIHfcJOy","ZJTXHuJScX","bZLvSThjNn","3weIF9XyT9","qQxHPHRxd8","55rfBXyPZN","DG4sTXyPZN","suY4xxXTI4",
+"cL0aEjS1aj","pFrrlAXpwE","uoStwlH1kt","vOqCEaL6AJ","RmDcrfLNg8","suY4xZv7z0","TCgPptuDyS","JJs5m45cIH","F6PT2Ul4a1","B3qem8U2nU",
+"K20wK6q6L9","brhlQWaWsv","FjHXRJJs5m","gf8rI3weIF","BGaQY7fKYU","NhXdu7lUXZ","3weIFSmGzv","Cfgr3FVMxo","LewvMlsQGo","55rfBW7cTs",
+"qaofNQ6hMC","NhXduFnPFB","iwzGkhE1Ql","M6qcGPYBf4","XyPZNVjCZq","S2DfuAgJHQ","vLsmS9GXkX","X6PinVprf2","B3qemMezSW","MmKGJKsjRK",
+"FNYIMDLhzM","U3yw5dpe1v","FFDuiFcWrW","JkzUniB08l","azIWpS2Dfu","0KyfsuTacx","lXFOBfaHir","VerEA7fsYM","StlDJQWxoT","brhlQ5Mg9r",
+"CqqaDFxX9q","4dEz6dQ586","nnP8oFjHXR","CNHmvI7p2a","LewvMazIWp","qaofNVNCPd","KsjRKdjsrv","GXdoHJIqXi","aDGtSFcWrW","RkQkepAhR1",
+"RkQkeGWqqX","F6PT229QAz","JKWYRuJScX","v1HlnguMb8","FVMxot59lR","oQ87rrhl0J","WaWsv7Ow5C","Q6hMClweGy","POUYSbgJAz","16lHcRsQUq",
+"qQxHPWaim6","lViBvRpBQm","G1RhS8TxD7","0PktIBpYhV","CIShG2DREs","2ZHdk24ARF","Yh1hFv1Hln","CdyBVxciqp","jiVBPuQIcz","v8yFNPOUYS",
+"OUqFMazIWp","RpBQm5nmWv","6AFT0JJs5m","VBjhz5Drn0","O3iyQSs0Zu","JJs5mRkQke","yvOMIQChxs","fmIK1Yh1hF","LbRTHXflUq","4W0TlqQxHP",
+"ulk41I7p2a","UlU3MtvdkD","5IhmGIjTwP","ciuWzFGzgp","0KyfsxXTI4","580YD2TRI7","tjQxspiJSk","lm0pDrKDLJ","14FLR8hJdt","29QAzWMiS3",
+"t59lRMGlTF","14FLRrz7Ut","lm0pDUl4a1","X6PinCp3mZ","7ku1pAmdQd","48cHLix74r","aL6AJaez9y","t98iWkB5nP","ru4UG2Yz7E","In3NShYBCK",
+"S2DfuQssNC","uLtKsuN6r3","G1RhSsx5Gl","618DiWPmlx","2ZHdkRpBQm","AOgEeIBe8k","lj07QVprf2","TXQ0ZJkzUn","CK5W7zmLYD","AOgEeaFFss",
+"StlDJJIqXi","VjCZqWDVWJ","W7cTsGSQwj","580YDMmKGJ","TwanoS2Dfu","lH1ktRzaZA","uupzko8Uyd","k85AeguMb8","64s8NNcICA","VLTy6uTacx",
+"oVQp67lUXZ","Zv7z0Q6hMC","Q6LixLDk6f","9rlg92Yz7E","ulk41ydG8U","JKWYRQWxoT","ciuWzaFFss","7fKYUQClRL","8FmFH0h1b1","4W0TlMezSW",
+"euZA5gjUTu","lViBv07n1c","uPX7GGXdoH","VjCZq0MR5X","6q6L9nFqik","K20wKHRxd8","580YDIBe8k","aFFss8TxD7","RpBQmHP433","5Drn0gdQsS",
+"5ZaEz9eoRc","fmIK1M3zXL","tAOsruTacx","K20wK8TxD7","48cHL9eoRc","tvdkDzFgtB","Waim6wiHrZ","SjskQWreyP","cQOnvn8pJ9","dQ586AIYUu",
+"SjskQguMb8","hYBCK5Mg9r","ogLgcFNYIM","Chuy3Ss0Zu","580YDReKEW","jzUqRDcpWB","Z4I1vyEfy9","Cfgr3MmsIo","HRxd88RCUA","FnPFBqUJMd",
+"MGlTFBCxeC","NOHszrz7Ut","M6qcGtvdkD","RzaZATwano","s93MlogLgc","tl72WZUnqt","Mkgy8Qworu","m4bxU5Namm","jeskScmXIX","cL0aE5VZjS",
+"FwEJzNOHsz","jS1ajYf2Ec","gtCA5MmKGJ","fFDrJZzJHW","QWxoT24ARF","pT8wuuJScX","5ZaEzxXTI4","QnJ1SY1mC0","cQOnvAkKTk","Ta8f6fqypy",
+"uoStwCxVEf","SbRYytAOsr","MaJQscmXIX","G1RhS2Nslm","okgRiHRxd8","16lHcuN6r3","b29RJ8FmFH","POUYS4QMc9","IKxdLi7WMQ","pvgjSnnP8o",
+"Ss0ZuuAWyp","t59lRiKqhr","0YAGHCp3mZ","WPmlxzbIYY","n8pJ9gjUTu","jSjS3zQt6Q","aez9yFVMxo","pmeCdvkCHH","jiVBP9eoRc","5Mg9r5Drn0",
+"djsrvTa8f6","v1Hln8FmFH","e6e4zZ4I1v","GSQwjBGaQY","fqypyYh1hF","RBhp0aFFss","QChxsnlaBy","gjUTuxciqp","MojnPuLtKs","SWfou8cVD3",
+"HP433HfyNQ","uupzkMezSW","Yf2Ec7hyVv","lkMUAzY1GY","oVQp6MojnP","CK5W7WMiS3","lsQGoKr8ys","v1HlnL7cGc","S2DfucmXIX","Yf2EcpAhR1",
+"v1Hln7hyVv","vkCHHzQt6Q","a00b5RzaZA","StlDJNxx9V","AXpwEHRxd8","OUqFMgtCA5","tuDySaez9y","P6bcgWDVWJ","Chuy3S2Dfu","BpYhVguMb8",
+"cmXIX8hJdt","BGaQYP6bcg","S2DfuydG8U","i7WMQYjB9t","L7cGcFPfSE","cQOnv0Kyfs","t59lRcL0aE","uQIczdpe1v","FLsph7ku1p","CNHmvWDVWJ",
+"EOE1ojS1aj","0BmCymX2GE","TXQ0ZokgRi","lkMUAWDVWJ","3otm6M3zXL","RmDcrPOUYS","AkKTkoGu6x","S2Dfu5Namm","qUJMdAIYUu","soy9tQbxXc",
+"BpYhVDQimp","NcICAyluBx","l83UdYf2Ec","K20wKKZamH","WaWsv0PktI","uJScX9XyT9","HP433tuDyS","dpe1vaDGtS","LDk6f16lHc","oGu6xx3LDe",
+"lm0pDDcpWB","fcwDajS1aj","ru4UGCNHmv","MezSWaez9y","0YAGHHRxd8","5NammfFDrJ","FNYIMBbwgA","faHirWPmlx","ydG8U580YD","tjQxsEdBKc",
+"gjUTucShY2","ydG8UAXpwE","bZLvSIRh48","AgJHQs93Ml","CK5W70MR5X","iKqhrtl72W","MK07YFFDui","ZUnqtbZLvS","GXdoHFnPFB","lkMUAHzZT8",
+"tl72WChuy3","Dz1R3iB08l","uLtKsNhXdu","AXpwEMGlTF","ZJTXHEOE1o","Kr8ysRmDcr","OUYuFWDVWJ","48cHLtl72W","UlU3M2ZHdk","Z4I1vd7vjM",
+"4QMc9K4GS8","SbRYyChuy3","WreyPAmdQd","IKxdL8U2nU","Cfgr3jzUqR","vOqCEguMb8","uQIczn8pJ9","VLTy6xReec","pvgjSYh1hF","kZANmjiVBP",
+"MezSWMmsIo","IKxdLfcJOy","cQOnveuZA5","hi5X7pWiOs","ksJbyKr8ys","uAWypulk41","AIYUuoGu6x","JIqXi0MR5X","5drc6W3VFH","pmeCdtAOsr",
+"yluBxTa8f6","FFDuilH1kt","48cHLuJScX","S2Dfux3LDe","5ZaEzCxVEf","h1zcHCqqaD","jfREufmIK1","s4786ZUnqt","wDajXAIYUu","Qworu2TRI7",
+"5VZjSzmLYD","618DituDyS","tAOsrpiJSk","RkQkePYBf4","RxrsmPOUYS","NhXdumz8gx","kZANmDG4sT","AmdQdlsQGo","QYxC0soy9t","9XyT9he9IA",
+"3otm6ZzJHW","aez9yRACuj","v2eC3iwzGk","lViBvNcICA","lXFOBazIWp","brhlQLewvM","SbRYycQOnv","ZzJHWtAOsr","soy9tuPX7G","0YAGHo8Uyd",
+"zFgtBSs0Zu","h1zcHECMvU","ru4UG5nmWv","AgJHQK4GS8","jtn0XzFgtB","AOgEeW7cTs","Ss0Zu2hEEU","IBe8kReKEW","SWfouEoToP","hSSvQlViBv",
+"euZA5K4GS8","1j5L8lweGy","Q6LixQworu","azIWpazIWp","uQIczVIlwP","okgRiCIShG","YOfrYYf2Ec","PYBf455rfB","nFqikGv3Fq","7lUXZpmeCd",
+"EdBKctvdkD","Mkgy8tlILt","VerEAiwzGk","gdQsSaDGtS","W7cTsbrhlQ","yEfy9wDajX","Dz1R3LbRTH","ksJbyNxx9V","DG4sTYf2Ec","5NammPYBf4",
+"64s8NYh1hF","fcwDaGrDg7","9y4lwni2v1","5nmWv2ZHdk","X6PinvLsmS","sqVrfKASQ8","9rlg97fsYM","DLhzMkB5nP","s7Mxkmz8gx","jtn0X5ZaEz",
+"GSQwjqUJMd","5iGN5NOHsz","yofH3jtn0X","xXTI4HfyNQ","qQxHPS2Dfu","pv0i7Q6Lix","iKqhr7ku1p","3otm6rhl0J","FPfSEZzJHW","Cfgr3ksJby",
+"brhlQ5nmWv","Q6LixCK5W7","lkMUAS2Dfu","BFkb8cQOnv","S2DfuYw2oU","OUqFMQ6hMC","5IhmGvLsmS","Ta8f65ZaEz","sx5GlQssNC","m4bxU7lUXZ",
+"NOHszZuDtD","lH1kt5Namm","kZANmS2Dfu","cShY2FjHXR","ZzJHWpiJSk","FPfSEl83Ud","LewvMlpF6W","ZhwG15nmWv","hi5X7VLTy6","s4786LDk6f",
+"dpe1vQClRL","yofH3JKWYR","iKqhrVLTy6","BGaQYCIShG","ciuWz5Namm","MojnPVerEA","pFrrlbZLvS","VerEA8hJdt","hi5X77ku1p","O3iyQY1mC0",
+"JkzUn48cHL","nFqikCdyBV","48cHLlsQGo","lH1ktzHF1q","FFDuiSjskQ","nnP8oiwzGk","1v5hHaFFss","55rfBvOqCE","Ss0ZuHRxd8","O3iyQ48cHL",
+"faHirfLNg8","Mkgy8FnPFB","8FmFHFVMxo","RxrsmcL0aE","fLNg8gf8rI","MezSWWaim6","okgRiTCgPp","YjB9t7hyVv","7lUXZS77LH","Rxrsmsx5Gl",
+"a00b5xReec","h1zcHoVQp6","QworuHlUbF","xXTI4ix74r","n8pJ9okgRi","h1zcHqUJMd","ciuWzd7vjM","wDajXVIlwP","J2mQigdQsS","SjskQiwzGk",
+"fcwDablLA9","ZUnqtaFFss","lCMxyzHF1q","AgJHQJkzUn","ZUnqtQClRL","gIYvEtvdkD","taOXKydG8U","RxrsmvkCHH","k85AejiVBP","WDVWJ6AFT0",
+"CIShGOUYuF","aFFsshi5X7","taOXKjzUqR","M3zXLHP433","WMiS3wiHrZ","xXTI47fKYU","QworuZUnqt","aL6AJFPfSE","yToGWRkQke","HzZT8oGu6x",
+"IBe8kMojnP","o8Uyd7hyVv","BGaQYvOqCE","vOqCERsQUq","HRxd8HfyNQ","soy9tRBhp0","ksJbysqVrf","wDajX7fsYM","J2mQiTXQ0Z","uvf7AMK07Y",
+"AXpwEyToGW","YjB9tyofH3","LbRTHCxVEf","cQOnvqUJMd","Yf2Ecsx5Gl","5drc66AFT0","XyPZN9XyT9","5Mg9rFGzgp","BFkb8K4GS8","blLA9FNYIM",
+"oVQp67X3uy","jSjS307n1c","HzZT8lm0pD","Cp3mZKZamH","SbRYyBbwgA","n1pmOfqypy","vLsmSni2v1","5drc6L7cGc","he9IA1LB1L","aez9y0Wr5y",
+"5Mg9r24ARF","FGzgp2hEEU","OxWIHRBhp0","aFFssStlDJ","FLsphyToGW","1LB1LAkKTk","uAWypRxrsm","azIWpLDk6f","DQimptl72W","LewvM8RCUA",
+"gIYvEYw2oU","X6PinNcICA","PYBf4iwzGk","jSjS38U2nU","JIqXipvgjS","XyPZNtl72W","UmaEvrKDLJ","uvf7A1LB1L","0YAGHAkKTk","k85AeQssNC",
+"FLsphYjB9t","hYBCKuZPqg","azIWpt98iW","wDajXgdQsS","Mkgy8dmoS7","gtCA5OHaBz","pmeCd45cIH","wDajXfaHir","TXQ0ZOUqFM","K4GS8ru4UG",
+"W3VFHfLNg8","oGu6x45cIH","hSSvQHlUbF","y94nwkZANm","0YAGHoGu6x","M6qcGMmsIo","uPX7GJRJQB","MGlTFlViBv","CNHmv0PktI","iKqhrEOE1o",
+"cQOnvfFDrJ","JXljWMezSW","iqv4kyvOMI","CIShG5IhmG","ru4UGNxx9V","lj07Q7Ow5C","HlUbFZv7z0","Z4I1vyToGW","hE1QlfcJOy","DG4sTgdQsS",
+"CK5W7S2Dfu","Waim6HRxd8","lH1ktTCgPp","Yf2EcgdQsS","5nmWvYOfrY","EdBKcWreyP","bZLvSd7vjM","1j5L88cVD3","lCMxyoVQp6","9XyT90PktI",
+"4dEz6zqH0W","Cp3mZ2DREs","TwanoW3VFH","9XyT907n1c","jzUqRe6e4z","nFqik5drc6","7lUXZEOE1o","2DREshE1Ql","RkQkegf8rI","t98iWAgJHQ",
+"pAhR1LewvM","dmoS7NcICA","9iGoTrz7Ut","gIYvEatef2","FLsphIjTwP","gf8rIk85Ae","K20wKd7vjM","b29RJRpBQm","wiHrZpWiOs","L7cGcM6qcG",
+"oGu6xyofH3","CxVEf48cHL","StlDJP6bcg","Cfgr3GWqqX","pmeCd7fKYU","PYBf4yluBx","RBhp0piJSk","AgJHQCxVEf","ydG8UuAWyp","0YAGHn1pmO",
+"VLTy6EOE1o","Gv3FqzFgtB","WDVWJqQxHP","atef2gtCA5","pT8wu9rlg9","dpe1vDQimp","mz8gxs93Ml","5Drn07ku1p","t98iWwiHrZ","5iGN5PYBf4",
+"29QAzgtCA5","L7cGcNhXdu","618DiDLhzM","Oz8yZWmadA","a00b5JJs5m","cmXIX9XyT9","L7cGcrKDLJ","Zv7z00YAGH","lm0pDn1pmO","EOE1omX2GE",
+"Oz8yZn8pJ9","t59lRlH1kt","mX2GEOUqFM","7hyVvVjCZq","7ku1pn8pJ9","I7p2aRsQUq","Gv3Fqsoy9t","FPfSEiKqhr","uJScXuJScX","9iGoT0Kyfs",
+"zbIYYL7cGc","2hEEUAmdQd","55rfB7lUXZ","jzUqRYjB9t","8xEKzogLgc","BCxeC5Namm","WaWsvZzJHW","GrDg7HzZT8","3weIFMmsIo","rz7Ut0h1b1",
+"Nxx9Vd85a9","8FmFHYOfrY","Ta8f6ix74r","FhtgllXFOB","0BmCypT8wu","HfyNQ7fsYM","pvgjSuupzk","9rlg9FPfSE","sqVrfCNHmv","fLNg8jSjS3",
+"W7cTsL7cGc","07n1cWreyP","yToGWaFFss","okgRiWMiS3","0MR5X45cIH","StlDJoVQp6","pT8wuP6bcg","oQ87rjzUqR","UlU3Mlm0pD","fcJOyyvOMI",
+"azIWp29QAz","0KyfsVIlwP","9y4lwlsQGo","uLtKsiwzGk","0ao3leuZA5","7ku1pKsjRK","QChxszqH0W","VBjhzi3pyd","9XyT9okgRi","RkQkeNAFuw",
+"HRxd8VBjhz","suY4xn1pmO","ciuWzC2Irc","RpBQm07n1c","WPmlxZJTXH","sqVrfCK5W7","jzUqRsqVrf","FnPFBfaHir","hYBCKqUJMd","MaJQs5ZaEz",
+"5nmWvJKWYR","x3LDeWmadA","TwanonlaBy","1j5L8i3pyd","FhtglpFrrl","jiVBPk85Ae","FFDuitaOXK","v2eC3lCMxy","FhtglcShY2","y94nwjzUqR",
+"SbRYySjskQ","AmdQdciuWz","QnJ1SfmIK1","lH1ktv1Hln","pv0i7618Di","i3pydYOfrY","uJScXv1Hln","QChxsaez9y","M6qcGJXljW","6AFT0ogLgc",
+"qaofN2TRI7","pAhR12ZHdk","kB5nP1j5L8","XyPZNbrhlQ","Dz1R39iGoT","tlILtoGu6x","fqypy9rlg9","iwzGkpmeCd","ogLgcpmeCd","KsjRKfcJOy",
+"zqH0WcmXIX","B3qemVIlwP","djsrvZ4I1v","xXTI4ydG8U","pmeCdKZamH","ix74ruLtKs","uvf7AFVMxo","16lHc5drc6","aFFssWPmlx","euZA5G1RhS",
+"2ZHdk8xEKz","iB08l1j5L8","yToGWQssNC","FNYIMB3qem","ksJbyAIYUu","Q6LixZhwG1","djsrvNo0Qb","Mm8siAOgEe","aL6AJtvdkD","lXFOBtaOXK",
+"qQxHP0MR5X","FnPFBWaWsv","NcICAksJby","D6rByWMiS3","Ta8f6uZPqg","MK07Y07n1c","1v5hHb29RJ","dQ586n8pJ9","M3zXLHRxd8","UlU3MQ6hMC",
+"nlaByPYBf4","YOfrYBbwgA","FNYIMkZANm","14FLR580YD","faHir2DREs","AIYUuC2Irc","0PktIiB08l","VIlwPuupzk","ThjNnWMiS3","oGu6xS2Dfu",
+"lXFOBCxVEf","qQxHPt98iW","580YDlCMxy","uAWypl83Ud","P6bcg8hJdt","FGzgp7fsYM","B3qemMGlTF","POUYS0MR5X","P6bcg07n1c","WreyPFNYIM",
+"hYBCKVerEA","iqv4kxXTI4","M6qcGoVQp6","uZPqgY1mC0","pv0i7C2Irc","618DiAkKTk","rz7Ut29QAz","Y1mC0dhSuH","4W0TllweGy","nFqikI7p2a",
+"F6PT20Kyfs","618DiuZPqg","0KyfsPb1pa","azIWptl72W","Qworu8FmFH","n8pJ9G1RhS","lXFOB5drc6","Q6hMCFjHXR","NhXduAOgEe","d85a9rz7Ut",
+"azIWpVBjhz","0ao3l0BmCy","Yf2EcfaHir","ReKEWlweGy","HfyNQVjCZq","Ta8f65nmWv","Chuy3vOqCE","ksJbyoGu6x","DG4sTzqH0W","MmsIolH1kt",
+"KASQ86q6L9","XyPZN5IhmG","faHirHfyNQ","FVMxofcJOy","NAFuwdQ586","GrDg7Mkgy8","yvOMIEoToP","nFqikgdQsS","5ZaEzv2eC3","BbwgAK4GS8",
+"ECMvUy94nw","BFkb8jiVBP","Nxx9VOUYuF","v8yFNSbRYy","VBjhzSjskQ","5IhmG618Di","5iGN5QssNC","jSjS3lXFOB","pvgjSKZamH","BGaQYsuY4x",
+"1v5hHTa8f6","StlDJhi5X7","I7p2a7fKYU","NOHszMmsIo","n8pJ9ReKEW","CNHmv3otm6","D6rByAmdQd","vOqCEZUnqt","GSQwjUlU3M","4dEz6yvOMI",
+"CqqaDgjUTu","CdyBVYjB9t","iwzGkjS1aj","ru4UG8FmFH","k85AeRBhp0","1LB1LMezSW","Mkgy8CIShG","8hJdtFhtgl","euZA5B3qem","a00b516lHc",
+"HzZT8FPfSE","MojnPMK07Y","xciqpM3zXL","KASQ8KASQ8","aL6AJb29RJ","8cVD3x3LDe","e6e4zOxWIH","8FmFHCfgr3","zz4ZUfLNg8","0Wr5yReKEW",
+"IBe8kBbwgA","4W0TlhE1Ql","zz4ZUB3qem","55rfBNAFuw","hYBCK0h1b1","Ta8f6JXljW","SmGzvL7cGc","FVMxo0PktI","No0QbazIWp","9eoRcNxx9V",
+"AgJHQKZamH","VerEAhSSvQ","QssNCd85a9","okgRi5IhmG","MK07Y1v5hH","U3yw5i7WMQ","RpBQmhSSvQ","Yw2oUsuY4x","6AFT0AmdQd","GXdoH3weIF",
+"sx5GlbrhlQ","FLsphFGzgp","9y4lwfcwDa","MaJQswiHrZ","K20wKuJScX","yvOMIK20wK","L7cGclsQGo","yofH3AkKTk","pWiOsDz1R3","7fsYMulk41",
+"K4GS8aez9y","ZJTXHxReec","5ZaEzMGlTF","DcpWByToGW","RmDcrJJs5m","YOfrYS77LH","Ul4a1bgJAz","DG4sT9y4lw","hSSvQfmIK1","Dz1R3piJSk",
+"uoStw55rfB","6q6L9MezSW","CK5W7FVMxo","l83Udlj07Q","NAFuwKASQ8","W3VFHAXpwE","MmKGJGWqqX","rhl0JRBhp0","QClRLYw2oU","oVQp6cL0aE",
+"K4GS8FwEJz","5NammyvOMI","zz4ZUv8yFN","uLtKsMkgy8","AgJHQMezSW","BCxeCKr8ys","zqH0WuJScX","DQimpGrDg7","MmKGJoGu6x","bZLvSBGaQY",
+"OHaBzogLgc","5VZjS7fKYU","cmXIXGXdoH","RpBQmSs0Zu","NOHszRsQUq","0ao3le6e4z","J2mQi5Namm","EdBKcSjskQ","uoStwdQ586","LbRTHyvOMI",
+"v1HlnWMiS3","FNYIMtvdkD","48cHLv1Hln","0KyfsqQxHP","xReecUvlv4","wiHrZx3LDe","HzZT8cQOnv","JJs5m2hEEU","uJScXnFqik","5nmWvXyPZN",
+"okgRi0Kyfs","l83UdFNYIM","Zv7z0GWqqX","fmIK1pAhR1","JRJQBDQimp","fcwDadjsrv","nFqiks7Mxk","55rfBMkgy8","BbwgAYw2oU","xReecksJby",
+"pT8wurKDLJ","zQt6QF6PT2","OxWIHKASQ8","WmadA2Yz7E","5drc6618Di","d7vjMwDajX","n8pJ9iwzGk","OHaBzpWiOs","FVMxoCIShG","WPmlx8hJdt",
+"hUTw7J2mQi","dpe1vOUYuF","VjCZqjfREu","FnPFBLDk6f","CqqaDciuWz","ZuDtDWDVWJ","EoToPzbIYY","S2DfuQYxC0","t98iWMmKGJ","ZzJHW7X3uy",
+"he9IA55rfB","xciqpWreyP","8FmFHwDajX","YjB9tW7cTs","55rfB5IhmG","blLA9ZJTXH","Mkgy8OUqFM","8U2nU0MR5X","BGaQY8xEKz","LbRTHDQimp",
+"HlUbFpWiOs","POUYSQ6Lix","zFgtBlm0pD","cShY25nmWv","SWfouThjNn","DG4sTUl4a1","ZJTXHa00b5","14FLRUvlv4","h1zcHCK5W7","FPfSEwiHrZ",
+"GWqqXdQ586","9y4lwgIYvE","ix74rzmLYD","uZPqg7ku1p","i3pydpmeCd","M3zXL2Yz7E","JKWYReuZA5","xReecIBe8k","QnJ1SBbwgA","gdQsSzbIYY",
+"8TxD7cL0aE","0YAGHQworu","uLtKsWaWsv","DQimpjzUqR","JRJQBbrhlQ","Uvlv4kB5nP","SWfouWmadA","JJs5m0BmCy","ThjNnaez9y","d85a9AmdQd",
+"pvgjS5iGN5","Chuy3nnP8o","ECMvUBbwgA","RsQUqYh1hF","l83Ud5Drn0","Vprf2POUYS","pv0i7jfREu","1v5hHReKEW","lCMxyReKEW","aDGtSwiHrZ",
+"Chuy3AOgEe","WreyPlj07Q","Gv3FqQbxXc","zY1GYjzUqR","pWiOsaDGtS","Oz8yZ5VZjS","Nxx9VxReec","ulk41cShY2","Cp3mZZUnqt","XflUqIBe8k",
+"5drc6gjUTu","J2mQiYOfrY","Nxx9Vo8Uyd","F6PT27ku1p","wiHrZ7fKYU","aL6AJcmXIX","M3zXLyToGW","QnJ1Stl72W","Ta8f6KZamH","8FmFHIBe8k",
+"Zv7z09XyT9","iB08lYjB9t","k85AePb1pa","HlUbF5drc6","16lHcdjsrv","guMb8DG4sT","guMb81LB1L","JJs5mulk41","8TxD7ZhwG1","m4bxU0MR5X",
+"Yw2oUDQimp","rz7Ut5Namm","Ta8f6cQOnv","D6rBylXFOB","5ZaEzFNYIM","Q6LixFNYIM","5NammzmLYD","VjCZqZUnqt","v1HlnDz1R3","prNT6DcpWB",
+"WDVWJIBe8k","POUYSIn3NS","n1pmONo0Qb","7fsYMK20wK","zY1GY0PktI","nnP8o5Drn0","ix74r1v5hH","JkzUnQYxC0","nlaByQbxXc","S2DfufmIK1",
+"aFFssAIYUu","Zv7z0JIqXi","SmGzvF6PT2","iKqhruJScX","HfyNQGWqqX","2ZHdkfmIK1","5IhmG14FLR","k85AegdQsS","sqVrfNOHsz","ZuDtDVBjhz",
+"o8Uydh1zcH","K20wKM3zXL","U3yw5JRJQB","uoStwDG4sT","AIYUuMojnP","dmoS7FFDui","yvOMI9eoRc","AkKTkfFDrJ","GXdoHEoToP","DcpWBIBe8k",
+"HRxd8pWiOs","XyPZNulk41","iwzGk7Ow5C","4W0TlTa8f6","y94nwRmDcr","Uvlv4fmIK1","FNYIMS2Dfu","n1pmORBhp0","uZPqgKsjRK","s93MluPX7G",
+"CNHmvHlUbF","ogLgcv8yFN","n1pmOReKEW","QChxsix74r","BbwgAgIYvE","W3VFHxReec","Oz8yZUvlv4","UmaEvpFrrl","fmIK1aDGtS","euZA5rz7Ut",
+"JJs5muTacx","hE1Qlfqypy","XyPZNazIWp","0ao3latef2","wiHrZCIShG","pmeCdtuDyS","StlDJNo0Qb","aFFssQssNC","5ZaEzOUqFM","uQIczcmXIX",
+"soy9tQWxoT","zHF1qVLTy6","7hyVvEOE1o","tl72WcShY2","kZANmnFqik","gjUTuJJs5m","ix74rnlaBy","lpF6WFGzgp","s93MlQbxXc","NhXduIRh48",
+"Pb1pa45cIH","9rlg9fcJOy","P6bcguZPqg","QChxs0h1b1","9y4lwMmKGJ","HP433AkKTk","iqv4kru4UG","ix74rgf8rI","WDVWJRsQUq","d7vjMfqypy",
+"t59lRtjQxs","WDVWJ45cIH","CqqaDpv0i7","Uvlv44QMc9","FcWrWYOfrY","okgRiAXpwE","nnP8otvdkD","azIWpQWxoT","HP433FLsph","wiHrZEdBKc",
+"faHiri3pyd","P6bcgfLNg8","nlaByQClRL","O3iyQgf8rI","zHF1q1j5L8","IjTwPmz8gx","7ku1pbrhlQ","RsQUqlCMxy","uupzkkZANm","fcJOyguMb8",
+"i3pydQssNC","d7vjMb29RJ","lXFOBhE1Ql","bgJAzMK07Y","Oz8yZtuDyS","IKxdLChuy3","WmadAhe9IA","ru4UGQYxC0","7hyVvtaOXK","yEfy9djsrv",
+"Q6hMCRxrsm","K4GS80Kyfs","n8pJ9m4bxU","y94nwFxX9q","ru4UGFwEJz","a00b51LB1L","iKqhrMkgy8","pT8wusx5Gl","S77LHEOE1o","JRJQBAgJHQ",
+"prNT6VBjhz","WaWsvlXFOB","faHirIjTwP","jtn0Xv2eC3","ZJTXHhE1Ql","Ul4a1Yw2oU","2ZHdkWMiS3","2Yz7E24ARF","soy9tazIWp","8xEKzUlU3M",
+"W3VFHcShY2","gjUTuFVMxo","SmGzvFnPFB","C2IrcMK07Y","Oz8yZHzZT8","NOHszgtCA5","guMb8CNHmv","lViBvdhSuH","zmLYDPOUYS","lm0pDiqv4k",
+"Uvlv4VIlwP","7ku1pF6PT2","jeskSpiJSk","5Drn0cShY2","yluBxrz7Ut","M3zXLVerEA","CK5W7M3zXL","nFqikBFkb8","MGlTF0ao3l","FwEJzxXTI4",
+"Uvlv4taOXK","Yh1hFMojnP","vLsmS7ku1p","cQOnvTCgPp","ulk41t98iW","ru4UGVprf2","s93MlVerEA","uJScXuPX7G","AOgEeVjCZq","fcwDapmeCd",
+"DQimpVLTy6","9XyT9J2mQi","gIYvEuAWyp","azIWplH1kt","CNHmvFVMxo","SWfouh1zcH","jS1ajM6qcG","Ul4a12Nslm","cQOnvEoToP","Gv3FqFwEJz",
+"KZamHfmIK1","he9IAuLtKs","EdBKc5iGN5","pWiOs16lHc","Yf2EcqQxHP","blLA9lViBv","d7vjMNxx9V","d85a9RzaZA","iKqhrPb1pa","m4bxURxrsm",
+"MK07YJkzUn","suY4xlkMUA","AXpwE0YAGH","Yh1hFTa8f6","taOXKvkCHH","QssNCRpBQm","hSSvQ5VZjS","2TRI7CqqaD","soy9tStlDJ","Gv3Fq9y4lw",
+"OxWIH5iGN5","G1RhSaDGtS","dhSuH7fsYM","Kr8ys5VZjS","ZhwG1Vprf2","DG4sTRzaZA","SbRYy5Namm","FNYIMLDk6f","1v5hHix74r","dQ5860ao3l",
+"ThjNnpmeCd","b29RJAOgEe","zqH0W5iGN5","VerEAoQ87r","7ku1pM6qcG","uZPqgsoy9t","DQimpI7p2a","s4786AXpwE","Ss0ZuS2Dfu","v8yFNVjCZq",
+"Waim6djsrv","RBhp0Vprf2","iB08lcShY2","iqv4k9rlg9","FNYIMjSjS3","9rlg96q6L9","MK07YLewvM","jzUqRvOqCE","ksJbyvOqCE","Q6LixxReec",
+"t98iW5ZaEz","POUYSVNCPd","tlILtyluBx","prNT6RpBQm","pv0i7Twano","oGu6xCIShG","OHaBzx3LDe","y94nwKZamH","FjHXRJXljW","YjB9tWaWsv",
+"JRJQBEdBKc","Rxrsma00b5","gjUTu64s8N","2DREs8RCUA","xciqpJIqXi","24ARFAIYUu","Waim6S2Dfu","guMb8ThjNn","iB08lZJTXH","aL6AJMmsIo",
+"OHaBzQ6hMC","e6e4zs7Mxk","vOqCEBCxeC","QChxs5IhmG","8RCUAqUJMd","lj07QtAOsr","dQ586hE1Ql","8hJdtyEfy9","lViBvvLsmS","euZA5b29RJ",
+"lViBvaFFss","Uvlv4v8yFN","h1zcHjeskS","WMiS3tl72W","7lUXZKsjRK","HlUbFokgRi","MmKGJhUTw7","ulk41b29RJ","2NslmQChxs","DcpWBSmGzv",
+"Kr8ys5drc6","vkCHHi7WMQ","uAWype6e4z","ogLgcECMvU","gf8rIrKDLJ","FcWrWmX2GE","euZA5Yw2oU","qQxHPpiJSk","55rfBmX2GE","WPmlxlweGy",
+"Zv7z0Pb1pa","7ku1pRpBQm","8cVD3DLhzM","s7MxkFcWrW","blLA9Mm8si","bgJAzfFDrJ","pvgjSQ6hMC","QWxoTCp3mZ","XflUqTwano","pT8wu24ARF",
+"HlUbFx3LDe","EOE1olViBv","NhXduWMiS3","iwzGkt98iW","YjB9tuupzk","vOqCEHfyNQ","IRh48ZzJHW","XflUqjzUqR","oVQp62Yz7E","KZamHOUqFM",
+"9y4lw0Kyfs","SWfouXflUq","GWqqXFLsph","9iGoTXflUq","ni2v15Drn0","aDGtSQChxs","n8pJ9zFgtB","XyPZNMezSW","zmLYDhUTw7","CxVEfpWiOs",
+"3weIFnFqik","8U2nUXflUq","uvf7A2DREs","aDGtSWMiS3","uLtKszQt6Q","JXljWDcpWB","WDVWJ8cVD3","M6qcGCp3mZ","nlaByDLhzM","piJSkRmDcr",
+"lsQGo7hyVv","SbRYyoVQp6","RBhp0D6rBy","MGlTFvkCHH","yToGWVjCZq","2hEEUogLgc","VerEA8U2nU","O3iyQRmDcr","d85a9HfyNQ","K20wKUmaEv",
+"pAhR1fLNg8","FjHXRL7cGc","ksJbyi3pyd","Ul4a1Cp3mZ","JXljWogLgc","faHirMK07Y","fmIK1rKDLJ","64s8NAgJHQ","CK5W7RzaZA","G1RhStAOsr",
+"5IhmGQChxs","BFkb8zQt6Q","O3iyQi3pyd","guMb85drc6","NcICABpYhV","M6qcGd85a9","MezSWjtn0X","QWxoT4dEz6","FNYIMwiHrZ","gjUTufLNg8",
+"oGu6xYOfrY","MezSWhSSvQ","dmoS7TCgPp","K20wKrz7Ut","0YAGHVLTy6","K4GS8EoToP","FGzgp8TxD7","AgJHQQnJ1S","5nmWvokgRi","jtn0Xix74r",
+"7ku1ptAOsr","8hJdtUmaEv","FNYIMGXdoH","okgRix3LDe","Vprf2VIlwP","l83Ud45cIH","StlDJZv7z0","s4786lweGy","9eoRcJIqXi","5iGN5CNHmv",
+"Yh1hFFxX9q","GSQwjZUnqt","5nmWvDQimp","v2eC3tAOsr","IRh48piJSk","B3qemMkgy8","5iGN59rlg9","t98iWuN6r3","9XyT9zY1GY","TwanoksJby",
+"faHir2ZHdk","aL6AJydG8U","tl72WPOUYS","StlDJzmLYD","6q6L9RACuj","S2Dfu48cHL","gtCA5ZUnqt","2DREsMGlTF","ru4UGJkzUn","mX2GEDQimp",
+"nlaBySWfou","0YAGHuPX7G","KASQ829QAz","Chuy3NcICA","3otm6ciuWz","l83UdM3zXL","e6e4zQClRL","cmXIXLDk6f","KASQ8dQ586","Vprf2vkCHH",
+"ZUnqt5Mg9r","WMiS3nFqik","9iGoTsx5Gl","ReKEW48cHL","IjTwPjzUqR","jiVBPmX2GE","F6PT2JRJQB","prNT6xXTI4","QbxXca00b5","Cp3mZBpYhV",
+"BbwgAQworu","3otm6MK07Y","mX2GEyToGW","lCMxy9y4lw","Nxx9VQClRL","5Drn0djsrv","Gv3FqzHF1q","FFDuiazIWp","KASQ8CqqaD","suY4xQbxXc",
+"lkMUAMaJQs","oQ87rNxx9V","BbwgA9XyT9","AkKTkuupzk","jSjS3BbwgA","QworuX6Pin","FwEJzW3VFH","CNHmvlj07Q","Z4I1vtjQxs","W3VFHgf8rI",
+"BCxeCuN6r3","ulk41580YD","KASQ89rlg9","xXTI4pAhR1","tvdkDpmeCd","jiVBPlCMxy","uLtKsAkKTk","S2DfuVIlwP","5VZjSFcWrW","soy9t9y4lw",
+"LDk6fMmKGJ","sx5GlTCgPp","Mm8siSmGzv","8xEKzJXljW","CdyBVPYBf4","9eoRcRBhp0","NOHszJkzUn","vOqCEFwEJz","vLsmSnFqik","qQxHPMojnP",
+"pWiOsECMvU","IjTwPaez9y","8TxD7CNHmv","B3qems7Mxk","OxWIHMK07Y","piJSkWaim6","s4786Mkgy8","oVQp6ZJTXH","jS1ajEOE1o","hE1Qlru4UG",
+"xXTI44dEz6","Gv3FqQClRL","v2eC3s7Mxk","QYxC0okgRi","h1zcHBbwgA","i3pydS2Dfu","zQt6QRmDcr","3otm61v5hH","GrDg7AIYUu","o8Uyd7ku1p",
+"aL6AJK20wK","QYxC0WMiS3","zFgtBbrhlQ","IRh48tlILt","tvdkDFLsph","Dz1R3faHir","KZamHUlU3M","M6qcGrhl0J","9eoRcbZLvS","UmaEvmz8gx",
+"uAWyp5ZaEz","9iGoTJXljW","OUYuFlsQGo","cQOnvjS1aj","48cHLDQimp","aL6AJqQxHP","DLhzMtjQxs","GSQwjtvdkD","Zv7z0M6qcG","EdBKcrhl0J",
+"5IhmGhSSvQ","jiVBPFjHXR","Zv7z0Zv7z0","lCMxyM3zXL","azIWpuTacx","rhl0JK4GS8","AgJHQy94nw","Yw2oUMK07Y","HzZT8SjskQ","bZLvS8RCUA",
+"ydG8U8cVD3","FjHXRrKDLJ","fcwDavLsmS","MaJQsJRJQB","7ku1pGXdoH","dQ586ZzJHW","8FmFHQClRL","07n1cn8pJ9","e6e4zBpYhV","Ul4a1fFDrJ",
+"Yf2Ec9y4lw","HRxd8vLsmS","jS1aj9GXkX","lweGyQbxXc","RBhp0dQ586","8U2nUJXljW","lweGyY1mC0","x3LDeguMb8","jfREuuTacx","fLNg8Waim6",
+"YjB9tZUnqt","FFDui8xEKz","zmLYDblLA9","zz4ZUqaofN","djsrvSWfou","8FmFHn8pJ9","pWiOso8Uyd","lkMUAF6PT2","HlUbFfqypy","Chuy3zHF1q",
+"QnJ1SU3yw5","faHirOUqFM","oGu6xh1zcH","2hEEUAgJHQ","gf8rIG1RhS","OHaBzRxrsm","3weIFuJScX","ksJbyeuZA5","ciuWz4dEz6","fLNg8v8yFN",
+"8TxD7RpBQm","24ARF8TxD7","6AFT0fLNg8","xXTI4lXFOB","Yh1hF5ZaEz","FPfSEO3iyQ","LewvMBGaQY","xReecAIYUu","i3pydhYBCK","MmKGJNcICA",
+"POUYShE1Ql","07n1c55rfB","M3zXLTCgPp","4dEz6nFqik","uPX7GnlaBy","RxrsmpiJSk","RpBQmt59lR","XflUqazIWp","qQxHPciuWz","TXQ0Zs93Ml",
+"IRh48Nxx9V","No0QbyofH3","ThjNnhi5X7","1LB1LlpF6W","kB5nPd85a9","fFDrJt59lR","qQxHPlViBv","8U2nU1v5hH","bgJAzoGu6x","0BmCy7fsYM",
+"L7cGcQbxXc","ReKEW8FmFH","M6qcGYw2oU","8RCUAGXdoH","5Drn03weIF","5nmWvzz4ZU","Uvlv4kZANm","No0QbHRxd8","WPmlxIRh48","4dEz6CqqaD",
+"MojnPsqVrf","Chuy3JIqXi","Cfgr3YjB9t","l83UdNcICA","07n1ct98iW","bZLvSHlUbF","1LB1LsuY4x","5drc6aL6AJ","FPfSEgIYvE","Mkgy8pv0i7",
+"5ZaEzzHF1q","Ul4a1brhlQ","Mm8siStlDJ","FGzgpHfyNQ","zbIYYjSjS3","v1HlnQYxC0","h1zcHQssNC","IKxdL9y4lw","S2Dfu3otm6","WMiS3EdBKc",
+"v8yFNWaim6","FPfSEVjCZq","QClRLNhXdu","HzZT8gtCA5","XyPZNqQxHP","lm0pDuAWyp","pWiOsfaHir","hUTw7CdyBV","RpBQmJkzUn","uZPqgAXpwE",
+"DQimp9y4lw","k85AecShY2","uvf7A9iGoT","aL6AJqUJMd","MmsIoW3VFH","uvf7AJRJQB","uTacxStlDJ","45cIHgIYvE","Yh1hF0PktI","QWxoTZzJHW",
+"tAOsrtjQxs","SWfou4dEz6","ni2v1hSSvQ","atef22TRI7","3weIF8cVD3","4QMc9zz4ZU","t59lRQbxXc","rKDLJ5ZaEz","bgJAzzqH0W","ulk41s7Mxk",
+"xReecaFFss","WMiS38cVD3","0ao3l1v5hH","HRxd8vkCHH","tuDySX6Pin","s4786gf8rI","ReKEWCp3mZ","POUYSRxrsm","cQOnvSbRYy","Chuy3a00b5",
+"Yf2Ec5Drn0","d85a9l83Ud","8TxD7gf8rI","xciqpPb1pa","RBhp0JJs5m","yluBxaez9y","iqv4k7X3uy","i7WMQru4UG","1LB1LBCxeC","QWxoTt59lR",
+"ZhwG1ZJTXH","LewvMQYxC0","GXdoHtaOXK","OUYuFFVMxo","MaJQszbIYY","NOHsz4W0Tl","prNT6EdBKc","jtn0XkB5nP","5Namm8U2nU","lsQGoCdyBV",
+"NhXdu2Nslm","Z4I1vJIqXi","zqH0WdQ586","5Mg9rKsjRK","Yw2oUJKWYR","uQIczh1zcH","G1RhSwDajX","tlILt4W0Tl","2DREspmeCd","soy9tOxWIH",
+"CxVEf55rfB","8RCUAyvOMI","7lUXZFnPFB","yofH3CK5W7","1LB1LiB08l","14FLRUlU3M","gtCA53weIF","29QAzCIShG","CNHmvK20wK","29QAzzmLYD",
+"5VZjSatef2","6AFT0uN6r3","RsQUqoGu6x","55rfB0YAGH","AOgEeCIShG","oGu6xt59lR","In3NSW3VFH","55rfBVBjhz","VjCZqOUYuF","OUqFMCK5W7",
+"VerEAHlUbF","JJs5mWPmlx","AXpwE2Nslm","HP433lweGy","pT8wuQChxs","tAOsr580YD","Yh1hFm4bxU","zY1GYL7cGc","sqVrfQClRL","FjHXRiB08l",
+"AIYUuyvOMI","24ARFZv7z0","RBhp08FmFH","IRh48FVMxo","uoStwZv7z0","FxX9qRBhp0","BbwgACdyBV","QworuguMb8","guMb8v1Hln","kZANm7fsYM",
+"pvgjSY1mC0","bZLvSEdBKc","l83Udhi5X7","VjCZq8TxD7","s4786n1pmO","CdyBVCfgr3","KASQ8AOgEe","vLsmSh1zcH","O3iyQxciqp","RxrsmJKWYR",
+"LewvMyvOMI","fcwDaD6rBy","ydG8U7hyVv","v8yFN9iGoT","SWfouMm8si","gdQsSjSjS3","8RCUAtl72W","d7vjMHP433","AmdQda00b5","AIYUuD6rBy",
+"azIWpSWfou","tAOsrOUqFM","RsQUqHRxd8","d85a90Wr5y","MGlTFhSSvQ","DG4sTFPfSE","64s8NogLgc","VjCZqhUTw7","55rfBPOUYS","DQimp0PktI",
+"BpYhVStlDJ","8xEKzZzJHW","bZLvS7lUXZ","JIqXi0BmCy","zmLYDGSQwj","e6e4zksJby","SmGzvFjHXR","AmdQdWaim6","fcJOyEdBKc","7lUXZQChxs",
+"o8Uyd1LB1L","8cVD3CIShG","suY4xcShY2","QChxsGv3Fq","48cHLsoy9t","ZJTXHFGzgp","jiVBP8U2nU","MaJQs5Namm","pFrrl2hEEU","ulk41QChxs",
+"tl72WLDk6f","O3iyQlpF6W","yToGWn1pmO","AIYUuv1Hln","lH1ktNo0Qb","nFqik580YD","Vprf2xXTI4","RmDcrpAhR1","vkCHH8FmFH","zQt6QGWqqX",
+"i7WMQJKWYR","7Ow5CguMb8","gtCA5lsQGo","BbwgAYh1hF","sx5Glv1Hln","0KyfsyofH3","euZA5mz8gx","Mm8si7Ow5C","xciqpIn3NS","faHirgIYvE",
+"ZhwG1wiHrZ","MaJQsru4UG","jiVBPS77LH","jeskSokgRi","tuDySa00b5","oVQp6y94nw","FPfSEVprf2","Oz8yZSWfou","GXdoHuZPqg","vkCHHyEfy9",
+"QnJ1SPYBf4","HP433AIYUu","aez9y9y4lw","PYBf4nnP8o","uAWypQnJ1S","AIYUuxciqp","XflUqFFDui","cQOnvKr8ys","S2DfufFDrJ","uN6r3ReKEW",
+"HP433WmadA","9rlg9Oz8yZ","KASQ8zmLYD","S2DfuzHF1q","6q6L9VIlwP","Dz1R3iwzGk","Mkgy8QWxoT","VIlwPQYxC0","LewvMtlILt","djsrvQYxC0",
+"SmGzvRBhp0","UmaEvDQimp","KsjRKSjskQ","zz4ZUzHF1q","prNT6WmadA","gtCA5iqv4k","RpBQmMGlTF","hUTw7Chuy3","ni2v1wDajX","a00b5Waim6",
+"lj07QyEfy9","Rxrsm7Ow5C","0ao3lQ6Lix","VerEAuJScX","uoStwQ6Lix","FVMxo29QAz","O3iyQtl72W","d7vjMFcWrW","yvOMISWfou","OUYuFFGzgp",
+"pvgjSoQ87r","lweGyzmLYD","JkzUnrz7Ut","taOXKzmLYD","JkzUnfcJOy","QClRLulk41","pFrrlAmdQd","zqH0WOUqFM","0MR5Xrz7Ut","U3yw5J2mQi",
+"Q6hMCYh1hF","FcWrWpAhR1","ru4UG2ZHdk","P6bcgjzUqR","cmXIXatef2","VLTy6zmLYD","KZamHtuDyS","jiVBPkB5nP","NcICAKASQ8","OUqFMGXdoH",
+"0PktI3otm6","QClRLdQ586","zQt6QVerEA","MK07YtvdkD","RBhp0NhXdu","dhSuHFnPFB","IKxdLo8Uyd","24ARFeuZA5","9XyT9t98iW","brhlQVprf2",
+"I7p2aaDGtS","RACujKASQ8","taOXK5ZaEz","Chuy3nlaBy","ZUnqtyvOMI","lXFOBW7cTs","8xEKzbZLvS","LbRTHCNHmv","kZANmZ4I1v","DcpWBzY1GY",
+"M6qcGUmaEv","F6PT2VLTy6","TXQ0ZIRh48","guMb87X3uy","i7WMQuJScX","mz8gxe6e4z","fFDrJjSjS3","AIYUuJXljW","lsQGolkMUA","MmKGJ5iGN5",
+"HRxd8ciuWz","zQt6Q55rfB","EdBKcpT8wu","K20wKcQOnv","ReKEWJKWYR","AmdQdOHaBz","Q6LixFhtgl","mX2GE7Ow5C","VerEAMkgy8","yluBxzbIYY",
+"x3LDeNAFuw","MojnP3weIF","M6qcGuQIcz","yofH3atef2","AOgEeNxx9V","1v5hHzY1GY","48cHLSs0Zu","3weIFFLsph","L7cGc3weIF","o8UydzqH0W",
+"OHaBzuQIcz","24ARFlm0pD","nnP8ohYBCK","ogLgc5drc6","0ao3lIKxdL","FcWrWVerEA","ZuDtDlpF6W","tlILtChuy3","suY4xuupzk","ulk41IjTwP",
+"uupzkjtn0X","k85AejzUqR","No0Qblm0pD","hSSvQx3LDe","lpF6WI7p2a","nlaByThjNn","dQ5869eoRc","wDajXk85Ae","zQt6Q5IhmG","ZuDtDm4bxU",
+"580YDQworu","uN6r3UlU3M","8RCUAOz8yZ","tjQxslpF6W","ZuDtDqUJMd","AgJHQNOHsz","aez9yuN6r3","48cHLrKDLJ","d85a9DG4sT","14FLRlm0pD",
+"o8Uyd5Drn0","AOgEehe9IA","2TRI7pT8wu","dmoS7C2Irc","fFDrJtaOXK","BGaQYlViBv","TwanoQnJ1S","ZhwG1kB5nP","lm0pDQworu","ni2v1QssNC",
+"zHF1qJRJQB","hi5X7tjQxs","29QAzMGlTF","SbRYyfcJOy","RzaZAlj07Q","2ZHdko8Uyd","580YDogLgc","OUqFM5Drn0","J2mQib29RJ","NOHszRkQke",
+"fLNg8uLtKs","pAhR1W3VFH","Q6LixhUTw7","RBhp0BGaQY","Waim6pmeCd","vLsmS8cVD3","a00b5NOHsz","uupzkJ2mQi","9rlg92ZHdk","xXTI4KASQ8",
+"bZLvS5VZjS","64s8N48cHL","2NslmWmadA","AIYUuQYxC0","IBe8kqQxHP","W7cTs1LB1L","zFgtBa00b5","LewvM16lHc","nlaByOUqFM","BGaQYgdQsS",
+"WmadAJKWYR","FnPFBEOE1o","AXpwErhl0J","BFkb8ECMvU","iB08lv8yFN","6AFT0RsQUq","cL0aE16lHc","FxX9q8hJdt","DG4sT2Nslm","hSSvQJJs5m",
+"FxX9q2Nslm","HlUbFMkgy8","dpe1vxciqp","2ZHdkAOgEe","lViBvPOUYS","5nmWvdmoS7","jSjS3J2mQi","4dEz6RzaZA","YjB9tFxX9q","9GXkXZUnqt",
+"HlUbFZhwG1","k85AeYOfrY","SmGzvuPX7G","S2DfuFxX9q","FnPFB4W0Tl","6q6L9WMiS3","7fKYUMK07Y","ydG8U2hEEU","zz4ZUIn3NS","KsjRKzz4ZU",
+"FNYIMlViBv","JRJQBaL6AJ","ZuDtDuoStw","gf8rIlsQGo","NcICAydG8U","AkKTk1v5hH","KsjRKzQt6Q","GXdoHjS1aj","6q6L9rKDLJ","oQ87rZJTXH",
+"1j5L8HRxd8","2ZHdkWDVWJ","ThjNnQbxXc","YjB9tFhtgl","AkKTkyEfy9","MojnPi3pyd","uvf7AFwEJz","NOHszFwEJz","16lHczHF1q","CxVEfSWfou",
+"m4bxUCNHmv","2DREsa00b5","uPX7G45cIH","M6qcGn8pJ9","uvf7AtjQxs","TwanoFhtgl","FjHXRYOfrY","s7MxkyToGW","NhXduPYBf4","Mkgy8ThjNn",
+"64s8NZJTXH","AIYUuFwEJz","618Di7fsYM","jzUqRCqqaD","EdBKct59lR","v2eC3bgJAz","kZANmokgRi","l83UdgIYvE","WPmlxuvf7A","9y4lwzQt6Q",
+"WDVWJn1pmO","lViBvxReec","FxX9qzmLYD","yluBx16lHc","taOXKtaOXK","IBe8kTXQ0Z","fFDrJ8xEKz","FFDui0YAGH","yToGWhi5X7","O3iyQUmaEv",
+"ThjNnatef2","9y4lwlkMUA","4W0TlfcJOy","m4bxU0BmCy","No0Qb48cHL","kZANmFcWrW","GrDg7580YD","t98iWRzaZA","BbwgAS77LH","DQimpni2v1",
+"BbwgA7X3uy","Cp3mZkB5nP","7Ow5CW3VFH","FPfSERACuj","64s8NRACuj","okgRinlaBy","FFDuijS1aj","MojnPb29RJ","U3yw5XyPZN","ThjNnU3yw5",
+"GXdoHX6Pin","Nxx9VpAhR1","7ku1pM3zXL","07n1cMmKGJ","x3LDekB5nP","lweGy5drc6","aez9y5drc6","CNHmvl83Ud","DQimpMGlTF","24ARFP6bcg",
+"QClRLyluBx","HRxd8a00b5","qQxHPZuDtD","TXQ0ZZJTXH","lm0pDFGzgp","JJs5muN6r3","OUYuFqaofN","Q6hMCfcJOy","suY4xjSjS3","Y1mC0Gv3Fq",
+"S2Dfu24ARF","djsrvK20wK","zFgtB14FLR","rhl0Jl83Ud","I7p2aeuZA5","L7cGcqQxHP","8FmFHuZPqg","IKxdLaL6AJ","xciqpXflUq","HzZT8fLNg8",
+"MK07YM3zXL","fcJOyuAWyp","EdBKclpF6W","xReeczz4ZU","GrDg7XflUq","J2mQi2ZHdk","3otm64QMc9","Cp3mZuLtKs","EOE1oAIYUu","xXTI4aez9y",
+"xciqpjiVBP","W3VFHOz8yZ","jtn0XzHF1q","QClRLAXpwE","Q6LixKsjRK","zmLYDSWfou","nlaByK4GS8","3otm6gdQsS","ulk41Vprf2","8cVD3NhXdu",
+"2DREsFFDui","okgRi14FLR","8RCUAmz8gx","FnPFBhi5X7","oQ87rB3qem","dhSuHb29RJ","m4bxURkQke","aL6AJxciqp","1LB1LCdyBV","iKqhrJRJQB",
+"s93MlaFFss","pWiOs7lUXZ","kB5nPS77LH","6AFT08U2nU","aez9y1v5hH","taOXKhUTw7","o8UydGrDg7","vLsmSKsjRK","CIShGpAhR1","wDajXy94nw",
+"BFkb8t98iW","jS1ajFLsph","QWxoTqQxHP","FLsphlH1kt","2Yz7ElCMxy","gjUTuMGlTF","WaWsveuZA5","AIYUurhl0J","t59lRTCgPp","s4786gjUTu",
+"ciuWz5VZjS","azIWpUl4a1","Uvlv4KASQ8","K4GS8VLTy6","tuDyS9eoRc","zQt6QlweGy","suY4xUvlv4","lCMxytAOsr","oVQp6h1zcH","BbwgABpYhV",
+"lpF6WJ2mQi","KASQ83weIF","uupzks93Ml","x3LDexciqp","lViBvv2eC3","5drc6BGaQY","gIYvEhYBCK","pmeCdo8Uyd","MGlTFL7cGc","lkMUAjfREu",
+"0Wr5y5Mg9r","DcpWBrz7Ut","EdBKcCqqaD","C2Ircjtn0X","FPfSEuTacx","9eoRcuupzk","K4GS8CdyBV","VLTy68U2nU","2DREs2DREs","nFqiktAOsr",
+"0ao3lhYBCK","PYBf4m4bxU","POUYStvdkD","xReec0YAGH","PYBf4djsrv","gf8rI8cVD3","ni2v19rlg9","pmeCddhSuH","MK07Y8U2nU","wiHrZb29RJ",
+"0Kyfsmz8gx","ksJbySs0Zu","WMiS3VNCPd","CNHmvUmaEv","MmsIo4dEz6","FcWrWv2eC3","oQ87r4QMc9","wDajXatef2","jSjS3MmKGJ","aez9ytlILt",
+"hi5X7Vprf2","fFDrJBCxeC","Pb1pa55rfB","7fsYMChuy3","FxX9qK4GS8","uQIczHP433","okgRiMmKGJ","16lHcO3iyQ","EdBKcDLhzM","HP433wDajX",
+"5iGN57Ow5C","gtCA5AOgEe","EOE1oTXQ0Z","pWiOsoQ87r","BGaQYFcWrW","FwEJzXflUq","i3pydTa8f6","m4bxUUmaEv","7lUXZtvdkD","BpYhVFVMxo",
+"ZJTXHJIqXi","vOqCEFGzgp","QYxC0S77LH","piJSkJRJQB","FcWrWlViBv","JRJQBpWiOs","W7cTsfaHir","Q6Lix1LB1L","16lHcfLNg8","DQimp1LB1L",
+"prNT629QAz","uoStw5ZaEz","TXQ0ZIn3NS","nFqikzqH0W","Z4I1vuJScX","ZUnqttvdkD","HP433CNHmv","t98iWsuY4x","uupzk2hEEU","piJSkDz1R3",
+"JRJQBQ6hMC","45cIHYh1hF","FVMxoM3zXL","5Mg9rtuDyS","vkCHHjSjS3","VLTy6brhlQ","1v5hHsuY4x","SmGzvGWqqX","FFDuiHzZT8","Yw2oUs4786",
+"l83UduLtKs","GXdoHZzJHW","Cfgr3S2Dfu","In3NSokgRi","7fsYMGrDg7","pv0i7Ta8f6","AkKTkFVMxo","Cfgr3SjskQ","FVMxoNxx9V","guMb8iKqhr",
+"3otm6vLsmS","KASQ8K4GS8","8RCUAD6rBy","7Ow5CWDVWJ","okgRi8RCUA","lkMUAGXdoH","9y4lw3otm6","AOgEeDcpWB","fLNg8618Di","UlU3MYh1hF",
+"l83UdStlDJ","GWqqXWPmlx","e6e4z45cIH","pWiOs580YD","5NammOxWIH","7Ow5CZzJHW","l83UdhYBCK","tjQxsZuDtD","ZJTXHgjUTu","8hJdtrKDLJ",
+"D6rByo8Uyd","WreyPRBhp0","ZzJHWrhl0J","oQ87r9iGoT","dmoS7lkMUA","D6rByRBhp0","ZJTXHb29RJ","4dEz6a00b5","Gv3Fq64s8N","Q6hMCLbRTH",
+"5ZaEzXflUq","1LB1LVIlwP","J2mQiYjB9t","55rfBFjHXR","FjHXRni2v1","ThjNntuDyS","5Mg9rEdBKc","zz4ZUoGu6x","FGzgpCdyBV","0BmCyRACuj",
+"CqqaDaL6AJ","Yw2oUYOfrY","7ku1pdhSuH","zqH0WP6bcg","aez9yMojnP","9rlg9D6rBy","faHirwDajX","Q6Lix9GXkX","2Nslmlj07Q","MGlTFOz8yZ",
+"9rlg9KZamH","B3qemBpYhV","euZA5Pb1pa","14FLRAOgEe","ThjNnFhtgl","QWxoTP6bcg","0KyfslkMUA","FnPFBlkMUA","J2mQiwDajX","2Yz7EZUnqt",
+"FPfSESbRYy","yofH3qQxHP","MmKGJm4bxU","55rfBfqypy","zbIYYn8pJ9","cShY2fcwDa","dmoS7Rxrsm","Chuy3QnJ1S","JIqXiRBhp0","NcICAjzUqR",
+"zz4ZU6q6L9","IBe8kThjNn","FPfSESs0Zu","7X3uyyvOMI","IKxdLcL0aE","okgRiVerEA","VIlwPC2Irc","tuDySjtn0X","zmLYDDcpWB","lCMxydhSuH",
+"lweGylViBv","kZANmpWiOs","VNCPdgdQsS","v8yFN7lUXZ","fLNg8FPfSE","k85Aev2eC3","nnP8ouN6r3","16lHc2DREs","uPX7GzQt6Q","ZJTXHBbwgA",
+"Oz8yZpiJSk","h1zcHGrDg7","ZuDtDk85Ae","yofH3gjUTu","uZPqgWaWsv","blLA9MmsIo","ZhwG1DcpWB","618DiiB08l","5iGN5y94nw","5ZaEzydG8U",
+"ciuWzLDk6f","iB08lfcwDa","S2DfuHzZT8","ZhwG1fFDrJ","Cfgr3JRJQB","zFgtBWaWsv","Cfgr3JkzUn","U3yw5dQ586","ru4UGxciqp","JIqXiaDGtS",
+"HlUbFogLgc","pFrrln1pmO","ZJTXHcShY2","tvdkDCp3mZ","yvOMIYw2oU","2ZHdkMezSW","hUTw7zQt6Q","bgJAznFqik","5drc61v5hH","8FmFHiKqhr",
+"StlDJ5ZaEz","ReKEW1v5hH","rKDLJHRxd8","0ao3ltlILt","n1pmOZzJHW","F6PT2VNCPd","qaofNzz4ZU","1LB1LfLNg8","fcwDayofH3","DQimp618Di",
+"8hJdt5IhmG","uAWyptuDyS","5IhmGVerEA","pWiOsjfREu","Pb1pauAWyp","RmDcrTXQ0Z","5ZaEztuDyS","n1pmOfaHir","5nmWv14FLR","oVQp6RpBQm",
+"FVMxo1j5L8","uN6r3zz4ZU","Fhtgl29QAz","K20wK29QAz","0h1b18FmFH","7fKYUNo0Qb","AXpwEWaim6","pT8wuYw2oU","OUYuFi3pyd","s47865Mg9r",
+"qQxHPa00b5","yvOMIbrhlQ","9eoRc55rfB","VjCZqtjQxs","GXdoHtlILt","U3yw5ECMvU","RBhp0azIWp","yofH3i7WMQ","FnPFBZv7z0","k85AeYjB9t",
+"GXdoHFGzgp","J2mQiGSQwj","OUYuFhYBCK","AgJHQUlU3M","ECMvUHzZT8","oVQp6b29RJ","JXljWcL0aE","djsrvAkKTk","5VZjS7lUXZ","gtCA51LB1L",
+"RzaZAtjQxs","t98iW3otm6","hUTw7Vprf2","RxrsmW7cTs","Yh1hFwDajX","NOHszP6bcg","LDk6f45cIH","ZJTXHv8yFN","Nxx9V7X3uy","TwanoRBhp0",
+"ru4UGLbRTH","uPX7GHP433","oVQp6Rxrsm","xciqp0ao3l","pvgjSn8pJ9","GWqqXPYBf4","9rlg9ZJTXH","SmGzvzHF1q","KASQ8iwzGk","0Kyfs9GXkX",
+"5VZjSRACuj","JJs5mlweGy","x3LDe9eoRc","WmadAGrDg7","HP433a00b5","MGlTFX6Pin","zFgtBpmeCd","y94nw0Wr5y","jtn0XtaOXK","uN6r3uupzk",
+"rhl0JZhwG1","XyPZNMojnP","RpBQmCxVEf","uLtKs4dEz6","okgRiUvlv4","JRJQBFwEJz","jiVBPMGlTF","AmdQdOUqFM","2TRI78cVD3","e6e4zCIShG",
+"lXFOBa00b5","Yf2EcCxVEf","ksJbyMmsIo","HzZT83weIF","29QAzhi5X7","HfyNQuvf7A","mz8gxaFFss","xciqpCp3mZ","XflUq2Nslm","bZLvStaOXK",
+"he9IAFxX9q","o8UydLbRTH","9y4lwOHaBz","euZA5blLA9","0MR5XiKqhr","5Drn0jS1aj","4QMc9AkKTk","EdBKcuQIcz","blLA98cVD3","OxWIHNAFuw",
+"t59lRv2eC3","Rxrsmd85a9","OHaBz4QMc9","tAOsraFFss","sqVrfuTacx","07n1cbZLvS","mX2GE9eoRc","0YAGHqaofN","7Ow5CI7p2a","JXljWv8yFN",
+"jfREud7vjM","n8pJ9FVMxo","x3LDen8pJ9","LewvMFnPFB","ZhwG1JIqXi","Waim6gtCA5","BFkb8FGzgp","O3iyQDQimp","SmGzvQWxoT","0MR5XFLsph",
+"Fhtgl0Wr5y","1LB1LRBhp0","hE1Qluupzk","FxX9q5Mg9r","dmoS7mX2GE","zqH0WjeskS","Mm8siJJs5m","nFqikuupzk","POUYSuoStw","wDajXh1zcH",
+"KASQ8tvdkD","8cVD3wiHrZ","pv0i72Nslm","2TRI7FGzgp","JkzUntjQxs","aFFssgtCA5","ulk41aez9y","uJScXrhl0J","5ZaEzHRxd8","wDajXxReec",
+"VBjhzCIShG","RBhp0ulk41","BCxeCpFrrl","prNT6Nxx9V","0Wr5ylXFOB","ni2v1jfREu","kB5nPnnP8o","aL6AJX6Pin","lsQGo9iGoT","0KyfsZhwG1",
+"lH1ktThjNn","POUYS2hEEU","n8pJ98TxD7","7ku1poQ87r","KZamHG1RhS","XflUqpvgjS","Q6hMCVprf2","VIlwPk85Ae","8cVD3CqqaD","NAFuwCp3mZ",
+"3weIFJJs5m","4QMc9580YD","AkKTkJRJQB","pmeCdRsQUq","azIWphYBCK","I7p2aXyPZN","L7cGcCp3mZ","5Drn0soy9t","IKxdL0PktI","NAFuw5Drn0",
+"JKWYRP6bcg","5iGN5SWfou","iB08lgdQsS","8RCUANo0Qb","k85AeM3zXL","gIYvEAkKTk","FwEJzaFFss","JXljW45cIH","VBjhzTXQ0Z","MmsIoMaJQs",
+"Ul4a1ciuWz","VerEA4dEz6","B3qembZLvS","StlDJdpe1v","jS1ajChuy3","jSjS35VZjS","gtCA5okgRi","uN6r316lHc","RBhp09y4lw","pFrrlLDk6f",
+"aez9yMezSW","EoToPlkMUA","4dEz6K4GS8","aez9y0ao3l","RpBQmQbxXc","fcwDarKDLJ","SWfoucShY2","prNT6wDajX","VLTy6Vprf2","rz7Ute6e4z",
+"mX2GEMojnP","NAFuwFhtgl","BGaQY7lUXZ","8TxD7rKDLJ","RACuj3weIF","07n1cPOUYS","0MR5XJXljW","5Mg9r0h1b1","7Ow5CZv7z0","Ul4a1faHir",
+"NcICALewvM","9y4lw2TRI7","OUYuFuupzk","uPX7GcmXIX","xReecQYxC0","AgJHQVprf2","45cIHfFDrJ","xReecqUJMd","taOXKuPX7G","CqqaD5ZaEz",
+"FGzgppv0i7","G1RhScL0aE","lm0pDfLNg8","F6PT2QYxC0","0ao3lJXljW","8xEKzGXdoH","t98iWd85a9","vOqCE7fsYM","n8pJ9Yh1hF","TXQ0Z5drc6",
+"uvf7Aix74r","G1RhSo8Uyd","HP433lXFOB","ZuDtDguMb8","uPX7GMmKGJ","cL0aE5ZaEz","0BmCycShY2","HlUbFtl72W","8hJdtgf8rI","uAWypdQ586",
+"K20wKzY1GY","d7vjMpv0i7","uJScX07n1c","gf8rI2DREs","QChxs9y4lw","CdyBVfcJOy","VNCPdsqVrf","lm0pDblLA9","D6rByDQimp","KsjRKWDVWJ",
+"QYxC0yluBx","7fsYMD6rBy","5nmWvjSjS3","gdQsSMezSW","piJSkFNYIM","lXFOBvOqCE","JkzUn8cVD3","rz7Utv1Hln","djsrvOUqFM","M3zXLuN6r3",
+"RkQkeWDVWJ","7Ow5CHzZT8","WaWsvrz7Ut","CqqaDUmaEv","B3qemHzZT8","64s8N4QMc9","uvf7A9y4lw","6q6L9lm0pD","FVMxoTXQ0Z","wDajXSmGzv",
+"hYBCKNOHsz","d85a9hE1Ql","zHF1qNo0Qb","FPfSEGSQwj","LewvMx3LDe","KsjRK618Di","nFqikbZLvS","s93MlZ4I1v","9GXkXt59lR","jtn0XhSSvQ",
+"7X3uyaL6AJ","cQOnvFVMxo","0h1b1uTacx","oGu6xs93Ml","oVQp6CK5W7","he9IAlj07Q","JJs5mIn3NS","lm0pDbgJAz","okgRiDcpWB","07n1cZzJHW",
+"8RCUAGWqqX","hUTw7cShY2","WreyPvkCHH","piJSkUmaEv","b29RJkZANm","IKxdLokgRi","Cp3mZYw2oU","0h1b116lHc","7Ow5C24ARF","gjUTuQworu",
+"PYBf4TXQ0Z","tuDySFLsph","faHirmX2GE","lj07Qt98iW","ciuWz7fKYU","0PktI6q6L9","VerEANo0Qb","Uvlv40h1b1","pWiOsa00b5","piJSk5VZjS",
+"OHaBzjtn0X","zHF1qzmLYD","Q6LixNhXdu","okgRiuPX7G","iqv4kIjTwP","45cIHn1pmO","U3yw5JkzUn","FnPFBFnPFB","dmoS7i3pyd","I7p2auPX7G",
+"nlaByAIYUu","YOfrYYjB9t","1LB1LThjNn","oGu6x9y4lw","NOHszUl4a1","pT8wufcwDa","lkMUANhXdu","Q6LixGrDg7","wDajX9rlg9","IKxdLIn3NS",
+"GWqqXIRh48","FjHXR8cVD3","7lUXZuQIcz","Y1mC0O3iyQ","EOE1ociuWz","n8pJ9DLhzM","AmdQdRACuj","jfREud85a9","CqqaDcL0aE","5nmWvfcJOy",
+"BFkb8rhl0J","O3iyQFxX9q","iB08lK20wK","Cp3mZlpF6W","JIqXi2ZHdk","5nmWv5drc6","6AFT0wiHrZ","i7WMQTCgPp","i7WMQjSjS3","Gv3FqHfyNQ",
+"lm0pDL7cGc","HzZT8GrDg7","ru4UGiKqhr","aez9yfFDrJ","S2Dfuhe9IA","FxX9qpiJSk","8RCUAKr8ys","9iGoTGXdoH","MezSWnlaBy","ThjNnNAFuw",
+"JJs5mh1zcH","pv0i7BbwgA","QworukZANm","8xEKz2Yz7E","Qworu7fKYU","S2DfugIYvE","MaJQst98iW","PYBf4x3LDe","lViBvMGlTF","EdBKcQworu",
+"suY4xKASQ8","jSjS30ao3l","FjHXRMaJQs","tAOsruPX7G","Yw2oUs7Mxk","pT8wuReKEW","Chuy3SbRYy","0Wr5yZJTXH","jfREunnP8o","hE1Qle6e4z",
+"Ta8f6uPX7G","pvgjSX6Pin","AIYUugIYvE","NhXduMK07Y","zY1GYoQ87r","FcWrWS77LH","hSSvQBFkb8","QssNC2hEEU","DcpWB9y4lw","v1Hln48cHL",
+"FGzgpZ4I1v","AkKTkVprf2","FxX9qOUYuF","FwEJzSbRYy","ydG8Uhi5X7","L7cGcWmadA","guMb8RmDcr","MojnPXyPZN","uPX7GSs0Zu","aez9yHfyNQ",
+"RsQUqqUJMd","U3yw5atef2","7X3uy2Nslm","MaJQs5VZjS","ECMvUh1zcH","8RCUAQ6Lix","MmKGJgdQsS","wDajXQnJ1S","sqVrfS2Dfu","gtCA5pWiOs",
+"pT8wuW3VFH","Mm8siVerEA","hSSvQt98iW","Nxx9Vs93Ml","BFkb8Yf2Ec","FcWrWM3zXL","MezSWatef2","fFDrJAgJHQ","hUTw7pmeCd","m4bxUd7vjM",
+"blLA9BCxeC","oQ87r5iGN5","0Wr5ydQ586","No0QbNAFuw","LewvMPb1pa","TwanoCxVEf","J2mQiM3zXL","Cp3mZY1mC0","3otm6AOgEe","Yw2oUBbwgA",
+"oQ87r64s8N","HP433n8pJ9","O3iyQWDVWJ","VIlwPOHaBz","VerEAbgJAz","cQOnv14FLR","W3VFHXflUq","ReKEWpWiOs","VerEAuvf7A","POUYSv8yFN",
+"5iGN5RBhp0","uvf7Ajtn0X","Y1mC0djsrv","pT8wuWreyP","uQIczGv3Fq","SWfoux3LDe","WmadAmX2GE","Cp3mZEdBKc","hSSvQY1mC0","QClRL6AFT0",
+"AIYUu2TRI7","zFgtBPb1pa","StlDJi3pyd","4QMc9SbRYy","LbRTHSWfou","zmLYDiwzGk","AkKTkCIShG","In3NSe6e4z","taOXKPOUYS","pAhR10Wr5y",
+"yToGWPOUYS","gdQsS5IhmG","EdBKcFNYIM","ru4UGWaWsv","he9IAKr8ys","AOgEePOUYS","Kr8ysPYBf4","JXljWksJby","VNCPdFPfSE","tlILtb29RJ",
+"gIYvEvOqCE","QYxC03otm6","pFrrlMkgy8","EoToPWreyP","CqqaDhE1Ql","QChxsguMb8","JJs5mQ6hMC","MaJQsLbRTH","d7vjMCxVEf","0MR5Xi7WMQ",
+"kZANmgIYvE","ni2v1OHaBz","nFqik7ku1p","BFkb82ZHdk","lpF6W5IhmG","nlaBysx5Gl","uN6r39GXkX","XyPZN7Ow5C","45cIHVprf2","fLNg8AOgEe",
+"suY4xdjsrv","lCMxyciuWz","POUYSWDVWJ","v2eC3uN6r3","0KyfsGrDg7","he9IAMK07Y","lH1ktjtn0X","brhlQZhwG1","EOE1oUvlv4","lViBvZUnqt",
+"aDGtSrhl0J","uTacx8cVD3","7ku1pMmsIo","Gv3Fq07n1c","dQ586Dz1R3","48cHLAXpwE","l83UdRsQUq","iwzGkQChxs","CNHmv5Mg9r","D6rBy9y4lw",
+"Q6hMCWMiS3","yluBxMGlTF","X6PinZv7z0","tvdkD2hEEU","rz7UtFwEJz","fmIK1FLsph","SWfoucmXIX","nFqikCK5W7","8hJdtDG4sT","BGaQYlXFOB",
+"Zv7z0wiHrZ","OHaBz7lUXZ","lpF6Wuvf7A","9iGoTQbxXc","W3VFHuoStw","lXFOB5nmWv","QYxC0VNCPd","OHaBzMaJQs","i7WMQjS1aj","iwzGk1LB1L",
+"ix74rtl72W","4W0Tlhe9IA","t98iWyEfy9","rz7UtHzZT8","Z4I1vi7WMQ","3weIFiwzGk","1j5L8rhl0J","XflUqC2Irc","kZANmn8pJ9","U3yw50Kyfs",
+"nnP8oQClRL","AOgEelViBv","8FmFHzFgtB","t98iWIKxdL","nlaByd7vjM","0Wr5yP6bcg","QWxoTpAhR1","YjB9tFFDui","RmDcr9y4lw","Q6LixF6PT2",
+"5VZjSxciqp","QChxsvOqCE","PYBf4hi5X7","CK5W7NAFuw","CNHmvi3pyd","24ARFuQIcz","DLhzMfcJOy","PYBf4atef2","b29RJhe9IA","a00b5zqH0W",
+"QbxXc8RCUA","1j5L8vOqCE","BFkb8GWqqX","ZuDtDWreyP","NcICAEdBKc","J2mQiX6Pin","VjCZqhi5X7","8xEKzQworu","FGzgpwDajX","nnP8oi3pyd",
+"F6PT2lkMUA","Y1mC0FcWrW","MmsIoXflUq","8RCUAokgRi","l83UdZ4I1v","S2DfuQWxoT","lViBvOxWIH","HRxd8BbwgA","CIShGNcICA","Yh1hFzmLYD",
+"2TRI7KASQ8","LewvMdhSuH","sx5Gl7Ow5C","Mkgy89y4lw","yluBxUvlv4","fcJOyuTacx","AmdQdyEfy9","14FLRhi5X7","C2IrcM6qcG","P6bcgfcwDa",
+"lm0pDQssNC","IBe8kDcpWB","ECMvUMaJQs","RACujRpBQm","2TRI7Yh1hF","Y1mC0YjB9t","MmKGJuAWyp","1v5hHtaOXK","JkzUnTCgPp","Gv3Fq0Kyfs",
+"atef2cmXIX","5Mg9rLbRTH","pmeCduvf7A","v2eC3zqH0W","7ku1ptjQxs","blLA9jzUqR","O3iyQtaOXK","zbIYY1v5hH","FxX9qGv3Fq","t98iWuupzk",
+"C2IrcFVMxo","JRJQB0Kyfs","cmXIXTXQ0Z","uN6r3dmoS7","RBhp0FNYIM","BFkb8WPmlx","zQt6QkZANm","zbIYYJJs5m","ZuDtD0MR5X","Gv3FqL7cGc",
+"SjskQfcJOy","NOHszzqH0W","8xEKzIKxdL","KASQ8Mm8si","HP433QClRL","2Yz7EYh1hF","wiHrZMK07Y","i3pydTwano","S77LHRBhp0","POUYSix74r",
+"uPX7G6q6L9","S2DfuHlUbF","zFgtBvkCHH","yofH355rfB","zY1GYd85a9","ciuWzVjCZq","zFgtBJRJQB","MmsIoFLsph","uupzk2Yz7E","FhtglHzZT8",
+"NOHszW7cTs","lXFOBPb1pa","uN6r3J2mQi","5iGN5AmdQd","fcJOyPOUYS","dmoS7atef2","FLsphJJs5m","RzaZAm4bxU","faHirlH1kt","OUqFMJJs5m",
+"xReecCp3mZ","Ss0ZuY1mC0","cQOnvOUYuF","7X3uy55rfB","taOXK5nmWv","0YAGHv2eC3","AIYUuM3zXL","Gv3FquLtKs","wDajXru4UG","RmDcr9XyT9",
+"ydG8U3weIF","jfREutjQxs","X6PinCfgr3","K20wKWreyP","CqqaDSmGzv","lCMxyL7cGc","EoToPm4bxU","Ss0ZuMojnP","oGu6x14FLR","C2IrcXyPZN",
+"tlILthYBCK","azIWp5nmWv","9y4lwoVQp6","AmdQdRmDcr","cQOnvuZPqg","QbxXc8FmFH","m4bxUOUqFM","F6PT2IBe8k","OHaBzyToGW","aFFssVLTy6",
+"Q6hMCZhwG1","m4bxUVBjhz","AXpwEOUYuF","8TxD7cmXIX","zFgtBeuZA5","WDVWJJ2mQi","4dEz6Pb1pa","HfyNQxciqp","v8yFNJkzUn","ru4UGDcpWB",
+"taOXKksJby","vkCHHuAWyp","ZzJHW618Di","UmaEv8U2nU","i3pydPOUYS","oQ87r5Mg9r","WmadAVjCZq","zqH0Wh1zcH","rKDLJAIYUu","9GXkXs7Mxk",
+"pT8wuJJs5m","WMiS3RmDcr","PYBf4uLtKs","CK5W7Oz8yZ","45cIHhYBCK","9iGoTi3pyd","FVMxoIKxdL","ThjNnv1Hln","aFFssDz1R3","JXljWAOgEe",
+"prNT6aez9y","Chuy3HRxd8","F6PT2xXTI4","AIYUuZJTXH","pv0i7HP433","yluBxuvf7A","Nxx9VcQOnv","O3iyQFNYIM","lsQGoCK5W7","AIYUuix74r",
+"yofH34QMc9","NhXduHRxd8","K20wKxXTI4","5VZjSY1mC0","MK07YTCgPp","8RCUAQbxXc","uoStwSs0Zu","Yf2EcQbxXc","GWqqXIjTwP","0MR5XJkzUn",
+"qaofN64s8N","tlILtyvOMI","a00b5lweGy","XflUqAkKTk","gdQsSHlUbF","azIWpD6rBy","NcICAC2Irc","Yw2oU14FLR","IRh48Rxrsm","HRxd8BFkb8",
+"uvf7AW3VFH","RzaZAqQxHP","ni2v1uQIcz","0BmCyHfyNQ","AOgEe7fsYM","2NslmcQOnv","IBe8kYw2oU","x3LDehe9IA","RpBQmv1Hln","tjQxsVjCZq",
+"vkCHH8RCUA","djsrvl83Ud","Ta8f6ZhwG1","s4786uQIcz","5Mg9rlsQGo","HzZT8piJSk","gIYvEn1pmO","5Mg9ruTacx","Pb1paTwano","iKqhrWaWsv",
+"lCMxyCqqaD","QbxXctl72W","LewvM2hEEU","2ZHdk4QMc9","azIWpVprf2","b29RJW7cTs","MojnP4QMc9","QWxoTMGlTF","v2eC39eoRc","0h1b1e6e4z",
+"uvf7A0ao3l","0h1b1Q6hMC","F6PT2Qworu","1j5L8KsjRK","Yw2oURmDcr","0PktIdQ586","soy9t2Nslm","v1HlnQChxs","yluBxECMvU","EoToPpFrrl",
+"64s8NReKEW","8TxD75iGN5","hSSvQVjCZq","W3VFHGWqqX","QYxC0taOXK","618DiLDk6f","DQimpMaJQs","5drc6AIYUu","JRJQBx3LDe","ksJbyJKWYR",
+"tAOsrW7cTs","5nmWv4dEz6","5drc65drc6","Yf2EcpiJSk","vOqCEBGaQY","uTacxuQIcz","NcICApv0i7","fcJOyogLgc","B3qem14FLR","U3yw5rz7Ut",
+"cmXIX8FmFH","yEfy9Gv3Fq","uLtKsgdQsS","5ZaEzIRh48","yluBxfaHir","faHiriKqhr","o8Uyd2ZHdk","Ul4a1prNT6","FLsph8TxD7","okgRipiJSk",
+"7Ow5Csx5Gl","5Mg9rd7vjM","5Mg9rpT8wu","XyPZNGrDg7","BpYhVVerEA","UmaEvlpF6W","jeskStvdkD","PYBf4cQOnv","hi5X7WmadA","FxX9q7hyVv",
+"QWxoT2hEEU","DQimpX6Pin","4dEz6QYxC0","kZANmUvlv4","iqv4k5Drn0","xXTI4AOgEe","qUJMdzbIYY","TXQ0ZyEfy9","MmsIolsQGo","lj07Q5drc6",
+"SjskQReKEW","gf8rIMezSW","CdyBVQChxs","wiHrZuAWyp","cL0aECxVEf","lweGyfmIK1","7X3uy16lHc","HP433l83Ud","Nxx9VZuDtD","5ZaEzVprf2",
+"dQ586d7vjM","RzaZA5Mg9r","lH1ktjiVBP","i7WMQOUqFM","WMiS3fcwDa","GXdoH5Mg9r","NOHszTwano","9y4lwiqv4k","FNYIM9GXkX","ThjNn8xEKz",
+"JRJQBsx5Gl","RBhp0lViBv","3otm6HfyNQ","2DREsQ6Lix","Yw2oU7lUXZ","d85a9ZUnqt","Mkgy8ZJTXH","Ss0ZuOz8yZ","8xEKzzHF1q","45cIH7Ow5C",
+"hSSvQStlDJ","he9IAWPmlx","Ss0Zum4bxU","e6e4z6AFT0","3weIFHfyNQ","atef2MojnP","W3VFHv2eC3","WmadA2ZHdk","wiHrZtvdkD","0Wr5yRBhp0",
+"zHF1qGSQwj","KsjRKWMiS3","K20wKpv0i7","taOXKi3pyd","W7cTse6e4z","Vprf2NhXdu","iKqhr5VZjS","VjCZqTa8f6","Rxrsm1v5hH","6AFT06AFT0",
+"2NslmTwano","sx5GlKr8ys","5Drn0vOqCE","FFDuicmXIX","CK5W70ao3l","BGaQYtvdkD","Mkgy82DREs","ZzJHWh1zcH","FFDui7lUXZ","16lHcQ6hMC",
+"m4bxUt98iW","DcpWBVNCPd","4dEz65ZaEz","tvdkDCK5W7","qUJMdFnPFB","CqqaDX6Pin","HzZT8qUJMd","W7cTsAkKTk","X6PinaDGtS","FPfSECfgr3",
+"9rlg9JKWYR","BCxeCs93Ml","8U2nU5Namm","48cHLKsjRK","OHaBzo8Uyd","5Mg9rCNHmv","hE1QlCfgr3","6AFT0YOfrY","t98iWJJs5m","t98iWM3zXL",
+"MK07YS2Dfu","AkKTkiB08l","IKxdLECMvU","GXdoHjfREu","ZuDtDxReec","64s8NxXTI4","XyPZNSs0Zu","v8yFNO3iyQ","RxrsmFNYIM","xReec6AFT0",
+"Kr8ysfaHir","bgJAz48cHL","zmLYDFLsph","fLNg8fqypy","WDVWJuTacx","KASQ80h1b1","mX2GEfaHir","blLA9MojnP","G1RhSKZamH","5iGN5lpF6W",
+"iKqhr0ao3l","4dEz64W0Tl","CqqaDuvf7A","8FmFHogLgc","C2IrcDz1R3","JRJQB24ARF","JkzUnYf2Ec","NhXduC2Irc","VerEAtaOXK","rKDLJ9rlg9",
+"M6qcG8TxD7","14FLRtvdkD","brhlQ64s8N","5IhmGReKEW","lsQGosx5Gl","07n1cLewvM","5Mg9r0Kyfs","MaJQs29QAz","5NammEOE1o","0Wr5yThjNn",
+"5VZjS55rfB","zqH0WyEfy9","MmKGJdjsrv","8xEKzVNCPd","EOE1o5drc6","CIShG8U2nU","DG4sTP6bcg","P6bcg8cVD3","M6qcGi3pyd","9y4lwQ6hMC",
+"yToGWtjQxs","rz7UtG1RhS","tuDySCIShG","azIWpCxVEf","CNHmv8xEKz","rz7UtDcpWB","9iGoTEoToP","4QMc9atef2","K4GS8e6e4z","DcpWByluBx",
+"zQt6QVBjhz","5VZjSCNHmv","ulk41h1zcH","lj07QS77LH","2DREsRzaZA","0ao3lzQt6Q","oQ87rMGlTF","C2IrcOxWIH","i7WMQuvf7A","x3LDeQClRL",
+"Q6hMCDLhzM","Ul4a18hJdt","t98iWFVMxo","yofH3Nxx9V","BFkb8AOgEe","ZJTXHdpe1v","tl72WqaofN","gtCA5qaofN","MK07YSbRYy","iqv4k3otm6",
+"P6bcgwiHrZ","AIYUuwiHrZ","JkzUndQ586","e6e4z29QAz","ZUnqtYw2oU","6q6L90YAGH","atef2Y1mC0","he9IAjS1aj","HfyNQt59lR","5drc6s93Ml",
+"G1RhSHfyNQ","IKxdLBbwgA","DLhzM07n1c","pvgjSSmGzv","7hyVvaL6AJ","cL0aEfaHir","TwanohE1Ql","gdQsSYjB9t","v8yFNThjNn","HzZT8nnP8o",
+"L7cGc8RCUA","M6qcGfLNg8","rKDLJydG8U","POUYShSSvQ","0ao3lv8yFN","BFkb8soy9t","CIShGIKxdL","lpF6WNcICA","jiVBPtvdkD","WaWsvcmXIX",
+"FjHXRAIYUu","dQ586uPX7G","i7WMQi7WMQ","Kr8ys7fKYU","d85a9DQimp","RpBQmEdBKc","XflUqpAhR1","qUJMdUmaEv","J2mQiblLA9","v8yFNqQxHP",
+"zFgtBhSSvQ","gtCA5m4bxU","EoToPn1pmO","MaJQs7fsYM","okgRiChuy3","BFkb8xciqp","FnPFBU3yw5","9GXkXHP433","No0QbS2Dfu","CIShGuupzk",
+"Ul4a15ZaEz","X6PingdQsS","ksJbyM6qcG","QChxshSSvQ","nFqikyvOMI","Ss0ZuWDVWJ","Pb1palpF6W","xReecaez9y","vLsmSlpF6W","okgRivkCHH",
+"cL0aEhE1Ql","rz7UtNxx9V","TCgPp6AFT0","GSQwjlsQGo","LDk6f7ku1p","1j5L8BCxeC","1v5hH0ao3l","tuDySCxVEf","29QAzIKxdL","FNYIMRmDcr",
+"jSjS3UlU3M","1v5hHSs0Zu","StlDJjiVBP","5Mg9rv2eC3","zbIYYWPmlx","kB5nP0BmCy","Mm8siHRxd8","LDk6fVBjhz","3otm60h1b1","wDajX2hEEU",
+"FVMxo8hJdt","yvOMIQworu","xciqpDLhzM","rhl0Jlm0pD","W7cTsciuWz","AgJHQuAWyp","F6PT2Waim6","No0QbStlDJ","uPX7GvLsmS","ECMvU8U2nU",
+"a00b5cL0aE","VBjhzMK07Y","AgJHQzmLYD","v1HlnbZLvS","8FmFHIKxdL","IjTwPRkQke","HRxd8he9IA","IRh48zmLYD","I7p2aRBhp0","55rfBVNCPd",
+"GSQwjnlaBy","IRh48P6bcg","8cVD3ThjNn","xXTI4hUTw7","prNT6DQimp","O3iyQlXFOB","sqVrfAXpwE","IjTwPcmXIX","0BmCyfaHir","pWiOsiwzGk",
+"Kr8ysRxrsm","rhl0JUlU3M","cmXIX2hEEU","48cHLPYBf4","UmaEvAXpwE","7fsYMHzZT8","MK07YuAWyp","BbwgATCgPp","Q6LixM6qcG","48cHLn8pJ9",
+"AmdQdtvdkD","SWfoujzUqR","5Nammuupzk","jiVBPh1zcH","blLA90ao3l","lH1kt9y4lw","8xEKz3otm6","0Wr5yQChxs","9GXkXokgRi","iwzGkbrhlQ",
+"8hJdtI7p2a","uAWypTwano","X6Pin3otm6","7fKYUPOUYS","Cfgr34QMc9","mX2GE14FLR","QssNCPOUYS","fcJOyqaofN","fmIK1zY1GY","vOqCEUl4a1",
+"FVMxoHfyNQ","oVQp68FmFH","14FLROz8yZ","tAOsrv8yFN","pT8wuOUqFM","9y4lwVerEA","StlDJFcWrW","xXTI44QMc9","9eoRcCqqaD","t59lRNAFuw",
+"0BmCyPOUYS","ydG8UbrhlQ","pAhR1zmLYD","45cIHNo0Qb","HRxd8QssNC","uN6r3piJSk","OUYuFuQIcz","KsjRKhSSvQ","hE1Ql7X3uy","ReKEWnlaBy",
+"LewvMMojnP","48cHL5iGN5","EoToPMK07Y","Z4I1vni2v1","XflUqzz4ZU","9eoRcFwEJz","RsQUq0Kyfs","cL0aEOUqFM","lH1kti3pyd","o8UydDG4sT",
+"5Drn0gjUTu","AmdQd5drc6","5drc6iB08l","J2mQiJ2mQi","vkCHHP6bcg","I7p2aQssNC","jeskS0MR5X","LDk6fYh1hF","guMb8Oz8yZ","yEfy99y4lw",
+"nlaBylweGy","07n1cjtn0X","0h1b1Qworu","MezSW7fKYU","lkMUA2Yz7E","rz7UtJRJQB","cQOnvNhXdu","ksJbyd7vjM","QYxC0Rxrsm","DG4sTJRJQB",
+"hYBCKPb1pa","n1pmOCxVEf","yluBxmX2GE","o8Uydsoy9t","lViBvtuDyS","Q6LixhE1Ql","qUJMd7X3uy","pvgjSkB5nP","X6PinG1RhS","uQIczFVMxo",
+"pvgjSuTacx","WaWsvFVMxo","CIShGI7p2a","ni2v1k85Ae","D6rBy8RCUA","K4GS8F6PT2","rz7UtyvOMI","zY1GYblLA9","GrDg7gtCA5","AIYUu1j5L8",
+"Mkgy8KASQ8","zmLYDgdQsS","mX2GEWreyP","qaofNAkKTk","5iGN5blLA9","nlaByEdBKc","2Yz7EoGu6x","OxWIH9rlg9","dhSuHIjTwP","NcICA9y4lw",
+"ZUnqts93Ml","C2IrcyEfy9","8U2nUe6e4z","2DREsDcpWB","Uvlv4Nxx9V","9rlg9hE1Ql","5VZjSbgJAz","CIShGMGlTF","hE1QlKASQ8","SbRYy7Ow5C",
+"dpe1vfFDrJ","YjB9tFNYIM","Twano16lHc","14FLRSbRYy","rhl0JQssNC","oGu6x5Namm","wDajXWPmlx","pmeCdzqH0W","Zv7z0DLhzM","MmsIoNxx9V",
+"cL0aEyluBx","FcWrWuoStw","7hyVv55rfB","fFDrJOHaBz","gIYvEJJs5m","sx5GlLewvM","HzZT8FcWrW","FFDuis4786","cL0aESWfou","piJSkMK07Y",
+"gIYvEJkzUn","hE1QlOUYuF","7fsYMhE1Ql","BCxeCJRJQB","s7MxkKASQ8","ThjNnI7p2a","suY4xGXdoH","nnP8o580YD","VIlwPCIShG","dQ586qaofN",
+"yofH3UlU3M","JKWYRiwzGk","S2DfupvgjS","0Wr5yuTacx","oVQp6uPX7G","mz8gxjfREu","TwanoG1RhS","Ul4a1S2Dfu","qaofNGrDg7","TwanoI7p2a",
+"AXpwE24ARF","bgJAz0ao3l","zFgtBQWxoT","7fsYMEoToP","PYBf40BmCy","8xEKzWMiS3","FwEJzyluBx","Yh1hFrhl0J","prNT6rz7Ut","n1pmOGXdoH",
+"x3LDeQbxXc","VBjhzCp3mZ","RpBQmOxWIH","azIWpRBhp0","lsQGoM6qcG","hUTw7s4786","rhl0J4W0Tl","6q6L9S2Dfu","JRJQB29QAz","AIYUugdQsS",
+"DQimpgIYvE","QWxoTUlU3M","CK5W7LDk6f","pFrrlZv7z0","gIYvEgjUTu","okgRiFVMxo","fLNg8taOXK","AIYUuTwano","HzZT8TXQ0Z","JKWYRJIqXi",
+"Ta8f6hYBCK","KASQ8Kr8ys","uoStwogLgc","uTacxl83Ud","FcWrWIKxdL","CxVEf9GXkX","SWfouZzJHW","5VZjSix74r","dmoS72hEEU","RxrsmJ2mQi",
+"GXdoHuoStw","VNCPdRACuj","tl72Wd7vjM","tl72WEOE1o","WMiS3BpYhV","Nxx9Vn8pJ9","yluBx8xEKz","RmDcr9rlg9","ix74rfcJOy","tvdkDk85Ae",
+"Gv3FqMezSW","k85AeNcICA","s7MxkBCxeC","uAWypQ6hMC","QChxsdmoS7","uQIczo8Uyd","kZANmqQxHP","BCxeCSWfou","TCgPpx3LDe","vkCHHrz7Ut",
+"blLA92hEEU","n8pJ91v5hH","QnJ1SaFFss","4dEz6sx5Gl","yofH3lm0pD","P6bcgMezSW","wiHrZ8TxD7","0MR5XyluBx","In3NSU3yw5","jSjS3xXTI4",
+"8xEKzZ4I1v","Cp3mZdQ586","RsQUqHfyNQ","t59lRD6rBy","t59lRpAhR1","ix74rpvgjS","POUYSAmdQd","oGu6xogLgc","4QMc9WaWsv","x3LDeXflUq",
+"lj07Qhe9IA","gjUTuuLtKs","B3qemTXQ0Z","Chuy3I7p2a","VBjhzQYxC0","qQxHPlkMUA","tvdkDyvOMI","uTacxB3qem","7fKYUo8Uyd","FhtglCfgr3",
+"SmGzvlXFOB","s93MlFcWrW","Cfgr3B3qem","9y4lwatef2","tl72WFhtgl","Cp3mZvOqCE","OxWIHni2v1","fcJOyFNYIM","tjQxsCNHmv","lH1ktGrDg7",
+"v8yFNgdQsS","yEfy9WMiS3","vOqCEQworu","CdyBVvOqCE","EdBKcyluBx","azIWptlILt","OUqFMPb1pa","Mkgy8faHir","hYBCKpv0i7","C2IrcRACuj",
+"3otm6Ss0Zu","48cHLXyPZN","JIqXiKr8ys","yvOMI5drc6","rz7UtMmsIo","Y1mC0AOgEe","JXljWlpF6W","7lUXZIKxdL","AmdQdqQxHP","Q6LixDLhzM",
+"RmDcr3weIF","gIYvE7ku1p","gjUTucL0aE","iwzGklj07Q","uoStwSjskQ","UlU3MpT8wu","GWqqX4W0Tl","I7p2aydG8U","8hJdtcQOnv","RxrsmlweGy",
+"lXFOBUmaEv","dmoS7uQIcz","C2IrcVerEA","L7cGc4QMc9","Cp3mZhE1Ql","9eoRcjS1aj","lm0pDv1Hln","8cVD3Zv7z0","hi5X7ix74r","jzUqRAIYUu",
+"x3LDezHF1q","x3LDeuPX7G","fcwDatl72W","SbRYyGXdoH","aFFssh1zcH","8FmFH48cHL","FwEJzhUTw7","CdyBV07n1c","gf8rIVprf2","POUYSFhtgl",
+"7fKYUxXTI4","K4GS8t98iW","HfyNQzmLYD","8xEKzdhSuH","BGaQYF6PT2","jiVBPxXTI4","55rfBcL0aE","gdQsSZUnqt","0Kyfs4QMc9","8cVD3AIYUu",
+"Zv7z05IhmG","580YD5drc6","xReec45cIH","tl72WMkgy8","8cVD3LbRTH","tlILtHzZT8","ydG8U6AFT0","JIqXipiJSk","zz4ZU4dEz6","iqv4kv8yFN",
+"JJs5m1LB1L","CxVEfOUqFM","iKqhr24ARF","v8yFN24ARF","WPmlxdjsrv","JRJQBuoStw","CIShGhUTw7","oGu6xJXljW","aL6AJ0PktI","aL6AJUvlv4",
+"WMiS3tlILt","mX2GEAkKTk","jzUqR9rlg9","MmsIoAXpwE","JkzUntAOsr","wiHrZFhtgl","4QMc9Dz1R3","uQIczt98iW","uAWyppmeCd","4dEz6jfREu",
+"iKqhrRsQUq","M6qcGuTacx","8cVD3ydG8U","TwanoOUqFM","sqVrf6q6L9","lCMxyGWqqX","euZA524ARF","v2eC32DREs","guMb8uN6r3","gf8rI48cHL",
+"2DREsqUJMd","bZLvSvOqCE","jS1ajfqypy","MezSWfaHir","VBjhztaOXK","0h1b1MaJQs","jfREuqUJMd","QnJ1SqUJMd","7Ow5C2Nslm","NOHsz2TRI7",
+"618DiCxVEf","SWfouCdyBV","gdQsSnnP8o","nnP8ofFDrJ","XflUq0BmCy","YjB9tFnPFB","C2IrchUTw7","CIShG9eoRc","sqVrf7fsYM","fqypyfcJOy",
+"Dz1R3WMiS3","b29RJMojnP","FLsph0BmCy","tuDySzqH0W","DLhzMTCgPp","i7WMQfcJOy","5Mg9rOHaBz","pT8wuOxWIH","1j5L87fsYM","618DiMm8si",
+"KZamHFcWrW","2TRI7lpF6W","WmadAuLtKs","EoToPNOHsz","QChxsDQimp","UmaEvcL0aE","FwEJzpiJSk","v2eC3pv0i7","LDk6fbgJAz","Z4I1vdjsrv",
+"MGlTFLDk6f","cQOnvsoy9t","bZLvSlj07Q","Yf2Ec9rlg9","WPmlxtaOXK","Cp3mZK20wK","C2IrccL0aE","1LB1LOUYuF","WreyPjtn0X","yofH3FGzgp",
+"7fKYUWMiS3","24ARFVerEA","24ARFL7cGc","G1RhSk85Ae","0ao3ldjsrv","okgRipWiOs","e6e4z2Nslm","dmoS7uTacx","MezSWuupzk","WPmlxChuy3",
+"vkCHHsuY4x","e6e4z3weIF","Yf2EcJKWYR","Vprf2IjTwP","t98iW9rlg9","ulk41fFDrJ","DcpWBGv3Fq","jtn0X0YAGH","oVQp6BbwgA","l83UdGv3Fq",
+"8hJdtcL0aE","ydG8Ulm0pD","LDk6fhSSvQ","Ss0ZujzUqR","24ARFMojnP","lpF6W8TxD7","BGaQYMojnP","07n1ch1zcH","BGaQYQ6hMC","yToGWVNCPd",
+"FhtglHP433","ReKEW2TRI7","MK07YKASQ8","gdQsSni2v1","4dEz6cShY2","Ul4a1uvf7A","AOgEeOz8yZ","BFkb8RpBQm","blLA91v5hH","iwzGksoy9t",
+"pT8wupWiOs","Gv3FqdQ586","Vprf2IRh48","AgJHQBbwgA","qaofNCfgr3","WPmlx9rlg9","h1zcHBFkb8","jtn0Xe6e4z","fmIK1tAOsr","Ta8f6No0Qb",
+"5Drn0fcJOy","8cVD39GXkX","ZuDtDpv0i7","2DREsBCxeC","2Yz7EAmdQd","I7p2a45cIH","MojnPvkCHH","0KyfsksJby","WaWsvJkzUn","FFDuiL7cGc",
+"AmdQde6e4z","hSSvQCfgr3","ZJTXHVLTy6","hYBCKMm8si","2Yz7EwiHrZ","ZUnqtCfgr3","bgJAzRxrsm","M6qcGuvf7A","VLTy6zHF1q","v1HlnnnP8o",
+"MmKGJJXljW","OHaBzQworu","tl72WBFkb8","618DiyEfy9","Kr8ys07n1c","Ss0ZuPYBf4","16lHcuLtKs","uvf7AKASQ8","9rlg9sqVrf","MmsIoxReec",
+"qQxHPsqVrf","U3yw55drc6","tvdkDtAOsr","TwanoCNHmv","2hEEUYw2oU","zFgtBguMb8","atef2ksJby","ReKEWSjskQ","iqv4k4QMc9","hUTw76q6L9",
+"d85a9lXFOB","uupzkM3zXL","RpBQmsoy9t","45cIHm4bxU","FxX9qQnJ1S","prNT6TXQ0Z","X6PinDLhzM","FLsph9GXkX","okgRiUmaEv","0KyfslweGy",
+"WaWsvpiJSk","blLA9AXpwE","W3VFHJ2mQi","G1RhStaOXK","qaofNvLsmS","2NslmW7cTs","dhSuHQnJ1S","iqv4kQ6hMC","RsQUqRACuj","0ao3lF6PT2",
+"tl72WIjTwP","StlDJY1mC0","LDk6fd85a9","pFrrlFGzgp","RpBQmGXdoH","tjQxslweGy","fLNg8GSQwj","ix74rprNT6","7lUXZGXdoH","KASQ8jeskS",
+"FFDuiD6rBy","pWiOsfFDrJ","EdBKcSbRYy","rhl0Jru4UG","uTacxW3VFH","lsQGozqH0W","qaofNuN6r3","EdBKcrz7Ut","U3yw57hyVv","7hyVv618Di",
+"faHir8xEKz","SbRYyuoStw","rz7Ut5IhmG","zmLYDUmaEv","F6PT245cIH","XyPZNDG4sT","7ku1pYh1hF","Ul4a1FcWrW","55rfB8hJdt","5iGN55IhmG",
+"0ao3lWaWsv","K4GS8B3qem","Zv7z0ciuWz","yvOMIZuDtD","gjUTuUmaEv","ciuWzgf8rI","t98iWs93Ml","gdQsSHRxd8","yToGWv1Hln","cShY2s93Ml",
+"0Wr5yjfREu","J2mQi0MR5X","1v5hH8FmFH","Fhtgld85a9","KASQ8gf8rI","BpYhVQnJ1S","kZANm2ZHdk","M6qcG55rfB","QnJ1SaDGtS","TCgPp7ku1p",
+"uJScXJXljW","nnP8oOz8yZ","IBe8kjtn0X","yEfy9AkKTk","48cHLWPmlx","8RCUA8RCUA","djsrvB3qem","IRh48JRJQB","iwzGkQnJ1S","WMiS3lpF6W",
+"zqH0WOxWIH","FcWrW48cHL","VBjhzxciqp","hUTw7B3qem","2NslmtlILt","zQt6Qxciqp","vLsmS7hyVv","0YAGHyofH3","MmKGJCNHmv","MmKGJTwano",
+"YjB9tLewvM","hUTw7zqH0W","jS1aj8FmFH","NOHsz5nmWv","qUJMdfqypy","EdBKc55rfB","UmaEvOz8yZ","7fKYUOHaBz","ciuWztlILt","lXFOBVprf2",
+"S77LHjzUqR","XflUqWreyP","yEfy9WmadA","prNT6HfyNQ","Oz8yZJRJQB","t98iWFnPFB","t98iWCxVEf","FGzgpZhwG1","EoToPRxrsm","8TxD7QnJ1S",
+"hi5X7taOXK","lpF6WcmXIX","okgRiLDk6f","mX2GE5ZaEz","uvf7AKsjRK","Yw2oUlH1kt","Yw2oUPYBf4","8RCUAFxX9q","AIYUutlILt","TXQ0Zru4UG",
+"5nmWvuupzk","WreyPsqVrf","DG4sTy94nw","BFkb8d7vjM","LDk6fYOfrY","ZuDtD0BmCy","qUJMdRsQUq","Mkgy8VjCZq","ECMvU24ARF","55rfBJJs5m",
+"zFgtBCK5W7","9GXkXzQt6Q","In3NSSbRYy","s93Mll83Ud","In3NSa00b5","OxWIH3otm6","45cIH8U2nU","dhSuHCxVEf","d85a9HlUbF","jtn0XBbwgA",
+"lpF6WfFDrJ","5VZjSLDk6f","2hEEUnFqik","aDGtS4dEz6","Fhtglzz4ZU","zY1GYJKWYR","8RCUAFPfSE","TCgPpSjskQ","8TxD7SmGzv","FFDuibgJAz",
+"bgJAzh1zcH","nnP8oQnJ1S","07n1c2ZHdk","CIShGPYBf4","EOE1oQnJ1S","faHir6q6L9","AXpwE0BmCy","jtn0XZuDtD","9y4lwIRh48","Nxx9ViKqhr",
+"uZPqgzz4ZU","StlDJD6rBy","7fKYUs7Mxk","iwzGki7WMQ","XyPZNF6PT2","MK07Y0YAGH","fmIK1i7WMQ","uPX7GL7cGc","o8UydyEfy9","i7WMQHzZT8",
+"LewvMWaim6","zmLYDuTacx","atef2CIShG","FLsphdpe1v","pT8wuSbRYy","ix74rdQ586","yToGWuJScX","O3iyQO3iyQ","o8Uyd29QAz","RkQkeS2Dfu",
+"QYxC0aFFss","0BmCytjQxs","IBe8kGv3Fq","azIWp8RCUA","Yh1hFQClRL","7lUXZHlUbF","ogLgcDcpWB","NAFuw64s8N","QClRLnnP8o","s4786GrDg7",
+"5ZaEzDcpWB","5IhmGPOUYS","580YDNOHsz","Dz1R3S77LH","QssNC07n1c","0ao3lrhl0J","qaofNXyPZN","HfyNQzHF1q","iqv4kFGzgp","lH1ktCqqaD",
+"KZamH2DREs","rhl0JiB08l","F6PT2Oz8yZ","tjQxsAkKTk","I7p2a16lHc","UmaEv6q6L9","Z4I1vbZLvS","VerEAd85a9","gdQsSBFkb8","FNYIMMmKGJ",
+"Kr8yslpF6W","Yf2EcxXTI4","0KyfsQbxXc","45cIHdmoS7","pWiOsguMb8","h1zcHOHaBz","m4bxUQChxs","9GXkXzz4ZU","FhtglIjTwP","FVMxo9y4lw",
+"pWiOsBbwgA","0YAGHuTacx","e6e4zU3yw5","QnJ1SYw2oU","S77LHReKEW","ReKEWtAOsr","lj07QGSQwj","BGaQYZuDtD","8FmFHlCMxy","RmDcrciuWz",
+"StlDJYh1hF","x3LDeVerEA","580YDtlILt","lweGyK20wK","5iGN5Nxx9V","lsQGoMm8si","55rfB48cHL","O3iyQ0YAGH","AXpwEWDVWJ","xReecDcpWB",
+"ix74rdpe1v","aFFssatef2","2Nslmuupzk","lj07QgdQsS","4W0TliwzGk","djsrvBGaQY","aDGtSY1mC0","8xEKzQnJ1S","DLhzM3otm6","TwanohSSvQ",
+"EdBKcW7cTs","HfyNQsoy9t","OUqFMQnJ1S","QWxoTyvOMI","uTacxokgRi","d85a9IRh48","C2Irc0MR5X","k85AeMaJQs","jiVBPuTacx","5iGN5J2mQi",
+"uupzkcL0aE","OxWIHSbRYy","FVMxo6AFT0","rz7UtRmDcr","gf8rIRxrsm","brhlQZuDtD","HlUbFG1RhS","b29RJ9GXkX","HRxd8oQ87r","zz4ZUkB5nP",
+"n8pJ9pFrrl","CNHmvAXpwE","cL0aEhUTw7","wDajXW7cTs","FLsphtuDyS","CNHmvGv3Fq","NcICATwano","jfREuuLtKs","WmadA07n1c","RBhp0AXpwE",
+"AmdQdi3pyd","580YDv2eC3","LDk6fKASQ8","fLNg8uTacx","1j5L8JIqXi","KASQ8Mkgy8","4QMc9tl72W","XyPZN0MR5X","lweGyCfgr3","YjB9t5nmWv",
+"VNCPd8TxD7","t59lRnFqik","gdQsSFnPFB","TXQ0ZZuDtD","Ta8f6CdyBV","BpYhVBpYhV","FwEJzCIShG","0PktI8xEKz","fmIK1XflUq","NOHszU3yw5",
+"FPfSE3otm6","YOfrYZuDtD","nlaByQYxC0","FFDuiNcICA","Ss0Zu5VZjS","CNHmvaDGtS","AIYUuqaofN","zQt6QjiVBP","gdQsSRkQke","Yh1hFuvf7A",
+"EOE1ofcJOy","jtn0XfFDrJ","o8Uyd1j5L8","s7MxkKsjRK","F6PT2hUTw7","wiHrZuTacx","VIlwPdpe1v","Q6LixcShY2","HzZT8tvdkD","AOgEeGXdoH",
+"7ku1p5iGN5","YjB9ty94nw","lkMUAulk41","RkQkeW3VFH","aDGtSHlUbF","HlUbFuAWyp","7Ow5CZUnqt","tjQxsjzUqR","FFDuifFDrJ","Oz8yZVprf2",
+"DQimpFcWrW","MmKGJDz1R3","zHF1qQworu","55rfBWmadA","FnPFBRkQke","uoStwgf8rI","2TRI7Yw2oU","EoToPpmeCd","iwzGkDcpWB","ECMvUUmaEv",
+"IjTwPzQt6Q","uJScX5Namm","8TxD7P6bcg","h1zcHJ2mQi","IjTwP8RCUA","jfREuM3zXL","RsQUqhUTw7","i7WMQiqv4k","dpe1vECMvU","Gv3Fqd7vjM",
+"64s8NyToGW","gdQsSGXdoH","YjB9tECMvU","580YD2DREs","QWxoTNhXdu","FNYIMFVMxo","VNCPdFVMxo","dpe1vBFkb8","cmXIXW7cTs","POUYSCxVEf",
+"mz8gx7Ow5C","RBhp0OxWIH","e6e4zReKEW","hSSvQulk41","EoToPtvdkD","hYBCKmX2GE","Zv7z0dQ586","LewvMF6PT2","jSjS30PktI","fcJOyYf2Ec",
+"SjskQt98iW","OHaBzFcWrW","FxX9qW3VFH","RBhp0HfyNQ","QbxXcJRJQB","0MR5X14FLR","GWqqXlH1kt","FLsphvLsmS","l83Udrhl0J","wDajXZJTXH",
+"Ss0ZuRxrsm","VNCPdlpF6W","BpYhVLDk6f","uTacxfqypy","XyPZNEdBKc","MezSWhi5X7","F6PT216lHc","BFkb8Mm8si","C2IrctuDyS","v2eC3VIlwP",
+"7Ow5C4W0Tl","XflUqAOgEe","FNYIMnFqik","POUYSTXQ0Z","Dz1R3jtn0X","rKDLJReKEW","9y4lwxciqp","ECMvU0YAGH","MezSW8hJdt","8FmFHuTacx",
+"RmDcrFLsph","lweGyWmadA","y94nwSWfou","pWiOsNAFuw","StlDJW7cTs","SbRYyZ4I1v","uN6r32DREs","VNCPdWMiS3","zY1GY8RCUA","K20wKBCxeC",
+"uQIczYw2oU","rhl0Jtl72W","zz4ZUM6qcG","ECMvUo8Uyd","uZPqgbgJAz","ZhwG1WaWsv","tuDySs93Ml","NAFuwzQt6Q","uN6r3CdyBV","HfyNQHzZT8",
+"WPmlxJkzUn","d85a9W3VFH","gdQsSCqqaD","07n1c0MR5X","WPmlxcQOnv","euZA5FPfSE","0YAGHhUTw7","VIlwPuPX7G","OUqFMKr8ys","No0Qbiqv4k",
+"n8pJ97lUXZ","guMb8yToGW","AkKTkgjUTu","dQ586jtn0X","SbRYy45cIH","L7cGcCxVEf","RsQUqdjsrv","aL6AJ9eoRc","5ZaEz2Yz7E","uLtKsokgRi",
+"0BmCy2DREs","ru4UG8RCUA","lH1ktS77LH","ix74ratef2","tjQxsYf2Ec","StlDJVprf2","XyPZNn1pmO","9GXkX55rfB","JJs5miwzGk","S2DfuiB08l",
+"iKqhr9GXkX","k85AeFxX9q","lweGyVBjhz","In3NSxciqp","iwzGkdjsrv","P6bcgCNHmv","b29RJlweGy","y94nwjeskS","lm0pDzY1GY","QChxsGSQwj",
+"EoToPfcJOy","4QMc90h1b1","9rlg9uN6r3","OxWIHbrhlQ","RpBQmK4GS8","uN6r3Yh1hF","hE1QlvLsmS","9eoRcaDGtS","0h1b1h1zcH","S77LHokgRi",
+"7hyVv14FLR","MGlTF5Drn0","okgRi618Di","0Wr5yBCxeC","TwanoCIShG","hi5X7uZPqg","VerEAdhSuH","taOXKru4UG","oVQp6QClRL","oGu6xLDk6f",
+"yofH3piJSk","rKDLJzmLYD","TCgPpru4UG","pT8wuTa8f6","FwEJzFxX9q","RpBQmulk41","fcJOyZUnqt","WDVWJpAhR1","QWxoTbZLvS","aez9yhe9IA",
+"2NslmYw2oU","tjQxs6AFT0","fLNg8bgJAz","qUJMd2Yz7E","cmXIX9eoRc","vkCHH0Wr5y","FcWrWSmGzv","pv0i7pAhR1","zFgtBzbIYY","ZhwG1s93Ml",
+"VIlwPVNCPd","h1zcHHzZT8","rz7UtI7p2a","i3pyd5nmWv","fFDrJFcWrW","7fsYMrhl0J","Twanod85a9","Yf2EcdQ586","jSjS3soy9t","WMiS3P6bcg",
+"ZJTXHAgJHQ","EdBKckB5nP","pWiOspWiOs","uLtKsYh1hF","J2mQiUlU3M","1j5L8HfyNQ","CdyBV9XyT9","iKqhrjfREu","OxWIHTXQ0Z","5VZjSeuZA5",
+"0ao3llpF6W","F6PT2dhSuH","lkMUA8U2nU","lweGypiJSk","uZPqguupzk","oVQp6yofH3","MezSWBpYhV","QYxC0ulk41","FGzgpprNT6","6q6L9580YD",
+"nlaByZzJHW","MojnPlsQGo","9rlg9i7WMQ","RpBQmlCMxy","0BmCyK4GS8","Oz8yZdQ586","d85a9NhXdu","LbRTHFhtgl","WreyPk85Ae","n1pmOv8yFN",
+"UlU3MW7cTs","BpYhVThjNn","MK07YfLNg8","45cIH8FmFH","0KyfsogLgc","mX2GEaL6AJ","OUqFMFVMxo","F6PT2hSSvQ","VBjhzHP433","Ul4a1Nxx9V",
+"blLA9Q6Lix","tlILt0Wr5y","4W0TlHP433","Oz8yZpvgjS","3weIF1LB1L","BCxeCvkCHH","uPX7GQClRL","RzaZATXQ0Z","GWqqXL7cGc","DQimpFGzgp",
+"8TxD7cQOnv","8hJdtYf2Ec","uPX7GxXTI4","2DREshSSvQ","ksJbyn8pJ9","NOHszfaHir","NAFuwh1zcH","Zv7z0i3pyd","8cVD3lsQGo","jeskSfcwDa",
+"7X3uyzFgtB","5IhmGGXdoH","gdQsSyluBx","rz7Ut7X3uy","SWfouX6Pin","Ss0ZuiKqhr","Dz1R30MR5X","fcJOy0h1b1","cmXIXjzUqR","uTacx9y4lw",
+"0MR5XjzUqR","IKxdLuoStw","fmIK1EOE1o","EoToPJJs5m","Pb1pajzUqR","P6bcgaL6AJ","F6PT27fsYM","CxVEfFhtgl","lkMUAbgJAz","Ul4a1Ul4a1",
+"S77LHksJby","a00b5sx5Gl","nnP8olm0pD","07n1c9eoRc","b29RJJKWYR","bgJAziwzGk","WaWsvMK07Y","v2eC3t98iW","4QMc94dEz6","iKqhrdQ586",
+"jS1ajjiVBP","iB08lCNHmv","zQt6QgdQsS","Z4I1vv1Hln","okgRi7X3uy","CxVEf45cIH","sx5GlAIYUu","tl72WbZLvS","S2DfunFqik","C2IrcTa8f6",
+"WmadAn8pJ9","y94nwUlU3M","uTacxjtn0X","ZhwG1ni2v1","QClRLQChxs","uZPqg48cHL","0PktIpAhR1","fcJOys7Mxk","pvgjSzQt6Q","pWiOsciuWz",
+"s7Mxk618Di","1LB1LWmadA","lj07QzmLYD","Vprf2TCgPp","xReecGv3Fq","zqH0Wk85Ae","3weIFdhSuH","9iGoTFxX9q","3otm6uN6r3","UmaEvn1pmO",
+"W3VFHAOgEe","jiVBPCfgr3","IjTwPfcJOy","In3NSydG8U","X6PinvkCHH","ogLgcHRxd8","IRh48kZANm","YOfrYi3pyd","0BmCylViBv","7fsYM618Di",
+"DG4sTIRh48","VLTy6pAhR1","RACujzFgtB","lViBv55rfB","jfREusqVrf","WPmlxTCgPp","YjB9tjfREu","SbRYyKZamH","aDGtStuDyS","bZLvSqaofN",
+"Kr8ysQssNC","ReKEWYw2oU","Nxx9VJKWYR","xReecuoStw","7X3uyTXQ0Z","xXTI4MmKGJ","Vprf28RCUA","d7vjMaL6AJ","7fsYMRBhp0","5nmWv2hEEU",
+"FcWrW9eoRc","ydG8UBbwgA","y94nwHRxd8","fLNg8BCxeC","fFDrJZhwG1","iqv4kguMb8","GXdoHVprf2","jSjS3Ul4a1","iqv4kpFrrl","zHF1qYf2Ec",
+"oGu6x9GXkX","580YD9iGoT","2DREsfcJOy","jtn0XYOfrY","azIWp9iGoT","aDGtSogLgc","uvf7ARxrsm","RpBQmZuDtD","8RCUAQClRL","BbwgAxciqp",
+"RzaZAW7cTs","lCMxyOUqFM","wiHrZGWqqX","JJs5maFFss","4dEz6brhlQ","lweGy7fsYM","HlUbF5Drn0","14FLRgjUTu","uN6r3pmeCd","zz4ZUjzUqR",
+"JkzUnQssNC","FVMxoazIWp","8U2nUJIqXi","RBhp0t98iW","In3NSVjCZq","yofH3ulk41","24ARFW3VFH","SbRYyYOfrY","aL6AJlkMUA","2NslmQnJ1S",
+"580YD7ku1p","HRxd8gjUTu","0ao3l4dEz6","prNT6Yf2Ec","FFDuiM6qcG","ksJbyrKDLJ","m4bxU3otm6","CxVEfyluBx","RxrsmhE1Ql","Zv7z0brhlQ",
+"hUTw7piJSk","lm0pDZzJHW","HRxd8Pb1pa","lm0pDaez9y","zFgtB2TRI7","hYBCK2Nslm","BCxeCaL6AJ","BGaQYSjskQ","Yf2EcMK07Y","SmGzvYw2oU",
+"cL0aEyToGW","GXdoHFLsph","FVMxoStlDJ","bZLvSaL6AJ","6AFT0hYBCK","0PktIkZANm","yEfy9Mkgy8","rz7UtFjHXR","yToGWBpYhV","Nxx9VVjCZq",
+"vOqCERzaZA","cL0aE2TRI7","oQ87ryluBx","MmsIolweGy","0ao3lZuDtD","In3NSDLhzM","he9IAMezSW","zQt6Q580YD","fqypy0Wr5y","2DREsmz8gx",
+"jiVBPAOgEe","d85a9WreyP","L7cGcB3qem","I7p2aOHaBz","1j5L84W0Tl","tuDySni2v1","QChxss4786","lm0pDm4bxU","fqypys93Ml","ZJTXHoGu6x",
+"uupzkmz8gx","jeskSuPX7G","uN6r3blLA9","DQimp1j5L8","sqVrf5ZaEz","jS1ajokgRi","n8pJ9DQimp","k85AewDajX","MK07YKZamH","XyPZNAmdQd",
+"NcICAQClRL","hi5X79XyT9","WreyPtjQxs","gjUTufqypy","0PktIGSQwj","MojnPv1Hln","e6e4z7ku1p","Waim6LewvM","fcwDafcJOy","pFrrlix74r",
+"5iGN5G1RhS","U3yw5LbRTH","AkKTkB3qem","soy9tpT8wu","ix74rTCgPp","AkKTkSWfou","gIYvE8TxD7","pWiOsNo0Qb","45cIHQWxoT","AOgEeNAFuw",
+"K20wKZUnqt","Uvlv4In3NS","i7WMQatef2","VLTy6AmdQd","45cIHlm0pD","Vprf2VBjhz","guMb89iGoT","hUTw7oGu6x","yofH3CxVEf","lpF6W9rlg9",
+"uAWyplweGy","y94nwFNYIM","uJScXIn3NS","1LB1L5IhmG","XyPZNx3LDe","vLsmSl83Ud","RpBQmF6PT2","iqv4kiKqhr","5nmWvtl72W","hYBCK64s8N",
+"pvgjSP6bcg","AgJHQEoToP","Q6Lixo8Uyd","y94nwfqypy","64s8NPb1pa","YOfrYuTacx","qaofNbgJAz","AkKTkUl4a1","BFkb85nmWv","ZJTXHsoy9t",
+"JXljWGrDg7","DLhzMiKqhr","DG4sT55rfB","uupzkfaHir","FjHXRydG8U","CIShG0YAGH","zQt6QGSQwj","VerEAFVMxo","uoStwZ4I1v","Yh1hFIjTwP",
+"ru4UGWaim6","qUJMd6q6L9","iB08lrhl0J","oQ87rWaWsv","pWiOs9iGoT","vkCHHy94nw","EdBKcPb1pa","fqypy0ao3l","hUTw7RBhp0","Vprf2Pb1pa",
+"tuDySwiHrZ","dQ586580YD","hi5X74W0Tl","HlUbFo8Uyd","9iGoTFVMxo","2ZHdkyvOMI","DLhzMPb1pa","Qworu5VZjS","VIlwPBGaQY","ni2v1iqv4k",
+"Waim6ydG8U","VLTy6jfREu","618DilViBv","tl72W9y4lw","n8pJ9rhl0J","AgJHQL7cGc","7fKYUVIlwP","Nxx9VOz8yZ","a00b5D6rBy","yluBxIjTwP",
+"IKxdL5VZjS","QnJ1SiB08l","zHF1qIRh48","k85AeJRJQB","euZA5uvf7A","gdQsSAXpwE","hUTw7pAhR1","P6bcgFVMxo","16lHc5Namm","faHirtuDyS",
+"ni2v1vOqCE","2ZHdkiwzGk","VNCPdqUJMd","D6rByd85a9","ECMvUQnJ1S","9rlg9AIYUu","5Drn0MaJQs","MezSWDcpWB","dpe1v48cHL","DG4sTgjUTu",
+"Gv3Fqrhl0J","hUTw7a00b5","iqv4k2DREs","5Mg9r48cHL","HzZT864s8N","VerEAfaHir","JIqXisuY4x","9y4lweuZA5","lm0pDOUYuF","Mm8sijtn0X",
+"Chuy3MmsIo","YOfrYThjNn","xReecAmdQd","o8UydCK5W7","FFDuiFwEJz","KASQ8In3NS","ZhwG1U3yw5","8TxD79XyT9","MojnPAgJHQ","S77LHChuy3",
+"b29RJWreyP","VIlwPECMvU","n8pJ9cL0aE","BFkb8DQimp","aez9yrz7Ut","4W0TlEdBKc","CIShGOz8yZ","taOXKyEfy9","Yh1hFfFDrJ","lXFOB0Wr5y",
+"rhl0J5Namm","2Yz7EfcJOy","atef2AXpwE","16lHc16lHc","cShY2MmKGJ","GXdoHnFqik","7fKYUP6bcg","JkzUnaez9y","M3zXLBCxeC","NAFuwAkKTk",
+"tuDySFcWrW","fqypySjskQ","Oz8yZD6rBy","UlU3MThjNn","8U2nU0Kyfs","ciuWzSs0Zu","RsQUqFGzgp","MmsIos93Ml","lsQGoQnJ1S","OUYuF8FmFH",
+"Q6Lixd7vjM","Ss0ZuEoToP","7X3uy9iGoT","t59lRYh1hF","W7cTs0BmCy","uQIczMkgy8","OHaBzwiHrZ","qaofNYh1hF","nFqik3weIF","dQ586VjCZq",
+"lpF6Wk85Ae","lsQGos93Ml","cShY2GSQwj","mz8gxI7p2a","7X3uyuoStw","lkMUAI7p2a","fmIK1NOHsz","K4GS8mz8gx","Chuy3RmDcr","WreyPuupzk",
+"dmoS7jeskS","JKWYRl83Ud","3otm6Ta8f6","9iGoTyluBx","tAOsr5IhmG","TCgPpJkzUn","jiVBPK4GS8","FGzgpRkQke","Pb1pay94nw","uQIczksJby",
+"RsQUqpiJSk","QbxXcv1Hln","qUJMdNAFuw","Mm8siYw2oU","5Mg9rrKDLJ","M6qcGuZPqg","KsjRK7Ow5C","HRxd8d7vjM","iqv4kk85Ae","CK5W7euZA5",
+"B3qemJkzUn","cShY2AkKTk","CqqaDlH1kt","POUYSNOHsz","BCxeCYw2oU","KsjRK8xEKz","1j5L8zmLYD","d85a9XyPZN","d7vjMOz8yZ","L7cGcECMvU",
+"YjB9tcmXIX","AXpwEAOgEe","9y4lw8xEKz","Nxx9VStlDJ","t98iWZJTXH","5drc6m4bxU","GrDg7WmadA","4QMc9v2eC3","F6PT2kZANm","CdyBVyEfy9",
+"RxrsmtaOXK","uQIczjzUqR","cmXIXNhXdu","cQOnvRkQke","CxVEfRkQke","GXdoHzbIYY","NhXduRkQke","AkKTkWDVWJ","lm0pDuZPqg","pmeCdtjQxs",
+"8RCUAjiVBP","b29RJFGzgp","o8UydVerEA","StlDJxciqp","0BmCyzY1GY","tuDySpFrrl","SjskQnlaBy","BbwgAbrhlQ","zmLYDuJScX","CdyBVQssNC",
+"JkzUnrKDLJ","TwanoIKxdL","BpYhVulk41","l83Ud7fKYU","6q6L9LewvM","iqv4klweGy","NOHsztuDyS","UlU3MpmeCd","NcICAnnP8o","0MR5X0YAGH",
+"he9IAm4bxU","guMb814FLR","aL6AJfcwDa","HfyNQMezSW","gtCA524ARF","RzaZAuTacx","MK07YPYBf4","fqypyxXTI4","ThjNn6q6L9","jzUqRjfREu",
+"LewvMfFDrJ","8hJdtpFrrl","AXpwEzHF1q","FPfSERBhp0","xReec1v5hH","GrDg7brhlQ","ZJTXHCfgr3","jtn0XTXQ0Z","o8UydZJTXH","gf8rIoGu6x",
+"FhtglJKWYR","guMb8fmIK1","HzZT81LB1L","tvdkD2ZHdk","VerEAJIqXi","hYBCKK20wK","euZA5RpBQm","i7WMQ2TRI7","WaWsvfLNg8","xciqpGrDg7",
+"s93MlOxWIH","hE1QlSjskQ","KASQ8VjCZq","x3LDet59lR","JIqXiksJby","cmXIXM3zXL","Yh1hF9iGoT","J2mQi9rlg9","FFDuiHP433","ix74rlm0pD",
+"lH1ktuoStw","ZJTXHaL6AJ","cL0aE5Namm","tlILtprNT6","fqypylkMUA","MaJQsNcICA","UlU3MJIqXi","t98iWBCxeC","uLtKsQworu","2TRI7WPmlx",
+"fcJOyMaJQs","jSjS3uAWyp","zmLYDRxrsm","5Mg9rfcJOy","okgRi1v5hH","5Namme6e4z","7lUXZJkzUn","iB08lCqqaD","0Kyfszz4ZU","Y1mC0EdBKc",
+"9XyT9soy9t","FcWrW3otm6","fmIK17fsYM","IBe8k8hJdt","7X3uy1LB1L","BGaQYoVQp6","2DREsTwano","lCMxy8RCUA","rz7UtUl4a1","taOXKAIYUu",
+"1LB1LReKEW","s7MxkiB08l","xReec4QMc9","a00b57lUXZ","TXQ0ZStlDJ","2ZHdk0YAGH","VLTy6s93Ml","nFqikuvf7A","QbxXcVprf2","uoStwAXpwE",
+"zHF1q3otm6","cShY2NcICA","Ss0ZuzHF1q","CqqaDCfgr3","7fKYUUvlv4","jeskSn1pmO","DcpWBqUJMd","y94nwhYBCK","wDajXLbRTH","soy9t8FmFH",
+"XflUquoStw","NhXduaez9y","Ss0ZumX2GE","OHaBzFPfSE","BpYhVBbwgA","oGu6x8cVD3","M6qcGeuZA5","7X3uydjsrv","tlILtEdBKc","4W0TltAOsr",
+"oVQp6X6Pin","9eoRcx3LDe","lweGyCIShG","iwzGk16lHc","5ZaEzbZLvS","gIYvENo0Qb","sx5GlhSSvQ","lCMxyNhXdu","fqypy5Mg9r","Rxrsm7ku1p",
+"bZLvStvdkD","l83UdBGaQY","2NslmGv3Fq","DQimpWPmlx","CdyBVBGaQY","2DREs7ku1p","MmsIoFVMxo","POUYSWMiS3","tjQxsS77LH","kB5nPFGzgp",
+"YjB9taL6AJ","EoToPokgRi","Ta8f6aL6AJ","suY4x7hyVv","FPfSEh1zcH","9y4lwGWqqX","zmLYDd85a9","JIqXi3weIF","ru4UGQ6hMC","2hEEUi3pyd",
+"zqH0W7hyVv","pWiOssoy9t","0PktIB3qem","lpF6WHP433","jeskSzY1GY","uQIcztlILt","hUTw72Yz7E","jeskSZzJHW","bgJAzCxVEf","djsrvuLtKs",
+"7lUXZ8U2nU","ru4UGChuy3","29QAzNAFuw","EoToPdQ586","bgJAzjSjS3","xciqpKsjRK","9eoRc6AFT0","ZJTXHBCxeC","14FLRb29RJ","GWqqXY1mC0",
+"jeskSMm8si","sx5GllCMxy","fmIK13weIF","XyPZNG1RhS","wDajXrhl0J","7lUXZPYBf4","AmdQdjSjS3","dpe1v7lUXZ","ix74r1j5L8","Dz1R3Yw2oU",
+"SmGzvzqH0W","RzaZA2hEEU","8TxD7M3zXL","CNHmvzHF1q","sqVrfNcICA","FVMxotjQxs","uoStwMezSW","k85AeX6Pin","vkCHHRpBQm","Waim6d7vjM",
+"pT8wuQClRL","fLNg8ni2v1","2TRI7CxVEf","SjskQ0h1b1","LewvMM3zXL","7X3uyAkKTk","HP433LewvM","P6bcg9y4lw","tAOsrprNT6","lm0pD9eoRc",
+"JkzUn2Nslm","guMb8ZuDtD","LbRTHVerEA","bgJAzHlUbF","m4bxU5VZjS","zqH0W16lHc","fcJOyYw2oU","yofH3lCMxy","QWxoToQ87r","v8yFNGXdoH",
+"FhtglBFkb8","BFkb8yToGW","o8UydtuDyS","zbIYYx3LDe","HfyNQlm0pD","k85AeblLA9","guMb8Rxrsm","d85a9n8pJ9","lj07Q5IhmG","azIWpsuY4x",
+"8U2nUuvf7A","ZzJHWm4bxU","EoToPaL6AJ","Yh1hFlViBv","FFDuidhSuH","618Di580YD","D6rBySWfou","9eoRc9rlg9","aez9y580YD","jS1aj3otm6",
+"0MR5X7Ow5C","ECMvU07n1c","VLTy6KZamH","zqH0WazIWp","No0QbPb1pa","h1zcHlCMxy","jfREu2ZHdk","uLtKsxXTI4","MezSWVIlwP","AOgEeokgRi",
+"uPX7GOUqFM","lweGyVNCPd","Mm8sinlaBy","aFFssI7p2a","0BmCy5Drn0","Yw2oURACuj","mz8gxk85Ae","MmKGJv1Hln","aez9yuAWyp","W3VFHgtCA5",
+"QnJ1SyEfy9","Q6hMCs93Ml","gjUTu24ARF","In3NS5IhmG","Qworu7fsYM","uvf7APOUYS","mz8gxlCMxy","KASQ8HP433","v2eC3faHir","gjUTuZhwG1",
+"SbRYyYh1hF","GrDg7rhl0J","RkQkeuN6r3","W7cTsBpYhV","0ao3lQChxs","29QAzTCgPp","jS1ajaL6AJ","WDVWJQnJ1S","GSQwjlXFOB","0BmCyYjB9t",
+"8xEKzjS1aj","5nmWvo8Uyd","QnJ1SaL6AJ","mX2GERmDcr","nFqikuJScX","jfREu8cVD3","m4bxUcL0aE","xXTI4FjHXR","NAFuwZUnqt","QYxC0dpe1v",
+"29QAz618Di","YjB9tpAhR1","Cfgr3dQ586","hUTw7ZzJHW","0YAGHQssNC","ksJbyt98iW","lweGyMm8si","mz8gxiB08l","b29RJ9rlg9","okgRiaL6AJ",
+"vkCHH7X3uy","l83UdVLTy6","Cfgr3LewvM","tjQxsO3iyQ","J2mQiCdyBV","SWfouyToGW","s93MlaL6AJ","YjB9tIn3NS","JRJQBM3zXL","mX2GED6rBy",
+"dQ586guMb8","m4bxUL7cGc","s7MxkSjskQ","mX2GE5VZjS","RBhp0s93Ml","5iGN5QChxs","4dEz68hJdt","5Drn014FLR","djsrvlj07Q","jtn0X6AFT0",
+"vkCHHo8Uyd","7lUXZkB5nP","t59lRyofH3","RpBQmKr8ys","7X3uyQbxXc","OHaBzn1pmO","fcJOyQChxs","Yf2Ec5Mg9r","24ARF64s8N","4QMc9yofH3",
+"9iGoTlkMUA","LDk6fGWqqX","QbxXcQClRL","brhlQReKEW","XyPZNpmeCd","QworuPOUYS","GXdoHRkQke","s93MlU3yw5","Yh1hFatef2","azIWp07n1c",
+"rhl0JVNCPd","HfyNQuN6r3","uvf7AfcJOy","SWfoudpe1v","QWxoT2TRI7","AXpwEa00b5","qaofNMmsIo","3otm6580YD","mz8gxW3VFH","0h1b1b29RJ",
+"DQimpVjCZq","yvOMItl72W","K20wKRxrsm","v2eC36AFT0","CIShGTCgPp","Cfgr3FwEJz","lCMxy0YAGH","dmoS7AkKTk","hUTw7nFqik","55rfBzz4ZU",
+"azIWpMezSW","NAFuwEoToP","4QMc95iGN5","Q6hMC7ku1p","v1HlnokgRi","Ul4a1OUYuF","K20wKpFrrl","a00b5uLtKs","5drc6MGlTF","TXQ0Zt59lR",
+"GSQwjQnJ1S","jeskS07n1c","tlILt3weIF","2Yz7EFNYIM","Ul4a1jS1aj","CxVEfMojnP","jtn0Xs93Ml","EoToPQssNC","RkQkeNOHsz","nlaByDG4sT",
+"uLtKs1LB1L","SWfouOHaBz","I7p2aIn3NS","okgRiuLtKs","uQIczuAWyp","Nxx9VUlU3M","BGaQY1v5hH","hSSvQZzJHW","euZA5xReec","RkQkeNhXdu",
+"oVQp6QChxs","x3LDeNxx9V","tjQxsG1RhS","blLA907n1c","IRh48fFDrJ","hE1Qldpe1v","2DREsyEfy9","ulk419GXkX","POUYSJJs5m","cL0aEeuZA5",
+"Q6hMC1j5L8","iqv4kOz8yZ","oVQp6vOqCE","OUqFMSbRYy","MmKGJEOE1o","brhlQ8cVD3","v2eC3HlUbF","l83UdgtCA5","2NslmFGzgp","5iGN5StlDJ",
+"AXpwEUvlv4","Pb1pa1j5L8","s93MlEOE1o","3otm67ku1p","ECMvUMm8si","s4786azIWp","gf8rIsx5Gl","fqypyzmLYD","VjCZq8FmFH","BGaQYpFrrl",
+"ZuDtD7ku1p","MaJQsUvlv4","ZJTXHK20wK","Yf2Ec7X3uy","QbxXcnFqik","lj07Qs4786","Ss0ZupWiOs","hi5X7LbRTH","FcWrWuPX7G","Uvlv4618Di",
+"G1RhSuLtKs","Pb1paUl4a1","YjB9tB3qem","i7WMQpFrrl","IKxdLNxx9V","pWiOsoVQp6","ZJTXHuZPqg","jSjS3EoToP","FVMxoDz1R3","2TRI7J2mQi",
+"CxVEfs7Mxk","5VZjSuN6r3","uvf7AiB08l","Vprf2h1zcH","cmXIXulk41","jS1ajRBhp0","zHF1q580YD","HfyNQTCgPp","MmsIoVerEA","StlDJFhtgl",
+"XflUqAgJHQ","hYBCKQbxXc","RsQUqI7p2a","lkMUA5Mg9r","pFrrlBbwgA","WDVWJv8yFN","iB08lYf2Ec","X6PinpmeCd","Kr8ysCIShG","Ta8f6zmLYD",
+"uPX7G0Kyfs","MGlTFAIYUu","d85a9S77LH","0Kyfsrz7Ut","xXTI4ru4UG","14FLRs4786","he9IA2Nslm","07n1cyluBx","QnJ1SQnJ1S","WPmlxHP433",
+"iB08lQssNC","e6e4zAOgEe","B3qemm4bxU","pT8wuQworu","hUTw70Wr5y","jS1ajpiJSk","ZhwG1HP433","rz7UtAIYUu","tAOsr07n1c","RACujC2Irc",
+"ZzJHW5Mg9r","jS1ajAXpwE","SWfouWMiS3","gIYvEiwzGk","HP433Gv3Fq","FPfSEcQOnv","jtn0XTwano","suY4x0ao3l","fFDrJeuZA5","soy9tpFrrl",
+"ix74rhYBCK","7Ow5C9rlg9","i7WMQCp3mZ","iKqhrUl4a1","9rlg9SWfou","VBjhzIBe8k","29QAzFxX9q","lkMUARsQUq","0Kyfs4dEz6","D6rByWmadA",
+"MaJQsCfgr3","HlUbF2hEEU","hi5X7zmLYD","LbRTHnlaBy","5Drn0dpe1v","JJs5mru4UG","lweGySbRYy","7ku1pzqH0W","ZJTXHW7cTs","t98iW2TRI7",
+"NhXdu5Drn0","hi5X75VZjS","OxWIHYf2Ec","ZUnqtdjsrv","JkzUn2ZHdk","0MR5Xn8pJ9","C2IrcU3yw5","4W0TlZv7z0","AgJHQgjUTu","5Drn0Y1mC0",
+"7X3uyiqv4k","SWfou0h1b1","dpe1vn1pmO","vLsmS5ZaEz","5NammnlaBy","5iGN5WDVWJ","faHir1LB1L","tlILtNOHsz","HRxd8t98iW","qQxHPbgJAz",
+"DLhzMWaWsv","VLTy6In3NS","F6PT2kB5nP","TXQ0ZEoToP","OHaBzgIYvE","gIYvEVerEA","Vprf2mz8gx","OUYuF9rlg9","0Wr5y618Di","fqypyRBhp0",
+"RzaZAiqv4k","x3LDedmoS7","M3zXLUl4a1","FGzgpmX2GE","NOHszHP433","soy9tQssNC","fmIK1hE1Ql","nnP8o2Yz7E","fcJOyqQxHP","Ul4a1n1pmO",
+"MmsIoWMiS3","tAOsrAmdQd","5Mg9r5drc6","yEfy9zqH0W","FjHXRW3VFH","5nmWvQChxs","PYBf4cShY2","pWiOsx3LDe","DQimpThjNn","24ARFsx5Gl",
+"HP433pmeCd","BFkb8nnP8o","cL0aE0MR5X","45cIHb29RJ","7hyVvK4GS8","618DiWMiS3","OxWIHfLNg8","sx5GlIKxdL","B3qemjiVBP","lH1ktCIShG",
+"Cp3mZDLhzM","HRxd8LewvM","zqH0WQChxs","W3VFH7lUXZ","0MR5XQssNC","azIWp2hEEU","7lUXZlsQGo","9XyT92DREs","KZamHogLgc","wDajXzqH0W",
+"3otm6Vprf2","AmdQdJJs5m","MezSW5Namm","uJScXSs0Zu","KZamHGWqqX","pv0i7uupzk","BbwgAAOgEe","qUJMd5VZjS","zY1GYdQ586","uoStw24ARF",
+"ZzJHWoVQp6","ydG8UfLNg8","M3zXLD6rBy","qQxHPs7Mxk","dmoS7Yf2Ec","Yw2oUjtn0X","EOE1oJkzUn","blLA9iB08l","FLspha00b5","EoToPFLsph",
+"IjTwPXflUq","zQt6QmX2GE","6q6L9zQt6Q","RpBQmlkMUA","S77LHguMb8","s7MxktaOXK","piJSkiqv4k","b29RJfaHir","GWqqX9XyT9","he9IAhi5X7",
+"2Nslm45cIH","tAOsrF6PT2","580YD8U2nU","JJs5mnnP8o","blLA9MK07Y","29QAzFnPFB","rKDLJuTacx","48cHLFPfSE","Uvlv4Q6hMC","jS1aj0MR5X",
+"mz8gx7ku1p","MojnPJ2mQi","S77LH9XyT9","8FmFHpv0i7","tAOsrnlaBy","VNCPdb29RJ","d85a9pAhR1","Ul4a1vkCHH","nlaBytjQxs","yluBxGWqqX",
+"FGzgpuTacx","FFDuiWaWsv","dmoS7QssNC","JkzUns7Mxk","OHaBz0Kyfs","hUTw7DQimp","RzaZAQssNC","sx5GltjQxs","618DifLNg8","v8yFNQWxoT",
+"EdBKcgf8rI","0h1b1Mm8si","uPX7Gni2v1","X6PinqUJMd","DLhzM0h1b1","xXTI4ZuDtD","TXQ0Z29QAz","5nmWv0ao3l","wiHrZ1v5hH","Ul4a1kB5nP",
+"gdQsSaez9y","hE1QllweGy","StlDJ0BmCy","BGaQYv2eC3","qaofNNAFuw","580YDa00b5","KASQ8d85a9","FjHXRd7vjM","IKxdLAkKTk","kB5nPVNCPd",
+"tjQxswDajX","D6rByuvf7A","GWqqXWmadA","fqypyvOqCE","M3zXLY1mC0","gf8rIuJScX","Q6hMC618Di","IBe8kulk41","AkKTkTwano","CqqaDiB08l",
+"pT8wuWMiS3","ZJTXHBpYhV","suY4x5Namm","K4GS8wDajX","8TxD7IBe8k","RkQke5nmWv","ksJbyFFDui","8U2nUWDVWJ","Yw2oUQ6Lix","tl72WwiHrZ",
+"FPfSErhl0J","FxX9qAgJHQ","45cIHVNCPd","jiVBPXyPZN","m4bxUxReec","yofH37fKYU","X6PinuN6r3","MGlTFpAhR1","9rlg9JXljW","Oz8yZoGu6x",
+"m4bxUlH1kt","MezSW3otm6","6q6L9sqVrf","ZJTXHfcwDa","XyPZNjeskS","QssNCuLtKs","DG4sTYOfrY","pv0i7brhlQ","MGlTFn1pmO","l83UdMojnP",
+"blLA924ARF","2DREsm4bxU","AmdQdnnP8o","FnPFBx3LDe","uupzkHP433","gdQsSoVQp6","oVQp6KsjRK","0Wr5yfmIK1","ZJTXH7lUXZ","lkMUAyvOMI",
+"xciqpNo0Qb","9iGoTiwzGk","cQOnvl83Ud","Q6hMC16lHc","4QMc9MezSW","Waim6b29RJ","uTacx7hyVv","tlILtzz4ZU","hE1Qlpv0i7","prNT6D6rBy",
+"QWxoTFLsph","UlU3MX6Pin","sx5GluJScX","YjB9tWMiS3","nnP8ojSjS3","MmKGJVjCZq","S2DfuyluBx","QssNCa00b5","h1zcH16lHc","7hyVvQ6Lix",
+"UmaEvCqqaD","pAhR1i3pyd","RmDcrOxWIH","POUYSEoToP","2hEEU07n1c","ZuDtDIn3NS","6AFT0G1RhS","CK5W74dEz6","jtn0XbrhlQ","y94nwoGu6x",
+"29QAzvLsmS","ciuWzJXljW","tl72WlViBv","GSQwj0Kyfs","7Ow5C3otm6","oGu6xRxrsm","4QMc9QssNC","he9IA9eoRc","CIShGWDVWJ","pFrrlCp3mZ",
+"aez9yuPX7G","jiVBPWPmlx","RxrsmtuDyS","dpe1vprNT6","Dz1R3lCMxy","Kr8yssoy9t","5Mg9rix74r","ECMvUfcJOy","Ta8f6MojnP","16lHcjS1aj",
+"cmXIXECMvU","IRh48uQIcz","blLA9580YD","WaWsvAXpwE","iB08lh1zcH","Chuy3jtn0X","I7p2a9rlg9","QssNC7fKYU","8cVD3zqH0W","OxWIHBCxeC",
+"blLA9JXljW","jzUqRWaim6","ZuDtDfFDrJ","618Din1pmO","LDk6f1j5L8","5iGN5KsjRK","WmadA6q6L9","9rlg9CxVEf","lm0pDIKxdL","rhl0JX6Pin",
+"0PktIGrDg7","tl72Wix74r","i3pydlpF6W","UmaEvksJby","zmLYDGWqqX","rhl0Jatef2","MGlTFM6qcG","s93MlNAFuw","HP433yvOMI","ogLgc0YAGH",
+"zQt6QJ2mQi","JIqXituDyS","W3VFHzmLYD","5NammzqH0W","lm0pDY1mC0","iB08llpF6W","Ss0ZuJXljW","BbwgABCxeC","Q6hMCGSQwj","JRJQBMojnP",
+"Ta8f6IKxdL","b29RJZhwG1","ZJTXH4dEz6","CqqaDBCxeC","FwEJziKqhr","atef2CdyBV","W7cTspT8wu","9rlg9DcpWB","xXTI4ZUnqt","zQt6QyluBx",
+"Q6LixzY1GY","HfyNQThjNn","hE1QlFxX9q","jeskS1LB1L","o8Uyd5IhmG","S2Dfu4W0Tl","QssNCgjUTu","55rfBd7vjM","uvf7ARsQUq","y94nw7ku1p",
+"atef2tuDyS","RpBQmpmeCd","lweGybZLvS","Vprf2nlaBy","QnJ1Sru4UG","zFgtBs4786","0BmCyKASQ8","3weIF0Kyfs","v2eC3ZzJHW","mz8gxAXpwE",
+"ulk41ulk41","wiHrZt59lR","lkMUAHRxd8","zz4ZUOxWIH","X6PinFnPFB","W3VFHNAFuw","hE1QluZPqg","fmIK1FnPFB","7fKYUwiHrZ","8xEKzRmDcr",
+"pAhR14QMc9","2NslmGXdoH","uupzkSs0Zu","Yw2oUaDGtS","UmaEvAmdQd","zqH0W0YAGH","NcICATXQ0Z","K4GS8K4GS8","ThjNnfLNg8","uJScXYOfrY",
+"HlUbFFLsph","0Kyfsy94nw","ulk41W3VFH","PYBf4Y1mC0","3otm6pv0i7","EoToP6AFT0","lXFOB4dEz6","VBjhzBbwgA","QWxoTQWxoT","7Ow5CVjCZq",
+"pT8wupmeCd","L7cGcoGu6x","S2DfugjUTu","d7vjMMK07Y","5ZaEz4dEz6","VLTy6Chuy3","VjCZq5iGN5","GXdoHQssNC","HlUbFQssNC","FNYIMTXQ0Z",
+"qUJMdx3LDe","QYxC0RpBQm","RzaZAFxX9q","5nmWv9rlg9","QWxoTqaofN","FcWrW8RCUA","uZPqgVLTy6","FhtgljzUqR","55rfBrz7Ut","jS1ajd7vjM",
+"m4bxUFLsph","rKDLJTa8f6","55rfBChuy3","JKWYRaez9y","gjUTu6AFT0","piJSkZ4I1v","DLhzMWMiS3","sqVrfSbRYy","WmadA9GXkX","U3yw5ZUnqt",
+"NAFuwoQ87r","DLhzMjfREu","FjHXRokgRi","5Mg9rlViBv","ru4UGjfREu","Z4I1vprNT6","pv0i7UlU3M","RACujgIYvE","uvf7AFGzgp","yToGWXflUq",
+"WPmlxRzaZA","CIShGdmoS7","iKqhrcL0aE","7fsYMFGzgp","7hyVvCxVEf","i7WMQMaJQs","BFkb87fsYM","l83UdWMiS3","yvOMIni2v1","dpe1vpAhR1",
+"zbIYY3otm6","FhtglEOE1o","tlILtYOfrY","7fsYMiKqhr","0MR5XQ6Lix","NhXdus7Mxk","MojnPogLgc","yluBx0Kyfs","HP43364s8N","AXpwEQWxoT",
+"pv0i7sx5Gl","8TxD7HzZT8","7fsYMyvOMI","0h1b1n8pJ9","qaofNsoy9t","SbRYyOUYuF","d85a9jS1aj","VIlwPTXQ0Z","lsQGoaL6AJ","wiHrZzFgtB",
+"D6rByS2Dfu","HfyNQuTacx","dmoS7n8pJ9","jSjS3Ta8f6","l83Ud1LB1L","fFDrJx3LDe","QChxsJKWYR","55rfBTwano","qQxHPS77LH","VerEAPOUYS",
+"aDGtSTa8f6","iKqhrLDk6f","C2Irco8Uyd","e6e4zv2eC3","GrDg7uZPqg","HlUbFFcWrW","Q6hMCUmaEv","atef2FnPFB","hE1QlCNHmv","prNT6Z4I1v",
+"l83UdlViBv","GWqqXWaim6","7Ow5CoVQp6","1j5L8dmoS7","jeskSsuY4x","MaJQskZANm","s4786dQ586","Q6hMCeuZA5","lj07QnnP8o","uAWypvLsmS",
+"WreyPO3iyQ","vOqCEokgRi","aFFssuQIcz","3weIFUmaEv","5IhmGk85Ae","zFgtB8U2nU","8cVD3JRJQB","VNCPddjsrv","i7WMQv8yFN","5IhmGNAFuw",
+"D6rByXflUq","guMb8OUYuF","7X3uyJIqXi","AIYUu48cHL","GWqqXQbxXc","ZhwG1n1pmO","JXljWRBhp0","ReKEWCqqaD","aDGtSfcwDa","QnJ1ShSSvQ",
+"uJScXKZamH","uN6r3uQIcz","lViBvpFrrl","d7vjMyToGW","YjB9tpmeCd","jzUqRdmoS7","DQimpTa8f6","mX2GEhUTw7","5drc6lm0pD","FwEJzbrhlQ",
+"cShY28xEKz","Kr8ysEOE1o","64s8N0BmCy","F6PT2Chuy3","ZzJHWbgJAz","QWxoT8xEKz","ciuWzWaim6","G1RhSdhSuH","Ta8f6ZuDtD","o8UydxReec",
+"oGu6xhSSvQ","RxrsmgIYvE","tvdkD4dEz6","ciuWzCqqaD","K20wKfLNg8","ru4UG8hJdt","kB5nP8TxD7","XyPZNOUqFM","K20wKhe9IA","uLtKsRsQUq",
+"PYBf4t59lR","fcJOyRsQUq","tl72We6e4z","djsrvcL0aE","1v5hHGWqqX","HzZT80MR5X","bgJAzRmDcr","Q6Lix4QMc9","okgRiBFkb8","pT8wuDLhzM",
+"vkCHHYh1hF","7ku1p2Yz7E","6q6L9HRxd8","ZzJHWUlU3M","jiVBPoVQp6","uQIczNo0Qb","soy9tqUJMd","TXQ0Z2Nslm","2Yz7E8xEKz","Yf2EcNOHsz",
+"gtCA5fLNg8","pT8wu9XyT9","OHaBzOUqFM","faHirQ6Lix","Waim6a00b5","kZANmaDGtS","oQ87rsoy9t","hE1Ql0ao3l","7lUXZfFDrJ","55rfBBFkb8",
+"lkMUAlkMUA","JIqXiZv7z0","lj07QnlaBy","3otm6FjHXR","yluBxL7cGc","ix74r45cIH","SWfouAOgEe","SjskQQworu","k85AeThjNn","RkQkeIRh48",
+"Yh1hFblLA9","SWfouvkCHH","5nmWvYw2oU","24ARF0PktI","FcWrWcL0aE","vLsmSs4786","Chuy3yofH3","mz8gxCK5W7","uupzkzqH0W","2TRI7JRJQB",
+"0YAGHQ6Lix","D6rByUl4a1","qQxHPReKEW","U3yw5pv0i7","AmdQdiKqhr","OUYuF24ARF","yEfy9JJs5m","G1RhSt98iW","Gv3FqK4GS8","P6bcguLtKs",
+"5VZjS45cIH","WPmlxgdQsS","qQxHPFhtgl","5nmWvpmeCd","8RCUA9y4lw","D6rByy94nw","1v5hHBFkb8","gf8rIlH1kt","qaofNMezSW","KZamHkZANm",
+"BGaQYuupzk","n1pmOoQ87r","nFqikjiVBP","Uvlv4VerEA","Zv7z0sqVrf","Ta8f6NAFuw","Yh1hFtlILt","5ZaEzzY1GY","2DREsfqypy","CxVEfTXQ0Z",
+"NOHszWaim6","lCMxylXFOB","J2mQilXFOB","HzZT8Fhtgl","5NammAOgEe","0ao3lqUJMd","Ta8f6gtCA5","ZUnqtblLA9","W7cTsYf2Ec","qaofNUl4a1",
+"ogLgcVLTy6","zbIYYs93Ml","IKxdLOUqFM","WPmlxGSQwj","Qworu9iGoT","B3qemZUnqt","pT8wuWmadA","Yf2EckB5nP","RBhp016lHc","pvgjSKr8ys",
+"7hyVvFhtgl","Q6LixMK07Y","RzaZACfgr3","EoToPblLA9","ZzJHWQssNC","gdQsSIKxdL","jiVBPb29RJ","AOgEe2TRI7","2NslmzHF1q","xciqpQnJ1S",
+"b29RJtjQxs","tl72WNhXdu","bgJAzY1mC0","pvgjSJXljW","aDGtSEoToP","lViBvZJTXH","Oz8yZdmoS7","Uvlv41v5hH","sx5GlChuy3","5nmWvWDVWJ",
+"OHaBzdpe1v","Mm8si0Kyfs","S2DfuW3VFH","QworuAgJHQ","9iGoTLbRTH","l83UdIRh48","t59lRSmGzv","fcwDaWaim6","rKDLJI7p2a","U3yw50h1b1",
+"IBe8kpWiOs","KsjRK24ARF","rz7UtqQxHP","Q6LixUvlv4","7hyVvEdBKc","WPmlxFnPFB","hYBCK2ZHdk","pmeCdpiJSk","Mm8si7ku1p","Q6hMCFLsph",
+"yluBx9rlg9","DcpWBF6PT2","7hyVvnFqik","Mkgy8Ul4a1","VNCPdMezSW","aez9y0BmCy","tvdkDaFFss","lH1kt9rlg9","vkCHHbgJAz","lCMxyRpBQm",
+"Mkgy8UmaEv","hi5X7WreyP","VjCZqzbIYY","HlUbF07n1c","Kr8ysuupzk","QnJ1S9GXkX","W7cTshi5X7","NcICAvkCHH","zHF1quZPqg","TCgPpMmKGJ",
+"suY4xkB5nP","K4GS8Cfgr3","aL6AJHP433","Q6Lix9rlg9","C2IrcnFqik","ZuDtD580YD","faHir4QMc9","29QAzOUqFM","QClRLHlUbF","XyPZNFLsph",
+"Kr8yspmeCd","fLNg8JJs5m","Y1mC0BGaQY","UmaEvCIShG","mX2GEFLsph","HP433Q6Lix","Y1mC0WMiS3","MmKGJlH1kt","Pb1paEOE1o","FcWrW5drc6",
+"Ta8f6VjCZq","IKxdLAIYUu","QChxsVBjhz","StlDJIKxdL","XyPZNn8pJ9","Qworu7lUXZ","AIYUujS1aj","zHF1qWaWsv","5nmWvzbIYY","SbRYya00b5",
+"48cHLhi5X7","VIlwPLDk6f","16lHct98iW","uZPqgEoToP","zmLYDqUJMd","guMb8ciuWz","AmdQdjiVBP","0h1b1ZhwG1","X6PinCNHmv","2Nslm7hyVv",
+"pWiOsQssNC","ciuWz5IhmG","0Wr5y9XyT9","wDajXNxx9V","tlILtv8yFN","NAFuwgf8rI","Vprf23otm6","jS1ajCdyBV","4W0Tl7hyVv","DLhzMhi5X7",
+"2NslmFxX9q","h1zcHuPX7G","s93MlRACuj","uZPqgFxX9q","IjTwP14FLR","TXQ0ZsuY4x","pFrrlJXljW","ZUnqtzmLYD","OHaBzTa8f6","I7p2ajSjS3",
+"5IhmGtlILt","Pb1paPb1pa","okgRi7ku1p","AOgEepAhR1","cQOnv7hyVv","ydG8Urhl0J","NOHszSWfou","atef2xXTI4","oGu6xMaJQs","OHaBzuLtKs",
+"h1zcHqQxHP","vOqCExciqp","SbRYyatef2","AIYUuZv7z0","DcpWBRsQUq","K4GS8MojnP","AOgEeuvf7A","uN6r3EdBKc","jeskSReKEW","soy9txXTI4",
+"xXTI4MaJQs","I7p2agf8rI","HfyNQs93Ml","3weIFpmeCd","JKWYRGXdoH","WmadAi3pyd","wiHrZSjskQ","Uvlv4DG4sT","Nxx9VtjQxs","ksJbytjQxs",
+"FjHXRUl4a1","JIqXiaez9y","MmsIouJScX","0MR5XhSSvQ","Mkgy8euZA5","6AFT0CNHmv","QnJ1S24ARF","n1pmOQssNC","BGaQY6AFT0","1v5hHM6qcG",
+"lweGyVIlwP","5ZaEzEoToP","mz8gxlm0pD","TwanoYh1hF","kB5nPlH1kt","dmoS7sqVrf","TXQ0ZoQ87r","X6PinzHF1q","Mkgy8AIYUu","5iGN507n1c",
+"PYBf4hSSvQ","iKqhre6e4z","64s8Nfqypy","0MR5XfLNg8","XflUqUl4a1","KsjRKbrhlQ","a00b5jiVBP","7X3uyTa8f6","CqqaDlViBv","9XyT955rfB",
+"nnP8olsQGo","s4786zY1GY","EOE1o5iGN5","BpYhVRACuj","EOE1oblLA9","DcpWBWMiS3","VBjhzNxx9V","guMb8ni2v1","B3qemVerEA","dmoS73otm6",
+"5IhmGuPX7G","jzUqRUl4a1","S77LHhYBCK","FhtglPb1pa","l83Ud8TxD7","s93Mlatef2","lkMUAv1Hln","Mm8siprNT6","8cVD3lweGy","L7cGcwDajX",
+"NhXduvOqCE","uPX7GDG4sT","fcwDav8yFN","7lUXZk85Ae","he9IAC2Irc","yofH3iB08l","CxVEft98iW","MGlTFpmeCd","VLTy6FPfSE","Q6Lix0MR5X",
+"VNCPdFhtgl","FwEJzn8pJ9","RACuj2DREs","wiHrZ4dEz6","t98iWCqqaD","7ku1pDLhzM","KASQ8Z4I1v","NOHsz6AFT0","lm0pD5Mg9r","zmLYDuN6r3",
+"8RCUAaDGtS","s93MlDcpWB","FFDuicQOnv","KsjRKn8pJ9","aDGtSZJTXH","WmadARxrsm","lsQGouJScX","2hEEUoVQp6","FPfSEs4786","2Yz7EuoStw",
+"YjB9tNOHsz","ZzJHWHlUbF","S2DfufcJOy","Chuy3DcpWB","W7cTsi3pyd","5nmWvtjQxs","CK5W77fKYU","aL6AJSWfou","uAWypIjTwP","7hyVviB08l",
+"CdyBV0Wr5y","QnJ1SGrDg7","29QAzF6PT2","lCMxybgJAz","CIShGNhXdu","0h1b1t59lR","4QMc9FLsph","HlUbFRpBQm","AIYUubrhlQ","y94nwvLsmS",
+"lsQGoGWqqX","fqypyDLhzM","FGzgpBFkb8","K20wKaez9y","bgJAztaOXK","HRxd8Q6hMC","9rlg9MaJQs","oVQp6GWqqX","cQOnvxciqp","VNCPdNo0Qb",
+"CdyBVOHaBz","EOE1oJRJQB","8FmFHDcpWB","vLsmSmz8gx","jfREuOxWIH","FhtglIRh48","JIqXiMK07Y","ThjNnaDGtS","6q6L9OxWIH","ogLgct98iW",
+"nlaByCIShG","DG4sTcmXIX","uJScXzY1GY","Mkgy8GrDg7","StlDJ9eoRc","RACujcQOnv","ulk41U3yw5","vLsmSCxVEf","64s8Nv1Hln","MmsIov1Hln",
+"zbIYY5nmWv","WreyPgIYvE","uAWypS77LH","EoToPOxWIH","NAFuw2Nslm","hi5X7Waim6","EOE1o5nmWv","lj07Q24ARF","VIlwPNAFuw","pT8wuvLsmS",
+"tAOsrFGzgp","S2DfulkMUA","0MR5XRBhp0","B3qemG1RhS","oGu6xMmKGJ","S77LHVerEA","xReec8cVD3","B3qemn8pJ9","dmoS7fmIK1","atef2VBjhz",
+"UlU3MWreyP","hi5X7DG4sT","Nxx9Vm4bxU","580YDjfREu","NcICA5iGN5","DcpWBHzZT8","cShY2cQOnv","hUTw7NOHsz","SbRYyWreyP","618DiTwano",
+"lViBvJKWYR","AkKTkaL6AJ","s93Mlh1zcH","SmGzvEdBKc","Nxx9Vatef2","JKWYRNhXdu","L7cGcCqqaD","EoToPhi5X7","suY4xuZPqg","cShY2dQ586",
+"BpYhVVprf2","uZPqgaL6AJ","5Drn0Mm8si","RBhp00Wr5y","O3iyQjfREu","9iGoTpvgjS","QbxXccShY2","ru4UGqaofN","B3qemiB08l","oGu6xdmoS7",
+"Mkgy8OUYuF","RsQUqY1mC0","lm0pD4W0Tl","5drc60PktI","ogLgcZuDtD","JkzUnzQt6Q","NcICA6q6L9","5nmWvn1pmO","FnPFBRmDcr","Cp3mZs93Ml",
+"hE1QlJkzUn","mz8gxuLtKs","14FLRdmoS7","jzUqRFPfSE","Nxx9VTXQ0Z","JKWYR4W0Tl","M3zXLBGaQY","yvOMIOUYuF","K4GS8x3LDe","DQimpMK07Y",
+"s4786tAOsr","ksJbyDcpWB","OxWIH7Ow5C","mz8gx5drc6","m4bxUatef2","m4bxUtlILt","7Ow5CWreyP","5iGN5aL6AJ","Uvlv4O3iyQ","HP4337Ow5C",
+"azIWpEdBKc","aFFssyToGW","nFqikguMb8","iqv4kprNT6","0h1b1tAOsr","7lUXZciuWz","QssNCZJTXH","zHF1q8RCUA","KsjRK8TxD7","lpF6WQ6hMC",
+"MezSWFcWrW","jS1ajG1RhS","CK5W7Cp3mZ","0PktIi7WMQ","bgJAzuJScX","iqv4krhl0J","Dz1R32ZHdk","HRxd8EoToP","zbIYYBpYhV","Dz1R3hUTw7",
+"mz8gxS2Dfu","X6PinGv3Fq","GXdoHdpe1v","tlILthSSvQ","0YAGHtl72W","16lHcmX2GE","5iGN5zz4ZU","3weIFRACuj","fcwDat59lR","6q6L9zFgtB",
+"piJSkFLsph","FGzgp14FLR","5iGN58hJdt","iB08lGXdoH","D6rByI7p2a","KASQ8uoStw","b29RJMmsIo","Yw2oUqQxHP","uoStw4W0Tl","lsQGoiKqhr",
+"VjCZqwDajX","KsjRKh1zcH","ReKEW7X3uy","8cVD3JkzUn","jiVBPaL6AJ","MmKGJSjskQ","ciuWzGXdoH","VIlwPxciqp","Chuy38hJdt","3weIFyvOMI",
+"v2eC3QChxs","6q6L9Pb1pa","9eoRcZhwG1","TXQ0ZBGaQY","Cfgr3Yw2oU","oQ87ruQIcz","t98iWNo0Qb","lXFOBCqqaD","yEfy9KZamH","7fsYM8U2nU",
+"okgRio8Uyd","X6Pinzz4ZU","5Mg9rFcWrW","he9IAFPfSE","d7vjMpmeCd","5Drn0UmaEv","jSjS3iqv4k","h1zcHQWxoT","O3iyQNo0Qb","2NslmAIYUu",
+"lCMxycShY2","zY1GYGWqqX","W7cTsG1RhS","BCxeCl83Ud","FjHXR8xEKz","BpYhV64s8N","0BmCybZLvS","Yw2oUvkCHH","29QAzBFkb8","uTacxPb1pa",
+"0Kyfs1v5hH","BbwgA5iGN5","jtn0X55rfB","JkzUnWreyP","Ss0ZuuJScX","48cHL0ao3l","9GXkXQClRL","M6qcGNcICA","n1pmOWmadA","uPX7Ghi5X7",
+"uJScXNo0Qb","FxX9quZPqg","pFrrlVLTy6","K4GS8580YD","gtCA5SmGzv","Kr8ysxReec","IKxdLuvf7A","tuDyS0Kyfs","brhlQTa8f6","TwanoVLTy6",
+"s4786RBhp0","RxrsmQChxs","KsjRKWaWsv","OHaBz2Yz7E","O3iyQa00b5","XflUqksJby","YjB9t9y4lw","AkKTklViBv","8RCUAxciqp","Q6hMCiKqhr",
+"uupzkOUYuF","uAWypC2Irc","uN6r3Yw2oU","nFqik5Mg9r","pT8wuCfgr3","tvdkD6q6L9","euZA5J2mQi","GXdoHatef2","FPfSE48cHL","VBjhz2Yz7E",
+"pFrrllj07Q","UlU3Mhe9IA","QbxXczmLYD","aFFss0BmCy","rKDLJJRJQB","blLA92ZHdk","hi5X7AgJHQ","9GXkXyofH3","cL0aEmz8gx","cShY2fmIK1",
+"FGzgpP6bcg","3otm624ARF","VBjhz5Mg9r","dpe1vLbRTH","x3LDe618Di","I7p2aO3iyQ","2ZHdkLDk6f","wiHrZ9y4lw","zQt6QQbxXc","s7Mxkv2eC3",
+"0Wr5yVLTy6","lweGy8RCUA","1j5L8MaJQs","b29RJDz1R3","Zv7z0Yf2Ec","vOqCEWaWsv","DcpWBDQimp","3weIFlkMUA","dQ586iB08l","XflUqsqVrf",
+"7fKYUt98iW","JJs5mgf8rI","qUJMdcShY2","NhXdu55rfB","GXdoHwiHrZ","i3pydm4bxU","55rfBBbwgA","zbIYYo8Uyd","U3yw5Y1mC0","blLA9dpe1v",
+"5drc664s8N","1v5hHdQ586","2DREsuAWyp","9y4lwFxX9q","cShY2oVQp6","x3LDewiHrZ","Mm8siBbwgA","MaJQsjzUqR","qUJMdTwano","7lUXZIRh48",
+"hYBCKqQxHP","nFqiklweGy","XyPZNtaOXK","MezSWY1mC0","o8UydNhXdu","M3zXLFnPFB","GXdoHdjsrv","OxWIHDcpWB","0YAGHeuZA5","3otm6Qworu",
+"7fsYMuoStw","hUTw7v2eC3","OUYuFWmadA","ZhwG1hSSvQ","yofH32hEEU","55rfBulk41","BCxeCGWqqX","7ku1pGrDg7","BGaQY7ku1p","BpYhV1j5L8",
+"0YAGHjeskS","QWxoTPb1pa","MojnPX6Pin","DQimpRzaZA","2DREs3weIF","UmaEvqaofN","gf8rIoQ87r","3weIFBFkb8","rhl0Jt59lR","oVQp6hYBCK",
+"jS1ajFNYIM","kZANmKASQ8","IjTwP2Nslm","O3iyQTa8f6","SWfourhl0J","dmoS7IBe8k","wDajXksJby","uJScXgjUTu","8TxD7jtn0X","M3zXLVjCZq",
+"IBe8k5drc6","1v5hHzHF1q","YjB9t0PktI","ksJbyQnJ1S","5drc6SmGzv","tjQxsUl4a1","14FLR24ARF","sx5GlMmKGJ","zbIYYfqypy","FcWrWn8pJ9",
+"DLhzMNcICA","HP433RkQke","FwEJz5Drn0","uoStwOUYuF","lpF6W5Mg9r","nlaByogLgc","TCgPpJIqXi","FLsph1j5L8","AXpwEpAhR1","nlaByyofH3",
+"azIWptaOXK","K20wKDz1R3","YjB9ttvdkD","brhlQlViBv","FGzgpiKqhr","QWxoTY1mC0","TCgPpOUqFM","oVQp6L7cGc","MGlTFFFDui","5iGN5ZuDtD",
+"uoStwd7vjM","ulk418RCUA","2Yz7EBGaQY","i3pydpvgjS","8RCUASs0Zu","vkCHHSs0Zu","dhSuHlpF6W","FGzgppT8wu","yToGWiB08l","RpBQm29QAz",
+"OxWIH7ku1p","FLsphaFFss","tvdkDFnPFB","jSjS3D6rBy","RmDcruN6r3","Ul4a1uN6r3","9y4lwBbwgA","14FLRydG8U","0KyfszQt6Q","IKxdLTCgPp",
+"jzUqRQssNC","D6rByfcwDa","AXpwE8RCUA","GWqqXt98iW","24ARFa00b5","2hEEUFxX9q","dQ586lweGy","FxX9qdjsrv","MK07YWMiS3","uPX7Gix74r",
+"lweGygf8rI","FwEJzMezSW","WMiS35drc6","ReKEW3otm6","KsjRKfLNg8","ciuWzK4GS8","In3NSHlUbF","4W0TlYh1hF","fLNg8OUqFM","dhSuHKsjRK",
+"uLtKsQbxXc","XyPZNwiHrZ","pFrrlt59lR","DcpWBzbIYY","9y4lwNo0Qb","pv0i7QnJ1S","BGaQYoGu6x","7fsYMciuWz","HP433VerEA","GWqqX0Kyfs",
+"yofH33otm6","CK5W7Vprf2","Twano9y4lw","yEfy9uN6r3","8RCUA5Drn0","WaWsvPOUYS","uJScXfcwDa","n8pJ9JJs5m","yvOMI9GXkX","FcWrWCqqaD",
+"CNHmvbrhlQ","2NslmP6bcg","RpBQmpT8wu","uvf7AHfyNQ","lj07QLbRTH","0YAGHpT8wu","2TRI7hSSvQ","2TRI7I7p2a","Uvlv4I7p2a","mz8gx1v5hH",
+"tuDySpAhR1","5VZjSCK5W7","OHaBzQChxs","n1pmOnlaBy","tuDyS9iGoT","BpYhVhi5X7","qUJMdVLTy6","UmaEvuupzk","618DiAIYUu","MezSWKZamH",
+"v8yFNazIWp","jeskSrz7Ut","X6PinbrhlQ","uJScXTwano","5iGN5NAFuw","0MR5XgtCA5","x3LDetjQxs","zY1GYNAFuw","jSjS3B3qem","RsQUqsuY4x",
+"ciuWzvLsmS","TCgPppv0i7","OUYuFVBjhz","yEfy9ix74r","pv0i7UmaEv","ksJbyVBjhz","FVMxoDG4sT","ZhwG1azIWp","Waim6WPmlx","8hJdtlXFOB",
+"tuDySguMb8","2NslmB3qem","QssNC2Yz7E","9y4lw2hEEU","CIShGGSQwj","AIYUuaDGtS","hE1Qlrz7Ut","7lUXZfLNg8","HRxd8QYxC0","HP433oGu6x",
+"jtn0XyofH3","zmLYDQ6Lix","FPfSEhUTw7","bgJAzkB5nP","zHF1qyofH3","xciqpFPfSE","QClRLaez9y","Gv3Fq14FLR","RBhp0taOXK","5Drn0lH1kt",
+"ZUnqtOUqFM","lpF6Wxciqp","ix74razIWp","n8pJ9Cp3mZ","atef2OxWIH","SjskQokgRi","GSQwj9XyT9","YOfrYOz8yZ","yEfy9StlDJ","WMiS30h1b1",
+"DLhzMOUqFM","29QAzQClRL","fqypysuY4x","HP433cQOnv","K4GS8MaJQs","qaofNdQ586","0BmCyzz4ZU","WmadAzz4ZU","WPmlxlH1kt","RzaZAuPX7G",
+"hSSvQpvgjS","jfREu07n1c","DcpWBciuWz","5nmWvyofH3","uAWypVLTy6","fqypyyToGW","Chuy3FPfSE","MGlTFaDGtS","vOqCE9rlg9","Zv7z0tAOsr",
+"pvgjSECMvU","Yf2EcjeskS","lH1ktU3yw5","bgJAz8xEKz","euZA58FmFH","QYxC0guMb8","Yw2oULewvM","tlILtFhtgl","FFDuiCIShG","JKWYRqQxHP",
+"IBe8kW7cTs","7X3uytvdkD","RkQkeuTacx","EoToP4W0Tl","Vprf2UmaEv","AgJHQyEfy9","07n1cHRxd8","nFqik2hEEU","ni2v1rz7Ut","DLhzMjtn0X",
+"J2mQipiJSk","7ku1poGu6x","gf8rI64s8N","euZA5zQt6Q","jS1aj5VZjS","lpF6Wd85a9","uoStwzY1GY","lkMUACK5W7","1LB1LblLA9","aL6AJoGu6x",
+"iwzGkuvf7A","5IhmGCK5W7","RsQUqUmaEv","gjUTud7vjM","2DREsTCgPp","NcICAHlUbF","cL0aE5iGN5","uAWyp7ku1p","fLNg8M6qcG","FhtglFPfSE",
+"fmIK1oQ87r","8U2nUoGu6x","WmadAFNYIM","3otm6jfREu","CdyBVjiVBP","ReKEWCxVEf","8TxD7rz7Ut","fLNg8ReKEW","GSQwjblLA9","XyPZN0Wr5y",
+"sx5GlOUYuF","MmsIoQssNC","5nmWvJ2mQi","FFDuiF6PT2","9iGoTpv0i7","kB5nPKsjRK","ni2v1ZJTXH","fcwDafmIK1","PYBf4VNCPd","zFgtB29QAz",
+"In3NSRmDcr","nlaByqUJMd","StlDJYw2oU","7hyVvFGzgp","lweGyRxrsm","t98iWjfREu","OHaBzcL0aE","LbRTHix74r","No0Qb9XyT9","7hyVvrhl0J",
+"AgJHQ5iGN5","4QMc9Yh1hF","ciuWz8cVD3","AIYUuv8yFN","CNHmv8U2nU","WMiS3xciqp","QnJ1SMmKGJ","gdQsSFPfSE","WreyPzHF1q","xciqpnFqik",
+"0h1b12DREs","AXpwEgjUTu","9y4lw6q6L9","lj07QoGu6x","EoToPK20wK","FVMxo9iGoT","bgJAz0MR5X","AmdQdMmsIo","POUYSv2eC3","QClRLnFqik",
+"gIYvENAFuw","VLTy6djsrv","nnP8osqVrf","pAhR1lXFOB","2TRI71j5L8","Cfgr32ZHdk","cmXIXwDajX","5Nammh1zcH","sx5GlzbIYY","pv0i7MGlTF",
+"CNHmv4QMc9","mX2GE6AFT0","Gv3FqRmDcr","RmDcr3otm6","C2Ircx3LDe","Zv7z0d85a9","5NammGXdoH","UmaEvaDGtS","FPfSESWfou","Mkgy8AkKTk",
+"hi5X7gIYvE","0PktIDQimp","lH1kty94nw","suY4xs93Ml","Mkgy8cQOnv","Chuy3pT8wu","dQ586gtCA5","J2mQizFgtB","Zv7z0uLtKs","GXdoHn1pmO",
+"XflUqtaOXK","RmDcruTacx","SjskQcShY2","Q6LixhYBCK","ni2v1FFDui","GSQwjIRh48","Gv3FqqQxHP","OHaBzOHaBz","pv0i7gjUTu","618Diuupzk",
+"QWxoTFNYIM","FGzgpFnPFB","OUqFMx3LDe","K4GS8uZPqg","PYBf4Qworu","lweGy9XyT9","k85AevOqCE","ydG8UAkKTk","14FLRtaOXK","0MR5XYw2oU",
+"atef2VIlwP","CNHmvt98iW","tlILtQChxs","5IhmGHzZT8","IRh48GXdoH","xciqpfaHir","RBhp0QChxs","t59lRwiHrZ","QbxXcIBe8k","ciuWzJIqXi",
+"VerEAokgRi","brhlQRACuj","CqqaDxciqp","VerEABGaQY","rKDLJogLgc","rKDLJAgJHQ","dmoS7pAhR1","fcwDaKZamH","euZA5Mm8si","Fhtglaez9y",
+"FGzgpIKxdL","VIlwPL7cGc","Y1mC0s7Mxk","7fKYUdmoS7","QbxXcWaim6","qQxHPIRh48","yvOMIb29RJ","pFrrlJIqXi","RBhp05drc6","jSjS3CNHmv",
+"fLNg8ulk41","RmDcrMm8si","DLhzMjeskS","nFqikqaofN","KZamHP6bcg","kB5nPZhwG1","MmsIosuY4x","Uvlv4FNYIM","5iGN5rKDLJ","ECMvUuvf7A",
+"zbIYYRBhp0","jS1ajNo0Qb","FhtglYOfrY","D6rByBGaQY","azIWpYh1hF","fLNg8nnP8o","KsjRKVjCZq","ix74rZv7z0","KASQ85Mg9r","VjCZqBCxeC",
+"0YAGH0h1b1","FGzgpCqqaD","tlILts93Ml","OxWIHuvf7A","iKqhrLewvM","RzaZAhe9IA","RACujTXQ0Z","jzUqRbZLvS","RxrsmUmaEv","v1HlnLbRTH",
+"YOfrYChuy3","8cVD3pAhR1","MezSWi7WMQ","azIWp5VZjS","lXFOBokgRi","YjB9t9GXkX","O3iyQ2Nslm","tuDyS3otm6","0YAGHMm8si","FGzgpb29RJ",
+"FNYIMFnPFB","64s8NDcpWB","zqH0WIn3NS","EOE1oYjB9t","Waim6yToGW","Kr8yssuY4x","ogLgcxXTI4","pvgjSuJScX","CqqaDtuDyS","hYBCKv8yFN",
+"he9IASs0Zu","P6bcgyEfy9","24ARFl83Ud","JJs5mYh1hF","No0QbmX2GE","2TRI7Zv7z0","RpBQm5ZaEz","sqVrfk85Ae","cShY2djsrv","U3yw5mz8gx",
+"tlILt7fKYU","FNYIMuAWyp","VerEA48cHL","OHaBzVprf2","55rfByvOMI","zFgtBe6e4z","P6bcgzmLYD","FLsphKr8ys","07n1cFcWrW","3weIFQClRL",
+"soy9tWmadA","QnJ1SsqVrf","uJScXydG8U","NAFuw0MR5X","HfyNQVNCPd","OUqFMAOgEe","WmadA5IhmG","W3VFHECMvU","mX2GEKZamH","0MR5XAOgEe",
+"FGzgp9eoRc","AgJHQ1j5L8","14FLR1v5hH","hi5X745cIH","i7WMQG1RhS","8xEKz580YD","ydG8UNcICA","2Yz7EFcWrW","lm0pDMmsIo","zY1GYCxVEf",
+"v1HlnGXdoH","XyPZNpiJSk","1LB1L14FLR","x3LDe6q6L9","QClRLOxWIH","6q6L9AOgEe","OHaBziB08l","5Drn0SjskQ","TwanoS77LH","6q6L9uoStw",
+"iKqhrBFkb8","ix74rYjB9t","dmoS7o8Uyd","d7vjMlsQGo","jtn0XCp3mZ","soy9tMkgy8","2ZHdktlILt","9XyT9VIlwP","6AFT0rhl0J","CdyBV1j5L8",
+"dmoS70Kyfs","gjUTuFFDui","v2eC3I7p2a","RxrsmhYBCK","v8yFN45cIH","yofH3uJScX","0h1b1Rxrsm","7ku1px3LDe","AIYUuGWqqX","s7Mxk6q6L9",
+"fmIK14dEz6","jeskS0PktI","MojnPyToGW","WmadAuQIcz","uPX7GlViBv","7fKYUCp3mZ","SbRYybZLvS","IjTwPfqypy","s7MxkQssNC","Pb1paVIlwP",
+"OUqFM8RCUA","tjQxs16lHc","rhl0JyEfy9","FwEJzcShY2","5iGN5SjskQ","5IhmGqaofN","oQ87rF6PT2","07n1c2TRI7","mX2GEVIlwP","55rfBStlDJ",
+"6q6L9AIYUu","0h1b107n1c","7X3uy5IhmG","cL0aEFGzgp","hUTw7yToGW","nlaByv1Hln","lm0pDQbxXc","MK07YNxx9V","xReeci3pyd","Vprf29XyT9",
+"SmGzvaL6AJ","NAFuwZzJHW","L7cGcUlU3M","cQOnv4dEz6","brhlQ2DREs","Cfgr3lpF6W","Yh1hFCxVEf","K20wKjS1aj","zmLYDFjHXR","HzZT8L7cGc",
+"GWqqXO3iyQ","guMb8jfREu","2DREsNxx9V","o8UydyToGW","WMiS3t59lR","ciuWzOUqFM","Nxx9VdQ586","Cp3mZCqqaD","Cfgr3kZANm","Kr8yscShY2",
+"0YAGHS2Dfu","FGzgp4dEz6","dpe1vIn3NS","zHF1qJIqXi","Z4I1vVLTy6","5VZjSs4786","sx5Glsoy9t","azIWpAOgEe","he9IAb29RJ","gjUTu2hEEU",
+"RkQkeRzaZA","MmKGJS77LH","S2Dfud85a9","X6Pins7Mxk","2DREsjiVBP","MmKGJfaHir","0ao3lKr8ys","3weIFAIYUu","ZzJHWi3pyd","J2mQisoy9t",
+"XyPZNMm8si","pmeCdgdQsS","Y1mC0JIqXi","7Ow5Ce6e4z","3weIFGSQwj","QbxXcYf2Ec","pFrrlSs0Zu","AOgEe07n1c","2hEEUlXFOB","yToGW5nmWv",
+"lkMUA5drc6","Mkgy8Q6Lix","0ao3llsQGo","16lHcjfREu","6AFT00Wr5y","KASQ8RpBQm","6AFT0zFgtB","FjHXR0ao3l","2TRI7BCxeC","StlDJ0YAGH",
+"CdyBVazIWp","JXljW6AFT0","gjUTuCK5W7","2Yz7ECfgr3","2TRI7ix74r","QssNCUl4a1","i3pydHRxd8","k85Ae5ZaEz","7ku1pv2eC3","0Kyfs8U2nU",
+"5IhmGs93Ml","HP433Mkgy8","uAWyp5iGN5","KASQ8a00b5","I7p2azz4ZU","7ku1pUl4a1","ksJbyK4GS8","cShY2EdBKc","zbIYYrhl0J","7X3uyl83Ud",
+"UlU3M5Mg9r","JIqXiJIqXi","M3zXLMaJQs","6AFT0i3pyd","FcWrWUl4a1","iB08ls4786","KASQ8Yf2Ec","okgRixReec","AOgEen8pJ9","8TxD71v5hH",
+"9eoRcWaWsv","2NslmguMb8","D6rBy8FmFH","ix74rgtCA5","n1pmOZUnqt","5VZjStl72W","nnP8oblLA9","Y1mC07fsYM","0BmCywiHrZ","fcwDahe9IA",
+"aL6AJni2v1","jfREuRmDcr","QClRLCxVEf","StlDJuQIcz","EdBKcSmGzv","QChxsv8yFN","7hyVv1j5L8","2NslmyluBx","MK07Yuupzk","jfREuFLsph",
+"hUTw755rfB","LDk6fFLsph","xXTI4QClRL","0YAGHhYBCK","ZuDtDMm8si","6AFT0VNCPd","Mkgy89iGoT","0BmCyUlU3M","b29RJv8yFN","oVQp6tvdkD",
+"EOE1ouJScX","16lHcQssNC","B3qemaez9y","MmsIoGXdoH","FxX9qjSjS3","wDajXyvOMI","8hJdtStlDJ","Nxx9Va00b5","S77LHSbRYy","D6rByUlU3M",
+"FPfSEfcJOy","45cIH9GXkX","guMb8IjTwP","618DiBFkb8","5VZjSoVQp6","e6e4zuTacx","2TRI7nlaBy","lCMxyRBhp0","5iGN5RACuj","cShY2hYBCK",
+"DG4sTi3pyd","5Drn00MR5X","lkMUAQChxs","CdyBVciuWz","GSQwjYh1hF","Y1mC00Wr5y","9GXkXF6PT2","M6qcGjSjS3","NcICAoVQp6","2hEEUprNT6",
+"iwzGkbZLvS","Kr8ysReKEW","FnPFBCK5W7","FwEJzKsjRK","5Mg9rlm0pD","EoToP16lHc","uvf7AHRxd8","S2DfuNcICA","EdBKcRACuj","FGzgp7ku1p",
+"ReKEWWmadA","dpe1vrz7Ut","0MR5XWreyP","HlUbFiqv4k","RBhp0zmLYD","dpe1vFnPFB","lj07Q5Mg9r","NcICAWaim6","Kr8ys5IhmG","jSjS3SbRYy",
+"JRJQBXflUq","OUqFMbgJAz","7Ow5CJKWYR","MojnPtuDyS","uvf7A4QMc9","k85Ae1j5L8","2TRI7bZLvS","mz8gxYw2oU","LewvMs4786","16lHchSSvQ",
+"MezSWSjskQ","Zv7z0azIWp","nFqikS77LH","okgRiuAWyp","suY4xcL0aE","CdyBVGXdoH","0Kyfsd85a9","SbRYyQClRL","0Wr5ylViBv","bZLvSWMiS3",
+"faHirAIYUu","FVMxouPX7G","WreyP9XyT9","BFkb8jtn0X","FVMxoaDGtS","zY1GYZuDtD","RkQkeM6qcG","bgJAz7fsYM","prNT6XflUq","HP433WMiS3",
+"JKWYRFFDui","o8Uydiqv4k","Dz1R3a00b5","CNHmv580YD","xXTI4JIqXi","8xEKzYf2Ec","zY1GYNxx9V","P6bcgOUYuF","580YDpmeCd","xXTI4uPX7G",
+"WMiS3IBe8k","3otm67Ow5C","tlILtBCxeC","nFqikl83Ud","NhXduMkgy8","okgRiAkKTk","LDk6f7hyVv","7lUXZCNHmv","580YDKZamH","8RCUAzY1GY",
+"vLsmScShY2","pWiOsS2Dfu","gdQsSzmLYD","dQ586soy9t","jeskSvkCHH","Mm8siLbRTH","pFrrlAOgEe","GSQwjCfgr3","FVMxoydG8U","kB5nPSs0Zu",
+"0PktIsqVrf","cShY2ZzJHW","tjQxsaFFss","iB08laL6AJ","jeskSOxWIH","yvOMIFVMxo","jtn0XnFqik","K4GS80h1b1","AIYUu7lUXZ","QClRLlViBv",
+"guMb8K20wK","8hJdt1LB1L","Cfgr3U3yw5","brhlQBFkb8","B3qemzHF1q","JkzUnEoToP","ru4UGLDk6f","ZhwG1RsQUq","fmIK1GWqqX","rKDLJFxX9q",
+"d7vjMBFkb8","euZA5Twano","QYxC0Qworu","yofH30PktI","AgJHQYjB9t","ni2v1gIYvE","ZJTXHprNT6","S77LHo8Uyd","In3NSaDGtS","JIqXiChuy3",
+"VNCPdRmDcr","lCMxy29QAz","OxWIHUl4a1","gtCA5QWxoT","7X3uyW3VFH","pAhR1FcWrW","lpF6Wa00b5","EOE1o8U2nU","yvOMICNHmv","dmoS7Ta8f6",
+"9y4lwsqVrf","blLA9W7cTs","QssNCGv3Fq","618DigtCA5","b29RJNo0Qb","iKqhrQ6hMC","S77LHlCMxy","suY4xAIYUu","JXljWBbwgA","DLhzMyluBx",
+"FFDui07n1c","YOfrYVBjhz","fqypybZLvS","bZLvSVjCZq","rhl0JjzUqR","s93MlHP433","14FLRx3LDe","VjCZq2DREs","RpBQm5VZjS","uupzksuY4x",
+"MezSW0ao3l","L7cGcs93Ml","Vprf2Q6Lix","W7cTsKZamH","618Di5ZaEz","uoStwAmdQd","7lUXZlH1kt","ZuDtDs93Ml","U3yw5k85Ae","l83UdHP433",
+"RmDcrIjTwP","NAFuwkZANm","5VZjSJkzUn","YjB9txXTI4","KASQ8i7WMQ","iB08lyToGW","NAFuw9rlg9","6q6L9uN6r3","FxX9qK20wK","5NammuAWyp",
+"HP4333otm6","M6qcG16lHc","L7cGcKsjRK","FNYIMhYBCK","s7MxkdhSuH","uQIczpmeCd","Zv7z0U3yw5","ix74rG1RhS","SbRYypAhR1","WDVWJni2v1",
+"VerEA7ku1p","lCMxy4W0Tl","KZamHVBjhz","cL0aElsQGo","07n1czY1GY","WMiS3sqVrf","Yh1hFkB5nP","QYxC0lViBv","oVQp6blLA9","XflUquupzk",
+"5iGN5dhSuH","0h1b1pvgjS","8cVD38RCUA","HRxd8In3NS","JRJQBciuWz","brhlQMm8si","NhXdu7Ow5C","tlILts7Mxk","rKDLJCIShG","Pb1payvOMI",
+"cQOnvK20wK","1LB1LtvdkD","Pb1pa6AFT0","6AFT01v5hH","EOE1o2ZHdk","DLhzMQssNC","HzZT8QssNC","LbRTHiwzGk","Oz8yZQworu","X6Pinl83Ud",
+"tAOsrCxVEf","MK07YSmGzv","KASQ807n1c","zHF1qWMiS3","9iGoTAgJHQ","TCgPpjS1aj","qQxHPI7p2a","5VZjS2ZHdk","FVMxoiB08l","45cIHtaOXK",
+"5Drn0t98iW","gdQsSvLsmS","G1RhSKr8ys","djsrv16lHc","ydG8U5drc6","8RCUAReKEW","hE1QlIn3NS","5ZaEzjzUqR","Waim6jS1aj","Gv3FqpWiOs",
+"dhSuHsx5Gl","lCMxyFjHXR","kB5nP9GXkX","LewvMyofH3","ZuDtD5ZaEz","uLtKs48cHL","GXdoHcShY2","lkMUAW7cTs","SjskQJIqXi","B3qemPb1pa",
+"TXQ0ZguMb8","ThjNnuLtKs","P6bcg1v5hH","brhlQgIYvE","fmIK1CqqaD","wiHrZtuDyS","wDajXNcICA","piJSkpv0i7","LDk6fVIlwP","4W0Tldjsrv",
+"BpYhVlm0pD","In3NS1v5hH","6q6L9pT8wu","2TRI7a00b5","dhSuHFwEJz","TCgPpCK5W7","J2mQivkCHH","Ul4a1aFFss","K4GS8aDGtS","580YDzQt6Q",
+"aL6AJ0Kyfs","n1pmOYOfrY","J2mQi8TxD7","PYBf4ZhwG1","RBhp0Yh1hF","lsQGogtCA5","HRxd85drc6","Mkgy8RsQUq","BpYhVB3qem","fFDrJyToGW",
+"nlaByCdyBV","WreyPguMb8","2hEEUdpe1v","8FmFHprNT6","KsjRKMmsIo","XyPZN9iGoT","AkKTk0MR5X","v8yFNMkgy8","piJSkogLgc","WaWsvYh1hF",
+"580YDTXQ0Z","aez9ydhSuH","FnPFBcQOnv","yofH3Waim6","7Ow5CQssNC","RkQkeTwano","hUTw76AFT0","rKDLJzz4ZU","fmIK12DREs","2Yz7ERpBQm",
+"Q6LixJXljW","gtCA57fsYM","3weIFd7vjM","Ul4a1D6rBy","9GXkXBFkb8","16lHc2TRI7","oQ87r0ao3l","07n1cgdQsS","azIWp55rfB","KZamHCp3mZ",
+"Q6LixgdQsS","Gv3Fq5Mg9r","lm0pDXflUq","6q6L9dQ586","rz7Utatef2","vLsmSoQ87r","EOE1oBFkb8","v1HlnW3VFH","iqv4kQ6Lix","BpYhVcShY2",
+"KsjRKyToGW","SjskQ16lHc","5IhmG7fKYU","OUqFMWreyP","4QMc9rKDLJ","NhXduciuWz","uoStwi3pyd","0YAGH64s8N","9y4lwJRJQB","DLhzMTa8f6",
+"4QMc9OHaBz","rz7UtVjCZq","J2mQi8xEKz","jzUqR4QMc9","CK5W7W7cTs","2Yz7EKr8ys","uPX7GguMb8","M6qcGzmLYD","VIlwPdjsrv","bgJAztAOsr",
+"TCgPp7lUXZ","5nmWviqv4k","UlU3MfLNg8","ZUnqtLDk6f","ZzJHWRzaZA","DQimpNo0Qb","k85AeHzZT8","v1HlnQssNC","ZzJHWix74r","FhtglblLA9",
+"29QAzfcwDa","G1RhSAkKTk","0ao3lDcpWB","RsQUqQssNC","MezSWHfyNQ","FnPFBFcWrW","uvf7AQnJ1S","RsQUqs7Mxk","MojnPdjsrv","0BmCyQbxXc",
+"W7cTsSbRYy","ru4UGfFDrJ","QbxXcAgJHQ","cQOnv0ao3l","blLA9nlaBy","LewvMKsjRK","pFrrl7lUXZ","nlaByeuZA5","DLhzMru4UG","7lUXZFNYIM",
+"v1HlnChuy3","aFFss7X3uy","qaofNYw2oU","zz4ZU1j5L8","uLtKsThjNn","ZJTXHM3zXL","FhtglXflUq","dQ586jiVBP","G1RhSJKWYR","prNT6VerEA",
+"MojnPlweGy","x3LDeyToGW","yofH3wDajX","8RCUAzFgtB","0h1b1TCgPp","okgRiIRh48","MojnPOHaBz","0Wr5ycL0aE","8TxD7t98iW","gIYvE7lUXZ",
+"faHirdhSuH","5ZaEzogLgc","8hJdtQssNC","WreyPBpYhV","O3iyQ9iGoT","okgRiQssNC","OUYuFhi5X7","CNHmvUvlv4","CqqaDRpBQm","HfyNQfLNg8",
+"7fKYUVLTy6","he9IATa8f6","VIlwPDz1R3","KZamHnlaBy","mX2GEMK07Y","QnJ1Sa00b5","2DREsguMb8","aFFsskZANm","fcwDaVprf2","HfyNQRBhp0",
+"5IhmG8RCUA","uPX7GJ2mQi","7fKYUuN6r3","FNYIMlCMxy","zmLYDpFrrl","soy9t1LB1L","hi5X7uN6r3","nnP8oZUnqt","JXljWjS1aj","8cVD3o8Uyd",
+"pv0i7ZzJHW","NhXdun1pmO","rhl0J5drc6","gtCA5Uvlv4","MmsIojS1aj","yEfy9BCxeC","ru4UG8cVD3","Dz1R3uupzk","AmdQdrz7Ut","FVMxon8pJ9",
+"OUqFMdhSuH","HlUbFOUqFM","taOXK07n1c","1v5hHDLhzM","Kr8ys1j5L8","GrDg7fcJOy","pv0i7VIlwP","5ZaEzn1pmO","0Kyfsdpe1v","brhlQuvf7A",
+"dhSuHix74r","8TxD7SjskQ","soy9tP6bcg","WreyP1j5L8","e6e4ztlILt","LewvMIKxdL","IjTwPpWiOs","tjQxsWDVWJ","JkzUnpmeCd","BGaQYVIlwP",
+"C2Irc7X3uy","zHF1qvLsmS","guMb8FxX9q","5ZaEzNAFuw","EoToPnFqik","Cp3mZVLTy6","VBjhz2Nslm","b29RJ0Wr5y","v1HlncmXIX","POUYShUTw7",
+"UlU3Mn1pmO","9y4lwHlUbF","QbxXcRzaZA","jfREuqQxHP","VLTy6Zv7z0","gjUTupvgjS","5Mg9rbZLvS","fcwDa8xEKz","dQ586bgJAz","pvgjStjQxs",
+"SjskQRpBQm","8RCUA0PktI","n1pmOzbIYY","kB5nP14FLR","7lUXZZuDtD","FjHXR5nmWv","wiHrZcL0aE","Yw2oUbrhlQ","FPfSEQ6Lix","LDk6fpT8wu",
+"prNT6ix74r","brhlQhe9IA","guMb8Q6Lix","9y4lws93Ml","yvOMIdQ586","5nmWv5nmWv","hi5X7gtCA5","RACujZhwG1","iqv4kSbRYy","FhtglFnPFB",
+"lViBvQbxXc","2hEEUo8Uyd","1j5L83otm6","YjB9tblLA9","k85AeuTacx","NAFuwB3qem","FVMxoJXljW","suY4xAXpwE","jfREulm0pD","D6rBy24ARF",
+"RpBQmVprf2","yEfy9QYxC0","BpYhVIn3NS","64s8N6q6L9","lH1ktpWiOs","fLNg8lj07Q","uN6r39iGoT","7fKYU5drc6","ciuWzdmoS7","n8pJ9X6Pin",
+"ZhwG1fcJOy","64s8NNo0Qb","ulk41JJs5m","HlUbF580YD","C2Irclj07Q","45cIH7fsYM","9eoRcgf8rI","SjskQAgJHQ","8RCUAB3qem","MGlTFfaHir",
+"TXQ0ZksJby","9rlg90PktI","M6qcGpvgjS","FFDuiHlUbF","n1pmOsx5Gl","JXljWAXpwE","WmadAaez9y","RxrsmyToGW","HlUbFhi5X7","B3qemDz1R3",
+"i7WMQHRxd8","t98iW0ao3l","K4GS8Q6Lix","uvf7AFFDui","F6PT2n8pJ9","FNYIMU3yw5","GrDg7FPfSE","BFkb8FNYIM","KASQ8FcWrW","JRJQB5VZjS",
+"2Yz7EDcpWB","suY4xuQIcz","CNHmvn1pmO","MmsIoS2Dfu","XyPZNK20wK","TXQ0ZCp3mZ","5nmWvTwano","IjTwPPOUYS","zY1GYcQOnv","FNYIMeuZA5",
+"EoToPCqqaD","k85AeDG4sT","0YAGH8xEKz","9y4lwKASQ8","GXdoHksJby","RmDcrDz1R3","5IhmGVBjhz","Y1mC0In3NS","uPX7G2hEEU","Oz8yZM3zXL",
+"MK07YhYBCK","oQ87rzFgtB","pWiOsmz8gx","hi5X7tvdkD","taOXKlsQGo","7hyVvazIWp","QssNCAXpwE","LewvMh1zcH","Mm8siQnJ1S","okgRibgJAz",
+"kB5nPfqypy","Oz8yZ0BmCy","gIYvEaL6AJ","XflUqG1RhS","ciuWzpWiOs","CxVEftvdkD","oVQp6dhSuH","ix74rOUqFM","Yw2oUokgRi","zbIYYqaofN",
+"CIShGaez9y","nnP8o7fsYM","07n1cl83Ud","1j5L8rKDLJ","xReecdpe1v","yluBxzqH0W","VerEA0h1b1","FxX9qL7cGc","ciuWzaDGtS","yToGWOz8yZ",
+"hSSvQzQt6Q","fLNg8cL0aE","Yw2oU9y4lw","ni2v1oQ87r","DQimp580YD","hi5X7CxVEf","iB08lv2eC3","n8pJ9gIYvE","ZJTXHi7WMQ","2Yz7ENo0Qb",
+"t98iWsqVrf","Cfgr3FcWrW","pT8wu16lHc","HRxd8X6Pin","DG4sTxReec","In3NSOUYuF","Y1mC07hyVv","BpYhV0h1b1","JXljWqUJMd","ReKEWNhXdu",
+"oQ87rBpYhV","prNT6pv0i7","Yh1hFkZANm","0PktI5VZjS","RmDcrmX2GE","hUTw79y4lw","FhtglwDajX","n8pJ9BCxeC","55rfBUlU3M","5nmWvXflUq",
+"0ao3lEoToP","yEfy9rKDLJ","lpF6Wt59lR","ZUnqt2TRI7","29QAzwiHrZ","J2mQi3otm6","0PktIW3VFH","CqqaDL7cGc","Z4I1v3weIF","0h1b1CdyBV",
+"WaWsvjtn0X","FFDuiQworu","qUJMduN6r3","MezSWguMb8","azIWpZv7z0","F6PT2e6e4z","5Mg9rlXFOB","hSSvQWaim6","4W0Tlb29RJ","OxWIHVerEA",
+"ciuWz0ao3l","WaWsv7X3uy","suY4xgjUTu","MezSWBbwgA","ogLgcFVMxo","Zv7z07Ow5C","d7vjMblLA9","24ARF16lHc","StlDJciuWz","9y4lwmz8gx",
+"faHiruLtKs","Cp3mZMojnP","EOE1oCdyBV","pWiOs7hyVv","ThjNnfaHir","MaJQsBFkb8","0YAGHNcICA","dQ586VLTy6","LDk6fD6rBy","QYxC0OUqFM",
+"lXFOBjiVBP","tAOsrJKWYR","W3VFHJRJQB","48cHLSmGzv","NAFuwCIShG","C2IrciwzGk","zqH0WEoToP","FnPFB3otm6","Qworud7vjM","9rlg9pAhR1",
+"CIShGJXljW","ogLgca00b5","SWfou8hJdt","RkQkeoGu6x","ix74rlpF6W","WMiS3i3pyd","nFqikMmKGJ","2ZHdkd85a9","L7cGcQChxs","ulk41DG4sT",
+"NOHszSmGzv","I7p2arKDLJ","JJs5mStlDJ","uPX7G7hyVv","xReec8xEKz","yofH3K4GS8","tvdkDpv0i7","9eoRcIKxdL","ThjNnVprf2","K20wKIjTwP",
+"QbxXcJJs5m","uTacx2TRI7","IjTwPyEfy9","XflUqdhSuH","faHirciuWz","8RCUABpYhV","0Wr5yZzJHW","pT8wuB3qem","9iGoTv1Hln","fcwDa07n1c",
+"9eoRc0ao3l","uQIczQbxXc","MmsIo5ZaEz","CNHmvIjTwP","sx5GlTwano","cL0aE6q6L9","Q6hMCyToGW","x3LDe6AFT0","zQt6Qpv0i7","uJScXVjCZq",
+"7fsYM5VZjS","Waim6AIYUu","07n1c3weIF","SWfouuPX7G","taOXK0h1b1","D6rBywDajX","HP433ZuDtD","he9IAlpF6W","0YAGHtlILt","tuDySIn3NS",
+"xReece6e4z","5IhmG5drc6","2NslmVprf2","qQxHPQChxs","lkMUAVBjhz","MojnPt98iW","6AFT0DcpWB","JXljWm4bxU","gIYvEVNCPd","atef20h1b1",
+"EOE1oqUJMd","5Mg9rDQimp","F6PT2RsQUq","iwzGkFhtgl","bgJAzv1Hln","Ta8f6oVQp6","lj07Q8TxD7","fLNg8U3yw5","EdBKcaez9y","U3yw58FmFH",
+"bgJAzpT8wu","DcpWBrhl0J","5Mg9rZhwG1","WmadAWreyP","rKDLJo8Uyd","7fKYUJkzUn","wiHrZQ6hMC","XflUqEOE1o","8cVD3blLA9","MGlTFIRh48",
+"xReecgdQsS","suY4xKsjRK","S77LHNxx9V","CK5W75Drn0","qaofNIKxdL","ru4UGuZPqg","oQ87rtaOXK","IKxdLThjNn","h1zcHCxVEf","5iGN5uPX7G",
+"UmaEvZuDtD","FLsphOUYuF","WDVWJ5ZaEz","FLsphaez9y","fmIK1Yf2Ec","NAFuwF6PT2","azIWp618Di","kZANmGXdoH","tl72WLewvM","QChxst98iW",
+"MojnPjeskS","PYBf48cVD3","24ARFRBhp0","RACuj7fsYM","VBjhzS2Dfu","QworupAhR1","i7WMQ7hyVv","MojnPhUTw7","FVMxosuY4x","qUJMdKr8ys",
+"W3VFHB3qem","FxX9qFVMxo","CqqaD8TxD7","AmdQdXflUq","tvdkDCxVEf","rhl0J8RCUA","RsQUqkZANm","C2IrcpiJSk","Qworu48cHL","X6PinS2Dfu",
+"sqVrfFPfSE","zY1GYxXTI4","Mm8siYh1hF","pvgjSv1Hln","7lUXZjzUqR","GWqqXyofH3","HP433K4GS8","8cVD3jfREu","8cVD3iKqhr","uAWypDz1R3",
+"jtn0XFVMxo","uZPqgydG8U","lsQGo0Kyfs","K4GS8pvgjS","azIWp64s8N","Twanosx5Gl","QssNCGXdoH","pvgjS55rfB","EoToPP6bcg","gdQsS2hEEU",
+"2TRI7SWfou","W3VFHSmGzv","he9IA618Di","lsQGopAhR1","5drc6nlaBy","pvgjSFLsph","RBhp0LewvM","CxVEfd85a9","JkzUn5VZjS","PYBf4Z4I1v",
+"CK5W7DcpWB","5IhmGb29RJ","CNHmv7Ow5C","MojnPMojnP","ZJTXH07n1c","hUTw7lweGy","i7WMQFNYIM","AkKTkmX2GE","WMiS3Yh1hF","FwEJzhE1Ql",
+"XflUqs7Mxk","7fKYUFwEJz","0Wr5yYf2Ec","zqH0W9XyT9","48cHLkZANm","FhtglOUYuF","Mkgy8kB5nP","GWqqX7fsYM","DG4sTL7cGc","BCxeCbrhlQ",
+"No0QbBGaQY","LDk6f618Di","MezSWRmDcr","t98iWUmaEv","uupzk0BmCy","FFDuiCdyBV","gdQsShYBCK","Mkgy8cmXIX","16lHcciuWz","suY4xX6Pin",
+"VNCPdyEfy9","QbxXcFhtgl","zbIYYiKqhr","azIWplViBv","hi5X7QssNC","kB5nPIjTwP","Dz1R3fcwDa","gf8rIPYBf4","No0QbIBe8k","IBe8kzbIYY",
+"4dEz6gdQsS","fcwDavOqCE","lm0pDQnJ1S","EoToPvOqCE","s4786SWfou","DG4sTlkMUA","5drc65Mg9r","PYBf4FLsph","FNYIMYh1hF","RpBQm9iGoT",
+"tuDyS6AFT0","7lUXZGWqqX","FcWrWYjB9t","Ss0Zuo8Uyd","5nmWv0h1b1","3weIFVNCPd","SbRYylViBv","QssNCvOqCE","CxVEfB3qem","lweGy45cIH",
+"VjCZquPX7G","0h1b1kB5nP","FxX9quTacx","iKqhrIRh48","RkQkepiJSk","JkzUngIYvE","8FmFHCp3mZ","oGu6xGWqqX","9rlg9LbRTH","GSQwjGSQwj",
+"IjTwPcL0aE","DQimp0Kyfs","pT8wuFhtgl","mz8gxHlUbF","RpBQm5drc6","W7cTs48cHL","s93Mlo8Uyd","AmdQdGWqqX","FxX9qFnPFB","zHF1qEoToP",
+"e6e4zoGu6x","9GXkXD6rBy","5drc6euZA5","ReKEW4W0Tl","Kr8ysdpe1v","aez9yb29RJ","b29RJcmXIX","uZPqgjfREu","t59lRTXQ0Z","ECMvUEoToP",
+"uZPqgfaHir","djsrvL7cGc","9y4lwMezSW","pv0i7uAWyp","jeskSKr8ys","4QMc9Yf2Ec","4dEz6Cfgr3","5NammBFkb8","0ao3l2Nslm","tl72W8cVD3",
+"uLtKstl72W","KZamHjtn0X","NOHszuJScX","Pb1paUlU3M","lj07QzbIYY","Nxx9VLewvM","i7WMQ2Nslm","i7WMQVprf2","9XyT9jtn0X","55rfBG1RhS",
+"TwanoK20wK","CdyBV5ZaEz","gjUTuSbRYy","I7p2aAgJHQ","KZamHYf2Ec","24ARFZzJHW","Rxrsms7Mxk","oGu6xBGaQY","uTacxvOqCE","zbIYYe6e4z",
+"9GXkXUmaEv","Q6hMC0PktI","WreyPVLTy6","2DREsUmaEv","iqv4kCdyBV","RACujru4UG","ReKEWKsjRK","Zv7z0ZuDtD","uoStwHP433","tAOsrnnP8o",
+"iwzGkTCgPp","I7p2aBGaQY","s93MlBFkb8","v8yFN8hJdt","QssNCiwzGk","zHF1q64s8N","oQ87rUlU3M","IKxdL2DREs","5ZaEzzFgtB","AkKTkpAhR1",
+"14FLRcShY2","QnJ1SiwzGk","7fsYMECMvU","QClRLxXTI4","KsjRKGrDg7","WPmlxW3VFH","YjB9tvLsmS","MmKGJReKEW","rKDLJFFDui","9y4lwrKDLJ",
+"WPmlx0h1b1","v1HlnOxWIH","1v5hHMkgy8","8U2nUBCxeC","yofH3zqH0W","QbxXc8xEKz","JIqXin8pJ9","uupzkB3qem","FxX9q0YAGH","EdBKcsoy9t",
+"BFkb8sqVrf","JIqXiXyPZN","MGlTFogLgc","KASQ8azIWp","Cp3mZRmDcr","DLhzMDcpWB","AOgEe2DREs","qUJMdY1mC0","CxVEfStlDJ","zHF1qOxWIH",
+"IRh48uoStw","9eoRcZ4I1v","Oz8yZzmLYD","1j5L8W3VFH","BGaQYqaofN","Nxx9VuAWyp","IRh48lkMUA","RxrsmguMb8","LewvMb29RJ","uAWypWDVWJ",
+"Ul4a1LbRTH","ZzJHWMm8si","OUqFMtaOXK","55rfBFNYIM","7Ow5C2hEEU","ZhwG17X3uy","cQOnv580YD","jfREuTCgPp","xReeccShY2","oVQp6s93Ml",
+"he9IA4dEz6","WDVWJeuZA5","VjCZqazIWp","gf8rIuN6r3","gtCA5zmLYD","n1pmOyEfy9","POUYSQnJ1S","faHirTa8f6","a00b5VerEA","GSQwjWreyP",
+"VLTy6ogLgc","FNYIMqaofN","dQ586ZhwG1","GWqqXd85a9","jfREu2TRI7","8xEKzxciqp","xXTI40h1b1","RkQkeHRxd8","ZuDtDhSSvQ","FVMxoCp3mZ",
+"tjQxsogLgc","4QMc9xXTI4","U3yw55Mg9r","hi5X7Y1mC0","YOfrYXyPZN","EoToPe6e4z","uoStwlkMUA","ix74rksJby","MaJQsFNYIM","d85a91v5hH",
+"gf8rIhSSvQ","0h1b1Pb1pa","ZhwG1fmIK1","Zv7z0lXFOB","NOHszyToGW","uLtKs1v5hH","9eoRcX6Pin","X6Pin2Yz7E","8TxD7CqqaD","Chuy3FwEJz",
+"uvf7A8xEKz","1LB1LIjTwP","hUTw7uPX7G","s93Ml5IhmG","7lUXZdpe1v","2ZHdkChuy3","6AFT04QMc9","X6PinM3zXL","6AFT0oGu6x","5Namm5Namm",
+"OUqFMgIYvE","ThjNnhE1Ql","yToGWogLgc","WMiS3S2Dfu","kB5nPvkCHH","Q6Lixmz8gx","0ao3lWreyP","580YDlXFOB","0ao3lWDVWJ","MGlTFgdQsS",
+"M6qcG8FmFH","VLTy6yluBx","GXdoHTXQ0Z","jS1ajMm8si","EOE1oDG4sT","3weIF0Wr5y","piJSkY1mC0","t98iWTwano","sqVrfsuY4x","JIqXi5Mg9r",
+"DG4sTQnJ1S","uZPqg5drc6","FPfSEAXpwE","wiHrZt98iW","qaofNBpYhV","0h1b1NOHsz","5NammRACuj","lXFOBQbxXc","uupzkKZamH","BGaQY2DREs",
+"S77LH6q6L9","lj07QCNHmv","uLtKsIjTwP","GrDg7nlaBy","QnJ1SPb1pa","AmdQdTXQ0Z","kB5nPVLTy6","G1RhSQssNC","ciuWzlCMxy","8FmFHAOgEe",
+"rKDLJFjHXR","FjHXR0Wr5y","Rxrsmn8pJ9","ECMvUpFrrl","tvdkDFjHXR","e6e4zIBe8k","Yw2oUyluBx","JKWYR7X3uy","Kr8ys2DREs","nnP8opvgjS",
+"O3iyQgtCA5","F6PT2CdyBV","WreyP2TRI7","guMb8iwzGk","8xEKzy94nw","7X3uyprNT6","he9IAfmIK1","ZJTXHDcpWB","Kr8ys9y4lw","ix74rFcWrW",
+"ZJTXH8cVD3","piJSklH1kt","2DREs0Wr5y","zHF1quQIcz","4QMc97hyVv","AOgEe4QMc9","VjCZqzQt6Q","8U2nU7hyVv","48cHLlViBv","dpe1vWDVWJ",
+"Nxx9VO3iyQ","okgRigtCA5","AkKTkzqH0W","RsQUqiwzGk","3otm6DLhzM","IKxdLqQxHP","jeskSXflUq","lCMxy5ZaEz","HP433djsrv","fcJOy5Namm",
+"AOgEeTa8f6","pv0i70ao3l","ZhwG1LDk6f","pmeCdXflUq","lViBvyofH3","jSjS30BmCy","JJs5mCqqaD","7ku1pW7cTs","48cHLdjsrv","qUJMdO3iyQ",
+"8cVD3RACuj","VIlwPtaOXK","DLhzMYOfrY","jeskSOUqFM","ThjNnKZamH","9eoRc5drc6","StlDJbgJAz","cmXIXNAFuw","LDk6f4W0Tl","KZamHM3zXL",
+"JKWYRJkzUn","Waim67hyVv","1v5hH9eoRc","M6qcGVBjhz","FwEJz7fsYM","aFFss1v5hH","C2IrcWreyP","NcICAAXpwE","C2IrcoGu6x","VerEAMmsIo",
+"X6PinwDajX","CxVEfni2v1","cL0aEyofH3","P6bcgx3LDe","lsQGociuWz","QClRLYh1hF","qaofNhYBCK","pAhR1HlUbF","C2Ircsoy9t","QworuRsQUq",
+"pAhR1aDGtS","RxrsmuTacx","RxrsmVBjhz","7fsYMzQt6Q","QnJ1S0h1b1","hE1QlQWxoT","W3VFHnnP8o","SjskQa00b5","cL0aEs4786","2DREs9rlg9",
+"lj07QogLgc","ix74r2TRI7","ix74rpAhR1","S2DfuUlU3M","VjCZqCNHmv","7lUXZOUYuF","GrDg7Yh1hF","In3NSwiHrZ","3otm6zbIYY","RpBQmIRh48",
+"NAFuwix74r","gIYvE0ao3l","I7p2a4W0Tl","yvOMIzmLYD","lm0pDfcJOy","AXpwEzQt6Q","FwEJz2hEEU","piJSkeuZA5","iwzGkC2Irc","nlaBytaOXK",
+"nFqikCIShG","Gv3FqUvlv4","oVQp6rKDLJ","1j5L8XyPZN","M3zXLZ4I1v","gtCA54QMc9","WMiS3s4786","8U2nUa00b5","0ao3ls7Mxk","Nxx9VHP433",
+"hi5X74dEz6","pv0i7580YD","h1zcH5Mg9r","guMb8jS1aj","n8pJ9kZANm","CIShG8FmFH","55rfBzmLYD","aL6AJO3iyQ","IBe8kQworu","VBjhzlCMxy",
+"EoToPlpF6W","Uvlv4uLtKs","DG4sTNAFuw","CIShGJRJQB","Uvlv4uupzk","GrDg7oQ87r","Kr8ysk85Ae","s7MxkGv3Fq","sqVrf14FLR","9GXkXzHF1q",
+"KASQ8fLNg8","gtCA5lj07Q","8U2nUQnJ1S","lsQGoQworu","UlU3MJRJQB","CNHmv4dEz6","FLsphM6qcG","oGu6xTXQ0Z","JRJQBFxX9q","HP433gjUTu",
+"1j5L8n8pJ9","vkCHHCqqaD","cShY2JKWYR","uPX7GiKqhr","7fsYMzqH0W","Chuy3pWiOs","2NslmuoStw","POUYSciuWz","F6PT2ZuDtD","fcJOyF6PT2",
+"oQ87raDGtS","s47866AFT0","O3iyQBCxeC","0YAGHQnJ1S","HzZT8KZamH","GSQwjAIYUu","blLA9EdBKc","mX2GE7hyVv","1LB1Ldjsrv","yvOMIlpF6W",
+"fcJOycQOnv","oGu6xJkzUn","CqqaDlCMxy","ydG8UVerEA","BGaQY1LB1L","dpe1v14FLR","iqv4kjSjS3","lCMxyRmDcr","I7p2aMkgy8","SbRYyazIWp",
+"tuDySjS1aj","HzZT8jtn0X","VerEAGSQwj","AgJHQaFFss","4dEz6ZuDtD","FNYIMjiVBP","FVMxoQssNC","zQt6Qru4UG","rhl0JuJScX","iqv4kCxVEf",
+"JRJQBhYBCK","6q6L9RpBQm","yluBxgtCA5","Mm8siksJby","uLtKsVIlwP","a00b5VjCZq","StlDJCK5W7","mz8gxvkCHH","VBjhzK20wK","IjTwPJIqXi",
+"ciuWzn1pmO","UlU3MfcwDa","CIShGl83Ud","m4bxUvLsmS","zqH0WdhSuH","WreyPMm8si","64s8NhSSvQ","FjHXRWMiS3","48cHLQChxs","KZamHjfREu",
+"0PktIZ4I1v","djsrvI7p2a","h1zcHYf2Ec","jtn0XtlILt","wDajXMmsIo","WPmlx0MR5X","zmLYDpmeCd","5drc6gIYvE","zqH0WlkMUA","MojnPTa8f6",
+"AIYUu64s8N","IRh48uN6r3","FNYIMiB08l","FwEJzFcWrW","gIYvEyluBx","dQ586MezSW","RBhp08xEKz","FxX9qRzaZA","VNCPdK4GS8","aez9yQClRL",
+"W3VFHlkMUA","rKDLJs4786","Q6hMCdmoS7","BFkb8suY4x","s7Mxk8TxD7","POUYSMK07Y","yEfy9X6Pin","64s8NQ6Lix","euZA5ZzJHW","xXTI4MojnP",
+"Chuy3WMiS3","Yw2oUpAhR1","VNCPd5Mg9r","GrDg7aDGtS","ECMvUQYxC0","Qworu0Kyfs","d85a9VBjhz","JKWYREdBKc","WPmlxPYBf4","kB5nP9eoRc",
+"Uvlv4v1Hln","sx5GlFFDui","n1pmOVLTy6","S2DfuBGaQY","CxVEfQClRL","Yh1hFDcpWB","LbRTHqaofN","hYBCKM3zXL","ZJTXHo8Uyd","gIYvEVjCZq",
+"tAOsrtvdkD","gdQsSuAWyp","TXQ0ZBpYhV","W7cTsLbRTH","1LB1LzQt6Q","RzaZA7fKYU","HP433ni2v1","29QAzMkgy8","24ARFuN6r3","lsQGovLsmS",
+"prNT6W3VFH","1j5L89rlg9","brhlQX6Pin","SmGzvuZPqg","Fhtgly94nw","XflUq55rfB","2NslmDLhzM","WPmlxNAFuw","Ss0ZuzQt6Q","lkMUAYh1hF",
+"Cfgr3AmdQd","RmDcrjeskS","mz8gxVprf2","M3zXLDG4sT","zY1GYCNHmv","Uvlv4lm0pD","5Drn0FjHXR","MaJQspvgjS","uPX7GThjNn","RmDcrUvlv4",
+"LDk6f7lUXZ","qUJMd9eoRc","8xEKz9iGoT","KZamHlj07Q","IjTwPciuWz","dmoS7kB5nP","gdQsSnFqik","rhl0Jdjsrv","DLhzM9y4lw","07n1cHfyNQ",
+"yluBxZhwG1","t98iWIBe8k","RzaZA7ku1p","ECMvUk85Ae","RzaZAQChxs","7Ow5CXyPZN","tl72WlweGy","ThjNnCxVEf","0MR5XJIqXi","AXpwEQChxs",
+"8xEKz8U2nU","9rlg9zbIYY","WMiS3RkQke","FhtglUmaEv","AIYUutaOXK","HP433WDVWJ","jS1ajzHF1q","9rlg9LDk6f","Cfgr3MojnP","B3qemWmadA",
+"J2mQiogLgc","QnJ1Szz4ZU","1v5hH618Di","14FLROxWIH","GXdoHgf8rI","EoToPYf2Ec","a00b5K20wK","B3qemFNYIM","pFrrl9rlg9","Yw2oUyvOMI",
+"ru4UG2Nslm","OUqFMni2v1","qUJMdMK07Y","SmGzvJXljW","TXQ0ZYOfrY","QssNC5IhmG","LbRTHS77LH","TXQ0ZMm8si","FVMxoKASQ8","iqv4kAIYUu",
+"s4786RkQke","i7WMQJRJQB","GXdoHDLhzM","jS1aj7fKYU","Waim68RCUA","NhXduHzZT8","BCxeCW7cTs","mX2GEydG8U","LDk6fyEfy9","CK5W7SWfou",
+"QWxoTK20wK","k85AeDz1R3","I7p2atl72W","jeskSuN6r3","QbxXc45cIH","AIYUus93Ml","5nmWvatef2","BpYhVbrhlQ","DcpWBAgJHQ","Oz8yZx3LDe",
+"aL6AJ48cHL","5nmWvL7cGc","9XyT9P6bcg","prNT6FjHXR","uLtKsMojnP","lj07QEdBKc","uN6r3oGu6x","8xEKzgIYvE","CxVEfJRJQB","XyPZNguMb8",
+"xciqpGv3Fq","Nxx9Vpv0i7","CqqaDrhl0J","Y1mC0M6qcG","wDajX9GXkX","GrDg7x3LDe","b29RJCqqaD","tAOsrlj07Q","djsrvMojnP","VIlwPo8Uyd",
+"Y1mC0GrDg7","Uvlv4aFFss","euZA55ZaEz","lXFOBru4UG","FPfSEUlU3M","ZUnqtQworu","ZUnqtRBhp0","uPX7GTCgPp","Yh1hF55rfB","yvOMI8FmFH",
+"5nmWvsqVrf","lXFOBJIqXi","7fKYUKr8ys","MGlTFHP433","jtn0XtvdkD","VjCZqatef2","uLtKsgtCA5","sqVrfQYxC0","DG4sTSs0Zu","qUJMdoGu6x",
+"F6PT2LewvM","Dz1R3Oz8yZ","jiVBPK20wK","FwEJzx3LDe","a00b52ZHdk","1j5L8lkMUA","Z4I1vEdBKc","o8UydKsjRK","55rfBhE1Ql","x3LDeBCxeC",
+"WPmlxsqVrf","m4bxUhUTw7","yofH314FLR","uZPqg64s8N","BFkb8Yh1hF","uAWypFxX9q","RkQkeWaim6","qUJMd7ku1p","5Drn0CK5W7","RmDcr2Yz7E",
+"C2IrcxReec","qaofNokgRi","QWxoTsx5Gl","MmsIoJJs5m","yluBxlH1kt","45cIHnnP8o","RBhp0qQxHP","faHirprNT6","lkMUAiKqhr","M6qcGgtCA5",
+"iqv4kix74r","jSjS3uQIcz","tuDySNAFuw","fmIK1B3qem","n8pJ907n1c","HP433fmIK1","In3NSnFqik","lkMUA5iGN5","xReec3otm6","HlUbFzqH0W",
+"ix74ruN6r3","G1RhS0YAGH","5IhmGsqVrf","M3zXL618Di","Ta8f6JIqXi","ZhwG1CxVEf","guMb8hE1Ql","uPX7GdmoS7","0h1b1ogLgc","fqypyNAFuw",
+"o8UydDLhzM","VLTy6uZPqg","soy9tMezSW","Mm8siQClRL","1v5hHW7cTs","GSQwjKASQ8","uTacx9XyT9","VBjhzZv7z0","EdBKc0BmCy","hSSvQgf8rI",
+"Yw2oUzY1GY","FhtglXyPZN","rhl0JW3VFH","yEfy9dmoS7","CNHmvs7Mxk","ydG8UFLsph","jiVBPt59lR","a00b5Mkgy8","tvdkDjfREu","ZuDtDFGzgp",
+"QbxXcpWiOs","0PktId85a9","piJSklm0pD","9eoRcfcwDa","Gv3Fq8xEKz","fcJOyJkzUn","aL6AJZzJHW","YOfrYmz8gx","ZuDtDNhXdu","GWqqXwiHrZ",
+"9rlg9tuDyS","Gv3FqQnJ1S","tvdkDO3iyQ","aL6AJWDVWJ","t59lRCxVEf","lweGyOxWIH","QClRL8TxD7","hi5X7Kr8ys","D6rByzY1GY","0PktIbrhlQ",
+"MGlTFMK07Y","ThjNnuoStw","LewvMdpe1v","ZJTXH16lHc","uTacxSmGzv","s4786uoStw","ciuWzTwano","GrDg7Chuy3","64s8NOUqFM","iB08lMmKGJ",
+"fmIK1OUqFM","lm0pDRmDcr","azIWpVerEA","lweGyGXdoH","t59lRNOHsz","Mm8siru4UG","S2DfujSjS3","AXpwECqqaD","Chuy3CxVEf","7fKYUbrhlQ",
+"lweGyD6rBy","7X3uy8cVD3","lViBvprNT6","2TRI7L7cGc","AOgEe0h1b1","pmeCdRzaZA","Ta8f6POUYS","TwanoLDk6f","S2DfugtCA5","pT8wuJXljW",
+"QworuhE1Ql","Yf2EcxReec","FPfSEFLsph","jeskSyvOMI","RBhp0pFrrl","xciqpoVQp6","okgRis4786","MezSWs93Ml","uAWypoGu6x","dpe1vFhtgl",
+"HP4332TRI7","AIYUuIjTwP","ulk419y4lw","GSQwjpT8wu","48cHLK4GS8","IRh48EOE1o","FcWrWnlaBy","HRxd80ao3l","0BmCyxciqp","faHiryvOMI",
+"JXljW0MR5X","M3zXLSbRYy","pFrrlIjTwP","xReec2ZHdk","yofH3POUYS","Dz1R3s93Ml","soy9tWreyP","tvdkDAmdQd","4QMc9Mm8si","vOqCEvLsmS",
+"8hJdttvdkD","mX2GElsQGo","AkKTkjiVBP","POUYSaFFss","oGu6xuvf7A","GWqqXWreyP","faHirzY1GY","okgRiciuWz","IBe8kQ6hMC","pvgjSlkMUA",
+"gjUTu5Mg9r","EOE1oMmKGJ","v1Hlne6e4z","Cp3mZQ6Lix","FNYIMTCgPp","cQOnvjzUqR","i3pydjtn0X","x3LDed7vjM","0Wr5yyEfy9","CK5W7hi5X7",
+"WmadAni2v1","pT8wuatef2","7fsYMaFFss","pmeCduZPqg","JXljW0PktI","Ta8f607n1c","BCxeClViBv","i3pydCIShG","ZUnqtHfyNQ","gjUTuQ6Lix",
+"QYxC0ogLgc","zFgtBThjNn","cmXIXRsQUq","hSSvQW3VFH","M3zXLVBjhz","1v5hHOUqFM","b29RJfcwDa","KsjRK0h1b1","1j5L8e6e4z","WaWsvzFgtB",
+"JkzUnMmsIo","MaJQsmX2GE","FwEJzlkMUA","FLsphzHF1q","HzZT8aL6AJ","nFqik55rfB","Yf2EcuTacx","ogLgcMmsIo","DQimpbrhlQ","6AFT0qUJMd",
+"tlILtyEfy9","jzUqRYf2Ec","cQOnvt98iW","i3pyd5ZaEz","7fsYMdhSuH","JkzUnIKxdL","MmsIoQ6hMC","JKWYRs4786","ulk41FwEJz","hE1QlB3qem",
+"ZhwG1yEfy9","5VZjSpv0i7","In3NSgjUTu","W7cTsHzZT8","CqqaDVLTy6","Q6hMCsuY4x","ZUnqtnFqik","nnP8oDG4sT","In3NSBFkb8","brhlQbrhlQ",
+"lm0pDt59lR","uTacxRxrsm","v8yFNyofH3","WreyPBGaQY","WDVWJ0YAGH","ECMvUqaofN","FhtglJIqXi","AIYUuYjB9t","jSjS3F6PT2","gdQsSMmsIo",
+"NAFuwFNYIM","dmoS7Dz1R3","EdBKc9XyT9","AOgEecShY2","jzUqRx3LDe","Kr8yspv0i7","nFqikVprf2","Cfgr3Rxrsm","I7p2aM6qcG","VerEA9iGoT",
+"Ss0Zu45cIH","qQxHPjSjS3","Gv3FqDcpWB","NAFuwIBe8k","a00b5RmDcr","StlDJpWiOs","NAFuwOHaBz","XflUqfFDrJ","5VZjS5Mg9r","tlILth1zcH",
+"2hEEUZv7z0","5ZaEz2Nslm","uAWyp8RCUA","WmadA8cVD3","Zv7z0QClRL","faHirvOqCE","UmaEv55rfB","v8yFNZhwG1","tAOsrbgJAz","lpF6WStlDJ",
+"iKqhrTwano","VLTy6ZJTXH","P6bcgn8pJ9","5IhmGX6Pin","jfREupFrrl","2NslmlsQGo","fFDrJStlDJ","Y1mC0DG4sT","uupzkzHF1q","ZUnqtC2Irc",
+"9XyT98FmFH","B3qemlCMxy","QworuRxrsm","uN6r3ix74r","G1RhSIBe8k","FGzgp9y4lw","VjCZqWaWsv","TXQ0ZiKqhr","4QMc92hEEU","Q6hMCCxVEf",
+"RmDcrB3qem","brhlQHfyNQ","M3zXLThjNn","0h1b1gdQsS","lpF6WoGu6x","FxX9quN6r3","cL0aERmDcr","faHirStlDJ","s4786JIqXi","qaofN5Mg9r",
+"QYxC09rlg9","FxX9qEoToP","tl72WlkMUA","ReKEWgtCA5","KASQ8kZANm","Q6hMCxReec","EdBKcMGlTF","s93MlfcwDa","M6qcG5nmWv","lCMxyDcpWB",
+"WmadATXQ0Z","AOgEehYBCK","S2Dfu7Ow5C","pWiOsqaofN","EOE1ouPX7G","yofH3yofH3","uPX7GjeskS","lkMUAfaHir","0KyfsbgJAz","uAWypGSQwj",
+"n8pJ9ZhwG1","fmIK1Chuy3","HfyNQWreyP","tvdkD8cVD3","WMiS3lViBv","Vprf2W7cTs","uLtKsgf8rI","v2eC3StlDJ","i7WMQSmGzv","GXdoHNxx9V",
+"G1RhSLDk6f","GXdoHCxVEf","CdyBVv2eC3","t98iWfqypy","FnPFBEoToP","jfREu6AFT0","s4786ix74r","8hJdtFcWrW","tAOsrrz7Ut","fqypypWiOs",
+"uAWypvkCHH","pmeCd8xEKz","45cIHNAFuw","YOfrYGrDg7","CNHmvlweGy","tuDySOxWIH","Cfgr3gf8rI","lsQGov1Hln","UlU3MHzZT8","W7cTs8hJdt",
+"RACuj1j5L8","9GXkXjzUqR","lm0pDBpYhV","BCxeCCfgr3","FhtglqaofN","16lHc0MR5X","FFDuiVNCPd","FVMxom4bxU","zQt6Qrhl0J","aDGtSqUJMd",
+"8hJdtyvOMI","fLNg8W7cTs","HfyNQYh1hF","Waim6dpe1v","s7MxkHfyNQ","GSQwjG1RhS","Q6hMCAOgEe","2Yz7E8hJdt","MojnP4W0Tl","AXpwEoQ87r",
+"tlILthe9IA","1j5L8yluBx","kB5nP7X3uy","5ZaEz7fsYM","OUqFMyEfy9","45cIH618Di","azIWpStlDJ","TCgPpzqH0W","nnP8oXyPZN","atef2fqypy",
+"GXdoH45cIH","K4GS8blLA9","pv0i7Q6hMC","uupzkHlUbF","lH1ktVNCPd","piJSkBGaQY","XyPZNWreyP","IKxdLVLTy6","gjUTua00b5","zQt6Q5Drn0",
+"dpe1vsqVrf","2DREsoGu6x","lXFOBYf2Ec","tvdkDuQIcz","dpe1vpiJSk","EoToPQnJ1S","VLTy6lpF6W","rz7Ut4W0Tl","n8pJ9Yf2Ec","5Nammx3LDe",
+"9eoRcS2Dfu","8FmFHSjskQ","cL0aEVIlwP","YOfrYG1RhS","tuDyShYBCK","FjHXR8RCUA","BpYhV7hyVv","GWqqXFhtgl","M6qcGFcWrW","Q6LixdhSuH",
+"O3iyQC2Irc","LDk6fChuy3","JkzUns93Ml","G1RhSQChxs","AXpwEIBe8k","jeskSChuy3","rhl0JBGaQY","VjCZqZuDtD","2DREs4W0Tl","5drc6QWxoT",
+"zz4ZUprNT6","1LB1Le6e4z","o8Uydv8yFN","GrDg7O3iyQ","FPfSEQYxC0","RxrsmI7p2a","8TxD7S77LH","WDVWJjS1aj","ni2v1Zv7z0","uPX7GQssNC",
+"vOqCEWPmlx","HP433uTacx","dhSuHjeskS","IBe8kzQt6Q","uAWypnnP8o","zqH0WkB5nP","9XyT9dhSuH","l83UdOHaBz","sqVrfciuWz","8RCUAxXTI4",
+"FcWrWhE1Ql","rhl0JLDk6f","CdyBVqaofN","Q6hMCAIYUu","K20wKK4GS8","y94nwdpe1v","Kr8ys0Kyfs","v2eC3OUYuF","i7WMQ0MR5X","7fKYUCxVEf",
+"FjHXRMK07Y","gIYvEVLTy6","FnPFB7ku1p","2Nslm0BmCy","LDk6fksJby","h1zcHjzUqR","JRJQBxciqp","fqypyIRh48","2Yz7Ev8yFN","8FmFHMGlTF",
+"5iGN5FxX9q","1v5hHOHaBz","2TRI7Nxx9V","8U2nUblLA9","uZPqgKZamH","FFDuiPOUYS","1LB1LGWqqX","29QAzFNYIM","kZANmGrDg7","zqH0WJkzUn",
+"lsQGo0YAGH","0MR5XpmeCd","Mkgy8gjUTu","D6rByFjHXR","FjHXR5iGN5","gf8rI45cIH","d85a9jeskS","X6PinZhwG1","LewvMWDVWJ","ThjNnYOfrY",
+"I7p2aYw2oU","07n1cYOfrY","Yf2Eclj07Q","0h1b18xEKz","AOgEelweGy","5Drn0hE1Ql","fFDrJJRJQB","X6PinHfyNQ","FGzgpjiVBP","MojnPI7p2a",
+"djsrvFnPFB","brhlQGSQwj","BCxeCG1RhS","0KyfsReKEW","Kr8yszqH0W","sx5GlzY1GY","hYBCKVLTy6","uPX7GxReec","0PktIuJScX","a00b5RACuj",
+"5IhmGW3VFH","2ZHdkpFrrl","ix74rjtn0X","0PktI7fKYU","gtCA5IRh48","HP4332hEEU","ru4UGzmLYD","OUYuF2TRI7","0KyfsMmsIo","he9IAX6Pin",
+"a00b5ciuWz","QworuUvlv4","9GXkXMK07Y","YjB9tKZamH","cQOnv2Nslm","uvf7AQYxC0","BGaQYS2Dfu","ZJTXHDz1R3","JJs5mMezSW","fFDrJoVQp6",
+"lpF6WXflUq","45cIHQworu","NhXduOUqFM","uLtKsZv7z0","C2IrcGv3Fq","jtn0Xfqypy","Yh1hFsx5Gl","DLhzMCfgr3","LbRTHPYBf4","uvf7A2TRI7",
+"8FmFHKASQ8","POUYS0Kyfs","Fhtgle6e4z","IjTwPQChxs","xReecNxx9V","No0Qbaez9y","FFDuiWaim6","24ARFvLsmS","F6PT26AFT0","tl72WoVQp6",
+"prNT6vkCHH","Yh1hFKASQ8","FxX9qQworu","i7WMQDcpWB","BpYhV5nmWv","UmaEvoVQp6","HRxd84dEz6","4QMc9s4786","aFFssAXpwE","pT8wud85a9",
+"8hJdtIn3NS","gdQsSgtCA5","8TxD7YOfrY","1v5hHPb1pa","FjHXRHfyNQ","AkKTktvdkD","oQ87rRACuj","Kr8yszFgtB","uLtKsNo0Qb","ZzJHWd85a9",
+"jtn0XogLgc","M3zXL9XyT9","7fKYUjfREu","pv0i7uZPqg","48cHL5Namm","uJScXpv0i7","RzaZAzQt6Q","MmsIoksJby","7lUXZM6qcG","KsjRKQ6hMC",
+"suY4xRzaZA","0MR5XfcJOy","JIqXiBGaQY","WMiS36AFT0","jSjS3FxX9q","NOHszQChxs","Cp3mZatef2","x3LDe2DREs","X6PinK4GS8","SjskQK20wK",
+"618DiogLgc","64s8NECMvU","bZLvSfcJOy","lj07Q7lUXZ","ydG8UFPfSE","5iGN5gdQsS","Pb1pauLtKs","hYBCKHzZT8","4W0TlzFgtB","pAhR1TCgPp",
+"cmXIX4QMc9","blLA9i3pyd","14FLRLDk6f","9XyT9vLsmS","7fKYUSbRYy","7fsYMoVQp6","Yw2oUgjUTu","14FLRzz4ZU","wDajXZzJHW","WaWsvcShY2",
+"HP433Zv7z0","BFkb864s8N","fLNg80YAGH","W7cTs0YAGH","3weIFI7p2a","Cp3mZRsQUq","cL0aE9eoRc","FNYIM7hyVv","QYxC0WDVWJ","zHF1qBFkb8",
+"KsjRKrhl0J","1LB1LoGu6x","taOXKM3zXL","FcWrWhUTw7","NAFuwdmoS7","RmDcrpT8wu","lCMxyNxx9V","TXQ0ZL7cGc","9rlg9cmXIX","yluBxaL6AJ",
+"LDk6fnnP8o","AgJHQZhwG1","pv0i7vLsmS","lj07QtlILt","lpF6W8hJdt","VNCPduN6r3","FPfSEYjB9t","GWqqXBpYhV","MGlTFtlILt","n8pJ9BGaQY",
+"yvOMIHfyNQ","lkMUAS77LH","qaofNQnJ1S","RmDcrpv0i7","7lUXZL7cGc","AmdQdNcICA","jzUqRTCgPp","BGaQYeuZA5","mX2GEyluBx","AgJHQCIShG",
+"HRxd8P6bcg","qaofNl83Ud","IBe8kTwano","1LB1Li7WMQ","4W0Tlv2eC3","618Di0YAGH","ReKEWtaOXK","faHirnlaBy","tlILtpFrrl","Mkgy8wiHrZ",
+"i7WMQzz4ZU","ix74rKr8ys","tuDySs7Mxk","fmIK1he9IA","tuDySAgJHQ","ogLgcaez9y","hi5X755rfB","Z4I1vv2eC3","zHF1qMojnP","Oz8yZ5IhmG",
+"fcwDalH1kt","OUYuFHzZT8","1v5hHyEfy9","oGu6xvkCHH","zmLYDo8Uyd","QYxC0wiHrZ","oQ87ryToGW","lj07Q0MR5X","x3LDeK4GS8","JJs5mQWxoT",
+"RkQkeazIWp","FwEJzvLsmS","CIShGwiHrZ","W7cTsQworu","2Nslmtl72W","i7WMQSs0Zu","aDGtSyluBx","CqqaDtlILt","ZuDtDI7p2a","fqypy6q6L9",
+"FPfSE2TRI7","U3yw5okgRi","DQimpJkzUn","FNYIMCIShG","MezSWuQIcz","8U2nUNOHsz","RBhp0soy9t","0h1b1piJSk","rKDLJaFFss","nnP8oCK5W7",
+"wDajX8RCUA","618DiOxWIH","WreyPi7WMQ","45cIHFxX9q","RpBQmMaJQs","pvgjSDG4sT","lpF6WQWxoT","In3NSAOgEe","uLtKstjQxs","MaJQs2hEEU",
+"WDVWJuN6r3","QnJ1Sb29RJ","Q6hMCzmLYD","zqH0Wv2eC3","aez9y7ku1p","FGzgpqUJMd","I7p2arz7Ut","ru4UGzY1GY","4W0TlBFkb8","2Yz7ERzaZA",
+"F6PT2vOqCE","o8UydLewvM","lH1kt1v5hH","X6PinuJScX","tuDySCK5W7","tjQxsBbwgA","CqqaDlsQGo","Vprf2AIYUu","uoStwyToGW","gtCA5CNHmv",
+"OUqFMtlILt","aDGtSX6Pin","taOXKRsQUq","Cp3mZXyPZN","he9IAQworu","aL6AJpT8wu","MmsIovkCHH","BGaQYyvOMI","FFDuiCxVEf","BpYhVYw2oU",
+"zQt6QXyPZN","U3yw5Zv7z0","BbwgArKDLJ","jiVBPBbwgA","ydG8URmDcr","AOgEeMaJQs","fmIK15Drn0","KZamH0MR5X","hSSvQjSjS3","lViBvtaOXK",
+"jiVBPeuZA5","xciqpVjCZq","7X3uyWaim6","TwanoUlU3M","0Wr5yECMvU","S2DfulXFOB","4W0TlFcWrW","uPX7GFnPFB","6AFT0fcJOy","ZJTXHDG4sT",
+"WMiS3HRxd8","vOqCE2hEEU","v1Hln2hEEU","aL6AJuZPqg","Chuy31v5hH","t59lRru4UG","CxVEfBFkb8","W7cTsx3LDe","Mkgy87lUXZ","gdQsS7hyVv",
+"XyPZNJJs5m","FGzgpcQOnv","oGu6xyToGW","WmadAbZLvS","8cVD3OHaBz","No0Qbd85a9","JIqXis93Ml","8xEKzMGlTF","JXljW9GXkX","tvdkDhi5X7",
+"9iGoTpmeCd","K4GS8jiVBP","Y1mC0Z4I1v","uQIczblLA9","RkQkeLDk6f","cmXIXK4GS8","gtCA52Nslm","IKxdLPYBf4","zFgtBWaim6","XyPZNCdyBV",
+"suY4xnlaBy","he9IAlweGy","uAWypxciqp","ni2v1fFDrJ","mX2GEe6e4z","tjQxsZJTXH","pWiOsru4UG","K20wKJJs5m","X6Pin14FLR","oQ87rtvdkD",
+"Ss0ZuCK5W7","lj07QK4GS8","VLTy6fqypy","ogLgc48cHL","VLTy61j5L8","pT8wuC2Irc","pmeCdYOfrY","3weIF5drc6","kZANmChuy3","ulk41G1RhS",
+"5nmWv0BmCy","55rfBi7WMQ","8cVD3VerEA","RkQkeLewvM","Kr8ysFPfSE","YjB9tcL0aE","0h1b1POUYS","uPX7GjiVBP","RmDcr0h1b1","BGaQYpvgjS",
+"kZANmwiHrZ","16lHcfqypy","oGu6xYf2Ec","hE1QlO3iyQ","HfyNQOxWIH","taOXKzbIYY","kZANmOHaBz","qQxHPVjCZq","xReec5IhmG","oGu6xfLNg8",
+"kB5nP7ku1p","CqqaDjSjS3","gtCA5n1pmO","uvf7AW7cTs","o8UydMmsIo","dQ586lj07Q","07n1cvOqCE","7X3uy29QAz","EoToP8TxD7","YjB9tMojnP",
+"3otm6bgJAz","VerEARkQke","lsQGojfREu","UmaEvRACuj","64s8NCp3mZ","qQxHPQYxC0","o8UyduAWyp","jiVBPQChxs","pWiOsQClRL","sqVrf2Yz7E",
+"rz7UtMaJQs","4QMc95Drn0","s7MxkVBjhz","0ao3lAOgEe","7ku1pydG8U","gdQsSlm0pD","n1pmOpvgjS","OxWIH580YD","cQOnvpv0i7","uoStwHlUbF",
+"rKDLJdmoS7","VBjhzrz7Ut","jSjS3ix74r","pAhR1QbxXc","blLA9iqv4k","FPfSEbrhlQ","MGlTFQClRL","M6qcGqaofN","MGlTF0YAGH","hUTw7EdBKc",
+"ix74ryToGW","oVQp6J2mQi","P6bcg7lUXZ","7fKYUqUJMd","fqypyiB08l","EOE1otaOXK","BGaQYy94nw","29QAzK20wK","Mkgy8FNYIM","cL0aEi3pyd",
+"EdBKcU3yw5","4QMc9AmdQd","1v5hHgjUTu","JJs5md7vjM","No0QbLbRTH","BFkb8CxVEf","5IhmGAkKTk","zbIYYpiJSk","ru4UG0YAGH","fqypy9GXkX",
+"16lHc6AFT0","lH1ktM6qcG","KsjRKMm8si","zz4ZURmDcr","a00b5tlILt","ZzJHW3weIF","CNHmvHP433","8cVD3BFkb8","RmDcrrhl0J","FPfSEsx5Gl",
+"d85a9CqqaD","P6bcgd85a9","HRxd8AkKTk","Zv7z0Yh1hF","VLTy6fLNg8","dpe1vGWqqX","o8UydFjHXR","ReKEWW7cTs","hYBCKECMvU","YOfrYXflUq",
+"oQ87rsqVrf","RmDcrzY1GY","M3zXL7Ow5C","FVMxolsQGo","1LB1L0h1b1","Mkgy85nmWv","aez9yguMb8","xReecblLA9","uTacxh1zcH","4dEz6M6qcG",
+"iwzGkHlUbF","zz4ZUCK5W7","GXdoHjzUqR","MmsIoOHaBz","tjQxsAOgEe","JRJQBMK07Y","ydG8USWfou","zQt6QJXljW","uLtKsIKxdL","VIlwP5VZjS",
+"jtn0XuPX7G","W7cTsBbwgA","pAhR1IjTwP","NcICAaDGtS","VBjhzHlUbF","h1zcHNAFuw","0Wr5yhUTw7","GSQwjokgRi","EOE1o2DREs","7fKYUIKxdL",
+"v8yFNtvdkD","l83UdBbwgA","0PktIChuy3","qaofNzQt6Q","MezSW2hEEU","aDGtSyEfy9","vkCHHOHaBz","YjB9t7ku1p","zQt6QhYBCK","W3VFHAkKTk",
+"e6e4zsoy9t","guMb8Z4I1v","Cfgr38RCUA","2hEEUW7cTs","t98iWUlU3M","RBhp0i7WMQ","WmadAtaOXK","KZamHRpBQm","UmaEv7hyVv","CdyBVSWfou",
+"1LB1Ll83Ud","In3NSlViBv","nlaBy8TxD7","kB5nPzY1GY","uQIczyEfy9","1v5hHo8Uyd","ReKEW0YAGH","s93MlYh1hF","9GXkXgf8rI","piJSkuJScX",
+"vLsmSpvgjS","dQ586SmGzv","zz4ZUuPX7G","lViBvIjTwP","2Nslm9XyT9","7lUXZ2ZHdk","MojnPAXpwE","t59lRlkMUA","14FLRHRxd8","jSjS3atef2",
+"d85a9kB5nP","RzaZAU3yw5","zFgtBX6Pin","8cVD3b29RJ","b29RJIn3NS","bZLvS0YAGH","6q6L9ydG8U","dhSuH4W0Tl","bgJAzQChxs","VerEAAmdQd",
+"yvOMIsqVrf","Uvlv4JXljW","2NslmiB08l","aez9yksJby","zFgtBEdBKc","9XyT95Drn0","JRJQBFhtgl","7hyVvVIlwP","AmdQdThjNn","MmsIodjsrv",
+"QClRLpvgjS","hUTw7vkCHH","In3NSgdQsS","X6PiniwzGk","XyPZNWaim6","5VZjSZUnqt","X6PinYOfrY","JKWYRJKWYR","AIYUuOUYuF","5Drn0ciuWz",
+"1LB1LDG4sT","9XyT9gIYvE","ReKEWFPfSE","7fsYMTCgPp","v8yFNECMvU","Q6Lix29QAz","iKqhrpFrrl","mX2GEOz8yZ","M3zXLlj07Q","WaWsvYOfrY",
+"qQxHPMm8si","tl72WiwzGk","K20wKAXpwE","55rfBSbRYy","KZamHgjUTu","JIqXiSjskQ","4W0TlRACuj","8xEKzyluBx","cShY2yofH3","FxX9qlXFOB",
+"VerEAzHF1q","8U2nUMmKGJ","faHirFjHXR","29QAzKr8ys","RzaZA4QMc9","0Kyfs9XyT9","BbwgACIShG","2ZHdkJJs5m","pWiOsMojnP","jzUqRHzZT8",
+"AXpwEUmaEv","BGaQYWPmlx","sx5GlUlU3M","y94nwaL6AJ","iB08lzQt6Q","ni2v1GWqqX","ciuWzeuZA5","LewvMYOfrY","s93MlqQxHP","RACuj3otm6",
+"W3VFHCp3mZ","rhl0Jm4bxU","fmIK1F6PT2","ix74rWaim6","MojnPLewvM","LbRTHFxX9q","Waim6nnP8o","gjUTuokgRi","lkMUA0PktI","0Wr5ygIYvE",
+"FwEJzB3qem","7Ow5CUvlv4","MmKGJlViBv","Rxrsm64s8N","FjHXR7X3uy","WDVWJsx5Gl","pWiOsn1pmO","i3pydtaOXK","Ss0ZuGXdoH","S77LHL7cGc",
+"JRJQB14FLR","brhlQ24ARF","OUqFMRsQUq","oQ87rcmXIX","OHaBz55rfB","NAFuwxXTI4","UmaEvsoy9t","ZuDtDBCxeC","v8yFN55rfB","OxWIHCdyBV",
+"yEfy9zFgtB","hYBCKpmeCd","cShY26AFT0","uN6r3lsQGo","FcWrWQChxs","LewvM5Mg9r","VjCZqVerEA","LDk6fbZLvS","qUJMd9y4lw","C2IrcYOfrY",
+"K4GS8FVMxo","aFFss5Drn0","oQ87rciuWz","8xEKzlViBv","JJs5mDz1R3","SWfouFjHXR","rKDLJQssNC","b29RJ1j5L8","RxrsmmX2GE","9rlg9taOXK",
+"1v5hHSmGzv","x3LDeTa8f6","KsjRKIBe8k","v1HlnwDajX","fFDrJuAWyp","ZuDtD24ARF","cShY2lViBv","Zv7z00h1b1","hYBCKDcpWB","yofH3W3VFH",
+"CIShG5Namm","a00b5FjHXR","rhl0JBbwgA","RkQkeJ2mQi","YjB9tIBe8k","KZamHh1zcH","uvf7ACxVEf","0PktIYOfrY","FFDui2Nslm","gtCA5DcpWB",
+"GSQwjfFDrJ","i3pydQ6hMC","JKWYRAIYUu","5VZjSMkgy8","VLTy6uoStw","lH1ktuvf7A","pv0i7CqqaD","tvdkDOz8yZ","rhl0JlsQGo","djsrvJJs5m",
+"4QMc98U2nU","PYBf4ZuDtD","uupzk07n1c","gjUTuzHF1q","yToGWzqH0W","tAOsrt98iW","07n1c9GXkX","QworujS1aj","0YAGH2Yz7E","8FmFHJKWYR",
+"8RCUAksJby","soy9t1j5L8","qUJMdFjHXR","Mkgy84W0Tl","HP433OUYuF","2TRI7yEfy9","rKDLJUvlv4","lj07QLewvM","B3qemBCxeC","5Nammiqv4k",
+"qaofNXflUq","JKWYR0ao3l","v2eC3FLsph","IRh48FFDui","fqypyeuZA5","GrDg72Nslm","P6bcgl83Ud","n1pmOIBe8k","oQ87rUvlv4","sx5GlGXdoH",
+"okgRim4bxU","k85Ae9XyT9","aez9yThjNn","nlaByCfgr3","yluBxn1pmO","2TRI7AXpwE","VNCPdNOHsz","2DREs580YD","Fhtgl9y4lw","XyPZNWMiS3",
+"XflUq1LB1L","mz8gxNxx9V","jtn0XRmDcr","No0Qbuupzk","zmLYDFwEJz","ZzJHW45cIH","KZamH1v5hH","jSjS3uZPqg","Kr8ysdQ586","hE1QlZv7z0",
+"0PktI4dEz6","djsrvWreyP","0BmCyFwEJz","BCxeCNhXdu","ThjNn8cVD3","IKxdLSjskQ","VIlwPpmeCd","AgJHQjtn0X","OxWIHIRh48","Waim6lweGy",
+"uoStwCqqaD","CNHmvtl72W","NAFuwfaHir","pAhR1S77LH","iqv4k7lUXZ","jtn0Xm4bxU","55rfB618Di","RkQkejzUqR","VjCZqOxWIH","gIYvEUvlv4",
+"QssNCzmLYD","8FmFHnnP8o","2Yz7E0PktI","CdyBVvLsmS","WDVWJnlaBy","FnPFBl83Ud","ogLgczqH0W","9rlg9580YD","CqqaDfqypy","cShY2AmdQd",
+"WPmlxIjTwP","580YDCqqaD","s4786YOfrY","zbIYYDG4sT","n8pJ93otm6","zHF1qatef2","J2mQihE1Ql","JkzUn8TxD7","t59lRcmXIX","uupzk8U2nU",
+"sqVrfgtCA5","fFDrJlCMxy","JJs5mBpYhV","FnPFBAOgEe","0h1b1s7Mxk","tvdkDQnJ1S","Yf2EcNAFuw","BpYhVjfREu","ZzJHWpv0i7","IRh48QWxoT",
+"618DiZv7z0","jS1ajMmKGJ","8U2nURACuj","tl72WCqqaD","zbIYYaDGtS","CK5W7WaWsv","gdQsSpT8wu","Yf2EcLewvM","QChxsJIqXi","HzZT8C2Irc",
+"lsQGoAkKTk","x3LDe5ZaEz","vOqCEAkKTk","i3pydIjTwP","pFrrl1LB1L","VBjhzjzUqR","WmadAKASQ8","24ARFCxVEf","bgJAzZuDtD","aez9yulk41",
+"580YDuoStw","LewvMgf8rI","QWxoTuN6r3","dQ586618Di","DG4sTDz1R3","FGzgpSmGzv","X6Pin9rlg9","K20wKZzJHW","SbRYySmGzv","wiHrZECMvU",
+"suY4xxReec","JIqXi0YAGH","7fKYUFLsph","lweGyvOqCE","OHaBzSmGzv","9GXkXhi5X7","QChxsQWxoT","Pb1pah1zcH","fqypyydG8U","KZamHm4bxU",
+"pFrrlzmLYD","DcpWBJKWYR","B3qem07n1c","ix74rNo0Qb","pAhR1m4bxU","Y1mC0M3zXL","Mm8sijfREu","sx5Glt59lR","fcwDah1zcH","Qworulm0pD",
+"lXFOBpiJSk","LDk6fPOUYS","Q6Lix0PktI","MK07YuJScX","FcWrWiwzGk","pFrrlRzaZA","M3zXLQssNC","0Wr5y2DREs","uPX7Gpv0i7","vkCHHsx5Gl",
+"MGlTFqQxHP","bZLvSBCxeC","ni2v1MmKGJ","QnJ1S5nmWv","ZUnqtuoStw","uJScX2Yz7E","AIYUuGrDg7","GXdoHlweGy","7hyVv3otm6","dmoS7fFDrJ",
+"GSQwjMojnP","cShY2o8Uyd","WmadAguMb8","4W0Tl8hJdt","n1pmO8U2nU","C2IrclCMxy","QWxoTCdyBV","ciuWzMGlTF","Mkgy8TCgPp","vLsmSsoy9t",
+"6q6L9aez9y","QbxXcFFDui","BFkb8vkCHH","uoStwfmIK1","uLtKs8cVD3","POUYSdmoS7","lsQGoSbRYy","jSjS329QAz","gtCA5kZANm","SjskQyluBx",
+"uZPqgSWfou","HRxd8VIlwP","sqVrflCMxy","Mkgy88FmFH","WmadAnnP8o","iKqhrRBhp0","8xEKzgtCA5","RpBQmdmoS7","aL6AJ6AFT0","uupzkgdQsS",
+"lj07QaL6AJ","VjCZqNhXdu","GrDg7dpe1v","RACujBCxeC","rz7UtOxWIH","2Yz7E0BmCy","dpe1vB3qem","gjUTu6q6L9","WDVWJWMiS3","DQimpm4bxU",
+"45cIH5iGN5","Chuy3aez9y","4W0Tl55rfB","55rfB45cIH","U3yw5jSjS3","BFkb85IhmG","yToGWPb1pa","zFgtBSWfou","YjB9thSSvQ","fFDrJnFqik",
+"1j5L8FnPFB","atef2fLNg8","v2eC34QMc9","xReeclkMUA","soy9tLbRTH","ZJTXHvLsmS","OUYuFCxVEf","XyPZNTXQ0Z","CdyBVMkgy8","JJs5mTXQ0Z",
+"lj07QfcJOy","fcJOycmXIX","QssNCgIYvE","a00b5CNHmv","VIlwPNOHsz","cL0aEChuy3","uAWyptjQxs","RBhp0nlaBy","M6qcGWreyP","7fsYMzmLYD",
+"WMiS3Zv7z0","d85a9tl72W","5Namm9GXkX","EdBKcfmIK1","EoToPuTacx","AXpwE8hJdt","UmaEviB08l","P6bcgD6rBy","9rlg9AXpwE","djsrvZJTXH",
+"AmdQdm4bxU","RsQUqk85Ae","lj07Q5VZjS","zHF1qHfyNQ","cL0aE5nmWv","FnPFBUvlv4","PYBf4lViBv","9GXkXulk41","nFqikGXdoH","lm0pDjiVBP",
+"IRh48yEfy9","MGlTFulk41","hE1QlnFqik","B3qemKr8ys","jfREuydG8U","9rlg9uLtKs","3otm65ZaEz","fcJOy5ZaEz","uPX7GHfyNQ","y94nw5Namm",
+"14FLRhE1Ql","ni2v1CxVEf","n8pJ9DcpWB","ZUnqtlm0pD","dmoS77Ow5C","qaofNzqH0W","D6rBycShY2","POUYSYh1hF","jiVBPydG8U","4dEz6JkzUn",
+"uoStwCfgr3","16lHcNxx9V","5iGN5ru4UG","QssNCTXQ0Z","KZamHS77LH","GXdoHaez9y","NOHszZ4I1v","JXljWMK07Y","JJs5mZzJHW","XyPZNSmGzv",
+"azIWpFNYIM","AgJHQcShY2","azIWprz7Ut","KASQ8Oz8yZ","FFDuinFqik","WMiS3Uvlv4","lkMUAAgJHQ","bgJAzRzaZA","hE1QlNcICA","Yw2oUuLtKs",
+"sx5Gl0Wr5y","uZPqg2Nslm","HlUbFFGzgp","POUYSYjB9t","zY1GYZJTXH","M3zXLDcpWB","VerEA9XyT9","0Wr5ylH1kt","jtn0XRxrsm","hSSvQ7fKYU",
+"8xEKzRkQke","CdyBVEoToP","gf8rIt59lR","9XyT9ru4UG","G1RhSqaofN","PYBf4VBjhz","zmLYDJJs5m","lweGye6e4z","qUJMdQ6Lix","qaofNJ2mQi",
+"L7cGcxXTI4","Mkgy8CdyBV","aFFsscQOnv","v2eC3ulk41","x3LDeFLsph","t98iW6AFT0","TXQ0Z55rfB","MojnP8hJdt","RBhp0No0Qb","WaWsvprNT6",
+"1v5hHWMiS3","OxWIHlsQGo","jeskSfFDrJ","QworuFLsph","24ARFQssNC","TCgPpPYBf4","tAOsr8U2nU","Gv3FqcShY2","HP433v1Hln","uPX7GvOqCE",
+"brhlQx3LDe","5ZaEzqUJMd","l83UdoVQp6","CqqaDk85Ae","9rlg9GXdoH","07n1cAmdQd","NOHsz55rfB","8U2nUDz1R3","7Ow5CNOHsz","BGaQYLbRTH",
+"S2DfuEdBKc","618DiksJby","v8yFNpAhR1","S2DfuAkKTk","Chuy3BFkb8","7fKYU8FmFH","xReecTwano","NcICAqUJMd","dhSuHReKEW","LDk6fqUJMd",
+"L7cGcJRJQB","MmsIo2ZHdk","lH1ktKsjRK","StlDJCqqaD","uN6r3yofH3","9rlg9s7Mxk","KZamHix74r","azIWpsoy9t","OUYuFazIWp","fFDrJi3pyd",
+"Uvlv40Wr5y","BFkb81v5hH","xReecyToGW","9iGoT0BmCy","DQimptAOsr","mX2GEtaOXK","zHF1qPb1pa","Ta8f6MezSW","ZzJHWRACuj","e6e4zbZLvS",
+"iwzGksx5Gl","5Mg9rgf8rI","qUJMdYh1hF","bgJAzrKDLJ","zY1GY5ZaEz","uPX7GrKDLJ","6q6L9SWfou","9eoRcJKWYR","2hEEUjfREu","Oz8yZhYBCK",
+"JRJQBSbRYy","n8pJ9cmXIX","yofH3618Di","uoStw6AFT0","RxrsmJIqXi","POUYS6AFT0","blLA9AIYUu","iqv4kokgRi","bgJAzM3zXL","Dz1R3SjskQ",
+"fqypyCK5W7","i7WMQ64s8N","580YDDG4sT","SWfousx5Gl","piJSkHfyNQ","VBjhzsqVrf","HlUbFIn3NS","LbRTHn8pJ9","t59lRBbwgA","Chuy3AmdQd",
+"soy9tlViBv","AOgEeQ6Lix","LbRTHX6Pin","uvf7AlCMxy","Vprf2dhSuH","RACujVprf2","NhXduhSSvQ","QbxXcogLgc","dQ5868FmFH","soy9tpvgjS",
+"8cVD3kZANm","5ZaEz5VZjS","SmGzvJIqXi","CNHmvX6Pin","0Kyfs580YD","zFgtBx3LDe","n1pmOblLA9","azIWp2Yz7E","sx5GliKqhr","X6PinaL6AJ",
+"AmdQd2hEEU","JKWYRogLgc","uvf7Atl72W","QssNCQssNC","StlDJx3LDe","ydG8UlsQGo","F6PT2rKDLJ","aDGtSDcpWB","14FLRSs0Zu","K20wKC2Irc",
+"CNHmvlCMxy","qUJMdtjQxs","cmXIXJIqXi","8RCUAs93Ml","Yf2EcsqVrf","TCgPpyEfy9","xciqp580YD","DG4sTv8yFN","WDVWJhi5X7","s93MlFPfSE",
+"jiVBPyluBx","UmaEv0Wr5y","gjUTuOHaBz","wDajXUl4a1","FFDuiZhwG1","LbRTHJ2mQi","8RCUAhSSvQ","VjCZqRxrsm","VerEA0YAGH","zbIYYAkKTk",
+"rhl0JCIShG","ksJbyEoToP","WPmlxcShY2","BpYhVReKEW","uZPqgogLgc","aDGtSfLNg8","Yh1hFFnPFB","gf8rIuvf7A","pmeCdMezSW","DLhzMzbIYY",
+"taOXKiB08l","DQimpt59lR","L7cGcnlaBy","dQ586pWiOs","7lUXZ14FLR","guMb8U3yw5","GWqqXUl4a1","uPX7GECMvU","MmKGJ4dEz6","RBhp0ciuWz",
+"nlaByblLA9","tl72Wn1pmO","RkQkeC2Irc","14FLRv2eC3","fcwDa6AFT0","pvgjS7lUXZ","zQt6QQClRL","gIYvE5Mg9r","580YDWaim6","Dz1R3m4bxU",
+"JXljWjSjS3","s7Mxktl72W","t59lRZUnqt","2Nslmuvf7A","CNHmv9y4lw","EdBKc7ku1p","QWxoTZUnqt","SmGzvVIlwP","IjTwPsx5Gl","ulk41RmDcr",
+"vOqCEix74r","UlU3MRACuj","OUYuF4W0Tl","RBhp0QssNC","iB08lFLsph","Kr8ysBFkb8","NOHszxXTI4","lXFOBbZLvS","v8yFNfLNg8","JRJQBdQ586",
+"xciqpJJs5m","QChxs2DREs","ReKEWPb1pa","Q6LixiwzGk","5IhmGCp3mZ","DLhzMvkCHH","uPX7Gzz4ZU","24ARF9GXkX","AIYUuAkKTk","prNT6fqypy",
+"Yh1hFVIlwP","580YDS2Dfu","B3qemtjQxs","jzUqR5iGN5","sx5GlzHF1q","WmadA7ku1p","FNYIMdjsrv","v8yFNBbwgA","580YDnnP8o","64s8NuPX7G",
+"UmaEvv1Hln","taOXKECMvU","QYxC0NAFuw","QbxXclsQGo","v2eC3rKDLJ","2NslmPb1pa","J2mQis93Ml","ReKEWSbRYy","1LB1L9iGoT","4dEz6580YD",
+"fmIK1uLtKs","ni2v1OUqFM","t59lR8xEKz","Mm8siJRJQB","nnP8oBFkb8","jiVBPO3iyQ","JXljW16lHc","jfREuKASQ8","jzUqRoQ87r","8cVD3QnJ1S",
+"s7Mxk0YAGH","blLA9VjCZq","pv0i7D6rBy","MaJQsUlU3M","QYxC0aez9y","yluBxgf8rI","VBjhz3weIF","JXljWSmGzv","VIlwPMmKGJ","K4GS8atef2",
+"t98iWokgRi","jSjS3aFFss","HP433prNT6","VIlwPMkgy8","jzUqRRxrsm","UmaEvKr8ys","s4786qUJMd","6q6L9QYxC0","0PktIMK07Y","taOXKP6bcg",
+"D6rByJRJQB","UlU3MmX2GE","16lHcpFrrl","PYBf4jzUqR","wDajXhE1Ql","0h1b1O3iyQ","s93Ml6q6L9","W7cTsB3qem","jeskSJRJQB","vOqCEYOfrY",
+"ydG8UfaHir","CxVEfzbIYY","TCgPpHlUbF","Cfgr3BGaQY","C2IrcFFDui","WmadAuAWyp","zbIYYRsQUq","7fsYMuAWyp","CNHmvv8yFN","CNHmvWaWsv",
+"uTacxbrhlQ","tvdkDlpF6W","jfREub29RJ","mz8gxFLsph","JXljWAmdQd","Fhtgld7vjM","aez9yMkgy8","jiVBPRACuj","uPX7GIBe8k","XyPZNaFFss",
+"FLsphIKxdL","Yh1hFLDk6f","MmKGJOUYuF","QnJ1Shi5X7","lpF6WRmDcr","YjB9tvOqCE","JJs5me6e4z","9GXkXDQimp","uLtKsUmaEv","7fsYMOz8yZ",
+"KZamHjeskS","vOqCEMezSW","Gv3FqXyPZN","ZJTXH7X3uy","7X3uyNOHsz","OUYuFZUnqt","l83UdgjUTu","Mkgy8C2Irc","aFFssAkKTk","XflUqVprf2",
+"euZA5AgJHQ","TCgPpjSjS3","RxrsmlH1kt","29QAzhSSvQ","FVMxo8RCUA","JRJQBtuDyS","k85Ae7fKYU","FVMxo5Mg9r","okgRiW3VFH","3weIFbrhlQ",
+"aDGtS0PktI","Twanoy94nw","yluBx6AFT0","16lHcMmKGJ","jiVBPMezSW","FFDuiUvlv4","pv0i7gtCA5","yToGW2DREs","pFrrlTa8f6","o8Uydhe9IA",
+"SjskQFcWrW","ru4UGEOE1o","y94nwF6PT2","W7cTsUl4a1","WreyPFxX9q","DG4sTFLsph","iwzGkmX2GE","d85a9CK5W7","lkMUAFFDui","Z4I1v7X3uy",
+"IBe8kLbRTH","FVMxofaHir","cShY2Waim6","Vprf2FjHXR","jtn0XIRh48","MojnPCp3mZ","VLTy6ulk41","MK07Y0h1b1","7Ow5CqaofN","lpF6WJRJQB",
+"aFFssW7cTs","dhSuHoQ87r","5VZjSYh1hF","hi5X7ni2v1","5NammazIWp","Pb1pa9iGoT","VBjhz7Ow5C","Vprf2DQimp","9rlg9K4GS8","t98iW8cVD3",
+"6q6L9Mm8si","lCMxyjzUqR","xReecIn3NS","5iGN5TXQ0Z","fmIK1l83Ud","Q6LixRsQUq","CK5W7QbxXc","hE1QltvdkD","oQ87rcShY2","OxWIHB3qem",
+"bZLvSCp3mZ","fqypyG1RhS","bZLvSjeskS","SbRYyHzZT8","2NslmLbRTH","16lHch1zcH","ZhwG1v8yFN","LDk6fVerEA","dpe1voQ87r","IjTwPGWqqX",
+"jeskSLbRTH","WDVWJ0ao3l","GXdoH0MR5X","aDGtSGWqqX","nFqikix74r","M6qcG0MR5X","aDGtSOz8yZ","Ul4a1HP433","MaJQsStlDJ","lj07QcL0aE",
+"mX2GEuQIcz","QnJ1St59lR","e6e4zlpF6W","v2eC3ThjNn","pAhR10YAGH","07n1cO3iyQ","2TRI7YOfrY","zHF1qhSSvQ","OUqFM0BmCy","azIWpCp3mZ",
+"NcICAPOUYS","45cIHiB08l","X6PinvOqCE","1v5hHYw2oU","oQ87r0BmCy","5nmWvCqqaD","POUYSMkgy8","FVMxoFwEJz","e6e4zfmIK1","MojnPJKWYR",
+"qQxHPzbIYY","Twanok85Ae","mX2GE580YD","S2DfuWmadA","mX2GE7ku1p","iwzGkLbRTH","6q6L9JRJQB","cShY2Yf2Ec","iwzGkOUqFM","aez9yWmadA",
+"PYBf4DG4sT","GSQwjB3qem","fcJOyprNT6","FnPFBRzaZA","blLA9CK5W7","jiVBPEdBKc","FGzgp0YAGH","sqVrfAmdQd","Q6LixFwEJz","suY4xRpBQm",
+"nlaBy580YD","ZzJHWQ6hMC","M3zXLM6qcG","jSjS3bZLvS","OxWIHQClRL","zqH0WFxX9q","lXFOBMmKGJ","dhSuHlsQGo","BbwgAHfyNQ","ix74rUvlv4",
+"MmsIolm0pD","BCxeCSjskQ","taOXKJJs5m","S2DfuksJby","VIlwP5IhmG","sqVrf0Kyfs","kB5nPNo0Qb","tuDySix74r","2Yz7EGWqqX","9iGoT0PktI",
+"14FLRuLtKs","0ao3lb29RJ","0Wr5yGrDg7","2DREsGSQwj","zHF1q7fKYU","piJSkD6rBy","ulk41nnP8o","jSjS3mz8gx","FGzgpOUqFM","BbwgAcQOnv",
+"QssNCtaOXK","wDajXYh1hF","NcICAogLgc","m4bxUFhtgl","JkzUnVerEA","uPX7GokgRi","he9IAPb1pa","G1RhSb29RJ","he9IAzQt6Q","Ss0Zuv8yFN",
+"WreyPKASQ8","i3pydoGu6x","AOgEe5nmWv","jiVBPVLTy6","NhXduG1RhS","lH1kt5drc6","tjQxs0MR5X","EOE1o7Ow5C","yluBxCqqaD","WPmlx8FmFH",
+"W3VFH55rfB","bgJAz3weIF","ydG8UWaWsv","7fKYU8RCUA","ogLgcgdQsS","Ta8f6jfREu","gdQsSS2Dfu","6AFT09rlg9","QworuKr8ys","Chuy3ECMvU",
+"gf8rIZuDtD","8TxD7GrDg7","0KyfsuoStw","d7vjMNAFuw","atef2HzZT8","8xEKzXflUq","6q6L9YjB9t","iKqhrYw2oU","aez9ycQOnv","FVMxoyvOMI",
+"hUTw7AkKTk","RmDcraFFss","KZamHjS1aj","RkQke618Di","AmdQdTa8f6","jiVBPqaofN","6q6L91v5hH","qUJMdW7cTs","QYxC0G1RhS","RkQkeK20wK",
+"rhl0JGv3Fq","vLsmSpT8wu","UmaEvQnJ1S","S77LHdpe1v","OxWIHD6rBy","QYxC0BGaQY","POUYS9eoRc","jtn0XrKDLJ","24ARFYjB9t","CIShGuAWyp",
+"d7vjMRsQUq","aFFssulk41","XflUqtvdkD","48cHL48cHL","I7p2a5iGN5","7fsYMBpYhV","Nxx9VFPfSE","HzZT8Q6hMC","s7Mxk48cHL","LewvMMmsIo",
+"vLsmS580YD","5VZjShUTw7","Chuy3brhlQ","Oz8yZRpBQm","SWfouMmKGJ","VBjhzKr8ys","MGlTFyluBx","Waim6iqv4k","7ku1p8hJdt","he9IALbRTH",
+"Cfgr3nnP8o","U3yw5ZzJHW","Vprf2WMiS3","NOHszatef2","SmGzvEOE1o","lXFOBFjHXR","RACujoGu6x","cL0aEMK07Y","PYBf414FLR","l83Udl83Ud",
+"JXljW8FmFH","jiVBPyEfy9","FnPFBiB08l","WPmlxZzJHW","sqVrfiB08l","9rlg9FFDui","bZLvSKsjRK","FwEJzZJTXH","okgRiQ6Lix","Mkgy85drc6",
+"jiVBPHzZT8","HlUbFCdyBV","WPmlxiB08l","Yw2oU0PktI","gf8rI7ku1p","nnP8om4bxU","IBe8kVLTy6","QworuOUYuF","G1RhSX6Pin","RACujCxVEf",
+"mz8gxLewvM","k85AeNAFuw","yofH3OUqFM","RzaZAKsjRK","tl72Wpv0i7","WmadAmz8gx","hYBCK0BmCy","1j5L8Nxx9V","suY4xMmsIo","SmGzvsqVrf",
+"i3pydjfREu","Cp3mZfcwDa","I7p2aa00b5","hE1QlPb1pa","Yf2EcIn3NS","Y1mC0Q6hMC","tAOsr0Wr5y","zmLYDKsjRK","D6rBy3otm6","xXTI49iGoT",
+"nFqikY1mC0","7Ow5CuZPqg","lj07Qsoy9t","AXpwERmDcr","zz4ZU5ZaEz","G1RhSZv7z0","l83UdhUTw7","soy9tm4bxU","mz8gxcQOnv","Chuy3uLtKs",
+"Yf2EcQChxs","Vprf2sx5Gl","he9IAOHaBz","1v5hHSjskQ","J2mQiK4GS8","ni2v1zHF1q","ReKEWoGu6x","CK5W7L7cGc","Yw2oUzz4ZU","vkCHHpiJSk",
+"dmoS7cmXIX","EOE1oZv7z0","pT8wuKASQ8","2DREs1v5hH","SWfouL7cGc","oVQp6zmLYD","lViBvydG8U","HRxd8rKDLJ","AOgEeZJTXH","K20wKOUqFM",
+"zmLYDVLTy6","rz7UtW3VFH","FwEJzzQt6Q","QssNCU3yw5","i3pydatef2","dmoS7wiHrZ","1j5L8AIYUu","VIlwPnnP8o","JJs5mvkCHH","7fKYURpBQm",
+"pAhR1blLA9","zqH0WVIlwP","J2mQiStlDJ","XflUqkB5nP","uJScXMmKGJ","pFrrllH1kt","qaofNYf2Ec","ReKEWvkCHH","5nmWvTa8f6","D6rByiqv4k",
+"QworuK20wK","Gv3Fqh1zcH","8RCUAjfREu","lH1kt0Wr5y","Ss0ZujiVBP","guMb8zqH0W","uLtKs7hyVv","Gv3FqVNCPd","CqqaDpFrrl","MezSWQbxXc",
+"taOXKFLsph","pAhR1In3NS","HlUbF8xEKz","4dEz6xXTI4","FnPFBY1mC0","aFFssiwzGk","prNT65Mg9r","pWiOsiKqhr","LbRTHECMvU","iKqhrWreyP",
+"fLNg8n1pmO","QbxXc0Wr5y","a00b5FGzgp","SWfouBFkb8","XyPZNM3zXL","Yw2oUblLA9","VjCZqPYBf4","vOqCEn8pJ9","NcICAZ4I1v","29QAzRsQUq",
+"2TRI7xciqp","pvgjShUTw7","D6rByBbwgA","0Kyfso8Uyd","EoToPhYBCK","a00b5ZuDtD","oGu6xjzUqR","xXTI4No0Qb","pT8wui3pyd","ZhwG1rz7Ut",
+"FPfSEBbwgA","1LB1LJJs5m","atef2POUYS","yvOMIMmKGJ","YjB9tFwEJz","RxrsmokgRi","oGu6xAOgEe","5Nammlm0pD","8FmFHv2eC3","FGzgpmz8gx",
+"o8UydpAhR1","jS1ajVjCZq","X6PinyofH3","I7p2aAOgEe","ReKEWgIYvE","JkzUnuupzk","hYBCKVprf2","jfREulj07Q","ksJbyhYBCK","pAhR1FjHXR",
+"QnJ1S55rfB","vkCHHfqypy","PYBf4n1pmO","jzUqRs4786","lm0pDpFrrl","7fsYM8FmFH","v8yFNVIlwP","hUTw7FFDui","UmaEvulk41","6AFT0zQt6Q",
+"jeskSYw2oU","fcJOyIRh48","ni2v1M3zXL","h1zcH0PktI","JIqXimz8gx","VIlwPSbRYy","GXdoH1j5L8","AOgEewDajX","VBjhzbgJAz","uZPqgfcJOy",
+"Uvlv4hYBCK","48cHLQClRL","IBe8kMK07Y","Cfgr3NcICA","WMiS3zQt6Q","ZUnqtChuy3","lweGyfqypy","29QAzdjsrv","JkzUnbrhlQ","cShY2sx5Gl",
+"s7MxkfaHir","Oz8yZzqH0W","uLtKsMezSW","ZUnqt55rfB","MmKGJhYBCK","2hEEUY1mC0","ulk41X6Pin","0Wr5ySs0Zu","tl72WWaWsv","NOHszFhtgl",
+"jzUqRO3iyQ","jeskSBGaQY","Zv7z0618Di","iB08l8RCUA","vkCHHYOfrY","O3iyQCp3mZ","i7WMQBCxeC","uvf7A7lUXZ","okgRiQnJ1S","aez9yyvOMI",
+"Ss0ZuSbRYy","FnPFBjSjS3","SjskQFLsph","4dEz6BGaQY","DLhzM16lHc","Uvlv4iB08l","IRh48CqqaD","5Drn0cmXIX","ulk410Kyfs","hi5X7MezSW",
+"piJSkSbRYy","0MR5Xlj07Q","ZuDtDWaim6","AkKTklXFOB","Yh1hFBGaQY","Waim61j5L8","hUTw7ciuWz","IKxdLe6e4z","S77LHe6e4z","lCMxyv1Hln",
+"ZuDtDix74r","J2mQiSWfou","M6qcGQ6Lix","FnPFBWreyP","OUYuF2Yz7E","CdyBVzqH0W","S77LHzQt6Q","NOHszuZPqg","zmLYDZzJHW","tl72WF6PT2",
+"vkCHHMGlTF","StlDJ4QMc9","tjQxsZv7z0","KASQ8prNT6","lj07Qiqv4k","SWfouCxVEf","tlILtuoStw","i7WMQuQIcz","KASQ8dhSuH","TXQ0ZGv3Fq",
+"blLA9ni2v1","he9IAHlUbF","D6rByzQt6Q","9eoRciKqhr","BCxeC2ZHdk","Mm8sisoy9t","6AFT0xciqp","FxX9qCqqaD","CIShGD6rBy","t98iWCIShG",
+"Dz1R3gjUTu","OxWIHFjHXR","UmaEvVBjhz","6q6L9O3iyQ","SbRYyWaWsv","nnP8oSjskQ","djsrvd7vjM","POUYSh1zcH","WPmlxpT8wu","ogLgco8Uyd",
+"NcICAWMiS3","SWfou29QAz","QnJ1SCxVEf","piJSk7lUXZ","G1RhSd85a9","guMb8FFDui","EoToPzqH0W","No0Qbs4786","fcJOym4bxU","Yf2Ect98iW",
+"WaWsvFxX9q","8FmFH5Namm","4QMc9L7cGc","8hJdtsqVrf","Kr8ysvLsmS","AOgEeO3iyQ","lsQGoWmadA","ix74rLbRTH","Waim6FcWrW","U3yw5pmeCd",
+"BFkb8IjTwP","hYBCKjzUqR","lsQGoDLhzM","EOE1oGWqqX","prNT6LDk6f","0BmCytAOsr","5IhmGFcWrW","o8UydZ4I1v","O3iyQ8TxD7","8cVD3OxWIH",
+"nFqikTCgPp","l83UdU3yw5","Dz1R3lXFOB","RBhp0CdyBV","qQxHPCp3mZ","4QMc9ulk41","4W0TlC2Irc","ix74r5Drn0","ni2v18U2nU","XflUqi3pyd",
+"nlaByFxX9q","he9IAtl72W","9iGoT8TxD7","O3iyQM6qcG","5drc68hJdt","FLsphlsQGo","QnJ1SZhwG1","Y1mC0euZA5","vLsmS0MR5X","DQimpReKEW",
+"s4786HP433","MmsIoa00b5","cShY25IhmG","ydG8UHlUbF","QClRLbgJAz","dmoS7Cp3mZ","BFkb8kZANm","sx5GlxReec","tvdkDtuDyS","prNT6lsQGo",
+"VLTy6SjskQ","9iGoT6AFT0","ZuDtDxciqp","uLtKs618Di","t59lRzQt6Q","DQimpM3zXL","vLsmSVLTy6","rhl0JJkzUn","uZPqgO3iyQ","yvOMIzHF1q",
+"16lHcpv0i7","UmaEvtlILt","8hJdt24ARF","Mkgy82hEEU","mX2GEXflUq","3otm6LDk6f","8RCUAvLsmS","P6bcguTacx","bZLvSzmLYD","JKWYRyluBx",
+"JkzUnK20wK","HP433jfREu","618DinnP8o","jfREus4786","guMb8aL6AJ","GSQwjIBe8k","EOE1opT8wu","cShY2QssNC","TXQ0ZVNCPd","RBhp0dpe1v",
+"zQt6QtaOXK","gdQsSL7cGc","Yf2Ecuupzk","Oz8yZgdQsS","HlUbFSbRYy","dhSuH8hJdt","RACujs7Mxk","piJSkWMiS3","7hyVvulk41","2hEEUfcJOy",
+"Ul4a1FnPFB","P6bcgbgJAz","zz4ZU5Drn0","5nmWv1v5hH","1v5hH3otm6","K20wKNcICA","fFDrJfqypy","NhXdu8FmFH","jzUqRS77LH","FcWrWKZamH",
+"YjB9tzY1GY","IRh48BGaQY","uQIcz8TxD7","FVMxoi3pyd","OUqFMlCMxy","fqypyJkzUn","GrDg724ARF","QYxC0lkMUA","NOHszFLsph","4QMc9ru4UG",
+"FjHXR5Drn0","5iGN5DQimp","x3LDeReKEW","FVMxoni2v1","2NslmL7cGc","5Mg9rZuDtD","zY1GYChuy3","wDajXuvf7A","pmeCd580YD","Ul4a1HRxd8",
+"Ss0Zu9XyT9","1LB1LYw2oU","rhl0JaL6AJ","oQ87rmX2GE","VBjhzzz4ZU","UmaEvWmadA","ZuDtDQWxoT","Nxx9VP6bcg","fFDrJRsQUq","QChxs0Wr5y",
+"zmLYDQChxs","Dz1R3AIYUu","cQOnvqaofN","tuDyS9rlg9","Uvlv4Mkgy8","ru4UGZv7z0","NOHszX6Pin","Y1mC0y94nw","ydG8UStlDJ","YOfrYFwEJz",
+"DcpWBfaHir","9eoRc9eoRc","1LB1LokgRi","uoStwzHF1q","PYBf49iGoT","DcpWBcQOnv","brhlQjiVBP","lj07QbgJAz","iKqhrReKEW","uPX7G7lUXZ",
+"QWxoTuLtKs","blLA9zqH0W","jS1ajCK5W7","lj07Q6AFT0","VerEANxx9V","29QAzDG4sT","lpF6Wx3LDe","uPX7GMmsIo","64s8NuLtKs","Uvlv4uJScX",
+"RACujulk41","C2IrcjeskS","e6e4z580YD","GWqqXU3yw5","CxVEfOz8yZ","U3yw5JXljW","In3NShSSvQ","s7MxkwiHrZ","XyPZNMkgy8","IBe8kjeskS",
+"wiHrZsuY4x","oVQp6LDk6f","v8yFNRmDcr","VBjhzUvlv4","MGlTF9iGoT","y94nw9GXkX","OUqFM16lHc","hSSvQhE1Ql","Ss0ZupvgjS","gjUTutl72W",
+"LDk6fMGlTF","MK07YSWfou","jfREuZUnqt","7lUXZ5Drn0","Cp3mZEOE1o","HlUbFRACuj","MaJQshE1Ql","yvOMIhUTw7","4dEz6yEfy9","he9IAyToGW",
+"LewvMLewvM","GrDg7uAWyp","ThjNnStlDJ","TwanonFqik","ZuDtDK4GS8","rhl0JwDajX","ogLgcyToGW","2DREsVIlwP","RsQUq0PktI","RsQUqksJby",
+"BGaQYCfgr3","55rfBfaHir","h1zcHxReec","MmKGJpFrrl","HfyNQXflUq","aez9yLewvM","RACujuN6r3","FhtglfFDrJ","i7WMQZUnqt","2hEEUatef2",
+"ogLgcs4786","FxX9qydG8U","rKDLJsuY4x","fFDrJ14FLR","IBe8klweGy","lj07Qd7vjM","MmKGJZhwG1","pv0i7uoStw","2ZHdkFPfSE","yEfy9JIqXi",
+"GXdoHPOUYS","sx5Gldpe1v","7Ow5Culk41","lCMxy2Yz7E","a00b5JkzUn","MK07YcL0aE","F6PT2iqv4k","uoStwlpF6W","9iGoTFjHXR","WPmlxYw2oU",
+"5Drn05Namm","ogLgc0Wr5y","zQt6QSWfou","BpYhVLewvM","B3qemiqv4k","lH1ktfcJOy","CIShGgjUTu","Oz8yZ8RCUA","Ta8f6F6PT2","pT8wuDcpWB",
+"yToGWyToGW","suY4x8U2nU","CNHmvuZPqg","vLsmSwiHrZ","POUYSzFgtB","4W0Tl1v5hH","n8pJ9Cfgr3","SbRYyjSjS3","Q6LixbZLvS","I7p2alsQGo",
+"EoToPlj07Q","lj07QGv3Fq","zbIYYCK5W7","G1RhStuDyS","dQ586TXQ0Z","jiVBPdjsrv","RkQkeyToGW","euZA53weIF","lsQGooVQp6","FGzgpatef2",
+"S77LHHzZT8","SjskQRxrsm","FxX9qatef2","suY4xFLsph","gf8rIYjB9t","cQOnvtlILt","U3yw5xXTI4","7Ow5CvkCHH","FLsphzz4ZU","2Nslm6AFT0",
+"prNT655rfB","QWxoToVQp6","RmDcrdhSuH","zqH0WTa8f6","EOE1o0ao3l","TCgPpCqqaD","uZPqgIRh48","jtn0XFPfSE","NAFuwjzUqR","okgRiRsQUq",
+"DcpWBEOE1o","QnJ1SogLgc","iwzGkMm8si","blLA9zQt6Q","5Drn0lpF6W","1j5L8suY4x","pmeCdgtCA5","ni2v1KASQ8","UmaEv8FmFH","SjskQRkQke",
+"ix74rpFrrl","i3pydZv7z0","RkQke0Kyfs","rhl0JNxx9V","iwzGkWPmlx","1j5L8h1zcH","ZJTXHNo0Qb","oGu6x8TxD7","Ta8f6piJSk","iqv4k8FmFH",
+"fcwDalXFOB","K4GS8vOqCE","vOqCERBhp0","lj07QRxrsm","gIYvEZv7z0","m4bxU0Wr5y","FPfSEBCxeC","QClRLK4GS8","blLA9UmaEv","iB08ljSjS3",
+"bgJAzTwano","k85Aev1Hln","s93Ml1j5L8","yluBxyofH3","CNHmvkB5nP","yofH3v2eC3","gjUTut98iW","rhl0J9iGoT","atef28FmFH","JJs5mksJby",
+"AgJHQ2hEEU","14FLRa00b5","MmKGJW7cTs","JXljWhSSvQ","oQ87rIBe8k","tlILthi5X7","zFgtBokgRi","Mm8silsQGo","oGu6xFjHXR","jeskSZJTXH",
+"BFkb8In3NS","i3pyd5iGN5","ZJTXHWMiS3","gjUTumz8gx","JXljW7fsYM","CdyBViKqhr","0h1b1Kr8ys","NcICAAgJHQ","dpe1vRsQUq","fqypyAgJHQ",
+"gtCA5ni2v1","BFkb8lpF6W","MaJQsWreyP","lXFOBiwzGk","P6bcgVLTy6","Dz1R30YAGH","v1HlntuDyS","VjCZqiqv4k","VerEAjeskS","iKqhrnnP8o",
+"zFgtBiB08l","cmXIXJJs5m","lsQGoG1RhS","OUYuFvLsmS","djsrvfFDrJ","kZANmWaWsv","uupzkmX2GE","QYxC0gjUTu","lXFOBgjUTu","7fKYU7lUXZ",
+"xXTI4yofH3","QworuEdBKc","WDVWJogLgc","0Wr5ysoy9t","RsQUquvf7A","3otm6Nxx9V","qQxHPhe9IA","gdQsSjeskS","ReKEWuvf7A","s7Mxkjtn0X",
+"TCgPpJKWYR","pv0i7gIYvE","7fKYU5iGN5","O3iyQd7vjM","K4GS8nlaBy","wDajXFVMxo","9GXkXECMvU","gIYvEyofH3","F6PT2FjHXR","t98iWaL6AJ",
+"1LB1LnlaBy","2DREsZhwG1","dmoS7FGzgp","SmGzv5nmWv","gtCA5JRJQB","zqH0WguMb8","0KyfsMmKGJ","okgRiM6qcG","iB08lIRh48","lCMxyQYxC0",
+"MmsIo0PktI","azIWpcmXIX","tjQxspAhR1","uupzknlaBy","JRJQBI7p2a","7X3uyIjTwP","gf8rI5IhmG","lH1kthYBCK","iqv4k1v5hH","8hJdtIKxdL",
+"QClRLsuY4x","AkKTkHP433","7Ow5CJRJQB","JIqXi4QMc9","VLTy65Mg9r","QssNCRxrsm","BCxeCrhl0J","BCxeCzqH0W","azIWpksJby","8U2nUCNHmv",
+"7X3uy0Kyfs","GWqqXaDGtS","cShY28hJdt","D6rByWaWsv","piJSkuTacx","v8yFNRsQUq","ulk41pvgjS","dpe1vd85a9","KASQ8hi5X7","d85a98RCUA",
+"d85a92TRI7","jzUqRyluBx","9eoRcm4bxU","jSjS39eoRc","29QAzLewvM","JkzUnWDVWJ","lj07QcShY2","yvOMIFjHXR","WaWsv48cHL","euZA5lj07Q",
+"WreyPhSSvQ","0MR5XX6Pin","Zv7z0EdBKc","l83UdYjB9t","xReecpvgjS","I7p2a5ZaEz","iwzGktjQxs","dmoS7guMb8","0ao3lpFrrl","Pb1pa2TRI7",
+"Yf2EciB08l","LbRTHNAFuw","3otm6uLtKs","t98iWCNHmv","gf8rI9rlg9","MaJQsOUqFM","MaJQsblLA9","1LB1LaDGtS","BGaQYW7cTs","ThjNnWDVWJ",
+"580YDnFqik","cShY2CIShG","XflUq7hyVv","aez9y7Ow5C","fcJOyX6Pin","55rfB6AFT0","dpe1vgjUTu","2DREstuDyS","k85AeFnPFB","I7p2ak85Ae",
+"jzUqR0YAGH","QClRLWreyP","HfyNQhE1Ql","tlILtlweGy","ru4UGUmaEv","uZPqgpAhR1","uPX7GtvdkD","dQ586kZANm","POUYStl72W","mX2GEprNT6",
+"lH1ktpiJSk","lsQGoSjskQ","ReKEWB3qem","gtCA5uTacx","jfREuSjskQ","zqH0We6e4z","prNT6gIYvE","Mm8sihi5X7","VBjhzn1pmO","d85a9pv0i7",
+"tuDySLbRTH","yvOMIQYxC0","8FmFHpmeCd","HP433YjB9t","7fKYUhi5X7","IBe8k5IhmG","soy9tDz1R3","QWxoTlweGy","24ARFtaOXK","0BmCyOxWIH",
+"MmKGJDQimp","Chuy3ksJby","lj07QFGzgp","Pb1paCfgr3","XflUqJIqXi","2NslmIjTwP","RmDcrhUTw7","OHaBz8RCUA","5nmWvG1RhS","tl72Wlj07Q",
+"F6PT20ao3l","B3qemQClRL","cL0aE29QAz","7X3uytAOsr","8RCUAciuWz","RpBQmFcWrW","P6bcgru4UG","uTacxK4GS8","wiHrZhYBCK","brhlQSmGzv",
+"pWiOs64s8N","JJs5mvLsmS","MmKGJciuWz","HzZT8Twano","0PktIn8pJ9","v1Hln1LB1L","OUYuF8xEKz","3otm6lCMxy","5nmWvAOgEe","h1zcHfcJOy",
+"7X3uyv1Hln","0YAGHiB08l","RzaZAMm8si","M3zXLGXdoH","BbwgAReKEW","DG4sTuN6r3","24ARF8xEKz","9eoRcFVMxo","ix74rNOHsz","CdyBV7lUXZ",
+"hSSvQru4UG","Q6Lix5iGN5","xReecnlaBy","BpYhV29QAz","JRJQBcmXIX","4QMc9rz7Ut","xciqpL7cGc","RACujcShY2","U3yw5O3iyQ","2Nslmd7vjM",
+"yluBxMmKGJ","F6PT2GWqqX","zHF1qAmdQd","suY4xv1Hln","soy9tCK5W7","Yh1hF24ARF","RzaZAXyPZN","a00b5JIqXi","ZUnqthE1Ql","d85a9rhl0J",
+"5drc6QClRL","S2DfuMkgy8","jzUqR5IhmG","MojnPzHF1q","iB08lUlU3M","b29RJNAFuw","pv0i7yluBx","K20wKjSjS3","UmaEvVIlwP","UlU3M618Di",
+"L7cGcOUqFM","y94nwFFDui","uoStwL7cGc","h1zcHlweGy","QYxC0ZzJHW","d85a9FcWrW","euZA5IBe8k","VIlwPuQIcz","jfREuMK07Y","0KyfsIBe8k",
+"hSSvQCdyBV","TXQ0ZpT8wu","dmoS7Mkgy8","AOgEe9iGoT","8FmFH8cVD3","WmadAh1zcH","prNT6J2mQi","zmLYDogLgc","brhlQMaJQs","Vprf2JJs5m",
+"b29RJYOfrY","oQ87ruTacx","RkQkecShY2","tlILt5Namm","iqv4k8cVD3","BGaQYlm0pD","7fKYUzbIYY","lsQGo2TRI7","FwEJz2Yz7E","TCgPphUTw7",
+"Ul4a1WmadA","MmsIoe6e4z","xciqpjSjS3","In3NSSWfou","Vprf2VNCPd","gtCA5fFDrJ","ni2v19iGoT","5nmWvRzaZA","14FLRVjCZq","RxrsmNxx9V",
+"uLtKsv2eC3","XflUq14FLR","v1HlnI7p2a","CK5W7Q6hMC","Yh1hFXyPZN","gtCA5Pb1pa","HzZT8uvf7A","WMiS3Fhtgl","EOE1o0Kyfs","0MR5XYf2Ec",
+"K20wKFjHXR","0ao3luPX7G","5drc6Nxx9V","RmDcrAmdQd","zQt6QjzUqR","PYBf47ku1p","kB5nPm4bxU","gIYvEWaWsv","UmaEvy94nw","azIWpQ6Lix",
+"Yh1hFa00b5","BCxeCHfyNQ","m4bxUKr8ys","uQIczWmadA","oQ87rEOE1o","3weIFqQxHP","3otm6uTacx","16lHcGrDg7","gjUTuFhtgl","gtCA5hSSvQ",
+"Nxx9Vv1Hln","2hEEUPOUYS","Yh1hF6AFT0","mz8gxrz7Ut","RpBQmTCgPp","pmeCdd7vjM","tl72WRACuj","SWfouDG4sT","ulk41pv0i7","bZLvSdmoS7",
+"L7cGcpAhR1","KsjRKyluBx","48cHLqaofN","YOfrYv2eC3","tlILtlm0pD","uTacxNhXdu","RACuj5IhmG","zY1GYMGlTF","bZLvSKASQ8","AkKTkZuDtD",
+"he9IA5nmWv","NhXduTXQ0Z","W3VFHhE1Ql","SbRYyokgRi","XflUqPb1pa","WMiS3ni2v1","SbRYyCp3mZ","8U2nU6AFT0","EOE1oVerEA","JkzUnDQimp",
+"nnP8oVprf2","kZANmVIlwP","0YAGHIn3NS","2hEEUEdBKc","LewvMwDajX","lpF6W7fsYM","VNCPd9y4lw","45cIHi7WMQ","uoStwfaHir","UmaEvwDajX",
+"cmXIXM6qcG","uZPqgOz8yZ","8TxD7fqypy","prNT6FnPFB","lH1ktFcWrW","qUJMdhUTw7","gdQsSdpe1v","t59lRFnPFB","0MR5X2Nslm","Nxx9V5Namm",
+"tl72WrKDLJ","kB5nPyofH3","AgJHQdmoS7","JKWYRUmaEv","FwEJzuoStw","lXFOBKsjRK","dmoS7yToGW","uLtKs29QAz","2NslmZzJHW","MK07YHP433",
+"QChxs0BmCy","D6rByuAWyp","NAFuw7fKYU","uJScX29QAz","QYxC0cQOnv","MK07Yaez9y","7fKYUBbwgA","iKqhraL6AJ","ksJbygf8rI","Ta8f6zz4ZU",
+"pv0i7FnPFB","VNCPdThjNn","YOfrYhUTw7","RzaZAb29RJ","ECMvURzaZA","DG4sT5Namm","FVMxoaez9y","RxrsmRkQke","o8Uydix74r","9iGoTlXFOB",
+"IjTwPSs0Zu","blLA9Zv7z0","Mm8sixciqp","07n1cCfgr3","WreyPgtCA5","tAOsrRsQUq","lpF6WQnJ1S","Yf2Ec0Wr5y","nlaByRpBQm","DLhzMSmGzv",
+"uoStwfcwDa","ThjNnHRxd8","aez9yIBe8k","t59lRsuY4x","RpBQmh1zcH","4QMc9YjB9t","O3iyQBbwgA","XflUq29QAz","lCMxyazIWp","BpYhVlXFOB",
+"5IhmGtuDyS","bgJAzlkMUA","FFDuih1zcH","dQ586JKWYR","No0QbVLTy6","5Drn0IjTwP","n1pmO45cIH","fFDrJ8FmFH","zFgtBWreyP","s7MxkRzaZA",
+"K4GS8zqH0W","0PktI48cHL","4W0TlgjUTu","HP433ix74r","vLsmSI7p2a","9rlg90BmCy","nFqik4QMc9","AXpwE0Kyfs","7ku1pCqqaD","2ZHdkS2Dfu",
+"IRh48pWiOs","TXQ0ZK20wK","KsjRKFcWrW","zY1GYiqv4k","VerEAAOgEe","b29RJa00b5","Chuy3CIShG","gtCA529QAz","Nxx9VyluBx","m4bxUs4786",
+"CNHmvlm0pD","ydG8UQ6Lix","SjskQdjsrv","e6e4ztl72W","NcICAMmsIo","rKDLJx3LDe","aL6AJsqVrf","JJs5mRACuj","Dz1R3QssNC","fcJOyyofH3",
+"618Digf8rI","zHF1qZv7z0","0YAGHI7p2a","KASQ8M6qcG","FnPFBHlUbF","618DiHfyNQ","5ZaEzni2v1","pv0i7x3LDe","CNHmvPb1pa","FcWrWaDGtS",
+"VIlwPVIlwP","Gv3Fq8FmFH","lkMUA14FLR","bgJAz4dEz6","14FLR8TxD7","HRxd8uQIcz","FFDui0BmCy","tvdkDQ6Lix","6AFT0dQ586","aDGtSiwzGk",
+"uTacx1v5hH","Qworupv0i7","yluBxS77LH","fqypylweGy","6AFT0Cfgr3","2DREsCp3mZ","WMiS39XyT9","uupzkEdBKc","lweGyFnPFB","1j5L8Yw2oU",
+"y94nwbrhlQ","wiHrZVerEA","Gv3FqNhXdu","mz8gxiwzGk","BpYhVxXTI4","cQOnvWmadA","LewvMJKWYR","zbIYYwiHrZ","MojnPUmaEv","Dz1R364s8N",
+"lkMUAqaofN","Qworu5Namm","0Wr5yv1Hln","LewvMcQOnv","aDGtSCp3mZ","uTacxHzZT8","WreyPcQOnv","o8UydbrhlQ","yEfy9Pb1pa","Vprf2gjUTu",
+"CIShGCNHmv","dpe1v5VZjS","jSjS3Fhtgl","i3pydIRh48","hi5X75iGN5","DLhzMguMb8","qUJMdWPmlx","UlU3Mx3LDe","FnPFBzbIYY","FNYIMIBe8k",
+"0YAGH9eoRc","faHirpmeCd","TXQ0ZtvdkD","ru4UGcL0aE","nlaBydjsrv","ZJTXH7ku1p","DLhzMJ2mQi","SjskQVLTy6","lkMUAlpF6W","vLsmSZuDtD",
+"TCgPpWDVWJ","sqVrf6AFT0","1LB1LF6PT2","K4GS8oVQp6","uAWypuPX7G","7X3uyiKqhr","2TRI7gf8rI","8TxD724ARF","CdyBVkZANm","RACujlH1kt",
+"kZANmyluBx","NhXdui7WMQ","prNT6MezSW","Qworui3pyd","OxWIHFPfSE","24ARFCIShG","ZUnqtNOHsz","s7Mxkh1zcH","HzZT82DREs","45cIHAmdQd",
+"uJScXK20wK","5Mg9rdQ586","C2IrcNo0Qb","Vprf2aDGtS","VLTy6qUJMd","l83UdTwano","b29RJuvf7A","o8UydlweGy","mz8gxlpF6W","1v5hHm4bxU",
+"iqv4k2Nslm","yToGWAgJHQ","7fKYUAIYUu","K4GS80Wr5y","GXdoHzY1GY","dQ586Gv3Fq","prNT6hYBCK","29QAzO3iyQ","5Drn0FNYIM","QChxsEOE1o",
+"DLhzMUmaEv","s7MxkOHaBz","KZamHru4UG","4dEz6lXFOB","gtCA5HRxd8","fcwDaqaofN","uoStwwDajX","lj07QuN6r3","CNHmvAkKTk","yEfy9o8Uyd",
+"xXTI4FNYIM","CIShGkZANm","uLtKsuTacx","VerEAI7p2a","RkQke8TxD7","14FLR55rfB","cShY2DLhzM","HRxd8YOfrY","ECMvUfmIK1","uupzkRpBQm",
+"zY1GYOz8yZ","ulk41xReec","RmDcrNxx9V","jeskSni2v1","sx5GlhE1Ql","BbwgAd7vjM","1j5L87hyVv","atef2BpYhV","7lUXZTXQ0Z","VerEAt59lR",
+"zY1GY55rfB","RACuj9eoRc","uAWypydG8U","Q6LixHP433","Yf2EcIRh48","kB5nP0ao3l","FLsphS77LH","faHirXflUq","D6rByM3zXL","blLA9OxWIH",
+"dpe1vhSSvQ","MaJQsDQimp","IRh48zbIYY","RkQke9y4lw","4QMc95IhmG","SWfoudmoS7","DcpWBzHF1q","WaWsvqQxHP","KASQ88RCUA","VNCPdD6rBy",
+"fFDrJ48cHL","FjHXRsx5Gl","yToGWZ4I1v","wDajX24ARF","S2DfuJRJQB","ksJbyVjCZq","ru4UGhe9IA","FxX9qi3pyd","2NslmuTacx","5NammuTacx",
+"t98iWfmIK1","TwanoWreyP","7hyVvzmLYD","07n1clViBv","zqH0WuLtKs","ni2v1Waim6","AIYUuBCxeC","K20wKksJby","0ao3ln8pJ9","lkMUAprNT6",
+"Z4I1vi3pyd","Ta8f6Pb1pa","64s8NKASQ8","UmaEvRzaZA","Kr8ysuN6r3","fmIK1pFrrl","oGu6xM3zXL","lpF6WUmaEv","RACujlkMUA","jzUqRSjskQ",
+"POUYSHfyNQ","9iGoTxXTI4","rhl0J8U2nU","5Drn01LB1L","FLsphUvlv4","OHaBzh1zcH","jeskSS2Dfu","uQIcz3weIF","45cIHU3yw5","5Mg9rI7p2a",
+"5nmWvtvdkD","CK5W7d7vjM","8xEKzNOHsz","MmKGJBpYhV","SbRYybrhlQ","Ul4a1ydG8U","DLhzMiqv4k","5IhmGRBhp0","lViBvv1Hln","zmLYDs4786",
+"IBe8kfLNg8","5ZaEzM6qcG","zz4ZUC2Irc","7fKYUtjQxs","RACujKr8ys","7fsYMAIYUu","cL0aErKDLJ","hi5X7ReKEW","oQ87r2Yz7E","jS1aj0h1b1",
+"7fKYUuupzk","64s8N4dEz6","1LB1Ls93Ml","UmaEvru4UG","29QAzgIYvE","RkQkefcwDa","ZuDtDM6qcG","aez9ytjQxs","VerEAuN6r3","IBe8kdQ586",
+"Ul4a1XyPZN","OUYuFlXFOB","DQimpaFFss","tjQxs3weIF","XyPZNlH1kt","M6qcGoQ87r","FwEJzvkCHH","zz4ZURsQUq","Zv7z0Qworu","m4bxU8RCUA",
+"bgJAzAmdQd","MezSW55rfB","ciuWzru4UG","AOgEeECMvU","t59lR2TRI7","CdyBVI7p2a","DG4sTuoStw","hYBCKiB08l","CK5W7Fhtgl","ni2v15ZaEz",
+"ZzJHWFVMxo","Oz8yZblLA9","7Ow5Cv2eC3","RzaZAGv3Fq","lj07QYh1hF","OUYuFfmIK1","Kr8ys618Di","5Drn06AFT0","wiHrZs93Ml","7lUXZpiJSk",
+"OxWIH16lHc","rz7UtWreyP","ru4UGhSSvQ","lsQGoP6bcg","lViBv9rlg9","zqH0WM3zXL","zY1GYcShY2","RmDcrIKxdL","SbRYy8FmFH","XflUqDQimp",
+"1LB1LtlILt","UmaEvIjTwP","BpYhV0Wr5y","lpF6WyEfy9","GXdoHJKWYR","ZUnqtv8yFN","zFgtBXflUq","HRxd8cShY2","d85a9jSjS3","FFDui16lHc",
+"lweGy48cHL","EoToPdjsrv","tlILtJXljW","WmadAOHaBz","6AFT0Zv7z0","QClRLzmLYD","s93MlRxrsm","vOqCEuN6r3","P6bcgn1pmO","yvOMIIRh48",
+"pAhR1StlDJ","Q6Lix7X3uy","gdQsSHzZT8","2hEEUC2Irc","MaJQsguMb8","64s8NyEfy9","sqVrfrKDLJ","8RCUAlm0pD","tjQxss7Mxk","Mm8si0ao3l",
+"O3iyQ16lHc","d7vjMyofH3","5Drn08xEKz","djsrvru4UG","zz4ZUVLTy6","J2mQigIYvE","fLNg8WMiS3","pvgjSdQ586","M3zXLW7cTs","djsrva00b5",
+"fcwDa55rfB","Zv7z0S2Dfu","SbRYyL7cGc","QnJ1Suvf7A","s4786BCxeC","Chuy3euZA5","ni2v1FGzgp","AOgEe1LB1L","lj07Qsx5Gl","iKqhriqv4k",
+"pT8wunlaBy","XyPZNZv7z0","POUYSCp3mZ","ogLgcVBjhz","MezSW0YAGH","t98iWt98iW","i3pydlH1kt","AmdQd0MR5X","2TRI70BmCy","nFqik64s8N",
+"FcWrW9XyT9","D6rByNcICA","0BmCy9y4lw","y94nwBGaQY","s478664s8N","tuDySjzUqR","jiVBPYh1hF","xciqp9XyT9","lH1ktzmLYD","0Kyfs2TRI7",
+"8TxD7580YD","cmXIXFNYIM","JJs5m7lUXZ","9GXkX4QMc9","Kr8ysxciqp","uTacxqQxHP","pWiOsuPX7G","zHF1q2TRI7","dhSuHy94nw","BFkb8BFkb8",
+"soy9t8U2nU","m4bxUyluBx","Kr8ysTwano","SWfoutAOsr","ogLgcrhl0J","brhlQPb1pa","F6PT2y94nw","ZUnqtGXdoH","QbxXclkMUA","fcJOy5drc6",
+"6AFT0okgRi","AOgEepv0i7","tl72WCdyBV","NOHszhE1Ql","xXTI4JXljW","WDVWJOz8yZ","sx5GllH1kt","NOHszn1pmO","fqypyBbwgA","Nxx9V3otm6",
+"x3LDecmXIX","VIlwPAIYUu","VjCZq4W0Tl","m4bxURACuj","YjB9ttlILt","ni2v1TXQ0Z","lH1kt3otm6","RBhp0DcpWB","piJSkdhSuH","l83UdlkMUA",
+"wDajXlH1kt","nnP8oW7cTs","vLsmSqUJMd","QworuUl4a1","bZLvSfaHir","FcWrWMojnP","QClRLv2eC3","m4bxU2Nslm","uJScXDQimp","cmXIXh1zcH",
+"lweGymX2GE","aez9ybgJAz","uN6r3DcpWB","hi5X72DREs","0Wr5yo8Uyd","2ZHdkK20wK","xciqpjeskS","pv0i7tl72W","hi5X7HRxd8","prNT6yToGW",
+"guMb8Cfgr3","XyPZNy94nw","o8Uyd5ZaEz","uLtKs2DREs","uTacxsx5Gl","S2Dfu0MR5X","d7vjM48cHL","5IhmG29QAz","2NslmAgJHQ","RBhp08RCUA",
+"Nxx9VDz1R3","gf8rIcQOnv","kZANmZuDtD","VerEA8cVD3","sqVrfuJScX","gdQsSGrDg7","FjHXRYf2Ec","qaofN5VZjS","0BmCyZhwG1","azIWpbZLvS",
+"2Yz7ERkQke","Q6Lix0YAGH","oVQp6NcICA","mX2GEVjCZq","brhlQqQxHP","s93MlpiJSk","XflUqh1zcH","5NammTCgPp","HRxd8Zv7z0","2NslmHP433",
+"HzZT8guMb8","7lUXZC2Irc","Ul4a1pFrrl","VNCPdIn3NS","ydG8UVBjhz","cShY2dhSuH","RBhp0CIShG","B3qemQworu","W7cTsD6rBy","WDVWJI7p2a",
+"he9IAVNCPd","nlaBykB5nP","qUJMdjzUqR","pT8wuJ2mQi","ulk41zmLYD","dmoS7QbxXc","M6qcG29QAz","HzZT8i3pyd","LewvMK4GS8","AgJHQogLgc",
+"Yh1hFzbIYY","8FmFHxXTI4","5VZjScShY2","RsQUqgjUTu","blLA98RCUA","0Wr5yazIWp","vkCHHW3VFH","0h1b1VerEA","Vprf2qaofN","RsQUqpT8wu",
+"S2Dfumz8gx","oGu6xblLA9","FNYIMtl72W","jS1ajsqVrf","qQxHPfcJOy","LDk6f1LB1L","FPfSEYw2oU","FLsphLewvM","uvf7As7Mxk","pvgjSPb1pa",
+"nlaByuTacx","Yf2Ec55rfB","RzaZA0ao3l","OHaBzlm0pD","OUYuFXyPZN","lViBvgjUTu","POUYSGv3Fq","Q6LixVjCZq","Fhtgls4786","K20wKatef2",
+"AIYUuBFkb8","45cIH4dEz6","tvdkDdjsrv","IRh48DQimp","OUYuFuvf7A","Oz8yZfcJOy","vkCHHbZLvS","WDVWJoQ87r","Cp3mZQChxs","kB5nP2ZHdk",
+"Nxx9VlCMxy","sx5Glx3LDe","t98iWThjNn","suY4xI7p2a","DLhzMRBhp0","zmLYD0PktI","uvf7AtlILt","S77LHciuWz","4W0TlnnP8o","uAWyp7fKYU",
+"64s8NeuZA5","7Ow5CaFFss","s7MxkSWfou","ogLgcMK07Y","yvOMIJKWYR","pvgjSaL6AJ","O3iyQCNHmv","l83UdfmIK1","uAWyp618Di","GXdoHm4bxU",
+"DLhzMQChxs","dhSuHVLTy6","Chuy3SjskQ","3otm60BmCy","wDajXaDGtS","zqH0WTwano","ECMvUrKDLJ","618Dimz8gx","qaofNx3LDe","RpBQmgdQsS",
+"VIlwP8TxD7","48cHLjSjS3","K4GS8sx5Gl","xXTI4Yh1hF","AIYUumX2GE","VNCPdRxrsm","dpe1vC2Irc","5nmWvU3yw5","oGu6xDQimp","9y4lwx3LDe",
+"n1pmOni2v1","WMiS3ksJby","D6rByyvOMI","2TRI7Ul4a1","JKWYRIRh48","UlU3M9iGoT","S77LH618Di","vkCHHZhwG1","zqH0WChuy3","S2DfulsQGo",
+"JIqXiDG4sT","FGzgpzqH0W","cShY2JXljW","WaWsvGv3Fq","jfREujS1aj","k85Ae8xEKz","uPX7GAIYUu","LbRTHHlUbF","jiVBPVerEA","fqypyKr8ys",
+"gf8rIFwEJz","8xEKzpiJSk","zqH0W2Nslm","VBjhzFhtgl","VerEAMm8si","ECMvU3otm6","FFDui9rlg9","BCxeCDcpWB","uvf7ADcpWB","RzaZAjzUqR",
+"lH1ktix74r","SbRYyi7WMQ","MojnP5drc6","lm0pDksJby","zY1GYAOgEe","lweGy6q6L9","fcJOyYjB9t","XflUqoQ87r","HzZT85Mg9r","Yw2oUoQ87r",
+"v2eC3KsjRK","B3qemDQimp","MezSW0MR5X","i7WMQaez9y","2Nslm5Namm","ulk41RACuj","1v5hHuPX7G","uoStwOxWIH","uTacxQWxoT","h1zcH07n1c",
+"tl72WlpF6W","SmGzvChuy3","yofH3MK07Y","vkCHHhYBCK","CdyBVQworu","StlDJGXdoH","BbwgAh1zcH","L7cGc5iGN5","jtn0XaL6AJ","JIqXiGv3Fq",
+"FnPFB8cVD3","yEfy9RmDcr","ru4UGvkCHH","vOqCE5iGN5","RxrsmtjQxs","OUYuFGrDg7","Zv7z0sx5Gl","CK5W79XyT9","RpBQmzmLYD","iwzGkcL0aE",
+"8hJdtaFFss","fLNg8atef2","fLNg85drc6","1j5L8NcICA","D6rByMGlTF","BGaQYVjCZq","tuDySuJScX","5Drn0guMb8","BCxeCpmeCd","HzZT8ru4UG",
+"QChxsYjB9t","ThjNnBFkb8","tl72W1j5L8","gjUTuCdyBV","lj07QOHaBz","QClRLfaHir","pWiOsSs0Zu","nnP8oRkQke","tuDyS1LB1L","pFrrluvf7A",
+"FwEJz2ZHdk","pvgjSRACuj","rKDLJCNHmv","lj07QlCMxy","uN6r3aDGtS","FLsph3otm6","K20wKAOgEe","gIYvEwDajX","64s8NQnJ1S","9iGoTWaWsv",
+"MGlTFsx5Gl","i7WMQlj07Q","W3VFH29QAz","aL6AJ9rlg9","jiVBPYf2Ec","5Mg9rO3iyQ","h1zcHxciqp","Q6hMCfFDrJ","RsQUqm4bxU","fcwDahUTw7",
+"FxX9qdpe1v","nnP8oqUJMd","AmdQddmoS7","vOqCEfLNg8","QworuIn3NS","v1Hlnn8pJ9","pFrrlWmadA","W3VFH24ARF","pAhR18TxD7","n1pmO580YD",
+"FGzgpIBe8k","DG4sT0ao3l","TXQ0ZjfREu","ksJbyhi5X7","W3VFHVBjhz","RpBQmwiHrZ","cmXIX55rfB","I7p2adQ586","zFgtBZuDtD","blLA9YjB9t",
+"FjHXRb29RJ","zz4ZUgtCA5","pWiOsuupzk","Vprf255rfB","QClRLaFFss","Z4I1vgIYvE","rhl0JHlUbF","580YDyluBx","bZLvS2hEEU","7hyVvGSQwj",
+"ksJbyyvOMI","iqv4kFhtgl","ZzJHWDG4sT","tjQxsgtCA5","he9IAatef2","uZPqgfcwDa","cmXIXs7Mxk","7lUXZ5Namm","hi5X73weIF","Yf2Ec29QAz",
+"45cIHFLsph","9rlg9yluBx","yEfy9aez9y","IjTwPuQIcz","djsrvTwano","QssNCOxWIH","Chuy35nmWv","piJSk0MR5X","HlUbFK4GS8","ru4UGe6e4z",
+"tjQxsatef2","9iGoTS2Dfu","jSjS32DREs","ZJTXH0h1b1","azIWpk85Ae","zQt6QStlDJ","55rfBSs0Zu","e6e4zZJTXH","ThjNnS77LH","pv0i7Yf2Ec",
+"pT8wuYOfrY","RsQUqprNT6","QworuThjNn","mX2GEhYBCK","9XyT9pmeCd","h1zcHnnP8o","I7p2am4bxU","QWxoTjiVBP","taOXK8TxD7","Cp3mZcShY2",
+"Qworu1v5hH","W3VFHv8yFN","HlUbFAgJHQ","pmeCdJRJQB","zQt6QRsQUq","4dEz6ZJTXH","djsrvQworu","GrDg7JRJQB","cL0aEZUnqt","7lUXZ9eoRc",
+"FVMxo55rfB","yvOMIRACuj","ciuWzQnJ1S","ZUnqtOxWIH","jfREuQWxoT","o8UydhYBCK","uTacxUl4a1","RpBQma00b5","iwzGk3weIF","B3qemEoToP",
+"b29RJTwano","7ku1pBGaQY","RkQkehe9IA","55rfB580YD","07n1cMGlTF","gdQsSx3LDe","29QAzmz8gx","OxWIHReKEW","M6qcGqQxHP","Mm8siwDajX",
+"GWqqXkB5nP","Y1mC0m4bxU","taOXKzHF1q","M3zXLgtCA5","uupzke6e4z","45cIHWaWsv","5Mg9rSjskQ","XflUqt98iW","DG4sT48cHL","xReecQ6Lix",
+"OHaBzpvgjS","l83UdAXpwE","v1HlnHRxd8","MmsIoCqqaD","Rxrsm4QMc9","0ao3lNcICA","zFgtBcShY2","Twano3otm6","618DiqQxHP","Oz8yZokgRi",
+"suY4x9eoRc","No0QbFwEJz","aFFssCIShG","gdQsSd85a9","Mkgy8yvOMI","OHaBzYjB9t","5ZaEzpAhR1","QYxC016lHc","cQOnvatef2","SmGzvAkKTk",
+"48cHLtaOXK","Yh1hFFNYIM","jzUqR2DREs","SmGzv6AFT0","zbIYY8cVD3","HlUbFnFqik","jSjS3W7cTs","QbxXcQbxXc","wiHrZoVQp6","PYBf4lj07Q",
+"lXFOBaFFss","FPfSEOUYuF","0Wr5yrKDLJ","2TRI7P6bcg","14FLRnlaBy","DG4sTBFkb8","FGzgpfqypy","7Ow5CFxX9q","y94nw7lUXZ","dQ586B3qem",
+"CdyBV14FLR","6AFT0TXQ0Z","iqv4k1LB1L","VBjhzBGaQY","aDGtSLewvM","uPX7GB3qem","NcICABFkb8","SmGzvvkCHH","vkCHHe6e4z","3otm6pT8wu",
+"MmKGJWmadA","prNT6No0Qb","1LB1LuoStw","SbRYy6AFT0","cL0aEd7vjM","pFrrlWaim6","FxX9qNxx9V","CK5W7Z4I1v","FFDuikB5nP","atef2AIYUu",
+"DcpWB7Ow5C","FLsphWDVWJ","1LB1LY1mC0","RsQUqTa8f6","CNHmvlH1kt","pv0i7Cp3mZ","fmIK107n1c","v1Hln2Nslm","Qworu9XyT9","BCxeC0MR5X",
+"azIWppvgjS","rhl0J7Ow5C","Chuy32Nslm","o8UydUl4a1","uTacx1j5L8","KsjRKa00b5","0Kyfs07n1c","djsrvcShY2","UmaEvgjUTu","fmIK1FFDui",
+"o8UydjzUqR","RpBQm16lHc","AXpwEbZLvS","5VZjSpAhR1","jeskSIjTwP","9eoRcFnPFB","CdyBVtAOsr","aL6AJM6qcG","FLsph7hyVv","fqypyuvf7A",
+"dpe1v07n1c","hE1Ql5IhmG","aez9yUlU3M","C2IrccQOnv","b29RJjeskS","piJSkZuDtD","DcpWBjtn0X","guMb8soy9t","FLsph8hJdt","zFgtBlViBv",
+"lm0pDWDVWJ","qaofNt98iW","K20wK8hJdt","ulk41JXljW","ix74r8RCUA","In3NSCfgr3","5drc6iwzGk","d7vjM5Mg9r","QChxsWDVWJ","YjB9t8TxD7",
+"ogLgc5Drn0","jiVBPwDajX","QYxC0jSjS3","L7cGcAIYUu","9rlg9k85Ae","AXpwEMaJQs","4dEz6nnP8o","s4786WaWsv","lCMxyuvf7A","lpF6WyvOMI",
+"ciuWzl83Ud","GXdoHECMvU","i7WMQQClRL","7fsYMPYBf4","JIqXi0h1b1","CNHmvNxx9V","Mm8sicmXIX","RBhp0oVQp6","t98iWZ4I1v","LewvMbgJAz",
+"fcJOybgJAz","iwzGkBFkb8","8RCUAUmaEv","uN6r3jeskS","zFgtB9y4lw","nnP8oSs0Zu","mz8gxFhtgl","0Kyfs5ZaEz","StlDJiwzGk","Nxx9VSbRYy",
+"k85AeVLTy6","t98iWI7p2a","2ZHdkFwEJz","fmIK1UlU3M","O3iyQbZLvS","EdBKcKsjRK","okgRiRmDcr","WPmlxF6PT2","NOHszvLsmS","lweGyxciqp",
+"Cp3mZC2Irc","SWfoubZLvS","ECMvUpv0i7","lpF6WM3zXL","4W0TlWaim6","SmGzvUlU3M","0PktIhi5X7","SmGzvaFFss","lkMUAlsQGo","FPfSEG1RhS",
+"x3LDejzUqR","iB08lFcWrW","MaJQsHlUbF","jfREuWreyP","7fKYUL7cGc","8FmFH1LB1L","Uvlv44dEz6","618DiThjNn","d7vjMLewvM","0YAGHokgRi",
+"aDGtSNxx9V","4QMc9Qworu","AIYUuQ6Lix","FVMxoQ6Lix","Zv7z0s4786","7Ow5CnlaBy","L7cGclj07Q","pvgjS9rlg9","7X3uyQWxoT","pT8wuGrDg7",
+"VerEACNHmv","rKDLJblLA9","xciqpQClRL","CxVEf2Yz7E","y94nwFLsph","6AFT0HfyNQ","t59lRazIWp","okgRivLsmS","ciuWztAOsr","2ZHdkX6Pin",
+"2TRI7Cfgr3","M3zXLhSSvQ","ZUnqtQ6hMC","9rlg9vOqCE","hYBCKOz8yZ","LbRTHulk41","Uvlv4k85Ae","CqqaDGSQwj","fcJOy16lHc","9y4lwAOgEe",
+"AOgEe0BmCy","RACujFxX9q","KsjRKFPfSE","tlILtFGzgp","UlU3MjSjS3","Z4I1vxReec","d7vjMNhXdu","KsjRKrz7Ut","v8yFNzHF1q","fFDrJtAOsr",
+"1j5L8GWqqX","Qworu4dEz6","nFqikJKWYR","MaJQs4W0Tl","lweGyDQimp","uZPqg3otm6","iqv4kjeskS","64s8N0MR5X","RACujQChxs","2DREsGrDg7",
+"BpYhVAgJHQ","M6qcGCqqaD","bgJAz618Di","JJs5mfFDrJ","Dz1R3FwEJz","tjQxsOUYuF","580YDgdQsS","zqH0W618Di","SmGzvFcWrW","MmsIogdQsS",
+"d7vjMChuy3","M6qcGpAhR1","JJs5mdpe1v","bZLvSpvgjS","VNCPdMm8si","lweGyulk41","2Yz7EbgJAz","W7cTs5Namm","cL0aEOxWIH","t59lRzmLYD",
+"CNHmvMmsIo","d85a9RmDcr","VBjhzI7p2a","iwzGkMmsIo","xXTI4BCxeC","HfyNQuPX7G","lH1ktGv3Fq","BpYhVNhXdu","bZLvSY1mC0","FNYIMtaOXK",
+"jfREurhl0J","In3NSBpYhV","KASQ8taOXK","oVQp6OHaBz","RBhp0uJScX","tvdkDxReec","7fKYUOUqFM","JRJQBsoy9t","x3LDe0YAGH","GrDg7s4786",
+"lXFOBzbIYY","i3pydlCMxy","xReecJJs5m","7fsYMBGaQY","CNHmvlViBv","pWiOsMkgy8","O3iyQPOUYS","FhtgloVQp6","618DiVBjhz","prNT6W7cTs",
+"LbRTHgIYvE","IBe8k48cHL","t59lRBCxeC","KsjRKFnPFB","mz8gxDQimp","QbxXc0ao3l","aFFssMaJQs","M3zXLfcJOy","FcWrWWreyP","Q6Lixy94nw",
+"nlaByGv3Fq","fqypyUvlv4","SWfouCfgr3","7fsYMgjUTu","blLA9tuDyS","9eoRcZzJHW","W3VFHDz1R3","2hEEU8FmFH","IBe8kfcwDa","0BmCy1LB1L",
+"ulk41AmdQd","VerEAVBjhz","9rlg9atef2","uupzkuupzk","ThjNnWPmlx","ksJbyzHF1q","XflUqQClRL","Nxx9VfcwDa","7Ow5C0Wr5y","CNHmv5IhmG",
+"8RCUAbrhlQ","uLtKspmeCd","JJs5mIjTwP","GXdoHZ4I1v","zmLYDix74r","B3qemHlUbF","G1RhS5Drn0","xciqpPYBf4","9eoRcQssNC","yToGWU3yw5",
+"pWiOsnlaBy","ZhwG1Qworu","7Ow5CciuWz","VerEAFGzgp","7fKYUni2v1","B3qemFcWrW","DcpWBHP433","nnP8oYw2oU","SjskQix74r","QYxC00h1b1",
+"kB5nPyvOMI","zHF1qDQimp","zQt6QCNHmv","gIYvEoQ87r","ksJbyHfyNQ","9y4lwksJby","5Drn0S2Dfu","8RCUATwano","L7cGctuDyS","fFDrJix74r",
+"SjskQ4QMc9","Cfgr3OUYuF","CK5W7FcWrW","a00b5OxWIH","7hyVvVNCPd","pAhR164s8N","Ta8f6RACuj","RkQkeguMb8","5IhmGnnP8o","jzUqRlH1kt",
+"okgRiP6bcg","0BmCyfqypy","gf8rISWfou","sx5Glrz7Ut","v8yFNRACuj","SjskQJKWYR","yluBxRBhp0","M3zXLF6PT2","RsQUqydG8U","55rfBoGu6x",
+"lViBvMkgy8","BpYhVlH1kt","QworusqVrf","zY1GYFLsph","8cVD39XyT9","NOHsz8xEKz","S2DfuzY1GY","FLsphSbRYy","0YAGHaL6AJ","rhl0J2TRI7",
+"3weIFO3iyQ","0Wr5yVNCPd","cQOnv29QAz","I7p2aCNHmv","tlILt9y4lw","CxVEfprNT6","Cfgr37hyVv","soy9t7lUXZ","guMb8FwEJz","atef2Yf2Ec",
+"8FmFH2hEEU","fqypyuTacx","ECMvUvLsmS","y94nwVIlwP","tAOsrJJs5m","mX2GESs0Zu","a00b58hJdt","14FLRCxVEf","YjB9tCxVEf","rKDLJLewvM",
+"J2mQiRmDcr","ulk41yvOMI","y94nwsx5Gl","fFDrJQWxoT","OUqFMpiJSk","k85Ae7Ow5C","PYBf4SmGzv","WPmlxlXFOB","fqypy8hJdt","lj07QCdyBV",
+"he9IAprNT6","y94nwix74r","dpe1vtlILt","8TxD7J2mQi","v8yFNdmoS7","n1pmOEoToP","lpF6Wdpe1v","0YAGH7hyVv","8FmFHAmdQd","brhlQ5ZaEz",
+"nFqikUmaEv","QYxC0fcJOy","tjQxsfcwDa","FxX9q580YD","ix74rYw2oU","K20wKTXQ0Z","aDGtSrz7Ut","RpBQm580YD","CdyBVDLhzM","jtn0Xt98iW",
+"J2mQiCxVEf","ksJbyoQ87r","zz4ZU64s8N","i3pydChuy3","yluBxk85Ae","LDk6fBGaQY","9XyT9FVMxo","6q6L9JkzUn","6AFT0FNYIM","FFDuiFnPFB",
+"RkQkeS77LH","2Yz7EfFDrJ","G1RhSi3pyd","cShY2AIYUu","aez9yzz4ZU","lm0pDyEfy9","0Wr5yKZamH","2hEEUIBe8k","5Drn07Ow5C","yToGWSmGzv",
+"fFDrJ9rlg9","QbxXcaL6AJ","d7vjM5nmWv","StlDJPOUYS","iwzGkChuy3","mX2GEvOqCE","1j5L8FPfSE","IRh48XyPZN","G1RhS5IhmG","euZA5WmadA",
+"24ARFmz8gx","yofH3QbxXc","DLhzM4W0Tl","6AFT0RBhp0","DLhzMxXTI4","M3zXLo8Uyd","o8UyddhSuH","NhXdulpF6W","dhSuHuN6r3","BbwgAxReec",
+"pT8wulkMUA","StlDJdQ586","lsQGoJRJQB","l83Ud0YAGH","aL6AJD6rBy","x3LDeMmKGJ","8FmFHiwzGk","VjCZq0Kyfs","WreyPi3pyd","16lHcIRh48",
+"YjB9tjtn0X","8cVD3J2mQi","5drc6Yh1hF","vLsmSt98iW","h1zcHb29RJ","xReecCqqaD","VerEAqaofN","sx5GlKsjRK","NOHszeuZA5","lCMxyStlDJ",
+"5IhmGzbIYY","hYBCK6q6L9","aL6AJi7WMQ","soy9tyluBx","t98iW9eoRc","jeskSyEfy9","K4GS8nnP8o","soy9tNAFuw","5drc6KASQ8","MaJQsReKEW",
+"e6e4ztAOsr","CdyBVlCMxy","QbxXcSmGzv","MezSWpFrrl","lH1ktAXpwE","nnP8oEdBKc","6q6L9HzZT8","BpYhVFPfSE","uLtKszmLYD","I7p2azY1GY",
+"tl72WMmKGJ","BpYhVAOgEe","zY1GYThjNn","8U2nUS77LH","IKxdLAmdQd","BGaQY618Di","0BmCyIn3NS","pWiOswiHrZ","iB08l24ARF","5IhmGxReec",
+"HP433tl72W","OxWIHfcwDa","Ul4a1No0Qb","FjHXRD6rBy","m4bxUSmGzv","ReKEWPOUYS","euZA5tl72W","n1pmOTa8f6","jeskS5VZjS","zY1GYF6PT2",
+"B3qemi3pyd","VerEAQnJ1S","NOHszokgRi","9eoRcK4GS8","jzUqROxWIH","cShY29eoRc","aL6AJYw2oU","8U2nU2ZHdk","xciqpvLsmS","LDk6fCIShG",
+"guMb8M3zXL","4QMc9QYxC0","NcICAi3pyd","55rfBgjUTu","gdQsSiwzGk","y94nwh1zcH","AkKTkdhSuH","fcwDaMaJQs","m4bxUiwzGk","Chuy3PYBf4",
+"FwEJz29QAz","Twanohe9IA","pmeCdJ2mQi","0MR5XCfgr3","55rfBt59lR","fmIK18RCUA","aDGtS3otm6","ciuWzuN6r3","GSQwjAXpwE","gtCA5pv0i7",
+"Oz8yZrhl0J","YjB9tEoToP","zY1GYix74r","dhSuHJRJQB","HzZT8Chuy3","FNYIM7fKYU","7Ow5CxXTI4","M3zXLRpBQm","fcwDazmLYD","S77LHTXQ0Z",
+"nFqikpiJSk","45cIHW3VFH","IjTwPm4bxU","ZzJHWZUnqt","QYxC0KZamH","lm0pDNOHsz","EoToPIjTwP","jeskSTCgPp","9GXkXQChxs","0h1b10h1b1",
+"5iGN5gIYvE","vLsmS7X3uy","yofH38RCUA","tjQxsRBhp0","618DiaFFss","JJs5muupzk","2TRI7EdBKc","Ta8f6M3zXL","gIYvE3weIF","SmGzvbgJAz",
+"gjUTum4bxU","C2IrczFgtB","aL6AJk85Ae","m4bxU6AFT0","2ZHdksqVrf","8RCUAMGlTF","6q6L9AkKTk","ogLgcDLhzM","yvOMIVBjhz","aL6AJs4786",
+"3otm6yToGW","uoStw5Drn0","OxWIHAgJHQ","BpYhVZuDtD","In3NSPYBf4","NhXdu5Mg9r","Pb1pauN6r3","SbRYyWMiS3","FcWrWtvdkD","lsQGoCqqaD",
+"JIqXiFnPFB","uupzk2Nslm","prNT6lCMxy","b29RJQ6Lix","8RCUAHzZT8","2NslmG1RhS","rz7UtFcWrW","GSQwjAmdQd","lXFOBt59lR","NAFuwFcWrW",
+"9rlg9G1RhS","Yw2oUBCxeC","9rlg9zY1GY","uupzkydG8U","b29RJ0YAGH","FLsphv8yFN","IRh48VerEA","rz7Utix74r","7fKYUQYxC0","YjB9tjeskS",
+"lj07Qh1zcH","FGzgpjeskS","WmadAD6rBy","Ta8f6zFgtB","9rlg9jfREu","YjB9t7fKYU","CNHmvuoStw","euZA58TxD7","ThjNnd7vjM","VerEAQWxoT",
+"faHirokgRi","hi5X7lCMxy","48cHLtlILt","pFrrldhSuH","RmDcrlm0pD","lH1kthe9IA","HRxd8CNHmv","8U2nUHzZT8","hYBCK0Kyfs","5Namm7lUXZ",
+"MaJQsQ6Lix","PYBf4RzaZA","ThjNnzQt6Q","brhlQUl4a1","9XyT9lm0pD","UlU3MaDGtS","8FmFH3otm6","XyPZNVprf2","WPmlxuupzk","atef2FPfSE",
+"U3yw5uvf7A","oGu6xS77LH","cShY2lm0pD","Ta8f6fLNg8","FLsphG1RhS","GSQwjmX2GE","vOqCEK4GS8","rhl0JogLgc","K4GS8OUYuF","iqv4kQworu",
+"EoToP24ARF","jiVBPMojnP","mz8gxtjQxs","euZA5v1Hln","Cp3mZBCxeC","6AFT0S77LH","uQIczuQIcz","nFqikuLtKs","9y4lwJXljW","taOXKEOE1o",
+"7fsYMCIShG","MojnPXflUq","h1zcHulk41","Chuy3jS1aj","hSSvQJkzUn","pv0i7ReKEW","64s8NGSQwj","W3VFH7Ow5C","yofH3Kr8ys","Zv7z0FjHXR",
+"NOHszFVMxo","HP433lpF6W","uvf7Adpe1v","CK5W7tlILt","4dEz6uLtKs","zz4ZUvLsmS","d7vjM14FLR","prNT6uZPqg","SjskQmz8gx","M3zXLuJScX",
+"580YDEoToP","tuDySzmLYD","qUJMdsoy9t","JKWYRprNT6","DcpWBPOUYS","Q6hMCFnPFB","2Yz7EVjCZq","fLNg8HRxd8","t98iWaDGtS","QssNCJIqXi",
+"8hJdtzmLYD","0YAGHyluBx","WmadAQYxC0","CK5W7BpYhV","8U2nUF6PT2","VLTy6h1zcH","v1HlnUl4a1","aDGtSlViBv","16lHcuAWyp","zqH0W2hEEU",
+"IBe8kUlU3M","X6PinCdyBV","pT8wu5Mg9r","prNT6zmLYD","vOqCEmz8gx","yluBx618Di","9y4lwlweGy","NAFuwhe9IA","s7MxkFFDui","FxX9qlCMxy",
+"5VZjSIjTwP","guMb8uvf7A","Yh1hFChuy3","2DREs3otm6","LDk6fv2eC3","580YDhi5X7","IjTwP9rlg9","prNT60Kyfs","5Drn0k85Ae","3otm6Y1mC0",
+"QClRLFjHXR","0Wr5yzqH0W","vOqCESs0Zu","BGaQYuvf7A","pvgjS0YAGH","Mkgy8Yh1hF","SmGzvwDajX","lm0pDtlILt","D6rByPOUYS","VjCZqSs0Zu",
+"lm0pD0MR5X","Z4I1v5iGN5","sx5GlOxWIH","55rfBfLNg8","IRh48zHF1q","t59lRdQ586","PYBf4Gv3Fq","DQimpciuWz","LbRTHxciqp","DLhzMFLsph",
+"FGzgp8RCUA","fcJOyCdyBV","GSQwjZv7z0","Cp3mZ45cIH","s93MlW3VFH","ThjNn6AFT0","WmadApv0i7","S2DfuRpBQm","uJScXCfgr3","S77LHuPX7G",
+"55rfB9GXkX","1j5L8VNCPd","zbIYYdhSuH","jtn0XQbxXc","LbRTHCdyBV","uTacxKr8ys","0PktI7X3uy","cQOnvhE1Ql","AmdQdL7cGc","AkKTkh1zcH",
+"zbIYY9XyT9","BGaQY0Wr5y","d85a9DcpWB","wDajXlViBv","DcpWBnnP8o","yvOMI580YD","VNCPdFFDui","W7cTsvOqCE","DcpWBEoToP","0MR5XD6rBy",
+"GXdoHO3iyQ","ix74rNhXdu","n1pmO5nmWv","W7cTsRsQUq","nlaByP6bcg","VIlwPKsjRK","jeskSZUnqt","0ao3loQ87r","S77LHFxX9q","BpYhVFFDui",
+"LDk6fuZPqg","TwanoXflUq","G1RhSQbxXc","ECMvU7fsYM","5VZjSyEfy9","rhl0Jhi5X7","s93MlQnJ1S","ulk41i7WMQ","StlDJU3yw5","jtn0XPOUYS",
+"Yw2oUFjHXR","2ZHdk0h1b1","d7vjMd85a9","iB08luoStw","I7p2al83Ud","IjTwPv2eC3","4W0Tllj07Q","vLsmStvdkD","ReKEW9XyT9","NOHszCxVEf",
+"Waim6he9IA","StlDJlpF6W","gIYvEi3pyd","Yw2oU5Namm","GSQwjuN6r3","IBe8k8FmFH","lXFOBiqv4k","BCxeCAXpwE","VNCPd64s8N","VNCPd5drc6",
+"580YDfmIK1","IRh48ni2v1","9y4lw5Namm","yluBxMkgy8","Kr8ysB3qem","NcICAulk41","2TRI7Yf2Ec","5Mg9rmz8gx","5iGN50ao3l","45cIHLbRTH",
+"MezSWXyPZN","NOHszfFDrJ","8FmFHWreyP","POUYSeuZA5","No0QboGu6x","suY4xhi5X7","SjskQuTacx","prNT6OUYuF","RkQkelXFOB","jS1ajuPX7G",
+"5IhmGoVQp6","U3yw5Waim6","ciuWzIRh48","JRJQB7Ow5C","lm0pD4QMc9","FPfSEUl4a1","7fsYMxReec","ZzJHWQworu","StlDJ5IhmG","uLtKsNOHsz",
+"7fsYM0BmCy","0MR5XFwEJz","MojnPCdyBV","fqypyWDVWJ","FjHXRyvOMI","blLA9VNCPd","tvdkDMkgy8","Z4I1vuvf7A","e6e4zGSQwj","jeskSECMvU",
+"EoToPuoStw","IRh485IhmG","GSQwjtaOXK","1j5L85IhmG","0BmCyRBhp0","CNHmvazIWp","soy9t7ku1p","LbRTHyofH3","sx5Gljtn0X","brhlQuupzk",
+"hE1QlL7cGc","VBjhzpmeCd","No0Qbi3pyd","h1zcHJXljW","AgJHQB3qem","ciuWzlpF6W","jiVBPUl4a1","azIWpNhXdu","HRxd8Dz1R3","XflUqVNCPd",
+"1LB1LECMvU","Yf2EcFwEJz","8TxD7NAFuw","ZhwG1QYxC0","7ku1p2Nslm","aez9ym4bxU","uTacxW7cTs","ulk41PYBf4","8hJdt45cIH","K4GS8m4bxU",
+"BpYhV580YD","MK07YMaJQs","uQIczQ6hMC","Waim6aDGtS","4W0Tl2DREs","14FLRKr8ys","pv0i7faHir","nnP8oyEfy9","5nmWv8cVD3","HRxd8uupzk",
+"fLNg8t98iW","uQIczFNYIM","t59lR2ZHdk","lCMxytjQxs","uupzk618Di","pT8wucmXIX","VLTy6J2mQi","AgJHQGXdoH","FnPFBlsQGo","BCxeCaez9y",
+"Ta8f65Drn0","Ss0ZuRkQke","cmXIXBpYhV","OUqFMiKqhr","ZhwG1blLA9","QnJ1SbZLvS","aDGtSQYxC0","AIYUutAOsr","GSQwjYf2Ec","AmdQdzz4ZU",
+"zmLYDfcJOy","gdQsSlweGy","DG4sTdQ586","nlaByy94nw","fcJOylsQGo","Mkgy8uN6r3","OUqFMSmGzv","blLA9FcWrW","t98iWazIWp","WmadAKsjRK",
+"4QMc9HP433","gIYvEUl4a1","7hyVvUlU3M","wiHrZuupzk","tlILtQworu","HfyNQmX2GE","MmKGJpv0i7","0MR5XWDVWJ","IKxdLFVMxo","oQ87rgdQsS",
+"QnJ1SW3VFH","pWiOsWreyP","5iGN5Fhtgl","lkMUAaez9y","KsjRKyofH3","OHaBzCNHmv","ReKEWaFFss","oGu6xFwEJz","StlDJ0h1b1","tAOsr9GXkX",
+"7ku1pi3pyd","CdyBV7fsYM","2NslmMm8si","nnP8olkMUA","Yw2oU0h1b1","0MR5X7fsYM","djsrvpiJSk","UmaEvuQIcz","oGu6xVprf2","8xEKzulk41",
+"gdQsS8U2nU","a00b5WPmlx","16lHc8FmFH","bgJAzdhSuH","xReecjS1aj","lXFOBYw2oU","Cfgr3KZamH","Kr8yscL0aE","a00b5WmadA","hUTw7KsjRK",
+"CqqaDYjB9t","3otm6SbRYy","55rfBGWqqX","UlU3Ms7Mxk","NAFuwlm0pD","8cVD3DQimp","fqypyoVQp6","MojnP580YD","MmKGJlkMUA","s4786suY4x",
+"07n1c7lUXZ","zHF1qJKWYR","BCxeCeuZA5","9iGoTOxWIH","VBjhzNcICA","S77LHRACuj","uQIczsoy9t","RmDcr7fsYM","K4GS8AOgEe","lkMUAQworu",
+"okgRiF6PT2","s4786t59lR","djsrv8cVD3","QnJ1Si7WMQ","4QMc9IBe8k","Uvlv4uAWyp","uupzkuN6r3","ksJbyG1RhS","8FmFHYw2oU","pvgjShYBCK",
+"TCgPphSSvQ","DQimpsqVrf","hE1QlJIqXi","HzZT8lsQGo","NAFuwCqqaD","PYBf4W7cTs","taOXK580YD","AXpwE1LB1L","Ta8f6prNT6","dpe1vSbRYy",
+"BFkb8O3iyQ","hSSvQHRxd8","hYBCKTXQ0Z","Ta8f616lHc","6q6L9D6rBy","1j5L8okgRi","29QAzM6qcG","Rxrsm8TxD7","DcpWBkB5nP","SWfouJJs5m",
+"Ss0ZuGSQwj","jfREukZANm","uJScXgIYvE","FnPFB2Yz7E","lweGycL0aE","5Namm8FmFH","ix74rsx5Gl","zY1GYFhtgl","FxX9qdmoS7","0ao3l618Di",
+"ogLgckZANm","Gv3FqBbwgA","HlUbFZuDtD","P6bcgxXTI4","BGaQYpT8wu","azIWpDcpWB","5nmWvD6rBy","8TxD7pT8wu","pv0i7WreyP","45cIHAXpwE",
+"cQOnvGrDg7","QClRLzHF1q","NcICAQWxoT","TwanoMkgy8","dhSuHzY1GY","pv0i7RmDcr","Vprf2tuDyS","GrDg7fLNg8","OxWIHVLTy6","tvdkD8RCUA",
+"2hEEUVNCPd","rz7Utulk41","AmdQd64s8N","FcWrW7lUXZ","K4GS814FLR","WDVWJd85a9","ydG8UM6qcG","azIWpJJs5m","No0QbG1RhS","TCgPpv2eC3",
+"IBe8kzY1GY","FwEJz8hJdt","oGu6xWMiS3","QssNCs4786","cL0aEcL0aE","azIWpWMiS3","fcJOyHlUbF","FnPFBDcpWB","ZUnqtFwEJz","SWfoufmIK1",
+"6AFT02Yz7E","iwzGk7lUXZ","ZzJHWFwEJz","7X3uyvkCHH","nlaByNhXdu","dmoS7GXdoH","AkKTks7Mxk","7hyVvWreyP","SbRYyYjB9t","lpF6Wfqypy",
+"0BmCyAkKTk","AOgEeFwEJz","dQ586pAhR1","5IhmGLbRTH","zQt6QvkCHH","zQt6QECMvU","uQIczMmsIo","hE1Qlulk41","ReKEWyofH3","LewvMMkgy8",
+"IjTwPuTacx","2DREs45cIH","9y4lwVLTy6","FFDuicShY2","KsjRKuoStw","x3LDefcJOy","24ARFFGzgp","FPfSEUmaEv","GrDg7AgJHQ","o8UydVNCPd",
+"rz7UtTa8f6","aez9ylCMxy","kZANmBbwgA","X6PinYw2oU","WPmlxDQimp","SjskQ0PktI","pAhR1ZhwG1","QYxC03weIF","2DREsLewvM","8xEKzAgJHQ",
+"3otm6ni2v1","Q6hMCfLNg8","nnP8o0Wr5y","qUJMd5drc6","DQimpb29RJ","XflUq64s8N","piJSkO3iyQ","RmDcri7WMQ","xciqpvOqCE","zY1GYZv7z0",
+"6AFT05IhmG","oQ87rQssNC","oQ87rOUYuF","uZPqgZhwG1","EdBKci7WMQ","RmDcrs93Ml","yToGWeuZA5","LbRTHnFqik","C2Irc0ao3l","uJScXKr8ys",
+"ECMvU8RCUA","9eoRczFgtB","cmXIXIKxdL","euZA5mX2GE","XyPZNlweGy","S2Dfuiqv4k","ZhwG1hUTw7","BFkb8Vprf2","jiVBPEOE1o","mz8gx45cIH",
+"suY4xW3VFH","2TRI7taOXK","Ta8f6GWqqX","7lUXZQnJ1S","uN6r3n8pJ9","OxWIHFVMxo","pWiOsSWfou","zQt6QIRh48","5iGN5WPmlx","pAhR17hyVv",
+"LewvMCdyBV","jzUqRZzJHW","d85a90YAGH","aez9ys4786","gjUTuMkgy8","PYBf4MmKGJ","tjQxsBCxeC","OxWIHLewvM","FFDuiI7p2a","3weIFFwEJz",
+"bZLvSaFFss","hYBCKa00b5","wiHrZFGzgp","brhlQmX2GE","oVQp6WMiS3","Waim6Chuy3","AmdQdW7cTs","Yf2EccShY2","C2IrcKsjRK","JJs5mS2Dfu",
+"uQIczNcICA","vkCHHni2v1","L7cGc2ZHdk","SbRYyzQt6Q","0PktItAOsr","NOHszZzJHW","iqv4kOHaBz","WPmlxS2Dfu","TwanoRpBQm","HlUbFs93Ml",
+"Cp3mZIKxdL","zqH0WNxx9V","8FmFHMezSW","K4GS84W0Tl","yEfy92hEEU","OHaBzUl4a1","zHF1qLbRTH","0h1b1G1RhS","QChxshYBCK","C2Irc5nmWv",
+"uvf7AaL6AJ","7fsYMQbxXc","M6qcGNOHsz","J2mQihe9IA","pmeCdIRh48","FwEJzSs0Zu","gf8rIv1Hln","XflUqQworu","C2IrcMmKGJ","GXdoHzQt6Q",
+"b29RJdmoS7","Oz8yZFjHXR","2hEEUrz7Ut","WMiS3DcpWB","uupzkMmsIo","2NslmVjCZq","iwzGkDG4sT","pFrrlOUqFM","Chuy3IBe8k","e6e4zjzUqR",
+"lCMxyEdBKc","fFDrJmX2GE","X6PinBFkb8","atef2DG4sT","5ZaEz5Namm","0YAGH1LB1L","SjskQ3weIF","Twanosoy9t","tuDySHzZT8","fqypyrz7Ut",
+"MojnPfcwDa","AgJHQuupzk","DQimpBpYhV","djsrvVLTy6","uoStwyofH3","X6PinlViBv","tvdkDFwEJz","ZJTXHAkKTk","a00b5nlaBy","IjTwPQ6hMC",
+"prNT65drc6","uJScX6AFT0","IKxdLs4786","DG4sTiqv4k","Mm8siaL6AJ","Cp3mZgIYvE","uupzkvkCHH","pAhR1KsjRK","vLsmSlXFOB","EOE1oG1RhS",
+"NAFuwJXljW","O3iyQ8hJdt","NhXduy94nw","Gv3Fqs7Mxk","okgRidQ586","vOqCEuvf7A","VNCPdBCxeC","Y1mC0FGzgp","7fKYU8TxD7","RACuj2TRI7",
+"RsQUqazIWp","8TxD7DQimp","pFrrlFPfSE","ThjNnXyPZN","oQ87rFnPFB","Mm8siOz8yZ","ZUnqtWreyP","brhlQ7ku1p","VjCZqxciqp","lj07QZUnqt",
+"n8pJ9dpe1v","NOHszNAFuw","brhlQpT8wu","vkCHHNcICA","WMiS3iwzGk","gjUTuUvlv4","v8yFNFNYIM","ThjNnECMvU","zY1GYogLgc","RkQke14FLR",
+"YjB9tMmsIo","No0Qbuvf7A","jSjS3Rxrsm","9y4lwuoStw","5NammhE1Ql","gtCA5VLTy6","pv0i7gdQsS","suY4xuLtKs","KASQ8JJs5m","9GXkX8FmFH",
+"jfREuThjNn","GrDg79y4lw","29QAz5iGN5","ZJTXHS77LH","BGaQY5VZjS","CqqaDm4bxU","ni2v1lj07Q","jiVBP2ZHdk","oQ87rZ4I1v","5Drn0Oz8yZ",
+"e6e4z9eoRc","0KyfsuAWyp","YjB9ti3pyd","CxVEf0MR5X","hi5X7qUJMd","RpBQmFGzgp","cQOnvFPfSE","azIWpbgJAz","24ARFF6PT2","X6PinjSjS3",
+"tuDySF6PT2","aDGtS7fKYU","KsjRKfaHir","yEfy9piJSk","NOHszPOUYS","YjB9tksJby","M6qcGjeskS","LewvMlCMxy","JKWYRzbIYY","LbRTH9GXkX",
+"6AFT045cIH","4QMc96AFT0","uJScXb29RJ","JRJQBZhwG1","Waim6nFqik","h1zcH5Drn0","In3NSVIlwP","POUYSPb1pa","ogLgcHfyNQ","SWfouXyPZN",
+"FLsphBCxeC","JXljWdhSuH","zz4ZUlj07Q","pmeCdMkgy8","LDk6fQbxXc","24ARF2ZHdk","QClRLX6Pin","Z4I1vNOHsz","IRh48hYBCK","4W0TlECMvU",
+"cQOnvPb1pa","KZamHK4GS8","aez9yOUqFM","FnPFBdhSuH","m4bxUWPmlx","uupzkWmadA","GrDg7MojnP","dmoS72TRI7","HlUbFYjB9t","9y4lwvkCHH",
+"Ss0ZuKr8ys","jtn0X0ao3l","CdyBVOUqFM","TwanoRACuj","t98iWtl72W","uZPqgpvgjS","Kr8ysOxWIH","07n1cZuDtD","Kr8ysMm8si","xReecMK07Y",
+"aez9yjiVBP","AgJHQ5Drn0","t59lRWPmlx","CIShG16lHc","FNYIMqQxHP","uN6r3CqqaD","rhl0JO3iyQ","iwzGkhe9IA","soy9t8TxD7","fFDrJWmadA",
+"k85AeFFDui","lXFOBfLNg8","9GXkXPb1pa","8cVD33weIF","8RCUAaez9y","GrDg7qaofN","FjHXRFhtgl","kZANmlViBv","zFgtBru4UG","RpBQmgf8rI",
+"ni2v15iGN5","VIlwPChuy3","IBe8ksoy9t","RpBQm2ZHdk","Gv3Fqaez9y","8cVD314FLR","y94nwZv7z0","0ao3lUmaEv","QWxoTjeskS","pWiOsFjHXR",
+"JXljWlCMxy","yToGW07n1c","55rfB9XyT9","SbRYyZuDtD","BFkb8YOfrY","gIYvECdyBV","CxVEfM6qcG","brhlQfqypy","i7WMQYh1hF","hUTw75IhmG",
+"s47867ku1p","e6e4zpv0i7","k85AeOUqFM","45cIHfcwDa","yEfy9bgJAz","x3LDeIKxdL","NOHszlXFOB","M3zXLcQOnv","HP433o8Uyd","hE1QlRpBQm",
+"KASQ8gdQsS","kB5nPNOHsz","HP433FNYIM","GXdoHSs0Zu","taOXKGrDg7","iqv4koGu6x","v8yFNPYBf4","OUYuFZzJHW","FFDuiPYBf4","d85a9guMb8",
+"0MR5XQChxs","kZANmt98iW","StlDJiqv4k","guMb8djsrv","D6rByydG8U","NcICAuJScX","ZhwG1zHF1q","iB08lECMvU","MojnPRzaZA","d85a9xciqp",
+"hYBCKQWxoT","5IhmGpmeCd","WreyPMmKGJ","nFqikBbwgA","xXTI4FGzgp","FhtglYf2Ec","Kr8ysVLTy6","FFDuiUmaEv","CxVEfiqv4k","OHaBz4W0Tl",
+"QYxC0Z4I1v","EdBKc4QMc9","lweGyCdyBV","brhlQgjUTu","5VZjSs93Ml","uJScXC2Irc","gf8rI0h1b1","zY1GYWmadA","Cfgr3No0Qb","POUYS5ZaEz",
+"v2eC3uoStw","M3zXLsqVrf","cQOnvyvOMI","FGzgpI7p2a","AOgEeUlU3M","pT8wuwiHrZ","jiVBPa00b5","RsQUqcShY2","5Mg9rDz1R3","qaofN1LB1L",
+"qaofNn8pJ9","y94nwWMiS3","oGu6xAmdQd","CxVEfxciqp","6q6L9QChxs","FNYIMMK07Y","29QAz7Ow5C","TXQ0ZTCgPp","zqH0WgjUTu","zQt6QHlUbF",
+"lpF6WDz1R3","cQOnvIBe8k","Qworul83Ud","DcpWBjeskS","xReecWmadA","cShY264s8N","IBe8k24ARF","IjTwPlsQGo","3otm6POUYS","yEfy91j5L8",
+"dpe1vZ4I1v","HzZT8P6bcg","Cfgr3Mkgy8","faHirjiVBP","FcWrWU3yw5","rKDLJiB08l","zz4ZUjSjS3","zQt6QHfyNQ","taOXKoQ87r","mz8gxd7vjM",
+"he9IAOUYuF","0MR5XAmdQd","rhl0J0ao3l","MmKGJ2Yz7E","pAhR1CxVEf","h1zcHhE1Ql","NAFuwPOUYS","2ZHdkpWiOs","P6bcgi7WMQ","brhlQFhtgl",
+"2hEEUguMb8","2hEEU5IhmG","hSSvQQWxoT","8hJdtd85a9","WPmlxqQxHP","Oz8yZIn3NS","ydG8UpmeCd","sqVrfs4786","FxX9qQYxC0","Fhtgl48cHL",
+"RmDcr618Di","SjskQ14FLR","FNYIM24ARF","Zv7z0d7vjM","lkMUAsoy9t","NhXdugjUTu","rz7UtaL6AJ","tjQxs64s8N","v1HlnfmIK1","JkzUnv8yFN",
+"P6bcgxciqp","8hJdtTXQ0Z","Yf2EcmX2GE","nnP8oQWxoT","nlaByoGu6x","aDGtS1v5hH","GWqqXuN6r3","SmGzv2TRI7","lpF6WlpF6W","gtCA51v5hH",
+"5Drn0tAOsr","nnP8o1LB1L","POUYS5Mg9r","HfyNQHfyNQ","fFDrJgtCA5","FcWrWrz7Ut","yEfy9QssNC","JXljWRmDcr","rKDLJ6q6L9","jfREuQYxC0",
+"OUqFMatef2","jiVBPhYBCK","uJScXyvOMI","tjQxsBpYhV","2Yz7E55rfB","AOgEeQClRL","7X3uyLewvM","ZhwG1QnJ1S","8U2nUAkKTk","uvf7AOz8yZ",
+"KZamHeuZA5","5Namm5nmWv","fqypy2ZHdk","lH1ktRACuj","blLA9qQxHP","a00b5gjUTu","ogLgcfaHir","iKqhrm4bxU","FVMxoWreyP","GXdoHUlU3M",
+"9y4lw0Wr5y","Nxx9VpFrrl","EoToPs93Ml","soy9t6AFT0","Waim6QnJ1S","faHirpv0i7","XyPZNhE1Ql","t59lRsoy9t","07n1cAXpwE","pT8wuuTacx",
+"0MR5XtlILt","uoStwRpBQm","lViBvHP433","hi5X7IKxdL","ZuDtDs4786","iqv4kWreyP","n8pJ9FxX9q","9eoRcn1pmO","1v5hHAIYUu","gf8rIzY1GY",
+"RACujiqv4k","JXljWEoToP","BpYhVaL6AJ","HzZT8x3LDe","cQOnvi7WMQ","xXTI4CxVEf","zbIYYjS1aj","pAhR1rhl0J","ZhwG1yluBx","Cfgr3bgJAz",
+"ogLgclkMUA","Kr8ysvOqCE","dhSuHMmsIo","lj07Qpv0i7","t98iW4dEz6","Zv7z0jfREu","MezSW2DREs","IRh48h1zcH","FNYIMbgJAz","4dEz6CK5W7",
+"P6bcgYf2Ec","07n1caez9y","9XyT9fqypy","8xEKzKASQ8","CK5W7s4786","x3LDeOz8yZ","BCxeC3otm6","cmXIXJRJQB","dhSuHCqqaD","pv0i7wiHrZ",
+"VerEAY1mC0","QnJ1SxXTI4","Y1mC0RzaZA","iB08lMezSW","Ul4a1VLTy6","RpBQm48cHL","VNCPd7fsYM","2Yz7EXyPZN","LbRTHdhSuH","b29RJM3zXL",
+"djsrvBCxeC","zHF1qFjHXR","7lUXZsoy9t","StlDJFjHXR","BCxeC0PktI","P6bcgRzaZA","CxVEfDcpWB","HfyNQQYxC0","euZA5Fhtgl","No0QbVjCZq",
+"pmeCd8TxD7","JKWYRLbRTH","b29RJuoStw","Dz1R3uTacx","yToGWUvlv4","AmdQdokgRi","Gv3FqXflUq","RsQUquTacx","7Ow5C8FmFH","MmKGJMezSW",
+"Cp3mZiB08l","kZANm45cIH","Gv3FqPYBf4","S2DfuJIqXi","iqv4kM6qcG","DQimp0ao3l","lsQGoTXQ0Z","EoToPS2Dfu","9GXkXMkgy8","OxWIH0Kyfs",
+"ulk419eoRc","7fKYUYf2Ec","QssNCwiHrZ","FhtglAOgEe","3otm65VZjS","BCxeCEoToP","ksJbyNhXdu","piJSkYh1hF","VLTy6zz4ZU","LbRTHDz1R3",
+"okgRilViBv","vkCHH5Namm","RBhp0WreyP","gf8rICfgr3","v8yFNMm8si","9y4lw14FLR","lkMUAzmLYD","4dEz6HP433","nlaByzqH0W","8cVD3SWfou",
+"hE1Ql2hEEU","k85Ae0YAGH","y94nwzQt6Q","v1HlnlsQGo","7X3uyFPfSE","gf8rI2hEEU","pv0i79rlg9","okgRi2hEEU","pv0i7IjTwP","wiHrZfqypy",
+"fFDrJ29QAz","kB5nP6q6L9","lweGyMkgy8","cL0aEQWxoT","VBjhzsx5Gl","AOgEesqVrf","9XyT9RkQke","U3yw5EOE1o","ZJTXH5nmWv","lweGysuY4x",
+"RpBQmFFDui","wiHrZQYxC0","In3NSTCgPp","9GXkX618Di","DQimpiqv4k","rKDLJ29QAz","FjHXRiqv4k","JkzUnO3iyQ","07n1cWDVWJ","8FmFHs4786",
+"QssNCsoy9t","14FLRFGzgp","FFDui580YD","IKxdLUl4a1","0PktIOUqFM","uPX7GK4GS8","K20wKbrhlQ","x3LDegjUTu","XflUqMK07Y","fcwDab29RJ",
+"U3yw50ao3l","soy9tkB5nP","CIShGJ2mQi","DG4sT8RCUA","bZLvS0ao3l","PYBf4FFDui","0KyfsSs0Zu","MmsIo1LB1L","5IhmG9rlg9","Fhtglh1zcH",
+"Kr8ysuJScX","t59lRMojnP","v1HlnazIWp","VerEAulk41","618DiMojnP","Zv7z0qUJMd","pT8wupvgjS","azIWpgIYvE","I7p2aSjskQ","KZamHiB08l",
+"DcpWB9GXkX","WaWsvGWqqX","brhlQ7fKYU","M6qcGzHF1q","Gv3FqB3qem","55rfBTa8f6","G1RhSd7vjM","GXdoH3otm6","BpYhV8hJdt","okgRiBCxeC",
+"7ku1pazIWp","gdQsSv1Hln","SjskQlkMUA","QbxXcs7Mxk","VBjhzIKxdL","ciuWzix74r","HzZT8sx5Gl","sx5GlyEfy9","nFqikk85Ae","GSQwjzqH0W",
+"GrDg7zmLYD","rz7UtWaim6","Yh1hFyvOMI","MezSWkB5nP","hSSvQtaOXK","JJs5mQbxXc","FLsphgtCA5","XyPZNECMvU","LbRTHjzUqR","2Yz7EzY1GY",
+"zmLYDX6Pin","uJScXfqypy","uN6r3XyPZN","uZPqgokgRi","48cHLsx5Gl","Yh1hFzHF1q","Vprf26q6L9","zbIYYxXTI4","BbwgAIRh48","fcwDaatef2",
+"s93MltjQxs","VLTy6QnJ1S","dhSuHcShY2","JRJQBYf2Ec","M6qcGJkzUn","gdQsSfqypy","GSQwjQChxs","Ss0ZunnP8o","pv0i7lCMxy","7X3uyMezSW",
+"BpYhVGSQwj","vkCHHJIqXi","YjB9tfcJOy","JXljW55rfB","v1Hlnuvf7A","o8UydRzaZA","gtCA52TRI7","SWfoucL0aE","QnJ1SHlUbF","MmKGJk85Ae",
+"v2eC3XflUq","CdyBVVerEA","5IhmGZv7z0","GWqqX64s8N","U3yw5n1pmO","QChxsPb1pa","Oz8yZogLgc","No0QblXFOB","ZhwG1ulk41","Mm8si9iGoT",
+"jS1ajjzUqR","MojnPIKxdL","mz8gxpvgjS","SWfoum4bxU","RBhp0LDk6f","JXljWl83Ud","IKxdL16lHc","n8pJ9IRh48","EdBKc8TxD7","AgJHQ1v5hH",
+"7Ow5ClkMUA","ECMvUv2eC3","U3yw5VLTy6","9eoRcfFDrJ","QnJ1Sd7vjM","Gv3FqTCgPp","7fsYMFNYIM","WMiS3ciuWz","0ao3lAIYUu","7ku1pjS1aj",
+"uLtKsblLA9","s93MlFhtgl","F6PT20MR5X","hi5X77Ow5C","GXdoHtuDyS","e6e4zdpe1v","5IhmGni2v1","ulk41uN6r3","Mm8siEoToP","1LB1L618Di",
+"MK07YpT8wu","EOE1oiwzGk","yToGW2ZHdk","KZamHnnP8o","Mm8siguMb8","BFkb8FjHXR","SWfouBbwgA","jfREuBGaQY","y94nwYOfrY","vOqCEuLtKs",
+"3otm6Mm8si","OUqFMpFrrl","Waim6lsQGo","Z4I1vCNHmv","rKDLJWPmlx","WaWsvrhl0J","jzUqRpv0i7","U3yw5MGlTF","DQimpMmKGJ","jSjS30Kyfs",
+"kZANmfcJOy","hi5X7F6PT2","pv0i7IKxdL","CNHmvS77LH","lm0pDAgJHQ","rz7UtdmoS7","n1pmOfLNg8","xReecFnPFB","5drc6CK5W7","AIYUuNhXdu",
+"v2eC3v1Hln","BCxeCFnPFB","IRh48Uvlv4","xXTI4zY1GY","pFrrlStlDJ","WPmlxUvlv4","FcWrWQworu","hi5X71v5hH","dpe1vuvf7A","W7cTsVerEA",
+"OHaBzdQ586","hUTw7nlaBy","ECMvUMGlTF","Yw2oUlViBv","ogLgctuDyS","oGu6xv1Hln","SbRYylm0pD","dQ586Rxrsm","5Mg9rfaHir","Waim6lpF6W",
+"tvdkDVerEA","IjTwP45cIH","QssNCYf2Ec","dQ586blLA9","cQOnv0YAGH","OUYuFAgJHQ","QbxXcx3LDe","Ta8f68TxD7","n1pmOaFFss","cShY2AXpwE",
+"3weIFl83Ud","uTacxYOfrY","QClRLs7Mxk","KsjRKuZPqg","45cIHpWiOs","FcWrWRACuj","piJSkMojnP","F6PT2jSjS3","IBe8kfqypy","L7cGcaDGtS",
+"o8UydZUnqt","RkQkelH1kt","8xEKzrKDLJ","J2mQi7lUXZ","DLhzMydG8U","zz4ZUyvOMI","0Kyfs618Di","Y1mC0HzZT8","zbIYYAIYUu","ThjNnMezSW",
+"5nmWvQClRL","zHF1q1v5hH","l83UdB3qem","tlILtt59lR","lXFOB45cIH","Waim6No0Qb","EdBKcFGzgp","jeskSm4bxU","1j5L8zqH0W","k85AeS2Dfu",
+"hE1QlD6rBy","5IhmGFhtgl","0MR5XVIlwP","uQIcz2TRI7","618DipmeCd","KZamHCqqaD","SmGzvqQxHP","9y4lwTa8f6","ZJTXHFLsph","9XyT9uQIcz",
+"O3iyQ55rfB","EoToPtlILt","VjCZqCqqaD","ru4UGAIYUu","YOfrY5Drn0","JKWYRhSSvQ","aez9yYf2Ec","x3LDeuAWyp","uvf7ARpBQm","yvOMIECMvU",
+"fmIK1zHF1q","Zv7z0s93Ml","Vprf2ZuDtD","9eoRcjSjS3","8RCUA9eoRc","3otm6HRxd8","UlU3MCxVEf","EdBKcprNT6","Waim6Rxrsm","ZzJHW9iGoT",
+"t98iWlH1kt","ciuWzm4bxU","l83UdCqqaD","gIYvEyvOMI","L7cGcVBjhz","L7cGcZJTXH","FNYIMlXFOB","07n1cjSjS3","YjB9tVNCPd","5drc6EOE1o",
+"he9IAazIWp","VerEAtjQxs","9XyT9hE1Ql","IBe8ks4786","uQIcz580YD","qaofNDcpWB","NcICADQimp","blLA9cShY2","Kr8ysWMiS3","0BmCyiKqhr",
+"dmoS7qaofN","14FLR2DREs","gtCA5TCgPp","jzUqRuLtKs","aL6AJhYBCK","n8pJ9PYBf4","WaWsvCqqaD","GXdoHRzaZA","fLNg8VBjhz","n8pJ9Nxx9V",
+"2TRI7FcWrW","POUYSvOqCE","uQIczlsQGo","Chuy3Yh1hF","iwzGkFjHXR","wiHrZ5Drn0","iB08lHzZT8","CK5W7J2mQi","JXljWPOUYS","B3qemChuy3",
+"tvdkDVprf2","gtCA5AXpwE","Ss0ZuFcWrW","iqv4kMmsIo","DQimpVerEA","oVQp69eoRc","Q6LixNAFuw","M6qcGfaHir","Dz1R3fcJOy","aFFssWDVWJ",
+"1v5hHtlILt","xciqp8FmFH","zY1GYI7p2a","RsQUqFNYIM","gf8rI5iGN5","U3yw51v5hH","hUTw7uZPqg","MK07YEoToP","dmoS7uPX7G","taOXKn1pmO",
+"yToGWNo0Qb","EdBKcm4bxU","DcpWB29QAz","AIYUuCK5W7","HRxd83otm6","lj07QyluBx","fcwDazQt6Q","QYxC02Nslm","MmKGJ580YD","WreyP580YD",
+"dQ586Nxx9V","9eoRcdmoS7","yvOMIy94nw","lCMxyYf2Ec","Uvlv4CNHmv","ZJTXHVerEA","G1RhS7lUXZ","64s8NfcJOy","0h1b15IhmG","OHaBzsoy9t",
+"oGu6x8RCUA","2TRI7Mm8si","tAOsrvLsmS","VNCPd2Yz7E","RxrsmazIWp","YOfrYEOE1o","QClRLIn3NS","pmeCd0Kyfs","n8pJ9GrDg7","v2eC3hYBCK",
+"ksJbyYjB9t","FGzgpDG4sT","JXljWhE1Ql","faHirfaHir","I7p2a0MR5X","XflUqO3iyQ","4QMc9VBjhz","dpe1vlkMUA","dpe1vVerEA","8U2nUGv3Fq",
+"3weIFEdBKc","580YDU3yw5","ydG8URBhp0","zz4ZU5nmWv","ru4UGU3yw5","zmLYD5nmWv","qUJMdzz4ZU","LDk6fM3zXL","dmoS7djsrv","jtn0XFxX9q",
+"WDVWJxciqp","HfyNQJXljW","RsQUqQ6Lix","ksJbypWiOs","VerEAKr8ys","UlU3MbgJAz","4dEz6EOE1o","FxX9qVerEA","sqVrfaDGtS","fqypyMmKGJ",
+"0KyfsG1RhS","8FmFHyluBx","t98iWfFDrJ","580YDvOqCE","xReecdmoS7","ru4UGuQIcz","qQxHP2hEEU","GXdoH2Yz7E","faHirY1mC0","MmsIodhSuH",
+"FVMxojzUqR","MmKGJYh1hF","RxrsmCIShG","QWxoTzbIYY","yvOMIaDGtS","FVMxo16lHc","m4bxUhYBCK","PYBf4LewvM","0KyfshUTw7","Yw2oUvLsmS",
+"Z4I1vHlUbF","Yw2oUnFqik","Ta8f6yofH3","RACujiB08l","BFkb8HRxd8","9eoRcru4UG","lViBvlsQGo","MmsIoatef2","07n1c2Nslm","FVMxoZhwG1",
+"ksJby55rfB","mX2GEciuWz","oGu6xQssNC","RsQUqHzZT8","xciqpUl4a1","pAhR1Qworu","LDk6fRmDcr","cShY27ku1p","l83UdNhXdu","EOE1oIn3NS",
+"QbxXclViBv","Yw2oU9iGoT","xXTI4s93Ml","0PktIlViBv","Yh1hFMm8si","NhXduzQt6Q","DG4sTblLA9","DQimpxReec","BCxeCv1Hln","P6bcgWmadA",
+"In3NSuPX7G","7Ow5C0YAGH","7ku1p4QMc9","cL0aEVprf2","gjUTublLA9","prNT6HzZT8","gtCA5bZLvS","sx5GlMm8si","i3pyduoStw","ru4UGRACuj",
+"7ku1pVjCZq","QbxXczFgtB","BbwgANAFuw","v2eC3VLTy6","prNT6pWiOs","MK07YO3iyQ","9y4lwIKxdL","VNCPdd7vjM","JRJQBnlaBy","ReKEWyToGW",
+"jeskSQYxC0","F6PT2okgRi","dpe1vdQ586","l83Ud0Wr5y","v2eC3QbxXc","aL6AJcL0aE","AOgEeXflUq","tAOsrtaOXK","DcpWBCdyBV","5drc6S2Dfu",
+"yofH3PYBf4","euZA58U2nU","pvgjSjfREu","brhlQd7vjM","a00b5F6PT2","RxrsmAmdQd","0MR5Xe6e4z","jS1ajzz4ZU","lm0pDlViBv","rz7Ut45cIH",
+"NAFuwn1pmO","xXTI4gf8rI","29QAzHP433","NOHszgjUTu","JKWYRDG4sT","uLtKsTXQ0Z","dmoS7VjCZq","PYBf4GSQwj","4QMc9lViBv","5IhmGaL6AJ",
+"Kr8ys2ZHdk","nnP8oWaim6","lm0pDgf8rI","iwzGkSjskQ","B3qemMmKGJ","CxVEfAXpwE","JXljWuZPqg","EdBKcMm8si","QssNCCK5W7","lH1ktS2Dfu",
+"9XyT9FGzgp","aL6AJNxx9V","MojnPIBe8k","HRxd8Yh1hF","LewvMP6bcg","he9IAcL0aE","9XyT9ZuDtD","C2IrcCIShG","5Drn0RpBQm","jiVBPzqH0W",
+"C2IrcMm8si","WaWsvRzaZA","hUTw7BpYhV","pv0i7bgJAz","VBjhzMkgy8","J2mQiazIWp","G1RhSFxX9q","M6qcGOxWIH","zbIYYXflUq","GXdoHAXpwE",
+"zQt6Qmz8gx","4QMc9yvOMI","JIqXiHRxd8","DG4sTHzZT8","CxVEfFNYIM","DG4sTJKWYR","TCgPpZzJHW","Mm8siYjB9t","kZANmS77LH","LbRTH55rfB",
+"No0Qb24ARF","0ao3l0PktI","bgJAzZ4I1v","0KyfsSjskQ","5IhmGyvOMI","VLTy65VZjS","UmaEv5Mg9r","Ul4a1Z4I1v","OHaBzhi5X7","JJs5myofH3",
+"okgRicQOnv","VjCZqLbRTH","2Nslmrhl0J","WmadAzFgtB","4W0Tlhi5X7","l83Ud07n1c","zmLYDTwano","4QMc98xEKz","GrDg7s7Mxk","wiHrZZUnqt",
+"gtCA5lm0pD","sqVrfK4GS8","Zv7z09rlg9","XflUqrhl0J","Nxx9VfcJOy","7ku1pVerEA","fLNg8lpF6W","pFrrlXflUq","aez9yUmaEv","LewvMVBjhz",
+"oQ87rC2Irc","StlDJJJs5m","bZLvSDcpWB","qaofNThjNn","16lHcvkCHH","xReecpAhR1","ru4UGI7p2a","9eoRcnlaBy","IRh489XyT9","6AFT0RpBQm",
+"ZJTXHNhXdu","Mm8siFGzgp","7X3uyuPX7G","iwzGknlaBy","14FLRZUnqt","bgJAzS2Dfu","5iGN5djsrv","ZuDtDpWiOs","uJScXfaHir","WPmlxOxWIH",
+"FjHXRVjCZq","BpYhVU3yw5","AIYUulViBv","tuDySECMvU","uAWypjiVBP","zQt6QVprf2","YOfrYCxVEf","Kr8ys7Ow5C","In3NSThjNn","8RCUAv1Hln",
+"3otm6IRh48","dhSuHzFgtB","P6bcgUmaEv","taOXKCxVEf","GWqqXI7p2a","yluBxwiHrZ","MaJQsHzZT8","xReectjQxs","oGu6x9rlg9","5iGN5Rxrsm",
+"9GXkX16lHc","QworudhSuH","AXpwE6q6L9","gIYvEuTacx","29QAzXyPZN","JRJQBNo0Qb","I7p2auN6r3","cmXIXxciqp","SWfou7fsYM","dQ5867hyVv",
+"nlaByOz8yZ","9eoRclkMUA","s4786WPmlx","t98iWaez9y","zqH0W3weIF","rhl0JCfgr3","EoToPydG8U","Chuy3lweGy","0YAGHdQ586","RxrsmhUTw7",
+"lkMUADG4sT","9XyT9uoStw","NcICANxx9V","o8Uyd4dEz6","WMiS3vLsmS","taOXKBbwgA","Nxx9ViwzGk","hYBCK8RCUA","rhl0JFxX9q","OxWIHHzZT8",
+"ulk41mz8gx","jfREuK20wK","9iGoTVjCZq","UmaEvdpe1v","ReKEWkZANm","iKqhrJ2mQi","gf8rIZv7z0","iwzGks4786","RACujwiHrZ","uvf7A8FmFH",
+"ydG8UtuDyS","0MR5XuLtKs","hSSvQm4bxU","OUYuFyofH3","EOE1oIKxdL","WaWsvogLgc","pWiOsM3zXL","rhl0JtaOXK","lpF6WdhSuH","GXdoHlCMxy",
+"jSjS3GSQwj","TCgPpe6e4z","EOE1odQ586","7fsYM7hyVv","gjUTuNhXdu","wDajXbgJAz","618DiCfgr3","i7WMQo8Uyd","HzZT8BCxeC","BCxeC7fsYM",
+"QworuiKqhr","M6qcGuupzk","Q6hMC5nmWv","8TxD7ZUnqt","DQimphYBCK","a00b5blLA9","24ARFvkCHH","SmGzvnlaBy","Q6hMClpF6W","Cp3mZprNT6",
+"s4786pv0i7","uTacxVBjhz","HP433mX2GE","yvOMIYh1hF","wiHrZi7WMQ","XflUq1j5L8","i3pydMezSW","hi5X77lUXZ","CNHmvZv7z0","pmeCdjzUqR",
+"QworuCIShG","bZLvSVprf2","dhSuHG1RhS","UlU3MIKxdL","C2IrczbIYY","Yw2oUjSjS3","AIYUulH1kt","euZA5n8pJ9","O3iyQQYxC0","L7cGcDcpWB",
+"In3NSjiVBP","EdBKculk41","he9IAUlU3M","F6PT2AkKTk","Vprf27lUXZ","Ss0Zulj07Q","IRh48Yw2oU","nFqikP6bcg","QnJ1SRkQke","In3NSZUnqt",
+"0KyfsK4GS8","uQIczoGu6x","pv0i7SjskQ","FVMxoEOE1o","In3NS5Namm","1j5L8kZANm","Y1mC01LB1L","KASQ8IRh48","6q6L9ksJby","l83UdSjskQ",
+"s93MlguMb8","QworuMojnP","cShY2uPX7G","JRJQBoGu6x","fFDrJ5Mg9r","QChxsZv7z0","BpYhVwiHrZ","SmGzvpFrrl","ru4UGoQ87r","RsQUq55rfB",
+"jeskS5Mg9r","RACujVIlwP","Yh1hFcQOnv","DQimpYw2oU","iKqhrazIWp","pFrrl4QMc9","ZhwG1dpe1v","kZANmJkzUn","zHF1q8TxD7","rhl0JFnPFB",
+"StlDJ7lUXZ","blLA9n8pJ9","yToGWuupzk","S77LHECMvU","lsQGoaDGtS","Yw2oU0Kyfs","zqH0WzmLYD","AXpwEtlILt","qaofNfLNg8","dmoS7Cfgr3",
+"G1RhSFnPFB","ThjNn0Kyfs","a00b50YAGH","jzUqRs93Ml","iB08lm4bxU","AXpwE7fKYU","MojnP45cIH","djsrvfaHir","1LB1L4dEz6","aFFssfLNg8",
+"29QAz7hyVv","bgJAzZv7z0","SbRYyrz7Ut","M3zXL07n1c","LbRTH2ZHdk","QssNCdQ586","oVQp6NAFuw","CqqaDChuy3","n1pmOC2Irc","s4786fqypy",
+"wDajXhYBCK","8FmFHTCgPp","zbIYYBFkb8","ulk41Kr8ys","Nxx9V55rfB","580YDsx5Gl","G1RhS8FmFH","0KyfsFNYIM","9eoRcbgJAz","zbIYYRzaZA",
+"Dz1R31j5L8","Yf2EcBbwgA","qUJMd7fKYU","faHir0h1b1","AIYUuVLTy6","Ss0Zu8hJdt","Yf2EcWreyP","fLNg80BmCy","LbRTHzmLYD","OUqFMKsjRK",
+"ksJbyBCxeC","s7Mxk29QAz","UlU3M7fKYU","G1RhS7ku1p","tvdkDQ6hMC","GWqqXCIShG","AOgEeRzaZA","C2IrcOz8yZ","4dEz6HlUbF","BCxeCMezSW",
+"vLsmSdpe1v","YjB9t4QMc9","9y4lwyofH3","ulk41jeskS","XflUqWMiS3","pT8wuECMvU","Mkgy8uLtKs","NOHszIn3NS","dQ586GrDg7","wiHrZM3zXL",
+"xciqpEdBKc","RBhp0pvgjS","X6PinPYBf4","0Wr5yGv3Fq","Ul4a1hYBCK","W7cTs0PktI","taOXKMmsIo","Cp3mZlweGy","b29RJNxx9V","NcICAhe9IA",
+"5Mg9rBCxeC","ReKEWIjTwP","Mkgy8iwzGk","IKxdL0MR5X","UmaEvxReec","Chuy3kZANm","Z4I1vGXdoH","YOfrYrKDLJ","NOHszBCxeC","uupzkThjNn",
+"okgRiprNT6","v2eC3blLA9","RACuj8xEKz","ZzJHW9XyT9","24ARFNhXdu","XyPZNPYBf4","Fhtgluvf7A","AXpwEyluBx","qaofNP6bcg","AIYUukZANm",
+"M6qcGO3iyQ","9eoRcB3qem","jfREuVBjhz","SmGzvhUTw7","MezSWix74r","QssNCVerEA","2TRI7tvdkD","24ARFZhwG1","blLA9vkCHH","Yw2oUPb1pa",
+"y94nw5Drn0","bZLvSrz7Ut","OHaBz2TRI7","07n1cDQimp","IRh48Cfgr3","G1RhSJIqXi","KASQ8O3iyQ","KASQ8W7cTs","pmeCdQworu","Nxx9VIn3NS",
+"fLNg87Ow5C","CIShGSjskQ","zY1GYUvlv4","Nxx9Vru4UG","ZuDtDwiHrZ","TCgPpi3pyd","29QAzI7p2a","0Wr5ygtCA5","zQt6QSbRYy","k85AenFqik",
+"cmXIXWPmlx","bZLvSPYBf4","Gv3Fq8cVD3","IjTwPS77LH","9iGoTsuY4x","8RCUAWPmlx","Uvlv4ReKEW","FnPFBWPmlx","GSQwj8FmFH","AmdQdjfREu",
+"b29RJs93Ml","ZzJHWIn3NS","3otm6DQimp","uLtKsNAFuw","lm0pDPb1pa","D6rByulk41","sqVrfCdyBV","POUYSrKDLJ","0h1b1WDVWJ","MaJQs9rlg9",
+"yToGWsuY4x","yofH3fqypy","zqH0Wb29RJ","s4786jSjS3","ciuWzQYxC0","yToGWMezSW","GXdoHvkCHH","pAhR1IRh48","OHaBz5Mg9r","RmDcrxciqp",
+"lm0pDuQIcz","48cHLqUJMd","oQ87rThjNn","MaJQsh1zcH","rz7UtfmIK1","TXQ0Z45cIH","OxWIHWDVWJ","IjTwPZJTXH","RxrsmKsjRK","FjHXR0h1b1",
+"Yf2EcMojnP","Q6LixokgRi","t98iWX6Pin","pT8wuDQimp","MojnPlViBv","7X3uy0BmCy","jzUqRlXFOB","t59lRuAWyp","O3iyQiKqhr","ydG8UWDVWJ",
+"SbRYy7hyVv","lj07QK20wK","5ZaEzGrDg7","lj07QZ4I1v","AmdQdjS1aj","NhXdu0BmCy","Nxx9VWmadA","8U2nUYf2Ec","MezSWS2Dfu","l83Ud9iGoT",
+"xciqpZv7z0","lkMUAt98iW","dQ5868hJdt","AmdQdix74r","rhl0JRkQke","BpYhVGWqqX","S77LHMmKGJ","iqv4kCfgr3","y94nwK4GS8","FnPFBTwano",
+"zz4ZUQbxXc","Ss0ZuJKWYR","4W0Tl8FmFH","0YAGHMezSW","he9IA6q6L9","soy9tNhXdu","FGzgpxXTI4","gdQsSlpF6W","5IhmG0BmCy","G1RhSCp3mZ",
+"tAOsryluBx","zmLYDJKWYR","MmKGJFcWrW","Mm8siCqqaD","J2mQiW7cTs","BpYhV14FLR","tAOsrguMb8","nnP8on8pJ9","NcICAThjNn","oQ87rGWqqX",
+"FGzgpqQxHP","3weIFzHF1q","K4GS8S2Dfu","Gv3Fqmz8gx","lweGyzqH0W","0KyfsStlDJ","8U2nUgf8rI","gtCA5hi5X7","nFqikQWxoT","7fKYU14FLR",
+"yEfy9uoStw","8U2nUPOUYS","pWiOsFxX9q","5drc6FjHXR","djsrvS2Dfu","No0QbFFDui","RmDcrVprf2","lXFOB2Nslm","In3NS580YD","AkKTkAmdQd",
+"WreyPtaOXK","SjskQ0BmCy","Ul4a19GXkX","uvf7A9rlg9","hYBCKlsQGo","hSSvQOxWIH","soy9tJkzUn","HP433XflUq","lH1kt55rfB","ZhwG1JKWYR",
+"5nmWvjtn0X","cL0aEzbIYY","ksJbyUmaEv","dpe1v0h1b1","ZJTXHs7Mxk","NOHszyEfy9","VBjhznnP8o","1v5hH7fsYM","Uvlv48U2nU","G1RhSh1zcH",
+"CK5W72hEEU","blLA9n1pmO","faHirCIShG","JKWYRReKEW","lweGyNcICA","VIlwPQ6hMC","FwEJzs93Ml","J2mQiDcpWB","Dz1R3cL0aE","QYxC05nmWv",
+"oQ87rbZLvS","FcWrWkB5nP","8FmFHuupzk","GSQwjlm0pD","OHaBzl83Ud","CxVEfP6bcg","NhXdudhSuH","ogLgcjiVBP","ciuWz16lHc","Chuy3ZJTXH",
+"aez9yTwano","uvf7A7Ow5C","UlU3MfcJOy","O3iyQfmIK1","n8pJ93weIF","DQimpChuy3","gjUTuzFgtB","iKqhrTCgPp","i3pydAkKTk","In3NS7hyVv",
+"kB5nPfFDrJ","MezSWOHaBz","uN6r3qUJMd","AXpwEVNCPd","jiVBPfFDrJ","s47863weIF","xciqp9y4lw","MGlTFjSjS3","EoToPpiJSk","mz8gxjzUqR",
+"cQOnvIKxdL","K20wKQClRL","0MR5XEdBKc","zmLYD7lUXZ","D6rByxXTI4","7X3uyP6bcg","lH1ktwiHrZ","FwEJzqUJMd","Vprf2prNT6","JXljWJKWYR",
+"ReKEW7ku1p","atef214FLR","Y1mC0QnJ1S","Yh1hFy94nw","618DiGrDg7","9eoRcs7Mxk","7lUXZ64s8N","PYBf4L7cGc","Z4I1vOz8yZ","YOfrYsuY4x",
+"uN6r3U3yw5","6q6L9tl72W","ECMvUtvdkD","SjskQtvdkD","lViBvCp3mZ","FwEJztjQxs","8xEKzlkMUA","JRJQBuZPqg","5VZjSiB08l","9XyT9RACuj",
+"azIWpPb1pa","NcICAdjsrv","9XyT9FxX9q","DLhzMG1RhS","jzUqRZuDtD","BCxeCiqv4k","nlaBy5Drn0","RmDcrhe9IA","GSQwjjS1aj","tuDySWDVWJ",
+"suY4xFjHXR","DQimp6AFT0","oQ87rix74r","v1Hlnhe9IA","Ul4a1NcICA","29QAzWDVWJ","In3NSaL6AJ","ZzJHWrKDLJ","qUJMd5IhmG","8xEKzDz1R3",
+"lViBvuupzk","M3zXLkZANm","S2DfuIBe8k","64s8NXflUq","8FmFHzY1GY","djsrvfLNg8","No0QbjSjS3","Oz8yZYjB9t","he9IA29QAz","GWqqXZhwG1",
+"0MR5XHlUbF","ix74rTXQ0Z","rz7UtgIYvE","BpYhVCp3mZ","pv0i7yofH3","P6bcgLewvM","ulk41zz4ZU","ru4UG29QAz","0YAGHJRJQB","0PktIIRh48",
+"IKxdL45cIH","ciuWzM6qcG","5VZjSa00b5","0Wr5ykZANm","jzUqRuupzk","HRxd8MGlTF","iwzGkuQIcz","uZPqgFcWrW","NcICA6AFT0","CqqaDcQOnv",
+"MGlTFNo0Qb","vOqCEmX2GE","uJScXOHaBz","CIShGtaOXK","iKqhr1LB1L","uQIcznFqik","jeskSuupzk","DQimpVNCPd","7fKYUulk41","t59lRRpBQm",
+"UmaEvUvlv4","8hJdtJJs5m","yEfy9nFqik","7X3uyWPmlx","0KyfsciuWz","pmeCd2hEEU","jeskSQnJ1S","yofH3zQt6Q","zqH0WFcWrW","pT8wuuN6r3",
+"WMiS329QAz","IRh48pvgjS","hSSvQCqqaD","uN6r3VLTy6","07n1cwiHrZ","5nmWvVLTy6","b29RJ5drc6","LewvMVprf2","mX2GEIn3NS","ni2v1O3iyQ",
+"RkQkexciqp","DQimp5IhmG","kB5nPuJScX","X6PinMaJQs","zHF1qThjNn","7fsYM14FLR","4dEz6yofH3","VNCPdzqH0W","uLtKsFxX9q","M3zXLyvOMI",
+"QbxXcWreyP","nnP8odjsrv","FNYIMMkgy8","jeskSvLsmS","SjskQXyPZN","K4GS85Mg9r","fqypyo8Uyd","FLsphuPX7G","9eoRcU3yw5","uN6r3HlUbF",
+"24ARFFnPFB","tl72W45cIH","0Wr5yXyPZN","n8pJ9i3pyd","Waim6iB08l","0h1b1RkQke","WPmlxAXpwE","lkMUA2DREs","XflUqCfgr3","VIlwPzz4ZU",
+"BFkb8kB5nP","gdQsSS77LH","ZuDtDaFFss","yEfy9F6PT2","Mkgy8KZamH","9XyT9ulk41","W3VFHPOUYS","07n1catef2","iqv4khUTw7","WDVWJn8pJ9",
+"HlUbF3weIF","FFDui5drc6","soy9t7fsYM","WreyPaDGtS","B3qemUlU3M","uvf7AFnPFB","RxrsmgjUTu","DcpWBlweGy","7lUXZlCMxy","WDVWJtlILt",
+"XyPZNCfgr3","FxX9qDcpWB","b29RJqUJMd","M3zXLuupzk","t98iW2hEEU","lj07QUvlv4","Ta8f6580YD","ZzJHWLewvM","48cHLlweGy","FPfSEJRJQB",
+"cL0aEaez9y","pAhR1CK5W7","TXQ0ZprNT6","8RCUAJJs5m","RBhp0x3LDe","BbwgADLhzM","VerEAjSjS3","suY4xpiJSk","EoToPulk41","jeskS1v5hH",
+"AIYUux3LDe","LDk6fBbwgA","RACuj1LB1L","s4786djsrv","8U2nUcmXIX","0h1b1M3zXL","2ZHdkix74r","MojnPdhSuH","Y1mC0s93Ml","soy9tyofH3",
+"OUYuFjSjS3","8cVD3zbIYY","djsrv5Namm","uJScX7fsYM","NOHszprNT6","RzaZAMmsIo","AXpwEvkCHH","WmadA4W0Tl","QnJ1SnFqik","IRh48Mm8si",
+"rz7Utjtn0X","uTacxNo0Qb","JkzUn618Di","UmaEvJXljW","t59lRtaOXK","o8UyddmoS7","brhlQ5Drn0","5iGN5LbRTH","fcJOy9eoRc","ZhwG1v1Hln",
+"QssNCWDVWJ","cQOnvYjB9t","euZA57X3uy","taOXKs7Mxk","7fsYMYf2Ec","iKqhrvkCHH","RzaZA5drc6","ni2v1FxX9q","AOgEeFPfSE","s93MlOz8yZ",
+"M6qcGRxrsm","F6PT20PktI","wDajXChuy3","Dz1R3I7p2a","5Mg9rk85Ae","wiHrZWMiS3","MmsIo9y4lw","CdyBV6q6L9","BpYhVM3zXL","AXpwE9y4lw",
+"16lHcvLsmS","Waim6tuDyS","Nxx9VgdQsS","lj07QjfREu","l83UdkZANm","1j5L8dhSuH","RxrsmVerEA","IBe8k9iGoT","QnJ1SQssNC","FcWrW5nmWv",
+"YjB9tOUqFM","FwEJzZUnqt","a00b5pT8wu","zY1GYuZPqg","O3iyQF6PT2","9iGoTblLA9","JkzUnL7cGc","ydG8UfmIK1","P6bcgNOHsz","SbRYyIBe8k",
+"lsQGoVjCZq","FNYIMRsQUq","5ZaEz8RCUA","he9IAHP433","pv0i7y94nw","JIqXix3LDe","0h1b1JIqXi","VerEAkZANm","gf8rIprNT6","RACujQWxoT",
+"MojnPfFDrJ","taOXKFxX9q","xXTI4JKWYR","taOXK9iGoT","RACujD6rBy","4dEz6dmoS7","FVMxolH1kt","wiHrZBGaQY","LbRTHUvlv4","WMiS3580YD",
+"M3zXLW3VFH","v1HlnAIYUu","7lUXZCqqaD","ThjNnW7cTs","xciqp0Wr5y","jeskS9rlg9","tvdkDUl4a1","uvf7A1j5L8","euZA5Waim6","uTacxa00b5",
+"MaJQsFjHXR","CdyBVY1mC0","8xEKzQbxXc","1v5hHNOHsz","24ARFdjsrv","n8pJ9SjskQ","cQOnv5VZjS","EOE1oguMb8","AOgEeJXljW","QbxXchE1Ql",
+"jeskSpFrrl","uvf7Al83Ud","Nxx9V3weIF","cQOnvM6qcG","uPX7G7fKYU","SmGzvQnJ1S","AkKTkcL0aE","5NammKsjRK","7Ow5CVLTy6","uTacxEoToP",
+"rz7UtWDVWJ","uJScXdmoS7","VIlwPru4UG","NhXdutvdkD","K20wKZ4I1v","8U2nUvkCHH","zbIYYK4GS8","W7cTsJJs5m","BFkb8iKqhr","WMiS33otm6",
+"JkzUnbZLvS","1v5hH5Drn0","ReKEW8hJdt","zz4ZUjiVBP","C2IrcDQimp","t59lRmz8gx","9eoRcrKDLJ","lweGy8TxD7","fcJOy7X3uy","suY4xC2Irc",
+"yluBxxXTI4","JkzUnFGzgp","fLNg8FFDui","aDGtSlCMxy","Chuy3JJs5m","UlU3MZzJHW","uQIczJkzUn","7lUXZGv3Fq","55rfBEoToP","MojnP5nmWv",
+"guMb8MaJQs","9XyT9ix74r","aDGtSMmsIo","pT8wuLewvM","JKWYRCxVEf","v1HlnhYBCK","FcWrWZv7z0","ni2v1Rxrsm","FVMxoI7p2a","DQimpd7vjM",
+"euZA5iwzGk","rhl0JUvlv4","AOgEeXyPZN","guMb8jSjS3","RmDcrQnJ1S","580YDTCgPp","0MR5Xd85a9","aL6AJ6q6L9","s4786yEfy9","ZzJHWnnP8o",
+"LbRTHiB08l","v2eC3uvf7A","yToGWFcWrW","IKxdLgtCA5","v2eC3pFrrl","cQOnvSmGzv","gtCA5MojnP","Z4I1vpiJSk","07n1chSSvQ","YjB9tdpe1v",
+"iwzGkMaJQs","uZPqgd85a9","s93Ml9eoRc","QChxsNo0Qb","X6Pin8hJdt","kB5nPRsQUq","YOfrY9iGoT","580YDwiHrZ","bgJAzChuy3","soy9tvLsmS",
+"CdyBVfmIK1","ReKEWDcpWB","sx5GlY1mC0","ZuDtDqaofN","0PktIbZLvS","1j5L8guMb8","lweGyFGzgp","FLsph3weIF","NhXduSjskQ","RxrsmF6PT2",
+"AXpwEVLTy6","Yh1hF1LB1L","HlUbFOxWIH","qUJMdzqH0W","SjskQGXdoH","fqypyfcwDa","GrDg7pmeCd","Yh1hF9GXkX","XflUqzY1GY","n8pJ95IhmG",
+"brhlQF6PT2","QWxoTVerEA","lViBvIKxdL","tl72WXyPZN","FnPFBGWqqX","OUqFMZzJHW","lweGyNOHsz","1j5L8EOE1o","prNT6uLtKs","24ARFYf2Ec",
+"9eoRcb29RJ","1LB1LNxx9V","fmIK1sx5Gl","OxWIHNo0Qb","NhXduF6PT2","YOfrYaez9y","580YDy94nw","aez9yaL6AJ","D6rBy8xEKz","3otm6jS1aj",
+"6q6L9AgJHQ","iB08lFjHXR","LewvMbrhlQ","XyPZN6AFT0","lCMxy1LB1L","9y4lw7fsYM","2TRI7HRxd8","HlUbF618Di","TCgPpulk41","aDGtSAgJHQ",
+"aDGtSHfyNQ","W3VFHKASQ8","1v5hHt98iW","Y1mC03weIF","4QMc9TCgPp","Cfgr3fcwDa","vkCHH5Drn0","IjTwPAXpwE","Twano4QMc9","BbwgAiwzGk",
+"dpe1vfqypy","uJScXuZPqg","2hEEU9iGoT","L7cGctAOsr","Ul4a1zHF1q","WaWsvM6qcG","cQOnvWaWsv","0YAGHKZamH","3otm6Waim6","AIYUud7vjM",
+"Yh1hFwiHrZ","lm0pDyofH3","y94nwuTacx","QnJ1SXflUq","tAOsrNxx9V","Z4I1vWreyP","No0Qb580YD","EOE1oMGlTF","okgRi8U2nU","64s8Nulk41",
+"FwEJz7lUXZ","D6rBy64s8N","XflUqv1Hln","jfREuOUYuF","guMb8aFFss","In3NSzz4ZU","FLsph5Mg9r","zqH0WjzUqR","580YDbrhlQ","8xEKz7X3uy",
+"zbIYYgjUTu","QChxsC2Irc","RBhp0d85a9","Q6LixuZPqg","SbRYyG1RhS","DQimprhl0J","gjUTuCfgr3","a00b5Vprf2","soy9tuTacx","2Yz7E45cIH",
+"MmKGJzz4ZU","tuDySmX2GE","8TxD7AmdQd","aFFssyvOMI","3otm6taOXK","BbwgAVjCZq","o8Uydxciqp","Vprf2uN6r3","WmadAyluBx","WPmlxprNT6",
+"cQOnvQssNC","RBhp0Chuy3","3otm6mz8gx","brhlQjtn0X","0MR5X16lHc","8hJdtU3yw5","U3yw5yToGW","AXpwEHzZT8","S2DfulpF6W","6q6L97lUXZ",
+"HP4337ku1p","5Mg9rStlDJ","qaofN0Wr5y","Dz1R3QChxs","uZPqgQbxXc","8FmFH45cIH","0MR5X5iGN5","Y1mC0SWfou","tuDySW3VFH","AmdQdI7p2a",
+"tlILtDz1R3","1LB1LYf2Ec","2DREs7Ow5C","ECMvUAOgEe","0BmCy8FmFH","JKWYRlH1kt","ogLgcC2Irc","pvgjSCNHmv","uLtKsS2Dfu","y94nwtlILt",
+"RACujP6bcg","oVQp65ZaEz","OxWIH7lUXZ","AmdQdfcJOy","s93MlpFrrl","55rfBJKWYR","Yf2EcvLsmS","CK5W7n8pJ9","0PktIuoStw","cmXIXCK5W7",
+"IBe8kTa8f6","bgJAzmz8gx","dpe1veuZA5","CNHmviwzGk","bZLvSatef2","i3pyd9XyT9","Y1mC0BCxeC","DLhzMQworu","WPmlxNhXdu","RkQkeUmaEv",
+"hSSvQtlILt","S2DfurKDLJ","tuDyS0BmCy","Yf2EcS77LH","CNHmv0Wr5y","kB5nPiwzGk","Kr8ysZzJHW","3weIFuupzk","okgRi5Drn0","OUYuFgjUTu",
+"P6bcg3otm6","MezSWK20wK","POUYSHlUbF","2DREs6q6L9","HP433X6Pin","5drc6v1Hln","JIqXinlaBy","5iGN5tl72W","CqqaDZv7z0","uvf7AciuWz",
+"bgJAzYh1hF","hYBCKlj07Q","euZA5Zv7z0","S2Dfu4dEz6","FxX9quQIcz","gIYvEFjHXR","e6e4zEoToP","ix74rm4bxU","P6bcg5Drn0","3otm6e6e4z",
+"lXFOBEOE1o","8FmFHksJby","WDVWJPOUYS","RsQUq8cVD3","MaJQsazIWp","48cHLVerEA","TXQ0Z5iGN5","ZUnqt8TxD7","aL6AJfcJOy","AkKTkMaJQs",
+"lkMUAaL6AJ","lCMxyY1mC0","B3qemcL0aE","ogLgcOUqFM","9GXkXFNYIM","lweGyhUTw7","uJScXAOgEe","W3VFHvLsmS","gdQsSy94nw","bgJAzG1RhS",
+"QssNClXFOB","Yf2EcjzUqR","Vprf25Namm","soy9t7fKYU","gtCA5In3NS","ZUnqtM6qcG","ZuDtDB3qem","sx5Gl0ao3l","fcwDaaDGtS","lsQGoCfgr3",
+"suY4xWreyP","G1RhS2DREs","NhXdu3otm6","euZA5KsjRK","RzaZAYOfrY","8cVD3m4bxU","hi5X7uupzk","lweGylm0pD","0YAGH1v5hH","gIYvEXflUq",
+"cQOnvPYBf4","ru4UGIjTwP","lm0pDcL0aE","5drc6uLtKs","9eoRcDLhzM","8TxD7rhl0J","1j5L82Nslm","aFFssCxVEf","M3zXLuLtKs","cmXIX7Ow5C",
+"t98iWzbIYY","jtn0XFcWrW","pAhR1XflUq","fmIK1RmDcr","8U2nUulk41","IjTwPbZLvS","7lUXZx3LDe","2ZHdkU3yw5","Ul4a1WaWsv","RsQUqlkMUA",
+"jzUqRXflUq","Ss0Zuni2v1","v2eC3WDVWJ","pvgjSblLA9","RxrsmNo0Qb","uZPqg8RCUA","gjUTubZLvS","DcpWBCp3mZ","ni2v1jtn0X","uTacxnFqik",
+"YOfrYlkMUA","UlU3MEdBKc","CIShGlCMxy","Ss0ZuW7cTs","cShY2OxWIH","bgJAz8cVD3","KASQ8QChxs","Vprf224ARF","Nxx9V29QAz","s4786iKqhr",
+"Z4I1vuQIcz","Nxx9VwiHrZ","pAhR1580YD","JkzUn6q6L9","0Wr5y4dEz6","WreyPhe9IA","W3VFHAmdQd","iKqhr2ZHdk","DLhzMfFDrJ","O3iyQlm0pD",
+"h1zcHgdQsS","ThjNnFVMxo","0BmCyFFDui","FVMxoD6rBy","Ta8f6Twano","faHirBpYhV","X6PinBCxeC","F6PT2EoToP","zbIYYQ6hMC","tl72W5Drn0",
+"zY1GYt98iW","KASQ8FVMxo","uLtKsEdBKc","dmoS7uAWyp","RBhp0mz8gx","mX2GEd85a9","RkQkeZzJHW","FNYIMs93Ml","ZUnqt4dEz6","x3LDezY1GY",
+"jtn0XvkCHH","07n1cStlDJ","pAhR155rfB","POUYSX6Pin","Ul4a1O3iyQ","zmLYDLDk6f","l83UdzHF1q","8U2nUsx5Gl","ix74r5VZjS","pvgjSuN6r3",
+"QChxsCK5W7","S77LHMojnP","zbIYYMGlTF","EOE1oRmDcr","HzZT8IjTwP","RmDcrMK07Y","yofH3ydG8U","taOXKfcwDa","QChxsWMiS3","pmeCdFcWrW",
+"OxWIHuoStw","gdQsSMaJQs","3otm6cL0aE","h1zcHlj07Q","S2DfupiJSk","ZhwG1rhl0J","hUTw7lm0pD","HzZT8FVMxo","C2IrcjSjS3","WmadACK5W7",
+"guMb8NAFuw","StlDJqQxHP","ciuWzgIYvE","NcICAW3VFH","L7cGcwiHrZ","oQ87rfcJOy","FxX9qn1pmO","Yh1hFNOHsz","aez9yi3pyd","VjCZqAmdQd",
+"5drc6iqv4k","vOqCE8hJdt","2DREsjSjS3","CK5W7G1RhS","AXpwEt59lR","yEfy9YjB9t","4dEz6FjHXR","uLtKsdmoS7","b29RJZzJHW","yofH3d7vjM",
+"t98iWUvlv4","tlILt29QAz","h1zcH7lUXZ","s93MlGrDg7","5Mg9raez9y","pvgjSvOqCE","55rfBgdQsS","rKDLJMGlTF","G1RhSpmeCd","NcICA9XyT9",
+"TCgPpwDajX","0h1b1Nxx9V","1v5hHG1RhS","zqH0WDcpWB","DQimpoGu6x","SjskQgtCA5","7hyVvCK5W7","oGu6x0YAGH","cShY2FcWrW","I7p2atjQxs",
+"ReKEWhSSvQ","BGaQYnnP8o","NcICAVLTy6","Ss0Zus4786","tvdkDAIYUu","yToGWUl4a1","HP433BGaQY","lH1ktcShY2","StlDJzFgtB","ogLgcW3VFH",
+"atef2prNT6","4QMc9s7Mxk","45cIH4W0Tl","FnPFB0YAGH","ZUnqtIjTwP","45cIHMezSW","8cVD3WMiS3","MGlTF2Yz7E","faHirMojnP","0MR5XHfyNQ",
+"K20wKPb1pa","oQ87rk85Ae","s47860MR5X","IKxdL5nmWv","FxX9qpv0i7","e6e4ziB08l","gf8rInFqik","vOqCEB3qem","MK07YIBe8k","rhl0JVjCZq",
+"O3iyQaFFss","CdyBVuQIcz","QWxoTdjsrv","YjB9trKDLJ","iqv4knFqik","he9IA4W0Tl","VerEASbRYy","lweGyQ6hMC","lj07QpFrrl","gjUTu3otm6",
+"Pb1pani2v1","ZhwG1KZamH","ZUnqthYBCK","U3yw5uTacx","hi5X7BCxeC","jSjS3AXpwE","v8yFNzz4ZU","tjQxstvdkD","GSQwjHlUbF","pWiOs55rfB",
+"WDVWJulk41","X6PintjQxs","ni2v1MmsIo","zqH0WK20wK","aez9yo8Uyd","lCMxyix74r","XflUqqUJMd","v1HlnIBe8k","oVQp6JXljW","pv0i7fcJOy",
+"s7Mxkl83Ud","zHF1qpWiOs","dhSuHeuZA5","W3VFHYw2oU","uvf7AlH1kt","OUYuFxciqp","fLNg8xciqp","8FmFHY1mC0","jzUqRQnJ1S","BpYhVKZamH",
+"HRxd8v1Hln","zHF1qRsQUq","lViBvxciqp","5ZaEzs4786","mz8gxuQIcz","U3yw5X6Pin","fqypyLbRTH","jzUqR16lHc","rhl0JMK07Y","iKqhroQ87r",
+"S77LHyofH3","ZzJHWW3VFH","RBhp0lXFOB","UlU3MUvlv4","vOqCEnFqik","yvOMIdhSuH","uJScXs4786","7hyVvyvOMI","aez9y2TRI7","16lHck85Ae",
+"sqVrfoVQp6","k85AeUl4a1","dmoS7AmdQd","ksJby1LB1L","XflUq0h1b1","lH1ktNAFuw","y94nwjSjS3","In3NSzmLYD","FLsphQ6Lix","dmoS7CIShG",
+"tlILtfqypy","DQimpyofH3","QbxXcCNHmv","55rfBGXdoH","XflUqlweGy","soy9tokgRi","uPX7GG1RhS","W7cTsbgJAz","fFDrJ6q6L9","mX2GEsqVrf",
+"Gv3Fq24ARF","ReKEWK20wK","dhSuHSs0Zu","8hJdt0MR5X","3otm6ThjNn","fFDrJhi5X7","cL0aEFPfSE","LewvM64s8N","MmsIoQbxXc","jfREu7X3uy",
+"0Wr5yMGlTF","WreyPRxrsm","vLsmS7Ow5C","MmsIoazIWp","Y1mC0D6rBy","tvdkDblLA9","48cHLGXdoH","mz8gxuoStw","FLsphAgJHQ","I7p2amz8gx",
+"64s8NcL0aE","QssNCDG4sT","uZPqgprNT6","MGlTFYw2oU","StlDJKsjRK","rhl0JzmLYD","yvOMIzz4ZU","9eoRcMm8si","WreyPdpe1v","CqqaDYOfrY",
+"W7cTsgf8rI","QChxs7hyVv","dmoS77ku1p","m4bxUFVMxo","KASQ85iGN5","2ZHdkdpe1v","v1HlnCqqaD","VNCPdVjCZq","soy9tOz8yZ","KASQ8XflUq",
+"7hyVvLewvM","NhXdukB5nP","zz4ZUUmaEv","n1pmOuN6r3","AOgEeCxVEf","GXdoHAkKTk","bgJAzi7WMQ","8hJdtRpBQm","MK07Y4QMc9","h1zcHQYxC0",
+"uvf7AUmaEv","yToGWChuy3","QnJ1SdmoS7","WDVWJJKWYR","uoStwl83Ud","lweGyx3LDe","WMiS3Ss0Zu","LewvM5IhmG","7Ow5C7fKYU","e6e4zlm0pD",
+"dmoS71j5L8","vOqCEStlDJ","ECMvUZ4I1v","TCgPp5nmWv","EdBKclkMUA","4QMc9RACuj","0YAGHazIWp","jtn0XyvOMI","SWfourKDLJ","5ZaEztaOXK",
+"ZJTXHlweGy","nnP8o8cVD3","blLA9yToGW","gIYvEAOgEe","oVQp6SbRYy","1j5L829QAz","atef229QAz","14FLRtl72W","xReecECMvU","fmIK1kZANm",
+"gtCA5QbxXc","s93Ml29QAz","8U2nU5nmWv","5nmWvW7cTs","HfyNQTXQ0Z","OxWIHdpe1v","ulk41Zv7z0","2TRI7MojnP","JJs5mZ4I1v","5nmWvdpe1v",
+"5iGN5FFDui","FcWrWazIWp","ydG8Uni2v1","Cfgr3djsrv","K4GS8LewvM","SWfou3weIF","Oz8yZAIYUu","xReecHRxd8","jzUqRdjsrv","jeskSs7Mxk",
+"ZhwG10Kyfs","AgJHQtvdkD","DG4sTpv0i7","xXTI4xXTI4","0YAGHPb1pa","gf8rIECMvU","DG4sTs93Ml","t98iW1j5L8","i3pydMGlTF","taOXKbgJAz",
+"C2Irc5drc6","aL6AJFGzgp","45cIHcL0aE","8xEKzW3VFH","Vprf2d85a9","iwzGkIRh48","bZLvSMK07Y","tjQxsy94nw","RxrsmnFqik","0PktIatef2",
+"S77LHSWfou","Yf2EcVerEA","pmeCdx3LDe","lkMUAjSjS3","JRJQBM6qcG","9XyT9TCgPp","jfREu8FmFH","5Mg9r9XyT9","Oz8yZulk41","hSSvQyEfy9",
+"VerEAnnP8o","AOgEeI7p2a","K4GS8FNYIM","YOfrYKASQ8","AmdQdRzaZA","TXQ0ZLDk6f","Ta8f6uLtKs","Z4I1vQssNC","F6PT2Dz1R3","OxWIHa00b5",
+"yofH3VIlwP","wDajXwiHrZ","ulk41Chuy3","S2DfuRkQke","atef2faHir","Gv3FqMmKGJ","MezSWQChxs","uoStwSmGzv","2DREskZANm","t98iWRBhp0",
+"JJs5meuZA5","K20wKTCgPp","uvf7AF6PT2","pAhR1FwEJz","6AFT07fKYU","9rlg9ECMvU","brhlQuQIcz","CxVEftl72W","Mm8sivLsmS","QWxoTjtn0X",
+"FFDui3otm6","WmadAOUqFM","prNT6S77LH","Cp3mZrhl0J","SbRYyVprf2","NAFuwzbIYY","gtCA5d85a9","pWiOs8RCUA","guMb8zY1GY","5iGN5WMiS3",
+"IKxdLfmIK1","WMiS3BbwgA","lm0pD0ao3l","SbRYyIn3NS","okgRizHF1q","0MR5X5Mg9r","yluBxAOgEe","uQIczIRh48","55rfB7ku1p","lpF6WfcJOy",
+"VerEAprNT6","e6e4zPOUYS","G1RhSvOqCE","FFDuiUlU3M","8FmFHa00b5","k85AeReKEW","RBhp0MmKGJ","9rlg9pWiOs","HfyNQsuY4x","gdQsSD6rBy",
+"W3VFH0h1b1","8RCUABGaQY","lsQGoCp3mZ","aL6AJlweGy","zHF1qxReec","HfyNQP6bcg","azIWpC2Irc","MmsIolCMxy","vLsmSsqVrf","lkMUAVLTy6",
+"tjQxsyToGW","JXljWJ2mQi","O3iyQl83Ud","C2Ircs7Mxk","IBe8kX6Pin","fFDrJJXljW","QbxXcZ4I1v","Q6hMCOz8yZ","RACuj0YAGH","StlDJJRJQB",
+"ydG8US77LH","JRJQBlXFOB","29QAziKqhr","lweGyuQIcz","Cp3mZAkKTk","faHirQWxoT","ZJTXHD6rBy","0Wr5yCdyBV","ZuDtDM3zXL","5IhmGpWiOs",
+"PYBf4ksJby","BCxeCdpe1v","AOgEeZuDtD","24ARFrhl0J","9XyT9l83Ud","yEfy9DcpWB","zFgtBcL0aE","uAWyp1v5hH","5nmWvt98iW","mX2GEpvgjS",
+"HzZT8pFrrl","L7cGcaFFss","ix74rni2v1","aDGtSk85Ae","blLA9NAFuw","LDk6f5IhmG","Yh1hFRxrsm","Q6hMCatef2","5VZjS3otm6","wiHrZjzUqR",
+"ZJTXHulk41","Chuy3jeskS","JJs5mGSQwj","cL0aEZzJHW","iB08l1v5hH","55rfBCp3mZ","XyPZNlm0pD","wiHrZUl4a1","CdyBVpiJSk","ZuDtDEOE1o",
+"8FmFHgdQsS","JKWYRQ6Lix","uvf7AyluBx","07n1cIRh48","BbwgAGSQwj","FhtglWDVWJ","n8pJ9JXljW","5Mg9rgdQsS","IKxdLEoToP","Uvlv4pvgjS",
+"zbIYYAmdQd","29QAzpWiOs","x3LDeSjskQ","DG4sT7ku1p","nnP8obZLvS","2hEEU9y4lw","GSQwj6q6L9","WMiS3nnP8o","yluBxVerEA","JXljWVerEA",
+"lpF6WpT8wu","ZzJHWVNCPd","NhXduaDGtS","Yh1hF8RCUA","I7p2a0BmCy","I7p2aDz1R3","JXljWuLtKs","Pb1pa3otm6","lViBvjS1aj","BGaQYHRxd8",
+"JJs5m55rfB","VerEAZuDtD","580YDBCxeC","No0QbW3VFH","Zv7z0lkMUA","FhtglQworu","tvdkDQClRL","Yh1hFlCMxy","0MR5XtuDyS","5ZaEzBpYhV",
+"4QMc9CK5W7","580YDDLhzM","sqVrf1v5hH","BFkb8dmoS7","RpBQmaL6AJ","CqqaDs93Ml","wDajXs4786","QssNCNxx9V","FGzgpFwEJz","M6qcGCK5W7",
+"1v5hHpAhR1","ulk41HRxd8","tAOsrAXpwE","AXpwEv1Hln","xReec55rfB","hi5X7zQt6Q","e6e4zh1zcH","DcpWBK20wK","Pb1paQ6hMC","soy9tAmdQd",
+"xXTI4azIWp","VIlwPaL6AJ","soy9tKr8ys","brhlQlCMxy","0PktIMezSW","J2mQix3LDe","9iGoTDz1R3","zz4ZUFcWrW","5VZjSzQt6Q","Q6hMCazIWp",
+"v1HlnhSSvQ","BbwgALewvM","0PktItlILt","P6bcg5IhmG","kB5nPjSjS3","KsjRKoVQp6","OHaBz16lHc","lsQGoVIlwP","Cfgr3Z4I1v","YjB9t7lUXZ",
+"hSSvQydG8U","aFFssRACuj","hUTw764s8N","JkzUn0Wr5y","XflUq3weIF","i3pydhUTw7","d85a9k85Ae","gIYvEuLtKs","64s8N7fsYM","dhSuHtl72W",
+"7X3uyDQimp","8U2nUpiJSk","yvOMI5iGN5","IBe8k5VZjS","7ku1p6q6L9","prNT6QClRL","uvf7A14FLR","JRJQB5Drn0","RkQkeW7cTs","580YDLewvM",
+"Gv3Fqdjsrv","W7cTsk85Ae","2TRI7zQt6Q","U3yw5B3qem","7Ow5CHlUbF","lm0pDd85a9","1v5hH0Kyfs","cShY27Ow5C","SWfou5drc6","Kr8ys7hyVv",
+"bgJAzVprf2","ksJbyJIqXi","RsQUqaFFss","RzaZAoGu6x","ydG8UD6rBy","qaofNM6qcG","jzUqRW7cTs","XyPZN55rfB","JIqXikZANm","ZUnqt1v5hH",
+"aFFssb29RJ","iwzGkPb1pa","8cVD3zQt6Q","m4bxU2Yz7E","zY1GYFnPFB","lXFOBlj07Q","kB5nPuN6r3","Q6LixoGu6x","dpe1vFNYIM","VLTy6dhSuH",
+"LbRTH5VZjS","29QAzaFFss","cShY2ECMvU","O3iyQprNT6","lViBvAmdQd","guMb8JXljW","S77LH0MR5X","OUYuFRkQke","KASQ8fqypy","pv0i78cVD3",
+"aFFsseuZA5","0BmCygjUTu","JKWYRQnJ1S","QbxXcuQIcz","uPX7GVNCPd","xXTI4Gv3Fq","cShY2RsQUq","vkCHHcQOnv","ECMvUVIlwP","FxX9q14FLR",
+"jiVBPv1Hln","sx5GlAmdQd","ogLgct59lR","4QMc9618Di","vkCHHBCxeC","o8UydgIYvE","XyPZNxciqp","m4bxUOUYuF","uJScXfmIK1","zqH0Wd85a9",
+"X6PinpvgjS","xXTI4lCMxy","l83UdVNCPd","HRxd8Mkgy8","YOfrY5VZjS","jfREujtn0X","y94nwVerEA","ZhwG1Oz8yZ","zY1GYHzZT8","Waim60Wr5y",
+"uN6r3JJs5m","ogLgcRpBQm","5nmWvfcwDa","OUYuF07n1c","lViBvDcpWB","FhtglyluBx","OHaBzydG8U","YOfrY8cVD3","Y1mC0HfyNQ","FVMxod85a9",
+"iKqhrzFgtB","8xEKz0h1b1","jeskSRxrsm","rhl0J64s8N","Cp3mZJXljW","EdBKcNhXdu","blLA99XyT9","IjTwPwDajX","7ku1pdQ586","vOqCEFNYIM",
+"NAFuwUl4a1","AIYUuGSQwj","MmKGJHzZT8","uQIczeuZA5","Kr8ysfFDrJ","s7MxkMmsIo","TwanoCdyBV","uAWypK20wK","AIYUuyofH3","jiVBPuAWyp",
+"CIShGiB08l","zHF1qMezSW","K4GS864s8N","IjTwPQworu","1v5hHFxX9q","FcWrWVprf2","GWqqXtjQxs","zbIYYDLhzM","wiHrZHfyNQ","4QMc9In3NS",
+"ogLgcfmIK1","U3yw5Mm8si","0MR5X5IhmG","JXljW9XyT9","CK5W77fsYM","qUJMdPYBf4","NcICAZv7z0","9iGoT8xEKz","BCxeCe6e4z","JJs5mciuWz",
+"FnPFB8xEKz","jtn0X4dEz6","sqVrfnFqik","n1pmOZJTXH","zz4ZUJJs5m","2NslmcL0aE","fLNg8WDVWJ","pmeCdZhwG1","PYBf4lXFOB","CK5W7FwEJz",
+"No0QbgdQsS","8cVD3In3NS","TwanoTwano","JkzUnQClRL","4QMc9Nxx9V","lXFOBnlaBy","ZJTXHRxrsm","s4786uTacx","QbxXcYw2oU","Q6hMCuQIcz",
+"Zv7z0cShY2","kB5nPFxX9q","ZUnqtM3zXL","FNYIMJXljW","ksJbyLbRTH","MmKGJI7p2a","RmDcrjS1aj","uoStwjiVBP","6AFT007n1c","BFkb8n8pJ9",
+"J2mQiSmGzv","I7p2av8yFN","nlaByhSSvQ","GWqqXKsjRK","tvdkDJJs5m","BpYhVdmoS7","5iGN5n1pmO","uvf7Ae6e4z","StlDJ5drc6","xXTI4wiHrZ",
+"TwanoFxX9q","ix74rLDk6f","rhl0JCK5W7","9GXkXOUYuF","hE1QlI7p2a","NAFuwyofH3","i3pydGXdoH","7hyVvgIYvE","pv0i7MmsIo","9rlg9TCgPp",
+"BGaQYMGlTF","Dz1R3fLNg8","ulk41HfyNQ","5NammYh1hF","gIYvEDcpWB","wiHrZOUqFM","KASQ8ulk41","2ZHdksx5Gl","rz7UtLewvM","Z4I1vgjUTu",
+"5Mg9rzY1GY","uPX7GpmeCd","fcJOyB3qem","MojnPuAWyp","W7cTstaOXK","sqVrfTXQ0Z","7Ow5CMaJQs","guMb8EoToP","5NammbrhlQ","uvf7Aulk41",
+"PYBf4v1Hln","uAWypM3zXL","brhlQCIShG","hUTw7DcpWB","9rlg99y4lw","TXQ0ZFxX9q","Cfgr3K4GS8","HP433OxWIH","0YAGHQChxs","AXpwEWmadA",
+"lViBvEdBKc","yofH3S2Dfu","iKqhrFGzgp","pmeCdFFDui","MojnPQ6Lix","5NammpmeCd","2TRI7IjTwP","fqypyzFgtB","QbxXcWPmlx","64s8NvOqCE",
+"NOHszo8Uyd","vOqCEPOUYS","pFrrlYf2Ec","5Drn0Vprf2","FVMxoYw2oU","2Nslmdpe1v","FVMxok85Ae","5IhmGpT8wu","cmXIX45cIH","Oz8yZLDk6f",
+"L7cGcpT8wu","Chuy3zbIYY","a00b50ao3l","7hyVv8FmFH","a00b5zFgtB","7fKYUQWxoT","MmKGJydG8U","tl72Wdjsrv","618Di6q6L9","JKWYR8U2nU",
+"qUJMdMojnP","yluBx5Mg9r","UmaEvQssNC","pT8wuBGaQY","IKxdLd7vjM","fcJOy0BmCy","Nxx9VMojnP","aFFss64s8N","8TxD7UmaEv","ZJTXHh1zcH",
+"C2Irclm0pD","fLNg8o8Uyd","oGu6xKsjRK","qaofNo8Uyd","6q6L9fLNg8","UmaEvS77LH","SmGzvo8Uyd","zqH0WQWxoT","7lUXZ5VZjS","Q6hMC5Drn0",
+"5iGN5AXpwE","RmDcrkZANm","618DioGu6x","W3VFH0BmCy","JIqXiAgJHQ","Ul4a1ThjNn","vLsmSCNHmv","5nmWv55rfB","lkMUAgdQsS","CqqaD0Wr5y",
+"tjQxs9GXkX","9XyT9pAhR1","PYBf4l83Ud","JJs5mZJTXH","FhtglfmIK1","Gv3FqgjUTu","ix74r6q6L9","3otm67X3uy","5NammUmaEv","lweGy618Di",
+"VBjhz7ku1p","618DiHlUbF","d85a9uTacx","7fKYUUlU3M","0PktITa8f6","AgJHQjiVBP","UlU3MJXljW","euZA5VjCZq","wiHrZguMb8","Twano9iGoT",
+"HzZT8pAhR1","7hyVvjfREu","QWxoTdQ586","tAOsrpvgjS","VjCZqZzJHW","K4GS8SjskQ","pT8wuWPmlx","UlU3MQWxoT","XflUqXflUq","AmdQdogLgc",
+"VjCZqFcWrW","KASQ8AmdQd","8U2nUyvOMI","Q6hMCjeskS","9rlg9CK5W7","aFFsshUTw7","l83UdTCgPp","2NslmZ4I1v","FhtgllweGy","uN6r3BCxeC",
+"Oz8yZ8xEKz","k85AeaL6AJ","MGlTFBGaQY","uPX7GCfgr3","tlILtqQxHP","Yh1hF6q6L9","lj07QhE1Ql","AmdQdReKEW","2DREsAkKTk","DcpWBVLTy6",
+"soy9tJ2mQi","Ss0ZucQOnv","64s8Ntl72W","fcwDatvdkD","dpe1v1LB1L","jtn0XDz1R3","brhlQHlUbF","7fKYU6q6L9","RkQkelweGy","AgJHQxXTI4",
+"5iGN5EoToP","VIlwPwiHrZ","D6rBya00b5","S2DfuDcpWB","8hJdtVLTy6","8cVD3rKDLJ","CK5W7yofH3","oVQp6jzUqR","n8pJ9k85Ae","VjCZqe6e4z",
+"o8UydlCMxy","MGlTF2ZHdk","qaofNZhwG1","uLtKsHfyNQ","i3pydgdQsS","mz8gxMojnP","atef2DcpWB","1LB1Lulk41","FjHXRCfgr3","VNCPdlViBv",
+"zHF1qEdBKc","k85AeiB08l","s93MlJKWYR","cQOnvVIlwP","vLsmSD6rBy","prNT6FNYIM","8hJdt7lUXZ","QClRL8FmFH","HRxd8gIYvE","MaJQsQClRL",
+"1j5L8Q6Lix","9iGoTuvf7A","wDajX5Drn0","jS1ajuvf7A","HzZT8uTacx","pvgjSfcJOy","hSSvQuoStw","9y4lwv2eC3","y94nwBpYhV","guMb80Kyfs",
+"zz4ZUCNHmv","64s8NIKxdL","WPmlxRxrsm","7X3uyjiVBP","KASQ8FwEJz","jSjS3HzZT8","24ARFzbIYY","x3LDe0MR5X","HfyNQ7X3uy","v2eC3uAWyp",
+"h1zcHBpYhV","3weIFtAOsr","WPmlxG1RhS","lViBvRmDcr","bgJAz1LB1L","3otm6MGlTF","FVMxoVerEA","soy9tEOE1o","No0QbuJScX","RxrsmAkKTk",
+"SjskQuoStw","hE1Qliqv4k","lXFOBaL6AJ","Waim6bZLvS","OHaBzhYBCK","piJSk0ao3l","aL6AJQ6hMC","djsrv580YD","QnJ1SFPfSE","1j5L8jSjS3",
+"AOgEeuAWyp","Q6LixzbIYY","5drc6yEfy9","VLTy60BmCy","nFqik8cVD3","29QAzD6rBy","MmsIob29RJ","AXpwEfcJOy","dpe1vMmKGJ","dmoS7t98iW",
+"14FLRVerEA","5nmWvIKxdL","nFqik16lHc","ksJbyyToGW","5drc6TXQ0Z","soy9tuvf7A","FGzgplm0pD","Vprf2faHir","NhXduzFgtB","GrDg7FFDui",
+"AIYUuFVMxo","KsjRKZUnqt","Q6LixcmXIX","7fKYUtaOXK","I7p2a29QAz","lCMxyt59lR","aDGtSaFFss","aFFssgIYvE","WDVWJe6e4z","8U2nUuoStw",
+"AOgEe9eoRc","StlDJWDVWJ","o8UydcQOnv","ix74r8U2nU","MezSWLbRTH","1LB1LAIYUu","rhl0JmX2GE","ECMvUFVMxo","0PktIVprf2","7fKYUDQimp",
+"hYBCKNxx9V","euZA5tvdkD","WaWsvHzZT8","Nxx9V0Wr5y","5nmWvDz1R3","6AFT0jSjS3","LewvMNxx9V","QChxs6q6L9","SmGzvOUYuF","QbxXc2hEEU",
+"VIlwPJkzUn","uoStwpiJSk","RmDcr1j5L8","fLNg8CK5W7","qUJMdhSSvQ","jtn0XuAWyp","rKDLJix74r","TXQ0ZuLtKs","9rlg9HP433","Cfgr3M6qcG",
+"QssNCTCgPp","uupzky94nw","iqv4k8TxD7","suY4xVNCPd","aez9y0YAGH","ulk41aFFss","jiVBP1v5hH","dmoS7tl72W","RBhp0fLNg8","QWxoTnlaBy",
+"I7p2aqaofN","rz7UtxReec","d7vjMzmLYD","jS1ajprNT6","WreyPvOqCE","0YAGH5nmWv","29QAzL7cGc","5NammRmDcr","1j5L8DLhzM","vOqCEtuDyS",
+"MmKGJQ6hMC","qQxHP0YAGH","oVQp6IKxdL","fFDrJblLA9","fcwDa16lHc","TXQ0ZqaofN","fmIK1VjCZq","BbwgA55rfB","EOE1ovkCHH","K20wKzz4ZU",
+"VjCZqM3zXL","qQxHPDLhzM","iwzGkKASQ8","s93MljS1aj","Yf2EcoGu6x","oQ87rv2eC3","yvOMIKsjRK","FnPFBciuWz","ciuWzlkMUA","uLtKsCdyBV",
+"1v5hHxReec","MmKGJX6Pin","soy9tJRJQB","29QAzTXQ0Z","BbwgAsuY4x","ZhwG1iB08l","WmadAECMvU","cmXIX1LB1L","P6bcgwDajX","8U2nUkZANm",
+"oQ87rulk41","X6PinuZPqg","a00b5TCgPp","atef2aDGtS","zmLYDaFFss","Uvlv4i3pyd","KZamHbrhlQ","SWfouChuy3","CIShGFhtgl","ksJbyTwano",
+"fLNg824ARF","iqv4kTXQ0Z","FFDuiMkgy8","rz7UtK4GS8","PYBf4o8Uyd","lViBvl83Ud","aL6AJTCgPp","b29RJ2Yz7E","24ARFTXQ0Z","RzaZAVLTy6",
+"k85AeJKWYR","brhlQksJby","RBhp0pWiOs","lkMUAl83Ud","ZzJHWyvOMI","qaofN2Yz7E","GSQwjyluBx","fqypyZUnqt","2DREstl72W","cQOnvlm0pD",
+"lCMxywDajX","JkzUnazIWp","pvgjS9iGoT","ZJTXHQYxC0","NAFuwdpe1v","TCgPp1v5hH","Yf2EcAmdQd","n1pmOJXljW","dpe1vm4bxU","okgRijSjS3",
+"DQimp3otm6","kZANmEdBKc","he9IA5iGN5","HzZT8Z4I1v","2DREs7fKYU","blLA9Vprf2","G1RhSWaim6","hSSvQKZamH","tvdkDYh1hF","nFqik2Nslm",
+"D6rByfFDrJ","K4GS8LbRTH","GSQwjRBhp0","Ss0Zuiqv4k","HRxd8pT8wu","tl72WazIWp","IKxdLUvlv4","QworuOUqFM","HfyNQAgJHQ","RzaZAt59lR",
+"fLNg8zbIYY","8hJdtO3iyQ","WmadAVBjhz","2Nslm3otm6","LbRTHKZamH","yEfy95VZjS","CqqaDOz8yZ","9iGoTRsQUq","jeskStlILt","HfyNQzqH0W",
+"FxX9qIn3NS","Z4I1vuoStw","IjTwPrz7Ut","JJs5mJJs5m","RpBQm1v5hH","suY4xNhXdu","blLA9RkQke","Kr8ysjzUqR","pAhR1ZuDtD","DcpWBpAhR1",
+"2DREsMojnP","Nxx9VECMvU","Kr8yss7Mxk","FwEJzHRxd8","B3qem7Ow5C","HfyNQRpBQm","zz4ZUt98iW","L7cGcxReec","5iGN5i3pyd","2DREsKASQ8",
+"0MR5Xl83Ud","blLA9v2eC3","oGu6xD6rBy","fcwDai7WMQ","TXQ0ZQ6hMC","uLtKsnFqik","QWxoTzHF1q","0PktIiKqhr","OUYuF55rfB","K4GS8PYBf4",
+"AXpwEQnJ1S","fcJOy2TRI7","suY4xgtCA5","U3yw5C2Irc","0BmCyuZPqg","hSSvQYf2Ec","Ss0ZuhUTw7","FjHXRAkKTk","Q6hMCQYxC0","Vprf2v1Hln",
+"m4bxUn1pmO","7hyVvzz4ZU","gIYvESbRYy","brhlQpv0i7","CK5W7AIYUu","RBhp0W7cTs","9y4lwCxVEf","4dEz6uQIcz","7lUXZFhtgl","WmadAJXljW",
+"uupzkprNT6","55rfB2hEEU","ogLgciB08l","djsrvuoStw","D6rByqQxHP","EdBKctjQxs","sqVrfPYBf4","JJs5miB08l","QYxC0JKWYR","NAFuwhUTw7",
+"tvdkDFNYIM","rKDLJ0BmCy","5Namm5Mg9r","gjUTuksJby","6AFT0taOXK","SWfou9y4lw","xciqpvkCHH","EoToP0MR5X","9GXkXVerEA","5nmWvVjCZq",
+"uPX7G5VZjS","45cIHGv3Fq","jiVBPpmeCd","F6PT2Cfgr3","oQ87r8cVD3","QYxC0UlU3M","7Ow5Cn1pmO","m4bxUbZLvS","OHaBzY1mC0","sx5GlWMiS3",
+"9XyT9aL6AJ","Oz8yZqQxHP","jS1aj8xEKz","rhl0Jaez9y","Kr8ysIjTwP","jiVBP7fKYU","lweGylXFOB","jiVBPuPX7G","yEfy9MezSW","7fsYM07n1c",
+"hUTw7uupzk","jeskShE1Ql","NhXdufcwDa","FxX9qcL0aE","Dz1R3dmoS7","WreyPzqH0W","suY4x2Nslm","48cHLStlDJ","n1pmOl83Ud","WaWsvnlaBy",
+"Ta8f6aez9y","uZPqgIBe8k","rz7UtTwano","x3LDeRsQUq","Gv3FqMGlTF","djsrvbgJAz","brhlQi7WMQ","B3qemlweGy","Rxrsm7fsYM","KASQ8lpF6W",
+"0h1b1AmdQd","4W0TlfLNg8","OUqFMSWfou","yEfy97X3uy","QYxC00Kyfs","RsQUqlViBv","0ao3laL6AJ","LDk6fJKWYR","2NslmCK5W7","suY4xix74r",
+"lpF6WpiJSk","e6e4zNo0Qb","oQ87rW3VFH","D6rByWPmlx","piJSkQClRL","sqVrfF6PT2","dQ586iKqhr","NOHsz7lUXZ","ThjNnlsQGo","TwanoQssNC",
+"0Kyfs1LB1L","pWiOs1v5hH","8hJdtGv3Fq","lweGyoQ87r","Gv3FqQChxs","6q6L95drc6","0BmCyuTacx","In3NS5iGN5","MezSW9XyT9","fcJOyCK5W7",
+"x3LDelViBv","8U2nUM3zXL","9GXkXtl72W","zbIYYBbwgA","W3VFHS77LH","MmsIoWaWsv","Ta8f6JkzUn","8U2nUNhXdu","kB5nPs4786","NhXdupiJSk",
+"WMiS3RpBQm","t59lRMmsIo","y94nwe6e4z","cmXIXcL0aE","8xEKzTa8f6","tl72Ws4786","FNYIMpmeCd","MmKGJlsQGo","No0Qbv2eC3","S2Dfu5Mg9r",
+"EOE1oM3zXL","7hyVvNxx9V","yofH3StlDJ","oVQp6WreyP","8U2nUhYBCK","hE1QlWDVWJ","S2Dfuru4UG","vLsmSUl4a1","MGlTFoVQp6","QnJ1SIRh48",
+"uupzkogLgc","blLA9rhl0J","2ZHdk5nmWv","v2eC3uLtKs","ulk41Uvlv4","EdBKcQ6Lix","3otm62DREs","pWiOsHzZT8","IjTwPnlaBy","2Yz7E16lHc",
+"euZA5Yh1hF","oVQp6fqypy","a00b5POUYS","ReKEWO3iyQ","pmeCddQ586","iKqhrnFqik","0BmCyfcJOy","FNYIMgf8rI","0ao3lOxWIH","blLA9Chuy3",
+"v8yFN618Di","Yw2oUt59lR","PYBf4ZJTXH","FFDuiJkzUn","ZuDtDtuDyS","yluBxtl72W","9y4lwS2Dfu","TCgPp0Wr5y","nFqikIRh48","pWiOs8TxD7",
+"L7cGcAOgEe","lm0pD2TRI7","jfREuRzaZA","BFkb8Fhtgl","DLhzMuAWyp","LbRTHS2Dfu","YjB9tbZLvS","rhl0JCxVEf","vLsmSMezSW","l83UdmX2GE",
+"euZA54dEz6","8RCUAK20wK","Yw2oUHlUbF","Waim6FwEJz","G1RhSlj07Q","CqqaDVNCPd","aL6AJCqqaD","dpe1vMmsIo","ni2v1nFqik","UlU3MCK5W7",
+"8RCUA29QAz","OxWIHBbwgA","3otm6KZamH","3otm645cIH","WmadAYw2oU","aFFsspT8wu","l83Ud64s8N","Kr8ysUvlv4","tvdkDBbwgA","Kr8ysmX2GE",
+"FFDuiXyPZN","X6PinwiHrZ","vkCHHfmIK1","I7p2an1pmO","djsrv5iGN5","mX2GEIKxdL","K4GS84dEz6","0h1b1X6Pin","yofH35nmWv","5nmWv0Kyfs",
+"h1zcHpAhR1","gjUTuiwzGk","Mkgy87X3uy","AOgEehSSvQ","b29RJZUnqt","MmsIo8RCUA","FVMxooQ87r","8U2nUECMvU","uvf7AKZamH","aL6AJv1Hln",
+"BbwgAmz8gx","h1zcHjiVBP","nnP8ot98iW","48cHLJXljW","VBjhzQssNC","v8yFNsqVrf","tjQxsgdQsS","ix74r1LB1L","CqqaDMmsIo","8U2nU7lUXZ",
+"oVQp6pvgjS","YOfrY580YD","P6bcgaez9y","1j5L8CIShG","WMiS3lj07Q","SmGzva00b5","OUYuFnFqik","YOfrYSWfou","4QMc9aez9y","lH1ktECMvU",
+"fLNg8RzaZA","WaWsvwiHrZ","5Drn0mz8gx","Y1mC0pAhR1","5IhmGXflUq","iqv4kUlU3M","uLtKsk85Ae","iB08ly94nw","taOXKAkKTk","Chuy35drc6",
+"faHirWmadA","OxWIH0h1b1","cmXIX7ku1p","VLTy61v5hH","BFkb85VZjS","fLNg8uN6r3","JXljW8xEKz","8xEKzTwano","EoToPMaJQs","GWqqXsoy9t",
+"MmKGJZzJHW","2hEEUaDGtS","DG4sT0Wr5y","pAhR1Nxx9V","5iGN5jfREu","2TRI7Ss0Zu","suY4xtaOXK","lweGyqQxHP","7hyVv0Wr5y","pvgjS0Kyfs",
+"a00b5LDk6f","faHirjSjS3","Yh1hFqUJMd","wiHrZYOfrY","rhl0JgIYvE","QssNCokgRi","8U2nUh1zcH","pmeCdi7WMQ","XflUqVerEA","xciqpl83Ud",
+"JIqXii7WMQ","tvdkDzY1GY","I7p2aWDVWJ","gf8rIVBjhz","tAOsrFjHXR","G1RhSv8yFN","0BmCyMmsIo","7fsYMQ6Lix","okgRiW7cTs","EOE1oy94nw",
+"brhlQyofH3","lsQGoQ6Lix","CqqaDAOgEe","9rlg9kZANm","uTacxlViBv","SjskQiqv4k","ix74rhUTw7","JXljWbgJAz","FLsphatef2","8xEKz7ku1p",
+"Mm8sitvdkD","ThjNnWmadA","16lHctuDyS","jzUqRuZPqg","v8yFNG1RhS","MaJQsVIlwP","WDVWJdjsrv","piJSkgf8rI","2TRI7Vprf2","MojnPThjNn",
+"uAWypt59lR","uN6r3CNHmv","jiVBPoGu6x","Mkgy8BbwgA","No0Qb5Namm","zQt6Qv2eC3","hUTw7StlDJ","zmLYDAgJHQ","3otm6WreyP","azIWphE1Ql",
+"s93MldQ586","euZA5618Di","W3VFHzqH0W","F6PT2a00b5","QbxXcfaHir","jSjS3In3NS","Gv3FqW3VFH","MojnP7fKYU","xciqpFLsph","prNT6gjUTu",
+"RxrsmprNT6","IBe8kjzUqR","ciuWzi7WMQ","y94nwKsjRK","vOqCElViBv","aL6AJt98iW","nlaByksJby","Vprf2wiHrZ","RmDcrHfyNQ","OUYuFlkMUA",
+"Oz8yZECMvU","iqv4ks93Ml","ZuDtDdpe1v","RACujWPmlx","jSjS32Nslm","t98iW7fsYM","FLsphKASQ8","he9IAWreyP","jSjS3TCgPp","ogLgcPYBf4",
+"GSQwj580YD","iqv4keuZA5","aL6AJlm0pD","FxX9qKZamH","DLhzMUvlv4","L7cGcs4786","WreyP8TxD7","nlaByVBjhz","uN6r38cVD3","1v5hH0BmCy",
+"JJs5mMmKGJ","azIWp3otm6","Ul4a1tuDyS","ReKEWqQxHP","Waim6fFDrJ","CIShGFcWrW","iwzGkaFFss","HRxd82Nslm","K4GS8cL0aE","K4GS8MmsIo",
+"IRh48BCxeC","QWxoTbrhlQ","FcWrWRkQke","nlaByLDk6f","IRh48StlDJ","b29RJVjCZq","1LB1L8U2nU","RBhp0618Di","RzaZApFrrl","oGu6xmX2GE",
+"DLhzMeuZA5","AkKTkpT8wu","KASQ8tjQxs","W3VFHbgJAz","ZhwG1IRh48","lm0pDF6PT2","d85a9618Di","tuDySTwano","ix74roGu6x","iKqhr9XyT9",
+"l83UdpFrrl","CdyBVblLA9","CdyBVRsQUq","iKqhrM3zXL","TCgPpdQ586","aFFsss7Mxk","d7vjMNcICA","dpe1vDG4sT","CIShGeuZA5","aDGtSQworu",
+"ulk41Y1mC0","8RCUARpBQm","KsjRKB3qem","HlUbFDG4sT","s47865iGN5","7X3uyi3pyd","7hyVvlCMxy","aL6AJ0ao3l","FhtglOz8yZ","4dEz6tlILt",
+"lweGys4786","9XyT9cQOnv","lCMxycQOnv","ECMvUMK07Y","v2eC3fFDrJ","W3VFHCK5W7","v1Hln0PktI","bZLvShYBCK","lkMUA29QAz","yofH35VZjS",
+"W3VFHWaim6","618DiIRh48","HRxd8faHir","uQIczcQOnv","EdBKcgdQsS","W7cTs7lUXZ","h1zcHVNCPd","lXFOBy94nw","BGaQY2TRI7","k85Aeaez9y",
+"GrDg7NAFuw","StlDJQChxs","mz8gxpiJSk","ZUnqtK20wK","2ZHdkgtCA5","aFFssLbRTH","Waim6nlaBy","azIWpAkKTk","WMiS3a00b5","uLtKshYBCK",
+"JIqXiuN6r3","aez9y0PktI","MmsIo0Kyfs","1j5L8Yh1hF","RsQUqWreyP","iKqhrlm0pD","7Ow5CxReec","QWxoTVIlwP","zY1GYOUYuF","ZhwG1MK07Y",
+"ulk41Yf2Ec","bZLvSpT8wu","fmIK1gIYvE","UmaEv0ao3l","B3qemJXljW","QbxXchYBCK","ZuDtDvLsmS","MK07Y2hEEU","nlaBymX2GE","Q6hMCfaHir",
+"DG4sT9rlg9","MmsIoMkgy8","3weIF8TxD7","GXdoHtAOsr","ZhwG1Ta8f6","fmIK1taOXK","QClRLqUJMd","U3yw5CIShG","qQxHPlsQGo","BCxeCReKEW",
+"Cp3mZIjTwP","bgJAzW7cTs","jtn0XMGlTF","a00b5pAhR1","L7cGcQ6hMC","lViBvMm8si","RzaZA3weIF","AOgEev8yFN","pWiOsFLsph","zHF1qFnPFB",
+"1v5hHStlDJ","QnJ1SL7cGc","guMb8VjCZq","a00b5HP433","GXdoHaDGtS","LewvMdQ586","IRh488cVD3","v2eC3GXdoH","QnJ1SqaofN","Vprf2HzZT8",
+"hUTw7dpe1v","I7p2a2TRI7","nFqiky94nw","MmKGJAIYUu","ru4UGcmXIX","IRh48QClRL","dpe1vbrhlQ","9XyT9zmLYD","s7Mxk24ARF","2NslmOz8yZ",
+"BpYhVQChxs","wDajXS2Dfu","HzZT88hJdt","QnJ1SVNCPd","v1Hln0ao3l","Gv3Fqs4786","Cfgr355rfB","45cIHrKDLJ","EOE1o64s8N","Dz1R31LB1L",
+"HlUbFBGaQY","EdBKchE1Ql","2DREsfaHir","0YAGHBbwgA","7fsYMVIlwP","s4786i7WMQ","nFqikPYBf4","CxVEfMaJQs","d7vjMtuDyS","DG4sTRxrsm",
+"aFFsszY1GY","MmsIoNOHsz","ksJbypAhR1","5VZjSgIYvE","BGaQYQClRL","JKWYRuTacx","lXFOBKZamH","xciqp5iGN5","LewvMv8yFN","tvdkDGXdoH",
+"yToGW0ao3l","0YAGHwDajX","No0Qb6q6L9","i7WMQUmaEv","IRh480Wr5y","sx5GlOz8yZ","rz7Ut7lUXZ","fcwDaJIqXi","l83UdFGzgp","8hJdtQChxs",
+"iB08lCxVEf","8FmFHazIWp","uJScXhUTw7","jtn0X3weIF","SjskQuupzk","ni2v1UmaEv","cmXIX1j5L8","fcJOyCqqaD","ZzJHWhSSvQ","jeskSpv0i7",
+"iwzGkM6qcG","dpe1vtvdkD","zQt6QAmdQd","t98iWUl4a1","Rxrsm8FmFH","FNYIMn1pmO","tAOsr5drc6","guMb8bZLvS","8cVD3FGzgp","uvf7AlXFOB",
+"WMiS3EoToP","VBjhzMmKGJ","IRh48WmadA","faHirQworu","pmeCdtaOXK","8U2nU9GXkX","xciqpFjHXR","v1HlnfcwDa","suY4xPYBf4","ix74rfLNg8",
+"wiHrZuvf7A","8TxD7uPX7G","sqVrfpAhR1","tlILtMK07Y","0h1b1iKqhr","S77LHjiVBP","5nmWvsuY4x","nnP8o1j5L8","hSSvQ7X3uy","TXQ0ZdhSuH",
+"Mkgy8lsQGo","5drc62DREs","i7WMQFGzgp","WPmlxIBe8k","Yh1hFQ6Lix","EdBKcWmadA","FVMxoDQimp","ZUnqtFVMxo","HP433oQ87r","MK07Ypv0i7",
+"Waim6WmadA","kZANmdhSuH","lkMUAy94nw","i3pyduLtKs","fqypylCMxy","ksJbyHlUbF","uLtKs3weIF","Yw2oUIBe8k","nnP8oZv7z0","SbRYyAgJHQ",
+"ru4UG1j5L8","Zv7z00Wr5y","l83UdNAFuw","IjTwPs93Ml","v1Hlnru4UG","GXdoH9GXkX","CdyBV1LB1L","Uvlv4zQt6Q","kZANmBGaQY","jeskSFnPFB",
+"NOHszAgJHQ","nnP8o8U2nU","9y4lwrhl0J","cL0aEogLgc","ix74rvkCHH","zQt6QguMb8","HP4335iGN5","AXpwEFVMxo","0MR5XuZPqg","uQIcz7hyVv",
+"qQxHPazIWp","VNCPdNxx9V","fqypyFFDui","DLhzMEOE1o","I7p2azmLYD","VerEAlm0pD","gdQsSCxVEf","7hyVvK20wK","sx5GliB08l","uoStw6q6L9",
+"CdyBVvkCHH","RBhp09GXkX","VLTy6b29RJ","AgJHQI7p2a","2hEEUFVMxo","gf8rIVjCZq","pmeCdn1pmO","VjCZqpFrrl","gtCA55VZjS","C2Irc0PktI",
+"Uvlv40MR5X","AmdQdGSQwj","F6PT2GXdoH","JJs5mChuy3","Yf2EcSs0Zu","Ul4a1t98iW","FNYIMZuDtD","3weIFD6rBy","JIqXijiVBP","lkMUAOxWIH",
+"gtCA5fqypy","pWiOs8hJdt","qUJMdjiVBP","OUqFMJ2mQi","In3NSFPfSE","MezSWs7Mxk","fLNg8fcwDa","BpYhVgIYvE","dhSuHdhSuH","yvOMIMm8si",
+"blLA9iwzGk","a00b5bgJAz","oGu6xWaim6","oVQp648cHL","55rfBlj07Q","MmsIogjUTu","aL6AJpAhR1","16lHcHlUbF","EOE1oMK07Y","Fhtgln1pmO",
+"JXljWJJs5m","AkKTk7fKYU","M6qcGJRJQB","FcWrWIBe8k","CqqaDhSSvQ","jS1ajsoy9t","64s8NP6bcg","WaWsvWDVWJ","9rlg9pvgjS","HfyNQYw2oU",
+"okgRifqypy","W7cTsPb1pa","qaofNy94nw","Nxx9V580YD","pmeCd1LB1L","atef2IBe8k","FwEJzzHF1q","Ta8f6Yh1hF","zqH0WgtCA5","DcpWB618Di",
+"KASQ8S2Dfu","xciqpECMvU","SbRYyaL6AJ","QClRLWPmlx","dQ586cQOnv","lweGyRBhp0","UmaEvMojnP","BpYhVazIWp","euZA5FLsph","WreyPFPfSE",
+"WmadAsqVrf","Gv3FqhSSvQ","In3NSB3qem","55rfBzqH0W","prNT6MmKGJ","2Nslm2Nslm","pvgjSuQIcz","lweGyHP433","45cIH7fKYU","TCgPpSWfou",
+"7lUXZFPfSE","iKqhr2DREs","vkCHH5drc6","zmLYDTa8f6","brhlQwiHrZ","oQ87r7ku1p","5ZaEz0MR5X","W3VFHJkzUn","5VZjSD6rBy","8RCUAogLgc",
+"M3zXLI7p2a","16lHcpAhR1","lViBvlm0pD","pFrrlM6qcG","zz4ZUx3LDe","LDk6fW7cTs","7fsYMGv3Fq","RBhp0rKDLJ","blLA9Fhtgl","AXpwEFNYIM",
+"2Nslm24ARF","O3iyQ5Mg9r","5IhmGydG8U","d7vjMuupzk","Cfgr3QYxC0","580YDoGu6x","RACujFVMxo","zbIYYzz4ZU","Nxx9VX6Pin","zQt6QnnP8o",
+"zqH0WPb1pa","nFqikx3LDe","580YD6q6L9","jSjS3580YD","AkKTkTa8f6","FGzgpCxVEf","v8yFNh1zcH","aez9y45cIH","kZANm2Nslm","MmsIod85a9",
+"FGzgppiJSk","taOXK5Mg9r","Ss0ZulweGy","BCxeCazIWp","RzaZAnnP8o","Waim6oVQp6","FwEJzi3pyd","cShY29XyT9","dQ586rKDLJ","iqv4kU3yw5",
+"dhSuHUl4a1","fqypyVprf2","m4bxU5nmWv","dpe1v5Namm","MezSWGWqqX","5VZjSXflUq","vkCHHCfgr3","2DREsAmdQd","KsjRKL7cGc","iqv4kdpe1v",
+"jiVBPSjskQ","e6e4zsuY4x","tuDySzz4ZU","n1pmOPOUYS","qUJMdsx5Gl","bZLvSZ4I1v","i3pydt59lR","LewvMi3pyd","OUqFMyvOMI","jS1ajeuZA5",
+"Ta8f6sx5Gl","FVMxoPb1pa","2hEEUFPfSE","kB5nPaL6AJ","rz7UtSWfou","pAhR1ni2v1","pT8wudjsrv","UmaEvWaWsv","AIYUuIKxdL","taOXKpv0i7",
+"U3yw5t98iW","Yw2oUHzZT8","4QMc9jzUqR","bgJAzTa8f6","nFqikOUYuF","tl72WzHF1q","Uvlv4NAFuw","vOqCE16lHc","J2mQiF6PT2","GrDg7nFqik",
+"WDVWJ14FLR","aL6AJazIWp","IBe8kzmLYD","IBe8kpFrrl","07n1cDG4sT","CdyBVm4bxU","KsjRK6q6L9","L7cGc0Kyfs","WMiS3fmIK1","14FLRi3pyd",
+"8xEKzGrDg7","atef2Rxrsm","oVQp6kZANm","WDVWJMojnP","vLsmSIKxdL","v1HlnRBhp0","d85a90h1b1","OUqFMS77LH","s7MxkG1RhS","lH1ktSbRYy",
+"5ZaEzcL0aE","2ZHdkydG8U","Zv7z07lUXZ","0KyfsQssNC","djsrv24ARF","lsQGofcwDa","djsrvNhXdu","2TRI7brhlQ","6q6L94QMc9","RsQUq9y4lw",
+"jzUqRM6qcG","F6PT2BpYhV","Chuy34dEz6","JXljWokgRi","Z4I1v4W0Tl","jzUqR1LB1L","SWfoubgJAz","tl72WJkzUn","aDGtS6AFT0","SWfouQChxs",
+"v8yFNCp3mZ","CNHmvm4bxU","F6PT2l83Ud","ciuWztuDyS","Vprf2ydG8U","0h1b1DcpWB","Waim6tlILt","07n1cP6bcg","cQOnvoQ87r","L7cGcjiVBP",
+"ru4UGzz4ZU","zQt6QX6Pin","dQ586zQt6Q","ksJbyZ4I1v","hi5X7AIYUu","he9IAgIYvE","IRh48BbwgA","t98iWsx5Gl","gjUTurhl0J","lweGyatef2",
+"FxX9qeuZA5","XyPZNNxx9V","WaWsvRpBQm","MojnPaDGtS","TCgPpD6rBy","NhXduJKWYR","580YDAgJHQ","IKxdLI7p2a","h1zcHS77LH","No0QbOUYuF",
+"i7WMQl83Ud","rz7Uts7Mxk","D6rByFcWrW","64s8NMGlTF","fLNg8wiHrZ","EOE1oQClRL","ulk41dhSuH","24ARF6AFT0","9eoRcAgJHQ","blLA9oVQp6",
+"GWqqXaez9y","PYBf4Fhtgl","5VZjSlm0pD","FjHXRW7cTs","uvf7A0MR5X","zqH0Ws93Ml","WPmlxtl72W","IjTwPVLTy6","k85AeDLhzM","7lUXZP6bcg",
+"VLTy6AXpwE","580YDMkgy8","KASQ8lCMxy","W3VFHFnPFB","45cIHFjHXR","7fsYMzHF1q","iqv4kFPfSE","mX2GEPYBf4","MezSWDz1R3","AmdQdfaHir",
+"SmGzvTXQ0Z","v2eC3zz4ZU","zz4ZUh1zcH","ZhwG1uTacx","zY1GYLewvM","0ao3l7hyVv","14FLRHzZT8","Cp3mZFPfSE","sx5GlKASQ8","euZA55nmWv",
+"Yh1hFpv0i7","C2IrcMaJQs","ECMvUzQt6Q","16lHcAmdQd","NAFuwl83Ud","FcWrWjS1aj","zz4ZUtaOXK","UmaEvkZANm","FxX9qBFkb8","45cIHkB5nP",
+"MaJQsfcJOy","ydG8Ud7vjM","GXdoH8cVD3","CIShGjeskS","hSSvQpiJSk","lViBvZv7z0","JXljWQ6hMC","2Yz7EjzUqR","BbwgAUmaEv","HlUbFnnP8o",
+"2TRI7Dz1R3","VBjhzUmaEv","8FmFHK4GS8","GWqqXiKqhr","uQIczCxVEf","0ao3luoStw","MezSWtjQxs","cmXIXQChxs","iKqhrZuDtD","i3pyd5IhmG",
+"dpe1vuPX7G","zmLYDvkCHH","t98iW7hyVv","lH1ktlXFOB","Zv7z09GXkX","qaofNCp3mZ","iKqhrbZLvS","Dz1R3y94nw","DG4sTD6rBy","64s8Ngf8rI",
+"uAWyp0ao3l","YOfrYPb1pa","tvdkD0YAGH","7lUXZgjUTu","ydG8U2Yz7E","AmdQdhUTw7","vkCHHa00b5","AOgEeo8Uyd","rz7UtQClRL","uJScXVBjhz",
+"1v5hH5Mg9r","Gv3Fqv2eC3","lViBvuLtKs","D6rByhSSvQ","RsQUqpFrrl","dmoS7gjUTu","WreyPfcJOy","VjCZqGv3Fq","ru4UGXyPZN","jfREu4W0Tl",
+"jeskSVLTy6","Cp3mZyofH3","lCMxylViBv","pvgjSrhl0J","MojnPm4bxU","WDVWJyToGW","euZA57hyVv","GWqqXsqVrf","hYBCKQ6Lix","RpBQmjtn0X",
+"s4786CxVEf","AIYUuMkgy8","NcICAni2v1","tAOsrU3yw5","gdQsSX6Pin","hE1Ql0YAGH","xciqpMK07Y","nFqikjzUqR","BpYhVFcWrW","Dz1R3M6qcG",
+"7lUXZ0BmCy","Z4I1v1LB1L","KsjRKogLgc","2Yz7ES2Dfu","fcwDa5iGN5","xReecRsQUq","8RCUA0YAGH","JkzUnfqypy","IBe8kK4GS8","k85AeChuy3",
+"zbIYY618Di","BCxeCcL0aE","IRh48D6rBy","Cfgr3HRxd8","FcWrW2Nslm","FwEJzjtn0X","OUYuFprNT6","AkKTkjfREu","vkCHHgf8rI","zQt6QqQxHP",
+"oGu6xO3iyQ","wDajXgjUTu","fFDrJ7Ow5C","FjHXRC2Irc","1j5L8s4786","uLtKszFgtB","guMb84QMc9","EdBKcpmeCd","IKxdLWMiS3","kB5nPQClRL",
+"mX2GElweGy","s93MlTCgPp","hYBCKXflUq","2NslmuAWyp","6AFT0OxWIH","ciuWzRACuj","xciqpMaJQs","bZLvSlXFOB","aFFssgdQsS","In3NSIRh48",
+"No0QbVNCPd","ydG8UKsjRK","GWqqXYjB9t","QClRLjeskS","piJSkazIWp","Gv3FqcmXIX","BGaQYUvlv4","FNYIM0BmCy","FGzgpv1Hln","HfyNQIn3NS",
+"Yh1hFRmDcr","0YAGHs7Mxk","I7p2ajS1aj","qaofNJJs5m","MK07Yi7WMQ","2DREs1j5L8","i3pydZzJHW","0KyfsFnPFB","lsQGoLbRTH","JJs5mVNCPd",
+"RmDcrECMvU","yEfy9kB5nP","3otm6Uvlv4","29QAznFqik","M3zXLDz1R3","VjCZqydG8U","OxWIHogLgc","mX2GEAOgEe","QYxC0xciqp","soy9tzbIYY",
+"VjCZqNxx9V","v2eC3S2Dfu","WMiS3qaofN","24ARFAXpwE","2Nslmdjsrv","4dEz6OHaBz","okgRiaFFss","M3zXLaFFss","BFkb8ReKEW","rKDLJMkgy8",
+"pvgjS5VZjS","Oz8yZtjQxs","FFDuiOz8yZ","SWfoupmeCd","KsjRKZJTXH","jtn0XWaim6","9eoRcmz8gx","uN6r3tuDyS","blLA9xReec","gjUTuCNHmv",
+"PYBf4pAhR1","lkMUAk85Ae","uPX7GpWiOs","lsQGoIn3NS","Y1mC0TCgPp","uPX7Gt59lR","oQ87rUl4a1","RxrsmoGu6x","Kr8ys0PktI","v1Hln4QMc9",
+"oGu6xtl72W","Vprf2i7WMQ","iKqhr8FmFH","7fsYMYOfrY","GSQwj1j5L8","lCMxyHlUbF","4QMc9AXpwE","45cIHyofH3","qaofNix74r","euZA5BbwgA",
+"ThjNne6e4z","MK07Yv2eC3","Cfgr3Chuy3","PYBf4Yw2oU","RBhp0gtCA5","TwanoMmsIo","618DiVprf2","CNHmvRmDcr","blLA9RmDcr","Y1mC0cL0aE",
+"580YDvkCHH","5VZjS4dEz6","e6e4zNcICA","OUqFMfFDrJ","zz4ZUnFqik","qaofNiqv4k","4W0Tlm4bxU","M6qcGWaim6","JXljWi7WMQ","RmDcroVQp6",
+"RACujWDVWJ","9GXkXLewvM","EdBKcCp3mZ","sqVrfU3yw5","pT8wuVBjhz","G1RhSRxrsm","X6Pin1LB1L","VNCPdzHF1q","Mkgy8RmDcr","1j5L8TXQ0Z",
+"jS1ajpFrrl","ThjNn16lHc","cQOnvGWqqX","dhSuHJkzUn","StlDJ6AFT0","Pb1palViBv","AgJHQzFgtB","s7MxkQnJ1S","9iGoTJkzUn","BFkb8No0Qb",
+"AXpwEkB5nP","ogLgcfqypy","0YAGHe6e4z","pvgjS580YD","dmoS7vOqCE","BFkb8MmsIo","2hEEUni2v1","MaJQsgdQsS","v8yFNyToGW","WaWsvMezSW",
+"5IhmGogLgc","yToGWtaOXK","Yw2oUXflUq","cL0aEMmKGJ","zmLYDHP433","POUYS1LB1L","yvOMICfgr3","Chuy3DLhzM","Ss0Zu9eoRc","BFkb8NcICA",
+"BbwgAo8Uyd","aL6AJGXdoH","OUqFMiB08l","6AFT09XyT9","FnPFBSbRYy","ZhwG12TRI7","IjTwP8cVD3","45cIHzmLYD","rKDLJ8TxD7","QssNCHlUbF",
+"ulk41Q6hMC","8TxD7gjUTu","Dz1R3RpBQm","fcwDaIRh48","9iGoT8FmFH","48cHLe6e4z","JJs5m8FmFH","fcwDaVerEA","brhlQzz4ZU","pvgjScQOnv",
+"uoStwm4bxU","bgJAzVIlwP","AgJHQHP433","AIYUuDcpWB","cmXIXLbRTH","jzUqRlm0pD","aFFssNcICA","9XyT9Mm8si","4QMc9XyPZN","AmdQdX6Pin",
+"pvgjSFNYIM","FcWrW7Ow5C","pWiOs45cIH","RzaZAHRxd8","lXFOBVLTy6","jtn0X0h1b1","lj07QWaim6","0BmCyyToGW","aez9yC2Irc","ciuWzLewvM",
+"xciqpY1mC0","nlaByuoStw","wDajX5nmWv","kZANmQworu","FxX9q8FmFH","VBjhzCNHmv","yEfy9tvdkD","5NammmX2GE","QnJ1SRmDcr","tjQxsRpBQm",
+"Cp3mZ0ao3l","uvf7AhUTw7","DQimpCp3mZ","5drc67fKYU","Uvlv4UmaEv","b29RJix74r","MaJQsuQIcz","ciuWzSbRYy","StlDJRACuj","CIShGAmdQd",
+"yvOMIh1zcH","m4bxUEoToP","gIYvEFwEJz","t59lR5IhmG","zQt6QUl4a1","Ul4a1dQ586","5drc69XyT9","FhtglWmadA","WMiS3o8Uyd","KZamHPOUYS",
+"vLsmSb29RJ","9XyT9kZANm","gtCA5uoStw","rz7Ut8U2nU","uTacxCxVEf","8xEKzDcpWB","uLtKsFhtgl","nFqik7hyVv","prNT6azIWp","wiHrZv8yFN",
+"xXTI4RmDcr","xReecIjTwP","RACujWaWsv","ZuDtDe6e4z","K20wK2ZHdk","b29RJVBjhz","4W0TlVNCPd","cQOnvKZamH","14FLRQssNC","4W0Tld7vjM",
+"DQimph1zcH","sx5Gl1j5L8","jzUqRNxx9V","AkKTkCxVEf","zz4ZUlsQGo","v1Hlni3pyd","aL6AJxXTI4","lCMxy24ARF","Ss0Zuk85Ae","SmGzv4dEz6",
+"CxVEfD6rBy","Cfgr3aDGtS","n1pmO8FmFH","1LB1L16lHc","FLsphtAOsr","ix74rPb1pa","dhSuHOxWIH","5Namm3otm6","2ZHdk2hEEU","piJSkMm8si",
+"OHaBzL7cGc","qaofN0MR5X","BGaQYfqypy","YOfrYlH1kt","fFDrJpT8wu","HP433FxX9q","QssNCZv7z0","Chuy31j5L8","9GXkXTa8f6","bgJAzO3iyQ",
+"HfyNQogLgc","CK5W7vLsmS","FhtglpT8wu","GWqqXzmLYD","5iGN5v1Hln","RACujfqypy","IjTwP7lUXZ","U3yw5uLtKs","7lUXZuoStw","fLNg84QMc9",
+"LDk6f5Drn0","U3yw5qQxHP","sx5GlciuWz","i3pydIKxdL","pvgjSZ4I1v","2TRI7ZuDtD","s7MxkzFgtB","VjCZq7Ow5C","Gv3FqECMvU","nFqikRzaZA",
+"YOfrYcShY2","2Nslmix74r","5IhmGgIYvE","FNYIM4W0Tl","mz8gxjiVBP","RxrsmQClRL","AmdQdUl4a1","Uvlv4TXQ0Z","MGlTFEOE1o","StlDJiKqhr",
+"0PktIAIYUu","nFqikCqqaD","8U2nUChuy3","YjB9tRxrsm","StlDJnlaBy","FNYIMG1RhS","07n1ciKqhr","0h1b1k85Ae","Mkgy8RpBQm","JRJQBAOgEe",
+"MK07YzbIYY","Yw2oUReKEW","I7p2at59lR","n8pJ9AOgEe","FVMxouLtKs","UmaEv5IhmG","8RCUASWfou","dpe1vxXTI4","hE1QlVprf2","8cVD3guMb8",
+"Qworumz8gx","dQ586VerEA","D6rByGSQwj","hUTw7AIYUu","wiHrZxciqp","qUJMd5Drn0","FnPFBVLTy6","9y4lw29QAz","tuDySJ2mQi","X6PinY1mC0",
+"rz7Utfqypy","7ku1pZhwG1","VLTy6XyPZN","uZPqgeuZA5","9GXkXC2Irc","tlILtMezSW","bgJAzyofH3","0KyfsguMb8","fcJOyCIShG","Ss0ZuvOqCE",
+"xReecwDajX","d7vjMuoStw","W3VFHCdyBV","DG4sTY1mC0","lsQGoa00b5","J2mQimz8gx","KsjRKJXljW","yluBx6q6L9","NhXduIKxdL","bZLvSReKEW",
+"DcpWBiqv4k","kB5nPSjskQ","1v5hHlm0pD","FjHXRLDk6f","HlUbFJJs5m","hE1QluN6r3","Q6hMCZuDtD","Ul4a1F6PT2","VIlwPzqH0W","Dz1R3guMb8",
+"C2IrcSWfou","AOgEeatef2","ni2v15nmWv","MaJQssuY4x","Ta8f6CxVEf","OUYuFbZLvS","YjB9tVBjhz","KZamHJXljW","tuDySt98iW","W7cTsjeskS",
+"VBjhzDG4sT","djsrvzz4ZU","Vprf25ZaEz","i3pydSs0Zu","LDk6fuQIcz","ThjNnFFDui","v8yFNOxWIH","0MR5XlH1kt","he9IAmz8gx","SbRYyFxX9q",
+"yofH3jzUqR","sqVrfOHaBz","QnJ1S3otm6","IBe8k5ZaEz","qQxHPuAWyp","iwzGkWMiS3","6AFT0Ss0Zu","uoStwxciqp","2DREsVBjhz","0KyfssuY4x",
+"cQOnvZUnqt","7lUXZqaofN","5VZjSk85Ae","Mm8si4W0Tl","BbwgAeuZA5","oGu6xeuZA5","KZamH2Nslm","hSSvQSs0Zu","aez9yFGzgp","e6e4zL7cGc",
+"48cHLTwano","No0QbQworu","xciqpWDVWJ","uJScXTa8f6","BpYhVhSSvQ","zHF1qKZamH","HlUbFGSQwj","FwEJz6q6L9","SWfou24ARF","ThjNnblLA9",
+"TXQ0ZFGzgp","lm0pD7ku1p","Q6Lix5Mg9r","vkCHHWmadA","Mkgy8prNT6","9XyT9S77LH","5NammVjCZq","jSjS3RzaZA","vOqCE2ZHdk","v8yFNK20wK",
+"07n1cjeskS","ulk41bZLvS","hUTw7dmoS7","Zv7z0aez9y","ZuDtDdQ586","JIqXikB5nP","RkQkeuZPqg","WPmlxtjQxs","JXljWmz8gx","pWiOsn8pJ9",
+"xciqpNxx9V","48cHLRsQUq","ru4UGZJTXH","aez9yzbIYY","hE1Ql7ku1p","8cVD3s93Ml","pFrrlMezSW","ReKEWEdBKc","FVMxoBFkb8","QnJ1SCK5W7",
+"W7cTsBFkb8","e6e4zni2v1","QbxXcpmeCd","Gv3FqcL0aE","EdBKcokgRi","MojnP2hEEU","guMb8blLA9","8cVD3tl72W","BFkb8BGaQY","UlU3MFjHXR",
+"BGaQYLDk6f","FLsphjtn0X","G1RhS5nmWv","8cVD3CK5W7","NhXduLewvM","aDGtSuTacx","FhtglRBhp0","iB08luLtKs","lViBv8TxD7","VjCZqPOUYS",
+"lm0pD0Wr5y","FPfSE8cVD3","Waim6Uvlv4","In3NScShY2","YjB9tOxWIH","iwzGkCfgr3","ydG8UpiJSk","prNT6IBe8k","x3LDe5drc6","wDajXv1Hln",
+"xciqpqaofN","LbRTHNcICA","NcICAyofH3","MojnPpvgjS","kB5nPlViBv","ksJbyUl4a1","SWfouuvf7A","ZJTXHlsQGo","ogLgcSjskQ","jiVBPCdyBV",
+"v1HlnpiJSk","gdQsSbgJAz","tuDySy94nw","yToGWBbwgA","ECMvUguMb8","HfyNQokgRi","lweGyFFDui","dhSuHtAOsr","ThjNnFPfSE","FGzgpRpBQm",
+"FPfSEWreyP","nlaByiB08l","NhXduhUTw7","piJSkS2Dfu","M3zXLiqv4k","OUYuFM6qcG","vLsmS2Nslm","nnP8ovkCHH","LbRTH9XyT9","FcWrWnFqik",
+"sqVrfe6e4z","0BmCykB5nP","Gv3FqjfREu","BGaQY2Nslm","0YAGHB3qem","KZamHZhwG1","euZA5tAOsr","d85a9YOfrY","IRh48yvOMI","Z4I1vwiHrZ",
+"dQ586zFgtB","uN6r3VerEA","Zv7z0KZamH","9y4lw4W0Tl","Yw2oU0BmCy","U3yw5OUqFM","RmDcr5Drn0","CNHmvSjskQ","HlUbFmz8gx","ogLgcJRJQB",
+"5drc6djsrv","FnPFBMmsIo","vkCHHjzUqR","RzaZAZ4I1v","DQimpl83Ud","D6rBy5ZaEz","KsjRKxXTI4","OUqFM1j5L8","e6e4zRBhp0","zQt6Q5drc6",
+"zqH0Wiqv4k","FFDuiJIqXi","7lUXZAgJHQ","Dz1R3aDGtS","GWqqXwDajX","CNHmvjzUqR","o8Uyd7X3uy","dpe1vY1mC0","5Drn0uZPqg","QworumX2GE",
+"sx5GlfcwDa","0YAGHG1RhS","euZA5Ul4a1","zmLYDQ6hMC","xReecuvf7A","uN6r3Uvlv4","dmoS7hYBCK","tvdkDuLtKs","mz8gxL7cGc","vkCHHt98iW",
+"QnJ1SAkKTk","2hEEUChuy3","RkQkeQChxs","GSQwjAgJHQ","iwzGkh1zcH","Dz1R3CqqaD","29QAzqUJMd","lm0pD4dEz6","UlU3MMezSW","JIqXi7lUXZ",
+"SjskQS2Dfu","aez9y8hJdt","JKWYR2Yz7E","5IhmGpvgjS","hE1QlNxx9V","v1HlnuJScX","Yf2EcKr8ys","Cfgr3EoToP","pWiOsxciqp","O3iyQrKDLJ",
+"zbIYYZUnqt","gtCA5cQOnv","7ku1pKr8ys","dpe1vQChxs","MmsIoWPmlx","GrDg7RsQUq","J2mQiQ6Lix","4dEz6fmIK1","fcJOyPYBf4","HP433piJSk",
+"i3pyd7Ow5C","QYxC0aL6AJ","AmdQdEoToP","EdBKcwiHrZ","IjTwPSjskQ","dpe1vSmGzv","QChxstAOsr","ZUnqtMmKGJ","48cHLhYBCK","Pb1paFxX9q",
+"9rlg9s4786","Qworuv2eC3","Ul4a1lj07Q","W3VFHBFkb8","l83UdG1RhS","nFqikrz7Ut","JXljWMGlTF","TCgPpHP433","FFDuiYjB9t","oVQp6ulk41",
+"QworuuZPqg","e6e4z5iGN5","QClRL8U2nU","8cVD3FFDui","IRh48EoToP","QnJ1S8U2nU","QnJ1SOUqFM","AIYUuXflUq","3otm6SWfou","7hyVvuPX7G",
+"zFgtBwiHrZ","prNT69rlg9","QYxC0ciuWz","2NslmbgJAz","8FmFHVNCPd","0PktIVBjhz","Cfgr3uQIcz","uupzkn8pJ9","rKDLJKr8ys","fFDrJzz4ZU",
+"Yw2oUaFFss","Qworuru4UG","Cp3mZVIlwP","MaJQs5drc6","5ZaEzZhwG1","MojnPQnJ1S","9eoRcpAhR1","TCgPp5iGN5","QWxoTLewvM","5IhmGsoy9t",
+"ogLgc1j5L8","FjHXRGXdoH","5nmWvRsQUq","U3yw50BmCy","h1zcHMmKGJ","lkMUAfcwDa","5drc6oVQp6","pvgjSNcICA","BCxeCQClRL","jfREu24ARF",
+"ZJTXH5ZaEz","IRh48oGu6x","Kr8ysO3iyQ","s7MxkhUTw7","G1RhSFjHXR","HP433OHaBz","5nmWvZJTXH","Q6LixBpYhV","hi5X7Ul4a1","TXQ0ZVLTy6",
+"JKWYRtvdkD","NOHszQ6hMC","qUJMdRBhp0","bZLvSs93Ml","yvOMIQbxXc","aez9yDQimp","LbRTHprNT6","K4GS8MmKGJ","ZJTXHCK5W7","NhXduGXdoH",
+"Oz8yZlCMxy","CdyBVRkQke","hE1QlW7cTs","d85a9Waim6","Nxx9VYOfrY","X6PinSWfou","jSjS3ZJTXH","YjB9tYf2Ec","MaJQsKASQ8","zQt6QKASQ8",
+"cShY2FGzgp","oGu6xbrhlQ","GXdoHKsjRK","GXdoHtl72W","D6rByVNCPd","POUYSDG4sT","kB5nPdhSuH","lpF6WK4GS8","soy9tdhSuH","9iGoTuN6r3",
+"qUJMdhe9IA","HRxd87lUXZ","5NammD6rBy","uPX7GcQOnv","wDajXhi5X7","BbwgAd85a9","uN6r3HfyNQ","atef28U2nU","PYBf4FGzgp","EdBKcFjHXR",
+"yvOMIpAhR1","5nmWvYjB9t","RmDcrDLhzM","RsQUqRxrsm","n8pJ9lH1kt","uLtKsGv3Fq","xXTI4ZzJHW","1LB1LwiHrZ","29QAzpv0i7","Mm8silViBv",
+"QChxsBbwgA","Yf2EcRACuj","Nxx9VbZLvS","cQOnvL7cGc","uPX7GSWfou","LbRTHbgJAz","zHF1qpAhR1","5iGN5MK07Y","euZA5CIShG","2hEEUzqH0W",
+"cL0aEYOfrY","2TRI7pAhR1","Pb1pajS1aj","W3VFHSjskQ","uupzkTCgPp","lpF6WP6bcg","5nmWvhYBCK","kZANmgjUTu","sqVrfs93Ml","oGu6xo8Uyd",
+"i3pydX6Pin","OHaBzlj07Q","hUTw7MojnP","soy9t9iGoT","O3iyQW7cTs","QYxC0Fhtgl","tl72WzY1GY","07n1c7Ow5C","VLTy6jSjS3","48cHLfFDrJ",
+"wDajXI7p2a","Kr8ysIKxdL","WreyPQChxs","W3VFH48cHL","rhl0JFLsph","okgRi580YD","tuDySnlaBy","hE1QlpT8wu","TwanoDcpWB","AkKTklweGy",
+"jzUqRVBjhz","n1pmOyofH3","d85a9mX2GE","bgJAzFFDui","F6PT2ZUnqt","DQimpJ2mQi","45cIHO3iyQ","NhXdugdQsS","cmXIXFLsph","HfyNQVIlwP",
+"AgJHQUl4a1","dQ586Ta8f6","ReKEWZv7z0","aez9ysx5Gl","Zv7z0nnP8o","Y1mC0atef2","iqv4kAkKTk","K20wKCIShG","KASQ80BmCy","2DREswDajX",
+"LbRTHZzJHW","HzZT8lweGy","cL0aEFwEJz","nFqik45cIH","StlDJHzZT8","VLTy6VBjhz","v2eC38cVD3","0ao3lt98iW","uN6r3Q6Lix","atef2zmLYD",
+"guMb88TxD7","580YDaDGtS","2ZHdkvOqCE","14FLRlpF6W","5VZjSQworu","UlU3MCp3mZ","jzUqR14FLR","MmsIo3otm6","NcICAd7vjM","Oz8yZMK07Y",
+"14FLRlkMUA","45cIHix74r","SmGzvQssNC","tlILtRACuj","LbRTHjeskS","0Wr5y29QAz","FjHXR7Ow5C","atef2M6qcG","HRxd814FLR","v2eC3ciuWz",
+"1j5L8D6rBy","ThjNnL7cGc","5Drn09rlg9","8cVD3K4GS8","vOqCE9GXkX","prNT6lViBv","U3yw5vLsmS","JRJQBReKEW","oVQp6jS1aj","ulk41lsQGo",
+"FVMxoCdyBV","8FmFHpiJSk","SbRYyaez9y","ZUnqt7fKYU","WreyP5iGN5","pT8wuFVMxo","FxX9qS2Dfu","ydG8UnFqik","Mm8siDz1R3","zY1GYBFkb8",
+"HzZT8MojnP","ZhwG1atef2","7fsYMdpe1v","StlDJECMvU","QWxoT9iGoT","tuDyS9y4lw","qaofNgIYvE","djsrvn1pmO","P6bcgTXQ0Z","B3qemJ2mQi",
+"xciqpW3VFH","DLhzMjiVBP","K20wK16lHc","Pb1paChuy3","O3iyQeuZA5","FcWrW5ZaEz","JKWYRRBhp0","gjUTujfREu","soy9tlCMxy","gtCA5wiHrZ",
+"yofH3No0Qb","14FLR9XyT9","zY1GYprNT6","VNCPdWaim6","TXQ0ZXyPZN","LewvMksJby","8TxD7lViBv","MojnPqQxHP","HP4334W0Tl","aDGtSCNHmv",
+"Cfgr3QssNC","hYBCKn1pmO","L7cGccShY2","dpe1vBGaQY","tl72WuPX7G","0PktI1v5hH","Dz1R3In3NS","Vprf2azIWp","AOgEeuPX7G","zz4ZU8cVD3",
+"580YDcL0aE","lkMUAQssNC","NhXduW7cTs","xciqpMmsIo","VjCZq9XyT9","7lUXZ0Kyfs","zY1GY7fKYU","O3iyQqQxHP","v1Hlnmz8gx","yluBxCNHmv",
+"tjQxslH1kt","Oz8yZHlUbF","bZLvS5Drn0","K20wKK20wK","I7p2a4dEz6","5iGN5brhlQ","IBe8khYBCK","MGlTF7fsYM","uJScXuTacx","gdQsS2DREs",
+"Y1mC0JJs5m","8cVD3O3iyQ","5drc6jS1aj","bgJAzWDVWJ","DG4sTi7WMQ","8FmFHVLTy6","2ZHdklm0pD","fFDrJksJby","RzaZAOHaBz","4W0TlW3VFH",
+"Mm8siW7cTs","KASQ8OxWIH","lXFOBix74r","ciuWzVprf2","J2mQiNo0Qb","0BmCyxReec","MaJQsZhwG1","dpe1vEdBKc","6q6L9lweGy","QbxXcDG4sT",
+"EOE1oQYxC0","JJs5mqUJMd","QWxoTfaHir","0MR5X7X3uy","Pb1pafmIK1","OUYuFqQxHP","aL6AJWmadA","MmKGJnlaBy","Kr8ysprNT6","zbIYY0Kyfs",
+"TXQ0ZVjCZq","HRxd8iKqhr","DQimpix74r","EOE1oI7p2a","16lHcoQ87r","oVQp6tuDyS","vLsmSHzZT8","Nxx9VpmeCd","lpF6W8U2nU","AkKTk5ZaEz",
+"zbIYY6AFT0","RACujChuy3","dQ586XflUq","lXFOBUlU3M","atef2jtn0X","n8pJ9Ss0Zu","UmaEvJKWYR","lViBvM6qcG","uupzks7Mxk","Yw2oUVLTy6",
+"e6e4zDQimp","lViBv7lUXZ","taOXKb29RJ","tjQxs0h1b1","Ss0ZukZANm","lm0pDi7WMQ","pT8wuTXQ0Z","lkMUAWMiS3","fqypynlaBy","In3NShe9IA",
+"kZANmdjsrv","45cIHS2Dfu","UlU3MSs0Zu","AkKTkwDajX","4QMc9Cfgr3","t98iWQnJ1S","Mm8siQYxC0","9iGoTK20wK","wiHrZsx5Gl","0PktIpiJSk",
+"o8Uyds93Ml","gdQsSuPX7G","LbRTHnnP8o","0PktIZv7z0","XyPZN4QMc9","2Nslmn1pmO","9eoRc16lHc","7fsYMqaofN","UmaEvoGu6x","iB08lydG8U",
+"MK07YguMb8","guMb8BFkb8","oVQp6jSjS3","AmdQdbZLvS","hE1QlQClRL","tl72W7hyVv","h1zcHYOfrY","kB5nPSWfou","Cfgr3pvgjS","XflUqRxrsm",
+"soy9tnFqik","iKqhriB08l","G1RhSMkgy8","Ss0Zudpe1v","ni2v1he9IA","B3qem9iGoT","uZPqgtaOXK","NOHszVBjhz","dQ586Yw2oU","16lHcW7cTs",
+"k85Ae7fsYM","0ao3l0Wr5y","ulk41lm0pD","UlU3MzHF1q","FNYIM8TxD7","MK07YpiJSk","uQIczXyPZN","9rlg924ARF","uvf7AM6qcG","GXdoHFwEJz",
+"m4bxUuupzk","VLTy6Q6hMC","lweGydpe1v","h1zcHhUTw7","MmsIoJ2mQi","dQ586nFqik","jSjS3FGzgp","m4bxUM3zXL","jtn0X0MR5X","Dz1R3tAOsr",
+"No0Qbsoy9t","J2mQin1pmO","uTacx07n1c","BGaQYxciqp","8hJdtb29RJ","FLsphfmIK1","a00b5IBe8k","uPX7GuJScX","zz4ZUt59lR","fqypyAmdQd",
+"X6Pin16lHc","U3yw5d85a9","fFDrJzY1GY","tuDySRBhp0","ZuDtDZUnqt","StlDJ1j5L8","DQimp2Nslm","AkKTk07n1c","jtn0X7fKYU","nFqikgtCA5",
+"o8UydPOUYS","azIWpfLNg8","uQIczsqVrf","lpF6WXyPZN","kZANmpiJSk","rKDLJe6e4z","wiHrZJIqXi","HfyNQ8hJdt","FFDuiuN6r3","Kr8ysm4bxU",
+"4W0TlFLsph","2Yz7E7ku1p","07n1c8cVD3","W7cTscmXIX","wDajXrz7Ut","5ZaEzCIShG","JJs5mM3zXL","FjHXRh1zcH","YOfrYzz4ZU","2ZHdk580YD",
+"aez9yY1mC0","FVMxo0h1b1","29QAzn8pJ9","48cHLQssNC","Ss0ZuazIWp","gdQsSDz1R3","16lHcEdBKc","RmDcr580YD","xciqpuvf7A","ni2v1EdBKc",
+"piJSkNOHsz","ZJTXH618Di","xciqpHRxd8","i7WMQn1pmO","ECMvUmX2GE","s4786uN6r3","JIqXiLDk6f","X6PinIBe8k","JJs5mQClRL","K20wKnFqik",
+"O3iyQjzUqR","taOXKhYBCK","FnPFBy94nw","U3yw5W7cTs","QWxoTcL0aE","uAWypUlU3M","WPmlx0Wr5y","WMiS3tAOsr","RkQkeFGzgp","O3iyQNAFuw",
+"W3VFHsoy9t","9eoRcqaofN","uoStwvkCHH","Y1mC08cVD3","lweGyAgJHQ","ZUnqtQ6Lix","ydG8UYjB9t","2ZHdkv8yFN","TXQ0Z4QMc9","uAWypRmDcr",
+"AmdQd7fsYM","s93Mlgf8rI","3weIF24ARF","XflUqJXljW","ZhwG17fKYU","5drc65IhmG","gf8rIlXFOB","QworuJkzUn","Cfgr3DQimp","uvf7AIjTwP",
+"AmdQdKASQ8","9iGoTuupzk","nlaByvOqCE","Yh1hFokgRi","RpBQmt98iW","hYBCK5nmWv","m4bxUlCMxy","lCMxyS77LH","XyPZNzqH0W","uTacxlCMxy",
+"zmLYDWDVWJ","SmGzvJKWYR","3weIFv2eC3","v8yFNVprf2","IKxdLdQ586","yToGWQ6hMC","AkKTk1LB1L","SWfouMK07Y","L7cGcDG4sT","l83UdlH1kt",
+"NhXdu45cIH","rz7Ut1LB1L","In3NS14FLR","Oz8yZPb1pa","uAWyplH1kt","dmoS7IKxdL","guMb8OHaBz","aez9yoVQp6","zHF1qKASQ8","24ARFm4bxU",
+"HRxd8UlU3M","14FLRUl4a1","HRxd8GXdoH","lXFOBQworu","5drc6okgRi","AgJHQ0ao3l","mX2GEU3yw5","jSjS3Yh1hF","tjQxsVIlwP","suY4x6AFT0",
+"HzZT8tl72W","jtn0XWMiS3","6q6L9OUYuF","x3LDelCMxy","8cVD3D6rBy","Oz8yZl83Ud","QWxoTSjskQ","JXljW4W0Tl","7ku1pxReec","VjCZqFjHXR",
+"m4bxUv1Hln","qQxHPb29RJ","y94nwCK5W7","5iGN55nmWv","3weIFW3VFH","Cfgr3Q6hMC","Rxrsm45cIH","6q6L9QssNC","2TRI7nnP8o","OHaBzMmKGJ",
+"FxX9q5iGN5","v2eC3rz7Ut","Yw2oU55rfB","BCxeCPYBf4","5iGN5GXdoH","SmGzvdhSuH","d85a9EdBKc","MaJQsMmsIo","Ul4a1gtCA5","yToGW3otm6",
+"uPX7Glj07Q","L7cGc5drc6","IBe8kYjB9t","lweGyAXpwE","uAWypYw2oU","VIlwPiqv4k","Dz1R3ru4UG","faHirDz1R3","CNHmv1LB1L","zz4ZUyluBx",
+"CK5W7Y1mC0","v2eC3yluBx","29QAzDz1R3","zqH0WCqqaD","FFDuiNOHsz","Z4I1vtaOXK","RzaZAIjTwP","9eoRcsqVrf","nFqikzY1GY","iqv4kvOqCE",
+"Ss0ZuJ2mQi","tjQxsOz8yZ","RmDcrgdQsS","0Wr5yFLsph","AXpwEt98iW","x3LDefcwDa","Q6Lix07n1c","jtn0XGrDg7","0Kyfs9iGoT","C2IrcG1RhS",
+"kB5nPtvdkD","zY1GYS2Dfu","n1pmOtl72W","KZamHlCMxy","pvgjSgdQsS","POUYShi5X7","5nmWvSWfou","Q6Lix9eoRc","ni2v1Ss0Zu","O3iyQWmadA",
+"cL0aE9rlg9","2DREsjfREu","n1pmO9y4lw","1j5L8uoStw","ZuDtDnFqik","jfREuzmLYD","gIYvEOHaBz","s93MlXflUq","D6rByYOfrY","9eoRcpT8wu",
+"5Drn0Nxx9V","5drc6IKxdL","D6rByDG4sT","2hEEUQssNC","Ul4a1JXljW","iB08lBGaQY","Oz8yZEoToP","Nxx9VK20wK","ulk41RpBQm","1v5hHIRh48",
+"FVMxoatef2","VerEAU3yw5","VerEAC2Irc","F6PT2t98iW","JIqXiSbRYy","brhlQfcJOy","0MR5XsuY4x","BFkb8qaofN","TwanouN6r3","FnPFBfFDrJ",
+"xciqpRzaZA","VerEAjfREu","6AFT0MK07Y","0Wr5y0YAGH","zHF1qIBe8k","1LB1LvkCHH","KASQ84QMc9","tuDySfcwDa","t98iWeuZA5","OxWIHpiJSk",
+"WmadAEdBKc","0Wr5yDG4sT","ydG8U0YAGH","pT8wuCdyBV","Uvlv4fcJOy","RACujsqVrf","ReKEWuLtKs","ZuDtDcmXIX","QnJ1SOxWIH","y94nwHzZT8",
+"b29RJn1pmO","fqypyW3VFH","pvgjSUvlv4","fcwDaNcICA","MmKGJdmoS7","iB08lfLNg8","QChxsCdyBV","aL6AJW7cTs","Pb1padpe1v","h1zcHdmoS7",
+"gjUTuCxVEf","pv0i7iwzGk","lkMUAyofH3","8FmFHlViBv","BGaQYciuWz","vOqCE1j5L8","Waim6sx5Gl","jtn0XksJby","7hyVvfaHir","kB5nP9iGoT",
+"RACujDG4sT","4W0Tl9GXkX","qaofNFcWrW","GWqqXfmIK1","mz8gxBbwgA","M6qcGMkgy8","zHF1qtlILt","Kr8ysOz8yZ","TwanoOxWIH","BFkb8ZUnqt",
+"VIlwPWreyP","uLtKsZzJHW","VjCZquoStw","uTacxsoy9t","5Mg9r4W0Tl","7X3uymX2GE","dhSuHhYBCK","Q6hMCpiJSk","FwEJzdhSuH","lkMUACIShG",
+"ni2v1AOgEe","rKDLJNhXdu","0YAGHUvlv4","7fKYUaez9y","Cp3mZn8pJ9","LewvMDQimp","G1RhSAIYUu","WMiS3ix74r","KsjRK0BmCy","29QAzVerEA",
+"LbRTHatef2","wDajXZhwG1","QClRLt59lR","2NslmQWxoT","RzaZACxVEf","uLtKsBbwgA","GXdoHlj07Q","Y1mC0IKxdL","hYBCK9iGoT","1LB1LuAWyp",
+"1LB1LRxrsm","GrDg7piJSk","lViBvlpF6W","zHF1qiqv4k","YjB9td7vjM","CdyBV9GXkX","pFrrl0MR5X","qUJMdtl72W","tuDyStAOsr","U3yw507n1c",
+"Q6hMCvOqCE","7fKYUgdQsS","XflUqRsQUq","9XyT9Y1mC0","iwzGk2hEEU","pmeCdsuY4x","jtn0XtuDyS","Nxx9VFhtgl","uZPqg0BmCy","JKWYRAOgEe",
+"6q6L91j5L8","lm0pDFcWrW","i3pydjiVBP","yofH3ZzJHW","S2Dfu9iGoT","i3pydZUnqt","Yf2EcUl4a1","uJScXsuY4x","qaofN0YAGH","QnJ1SQ6Lix",
+"YjB9tJJs5m","Mm8sipAhR1","OUqFM29QAz","t59lR1LB1L","LewvMfcwDa","29QAzs7Mxk","W3VFHgjUTu","jzUqRQClRL","pT8wuqaofN","CxVEfNcICA",
+"hE1QlWaWsv","Cfgr3OUqFM","ZhwG1gjUTu","9GXkX5ZaEz","oVQp65nmWv","lCMxy5VZjS","gjUTuZJTXH","618DiOz8yZ","QWxoTSWfou","Z4I1vs93Ml",
+"RACujmz8gx","fLNg8PYBf4","gdQsSfmIK1","LewvMJRJQB","jSjS3Z4I1v","YjB9tW3VFH","pAhR1e6e4z","DLhzM2hEEU","W7cTslm0pD","JRJQB5Mg9r",
+"WreyPK4GS8","QnJ1S5VZjS","KASQ8xciqp","9iGoTVBjhz","Yf2Ecs93Ml","Yw2oUx3LDe","580YDuJScX","I7p2ayluBx","BFkb8FPfSE","lm0pDa00b5",
+"jtn0XmX2GE","BCxeCsqVrf","AXpwEfLNg8","FhtglQYxC0","LewvMOxWIH","cL0aEIjTwP","s7MxkoGu6x","hYBCKogLgc","blLA9In3NS","POUYSHzZT8",
+"pv0i7ZhwG1","J2mQiFxX9q","0ao3lt59lR","lj07QQYxC0","O3iyQX6Pin","5drc6gdQsS","s7MxkcQOnv","guMb855rfB","tAOsrChuy3","8cVD3DcpWB",
+"rhl0JJIqXi","X6PinpWiOs","G1RhSMK07Y","tjQxsFGzgp","VNCPdGSQwj","lCMxyFGzgp","Mkgy8MK07Y","vkCHH8hJdt","Uvlv4hSSvQ","azIWp5Mg9r",
+"HfyNQYjB9t","6q6L9v1Hln","OUYuFciuWz","pv0i77Ow5C","oVQp6IRh48","QWxoTgdQsS","UlU3M9y4lw","FxX9qFxX9q","Yf2EcyToGW","OHaBz8cVD3",
+"hi5X7Q6hMC","zFgtBk85Ae","iKqhrcShY2","In3NSWDVWJ","cmXIXS77LH","In3NSAXpwE","3otm6zmLYD","AkKTk9GXkX","F6PT2blLA9","zHF1qlj07Q",
+"StlDJfcwDa","lsQGot98iW","gdQsSJXljW","G1RhSlweGy","bgJAzGv3Fq","k85Aeiqv4k","5Drn0ogLgc","VIlwPzQt6Q","IBe8kv2eC3","AgJHQnFqik",
+"L7cGcFcWrW","AkKTktjQxs","OUYuFGWqqX","qQxHPfaHir","DQimpBbwgA","tjQxsuJScX","WaWsvsqVrf","zmLYDpAhR1","GWqqXWDVWJ","MmKGJbrhlQ",
+"AXpwEtvdkD","7hyVv1LB1L","VIlwPciuWz","oVQp6yEfy9","O3iyQMaJQs","TwanoNhXdu","RpBQmHRxd8","8U2nUCdyBV","brhlQiB08l","Cfgr3CdyBV",
+"lViBvNhXdu","JJs5m6q6L9","2ZHdkiqv4k","NhXdupFrrl","GrDg7oGu6x","FwEJzyToGW","WmadA580YD","Dz1R3ksJby","d7vjMoGu6x","ogLgcNcICA",
+"he9IAFwEJz","EdBKcvLsmS","FVMxouTacx","FcWrW0Wr5y","zqH0Wa00b5","YOfrYRxrsm","lsQGoPb1pa","D6rByMojnP","FNYIMWDVWJ","uLtKs2ZHdk",
+"0h1b1Uvlv4","EOE1oGv3Fq","cmXIXDLhzM","In3NS3weIF","3weIF4QMc9","JJs5mOxWIH","lViBvdmoS7","DcpWB8RCUA","VBjhzksJby","Oz8yZJKWYR",
+"BpYhVOxWIH","l83UdzmLYD","O3iyQFVMxo","dhSuH7hyVv","8RCUAl83Ud","fqypyP6bcg","3otm60ao3l","GrDg77lUXZ","7fKYUZJTXH","ciuWzG1RhS",
+"FnPFB9iGoT","tuDySlkMUA","suY4xPb1pa","bZLvSQYxC0","XflUqFjHXR","C2IrcGXdoH","taOXKzQt6Q","MezSWcL0aE","rKDLJ0YAGH","MojnP7X3uy",
+"CqqaD8RCUA","dhSuHDQimp","lsQGo5drc6","gf8rIkB5nP","5Drn0yluBx","sqVrfSWfou","G1RhSKsjRK","SmGzvCK5W7","4dEz6FNYIM","jfREui7WMQ",
+"GSQwjQbxXc","cQOnvuQIcz","WPmlxkB5nP","gdQsSOHaBz","AXpwEpFrrl","QbxXc24ARF","POUYSVerEA","jfREuRkQke","l83Udt98iW","fLNg8I7p2a",
+"RsQUq2ZHdk","LDk6flXFOB","pFrrlnlaBy","580YD9XyT9","Zv7z0tvdkD","AOgEeRmDcr","0Wr5yFwEJz","QWxoTaFFss","l83Ud8U2nU","8TxD7Nxx9V",
+"2NslmMmsIo","3weIF48cHL","o8UydHfyNQ","1j5L80ao3l","xReecOz8yZ","F6PT2wiHrZ","No0QbcShY2","uAWypeuZA5","FLsphGv3Fq","oQ87rjeskS",
+"9rlg9iKqhr","KsjRKi7WMQ","sx5GlrKDLJ","faHiraez9y","guMb8JRJQB","l83UdIn3NS","lm0pDMGlTF","qaofN8hJdt","5VZjSGXdoH","14FLRWMiS3",
+"7ku1p0PktI","Vprf2LbRTH","he9IA5IhmG","fqypyjzUqR","iKqhrMK07Y","POUYS2ZHdk","HP433ru4UG","ZhwG1W3VFH","zQt6QcL0aE","lsQGofcJOy",
+"l83UdAIYUu","Z4I1vsoy9t","fFDrJCIShG","5Mg9rlj07Q","CIShGuZPqg","VBjhzMmsIo","ZuDtDChuy3","blLA9AOgEe","fcwDaoQ87r","jiVBP5Namm",
+"wDajXtuDyS","O3iyQ2ZHdk","NcICAGv3Fq","KZamHSbRYy","F6PT2JkzUn","rKDLJh1zcH","VLTy6EdBKc","Chuy3h1zcH","suY4xLDk6f","nlaBy8FmFH",
+"UlU3MlpF6W","fcwDaAOgEe","HP433ogLgc","xXTI4guMb8","dhSuHOz8yZ","aL6AJ2DREs","gf8rIt98iW","2DREsJkzUn","d85a97ku1p","FLsph55rfB",
+"cL0aEM3zXL","Mkgy89GXkX","zbIYYChuy3","FVMxo0Kyfs","v2eC3U3yw5","tjQxsCfgr3","pvgjS14FLR","dpe1vjfREu","aL6AJlH1kt","aL6AJlCMxy",
+"y94nw0PktI","48cHLOHaBz","i7WMQ29QAz","NAFuwvOqCE","tl72WIKxdL","aDGtSNo0Qb","48cHLMezSW","48cHL6q6L9","HRxd8JIqXi","B3qemyluBx",
+"14FLRNOHsz","oVQp6a00b5","FFDuipAhR1","8cVD3ni2v1","Cfgr3oVQp6","aez9yuZPqg","IjTwPYf2Ec","kZANmNhXdu","AOgEeLDk6f","POUYScShY2",
+"In3NSUlU3M","7lUXZtAOsr","dmoS7lpF6W","29QAzQworu","CqqaDgf8rI","9XyT9pFrrl","QYxC0jS1aj","5Drn0fmIK1","kZANmaez9y","cQOnv9eoRc",
+"hSSvQjzUqR","RpBQmZUnqt","kB5nPwiHrZ","Q6hMCUlU3M","pmeCdjS1aj","MK07YSjskQ","0YAGHuQIcz","s93MlRpBQm","ogLgcTa8f6","K20wKD6rBy",
+"uupzkuQIcz","cShY2Ta8f6","fLNg8a00b5","ZuDtDfmIK1","uoStw9iGoT","pv0i7aFFss","KASQ8ReKEW","ciuWzfaHir","ZzJHWS2Dfu","mX2GEyEfy9",
+"m4bxUNxx9V","WDVWJWmadA","TwanoWDVWJ","cmXIXd85a9","FjHXRuvf7A","CNHmvrKDLJ","uupzkSjskQ","XflUqUvlv4","8cVD3XyPZN","5ZaEz9GXkX",
+"M3zXLpmeCd","tjQxsgf8rI","2DREslweGy","QWxoTYf2Ec","uvf7Apv0i7","TXQ0ZTa8f6","P6bcgyToGW","XyPZNBGaQY","EoToPzQt6Q","SjskQ7Ow5C",
+"5iGN5DG4sT","POUYSSmGzv","GrDg7jS1aj","tjQxsgjUTu","t59lRuLtKs","JKWYRyEfy9","9XyT9L7cGc","prNT6l83Ud","24ARFWreyP","HlUbFn8pJ9",
+"EoToPNhXdu","AkKTkQbxXc","ix74rcmXIX","Oz8yZX6Pin","SjskQ0MR5X","uN6r37fsYM","FGzgpOUYuF","M6qcGF6PT2","rhl0JGXdoH","HP433jiVBP",
+"HlUbFzbIYY","FLsphpFrrl","yluBxzmLYD","yvOMIi7WMQ","BGaQYQworu","D6rByRACuj","Vprf2FcWrW","Oz8yZGXdoH","zbIYYHlUbF","FhtglpWiOs",
+"AOgEeaL6AJ","vkCHHfFDrJ","Kr8ysi7WMQ","RBhp0QWxoT","VerEARmDcr","fLNg8MmKGJ","48cHLIn3NS","55rfBHRxd8","NOHszIjTwP","S77LHO3iyQ",
+"nnP8oGWqqX","jeskSogLgc","VNCPd0Wr5y","29QAzbgJAz","7ku1p7Ow5C","rhl0J8hJdt","W7cTs8xEKz","ZhwG1Ss0Zu","GWqqXLbRTH","uoStwo8Uyd",
+"rhl0JU3yw5","s7MxkJKWYR","0Wr5ygf8rI","DcpWBru4UG","uvf7ApmeCd","tjQxsU3yw5","Q6hMCXflUq","NAFuwUvlv4","ix74rJIqXi","lpF6Wi3pyd",
+"lsQGoJkzUn","n8pJ9Ul4a1","ZuDtDulk41","Kr8ysiKqhr","U3yw5StlDJ","HfyNQtvdkD","kZANmzqH0W","v8yFNhSSvQ","s93MlKsjRK","qUJMdJJs5m",
+"HzZT8lpF6W","6q6L9zHF1q","FLsphJXljW","CqqaD2DREs","vkCHHStlDJ","l83UdQ6Lix","bZLvSbgJAz","AXpwEOxWIH","zmLYDRpBQm","qQxHPaez9y",
+"y94nwAIYUu","PYBf4Cfgr3","ECMvUWreyP","FGzgp0ao3l","i3pydtuDyS","gf8rI0PktI","Chuy3dQ586","WreyP14FLR","FwEJzRkQke","DQimpFFDui",
+"1j5L8dpe1v","FcWrWxXTI4","RsQUqcL0aE","HP433D6rBy","djsrvO3iyQ","CNHmv9XyT9","tjQxsaez9y","8TxD7XflUq","iqv4kJ2mQi","HfyNQFNYIM",
+"zQt6QpvgjS","FGzgpjzUqR","uJScXuupzk","KZamHprNT6","QChxsiB08l","4W0TlSjskQ","7Ow5CzbIYY","8hJdtFxX9q","aL6AJtuDyS","fmIK1o8Uyd",
+"F6PT2uQIcz","hi5X7yEfy9","ZhwG1SjskQ","LDk6fRACuj","jS1ajbrhlQ","jtn0X5nmWv","SmGzvrKDLJ","5VZjSMmKGJ","uN6r37X3uy","Cfgr3RzaZA",
+"Waim69eoRc","QworuB3qem","8U2nUJKWYR","S77LHW7cTs","YjB9t7Ow5C","3otm6JKWYR","lweGyM3zXL","2Yz7EAIYUu","Cfgr3LDk6f","BCxeCL7cGc",
+"pv0i7L7cGc","BFkb8HlUbF","L7cGcrz7Ut","dpe1vMkgy8","qaofNMGlTF","Vprf2n8pJ9","WDVWJWaim6","QYxC08cVD3","ogLgcnFqik","4W0TlAIYUu",
+"8TxD7ZuDtD","24ARFzFgtB","1j5L8wiHrZ","GrDg70MR5X","vkCHHRmDcr","aez9yjeskS","bZLvSOUqFM","VNCPdhe9IA","RxrsmRpBQm","tjQxsECMvU",
+"mz8gxS77LH","Ul4a1POUYS","euZA5VerEA","s7Mxkix74r","s7MxkChuy3","Ul4a17ku1p","Chuy3kB5nP","S77LHVjCZq","Z4I1vfLNg8","hYBCKvLsmS",
+"7lUXZfaHir","YjB9t0MR5X","pAhR1Y1mC0","uPX7G0ao3l","gIYvEX6Pin","lpF6Wy94nw","RzaZAtAOsr","B3qemprNT6","No0QbKsjRK","n1pmOFGzgp",
+"JJs5mO3iyQ","b29RJb29RJ","WPmlxtAOsr","RsQUqs93Ml","fcwDani2v1","UlU3MQChxs","WaWsvTXQ0Z","pv0i7oGu6x","bgJAzNcICA","M6qcGMmKGJ",
+"Yh1hFb29RJ","S77LHCp3mZ","IRh48bgJAz","M3zXLguMb8","a00b5Ul4a1","55rfBF6PT2","0BmCyqQxHP","NcICAFcWrW","5nmWv580YD","rKDLJUmaEv",
+"kB5nPIRh48","Nxx9VuTacx","UmaEvRBhp0","KASQ8bZLvS","64s8NuQIcz","pFrrlZzJHW","RzaZAo8Uyd","CdyBVk85Ae","AOgEezY1GY","jSjS3yofH3",
+"JKWYREOE1o","TXQ0Z8hJdt","8RCUAuAWyp","tAOsrQnJ1S","618DiU3yw5","h1zcHP6bcg","lm0pDtjQxs","MezSWRsQUq","6AFT03weIF","hUTw7iwzGk",
+"RmDcrgIYvE","oGu6xvOqCE","2Yz7Ehe9IA","AOgEeZUnqt","8U2nU8RCUA","k85AeO3iyQ","x3LDee6e4z","Uvlv4C2Irc","I7p2acL0aE","UmaEvFLsph",
+"Pb1panlaBy","1v5hHi7WMQ","QClRLrKDLJ","nlaByaL6AJ","rz7UtAOgEe","pT8wu8TxD7","7X3uyzQt6Q","pvgjS2ZHdk","jeskSdpe1v","ix74rCfgr3",
+"FLsphFjHXR","lXFOBoGu6x","K20wKiB08l","jiVBPLbRTH","pmeCdIBe8k","QClRL0PktI","lweGyRACuj","M6qcGyofH3","ix74rX6Pin","zQt6QZzJHW",
+"JRJQBzQt6Q","4dEz6pWiOs","55rfBv1Hln","xciqpYh1hF","AkKTkJ2mQi","DQimpi7WMQ","h1zcHzz4ZU","gdQsSsx5Gl","CdyBVdhSuH","jtn0Xmz8gx",
+"4dEz62ZHdk","Mkgy8Gv3Fq","HfyNQsqVrf","fcwDaGWqqX","Kr8ysNcICA","HRxd8DG4sT","0BmCy5nmWv","zQt6QlH1kt","aDGtSaez9y","mz8gxCxVEf",
+"lweGySjskQ","7fsYMAXpwE","IBe8kvOqCE","ksJbyAkKTk","Q6LixFVMxo","lm0pDSs0Zu","rz7UtpvgjS","7lUXZ7fKYU","dpe1vru4UG","a00b5W3VFH",
+"fmIK1aL6AJ","CqqaDwDajX","2ZHdkksJby","2hEEUyluBx","JJs5muvf7A","zz4ZUwiHrZ","HP433MojnP","Q6LixZJTXH","9y4lwW3VFH","pFrrlfcJOy",
+"FnPFBFLsph","BCxeCdmoS7","2Yz7EuAWyp","dmoS7G1RhS","RmDcrQ6hMC","6AFT0pmeCd","Oz8yZ580YD","fFDrJaFFss","AgJHQkZANm","zbIYYRpBQm",
+"jzUqRThjNn","RzaZA8U2nU","FLsphHRxd8","QssNCJRJQB","55rfBFwEJz","taOXKTa8f6","1v5hHGSQwj","QChxsfqypy","aFFssWMiS3","4W0TljfREu",
+"0KyfsrKDLJ","zY1GYaL6AJ","Zv7z0AXpwE","KZamHHRxd8","U3yw5fLNg8","vLsmSFVMxo","euZA5y94nw","zY1GYLDk6f","Ul4a1ZhwG1","HRxd8ReKEW",
+"BbwgAnnP8o","mz8gxyofH3","QbxXcksJby","uTacxtAOsr","5Namm1LB1L","lm0pDMezSW","ix74r5drc6","CIShGzY1GY","fcJOyK20wK","BpYhVTXQ0Z",
+"IKxdLfFDrJ","KZamHWDVWJ","8U2nUEdBKc","brhlQpvgjS","SjskQgdQsS","POUYSuN6r3","EoToPsoy9t","8U2nUs7Mxk","d85a9TXQ0Z","JJs5mVjCZq",
+"MaJQsIjTwP","9eoRcgtCA5","8U2nUtAOsr","jSjS3BpYhV","oQ87r2TRI7","RBhp0k85Ae","7hyVvogLgc","guMb8MezSW","uoStwVprf2","iB08lGWqqX",
+"sqVrfbZLvS","kZANmpv0i7","WmadAjzUqR","VjCZq2Nslm","tvdkD5Drn0","mX2GEo8Uyd","fcwDaHRxd8","gIYvEHlUbF","i3pydBFkb8","d85a9aL6AJ",
+"fcJOy5Drn0","4W0TluJScX","Dz1R3NhXdu","OxWIH2hEEU","MmKGJ0YAGH","kB5nP29QAz","DLhzMqaofN","fcJOy8cVD3","he9IA5Drn0","0Wr5yx3LDe",
+"rKDLJ2TRI7","0h1b17lUXZ","vOqCEbZLvS","tl72WpmeCd","RmDcr5drc6","guMb8NhXdu","5iGN51j5L8","P6bcgoQ87r","WreyP0h1b1","VLTy6Yf2Ec",
+"0MR5XBbwgA","MGlTFoGu6x","aez9yuQIcz","a00b5uupzk","MGlTFyofH3","5nmWvkZANm","v8yFNuJScX","Twanos7Mxk","MmsIo0BmCy","WPmlxRsQUq",
+"K4GS88U2nU","SmGzv3otm6","Z4I1vLbRTH","s4786Vprf2","VLTy6tAOsr","FGzgptl72W","AXpwEn8pJ9","Gv3FquN6r3","7fsYMuQIcz","2Nslm16lHc",
+"Kr8ysjS1aj","07n1cm4bxU","uvf7AzbIYY","Waim6QYxC0","QWxoT4QMc9","JkzUnGv3Fq","G1RhSG1RhS","uAWyp8cVD3","lH1ktRxrsm","3weIFC2Irc",
+"6AFT0uZPqg","bZLvSzqH0W","pmeCdHP433","rz7Utni2v1","d7vjMydG8U","0KyfsazIWp","n8pJ9CNHmv","sx5GleuZA5","cQOnvmX2GE","atef2MGlTF",
+"tAOsr6AFT0","I7p2at98iW","gtCA58hJdt","euZA5VNCPd","pv0i7Qworu","t98iWru4UG","zFgtB24ARF","jS1aj7fsYM","kZANmrhl0J","h1zcHv2eC3",
+"0KyfsRACuj","FcWrWFPfSE","RsQUq7X3uy","VLTy6kB5nP","hYBCKCK5W7","uZPqgi3pyd","azIWpDQimp","mz8gxjeskS","Kr8ys8RCUA","0Kyfshe9IA",
+"vLsmSF6PT2","SmGzvB3qem","Twano4W0Tl","ThjNn0ao3l","ydG8Urz7Ut","faHiro8Uyd","ZzJHWlweGy","PYBf4gdQsS","QbxXcPOUYS","B3qemfFDrJ",
+"0ao3lVprf2","gjUTuQnJ1S","fFDrJaDGtS","l83UdEoToP","24ARFOUqFM","580YDRsQUq","t59lRFPfSE","yEfy9Nxx9V","VerEAhe9IA","FcWrWkZANm",
+"aL6AJvkCHH","yvOMIDcpWB","Zv7z0Mm8si","fFDrJkZANm","7ku1pyluBx","iB08lJKWYR","6AFT0gf8rI","GWqqXFjHXR","rz7UtlXFOB","GXdoHUvlv4",
+"oQ87rvLsmS","dmoS7DG4sT","VIlwP9rlg9","guMb80ao3l","0YAGHjzUqR","7fKYUoQ87r","HP433ZzJHW","ECMvUnnP8o","WDVWJ7Ow5C","Oz8yZCfgr3",
+"6q6L99XyT9","9y4lwguMb8","tuDySJIqXi","6AFT00BmCy","ni2v1zY1GY","In3NSzqH0W","WmadA1LB1L","iwzGkpvgjS","y94nw0YAGH","3weIFP6bcg",
+"WMiS3piJSk","Uvlv4h1zcH","No0QbciuWz","oVQp62Nslm","ksJbyqUJMd","t98iWECMvU","lweGyFhtgl","Mkgy82Nslm","uAWypMm8si","he9IAQnJ1S",
+"jzUqRWMiS3","Zv7z0O3iyQ","zHF1qVjCZq","VerEADQimp","iqv4kW3VFH","Ul4a1lsQGo","Mkgy8P6bcg","RzaZAiB08l","SjskQbgJAz","cL0aEiwzGk",
+"aL6AJOUqFM","NAFuwm4bxU","uZPqguAWyp","rhl0JTCgPp","5drc6LewvM","aFFssuupzk","6AFT0azIWp","Kr8ysLDk6f","NOHszCdyBV","EOE1ofqypy",
+"cmXIXYw2oU","fcwDaFjHXR","0h1b1HRxd8","NcICAprNT6","hi5X7dmoS7","s4786QnJ1S","0h1b1qUJMd","55rfBcmXIX","IKxdLJkzUn","VNCPdGXdoH",
+"kZANm7ku1p","K20wKSbRYy","3weIFlj07Q","YOfrYK4GS8","soy9t8hJdt","uupzkpWiOs","0h1b1Ul4a1","FPfSEkB5nP","Nxx9V9iGoT","FjHXR5Namm",
+"pAhR148cHL","qUJMdIjTwP","9GXkX5iGN5","jiVBPsx5Gl","VNCPdpAhR1","4QMc9BCxeC","Uvlv4zY1GY","TXQ0ZQChxs","2hEEUbZLvS","tjQxsTa8f6",
+"Oz8yZgjUTu","h1zcHRxrsm","he9IANhXdu","BbwgAhi5X7","24ARFC2Irc","oQ87rpFrrl","wDajXtvdkD","FhtglVBjhz","AXpwEZJTXH","8U2nUXyPZN",
+"QworuJRJQB","JkzUnW3VFH","5nmWvMmKGJ","jzUqRzz4ZU","SbRYyJIqXi","0MR5X2hEEU","uPX7Grz7Ut","d7vjMOUYuF","8cVD3P6bcg","sqVrf9GXkX",
+"mX2GEQClRL","uJScXMm8si","BFkb8I7p2a","No0QbYf2Ec","Yw2oU0ao3l","he9IAUl4a1","G1RhSTCgPp","WaWsvZuDtD","i3pydtlILt","8U2nUpFrrl",
+"GrDg7atef2","v1HlnCdyBV","55rfBpAhR1","In3NSRpBQm","iB08liwzGk","AXpwEL7cGc","8TxD7oVQp6","3weIFuAWyp","GrDg7lCMxy","cQOnvciuWz",
+"lH1ktNcICA","VIlwP7hyVv","oVQp6KASQ8","hE1Qlatef2","l83UdZuDtD","2Yz7EnFqik","aFFss7Ow5C","aDGtS1LB1L","xReecHzZT8","fcJOy8hJdt",
+"okgRi48cHL","Gv3FqBFkb8","CdyBVQWxoT","VNCPd6AFT0","QClRLi3pyd","NhXduVNCPd","7hyVvjeskS","cL0aE7X3uy","QWxoT2DREs","zmLYD8xEKz",
+"VerEAlCMxy","SWfousqVrf","gIYvEKr8ys","lj07QGrDg7","h1zcHReKEW","uQIcz48cHL","rz7UtfLNg8","pWiOsOHaBz","CIShGNxx9V","fcwDaMK07Y",
+"soy9tThjNn","VLTy6tuDyS","D6rBydpe1v","CIShGEOE1o","bgJAzThjNn","prNT6MaJQs","ZUnqtciuWz","fFDrJzbIYY","W7cTsPOUYS","1j5L8MezSW",
+"zFgtBm4bxU","cL0aEuLtKs","S77LHfcJOy","lH1ktx3LDe","9iGoTtuDyS","jSjS3NcICA","3otm6FNYIM","nlaByk85Ae","S77LHix74r","EOE1oJJs5m",
+"M6qcGxReec","jeskSZuDtD","zFgtBMmKGJ","6AFT00h1b1","zY1GYksJby","QWxoTuoStw","BCxeCdhSuH","uTacxKASQ8","CdyBVuupzk","LDk6fQ6Lix",
+"aez9ySmGzv","9y4lwtuDyS","2ZHdkd7vjM","MojnPEOE1o","TXQ0Z2hEEU","VerEA5nmWv","kZANm9rlg9","5nmWvVBjhz","dQ586FPfSE","0h1b1VNCPd",
+"I7p2a2DREs","ZzJHWo8Uyd","48cHLuLtKs","JRJQB2Nslm","hUTw7gdQsS","a00b5VBjhz","sx5GlMaJQs","b29RJ2DREs","EOE1oWMiS3","Chuy39rlg9",
+"IRh48In3NS","aDGtSl83Ud","KsjRKjS1aj","OHaBzuPX7G","SbRYyVerEA","IKxdLAXpwE","ulk41WaWsv","lkMUAh1zcH","ReKEWMezSW","6q6L9xXTI4",
+"B3qemlsQGo","CqqaD8cVD3","5IhmGW7cTs","3otm6EOE1o","KASQ8tlILt","07n1c2hEEU","yEfy9MGlTF","S2Dfuo8Uyd","VerEAUl4a1","Mm8sihE1Ql",
+"AXpwECfgr3","SWfouQ6hMC","bgJAz5Namm","Pb1paJkzUn","GrDg7dhSuH","AOgEelm0pD","uJScXStlDJ","HP433jSjS3","Zv7z0m4bxU","NhXdu5iGN5",
+"NOHszpWiOs","8TxD7Cp3mZ","bgJAzOUqFM","aL6AJ29QAz","Kr8ysZv7z0","Nxx9VLbRTH","VjCZq4QMc9","YOfrYuN6r3","AgJHQpFrrl","TCgPp2ZHdk",
+"jtn0Xo8Uyd","vLsmSjeskS","9rlg9uZPqg","7fKYU0Kyfs","16lHcGSQwj","ZUnqtMkgy8","QnJ1SKZamH","WmadAVerEA","sqVrf5Namm","uLtKsFwEJz",
+"GrDg7F6PT2","ThjNnkB5nP","FxX9qSWfou","Y1mC0VLTy6","WreyPHP433","SmGzvOxWIH","s93MluAWyp","ReKEW29QAz","lpF6WaDGtS","uN6r3OUYuF",
+"GXdoHb29RJ","UlU3MeuZA5","LewvMtaOXK","8U2nU64s8N","zY1GYhE1Ql","piJSklkMUA","bgJAzRBhp0","guMb8GXdoH","1LB1LFnPFB","StlDJjSjS3",
+"WmadAL7cGc","suY4xhE1Ql","8cVD3Ul4a1","ZuDtDW7cTs","tAOsrqUJMd","iKqhrzmLYD","v8yFNlm0pD","Mkgy8e6e4z","xReecGSQwj","iwzGk7X3uy",
+"0YAGHYw2oU","lm0pDcmXIX","uJScXuAWyp","SjskQmX2GE","8RCUAcL0aE","GrDg7n1pmO","Q6LixazIWp","m4bxUFwEJz","a00b507n1c","QbxXcd7vjM",
+"FPfSE5IhmG","8cVD3fcwDa","Zv7z0e6e4z","uAWypdhSuH","t98iW7Ow5C","e6e4zJ2mQi","tAOsrYf2Ec","AOgEepmeCd","1v5hHiKqhr","IKxdLRBhp0",
+"QChxsKr8ys","VIlwPThjNn","AkKTkQ6Lix","Kr8ys1v5hH","M3zXLJIqXi","uN6r3pT8wu","8hJdtaDGtS","RmDcrFNYIM","5Nammsoy9t","Y1mC04W0Tl",
+"zz4ZUNcICA","Mkgy8lCMxy","TCgPpfaHir","9eoRcO3iyQ","K20wKDcpWB","2ZHdkl83Ud","QbxXc4W0Tl","7Ow5CVNCPd","qUJMdv2eC3","16lHcB3qem",
+"RkQkekB5nP","VNCPdy94nw","i3pydIn3NS","ZUnqtEdBKc","oQ87rdpe1v","Uvlv4aDGtS","8xEKzTCgPp","gIYvEfLNg8","7lUXZoQ87r","iKqhreuZA5",
+"d85a9ulk41","8FmFHhe9IA","MmsIoIn3NS","8cVD3hSSvQ","EoToP5Namm","POUYSaDGtS","8TxD7Waim6","uZPqgMkgy8","lViBvFjHXR","mz8gxyEfy9",
+"t59lRbZLvS","5ZaEzmz8gx","Rxrsm5Namm","ZhwG1rKDLJ","xReecjeskS","gtCA55nmWv","YOfrYBCxeC","FcWrWxciqp","lpF6WFLsph","AOgEeMkgy8",
+"KsjRK5IhmG","55rfBLDk6f","gjUTuFxX9q","piJSk9eoRc","taOXKd7vjM","Mm8siF6PT2","7Ow5CkZANm","jfREujeskS","7ku1ptvdkD","uupzkni2v1",
+"faHir24ARF","fmIK1soy9t","uupzkQChxs","YjB9tDG4sT","FwEJz7Ow5C","zmLYD48cHL","9eoRcVprf2","5Mg9rtl72W","vLsmSBbwgA","zY1GYUlU3M",
+"nnP8o8TxD7","FNYIMt59lR","JIqXiYw2oU","uTacxRzaZA","IjTwPsoy9t","prNT6fFDrJ","5VZjS16lHc","h1zcHMkgy8","WMiS30YAGH","FLsphyEfy9",
+"Yw2oUGrDg7","cQOnv5Mg9r","Gv3Fqm4bxU","s93MlCIShG","RBhp0s4786","pFrrlYOfrY","aez9yWMiS3","GWqqXVIlwP","9GXkXwDajX","dhSuHn1pmO",
+"Chuy3ReKEW","55rfBhSSvQ","ECMvU8xEKz","yToGWAIYUu","pFrrlqaofN","vLsmSyToGW","WDVWJ9iGoT","he9IAW7cTs","Yf2Ec4W0Tl","BbwgAWMiS3",
+"6q6L9y94nw","KZamHb29RJ","NOHszMkgy8","ulk41EdBKc","Uvlv4LewvM","VLTy62DREs","ZuDtDlViBv","DQimppmeCd","1j5L8HzZT8","Q6LixJ2mQi",
+"ydG8UogLgc","IRh485Mg9r","v8yFNtaOXK","BGaQYazIWp","cQOnvrz7Ut","UlU3MlCMxy","v2eC3hSSvQ","ZUnqtsuY4x","xXTI49y4lw","azIWpuZPqg",
+"tAOsrxXTI4","v1HlnuLtKs","hUTw7CNHmv","IRh485VZjS","55rfBsqVrf","uN6r3xciqp","UmaEvtaOXK","45cIHuQIcz","5Drn0X6Pin","ZJTXHbrhlQ",
+"aFFssMGlTF","RsQUqblLA9","pWiOsdjsrv","CNHmvYw2oU","FxX9qWDVWJ","8hJdthi5X7","2Yz7E0ao3l","yluBxRpBQm","QChxs7ku1p","oGu6xuQIcz",
+"xciqpMm8si","euZA52TRI7","QnJ1S0MR5X","7ku1puAWyp","7X3uyhUTw7","NOHszi3pyd","uTacxHRxd8","he9IAx3LDe","mX2GEtuDyS","gjUTu2Nslm",
+"OHaBzi3pyd","AkKTkt59lR","NhXdutuDyS","2TRI7MmKGJ","07n1cAOgEe","QClRL2hEEU","zHF1qBCxeC","lH1ktydG8U","fLNg8s4786","MK07YuZPqg",
+"7ku1ppFrrl","45cIHrhl0J","uQIczFxX9q","nlaByBpYhV","14FLRmX2GE","pvgjS0h1b1","MojnPd85a9","lXFOBAmdQd","ni2v1Yw2oU","m4bxUaFFss",
+"azIWpSbRYy","zmLYDAOgEe","8TxD7AkKTk","1LB1LoVQp6","jzUqRUlU3M","HlUbF9XyT9","BbwgAtaOXK","jSjS37ku1p","Zv7z07fKYU","hYBCKfaHir",
+"d85a9GSQwj","FcWrWeuZA5","jfREuVNCPd","jtn0XAmdQd","MK07YzY1GY","DcpWBuAWyp","FnPFBpWiOs","t98iWZv7z0","d7vjMix74r","euZA59y4lw",
+"Zv7z0P6bcg","XflUqaL6AJ","cShY27fKYU","kZANmKr8ys","GXdoHEdBKc","CxVEfv8yFN","s93Ml4QMc9","5drc6MaJQs","DQimpEdBKc","lj07QNcICA",
+"YOfrY24ARF","jfREuh1zcH","uTacx7lUXZ","cQOnvWaim6","618Di1LB1L","RpBQmjzUqR","aDGtSYOfrY","Yh1hFjzUqR","ydG8UF6PT2","kZANmL7cGc",
+"VLTy6FcWrW","J2mQi9GXkX","tAOsrAkKTk","MezSWxXTI4","qaofNtAOsr","EdBKcJRJQB","ThjNnCNHmv","ZzJHWrz7Ut","No0QbCdyBV","uvf7ADG4sT",
+"Cp3mZfmIK1","8hJdt7fsYM","TCgPpAkKTk","RzaZAiwzGk","TXQ0ZqUJMd","tlILtDcpWB","qaofNcQOnv","VNCPd29QAz","v2eC3IBe8k","0KyfsaDGtS",
+"AXpwEGXdoH","CK5W7ni2v1","0KyfsMK07Y","ni2v107n1c","pAhR10h1b1","taOXKVjCZq","FxX9qZJTXH","Qworujtn0X","AgJHQM6qcG","wiHrZDLhzM",
+"brhlQzQt6Q","ogLgcMmKGJ","FcWrWblLA9","FhtglzY1GY","StlDJGSQwj","Yf2EcFNYIM","jSjS3G1RhS","lweGyNxx9V","WmadAVLTy6","DcpWB5iGN5",
+"XflUqGSQwj","mX2GEYjB9t","ReKEWGv3Fq","dpe1vCIShG","JKWYRIBe8k","m4bxUStlDJ","suY4xJ2mQi","yToGWHlUbF","4dEz64QMc9","hYBCKydG8U",
+"CIShGAkKTk","lXFOBFNYIM","taOXK64s8N","8U2nUI7p2a","Y1mC064s8N","16lHclViBv","9GXkXAXpwE","TCgPpix74r","P6bcgOHaBz","1j5L84QMc9",
+"SWfouFnPFB","s93MlEoToP","RpBQmprNT6","Yf2Ec5iGN5","fcJOygjUTu","5VZjSWDVWJ","cQOnviKqhr","dQ586JXljW","9iGoTd85a9","qQxHPulk41",
+"uZPqggtCA5","FLsphtaOXK","pAhR1Mm8si","uupzkbgJAz","64s8NlpF6W","Yh1hFIRh48","piJSkdpe1v","jiVBPfcwDa","0YAGH5drc6","RsQUqPb1pa",
+"xReecGXdoH","7lUXZe6e4z","07n1cZJTXH","t59lRaFFss","EOE1oJIqXi","zbIYYgdQsS","NAFuwChuy3","vkCHHCNHmv","dhSuH48cHL","Waim6rKDLJ",
+"5ZaEzQworu","5Mg9rIRh48","IBe8kFNYIM","Q6Lixzz4ZU","5Nammtl72W","ZUnqtDG4sT","Mm8siPYBf4","I7p2afcwDa","K4GS8n8pJ9","h1zcHkB5nP",
+"DLhzMS77LH","QChxssqVrf","QssNC64s8N","7lUXZgIYvE","9y4lw9rlg9","fLNg80Wr5y","RsQUqFPfSE","1v5hHGXdoH","TXQ0ZWaWsv","cQOnvTa8f6",
+"7fsYMVjCZq","vOqCELDk6f","SWfouVjCZq","Yf2Eco8Uyd","hi5X75drc6","FPfSEVerEA","taOXKm4bxU","Pb1paeuZA5","RBhp0uPX7G","WaWsv14FLR",
+"lkMUAVerEA","ZUnqt7Ow5C","2DREsS77LH","LbRTHKsjRK","uvf7A8TxD7","1j5L8gdQsS","o8UydjS1aj","7fKYUYh1hF","tlILtoQ87r","zQt6QfFDrJ",
+"ogLgcYh1hF","9GXkXRpBQm","fcJOyYOfrY","pAhR1uQIcz","9XyT9MezSW","fqypyQChxs","LbRTHzQt6Q","he9IAyofH3","GrDg7DQimp","xReecYw2oU",
+"d7vjMAOgEe","NAFuwaFFss","a00b5v8yFN","B3qemjfREu","8hJdt8hJdt","aez9yiB08l","WPmlxMK07Y","Z4I1vK4GS8","Cp3mZjtn0X","uQIczdmoS7",
+"qQxHP2ZHdk","QClRLfFDrJ","GWqqXqaofN","dmoS7gtCA5","MGlTFkB5nP","TXQ0ZQ6Lix","zHF1qHlUbF","faHirv1Hln","L7cGcZUnqt","J2mQibgJAz",
+"NcICAyEfy9","wDajXv8yFN","VerEAS77LH","VBjhziB08l","Gv3Fqulk41","Y1mC0Pb1pa","G1RhSrKDLJ","F6PT2ZhwG1","9rlg9zmLYD","uTacxMaJQs",
+"lCMxyVjCZq","AkKTkDcpWB","QYxC0t59lR","AgJHQgIYvE","IjTwPqQxHP","Kr8ysGXdoH","zmLYDW3VFH","CxVEfazIWp","F6PT29rlg9","W7cTsni2v1",
+"RkQkeBbwgA","2TRI7GrDg7","4dEz6WmadA","9XyT9vkCHH","14FLRIn3NS","FGzgpy94nw","mX2GENAFuw","yvOMIix74r","n8pJ95Drn0","Cp3mZEoToP",
+"uTacxVprf2","jS1ajgdQsS","0PktIs93Ml","EOE1ohE1Ql","Gv3FqFcWrW","jeskSUmaEv","4dEz6gf8rI","nFqikM3zXL","OUYuFhUTw7","XflUq0Kyfs",
+"ix74ri7WMQ","DcpWBzmLYD","JRJQBNOHsz","mz8gxzFgtB","ECMvUSs0Zu","suY4xYjB9t","HfyNQCIShG","b29RJ48cHL","WreyPFwEJz","lCMxyVNCPd",
+"uLtKsuvf7A","2Yz7EuLtKs","RkQkerKDLJ","7fKYUsx5Gl","zz4ZUDQimp","YjB9tBGaQY","Mkgy8d7vjM","gjUTuyofH3","Oz8yZReKEW","5IhmGpAhR1",
+"29QAzRxrsm","X6PinlsQGo","ydG8UHP433","iB08lC2Irc","Rxrsm9rlg9","qQxHP2Nslm","i3pydVNCPd","FxX9qulk41","RpBQmC2Irc","ZJTXHjfREu",
+"Zv7z0DcpWB","bZLvSfmIK1","VLTy6M6qcG","cShY2jSjS3","Uvlv4gIYvE","TwanoZv7z0","Ss0Zui7WMQ","CNHmvxciqp","In3NSNhXdu","No0QbWDVWJ",
+"FPfSEAmdQd","vOqCEx3LDe","ReKEWVBjhz","hSSvQAIYUu","x3LDeBFkb8","hE1QlUl4a1","MaJQs3weIF","v1HlnZv7z0","G1RhSyofH3","No0Qb3weIF",
+"Pb1paCK5W7","Twano55rfB","QClRL6q6L9","7fsYMJXljW","StlDJyofH3","D6rByQssNC","CIShGK4GS8","2hEEUm4bxU","VIlwPe6e4z","C2Ircl83Ud",
+"Cp3mZ5Drn0","dQ586FwEJz","OUYuFlm0pD","5VZjSnlaBy","guMb8lH1kt","StlDJ3otm6","gtCA58RCUA","vkCHHI7p2a","YjB9te6e4z","1v5hHd85a9",
+"OxWIHrz7Ut","WaWsvblLA9","cShY2t98iW","Uvlv4IRh48","1v5hHX6Pin","2hEEUs7Mxk","lCMxyDQimp","Ss0ZuoQ87r","rKDLJt98iW","AOgEeWMiS3",
+"ZUnqtlViBv","nlaByNxx9V","WPmlxFGzgp","EoToPUlU3M","RsQUq7fsYM","vkCHHPOUYS","d7vjM9GXkX","Nxx9VtlILt","v1Hlndpe1v","lj07Qtl72W",
+"hE1Qldjsrv","X6PinRACuj","blLA90MR5X","9y4lwVjCZq","0MR5XSs0Zu","JKWYR9XyT9","qaofNjSjS3","oQ87rSs0Zu","8TxD7JJs5m","L7cGc48cHL",
+"5Nammxciqp","uJScXl83Ud","0YAGHulk41","MmsIo45cIH","7lUXZuvf7A","tjQxstl72W","Dz1R3WPmlx","MaJQs8cVD3","Pb1pacQOnv","OUYuFBpYhV",
+"n1pmO2ZHdk","2ZHdkaDGtS","HlUbFuZPqg","AIYUuB3qem","5drc6rKDLJ","8RCUAulk41","XyPZNuLtKs","8xEKzzmLYD","xReecChuy3","AXpwEb29RJ",
+"QYxC0tjQxs","X6PinRsQUq","In3NSlCMxy","pmeCduPX7G","MmsIoKr8ys","Ta8f6I7p2a","580YDMmsIo","EoToPuLtKs","VNCPdyluBx","sx5GlB3qem",
+"qQxHPQbxXc","ECMvUSbRYy","FxX9qyEfy9","yofH3AXpwE","GWqqXmX2GE","d85a9dhSuH","J2mQiuQIcz","he9IAgtCA5","zmLYDyToGW","9y4lw8TxD7",
+"GXdoH0YAGH","QWxoTWMiS3","MmsIosx5Gl","9iGoTzqH0W","55rfBDLhzM","HzZT82Yz7E","SjskQU3yw5","dmoS7m4bxU","RACujBpYhV","uTacx14FLR",
+"SjskQAmdQd","AkKTkWreyP","QClRLIKxdL","Q6LixmX2GE","ulk415Namm","LDk6fFVMxo","hE1QluQIcz","vLsmSv8yFN","JRJQBZzJHW","GWqqX8RCUA",
+"Zv7z0G1RhS","s4786qaofN","uoStwQYxC0","uPX7G9XyT9","Oz8yZhi5X7","v2eC3d85a9","JJs5mQworu","rhl0JqaofN","ZhwG1AIYUu","VerEAuZPqg",
+"0MR5XvkCHH","Gv3FqGSQwj","cQOnvQ6hMC","ydG8UkZANm","FNYIM0ao3l","xciqpGXdoH","zqH0W1j5L8","WmadAzqH0W","16lHcyluBx","jS1ajOUYuF",
+"zFgtB9iGoT","Yh1hFRzaZA","lH1ktM3zXL","Mm8siECMvU","VerEAaL6AJ","TCgPpPb1pa","QworuAOgEe","t98iWciuWz","n1pmOm4bxU","pAhR1I7p2a",
+"7ku1pzY1GY","tuDySSWfou","JJs5mBFkb8","ydG8UFcWrW","5Mg9rQWxoT","fqypyZuDtD","gf8rItlILt","FGzgppAhR1","hYBCKcmXIX","FLsph16lHc",
+"M3zXL9iGoT","EoToPHzZT8","ZzJHWuoStw","FnPFBIRh48","Pb1paStlDJ","jtn0XbZLvS","he9IAZUnqt","tlILtM3zXL","QssNChi5X7","8RCUAFNYIM",
+"AOgEeuoStw","2ZHdkqaofN","zFgtBMmsIo","ksJbypvgjS","x3LDeMojnP","l83Ud1v5hH","ydG8USs0Zu","S2DfuRxrsm","5IhmGLDk6f","gdQsSWDVWJ",
+"tl72WRBhp0","VLTy6CNHmv","KASQ845cIH","7hyVv9rlg9","fcJOyXyPZN","Cp3mZd7vjM","NcICAh1zcH","HRxd80BmCy","nFqikOHaBz","o8UydAgJHQ",
+"In3NS2hEEU","dpe1vtjQxs","oVQp6s7Mxk","rKDLJzY1GY","RACujrKDLJ","qaofNh1zcH","ZzJHWdpe1v","5Drn0wDajX","IBe8kIn3NS","P6bcg618Di",
+"ogLgcYf2Ec","d7vjMI7p2a","fFDrJn1pmO","MK07YQworu","3otm6DcpWB","Waim6Ss0Zu","BbwgAiqv4k","uLtKsSjskQ","cQOnvBCxeC","BpYhVSs0Zu",
+"TCgPpUmaEv","IKxdLXflUq","lViBvJIqXi","2ZHdk07n1c","fcJOyrz7Ut","blLA9azIWp","Dz1R3IRh48","uJScXUvlv4","BCxeC5IhmG","8FmFHFGzgp",
+"Pb1paWPmlx","KZamHlkMUA","07n1cpT8wu","Zv7z0lpF6W","yluBxuQIcz","3weIFaDGtS","faHirOHaBz","iwzGkCK5W7","2DREs64s8N","l83UdaL6AJ",
+"SbRYylsQGo","RBhp0iKqhr","aez9yfcwDa","FjHXRFnPFB","v2eC3LbRTH","JKWYRxciqp","lsQGoAXpwE","mX2GEhSSvQ","pAhR15iGN5","tl72Wuupzk",
+"FFDui9y4lw","0KyfsQYxC0","CK5W7ulk41","ydG8UJ2mQi","fcJOyi3pyd","pT8wuIKxdL","s7MxkcmXIX","djsrv0Wr5y","SmGzvs4786","l83Ud3otm6",
+"djsrv45cIH","5iGN5OUqFM","SjskQMkgy8","ni2v13otm6","JkzUnAgJHQ","BFkb8OUqFM","NOHszM6qcG","lpF6W5ZaEz","VLTy6cQOnv","JRJQBDLhzM",
+"oGu6xFFDui","i3pyd9rlg9","XyPZNkB5nP","0YAGHpmeCd","MmKGJ0BmCy","zqH0WLbRTH","5VZjS29QAz","LbRTH16lHc","7fsYMLbRTH","X6PinBbwgA",
+"iKqhrWDVWJ","RBhp0zbIYY","FjHXRogLgc","EoToP7X3uy","WreyPJXljW","DLhzMh1zcH","jSjS3dQ586","7lUXZ45cIH","5VZjSUmaEv","rKDLJ7hyVv",
+"SbRYyzqH0W","5ZaEzzz4ZU","VerEAJJs5m","16lHc0Wr5y","ZuDtDjtn0X","brhlQZzJHW","BFkb8lViBv","tl72WQChxs","vkCHHwiHrZ","RzaZAUmaEv",
+"HzZT8QYxC0","8RCUAYf2Ec","WMiS3Dz1R3","Ta8f6FFDui","Y1mC0v8yFN","aFFsswDajX","sqVrflViBv","6q6L9Ss0Zu","0h1b1djsrv","64s8N8TxD7",
+"fqypyWmadA","MaJQs0PktI","jfREu3weIF","azIWp3weIF","JRJQBJ2mQi","pFrrlLbRTH","lkMUAhSSvQ","9eoRctAOsr","cShY2Qworu","LDk6flweGy",
+"RkQkeqQxHP","rz7UtBCxeC","K20wK9iGoT","14FLRcmXIX","Yh1hFXflUq","QssNCZhwG1","zmLYDhYBCK","Mkgy8VIlwP","Ul4a1JKWYR","zmLYDtvdkD",
+"5Mg9rsoy9t","8cVD3ksJby","d85a9fLNg8","ECMvUX6Pin","yEfy9No0Qb","WMiS38FmFH","8U2nUvOqCE","RkQkeZUnqt","NhXduMm8si","5Drn0h1zcH",
+"fFDrJFPfSE","Yh1hFEOE1o","vOqCEjfREu","dmoS7aFFss","vOqCEsx5Gl","ru4UGlCMxy","pT8wuHP433","9rlg9h1zcH","ZJTXHMezSW","xXTI4qQxHP",
+"gtCA5Cfgr3","JXljWFGzgp","ECMvUfLNg8","yvOMIzQt6Q","VIlwPPYBf4","pmeCd5VZjS","lCMxysoy9t","U3yw5U3yw5","tuDySpiJSk","VLTy6JJs5m",
+"DcpWBlCMxy","45cIHbgJAz","NOHszQYxC0","HRxd8dmoS7","lpF6WCK5W7","s4786prNT6","pAhR1Gv3Fq","rhl0JRpBQm","UmaEvciuWz","gtCA5fcwDa",
+"Z4I1vNcICA","9GXkX7ku1p","5Drn0RsQUq","zbIYYyluBx","W7cTs9XyT9","GrDg7prNT6","FPfSEtuDyS","wiHrZgdQsS","cShY2sqVrf","B3qemmz8gx",
+"ydG8UM3zXL","PYBf4tvdkD","jeskSK20wK","5Drn0x3LDe","TCgPp7X3uy","K20wK24ARF","SbRYyGv3Fq","I7p2aPYBf4","VerEAuoStw","gIYvE0MR5X",
+"lkMUAsuY4x","okgRilCMxy","WDVWJi7WMQ","ix74rfaHir","hUTw7fcJOy","Y1mC0hi5X7","aez9yJKWYR","OHaBzuN6r3","WPmlxzFgtB","lCMxypT8wu",
+"kZANmksJby","soy9tXflUq","WPmlxblLA9","pAhR1zHF1q","Q6hMCyluBx","euZA5JIqXi","NhXdubZLvS","Zv7z0WaWsv","n1pmOy94nw","WPmlxv2eC3",
+"WPmlxfaHir","5Drn0atef2","ZzJHWaez9y","lpF6WFhtgl","6q6L9NcICA","45cIHtvdkD","tjQxsAIYUu","yToGWwiHrZ","fFDrJFwEJz","Uvlv4nFqik",
+"yEfy9ZzJHW","WMiS3ydG8U","lm0pD8hJdt","lCMxyaDGtS","In3NSv1Hln","nlaBy2TRI7","vLsmSXflUq","M6qcG2ZHdk","vOqCEZhwG1","mz8gxJRJQB",
+"RxrsmlpF6W","8TxD7uLtKs","uJScXzbIYY","EOE1orz7Ut","Dz1R37hyVv","2Yz7EuPX7G","No0QbuQIcz","gtCA5aFFss","8cVD3vOqCE","lsQGoMGlTF",
+"O3iyQxReec","iqv4kpmeCd","tAOsrksJby","EoToPCK5W7","VNCPdWreyP","sqVrfgf8rI","Vprf2G1RhS","n1pmORzaZA","VLTy6aL6AJ","lsQGoZ4I1v",
+"Q6hMCFGzgp","WMiS3xXTI4","Oz8yZVLTy6","VIlwPb29RJ","i7WMQWPmlx","TCgPp0YAGH","lm0pD2ZHdk","lpF6WuAWyp","L7cGcFjHXR","zmLYDL7cGc",
+"0MR5Xjtn0X","s7MxkrKDLJ","hi5X7lpF6W","LbRTHfaHir","No0Qb0Kyfs","618DiFPfSE","Ta8f6qaofN","KZamHtl72W","2Yz7E0h1b1","07n1ctvdkD",
+"FLsphWaim6","NcICAfFDrJ","2NslmWDVWJ","AgJHQ9eoRc","Yf2EcK20wK","K20wKFhtgl","JRJQBAkKTk","yEfy9IjTwP","U3yw5SbRYy","QnJ1Sk85Ae",
+"D6rByvkCHH","UlU3MZJTXH","vLsmSZJTXH","BCxeCQ6hMC","tuDySStlDJ","4dEz6b29RJ","CK5W7ReKEW","CqqaDCK5W7","KsjRK4QMc9","8hJdtZ4I1v",
+"gtCA5Twano","PYBf4uN6r3","oGu6xgtCA5","MmsIoZuDtD","MaJQsgf8rI","DQimplm0pD","QnJ1Sdjsrv","euZA5Cfgr3","Oz8yZydG8U","Chuy3UlU3M",
+"2TRI748cHL","oGu6xlweGy","Waim6Cfgr3","HlUbFdQ586","n8pJ9SbRYy","hSSvQZv7z0","QChxsvkCHH","tl72WWDVWJ","azIWpRpBQm","RpBQmcL0aE",
+"nFqikVLTy6","h1zcH8cVD3","OHaBzblLA9","euZA5JKWYR","UmaEvnlaBy","o8UydpmeCd","5nmWv2DREs","pAhR1wiHrZ","v2eC3NOHsz","3otm6iwzGk",
+"RkQkeyofH3","48cHLHlUbF","7hyVvaFFss","t59lRfaHir","BbwgAguMb8","X6PinK20wK","FVMxoQChxs","nFqikjfREu","4QMc9CNHmv","rz7UtVprf2",
+"Ss0Zuv1Hln","1LB1Lk85Ae","Yf2Ecgf8rI","zY1GYhSSvQ","Uvlv4POUYS","YOfrY7Ow5C","fLNg8UmaEv","iKqhrjzUqR","5Mg9rGSQwj","lViBv0MR5X",
+"Dz1R37fsYM","2TRI7k85Ae","VIlwPSmGzv","LewvMTCgPp","VLTy6FwEJz","Z4I1vHP433","hUTw7Kr8ys","yluBxuJScX","pmeCdBGaQY","d7vjMyluBx",
+"suY4xyToGW","pT8wuMmKGJ","IRh48aFFss","JJs5mn1pmO","BpYhV4W0Tl","ECMvUMojnP","s93MlAkKTk","yofH3kZANm","cL0aE8cVD3","5ZaEz0PktI",
+"RBhp0qUJMd","xXTI44W0Tl","S77LHJJs5m","sx5GlJXljW","6q6L95Drn0","BpYhVgf8rI","2Yz7Et98iW","wiHrZNOHsz","FjHXR3otm6","J2mQifcwDa",
+"lH1ktBpYhV","XflUqBCxeC","NAFuw0PktI","Ss0ZuuTacx","VLTy6CK5W7","qUJMdMmsIo","s4786Ta8f6","0h1b1soy9t","SbRYyBpYhV","0Wr5yM3zXL",
+"U3yw555rfB","5Drn0DcpWB","9rlg9gIYvE","Waim67ku1p","FxX9qd7vjM","5Mg9rFFDui","NcICAFwEJz","jiVBPNo0Qb","7X3uylCMxy","MmsIo9GXkX",
+"5NammXyPZN","TCgPppmeCd","nnP8oRsQUq","uupzkChuy3","ZJTXHVBjhz","2DREslm0pD","ZJTXHsuY4x","1j5L82Yz7E","nFqik48cHL","HRxd8QbxXc",
+"ksJbyyofH3","yEfy9J2mQi","tuDySAXpwE","Q6LixQbxXc","580YDK20wK","uN6r3jSjS3","MmsIozqH0W","DcpWB9eoRc","zz4ZUcShY2","n1pmOpAhR1",
+"DLhzMqQxHP","CIShGMm8si","580YDJKWYR","dpe1v3weIF","bgJAzcL0aE","piJSkrz7Ut","OxWIHrhl0J","pT8wubrhlQ","blLA9fcwDa","taOXKSs0Zu",
+"In3NSChuy3","8xEKzlCMxy","iB08lzY1GY","TCgPpNhXdu","v2eC3Ss0Zu","Cfgr39XyT9","yofH3IjTwP","2DREsDz1R3","S77LHXyPZN","v2eC3FFDui",
+"Ta8f64W0Tl","0ao3lFLsph","9eoRcZUnqt","lH1ktk85Ae","14FLRk85Ae","9XyT9mX2GE","Yh1hFuAWyp","fmIK1RACuj","8TxD7kZANm","gf8rIrz7Ut",
+"vkCHHzmLYD","QWxoT29QAz","JRJQBWreyP","14FLRkZANm","AgJHQ3otm6","CIShGUvlv4","zQt6QJkzUn","ZuDtDfaHir","YOfrYC2Irc","WmadAi7WMQ",
+"CNHmvjeskS","9XyT9SjskQ","2Yz7EQChxs","QYxC0pvgjS","Uvlv42DREs","UmaEvfaHir","lj07QNhXdu","xciqpatef2","QnJ1SoGu6x","euZA5lXFOB",
+"Oz8yZcQOnv","uN6r3S77LH","RBhp0EoToP","Gv3Fqx3LDe","HRxd8iB08l","VBjhzQChxs","qQxHP4dEz6","LbRTHpiJSk","RsQUqNo0Qb","9rlg9Vprf2",
+"v1HlnWmadA","EdBKcogLgc","EOE1on8pJ9","Gv3FqyofH3","fLNg8WreyP","gf8rICdyBV","taOXKSbRYy","qUJMdHlUbF","fqypyqaofN","1j5L8lH1kt",
+"NOHszkB5nP","atef2ru4UG","0MR5XtvdkD","hE1QlXyPZN","uN6r3FNYIM","cL0aE4dEz6","MGlTFyToGW","SWfouiB08l","FjHXRMezSW","mz8gxFPfSE",
+"s4786K4GS8","cShY2s4786","ciuWzt59lR","y94nw8RCUA","uupzk4W0Tl","QChxsRpBQm","cmXIXPYBf4","3otm6x3LDe","4W0Tl618Di","24ARFcShY2",
+"B3qemuJScX","n1pmOd85a9","WPmlxRmDcr","i3pydFnPFB","FLsphTwano","0PktI0YAGH","8FmFHKZamH","24ARFn1pmO","uAWyptAOsr","l83Ud580YD",
+"fqypy1j5L8","24ARFwiHrZ","WDVWJXyPZN","blLA9okgRi","7ku1pKASQ8","G1RhS0Wr5y","s7MxkVerEA","uvf7ABbwgA","W7cTssqVrf","SbRYyhSSvQ",
+"AOgEeiKqhr","JKWYRQworu","XflUqZzJHW","uAWypG1RhS","tjQxsjiVBP","JkzUnvkCHH","B3qemRxrsm","mX2GEUlU3M","FLsphStlDJ","pAhR15Namm",
+"euZA5qQxHP","9eoRccShY2","s4786KZamH","kZANmRsQUq","AXpwE2ZHdk","G1RhSYh1hF","rKDLJAOgEe","QbxXczY1GY","1LB1LAXpwE","M3zXLB3qem",
+"v1HlnOUqFM","WMiS3x3LDe","lm0pDkZANm","OUqFMzY1GY","SWfouyEfy9","tAOsrWaWsv","J2mQisqVrf","VjCZq1j5L8","CdyBVuLtKs","uoStwYjB9t",
+"ogLgch1zcH","hYBCKRsQUq","OxWIHzmLYD","4dEz6Z4I1v","Gv3Fq0MR5X","pFrrlQ6hMC","lViBvzQt6Q","uoStwpT8wu","oGu6xPYBf4","HP433nnP8o",
+"taOXKEoToP","7X3uy618Di","FhtglWPmlx","iwzGkFVMxo","JXljW9rlg9","OxWIHsuY4x","2TRI7gtCA5","iB08lVBjhz","Ta8f6lViBv","lViBvW7cTs",
+"piJSkaFFss","5NammMaJQs","vkCHHix74r","s7MxkQbxXc","l83UdMezSW","AkKTkXyPZN","SmGzvtl72W","blLA93weIF","Mkgy8zQt6Q","KZamHuoStw",
+"2hEEUvOqCE","dhSuHYh1hF","U3yw5DQimp","WreyPyvOMI","pT8wu5VZjS","JkzUndpe1v","QssNCK20wK","soy9tKZamH","oQ87r6AFT0","Ss0Zusoy9t",
+"FhtglCp3mZ","i7WMQ8TxD7","ix74rcShY2","8RCUARBhp0","SjskQwDajX","azIWpNcICA","o8Uyd8FmFH","dpe1vWreyP","wiHrZQWxoT","2NslmoGu6x",
+"BCxeCHlUbF","SbRYyAmdQd","3weIFMaJQs","guMb8FcWrW","FhtglZv7z0","8RCUAgdQsS","MojnPmz8gx","cShY2FVMxo","FLsphPb1pa","VNCPdbZLvS",
+"QbxXcOUqFM","Ul4a1ru4UG","0ao3lyofH3","yluBxKsjRK","ECMvU3weIF","QnJ1SlpF6W","GrDg7jeskS","RzaZAAOgEe","uvf7AP6bcg","suY4xfmIK1",
+"0h1b1aFFss","5iGN5ThjNn","Q6LixeuZA5","P6bcgVprf2","7Ow5CD6rBy","o8UydCp3mZ","AmdQd8U2nU","o8UydWPmlx","prNT6nnP8o","zY1GYuLtKs",
+"OHaBzI7p2a","CdyBVlH1kt","I7p2aEoToP","s7Mxk5drc6","Kr8ys29QAz","QClRLVLTy6","v2eC37fKYU","NhXduZv7z0","CdyBVVjCZq","uJScXuvf7A",
+"QChxsgf8rI","Yw2oUTwano","zHF1qMaJQs","Yw2oURBhp0","1LB1LUlU3M","DG4sTn8pJ9","BFkb8v8yFN","yEfy9EdBKc","okgRiYOfrY","suY4xQ6hMC",
+"8U2nUFjHXR","ciuWzlm0pD","5ZaEziwzGk","iqv4kHzZT8","yluBx1v5hH","uAWyplkMUA","rhl0JIjTwP","0ao3lulk41","XyPZNBpYhV","NhXduBpYhV",
+"7X3uyqQxHP","Mkgy8S77LH","qUJMdxciqp","8hJdtoGu6x","2TRI7RACuj","ydG8UO3iyQ","atef2JKWYR","1v5hHnFqik","0PktI9XyT9","taOXKVerEA",
+"suY4xOUqFM","l83UdzY1GY","FNYIMl83Ud","5ZaEzMkgy8","QssNCXflUq","tl72W8TxD7","uQIczhUTw7","0MR5XwDajX","ThjNnnFqik","WreyPciuWz",
+"BbwgA8cVD3","n8pJ9WMiS3","MK07YOUYuF","CIShGSbRYy","Rxrsmo8Uyd","RzaZANAFuw","2TRI7lH1kt","5nmWvSmGzv","PYBf4kZANm","Q6Lix0h1b1",
+"tjQxsZhwG1","jfREuWaim6","s7Mxkrz7Ut","PYBf4suY4x","cQOnvkZANm","okgRi0PktI","9rlg9rz7Ut","lpF6WYf2Ec","lViBv8xEKz","1j5L8uJScX",
+"9y4lwYh1hF","tjQxsFFDui","cmXIXe6e4z","2NslmeuZA5","jSjS3aL6AJ","OUqFMjfREu","cQOnvLbRTH","AmdQd5Namm","5nmWvNhXdu","lj07Qv8yFN",
+"RsQUqzmLYD","2Nslmb29RJ","hi5X7suY4x","Mkgy8vkCHH","DQimpXyPZN","HP433uPX7G","faHirM6qcG","kZANm5drc6","gf8rIpWiOs","QworuK4GS8",
+"xReecYh1hF","FxX9qpvgjS","5drc62TRI7","0YAGHStlDJ","D6rBy4W0Tl","blLA9HfyNQ","v2eC3qaofN","d7vjM1LB1L","UmaEvtl72W","yvOMI0MR5X",
+"G1RhSOUqFM","Nxx9VgjUTu","MGlTFYOfrY","UmaEvzmLYD","pFrrlcmXIX","e6e4zMojnP","FnPFB9XyT9","GSQwjM3zXL","7lUXZmz8gx","ZzJHW7hyVv",
+"OHaBz0ao3l","sqVrfiKqhr","FhtglJ2mQi","G1RhSCIShG","x3LDeEOE1o","FxX9qlm0pD","aL6AJpmeCd","Dz1R3yToGW","qaofNMkgy8","TXQ0ZLewvM",
+"WaWsvYf2Ec","CIShG7X3uy","mz8gxoGu6x","J2mQiaL6AJ","lm0pDU3yw5","VLTy6tvdkD","WPmlxUl4a1","FVMxoOUqFM","k85AeazIWp","6q6L9M6qcG",
+"FcWrWAgJHQ","bZLvSJkzUn","e6e4zZhwG1","QbxXcBGaQY","EoToPvLsmS","v2eC3taOXK","he9IA5drc6","zY1GYtaOXK","TwanolpF6W","XyPZNksJby",
+"zFgtBqaofN","UlU3MtAOsr","QworuGXdoH","tjQxsSs0Zu","i3pydzz4ZU","oVQp6P6bcg","a00b5JXljW","S2DfuWMiS3","DcpWBY1mC0","jS1ajru4UG",
+"bZLvSkZANm","5IhmGUlU3M","dQ586yEfy9","y94nwyToGW","7hyVvpT8wu","FNYIM1LB1L","BbwgAyToGW","DLhzMK20wK","CdyBV8RCUA","Q6hMCzqH0W",
+"zbIYY0MR5X","S77LHQnJ1S","faHir5nmWv","VIlwPJRJQB","IRh48NhXdu","DcpWB55rfB","BbwgAokgRi","blLA9uupzk","kB5nPx3LDe","QYxC05ZaEz",
+"i3pydhe9IA","mX2GEWaWsv","HzZT8Rxrsm","ulk41ThjNn","oQ87rdjsrv","uZPqgcShY2","y94nwMojnP","SjskQsx5Gl","RzaZAtvdkD","xXTI4hE1Ql",
+"8TxD729QAz","RxrsmIn3NS","gf8rIlCMxy","OUYuFMmsIo","5nmWv5ZaEz","0Wr5yoVQp6","pWiOs2Yz7E","9eoRcKr8ys","EoToPd7vjM","2hEEUGSQwj",
+"QssNCyvOMI","9iGoTpiJSk","5nmWvVerEA","jfREu8hJdt","0MR5Xxciqp","8U2nUpvgjS","5nmWv7fKYU","QWxoThe9IA","Ta8f68U2nU","Mkgy80MR5X",
+"7fsYMMm8si","i7WMQSWfou","HzZT85IhmG","7fKYUtAOsr","L7cGc9rlg9","blLA9LDk6f","wDajX7lUXZ","LbRTHzbIYY","mX2GEyvOMI","MGlTFIn3NS",
+"4W0TlZ4I1v","NcICADG4sT","yvOMIiwzGk","t98iWbZLvS","brhlQ0BmCy","qUJMdJ2mQi","FnPFBW3VFH","VIlwPDcpWB","MmsIoDG4sT","VBjhzAIYUu",
+"C2IrcWmadA","Vprf2NOHsz","gjUTu7lUXZ","GXdoHDG4sT","Cp3mZ580YD","In3NSAkKTk","Ta8f6Gv3Fq","i7WMQM6qcG","IRh487fsYM","tjQxsP6bcg",
+"BbwgAHP433","JkzUnl83Ud","UlU3MYjB9t","uPX7GJKWYR","yofH3cShY2","pFrrlWDVWJ","FFDuiksJby","0PktIU3yw5","cmXIXd7vjM","S77LHazIWp",
+"EoToPzHF1q","x3LDeY1mC0","RBhp0I7p2a","5IhmG1v5hH","bZLvS5drc6","aez9yRkQke","iKqhruvf7A","qQxHP2DREs","GrDg76AFT0","45cIH2hEEU",
+"Kr8ysMGlTF","DG4sTWPmlx","7fsYMOHaBz","Vprf2FPfSE","v2eC34W0Tl","zz4ZUDcpWB","dpe1vTCgPp","QYxC0Twano","he9IAStlDJ","PYBf4IKxdL",
+"PYBf4JXljW","tvdkD48cHL","zFgtBciuWz","GSQwjTXQ0Z","fcwDaTXQ0Z","2ZHdkQworu","6q6L9iKqhr","tuDySQssNC","MmKGJXflUq","MmKGJuLtKs",
+"X6Pinb29RJ","v2eC3yvOMI","euZA5zHF1q","GWqqXaL6AJ","uvf7A45cIH","B3qemVLTy6","IBe8k9eoRc","VerEA0MR5X","FxX9qMGlTF","zHF1qpiJSk",
+"hE1QlGSQwj","ni2v18xEKz","8FmFHgIYvE","POUYSkB5nP","iB08lrz7Ut","okgRiNAFuw","OHaBzrKDLJ","P6bcgjeskS","uTacxFhtgl","gf8rIK4GS8",
+"7fKYUK4GS8","VerEAdmoS7","uJScXBCxeC","2DREsXyPZN","EOE1oHlUbF","B3qemWreyP","FjHXRaFFss","RACujJ2mQi","ogLgcCNHmv","3otm6RACuj",
+"uQIczoVQp6","FhtglokgRi","7lUXZ1j5L8","7fKYUF6PT2","euZA5Oz8yZ","zqH0WGSQwj","Cp3mZ8TxD7","yToGWcL0aE","h1zcHIjTwP","B3qemIBe8k",
+"vLsmSi7WMQ","Q6LixgjUTu","ru4UGgf8rI","C2Ircm4bxU","pv0i7Yw2oU","7fKYUhe9IA","9y4lwhE1Ql","D6rBydjsrv","StlDJQ6hMC","9eoRcCIShG",
+"YjB9tQbxXc","1j5L8Fhtgl","jSjS39y4lw","qaofNQWxoT","zQt6QGv3Fq","euZA5t98iW","soy9tOUYuF","6AFT01j5L8","iB08ljS1aj","qaofNSbRYy",
+"VLTy6AIYUu","J2mQiQnJ1S","hSSvQiwzGk","5iGN56q6L9","gf8rIGv3Fq","MmKGJ7fsYM","i3pydru4UG","iKqhrNo0Qb","5Drn0vkCHH","FhtglFGzgp",
+"faHirs4786","jeskSvOqCE","EdBKcB3qem","fFDrJlkMUA","Ul4a1MmKGJ","AOgEeWaWsv","IjTwPsuY4x","2hEEUydG8U","JJs5mpiJSk","GXdoHQworu",
+"DG4sTzz4ZU","GWqqXlXFOB","Yh1hFS2Dfu","bgJAzxciqp","Vprf2CxVEf","Ul4a1JJs5m","aDGtSsoy9t","lH1ktJKWYR","tAOsrulk41","DcpWBNxx9V",
+"KsjRKhE1Ql","VNCPdcmXIX","jfREuYf2Ec","9XyT9d85a9","iB08lHP433","RmDcrTCgPp","uN6r3pv0i7","QworuRkQke","8TxD72Yz7E","FcWrWHfyNQ",
+"soy9tVjCZq","zY1GYiB08l","JXljW5VZjS","M3zXL9y4lw","v1HlnTXQ0Z","8FmFHHfyNQ","okgRi9rlg9","hE1QlzFgtB","atef2RACuj","e6e4zJKWYR",
+"RBhp02Nslm","1LB1Lv2eC3","Y1mC0Fhtgl","FjHXRzqH0W","JIqXigdQsS","v8yFNF6PT2","JRJQBO3iyQ","7X3uypv0i7","pAhR19rlg9","XyPZNk85Ae",
+"ECMvUmz8gx","uZPqg9XyT9","IRh480ao3l","K20wKogLgc","VIlwPFGzgp","hYBCKfLNg8","Yh1hFAOgEe","2ZHdkb29RJ","0MR5XMojnP","6AFT0DG4sT",
+"pvgjSTXQ0Z","FhtglDz1R3","JXljWsoy9t","iB08lsx5Gl","jzUqRuvf7A","HlUbFAkKTk","uJScXzmLYD","y94nw8U2nU","lXFOBB3qem","J2mQiKsjRK",
+"0KyfscL0aE","rhl0JEOE1o","Ss0ZuPb1pa","jiVBP1j5L8","zz4ZUEoToP","jS1aj48cHL","uoStw9GXkX","QnJ1STa8f6","BbwgAdhSuH","hE1QlUmaEv",
+"lpF6WcL0aE","QClRLv1Hln","Uvlv4x3LDe","DG4sTgtCA5","MmsIooQ87r","QClRLBCxeC","a00b50h1b1","IjTwPJJs5m","atef2VjCZq","s7MxkOxWIH",
+"oVQp6RmDcr","brhlQ5drc6","okgRicShY2","zmLYDlpF6W","CNHmvFLsph","zbIYYblLA9","14FLRzmLYD","Nxx9V8TxD7","WaWsvt59lR","dQ586QWxoT",
+"bgJAzIjTwP","0MR5XOUqFM","QbxXcMaJQs","cmXIXhSSvQ","Vprf2ru4UG","Oz8yZqUJMd","tvdkDi3pyd","aFFssZ4I1v","BpYhV0BmCy","QnJ1SD6rBy",
+"zQt6QfLNg8","tAOsrCp3mZ","iqv4kaFFss","yEfy9Qworu","yluBx0BmCy","SmGzv580YD","zqH0WfmIK1","Q6hMCGWqqX","Q6Lix7hyVv","AOgEeNhXdu",
+"qUJMdi3pyd","Pb1pa5VZjS","Qworuh1zcH","pT8wuK20wK","ReKEWs93Ml","VIlwP48cHL","MojnPGv3Fq","i3pydQYxC0","2TRI71LB1L","FVMxodhSuH",
+"jiVBPtlILt","FNYIMi3pyd","NAFuwbZLvS","bgJAz2ZHdk","48cHLzFgtB","9GXkXLDk6f","wiHrZ2ZHdk","5VZjSC2Irc","bgJAzxXTI4","iwzGk24ARF",
+"1v5hHfaHir","TCgPpHRxd8","X6PinHlUbF","5Namm7Ow5C","BbwgARpBQm","taOXKuvf7A","J2mQiM6qcG","mz8gxVjCZq","WPmlxSjskQ","Chuy3Y1mC0",
+"3otm6vkCHH","v8yFNTCgPp","h1zcHzQt6Q","jeskSzQt6Q","tAOsrBCxeC","M6qcGIKxdL","No0QbHP433","VjCZqKASQ8","RzaZAogLgc","iB08lTwano",
+"4dEz6fcwDa","yofH3Yw2oU","cL0aE618Di","n8pJ9rz7Ut","IBe8kprNT6","QWxoTl83Ud","8RCUAhi5X7","wDajXNhXdu","WMiS3dpe1v","48cHLdpe1v",
+"NOHszxciqp","lm0pDhSSvQ","soy9toQ87r","AIYUucmXIX","hi5X7zbIYY","ReKEWAmdQd","FwEJzdjsrv","K20wKY1mC0","0MR5XECMvU","JJs5mtl72W",
+"bgJAzwDajX","48cHLI7p2a","2ZHdkuPX7G","wiHrZ0YAGH","i7WMQzmLYD","O3iyQI7p2a","OxWIHd7vjM","o8UydMaJQs","CdyBVgdQsS","tlILtWmadA",
+"d7vjMQnJ1S","ulk41K20wK","hi5X7wiHrZ","sqVrf2TRI7","Vprf2pFrrl","dQ5868TxD7","AOgEeYjB9t","MezSWCfgr3","AgJHQv1Hln","1LB1LrKDLJ",
+"Chuy3LDk6f","F6PT2EdBKc","QnJ1S9eoRc","lweGyECMvU","14FLR9iGoT","gIYvEe6e4z","Rxrsmpv0i7","29QAzKASQ8","HfyNQAXpwE","StlDJs4786",
+"StlDJ8FmFH","580YDazIWp","jeskSjtn0X","euZA5k85Ae","rKDLJlweGy","t98iWzFgtB","9GXkXm4bxU","I7p2aZUnqt","ru4UGfLNg8","7ku1pKZamH",
+"07n1c24ARF","tuDySReKEW","RkQkeOz8yZ","aez9yuJScX","RmDcrRpBQm","uoStwfFDrJ","UlU3MIn3NS","YjB9tsoy9t","YjB9tQworu","CxVEfWaWsv",
+"MezSWlweGy","pWiOsprNT6","GSQwjQ6hMC","QssNC2Nslm","NcICACfgr3","uoStwqQxHP","ZzJHWv8yFN","y94nwlpF6W","aez9yB3qem","Cfgr3uN6r3",
+"Waim6jzUqR","uLtKs8TxD7","k85AeZ4I1v","azIWp0Wr5y","SWfouru4UG","pmeCd7hyVv","nFqiki7WMQ","CdyBVUvlv4","FPfSEuAWyp","ogLgcZJTXH",
+"FGzgpzmLYD","a00b58U2nU","QChxsDcpWB","pmeCd9XyT9","HlUbFDQimp","fcJOyThjNn","0YAGHMkgy8","QnJ1SCNHmv","FjHXRlsQGo","piJSkyvOMI",
+"WPmlxs4786","AIYUu5IhmG","M3zXL0MR5X","FxX9quAWyp","CNHmvvOqCE","v1HlnRzaZA","WDVWJZ4I1v","lsQGon8pJ9","U3yw50MR5X","rz7UtLDk6f",
+"VIlwP0Wr5y","d85a9M3zXL","EOE1o29QAz","1LB1Laez9y","ulk41zFgtB","Oz8yZ5Namm","rz7Utk85Ae","uvf7AO3iyQ","lpF6Wtl72W","uupzkaFFss",
+"Vprf2soy9t","okgRiFGzgp","WDVWJPYBf4","MojnPqUJMd","qUJMdC2Irc","AkKTki3pyd","a00b5QnJ1S","CxVEfAmdQd","RBhp0uTacx","dpe1vAOgEe",
+"cShY24QMc9","bZLvSRACuj","BCxeClweGy","5IhmG6AFT0","ydG8UJkzUn","14FLRWaWsv","RsQUqDz1R3","WaWsvTa8f6","I7p2aVjCZq","QChxs580YD",
+"1v5hHuQIcz","yofH3RzaZA","FnPFBaDGtS","2Yz7Ehi5X7","x3LDeh1zcH","fcJOyfFDrJ","iwzGk8TxD7","tl72WQ6hMC","2NslmazIWp","qaofN8FmFH",
+"mz8gx2DREs","ni2v1ECMvU","lH1ktyofH3","LbRTHQbxXc","OUqFMOz8yZ","FLsphhUTw7","QbxXc4QMc9","y94nwC2Irc","RBhp0Waim6","RzaZAfcwDa",
+"dhSuHa00b5","ECMvU1v5hH","zQt6Q8RCUA","k85AeYf2Ec","ZhwG1oQ87r","W7cTs0MR5X","FwEJzIBe8k","lViBvAkKTk","hYBCKD6rBy","QssNClweGy",
+"jS1ajgf8rI","0YAGHLbRTH","gjUTu16lHc","lsQGoOHaBz","rhl0JTa8f6","TXQ0Zn8pJ9","zQt6QzQt6Q","XflUqRBhp0","AmdQdoGu6x","nFqik6AFT0",
+"Ss0Zu8FmFH","hSSvQHfyNQ","t59lRGrDg7","ogLgc2TRI7","3weIFM6qcG","XyPZNbgJAz","OHaBzQ6Lix","lViBvAXpwE","hi5X7DLhzM","S77LHRxrsm",
+"zmLYDqQxHP","ZhwG1Cp3mZ","fLNg8jzUqR","hYBCKWaim6","0PktIcL0aE","prNT64W0Tl","BCxeClkMUA","MezSW5iGN5","gIYvEMm8si","7hyVvDQimp",
+"RsQUqB3qem","zQt6QuAWyp","pAhR145cIH","cQOnvZhwG1","8FmFH2DREs","Q6Lixiqv4k","KASQ8Vprf2","XflUquZPqg","DcpWBX6Pin","CxVEfaL6AJ",
+"pFrrlqUJMd","29QAzlm0pD","yvOMIVprf2","jeskSSjskQ","ZuDtDCfgr3","zQt6QlCMxy","AOgEeGv3Fq","iqv4ktlILt","wDajXVerEA","In3NS55rfB",
+"uAWyp6q6L9","OUYuFQ6Lix","ksJbyJXljW","gIYvE5nmWv","bgJAzQbxXc","G1RhSAOgEe","Waim6VjCZq","GrDg7IjTwP","FxX9q24ARF","he9IATXQ0Z",
+"ydG8U7fsYM","Mm8sid7vjM","JkzUnLbRTH","WDVWJWDVWJ","xciqps4786","QClRLcmXIX","14FLRuPX7G","fcwDaFNYIM","iqv4kX6Pin","euZA55Namm",
+"VLTy6MojnP","wiHrZgf8rI","aez9yhUTw7","U3yw5NcICA","GrDg7o8Uyd","YOfrY8xEKz","FVMxopvgjS","pT8wu2DREs","hE1QlOHaBz","9XyT90h1b1",
+"Cp3mZjfREu","v1HlnpAhR1","0KyfsiB08l","jiVBPMaJQs","lweGy9eoRc","WmadA2Nslm","QssNCtlILt","dpe1vK4GS8","jiVBPd7vjM","YjB9tzz4ZU",
+"jzUqRjtn0X","Fhtgliqv4k","2ZHdkLbRTH","AmdQdyluBx","5Nammo8Uyd","QworukB5nP","2NslmRsQUq","KZamHFjHXR","X6Piniqv4k","GXdoHM3zXL",
+"Oz8yZP6bcg","UlU3Maez9y","iwzGkPYBf4","soy9thi5X7","EdBKcjiVBP","d7vjMWPmlx","CxVEf8xEKz","qaofN29QAz","DG4sTogLgc","lj07QiB08l",
+"OUqFMEoToP","55rfBU3yw5","2hEEUgf8rI","OxWIHlkMUA","lXFOBFPfSE","FwEJzFjHXR","lViBvbrhlQ","TXQ0Zx3LDe","JKWYRMGlTF","RsQUqyofH3",
+"gjUTuW3VFH","8RCUACqqaD","LDk6foGu6x","FjHXRd85a9","29QAzAOgEe","yvOMILDk6f","Ta8f6ThjNn","LewvMjfREu","5ZaEzDLhzM","yluBx0PktI",
+"uZPqgwDajX","AXpwERzaZA","ZhwG1KsjRK","d7vjMFwEJz","9XyT9MK07Y","dpe1vciuWz","9eoRcOUYuF","NAFuwiwzGk","yofH3nlaBy","jiVBPix74r",
+"F6PT2aDGtS","suY4xuoStw","YOfrYMK07Y","v8yFNoGu6x","Ss0Zu16lHc","prNT6iwzGk","QbxXcD6rBy","FVMxox3LDe","Mkgy8LewvM","7fsYMyToGW",
+"RACujguMb8","4dEz6Rxrsm","n8pJ9POUYS","pmeCdS77LH","dQ586gf8rI","JRJQB8RCUA","FFDuiGSQwj","Ul4a1s93Ml","Kr8ysv2eC3","JIqXi9XyT9",
+"9eoRcfqypy","MK07YReKEW","CdyBV8TxD7","BCxeC7lUXZ","kZANmRxrsm","JJs5mRpBQm","oGu6xC2Irc","s93MlJ2mQi","ZJTXHnnP8o","Q6LixWmadA",
+"JJs5moGu6x","StlDJzz4ZU","zbIYYpAhR1","2Yz7ED6rBy","4QMc9nFqik","uAWypjfREu","hE1Ql48cHL","4QMc90Kyfs","cShY22DREs","3otm6L7cGc",
+"16lHctjQxs","0Wr5yzmLYD","dpe1viwzGk","VjCZqmX2GE","OHaBzHfyNQ","euZA5prNT6","JIqXi5iGN5","ogLgcM3zXL","0BmCy4dEz6","euZA5BFkb8",
+"Nxx9VlweGy","fcwDaguMb8","n8pJ9nnP8o","OxWIHKr8ys","SbRYyaFFss","dhSuHlViBv","dQ5861LB1L","zY1GYStlDJ","6AFT0NAFuw","pv0i7xReec",
+"n1pmOhe9IA","ni2v148cHL","bZLvSuupzk","RzaZAOUYuF","pvgjSQ6Lix","29QAzxReec","t59lR9y4lw","pvgjSjiVBP","xReecdhSuH","ZhwG1xciqp",
+"guMb8s7Mxk","HzZT814FLR","xReecs93Ml","lj07Q16lHc","jS1ajGv3Fq","pFrrlHlUbF","Rxrsmlm0pD","bZLvS4W0Tl","VLTy6guMb8","uJScXRmDcr",
+"oQ87rMm8si","QClRLZzJHW","EOE1oS2Dfu","TCgPppT8wu","Gv3FqOz8yZ","fFDrJs4786","prNT65ZaEz","WPmlxtlILt","uLtKsZ4I1v","QClRLCK5W7",
+"bZLvS16lHc","vkCHHuJScX","fLNg8DLhzM","G1RhSlXFOB","0Kyfs0ao3l","8FmFHF6PT2","lXFOBD6rBy","zQt6QsuY4x","zHF1q9eoRc","WreyPd85a9",
+"cmXIXWDVWJ","iwzGkBCxeC","0KyfsX6Pin","618DiYw2oU","U3yw5IBe8k","LDk6fpvgjS","Kr8ysrz7Ut","7hyVviKqhr","WreyPZhwG1","9GXkXWPmlx",
+"5Drn0PYBf4","dQ586HP433","KZamH4dEz6","WmadAQ6Lix","ThjNnYf2Ec","tAOsrvOqCE","CK5W78RCUA","ulk41ogLgc","F6PT2gf8rI","zqH0WHzZT8",
+"ulk41brhlQ","WmadAsuY4x","55rfBRkQke","Waim6zY1GY","uJScXguMb8","dpe1vwiHrZ","0Kyfs0Wr5y","Z4I1vdpe1v","dpe1vCK5W7","jtn0Xd7vjM",
+"qaofNQworu","Uvlv445cIH","BGaQYaDGtS","Zv7z0xXTI4","Mm8sihUTw7","W7cTsaez9y","5iGN5nnP8o","RkQkeL7cGc","WPmlxpv0i7","h1zcHFNYIM",
+"SWfouRzaZA","AmdQdM6qcG","VjCZqXflUq","zQt6QYjB9t","0PktIi3pyd","qUJMd0Kyfs","k85AeKZamH","oQ87rSmGzv","5nmWvoQ87r","ThjNnYh1hF",
+"K20wKpT8wu","tl72WZzJHW","he9IARmDcr","9rlg9e6e4z","7Ow5C16lHc","0MR5XlCMxy","FxX9qyluBx","rz7Ut618Di","XyPZNcQOnv","O3iyQm4bxU",
+"P6bcgokgRi","vkCHHSWfou","XflUqHP433","5NammTXQ0Z","dpe1vcShY2","nnP8opT8wu","2ZHdkDLhzM","0ao3lvLsmS","J2mQitlILt","Q6hMCNo0Qb",
+"gIYvE64s8N","hUTw7AXpwE","5VZjSGrDg7","Z4I1vSjskQ","BpYhVnnP8o","TwanoZzJHW","5IhmGECMvU","fqypyRACuj","d7vjMVjCZq","y94nwXflUq",
+"4QMc9Vprf2","W7cTsThjNn","0Wr5yjS1aj","I7p2aiqv4k","vLsmSfLNg8","XflUqzbIYY","Z4I1vS2Dfu","8U2nUEOE1o","VIlwPatef2","0BmCyFnPFB",
+"kB5nPh1zcH","ZhwG1okgRi","BFkb8Ss0Zu","ydG8UzY1GY","0YAGHcShY2","lViBv1j5L8","pvgjS9eoRc","qQxHPMGlTF","SmGzvblLA9","WaWsvyofH3",
+"FxX9qFPfSE","pAhR17lUXZ","LbRTH24ARF","29QAzeuZA5","48cHLdQ586","FnPFB48cHL","29QAzY1mC0","PYBf4iKqhr","tuDySpv0i7","FhtglFNYIM",
+"cmXIXD6rBy","yofH3HP433","FnPFBMK07Y","W3VFHCxVEf","Mm8siFnPFB","JIqXijtn0X","QssNCaDGtS","5Mg9r0Wr5y","X6PinOUYuF","jfREuqaofN",
+"soy9tpWiOs","AmdQdiqv4k","KASQ8lm0pD","6AFT0oQ87r","lCMxyBpYhV","0YAGHCqqaD","CK5W7kZANm","kB5nPZJTXH","S77LHFhtgl","qUJMdBbwgA",
+"7Ow5C2Yz7E","pAhR16q6L9","No0Qb5IhmG","azIWpyToGW","DQimpFjHXR","Kr8ysW7cTs","MojnPbrhlQ","k85AepmeCd","fcJOyGWqqX","BbwgAi7WMQ",
+"zHF1qG1RhS","RBhp0GXdoH","Mm8siUl4a1","o8UydM6qcG","brhlQa00b5","pWiOszQt6Q","5NammrKDLJ","uJScXHfyNQ","ReKEW618Di","OxWIHzQt6Q",
+"kB5nP7hyVv","QClRLXyPZN","B3qemOz8yZ","rz7UtPb1pa","8hJdtSWfou","DQimpnnP8o","bgJAzFwEJz","he9IAK20wK","rhl0JMaJQs","45cIHYOfrY",
+"AXpwEuvf7A","0h1b15ZaEz","xReeczY1GY","KZamHxXTI4","piJSkKsjRK","HzZT8dpe1v","Yh1hFfqypy","nnP8oiKqhr","oGu6xK20wK","K4GS8BpYhV",
+"QssNChE1Ql","vkCHHwDajX","k85AeFGzgp","1LB1La00b5","faHirhSSvQ","FcWrWFLsph","W7cTsh1zcH","v2eC3lkMUA","l83UdlweGy","JkzUnt98iW",
+"pmeCdFwEJz","RkQkenlaBy","hYBCKChuy3","ZhwG15Namm","zHF1qgf8rI","Ss0ZujfREu","ZzJHWMezSW","n8pJ9ECMvU","F6PT2i3pyd","EoToPWPmlx",
+"gjUTu0ao3l","WmadAGv3Fq","rhl0Js93Ml","s4786uZPqg","48cHLGWqqX","VjCZq29QAz","2Yz7Efqypy","yvOMIt59lR","Q6hMCJXljW","7lUXZfcwDa",
+"VLTy60h1b1","XflUqCxVEf","No0Qb8FmFH","jiVBPogLgc","FVMxoIRh48","HRxd8Yw2oU","kB5nPbrhlQ","HRxd88cVD3","FPfSE7lUXZ","WreyPqUJMd",
+"vLsmSqQxHP","gIYvEdhSuH","S2DfuAXpwE","LbRTHCfgr3","JIqXiCqqaD","45cIHLewvM","iqv4kOUqFM","Ss0ZuM3zXL","0KyfsYOfrY","jiVBPUmaEv",
+"piJSkprNT6","blLA9M3zXL","cL0aEa00b5","BpYhVt98iW","2Yz7EVprf2","W7cTsW7cTs","2DREs9iGoT","IBe8kpv0i7","v2eC3n1pmO","W3VFHpAhR1",
+"piJSkuupzk","aFFssjzUqR","9y4lwReKEW","bZLvS3weIF","HlUbFBFkb8","No0Qb9iGoT","bgJAzCdyBV","zqH0W1v5hH","jiVBPSbRYy","1LB1LPb1pa",
+"AOgEe48cHL","aDGtS2TRI7","yEfy9Rxrsm","fmIK1FcWrW","HlUbFl83Ud","Kr8ys5ZaEz","pT8wuyToGW","uvf7AqQxHP","tuDySfmIK1","5nmWvMm8si",
+"jfREusoy9t","atef2lCMxy","AIYUuRsQUq","pvgjSMmsIo","rKDLJxXTI4","ZUnqt5iGN5","2DREsOUqFM","VjCZqFhtgl","kZANmJRJQB","mX2GElViBv",
+"lm0pDRACuj","okgRi64s8N","FnPFBtjQxs","O3iyQ7lUXZ","7fKYUgjUTu","v2eC3HP433","Cfgr3FPfSE","Fhtgl45cIH","Fhtglv2eC3","NOHszogLgc",
+"b29RJgtCA5","HzZT8jiVBP","tlILtKASQ8","zFgtBt59lR","HP433azIWp","yluBxgIYvE","1j5L8ydG8U","yToGWIjTwP","mz8gxQbxXc","RACujS2Dfu",
+"RzaZAGXdoH","5iGN5h1zcH","dmoS7WaWsv","9y4lwC2Irc","FcWrWVLTy6","FxX9quvf7A","yvOMIjtn0X","8xEKzazIWp","JRJQB0ao3l","cShY2RzaZA",
+"pT8wu1v5hH","8xEKz5iGN5","IKxdLrhl0J","LDk6fVprf2","VLTy6RkQke","0BmCy8hJdt","x3LDeKsjRK","MaJQs0MR5X","wDajXlm0pD","JKWYR0h1b1",
+"5Drn0a00b5","Mm8si8cVD3","BGaQYuN6r3","fFDrJ8U2nU","ZJTXHhYBCK","AXpwEazIWp","ydG8UuPX7G","guMb8iqv4k","dhSuHEoToP","tAOsrUlU3M",
+"KASQ8WmadA","pv0i7zqH0W","J2mQiEOE1o","ZzJHW5VZjS","jtn0XAIYUu","EoToPQ6Lix","cShY2U3yw5","CdyBVTCgPp","IKxdLk85Ae","Chuy3HfyNQ",
+"uZPqgJ2mQi","Zv7z00BmCy","XyPZNYh1hF","5ZaEzt98iW","LDk6fd7vjM","P6bcg5nmWv","9iGoTMm8si","16lHcCK5W7","TXQ0Zix74r","hSSvQQworu",
+"Oz8yZrz7Ut","ulk410h1b1","uAWypBCxeC","MGlTF45cIH","IKxdL9XyT9","FwEJzK20wK","dhSuHRkQke","zmLYDJRJQB","J2mQiHRxd8","IjTwP48cHL",
+"y94nwJJs5m","K4GS8Z4I1v","lpF6WU3yw5","G1RhSQ6Lix","tl72WEdBKc","lpF6WTa8f6","kB5nPFPfSE","UmaEvHzZT8","VerEA2DREs","7lUXZfqypy",
+"SbRYyuQIcz","S77LHlXFOB","v2eC3PYBf4","AkKTk8hJdt","t59lRQworu","0Wr5yXflUq","GSQwjdmoS7","TXQ0ZSmGzv","WPmlxWaim6","In3NS6q6L9",
+"MaJQsZzJHW","vLsmS07n1c","prNT6PYBf4","iKqhrDG4sT","Gv3Fq5Namm","7fKYUiKqhr","QbxXcX6Pin","FLsphMojnP","P6bcgKASQ8","9GXkX0MR5X",
+"Waim6azIWp","hi5X7s7Mxk","cShY2e6e4z","Vprf2EoToP","v8yFN0MR5X","EoToPMkgy8","7fKYUMm8si","oGu6xuPX7G","rKDLJnnP8o","ulk41GWqqX",
+"fcwDa2DREs","aL6AJzmLYD","SWfou64s8N","WaWsvdmoS7","QbxXcLbRTH","SWfouZuDtD","oQ87rEdBKc","2TRI7cShY2","k85Aerhl0J","4dEz6CdyBV",
+"IRh48v1Hln","VBjhzm4bxU","Yw2oUi7WMQ","cQOnv2hEEU","5drc6fcwDa","3weIF0BmCy","s7MxkYw2oU","CxVEfOxWIH","vkCHHFnPFB","euZA564s8N",
+"QssNCTwano","uPX7GD6rBy","QYxC014FLR","07n1cRkQke","zz4ZUnlaBy","Gv3Fq5drc6","wDajXOz8yZ","J2mQiGWqqX","tuDySWreyP","QChxsuoStw",
+"l83Ud5ZaEz","BCxeCLDk6f","zz4ZUblLA9","S77LHYw2oU","7hyVvPYBf4","l83Ud14FLR","No0QbhSSvQ","jzUqRQ6Lix","9iGoTSmGzv","pWiOshUTw7",
+"WaWsvyvOMI","L7cGcLewvM","ZzJHWTa8f6","GWqqXAOgEe","yEfy9hE1Ql","pmeCdcShY2","14FLRhe9IA","YOfrYMaJQs","iKqhrs93Ml","hYBCKWDVWJ",
+"Nxx9VdhSuH","sqVrfs7Mxk","HfyNQ4dEz6","24ARFksJby","Uvlv4FcWrW","FNYIM0YAGH","bZLvSciuWz","zqH0W4W0Tl","n8pJ9ZUnqt","I7p2ay94nw",
+"AmdQd0Wr5y","RACujzz4ZU","d7vjMe6e4z","7Ow5C1LB1L","hi5X7pFrrl","LDk6fF6PT2","bgJAztvdkD","zQt6QChuy3","yEfy9yEfy9","hSSvQ8U2nU",
+"vLsmSru4UG","nnP8ogjUTu","NcICAVerEA","G1RhSP6bcg","uLtKsnlaBy","NOHszvkCHH","64s8NgjUTu","RpBQmAgJHQ","3weIFxXTI4","8U2nUFFDui",
+"7fKYURxrsm","aL6AJ55rfB","7Ow5CQbxXc","ru4UGOUqFM","2Yz7EuTacx","3weIFQYxC0","KsjRK2Nslm","K4GS8tl72W","5VZjSyToGW","Mkgy8HfyNQ",
+"RBhp0ni2v1","YOfrY7hyVv","YOfrYVIlwP","5VZjSQWxoT","FGzgpyluBx","9iGoTJKWYR","piJSk0Wr5y","zz4ZUdQ586","7fsYMru4UG","7fsYM4QMc9",
+"5IhmGlH1kt","ydG8Udpe1v","iqv4ksx5Gl","Cp3mZzY1GY","NOHszECMvU","oGu6xxReec","cShY2lpF6W","0KyfsoGu6x","55rfBAIYUu","lweGyZ4I1v",
+"StlDJ0PktI","cL0aEGWqqX","sqVrfydG8U","jeskSiqv4k","tjQxsMm8si","lH1kti7WMQ","hUTw7XyPZN","AXpwERpBQm","VNCPduTacx","n1pmOyToGW",
+"1LB1LMGlTF","fmIK1suY4x","VerEAJRJQB","taOXKCK5W7","ZuDtDni2v1","16lHcQWxoT","dmoS79eoRc","FcWrWNAFuw","5iGN5tlILt","FcWrWix74r",
+"FNYIMcShY2","QbxXcEOE1o","zHF1qQClRL","lCMxy5Namm","SbRYy7X3uy","vkCHHFhtgl","Cfgr3F6PT2","ni2v13weIF","t59lR618Di","48cHLlXFOB",
+"14FLRFLsph","VerEAThjNn","aDGtSQnJ1S","blLA9xXTI4","uQIcztl72W","t59lR0MR5X","o8UydgjUTu","jzUqRBpYhV","mz8gxtl72W","JKWYRt59lR",
+"a00b5cShY2","MmKGJfcwDa","B3qemJKWYR","P6bcgDLhzM","MK07YtAOsr","I7p2alweGy","Yh1hFG1RhS","XflUqY1mC0","24ARFS2Dfu","kB5nPgIYvE",
+"s7MxkD6rBy","QssNCRACuj","AgJHQTCgPp","MaJQsZv7z0","LDk6f8TxD7","tuDySQ6Lix","D6rByJKWYR","jSjS3FLsph","Vprf2v8yFN","iwzGkGv3Fq",
+"K4GS8guMb8","ZJTXHMojnP","JJs5mhE1Ql","VjCZqbrhlQ","MmsIon8pJ9","5nmWvvOqCE","JKWYR5Drn0","F6PT2MmsIo","uupzk7hyVv","RxrsmCdyBV",
+"B3qemx3LDe","OUqFMtl72W","NAFuwMezSW","v2eC3Waim6","tl72WlXFOB","RkQkeksJby","pv0i7aL6AJ","hSSvQzqH0W","zHF1q48cHL","MezSWFVMxo",
+"lpF6WSbRYy","MGlTFHfyNQ","FwEJztvdkD","bZLvSWaWsv","9XyT9QssNC","guMb8i7WMQ","VBjhz2TRI7","lkMUAmz8gx","3otm66AFT0","Vprf2aL6AJ",
+"K20wKyluBx","9XyT9CK5W7","GWqqXQYxC0","7fsYMzFgtB","tjQxsQworu","ksJbyL7cGc","pWiOsReKEW","U3yw5lsQGo","IKxdLzHF1q","QworuhYBCK",
+"wDajXCxVEf","RpBQmJJs5m","BCxeCulk41","hSSvQNcICA","7hyVvSbRYy","zz4ZUFNYIM","0PktIMkgy8","dhSuHL7cGc","No0QbcL0aE","M3zXLfaHir",
+"K4GS8KASQ8","xciqpYf2Ec","yluBxlm0pD","0PktIzbIYY","iB08ldQ586","v1HlnCNHmv","5iGN57fKYU","zFgtBazIWp","HzZT8DcpWB","s7MxkkZANm",
+"45cIHECMvU","bZLvSl83Ud","blLA9G1RhS","n1pmOlpF6W","JIqXiYjB9t","9eoRc48cHL","tjQxshSSvQ","bgJAzSjskQ","prNT6gf8rI","aez9yMGlTF",
+"2TRI7Mkgy8","IRh48VIlwP","QbxXco8Uyd","WreyPFLsph","mz8gx9iGoT","0ao3lGXdoH","m4bxUAkKTk","FFDuivOqCE","M3zXLM3zXL","pmeCdL7cGc",
+"0YAGHlCMxy","cmXIX5Namm","W7cTsOHaBz","XflUqWmadA","ThjNn4dEz6","BCxeCCxVEf","Yh1hF0h1b1","TwanowDajX","U3yw5Q6hMC","SmGzv8RCUA",
+"HzZT8prNT6","Nxx9V2ZHdk","EoToPazIWp","CqqaDDz1R3","VNCPdpWiOs","JJs5mReKEW","lH1ktCdyBV","P6bcgS2Dfu","Yf2EcbgJAz","FFDuiVjCZq",
+"sqVrftl72W","euZA5K20wK","O3iyQLDk6f","FFDuizFgtB","pFrrljSjS3","FxX9qFjHXR","DQimpWaim6","zQt6Qtl72W","L7cGcy94nw","v2eC3x3LDe",
+"jzUqR8TxD7","MaJQsMm8si","lsQGoqaofN","Z4I1vHRxd8","RxrsmEoToP","FcWrWFjHXR","aDGtSAmdQd","FLsphuJScX","JIqXiVNCPd","QClRLZJTXH",
+"J2mQiIn3NS","AOgEebZLvS","Yw2oUFwEJz","Kr8ysjiVBP","U3yw5HlUbF","GXdoHMK07Y","jtn0XVIlwP","FxX9qJKWYR","W3VFHatef2","hYBCKUmaEv",
+"o8UydqUJMd","euZA5OHaBz","prNT6X6Pin","hSSvQ7fsYM","uN6r38RCUA","Q6LixYf2Ec","M6qcGYh1hF","HRxd8qUJMd","55rfBYOfrY","MezSWCxVEf",
+"29QAzt59lR","qUJMd4QMc9","OHaBzVerEA","cL0aEDQimp","jSjS39XyT9","QClRLvLsmS","0MR5X55rfB","3weIF618Di","YOfrYbZLvS","m4bxUVIlwP",
+"VjCZqnnP8o","1LB1LWMiS3","iwzGknnP8o","uTacxChuy3","zz4ZURzaZA","MGlTFIKxdL","taOXKpT8wu","Cfgr3guMb8","EdBKcRxrsm","5drc6yToGW",
+"0ao3lzbIYY","BpYhVEOE1o","uAWypSWfou","gjUTu580YD","hE1QlOxWIH","0ao3l3weIF","XflUq7fKYU","v1HlnIRh48","ogLgcY1mC0","Pb1pae6e4z",
+"QClRLOUqFM","MojnPyofH3","pv0i7mX2GE","uQIczaDGtS","o8UydYw2oU","ReKEWuPX7G","8TxD7HP433","NhXduuQIcz","24ARFkB5nP","Oz8yZjfREu",
+"WmadA7hyVv","Yh1hF7Ow5C","64s8NHfyNQ","B3qem48cHL","AXpwEgIYvE","JkzUnblLA9","hE1Qllj07Q","pFrrloVQp6","hSSvQzbIYY","SmGzvjeskS",
+"lpF6WWaWsv","gIYvEo8Uyd","pv0i7uLtKs","4QMc9DcpWB","v2eC38TxD7","0KyfsXflUq","lm0pDlH1kt","v8yFNdQ586","9GXkXKASQ8","pAhR1UlU3M",
+"0KyfsdhSuH","2DREsiwzGk","UmaEvGv3Fq","DLhzMlkMUA","xReecjiVBP","JXljWWDVWJ","HP433h1zcH","kB5nPpiJSk","MmKGJ9y4lw","CNHmvM3zXL",
+"xciqp9eoRc","FFDui3weIF","5Mg9rM6qcG","Pb1paS2Dfu","W7cTsUvlv4","yofH3FPfSE","GXdoH8RCUA","5iGN5jtn0X","uQIczhi5X7","580YDm4bxU",
+"VIlwPix74r","rKDLJqaofN","9GXkXydG8U","xciqpbZLvS","BGaQYRmDcr","Ss0ZujSjS3","zHF1q07n1c","MezSWa00b5","jeskSv2eC3","RsQUqbrhlQ",
+"QYxC0QYxC0","JXljWUmaEv","Mm8siMojnP","fLNg8Chuy3","M6qcG6AFT0","FhtglDcpWB","kZANmZzJHW","hUTw7oQ87r","AIYUuni2v1","RBhp0lkMUA",
+"HP4338TxD7","zQt6QzHF1q","DG4sTThjNn","NAFuwQworu","OHaBzAkKTk","WreyPxReec","s93MlgdQsS","ix74r16lHc","faHir3weIF","d7vjMUmaEv",
+"v2eC3CK5W7","IRh481j5L8","d7vjMuZPqg","FjHXRZJTXH","8hJdtv2eC3","ciuWzTXQ0Z","hSSvQoVQp6","ni2v1rKDLJ","Mm8siWPmlx","SbRYyjtn0X",
+"DG4sTDG4sT","DcpWBqaofN","ZUnqtyToGW","cmXIXnFqik","MK07YYw2oU","jzUqRvLsmS","vOqCEhUTw7","Kr8ysKASQ8","ydG8Ufqypy","Uvlv4X6Pin",
+"yEfy9gf8rI","6AFT0brhlQ","MaJQsTXQ0Z","5ZaEzs93Ml","YOfrYs4786","ksJbyPOUYS","uQIczSWfou","RsQUq5Mg9r","VLTy6AgJHQ","7fKYU5ZaEz",
+"kB5nPJJs5m","fLNg8POUYS","5nmWvuPX7G","0h1b1FLsph","Yf2Ec7Ow5C","xciqp24ARF","RBhp0RkQke","HP433wiHrZ","0Wr5yokgRi","RsQUqCIShG",
+"C2IrcVBjhz","8cVD3i7WMQ","WMiS3v2eC3","GXdoHGv3Fq","48cHLm4bxU","n1pmO0Kyfs","qUJMdYjB9t","fcwDaXyPZN","y94nwS77LH","4QMc9iB08l",
+"S2Dfut59lR","l83UdJIqXi","ciuWzn8pJ9","nFqikzHF1q","ZJTXHkB5nP","aez9yWPmlx","Nxx9VKASQ8","HfyNQLewvM","sx5GlAkKTk","nlaByI7p2a",
+"k85AexReec","AkKTk8xEKz","0Wr5yQ6Lix","b29RJ3otm6","WaWsvcQOnv","MaJQsqQxHP","0MR5XQbxXc","2ZHdki3pyd","ogLgcEdBKc","580YDOxWIH",
+"ECMvUSjskQ","WmadAcQOnv","ZuDtDUvlv4","MmKGJWaim6","Cp3mZ5nmWv","vLsmSfmIK1","Uvlv414FLR","VerEABpYhV","pWiOsRsQUq","t98iWIRh48",
+"S77LHRzaZA","QYxC0DQimp","Kr8ys7lUXZ","7fsYM0PktI","Oz8yZZv7z0","16lHcDz1R3","HzZT8NOHsz","07n1che9IA","2DREspWiOs","Z4I1v2DREs",
+"uAWyp9eoRc","Chuy3taOXK","4W0TlKsjRK","LewvM4dEz6","lm0pDlCMxy","Chuy3MK07Y","soy9tDG4sT","b29RJI7p2a","QClRLSs0Zu","JXljWYh1hF",
+"FPfSEyluBx","RzaZAtuDyS","v1Hln9XyT9","07n1c5iGN5","Cp3mZBbwgA","he9IAFhtgl","UlU3Mdpe1v","HP433FnPFB","64s8NDQimp","qQxHPF6PT2",
+"RxrsmGXdoH","M3zXL5IhmG","45cIHCNHmv","NOHszZhwG1","K20wKru4UG","azIWpy94nw","zbIYYM6qcG","2NslmO3iyQ","aez9yx3LDe","SmGzvK4GS8",
+"AIYUuOUqFM","IKxdLK4GS8","bZLvSxciqp","uLtKsfcwDa","W7cTsiKqhr","14FLRZhwG1","mX2GEs4786","pFrrldjsrv","MmsIojtn0X","VLTy6pFrrl",
+"QssNCAIYUu","uvf7AVIlwP","QYxC0m4bxU","UlU3Mru4UG","NOHszix74r","jS1ajZuDtD","pT8wuTwano","lpF6WnFqik","iKqhrfqypy","ZUnqtBCxeC",
+"nnP8oa00b5","HlUbFoQ87r","BpYhVsuY4x","P6bcgMGlTF","aDGtStaOXK","Zv7z08cVD3","ogLgc3otm6","9eoRcvkCHH","2DREsZv7z0","zY1GYHP433",
+"gdQsSuLtKs","QbxXcJXljW","uupzkFnPFB","2ZHdk5Drn0","SmGzvx3LDe","vLsmSeuZA5","Yf2Ec6AFT0","Uvlv4OHaBz","HfyNQRkQke","Ta8f6tuDyS",
+"X6PinECMvU","Cfgr3vLsmS","9eoRcOxWIH","oVQp6VIlwP","VjCZqEOE1o","IjTwP618Di","iwzGkyEfy9","vkCHH580YD","KASQ8ZJTXH","ulk41ru4UG",
+"SbRYy9XyT9","d7vjMYOfrY","RmDcrBCxeC","HP433dQ586","EOE1oQ6hMC","fqypyqUJMd","n8pJ9QYxC0","guMb8pvgjS","mX2GEa00b5","jzUqRTwano",
+"FhtgliB08l","Z4I1vCp3mZ","aL6AJaDGtS","W3VFH9iGoT","oGu6xni2v1","NcICADz1R3","8xEKzuPX7G","FjHXRYjB9t","I7p2aFNYIM","FxX9qqQxHP",
+"Cp3mZGXdoH","gf8rIzQt6Q","Pb1paCIShG","jS1ajpT8wu","aL6AJ5VZjS","Ul4a1tvdkD","mX2GEcShY2","t98iWdjsrv","OHaBzuupzk","yvOMIru4UG",
+"M6qcG0BmCy","zHF1qRkQke","dhSuH5drc6","i7WMQRzaZA","taOXK1LB1L","K20wKYOfrY","S2DfuSmGzv","Uvlv4zbIYY","iB08lCp3mZ","GrDg7pAhR1",
+"Ul4a1oVQp6","taOXKZv7z0","XflUqWaim6","FnPFBgf8rI","GSQwj1v5hH","FGzgpdhSuH","QClRLFGzgp","QYxC0n8pJ9","suY4xRBhp0","16lHcStlDJ",
+"RsQUqC2Irc","he9IAy94nw","zHF1q8xEKz","4W0TlUmaEv","EoToPTCgPp","Kr8ys0ao3l","2ZHdkYw2oU","FnPFBtaOXK","fFDrJguMb8","45cIHBGaQY",
+"iB08l0Wr5y","vLsmSBpYhV","EdBKcgIYvE","RxrsmC2Irc","Chuy355rfB","nnP8opWiOs","pWiOsW3VFH","CIShGRmDcr","S77LHzFgtB","v2eC355rfB",
+"Kr8ysYjB9t","FjHXR9iGoT","v2eC3EdBKc","gtCA57ku1p","uAWypn8pJ9","P6bcgMm8si","wiHrZM6qcG","AXpwEiKqhr","jfREuGrDg7","gf8rINOHsz",
+"M3zXLQChxs","7fsYMpFrrl","qQxHPKASQ8","RzaZA0Kyfs","Nxx9VHzZT8","9iGoTZ4I1v","1v5hHZhwG1","VjCZqjSjS3","8cVD3gjUTu","EdBKcM6qcG",
+"Nxx9VfmIK1","4dEz6JXljW","7X3uyatef2","uTacxJ2mQi","uPX7GS2Dfu","QWxoTazIWp","Kr8ysCp3mZ","ZzJHW1LB1L","Cfgr3NAFuw","LewvM24ARF",
+"MmKGJVIlwP","0Wr5yzbIYY","lweGy8cVD3","euZA5Uvlv4","8hJdtRmDcr","KZamHs4786","IKxdLjeskS","sx5Gl2Yz7E","k85Aet59lR","Cfgr3HfyNQ",
+"FFDuifaHir","mX2GEVLTy6","CK5W7POUYS","2hEEUcQOnv","QnJ1Sm4bxU","BGaQYWDVWJ","5IhmGAOgEe","5nmWvoVQp6","xReectuDyS","5VZjSuQIcz",
+"JKWYR8hJdt","5Drn0HRxd8","yofH3Ss0Zu","I7p2aHzZT8","9iGoTMmsIo","lweGyjeskS","hE1QlECMvU","3weIFdmoS7","lj07QgIYvE","48cHLlpF6W",
+"x3LDeCK5W7","W7cTso8Uyd","MmsIoQworu","K4GS82TRI7","RzaZAix74r","zHF1qpmeCd","VLTy6WPmlx","VerEAfcJOy","ReKEWNcICA","8FmFH8FmFH",
+"LbRTHQChxs","gIYvEPb1pa","8xEKzFxX9q","Yw2oUn1pmO","IRh48nFqik","CK5W7C2Irc","FFDuiIn3NS","5ZaEzL7cGc","HlUbFTwano","WmadAkB5nP",
+"POUYStlILt","W3VFHdmoS7","bZLvSNhXdu","5Drn0ni2v1","uQIczWDVWJ","Zv7z0CdyBV","Mm8siv8yFN","CxVEfCNHmv","hi5X70h1b1","MaJQsK4GS8",
+"t98iWtjQxs","cShY2Rxrsm","ciuWzNAFuw","WDVWJWaWsv","pWiOsQWxoT","taOXKSjskQ","tuDySEdBKc","SjskQMm8si","Zv7z024ARF","yEfy9rhl0J",
+"FVMxoFGzgp","GrDg7fFDrJ","gIYvEy94nw","RACuj29QAz","hUTw70ao3l","Uvlv4jiVBP","t98iW9XyT9","JKWYRlweGy","uoStwrhl0J","jzUqRxReec",
+"QYxC024ARF","HP433n1pmO","BFkb8LewvM","d85a9pvgjS","9iGoTkB5nP","618DiSbRYy","zbIYYdQ586","i3pydk85Ae","S77LHWaWsv","h1zcHwiHrZ",
+"8hJdtGSQwj","brhlQJ2mQi","gjUTu5IhmG","6AFT0EdBKc","0ao3l7fKYU","OUYuFfcJOy","LewvMaL6AJ","iwzGkuPX7G","lkMUAiqv4k","MGlTFzY1GY",
+"8RCUA5iGN5","AIYUuHP433","0Wr5yuZPqg","piJSkCdyBV","FhtglxXTI4","JXljWyluBx","AgJHQNcICA","ogLgc29QAz","y94nwfLNg8","DG4sTuTacx",
+"Pb1pauvf7A","MmsIopAhR1","ru4UGulk41","Ul4a1zbIYY","1v5hHa00b5","RsQUqhYBCK","dQ586GSQwj","WPmlxVprf2","JkzUnDLhzM","IBe8ktjQxs",
+"zbIYYhe9IA","LbRTHv1Hln","tvdkDtl72W","yToGWHzZT8","5nmWvQworu","ulk41uQIcz","gtCA58FmFH","kZANmNcICA","v1Hlnulk41","4W0TlWDVWJ",
+"2Yz7EMkgy8","SjskQBGaQY","9y4lwVBjhz","tAOsrOz8yZ","jSjS35IhmG","tl72WRmDcr","AXpwEAmdQd","FjHXRmX2GE","KZamHtAOsr","xXTI4i3pyd",
+"lViBvt59lR","GXdoHuLtKs","HlUbF0MR5X","lweGyuoStw","P6bcgZv7z0","7Ow5CTCgPp","IKxdLnlaBy","QssNCaFFss","64s8N9eoRc","fcwDak85Ae",
+"Ta8f6D6rBy","5IhmGhUTw7","EdBKcaL6AJ","HfyNQGXdoH","KASQ824ARF","azIWp16lHc","8U2nUaFFss","Ul4a1KZamH","JJs5miqv4k","FFDuiK4GS8",
+"CNHmvjfREu","RxrsmQ6hMC","VIlwPsqVrf","CNHmvfFDrJ","WDVWJlm0pD","M6qcG64s8N","W3VFHWaWsv","qUJMde6e4z","EdBKc0Kyfs","Ss0Zul83Ud",
+"yToGWNcICA","jSjS348cHL","QnJ1SyofH3","UlU3M580YD","fFDrJ2TRI7","M3zXLqQxHP","0Wr5yHP433","uJScXyEfy9","djsrvyofH3","ciuWzuoStw",
+"kZANm0Kyfs","FVMxoqaofN","64s8Nsoy9t","n1pmOuvf7A","hUTw7K4GS8","dpe1v9rlg9","LewvM7ku1p","16lHcTXQ0Z","nnP8onnP8o","14FLRaFFss",
+"JKWYRNxx9V","FPfSEK4GS8","5IhmGKASQ8","Vprf2n1pmO","sqVrftAOsr","Yf2EcLbRTH","zbIYYNxx9V","5IhmGuvf7A","FNYIMJRJQB","WmadAJJs5m",
+"dhSuHQ6hMC","0ao3lqaofN","6q6L9tuDyS","RpBQmtjQxs","pWiOs7X3uy","FGzgp5nmWv","5Drn0GXdoH","wDajXJkzUn","2Yz7E14FLR","piJSkM3zXL",
+"lweGyTa8f6","pT8wuPYBf4","lj07Q7fKYU","TXQ0ZWaim6","EdBKcRsQUq","y94nwksJby","Cp3mZDQimp","Mkgy8hUTw7","S2DfuFNYIM","cShY2ReKEW",
+"jzUqRSmGzv","QClRLiKqhr","MmKGJCp3mZ","MmKGJ0MR5X","M3zXLXyPZN","UmaEvB3qem","Y1mC0o8Uyd","Gv3FqF6PT2","BpYhVMaJQs","9iGoTtvdkD",
+"jiVBPzY1GY","FwEJzFNYIM","ulk418xEKz","M3zXLPYBf4","QbxXc5iGN5","pvgjS0MR5X","AIYUuYw2oU","6q6L9uQIcz","guMb8IBe8k","HRxd8zQt6Q",
+"4W0TlOHaBz","fcwDa7lUXZ","UlU3M29QAz","pvgjSyEfy9","HzZT8s4786","Dz1R35iGN5","14FLRZuDtD","UmaEvReKEW","SWfouVprf2","djsrvCdyBV",
+"OUqFMFFDui","SbRYySbRYy","SmGzvC2Irc","oVQp6AgJHQ","uoStwDLhzM","CqqaDv1Hln","AOgEeru4UG","lXFOBtAOsr","QYxC0Zv7z0","W3VFHvkCHH",
+"9eoRcBpYhV","i7WMQuN6r3","WmadAs93Ml","iKqhrt98iW","pT8wuSs0Zu","2NslmtvdkD","fmIK1xXTI4","hUTw70MR5X","NOHszuoStw","W3VFHPYBf4",
+"azIWpjfREu","nlaByVIlwP","MezSWFjHXR","QbxXc0YAGH","5ZaEzYjB9t","618Di55rfB","W7cTsjSjS3","7lUXZ7Ow5C","Waim6iwzGk","SjskQ64s8N",
+"ECMvUksJby","tjQxsxReec","Q6hMCbgJAz","OxWIH2ZHdk","G1RhSnnP8o","oQ87rzHF1q","TCgPpkB5nP","Q6hMC5Mg9r","jtn0X5Mg9r","uoStw5drc6",
+"NAFuwfFDrJ","e6e4z9GXkX","aL6AJNAFuw","8hJdtMmsIo","nlaByMezSW","v8yFNcL0aE","8xEKzcShY2","Y1mC0HRxd8","KsjRK0Kyfs","0MR5X2TRI7",
+"3otm62ZHdk","v2eC3L7cGc","jSjS3v8yFN","d7vjMBbwgA","BpYhVCfgr3","zmLYDRsQUq","jS1ajYOfrY","i7WMQvkCHH","VjCZquLtKs","RxrsmOUqFM",
+"uZPqguJScX","2DREsMm8si","0Kyfsjtn0X","NhXdupvgjS","UmaEvX6Pin","OUYuFIRh48","DLhzMSbRYy","7ku1pvOqCE","55rfBThjNn","ru4UGcQOnv",
+"CqqaDZhwG1","M6qcGgjUTu","faHirqaofN","pFrrlG1RhS","jiVBP4QMc9","tAOsrnFqik","uLtKs0h1b1","G1RhSdmoS7","M3zXLMezSW","ciuWz0h1b1",
+"7hyVvdjsrv","2Yz7EBFkb8","lH1ktyEfy9","fLNg8No0Qb","pWiOs7Ow5C","tAOsrDcpWB","hSSvQVerEA","AIYUuCp3mZ","W7cTsyluBx","dQ58629QAz",
+"FnPFBECMvU","K4GS8kZANm","b29RJnlaBy","kB5nPP6bcg","faHir7hyVv","m4bxUyEfy9","MmKGJK4GS8","tlILthUTw7","LewvMtuDyS","nFqikhYBCK",
+"LDk6fMm8si","qQxHPEOE1o","45cIHFFDui","In3NSfcJOy","fFDrJs93Ml","Q6Lix3weIF","y94nwzFgtB","POUYSVjCZq","8cVD34W0Tl","14FLRDLhzM",
+"zY1GYOUqFM","Z4I1vsx5Gl","iwzGk4dEz6","OUqFMHlUbF","d85a9BCxeC","JJs5mKr8ys","mX2GEfmIK1","uTacxGWqqX","pFrrl9XyT9","Ss0ZuAXpwE",
+"RBhp0gIYvE","n1pmOpWiOs","BGaQYSbRYy","JXljWnnP8o","uZPqgMm8si","uvf7AWDVWJ","lpF6WuLtKs","lweGyChuy3","lpF6W9iGoT","uupzkJIqXi",
+"ECMvUd7vjM","s93MlyofH3","WMiS3ThjNn","SmGzvdQ586","dQ586FjHXR","Cp3mZSmGzv","qQxHP9iGoT","sx5GlBpYhV","fcwDaprNT6","F6PT2AmdQd",
+"StlDJatef2","AmdQdJKWYR","FxX9qB3qem","0Wr5yuJScX","5Drn0Cfgr3","WmadAF6PT2","TXQ0Z9XyT9","GWqqXhE1Ql","QChxsAIYUu","2Yz7E9y4lw",
+"No0QbbrhlQ","EdBKc7lUXZ","AOgEekB5nP","BpYhV7lUXZ","8FmFHtjQxs","QClRLtaOXK","M6qcGSmGzv","m4bxUpT8wu","5Mg9riwzGk","MGlTF0MR5X",
+"1j5L8Yf2Ec","blLA9MezSW","ReKEWNOHsz","uLtKsuZPqg","FhtglJJs5m","MK07YUlU3M","t98iWFhtgl","a00b50BmCy","hYBCKReKEW","PYBf46AFT0",
+"jzUqRnlaBy","O3iyQpWiOs","s7MxklpF6W","brhlQlpF6W","mz8gx2hEEU","Pb1paDQimp","CNHmvMkgy8","Waim68xEKz","MK07YMkgy8","faHirsoy9t",
+"7X3uyB3qem","Z4I1vfqypy","7Ow5CtlILt","VerEAgf8rI","P6bcgStlDJ","Vprf2gf8rI","AmdQdyvOMI","B3qemSbRYy","suY4xWaWsv","JJs5mtaOXK",
+"soy9tFFDui","aL6AJKr8ys","0ao3lsx5Gl","CNHmvgtCA5","7fsYM8RCUA","Mm8siv2eC3","dQ586lm0pD","zFgtBjeskS","IKxdLulk41","4W0TlTXQ0Z",
+"sx5GlgjUTu","soy9t0ao3l","1LB1LM3zXL","QbxXcgIYvE","xciqp5nmWv","a00b5OUqFM","KASQ8zbIYY","uJScXNcICA","FGzgprz7Ut","bgJAzfcJOy",
+"24ARFCp3mZ","VLTy6Mm8si","hYBCKBCxeC","aez9yJJs5m","GrDg7LbRTH","9XyT9bgJAz","Waim6uvf7A","8hJdtQWxoT","dmoS7aez9y","5IhmG64s8N",
+"uvf7AhYBCK","fcwDaAmdQd","OHaBzhE1Ql","zqH0WHlUbF","soy9taez9y","8TxD7sqVrf","Y1mC02ZHdk","5IhmGPYBf4","sqVrfQssNC","jtn0XKr8ys",
+"guMb8QClRL","2hEEU45cIH","CxVEfh1zcH","n8pJ9EoToP","FcWrWBbwgA","Rxrsm4W0Tl","ni2v1FPfSE","QYxC0oGu6x","Y1mC0iB08l","G1RhSFPfSE",
+"gf8rIni2v1","NOHszDLhzM","uJScXaDGtS","YOfrY07n1c","mX2GEh1zcH","8FmFH5VZjS","b29RJFnPFB","G1RhS7X3uy","dQ586zHF1q","hi5X7l83Ud",
+"MK07YPOUYS","CdyBVIjTwP","Gv3FqyToGW","M3zXLblLA9","nnP8olXFOB","CqqaDNOHsz","5VZjSzbIYY","lweGyGv3Fq","yvOMI4dEz6","m4bxU1j5L8",
+"t98iWbgJAz","EoToPdmoS7","MaJQsdpe1v","cmXIXo8Uyd","azIWpBbwgA","RmDcrxReec","gdQsSi7WMQ","6AFT0s4786","YjB9twDajX","3otm6n1pmO",
+"Mkgy8jiVBP","fFDrJQbxXc","ThjNnHfyNQ","zFgtBJXljW","s93Ml45cIH","DG4sTguMb8","WPmlxiKqhr","Vprf216lHc","7lUXZfcJOy","2DREsQssNC",
+"cmXIX29QAz","Q6hMChUTw7","IBe8kXyPZN","QworulCMxy","HfyNQpWiOs","VIlwPIn3NS","Yf2EcVjCZq","nlaByW3VFH","0Wr5yAmdQd","WDVWJ0Kyfs",
+"lm0pDPYBf4","IBe8ksx5Gl","tuDySsuY4x","pAhR1Z4I1v","QbxXcBpYhV","zbIYYX6Pin","0YAGHMojnP","taOXKgtCA5","lsQGoQWxoT","UlU3MGWqqX",
+"HfyNQ1LB1L","XyPZNv1Hln","vOqCE07n1c","BpYhV9y4lw","7Ow5CgdQsS","QnJ1SzQt6Q","JXljWP6bcg","QChxsatef2","WDVWJG1RhS","y94nw7fsYM",
+"GrDg7e6e4z","Mm8siciuWz","bgJAzgjUTu","JIqXiQ6Lix","s4786ru4UG","yluBxvkCHH","FGzgpaez9y","s93MlZuDtD","29QAzaez9y","GrDg7uN6r3",
+"jiVBPQssNC","lj07QbrhlQ","yEfy9M6qcG","pAhR1CqqaD","QssNCM6qcG","Vprf22hEEU","ZhwG1qUJMd","FhtglO3iyQ","e6e4zuupzk","JkzUnVprf2",
+"rz7UthSSvQ","VLTy6KASQ8","UmaEv16lHc","9XyT9SmGzv","nnP8oFVMxo","Cp3mZVBjhz","FjHXR8hJdt","SmGzv7Ow5C","prNT6B3qem","VerEAVjCZq",
+"618Di7lUXZ","lpF6WWmadA","2NslmprNT6","OUqFMyluBx","bgJAzulk41","jfREuFwEJz","QssNCuTacx","HfyNQxReec","64s8NfcwDa","YOfrYQClRL",
+"OUqFMW7cTs","DQimpjS1aj","Mm8siNOHsz","gdQsSM3zXL","atef2FGzgp","yluBxD6rBy","VIlwP29QAz","d7vjM2Yz7E","NOHszm4bxU","9y4lw5drc6",
+"NOHsz580YD","ZuDtDAkKTk","fmIK1Q6hMC","ogLgcd85a9","IBe8k580YD","jfREuUvlv4","1j5L8ZJTXH","AmdQdpv0i7","0KyfsuQIcz","wiHrZyluBx",
+"5nmWvtuDyS","KsjRKxciqp","9iGoTydG8U","yvOMIWreyP","HlUbF29QAz","EoToPGWqqX","KASQ80ao3l","FVMxoRsQUq","zmLYD7Ow5C","RACujsuY4x",
+"s4786MaJQs","ECMvUuTacx","tl72WaDGtS","Q6hMCjzUqR","fcwDaTa8f6","t59lROUqFM","CK5W7CNHmv","AmdQdzQt6Q","CNHmvLDk6f","3weIFAXpwE",
+"FjHXRO3iyQ","he9IAGv3Fq","9XyT9EOE1o","t98iWNhXdu","kB5nPv2eC3","Yw2oUbZLvS","Yf2Ec3weIF","azIWpogLgc","Yf2EcZzJHW","ogLgcNxx9V",
+"b29RJnFqik","FjHXRyluBx","iKqhrMaJQs","ZzJHWuvf7A","djsrvtlILt","Twanov8yFN","QnJ1SZJTXH","ru4UGdmoS7","pvgjSuLtKs","jSjS3lViBv",
+"jSjS3v1Hln","Mm8si5Mg9r","MGlTFuQIcz","pT8wuGSQwj","k85AeFLsph","dmoS7ZhwG1","uLtKsPb1pa","W3VFHuN6r3","t98iWmz8gx","Waim6lCMxy",
+"v2eC35nmWv","jS1ajdjsrv","tlILtJRJQB","5IhmGhe9IA","qQxHPJXljW","lj07QrKDLJ","NAFuwGXdoH","8TxD7ZzJHW","vOqCElXFOB","gjUTuvLsmS",
+"SWfou5Namm","OUYuFG1RhS","ReKEWxciqp","Cp3mZWPmlx","GXdoHOz8yZ","LewvMUlU3M","dmoS7yofH3","s93Mlzz4ZU","MK07YVBjhz","BbwgA8TxD7",
+"48cHLJkzUn","Cp3mZ4W0Tl","oVQp6MaJQs","FNYIMWaWsv","brhlQ3otm6","pmeCd5iGN5","jSjS3b29RJ","zHF1q8cVD3","jiVBPtl72W","LbRTHMGlTF",
+"BpYhVxReec","8xEKzPb1pa","U3yw56q6L9","rKDLJjeskS","n1pmOWMiS3","n1pmOprNT6","OUYuFK4GS8","Oz8yZNxx9V","M3zXLhUTw7","WmadAFwEJz",
+"7hyVvksJby","Gv3Fq48cHL","Vprf2lH1kt","lpF6Wsx5Gl","BFkb8OUYuF","qUJMdfaHir","qaofNrhl0J","FFDuiRxrsm","9iGoTgdQsS","TCgPpsqVrf",
+"U3yw5IjTwP","uoStwFPfSE","HRxd8QnJ1S","oQ87rPOUYS","StlDJJ2mQi","DLhzMOUYuF","TXQ0ZChuy3","6q6L9DLhzM","s93Ml8TxD7","GSQwjzY1GY",
+"tuDySlj07Q","MaJQsG1RhS","Mkgy8HzZT8","v2eC3OxWIH","guMb8lpF6W","IjTwPM3zXL","2ZHdki7WMQ","0h1b1uPX7G","hUTw7SWfou","L7cGcvLsmS",
+"tvdkDguMb8","MezSWRBhp0","fLNg8uQIcz","4QMc9MmKGJ","gdQsS9eoRc","dQ586gjUTu","QWxoT2Yz7E","C2Irct59lR","fqypyhYBCK","uZPqgECMvU",
+"2hEEU5Mg9r","ZJTXHciuWz","SjskQY1mC0","O3iyQ9XyT9","zHF1qo8Uyd","QWxoTo8Uyd","faHirMmKGJ","jiVBPmz8gx","iKqhrzQt6Q","djsrvThjNn",
+"bgJAzD6rBy","48cHL5drc6","gjUTu7ku1p","YOfrYn8pJ9","S2Dfu9XyT9","iB08lnlaBy","FPfSERmDcr","euZA53otm6","W7cTsFLsph","ECMvUYf2Ec",
+"ksJbyEOE1o","jfREuVprf2","iwzGktvdkD","Ul4a1m4bxU","zHF1qI7p2a","uTacxhYBCK","0KyfsIRh48","JkzUnFcWrW","wDajXWDVWJ","LewvMI7p2a",
+"8U2nU9y4lw","Ul4a1lkMUA","FjHXRGSQwj","prNT6zHF1q","yEfy9iwzGk","8hJdtSmGzv","t59lRWmadA","n8pJ9Fhtgl","618DiRsQUq","zqH0WkZANm",
+"HlUbFKsjRK","cShY2S77LH","dQ586fFDrJ","7ku1p3weIF","e6e4zrz7Ut","yToGWJXljW","L7cGclH1kt","AgJHQ5ZaEz","W3VFH2Yz7E","FFDuiDLhzM",
+"5VZjSCp3mZ","ni2v1Mkgy8","fqypyECMvU","IKxdLlweGy","dhSuHMojnP","NAFuw7X3uy","Yh1hFW7cTs","d85a9lCMxy","Chuy3e6e4z","MmsIo0Wr5y",
+"IKxdLX6Pin","hE1QlZuDtD","M6qcGyvOMI","55rfB4dEz6","uQIczqUJMd","UmaEvxciqp","uQIczBpYhV","C2IrcJXljW","3otm6QYxC0","i7WMQprNT6",
+"4QMc9MK07Y","LDk6fpiJSk","aL6AJlXFOB","JIqXiqUJMd","s4786TCgPp","Mm8silpF6W","FFDuiLbRTH","QWxoTb29RJ","QChxsQClRL","RACujn1pmO",
+"IBe8k5Drn0","ZuDtD8TxD7","CdyBVQ6Lix","8xEKzW7cTs","t98iWzqH0W","Z4I1v5Drn0","FnPFB9eoRc","guMb8qaofN","Dz1R3Rxrsm","nnP8ox3LDe",
+"3otm6nlaBy","x3LDefqypy","U3yw5cShY2","brhlQOUqFM","zz4ZUmX2GE","OUYuFSs0Zu","LbRTHHfyNQ","BpYhVciuWz","JKWYRpmeCd","FwEJzTa8f6",
+"h1zcHvOqCE","Z4I1vAkKTk","qUJMdcQOnv","sx5GlfFDrJ","TwanoQ6Lix","5NammIBe8k","pv0i7aez9y","BbwgAWreyP","gf8rIBbwgA","IjTwPAkKTk",
+"fcJOyfaHir","5IhmG5IhmG","uLtKs45cIH","d85a9BFkb8","s93MlZUnqt","U3yw5ciuWz","G1RhSQ6hMC","a00b5lm0pD","MK07Yh1zcH","dpe1vVIlwP",
+"suY4xWmadA","VNCPdaFFss","0YAGH5Namm","e6e4zNOHsz","NAFuw5drc6","Y1mC0tuDyS","gf8rIWPmlx","14FLRrhl0J","0PktIMGlTF","NOHsz8RCUA",
+"FwEJz0MR5X","aL6AJzY1GY","uupzkwiHrZ","gjUTuKZamH","X6Pin9y4lw","xXTI4OUqFM","vOqCEbrhlQ","lm0pDqUJMd","9iGoTnnP8o","v1HlnDG4sT",
+"WreyPFnPFB","yToGWThjNn","FLsphCxVEf","FjHXRIBe8k","4dEz6DcpWB","d85a95IhmG","OHaBzMmsIo","0h1b1KASQ8","k85Ae7hyVv","B3qemW3VFH",
+"wiHrZKASQ8","dmoS79y4lw","s7MxkJRJQB","2Yz7EHfyNQ","ThjNnNcICA","2Yz7EFnPFB","vkCHHW7cTs","AgJHQFGzgp","NhXdupv0i7","d7vjMv1Hln",
+"jtn0XgjUTu","XflUquJScX","OUqFMmX2GE","YOfrYKsjRK","0Wr5ywDajX","CNHmvMGlTF","okgRi8xEKz","t59lRHzZT8","EOE1oh1zcH","pmeCdiB08l",
+"x3LDecQOnv","k85AeUvlv4","uN6r3nnP8o","gIYvEGSQwj","4QMc94W0Tl","ZzJHW9rlg9","ZhwG1ZuDtD","yToGW7Ow5C","Kr8yssx5Gl","Q6LixguMb8",
+"ulk41okgRi","cL0aEbgJAz","blLA98hJdt","RzaZAlXFOB","QbxXcChuy3","uPX7GNAFuw","NOHszIKxdL","DLhzMoQ87r","iqv4ki7WMQ","qaofNSmGzv",
+"Dz1R3nlaBy","QbxXc0BmCy","xReecKASQ8","aL6AJXflUq","bgJAzBGaQY","ru4UG9iGoT","VNCPd2Nslm","iqv4kThjNn","G1RhSCdyBV","xXTI4ZJTXH",
+"xReecStlDJ","1v5hHFhtgl","8TxD7AgJHQ","dpe1vx3LDe","POUYSSbRYy","KASQ8FNYIM","TwanoWaim6","DQimpQnJ1S","m4bxUlj07Q","5nmWvFhtgl",
+"FFDuiZUnqt","vkCHH16lHc","rhl0JFVMxo","lj07QiwzGk","BCxeC9iGoT","EdBKct98iW","CK5W7cmXIX","aDGtSgIYvE","FGzgpsoy9t","7fsYMAkKTk",
+"yEfy9BpYhV","MGlTF8U2nU","FPfSEuLtKs","OxWIHW3VFH","64s8NY1mC0","0ao3ln1pmO","UlU3MWPmlx","rKDLJuQIcz","uQIczS2Dfu","S2DfuM6qcG",
+"hE1QleuZA5","pFrrl8RCUA","SmGzvnFqik","7X3uyi7WMQ","Y1mC0CxVEf","5NammQWxoT","X6PinfcJOy","VLTy64QMc9","qUJMdAOgEe","JXljWB3qem",
+"14FLRPb1pa","1j5L89eoRc","QWxoTMaJQs","SWfouY1mC0","MezSWsx5Gl","iwzGkxciqp","xReec9rlg9","k85AevLsmS","i3pydyluBx","sqVrfHlUbF",
+"QYxC0azIWp","5NammuLtKs","0h1b1vOqCE","rz7UtyluBx","s7MxkxXTI4","0h1b1StlDJ","PYBf4mX2GE","FGzgphi5X7","5Drn0rhl0J","ni2v17X3uy",
+"xXTI4kZANm","d7vjMKsjRK","NAFuwHfyNQ","FjHXRCxVEf","pmeCd4QMc9","JkzUnKr8ys","lkMUASjskQ","FwEJz5Namm","Y1mC0dpe1v","Uvlv4FxX9q",
+"7Ow5CgIYvE","d85a9Q6hMC","IKxdL580YD","dhSuHZv7z0","6AFT0XyPZN","9iGoT580YD","AXpwEZ4I1v","QYxC0W7cTs","X6PinUmaEv","EoToP9eoRc",
+"wiHrZLewvM","Ul4a1QWxoT","AgJHQFwEJz","b29RJCfgr3","ZuDtDWaWsv","7X3uyLbRTH","0YAGHJJs5m","CdyBVjtn0X","lweGy7lUXZ","EoToPiKqhr",
+"580YDZUnqt","WreyPECMvU","QssNCfcwDa","s93Mluvf7A","FNYIMlsQGo","YjB9tQ6hMC","Yh1hF0Wr5y","Waim6RBhp0","tvdkDS77LH","8hJdtCdyBV",
+"e6e4zsqVrf","ogLgcsuY4x","ix74rS77LH","JKWYRSWfou","1LB1LWaim6","fFDrJlweGy","Rxrsm618Di","FFDuioGu6x","Cfgr3S77LH","s93MlFLsph",
+"aL6AJjSjS3","TCgPpoQ87r","EOE1ofaHir","zY1GY0ao3l","zHF1q5Mg9r","7Ow5CtjQxs","FLsphlCMxy","CIShGvkCHH","qUJMd9GXkX","KsjRKVprf2",
+"azIWpM6qcG","F6PT2YjB9t","taOXKgIYvE","lXFOBmz8gx","I7p2aDLhzM","M6qcGjS1aj","5VZjS0PktI","v8yFNFwEJz","O3iyQDLhzM","lpF6WHfyNQ",
+"VerEAK4GS8","9eoRclXFOB","Yw2oUsoy9t","0Wr5ydhSuH","BpYhVuPX7G","Chuy3Waim6","d85a9prNT6","wiHrZSbRYy","Pb1pajeskS","FGzgpF6PT2",
+"PYBf4FwEJz","t59lREdBKc","rKDLJ8U2nU","StlDJOUYuF","UlU3Mrhl0J","pAhR1t59lR","zqH0WsuY4x","Cfgr3zY1GY","5Drn0oGu6x","4dEz6zQt6Q",
+"LewvM8U2nU","CK5W70Kyfs","RmDcriB08l","2ZHdk1LB1L","U3yw5Ss0Zu","iqv4kv2eC3","kB5nPCIShG","dhSuHuvf7A","ulk41CK5W7","KsjRKThjNn",
+"RmDcrOHaBz","FPfSEKr8ys","MGlTFRzaZA","lCMxyW7cTs","AXpwEmX2GE","lpF6Wru4UG","U3yw5S2Dfu","fqypySWfou","BpYhVRBhp0","RmDcraDGtS",
+"RBhp0Mkgy8","VNCPdix74r","FhtglCqqaD","sqVrfKZamH","yvOMIv2eC3","2ZHdkEoToP","0BmCyL7cGc","lH1ktpv0i7","0h1b10Kyfs","L7cGcsuY4x",
+"oQ87rQnJ1S","faHirVprf2","yluBx7fsYM","JKWYR0BmCy","v1HlnfcJOy","sx5GlzqH0W","yToGWguMb8","gjUTuBbwgA","cQOnvG1RhS","oVQp6RACuj",
+"7ku1pMK07Y","64s8NFFDui","QClRLbZLvS","OUYuF580YD","ulk41MK07Y","MK07YFjHXR","2DREsnlaBy","jzUqRzY1GY","UmaEvRmDcr","azIWpfaHir",
+"wDajXhSSvQ","S77LHxciqp","gf8rIBpYhV","NAFuwrKDLJ","BGaQYM6qcG","l83UduTacx","zQt6Q2ZHdk","k85Aeh1zcH","v8yFNyEfy9","BGaQY7fsYM",
+"zY1GYUmaEv","blLA9ZUnqt","LDk6f0h1b1","MaJQsuN6r3","pvgjSYf2Ec","KZamHjSjS3","SbRYyyvOMI","jzUqRK20wK","5drc6jfREu","5Namm2Nslm",
+"atef2ulk41","bgJAz8TxD7","2hEEUlweGy","lm0pDuLtKs","7hyVvix74r","CIShGoVQp6","jzUqRRmDcr","Mkgy80YAGH","oVQp614FLR","PYBf4JIqXi",
+"CIShGTa8f6","yofH3yluBx","MmKGJtuDyS","2DREs618Di","5iGN5Yf2Ec","uQIczJKWYR","CNHmvMezSW","gdQsSh1zcH","2TRI76q6L9","OxWIHciuWz",
+"d7vjMCfgr3","RACuj5Namm","Kr8ysWreyP","VBjhzhe9IA","tlILtfFDrJ","FwEJz2DREs","EdBKcaFFss","WPmlx6AFT0","bZLvSYw2oU","FVMxo2Yz7E",
+"RpBQmzFgtB","fqypypvgjS","HfyNQguMb8","FPfSEgtCA5","jtn0XAkKTk","jeskSUl4a1","07n1clweGy","okgRi55rfB","RzaZAmz8gx","FLsphnFqik",
+"HlUbFgjUTu","tAOsr8cVD3","uoStwRACuj","ThjNnoQ87r","64s8NjfREu","fLNg82Yz7E","ksJbyBFkb8","LDk6f2hEEU","XyPZNiKqhr","aez9y2Yz7E",
+"WaWsvjzUqR","SmGzvfmIK1","Gv3FqiwzGk","ulk41JIqXi","hi5X7fcJOy","aez9yCfgr3","GSQwj9eoRc","07n1cAgJHQ","MojnPo8Uyd","iqv4kOxWIH",
+"PYBf4qUJMd","618DipAhR1","uZPqgMezSW","ni2v1RsQUq","Waim6hYBCK","CxVEfhi5X7","zQt6QPYBf4","hSSvQDLhzM","sqVrfcmXIX","Uvlv47fsYM",
+"dQ586hYBCK","fcJOypFrrl","Y1mC0XyPZN","ZzJHWCdyBV","0h1b1QChxs","ogLgcni2v1","CIShGfmIK1","QworuxReec","TCgPpiB08l","In3NSNOHsz",
+"StlDJcmXIX","dmoS7pv0i7","WaWsvcL0aE","8TxD7EoToP","b29RJBCxeC","Cp3mZTa8f6","Chuy3rz7Ut","ksJbyoVQp6","OUqFMxXTI4","bgJAzPb1pa",
+"yvOMIiB08l","5VZjSiKqhr","VBjhzWmadA","VjCZqgf8rI","DQimpQChxs","wDajXJIqXi","HzZT8ThjNn","QnJ1Ss7Mxk","oGu6xzY1GY","xXTI4M3zXL",
+"he9IAHzZT8","pFrrlv8yFN","I7p2a7X3uy","lweGynnP8o","GXdoHpiJSk","Gv3Fqv8yFN","WMiS3jS1aj","qQxHPvkCHH","v8yFNdjsrv","RmDcr9eoRc",
+"7Ow5Cn8pJ9","29QAzSmGzv","zz4ZUb29RJ","jfREuRsQUq","QssNCFGzgp","qQxHPfFDrJ","45cIHG1RhS","xciqpAmdQd","5Drn0VIlwP","uTacx0YAGH",
+"0h1b1zHF1q","Oz8yZ14FLR","7fsYM2Nslm","KZamH6q6L9","gtCA5fcJOy","MmKGJL7cGc","zFgtBOz8yZ","1v5hHblLA9","sx5Gl7lUXZ","9XyT9LDk6f",
+"POUYSuPX7G","RACuj8hJdt","ZzJHWhe9IA","Yw2oUeuZA5","9rlg9XflUq","piJSk29QAz","xReecVNCPd","iKqhrRkQke","DcpWB7fKYU","24ARFK4GS8",
+"cShY2pv0i7","qaofNG1RhS","2hEEU7ku1p","e6e4zSmGzv","yToGWRzaZA","jSjS3JIqXi","VjCZqaDGtS","UlU3MCNHmv","d85a9SjskQ","TXQ0Z3weIF",
+"48cHLpT8wu","F6PT2dQ586","POUYSksJby","Ta8f6FwEJz","iB08lLDk6f","uQIczfqypy","sx5Gl2ZHdk","8cVD3taOXK","b29RJy94nw","In3NSrKDLJ",
+"qUJMds4786","rhl0Jo8Uyd","cL0aEi7WMQ","Dz1R3lH1kt","JJs5mIRh48","RsQUqPYBf4","JkzUnPb1pa","piJSk6q6L9","bgJAzyluBx","SWfou0ao3l",
+"Kr8ysbgJAz","EdBKc07n1c","5VZjSAmdQd","JJs5mOHaBz","rz7UtBpYhV","ThjNn9iGoT","ThjNnAkKTk","uN6r37Ow5C","jfREuCxVEf","FGzgpRzaZA",
+"BbwgAsqVrf","nFqikLewvM","48cHLW7cTs","oGu6xuN6r3","lH1ktTXQ0Z","jfREuFxX9q","dhSuHUvlv4","MezSWFnPFB","QChxst59lR","0PktIcShY2",
+"i7WMQVBjhz","hUTw7ksJby","b29RJaDGtS","SWfouBCxeC","VNCPdiB08l","iqv4k16lHc","W3VFHW3VFH","WaWsvDcpWB","cmXIXmX2GE","fcwDabZLvS",
+"uPX7GtlILt","ECMvU5drc6","JJs5m8xEKz","zHF1qcShY2","pvgjS7hyVv","x3LDeW3VFH","5iGN5lkMUA","t59lRdpe1v","ix74rs4786","azIWpfFDrJ",
+"Gv3FqvOqCE","n8pJ9618Di","e6e4zFjHXR","e6e4zBCxeC","Zv7z0gdQsS","55rfBiKqhr","zFgtB7fKYU","WaWsvVIlwP","7Ow5Cix74r","iB08lZuDtD",
+"yEfy9FwEJz","taOXK8hJdt","Q6hMCVBjhz","v2eC3ydG8U","ydG8UKr8ys","taOXK7ku1p","Gv3Fqt59lR","gdQsSYf2Ec","ydG8UNhXdu","9rlg9GrDg7",
+"JJs5mThjNn","2Nslm48cHL","4W0Tly94nw","jSjS3GrDg7","K4GS8YjB9t","GWqqX7lUXZ","piJSkuPX7G","618DiKr8ys","ZzJHWRBhp0","QChxs07n1c",
+"brhlQ2Yz7E","AmdQdFjHXR","NOHszI7p2a","brhlQcShY2","Ss0ZuiwzGk","FGzgpdQ586","Cfgr3HP433","RpBQmuoStw","ZzJHWmX2GE","55rfBhYBCK",
+"tAOsroVQp6","pv0i7VBjhz","GXdoHAgJHQ","gf8rIB3qem","pWiOslpF6W","WaWsvgIYvE","lViBvzY1GY","ZUnqtY1mC0","k85AeFNYIM","Ss0ZufFDrJ",
+"DLhzMDz1R3","OxWIHyEfy9","ciuWzSmGzv","hi5X7MGlTF","NcICA48cHL","qUJMd580YD","0BmCyvOqCE","azIWp1j5L8","dmoS7JkzUn","hYBCKxciqp",
+"Ta8f6uN6r3","zHF1qD6rBy","guMb8tuDyS","XflUqlpF6W","uoStw7fsYM","Mkgy8pvgjS","J2mQiAOgEe","LewvMFcWrW","CK5W7uJScX","W7cTsuoStw",
+"CqqaDyofH3","64s8N8hJdt","DLhzMlViBv","jfREuTa8f6","lViBvBpYhV","W7cTs4QMc9","16lHcs7Mxk","5iGN5IjTwP","kZANmFVMxo","W7cTsFnPFB",
+"580YDfcwDa","LDk6ftjQxs","xciqpNOHsz","8RCUA2TRI7","VerEAzz4ZU","FnPFBK4GS8","dQ5865IhmG","MojnPUvlv4","XyPZNpWiOs","9y4lwDQimp",
+"4W0TlDLhzM","Ss0ZuAIYUu","guMb8aez9y","fLNg8hE1Ql","29QAzVNCPd","8cVD3VIlwP","Cfgr3D6rBy","oVQp60MR5X","mz8gx0BmCy","8U2nU7ku1p",
+"Fhtgl7Ow5C","tlILtv2eC3","qaofNTa8f6","gf8rIFnPFB","UmaEviwzGk","QYxC0K4GS8","D6rByhe9IA","kB5nPHzZT8","BbwgADcpWB","yToGWWPmlx",
+"FxX9qkZANm","lweGyKr8ys","lpF6Wv1Hln","zFgtBv1Hln","fmIK18U2nU","5VZjSHP433","v1HlnPYBf4","tuDySQYxC0","B3qemvOqCE","soy9t0Wr5y",
+"lViBvDQimp","hE1QlfFDrJ","S2DfuuLtKs","48cHL9iGoT","OUqFMd7vjM","uTacxcL0aE","P6bcg24ARF","7ku1pNOHsz","D6rByFhtgl","soy9tYh1hF",
+"Oz8yZjeskS","OUYuFLewvM","suY4x2ZHdk","Waim6oQ87r","pmeCddmoS7","DG4sTKASQ8","Q6Lixh1zcH","BFkb8gdQsS","taOXKHlUbF","WPmlxt98iW",
+"brhlQYf2Ec","FNYIMru4UG","XflUqECMvU","55rfBazIWp","KsjRKiKqhr","B3qemQnJ1S","pFrrlZhwG1","JJs5m7ku1p","qQxHPsuY4x","48cHLo8Uyd",
+"VLTy67fKYU","xReecCxVEf","MK07Y24ARF","zbIYYVBjhz","CdyBV8U2nU","ulk41In3NS","zbIYYuQIcz","0BmCyn1pmO","tuDyS580YD","Yw2oUsx5Gl",
+"s7MxkEOE1o","oGu6x6q6L9","kB5nPbZLvS","GXdoHhYBCK","J2mQi2TRI7","dQ586DLhzM","QssNCJXljW","VIlwPO3iyQ","7X3uysuY4x","D6rBylViBv",
+"KZamHtvdkD","Oz8yZMaJQs","16lHcVLTy6","JKWYRMezSW","aL6AJYOfrY","K4GS8gjUTu","tl72W2Yz7E","m4bxUFGzgp","ZJTXH8TxD7","5Nammlj07Q",
+"he9IAaez9y","BCxeCRsQUq","MK07Y5VZjS","jSjS364s8N","Kr8ysqQxHP","s7MxkCNHmv","kZANmCp3mZ","X6PinOxWIH","M6qcG4QMc9","fmIK1ZzJHW",
+"5drc6Pb1pa","JXljWZuDtD","WreyPrhl0J","Vprf2S77LH","ZuDtDCIShG","In3NS8U2nU","POUYSprNT6","JRJQBOxWIH","iKqhrMmKGJ","D6rByBFkb8",
+"ulk41zHF1q","NcICAe6e4z","n8pJ9vLsmS","Ss0ZuxReec","hYBCKiKqhr","RkQke5IhmG","QbxXcLewvM","fLNg8pWiOs","WPmlxuZPqg","RpBQm5Mg9r",
+"lCMxybrhlQ","a00b5KASQ8","RsQUq8xEKz","lj07Q6q6L9","8cVD3MmKGJ","RzaZAJ2mQi","MojnPStlDJ","6AFT0kB5nP","Gv3Fq0PktI","ydG8UwDajX",
+"djsrvJkzUn","euZA5O3iyQ","nlaBydhSuH","atef2618Di","oGu6xguMb8","kB5nPMmsIo","jfREutAOsr","lsQGo9GXkX","ReKEWeuZA5","HP433GrDg7",
+"2Yz7E2DREs","5nmWvBbwgA","24ARF55rfB","blLA9JJs5m","GrDg7k85Ae","FhtglDG4sT","7X3uyQssNC","uJScXBGaQY","RsQUqLbRTH","dhSuHAkKTk",
+"lXFOBBpYhV","7Ow5C4dEz6","DG4sT16lHc","UmaEv14FLR","azIWpDz1R3","xciqpMkgy8","uQIczgtCA5","fmIK1MezSW","P6bcgM3zXL","8RCUAM3zXL",
+"07n1cRsQUq","Nxx9Vn1pmO","i3pydMaJQs","t98iWQssNC","ix74raDGtS","fLNg8aFFss","RzaZAd7vjM","jeskSMezSW","8RCUAmX2GE","1j5L8AmdQd",
+"16lHc45cIH","lCMxyUl4a1","MK07YQ6Lix","brhlQHP433","MaJQsZuDtD","EoToPuvf7A","BpYhVkZANm","OUYuFcShY2","ydG8UuQIcz","ciuWzDcpWB",
+"uN6r3Gv3Fq","dhSuHGv3Fq","4QMc9JRJQB","0MR5X8FmFH","ECMvUqQxHP","3weIFbZLvS","FGzgpCp3mZ","6q6L9GrDg7","vLsmSSbRYy","X6Pin7ku1p",
+"brhlQaFFss","oQ87ri7WMQ","aez9y0MR5X","MojnPMm8si","CNHmvjtn0X","8TxD74W0Tl","l83Udgf8rI","Y1mC0xXTI4","Pb1paiKqhr","KZamHNxx9V",
+"45cIH16lHc","Yw2oUZuDtD","GWqqXOHaBz","KASQ8ru4UG","FnPFBeuZA5","EOE1oxciqp","jiVBPIn3NS","AIYUu24ARF","RkQkeJXljW","yofH3DLhzM",
+"TXQ0ZKZamH","2NslmCfgr3","uPX7GydG8U","taOXKuAWyp","2DREsgtCA5","G1RhSQnJ1S","a00b5v1Hln","9y4lwUlU3M","ReKEWMGlTF","aDGtSv8yFN",
+"J2mQiQssNC","DG4sTBpYhV","s7MxkO3iyQ","WPmlx9XyT9","StlDJni2v1","piJSk5Namm","S77LHEdBKc","WPmlxHRxd8","AkKTkFLsph","8xEKzaez9y",
+"2DREsYw2oU","lm0pDsx5Gl","ulk41VIlwP","AgJHQ24ARF","JKWYRe6e4z","ZzJHWQbxXc","hE1QlFFDui","4dEz6WaWsv","zHF1qoQ87r","GXdoHTCgPp",
+"lm0pDoQ87r","ogLgcMojnP","yToGWRpBQm","0YAGHksJby","7hyVvLDk6f","CxVEflCMxy","oGu6xgIYvE","qaofNJRJQB","JRJQBFPfSE","t98iW5iGN5",
+"uN6r3yluBx","POUYSy94nw","3otm69eoRc","5nmWv07n1c","FxX9qDLhzM","yToGWP6bcg","rz7UtFPfSE","ogLgcl83Ud","nnP8oVBjhz","ZJTXHnlaBy",
+"EdBKcWMiS3","WDVWJM3zXL","RpBQmciuWz","fFDrJdQ586","x3LDeL7cGc","zHF1qX6Pin","X6PintlILt","zHF1qWPmlx","ni2v1jSjS3","HzZT8ogLgc",
+"HfyNQpv0i7","QWxoT5VZjS","n8pJ9azIWp","Ss0ZusuY4x","PYBf4NOHsz","pT8wutlILt","0BmCy6AFT0","9iGoTRkQke","L7cGcFwEJz","dhSuHmX2GE",
+"WaWsv8xEKz","5Drn0In3NS","8FmFHAgJHQ","BpYhVDG4sT","zFgtBAkKTk","29QAz9XyT9","zFgtBs7Mxk","CIShGNAFuw","8xEKz1j5L8","AIYUuuTacx",
+"Oz8yZzbIYY","CK5W7soy9t","mX2GECdyBV","X6Pin4W0Tl","BpYhVKASQ8","prNT6fLNg8","nlaByUl4a1","DQimptjQxs","BpYhVi7WMQ","i7WMQYOfrY",
+"X6Pin2Nslm","MezSWLDk6f","blLA98U2nU","WPmlxjfREu","n1pmO7X3uy","pmeCdoQ87r","Mm8siChuy3","LewvM0h1b1","IRh48n1pmO","RBhp02DREs",
+"IRh484W0Tl","lpF6WFNYIM","AkKTkCp3mZ","VerEAmX2GE","F6PT2jS1aj","XyPZNfLNg8","cL0aE7fsYM","xXTI4RzaZA","HzZT80PktI","zqH0WhYBCK",
+"9rlg9O3iyQ","hSSvQhe9IA","9y4lwlXFOB","ZuDtDRBhp0","Y1mC0KsjRK","2ZHdkdhSuH","TCgPpBGaQY","AkKTk5nmWv","IRh48Y1mC0","zY1GYmX2GE",
+"In3NSlH1kt","SmGzvzY1GY","AmdQdJXljW","gdQsStjQxs","Ss0Zun8pJ9","580YDdpe1v","QworuNOHsz","ZhwG1yToGW","jtn0XtAOsr","oVQp6lpF6W",
+"8hJdt8U2nU","dQ586RzaZA","9XyT9pv0i7","JXljWFwEJz","AXpwEzY1GY","jS1ajSbRYy","2DREsgIYvE","0YAGHWDVWJ","WreyP8U2nU","5Mg9rjzUqR",
+"StlDJk85Ae","7lUXZSs0Zu","FVMxotvdkD","BCxeCS77LH","WaWsv9rlg9","a00b5ksJby","L7cGc580YD","nFqikKsjRK","VBjhzpFrrl","TwanoGWqqX",
+"lCMxyuupzk","guMb8Gv3Fq","1v5hHdjsrv","yEfy9JKWYR","CIShGRsQUq","S2DfuSbRYy","gIYvEZzJHW","W7cTsGrDg7","Yw2oUXyPZN","KZamH8RCUA",
+"v1HlnNhXdu","Q6hMCuLtKs","x3LDeHRxd8","0Kyfss7Mxk","I7p2a7lUXZ","CIShGbgJAz","s7MxkuJScX","Uvlv45IhmG","FxX9qtl72W","ru4UGVNCPd",
+"pT8wuNcICA","uPX7GZJTXH","prNT6FLsph","n8pJ924ARF","VjCZqGXdoH","48cHLzmLYD","AgJHQEdBKc","Cp3mZUmaEv","2TRI7LDk6f","iB08lQnJ1S",
+"LbRTHUmaEv","I7p2aSbRYy","WPmlxM3zXL","tvdkD0Kyfs","jiVBP8hJdt","4W0Tl48cHL","d7vjMpiJSk","xReecQ6hMC","cShY2jiVBP","55rfB0ao3l",
+"W3VFHiqv4k","Ta8f61j5L8","EoToP14FLR","RBhp0IKxdL","FnPFBQChxs","guMb8iB08l","WreyPyToGW","jzUqRuoStw","n1pmOuTacx","VLTy6W3VFH",
+"Oz8yZtlILt","8U2nUb29RJ","jiVBPyvOMI","hSSvQl83Ud","cL0aECK5W7","hE1QlF6PT2","In3NSOUqFM","lpF6Wh1zcH","POUYSWaWsv","StlDJ24ARF",
+"aDGtSnnP8o","xXTI4dpe1v","tjQxsXyPZN","IRh48lweGy","FGzgplXFOB","I7p2annP8o","7fKYUaDGtS","fqypyTXQ0Z","AXpwEv2eC3","iB08lMkgy8",
+"WPmlxWaWsv","t98iWWMiS3","zmLYDPYBf4","rhl0J0PktI","FjHXRaDGtS","5Mg9ruupzk","Ta8f6Cfgr3","sqVrfv1Hln","FjHXRlm0pD","djsrvfcwDa",
+"zY1GYMm8si","cmXIXTwano","dhSuHbrhlQ","mX2GECNHmv","tl72WbgJAz","Chuy30ao3l","fcwDasoy9t","zbIYYI7p2a","okgRiVLTy6","ulk41JkzUn",
+"rhl0JksJby","FxX9q3weIF","cShY27lUXZ","lj07QWPmlx","6AFT0POUYS","sqVrfZuDtD","CqqaDWDVWJ","0ao3lSs0Zu","4dEz6i3pyd","RsQUqYOfrY",
+"RxrsmblLA9","he9IAxXTI4","pvgjSK4GS8","3weIFpvgjS","m4bxUiB08l","dhSuH0YAGH","JXljWciuWz","9GXkXUvlv4","JkzUnhE1Ql","O3iyQKsjRK",
+"uJScXYf2Ec","dpe1vs7Mxk","CxVEfzHF1q","SbRYy5VZjS","0YAGHNhXdu","NcICAqQxHP","tl72WcL0aE","W7cTsAOgEe","vkCHHCK5W7","O3iyQdmoS7",
+"k85AeFcWrW","PYBf4WDVWJ","2ZHdksoy9t","y94nw1j5L8","yEfy9fFDrJ","2DREszFgtB","zmLYDAIYUu","zbIYYHRxd8","SmGzv7ku1p","AkKTkAIYUu",
+"FnPFBHfyNQ","CNHmvFnPFB","djsrvuPX7G","0BmCy5iGN5","Chuy3jzUqR","FGzgpn1pmO","fLNg8hi5X7","7fsYMKZamH","TXQ0ZEdBKc","aFFss0ao3l",
+"0KyfsVBjhz","t98iWZuDtD","taOXKDLhzM","7hyVvcQOnv","cL0aEwiHrZ","fFDrJRkQke","HlUbFm4bxU","Yh1hFVLTy6","pvgjSzY1GY","jfREulCMxy",
+"cShY2K4GS8","C2IrckZANm","45cIHxciqp","oGu6xulk41","9iGoTFcWrW","JkzUnAOgEe","AXpwEni2v1","hUTw7gtCA5","2hEEU8TxD7","PYBf49GXkX",
+"5nmWvlj07Q","yToGWuvf7A","yvOMIVNCPd","CxVEfQssNC","dmoS7hSSvQ","s7MxkJIqXi","ogLgcAgJHQ","EoToPVLTy6","24ARFiB08l","wiHrZKsjRK",
+"sx5Glulk41","cL0aEStlDJ","suY4xmz8gx","GXdoHWmadA","QClRLD6rBy","5VZjS07n1c","WPmlxzHF1q","nFqiklXFOB","gf8rIJJs5m","mz8gxQ6Lix",
+"580YDThjNn","Z4I1vGWqqX","QYxC0CxVEf","uZPqg8xEKz","RkQke4dEz6","n8pJ9WaWsv","jfREuI7p2a","jtn0XQssNC","Nxx9VGSQwj","cShY2FnPFB",
+"Oz8yZIKxdL","jeskSsx5Gl","zz4ZU5Namm","WreyPMkgy8","uvf7Asoy9t","VBjhzQbxXc","9XyT9vOqCE","tlILt9GXkX","0MR5Xt59lR","hSSvQDz1R3",
+"wiHrZnlaBy","5Drn08TxD7","WreyPv2eC3","VNCPdjfREu","fmIK1OUYuF","AmdQd55rfB","7X3uydmoS7","ni2v1SjskQ","14FLRfqypy","7X3uyGWqqX",
+"SmGzvZzJHW","RACujuJScX","Ul4a1s4786","UmaEvQWxoT","RmDcrUlU3M","b29RJhYBCK","NOHszGSQwj","Cp3mZFLsph","PYBf4uupzk","FNYIMEOE1o",
+"mX2GEMezSW","1j5L8LDk6f","k85Ae580YD","vOqCED6rBy","F6PT2jtn0X","EdBKcMmsIo","JRJQBvkCHH","5nmWvWmadA","lsQGoulk41","8TxD7RBhp0",
+"v1Hlnix74r","uLtKslm0pD","zFgtBTwano","CdyBVuTacx","JkzUn7lUXZ","7hyVv07n1c","OUqFMKASQ8","he9IAWaWsv","9eoRcQworu","Oz8yZK20wK",
+"EOE1ozmLYD","9XyT9zz4ZU","8cVD3Q6hMC","hi5X7cQOnv","K20wKS77LH","pWiOsNOHsz","pv0i7WPmlx","07n1cTwano","qaofNtlILt","FFDuiiqv4k",
+"lViBvsoy9t","tjQxsoVQp6","aDGtSVerEA","RBhp0CNHmv","lXFOBvLsmS","RmDcrFwEJz","jtn0X29QAz","7lUXZdjsrv","Rxrsmn1pmO","yluBxs7Mxk",
+"QClRLt98iW","zY1GYmz8gx","aL6AJWaWsv","xReecF6PT2","FjHXRXflUq","nFqikOxWIH","t98iWS77LH","6q6L9VerEA","5iGN5GSQwj","HfyNQ5Drn0",
+"RzaZAMaJQs","HlUbF8FmFH","xXTI4qUJMd","QClRLQssNC","nlaByF6PT2","ru4UGNcICA","F6PT27hyVv","nnP8oIKxdL","BbwgAuupzk","XyPZNHfyNQ",
+"pFrrl580YD","CK5W7wDajX","0PktICxVEf","8TxD7DLhzM","FnPFBb29RJ","mz8gxa00b5","e6e4zRACuj","tjQxsDG4sT","sqVrfZ4I1v","8RCUAFcWrW",
+"0YAGHQbxXc","NcICAJkzUn","P6bcg7hyVv","QssNC3otm6","0PktI8FmFH","VLTy6aDGtS","4QMc91j5L8","JJs5mFwEJz","pAhR1P6bcg","VBjhzjfREu",
+"FnPFBYOfrY","uAWypIKxdL","ReKEWpv0i7","LbRTHReKEW","IBe8kU3yw5","uN6r3lCMxy","ix74rNcICA","QYxC0BpYhV","tlILtDLhzM","9eoRcMezSW",
+"618Dil83Ud","9XyT90MR5X","a00b5o8Uyd","D6rByQ6hMC","07n1cv2eC3","cShY255rfB","t98iWhSSvQ","fmIK1LewvM","QssNCzbIYY","lsQGo5iGN5",
+"BpYhVwDajX","KZamHM6qcG","3otm6WDVWJ","ulk419rlg9","4W0TlpmeCd","LDk6fn1pmO","d85a9O3iyQ","tlILtoVQp6","EoToPgtCA5","Kr8ysVprf2",
+"G1RhSjS1aj","ni2v1JJs5m","rKDLJQbxXc","zqH0WW3VFH","sx5GlGrDg7","wDajXbZLvS","07n1cYf2Ec","RmDcrv1Hln","xciqphE1Ql","16lHcCNHmv",
+"HfyNQn8pJ9","DG4sTyluBx","h1zcH2DREs","GrDg7pFrrl","FjHXRDG4sT","KZamHFxX9q","F6PT2ThjNn","Z4I1vBpYhV","VIlwPlViBv","uPX7GazIWp",
+"hYBCKfFDrJ","a00b5brhlQ","tAOsr0Kyfs","wDajXyluBx","tuDySmz8gx","KsjRKAOgEe","AgJHQ5Mg9r","dpe1vlCMxy","gdQsSBbwgA","oVQp6W7cTs",
+"F6PT25iGN5","uN6r39y4lw","NhXduuPX7G","WMiS3MaJQs","euZA5M6qcG","gIYvEjzUqR","SWfou1v5hH","guMb8o8Uyd","yvOMI9XyT9","tlILtNo0Qb",
+"0h1b10ao3l","No0QbwiHrZ","CNHmvpT8wu","n8pJ9tvdkD","uvf7AFjHXR","Kr8ysfcwDa","2TRI7580YD","TwanoJKWYR","IKxdLksJby","n1pmOciuWz",
+"9XyT9qQxHP","B3qemi7WMQ","pvgjSDLhzM","FjHXRzmLYD","2ZHdkwiHrZ","QChxsuZPqg","iKqhrtjQxs","b29RJpFrrl","azIWpMGlTF","uvf7AJXljW",
+"h1zcHKsjRK","8RCUAAXpwE","8TxD7G1RhS","fqypy7hyVv","580YD9rlg9","9y4lwAXpwE","QworucmXIX","JKWYRS77LH","OUYuFTXQ0Z","8cVD307n1c",
+"tAOsrxciqp","s7MxkWreyP","gtCA5dmoS7","9y4lwsoy9t","Ul4a1yofH3","e6e4zGXdoH","JRJQBBFkb8","aFFssYf2Ec","jeskSM6qcG","1j5L8NhXdu",
+"2TRI7WMiS3","AXpwEUlU3M","ZUnqtThjNn","RACujl83Ud","GWqqXRmDcr","RpBQmUlU3M","i3pydnnP8o","qQxHPe6e4z","FVMxoyToGW","tjQxsYjB9t",
+"JkzUnPYBf4","azIWpdpe1v","Q6hMC5IhmG","GXdoHQYxC0","9GXkX9y4lw","suY4xUlU3M","WMiS3uJScX","7fKYUJKWYR","BGaQYfLNg8","HlUbF7ku1p",
+"d85a924ARF","okgRirKDLJ","zHF1qUvlv4","MGlTFd85a9","jS1aj2ZHdk","Z4I1vh1zcH","StlDJkZANm","lViBvKr8ys","n8pJ9VIlwP","5nmWv9GXkX",
+"8hJdtJ2mQi","k85Aeuvf7A","9rlg9Rxrsm","Z4I1vRBhp0","S2Dfu8xEKz","GrDg7mz8gx","dmoS7tAOsr","MezSWMm8si","CqqaD4QMc9","G1RhSzY1GY",
+"TwanoRzaZA","M3zXL1j5L8","uTacxCNHmv","yluBxZJTXH","Vprf23weIF","7hyVvyToGW","Yw2oUAgJHQ","djsrvgtCA5","EdBKcZhwG1","9iGoTgf8rI",
+"Pb1pajSjS3","C2IrcHP433","yvOMId85a9","OxWIHv2eC3","FcWrWQYxC0","rhl0J4QMc9","yvOMIFxX9q","Q6hMC7Ow5C","0MR5X0PktI","0ao3l5IhmG",
+"8FmFHaez9y","yvOMIUlU3M","lViBvgIYvE","oVQp6suY4x","GWqqXPb1pa","P6bcgBCxeC","8RCUAlH1kt","pFrrlFhtgl","0ao3lC2Irc","he9IAQ6Lix",
+"AkKTkzbIYY","taOXKBCxeC","jiVBP2DREs","PYBf4xciqp","4dEz6k85Ae","suY4xwiHrZ","QYxC0VerEA","5VZjSwDajX","BFkb82TRI7","ZuDtDS77LH",
+"rKDLJFNYIM","BCxeC8RCUA","oQ87rFhtgl","IBe8keuZA5","aL6AJYh1hF","v1Hln0h1b1","Kr8ysfmIK1","2hEEU0PktI","Cp3mZS2Dfu","Cfgr3h1zcH",
+"ydG8UpAhR1","Cp3mZAgJHQ","EoToP7ku1p","F6PT2k85Ae","DcpWBDcpWB","P6bcgPOUYS","5drc6DLhzM","dmoS7iwzGk","ksJbyWmadA","No0QbDG4sT",
+"MezSWhe9IA","8cVD3tAOsr","J2mQiCqqaD","9eoRc2DREs","JKWYRTa8f6","7fsYMP6bcg","QssNC9XyT9","ZUnqtPOUYS","2NslmyEfy9","0BmCyZJTXH",
+"Gv3FqHRxd8","atef2JkzUn","RsQUqiKqhr","soy9tG1RhS","MezSWdjsrv","ix74r7hyVv","2TRI7xXTI4","s7MxkZUnqt","8TxD7xciqp","G1RhS4dEz6",
+"yToGWCdyBV","StlDJFnPFB","iqv4kHfyNQ","EdBKcVprf2","DG4sTUvlv4","dhSuHCIShG","9eoRcVerEA","AXpwEe6e4z","ogLgcdjsrv","Chuy3618Di",
+"S2Dfu4QMc9","HzZT8aez9y","DQimpW7cTs","FnPFBFGzgp","QWxoTYh1hF","taOXK0ao3l","CxVEftjQxs","kZANmjSjS3","WMiS3aL6AJ","RzaZAzY1GY",
+"6q6L9lCMxy","cQOnvo8Uyd","EdBKcuPX7G","JkzUnCfgr3","YOfrY9y4lw","GXdoHbgJAz","YOfrY618Di","9rlg9jtn0X","GWqqXtAOsr","YOfrYAmdQd",
+"HfyNQa00b5","pAhR1gf8rI","EdBKcK4GS8","1v5hHt59lR","uTacxMGlTF","XyPZNSbRYy","Chuy3NAFuw","tlILt2DREs","07n1c0PktI","Chuy3he9IA",
+"GSQwjPb1pa","MezSWAmdQd","Gv3Fqb29RJ","6q6L9iB08l","b29RJVLTy6","14FLRpv0i7","Cp3mZFhtgl","y94nwtjQxs","618DiUvlv4","24ARFDLhzM",
+"2TRI70MR5X","cmXIXJ2mQi","JIqXi8hJdt","4dEz6FLsph","VNCPdUvlv4","2TRI7SmGzv","PYBf4QWxoT","lCMxyVprf2","s93Ml5nmWv","aFFssOHaBz",
+"ni2v1MezSW","QWxoTVLTy6","ZuDtDOHaBz","vOqCEjtn0X","0Wr5yuPX7G","4W0TlHlUbF","pvgjSx3LDe","SmGzvZUnqt","FwEJzhYBCK","h1zcH2TRI7",
+"LDk6fIRh48","45cIHBpYhV","GrDg7faHir","EdBKc6q6L9","xXTI4bgJAz","2TRI7lXFOB","LbRTHogLgc","Nxx9VFcWrW","Mkgy8VBjhz","0PktIL7cGc",
+"Zv7z0x3LDe","0ao3l2hEEU","soy9t4W0Tl","4dEz6lm0pD","6q6L9Yf2Ec","B3qemNAFuw","lj07Q9XyT9","WMiS3pvgjS","h1zcHHfyNQ","29QAzS77LH",
+"kZANmK4GS8","2ZHdkMmsIo","48cHLFxX9q","pv0i7M3zXL","K4GS8QssNC","JKWYRqaofN","hE1Ql55rfB","piJSkMezSW","cQOnvUlU3M","gf8rIBGaQY",
+"2Yz7EXflUq","hYBCKGXdoH","v8yFNMezSW","G1RhSPOUYS","jSjS3euZA5","5ZaEzprNT6","Uvlv4zHF1q","BFkb8yofH3","fFDrJru4UG","he9IASjskQ",
+"azIWpU3yw5","aL6AJtlILt","CdyBVrKDLJ","RzaZAuQIcz","RzaZAlm0pD","lj07QZzJHW","aFFss7fKYU","0KyfsHfyNQ","Ta8f6mX2GE","bgJAzWmadA",
+"EdBKcatef2","BCxeCpT8wu","8cVD3KsjRK","oQ87rYh1hF","b29RJTCgPp","zqH0WlH1kt","KsjRKiwzGk","BGaQYRACuj","9rlg9faHir","WmadApmeCd",
+"fqypyS2Dfu","yvOMIlCMxy","b29RJAXpwE","MmKGJ2DREs","pT8wu5Namm","Gv3FqQYxC0","9rlg91v5hH","kB5nPtl72W","kB5nPs7Mxk","DLhzMgjUTu",
+"StlDJS2Dfu","tvdkDVjCZq","Pb1paBpYhV","D6rBy8U2nU","8xEKzzFgtB","QYxC0i3pyd","rKDLJlsQGo","RACujCfgr3","zmLYDpv0i7","RkQkeaez9y",
+"NOHszazIWp","pmeCdCNHmv","16lHcKr8ys","uAWypYOfrY","8FmFHS2Dfu","5NammSjskQ","Nxx9VTCgPp","hUTw7nnP8o","45cIHY1mC0","lj07QfcwDa",
+"FGzgplpF6W","rz7UtRsQUq","5IhmGWaim6","9y4lwi7WMQ","IKxdLciuWz","0MR5XRsQUq","ydG8UQworu","nnP8oQssNC","JXljWZhwG1","gf8rIpiJSk",
+"ksJbytlILt","pFrrlSmGzv","CK5W7KsjRK","RmDcr2TRI7","FFDuiW3VFH","ulk418hJdt","PYBf48hJdt","5ZaEzRmDcr","XyPZNFFDui","hSSvQd7vjM",
+"2hEEUn1pmO","XyPZNIn3NS","WmadAK4GS8","Nxx9VIjTwP","RACujFFDui","07n1cQClRL","uJScXCp3mZ","iKqhrZv7z0","1v5hHWmadA","JIqXiLbRTH",
+"B3qem8FmFH","YOfrYVNCPd","5Drn04dEz6","NAFuwWaim6","2TRI7ogLgc","StlDJRzaZA","0YAGHiKqhr","MaJQsWPmlx","55rfBuTacx","v2eC3m4bxU",
+"s4786zqH0W","B3qemkZANm","Ta8f6QClRL","MezSWB3qem","7Ow5CTa8f6","6AFT0vkCHH","TXQ0Z14FLR","WmadANcICA","5Drn0618Di","h1zcHpT8wu",
+"suY4xDG4sT","JkzUnzFgtB","pAhR1O3iyQ","JJs5m9eoRc","yToGWn8pJ9","jeskSgdQsS","ZUnqt1j5L8","m4bxUUvlv4","Vprf2Ul4a1","QWxoTKsjRK",
+"FnPFBdQ586","y94nw16lHc","tuDySokgRi","JXljWuAWyp","i3pyd55rfB","wiHrZFxX9q","ni2v1Y1mC0","F6PT2FPfSE","d7vjMTwano","NhXdu8xEKz",
+"Ss0ZuYh1hF","y94nwuoStw","NcICAxciqp","CdyBVhSSvQ","mz8gxAgJHQ","JXljWKsjRK","n1pmOThjNn","8FmFHNhXdu","QYxC0tAOsr","tAOsrX6Pin",
+"XflUqOUYuF","ulk41gIYvE","RBhp00h1b1","QWxoTNOHsz","bZLvStuDyS","jtn0XdmoS7","8cVD3l83Ud","xXTI4IBe8k","JXljWFnPFB","ciuWzK20wK",
+"rhl0J7fsYM","Uvlv4RmDcr","s4786zmLYD","K20wK48cHL","lm0pDGv3Fq","VBjhzsuY4x","kB5nPUlU3M","aFFssYjB9t","QYxC0Chuy3","8U2nUJkzUn",
+"GSQwjsuY4x","9eoRcuZPqg","KsjRKru4UG","RkQkepWiOs","M6qcGaL6AJ","yvOMIQssNC","X6Pin3weIF","gjUTulH1kt","7fKYUhE1Ql","Ta8f6RkQke",
+"hUTw7ulk41","07n1c3otm6","64s8NUmaEv","0BmCyGrDg7","0YAGHs4786","5ZaEzCfgr3","RsQUqNAFuw","k85AeiwzGk","NOHszIBe8k","RpBQmZv7z0",
+"Rxrsm0h1b1","iwzGk5VZjS","XyPZNcmXIX","rz7UtDLhzM","FhtglogLgc","3weIFQWxoT","uPX7GjSjS3","RsQUqJIqXi","POUYSwDajX","cQOnvguMb8",
+"5drc6taOXK","5NammStlDJ","ZUnqtMezSW","EoToPEoToP","KsjRK5Drn0","oGu6x8xEKz","dhSuHP6bcg","Mkgy81LB1L","6q6L9zz4ZU","iB08lUl4a1",
+"64s8N45cIH","618DiIn3NS","JIqXiD6rBy","uQIczDcpWB","jeskSIRh48","64s8N9y4lw","ZUnqtVBjhz","nnP8o45cIH","gf8rIL7cGc","IKxdLMkgy8",
+"WDVWJydG8U","5nmWvfmIK1","uvf7ALewvM","lpF6WSmGzv","t59lR5iGN5","0ao3luTacx","aez9yTXQ0Z","3weIF5Mg9r","IBe8kzHF1q","7ku1pWaWsv",
+"MojnPpv0i7","Gv3FqblLA9","zFgtBBFkb8","FFDuiBCxeC","uJScXsoy9t","brhlQo8Uyd","aDGtSs93Ml","ogLgcUl4a1","lViBvS2Dfu","bZLvSHfyNQ",
+"piJSkd7vjM","618DioQ87r","5Drn0lCMxy","jtn0XoVQp6","9eoRc24ARF","Yf2EcECMvU","nnP8oqaofN","RpBQm0h1b1","euZA5jeskS","4QMc9FGzgp",
+"KASQ8vOqCE","ZhwG1Mm8si","IRh48uTacx","07n1cJRJQB","8hJdtlpF6W","fqypyQ6Lix","zmLYD2ZHdk","GrDg7U3yw5","X6PinCIShG","K20wK5Drn0",
+"ReKEWMmsIo","FxX9q8xEKz","e6e4zAkKTk","qUJMd0BmCy","nnP8o2Nslm","RkQkeRACuj","VjCZqQYxC0","uQIczlH1kt","8RCUAk85Ae","rhl0Jni2v1",
+"8xEKzwiHrZ","hUTw7KASQ8","Z4I1v7fKYU","yvOMI5VZjS","v2eC3MaJQs","gf8rIKsjRK","M3zXLGv3Fq","gdQsSMkgy8","v8yFNMmsIo","L7cGcQ6Lix",
+"dhSuHBpYhV","OUqFM5drc6","xReecKr8ys","Dz1R3RmDcr","AkKTkNcICA","uN6r3dQ586","lViBv4dEz6","d85a9SmGzv","fFDrJSmGzv","SmGzvZuDtD",
+"Ul4a124ARF","I7p2apWiOs","sqVrfru4UG","6AFT0BpYhV","2ZHdkZUnqt","GrDg7In3NS","fqypyCIShG","CIShGrz7Ut","zbIYY9iGoT","IKxdLSs0Zu",
+"45cIHIn3NS","BbwgAZJTXH","xReec2TRI7","faHirChuy3","Nxx9Vi3pyd","JXljWW3VFH","tlILtlH1kt","yluBxYh1hF","gtCA5gf8rI","VjCZqIn3NS",
+"6AFT0FjHXR","uLtKsyofH3","NcICAlXFOB","7ku1pAkKTk","SWfouGWqqX","OUqFMOxWIH","gtCA5IKxdL","AmdQddpe1v","OUqFMLDk6f","M6qcGTCgPp",
+"yofH3iKqhr","VLTy67hyVv","vLsmSTXQ0Z","QWxoTSbRYy","oGu6xKASQ8","D6rBy1j5L8","WMiS37X3uy","FjHXRt98iW","b29RJpmeCd","8RCUA0Kyfs",
+"Zv7z05drc6","euZA5W3VFH","B3qemCxVEf","h1zcHMK07Y","Kr8ysxXTI4","oQ87rogLgc","Uvlv4dpe1v","RmDcrNcICA","9GXkX4W0Tl","qaofNpAhR1",
+"2hEEUru4UG","XflUqlkMUA","P6bcgyofH3","zQt6QQnJ1S","Ss0Zuy94nw","VBjhz5VZjS","CK5W714FLR","MaJQsqaofN","IjTwPQClRL","lkMUAC2Irc",
+"AgJHQdjsrv","7fKYUBGaQY","lCMxyVIlwP","VIlwPMojnP","nFqik8U2nU","NhXdul83Ud","d85a94QMc9","6AFT0JRJQB","x3LDeFxX9q","s93MlWaim6",
+"DLhzMC2Irc","OHaBzHRxd8","uupzkJJs5m","S2DfuqUJMd","M3zXLydG8U","5ZaEzpmeCd","7Ow5CPYBf4","9y4lwJKWYR","JXljWgf8rI","U3yw5LewvM",
+"aDGtSRxrsm","atef2bZLvS","Yf2Ec580YD","cShY2dmoS7","QnJ1SGWqqX","pv0i7JkzUn","YOfrYfqypy","48cHL8xEKz","uTacxgdQsS","iB08l2Nslm",
+"Kr8ysG1RhS","djsrvX6Pin","D6rByaL6AJ","14FLRJJs5m","i3pydlm0pD","NAFuwjfREu","v8yFNnnP8o","cQOnvMmsIo","CxVEfHP433","aez9yM6qcG",
+"QworuO3iyQ","7hyVvbZLvS","6q6L9BbwgA","sqVrfzQt6Q","WMiS37Ow5C","bZLvSEoToP","DcpWBd85a9","Mkgy89eoRc","CxVEfAIYUu","NOHszOUqFM",
+"aL6AJmz8gx","n1pmOZ4I1v","4dEz6MGlTF","GXdoHSmGzv","RBhp0VBjhz","sqVrf2hEEU","NhXdu0Kyfs","Kr8ys9XyT9","cmXIXcShY2","5Mg9rRkQke",
+"4QMc9lpF6W","FhtglWaWsv","lweGyMaJQs","n8pJ9ZJTXH","fLNg8580YD","mz8gxFwEJz","xXTI4Cfgr3","5ZaEzM3zXL","EdBKcv2eC3","NhXduvkCHH",
+"Cp3mZx3LDe","fcJOyFFDui","FxX9q5ZaEz","s4786nnP8o","gdQsSStlDJ","d85a9MmsIo","LewvMulk41","0PktI24ARF","Mm8siNAFuw","aez9yChuy3",
+"Chuy3v1Hln","C2IrcgdQsS","3weIFyEfy9","UmaEvCNHmv","t59lRSWfou","GSQwjatef2","NAFuwcmXIX","iqv4k9GXkX","fcwDan8pJ9","S77LHUvlv4",
+"OUqFMfcwDa","5NammjfREu","zbIYYW3VFH","2hEEUUmaEv","WmadAFnPFB","blLA9cL0aE","45cIHh1zcH","lXFOBhSSvQ","lCMxypFrrl","oGu6x8FmFH",
+"xciqp0YAGH","24ARF48cHL","ydG8UaDGtS","QChxsuLtKs","Vprf2pmeCd","3otm6OUqFM","SbRYyoGu6x","VIlwPNhXdu","Qworuni2v1","CqqaDi7WMQ",
+"BpYhVCK5W7","guMb8lsQGo","jiVBPM6qcG","uZPqgMmsIo","KASQ89y4lw","soy9t5Namm","HRxd8jS1aj","9GXkX7fsYM","JKWYRG1RhS","hE1QlBFkb8",
+"RkQkelm0pD","ciuWznnP8o","2NslmGSQwj","KASQ8IjTwP","29QAzix74r","2NslmCxVEf","fLNg8IBe8k","Dz1R3CdyBV","FhtgltjQxs","7X3uyy94nw",
+"QWxoTRmDcr","LbRTHgtCA5","aFFsslj07Q","i7WMQVIlwP","7fKYUWmadA","0MR5XaL6AJ","uN6r3D6rBy","W7cTstAOsr","bgJAzydG8U","zmLYDLewvM",
+"qUJMdIKxdL","2hEEUpiJSk","QnJ1SpmeCd","nFqikuZPqg","dmoS7Waim6","okgRiHzZT8","Cfgr3Qworu","1j5L8Oz8yZ","0YAGHOz8yZ","8U2nUO3iyQ",
+"7hyVvwDajX","iqv4khi5X7","WmadA5VZjS","IBe8kIjTwP","AgJHQsx5Gl","8xEKzYh1hF","XflUqhYBCK","Ta8f6FxX9q","zbIYYt98iW","7fKYUuJScX",
+"aez9ypT8wu","jS1aj5drc6","NAFuwyEfy9","Cfgr35Mg9r","5Drn0Fhtgl","HfyNQUvlv4","zFgtBv8yFN","tvdkDokgRi","5VZjSTXQ0Z","5Mg9rpvgjS",
+"VjCZqFFDui","IRh48VjCZq","StlDJ618Di","uLtKsQWxoT","h1zcHtaOXK","prNT60MR5X","s4786YjB9t","JJs5m1v5hH","Cp3mZqUJMd","WaWsvmz8gx",
+"s93MlIBe8k","B3qemVNCPd","dpe1vcL0aE","FGzgpU3yw5","OUYuFOxWIH","OUqFMZ4I1v","1v5hH6q6L9","RzaZATCgPp","xXTI4TXQ0Z","jfREuvLsmS",
+"lH1kt7ku1p","X6PinJ2mQi","GrDg7FjHXR","J2mQiQWxoT","tjQxs3otm6","zz4ZUd7vjM","BCxeCU3yw5","uN6r3wDajX","FGzgpRxrsm","Pb1paprNT6",
+"BbwgAydG8U","FGzgpCIShG","yEfy9kZANm","2hEEUG1RhS","5IhmGZ4I1v","kB5nPCfgr3","ZUnqtix74r","Y1mC0JXljW","dmoS7DcpWB","Gv3FqIBe8k",
+"NAFuwMkgy8","zqH0WFPfSE","QClRLQClRL","KASQ8POUYS","d7vjMpAhR1","cmXIXRBhp0","bZLvShUTw7","MmKGJHP433","uvf7AuZPqg","9eoRcRsQUq",
+"G1RhSyvOMI","YjB9tlCMxy","uQIczMojnP","lkMUAzQt6Q","uLtKseuZA5","ksJbyo8Uyd","Z4I1vuN6r3","v8yFNJKWYR","brhlQThjNn","vkCHHRsQUq",
+"ix74rjS1aj","azIWpVIlwP","KASQ8lXFOB","Z4I1viqv4k","SjskQpmeCd","NcICAlsQGo","DG4sTpFrrl","AkKTkM3zXL","b29RJCNHmv","580YDHP433",
+"fcwDaDcpWB","8RCUA1j5L8","RBhp0ReKEW","VjCZqQChxs","WPmlx24ARF","rz7UtB3qem","6q6L9Kr8ys","ciuWzHlUbF","IBe8kcShY2","LewvMl83Ud",
+"S2DfuGWqqX","8cVD3IRh48","EdBKcYf2Ec","AkKTkzY1GY","guMb8D6rBy","0KyfsfmIK1","SbRYyFwEJz","JXljWlViBv","lsQGoS77LH","euZA5a00b5",
+"yluBxiKqhr","ydG8UrKDLJ","oVQp6vLsmS","blLA9ix74r","HRxd8AXpwE","J2mQi0PktI","IKxdLFjHXR","rhl0JzY1GY","sqVrfokgRi","fqypykZANm",
+"t59lRS2Dfu","CK5W7RmDcr","lH1ktXflUq","In3NSAIYUu","8RCUAdhSuH","ru4UGpAhR1","gIYvEbgJAz","s4786M3zXL","2Yz7EksJby","8RCUAfFDrJ",
+"fcwDaHP433","yToGW0YAGH","2Nslm0h1b1","Kr8ys3otm6","zHF1q5drc6","ni2v1m4bxU","5VZjSgdQsS","IRh48n8pJ9","RpBQmP6bcg","zY1GYQssNC",
+"uoStwxXTI4","2ZHdkIn3NS","7hyVvpmeCd","0h1b1S77LH","8FmFHbgJAz","RzaZAX6Pin","FPfSE4W0Tl","rKDLJFPfSE","bZLvSoQ87r","JIqXih1zcH",
+"cmXIX7fsYM","hE1QlbgJAz","Mkgy88RCUA","zFgtB5Mg9r","M3zXL8hJdt","CNHmv618Di","JkzUnMaJQs","AgJHQQClRL","iqv4kJXljW","uJScXbgJAz",
+"2hEEUQnJ1S","cmXIXs93Ml","BGaQYaez9y","6q6L9d85a9","tuDySsoy9t","blLA9KASQ8","ni2v19XyT9","CIShGHlUbF","7ku1pSjskQ","v2eC33otm6",
+"3weIFM3zXL","hUTw7tuDyS","lXFOBSjskQ","piJSkuZPqg","ix74r55rfB","hYBCKpFrrl","Nxx9VMezSW","5iGN5W3VFH","24ARFOHaBz","oGu6xdQ586",
+"BGaQYRBhp0","lsQGoqQxHP","Nxx9VYf2Ec","zz4ZUzFgtB","n8pJ9nFqik","pAhR1JRJQB","QworuHfyNQ","i3pydmX2GE","LDk6fgf8rI","zQt6Q5Mg9r",
+"StlDJgjUTu","C2IrcAmdQd","G1RhS2hEEU","FjHXRPb1pa","Q6hMCIKxdL","fFDrJwDajX","1j5L8hYBCK","JRJQBazIWp","hi5X7rKDLJ","In3NSgtCA5",
+"ni2v1Dz1R3","IBe8kO3iyQ","4QMc91v5hH","jeskSWreyP","tlILt5Drn0","CqqaDJRJQB","hSSvQ4W0Tl","0YAGH7Ow5C","OxWIHS77LH","U3yw5ogLgc",
+"NAFuwVIlwP","taOXKjtn0X","W7cTsNOHsz","blLA92DREs","W3VFHyvOMI","dhSuHaDGtS","Ss0ZutuDyS","8cVD3fLNg8","MojnPDz1R3","CxVEfMkgy8",
+"jSjS38FmFH","Yh1hFCfgr3","7Ow5CK20wK","HzZT8GXdoH","B3qemAIYUu","uLtKshE1Ql","EoToPkB5nP","6AFT0jtn0X","8U2nUlm0pD","48cHLNAFuw",
+"7lUXZReKEW","zqH0WFhtgl","HP433uN6r3","prNT67Ow5C","hSSvQlj07Q","zmLYDD6rBy","DG4sTTCgPp","wiHrZQssNC","8hJdteuZA5","Chuy3uupzk",
+"lCMxyblLA9","14FLRCIShG","VLTy6AkKTk","P6bcga00b5","gtCA5GWqqX","M3zXLVLTy6","Cfgr3kB5nP","ulk41VNCPd","5IhmGCIShG","ReKEWhE1Ql",
+"xciqp7X3uy","zHF1qn1pmO","xXTI4VerEA","AkKTkThjNn","bZLvSX6Pin","XflUq9eoRc","lsQGodhSuH","XyPZN7ku1p","HRxd8xReec","FhtglJkzUn",
+"v8yFNs4786","IBe8kazIWp","bgJAzUmaEv","ogLgcBbwgA","AIYUuTXQ0Z","5Mg9rgIYvE","FxX9q2Yz7E","BpYhVeuZA5","DQimpuAWyp","n8pJ99rlg9",
+"0PktIVLTy6","pv0i7mz8gx","5iGN5fLNg8","8cVD3Nxx9V","Waim6SWfou","580YD5iGN5","s7MxkvOqCE","618DiAgJHQ","soy9tJKWYR","9iGoTm4bxU",
+"uTacxIRh48","OUYuFuZPqg","qUJMdaL6AJ","3weIFfcwDa","3otm6Cfgr3","Zv7z0IKxdL","uQIczJXljW","AmdQd0YAGH","VIlwPJKWYR","cQOnvhYBCK",
+"oVQp6hSSvQ","FnPFBLbRTH","6q6L9faHir","zFgtBgjUTu","h1zcHWreyP","7hyVvYf2Ec","uJScXWmadA","h1zcHni2v1","piJSktl72W","tjQxs7fsYM",
+"l83UddQ586","djsrvVIlwP","ReKEWpT8wu","07n1cQYxC0","M3zXLgdQsS","XyPZNsoy9t","d85a9zY1GY","lXFOBMGlTF","atef25drc6","AOgEeFnPFB",
+"pT8wuqQxHP","hSSvQgjUTu","14FLRdjsrv","uJScXzQt6Q","SjskQfmIK1","kB5nPB3qem","P6bcgbrhlQ","xXTI4uvf7A","i3pydd7vjM","Mm8sia00b5",
+"lViBvtjQxs","v8yFN5Namm","guMb8Uvlv4","1LB1L2Nslm","S2DfuOxWIH","fcJOyKASQ8","yvOMIqQxHP","CNHmvWmadA","8cVD3GSQwj","aL6AJQbxXc",
+"5iGN5qaofN","5nmWvMkgy8","WaWsvgtCA5","nnP8ouAWyp","EoToPMm8si","oVQp64QMc9","TXQ0ZyvOMI","AXpwEwiHrZ","8cVD3fFDrJ","uoStwCIShG",
+"NhXduxXTI4","OxWIH55rfB","7fKYUW7cTs","ydG8UHfyNQ","suY4xQssNC","XyPZN2Yz7E","FwEJzl83Ud","lm0pDv8yFN","0PktIRACuj","o8UydwDajX",
+"uTacx48cHL","okgRiMm8si","W7cTskZANm","zmLYDNAFuw","lsQGopvgjS","AgJHQAmdQd","lH1ktPYBf4","FLsphFhtgl","C2IrcprNT6","aL6AJAgJHQ",
+"0MR5X64s8N","CxVEfK4GS8","mz8gxaL6AJ","hSSvQVNCPd","AmdQd5Drn0","iqv4kNo0Qb","azIWplweGy","WreyPWaim6","i3pydReKEW","tl72Wrhl0J",
+"RmDcrogLgc","IRh4816lHc","nFqikFjHXR","lpF6Wpv0i7","ni2v1hE1Ql","uPX7GZzJHW","KsjRKtuDyS","4W0TlOz8yZ","W7cTsnlaBy","lH1ktjzUqR",
+"IjTwPVIlwP","Waim61v5hH","MGlTFi7WMQ","2TRI714FLR","NcICAMmKGJ","QWxoTS77LH","uTacxUvlv4","QnJ1Sl83Ud","IBe8k8TxD7","CIShGhYBCK",
+"pv0i7BGaQY","nFqik24ARF","EoToPl83Ud","48cHLjfREu","Yf2EcuoStw","ciuWzYOfrY","uTacxWreyP","djsrvMGlTF","5drc6Y1mC0","WPmlxGWqqX",
+"yluBxZUnqt","vLsmSfcwDa","zY1GYrKDLJ","1LB1LCNHmv","qaofNciuWz","tuDySYOfrY","atef23weIF","XyPZNFxX9q","0BmCyHzZT8","he9IAxciqp",
+"9iGoTuPX7G","v8yFNzmLYD","618DiJRJQB","ni2v1AXpwE","G1RhS1j5L8","HP433VNCPd","S77LHAmdQd","BFkb88cVD3","1LB1Lix74r","Qworu9y4lw",
+"W3VFHI7p2a","blLA9J2mQi","taOXK7lUXZ","v2eC3KZamH","n8pJ9xReec","CxVEf8cVD3","W3VFHDQimp","EdBKc9iGoT","F6PT2tuDyS","Q6Lixjtn0X",
+"Waim6GWqqX","0PktI45cIH","5IhmGl83Ud","fqypy4W0Tl","0Wr5y7ku1p","FGzgpGWqqX","pFrrlYw2oU","WmadARBhp0","PYBf4AgJHQ","5ZaEzyvOMI",
+"uQIczIBe8k","DQimpFxX9q","FwEJzru4UG","CqqaD7fKYU","lkMUAxciqp","VNCPdM3zXL","tlILtzY1GY","FLsphb29RJ","vOqCEQClRL","v2eC3e6e4z",
+"LbRTHjtn0X","48cHLMK07Y","ru4UGPOUYS","7hyVvtjQxs","5ZaEzjtn0X","t98iWJIqXi","Yw2oUF6PT2","POUYSOxWIH","9iGoTzz4ZU","okgRifaHir",
+"HlUbFSWfou","JRJQBYjB9t","kB5nPtuDyS","StlDJQworu","29QAzCdyBV","s4786M6qcG","zY1GYRkQke","FwEJzCK5W7","BpYhVMGlTF","zHF1qRBhp0",
+"BFkb8hi5X7","WDVWJzbIYY","Yw2oUuZPqg","QnJ1ScmXIX","zz4ZU45cIH","Z4I1vblLA9","JJs5mGv3Fq","WPmlxzY1GY","CqqaDRkQke","ZJTXHSWfou",
+"No0QbzmLYD","OxWIHDLhzM","OHaBziKqhr","SmGzvQClRL","G1RhS8xEKz","ogLgcP6bcg","tl72W4QMc9","lm0pD5Namm","618Dihe9IA","Yh1hFFjHXR",
+"AkKTkW3VFH","MezSWydG8U","VBjhzpvgjS","HRxd8LDk6f","jtn0XGSQwj","6q6L9gdQsS","Q6Lix5Drn0","ZJTXHaez9y","mX2GEdpe1v","hYBCKnnP8o",
+"ZzJHWfFDrJ","MGlTFTwano","L7cGcMkgy8","jzUqRcmXIX","gtCA5VIlwP","DQimpY1mC0","o8UydB3qem","cL0aEWaim6","8U2nU4dEz6","lweGyy94nw",
+"tjQxs7fKYU","ciuWzGrDg7","MaJQsix74r","2ZHdkcShY2","5IhmGqQxHP","yofH3gIYvE","5iGN5pT8wu","24ARFuTacx","ogLgcFxX9q","gdQsSPOUYS",
+"8RCUARsQUq","9GXkXn1pmO","G1RhSuAWyp","fcJOyoVQp6","cL0aEOUYuF","pT8wuiKqhr","ogLgctvdkD","7lUXZG1RhS","RmDcrMmKGJ","aez9ymz8gx",
+"4QMc9RkQke","5IhmGuN6r3","618Dih1zcH","TXQ0ZXflUq","Twanozz4ZU","o8UydfFDrJ","VNCPdAOgEe","bZLvSS2Dfu","0Wr5y9iGoT","dpe1vjeskS",
+"vOqCE8cVD3","CxVEfNOHsz","IBe8kgtCA5","euZA5W7cTs","fcwDazbIYY","QbxXche9IA","hSSvQUlU3M","8RCUAQ6hMC","ru4UGOHaBz","45cIH07n1c",
+"BbwgAP6bcg","KASQ8brhlQ","KASQ85nmWv","WPmlxpWiOs","1v5hHY1mC0","2Yz7EJXljW","ZzJHWqUJMd","MK07YZzJHW","StlDJBCxeC","hUTw7Cp3mZ",
+"KASQ8xXTI4","mX2GEDcpWB","1j5L8blLA9","EoToP580YD","nFqikZhwG1","0YAGH55rfB","ulk412ZHdk","iB08lcL0aE","4W0TlsuY4x","StlDJuAWyp",
+"CK5W7QYxC0","IRh48WPmlx","yToGW8RCUA","J2mQiZUnqt","RBhp0lH1kt","BbwgAhUTw7","1v5hHzFgtB","xXTI46AFT0","W3VFHiwzGk","hSSvQWPmlx",
+"14FLR45cIH","KASQ8580YD","GrDg7yToGW","580YD6AFT0","2DREsKr8ys","HP433qQxHP","QworuUmaEv","cL0aE7ku1p","DG4sTFcWrW","azIWp7fsYM",
+"JRJQBzqH0W","IjTwP8xEKz","lXFOBZuDtD","JJs5mn8pJ9","FVMxotAOsr","0PktIIjTwP","Mkgy8uPX7G","1j5L8QnJ1S","G1RhSn8pJ9","lkMUAnnP8o",
+"0BmCyUl4a1","1j5L8hi5X7","O3iyQpmeCd","Dz1R3OUqFM","FcWrWjiVBP","5ZaEzJkzUn","WaWsvIKxdL","618Dilj07Q","cL0aEFFDui","FwEJzlpF6W",
+"FLsph7X3uy","uQIczcL0aE","0Wr5y07n1c","5nmWvs7Mxk","WDVWJlXFOB","hi5X7SjskQ","FVMxoiwzGk","SWfouP6bcg","Yf2EcRsQUq","QWxoTStlDJ",
+"CNHmvpAhR1","ZJTXHazIWp","uPX7GHzZT8","9rlg9s93Ml","64s8NiwzGk","TwanoMm8si","dpe1v9XyT9","yEfy9m4bxU","NhXduFNYIM","9eoRcKASQ8",
+"JRJQBWaim6","NAFuwJIqXi","zz4ZUiB08l","Waim6MmsIo","s4786BGaQY","TCgPpAOgEe","NAFuwK4GS8","Cfgr3nFqik","fqypyksJby","FNYIMThjNn",
+"MK07YI7p2a","SjskQVNCPd","Ta8f6UlU3M","HlUbFs7Mxk","pv0i7lXFOB","i7WMQ8hJdt","vOqCEUlU3M","Yf2EcFxX9q","vOqCENOHsz","aDGtSpWiOs",
+"FVMxosqVrf","iB08lt98iW","FjHXRix74r","Vprf2lweGy","iKqhr16lHc","29QAzpFrrl","WreyP5IhmG","Mm8siokgRi","JRJQBFLsph","jzUqRfqypy",
+"cShY2Yh1hF","NOHszBpYhV","DQimpQ6Lix","iqv4k8xEKz","aFFssKZamH","TwanoL7cGc","piJSklweGy","bZLvSv8yFN","blLA9pmeCd","QbxXcxXTI4",
+"y94nwlm0pD","5IhmGB3qem","FFDuiO3iyQ","vOqCEQChxs","W3VFHeuZA5","RpBQmzHF1q","ECMvUe6e4z","e6e4zxReec","x3LDe4dEz6","2ZHdkRmDcr",
+"oGu6xBbwgA","Waim6UmaEv","dhSuHO3iyQ","i7WMQHlUbF","QYxC05drc6","NAFuwzFgtB","s7MxkDz1R3","dmoS745cIH","J2mQiBCxeC","OHaBzTXQ0Z",
+"GXdoHzHF1q","QnJ1SdhSuH","RmDcrNOHsz","k85AeK4GS8","v2eC3BFkb8","6q6L9yEfy9","MaJQss4786","8FmFHOHaBz","B3qemjeskS","JKWYRECMvU",
+"i7WMQmz8gx","BFkb88hJdt","BpYhVSjskQ","ix74r2ZHdk","prNT6BpYhV","RsQUqlweGy","guMb8AIYUu","WDVWJP6bcg","0Wr5yRmDcr","oGu6xQChxs",
+"YOfrYgjUTu","fLNg8bZLvS","djsrv64s8N","7X3uy7hyVv","QWxoT9rlg9","yofH3rhl0J","iB08lJIqXi","ni2v1brhlQ","HRxd85IhmG","WPmlx1v5hH",
+"8hJdtCK5W7","uZPqga00b5","lsQGocL0aE","lsQGotaOXK","yluBxiB08l","VNCPdtl72W","pvgjSuPX7G","TwanohYBCK","vkCHHv8yFN","uJScXtaOXK",
+"JJs5m2TRI7","zbIYYlweGy","9iGoTlm0pD","S2DfuzbIYY","580YD0YAGH","uQIcz7fsYM","FNYIMSbRYy","djsrv0PktI","jSjS3hYBCK","DLhzMYw2oU",
+"UmaEvjeskS","tvdkDgIYvE","pmeCdQbxXc","OUqFMRmDcr","SbRYyTXQ0Z","brhlQiqv4k","a00b5aL6AJ","lsQGoIBe8k","uN6r3bgJAz","iKqhrs7Mxk",
+"S77LHJXljW","NhXduRACuj","WmadAB3qem","45cIHs4786","HlUbFIRh48","yToGWDLhzM","tvdkDMGlTF","WmadACqqaD","OUYuFGSQwj","FcWrWy94nw",
+"5IhmGOxWIH","YOfrYUl4a1","rhl0JFwEJz","Chuy3FFDui","5Mg9rs4786","LDk6fy94nw","F6PT2ni2v1","5NammBGaQY","0Wr5yDQimp","48cHLVjCZq",
+"IRh48JJs5m","O3iyQcQOnv","CqqaDQ6Lix","aL6AJRmDcr","WreyPUl4a1","iqv4kVLTy6","Pb1paJ2mQi","OxWIHJRJQB","taOXKlm0pD","Cp3mZ4QMc9",
+"hUTw7gf8rI","W3VFHdhSuH","brhlQUlU3M","tjQxsOHaBz","qaofNZuDtD","YjB9toVQp6","K20wKtvdkD","zFgtBRzaZA","VerEAsuY4x","U3yw53otm6",
+"zbIYYlCMxy","XflUqHRxd8","EoToPCfgr3","DG4sTiKqhr","YjB9tNo0Qb","y94nwvkCHH","EdBKcEdBKc","uN6r3okgRi","Twano5IhmG","zmLYDjzUqR",
+"hi5X7t59lR","BpYhVO3iyQ","Pb1paIjTwP","GSQwjpv0i7","ksJbyh1zcH","YOfrYjzUqR","3weIFogLgc","24ARFlCMxy","NAFuwZuDtD","BbwgAgdQsS",
+"1v5hHGrDg7","oVQp6piJSk","uvf7A2ZHdk","fqypyHfyNQ","O3iyQCxVEf","hE1Qlm4bxU","qaofNbrhlQ","piJSkx3LDe","TXQ0ZU3yw5","pWiOsdQ586",
+"s4786ni2v1","uLtKsG1RhS","RkQke8xEKz","lXFOBDG4sT","MaJQsnnP8o","jtn0XQ6Lix","0MR5XRkQke","1j5L8prNT6","MezSWVLTy6","hUTw7QssNC",
+"taOXKIRh48","tl72WIn3NS","qaofN4W0Tl","nFqikKr8ys","wiHrZMmsIo","dQ586ru4UG","Zv7z0cmXIX","KZamH9y4lw","BGaQY8TxD7","WmadANo0Qb",
+"9eoRcazIWp","DLhzMJIqXi","G1RhSK4GS8","2hEEU2hEEU","Q6hMCaDGtS","AIYUuW7cTs","qUJMdCNHmv","d7vjM618Di","EdBKcYw2oU","zz4ZUXflUq",
+"6AFT0ReKEW","EOE1ocL0aE","Kr8ysMojnP","nFqikSbRYy","BpYhVgjUTu","QbxXc48cHL","8cVD37Ow5C","Pb1paHfyNQ","uQIczChuy3","CxVEf64s8N",
+"14FLRatef2","HlUbF0h1b1","tvdkD5VZjS","lCMxyLbRTH","Z4I1vaFFss","5Drn0I7p2a","VBjhzUlU3M","rKDLJQ6Lix","nnP8otaOXK","9GXkXDLhzM",
+"vOqCE7X3uy","FVMxoAgJHQ","ZzJHWokgRi","MmsIouvf7A","v1HlnJXljW","2DREsuupzk","618Di0BmCy","TCgPpmz8gx","pFrrl2ZHdk","euZA5NAFuw",
+"QworuTwano","xReecZJTXH","NOHszRBhp0","CxVEfcL0aE","6q6L9lViBv","1LB1L1LB1L","MojnPP6bcg","5Drn0hUTw7","GXdoHQnJ1S","X6PinpAhR1",
+"lpF6WiKqhr","16lHcX6Pin","KsjRKv2eC3","DQimp48cHL","7hyVvs4786","y94nwDz1R3","JRJQBG1RhS","jeskSNhXdu","pvgjSlpF6W","suY4xlsQGo",
+"t98iW14FLR","1j5L85drc6","FPfSE0YAGH","s4786CK5W7","fqypytvdkD","QssNC29QAz","9iGoTP6bcg","zz4ZUMK07Y","0h1b1EdBKc","ru4UGThjNn",
+"t59lRRACuj","RkQkeBCxeC","pmeCdoGu6x","W7cTsgIYvE","CNHmvFhtgl","yvOMIX6Pin","GSQwjn1pmO","RACujEOE1o","Yh1hF5Mg9r","5IhmGFxX9q",
+"hSSvQVprf2","16lHcVprf2","hE1Ql24ARF","oVQp6lsQGo","W3VFHYOfrY","HRxd8wiHrZ","5iGN5ix74r","WreyPXflUq","d7vjMcmXIX","ogLgcqaofN",
+"16lHcGv3Fq","I7p2aMaJQs","Oz8yZ8TxD7","K20wKSWfou","FcWrWMmsIo","OHaBzv1Hln","yvOMIVLTy6","5Mg9rRpBQm","GSQwjNcICA","D6rBynlaBy",
+"In3NS7X3uy","sqVrfNo0Qb","K20wKGrDg7","NcICARsQUq","5iGN5SbRYy","QssNCkB5nP","FNYIMYf2Ec","DQimpIRh48","JJs5mbZLvS","aez9yBpYhV",
+"bZLvSFxX9q","Ul4a1uAWyp","FVMxoxReec","bgJAzFNYIM","XflUqFcWrW","cL0aEAXpwE","yToGWcShY2","U3yw59eoRc","JkzUnYOfrY","pT8wu3otm6",
+"RACujEoToP","9iGoTfcwDa","JKWYRFjHXR","M6qcGCfgr3","MK07YYOfrY","lH1ktSjskQ","jzUqR55rfB","4W0TlLewvM","DG4sT9eoRc","Dz1R3Yh1hF",
+"xXTI4m4bxU","iqv4kSs0Zu","lweGypvgjS","VNCPdjSjS3","ydG8U9rlg9","x3LDeWDVWJ","zbIYYl83Ud","hUTw7yofH3","FcWrW5Drn0","iwzGkdQ586",
+"oGu6xuAWyp","OUqFMyofH3","FFDuitAOsr","D6rBy8hJdt","YjB9tzqH0W","vOqCEeuZA5","CK5W7FxX9q","ydG8UqQxHP","Zv7z0CIShG","atef20Kyfs",
+"uupzkblLA9","iwzGkuTacx","aFFss4QMc9","9iGoTciuWz","9rlg9JIqXi","FGzgpIjTwP","uoStwPYBf4","WMiS3zmLYD","rKDLJsx5Gl","5IhmGtjQxs",
+"0h1b1YjB9t","5IhmGGrDg7","0ao3ls4786","aDGtSzz4ZU","yluBxuLtKs","0YAGH8hJdt","vLsmSWPmlx","618Didpe1v","taOXKFhtgl","WaWsvgdQsS",
+"EdBKcY1mC0","Yf2EckZANm","uvf7A8RCUA","hYBCKO3iyQ","HRxd855rfB","WPmlxlm0pD","oVQp65VZjS","e6e4zWaWsv","aez9yEdBKc","K20wKuoStw",
+"9iGoTWaim6","Dz1R3zz4ZU","580YDdQ586","ThjNnPOUYS","0h1b1yluBx","NOHszFFDui","s93Ml24ARF","s4786TXQ0Z","WMiS324ARF","d85a9SbRYy",
+"5Namm9XyT9","cL0aEYf2Ec","7Ow5CiB08l","pT8wuuvf7A","BCxeCK20wK","1LB1LS77LH","FFDuijtn0X","fmIK1oGu6x","9XyT9S2Dfu","ECMvUzHF1q",
+"Chuy32DREs","vOqCEvOqCE","Nxx9VjeskS","dmoS7NhXdu","vOqCEiqv4k","7hyVve6e4z","lCMxy0PktI","zz4ZU5iGN5","AXpwEJKWYR","dQ5869iGoT",
+"FGzgplCMxy","fLNg8UlU3M","AIYUuQ6hMC","BGaQY9XyT9","X6PinJXljW","P6bcg5ZaEz","XflUqJKWYR","8U2nUNo0Qb","No0Qb7fsYM","CdyBV5Mg9r",
+"Waim6wDajX","MezSWvLsmS","07n1cdmoS7","lj07QMkgy8","7fKYUXyPZN","SWfouuJScX","xReecTa8f6","VBjhzOUYuF","GXdoHQWxoT","HzZT8CNHmv",
+"MezSWNOHsz","MaJQsCqqaD","k85Ae0h1b1","Q6LixpAhR1","zqH0WzY1GY","8U2nUqaofN","KsjRKcmXIX","16lHcTwano","ni2v1n1pmO","WPmlxHfyNQ",
+"aL6AJOUYuF","5iGN55VZjS","qQxHP55rfB","pFrrlQChxs","gjUTuk85Ae","9iGoTtlILt","hi5X7fmIK1","tlILtpAhR1","IRh48ECMvU","fcwDaiKqhr",
+"fcJOywiHrZ","qUJMdVNCPd","gf8rI0ao3l","QWxoTJXljW","7fKYUW3VFH","FwEJzQworu","Kr8ysdhSuH","9eoRcVjCZq","uJScXjtn0X","tl72WnFqik",
+"nnP8ociuWz","k85AezFgtB","0MR5XciuWz","HlUbFzY1GY","Oz8yZLewvM","KASQ8jiVBP","mz8gxLDk6f","M6qcGBCxeC","JKWYRRmDcr","djsrv2TRI7",
+"Nxx9VpvgjS","RzaZAh1zcH","lViBvzmLYD","1LB1LFFDui","iwzGkJXljW","i7WMQuoStw","0Wr5yd85a9","J2mQi5drc6","618DiX6Pin","o8UydRBhp0",
+"zmLYDkZANm","mz8gxfaHir","AgJHQOxWIH","5Mg9rFLsph","hYBCK0ao3l","DG4sTVprf2","MGlTFQssNC","iB08lCIShG","SWfouKASQ8","HfyNQuJScX",
+"0YAGHdhSuH","tAOsrWaim6","SWfouv2eC3","nFqikkZANm","CdyBVJXljW","VIlwPCqqaD","4dEz6GWqqX","aFFss4dEz6","lsQGokB5nP","LbRTHiKqhr",
+"yofH3VerEA","JkzUn45cIH","pv0i7rhl0J","7X3uyVNCPd","D6rByNxx9V","FNYIMMmsIo","jiVBPW3VFH","soy9tjSjS3","pmeCdxReec","jfREuiKqhr",
+"POUYSM6qcG","oQ87rYjB9t","cmXIXlsQGo","o8Uyd24ARF","8RCUA7fsYM","CNHmvgjUTu","vkCHHZJTXH","RsQUqwDajX","7Ow5CHP433","ydG8U5nmWv",
+"580YDfcJOy","FnPFBGXdoH","aez9y5iGN5","uN6r35Namm","VBjhzTwano","U3yw5UmaEv","SmGzvIKxdL","VjCZqSWfou","FFDuiEdBKc","brhlQRxrsm",
+"BCxeCMGlTF","BFkb8QWxoT","CxVEfi7WMQ","pWiOsokgRi","VLTy6dpe1v","IRh48lViBv","3otm60PktI","cmXIXv8yFN","Uvlv4ZUnqt","FxX9q48cHL",
+"cQOnv2DREs","RpBQmmz8gx","hYBCKsuY4x","VBjhzl83Ud","JJs5mSmGzv","4W0Tl0YAGH","qQxHP0PktI","nFqikzz4ZU","hi5X7Pb1pa","Kr8ysDcpWB",
+"BFkb84dEz6","lCMxyhYBCK","3weIFCIShG","Yh1hFhYBCK","x3LDeRACuj","yluBx5IhmG","b29RJzqH0W","bgJAzpFrrl","2hEEU6q6L9","StlDJVLTy6",
+"Cp3mZix74r","2TRI73otm6","ZJTXHtaOXK","Y1mC08hJdt","Pb1pajtn0X","JJs5m9rlg9","nlaByReKEW","4W0TlX6Pin","5Mg9ratef2","FGzgpgtCA5",
+"zY1GYDLhzM","e6e4ztaOXK","9y4lw7hyVv","jeskSJJs5m","n1pmOix74r","pT8wuMmsIo","0MR5XuTacx","WMiS3MmsIo","tlILt7hyVv","24ARFvOqCE",
+"7ku1pFhtgl","Chuy3nFqik","RsQUqWaim6","he9IAhUTw7","2TRI7uoStw","JRJQBjzUqR","7hyVvFLsph","NOHsztl72W","piJSk0h1b1","tl72W2DREs",
+"K20wKyEfy9","fqypyBCxeC","TCgPp5Namm","euZA5GWqqX","LbRTHtAOsr","G1RhSzHF1q","tAOsrlm0pD","Dz1R3W3VFH","VBjhzhSSvQ","Mm8si580YD",
+"VIlwPGrDg7","guMb8v8yFN","RpBQmWmadA","29QAz0BmCy","FjHXRlj07Q","2DREs14FLR","DQimp8hJdt","Dz1R3U3yw5","Pb1paRzaZA","VNCPdazIWp",
+"Q6LixAXpwE","ReKEWuZPqg","s93Ml8cVD3","y94nwReKEW","Yw2oUFxX9q","QYxC0i7WMQ","S77LHhSSvQ","Qworu2Nslm","QYxC0FxX9q","QChxsrKDLJ",
+"i7WMQPOUYS","TwanoFwEJz","OUYuFHfyNQ","0h1b1VjCZq","rz7Utgf8rI","OHaBznFqik","Ul4a1qaofN","k85AelXFOB","suY4x0h1b1","Waim6cmXIX",
+"Kr8yspFrrl","d7vjMciuWz","7fsYMRACuj","yluBxFcWrW","Yw2oUFcWrW","hSSvQG1RhS","CNHmvGrDg7","i7WMQksJby","16lHcfaHir","J2mQiHP433",
+"NcICA29QAz","v8yFNcQOnv","t59lRO3iyQ","i3pydAmdQd","oQ87ruvf7A","QClRLsx5Gl","LewvMOHaBz","gtCA5he9IA","2DREshYBCK","7X3uycQOnv",
+"jeskShSSvQ","OHaBzhSSvQ","Kr8yslsQGo","EOE1ogtCA5","tvdkDkB5nP","aFFssCK5W7","tjQxsQ6Lix","GWqqXpvgjS","lViBvOUqFM","4W0TlO3iyQ",
+"zmLYD0h1b1","zmLYDuAWyp","rKDLJLbRTH","8cVD37X3uy","7hyVvL7cGc","I7p2aiKqhr","QbxXc8U2nU","zHF1q0MR5X","bgJAzNxx9V","RpBQmCfgr3",
+"RACujM3zXL","NcICAIKxdL","pFrrldpe1v","hSSvQk85Ae","LbRTHrz7Ut","s93Ml9rlg9","24ARF6q6L9","d85a9QssNC","o8UydF6PT2","In3NSaez9y",
+"HRxd807n1c","n1pmOCp3mZ","0ao3lQworu","gdQsSiKqhr","Fhtgl7fKYU","ksJbyfLNg8","CNHmv7hyVv","0YAGHJKWYR","ydG8UUlU3M","rKDLJZhwG1",
+"NOHszCIShG","tl72WiB08l","piJSkciuWz","RACujksJby","NhXduWaWsv","y94nwVBjhz","tjQxsiqv4k","kZANmnnP8o","jS1ajWPmlx","lCMxyECMvU",
+"uPX7GpvgjS","lm0pDnFqik","xXTI4qaofN","faHirwiHrZ","Qworudjsrv","29QAzOxWIH","i7WMQyEfy9","soy9t580YD","NOHszWreyP","JJs5mtvdkD",
+"d85a9aDGtS","iwzGk1v5hH","AkKTkvkCHH","M6qcG8cVD3","ECMvUfcwDa","RkQkecL0aE","JKWYRS2Dfu","lpF6WGv3Fq","uTacxuJScX","sqVrfmz8gx",
+"7fsYMSjskQ","WMiS3BFkb8","pT8wuuQIcz","hSSvQoGu6x","JIqXibgJAz","0MR5XMaJQs","WreyPMezSW","zqH0W8xEKz","i7WMQ7Ow5C","hE1Ql7fsYM",
+"yofH3cL0aE","yEfy9lH1kt","9XyT99rlg9","ulk41iqv4k","GWqqX24ARF","uJScXfLNg8","FhtglqUJMd","iqv4ktAOsr","l83UdnnP8o","S77LHU3yw5",
+"uN6r3vLsmS","K20wKFxX9q","6q6L92hEEU","e6e4zLbRTH","QWxoTpv0i7","FLsphgdQsS","Nxx9V6q6L9","brhlQ8hJdt","kB5nPb29RJ","zY1GYsx5Gl",
+"vkCHHuLtKs","VLTy624ARF","D6rByxReec","fqypyYjB9t","3otm6fFDrJ","Yh1hFgtCA5","a00b5ThjNn","lm0pDuupzk","IRh482ZHdk","AmdQdVerEA",
+"JkzUnAkKTk","Mm8siAIYUu","8FmFHmz8gx","Cp3mZTXQ0Z","iwzGkYh1hF","yofH34dEz6","YOfrYJRJQB","s7MxkGWqqX","D6rByvOqCE","dQ586ulk41",
+"lH1kt64s8N","YOfrY48cHL","OUYuFdpe1v","ECMvUlCMxy","jiVBPY1mC0","FPfSES77LH","tl72WJRJQB","LewvMzY1GY","QWxoTuPX7G","AgJHQzbIYY",
+"yluBxqUJMd","a00b57ku1p","Z4I1v29QAz","XyPZNiB08l","lkMUA9rlg9","sx5GljfREu","lH1ktCp3mZ","AkKTkZJTXH","FjHXRjfREu","Chuy3wDajX",
+"FVMxo3weIF","G1RhSMmsIo","hSSvQSbRYy","9eoRcTXQ0Z","DcpWBCxVEf","hUTw7Gv3Fq","uoStwzbIYY","lViBvNxx9V","HlUbFVjCZq","K4GS8Mkgy8",
+"yvOMIsx5Gl","GSQwjQworu","fcJOyzmLYD","45cIHni2v1","24ARFdmoS7","Nxx9VciuWz","yvOMILewvM","gf8rINo0Qb","KASQ8JKWYR","CdyBVuoStw",
+"Y1mC0nFqik","zbIYYtjQxs","dQ586OxWIH","XflUqQ6Lix","6q6L9CIShG","sx5GltlILt","Yh1hFlpF6W","pWiOshYBCK","k85Ae7lUXZ","DcpWBM6qcG",
+"BpYhVUmaEv","zHF1qF6PT2","FjHXRciuWz","YOfrYFcWrW","8cVD324ARF","NOHszqaofN","v1HlnSs0Zu","zmLYDlH1kt","IjTwP24ARF","s7Mxkhi5X7",
+"JKWYR9GXkX","ReKEWjzUqR","guMb8uZPqg","Z4I1vCqqaD","Kr8ysXyPZN","Cfgr3FnPFB","lm0pDhi5X7","ni2v1hi5X7","jiVBPJXljW","h1zcHDz1R3",
+"Y1mC0G1RhS","NcICAJ2mQi","sqVrf0YAGH","iqv4kYw2oU","prNT6VjCZq","RmDcrcQOnv","qaofNjS1aj","Gv3FqfLNg8","VNCPdRpBQm","5NammjS1aj",
+"cL0aEFnPFB","HlUbFi3pyd","29QAzcmXIX","5ZaEzxciqp","hYBCK9rlg9","LDk6fI7p2a","No0QbuTacx","FcWrWlXFOB","Y1mC0h1zcH","kZANmAXpwE",
+"POUYSdpe1v","ZUnqtStlDJ","L7cGc7hyVv","kZANmblLA9","ZzJHWjfREu","Chuy3uAWyp","F6PT2DcpWB","64s8NZuDtD","zqH0WFwEJz","cQOnvDz1R3",
+"2ZHdkhYBCK","VIlwPZUnqt","7Ow5CRmDcr","8cVD3FPfSE","uZPqgWreyP","AgJHQ8hJdt","VjCZqXyPZN","FhtglkB5nP","TXQ0Z0ao3l","l83Ud8xEKz",
+"BbwgAlCMxy","lm0pDNo0Qb","AmdQdazIWp","fFDrJJIqXi","GSQwj0MR5X","zz4ZUOz8yZ","VLTy6Kr8ys","2TRI7uN6r3","X6Pin0PktI","zqH0WRBhp0",
+"7lUXZulk41","WaWsv64s8N","QYxC0mX2GE","OUYuFQssNC","8RCUAMezSW","CqqaDiwzGk","v1HlnVLTy6","wDajXJRJQB","aFFssru4UG","dhSuHbgJAz",
+"Nxx9VL7cGc","SbRYy2Nslm","BpYhVqaofN","rhl0J7hyVv","FNYIMpWiOs","cL0aERsQUq","J2mQiyEfy9","jzUqRcL0aE","i7WMQzbIYY","OUYuFzz4ZU",
+"JRJQBlViBv","dQ586fqypy","IKxdL0h1b1","ThjNnxReec","8U2nUt98iW","mz8gxKZamH","M3zXLrhl0J","qaofNwiHrZ","TCgPp9eoRc","HzZT8gf8rI",
+"Q6hMCgdQsS","5nmWvzFgtB","45cIHguMb8","9eoRclj07Q","CdyBVYh1hF","StlDJcQOnv","CK5W7LewvM","5Drn0pvgjS","hUTw7ECMvU","tvdkDCfgr3",
+"QYxC0PYBf4","lCMxySmGzv","hE1QlCqqaD","JJs5mVerEA","XyPZNQChxs","yluBxTwano","jfREuxReec","hSSvQWmadA","Twano0BmCy","Mkgy8Ss0Zu",
+"EOE1oFPfSE","aDGtSSs0Zu","FnPFBoVQp6","okgRiuvf7A","BpYhVhE1Ql","7X3uypiJSk","AmdQd7Ow5C","QWxoT0BmCy","RzaZAfaHir","l83UdGWqqX",
+"1j5L8OUYuF","CK5W7QssNC","5VZjS5Drn0","M3zXLL7cGc","WreyPpT8wu","NhXdulkMUA","FVMxobrhlQ","S2DfuhYBCK","OUqFM1LB1L","VBjhz0ao3l",
+"FhtglsqVrf","7fsYMpv0i7","pAhR1AIYUu","45cIHSjskQ","0PktISs0Zu","I7p2acmXIX","JRJQBdpe1v","DcpWBSs0Zu","VerEAydG8U","hYBCKgIYvE",
+"MezSW8FmFH","lCMxyHRxd8","PYBf4U3yw5","48cHLGrDg7","kB5nP8hJdt","bZLvSn1pmO","IBe8kChuy3","pAhR1jeskS","7ku1pCNHmv","J2mQiguMb8",
+"vLsmS3otm6","64s8NnnP8o","Mm8siDG4sT","m4bxUfLNg8","ThjNnVerEA","wiHrZjeskS","JIqXi0Kyfs","v1Hlnrz7Ut","1LB1LM6qcG","2TRI7v1Hln",
+"0h1b1gjUTu","iKqhrjSjS3","7ku1p7ku1p","uPX7GFVMxo","Kr8ysFcWrW","5VZjSRkQke","Q6hMCJJs5m","h1zcHjSjS3","Rxrsm5drc6","fmIK1ciuWz",
+"P6bcgtvdkD","kZANmnlaBy","ZJTXH64s8N","4QMc9No0Qb","Yf2EcJJs5m","POUYSi7WMQ","QClRLokgRi","oQ87rIn3NS","ksJbykB5nP","pmeCdyluBx",
+"NhXduQbxXc","HfyNQaL6AJ","tAOsrix74r","Yf2EctAOsr","o8UydiB08l","TXQ0Z8RCUA","iwzGkzFgtB","WmadAlkMUA","8RCUAhE1Ql","iqv4kogLgc",
+"EOE1otuDyS","XyPZNuPX7G","oQ87rCp3mZ","lH1ktQssNC","tuDySMaJQs","7X3uyjfREu","NOHsz7ku1p","FnPFBpvgjS","7lUXZv2eC3","1LB1LhYBCK",
+"vOqCEVIlwP","P6bcgzFgtB","0Wr5ynFqik","Zv7z0ru4UG","zY1GYVLTy6","ydG8UIn3NS","bgJAzhE1Ql","atef2tjQxs","cmXIXaez9y","Y1mC0QssNC",
+"brhlQs93Ml","GSQwjfcwDa","FhtgljiVBP","7X3uyCfgr3","DcpWBgtCA5","tAOsrZUnqt","Cp3mZOxWIH","Uvlv4KZamH","M3zXLWreyP","Y1mC0MojnP",
+"YOfrY0PktI","IRh488TxD7","4W0Tlfqypy","pAhR1o8Uyd","F6PT2vkCHH","WMiS3StlDJ","cL0aEMojnP","gtCA5FFDui","DG4sTIjTwP","G1RhShUTw7",
+"NAFuwaL6AJ","jtn0XwiHrZ","lViBv8U2nU","sx5Gl3otm6","QnJ1S7lUXZ","2Yz7Es4786","KsjRKuJScX","AgJHQVBjhz","JKWYRguMb8","ogLgci3pyd",
+"yofH3IKxdL","iB08l5Mg9r","BCxeC7Ow5C","aez9y0Kyfs","In3NSgf8rI","ZUnqt9eoRc","ReKEWyEfy9","ThjNnYw2oU","JXljWuTacx","dQ586tuDyS",
+"FGzgpogLgc","5nmWvLewvM","faHirpAhR1","nFqikulk41","FGzgpSjskQ","HlUbF9GXkX","Ss0ZuZJTXH","AmdQdlViBv","8RCUArhl0J","aL6AJhUTw7",
+"KASQ8B3qem","618DiJXljW","MK07Yuvf7A","MGlTFjS1aj","BbwgA07n1c","ZUnqt14FLR","yEfy90Wr5y","QnJ1SuZPqg","tvdkDMmsIo","NOHszaez9y",
+"M3zXLTa8f6","xciqpyEfy9","s93MltaOXK","MGlTFFjHXR","CIShGHP433","suY4xLewvM","iqv4kWDVWJ","m4bxU0YAGH","hYBCKyofH3","BpYhVuJScX",
+"OUqFMWDVWJ","GrDg7pv0i7","0Wr5yBbwgA","RpBQmOUYuF","I7p2aReKEW","he9IAEOE1o","XflUqrz7Ut","3otm6a00b5","8hJdtOHaBz","NcICAF6PT2",
+"Ss0ZuF6PT2","RpBQmThjNn","Ta8f60YAGH","0YAGHtAOsr","oVQp6VNCPd","FnPFBJXljW","WDVWJrKDLJ","BGaQYe6e4z","uPX7GUlU3M","taOXKWaWsv",
+"EOE1oAgJHQ","lj07QJkzUn","RACujhi5X7","aFFsshE1Ql","Dz1R3FNYIM","mz8gxQ6hMC","fFDrJlsQGo","o8UydCIShG","Vprf2iqv4k","QWxoTrz7Ut",
+"FwEJzWaim6","uN6r3IBe8k","fqypySbRYy","5iGN52DREs","ZuDtDX6Pin","Q6hMC0Kyfs","blLA9o8Uyd","t98iWfaHir","MmsIouZPqg","nlaBygIYvE",
+"uTacxMmKGJ","5IhmGTXQ0Z","iqv4kVBjhz","8RCUAKsjRK","IRh48SWfou","uTacxpT8wu","aez9ye6e4z","ulk41d85a9","uLtKs5Namm","64s8NpmeCd",
+"TwanoAXpwE","YOfrYuQIcz","pAhR1jS1aj","Waim6ThjNn","kB5nPGWqqX","gf8rI5Namm","ogLgcThjNn","ReKEW2DREs","GrDg73otm6","FjHXR7ku1p",
+"faHirNAFuw","I7p2alCMxy","9eoRcZJTXH","i3pydxXTI4","jtn0XhUTw7","1v5hHxciqp","BFkb8yEfy9","MmsIopvgjS","9XyT9jzUqR","I7p2aEOE1o",
+"1v5hH5VZjS","4dEz6BbwgA","lCMxyxXTI4","Gv3FqaDGtS","qaofNqUJMd","v1HlnTwano","BbwgAfLNg8","kB5nP9y4lw","yToGWt98iW","yToGWOHaBz",
+"dhSuHRxrsm","MK07Ysx5Gl","CIShGStlDJ","55rfBm4bxU","ksJbyCIShG","CqqaD3otm6","oQ87rQbxXc","v2eC3RkQke","PYBf4CNHmv","QbxXcprNT6",
+"uPX7GNOHsz","ZzJHW7ku1p","yToGWTCgPp","BGaQYOHaBz","QnJ1SHRxd8","VBjhz8FmFH","LewvMNAFuw","ZUnqt9y4lw","ulk41MojnP","HlUbFEoToP",
+"djsrvaFFss","SjskQFnPFB","mz8gxOz8yZ","2TRI7aL6AJ","KZamHQbxXc","7hyVvtvdkD","a00b5B3qem","MGlTFiKqhr","I7p2a580YD","YjB9t2hEEU",
+"yvOMIO3iyQ","yToGW618Di","5VZjSnFqik","hSSvQe6e4z","dhSuHv8yFN","HzZT8CK5W7","s7MxkcL0aE","DLhzMCdyBV","HlUbFzmLYD","TCgPpIjTwP",
+"7Ow5CVprf2","K20wKJKWYR","VIlwPDLhzM","aez9y64s8N","vLsmSGWqqX","QYxC0Cp3mZ","8hJdtgtCA5","h1zcHAmdQd","uoStwlweGy","8cVD3IBe8k",
+"48cHLWaim6","2Yz7EtlILt","CdyBVNAFuw","EoToPgjUTu","jtn0XlkMUA","nnP8oPYBf4","uLtKsbrhlQ","fFDrJfcwDa","YOfrYbgJAz","NhXduECMvU",
+"ZzJHWMmKGJ","55rfBIBe8k","yEfy9FcWrW","okgRidpe1v","okgRiQbxXc","nFqikCxVEf","LDk6f9eoRc","h1zcHPb1pa","fcwDajeskS","2ZHdk5Mg9r",
+"GSQwjciuWz","LDk6ft98iW","d85a9tlILt","0BmCyBFkb8","DG4sTMK07Y","dQ5865Drn0","WPmlxni2v1","uTacxLbRTH","e6e4zgf8rI","oQ87rVBjhz",
+"J2mQiAXpwE","fFDrJMK07Y","aFFssbrhlQ","8cVD3yToGW","k85AeTCgPp","uLtKsYjB9t","SjskQIBe8k","RsQUqTXQ0Z","xXTI4lViBv","GSQwj2Nslm",
+"MaJQsAkKTk","StlDJ9XyT9","Yw2oUQChxs","ReKEWReKEW","v2eC35IhmG","2Nslmi3pyd","nnP8oguMb8","oQ87rlCMxy","G1RhSJ2mQi","pv0i78RCUA",
+"zz4ZUqUJMd","i3pydpiJSk","cShY2YOfrY","ZJTXHWDVWJ","rKDLJJIqXi","DcpWBtlILt","aL6AJOHaBz","uAWypiKqhr","0ao3ly94nw","FVMxoJIqXi",
+"2hEEUMojnP","vLsmSbrhlQ","1v5hHFcWrW","guMb8pAhR1","oGu6xIKxdL","618Din8pJ9","lCMxya00b5","Waim6s7Mxk","QbxXcO3iyQ","RACujqaofN",
+"fqypyFnPFB","yluBxEOE1o","FFDuiVBjhz","i7WMQJkzUn","0YAGH16lHc","RmDcr8FmFH","bZLvSuLtKs","gIYvEaDGtS","K20wKLbRTH","1j5L80YAGH",
+"kZANmhYBCK","CK5W7guMb8","DG4sTMaJQs","Ul4a1MK07Y","2Yz7ElweGy","iqv4kIRh48","JkzUnpFrrl","0Wr5yQbxXc","cQOnvIjTwP","2hEEUKASQ8",
+"ni2v1zbIYY","4W0TlM3zXL","GrDg7QssNC","FVMxolpF6W","O3iyQzqH0W","fcwDaLewvM","8RCUAMmsIo","No0QbnFqik","RBhp0G1RhS","NAFuwSs0Zu",
+"ydG8UqaofN","14FLR0PktI","n1pmO7fsYM","JkzUnJXljW","5nmWvGWqqX","uJScX9GXkX","cL0aEsuY4x","v2eC3FGzgp","iqv4kK4GS8","lm0pDwiHrZ",
+"ydG8U0Kyfs","7hyVvC2Irc","X6PinFFDui","B3qemOUYuF","FjHXRZhwG1","uTacxLewvM","X6PinYjB9t","8RCUAWaim6","TXQ0ZRxrsm","n1pmO1j5L8",
+"7ku1pQ6hMC","7hyVvo8Uyd","qUJMdFLsph","xReecxciqp","MaJQsrz7Ut","HP433lm0pD","C2Ircmz8gx","yofH39rlg9","X6Pin8cVD3","KZamHLDk6f",
+"5VZjS8RCUA","n8pJ9aFFss","jS1ajW3VFH","FxX9qfLNg8","FVMxoqQxHP","UmaEvgtCA5","dhSuH9iGoT","FcWrWGSQwj","RACujfcJOy","nnP8oCIShG",
+"Nxx9VCfgr3","8RCUApWiOs","t98iW24ARF","2hEEUaL6AJ","F6PT2SWfou","pT8wuHRxd8","OUqFMdmoS7","Pb1paWDVWJ","POUYSBbwgA","gIYvE4dEz6",
+"nnP8oazIWp","QWxoTix74r","d7vjMkB5nP","ReKEW0MR5X","FGzgpguMb8","8xEKzIjTwP","bZLvSJKWYR","sx5GlWreyP","tvdkDHRxd8","RBhp0tAOsr",
+"fcwDaSWfou","4dEz6BpYhV","FNYIMHP433","FnPFBSWfou","fcwDaoGu6x","FnPFBYh1hF","M6qcGjfREu","0MR5X5drc6","s7MxkTwano","GXdoHeuZA5",
+"0PktIhe9IA","WreyPpWiOs","IKxdLO3iyQ","yvOMIWDVWJ","lpF6WUlU3M","5ZaEzzqH0W","i3pydLewvM","4QMc9vkCHH","x3LDeVjCZq","lkMUAWaWsv",
+"ZzJHWUvlv4","wiHrZEOE1o","VerEAyToGW","zbIYYJRJQB","LDk6fZzJHW","piJSkVprf2","mz8gxfcwDa","i7WMQvLsmS","9GXkXP6bcg","VLTy6Twano",
+"DLhzMZJTXH","xciqpy94nw","lViBvrKDLJ","tjQxsdjsrv","oGu6xQbxXc","n1pmOi7WMQ","atef22DREs","55rfBzHF1q","JJs5mK20wK","2ZHdkHfyNQ",
+"RBhp0DQimp","d85a9StlDJ","qaofNNxx9V","dpe1vnnP8o","QssNCzY1GY","TwanobgJAz","HP433SmGzv","G1RhSgdQsS","tjQxsPb1pa","pT8wue6e4z",
+"5Mg9r7Ow5C","IjTwPMm8si","NOHsz8hJdt","d85a9zmLYD","m4bxUX6Pin","2Yz7EtuDyS","24ARFogLgc","zbIYYhi5X7","0MR5X9eoRc","QssNCiKqhr",
+"atef2rKDLJ","RACujix74r","azIWpuAWyp","UmaEvLDk6f","lH1kteuZA5","hSSvQLDk6f","Cfgr38FmFH","lweGyBpYhV","zz4ZUGv3Fq","X6PinnlaBy",
+"lCMxyWaWsv","POUYSStlDJ","No0Qb55rfB","pv0i79eoRc","9eoRcVBjhz","VerEArhl0J","rhl0J2ZHdk","nFqikIjTwP","07n1clpF6W","YjB9tDcpWB",
+"a00b5W7cTs","CxVEfOHaBz","NOHszNxx9V","9rlg95VZjS","faHirblLA9","ReKEW0BmCy","DG4sTW3VFH","FVMxo0Wr5y","WPmlxix74r","lpF6WVjCZq",
+"zqH0WvkCHH","JXljWTCgPp","nlaBy8xEKz","x3LDeJKWYR","29QAzCNHmv","5drc6FNYIM","aez9yuoStw","S2DfuSWfou","29QAzjtn0X","fqypypiJSk",
+"0Wr5yzz4ZU","yofH3KASQ8","MmsIoYh1hF","Ss0ZuzqH0W","t59lROxWIH","Mm8si8U2nU","JXljWKZamH","ulk416AFT0","a00b5YOfrY","IKxdLv1Hln",
+"2hEEUjtn0X","MaJQsy94nw","uZPqgfLNg8","0KyfsvOqCE","LewvMFVMxo","G1RhSQClRL","8hJdtVNCPd","m4bxUDLhzM","fmIK155rfB","YjB9t1j5L8",
+"v8yFNDcpWB","Yw2oURsQUq","AkKTkMK07Y","Vprf2atef2","zFgtB55rfB","7fKYU8xEKz","jzUqRl83Ud","jzUqROHaBz","ReKEWvLsmS","oQ87r5nmWv",
+"ZUnqt580YD","SjskQQ6Lix","J2mQiU3yw5","YjB9tgtCA5","tvdkDtjQxs","NAFuwpmeCd","djsrvcmXIX","ZuDtD7lUXZ","ThjNn0h1b1","ZUnqtuZPqg",
+"lweGyFPfSE","FjHXRdjsrv","VLTy65Drn0","fqypyRmDcr","he9IAAmdQd","ru4UGd85a9","G1RhSGv3Fq","uupzktaOXK","ciuWzv1Hln","yEfy95Namm",
+"ogLgcVprf2","XflUqVLTy6","fLNg80Kyfs","OUYuF5iGN5","tAOsrtlILt","8U2nUFwEJz","fFDrJPb1pa","P6bcgjS1aj","m4bxUni2v1","a00b5HfyNQ",
+"UlU3Mv8yFN","pWiOsvOqCE","yvOMIQ6Lix","fmIK1a00b5","EdBKcfaHir","bZLvStlILt","sqVrfAgJHQ","F6PT2nFqik","Oz8yZ3otm6","pAhR1i7WMQ",
+"ix74rdhSuH","mz8gxqUJMd","cL0aEix74r","MaJQsciuWz","Pb1pazqH0W","lH1kt8cVD3","RpBQmYjB9t","DQimpQYxC0","dpe1vzFgtB","nlaByQnJ1S",
+"7X3uy64s8N","zbIYYxciqp","ReKEWKr8ys","uPX7GtjQxs","Nxx9VsqVrf","gdQsSLDk6f","48cHLFjHXR","0PktIQClRL","DcpWB7hyVv","lXFOBCIShG",
+"dpe1vJJs5m","fcJOycL0aE","VLTy6QssNC","djsrv7hyVv","1v5hHpv0i7","Nxx9V7hyVv","d85a9lj07Q","IRh48580YD","BCxeCRmDcr","FLsph2DREs",
+"W3VFHwiHrZ","LewvMsuY4x","jfREuyToGW","NhXdu5IhmG","W7cTsRzaZA","xXTI47lUXZ","ZhwG1Q6Lix","Yw2oUfLNg8","ThjNn2ZHdk","QworufFDrJ",
+"xciqpsuY4x","fcwDadmoS7","ZhwG1VjCZq","1LB1Lmz8gx","hYBCK7ku1p","AkKTk0BmCy","1v5hHRxrsm","suY4xuAWyp","5IhmGRsQUq","EoToPZhwG1",
+"ZJTXHaFFss","16lHchUTw7","7fKYUGrDg7","JXljWlsQGo","WreyPtl72W","Q6LixsuY4x","5VZjScL0aE","MGlTFSmGzv","BbwgAQYxC0","CNHmvulk41",
+"dpe1vThjNn","W3VFHfmIK1","55rfBqUJMd","8hJdttuDyS","MGlTFiB08l","7lUXZEdBKc","RpBQmZJTXH","W3VFHfFDrJ","jiVBPfLNg8","8TxD7n1pmO",
+"7fKYUb29RJ","7fsYMZhwG1","W7cTsgdQsS","16lHcn1pmO","o8UydJRJQB","ReKEWRBhp0","C2IrckB5nP","i3pyda00b5","CIShGqQxHP","Fhtgln8pJ9",
+"vkCHHdjsrv","tlILtzHF1q","lH1ktKZamH","JRJQBb29RJ","FLsph7fsYM","VjCZqU3yw5","lpF6W8cVD3","RzaZAQworu","QYxC08U2nU","7fsYMO3iyQ",
+"vOqCENAFuw","SjskQgf8rI","IKxdLSmGzv","FFDuifqypy","qaofNjiVBP","9XyT95nmWv","RACujXyPZN","5iGN5NhXdu","HP433hSSvQ","lH1ktrKDLJ",
+"iKqhrB3qem","blLA9zz4ZU","blLA9oGu6x","ksJbyuLtKs","7ku1pjSjS3","jfREuHP433","VjCZqS2Dfu","7fKYU3weIF","WDVWJjzUqR","fqypy7fKYU",
+"2NslmSs0Zu","ni2v1lViBv","WDVWJX6Pin","aL6AJDQimp","nlaBy0MR5X","StlDJ7Ow5C","iwzGkFxX9q","RkQkelkMUA","FwEJzUlU3M","OUYuFFFDui",
+"s4786O3iyQ","FxX9qLDk6f","gf8rIi7WMQ","uAWypcShY2","oQ87rQ6hMC","JKWYRHRxd8","pFrrlHzZT8","pvgjSqUJMd","ksJby8RCUA","zHF1qQssNC",
+"J2mQiRzaZA","zY1GY14FLR","QssNCru4UG","S2Dfu2TRI7","C2Irc8TxD7","VerEAtuDyS","5Namma00b5","ksJbyjtn0X","vLsmSnlaBy","t59lR7fsYM",
+"bZLvS0Kyfs","Cfgr32DREs","UlU3MWaWsv","9GXkXuN6r3","Ss0Zuuupzk","UlU3MB3qem","tjQxshUTw7","VIlwP9iGoT","tuDyScQOnv","aDGtSpvgjS",
+"lkMUA7lUXZ","pvgjSFFDui","SjskQIjTwP","AXpwE45cIH","PYBf4Chuy3","QnJ1SI7p2a","55rfBnFqik","Mm8sibrhlQ","uAWypJJs5m","he9IArz7Ut",
+"YjB9tWDVWJ","djsrvn8pJ9","SjskQzbIYY","AIYUutjQxs","S2Dfuh1zcH","5Drn0brhlQ","e6e4zStlDJ","HRxd8F6PT2","HfyNQ6AFT0","U3yw5brhlQ",
+"uTacxJRJQB","EOE1oW3VFH","yToGWMkgy8","FNYIMsx5Gl","Pb1paJJs5m","BbwgAzY1GY","o8UydJIqXi","faHirCxVEf","cmXIXThjNn","WDVWJQChxs",
+"gtCA5uvf7A","0MR5XDQimp","lH1ktlCMxy","k85AekZANm","7hyVv5Drn0","XyPZNSjskQ","SjskQQClRL","QworunFqik","oQ87rXflUq","NOHszRpBQm",
+"okgRiBGaQY","uLtKszz4ZU","jiVBPKr8ys","tjQxszqH0W","P6bcg0ao3l","CqqaD0MR5X","dhSuHokgRi","prNT6uupzk","VerEAlXFOB","fFDrJEdBKc",
+"2DREsW7cTs","WPmlxo8Uyd","VerEAGXdoH","vOqCE9iGoT","uZPqgWPmlx","cShY2atef2","suY4xNOHsz","iB08lRBhp0","JJs5mKZamH","F6PT2VIlwP",
+"pmeCdnlaBy","GrDg7BpYhV","tjQxs8xEKz","WDVWJKr8ys","AkKTkK4GS8","BCxeCWaim6","brhlQrz7Ut","8U2nUTXQ0Z","G1RhSeuZA5","jSjS3FcWrW",
+"zqH0W2Yz7E","hYBCK45cIH","Gv3FqFnPFB","KZamHOHaBz","HRxd8pFrrl","fmIK1Kr8ys","FjHXR9eoRc","0BmCydjsrv","DG4sThi5X7","JKWYRJJs5m",
+"55rfBfcwDa","Gv3FqGWqqX","tlILtnFqik","ZhwG1CK5W7","iwzGkni2v1","AIYUuIRh48","v1Hlnjtn0X","lm0pDB3qem","oGu6x24ARF","8hJdts93Ml",
+"yToGWuTacx","JJs5mWmadA","uAWypMaJQs","7ku1pBpYhV","Q6hMCNcICA","Z4I1vCK5W7","atef25VZjS","JXljW5drc6","SWfouDz1R3","lH1ktyluBx",
+"YOfrY0YAGH","fcwDaFwEJz","MaJQs7ku1p","24ARFb29RJ","VerEARsQUq","lpF6WLewvM","580YDWreyP","uLtKsjiVBP","gtCA507n1c","nnP8ovLsmS",
+"U3yw57ku1p","Gv3FqNxx9V","0Wr5yCIShG","aFFssJIqXi","U3yw5VBjhz","ciuWzy94nw","ulk41rz7Ut","YjB9togLgc","OUYuFXflUq","QChxsWaim6",
+"No0Qbe6e4z","EoToPFPfSE","djsrvRsQUq","mz8gxWDVWJ","tvdkDCNHmv","VNCPdGv3Fq","J2mQi5VZjS","tlILtHP433","2ZHdk0MR5X","atef2No0Qb",
+"ThjNnFjHXR","F6PT2iwzGk","29QAzW7cTs","Yw2oU5ZaEz","uupzk7Ow5C","QWxoTYw2oU","NcICAt98iW","cQOnvyluBx","Q6LixMGlTF","TXQ0ZfcwDa",
+"IBe8kWDVWJ","NOHszJ2mQi","SbRYyru4UG","14FLRO3iyQ","1LB1Lxciqp","1j5L8wDajX","lpF6WWreyP","qQxHPMK07Y","jS1ajqQxHP","zz4ZUfFDrJ",
+"gdQsS618Di","uLtKsU3yw5","s93MlpmeCd","JXljWazIWp","W7cTszqH0W","NhXduNxx9V","JXljW5iGN5","AkKTkUvlv4","CK5W7gjUTu","L7cGct59lR",
+"KsjRKlH1kt","zqH0WNo0Qb","XyPZNxXTI4","FVMxo8FmFH","MGlTFcL0aE","hi5X77fKYU","lm0pDzbIYY","8TxD73weIF","RzaZAFcWrW","1LB1LD6rBy",
+"Yf2Ecdjsrv","CIShGlpF6W","iB08lVprf2","POUYSAIYUu","EdBKcEOE1o","pAhR1FPfSE","cL0aEdjsrv","IBe8kFnPFB","L7cGc16lHc","Uvlv4Cfgr3",
+"ZUnqtPYBf4","faHirWDVWJ","5drc6LbRTH","AkKTkRxrsm","dQ586HzZT8","D6rBytAOsr","uTacxi7WMQ","faHirMm8si","JRJQBKsjRK","9y4lwv8yFN",
+"7fsYMZuDtD","faHirGXdoH","k85AeNxx9V","uAWypRpBQm","5Drn0o8Uyd","Yw2oUIn3NS","CdyBVcL0aE","kZANmlCMxy","9rlg9vLsmS","rhl0JBpYhV",
+"J2mQizQt6Q","TCgPp3weIF","nlaByPb1pa","MmKGJ2hEEU","YOfrYTXQ0Z","okgRitAOsr","YOfrYEoToP","5ZaEzD6rBy","AOgEe0MR5X","CxVEfNxx9V",
+"0KyfsJRJQB","lj07QJKWYR","DQimp7ku1p","U3yw5BFkb8","uAWyp24ARF","GXdoHCK5W7","QworulXFOB","uTacxgIYvE","2TRI7iqv4k","JJs5mWaWsv",
+"Yf2EcuLtKs","dmoS7JJs5m","0MR5XChuy3","XyPZNRzaZA","uZPqgcQOnv","ZUnqtQYxC0","Q6hMCWDVWJ","L7cGczFgtB","faHircQOnv","SjskQfaHir",
+"WreyPuoStw","W7cTsfFDrJ","0BmCy64s8N","PYBf4uTacx","0MR5XAXpwE","fcwDaKASQ8","suY4x5nmWv","JkzUn5ZaEz","JkzUnKsjRK","ni2v1580YD",
+"tlILtuLtKs","gf8rIuAWyp","uN6r33otm6","tlILt1j5L8","LbRTHeuZA5","nFqikjtn0X","EOE1ozY1GY","WreyPYf2Ec","kB5nPGrDg7","tl72WOxWIH",
+"0KyfsGv3Fq","5Drn0IKxdL","tAOsrjiVBP","FPfSECIShG","uTacxhi5X7","faHirYOfrY","LbRTHdpe1v","OHaBzrz7Ut","No0QbyEfy9","DG4sThe9IA",
+"W3VFHtaOXK","9iGoThE1Ql","gdQsSHP433","J2mQifFDrJ","FGzgpe6e4z","NAFuwe6e4z","QYxC0djsrv","9iGoTC2Irc","Y1mC0b29RJ","CK5W7WDVWJ",
+"h1zcHbZLvS","hSSvQMK07Y","hE1QlKZamH","tAOsrQWxoT","AgJHQCK5W7","uPX7GF6PT2","QbxXcS77LH","LewvMmX2GE","Z4I1vhSSvQ","aL6AJgdQsS",
+"oQ87ra00b5","7lUXZni2v1","YOfrYNOHsz","qUJMdJXljW","brhlQOz8yZ","pv0i7dQ586","0h1b1tl72W","0Wr5yFcWrW","lm0pDEoToP","AkKTkv8yFN",
+"RkQkeOHaBz","5ZaEzRBhp0","m4bxUNAFuw","VNCPdMmsIo","JRJQBzFgtB","WreyP4dEz6","VIlwPFhtgl","CIShGfFDrJ","FPfSEqUJMd","48cHLPb1pa",
+"suY4x9GXkX","ECMvUWaim6","VBjhzmz8gx","jtn0XChuy3","0Wr5yQClRL","FVMxotaOXK","6q6L9VLTy6","uvf7Ahe9IA","zmLYDNxx9V","hSSvQHzZT8",
+"HfyNQMm8si","2ZHdkDz1R3","7fsYMWDVWJ","tAOsrpT8wu","o8UydJKWYR","FcWrWJ2mQi","tl72WRsQUq","lViBvMmKGJ","8hJdt0BmCy","8U2nUX6Pin",
+"zbIYYTCgPp","B3qemY1mC0","HzZT8G1RhS","VIlwP8cVD3","5NammpFrrl","QChxsWaWsv","ZzJHWWmadA","5Mg9rciuWz","ZJTXHd7vjM","aFFssjfREu",
+"LDk6f8xEKz","5Drn0pWiOs","7lUXZMmsIo","v1HlnSjskQ","RkQkeprNT6","Cp3mZwiHrZ","hUTw7RzaZA","Ul4a10MR5X","O3iyQOz8yZ","gjUTuLewvM",
+"s93MlOUYuF","lsQGoWaim6","tl72WguMb8","QssNCnFqik","WreyPsx5Gl","ECMvU4W0Tl","DQimpIKxdL","B3qembgJAz","zHF1qydG8U","WMiS3gtCA5",
+"QnJ1SjeskS","cL0aEVLTy6","lCMxyG1RhS","GrDg7NcICA","NcICAEoToP","zz4ZUuAWyp","rKDLJO3iyQ","7Ow5Cpv0i7","xReeccmXIX","gtCA5L7cGc",
+"Oz8yZ0ao3l","vkCHHtlILt","9eoRciB08l","lH1kt45cIH","a00b57X3uy","qaofNUmaEv","0ao3luAWyp","LbRTHzFgtB","Gv3FqydG8U","ZJTXHpv0i7",
+"OUqFM8TxD7","TwanoBCxeC","uAWypzFgtB","QClRLyofH3","7hyVvn1pmO","kB5nPyToGW","24ARFzmLYD","y94nwoVQp6","QssNCtuDyS","aez9yRBhp0",
+"uAWyp0h1b1","jSjS3ZuDtD","QWxoT8U2nU","hE1Ql2DREs","WMiS3zqH0W","hi5X7jiVBP","AIYUuChuy3","zY1GYOHaBz","aDGtSVjCZq","gdQsSVerEA",
+"Yh1hFhE1Ql","XyPZNWPmlx","W7cTsprNT6","RxrsmX6Pin","pFrrlUmaEv","HfyNQ9XyT9","X6PinGrDg7","v2eC3oQ87r","DLhzMogLgc","uoStwWaim6",
+"uAWypi3pyd","9rlg9DLhzM","29QAz5VZjS","AkKTkrhl0J","okgRiVBjhz","16lHcDcpWB","S2Dfum4bxU","jzUqRGv3Fq","i7WMQ9XyT9","WDVWJLewvM",
+"5drc6k85Ae","Uvlv4vkCHH","B3qemUmaEv","FwEJz7ku1p","RmDcrhE1Ql","kZANmv2eC3","MojnP0PktI","2hEEUuPX7G","aFFssoQ87r","StlDJMaJQs",
+"9rlg9zqH0W","iB08lru4UG","9iGoTI7p2a","n8pJ9cQOnv","JIqXiIjTwP","6q6L9VBjhz","0h1b1m4bxU","HlUbFaL6AJ","0YAGHCNHmv","nFqikMkgy8",
+"Y1mC0zY1GY","QnJ1S7Ow5C","yvOMI29QAz","bgJAzRACuj","pvgjSy94nw","rKDLJQ6hMC","0h1b1MojnP","5ZaEzHfyNQ","4dEz6Y1mC0","v8yFN9GXkX",
+"DcpWBbrhlQ","HfyNQazIWp","LewvMtvdkD","he9IAS2Dfu","suY4xFwEJz","ThjNnpv0i7","sqVrfVNCPd","StlDJEoToP","lViBvfFDrJ","6AFT0RkQke",
+"0MR5X1LB1L","pvgjSMK07Y","O3iyQAkKTk","aDGtSgjUTu","WPmlxguMb8","yToGWiwzGk","D6rByCp3mZ","v8yFNkB5nP","Rxrsm2DREs","uvf7ATCgPp",
+"b29RJFLsph","HlUbFuTacx","s7MxknlaBy","i7WMQZv7z0","S2Dfu7ku1p","2hEEUbgJAz","0PktIFPfSE","WmadAQClRL","y94nwCdyBV","n8pJ94W0Tl",
+"GXdoH8FmFH","Q6hMCe6e4z","lXFOBd85a9","TCgPpGXdoH","RzaZA8hJdt","OUYuFs93Ml","O3iyQnlaBy","nFqik5iGN5","uAWypkZANm","FLsphS2Dfu",
+"h1zcHwDajX","BbwgA4dEz6","hE1QlIBe8k","uupzk8RCUA","BbwgAJkzUn","Z4I1v8U2nU","bgJAzrz7Ut","fcJOyhYBCK","atef2vOqCE","hSSvQnnP8o",
+"POUYSl83Ud","OxWIHFcWrW","RkQkeP6bcg","8cVD3FnPFB","xciqpUvlv4","iB08lv1Hln","16lHc7fKYU","y94nw07n1c","pv0i716lHc","LDk6fKZamH",
+"mX2GEbrhlQ","29QAzG1RhS","8hJdt0YAGH","SjskQ2Nslm","JJs5muAWyp","NhXduHfyNQ","7ku1p9y4lw","LDk6fZhwG1","Ta8f66AFT0","Mm8siogLgc",
+"7Ow5CFcWrW","MezSWRACuj","K20wK5ZaEz","yluBxHzZT8","GSQwjyToGW","RpBQm2Nslm","Ta8f6WPmlx","QChxsfaHir","QnJ1ShUTw7","55rfB14FLR",
+"RACujydG8U","QworuRACuj","hi5X7MmsIo","lj07QcQOnv","UlU3MWmadA","HP433Rxrsm","G1RhSzz4ZU","7Ow5CLbRTH","NOHsz5Mg9r","kB5nPsx5Gl",
+"LewvMqUJMd","ru4UGs4786","1j5L8zHF1q","o8Uyd3otm6","ZzJHWJRJQB","XflUqStlDJ","dmoS77hyVv","ix74rlViBv","xciqpJRJQB","NOHszYf2Ec",
+"pT8wu7fKYU","iqv4ka00b5","8U2nUG1RhS","8hJdtYOfrY","pmeCdQYxC0","LbRTHWmadA","jzUqRrKDLJ","SbRYyFFDui","BpYhVECMvU","Yf2EcDLhzM",
+"5ZaEz6q6L9","K4GS8FGzgp","M6qcGru4UG","uoStwUvlv4","oGu6xMojnP","BCxeCXyPZN","uJScXlweGy","OUqFMQWxoT","VjCZqfaHir","9eoRcpv0i7",
+"QbxXcdhSuH","RACujThjNn","qaofNCdyBV","CK5W7MaJQs","gf8rIlkMUA","7lUXZECMvU","soy9tAgJHQ","Vprf2SbRYy","atef2FFDui","AIYUurKDLJ",
+"EOE1onFqik","IjTwP5iGN5","hUTw7NAFuw","d7vjMMmsIo","yvOMIkB5nP","bgJAzEdBKc","ogLgc2DREs","pmeCdK4GS8","YOfrY5Namm","lH1ktdpe1v",
+"zbIYYU3yw5","euZA5aez9y","dmoS7HfyNQ","MaJQsM6qcG","KZamHd7vjM","djsrvsoy9t","MK07YAXpwE","OxWIHRACuj","xciqpZ4I1v","SWfou5ZaEz",
+"GWqqXpAhR1","Ul4a1GXdoH","gf8rIuupzk","8cVD3LewvM","GrDg7EoToP","8xEKzfmIK1","07n1csx5Gl","8hJdt3otm6","8U2nUJ2mQi","GrDg7K20wK",
+"SjskQv1Hln","lCMxymX2GE","BCxeCtaOXK","Rxrsm0Wr5y","ZzJHWtuDyS","Dz1R3Y1mC0","ulk41Nxx9V","dmoS7JRJQB","pWiOsy94nw","lweGyUvlv4",
+"QnJ1SIn3NS","ReKEWXyPZN","ReKEWd7vjM","6AFT0DQimp","lj07QlXFOB","prNT6F6PT2","9eoRcYw2oU","618DiS77LH","AmdQdjeskS","jfREut98iW",
+"OUYuFYf2Ec","MezSWKr8ys","oQ87r45cIH","K4GS8ksJby","SbRYylCMxy","GXdoHIRh48","oQ87rBGaQY","0MR5XNOHsz","F6PT24W0Tl","ru4UGZUnqt",
+"Nxx9VuLtKs","OHaBzvkCHH","U3yw5HzZT8","UlU3MciuWz","gIYvEFxX9q","DQimpyluBx","ZhwG1G1RhS","0KyfsQworu","DcpWBKZamH","zQt6QBCxeC",
+"FnPFBC2Irc","YOfrYGSQwj","xciqphUTw7","gdQsSP6bcg","YOfrYydG8U","sqVrfn1pmO","gtCA5rhl0J","S2DfuuZPqg","6q6L9ru4UG","UmaEv0MR5X",
+"BpYhVG1RhS","dpe1vgIYvE","tAOsrMmsIo","7ku1pYf2Ec","s93MliwzGk","5Drn0AgJHQ","FnPFB8U2nU","0h1b1oGu6x","lH1ktksJby","n1pmOQYxC0",
+"HlUbFQbxXc","9rlg9HzZT8","8TxD7iKqhr","ciuWz1LB1L","ZuDtDZJTXH","In3NSLbRTH","SmGzvAXpwE","6q6L9pFrrl","4dEz6uZPqg","FGzgp3weIF",
+"Waim6HlUbF","dpe1vCNHmv","Z4I1vdhSuH","ciuWzHzZT8","XyPZNjzUqR","n8pJ9ciuWz","RxrsmuPX7G","JXljWsuY4x","1LB1LKsjRK","9rlg9QChxs",
+"mX2GEOHaBz","JkzUnMGlTF","bZLvSbZLvS","e6e4zfcwDa","QbxXcW3VFH","jS1ajZJTXH","o8UydHlUbF","KZamHpFrrl","7lUXZRmDcr","s4786atef2",
+"xReecqQxHP","fmIK12Nslm","i3pydjzUqR","gdQsS0Kyfs","No0Qbb29RJ","oGu6xSWfou","TwanoprNT6","okgRiPYBf4","uZPqggf8rI","guMb8d85a9",
+"2hEEUOxWIH","bZLvSlpF6W","aez9yFhtgl","uTacx5IhmG","dpe1v8FmFH","v8yFNUmaEv","fmIK1JJs5m","Zv7z0jzUqR","vOqCEy94nw","gdQsSvkCHH",
+"a00b52TRI7","lj07QuQIcz","QbxXc580YD","faHirRkQke","EOE1o5VZjS","Pb1pahSSvQ","9y4lw64s8N","Q6hMCcQOnv","618DihUTw7","9y4lw2ZHdk",
+"FjHXRRzaZA","ZuDtDQworu","KZamH7ku1p","i3pydhE1Ql","SjskQEOE1o","BbwgAMm8si","gjUTuhSSvQ","ZJTXHFxX9q","Q6LixPb1pa","WaWsvW7cTs",
+"FcWrWAIYUu","blLA9MmKGJ","POUYSRkQke","07n1cSmGzv","9XyT97fKYU","POUYStaOXK","1j5L8QClRL","v1Hlns4786","aFFssYOfrY","WreyPsuY4x",
+"RsQUq0MR5X","GrDg7okgRi","tjQxsLbRTH","soy9tSjskQ","FNYIMOUqFM","7Ow5CO3iyQ","h1zcHlsQGo","W7cTszFgtB","Gv3FqwiHrZ","VNCPds93Ml",
+"s7Mxk7ku1p","GXdoHC2Irc","2DREsfmIK1","JIqXiFwEJz","jzUqR5Mg9r","fcwDaWreyP","L7cGc0h1b1","iwzGkzz4ZU","16lHcKsjRK","qUJMdqUJMd",
+"CK5W7yvOMI","2NslmsuY4x","TXQ0ZpiJSk","BpYhVuTacx","bZLvSZJTXH","lpF6WVIlwP","lweGyuTacx","ZuDtD0Wr5y","TXQ0Z9y4lw","5Mg9rYOfrY",
+"l83UdtvdkD","KZamHVNCPd","s4786MGlTF","pvgjSPOUYS","9iGoTaez9y","45cIHgdQsS","RzaZAazIWp","vkCHHhi5X7","7hyVv9y4lw","ksJbyZJTXH",
+"Yf2Ec1LB1L","WreyPnlaBy","Yh1hFYf2Ec","djsrviB08l","2Yz7EM3zXL","azIWpBFkb8","Fhtgl2ZHdk","m4bxUQssNC","pv0i7HlUbF","5Mg9rVIlwP",
+"qaofNJXljW","x3LDerz7Ut","WmadAHlUbF","uvf7ACK5W7","DLhzMHRxd8","bgJAzLDk6f","5NammTwano","8cVD3HlUbF","pAhR1VNCPd","uJScX1j5L8",
+"cShY2xciqp","2NslmJ2mQi","9XyT90BmCy","5Mg9r0MR5X","5drc6WaWsv","suY4xqUJMd","Mm8sirz7Ut","BbwgARsQUq","fmIK1HzZT8","VBjhzpv0i7",
+"JXljWIn3NS","dhSuHatef2","ReKEWDLhzM","MojnPRxrsm","9XyT9JJs5m","C2IrcLDk6f","atef2W3VFH","JRJQBFcWrW","uupzkFPfSE","9GXkXCp3mZ",
+"QChxsI7p2a","dQ5862DREs","4QMc9M3zXL","J2mQiHlUbF","yvOMIHlUbF","5nmWvVprf2","qaofNfaHir","MmsIocShY2","nlaByKASQ8","Zv7z0J2mQi",
+"hE1Ql8hJdt","7Ow5C8cVD3","JKWYR5ZaEz","yToGWFVMxo","s93MlZhwG1","VIlwPiKqhr","d7vjMrKDLJ","s93MlBbwgA","piJSkdQ586","55rfBZhwG1",
+"ulk41gjUTu","QClRLFhtgl","TXQ0Z2Yz7E","0MR5XMGlTF","Y1mC0hE1Ql","vLsmSIRh48","aL6AJiwzGk","jtn0XvLsmS","tl72W1v5hH","dhSuHNcICA",
+"OUYuFCNHmv","Y1mC0qaofN","4dEz6S2Dfu","hE1QlP6bcg","45cIHaDGtS","MmKGJMK07Y","mz8gxAkKTk","Y1mC0xciqp","4dEz6AOgEe","CqqaDECMvU",
+"45cIHZuDtD","Fhtgl5IhmG","suY4xJIqXi","piJSkyToGW","0PktIKASQ8","CIShGWreyP","TCgPp0ao3l","fFDrJF6PT2","RBhp0FPfSE","S77LHs4786",
+"lj07QMojnP","8hJdtEdBKc","QYxC0JJs5m","VNCPdCNHmv","HzZT8DLhzM","ECMvUtlILt","5ZaEzxReec","QssNCtjQxs","hYBCKzQt6Q","DcpWBWPmlx",
+"lH1kt5ZaEz","b29RJhUTw7","sx5Gl2Nslm","BbwgAqaofN","0BmCyReKEW","tvdkDmX2GE","FxX9qVLTy6","DcpWB4dEz6","FxX9qFcWrW","8FmFHbZLvS",
+"JRJQBQssNC","oVQp6HlUbF","4W0Tl16lHc","5drc6zHF1q","TwanozbIYY","3weIFfcJOy","Qworu2DREs","wDajXMkgy8","WPmlxHzZT8","AgJHQDcpWB",
+"DLhzMo8Uyd","C2Irc5VZjS","5IhmGCxVEf","5drc6SbRYy","7hyVvVprf2","ZzJHWqaofN","tl72Wm4bxU","29QAzVjCZq","2TRI7pmeCd","guMb8FVMxo",
+"8xEKzSWfou","zmLYDMK07Y","PYBf4dpe1v","zmLYDSmGzv","Vprf2e6e4z","MmKGJtaOXK","he9IANOHsz","VNCPdqaofN","GWqqXSmGzv","RkQkeFFDui",
+"xReecHfyNQ","Yh1hFHP433","uoStwEoToP","a00b5mz8gx","J2mQiMmsIo","JIqXifmIK1","BGaQYlCMxy","9y4lwK20wK","CIShG8RCUA","yToGW16lHc",
+"azIWpOxWIH","8TxD7618Di","fLNg8lCMxy","Gv3FqSjskQ","uupzktuDyS","ru4UGAmdQd","OxWIH6AFT0","HRxd8No0Qb","7hyVvlViBv","OUqFMVerEA",
+"RpBQm4W0Tl","tvdkDW3VFH","ZuDtDAOgEe","TXQ0ZBFkb8","wiHrZ8xEKz","5NammyluBx","NcICAMm8si","ThjNnJ2mQi","CK5W7t98iW","2hEEUiB08l",
+"AXpwE4QMc9","pv0i7iqv4k","JJs5mYjB9t","fmIK1KZamH","K4GS8k85Ae","cL0aEF6PT2","vLsmSRkQke","MezSW2ZHdk","RmDcrgtCA5","CK5W79eoRc",
+"BpYhVmX2GE","HlUbFcShY2","atef20Wr5y","cmXIXuAWyp","yofH3XflUq","KsjRK5iGN5","5ZaEzjfREu","RkQkeHlUbF","WMiS3Mm8si","UlU3Mh1zcH",
+"QYxC0v1Hln","FxX9qM6qcG","8hJdtjeskS","5NammTa8f6","FjHXRNOHsz","5Mg9rBbwgA","TwanosuY4x","ThjNnni2v1","ZhwG1gf8rI","iKqhrydG8U",
+"m4bxUHP433","ZuDtDlweGy","zmLYDlweGy","580YD24ARF","NcICAcL0aE","RACujogLgc","7fKYUzz4ZU","0MR5XuQIcz","ksJbyI7p2a","pv0i7FNYIM",
+"24ARFciuWz","ThjNnC2Irc","piJSkn1pmO","uN6r37lUXZ","EOE1oFGzgp","Kr8ysgf8rI","oGu6xLewvM","v2eC35VZjS","lweGyDG4sT","7ku1pIn3NS",
+"MK07Ysoy9t","G1RhSatef2","nlaByoVQp6","Nxx9VQChxs","HlUbFyvOMI","9XyT9uZPqg","zz4ZUzqH0W","tl72WpFrrl","ThjNnh1zcH","FLsphdQ586",
+"hYBCKTCgPp","ru4UGSWfou","CdyBVAkKTk","7fsYMk85Ae","OxWIHv1Hln","7lUXZSWfou","ECMvUQChxs","ru4UGJJs5m","Y1mC0gtCA5","NAFuwD6rBy",
+"aFFssksJby","2DREsEOE1o","VjCZqy94nw","Mm8siix74r","Kr8ysfLNg8","rKDLJC2Irc","fqypyQ6hMC","W7cTsAXpwE","Oz8yZuLtKs","IjTwPBFkb8",
+"UmaEvix74r","0Wr5ymz8gx","cShY2X6Pin","uTacxIn3NS","7ku1p55rfB","VLTy60PktI","K20wKXyPZN","8cVD3hE1Ql","M3zXLa00b5","pFrrlKASQ8",
+"No0QbVprf2","uLtKs7ku1p","tlILt2TRI7","hi5X7mz8gx","yEfy9SWfou","uoStw48cHL","4W0Tl5nmWv","16lHc0YAGH","9rlg9vkCHH","ni2v1NcICA",
+"8FmFHQnJ1S","0Wr5yRsQUq","CIShGyofH3","8hJdtVIlwP","gf8rI4W0Tl","S77LHQ6hMC","DQimpZzJHW","FPfSE9GXkX","FxX9qJRJQB","BFkb80MR5X",
+"pmeCdBbwgA","9GXkXFLsph","qaofN0BmCy","jeskSCK5W7","IjTwPW3VFH","0h1b1VIlwP","tlILtGv3Fq","wiHrZCp3mZ","lH1ktPb1pa","ogLgcVNCPd",
+"NcICACNHmv","okgRiuZPqg","hYBCKpAhR1","7fsYMJIqXi","Yh1hF580YD","7fsYMgf8rI","2DREsdQ586","MmsIoEOE1o","B3qem2DREs","07n1cEdBKc",
+"i3pydMmKGJ","7fKYU9iGoT","NAFuwtl72W","XyPZNi7WMQ","xXTI4s7Mxk","Zv7z0t59lR","MaJQsOHaBz","YOfrY0Wr5y","ulk41DQimp","Q6Lix2hEEU",
+"WMiS3sx5Gl","FjHXRMGlTF","hUTw7zmLYD","sx5Gl0h1b1","OxWIHaDGtS","tjQxsi7WMQ","hYBCKAgJHQ","azIWp7X3uy","580YDYjB9t","M3zXLMGlTF",
+"5ZaEzix74r","StlDJv1Hln","fFDrJTCgPp","uQIczMaJQs","IRh48L7cGc","48cHLBFkb8","v2eC3RsQUq","JRJQBv8yFN","AmdQdIBe8k","djsrvWPmlx",
+"yvOMIrKDLJ","G1RhScQOnv","RACujhSSvQ","yluBxYOfrY","taOXKThjNn","rhl0JaFFss","618DiFxX9q","Ss0ZuStlDJ","CK5W7GXdoH","5drc6yluBx",
+"zFgtBIn3NS","JKWYRuLtKs","VLTy6UlU3M","CNHmvuupzk","QbxXcvOqCE","fqypyYOfrY","0MR5X2ZHdk","JkzUnQ6hMC","a00b5O3iyQ","CxVEf7ku1p",
+"okgRiTXQ0Z","GXdoHQ6hMC","FPfSENOHsz","Kr8yslCMxy","5ZaEzcShY2","8TxD7FcWrW","RxrsmQssNC","S2Dfu5drc6","t98iWfcwDa","FhtglJXljW",
+"P6bcgZuDtD","JIqXiJXljW","fcJOyJXljW","nlaBy3otm6","8TxD7suY4x","DcpWBydG8U","WaWsvb29RJ","OHaBzJJs5m","fFDrJfFDrJ","zQt6Q9rlg9",
+"ni2v1aez9y","RBhp029QAz","NcICARBhp0","Z4I1vuAWyp","SmGzvuN6r3","FcWrWd85a9","Cfgr3taOXK","QClRLa00b5","jzUqRIRh48","8cVD3MezSW",
+"n1pmOb29RJ","580YDFwEJz","jS1ajAgJHQ","2Nslm9rlg9","fcJOyzbIYY","yluBx9eoRc","8U2nUzFgtB","VBjhzMezSW","rKDLJIn3NS","guMb8oGu6x",
+"CIShGYOfrY","zQt6Qhe9IA","MojnPn8pJ9","fcwDaFxX9q","lViBvBbwgA","MmKGJyvOMI","blLA94W0Tl","NOHszpv0i7","0Wr5yX6Pin","h1zcHtl72W",
+"rz7UtfaHir","bZLvStAOsr","suY4x8cVD3","Q6hMClXFOB","atef2Ul4a1","tAOsrsqVrf","v2eC35Namm","7hyVvxXTI4","2DREsru4UG","VBjhz29QAz",
+"5Drn0BCxeC","xReec8hJdt","yofH3xReec","y94nwqUJMd","mX2GEFnPFB","WPmlxv8yFN","zQt6QrKDLJ","ThjNnQ6Lix","FNYIMZUnqt","pFrrl55rfB",
+"Yh1hFVprf2","aL6AJVjCZq","D6rByIRh48","FFDuifmIK1","BbwgAFPfSE","tAOsrd7vjM","9XyT9QbxXc","5ZaEzuJScX","CNHmvXyPZN","EOE1ocShY2",
+"dmoS7s7Mxk","AOgEeY1mC0","s7Mxk4W0Tl","Waim6soy9t","0Wr5yBFkb8","QbxXcPYBf4","cShY2M3zXL","SWfouSs0Zu","s7MxkBpYhV","WPmlxnlaBy",
+"JkzUnVBjhz","vLsmSSWfou","OUqFMNcICA","VerEAguMb8","5iGN5DLhzM","v8yFNZzJHW","JRJQB1j5L8","jfREuiqv4k","W3VFHjiVBP","9iGoTnFqik",
+"fcwDaAgJHQ","fcwDaK4GS8","WmadACxVEf","BCxeCAmdQd","ciuWzVBjhz","l83Uds4786","aL6AJ45cIH","9eoRc2hEEU","aez9y29QAz","GSQwjydG8U",
+"iB08l4dEz6","dpe1vJRJQB","HfyNQlsQGo","C2Ircrz7Ut","oVQp6azIWp","CNHmv64s8N","oQ87rNcICA","7fKYUyofH3","jS1ajnlaBy","QworuG1RhS",
+"AOgEeiB08l","MaJQs1v5hH","9XyT9rhl0J","brhlQ2Nslm","vkCHHqUJMd","sx5GlwiHrZ","ogLgcvOqCE","piJSkfmIK1","ZhwG1yvOMI","VNCPdHRxd8",
+"55rfBD6rBy","HzZT8Vprf2","jfREuNhXdu","zFgtBAIYUu","MezSWO3iyQ","HP433FVMxo","GWqqXtvdkD","brhlQMojnP","hYBCKpT8wu","MojnPhE1Ql",
+"7ku1pprNT6","jS1aj6q6L9","IjTwPGXdoH","Pb1pa8FmFH","WaWsv8U2nU","PYBf4FnPFB","5Drn0DQimp","KASQ8BCxeC","ru4UGFcWrW","8TxD7tl72W",
+"QworuIRh48","0KyfsWDVWJ","ZJTXHhi5X7","yvOMIfcJOy","d7vjMfLNg8","Gv3FqpAhR1","WMiS3hE1Ql","IBe8kyEfy9","atef2jS1aj","24ARFHlUbF",
+"JXljWpiJSk","aDGtS8U2nU","1j5L8lXFOB","VLTy6rKDLJ","NhXduZzJHW","WreyPRmDcr","0Wr5yStlDJ","brhlQgf8rI","BFkb8aL6AJ","HRxd8l83Ud",
+"fqypyWaim6","WaWsvuoStw","qQxHPWPmlx","RBhp0WDVWJ","uPX7GPOUYS","mz8gxZ4I1v","fmIK1JXljW","1j5L8HP433","pvgjSxXTI4","fcwDa9GXkX",
+"2DREsh1zcH","xReecbZLvS","XyPZNEoToP","HRxd8FNYIM","MojnPtjQxs","J2mQiO3iyQ","FcWrWdhSuH","oVQp6uoStw","FNYIMCK5W7","29QAz0Wr5y",
+"2hEEUrhl0J","HfyNQqaofN","n1pmOuQIcz","TXQ0ZblLA9","tl72WuZPqg","oVQp6UlU3M","VerEAZzJHW","BGaQYgf8rI","euZA5DG4sT","Chuy3Chuy3",
+"i7WMQqQxHP","ZhwG1cShY2","HzZT8FnPFB","CdyBVVNCPd","9iGoT7fKYU","yEfy964s8N","OxWIHHP433","KsjRKRpBQm","RzaZABbwgA","sqVrf29QAz",
+"BFkb8guMb8","aez9yt98iW","uAWypuupzk","GXdoH1v5hH","5drc6Vprf2","0PktINxx9V","nnP8oiB08l","YjB9tRzaZA","d85a9AIYUu","8FmFHW3VFH",
+"LbRTHWDVWJ","MK07YzmLYD","AIYUupAhR1","gIYvExXTI4","HP433CxVEf","pmeCdQ6hMC","UlU3MksJby","3otm6RBhp0","mz8gxaez9y","tlILtWaim6",
+"zz4ZUyofH3","VNCPdIRh48","y94nwChuy3","WDVWJzFgtB","QworuVBjhz","jtn0Xhi5X7","ulk415VZjS","GWqqXMaJQs","14FLRHfyNQ","FVMxoUmaEv",
+"IRh480YAGH","AgJHQBpYhV","b29RJUl4a1","BpYhVQWxoT","a00b5dhSuH","gtCA5d7vjM","FcWrW07n1c","uN6r3TCgPp","7fKYUnlaBy","5ZaEzJRJQB",
+"ciuWzydG8U","iKqhr5drc6","SjskQWmadA","1LB1LhSSvQ","7lUXZprNT6","aL6AJlsQGo","vOqCEtaOXK","Cfgr37X3uy","v1HlnLewvM","mz8gxO3iyQ",
+"WreyPNhXdu","fqypyMkgy8","2hEEUpv0i7","5Drn0lXFOB","M6qcGgIYvE","pWiOsBGaQY","FwEJztAOsr","CqqaDqQxHP","MmKGJF6PT2","i3pydix74r",
+"lj07QtjQxs","hSSvQTwano","ReKEWFjHXR","Waim69iGoT","MmKGJMkgy8","aL6AJBGaQY","UlU3MS2Dfu","7ku1p580YD","RkQkexReec","9GXkXPOUYS",
+"brhlQzmLYD","2ZHdkY1mC0","QworuBFkb8","Nxx9VoVQp6","xReec4W0Tl","8cVD3IKxdL","a00b5fLNg8","h1zcHFVMxo","t98iW8RCUA","uLtKsVerEA",
+"cQOnv8RCUA","Ss0Zu7X3uy","F6PT20YAGH","Gv3FqeuZA5","BCxeC55rfB","CK5W7PYBf4","4W0Tl5IhmG","Y1mC00h1b1","QClRLtjQxs","1LB1LoQ87r",
+"xciqp5drc6","ni2v1vkCHH","9y4lwMkgy8","yToGWDcpWB","0MR5XlXFOB","Nxx9V8hJdt","5ZaEzlkMUA","n1pmOUl4a1","O3iyQHlUbF","l83UdpWiOs",
+"9rlg9xXTI4","wiHrZLDk6f","s7MxkgIYvE","0YAGHhE1Ql","RkQkeJRJQB","3weIFh1zcH","UmaEvjfREu","LDk6fuLtKs","Mm8siY1mC0","gtCA5lXFOB",
+"YOfrYhE1Ql","ulk41S77LH","64s8NFxX9q","pmeCd8cVD3","NOHszFPfSE","FnPFBatef2","VerEA6AFT0","7Ow5CQChxs","0Kyfsi3pyd","lViBvMmsIo",
+"cShY28U2nU","2ZHdk2TRI7","W3VFHzQt6Q","M6qcGChuy3","P6bcghYBCK","Ta8f6mz8gx","64s8NzQt6Q","m4bxUOxWIH","48cHLUl4a1","ThjNn3otm6",
+"e6e4zx3LDe","yluBxpvgjS","RxrsmRmDcr","6AFT0pT8wu","VerEAF6PT2","soy9tgjUTu","m4bxUrKDLJ","VIlwPcQOnv","VerEAX6Pin","GSQwjQ6Lix",
+"EOE1ohYBCK","IRh48tuDyS","uoStwCp3mZ","4QMc9W7cTs","SWfouYOfrY","IBe8kQChxs","gf8rI1v5hH","pWiOsThjNn","iKqhri3pyd","v2eC3lsQGo",
+"8U2nUUl4a1","piJSk1j5L8","9GXkXZzJHW","lweGyU3yw5","pWiOssqVrf","Mm8siydG8U","h1zcHGXdoH","G1RhSdjsrv","S77LHNcICA","Kr8ysCdyBV",
+"piJSkzHF1q","prNT6GSQwj","4W0TlGv3Fq","64s8NEOE1o","lm0pD7Ow5C","Q6LixtlILt","PYBf4Waim6","suY4xQYxC0","YjB9tlpF6W","24ARFQClRL",
+"djsrvuvf7A","FjHXRFVMxo","W3VFHbZLvS","BbwgAQWxoT","CK5W7AmdQd","aDGtSThjNn","DLhzMwDajX","okgRiWreyP","HzZT8atef2","wiHrZmX2GE",
+"tjQxsblLA9","NAFuwlkMUA","CxVEfl83Ud","blLA9K20wK","CK5W75drc6","gIYvElViBv","Rxrsm8U2nU","dQ586RACuj","JIqXiGWqqX","yvOMIt98iW",
+"VerEAlweGy","iqv4kStlDJ","Pb1paEdBKc","ciuWzAgJHQ","bgJAzgIYvE","pv0i7cShY2","cShY2UmaEv","Pb1paRmDcr","YjB9tWreyP","aez9ypvgjS",
+"2Yz7EciuWz","ydG8UOUqFM","MezSWfqypy","2DREsFGzgp","Pb1pasx5Gl","jfREuRBhp0","DLhzMRACuj","MmKGJRzaZA","prNT65Namm","HzZT8jzUqR",
+"s93MlzQt6Q","VjCZqpvgjS","Chuy3b29RJ","prNT6M6qcG","NAFuwjeskS","PYBf4pvgjS","atef2In3NS","WDVWJcQOnv","dmoS7pmeCd","oVQp6Kr8ys",
+"Ss0ZujS1aj","d85a9Qworu","QClRLMK07Y","AgJHQWMiS3","DLhzMtAOsr","qaofNQbxXc","TwanoY1mC0","QworuBGaQY","hSSvQWMiS3","s7Mxk6AFT0",
+"Q6hMC4QMc9","QWxoT55rfB","AmdQdIKxdL","oGu6xDG4sT","Vprf2Rxrsm","S77LHZzJHW","WreyPuAWyp","jSjS3FVMxo","e6e4ziKqhr","VLTy6piJSk",
+"fcJOyuLtKs","fLNg80h1b1","ThjNnRmDcr","BpYhVMkgy8","9iGoTcmXIX","DcpWBIRh48","a00b5lCMxy","pFrrlGSQwj","Ul4a1yEfy9","Yf2EcQWxoT",
+"DQimpUvlv4","hi5X7WMiS3","SmGzvazIWp","Q6LixfcJOy","gIYvED6rBy","7lUXZzbIYY","AmdQdCIShG","RmDcrW7cTs","I7p2a1j5L8","bZLvSFLsph",
+"yToGW9GXkX","0Wr5y6AFT0","xXTI4uJScX","O3iyQdQ586","D6rBy0ao3l","suY4x8TxD7","B3qem7fKYU","7fKYUWPmlx","Yw2oURxrsm","W3VFH7X3uy",
+"zbIYYB3qem","1v5hHciuWz","SWfoupWiOs","8TxD7LewvM","BGaQYDz1R3","K20wKlkMUA","lCMxyLewvM","IKxdLzqH0W","cL0aEWDVWJ","x3LDe7fKYU",
+"UlU3M7ku1p","29QAzblLA9","RBhp0PYBf4","618DiFnPFB","JXljW9y4lw","5ZaEzsoy9t","n1pmO9eoRc","Z4I1vnnP8o","blLA9fcJOy","FwEJzFVMxo",
+"MaJQszqH0W","tuDySuTacx","t59lRoVQp6","oVQp6ZzJHW","bZLvSs4786","b29RJsoy9t","tl72WvOqCE","PYBf40PktI","JKWYRgjUTu","JkzUnJRJQB",
+"aFFssFwEJz","hUTw7yluBx","1v5hHzz4ZU","Ss0Zu2Nslm","5IhmG9iGoT","C2IrczHF1q","dQ586NOHsz","zz4ZUYf2Ec","0MR5XUmaEv","ZJTXHzY1GY",
+"AkKTkFFDui","Ss0ZuBFkb8","ogLgcYw2oU","JXljWuvf7A","BCxeCAIYUu","aFFssbZLvS","uLtKsMm8si","oVQp6VjCZq","jSjS345cIH","iqv4k0ao3l",
+"CdyBVCNHmv","3weIF8FmFH","4W0TlpT8wu","cShY2CxVEf","5Mg9rMGlTF","soy9tcQOnv","8TxD7Mm8si","U3yw5yofH3","PYBf4O3iyQ","uLtKsaL6AJ",
+"6q6L9vLsmS","cL0aEqUJMd","zY1GY5IhmG","Q6hMCAkKTk","2ZHdkG1RhS","VjCZquupzk","jzUqRlsQGo","UmaEvuAWyp","Ta8f6TXQ0Z","lH1kt8TxD7",
+"n1pmOBFkb8","vkCHHCp3mZ","jfREuksJby","VLTy6JXljW","1j5L8jiVBP","y94nwv1Hln","qUJMdRzaZA","7ku1pOUYuF","2DREsRmDcr","24ARF5Mg9r",
+"uN6r3JIqXi","zbIYYBGaQY","zz4ZUpmeCd","AXpwENcICA","QYxC0ZJTXH","ZhwG1tjQxs","hUTw7pv0i7","Mkgy8lXFOB","yluBxmz8gx","Chuy3K20wK",
+"55rfBgtCA5","0PktIt98iW","aDGtSpAhR1","tjQxsIn3NS","hE1QlkZANm","fmIK10MR5X","zQt6QMmKGJ","azIWpNAFuw","29QAzoQ87r","gtCA5RzaZA",
+"StlDJIRh48","soy9trhl0J","jS1ajLDk6f","MezSWQssNC","l83UdOUYuF","jeskSaez9y","tjQxstuDyS","uJScXtl72W","lCMxyQssNC","5Mg9rZJTXH",
+"Q6LixzFgtB","s93MllH1kt","I7p2aEdBKc","piJSkStlDJ","nlaBylj07Q","vLsmSNo0Qb","pFrrlDcpWB","O3iyQazIWp","WDVWJzz4ZU","K20wKWDVWJ",
+"jfREuNcICA","BCxeCMmsIo","HP433K20wK","AmdQdFhtgl","0ao3lAgJHQ","dmoS7uN6r3","HRxd8Vprf2","tAOsrdpe1v","FGzgpMezSW","5Namm2ZHdk",
+"7Ow5C5drc6","4QMc9cQOnv","HP433WaWsv","vOqCEsuY4x","JXljWt98iW","uAWypsqVrf","uZPqgBCxeC","IjTwP0ao3l","BGaQYzbIYY","7ku1pbgJAz",
+"DG4sTksJby","uoStwKr8ys","oVQp6FNYIM","tuDySQChxs","pT8wujzUqR","7fKYUuAWyp","07n1cokgRi","zqH0WAIYUu","Fhtgl5drc6","xReecpWiOs",
+"zFgtB0ao3l","iwzGke6e4z","hi5X7bgJAz","lj07QKASQ8","qQxHPGrDg7","8U2nULDk6f","y94nwjtn0X","pv0i7XflUq","FFDuirz7Ut","pmeCdFVMxo",
+"zFgtBlsQGo","Pb1paZhwG1","gIYvEciuWz","hUTw7HlUbF","ulk41nFqik","cShY2uvf7A","QWxoTRBhp0","SbRYy8xEKz","uAWypAmdQd","IKxdLRpBQm",
+"7fKYUZ4I1v","FFDuiuJScX","ru4UGOxWIH","2Yz7EfaHir","HlUbFpFrrl","FFDui5VZjS","kB5nPzFgtB","EdBKcMkgy8","Qworu0BmCy","DLhzMjS1aj",
+"lViBvJXljW","Vprf2GrDg7","gtCA5Zv7z0","Nxx9VHRxd8","Cfgr3Yf2Ec","MmKGJi3pyd","s4786ZhwG1","BFkb8mz8gx","4QMc9fqypy","2DREsQYxC0",
+"8xEKzrz7Ut","pv0i7ZJTXH","MezSWDLhzM","JkzUn7Ow5C","RsQUqBbwgA","Ss0ZuCdyBV","JXljWs4786","Zv7z0S77LH","zbIYYxReec","1LB1LazIWp",
+"sx5Gl9XyT9","fLNg8AIYUu","2Yz7E3weIF","pv0i70Wr5y","IKxdLDcpWB","9iGoT7hyVv","gjUTuFPfSE","tl72WYf2Ec","euZA55Mg9r","I7p2aOxWIH",
+"5Mg9rxciqp","Rxrsmd7vjM","e6e4zFNYIM","K4GS8I7p2a","s93MlvOqCE","RBhp0S77LH","LDk6fFhtgl","Ta8f6uoStw","FwEJzMm8si","kB5nPPYBf4",
+"0Wr5ylsQGo","Yh1hF2TRI7","HRxd8Rxrsm","okgRilpF6W","fLNg81j5L8","fcJOyECMvU","uAWypD6rBy","K4GS8Rxrsm","VNCPd0BmCy","C2IrcAIYUu",
+"OxWIHPYBf4","M6qcGcQOnv","euZA5lweGy","B3qemZ4I1v","kB5nPL7cGc","gIYvE1v5hH","jzUqRmz8gx","9XyT97lUXZ","DG4sTMmKGJ","ECMvUd85a9",
+"ECMvUEOE1o","aFFss3weIF","KsjRKzqH0W","fcwDaCfgr3","prNT6s7Mxk","QWxoT5iGN5","S77LHWDVWJ","W7cTseuZA5","tl72WJJs5m","zbIYYS2Dfu",
+"pFrrlzY1GY","jiVBP5nmWv","jSjS3JkzUn","lj07Qni2v1","fqypy9XyT9","OUYuFpT8wu","lweGyAOgEe","taOXKmX2GE","64s8NBFkb8","LDk6fMojnP",
+"9GXkXAOgEe","1j5L8ZuDtD","L7cGcF6PT2","B3qem0BmCy","3weIFLewvM","brhlQpFrrl","DQimp1v5hH","Mm8siVjCZq","ksJby7lUXZ","yluBxQbxXc",
+"M6qcGMaJQs","0BmCy8cVD3","JRJQB9y4lw","FFDuiaDGtS","qQxHPvLsmS","piJSklXFOB","BCxeCa00b5","RxrsmbZLvS","9rlg90MR5X","5nmWvFLsph",
+"uZPqg7hyVv","lsQGovOqCE","9y4lwAmdQd","vLsmSiqv4k","FcWrWvkCHH","8hJdtmz8gx","RzaZA8xEKz","NhXduQworu","VerEAM6qcG","W7cTsksJby",
+"zFgtBL7cGc","Zv7z0F6PT2","gjUTuD6rBy","2TRI7ni2v1","8hJdtpiJSk","5IhmGiqv4k","piJSkQworu","soy9tFnPFB","1LB1L7fKYU","BCxeCxciqp",
+"dpe1vuQIcz","aez9yBFkb8","o8UydlsQGo","jtn0X8xEKz","RACujFGzgp","rz7UtguMb8","FnPFBtAOsr","0ao3ltuDyS","W7cTsI7p2a","VjCZqni2v1",
+"5ZaEzTwano","m4bxUMojnP","Ul4a18FmFH","2Yz7E9eoRc","jS1ajvOqCE","FjHXRNAFuw","VNCPdblLA9","pT8wuCp3mZ","Yh1hFYw2oU","uQIczvLsmS",
+"IRh48MezSW","uN6r3h1zcH","2DREsJXljW","M6qcG8xEKz","zY1GYRsQUq","Cp3mZ9GXkX","nFqikd85a9","WreyPhi5X7","zHF1qChuy3","QYxC0QWxoT",
+"UlU3MCfgr3","NhXducShY2","cShY2Y1mC0","OUYuFjS1aj","aDGtSDLhzM","i3pydfmIK1","2DREsOz8yZ","Uvlv4zz4ZU","0Wr5yaL6AJ","0ao3lrz7Ut",
+"DcpWBFGzgp","hSSvQ0ao3l","Mm8sipiJSk","580YD64s8N","cL0aEokgRi","AmdQdaDGtS","D6rByBCxeC","o8UydAXpwE","0h1b1Zv7z0","8cVD3pv0i7",
+"lXFOBLewvM","NAFuwU3yw5","5nmWvMmsIo","DcpWBoGu6x","iKqhrEoToP","Kr8ysAkKTk","9iGoTECMvU","lCMxyHP433","k85Aey94nw","lH1ktBCxeC",
+"YjB9t9XyT9","FnPFB4QMc9","okgRizqH0W","QssNCs93Ml","UmaEvydG8U","yToGWFLsph","v1Hlnd85a9","he9IAtjQxs","tAOsr24ARF","rhl0JNOHsz",
+"gIYvESmGzv","DcpWB5VZjS","StlDJ7X3uy","rKDLJ8FmFH","16lHcThjNn","dhSuHW3VFH","55rfBpmeCd","JkzUn5iGN5","bZLvSm4bxU","C2Irc24ARF",
+"MaJQs6AFT0","NAFuwRACuj","1LB1LFxX9q","0MR5Xgf8rI","1LB1LaFFss","4QMc9Q6hMC","MmsIotjQxs","aDGtSgtCA5","7Ow5CEdBKc","NhXduogLgc",
+"zbIYYi3pyd","s7Mxk64s8N","M6qcGtuDyS","0BmCyHP433","6q6L9Twano","Ta8f6x3LDe","1v5hHazIWp","tvdkDCdyBV","XyPZNaDGtS","FxX9qGWqqX",
+"FLsphDG4sT","5iGN5TCgPp","mz8gxgIYvE","5IhmGY1mC0","iKqhrQChxs","kZANm5IhmG","jfREu16lHc","Yh1hFAIYUu","CxVEfQbxXc","xciqpNAFuw",
+"ksJbyKsjRK","0YAGHDG4sT","jeskSO3iyQ","uoStwAIYUu","64s8N5Namm","aL6AJ0Wr5y","MmsIo1v5hH","16lHcFcWrW","m4bxUGrDg7","9XyT9FnPFB",
+"9iGoT618Di","1LB1LcQOnv","zz4ZUy94nw","GWqqXuPX7G","DcpWBTCgPp","Oz8yZCqqaD","e6e4z9iGoT","okgRiRkQke","zqH0WAmdQd","8U2nUpWiOs",
+"ciuWzoGu6x","EdBKcQYxC0","wiHrZReKEW","oGu6xaDGtS","zbIYYi7WMQ","azIWplXFOB","6AFT0SWfou","gdQsSazIWp","FFDuiuTacx","lXFOBqQxHP",
+"CxVEfix74r","2TRI71v5hH","uJScX7lUXZ","AOgEe0Wr5y","16lHc2ZHdk","x3LDelkMUA","zY1GY45cIH","o8UydQYxC0","lkMUAPOUYS","v1HlnyluBx",
+"WaWsvL7cGc","7fKYUlsQGo","dpe1vFFDui","MGlTFIBe8k","2TRI7MmsIo","oVQp6Ss0Zu","TCgPpzHF1q","MmsIoBpYhV","RsQUqVjCZq","oQ87rPYBf4",
+"48cHLgtCA5","0ao3lhE1Ql","RxrsmHRxd8","ydG8UhUTw7","dQ586Mm8si","cmXIXvOqCE","ZUnqtiKqhr","ulk41Rxrsm","m4bxU2ZHdk","VIlwPHlUbF",
+"pT8wuFLsph","lpF6WyofH3","HlUbFWaWsv","fcJOyWaWsv","gdQsSNhXdu","MK07YxXTI4","2ZHdkStlDJ","cmXIXQ6hMC","In3NSZuDtD","v8yFN9y4lw",
+"M3zXLQ6Lix","0MR5XHP433","tlILt4dEz6","tlILtMojnP","zbIYYzbIYY","atef2fcwDa","LbRTHQClRL","mz8gxMaJQs","Q6hMCFcWrW","lweGyDLhzM",
+"580YDuvf7A","CdyBV5nmWv","vOqCEO3iyQ","1j5L8In3NS","GSQwj7Ow5C","FFDuiMmsIo","SbRYyOz8yZ","cQOnvSjskQ","lpF6WprNT6","okgRi8FmFH",
+"ix74rwiHrZ","AkKTk7X3uy","t98iW9iGoT","h1zcHU3yw5","i7WMQKZamH","tAOsrtuDyS","QClRLDLhzM","zz4ZURpBQm","t59lRDQimp","wDajXwDajX",
+"QnJ1SFVMxo","AgJHQv8yFN","guMb8SbRYy","cQOnvBbwgA","zz4ZUbrhlQ","uPX7GfFDrJ","lViBvdQ586","ru4UGMK07Y","jfREuFcWrW","pFrrlQYxC0",
+"K20wKkZANm","FGzgpBGaQY","14FLRSmGzv","8xEKz7lUXZ","S2Dfu7fKYU","Ta8f6Mkgy8","2hEEUFnPFB","2DREsDG4sT","rz7UtpAhR1","YjB9tQClRL",
+"cQOnvcShY2","FNYIMcL0aE","euZA5Cp3mZ","9rlg9gtCA5","2DREsYjB9t","ru4UG7Ow5C","MmKGJIBe8k","t98iWix74r","suY4xqaofN","jfREu29QAz",
+"6AFT0jzUqR","Chuy3WPmlx","In3NSl83Ud","y94nwRBhp0","S2Dfu7X3uy","tjQxssoy9t","DcpWBRkQke","tjQxsNcICA","FLsphTXQ0Z","x3LDeUlU3M",
+"VerEAlH1kt","s93MlFGzgp","VjCZqs4786","2DREsP6bcg","8hJdtblLA9","Pb1paiqv4k","blLA9Nxx9V","Q6hMCZ4I1v","I7p2aCxVEf","tlILtJkzUn",
+"rhl0JFFDui","FGzgp3otm6","C2Irc5Drn0","BGaQYrhl0J","580YDtjQxs","uLtKsHP433","Ss0ZuQ6Lix","tl72WKr8ys","rKDLJzbIYY","ZhwG1lkMUA",
+"nnP8oJIqXi","n1pmOi3pyd","d7vjMZhwG1","B3qemxReec","FNYIMSs0Zu","EdBKc0MR5X","fcJOyWMiS3","pv0i7jeskS","K4GS8Ul4a1","lm0pDVNCPd",
+"iwzGkWaWsv","Waim6W7cTs","gdQsShi5X7","9eoRchYBCK","KZamH5VZjS","Q6Lix0BmCy","VNCPd5nmWv","t59lRl83Ud","bgJAzni2v1","0YAGHjfREu",
+"VBjhztuDyS","s4786Oz8yZ","TXQ0ZAkKTk","tuDySBGaQY","uPX7GuN6r3","29QAzDQimp","aL6AJs7Mxk","QworuKZamH","FNYIMpT8wu","pmeCddjsrv",
+"8cVD38xEKz","MojnPatef2","U3yw5fFDrJ","x3LDeCfgr3","U3yw5iqv4k","gdQsS0Wr5y","yofH3aDGtS","M3zXLJRJQB","AXpwESWfou","MmKGJJJs5m",
+"v2eC3FjHXR","b29RJrhl0J","pWiOsgIYvE","HRxd8WDVWJ","uZPqgHlUbF","NAFuwMm8si","FFDuil83Ud","ZzJHWRsQUq","Ul4a1SWfou","soy9tCIShG",
+"0KyfsYw2oU","CIShG0Kyfs","WMiS3FFDui","suY4x7ku1p","o8UydciuWz","In3NSKr8ys","v1HlnK20wK","LewvMYh1hF","tuDySd7vjM","Nxx9VXflUq",
+"In3NSd7vjM","0YAGH5ZaEz","hE1QlsuY4x","qUJMdSWfou","MmKGJYjB9t","jiVBPv8yFN","hE1QlprNT6","aez9yQ6hMC","pFrrlkB5nP","7X3uye6e4z",
+"rz7UtpFrrl","QnJ1S9y4lw","TwanoRmDcr","Vprf2Uvlv4","lViBv0Wr5y","uoStwQWxoT","zmLYDIBe8k","bZLvSFFDui","wDajX5iGN5","ZzJHWnFqik",
+"B3qemhYBCK","GrDg7YjB9t","uPX7G9eoRc","JJs5mVLTy6","LbRTHOxWIH","blLA9e6e4z","S2DfuRmDcr","nlaBylViBv","ZhwG1C2Irc","0ao3lsuY4x",
+"FwEJz8TxD7","cmXIXhE1Ql","MK07YB3qem","kZANm5nmWv","W3VFHwDajX","uN6r3bZLvS","14FLRIBe8k","M6qcGK4GS8","lpF6WdQ586","uoStwMmsIo",
+"W3VFHsuY4x","QChxspvgjS","d7vjM5Drn0","RACujiKqhr","DLhzMzFgtB","iKqhrZJTXH","IBe8ktAOsr","pFrrl0PktI","o8Uydv2eC3","J2mQiQ6hMC",
+"blLA9zY1GY","55rfB4QMc9","taOXKguMb8","qaofNFxX9q","djsrviwzGk","IBe8k6AFT0","9rlg9VerEA","OHaBz24ARF","YjB9tYjB9t","ogLgc580YD",
+"Ss0ZuLewvM","SjskQnnP8o","OxWIHJIqXi","lH1ktyToGW","Kr8ysChuy3","7X3uyUmaEv","mX2GEB3qem","6q6L97Ow5C","Gv3FqFFDui","uN6r3gjUTu",
+"MK07Yy94nw","ciuWzMmsIo","WaWsvSs0Zu","s93Mlx3LDe","tvdkDECMvU","8FmFHBGaQY","yvOMIjS1aj","lsQGoZuDtD","qQxHP3otm6","VIlwPLbRTH",
+"7fsYMFhtgl","s93MluQIcz","sx5GlwDajX","fqypymz8gx","NcICAOxWIH","zHF1qcL0aE","yluBxkB5nP","djsrvrz7Ut","jS1ajs7Mxk","uN6r30PktI",
+"t98iWQWxoT","sx5Glfqypy","rz7Uto8Uyd","CK5W7suY4x","dQ586Z4I1v","JIqXijzUqR","45cIHTCgPp","FcWrW0MR5X","v2eC3hUTw7","pAhR1Yw2oU",
+"HRxd8QClRL","QChxslweGy","BFkb8MK07Y","o8UydsqVrf","55rfB2DREs","X6Pin8TxD7","JJs5mWreyP","48cHLIKxdL","RACujqQxHP","s93MlTa8f6",
+"FxX9qksJby","WmadAhSSvQ","fcwDadQ586","brhlQ07n1c","YOfrYtuDyS","SjskQl83Ud","lm0pD618Di","ksJbyDQimp","SWfouZUnqt","fmIK1ZUnqt",
+"hYBCKzHF1q","Chuy3pmeCd","hSSvQiqv4k","WaWsvmX2GE","4W0TlJIqXi","ZzJHWcQOnv","9GXkXWaim6","9iGoT1v5hH","Q6Lix3otm6","G1RhSDQimp",
+"7lUXZVIlwP","iB08lThjNn","VjCZq9iGoT","Cfgr3lViBv","MojnPv2eC3","SbRYyFGzgp","WreyP8cVD3","DQimpfcJOy","ZuDtDOUYuF","Fhtglxciqp",
+"pmeCdcmXIX","3otm6k85Ae","uAWypXflUq","2ZHdkyToGW","PYBf4sx5Gl","C2IrcTCgPp","nFqikydG8U","lsQGohi5X7","K4GS8JIqXi","In3NSuTacx",
+"7fKYUAgJHQ","lCMxyFPfSE","S2DfunnP8o","S77LHFNYIM","KASQ8WDVWJ","5drc6AgJHQ","JIqXipAhR1","CIShGjtn0X","0h1b1uN6r3","580YDrz7Ut",
+"45cIHsoy9t","14FLRRkQke","tvdkDGWqqX","16lHcM3zXL","VNCPdPYBf4","VBjhzFLsph","d85a9WmadA","2Nslm1j5L8","i3pydECMvU","prNT6KsjRK",
+"NAFuwFVMxo","HP433SjskQ","BFkb8euZA5","9rlg9ru4UG","9rlg9gjUTu","RkQken8pJ9","dpe1vSWfou","MmsIoy94nw","s93MlBCxeC","FNYIMDQimp",
+"ZUnqt3weIF","2hEEUlpF6W","QYxC0BCxeC","SmGzvDz1R3","F6PT2hi5X7","9y4lwTwano","64s8NNxx9V","3weIFpAhR1","RxrsmCqqaD","X6PinL7cGc",
+"4W0TlIn3NS","XyPZNrhl0J","0BmCypvgjS","14FLR5ZaEz","aL6AJpFrrl","blLA9uZPqg","FhtgloQ87r","bgJAzuupzk","S2DfuEoToP","yvOMIQWxoT",
+"hSSvQv8yFN","WaWsvv1Hln","NhXdu9y4lw","fFDrJXyPZN","Q6LixC2Irc","pWiOsdmoS7","ix74rFhtgl","DcpWBuJScX","lViBvVIlwP","b29RJIjTwP",
+"HRxd80h1b1","TCgPpuJScX","rhl0JHP433","JXljWQnJ1S","OxWIH45cIH","AOgEeLbRTH","lH1kttlILt","2Yz7EBCxeC","NhXdu07n1c","vOqCEyluBx",
+"azIWpECMvU","GrDg7X6Pin","d85a9uoStw","StlDJUlU3M","VIlwPMK07Y","24ARFpT8wu","5Mg9ryToGW","8RCUAVNCPd","JKWYR0YAGH","zY1GYkZANm",
+"QnJ1S7hyVv","VerEAksJby","QChxsIRh48","NhXduo8Uyd","RmDcrtuDyS","0h1b1FVMxo","FFDuidmoS7","Qworu8TxD7","jS1ajaez9y","mz8gxs4786",
+"4W0TluLtKs","n1pmOPb1pa","WMiS3SbRYy","GWqqXRsQUq","SWfoub29RJ","i3pydulk41","5drc65Namm","AIYUuzz4ZU","gIYvETa8f6","jiVBPCp3mZ",
+"G1RhSRBhp0","OHaBz2DREs","VIlwPdQ586","WMiS3tjQxs","5NammtAOsr","NcICAru4UG","QbxXcd85a9","tlILtRxrsm","iB08lsuY4x","1v5hHF6PT2",
+"RmDcrY1mC0","zz4ZUTa8f6","0PktIlj07Q","HP433HzZT8","yvOMI7lUXZ","EdBKcgjUTu","FLsphMGlTF","FNYIMC2Irc","h1zcHRzaZA","l83UdFVMxo",
+"t98iWiqv4k","pv0i7s7Mxk","0BmCyNhXdu","lj07QAOgEe","8xEKzCIShG","BGaQYjSjS3","G1RhS7Ow5C","5VZjSl83Ud","zHF1qNxx9V","AgJHQ0Kyfs",
+"GWqqXxXTI4","lXFOBNo0Qb","K4GS8i7WMQ","S2DfuOz8yZ","pvgjSk85Ae","uQIcz0BmCy","29QAzbZLvS","GSQwjOUYuF","FFDuiRkQke","ni2v1D6rBy",
+"OUYuFJkzUn","1j5L8ix74r","hE1QlMmsIo","QClRL9iGoT","hSSvQUl4a1","zmLYD2hEEU","vLsmSLbRTH","uN6r3aez9y","Fhtgllj07Q","IjTwPZzJHW",
+"wiHrZlViBv","JKWYRfaHir","S77LH5Mg9r","xXTI4gjUTu","tlILt4QMc9","DcpWBZUnqt","rhl0JpiJSk","AkKTkrKDLJ","brhlQfaHir","CxVEffqypy",
+"azIWph1zcH","I7p2aVLTy6","VLTy6v2eC3","SbRYyhe9IA","atef2NcICA","hUTw7ni2v1","h1zcHokgRi","SbRYyNo0Qb","cmXIX3weIF","DLhzM5Mg9r",
+"0Kyfss93Ml","07n1cxciqp","Cfgr3AIYUu","IjTwPTwano","AmdQdQWxoT","djsrvk85Ae","uLtKspWiOs","Q6Lix4dEz6","UmaEvMGlTF","lH1ktD6rBy",
+"HlUbFOHaBz","QYxC0faHir","5drc60Wr5y","o8UydqaofN","jiVBP0ao3l","580YDJkzUn","S2Dfu0YAGH","KsjRKsuY4x","BGaQYfaHir","JkzUn0ao3l",
+"NcICA9iGoT","JkzUnYh1hF","zFgtBlweGy","14FLRazIWp","FhtglI7p2a","nnP8oRACuj","SWfou0BmCy","AgJHQlsQGo","BpYhVd85a9","JkzUnOUqFM",
+"ydG8UzFgtB","QnJ1S4W0Tl","UlU3MgdQsS","oGu6xFPfSE","mX2GEIBe8k","JkzUnpv0i7","Uvlv4Y1mC0","BFkb8WMiS3","9eoRcWMiS3","5Mg9rsuY4x",
+"atef2IKxdL","EoToPDcpWB","AIYUuGXdoH","s93MlO3iyQ","HfyNQMkgy8","t98iW5nmWv","LewvMgIYvE","uPX7GVjCZq","Yh1hFU3yw5","nlaByOHaBz",
+"ix74r9XyT9","iB08ld7vjM","9GXkXzY1GY","s93MlyvOMI","RsQUqRpBQm","gIYvEGrDg7","nFqikNo0Qb","LbRTHYf2Ec","0ao3lUl4a1","CxVEfs4786",
+"8U2nUix74r","29QAzgdQsS","AmdQdkB5nP","5VZjSjtn0X","AOgEesoy9t","5nmWvlCMxy","fFDrJhSSvQ","Z4I1vmX2GE","TwanojS1aj","cShY2TCgPp",
+"ni2v1FnPFB","In3NSpmeCd","prNT6Q6Lix","16lHc48cHL","suY4xs4786","kZANmuN6r3","v8yFNksJby","TCgPp618Di","In3NSi3pyd","StlDJ2DREs",
+"2NslmBGaQY","ulk41vOqCE","jzUqRgdQsS","RBhp0XyPZN","OHaBz45cIH","jiVBP8RCUA","aDGtSx3LDe","07n1c5drc6","tl72Wzz4ZU","rz7UtsqVrf",
+"iB08lOz8yZ","7hyVv0BmCy","SWfou48cHL","vkCHHNo0Qb","FVMxoVBjhz","cmXIX16lHc","JXljWFPfSE","C2Ircy94nw","UmaEv8hJdt","pmeCdCqqaD",
+"2TRI78FmFH","Mm8siCfgr3","0ao3llm0pD","5VZjSzz4ZU","ix74rQ6hMC","l83UdqaofN","FFDuihSSvQ","9GXkXciuWz","tvdkDzbIYY","lsQGoFNYIM",
+"DLhzM5IhmG","dmoS7uLtKs","k85AeBbwgA","n8pJ9WDVWJ","lCMxyuPX7G","7X3uySjskQ","s7Mxk8U2nU","sx5Glgf8rI","fcwDaazIWp","1LB1LG1RhS",
+"lm0pDFnPFB","5Nammm4bxU","VIlwPbZLvS","2TRI7CIShG","5Namm16lHc","zz4ZU7Ow5C","fFDrJFxX9q","FFDuiECMvU","aDGtSI7p2a","3otm6VLTy6",
+"ThjNnChuy3","aL6AJ14FLR","lkMUApmeCd","uTacxvLsmS","Ul4a1DLhzM","0ao3lP6bcg","Ss0Zu55rfB","Q6hMC7fKYU","pT8wucShY2","n8pJ9StlDJ",
+"GXdoHyEfy9","0KyfsjSjS3","oVQp6YjB9t","xXTI4EOE1o","vkCHHuN6r3","uTacxkB5nP","s7MxkzmLYD","GWqqXS77LH","VNCPdECMvU","QnJ1SBCxeC",
+"9iGoTW7cTs","GSQwjs93Ml","iwzGkQ6hMC","RzaZAyvOMI","0Kyfse6e4z","DG4sTWmadA","uPX7GRkQke","FFDuiHRxd8","vLsmSiwzGk","vOqCEv8yFN",
+"nlaByQChxs","gtCA5Gv3Fq","vLsmSdQ586","VIlwPRxrsm","2NslmM6qcG","QssNCd7vjM","ZJTXHcQOnv","7ku1pQssNC","45cIHRBhp0","bZLvSJXljW",
+"JKWYRXyPZN","oVQp6FVMxo","FVMxoYh1hF","NAFuwECMvU","VerEAgdQsS","v1HlniB08l","BCxeCoVQp6","vkCHHv2eC3","cShY2VIlwP","RACuj8TxD7",
+"xXTI4XflUq","lCMxyvkCHH","EOE1oru4UG","tAOsr9y4lw","XyPZNru4UG","yToGWX6Pin","WMiS3yluBx","Uvlv4vOqCE","vLsmSix74r","AXpwEhe9IA",
+"7hyVv0Kyfs","IjTwPK4GS8","JIqXit59lR","In3NS4dEz6","WDVWJ5nmWv","lm0pDNxx9V","ix74rFFDui","iwzGktAOsr","0h1b1nFqik","LDk6fgdQsS",
+"Cfgr3prNT6","QWxoT0PktI","dQ5868xEKz","FnPFBWDVWJ","07n1cuoStw","JkzUnkZANm","2Yz7EvkCHH","WPmlxFhtgl","yofH3aez9y","iqv4kksJby",
+"AgJHQCNHmv","bZLvS9iGoT","gIYvEru4UG","IjTwPRzaZA","AIYUucL0aE","KsjRKCxVEf","JXljWY1mC0","BGaQYECMvU","0YAGH48cHL","nnP8ov8yFN",
+"WmadAlCMxy","D6rByUmaEv","OUqFMO3iyQ","MK07YDLhzM","WDVWJ8U2nU","WreyPUvlv4","Vprf2lpF6W","UmaEvBbwgA","gdQsSIjTwP","CNHmvyToGW",
+"s4786uvf7A","fmIK1d85a9","ydG8U0h1b1","F6PT2CxVEf","RkQkeCNHmv","ECMvUFnPFB","Nxx9Vxciqp","618DitaOXK","RkQkeaDGtS","4dEz6uN6r3",
+"0BmCyRpBQm","gjUTuuN6r3","i7WMQcShY2","J2mQiSjskQ","hYBCKJkzUn","lpF6WlXFOB","6AFT064s8N","Vprf2qQxHP","5Drn0VjCZq","16lHcCfgr3",
+"fmIK1iB08l","0PktIfcJOy","lXFOBuTacx","Pb1paOxWIH","d85a9cShY2","16lHcSs0Zu","DcpWBBFkb8","7X3uy3weIF","e6e4zM6qcG","jfREuaez9y",
+"DG4sTjSjS3","5Drn0EdBKc","9eoRcQ6Lix","ksJbyGSQwj","s93Ml07n1c","45cIH6AFT0","lXFOBMm8si","dhSuHRpBQm","rhl0JGrDg7","MGlTFn8pJ9",
+"8RCUA0ao3l","cShY23weIF","CdyBVFNYIM","FhtglYh1hF","lweGyydG8U","s93MlHzZT8","lkMUAs4786","M3zXLcmXIX","1j5L8U3yw5","piJSkWDVWJ",
+"K4GS8d7vjM","HzZT8mX2GE","G1RhSrz7Ut","zY1GYIRh48","FPfSERxrsm","S77LHK4GS8","AgJHQbrhlQ","7ku1pmX2GE","5ZaEzpT8wu","LbRTHhYBCK",
+"fLNg8ECMvU","FwEJzokgRi","MGlTFblLA9","Q6hMCnlaBy","ydG8UnnP8o","GXdoHn8pJ9","OHaBzMm8si","FPfSE7fsYM","pAhR1B3qem","d7vjMhSSvQ",
+"oVQp60YAGH","cL0aEgf8rI","VjCZqRpBQm","48cHLyToGW","Vprf2FGzgp","ni2v1WDVWJ","5Nammaez9y","AXpwECp3mZ","rKDLJdQ586","9rlg98xEKz",
+"FwEJzTwano","POUYS3weIF","MmKGJFPfSE","zbIYYFjHXR","MK07YtaOXK","suY4xS77LH","WPmlxkZANm","Ss0ZuRpBQm","JXljWX6Pin","ECMvU2DREs",
+"9XyT9s4786","gtCA5FNYIM","dmoS755rfB","yToGWCfgr3","QClRLThjNn","OHaBzlpF6W","NAFuwgtCA5","CK5W7iqv4k","QChxszmLYD","zFgtBtjQxs",
+"FVMxoAkKTk","M3zXLx3LDe","DLhzMyvOMI","uvf7AD6rBy","Uvlv4nlaBy","L7cGcuLtKs","rz7Uttl72W","ogLgcaFFss","WPmlxaez9y","cQOnv0MR5X",
+"NOHszoQ87r","ReKEWX6Pin","XyPZN1j5L8","n1pmOqQxHP","v2eC3gjUTu","7Ow5CBpYhV","24ARFQ6Lix","Gv3Fq8RCUA","zQt6QRBhp0","s7MxkgjUTu",
+"i3pyd7X3uy","16lHcsx5Gl","oGu6xbZLvS","uoStwMkgy8","BFkb8BpYhV","DG4sTBCxeC","8FmFHv8yFN","0Kyfsk85Ae","euZA5zFgtB","fLNg8uvf7A",
+"Q6LixlkMUA","RmDcrzHF1q","NAFuwqQxHP","n1pmOiqv4k","FjHXRReKEW","W7cTsyEfy9","NhXduXflUq","qUJMdcL0aE","nlaByGXdoH","rz7UtgtCA5",
+"d7vjMYw2oU","lpF6WhSSvQ","sx5GlRkQke","a00b5zbIYY","y94nwMm8si","v1HlnfLNg8","0YAGHW7cTs","ni2v1S77LH","taOXKuLtKs","I7p2aTXQ0Z",
+"UmaEvuZPqg","WDVWJlH1kt","aez9yNcICA","pAhR1HP433","fmIK1yluBx","Cp3mZvkCHH","S2DfuSjskQ","uLtKsNxx9V","lViBvCNHmv","hYBCK5Namm",
+"iwzGkSs0Zu","VBjhzyvOMI","X6PinSbRYy","v8yFNYh1hF","fcJOy5nmWv","BCxeCD6rBy","lCMxyrz7Ut","rhl0JdmoS7","b29RJlpF6W","29QAzXflUq",
+"TXQ0Z6AFT0","55rfBfmIK1","8cVD316lHc","In3NStl72W","s93Mls93Ml","MojnPcShY2","sx5Gl4QMc9","5IhmGWDVWJ","K20wKvLsmS","K4GS8n1pmO",
+"FGzgpVNCPd","oGu6xWmadA","lH1ktuLtKs","Y1mC05ZaEz","v8yFNCNHmv","YjB9tQnJ1S","2Nslm0Kyfs","uPX7GJJs5m","uTacxNAFuw","7Ow5CX6Pin",
+"xciqpnlaBy","AXpwEW3VFH","0Wr5yGSQwj","618Di5IhmG","gjUTue6e4z","29QAzQ6Lix","v2eC3RACuj","Dz1R3SbRYy","WmadAiB08l","45cIHt59lR",
+"2NslmBbwgA","dQ586zbIYY","e6e4zFPfSE","Mm8sidmoS7","FcWrWBpYhV","lweGys7Mxk","s4786hYBCK","45cIH9iGoT","a00b5VLTy6","YOfrYzFgtB",
+"5drc6sx5Gl","aez9y2hEEU","8U2nUOxWIH","KsjRKQChxs","580YDgtCA5","lXFOBCNHmv","Ul4a1zQt6Q","QChxsIKxdL","7lUXZi3pyd","oQ87rtAOsr",
+"v2eC36q6L9","yofH3Mkgy8","suY4x07n1c","OUqFMt59lR","3weIFSs0Zu","cQOnvQYxC0","0BmCytuDyS","D6rBytuDyS","uLtKsKsjRK","aDGtSYjB9t",
+"RkQkegdQsS","he9IA5ZaEz","RBhp0cQOnv","Pb1paNcICA","HfyNQHlUbF","v8yFNFGzgp","GWqqXgtCA5","8TxD7FPfSE","faHirzbIYY","0Wr5yiwzGk",
+"0h1b1PYBf4","07n1csqVrf","5iGN5t98iW","hE1Ql2ZHdk","2Yz7EZJTXH","FNYIMhi5X7","zFgtBksJby","QYxC0QssNC","2DREs7lUXZ","pT8wuYh1hF",
+"7ku1pd85a9","0MR5XyvOMI","IBe8k07n1c","580YDGXdoH","qQxHPY1mC0","FVMxoQ6hMC","blLA9Yw2oU","QChxsGWqqX","BGaQYnFqik","euZA5NcICA",
+"VerEAtAOsr","fqypyPYBf4","uupzkWMiS3","s93Ml9iGoT","brhlQhE1Ql","6AFT0LbRTH","pT8wu8xEKz","aez9ycL0aE","GrDg7iB08l","cQOnvRsQUq",
+"s4786NAFuw","fFDrJfaHir","8xEKzQssNC","GWqqXHzZT8","Pb1parz7Ut","WreyPRpBQm","MojnPi7WMQ","NcICAW7cTs","ksJbyOUqFM","h1zcHVLTy6",
+"StlDJ45cIH","cQOnvi3pyd","MezSWjzUqR","2DREsRsQUq","atef2G1RhS","DQimpLewvM","lweGyFjHXR","Cfgr3dmoS7","8RCUAQYxC0","gjUTuFnPFB",
+"WreyP9iGoT","lj07QTa8f6","VNCPdVprf2","DG4sTtvdkD","iqv4kni2v1","v2eC30h1b1","UlU3MuN6r3","BGaQY14FLR","tvdkD1v5hH","Qworu6q6L9",
+"BFkb8pWiOs","K4GS8gIYvE","KZamHiwzGk","tjQxsFLsph","wDajX7fKYU","euZA5QChxs","gIYvEAIYUu","y94nwjS1aj","JJs5mlm0pD","5IhmGFjHXR",
+"HRxd89XyT9","FLsphHzZT8","WaWsv9eoRc","ZJTXHFhtgl","GrDg7Ul4a1","S2DfuBpYhV","tjQxs618Di","prNT6fmIK1","euZA5zmLYD","MojnPdQ586",
+"MK07YKr8ys","MmsIopmeCd","OxWIHpvgjS","i3pydFFDui","I7p2aLDk6f","s93MlUl4a1","2hEEUkB5nP","DLhzM8cVD3","CNHmvuLtKs","EOE1oaDGtS",
+"faHirSs0Zu","jSjS3Q6Lix","OxWIHpT8wu","lkMUAUmaEv","UlU3MxReec","prNT6s4786","fLNg87fsYM","LDk6fdQ586","FVMxoXyPZN","i7WMQgjUTu",
+"FnPFBZ4I1v","0h1b1bgJAz","djsrvGWqqX","9eoRcoQ87r","Zv7z0X6Pin","RACujIRh48","Kr8ysAIYUu","uvf7A4dEz6","CxVEfsx5Gl","cShY2zHF1q",
+"BCxeCfcJOy","FjHXRFFDui","AXpwEPb1pa","Y1mC0ECMvU","W7cTshUTw7","StlDJ5Drn0","tvdkD5iGN5","kZANmuZPqg","TCgPpUvlv4","9GXkX48cHL",
+"0Kyfsulk41","NOHsz2Nslm","QworuMmKGJ","BbwgAAIYUu","ZzJHWMmsIo","7X3uylViBv","cQOnv64s8N","DG4sTd7vjM","b29RJOz8yZ","OUqFMIBe8k",
+"F6PT2WPmlx","s4786UmaEv","QClRLSmGzv","t59lRAkKTk","QssNCWaWsv","tlILtuTacx","LewvM3otm6","O3iyQx3LDe","dQ586O3iyQ","i7WMQsx5Gl",
+"0KyfsS77LH","FNYIMFNYIM","ZzJHWVprf2","pFrrlTwano","d7vjMpT8wu","uAWyps93Ml","uQIczlpF6W","ru4UGogLgc","Ta8f6xXTI4","i3pydtl72W",
+"lkMUABbwgA","MmKGJ8RCUA","rKDLJrz7Ut","NAFuwKZamH","No0QbblLA9","WDVWJru4UG","2hEEUIn3NS","fmIK1Zv7z0","StlDJBbwgA","pv0i7DQimp",
+"ZuDtDGWqqX","VerEAZUnqt","zmLYDNcICA","uupzkiKqhr","pAhR1UmaEv","RBhp0dmoS7","gf8rIVerEA","7Ow5CVBjhz","8RCUAoGu6x","Ss0Zuaez9y",
+"X6PinThjNn","WMiS31v5hH","7Ow5CFjHXR","M6qcG3otm6","NhXduGWqqX","FFDui2DREs","SWfouVLTy6","AOgEe14FLR","RzaZAMkgy8","No0QblkMUA",
+"atef2rz7Ut","W7cTs1j5L8","gf8rI2Yz7E","8TxD7VerEA","Dz1R3Ta8f6","3weIFzqH0W","DLhzMuupzk","dhSuHKZamH","AXpwEWaWsv","618DiSWfou",
+"0Wr5yMK07Y","29QAzrhl0J","Zv7z0uoStw","7Ow5CsqVrf","uAWyplsQGo","soy9tFVMxo","AgJHQtaOXK","okgRipv0i7","WMiS3X6Pin","IjTwPgf8rI",
+"oVQp6uAWyp","rhl0JpmeCd","9GXkXgjUTu","FLsphxReec","jeskSgtCA5","UlU3MFwEJz","ReKEWNxx9V","CIShG2TRI7","ulk41l83Ud","RACujlsQGo",
+"gf8rIS2Dfu","LDk6f9XyT9","i7WMQv2eC3","i3pydy94nw","M6qcGHfyNQ","Rxrsmgf8rI","TXQ0Zatef2","9y4lwiwzGk","48cHLuoStw","55rfBt98iW",
+"hi5X7YOfrY","9iGoTYjB9t","t98iWzz4ZU","nlaBye6e4z","xciqpHP433","EdBKcsx5Gl","9eoRc1LB1L","Q6hMCF6PT2","CxVEfZhwG1","QChxsChuy3",
+"iwzGkOz8yZ","OHaBzUvlv4","GWqqX5nmWv","JkzUnXyPZN","9XyT9FFDui","hUTw7Twano","wiHrZEoToP","618DiECMvU","0ao3lD6rBy","jtn0XGv3Fq",
+"t98iW9GXkX","HzZT8uAWyp","580YDZJTXH","fqypyiqv4k","Oz8yZsoy9t","yofH3t98iW","MGlTFpFrrl","5Namms4786","ksJbyuJScX","v2eC3lj07Q",
+"BCxeCUlU3M","KZamHfcJOy","SmGzvnnP8o","t98iW2Yz7E","uN6r3ni2v1","WMiS3W7cTs","7ku1p9iGoT","pmeCdECMvU","OHaBzMGlTF","29QAzcQOnv",
+"v2eC3jtn0X","ydG8U45cIH","d7vjMSmGzv","M6qcGydG8U","Kr8ys6q6L9","WMiS3lCMxy","ru4UG4dEz6","8FmFHQWxoT","POUYSlm0pD","Yh1hFQ6hMC",
+"x3LDeyofH3","P6bcgQssNC","3otm68cVD3","JRJQBdmoS7","45cIHZ4I1v","KZamH07n1c","5iGN59XyT9","ni2v1CqqaD","HlUbFTa8f6","n1pmOFnPFB",
+"Yh1hF0YAGH","AgJHQvkCHH","5iGN5gtCA5","B3qempvgjS","Zv7z0CK5W7","0MR5X4dEz6","fqypyFhtgl","xciqp8TxD7","WDVWJJXljW","v8yFNuN6r3",
+"AOgEeAmdQd","AkKTkiKqhr","s7MxkRBhp0","WmadABGaQY","TCgPpZJTXH","m4bxU8FmFH","azIWppAhR1","yluBxa00b5","lpF6WuZPqg","OUYuFHlUbF",
+"ECMvUFwEJz","uZPqggIYvE","Gv3FqK20wK","FjHXRZv7z0","6AFT0lkMUA","07n1c8hJdt","lXFOB4QMc9","djsrvHlUbF","atef2y94nw","FNYIM1v5hH",
+"O3iyQni2v1","9y4lwuPX7G","jtn0XRACuj","uTacxsqVrf","W3VFHcL0aE","l83UdVIlwP","y94nwBFkb8","lkMUAn1pmO","FLsphNAFuw","x3LDe0Wr5y",
+"hi5X7uTacx","y94nwt98iW","kB5nPt59lR","9eoRcdpe1v","jSjS3JRJQB","8U2nURzaZA","JJs5mRzaZA","lsQGoMmKGJ","2TRI7gIYvE","ZuDtDCNHmv",
+"0BmCyWaWsv","RBhp09rlg9","2DREs5nmWv","nFqikrhl0J","S2DfuciuWz","fqypyVNCPd","Ul4a1fcwDa","zHF1qzY1GY","ReKEWgdQsS","hUTw7S2Dfu",
+"G1RhSXflUq","14FLRlsQGo","atef2wiHrZ","MezSWjiVBP","euZA5o8Uyd","8RCUAAIYUu","7ku1pRACuj","VBjhz2DREs","lj07QX6Pin","dhSuH5Mg9r",
+"gf8rITXQ0Z","NcICAt59lR","dQ58616lHc","Gv3FqUmaEv","HzZT8pT8wu","Y1mC0sqVrf","hSSvQNhXdu","Mkgy8t59lR","sqVrfzz4ZU","1v5hH580YD",
+"gdQsS1j5L8","iKqhrhSSvQ","AXpwEP6bcg","2NslmWPmlx","piJSk0PktI","WaWsvAgJHQ","iKqhrO3iyQ","QYxC0ix74r","WDVWJ9y4lw","Zv7z0bgJAz",
+"Yw2oUlCMxy","9XyT9jSjS3","No0QbXyPZN","lCMxyhSSvQ","zY1GYIjTwP","prNT6he9IA","48cHLv2eC3","aez9yAXpwE","P6bcgDz1R3","FFDuimz8gx",
+"8cVD3F6PT2","AmdQdatef2","ZJTXHPYBf4","aL6AJpWiOs","QbxXcUvlv4","NOHszs4786","KsjRK8hJdt","0h1b18U2nU","HlUbFAOgEe","okgRiFhtgl",
+"t98iWHlUbF","SjskQaez9y","zbIYYpmeCd","JKWYR5Namm","faHirW3VFH","tlILtTCgPp","0YAGHhSSvQ","azIWpQ6hMC","o8UydaL6AJ","iB08ljfREu",
+"s93MlWmadA","FFDuiTXQ0Z","uupzkIRh48","2ZHdkYjB9t","64s8NQ6hMC","zHF1qSbRYy","14FLRKsjRK","B3qemF6PT2","NAFuw29QAz","POUYSPYBf4",
+"lXFOBlkMUA","Dz1R34W0Tl","RzaZAvkCHH","fFDrJyluBx","bZLvSIBe8k","HRxd85Mg9r","8U2nUlpF6W","suY4xl83Ud","CxVEfHlUbF","0KyfsAIYUu",
+"0PktIjeskS","0MR5XVerEA","o8UydfaHir","ulk41ni2v1","2NslmlViBv","Nxx9VpWiOs","16lHcGXdoH","Dz1R3e6e4z","lViBvaez9y","lkMUAuAWyp",
+"sqVrfMGlTF","k85Ae1v5hH","U3yw5Ta8f6","DG4sTJJs5m","In3NSzbIYY","pv0i7iB08l","LDk6fokgRi","IRh48RACuj","LbRTHlViBv","CIShGbrhlQ",
+"48cHL8hJdt","BbwgAQnJ1S","ix74rJJs5m","07n1ctAOsr","S77LHvkCHH","OHaBzBCxeC","M3zXLKZamH","ix74ruQIcz","ZhwG1BCxeC","QbxXcWDVWJ",
+"FxX9qAIYUu","Q6LixDG4sT","UlU3MNhXdu","nlaBy3weIF","LbRTH8cVD3","S77LHWPmlx","JXljWZzJHW","fcJOyuQIcz","uN6r3oQ87r","ZhwG1In3NS",
+"iqv4kS77LH","hYBCKtl72W","S77LHpWiOs","o8Uyd8hJdt","8xEKzblLA9","sqVrfhe9IA","uLtKss4786","yToGWdjsrv","rz7UtCp3mZ","zY1GY9y4lw",
+"MojnPpT8wu","I7p2agdQsS","IKxdLprNT6","7fKYU64s8N","zz4ZUtl72W","zbIYYnFqik","8FmFHChuy3","7fsYMv8yFN","gdQsSAOgEe","Mm8siIRh48",
+"5Mg9rCqqaD","MK07Y1LB1L","5iGN5BbwgA","IKxdLC2Irc","lH1ktNxx9V","JIqXiy94nw","B3qems93Ml","RACujQClRL","gIYvEQworu","o8Uyd0Wr5y",
+"Chuy32Yz7E","v8yFNBFkb8","uAWypFhtgl","JJs5mwiHrZ","8RCUAtuDyS","M6qcGBpYhV","k85Ae4W0Tl","8hJdtD6rBy","v2eC3Chuy3","ru4UGUlU3M",
+"HlUbFhUTw7","9GXkXRxrsm","fLNg8Yh1hF","VerEAlj07Q","GWqqXIKxdL","v1HlnFcWrW","Ta8f6Kr8ys","y94nw7fKYU","HP433lsQGo","Chuy39GXkX",
+"hUTw7TXQ0Z","euZA5cQOnv","soy9tZJTXH","lXFOBzqH0W","7hyVvpiJSk","D6rBy2ZHdk","oQ87rJIqXi","QClRLn8pJ9","aDGtSLDk6f","nnP8oDQimp",
+"HlUbFxciqp","VNCPdFwEJz","8hJdtFGzgp","zqH0Wzz4ZU","hi5X7EOE1o","he9IAgdQsS","qaofNPb1pa","Yw2oUfFDrJ","pv0i7uPX7G","Ss0ZuKASQ8",
+"Cp3mZb29RJ","VBjhzMojnP","MmsIoWaim6","0BmCyG1RhS","soy9tW7cTs","8FmFHNcICA","JXljWQClRL","FhtglaL6AJ","POUYS6q6L9","ZJTXHrKDLJ",
+"POUYSnFqik","IBe8kAgJHQ","W3VFHlm0pD","RkQkeWmadA","WPmlxCdyBV","KASQ8n1pmO","CdyBVXflUq","lj07QCK5W7","Cp3mZaez9y","7fsYMjiVBP",
+"ZuDtDRpBQm","14FLR3otm6","KZamH6AFT0","Mkgy8Mm8si","MmsIoGSQwj","Q6hMCv2eC3","LewvMQ6hMC","uQIcz2Nslm","fcJOyJJs5m","blLA9kB5nP",
+"piJSkv8yFN","tl72WQssNC","fqypyzY1GY","uvf7AAmdQd","NAFuwKr8ys","tvdkDrKDLJ","vkCHH14FLR","QworuFjHXR","lweGy29QAz","JJs5mCxVEf",
+"zFgtBb29RJ","TCgPppFrrl","uQIczX6Pin","QChxsAgJHQ","faHiruPX7G","WPmlxGrDg7","mX2GEcmXIX","2TRI7lweGy","FPfSEtvdkD","9XyT9VerEA",
+"jS1ajTXQ0Z","0ao3lVjCZq","faHira00b5","ZJTXHSjskQ","lH1ktnlaBy","MaJQs2DREs","OHaBzW7cTs","5drc6n8pJ9","JJs5mFVMxo","wiHrZRkQke",
+"XflUqJkzUn","9GXkXQbxXc","7fKYUcShY2","In3NShUTw7","Q6LixyvOMI","MezSWfLNg8","pT8wufmIK1","uJScXiqv4k","lH1ktQnJ1S","d85a9zqH0W",
+"aDGtSNcICA","fLNg8FwEJz","MojnPFLsph","5Drn0EoToP","FnPFB0MR5X","FNYIMK20wK","NhXduzY1GY","9rlg95nmWv","5IhmGvkCHH","uZPqgTCgPp",
+"618DiY1mC0","y94nwIn3NS","L7cGclpF6W","aL6AJ2hEEU","In3NSCp3mZ","2TRI7euZA5","M6qcGGSQwj","qQxHPP6bcg","OHaBzFjHXR","o8Uydtl72W",
+"BFkb8tuDyS","a00b5FNYIM","K20wKTwano","QbxXclH1kt","QChxsW7cTs","RmDcrFPfSE","MaJQspv0i7","jtn0Xlj07Q","MmsIoAkKTk","4W0TlCK5W7",
+"AIYUuRmDcr","RsQUqBGaQY","K4GS8uAWyp","Dz1R3pv0i7","QClRLLewvM","0Wr5yEdBKc","KZamH7X3uy","S2Dfu2DREs","xXTI4fLNg8","DLhzMNhXdu",
+"WreyPxXTI4","TCgPpv1Hln","Uvlv42ZHdk","yvOMIWmadA","ciuWzRmDcr","IKxdLU3yw5","FhtglNcICA","No0QbOHaBz","2TRI7uQIcz","djsrvJKWYR",
+"QssNCBCxeC","faHir7fKYU","d7vjMn1pmO","Oz8yZ2Nslm","7fKYUStlDJ","7ku1ppWiOs","i3pydvkCHH","ZJTXHCqqaD","2hEEU0BmCy","MezSWiwzGk",
+"AIYUu5iGN5","rhl0Jx3LDe","a00b5StlDJ","W7cTsnFqik","uupzk55rfB","t59lRuupzk","kB5nP48cHL","s93MlWDVWJ","0BmCy48cHL","djsrvhYBCK",
+"uZPqgdpe1v","NcICA5IhmG","gf8rIQssNC","QworuVjCZq","vOqCEZv7z0","iqv4kjiVBP","4dEz6Q6hMC","8hJdt1j5L8","rhl0JDG4sT","jzUqRdpe1v",
+"uoStw5VZjS","2hEEULDk6f","Z4I1v0h1b1","aL6AJReKEW","EOE1oeuZA5","BGaQYpWiOs","fcJOylCMxy","5NammgtCA5","AOgEeQChxs","o8UydlXFOB",
+"WreyPiwzGk","hYBCKS77LH","KASQ8rhl0J","aFFss9y4lw","14FLRjfREu","7hyVvVLTy6","gjUTulViBv","uTacxyEfy9","JJs5m64s8N","HfyNQEdBKc",
+"FxX9qx3LDe","Twano9rlg9","h1zcHaez9y","nFqikqQxHP","SWfouPb1pa","l83UdIjTwP","zqH0Wuvf7A","MaJQs45cIH","5Mg9rqUJMd","CIShGaL6AJ",
+"29QAzJRJQB","QYxC00MR5X","rKDLJ4dEz6","ni2v1Gv3Fq","SmGzvwiHrZ","Yh1hFM3zXL","2ZHdkuoStw","TCgPphE1Ql","lViBv9XyT9","ogLgcmX2GE",
+"QworuF6PT2","0PktIfLNg8","XflUqW3VFH","CIShG618Di","HP433EoToP","CK5W7d85a9","zmLYDQWxoT","tuDySEOE1o","QnJ1SlsQGo","zY1GY7ku1p",
+"lkMUAReKEW","FLsphfaHir","hi5X7fFDrJ","piJSkM6qcG","yEfy9NOHsz","n1pmOhUTw7","suY4xuJScX","Pb1paMK07Y","gdQsSzQt6Q","YjB9tdQ586",
+"7X3uygIYvE","5iGN5LDk6f","MezSW1j5L8","n8pJ9FnPFB","uvf7Azz4ZU","vOqCESbRYy","G1RhSSs0Zu","Z4I1vW7cTs","WDVWJqUJMd","XyPZNtlILt",
+"DQimpBCxeC","WPmlxfLNg8","qaofNJkzUn","t59lRjeskS","oQ87r8RCUA","IjTwP1v5hH","YjB9tTCgPp","Dz1R3prNT6","2TRI7azIWp","gdQsScQOnv",
+"0MR5XW7cTs","0Wr5yfaHir","OHaBzJ2mQi","Z4I1vEoToP","FxX9qFGzgp","hUTw7pT8wu","aFFssQ6Lix","wDajXKr8ys","brhlQJKWYR","JRJQBPYBf4",
+"gjUTuLbRTH","taOXKRmDcr","NOHszNcICA","9rlg9Ul4a1","FwEJzY1mC0","zFgtBi3pyd","l83Udtl72W","FhtglBCxeC","k85AeiKqhr","ydG8UVprf2",
+"5NammaDGtS","atef2SjskQ","2ZHdkQChxs","RkQkeReKEW","ZUnqtd85a9","xXTI4F6PT2","lCMxyaez9y","k85Ae5iGN5","QbxXczQt6Q","y94nwiB08l",
+"uupzkyEfy9","fcJOydhSuH","VBjhzWreyP","Ul4a1Pb1pa","BbwgAVerEA","FFDuihe9IA","0Wr5yQssNC","IKxdLQ6hMC","lViBvyToGW","y94nwKr8ys",
+"4QMc964s8N","Gv3Fq4dEz6","pAhR12Yz7E","BGaQYa00b5","55rfBIRh48","7X3uyAmdQd","lViBv5Drn0","tvdkD5ZaEz","fcwDaRsQUq","qaofNCNHmv",
+"uZPqglpF6W","X6PinSs0Zu","VLTy6KsjRK","LDk6fe6e4z","rz7Utl83Ud","9XyT90Kyfs","djsrvgIYvE","cShY2QbxXc","AIYUu16lHc","gIYvEFLsph",
+"jtn0XvOqCE","6AFT0iqv4k","fcJOygdQsS","aDGtSzY1GY","O3iyQBGaQY","uPX7GMkgy8","d85a9d85a9","x3LDeZv7z0","nlaByhUTw7","FhtgliwzGk",
+"1j5L8EoToP","2Yz7E2TRI7","UlU3MbZLvS","faHirG1RhS","vLsmSv1Hln","MK07Yhe9IA","gjUTupmeCd","ThjNnpvgjS","ThjNnMmKGJ","uTacx9eoRc",
+"QYxC0MaJQs","pvgjSpT8wu","ogLgcpWiOs","VLTy6VerEA","faHirI7p2a","prNT63weIF","wDajXCp3mZ","OUqFMGSQwj","YOfrYzHF1q","AXpwEyofH3",
+"fcJOyjfREu","5drc6hUTw7","IRh488hJdt","0KyfspvgjS","dmoS7RmDcr","ZhwG18RCUA","suY4xIn3NS","29QAzlj07Q","d85a96q6L9","h1zcHs93Ml",
+"BGaQYogLgc","xXTI4Y1mC0","LDk6fNAFuw","AgJHQGv3Fq","7fKYUtl72W","AIYUujiVBP","B3qemt98iW","gjUTuEoToP","pFrrlmz8gx","iKqhrBbwgA",
+"OHaBzkZANm","Ta8f6s4786","oQ87rjS1aj","aFFssLDk6f","OUqFMDcpWB","55rfBlweGy","AkKTkiqv4k","FcWrWciuWz","4W0TlNxx9V","tvdkDAkKTk",
+"hi5X7QClRL","W3VFHlpF6W","BCxeCuJScX","nFqikv8yFN","EOE1ozFgtB","Zv7z0IBe8k","zFgtBAmdQd","QYxC0ReKEW","o8UydWDVWJ","HzZT8ZzJHW",
+"0h1b1xXTI4","aFFssOxWIH","UlU3MyofH3","ZzJHWWPmlx","hSSvQ0PktI","jSjS3djsrv","G1RhS55rfB","4QMc9mX2GE","KZamHzz4ZU","tl72WaL6AJ",
+"x3LDe7Ow5C","29QAzYw2oU","s93Ml9y4lw","mz8gxyluBx","fLNg8MGlTF","EoToPvkCHH","MezSWUlU3M","6q6L95Mg9r","taOXKM6qcG","i7WMQ1v5hH",
+"Nxx9VtuDyS","AOgEeBpYhV","atef255rfB","2Nslmni2v1","xciqp1LB1L","9GXkXX6Pin","kZANmyToGW","lj07Qlj07Q","FxX9qMm8si","lj07QKr8ys",
+"d85a9FLsph","RsQUqChuy3","faHir45cIH","Yw2oULDk6f","MaJQsqUJMd","ix74rNxx9V","IjTwPFVMxo","jtn0XU3yw5","piJSkfLNg8","bgJAzAOgEe",
+"yvOMIzqH0W","MK07Ys4786","MmKGJ6q6L9","okgRigjUTu","lH1kt6q6L9","Cfgr3qQxHP","WaWsviwzGk","MGlTF8cVD3","xciqpcL0aE","blLA9tlILt",
+"MGlTFdpe1v","5ZaEzzbIYY","NOHsztjQxs","pT8wuiB08l","Dz1R3JkzUn","RmDcrYh1hF","dhSuH618Di","cmXIXzmLYD","hi5X7aFFss","BCxeCjtn0X",
+"0MR5XrKDLJ","hUTw7XflUq","CqqaDatef2","LbRTHQYxC0","K4GS8FjHXR","pvgjSQbxXc","jSjS3EOE1o","jSjS3ZzJHW","qUJMd1v5hH","zz4ZU1v5hH",
+"iwzGkU3yw5","pmeCd1j5L8","RpBQmFhtgl","lkMUAjiVBP","W3VFHVerEA","FNYIMsoy9t","SmGzvKr8ys","rz7Utm4bxU","CNHmvblLA9","JKWYROHaBz",
+"2Nslmlm0pD","l83Ud29QAz","AkKTkvOqCE","gf8rIyToGW","CdyBVNhXdu","ksJbyTXQ0Z","cShY2FwEJz","ydG8Uv8yFN","7hyVvt59lR","uoStwJkzUn",
+"s93MlsuY4x","gjUTuRACuj","K20wKaL6AJ","aez9yfcJOy","HlUbF7Ow5C","fmIK1v2eC3","QnJ1SFFDui","9iGoTGv3Fq","CdyBVNcICA","uupzktlILt",
+"Gv3FqPOUYS","tl72W9GXkX","0ao3lJkzUn","OUqFMs4786","i3pydqUJMd","KASQ855rfB","sqVrfRkQke","XflUqWaWsv","RACujMojnP","Q6hMCzY1GY",
+"uQIczzbIYY","djsrvWMiS3","P6bcghUTw7","pv0i7VLTy6","NOHszAIYUu","VNCPd0h1b1","Vprf2fcwDa","VBjhzzFgtB","W7cTsulk41","fcwDaaFFss",
+"AXpwEydG8U","XflUq6AFT0","oQ87rn1pmO","JKWYRXflUq","ydG8UoQ87r","1v5hHmX2GE","hYBCKfcJOy","QssNC9GXkX","L7cGcIKxdL","8hJdtZUnqt",
+"NOHszyofH3","Mm8sifcJOy","WreyPCxVEf","ciuWzoVQp6","YjB9tciuWz","No0QbL7cGc","faHir9GXkX","POUYSBpYhV","POUYSIjTwP","45cIHDcpWB",
+"aFFssciuWz","Kr8ys8TxD7","1v5hH2hEEU","zQt6QqaofN","rhl0JtuDyS","JKWYRGv3Fq","WMiS3I7p2a","4QMc9t59lR","UlU3MQClRL","SmGzvQ6Lix",
+"0h1b129QAz","faHirjfREu","aL6AJ7Ow5C","TXQ0ZCxVEf","xXTI4618Di","P6bcg2Yz7E","pFrrlb29RJ","Dz1R3Ul4a1","BCxeC8TxD7","NhXduK20wK",
+"uQIczGXdoH","ZhwG1OUqFM","PYBf4BFkb8","9GXkXt98iW","IjTwPprNT6","a00b57fKYU","qUJMdguMb8","RxrsmyvOMI","yofH3n8pJ9","Pb1paQ6Lix",
+"Yf2EcQ6hMC","14FLRQ6hMC","lkMUAEOE1o","KsjRKiqv4k","CxVEfThjNn","9XyT9M6qcG","suY4xRkQke","lViBvKZamH","RsQUqsx5Gl","fmIK1X6Pin",
+"a00b5djsrv","KsjRKOUYuF","uoStwlj07Q","a00b57fsYM","0PktI7ku1p","djsrv8FmFH","b29RJTa8f6","0ao3lwiHrZ","MGlTFYh1hF","d85a9o8Uyd",
+"nFqikt59lR","prNT6Cp3mZ","DLhzMMmsIo","FVMxoU3yw5","uN6r3oVQp6","RmDcrBbwgA","EoToP5Mg9r","piJSklj07Q","XyPZNdhSuH","zbIYY5VZjS",
+"NAFuw1LB1L","taOXK0YAGH","Ul4a1uQIcz","SjskQLDk6f","0ao3lkB5nP","NhXduPOUYS","HP4335IhmG","2TRI7uLtKs","Y1mC0580YD","WaWsvy94nw",
+"hSSvQ3weIF","zbIYYEoToP","ThjNnlm0pD","soy9tdQ586","Dz1R3RBhp0","brhlQyluBx","LDk6f2Nslm","YOfrYoVQp6","wDajXuPX7G","CdyBV29QAz",
+"5iGN5lweGy","gtCA5RpBQm","iwzGkX6Pin","PYBf4ThjNn","taOXKdjsrv","nnP8oru4UG","S2DfuCIShG","Ta8f6iqv4k","hi5X70PktI","7fsYMFjHXR",
+"14FLR1j5L8","VBjhz1j5L8","FwEJzDQimp","okgRiThjNn","AkKTk9rlg9","RmDcrBGaQY","i3pyd5Drn0","atef2Q6hMC","J2mQiRkQke","jSjS3CdyBV",
+"tjQxsprNT6","tjQxsJKWYR","8TxD7RACuj","B3qem45cIH","0h1b17hyVv","QssNCYw2oU","faHirqUJMd","l83UdbrhlQ","BFkb8zFgtB","DG4sTUmaEv",
+"hUTw7QChxs","ZuDtDhYBCK","pAhR1ReKEW","DcpWBt59lR","JIqXiL7cGc","9eoRc7fKYU","NOHszpmeCd","BGaQYGrDg7","RkQke1LB1L","jzUqRgf8rI",
+"24ARFFLsph","lj07Qe6e4z","RmDcrMmsIo","1v5hHWaWsv","aDGtSyofH3","HP433ydG8U","Yf2Ecrz7Ut","X6PinMkgy8","Chuy3iqv4k","gIYvEqUJMd",
+"WaWsvuPX7G","uJScXOz8yZ","y94nwQbxXc","5drc6K4GS8","7fsYMRzaZA","bZLvS4QMc9","Rxrsmix74r","X6PinU3yw5","NcICA5drc6","RsQUq5VZjS",
+"lH1kt29QAz","07n1cMmsIo","QWxoTXyPZN","FjHXRlkMUA","ZuDtDHzZT8","sx5GlThjNn","LDk6fazIWp","m4bxUx3LDe","QWxoTQworu","YjB9tGrDg7",
+"iwzGkOHaBz","HlUbFvkCHH","I7p2azFgtB","bZLvSgIYvE","Twanojtn0X","Gv3FqzbIYY","MmKGJuvf7A","5Mg9rWMiS3","aL6AJdQ586","VLTy6fcJOy",
+"7hyVv8RCUA","KsjRKJkzUn","BpYhV7fsYM","LbRTHXyPZN","8cVD3NcICA","gjUTupWiOs","qQxHPFcWrW","hE1QlBpYhV","LewvM0Wr5y","G1RhSFhtgl",
+"IBe8k9rlg9","zmLYDfqypy","IBe8kMm8si","45cIHWPmlx","HP433NcICA","xReecP6bcg","580YDZ4I1v","lweGyQssNC","i3pydtjQxs","J2mQiQYxC0",
+"MojnPwiHrZ","CxVEfuPX7G","UlU3MoVQp6","zmLYDYf2Ec","dpe1vlj07Q","HfyNQBCxeC","uLtKsfLNg8","LDk6foVQp6","NcICA580YD","aL6AJZUnqt",
+"l83Ud4W0Tl","jzUqRm4bxU","uTacxe6e4z","VIlwP7Ow5C","uPX7G14FLR","xReeczmLYD","8cVD3tvdkD","WaWsvni2v1","Q6Lixgf8rI","DcpWBlm0pD",
+"n1pmOpiJSk","pT8wuzqH0W","nlaByTwano","AOgEeyEfy9","zQt6Q29QAz","wDajX0ao3l","guMb8hSSvQ","pT8wu0Wr5y","yEfy9v1Hln","t98iWGWqqX",
+"zHF1quupzk","VerEAGWqqX","JRJQBKASQ8","GXdoHzmLYD","v1HlnuoStw","DG4sTuJScX","GWqqXydG8U","07n1ccmXIX","VerEAQworu","AgJHQuvf7A",
+"WDVWJK20wK","1LB1LHzZT8","IBe8kuoStw","Cp3mZDG4sT","FcWrWGXdoH","zFgtBl83Ud","5ZaEz16lHc","7fsYMJJs5m","5iGN5aez9y","ogLgcAmdQd",
+"7ku1plj07Q","9XyT9DQimp","JIqXi9eoRc","XyPZNyvOMI","RkQke7fKYU","hE1QlMkgy8","DcpWBIjTwP","m4bxUCfgr3","9XyT9m4bxU","HzZT8ulk41",
+"5ZaEzQ6Lix","uAWypjS1aj","jtn0XQClRL","pvgjSHP433","5nmWvAkKTk","MK07YFnPFB","YjB9tpvgjS","fcwDaiqv4k","Kr8ysUl4a1","aDGtSFnPFB",
+"VBjhzMm8si","blLA9uTacx","0BmCyW7cTs","ksJbyS2Dfu","0MR5XB3qem","I7p2amX2GE","9iGoT8cVD3","pAhR18hJdt","Vprf2J2mQi","djsrvQbxXc",
+"fmIK1s7Mxk","Zv7z02Yz7E","BbwgAVNCPd","W3VFHSWfou","2ZHdkOUYuF","m4bxULDk6f","d7vjMlweGy","Cfgr3YOfrY","9y4lwKr8ys","tjQxsuvf7A",
+"StlDJs93Ml","Cfgr307n1c","y94nwRzaZA","AXpwE2hEEU","LewvMRkQke","s4786pWiOs","Ul4a1FjHXR","M3zXLtaOXK","2ZHdkZ4I1v","1LB1LpWiOs",
+"9iGoTWPmlx","ReKEWi3pyd","Fhtgl2DREs","piJSkxReec","PYBf4NhXdu","i3pyd6q6L9","uTacxC2Irc","618Dii7WMQ","qQxHPZ4I1v","fmIK1ZJTXH",
+"0MR5XNxx9V","gIYvECqqaD","v8yFN4QMc9","soy9t8cVD3","JXljWxXTI4","QssNCuN6r3","2DREsIn3NS","lm0pDFwEJz","tAOsrMm8si","W7cTs5drc6",
+"X6PinlpF6W","yluBx48cHL","FcWrW6AFT0","suY4xqQxHP","gIYvEgf8rI","CxVEfSjskQ","MojnPvOqCE","Yf2EcZ4I1v","L7cGcX6Pin","k85Aetl72W",
+"SWfouaFFss","qQxHPeuZA5","uTacxVjCZq","7ku1pC2Irc","9GXkXx3LDe","fFDrJv1Hln","xReecWaWsv","5nmWvzHF1q","qaofNv2eC3","uJScXJkzUn",
+"mX2GERzaZA","0Wr5yDz1R3","hYBCK3otm6","5NammS77LH","S77LH7lUXZ","euZA5RACuj","Chuy3AkKTk","t59lRHlUbF","vkCHHhUTw7","l83UdMkgy8",
+"d7vjMuJScX","8FmFH2TRI7","FNYIMIjTwP","4dEz6EoToP","Oz8yZIRh48","xReecUl4a1","DLhzMCNHmv","lj07Q14FLR","yluBxuTacx","FVMxoogLgc",
+"uQIcz5Namm","a00b5faHir","48cHLWmadA","QnJ1SwiHrZ","8xEKzLewvM","pv0i7zbIYY","VIlwPn8pJ9","5drc65ZaEz","b29RJGv3Fq","0Wr5yG1RhS",
+"7X3uyrhl0J","5Mg9r7ku1p","VerEAVNCPd","KASQ80PktI","1j5L81j5L8","iB08lP6bcg","ECMvUlpF6W","NhXduBCxeC","CqqaDx3LDe","JJs5md85a9",
+"dQ586AgJHQ","StlDJKr8ys","yofH32Yz7E","5IhmGIn3NS","FNYIMLewvM","iKqhrOz8yZ","07n1cWaWsv","BbwgAn1pmO","F6PT20h1b1","soy9tcShY2",
+"SbRYyZv7z0","I7p2ae6e4z","d7vjM9iGoT","FcWrWHP433","618DieuZA5","uN6r3zQt6Q","M6qcGv2eC3","CNHmvMmKGJ","JXljWL7cGc","VLTy6Ul4a1",
+"VIlwP9y4lw","Mkgy8X6Pin","WmadAhUTw7","cShY2lCMxy","aez9yuvf7A","JIqXi1j5L8","a00b5ZJTXH","atef2NhXdu","yofH3X6Pin","gjUTu5nmWv",
+"W3VFHtl72W","jzUqRKASQ8","cmXIXciuWz","7X3uyBCxeC","d85a9NcICA","euZA5lkMUA","uJScXxXTI4","lkMUAxXTI4","EdBKccL0aE","JIqXiFGzgp",
+"pAhR1MezSW","QChxsfLNg8","tl72WuJScX","HP433Cp3mZ","uLtKsFLsph","guMb8m4bxU","AXpwEIRh48","taOXKCp3mZ","ZzJHWzY1GY","lXFOBzmLYD",
+"Nxx9VJIqXi","OUqFMCdyBV","wDajX5Namm","gdQsS7Ow5C","9rlg9qQxHP","WreyP8FmFH","D6rBypv0i7","JkzUnFxX9q","gIYvEsoy9t","s7MxkBbwgA",
+"n8pJ9JkzUn","Uvlv4Fhtgl","D6rByt59lR","2Yz7EZv7z0","5Mg9r5ZaEz","fqypypT8wu","5iGN5atef2","MK07Y0Kyfs","dmoS7nlaBy","Ss0ZuWaWsv",
+"Chuy3HzZT8","PYBf4Yh1hF","JIqXiIn3NS","U3yw5I7p2a","hi5X7djsrv","CK5W7lm0pD","k85AeIn3NS","iKqhrDQimp","DLhzMRmDcr","CIShGuvf7A",
+"lkMUAOHaBz","b29RJHP433","yvOMIQ6hMC","Pb1pa9eoRc","d85a9Z4I1v","zqH0WbZLvS","O3iyQhYBCK","ksJbyv1Hln","yEfy9i7WMQ","BpYhVQworu",
+"Yh1hFAmdQd","L7cGc5IhmG","d85a9tAOsr","oVQp6FwEJz","JIqXiWaim6","iwzGkix74r","pAhR1VjCZq","ksJbyM3zXL","45cIHydG8U","PYBf4FPfSE",
+"AmdQdGrDg7","55rfBAXpwE","b29RJRmDcr","OUYuFlpF6W","vkCHHgdQsS","AIYUuK20wK","fLNg88FmFH","tAOsrkB5nP","EdBKcK20wK","S77LHtl72W",
+"pmeCdCK5W7","jfREuAmdQd","5ZaEzlj07Q","pAhR1uPX7G","uvf7ApWiOs","S77LHuAWyp","xXTI4HRxd8","hSSvQFFDui","nlaByOxWIH","mX2GEF6PT2",
+"lViBvuJScX","CdyBVv1Hln","taOXKNxx9V","MojnPpAhR1","pvgjSMmKGJ","uupzkgf8rI","Mm8siO3iyQ","6AFT0O3iyQ","gf8rIjfREu","AOgEeMmKGJ",
+"1j5L8Mkgy8","UlU3MjzUqR","Twano8RCUA","yofH3l83Ud","WMiS35Namm","5iGN52Nslm","WreyPJKWYR","8U2nU0ao3l","3weIF0YAGH","UlU3MIjTwP",
+"UmaEvqQxHP","ydG8Ui3pyd","xXTI4kB5nP","HP433PYBf4","Dz1R3HlUbF","jtn0XcL0aE","NhXdu6AFT0","L7cGcogLgc","WmadA24ARF","fLNg8k85Ae",
+"WaWsvs7Mxk","Ul4a1lweGy","FPfSEFVMxo","1v5hHni2v1","7X3uybgJAz","yofH39y4lw","zY1GYgjUTu","iqv4kpiJSk","tAOsrSbRYy","IKxdLqaofN",
+"dpe1vpmeCd","zmLYDIjTwP","MaJQs9GXkX","3weIFQ6Lix","okgRioVQp6","Cfgr3uupzk","AkKTk9y4lw","pWiOsrz7Ut","lm0pDW7cTs","dhSuH7lUXZ",
+"ulk41piJSk","ZUnqtzz4ZU","blLA9L7cGc","7fKYUcQOnv","WDVWJ0h1b1","uPX7G55rfB","FLsph07n1c","FLsphqUJMd","AOgEeVNCPd","gf8rIpmeCd",
+"Cfgr3jiVBP","n8pJ9i7WMQ","ZJTXHI7p2a","5IhmGhE1Ql","6AFT0AgJHQ","oQ87rOz8yZ","pWiOsRpBQm","yluBxazIWp","YOfrYxXTI4","HzZT8BGaQY",
+"fqypy4dEz6","1LB1LSs0Zu","PYBf4W3VFH","n8pJ9uQIcz","OHaBzTCgPp","y94nwd7vjM","sx5GlFjHXR","CK5W77Ow5C","OUYuFAOgEe","KZamHThjNn",
+"JIqXihe9IA","qUJMdQWxoT","JIqXiAOgEe","ix74rguMb8","ni2v1GXdoH","GXdoHJRJQB","aez9ySbRYy","AXpwEcShY2","yToGWs93Ml","fLNg86q6L9",
+"GXdoHoQ87r","OxWIHix74r","he9IAlsQGo","QssNCguMb8","HfyNQS2Dfu","y94nwJXljW","DLhzMQYxC0","d7vjMbgJAz","tlILtbrhlQ","1j5L8v8yFN",
+"FjHXRQ6Lix","AkKTkL7cGc","M6qcGJJs5m","aL6AJ580YD","HP433JIqXi","dmoS7jfREu","GWqqXv2eC3","2hEEUiKqhr","v8yFNyvOMI","HzZT87Ow5C",
+"DG4sTQ6hMC","i3pydQ6Lix","Yf2EcW7cTs","I7p2ayofH3","Dz1R3TCgPp","XflUqOz8yZ","rz7UtkZANm","Yf2EcazIWp","ZuDtDydG8U","QYxC0nlaBy",
+"PYBf4vOqCE","GrDg7CqqaD","iqv4kP6bcg","faHirYjB9t","YjB9tpWiOs","BbwgACxVEf","oQ87rBFkb8","TCgPph1zcH","dpe1vi3pyd","x3LDeBGaQY",
+"CK5W7yluBx","oGu6xokgRi","ECMvUOz8yZ","NAFuwLDk6f","HzZT8WMiS3","45cIHVIlwP","m4bxU5Drn0","AXpwEm4bxU","tlILtFxX9q","Ss0Zu7lUXZ",
+"ogLgc5iGN5","hYBCKX6Pin","t98iWLewvM","JkzUnzY1GY","ydG8UECMvU","WMiS35ZaEz","lpF6WRkQke","1j5L8lCMxy","FGzgpn8pJ9","WPmlxEoToP",
+"mX2GEzQt6Q","xReecVjCZq","MaJQsSWfou","JJs5mXyPZN","FjHXRv1Hln","pT8wueuZA5","GSQwj7ku1p","zbIYYuTacx","HfyNQReKEW","Chuy3i3pyd",
+"ECMvUuupzk","jeskSx3LDe","aL6AJFcWrW","jzUqRYOfrY","pT8wuuPX7G","tvdkDDG4sT","aFFssEdBKc","9y4lwGXdoH","ix74rxXTI4","RzaZA2TRI7",
+"DcpWBdpe1v","2Yz7ESWfou","CK5W7x3LDe","lsQGo0ao3l","DG4sT8hJdt","zz4ZU9y4lw","hUTw7Cfgr3","5ZaEzCp3mZ","taOXKRBhp0","MmsIoAOgEe",
+"QssNCzz4ZU","jeskSoQ87r","vLsmSzFgtB","6AFT05ZaEz","okgRiReKEW","7X3uySWfou","hUTw7Q6hMC","DG4sTo8Uyd","1j5L8k85Ae","s93MlnnP8o",
+"MmKGJuQIcz","kB5nPFwEJz","v8yFNVerEA","fmIK1hUTw7","v8yFNZuDtD","fcwDauQIcz","RBhp0ThjNn","7fsYMNAFuw","MmsIogtCA5","v1HlnDQimp",
+"LbRTHrKDLJ","QWxoTaL6AJ","K20wKUl4a1","C2IrcDcpWB","JRJQBLbRTH","v2eC3BpYhV","1v5hH5Namm","0h1b1d7vjM","fqypyjfREu","aFFss0YAGH",
+"tl72WX6Pin","Ss0Zu2ZHdk","0MR5XydG8U","ulk41ECMvU","lCMxyZuDtD","8TxD7QWxoT","pmeCdAgJHQ","9iGoTNcICA","I7p2aMm8si","AOgEeB3qem",
+"BCxeCQYxC0","PYBf4I7p2a","P6bcg9XyT9","Zv7z02Nslm","No0QbzY1GY","lweGyaFFss","0ao3l8U2nU","xXTI4DQimp","cmXIXWMiS3","6AFT0t59lR",
+"MezSWM6qcG","DG4sTlXFOB","cmXIXgjUTu","VLTy6WaWsv","5IhmGOUqFM","sqVrffcwDa","MmKGJFFDui","WreyP5ZaEz","ru4UGd7vjM","AkKTkRACuj",
+"prNT6JIqXi","uZPqgh1zcH","RmDcrFhtgl","gjUTuECMvU","0MR5XAkKTk","14FLRiqv4k","oQ87rIjTwP","kB5nPd7vjM","W3VFHWmadA","GSQwjpFrrl",
+"RpBQm5IhmG","kZANmAgJHQ","L7cGcgIYvE","pmeCd55rfB","64s8NQChxs","uvf7AAOgEe","RBhp0hYBCK","QWxoTlpF6W","FNYIMEdBKc","n1pmOeuZA5",
+"WDVWJRkQke","zz4ZUfcwDa","n8pJ9jeskS","jtn0XJXljW","KASQ8zz4ZU","DG4sTn1pmO","tAOsrL7cGc","FVMxoZUnqt","x3LDeFFDui","JRJQBYOfrY",
+"8hJdtlsQGo","faHirs93Ml","StlDJK20wK","RsQUqFnPFB","SWfou2hEEU","9XyT9MGlTF","s93MlOHaBz","aez9yWaim6","CIShGRACuj","7hyVvZhwG1",
+"Pb1pazmLYD","WDVWJVBjhz","blLA9Kr8ys","QClRLvkCHH","hUTw7wiHrZ","zQt6Q8xEKz","jSjS3prNT6","y94nwWaWsv","zbIYYbgJAz","VBjhz9XyT9",
+"lj07QdhSuH","B3qemgtCA5","k85AeTXQ0Z","5nmWv3weIF","AXpwECdyBV","uZPqgx3LDe","Yw2oU5VZjS","MezSWpmeCd","k85AeAXpwE","0h1b1Y1mC0",
+"FVMxooVQp6","m4bxU618Di","Mkgy8Pb1pa","gtCA55Mg9r","M3zXLZv7z0","he9IAzHF1q","W3VFHQWxoT","ydG8UkB5nP","fcJOylH1kt","8xEKz3weIF",
+"cQOnvuoStw","1v5hHlkMUA","tAOsr4QMc9","qaofNFGzgp","iB08lxciqp","OxWIHP6bcg","0PktIAgJHQ","8U2nU5iGN5","BGaQYzHF1q","aez9yru4UG",
+"WaWsvvkCHH","Chuy3ZUnqt","6q6L9qaofN","gIYvEpiJSk","Pb1pa5Drn0","Mm8si0MR5X","dhSuH0Wr5y","VerEAEoToP","dmoS7v2eC3","2TRI72TRI7",
+"AmdQdGv3Fq","AgJHQoGu6x","IRh48OHaBz","WMiS3rz7Ut","lCMxys93Ml","7fsYMWaWsv","HfyNQpiJSk","lpF6WtvdkD","t98iWJXljW","bZLvS8xEKz",
+"ReKEW7lUXZ","yEfy9sx5Gl","Cfgr3WaWsv","0YAGHK4GS8","9XyT9IjTwP","QClRLSjskQ","zz4ZU4QMc9","lXFOBRkQke","pvgjSRzaZA","5IhmGgf8rI",
+"fLNg8J2mQi","lpF6WIKxdL","D6rByzz4ZU","7Ow5Cx3LDe","5IhmGAgJHQ","AOgEeEoToP","lkMUAUvlv4","RzaZAdpe1v","iqv4k48cHL","16lHc1LB1L",
+"lsQGozY1GY","m4bxUCK5W7","oVQp6d7vjM","U3yw5GXdoH","ni2v1MojnP","FwEJzZ4I1v","L7cGcIn3NS","lH1ktUmaEv","SmGzvAmdQd","aL6AJyofH3",
+"Oz8yZCIShG","24ARFRzaZA","FLsphFFDui","ReKEW8xEKz","fFDrJMmKGJ","s93Ml64s8N","d85a9VjCZq","pAhR1Twano","bgJAzbZLvS","atef21j5L8",
+"ix74rStlDJ","ogLgcvLsmS","lViBvAIYUu","2TRI7BbwgA","9eoRcpmeCd","OxWIHuAWyp","4dEz6cL0aE","gdQsSgjUTu","x3LDeNOHsz","HfyNQ5nmWv",
+"SbRYyVjCZq","HfyNQWaWsv","tAOsrhYBCK","Dz1R3okgRi","dmoS7zQt6Q","CK5W7GSQwj","14FLR8xEKz","jiVBPCK5W7","WreyP5nmWv","zmLYDyEfy9",
+"rz7Ut3weIF","yluBxKZamH","n1pmO7ku1p","zbIYYzmLYD","AOgEelH1kt","h1zcHVprf2","jiVBPZJTXH","YjB9tM6qcG","a00b5Y1mC0","uZPqgt59lR",
+"48cHLs93Ml","Yf2EceuZA5","LewvMpWiOs","8U2nU1LB1L","8cVD3QYxC0","3weIFxReec","vOqCEoGu6x","lCMxyKsjRK","v8yFNP6bcg","VIlwPFLsph",
+"3weIF4W0Tl","XyPZN5ZaEz","ZhwG1pv0i7","ThjNnGrDg7","VIlwPEOE1o","hE1Qlv1Hln","L7cGcNxx9V","CK5W7pvgjS","RACuje6e4z","8cVD3sqVrf",
+"DQimpSWfou","ZuDtDZuDtD","l83UdSWfou","DQimplCMxy","xciqpSmGzv","FLsphlkMUA","pFrrlNxx9V","nFqikkB5nP","Yw2oUGSQwj","IjTwPMkgy8",
+"yofH3djsrv","ThjNnlkMUA","OUqFMTCgPp","9XyT9rz7Ut","hYBCKQClRL","cL0aENAFuw","7hyVvKr8ys","aDGtScQOnv","2NslmjzUqR","n8pJ9QChxs",
+"9XyT9b29RJ","EOE1oIRh48","LDk6fStlDJ","ciuWzYjB9t","dmoS78TxD7","ZhwG1VIlwP","RACuj0Wr5y","fcwDaMmKGJ","lXFOB7fKYU","9XyT9XyPZN",
+"AmdQdMm8si","YjB9t618Di","5NammFnPFB","ni2v1azIWp","580YDRBhp0","hUTw7sx5Gl","QnJ1SfFDrJ","TXQ0ZpvgjS","580YDxReec","5drc6Yf2Ec",
+"nnP8oPOUYS","SWfouW7cTs","X6PinNxx9V","rz7UtWMiS3","yToGWyEfy9","jeskSFLsph","DQimpsx5Gl","v2eC3Fhtgl","RkQkeRpBQm","wDajXQworu",
+"lCMxyjeskS","5IhmGzQt6Q","Yf2EcAkKTk","CK5W7Cfgr3","Fhtgl7hyVv","jeskS0Kyfs","guMb87hyVv","IRh484QMc9","qUJMdMezSW","9GXkXtjQxs",
+"ReKEWzY1GY","7fKYUs4786","uZPqgFhtgl","O3iyQ9eoRc","ciuWzKr8ys","FnPFB9GXkX","dpe1vuJScX","2TRI7QYxC0","CdyBVOUYuF","lkMUA7hyVv",
+"AkKTkRsQUq","jS1ajWaWsv","1LB1L5nmWv","taOXKzqH0W","7Ow5CCxVEf","O3iyQYw2oU","618DiJkzUn","G1RhS7fsYM","7fKYUhYBCK","5Mg9r2Yz7E",
+"Vprf2In3NS","QbxXc3weIF","TwanoHP433","pv0i7lm0pD","iB08lrKDLJ","iqv4k24ARF","LDk6fjfREu","vkCHH64s8N","s93Mlk85Ae","ZUnqtuvf7A",
+"HRxd8VNCPd","No0QbFnPFB","0Wr5y8cVD3","BbwgAuN6r3","xReecVLTy6","gf8rI5Mg9r","9y4lw48cHL","tjQxs0BmCy","lsQGozbIYY","hUTw7tvdkD",
+"3weIF0PktI","rKDLJIjTwP","ogLgc7X3uy","ni2v1l83Ud","oQ87rpAhR1","0ao3ld85a9","zY1GYdpe1v","6q6L9brhlQ","5NammciuWz","tAOsrK4GS8",
+"Q6hMCMGlTF","JRJQBZuDtD","Mkgy88xEKz","yEfy9tlILt","ni2v17Ow5C","uN6r3i3pyd","uZPqgRzaZA","kZANmCqqaD","pmeCdCxVEf","jfREuNo0Qb",
+"uQIczZ4I1v","24ARFPb1pa","b29RJfLNg8","QnJ1SQWxoT","OxWIHjiVBP","S2Dfusoy9t","euZA5OxWIH","IBe8kSjskQ","FVMxoeuZA5","MojnP24ARF",
+"xXTI4x3LDe","iqv4ksoy9t","TCgPp9rlg9","0PktILewvM","2DREsiKqhr","yToGWGrDg7","No0Qb8RCUA","fqypyOz8yZ","MezSWlj07Q","kZANm16lHc",
+"lXFOBZUnqt","lCMxyX6Pin","OUYuF2ZHdk","LbRTHtaOXK","v8yFNpmeCd","4dEz64dEz6","ReKEWCfgr3","uN6r3iB08l","64s8N1v5hH","iB08lBCxeC",
+"Uvlv4UlU3M","6AFT0Oz8yZ","ix74rlsQGo","LbRTHlpF6W","yEfy9iB08l","4dEz6Uvlv4","IjTwPNo0Qb","Cfgr3RsQUq","uoStwDcpWB","v1HlnuTacx",
+"tjQxszFgtB","cmXIXUvlv4","618DiNhXdu","L7cGcGSQwj","l83UdaFFss","0ao3lZUnqt","ZhwG1uZPqg","AgJHQuPX7G","ydG8UCNHmv","aL6AJ2Yz7E",
+"v8yFNuQIcz","fmIK1euZA5","DQimp8TxD7","QChxs24ARF","t59lRFNYIM","xXTI4ksJby","Mm8siblLA9","HP4330Kyfs","VLTy6qQxHP","gtCA545cIH",
+"7X3uy9eoRc","CdyBV9y4lw","AOgEe5iGN5","Ss0ZuJJs5m","cShY2AgJHQ","prNT69XyT9","0KyfsFjHXR","n8pJ9iqv4k","xciqpFGzgp","CK5W7BbwgA",
+"aL6AJQ6Lix","iwzGkJIqXi","BbwgAlpF6W","yvOMIcmXIX","CdyBVHzZT8","FLsphFnPFB","he9IADLhzM","VBjhzYOfrY","oQ87rdhSuH","D6rBylkMUA",
+"FVMxokZANm","brhlQwDajX","blLA9soy9t","WMiS3BCxeC","RxrsmQbxXc","lCMxyyofH3","Oz8yZzQt6Q","wiHrZGXdoH","580YDIn3NS","tvdkDRmDcr",
+"uAWypv8yFN","JKWYRdjsrv","h1zcHDLhzM","tvdkDrhl0J","8RCUAIRh48","SjskQ8xEKz","5VZjS5IhmG","S77LHBFkb8","2hEEUuJScX","0Wr5yRxrsm",
+"U3yw5zFgtB","s7Mxk07n1c","VNCPduLtKs","In3NSazIWp","LbRTHYh1hF","AgJHQAXpwE","blLA9X6Pin","8U2nUni2v1","TXQ0ZmX2GE","y94nwMGlTF",
+"NhXdux3LDe","ZzJHWZ4I1v","cQOnvzHF1q","DcpWBCfgr3","ulk41uupzk","qaofNCK5W7","piJSkqaofN","jzUqRFVMxo","i7WMQNxx9V","CdyBVECMvU",
+"CxVEfGWqqX","piJSkHRxd8","n1pmOd7vjM","K20wKDG4sT","jtn0XnlaBy","ReKEWVNCPd","Z4I1vZzJHW","cQOnvQnJ1S","MojnPix74r","0PktItvdkD",
+"4QMc9ciuWz","CxVEf7fKYU","soy9twDajX","QChxsksJby","0MR5XjeskS","djsrvv1Hln","FGzgpNxx9V","k85AeEOE1o","Ul4a1QYxC0","uLtKsrhl0J",
+"i3pydUlU3M","U3yw5cQOnv","hE1QloQ87r","0BmCy0ao3l","C2IrcHRxd8","4QMc9ydG8U","yvOMIF6PT2","OUqFMDG4sT","Pb1paFcWrW","okgRi8TxD7",
+"jtn0X48cHL","AkKTkm4bxU","oQ87rpv0i7","FwEJzFFDui","lj07QZv7z0","Fhtglm4bxU","DLhzM8hJdt","W3VFHd85a9","ru4UGK20wK","FnPFB7lUXZ",
+"Fhtgl1LB1L","580YD7fKYU","RBhp0SmGzv","HRxd8nnP8o","9eoRc5VZjS","618DiFLsph","b29RJ2TRI7","lweGyv1Hln","0Wr5yIKxdL","M6qcGUlU3M",
+"7fKYUZuDtD","KsjRK9eoRc","ZhwG1RzaZA","9eoRcksJby","Q6Lix7fsYM","ZJTXHyEfy9","s7MxkC2Irc","zbIYY2Yz7E","hUTw77hyVv","tjQxs1j5L8",
+"MojnPIjTwP","cQOnvix74r","FcWrW2ZHdk","QnJ1SJkzUn","t59lRGSQwj","ni2v1pT8wu","QWxoT5ZaEz","lpF6WbrhlQ","uoStwjS1aj","S77LHyvOMI",
+"KZamHblLA9","oGu6xKZamH","aFFssMkgy8","pmeCdmz8gx","AOgEezmLYD","fLNg8AXpwE","8RCUAMK07Y","AmdQdsuY4x","XyPZNzbIYY","ZUnqtRACuj",
+"8RCUA16lHc","Gv3FqRpBQm","pmeCdJJs5m","6q6L9ulk41","sx5GlZhwG1","mz8gxv1Hln","xReecRzaZA","tjQxsx3LDe","WmadA9rlg9","lCMxykB5nP",
+"IKxdLvOqCE","EdBKc7Ow5C","Uvlv4Pb1pa","VerEAYjB9t","Nxx9VSs0Zu","K20wK5Namm","QWxoTZuDtD","m4bxUBbwgA","PYBf43weIF","7lUXZVprf2",
+"AOgEe0YAGH","pvgjSlViBv","uJScXM6qcG","fFDrJMGlTF","5iGN5lH1kt","tl72W16lHc","rhl0JCqqaD","U3yw5K20wK","xciqpYOfrY","ru4UGAXpwE",
+"4QMc9b29RJ","BFkb89eoRc","5VZjS0YAGH","YOfrYYOfrY","lXFOBzQt6Q","jiVBPy94nw","VerEAxReec","MGlTF5Namm","OHaBzGXdoH","7Ow5CpAhR1",
+"0Kyfsh1zcH","FxX9qtAOsr","lkMUAIRh48","5drc6RzaZA","5nmWvuZPqg","7hyVvfmIK1","fLNg8ydG8U","YOfrYiKqhr","dQ586AkKTk","cShY2brhlQ",
+"hSSvQS2Dfu","jzUqRCxVEf","Oz8yZlkMUA","jtn0XazIWp","sqVrfBCxeC","ix74rHlUbF","4dEz6NAFuw","FcWrW7fsYM","tAOsryEfy9","CIShGReKEW",
+"45cIHQYxC0","7lUXZWreyP","lkMUAQbxXc","FnPFBQnJ1S","AOgEedjsrv","MojnP6AFT0","MGlTFHlUbF","TwanotjQxs","ciuWz0BmCy","EOE1oBpYhV",
+"TwanoTXQ0Z","14FLRTwano","gjUTu0BmCy","EdBKcNAFuw","fcJOyxReec","8xEKz4dEz6","RzaZAFNYIM","prNT6fcJOy","DG4sTtjQxs","BFkb8Yw2oU",
+"WaWsvuJScX","xXTI45Mg9r","tl72WUvlv4","lViBvoQ87r","dmoS7LbRTH","sx5GlsuY4x","pmeCdYf2Ec","AIYUu5nmWv","oQ87rxciqp","xReecAkKTk",
+"s4786zHF1q","2Yz7EChuy3","uLtKsMK07Y","uupzkDG4sT","jSjS3sqVrf","iKqhrlj07Q","QYxC0iqv4k","RkQkeLbRTH","uTacxciuWz","ni2v1W3VFH",
+"fcJOyAgJHQ","s93MlMK07Y","zz4ZURACuj","lm0pDeuZA5","d7vjMfmIK1","fcJOyBCxeC","HP433ulk41","pvgjSvLsmS","uAWypWmadA","DG4sTsuY4x",
+"tuDySP6bcg","8xEKz5Namm","9y4lwpT8wu","BFkb8Qworu","t59lRKsjRK","NOHsz1v5hH","jtn0Xxciqp","qUJMd6AFT0","jeskSpT8wu","azIWp8TxD7",
+"24ARF7ku1p","sqVrfLbRTH","zY1GY24ARF","9XyT9rKDLJ","9y4lw9GXkX","gf8rIiqv4k","Yw2oUD6rBy","5Mg9rhi5X7","DcpWBMezSW","pv0i7Uvlv4",
+"i7WMQSbRYy","i7WMQIjTwP","aez9yGv3Fq","Ul4a1NOHsz","ogLgcWmadA","uAWypnFqik","i3pydDLhzM","uJScXFNYIM","kZANma00b5","M3zXLqaofN",
+"Ta8f6O3iyQ","M6qcGmX2GE","7hyVvpvgjS","Yf2EcZv7z0","faHirAkKTk","rKDLJuPX7G","9eoRcni2v1","qQxHPHzZT8","5VZjSTwano","zY1GYyEfy9",
+"ydG8UyvOMI","LDk6fv8yFN","GXdoHiKqhr","qUJMd618Di","zFgtBy94nw","NhXduiwzGk","29QAzdQ586","6q6L96q6L9","fFDrJMkgy8","5IhmGi7WMQ",
+"aez9yM3zXL","hSSvQlH1kt","ReKEWZJTXH","KZamHoGu6x","0KyfsIKxdL","0Wr5yCfgr3","5IhmGtaOXK","cQOnvNo0Qb","Ss0ZuTCgPp","G1RhSfmIK1",
+"yEfy9euZA5","wDajX0h1b1","l83Udxciqp","AOgEeOxWIH","qUJMdvLsmS","M3zXLvLsmS","n1pmOzqH0W","iqv4kPb1pa","hUTw7JKWYR","xXTI45nmWv",
+"RkQke7hyVv","AOgEeNOHsz","ZUnqtvLsmS","sx5Gl1v5hH","NcICAQ6Lix","zqH0WTXQ0Z","TCgPpW3VFH","ZJTXHdQ586","lViBvbZLvS","ZuDtD0h1b1",
+"7fKYUGSQwj","55rfBwiHrZ","tlILtMm8si","NcICAEOE1o","uvf7Ax3LDe","e6e4zv8yFN","vkCHH5VZjS","Cp3mZpv0i7","ZzJHWciuWz","MojnPaL6AJ",
+"lCMxy07n1c","CqqaDWreyP","45cIHoQ87r","lj07QHRxd8","PYBf42Nslm","HP43329QAz","vLsmS45cIH","ydG8URpBQm","0YAGHqQxHP","G1RhSm4bxU",
+"D6rBypmeCd","FFDuilViBv","wiHrZl83Ud","JRJQBpAhR1","45cIHC2Irc","FxX9qgf8rI","WPmlxtvdkD","GrDg764s8N","HRxd87hyVv","jSjS3oGu6x",
+"5iGN5x3LDe","BbwgANxx9V","9iGoTaL6AJ","gf8rICIShG","VNCPdAXpwE","FcWrWoGu6x","No0Qbrz7Ut","VerEAFhtgl","ulk41qaofN","jiVBPBFkb8",
+"VLTy6YOfrY","5Mg9r2TRI7","oGu6xdpe1v","I7p2adjsrv","pv0i7M6qcG","HP433xXTI4","KsjRKl83Ud","9rlg9618Di","IBe8kEdBKc","aDGtSFGzgp",
+"5NammlpF6W","LewvMy94nw","Q6hMCqQxHP","l83UdAmdQd","hi5X7b29RJ","Uvlv4cmXIX","uLtKsCxVEf","ECMvUcmXIX","S2Dfu0BmCy","FxX9q07n1c",
+"1j5L8YjB9t","i7WMQbrhlQ","s4786hUTw7","YjB9t2ZHdk","Uvlv4iqv4k","FxX9qqUJMd","uPX7GFNYIM","S2Dfu0Kyfs","tAOsrQworu","v2eC3lpF6W",
+"vLsmSZhwG1","dmoS7AXpwE","FnPFBhE1Ql","DG4sTJkzUn","0KyfsGXdoH","pT8wuMojnP","NAFuwuupzk","ix74rlj07Q","WPmlxazIWp","Q6LixNo0Qb",
+"VIlwPksJby","s93MlwDajX","NAFuwFFDui","guMb8ulk41","4QMc9tjQxs","ECMvUTa8f6","5VZjSmX2GE","jzUqRNo0Qb","jzUqRQ6hMC","OUYuF1v5hH",
+"29QAzCK5W7","xReecFGzgp","d7vjMVLTy6","euZA55drc6","JRJQB580YD","WreyPS2Dfu","LbRTHOUqFM","S77LHThjNn","faHirW7cTs","aFFsslH1kt",
+"jtn0XB3qem","FVMxoIBe8k","zz4ZU5VZjS","sqVrfaL6AJ","RpBQmk85Ae","m4bxU0h1b1","euZA5ru4UG","XyPZNFcWrW","hE1QlzHF1q","v2eC3vLsmS",
+"FxX9qpAhR1","Cfgr3Q6Lix","16lHcgIYvE","UlU3MjfREu","0YAGHix74r","BbwgACK5W7","uAWyp5VZjS","G1RhS580YD","ZJTXHbgJAz","NAFuw7ku1p",
+"fFDrJEoToP","L7cGcBCxeC","kZANmxXTI4","5Mg9rAgJHQ","WmadAfFDrJ","MK07YPb1pa","Waim6y94nw","618DitjQxs","8TxD7ReKEW","mX2GEk85Ae",
+"618DisqVrf","n8pJ9ThjNn","nFqikDG4sT","14FLRkB5nP","MaJQs0Wr5y","RsQUq0h1b1","RpBQm5Namm","fcwDauAWyp","8cVD3pmeCd","Cp3mZoGu6x",
+"WreyPpv0i7","DcpWBAIYUu","lkMUAuJScX","fFDrJl83Ud","HlUbFrz7Ut","Oz8yZKr8ys","GWqqXuTacx","VIlwPfqypy","HfyNQcmXIX","GrDg7MK07Y",
+"yluBxIn3NS","pFrrl8cVD3","JKWYRM3zXL","EOE1o6q6L9","OUYuF8cVD3","5NammCqqaD","uAWypVerEA","SbRYyix74r","kB5nPI7p2a","MezSWlm0pD",
+"rhl0JuTacx","AOgEe64s8N","M6qcG7hyVv","48cHLd85a9","uZPqgAIYUu","8RCUAlkMUA","TXQ0Zy94nw","QnJ1SrKDLJ","pv0i72hEEU","5Mg9rpFrrl",
+"Dz1R3Mkgy8","rz7UtogLgc","QworuAmdQd","AmdQdgtCA5","v2eC3bZLvS","hYBCKni2v1","ECMvUUvlv4","DG4sTG1RhS","ni2v1tuDyS","uPX7GjS1aj",
+"FPfSEuZPqg","tlILtazIWp","l83UdUmaEv","lH1kthSSvQ","jS1ajFjHXR","euZA5dpe1v","uPX7GW3VFH","FPfSEokgRi","n1pmOs7Mxk","n1pmOEdBKc",
+"No0QbtlILt","nlaByEoToP","rz7Uthe9IA","2DREsBGaQY","QChxsHRxd8","zmLYDMojnP","l83UdyluBx","AmdQdAOgEe","MK07YJIqXi","MaJQsdQ586",
+"QbxXcv8yFN","ThjNnMGlTF","FxX9qDQimp","CxVEfCfgr3","TCgPpNOHsz","uAWyp7X3uy","RBhp0Q6hMC","9eoRc7lUXZ","ciuWztl72W","ru4UGAgJHQ",
+"7fsYM2TRI7","jtn0Xn1pmO","WMiS30MR5X","n8pJ9v1Hln","ReKEWAXpwE","guMb8qQxHP","0BmCyKZamH","DG4sTRBhp0","0BmCy2Yz7E","HRxd8s4786",
+"uTacxU3yw5","gjUTuguMb8","HfyNQL7cGc","iwzGk0Kyfs","VLTy6uN6r3","CNHmvgf8rI","48cHL5IhmG","sx5Gly94nw","ZUnqtMojnP","CqqaD0Kyfs",
+"lH1ktxXTI4","GWqqX5VZjS","ReKEWOxWIH","Oz8yZZUnqt","ECMvUGrDg7","W3VFHNOHsz","oQ87rlweGy","zbIYYSmGzv","uZPqgFLsph","CNHmvk85Ae",
+"8xEKzgdQsS","07n1c45cIH","uJScX618Di","0ao3lDz1R3","TXQ0ZD6rBy","lpF6WzY1GY","mX2GE5drc6","2DREs2ZHdk","uJScXMaJQs","BGaQYuJScX",
+"ciuWzOxWIH","ECMvUHP433","Cp3mZk85Ae","TwanoyToGW","J2mQituDyS","uoStwlViBv","SbRYyM3zXL","aL6AJQWxoT","K4GS87lUXZ","d7vjM5IhmG",
+"Yf2EcQnJ1S","jtn0XRkQke","MK07YNOHsz","RmDcrKr8ys","pT8wuuoStw","NOHszbrhlQ","WMiS3ZuDtD","5iGN5qUJMd","No0QbtAOsr","2hEEUPYBf4",
+"d85a9FPfSE","e6e4zCqqaD","VLTy6lm0pD","JIqXi7X3uy","uAWyptlILt","D6rByX6Pin","GrDg7OHaBz","euZA5euZA5","d7vjMReKEW","No0Qbix74r",
+"ydG8UBCxeC","aL6AJaFFss","ZzJHWv1Hln","Oz8yZRzaZA","l83Ud2DREs","yvOMICdyBV","pvgjS7fsYM","lsQGouTacx","GSQwjfcJOy","qQxHPlXFOB",
+"WMiS38hJdt","FNYIMLbRTH","zmLYDVIlwP","IRh480BmCy","HRxd8RzaZA","3weIFs93Ml","WaWsvo8Uyd","I7p2ab29RJ","JJs5mrhl0J","qaofN5iGN5",
+"8hJdtlweGy","xciqphe9IA","618Di64s8N","t98iWcL0aE","aDGtSuQIcz","yvOMIDLhzM","MezSWOz8yZ","tjQxsGXdoH","tAOsrwiHrZ","ZzJHW0BmCy",
+"45cIH29QAz","ydG8U6q6L9","gtCA5BFkb8","rhl0Jv2eC3","k85Ae0PktI","5nmWvIn3NS","hi5X7d85a9","BpYhV0ao3l","HlUbFMK07Y","XyPZN0ao3l",
+"5Mg9r8TxD7","i3pydcmXIX","QChxsWreyP","xciqpyvOMI","lViBv4W0Tl","v8yFN7X3uy","qQxHPRxrsm","RmDcrb29RJ","zbIYYjiVBP","fcJOy29QAz",
+"lH1ktQYxC0","0MR5XGWqqX","djsrv2Nslm","VerEAn1pmO","KZamHIKxdL","XyPZNbZLvS","16lHcVIlwP","M6qcGStlDJ","MezSWuvf7A","J2mQiHzZT8",
+"ulk417hyVv","Waim60BmCy","Gv3FqGrDg7","CqqaDxXTI4","GXdoHW7cTs","Nxx9VC2Irc","RmDcrUl4a1","HzZT8FwEJz","W7cTsHRxd8","WPmlxdQ586",
+"cQOnvOxWIH","16lHcblLA9","qUJMdQClRL","EoToPtuDyS","618DiyofH3","BCxeClXFOB","GWqqXMmsIo","5drc6cQOnv","X6PinRBhp0","h1zcHCfgr3",
+"euZA5NOHsz","dpe1vAIYUu","5iGN5fFDrJ","JXljWy94nw","brhlQ9iGoT","pAhR116lHc","5IhmG8cVD3","45cIHuN6r3","SbRYydjsrv","Nxx9VVprf2",
+"aFFssD6rBy","FVMxoJRJQB","0MR5X8RCUA","yvOMISjskQ","uvf7ARBhp0","RzaZA2ZHdk","MmKGJWMiS3","qQxHPYjB9t","RzaZANxx9V","i7WMQ8RCUA",
+"zQt6QGXdoH","9iGoTaDGtS","X6Pin0h1b1","pAhR1OxWIH","3weIFFhtgl","pWiOs4dEz6","gdQsS2Nslm","lH1ktWMiS3","QnJ1SoVQp6","W3VFHfaHir",
+"1v5hH4dEz6","QYxC0MezSW","YOfrYzqH0W","MK07YFPfSE","zqH0W64s8N","prNT6ZUnqt","h1zcHiwzGk","lsQGoReKEW","aDGtSVNCPd","SmGzvRACuj",
+"6AFT0yofH3","RmDcrfFDrJ","zbIYYQ6Lix","7fKYUZUnqt","JRJQBRzaZA","CqqaDxReec","Y1mC0uZPqg","uoStwv8yFN","fFDrJsqVrf","580YDeuZA5",
+"3weIFlpF6W","WDVWJl83Ud","AIYUuiKqhr","FjHXR8U2nU","y94nwlsQGo","ZzJHWCNHmv","ZUnqtLbRTH","SbRYyO3iyQ","hSSvQJRJQB","RzaZAlViBv",
+"SjskQtlILt","2ZHdk1v5hH","2DREspvgjS","Yw2oUVerEA","jSjS3vkCHH","NAFuwKsjRK","WPmlxoQ87r","2ZHdkFhtgl","FGzgpni2v1","m4bxUFxX9q",
+"pFrrlydG8U","J2mQiJIqXi","6AFT0QYxC0","HfyNQkZANm","ZJTXHwiHrZ","0PktIzFgtB","7Ow5CMkgy8","GSQwjxciqp","QnJ1SyToGW","hE1QlPOUYS",
+"HlUbFnlaBy","SmGzvIn3NS","7fsYMtlILt","1LB1LpiJSk","gtCA5o8Uyd","jeskSksJby","JJs5m5IhmG","Z4I1vCxVEf","OUqFMRxrsm","K4GS85ZaEz",
+"hYBCKzFgtB","07n1cECMvU","9GXkXQ6hMC","FGzgpQYxC0","0MR5XZhwG1","faHirTCgPp","CK5W7Twano","AgJHQoQ87r","AkKTkNAFuw","Cp3mZxXTI4",
+"I7p2aCIShG","9eoRcEoToP","O3iyQpFrrl","ZhwG1WmadA","5ZaEzfFDrJ","t98iWDQimp","MmsIod7vjM","iB08lOUqFM","lpF6WFFDui","BCxeCSmGzv",
+"O3iyQAOgEe","TwanoQworu","UmaEvfcwDa","FnPFBa00b5","hYBCKeuZA5","rhl0Jy94nw","5drc6K20wK","cmXIXAOgEe","K4GS8ciuWz","zbIYYMkgy8",
+"ECMvUCfgr3","faHiraL6AJ","fFDrJHP433","EOE1oaL6AJ","Uvlv4s93Ml","Ta8f64QMc9","7X3uyVerEA","Waim65iGN5","MGlTF8xEKz","HfyNQ8TxD7",
+"uupzk8cVD3","hi5X7Oz8yZ","3weIFcShY2","xciqpcShY2","t59lRfqypy","8RCUAuLtKs","GrDg7zFgtB","FFDuiiwzGk","UlU3MjeskS","Ta8f6Qworu",
+"uTacxD6rBy","NhXduhYBCK","5Drn0FFDui","9y4lwvLsmS","AgJHQBGaQY","WMiS3PYBf4","yEfy9GWqqX","DQimpO3iyQ","EoToPThjNn","nnP8oOUqFM",
+"rz7Ut9eoRc","5VZjSNAFuw","0MR5XIBe8k","ru4UGTwano","zQt6QzbIYY","P6bcgAOgEe","FNYIMP6bcg","i7WMQe6e4z","MK07YNhXdu","J2mQiI7p2a",
+"gf8rI0Kyfs","mX2GENcICA","VjCZqtlILt","8U2nUWPmlx","uN6r38U2nU","VerEAbZLvS","rKDLJ55rfB","BCxeCQ6Lix","vkCHHfaHir","0KyfszY1GY",
+"CK5W7SbRYy","OxWIHCfgr3","aFFssjiVBP","Z4I1vtlILt","lXFOBcmXIX","JIqXidmoS7","fmIK17fKYU","WDVWJoVQp6","K4GS85Namm","Dz1R35nmWv",
+"J2mQii7WMQ","n1pmOzFgtB","sqVrft59lR","t59lRi3pyd","Oz8yZCp3mZ","5VZjSJJs5m","nFqik2Yz7E","xReeculk41","NcICAWmadA","d7vjMVBjhz",
+"dmoS7HzZT8","2Yz7EmX2GE","5nmWvsoy9t","5Drn0MmKGJ","uPX7GChuy3","MK07YlkMUA","5Drn0ReKEW","7ku1pZv7z0","RBhp0uQIcz","2Yz7ESbRYy",
+"DG4sTZzJHW","iKqhrDcpWB","yToGWlsQGo","KZamHcL0aE","EOE1ob29RJ","AgJHQAkKTk","s7MxkIBe8k","oQ87rECMvU","lpF6Wgf8rI","QChxs16lHc",
+"S2DfulViBv","uLtKs9GXkX","uvf7Asx5Gl","GSQwjBbwgA","jiVBPRpBQm","KZamHni2v1","0MR5XZuDtD","OUqFMaDGtS","AOgEeQnJ1S","gf8rIWaWsv",
+"uvf7A9GXkX","fqypyFxX9q","MmsIov8yFN","pmeCdxciqp","dQ586NAFuw","DLhzM8U2nU","5drc6azIWp","8FmFHAIYUu","ZUnqtpAhR1","ZzJHWIjTwP",
+"i7WMQUlU3M","m4bxUxciqp","HzZT8FLsph","3weIFS77LH","DG4sTcL0aE","0PktINo0Qb","9eoRc2Yz7E","RpBQmvOqCE","EOE1olCMxy","azIWpatef2",
+"8TxD70MR5X","he9IA7X3uy","RkQkezY1GY","mX2GEChuy3","64s8Nd85a9","NcICAOz8yZ","7ku1pfcwDa","Yw2oUcShY2","7hyVvX6Pin","Yh1hFni2v1",
+"AIYUuKASQ8","ulk41tAOsr","jzUqRMmsIo","O3iyQZJTXH","U3yw5YOfrY","aFFssBbwgA","VNCPdHzZT8","0h1b1UlU3M","8U2nU7fKYU","pAhR1AkKTk",
+"VjCZq5nmWv","fFDrJJKWYR","cQOnvhi5X7","lm0pDjeskS","jfREuXflUq","AmdQdCNHmv","ix74rIn3NS","soy9tBFkb8","zFgtBiqv4k","NOHszXflUq",
+"fcJOyKsjRK","5IhmGDG4sT","dmoS70MR5X","yToGWlm0pD","9XyT95VZjS","8xEKztuDyS","U3yw55ZaEz","nFqikvkCHH","pv0i79XyT9","cShY2fcJOy",
+"vLsmS6q6L9","7lUXZiB08l","QChxsjtn0X","AOgEeRBhp0","FFDuiQClRL","EdBKcXyPZN","3otm6Gv3Fq","dQ58648cHL","BGaQYRpBQm","WmadAY1mC0",
+"07n1cRpBQm","FLsphPYBf4","LbRTH2Yz7E","CdyBVzbIYY","OUqFM0ao3l","oQ87rVprf2","mz8gx0MR5X","7hyVvTa8f6","0YAGHzFgtB","8xEKzvOqCE",
+"KZamHhe9IA","RsQUqKsjRK","WreyPF6PT2","Z4I1vWaWsv","pT8wuM6qcG","uTacxTa8f6","uupzkaDGtS","Cfgr3QnJ1S","SWfouokgRi","WmadAuZPqg",
+"FNYIMjeskS","QChxsThjNn","cShY2NOHsz","uTacx8TxD7","WreyPBCxeC","QWxoTD6rBy","Qworu16lHc","XyPZNS77LH","0BmCyQssNC","FPfSEBGaQY",
+"ReKEW24ARF","9XyT9JRJQB","Rxrsm4dEz6","mz8gx9XyT9","9rlg9uoStw","v1HlnHzZT8","9iGoTazIWp","FnPFBzHF1q","sx5GlVprf2","fLNg8zz4ZU",
+"AIYUuJKWYR","UlU3MtjQxs","QnJ1SMm8si","JRJQBWPmlx","Dz1R3pAhR1","RACujLewvM","Q6Lixuupzk","SbRYyCdyBV","VerEARBhp0","iwzGk8xEKz",
+"QYxC0ni2v1","bZLvSSs0Zu","hUTw7DLhzM","i3pyd4W0Tl","v1HlnzqH0W","iwzGkRpBQm","5nmWv2Nslm","8U2nUwDajX","iKqhrWPmlx","lCMxy4QMc9",
+"K20wK4W0Tl","Ta8f6wDajX","WaWsvZJTXH","4dEz63otm6","i3pydvOqCE","i7WMQcmXIX","hUTw7hUTw7","C2IrcVIlwP","ZhwG1he9IA","sx5GlVjCZq",
+"BpYhVFGzgp","FLsphGXdoH","KsjRKNhXdu","EoToPaDGtS","IBe8kxXTI4","soy9tdjsrv","Mm8siFcWrW","zmLYD9eoRc","MezSWtlILt","C2IrclH1kt",
+"cmXIXCxVEf","SmGzvbrhlQ","WMiS3hUTw7","WPmlxs93Ml","OUYuFzHF1q","gjUTuuTacx","Ss0Zu7fsYM","9iGoTJJs5m","QbxXc8cVD3","xXTI4pvgjS",
+"CIShGQWxoT","iB08l5ZaEz","zQt6QTa8f6","Mkgy8mz8gx","FLsphU3yw5","X6Pinsx5Gl","Chuy3oGu6x","hUTw7yvOMI","prNT6K4GS8","yToGWni2v1",
+"xXTI42Nslm","wiHrZv1Hln","oVQp6LewvM","GSQwj0YAGH","0Wr5yHlUbF","ru4UG8xEKz","JRJQB618Di","tvdkDvkCHH","55rfBCK5W7","JXljWjiVBP",
+"HlUbFqUJMd","RACujAkKTk","ZUnqtzqH0W","QssNChSSvQ","dQ586Yf2Ec","NcICAMezSW","BpYhVokgRi","Mm8siJXljW","YjB9tGWqqX","VIlwP1j5L8",
+"aL6AJNcICA","nFqikChuy3","AgJHQBCxeC","I7p2a9iGoT","v2eC3IjTwP","gf8rIVNCPd","bgJAzfcwDa","Ss0ZuVNCPd","Gv3FqAIYUu","NhXduhE1Ql",
+"i7WMQGv3Fq","n1pmOYf2Ec","vkCHHcShY2","24ARFNcICA","S77LHMmsIo","QworuS2Dfu","6q6L9pmeCd","DLhzMcmXIX","guMb8AkKTk","KsjRK48cHL",
+"ulk41XyPZN","l83Ud9XyT9","5VZjSPb1pa","pv0i7RACuj","X6PinHP433","B3qemni2v1","rKDLJQWxoT","tAOsr5Namm","a00b5GWqqX","NAFuwlViBv",
+"tl72WKsjRK","i3pydd85a9","xciqpciuWz","oGu6x7ku1p","0h1b1ni2v1","azIWpzQt6Q","vLsmSMK07Y","ReKEWLbRTH","POUYS4W0Tl","dmoS78hJdt",
+"hSSvQxXTI4","oGu6xfFDrJ","fcJOyoGu6x","sqVrfnnP8o","Q6hMCn8pJ9","AkKTk7Ow5C","s4786lsQGo","5Mg9rHfyNQ","TXQ0Z618Di","qUJMdXflUq",
+"Ul4a1uupzk","FFDuiRACuj","uLtKstuDyS","FVMxohYBCK","5NammuN6r3","KsjRKYOfrY","uLtKsNcICA","WaWsvLbRTH","4dEz60BmCy","ogLgcdQ586",
+"hUTw7suY4x","pT8wuHfyNQ","ksJbys93Ml","zmLYDMm8si","VNCPd1v5hH","qaofN7lUXZ","zQt6Q1v5hH","SWfoubrhlQ","azIWpK20wK","djsrvjfREu",
+"fLNg8b29RJ","IRh48ix74r","MK07YDG4sT","xXTI4jSjS3","e6e4z7X3uy","9XyT9zQt6Q","J2mQiDz1R3","OUYuFjtn0X","5drc61LB1L","blLA9s93Ml",
+"16lHcM6qcG","FNYIMAmdQd","IRh48qaofN","pvgjSAgJHQ","tAOsrKr8ys","gjUTuNOHsz","aFFssHfyNQ","8xEKzDLhzM","AkKTkydG8U","8TxD7dhSuH",
+"lkMUARpBQm","v2eC3prNT6","ogLgcjS1aj","64s8N8FmFH","aDGtSG1RhS","AkKTkk85Ae","wDajXM3zXL","tAOsrxReec","Yh1hFZhwG1","KsjRK0Wr5y",
+"EoToP7fsYM","uPX7G4W0Tl","Gv3FqmX2GE","wDajXNOHsz","cQOnvhe9IA","SmGzvxReec","DQimpHlUbF","dmoS7RsQUq","ZhwG1QChxs","WDVWJ7hyVv",
+"yluBxYjB9t","rhl0Ja00b5","Oz8yZix74r","xXTI4Dz1R3","Pb1paoGu6x","ogLgcQChxs","7X3uyZzJHW","FwEJzW7cTs","uZPqghE1Ql","bgJAzMezSW",
+"Mm8si618Di","5iGN5tjQxs","MGlTFuPX7G","he9IAAkKTk","EOE1o2TRI7","IKxdL0BmCy","FjHXREoToP","Vprf22Yz7E","CNHmvDz1R3","yToGWsx5Gl",
+"WmadAFFDui","BbwgAKsjRK","l83UdogLgc","CqqaDRsQUq","IKxdLRmDcr","RBhp0vLsmS","6AFT0Mm8si","IjTwPChuy3","XyPZN14FLR","YOfrYTa8f6",
+"Cfgr3cL0aE","5ZaEzOHaBz","QbxXcZUnqt","K4GS8s4786","SmGzvS2Dfu","B3qemlj07Q","0PktIRBhp0","OUqFMv1Hln","rhl0JQWxoT","mz8gxb29RJ",
+"oGu6xzqH0W","uPX7G0Wr5y","C2IrchSSvQ","6AFT0aFFss","hSSvQFnPFB","OxWIHlj07Q","J2mQisx5Gl","ru4UG0MR5X","UlU3MqUJMd","uJScXsx5Gl",
+"K20wKvkCHH","8RCUAgtCA5","2DREsUvlv4","5Mg9rvLsmS","3otm6Chuy3","fcJOyt59lR","IBe8k3otm6","Chuy3pAhR1","xReecC2Irc","45cIHzqH0W",
+"HzZT816lHc","ksJbyuvf7A","JKWYRQssNC","jiVBPZhwG1","FVMxo9XyT9","fFDrJ64s8N","zqH0W0h1b1","zmLYDuQIcz","l83Ud9GXkX","lj07QpiJSk",
+"WaWsvTCgPp","prNT6b29RJ","0YAGH8U2nU","zqH0WdmoS7","SbRYy3otm6","cQOnvokgRi","HlUbFgIYvE","oGu6xuZPqg","pFrrlpiJSk","M6qcGUl4a1",
+"RmDcrK20wK","lkMUAwDajX","GXdoHJXljW","OxWIHnnP8o","JKWYRWMiS3","5nmWvvkCHH","bgJAzgdQsS","rhl0JThjNn","F6PT2F6PT2","h1zcH6AFT0",
+"yofH38U2nU","0Wr5yLbRTH","Mm8siuLtKs","AkKTkjeskS","CdyBVcShY2","oGu6xiKqhr","Chuy3fcJOy","AXpwEFnPFB","lm0pDatef2","0KyfsdQ586",
+"Yw2oUQ6hMC","IKxdLjzUqR","sqVrfHzZT8","zQt6QTCgPp","HP433Z4I1v","tvdkD618Di","5NammKASQ8","FwEJzO3iyQ","zz4ZUWreyP","tAOsrfFDrJ",
+"iqv4kEoToP","AkKTkEdBKc","5Mg9r07n1c","QworurKDLJ","VBjhzyToGW","9rlg9VLTy6","qUJMdSmGzv","KZamHZzJHW","8RCUAhUTw7","C2IrcuQIcz",
+"TwanoWaWsv","AIYUuzqH0W","WreyPMK07Y","IBe8kAXpwE","M6qcGfcwDa","NcICA45cIH","qQxHPCK5W7","ZzJHWuQIcz","ReKEW6AFT0","wDajXC2Irc",
+"5Mg9r0ao3l","8FmFHlXFOB","xXTI4EdBKc","QworuciuWz","1LB1LzbIYY","0PktIReKEW","yvOMIQnJ1S","ksJbySbRYy","uLtKs2TRI7","IjTwPtAOsr",
+"fFDrJyvOMI","9XyT9taOXK","Ta8f6IjTwP","kB5nPWMiS3","s7Mxkulk41","uAWypI7p2a","v8yFN0YAGH","ogLgcK20wK","CqqaD8xEKz","e6e4z5Drn0",
+"OUqFMGv3Fq","7fsYMlpF6W","JXljWuN6r3","VjCZqFNYIM","qUJMduTacx","OUYuFt98iW","ZzJHWCIShG","gtCA5lH1kt","jzUqRCNHmv","6q6L99GXkX",
+"i7WMQBFkb8","lXFOB5IhmG","580YDpFrrl","n1pmOlViBv","W3VFH9GXkX","pT8wuIRh48","QworuW7cTs","NOHszQbxXc","pFrrlHP433","kZANm7fKYU",
+"HfyNQYOfrY","K4GS8O3iyQ","dmoS7rz7Ut","24ARFzHF1q","cL0aEQYxC0","AIYUu2Nslm","W7cTsQWxoT","iwzGkjiVBP","zmLYDyvOMI","uZPqgUvlv4",
+"fFDrJUmaEv","xReecBGaQY","IjTwPrhl0J","kB5nPe6e4z","2Yz7EfmIK1","uTacxn8pJ9","DcpWBt98iW","AgJHQ4QMc9","gjUTuYjB9t","IRh48LewvM",
+"jS1ajLewvM","JIqXiJJs5m","OUYuFhSSvQ","pAhR1JJs5m","IRh48xXTI4","7hyVvQssNC","C2IrcpT8wu","9eoRcJRJQB","yluBxuPX7G","jfREuYjB9t",
+"M3zXL2hEEU","jeskSFxX9q","oVQp6prNT6","6AFT0zqH0W","S2DfuAmdQd","zz4ZUP6bcg","zbIYYdjsrv","iKqhrTXQ0Z","euZA5soy9t","jtn0XpiJSk",
+"LewvM1LB1L","uLtKsRBhp0","lsQGo3otm6","v8yFN29QAz","29QAzNxx9V","MojnPSjskQ","mz8gxJKWYR","MaJQsQYxC0","0PktIW7cTs","uLtKsGrDg7",
+"uAWyp5Mg9r","djsrvZzJHW","wDajXjtn0X","cL0aESs0Zu","xReecQWxoT","M3zXL8TxD7","iqv4k5iGN5","EdBKc8cVD3","07n1cIn3NS","DG4sTTXQ0Z",
+"v8yFNNo0Qb","JIqXiU3yw5","y94nwuupzk","yEfy9tuDyS","Mm8silCMxy","b29RJt98iW","B3qemO3iyQ","dpe1v5ZaEz","CdyBVprNT6","8cVD35iGN5",
+"aL6AJokgRi","0MR5XTa8f6","3weIFZzJHW","pvgjSe6e4z","AgJHQqQxHP","7hyVvpWiOs","HlUbFECMvU","TwanojiVBP","y94nw0h1b1","AXpwEO3iyQ",
+"2hEEUCNHmv","J2mQiJXljW","Yf2EcJ2mQi","jzUqRzQt6Q","mz8gxRsQUq","pv0i75drc6","MGlTFAmdQd","mX2GE5IhmG","qQxHPlH1kt","4QMc9QClRL",
+"9XyT9hi5X7","vkCHHSbRYy","FGzgpHP433","NOHszFjHXR","mX2GECqqaD","VerEAsoy9t","RBhp04W0Tl","POUYSZzJHW","WaWsvUlU3M","iKqhr8xEKz",
+"0h1b1ThjNn","Zv7z0tlILt","FxX9qzz4ZU","4QMc90Wr5y","X6Pinv1Hln","sqVrfBFkb8","OUqFMReKEW","7X3uyWMiS3","QChxs1v5hH","cQOnv1LB1L",
+"hUTw7uJScX","AkKTkn8pJ9","AgJHQGWqqX","ru4UGY1mC0","WreyPrKDLJ","SWfou9rlg9","iwzGkQClRL","WaWsvuTacx","ydG8UKZamH","1j5L8UmaEv",
+"iB08lhe9IA","HP4335Mg9r","RmDcr8xEKz","Ul4a1JkzUn","F6PT2WmadA","qaofNuTacx","lpF6WS77LH","d85a95drc6","1LB1LQ6hMC","d85a9KASQ8",
+"sx5GlHP433","AOgEeX6Pin","9iGoT0YAGH","pAhR1dpe1v","d85a9L7cGc","3weIFUl4a1","nlaByM3zXL","Dz1R35Namm","RmDcrkB5nP","bZLvSMezSW",
+"n8pJ9Pb1pa","2ZHdkMaJQs","16lHcFGzgp","BGaQYBGaQY","zY1GYazIWp","cmXIXix74r","ECMvUciuWz","IKxdLzY1GY","djsrvRzaZA","ZJTXHJkzUn",
+"7Ow5CIRh48","FLsphlXFOB","nnP8o3otm6","RzaZAksJby","9GXkXpmeCd","s7MxkQClRL","uLtKs07n1c","wDajXLDk6f","JXljWCK5W7","Cp3mZWDVWJ",
+"POUYSjiVBP","0h1b1aDGtS","MezSWIBe8k","FFDuiCp3mZ","EdBKc1j5L8","0PktIHfyNQ","mz8gx7fKYU","JIqXiUl4a1","4dEz6Chuy3","1v5hHn1pmO",
+"9rlg9ZuDtD","EdBKcbgJAz","Mm8si6AFT0","FGzgpazIWp","dQ586jS1aj","gdQsS2TRI7","8hJdt7X3uy","AXpwEPYBf4","yluBxNo0Qb","4dEz6kZANm",
+"tAOsrtl72W","oQ87rSWfou","pv0i7dmoS7","k85Ae3otm6","07n1c6AFT0","m4bxUlpF6W","d85a9HRxd8","ZuDtDzHF1q","0Wr5yh1zcH","Ss0ZuDQimp",
+"ReKEWBbwgA","POUYSThjNn","DcpWBWaWsv","ZUnqtfaHir","BbwgABbwgA","ksJbyatef2","MaJQsChuy3","okgRiMGlTF","GWqqXt59lR","F6PT2aez9y",
+"9rlg9NAFuw","xXTI4tAOsr","O3iyQuoStw","K4GS8prNT6","YOfrYZJTXH","In3NS7lUXZ","v2eC3n8pJ9","qaofN1j5L8","9GXkX7hyVv","suY4xSbRYy",
+"rhl0JOz8yZ","kZANm8xEKz","ksJbyRBhp0","ni2v11v5hH","MGlTF07n1c","n1pmOmX2GE","KASQ8Cp3mZ","5Mg9r45cIH","DLhzMGSQwj","2NslmFFDui",
+"2ZHdkt59lR","gtCA5CIShG","9rlg99rlg9","RpBQmdjsrv","uZPqg14FLR","gf8rI3otm6","fcJOyC2Irc","uoStwdmoS7","ThjNn2hEEU","x3LDejS1aj",
+"0h1b1J2mQi","IjTwPDcpWB","d85a9Cp3mZ","xReecXyPZN","SWfou8xEKz","WDVWJpv0i7","cL0aEAIYUu","zqH0Wi3pyd","W3VFHs7Mxk","QChxsjzUqR",
+"hSSvQP6bcg","JXljW9iGoT","FnPFBIBe8k","Mm8siUlU3M","CxVEfo8Uyd","ksJbyOUYuF","VerEAFPfSE","taOXKAOgEe","Pb1pak85Ae","M6qcGvkCHH",
+"ciuWzLbRTH","LDk6fJRJQB","No0QbJXljW","OUYuFbgJAz","8U2nUIRh48","uPX7GNcICA","xXTI4LDk6f","pFrrl5drc6","1j5L8RkQke","zz4ZUNAFuw",
+"pAhR1uTacx","QChxsOz8yZ","2ZHdkbrhlQ","v8yFNNAFuw","5iGN5Q6Lix","IjTwPpv0i7","64s8Ns93Ml","gIYvEM6qcG","QClRLpT8wu","n1pmOatef2",
+"S77LHZ4I1v","9iGoTlpF6W","7X3uyQChxs","AOgEevOqCE","B3qemaDGtS","iqv4kuQIcz","AkKTkl83Ud","0Wr5yydG8U","9eoRceuZA5","blLA9QClRL",
+"0Wr5yO3iyQ","IKxdL8TxD7","SjskQ1j5L8","MezSWzY1GY","AkKTkWPmlx","AOgEeydG8U","QbxXc2Nslm","9eoRcFLsph","kB5nP1LB1L","JXljWVprf2",
+"7fKYURsQUq","ru4UGRpBQm","0MR5XI7p2a","9rlg9ThjNn","gjUTuQ6hMC","e6e4zWPmlx","K20wKDQimp","t59lRPOUYS","AkKTk618Di","cShY2gtCA5",
+"BCxeCZuDtD","Vprf2blLA9","SmGzv8U2nU","7hyVvdpe1v","RpBQmlj07Q","lsQGoNhXdu","5nmWvlXFOB","uLtKs8U2nU","MezSWJkzUn","ZJTXHlCMxy",
+"2hEEUL7cGc","07n1czHF1q","FnPFBYjB9t","n8pJ9Q6Lix","NhXducL0aE","4W0TlFwEJz","FhtglazIWp","VBjhzs93Ml","Mm8siiB08l","pv0i7AgJHQ",
+"Z4I1vtuDyS","0ao3lgIYvE","IRh48bZLvS","5ZaEzFPfSE","EdBKcaDGtS","F6PT2ksJby","Vprf2M3zXL","tuDySVBjhz","5Drn0Pb1pa","IjTwPBbwgA",
+"blLA9h1zcH","jeskStAOsr","RsQUql83Ud","a00b5yofH3","1LB1LqUJMd","AmdQdMmKGJ","wiHrZdQ586","VjCZq5drc6","djsrvaL6AJ","Uvlv4gdQsS",
+"AXpwEuLtKs","lj07QMGlTF","64s8NbgJAz","9GXkXBpYhV","CK5W7oVQp6","prNT6i3pyd","Fhtgl7X3uy","a00b5EOE1o","BbwgAJIqXi","7lUXZAkKTk",
+"K4GS8yvOMI","0YAGHSmGzv","55rfBlXFOB","lXFOBW3VFH","hUTw7LewvM","Uvlv424ARF","lCMxyPOUYS","RmDcrrz7Ut","tlILtsqVrf","HlUbFNhXdu",
+"AOgEe16lHc","Ul4a15iGN5","Yh1hFO3iyQ","M3zXLK20wK","CdyBVS77LH","KASQ8aFFss","UlU3MOxWIH","zY1GYa00b5","KsjRKDLhzM","NAFuwNcICA",
+"FGzgpCfgr3","7X3uySbRYy","pFrrltjQxs","8cVD3SmGzv","FNYIMlweGy","3otm6WmadA","pv0i70h1b1","2ZHdk0ao3l","m4bxUaL6AJ","GrDg7CIShG",
+"RsQUqqaofN","7lUXZDQimp","NOHszjtn0X","b29RJ3weIF","uJScXQnJ1S","G1RhSPYBf4","8TxD7OxWIH","VerEAciuWz","lpF6WuPX7G","yToGWGSQwj",
+"FcWrWZ4I1v","gdQsSru4UG","W7cTs4dEz6","Ta8f6lweGy","v2eC3vOqCE","0MR5XZv7z0","TXQ0ZzQt6Q","OxWIHzqH0W","tjQxsn8pJ9","2NslmVIlwP",
+"Cp3mZRACuj","2DREszHF1q","14FLRRzaZA","m4bxUyvOMI","bZLvSTa8f6","In3NSCIShG","x3LDegdQsS","K4GS8RpBQm","0ao3ldpe1v","MojnPQssNC",
+"8xEKzLDk6f","KASQ8yluBx","oVQp67hyVv","07n1cnFqik","zbIYYZzJHW","he9IASWfou","CK5W7dpe1v","YOfrYZzJHW","dpe1vqaofN","DcpWBFcWrW",
+"piJSkjiVBP","x3LDevkCHH","lkMUAdmoS7","oGu6xcmXIX","BGaQYulk41","7hyVvokgRi","iKqhrgIYvE","ogLgcPOUYS","ni2v1IBe8k","1LB1L55rfB",
+"ni2v1GrDg7","iKqhrgdQsS","suY4xjS1aj","S2DfuWDVWJ","6q6L9jfREu","lsQGoF6PT2","xXTI4cmXIX","gIYvEsx5Gl","sx5GlCqqaD","v2eC3No0Qb",
+"SWfouIKxdL","FGzgpgjUTu","1v5hHP6bcg","Cfgr3a00b5","Ss0Zu48cHL","7lUXZjS1aj","tAOsrW3VFH","0h1b1ZJTXH","pT8wu7fsYM","VjCZqpWiOs",
+"uTacxuoStw","CqqaDKZamH","Ta8f69GXkX","qaofNWreyP","jfREuyofH3","gdQsSoQ87r","HzZT8Y1mC0","iwzGkFPfSE","b29RJbrhlQ","14FLRuJScX",
+"ciuWzfFDrJ","lpF6WZJTXH","RACujvkCHH","n1pmOVBjhz","zbIYYMm8si","ogLgcSmGzv","FxX9q7Ow5C","ZhwG1FcWrW","8TxD7zbIYY","RkQkeWaWsv",
+"lViBvlj07Q","7Ow5CQYxC0","RmDcr8hJdt","oQ87rFLsph","uvf7ATwano","580YDNxx9V","MmsIom4bxU","S77LHaDGtS","1LB1LiKqhr","FxX9qtaOXK",
+"QWxoT45cIH","Mm8siFFDui","WDVWJSWfou","vLsmSGrDg7","FcWrWDcpWB","uQIczJJs5m","HzZT8QChxs","suY4xjiVBP","IKxdLfaHir","2hEEUnnP8o",
+"580YDuPX7G","jzUqRUvlv4","h1zcHRACuj","dhSuHNo0Qb","YjB9tlkMUA","WmadAJ2mQi","KsjRK1LB1L","3weIFZJTXH","sx5GlYh1hF","9GXkX1j5L8",
+"aez9yzFgtB","lCMxyXflUq","SjskQ5Mg9r","16lHcatef2","zHF1qQnJ1S","atef2aL6AJ","OHaBzWPmlx","yluBxIBe8k","ksJbyFxX9q","DG4sT4dEz6",
+"lsQGoO3iyQ","lweGyMojnP","QworuM6qcG","BbwgARACuj","2NslmQYxC0","07n1cQ6hMC","uTacxM3zXL","Chuy3Mm8si","TXQ0ZsqVrf","QssNCxciqp",
+"Yf2Ec9iGoT","iqv4kyToGW","tlILta00b5","jS1ajl83Ud","nFqikNxx9V","ulk41wDajX","WreyPgdQsS","qQxHPaDGtS","IKxdLMaJQs","BpYhVkB5nP",
+"C2IrcqUJMd","fcwDa8cVD3","16lHcazIWp","9GXkXZv7z0","9XyT98TxD7","BpYhVtl72W","FwEJzsuY4x","L7cGcb29RJ","YOfrY2hEEU","S77LHlj07Q",
+"Q6LixGWqqX","RBhp0HzZT8","jeskSbZLvS","oGu6xZUnqt","IBe8kRACuj","ru4UGpT8wu","TCgPpcmXIX","GSQwjECMvU","n8pJ9KZamH","VIlwPCNHmv",
+"aez9yy94nw","xXTI43weIF","uZPqgzQt6Q","0BmCyNcICA","QClRLlpF6W","7ku1pUlU3M","I7p2a9eoRc","uupzktvdkD","uupzkG1RhS","yofH3sx5Gl",
+"SbRYyIjTwP","uJScXGSQwj","Yf2EcCqqaD","Waim6lXFOB","FnPFBSmGzv","ZJTXH6AFT0","VIlwPCdyBV","ZJTXHWmadA","b29RJcQOnv","F6PT2yEfy9",
+"B3qem5drc6","AIYUuZhwG1","MmsIo1j5L8","SjskQ07n1c","0Wr5yEOE1o","MmKGJsuY4x","fcwDaQworu","Vprf2hE1Ql","7Ow5CzqH0W","zmLYDIn3NS",
+"0BmCyjS1aj","0KyfsBFkb8","0Wr5yFnPFB","2ZHdkReKEW","YOfrY4QMc9","YOfrY9GXkX","cL0aEgjUTu","hi5X7MmKGJ","jiVBPe6e4z","ogLgcn8pJ9",
+"gtCA5HP433","m4bxUK20wK","FxX9qhe9IA","5iGN5t59lR","BGaQYWaWsv","GrDg7azIWp","7X3uyAOgEe","BCxeCuupzk","9iGoTn1pmO","FGzgp5VZjS",
+"1LB1LuQIcz","KsjRKQnJ1S","Qworuatef2","0ao3lPOUYS","jzUqR0h1b1","IKxdL1v5hH","GWqqXgjUTu","CK5W7tAOsr","zqH0Wn8pJ9","5iGN5suY4x",
+"BFkb8oGu6x","1j5L8uAWyp","TCgPpnlaBy","HzZT8DG4sT","iB08lqUJMd","OxWIH0BmCy","gtCA5JKWYR","tlILtHfyNQ","IKxdLi3pyd","qQxHPgjUTu",
+"qQxHP1v5hH","iKqhrSjskQ","m4bxU1v5hH","uLtKsiB08l","dQ586aFFss","QYxC0Kr8ys","FwEJz0PktI","8hJdt16lHc","RmDcrL7cGc","9rlg9RBhp0",
+"qaofNYjB9t","iqv4kNxx9V","FnPFBI7p2a","cmXIX5drc6","8FmFHVBjhz","QClRLaL6AJ","HP433t59lR","yToGWZuDtD","xXTI48U2nU","mz8gxIRh48",
+"a00b5atef2","OUYuFGXdoH","QChxspAhR1","GXdoHgdQsS","3otm6F6PT2","Ta8f6QssNC","v1HlnEdBKc","ulk41gf8rI","yofH3WDVWJ","9GXkXxciqp",
+"HP433LDk6f","wDajXMojnP","29QAzYjB9t","mz8gxuJScX","ZuDtDDG4sT","cL0aEvLsmS","hUTw7lj07Q","RsQUqFLsph","KASQ8MGlTF","9eoRcsuY4x",
+"uPX7GogLgc","cL0aExReec","MGlTF9y4lw","qUJMdRkQke","07n1cW3VFH","Chuy3tvdkD","8FmFHfaHir","6AFT0ZzJHW","oQ87re6e4z","bgJAzSWfou",
+"X6PintvdkD","UmaEvzY1GY","bZLvSjS1aj","24ARFI7p2a","SjskQVIlwP","8RCUApiJSk","MojnPAmdQd","Q6hMCMkgy8","L7cGc8U2nU","qUJMd3weIF",
+"qQxHPyvOMI","gdQsSKsjRK","5IhmGiKqhr","y94nwNAFuw","2DREsgdQsS","I7p2aZ4I1v","CK5W7xciqp","0KyfstAOsr","nnP8o64s8N","CxVEfYf2Ec",
+"tjQxsydG8U","vkCHH0PktI","he9IAWmadA","JJs5mCp3mZ","AmdQdhE1Ql","ZJTXHyofH3","CIShGo8Uyd","cShY2SjskQ","VBjhzMaJQs","guMb8QnJ1S",
+"jiVBPtuDyS","LDk6fjSjS3","yofH3t59lR","ciuWztjQxs","rhl0JzbIYY","IKxdLvLsmS","zFgtBsqVrf","tAOsrIBe8k","0Wr5y8xEKz","XyPZNuQIcz",
+"brhlQFwEJz","s7MxkDQimp","lweGyNo0Qb","aFFssvLsmS","5nmWv1LB1L","FNYIMGWqqX","gjUTuoVQp6","QChxsciuWz","zFgtBrKDLJ","gjUTutvdkD",
+"SWfouKsjRK","9iGoTsqVrf","oVQp6618Di","OHaBztuDyS","hUTw7lsQGo","5Drn0YjB9t","dpe1vQnJ1S","uupzkZhwG1","zqH0WoVQp6","Q6hMCQChxs",
+"B3qemTwano","5Drn0W3VFH","okgRivOqCE","nFqikKZamH","618DiPYBf4","s4786aL6AJ","C2IrcciuWz","6AFT0Rxrsm","PYBf4DQimp","U3yw5zbIYY",
+"a00b5JRJQB","QYxC07ku1p","LDk6f14FLR","jtn0XTCgPp","Chuy3BGaQY","pAhR1s7Mxk","CNHmv6q6L9","0ao3lydG8U","Gv3FqsuY4x","NAFuwSWfou",
+"rz7UtjeskS","EoToP2TRI7","tjQxsd7vjM","9XyT9lCMxy","pT8wu5nmWv","CIShGGXdoH","M3zXL5drc6","dQ586nnP8o","bgJAzpmeCd","Gv3FqI7p2a",
+"No0QblpF6W","ReKEWFcWrW","L7cGcHlUbF","MezSWJXljW","QYxC0d85a9","JJs5mpWiOs","kZANmsoy9t","Ss0ZuyluBx","JXljWC2Irc","1v5hHIBe8k",
+"lViBv9eoRc","Uvlv4sqVrf","lsQGod7vjM","hSSvQPb1pa","2TRI7pFrrl","7Ow5CQWxoT","9GXkXkZANm","UlU3MAgJHQ","7fsYM2DREs","EOE1oni2v1",
+"hSSvQFLsph","d85a95Drn0","5Drn0sx5Gl","PYBf4OxWIH","StlDJhSSvQ","x3LDeJ2mQi","suY4xJJs5m","jS1ajFxX9q","aDGtSWreyP","FxX9qoGu6x",
+"zHF1q9XyT9","suY4xzQt6Q","jS1ajxXTI4","Yw2oUjiVBP","G1RhS16lHc","Gv3Fqni2v1","yluBxzz4ZU","StlDJwDajX","DLhzMv2eC3","Vprf2RmDcr",
+"WMiS3djsrv","lj07Qgf8rI","JXljWFNYIM","ECMvUokgRi","dmoS7hE1Ql","G1RhS9rlg9","yofH3G1RhS","OHaBz5drc6","EoToP0h1b1","jiVBPuN6r3",
+"GXdoHlViBv","EdBKcru4UG","ciuWzogLgc","iKqhrVprf2","2TRI7zFgtB","Waim62TRI7","gjUTuHP433","5drc6Waim6","Gv3Fq8hJdt","9eoRcM6qcG",
+"POUYSgIYvE","cL0aE5Mg9r","cShY2blLA9","wiHrZCfgr3","brhlQsqVrf","dpe1vpvgjS","SWfou3otm6","lsQGodmoS7","Vprf2lViBv","JkzUnzqH0W",
+"yvOMIZ4I1v","Cfgr3Twano","0YAGHfqypy","t59lR0ao3l","7Ow5Cxciqp","jzUqRMmKGJ","hi5X7mX2GE","UlU3M5ZaEz","Yw2oUYf2Ec","Nxx9V2Nslm",
+"QbxXci3pyd","tvdkDfFDrJ","blLA9FGzgp","gtCA5W3VFH","dQ586CdyBV","lm0pDQWxoT","y94nwAgJHQ","b29RJRzaZA","lViBvfcwDa","07n1cx3LDe",
+"PYBf4B3qem","tvdkDLDk6f","Mkgy8zbIYY","prNT6IRh48","GSQwjDLhzM","zHF1qrhl0J","Chuy3Twano","SjskQ9XyT9","uQIcz5ZaEz","he9IA9iGoT",
+"2Yz7Erhl0J","xciqpsx5Gl","ZJTXHqaofN","CK5W7b29RJ","QWxoTm4bxU","oQ87rQworu","Pb1paM6qcG","QYxC09y4lw","zbIYYUvlv4","Pb1paK20wK",
+"MmKGJ7lUXZ","MezSWnFqik","S77LHKASQ8","2Yz7ERxrsm","Kr8ysLewvM","zQt6QKsjRK","HfyNQzbIYY","nnP8o55rfB","0ao3lYOfrY","pmeCdWDVWJ",
+"zqH0WWPmlx","Zv7z045cIH","0YAGHMaJQs","jSjS34dEz6","FjHXRDLhzM","GrDg7LDk6f","Yf2EcWMiS3","HlUbFpiJSk","5drc62ZHdk","CNHmvv2eC3",
+"SmGzvVNCPd","l83Ud7lUXZ","nlaBy45cIH","WPmlxpvgjS","0ao3lZ4I1v","GrDg7Cfgr3","MaJQsQ6hMC","ZzJHW5ZaEz","uN6r3MaJQs","zHF1qFLsph",
+"1LB1LGrDg7","5Mg9r9eoRc","yofH3Mm8si","K4GS8xXTI4","blLA9gf8rI","7ku1pMezSW","fFDrJM6qcG","ulk41rhl0J","pWiOs0YAGH","Yf2EcBFkb8",
+"CIShGdjsrv","2hEEUM3zXL","ogLgcWMiS3","xReecnFqik","Mm8siiwzGk","Mm8sixXTI4","5iGN5yofH3","B3qempT8wu","TCgPpvkCHH","iB08luvf7A",
+"pAhR1s4786","JkzUn1j5L8","iwzGkfqypy","AkKTkVNCPd","NOHszbgJAz","ydG8UUmaEv","HzZT8djsrv","9GXkXnnP8o","3otm6gIYvE","0ao3lY1mC0",
+"16lHcK4GS8","AmdQdlpF6W","hUTw7GXdoH","ni2v19eoRc","ZhwG1QssNC","EOE1oCqqaD","v8yFNWMiS3","618Di4QMc9","fFDrJuupzk","RpBQmfLNg8",
+"zqH0WNcICA","gIYvE1j5L8","jeskSjeskS","9rlg9Yw2oU","t59lRDG4sT","lm0pDix74r","AOgEegf8rI","2NslmtuDyS","pWiOsRACuj","lsQGo8xEKz",
+"pvgjS0BmCy","MmsIoLDk6f","G1RhS24ARF","D6rByuoStw","kZANmkZANm","v1Hlnlm0pD","POUYS24ARF","Vprf2U3yw5","n8pJ98xEKz","M3zXLiKqhr",
+"45cIHmz8gx","FVMxoFnPFB","fqypydjsrv","Ul4a1rhl0J","Yh1hFs4786","VjCZq2Yz7E","AOgEeReKEW","EoToPS77LH","yofH3I7p2a","fFDrJnnP8o",
+"aez9yD6rBy","cL0aEm4bxU","TXQ0ZjS1aj","Gv3FqM3zXL","BpYhVtaOXK","SbRYyzHF1q","MK07YDcpWB","v8yFNUvlv4","lkMUAZzJHW","cL0aEK4GS8",
+"0ao3lh1zcH","Oz8yZAOgEe","RACujatef2","0h1b1azIWp","oVQp6yToGW","8hJdt5drc6","YjB9tRpBQm","RmDcrRkQke","Q6hMC24ARF","ni2v1FcWrW",
+"s7MxkReKEW","aez9y8FmFH","F6PT28xEKz","Mkgy8WreyP","ksJbytaOXK","5VZjSlH1kt","lj07Q5Drn0","5Drn0lViBv","O3iyQYf2Ec","XflUqKZamH",
+"s4786zQt6Q","M3zXLStlDJ","Nxx9VBpYhV","okgRituDyS","v2eC3Z4I1v","fFDrJMmsIo","FjHXRqUJMd","YjB9tLbRTH","IKxdL7lUXZ","t59lRPb1pa",
+"IBe8kiwzGk","WaWsvWMiS3","xXTI4TCgPp","WreyPVprf2","BpYhVWaWsv","64s8Ni3pyd","zFgtB6AFT0","prNT6Yh1hF","Uvlv4AmdQd","prNT6SWfou",
+"ulk41AIYUu","l83UdCfgr3","cmXIXni2v1","1LB1LtjQxs","djsrvPOUYS","1j5L87lUXZ","MK07YnFqik","t59lRC2Irc","azIWp1v5hH","aez9yZJTXH",
+"JJs5mTa8f6","aDGtSJkzUn","FwEJz9rlg9","Chuy3M3zXL","RxrsmHzZT8","HP433lkMUA","6AFT0s7Mxk","MezSW7ku1p","Dz1R3v1Hln","yToGW5IhmG",
+"QWxoTiB08l","3weIF3otm6","aDGtS5Namm","AIYUuh1zcH","2NslmfmIK1","ciuWz5drc6","lXFOBFLsph","9eoRctlILt","fLNg855rfB","FLsphtl72W",
+"5VZjSb29RJ","07n1c5nmWv","RmDcr0YAGH","5iGN5RsQUq","FLsphOz8yZ","LewvMlkMUA","tl72WVNCPd","UmaEvLbRTH","xciqpuQIcz","5VZjSFnPFB",
+"oVQp6RkQke","lViBvhe9IA","o8UydI7p2a","AIYUuDG4sT","M6qcG9GXkX","OUYuFNo0Qb","hUTw7jiVBP","618DiD6rBy","K4GS8VerEA","NcICAdhSuH",
+"RkQke1v5hH","RxrsmzFgtB","ZzJHW0ao3l","48cHLHRxd8","aFFssJ2mQi","0YAGHYh1hF","s4786oVQp6","tlILtYh1hF","5Drn0pFrrl","QssNCuoStw",
+"e6e4z5Mg9r","0ao3l5nmWv","7fKYUeuZA5","HlUbFCNHmv","1j5L8ZzJHW","k85AeuN6r3","ru4UGjiVBP","I7p2ataOXK","1LB1LlViBv","cmXIXlm0pD",
+"guMb8jeskS","FnPFBokgRi","FNYIMiKqhr","Mkgy8aL6AJ","8TxD7AXpwE","pv0i7qUJMd","QbxXcblLA9","0MR5XM3zXL","0KyfsUmaEv","I7p2aFPfSE",
+"U3yw5FGzgp","SjskQ2Yz7E","QbxXcJ2mQi","TXQ0ZjeskS","3weIFChuy3","djsrvi7WMQ","ZzJHWJKWYR","yToGW8cVD3","2TRI7soy9t","uN6r3WmadA",
+"VIlwPGXdoH","ulk41sx5Gl","JKWYRaFFss","wDajX4W0Tl","rKDLJsoy9t","Pb1paxciqp","24ARFh1zcH","7lUXZM3zXL","M3zXLKr8ys","8U2nU8cVD3",
+"s4786OxWIH","LDk6f2TRI7","0YAGHv1Hln","lViBvYw2oU","9GXkXi7WMQ","ZzJHWVerEA","b29RJFcWrW","pvgjSTwano","qQxHP8FmFH","KsjRKb29RJ",
+"S77LHHP433","M6qcGdhSuH","Q6Lix5ZaEz","lXFOBNhXdu","euZA5iqv4k","lm0pDYOfrY","soy9ti7WMQ","Yw2oU1LB1L","5Drn0Z4I1v","QnJ1SBFkb8",
+"djsrvGSQwj","uPX7G9GXkX","Cfgr3JXljW","JRJQBIjTwP","FnPFBIjTwP","DcpWBMm8si","24ARFSmGzv","tjQxss4786","VjCZqMGlTF","29QAz48cHL",
+"FcWrWK4GS8","8U2nU5Mg9r","jiVBPDG4sT","uN6r3WMiS3","NOHszsoy9t","Waim66AFT0","ZUnqtUvlv4","0PktISjskQ","CNHmvIRh48","1j5L8Mm8si",
+"2ZHdk2ZHdk","jeskSPOUYS","tl72Wb29RJ","jeskSyluBx","U3yw5azIWp","K20wKX6Pin","cShY2guMb8","QssNCVprf2","xReecgf8rI","Pb1padQ586",
+"580YD4W0Tl","uLtKsrKDLJ","uoStwHfyNQ","sx5GlNAFuw","uupzkU3yw5","aFFssQChxs","hUTw7dQ586","djsrvzmLYD","Mkgy8v2eC3","oGu6x2Nslm",
+"dmoS7Vprf2","SjskQrz7Ut","DcpWB24ARF","t98iWNxx9V","ReKEWfcwDa","uoStwuupzk","4dEz60MR5X","ulk4107n1c","lH1kttAOsr","ReKEWiKqhr",
+"JIqXiuoStw","gIYvENOHsz","fcwDaC2Irc","Cfgr3MmKGJ","2Yz7EIBe8k","GrDg7FnPFB","VNCPdM6qcG","D6rBy2DREs","9rlg9JkzUn","4dEz6C2Irc",
+"h1zcHTCgPp","Yw2oUlsQGo","M3zXLni2v1","7fsYM5drc6","2DREsVjCZq","zFgtBPOUYS","oQ87raL6AJ","4W0TlNAFuw","1v5hHC2Irc","i3pydl83Ud",
+"e6e4zD6rBy","MojnPBCxeC","8FmFHFPfSE","RmDcrReKEW","vkCHH55rfB","jtn0XZzJHW","Twano8hJdt","t98iWMK07Y","RxrsmRsQUq","JRJQB7hyVv",
+"uvf7A4W0Tl","HP433vkCHH","pAhR17ku1p","MezSWBFkb8","uJScX8hJdt","s4786W7cTs","CqqaD8U2nU","zQt6QM3zXL","vkCHHoGu6x","Chuy3suY4x",
+"ix74r6AFT0","YOfrYzQt6Q","nlaBy48cHL","tlILtbgJAz","QWxoT9GXkX","azIWpo8Uyd","o8Uydk85Ae","MezSWiB08l","jS1ajdQ586","pFrrlguMb8",
+"B3qemxXTI4","pFrrlYh1hF","qUJMdrKDLJ","pvgjSZJTXH","618DitlILt","OxWIHwiHrZ","vLsmSiB08l","gtCA5LbRTH","48cHLzQt6Q","lCMxyEOE1o",
+"nlaBy5Namm","ulk41cQOnv","pT8wu64s8N","d7vjMaFFss","ydG8Uatef2","KZamH5iGN5","yToGWlViBv","uoStw3otm6","FhtglFxX9q","cQOnv07n1c",
+"8xEKzhYBCK","t59lRYf2Ec","JJs5mFLsph","sqVrfQChxs","oGu6x7fKYU","U3yw5OHaBz","v8yFNYjB9t","DQimpCNHmv","dhSuHm4bxU","h1zcHlViBv",
+"7lUXZzY1GY","MezSWuoStw","WMiS3gdQsS","k85Ae9y4lw","taOXKfmIK1","FnPFBNxx9V","JIqXiuAWyp","lj07QciuWz","gIYvEI7p2a","jeskSL7cGc",
+"oVQp6LbRTH","ZJTXHIn3NS","CNHmvZJTXH","24ARFIRh48","CdyBVLewvM","brhlQD6rBy","QClRLReKEW","FxX9qHRxd8","5ZaEznnP8o","GWqqXZuDtD",
+"qUJMdhi5X7","uvf7AFPfSE","FNYIMjtn0X","FnPFBxReec","NOHszVjCZq","8xEKzRsQUq","mz8gxi7WMQ","djsrvsuY4x","aL6AJK4GS8","aFFsshYBCK",
+"qUJMds7Mxk","hi5X7brhlQ","X6Pinm4bxU","e6e4zazIWp","zQt6Qlj07Q","y94nwU3yw5","aL6AJn1pmO","J2mQiZzJHW","Yh1hF8cVD3","9XyT90ao3l",
+"rz7UteuZA5","SWfouLDk6f","uQIczAkKTk","Qworu55rfB","hUTw7IKxdL","XflUqMojnP","aDGtScShY2","MGlTFMmKGJ","o8UydzFgtB","Ss0Zu6q6L9",
+"4W0TldQ586","FVMxoix74r","ix74rWreyP","x3LDejeskS","5nmWvpvgjS","Vprf2RsQUq","BCxeCgjUTu","TCgPp9XyT9","oGu6xazIWp","n1pmOv2eC3",
+"vLsmSQYxC0","QnJ1SW7cTs","nFqikVNCPd","prNT6aFFss","OHaBzix74r","RkQkeY1mC0","VNCPdOz8yZ","cL0aExXTI4","Nxx9V5ZaEz","aL6AJuQIcz",
+"QbxXcix74r","Pb1paSWfou","7Ow5Cdpe1v","wDajX8cVD3","uQIczuN6r3","cShY2RBhp0","JKWYR07n1c","OHaBz5Drn0","8hJdtpAhR1","7lUXZMGlTF",
+"8TxD7wDajX","blLA9Qworu","9y4lwWDVWJ","vkCHHXflUq","QChxsVIlwP","ydG8UfFDrJ","FPfSEOHaBz","AXpwESmGzv","h1zcHAOgEe","uoStwlXFOB",
+"FwEJz7hyVv","qUJMduQIcz","ZhwG1M3zXL","0PktIGWqqX","Yf2Ecmz8gx","7lUXZ4W0Tl","jzUqRlkMUA","AXpwEzbIYY","1v5hHMGlTF","lCMxy9rlg9",
+"ZzJHWgIYvE","Nxx9V1v5hH","MaJQsuvf7A","ni2v1lXFOB","8TxD7Y1mC0","QClRLQbxXc","hi5X7HzZT8","lj07QpWiOs","M6qcGUvlv4","7lUXZXflUq",
+"MmKGJd7vjM","WDVWJv1Hln","CK5W7zQt6Q","iB08l5nmWv","1j5L8hE1Ql","RxrsmYh1hF","he9IAn8pJ9","wDajXnlaBy","ulk41QssNC","uQIczuTacx",
+"tAOsrGv3Fq","Uvlv49eoRc","MojnPOUYuF","U3yw5tAOsr","nlaBy2ZHdk","t59lRK20wK","8TxD7B3qem","jtn0X0PktI","4dEz6IKxdL","v2eC3FwEJz",
+"djsrvFNYIM","1LB1LlXFOB","9y4lwX6Pin","piJSkZzJHW","D6rByXyPZN","bZLvSt98iW","QssNCP6bcg","AgJHQpvgjS","J2mQioGu6x","0BmCyO3iyQ",
+"Yh1hFfaHir","t59lRRkQke","9rlg9prNT6","xciqpjfREu","CdyBVlkMUA","3otm63otm6","7lUXZydG8U","QYxC0MK07Y","RmDcrQworu","1v5hHFPfSE",
+"cmXIXQssNC","pWiOsIn3NS","ZzJHW1v5hH","uLtKsStlDJ","he9IAFLsph","MmKGJXyPZN","n8pJ92ZHdk","piJSk0BmCy","618DiWaWsv","fcwDaKr8ys",
+"kZANmHfyNQ","3weIFzQt6Q","5IhmGzHF1q","yToGWjfREu","pvgjSmz8gx","LbRTHlkMUA","euZA5CqqaD","fcwDaZv7z0","8FmFHDG4sT","M3zXLFFDui",
+"pWiOsUlU3M","StlDJYjB9t","CxVEfzqH0W","jSjS3EdBKc","lweGyW7cTs","jfREu9GXkX","29QAzS2Dfu","XflUqFGzgp","d85a9MGlTF","ZuDtDVjCZq",
+"9rlg9RpBQm","UmaEvO3iyQ","0MR5Xs93Ml","5drc6Q6Lix","AIYUulsQGo","8FmFHHP433","1j5L8soy9t","SbRYye6e4z","v8yFNiKqhr","suY4xIjTwP",
+"tjQxs5iGN5","JKWYRVLTy6","fLNg8oGu6x","LbRTHgf8rI","o8UyduJScX","TCgPpNo0Qb","o8UydlViBv","Fhtgl9eoRc","s7Mxk2ZHdk","jfREuReKEW",
+"7hyVv9iGoT","Q6LixkZANm","YjB9tlm0pD","XyPZN5drc6","K4GS8i3pyd","l83UdMmsIo","yEfy9AOgEe","ciuWzS2Dfu","djsrvEOE1o","jSjS3CxVEf",
+"d85a98FmFH","K4GS8xReec","DG4sTsx5Gl","mz8gx9eoRc","3otm6gtCA5","kZANmoQ87r","9rlg9IjTwP","guMb80MR5X","JJs5mjSjS3","uTacxNxx9V",
+"QnJ1SMojnP","6AFT0ZhwG1","C2IrcEOE1o","nFqikuN6r3","ogLgcOHaBz","uJScX2ZHdk","fFDrJ8TxD7","n1pmOJ2mQi","7fKYUjSjS3","MmKGJQ6Lix",
+"zQt6QBbwgA","Ul4a1DQimp","Yw2oUIKxdL","lH1ktciuWz","a00b5pv0i7","X6Pin2DREs","MaJQsHP433","prNT6tlILt","lXFOBblLA9","Yh1hF7X3uy",
+"dmoS7rhl0J","Vprf20Kyfs","iqv4k5Mg9r","aez9ywiHrZ","AOgEeiqv4k","VNCPdgjUTu","RxrsmUlU3M","0BmCy3weIF","pv0i7Gv3Fq","CK5W7IRh48",
+"Vprf2cL0aE","2NslmQssNC","he9IAh1zcH","S2DfuOHaBz","JXljWMmsIo","VIlwPv8yFN","RzaZA7hyVv","7X3uy0MR5X","s4786ogLgc","5ZaEzcmXIX",
+"lweGyn8pJ9","3otm6S2Dfu","JkzUnnFqik","FPfSEt59lR","cL0aE0ao3l","618DiQbxXc","nnP8oOHaBz","ogLgcNAFuw","qaofNguMb8","0MR5XRpBQm",
+"0PktIOxWIH","xReecMGlTF","uAWyprz7Ut","qQxHPYh1hF","pFrrl7fKYU","G1RhS48cHL","WMiS3CNHmv","CdyBV55rfB","DLhzMP6bcg","No0Qbt98iW",
+"JJs5ml83Ud","AkKTkaDGtS","lweGyF6PT2","Ul4a1L7cGc","WaWsvtl72W","yvOMIZUnqt","y94nwlH1kt","zbIYYMezSW","UlU3MgjUTu","J2mQiNOHsz",
+"vLsmSCIShG","lViBvZhwG1","FGzgpqaofN","9y4lwTCgPp","aez9y4W0Tl","s4786CqqaD","NhXduQWxoT","Vprf25Drn0","AIYUufqypy","Ul4a1blLA9",
+"SmGzvUl4a1","9iGoTU3yw5","Ul4a1618Di","Dz1R3ogLgc","kB5nPQ6hMC","0PktILDk6f","hi5X7Dz1R3","1v5hHQssNC","RmDcrRzaZA","zmLYDcL0aE",
+"QWxoTJIqXi","jeskStl72W","lH1ktFxX9q","Chuy3hYBCK","oVQp6aDGtS","Zv7z0l83Ud","MGlTFAOgEe","mX2GE618Di","QssNCoGu6x","lH1ktK4GS8",
+"5VZjSsoy9t","DQimpNcICA","m4bxUSs0Zu","OUYuF2Nslm","atef28RCUA","3otm6QChxs","8cVD3RsQUq","WmadAHRxd8","EoToPQ6hMC","VIlwPJIqXi",
+"BGaQYYh1hF","wiHrZIRh48","IBe8kMGlTF","ThjNn5ZaEz","Yh1hFJJs5m","RACujUvlv4","Ta8f6kZANm","VjCZqTCgPp","MaJQsNo0Qb","BFkb83otm6",
+"x3LDeqaofN","xReecuZPqg","AgJHQTwano","CxVEfpiJSk","uQIczwDajX","rhl0J9eoRc","AmdQdBCxeC","ZzJHWlViBv","AIYUujtn0X","IBe8kPOUYS",
+"HP433e6e4z","QChxs6AFT0","BGaQYYOfrY","xReect59lR","XyPZNgtCA5","K4GS8uvf7A","7ku1pyToGW","yofH3NAFuw","Gv3FqpvgjS","0YAGHAIYUu",
+"9iGoT5ZaEz","Z4I1vNxx9V","2DREsNAFuw","RBhp0ZhwG1","F6PT25VZjS","LbRTHpvgjS","VLTy6RmDcr","5Mg9rvOqCE","D6rByzHF1q","ni2v1L7cGc",
+"BCxeCxXTI4","3weIFaFFss","ECMvUG1RhS","brhlQXflUq","pT8wuAXpwE","8xEKzaL6AJ","TwanoFcWrW","8U2nURsQUq","nnP8oQworu","HzZT8d85a9",
+"pFrrlJRJQB","uPX7Glm0pD","tuDySm4bxU","s4786CIShG","0Wr5y5nmWv","CIShGWmadA","0ao3lJRJQB","2ZHdk9iGoT","oGu6xNOHsz","2ZHdkpmeCd",
+"o8Uydpv0i7","5NammqUJMd","sx5Glsx5Gl","0YAGHRzaZA","cmXIXtvdkD","rz7UtyToGW","uLtKsCK5W7","AXpwEKr8ys","gjUTuY1mC0","Ss0ZuRBhp0",
+"7ku1p5ZaEz","WMiS3NAFuw","ksJbyMK07Y","QssNCv8yFN","Yf2EczFgtB","0KyfszFgtB","x3LDeM3zXL","yEfy9ni2v1","jeskSdhSuH","HP433iqv4k",
+"pvgjS24ARF","t59lRBGaQY","OHaBzIBe8k","FxX9qTCgPp","zmLYDbrhlQ","ksJbyLDk6f","RzaZAni2v1","jzUqRVLTy6","gdQsSblLA9","Yf2EcBCxeC",
+"7fKYUCdyBV","RxrsmGSQwj","zFgtBxReec","RACujY1mC0","SbRYyMK07Y","uJScX5Mg9r","x3LDeaez9y","tl72WGrDg7","suY4x0YAGH","fcJOyUmaEv",
+"TXQ0ZuPX7G","QChxsZzJHW","SWfouPYBf4","s7MxkxReec","iB08lMojnP","jzUqRyofH3","8RCUAFjHXR","S77LHt98iW","suY4xTXQ0Z","C2Irc8hJdt",
+"dpe1vFVMxo","QnJ1SZ4I1v","8U2nURxrsm","S77LHRkQke","5NammDG4sT","QworuyluBx","lkMUARzaZA","RzaZAW3VFH","Kr8ysX6Pin","Twanov2eC3",
+"0MR5XbgJAz","CdyBVaFFss","MaJQsMojnP","Oz8yZFcWrW","nlaByY1mC0","LbRTH5nmWv","StlDJfaHir","pT8wus93Ml","b29RJS77LH","s4786lkMUA",
+"EoToPcQOnv","nnP8otl72W","tl72Wsoy9t","U3yw5Dz1R3","D6rBy16lHc","4QMc9WmadA","8cVD30Kyfs","G1RhSCK5W7","vLsmSNOHsz","7Ow5CSs0Zu",
+"9GXkXUlU3M","HlUbFpv0i7","Kr8ysuoStw","0BmCy9GXkX","ZJTXHyvOMI","gjUTu8cVD3","pWiOsuZPqg","tl72Watef2","FjHXRuTacx","t98iWHzZT8",
+"I7p2asuY4x","48cHLnlaBy","prNT6zFgtB","HP433Waim6","JJs5mNo0Qb","FhtglStlDJ","7fKYUM3zXL","GSQwjk85Ae","Q6LixUmaEv","d7vjM07n1c",
+"ECMvUF6PT2","dhSuHTa8f6","29QAzAkKTk","RzaZAZJTXH","gf8rIiB08l","Yw2oU29QAz","FPfSEyofH3","YOfrYQbxXc","2Yz7E29QAz","Waim6Y1mC0",
+"bgJAz4QMc9","I7p2auoStw","ZhwG17ku1p","NOHsz24ARF","pWiOsXflUq","oQ87rlpF6W","qaofNX6Pin","UlU3MWDVWJ","k85AeWreyP","VIlwP16lHc",
+"JXljW7X3uy","TCgPppAhR1","tvdkDzHF1q","MojnPfLNg8","Chuy38TxD7","Vprf21v5hH","uupzkSWfou","8RCUALDk6f","4dEz61j5L8","Mkgy8K20wK",
+"iB08lhSSvQ","ZJTXHZJTXH","2TRI7OUYuF","ZzJHWGrDg7","xciqplCMxy","fcJOyv2eC3","WMiS3G1RhS","TXQ0ZS2Dfu","EOE1oogLgc","cShY2euZA5",
+"OHaBzuoStw","euZA5tuDyS","FcWrW8cVD3","lViBvFNYIM","fqypyt59lR","jSjS3zHF1q","2NslmVNCPd","bgJAzuN6r3","fcwDaaL6AJ","XyPZN07n1c",
+"OHaBzyvOMI","QworuSjskQ","vOqCEHP433","FNYIMuTacx","5NammFjHXR","ni2v1iB08l","SWfoui3pyd","nFqiksqVrf","v8yFNOUqFM","djsrv7X3uy",
+"yluBx2DREs","HP433zFgtB","FnPFB8hJdt","3otm6BbwgA","7fsYMjtn0X","Waim6yofH3","4W0TlGrDg7","yToGWStlDJ","BFkb8oQ87r","n8pJ99iGoT",
+"jS1ajC2Irc","RBhp0In3NS","DG4sTwiHrZ","pT8wu0Kyfs","vOqCEBpYhV","cmXIXaDGtS","nlaByJXljW","lkMUAMmKGJ","CIShGsqVrf","JXljWWreyP",
+"dpe1v7fsYM","fqypyJKWYR","cQOnvQ6Lix","LDk6fJXljW","brhlQaL6AJ","faHiruoStw","ZzJHWWMiS3","AmdQduAWyp","lCMxyD6rBy","0YAGH2TRI7",
+"ZJTXH2Yz7E","uPX7GgtCA5","lsQGoFFDui","d7vjMqUJMd","pAhR1W7cTs","0PktIkB5nP","KZamHOUYuF","n1pmOzY1GY","soy9tF6PT2","NAFuwydG8U",
+"ksJbyzQt6Q","FcWrWsuY4x","lCMxyZJTXH","VjCZq5Namm","XflUqU3yw5","QClRLpv0i7","zFgtBGrDg7","7X3uyHfyNQ","v8yFNsuY4x","hE1QlStlDJ",
+"EoToPC2Irc","OxWIHl83Ud","0Wr5ygjUTu","U3yw5DcpWB","mz8gxhUTw7","QbxXc6AFT0","Waim6fmIK1","45cIHa00b5","wDajXblLA9","yToGWksJby",
+"Ul4a1Gv3Fq","vOqCERpBQm","Yh1hFJ2mQi","VLTy6n1pmO","HzZT8FFDui","ksJbyaL6AJ","lViBvWreyP","s93MlzHF1q","dQ586Qworu","RkQkeaFFss",
+"XflUqfcJOy","Kr8yswDajX","uoStw7hyVv","zHF1qaDGtS","fFDrJNxx9V","RsQUqRzaZA","GWqqXs4786","t59lRuZPqg","azIWpaDGtS","8RCUAyofH3",
+"FcWrWHlUbF","uQIczCK5W7","uTacxPYBf4","zz4ZUs7Mxk","4QMc9dQ586","MezSWv1Hln","8hJdtzHF1q","StlDJfFDrJ","mX2GE16lHc","VIlwPxXTI4",
+"7hyVvv2eC3","IRh48cL0aE","iwzGkRACuj","WPmlxCfgr3","64s8Ndjsrv","9rlg9oVQp6","kB5nPEdBKc","RzaZAMojnP","oQ87r5Drn0","MojnPAIYUu",
+"iKqhr5nmWv","KsjRKCqqaD","Kr8ys9iGoT","FnPFB5nmWv","uvf7AYh1hF","HP4337fKYU","5ZaEzF6PT2","tjQxsulk41","rhl0JiKqhr","rz7UtuZPqg",
+"rKDLJyToGW","MmsIotl72W","RBhp0AOgEe","9XyT9fFDrJ","FcWrWogLgc","y94nwY1mC0","gjUTuAIYUu","uQIczm4bxU","QChxsJJs5m","KASQ8FFDui",
+"qaofNt59lR","UmaEvGWqqX","t98iWD6rBy","zHF1qqUJMd","7lUXZs4786","ECMvUBFkb8","t59lRvkCHH","ReKEWsx5Gl","vLsmSQClRL","0ao3lXflUq",
+"atef2a00b5","MmKGJG1RhS","oVQp6ksJby","VIlwPtl72W","Uvlv4SbRYy","Waim6ECMvU","I7p2ad85a9","lH1ktW7cTs","y94nwQnJ1S","uAWyprhl0J",
+"zQt6QciuWz","fLNg8FcWrW","Mkgy8jfREu","Fhtgl0YAGH","VIlwP4W0Tl","Ul4a1QChxs","7hyVvAkKTk","Mkgy8W3VFH","soy9tHlUbF","9y4lwOz8yZ",
+"pmeCduTacx","9GXkXJkzUn","RzaZAM6qcG","kZANmjzUqR","dmoS7hi5X7","O3iyQEoToP","MojnPjtn0X","zFgtBjSjS3","jiVBPsoy9t","VBjhznlaBy",
+"SWfoua00b5","lH1ktZUnqt","jiVBP9iGoT","X6PinzQt6Q","piJSkLewvM","L7cGcAXpwE","9iGoTMkgy8","pWiOscmXIX","ni2v1HfyNQ","No0QbjzUqR",
+"tjQxsbrhlQ","580YDlkMUA","RxrsmjS1aj","i3pydAIYUu","v8yFNblLA9","wDajXKASQ8","55rfBJkzUn","CK5W7AgJHQ","tl72WGSQwj","Mm8siFjHXR",
+"iwzGkQYxC0","7lUXZnFqik","n8pJ9hSSvQ","Cfgr3Ss0Zu","uTacxXyPZN","7X3uypWiOs","5Mg9rHlUbF","yofH39eoRc","0YAGHWPmlx","RBhp0AkKTk",
+"3weIFHzZT8","pFrrl9eoRc","xciqpQChxs","cShY25ZaEz","suY4xWaim6","RxrsmY1mC0","zHF1qNhXdu","ciuWzzmLYD","gjUTuEOE1o","Cfgr3xXTI4",
+"x3LDe8U2nU","TCgPpdpe1v","618Dixciqp","RxrsmgtCA5","Vprf24W0Tl","CxVEf618Di","uvf7A64s8N","JKWYRRzaZA","8cVD3v1Hln","aFFsstuDyS",
+"m4bxUgdQsS","gjUTuh1zcH","EOE1ozbIYY","FLsph2Yz7E","TCgPplH1kt","FFDuiX6Pin","GWqqX9y4lw","dmoS7RBhp0","TwanoGv3Fq","O3iyQsuY4x",
+"7Ow5C5ZaEz","S77LHM3zXL","l83Udb29RJ","EoToPUl4a1","h1zcHMojnP","azIWptjQxs","1j5L8NAFuw","jfREuyvOMI","qQxHPzHF1q","IBe8kkB5nP",
+"ZJTXHX6Pin","sqVrfatef2","pv0i7tuDyS","OHaBzprNT6","Z4I1vfaHir","i7WMQtuDyS","KsjRKmX2GE","Mm8siZUnqt","prNT6CNHmv","QYxC0fqypy",
+"UmaEvd7vjM","DQimpwiHrZ","POUYSfaHir","1v5hHMaJQs","yluBxM3zXL","pT8wuG1RhS","64s8NBpYhV","ZJTXH8FmFH","blLA99rlg9","NAFuwJkzUn",
+"brhlQ0ao3l","O3iyQGSQwj","AIYUu2ZHdk","xReecpFrrl","zbIYYYOfrY","pFrrlKZamH","9XyT9jfREu","JJs5mKsjRK","uTacxZv7z0","Ss0Zu0h1b1",
+"KZamHv1Hln","ydG8UlpF6W","hUTw7VBjhz","W7cTsBCxeC","In3NSC2Irc","Dz1R3xciqp","618DitvdkD","dQ586EdBKc","3weIFjeskS","9y4lw16lHc",
+"ZhwG1i7WMQ","ZJTXH5VZjS","MojnPU3yw5","5NammRzaZA","5nmWvAXpwE","BFkb8W7cTs","OHaBzs7Mxk","pWiOse6e4z","zbIYY5ZaEz","2hEEUdhSuH",
+"hSSvQuQIcz","8cVD3Qworu","4W0Tl64s8N","zFgtBIKxdL","Z4I1v5VZjS","QWxoTW7cTs","AgJHQNo0Qb","JXljWgjUTu","lXFOBfcJOy","07n1cFVMxo",
+"NAFuwWDVWJ","fqypyWaWsv","mz8gxuN6r3","IjTwPBGaQY","2TRI7VIlwP","4dEz6iwzGk","Oz8yZuAWyp","yvOMIJIqXi","d7vjMs7Mxk","QWxoThUTw7",
+"FVMxoBCxeC","gjUTui7WMQ","lXFOBMezSW","yvOMIZv7z0","rKDLJVLTy6","gIYvEMmKGJ","t59lR0h1b1","FLsphLbRTH","prNT6pT8wu","580YD4dEz6",
+"ru4UGsqVrf","IRh48kB5nP","KZamHDcpWB","VIlwPa00b5","DQimpJJs5m","FjHXRjS1aj","KASQ89eoRc","x3LDeIjTwP","BGaQYvkCHH","K20wKUlU3M",
+"FhtgloGu6x","Yw2oUuvf7A","580YDCp3mZ","FGzgpsuY4x","IKxdLD6rBy","Vprf2UlU3M","djsrvjeskS","BpYhVKr8ys","v1HlnW7cTs","tlILt7lUXZ",
+"taOXK6AFT0","yvOMIuN6r3","ZJTXH5drc6","pFrrlReKEW","IBe8k9XyT9","jfREuGSQwj","In3NSMK07Y","HzZT8uLtKs","DQimpgdQsS","faHirv8yFN",
+"OUqFMMK07Y","O3iyQd85a9","QClRLdjsrv","hUTw78xEKz","zY1GYVerEA","FGzgpZUnqt","djsrvCxVEf","8xEKzRxrsm","s93MlJIqXi","6AFT0FPfSE",
+"BFkb8XyPZN","xciqp45cIH","Waim6uupzk","BGaQYsx5Gl","pvgjStl72W","nnP8ojiVBP","yEfy9VLTy6","AgJHQtAOsr","DcpWBk85Ae","ThjNnRzaZA",
+"TwanofaHir","xReec1j5L8","CdyBVFhtgl","P6bcgpT8wu","618DisuY4x","iqv4ky94nw","Cp3mZ0YAGH","fmIK1S77LH","zbIYYsx5Gl","CqqaDAgJHQ",
+"RACujgf8rI","Pb1pagIYvE","OHaBzLbRTH","fFDrJ9XyT9","jSjS3M3zXL","QssNCK4GS8","fcwDaQbxXc","BpYhV0PktI","0ao3lhe9IA","KsjRKoGu6x",
+"QWxoTlj07Q","MojnP5ZaEz","0YAGHDQimp","16lHc07n1c","Nxx9VmX2GE","kB5nPHRxd8","LDk6f5Mg9r","WDVWJtjQxs","5IhmGGWqqX","JkzUnYjB9t",
+"n1pmOKr8ys","qUJMdYOfrY","RACuj4dEz6","POUYSKsjRK","Yw2oUjS1aj","euZA5NhXdu","Cfgr345cIH","aDGtSQ6Lix","4QMc9pWiOs","J2mQih1zcH",
+"9iGoTprNT6","yEfy9Ss0Zu","G1RhSI7p2a","8FmFH5IhmG","rhl0JfmIK1","uQIczF6PT2","faHirSmGzv","0BmCytlILt","MmKGJe6e4z","PYBf4No0Qb",
+"2Yz7EUvlv4","hSSvQs7Mxk","S77LHQClRL","HzZT8wDajX","48cHLrhl0J","fFDrJGv3Fq","dmoS72Yz7E","ciuWzZuDtD","piJSktjQxs","VjCZqdpe1v",
+"fcJOyFcWrW","ciuWzD6rBy","uAWypblLA9","cShY2i3pyd","Uvlv40BmCy","9iGoThe9IA","ZzJHWCfgr3","Oz8yZJkzUn","5iGN5CK5W7","VLTy6QbxXc",
+"XflUqI7p2a","QYxC0OHaBz","8U2nUfcwDa","taOXK24ARF","Dz1R3kZANm","yEfy9AgJHQ","aez9yWDVWJ","QbxXcFjHXR","iqv4kGv3Fq","fqypyxciqp",
+"dmoS7pWiOs","rz7UtPOUYS","CxVEfVerEA","XyPZNv8yFN","l83UdQworu","2Yz7EzFgtB","MGlTFO3iyQ","tjQxs0PktI","Dz1R3o8Uyd","2DREsQClRL",
+"9eoRcVNCPd","o8UydsuY4x","WDVWJuAWyp","tlILtwiHrZ","xXTI4vkCHH","VIlwPJ2mQi","RpBQmStlDJ","zHF1qs93Ml","zqH0WVerEA","1v5hHy94nw",
+"3weIFtlILt","Z4I1vcmXIX","S77LH8cVD3","TwanoKZamH","rhl0JKZamH","HfyNQwiHrZ","okgRiv2eC3","sqVrf3weIF","uoStwZuDtD","K4GS8C2Irc",
+"IBe8kZzJHW","AOgEezHF1q","2ZHdkcQOnv","AIYUuSs0Zu","uPX7G7X3uy","Yf2Ect59lR","zFgtBiKqhr","gf8rIJkzUn","FxX9qzHF1q","prNT60h1b1",
+"gjUTuaL6AJ","rz7UtTXQ0Z","uQIcziwzGk","QChxse6e4z","SjskQZv7z0","JIqXiEoToP","oVQp664s8N","S77LHx3LDe","C2Irc8FmFH","suY4xpv0i7",
+"vkCHHgIYvE","lViBvdjsrv","4dEz6FFDui","yofH3Cfgr3","fLNg8ru4UG","oQ87ruoStw","QbxXcSbRYy","yvOMIVIlwP","UmaEv1v5hH","OHaBzZ4I1v",
+"Oz8yZ8U2nU","LbRTHWPmlx","RmDcrfqypy","5nmWvGv3Fq","ThjNnOxWIH","SjskQZzJHW","yluBxQChxs","uJScXVprf2","IKxdLQssNC","8U2nUxciqp",
+"Oz8yZtAOsr","Oz8yZFxX9q","SbRYyB3qem","FxX9qcmXIX","MGlTFLewvM","SWfouUl4a1","tjQxs8cVD3","9y4lwe6e4z","AgJHQlpF6W","tl72W8FmFH",
+"FNYIM16lHc","jiVBPjSjS3","dQ586m4bxU","VNCPdW7cTs","OHaBzdmoS7","oQ87ryvOMI","TXQ0ZnnP8o","tAOsrAIYUu","fqypyguMb8","5IhmGThjNn",
+"lViBvatef2","faHirv2eC3","hUTw7OxWIH","gdQsS9iGoT","tlILto8Uyd","C2Irc7hyVv","4W0TlyToGW","pFrrlzz4ZU","G1RhSRsQUq","Z4I1vUlU3M",
+"suY4xtl72W","WmadAlXFOB","Kr8ysblLA9","GXdoHmX2GE","n1pmOMezSW","jtn0XBGaQY","Y1mC0nnP8o","POUYSqaofN","2hEEUKr8ys","Ss0ZuVIlwP",
+"t59lRpv0i7","CIShG8cVD3","No0Qbv8yFN","TCgPpYh1hF","aDGtS0Wr5y","Mm8siMmKGJ","WreyPLDk6f","x3LDeYjB9t","1LB1LJXljW","LDk6ffLNg8",
+"ReKEWIn3NS","Q6Lix2ZHdk","VIlwPqUJMd","StlDJWaim6","0MR5XWaim6","VerEAv8yFN","JJs5mMGlTF","WPmlx0PktI","VerEAG1RhS","FNYIMCNHmv",
+"CxVEf29QAz","4QMc9VNCPd","CNHmvatef2","5NammtuDyS","BpYhVv1Hln","JkzUn2Yz7E","RACujF6PT2","VIlwPGv3Fq","dQ586uvf7A","ECMvUxciqp",
+"QYxC04dEz6","J2mQi45cIH","TXQ0Zfqypy","OxWIHmz8gx","AOgEeVBjhz","CdyBVzz4ZU","uPX7Gaez9y","AXpwETCgPp","G1RhSzmLYD","2Yz7ESmGzv",
+"uQIczni2v1","iqv4kpv0i7","lm0pDRkQke","MK07YZJTXH","MezSWgf8rI","SmGzvkB5nP","kZANmpmeCd","yluBxFjHXR","kB5nPlm0pD","iqv4k5drc6",
+"8cVD3RpBQm","WaWsvjS1aj","fqypySmGzv","ZzJHWiqv4k","gtCA5n8pJ9","ReKEWJ2mQi","16lHciKqhr","GXdoH9y4lw","dhSuHBCxeC","Ss0Zu29QAz",
+"VLTy68xEKz","POUYSs7Mxk","lkMUA0ao3l","QnJ1SZuDtD","SmGzvFLsph","ix74rFGzgp","45cIHRxrsm","VerEAOHaBz","dhSuHFxX9q","ydG8UblLA9",
+"uAWypWPmlx","EdBKcfcwDa","ulk41lXFOB","fLNg8QYxC0","MGlTFM3zXL","ulk41HP433","lkMUAZ4I1v","HP433pvgjS","4dEz6QssNC","wiHrZ9iGoT",
+"ZUnqt0Wr5y","CqqaDZUnqt","7fKYUuTacx","ZzJHWW7cTs","lpF6W0Wr5y","0ao3lZhwG1","he9IAfcwDa","lpF6Wix74r","BGaQYuZPqg","mz8gxtvdkD",
+"Yf2EcjiVBP","3weIF55rfB","zbIYYQChxs","6AFT0StlDJ","QnJ1SIKxdL","Yw2oUFnPFB","cQOnvdjsrv","iqv4knnP8o","ogLgcsqVrf","0PktIuZPqg",
+"Cfgr3iqv4k","h1zcHWPmlx","48cHL580YD","Yh1hFDG4sT","uTacxWmadA","aDGtS9XyT9","NAFuwAIYUu","AIYUufmIK1","5nmWvCp3mZ","XyPZN7fsYM",
+"gtCA5zbIYY","RxrsmB3qem","ZzJHWmz8gx","NhXdufmIK1","x3LDeLewvM","NhXduuTacx","lViBvrhl0J","W7cTsFjHXR","tuDySl83Ud","2TRI7zz4ZU",
+"SjskQXflUq","cL0aEkZANm","zbIYYFcWrW","MojnPuTacx","YjB9tCdyBV","FGzgp7X3uy","zQt6Q0YAGH","SmGzvBbwgA","hYBCK16lHc","CK5W7yToGW",
+"Q6LixpiJSk","iKqhryluBx","JKWYRtAOsr","jfREuCqqaD","oVQp6XyPZN","BbwgA9rlg9","uupzkatef2","MezSWuJScX","4QMc9hE1Ql","jSjS3WaWsv",
+"MGlTF8RCUA","XflUqtAOsr","6AFT0HzZT8","8RCUAlViBv","Oz8yZKASQ8","24ARFFPfSE","xReectl72W","7lUXZWaim6","b29RJxXTI4","Y1mC0BpYhV",
+"8TxD75Mg9r","qQxHPSjskQ","lCMxyMmKGJ","QworuYh1hF","UlU3M7hyVv","JXljWWPmlx","S2Dfu55rfB","zFgtBFhtgl","OUqFMsoy9t","L7cGcP6bcg",
+"Yw2oUNhXdu","RkQkehi5X7","LbRTHI7p2a","M6qcG5VZjS","xReecHlUbF","M6qcGWaWsv","SWfou2Yz7E","LewvMwiHrZ","BFkb8Ta8f6","gf8rIMGlTF",
+"AgJHQMaJQs","guMb8aDGtS","gdQsSUl4a1","DLhzMGv3Fq","CdyBVM3zXL","EOE1oDz1R3","uN6r30BmCy","QClRLUvlv4","iwzGkTwano","dmoS7zmLYD",
+"uupzk2ZHdk","9rlg9FjHXR","v2eC3Vprf2","lj07Q7ku1p","s93MlIn3NS","QbxXcfmIK1","45cIHdQ586","pv0i7NAFuw","n1pmOMojnP","FFDuiLewvM",
+"y94nwCxVEf","gIYvEB3qem","MGlTFs93Ml","hE1Qlt59lR","VerEAhUTw7","fcJOyQ6hMC","OUYuFni2v1","BFkb8JRJQB","gjUTuGXdoH","8cVD3hUTw7",
+"0MR5XsqVrf","TwanociuWz","uJScXZJTXH","Vprf2guMb8","64s8Nxciqp","ydG8URzaZA","djsrvWDVWJ","BFkb8Dz1R3","lsQGoMK07Y","7Ow5CQ6Lix",
+"JIqXiRxrsm","8U2nUfaHir","tjQxsix74r","CxVEfuN6r3","UlU3MuoStw","P6bcg4QMc9","MK07YECMvU","SWfouzz4ZU","dhSuH9eoRc","guMb8zQt6Q",
+"s4786tl72W","ZuDtDLDk6f","RkQkePOUYS","euZA5aFFss","TCgPpMGlTF","vOqCEAXpwE","Yh1hFxReec","uQIczStlDJ","Nxx9VF6PT2","GSQwjNhXdu",
+"qUJMdI7p2a","ogLgcFcWrW","hSSvQQssNC","14FLR8RCUA","Nxx9VcmXIX","EdBKcOUYuF","NAFuwL7cGc","azIWp4QMc9","uQIczK20wK","ru4UGv8yFN",
+"ni2v129QAz","ksJbyuPX7G","9y4lwJJs5m","9iGoTdhSuH","GrDg7tuDyS","jS1ajZUnqt","EOE1oOUYuF","5nmWvgIYvE","9GXkXFwEJz","oVQp67fsYM",
+"oVQp6gtCA5","Oz8yZMmsIo","55rfBmz8gx","tlILtNAFuw","aDGtS14FLR","CIShGBCxeC","Zv7z0VIlwP","sx5GlqQxHP","Y1mC0t98iW","G1RhSru4UG",
+"FwEJzNAFuw","AgJHQ3weIF","gdQsS5VZjS","SWfouLewvM","ogLgc9GXkX","W3VFHaDGtS","1j5L80Wr5y","uTacxlweGy","2TRI7Fhtgl","0h1b1uAWyp",
+"fcwDaHfyNQ","7X3uyHRxd8","07n1ciqv4k","WreyPjeskS","8xEKzFhtgl","Z4I1vVprf2","9eoRcDz1R3","ZJTXH9eoRc","5NammVLTy6","VIlwPWaWsv",
+"ogLgcv1Hln","7fKYUQworu","ni2v12ZHdk","Pb1pafcJOy","9y4lw0YAGH","uN6r32ZHdk","I7p2aRpBQm","KASQ8Twano","LDk6fHRxd8","HP433lViBv",
+"zFgtBTa8f6","OUqFMy94nw","FFDuiMm8si","ZzJHWNhXdu","ZJTXHK4GS8","FGzgpMGlTF","b29RJuupzk","WDVWJd7vjM","zHF1qfcwDa","gjUTuuJScX",
+"C2IrcfLNg8","ZzJHWXflUq","Mkgy8m4bxU","yvOMIVerEA","xXTI40ao3l","jfREuIBe8k","3weIFnlaBy","cmXIXjS1aj","7ku1p8U2nU","ksJbyWreyP",
+"b29RJZuDtD","uPX7GBpYhV","ZUnqtSjskQ","MezSWlpF6W","QssNC1LB1L","Y1mC0B3qem","HfyNQiB08l","JXljWpWiOs","Cp3mZeuZA5","dhSuHzbIYY",
+"IBe8kAOgEe","qaofNBGaQY","prNT6vLsmS","DG4sT3otm6","DG4sTPOUYS","xReecKZamH","gf8rInlaBy","Waim6EoToP","iKqhr5Namm","GXdoHdhSuH",
+"F6PT2NhXdu","AIYUu5ZaEz","7lUXZMmKGJ","okgRimX2GE","XyPZNWmadA","jSjS3QChxs","iB08lUvlv4","Ta8f6fmIK1","P6bcg7fsYM","aFFssGXdoH",
+"L7cGcD6rBy","BpYhVjS1aj","t98iW0PktI","ReKEWprNT6","jfREu5Namm","FnPFBVNCPd","d85a9ix74r","9rlg9lkMUA","YjB9tyToGW","9y4lwNAFuw",
+"AkKTkvLsmS","nnP8oChuy3","qaofN6AFT0","0MR5XazIWp","RsQUqCNHmv","jtn0X5VZjS","sx5GlL7cGc","2NslmBFkb8","QssNCrz7Ut","FjHXRfaHir",
+"2ZHdks93Ml","4QMc9iqv4k","WPmlxEOE1o","ZzJHWM3zXL","SmGzvWaim6","SWfou7ku1p","O3iyQZv7z0","qQxHP0Wr5y","jzUqRBGaQY","DG4sTQYxC0",
+"BFkb8StlDJ","djsrvKZamH","lsQGopFrrl","i3pydzbIYY","euZA5Gv3Fq","gtCA5Yw2oU","aez9ysoy9t","5Mg9rpWiOs","zmLYDs93Ml","lj07QqUJMd",
+"uZPqgmz8gx","iB08l9iGoT","lH1ktJ2mQi","5IhmGBpYhV","AXpwEDcpWB","m4bxU8hJdt","4dEz6yluBx","IjTwPW7cTs","C2IrcjfREu","wDajX8TxD7",
+"64s8NNOHsz","0PktIjSjS3","zqH0WeuZA5","uPX7Gxciqp","uJScXi3pyd","bgJAzuQIcz","8FmFHZUnqt","fcJOynnP8o","S77LHZv7z0","ru4UGciuWz",
+"ZuDtD64s8N","Nxx9Vsoy9t","FPfSEjfREu","NcICAAmdQd","fcwDa7fKYU","L7cGcjtn0X","lweGyRmDcr","o8UydRmDcr","LewvM5ZaEz","fLNg8W3VFH",
+"NcICAuTacx","KZamHKZamH","TwanoEdBKc","VBjhzzQt6Q","M3zXLatef2","fqypylViBv","U3yw5b29RJ","euZA5Yf2Ec","jS1ajVNCPd","WMiS3atef2",
+"xciqpOUYuF","WreyPJRJQB","bZLvScmXIX","e6e4zprNT6","6AFT0Gv3Fq","TXQ0ZTXQ0Z","mz8gxFcWrW","ru4UGyofH3","uoStwt98iW","jS1aj55rfB",
+"jeskSWaWsv","jS1aj4W0Tl","POUYS1v5hH","ulk41Oz8yZ","sqVrfCxVEf","45cIHv8yFN","lm0pDwDajX","BCxeCGv3Fq","xXTI4RBhp0","Uvlv4jfREu",
+"8cVD3lH1kt","P6bcg1LB1L","pv0i7CNHmv","Ta8f6K4GS8","64s8NaFFss","tl72WMK07Y","JkzUn1LB1L","gIYvEGXdoH","AgJHQ618Di","AkKTk8FmFH",
+"OxWIHuJScX","07n1cs7Mxk","RACuj9y4lw","Yh1hFpvgjS","HP4339GXkX","FjHXRAgJHQ","cShY2Vprf2","Waim67Ow5C","MezSWX6Pin","uJScXJ2mQi",
+"aFFss55rfB","WreyPksJby","G1RhSzQt6Q","NhXduS77LH","n8pJ9s93Ml","8RCUApAhR1","5ZaEzVBjhz","KsjRKt98iW","Q6hMCy94nw","CNHmvVBjhz",
+"7ku1ps4786","bZLvSsqVrf","G1RhSNcICA","2ZHdkFGzgp","2NslmnnP8o","5iGN5JIqXi","dhSuHuAWyp","1j5L8Zv7z0","2DREslH1kt","nFqik2DREs",
+"pAhR1djsrv","TCgPp4W0Tl","soy9thUTw7","n8pJ90MR5X","mX2GElkMUA","CxVEfulk41","TCgPpZUnqt","VNCPdrhl0J","dmoS7oVQp6","QClRLqaofN",
+"K4GS8s7Mxk","VBjhzv1Hln","y94nwLbRTH","Cp3mZP6bcg","FcWrWC2Irc","h1zcHB3qem","RsQUqSmGzv","JIqXilCMxy","Nxx9VNhXdu","HP433POUYS",
+"qaofNLbRTH","J2mQiPOUYS","Kr8ysZhwG1","WaWsv2hEEU","taOXKJkzUn","1v5hHuZPqg","uvf7ANAFuw","SjskQ5drc6","FGzgps7Mxk","yluBxcmXIX",
+"X6PinAmdQd","K20wKMm8si","gf8rIzFgtB","bZLvSfLNg8","5drc6AkKTk","Kr8ys8xEKz","StlDJtjQxs","uJScX9rlg9","iB08leuZA5","uZPqg55rfB",
+"d7vjMeuZA5","hi5X7blLA9","nFqikzmLYD","KZamHlsQGo","7fsYMVprf2","ciuWzUmaEv","07n1ca00b5","QssNClkMUA","aL6AJuN6r3","hUTw7ix74r",
+"8U2nUx3LDe","rhl0JgdQsS","RmDcrzqH0W","M6qcG9XyT9","FjHXRCqqaD","MojnPgjUTu","Q6hMC9eoRc","qQxHPuZPqg","iKqhrFNYIM","1v5hHn8pJ9",
+"k85AeWaim6","GrDg7Yw2oU","uvf7AFLsph","k85Aesoy9t","VjCZqhe9IA","8hJdt8cVD3","FPfSEfLNg8","Zv7z0Ul4a1","uZPqgtvdkD","blLA90h1b1",
+"VerEAvLsmS","ru4UG8TxD7","FPfSEuPX7G","7fKYUzmLYD","In3NS2TRI7","ECMvUWmadA","FGzgplViBv","lH1ktUvlv4","vOqCEuJScX","Mm8simz8gx",
+"okgRiazIWp","Yh1hFNhXdu","zQt6QYOfrY","No0QbNo0Qb","WDVWJS2Dfu","i3pyd29QAz","MezSWgdQsS","2NslmpmeCd","vkCHHn8pJ9","faHirZJTXH",
+"M3zXLpFrrl","uLtKsWDVWJ","faHirxReec","Yh1hFv2eC3","2Yz7EQClRL","5IhmGkZANm","fcJOyfcJOy","SmGzvX6Pin","9rlg9QbxXc","RBhp0zQt6Q",
+"gjUTu9iGoT","cShY2G1RhS","vLsmSe6e4z","AgJHQlj07Q","wDajXAXpwE","dhSuHAmdQd","0ao3llH1kt","TCgPpSs0Zu","Dz1R3MojnP","o8UydokgRi",
+"DLhzMgtCA5","zz4ZUn8pJ9","QnJ1SoQ87r","vOqCEd7vjM","gjUTuVNCPd","Gv3FqSbRYy","uLtKscL0aE","5VZjScQOnv","lViBvxXTI4","0ao3l580YD",
+"Nxx9Vk85Ae","8U2nUMojnP","14FLRru4UG","iqv4koQ87r","Nxx9V1LB1L","s4786vOqCE","a00b50Kyfs","OUYuFRxrsm","07n1cuZPqg","0PktIrhl0J",
+"prNT6okgRi","gIYvEuupzk","CNHmvFcWrW","HlUbFUl4a1","hUTw7fcwDa","580YDcmXIX","YjB9tkZANm","prNT60ao3l","fLNg8CqqaD","Kr8ysUmaEv",
+"rz7Ut9GXkX","RpBQmzqH0W","lkMUAMojnP","xReecCK5W7","Dz1R3CIShG","xReecuN6r3","gdQsSHfyNQ","zbIYYO3iyQ","QClRLMaJQs","atef2oQ87r",
+"Yw2oUd85a9","8cVD3OUYuF","xReechi5X7","zmLYDBbwgA","OHaBzRBhp0","5Mg9rRBhp0","9iGoTzmLYD","7hyVvlpF6W","48cHLCIShG","VNCPdfLNg8",
+"5iGN5lViBv","ix74rkB5nP","o8UydoVQp6","DG4sTv2eC3","kZANmlkMUA","5Mg9rKZamH","y94nwbgJAz","zHF1qPOUYS","2DREse6e4z","7fKYUlViBv",
+"gjUTuyEfy9","IRh487Ow5C","uN6r3brhlQ","K20wKKsjRK","xciqpjzUqR","uupzkMojnP","2Yz7EblLA9","pT8wuRACuj","POUYSt98iW","29QAz45cIH",
+"ix74rVNCPd","v8yFNXyPZN","vkCHHQ6Lix","UmaEvogLgc","ZJTXHChuy3","pAhR1QnJ1S","DcpWBNOHsz","MojnP8xEKz","pT8wuFFDui","Rxrsmhe9IA",
+"1LB1LWDVWJ","azIWpni2v1","X6PinAkKTk","2DREsGWqqX","fFDrJ9y4lw","aez9ypv0i7","WDVWJdmoS7","OHaBz8FmFH","nlaBy29QAz","WreyPcL0aE",
+"QnJ1SFxX9q","9eoRc5iGN5","zbIYYVjCZq","64s8No8Uyd","uoStwyEfy9","CxVEfy94nw","KASQ8gtCA5","tl72WDz1R3","dQ586ni2v1","rhl0JKr8ys",
+"2hEEUJRJQB","e6e4zyEfy9","lXFOBUvlv4","K20wKVNCPd","9XyT9nnP8o","NhXduksJby","0MR5Xlm0pD","O3iyQ45cIH","lkMUA9iGoT","KZamHlXFOB",
+"jfREu1v5hH","Uvlv4StlDJ","soy9tgtCA5","GrDg78cVD3","WMiS3OxWIH","aFFssUl4a1","yEfy9DQimp","HP433zqH0W","lsQGolsQGo","RzaZAEOE1o",
+"VNCPdGrDg7","hi5X7Chuy3","fcwDaM3zXL","VNCPdbrhlQ","MGlTFe6e4z","VerEAIjTwP","cmXIXksJby","W3VFH2Nslm","7fKYUlweGy","jS1ajFnPFB",
+"HP433RBhp0","CqqaDNAFuw","8TxD7FFDui","7Ow5CyEfy9","WreyPhE1Ql","yEfy9VBjhz","GrDg7rz7Ut","zz4ZUbZLvS","GrDg7JKWYR","FNYIM5Drn0",
+"s4786WreyP","WaWsv29QAz","GSQwjMK07Y","Nxx9V2DREs","580YD580YD","ZhwG1xReec","jtn0XCdyBV","LewvMNcICA","2hEEURzaZA","2hEEUzFgtB",
+"FjHXReuZA5","3otm6uupzk","BFkb816lHc","x3LDeEoToP","Chuy3gdQsS","dQ586YjB9t","mz8gxCfgr3","mz8gxciuWz","i7WMQsoy9t","Yh1hFFcWrW",
+"xReecPb1pa","48cHLLewvM","atef2Ss0Zu","KZamHs93Ml","IRh4845cIH","rhl0JTXQ0Z","6AFT0WMiS3","pFrrlEdBKc","vkCHHWaim6","ksJbycmXIX",
+"tuDySY1mC0","TCgPpM6qcG","ECMvUyofH3","P6bcgulk41","CNHmvJKWYR","VjCZq5VZjS","OxWIH14FLR","7Ow5CqUJMd","LDk6fqQxHP","pAhR1VIlwP",
+"dpe1vAXpwE","0ao3lRmDcr","0h1b1IRh48","HfyNQGrDg7","fqypyKZamH","fcJOyI7p2a","KsjRKsx5Gl","OUYuFSbRYy","dpe1vHP433","AmdQdnlaBy",
+"JKWYRyvOMI","vOqCES2Dfu","QbxXclXFOB","bZLvSU3yw5","FFDuioVQp6","ZhwG124ARF","RxrsmFPfSE","IKxdL07n1c","hUTw7lH1kt","e6e4zW7cTs",
+"zbIYYlm0pD","ix74rnFqik","yluBxbgJAz","5iGN5IBe8k","suY4xo8Uyd","uupzkyofH3","POUYSECMvU","MaJQsuPX7G","aDGtShE1Ql","dhSuHOUYuF",
+"tl72WxXTI4","IjTwP0PktI","1v5hHksJby","tl72WiKqhr","9XyT9B3qem","MK07YydG8U","U3yw5gf8rI","bZLvSuvf7A","14FLRRxrsm","TXQ0ZFhtgl",
+"Yh1hFZzJHW","VNCPd7ku1p","1LB1LZv7z0","POUYSo8Uyd","0h1b1tvdkD","VNCPdfmIK1","K4GS8cQOnv","xciqptjQxs","RzaZAWMiS3","QWxoTtl72W",
+"JkzUnZ4I1v","VNCPdAmdQd","K4GS8a00b5","faHiruN6r3","lpF6WBpYhV","ZuDtD16lHc","FjHXRFGzgp","5Drn0KASQ8","EoToPgdQsS","zFgtBmz8gx",
+"5ZaEzDz1R3","ZUnqtRzaZA","PYBf4uZPqg","FwEJz9y4lw","pvgjS8xEKz","m4bxUFnPFB","xXTI48hJdt","In3NSzFgtB","VjCZqd85a9","8hJdtyofH3",
+"24ARFSs0Zu","ZzJHWKASQ8","6AFT0tuDyS","W3VFHNcICA","MGlTFMGlTF","580YDqQxHP","2Yz7EIRh48","AkKTkuN6r3","brhlQtaOXK","WaWsvCIShG",
+"n1pmOjS1aj","0Wr5yyluBx","1j5L8O3iyQ","HfyNQ7lUXZ","SWfougjUTu","JRJQBZJTXH","okgRiYjB9t","S77LHogLgc","9iGoTVerEA","t59lRQnJ1S",
+"6AFT05nmWv","ni2v1J2mQi","AgJHQcmXIX","cShY2tvdkD","TXQ0Zt98iW","7fKYUpvgjS","BFkb8mX2GE","Yf2Ec24ARF","EoToPbZLvS","yEfy945cIH",
+"UlU3MMkgy8","5iGN55drc6","M3zXL5Drn0","5VZjSru4UG","14FLRjS1aj","K4GS8WreyP","brhlQeuZA5","ni2v1M6qcG","soy9tk85Ae","gtCA5jSjS3",
+"s7MxkJ2mQi","ThjNntAOsr","cL0aEpAhR1","tl72WRkQke","v2eC3QClRL","P6bcglCMxy","QYxC0Q6Lix","djsrvIBe8k","TCgPp4QMc9","5Mg9riKqhr",
+"lH1ktgdQsS","FxX9q4QMc9","2Yz7E1v5hH","okgRis93Ml","lpF6W45cIH","5nmWvoGu6x","6q6L9Q6hMC","fLNg8nFqik","ZuDtD45cIH","k85AelH1kt",
+"P6bcgjtn0X","8U2nU7fsYM","tvdkD9GXkX","blLA9ksJby","vOqCE7hyVv","iwzGkogLgc","CqqaDd85a9","aDGtSblLA9","nFqikPOUYS","ThjNnBCxeC",
+"RACujvLsmS","9GXkXJRJQB","oVQp6iB08l","xReecI7p2a","qaofNs7Mxk","SbRYyGWqqX","Chuy3Vprf2","FwEJzdpe1v","soy9tpv0i7","BGaQY9GXkX",
+"ciuWzgtCA5","580YDdjsrv","dhSuHHRxd8","bgJAzzY1GY","FjHXR4dEz6","HRxd8AgJHQ","iwzGkhi5X7","VBjhzjeskS","OxWIHbgJAz","uZPqgzY1GY",
+"8cVD3YjB9t","pAhR15VZjS","gjUTuni2v1","zFgtBGWqqX","pAhR1s93Ml","BFkb8wDajX","kB5nP9XyT9","zFgtBFNYIM","NcICA1v5hH","LewvMUvlv4",
+"AOgEeNo0Qb","0PktINOHsz","prNT6taOXK","zbIYYlViBv","guMb8RzaZA","kZANm14FLR","9GXkX5VZjS","OHaBzGrDg7","EoToP0Wr5y","aL6AJdjsrv",
+"MojnPfaHir","Ss0Zux3LDe","cQOnvjSjS3","0ao3lCxVEf","fqypyfFDrJ","IRh48dQ586","8xEKzS77LH","dQ5862hEEU","dQ586lsQGo","4QMc9sx5Gl",
+"DcpWBzz4ZU","gjUTuIBe8k","SbRYypvgjS","uTacxgf8rI","lm0pDWPmlx","Oz8yZgf8rI","0ao3l9y4lw","XyPZNcL0aE","kZANmYOfrY","Yf2EcF6PT2",
+"No0QbokgRi","B3qems4786","blLA97lUXZ","MK07YOxWIH","0Wr5yd7vjM","5IhmGJRJQB","MmKGJ9XyT9","JkzUnW7cTs","pmeCdUlU3M","lCMxyulk41",
+"0KyfsXyPZN","VjCZqWaim6","Ta8f6tAOsr","64s8NSWfou","7Ow5Ctl72W","Cp3mZK4GS8","PYBf4WMiS3","VjCZqd7vjM","EOE1o0YAGH","rKDLJru4UG",
+"JXljWNcICA","aL6AJyvOMI","jfREue6e4z","TCgPpdjsrv","GrDg7aL6AJ","KZamHWMiS3","tjQxs8RCUA","5drc6oGu6x","64s8Njtn0X","D6rByLbRTH",
+"CdyBVJkzUn","lXFOB5Mg9r","LewvMoGu6x","zQt6QpmeCd","2NslmMmKGJ","JJs5mpFrrl","qaofN9GXkX","MaJQs1j5L8","CxVEf6q6L9","Kr8ysaDGtS",
+"Ul4a1t59lR","MaJQsksJby","VLTy6OUqFM","mX2GElpF6W","VjCZqBGaQY","Cp3mZ5IhmG","DLhzMVprf2","0MR5XpFrrl","JXljWVLTy6","uJScXThjNn",
+"BGaQYStlDJ","FnPFBRpBQm","fcwDaOUYuF","C2IrcQWxoT","iqv4kMojnP","uupzklXFOB","azIWpdQ586","MezSWF6PT2","MmKGJwiHrZ","GWqqXfqypy",
+"sx5GlJRJQB","0YAGHUmaEv","ru4UGX6Pin","ZUnqtXflUq","Chuy3FnPFB","dQ586jeskS","BFkb8JJs5m","cL0aEzz4ZU","7Ow5CMmsIo","QssNCkZANm",
+"618Div8yFN","pT8wuCqqaD","WmadAuoStw","O3iyQ5drc6","tl72W14FLR","45cIHNhXdu","wiHrZxXTI4","xciqptuDyS","45cIH8hJdt","FPfSElpF6W",
+"8xEKzmz8gx","FVMxoFVMxo","RkQkeCdyBV","8xEKzuTacx","tl72W3weIF","LbRTHDcpWB","qUJMdD6rBy","HP433IRh48","fcJOyFxX9q","KASQ8pAhR1",
+"oGu6xxciqp","U3yw5WDVWJ","SWfouHP433","YjB9ttl72W","y94nw2ZHdk","FjHXR4QMc9","Ul4a1qUJMd","ni2v1lpF6W","gdQsSYw2oU","piJSkatef2",
+"qUJMdydG8U","U3yw57lUXZ","I7p2aTCgPp","MojnPYjB9t","jfREutl72W","9eoRcCfgr3","vkCHHZ4I1v","M3zXLzmLYD","euZA5FxX9q","4W0Tlh1zcH",
+"55rfBZv7z0","QClRLlj07Q","hSSvQnlaBy","xReecmz8gx","euZA5BGaQY","7hyVvMojnP","he9IA7ku1p","14FLRU3yw5","v1Hln2Yz7E","QYxC0VLTy6",
+"ZzJHWGWqqX","5drc6pAhR1","yToGWd7vjM","zmLYD9rlg9","Yf2EcRkQke","KsjRKJKWYR","MGlTF1LB1L","GXdoHiwzGk","SjskQ8cVD3","OUYuF8U2nU",
+"uZPqg0ao3l","ydG8UuJScX","HRxd8RACuj","In3NSeuZA5","gjUTuoQ87r","ru4UGfcJOy","5nmWvMK07Y","2DREscShY2","he9IAaDGtS","t98iWlpF6W",
+"NOHsz2Yz7E","pT8wu9iGoT","Waim614FLR","v2eC3MmsIo","0Wr5yPb1pa","1v5hH5iGN5","DcpWBi7WMQ","sqVrfdjsrv","ECMvU29QAz","d7vjM7ku1p",
+"GrDg7d7vjM","SmGzvtaOXK","tl72WeuZA5","M6qcGokgRi","K4GS8v2eC3","jeskSUlU3M","hi5X7GXdoH","7ku1plkMUA","Uvlv4ThjNn","i3pyd0Kyfs",
+"16lHcY1mC0","pT8wuNOHsz","7fKYUXflUq","JKWYRRpBQm","JkzUncQOnv","618DiQssNC","KZamH0h1b1","QClRLzFgtB","tvdkDfaHir","cmXIXyofH3",
+"DG4sTfLNg8","hE1Qld85a9","FVMxoaFFss","mX2GE5Mg9r","tvdkDi7WMQ","uPX7GBFkb8","lXFOBuPX7G","4W0Tl9XyT9","Yf2EcfcJOy","dmoS7zFgtB",
+"WreyPoVQp6","G1RhSHlUbF","tvdkDEdBKc","rhl0JAgJHQ","MmsIoYOfrY","GrDg7yEfy9","nnP8oDLhzM","v1Hln7lUXZ","dmoS7Pb1pa","8hJdtKZamH",
+"ulk4164s8N","CK5W7tuDyS","he9IAI7p2a","1LB1LBGaQY","QworuVLTy6","XyPZN48cHL","GrDg7v1Hln","tAOsrsx5Gl","7Ow5C0MR5X","MGlTFlm0pD",
+"J2mQibrhlQ","FwEJzDz1R3","5iGN5faHir","ZuDtDuN6r3","0MR5Xru4UG","XyPZNe6e4z","cShY224ARF","4QMc9zmLYD","TCgPpNxx9V","tvdkDuoStw",
+"RzaZABGaQY","AkKTkOUqFM","fqypyVerEA","vLsmSCqqaD","VIlwPJXljW","FjHXRHRxd8","iKqhr2Yz7E","djsrvqaofN","8RCUA0Wr5y","jeskSs4786",
+"ECMvUFcWrW","uN6r3cL0aE","gtCA5X6Pin","NAFuwRpBQm","W7cTshSSvQ","0Wr5y7Ow5C","Kr8ysIn3NS","M3zXLogLgc","Yf2Ecd85a9","zY1GYHlUbF",
+"0YAGHyvOMI","WPmlxzqH0W","IKxdLpmeCd","hSSvQRBhp0","6q6L9Yh1hF","n8pJ9BFkb8","prNT62ZHdk","0BmCyOUYuF","48cHL618Di","d85a9rKDLJ",
+"l83UdY1mC0","uupzkbrhlQ","piJSkSs0Zu","djsrv5Drn0","KZamHF6PT2","iwzGkCIShG","WmadAaL6AJ","faHirEOE1o","5NammM3zXL","FVMxoP6bcg",
+"7fKYUS2Dfu","OUYuFUmaEv","5NammLDk6f","uLtKsOUYuF","2Yz7EQssNC","2Yz7EjfREu","4dEz6FwEJz","ReKEWZhwG1","5ZaEzeuZA5","euZA5vkCHH",
+"OxWIHksJby","9y4lwuvf7A","pv0i7okgRi","tAOsrfcwDa","taOXKWPmlx","5Drn0nnP8o","oGu6x8hJdt","uTacxiwzGk","v1Hlnzz4ZU","6q6L9yToGW",
+"hi5X7VIlwP","dQ586BCxeC","QChxsbgJAz","FLsphuQIcz","HzZT83otm6","29QAzWaim6","jiVBPGv3Fq","yToGW5Namm","Nxx9VIRh48","wDajX0Wr5y",
+"tvdkDgdQsS","tlILtJJs5m","n1pmOtvdkD","gf8rIDLhzM","KASQ8QbxXc","0h1b1MGlTF","BCxeC7hyVv","CIShGni2v1","2NslmZv7z0","bZLvSUlU3M",
+"ZUnqtgf8rI","WMiS3suY4x","LDk6fZv7z0","ThjNnzFgtB","LDk6fQClRL","bZLvS0h1b1","pT8wuMezSW","aez9yOHaBz","VIlwPuoStw","QbxXcZJTXH",
+"jfREuhE1Ql","yofH30Wr5y","gdQsSWaim6","BFkb8DG4sT","s7MxkpvgjS","Yw2oUOUqFM","SmGzvRxrsm","sqVrfhUTw7","WreyP07n1c","xXTI49eoRc",
+"FLsphzQt6Q","FhtglFhtgl","6AFT0QssNC","IjTwPFnPFB","iKqhruoStw","2hEEUNhXdu","55rfBUvlv4","RkQkeiwzGk","fFDrJIjTwP","pvgjSpvgjS",
+"8RCUAa00b5","LDk6fWmadA","MmsIoi3pyd","zY1GYKASQ8","F6PT2v2eC3","zY1GYb29RJ","vOqCECdyBV","d85a9HzZT8","cShY2FFDui","RkQkeb29RJ",
+"JXljW5Namm","piJSkFhtgl","s47869GXkX","CNHmv8cVD3","gIYvEDQimp","0PktIStlDJ","n8pJ9lXFOB","O3iyQYjB9t","SjskQjtn0X","tlILt8TxD7",
+"VerEAvOqCE","ru4UGWreyP","uAWypB3qem","618DiOUqFM","QssNCIKxdL","qQxHPi7WMQ","iqv4kuZPqg","oGu6x4W0Tl","JIqXiuZPqg","QssNCpAhR1",
+"rz7UtiKqhr","Q6LixWaWsv","oQ87rs4786","In3NSQ6hMC","RACujyToGW","M3zXLYOfrY","wiHrZuLtKs","FcWrW1j5L8","FcWrWTCgPp","LDk6fcShY2",
+"uPX7GWPmlx","FLsphKsjRK","he9IA64s8N","DLhzMHzZT8","FcWrWMGlTF","ru4UGni2v1","CdyBVTwano","580YDguMb8","t59lRCfgr3","piJSkni2v1",
+"OUYuFReKEW","5nmWv24ARF","cmXIXuZPqg","lkMUApAhR1","BGaQYL7cGc","ydG8UyEfy9","d7vjMXflUq","Nxx9Vhi5X7","ZzJHWXyPZN","1LB1LnFqik",
+"Ta8f6Oz8yZ","lH1ktpT8wu","Yf2EczQt6Q","64s8NqaofN","LewvM9rlg9","mX2GEn8pJ9","MojnPcQOnv","jeskSGv3Fq","8FmFHLDk6f","fLNg8CxVEf",
+"HP433FwEJz","64s8NfFDrJ","24ARFhSSvQ","nFqikdhSuH","2hEEUMkgy8","580YDJXljW","SbRYyEOE1o","v2eC3zFgtB","l83Udm4bxU","580YDCIShG",
+"FNYIMNcICA","0ao3lpWiOs","pv0i77fKYU","7X3uy5Namm","DcpWBFPfSE","DQimpYjB9t","gtCA58TxD7","QClRLEOE1o","RACujTwano","uN6r3JXljW",
+"o8UydRsQUq","OUqFMt98iW","fmIK1FVMxo","tlILtksJby","jzUqRHfyNQ","uAWyp9XyT9","L7cGcvOqCE","VBjhzZJTXH","uZPqghe9IA","9rlg9fmIK1",
+"zbIYY8TxD7","Ss0ZuQClRL","7ku1pVLTy6","FFDuiDz1R3","DcpWBCqqaD","CK5W7v2eC3","Ul4a1ECMvU","ru4UGMmKGJ","5VZjSuTacx","tAOsrS2Dfu",
+"GXdoHbrhlQ","cL0aEt59lR","5drc6HfyNQ","9XyT9YOfrY","djsrv8hJdt","tvdkDprNT6","Z4I1vlCMxy","S2DfuKr8ys","zz4ZUlXFOB","Yh1hFWDVWJ",
+"K4GS8okgRi","qaofNRkQke","qUJMdb29RJ","s93MlydG8U","v8yFNuTacx","CxVEfhUTw7","Q6LixdQ586","No0QbKr8ys","S2Dfuv2eC3","Oz8yZiB08l",
+"cmXIXtuDyS","TwanokB5nP","M6qcGlXFOB","AIYUuMGlTF","v1Hln0MR5X","KASQ8zqH0W","s7MxkCqqaD","6q6L9AmdQd","pT8wugf8rI","8hJdtlj07Q",
+"IRh48U3yw5","29QAzGrDg7","piJSk5nmWv","4W0TlLbRTH","lj07QF6PT2","0PktIlpF6W","t59lRuJScX","8TxD7WmadA","55rfBtAOsr","pT8wuzY1GY",
+"zQt6Q5VZjS","yToGWnFqik","wiHrZRmDcr","1j5L8AgJHQ","WDVWJO3iyQ","RzaZAJIqXi","gjUTun1pmO","14FLRqaofN","Uvlv4wiHrZ","lpF6W1LB1L",
+"7Ow5CLewvM","i3pydn8pJ9","JKWYR1v5hH","VNCPdQworu","P6bcgvOqCE","GXdoHo8Uyd","RmDcrsx5Gl","SWfoupvgjS","JXljWfcJOy","RBhp0suY4x",
+"JRJQBRpBQm","FPfSETCgPp","ogLgcAIYUu","VBjhzlj07Q","ix74rUmaEv","gf8rIwiHrZ","gf8rIUlU3M","2TRI7JKWYR","uAWypVIlwP","pFrrly94nw",
+"dmoS78U2nU","iB08l2ZHdk","he9IA5VZjS","h1zcH2Nslm","MaJQsxciqp","Yh1hF9rlg9","yToGWReKEW","LewvMEdBKc","x3LDeTXQ0Z","WDVWJU3yw5",
+"nlaByo8Uyd","i3pydsqVrf","pv0i7uvf7A","YjB9tuQIcz","618DiVjCZq","QChxsFNYIM","UlU3MQbxXc","d7vjMM3zXL","uAWypm4bxU","FxX9qzqH0W",
+"Zv7z0QYxC0","QChxsVprf2","piJSkReKEW","7Ow5CtAOsr","cQOnvaez9y","rKDLJ0ao3l","zFgtBbZLvS","XyPZNogLgc","RpBQmpv0i7","BFkb88TxD7",
+"2ZHdk64s8N","IjTwP5nmWv","lXFOBPYBf4","hSSvQqQxHP","AOgEen1pmO","Q6hMCD6rBy","yToGWGv3Fq","FwEJz5nmWv","Yw2oUAXpwE","pFrrljeskS",
+"fcJOyFjHXR","l83UdksJby","HlUbFwiHrZ","JJs5mMojnP","DQimpQ6hMC","5ZaEz9iGoT","Dz1R3QnJ1S","pvgjSl83Ud","m4bxUJXljW","Nxx9VhSSvQ",
+"WreyPkB5nP","S77LHd85a9","5VZjSQClRL","y94nwcmXIX","wDajXDG4sT","yvOMIMGlTF","vkCHHh1zcH","x3LDeydG8U","9GXkXTCgPp","lH1kttjQxs",
+"Yw2oU64s8N","d85a95iGN5","Gv3Fq45cIH","P6bcg29QAz","In3NSkB5nP","AIYUupiJSk","YOfrYUlU3M","uAWyp2DREs","UmaEv45cIH","v2eC3cmXIX",
+"jSjS3jzUqR","FPfSEC2Irc","gtCA59GXkX","M6qcGuN6r3","JKWYRVprf2","m4bxUpiJSk","zmLYDOz8yZ","cShY2ZUnqt","kB5nPDz1R3","lsQGoHP433",
+"m4bxURsQUq","v1HlnYOfrY","S2DfuVLTy6","azIWpdhSuH","O3iyQSbRYy","FNYIMksJby","No0QbFNYIM","lkMUACNHmv","cL0aEPYBf4","hi5X707n1c",
+"s93MlMm8si","JkzUn29QAz","CdyBVjzUqR","v2eC3dhSuH","jSjS3uoStw","fmIK1ThjNn","aL6AJEOE1o","1v5hHUl4a1","aez9yAgJHQ","m4bxUF6PT2",
+"tuDySuPX7G","8xEKz8cVD3","FGzgpFVMxo","taOXKRxrsm","Pb1pasqVrf","RmDcr4W0Tl","XyPZNNAFuw","0Kyfstl72W","9GXkXNcICA","BGaQYuPX7G",
+"5VZjSSs0Zu","DQimpxciqp","vOqCECIShG","lweGyb29RJ","gIYvEFPfSE","iwzGkyofH3","rKDLJv1Hln","zY1GYDQimp","dhSuHXyPZN","nnP8o0BmCy",
+"FPfSEMkgy8","Vprf2cQOnv","1v5hHBbwgA","Oz8yZ45cIH","BbwgAiKqhr","rKDLJjS1aj","6AFT0LDk6f","KsjRKMaJQs","5IhmGRzaZA","SWfoucQOnv",
+"WmadAtAOsr","pWiOsFcWrW","dhSuHK20wK","5iGN5VjCZq","iwzGkv8yFN","aez9yIn3NS","6q6L9fqypy","HP433lj07Q","jS1ajuJScX","1j5L8POUYS",
+"XflUqMaJQs","faHirzQt6Q","WPmlxmX2GE","wDajXpiJSk","MojnPOz8yZ","vkCHHnlaBy","PYBf4JRJQB","fFDrJU3yw5","uPX7GuLtKs","Ta8f6lH1kt",
+"lH1ktW3VFH","4QMc916lHc","jeskScL0aE","YOfrYkB5nP","zQt6QaL6AJ","C2Irc4W0Tl","5NammblLA9","gtCA5mX2GE","8xEKz8TxD7","a00b5hYBCK",
+"9XyT9FcWrW","nlaByDcpWB","MmsIo6AFT0","GWqqXk85Ae","LbRTHRzaZA","d85a9pFrrl","pAhR1mz8gx","rhl0JPb1pa","y94nwv2eC3","guMb87ku1p",
+"K20wKBbwgA","16lHcAIYUu","i7WMQ4QMc9","uoStw2DREs","Q6hMCVNCPd","gdQsSDG4sT","jS1ajSjskQ","HlUbFlm0pD","VjCZqjiVBP","7fsYMVLTy6",
+"IKxdLMmKGJ","k85Ae0MR5X","zFgtBni2v1","RBhp0QClRL","QChxssx5Gl","DG4sT6AFT0","zQt6Q0ao3l","ciuWzsx5Gl","FhtglL7cGc","1v5hH7fKYU",
+"pWiOstaOXK","gjUTu8xEKz","Ss0ZuJIqXi","TwanouZPqg","Mm8siuN6r3","7X3uyHP433","XflUqi7WMQ","Yw2oUuupzk","guMb8GrDg7","I7p2a0Kyfs",
+"1v5hHMojnP","FxX9qhUTw7","CNHmvZ4I1v","OUYuFQworu","FhtglF6PT2","tlILtP6bcg","Nxx9VzHF1q","pT8wulm0pD","EoToPs4786","lViBvJRJQB",
+"yEfy95nmWv","29QAz8U2nU","vkCHH0BmCy","Yh1hF2DREs","o8UydYOfrY","FPfSEIKxdL","gtCA5Mm8si","gdQsS5Drn0","cShY22Nslm","i3pydUl4a1",
+"48cHL4W0Tl","o8UydNo0Qb","fqypyd7vjM","jiVBPkZANm","B3qemnFqik","VIlwP8xEKz","WMiS3AgJHQ","No0QbVerEA","GSQwjdQ586","FnPFBMm8si",
+"2hEEUCqqaD","tvdkDm4bxU","e6e4zuLtKs","he9IAFVMxo","P6bcgksJby","NAFuwhE1Ql","fmIK1mz8gx","Z4I1vRmDcr","BbwgAlm0pD","0PktImz8gx",
+"5Drn0xciqp","VjCZqaez9y","O3iyQfFDrJ","prNT6zQt6Q","8TxD7KsjRK","GrDg7Waim6","Pb1pa48cHL","5Drn09XyT9","sqVrfJJs5m","iqv4kDG4sT",
+"jfREuuAWyp","gIYvElH1kt","atef2okgRi","W7cTslweGy","lpF6W0h1b1","hYBCKNcICA","fLNg8gIYvE","J2mQi1j5L8","Chuy3tjQxs","lpF6WCp3mZ",
+"xReecD6rBy","9XyT9UlU3M","RzaZAZzJHW","5drc6n1pmO","t59lRQClRL","8U2nUi7WMQ","e6e4zlsQGo","07n1cFPfSE","nFqikHzZT8","CK5W7zqH0W",
+"5Mg9rBpYhV","pFrrlgjUTu","RACujblLA9","fqypyi3pyd","taOXK7fsYM","fmIK1hi5X7","SbRYyZzJHW","QYxC0dhSuH","n1pmOlweGy","5ZaEz0Kyfs",
+"zHF1qKr8ys","ydG8U64s8N","fcwDa8RCUA","PYBf4VIlwP","WPmlxD6rBy","WPmlx5drc6","W7cTslXFOB","DQimpblLA9","Y1mC0uLtKs","JRJQBvLsmS",
+"lm0pDTXQ0Z","atef2uZPqg","JRJQBuupzk","jtn0XuLtKs","YOfrYqUJMd","oGu6xi7WMQ","MGlTFcmXIX","Z4I1v9eoRc","CNHmvDQimp","mX2GEt59lR",
+"oQ87rCIShG","9rlg9AOgEe","n8pJ9he9IA","yofH3pAhR1","48cHLAgJHQ","JRJQBWmadA","CK5W7dhSuH","1LB1L8TxD7","DcpWB1v5hH","JRJQBhi5X7",
+"he9IAGXdoH","brhlQogLgc","2ZHdkRACuj","8hJdtWaim6","taOXKtl72W","RACujBbwgA","Ta8f6pAhR1","QnJ1Sd85a9","StlDJ7ku1p","POUYS29QAz",
+"ZhwG1ix74r","ThjNn8hJdt","RpBQmnnP8o","RkQkeIjTwP","Yh1hFUl4a1","BpYhVzmLYD","djsrvwiHrZ","OUYuFVIlwP","8RCUAjSjS3","kB5nP0YAGH",
+"AOgEefqypy","yluBxIKxdL","LDk6faez9y","GSQwjNxx9V","MmKGJpiJSk","UlU3Msx5Gl","uQIcz4W0Tl","24ARFVjCZq","Mm8siW3VFH","RsQUqAmdQd",
+"xReecFVMxo","zHF1qwDajX","o8Uyde6e4z","mz8gxogLgc","8TxD78hJdt","IRh48oQ87r","MmKGJD6rBy","Zv7z0nlaBy","ReKEW0ao3l","FGzgpuvf7A",
+"2ZHdkdQ586","G1RhSi7WMQ","5VZjSGWqqX","1LB1L0PktI","jzUqR618Di","FNYIMfFDrJ","FGzgpM3zXL","S2DfutvdkD","fmIK1fqypy","aDGtS0Kyfs",
+"HRxd8dpe1v","Ta8f6ECMvU","zz4ZU0Wr5y","7hyVv16lHc","JKWYRdhSuH","yToGWzHF1q","0KyfsHP433","hUTw7Q6Lix","4QMc9hi5X7","iB08lQChxs",
+"7Ow5CtuDyS","L7cGcmz8gx","VerEAiB08l","uupzkguMb8","5Drn0Dz1R3","QbxXcuupzk","hSSvQLbRTH","X6Pinix74r","No0QbZv7z0","8FmFHSmGzv",
+"dpe1vuAWyp","618Di8RCUA","BpYhVHRxd8","zQt6Q7fKYU","W7cTs580YD","QWxoTCK5W7","WPmlxFPfSE","lpF6W64s8N","FwEJzAkKTk","M3zXLk85Ae",
+"07n1cCqqaD","lXFOBJXljW","7ku1pBFkb8","yofH3ZhwG1","FFDui2Yz7E","zmLYDMezSW","KZamHVIlwP","FwEJzG1RhS","14FLRLbRTH","8TxD7zY1GY",
+"FFDui2ZHdk","uN6r3ulk41","faHirFGzgp","0BmCyv1Hln","fFDrJSWfou","AgJHQjS1aj","XflUqlsQGo","JRJQBBGaQY","U3yw5In3NS","Dz1R3AkKTk",
+"8hJdtfFDrJ","45cIHUl4a1","yToGWHP433","ZUnqtni2v1","s93Ml3weIF","L7cGcSWfou","VIlwPgjUTu","1LB1LNcICA","5Drn0nlaBy","kZANmZUnqt",
+"ulk41kZANm","pvgjSIjTwP","8RCUAI7p2a","2DREssx5Gl","GSQwjuTacx","soy9tl83Ud","7lUXZCfgr3","ni2v1FjHXR","8FmFHIjTwP","OUYuFO3iyQ",
+"SmGzvQChxs","uTacxyofH3","zY1GYM3zXL","atef2Oz8yZ","ulk41MmsIo","ydG8U5Mg9r","WDVWJVprf2","5IhmG55rfB","WPmlx2TRI7","RmDcr5nmWv",
+"MmsIohe9IA","MmsIoLbRTH","gf8rIAXpwE","xXTI4AmdQd","FxX9qfmIK1","2TRI7h1zcH","b29RJUmaEv","KASQ80Wr5y","QworuFVMxo","RzaZAYf2Ec",
+"GSQwjVjCZq","EdBKcTwano","brhlQ1v5hH","RzaZA5nmWv","3otm6BCxeC","EdBKc6AFT0","cmXIXKsjRK","48cHLCK5W7","0MR5XblLA9","hi5X7gf8rI",
+"i7WMQgf8rI","In3NSHzZT8","QChxssoy9t","W7cTsJRJQB","Waim6d85a9","Q6hMCUvlv4","uTacxaez9y","pFrrlNcICA","14FLRP6bcg","MojnPxXTI4",
+"oQ87rZuDtD","d85a9PYBf4","M6qcGDcpWB","618DipiJSk","CK5W7nFqik","jzUqRsuY4x","he9IAKASQ8","tvdkD1j5L8","pmeCdFxX9q","SmGzvWreyP",
+"jeskSCxVEf","EdBKchSSvQ","7ku1pvLsmS","M3zXLHfyNQ","Ta8f6rz7Ut","iB08lIn3NS","FGzgpvLsmS","CdyBVC2Irc","uPX7Gdjsrv","6q6L9ZJTXH",
+"y94nw4W0Tl","VBjhzyluBx","cShY2uupzk","xciqph1zcH","gf8rIJKWYR","IRh48KsjRK","GWqqXogLgc","FjHXRnnP8o","FwEJzOz8yZ","iqv4kZuDtD",
+"uJScXeuZA5","zbIYYGWqqX","VNCPdK20wK","0ao3lAmdQd","qQxHP29QAz","9GXkXtuDyS","taOXKTCgPp","NhXdu4dEz6","t59lRKZamH","ThjNnnnP8o",
+"uvf7A7ku1p","7fKYUoGu6x","YOfrYyvOMI","AXpwEK20wK","Ss0Zue6e4z","5iGN5VIlwP","3weIFVprf2","dhSuHZhwG1","dhSuH5VZjS","jzUqRgjUTu",
+"ZhwG1hYBCK","okgRiS2Dfu","QWxoTulk41","guMb8UlU3M","gjUTujzUqR","SmGzvDLhzM","8cVD3EoToP","7fsYMzbIYY","HlUbFeuZA5","CxVEfIBe8k",
+"wDajXpAhR1","7fsYMo8Uyd","lsQGoJ2mQi","lH1ktHfyNQ","blLA9618Di","7fKYU618Di","oQ87rt98iW","tjQxsM6qcG","HRxd8FcWrW","QnJ1Sxciqp",
+"fcwDarhl0J","FcWrWMkgy8","WaWsvReKEW","tjQxspT8wu","ECMvUjzUqR","4dEz6v8yFN","dmoS7lViBv","MezSWMaJQs","5NammK20wK","AgJHQkB5nP",
+"0YAGHUlU3M","lj07QMm8si","9iGoTru4UG","CqqaDWMiS3","fmIK1Nxx9V","8TxD7ru4UG","Yf2Ec8U2nU","PYBf4gIYvE","QnJ1SEOE1o","soy9t6q6L9",
+"s93Ml2Yz7E","9GXkXBCxeC","L7cGc0ao3l","Qworub29RJ","jeskSlCMxy","okgRiCNHmv","nnP8oX6Pin","qUJMdgjUTu","JIqXiyvOMI","sx5GlWPmlx",
+"CdyBVs4786","M3zXLlweGy","gf8rIuLtKs","ThjNnAXpwE","dpe1vrhl0J","0BmCyFGzgp","JXljWW7cTs","1j5L8cmXIX","OUYuF1LB1L","jeskSguMb8",
+"ZUnqtlpF6W","FcWrWuLtKs","FLsphK4GS8","48cHLjiVBP","6q6L9QClRL","55rfBLewvM","VBjhzPOUYS","S77LHdhSuH","C2Irc8RCUA","FFDui1v5hH",
+"uAWypuvf7A","8cVD345cIH","h1zcHksJby","C2Irc9GXkX","I7p2aprNT6","mz8gx5VZjS","SWfouFNYIM","oVQp65drc6","PYBf4Twano","uPX7GRzaZA",
+"6q6L9618Di","sx5GlNhXdu","0PktIWDVWJ","K4GS8QYxC0","2ZHdkAmdQd","24ARFcQOnv","F6PT2s4786","lweGyWPmlx","Yw2oUiqv4k","k85AeKr8ys",
+"nnP8oJkzUn","WaWsvG1RhS","Zv7z02DREs","L7cGcWPmlx","2TRI76AFT0","lXFOB9y4lw","GWqqXxReec","oVQp6MmsIo","BCxeCmz8gx","brhlQdQ586",
+"POUYSTCgPp","tuDySzbIYY","lm0pDjzUqR","2hEEUZUnqt","CIShG9iGoT","pT8wujeskS","EoToPx3LDe","5nmWvVNCPd","okgRi5iGN5","CdyBVpFrrl",
+"uLtKs8hJdt","5NammzHF1q","UlU3MCdyBV","oQ87rlm0pD","BbwgA8hJdt","FPfSEYOfrY","pFrrlZJTXH","1j5L81LB1L","FNYIMyEfy9","x3LDetlILt",
+"gf8rI7hyVv","WMiS3GSQwj","7Ow5CDcpWB","IKxdLsoy9t","AmdQdtuDyS","Oz8yZMkgy8","TwanoM3zXL","XyPZNUlU3M","1LB1LMmsIo","RBhp0d7vjM",
+"Vprf2t98iW","Chuy38cVD3","lViBvBFkb8","qaofNpWiOs","Chuy3GrDg7","YOfrYyEfy9","2NslmWreyP","3weIFvkCHH","uJScXF6PT2","Q6hMCkZANm",
+"HRxd8U3yw5","ReKEW1j5L8","4QMc9SjskQ","5nmWvBCxeC","MmsIogf8rI","pWiOsAIYUu","ECMvUM6qcG","6AFT0MojnP","FnPFBAkKTk","rz7UtDQimp",
+"jSjS3HlUbF","i7WMQAkKTk","AOgEehi5X7","8U2nUyofH3","cmXIXkZANm","fqypyXyPZN","aFFssix74r","uvf7AbrhlQ","XflUqDLhzM","v2eC3uTacx",
+"wDajXzY1GY","dQ586EOE1o","618DilkMUA","NAFuwlXFOB","vOqCEpT8wu","FcWrWulk41","3weIFmz8gx","lViBveuZA5","0BmCyTXQ0Z","5drc6CxVEf",
+"kZANmK20wK","faHirRzaZA","5IhmGVIlwP","KZamHFnPFB","TXQ0Ztl72W","MK07YgjUTu","RmDcrAkKTk","HzZT8iwzGk","AXpwEksJby","lXFOBVNCPd",
+"QssNCqUJMd","d85a9uvf7A","GSQwj2TRI7","tl72WBbwgA","SWfoujiVBP","hE1Ql2TRI7","CNHmvbZLvS","2DREsmX2GE","aL6AJVLTy6","FGzgpRmDcr",
+"NhXduJIqXi","JJs5mCIShG","hi5X7X6Pin","he9IAPOUYS","JRJQBTXQ0Z","jeskS7X3uy","wiHrZ16lHc","cL0aEl83Ud","zY1GY2Nslm","O3iyQJJs5m",
+"Yf2Ece6e4z","sx5GlMK07Y","tvdkDW7cTs","Uvlv4y94nw","gIYvE8RCUA","AkKTkPOUYS","Ss0Zu5Namm","pWiOsBFkb8","djsrvDcpWB","EoToPru4UG",
+"pFrrldQ586","rKDLJSWfou","gjUTuPOUYS","M6qcGfFDrJ","ECMvUhe9IA","suY4x5drc6","zQt6Q6q6L9","Q6LixksJby","ZhwG1ThjNn","VjCZqHRxd8",
+"0PktI1j5L8","uJScXJIqXi","oGu6xCp3mZ","9GXkXHlUbF","NAFuwG1RhS","bgJAzi3pyd","FPfSEiB08l","jS1ajciuWz","y94nwiKqhr","tAOsruN6r3",
+"BGaQYFPfSE","M6qcGhe9IA","WaWsvU3yw5","uoStwQworu","v1HlnHfyNQ","hSSvQ9iGoT","MaJQsSmGzv","RkQkeMezSW","ZJTXHFVMxo","2ZHdkQnJ1S",
+"Pb1paWaim6","blLA9BpYhV","07n1ceuZA5","lpF6WpvgjS","fqypyQYxC0","JkzUnSbRYy","wiHrZ07n1c","DG4sT14FLR","hYBCK8cVD3","VBjhzThjNn",
+"taOXKuoStw","VerEAZhwG1","VIlwPmX2GE","zbIYY0Wr5y","oVQp64dEz6","s93MlzFgtB","M6qcGP6bcg","5Drn01j5L8","5Mg9rfLNg8","1LB1L6AFT0",
+"JRJQB6q6L9","xReecBCxeC","CxVEfjiVBP","FFDuizHF1q","b29RJlm0pD","MmsIoCIShG","NcICAMojnP","FNYIMfaHir","RkQkeVprf2","KsjRKNOHsz",
+"FLsphdhSuH","9iGoTl83Ud","Yh1hFReKEW","L7cGc2Yz7E","618DizQt6Q","2hEEUOUYuF","rKDLJ16lHc","rhl0J8TxD7","JRJQBguMb8","ReKEWQClRL",
+"8RCUA7X3uy","POUYSzz4ZU","8cVD3lkMUA","IjTwPNxx9V","fcJOysx5Gl","MmsIoK4GS8","45cIHjfREu","o8UydJJs5m","k85AeFPfSE","tvdkDNOHsz",
+"xciqp0PktI","xciqpSbRYy","6AFT0Nxx9V","M6qcGtlILt","G1RhSgjUTu","XyPZN8xEKz","iB08lWaim6","wiHrZVjCZq","X6PinGXdoH","BFkb8IRh48",
+"aL6AJm4bxU","s7MxkSs0Zu","0MR5XxXTI4","Nxx9VbrhlQ","Y1mC045cIH","aDGtSulk41","7hyVvIBe8k","lCMxyChuy3","d85a97Ow5C","ru4UGpmeCd",
+"ydG8UG1RhS","WPmlxMm8si","ciuWz55rfB","MezSWDQimp","AIYUunFqik","EdBKczHF1q","9GXkXQYxC0","D6rByt98iW","tl72Wa00b5","aez9yFNYIM",
+"AIYUuBbwgA","FFDuiiKqhr","4W0TllH1kt","o8UydFwEJz","UlU3M2Nslm","NcICADLhzM","JKWYRpT8wu","GSQwj2ZHdk","XflUq8FmFH","HzZT8WreyP",
+"k85AeD6rBy","AmdQdDz1R3","14FLRZv7z0","uJScXs7Mxk","2hEEUd85a9","a00b5P6bcg","4QMc90PktI","SmGzvXyPZN","fcwDae6e4z","lCMxyB3qem",
+"sx5GlksJby","jSjS3gf8rI","RBhp0B3qem","64s8N5Drn0","MGlTF2Nslm","8hJdt7ku1p","fFDrJi7WMQ","No0QbQnJ1S","oVQp6ydG8U","4W0Tl6AFT0",
+"FFDuipT8wu","QssNC8TxD7","SmGzvCNHmv","618DiDG4sT","FNYIMMezSW","14FLRIKxdL","CqqaDNxx9V","2hEEUHRxd8","FPfSEatef2","Z4I1vAgJHQ",
+"KASQ8CxVEf","l83UdQ6hMC","jtn0XJRJQB","2Yz7E4dEz6","DLhzMMm8si","cmXIXBGaQY","VBjhzfcJOy","sqVrfHfyNQ","uTacx618Di","d85a9ru4UG",
+"lCMxy55rfB","zbIYYgIYvE","oQ87rLewvM","pFrrlbrhlQ","SbRYyyEfy9","0KyfsCp3mZ","qQxHPJIqXi","SjskQDLhzM","Mm8sizbIYY","tuDySuLtKs",
+"tvdkD8TxD7","8FmFHyvOMI","lH1ktSs0Zu","pvgjSi7WMQ","FjHXRFwEJz","blLA9zmLYD","zFgtBUlU3M","SWfouIn3NS","W7cTsaDGtS","GXdoHWDVWJ",
+"vLsmSxXTI4","7fKYU45cIH","FLsphnnP8o","7X3uyLDk6f","9eoRcjtn0X","DLhzMatef2","L7cGczQt6Q","5IhmGSs0Zu","cShY2Zv7z0","Uvlv4AkKTk",
+"Mkgy8HlUbF","fLNg8Mkgy8","azIWpi7WMQ","9rlg9S2Dfu","ZuDtDiqv4k","F6PT20BmCy","ZJTXH5IhmG","KZamHn8pJ9","YjB9tJIqXi","KZamHcShY2",
+"lCMxye6e4z","tl72WmX2GE","uvf7AGv3Fq","NcICAs7Mxk","5ZaEzdjsrv","VLTy6NcICA","45cIHCdyBV","WMiS3d85a9","lCMxyAkKTk","oVQp6OxWIH",
+"tl72WOHaBz","C2Irc2TRI7","jSjS3pmeCd","MmKGJTXQ0Z","DQimpNhXdu","7fsYMnnP8o","mz8gxFFDui","WPmlxIn3NS","rz7Ut24ARF","zbIYYUlU3M",
+"bZLvSM6qcG","1j5L8iqv4k","uAWypHzZT8","jS1ajTa8f6","XyPZNmz8gx","618Di0h1b1","pv0i79iGoT","ydG8UjS1aj","d7vjM7lUXZ","s7Mxk14FLR",
+"RpBQmAXpwE","okgRiCxVEf","Ss0Zut59lR","StlDJoQ87r","8hJdtnFqik","mz8gxNOHsz","5nmWva00b5","Twano7hyVv","AgJHQJKWYR","azIWpyluBx",
+"WMiS3CdyBV","0MR5XAgJHQ","rz7UtqUJMd","zQt6QogLgc","LewvMWaWsv","mz8gxY1mC0","jzUqRsoy9t","CxVEf2hEEU","zY1GYjSjS3","8RCUAEdBKc",
+"s7MxkQ6Lix","StlDJCNHmv","o8UydGWqqX","uvf7AlpF6W","TCgPpS2Dfu","1LB1LyEfy9","suY4xgIYvE","prNT6Twano","MK07YoGu6x","pFrrlaL6AJ",
+"45cIHuPX7G","Dz1R3cShY2","14FLR2Yz7E","X6Pinx3LDe","5ZaEzlXFOB","0h1b1JRJQB","Mkgy8K4GS8","i7WMQTa8f6","dhSuHTwano","SWfou8FmFH",
+"Kr8ysfqypy","lViBvbgJAz","iwzGkNcICA","TCgPpOz8yZ","9iGoT7ku1p","QClRLWaim6","Yf2Ec9XyT9","GSQwj9GXkX","5drc6OUqFM","SWfou0Wr5y",
+"Gv3FqNOHsz","Yf2EczqH0W","TwanoSWfou","55rfB9rlg9","lViBvdpe1v","k85AeqQxHP","NcICABGaQY","GSQwjFGzgp","v2eC3euZA5","YjB9tfLNg8",
+"ix74rrhl0J","Mm8si16lHc","faHirReKEW","O3iyQhi5X7","kZANmFxX9q","JXljW8U2nU","pFrrlGXdoH","uAWyp3otm6","YjB9t8cVD3","8hJdt5Drn0",
+"GWqqXBbwgA","X6PinhYBCK","oGu6xJJs5m","dpe1vPYBf4","iB08l0ao3l","CK5W7i7WMQ","BFkb8e6e4z","cL0aEatef2","Ta8f6S2Dfu","nlaByTCgPp",
+"8xEKzFNYIM","FhtglfcJOy","Ta8f6QnJ1S","aez9yDG4sT","uPX7GwDajX","2NslmU3yw5","7X3uy2ZHdk","RpBQmVBjhz","F6PT2atef2","OUqFMMkgy8",
+"jzUqRgIYvE","oVQp6cShY2","BbwgA64s8N","fmIK1WDVWJ","14FLRTXQ0Z","K4GS8D6rBy","RmDcr8cVD3","HzZT8Ta8f6","Yf2EcNhXdu","lkMUA2TRI7",
+"ZzJHWEdBKc","FcWrWKsjRK","UlU3MI7p2a","fcwDamX2GE","i7WMQk85Ae","MmsIoQYxC0","9y4lwTXQ0Z","d85a9uN6r3","kZANmCdyBV","4dEz6M3zXL",
+"CK5W71v5hH","5ZaEzBCxeC","JIqXinFqik","zbIYYb29RJ","BbwgAUvlv4","gjUTuRBhp0","1LB1LBbwgA","KsjRKIjTwP","5iGN5hE1Ql","Yw2oUlweGy",
+"Cfgr32TRI7","bgJAzo8Uyd","C2IrcQ6hMC","XflUqyvOMI","uvf7AWaWsv","nFqikCNHmv","2DREsblLA9","9eoRcd85a9","pv0i7GWqqX","0ao3lGv3Fq",
+"QssNClpF6W","SWfouhYBCK","WDVWJNAFuw","soy9tAOgEe","RpBQmM3zXL","QworuAXpwE","EdBKcCK5W7","QYxC0d7vjM","580YDi3pyd","3weIFuoStw",
+"JJs5mjeskS","G1RhSIRh48","zqH0W9iGoT","oQ87rAgJHQ","2DREs0PktI","Cp3mZciuWz","okgRi7lUXZ","uAWypHP433","Cp3mZ2Nslm","5Nammn1pmO",
+"7ku1pn1pmO","s7MxkFhtgl","8TxD7DG4sT","2hEEUhE1Ql","S77LHtuDyS","hUTw73otm6","OHaBz0h1b1","hE1QlYw2oU","jS1ajyEfy9","CxVEfn1pmO",
+"QbxXcjiVBP","ogLgcBGaQY","WPmlxlpF6W","gjUTuRzaZA","Yh1hFjtn0X","l83UdokgRi","8xEKz0ao3l","S2DfuxReec","guMb80BmCy","Q6Lixuvf7A",
+"FnPFBPYBf4","RBhp0oQ87r","9eoRci7WMQ","5Drn0Uvlv4","cQOnvcmXIX","bgJAzrhl0J","WDVWJt98iW","Ss0Zu0MR5X","o8UydtaOXK","iB08lIBe8k",
+"lkMUA9y4lw","zbIYYFLsph","OUqFMG1RhS","hSSvQyofH3","JIqXiulk41","K20wK9GXkX","F6PT2U3yw5","blLA9YOfrY","YjB9tAIYUu","rhl0JJJs5m",
+"29QAzEOE1o","tl72WBGaQY","IKxdLnFqik","mX2GEuN6r3","zFgtBOUqFM","0PktI5Drn0","Yw2oU4QMc9","K20wK3otm6","MmsIoulk41","WmadAIKxdL",
+"RACujFcWrW","piJSkIjTwP","0PktIZuDtD","618DiKsjRK","618DiKASQ8","Ul4a1y94nw","tl72WlsQGo","ciuWzYh1hF","blLA9O3iyQ","lCMxyiwzGk",
+"vkCHHNhXdu","JXljW580YD","pFrrlJKWYR","MaJQse6e4z","d7vjMG1RhS","SjskQZ4I1v","7lUXZdQ586","JkzUnpvgjS","S77LHpiJSk","LDk6fOUYuF",
+"rz7UtlpF6W","5IhmGsuY4x","lm0pDaDGtS","5ZaEziKqhr","pT8wuCK5W7","HlUbFpAhR1","8TxD7pvgjS","sqVrfb29RJ","RsQUqMezSW","DG4sTt98iW",
+"FPfSEFFDui","7hyVvCfgr3","9GXkX5IhmG","S2Dfu9GXkX","lj07QuJScX","RsQUq4dEz6","7fsYM1v5hH","NAFuwUlU3M","QnJ1SBGaQY","5drc645cIH",
+"wiHrZo8Uyd","gtCA5FwEJz","v8yFNFjHXR","HRxd8n8pJ9","GWqqXzqH0W","gf8rIbZLvS","lXFOBydG8U","pWiOsHfyNQ","nFqikU3yw5","No0QbHlUbF",
+"uLtKshSSvQ","jeskSlkMUA","lpF6WRzaZA","DcpWBsx5Gl","LewvMMGlTF","Z4I1vLDk6f","xXTI4jeskS","FGzgpChuy3","lCMxyVLTy6","RmDcrpFrrl",
+"QbxXcXflUq","3weIF6q6L9","uPX7Ge6e4z","euZA5oGu6x","Z4I1vlXFOB","l83UdRzaZA","7lUXZzFgtB","55rfBaL6AJ","rhl0J9XyT9","8U2nUdQ586",
+"2TRI7cQOnv","ogLgcUvlv4","nlaBy2Yz7E","djsrvMkgy8","Mm8siWDVWJ","dQ586Chuy3","7hyVvJ2mQi","hYBCK8U2nU","KZamHydG8U","AIYUus4786",
+"Zv7z01j5L8","IBe8ky94nw","VLTy6lweGy","QYxC0HzZT8","y94nwuN6r3","WaWsvbrhlQ","aez9y5Namm","Yf2EcdhSuH","soy9tFhtgl","nFqikdQ586",
+"16lHcv1Hln","M6qcGZv7z0","45cIHHzZT8","lCMxy16lHc","CIShGcmXIX","FVMxoDcpWB","v8yFNSs0Zu","zFgtBzmLYD","pAhR1t98iW","tjQxs2TRI7",
+"48cHLHP433","8RCUAiB08l","ru4UGjtn0X","DG4sT7hyVv","0MR5XZJTXH","ThjNnQWxoT","5VZjSHzZT8","kB5nPyEfy9","BCxeChSSvQ","8cVD3lm0pD",
+"WaWsvKsjRK","0YAGHMK07Y","AgJHQECMvU","Uvlv4QnJ1S","POUYSlViBv","IBe8kaL6AJ","7Ow5ChSSvQ","xciqpRpBQm","mX2GE8xEKz","FLsphUmaEv",
+"9iGoTFwEJz","C2IrcNxx9V","3weIFWMiS3","FcWrWyEfy9","In3NSv2eC3","5Mg9rpiJSk","FGzgp24ARF","I7p2aNOHsz","Kr8ys7ku1p","29QAzVBjhz",
+"pT8wuoQ87r","iB08lAmdQd","suY4xNxx9V","Yw2oU8FmFH","FjHXRBCxeC","GrDg7uoStw","7hyVvWMiS3","24ARFlweGy","VLTy6gdQsS","kB5nP9rlg9",
+"EdBKcKZamH","GrDg7WPmlx","5drc6Chuy3","hi5X7FNYIM","ZuDtD8xEKz","RpBQmMojnP","Zv7z0Fhtgl","dpe1vvOqCE","KZamHoVQp6","uvf7AMojnP",
+"ulk41vkCHH","8cVD3soy9t","qUJMdulk41","1j5L8i7WMQ","LDk6fciuWz","M3zXLAIYUu","8hJdt4QMc9","Q6Lixlm0pD","lpF6WeuZA5","WaWsvC2Irc",
+"pFrrlU3yw5","xReecd7vjM","BFkb8VjCZq","QChxsIBe8k","RBhp0cShY2","x3LDejtn0X","WPmlxNxx9V","i7WMQs7Mxk","aFFssYh1hF","4W0TlQChxs",
+"0KyfsJJs5m","Yh1hF0Kyfs","Fhtgl3otm6","hYBCKoVQp6","hUTw7fFDrJ","iB08lMGlTF","xciqpyToGW","b29RJaL6AJ","I7p2aIKxdL","JXljWHRxd8",
+"WDVWJFPfSE","VerEA2ZHdk","P6bcg0MR5X","IKxdL5Mg9r","IRh48dhSuH","0YAGHHP433","45cIHReKEW","HRxd8K4GS8","HlUbFfLNg8","mX2GEoQ87r",
+"tl72WpvgjS","piJSkhUTw7","dpe1vdmoS7","4QMc9blLA9","bZLvSHP433","Cp3mZAXpwE","pvgjS8hJdt","G1RhSEoToP","guMb8J2mQi","NcICAS77LH",
+"1v5hH8cVD3","HRxd8RsQUq","DLhzMWmadA","uJScXRBhp0","QnJ1SWaWsv","x3LDeM6qcG","GXdoHtjQxs","AgJHQStlDJ","RpBQmtlILt","580YD7X3uy",
+"NcICAYf2Ec","2Yz7ERACuj","FcWrWhSSvQ","lweGyuJScX","HzZT8ydG8U","ogLgcDG4sT","F6PT2FNYIM","U3yw5FPfSE","0YAGHfcwDa","FPfSE64s8N",
+"hYBCKF6PT2","uPX7G9rlg9","QClRLZhwG1","dhSuHyEfy9","uN6r32TRI7","64s8NAmdQd","BCxeC6AFT0","YjB9tFPfSE","HP433FPfSE","uN6r3LDk6f",
+"In3NSVerEA","0PktIjS1aj","GSQwjuJScX","RsQUqbgJAz","C2IrcksJby","WreyPblLA9","lH1ktqQxHP","pv0i7K4GS8","CK5W7OHaBz","1LB1LfcJOy",
+"GSQwjv1Hln","VLTy6dmoS7","aDGtSwDajX","aez9yhYBCK","JRJQBBpYhV","ni2v1hYBCK","ni2v1djsrv","F6PT2yofH3","ZJTXHCxVEf","ksJbyNAFuw",
+"HP433MmKGJ","blLA9zFgtB","RmDcrv2eC3","DcpWBn1pmO","xReec24ARF","HlUbFdjsrv","9rlg9x3LDe","uTacxpAhR1","29QAzGXdoH","d7vjMGrDg7",
+"jS1aj07n1c","SWfou7lUXZ","XflUqQnJ1S","hUTw7jzUqR","cmXIXFFDui","3otm6Oz8yZ","uQIcz8xEKz","9y4lwjSjS3","2hEEUpT8wu","TwanoiwzGk",
+"piJSk8FmFH","mz8gxJXljW","jSjS3iB08l","rKDLJrhl0J","Ta8f6618Di","0BmCyGWqqX","J2mQihSSvQ","WDVWJHzZT8","Zv7z0suY4x","1LB1LVerEA",
+"fcJOyNOHsz","5VZjSyvOMI","QbxXct59lR","TwanouQIcz","Q6hMCChuy3","IBe8kKr8ys","pmeCdFGzgp","Qworu3otm6","dhSuH3weIF","uJScXDLhzM",
+"IjTwPzqH0W","euZA5fcwDa","d7vjMhUTw7","XyPZNOHaBz","WDVWJBFkb8","WreyPIjTwP","RzaZAJXljW","2DREs5Drn0","BGaQYVLTy6","l83UdFxX9q",
+"n1pmOe6e4z","AgJHQPOUYS","07n1c0BmCy","l83Ud55rfB","Gv3FqfmIK1","14FLREOE1o","zz4ZUhUTw7","RpBQmB3qem","qUJMdUl4a1","1v5hHs7Mxk",
+"AmdQd2Nslm","Chuy32ZHdk","RBhp0yToGW","ciuWzazIWp","ZhwG11v5hH","hUTw7tAOsr","GWqqXjSjS3","MezSW48cHL","o8UydRkQke","M3zXLFPfSE",
+"MojnPx3LDe","d7vjMMGlTF","SWfou9GXkX","StlDJulk41","BGaQY0ao3l","TXQ0ZMGlTF","soy9tDcpWB","FnPFBcShY2","14FLRs7Mxk","LewvMDcpWB",
+"DcpWBaDGtS","Dz1R3he9IA","M6qcGYf2Ec","EOE1oYf2Ec","b29RJm4bxU","pvgjSiB08l","kZANmReKEW","i7WMQEOE1o","In3NSuJScX","5NammprNT6",
+"rz7UtFGzgp","tvdkDrz7Ut","LbRTH8U2nU","4dEz6azIWp","ZUnqtTwano","yEfy9PYBf4","UlU3Mlj07Q","YOfrYiqv4k","cmXIXMkgy8","pAhR1MojnP",
+"YjB9tHfyNQ","Waim6v8yFN","cL0aEIn3NS","SjskQUlU3M","UlU3M6AFT0","0KyfslsQGo","v2eC3zmLYD","5nmWvbrhlQ","No0QbpFrrl","VerEAyofH3",
+"5IhmGo8Uyd","lViBv3otm6","5VZjSlkMUA","uPX7GRsQUq","lViBvFxX9q","2Nslm29QAz","m4bxUtjQxs","W7cTs5Drn0","GSQwjFhtgl","rKDLJv2eC3",
+"YOfrYlpF6W","n1pmO0ao3l","RsQUqguMb8","RBhp0M3zXL","Mm8sigdQsS","prNT6Oz8yZ","Mkgy8blLA9","OHaBz2hEEU","QssNC5nmWv","BCxeCfcwDa",
+"29QAzk85Ae","U3yw5EoToP","IjTwPjiVBP","ECMvU8TxD7","ZuDtDVerEA","AXpwEbgJAz","MezSW2Nslm","gjUTuFNYIM","Waim6QbxXc","9XyT9yofH3",
+"4W0TlFFDui","JkzUnokgRi","5iGN5v8yFN","xXTI4lj07Q","F6PT2POUYS","YOfrYdjsrv","FVMxoG1RhS","Y1mC0ydG8U","zz4ZU580YD","64s8NdhSuH",
+"HRxd8zbIYY","FxX9qCfgr3","brhlQtl72W","tuDySZzJHW","vOqCEW3VFH","uTacxHlUbF","lCMxyxReec","MezSWtuDyS","1v5hHHfyNQ","LewvM7fsYM",
+"zQt6Qix74r","FxX9qGXdoH","7ku1pJkzUn","YOfrYZ4I1v","AXpwENAFuw","zHF1q29QAz","6AFT0No0Qb","CdyBVs93Ml","ulk41FLsph","ydG8UMmKGJ",
+"xReecWPmlx","qUJMdFFDui","oGu6xgjUTu","RsQUqNxx9V","0BmCyVjCZq","FGzgpQClRL","Ta8f6zbIYY","FPfSE4QMc9","AOgEe618Di","FVMxocmXIX",
+"IRh48dmoS7","oVQp6UmaEv","hSSvQazIWp","lkMUAatef2","HfyNQdpe1v","AkKTkatef2","uTacxDcpWB","uTacx9GXkX","GSQwjC2Irc","ru4UGfmIK1",
+"8TxD7VLTy6","07n1coVQp6","DG4sTm4bxU","CNHmvNhXdu","pvgjSS2Dfu","RpBQmfaHir","Ta8f6lCMxy","QbxXcCIShG","Yh1hFZv7z0","IBe8kMmsIo",
+"guMb8d7vjM","Oz8yZTwano","uoStwECMvU","WMiS3uPX7G","5Drn0yofH3","TXQ0ZuZPqg","fFDrJBGaQY","SbRYyv1Hln","C2IrcBGaQY","2TRI7WreyP",
+"P6bcgdmoS7","sqVrfFVMxo","i7WMQUl4a1","a00b5AXpwE","DLhzMRsQUq","MmsIo9eoRc","jSjS3d7vjM","CqqaDi3pyd","iqv4kUvlv4","EdBKclViBv",
+"StlDJuPX7G","aL6AJpv0i7","WmadAMojnP","O3iyQiqv4k","MojnPiB08l","gdQsSlH1kt","WreyPaez9y","EdBKcO3iyQ","ZhwG1FwEJz","XflUqyofH3",
+"0PktIYf2Ec","M3zXLsoy9t","POUYSk85Ae","UlU3MDQimp","7fKYUMezSW","9iGoTS77LH","8TxD7ZJTXH","kZANm4QMc9","9iGoTfqypy","AOgEeoGu6x",
+"618DibZLvS","ThjNnpAhR1","U3yw5FLsph","yofH3lpF6W","8RCUATCgPp","tlILtB3qem","5ZaEz5IhmG","CqqaDni2v1","ogLgcMkgy8","rz7Ut5VZjS",
+"kB5nP4QMc9","atef2EoToP","AkKTk5drc6","pAhR15ZaEz","9iGoTiB08l","JRJQB9GXkX","BFkb8zqH0W","v8yFNtjQxs","Mkgy87Ow5C","jSjS314FLR",
+"oGu6xzQt6Q","CxVEfYh1hF","uvf7Ad7vjM","iB08lSmGzv","Q6hMCmz8gx","gjUTubgJAz","VerEAW7cTs","FLsph4dEz6","S2Dfuni2v1","lViBvOz8yZ",
+"QClRLFnPFB","lViBvd85a9","FwEJze6e4z","RsQUqBpYhV","CdyBVMmsIo","IBe8kdjsrv","5ZaEzPb1pa","FnPFB1LB1L","48cHL7hyVv","yToGWgtCA5",
+"JRJQBhUTw7","Dz1R3AXpwE","Pb1paWaWsv","WPmlx8U2nU","zz4ZUaFFss","MK07YcShY2","7Ow5CQnJ1S","UlU3MuAWyp","CxVEfsqVrf","SWfouVerEA",
+"okgRiuTacx","5ZaEzSjskQ","Cfgr38hJdt","4QMc9djsrv","RzaZAIRh48","6AFT0aL6AJ","48cHLB3qem","hSSvQsqVrf","xXTI4Twano","In3NSvLsmS",
+"dQ5862Yz7E","m4bxUuPX7G","jSjS3n8pJ9","zz4ZUJRJQB","Pb1paJRJQB","tlILtEOE1o","0ao3lguMb8","VNCPdzmLYD","taOXKYjB9t","9GXkX8cVD3",
+"lm0pDDz1R3","45cIH9eoRc","rz7UtiB08l","9eoRcsoy9t","07n1cOHaBz","okgRijS1aj","zY1GYJXljW","jiVBPReKEW","5drc614FLR","fLNg8ZJTXH",
+"zHF1qiB08l","RzaZAlsQGo","AXpwEMK07Y","v8yFN0h1b1","jzUqRQworu","tlILttlILt","uZPqgnlaBy","Zv7z0TCgPp","LbRTH0YAGH","FjHXRSbRYy",
+"ZzJHWUl4a1","pT8wuO3iyQ","pT8wuZv7z0","Ss0ZuIRh48","lj07Q4W0Tl","JkzUneuZA5","7ku1pS2Dfu","U3yw5cmXIX","24ARF5Namm","5Mg9rlweGy",
+"MojnPni2v1","O3iyQVjCZq","mz8gx8FmFH","TCgPpVprf2","16lHcQworu","pWiOs5ZaEz","4W0TlF6PT2","zY1GYO3iyQ","VerEA29QAz","s4786faHir",
+"YjB9tyluBx","yofH34W0Tl","JIqXiPb1pa","4dEz6VLTy6","ydG8Usx5Gl","MojnP2DREs","jeskSrKDLJ","ydG8U5IhmG","zbIYYTXQ0Z","blLA9QChxs",
+"lj07QTwano","nFqiktlILt","gIYvEKASQ8","s93Ml0MR5X","faHiryToGW","lweGyK4GS8","OHaBzIRh48","suY4xpvgjS","rKDLJK20wK","fFDrJKZamH",
+"o8UydDz1R3","AOgEeuQIcz","Ss0ZuUmaEv","bgJAziKqhr","jfREufFDrJ","IKxdLa00b5","K4GS8Fhtgl","8U2nUFcWrW","tvdkDGv3Fq","suY4xChuy3",
+"brhlQ9y4lw","7fKYUCNHmv","45cIH5Mg9r","618DiG1RhS","2TRI7n8pJ9","uupzkiqv4k","DQimpWMiS3","aDGtSyToGW","rKDLJ7ku1p","qaofNMmKGJ",
+"7X3uysoy9t","FNYIMdmoS7","hE1QlWreyP","hi5X7lj07Q","gIYvEgIYvE","RkQkeNo0Qb","0PktInFqik","jiVBPaFFss","ciuWzfmIK1","CIShGjfREu",
+"0PktIBFkb8","PYBf4ulk41","In3NSAgJHQ","7fsYMM3zXL","RpBQmKASQ8","xciqpAgJHQ","G1RhS45cIH","ReKEW9iGoT","fLNg85iGN5","lkMUAgjUTu",
+"zmLYDI7p2a","TwanoyluBx","azIWp0BmCy","t59lRyEfy9","nnP8oThjNn","In3NSFGzgp","nnP8o5VZjS","yEfy9Cp3mZ","x3LDePOUYS","RxrsmJJs5m",
+"HP433uQIcz","n1pmObZLvS","gIYvEOxWIH","jzUqRydG8U","brhlQEoToP","9iGoTAIYUu","7Ow5CbZLvS","JkzUndmoS7","ZuDtDP6bcg","ECMvUOUYuF",
+"0Wr5y45cIH","kZANmGSQwj","Ul4a12hEEU","djsrv07n1c","1v5hHDG4sT","jSjS3Yf2Ec","pmeCd64s8N","SWfouGv3Fq","ulk41IBe8k","OxWIHI7p2a",
+"fFDrJVLTy6","ydG8ULbRTH","AIYUudhSuH","NOHszhi5X7","MojnPDLhzM","d7vjMFxX9q","gIYvEmX2GE","ix74rFVMxo","b29RJQ6hMC","SbRYyK20wK",
+"S77LHs93Ml","VLTy6uJScX","yofH38cVD3","BGaQYChuy3","5IhmG8xEKz","7Ow5CGSQwj","0PktI55rfB","29QAzPYBf4","Kr8ys24ARF","aDGtSS77LH",
+"pv0i7BFkb8","Rxrsm2hEEU","Qworu4W0Tl","hi5X7gdQsS","uupzksoy9t","16lHcs4786","1j5L8FwEJz","lkMUALDk6f","he9IAZv7z0","Mm8si2TRI7",
+"U3yw5AXpwE","aL6AJKZamH","0ao3laDGtS","QnJ1SYf2Ec","SmGzvSmGzv","bgJAzFxX9q","PYBf4POUYS","uJScXG1RhS","Cfgr3FFDui","vLsmSQWxoT",
+"SjskQEoToP","Chuy3dhSuH","IKxdLQnJ1S","5IhmGmz8gx","i7WMQTwano","W7cTsYOfrY","VNCPduoStw","5iGN5X6Pin","uvf7A55rfB","azIWplj07Q",
+"MmsIopFrrl","Cp3mZReKEW","UmaEvbgJAz","7hyVvatef2","Gv3FqThjNn","UlU3MGSQwj","rz7UtCK5W7","RsQUq2hEEU","2ZHdkFVMxo","zY1GYZhwG1",
+"lpF6WY1mC0","vkCHHv1Hln","Gv3FqhE1Ql","5iGN5AkKTk","uvf7A6AFT0","HfyNQtl72W","uvf7AgjUTu","uAWypbZLvS","lH1ktsuY4x","v2eC3qUJMd",
+"gf8rIblLA9","Ss0Zud7vjM","piJSkfaHir","I7p2aMGlTF","djsrvuAWyp","ZuDtD2TRI7","NhXduChuy3","zQt6QI7p2a","gdQsSciuWz","Ss0ZuFGzgp",
+"X6PinJJs5m","ni2v19GXkX","WMiS3LewvM","nnP8oIn3NS","SWfouAXpwE","FcWrWcQOnv","bZLvScShY2","0YAGHzY1GY","24ARFx3LDe","iwzGkaL6AJ",
+"jtn0X07n1c","ZUnqtMm8si","9iGoT24ARF","618DiZJTXH","mX2GEuupzk","8cVD3Chuy3","Yw2oUe6e4z","ECMvUzqH0W","1LB1LiwzGk","0KyfsWaWsv",
+"piJSkjeskS","tuDySyofH3","8hJdtciuWz","ulk41S2Dfu","zY1GYtAOsr","C2IrcvLsmS","a00b5nnP8o","2hEEU24ARF","YjB9t45cIH","ZzJHWSmGzv",
+"WDVWJaDGtS","5VZjSdmoS7","t59lRcShY2","vLsmSSmGzv","lweGy4W0Tl","CIShGogLgc","yluBxS2Dfu","YjB9toGu6x","fcJOyGrDg7","4QMc9JXljW",
+"ru4UGix74r","YjB9tjS1aj","NcICAGrDg7","s93MlfLNg8","2Yz7EWMiS3","suY4xOHaBz","SWfouO3iyQ","yToGWCIShG","QChxskB5nP","U3yw5v2eC3",
+"J2mQiMojnP","9y4lwAkKTk","yofH3W7cTs","CxVEfEoToP","S2Dfu2hEEU","pmeCdF6PT2","gf8rIFcWrW","7fsYMNxx9V","W3VFHrhl0J","Chuy3o8Uyd",
+"FLsphydG8U","WaWsvuN6r3","v8yFNlpF6W","d7vjMuLtKs","9iGoTMmKGJ","azIWpnlaBy","X6Pinlj07Q","FnPFBfqypy","jeskS4dEz6","AgJHQSbRYy",
+"FnPFBlweGy","uAWyppFrrl","hUTw7BbwgA","Kr8ysbZLvS","cShY2zY1GY","LewvMZUnqt","POUYSatef2","48cHLzbIYY","prNT69GXkX","SWfouxXTI4",
+"0ao3lyvOMI","S2Dfurhl0J","4W0TlgtCA5","xXTI4Nxx9V","FwEJzQ6Lix","9rlg9NhXdu","TwanotaOXK","tlILtQWxoT","m4bxUjzUqR","HRxd86q6L9",
+"B3qem8TxD7","mz8gxJIqXi","BGaQYhe9IA","djsrv5nmWv","SjskQO3iyQ","uAWyppv0i7","Y1mC0No0Qb","TCgPp0PktI","S2DfuhUTw7","MGlTFSs0Zu",
+"FwEJz5VZjS","Uvlv45Drn0","5Mg9roVQp6","prNT6YOfrY","JJs5my94nw","AmdQdRkQke","o8UydWaWsv","JIqXidhSuH","8RCUAn8pJ9","ZJTXHqUJMd",
+"ZJTXHtjQxs","ReKEWfFDrJ","k85Ae16lHc","IBe8km4bxU","7ku1p4dEz6","L7cGclViBv","2TRI7fmIK1","hYBCKaDGtS","Mkgy8n1pmO","RBhp0Cfgr3",
+"o8Uydlm0pD","aFFssy94nw","7lUXZaDGtS","kZANmOUqFM","d7vjMxciqp","zFgtBFVMxo","Mkgy8ydG8U","n8pJ9GWqqX","BCxeCOUqFM","UmaEvIn3NS",
+"8cVD36AFT0","ZuDtDv2eC3","v8yFNIKxdL","Pb1paVNCPd","dmoS7lH1kt","lsQGoKZamH","Yf2EcD6rBy","QYxC0prNT6","i7WMQEdBKc","Ta8f65Mg9r",
+"piJSkzmLYD","aL6AJS77LH","pWiOsYf2Ec","6q6L9dpe1v","7fsYMbZLvS","lViBvYf2Ec","9XyT9G1RhS","zz4ZU7fKYU","FGzgpDLhzM","MmKGJRxrsm",
+"v1Hln24ARF","7hyVv48cHL","Chuy38FmFH","FPfSEAOgEe","HRxd8pAhR1","Dz1R32TRI7","hUTw7rKDLJ","pT8wuCxVEf","HfyNQwDajX","AmdQdQYxC0",
+"M3zXLy94nw","CK5W7FPfSE","JKWYRt98iW","QssNCVIlwP","dmoS7FxX9q","ZUnqtQChxs","uoStwNxx9V","bgJAzvkCHH","pmeCdD6rBy","CNHmv24ARF",
+"MaJQsyvOMI","VjCZqOHaBz","M6qcGkB5nP","P6bcgKsjRK","FFDuiQssNC","55rfBuN6r3","CqqaDC2Irc","I7p2ax3LDe","gIYvEMaJQs","vOqCEcShY2",
+"aFFssQYxC0","lj07Q4QMc9","ru4UGuN6r3","WmadAZhwG1","Zv7z0tjQxs","QssNCPYBf4","he9IAi7WMQ","Ul4a1wiHrZ","0PktIM3zXL","lH1ktuJScX",
+"FjHXRJkzUn","IKxdLt59lR","jeskSLDk6f","QnJ1SQYxC0","WDVWJ9XyT9","nlaBy0PktI","RxrsmtAOsr","pvgjSpWiOs","14FLRVNCPd","YjB9tS2Dfu",
+"FwEJzQClRL","48cHLuupzk","J2mQiBpYhV","5VZjSrz7Ut","Y1mC0iwzGk","WaWsvoQ87r","bZLvSFhtgl","n8pJ9M3zXL","x3LDe1LB1L","FjHXR5drc6",
+"bgJAzpAhR1","4dEz6VNCPd","4dEz6Cp3mZ","9iGoTfmIK1","yToGWo8Uyd","aL6AJAXpwE","O3iyQogLgc","EOE1oTwano","VBjhzuN6r3","ZzJHWHP433",
+"l83Ud5drc6","hi5X76AFT0","y94nwGXdoH","WreyPThjNn","pmeCd5ZaEz","B3qemPOUYS","tjQxsxciqp","ZUnqtAOgEe","ulk41yofH3","2ZHdkHRxd8",
+"s4786AmdQd","jiVBPJkzUn","JXljWReKEW","Ss0Zu7ku1p","2Yz7EL7cGc","ThjNnhe9IA","RmDcrQbxXc","D6rBySmGzv","AgJHQEOE1o","sx5GlhUTw7",
+"MmsIoZzJHW","SjskQ8RCUA","8hJdtLbRTH","Y1mC0lViBv","ZuDtDiB08l","MmKGJKASQ8","0MR5Xhi5X7","d7vjMRACuj","nlaByHP433","0MR5XMmsIo",
+"Y1mC0mz8gx","RkQkeI7p2a","0h1b1mX2GE","9y4lw7Ow5C","9rlg9M6qcG","uoStwjzUqR","JIqXiCIShG","OxWIHoVQp6","BbwgAgtCA5","cL0aE1v5hH",
+"Ta8f67fsYM","x3LDeciuWz","yEfy9Yf2Ec","7fsYMd7vjM","FjHXRHlUbF","aez9y14FLR","prNT6Q6hMC","jfREuYOfrY","tvdkDdmoS7","4QMc9EdBKc",
+"1LB1LtAOsr","YOfrYB3qem","nlaBy0YAGH","7ku1p8xEKz","9iGoTuLtKs","v1Hln64s8N","uoStwt59lR","UlU3MTwano","lViBv580YD","qQxHPatef2",
+"HfyNQKZamH","xciqpwiHrZ","0KyfsbZLvS","MmKGJiB08l","ix74ry94nw","4dEz6uTacx","tl72WRzaZA","618DiJIqXi","GXdoH9XyT9","1v5hHyofH3",
+"atef2soy9t","1v5hHpvgjS","XyPZNtuDyS","0h1b1WaWsv","JXljWaez9y","FNYIMBGaQY","FnPFBvLsmS","8U2nUt59lR","MaJQsThjNn","5Drn0iqv4k",
+"faHirM3zXL","FwEJz0BmCy","xXTI4YjB9t","MaJQslj07Q","uPX7G8TxD7","AmdQdZhwG1","48cHLvOqCE","zz4ZUYjB9t","DQimp5ZaEz","I7p2aSs0Zu",
+"aez9y1j5L8","BCxeCprNT6","9rlg98hJdt","iB08lzqH0W","Dz1R3ZhwG1","k85AeMkgy8","hE1QlqQxHP","2Yz7Eulk41","0MR5XoVQp6","uZPqg6q6L9",
+"PYBf45nmWv","IKxdLhe9IA","a00b59eoRc","0MR5X8xEKz","b29RJwDajX","t59lRChuy3","gjUTuIn3NS","cQOnvBGaQY","CqqaDl83Ud","RmDcrblLA9",
+"RsQUqECMvU","ZUnqtlj07Q","EoToPfLNg8","yluBxThjNn","hE1Qlh1zcH","Cp3mZNcICA","uTacxKsjRK","HzZT8DQimp","RBhp0YOfrY","aL6AJv8yFN",
+"Gv3Fq3weIF","cL0aEk85Ae","Y1mC0QClRL","zY1GYEdBKc","blLA9RsQUq","MmKGJ5Drn0","JKWYRdQ586","xciqp4dEz6","BFkb8Z4I1v","G1RhSVBjhz",
+"AkKTkRkQke","ix74ruoStw","9y4lwWmadA","gf8rILbRTH","ciuWzZ4I1v","0Wr5yyToGW","FxX9qXflUq","uZPqg5Mg9r","tlILtXflUq","piJSkFVMxo",
+"qUJMd1LB1L","CIShG9XyT9","VLTy6v1Hln","ulk41QbxXc","NcICAyToGW","LbRTH7Ow5C","uAWypX6Pin","NAFuwGSQwj","iB08lGrDg7","5Drn0K4GS8",
+"AOgEeBGaQY","Y1mC0iqv4k","n1pmOzz4ZU","h1zcHC2Irc","7lUXZuLtKs","fcwDa5IhmG","uLtKs580YD","0ao3l3otm6","FNYIMpv0i7","rz7UtMezSW",
+"jS1ajuQIcz","0YAGHxXTI4","lj07QJRJQB","FFDuiuZPqg","WmadA5Drn0","MK07YvOqCE","pvgjS2hEEU","cShY27X3uy","Y1mC0jzUqR","RsQUqpmeCd",
+"wDajXgf8rI","oGu6xReKEW","tAOsrgf8rI","FFDui5nmWv","lCMxydpe1v","QWxoT0YAGH","faHirP6bcg","8RCUACxVEf","NOHszpAhR1","x3LDeWaim6",
+"7fsYMK4GS8","8FmFHBCxeC","FNYIMlH1kt","0MR5X0BmCy","OxWIHbZLvS","NAFuwVNCPd","DG4sT8cVD3","Y1mC0CK5W7","1j5L8CxVEf","WDVWJBbwgA",
+"fFDrJBFkb8","CK5W7RkQke","HP433JKWYR","jtn0X0Kyfs","MezSWAIYUu","mX2GE0PktI","ECMvUzmLYD","SbRYylkMUA","PYBf4cL0aE","EoToP618Di",
+"55rfBlViBv","NAFuwVerEA","jiVBPQClRL","uJScXVerEA","GrDg70Kyfs","hi5X78TxD7","sqVrfuZPqg","fqypy5ZaEz","dhSuHuPX7G","rhl0J4dEz6",
+"Ul4a1CIShG","wiHrZni2v1","64s8N0PktI","7ku1pQChxs","tAOsr5VZjS","YOfrY1j5L8","aDGtSU3yw5","8RCUAzmLYD","bZLvSuAWyp","yluBxlViBv",
+"tvdkD9iGoT","M6qcGEdBKc","lkMUAUlU3M","Uvlv4yToGW","NcICAFjHXR","16lHcpmeCd","CdyBVAmdQd","jeskSMkgy8","cmXIX0Kyfs","fmIK1lm0pD",
+"ZuDtDGv3Fq","EoToPNcICA","euZA5aL6AJ","NcICA7fsYM","pv0i7GXdoH","2TRI7yluBx","euZA5pWiOs","Pb1pablLA9","MojnPK20wK","0ao3lfqypy",
+"a00b5zmLYD","Q6hMC0h1b1","K4GS8RzaZA","7hyVvOUYuF","FcWrWrKDLJ","Vprf2580YD","vLsmSlH1kt","CIShGC2Irc","prNT6pFrrl","tlILt9iGoT",
+"FnPFBZJTXH","HfyNQdmoS7","WmadAvkCHH","t59lRNcICA","Q6hMCRmDcr","NOHszL7cGc","dhSuH16lHc","Yf2EcydG8U","Pb1pajiVBP","zqH0WOHaBz",
+"CIShGv1Hln","MK07YWPmlx","6AFT0FGzgp","EoToPX6Pin","piJSkvkCHH","8TxD7DcpWB","jzUqR8hJdt","t98iWcQOnv","16lHcoVQp6","hi5X75nmWv",
+"pWiOsMezSW","2Yz7EaL6AJ","VLTy6G1RhS","GXdoHk85Ae","v1Hlnsx5Gl","ZJTXHsx5Gl","m4bxU64s8N","QnJ1SDQimp","OxWIHuTacx","QworuazIWp",
+"7Ow5CdhSuH","azIWpgdQsS","s93MltuDyS","pT8wuSmGzv","v2eC3Yh1hF","zmLYDThjNn","HlUbFtvdkD","v2eC3y94nw","iwzGka00b5","QClRLtl72W",
+"rz7UtZUnqt","zFgtBqQxHP","CIShG1j5L8","2ZHdkTXQ0Z","gIYvETwano","uPX7GyEfy9","SWfouv1Hln","atef2uLtKs","gdQsSlkMUA","l83UdFcWrW",
+"KZamH9eoRc","VNCPde6e4z","hYBCK1LB1L","QClRLe6e4z","7hyVv64s8N","ciuWz580YD","OUqFMUvlv4","yluBxKASQ8","tuDySLDk6f","VjCZq9GXkX",
+"VNCPdFnPFB","cmXIXSjskQ","9eoRcVIlwP","fcJOy8TxD7","BCxeCkZANm","y94nwlViBv","POUYSdjsrv","QWxoTFPfSE","lpF6WYOfrY","pmeCdZUnqt",
+"AkKTkHRxd8","TCgPpl83Ud","ix74rOxWIH","FhtglMkgy8","a00b5ix74r","L7cGc5VZjS","AmdQdPb1pa","jtn0XFnPFB","SWfou9eoRc","29QAz5IhmG",
+"v2eC3RmDcr","MaJQsbrhlQ","gf8rI0MR5X","uAWypECMvU","oVQp6d85a9","yvOMIBCxeC","9XyT9U3yw5","EdBKcX6Pin","No0QbSjskQ","U3yw5uJScX",
+"n8pJ9n8pJ9","9XyT98hJdt","ZhwG1lViBv","uZPqg1j5L8","BbwgA6q6L9","9y4lwsx5Gl","4W0TlaDGtS","2Nslm8xEKz","7Ow5CjSjS3","azIWpcL0aE",
+"AmdQdECMvU","0PktIyvOMI","MGlTFjeskS","ydG8UAgJHQ","FnPFBbgJAz","nFqikNOHsz","qUJMd8RCUA","xciqpksJby","FVMxoQYxC0","i7WMQ55rfB",
+"ksJbyuQIcz","uZPqgAgJHQ","8RCUANcICA","B3qemM6qcG","B3qemfcJOy","taOXKcShY2","FFDuiQ6hMC","2Yz7ElkMUA","lsQGoFwEJz","AmdQd7X3uy",
+"t59lRpT8wu","5iGN5MaJQs","ciuWzi3pyd","WaWsvt98iW","CIShGtAOsr","AmdQd8cVD3","nFqikHfyNQ","4dEz68xEKz","RmDcrOUYuF","KZamHtlILt",
+"O3iyQJXljW","djsrvt98iW","nnP8o5iGN5","NAFuwVLTy6","0MR5XRzaZA","oVQp6ogLgc","v8yFNpT8wu","3otm6Z4I1v","JRJQBVBjhz","UlU3MqQxHP",
+"QssNCuupzk","oVQp6XflUq","QClRL29QAz","jfREu7lUXZ","0PktIguMb8","LbRTHTa8f6","QClRLqQxHP","uN6r3pAhR1","sx5GlFNYIM","QClRL9y4lw",
+"jS1ajRzaZA","hYBCKTa8f6","vLsmS9eoRc","VIlwPHRxd8","jiVBPQworu","kB5nPHP433","QssNCReKEW","Pb1paXflUq","Mm8sifcwDa","FcWrWhe9IA",
+"soy9tChuy3","uAWypy94nw","8cVD3B3qem","o8UydMm8si","VLTy6QChxs","RsQUqHlUbF","fmIK15nmWv","OUqFMJIqXi","24ARFrz7Ut","Oz8yZpT8wu",
+"tvdkD0Wr5y","IKxdLFPfSE","2DREsjS1aj","pvgjS4QMc9","OUYuFwiHrZ","oQ87rLDk6f","GXdoHqQxHP","Ss0Zu8U2nU","TwanoFFDui","rhl0J5VZjS",
+"bgJAz9rlg9","okgRiVjCZq","2DREsuvf7A","QChxsjeskS","TwanovOqCE","14FLRblLA9","OHaBzmz8gx","6AFT0lj07Q","GrDg75IhmG","fmIK1dhSuH",
+"MK07YgtCA5","QbxXcJKWYR","5drc6lkMUA","FjHXRRBhp0","gjUTuJkzUn","AIYUu4dEz6","wDajXCK5W7","QbxXcLDk6f","s93MlUmaEv","uPX7GQworu",
+"pv0i75VZjS","JRJQB4W0Tl","lpF6W48cHL","NcICAFLsph","VerEAdjsrv","tvdkDiqv4k","Fhtgl8TxD7","FjHXRjtn0X","yvOMIPYBf4","WPmlxaFFss",
+"i3pydaL6AJ","BGaQYru4UG","aFFssIKxdL","vLsmS7fsYM","gIYvEFFDui","NcICAvLsmS","NOHszpiJSk","8hJdtydG8U","2Yz7Elm0pD","2DREsTa8f6",
+"cShY2MmsIo","3otm6Pb1pa","IjTwPWMiS3","tAOsrlpF6W","brhlQjSjS3","pmeCd9iGoT","oVQp6JKWYR","lXFOBS2Dfu","SWfoulCMxy","Waim6BCxeC",
+"Uvlv4YOfrY","Q6hMCThjNn","FcWrWyluBx","Ul4a1dhSuH","SmGzvRzaZA","O3iyQAIYUu","Zv7z0BpYhV","gf8rIW3VFH","uN6r3pFrrl","Y1mC0FNYIM",
+"uPX7GZUnqt","GXdoH6q6L9","uQIczKASQ8","DcpWBGXdoH","uN6r3Zv7z0","y94nwiqv4k","Chuy3OHaBz","hUTw7jeskS","CqqaDG1RhS","AgJHQlweGy",
+"RBhp0WaWsv","fqypyW7cTs","16lHcjiVBP","HRxd8ZuDtD","07n1cK4GS8","zz4ZUStlDJ","9rlg9AgJHQ","qQxHPEdBKc","5nmWv9eoRc","bgJAzLbRTH",
+"RmDcrYf2Ec","YjB9tJXljW","W3VFHhe9IA","tvdkD4W0Tl","HzZT8Ul4a1","9rlg9AmdQd","pAhR17fKYU","7ku1paFFss","gdQsS8RCUA","64s8NbrhlQ",
+"y94nwnnP8o","0Wr5ytjQxs","BCxeCzmLYD","JXljWo8Uyd","3otm65Drn0","soy9tRACuj","UmaEvP6bcg","D6rByL7cGc","s4786QWxoT","SmGzvi3pyd",
+"i3pydhi5X7","brhlQZJTXH","BbwgAbgJAz","mX2GE64s8N","yEfy9nlaBy","OUqFMWmadA","SjskQCqqaD","AIYUuUlU3M","29QAzBCxeC","BbwgAZUnqt",
+"EoToPKASQ8","Pb1paYw2oU","iKqhrcQOnv","64s8NzbIYY","tuDySgIYvE","y94nwHlUbF","W3VFH64s8N","zHF1qogLgc","WreyPGXdoH","5Drn0RBhp0",
+"JKWYRlsQGo","WreyPW3VFH","AgJHQ2TRI7","45cIHqUJMd","G1RhSXyPZN","ZhwG1W7cTs","WDVWJ1v5hH","bZLvSFGzgp","lkMUA07n1c","i3pydNo0Qb",
+"dhSuHrhl0J","gIYvEazIWp","FcWrWWDVWJ","S77LHIKxdL","o8UydRACuj","FNYIMGSQwj","rhl0JGSQwj","ReKEWnFqik","hE1Qlsx5Gl","KZamHHfyNQ",
+"1LB1LNAFuw","ThjNnPYBf4","AIYUuHlUbF","cL0aExciqp","HzZT89eoRc","QbxXcMmKGJ","iB08llkMUA","ix74rqQxHP","jeskS2Nslm","5IhmGyofH3",
+"S77LHNAFuw","MmKGJ5ZaEz","h1zcHx3LDe","4W0TlSbRYy","bgJAzMmsIo","taOXKk85Ae","QChxsJXljW","QChxs5iGN5","C2IrcMmsIo","lkMUAazIWp",
+"FNYIMwDajX","6AFT0yluBx","Kr8ysW3VFH","DG4sT29QAz","pT8wuhUTw7","GXdoHfqypy","GrDg7zY1GY","m4bxUW3VFH","suY4xiwzGk","dQ586tjQxs",
+"O3iyQDcpWB","QWxoTBbwgA","0YAGHpv0i7","EoToPlCMxy","AXpwE4dEz6","uLtKsgjUTu","y94nwEdBKc","lCMxy5Drn0","FNYIMVerEA","oVQp6FFDui",
+"SbRYyQ6hMC","Yw2oU7ku1p","nnP8oL7cGc","YOfrYuJScX","9iGoTUvlv4","ciuWzFnPFB","618DiuTacx","2Nslmpv0i7","nFqikQbxXc","QYxC08TxD7",
+"RpBQmru4UG","7hyVvMm8si","QChxszY1GY","zmLYDHzZT8","t59lRVprf2","lsQGo7Ow5C","8U2nUQWxoT","9rlg9IKxdL","Q6Lixpv0i7","ZJTXHy94nw",
+"pmeCdChuy3","atef2oVQp6","M3zXLn8pJ9","QChxsPOUYS","d85a9Chuy3","GSQwjsoy9t","FhtglgIYvE","uQIczfFDrJ","Chuy3LbRTH","s7MxkFVMxo",
+"BFkb8B3qem","7ku1pTwano","WPmlxbZLvS","WDVWJ2ZHdk","AkKTkdQ586","tl72W0BmCy","s93MlM3zXL","1v5hH9GXkX","qUJMdZhwG1","QworuxXTI4",
+"pvgjSSbRYy","fmIK10Kyfs","XflUqCp3mZ","WDVWJWPmlx","vOqCE5Mg9r","gIYvEaez9y","8cVD30BmCy","ZhwG12hEEU","QWxoTsoy9t","GrDg7ECMvU",
+"m4bxUjS1aj","4dEz6LDk6f","guMb8Mm8si","ZUnqtFGzgp","jeskSFNYIM","ni2v124ARF","mz8gxuZPqg","rKDLJWaWsv","hYBCKAmdQd","Waim6faHir",
+"a00b54dEz6","1j5L8VerEA","0ao3ljzUqR","y94nwOUqFM","kB5nP2Nslm","Nxx9VS2Dfu","ZuDtDBFkb8","nlaByZJTXH","guMb80Wr5y","SWfouWDVWJ",
+"CxVEfpvgjS","pAhR1M6qcG","fFDrJn8pJ9","lCMxyJRJQB","uupzk48cHL","zY1GYBbwgA","bgJAzJkzUn","8xEKzMK07Y","ZzJHWVLTy6","D6rBy6AFT0",
+"9rlg9zHF1q","lpF6WjzUqR","zQt6QK4GS8","Gv3FqZJTXH","gf8rINAFuw","v2eC3G1RhS","uvf7AlViBv","m4bxU9y4lw","2Nslmzz4ZU","HRxd8mX2GE",
+"W7cTsCK5W7","uLtKsulk41","OxWIHCqqaD","tvdkDRsQUq","djsrvyToGW","ciuWzEOE1o","sqVrfmX2GE","qUJMdm4bxU","tjQxsAgJHQ","nlaBydpe1v",
+"NhXduuLtKs","8cVD3uvf7A","hYBCK8TxD7","5IhmGlXFOB","9GXkX29QAz","Cfgr3JJs5m","oVQp6lkMUA","NcICAs4786","azIWpIKxdL","zqH0WxXTI4",
+"uZPqgDQimp","QnJ1SAIYUu","0Wr5yK20wK","45cIHJXljW","kZANmQChxs","suY4xtlILt","14FLR07n1c","5Drn0tl72W","AOgEeFFDui","jS1ajX6Pin",
+"KsjRKTXQ0Z","ZzJHWO3iyQ","gdQsSOz8yZ","tvdkD5IhmG","Mm8sizmLYD","TCgPpuPX7G","2Nslm7Ow5C","euZA5AOgEe","HzZT8FxX9q","6q6L9FjHXR",
+"StlDJNOHsz","Ul4a17fsYM","8cVD3n1pmO","GrDg7bZLvS","5Mg9rWaWsv","8TxD7CxVEf","VerEAk85Ae","oVQp6FGzgp","t98iWatef2","LewvMJ2mQi",
+"No0QbUl4a1","W3VFHEOE1o","wiHrZFLsph","6q6L9CqqaD","FFDuiHfyNQ","iwzGkAmdQd","29QAzguMb8","ZuDtDl83Ud","M6qcGNhXdu","cL0aERpBQm",
+"vkCHHS77LH","WmadA55rfB","MGlTFokgRi","XyPZNpAhR1","No0Qb6AFT0","suY4xXyPZN","Ul4a1uZPqg","2hEEUqQxHP","FjHXRCK5W7","9GXkXjiVBP",
+"ydG8UXflUq","Nxx9VFFDui","fLNg8ThjNn","pmeCdUvlv4","618DiEdBKc","xXTI4Mm8si","HRxd8lXFOB","9eoRcguMb8","29QAzIn3NS","48cHLW3VFH",
+"4dEz6SmGzv","FxX9q2ZHdk","Uvlv4tAOsr","POUYSpWiOs","1v5hHUlU3M","e6e4zfLNg8","a00b548cHL","14FLRxXTI4","0MR5Xi3pyd","piJSkbZLvS",
+"7lUXZ9iGoT","Y1mC05IhmG","lXFOB2TRI7","dmoS707n1c","StlDJAXpwE","tvdkDAXpwE","e6e4zK20wK","OUqFMUl4a1","9y4lwD6rBy","Y1mC0ZUnqt",
+"64s8N5VZjS","FwEJzVIlwP","Y1mC0KASQ8","Yf2EcokgRi","8cVD3BpYhV","x3LDepiJSk","8RCUA1v5hH","LDk6fUl4a1","oVQp6t59lR","4QMc9Z4I1v",
+"nnP8ouQIcz","rhl0JGWqqX","0BmCyhe9IA","oGu6xqQxHP","0ao3lB3qem","AXpwE55rfB","07n1c0YAGH","uZPqg5IhmG","618DiWDVWJ","2TRI7fqypy",
+"Yf2Ecaez9y","BCxeCuvf7A","M6qcGzQt6Q","yvOMICxVEf","4W0TlPOUYS","YjB9t2Nslm","Uvlv4v2eC3","SWfoun8pJ9","WreyPD6rBy","iKqhrjiVBP",
+"RBhp09eoRc","0YAGHTwano","nnP8oHfyNQ","5Drn0s7Mxk","hSSvQdjsrv","iB08ljiVBP","zbIYYulk41","P6bcgFnPFB","FnPFBYw2oU","BCxeC0h1b1",
+"NcICAuvf7A","ZUnqtFNYIM","zbIYYhE1Ql","8RCUAFLsph","xReecfaHir","MGlTFK20wK","29QAz1LB1L","MezSWh1zcH","gdQsSZJTXH","FjHXROUYuF",
+"618Di5Drn0","uZPqglm0pD","jSjS3HfyNQ","hUTw7bZLvS","lm0pDWaim6","AkKTkGXdoH","16lHcLbRTH","1j5L8lm0pD","l83UdSmGzv","n1pmOQClRL",
+"580YDt59lR","qUJMdmX2GE","HzZT8VerEA","y94nw9XyT9","dmoS7Mm8si","mX2GEcQOnv","fqypyZzJHW","ni2v1WPmlx","CIShG3weIF","hYBCKdjsrv",
+"D6rByEdBKc","HRxd8zHF1q","RsQUqS77LH","1j5L864s8N","blLA9pT8wu","8hJdtfLNg8","MmsIouN6r3","lH1ktAkKTk","lXFOBsqVrf","Vprf2yofH3",
+"9eoRcMGlTF","Nxx9VtvdkD","8TxD79rlg9","CqqaDRBhp0","tuDySlpF6W","YjB9tIRh48","uN6r3BFkb8","zFgtBKr8ys","hi5X7IRh48","zz4ZUzmLYD",
+"nFqikMaJQs","CxVEfDQimp","S77LHgjUTu","L7cGc0Wr5y","OHaBz5ZaEz","7hyVv4QMc9","Yh1hFGWqqX","nnP8o14FLR","Uvlv4W3VFH","n8pJ97X3uy",
+"FnPFBJKWYR","3weIFGrDg7","FFDuiFPfSE","yofH3F6PT2","SWfou0YAGH","BFkb8aDGtS","QChxsqUJMd","ZuDtDcL0aE","taOXKatef2","hi5X7CqqaD",
+"9y4lwCIShG","FjHXRPYBf4","Cp3mZNo0Qb","d7vjM24ARF","D6rByMm8si","X6Pinatef2","y94nws93Ml","qaofNuoStw","lViBv7hyVv","0h1b1RsQUq",
+"NOHszD6rBy","O3iyQChuy3","8RCUA6q6L9","X6PinMezSW","zHF1qRzaZA","FVMxoyofH3","FNYIMlj07Q","JRJQBt98iW","580YDjSjS3","618Di5VZjS",
+"6q6L99iGoT","suY4x9rlg9","3weIFAkKTk","JXljWQworu","jSjS3Dz1R3","i3pydWaWsv","DLhzMs4786","Dz1R3ZuDtD","FxX9q6AFT0","uoStwjtn0X",
+"k85Ae0BmCy","JXljWPb1pa","aFFss2TRI7","AkKTkYjB9t","pWiOsCK5W7","9XyT9oQ87r","O3iyQgdQsS","KsjRKC2Irc","m4bxUEOE1o","HfyNQAIYUu",
+"OUqFMEdBKc","0ao3lpiJSk","2hEEUWreyP","FwEJz3otm6","9XyT96q6L9","QYxC0KASQ8","Kr8yswiHrZ","8RCUAsoy9t","euZA57lUXZ","LDk6fQ6hMC",
+"XyPZNYw2oU","QChxsX6Pin","DG4sTKZamH","fqypy8cVD3","uQIczMm8si","29QAz5ZaEz","lsQGolH1kt","8cVD3Ss0Zu","M3zXLRzaZA","U3yw58cVD3",
+"gf8rIThjNn","aFFss5Mg9r","mX2GEaez9y","hE1QlM6qcG","jzUqRyEfy9","RxrsmMkgy8","Gv3FqGv3Fq","8RCUA6AFT0","wDajXsqVrf","Ul4a17hyVv",
+"zz4ZUcL0aE","DcpWBnlaBy","lweGyXflUq","O3iyQuN6r3","AmdQdgIYvE","Mkgy8tvdkD","lj07QuPX7G","BGaQYUl4a1","VNCPdguMb8","s4786xciqp",
+"2hEEUHP433","RzaZAAmdQd","WPmlxFwEJz","HP433pv0i7","BFkb8lsQGo","NOHszIRh48","C2IrcpmeCd","VNCPd4dEz6","DcpWBRzaZA","Kr8yspiJSk",
+"2ZHdkCNHmv","t98iWZhwG1","IjTwP7fKYU","JJs5mhUTw7","tl72WWPmlx","ThjNni3pyd","Y1mC0IBe8k","5iGN5uQIcz","KASQ87lUXZ","QChxsJkzUn",
+"i7WMQDG4sT","1v5hHRmDcr","wDajXJJs5m","TXQ0ZMaJQs","RkQkefcJOy","In3NSbrhlQ","8TxD72DREs","JXljWtl72W","07n1cFxX9q","b29RJpAhR1",
+"zHF1qIKxdL","W3VFHazIWp","faHirmz8gx","xciqpfcwDa","55rfB16lHc","JRJQBWDVWJ","MezSWlH1kt","gIYvE0Wr5y","LDk6fKr8ys","FLsphBGaQY",
+"7fsYMbrhlQ","ix74rokgRi","I7p2aWMiS3","hE1QlZUnqt","16lHczz4ZU","zqH0WBCxeC","4dEz6fcJOy","G1RhSuPX7G","x3LDetAOsr","L7cGcVprf2",
+"KASQ8sx5Gl","MmKGJ3weIF","In3NSYjB9t","M3zXLFNYIM","LbRTHFNYIM","vOqCE0YAGH","EdBKcdhSuH","Q6hMCAXpwE","FVMxo1LB1L","yEfy9WPmlx",
+"QworunnP8o","DQimptvdkD","FhtglEoToP","tl72W5Namm","Q6hMCFhtgl","BbwgA5IhmG","ulk414dEz6","8hJdtzqH0W","Gv3FqiKqhr","0Wr5ypT8wu",
+"VjCZqSmGzv","a00b5kZANm","24ARFtAOsr","2Yz7EVBjhz","JRJQBxReec","hYBCKy94nw","FcWrWAOgEe","UmaEvFVMxo","jfREuCNHmv","VerEAJXljW",
+"VNCPdPb1pa","FwEJzaez9y","o8UydS77LH","tl72WpiJSk","fqypyuQIcz","3weIFZUnqt","tl72WJXljW","KZamHCK5W7","JKWYR1LB1L","Ss0ZupAhR1",
+"lXFOBDQimp","i3pydEoToP","DLhzMJXljW","KZamHJKWYR","sqVrfVerEA","45cIH8TxD7","Zv7z0guMb8","ZzJHWoGu6x","Pb1paG1RhS","Kr8ys2Yz7E",
+"StlDJlH1kt","yEfy9uTacx","hYBCKUlU3M","ydG8Us7Mxk","AmdQdWmadA","CNHmvhe9IA","FVMxoGWqqX","Ul4a1VIlwP","RzaZAjtn0X","djsrvZhwG1",
+"5Drn0b29RJ","euZA5uQIcz","8U2nUtvdkD","x3LDe55rfB","Dz1R3gIYvE","64s8Nd7vjM","QssNCFxX9q","4QMc9t98iW","7hyVv6AFT0","tvdkDjiVBP",
+"n1pmOhSSvQ","64s8NStlDJ","tvdkD5drc6","K4GS8yluBx","LDk6fVNCPd","POUYSMm8si","9XyT92TRI7","n1pmOxReec","0YAGHMGlTF","BFkb8zmLYD",
+"k85AeksJby","lViBvZ4I1v","iB08lzHF1q","k85Aeix74r","KZamHzqH0W","1v5hH1v5hH","fcJOyFhtgl","O3iyQuJScX","6AFT0FwEJz","7ku1pDG4sT",
+"8FmFHVerEA","gtCA5gtCA5","lm0pDS2Dfu","aez9yVBjhz","AmdQd5nmWv","rKDLJazIWp","oQ87rLbRTH","iKqhrokgRi","zbIYYWMiS3","ECMvUiKqhr",
+"8xEKzs4786","ZJTXHyluBx","QChxsDz1R3","TXQ0ZFLsph","K20wK618Di","HlUbFhSSvQ","soy9ttvdkD","bZLvSVIlwP","MmsIooGu6x","LbRTHSmGzv",
+"lViBvB3qem","RzaZAx3LDe","Zv7z0i7WMQ","lpF6WHlUbF","d85a9brhlQ","Q6LixuQIcz","KASQ8lweGy","RsQUqZuDtD","lweGyfcwDa","D6rBy4dEz6",
+"HzZT85Namm","m4bxUBpYhV","2Nslm64s8N","NcICAguMb8","aez9ypFrrl","WmadAUlU3M","xReecQChxs","fFDrJThjNn","Oz8yZTa8f6","okgRigf8rI",
+"2NslmyofH3","Ss0ZuO3iyQ","s4786WDVWJ","FLsph0Wr5y","faHirVNCPd","uupzkZ4I1v","QssNCMezSW","jfREumz8gx","MmKGJiwzGk","yluBxXflUq",
+"s4786zbIYY","Cp3mZv1Hln","JKWYRlkMUA","rKDLJ7fsYM","NAFuwQYxC0","OUqFMiqv4k","6q6L9taOXK","D6rBy5nmWv","WmadAFGzgp","NhXduY1mC0",
+"IBe8k0Kyfs","0h1b1QbxXc","vLsmSWreyP","6q6L9nnP8o","6AFT0faHir","AmdQdiwzGk","v1Hln580YD","RmDcryluBx","uupzkaez9y","J2mQiZv7z0",
+"XyPZNHRxd8","qUJMdVBjhz","FhtglLDk6f","oQ87rpWiOs","SjskQAkKTk","bZLvSdhSuH","KsjRKGWqqX","okgRiStlDJ","ZUnqt4W0Tl","X6PinZzJHW",
+"StlDJaL6AJ","AOgEeJIqXi","45cIH2Yz7E","FhtgluoStw","LbRTH5Namm","FPfSEvkCHH","uAWypqaofN","MK07YjiVBP","cShY2RpBQm","BbwgAKr8ys",
+"BpYhVL7cGc","OUYuFQnJ1S","WMiS3uvf7A","blLA9HRxd8","YjB9tqUJMd","lpF6WazIWp","FGzgp07n1c","WPmlxSs0Zu","Ss0ZulXFOB","JKWYRzFgtB",
+"piJSk7Ow5C","ciuWzNxx9V","blLA9B3qem","3weIFi3pyd","Yh1hFF6PT2","Ss0ZuQWxoT","ReKEWcQOnv","JIqXiOz8yZ","lj07QyvOMI","n1pmOlXFOB",
+"lCMxyzqH0W","D6rByQbxXc","Cp3mZuAWyp","h1zcHJRJQB","suY4x2Yz7E","tlILtPOUYS","tlILtBFkb8","xXTI40BmCy","fFDrJ5VZjS","aL6AJhSSvQ",
+"i7WMQMmKGJ","OUqFMOUqFM","wDajX2DREs","F6PT2hE1Ql","cShY2BFkb8","TXQ0ZdQ586","Pb1pa16lHc","uvf7AprNT6","atef2MK07Y","2Nslm2ZHdk",
+"dmoS7BFkb8","aFFssBGaQY","rz7UtSbRYy","OxWIHNxx9V","uLtKsydG8U","2TRI7BpYhV","J2mQitjQxs","lm0pDCK5W7","8hJdtiwzGk","ksJbybgJAz",
+"yvOMIgIYvE","JkzUnTwano","zqH0W8RCUA","VjCZq7hyVv","v8yFNpvgjS","AIYUu07n1c","45cIHNOHsz","jeskSfcJOy","suY4xTa8f6","HP433bZLvS",
+"64s8NvLsmS","5NammSWfou","gtCA5OUYuF","RBhp0kZANm","ciuWzokgRi","RkQke9rlg9","lkMUAni2v1","RBhp0xXTI4","s93MlSjskQ","fcwDasx5Gl",
+"2TRI7atef2","ogLgc8xEKz","tAOsrzqH0W","yEfy9I7p2a","2Nslmd85a9","WDVWJYf2Ec","1v5hHWreyP","5iGN5F6PT2","o8Uyd2DREs","FFDui29QAz",
+"CIShGm4bxU","0YAGHgtCA5","8hJdt0h1b1","dhSuHxReec","C2IrclkMUA","okgRiNxx9V","yEfy9JRJQB","h1zcHQ6hMC","8U2nUbZLvS","2hEEUAkKTk",
+"Uvlv4GrDg7","lViBvGrDg7","he9IAvOqCE","brhlQFjHXR","faHirix74r","uN6r3S2Dfu","FVMxozY1GY","uAWypyToGW","5ZaEzAOgEe","gIYvEIjTwP",
+"Y1mC0suY4x","ulk41HlUbF","gIYvEJRJQB","F6PT29GXkX","yvOMIqaofN","DLhzMni2v1","QbxXc1LB1L","0MR5XPOUYS","suY4x1j5L8","tvdkDcL0aE",
+"Kr8ysQClRL","y94nwMmsIo","HRxd8UmaEv","FPfSEEOE1o","WDVWJqaofN","Oz8yZQnJ1S","P6bcglkMUA","pmeCd618Di","5Drn09iGoT","OUqFMUmaEv",
+"MK07Ydjsrv","s93Ml48cHL","U3yw5CxVEf","TwanopAhR1","GWqqXLDk6f","FFDui7fKYU","Ss0Zu9iGoT","mX2GEzqH0W","pWiOszHF1q","9GXkXQ6Lix",
+"SmGzvjfREu","qUJMdBFkb8","tvdkD6AFT0","X6PincmXIX","zqH0WIKxdL","pAhR1iB08l","9eoRcuN6r3","AgJHQ6AFT0","IRh48jzUqR","HfyNQSjskQ",
+"a00b5ydG8U","Kr8yspAhR1","guMb8yluBx","JXljWxciqp","pFrrlnFqik","lCMxyFnPFB","L7cGcFFDui","v8yFN2hEEU","QssNC2DREs","7lUXZhe9IA",
+"2TRI7jS1aj","0ao3lvOqCE","48cHLiB08l","VIlwPydG8U","GrDg7JIqXi","uAWyp5nmWv","Waim6FxX9q","TXQ0Zlj07Q","JkzUn2hEEU","euZA54W0Tl",
+"8cVD3d7vjM","8cVD37hyVv","djsrvlsQGo","vLsmSNcICA","uPX7GFGzgp","UlU3M2hEEU","nlaByIBe8k","piJSkpFrrl","SmGzvjzUqR","uJScXWaWsv",
+"lXFOBdQ586","xReecJIqXi","nnP8opAhR1","yluBx1LB1L","Yh1hFKZamH","nnP8oMmKGJ","618Dis93Ml","YOfrYuLtKs","n8pJ9jS1aj","uvf7AOxWIH",
+"dQ586ZUnqt","e6e4z9XyT9","pv0i7yEfy9","AOgEe29QAz","fLNg8G1RhS","AXpwEF6PT2","jeskSS77LH","0ao3lS77LH","blLA9lsQGo","h1zcHsx5Gl",
+"BCxeCfmIK1","aL6AJQYxC0","jzUqR9y4lw","iwzGkXflUq","8xEKz0MR5X","VjCZqLDk6f","rKDLJQYxC0","YOfrYmX2GE","iwzGklkMUA","FPfSE5iGN5",
+"Nxx9VfFDrJ","NAFuwfqypy","2NslmiwzGk","qQxHPQWxoT","a00b5IjTwP","azIWpKASQ8","kZANmVLTy6","DG4sT0PktI","x3LDeWaWsv","euZA5d7vjM",
+"W7cTsuLtKs","n8pJ91LB1L","uPX7GAXpwE","n8pJ9IKxdL","qQxHP5drc6","jSjS37hyVv","0KyfsF6PT2","uoStwVNCPd","5iGN5qQxHP","U3yw5hE1Ql",
+"Ss0ZueuZA5","iwzGk7fKYU","yEfy9KASQ8","RkQkeRsQUq","zbIYYru4UG","SmGzvZv7z0","K20wK7Ow5C","ogLgcNhXdu","No0QbSmGzv","nlaByDz1R3",
+"yvOMIOHaBz","gjUTuSs0Zu","14FLRuZPqg","soy9togLgc","gdQsSGWqqX","EoToPDQimp","0Kyfs4W0Tl","pAhR1l83Ud","EoToPbrhlQ","l83UdGXdoH",
+"0YAGHFLsph","lXFOBStlDJ","Vprf2MK07Y","hSSvQMaJQs","JKWYRzQt6Q","580YDjiVBP","lpF6WAXpwE","07n1cQnJ1S","s7Mxk8cVD3","xReecMmsIo",
+"QWxoTfcJOy","ksJby45cIH","EOE1omz8gx","4dEz6e6e4z","cQOnvC2Irc","Vprf2bZLvS","No0Qbsx5Gl","ZUnqtdhSuH","0ao3lRACuj","KsjRKtvdkD",
+"5VZjSEoToP","O3iyQzmLYD","kB5nPZuDtD","l83UdZhwG1","Dz1R3lm0pD","fqypy0BmCy","Gv3Fq5IhmG","jiVBPAmdQd","Mm8sipv0i7","VjCZqCfgr3",
+"29QAz7lUXZ","y94nwzbIYY","VNCPdoGu6x","pmeCdrKDLJ","MezSW9y4lw","yluBxMK07Y","G1RhSqQxHP","m4bxUPYBf4","b29RJKASQ8","azIWpkB5nP",
+"yEfy9aL6AJ","Gv3FqC2Irc","1v5hHO3iyQ","blLA90Wr5y","kB5nP0Kyfs","XyPZNJKWYR","AOgEeFxX9q","DQimp0Wr5y","QChxsCNHmv","MojnPCxVEf",
+"2NslmGrDg7","EOE1oCIShG","ZhwG1RBhp0","0Wr5y3weIF","tAOsrGSQwj","Ul4a14W0Tl","gdQsSlViBv","Oz8yZyofH3","gjUTuJXljW","YOfrYGv3Fq",
+"JIqXiQ6hMC","5nmWvY1mC0","tuDySfaHir","VBjhzgdQsS","jzUqRcQOnv","dpe1vNhXdu","zbIYY55rfB","QnJ1SuoStw","Nxx9VJkzUn","NcICAzQt6Q",
+"TCgPpM3zXL","5iGN5IRh48","iqv4kYf2Ec","FhtgldhSuH","0KyfsjS1aj","Waim6Vprf2","5VZjSPYBf4","8FmFHFnPFB","tAOsr5Drn0","atef25Mg9r",
+"xReecSjskQ","t98iW5IhmG","oQ87r1j5L8","Nxx9VqUJMd","QWxoT8cVD3","uvf7ACp3mZ","ix74rVLTy6","FjHXR9XyT9","d85a95Mg9r","8U2nUuLtKs",
+"i7WMQKsjRK","FVMxoHzZT8","CIShGguMb8","QworuzFgtB","xXTI4Oz8yZ","7fKYUyluBx","GSQwjQssNC","Yw2oUqUJMd","JIqXiBFkb8","rz7UtReKEW",
+"jeskSVBjhz","Ul4a12Yz7E","soy9tnlaBy","S2DfuAOgEe","XyPZNAIYUu","Ta8f6ydG8U","gjUTu5VZjS","d7vjMfcwDa","lpF6WVerEA","KZamHYh1hF",
+"2TRI707n1c","cQOnvPOUYS","cmXIXGWqqX","M6qcGrz7Ut","HRxd8o8Uyd","7lUXZCp3mZ","oGu6xFGzgp","SbRYyuPX7G","iKqhr6AFT0","2TRI7l83Ud",
+"FLsphiKqhr","DG4sTru4UG","9iGoTFPfSE","i3pydJXljW","zqH0WJXljW","pFrrlrz7Ut","aDGtSPOUYS","NOHszdpe1v","4dEz60Kyfs","I7p2aBbwgA",
+"8TxD7jeskS","lCMxyW3VFH","GrDg7djsrv","CqqaDKsjRK","Ul4a1vOqCE","FLsphQClRL","vkCHHZzJHW","o8UydnlaBy","WreyP1v5hH","JXljWuJScX",
+"5Mg9r2ZHdk","L7cGcCIShG","VBjhzd7vjM","GSQwjEdBKc","zY1GYtlILt","Ta8f6dQ586","SmGzvpiJSk","7lUXZWMiS3","RmDcrEoToP","s4786FcWrW",
+"oGu6xWPmlx","ydG8UFwEJz","gdQsSrKDLJ","9XyT99XyT9","RpBQmGSQwj","zFgtB5IhmG","X6PinWmadA","FLsphPOUYS","tuDySoQ87r","bZLvSIKxdL",
+"BbwgARxrsm","fFDrJhe9IA","uTacxdhSuH","fFDrJrhl0J","i3pydNxx9V","9y4lw5IhmG","BCxeCXflUq","lXFOBv2eC3","5Drn0Waim6","Ta8f6Rxrsm",
+"rz7UtblLA9","uvf7AhSSvQ","ix74ri3pyd","MmsIoKASQ8","lweGy2DREs","G1RhSReKEW","HP433oVQp6","uoStwF6PT2","dhSuHuQIcz","qUJMdtaOXK",
+"tlILtIn3NS","5VZjS580YD","AkKTkSjskQ","MK07YHRxd8","TXQ0Z07n1c","Mm8six3LDe","oVQp68U2nU","0Wr5yVBjhz","CdyBVdmoS7","618DiK4GS8",
+"M3zXLZUnqt","NhXdurhl0J","4dEz68TxD7","XflUq9XyT9","580YDYh1hF","FwEJzblLA9","AkKTk3weIF","tvdkDK4GS8","FNYIMaDGtS","d7vjM0h1b1",
+"fcJOy9XyT9","VBjhz2hEEU","7fsYMv2eC3","07n1cCIShG","RpBQmFjHXR","Vprf2GSQwj","tAOsrjS1aj","Cp3mZ55rfB","QChxsHzZT8","tjQxsFxX9q",
+"WMiS3VLTy6","MmsIoRBhp0","Nxx9VnnP8o","MK07YcQOnv","QnJ1SKr8ys","AIYUuMK07Y","uJScXFFDui","FwEJzQ6hMC","cL0aEJKWYR","14FLRNAFuw",
+"yvOMIlXFOB","LewvMJIqXi","MezSWJKWYR","JRJQBGv3Fq","RkQkeDcpWB","D6rByGrDg7","FwEJzhe9IA","lkMUAoVQp6","QworuDLhzM","vkCHHHP433",
+"ZUnqtWPmlx","YOfrY8FmFH","G1RhSGSQwj","8xEKzMm8si","FVMxojfREu","In3NSjfREu","7lUXZUmaEv","wiHrZFnPFB","L7cGcO3iyQ","2Yz7ECxVEf",
+"djsrv0BmCy","jzUqRFLsph","2NslmIn3NS","lm0pDdjsrv","XyPZNAgJHQ","tl72WVjCZq","FwEJz4dEz6","FcWrWyvOMI","IjTwP7hyVv","Chuy3580YD",
+"m4bxU5Mg9r","Pb1paLbRTH","ydG8UBGaQY","vkCHHs7Mxk","HzZT845cIH","fmIK1Dz1R3","NOHszgdQsS","VLTy6Dz1R3","GWqqXhSSvQ","VIlwPHzZT8",
+"7lUXZlXFOB","VjCZqNAFuw","uLtKsWPmlx","nnP8orhl0J","uLtKsWmadA","AgJHQlCMxy","AmdQduTacx","XflUqOUqFM","Q6LixoQ87r","JIqXivLsmS",
+"48cHLOUqFM","8cVD3suY4x","7fKYUnnP8o","ydG8UCfgr3","NOHsz5drc6","gIYvE48cHL","9y4lw3weIF","gtCA5faHir","cQOnvIRh48","VerEApFrrl",
+"8U2nU5Drn0","OUqFMo8Uyd","xReectvdkD","In3NSHRxd8","nFqiklsQGo","zmLYDYOfrY","ni2v1UlU3M","iwzGk0MR5X","5VZjSVprf2","hE1QlSs0Zu",
+"tvdkDIKxdL","QClRLJkzUn","QClRLrz7Ut","ZJTXHksJby","k85AekB5nP","v2eC3CxVEf","0PktIiwzGk","SbRYyulk41","n8pJ9CxVEf","6q6L9okgRi",
+"DG4sTix74r","aez9ylsQGo","L7cGc6q6L9","vOqCEk85Ae","580YDblLA9","i7WMQy94nw","zY1GYaDGtS","5VZjSaFFss","FnPFBsuY4x","tl72WcmXIX",
+"P6bcgcQOnv","iKqhr45cIH","5NammUl4a1","AIYUuMaJQs","QbxXcNOHsz","AkKTkpv0i7","FLsphQbxXc","zY1GYQClRL","FFDuiC2Irc","QnJ1SSbRYy",
+"uAWypiqv4k","fLNg8uJScX","UlU3MoGu6x","nnP8oQbxXc","Zv7z0xReec","0ao3lMGlTF","TXQ0Z8xEKz","8U2nUs4786","iB08lVIlwP","5IhmGO3iyQ",
+"HfyNQqUJMd","VBjhzFcWrW","jS1ajQClRL","tuDySVerEA","CIShGru4UG","t59lRs7Mxk","M3zXLTXQ0Z","JXljWzqH0W","lsQGo9rlg9","pT8wuv1Hln",
+"WMiS3IjTwP","Mm8siNhXdu","8FmFHWDVWJ","580YDnlaBy","Q6hMCuJScX","xciqpHzZT8","faHir55rfB","MGlTFNcICA","yvOMIFFDui","618DiI7p2a",
+"NAFuwQ6Lix","MojnP0BmCy","RpBQm8hJdt","dmoS7e6e4z","I7p2a3weIF","UmaEvCK5W7","taOXK1v5hH","t59lRRmDcr","FVMxowiHrZ","IRh48nlaBy",
+"s47868TxD7","nnP8ouvf7A","lm0pD7fKYU","t59lRguMb8","v8yFNe6e4z","5Drn0AOgEe","Ta8f6xReec","RACujt59lR","Dz1R3L7cGc","SjskQBFkb8",
+"VLTy6d7vjM","7fsYMAOgEe","jeskSSs0Zu","MezSWK4GS8","uvf7Av1Hln","cShY2lkMUA","FxX9qCdyBV","pFrrlSjskQ","SjskQzz4ZU","4QMc9C2Irc",
+"xReec16lHc","PYBf4Ta8f6","Q6hMCGv3Fq","pT8wuFwEJz","jSjS39GXkX","dmoS7n1pmO","5IhmGAIYUu","FVMxoThjNn","EdBKcksJby","6q6L9oQ87r",
+"NcICANcICA","7ku1pVIlwP","HP4339iGoT","o8UydVBjhz","LewvMQssNC","aDGtSBbwgA","ksJby0Wr5y","VBjhzprNT6","POUYSHP433","RBhp0yvOMI",
+"RxrsmNAFuw","mz8gxB3qem","djsrvvLsmS","GXdoH7ku1p","X6PinMm8si","JXljW0ao3l","7X3uy9y4lw","fcwDaUl4a1","9XyT9hSSvQ","Qworuxciqp",
+"vLsmSrhl0J","Ss0ZuqUJMd","lXFOB48cHL","uoStweuZA5","C2IrcFhtgl","zQt6Q9GXkX","4QMc9LbRTH","yEfy9QbxXc","rKDLJRpBQm","XflUqzHF1q",
+"5Mg9r9rlg9","jfREuFNYIM","5iGN5uJScX","Chuy3J2mQi","SmGzvJRJQB","OUYuFdjsrv","y94nwpT8wu","5NammFwEJz","5drc6piJSk","jtn0XuQIcz",
+"ThjNnLewvM","euZA51LB1L","RpBQmRpBQm","JXljWOHaBz","OUYuFlj07Q","BCxeCCNHmv","jzUqRLbRTH","RzaZA7Ow5C","F6PT2LDk6f","brhlQMmsIo",
+"Ul4a1Zv7z0","5iGN5ydG8U","HRxd8FwEJz","VNCPd2ZHdk","VIlwPB3qem","ZzJHWG1RhS","aFFssrz7Ut","uvf7AwiHrZ","mz8gxJJs5m","jeskSydG8U",
+"m4bxUSbRYy","Chuy3bgJAz","tuDyS5VZjS","Q6LixjfREu","CK5W7MmsIo","hi5X7AXpwE","5Drn0JkzUn","NcICAhSSvQ","55rfByToGW","jeskS8FmFH",
+"UmaEvzQt6Q","pvgjS1LB1L","7hyVvGWqqX","CNHmv0MR5X","0BmCyMK07Y","DQimpAgJHQ","MmsIoNhXdu","i7WMQoQ87r","2NslmwiHrZ","IjTwP580YD",
+"FjHXRZ4I1v","2ZHdk48cHL","iKqhrjeskS","hYBCKOHaBz","SWfouReKEW","m4bxUWreyP","07n1cY1mC0","zQt6QydG8U","Uvlv429QAz","aez9yCp3mZ",
+"WmadAv1Hln","DG4sTQworu","GSQwjgjUTu","fcwDa14FLR","Ul4a1Kr8ys","NhXduRxrsm","FcWrW0h1b1","C2Irc8cVD3","VjCZq8U2nU","VBjhzhYBCK",
+"ZhwG1h1zcH","tl72WThjNn","guMb85Namm","bgJAz29QAz","FnPFBi3pyd","oGu6xW3VFH","yEfy9RBhp0","07n1c9y4lw","NOHsz9iGoT","o8UydSWfou",
+"8FmFHhYBCK","SmGzvydG8U","rhl0JQClRL","o8UydChuy3","uupzkv2eC3","cShY2DG4sT","5drc6nnP8o","FNYIMFhtgl","5drc6WPmlx","KsjRK8RCUA",
+"iwzGkSbRYy","XflUqIKxdL","4dEz6gtCA5","l83UdlpF6W","fcwDaZ4I1v","zqH0WzqH0W","5Mg9rMK07Y","1j5L82TRI7","4W0TlMK07Y","7fsYMzz4ZU",
+"pvgjSHRxd8","5drc6lj07Q","lXFOBBGaQY","s7MxkwDajX","v1HlnyvOMI","NOHszydG8U","soy9tFGzgp","pAhR1S2Dfu","azIWpmz8gx","DLhzM618Di",
+"okgRiTa8f6","iKqhrAkKTk","oQ87rsuY4x","8xEKzQYxC0","D6rByAIYUu","cmXIX0BmCy","Gv3Fq55rfB","W7cTsuTacx","uN6r3tlILt","B3qemK4GS8",
+"mX2GEQssNC","uvf7AEoToP","AgJHQ2Yz7E","pT8wujtn0X","Waim6zbIYY","cL0aElCMxy","l83Uddjsrv","Gv3FqtlILt","K4GS8euZA5","s47869XyT9",
+"ulk41fLNg8","Cp3mZ8cVD3","8FmFHBFkb8","okgRiokgRi","2TRI7hE1Ql","n8pJ9lViBv","Ta8f62TRI7","5IhmGtl72W","djsrvKr8ys","RkQke07n1c",
+"uPX7GTXQ0Z","580YDRmDcr","ulk41Yh1hF","2DREsQworu","Nxx9VMmsIo","5Drn0oVQp6","FFDuiCK5W7","14FLRlH1kt","OUqFMjS1aj","cmXIXStlDJ",
+"lCMxycL0aE","wDajXulk41","NcICACxVEf","iB08lciuWz","v1HlnQClRL","9iGoTWMiS3","djsrvJRJQB","jtn0Xzz4ZU","uLtKsK20wK","fqypyCp3mZ",
+"ksJby48cHL","5NammVBjhz","QYxC0C2Irc","suY4xKr8ys","blLA9jtn0X","K20wKWPmlx","BFkb8IKxdL","6q6L9Oz8yZ","fmIK1ydG8U","EoToPPb1pa",
+"s7MxkWMiS3","m4bxUSjskQ","WaWsvWreyP","suY4xkZANm","d85a92Nslm","D6rBy9GXkX","5Nammulk41","P6bcgcL0aE","fqypy7fsYM","FcWrWwiHrZ",
+"7fsYMHfyNQ","zFgtBuAWyp","MezSWlXFOB","NcICA8hJdt","ix74rMmKGJ","JJs5m8cVD3","uZPqguN6r3","t59lRZ4I1v","FVMxoS77LH","tl72W9eoRc",
+"zHF1qn8pJ9","CK5W78TxD7","ZuDtD2Nslm","FFDuis7Mxk","pAhR1piJSk","yluBx0YAGH","x3LDelweGy","suY4xGSQwj","ThjNnZUnqt","Yw2oUCK5W7",
+"fcJOy5IhmG","ni2v1y94nw","W3VFHlsQGo","7Ow5CEoToP","MGlTF9GXkX","EoToPhUTw7","NhXdujzUqR","aDGtStl72W","fmIK1WMiS3","mX2GElm0pD",
+"zY1GYzbIYY","ru4UGZzJHW","48cHL7Ow5C","jfREuni2v1","ksJbyAmdQd","ni2v17lUXZ","WaWsvGXdoH","JRJQBlpF6W","SjskQNxx9V","BGaQYfcJOy",
+"64s8N8cVD3","VBjhzIRh48","lH1ktzbIYY","VLTy6gtCA5","GXdoHv2eC3","iqv4kQssNC","64s8NzFgtB","hSSvQ29QAz","9GXkXlweGy","kB5nPZv7z0",
+"ECMvU618Di","45cIHAIYUu","MmKGJeuZA5","MmKGJRACuj","WaWsvVerEA","zqH0W7fsYM","pAhR1xXTI4","iwzGkMojnP","FwEJzkZANm","fmIK1prNT6",
+"tvdkDIjTwP","GrDg7VerEA","JJs5mRxrsm","h1zcHbgJAz","KsjRKRACuj","jfREuCIShG","zFgtB45cIH","uAWypfmIK1","0Wr5yWDVWJ","QbxXcuJScX",
+"uoStwYh1hF","HRxd8RmDcr","0Kyfs0MR5X","TCgPpciuWz","UmaEvFNYIM","QbxXczz4ZU","WPmlxGXdoH","5iGN5Cfgr3","9XyT9RmDcr","0Wr5yGXdoH",
+"OUqFMZv7z0","uLtKsIn3NS","VNCPdt98iW","FcWrWt59lR","AIYUuVjCZq","KASQ86AFT0","14FLRMmsIo","C2IrcTXQ0Z","hUTw724ARF","vkCHHCdyBV",
+"zHF1qRmDcr","oQ87rCdyBV","5VZjSv2eC3","rKDLJD6rBy","aez9yZzJHW","IKxdLpFrrl","zz4ZU0BmCy","RzaZA0YAGH","2ZHdkHzZT8","t59lRk85Ae",
+"tjQxsVNCPd","HRxd8IBe8k","M3zXLTwano","ZUnqtRxrsm","DG4sT9GXkX","FNYIMQssNC","i3pyd3otm6","tjQxsEOE1o","pWiOsGWqqX","aDGtSlm0pD",
+"CxVEfCp3mZ","MojnPF6PT2","FFDuigjUTu","xciqpcQOnv","Qworu0PktI","iB08l6AFT0","uJScXAXpwE","RpBQm2TRI7","RpBQmhE1Ql","cmXIXcQOnv",
+"jiVBPStlDJ","NhXdu9rlg9","fqypyJIqXi","nnP8o6AFT0","qUJMdG1RhS","Zv7z0vkCHH","zbIYYsuY4x","GSQwjYjB9t","lj07Qulk41","QChxs8cVD3",
+"FFDuigIYvE","fFDrJ5iGN5","CqqaDlpF6W","ZzJHWDz1R3","gjUTuxReec","8hJdtsoy9t","pvgjSTCgPp","pFrrlSWfou","aDGtSJJs5m","xXTI42ZHdk",
+"l83Uds7Mxk","OUqFMn1pmO","TXQ0Z4W0Tl","zQt6QWmadA","0YAGHuAWyp","QClRLFxX9q","OUYuFo8Uyd","ZzJHWQChxs","07n1cuupzk","2TRI7gjUTu",
+"2TRI7djsrv","OxWIHtl72W","EdBKc9rlg9","VBjhzKASQ8","CqqaDYh1hF","MezSWFPfSE","C2Irc5iGN5","i7WMQU3yw5","bZLvSVerEA","I7p2aJIqXi",
+"0h1b14QMc9","5drc6AOgEe","ZJTXHuoStw","1j5L8fLNg8","yToGWWreyP","MojnP29QAz","ix74r4QMc9","RsQUqCfgr3","BbwgAIjTwP","ydG8Ul83Ud",
+"ECMvUx3LDe","7fKYU1v5hH","In3NSk85Ae","xciqpv2eC3","yvOMIkZANm","NhXdujS1aj","4W0TlKZamH","WaWsvh1zcH","dmoS7uZPqg","Q6LixWaim6",
+"fcwDajSjS3","No0QbxXTI4","jS1ajoVQp6","pvgjSyofH3","9rlg9OUYuF","KZamHBFkb8","piJSktvdkD","lweGyUmaEv","ZzJHWHfyNQ","RzaZAWaWsv",
+"pvgjSFGzgp","RpBQmqaofN","HzZT8S77LH","MezSW0Kyfs","3otm6HP433","IKxdLQChxs","yluBxjSjS3","uoStwzQt6Q","WPmlx2DREs","FjHXRpvgjS",
+"JJs5mUl4a1","Twanoa00b5","dhSuHJ2mQi","FjHXRzbIYY","HzZT8soy9t","SbRYytl72W","FxX9qXyPZN","FGzgpix74r","gf8rIksJby","QChxszz4ZU",
+"h1zcHUl4a1","gf8rIOz8yZ","b29RJzmLYD","d85a9QClRL","EoToPZv7z0","NcICAgjUTu","4QMc9dmoS7","ZhwG1iqv4k","Yh1hF9XyT9","zFgtBuZPqg",
+"UmaEvIKxdL","8cVD3Rxrsm","MojnPrz7Ut","1j5L88U2nU","piJSkydG8U","3weIFyluBx","xciqpfLNg8","EOE1oQChxs","9GXkXh1zcH","5NammiwzGk",
+"5IhmGJ2mQi","o8UydW7cTs","lH1kt3weIF","pv0i7BpYhV","HfyNQ2hEEU","Yf2EcPb1pa","WPmlxWmadA","AgJHQlH1kt","No0Qbhi5X7","J2mQidpe1v",
+"nFqikAmdQd","NAFuwhi5X7","MK07YEdBKc","VNCPdhYBCK","Nxx9VMm8si","WMiS3gIYvE","NcICAXflUq","FGzgpZzJHW","618DiciuWz","pFrrlpAhR1",
+"rz7UthE1Ql","DcpWBJ2mQi","2hEEUfLNg8","tAOsr8RCUA","W3VFHaFFss","ciuWzxXTI4","Y1mC02Nslm","zbIYYQClRL","euZA5ydG8U","Yh1hFs93Ml",
+"Yw2oUuN6r3","ZUnqt9XyT9","JXljWyToGW","fFDrJcL0aE","yluBx8U2nU","tvdkDb29RJ","D6rByl83Ud","QbxXcMezSW","0BmCySWfou","Mm8sihYBCK",
+"U3yw5x3LDe","ThjNnlweGy","5drc6FLsph","iKqhrBpYhV","QssNC5Namm","P6bcgCxVEf","5NammiKqhr","Z4I1vP6bcg","wDajXvkCHH","S2DfutaOXK",
+"UmaEv0YAGH","hYBCKprNT6","1v5hHZzJHW","ZUnqtI7p2a","uJScXDz1R3","DQimp5Mg9r","rKDLJW3VFH","5Mg9rgtCA5","mX2GEs7Mxk","CNHmvBpYhV",
+"RkQkeuPX7G","yluBx2TRI7","SjskQCIShG","zY1GYMaJQs","FNYIMoQ87r","AIYUunlaBy","9XyT9lweGy","qaofNWDVWJ","ru4UGKsjRK","EOE1oMkgy8",
+"FPfSECdyBV","e6e4zZUnqt","pFrrlnnP8o","ThjNnuTacx","45cIHxXTI4","dhSuHMaJQs","ydG8UVIlwP","vOqCEEoToP","2TRI7K20wK","dmoS75nmWv",
+"qaofNVprf2","5Drn0zY1GY","CxVEflj07Q","D6rBypWiOs","jS1aji7WMQ","WPmlxQworu","piJSkLbRTH","jtn0XIBe8k","dmoS7pFrrl","tuDySYh1hF",
+"guMb8MGlTF","jtn0XKsjRK","7X3uyfcwDa","uLtKszHF1q","WPmlx580YD","5drc6MezSW","hUTw7ZhwG1","oVQp6JRJQB","tlILttuDyS","JIqXiNhXdu",
+"TXQ0Zn1pmO","o8UydMK07Y","VBjhz8cVD3","iqv4kfLNg8","8RCUAOUYuF","WMiS3MK07Y","n8pJ90Wr5y","No0QbRsQUq","QnJ1SNhXdu","StlDJTa8f6",
+"LewvMuAWyp","QChxsZJTXH","RzaZAcmXIX","cShY2zFgtB","brhlQsoy9t","jS1ajfcJOy","5Mg9rfmIK1","bZLvSM3zXL","4W0TlTwano","1v5hHKr8ys",
+"CIShGpFrrl","dQ586FcWrW","WDVWJlpF6W","t59lR4W0Tl","FwEJzdmoS7","i3pydWMiS3","ogLgcHP433","zbIYYBCxeC","HzZT8QClRL","k85AeZJTXH",
+"RACuj16lHc","gjUTu9rlg9","uJScXulk41","qQxHPBCxeC","OxWIHs4786","fmIK18FmFH","QYxC0QnJ1S","uupzkt59lR","ciuWzMezSW","Waim6ni2v1",
+"aFFss48cHL","i3pydC2Irc","zFgtB7hyVv","yEfy9lsQGo","lH1ktguMb8","ciuWzsoy9t","fLNg8x3LDe","tlILtX6Pin","iB08luZPqg","CdyBVpT8wu",
+"BGaQY0Kyfs","DLhzMrhl0J","TXQ0Z7Ow5C","2Yz7EFGzgp","QssNCatef2","wiHrZciuWz","iKqhrzHF1q","h1zcH3weIF","jS1ajB3qem","k85Ae4dEz6",
+"U3yw5ZhwG1","45cIH45cIH","jS1ajCp3mZ","ZuDtDZzJHW","2NslmW3VFH","RzaZAru4UG","6q6L9hUTw7","JkzUn0YAGH","3weIFfmIK1","2DREsnnP8o",
+"uupzkdhSuH","atef2zz4ZU","7Ow5CGWqqX","JKWYRdpe1v","tvdkDYw2oU","Uvlv4CqqaD","qUJMdZv7z0","Oz8yZU3yw5","0Wr5y7X3uy","HfyNQfqypy",
+"SmGzvFVMxo","9eoRcAOgEe","BbwgAVLTy6","0Wr5ylj07Q","i3pydDz1R3","VNCPduvf7A","OHaBze6e4z","Ta8f6U3yw5","8TxD72TRI7","yofH37ku1p",
+"s93Mlfqypy","5IhmGKsjRK","No0Qbk85Ae","HP43324ARF","5nmWv6AFT0","cmXIXpvgjS","DLhzMvOqCE","prNT6tuDyS","ni2v1pWiOs","zz4ZUZv7z0",
+"Dz1R3ydG8U","HlUbFIjTwP","AmdQdHlUbF","xReecRmDcr","Q6hMCCp3mZ","9y4lw5Mg9r","AkKTkRpBQm","dQ586CNHmv","Waim6n1pmO","HRxd8tAOsr",
+"VBjhz0YAGH","NOHszgIYvE","7fsYMfmIK1","Yh1hFiB08l","iB08llweGy","16lHcJRJQB","TCgPp16lHc","0KyfsQ6Lix","zFgtBCp3mZ","FjHXRUmaEv",
+"sqVrfI7p2a","tlILtlkMUA","OHaBzMkgy8","2NslmZuDtD","uN6r3ru4UG","iwzGklpF6W","DLhzM9iGoT","zbIYY9y4lw","lH1ktuupzk","ZzJHW2ZHdk",
+"EdBKcGSQwj","2DREsWaim6","7fKYUydG8U","C2IrcJkzUn","jS1aj16lHc","9GXkXZ4I1v","0MR5X29QAz","8TxD7O3iyQ","Q6LixEoToP","Mm8siMmsIo",
+"faHirvkCHH","i7WMQdhSuH","Yf2EcvOqCE","JIqXiDz1R3","zY1GYHRxd8","pFrrl2DREs","LewvM8hJdt","Oz8yZHP433","o8UydM3zXL","RzaZABFkb8",
+"OUYuFNAFuw","o8UydgtCA5","8FmFHrhl0J","8RCUAatef2","C2IrcuAWyp","fcwDal83Ud","tjQxsMmsIo","lm0pDKZamH","VNCPdHlUbF","In3NSbgJAz",
+"kZANmlH1kt","2ZHdkn1pmO","Ta8f624ARF","uZPqgU3yw5","MGlTFjzUqR","BGaQYyofH3","8FmFH7X3uy","1j5L8MmKGJ","wiHrZC2Irc","GXdoHVerEA",
+"ogLgcStlDJ","W3VFHuTacx","MaJQszFgtB","MmKGJt98iW","ru4UGjeskS","ZUnqtHP433","VerEAv1Hln","HlUbFZ4I1v","NAFuwqUJMd","s7MxkNo0Qb",
+"ru4UGlViBv","taOXKulk41","EdBKcZzJHW","Ss0Zuhi5X7","FPfSE24ARF","UlU3M4QMc9","AOgEeS77LH","Mm8si45cIH","yluBxjeskS","v8yFNru4UG",
+"nnP8owiHrZ","Kr8ysix74r","WDVWJlCMxy","WDVWJfqypy","aDGtS3weIF","O3iyQLbRTH","l83Ud1j5L8","HfyNQhSSvQ","7fKYUm4bxU","uAWypFwEJz",
+"4W0TlcmXIX","uQIcznnP8o","v2eC3Oz8yZ","dQ5869XyT9","VerEAJkzUn","Ul4a11v5hH","MK07YU3yw5","xReecpT8wu","a00b5s93Ml","pFrrlFNYIM",
+"yToGWIRh48","I7p2aNxx9V","rz7UtCIShG","QworulH1kt","lH1ktFGzgp","FLsphY1mC0","ReKEWtlILt","Chuy33otm6","5Mg9rn8pJ9","Yh1hFyToGW",
+"8FmFH7fsYM","0h1b1FjHXR","XflUqZJTXH","AkKTk8TxD7","Mkgy8gIYvE","8RCUAIKxdL","0BmCylXFOB","KsjRKCp3mZ","Ss0ZulsQGo","7hyVvNhXdu",
+"uQIcz7X3uy","WMiS3Cp3mZ","OHaBzRzaZA","dhSuH7fKYU","jS1ajQYxC0","cQOnvzmLYD","LewvMCp3mZ","55rfBI7p2a","FhtglgtCA5","SbRYyQ6Lix",
+"QnJ1Slj07Q","GWqqXGWqqX","L7cGctvdkD","DQimpdhSuH","yofH3yvOMI","CK5W7v1Hln","0YAGHEdBKc","CdyBV5VZjS","cmXIXn8pJ9","iB08lfqypy",
+"CNHmv9eoRc","ni2v1cQOnv","vLsmSdmoS7","NhXduSs0Zu","LDk6fVjCZq","AkKTkxReec","JKWYRCIShG","J2mQiK20wK","YjB9tiKqhr","3otm66q6L9",
+"cShY2uTacx","618DivOqCE","Z4I1v2ZHdk","SjskQ0Wr5y","zQt6QsqVrf","FjHXRI7p2a","OUYuF16lHc","m4bxUThjNn","G1RhS8RCUA","K4GS8he9IA",
+"XflUq7X3uy","S2DfuoVQp6","CxVEfVBjhz","BbwgAi3pyd","0Wr5ySWfou","aFFssrhl0J","sqVrfEdBKc","WreyPSjskQ","F6PT2KASQ8","VjCZq8RCUA",
+"ciuWzuTacx","7lUXZcShY2","ThjNn5VZjS","Yw2oUmX2GE","FcWrW5Namm","n1pmOgIYvE","uQIcztvdkD","O3iyQS2Dfu","FPfSESjskQ","lkMUAQYxC0",
+"TXQ0ZcShY2","14FLRXflUq","HP433No0Qb","d85a9Gv3Fq","DLhzMsoy9t","ThjNnGSQwj","tl72Ws93Ml","QnJ1SgtCA5","AOgEeVerEA","HP433IjTwP",
+"XflUqkZANm","RpBQm7Ow5C","qUJMdhE1Ql","MmKGJZv7z0","dhSuHK4GS8","5drc6hSSvQ","mz8gxsx5Gl","uupzknFqik","G1RhSdpe1v","QssNCdjsrv",
+"2hEEUEoToP","Kr8ysIBe8k","jfREu5ZaEz","0h1b14dEz6","CIShGUl4a1","No0QbZUnqt","WMiS3oVQp6","QYxC0fcwDa","mz8gxuvf7A","hi5X7jtn0X",
+"s93MlblLA9","AOgEe8TxD7","Yf2EcgtCA5","45cIHtlILt","JIqXigIYvE","7fKYUpv0i7","XyPZNNcICA","yvOMIIBe8k","LDk6fHfyNQ","5Mg9riB08l",
+"Y1mC0Kr8ys","Qworus4786","Dz1R3bgJAz","pv0i7VerEA","ZUnqtJkzUn","Mm8silkMUA","atef2M3zXL","FGzgpi7WMQ","MojnPLDk6f","lm0pDnnP8o",
+"he9IAnFqik","oGu6xQworu","dQ586cL0aE","SmGzvP6bcg","lj07QUmaEv","suY4x3otm6","Q6hMCsoy9t","lXFOBhYBCK","nFqikaDGtS","CNHmvG1RhS",
+"CxVEfIn3NS","zmLYDZ4I1v","JRJQBcShY2","uPX7GVprf2","fLNg8RsQUq","guMb8zHF1q","Q6LixFcWrW","VLTy6oGu6x","No0QbsqVrf","ulk41Cp3mZ",
+"cQOnvEdBKc","ReKEWIRh48","BCxeCDz1R3","Nxx9VhYBCK","iwzGkBpYhV","GWqqXHfyNQ","WmadA0ao3l","yluBxChuy3","7lUXZl83Ud","Rxrsmfqypy",
+"gf8rIdjsrv","vOqCEs7Mxk","MezSW8U2nU","MaJQsni2v1","lm0pDtvdkD","qUJMdlpF6W","StlDJB3qem","9y4lwCqqaD","pWiOslCMxy","h1zcHAIYUu",
+"pAhR1TXQ0Z","djsrvCfgr3","uupzkJkzUn","K4GS8Gv3Fq","soy9tjtn0X","KsjRKe6e4z","WDVWJdhSuH","W3VFHGXdoH","qUJMd0Wr5y","e6e4zYjB9t",
+"1j5L8ogLgc","HzZT8tAOsr","55rfBZ4I1v","hi5X70Wr5y","cmXIXguMb8","ZuDtDBbwgA","JRJQB16lHc","YjB9t3weIF","5Drn0pT8wu","2hEEUxciqp",
+"FcWrWe6e4z","QssNCpmeCd","Waim6s93Ml","vLsmS5nmWv","lH1kt9eoRc","iqv4kK20wK","G1RhS9y4lw","GSQwjxXTI4","OHaBzFxX9q","fcJOy55rfB",
+"NhXduDLhzM","TwanoRkQke","hE1QlSbRYy","WreyP0Kyfs","29QAznnP8o","S77LHDQimp","Ta8f6kB5nP","Qworu580YD","O3iyQ4dEz6","BbwgAJJs5m",
+"FFDui2hEEU","t59lR1v5hH","MGlTFWDVWJ","0MR5Xv8yFN","G1RhSSjskQ","gjUTuS2Dfu","KASQ8jfREu","gjUTuRkQke","NAFuw7Ow5C","HlUbF5ZaEz",
+"dhSuHd85a9","7fKYUyToGW","MaJQslH1kt","K4GS8oGu6x","prNT6qaofN","zqH0Ws7Mxk","0Wr5yMkgy8","x3LDeAkKTk","ulk41GrDg7","lCMxyo8Uyd",
+"b29RJJXljW","FPfSE0BmCy","mX2GEnlaBy","0BmCyYw2oU","WDVWJBCxeC","d7vjMMmKGJ","LDk6fRpBQm","uQIcz0Kyfs","kZANmiwzGk","S77LHFwEJz",
+"jzUqRv2eC3","lH1ktyvOMI","XyPZNHP433","ZhwG1zQt6Q","uAWypDQimp","blLA9zbIYY","OUYuFKZamH","SmGzvtuDyS","m4bxUJkzUn","atef2vkCHH",
+"tlILtfLNg8","t98iWwDajX","VIlwPVprf2","he9IAjtn0X","CqqaDcShY2","ulk41zbIYY","YjB9tjiVBP","zHF1q8FmFH","4dEz6MK07Y","n8pJ9qUJMd",
+"GWqqXYh1hF","7fsYMSs0Zu","uoStwoGu6x","n8pJ9rKDLJ","Mm8siOHaBz","GWqqXfLNg8","D6rByFLsph","bgJAzhSSvQ","FnPFB8FmFH","DLhzMciuWz",
+"8TxD7zqH0W","rhl0JL7cGc","uAWyps7Mxk","EoToPRsQUq","y94nw5VZjS","m4bxUMkgy8","Yh1hFzqH0W","tuDySqaofN","ZUnqtZ4I1v","48cHLKZamH",
+"d7vjMStlDJ","VerEACK5W7","lj07QdQ586","KsjRKsoy9t","fcJOyTCgPp","RzaZAMGlTF","uupzkPYBf4","DLhzMazIWp","VNCPdMmKGJ","ReKEWfmIK1",
+"AOgEelsQGo","prNT6blLA9","jS1ajStlDJ","TCgPp1LB1L","tuDySHP433","HlUbFaFFss","bgJAzYOfrY","i3pydguMb8","hYBCKZv7z0","sqVrfFFDui",
+"lj07Qn8pJ9","mX2GEtlILt","oQ87rbgJAz","3weIFjiVBP","kZANmkB5nP","RxrsmvLsmS","k85AetvdkD","d7vjMQbxXc","azIWpOUqFM","WmadAgIYvE",
+"5ZaEzWaim6","Rxrsmi7WMQ","NhXdufFDrJ","prNT6Qworu","Vprf2QClRL","pT8wunFqik","ru4UGYjB9t","24ARF24ARF","Q6hMC2TRI7","jSjS3cL0aE",
+"Cfgr3s7Mxk","uN6r3uPX7G","TCgPpBpYhV","Waim6uZPqg","tuDySb29RJ","QClRLfcwDa","zQt6QM6qcG","zz4ZUGrDg7","zmLYDVNCPd","1LB1LGXdoH",
+"7fsYMtjQxs","zqH0WU3yw5","gjUTurKDLJ","pvgjSVLTy6","pFrrlL7cGc","0KyfsiKqhr","MezSWksJby","ZzJHWIBe8k","wiHrZfLNg8","QWxoTMK07Y",
+"pWiOsUvlv4","zbIYYVprf2","pFrrlRpBQm","JJs5m2ZHdk","8cVD3CdyBV","RpBQms7Mxk","UlU3M3otm6","0h1b1mz8gx","ogLgccL0aE","TXQ0ZuTacx",
+"ni2v1zqH0W","s4786e6e4z","45cIHOxWIH","5iGN58TxD7","OUqFMZuDtD","5NammlCMxy","ZJTXH5Namm","aez9yFcWrW","RBhp0uZPqg","ciuWzWreyP",
+"yToGWTa8f6","zQt6QSjskQ","pWiOstjQxs","QnJ1SVLTy6","Yh1hFCIShG","lXFOB29QAz","Y1mC0uoStw","8hJdtWDVWJ","FnPFBPb1pa","JIqXigf8rI",
+"4QMc9ZUnqt","OUqFMThjNn","QbxXcQnJ1S","G1RhSUl4a1","xReecOUYuF","W3VFHRACuj","Nxx9VPYBf4","In3NSnnP8o","AgJHQfcwDa","TXQ0ZkB5nP",
+"jeskSn8pJ9","FNYIMzqH0W","K4GS8In3NS","JkzUnY1mC0","yluBxprNT6","W7cTsm4bxU","LewvM0PktI","lj07QQWxoT","KZamHuLtKs","s4786XflUq",
+"MGlTFguMb8","Uvlv4BGaQY","8cVD3piJSk","zmLYDOHaBz","9GXkXFnPFB","prNT6S2Dfu","zY1GYQYxC0","FPfSE2DREs","7lUXZW3VFH","1j5L8lpF6W",
+"d85a9lH1kt","RzaZAhE1Ql","Q6Lix64s8N","Rxrsmdjsrv","tAOsrpFrrl","jzUqR0BmCy","guMb8NcICA","BGaQYHlUbF","uQIczOz8yZ","uJScXtjQxs",
+"FGzgpfaHir","vkCHHX6Pin","piJSk4dEz6","ZUnqt8cVD3","55rfBK4GS8","dhSuHiB08l","NcICAciuWz","YjB9tStlDJ","tAOsr3weIF","SbRYylXFOB",
+"ydG8UMGlTF","mz8gxlkMUA","SjskQjS1aj","gf8rImz8gx","s93MlFVMxo","No0QbCNHmv","QChxs5Drn0","2NslmWaim6","qQxHPM6qcG","8xEKzG1RhS",
+"K4GS8iKqhr","he9IA8U2nU","he9IA3weIF","2TRI7In3NS","cL0aE7lUXZ","0h1b1iqv4k","IBe8kQ6Lix","i3pydcQOnv","FPfSEcShY2","8U2nUMK07Y",
+"K4GS8fFDrJ","faHirVIlwP","he9IAtaOXK","3otm6HlUbF","lsQGoprNT6","cL0aEmX2GE","piJSks4786","QbxXcNhXdu","VjCZqaFFss","i3pydi7WMQ",
+"OxWIH9XyT9","bZLvScQOnv","FnPFBIKxdL","uPX7GzbIYY","m4bxUZhwG1","qQxHPMmKGJ","hSSvQ5IhmG","gtCA5uN6r3","Chuy3Gv3Fq","yToGWjS1aj",
+"OUqFMtuDyS","LbRTHBCxeC","gf8rIs93Ml","taOXKRACuj","DLhzMIn3NS","FxX9qQbxXc","BbwgAFGzgp","vkCHHQ6hMC","NOHszQWxoT","vOqCEzz4ZU",
+"Dz1R3LewvM","aDGtSd7vjM","QworuAkKTk","zY1GYv1Hln","iwzGkXyPZN","NOHsz0Kyfs","7hyVvS77LH","Gv3FquoStw","zY1GYVBjhz","zFgtBD6rBy",
+"pT8wuKr8ys","lweGyiqv4k","ZhwG1pmeCd","n8pJ9lkMUA","OxWIHJXljW","fcwDa9iGoT","ZhwG1P6bcg","s7MxkMkgy8","9y4lwMaJQs","rhl0JtvdkD",
+"Cfgr364s8N","2ZHdkzFgtB","8xEKzZJTXH","lXFOBGWqqX","7fsYMuJScX","WreyPgjUTu","Q6hMCCdyBV","s4786d7vjM","YOfrYrhl0J","G1RhSxXTI4",
+"vOqCEnnP8o","suY4x3weIF","Yw2oUS2Dfu","uPX7GReKEW","FnPFBPOUYS","a00b5OUYuF","0PktIRkQke","S77LHTa8f6","jiVBP48cHL","nnP8oPb1pa",
+"GXdoHBCxeC","AXpwEGv3Fq","7fsYMGWqqX","9GXkXOHaBz","suY4xoGu6x","uoStwaDGtS","RmDcrFGzgp","RkQkeFVMxo","aL6AJThjNn","suY4xD6rBy",
+"gdQsSix74r","xciqp9GXkX","xciqp0BmCy","FGzgpFPfSE","pv0i7suY4x","9iGoTCfgr3","YOfrYhSSvQ","oQ87rm4bxU","KASQ8x3LDe","lweGyyToGW",
+"HfyNQVBjhz","RxrsmlkMUA","7ku1pksJby","RACujaFFss","VBjhzhi5X7","618DiuQIcz","lm0pDgjUTu","Ta8f6iwzGk","4dEz6HfyNQ","yluBxm4bxU",
+"Kr8yshYBCK","SjskQChuy3","Gv3Fql83Ud","8TxD7k85Ae","QWxoTMezSW","JIqXiMojnP","qQxHPMaJQs","AgJHQRmDcr","Cp3mZUlU3M","Oz8yZwDajX",
+"OxWIHiB08l","FxX9qSmGzv","brhlQFFDui","GWqqXHRxd8","pWiOsJJs5m","zQt6QMaJQs","CxVEfiB08l","wiHrZ8RCUA","QnJ1ScL0aE","S2DfuCNHmv",
+"vLsmSxReec","VLTy6mX2GE","Qworu7X3uy","LbRTH6q6L9","QssNCfmIK1","UlU3MwiHrZ","RkQkeSjskQ","7X3uy8FmFH","FLsphoQ87r","W7cTsGv3Fq",
+"Mkgy88cVD3","jfREupT8wu","KZamHVjCZq","jeskSStlDJ","BFkb82DREs","Oz8yZtl72W","JJs5ms7Mxk","pmeCdkZANm","oQ87rgjUTu","jeskSOz8yZ",
+"8hJdtRkQke","aFFsshSSvQ","AgJHQulk41","P6bcgXflUq","QworuDG4sT","5ZaEzEOE1o","JKWYRmX2GE","azIWpPOUYS","pFrrlGWqqX","zmLYDoQ87r",
+"k85AeOxWIH","GrDg7ZzJHW","h1zcHEoToP","iB08lKASQ8","HRxd8v2eC3","JXljWvLsmS","WPmlx45cIH","uAWypMGlTF","uN6r3DLhzM","s93MlAXpwE",
+"n1pmOFjHXR","uN6r3FGzgp","QWxoTQChxs","fFDrJo8Uyd","yToGWCp3mZ","PYBf4QChxs","cShY2v8yFN","nFqik1LB1L","ZuDtDUmaEv","pvgjSVNCPd",
+"GSQwjKr8ys","zY1GYVjCZq","lViBvFGzgp","DG4sTS77LH","I7p2aNhXdu","0ao3ltAOsr","1j5L8Rxrsm","ru4UGs93Ml","B3qemfLNg8","sqVrf7X3uy",
+"i3pydRsQUq","wiHrZzQt6Q","2Yz7Ed85a9","J2mQibZLvS","dQ586CIShG","uJScXv8yFN","Chuy3Yf2Ec","5Drn0Ul4a1","iKqhrv1Hln","QworuHP433",
+"GrDg7iKqhr","cQOnvkB5nP","ulk41Mm8si","XflUqjS1aj","FhtglmX2GE","5ZaEzciuWz","5drc6vOqCE","he9IAuAWyp","ix74rjzUqR","KsjRKZhwG1",
+"KASQ8s93Ml","cmXIXdhSuH","dpe1v3otm6","7lUXZ29QAz","qaofNe6e4z","9rlg9BpYhV","pWiOshSSvQ","24ARFyToGW","Mm8sihSSvQ","jS1ajuAWyp",
+"5ZaEzfcJOy","cShY29GXkX","No0QbOxWIH","qQxHPDcpWB","hE1Ql9eoRc","5drc6Cp3mZ","uupzkuPX7G","8cVD3YOfrY","MaJQsx3LDe","OUqFMY1mC0",
+"rz7UtgdQsS","fcwDaDG4sT","tjQxsSmGzv","KZamHZ4I1v","VerEALbRTH","xReecVerEA","Y1mC0a00b5","e6e4zru4UG","14FLR8FmFH","5drc6HzZT8",
+"lXFOBuQIcz","zFgtBoQ87r","G1RhSAXpwE","v8yFNzQt6Q","9iGoT8hJdt","NcICACdyBV","Ss0Zuh1zcH","ix74rBGaQY","pWiOsJKWYR","FcWrW55rfB",
+"s4786CdyBV","C2IrcaL6AJ","jzUqRpAhR1","Yf2EcDz1R3","KsjRKk85Ae","tlILtOz8yZ","uJScX8U2nU","2TRI7FVMxo","G1RhSbrhlQ","ZUnqtMaJQs",
+"5NammVNCPd","5Drn0jiVBP","AOgEe6q6L9","9rlg97X3uy","fcJOyU3yw5","lkMUAix74r","QClRLTwano","uPX7GyluBx","2hEEUFcWrW","0MR5XjfREu",
+"pT8wuaL6AJ","FLsph7lUXZ","m4bxU7fsYM","ZuDtDSjskQ","RpBQmuAWyp","o8UydEdBKc","CIShGQssNC","In3NSCqqaD","BbwgAI7p2a","55rfBNcICA",
+"FnPFBFFDui","lViBvWDVWJ","AIYUuECMvU","J2mQizmLYD","7hyVvBpYhV","cQOnvtaOXK","iB08lM3zXL","NhXdupmeCd","FLsphm4bxU","W7cTsCNHmv",
+"DQimptaOXK","hi5X7fcwDa","ru4UGBGaQY","fmIK1NAFuw","lViBvQChxs","wiHrZRxrsm","l83Ud9eoRc","k85AeVBjhz","lH1ktTa8f6","VNCPdlCMxy",
+"uTacxReKEW","taOXKkB5nP","AkKTkguMb8","07n1cM6qcG","No0QbLDk6f","16lHcv2eC3","LbRTHs4786","nlaByNo0Qb","AIYUu9eoRc","8U2nUW3VFH",
+"LbRTHuLtKs","AgJHQ7lUXZ","n1pmOoGu6x","zbIYY5Namm","1LB1LDQimp","pFrrlhUTw7","14FLRhSSvQ","IBe8k1j5L8","6q6L9gjUTu","uPX7GjzUqR",
+"55rfBydG8U","soy9t2ZHdk","xciqpzQt6Q","0KyfsRpBQm","hSSvQUmaEv","5Namm0PktI","xXTI4UlU3M","GXdoHvLsmS","6AFT0VLTy6","IRh482DREs",
+"jtn0XjzUqR","7fKYU7fKYU","fcJOylViBv","gIYvEfqypy","TCgPpDLhzM","dQ586POUYS","ciuWzpiJSk","FGzgpYjB9t","FnPFBhYBCK","IRh48Dz1R3",
+"SjskQBCxeC","MmKGJ2ZHdk","iKqhrfLNg8","e6e4z618Di","OHaBzaez9y","kZANmAmdQd","soy9tksJby","jS1ajgIYvE","sqVrfAkKTk","aFFssVNCPd",
+"Gv3FqprNT6","yvOMI1LB1L","5IhmGZhwG1","8U2nUhe9IA","DcpWBJkzUn","Ss0ZuRmDcr","Dz1R3MK07Y","IKxdLjiVBP","brhlQ4W0Tl","J2mQiVjCZq",
+"lH1kt2DREs","aFFssazIWp","In3NSP6bcg","Q6hMCAgJHQ","QYxC0Cfgr3","0PktITCgPp","RkQke2ZHdk","pvgjSuoStw","5ZaEzguMb8","rz7UtVIlwP",
+"QClRL2TRI7","qQxHPL7cGc","lsQGo24ARF","fmIK1QClRL","Yw2oU5Mg9r","iwzGk9y4lw","3otm6brhlQ","0MR5XiB08l","piJSkMkgy8","aez9ylViBv",
+"HzZT8SmGzv","G1RhSWPmlx","Ss0ZuBCxeC","lXFOBmX2GE","14FLRVprf2","v8yFNmX2GE","Ul4a1pvgjS","taOXKpWiOs","5iGN5FVMxo","jiVBPVjCZq",
+"4dEz6ECMvU","VBjhzTCgPp","uJScXRpBQm","nlaByIKxdL","580YDuN6r3","7ku1pgIYvE","RxrsmQnJ1S","cL0aEIBe8k","GrDg72ZHdk","0MR5XP6bcg",
+"POUYSXflUq","XyPZNuJScX","t59lRZzJHW","uAWypM6qcG","FcWrWO3iyQ","aFFssni2v1","n1pmO8hJdt","D6rByNhXdu","nlaByWmadA","fqypyru4UG",
+"1LB1L580YD","AOgEe45cIH","MmKGJ1j5L8","Y1mC0BFkb8","OUqFM618Di","Z4I1v0PktI","kB5nPXyPZN","yofH3aL6AJ","sqVrfyToGW","7fKYUyEfy9",
+"MojnP5Namm","DQimp9XyT9","b29RJ5Namm","qaofNtuDyS","b29RJKr8ys","jeskScQOnv","rhl0JSs0Zu","Oz8yZPOUYS","8hJdtGrDg7","Zv7z0Gv3Fq",
+"EOE1ogdQsS","s4786mz8gx","CdyBVydG8U","7fsYMEOE1o","K20wKlCMxy","0PktIzY1GY","KASQ8fcJOy","FPfSEPb1pa","Cfgr3OxWIH","Mm8si4dEz6",
+"8FmFHru4UG","lViBvSbRYy","P6bcgfqypy","hE1Ql0PktI","0ao3lblLA9","TCgPpUl4a1","k85Aezz4ZU","a00b5tl72W","o8UydS2Dfu","7X3uyHlUbF",
+"CIShGgf8rI","HRxd8ECMvU","s7Mxkdjsrv","M3zXLs93Ml","dhSuHNxx9V","4QMc92TRI7","hYBCKulk41","5Namml83Ud","suY4x45cIH","jfREuY1mC0",
+"yEfy97fsYM","9eoRcFGzgp","zz4ZUMojnP","Nxx9VbgJAz","d7vjMJKWYR","1LB1LgdQsS","U3yw5AgJHQ","mX2GEK20wK","OUqFMlsQGo","DLhzMS2Dfu",
+"yluBxWDVWJ","QChxsMaJQs","dQ586D6rBy","faHirbZLvS","oGu6xtvdkD","wDajX5Mg9r","a00b5Chuy3","BFkb824ARF","jeskSHfyNQ","U3yw5Z4I1v",
+"JJs5mPb1pa","5iGN5Kr8ys","BFkb8s7Mxk","QYxC0YjB9t","0PktIciuWz","MmsIoRxrsm","Yh1hFlH1kt","OHaBzFVMxo","16lHc0h1b1","tAOsrjSjS3",
+"HfyNQzz4ZU","WaWsvxXTI4","wDajXThjNn","Fhtgl0ao3l","AkKTkFxX9q","AOgEeIjTwP","lViBvazIWp","RACujjeskS","GSQwjCNHmv","rhl0JS2Dfu",
+"FGzgpOxWIH","s4786S77LH","xReecQworu","hSSvQix74r","SWfoupAhR1","jeskS9iGoT","Ul4a1CqqaD","YjB9tt98iW","cQOnvSWfou","55rfBNOHsz",
+"cQOnvJRJQB","uAWypW7cTs","Oz8yZNcICA","jzUqRksJby","pAhR1zFgtB","9eoRcUlU3M","No0QbK4GS8","bZLvSix74r","dmoS7Twano","uvf7AGSQwj",
+"KsjRKRmDcr","kB5nP24ARF","x3LDe5iGN5","7Ow5CnFqik","JJs5mNOHsz","IKxdLZJTXH","K4GS8fcJOy","QbxXcfLNg8","he9IAGrDg7","prNT67ku1p",
+"4W0TlzmLYD","IKxdL2hEEU","F6PT2gtCA5","ZzJHWd7vjM","ReKEWsuY4x","2hEEUt59lR","uQIczi3pyd","qaofNtvdkD","zY1GYlsQGo","pvgjSuvf7A",
+"0h1b18cVD3","O3iyQuZPqg","LbRTHdjsrv","0Kyfsix74r","y94nwUvlv4","xReecguMb8","SbRYyjiVBP","zHF1q2DREs","cmXIXOz8yZ","jS1ajAOgEe",
+"M3zXLazIWp","P6bcgJJs5m","WDVWJpT8wu","PYBf4HzZT8","Q6LixDcpWB","Pb1paNxx9V","zz4ZUm4bxU","GrDg7MGlTF","tlILtuvf7A","RkQkeFjHXR",
+"vkCHHEOE1o","Zv7z0jiVBP","ReKEW5nmWv","QWxoTpFrrl","x3LDepv0i7","ru4UGJKWYR","fcJOyDcpWB","FPfSEGXdoH","UlU3Mt59lR","cmXIXZzJHW",
+"uQIczgIYvE","MmKGJjiVBP","GrDg7yvOMI","KASQ8aez9y","WaWsvzQt6Q","Dz1R3GWqqX","wiHrZFVMxo","MK07YWaWsv","JJs5mAXpwE","Cfgr35iGN5",
+"uupzkCfgr3","BGaQYb29RJ","ZUnqtMmsIo","W3VFHaL6AJ","fmIK18cVD3","VBjhzQnJ1S","C2IrcHfyNQ","M3zXLd7vjM","tAOsrQbxXc","JKWYRNOHsz",
+"fqypy0Kyfs","nlaBy2DREs","5ZaEzv8yFN","cmXIXokgRi","VLTy62hEEU","HfyNQJIqXi","n1pmOdmoS7","QnJ1SNcICA","K20wKy94nw","MojnPjS1aj",
+"7X3uyjzUqR","S2Dfupv0i7","0PktIUlU3M","7X3uyh1zcH","IKxdL2Yz7E","n1pmOtjQxs","NhXduprNT6","RkQke7X3uy","d85a9In3NS","M6qcGFxX9q",
+"LbRTHMojnP","BbwgAzFgtB","8U2nUatef2","ciuWz8xEKz","7fsYMjS1aj","TXQ0ZOz8yZ","Pb1pa8RCUA","9rlg97ku1p","rhl0JblLA9","l83UdAOgEe",
+"K4GS8dpe1v","CK5W7qaofN","07n1cJIqXi","5drc6ix74r","ix74rF6PT2","HfyNQpvgjS","t98iWWmadA","MK07YqQxHP","RzaZARkQke","Zv7z0uJScX",
+"pAhR1v2eC3","8hJdtl83Ud","YjB9tMkgy8","sx5GlJKWYR","HRxd8pv0i7","fmIK1U3yw5","jfREuFPfSE","QYxC01LB1L","4QMc9iKqhr","hE1QltaOXK",
+"vLsmSHlUbF","mX2GEbZLvS","yToGWuZPqg","55rfB64s8N","6q6L98hJdt","Fhtglhi5X7","lH1kttuDyS","VBjhzDz1R3","VLTy6SWfou","gjUTuWmadA",
+"9eoRcOHaBz","yvOMIRmDcr","D6rByHfyNQ","ksJbyFcWrW","0ao3l8TxD7","8U2nUsoy9t","5drc6ni2v1","zFgtBo8Uyd","tAOsr8TxD7","d85a9i7WMQ",
+"GXdoHMmsIo","8TxD78RCUA","BFkb8dhSuH","W7cTsGXdoH","brhlQCp3mZ","FxX9qk85Ae","TwanoZhwG1","ix74rNAFuw","U3yw5kZANm","okgRi1LB1L",
+"dQ586JIqXi","jeskSIKxdL","lpF6WW7cTs","gjUTuGWqqX","Oz8yZHfyNQ","lsQGoBbwgA","zQt6QIn3NS","ZuDtDtl72W","IjTwPwiHrZ","EOE1ovLsmS",
+"K20wKLDk6f","07n1cy94nw","jfREuFnPFB","gtCA5VBjhz","HRxd8SWfou","hYBCKv2eC3","cL0aEOHaBz","IjTwPRsQUq","lH1ktSWfou","n1pmOMkgy8",
+"QYxC0sqVrf","ECMvUQ6Lix","azIWpQworu","nFqikTwano","h1zcHcL0aE","Q6hMCWaim6","ix74rZ4I1v","kZANmIBe8k","BFkb83weIF","pmeCdYjB9t",
+"FcWrWQWxoT","pv0i7pmeCd","5nmWvQYxC0","O3iyQ1v5hH","7hyVva00b5","Yh1hFdpe1v","2Yz7EW3VFH","9GXkXCdyBV","C2IrcQnJ1S","uPX7GZ4I1v",
+"HRxd8XyPZN","yofH32Nslm","NhXduJRJQB","RpBQmxReec","5Mg9rzFgtB","9iGoTJRJQB","07n1cfcwDa","QworuFxX9q","B3qemk85Ae","5iGN5HRxd8",
+"m4bxUFjHXR","DG4sT5nmWv","t98iWFxX9q","wiHrZatef2","ZJTXHJRJQB","G1RhSl83Ud","8hJdtAOgEe","Cfgr329QAz","07n1cCp3mZ","hUTw7n8pJ9",
+"oGu6xfmIK1","pmeCdIKxdL","qQxHPsoy9t","SbRYy5nmWv","OUqFM3weIF","SjskQoQ87r","4dEz6XyPZN","VIlwPQChxs","8U2nUW7cTs","J2mQijzUqR",
+"rKDLJRACuj","VNCPdCK5W7","uPX7GBCxeC","5NammFLsph","QYxC0n1pmO","HRxd8AIYUu","QYxC029QAz","aDGtSiKqhr","lj07Qi7WMQ","C2IrcCfgr3",
+"jzUqRC2Irc","s93MlbZLvS","fFDrJAIYUu","7X3uyFFDui","d85a9FNYIM","oQ87rDG4sT","7hyVvyEfy9","FxX9qnnP8o","vkCHH8U2nU","FNYIMECMvU",
+"ZUnqtZuDtD","QnJ1S2DREs","m4bxUuvf7A","8hJdtSs0Zu","VLTy6PYBf4","t59lREoToP","atef2cL0aE","Dz1R3dQ586","lViBvjzUqR","Mm8siGXdoH",
+"ksJbyQ6hMC","sx5GlcShY2","ni2v18TxD7","s93Mlv2eC3","ReKEWlm0pD","NhXduBbwgA","lj07QwiHrZ","cL0aEZv7z0","MmsIo2DREs","rKDLJlj07Q",
+"rhl0JAIYUu","FhtglFLsph","guMb8RsQUq","Ss0ZuaFFss","NOHszCK5W7","NcICAGSQwj","b29RJCxVEf","ZJTXHGWqqX","FPfSEaez9y","v8yFNWreyP",
+"Pb1paKZamH","FLsphhYBCK","rKDLJuAWyp","BpYhViKqhr","5VZjSsuY4x","VLTy6F6PT2","KZamHuvf7A","prNT6CIShG","v2eC3dmoS7","9y4lwNhXdu",
+"5Mg9rjtn0X","AXpwEprNT6","uupzkQClRL","cmXIXk85Ae","zFgtBUl4a1","ru4UGwiHrZ","S77LHWmadA","OxWIHWaWsv","yToGWpT8wu","OUqFMVLTy6",
+"jfREuyluBx","taOXKfqypy","tjQxsFcWrW","FGzgpWmadA","qUJMd64s8N","NOHszThjNn","rz7UtZzJHW","2hEEUuvf7A","7lUXZ7hyVv","v2eC3GrDg7",
+"FGzgpksJby","hE1Ql5Mg9r","mX2GEP6bcg","BCxeCydG8U","ix74rGrDg7","9eoRc9GXkX","Z4I1vIKxdL","UlU3MSjskQ","k85Aeuupzk","0PktIgdQsS",
+"FPfSEhSSvQ","gjUTulpF6W","GXdoHuupzk","WreyPazIWp","y94nw48cHL","D6rByAgJHQ","bZLvSHRxd8","hSSvQni2v1","NOHszHzZT8","AkKTkBCxeC",
+"2DREsPb1pa","6q6L964s8N","IKxdL7X3uy","lH1ktn8pJ9","lXFOBTa8f6","ciuWzyEfy9","5IhmGMezSW","FPfSEJkzUn","CIShGjSjS3","BbwgAyvOMI",
+"zY1GYh1zcH","qaofNFPfSE","iKqhrgf8rI","lH1kt7Ow5C","taOXKSmGzv","O3iyQCfgr3","Y1mC09iGoT","MmsIopv0i7","gf8rIRACuj","aez9y2DREs",
+"jeskSGSQwj","F6PT2RkQke","azIWpW3VFH","nFqikYf2Ec","FFDui8hJdt","ReKEWQnJ1S","YjB9t9eoRc","5ZaEzVLTy6","AkKTkHlUbF","oQ87rzmLYD",
+"FVMxoReKEW","BFkb8dpe1v","8FmFH14FLR","WPmlxpiJSk","618DiJJs5m","WPmlxZ4I1v","v8yFNZJTXH","dhSuHMkgy8","Cp3mZa00b5","BbwgApvgjS",
+"8cVD3MaJQs","mX2GEW3VFH","DLhzMuQIcz","s93MlTXQ0Z","o8UydcShY2","W3VFHD6rBy","RzaZAlkMUA","pT8wuMkgy8","AIYUuF6PT2","IjTwPd7vjM",
+"4W0TlFPfSE","JJs5mDQimp","Zv7z0wDajX","UlU3MJ2mQi","taOXKChuy3","tvdkDd7vjM","RkQkeB3qem","ix74rl83Ud","RkQkeJIqXi","ZJTXHUvlv4",
+"JRJQBCp3mZ","CxVEf1j5L8","jSjS3jS1aj","GWqqX1j5L8","Q6LixWMiS3","d7vjMIKxdL","mz8gxDLhzM","i7WMQS2Dfu","FhtgllpF6W","7hyVvfcwDa",
+"VIlwPAgJHQ","BbwgAazIWp","s7MxkCIShG","jzUqRF6PT2","64s8NMm8si","uvf7AcQOnv","IRh48AkKTk","LewvM5nmWv","tuDySyToGW","HfyNQuAWyp",
+"Cp3mZtAOsr","jSjS3hE1Ql","RkQke0YAGH","dpe1vuN6r3","lsQGohUTw7","Q6LixuN6r3","v1HlnFnPFB","UmaEvlsQGo","8xEKzpFrrl","PYBf47fKYU",
+"64s8NlViBv","K20wKAmdQd","BpYhVI7p2a","dmoS77fsYM","SbRYy0Kyfs","JIqXiru4UG","MaJQsGXdoH","dhSuHqQxHP","I7p2aQ6hMC","uAWypCfgr3",
+"IBe8krz7Ut","5nmWvGSQwj","x3LDeYh1hF","ksJbyQWxoT","FGzgpYw2oU","Uvlv49rlg9","cShY2CqqaD","5iGN5Mkgy8","CNHmvMm8si","jzUqR3weIF",
+"JKWYRvkCHH","dhSuHuLtKs","RmDcrCNHmv","oVQp6AmdQd","FFDuiTCgPp","Chuy3U3yw5","AkKTkWaim6","gIYvEzY1GY","BGaQYv8yFN","1LB1Lsoy9t",
+"uvf7AAkKTk","K20wKlXFOB","fqypyn8pJ9","JRJQBMmsIo","ulk41hUTw7","jS1ajuTacx","5Drn0Mkgy8","1v5hHIjTwP","6q6L9X6Pin","iqv4kQWxoT",
+"prNT68U2nU","faHirfFDrJ","dhSuHHfyNQ","5IhmGLewvM","GSQwjNo0Qb","X6PinfaHir","XyPZNs4786","iwzGkJJs5m","CqqaDEdBKc","NAFuwdhSuH",
+"W3VFHVjCZq","D6rByCNHmv","cL0aEkB5nP","IBe8ktlILt","2Yz7EF6PT2","euZA5FFDui","MaJQstaOXK","MGlTFVprf2","zY1GY2Yz7E","IRh48d7vjM",
+"iKqhrdjsrv","FwEJzv8yFN","b29RJrKDLJ","uTacxAmdQd","XyPZNOUYuF","DLhzML7cGc","uupzkqUJMd","FwEJzS2Dfu","mX2GEqUJMd","FLsphxXTI4",
+"jzUqRfmIK1","Z4I1vaL6AJ","WMiS3WaWsv","DcpWBuupzk","uTacxFVMxo","POUYS8xEKz","AmdQd07n1c","HzZT8K4GS8","Q6hMCrKDLJ","5iGN5a00b5",
+"MaJQswDajX","W7cTstvdkD","5Mg9rIBe8k","uoStwlm0pD","fLNg8lm0pD","ydG8UaL6AJ","sx5GlvOqCE","zmLYD8TxD7","lH1ktatef2","oQ87razIWp",
+"b29RJFFDui","QssNCQYxC0","xXTI4OHaBz","16lHchE1Ql","TXQ0ZGWqqX","jeskSYh1hF","ksJbyhe9IA","64s8NhE1Ql","Kr8ysb29RJ","uupzkECMvU",
+"Q6hMCZv7z0","gjUTupT8wu","d7vjMFnPFB","Oz8yZCK5W7","2DREs4QMc9","Yh1hFAXpwE","RkQkeyluBx","gf8rIm4bxU","LDk6f7fsYM","QYxC08xEKz",
+"Y1mC0aDGtS","IjTwPdQ586","jzUqRDLhzM","VBjhz45cIH","AXpwECNHmv","Twano4dEz6","SWfoul83Ud","QbxXcECMvU","9XyT9gjUTu","5VZjSzY1GY",
+"QClRLhi5X7","AgJHQa00b5","BpYhVtAOsr","prNT6n1pmO","x3LDeulk41","VNCPdXyPZN","VBjhzReKEW","StlDJStlDJ","MezSWZJTXH","5NammOUYuF",
+"Ul4a10Kyfs","Nxx9VwDajX","uvf7Arz7Ut","JRJQBgf8rI","bgJAzCfgr3","618DiBGaQY","zHF1qXyPZN","lsQGorz7Ut","FVMxolCMxy","0PktIb29RJ",
+"jfREubgJAz","1j5L8GXdoH","zmLYDBFkb8","d7vjM16lHc","C2IrcmX2GE","sqVrfTa8f6","16lHc5ZaEz","Y1mC0vLsmS","zqH0WY1mC0","B3qemGSQwj",
+"TwanolXFOB","uAWypvOqCE","ydG8UuZPqg","WmadA8FmFH","7Ow5Clm0pD","5IhmGaez9y","CNHmv9iGoT","yluBxeuZA5","euZA5sx5Gl","C2IrcZJTXH",
+"blLA9TCgPp","ciuWzPOUYS","qQxHPRACuj","No0QbWreyP","0PktIKsjRK","QWxoTFhtgl","NAFuwW7cTs","iKqhrpiJSk","AgJHQzHF1q","taOXKMmKGJ",
+"pAhR1QYxC0","POUYS9GXkX","C2IrcRmDcr","MezSWuLtKs","MojnPJIqXi","e6e4zVerEA","n1pmOh1zcH","Waim6hUTw7","ThjNnFwEJz","X6PinhSSvQ",
+"yEfy9CK5W7","IjTwPIKxdL","Zv7z0OUYuF","FjHXRkB5nP","KASQ8lH1kt","fmIK1RzaZA","StlDJBpYhV","lweGyyofH3","5drc6uQIcz","RxrsmsuY4x",
+"xXTI45Namm","nlaBy7Ow5C","FnPFBUl4a1","BFkb8zY1GY","2TRI7MezSW","RACuji3pyd","n1pmOYw2oU","KASQ8tl72W","qaofN7fKYU","uQIczt59lR",
+"9rlg95drc6","GrDg7vLsmS","mX2GE3otm6","BFkb8ix74r","oVQp6VBjhz","P6bcgP6bcg","Yf2Ec4QMc9","OUYuFzbIYY","S2DfuC2Irc","pAhR1GXdoH",
+"rhl0JyluBx","Mkgy82TRI7","s93Mls7Mxk","MK07Y9eoRc","ni2v1AmdQd","iB08lgjUTu","RzaZAoQ87r","D6rByB3qem","ydG8U0MR5X","jfREuhSSvQ",
+"RBhp0v1Hln","BbwgAjS1aj","h1zcHOxWIH","uAWypWaWsv","FNYIMn8pJ9","GWqqXs93Ml","1LB1LzHF1q","9XyT94W0Tl","fmIK1vkCHH","SjskQVerEA",
+"fcwDaQClRL","DLhzMnnP8o","lCMxyPb1pa","6q6L9L7cGc","aez9yjS1aj","16lHcjtn0X","8hJdte6e4z","SmGzvuLtKs","m4bxUZJTXH","s7MxkYOfrY",
+"uTacxXflUq","K20wKSmGzv","O3iyQMmKGJ","0Wr5yMmsIo","VIlwPYjB9t","suY4xulk41","FjHXRAmdQd","yluBxFVMxo","HlUbFDcpWB","GSQwj4W0Tl",
+"uZPqgyEfy9","uvf7AfFDrJ","14FLRM6qcG","FcWrWx3LDe","CK5W729QAz","Mm8siQ6hMC","Oz8yZ4dEz6","lkMUAAXpwE","9XyT9Cp3mZ","5VZjSNOHsz",
+"gdQsSbZLvS","No0Qb7lUXZ","brhlQciuWz","Yf2EcdmoS7","taOXK48cHL","M6qcGtAOsr","ydG8UdQ586","F6PT2Twano","gdQsSzFgtB","bZLvSCIShG",
+"FxX9qS77LH","okgRitl72W","EdBKcMmKGJ","Q6hMCi7WMQ","XyPZNAkKTk","POUYSQbxXc","5nmWvi7WMQ","4W0TlqaofN","IKxdLRACuj","LDk6fLewvM",
+"S2Dfudpe1v","iqv4kVNCPd","6AFT0HRxd8","fLNg8ciuWz","gdQsShE1Ql","KZamHGv3Fq","7Ow5CG1RhS","618DiokgRi","YjB9tHP433","FjHXRoQ87r",
+"0BmCy07n1c","ThjNnfcJOy","KASQ8hYBCK","Ss0ZuJRJQB","oGu6x7lUXZ","QworuChuy3","X6PinTwano","BFkb8MojnP","pT8wudmoS7","O3iyQIjTwP",
+"qQxHPPb1pa","CqqaDWPmlx","AgJHQ7Ow5C","h1zcH7ku1p","618DicmXIX","lweGy8FmFH","ZzJHWzqH0W","lj07QDcpWB","guMb8Vprf2","BCxeC1v5hH",
+"v8yFNtlILt","jfREuru4UG","Mkgy8ZzJHW","lViBvblLA9","F6PT2dmoS7","No0QbAkKTk","5VZjSuoStw","Chuy3EdBKc","hSSvQlkMUA","i3pydCqqaD",
+"zz4ZUlCMxy","lViBvGSQwj","uLtKs2Nslm","6AFT0BGaQY","gjUTuRpBQm","fcwDaDQimp","lsQGoAmdQd","iKqhrx3LDe","hE1Ql0h1b1","qaofNulk41",
+"MezSWG1RhS","s7MxkQworu","vkCHHi3pyd","wiHrZQChxs","jeskS0BmCy","aDGtS9iGoT","P6bcgcShY2","qQxHPy94nw","pmeCdyToGW","SWfoueuZA5",
+"BCxeCOHaBz","qQxHPcmXIX","CK5W7GrDg7","7lUXZAOgEe","WaWsvaFFss","ix74rZJTXH","TCgPpy94nw","fFDrJK4GS8","4W0TlDG4sT","hE1QlfLNg8",
+"RkQkewDajX","okgRiyvOMI","CK5W72Yz7E","2NslmjiVBP","uAWyptvdkD","PYBf4S2Dfu","Ta8f6pWiOs","Twano0YAGH","Yh1hFFFDui","29QAzStlDJ",
+"8RCUAFwEJz","gjUTuHzZT8","RzaZAsoy9t","5VZjSCxVEf","cQOnv7fKYU","DcpWB8cVD3","blLA916lHc","C2IrcNcICA","YjB9tBFkb8","lpF6WfmIK1",
+"x3LDezqH0W","F6PT2zmLYD","hSSvQfqypy","14FLRWPmlx","tuDySWMiS3","9XyT96AFT0","AOgEeOUYuF","4W0TlSmGzv","MezSWhYBCK","o8UydKr8ys",
+"QClRL7fKYU","MojnPOxWIH","vkCHHZuDtD","s7Mxki7WMQ","AXpwETXQ0Z","fmIK1xciqp","5IhmGs4786","45cIHqaofN","5ZaEzBGaQY","45cIH5ZaEz",
+"l83UdyToGW","Ul4a1W7cTs","580YDJ2mQi","Yf2Ecix74r","0KyfsUl4a1","OHaBzDz1R3","ogLgclCMxy","VNCPd0Kyfs","JKWYRMK07Y","IBe8kIRh48",
+"Yh1hFY1mC0","2TRI7dQ586","KsjRKZv7z0","oQ87rQClRL","8cVD3uQIcz","jtn0X45cIH","5nmWvlweGy","S2DfuYh1hF","EOE1oZ4I1v","zQt6QBFkb8",
+"WmadAFcWrW","m4bxU0Kyfs","zqH0W9GXkX","zFgtB0h1b1","iqv4kIn3NS","1LB1L9rlg9","jSjS3MojnP","QWxoTBCxeC","14FLR0Kyfs","wDajX5drc6",
+"HfyNQru4UG","cShY20MR5X","IRh48pT8wu","atef2Q6Lix","n1pmOO3iyQ","gtCA5FLsph","x3LDelpF6W","jS1ajKZamH","hSSvQFPfSE","P6bcgHP433",
+"k85Ae5Drn0","pAhR1brhlQ","pWiOslweGy","14FLRfaHir","EoToPaFFss","IRh48dpe1v","GXdoH0Wr5y","G1RhSy94nw","NOHszDcpWB","7fKYU8hJdt",
+"8FmFHfmIK1","0ao3llj07Q","07n1cfaHir","qaofNsuY4x","FLsph0MR5X","prNT6djsrv","WreyP2ZHdk","FPfSERsQUq","cL0aE45cIH","kB5nPF6PT2",
+"HP433WreyP","SbRYyZhwG1","fFDrJa00b5","GXdoHd85a9","ECMvUpWiOs","9iGoTCqqaD","RBhp0C2Irc","aFFssK4GS8","tlILtRzaZA","3otm6FLsph",
+"ZUnqtpiJSk","NOHszCNHmv","VjCZqbZLvS","zqH0WMmsIo","SbRYy0YAGH","AXpwEW7cTs","29QAzsqVrf","9GXkXuupzk","n1pmOSmGzv","ciuWzdhSuH",
+"yEfy9W3VFH","tAOsrVjCZq","S2DfuogLgc","uoStwcL0aE","3otm6WMiS3","2Nslm0MR5X","7Ow5CfmIK1","t98iWHP433","UmaEvOHaBz","16lHcWMiS3",
+"jS1aj5nmWv","xciqpdQ586","NOHszcL0aE","8cVD3I7p2a","uPX7GgjUTu","9eoRcG1RhS","7X3uyfcJOy","n8pJ9v8yFN","taOXKxciqp","rKDLJZUnqt",
+"0YAGHpiJSk","VLTy6FnPFB","1LB1Ls7Mxk","e6e4zjSjS3","VjCZqBbwgA","SWfouuupzk","GSQwjZJTXH","1j5L8DcpWB","guMb8gtCA5","SmGzvG1RhS",
+"VIlwPyvOMI","prNT6RkQke","PYBf47lUXZ","SjskQprNT6","cmXIXJkzUn","yToGW4dEz6","uZPqgZzJHW","FLsphkZANm","s4786oGu6x","580YDxciqp",
+"ni2v1JIqXi","580YDzFgtB","CK5W7ZhwG1","ix74rAXpwE","suY4xzz4ZU","lj07QJ2mQi","x3LDeyluBx","Zv7z0djsrv","2Yz7E7fsYM","gf8rIUl4a1",
+"Twano2hEEU","StlDJtl72W","9y4lwFcWrW","TwanooQ87r","FGzgpJRJQB","HzZT8hE1Ql","OxWIHRsQUq","uJScX6q6L9","QbxXc5Mg9r","brhlQ2ZHdk",
+"8U2nUnlaBy","Yf2EcUmaEv","kZANmW7cTs","OUYuFQWxoT","QssNCFcWrW","b29RJmz8gx","JkzUnlj07Q","0PktIJIqXi","F6PT2piJSk","5drc616lHc",
+"oQ87rsx5Gl","IBe8kLDk6f","taOXKjeskS","StlDJMezSW","Cp3mZWaim6","5iGN5cQOnv","IKxdLblLA9","aFFssyluBx","RACujyofH3","SbRYyAIYUu",
+"7ku1pcQOnv","RkQke4QMc9","8TxD7uupzk","7fsYM4W0Tl","lkMUAGrDg7","QClRLDcpWB","FGzgpTCgPp","yEfy9EOE1o","Uvlv4Waim6","CdyBVNOHsz",
+"45cIH8xEKz","uQIczfmIK1","JIqXiFNYIM","KsjRKNxx9V","DLhzMDLhzM","1v5hHKASQ8","0PktIlsQGo","LDk6fiwzGk","D6rByhE1Ql","MK07YjSjS3",
+"OUqFMuZPqg","K4GS8AkKTk","s7MxkpFrrl","RpBQmdpe1v","lweGyYOfrY","VLTy6euZA5","JXljWhe9IA","0PktIprNT6","uJScXUl4a1","blLA9mX2GE",
+"RBhp0IBe8k","aL6AJyluBx","FxX9qRACuj","wiHrZzqH0W","NhXduGSQwj","FnPFBoGu6x","pFrrlW7cTs","NAFuwfcJOy","zbIYYGv3Fq","Cp3mZzmLYD",
+"qUJMdpT8wu","tuDySyvOMI","pT8wuhSSvQ","aDGtSrKDLJ","B3qem2Nslm","UmaEvZzJHW","I7p2aGv3Fq","jeskSnlaBy","2TRI7DLhzM","atef2jSjS3",
+"t59lRVIlwP","7lUXZpT8wu","okgRi5drc6","VNCPddQ586","F6PT2lj07Q","G1RhSs93Ml","jfREupv0i7","y94nwPOUYS","AOgEenlaBy","2hEEUMK07Y",
+"UlU3M1LB1L","dQ586vkCHH","Cfgr39rlg9","BFkb8t59lR","zY1GYn1pmO","v1HlnVBjhz","TXQ0ZlCMxy","0YAGHFxX9q","QnJ1SJRJQB","7lUXZHfyNQ",
+"Yh1hFvkCHH","bgJAzWaim6","i3pyddpe1v","uupzkJKWYR","hE1QlzbIYY","piJSkNhXdu","0ao3lkZANm","Yw2oUFGzgp","JKWYR29QAz","bZLvSBpYhV",
+"5IhmGjiVBP","5ZaEzuQIcz","5Mg9rFwEJz","dmoS7KASQ8","Cp3mZ0Wr5y","W3VFH45cIH","AIYUuzFgtB","2TRI7CK5W7","prNT6JkzUn","5ZaEzpvgjS",
+"uLtKshUTw7","Zv7z05Namm","Pb1paTCgPp","FPfSES2Dfu","zmLYDOxWIH","atef2mz8gx","BbwgAVIlwP","guMb8CIShG","FcWrWfFDrJ","tAOsrgdQsS",
+"aez9yTCgPp","azIWps7Mxk","PYBf4lm0pD","gjUTuiKqhr","9eoRcDG4sT","QClRLEdBKc","5Namm3weIF","blLA9ReKEW","ogLgcaL6AJ","gIYvEPOUYS",
+"0BmCy4QMc9","oVQp6VLTy6","uoStwNcICA","gf8rIzHF1q","Q6LixQClRL","S77LH5Namm","cShY2VerEA","lCMxyIKxdL","G1RhSSmGzv","1v5hHFwEJz",
+"b29RJECMvU","UlU3MlXFOB","v2eC3h1zcH","mz8gxpmeCd","QssNCeuZA5","uZPqgYh1hF","ni2v1kB5nP","a00b5pvgjS","Pb1paF6PT2","HlUbFxXTI4",
+"Ss0ZulViBv","ECMvUGv3Fq","HlUbF5Mg9r","fqypyoQ87r","a00b5h1zcH","5ZaEz1v5hH","MaJQsb29RJ","jS1ajlweGy","QYxC0oQ87r","fLNg8Q6hMC",
+"S2DfuvkCHH","jeskSe6e4z","24ARFPYBf4","i7WMQZuDtD","6AFT0VBjhz","Gv3FqokgRi","GrDg7uTacx","FLsphmz8gx","Waim6m4bxU","GXdoHyluBx",
+"OHaBzqaofN","h1zcHYh1hF","jS1ajKsjRK","Oz8yZkZANm","PYBf4NcICA","5IhmGF6PT2","ogLgcjSjS3","9rlg9GWqqX","ix74rMmsIo","RsQUqDcpWB",
+"Mm8siQbxXc","VerEAMK07Y","8hJdti7WMQ","b29RJsuY4x","TXQ0Zdpe1v","QYxC0UmaEv","uZPqgvOqCE","No0QbwDajX","AIYUueuZA5","Y1mC00PktI",
+"7Ow5Ch1zcH","uAWypGrDg7","7X3uyoQ87r","CqqaD5Drn0","XflUqTCgPp","lViBv9iGoT","7ku1p5VZjS","hE1QliwzGk","ECMvUiB08l","Cfgr3zqH0W",
+"RzaZAECMvU","MGlTFmX2GE","VerEAy94nw","Cfgr3IKxdL","2Yz7EJRJQB","gf8rIguMb8","X6PinQ6hMC","KsjRKDG4sT","24ARFfLNg8","FcWrWCNHmv",
+"WDVWJciuWz","bZLvSF6PT2","0KyfsLbRTH","FGzgpLDk6f","pT8wuWaWsv","lweGyWaWsv","3weIFuZPqg","ZhwG1k85Ae","uTacxY1mC0","GrDg7cmXIX",
+"1v5hHrhl0J","3otm6nFqik","okgRiQworu","oVQp6WaWsv","Dz1R3n8pJ9","WmadAd85a9","JIqXiAkKTk","GWqqXMK07Y","7fKYUEdBKc","24ARFMkgy8",
+"aez9yn8pJ9","ru4UGStlDJ","BCxeCy94nw","FxX9qjfREu","dhSuH29QAz","t98iWm4bxU","7lUXZuZPqg","Uvlv4o8Uyd","v1Hln2ZHdk","NAFuwfmIK1",
+"VerEAMezSW","6q6L9NOHsz","d85a9i3pyd","pv0i7AkKTk","wiHrZ6AFT0","48cHLG1RhS","LbRTHKASQ8","07n1cfLNg8","fLNg82hEEU","ru4UGQClRL",
+"CNHmvBbwgA","brhlQ1LB1L","fcJOyDG4sT","7X3uylpF6W","hYBCKW7cTs","tuDySBCxeC","9GXkXgIYvE","zFgtB48cHL","zFgtBprNT6","RACujVerEA",
+"aDGtSzQt6Q","FhtglbgJAz","EdBKclsQGo","n1pmOU3yw5","45cIHTXQ0Z","wDajXdmoS7","n8pJ9uLtKs","l83Udsx5Gl","M6qcGK20wK","zFgtBM6qcG",
+"WmadAJRJQB","yvOMIfqypy","mz8gxhYBCK","mX2GEzHF1q","VNCPdSWfou","9rlg9MezSW","RxrsmpT8wu","tuDyShi5X7","ksJbyPb1pa","5nmWvh1zcH",
+"Mm8siIBe8k","SWfounnP8o","DcpWBOz8yZ","ksJbyFLsph","2DREsydG8U","kB5nPFVMxo","soy9tSs0Zu","i3pyde6e4z","16lHcdpe1v","J2mQiiB08l",
+"LbRTHAmdQd","k85AeAIYUu","VerEAOz8yZ","okgRiJRJQB","lXFOB7ku1p","ECMvUm4bxU","l83UdciuWz","2DREsF6PT2","1v5hH07n1c","xciqpQssNC",
+"oVQp6K4GS8","QClRLiqv4k","Yf2Ec2ZHdk","o8UydGv3Fq","YjB9tIKxdL","cL0aEtvdkD","iqv4kUl4a1","h1zcHNcICA","atef2AgJHQ","lViBvguMb8",
+"S2DfubgJAz","cL0aEI7p2a","aDGtSsqVrf","Gv3Fq7fsYM","he9IAU3yw5","Yw2oUEdBKc","NOHsz0YAGH","ydG8Uzz4ZU","8RCUA48cHL","t98iWTCgPp",
+"Ul4a1M3zXL","RmDcrMojnP","tlILtJ2mQi","tuDySIjTwP","cQOnvlH1kt","uN6r37ku1p","ZzJHWl83Ud","lViBv7ku1p","Q6LixHRxd8","Mkgy8ni2v1",
+"Vprf2t59lR","l83UdWreyP","RxrsmBGaQY","48cHLHfyNQ","iwzGk5Mg9r","rKDLJVjCZq","l83Udv1Hln","mX2GEhE1Ql","faHirUvlv4","EoToPlViBv",
+"GXdoHni2v1","I7p2a5VZjS","v8yFNCdyBV","sx5GlMmsIo","ix74rO3iyQ","sqVrfuupzk","hi5X7OUYuF","s7MxkdmoS7","RsQUqkB5nP","ThjNntlILt",
+"qUJMd4dEz6","lViBvs7Mxk","EoToPn8pJ9","29QAztAOsr","9GXkXBGaQY","zqH0WStlDJ","lCMxyCdyBV","zY1GYQbxXc","tuDySgtCA5","7hyVvciuWz",
+"1j5L8Z4I1v","FGzgpzbIYY","8hJdtNcICA","gtCA5QnJ1S","NcICAAOgEe","dpe1vUmaEv","oQ87rv1Hln","3weIFjfREu","4QMc9jSjS3","StlDJru4UG",
+"LbRTHt59lR","ZuDtDx3LDe","FcWrWzFgtB","QbxXcnnP8o","dhSuHGWqqX","zHF1qi3pyd","lXFOBYOfrY","7hyVvCqqaD","ECMvUni2v1","yToGW8hJdt",
+"CNHmvvLsmS","4W0TlCp3mZ","yToGWKr8ys","azIWpcShY2","QnJ1SydG8U","RkQkeuoStw","uLtKsFPfSE","wDajXEdBKc","64s8NuN6r3","ulk41TCgPp",
+"t98iWFPfSE","CNHmvaL6AJ","v8yFNdpe1v","cShY2m4bxU","Y1mC0bZLvS","jtn0XhYBCK","7hyVvoVQp6","Uvlv4uPX7G","VNCPdFNYIM","Z4I1v9rlg9",
+"UmaEvv2eC3","atef2zQt6Q","RzaZApmeCd","rz7UtGWqqX","K4GS8ECMvU","aFFssPOUYS","zY1GYWaWsv","yluBxpWiOs","9GXkXAkKTk","5VZjSvOqCE",
+"X6PinQChxs","X6PinF6PT2","FLsphM3zXL","s7Mxk9y4lw","ksJby8xEKz","tvdkD7hyVv","prNT6WMiS3","qUJMdAmdQd","uPX7Gi7WMQ","uTacxfcJOy",
+"x3LDefmIK1","fmIK12ZHdk","IjTwPPYBf4","ogLgcQ6hMC","Waim6K4GS8","TwanotuDyS","tuDySgdQsS","7hyVvdQ586","In3NSRACuj","MezSWI7p2a",
+"gtCA514FLR","580YDP6bcg","gdQsSmX2GE","8RCUA618Di","In3NSvOqCE","0KyfspmeCd","KASQ8wiHrZ","7lUXZqUJMd","580YDVprf2","tlILtAgJHQ",
+"oQ87rprNT6","14FLRMkgy8","POUYSI7p2a","HfyNQh1zcH","JXljWVNCPd","CqqaD2Nslm","ZzJHWuupzk","iB08lB3qem","ru4UGVLTy6","K4GS8OHaBz",
+"9XyT9HRxd8","dpe1vfcJOy","yEfy9s93Ml","CxVEfQWxoT","MmsIoHlUbF","M3zXLCp3mZ","gf8rIRBhp0","iKqhro8Uyd","n8pJ9v2eC3","ZJTXHni2v1",
+"pvgjSaez9y","Q6hMCBpYhV","XflUqLDk6f","aez9yVjCZq","3weIFydG8U","QssNCW3VFH","0PktIHzZT8","AmdQd0BmCy","nFqik9eoRc","2Yz7EHzZT8",
+"RmDcrlweGy","0MR5XprNT6","Twano6q6L9","FLsph5Drn0","FxX9qaL6AJ","7Ow5CXflUq","fcwDaOxWIH","qaofNZv7z0","aez9yhSSvQ","WreyP9rlg9",
+"FnPFBNhXdu","iB08l2DREs","AOgEeC2Irc","ThjNnJRJQB","FLsphzFgtB","fqypym4bxU","v8yFNbrhlQ","DG4sTulk41","8U2nUpAhR1","wDajXY1mC0",
+"tAOsrMmKGJ","oGu6xGXdoH","a00b5LbRTH","lCMxyNAFuw","GXdoH580YD","NhXduJ2mQi","ZzJHWkZANm","gf8rIjSjS3","C2IrcDLhzM","WmadAulk41",
+"mz8gxOUYuF","CNHmv16lHc","Yw2oUbgJAz","guMb8hUTw7","16lHcgtCA5","b29RJjfREu","mz8gxUmaEv","lweGyStlDJ","cL0aEiB08l","KZamH0BmCy",
+"07n1cL7cGc","QssNCHRxd8","9eoRcNOHsz","xXTI4AXpwE","xXTI4IjTwP","rKDLJ1j5L8","2hEEU8U2nU","hSSvQrhl0J","xXTI4IKxdL","SbRYyFPfSE",
+"UlU3MJJs5m","iKqhr7fsYM","RsQUqRmDcr","FcWrWpiJSk","48cHLfcJOy","16lHcpWiOs","Z4I1vpWiOs","QWxoTFcWrW","9y4lws4786","v1HlnnlaBy",
+"hYBCKi7WMQ","ksJbyCxVEf","ydG8UFnPFB","rKDLJv8yFN","GXdoHXyPZN","lkMUA0h1b1","FNYIMX6Pin","FwEJzWreyP","o8Uyd7Ow5C","atef2gf8rI",
+"x3LDeG1RhS","iKqhrNcICA","Kr8ys55rfB","CxVEf5IhmG","2Yz7ERsQUq","QChxslXFOB","cShY2Kr8ys","Z4I1v5ZaEz","S77LHzmLYD","zqH0Wt98iW",
+"uZPqgiKqhr","guMb8MK07Y","9y4lw1v5hH","aez9yEOE1o","O3iyQYOfrY","zz4ZUaL6AJ","RACujPb1pa","iKqhrCdyBV","iB08ltlILt","QworuqQxHP",
+"M6qcG5iGN5","Pb1paDz1R3","W7cTsRBhp0","yToGWSjskQ","QssNCogLgc","aL6AJyToGW","HzZT8fcwDa","atef2qaofN","oQ87rWMiS3","POUYS7fKYU",
+"uN6r3GXdoH","FGzgphSSvQ","2hEEUI7p2a","JKWYRCqqaD","zz4ZUeuZA5","yvOMIFPfSE","K4GS8SbRYy","FcWrWh1zcH","pWiOsAkKTk","uTacxOz8yZ",
+"hi5X7WDVWJ","FwEJz8RCUA","cShY2PYBf4","9XyT9i7WMQ","5nmWvRxrsm","XflUqvLsmS","580YDRACuj","Gv3FqlXFOB","pT8wuVIlwP","CIShG5drc6",
+"LDk6fru4UG","cmXIX0ao3l","7fKYU7Ow5C","n8pJ9FFDui","uQIczru4UG","FGzgpC2Irc","Y1mC0WDVWJ","JIqXi1v5hH","29QAz7fsYM","I7p2as4786",
+"G1RhStjQxs","KsjRKguMb8","D6rByWreyP","vOqCEVerEA","1v5hHjS1aj","d7vjMCqqaD","2ZHdkoQ87r","VNCPdjzUqR","NOHszuLtKs","GrDg7Oz8yZ",
+"9GXkX9eoRc","t59lR55rfB","2Yz7ElH1kt","O3iyQVprf2","uZPqgHRxd8","W3VFHo8Uyd","blLA9lCMxy","tjQxsSbRYy","MmsIomX2GE","o8UydQ6hMC",
+"BbwgATwano","brhlQQYxC0","5IhmG0PktI","pv0i7OxWIH","ni2v1uupzk","gf8rIzmLYD","8TxD70Wr5y","dmoS7B3qem","aez9yAOgEe","M3zXLcL0aE",
+"9GXkXd7vjM","8xEKz9y4lw","I7p2aIBe8k","WaWsvi7WMQ","HP433AXpwE","he9IAhE1Ql","o8UydSs0Zu","O3iyQRzaZA","hi5X7zz4ZU","nnP8oo8Uyd",
+"ZJTXHlXFOB","RACujjiVBP","AmdQdwiHrZ","guMb8Ul4a1","o8Uyd8cVD3","euZA514FLR","Ss0Zu5ZaEz","s47869iGoT","4dEz6rhl0J","8cVD3Yf2Ec",
+"dmoS7X6Pin","IjTwPSWfou","JJs5mpv0i7","zqH0WPYBf4","Fhtglrhl0J","QChxsnFqik","Z4I1vMojnP","vOqCE0h1b1","Q6hMCfqypy","i3pydprNT6",
+"uupzkW3VFH","0ao3llViBv","xciqpfqypy","hYBCK5Drn0","IjTwPlXFOB","0PktIHlUbF","3otm6guMb8","euZA5ix74r","rKDLJpWiOs","s93Mlhe9IA",
+"ru4UGRxrsm","nnP8ouoStw","0MR5XZzJHW","zqH0WDQimp","bgJAzl83Ud","SWfouECMvU","P6bcgnFqik","7X3uyogLgc","0ao3lTwano","No0QbPYBf4",
+"2TRI7RBhp0","8xEKz9eoRc","oGu6x55rfB","M6qcGlH1kt","Cp3mZPYBf4","tuDyStjQxs","k85AeYw2oU","hSSvQaez9y","7fsYMWPmlx","yluBxy94nw",
+"Mm8si0h1b1","0ao3ltl72W","Oz8yZ2Yz7E","pFrrlru4UG","GWqqXuLtKs","Uvlv44W0Tl","IKxdLzbIYY","Nxx9VRpBQm","yvOMI4QMc9","azIWp0PktI",
+"Cp3mZHfyNQ","KZamHHP433","ciuWzcmXIX","MGlTF14FLR","aL6AJd85a9","d85a916lHc","lpF6WPYBf4","zQt6QxXTI4","DG4sTStlDJ","L7cGcRxrsm",
+"K4GS8VjCZq","he9IANAFuw","fmIK1FjHXR","6q6L90ao3l","vkCHHzHF1q","CNHmvBFkb8","7hyVvnlaBy","Gv3Fq5iGN5","618DiCp3mZ","F6PT2QChxs",
+"yToGW9rlg9","tlILtv1Hln","uLtKsMGlTF","nlaByKr8ys","kB5nPkZANm","SWfoulweGy","8FmFHzQt6Q","jiVBPCIShG","prNT6oQ87r","FPfSE9y4lw",
+"GSQwjvOqCE","d85a9POUYS","ciuWzSjskQ","NAFuwQssNC","Yf2EcYh1hF","8xEKzWaWsv","ReKEWjSjS3","BbwgA618Di","ogLgctaOXK","7ku1p0ao3l",
+"EoToPpAhR1","cShY2uAWyp","OHaBzVLTy6","tlILtUvlv4","n1pmO7hyVv","SmGzvfLNg8","NcICAhE1Ql","jeskSkB5nP","7lUXZfmIK1","JKWYRStlDJ",
+"bgJAzuLtKs","KsjRKXflUq","rhl0JFcWrW","pmeCdt98iW","tjQxssx5Gl","piJSkZJTXH","dhSuHTCgPp","4W0TlUvlv4","pmeCdgIYvE","SbRYyt98iW",
+"QChxs45cIH","RsQUqru4UG","tjQxs580YD","d7vjMpWiOs","gf8rIWMiS3","CqqaDPYBf4","sx5GlpT8wu","gjUTuatef2","cmXIX5ZaEz","WDVWJblLA9",
+"ciuWz8U2nU","O3iyQMK07Y","n8pJ9MojnP","D6rByZuDtD","FhtglciuWz","7X3uyv8yFN","t98iWfcJOy","OUqFMNOHsz","2DREsatef2","2DREstvdkD",
+"L7cGcHP433","jSjS3tjQxs","iKqhrFxX9q","9GXkXY1mC0","2TRI7i7WMQ","uvf7AEdBKc","5nmWvGrDg7","HlUbFFnPFB","45cIHzz4ZU","okgRiMmsIo",
+"zY1GY7lUXZ","0PktIuvf7A","ulk41Cfgr3","uQIczQnJ1S","WPmlxn1pmO","DG4sTlweGy","sx5GlzFgtB","dhSuHsqVrf","CK5W7uZPqg","k85AeFwEJz",
+"n1pmOWreyP","yluBxatef2","Z4I1vDcpWB","8TxD73otm6","pT8wuAkKTk","FhtglK4GS8","vLsmSWDVWJ","tvdkDFPfSE","kZANmCIShG","hi5X7ogLgc",
+"IKxdLRkQke","hE1QlGWqqX","mX2GERACuj","K4GS8HfyNQ","zz4ZUS2Dfu","5NammHfyNQ","Ul4a1v2eC3","Y1mC07fKYU","ZUnqtGv3Fq","16lHcFNYIM",
+"v8yFN0PktI","Oz8yZNo0Qb","qaofN5ZaEz","BFkb8W3VFH","MaJQsfLNg8","Cfgr3ZhwG1","aDGtSlweGy","HRxd8jtn0X","45cIHOz8yZ","zbIYYY1mC0",
+"4dEz6wiHrZ","AmdQddQ586","tAOsrWPmlx","i3pydiKqhr","Ta8f6iB08l","WPmlxfcJOy","IKxdL9rlg9","jSjS3AgJHQ","M6qcGuLtKs","v8yFNJXljW",
+"aez9yCIShG","AkKTkCdyBV","M3zXLgf8rI","pmeCdFnPFB","rz7UtlViBv","7hyVvOUqFM","FPfSEK20wK","QworuiB08l","ru4UGMGlTF","DLhzM0BmCy",
+"LewvMs7Mxk","DG4sT8TxD7","Chuy3sx5Gl","8cVD3jzUqR","prNT664s8N","OUqFMjeskS","jSjS3U3yw5","F6PT2MmKGJ","s93Ml5drc6","24ARFfaHir",
+"TCgPpQ6hMC","24ARF9rlg9","s7MxkyvOMI","QnJ1SbgJAz","jtn0XNxx9V","yvOMIB3qem","AIYUuS2Dfu","gdQsSU3yw5","sqVrfazIWp","7ku1pTXQ0Z",
+"okgRiIjTwP","F6PT2zqH0W","jSjS3fqypy","yluBxJJs5m","d85a9K4GS8","v2eC3jfREu","8TxD7aez9y","jeskSFFDui","Gv3Fq8U2nU","C2IrczqH0W",
+"Yf2EcAXpwE","0KyfslViBv","BpYhVydG8U","8RCUAMkgy8","X6PinUvlv4","8U2nUKZamH","QssNCAOgEe","lH1ktd7vjM","s7MxkIRh48","ZuDtDFxX9q",
+"aFFssyEfy9","2DREsHzZT8","In3NSjzUqR","FPfSEAkKTk","aez9yCdyBV","aFFssEoToP","DLhzMB3qem","qQxHPQ6hMC","yofH3lH1kt","WmadAcmXIX",
+"JJs5mbrhlQ","EOE1olm0pD","RsQUqWPmlx","uZPqg2TRI7","7fsYMpvgjS","tuDySyluBx","F6PT2Ss0Zu","blLA9yEfy9","LDk6fKsjRK","5iGN5GrDg7",
+"gjUTu07n1c","Yw2oUy94nw","ZuDtDWPmlx","ciuWzvkCHH","24ARFHP433","Nxx9VRmDcr","gIYvEhSSvQ","QssNCFPfSE","dhSuHNOHsz","lj07QsqVrf",
+"uJScXBFkb8","xReec5Mg9r","QClRLDQimp","nnP8oBbwgA","ru4UGlkMUA","0YAGHwiHrZ","m4bxUb29RJ","gtCA57X3uy","KASQ8Ul4a1","MmKGJ14FLR",
+"blLA9Rxrsm","uPX7G5nmWv","vOqCEIBe8k","dmoS7Y1mC0","MmKGJfFDrJ","uupzkZv7z0","RkQkeMaJQs","uZPqgaDGtS","0ao3lnnP8o","5Mg9rkZANm",
+"TCgPpRkQke","3weIFJXljW","CqqaDfcwDa","vLsmSRzaZA","aL6AJlj07Q","EoToP9GXkX","Cfgr37lUXZ","KASQ848cHL","lpF6W2ZHdk","SWfouVBjhz",
+"CK5W7h1zcH","zz4ZU9XyT9","nlaBy8U2nU","aFFsslpF6W","rKDLJFcWrW","b29RJzQt6Q","oVQp6G1RhS","VerEA2TRI7","IRh48MmsIo","Fhtglatef2",
+"VjCZqiB08l","uZPqgRpBQm","ReKEWmX2GE","euZA5CdyBV","t59lROHaBz","BFkb8ydG8U","ulk417fKYU","MK07YQClRL","XyPZNW7cTs","Y1mC0MmsIo",
+"I7p2a8cVD3","7hyVvRpBQm","taOXKlH1kt","kB5nPJRJQB","GWqqXeuZA5","AmdQdd7vjM","S77LHuoStw","NOHszCp3mZ","TXQ0ZaDGtS","5drc69iGoT",
+"7Ow5CuQIcz","AgJHQCdyBV","o8Uydb29RJ","FwEJzHlUbF","7Ow5Cuvf7A","Fhtglgf8rI","uPX7Gatef2","GWqqX4QMc9","RsQUqAIYUu","I7p2ani2v1",
+"zmLYDRkQke","ZzJHWhE1Ql","hE1QlM3zXL","lsQGol83Ud","6AFT055rfB","nFqiklj07Q","pFrrl24ARF","Vprf2AkKTk","FjHXRUlU3M","P6bcgNhXdu",
+"QssNCcQOnv","8TxD7oQ87r","Fhtglmz8gx","ciuWzWDVWJ","DQimp5Namm","Z4I1v9XyT9","U3yw5MaJQs","ECMvUJkzUn","hSSvQFwEJz","sqVrfGv3Fq",
+"5ZaEzv1Hln","y94nwydG8U","RkQkeix74r","5Mg9r5nmWv","HfyNQFwEJz","Cp3mZpAhR1","ru4UGl83Ud","7Ow5CzHF1q","Pb1pafaHir","vLsmSVBjhz",
+"aFFssQworu","lweGyJ2mQi","euZA5AkKTk","wDajX9XyT9","qQxHP6q6L9","piJSkTa8f6","aL6AJaL6AJ","9rlg9hSSvQ","piJSk5Mg9r","P6bcgTwano",
+"9y4lwMGlTF","ECMvUUl4a1","oVQp6he9IA","G1RhSO3iyQ","cL0aEBpYhV","x3LDePb1pa","djsrvVBjhz","ZuDtD9y4lw","ZuDtDAgJHQ","soy9tlm0pD",
+"KZamHTa8f6","jfREuOUqFM","ksJby1v5hH","8cVD3xciqp","CK5W7pv0i7","lkMUAuLtKs","okgRi5Namm","QnJ1SlViBv","5VZjSOUYuF","CqqaDVprf2",
+"lViBvtvdkD","DLhzMiB08l","uTacxxXTI4","HzZT8cmXIX","lsQGoCNHmv","cQOnvYw2oU","y94nwzz4ZU","fqypyCqqaD","RsQUqMK07Y","EoToP7hyVv",
+"OHaBzyofH3","pvgjSGWqqX","DcpWBNhXdu","L7cGcjSjS3","07n1cydG8U","U3yw5i3pyd","VBjhzsoy9t","SmGzvS77LH","gdQsSMojnP","DLhzMmX2GE",
+"nFqik8RCUA","IKxdLFhtgl","07n1cGWqqX","OUYuFL7cGc","TCgPpn8pJ9","5IhmGe6e4z","iqv4kt59lR","ReKEWJIqXi","uupzkt98iW","3otm60MR5X",
+"64s8Nmz8gx","RmDcroQ87r","fmIK1v1Hln","yToGWi3pyd","iKqhrpWiOs","JIqXi6q6L9","he9IAMGlTF","v8yFNtAOsr","QbxXcwiHrZ","uoStwVIlwP",
+"lj07QqQxHP","aL6AJtl72W","nnP8oMkgy8","o8Uyd1v5hH","t98iWpmeCd","tjQxsfaHir","suY4xdmoS7","iwzGkCNHmv","QYxC0IKxdL","uZPqgOxWIH",
+"jiVBPUvlv4","9rlg9oQ87r","Dz1R3gf8rI","lj07QEoToP","TwanoVprf2","ZzJHW2hEEU","M3zXLb29RJ","NOHszciuWz","iKqhr5IhmG","In3NSni2v1",
+"dpe1vBCxeC","v2eC3oGu6x","uPX7Gv8yFN","GSQwjGv3Fq","WPmlxYjB9t","P6bcgOUqFM","ZhwG1Kr8ys","pv0i724ARF","VLTy6nlaBy","lpF6Wt98iW",
+"euZA5FGzgp","7fKYUsoy9t","aDGtSsuY4x","580YDlweGy","GXdoHfcJOy","blLA9Cp3mZ","RsQUqcQOnv","lj07QYw2oU","BpYhVx3LDe","9y4lwcQOnv",
+"4dEz6s7Mxk","FFDuilweGy","7ku1pD6rBy","MK07YNAFuw","QssNCSWfou","O3iyQECMvU","RzaZAQClRL","BCxeCIBe8k","ZhwG1Cfgr3","Ul4a1HzZT8",
+"YjB9t55rfB","tAOsr7lUXZ","7hyVvCIShG","In3NSQssNC","Z4I1vzz4ZU","YOfrYQ6hMC","jiVBPazIWp","e6e4zQnJ1S","9eoRcwiHrZ","jeskSBFkb8",
+"wiHrZtlILt","pFrrl45cIH","mz8gxC2Irc","CxVEfbrhlQ","aL6AJRxrsm","Yh1hFmz8gx","4dEz6xciqp","GSQwjAOgEe","a00b5n8pJ9","bZLvSpAhR1",
+"5ZaEzpWiOs","GrDg7jfREu","HlUbFNo0Qb","0BmCyEoToP","fcJOyoQ87r","JJs5mM6qcG","KASQ8euZA5","RzaZAVBjhz","MmsIozz4ZU","16lHctl72W",
+"4W0TlHfyNQ","Z4I1vfcJOy","yvOMIuQIcz","QYxC0tl72W","y94nweuZA5","MK07YqUJMd","ZJTXHC2Irc","GrDg7h1zcH","GSQwj5Drn0","tuDySGXdoH",
+"h1zcHlH1kt","5VZjS9y4lw","2Nslm5iGN5","B3qemOUqFM","TCgPpjeskS","ix74rh1zcH","Pb1paFhtgl","azIWpHRxd8","ogLgchi5X7","JJs5mOz8yZ",
+"KZamHBpYhV","Ul4a1CNHmv","ZUnqtjSjS3","aFFssU3yw5","29QAzAXpwE","6q6L9fFDrJ","s7Mxkt98iW","FPfSE9eoRc","5nmWvs4786","uZPqgv1Hln",
+"0KyfsKASQ8","zY1GYMmKGJ","i3pyd2DREs","sx5Glxciqp","K20wK1j5L8","uJScXnlaBy","LewvMjS1aj","ulk417Ow5C","nlaByJRJQB","jS1ajlCMxy",
+"NOHszs93Ml","fcJOyOHaBz","ulk41Z4I1v","dmoS79XyT9","S2Dfub29RJ","jiVBPuZPqg","VLTy6jeskS","Q6hMCdQ586","Chuy3qUJMd","J2mQiru4UG",
+"tuDySWaWsv","CIShGFwEJz","tuDyS1v5hH","BCxeCuZPqg","OUYuFK20wK","0BmCyguMb8","ReKEWTwano","Ta8f6dmoS7","CIShGSs0Zu","yvOMIFwEJz",
+"NAFuwNOHsz","S77LHUlU3M","MK07Ydpe1v","CK5W78cVD3","OUqFMuupzk","7X3uyU3yw5","Yh1hFaFFss","5NammksJby","8hJdtuN6r3","Cfgr3Gv3Fq",
+"2ZHdk2Yz7E","EdBKcrKDLJ","FnPFBjS1aj","yluBxF6PT2","cQOnvTXQ0Z","7lUXZF6PT2","fcwDaAXpwE","VNCPdaL6AJ","gdQsSvOqCE","pv0i7sqVrf",
+"MaJQsfqypy","iB08lOxWIH","suY4xRsQUq","i7WMQRBhp0","jeskSAOgEe","suY4xVerEA","Gv3FqzmLYD","0BmCyiwzGk","oQ87rRBhp0","bgJAzuZPqg",
+"3weIFhSSvQ","Gv3Fq5Drn0","FjHXRtvdkD","qQxHPZv7z0","dpe1vt59lR","ix74rW7cTs","5VZjSP6bcg","8U2nUdpe1v","yofH35IhmG","FLspht98iW",
+"he9IA9GXkX","Zv7z0Ta8f6","No0Qb618Di","RzaZAgjUTu","zY1GYTa8f6","Y1mC00ao3l","dpe1vuupzk","Ss0ZuUvlv4","JKWYRk85Ae","ni2v1ciuWz",
+"7lUXZJRJQB","5Mg9rZzJHW","uTacxRpBQm","AOgEeVIlwP","ZzJHWeuZA5","GWqqXpmeCd","Q6Lix0ao3l","ZhwG1Z4I1v","0YAGHReKEW","NhXduv1Hln",
+"yvOMIPOUYS","AXpwErKDLJ","atef2SWfou","0h1b1FxX9q","aez9yAIYUu","9XyT9StlDJ","zbIYYDcpWB","M3zXLxciqp","he9IAni2v1","W7cTsCqqaD",
+"jtn0XuoStw","ThjNnFLsph","AXpwEiB08l","m4bxUJJs5m","Q6LixB3qem","oQ87roGu6x","hE1QlAmdQd","1LB1Ldpe1v","WreyPCNHmv","Waim6t98iW",
+"gjUTurz7Ut","HzZT82Nslm","GXdoHVLTy6","uLtKsuLtKs","2ZHdk8FmFH","s93MlFFDui","soy9tuupzk","pT8wuXflUq","WmadAtuDyS","M3zXL5nmWv",
+"OHaBzBpYhV","OUqFMs93Ml","YOfrYPYBf4","4QMc95Mg9r","pWiOsKr8ys","K4GS8GSQwj","VNCPdfqypy","tvdkDlkMUA","8FmFHYh1hF","AIYUu9GXkX",
+"jtn0XOUYuF","9eoRczQt6Q","JRJQBJRJQB","5NammJJs5m","fcwDatuDyS","jzUqROUYuF","lViBv8FmFH","djsrvJXljW","Twano8xEKz","Mm8siBpYhV",
+"soy9ttlILt","gf8rIjeskS","AXpwE5ZaEz","XflUqOHaBz","oGu6xZJTXH","RkQkeIKxdL","9y4lwAgJHQ","GSQwjpAhR1","QworuLbRTH","k85AeWmadA",
+"5Mg9rtvdkD","7ku1pRxrsm","sqVrfn8pJ9","qaofNoVQp6","guMb8Yf2Ec","14FLRuupzk","lweGyl83Ud","LewvMlm0pD","uTacxP6bcg","lkMUAgf8rI",
+"zY1GYP6bcg","AmdQdC2Irc","cQOnvQClRL","m4bxUhi5X7","Ta8f6sqVrf","Nxx9VjiVBP","L7cGcJJs5m","RkQke0Wr5y","L7cGcydG8U","64s8NpvgjS",
+"Oz8yZcShY2","QssNC0Wr5y","9GXkXlsQGo","ogLgcTCgPp","JkzUnoVQp6","JIqXicL0aE","LbRTHJJs5m","FFDuiMmKGJ","tjQxszY1GY","BbwgAn8pJ9",
+"s93Ml0Wr5y","uupzkvLsmS","6q6L9K20wK","9XyT9IBe8k","4dEz6KZamH","AOgEeEOE1o","L7cGciKqhr","RBhp0yEfy9","Nxx9VUmaEv","IjTwPcShY2",
+"hYBCKDz1R3","gf8rINcICA","SWfouHzZT8","GrDg7suY4x","IjTwPiKqhr","a00b5uJScX","K20wKjeskS","EoToPRpBQm","5NammZuDtD","ZUnqt0MR5X",
+"Y1mC0v2eC3","S2DfuFGzgp","d85a9CIShG","hE1Ql0Kyfs","kZANmUl4a1","7X3uy2Yz7E","5drc6vkCHH","L7cGcblLA9","5VZjS7fsYM","cShY2No0Qb",
+"5nmWvM3zXL","yToGWfcJOy","Ss0ZuOUYuF","mz8gxMmKGJ","qQxHP2Yz7E","WDVWJMmKGJ","cL0aEQworu","K20wKn1pmO","Q6Lixdjsrv","BbwgAlsQGo",
+"ECMvUrhl0J","cShY20YAGH","rhl0JM3zXL","CK5W7FGzgp","K4GS87Ow5C","1v5hHgf8rI","FGzgpYh1hF","8RCUAQnJ1S","IRh48iB08l","FcWrWMezSW",
+"7lUXZ5IhmG","7fKYUYOfrY","prNT6Yw2oU","8cVD3k85Ae","07n1ciwzGk","55rfBZJTXH","64s8NVNCPd","0h1b1tuDyS","aFFssRzaZA","m4bxUru4UG",
+"FhtglSmGzv","hUTw7v8yFN","gf8rILewvM","RkQkeAgJHQ","NcICA1j5L8","uJScXuQIcz","faHirLewvM","ni2v1CNHmv","m4bxUFNYIM","9GXkXguMb8",
+"uZPqgVIlwP","uoStw5nmWv","d85a9CNHmv","jiVBPaDGtS","ThjNngIYvE","dpe1vS2Dfu","SjskQPYBf4","TCgPptaOXK","2ZHdk45cIH","Kr8yshSSvQ",
+"iKqhrlH1kt","dhSuH1j5L8","s4786Uvlv4","9XyT9uupzk","Yf2EczHF1q","M6qcG1v5hH","Gv3FqzqH0W","AmdQdLewvM","FjHXRdQ586","uvf7ANo0Qb",
+"8TxD78cVD3","RBhp0Pb1pa","qQxHPuoStw","QClRLgf8rI","RmDcrBpYhV","IRh48uAWyp","oGu6xOxWIH","dhSuHaez9y","rz7UtMkgy8","IKxdLBGaQY",
+"OxWIHyluBx","kB5nPLewvM","5nmWv45cIH","lViBvyluBx","i3pydgtCA5","0ao3lCNHmv","OHaBzHzZT8","uTacxpv0i7","ciuWzuLtKs","EoToPnnP8o",
+"EOE1opiJSk","GXdoHGrDg7","QClRLjS1aj","ydG8UIBe8k","WMiS3WreyP","he9IAHRxd8","t98iWGrDg7","7fsYMXyPZN","lViBvHzZT8","QWxoTHP433",
+"9rlg9cShY2","7lUXZxReec","d85a9CxVEf","Chuy3v8yFN","s7Mxky94nw","v1HlnkZANm","UlU3Mb29RJ","QWxoTI7p2a","XflUqNOHsz","aDGtSuoStw",
+"55rfBsx5Gl","tAOsrXyPZN","VjCZqcShY2","iB08lJRJQB","rhl0JlkMUA","LewvMi7WMQ","U3yw5pFrrl","gtCA5zFgtB","fqypydpe1v","AmdQdd85a9",
+"h1zcHciuWz","TwanoQClRL","W3VFHRsQUq","LbRTHciuWz","dpe1vfcwDa","Gv3Fqi3pyd","5iGN55ZaEz","580YDWPmlx","O3iyQAXpwE","o8Uydn1pmO",
+"vkCHH9y4lw","580YDAkKTk","X6PingjUTu","8xEKzqQxHP","HzZT88FmFH","jtn0XS2Dfu","EOE1o3otm6","jfREuuoStw","uvf7AjiVBP","ZhwG1F6PT2",
+"t59lRCIShG","m4bxUdpe1v","QYxC0ru4UG","S77LHW3VFH","Gv3FqFPfSE","GWqqXh1zcH","d85a9hUTw7","5Mg9rF6PT2","0ao3luQIcz","7Ow5CUlU3M",
+"jS1ajfmIK1","xXTI4SjskQ","yvOMIhE1Ql","vOqCEwDajX","DLhzMgf8rI","14FLRbgJAz","yvOMI0h1b1","hSSvQtl72W","hYBCKOUYuF","BbwgA2Nslm",
+"0h1b17ku1p","EoToPuN6r3","GSQwjs4786","2DREsL7cGc","mX2GExReec","RACuj48cHL","In3NSb29RJ","pvgjSJ2mQi","In3NSFFDui","7fKYU7hyVv",
+"NhXduyvOMI","0KyfstuDyS","XyPZNRkQke","QWxoT5Mg9r","zFgtBIRh48","ciuWzGv3Fq","ulk41n1pmO","dmoS7AgJHQ","lXFOBLDk6f","KsjRK9iGoT",
+"O3iyQRkQke","VjCZq9rlg9","guMb8OUqFM","gjUTuQChxs","JIqXiBpYhV","d85a9GWqqX","YjB9tU3yw5","gtCA5AIYUu","DLhzMJKWYR","HP433VBjhz",
+"MezSWk85Ae","OUYuF9y4lw","OUqFM2ZHdk","QClRL24ARF","0Wr5yoGu6x","KZamHZuDtD","gf8rI8TxD7","ThjNnzz4ZU","MezSWOUqFM","MmsIo0ao3l",
+"dhSuH8cVD3","In3NSCxVEf","oVQp6JIqXi","WPmlx2Nslm","7X3uyZhwG1","5Drn0zbIYY","jeskSAmdQd","sqVrfCqqaD","OUqFMSs0Zu","Ta8f6AXpwE",
+"5iGN5fcJOy","RsQUqZJTXH","0Wr5yciuWz","uZPqgFPfSE","rz7UtbZLvS","ru4UGoGu6x","TCgPpfqypy","pvgjS5Namm","BbwgAoGu6x","qaofNuZPqg",
+"FjHXRzz4ZU","fmIK1KsjRK","7fsYMx3LDe","CxVEfYjB9t","tl72WPYBf4","v1HlnAmdQd","yToGWvLsmS","dmoS70BmCy","I7p2awiHrZ","x3LDea00b5",
+"0PktIdmoS7","WDVWJJJs5m","9iGoTGrDg7","9eoRcatef2","wiHrZ5iGN5","pFrrl7ku1p","dmoS7dQ586","JIqXi29QAz","Pb1paiwzGk","wDajXjeskS",
+"DcpWBYw2oU","55rfBYf2Ec","EoToPZUnqt","oVQp6Z4I1v","Pb1paQnJ1S","G1RhSsuY4x","5VZjSAkKTk","BbwgAHlUbF","lCMxyOHaBz","ydG8UTa8f6",
+"FjHXRvOqCE","BbwgAs4786","BbwgAY1mC0","tAOsrKZamH","Z4I1vuupzk","TXQ0ZlpF6W","WPmlx618Di","SjskQMK07Y","CqqaDZ4I1v","HRxd8lCMxy",
+"QssNCWmadA","0Kyfsfqypy","KZamHAkKTk","iKqhrNxx9V","8TxD7lpF6W","Waim6WMiS3","BCxeCRpBQm","cShY2HP433","gdQsSuupzk","Zv7z03weIF",
+"nnP8olweGy","0ao3lVLTy6","kZANmLDk6f","WDVWJKsjRK","2hEEUMmKGJ","zmLYDGXdoH","KASQ8F6PT2","GXdoHzFgtB","OxWIHhSSvQ","8FmFHJIqXi",
+"iwzGk5drc6","a00b5bZLvS","FxX9q8U2nU","WDVWJXflUq","uN6r3FwEJz","d7vjMBCxeC","okgRiix74r","SmGzvqUJMd","5nmWvFNYIM","5Drn0v1Hln",
+"cQOnv2ZHdk","UmaEvlH1kt","RkQkeBFkb8","WPmlxIKxdL","Mm8sibgJAz","zY1GYFwEJz","gdQsS9GXkX","UlU3M0PktI","gdQsSECMvU","lj07QzHF1q",
+"dhSuHLbRTH","mz8gxqQxHP","ZzJHWFGzgp","s4786618Di","t59lRvOqCE","7lUXZDLhzM","jtn0XPYBf4","5IhmGjSjS3","5nmWvulk41","uN6r30YAGH",
+"lm0pDUmaEv","2Yz7ETXQ0Z","tvdkDG1RhS","zbIYYjtn0X","JRJQB8xEKz","uN6r3StlDJ","MmKGJpWiOs","5Drn04QMc9","AIYUuFGzgp","gf8rIh1zcH",
+"pFrrlQbxXc","FNYIMFjHXR","Ta8f6X6Pin","JXljWk85Ae","8hJdt29QAz","fLNg8ix74r","24ARF5ZaEz","1v5hHs4786","DG4sTCK5W7","LewvMU3yw5",
+"CK5W7KZamH","QworuJIqXi","Ss0ZuC2Irc","uJScXprNT6","brhlQLDk6f","lXFOBRzaZA","Qworu8U2nU","ru4UGfcwDa","L7cGcKASQ8","Chuy3pFrrl",
+"FVMxo5VZjS","piJSk55rfB","zFgtB5Namm","In3NSK20wK","Zv7z0VNCPd","POUYS8cVD3","zbIYYoVQp6","uAWypOHaBz","lsQGocmXIX","tjQxsgIYvE",
+"4QMc9P6bcg","sqVrfCp3mZ","jzUqR64s8N","3weIF9y4lw","uQIczJ2mQi","SWfouU3yw5","GrDg7yluBx","pT8wuLbRTH","gIYvE618Di","oQ87rGSQwj",
+"faHirs7Mxk","FwEJzciuWz","BCxeC7X3uy","AmdQdPOUYS","HfyNQgjUTu","uoStw1v5hH","uJScXgf8rI","JIqXirhl0J","qUJMdn8pJ9","rz7UtciuWz",
+"dmoS7qUJMd","WreyPbrhlQ","VNCPdW3VFH","yofH30MR5X","No0QbdhSuH","lpF6WZv7z0","Yh1hFi7WMQ","sqVrfqUJMd","CIShG5nmWv","LDk6fsqVrf",
+"IRh48MK07Y","kB5nPi3pyd","zFgtBYf2Ec","2Yz7ElXFOB","BbwgAlXFOB","s7MxksqVrf","WreyPRkQke","hYBCKFNYIM","gf8rIJIqXi","Cp3mZiwzGk",
+"Q6Lixrz7Ut","HP433tvdkD","djsrv5VZjS","zQt6Qi3pyd","vLsmSlj07Q","yToGWtvdkD","k85Ae9GXkX","rz7UtdhSuH","hUTw7aL6AJ","Zv7z0KsjRK",
+"7X3uy2TRI7","BpYhVFjHXR","DQimp14FLR","ulk41pWiOs","euZA5Vprf2","pmeCdQssNC","uN6r3OUqFM","vkCHH1j5L8","zz4ZUDG4sT","uN6r3jfREu",
+"MK07Y7Ow5C","LbRTHgjUTu","5VZjSx3LDe","Yf2Ec618Di","uTacxHfyNQ","lViBvfqypy","brhlQGXdoH","rhl0JIKxdL","gIYvEZhwG1","QWxoTpmeCd",
+"GrDg7TCgPp","LDk6fZ4I1v","14FLRBFkb8","AXpwEDLhzM","Twano8TxD7","taOXKCNHmv","BFkb8zHF1q","t98iW7X3uy","UmaEvTCgPp","d7vjMWDVWJ",
+"lViBv5Namm","he9IAi3pyd","2Yz7EHRxd8","aez9y3otm6","O3iyQ0h1b1","gIYvEsqVrf","JKWYRWDVWJ","rhl0JhUTw7","dpe1v5Drn0","618DiyluBx",
+"LbRTH14FLR","jzUqR0MR5X","gIYvE6q6L9","Fhtgl8hJdt","DQimpOz8yZ","lpF6WOz8yZ","XyPZN1v5hH","y94nwW3VFH","vOqCE6AFT0","64s8N2TRI7",
+"yofH3GSQwj","0YAGHdpe1v","MGlTFrhl0J","8xEKzuZPqg","uTacxhUTw7","cShY29y4lw","RsQUq9GXkX","Dz1R37ku1p","HlUbFVerEA","vOqCEsqVrf",
+"jiVBPC2Irc","55rfB7hyVv","BFkb8Cp3mZ","9iGoTSWfou","JXljWK4GS8","Mkgy8gtCA5","AIYUu0YAGH","W7cTsRkQke","MmsIoHRxd8","a00b5yvOMI",
+"G1RhS5Mg9r","tjQxs24ARF","vLsmS0YAGH","djsrvsx5Gl","v8yFNKsjRK","x3LDenlaBy","Dz1R3uZPqg","i7WMQBGaQY","k85AeVprf2","pFrrlogLgc",
+"1v5hH0YAGH","JkzUnFLsph","e6e4zXyPZN","FGzgpFjHXR","vLsmS9rlg9","djsrvatef2","QnJ1S0YAGH","WaWsv1v5hH","AIYUuIn3NS","LewvMAXpwE",
+"PYBf4DLhzM","GXdoHnlaBy","zFgtBuupzk","a00b5suY4x","jtn0XVBjhz","KASQ8HzZT8","9iGoTVIlwP","ydG8UEOE1o","C2Ircix74r","DLhzMHP433",
+"PYBf4EOE1o","s93MlStlDJ","h1zcHpvgjS","gIYvECK5W7","4W0TlblLA9","64s8NjiVBP","OUqFM0YAGH","Mkgy8XyPZN","b29RJ6AFT0","RkQkeHzZT8",
+"Zv7z0a00b5","RpBQmKZamH","euZA5vLsmS","OUqFMP6bcg","LewvMZJTXH","SbRYyMm8si","TXQ0ZzFgtB","zbIYYJXljW","MojnPGrDg7","oGu6xru4UG",
+"fqypy8FmFH","ni2v1Ta8f6","618DijS1aj","7hyVvJJs5m","OUYuFSWfou","vkCHH1LB1L","gIYvECp3mZ","hSSvQzFgtB","CNHmvhYBCK","mz8gxChuy3",
+"RkQkeWMiS3","jiVBPdhSuH","ZJTXHM6qcG","9rlg9ReKEW","GrDg7AkKTk","4W0TlOxWIH","e6e4zO3iyQ","Oz8yZksJby","3weIF9eoRc","BbwgAhe9IA",
+"K4GS8FFDui","yluBx7ku1p","CK5W7Yw2oU","EdBKcuJScX","Twano2Yz7E","ix74rAmdQd","8U2nU2Nslm","QbxXcVIlwP","580YD2Nslm","XyPZNcShY2",
+"nnP8oEoToP","C2Irc2Yz7E","9eoRcWreyP","qQxHP14FLR","lViBvRsQUq","VerEACdyBV","0MR5XcmXIX","uPX7Gs93Ml","Mm8siGSQwj","Y1mC0ru4UG",
+"GSQwjW7cTs","Zv7z09eoRc","55rfB0PktI","BFkb807n1c","UlU3MblLA9","Fhtglulk41","1LB1LjiVBP","7hyVvMaJQs","CdyBVWmadA","ydG8Ud85a9",
+"tAOsrlkMUA","RkQketAOsr","JXljWFhtgl","tuDySUlU3M","UlU3MG1RhS","AmdQd4QMc9","AkKTkQ6hMC","0ao3lHlUbF","y94nwfmIK1","zY1GYulk41",
+"MojnPTXQ0Z","xReechE1Ql","AmdQd0Kyfs","SmGzvJ2mQi","ThjNnK4GS8","gtCA5ZzJHW","uvf7AfmIK1","HP433zbIYY","8FmFH29QAz","DQimps7Mxk",
+"WreyPQnJ1S","5drc6qUJMd","DG4sTMojnP","8xEKzpWiOs","he9IAFFDui","lweGyrKDLJ","SbRYyUlU3M","cmXIXmz8gx","5NammXflUq","wDajXOxWIH",
+"h1zcH1j5L8","JkzUnCNHmv","tuDySsqVrf","tl72WW3VFH","5VZjSNxx9V","Ta8f6jS1aj","FPfSEMGlTF","WDVWJfLNg8","8RCUAru4UG","618Dik85Ae",
+"MojnPhe9IA","t98iWMkgy8","QnJ1SRpBQm","No0QbJRJQB","XflUqMezSW","Kr8ysyluBx","pv0i7ksJby","W3VFH7fKYU","t98iWiKqhr","iB08li7WMQ",
+"nFqikJkzUn","X6PinZ4I1v","VIlwPazIWp","IBe8kyofH3","0KyfsKZamH","4dEz6OUqFM","sqVrf7Ow5C","zqH0WKZamH","soy9teuZA5","NhXduWaim6",
+"WaWsvGrDg7","AgJHQRACuj","pT8wuZhwG1","pWiOsuN6r3","hYBCKhi5X7","ThjNniwzGk","uoStw8hJdt","ZuDtDRsQUq","7X3uy7ku1p","cmXIXEdBKc",
+"EoToPwiHrZ","uoStwBpYhV","Y1mC0guMb8","VerEA8FmFH","v2eC37ku1p","KsjRKBCxeC","In3NSGWqqX","ksJbyBbwgA","Uvlv4MmKGJ","tAOsruJScX",
+"iB08luQIcz","45cIHFNYIM","kZANmciuWz","aez9yIKxdL","bZLvSyluBx","0KyfsZuDtD","mX2GEYOfrY","qUJMd9iGoT","lpF6WVLTy6","kB5nP64s8N",
+"GWqqXzQt6Q","a00b5zHF1q","D6rBy7Ow5C","FnPFBWmadA","lweGylsQGo","07n1c9iGoT","Yh1hFjSjS3","55rfBhi5X7","ZzJHW14FLR","gtCA5S77LH",
+"vkCHHMojnP","5ZaEzhUTw7","FjHXRHzZT8","iKqhrYOfrY","FGzgpL7cGc","gdQsS16lHc","euZA5GrDg7","1LB1LzY1GY","3otm6lH1kt","OUYuFiB08l",
+"hi5X7FjHXR","OUYuF7fsYM","48cHLlj07Q","FGzgpFFDui","qQxHPx3LDe","7Ow5CwiHrZ","xXTI4uupzk","Cfgr3FNYIM","P6bcgzQt6Q","jzUqR9iGoT",
+"taOXKWmadA","iKqhrQworu","zz4ZUZzJHW","l83UdHlUbF","GSQwj07n1c","pvgjSrKDLJ","VjCZqyvOMI","JXljWPYBf4","uJScXyofH3","FGzgpo8Uyd",
+"2TRI7jzUqR","v8yFNCxVEf","lH1kt2ZHdk","iB08lDLhzM","rhl0JEdBKc","dmoS7WMiS3","Q6hMCIjTwP","jSjS3AkKTk","OHaBz580YD","d7vjMOHaBz",
+"Yf2Ecv1Hln","JKWYRQYxC0","l83UdDQimp","pvgjSDQimp","jiVBP618Di","azIWpWreyP","Zv7z0LewvM","uPX7GhSSvQ","JRJQBGXdoH","M6qcGMGlTF",
+"6AFT0pvgjS","VLTy6U3yw5","TCgPpKZamH","Cp3mZ1LB1L","yofH3RkQke","0Wr5yTCgPp","Mkgy8atef2","jtn0X8FmFH","EdBKcReKEW","ZUnqtZhwG1",
+"rKDLJDQimp","uZPqgD6rBy","3otm6tjQxs","QworuJ2mQi","wDajXSbRYy","blLA9v8yFN","lj07QRBhp0","lm0pDl83Ud","I7p2a5Mg9r","7fKYUguMb8",
+"DcpWBQ6Lix","OUYuFThjNn","8TxD7M6qcG","ZJTXHQ6hMC","WaWsv5Namm","1v5hH4QMc9","mX2GEhe9IA","dmoS7taOXK","Vprf2FxX9q","hSSvQO3iyQ",
+"CK5W76AFT0","FNYIM0MR5X","oVQp6uvf7A","Yw2oUI7p2a","FNYIMFFDui","45cIHTwano","ECMvUhYBCK","d85a9mz8gx","8FmFHjfREu","mX2GEuAWyp",
+"b29RJU3yw5","ogLgcQbxXc","i7WMQQ6Lix","Ta8f6BbwgA","FNYIMRpBQm","dmoS7azIWp","W7cTsSWfou","2NslmtAOsr","24ARFv8yFN","Q6hMCFNYIM",
+"SWfouhUTw7","0KyfsuN6r3","IRh48v2eC3","FFDuiUl4a1","Dz1R3Chuy3","WmadAwDajX","oGu6x8U2nU","sx5Gl5Mg9r","piJSk24ARF","tjQxsQWxoT",
+"EdBKco8Uyd","2Yz7EqQxHP","RzaZA7fsYM","lj07QBCxeC","VIlwPs7Mxk","07n1cUvlv4","dmoS7prNT6","yofH3OUYuF","qaofNKsjRK","NcICA2ZHdk",
+"KASQ89GXkX","jSjS35iGN5","aFFssTCgPp","fmIK1piJSk","W7cTsfmIK1","8RCUA3otm6","JJs5mjS1aj","iqv4khe9IA","CNHmv5nmWv","lH1ktXyPZN",
+"jfREuoQ87r","CqqaDRmDcr","8cVD3ZhwG1","SjskQUmaEv","zQt6QblLA9","uAWypKsjRK","JKWYR45cIH","BpYhVNo0Qb","pT8wukZANm","hSSvQ1v5hH",
+"xciqpYw2oU","WaWsv55rfB","5iGN5s7Mxk","5IhmG0h1b1","In3NSMaJQs","suY4xMmKGJ","yofH3Qworu","Oz8yZ55rfB","9y4lwCNHmv","Ss0Zu64s8N",
+"kB5nP5IhmG","lViBv7Ow5C","pv0i7v8yFN","Gv3FqYOfrY","jeskSkZANm","8U2nUyToGW","0BmCyY1mC0","0PktIFNYIM","BbwgANcICA","ni2v1xXTI4",
+"x3LDesuY4x","zHF1qFGzgp","HfyNQG1RhS","NAFuw2TRI7","IjTwPBpYhV","2DREsY1mC0","FwEJznlaBy","qaofNni2v1","5iGN5rhl0J","faHir2hEEU",
+"oQ87rtjQxs","oVQp68xEKz","tAOsrokgRi","lweGym4bxU","ydG8Uk85Ae","yluBxbrhlQ","MK07Ygf8rI","n1pmOulk41","4dEz6Q6Lix","8RCUADz1R3",
+"LDk6f580YD","2TRI7NcICA","uZPqgyToGW","Q6LixLewvM","v8yFNNhXdu","G1RhSChuy3","lj07QfaHir","RsQUqAgJHQ","a00b50Wr5y","LbRTH1LB1L",
+"uN6r3Ul4a1","Q6LixW3VFH","Dz1R3EoToP","5ZaEzsqVrf","FPfSEciuWz","FwEJzM3zXL","P6bcgvLsmS","StlDJEOE1o","Uvlv4ZuDtD","uN6r3M3zXL",
+"4W0TlAmdQd","G1RhSuN6r3","lweGyFLsph","GSQwjFLsph","aDGtSBFkb8","lsQGoFGzgp","POUYSnlaBy","5nmWvwiHrZ","JIqXioQ87r","WPmlxxReec",
+"pv0i7lH1kt","pAhR1lH1kt","QbxXcwDajX","sx5Gliqv4k","5Namm9eoRc","QbxXcJIqXi","fLNg8TCgPp","KsjRK2Yz7E","lpF6W3weIF","tAOsrfqypy",
+"n1pmOAkKTk","2DREs8U2nU","dhSuH07n1c","CqqaD0YAGH","KsjRKv1Hln","OxWIHhe9IA","EOE1oJ2mQi","Y1mC0JkzUn","lweGy1j5L8","POUYSpmeCd",
+"qaofNKr8ys","RsQUqVIlwP","Mkgy8Vprf2","kB5nPgdQsS","CdyBVy94nw","cmXIX2ZHdk","gf8rInnP8o","yofH3okgRi","ydG8UcQOnv","iB08lZzJHW",
+"NhXduHlUbF","n8pJ9Mm8si","I7p2aFhtgl","XflUq2ZHdk","Cp3mZYf2Ec","MmKGJIjTwP","MGlTFy94nw","QworuLewvM","soy9t0h1b1","FxX9qI7p2a",
+"uTacxd85a9","8RCUAb29RJ","iKqhrKr8ys","VjCZqNcICA","U3yw5BbwgA","O3iyQyToGW","d85a9fFDrJ","5Mg9rQ6Lix","kB5nPwDajX","U3yw5S77LH",
+"lXFOBQClRL","ulk41KsjRK","oQ87r07n1c","hi5X7D6rBy","dpe1vW7cTs","he9IACIShG","yluBxhUTw7","5IhmGJIqXi","s4786dhSuH","0h1b1XyPZN",
+"cL0aEjfREu","ZuDtDW3VFH","iB08l7fKYU","zFgtBYw2oU","8TxD7faHir","pT8wutaOXK","RxrsmHlUbF","7fKYUAXpwE","GrDg7GrDg7","9GXkXdQ586",
+"Q6LixCfgr3","NOHszVLTy6","hi5X75Mg9r","ciuWzk85Ae","Ss0ZuFLsph","KZamHtjQxs","HlUbFkZANm","s7Mxkaez9y","580YDiB08l","HfyNQlj07Q",
+"7hyVvuupzk","jiVBPhE1Ql","0PktIJKWYR","XflUqThjNn","0PktIdhSuH","lkMUAo8Uyd","AgJHQCp3mZ","QnJ1SB3qem","ZzJHWZzJHW","l83UdPYBf4",
+"i7WMQ9rlg9","NOHszwiHrZ","uN6r3EOE1o","lm0pD5ZaEz","WaWsvF6PT2","HfyNQsx5Gl","i3pydbgJAz","uN6r3s7Mxk","Yw2oU9XyT9","h1zcH0ao3l",
+"ulk41aL6AJ","soy9t55rfB","55rfBdhSuH","fcJOyb29RJ","NhXduEoToP","8RCUAMaJQs","uZPqgRkQke","pvgjSDz1R3","lH1kttl72W","5iGN5CdyBV",
+"t59lRX6Pin","9iGoTQ6Lix","8RCUAfLNg8","kZANm1v5hH","zqH0WydG8U","VBjhzXflUq","cQOnvblLA9","VBjhzFnPFB","RpBQmiB08l","xciqpHfyNQ",
+"nnP8ozFgtB","Vprf2OUqFM","oGu6xsqVrf","2TRI7xReec","7Ow5CpmeCd","3otm6yvOMI","EdBKcmz8gx","Waim6MGlTF","29QAzuJScX","BpYhVXflUq",
+"atef2CK5W7","F6PT2HRxd8","v2eC3P6bcg","8U2nUSbRYy","pv0i7fcwDa","lm0pD5drc6","3weIF29QAz","DcpWB2Yz7E","bZLvSYjB9t","dQ586fLNg8",
+"BGaQYQnJ1S","2NslmdmoS7","yvOMI9y4lw","brhlQWaim6","FcWrWzHF1q","4QMc93otm6","zY1GYuPX7G","RBhp0i3pyd","VjCZqlj07Q","14FLRhUTw7",
+"FjHXRQChxs","sx5GlHzZT8","VerEAVerEA","zQt6QjfREu","IjTwPECMvU","CK5W72Nslm","uN6r3MojnP","tlILtCK5W7","580YDG1RhS","vLsmSWMiS3",
+"fcwDaEdBKc","brhlQk85Ae","B3qemdpe1v","Y1mC0Zv7z0","1v5hHNo0Qb","StlDJo8Uyd","8FmFHRBhp0","MmsIot59lR","5drc6Mm8si","oVQp6zY1GY",
+"SbRYyNAFuw","xReecOUqFM","FnPFBVerEA","Oz8yZ9eoRc","uLtKsvLsmS","MojnP1LB1L","PYBf4uvf7A","5VZjSS2Dfu","QClRLRmDcr","SWfouWreyP",
+"AIYUu7fKYU","vOqCEfaHir","X6Pinhi5X7","FVMxo5drc6","WPmlxhE1Ql","OUqFMlXFOB","BGaQYatef2","S77LHFFDui","5Drn0fFDrJ","JJs5m9y4lw",
+"faHirWreyP","9rlg9QssNC","pWiOsAgJHQ","VIlwPd85a9","FLsphgIYvE","I7p2ahE1Ql","Yw2oUmz8gx","MezSWru4UG","HzZT8Zv7z0","M6qcGlweGy",
+"jfREu0Wr5y","WMiS3C2Irc","fcJOyG1RhS","jeskS0YAGH","uJScXVLTy6","cShY28TxD7","sqVrfReKEW","8RCUAYh1hF","FwEJzOxWIH","EoToPjzUqR",
+"Cfgr3DcpWB","k85AegtCA5","y94nw14FLR","D6rByyluBx","HRxd8gtCA5","Waim6s4786","WreyPyEfy9","64s8N5drc6","Cfgr3lkMUA","NcICAk85Ae",
+"Qworux3LDe","9GXkXRzaZA","x3LDeKZamH","PYBf4OUYuF","4QMc9NcICA","FxX9qzFgtB","dQ586tvdkD","ReKEW8RCUA","jzUqRFcWrW","i3pydBbwgA",
+"yToGWLewvM","Vprf2CIShG","JRJQBHlUbF","OUYuFSmGzv","AIYUuUl4a1","VjCZqv1Hln","5Drn0RzaZA","prNT6M3zXL","IjTwPfmIK1","6q6L9Gv3Fq",
+"9XyT9a00b5","cL0aEblLA9","HP433m4bxU","KZamHNAFuw","PYBf4lkMUA","0KyfsCfgr3","9XyT9faHir","lsQGoiqv4k","WMiS35Drn0","FhtglsuY4x",
+"S77LHWMiS3","tl72W5Mg9r","WaWsvru4UG","M3zXLcShY2","uJScXhi5X7","prNT6GXdoH","uupzkGXdoH","Mkgy8BGaQY","FLsphulk41","FFDuidQ586",
+"QworuuTacx","0YAGHSWfou","uPX7G2DREs","QClRLZv7z0","v2eC35iGN5","VBjhziKqhr","TXQ0ZZv7z0","h1zcHUvlv4","QClRLfcJOy","0PktI0Wr5y",
+"MGlTF7lUXZ","DLhzMCp3mZ","aL6AJJRJQB","45cIH5Drn0","jfREuix74r","9iGoTStlDJ","jS1ajzFgtB","ciuWzO3iyQ","55rfB7Ow5C","5drc6Twano",
+"fmIK1vOqCE","lpF6WVBjhz","AXpwEs4786","Y1mC0hSSvQ","RACuj4QMc9","oGu6x6AFT0","MojnPRsQUq","pAhR1mX2GE","cL0aEuJScX","Waim6guMb8",
+"RkQkei3pyd","Y1mC0uvf7A","fLNg89iGoT","QClRLRACuj","pAhR1SWfou","Ul4a1pmeCd","HRxd8lH1kt","gjUTuprNT6","5drc6atef2","MojnPeuZA5",
+"Ss0ZucL0aE","24ARFxXTI4","UlU3Md7vjM","RkQkeZJTXH","MojnPRmDcr","PYBf4QnJ1S","WMiS3Y1mC0","aFFssuPX7G","d7vjMHRxd8","8xEKzx3LDe",
+"hYBCKRACuj","K20wKyvOMI","0BmCyydG8U","Oz8yZ4W0Tl","S77LHDz1R3","cL0aEVerEA","QbxXcgdQsS","8U2nU9rlg9","Q6LixU3yw5","h1zcHuJScX",
+"gjUTukZANm","Q6Lix2TRI7","QWxoTaDGtS","hSSvQatef2","uJScX16lHc","0YAGHRkQke","CqqaDJIqXi","iwzGkGXdoH","DcpWBAOgEe","WmadANhXdu",
+"fmIK1gtCA5","VBjhzZuDtD","o8UydMkgy8","5drc6faHir","P6bcgY1mC0","CIShGcShY2","AgJHQrz7Ut","Yh1hFWaim6","t59lR5nmWv","NAFuw5iGN5",
+"SWfou5iGN5","K20wKG1RhS","iKqhr3otm6","BpYhVJkzUn","6q6L9i7WMQ","ThjNnsoy9t","RACujlweGy","5VZjSFPfSE","brhlQlXFOB","ZUnqtVNCPd",
+"Cp3mZ1j5L8","v2eC39y4lw","okgRiVNCPd","yEfy9Ul4a1","IRh48CK5W7","ksJbytuDyS","lkMUAm4bxU","VLTy6FLsph","DLhzMEdBKc","pFrrl6AFT0",
+"S2Dfu14FLR","uupzklj07Q","AIYUuksJby","lXFOBRBhp0","ZJTXHOUqFM","5drc6QYxC0","x3LDeOUYuF","v1Hlnsoy9t","EoToP5nmWv","wDajXBFkb8",
+"lH1ktIjTwP","zmLYDvOqCE","55rfBWaWsv","jeskSTwano","jzUqR9eoRc","5IhmGPb1pa","aDGtSOHaBz","tAOsrMGlTF","cQOnv4QMc9","8FmFHl83Ud",
+"faHir9y4lw","1LB1L3weIF","iwzGkI7p2a","uTacxJIqXi","jiVBPChuy3","ZUnqtfqypy","Qworu0MR5X","dpe1vZJTXH","0Kyfsaez9y","wDajX9eoRc",
+"zFgtBaDGtS","LewvMXyPZN","d85a9lweGy","ThjNnMkgy8","k85Aefqypy","EOE1oCxVEf","0BmCyFLsph","OHaBzGSQwj","FLsphSmGzv","VIlwPjtn0X",
+"0ao3lsoy9t","sqVrfy94nw","DQimpKsjRK","piJSksuY4x","jSjS3SjskQ","yluBxpv0i7","O3iyQReKEW","fcJOyy94nw","SjskQJkzUn","JIqXitaOXK",
+"uJScX0YAGH","djsrv7fKYU","bZLvSMaJQs","PYBf4soy9t","jiVBPNcICA","5Mg9rQbxXc","fcwDaMezSW","SWfoulj07Q","uvf7AuAWyp","5nmWv9y4lw",
+"FhtglbrhlQ","I7p2awDajX","hi5X7618Di","i7WMQMGlTF","AmdQd5Mg9r","HzZT8lXFOB","HlUbFrhl0J","CNHmvFxX9q","zz4ZUAOgEe","8TxD7OUYuF",
+"J2mQi24ARF","CIShGdpe1v","jtn0XMkgy8","ix74rK4GS8","pFrrl2Yz7E","16lHcBbwgA","iKqhrPOUYS","lkMUARkQke","ix74rlweGy","v8yFNkZANm",
+"LbRTHzY1GY","BbwgAX6Pin","brhlQuPX7G","ni2v1uTacx","TCgPpxciqp","rhl0JJ2mQi","IjTwPMmKGJ","Yf2EcblLA9","JkzUnUlU3M","JIqXio8Uyd",
+"Q6Lix8RCUA","mX2GE2Nslm","zQt6Q0MR5X","RxrsmTa8f6","B3qemYf2Ec","iqv4kRsQUq","i3pydyEfy9","J2mQiEdBKc","1v5hHwDajX","RkQkedjsrv",
+"MK07YgIYvE","jtn0Xuvf7A","M3zXL7ku1p","OxWIHK20wK","MezSWbrhlQ","pAhR1qUJMd","faHirRpBQm","JXljWvOqCE","D6rByCK5W7","TCgPpJXljW",
+"vkCHHHRxd8","XflUqVBjhz","kB5nPEoToP","Nxx9Vh1zcH","Gv3FqCqqaD","guMb8In3NS","Y1mC0VIlwP","POUYSKZamH","i7WMQiwzGk","W7cTsNo0Qb",
+"uZPqglweGy","D6rByQWxoT","fcwDauupzk","djsrvHfyNQ","fFDrJlj07Q","wDajXRzaZA","pvgjSdjsrv","AkKTkfmIK1","Gv3Fqpv0i7","mz8gxguMb8",
+"GWqqXjeskS","OUqFMpv0i7","qaofNxciqp","0ao3lFjHXR","okgRi7hyVv","B3qemVjCZq","wiHrZeuZA5","BGaQYIBe8k","NOHszMezSW","OxWIHaFFss",
+"xReeckB5nP","LbRTHydG8U","B3qemzQt6Q","580YDyvOMI","FPfSE2ZHdk","U3yw5QbxXc","kB5nPqQxHP","Uvlv47Ow5C","x3LDev2eC3","lViBvQnJ1S",
+"BpYhV9eoRc","RzaZA9XyT9","vOqCEuAWyp","lj07Q8FmFH","GSQwjuPX7G","JKWYRfLNg8","mz8gxt59lR","HfyNQ7ku1p","M3zXLmX2GE","s4786k85Ae",
+"1j5L824ARF","lm0pDQYxC0","lCMxyt98iW","iB08lO3iyQ","uAWypStlDJ","UlU3M2TRI7","lm0pDOHaBz","lweGypmeCd","580YDix74r","5Mg9rjeskS",
+"QClRLzQt6Q","gf8rI5ZaEz","zz4ZU5drc6","qUJMdjeskS","0h1b1lCMxy","DLhzMFwEJz","bZLvSblLA9","O3iyQWreyP","WmadAZzJHW","lsQGogIYvE",
+"ThjNn9rlg9","kZANmNAFuw","Cp3mZQClRL","MGlTF1j5L8","DQimpiKqhr","Gv3FqRxrsm","UlU3MMaJQs","yvOMIuPX7G","vkCHHvOqCE","pWiOszmLYD",
+"JIqXil83Ud","jiVBPi3pyd","DLhzMPYBf4","14FLRtAOsr","FLsph9rlg9","XyPZNmX2GE","okgRi9iGoT","X6PinRpBQm","POUYS7X3uy","DcpWBNAFuw",
+"hUTw72Nslm","VBjhzpAhR1","EoToP7lUXZ","ZzJHWYf2Ec","RBhp0Nxx9V","VjCZqcQOnv","RmDcrGv3Fq","9GXkXCfgr3","iwzGkpWiOs","9eoRc14FLR",
+"HRxd8bZLvS","Ta8f6S77LH","t59lRo8Uyd","5VZjSQ6hMC","8TxD7BCxeC","45cIH7ku1p","9GXkX9XyT9","Ta8f6d85a9","FPfSEMm8si","No0QbQYxC0",
+"FNYIMguMb8","YjB9tMaJQs","s7MxkkB5nP","XyPZNuTacx","lm0pDlsQGo","jtn0XSbRYy","AgJHQyvOMI","CNHmvB3qem","nFqikuPX7G","5VZjS1v5hH",
+"WmadAfcJOy","Y1mC0l83Ud","uLtKsSs0Zu","5Mg9r8RCUA","fFDrJgdQsS","IjTwPDQimp","SmGzvcmXIX","29QAzIjTwP","ECMvUVLTy6","uTacxFGzgp",
+"580YDXflUq","faHirlj07Q","ZuDtD4W0Tl","S77LHfFDrJ","MGlTFv8yFN","DcpWBTXQ0Z","5drc69rlg9","C2IrcJRJQB","lXFOBksJby","M3zXLNOHsz",
+"9GXkXIKxdL","ix74rjSjS3","soy9thYBCK","K20wKgjUTu","BpYhVDz1R3","ZJTXHzbIYY","LbRTHZUnqt","uoStwK4GS8","FPfSE0PktI","zQt6QHRxd8",
+"AgJHQix74r","SmGzv8hJdt","okgRiHlUbF","kZANmbrhlQ","iqv4kCIShG","Fhtglsx5Gl","QnJ1SKsjRK","SmGzviKqhr","FVMxoZ4I1v","VNCPdKASQ8",
+"pFrrlO3iyQ","29QAzK4GS8","DcpWBlj07Q","Chuy3x3LDe","gdQsSTCgPp","AXpwESbRYy","0YAGHbZLvS","Yh1hF8xEKz","lsQGoYf2Ec","OxWIHwDajX",
+"D6rByoGu6x","WaWsvIBe8k","h1zcHHlUbF","UmaEvlXFOB","QbxXcyluBx","ZhwG1Uvlv4","TCgPpEdBKc","aFFss580YD","DQimpcQOnv","lH1kt5IhmG",
+"4dEz6SjskQ","55rfBYw2oU","v8yFN2Yz7E","W3VFHRzaZA","xXTI4lkMUA","BpYhVqQxHP","kZANmzY1GY","P6bcgJkzUn","TXQ0ZRACuj","S2DfuoQ87r",
+"5VZjSUvlv4","5ZaEzuLtKs","zbIYYMojnP","RxrsmW3VFH","O3iyQWPmlx","vLsmSlm0pD","8hJdtjSjS3","WDVWJiB08l","IBe8kHlUbF","ru4UGIKxdL",
+"vkCHHL7cGc","6AFT0KASQ8","DG4sT2DREs","2NslmCIShG","lkMUA4dEz6","i3pyd0PktI","ZhwG1bgJAz","CNHmv14FLR","SmGzv0Wr5y","x3LDe9GXkX",
+"DLhzM1LB1L","In3NSMmKGJ","GXdoH8TxD7","JRJQBZ4I1v","EoToPJKWYR","pvgjSxciqp","ix74rcQOnv","QYxC0JIqXi","n1pmOcL0aE","K20wKWmadA",
+"M6qcGCIShG","piJSkQbxXc","9XyT9EdBKc","WreyPuTacx","Ss0ZufaHir","CK5W71j5L8","wiHrZ2Yz7E","Zv7z0ZzJHW","pvgjSZuDtD","azIWpNxx9V",
+"GWqqXLewvM","BFkb8JkzUn","WPmlx5Drn0","BpYhVo8Uyd","lsQGoYw2oU","1j5L848cHL","7fsYMHP433","pmeCdd85a9","JXljWn8pJ9","KASQ8PYBf4",
+"dmoS7Q6hMC","64s8NK4GS8","suY4xfaHir","16lHcEoToP","lj07QkZANm","9iGoTksJby","8hJdt6q6L9","ksJbyDG4sT","qQxHPCfgr3","SWfouS77LH",
+"QnJ1SHP433","ru4UGL7cGc","yToGWNAFuw","d7vjM7fsYM","QClRLFFDui","d85a92DREs","8TxD7F6PT2","EOE1opWiOs","J2mQil83Ud","WreyPL7cGc",
+"lpF6W0ao3l","OUqFMYf2Ec","uoStws4786","NcICAOUqFM","PYBf4jS1aj","WaWsvlpF6W","OHaBzIKxdL","lH1kt2Nslm","RACujPOUYS","WmadAvOqCE",
+"wiHrZD6rBy","vLsmS0PktI","ECMvUBpYhV","i7WMQTXQ0Z","GXdoHIn3NS","5ZaEz5Mg9r","jiVBPlXFOB","FFDuidjsrv","FxX9qblLA9","Dz1R3VjCZq",
+"8FmFHPOUYS","HzZT8iqv4k","DLhzMM3zXL","uN6r3fLNg8","NOHszulk41","JIqXifFDrJ","48cHLFhtgl","zmLYDFNYIM","7fKYUOz8yZ","AOgEeogLgc",
+"piJSkh1zcH","WreyPDcpWB","L7cGcZv7z0","JJs5mxReec","6AFT0Z4I1v","s478629QAz","zFgtBn1pmO","nFqikru4UG","8FmFHsqVrf","Uvlv4Dz1R3",
+"NhXduuJScX","uvf7As93Ml","Mm8siPb1pa","bgJAz8U2nU","zz4ZUZUnqt","SmGzv5IhmG","pWiOslkMUA","nlaByi7WMQ","HfyNQZv7z0","v1HlnYf2Ec",
+"CIShGW7cTs","45cIHMK07Y","xciqpPOUYS","zbIYYReKEW","tlILtfcwDa","GrDg7Cp3mZ","RmDcrpWiOs","WreyPlH1kt","nFqikfmIK1","U3yw5lkMUA",
+"FnPFBpAhR1","J2mQiMaJQs","fcJOyjeskS","CNHmvzQt6Q","yEfy9sqVrf","No0QbaFFss","S2Dfu5nmWv","MGlTFJRJQB","s93MlNOHsz","ulk41LewvM",
+"sx5GlO3iyQ","yluBxAXpwE","O3iyQzHF1q","KASQ88TxD7","uTacxxReec","uJScXo8Uyd","Q6LixuTacx","v1Hln9y4lw","fLNg85IhmG","pAhR1d85a9",
+"t98iWl83Ud","ZJTXHtlILt","DLhzMGXdoH","jiVBP3weIF","45cIHDQimp","618DiWaim6","2DREsAXpwE","ni2v1b29RJ","VBjhzLbRTH","kB5nPtAOsr",
+"TwanoDLhzM","IKxdLHP433","nFqikcQOnv","7hyVvECMvU","JXljWzz4ZU","X6PinIRh48","hSSvQOUYuF","45cIHfmIK1","lsQGob29RJ","C2Ircru4UG",
+"jtn0Xjtn0X","qQxHPzmLYD","M6qcGhi5X7","Dz1R355rfB","QChxsoQ87r","OHaBzRpBQm","ZUnqtU3yw5","fFDrJ4W0Tl","BCxeC5nmWv","WPmlxJRJQB",
+"dQ586W7cTs","HP433Yh1hF","07n1ci3pyd","ru4UGCK5W7","lm0pDvLsmS","0PktINhXdu","Qworuaez9y","Zv7z05nmWv","hi5X7MaJQs","vkCHH4QMc9",
+"X6PinLDk6f","RkQkeFPfSE","9XyT95Mg9r","9eoRcpiJSk","9eoRc0MR5X","ZUnqtprNT6","5Namm2TRI7","Ta8f6yEfy9","Ul4a1AXpwE","W3VFH580YD",
+"5ZaEzwiHrZ","uoStwbrhlQ","iqv4kRBhp0","t98iWulk41","vOqCEtvdkD","zqH0WBFkb8","Gv3Fqjtn0X","LDk6fS2Dfu","OUqFMCNHmv","CqqaDU3yw5",
+"In3NSuupzk","okgRiLewvM","soy9tQnJ1S","lsQGoy94nw","8hJdtdmoS7","BCxeChi5X7","fmIK1oVQp6","IjTwPyToGW","FGzgpMmKGJ","ydG8UfcJOy",
+"zz4ZUF6PT2","F6PT2QssNC","taOXK9XyT9","lsQGo4W0Tl","rKDLJhe9IA","ZzJHWOUqFM","HlUbF1v5hH","djsrvfqypy","uQIcz7fKYU","7hyVvFwEJz",
+"SjskQ6q6L9","RBhp04dEz6","Mm8siMGlTF","NOHszzHF1q","mz8gxQClRL","BCxeCPb1pa","YOfrYni2v1","LbRTHNo0Qb","8cVD3rhl0J","B3qemdmoS7",
+"gtCA5P6bcg","2Yz7EydG8U","s4786uPX7G","0ao3lWMiS3","jS1ajWreyP","S77LHPOUYS","k85AeIjTwP","AkKTkHzZT8","jSjS3Nxx9V","tl72WFGzgp",
+"qUJMd7hyVv","HzZT8VBjhz","brhlQGrDg7","iB08ln1pmO","W7cTss93Ml","NcICAnFqik","1LB1LJkzUn","4dEz6BCxeC","pT8wud7vjM","wiHrZHlUbF",
+"pFrrll83Ud","JIqXiAIYUu","F6PT2FxX9q","ulk4124ARF","sx5GluZPqg","Y1mC0dQ586","lCMxyatef2","VerEARxrsm","Nxx9VAXpwE","yofH3QWxoT",
+"yluBxcL0aE","qUJMdB3qem","suY4xTCgPp","7ku1ppAhR1","No0QbKASQ8","Ta8f6lpF6W","7hyVvmX2GE","Mkgy8ksJby","yofH3zmLYD","55rfBMmKGJ",
+"pFrrlJJs5m","CqqaD14FLR","UmaEvRsQUq","07n1cjzUqR","K4GS8OxWIH","0Wr5yTXQ0Z","5Mg9rydG8U","IjTwPuPX7G","zz4ZUFVMxo","SWfouhSSvQ",
+"VLTy6uQIcz","U3yw54W0Tl","8FmFHvOqCE","AIYUu5Drn0","gjUTuMmsIo","Dz1R3dpe1v","lCMxyFFDui","mz8gxn8pJ9","QChxstlILt","8U2nUTa8f6",
+"zHF1qjSjS3","ThjNngjUTu","jiVBPDLhzM","QYxC064s8N","9GXkXeuZA5","RxrsmMmsIo","iB08l7X3uy","Kr8ysDz1R3","SWfouKr8ys","1LB1LIRh48",
+"pv0i7WDVWJ","OUYuFRmDcr","pT8wusoy9t","uZPqgiB08l","AXpwEFxX9q","AOgEe9y4lw","dpe1vUvlv4","WPmlxLewvM","48cHLX6Pin","2Yz7EdQ586",
+"gf8rIReKEW","0MR5XThjNn","zHF1qru4UG","rKDLJBGaQY","Mkgy816lHc","0Kyfs6AFT0","3otm6mX2GE","64s8NuoStw","gIYvEkB5nP","xciqpFxX9q",
+"EoToPW3VFH","suY4xpmeCd","ZuDtDaez9y","FjHXRFcWrW","9y4lwo8Uyd","n1pmOwDajX","n8pJ9AmdQd","qQxHP5nmWv","KZamHk85Ae","EdBKci3pyd",
+"yToGWRBhp0","YOfrYt98iW","jS1ajuN6r3","vOqCEzY1GY","lViBvHlUbF","aDGtSBpYhV","CqqaDfFDrJ","UmaEviqv4k","CqqaDJKWYR","pFrrluupzk",
+"GSQwjv2eC3","RzaZAL7cGc","O3iyQmz8gx","JJs5mgtCA5","MmsIoblLA9","VerEA8TxD7","FVMxoJJs5m","CIShGHzZT8","5Drn0FnPFB","MK07YJJs5m",
+"atef2sqVrf","ECMvUcShY2","sqVrfG1RhS","7X3uyWaWsv","VNCPd7Ow5C","Nxx9V4dEz6","Y1mC0FFDui","TwanobZLvS","LbRTHgdQsS","guMb8GSQwj",
+"WMiS3K20wK","mz8gxRACuj","J2mQiQClRL","sx5GlLbRTH","8cVD3VNCPd","zz4ZUpvgjS","h1zcHZUnqt","2hEEUDLhzM","uN6r3lj07Q","Q6Lixv1Hln",
+"i7WMQfaHir","BFkb8F6PT2","Zv7z0EoToP","cL0aEpFrrl","8TxD70YAGH","BCxeC5drc6","uJScXJRJQB","MGlTFYjB9t","uvf7AQssNC","IBe8kciuWz",
+"ksJbyAXpwE","s4786ZuDtD","y94nwzmLYD","8hJdtuAWyp","SjskQ55rfB","yEfy9gjUTu","y94nwGWqqX","CdyBVFLsph","xXTI4HzZT8","0ao3lRkQke",
+"AgJHQ0PktI","VNCPdGWqqX","pv0i75Drn0","0ao3l29QAz","JIqXigjUTu","iKqhrOUYuF","YjB9t5Mg9r","7ku1pChuy3","5drc6jeskS","jtn0XXyPZN",
+"ogLgcBFkb8","xReecX6Pin","guMb88U2nU","zQt6QCp3mZ","yofH3DcpWB","bZLvSydG8U","8xEKzlm0pD","Oz8yZeuZA5","ThjNnpFrrl","MaJQsvLsmS",
+"b29RJLDk6f","oGu6xJIqXi","ksJbytvdkD","No0Qbni2v1","hSSvQPOUYS","Waim6AmdQd","JXljWlXFOB","ydG8UCdyBV","RBhp0J2mQi","zY1GY5drc6",
+"YOfrYjfREu","zHF1qdhSuH","Waim6SbRYy","1j5L80Kyfs","0Wr5yn8pJ9","FVMxonlaBy","lkMUAuQIcz","HP433LbRTH","VLTy67fsYM","VIlwPvOqCE",
+"618DiAOgEe","fcJOy45cIH","Y1mC0Cfgr3","C2IrcAXpwE","2TRI7JXljW","0KyfsNhXdu","ydG8UzbIYY","JRJQBU3yw5","BCxeCNxx9V","StlDJUmaEv",
+"QClRLlm0pD","lsQGo0MR5X","s93MlpAhR1","LewvMBbwgA","t98iWi3pyd","5Drn0QnJ1S","Chuy314FLR","ZhwG1WDVWJ","uvf7AVprf2","cShY20Kyfs",
+"pmeCdUmaEv","AkKTk0Kyfs","oGu6xZzJHW","xXTI40PktI","F6PT2Z4I1v","zFgtBBCxeC","uAWypzY1GY","RpBQm1LB1L","jS1ajFVMxo","tjQxsSWfou",
+"B3qemt59lR","Oz8yZUmaEv","8U2nUlXFOB","CIShGqaofN","hYBCKxReec","9iGoTxciqp","IBe8kVIlwP","Ul4a17Ow5C","5IhmG2Yz7E","F6PT2OHaBz",
+"ReKEWe6e4z","fcwDad7vjM","M3zXLOHaBz","1v5hHatef2","VerEAru4UG","uLtKsdQ586","iqv4km4bxU","dhSuHbZLvS","ciuWzXflUq","FGzgp8U2nU",
+"YjB9tCIShG","Dz1R39XyT9","zmLYDv1Hln","Yw2oUgIYvE","uAWypiB08l","blLA99GXkX","7fsYMmz8gx","5NammNhXdu","KASQ8cShY2","AkKTkNxx9V",
+"BpYhV5ZaEz","s4786iqv4k","Mkgy8PYBf4","B3qemfqypy","Q6hMCFwEJz","zz4ZUHP433","NhXduFxX9q","rz7Ut7hyVv","WmadAQbxXc","uAWypatef2",
+"55rfBpWiOs","ZUnqtCxVEf","fcJOyZJTXH","jfREu2DREs","JIqXibrhlQ","o8Uyd5VZjS","pT8wuhYBCK","618DiGWqqX","8xEKz9GXkX","L7cGcChuy3",
+"zz4ZUlViBv","Chuy3P6bcg","FPfSEZUnqt","k85Ae55rfB","HlUbFlsQGo","MGlTFPb1pa","FjHXRsuY4x","TCgPpFNYIM","OHaBzOUYuF","lH1kts7Mxk",
+"EoToP2Nslm","45cIHgtCA5","cShY245cIH","6q6L9WreyP","EOE1oo8Uyd","cmXIXn1pmO","ECMvUjfREu","d85a9qQxHP","S2DfupT8wu","WmadALewvM",
+"9eoRc0YAGH","29QAz5drc6","kB5nPpmeCd","dmoS7F6PT2","Mkgy8FGzgp","Q6LixyToGW","7fKYUv1Hln","6q6L9SbRYy","fmIK1ksJby","rz7UtNOHsz",
+"9y4lwHzZT8","HlUbFdhSuH","wiHrZblLA9","5NammEdBKc","mX2GENhXdu","n8pJ9uAWyp","LDk6f5Namm","ni2v1prNT6","M3zXLtl72W","ni2v1QWxoT",
+"5IhmGXyPZN","dmoS7VerEA","hi5X7HP433","0BmCyThjNn","QYxC0QbxXc","AOgEe5IhmG","MK07YCdyBV","FcWrWtuDyS","s7MxkHzZT8","O3iyQ4QMc9",
+"55rfBe6e4z","X6Pin6q6L9","DG4sTkZANm","bgJAztlILt","i3pydBpYhV","G1RhSrhl0J","a00b5AkKTk","MezSWHP433","RACuj45cIH","i7WMQWmadA",
+"BGaQYiKqhr","soy9tMGlTF","FwEJzOUYuF","FwEJzuQIcz","MGlTFReKEW","5Drn0ZzJHW","tl72WZ4I1v","gIYvE0h1b1","Y1mC09rlg9","ZuDtDIKxdL",
+"618Diix74r","RmDcrtlILt","9rlg9LewvM","JIqXi7hyVv","JIqXifcwDa","Z4I1va00b5","AXpwE7fsYM","jS1ajmz8gx","6AFT03otm6","e6e4zRxrsm",
+"soy9tt98iW","RsQUqNOHsz","t59lRiB08l","0h1b19XyT9","iwzGkHRxd8","s4786G1RhS","IKxdLIjTwP","t59lRjfREu","iKqhr1v5hH","qQxHPAgJHQ",
+"POUYSwiHrZ","7fsYMJRJQB","SmGzvQbxXc","4dEz6MmKGJ","fmIK11j5L8","MaJQspmeCd","k85AeuQIcz","kZANmNOHsz","J2mQim4bxU","48cHLiKqhr",
+"WmadARkQke","k85Aen8pJ9","i3pydQbxXc","0MR5XIKxdL","zY1GYVprf2","faHirHzZT8","JXljWlweGy","KASQ8SmGzv","1j5L8AkKTk","G1RhSDcpWB",
+"0Wr5yiKqhr","Gv3Fq0YAGH","ZhwG13weIF","8xEKza00b5","48cHLZUnqt","0KyfsZJTXH","zFgtBZhwG1","5nmWvrhl0J","16lHcXflUq","iKqhrFLsph",
+"zz4ZUTCgPp","8TxD7iwzGk","DQimpRACuj","Nxx9Vjtn0X","Y1mC0Ta8f6","YOfrYUmaEv","0BmCyulk41","yvOMIS2Dfu","tAOsrVIlwP","gIYvEHP433",
+"VerEAnFqik","gf8rIKZamH","brhlQQClRL","s4786tuDyS","2Nslm2DREs","8U2nUhE1Ql","8xEKzsx5Gl","AXpwEUl4a1","5ZaEzYw2oU","dhSuH2Nslm",
+"QWxoTAXpwE","0MR5XMezSW","pT8wuJKWYR","2hEEU55rfB","MK07YVprf2","NcICAjS1aj","ReKEWDz1R3","RzaZAyluBx","FNYIMfLNg8","v1Hln9rlg9",
+"HfyNQbrhlQ","uPX7Gd7vjM","7fsYMgdQsS","n1pmOdjsrv","29QAzi3pyd","JkzUnCp3mZ","suY4xQChxs","lH1ktLbRTH","faHirJkzUn","lViBvTCgPp",
+"pvgjStuDyS","4QMc9iwzGk","J2mQikZANm","2TRI7FPfSE","4W0TllsQGo","dmoS7fcJOy","tAOsrGXdoH","lCMxyd7vjM","AXpwESs0Zu","J2mQilCMxy",
+"Yh1hFtvdkD","dpe1vQ6Lix","GXdoHjSjS3","okgRiqUJMd","wDajX5VZjS","yToGWqUJMd","HzZT8WmadA","GXdoHh1zcH","UmaEvAkKTk","RzaZANo0Qb",
+"x3LDepWiOs","5IhmGQworu","fFDrJpFrrl","d7vjM29QAz","8TxD7L7cGc","blLA97X3uy","QssNCl83Ud","AIYUuStlDJ","zQt6QdhSuH","NhXduCK5W7",
+"NOHszb29RJ","4dEz6Oz8yZ","oGu6xVLTy6","okgRiAmdQd","FjHXRWreyP","uupzk8hJdt","Q6LixFPfSE","pWiOsksJby","CdyBV2Nslm","HRxd8hSSvQ",
+"yluBxru4UG","fFDrJjtn0X","Ta8f6BCxeC","Dz1R3YjB9t","J2mQiVNCPd","lweGyJKWYR","gf8rIZhwG1","LDk6fuJScX","b29RJvLsmS","wiHrZPYBf4",
+"8U2nU2hEEU","b29RJVIlwP","K4GS8Vprf2","QYxC0uJScX","VNCPdhi5X7","aL6AJAmdQd","2Yz7Ea00b5","618Dis4786","07n1cMaJQs","ZUnqt7lUXZ",
+"FFDuiVerEA","nnP8oCdyBV","Nxx9VZ4I1v","0Wr5yi3pyd","29QAzHRxd8","1LB1LjSjS3","5VZjSZuDtD","jS1ajxReec","5VZjSm4bxU","FnPFBFwEJz",
+"v1HlnvLsmS","IKxdLcShY2","GWqqXdmoS7","y94nwfaHir","cQOnvfcwDa","Cfgr3ni2v1","O3iyQfLNg8","pmeCdSjskQ","RsQUquPX7G","Cp3mZFNYIM",
+"Q6hMCYjB9t","Mm8siQssNC","M6qcGVIlwP","v1HlnciuWz","Nxx9Vix74r","lCMxyzz4ZU","5nmWvfFDrJ","0ao3lS2Dfu","pWiOsOUYuF","QworuaDGtS",
+"0PktIh1zcH","wiHrZDQimp","JRJQB0YAGH","GrDg7gdQsS","BCxeCX6Pin","BbwgAxXTI4","Mm8siuZPqg","FcWrWWmadA","0h1b1hE1Ql","IKxdLCdyBV",
+"Yf2EcReKEW","0BmCygIYvE","RkQkeDLhzM","55rfBprNT6","lweGypWiOs","Twano5nmWv","1LB1L9eoRc","7fsYMIKxdL","RpBQmxXTI4","HfyNQIjTwP",
+"618Di3weIF","jfREuFhtgl","F6PT2zz4ZU","xciqpSjskQ","fcwDaCqqaD","fLNg8F6PT2","Zv7z0QbxXc","Kr8ysBGaQY","8cVD3vLsmS","YOfrYnFqik",
+"8hJdtjfREu","ECMvUVNCPd","FPfSE14FLR","0BmCyuLtKs","GSQwj0ao3l","cQOnvs7Mxk","uN6r3MmsIo","Pb1paFNYIM","b29RJKZamH","n1pmOk85Ae",
+"Pb1paM3zXL","CqqaDzY1GY","lXFOBTCgPp","9y4lwazIWp","LewvMjiVBP","s7Mxk55rfB","8TxD7FVMxo","brhlQAkKTk","S2Dfurz7Ut","o8UydWmadA",
+"8RCUAy94nw","Mm8siWMiS3","hi5X7I7p2a","n8pJ9mz8gx","mX2GEn1pmO","wiHrZprNT6","B3qemReKEW","s4786Fhtgl","pWiOs07n1c","JXljW9eoRc",
+"In3NSFjHXR","jzUqRhSSvQ","2Yz7ENAFuw","iKqhrYjB9t","FVMxoMK07Y","AXpwE5iGN5","NcICACp3mZ","n1pmO4dEz6","Fhtglni2v1","OHaBzqQxHP",
+"pmeCdprNT6","NhXdu4QMc9","iB08lt59lR","nlaByBFkb8","kZANmOxWIH","9XyT9QWxoT","MmKGJJIqXi","sx5Gli7WMQ","NcICA7lUXZ","YOfrYcQOnv",
+"tlILtdpe1v","Mm8silj07Q","UmaEvEoToP","DcpWB0ao3l","16lHc9GXkX","fFDrJAOgEe","azIWpTa8f6","atef2MezSW","Waim6FLsph","FGzgptAOsr",
+"64s8NtlILt","Oz8yZIjTwP","iB08luupzk","YjB9tzHF1q","wDajX7ku1p","B3qem2ZHdk","rhl0J29QAz","55rfBtlILt","guMb8O3iyQ","tjQxsRsQUq",
+"9y4lwQbxXc","S77LHQ6Lix","FnPFBTa8f6","L7cGc0YAGH","WmadAd7vjM","RBhp0iqv4k","MK07YCp3mZ","sqVrfJIqXi","oQ87rjfREu","2TRI7piJSk",
+"0Wr5yyvOMI","pWiOsFNYIM","FPfSEv2eC3","jtn0XNAFuw","MojnPkB5nP","Q6LixTCgPp","bgJAzRpBQm","SWfouwiHrZ","CNHmv7X3uy","LDk6fReKEW",
+"dmoS75ZaEz","prNT6JJs5m","fLNg8Fhtgl","bZLvSo8Uyd","OUqFMfmIK1","s93MlQWxoT","5ZaEztvdkD","DQimpfFDrJ","QWxoTJRJQB","XflUqgf8rI",
+"8FmFHguMb8","lH1kt48cHL","5Mg9rhSSvQ","5Mg9rd85a9","VNCPdFjHXR","8xEKzhSSvQ","ZJTXHpiJSk","WDVWJgIYvE","uQIczuvf7A","Q6hMCDz1R3",
+"No0Qb9eoRc","ru4UGECMvU","uvf7AAXpwE","SWfouvLsmS","BbwgAGWqqX","uTacxCfgr3","AXpwEjS1aj","atef25IhmG","lkMUAnFqik","x3LDeiwzGk",
+"cQOnvMkgy8","s93Mlt98iW","29QAzGv3Fq","ThjNnMK07Y","JkzUnOxWIH","fLNg8Kr8ys","guMb8zFgtB","5iGN57fsYM","s4786JJs5m","OHaBzn8pJ9",
+"9iGoThYBCK","ZhwG1d7vjM","uN6r35ZaEz","Ss0ZuZ4I1v","v1HlnThjNn","tjQxspmeCd","l83Ud0PktI","AgJHQOHaBz","MaJQsZJTXH","iwzGkRmDcr",
+"pAhR11LB1L","HP433Mm8si","tlILt1v5hH","QssNCBGaQY","e6e4z7Ow5C","DG4sT4QMc9","29QAzCxVEf","BFkb8SmGzv","TCgPpyofH3","IBe8kRsQUq",
+"ru4UGjzUqR","s4786JkzUn","MezSWHRxd8","OxWIHWreyP","e6e4zLDk6f","tuDySIBe8k","JIqXiJRJQB","euZA5FnPFB","Ss0Zut98iW","FLsphYw2oU",
+"yvOMIl83Ud","ru4UGm4bxU","HlUbFru4UG","ydG8UtvdkD","0BmCyFhtgl","2TRI75VZjS","uAWypPb1pa","tjQxsguMb8","uQIczAXpwE","TCgPp0BmCy",
+"i3pyd07n1c","F6PT25Namm","5drc6XflUq","xXTI4s4786","o8UydCfgr3","2Nslmx3LDe","MmsIoGrDg7","soy9tRxrsm","tvdkDNhXdu","d85a90BmCy",
+"zz4ZUdhSuH","QChxsSbRYy","bgJAzt98iW","hUTw70Kyfs","TCgPpvOqCE","ThjNn2Yz7E","uZPqgpv0i7","AmdQd0h1b1","YjB9tCK5W7","SjskQhi5X7",
+"AgJHQxciqp","S2DfublLA9","fqypy29QAz","zz4ZU9eoRc","x3LDeOHaBz","Vprf2QnJ1S","JkzUn5Drn0","JRJQBhSSvQ","pFrrluoStw","StlDJpAhR1",
+"oQ87r0MR5X","BGaQY45cIH","WreyPuZPqg","uN6r3FVMxo","NcICA5Namm","9XyT9x3LDe","aL6AJh1zcH","5VZjS2hEEU","soy9tVBjhz","0BmCyStlDJ",
+"y94nw64s8N","Dz1R3taOXK","IBe8k8cVD3","aez9yfLNg8","tlILt5Mg9r","oGu6xMkgy8","6AFT0B3qem","64s8NJJs5m","kZANm0h1b1","GXdoHaFFss",
+"s7MxkHlUbF","BGaQYFwEJz","tvdkDy94nw","JJs5mlCMxy","he9IAZ4I1v","hYBCKLbRTH","1v5hHgdQsS","fqypyFjHXR","2TRI7Z4I1v","NcICAl83Ud",
+"cmXIXydG8U","v8yFNMGlTF","FxX9qv8yFN","RzaZAzqH0W","hUTw7GrDg7","M3zXLiB08l","SbRYyzFgtB","uAWyp8U2nU","3otm616lHc","FFDuiOxWIH",
+"soy9tSWfou","5NammtjQxs","RzaZA9eoRc","FPfSEStlDJ","YjB9tfqypy","ReKEWOHaBz","64s8NGXdoH","atef2zbIYY","DcpWBRxrsm","vOqCEv2eC3",
+"DcpWBd7vjM","618DilCMxy","QworuQChxs","9GXkXIn3NS","FVMxoCfgr3","HP4331LB1L","v1HlnM3zXL","UmaEvpAhR1","VNCPd55rfB","No0Qbd7vjM",
+"6q6L9Q6Lix","tvdkDaez9y","sqVrf4dEz6","t98iWQChxs","zY1GYOxWIH","euZA5atef2","P6bcg5drc6","0KyfsDcpWB","tjQxsuQIcz","tjQxsrz7Ut",
+"dmoS7YjB9t","Q6Lixfqypy","b29RJMaJQs","MK07YbrhlQ","QChxs5Namm","5iGN5No0Qb","7lUXZ07n1c","FFDuiAkKTk","VLTy6VNCPd","RBhp07hyVv",
+"4W0TlW7cTs","pvgjS1v5hH","ZJTXHKr8ys","IKxdL5Namm","AOgEes4786","WaWsvCdyBV","Q6Lix8U2nU","fFDrJ9GXkX","prNT6Gv3Fq","5nmWvdjsrv",
+"IRh48Gv3Fq","SbRYyLDk6f","5drc6CdyBV","WMiS3IKxdL","uTacxO3iyQ","QnJ1SJXljW","brhlQUvlv4","4dEz6X6Pin","WreyPuN6r3","uJScXNAFuw",
+"6AFT0SjskQ","lH1ktfLNg8","BFkb8S2Dfu","0PktI7fsYM","9y4lwRkQke","9y4lwFPfSE","JIqXi8U2nU","FNYIMQYxC0","VjCZqjtn0X","2DREs8xEKz",
+"HlUbF0PktI","gjUTu5Drn0","GWqqXv1Hln","vOqCEjS1aj","pv0i7djsrv","h1zcHZv7z0","24ARFoGu6x","ZJTXHMmsIo","5Drn0No0Qb","0YAGHRmDcr",
+"wDajXZuDtD","7lUXZ5drc6","RzaZAuZPqg","SWfouSjskQ","RBhp0aez9y","0KyfsCNHmv","CK5W7DQimp","zbIYY0YAGH","gjUTuBFkb8","dQ586taOXK",
+"StlDJ9iGoT","Yf2EcFFDui","guMb8guMb8","rz7UtfcJOy","EoToPFnPFB","Vprf2ReKEW","K20wKDLhzM","gf8rIDG4sT","9eoRcmX2GE","8xEKzkZANm",
+"qQxHPVIlwP","d85a9YjB9t","aez9y5VZjS","wiHrZLbRTH","fLNg8kB5nP","Zv7z0uQIcz","FNYIM64s8N","AOgEebrhlQ","l83UdO3iyQ","qUJMdMmKGJ",
+"MGlTFCfgr3","Dz1R3gdQsS","GXdoHCp3mZ","0Wr5yFFDui","4W0Tl8RCUA","y94nw8TxD7","EOE1ox3LDe","lj07QbZLvS","G1RhSzbIYY","rz7UtYf2Ec",
+"yluBxQssNC","AOgEexReec","FcWrWtaOXK","WmadAZv7z0","Mm8siNxx9V","zmLYDy94nw","JkzUnCxVEf","gIYvE8hJdt","CqqaDZJTXH","FjHXRgtCA5",
+"Cfgr35nmWv","n1pmOn1pmO","RkQkeJkzUn","GSQwji3pyd","MmKGJn1pmO","he9IAulk41","Y1mC0ThjNn","nnP8ojS1aj","8hJdtM3zXL","FxX9qvOqCE",
+"cShY2azIWp","ru4UGJXljW","2NslmzbIYY","8xEKznFqik","v2eC3FVMxo","pv0i7HRxd8","uTacxfLNg8","L7cGc5Drn0","JJs5mt98iW","AmdQdOz8yZ",
+"OxWIHydG8U","4QMc9euZA5","uvf7AnlaBy","VIlwPblLA9","tAOsrfmIK1","gtCA5djsrv","MGlTFKsjRK","wiHrZUlU3M","yvOMIKASQ8","ru4UG618Di",
+"cShY2zmLYD","SjskQi3pyd","BCxeC6q6L9","gdQsSC2Irc","FnPFBjtn0X","O3iyQVNCPd","OxWIHeuZA5","Mkgy85Drn0","1j5L8KASQ8","RBhp0cmXIX",
+"4dEz6jzUqR","5IhmGNo0Qb","0ao3ldhSuH","M6qcG2Yz7E","rKDLJIKxdL","FPfSE5Drn0","M3zXLzqH0W","jzUqRjS1aj","Zv7z0zqH0W","Rxrsm6q6L9",
+"F6PT2hYBCK","EOE1oWDVWJ","fcJOyJIqXi","2DREsy94nw","BFkb8hUTw7","Cfgr3AkKTk","hE1QllpF6W","iKqhrQbxXc","8xEKzJIqXi","TCgPp1j5L8",
+"RpBQmrKDLJ","brhlQIKxdL","LewvMFPfSE","0KyfsqUJMd","wiHrZDz1R3","CxVEfRACuj","KZamHt98iW","AgJHQeuZA5","CdyBVAXpwE","X6PinFjHXR",
+"VLTy67ku1p","v2eC3DLhzM","QbxXcVjCZq","pvgjSydG8U","FPfSEpv0i7","HfyNQfaHir","HRxd8blLA9","hSSvQJ2mQi","RkQkeOUqFM","JRJQBhe9IA",
+"UmaEv9rlg9","2DREsl83Ud","qQxHPD6rBy","MaJQsOz8yZ","QYxC0h1zcH","ZJTXHThjNn","ZUnqtPb1pa","ix74rKZamH","suY4x2TRI7","jtn0XWmadA",
+"SWfouyvOMI","Uvlv43weIF","FcWrW8FmFH","bgJAzStlDJ","HP433dmoS7","5ZaEzqaofN","2TRI7cmXIX","DG4sTh1zcH","Cfgr3iwzGk","iKqhrIKxdL",
+"lsQGofqypy","7fsYMn8pJ9","d85a9jfREu","n1pmOPYBf4","KZamH7lUXZ","7fKYUe6e4z","QYxC05Mg9r","7Ow5CYjB9t","uZPqgL7cGc","nnP8oLDk6f",
+"0MR5XDz1R3","DG4sTlH1kt","0ao3l8xEKz","wiHrZRsQUq","QYxC0wDajX","ThjNn2TRI7","64s8NVIlwP","fLNg8jfREu","HfyNQ6q6L9","9GXkXjeskS",
+"zFgtBZJTXH","hUTw7ogLgc","lViBvGv3Fq","a00b5y94nw","X6PinqQxHP","b29RJi3pyd","zFgtBzz4ZU","lsQGoRkQke","5IhmGQWxoT","MaJQsFLsph",
+"o8Uyd6AFT0","jtn0XBCxeC","ZhwG1B3qem","BFkb8CdyBV","FFDuiRpBQm","VBjhzaL6AJ","SmGzvWmadA","uvf7AWMiS3","Cfgr3ReKEW","0PktI0ao3l",
+"8hJdtatef2","d7vjMHlUbF","FwEJzCp3mZ","nlaByL7cGc","AOgEeBCxeC","QClRLG1RhS","s47862Yz7E","d85a9Dz1R3","B3qemyEfy9","64s8Nzz4ZU",
+"M6qcGMojnP","a00b5CIShG","24ARFUvlv4","Nxx9VRsQUq","qaofNiwzGk","gIYvEQssNC","5drc6aez9y","Dz1R3GXdoH","jS1ajFwEJz","BCxeCFPfSE",
+"okgRiCK5W7","In3NSQClRL","2NslmDz1R3","e6e4z24ARF","nnP8opv0i7","dhSuHD6rBy","Z4I1v5drc6","fcJOyuJScX","1j5L8qQxHP","aez9yS77LH",
+"wiHrZuZPqg","OUqFM4QMc9","ZJTXHFNYIM","cL0aEYh1hF","lkMUA8RCUA","VerEAb29RJ","2NslmmX2GE","HP433Yw2oU","14FLRulk41","IKxdLpiJSk",
+"14FLRC2Irc","fFDrJxciqp","DG4sTvLsmS","b29RJDcpWB","ZuDtDprNT6","SbRYyQworu","pv0i7NcICA","lH1ktxReec","VLTy6yofH3","AgJHQRBhp0",
+"s4786C2Irc","0YAGHuoStw","07n1czmLYD","aL6AJ5Drn0","lCMxyYjB9t","UmaEvpmeCd","QChxsWmadA","0Wr5yFNYIM","LDk6fQworu","CIShGQnJ1S",
+"jS1ajJKWYR","7fsYMRkQke","MmKGJVNCPd","VerEA9eoRc","8xEKzBGaQY","Uvlv4yEfy9","EdBKcpFrrl","K4GS8AgJHQ","d7vjMHzZT8","TCgPpiwzGk",
+"Pb1paQWxoT","U3yw5vOqCE","mX2GEKsjRK","8FmFHcQOnv","aFFssK20wK","6q6L9i3pyd","uLtKsLewvM","07n1cOz8yZ","tAOsrjzUqR","QChxspFrrl",
+"aez9ya00b5","xReecRxrsm","Yw2oUpiJSk","StlDJpv0i7","TwanoBpYhV","KsjRKs7Mxk","pWiOsNhXdu","24ARFMmsIo","s7MxkPOUYS","atef2GXdoH",
+"cQOnvVprf2","tl72WDQimp","lpF6WBGaQY","9XyT9KZamH","ZhwG1MmsIo","LbRTHJKWYR","Cp3mZl83Ud","45cIHCfgr3","t98iWYh1hF","Cp3mZX6Pin",
+"WaWsvk85Ae","xReecqaofN","MK07YHlUbF","KsjRKQYxC0","HRxd8nFqik","ZuDtDnnP8o","uAWypDG4sT","dhSuHpiJSk","K20wKCxVEf","v8yFNqUJMd",
+"wiHrZe6e4z","cQOnvVNCPd","FxX9qpmeCd","FNYIMY1mC0","J2mQiGXdoH","MaJQsUmaEv","QWxoTNAFuw","QYxC0hYBCK","SjskQHRxd8","7fKYUM6qcG",
+"2hEEUoGu6x","QssNCOHaBz","bZLvSFjHXR","1v5hHtjQxs","aDGtSb29RJ","D6rByk85Ae","gIYvEMezSW","X6PinAXpwE","24ARFRkQke","SbRYyNOHsz",
+"CIShGzHF1q","VBjhzWDVWJ","xReec14FLR","CIShGJIqXi","JIqXiTa8f6","ZuDtDjzUqR","cShY2DQimp","l83UdQYxC0","HP433KASQ8","Mm8siB3qem",
+"5Mg9razIWp","ZuDtDJXljW","7Ow5CjfREu","TXQ0ZZhwG1","QssNCW7cTs","TwanooGu6x","djsrvTCgPp","DcpWB7fsYM","Gv3FqSmGzv","0h1b1okgRi",
+"cL0aEX6Pin","gdQsSFLsph","RACujyluBx","4QMc9ZzJHW","VNCPdyvOMI","0BmCyECMvU","Gv3FqO3iyQ","nlaByNcICA","QChxsn8pJ9","Yh1hFzz4ZU",
+"P6bcgC2Irc","x3LDe29QAz","Cfgr35drc6","Q6LixblLA9","xXTI47ku1p","d85a9P6bcg","CqqaDdmoS7","Chuy30PktI","t98iWVerEA","8cVD364s8N",
+"pFrrlRACuj","1LB1LAOgEe","hi5X7S77LH","uoStwFVMxo","fLNg81v5hH","JRJQBX6Pin","RACujB3qem","MaJQsYOfrY","RmDcrKsjRK","JXljWwDajX",
+"hYBCK580YD","gjUTulXFOB","MK07Y45cIH","7fKYUn8pJ9","zqH0Wjtn0X","pv0i7Zv7z0","cShY20PktI","Yf2EcP6bcg","HlUbF1LB1L","b29RJ9y4lw",
+"pAhR1Yf2Ec","gjUTujeskS","EoToPk85Ae","qaofNTCgPp","Ta8f6Dz1R3","6q6L95VZjS","oVQp6yluBx","GXdoHhSSvQ","2hEEUCp3mZ","YjB9tBbwgA",
+"0KyfsAkKTk","7lUXZdhSuH","7hyVvJRJQB","zQt6Qt59lR","8cVD3aez9y","bgJAzCNHmv","v2eC38hJdt","CIShGAXpwE","IBe8kokgRi","h1zcHeuZA5",
+"tvdkDEoToP","GrDg7Z4I1v","7hyVvm4bxU","zQt6Qs7Mxk","yvOMIdmoS7","AXpwEoGu6x","OxWIHStlDJ","BpYhVhUTw7","blLA9mz8gx","8U2nUbgJAz",
+"9y4lwFVMxo","hE1QlKr8ys","L7cGcAgJHQ","MmKGJs7Mxk","nlaByatef2","6AFT0cL0aE","cQOnvuAWyp","FwEJzrKDLJ","RmDcrazIWp","D6rBy45cIH",
+"jS1ajHzZT8","4dEz6IjTwP","24ARFYw2oU","VLTy6hYBCK","OUYuF9eoRc","uJScXqQxHP","hYBCKRpBQm","WaWsvWaWsv","ix74rSjskQ","MGlTFatef2",
+"yToGWZhwG1","CNHmvCIShG","l83UdCK5W7","0KyfsWaim6","oQ87rlsQGo","FwEJzzz4ZU","FnPFBS2Dfu","gdQsSjiVBP","IjTwPdpe1v","d7vjMh1zcH",
+"2DREspAhR1","uN6r3GrDg7","dQ586a00b5","VBjhz3otm6","CIShGOxWIH","euZA5WaWsv","1j5L814FLR","7X3uyJKWYR","LbRTHuoStw","0MR5Xmz8gx",
+"QnJ1SCfgr3","qQxHPguMb8","OxWIHlpF6W","gIYvEWPmlx","nnP8o7X3uy","RACujIBe8k","4QMc9POUYS","v1HlnpvgjS","Mm8siXyPZN","okgRiv8yFN",
+"LewvMKr8ys","POUYSmz8gx","lXFOBQWxoT","DLhzM7ku1p","ReKEW55rfB","5ZaEzgtCA5","XflUq24ARF","aFFsss93Ml","FVMxoIn3NS","qaofNfmIK1",
+"NhXduAmdQd","sx5Gllm0pD","VjCZqKZamH","dhSuHFcWrW","ZUnqtb29RJ","14FLRBbwgA","07n1cfcJOy","pv0i7h1zcH","piJSkOUYuF","BpYhVVjCZq",
+"tvdkDlViBv","Pb1pacL0aE","s7MxkZ4I1v","7hyVvzY1GY","RsQUqStlDJ","jiVBPokgRi","AIYUuhe9IA","ZUnqtpvgjS","BFkb8ZJTXH","LewvMzHF1q",
+"QssNCLewvM","QChxs55rfB","bZLvSfqypy","i3pydsoy9t","pWiOsSbRYy","48cHL07n1c","dQ586oVQp6","VBjhzF6PT2","GSQwjguMb8","lpF6WPb1pa",
+"dmoS7k85Ae","h1zcHd85a9","FnPFBKr8ys","Yw2oUKZamH","n8pJ9soy9t","Q6hMCv1Hln","zbIYYgtCA5","d7vjMGXdoH","ECMvUO3iyQ","zbIYYKASQ8",
+"9iGoTy94nw","48cHLMojnP","fLNg8zqH0W","zHF1qMGlTF","d85a9nnP8o","M6qcGQnJ1S","xciqpNcICA","Kr8ysKr8ys","8hJdtMojnP","OUYuF7hyVv",
+"sqVrfjfREu","cQOnvcQOnv","rKDLJEoToP","14FLRvLsmS","uZPqgxReec","ogLgcrz7Ut","16lHclpF6W","2TRI7wiHrZ","uQIczb29RJ","8TxD7FNYIM",
+"Ss0ZulpF6W","tuDySfqypy","nlaByh1zcH","1LB1L8cVD3","QChxsMK07Y","tAOsrYh1hF","VNCPdMGlTF","In3NSIBe8k","D6rByNOHsz","DLhzMdQ586",
+"55rfBZUnqt","8hJdtAkKTk","yvOMIAmdQd","azIWpIBe8k","Yf2EcJXljW","dhSuHCNHmv","lweGylH1kt","azIWp2ZHdk","wDajXokgRi","POUYSulk41",
+"UlU3MBCxeC","ulk41JKWYR","tAOsro8Uyd","CIShGUlU3M","aFFss24ARF","24ARFguMb8","MezSWTXQ0Z","xReech1zcH","1LB1LFwEJz","b29RJWPmlx",
+"7X3uyPYBf4","GWqqXkZANm","NAFuw8RCUA","GWqqXAgJHQ","iB08lK4GS8","UmaEvTa8f6","GWqqXAXpwE","ulk418FmFH","7ku1prz7Ut","jfREuazIWp",
+"S77LHCdyBV","gjUTuwiHrZ","O3iyQVIlwP","tjQxsvOqCE","lCMxyAgJHQ","3otm69XyT9","ZhwG1t59lR","lsQGoVerEA","fcwDaGXdoH","NOHsz29QAz",
+"taOXKJ2mQi","lm0pDdpe1v","djsrv9eoRc","t59lRQYxC0","gtCA5Oz8yZ","jzUqRtaOXK","zQt6QlViBv","S77LH64s8N","MaJQsLDk6f","ECMvUMmsIo",
+"BCxeC9XyT9","64s8NKr8ys","S2DfuazIWp","NhXduDcpWB","t98iW6q6L9","lkMUASbRYy","QChxsVerEA","UlU3M9XyT9","8TxD7i3pyd","L7cGcHRxd8",
+"prNT6uvf7A","d85a9nlaBy","FhtglGv3Fq","D6rByFxX9q","vLsmSFwEJz","uTacxBGaQY","K20wKt59lR","24ARFWMiS3","gIYvE5IhmG","CIShGFNYIM",
+"lsQGoChuy3","e6e4zAIYUu","2Nslms93Ml","azIWpIRh48","2TRI7dmoS7","F6PT2FwEJz","djsrvUmaEv","3weIFIRh48","FxX9qqaofN","EOE1oFNYIM",
+"6q6L9AXpwE","HzZT8JKWYR","0ao3lokgRi","QYxC0nnP8o","rhl0JYh1hF","zmLYDC2Irc","piJSk14FLR","DcpWBW7cTs","ZuDtDIBe8k","VNCPduAWyp",
+"gtCA50BmCy","y94nw3weIF","CxVEfZ4I1v","EdBKc4W0Tl","xciqpXyPZN","dpe1vKASQ8","DQimpGWqqX","WreyP64s8N","RkQkezz4ZU","uvf7AQWxoT",
+"qUJMd0MR5X","CqqaDRxrsm","zHF1qPYBf4","0PktIhE1Ql","XflUqiqv4k","lpF6WReKEW","pmeCd0BmCy","b29RJDQimp","2DREsv1Hln","OUqFMJkzUn",
+"POUYS8TxD7","QYxC0FLsph","fqypy3otm6","faHirpWiOs","StlDJBGaQY","XyPZNfcwDa","nnP8ob29RJ","gdQsS5Namm","vOqCEvkCHH","t98iWnlaBy",
+"uLtKsEoToP","ThjNnZ4I1v","JRJQBFGzgp","7X3uyOHaBz","AkKTkYw2oU","RkQke9eoRc","pFrrlBCxeC","BpYhVni2v1","55rfBRACuj","blLA9brhlQ",
+"WmadA5Namm","d85a9BpYhV","GXdoHhE1Ql","VLTy6Waim6","C2IrcuN6r3","uupzkksJby","UmaEvx3LDe","QbxXcGv3Fq","HRxd8yToGW","M3zXL2TRI7",
+"IBe8k0BmCy","euZA5YOfrY","0h1b1l83Ud","Dz1R3jiVBP","IjTwPlj07Q","v1Hlnv2eC3","zqH0WqaofN","Mm8si8TxD7","tvdkDqUJMd","1LB1Lpv0i7",
+"lXFOBs7Mxk","s4786FwEJz","4W0TlkZANm","7Ow5CFPfSE","wiHrZlm0pD","IjTwPHlUbF","qQxHPjtn0X","hi5X7ThjNn","RpBQmjfREu","hUTw7Z4I1v",
+"hi5X7uQIcz","s47860h1b1","8FmFHWmadA","uQIczCp3mZ","ru4UG5ZaEz","RmDcrix74r","uTacxGv3Fq","lXFOBWaim6","45cIHHRxd8","gtCA5ydG8U",
+"VIlwPoQ87r","TCgPpguMb8","mX2GEDLhzM","B3qemCK5W7","Oz8yZChuy3","a00b5SmGzv","ZuDtD1LB1L","Ul4a1MmsIo","Ta8f6Ss0Zu","Mkgy8JRJQB",
+"ReKEWChuy3","fmIK1C2Irc","uZPqgUmaEv","QChxsAOgEe","D6rByIn3NS","Rxrsm2Yz7E","B3qemblLA9","K20wKGXdoH","7fsYM9iGoT","djsrvyEfy9",
+"9eoRc0h1b1","EdBKcd85a9","SWfouBGaQY","ReKEWzqH0W","mX2GEzz4ZU","h1zcH9GXkX","uPX7GQ6Lix","uQIczs93Ml","WDVWJTXQ0Z","48cHLjS1aj",
+"ulk41uZPqg","HRxd816lHc","i3pydrz7Ut","7lUXZcQOnv","uoStwMK07Y","CK5W76q6L9","t59lRksJby","VBjhzcL0aE","pmeCdOxWIH","zFgtBiwzGk",
+"FnPFBd7vjM","tAOsr6q6L9","2ZHdkOUqFM","8xEKzQWxoT","MGlTF6AFT0","8hJdtMm8si","YOfrYOxWIH","9iGoT0MR5X","dpe1vzQt6Q","tvdkD7fKYU",
+"MaJQsfaHir","tvdkDfqypy","uJScXxciqp","a00b5x3LDe","t98iWuvf7A","k85Aes4786","RmDcrjSjS3","7fsYMUlU3M","0BmCyaez9y","Yh1hFdmoS7",
+"Mkgy8iqv4k","JJs5mEoToP","zQt6QW7cTs","taOXKFNYIM","vLsmSQ6Lix","8RCUAv2eC3","WmadApFrrl","YjB9tFVMxo","azIWpGv3Fq","m4bxUm4bxU",
+"EoToP8RCUA","ReKEW45cIH","OUqFMWMiS3","WreyPTCgPp","8cVD35Namm","ulk41J2mQi","JkzUnhYBCK","uLtKsHzZT8","t98iWVIlwP","gjUTuaFFss",
+"e6e4zoQ87r","7fsYMAmdQd","AIYUupmeCd","nnP8oNAFuw","5NammhUTw7","7fKYU2Yz7E","taOXK2Nslm","14FLRWDVWJ","aDGtSJXljW","9rlg99GXkX",
+"GXdoHMojnP","oGu6xzFgtB","lkMUA3otm6","lViBviKqhr","Cp3mZfLNg8","L7cGc8hJdt","HP433VjCZq","fqypycShY2","Mkgy8IBe8k","KsjRKWaim6",
+"nnP8oUlU3M","uPX7GCdyBV","cmXIXG1RhS","UlU3Mpv0i7","NOHszJXljW","b29RJqaofN","xXTI4Ul4a1","dQ586t59lR","2ZHdkcL0aE","aez9yS2Dfu",
+"jiVBPCqqaD","0YAGH9iGoT","y94nwStlDJ","F6PT2gjUTu","2ZHdkyEfy9","gdQsSiqv4k","pFrrlS2Dfu","SbRYyuupzk","l83UdNo0Qb","n8pJ9VNCPd",
+"wiHrZ0PktI","t98iWd7vjM","7fKYUJ2mQi","BFkb85ZaEz","gdQsShUTw7","D6rByyEfy9","jiVBPOUqFM","Vprf25iGN5","iB08lYw2oU","FGzgpVBjhz",
+"fcJOyAOgEe","0PktIv8yFN","NcICAjeskS","xciqpKr8ys","tjQxsJJs5m","v8yFNfmIK1","8hJdtVBjhz","GXdoHCIShG","MojnPblLA9","OUqFMWaim6",
+"Cp3mZ2hEEU","EOE1o5ZaEz","h1zcHL7cGc","gf8rI9y4lw","5Drn0WDVWJ","lCMxyl83Ud","zz4ZUChuy3","14FLRDG4sT","X6PinprNT6","8cVD3uupzk",
+"WmadAx3LDe","zQt6QZuDtD","ZhwG1CIShG","VerEAFFDui","8RCUA0h1b1","ZhwG1DLhzM","9y4lw4dEz6","atef2Yw2oU","WMiS3v8yFN","suY4xY1mC0",
+"EoToPfcwDa","v8yFNgf8rI","kZANmM3zXL","QChxs7fsYM","uQIczi7WMQ","blLA9hSSvQ","3weIFtl72W","n1pmOuupzk","GXdoHFNYIM","AOgEeqaofN",
+"0h1b1uLtKs","Vprf2SmGzv","vLsmSYOfrY","MojnPHP433","7lUXZRkQke","4W0TlAkKTk","Cfgr30Wr5y","lViBvAgJHQ","In3NSRxrsm","yluBxVNCPd",
+"KASQ8HlUbF","QssNC7ku1p","6AFT0n1pmO","Ta8f60BmCy","jSjS3zY1GY","HzZT8YOfrY","dpe1vJXljW","BbwgAFhtgl","iqv4kWaWsv","fcwDa5Namm",
+"NAFuwOUqFM","9XyT9gtCA5","SmGzvt98iW","ZhwG1hE1Ql","ulk41hi5X7","ZUnqt0Kyfs","tjQxstlILt","RkQkelViBv","S77LHLDk6f","Dz1R38xEKz",
+"tlILtni2v1","jS1aj6AFT0","JkzUntlILt","fFDrJlpF6W","Uvlv4CxVEf","dmoS7tjQxs","zFgtBfcwDa","CqqaDjeskS","djsrvCp3mZ","AgJHQdhSuH",
+"2hEEUK4GS8","8FmFHG1RhS","CdyBVni2v1","zqH0Wlm0pD","M6qcGyEfy9","KASQ8GWqqX","pFrrlvOqCE","QbxXcfFDrJ","7fsYMMaJQs","cShY2DcpWB",
+"DLhzMZuDtD","MmsIocQOnv","d85a914FLR","hE1QlvOqCE","NAFuw9y4lw","QChxs8FmFH","MmsIo7hyVv","oGu6xQ6hMC","I7p2aJXljW","uQIczMezSW",
+"HzZT8XyPZN","QWxoTs7Mxk","5Drn0QClRL","djsrvzFgtB","OUqFM9y4lw","zz4ZUfaHir","StlDJuvf7A","GSQwj14FLR","SWfouTa8f6","gf8rIfmIK1",
+"FFDuijeskS","zz4ZUCdyBV","m4bxUuQIcz","FcWrW9GXkX","0h1b1FcWrW","G1RhSMezSW","lm0pDulk41","QClRLOHaBz","jeskSDcpWB","Cp3mZZv7z0",
+"FwEJzt98iW","Ul4a1wDajX","0h1b1pFrrl","Y1mC0lpF6W","C2Ircv1Hln","cL0aEZuDtD","YOfrYBGaQY","MK07YTa8f6","dpe1viKqhr","hYBCKPYBf4",
+"S77LHOz8yZ","iKqhrL7cGc","RmDcrfmIK1","SbRYyMojnP","t98iWhi5X7","5Namm0MR5X","580YDPYBf4","0Wr5yiB08l","zFgtBQbxXc","7fKYUfFDrJ",
+"Q6LixRxrsm","v8yFNHP433","WaWsvCp3mZ","MmKGJ5VZjS","4dEz6Ul4a1","HfyNQGv3Fq","VerEABbwgA","vLsmS7lUXZ","l83Uduupzk","zqH0WHP433",
+"16lHc2hEEU","s4786kB5nP","v1Hlnn1pmO","Cfgr30ao3l","16lHcYh1hF","5nmWvwDajX","POUYSuAWyp","aDGtS5iGN5","yEfy90Kyfs","LewvMlViBv",
+"atef2zY1GY","QYxC02hEEU","i7WMQB3qem","uTacxTCgPp","4W0TlBbwgA","L7cGcuZPqg","KsjRKEoToP","Yh1hFNxx9V","nlaByU3yw5","qUJMdQnJ1S",
+"vOqCEhi5X7","14FLRFcWrW","LewvMNo0Qb","AgJHQRpBQm","rhl0JuN6r3","ix74r7fKYU","uZPqgatef2","D6rByciuWz","S77LHOUqFM","PYBf4CIShG",
+"9iGoT5Mg9r","zbIYYiwzGk","5IhmGZJTXH","KsjRKZuDtD","pWiOsTXQ0Z","lj07QFjHXR","uTacx0Wr5y","Yf2EcpWiOs","WMiS3jfREu","hUTw7WaWsv",
+"9XyT9DLhzM","aL6AJd7vjM","Oz8yZGWqqX","djsrvy94nw","ksJbysuY4x","FNYIMBFkb8","W7cTsZJTXH","IKxdL8hJdt","AgJHQ7hyVv","MaJQstlILt",
+"FxX9q8TxD7","SbRYys4786","v1Hlnk85Ae","K20wKYh1hF","QClRLEoToP","vLsmS8U2nU","jiVBPRmDcr","lpF6WaL6AJ","fcJOy7Ow5C","FxX9qguMb8",
+"O3iyQmX2GE","tuDySatef2","MGlTFNxx9V","4W0TlChuy3","aL6AJNOHsz","bgJAzECMvU","rhl0JpAhR1","HRxd88hJdt","k85AeRmDcr","HzZT8S2Dfu",
+"HfyNQBFkb8","CqqaDpAhR1","QChxsxXTI4","7ku1pSs0Zu","GSQwj7fKYU","FLsphsoy9t","i7WMQ5nmWv","cShY2QChxs","lCMxypv0i7","pWiOsX6Pin",
+"iwzGk5iGN5","D6rBy0BmCy","sx5GlOHaBz","MezSWVerEA","ZzJHWCp3mZ","sqVrfd85a9","Kr8ys2hEEU","3otm61LB1L","WDVWJjiVBP","qUJMdZuDtD",
+"cShY2uZPqg","7Ow5C1v5hH","6q6L9l83Ud","uN6r3GSQwj","cmXIX9GXkX","VjCZqDLhzM","RsQUq07n1c","DcpWBi3pyd","9GXkXVprf2","iwzGkZuDtD",
+"l83Ud0Kyfs","taOXKuupzk","zmLYDM6qcG","tAOsr0YAGH","8cVD3fcJOy","No0QbjS1aj","ulk41ZUnqt","zmLYDhE1Ql","Uvlv4iKqhr","RmDcrCK5W7",
+"aFFssFhtgl","AkKTkdjsrv","RxrsmS2Dfu","PYBf45drc6","yEfy9G1RhS","55rfBciuWz","ksJbyQClRL","faHir0PktI","WDVWJUvlv4","BFkb8fcwDa",
+"dQ586vLsmS","29QAzjeskS","JRJQB7lUXZ","RkQke5VZjS","7lUXZuAWyp","4QMc9gIYvE","JJs5muLtKs","BGaQYx3LDe","pmeCdpFrrl","DcpWB7X3uy",
+"Cp3mZMmKGJ","ThjNnb29RJ","0h1b17Ow5C","lpF6WokgRi","t59lRFwEJz","Pb1pauPX7G","Cp3mZUl4a1","ZhwG1BbwgA","RACuj0BmCy","uAWyp0BmCy",
+"Cp3mZDz1R3","brhlQXyPZN","ZuDtDsx5Gl","TXQ0ZCNHmv","v1HlnRsQUq","0ao3lqQxHP","Ta8f6ciuWz","i3pydo8Uyd","pWiOsrKDLJ","ulk41B3qem",
+"rKDLJzFgtB","7fsYMI7p2a","piJSk2ZHdk","RkQkeFLsph","uAWypzmLYD","EOE1o9iGoT","HfyNQyofH3","WreyPTa8f6","UmaEvuoStw","dhSuHCK5W7",
+"4dEz6prNT6","2Yz7EStlDJ","6AFT0fqypy","DcpWBFNYIM","SjskQi7WMQ","qQxHPkZANm","DcpWBHRxd8","pFrrlmX2GE","JRJQBpvgjS","BGaQYOUYuF",
+"QWxoT0Kyfs","y94nwciuWz","DcpWBAmdQd","W3VFHY1mC0","DQimpOUYuF","X6PinlweGy","RsQUq5nmWv","HRxd8ni2v1","qUJMdZUnqt","dQ586DcpWB",
+"prNT6StlDJ","OUYuFCp3mZ","ZuDtDkZANm","GrDg7FGzgp","WmadAjtn0X","5ZaEz7Ow5C","vkCHHGSQwj","djsrvsqVrf","ZhwG1UlU3M","JRJQBHfyNQ",
+"pv0i7Kr8ys","LbRTHpmeCd","W3VFHxciqp","Y1mC09y4lw","2hEEUNAFuw","RxrsmL7cGc","J2mQiCIShG","LbRTHs7Mxk","IBe8kiKqhr","9GXkX24ARF",
+"uupzkVjCZq","uTacx0MR5X","i7WMQzqH0W","yToGWCNHmv","G1RhSNxx9V","CdyBVDQimp","SjskQUvlv4","Yh1hFfcJOy","B3qemU3yw5","EOE1oMaJQs",
+"AmdQdUmaEv","FjHXRvLsmS","ZUnqt8hJdt","tAOsrKASQ8","jfREuUlU3M","0MR5Xiqv4k","uoStwY1mC0","fmIK1J2mQi","mX2GEQWxoT","atef2pAhR1",
+"ni2v1QnJ1S","8TxD7lj07Q","CK5W7nlaBy","AmdQdLbRTH","brhlQni2v1","7X3uyni2v1","RpBQmjS1aj","ZUnqtKZamH","DG4sT0Kyfs","4QMc9okgRi",
+"dQ5864dEz6","wDajXuupzk","lj07QGWqqX","jeskSOHaBz","b29RJSWfou","YjB9tlj07Q","Mm8sipmeCd","uAWypprNT6","9eoRcSs0Zu","i7WMQDQimp",
+"VIlwPpWiOs","6q6L9aL6AJ","VLTy6yvOMI","TCgPp9iGoT","WaWsvs4786","AkKTkpFrrl","LDk6fs93Ml","7hyVvuJScX","HzZT8Q6Lix","Cfgr3pAhR1",
+"gdQsSLbRTH","P6bcg8FmFH","0YAGHRsQUq","uTacxv2eC3","B3qemMojnP","KZamHdQ586","jSjS3yEfy9","jzUqRfLNg8","5ZaEzGWqqX","qQxHPgf8rI",
+"HfyNQ8FmFH","Pb1paHP433","2NslmuN6r3","m4bxUMK07Y","atef2yEfy9","2DREsNcICA","JIqXiUmaEv","45cIHdjsrv","aDGtSVLTy6","G1RhSuoStw",
+"iwzGkRzaZA","G1RhSEOE1o","24ARFpmeCd","hYBCKo8Uyd","iB08lpWiOs","XflUq5ZaEz","EdBKcVjCZq","NAFuwuLtKs","b29RJhSSvQ","D6rByhi5X7",
+"ThjNnLDk6f","BCxeCuLtKs","KsjRK9y4lw","NhXdu1v5hH","29QAzhE1Ql","JRJQBAXpwE","FjHXRKr8ys","3otm6dhSuH","pT8wuVjCZq","jtn0XWreyP",
+"SbRYy4dEz6","MmsIoaDGtS","8hJdtFVMxo","HRxd8Waim6","ni2v18hJdt","CxVEfGXdoH","Cfgr3QChxs","SbRYyiB08l","OxWIHQssNC","S77LHUl4a1",
+"zmLYDHfyNQ","FnPFBni2v1","5IhmGD6rBy","48cHLTXQ0Z","yToGWYOfrY","FVMxomz8gx","fFDrJ24ARF","Mm8sifLNg8","nnP8o9eoRc","aDGtSK4GS8",
+"nFqik7Ow5C","x3LDeQworu","618DiStlDJ","HRxd864s8N","lpF6WguMb8","5Mg9rK20wK","RkQkeVLTy6","s7MxkCxVEf","U3yw5QYxC0","9rlg9pFrrl",
+"CdyBVQClRL","KsjRKcShY2","xciqpd85a9","zHF1qGrDg7","ogLgctjQxs","v8yFNFxX9q","NhXduAkKTk","MK07YSs0Zu","GWqqXfFDrJ","BbwgAIn3NS",
+"yToGWb29RJ","ZuDtDOUqFM","Q6hMCpWiOs","RmDcrprNT6","SbRYycmXIX","xXTI4NcICA","RBhp07lUXZ","5Mg9rnFqik","0PktIuQIcz","0h1b1ulk41",
+"JXljWt59lR","G1RhSYw2oU","CxVEftAOsr","n8pJ9yvOMI","Ta8f6Ta8f6","OUYuFNOHsz","QClRLKZamH","S77LHeuZA5","WmadAKZamH","SjskQ618Di",
+"5ZaEztAOsr","MaJQsQworu","zHF1qjfREu","14FLRsx5Gl","TwanoNAFuw","uTacxyluBx","zmLYDS77LH","brhlQNo0Qb","U3yw5prNT6","5Mg9rSbRYy",
+"24ARF5IhmG","RBhp0qaofN","uTacxni2v1","jfREulweGy","EOE1o14FLR","aDGtS7lUXZ","d7vjMlpF6W","tvdkDGrDg7","s4786lH1kt","QWxoTGXdoH",
+"zHF1qh1zcH","ksJbyHP433","FcWrWwDajX","faHirRBhp0","JIqXi8RCUA","lViBvQ6hMC","gIYvEQChxs","o8UydLDk6f","tAOsri3pyd","qUJMdOxWIH",
+"MaJQsNAFuw","v8yFNhYBCK","DQimplsQGo","jiVBPGSQwj","XflUqzFgtB","QChxs5nmWv","SWfou4W0Tl","RpBQmiKqhr","SjskQ7lUXZ","7X3uyM3zXL",
+"n8pJ9CdyBV","BCxeC1j5L8","tuDyS64s8N","uLtKst98iW","BCxeCUl4a1","iB08lfFDrJ","BbwgAKZamH","hSSvQuTacx","VBjhzoQ87r","kB5nPdQ586",
+"BbwgAChuy3","SmGzvlH1kt","CxVEfFjHXR","FcWrWrhl0J","0PktIPb1pa","4W0TltlILt","uupzkL7cGc","0Wr5yulk41","ZJTXHZ4I1v","NAFuwTwano",
+"DQimptuDyS","RsQUq5iGN5","LDk6fzqH0W","0YAGHLewvM","0KyfsLewvM","OxWIHoQ87r","O3iyQ5Namm","tAOsrIjTwP","yofH3hi5X7","Chuy3ni2v1",
+"qQxHPIjTwP","ZJTXHWreyP","qQxHP8RCUA","Uvlv4WPmlx","5nmWvBpYhV","ix74r9iGoT","QnJ1SQworu","5NammIRh48","EoToP0ao3l","JRJQB1v5hH",
+"soy9tZuDtD","UlU3MpFrrl","jSjS3QbxXc","ksJbyWPmlx","14FLR0YAGH","FxX9q7fKYU","JIqXi14FLR","uAWypbgJAz","jzUqRyToGW","RsQUqogLgc",
+"lsQGoAgJHQ","QbxXcaDGtS","AXpwEpv0i7","1v5hHcQOnv","RBhp0vkCHH","t59lReuZA5","ThjNnKsjRK","NAFuw3otm6","QbxXcFLsph","Chuy3NOHsz",
+"suY4xeuZA5","ni2v1XflUq","RACuj1v5hH","B3qem7X3uy","bgJAzQssNC","07n1cdjsrv","CK5W7ciuWz","WDVWJQworu","hE1QlEdBKc","1LB1LgjUTu",
+"bgJAzaL6AJ","ReKEWx3LDe","SbRYyDcpWB","In3NSyluBx","zFgtBdmoS7","euZA5x3LDe","7lUXZs7Mxk","ZuDtD7X3uy","i3pyd0h1b1","CqqaDoVQp6",
+"ZUnqtqQxHP","9rlg9yofH3","W3VFHoGu6x","jSjS3y94nw","W3VFHt98iW","MezSWvkCHH","Gv3FqGXdoH","e6e4zpiJSk","B3qemK20wK","QbxXccQOnv",
+"lkMUArhl0J","wiHrZ2DREs","4QMc9xReec","cL0aEzqH0W","VLTy6suY4x","Vprf2SWfou","SmGzv8xEKz","9y4lws7Mxk","lj07QCqqaD","BGaQYCdyBV",
+"yluBxFLsph","U3yw5AkKTk","Pb1pa0YAGH","sqVrf618Di","zHF1quJScX","rKDLJPb1pa","8hJdt9GXkX","6q6L9wDajX","AgJHQDQimp","MezSWprNT6",
+"POUYSUlU3M","BpYhVsx5Gl","cmXIXCIShG","sx5Gl4dEz6","B3qem7lUXZ","G1RhSOUYuF","oQ87rni2v1","FFDuiyvOMI","IjTwP5Namm","JkzUnaL6AJ",
+"ulk41iB08l","7fKYUFxX9q","hSSvQlCMxy","7ku1py94nw","WmadAvLsmS","tl72WokgRi","GWqqXru4UG","YjB9tYw2oU","Mkgy8nFqik","RACujzbIYY",
+"qUJMdpv0i7","5Namm9rlg9","v8yFNs7Mxk","uPX7GLDk6f","yToGWVerEA","pmeCdsoy9t","qUJMdIRh48","pvgjS2DREs","MK07Yk85Ae","pAhR1Yh1hF",
+"5Drn0hSSvQ","5VZjSM6qcG","7fKYUCqqaD","Gv3Fquupzk","bZLvS8cVD3","WmadATa8f6","taOXKe6e4z","a00b5oVQp6","AIYUu618Di","4dEz6QWxoT",
+"ZuDtDFNYIM","9eoRcGWqqX","brhlQvLsmS","0Wr5yQWxoT","2Yz7Eo8Uyd","nlaByM6qcG","lweGyAIYUu","XyPZNlCMxy","7ku1pe6e4z","XyPZNKr8ys",
+"2TRI7AmdQd","JkzUn07n1c","5NammvLsmS","1LB1LYjB9t","Zv7z0ReKEW","ulk41rKDLJ","1v5hH9rlg9","NAFuwbgJAz","AkKTkHfyNQ","fmIK1Qworu",
+"7hyVvYOfrY","Cfgr3WDVWJ","8RCUAtlILt","F6PT24QMc9","jtn0X7Ow5C","JJs5mqaofN","9rlg9guMb8","Gv3Fq9rlg9","gIYvE7fKYU","0PktIMm8si",
+"rz7UtuQIcz","RzaZA5Namm","Mkgy8EOE1o","RACujaez9y","tvdkDydG8U","jS1ajOUqFM","9rlg9zQt6Q","RxrsmjSjS3","0BmCyxXTI4","0MR5X5nmWv",
+"zHF1qpFrrl","gIYvEBGaQY","3otm6EoToP","CxVEfoQ87r","Yw2oUC2Irc","8FmFHrKDLJ","RsQUqxciqp","5Drn0gtCA5","iqv4kn1pmO","QClRLguMb8",
+"7lUXZ2Yz7E","gf8rIQ6hMC","7fKYURzaZA","8FmFHCIShG","8FmFH07n1c","FnPFBCfgr3","KASQ8ZhwG1","ksJbysx5Gl","pAhR1YjB9t","VBjhz0h1b1",
+"h1zcHrKDLJ","07n1cDcpWB","TXQ0ZQnJ1S","StlDJFVMxo","zqH0WSs0Zu","nFqikZv7z0","AgJHQHRxd8","KZamHTCgPp","DcpWBfqypy","HRxd8jzUqR",
+"48cHLAIYUu","d7vjMrhl0J","n1pmOguMb8","GWqqXCdyBV","Uvlv4TCgPp","Yw2oUVIlwP","MmsIojiVBP","wDajXpvgjS","pAhR1Zv7z0","O3iyQokgRi",
+"W3VFHO3iyQ","ThjNnEOE1o","OUqFMtvdkD","4W0TlgdQsS","DcpWBgf8rI","ZuDtD5iGN5","9rlg9U3yw5","Kr8ysnFqik","0YAGH14FLR","0BmCyRxrsm",
+"BGaQYYf2Ec","n8pJ9bZLvS","ni2v1Kr8ys","Waim6jiVBP","h1zcHMmsIo","ZUnqtNhXdu","v2eC3YOfrY","cL0aECNHmv","WreyPBFkb8","iB08l9XyT9",
+"2DREssqVrf","I7p2aRzaZA","guMb8vLsmS","uAWypYjB9t","h1zcH7fsYM","BCxeCZ4I1v","i7WMQL7cGc","euZA516lHc","9y4lwpmeCd","brhlQGWqqX",
+"FLsphx3LDe","nnP8ocShY2","55rfBMaJQs","WreyPJ2mQi","1LB1LQYxC0","ZUnqt2Yz7E","gf8rIHlUbF","29QAziqv4k","ZhwG1EdBKc","lm0pDAOgEe",
+"M6qcGlkMUA","qaofN8U2nU","zbIYYWDVWJ","iKqhrWMiS3","WMiS3gjUTu","ReKEWDG4sT","G1RhS2Yz7E","Zv7z0qQxHP","29QAzBGaQY","n8pJ9BpYhV",
+"S77LHYjB9t","OUqFMRzaZA","dhSuHGrDg7","GXdoHZv7z0","AgJHQv2eC3","vOqCE0BmCy","hSSvQoQ87r","Z4I1viB08l","o8UydKASQ8","7ku1pl83Ud",
+"0ao3lM3zXL","HRxd8GrDg7","aFFssAOgEe","WPmlx3otm6","29QAzMezSW","hUTw79eoRc","ru4UG7ku1p","BGaQYBFkb8","B3qem29QAz","FLsphcQOnv",
+"rhl0JIRh48","JKWYRazIWp","oGu6xrhl0J","fqypyAIYUu","Mm8siDcpWB","tuDySwDajX","rKDLJRBhp0","WMiS30PktI","tlILt2Nslm","No0Qb0PktI",
+"IBe8kIKxdL","uvf7ANOHsz","OxWIHZzJHW","zbIYYaez9y","pAhR1a00b5","xReecgIYvE","fLNg8FLsph","2TRI7Pb1pa","i3pyd8hJdt","zz4ZUXyPZN",
+"J2mQiix74r","RBhp0OUYuF","0Wr5y7fsYM","uQIczDG4sT","tlILtdjsrv","OUYuFy94nw","SbRYyFNYIM","HRxd8QChxs","iB08lD6rBy","FnPFBSjskQ",
+"RBhp0bZLvS","0Wr5ypmeCd","VBjhzuupzk","SWfouRpBQm","ZhwG1kZANm","JXljWlH1kt","suY4xAOgEe","VNCPd2DREs","RBhp0vOqCE","OUqFMVIlwP",
+"bgJAz5IhmG","ECMvU0MR5X","IjTwPhUTw7","uZPqgDz1R3","iwzGkAkKTk","1j5L8tvdkD","2ZHdkgIYvE","HlUbFbrhlQ","tjQxs9rlg9","W7cTsazIWp",
+"uoStwnlaBy","DcpWBoQ87r","e6e4zi7WMQ","LbRTHVIlwP","iB08lokgRi","Vprf2Dz1R3","HP433FjHXR","gtCA5QYxC0","BGaQYIjTwP","5Mg9rSs0Zu",
+"Pb1patAOsr","FLsphSjskQ","azIWpTwano","7lUXZpFrrl","x3LDe9iGoT","ulk41iwzGk","uupzkuZPqg","7fKYU9GXkX","16lHcZ4I1v","7fsYM5IhmG",
+"h1zcHa00b5","k85AezmLYD","zbIYYHzZT8","i3pydMm8si","Ta8f6a00b5","yluBxHRxd8","qUJMdDG4sT","zQt6QtAOsr","8xEKzOHaBz","64s8NFnPFB",
+"djsrvMmKGJ","sqVrfJKWYR","K4GS8pAhR1","14FLRaDGtS","ulk41VerEA","lm0pDVLTy6","Yw2oUZUnqt","XflUq5IhmG","D6rBy29QAz","SbRYymX2GE",
+"UlU3MFnPFB","sx5Gl5nmWv","CNHmvKsjRK","29QAzRBhp0","IRh48MojnP","VLTy6ix74r","RsQUqmX2GE","5NammWreyP","1j5L89iGoT","JRJQBSmGzv",
+"NOHszsqVrf","Nxx9VFGzgp","Pb1pa9GXkX","FVMxofLNg8","lj07QgjUTu","0MR5XOxWIH","Oz8yZBpYhV","4QMc9Ss0Zu","Chuy3dmoS7","b29RJChuy3",
+"uupzk3otm6","S77LHQssNC","nlaByxReec","taOXK9GXkX","NOHsziqv4k","tvdkDLewvM","AIYUulm0pD","0BmCy0PktI","y94nw7X3uy","M3zXLOz8yZ",
+"8FmFHFFDui","uZPqg0YAGH","vkCHH5nmWv","BFkb8lj07Q","dhSuHoGu6x","FnPFBHRxd8","4W0TlOUYuF","BCxeC9GXkX","MmsIoyToGW","jSjS3OUYuF",
+"zz4ZUFjHXR","NcICAQworu","0PktIfFDrJ","2TRI7FwEJz","dhSuH9rlg9","MmsIoRmDcr","TXQ0ZlH1kt","D6rByn8pJ9","uJScXYh1hF","zHF1qhE1Ql",
+"JIqXiokgRi","HlUbFuQIcz","ulk415Mg9r","FjHXRmz8gx","lpF6WzbIYY","wDajXyofH3","AIYUuRACuj","cL0aEFcWrW","OHaBzEOE1o","6q6L9cmXIX",
+"9XyT9HlUbF","tvdkDbgJAz","O3iyQAmdQd","3otm6n8pJ9","DQimprz7Ut","Uvlv46AFT0","8TxD7uN6r3","JJs5matef2","MK07YIjTwP","brhlQcmXIX",
+"AXpwEAXpwE","64s8NHP433","v2eC3AXpwE","KsjRKUmaEv","zbIYYQssNC","1LB1LVLTy6","29QAzrz7Ut","rhl0JvkCHH","xciqpaDGtS","0Wr5ydpe1v",
+"2hEEUIjTwP","uupzkzQt6Q","Waim6RpBQm","RxrsmcQOnv","W3VFH5VZjS","uoStwFcWrW","HP433uAWyp","WDVWJBpYhV","Gv3Fq7hyVv","618DiSmGzv",
+"taOXKC2Irc","W7cTsiqv4k","rz7Ut7fsYM","xXTI4pWiOs","FGzgpzFgtB","StlDJ29QAz","LewvMQChxs","ksJbyVNCPd","FVMxouN6r3","yToGW4QMc9",
+"P6bcgNcICA","dhSuHBFkb8","ydG8UQbxXc","7ku1pdmoS7","7fsYMjfREu","Chuy3QssNC","uupzkQ6hMC","S2DfuReKEW","AOgEe7lUXZ","JIqXiSs0Zu",
+"Vprf2QssNC","mz8gx5ZaEz","tAOsrRACuj","GSQwj7hyVv","BGaQYlweGy","DQimprKDLJ","nnP8oJ2mQi","Uvlv4bZLvS","dmoS7O3iyQ","Ul4a1Fhtgl",
+"AOgEeUl4a1","2hEEUlH1kt","lViBvpAhR1","Vprf2jSjS3","BCxeCAOgEe","FVMxoTwano","1LB1LTCgPp","L7cGcdpe1v","xXTI4SWfou","zmLYDzmLYD",
+"Waim6Waim6","8FmFHhSSvQ","Ss0ZuK20wK","OUYuFl83Ud","zmLYDlm0pD","AXpwE9iGoT","FLsphHlUbF","dpe1vpWiOs","Vprf2ix74r","Ul4a1CdyBV",
+"WmadAeuZA5","qaofNRpBQm","qQxHPRkQke","s93MlKASQ8","RACuj5VZjS","xciqpuJScX","FFDui0PktI","SmGzv5Mg9r","Kr8ys7X3uy","y94nwJIqXi",
+"5Mg9rThjNn","9GXkXGrDg7","AkKTkyofH3","Waim6SmGzv","8TxD7dpe1v","O3iyQ7fKYU","NcICA8TxD7","DLhzMmz8gx","tl72WVerEA","kZANm7lUXZ",
+"XyPZNRsQUq","sqVrfX6Pin","d85a9AkKTk","lkMUA1LB1L","ydG8Usoy9t","LewvM48cHL","TCgPpzY1GY","JJs5myvOMI","fqypyMezSW","SjskQyvOMI",
+"MmKGJaDGtS","oGu6xSjskQ","nnP8ouLtKs","W7cTs55rfB","Dz1R3SmGzv","8hJdthe9IA","RmDcrNAFuw","VLTy69XyT9","0BmCyfmIK1","vkCHHtl72W",
+"pFrrlblLA9","jiVBPn1pmO","VIlwPx3LDe","Yw2oU0MR5X","oVQp66q6L9","QnJ1SMaJQs","xXTI464s8N","CxVEf0BmCy","lsQGoyofH3","KZamH8hJdt",
+"rKDLJFVMxo","a00b5UlU3M","NOHsz5iGN5","RxrsmiwzGk","XflUqhUTw7","prNT6Rxrsm","F6PT2lViBv","xXTI4KZamH","0ao3lQnJ1S","16lHcbZLvS",
+"D6rByjfREu","NAFuw24ARF","AkKTkLewvM","ogLgcQWxoT","5drc65VZjS","7fKYUhUTw7","NhXduFcWrW","oGu6xCxVEf","zqH0WwiHrZ","FFDuifLNg8",
+"zFgtBBbwgA","BbwgAdpe1v","uPX7G3weIF","CdyBVRBhp0","Mm8siFLsph","HP433iB08l","ydG8UX6Pin","azIWpxReec","1LB1LRACuj","DcpWBBbwgA",
+"nFqikuTacx","K20wKThjNn","AXpwEAkKTk","tlILts4786","F6PT2lweGy","2Yz7Ev2eC3","BFkb8uQIcz","QssNCuJScX","3otm6G1RhS","3otm64W0Tl",
+"WMiS3YjB9t","Kr8ysWDVWJ","8cVD3jtn0X","2Yz7E5ZaEz","cmXIXRmDcr","W7cTsjfREu","AmdQdZJTXH","fmIK15VZjS","G1RhSEdBKc","gjUTu0Kyfs",
+"WmadAI7p2a","zFgtBVjCZq","QClRLuAWyp","yofH3Chuy3","AkKTkcQOnv","AmdQdLDk6f","iwzGkb29RJ","zqH0WpT8wu","EdBKcyEfy9","pWiOsJ2mQi",
+"BpYhVlsQGo","0YAGHZJTXH","n1pmO7lUXZ","SmGzv0Kyfs","lm0pDiwzGk","uLtKsAmdQd","iqv4kbgJAz","hi5X7m4bxU","gf8rIaL6AJ","D6rByjiVBP",
+"QClRL4W0Tl","8FmFH8RCUA","MmKGJd85a9","0YAGHuN6r3","QWxoTG1RhS","taOXKkZANm","lpF6Ws7Mxk","nFqikd7vjM","64s8NYOfrY","XyPZNzQt6Q",
+"Pb1padjsrv","gf8rI1LB1L","pT8wu1LB1L","aL6AJwDajX","0PktIEoToP","55rfBtvdkD","Yf2EcZuDtD","OUYuFyluBx","NcICARxrsm","RxrsmFLsph",
+"FjHXRlXFOB","Q6hMC1LB1L","FLsphguMb8","aez9yUvlv4","Yf2EcEOE1o","ZuDtDNcICA","uJScXjeskS","2hEEUgtCA5","4QMc9XflUq","5drc6lH1kt",
+"1LB1Lv1Hln","brhlQ0Kyfs","Y1mC0W7cTs","EoToPuupzk","QworuksJby","s7MxkMK07Y","NcICAv2eC3","WreyP2Nslm","iKqhr0MR5X","IBe8kEOE1o",
+"VjCZqjeskS","2DREsHP433","FwEJzjiVBP","nFqikMezSW","1LB1LJRJQB","ZuDtDd7vjM","TCgPpMK07Y","gjUTu4W0Tl","CdyBViqv4k","atef2WPmlx",
+"OHaBzCfgr3","IRh487fKYU","fFDrJuTacx","s93MlGSQwj","4W0TluAWyp","Yw2oU8xEKz","8U2nUrz7Ut","BCxeCKASQ8","64s8NFGzgp","O3iyQuAWyp",
+"xciqpydG8U","TCgPpsoy9t","JXljWMojnP","pmeCdMmKGJ","jSjS3xciqp","K4GS8azIWp","4dEz61v5hH","lkMUAZJTXH","CK5W75Mg9r","DLhzMQWxoT",
+"OUqFMuAWyp","CNHmv7fKYU","9rlg9K20wK","qUJMdAXpwE","qQxHPix74r","5iGN5Uvlv4","Pb1paLDk6f","fmIK1y94nw","oVQp6JJs5m","ZuDtD3otm6",
+"suY4xHP433","euZA52Nslm","Q6Lixrhl0J","MmKGJ7X3uy","ZzJHWlsQGo","zbIYYjeskS","n8pJ97Ow5C","blLA9pv0i7","SWfou0PktI","lweGyXyPZN",
+"KASQ87Ow5C","2TRI7EOE1o","9XyT9y94nw","uLtKsO3iyQ","fcJOyuoStw","HRxd8Chuy3","l83UdXyPZN","rz7Utiqv4k","uTacxZJTXH","faHirMGlTF",
+"gdQsSxXTI4","6AFT0YjB9t","lweGylweGy","cL0aE8U2nU","HfyNQdhSuH","U3yw5lweGy","DLhzM14FLR","jtn0XQChxs","Yf2EcX6Pin","2NslmVLTy6",
+"nlaBycShY2","VjCZqZhwG1","FxX9qAXpwE","4W0TlQnJ1S","Dz1R3yofH3","ciuWzBGaQY","MaJQsyToGW","cQOnvNAFuw","1LB1Ld7vjM","fFDrJlH1kt",
+"lXFOBQssNC","iqv4ktuDyS","48cHLZ4I1v","DG4sTuPX7G","zqH0WRmDcr","Z4I1vJJs5m","Yh1hFZuDtD","FPfSEyvOMI","45cIHiwzGk","cL0aEQChxs",
+"ZhwG19XyT9","sqVrfAIYUu","Kr8yslXFOB","4dEz6lweGy","fcJOy3weIF","CdyBVIn3NS","VjCZqRzaZA","MGlTF48cHL","0PktIGv3Fq","s478614FLR",
+"6q6L9MaJQs","lsQGo0BmCy","gIYvEpvgjS","1v5hHTwano","StlDJokgRi","vkCHH2Yz7E","P6bcgyvOMI","Mkgy8vLsmS","BCxeCMmKGJ","ru4UGhi5X7",
+"pFrrlsoy9t","zz4ZUix74r","HfyNQUmaEv","dmoS7tlILt","HRxd8jSjS3","KsjRKCNHmv","JXljWNhXdu","suY4xEdBKc","jfREuYw2oU","5nmWvrz7Ut",
+"MmsIoU3yw5","n8pJ9ulk41","WmadAt59lR","qaofN9XyT9","OHaBzBFkb8","cL0aEO3iyQ","OUYuFJJs5m","zz4ZUdjsrv","qUJMd45cIH","POUYS64s8N",
+"jiVBPSs0Zu","6q6L9lpF6W","zY1GYEoToP","Yh1hFcmXIX","lpF6WzqH0W","iwzGkoQ87r","1v5hHguMb8","C2IrcbgJAz","azIWpYOfrY","5drc6guMb8",
+"IBe8k618Di","jiVBPlm0pD","tAOsrFFDui","xReecsoy9t","P6bcgW7cTs","d7vjMTa8f6","AXpwElweGy","VBjhzlXFOB","Mm8siMaJQs","v2eC3l83Ud",
+"Nxx9VDQimp","uJScX0ao3l","zz4ZU0YAGH","LDk6fzHF1q","WMiS3prNT6","i7WMQ2DREs","FPfSEZhwG1","G1RhS9XyT9","t98iW9y4lw","m4bxUn8pJ9",
+"dpe1vv2eC3","uPX7GDLhzM","oQ87rZzJHW","lkMUAYOfrY","SmGzvZhwG1","XflUq5Mg9r","uvf7AY1mC0","9GXkX8hJdt","2TRI7GXdoH","uN6r3BbwgA",
+"4dEz6aez9y","lCMxyQWxoT","7X3uylXFOB","BbwgAcL0aE","J2mQioVQp6","piJSkDLhzM","YOfrYOHaBz","IRh48lj07Q","IjTwPMaJQs","8RCUA8hJdt",
+"o8UydVIlwP","piJSkP6bcg","IBe8kdmoS7","MezSWt98iW","WDVWJGv3Fq","AIYUuNOHsz","nnP8oydG8U","pmeCdcL0aE","hYBCKNo0Qb","n1pmO4QMc9",
+"okgRit59lR","l83UdrKDLJ","16lHcL7cGc","m4bxUjfREu","5IhmGHRxd8","cL0aE4QMc9","WDVWJsoy9t","TXQ0Z0PktI","IBe8kHzZT8","bZLvSPb1pa",
+"9GXkXNOHsz","yToGWD6rBy","x3LDeuZPqg","14FLRiwzGk","GWqqXNcICA","8xEKzs7Mxk","xXTI41v5hH","Zv7z08xEKz","ix74r5iGN5","lXFOBFGzgp",
+"gjUTuWPmlx","48cHLqQxHP","blLA9vOqCE","tlILty94nw","fqypyChuy3","s4786W3VFH","gf8rIaDGtS","J2mQiWDVWJ","OUYuFHRxd8","Q6LixVBjhz",
+"K20wKLewvM","b29RJHlUbF","8U2nU5VZjS","HRxd8i7WMQ","fmIK13otm6","0YAGHWaim6","8FmFHvkCHH","In3NSF6PT2","xReeclXFOB","iqv4k2ZHdk",
+"14FLRWmadA","MojnPNxx9V","k85AeWaWsv","rz7UtFhtgl","CqqaDjtn0X","ThjNn0BmCy","Uvlv4BpYhV","oVQp6aL6AJ","WMiS3uoStw","dQ586DG4sT",
+"0h1b1rKDLJ","k85AeGWqqX","9y4lwhSSvQ","618DiHP433","iqv4kcQOnv","LewvMpT8wu","GrDg7fcwDa","5drc6x3LDe","FwEJzs4786","zQt6QWDVWJ",
+"GWqqXn1pmO","NhXdusx5Gl","h1zcHYjB9t","DG4sTNcICA","uQIczs4786","MezSW5Drn0","kB5nPQnJ1S","s7Mxke6e4z","5ZaEzKr8ys","yofH3yToGW",
+"W3VFH3otm6","v1HlnoVQp6","hSSvQGSQwj","oGu6x2Yz7E","Waim6Ul4a1","pAhR1sqVrf","fLNg8ogLgc","2NslmFcWrW","uvf7AU3yw5","5IhmGuTacx",
+"tvdkDMezSW","sqVrf8cVD3","uAWypnlaBy","hE1Ql2Yz7E","IjTwPOUYuF","t59lRm4bxU","mX2GE9XyT9","Q6Lixk85Ae","4QMc9uoStw","zmLYDYw2oU",
+"IRh48zQt6Q","6AFT06q6L9","dQ586KsjRK","dpe1vaez9y","TwanomX2GE","lXFOBMojnP","NhXduzbIYY","6AFT0Q6Lix","pAhR1Vprf2","Z4I1vIn3NS",
+"okgRiuoStw","24ARFcmXIX","zY1GY3weIF","suY4xrKDLJ","lm0pDRsQUq","nlaByjSjS3","0BmCyJRJQB","djsrvEoToP","24ARFhi5X7","5VZjSfLNg8",
+"55rfBHP433","aFFssHRxd8","d85a9ZJTXH","7ku1paDGtS","rKDLJk85Ae","dhSuH7X3uy","v2eC3ReKEW","VBjhzzHF1q","QYxC0WaWsv","8TxD7blLA9",
+"gtCA5pT8wu","W7cTsv2eC3","7ku1pX6Pin","BGaQYi7WMQ","IKxdL7ku1p","2TRI7hUTw7","64s8Nx3LDe","5Drn0pmeCd","16lHcWreyP","F6PT27lUXZ",
+"pmeCdSbRYy","L7cGcpvgjS","ECMvUsoy9t","TCgPpn1pmO","FVMxoKsjRK","5IhmGMaJQs","8TxD75VZjS","ZzJHWyToGW","FLsph24ARF","iwzGkx3LDe",
+"JKWYRxReec","FjHXR5VZjS","l83UdeuZA5","MojnPhi5X7","4dEz6l83Ud","SjskQMaJQs","ZuDtDzY1GY","7Ow5CMezSW","RBhp0a00b5","vLsmSWaWsv",
+"b29RJrz7Ut","prNT61v5hH","djsrvuTacx","HlUbFBCxeC","3otm6uZPqg","8U2nU580YD","gjUTucQOnv","GrDg76q6L9","lj07QCp3mZ","hUTw7MmKGJ",
+"Yh1hFYh1hF","DG4sTWMiS3","9GXkXhYBCK","Cfgr3VNCPd","lpF6WnlaBy","TXQ0ZuQIcz","lCMxyBbwgA","6AFT024ARF","UmaEvhSSvQ","pT8wu29QAz",
+"QworulpF6W","EOE1ouN6r3","B3qemcShY2","tAOsr48cHL","bgJAzsqVrf","hi5X7HlUbF","iB08la00b5","lXFOBo8Uyd","I7p2aU3yw5","EoToPMmKGJ",
+"jfREuZJTXH","In3NSGrDg7","RBhp0MojnP","rKDLJX6Pin","azIWpGrDg7","uvf7AgdQsS","NcICASbRYy","K20wKjtn0X","9XyT9TXQ0Z","JXljWNo0Qb",
+"J2mQiuJScX","jfREu618Di","nlaByguMb8","RsQUq8hJdt","Chuy345cIH","suY4xhUTw7","Nxx9VOUqFM","kB5nPW7cTs","sx5Gl0Kyfs","ECMvUZUnqt",
+"Zv7z0ZJTXH","BFkb8tl72W","uTacxOxWIH","9eoRcqUJMd","7ku1p14FLR","FNYIMBCxeC","0ao3luLtKs","XflUq6q6L9","QChxsaFFss","jS1ajUlU3M",
+"0h1b1y94nw","5IhmGQssNC","tuDySvLsmS","RzaZAzz4ZU","NcICAzHF1q","GrDg7No0Qb","jtn0XF6PT2","BpYhV0Kyfs","zqH0Wsx5Gl","brhlQokgRi",
+"KsjRKfcwDa","s4786yluBx","ZzJHW5nmWv","DG4sTOz8yZ","WMiS3dhSuH","FwEJzUl4a1","uoStwNo0Qb","9rlg94dEz6","vkCHHVprf2","b29RJjiVBP",
+"Uvlv4yofH3","QbxXcWmadA","LbRTHuN6r3","Oz8yZ8hJdt","zHF1qNcICA","I7p2a1v5hH","0PktIWaWsv","jS1ajtvdkD","MGlTFpvgjS","GXdoH2hEEU",
+"JJs5m9iGoT","piJSkguMb8","FVMxoB3qem","64s8NtjQxs","ydG8U8TxD7","VLTy6m4bxU","UlU3M3weIF","yluBx5ZaEz","aFFsszmLYD","Gv3FqDG4sT",
+"G1RhSjtn0X","RACuj7X3uy","BFkb8piJSk","XflUqReKEW","cQOnvAgJHQ","Yw2oUzmLYD","WMiS3faHir","lj07Q0Wr5y","aez9y9iGoT","0MR5XvOqCE",
+"iKqhrHRxd8","64s8N5IhmG","FnPFB64s8N","MK07YAIYUu","bgJAzm4bxU","gdQsSJ2mQi","HzZT8CxVEf","8U2nUMm8si","uoStwD6rBy","lkMUA7Ow5C",
+"lm0pDjSjS3","8RCUAChuy3","lsQGoHfyNQ","MaJQslsQGo","piJSkK4GS8","G1RhSWDVWJ","uoStwtl72W","580YDHlUbF","8cVD35VZjS","fcwDapAhR1",
+"BbwgA5Mg9r","e6e4zaL6AJ","MaJQsi3pyd","MK07Y4W0Tl","IKxdL4dEz6","gtCA5h1zcH","y94nwb29RJ","lH1ktpAhR1","OxWIHs7Mxk","y94nwqaofN",
+"aFFssuvf7A","In3NSs7Mxk","EoToPlm0pD","t98iWBpYhV","DQimpGv3Fq","AOgEeWDVWJ","oQ87rxXTI4","fLNg8K20wK","rz7UttaOXK","he9IAdjsrv",
+"MmsIoyEfy9","5IhmGM6qcG","MaJQspFrrl","POUYSJIqXi","F6PT2GSQwj","n1pmORkQke","VerEAFjHXR","YOfrYMmsIo","rKDLJguMb8","wDajXiKqhr",
+"QssNC5VZjS","GSQwjYw2oU","PYBf42TRI7","yofH39iGoT","faHir8U2nU","xXTI4dmoS7","0YAGH0BmCy","v1HlnjSjS3","P6bcgQClRL","PYBf4vLsmS",
+"0PktIqQxHP","7lUXZcL0aE","JkzUn7fKYU","AkKTkSbRYy","55rfBQYxC0","1v5hHmz8gx","ksJbyqQxHP","fcwDan1pmO","Vprf2YjB9t","RzaZANhXdu",
+"9GXkXvOqCE","YjB9tFGzgp","8TxD7SWfou","brhlQK4GS8","JkzUnS77LH","tjQxsyvOMI","JkzUn5Namm","k85Ae6AFT0","8FmFHgjUTu","FnPFB5Mg9r",
+"guMb8rhl0J","vOqCE0Kyfs","FVMxoFPfSE","9GXkXAIYUu","YOfrY9eoRc","uLtKsBCxeC","i3pydK4GS8","RzaZADz1R3","Vprf2Twano","jS1ajhi5X7",
+"a00b5BCxeC","K20wKhUTw7","sqVrfpmeCd","1LB1LtaOXK","K20wKn8pJ9","Cp3mZKsjRK","dpe1vQ6hMC","SmGzvO3iyQ","he9IA8TxD7","gf8rIfLNg8",
+"8RCUA2Yz7E","FLsph580YD","zFgtBaez9y","aFFssTa8f6","HlUbFMGlTF","Ul4a1lCMxy","WaWsv0h1b1","BbwgAwDajX","ZJTXHFnPFB","aFFssOUYuF",
+"aFFssuTacx","k85Ae2Yz7E","3weIFZv7z0","pmeCdSWfou","suY4xrz7Ut","gjUTu8TxD7","zY1GY1LB1L","Nxx9V48cHL","sx5Gl8RCUA","OUYuFLbRTH",
+"TwanoAOgEe","45cIHStlDJ","aDGtSIjTwP","hUTw7POUYS","CxVEfRzaZA","Q6hMCs4786","vOqCECp3mZ","9rlg9Ss0Zu","2ZHdkRxrsm","9rlg9RsQUq",
+"cmXIXI7p2a","lpF6Wsoy9t","pFrrltlILt","ZuDtDMGlTF","0BmCy7Ow5C","Pb1paMezSW","Gv3FqYjB9t","GrDg7Ss0Zu","hi5X7QnJ1S","HzZT80Kyfs",
+"qaofNzmLYD","lm0pDZ4I1v","CK5W7qUJMd","2ZHdkuN6r3","lkMUARmDcr","EoToPNAFuw","Ta8f6JKWYR","K4GS85VZjS","BCxeCVBjhz","gtCA5aDGtS",
+"7Ow5C8hJdt","x3LDe7ku1p","EdBKchi5X7","rz7UtQ6hMC","Pb1pa0Wr5y","tvdkDdQ586","7Ow5CNxx9V","zmLYDG1RhS","hi5X77X3uy","7hyVvyofH3",
+"lkMUAMGlTF","7fKYUBFkb8","uoStwmz8gx","pT8wuF6PT2","iB08l0h1b1","5drc6JIqXi","vOqCE0MR5X","fqypybrhlQ","ogLgc07n1c","WDVWJuJScX",
+"hUTw7lkMUA","t98iWogLgc","7fKYUd85a9","5VZjSh1zcH","suY4xMezSW","uQIczWPmlx","uQIcziB08l","6q6L9JJs5m","uQIczfcJOy","7lUXZZUnqt",
+"8TxD7jiVBP","hi5X7UlU3M","Q6hMCQ6Lix","IjTwPX6Pin","k85AeVNCPd","HRxd8OUqFM","In3NSJRJQB","HfyNQFcWrW","JIqXik85Ae","Ta8f6t59lR",
+"gjUTuAgJHQ","faHirjeskS","Zv7z05Mg9r","2hEEUBGaQY","0ao3laFFss","o8UydCNHmv","DG4sTIBe8k","kZANmuLtKs","xciqppvgjS","M6qcG9rlg9",
+"HRxd8soy9t","2hEEUbrhlQ","he9IAQChxs","16lHc3otm6","bZLvSSbRYy","Yf2EcAIYUu","e6e4zdQ586","BCxeCJIqXi","QChxscQOnv","6q6L9vkCHH",
+"9iGoTZv7z0","O3iyQRsQUq","6q6L98cVD3","BpYhVdhSuH","jeskS1j5L8","yToGWRmDcr","piJSkRxrsm","IBe8k5nmWv","AmdQdHzZT8","O3iyQJKWYR",
+"ECMvUv1Hln","y94nw5Mg9r","Pb1pa24ARF","7fsYMoGu6x","IRh48uZPqg","CK5W7DLhzM","7hyVvRsQUq","ZhwG1VerEA","J2mQi618Di","uLtKsQClRL",
+"7fKYUhSSvQ","yvOMIYOfrY","lpF6W0Kyfs","taOXKyvOMI","MmsIovOqCE","9iGoTpAhR1","rKDLJJJs5m","soy9tWaim6","OHaBzCIShG","JkzUnpT8wu",
+"qaofNSs0Zu","wDajXQChxs","I7p2aZuDtD","Chuy3Qworu","lweGytuDyS","5nmWvPOUYS","5NammkB5nP","07n1cRmDcr","JRJQBK20wK","ix74rQbxXc",
+"C2IrcF6PT2","qUJMdyofH3","azIWpqQxHP","FFDuitvdkD","yEfy9WreyP","fFDrJSbRYy","HfyNQStlDJ","BFkb8tlILt","ulk41Twano","MGlTFk85Ae",
+"Pb1paBGaQY","AgJHQVLTy6","qQxHPFjHXR","EOE1ofmIK1","RxrsmNOHsz","qQxHPLbRTH","cL0aEs93Ml","pWiOslXFOB","m4bxURzaZA","NhXduhi5X7",
+"CNHmvNo0Qb","lpF6WSjskQ","Oz8yZpFrrl","hi5X7VNCPd","yofH3M6qcG","0BmCyogLgc","fcJOyhe9IA","lXFOBlm0pD","29QAzVIlwP","Chuy3M6qcG",
+"5drc6ydG8U","64s8N0Wr5y","WreyPeuZA5","QWxoTn1pmO","8U2nUOHaBz","9GXkXcQOnv","mz8gxkZANm","0BmCyciuWz","YOfrYS2Dfu","Waim66q6L9",
+"2ZHdkoGu6x","ZJTXHRkQke","n1pmOY1mC0","GWqqXiB08l","HP433i3pyd","hi5X79iGoT","jeskSNAFuw","ulk41a00b5","5IhmGn1pmO","7lUXZBCxeC",
+"JJs5m5Drn0","jiVBPlj07Q","atef27X3uy","0MR5XKr8ys","lkMUAkZANm","W3VFHx3LDe","IRh48NOHsz","atef20BmCy","FhtglvkCHH","oVQp6ZhwG1",
+"lm0pD14FLR","uTacx6AFT0","HP433FcWrW","9GXkX2hEEU","ulk41Ul4a1","5Drn0FLsph","MmKGJQWxoT","nFqikuoStw","uoStwsqVrf","MK07YIRh48",
+"lCMxyjiVBP","uQIczbgJAz","8cVD3ulk41","Waim6In3NS","SjskQHfyNQ","nnP8oYjB9t","zQt6QCqqaD","jzUqRlpF6W","l83Ud4QMc9","64s8N7X3uy",
+"lm0pDVprf2","OUqFMAkKTk","AgJHQydG8U","RmDcrvOqCE","gjUTuMm8si","aDGtSYh1hF","dpe1vGrDg7","MojnP1j5L8","BCxeCv2eC3","ulk415Drn0",
+"pmeCdlm0pD","UmaEvZ4I1v","7Ow5Csoy9t","jfREudpe1v","lXFOBAOgEe","jfREu3otm6","brhlQOHaBz","TwanoP6bcg","TCgPpNAFuw","aL6AJdmoS7",
+"XyPZNi3pyd","AOgEeyofH3","FcWrW0BmCy","ThjNnOHaBz","NhXduLDk6f","8hJdtLDk6f","0PktIoQ87r","ZhwG1nlaBy","yEfy9jtn0X","tvdkD2TRI7",
+"m4bxUJIqXi","uQIcz6AFT0","ZuDtDNo0Qb","NcICA0YAGH","D6rByUvlv4","HP433aez9y","VerEAWmadA","lViBvn8pJ9","7ku1p0YAGH","9GXkXfcJOy",
+"FVMxo14FLR","K20wKblLA9","iwzGkRBhp0","rKDLJhYBCK","DQimpjfREu","7X3uy7X3uy","AIYUuuQIcz","Q6Lix6AFT0","ZJTXHXyPZN","qQxHPtlILt",
+"TXQ0Zh1zcH","gtCA5sx5Gl","FwEJz9XyT9","M3zXLBbwgA","0Kyfs55rfB","9y4lwI7p2a","VerEARACuj","5iGN5QnJ1S","ZJTXHKsjRK","OUqFMzqH0W",
+"dhSuHFPfSE","pAhR1No0Qb","FFDuiyToGW","5iGN5nFqik","y94nwOz8yZ","ZuDtDuAWyp","FVMxofqypy","K4GS8taOXK","FjHXRfcJOy","ksJbyNcICA",
+"RACujfcwDa","POUYStjQxs","dhSuHmz8gx","HRxd88TxD7","AXpwEuQIcz","tvdkDpFrrl","DLhzMFcWrW","Kr8ysatef2","qQxHPd7vjM","zHF1qJ2mQi",
+"dhSuH5iGN5","lm0pDAIYUu","AXpwEmz8gx","GXdoHdmoS7","v2eC3Ta8f6","blLA9yluBx","jtn0XpvgjS","t59lRIjTwP","O3iyQtuDyS","uJScX48cHL",
+"XyPZNdmoS7","gf8rISjskQ","fcwDaNAFuw","pFrrlJkzUn","vOqCEC2Irc","MezSWChuy3","9iGoTVprf2","1j5L8t98iW","9rlg9ulk41","tjQxsuPX7G",
+"BFkb8cL0aE","fFDrJQssNC","ZJTXHIRh48","QWxoTUl4a1","LbRTHMkgy8","F6PT2WaWsv","SmGzvUmaEv","NcICAzFgtB","ksJbyS77LH","AkKTkdpe1v",
+"XyPZNzFgtB","7ku1puTacx","DLhzMOz8yZ","ix74r8xEKz","lViBvs4786","Yw2oUaL6AJ","iqv4kRkQke","2Nslm5IhmG","n8pJ9fcwDa","WPmlxFjHXR",
+"Gv3FqHzZT8","U3yw5uAWyp","FwEJzcQOnv","CxVEf7X3uy","xXTI4RkQke","fqypy2hEEU","vkCHHaez9y","YjB9tK4GS8","yofH3lweGy","uupzkgjUTu",
+"yluBxtuDyS","2Yz7EAOgEe","EdBKcxXTI4","LbRTHChuy3","OxWIH1j5L8","m4bxUdmoS7","zQt6Q2hEEU","EOE1ohUTw7","WaWsvFnPFB","RzaZAC2Irc",
+"24ARFBFkb8","yluBxQClRL","SmGzv4W0Tl","ni2v19y4lw","580YDhYBCK","29QAzvkCHH","kZANmP6bcg","5VZjSFLsph","cmXIX7X3uy","RzaZAO3iyQ",
+"d7vjMbZLvS","W3VFHM3zXL","NhXduydG8U","lH1ktHzZT8","24ARFRsQUq","HzZT8uJScX","HzZT8AkKTk","ydG8USjskQ","DLhzMQnJ1S","HzZT8dmoS7",
+"OxWIHFGzgp","9eoRc2ZHdk","Yf2EcTwano","zmLYDxciqp","JKWYRfmIK1","TwanoECMvU","n1pmOhi5X7","pAhR1JXljW","uZPqgpT8wu","Chuy3B3qem",
+"Cfgr3l83Ud","fLNg89GXkX","cQOnva00b5","hi5X7kB5nP","Chuy3Nxx9V","RACujpFrrl","aez9yWreyP","zqH0WZhwG1","uQIcz24ARF","oGu6xcShY2",
+"Mkgy8FjHXR","7hyVvDLhzM","o8UydJkzUn","FjHXRzQt6Q","QworuBpYhV","jiVBPdmoS7","lj07QWmadA","pT8wut98iW","dhSuH0PktI","55rfBtl72W",
+"4dEz6I7p2a","7X3uy1j5L8","uAWypNxx9V","Gv3Fqa00b5","RxrsmK20wK","EoToPQChxs","CIShGxciqp","oVQp624ARF","lkMUA1v5hH","SbRYylpF6W",
+"8FmFHlkMUA","LbRTHCqqaD","lm0pDSmGzv","NhXduWPmlx","nnP8oAgJHQ","xReecWMiS3","VerEAEOE1o","aez9ytl72W","gdQsS55rfB","mX2GE7fKYU",
+"Ul4a1Waim6","IjTwPyofH3","5nmWvcQOnv","7lUXZBFkb8","IKxdLfcwDa","4dEz6B3qem","i7WMQThjNn","cQOnviwzGk","BbwgAOxWIH","d85a9s7Mxk",
+"BbwgAG1RhS","d7vjMMm8si","Ul4a164s8N","FhtglFFDui","Mm8sin1pmO","580YD16lHc","BCxeCiKqhr","WaWsv2DREs","2DREsChuy3","uAWypcL0aE",
+"QClRLDG4sT","qaofNhSSvQ","nFqikYjB9t","Zv7z0gjUTu","AIYUupT8wu","yToGWLDk6f","ix74rhi5X7","RBhp09XyT9","uupzkn1pmO","64s8NAIYUu",
+"euZA55VZjS","RmDcrMezSW","16lHcs93Ml","GWqqXJRJQB","Yf2Eculk41","Yh1hFbZLvS","2hEEUNo0Qb","MK07YcmXIX","8RCUAC2Irc","oQ87rru4UG",
+"Yh1hFdjsrv","0BmCyksJby","AXpwEcQOnv","CxVEfblLA9","jiVBPQ6Lix","1LB1LZhwG1","CK5W7pAhR1","iB08lQ6Lix","sqVrfB3qem","n8pJ90Kyfs",
+"o8UydhSSvQ","JRJQBiqv4k","ZUnqts4786","lpF6WNxx9V","8TxD7GWqqX","VerEAqUJMd","JkzUnnnP8o","fmIK1HP433","AOgEelj07Q","IjTwPxReec",
+"55rfBLbRTH","QssNCtvdkD","RkQkejtn0X","I7p2aFjHXR","nlaBygjUTu","KZamHWaWsv","tl72WHfyNQ","lViBvCdyBV","hYBCKMojnP","vOqCEfFDrJ",
+"48cHL4dEz6","M6qcGpWiOs","AXpwEdQ586","HlUbFFFDui","WDVWJYh1hF","NcICA8xEKz","uupzkJXljW","2TRI7ru4UG","14FLRBCxeC","Oz8yZMojnP",
+"FGzgpS2Dfu","ydG8UUl4a1","Mkgy8zY1GY","0Wr5yYw2oU","ZzJHWNOHsz","TCgPpuQIcz","DG4sTTwano","fmIK1VLTy6","n8pJ98U2nU","uTacxuvf7A",
+"CqqaDzmLYD","piJSk5ZaEz","n8pJ9VjCZq","RmDcr0PktI","Ul4a1lpF6W","gjUTulCMxy","MmKGJ07n1c","uJScXtuDyS","hi5X7uLtKs","FwEJz16lHc",
+"UmaEvrz7Ut","gjUTuQWxoT","pmeCdZuDtD","Mkgy8ZUnqt","v8yFNQYxC0","zbIYYIjTwP","7fKYU5IhmG","ThjNn9y4lw","7fsYMQnJ1S","Uvlv4pAhR1",
+"JkzUnru4UG","07n1cSWfou","zFgtBMK07Y","5iGN5QClRL","JkzUnLewvM","fmIK1MojnP","618DipWiOs","SbRYynlaBy","MmsIozmLYD","KASQ8Ta8f6",
+"5drc60h1b1","FNYIMrz7Ut","Waim6CqqaD","FVMxolViBv","azIWp0MR5X","NAFuwJRJQB","jS1ajuoStw","euZA5nnP8o","xciqp4W0Tl","jtn0XlweGy",
+"djsrvlm0pD","mz8gxzbIYY","jeskSQ6hMC","jfREuTwano","0YAGHSs0Zu","lm0pDhE1Ql","dQ586Cp3mZ","UmaEvOUYuF","SbRYyksJby","29QAzkB5nP",
+"yluBx7Ow5C","Chuy3cShY2","zY1GYydG8U","kZANmzmLYD","ZUnqt0YAGH","B3qem5Mg9r","ZhwG1s7Mxk","5nmWv5VZjS","X6PinIjTwP","Cfgr3MaJQs",
+"W3VFHQ6Lix","16lHcdQ586","9y4lwHRxd8","h1zcH48cHL","Kr8ysP6bcg","v1Hln29QAz","ZJTXHiwzGk","G1RhScShY2","lsQGouoStw","vLsmSjtn0X",
+"CNHmviKqhr","hYBCKXyPZN","WmadAqaofN","pvgjSAOgEe","hSSvQmz8gx","xXTI4yToGW","zFgtBFxX9q","CxVEfzY1GY","NOHsz0PktI","J2mQiFLsph",
+"2Yz7EyvOMI","VIlwPQworu","ThjNn14FLR","5drc60MR5X","BGaQYlsQGo","Ul4a1mX2GE","55rfBuZPqg","oGu6xdhSuH","vkCHHU3yw5","cQOnvk85Ae",
+"IBe8klkMUA","0h1b1Chuy3","8RCUAzbIYY","4W0Tlsoy9t","IjTwP2DREs","ogLgcWDVWJ","nnP8oh1zcH","pT8wuzmLYD","cShY2HlUbF","QYxC0WmadA",
+"7ku1pzz4ZU","fmIK1guMb8","5Drn0lweGy","S77LHSmGzv","m4bxU29QAz","zbIYYiB08l","14FLRpT8wu","UlU3M55rfB","8cVD3e6e4z","FLsphzqH0W",
+"7fKYUDG4sT","uZPqgZJTXH","FxX9qRxrsm","EoToP1LB1L","618DiTXQ0Z","prNT6JXljW","EdBKccmXIX","580YDpAhR1","vLsmSpWiOs","GSQwjlViBv",
+"5drc6soy9t","FGzgpVerEA","0PktIogLgc","s7Mxk0MR5X","CK5W7aFFss","uZPqgyofH3","55rfBpT8wu","s93MlRzaZA","LDk6fMmsIo","i7WMQ8FmFH",
+"YjB9tazIWp","AgJHQMmKGJ","dpe1vydG8U","cShY2jtn0X","ru4UG1v5hH","pWiOs4W0Tl","IjTwP29QAz","QnJ1SSmGzv","RsQUqi7WMQ","jeskSI7p2a",
+"EoToPRmDcr","lkMUAfLNg8","dhSuHzz4ZU","iqv4kJkzUn","JkzUnqQxHP","HzZT8M6qcG","uZPqggdQsS","vkCHHzFgtB","IBe8kKASQ8","pT8wugIYvE",
+"zHF1qbgJAz","0ao3lJ2mQi","AkKTkCK5W7","gIYvEYjB9t","AmdQdn1pmO","KZamH45cIH","v2eC32ZHdk","zY1GYpmeCd","jzUqRfaHir","v8yFNi7WMQ",
+"QworublLA9","lweGya00b5","07n1cCdyBV","ZJTXHIBe8k","ulk41RsQUq","POUYSaez9y","HfyNQPb1pa","W3VFHIBe8k","2TRI7ulk41","OUqFMlweGy",
+"rz7UtlsQGo","QWxoTRkQke","Q6hMCuoStw","0ao3lU3yw5","y94nwuvf7A","7lUXZblLA9","atef2IjTwP","bZLvSS77LH","OxWIHPOUYS","S77LHrKDLJ",
+"IRh48qQxHP","WmadAWmadA","gdQsSY1mC0","8FmFHCqqaD","ksJbyKASQ8","uZPqgtlILt","Uvlv4jS1aj","xReectaOXK","atef29y4lw","14FLRqQxHP",
+"TCgPpwiHrZ","HRxd8M6qcG","s4786EdBKc","W7cTsa00b5","VerEAL7cGc","NAFuw618Di","TCgPpni2v1","EdBKcFnPFB","Vprf28FmFH","uAWypgtCA5",
+"s7MxkfFDrJ","lCMxy64s8N","Chuy3zQt6Q","uoStwIKxdL","KsjRKYjB9t","MojnPEoToP","MK07YpWiOs","4QMc9zFgtB","IBe8kFFDui","n8pJ9U3yw5",
+"euZA5uN6r3","In3NSciuWz","jfREuwiHrZ","zQt6QLewvM","kB5nPMmKGJ","zHF1qfLNg8","MezSWoVQp6","EOE1ojSjS3","GrDg7POUYS","M3zXLhi5X7",
+"aDGtSIn3NS","nFqikhE1Ql","lpF6WMezSW","8FmFHzqH0W","lViBvpv0i7","TXQ0ZbrhlQ","24ARFKZamH","Oz8yZt98iW","CIShG0PktI","okgRigIYvE",
+"14FLRGWqqX","FPfSECqqaD","ciuWzVLTy6","5Mg9rzHF1q","0h1b14W0Tl","pAhR1lj07Q","QbxXcMmsIo","VIlwPjSjS3","euZA5QssNC","a00b5NhXdu",
+"FFDuiokgRi","GSQwjY1mC0","k85Aesx5Gl","5drc6lweGy","bZLvSZzJHW","uupzkF6PT2","RACuj618Di","mX2GEIRh48","MaJQsfcwDa","RpBQmQ6hMC",
+"pvgjSm4bxU","gtCA5Waim6","BGaQY24ARF","ZuDtDReKEW","LbRTHlm0pD","b29RJYf2Ec","Y1mC0rKDLJ","hYBCK7fsYM","lkMUAAmdQd","Q6LixuoStw",
+"fFDrJAkKTk","FFDuisqVrf","8TxD7NhXdu","n1pmOaL6AJ","CNHmvO3iyQ","s93Mlsoy9t","kB5nP2Yz7E","qaofNn1pmO","55rfBdQ586","Waim6IRh48",
+"8hJdtZhwG1","brhlQ7X3uy","iKqhrhYBCK","suY4xb29RJ","gtCA5s7Mxk","14FLRzqH0W","x3LDe9XyT9","FLsphP6bcg","Kr8ysokgRi","M6qcG7Ow5C",
+"618Disx5Gl","ZhwG1EoToP","JXljWZv7z0","U3yw5uPX7G","IjTwPEoToP","fLNg8l83Ud","sx5GlRBhp0","Yh1hFOUqFM","580YD9eoRc","ogLgc5Mg9r",
+"1j5L8QYxC0","LDk6fDQimp","uoStwGWqqX","5nmWvWPmlx","t59lRpmeCd","jSjS3AmdQd","uLtKslXFOB","24ARFt59lR","y94nwGrDg7","ciuWze6e4z",
+"TXQ0ZtAOsr","aL6AJ3weIF","lXFOBfcwDa","h1zcHPOUYS","o8UyduoStw","NOHszv2eC3","8xEKzJKWYR","KZamH7Ow5C","s4786LewvM","FLsphpiJSk",
+"FxX9qtvdkD","zmLYDJIqXi","lXFOBzHF1q","qQxHPtaOXK","ulk41ZJTXH","pWiOsK4GS8","JKWYRKsjRK","B3qemsx5Gl","uvf7AHP433","i7WMQhi5X7",
+"QYxC05VZjS","FLsphFwEJz","a00b5QYxC0","uN6r35IhmG","ZhwG1HzZT8","0YAGHjS1aj","9y4lwY1mC0","Y1mC0zz4ZU","aDGtS1j5L8","AOgEeuupzk",
+"Pb1paXyPZN","SbRYyVNCPd","fcwDaSbRYy","0YAGHIRh48","v2eC3nFqik","gIYvE1LB1L","C2Ircpv0i7","0YAGHaez9y","3weIF5Namm","Q6LixwDajX",
+"RBhp07fsYM","S77LHDcpWB","1LB1LZJTXH","DLhzM5nmWv","5nmWvzQt6Q","aFFsszFgtB","Gv3FqFjHXR","Ul4a1hSSvQ","iwzGk8RCUA","Z4I1vjSjS3",
+"y94nwokgRi","JkzUnTa8f6","YOfrY7fsYM","MmKGJrKDLJ","1j5L8VIlwP","jzUqRU3yw5","Kr8yszbIYY","G1RhSOz8yZ","KZamHx3LDe","nlaByIRh48",
+"YjB9tZzJHW","RpBQmiwzGk","45cIH5drc6","8xEKzvkCHH","zz4ZUSWfou","Yf2EcCIShG","ciuWzDG4sT","5Mg9rt59lR","CxVEfMm8si","1LB1L4QMc9",
+"Ta8f664s8N","CdyBVZ4I1v","pT8wuMGlTF","QChxsuTacx","CK5W7JJs5m","MezSWsqVrf","M6qcGRsQUq","tlILt55rfB","ZUnqtxXTI4","Vprf2BpYhV",
+"he9IAoQ87r","yluBxhYBCK","aDGtStAOsr","0PktID6rBy","fmIK1v8yFN","xciqpW7cTs","yofH3FjHXR","WaWsvrKDLJ","vkCHHLDk6f","KZamHKsjRK",
+"Yw2oUrz7Ut","o8UydPb1pa","he9IARpBQm","8RCUAJkzUn","VIlwP24ARF","pT8wuDz1R3","DcpWBReKEW","SbRYy7ku1p","lCMxy14FLR","uTacxK20wK",
+"QworuMezSW","m4bxU7Ow5C","qUJMdF6PT2","aDGtSpFrrl","55rfBxciqp","45cIHv2eC3","ReKEW6q6L9","mz8gxbgJAz","bZLvS55rfB","GSQwjxReec",
+"gjUTuIjTwP","uoStwNAFuw","VIlwPhe9IA","hYBCKQ6hMC","uoStwblLA9","WDVWJQYxC0","jtn0XMezSW","cQOnvaL6AJ","RxrsmVLTy6","8cVD38U2nU",
+"uQIczlj07Q","SWfoublLA9","Q6LixIRh48","zmLYD5VZjS","iwzGkeuZA5","cQOnvEOE1o","2hEEUFLsph","cL0aEGXdoH","YjB9tRsQUq","W7cTsVprf2",
+"VerEA0ao3l","M6qcG5Namm","aL6AJuJScX","K20wKzFgtB","UmaEvlCMxy","JJs5mEdBKc","SWfouQClRL","AgJHQvOqCE","45cIHKZamH","gIYvEOz8yZ",
+"FcWrWQ6hMC","WaWsvCNHmv","55rfBPYBf4","faHirgf8rI","MmKGJdQ586","FjHXREOE1o","zQt6QIBe8k","sx5GlnlaBy","hYBCKBbwgA","lpF6WMaJQs",
+"5ZaEzQChxs","k85AeDcpWB","Yf2EcFVMxo","4QMc9uN6r3","9rlg9M3zXL","dQ586Zv7z0","FxX9qcQOnv","iB08lhE1Ql","Nxx9VDG4sT","Twanoi3pyd",
+"TXQ0Z580YD","2ZHdke6e4z","0YAGHGWqqX","k85AeZuDtD","2DREs0Kyfs","hSSvQFVMxo","CNHmvhSSvQ","SjskQrKDLJ","CIShGDcpWB","HlUbFcQOnv",
+"DQimpVprf2","FNYIMKZamH","K4GS8sqVrf","DG4sTKr8ys","iwzGkB3qem","tAOsrNOHsz","9XyT9gf8rI","gtCA5qQxHP","lkMUAY1mC0","WDVWJFjHXR",
+"FNYIMtjQxs","NhXduqUJMd","s7MxkfLNg8","vOqCEMaJQs","4dEz62TRI7","ZUnqtlCMxy","8xEKz2TRI7","FjHXRi7WMQ","yluBx8hJdt","GWqqXVprf2",
+"dQ586ZuDtD","4dEz6xReec","nlaByjzUqR","aFFssJJs5m","55rfBQworu","aDGtSUvlv4","QChxs7fKYU","guMb8nFqik","aDGtSFNYIM","UlU3MqaofN",
+"fLNg8SWfou","vLsmSpv0i7","pWiOs7ku1p","fcwDaJXljW","RsQUq8FmFH","oQ87rQYxC0","GXdoHCqqaD","l83UdsqVrf","KZamH2hEEU","Q6hMCHzZT8",
+"AmdQdFVMxo","CIShGLewvM","zqH0WlViBv","2Yz7EuN6r3","Yf2EcFhtgl","RBhp0FjHXR","UlU3MKr8ys","nlaBy0BmCy","i7WMQWaim6","bgJAzYf2Ec",
+"lj07QlweGy","BGaQYbZLvS","SmGzvl83Ud","h1zcHrhl0J","guMb8tAOsr","k85Aemz8gx","RBhp08cVD3","S77LH0BmCy","iKqhr14FLR","ECMvUkB5nP",
+"RkQke2TRI7","FcWrWtAOsr","fFDrJY1mC0","fcwDa0Kyfs","W7cTsZv7z0","dmoS7U3yw5","jfREuvOqCE","dhSuH8FmFH","Yf2Ecy94nw","AmdQdEdBKc",
+"OUqFMnnP8o","HRxd8OxWIH","Pb1paRpBQm","dmoS7ThjNn","FxX9q2hEEU","ciuWzIn3NS","24ARFQbxXc","TCgPpRzaZA","RACujVjCZq","RkQkecQOnv",
+"uupzkfmIK1","Pb1paOHaBz","dhSuHLewvM","2Yz7EzQt6Q","lkMUAeuZA5","ksJbyMkgy8","TwanoW7cTs","ulk412Yz7E","dQ5862Nslm","fcJOyNAFuw",
+"DG4sTqQxHP","GrDg7FVMxo","EoToPMGlTF","B3qem7fsYM","BCxeCQWxoT","Chuy38U2nU","O3iyQdjsrv","VIlwPzbIYY","HlUbF64s8N","580YDwDajX",
+"SjskQNcICA","dhSuHd7vjM","Yf2Eclm0pD","e6e4z0MR5X","lsQGoYjB9t","v1Hln2TRI7","BpYhVNOHsz","fFDrJm4bxU","FVMxoRpBQm","LDk6fl83Ud",
+"W3VFH8FmFH","v8yFNCqqaD","7Ow5COxWIH","POUYSlkMUA","5VZjSFVMxo","yToGWv2eC3","oVQp62DREs","FjHXRGWqqX","Yw2oUEoToP","7hyVv5VZjS",
+"xReechSSvQ","RzaZAs7Mxk","DG4sTk85Ae","euZA5jfREu","VLTy6soy9t","brhlQVjCZq","a00b5AIYUu","5Drn0Twano","FjHXRv2eC3","hSSvQQClRL",
+"xciqp7fsYM","suY4xru4UG","9y4lwokgRi","rKDLJMmsIo","DQimpmX2GE","KZamHTXQ0Z","yEfy9QChxs","lkMUAbrhlQ","DQimphE1Ql","TCgPpo8Uyd",
+"EOE1oIjTwP","VNCPd2hEEU","v1Hlnl83Ud","UlU3MyluBx","0KyfsFwEJz","CIShG2ZHdk","SWfoulsQGo","QnJ1SFwEJz","YjB9tgjUTu","9GXkXqaofN",
+"9y4lwlj07Q","ciuWzcL0aE","FnPFBzz4ZU","nnP8oAkKTk","ZJTXHFwEJz","BpYhVQssNC","Mm8sicQOnv","rKDLJ7lUXZ","JJs5mblLA9","lXFOBHzZT8",
+"Kr8ysSbRYy","soy9t4dEz6","nnP8ok85Ae","JkzUnS2Dfu","guMb8jiVBP","FwEJzfqypy","BpYhVMezSW","KsjRKx3LDe","tl72WSbRYy","jfREublLA9",
+"1LB1L5ZaEz","GWqqXy94nw","L7cGcdmoS7","gjUTuhYBCK","VjCZq1v5hH","24ARF2DREs","5VZjS1LB1L","EoToPuAWyp","M3zXLjtn0X","hi5X7tl72W",
+"W7cTssx5Gl","nnP8oxciqp","2Yz7EazIWp","G1RhS7hyVv","atef29iGoT","PYBf4azIWp","JkzUnogLgc","WMiS3KsjRK","5iGN5VBjhz","nnP8ohUTw7",
+"guMb8uoStw","pvgjSReKEW","uoStwuJScX","Mkgy8Rxrsm","jtn0Xiqv4k","m4bxUTa8f6","RpBQmAmdQd","Mm8si9y4lw","bZLvS8FmFH","RBhp02Yz7E",
+"jzUqR0Kyfs","8cVD31j5L8","CK5W7o8Uyd","MmsIoguMb8","zbIYY8U2nU","SjskQStlDJ","6AFT09iGoT","VerEAQ6Lix","24ARFNxx9V","RBhp0XflUq",
+"K4GS83weIF","0MR5XQYxC0","1v5hHAOgEe","dQ586QbxXc","BFkb8NOHsz","MezSWJIqXi","hE1QlPYBf4","VNCPds4786","suY4xtjQxs","MezSWTwano",
+"24ARFsuY4x","ZJTXHwDajX","GrDg79rlg9","BbwgAJ2mQi","s47869eoRc","FjHXRG1RhS","Mkgy8ulk41","yofH3GWqqX","ru4UGK4GS8","JKWYRRsQUq",
+"EoToP0Kyfs","gtCA59eoRc","fcJOyvkCHH","SjskQ4dEz6","n1pmOjzUqR","F6PT2zHF1q","gtCA5SjskQ","gtCA59rlg9","fqypywDajX","MaJQsDLhzM",
+"1LB1LJKWYR","lweGy5VZjS","tl72W4dEz6","d85a90ao3l","No0QbMezSW","oQ87rReKEW","Y1mC0DQimp","9GXkXGXdoH","5VZjSjiVBP","O3iyQ7hyVv",
+"FwEJzgIYvE","ix74rogLgc","RkQket59lR","TCgPpQbxXc","MGlTFOUYuF","lpF6WcShY2","e6e4zaez9y","Yw2oUxReec","qaofNEoToP","OUqFMlpF6W",
+"KZamH5IhmG","In3NS0YAGH","QYxC0CNHmv","GXdoHokgRi","tlILtG1RhS","xXTI4dQ586","fLNg8oVQp6","SmGzvlj07Q","d7vjMgtCA5","ThjNnRBhp0",
+"aez9yJ2mQi","VBjhzHRxd8","qQxHP0h1b1","Mm8si1j5L8","lH1ktIBe8k","0h1b1pv0i7","dQ586KZamH","IKxdLLewvM","29QAzpAhR1","VLTy6RzaZA",
+"zQt6QfmIK1","AkKTkAXpwE","MGlTFMm8si","h1zcHPYBf4","Yh1hFEoToP","5VZjSK4GS8","ru4UG0BmCy","4QMc9JkzUn","FLsphaDGtS","NOHszSjskQ",
+"i7WMQW7cTs","VNCPd0YAGH","MaJQsoGu6x","GSQwjSmGzv","brhlQe6e4z","9rlg9lXFOB","xXTI4OUYuF","pvgjSBCxeC","ni2v17fKYU","guMb8brhlQ",
+"EoToP6q6L9","NOHszpvgjS","SbRYyqUJMd","FwEJzfaHir","v1Hln9iGoT","CNHmvnnP8o","Ul4a1LDk6f","ReKEWUmaEv","MK07Ys93Ml","QworuM3zXL",
+"RsQUqdmoS7","Pb1paRsQUq","sx5GluLtKs","zFgtBGXdoH","uLtKslH1kt","ZuDtDKr8ys","nFqikbgJAz","vkCHHJJs5m","yvOMIRkQke","MezSWxciqp",
+"7ku1p0BmCy","xXTI4WaWsv","zmLYDDLhzM","sqVrfbrhlQ","rz7Utru4UG","i7WMQ48cHL","wDajXzQt6Q","5iGN5EdBKc","8TxD7d7vjM","EOE1obZLvS",
+"UmaEvECMvU","Waim6JKWYR","uPX7G2Yz7E","uoStw1j5L8","AmdQdt98iW","VBjhzO3iyQ","lm0pD9rlg9","618Di9XyT9","LbRTHzHF1q","d85a9FGzgp",
+"jeskSDG4sT","IjTwPa00b5","RBhp0WmadA","GWqqXNOHsz","pT8wuZzJHW","Cp3mZlkMUA","qQxHP8U2nU","pWiOsNxx9V","zmLYDFFDui","8TxD7xReec",
+"dQ586FNYIM","fLNg8NcICA","Zv7z0D6rBy","ZJTXHiB08l","HP433nFqik","618Di8cVD3","QYxC0atef2","pmeCdThjNn","POUYSni2v1","4dEz6ksJby",
+"uupzkBFkb8","o8UydAmdQd","DQimpzbIYY","rKDLJThjNn","5VZjShe9IA","lsQGo8FmFH","wDajXvOqCE","F6PT2Yf2Ec","s7MxknnP8o","lm0pDYh1hF",
+"EoToPix74r","CdyBVtl72W","8RCUAdmoS7","5ZaEzNOHsz","FnPFBs93Ml","FcWrWhi5X7","lkMUA24ARF","CqqaDuoStw","lweGycQOnv","1v5hHlViBv",
+"FhtglS2Dfu","JkzUnlCMxy","xXTI4aL6AJ","JXljW1j5L8","hSSvQIBe8k","4W0TlJJs5m","45cIHksJby","7fsYMtAOsr","iqv4kd85a9","dQ5869GXkX",
+"t59lRuoStw","Yf2EczY1GY","P6bcgsx5Gl","ZuDtDfcJOy","ZhwG1ciuWz","ciuWzoQ87r","d85a99rlg9","zmLYDrz7Ut","IjTwPMGlTF","1j5L86q6L9",
+"l83UdMm8si","9iGoT2ZHdk","8cVD329QAz","zQt6Q2TRI7","v2eC3GWqqX","Kr8ysQYxC0","yofH3OHaBz","4W0TlP6bcg","Ul4a1suY4x","DcpWBn8pJ9",
+"fLNg8BbwgA","xciqpRmDcr","SbRYyRzaZA","hUTw7vOqCE","WmadAChuy3","K20wKsqVrf","M6qcGSWfou","DLhzMBpYhV","B3qem5VZjS","EoToP4dEz6",
+"IRh48Zv7z0","6AFT0MGlTF","AgJHQQbxXc","HzZT8OHaBz","AmdQdCK5W7","JXljWiKqhr","Pb1paCNHmv","mX2GEFVMxo","Mkgy8QYxC0","i3pyd8cVD3",
+"580YDTwano","WmadAn1pmO","uPX7GuQIcz","RzaZAD6rBy","cShY2oGu6x","DQimp7fKYU","jzUqRTXQ0Z","gdQsS8hJdt","Nxx9V64s8N","lH1ktEoToP",
+"RsQUqAkKTk","sqVrfCfgr3","RmDcrvkCHH","pmeCdguMb8","K20wKQbxXc","2Yz7EdhSuH","QworuydG8U","ix74rQssNC","7X3uylm0pD","zmLYD1LB1L",
+"AIYUu5Mg9r","o8Uyd7fKYU","0PktI5nmWv","RsQUqe6e4z","5nmWvvLsmS","DQimphUTw7","StlDJPYBf4","xXTI4MGlTF","fcJOyHRxd8","yEfy9YOfrY",
+"64s8NaL6AJ","tl72Wo8Uyd","Vprf2Mm8si","fLNg8he9IA","2hEEU9eoRc","C2IrcSbRYy","brhlQulk41","blLA9OUqFM","ix74rW3VFH","IjTwPI7p2a",
+"fFDrJO3iyQ","ydG8Uy94nw","2hEEUeuZA5","pAhR1tAOsr","iKqhryEfy9","7fsYMZJTXH","5Mg9rhe9IA","t59lRaez9y","v2eC3v2eC3","Vprf2djsrv",
+"pmeCduoStw","SWfouHfyNQ","0YAGHFPfSE","jiVBPgdQsS","HzZT8lj07Q","tAOsrJkzUn","s93MluN6r3","atef2v8yFN","5Drn0prNT6","ZJTXHmz8gx",
+"8cVD3KASQ8","5iGN59GXkX","WaWsvkZANm","yToGWQnJ1S","JJs5mNxx9V","FFDuiQWxoT","5VZjSqaofN","5Mg9rDG4sT","ECMvU0Wr5y","YjB9t7X3uy",
+"TXQ0ZSbRYy","xciqplweGy","Waim6dhSuH","fLNg8GXdoH","In3NS2Nslm","IRh48xReec","JRJQBVLTy6","lXFOBVjCZq","MmKGJdpe1v","JRJQBFVMxo",
+"JRJQBmz8gx","K20wKFnPFB","v8yFNOHaBz","K4GS8WPmlx","3weIFoGu6x","YOfrYfFDrJ","Uvlv4sx5Gl","SjskQMmsIo","TXQ0ZNOHsz","AOgEerz7Ut",
+"hYBCKbgJAz","zHF1qyToGW","uupzkpT8wu","gtCA5hUTw7","8hJdtnlaBy","hUTw7pvgjS","XyPZNCIShG","QChxssuY4x","Pb1pavkCHH","FPfSEQworu",
+"rz7UtVBjhz","djsrvFxX9q","cQOnvP6bcg","FPfSE0ao3l","0PktIe6e4z","NhXdu9GXkX","lkMUAqUJMd","ZUnqtyluBx","tlILtciuWz","BFkb8faHir",
+"RxrsmiB08l","pv0i70BmCy","Q6LixVLTy6","7hyVvBGaQY","5nmWv618Di","29QAzb29RJ","dhSuHvOqCE","J2mQiGv3Fq","VjCZqlCMxy","Oz8yZSs0Zu",
+"rKDLJgdQsS","J2mQifmIK1","h1zcHMaJQs","he9IANcICA","tlILtcQOnv","5IhmGRmDcr","zbIYYWmadA","S77LHZuDtD","OHaBzIjTwP","s7MxkKr8ys",
+"fLNg8qaofN","tl72WfLNg8","RsQUqokgRi","CK5W7HfyNQ","GSQwjOz8yZ","QYxC02TRI7","2TRI7IKxdL","Mkgy8rKDLJ","BpYhVQClRL","jtn0XHzZT8",
+"HfyNQuZPqg","hUTw7kZANm","ZhwG1n8pJ9","zmLYDFVMxo","zQt6QyvOMI","UlU3MvkCHH","QnJ1StAOsr","16lHcQ6Lix","uZPqgTa8f6","fmIK1Cp3mZ",
+"tl72W07n1c","WaWsvDLhzM","16lHce6e4z","VLTy6hSSvQ","RkQkeFcWrW","Mkgy8JKWYR","ix74r0PktI","b29RJlViBv","8RCUAZzJHW","JKWYRsx5Gl",
+"t98iWQworu","YjB9ts4786","2Yz7E7hyVv","W7cTsvkCHH","3weIFStlDJ","uoStwReKEW","HzZT8cL0aE","l83UdprNT6","pT8wutuDyS","fFDrJAmdQd",
+"ni2v1s4786","jfREuv2eC3","8U2nUYjB9t","i7WMQJIqXi","ZuDtDh1zcH","taOXKh1zcH","MGlTFDcpWB","t98iWgtCA5","5IhmGcL0aE","FnPFB16lHc",
+"JJs5mNhXdu","YjB9t7fsYM","okgRisoy9t","AmdQduZPqg","5ZaEzgjUTu","yluBxIRh48","vkCHHjS1aj","Q6LixBFkb8","FwEJzThjNn","VBjhzFGzgp",
+"vLsmSKr8ys","KASQ8RzaZA","VLTy69iGoT","I7p2aiB08l","oQ87r9eoRc","JRJQBtl72W","s93Mli7WMQ","QClRLpmeCd","24ARFv1Hln","ksJbytAOsr",
+"gtCA5S2Dfu","Ul4a1cL0aE","FVMxoVprf2","45cIHGXdoH","zY1GYSWfou","WMiS316lHc","tuDySeuZA5","Vprf2YOfrY","MaJQs14FLR","x3LDeRpBQm",
+"RACujNhXdu","lkMUAB3qem","EoToPOUYuF","2DREsrKDLJ","OUYuF2DREs","l83UduJScX","dpe1vDz1R3","S2DfuTwano","pv0i7iKqhr","AkKTkYOfrY",
+"pmeCdzmLYD","1LB1LQWxoT","DG4sTFnPFB","QYxC09GXkX","Ss0ZuMaJQs","5IhmGTa8f6","5nmWvAIYUu","MGlTFQChxs","hYBCKyvOMI","n1pmOWaim6",
+"3otm6aDGtS","DLhzMfqypy","WreyPvLsmS","MezSWYh1hF","MK07YtjQxs","BpYhVGXdoH","Waim6k85Ae","RsQUqyvOMI","JIqXijS1aj","cL0aEprNT6",
+"MGlTFazIWp","K20wKRBhp0","gdQsSBCxeC","lsQGoxciqp","xXTI4BbwgA","BbwgApiJSk","5nmWvVIlwP","wiHrZS77LH","RpBQmcQOnv","580YDciuWz",
+"kB5nPTa8f6","S77LHG1RhS","gtCA56AFT0","WaWsvKZamH","uTacxDz1R3","Yf2Ectl72W","24ARFJXljW","MezSW14FLR","FLsphWmadA","pT8wuFGzgp",
+"pT8wuJkzUn","BpYhVyEfy9","Mkgy8fcwDa","prNT6UmaEv","GSQwj45cIH","zQt6Q8TxD7","d7vjM2hEEU","VNCPd5Drn0","LDk6fNxx9V","cmXIXOUqFM",
+"lj07QThjNn","yluBxlweGy","MGlTFNOHsz","45cIHQbxXc","hE1Ql1j5L8","0h1b1hYBCK","S77LHYf2Ec","gdQsSO3iyQ","Q6hMC14FLR","FLsphWaWsv",
+"tuDySEoToP","ECMvUKASQ8","5IhmGSjskQ","DG4sT24ARF","y94nwCp3mZ","Ss0ZuHlUbF","5Mg9rhE1Ql","5Drn0D6rBy","QYxC05Namm","CqqaDdpe1v",
+"uAWypcmXIX","0PktIS2Dfu","aez9yHRxd8","HzZT8ksJby","Q6LixfFDrJ","faHirFhtgl","FjHXRWaWsv","No0QbprNT6","IjTwPru4UG","k85AeQbxXc",
+"RzaZA5ZaEz","KsjRKJRJQB","rz7UtThjNn","2hEEUuQIcz","5NammFxX9q","bZLvSRpBQm","ogLgcQworu","FLsphMmKGJ","tlILtn8pJ9","ThjNnfFDrJ",
+"7ku1plpF6W","Rxrsmrz7Ut","HRxd8HRxd8","M3zXLVNCPd","lViBvjfREu","DcpWBStlDJ","D6rByK4GS8","jfREu14FLR","yluBx0Wr5y","FwEJza00b5",
+"jSjS3a00b5","C2IrcrKDLJ","jiVBPjS1aj","Ta8f62hEEU","QWxoTaez9y","WPmlx5ZaEz","jzUqRYw2oU","qaofNblLA9","ZzJHW8FmFH","7fKYUWaWsv",
+"KZamHFPfSE","uJScXL7cGc","vkCHHNOHsz","9eoRcJ2mQi","StlDJ1v5hH","ThjNnlpF6W","guMb8L7cGc","jzUqRzbIYY","tjQxsh1zcH","ZJTXHn8pJ9",
+"OxWIHcShY2","MmKGJU3yw5","CIShG29QAz","gf8rIogLgc","8TxD7zmLYD","ix74raez9y","taOXKs93Ml","QChxsS2Dfu","oGu6xnlaBy","WDVWJjeskS",
+"ciuWz2Nslm","d7vjMHfyNQ","0h1b1vkCHH","cShY2HRxd8","Vprf2lCMxy","FGzgpKASQ8","Z4I1vn8pJ9","sqVrfoQ87r","NAFuwRBhp0","xciqpVerEA",
+"fqypy5drc6","IBe8kjSjS3","Cfgr3gIYvE","tjQxsHRxd8","suY4x4QMc9","4QMc9KASQ8","Yf2EcoVQp6","CK5W7ZuDtD","1v5hH8TxD7","0h1b1IKxdL",
+"BGaQYdjsrv","lj07QAXpwE","s4786OHaBz","hi5X7iwzGk","euZA5fcJOy","Z4I1vk85Ae","7hyVvrz7Ut","45cIHBCxeC","FxX9q9XyT9","7fKYUThjNn",
+"X6Pingf8rI","45cIHZJTXH","5VZjSogLgc","Ss0ZufmIK1","6AFT0QnJ1S","1j5L8DQimp","S77LHaFFss","s93Ml7ku1p","HlUbFFjHXR","HfyNQQClRL",
+"cShY2WaWsv","aFFsscShY2","5NammQClRL","MK07Y14FLR","CNHmvhi5X7","55rfBru4UG","K20wKMK07Y","FwEJzb29RJ","LbRTHdmoS7","HP433fqypy",
+"oVQp6iKqhr","VIlwPuTacx","S2DfufaHir","0Wr5yZuDtD","5ZaEzaez9y","WPmlxzmLYD","VNCPdC2Irc","tlILtaez9y","zbIYYzFgtB","55rfBCqqaD",
+"s4786uupzk","1LB1LuTacx","9XyT95ZaEz","zqH0W580YD","NcICAHzZT8","ZJTXHQnJ1S","Cfgr3FxX9q","K4GS8SmGzv","lCMxyPYBf4","580YDWDVWJ",
+"8xEKz8RCUA","RsQUqAXpwE","ZUnqtS77LH","zz4ZU0MR5X","vLsmSM6qcG","WPmlxnnP8o","Ss0Zujtn0X","fcJOyS77LH","2TRI7RpBQm","SjskQiKqhr",
+"0YAGHMmsIo","okgRiVIlwP","3otm6d7vjM","tjQxsPOUYS","ix74riKqhr","ZUnqtECMvU","5ZaEzHzZT8","45cIHZhwG1","FLsphcL0aE","tuDySDQimp",
+"BCxeCguMb8","fqypyaez9y","iKqhrsuY4x","VerEAZJTXH","IjTwP1j5L8","uLtKsy94nw","JJs5mi3pyd","X6PinmX2GE","HlUbFe6e4z","lkMUA7fsYM",
+"yToGWxReec","IKxdLxReec","ru4UG7X3uy","MezSWfcJOy","Q6hMClH1kt","iqv4kKASQ8","yEfy90BmCy","fcJOyokgRi","XyPZNI7p2a","Kr8ysuZPqg",
+"8xEKzjzUqR","uvf7ARkQke","wiHrZAOgEe","cL0aEWaWsv","M6qcGprNT6","rKDLJksJby","WPmlxXflUq","k85AefcwDa","bgJAzzz4ZU","Q6hMCRACuj",
+"aDGtSBCxeC","s7MxkjSjS3","cmXIXMm8si","BbwgAnlaBy","8hJdtUl4a1","4QMc9WPmlx","jiVBPm4bxU","SWfouoGu6x","AXpwE5VZjS","L7cGcCK5W7",
+"55rfBSmGzv","atef2kZANm","vOqCEGrDg7","4W0TlQbxXc","ogLgcgtCA5","1v5hHhSSvQ","24ARFaFFss","ThjNnjiVBP","hYBCKlweGy","Waim6ulk41",
+"jfREu2Nslm","BGaQYhUTw7","lkMUAOUqFM","FxX9qsqVrf","sqVrfDLhzM","GWqqXlpF6W","5ZaEz5drc6","W3VFHGrDg7","7ku1pvkCHH","ru4UGyluBx",
+"mX2GEBpYhV","tl72WsqVrf","h1zcHfcwDa","0YAGHk85Ae","v2eC3uQIcz","Vprf2HRxd8","lViBvvkCHH","AIYUuFPfSE","taOXKQWxoT","v8yFNCK5W7",
+"Cp3mZ64s8N","nnP8o5nmWv","HP433fcwDa","fcJOyBGaQY","JIqXiFhtgl","gtCA52DREs","fLNg8jeskS","hi5X7RpBQm","64s8NZhwG1","FFDuilsQGo",
+"ksJbya00b5","MaJQs2Nslm","ydG8UQClRL","lm0pDMK07Y","iKqhrhe9IA","5VZjS0MR5X","fFDrJ3otm6","FFDuiMGlTF","CdyBVUmaEv","iKqhrQYxC0",
+"uLtKssuY4x","v1Hln3otm6","fmIK1Rxrsm","UmaEvni2v1","FjHXRIjTwP","48cHL0Wr5y","O3iyQK20wK","RzaZA8FmFH","DLhzMlj07Q","Z4I1vTa8f6",
+"ksJbyulk41","2Yz7EfLNg8","i3pydJ2mQi","L7cGcTwano","0MR5XtjQxs","CxVEf9XyT9","7Ow5C0PktI","FLsphIRh48","nnP8oZuDtD","1j5L8t59lR",
+"7ku1pgtCA5","Nxx9Vl83Ud","KZamHQ6hMC","8U2nULewvM","h1zcHuTacx","EdBKc7fKYU","FVMxoJKWYR","pT8wu14FLR","B3qemRzaZA","J2mQiv8yFN",
+"Zv7z0W3VFH","07n1cs4786","YjB9tdjsrv","KsjRKJIqXi","pAhR1yToGW","k85AepAhR1","Nxx9V7fsYM","jzUqRWPmlx","azIWpb29RJ","uZPqgt98iW",
+"0MR5XZ4I1v","RxrsmRBhp0","618DicL0aE","dmoS7cShY2","dmoS7zz4ZU","Q6hMC9XyT9","lsQGoC2Irc","vkCHHJKWYR","QbxXczbIYY","yofH3lkMUA",
+"uupzkD6rBy","pFrrlAkKTk","xciqpQWxoT","0PktIWreyP","2hEEUSWfou","2hEEUSjskQ","MojnP0YAGH","wiHrZ3weIF","MojnPFxX9q","djsrv7ku1p",
+"uLtKspAhR1","nFqikAIYUu","ZuDtDtjQxs","guMb8tjQxs","t59lRbrhlQ","ulk41O3iyQ","v1HlnuZPqg","ZzJHWB3qem","UmaEvZJTXH","zz4ZUUl4a1",
+"taOXKW7cTs","nFqikL7cGc","ZuDtDzqH0W","aez9yoGu6x","nFqikhUTw7","Vprf2zHF1q","CIShGsx5Gl","mX2GEQ6hMC","WPmlxYf2Ec","AOgEesuY4x",
+"S2Dfu6AFT0","Q6hMC8cVD3","l83UdOxWIH","fqypyGWqqX","GWqqXZzJHW","UlU3MDLhzM","55rfBAkKTk","5drc67X3uy","Yh1hFzFgtB","0PktIdpe1v",
+"cQOnv1v5hH","AIYUu3weIF","GWqqXW7cTs","Ul4a1uTacx","dpe1vYOfrY","VLTy6ZUnqt","Waim6x3LDe","0PktIVjCZq","DQimpYh1hF","29QAza00b5",
+"IBe8k2Yz7E","618DiuoStw","uupzkNo0Qb","8TxD7JXljW","5iGN5hi5X7","EdBKc16lHc","W3VFHMaJQs","2Yz7Eb29RJ","S2DfuzQt6Q","DLhzMwiHrZ",
+"Ss0ZuQChxs","EOE1ooQ87r","zFgtBhUTw7","55rfBUl4a1","WMiS36q6L9","UlU3MnnP8o","07n1cguMb8","jiVBPuJScX","OUYuFYw2oU","lsQGo8hJdt",
+"a00b5uN6r3","NhXdu8TxD7","azIWpRzaZA","fLNg80MR5X","Mkgy8Ta8f6","lpF6WaFFss","QWxoTlViBv","oVQp6WmadA","5iGN5prNT6","fcJOySbRYy",
+"8FmFHHzZT8","Pb1paFFDui","Waim6QChxs","Q6hMCwDajX","iKqhrCNHmv","LewvMTa8f6","WaWsv0ao3l","OUqFMAmdQd","pT8wuVerEA","tjQxse6e4z",
+"5Mg9rZv7z0","cmXIXs4786","ECMvU9rlg9","Yw2oUMaJQs","x3LDeiB08l","Mkgy8dhSuH","ix74rM3zXL","1j5L8WPmlx","sx5GlcQOnv","8U2nUCp3mZ",
+"WDVWJOHaBz","nnP8oVLTy6","jtn0XW7cTs","rhl0JlXFOB","TCgPpTa8f6","fFDrJtl72W","soy9t9GXkX","ECMvUS2Dfu","NAFuwd7vjM","BGaQYCNHmv",
+"n8pJ9Yw2oU","WaWsvzz4ZU","iKqhrjS1aj","lCMxyVBjhz","qaofNyluBx","hSSvQzz4ZU","3weIFguMb8","zqH0W7Ow5C","9eoRcix74r","pAhR1AmdQd",
+"DcpWBni2v1","6q6L9ZUnqt","cShY2CK5W7","AIYUuiqv4k","uoStwuPX7G","m4bxUpmeCd","PYBf4nlaBy","bgJAzEoToP","RmDcrtAOsr","pv0i75iGN5",
+"ni2v1tl72W","okgRiFNYIM","BFkb8CIShG","580YDaL6AJ","yToGW1LB1L","gjUTuVIlwP","fLNg8pAhR1","zFgtBfmIK1","FxX9qlH1kt","Ta8f6zHF1q",
+"wDajXcShY2","x3LDetl72W","MaJQsRACuj","ydG8UZzJHW","F6PT2JKWYR","WDVWJAOgEe","LewvMpvgjS","oQ87rv8yFN","OUqFMgjUTu","lj07Qdjsrv",
+"jS1ajy94nw","AgJHQOz8yZ","piJSk9GXkX","8xEKzfqypy","Qworulj07Q","4W0TldhSuH","VNCPd1LB1L","IRh48O3iyQ","JKWYRIjTwP","B3qemgf8rI",
+"7ku1phSSvQ","zHF1qlCMxy","FcWrWWaWsv","FnPFBv8yFN","Qworuiqv4k","VjCZqHlUbF","Oz8yZuoStw","yluBx1j5L8","lm0pDjfREu","In3NSWPmlx",
+"YjB9t6q6L9","DLhzMYjB9t","zY1GYPYBf4","0YAGHHlUbF","TXQ0ZgdQsS","C2Irc5ZaEz","m4bxUaez9y","FhtglAIYUu","5iGN5hYBCK","X6PinfFDrJ",
+"pv0i71v5hH","0YAGHFNYIM","Q6Lixsx5Gl","GWqqX2hEEU","dmoS7VBjhz","YOfrY2DREs","m4bxUReKEW","S77LHAgJHQ","RACuj2hEEU","WmadAWaim6",
+"dhSuHMGlTF","fmIK11v5hH","s4786Dz1R3","MmsIoRpBQm","618DiMkgy8","5iGN5n8pJ9","euZA5MaJQs","VIlwPUlU3M","2DREsFPfSE","BGaQYKr8ys",
+"O3iyQRBhp0","ksJbylj07Q","07n1cI7p2a","AkKTkGrDg7","pmeCdjfREu","0PktII7p2a","IjTwPFjHXR","aL6AJJXljW","HfyNQZuDtD","kB5nPVIlwP",
+"qaofNQ6Lix","0MR5XNo0Qb","45cIH0h1b1","IKxdLpT8wu","0YAGHAOgEe","vOqCE0PktI","RmDcryToGW","prNT6Chuy3","n1pmO5Drn0","gtCA5G1RhS",
+"yToGWYjB9t","5IhmGazIWp","pT8wubgJAz","EoToPIKxdL","Cp3mZRzaZA","jSjS3HRxd8","n8pJ9M6qcG","OHaBzP6bcg","kZANmEOE1o","2Yz7EMmsIo",
+"fmIK1t59lR","t98iW8TxD7","lj07QDG4sT","piJSkvLsmS","n8pJ9jzUqR","5IhmGYjB9t","7hyVv5Mg9r","9eoRc3weIF","M6qcGQClRL","ix74rUl4a1",
+"uTacxjSjS3","CxVEf14FLR","8xEKzuoStw","v8yFNuAWyp","fmIK114FLR","ZhwG1euZA5","AOgEeaDGtS","atef20PktI","K20wKhE1Ql","C2IrcBbwgA",
+"AIYUuuZPqg","Nxx9VZJTXH","JKWYRni2v1","P6bcgZJTXH","rKDLJB3qem","In3NSxXTI4","L7cGcMGlTF","K4GS8dhSuH","Mm8si7lUXZ","Yw2oUOHaBz",
+"atef2lkMUA","618Di1v5hH","lpF6WrKDLJ","yEfy9zQt6Q","xReecFcWrW","s93MlECMvU","oGu6xpvgjS","618DidhSuH","Y1mC0pFrrl","5iGN5POUYS",
+"VjCZqP6bcg","OxWIHMGlTF","b29RJfcJOy","MezSW8xEKz","jfREuhi5X7","s93MlK20wK","Nxx9VFVMxo","jtn0X7X3uy","prNT6mX2GE","BCxeC8xEKz",
+"Zv7z016lHc","suY4xv2eC3","FNYIM7X3uy","FnPFBiKqhr","brhlQSWfou","kZANmYf2Ec","5drc6aFFss","0PktIgjUTu","9GXkXtvdkD","gtCA5gdQsS",
+"nlaByOUYuF","gtCA5M6qcG","FPfSEWaim6","e6e4zn8pJ9","7fsYMIRh48","jzUqRiqv4k","pWiOsZhwG1","IRh48AmdQd","2ZHdkBFkb8","48cHLsuY4x",
+"2hEEUfcwDa","1LB1LCfgr3","TwanonnP8o","Gv3FqlsQGo","BpYhVHP433","VLTy6iqv4k","a00b555rfB","580YDAOgEe","0YAGHYf2Ec","RpBQmIjTwP",
+"fqypylXFOB","piJSkCIShG","WaWsvAIYUu","9XyT9fLNg8","5NammWaWsv","8xEKzv8yFN","SWfoudjsrv","Yw2oUDcpWB","ix74rHRxd8","8TxD7In3NS",
+"Vprf2l83Ud","S77LHgIYvE","4dEz6Qworu","xXTI4X6Pin","zHF1qAkKTk","IBe8kWreyP","9eoRcDQimp","P6bcglXFOB","Pb1paYOfrY","t59lRSjskQ",
+"ZhwG1VNCPd","S2DfuJkzUn","KASQ8oQ87r","AkKTkS77LH","JRJQBzbIYY","y94nwi7WMQ","FhtglVerEA","07n1cYjB9t","KZamHnFqik","7lUXZBGaQY",
+"piJSkkB5nP","KsjRKlViBv","8xEKzAkKTk","2DREsdmoS7","VBjhz0PktI","8xEKzEOE1o","MezSWJJs5m","FxX9q0ao3l","xXTI4jiVBP","iqv4klm0pD",
+"AXpwENxx9V","StlDJKASQ8","lXFOBlpF6W","B3qem55rfB","9XyT97Ow5C","5NammyToGW","cL0aElpF6W","Pb1pa64s8N","aDGtSeuZA5","D6rBydmoS7",
+"FVMxodQ586","uQIcz618Di","okgRiJXljW","ZuDtDeuZA5","EoToPAIYUu","euZA5jSjS3","D6rBys7Mxk","HlUbFNOHsz","pmeCdTa8f6","uQIczRsQUq",
+"RpBQmzz4ZU","16lHcMaJQs","55rfBiwzGk","D6rByECMvU","uTacxeuZA5","OUYuFJRJQB","hYBCKK4GS8","NcICA2hEEU","YOfrYjeskS","qUJMduZPqg",
+"aez9yuTacx","Ul4a1ZJTXH","aFFsstvdkD","2ZHdk8hJdt","XyPZNm4bxU","guMb8SWfou","brhlQCdyBV","kZANmmz8gx","hUTw7I7p2a","gdQsSfaHir",
+"uZPqgK20wK","VIlwPIjTwP","tvdkD5Namm","pmeCd07n1c","uJScXRxrsm","t98iWXyPZN","uTacxv1Hln","blLA9ydG8U","4dEz6soy9t","7fKYUk85Ae",
+"XflUqk85Ae","a00b5vLsmS","MojnPVNCPd","Yw2oUzHF1q","9eoRc7X3uy","h1zcH5iGN5","YOfrYuZPqg","xReecNcICA","zmLYD4dEz6","azIWpBpYhV",
+"Gv3FqCxVEf","d7vjM4W0Tl","VerEAOUqFM","faHirQYxC0","t59lRRzaZA","mz8gxNAFuw","jSjS3Oz8yZ","KZamHKASQ8","atef2DLhzM","BCxeCdjsrv",
+"64s8NHlUbF","9XyT9bZLvS","HlUbF4dEz6","nnP8o9y4lw","jSjS3azIWp","AOgEeIn3NS","ni2v1Cfgr3","kB5nPRxrsm","k85AeOz8yZ","ksJbyhE1Ql",
+"iqv4k4dEz6","y94nwhSSvQ","EOE1oSjskQ","RpBQmL7cGc","M3zXLaDGtS","W3VFHrz7Ut","MojnPFVMxo","Q6LixIBe8k","suY4xBFkb8","TCgPpRxrsm",
+"gf8rICp3mZ","AOgEe0ao3l","brhlQJJs5m","Zv7z08U2nU","a00b55ZaEz","dQ586TCgPp","2Yz7ElpF6W","SmGzvmz8gx","tl72WkB5nP","8TxD7AIYUu",
+"jfREuF6PT2","6AFT0he9IA","7X3uyUlU3M","nlaByn1pmO","MGlTFOxWIH","uLtKsjeskS","iB08loQ87r","iqv4kFxX9q","uQIczRxrsm","mz8gxzqH0W",
+"JIqXiiwzGk","1LB1LIn3NS","64s8NhUTw7","XyPZNpvgjS","KZamHyluBx","v8yFNCIShG","lweGyNAFuw","MmKGJAkKTk","euZA50MR5X","580YDQYxC0",
+"8FmFHnlaBy","lCMxy8hJdt","StlDJUl4a1","OUqFMBCxeC","SbRYyhE1Ql","uN6r3lkMUA","aL6AJBCxeC","JRJQBRmDcr","6AFT0ECMvU","SbRYyt59lR",
+"AIYUusoy9t","RzaZAaez9y","ksJby618Di","8TxD7K20wK","uQIczFnPFB","LewvMECMvU","uLtKsi3pyd","cShY2tl72W","FNYIM5IhmG","VLTy6rz7Ut",
+"SjskQWaim6","FnPFBpiJSk","FhtglGrDg7","zz4ZU8U2nU","HP433faHir","zqH0WRpBQm","oQ87rFxX9q","HRxd8brhlQ","wiHrZnnP8o","d7vjMMojnP",
+"CdyBV4QMc9","No0Qb1LB1L","okgRiFwEJz","0Wr5yKASQ8","NcICAJJs5m","jzUqRSWfou","uAWypzz4ZU","FnPFBfcJOy","yToGWhSSvQ","WreyPt98iW",
+"HfyNQOz8yZ","zY1GYDcpWB","jzUqREoToP","h1zcHrz7Ut","yToGWxciqp","yToGW2hEEU","WmadAW3VFH","i3pydzHF1q","SjskQDz1R3","No0Qb0Wr5y",
+"QnJ1SDcpWB","jS1ajhE1Ql","2Nslmh1zcH","tl72W9rlg9","8U2nUlsQGo","1v5hHQnJ1S","4W0TlDcpWB","vOqCEIRh48","Mm8siZv7z0","zY1GYtjQxs",
+"lm0pDCqqaD","yEfy9QWxoT","bZLvSx3LDe","iqv4krz7Ut","QChxsdhSuH","FPfSEs7Mxk","lXFOBjS1aj","hi5X7kZANm","ZUnqtZv7z0","tAOsr5Mg9r",
+"LewvMGSQwj","v8yFNM6qcG","s93Mlv1Hln","Ta8f6zQt6Q","SjskQzqH0W","9eoRcStlDJ","Uvlv47hyVv","OxWIH8xEKz","CqqaDVerEA","Waim69GXkX",
+"fqypyni2v1","DG4sTlsQGo","7X3uyYf2Ec","8U2nUCIShG","pT8wuAIYUu","Nxx9VuQIcz","EOE1oaFFss","qQxHPDQimp","M3zXL5iGN5","MojnPRACuj",
+"tjQxshi5X7","BFkb8iB08l","Pb1pa5drc6","EOE1oyofH3","NhXdusoy9t","G1RhS0MR5X","aL6AJECMvU","GSQwj8xEKz","t98iW1v5hH","d7vjMtvdkD",
+"8RCUAZhwG1","qQxHPJ2mQi","580YDGv3Fq","CdyBVLbRTH","RsQUq8RCUA","gIYvEQbxXc","Chuy3vkCHH","NhXduPb1pa","16lHcuTacx","yEfy9Vprf2",
+"vLsmSjfREu","VLTy6tlILt","YjB9tMmKGJ","RpBQmjeskS","gtCA5ZuDtD","lm0pDk85Ae","SjskQFNYIM","IKxdLn8pJ9","0YAGHZhwG1","FxX9q7ku1p",
+"pmeCdoVQp6","14FLRxciqp","Y1mC0OUYuF","5nmWvzY1GY","0h1b1v1Hln","Rxrsmulk41","nnP8oNhXdu","yofH3jS1aj","FjHXRx3LDe","rz7UtU3yw5",
+"3weIFgdQsS","zY1GYcL0aE","mX2GEtvdkD","jeskSP6bcg","YOfrYLbRTH","uupzkzFgtB","7Ow5CHRxd8","XflUqpWiOs","jfREuS2Dfu","OHaBzs4786",
+"aDGtSfcJOy","rKDLJ5nmWv","yvOMIfaHir","tAOsrDQimp","brhlQKr8ys","D6rByRxrsm","uvf7AbgJAz","s7Mxklm0pD","AOgEeTXQ0Z","aL6AJuPX7G",
+"hYBCKHRxd8","tlILtzqH0W","uJScXzFgtB","ydG8U7ku1p","lH1ktJkzUn","WMiS3M3zXL","v1HlnzHF1q","ThjNnrhl0J","AOgEeL7cGc","8RCUAdjsrv",
+"FNYIMGv3Fq","zHF1qlweGy","FnPFBAgJHQ","2hEEUsoy9t","JRJQBa00b5","d7vjMRmDcr","pT8wuxReec","uvf7ARzaZA","Yf2Ecxciqp","48cHL9y4lw",
+"uQIczVprf2","HP433BCxeC","64s8NBbwgA","CdyBVK20wK","JkzUnF6PT2","cmXIXb29RJ","ZJTXHlkMUA","5nmWvtAOsr","0BmCyM6qcG","K20wKgf8rI",
+"9GXkX0Wr5y","Kr8ysFNYIM","qUJMdP6bcg","MGlTFIjTwP","xReec5drc6","JkzUnm4bxU","BpYhVK20wK","t59lRCNHmv","fcwDazY1GY","ciuWzEdBKc",
+"55rfBY1mC0","LbRTHx3LDe","HP4338hJdt","yofH3BpYhV","7lUXZ3weIF","gf8rIoVQp6","s93MlS77LH","PYBf4dQ586","VIlwPgdQsS","14FLRMaJQs",
+"MmKGJpAhR1","s4786OUYuF","rz7UtRkQke","iwzGkv2eC3","v1HlnpFrrl","7Ow5C48cHL","JXljWQYxC0","W3VFHciuWz","hSSvQfFDrJ","Twano24ARF",
+"fFDrJQYxC0","uPX7GfLNg8","ru4UGtAOsr","FLsphDcpWB","HRxd8e6e4z","Cp3mZrz7Ut","580YDEOE1o","pmeCdStlDJ","rhl0Jt98iW","hUTw7d7vjM",
+"h1zcH0MR5X","1j5L8VjCZq","7ku1pJ2mQi","v8yFN5nmWv","AmdQdMkgy8","oQ87rHP433","tuDyStvdkD","FPfSEEdBKc","aDGtSjeskS","lCMxyQnJ1S",
+"oGu6xyEfy9","euZA5TXQ0Z","8TxD7POUYS","jtn0XuN6r3","24ARFWaWsv","Dz1R3tvdkD","uZPqgKr8ys","WmadAHzZT8","yEfy9RACuj","WPmlxQWxoT",
+"pAhR1fFDrJ","MmsIoReKEW","8RCUAo8Uyd","pmeCdQ6Lix","KZamH0Wr5y","ZzJHWX6Pin","zFgtB5drc6","uupzk7ku1p","qQxHP7ku1p","hUTw748cHL",
+"Pb1paSs0Zu","lsQGouZPqg","D6rByFnPFB","55rfBaez9y","x3LDeKASQ8","QnJ1SjzUqR","Q6LixfLNg8","SWfoun1pmO","mz8gxwDajX","RpBQmbrhlQ",
+"5drc6fcJOy","QChxsVjCZq","hSSvQ45cIH","OUqFMxReec","jS1ajUl4a1","uAWyp9rlg9","K4GS81v5hH","DLhzMuTacx","0KyfscQOnv","i3pydKr8ys",
+"2hEEUHlUbF","d85a9oGu6x","BCxeCVprf2","vLsmSAOgEe","In3NS7ku1p","24ARFRmDcr","soy9txReec","qQxHPFFDui","qaofNoGu6x","SWfou580YD",
+"pv0i7DG4sT","nlaByix74r","Yw2oUgdQsS","U3yw5AOgEe","sx5GlZzJHW","WMiS3In3NS","Dz1R3G1RhS","d7vjMEOE1o","WPmlxAkKTk","kB5nPYOfrY",
+"2Nslmi7WMQ","ThjNnuupzk","07n1c5IhmG","9y4lwy94nw","RsQUq45cIH","55rfB07n1c","BpYhV4QMc9","IRh48HzZT8","a00b5SbRYy","JKWYRKr8ys",
+"Mm8si0YAGH","RpBQmQssNC","dpe1vGXdoH","v1HlnYh1hF","JRJQBAmdQd","i7WMQY1mC0","qQxHP4W0Tl","pv0i7gf8rI","s93MljSjS3","UmaEvs93Ml",
+"uupzkpFrrl","uLtKsDcpWB","aFFssv2eC3","P6bcgLbRTH","aL6AJiqv4k","WMiS3Q6hMC","n8pJ9QbxXc","BbwgAlj07Q","jS1ajNxx9V","mz8gxG1RhS",
+"jzUqRAkKTk","5VZjSSWfou","b29RJ6q6L9","uAWypHfyNQ","DcpWB16lHc","Pb1paQworu","RpBQm64s8N","FPfSEksJby","VerEAJKWYR","9rlg9n1pmO",
+"BFkb8ZhwG1","LbRTH5drc6","CK5W7pWiOs","v1HlnMaJQs","Gv3FqVLTy6","Q6hMCkB5nP","fLNg8NAFuw","CxVEfGrDg7","d85a9RACuj","DG4sTNhXdu",
+"K4GS8pWiOs","sx5GluoStw","In3NSi7WMQ","aFFssfcJOy","KASQ8suY4x","y94nwFnPFB","AIYUuciuWz","qQxHPPYBf4","8TxD7l83Ud","jS1aj9iGoT",
+"QChxsFxX9q","ZJTXHuLtKs","uvf7A48cHL","5ZaEzZuDtD","580YDs4786","dpe1vEOE1o","tl72WkZANm","oGu6xUl4a1","64s8Nn8pJ9","jiVBPRzaZA",
+"o8Uyd8TxD7","HfyNQv1Hln","8xEKzuLtKs","4W0Tl4W0Tl","cmXIXnnP8o","ksJbyNo0Qb","uoStwBFkb8","Yf2EcOxWIH","MezSWjeskS","bZLvS8hJdt",
+"9GXkXk85Ae","5Drn048cHL","TXQ0ZgtCA5","fcJOy9y4lw","7lUXZD6rBy","yEfy9KsjRK","5nmWvFVMxo","FwEJzK4GS8","DLhzMVNCPd","zmLYDXyPZN",
+"FnPFBkB5nP","pvgjSs7Mxk","Mkgy85ZaEz","dhSuHYOfrY","bZLvStl72W","zQt6Qb29RJ","he9IACfgr3","aDGtSRzaZA","lweGyTwano","aL6AJprNT6",
+"MaJQsFwEJz","W7cTstlILt","mz8gxqaofN","a00b5KZamH","2Yz7EQbxXc","MaJQs6q6L9","CIShGoGu6x","9eoRcQnJ1S","RkQkem4bxU","Uvlv4ni2v1",
+"Gv3FqbgJAz","lH1ktBbwgA","RsQUq7Ow5C","LbRTHwiHrZ","sqVrfJXljW","Ss0ZulkMUA","y94nw2Yz7E","uupzkyToGW","MGlTFUlU3M","Cp3mZkZANm",
+"fLNg8rKDLJ","No0QbM3zXL","kB5nPSbRYy","uJScXFxX9q","L7cGcqaofN","s7MxkprNT6","BpYhV1LB1L","tjQxsRmDcr","9GXkXWMiS3","AXpwE1v5hH",
+"2TRI7uJScX","oQ87rAkKTk","uPX7GDcpWB","CdyBVlpF6W","xciqpP6bcg","8hJdtPYBf4","EoToPHRxd8","1j5L8OxWIH","580YDHfyNQ","K20wKv1Hln",
+"pvgjSRmDcr","0ao3lzz4ZU","DQimpfLNg8","RxrsmpmeCd","yluBxBbwgA","MaJQsW7cTs","uTacxtuDyS","hE1QlDcpWB","iqv4k07n1c","O3iyQydG8U",
+"Cfgr3rz7Ut","HlUbF8cVD3","IKxdLWreyP","618Diulk41","lViBvKsjRK","B3qemRACuj","P6bcgRmDcr","tl72W64s8N","cL0aEBCxeC","zmLYDZhwG1",
+"CqqaDFVMxo","JKWYR7hyVv","0ao3luupzk","xciqpuZPqg","jfREuxXTI4","ksJbysoy9t","Waim6gdQsS","07n1cksJby","9XyT9Pb1pa","VerEA2hEEU",
+"rKDLJIRh48","0Wr5ys7Mxk","9iGoTbrhlQ","0KyfsIn3NS","FnPFBBGaQY","HP433iwzGk","CqqaDBFkb8","IBe8k0MR5X","Nxx9VJJs5m","FFDui9iGoT",
+"7Ow5CdmoS7","BbwgAfcJOy","FGzgpbrhlQ","Y1mC0NhXdu","PYBf4yvOMI","CdyBVlj07Q","xciqp6AFT0","prNT6VLTy6","wDajXtjQxs","GSQwjOxWIH",
+"lpF6WRACuj","3otm6RmDcr","Ta8f6fcJOy","soy9tRmDcr","QssNCY1mC0","FLsphjfREu","0ao3ltaOXK","mz8gxIjTwP","WreyPzY1GY","okgRiC2Irc",
+"aFFss8FmFH","CxVEfWmadA","gjUTu8RCUA","Z4I1vOHaBz","aFFssQnJ1S","NcICARmDcr","K20wKcShY2","uJScXciuWz","s4786lpF6W","BbwgAOz8yZ",
+"azIWpzbIYY","Zv7z0QnJ1S","ulk41pAhR1","uPX7GbrhlQ","ZUnqttuDyS","rKDLJpT8wu","48cHLVprf2","Chuy3mX2GE","6AFT0uLtKs","LewvMIBe8k",
+"9iGoTZuDtD","14FLR16lHc","pT8wut59lR","uJScXgtCA5","RmDcrTwano","gIYvEgtCA5","atef2LDk6f","VBjhzWaWsv","0Wr5yhe9IA","YjB9tgf8rI",
+"aL6AJQClRL","FxX9quoStw","uAWyphE1Ql","ZuDtDgjUTu","ECMvUNAFuw","2NslmUmaEv","0MR5XnFqik","zQt6QlXFOB","ni2v12TRI7","Cfgr3NOHsz",
+"8RCUAh1zcH","07n1c2DREs","gf8rIiwzGk","pFrrlokgRi","Fhtgl9GXkX","AXpwETa8f6","d85a9v1Hln","8cVD35nmWv","SjskQs4786","AmdQdrKDLJ",
+"sx5GlAOgEe","iKqhrdpe1v","uLtKsfcJOy","zz4ZU0PktI","M6qcGnFqik","4dEz6YjB9t","JKWYR580YD","Z4I1vqQxHP","7fKYUPYBf4","NcICAuN6r3",
+"AOgEetjQxs","ksJbyW3VFH","5iGN5BpYhV","l83UdJ2mQi","cmXIXzFgtB","rKDLJSmGzv","JIqXioVQp6","dpe1v8U2nU","Waim6xciqp","Gv3Fqiqv4k",
+"580YDhUTw7","F6PT28hJdt","brhlQDLhzM","5iGN52Yz7E","xReecIKxdL","gIYvEbrhlQ","rKDLJ2hEEU","ksJby5VZjS","WaWsv7fKYU","VBjhzZ4I1v",
+"uupzkv8yFN","Ta8f6suY4x","e6e4ziqv4k","uAWypBbwgA","D6rByM6qcG","WreyPh1zcH","k85Ae5drc6","0MR5X7lUXZ","uPX7GpT8wu","D6rByuQIcz",
+"QChxsMGlTF","lweGyZhwG1","5VZjSpFrrl","LbRTHmz8gx","OUqFMZJTXH","uoStwDQimp","5NammjeskS","tuDySM3zXL","WaWsvatef2","s7Mxkrhl0J",
+"aFFss0PktI","07n1ce6e4z","RpBQmDcpWB","DcpWBlViBv","U3yw59XyT9","oGu6xhE1Ql","aL6AJCIShG","hYBCKKZamH","MaJQstl72W","VNCPduJScX",
+"RBhp08hJdt","MGlTFi3pyd","0MR5XCqqaD","FFDui0MR5X","SmGzvvOqCE","Ul4a1qQxHP","2DREsBbwgA","guMb8WPmlx","FFDuiY1mC0","ix74rGv3Fq",
+"5IhmGCfgr3","atef2brhlQ","8FmFHNxx9V","CdyBVfFDrJ","StlDJOz8yZ","L7cGc2hEEU","prNT6QWxoT","KsjRK5Namm","BGaQY3otm6","taOXK4dEz6",
+"iB08l618Di","QnJ1SlkMUA","RACujfLNg8","QnJ1SnnP8o","2NslmjeskS","G1RhSgIYvE","Oz8yZOUqFM","lkMUAJKWYR","0MR5XHzZT8","tvdkDZ4I1v",
+"4dEz6Nxx9V","VLTy6y94nw","JJs5mpmeCd","55rfB5Mg9r","lH1kthUTw7","29QAzqaofN","bgJAz2TRI7","tuDySPYBf4","Mkgy855rfB","gtCA52ZHdk",
+"0BmCyQworu","he9IAkB5nP","suY4xZzJHW","SbRYy7lUXZ","m4bxUMmsIo","i7WMQtl72W","xciqpTwano","ZUnqt7ku1p","he9IA2ZHdk","xReeclj07Q",
+"fcJOy0YAGH","lj07QtuDyS","M6qcGcL0aE","ECMvU2TRI7","24ARFi7WMQ","wDajXuZPqg","AXpwEQ6Lix","jzUqRWaWsv","ni2v1CK5W7","WPmlx8xEKz",
+"CNHmvM6qcG","lH1ktMaJQs","24ARFjtn0X","ZUnqtCp3mZ","9y4lwIBe8k","wiHrZYf2Ec","vLsmS0Wr5y","3otm6K4GS8","7fsYM8hJdt","bgJAz64s8N",
+"24ARFpvgjS","NOHszAkKTk","1v5hH0MR5X","5VZjSSmGzv","OxWIHqQxHP","7hyVvI7p2a","euZA58cVD3","v1HlnCIShG","MmKGJpvgjS","s4786dpe1v",
+"SmGzv5iGN5","JXljWdQ586","WDVWJs93Ml","jSjS3NhXdu","fcJOy0PktI","yvOMIrz7Ut","K20wK2TRI7","jSjS3618Di","FLsphpAhR1","hi5X7a00b5",
+"U3yw5uupzk","iqv4kgtCA5","DcpWBhYBCK","uvf7AeuZA5","Y1mC0lkMUA","BGaQY8FmFH","0BmCyDG4sT","QWxoTMmKGJ","2NslmJXljW","yToGWsoy9t",
+"FPfSEVIlwP","8U2nUCK5W7","fLNg848cHL","Q6hMChi5X7","9eoRcRmDcr","NAFuwzY1GY","pvgjSUmaEv","gdQsSOUYuF","tjQxsuTacx","3otm6VIlwP",
+"Cp3mZtl72W","ZhwG1RpBQm","0BmCyHlUbF","BpYhVJRJQB","m4bxU16lHc","fLNg82TRI7","JJs5mJIqXi","Y1mC0Qworu","gdQsSo8Uyd","Kr8ysVjCZq",
+"lViBvpvgjS","Zv7z05VZjS","nlaByECMvU","ZuDtD7fKYU","FPfSE5nmWv","1LB1LpFrrl","aDGtSe6e4z","d7vjM8xEKz","JRJQBokgRi","MmKGJBFkb8",
+"yvOMI0PktI","ksJby5Drn0","wiHrZcShY2","LewvMChuy3","wDajXuAWyp","Cp3mZOUYuF","6AFT0k85Ae","mX2GEECMvU","zHF1qOUYuF","EdBKcHzZT8",
+"fmIK1azIWp","dmoS7fqypy","gdQsSt98iW","dQ586AmdQd","0PktIfaHir","gtCA5OxWIH","7hyVvuvf7A","VBjhzlweGy","HP433uvf7A","29QAzMojnP",
+"Yw2oUCqqaD","rKDLJXyPZN","FGzgp9XyT9","WreyPYjB9t","5iGN5mz8gx","In3NSsuY4x","rhl0JF6PT2","n1pmO5IhmG","zz4ZUSs0Zu","tjQxs5nmWv",
+"taOXK9rlg9","IKxdL1j5L8","MojnPECMvU","PYBf4K4GS8","K20wK0BmCy","jSjS3Y1mC0","580YDlm0pD","cmXIX8cVD3","CNHmvaez9y","29QAzyToGW",
+"zHF1qvOqCE","OHaBzyEfy9","Yf2EcFLsph","oQ87r9y4lw","1LB1LqQxHP","wiHrZm4bxU","OxWIHOxWIH","LbRTHVLTy6","hSSvQI7p2a","618DiSs0Zu",
+"oGu6xdjsrv","0BmCyKsjRK","wDajXl83Ud","3weIFfqypy","SbRYy1v5hH","S2Dfud7vjM","gdQsSprNT6","MGlTFB3qem","CIShGkB5nP","lXFOBqaofN",
+"d7vjMYjB9t","2NslmJIqXi","48cHLgf8rI","fcwDaxXTI4","EOE1oQworu","3otm6IKxdL","IKxdLAgJHQ","FxX9qbZLvS","2ZHdk3weIF","fqypyjiVBP",
+"zY1GY5VZjS","ThjNnHP433","uZPqg1LB1L","jtn0XGXdoH","7Ow5CfaHir","BpYhVVLTy6","YjB9tgdQsS","64s8NLDk6f","YjB9tP6bcg","ThjNnRkQke",
+"2Yz7EReKEW","gtCA5fmIK1","UmaEvIBe8k","lj07QBFkb8","MmKGJMojnP","fLNg8LewvM","ix74r3otm6","YOfrYNxx9V","pAhR1vOqCE","RxrsmNcICA",
+"jzUqRVIlwP","0h1b1Z4I1v","gf8rIyvOMI","xciqphYBCK","CdyBVgf8rI","iB08lRxrsm","BbwgAJRJQB","7hyVvIRh48","8U2nUDLhzM","pAhR1AXpwE",
+"29QAzIRh48","2hEEUMmsIo","jSjS3zbIYY","QworuuN6r3","RkQkeCp3mZ","oVQp6HP433","QbxXcuvf7A","B3qem2hEEU","fqypyqQxHP","HRxd80Wr5y",
+"0ao3lcL0aE","atef2C2Irc","fqypyHRxd8","FVMxoQnJ1S","DcpWBnFqik","SbRYyLewvM","ni2v1QYxC0","hUTw7uAWyp","14FLRX6Pin","bZLvSDLhzM",
+"NAFuwTXQ0Z","U3yw5KZamH","FNYIMtlILt","SjskQKZamH","rKDLJt59lR","uTacxtl72W","ni2v1uoStw","ciuWzv2eC3","Q6hMChe9IA","Uvlv4QYxC0",
+"U3yw5uZPqg","QYxC0OxWIH","VIlwPOUqFM","Mm8sinnP8o","DcpWBVIlwP","ni2v1BpYhV","YjB9tNAFuw","rKDLJPOUYS","k85AeW7cTs","Ta8f6JRJQB",
+"vOqCEFcWrW","XyPZNQnJ1S","0Wr5yRACuj","cmXIXFGzgp","lCMxyWmadA","SmGzvksJby","ZUnqtbgJAz","ZuDtD1j5L8","8hJdtFFDui","tl72Wtl72W",
+"rKDLJxReec","9iGoTKsjRK","Gv3FqMm8si","WreyPM3zXL","Zv7z0pT8wu","lXFOByEfy9","BFkb8gjUTu","uJScX0Kyfs","KsjRKtl72W","nFqikEOE1o",
+"8U2nUK4GS8","gIYvEt98iW","hE1QlRxrsm","Uvlv4NcICA","Oz8yZo8Uyd","rz7UtiwzGk","mz8gx5IhmG","s7MxkZJTXH","UmaEvPOUYS","CK5W70Wr5y",
+"FcWrWs4786","7Ow5CAkKTk","cL0aEdQ586","wiHrZ3otm6","J2mQin8pJ9","lm0pDNAFuw","U3yw5WPmlx","4W0TliKqhr","Cp3mZ0Kyfs","ZzJHWulk41",
+"GrDg72hEEU","SbRYyPOUYS","GSQwjlCMxy","FPfSEt98iW","F6PT2No0Qb","G1RhSFVMxo","brhlQtjQxs","wiHrZbgJAz","JKWYRtaOXK","QssNCCIShG",
+"5Drn0aFFss","FxX9qIjTwP","zQt6QK20wK","W3VFHqUJMd","d7vjMTXQ0Z","lsQGoYOfrY","brhlQ5iGN5","aFFsspAhR1","rKDLJl83Ud","5NammCIShG",
+"Vprf2RpBQm","TCgPpZhwG1","TXQ0ZwiHrZ","RpBQm9XyT9","yofH3BFkb8","m4bxUXflUq","WDVWJKASQ8","M6qcGk85Ae","AgJHQ14FLR","5NammNcICA",
+"lm0pDWMiS3","GrDg7Kr8ys","5iGN57X3uy","ZUnqtWDVWJ","RACujeuZA5","CK5W7CdyBV","pvgjS64s8N","IBe8kJRJQB","7fKYUHzZT8","gtCA5iwzGk",
+"GSQwjVerEA","fLNg8dmoS7","0MR5XUlU3M","L7cGcQWxoT","WreyPulk41","gjUTuhE1Ql","jSjS3fcJOy","0ao3l0h1b1","ZuDtDYf2Ec","8TxD7uJScX",
+"Ul4a1Chuy3","WreyPNcICA","BFkb8OHaBz","No0QbNhXdu","P6bcgydG8U","5drc6dhSuH","CK5W7OUqFM","DQimpnFqik","5ZaEzHP433","ZzJHWP6bcg",
+"FhtglZhwG1","FjHXRJRJQB","J2mQihYBCK","ZhwG1NhXdu","4dEz6s93Ml","POUYS5nmWv","b29RJlj07Q","GXdoHCfgr3","pWiOscL0aE","ru4UGrz7Ut",
+"CK5W7RpBQm","24ARFmX2GE","oQ87rAmdQd","fLNg8lsQGo","L7cGcyofH3","azIWpWPmlx","xReecFNYIM","LDk6fWDVWJ","pvgjSCxVEf","tAOsrs4786",
+"gtCA5oGu6x","t98iWJ2mQi","NOHszHRxd8","55rfBuvf7A","MezSWb29RJ","lsQGojeskS","NhXduFwEJz","SmGzvTa8f6","lkMUAqQxHP","ogLgcAXpwE",
+"rKDLJgf8rI","gf8rIdpe1v","cQOnvM3zXL","0MR5XNhXdu","hSSvQ8RCUA","cL0aEqQxHP","Y1mC05Namm","x3LDeru4UG","Z4I1vlj07Q","14FLRQWxoT",
+"FxX9q5drc6","x3LDeuN6r3","Z4I1vKZamH","dhSuHsoy9t","uJScX2TRI7","DLhzMkZANm","IjTwP3weIF","a00b55Drn0","Waim6KASQ8","uN6r3fcJOy",
+"HfyNQlkMUA","VIlwPokgRi","he9IAfcJOy","LDk6f8cVD3","yEfy9aDGtS","jtn0X1j5L8","MK07YIn3NS","lH1ktgtCA5","Ul4a1XflUq","ni2v1WreyP",
+"jiVBP2TRI7","Y1mC0tl72W","GXdoHFFDui","iB08lKr8ys","W3VFH0MR5X","F6PT2zbIYY","zQt6Q7fsYM","fqypyFLsph","XyPZNvkCHH","euZA5QClRL",
+"QWxoTTwano","e6e4zDcpWB","HP433Ss0Zu","CIShGs7Mxk","GWqqXSbRYy","55rfB5VZjS","uAWypFVMxo","vLsmShE1Ql","CK5W75nmWv","jfREuAOgEe",
+"tlILtZJTXH","pAhR1dhSuH","4dEz6DLhzM","L7cGcRACuj","zQt6QG1RhS","i3pydPYBf4","FLsphbZLvS","zFgtBxciqp","jtn0XQWxoT","jzUqRdQ586",
+"7ku1p5Drn0","gf8rIatef2","XyPZN29QAz","FhtglG1RhS","IRh48ZuDtD","FjHXRXyPZN","bZLvSe6e4z","QWxoTFnPFB","kB5nPuQIcz","zY1GYo8Uyd",
+"lkMUAcQOnv","m4bxU4QMc9","uZPqgcmXIX","9iGoT2Yz7E","ZzJHWRkQke","fLNg8EdBKc","ni2v1In3NS","Waim6uPX7G","lweGyjS1aj","7lUXZjtn0X",
+"7X3uyru4UG","djsrvRmDcr","k85AeBpYhV","x3LDeCxVEf","gjUTuJIqXi","JIqXi16lHc","oVQp6StlDJ","pWiOsF6PT2","HRxd8Nxx9V","uTacxSbRYy",
+"prNT6lpF6W","uoStw580YD","LewvMxXTI4","5IhmGfaHir","prNT6RACuj","JRJQBC2Irc","uTacxUmaEv","RBhp0K4GS8","DcpWB2TRI7","nFqikxReec",
+"nnP8oDz1R3","Ss0Zun1pmO","jfREuDz1R3","5IhmGvOqCE","zmLYDRACuj","mX2GE5nmWv","t59lR14FLR","GXdoHNAFuw","tuDyShSSvQ","uQIczFGzgp",
+"9y4lwlpF6W","BCxeCuAWyp","7hyVv2Yz7E","dhSuHuZPqg","RsQUqatef2","RsQUqjtn0X","AOgEehE1Ql","zbIYYfFDrJ","FFDuiXflUq","t59lRYjB9t",
+"RsQUq2Nslm","HfyNQW7cTs","POUYSSs0Zu","uJScXksJby","Gv3FqKr8ys","0BmCyzHF1q","NOHszRxrsm","v8yFNwDajX","Mm8siSs0Zu","AmdQdsoy9t",
+"IjTwPIBe8k","uZPqglXFOB","pT8wukB5nP","cmXIXZuDtD","brhlQNxx9V","vOqCE8FmFH","6AFT0XflUq","5VZjSulk41","lXFOBtjQxs","jiVBPhi5X7",
+"AIYUuUvlv4","BFkb8POUYS","CK5W7oQ87r","MmKGJzHF1q","zbIYYNAFuw","uTacx7X3uy","n1pmOKsjRK","24ARFaDGtS","SjskQhE1Ql","Cp3mZd85a9",
+"K4GS8lm0pD","P6bcgUvlv4","h1zcHiB08l","SmGzv9rlg9","b29RJ7ku1p","b29RJzHF1q","HlUbFF6PT2","t59lRd7vjM","cL0aEjzUqR","k85Ae3weIF",
+"UlU3MAOgEe","F6PT2yluBx","FnPFBprNT6","PYBf4618Di","YjB9taDGtS","TXQ0Z5Namm","dmoS7TXQ0Z","BpYhVBCxeC","5ZaEzdhSuH","fcJOyQssNC",
+"0Wr5yOz8yZ","v2eC3lViBv","e6e4zTXQ0Z","D6rByQChxs","vLsmS8FmFH","Waim6ZzJHW","FxX9qZhwG1","uPX7GWreyP","nlaByyToGW","16lHczqH0W",
+"t59lRjSjS3","In3NStvdkD","MezSWTCgPp","RmDcrLbRTH","4W0TlQ6Lix","Waim6FjHXR","k85AewiHrZ","lweGyJIqXi","tuDySWmadA","hSSvQ0BmCy",
+"bgJAzRsQUq","0ao3lReKEW","7Ow5CReKEW","Zv7z064s8N","Mm8siAmdQd","G1RhSoQ87r","fFDrJdjsrv","S77LHVLTy6","TwanoIn3NS","55rfBXflUq",
+"0KyfsNxx9V","cQOnvAXpwE","zqH0W0BmCy","I7p2aB3qem","uAWypv1Hln","48cHLrz7Ut","ZuDtDuJScX","taOXKVNCPd","3otm6VNCPd","14FLRaez9y",
+"tjQxsGv3Fq","NAFuwgdQsS","kZANmVNCPd","8U2nUIjTwP","7lUXZU3yw5","hYBCK8hJdt","RACujJXljW","FNYIMJKWYR","BCxeCGSQwj","HP433MezSW",
+"14FLRogLgc","YOfrYwDajX","nlaBysqVrf","0BmCyrz7Ut","tuDySWaim6","POUYSiKqhr","14FLRIjTwP","pFrrlY1mC0","Ss0ZuTwano","QChxsdQ586",
+"P6bcgPb1pa","FGzgpuQIcz","CxVEfFcWrW","55rfB5nmWv","Waim63otm6","AgJHQM3zXL","CqqaDHP433","48cHL9rlg9","AgJHQIn3NS","v8yFN1j5L8",
+"QClRLBpYhV","2Yz7EzbIYY","dmoS7zqH0W","fFDrJpWiOs","VBjhzgtCA5","e6e4zv1Hln","hE1QlAOgEe","FcWrWFGzgp","lpF6W9y4lw","uvf7A9XyT9",
+"s7MxkNcICA","Uvlv4Ta8f6","5ZaEzrz7Ut","gf8rImX2GE","yluBx7lUXZ","SWfoujeskS","IjTwP4dEz6","4QMc9pv0i7","kZANmm4bxU","fcJOyZv7z0",
+"pvgjSksJby","s93Ml1LB1L","zY1GYlweGy","G1RhSdQ586","2ZHdklXFOB","29QAzOz8yZ","Ss0ZucmXIX","qUJMdjtn0X","gtCA5StlDJ","yvOMIokgRi",
+"yvOMIa00b5","hE1Ql0Wr5y","prNT6Ss0Zu","C2IrcyluBx","2TRI72hEEU","LDk6ftlILt","RsQUqSWfou","zz4ZU3otm6","FLsphRACuj","CIShG2hEEU",
+"PYBf47hyVv","aFFssOz8yZ","LewvMfqypy","AmdQdSjskQ","6AFT0lViBv","s93MlLbRTH","0BmCyZUnqt","ydG8UQWxoT","uLtKsL7cGc","ReKEWI7p2a",
+"JIqXiRsQUq","suY4xFVMxo","07n1cuAWyp","RzaZAbrhlQ","e6e4zMmKGJ","ru4UGdhSuH","VjCZqi7WMQ","SmGzvokgRi","MK07YuQIcz","AkKTkGv3Fq",
+"pWiOspv0i7","Kr8ysJRJQB","d85a9zQt6Q","i3pyd1v5hH","dmoS7CdyBV","EoToPGrDg7","FNYIMyToGW","MmKGJ9iGoT","FjHXRRpBQm","JRJQBi7WMQ",
+"DLhzM5drc6","QChxsFhtgl","uoStwNOHsz","TXQ0ZiB08l","pvgjSQYxC0","oQ87ratef2","RACujKZamH","2ZHdkVIlwP","blLA9jeskS","7lUXZjfREu",
+"zbIYYcQOnv","qUJMd16lHc","RBhp0SjskQ","0h1b1Yh1hF","Z4I1v1v5hH","1LB1LChuy3","CxVEfG1RhS","rz7Utmz8gx","K20wKxciqp","y94nwyEfy9",
+"tvdkDWMiS3","gdQsSSbRYy","FLsph7Ow5C","ogLgcazIWp","ciuWzKASQ8","7ku1pGSQwj","Oz8yZQWxoT","suY4xZ4I1v","4W0TlxReec","RxrsmBCxeC",
+"9XyT95Namm","I7p2avLsmS","jiVBPDQimp","jfREuIn3NS","2ZHdkIjTwP","aDGtSL7cGc","dmoS72DREs","DG4sT0MR5X","uLtKs9y4lw","jeskSThjNn",
+"6AFT0OUYuF","cQOnvStlDJ","bZLvSChuy3","3otm60Kyfs","8RCUAiKqhr","dmoS7jS1aj","s4786jeskS","MojnPPOUYS","nnP8o29QAz","5iGN5ZUnqt",
+"guMb82ZHdk","suY4xHfyNQ","uQIczTCgPp","MaJQsWDVWJ","64s8NFwEJz","RkQkeWPmlx","h1zcHMm8si","BbwgA1LB1L","AkKTkRBhp0","pAhR1uZPqg",
+"uJScXFPfSE","8TxD7aFFss","Vprf2oQ87r","wDajXFFDui","ThjNnNOHsz","Q6hMCO3iyQ","tuDyS5ZaEz","iKqhrWaim6","XyPZNWDVWJ","mX2GEuoStw",
+"ThjNnyEfy9","Oz8yZJJs5m","euZA5hE1Ql","ogLgcDQimp","taOXKaDGtS","QworuLDk6f","X6Pin0ao3l","Mm8si0PktI","v1HlnS2Dfu","0h1b1RzaZA",
+"uQIczRpBQm","VIlwPzFgtB","uupzkoVQp6","iwzGkP6bcg","W7cTshYBCK","Cfgr3dhSuH","vOqCEfcJOy","yvOMIblLA9","L7cGcix74r","Q6LixHzZT8",
+"tlILtt98iW","Ul4a1StlDJ","taOXKIKxdL","5NammZJTXH","8xEKzZv7z0","Cp3mZPOUYS","IBe8kiqv4k","2ZHdkzz4ZU","AgJHQLDk6f","BFkb8VNCPd",
+"BGaQYNOHsz","RBhp0iB08l","In3NSKASQ8","zmLYDoGu6x","LDk6fuvf7A","aL6AJFFDui","FjHXRhYBCK","9rlg916lHc","yvOMID6rBy","suY4xjzUqR",
+"dpe1vP6bcg","F6PT2HP433","cmXIXlCMxy","9iGoTlweGy","atef2S77LH","lViBvECMvU","PYBf45VZjS","CK5W7mX2GE","VLTy64dEz6","zHF1qguMb8",
+"FNYIMOxWIH","Q6hMChE1Ql","yluBx8cVD3","2NslmfFDrJ","LbRTHGXdoH","hYBCKfqypy","ZuDtDMojnP","qUJMd0PktI","MmKGJ3otm6","0ao3lX6Pin",
+"9y4lwzFgtB","sx5Gl45cIH","xReecW7cTs","d85a9C2Irc","Cfgr3lXFOB","Pb1pajfREu","QnJ1SYjB9t","QYxC0O3iyQ","uQIczuPX7G","hUTw7e6e4z",
+"FwEJzWPmlx","cL0aEHlUbF","4QMc9zY1GY","kZANm7hyVv","MmKGJv8yFN","cL0aEKsjRK","618Diatef2","lm0pDs93Ml","DLhzMBFkb8","mX2GEaFFss",
+"Yf2Ecatef2","1v5hHHlUbF","zFgtB8cVD3","CNHmvwDajX","pFrrltvdkD","LewvMydG8U","ZzJHWYOfrY","pAhR1cShY2","AXpwEl83Ud","0Kyfs64s8N",
+"lj07Q8RCUA","uJScXpT8wu","pWiOsbgJAz","uupzkOxWIH","fqypy0PktI","tvdkD4QMc9","pvgjStAOsr","9iGoTSjskQ","faHirksJby","zQt6QoQ87r",
+"fFDrJni2v1","G1RhSgf8rI","mz8gxnnP8o","Oz8yZCNHmv","zY1GYYw2oU","QChxsCp3mZ","AmdQd7ku1p","tuDySv2eC3","pWiOsDG4sT","zmLYDAmdQd",
+"iB08lUmaEv","HzZT89rlg9","TXQ0Zm4bxU","Q6Lixdpe1v","FNYIMpvgjS","MmKGJxXTI4","oVQp6jfREu","C2Irc0Wr5y","6q6L9Cfgr3","fqypyIn3NS",
+"UlU3MogLgc","MmKGJ64s8N","lkMUAK4GS8","0MR5XMkgy8","HP433Cfgr3","Q6hMCTCgPp","zFgtBW7cTs","kB5nPru4UG","lViBv9GXkX","BGaQYd85a9",
+"yluBxQnJ1S","NOHszPb1pa","d85a9OHaBz","zmLYD2TRI7","8RCUAXyPZN","QChxseuZA5","0PktICNHmv","FwEJzNcICA","l83Ud0BmCy","fcJOyUl4a1",
+"lCMxyprNT6","2ZHdkMGlTF","tAOsr7Ow5C","AOgEeoQ87r","RsQUqQWxoT","GSQwjChuy3","CNHmvVprf2","l83UdK20wK","RzaZAqaofN","QnJ1SS2Dfu",
+"9iGoTjiVBP","iqv4kVIlwP","zFgtBSbRYy","Pb1pahUTw7","G1RhSpAhR1","pT8wuFnPFB","6AFT00ao3l","dpe1v5nmWv","In3NSiKqhr","uPX7GOUYuF",
+"rKDLJwiHrZ","U3yw5K4GS8","8cVD3okgRi","kZANmMGlTF","NcICApvgjS","zQt6QgjUTu","Yw2oUpFrrl","Mkgy8Mkgy8","ni2v1Mm8si","s93MlvLsmS",
+"TwanoQYxC0","LewvMyluBx","64s8NMezSW","QbxXcfcJOy","qaofNdpe1v","Yw2oUuJScX","Uvlv4qaofN","fqypyb29RJ","Ul4a15Drn0","ciuWzx3LDe",
+"ZJTXHIKxdL","DcpWBMmsIo","M6qcGRBhp0","Mkgy8QssNC","RsQUqFhtgl","2Yz7E9XyT9","uLtKsDQimp","Uvlv4lkMUA","NhXduMGlTF","5NammG1RhS",
+"Nxx9VzbIYY","6AFT00YAGH","I7p2ah1zcH","64s8NOHaBz","6q6L99y4lw","a00b54QMc9","vkCHH9XyT9","0BmCyW3VFH","FxX9qrz7Ut","lsQGosuY4x",
+"PYBf4gtCA5","I7p2aLbRTH","7X3uyfmIK1","yEfy92TRI7","QssNCyToGW","v2eC3NAFuw","K20wK9rlg9","4QMc9RBhp0","0YAGHZzJHW","WMiS3ulk41",
+"mX2GEYh1hF","4dEz6POUYS","S2Dfu8cVD3","EOE1oThjNn","7Ow5Cv8yFN","EdBKcQnJ1S","QworuXyPZN","StlDJYf2Ec","ECMvUgtCA5","S2DfuuN6r3",
+"fmIK1FwEJz","vLsmSDQimp","cQOnvRzaZA","lXFOBnnP8o","OUqFMDLhzM","qQxHPv2eC3","jzUqRVjCZq","7fKYUHfyNQ","vLsmS48cHL","iqv4k0MR5X",
+"pvgjS9y4lw","JKWYRd85a9","aL6AJHRxd8","XflUq8TxD7","CNHmvs93Ml","RkQkeTCgPp","hYBCKsx5Gl","ix74rvOqCE","Vprf2DG4sT","P6bcgRkQke",
+"n1pmOCIShG","FnPFBuQIcz","D6rByfcJOy","ulk41QClRL","FVMxoFhtgl","pWiOstlILt","Cp3mZdjsrv","oVQp6v2eC3","zz4ZUo8Uyd","RpBQmYf2Ec",
+"BFkb8618Di","3weIF14FLR","C2Irciqv4k","uupzkjzUqR","y94nwrz7Ut","vOqCEZJTXH","29QAzUmaEv","AXpwECIShG","6AFT0M3zXL","RACujNAFuw",
+"vLsmS9iGoT","v8yFNNOHsz","dmoS7MaJQs","gf8rIFPfSE","MmKGJFxX9q","O3iyQSWfou","FGzgptvdkD","CdyBVpWiOs","EdBKcpiJSk","5VZjSW7cTs",
+"MaJQs7X3uy","fcJOy0ao3l","kB5nPsoy9t","CIShGv8yFN","WMiS3hYBCK","0BmCys4786","euZA5Q6hMC","AXpwEd85a9","IBe8ki3pyd","8xEKzJkzUn",
+"Zv7z0uZPqg","WPmlx9eoRc","hUTw7yEfy9","CqqaD9GXkX","7lUXZ9XyT9","y94nwlkMUA","8TxD7vOqCE","yofH3KsjRK","7Ow5Caez9y","cQOnv5Drn0",
+"taOXKLewvM","djsrvAIYUu","2ZHdkqQxHP","O3iyQGv3Fq","xXTI4K20wK","45cIH4QMc9","1v5hHlj07Q","BbwgAD6rBy","4QMc9oVQp6","QClRL5Mg9r",
+"blLA9m4bxU","QClRLydG8U","RBhp0L7cGc","jSjS33otm6","KASQ8rz7Ut","5drc6prNT6","EOE1ozHF1q","wDajXnFqik","lm0pDlXFOB","K4GS8iB08l",
+"TCgPpPOUYS","WaWsvXflUq","4QMc9pvgjS","QworuwDajX","gtCA5DG4sT","48cHLAOgEe","uN6r3hYBCK","4dEz6zFgtB","wDajXuTacx","Nxx9VCdyBV",
+"ix74r8TxD7","jSjS3lCMxy","uvf7AJ2mQi","n1pmOXyPZN","okgRidjsrv","24ARFpiJSk","FwEJzLewvM","Vprf2okgRi","qaofNNcICA","4QMc9ZuDtD",
+"0MR5X6AFT0","pAhR1GrDg7","dmoS7RkQke","FNYIM2TRI7","rz7UtCNHmv","MmsIofcJOy","M3zXLCqqaD","SbRYyXyPZN","jzUqRnnP8o","S77LHIRh48",
+"iqv4kEdBKc","iqv4kNAFuw","d7vjM8cVD3","SWfou16lHc","9eoRcBGaQY","WreyPFhtgl","W7cTsM6qcG","zHF1qGv3Fq","v8yFNCfgr3","8cVD3QClRL",
+"pFrrl7fsYM","9eoRc5Mg9r","CIShGBpYhV","0MR5XcQOnv","2TRI7VBjhz","MmsIok85Ae","ulk41tl72W","lweGykB5nP","rhl0JvLsmS","fLNg8wDajX",
+"9y4lw4QMc9","fLNg8lweGy","0Kyfsuupzk","aFFsssuY4x","EOE1o3weIF","FGzgpThjNn","8U2nUKASQ8","S2Dfuuvf7A","7fKYUZv7z0","IjTwPuupzk",
+"o8UydMojnP","KASQ8KsjRK","lsQGotvdkD","i7WMQXyPZN","TwanoPYBf4","G1RhSkZANm","0Kyfs24ARF","Q6hMC8RCUA","Rxrsmsoy9t","xReecv1Hln",
+"5ZaEz7lUXZ","UlU3MIRh48","uAWypwiHrZ","2DREslXFOB","FcWrW9rlg9","DcpWBMaJQs","Gv3FqJIqXi","MK07YfmIK1","brhlQoVQp6","ThjNnEoToP",
+"RkQkeMojnP","s7Mxk9GXkX","24ARF9XyT9","mz8gxyToGW","CdyBVuZPqg","5VZjSVerEA","7hyVvzqH0W","7fsYMb29RJ","6q6L90PktI","dmoS7h1zcH",
+"yofH3VBjhz","0YAGHIjTwP","uPX7GI7p2a","a00b529QAz","O3iyQM3zXL","LewvMFNYIM","blLA9jfREu","vLsmSPb1pa","CIShGjiVBP","a00b5MaJQs",
+"yofH3rKDLJ","zFgtBhi5X7","lViBvOUYuF","ReKEW5Mg9r","AgJHQ45cIH","nnP8o9iGoT","Oz8yZZuDtD","M3zXLciuWz","5iGN5d7vjM","IjTwPF6PT2",
+"fLNg8HfyNQ","2ZHdk2DREs","lm0pDyluBx","lXFOBZv7z0","taOXKnFqik","zFgtBWPmlx","jtn0XIKxdL","M6qcGzz4ZU","iB08l9rlg9","hUTw7RsQUq",
+"IKxdLlm0pD","GWqqX7X3uy","aez9yVNCPd","pFrrlQWxoT","7lUXZMK07Y","cShY2gf8rI","Y1mC04dEz6","RkQkeMK07Y","C2IrcuoStw","6q6L924ARF",
+"7lUXZZv7z0","taOXKlweGy","yToGWhe9IA","x3LDehUTw7","sqVrfP6bcg","C2Ircatef2","8TxD7s7Mxk","zbIYYGSQwj","J2mQihi5X7","VBjhz8hJdt",
+"Twanorz7Ut","2DREsRkQke","LewvMs93Ml","1LB1LB3qem","HlUbF8hJdt","FjHXR24ARF","8RCUA8U2nU","VNCPd14FLR","rz7Ut9iGoT","qQxHP7hyVv",
+"2ZHdkrKDLJ","gjUTujtn0X","FcWrW4W0Tl","IRh48RmDcr","yluBxGXdoH","m4bxUzqH0W","pFrrlOUYuF","AkKTkmz8gx","yvOMIjSjS3","s4786pmeCd",
+"JKWYRzY1GY","CxVEfIjTwP","ix74rEoToP","MmsIoNcICA","AXpwEdmoS7","AXpwEC2Irc","pT8wu7Ow5C","x3LDeI7p2a","NAFuwOxWIH","J2mQi0Kyfs",
+"fqypygjUTu","uJScX64s8N","gIYvE5ZaEz","NOHszGrDg7","uJScXAIYUu","jSjS3LbRTH","b29RJLbRTH","rz7Utdpe1v","DG4sTQssNC","WaWsv2Yz7E",
+"16lHciB08l","OUqFMzbIYY","45cIH14FLR","fLNg89y4lw","piJSkcmXIX","LDk6f1v5hH","7fKYUh1zcH","kB5nP45cIH","WMiS38xEKz","aFFssMmsIo",
+"uTacx9rlg9","guMb8mz8gx","pmeCdQWxoT","fmIK1uQIcz","3otm69y4lw","P6bcgtaOXK","HRxd8VjCZq","7ku1pReKEW","pmeCds7Mxk","CdyBVGv3Fq",
+"ZhwG1l83Ud","Yf2Ec8xEKz","AkKTkD6rBy","i7WMQmX2GE","4W0TlXflUq","QssNCfaHir","KASQ8RkQke","iB08ltjQxs","rKDLJNcICA","qUJMdEdBKc",
+"I7p2aNcICA","P6bcguN6r3","7hyVvKZamH","YjB9ti7WMQ","MojnPyvOMI","5Drn0FwEJz","ZhwG15VZjS","B3qem8RCUA","9GXkXlXFOB","3weIF0h1b1",
+"FnPFBblLA9","tuDySFnPFB","QChxsi3pyd","iqv4ke6e4z","sqVrfFxX9q","FcWrWjSjS3","iB08lsoy9t","iKqhry94nw","yluBxAkKTk","i7WMQ16lHc",
+"BFkb8OxWIH","hE1QluAWyp","v1HlnyofH3","DQimp8RCUA","okgRiBpYhV","SmGzvsx5Gl","BFkb8VerEA","MezSWazIWp","FnPFBVjCZq","ix74rydG8U",
+"BFkb8pv0i7","pAhR1vLsmS","BbwgAzz4ZU","pFrrlRBhp0","NAFuwCxVEf","lsQGot59lR","wDajXa00b5","lCMxyuJScX","CK5W7XflUq","t59lRxciqp",
+"wiHrZjSjS3","UmaEv4dEz6","fmIK1aez9y","yluBx8TxD7","cQOnvgjUTu","0ao3lW7cTs","lsQGo7fsYM","hUTw7Ss0Zu","t98iWuLtKs","tl72W9iGoT",
+"fcwDazqH0W","WPmlxJXljW","8TxD745cIH","xXTI4fFDrJ","hSSvQ5drc6","MK07YlweGy","Z4I1vpFrrl","h1zcHi7WMQ","7fKYUQssNC","aL6AJB3qem",
+"VjCZqt98iW","JKWYRHzZT8","nnP8oECMvU","zQt6QTXQ0Z","TXQ0ZcmXIX","pmeCds4786","KZamHyToGW","gdQsS6AFT0","piJSkiKqhr","KsjRKAmdQd",
+"BpYhVOHaBz","5iGN5RmDcr","WDVWJkZANm","aez9yRsQUq","FcWrWAmdQd","QYxC0piJSk","POUYSrhl0J","BGaQYCp3mZ","0KyfsHzZT8","JJs5mMK07Y",
+"9iGoT16lHc","7Ow5CzY1GY","9y4lwhUTw7","AOgEeGWqqX","NAFuwJKWYR","pv0i70MR5X","xXTI4Kr8ys","v8yFNlsQGo","uZPqgNxx9V","1j5L85Namm",
+"IKxdLUmaEv","d7vjMEdBKc","2Yz7ESs0Zu","Kr8ysjSjS3","MmsIo7lUXZ","7fsYM55rfB","4QMc9i7WMQ","KsjRKvkCHH","RmDcrWaim6","hSSvQNAFuw",
+"RACujs4786","FVMxob29RJ","PYBf47X3uy","F6PT2OUYuF","O3iyQy94nw","VjCZqVBjhz","CK5W7FjHXR","GSQwj9rlg9","wiHrZRpBQm","FPfSEuoStw",
+"OHaBzRsQUq","FLsphhi5X7","CqqaDyluBx","EdBKccQOnv","0MR5Xuvf7A","tAOsrZzJHW","Chuy3Ul4a1","0KyfspFrrl","gIYvEiB08l","soy9tfFDrJ",
+"MojnPjzUqR","MezSWNhXdu","nnP8oulk41","JkzUn9XyT9","VerEA24ARF","ZzJHWxXTI4","UmaEvdmoS7","8TxD7vLsmS","mz8gxAIYUu","fFDrJiwzGk",
+"Mkgy8lm0pD","S77LHAOgEe","BbwgASWfou","euZA5pT8wu","pT8wuS2Dfu","nlaByRkQke","EdBKcBbwgA","hSSvQXflUq","v2eC3a00b5","Zv7z0jeskS",
+"Yh1hFStlDJ","OHaBzv2eC3","aDGtSmX2GE","kB5nPMGlTF","RsQUqReKEW","XflUqwDajX","hYBCKjtn0X","JXljWcShY2","aDGtSuPX7G","Uvlv41LB1L",
+"MK07YlCMxy","i7WMQ0Kyfs","v8yFNKZamH","nFqik7X3uy","YjB9tSWfou","aDGtS7Ow5C","Pb1pa2DREs","b29RJo8Uyd","NOHszNhXdu","YOfrY5iGN5",
+"h1zcHVjCZq","nlaByBbwgA","yofH3guMb8","9rlg9Waim6","Uvlv4d7vjM","KZamHWreyP","5NammZzJHW","iqv4kaL6AJ","rhl0JpT8wu","nlaBy64s8N",
+"1LB1LDcpWB","WreyPWDVWJ","OUYuFjiVBP","IjTwPdhSuH","AmdQd2ZHdk","LDk6fn8pJ9","uQIczuoStw","yvOMIogLgc","lXFOBv8yFN","FPfSEHRxd8",
+"uJScXEoToP","CNHmv7fsYM","VBjhzh1zcH","QYxC0U3yw5","Uvlv4piJSk","wDajXSs0Zu","0BmCyQChxs","NcICApiJSk","kB5nPjtn0X","soy9tTXQ0Z",
+"qQxHPOz8yZ","QYxC0HP433","Z4I1vQ6Lix","5Namm45cIH","580YDMGlTF","FcWrW8hJdt","NAFuwEOE1o","IBe8kSWfou","5VZjSv8yFN","LewvMWmadA",
+"ZzJHWReKEW","Cfgr3Ta8f6","qaofNCqqaD","JRJQBzz4ZU","ciuWzCK5W7","0PktIZJTXH","tuDyS5IhmG","BFkb8FnPFB","8cVD3RzaZA","taOXKdhSuH",
+"S77LHjtn0X","sx5GlYjB9t","tvdkD16lHc","ix74rzFgtB","tAOsrs7Mxk","FFDuiBbwgA","I7p2aOUqFM","n1pmOlsQGo","Uvlv4580YD","5VZjS0h1b1",
+"9GXkXbrhlQ","ZzJHWy94nw","3otm6pWiOs","Cfgr3vOqCE","mX2GEFGzgp","NAFuwFGzgp","mz8gxblLA9","L7cGcsqVrf","GSQwjI7p2a","BGaQYFNYIM",
+"AmdQdrhl0J","8FmFHciuWz","DcpWBuZPqg","iKqhrfmIK1","WMiS3FNYIM","MmKGJMmsIo","JIqXizz4ZU","29QAzEoToP","kZANmqUJMd","Gv3FqtjQxs",
+"QbxXcVBjhz","qaofNMojnP","55rfBS77LH","2Yz7ECdyBV","MezSWogLgc","HfyNQzQt6Q","CdyBVtvdkD","CdyBVKASQ8","LewvMdjsrv","5ZaEz24ARF",
+"t98iWWPmlx","JKWYRWaim6","QClRL5nmWv","2TRI7gdQsS","7hyVvCdyBV","jSjS3KZamH","8hJdtCIShG","Z4I1vrz7Ut","JRJQB7fKYU","JRJQBqaofN",
+"sqVrfhYBCK","piJSk8cVD3","WPmlxJJs5m","cQOnvhSSvQ","Gv3Fq580YD","RsQUqzqH0W","QChxsjSjS3","RsQUqTCgPp","ZzJHWQ6Lix","KZamHChuy3",
+"lCMxyzbIYY","2DREsdhSuH","7fsYM2Yz7E","6AFT0JkzUn","7Ow5CTXQ0Z","yToGWWmadA","MmsIoNAFuw","n8pJ9HP433","I7p2aJJs5m","v2eC3s93Ml",
+"dQ586dpe1v","n8pJ9tlILt","F6PT29XyT9","EoToPyvOMI","CxVEfLbRTH","ZJTXH8hJdt","L7cGcSjskQ","AmdQdEOE1o","Z4I1vjtn0X","lCMxyuN6r3",
+"kB5nPUl4a1","ZUnqtlsQGo","RBhp0fFDrJ","FwEJzRzaZA","Zv7z0blLA9","WMiS3J2mQi","RsQUqjS1aj","lweGyZUnqt","9XyT9MaJQs","VNCPdiKqhr",
+"qQxHPU3yw5","iKqhr7X3uy","xReecS77LH","s93MlQ6hMC","ru4UGC2Irc","lkMUAv2eC3","VjCZqRACuj","VLTy6Yh1hF","BbwgAzHF1q","qQxHPokgRi",
+"2DREs7hyVv","CK5W7VLTy6","48cHL1v5hH","QssNCFwEJz","GrDg755rfB","tlILt2ZHdk","dhSuHzqH0W","taOXKVLTy6","ru4UGeuZA5","64s8NYf2Ec",
+"faHirMezSW","1j5L8fmIK1","QbxXck85Ae","SjskQFFDui","GWqqXRzaZA","s93MlrKDLJ","tjQxslViBv","pAhR1PYBf4","7X3uygtCA5","29QAzSjskQ",
+"prNT6JKWYR","TXQ0ZThjNn","atef2QYxC0","aFFsspmeCd","VerEAZ4I1v","rz7Ut9rlg9","M6qcG5Mg9r","7Ow5C29QAz","8RCUARxrsm","RkQkev2eC3",
+"FFDui0ao3l","No0Qbm4bxU","fFDrJVprf2","Ss0Zu2TRI7","aez9y4dEz6","9eoRcOUqFM","BpYhVogLgc","qUJMd24ARF","euZA5EOE1o","0BmCyaDGtS",
+"ru4UGxXTI4","RmDcroGu6x","gIYvEQnJ1S","gjUTujSjS3","qaofN9iGoT","l83UdJKWYR","HfyNQpAhR1","64s8Nhi5X7","pWiOsKsjRK","ix74rtAOsr",
+"lViBvWMiS3","VLTy6wiHrZ","lpF6WQClRL","hi5X7NAFuw","29QAzv1Hln","kZANmDQimp","6q6L9BCxeC","pWiOs6q6L9","Cp3mZtaOXK","s7MxkUl4a1",
+"FxX9qMK07Y","Waim6VLTy6","Q6LixX6Pin","JIqXiUvlv4","2hEEUMGlTF","bgJAzHRxd8","y94nwfFDrJ","3otm63weIF","PYBf4taOXK","gIYvEW7cTs",
+"t59lRWMiS3","lH1ktZ4I1v","pv0i7hSSvQ","NAFuw0Wr5y","fcJOyhSSvQ","Uvlv4fcwDa","aez9y9GXkX","GrDg7uvf7A","SmGzvhi5X7","WaWsvKr8ys",
+"taOXKRpBQm","zz4ZUrhl0J","K4GS8uN6r3","soy9tmX2GE","hSSvQzmLYD","Cfgr3POUYS","n8pJ9WPmlx","x3LDennP8o","yvOMIydG8U","fmIK1UmaEv",
+"FLsphWMiS3","s7Mxkd85a9","5VZjSlweGy","uN6r3rhl0J","CNHmvpmeCd","ZzJHWni2v1","yluBxhe9IA","QworuWreyP","RmDcrJXljW","M6qcGD6rBy",
+"QbxXcDz1R3","PYBf4wDajX","Dz1R3PYBf4","azIWphi5X7","prNT6Mkgy8","yofH35Mg9r","zqH0W55rfB","d7vjMLDk6f","1LB1LKASQ8","uZPqgTXQ0Z",
+"FPfSEbgJAz","aFFsszHF1q","JkzUns4786","nlaByzY1GY","5Mg9rReKEW","Kr8ysuAWyp","IRh48MGlTF","piJSkJ2mQi","vOqCEazIWp","lH1ktMojnP",
+"LDk6fdhSuH","ix74riqv4k","4QMc9mz8gx","uupzkKr8ys","lCMxyuZPqg","tlILtLewvM","gf8rIeuZA5","pWiOsFPfSE","d85a9e6e4z","tjQxsTwano",
+"7ku1pgjUTu","aL6AJsx5Gl","aez9yJXljW","8U2nU2TRI7","QworuP6bcg","MmsIoni2v1","oGu6xTa8f6","zY1GYi3pyd","s4786iwzGk","uPX7Gdpe1v",
+"cL0aEWmadA","GWqqXQ6Lix","J2mQiaez9y","S77LHIn3NS","QnJ1SuTacx","BCxeCM6qcG","2NslmYOfrY","8FmFH24ARF","3otm6aFFss","RmDcrSWfou",
+"24ARFlXFOB","zmLYD5IhmG","RpBQmlViBv","WMiS3RBhp0","RmDcrWDVWJ","zHF1qcmXIX","sx5GlfmIK1","KZamH8U2nU","9GXkXM3zXL","TwanopmeCd",
+"k85AeSbRYy","FVMxoHlUbF","CqqaD5drc6","8FmFHTa8f6","FNYIMQWxoT","CdyBVQ6hMC","7lUXZ5nmWv","Z4I1vHzZT8","CxVEfECMvU","dmoS7ru4UG",
+"5Drn0JIqXi","B3qemNo0Qb","OUYuFQYxC0","WPmlxUlU3M","AmdQdprNT6","suY4xwDajX","AOgEeFVMxo","FjHXRVNCPd","CxVEfpT8wu","XyPZNL7cGc",
+"MK07Y55rfB","ru4UGuPX7G","HP4330Wr5y","okgRiRBhp0","s7MxkXyPZN","8FmFHOUqFM","Z4I1vFwEJz","MmKGJCIShG","tvdkDNcICA","EdBKcIn3NS",
+"MK07YQWxoT","FcWrWFFDui","d7vjMVerEA","In3NShE1Ql","taOXKG1RhS","zFgtBMezSW","SbRYy8RCUA","uLtKslpF6W","9iGoTRmDcr","QYxC0vOqCE",
+"DG4sTjfREu","dhSuHdpe1v","uTacxFnPFB","5iGN5uAWyp","JXljWO3iyQ","WMiS3AOgEe","tvdkDyToGW","8cVD3pT8wu","2DREscL0aE","okgRiRxrsm",
+"Gv3FqVprf2","9GXkXlViBv","fcJOyiB08l","cmXIXMmKGJ","MGlTFJIqXi","No0QbK20wK","fFDrJuN6r3","WMiS38RCUA","16lHclkMUA","2ZHdkkZANm",
+"VBjhzIn3NS","o8UydksJby","2hEEUQ6Lix","8hJdt14FLR","4dEz6uAWyp","3weIFLDk6f","6q6L9GXdoH","rz7Ut4QMc9","S77LHbgJAz","7hyVvXflUq",
+"ECMvUAmdQd","lweGyi7WMQ","S2DfuRsQUq","VjCZq5ZaEz","rhl0Jsoy9t","S2DfujS1aj","IKxdLVprf2","L7cGckB5nP","2Yz7EjS1aj","Yw2oUVBjhz",
+"9rlg9S77LH","s47865IhmG","X6PindmoS7","BGaQYjeskS","Twanogf8rI","nFqikfFDrJ","sx5Gl2DREs","X6PinXflUq","uTacxGXdoH","ZJTXHzHF1q",
+"64s8NF6PT2","ix74ruZPqg","jS1ajpmeCd","ulk41m4bxU","fcJOyzQt6Q","Q6hMCi3pyd","ulk41bgJAz","ni2v14dEz6","LbRTHa00b5","5Drn029QAz",
+"8U2nUs93Ml","7fsYMsx5Gl","uQIczHfyNQ","CxVEfqUJMd","9rlg9J2mQi","uZPqgjS1aj","5IhmG5nmWv","M6qcGcShY2","LbRTHsqVrf","ix74r5Namm",
+"gIYvECNHmv","fFDrJQworu","taOXKI7p2a","W7cTsfcJOy","VIlwPuLtKs","F6PT264s8N","Yw2oUyofH3","uoStw2TRI7","0Kyfssoy9t","2NslmOHaBz",
+"gIYvEaFFss","ReKEWCK5W7","WMiS3lweGy","IRh48HfyNQ","sx5Gli3pyd","Rxrsmdpe1v","tvdkDRxrsm","2ZHdkTCgPp","tl72WQ6Lix","Cfgr3blLA9",
+"QnJ1She9IA","ni2v1yluBx","x3LDe2Nslm","OxWIHi7WMQ","XflUqtuDyS","FPfSEwDajX","blLA9WreyP","WaWsvI7p2a","3weIFB3qem","0PktIjfREu",
+"ZuDtDFcWrW","RkQke2Nslm","HP43307n1c","lj07Qv2eC3","7fsYMix74r","AXpwERsQUq","hUTw7HzZT8","yofH3L7cGc","ksJbyRpBQm","64s8NgIYvE",
+"L7cGcfmIK1","MaJQsWmadA","lpF6Wiqv4k","ZUnqtfmIK1","zY1GYCdyBV","8xEKzBpYhV","OxWIH6q6L9","ECMvUEdBKc","VjCZqgdQsS","45cIHPYBf4",
+"2TRI7KsjRK","FcWrWzqH0W","ydG8UUvlv4","fcJOyd85a9","ZUnqt2hEEU","VNCPdOUYuF","5Mg9rG1RhS","7X3uyMkgy8","zY1GYpAhR1","piJSkIBe8k",
+"QWxoTciuWz","5nmWv3otm6","Ss0ZuXflUq","RsQUq4QMc9","PYBf416lHc","uTacxnnP8o","d7vjMJ2mQi","5ZaEzzmLYD","SWfouprNT6","7Ow5C7hyVv",
+"i3pydbZLvS","U3yw5Ul4a1","YOfrYIn3NS","a00b5X6Pin","t59lRRsQUq","lXFOBJKWYR","QbxXcIKxdL","HlUbFs4786","LewvMatef2","pFrrlgtCA5",
+"n8pJ9MmsIo","0MR5XqUJMd","RpBQmNOHsz","GWqqXpFrrl","9iGoTjzUqR","brhlQhSSvQ","OHaBzZhwG1","zQt6Qo8Uyd","gIYvEprNT6","blLA9QssNC",
+"azIWpLewvM","FjHXRyToGW","Nxx9V7fKYU","7fsYM6q6L9","bZLvSFwEJz","JkzUnd7vjM","hi5X7W7cTs","euZA5fLNg8","lpF6WKsjRK","Pb1paIKxdL",
+"hi5X7NhXdu","aDGtSRmDcr","d85a9FFDui","uAWypEdBKc","jtn0XZ4I1v","Uvlv4hUTw7","YOfrYuvf7A","16lHc618Di","AOgEe3otm6","s4786lXFOB",
+"9y4lwRzaZA","29QAzZhwG1","RsQUqzHF1q","3otm6tAOsr","fLNg8QChxs","MojnPZUnqt","UlU3MLbRTH","m4bxUAOgEe","soy9t64s8N","blLA9FnPFB",
+"jzUqRoVQp6","DQimp45cIH","FVMxoRzaZA","0ao3ljfREu","v2eC3zQt6Q","gdQsSogLgc","zbIYYXyPZN","5VZjSUl4a1","P6bcgYjB9t","24ARFoQ87r",
+"HP433yToGW","XyPZNatef2","8hJdtgjUTu","JXljWtjQxs","zqH0WMezSW","oGu6xVBjhz","In3NS5ZaEz","gjUTu8hJdt","tjQxstAOsr","s7MxkokgRi",
+"lH1kts4786","mX2GEs93Ml","7Ow5Che9IA","5drc6gf8rI","0KyfsWPmlx","h1zcH9eoRc","8cVD3JJs5m","WmadAS77LH","d7vjMDcpWB","uoStwh1zcH",
+"prNT6RsQUq","AOgEeLewvM","2hEEU4QMc9","4W0TlQYxC0","WDVWJ2DREs","RBhp0MaJQs","Dz1R3zFgtB","x3LDelj07Q","9eoRcFcWrW","uoStw1LB1L",
+"K20wKECMvU","2TRI7Cp3mZ","jiVBPFnPFB","ZuDtDYjB9t","suY4xIKxdL","3weIFoVQp6","Waim6prNT6","hSSvQCNHmv","aez9ypWiOs","5IhmGUvlv4",
+"n1pmOCNHmv","14FLRFnPFB","tAOsrXflUq","hSSvQfcwDa","okgRifmIK1","qUJMdSjskQ","zmLYDaDGtS","SmGzvcQOnv","lj07Qru4UG","h1zcHmX2GE",
+"lXFOBm4bxU","5Mg9rRxrsm","VerEAzY1GY","IBe8kh1zcH","t98iWRACuj","G1RhS6q6L9","24ARF5nmWv","hE1QlFGzgp","Oz8yZlViBv","tAOsriKqhr",
+"iwzGkiKqhr","5drc6dmoS7","WPmlxLDk6f","jeskSRkQke","0YAGHCxVEf","pFrrlhi5X7","atef2yluBx","lm0pDSWfou","hE1Ql07n1c","s7MxkGrDg7",
+"kZANmx3LDe","lj07QBpYhV","VerEAOxWIH","kZANmJIqXi","0Wr5yFPfSE","QChxsdpe1v","pWiOsPOUYS","atef2jiVBP","S77LHuZPqg","Ss0ZuK4GS8",
+"d7vjM3otm6","DG4sTuQIcz","5nmWv5Namm","FNYIMKsjRK","MmKGJ9eoRc","ksJbygIYvE","m4bxULbRTH","TXQ0ZvkCHH","t59lRWDVWJ","Waim6xReec",
+"lXFOB0ao3l","9iGoTNo0Qb","l83UdWPmlx","BCxeC9eoRc","MK07YUmaEv","8RCUAgIYvE","M3zXLPb1pa","jS1ajx3LDe","FFDuiGrDg7","1j5L8ciuWz",
+"OUYuFFcWrW","TCgPptl72W","ksJbylH1kt","HfyNQBpYhV","VIlwPtuDyS","FnPFBOUqFM","ciuWzW3VFH","HRxd8ydG8U","9y4lwuJScX","Y1mC0W3VFH",
+"7X3uyDcpWB","qUJMdFVMxo","Gv3FqIRh48","POUYS0BmCy","qQxHP7fsYM","vOqCE5nmWv","fcwDaoVQp6","qQxHPgdQsS","Pb1paMkgy8","I7p2atuDyS",
+"Zv7z0lj07Q","5nmWvJXljW","FjHXRpiJSk","WreyP6q6L9","kB5nPStlDJ","RsQUq5ZaEz","9iGoTRxrsm","o8Uyd0YAGH","iKqhr0YAGH","Cp3mZQWxoT",
+"tjQxsIjTwP","vkCHHYw2oU","6q6L9t98iW","Nxx9V0Kyfs","rKDLJbrhlQ","2DREsVerEA","vLsmSulk41","5iGN5OUYuF","zHF1qjtn0X","CIShGAIYUu",
+"KASQ8zHF1q","7ku1puvf7A","zHF1qd85a9","14FLR5Namm","RsQUqaL6AJ","FFDuiru4UG","StlDJWreyP","NcICA3otm6","uZPqgWmadA","yEfy9n1pmO",
+"pmeCdksJby","2Yz7Ed7vjM","lCMxyfcwDa","l83UdpT8wu","sx5GltAOsr","LewvMEoToP","4W0TlbgJAz","BbwgA8U2nU","s4786zz4ZU","BpYhVBFkb8",
+"vOqCEHzZT8","7fsYMeuZA5","0BmCyazIWp","6AFT02ZHdk","OxWIH8cVD3","pAhR1kZANm","xciqppv0i7","RsQUqCp3mZ","CNHmvCdyBV","GWqqX5Mg9r",
+"Cp3mZJ2mQi","v1Hln14FLR","HP433xciqp","Y1mC0SbRYy","rz7UttvdkD","lj07Q7fsYM","k85AeMK07Y","sx5Glh1zcH","5NammX6Pin","CK5W7RsQUq",
+"0h1b1jzUqR","wiHrZDG4sT","FnPFB7Ow5C","HRxd8k85Ae","JkzUnP6bcg","pmeCdzY1GY","lkMUA48cHL","aL6AJLewvM","7X3uyYjB9t","uN6r36q6L9",
+"dpe1vni2v1","Uvlv4jSjS3","07n1cTXQ0Z","jS1aj5Drn0","KsjRKQssNC","ix74rK20wK","GXdoH5nmWv","tjQxs0Wr5y","iqv4klViBv","TXQ0ZPYBf4",
+"s4786aez9y","v8yFNDLhzM","SbRYyfaHir","i3pyd580YD","taOXKWaim6","Ul4a1yluBx","JIqXiaL6AJ","jtn0XCIShG","W7cTshE1Ql","xReeclsQGo",
+"XyPZNtjQxs","XflUqyluBx","YjB9t0ao3l","uvf7Alj07Q","07n1c7X3uy","XflUq5VZjS","WPmlxXyPZN","8U2nUQ6hMC","Mkgy8Yf2Ec","zbIYYuLtKs",
+"jSjS3K4GS8","lCMxyguMb8","JRJQBQbxXc","suY4xrhl0J","VLTy6hi5X7","qaofNaL6AJ","P6bcgEoToP","55rfBzbIYY","tlILtMaJQs","ogLgcx3LDe",
+"CxVEf9iGoT","7fsYM9eoRc","5ZaEzWMiS3","9XyT9618Di","WreyP24ARF","hi5X7fqypy","64s8NiB08l","BGaQYaFFss","Gv3FqIn3NS","9iGoTjtn0X",
+"iwzGkjfREu","hUTw7zY1GY","FhtglydG8U","ECMvUNcICA","KZamHlpF6W","vOqCEoQ87r","AkKTky94nw","MmsIoFGzgp","BCxeC16lHc","Cp3mZAIYUu",
+"G1RhShe9IA","SWfouRmDcr","QssNCEoToP","IBe8kI7p2a","iKqhrRmDcr","pWiOsWPmlx","suY4xogLgc","lpF6Wulk41","jS1ajrKDLJ","uoStwksJby",
+"okgRipFrrl","7ku1piKqhr","cmXIX48cHL","Cp3mZW3VFH","9XyT9Ta8f6","m4bxUrhl0J","Vprf2QWxoT","JRJQBCNHmv","uPX7GXflUq","2hEEUdmoS7",
+"he9IAnlaBy","BpYhVUvlv4","WMiS3fFDrJ","s4786POUYS","ru4UGpWiOs","S77LHnnP8o","XflUqhi5X7","QClRL5IhmG","DQimpulk41","29QAzFhtgl",
+"CNHmvzmLYD","ciuWzGSQwj","POUYSF6PT2","5iGN5QYxC0","djsrvZv7z0","cShY2s7Mxk","2Yz7Esx5Gl","8xEKzPOUYS","oQ87rWmadA","NAFuwQClRL",
+"lCMxytaOXK","5VZjSfqypy","FwEJzs7Mxk","JXljWoVQp6","y94nwsuY4x","yofH3MojnP","uAWypmX2GE","BbwgAuQIcz","9y4lwkZANm","prNT6GrDg7",
+"guMb8kB5nP","Z4I1vRxrsm","07n1csoy9t","1j5L8qUJMd","EdBKcJkzUn","tlILtAkKTk","JkzUnWaWsv","he9IAhYBCK","3otm6h1zcH","lCMxyWreyP",
+"0Wr5ywiHrZ","i3pydKZamH","SmGzvHzZT8","vLsmSkB5nP","Mkgy8uZPqg","GSQwjsx5Gl","8xEKz9XyT9","29QAzJIqXi","0ao3lfcJOy","TwanoblLA9",
+"BFkb8lm0pD","SmGzvrz7Ut","zmLYDWMiS3","vLsmSokgRi","07n1cNcICA","fcwDacQOnv","Mkgy8W7cTs","s4786FGzgp","KZamH2Yz7E","IjTwPOUqFM",
+"tvdkDzqH0W","WaWsvBbwgA","soy9tAIYUu","FVMxohUTw7","gjUTuSWfou","1j5L8TCgPp","rKDLJcmXIX","RxrsmMezSW","1v5hHoQ87r","okgRiiKqhr",
+"pmeCdfcJOy","0YAGHJ2mQi","NOHszqQxHP","7fKYUpFrrl","ulk41Ss0Zu","QChxs2Yz7E","14FLRF6PT2","Nxx9Vuvf7A","Pb1patvdkD","RpBQmlXFOB",
+"RBhp0GWqqX","Yh1hFguMb8","lXFOBMkgy8","guMb8lXFOB","tlILtRBhp0","zY1GY0Kyfs","4W0TllViBv","k85Ae7X3uy","soy9tgf8rI","Q6hMCqUJMd",
+"Kr8ysoGu6x","i3pyd5VZjS","b29RJFjHXR","iwzGkBbwgA","HlUbFMezSW","BGaQYn1pmO","n1pmOVprf2","uZPqgX6Pin","AmdQdgjUTu","QssNCfcJOy",
+"5nmWvpFrrl","uAWypsoy9t","ogLgcJXljW","dpe1vNxx9V","hUTw7ydG8U","9XyT98RCUA","4W0TlJ2mQi","pv0i70YAGH","cQOnvru4UG","vkCHHHzZT8",
+"9rlg9BGaQY","M6qcGfqypy","ZuDtD2ZHdk","2DREsAgJHQ","Mkgy8zFgtB","QnJ1Suupzk","cShY2tlILt","9GXkX0PktI","RBhp0b29RJ","jeskS24ARF",
+"3otm6Cp3mZ","rKDLJ8hJdt","GSQwjfmIK1","6AFT0pv0i7","JkzUnoQ87r","KsjRKgjUTu","MGlTFK4GS8","s93MlLewvM","5VZjS7ku1p","v1HlndQ586",
+"MezSWL7cGc","5NammOHaBz","s4786MezSW","StlDJRBhp0","LDk6f5nmWv","14FLRYjB9t","zHF1qyluBx","EoToPTwano","K4GS8lH1kt","i3pyd0BmCy",
+"jtn0X24ARF","4dEz6Ss0Zu","s4786VIlwP","YOfrYZUnqt","LbRTHRxrsm","FhtglrKDLJ","t59lRZJTXH","RACuj5Drn0","FnPFB9rlg9","vOqCErz7Ut",
+"qQxHPAmdQd","VIlwP3weIF","ix74rjfREu","zFgtBTXQ0Z","BCxeCzFgtB","Y1mC0MezSW","VBjhzciuWz","W3VFHCqqaD","cShY2NAFuw","ZhwG1Waim6",
+"lweGydmoS7","dQ586LewvM","YOfrYgdQsS","0KyfsCK5W7","Dz1R3HP433","SmGzvTCgPp","oQ87reuZA5","LewvMHRxd8","GXdoHMm8si","piJSkF6PT2",
+"kB5nPfmIK1","XflUqx3LDe","lCMxyzFgtB","Yw2oU618Di","EdBKc5ZaEz","Y1mC0piJSk","fmIK1tvdkD","QbxXc5VZjS","pT8wuHlUbF","LewvMFjHXR",
+"KsjRKY1mC0","FFDuipvgjS","uN6r3yToGW","nFqikjS1aj","FVMxojS1aj","RACuj4W0Tl","In3NSMm8si","Dz1R3uJScX","SmGzvzFgtB","b29RJ1v5hH",
+"aFFssIRh48","FxX9qPOUYS","8RCUAiwzGk","jzUqR5ZaEz","VjCZqFwEJz","HP4330MR5X","FPfSEsqVrf","4dEz6y94nw","HfyNQdjsrv","QssNCKr8ys",
+"SWfou7hyVv","uTacxnlaBy","BFkb8SbRYy","HzZT8HlUbF","rKDLJP6bcg","fFDrJW3VFH","LbRTH9iGoT","5iGN50PktI","yvOMI45cIH","SWfouxReec",
+"uN6r3n1pmO","M6qcGIjTwP","oVQp6t98iW","Mkgy8guMb8","X6PincQOnv","JKWYRrKDLJ","U3yw5zqH0W","uTacx580YD","uTacxpFrrl","LewvMYw2oU",
+"DG4sTVIlwP","fqypyJ2mQi","yEfy914FLR","0YAGHlsQGo","No0QbOUqFM","KZamHhSSvQ","WaWsvFNYIM","tAOsr16lHc","t98iW8hJdt","24ARFHzZT8",
+"cmXIXjeskS","PYBf42Yz7E","soy9tbrhlQ","Mm8sizHF1q","No0QbiwzGk","fLNg8Ss0Zu","0YAGHxciqp","Chuy3MaJQs","14FLRJXljW","2hEEUlkMUA",
+"zFgtBZv7z0","4dEz65IhmG","DG4sTjeskS","nnP8ofqypy","ThjNnD6rBy","SjskQWDVWJ","Twano5iGN5","4dEz69XyT9","7ku1p5Mg9r","5ZaEzY1mC0",
+"IjTwPUlU3M","2NslmSbRYy","9rlg9azIWp","lCMxyXyPZN","aez9yOxWIH","KsjRKYh1hF","DLhzMzqH0W","l83Ud5VZjS","ZJTXHfqypy","fmIK1AOgEe",
+"SjskQP6bcg","K20wK9XyT9","t98iWB3qem","4QMc9bZLvS","8xEKzjfREu","tl72WtaOXK","MmKGJjS1aj","PYBf4WPmlx","aDGtSWDVWJ","WPmlxcL0aE",
+"CK5W7No0Qb","d7vjMyEfy9","yluBxM6qcG","tjQxsThjNn","MGlTF1v5hH","0KyfsChuy3","VerEACqqaD","s4786VerEA","uAWypNcICA","FVMxoHRxd8",
+"JKWYRFxX9q","o8Uydlj07Q","JkzUnsoy9t","D6rBydhSuH","QWxoTgIYvE","faHirRxrsm","TCgPpJJs5m","lm0pDBCxeC","I7p2a14FLR","BpYhVDLhzM",
+"iB08ltvdkD","IKxdL24ARF","RACujlXFOB","NcICAL7cGc","WaWsvokgRi","5nmWvChuy3","W3VFHX6Pin","8U2nUv1Hln","ni2v1i7WMQ","VNCPdsx5Gl",
+"uupzkRBhp0","he9IAYh1hF","RBhp0OUqFM","ZuDtDSs0Zu","oGu6xQYxC0","1LB1Ltl72W","dmoS78FmFH","tl72WyluBx","8FmFH55rfB","JRJQBCqqaD",
+"Gv3FqQssNC","lH1kt2TRI7","TXQ0Zk85Ae","ZzJHW2DREs","blLA929QAz","sqVrfyvOMI","zFgtB3otm6","n8pJ9iKqhr","aFFssVjCZq","9eoRcVLTy6",
+"SbRYym4bxU","k85AelkMUA","5Drn024ARF","WPmlxEdBKc","HlUbFfcwDa","VjCZq48cHL","zFgtBIjTwP","0PktI14FLR","jSjS3YjB9t","RxrsmP6bcg",
+"JkzUnqUJMd","TCgPpokgRi","2hEEU8hJdt","yEfy9GSQwj","RpBQms93Ml","fFDrJ2DREs","AIYUutuDyS","Cfgr3HlUbF","ZJTXHQssNC","e6e4zRkQke",
+"MmKGJ6AFT0","o8UydgdQsS","guMb85Drn0","8hJdtOxWIH","G1RhSlkMUA","mX2GEoVQp6","7fKYUvkCHH","2TRI7aez9y","zHF1qK20wK","W3VFHCNHmv",
+"Q6hMCzz4ZU","0YAGHPYBf4","hi5X7JkzUn","kB5nPlpF6W","QYxC08RCUA","e6e4zUvlv4","Vprf2EOE1o","nnP8o8FmFH","vOqCEKZamH","SWfouYjB9t",
+"I7p2agjUTu","9XyT9wDajX","Twanoxciqp","gjUTuFwEJz","OUYuFpiJSk","RxrsmsqVrf","RpBQmLewvM","MK07YhSSvQ","0BmCy5Mg9r","Vprf245cIH",
+"5VZjSiqv4k","uPX7Gmz8gx","zFgtBqUJMd","d7vjMQWxoT","nnP8oD6rBy","LewvMxReec","XyPZNWaWsv","618Di2TRI7","hYBCKJIqXi","yEfy9Q6Lix",
+"zqH0WZv7z0","FhtglGWqqX","5IhmGQnJ1S","WPmlxzz4ZU","lCMxyxciqp","l83UdguMb8","GXdoHK4GS8","a00b5lXFOB","HzZT8jfREu","Cp3mZYh1hF",
+"LbRTHIn3NS","VBjhzOz8yZ","t98iWiB08l","No0QbCfgr3","x3LDe7hyVv","4dEz6DG4sT","VjCZqFxX9q","Gv3Fqo8Uyd","CK5W7e6e4z","CNHmvP6bcg",
+"55rfBjtn0X","aFFsslweGy","rz7UtYOfrY","nFqikAkKTk","TCgPpY1mC0","brhlQS2Dfu","DcpWBKASQ8","v8yFNTa8f6","uvf7Adjsrv","W7cTsOUqFM",
+"OUYuF0ao3l","LDk6flj07Q","YOfrYVerEA","7lUXZsuY4x","hSSvQuAWyp","lm0pDVerEA","In3NSyToGW","azIWpFPfSE","ogLgcGXdoH","Dz1R3Cp3mZ",
+"pWiOstAOsr","GXdoHrz7Ut","blLA9Gv3Fq","F6PT207n1c","jeskSd85a9","Cp3mZ7fsYM","VNCPdYOfrY","Zv7z0rKDLJ","55rfBb29RJ","M6qcG8RCUA",
+"5Drn0blLA9","CK5W7wiHrZ","Yw2oUSs0Zu","IRh48X6Pin","7ku1pQ6Lix","mz8gxHP433","zQt6QDG4sT","MGlTFd7vjM","ydG8UxXTI4","64s8NzHF1q",
+"jSjS39rlg9","lweGy2Yz7E","v1HlntvdkD","OUqFMdjsrv","zmLYD2DREs","CK5W7rhl0J","TCgPptlILt","VLTy6yEfy9","POUYSuQIcz","Yh1hF9y4lw",
+"WMiS34dEz6","9y4lwbrhlQ","Mkgy8VNCPd","GWqqX1LB1L","D6rByjS1aj","fcwDa2TRI7","8U2nUVBjhz","euZA5uTacx","azIWpSs0Zu","lXFOBBFkb8",
+"618Di2Nslm","v2eC3CIShG","guMb82Yz7E","7hyVv2DREs","azIWpJXljW","Ul4a10BmCy","Cp3mZe6e4z","HzZT8AmdQd","t59lR5Namm","y94nwcShY2",
+"XyPZNuAWyp","5drc6qaofN","tjQxsJ2mQi","KASQ816lHc","Q6hMCRkQke","GXdoHMGlTF","FwEJzRACuj","vLsmSBCxeC","suY4xlH1kt","ZJTXH9rlg9",
+"MaJQsn8pJ9","cL0aE8RCUA","55rfBbrhlQ","4QMc9NOHsz","lCMxyM6qcG","WDVWJMm8si","iB08lAIYUu","9iGoTCK5W7","djsrvVprf2","0ao3l0MR5X",
+"618DiPb1pa","piJSkzQt6Q","QChxsCfgr3","CK5W7sx5Gl","DQimpL7cGc","YjB9tF6PT2","uQIczM3zXL","n8pJ9oVQp6","9XyT9WmadA","OUYuFfqypy",
+"5ZaEzOUYuF","dhSuHNAFuw","djsrvHP433","AgJHQ9y4lw","9rlg9bgJAz","45cIHRACuj","EoToP8U2nU","OUqFMPOUYS","KASQ8LewvM","hE1Ql9XyT9",
+"gtCA5vOqCE","iwzGkoGu6x","RmDcrgf8rI","4W0TlFhtgl","7fKYUGv3Fq","OxWIHsx5Gl","AgJHQhUTw7","IRh48vOqCE","aez9yDz1R3","IBe8khUTw7",
+"BCxeCThjNn","NOHszVprf2","uJScXk85Ae","DLhzMReKEW","1LB1L2DREs","vOqCEQYxC0","EdBKcvOqCE","DcpWBPb1pa","sx5Gl4W0Tl","sx5GlNOHsz",
+"WMiS3zY1GY","yvOMI7fKYU","7X3uyNo0Qb","uN6r3BGaQY","aez9yBCxeC","uvf7AIKxdL","JKWYRrz7Ut","TwanoVBjhz","Gv3FqtAOsr","djsrvuupzk",
+"5drc6MmsIo","3weIFMm8si","5IhmGatef2","NAFuwBGaQY","HRxd8HP433","0KyfssqVrf","CNHmvKr8ys","9rlg9euZA5","o8UyduN6r3","OUqFMVBjhz",
+"8FmFHGv3Fq","29QAzzbIYY","WmadADQimp","rz7UtHfyNQ","Q6hMC29QAz","9GXkXK20wK","Waim6Yw2oU","FwEJzTXQ0Z","dQ58607n1c","FjHXRv8yFN",
+"ECMvUsuY4x","TwanotAOsr","guMb82TRI7","sx5Gl5iGN5","pAhR1cL0aE","CdyBVZUnqt","FhtgluTacx","d85a91LB1L","RkQke5Drn0","pAhR1tjQxs",
+"StlDJe6e4z","5ZaEzEdBKc","zY1GYs93Ml","64s8NoQ87r","G1RhSpT8wu","ksJby5Namm","FPfSElweGy","jiVBPFwEJz","FhtglTa8f6","uPX7GEOE1o",
+"580YDFLsph","5NammOUqFM","StlDJQClRL","IBe8kcQOnv","qUJMdCIShG","KASQ8Pb1pa","lH1ktRsQUq","W3VFHMGlTF","0KyfsRmDcr","iKqhrD6rBy",
+"vkCHHtaOXK","cmXIXzbIYY","L7cGcjzUqR","fcwDaStlDJ","2ZHdkHP433","Yh1hFh1zcH","SbRYyGSQwj","OxWIHuN6r3","prNT64QMc9","MGlTFiwzGk",
+"hE1QldmoS7","xciqp3weIF","ru4UGFVMxo","GSQwjHRxd8","2ZHdk8RCUA","ECMvUCNHmv","MK07YwiHrZ","CdyBVqUJMd","RsQUq29QAz","pmeCdBpYhV",
+"soy9tv2eC3","CNHmvRsQUq","pvgjS618Di","sx5Gll83Ud","GrDg7QbxXc","fLNg8rz7Ut","9iGoT5Namm","1v5hH2Yz7E","uJScXS77LH","NhXdu2hEEU",
+"LewvMix74r","s7MxkQ6hMC","L7cGcRkQke","Yf2Ec8cVD3","JIqXiNo0Qb","7hyVvlH1kt","4dEz6Mkgy8","EoToPHP433","7X3uyguMb8","IRh48S2Dfu",
+"Zv7z0JkzUn","pv0i7vkCHH","X6Pinru4UG","SbRYyReKEW","NcICAI7p2a","NhXdulXFOB","aDGtS55rfB","0YAGHRBhp0","Z4I1vFhtgl","guMb8QssNC",
+"jfREul83Ud","IRh48iqv4k","RzaZAv2eC3","hUTw79iGoT","kZANmRmDcr","QnJ1S2ZHdk","tuDySnnP8o","jSjS3kZANm","pvgjSG1RhS","fLNg88RCUA",
+"yluBxXyPZN","5iGN58RCUA","jzUqREOE1o","5NammYf2Ec","yToGWFnPFB","QWxoTa00b5","cL0aEh1zcH","pv0i7pFrrl","O3iyQn8pJ9","16lHcix74r",
+"zmLYDW7cTs","5VZjSOHaBz","dpe1v8TxD7","MmsIoJXljW","FVMxojeskS","tlILtZUnqt","fLNg85Mg9r","IBe8kWMiS3","WDVWJWreyP","RBhp0SbRYy",
+"qaofNOUYuF","KZamHyvOMI","uAWypGv3Fq","2ZHdkjS1aj","Yh1hFHRxd8","ix74rix74r","pWiOsiB08l","tlILtIRh48","prNT6gtCA5","In3NSbZLvS",
+"WreyPOz8yZ","VIlwPkB5nP","i7WMQlkMUA","LDk6fRkQke","CNHmvnlaBy","7ku1pwDajX","VjCZq3weIF","ZJTXHMK07Y","9rlg9ogLgc","gtCA5QChxs",
+"fmIK15IhmG","8RCUAjeskS","1LB1LcShY2","POUYSVLTy6","RzaZARpBQm","SmGzvReKEW","soy9ts4786","WreyPqaofN","WaWsvxReec","WMiS3WDVWJ",
+"s4786Yw2oU","i3pydF6PT2","YOfrYulk41","gtCA5jfREu","yToGWQClRL","dhSuH6q6L9","Q6hMCStlDJ","64s8NCdyBV","pFrrlCqqaD","lj07QC2Irc",
+"AOgEeDz1R3","uJScXAmdQd","b29RJyvOMI","cmXIXrKDLJ","Z4I1vCIShG","tl72WFcWrW","n8pJ9Qworu","QssNC0PktI","lViBv3weIF","YjB9tlsQGo",
+"RmDcrSjskQ","uvf7AThjNn","v2eC3ix74r","lH1kt4dEz6","CdyBVP6bcg","HlUbFfmIK1","GrDg75drc6","mX2GEbgJAz","oGu6xtAOsr","BpYhVn8pJ9",
+"HzZT8euZA5","Ss0ZupT8wu","lsQGo8TxD7","iB08lFVMxo","4W0TleuZA5","SjskQhSSvQ","0PktIDz1R3","lkMUAtAOsr","AkKTks93Ml","2TRI7W3VFH",
+"M6qcGiKqhr","G1RhSlsQGo","SbRYyNxx9V","uvf7AvLsmS","SWfouQnJ1S","xXTI4WMiS3","i7WMQGSQwj","hi5X7azIWp","8TxD7QssNC","aFFsslCMxy",
+"FnPFBrKDLJ","2hEEUJIqXi","P6bcgAkKTk","zz4ZUFPfSE","Zv7z0NcICA","fqypyiKqhr","I7p2adhSuH","lsQGoNcICA","o8Uydhi5X7","GrDg73weIF",
+"MezSWOUYuF","rz7Ut1v5hH","JXljWmX2GE","WaWsvW3VFH","fcwDad85a9","6AFT0BCxeC","zFgtBpiJSk","Gv3FqBGaQY","guMb8OxWIH","JIqXipv0i7",
+"BGaQYZ4I1v","FGzgpJKWYR","DLhzMzY1GY","QChxs3weIF","9iGoTvkCHH","8FmFHcShY2","DLhzM48cHL","6AFT0mz8gx","aez9yGWqqX","FVMxoOHaBz",
+"S77LHHRxd8","WPmlxbgJAz","9GXkXgdQsS","WmadACfgr3","AIYUuEdBKc","DLhzMY1mC0","EdBKcMezSW","suY4xzY1GY","gdQsS3weIF","EdBKcTCgPp",
+"U3yw5BCxeC","HfyNQAOgEe","GWqqX4dEz6","iwzGkYjB9t","6q6L9RBhp0","hUTw77ku1p","QworuRBhp0","zHF1q6q6L9","pv0i7Nxx9V","s4786IjTwP",
+"BbwgAulk41","Uvlv45drc6","DcpWBhE1Ql","pFrrl5ZaEz","POUYSbZLvS","DQimpOxWIH","No0QbZhwG1","AOgEeYw2oU","EoToPpWiOs","XyPZNlViBv",
+"OHaBzUmaEv","AIYUu0h1b1","RpBQmvLsmS","mX2GEVNCPd","HlUbFv8yFN","LDk6fWMiS3","AmdQdJkzUn","WDVWJVNCPd","OHaBzpiJSk","6AFT0VIlwP",
+"n1pmO5drc6","GSQwjvkCHH","WPmlxvLsmS","2DREsQ6hMC","FPfSEIjTwP","CNHmvpiJSk","ZUnqtjtn0X","2DREsk85Ae","TXQ0Z7fKYU","14FLRCdyBV",
+"IRh48VBjhz","Chuy3VjCZq","kZANmIn3NS","0ao3lG1RhS","45cIHMmsIo","WPmlxP6bcg","kZANmTXQ0Z","9y4lwWaWsv","FLsphDLhzM","PYBf4YjB9t",
+"yluBxP6bcg","JJs5mVprf2","ThjNnGXdoH","P6bcg8U2nU","X6PinIn3NS","fqypyt98iW","lpF6WlsQGo","TXQ0Z2DREs","BbwgAhSSvQ","ydG8U4dEz6",
+"QnJ1SQbxXc","o8Uydru4UG","P6bcgogLgc","ulk41SjskQ","7X3uyIRh48","suY4xMkgy8","a00b5uvf7A","0YAGHCK5W7","rKDLJpAhR1","fcwDaydG8U",
+"24ARFM3zXL","9iGoTatef2","P6bcgaFFss","lkMUA5Namm","ydG8Um4bxU","VNCPdHP433","lCMxySbRYy","e6e4zQssNC","n8pJ9tuDyS","FVMxov1Hln",
+"fcwDafLNg8","IRh48POUYS","DQimpfaHir","jeskSGWqqX","Uvlv4HP433","BpYhVEdBKc","AmdQdCdyBV","yofH3KZamH","8TxD7FnPFB","Dz1R3aL6AJ",
+"iB08lAOgEe","RpBQmWaWsv","yToGWfqypy","C2Irci3pyd","oGu6xMK07Y","M6qcGs7Mxk","uPX7Gv1Hln","pAhR1D6rBy","XyPZNjtn0X","IKxdLKZamH",
+"pFrrlThjNn","Gv3FqYf2Ec","JRJQBaez9y","wDajXSjskQ","KsjRKy94nw","2TRI79eoRc","7Ow5C55rfB","lkMUANo0Qb","UmaEvbZLvS","EOE1oS77LH",
+"cShY2In3NS","zbIYYogLgc","TCgPpDz1R3","ciuWzNo0Qb","ZhwG1e6e4z","F6PT2Pb1pa","HlUbF7fsYM","8RCUALbRTH","9iGoTQWxoT","y94nwHP433",
+"wDajX6q6L9","AkKTk7ku1p","t59lRG1RhS","7X3uyFnPFB","5Nammn8pJ9","2TRI7HlUbF","QworuY1mC0","FcWrWThjNn","BGaQYRxrsm","M3zXLFLsph",
+"POUYSe6e4z","TXQ0ZjiVBP","jS1ajNcICA","WmadABbwgA","Yh1hFrz7Ut","tAOsrMojnP","S77LHuJScX","pmeCdnnP8o","CdyBVVIlwP","8xEKzAIYUu",
+"Qworu0Wr5y","QssNCDQimp","PYBf4k85Ae","VNCPdwiHrZ","Q6LixBCxeC","d85a9n1pmO","MmsIofqypy","yToGWQbxXc","55rfBYh1hF","pv0i707n1c",
+"ni2v1MK07Y","suY4xuTacx","wiHrZlpF6W","VjCZqbgJAz","0BmCyMmKGJ","FVMxorhl0J","jS1ajtuDyS","JKWYRlj07Q","y94nwy94nw","BCxeCvLsmS",
+"Zv7z0nFqik","hE1QlFnPFB","UmaEvfcJOy","v8yFNyluBx","9XyT9lpF6W","HP433M3zXL","lweGyFVMxo","JIqXiMezSW","y94nwzqH0W","cShY2Twano",
+"v8yFNHlUbF","QWxoTWDVWJ","ydG8UP6bcg","NAFuwgjUTu","HP433CdyBV","FPfSE55rfB","TCgPpFhtgl","atef2UmaEv","o8UydD6rBy","jS1ajBFkb8",
+"MmKGJoQ87r","uZPqgm4bxU","FGzgpvOqCE","vOqCEEOE1o","iwzGk2ZHdk","Z4I1vSs0Zu","lH1ktWPmlx","suY4xi7WMQ","7X3uyHzZT8","G1RhSpvgjS",
+"yEfy9FLsph","RBhp0NOHsz","ThjNnprNT6","bgJAzWMiS3","euZA5WreyP","Gv3FqjeskS","7X3uydhSuH","Pb1papvgjS","uN6r39eoRc","Nxx9VQbxXc",
+"KZamHjzUqR","GWqqXYw2oU","qQxHPo8Uyd","9GXkXHfyNQ","cQOnvAIYUu","jtn0XiB08l","mX2GEx3LDe","ix74rMGlTF","Oz8yZzz4ZU","Yf2EcguMb8",
+"lpF6WG1RhS","1LB1Lm4bxU","AOgEeiwzGk","brhlQs4786","M6qcGDQimp","CdyBVAgJHQ","e6e4zVNCPd","hSSvQ2Yz7E","0MR5XCxVEf","suY4xCfgr3",
+"4QMc97fsYM","NhXduFVMxo","UmaEvWaim6","OHaBzSs0Zu","kZANm0ao3l","4W0TlThjNn","Vprf2m4bxU","d7vjMokgRi","dmoS75Drn0","aDGtSS2Dfu",
+"ru4UGmz8gx","jS1ajiKqhr","K4GS8bgJAz","Y1mC0SmGzv","i7WMQt59lR","OxWIHTa8f6","m4bxU3weIF","LbRTH7hyVv","0KyfsMojnP","qQxHP5iGN5",
+"5nmWvCdyBV","BbwgAni2v1","FnPFB1v5hH","HP433Dz1R3","oVQp6guMb8","FGzgp8FmFH","IjTwPKsjRK","lXFOBFwEJz","QbxXcTwano","oVQp61j5L8",
+"QClRLB3qem","yluBxfqypy","y94nwUl4a1","gdQsS1LB1L","0Kyfs8TxD7","5Mg9rXflUq","m4bxUtl72W","oGu6xBpYhV","7Ow5CfFDrJ","FhtglFVMxo",
+"BbwgA29QAz","ZhwG1FPfSE","Z4I1vAXpwE","Vprf22ZHdk","l83UdfaHir","qQxHPzY1GY","EdBKcQ6hMC","TwanoJRJQB","RsQUqy94nw","RzaZAMezSW",
+"lCMxyfLNg8","faHirFNYIM","C2IrcKZamH","soy9tcL0aE","wDajXaL6AJ","X6PinjeskS","a00b5yEfy9","X6Pindjsrv","brhlQQWxoT","pT8wuv2eC3",
+"s4786mX2GE","QworuSmGzv","OUYuFUlU3M","0MR5XIRh48","1j5L8lj07Q","hYBCKv1Hln","xReecbgJAz","zY1GYyluBx","IBe8kn1pmO","i3pydaFFss",
+"gf8rIjiVBP","hi5X7hYBCK","kZANmWaim6","U3yw5QnJ1S","yvOMINcICA","m4bxUNhXdu","lCMxyZ4I1v","24ARFDG4sT","NhXduK4GS8","cmXIXFhtgl",
+"lpF6Wo8Uyd","0PktIAmdQd","zqH0WZuDtD","StlDJfLNg8","l83Uds93Ml","5drc6Rxrsm","LewvMSbRYy","okgRi3otm6","UmaEvRxrsm","M3zXLXflUq",
+"2hEEU0ao3l","3weIFQworu","QnJ1SzFgtB","YOfrYMojnP","AgJHQiB08l","VBjhzY1mC0","y94nwlj07Q","uN6r39XyT9","7lUXZqQxHP","lkMUAQ6hMC",
+"ru4UGzFgtB","tl72WyEfy9","uAWypReKEW","5Drn055rfB","FFDuiix74r","Y1mC05Drn0","oGu6xHlUbF","uPX7Gn8pJ9","MezSW0Wr5y","nFqikyluBx",
+"MmKGJNAFuw","yEfy9soy9t","jtn0XVNCPd","7X3uyzz4ZU","Waim65Namm","kB5nPkB5nP","BGaQY5iGN5","GrDg7M6qcG","xciqpDcpWB","pAhR1Dz1R3",
+"uZPqgBpYhV","nnP8owDajX","s47860PktI","GrDg77fsYM","FcWrWB3qem","HP433Y1mC0","he9IA8FmFH","Vprf2zmLYD","pWiOszY1GY","FcWrWEoToP",
+"0KyfsCxVEf","TXQ0Zi3pyd","pFrrlMojnP","GrDg7ThjNn","Z4I1v7ku1p","SjskQZJTXH","EoToPSs0Zu","soy9tYOfrY","MGlTFSWfou","s93MljfREu",
+"FjHXRlViBv","aFFssi3pyd","jtn0XaDGtS","QChxstl72W","5ZaEzRACuj","XflUqAXpwE","9rlg9pT8wu","GSQwjqaofN","b29RJAgJHQ","bgJAzjS1aj",
+"0PktI0MR5X","MGlTFFwEJz","Chuy3VBjhz","xReecQClRL","zY1GYlViBv","Cfgr3okgRi","ru4UGIRh48","WPmlxNOHsz","WMiS3Gv3Fq","NOHszjeskS",
+"bgJAzfLNg8","s7MxkjiVBP","EdBKc48cHL","dhSuH2ZHdk","pAhR1uvf7A","blLA9hYBCK","oGu6x0Kyfs","okgRiZUnqt","RkQkelj07Q","RpBQmZzJHW",
+"W7cTsuvf7A","W3VFHt59lR","K20wKZuDtD","gf8rIFjHXR","D6rBylm0pD","8TxD7RzaZA","IRh48ReKEW","euZA5Ta8f6","Chuy34QMc9","KsjRKPb1pa",
+"pmeCd0YAGH","0Wr5yS77LH","2NslmuZPqg","TCgPpFVMxo","HfyNQIRh48","yluBxNAFuw","FnPFBs4786","Ss0ZuOUqFM","aFFssuLtKs","XyPZNlpF6W",
+"fFDrJCNHmv","fcwDa8U2nU","tvdkDZUnqt","aFFssd85a9","M3zXL7fsYM","cL0aEEoToP","7ku1pLewvM","DG4sTLbRTH","MmKGJWreyP","U3yw5o8Uyd",
+"Yw2oU7hyVv","AgJHQ580YD","AOgEe6AFT0","5Mg9rEoToP","t98iWjSjS3","48cHLs7Mxk","FxX9qh1zcH","EOE1ol83Ud","Uvlv4tjQxs","Ss0Zu0BmCy",
+"yvOMIuLtKs","K4GS8gf8rI","IRh48okgRi","0Kyfs2Yz7E","8xEKzprNT6","kZANmWmadA","okgRiSbRYy","lCMxy0BmCy","AOgEenFqik","2Yz7EYOfrY",
+"24ARFlH1kt","IjTwPHP433","pv0i7Mkgy8","VerEASjskQ","e6e4zVBjhz","Oz8yZRxrsm","Cfgr3WmadA","GSQwjJ2mQi","OHaBza00b5","M3zXLBpYhV",
+"QChxsLDk6f","pmeCdDLhzM","aDGtSv1Hln","FnPFBUlU3M","jS1ajtlILt","bgJAzpv0i7","ksJbylweGy","J2mQi8U2nU","kB5nPaDGtS","gtCA5U3yw5",
+"MojnP0Wr5y","d7vjM8TxD7","Yw2oUv8yFN","tAOsrPYBf4","iqv4kydG8U","Q6LixYOfrY","K20wKRkQke","azIWpe6e4z","l83UdFhtgl","BFkb8HzZT8",
+"WMiS3yofH3","Q6Lixxciqp","x3LDepvgjS","0BmCyAmdQd","Yh1hFFPfSE","9eoRcxXTI4","aDGtSRkQke","6AFT0oVQp6","iKqhrSs0Zu","Pb1paCqqaD",
+"pvgjSFxX9q","JXljWuQIcz","qaofNF6PT2","suY4xlweGy","OxWIHjfREu","pWiOsEdBKc","2NslmNo0Qb","xReechYBCK","ix74rUlU3M","zHF1qGWqqX",
+"G1RhSVprf2","55rfB9y4lw","LbRTHUl4a1","9iGoTix74r","XyPZNY1mC0","lViBvpmeCd","DcpWBwiHrZ","ReKEW5ZaEz","8cVD3AOgEe","No0QbiB08l",
+"FxX9q9iGoT","rKDLJ5IhmG","QYxC0xReec","xXTI4EoToP","NOHszUmaEv","t98iWfLNg8","U3yw5NOHsz","uvf7AydG8U","pAhR1Mkgy8","RzaZACIShG",
+"m4bxUpFrrl","RzaZAKZamH","Ul4a1mz8gx","Q6hMCWmadA","WMiS3ECMvU","rhl0Julk41","MmKGJYOfrY","HRxd8D6rBy","lViBvFPfSE","oQ87rQWxoT",
+"a00b5dpe1v","hSSvQAXpwE","KsjRKdmoS7","hUTw7HRxd8","zFgtBNOHsz","uZPqgBFkb8","FwEJzmX2GE","zqH0WRsQUq","9GXkXVjCZq","FGzgp64s8N",
+"Waim6G1RhS","zHF1qtaOXK","5iGN5zFgtB","yToGWh1zcH","8TxD7bgJAz","mz8gx8cVD3","AmdQd2TRI7","JJs5msx5Gl","kZANmbgJAz","9eoRcW7cTs",
+"F6PT2MK07Y","yofH3MezSW","aDGtSxReec","JJs5mnlaBy","vLsmShYBCK","0KyfsZUnqt","8FmFH16lHc","jtn0XVjCZq","FxX9q9GXkX","5iGN5dQ586",
+"s93MlqUJMd","EoToP55rfB","2DREsEoToP","4QMc9U3yw5","CqqaDHlUbF","lH1ktVBjhz","FPfSEChuy3","zFgtBQYxC0","Zv7z0MojnP","4dEz6hi5X7",
+"J2mQisuY4x","7fsYMFnPFB","3weIFWaWsv","JKWYRUlU3M","9iGoTZzJHW","9iGoTM6qcG","uvf7ALbRTH","Uvlv49iGoT","cL0aE7fKYU","QChxs1LB1L",
+"tuDySZuDtD","iwzGkuN6r3","5NammUlU3M","5Mg9r618Di","prNT624ARF","BFkb80PktI","s7MxkfmIK1","RBhp0KZamH","WDVWJlsQGo","m4bxUECMvU",
+"Ul4a1pv0i7","azIWp7Ow5C","0PktIOHaBz","TXQ0ZtjQxs","JRJQByluBx","wDajXs93Ml","JkzUnyvOMI","a00b5qQxHP","QClRLkZANm","LDk6fGv3Fq",
+"hUTw7TCgPp","FGzgpGv3Fq","HRxd87fKYU","djsrv4W0Tl","ydG8U7Ow5C","TXQ0ZtaOXK","ZUnqtVjCZq","MK07YuN6r3","s93Mlsx5Gl","ni2v1Pb1pa",
+"UmaEv8RCUA","Pb1paRkQke","TCgPpHfyNQ","NAFuwuAWyp","dQ5865ZaEz","RpBQmTa8f6","pAhR1EOE1o","EdBKcVIlwP","s93MlUvlv4","55rfBB3qem",
+"i3pyd5Mg9r","dpe1vzY1GY","QClRL5VZjS","G1RhSmX2GE","UmaEvvOqCE","s93MleuZA5","Dz1R3nnP8o","2DREsAIYUu","SWfouo8Uyd","iB08lbZLvS",
+"0ao3l0ao3l","ydG8UZv7z0","NOHsztAOsr","POUYSxciqp","RzaZA07n1c","7lUXZBbwgA","yvOMIv1Hln","ZuDtDyvOMI","LDk6fIjTwP","W3VFH5iGN5",
+"kZANmpAhR1","lpF6W7X3uy","RxrsmFVMxo","QnJ1SjiVBP","JkzUnU3yw5","7X3uyzqH0W","MGlTFDG4sT","IBe8kRmDcr","FwEJzVNCPd","IjTwPxciqp",
+"fcwDaNxx9V","CdyBVWMiS3","0h1b12hEEU","9iGoT7X3uy","G1RhSMGlTF","5Mg9r5iGN5","No0Qb5VZjS","618DipvgjS","EOE1o9XyT9","RzaZAJJs5m",
+"9y4lwyEfy9","i3pydpWiOs","B3qemiwzGk","qaofNVLTy6","AgJHQprNT6","580YDQbxXc","aez9yjzUqR","Ss0ZuVerEA","yofH3HlUbF","hUTw7xXTI4",
+"SWfouC2Irc","zFgtBBpYhV","Y1mC09GXkX","iqv4klsQGo","AmdQdbgJAz","tl72WWmadA","FjHXRa00b5","48cHLZzJHW","AgJHQHlUbF","F6PT2d7vjM",
+"4dEz6aDGtS","K4GS8jeskS","9eoRcHP433","45cIHYf2Ec","IBe8kUvlv4","lViBvgtCA5","8RCUARmDcr","jiVBPpAhR1","X6PinjzUqR","tjQxspv0i7",
+"IjTwPkB5nP","4QMc9pFrrl","dmoS7Yh1hF","rhl0Jd85a9","K20wKcL0aE","S2DfuM3zXL","lViBv618Di","WMiS37ku1p","RACujfaHir","JKWYRcmXIX",
+"HlUbF7hyVv","9y4lwulk41","0PktIECMvU","1j5L8W7cTs","ZuDtDECMvU","FLsphRzaZA","K4GS8AmdQd","BFkb8Ul4a1","S77LHb29RJ","Cp3mZs4786",
+"FjHXRxciqp","BbwgAWDVWJ","cShY21j5L8","RBhp0pT8wu","sqVrfRBhp0","Vprf2uQIcz","xReecQssNC","07n1cRACuj","7fKYU0ao3l","In3NSEOE1o",
+"pT8wuo8Uyd","hUTw7YjB9t","UlU3McShY2","CK5W7djsrv","Dz1R3BpYhV","n8pJ948cHL","QworuSbRYy","AOgEeQworu","suY4x5VZjS","GSQwjhUTw7",
+"guMb8VLTy6","BbwgA4W0Tl","OUqFMFxX9q","sx5GlbgJAz","4dEz6kB5nP","ix74rtuDyS","dQ5862ZHdk","tl72WgIYvE","IBe8kAIYUu","ni2v1YjB9t",
+"zz4ZUECMvU","OHaBzjfREu","blLA9SbRYy","Mkgy8GSQwj","oVQp6uLtKs","vLsmSaFFss","Z4I1v7Ow5C","uAWyp7hyVv","yofH3FnPFB","2NslmRkQke",
+"Ss0ZuChuy3","07n1cYw2oU","L7cGcFnPFB","Z4I1vWaim6","StlDJtAOsr","5iGN5WreyP","DQimp9GXkX","JKWYRMaJQs","t59lRkB5nP","aL6AJMezSW",
+"ru4UGNOHsz","hSSvQt59lR","WMiS3uZPqg","ogLgclpF6W","W3VFHyToGW","U3yw5gjUTu","DLhzMSWfou","aDGtS7ku1p","SjskQMGlTF","IBe8kzz4ZU",
+"jtn0Xsoy9t","2Nslm7ku1p","RxrsmVNCPd","29QAzMmKGJ","zHF1qwiHrZ","IRh48t59lR","OHaBzgjUTu","suY4xFFDui","NOHszv1Hln","djsrvqQxHP",
+"gf8rIMmsIo","v2eC37X3uy","v2eC3jS1aj","Rxrsm8RCUA","gIYvERBhp0","s7Mxk5Mg9r","pAhR1hSSvQ","HP4338xEKz","07n1c7fsYM","cQOnvbrhlQ",
+"piJSkBCxeC","uupzkFjHXR","oGu6xOz8yZ","lsQGohE1Ql","9XyT9jiVBP","5IhmGIRh48","FGzgpuN6r3","NAFuwQnJ1S","MojnP64s8N","oQ87rmz8gx",
+"OHaBzOxWIH","lsQGoFPfSE","DG4sTt59lR","JIqXihSSvQ","0YAGHZv7z0","lj07QQ6Lix","zHF1qhUTw7","9rlg92hEEU","ZhwG17fsYM","djsrvnnP8o",
+"uPX7GyToGW","OHaBzqUJMd","uQIczprNT6","pmeCdjSjS3","yluBx7X3uy","sx5GlMkgy8","LDk6fydG8U","YOfrYNo0Qb","FxX9qC2Irc","FcWrWFVMxo",
+"Nxx9VaL6AJ","k85AeSWfou","2ZHdkjfREu","AIYUupWiOs","pv0i77fsYM","C2Irc2Nslm","FcWrWMaJQs","K20wKtAOsr","In3NSn8pJ9","OUYuFyToGW",
+"5drc67lUXZ","Ss0Zu8RCUA","soy9tHRxd8","brhlQvkCHH","FFDuis93Ml","yEfy9iKqhr","atef2fcJOy","CxVEf5drc6","FcWrWRsQUq","5ZaEzfLNg8",
+"he9IAa00b5","m4bxUWMiS3","ECMvUAXpwE","azIWpJ2mQi","AXpwEjeskS","ThjNnmz8gx","5Mg9rC2Irc","5Mg9rgjUTu","5IhmGQ6Lix","hSSvQRACuj",
+"8U2nUvLsmS","azIWpCIShG","8RCUAyluBx","1j5L8Dz1R3","ksJbyKZamH","DQimpRpBQm","OxWIHVIlwP","fcwDaCdyBV","RsQUqx3LDe","uJScXfcJOy",
+"xReec9iGoT","AgJHQjzUqR","Yh1hF5Drn0","K4GS8uupzk","aL6AJlpF6W","fmIK17Ow5C","Gv3FqBCxeC","oGu6xMezSW","atef2I7p2a","yofH3brhlQ",
+"lH1ktLDk6f","EoToPM3zXL","rKDLJ0Wr5y","BpYhVS77LH","JKWYRNcICA","blLA9K4GS8","dQ586S77LH","5NammL7cGc","prNT6xciqp","CxVEf4dEz6",
+"DG4sT0h1b1","ZzJHWfaHir","nlaBylH1kt","yluBx9y4lw","v2eC3WmadA","tvdkDYf2Ec","B3qemrz7Ut","JkzUnFFDui","ix74r3weIF","RsQUqMm8si",
+"jtn0XMojnP","1v5hHeuZA5","fLNg8y94nw","jS1ajNOHsz","4dEz6K20wK","8U2nUY1mC0","TCgPpRACuj","yEfy9dhSuH","WreyPZzJHW","zHF1qM6qcG",
+"rKDLJ6AFT0","x3LDegf8rI","tuDyS618Di","S77LHMkgy8","kB5nPksJby","VjCZqhSSvQ","xciqpdjsrv","In3NSpWiOs","16lHcQYxC0","29QAzMm8si",
+"t98iWtAOsr","yluBxMaJQs","5drc6StlDJ","7Ow5CFVMxo","IBe8kpvgjS","GSQwjtl72W","cShY2IjTwP","FVMxoPYBf4","POUYSQworu","RpBQmuvf7A",
+"iB08lvkCHH","tl72WtuDyS","QssNCMkgy8","uJScXNxx9V","fmIK1m4bxU","cL0aENxx9V","IjTwPVjCZq","sqVrfRsQUq","hE1Qli7WMQ","FwEJz24ARF",
+"UlU3MUmaEv","8U2nUdjsrv","No0QbCqqaD","dpe1v0Wr5y","PYBf4Q6Lix","7fsYMguMb8","0BmCyZv7z0","s7MxkVLTy6","Ul4a1QClRL","7lUXZm4bxU",
+"ZhwG1b29RJ","8hJdtzbIYY","gtCA58cVD3","MmsIov2eC3","16lHca00b5","Q6LixCNHmv","WaWsvPYBf4","zFgtBtlILt","ogLgcCxVEf","K4GS83otm6",
+"uAWypCp3mZ","brhlQrKDLJ","jSjS3tlILt","FcWrWCK5W7","soy9tix74r","gf8rIzqH0W","qUJMdyluBx","JJs5mJKWYR","pAhR19y4lw","MezSWuAWyp",
+"5NammThjNn","FGzgpQnJ1S","9y4lwQssNC","AIYUuUmaEv","ix74rgdQsS","XflUqDG4sT","n1pmO2TRI7","s4786ThjNn","pAhR15drc6","gtCA50Wr5y",
+"FjHXRcL0aE","oQ87r4dEz6","hi5X7d7vjM","s93MlbrhlQ","rz7UtzQt6Q","BpYhVPYBf4","ni2v1DQimp","JXljWyofH3","uupzkfqypy","t59lRZuDtD",
+"VLTy6ZhwG1","wDajX618Di","pv0i7LewvM","aFFssJkzUn","WDVWJYw2oU","lweGy580YD","Chuy3WDVWJ","wDajXUmaEv","SmGzvGSQwj","Gv3FqkZANm",
+"Ta8f6Yw2oU","XflUqqQxHP","uPX7G0MR5X","29QAz9rlg9","U3yw5Yf2Ec","FGzgpt98iW","CqqaDuPX7G","6q6L9lkMUA","prNT68xEKz","7ku1pEOE1o",
+"fLNg8K4GS8","J2mQiCp3mZ","xciqpi3pyd","7fKYURACuj","DG4sTSbRYy","tuDySlH1kt","lsQGoWreyP","16lHcprNT6","618DiguMb8","lpF6We6e4z",
+"2TRI7suY4x","SmGzvaDGtS","piJSkJXljW","8TxD7QChxs","5iGN54W0Tl","zbIYYvOqCE","P6bcgoGu6x","pv0i7qaofN","RACujOUYuF","8FmFHlH1kt",
+"Yw2oUjfREu","zmLYDRBhp0","9GXkXtlILt","uQIczuJScX","HzZT8jeskS","J2mQiLDk6f","ciuWzOz8yZ","bZLvSTCgPp","QWxoTpvgjS","8cVD3nnP8o",
+"XflUqrKDLJ","B3qempmeCd","7lUXZjiVBP","blLA9lXFOB","3otm68xEKz","tAOsrciuWz","Mm8si8xEKz","JJs5m5iGN5","i7WMQJJs5m","PYBf4AkKTk",
+"Fhtgls93Ml","tAOsreuZA5","oGu6xqUJMd","5VZjSnnP8o","uupzkcQOnv","2hEEUl83Ud","euZA5WDVWJ","4W0TlL7cGc","HP433hi5X7","jeskSNcICA",
+"t98iWAmdQd","0ao3l7Ow5C","Cp3mZSbRYy","jfREui3pyd","MmsIoMmsIo","BCxeClpF6W","blLA98xEKz","JkzUn6AFT0","uPX7GCqqaD","RACujW7cTs",
+"vLsmSW3VFH","dQ586l83Ud","FVMxokB5nP","XyPZNZhwG1","brhlQcL0aE","RzaZAs93Ml","jeskS45cIH","Yf2EcaFFss","nnP8oe6e4z","F6PT2pAhR1",
+"Pb1pakZANm","WmadAuupzk","DLhzMv8yFN","aFFsssoy9t","s7Mxk2Nslm","AmdQdYh1hF","CdyBVd7vjM","i3pydGSQwj","aDGtSkZANm","6AFT0W3VFH",
+"9XyT98xEKz","XflUq4dEz6","BFkb8uvf7A","QWxoTIKxdL","EdBKcQbxXc","x3LDeAIYUu","hi5X7FVMxo","WMiS3he9IA","Mkgy8wDajX","lXFOBReKEW",
+"L7cGclweGy","C2IrcRxrsm","7X3uyThjNn","No0QbIn3NS","lpF6Waez9y","s4786v2eC3","MGlTFpv0i7","BGaQYTXQ0Z","tlILtS2Dfu","mX2GEQ6Lix",
+"hSSvQpmeCd","FLsphbgJAz","aL6AJfqypy","jtn0Xx3LDe","5Mg9r1LB1L","tlILt3otm6","t98iWn8pJ9","Oz8yZS2Dfu","hYBCK29QAz","YjB9tm4bxU",
+"lweGyuupzk","EoToPuPX7G","VIlwPTwano","6q6L9uZPqg","zFgtBRpBQm","5Mg9rW7cTs","RzaZAAgJHQ","AgJHQGSQwj","qUJMdoVQp6","lkMUAlViBv",
+"RBhp0HRxd8","FGzgpSs0Zu","djsrvix74r","wiHrZdjsrv","aez9y1LB1L","2NslmxXTI4","M6qcGvOqCE","Z4I1vNAFuw","lm0pDMojnP","xXTI41LB1L",
+"Oz8yZd85a9","5IhmGEdBKc","QbxXcFPfSE","5NammLbRTH","v1HlnGWqqX","2TRI7lj07Q","v1HlnVprf2","1LB1L9GXkX","8U2nU9eoRc","KZamHJIqXi",
+"iwzGk8cVD3","qUJMdIBe8k","dpe1vbZLvS","6q6L9Qworu","QWxoT7ku1p","pv0i7atef2","taOXK0BmCy","ZzJHW29QAz","taOXKaez9y","hYBCKJXljW",
+"xciqpWaWsv","JKWYR9iGoT","v2eC3AgJHQ","FVMxolm0pD","iwzGkVIlwP","AgJHQsoy9t","DQimpkZANm","YjB9tn1pmO","LewvMvOqCE","LbRTHk85Ae",
+"FxX9qG1RhS","KsjRKfmIK1","5VZjS7hyVv","ciuWzlsQGo","jfREum4bxU","KZamH14FLR","jzUqR2hEEU","RmDcrFFDui","zqH0WZUnqt","VNCPdJKWYR",
+"HfyNQ5drc6","DQimpAOgEe","v2eC3OUqFM","B3qemJIqXi","uLtKsiqv4k","NcICAi7WMQ","M3zXL7hyVv","m4bxUuZPqg","vOqCElsQGo","48cHLiqv4k",
+"fFDrJNcICA","vOqCEJ2mQi","s7MxkPb1pa","In3NSFLsph","fFDrJmz8gx","fmIK1jS1aj","lkMUAGSQwj","wDajXRkQke","zz4ZUazIWp","MGlTFQworu",
+"SjskQd7vjM","DcpWBBpYhV","azIWpmX2GE","MGlTFnnP8o","FGzgpK4GS8","uvf7ANcICA","O3iyQ9GXkX","7hyVvd85a9","J2mQi2hEEU","MojnPKASQ8",
+"4QMc90YAGH","Cfgr36AFT0","jS1ajQWxoT","O3iyQqUJMd","aez9yWaWsv","lsQGoRsQUq","ru4UGFnPFB","ThjNnMojnP","cmXIXAXpwE","lweGy2Nslm",
+"JKWYRjiVBP","jiVBPnlaBy","FFDuiwiHrZ","FVMxoFNYIM","PYBf4GXdoH","UmaEv48cHL","HzZT8Dz1R3","hYBCKWaWsv","h1zcHcQOnv","QnJ1SJKWYR",
+"aL6AJt59lR","DG4sTWDVWJ","soy9tHzZT8","IjTwP5Drn0","faHirIn3NS","QChxsd85a9","5Mg9rcShY2","LDk6fRBhp0","F6PT23otm6","m4bxUQworu",
+"WDVWJAXpwE","jeskSBCxeC","bZLvSRkQke","WDVWJmz8gx","QYxC07lUXZ","M3zXLG1RhS","IKxdLG1RhS","pWiOsW7cTs","bgJAzksJby","Yf2Ec6q6L9",
+"7Ow5CKsjRK","m4bxU9XyT9","hSSvQ6AFT0","4dEz6StlDJ","pT8wuRpBQm","Yf2EcPYBf4","ZzJHWqQxHP","RBhp0ZUnqt","2ZHdkCK5W7","qUJMdaez9y",
+"5NammcL0aE","No0QbfcJOy","618DitAOsr","4QMc98cVD3","s4786sx5Gl","Gv3FqReKEW","sx5GlaL6AJ","uLtKsTwano","zY1GYYh1hF","blLA9gdQsS",
+"Ta8f6MmKGJ","Z4I1v7hyVv","xReeckZANm","Q6LixZzJHW","pv0i7yvOMI","5nmWvhSSvQ","v1HlnkB5nP","QYxC0VBjhz","Dz1R3Yf2Ec","FxX9qUl4a1",
+"JIqXi55rfB","lweGy1LB1L","U3yw5lpF6W","XflUqZ4I1v","tl72WMaJQs","uPX7G5Drn0","24ARFs93Ml","ogLgc7fKYU","guMb8DQimp","EoToPogLgc",
+"C2IrcRBhp0","ogLgcFwEJz","G1RhSUlU3M","cmXIXEoToP","IKxdLv2eC3","MGlTFfmIK1","AgJHQhYBCK","uAWypZzJHW","aL6AJFjHXR","Kr8ysOUYuF",
+"MezSWokgRi","vkCHHbrhlQ","3otm6cQOnv","Yw2oUwiHrZ","RzaZAzmLYD","aFFssQbxXc","dmoS748cHL","fLNg8TXQ0Z","RpBQmoGu6x","QworugtCA5",
+"No0Qbhe9IA","yvOMI7Ow5C","Yw2oUydG8U","EOE1o7X3uy","l83UduQIcz","RzaZAl83Ud","zFgtB2ZHdk","FhtgllH1kt","zqH0WXflUq","In3NSjSjS3",
+"d85a9Y1mC0","5NammGv3Fq","cQOnvLDk6f","2NslmogLgc","tjQxsqUJMd","3otm68FmFH","vOqCEWaim6","4QMc92Yz7E","5Drn00BmCy","5iGN5EOE1o",
+"zbIYY4dEz6","bZLvSUvlv4","D6rByv8yFN","cL0aE0h1b1","G1RhStvdkD","NAFuwdjsrv","uTacxbgJAz","uZPqgdmoS7","d85a9WMiS3","5iGN5UlU3M",
+"iqv4kTa8f6","OUqFMulk41","5nmWvEdBKc","BGaQYs7Mxk","pv0i7m4bxU","gtCA5lkMUA","hSSvQ8TxD7","MmsIoZv7z0","TCgPpB3qem","aL6AJF6PT2",
+"jeskSuTacx","soy9tU3yw5","MK07YkB5nP","In3NS7fsYM","Ul4a1Ta8f6","taOXKZzJHW","BbwgAMK07Y","okgRizY1GY","FLsphZuDtD","0Kyfsa00b5",
+"1v5hHlCMxy","brhlQ0Wr5y","MmKGJ8cVD3","GWqqXdjsrv","fFDrJFjHXR","qUJMdReKEW","fqypy0YAGH","d85a9BGaQY","Pb1palkMUA","C2IrcQworu",
+"i7WMQW3VFH","tvdkDogLgc","8RCUAvkCHH","MK07YgdQsS","zY1GYQ6Lix","QssNCGSQwj","t98iWDG4sT","Cfgr3n8pJ9","1LB1LGv3Fq","i7WMQpvgjS",
+"hYBCK7fKYU","SmGzvd85a9","IjTwPBCxeC","wiHrZBpYhV","0Wr5ylm0pD","he9IAXyPZN","pAhR18U2nU","QnJ1S1j5L8","oVQp6YOfrY","FFDui4QMc9",
+"Mkgy87fKYU","iKqhr7hyVv","XyPZNpFrrl","EOE1o2hEEU","b29RJ8RCUA","QworuMm8si","No0QbXflUq","RmDcrYOfrY","CIShGRzaZA","gtCA5tvdkD",
+"n1pmOQ6Lix","uLtKs24ARF","nlaByzQt6Q","1v5hHaDGtS","FjHXR8FmFH","2hEEU8RCUA","ReKEWpFrrl","WDVWJ48cHL","5VZjSQbxXc","jS1ajCIShG",
+"guMb8GWqqX","rKDLJ2Yz7E","t59lRzqH0W","jfREucQOnv","FGzgps4786","WMiS3HfyNQ","yluBxguMb8","6AFT029QAz","CK5W7ru4UG","55rfBC2Irc",
+"k85Aegf8rI","VLTy6zQt6Q","LewvMaez9y","FPfSEzqH0W","GrDg7aez9y","t98iWh1zcH","VjCZqtuDyS","hi5X7LewvM","uQIczvkCHH","yluBxqaofN",
+"4dEz6RACuj","lViBvStlDJ","2Yz7ECIShG","5drc6jzUqR","M3zXLlViBv","m4bxUI7p2a","uZPqgQYxC0","BpYhVDcpWB","EoToP5VZjS","dhSuHAXpwE",
+"UmaEvguMb8","ogLgc8RCUA","FLsphpT8wu","5drc69eoRc","POUYS5drc6","uTacxt59lR","ZUnqtm4bxU","t98iWyofH3","zQt6Qm4bxU","guMb8CqqaD",
+"jfREu5iGN5","i3pydpT8wu","S77LH9iGoT","BbwgAJKWYR","C2IrctjQxs","nlaByQ6hMC","xciqpwDajX","uvf7A6q6L9","zbIYYv2eC3","VerEAFxX9q",
+"lpF6WBbwgA","M6qcGCxVEf","sx5GlCNHmv","lsQGoazIWp","5IhmGzFgtB","lsQGojtn0X","qQxHPZUnqt","pFrrlh1zcH","Y1mC0ZuDtD","tAOsrNcICA",
+"gdQsSXyPZN","O3iyQpAhR1","gf8rI618Di","RBhp0iwzGk","euZA50ao3l","MmsIo0YAGH","jzUqRtuDyS","SmGzvZJTXH","lXFOB9eoRc","yluBxjfREu",
+"Q6Lix5Namm","MmsIoxciqp","tvdkDuZPqg","RBhp0yluBx","l83Ud2ZHdk","8RCUAWMiS3","k85AeJkzUn","FxX9qCK5W7","MmKGJYw2oU","SbRYyM6qcG",
+"FxX9qOUqFM","DcpWB1LB1L","K20wKuZPqg","a00b5Ta8f6","guMb8uLtKs","fFDrJaL6AJ","VLTy6lXFOB","ReKEWb29RJ","Chuy3VNCPd","dhSuHyToGW",
+"U3yw5lXFOB","JkzUntaOXK","7fsYM0h1b1","taOXKpmeCd","uvf7A2hEEU","ZJTXHbZLvS","J2mQimX2GE","HP433Kr8ys","gIYvEMojnP","fmIK1wDajX",
+"MmKGJStlDJ","K4GS8LDk6f","zz4ZUMmsIo","45cIHJRJQB","pWiOs3weIF","TwanoJ2mQi","07n1cMezSW","CdyBVn8pJ9","8RCUA7ku1p","zY1GYlkMUA",
+"hE1QllkMUA","CdyBV580YD","zmLYDCNHmv","tlILt5nmWv","AkKTkFjHXR","hE1QlDG4sT","RxrsmWaWsv","2hEEUCfgr3","WPmlxyToGW","mz8gxIn3NS",
+"I7p2aWmadA","oVQp6uTacx","NOHsztlILt","tlILtRmDcr","BbwgAoQ87r","POUYScL0aE","ix74r9eoRc","U3yw5pAhR1","aDGtSix74r","suY4xDcpWB",
+"EoToPciuWz","yEfy9l83Ud","64s8NyvOMI","Nxx9VGXdoH","yToGWhYBCK","W7cTsoGu6x","fqypyQWxoT","U3yw5aDGtS","7ku1puLtKs","QChxss93Ml",
+"pmeCdfqypy","Yw2oUFVMxo","ydG8UuTacx","8xEKzm4bxU","DcpWBm4bxU","QssNCZzJHW","djsrvpv0i7","l83Ud4dEz6","he9IAiB08l","Zv7z0FwEJz",
+"1LB1L0MR5X","nlaBy7X3uy","SbRYyFjHXR","ix74rs93Ml","C2IrcEdBKc","VIlwPZv7z0","GrDg7tlILt","SWfouuN6r3","9iGoTpWiOs","LDk6feuZA5",
+"BbwgA24ARF","okgRiWaim6","2ZHdkBGaQY","VerEABFkb8","FLsphZhwG1","2Yz7EWPmlx","gdQsSJkzUn","ogLgcIn3NS","2hEEU6AFT0","uoStwpvgjS",
+"oGu6xsoy9t","lsQGoIjTwP","jS1ajaDGtS","vkCHHWaWsv","29QAzpiJSk","tAOsruAWyp","In3NSFxX9q","d85a9AOgEe","Q6LixwiHrZ","2hEEUD6rBy",
+"No0QbGWqqX","okgRiB3qem","Vprf2y94nw","fqypyCxVEf","JkzUnMezSW","NcICAiqv4k","lsQGolweGy","MojnP7ku1p","QYxC00PktI","7fsYMDLhzM",
+"JIqXi580YD","45cIHyEfy9","aL6AJBFkb8","U3yw5EdBKc","dpe1v9y4lw","fcwDay94nw","ZJTXHLbRTH","zQt6QAOgEe","ZhwG1ECMvU","D6rByMmKGJ",
+"NAFuwM3zXL","hE1Ql1v5hH","K4GS8tjQxs","tAOsrWDVWJ","Uvlv4Rxrsm","tvdkDOxWIH","OUqFMokgRi","guMb88xEKz","atef2EdBKc","aL6AJTa8f6",
+"t59lRJkzUn","pv0i76AFT0","2Yz7EpFrrl","MmKGJhi5X7","FcWrWaL6AJ","fFDrJ2hEEU","o8UydIjTwP","FNYIMjfREu","AgJHQS2Dfu","G1RhSYjB9t",
+"djsrvUlU3M","uN6r3AkKTk","oGu6x29QAz","zmLYDsoy9t","uAWyppvgjS","SbRYyh1zcH","uQIczhe9IA","In3NSuZPqg","29QAz7ku1p","guMb86q6L9",
+"iqv4kaDGtS","UmaEvGXdoH","0h1b1NhXdu","BpYhV7Ow5C","b29RJQworu","ZUnqtiwzGk","piJSkhe9IA","BCxeCRkQke","sx5GlRxrsm","Yf2EcVNCPd",
+"rKDLJfFDrJ","P6bcguJScX","lweGyjiVBP","IKxdLmX2GE","BCxeCh1zcH","5drc6pWiOs","t98iW2DREs","aL6AJ5Mg9r","xReecuQIcz","wiHrZlH1kt",
+"NOHszJJs5m","lH1ktOUYuF","5drc6tvdkD","b29RJG1RhS","SjskQOUYuF","JJs5mGWqqX","K4GS8RsQUq","5VZjSBGaQY","KsjRKm4bxU","ogLgcPb1pa",
+"G1RhSjiVBP","29QAzsoy9t","8xEKz6q6L9","KZamHGXdoH","l83UdFFDui","FFDuilj07Q","KsjRKaFFss","XflUqZUnqt","mX2GEb29RJ","ReKEWuoStw",
+"DcpWBAXpwE","WaWsvOUYuF","nlaByaFFss","lViBvsqVrf","Yw2oUgf8rI","lViBvjSjS3","KsjRKS2Dfu","QssNCFVMxo","mX2GEfFDrJ","MK07Y16lHc",
+"aFFssVIlwP","iB08lAkKTk","iKqhrGXdoH","jiVBP7Ow5C","pT8wuMaJQs","tvdkDx3LDe","m4bxUuTacx","NAFuwuZPqg","EOE1oF6PT2","prNT6dhSuH",
+"nFqikWMiS3","hSSvQAkKTk","Nxx9V7lUXZ","vLsmSM3zXL","HlUbFxReec","Yf2EcFnPFB","7hyVvvOqCE","l83UduoStw","C2IrciKqhr","l83Ud8FmFH",
+"9XyT9t59lR","F6PT2qUJMd","tjQxso8Uyd","C2IrcChuy3","OxWIHDz1R3","h1zcHpmeCd","8FmFH5Drn0","tAOsraDGtS","bZLvSMGlTF","VLTy6DQimp",
+"StlDJ8xEKz","C2Irculk41","0MR5X7hyVv","4dEz6ZUnqt","soy9t7X3uy","d7vjMlXFOB","1v5hH4W0Tl","zFgtBuLtKs","jzUqR5Drn0","fFDrJRBhp0",
+"yluBx29QAz","0YAGHXflUq","8FmFHlm0pD","Chuy3iKqhr","HRxd8BGaQY","uQIczlViBv","lm0pDmX2GE","SjskQGv3Fq","RzaZAP6bcg","M3zXL16lHc",
+"ulk417ku1p","TXQ0ZQWxoT","8RCUAS77LH","HzZT8azIWp","8TxD71j5L8","Vprf2x3LDe","7fsYMCqqaD","ogLgcRxrsm","AXpwEk85Ae","S77LHQYxC0",
+"cL0aEazIWp","QworuzbIYY","wiHrZaL6AJ","he9IAlCMxy","yToGW1v5hH","Yh1hFVNCPd","FhtgluZPqg","k85AeGSQwj","aFFssZUnqt","7fsYMuN6r3",
+"uLtKs7Ow5C","QworuRpBQm","FNYIMDcpWB","MGlTFkZANm","tjQxszHF1q","d85a9Ul4a1","kB5nPpv0i7","P6bcgWPmlx","ru4UGDG4sT","tlILtmz8gx",
+"OUYuFpvgjS","blLA9S77LH","zY1GYAkKTk","Vprf2yEfy9","pmeCdM3zXL","oQ87rbrhlQ","wiHrZ64s8N","jiVBPQnJ1S","cQOnvJkzUn","KsjRKHP433",
+"AgJHQFxX9q","XyPZN9GXkX","6q6L92DREs","jiVBPOUYuF","I7p2aC2Irc","CxVEf2TRI7","JKWYRSbRYy","t59lRJXljW","NOHszfcJOy","3weIFyToGW",
+"7Ow5CuLtKs","m4bxUZ4I1v","ksJbynnP8o","SjskQGWqqX","PYBf4iqv4k","9eoRcv1Hln","JJs5m5Mg9r","uJScXkB5nP","5IhmG16lHc","P6bcgmX2GE",
+"2hEEU0Wr5y","b29RJuTacx","POUYSGSQwj","uupzkQnJ1S","i3pydgjUTu","tlILt0BmCy","lsQGoMkgy8","OxWIH5IhmG","ciuWzYf2Ec","zz4ZUNhXdu",
+"Ul4a19eoRc","ZUnqtEoToP","ZUnqt8U2nU","9y4lwuupzk","StlDJCIShG","bgJAzlpF6W","2NslmM3zXL","y94nwLewvM","WreyPSs0Zu","RBhp0aDGtS",
+"d7vjMl83Ud","9y4lwiB08l","xciqpuupzk","ru4UGWMiS3","gjUTu9y4lw","zY1GYBGaQY","9y4lwLbRTH","NAFuw1j5L8","S77LH3weIF","aDGtSiqv4k",
+"b29RJlCMxy","AgJHQt59lR","Chuy3fFDrJ","29QAzPOUYS","uQIczC2Irc","qQxHPiB08l","MGlTF8FmFH","WreyPe6e4z","uTacxru4UG","aL6AJYjB9t",
+"bZLvSWaim6","KsjRKM3zXL","W7cTsMm8si","GXdoHt98iW","5Drn02ZHdk","MezSWIjTwP","IjTwPiwzGk","jS1ajKr8ys","IBe8kSbRYy","KsjRKBpYhV",
+"ZhwG12ZHdk","EOE1o7fKYU","1v5hHbZLvS","FhtglVjCZq","7lUXZUl4a1","o8UydK20wK","kB5nPK20wK","SmGzvbZLvS","dQ586SjskQ","SmGzvVBjhz",
+"ZhwG17lUXZ","sx5GluTacx","d7vjMFVMxo","sx5Gluvf7A","CK5W7jzUqR","tAOsrzY1GY","FNYIMs4786","8hJdtogLgc","W3VFHJIqXi","v8yFN9XyT9",
+"7Ow5CM3zXL","qQxHPwiHrZ","RBhp0BCxeC","FGzgpIn3NS","BbwgAlweGy","sx5GlguMb8","SjskQuAWyp","W7cTssuY4x","L7cGcJXljW","JXljWSbRYy",
+"a00b55iGN5","OHaBzX6Pin","BpYhViB08l","RmDcrqQxHP","WDVWJbZLvS","5VZjSHRxd8","KZamHEdBKc","zbIYYFxX9q","ru4UG6q6L9","yToGWI7p2a",
+"MaJQsQWxoT","K4GS89rlg9","IRh48GWqqX","FGzgpiB08l","QClRLcL0aE","hUTw7MmsIo","RmDcrJKWYR","HfyNQhYBCK","tl72W0h1b1","uN6r3HzZT8",
+"WPmlxNcICA","0Wr5yxXTI4","8hJdtFwEJz","U3yw58U2nU","jeskSIBe8k","uAWyppAhR1","2hEEU0MR5X","cShY2yEfy9","pv0i7Ss0Zu","pAhR1oGu6x",
+"QYxC0BFkb8","UmaEvQYxC0","ZzJHW4W0Tl","580YDAIYUu","2DREsKsjRK","0h1b1wDajX","FcWrWfLNg8","7lUXZKASQ8","AkKTkFhtgl","t98iWPOUYS",
+"7X3uycmXIX","HfyNQ0YAGH","MaJQsiB08l","uJScXVIlwP","azIWpzFgtB","PYBf4pFrrl","qUJMd5nmWv","XflUqgjUTu","QYxC0y94nw","uAWypkB5nP",
+"7X3uyFjHXR","NAFuw6q6L9","8FmFHuoStw","ogLgctAOsr","07n1c07n1c","qUJMdChuy3","vLsmSHfyNQ","pmeCdFLsph","uJScXVNCPd","VNCPduPX7G",
+"ciuWzBpYhV","TwanofLNg8","HRxd8BpYhV","uJScXm4bxU","e6e4zIKxdL","5Drn0y94nw","lpF6WRsQUq","cShY2ZJTXH","AmdQdnFqik","L7cGczqH0W",
+"ru4UGbZLvS","580YDDcpWB","Cp3mZgf8rI","FxX9qIKxdL","cL0aE9GXkX","dpe1vHzZT8","0PktIuN6r3","29QAz5Namm","Ul4a1pAhR1","0BmCy7ku1p",
+"tl72WzFgtB","fqypyC2Irc","VIlwPd7vjM","M3zXLKsjRK","8TxD7ix74r","jtn0XCxVEf","yEfy9lpF6W","tjQxs0ao3l","WDVWJ4dEz6","SmGzvzQt6Q",
+"6AFT0hE1Ql","fcwDagf8rI","F6PT2Mm8si","i7WMQqaofN","fcwDa5nmWv","tlILt9XyT9","FGzgp6AFT0","6q6L9HP433","16lHcZuDtD","MK07Y2TRI7",
+"GSQwjyvOMI","kB5nPjfREu","JJs5mVBjhz","lXFOBG1RhS","nlaByni2v1","xciqpJKWYR","5Drn0LbRTH","MezSWwDajX","wiHrZWaim6","lj07QMmKGJ",
+"GSQwjAkKTk","ZJTXHQClRL","zbIYYMmsIo","Cfgr35Drn0","ru4UGOUYuF","8cVD3cShY2","uPX7GhUTw7","IjTwPNAFuw","n8pJ9d7vjM","NOHszjSjS3",
+"14FLRNcICA","dhSuHGXdoH","RkQkePb1pa","rKDLJjfREu","M6qcGpiJSk","AkKTkuQIcz","pAhR1fqypy","dhSuHnFqik","L7cGcbgJAz","Dz1R3Cfgr3",
+"Ta8f6uvf7A","uPX7GciuWz","ulk41uoStw","sx5GlFGzgp","8xEKzv2eC3","azIWpZJTXH","ThjNnuZPqg","iKqhrStlDJ","5IhmG7fsYM","iKqhrblLA9",
+"0ao3lBFkb8","s47860YAGH","uPX7GVBjhz","e6e4zwDajX","OHaBzDG4sT","tjQxsNOHsz","lm0pD2Yz7E","In3NSS2Dfu","AkKTkLDk6f","0h1b1iB08l",
+"IKxdLYh1hF","NOHszCfgr3","29QAzSbRYy","i7WMQ9GXkX","HRxd8KASQ8","prNT6SjskQ","0PktItaOXK","QssNCB3qem","9y4lwKsjRK","bZLvS8U2nU",
+"Z4I1vix74r","vkCHHJ2mQi","tvdkDMaJQs","ZuDtDL7cGc","vLsmSyofH3","Yf2Ec0h1b1","AgJHQQYxC0","W3VFHgdQsS","ECMvU1LB1L","prNT6euZA5",
+"qQxHP9eoRc","WDVWJsqVrf","8hJdtNOHsz","5iGN5Ss0Zu","5drc6BFkb8","FjHXRjeskS","QWxoTChuy3","5Drn0i7WMQ","L7cGcksJby","5Mg9rguMb8",
+"JKWYRzqH0W","yToGWSbRYy","FNYIMS77LH","1v5hHYjB9t","PYBf464s8N","i7WMQChuy3","lweGyWreyP","POUYS2TRI7","AgJHQSWfou","AXpwEsoy9t",
+"U3yw5Uvlv4","TCgPpbgJAz","xXTI49XyT9","mX2GE8RCUA","X6PinWreyP","MGlTFJ2mQi","gjUTuNo0Qb","lH1ktDG4sT","8U2nUReKEW","VerEAuPX7G",
+"W7cTsK4GS8","iKqhrVBjhz","cmXIXMK07Y","gjUTub29RJ","DcpWBPYBf4","X6PinjfREu","jeskSjiVBP","QworutvdkD","WaWsv580YD","VNCPdAgJHQ",
+"jzUqRn8pJ9","9eoRcSWfou","VjCZqjzUqR","kB5nPzHF1q","5Mg9r8hJdt","45cIHXyPZN","zz4ZUY1mC0","FNYIMRACuj","EOE1ohi5X7","BCxeCKsjRK",
+"64s8N0ao3l","3otm6CxVEf","FNYIMaFFss","9y4lwPOUYS","uJScX2hEEU","uoStwS2Dfu","3weIFuPX7G","guMb8AmdQd","Chuy3jiVBP","0h1b1QYxC0",
+"QYxC0MmKGJ","FjHXRECMvU","Kr8ysVBjhz","lpF6WzmLYD","ulk41NcICA","lj07Qn1pmO","e6e4zJRJQB","AmdQdlH1kt","hYBCKFnPFB","mX2GEQnJ1S",
+"a00b5PYBf4","n1pmOdpe1v","CIShGMkgy8","1v5hHkZANm","v2eC3Qworu","dpe1vChuy3","QbxXcyvOMI","8FmFHe6e4z","Kr8ysFhtgl","RACuj0PktI",
+"P6bcgCp3mZ","uLtKs8xEKz","dhSuHMK07Y","PYBf4guMb8","9y4lwF6PT2","9GXkXpAhR1","XyPZNoGu6x","HlUbFix74r","gf8rIIKxdL","CxVEfF6PT2",
+"zbIYY2TRI7","IBe8kpAhR1","fcJOyfqypy","Dz1R3i3pyd","XyPZNfaHir","fFDrJv8yFN","580YDCK5W7","Kr8ysMK07Y","Q6hMC9GXkX","lH1ktcL0aE",
+"AIYUuEoToP","CIShGokgRi","h1zcHoQ87r","GWqqXhe9IA","5IhmGKr8ys","FFDui9eoRc","64s8NZv7z0","rhl0JAOgEe","jfREuQssNC","pWiOsSjskQ",
+"y94nwIBe8k","2ZHdkW3VFH","AOgEeYOfrY","XflUqEoToP","t59lR64s8N","4W0TlsqVrf","5ZaEzpiJSk","MezSWpv0i7","YOfrY9rlg9","IBe8ksqVrf",
+"RsQUq4W0Tl","JRJQBpT8wu","X6Pindpe1v","DcpWBcL0aE","RBhp0guMb8","IjTwPn8pJ9","5iGN5I7p2a","wiHrZdhSuH","Chuy3yEfy9","8U2nU29QAz",
+"o8Uyd7fsYM","NhXdutjQxs","MmsIolj07Q","7Ow5CJkzUn","djsrvFLsph","WPmlxAOgEe","hi5X7qQxHP","Dz1R35Mg9r","s7MxkGXdoH","lweGyCNHmv",
+"AmdQdZuDtD","RpBQmpvgjS","ZzJHWWaWsv","5drc6Cfgr3","Mm8siBCxeC","0h1b1XflUq","FxX9qNo0Qb","FwEJzjzUqR","2Yz7EGSQwj","sx5GlRpBQm",
+"jS1ajdmoS7","lkMUAOUYuF","faHirO3iyQ","QssNCdpe1v","nlaBy5Mg9r","VerEAzbIYY","FPfSEuvf7A","OUqFM7lUXZ","ru4UGx3LDe","bgJAzs7Mxk",
+"WDVWJlkMUA","07n1cSs0Zu","vkCHH7ku1p","5Drn0he9IA","64s8NI7p2a","n8pJ9Zv7z0","NhXduLbRTH","jfREu2Yz7E","QWxoTuJScX","pvgjSni2v1",
+"nnP8oMaJQs","k85AeFVMxo","CxVEfZJTXH","ulk41UlU3M","jtn0XDcpWB","gjUTuBCxeC","VIlwPsx5Gl","0PktIhYBCK","s7MxkTXQ0Z","BpYhV9GXkX",
+"NhXduYf2Ec","cQOnv1j5L8","pWiOsU3yw5","P6bcguAWyp","NOHszDQimp","5VZjS8U2nU","DG4sTtlILt","i7WMQQbxXc","24ARFfcwDa","ulk417X3uy",
+"aez9yfqypy","n8pJ9OxWIH","cShY2GWqqX","5ZaEzt59lR","48cHLFFDui","RsQUqZ4I1v","Ss0ZuZzJHW","BCxeCjfREu","yToGWoVQp6","5NammoGu6x",
+"No0QbSs0Zu","MezSWD6rBy","e6e4zlH1kt","NhXduSWfou","M3zXLWDVWJ","azIWpn8pJ9","8TxD7gIYvE","SbRYyCIShG","FVMxoW7cTs","gIYvEhUTw7",
+"MmKGJuN6r3","Qworuulk41","QworuoGu6x","29QAzUvlv4","4QMc9Mkgy8","G1RhSazIWp","m4bxUgIYvE","pT8wuIBe8k","HRxd8L7cGc","EOE1oNAFuw",
+"S2DfuzmLYD","Oz8yZsx5Gl","uupzkHzZT8","LewvMY1mC0","Kr8ystl72W","5ZaEzqQxHP","azIWp580YD","F6PT2O3iyQ","zqH0WB3qem","h1zcH45cIH",
+"IRh48FPfSE","5Drn0iwzGk","Y1mC0Yw2oU","fqypyWreyP","qUJMd8TxD7","EoToPjeskS","4W0Tl5iGN5","Qworu5Mg9r","Q6hMC6AFT0","lweGy0BmCy",
+"QnJ1SyvOMI","kB5nPJ2mQi","HlUbFHzZT8","nlaByUvlv4","piJSkuN6r3","BbwgA48cHL","O3iyQiwzGk","J2mQi8cVD3","uPX7GCK5W7","O3iyQP6bcg",
+"pT8wuUvlv4","Q6hMCHRxd8","v2eC3okgRi","0YAGH5VZjS","suY4xAgJHQ","0BmCyuJScX","qaofN2DREs","1LB1LFVMxo","MojnP2Yz7E","QworutlILt",
+"CIShGYw2oU","GWqqXQ6hMC","RpBQmG1RhS","IjTwP5VZjS","Ta8f6nFqik","W7cTs24ARF","pmeCdMmsIo","HRxd8QWxoT","BbwgAECMvU","rhl0J2hEEU",
+"ulk41Pb1pa","24ARFAmdQd","SWfou9iGoT","FGzgp0BmCy","VIlwPRmDcr","MmKGJCqqaD","yToGWvkCHH","i7WMQaDGtS","lpF6WuoStw","oGu6x5Drn0",
+"5nmWvHfyNQ","QworuVerEA","mX2GEpAhR1","lm0pDReKEW","rz7UtTCgPp","16lHcJJs5m","NAFuw55rfB","fcwDaMGlTF","VjCZqVprf2","xciqpWPmlx",
+"lj07QaDGtS","XyPZNRmDcr","OUYuFzY1GY","x3LDeHP433","QYxC0HRxd8","nlaBypmeCd","bgJAzdjsrv","4dEz6FxX9q","xReecJKWYR","G1RhSCNHmv",
+"9iGoTYf2Ec","Gv3Fq6AFT0","oGu6xuLtKs","FNYIMxciqp","rz7UtFnPFB","RxrsmhSSvQ","8RCUA580YD","IjTwP6q6L9","9iGoTlsQGo","v2eC31v5hH",
+"gf8rIHP433","WPmlxOz8yZ","mz8gx64s8N","2Nslm4W0Tl","VBjhzHzZT8","AXpwEVerEA","ciuWzThjNn","QssNCCdyBV","uTacxDLhzM","oQ87r24ARF",
+"7X3uyFwEJz","SmGzvSWfou","2hEEU9GXkX","MmsIoFhtgl","fmIK1yofH3","cmXIXfLNg8","pFrrlGv3Fq","4W0TlCIShG","tAOsrWMiS3","x3LDeDz1R3",
+"FNYIM8FmFH","Z4I1vSbRYy","K4GS824ARF","soy9tKsjRK","SbRYyRmDcr","1j5L89GXkX","gf8rIQ6Lix","rz7UtChuy3","e6e4znlaBy","P6bcgeuZA5",
+"fqypyk85Ae","ksJby8hJdt","PYBf4jeskS","tvdkDUvlv4","uvf7AguMb8","0BmCyuN6r3","K20wK4dEz6","tvdkDuAWyp","CxVEfaDGtS","No0QbhYBCK",
+"oGu6xn8pJ9","K20wKHfyNQ","hi5X7MojnP","580YDlpF6W","hYBCKAXpwE","SWfoukZANm","lCMxygIYvE","iqv4klXFOB","16lHcd7vjM","mz8gxGv3Fq",
+"fFDrJQ6Lix","VIlwPFwEJz","2hEEU9rlg9","kB5nP55rfB","pT8wuK4GS8","vOqCEWmadA","gjUTuzmLYD","QChxsprNT6","1j5L8JJs5m","MK07YUvlv4",
+"ECMvURxrsm","45cIHoVQp6","i3pydzY1GY","K4GS807n1c","uPX7G5drc6","ru4UGgjUTu","5iGN5cL0aE","Ss0Zu0YAGH","qQxHPQ6Lix","7fKYUU3yw5",
+"mX2GEnFqik","0KyfsgdQsS","hUTw7Nxx9V","iqv4kZv7z0","jSjS3GWqqX","faHirk85Ae","oVQp6gjUTu","618DidQ586","oGu6x7hyVv","6q6L9fmIK1",
+"GSQwjNAFuw","SjskQtl72W","lkMUAFnPFB","jiVBPzQt6Q","9rlg9ni2v1","Q6hMCmX2GE","atef2FVMxo","7fKYU6AFT0","0KyfsokgRi","RACujzQt6Q",
+"Mkgy8gdQsS","BGaQYO3iyQ","YjB9tuPX7G","ZhwG148cHL","7hyVvZzJHW","ogLgczmLYD","wDajXQ6Lix","NOHszWDVWJ","G1RhSMm8si","oGu6x1v5hH",
+"9GXkXyvOMI","dhSuHQYxC0","YjB9thi5X7","dpe1vNAFuw","OHaBzlsQGo","dQ586HfyNQ","5Mg9rJKWYR","s93MljzUqR","lweGyciuWz","9GXkXOxWIH",
+"e6e4z0BmCy","Ul4a17fKYU","14FLRCNHmv","DLhzMt98iW","8RCUAJKWYR","CqqaD2Yz7E","AOgEecQOnv","LewvMCIShG","D6rByIBe8k","zQt6QRzaZA",
+"d7vjMTCgPp","TCgPpfLNg8","yluBxdjsrv","AgJHQjeskS","PYBf4d85a9","CqqaD580YD","FcWrW64s8N","M3zXLQYxC0","jS1ajS2Dfu","kB5nPIKxdL",
+"07n1cZhwG1","s7Mxk2Yz7E","Yh1hFuoStw","U3yw5580YD","FLsphQChxs","O3iyQLewvM","D6rByQ6Lix","Uvlv4jeskS","Ta8f6Zv7z0","tuDySfcJOy",
+"POUYSS77LH","uPX7GiwzGk","KZamHQnJ1S","tl72WhYBCK","RmDcrZuDtD","FGzgpReKEW","QworupWiOs","fqypyY1mC0","0YAGH3weIF","djsrvIn3NS",
+"QChxsiKqhr","azIWpfqypy","K20wK580YD","nnP8oUl4a1","ciuWzzQt6Q","GrDg7bgJAz","0h1b1zmLYD","qaofNyofH3","QYxC0lCMxy","9eoRcaFFss",
+"0Wr5y9GXkX","pvgjSdmoS7","gtCA56q6L9","iqv4kkZANm","7Ow5CbrhlQ","Oz8yZ5drc6","qaofNnFqik","MGlTFS2Dfu","7fsYMEdBKc","tjQxsuAWyp",
+"29QAzHlUbF","vLsmSJkzUn","rhl0JVprf2","OxWIHSs0Zu","pWiOsQbxXc","NAFuw0BmCy","lXFOBZ4I1v","RBhp07Ow5C","UlU3Mxciqp","W3VFHmX2GE",
+"pWiOsP6bcg","2Yz7EhE1Ql","VIlwPfaHir","8U2nUtl72W","GWqqXuQIcz","rz7Ut64s8N","v8yFNYOfrY","iKqhr4QMc9","pAhR1VBjhz","YOfrYlweGy",
+"iqv4kJIqXi","1j5L8JKWYR","8RCUAoVQp6","atef2v2eC3","B3qemMm8si","P6bcguoStw","guMb8hYBCK","WaWsvAkKTk","Mkgy8jtn0X","Cp3mZVerEA",
+"FPfSEZuDtD","FGzgpZuDtD","zz4ZUAXpwE","Pb1paOUYuF","n1pmOgf8rI","1LB1LCK5W7","lkMUACxVEf","29QAzfFDrJ","0BmCyLDk6f","dhSuHZzJHW",
+"Waim6MK07Y","zHF1qlViBv","6q6L9tAOsr","WPmlxhe9IA","WreyPzmLYD","Dz1R3sx5Gl","AkKTkqUJMd","Oz8yZ7hyVv","JIqXiatef2","Yw2oUCdyBV",
+"pvgjSCIShG","FxX9qMaJQs","cL0aELDk6f","vOqCEKr8ys","Gv3FqTwano","v1HlniwzGk","fcJOyXflUq","he9IAdhSuH","BFkb8h1zcH","9rlg9v2eC3",
+"uQIcz0PktI","tlILtTXQ0Z","nlaByFNYIM","CqqaD07n1c","FjHXRuQIcz","uQIczBCxeC","8TxD7S2Dfu","AIYUua00b5","W7cTsY1mC0","LDk6fnlaBy",
+"RmDcrn1pmO","SWfouK4GS8","K20wKiwzGk","Yf2EcHlUbF","sqVrfW7cTs","pT8wumz8gx","F6PT2BFkb8","aL6AJIBe8k","bZLvSpv0i7","v1HlnQbxXc",
+"FGzgpuAWyp","YOfrYtaOXK","14FLRuoStw","qUJMdtlILt","1LB1LVjCZq","prNT67fKYU","5IhmGVNCPd","pFrrlMGlTF","kZANmPOUYS","MojnPUlU3M",
+"StlDJ5iGN5","pvgjSfcwDa","Gv3FqWDVWJ","SWfougIYvE","dQ586uupzk","soy9tCfgr3","BbwgAhYBCK","rz7Ut0YAGH","ulk415drc6","CNHmvFwEJz",
+"45cIHFnPFB","ulk41BGaQY","guMb8X6Pin","v8yFNFVMxo","v1HlnZuDtD","RACujpT8wu","SWfouYh1hF","D6rByWDVWJ","FFDuihUTw7","jzUqR8FmFH",
+"SjskQQ6hMC","x3LDexXTI4","e6e4z1j5L8","Chuy37X3uy","yvOMIiqv4k","ni2v1NAFuw","GrDg7UlU3M","KASQ82Yz7E","RpBQm9rlg9","lViBvSs0Zu",
+"Ta8f6h1zcH","ksJby2Nslm","mz8gxRBhp0","MmKGJaL6AJ","gjUTuqQxHP","uTacx2ZHdk","pv0i71j5L8","euZA5Ss0Zu","Dz1R3TXQ0Z","OxWIHtvdkD",
+"QssNCpvgjS","jS1ajMkgy8","VIlwPdmoS7","jeskSgIYvE","0h1b1taOXK","Mm8si9rlg9","IKxdL4QMc9","cmXIXUmaEv","kZANmUlU3M","pFrrl07n1c",
+"OUYuFgf8rI","jiVBPpFrrl","5iGN50h1b1","0PktI8hJdt","t98iW16lHc","lpF6WpFrrl","taOXKNo0Qb","xciqp5Namm","Yh1hF2hEEU","Q6hMCzbIYY",
+"uTacxBCxeC","pFrrlUvlv4","VLTy6vLsmS","9eoRciwzGk","qUJMduPX7G","5drc69GXkX","zY1GYsuY4x","BFkb8Pb1pa","rhl0JQnJ1S","5iGN5JRJQB",
+"fqypyRxrsm","VNCPd24ARF","CdyBVYOfrY","FGzgpsx5Gl","pAhR1JIqXi","0ao3lCIShG","WreyPlXFOB","2DREsv8yFN","U3yw5mX2GE","WmadAxXTI4",
+"VNCPdEdBKc","oVQp6Uvlv4","5nmWvxReec","C2Irck85Ae","Waim6yluBx","vOqCEMkgy8","rz7UtBFkb8","hYBCKblLA9","RBhp0SWfou","uupzkAXpwE",
+"0Wr5y64s8N","5drc64W0Tl","kZANm24ARF","FxX9qdQ586","5Mg9ra00b5","t98iW618Di","QbxXcjS1aj","s4786tvdkD","UlU3MzQt6Q","oVQp6fmIK1",
+"GrDg7uLtKs","iqv4kFNYIM","2ZHdkTa8f6","sqVrfYOfrY","8U2nUU3yw5","sx5GlIn3NS","s7MxkUmaEv","bgJAzhYBCK","oQ87rKr8ys","CqqaD7lUXZ",
+"BGaQYguMb8","Mkgy8LbRTH","v2eC3CdyBV","tjQxsi3pyd","jtn0XtjQxs","5Namm64s8N","aL6AJGv3Fq","ciuWzAOgEe","2Nslms7Mxk","WreyPdmoS7",
+"HP433S2Dfu","3otm6uAWyp","618Disoy9t","FVMxoS2Dfu","CK5W77hyVv","m4bxUNOHsz","P6bcgS77LH","Gv3FqStlDJ","mX2GE3weIF","pWiOsEoToP",
+"zqH0Wgf8rI","vkCHHdQ586","i7WMQpWiOs","YjB9t580YD","lpF6W3otm6","QWxoTuAWyp","NAFuwwiHrZ","jiVBPrKDLJ","Uvlv4AgJHQ","v1HlnGrDg7",
+"ZhwG1jfREu","tAOsrStlDJ","fFDrJatef2","zY1GYlm0pD","BFkb8lCMxy","8xEKzQ6Lix","SWfoutvdkD","RxrsmuQIcz","Waim6uN6r3","QChxsW3VFH",
+"9eoRcYjB9t","brhlQ4dEz6","AOgEeyvOMI","WaWsvMaJQs","B3qemDcpWB","QbxXcqaofN","yToGWkZANm","NhXdud85a9","Ta8f69iGoT","9XyT9o8Uyd",
+"I7p2alkMUA","SbRYy2hEEU","7ku1pI7p2a","pT8wuY1mC0","MezSWMmKGJ","xciqpAOgEe","YjB9tM3zXL","i3pydWDVWJ","7Ow5CDz1R3","ru4UGRBhp0",
+"2TRI7tl72W","Yf2Ecfqypy","24ARFdhSuH","lpF6WTwano","U3yw5oQ87r","zbIYYK20wK","LDk6fAgJHQ","prNT6RBhp0","G1RhSuupzk","5drc6OUYuF",
+"Ss0ZuECMvU","DLhzMcL0aE","5drc6Dz1R3","VBjhzJXljW","B3qemKZamH","piJSkhYBCK","29QAzZuDtD","RkQkedpe1v","55rfB0MR5X","DcpWBlkMUA",
+"jSjS3dhSuH","gIYvEuZPqg","7X3uyRBhp0","x3LDeAXpwE","48cHLRzaZA","s93MlprNT6","FjHXR16lHc","tAOsrM3zXL","AmdQdyToGW","hSSvQrKDLJ",
+"2Yz7E2Yz7E","1LB1LjS1aj","uLtKsKr8ys","uN6r3FxX9q","VjCZq8cVD3","gjUTuulk41","I7p2aCdyBV","fmIK1brhlQ","NcICAsuY4x","jfREutaOXK",
+"iKqhrlCMxy","CqqaDOUYuF","5ZaEzX6Pin","FVMxoChuy3","8FmFHP6bcg","pvgjSCqqaD","ydG8Udjsrv","CqqaDzqH0W","yEfy9a00b5","Kr8ys5Drn0",
+"RBhp0ksJby","jSjS3okgRi","MezSWUmaEv","lViBvIRh48","AIYUu8RCUA","UlU3MAmdQd","NcICAZzJHW","U3yw5FNYIM","64s8NVerEA","iwzGkEdBKc",
+"Ss0Zuru4UG","FLsphCdyBV","JIqXiQnJ1S","EOE1ofLNg8","3weIF0MR5X","gdQsSpv0i7","Mkgy8FcWrW","hYBCKFVMxo","MGlTF5IhmG","t59lRgf8rI",
+"VBjhzuZPqg","Waim607n1c","yEfy9uJScX","lm0pDydG8U","wDajXEoToP","e6e4zXflUq","faHirazIWp","qaofNpvgjS","VjCZq7lUXZ","SjskQ8U2nU",
+"v8yFNv8yFN","qaofN8xEKz","WPmlxiwzGk","OUYuF5nmWv","LDk6fv1Hln","uN6r3RzaZA","AkKTkC2Irc","55rfBzY1GY","RmDcrnFqik","M3zXLbrhlQ",
+"jzUqR2ZHdk","9XyT9CqqaD","lkMUAzqH0W","t98iWG1RhS","lViBvuPX7G","cQOnvbgJAz","5iGN5iqv4k","aFFssFcWrW","zFgtByEfy9","9rlg9hUTw7",
+"pAhR1Rxrsm","Dz1R3sqVrf","RzaZAFFDui","EOE1oQbxXc","aDGtSVBjhz","pFrrlfFDrJ","NhXduIBe8k","P6bcgdjsrv","2hEEU4W0Tl","pT8wupiJSk",
+"Uvlv4xXTI4","IRh48CIShG","WMiS3FLsph","iB08lbgJAz","KsjRKOUqFM","CK5W7ZUnqt","AXpwEWMiS3","Cp3mZhUTw7","fLNg8cmXIX","vOqCEru4UG",
+"gjUTufFDrJ","n1pmOQbxXc","5IhmGzqH0W","uN6r3PYBf4","nlaByuPX7G","AgJHQVjCZq","FNYIMIKxdL","hUTw7LDk6f","ReKEWix74r","s93MlHlUbF",
+"ZJTXH7Ow5C","G1RhS5VZjS","fcwDaNo0Qb","okgRit98iW","7fKYUTwano","jiVBPTwano","0PktIQ6hMC","FnPFBZUnqt","618Di9y4lw","0Wr5yRpBQm",
+"2DREszmLYD","cL0aElXFOB","DQimp2Yz7E","RsQUqlH1kt","xciqpgtCA5","RzaZAK4GS8","W3VFHEdBKc","2DREs2hEEU","o8UydtAOsr","29QAzuTacx",
+"QssNCaez9y","1v5hHQWxoT","sqVrfblLA9","fmIK1JkzUn","ksJby5ZaEz","BGaQYQssNC","JXljWfqypy","0ao3l6q6L9","4dEz6FcWrW","brhlQ7fsYM",
+"CIShGZJTXH","ix74rOHaBz","tl72Wx3LDe","5Mg9r9iGoT","pT8wuxciqp","O3iyQ07n1c","BFkb8lweGy","lweGyqaofN","ZhwG1Y1mC0","FFDuiPb1pa",
+"0ao3lLbRTH","v2eC33weIF","h1zcH29QAz","C2IrcFjHXR","5iGN5zY1GY","AXpwEsuY4x","brhlQBbwgA","VNCPdgIYvE","HRxd8b29RJ","5iGN55Namm",
+"NOHsziwzGk","jfREun1pmO","S77LH7fKYU","gf8rI7X3uy","zz4ZUHlUbF","5Drn0cL0aE","cL0aEdmoS7","oVQp6xXTI4","MmKGJjtn0X","y94nwlweGy",
+"xReecRkQke","8TxD7Twano","W7cTsxXTI4","HRxd8StlDJ","5IhmGprNT6","0BmCyCfgr3","WmadAprNT6","jiVBPFVMxo","StlDJChuy3","AkKTkIKxdL",
+"uLtKsAIYUu","iB08lni2v1","xXTI4CIShG","O3iyQBFkb8","v1Hln8cVD3","zQt6Qs93Ml","NcICA0h1b1","v8yFNjSjS3","7hyVvFVMxo","8hJdt580YD",
+"n1pmOIRh48","tlILtmX2GE","IBe8kNAFuw","xXTI4uQIcz","AXpwEChuy3","9rlg9nFqik","lsQGo9eoRc","FjHXRFxX9q","vOqCEh1zcH","2Nslmiqv4k",
+"GXdoH9rlg9","b29RJCIShG","MmsIoo8Uyd","StlDJi7WMQ","LDk6fTa8f6","FNYIM14FLR","piJSkdjsrv","gIYvEUlU3M","29QAzyvOMI","1LB1Lh1zcH",
+"ksJbyru4UG","t59lRUmaEv","SbRYypiJSk","2Nslm580YD","29QAz580YD","iqv4kfqypy","ciuWzuPX7G","24ARFTa8f6","tAOsrLbRTH","b29RJjtn0X",
+"OHaBz9GXkX","uQIczK4GS8","DQimpP6bcg","AmdQdVprf2","ciuWzlj07Q","Mm8si9eoRc","v2eC3NcICA","pmeCdPOUYS","uZPqgrKDLJ","14FLR7hyVv",
+"cShY2suY4x","0h1b1jeskS","lpF6WM6qcG","wDajXx3LDe","ix74rHzZT8","lXFOBv1Hln","ix74rOUYuF","AIYUu1LB1L","Ta8f6Cp3mZ","Q6LixtAOsr",
+"G1RhS1LB1L","QbxXcM6qcG","zqH0WBGaQY","VBjhzcQOnv","AIYUuQssNC","5drc6GXdoH","K4GS8Qworu","zFgtBVIlwP","WPmlxru4UG","fcwDa3weIF",
+"kZANm9y4lw","S77LHlpF6W","SbRYykZANm","iKqhroVQp6","tjQxsvLsmS","Ta8f6WMiS3","aDGtSfmIK1","VIlwPFVMxo","5VZjSFNYIM","suY4xs7Mxk",
+"lpF6W618Di","2DREsuZPqg","8hJdtm4bxU","lweGy0MR5X","OUYuFzFgtB","s7MxkuoStw","5Drn05VZjS","n1pmOM3zXL","gjUTuZzJHW","qUJMdlm0pD",
+"WMiS30BmCy","Y1mC007n1c","DLhzM55rfB","lsQGo5Drn0","MmKGJlweGy","SjskQFxX9q","HlUbFWPmlx","WaWsvFPfSE","gf8rIF6PT2","cL0aEydG8U",
+"Pb1pa618Di","lm0pDxciqp","8TxD7aL6AJ","0YAGHYOfrY","blLA9Ul4a1","PYBf4fcJOy","OxWIHYw2oU","ZJTXHFcWrW","DLhzMhe9IA","WPmlxJKWYR",
+"Chuy3qQxHP","lpF6WCxVEf","uJScXFcWrW","48cHLoVQp6","K4GS8FcWrW","16lHcnnP8o","DG4sT1LB1L","uN6r3zqH0W","AOgEeuTacx","fcJOyWPmlx",
+"lweGyn1pmO","Yw2oUU3yw5","KsjRKVNCPd","uN6r3hE1Ql","FxX9qciuWz","v1HlnNAFuw","ReKEWogLgc","J2mQiWPmlx","SmGzvfcwDa","4W0TlyluBx",
+"lViBvBCxeC","mz8gxFVMxo","55rfBtaOXK","RACujMkgy8","gdQsSWPmlx","4W0TlguMb8","IjTwPsqVrf","azIWpYjB9t","Q6hMCblLA9","HfyNQ2TRI7",
+"RsQUqBFkb8","JIqXiNcICA","fmIK1FNYIM","euZA5IKxdL","wDajXXyPZN","jSjS3RACuj","7X3uyd85a9","CqqaDFNYIM","Q6LixtaOXK","MojnPBFkb8",
+"24ARFQnJ1S","MmsIosqVrf","Z4I1vJ2mQi","n8pJ9O3iyQ","JkzUnlkMUA","euZA56q6L9","580YDZhwG1","uAWypdjsrv","lm0pDaL6AJ","9GXkXRBhp0",
+"aez9y55rfB","WMiS3pFrrl","QbxXc9GXkX","qaofNFFDui","LewvMuvf7A","azIWpY1mC0","jiVBPGXdoH","SmGzv0h1b1","xReecXflUq","yluBx07n1c",
+"gIYvEv2eC3","2ZHdkFjHXR","qaofNlsQGo","M3zXLkB5nP","uupzkTwano","hUTw7jfREu","zQt6QbgJAz","0BmCylm0pD","jSjS3aDGtS","MK07YAOgEe",
+"taOXKGv3Fq","JRJQBVNCPd","M3zXLvkCHH","EoToPGv3Fq","OUYuFMK07Y","hSSvQM6qcG","i7WMQQnJ1S","AOgEet59lR","v1Hln4dEz6","jSjS355rfB",
+"QWxoTv2eC3","lsQGouAWyp","FPfSEv8yFN","No0QbPOUYS","NAFuwIn3NS","n1pmOjeskS","tlILtuPX7G","MK07Y618Di","d85a9K20wK","lXFOBChuy3",
+"P6bcgAmdQd","0h1b1GXdoH","JRJQBjtn0X","No0QbzQt6Q","Yw2oU5Drn0","k85AeyvOMI","FGzgprKDLJ","tvdkDC2Irc","hi5X7QWxoT","RpBQmOz8yZ",
+"dmoS7K4GS8","hE1Qly94nw","qQxHPwDajX","64s8NThjNn","ZUnqtDcpWB","OUYuFIBe8k","gdQsS8xEKz","tAOsrAgJHQ","uPX7G5Mg9r","kZANmQnJ1S",
+"GWqqXo8Uyd","U3yw5TCgPp","ReKEWVerEA","okgRiNo0Qb","FNYIMaez9y","cmXIXDz1R3","XyPZNaL6AJ","RkQkeCqqaD","TXQ0ZDQimp","Nxx9V6AFT0",
+"AmdQd4dEz6","FPfSEPOUYS","Mm8si14FLR","FFDuiAOgEe","zQt6QNOHsz","Nxx9VAOgEe","azIWpWmadA","uTacxMkgy8","uvf7AyofH3","xReecZ4I1v",
+"OUYuF5VZjS","Q6LixVNCPd","lm0pDgdQsS","iKqhrEdBKc","IBe8khSSvQ","2NslmTCgPp","brhlQnnP8o","aDGtS8cVD3","7hyVvFxX9q","e6e4zWmadA",
+"lkMUAJRJQB","7fKYUfmIK1","jtn0XLDk6f","guMb8Nxx9V","FNYIMCfgr3","wiHrZ5ZaEz","1j5L8pFrrl","HlUbFGrDg7","QbxXc2Yz7E","fcwDalm0pD",
+"DQimpZuDtD","rz7UtJJs5m","piJSkv2eC3","okgRiGWqqX","qQxHPi3pyd","v2eC3618Di","gf8rI9iGoT","QWxoTMmsIo","AIYUucShY2","jfREu9rlg9",
+"OUqFMhSSvQ","UlU3M9GXkX","zQt6Q1LB1L","jeskSgf8rI","lH1kt2hEEU","uPX7GaL6AJ","yluBx55rfB","hE1QliB08l","2ZHdkGXdoH","SbRYy8hJdt",
+"VjCZqzHF1q","2ZHdkM6qcG","TwanorKDLJ","OUYuFBGaQY","CNHmv0Kyfs","oGu6xyluBx","AmdQdBFkb8","KASQ8mz8gx","Chuy3HlUbF","IRh48NAFuw",
+"8U2nUuQIcz","7hyVvt98iW","Q6Lixd85a9","oVQp6RsQUq","AgJHQcL0aE","pAhR10Kyfs","JJs5mQ6Lix","WDVWJW7cTs","tuDyS7X3uy","5drc6ulk41",
+"s4786rKDLJ","64s8NsqVrf","TwanoU3yw5","Ss0ZuZUnqt","S77LHOHaBz","uZPqgCp3mZ","CNHmvZUnqt","7fKYU5nmWv","dmoS7K20wK","pmeCd2DREs",
+"5nmWvMGlTF","fFDrJ7ku1p","EoToPUmaEv","C2IrcuPX7G","tjQxsWmadA","lweGy7fKYU","gtCA5nFqik","55rfBuQIcz","RpBQmM6qcG","gtCA5atef2",
+"5Drn08RCUA","SmGzv9y4lw","3weIFZ4I1v","1LB1Lsx5Gl","ZUnqtOUYuF","No0Qb7hyVv","2NslmNhXdu","Chuy3lsQGo","MK07YlsQGo","wiHrZU3yw5",
+"euZA5bgJAz","4dEz6WDVWJ","AkKTknlaBy","tjQxsfcJOy","CdyBVsuY4x","PYBf4jfREu","hi5X7POUYS","xReecEdBKc","vLsmSuAWyp","soy9taL6AJ",
+"gtCA5rz7Ut","FhtglMm8si","brhlQO3iyQ","rKDLJ618Di","qUJMdVIlwP","ZUnqtRkQke","IjTwPWPmlx","brhlQyvOMI","FFDuiuAWyp","K20wKReKEW",
+"FFDui5Drn0","Yh1hF7fKYU","XflUqzmLYD","CNHmvoVQp6","FnPFBNcICA","qaofN6q6L9","VLTy6MaJQs","tjQxslCMxy","TXQ0ZqQxHP","VBjhzEdBKc",
+"mz8gxix74r","TwanovLsmS","sqVrfS77LH","DQimpCK5W7","oGu6xHfyNQ","GWqqXOxWIH","In3NSVLTy6","x3LDePYBf4","FGzgpM6qcG","AOgEeTCgPp",
+"fqypyM6qcG","gIYvEuPX7G","bZLvSsuY4x","AkKTkoVQp6","5drc66q6L9","cmXIXFcWrW","uAWypZuDtD","MmsIoMmKGJ","v8yFNxXTI4","45cIHazIWp",
+"7lUXZSmGzv","zbIYYOUqFM","2ZHdkzQt6Q","l83UduN6r3","G1RhSHRxd8","VNCPdi7WMQ","jS1ajMojnP","a00b5Qworu","jzUqRNhXdu","blLA94QMc9",
+"Cfgr3Ul4a1","atef2hYBCK","lViBvMaJQs","jS1ajcQOnv","OUYuF9iGoT","DLhzMsqVrf","tjQxs8hJdt","I7p2a7ku1p","ksJbyRsQUq","2DREsTXQ0Z",
+"M3zXLCNHmv","POUYSFwEJz","m4bxUIn3NS","soy9tVerEA","s47862Nslm","FLsphdjsrv","IRh48FLsph","ZJTXHuvf7A","ni2v164s8N","vOqCE7ku1p",
+"fqypyS77LH","YOfrYKZamH","b29RJM6qcG","RACujuTacx","RBhp0Mm8si","TXQ0Z9rlg9","GrDg7IBe8k","IKxdLMGlTF","LewvMWPmlx","prNT6n8pJ9",
+"BCxeC45cIH","soy9tY1mC0","SmGzvBGaQY","ZJTXH6q6L9","0YAGHFFDui","n1pmOGSQwj","FVMxotlILt","nnP8oKr8ys","gdQsSs93Ml","EdBKcjzUqR",
+"atef2KZamH","brhlQMkgy8","fcwDauvf7A","yvOMIW7cTs","prNT6FFDui","piJSkoQ87r","5VZjSWreyP","Oz8yZhUTw7","580YDSjskQ","QssNCCp3mZ",
+"ECMvUZuDtD","0YAGHX6Pin","o8UydJXljW","5IhmG8U2nU","uQIcze6e4z","MaJQsaDGtS","CdyBVBpYhV","5Drn0XyPZN","CIShGjzUqR","W3VFHOHaBz",
+"okgRiQWxoT","Y1mC0kZANm","jeskSatef2","NhXdulViBv","ksJbyQ6Lix","QssNCpFrrl","JKWYRO3iyQ","lViBvnlaBy","WDVWJMaJQs","5drc6FnPFB",
+"Chuy3LewvM","pvgjSQssNC","aL6AJ5iGN5","AIYUuSjskQ","S2Dfua00b5","s7MxkOz8yZ","FcWrWfcJOy","dmoS7Q6Lix","Yw2oU3otm6","XyPZNpT8wu",
+"6q6L9ogLgc","RACujBFkb8","faHirFPfSE","No0QbRmDcr","8TxD7TCgPp","tvdkDSmGzv","5nmWvWaim6","2DREsNo0Qb","Gv3Fq5ZaEz","5IhmGL7cGc",
+"NhXduYjB9t","5iGN5rz7Ut","NhXduni2v1","Mm8siRxrsm","K20wKguMb8","5Nammhi5X7","he9IAWMiS3","aDGtS2Yz7E","CdyBVNxx9V","7hyVvSs0Zu",
+"KASQ8t98iW","BCxeCF6PT2","kB5nPazIWp","pFrrltaOXK","BbwgAFnPFB","RsQUqNhXdu","oQ87r8FmFH","8FmFHix74r","yEfy9jzUqR","W3VFHXyPZN",
+"tl72Wmz8gx","48cHLNxx9V","Y1mC0tvdkD","WaWsv45cIH","MmKGJqQxHP","s7MxkjeskS","QworuQYxC0","WDVWJzQt6Q","dQ586s93Ml","5drc6a00b5",
+"KZamHSmGzv","uTacxaDGtS","d7vjMLbRTH","jzUqRNOHsz","TwanoUvlv4","Ul4a1Y1mC0","guMb8n8pJ9","xXTI4rz7Ut","aDGtSAXpwE","pv0i72TRI7",
+"0h1b114FLR","UmaEvaFFss","bgJAzvOqCE","hE1QlXflUq","soy9tatef2","S2DfuZv7z0","5iGN54QMc9","QnJ1SJJs5m","zmLYDNOHsz","29QAzB3qem",
+"QworuhSSvQ","v1HlnmX2GE","ReKEWsqVrf","qaofNmX2GE","FcWrWReKEW","yToGWG1RhS","CIShGuoStw","XyPZN5Namm","aL6AJCfgr3","uupzkeuZA5",
+"o8Uyd9eoRc","YOfrYzY1GY","lViBvyvOMI","HzZT8s93Ml","zbIYYlj07Q","gtCA5NcICA","GrDg7gIYvE","FGzgpGrDg7","9y4lwoQ87r","4dEz6RsQUq",
+"vkCHHRACuj","jeskSlj07Q","pvgjSBbwgA","brhlQfcwDa","1v5hH55rfB","9XyT9blLA9","6q6L9ThjNn","W7cTscL0aE","aFFssqQxHP","uAWypFLsph",
+"Cp3mZJIqXi","mz8gx3otm6","HP433L7cGc","Yh1hFuN6r3","FPfSEd85a9","HfyNQ48cHL","Yh1hFBbwgA","fcwDajfREu","yofH3fcJOy","DQimpfqypy",
+"i3pydU3yw5","kZANmWreyP","0PktIuTacx","AOgEeFGzgp","5VZjSRzaZA","mz8gxuPX7G","Yw2oUM3zXL","a00b5euZA5","pv0i7uTacx","euZA5yvOMI",
+"WmadADcpWB","FGzgpk85Ae","QClRLkB5nP","K4GS8jtn0X","Oz8yZQ6Lix","cmXIXSWfou","ZhwG1uPX7G","fLNg8pFrrl","5NammW7cTs","0MR5XPb1pa",
+"nFqikjSjS3","suY4xyluBx","QbxXcCK5W7","lkMUAcL0aE","okgRipT8wu","P6bcgLDk6f","d85a9sx5Gl","FnPFBiqv4k","AOgEegdQsS","uPX7G3otm6",
+"k85Aeatef2","JJs5mrz7Ut","2Yz7ECp3mZ","tl72WM3zXL","djsrvni2v1","Waim6o8Uyd","hi5X7lViBv","JRJQBIRh48","9eoRccQOnv","OUqFMWaWsv",
+"hi5X75ZaEz","C2IrcsuY4x","nlaBycQOnv","azIWpNOHsz","Oz8yZgIYvE","a00b5Uvlv4","zbIYYlkMUA","aFFssoGu6x","uN6r34W0Tl","bZLvS1LB1L",
+"soy9tydG8U","W3VFHMmsIo","WDVWJFFDui","t59lR3weIF","GSQwjdpe1v","JKWYRRxrsm","DLhzMpWiOs","zQt6Q4W0Tl","VjCZqFVMxo","7ku1pNAFuw",
+"AXpwEMkgy8","ru4UGtjQxs","fLNg8yofH3","I7p2auJScX","HlUbFulk41","rKDLJMaJQs","3otm6s7Mxk","jS1ajJkzUn","45cIHzHF1q","HfyNQ07n1c",
+"RACujMaJQs","BFkb8vLsmS","MmKGJ48cHL","soy9tCxVEf","JIqXiYOfrY","cQOnvuPX7G","Yf2Ecn8pJ9","dhSuHWaWsv","rz7UtWPmlx","nlaByMK07Y",
+"jfREuDLhzM","Vprf22Nslm","oQ87rAIYUu","Y1mC0Twano","IjTwPQYxC0","zY1GY0BmCy","FLsphrhl0J","tvdkDnnP8o","MojnPRBhp0","ZzJHW7Ow5C",
+"lm0pD07n1c","guMb8vOqCE","Q6hMCOHaBz","14FLRl83Ud","Zv7z0SbRYy","2DREs16lHc","uQIczL7cGc","5nmWvpv0i7","NcICAYjB9t","64s8NYw2oU",
+"JIqXihUTw7","55rfBHzZT8","8xEKz0Kyfs","ix74rpv0i7","0PktI6AFT0","uAWypoVQp6","vLsmSHP433","NOHszuupzk","qQxHPuTacx","RBhp0zqH0W",
+"ECMvUpmeCd","fcJOys4786","K20wKOxWIH","ECMvUtaOXK","l83UdwDajX","uPX7GGSQwj","ix74rbgJAz","0BmCyjtn0X","F6PT2HlUbF","Qworu6AFT0",
+"U3yw5MojnP","Mkgy8gf8rI","uQIczIKxdL","Twanomz8gx","Mm8silXFOB","atef2GrDg7","In3NSVprf2","d7vjMm4bxU","UlU3MIBe8k","gIYvEfaHir",
+"5NammPOUYS","FNYIMzHF1q","jzUqRs7Mxk","NhXduxciqp","yluBxFwEJz","brhlQlm0pD","StlDJVIlwP","64s8NblLA9","5ZaEzP6bcg","dhSuHIRh48",
+"tjQxsSjskQ","CqqaDNhXdu","Y1mC0zQt6Q","RACujhe9IA","s93MlEdBKc","Uvlv4MaJQs","IKxdLl83Ud","AgJHQvLsmS","U3yw5iwzGk","pv0i7QYxC0",
+"7Ow5CWmadA","tAOsrDG4sT","5NammJRJQB","QWxoT5nmWv","1LB1LhUTw7","GXdoHNOHsz","ydG8UMaJQs","CdyBVatef2","5iGN555rfB","YOfrYRsQUq",
+"FVMxo9rlg9","1v5hH5ZaEz","dpe1vyofH3","5drc62Nslm","IKxdLQWxoT","uPX7GNhXdu","fmIK17hyVv","UlU3MVerEA","5nmWvMaJQs","fLNg8tAOsr",
+"I7p2afmIK1","ogLgc5Namm","SmGzvVerEA","8xEKzWreyP","pAhR1BbwgA","MGlTF2TRI7","EOE1ov1Hln","zQt6Qk85Ae","NcICAUvlv4","1LB1LyvOMI",
+"t98iWFcWrW","rhl0JRACuj","pWiOsFVMxo","07n1cKASQ8","RpBQmJXljW","QnJ1SjS1aj","9eoRcUl4a1","WDVWJoGu6x","8U2nUQChxs","X6PinnnP8o",
+"OHaBzQssNC","zY1GYAIYUu","GWqqXUmaEv","rz7UtUlU3M","tuDySjiVBP","bZLvSZUnqt","mz8gxxXTI4","wDajXiB08l","qaofNAIYUu","JJs5mZuDtD",
+"Mm8siaDGtS","okgRiOUYuF","Dz1R3HzZT8","QssNCix74r","gdQsS0BmCy","i7WMQAgJHQ","piJSkb29RJ","mz8gxZhwG1","gf8rIhYBCK","0ao3ll83Ud",
+"1j5L8HlUbF","ThjNnFNYIM","xXTI4zbIYY","hSSvQKr8ys","EOE1ouvf7A","CNHmvokgRi","vLsmSZUnqt","i3pydmz8gx","pmeCd29QAz","cQOnvZuDtD",
+"0BmCyOHaBz","pv0i7prNT6","LbRTHvOqCE","n8pJ9Dz1R3","Zv7z0FcWrW","QnJ1S29QAz","zHF1qdpe1v","fcwDaJJs5m","7ku1piqv4k","uoStw64s8N",
+"FFDuijSjS3","3weIFd85a9","ydG8UGWqqX","zmLYDVprf2","24ARFkZANm","2hEEUuLtKs","pWiOsfcJOy","No0QbMkgy8","fmIK1VNCPd","FjHXRtuDyS",
+"ksJby9eoRc","gjUTu7Ow5C","KZamHRmDcr","No0Qbx3LDe","zqH0Wrz7Ut","Nxx9VZv7z0","JkzUnSmGzv","JRJQBi3pyd","QnJ1SdQ586","n1pmOdhSuH",
+"AmdQds4786","618DiQChxs","Kr8ysa00b5","v1Hln4W0Tl","14FLR8U2nU","BGaQYk85Ae","s4786gIYvE","OxWIHt98iW","djsrvguMb8","AkKTkuvf7A",
+"OxWIHuZPqg","BpYhVaDGtS","cShY2W3VFH","6q6L9MmKGJ","OxWIHMmsIo","FVMxoCK5W7","S2DfufcwDa","sqVrfsqVrf","Vprf2tlILt","pvgjSoGu6x",
+"wDajXVNCPd","5Drn0uPX7G","iqv4k2Yz7E","tAOsrOUYuF","zz4ZUzz4ZU","Mkgy8FPfSE","5VZjS5Namm","ECMvUcL0aE","HzZT8uupzk","dhSuHjiVBP",
+"W3VFHsqVrf","FjHXRY1mC0","s7MxkRkQke","QYxC0lpF6W","DLhzMI7p2a","zz4ZUVBjhz","oVQp6uupzk","RBhp02hEEU","fqypyzz4ZU","tl72W8RCUA",
+"JXljWvkCHH","PYBf47fsYM","jfREu5IhmG","ZuDtDYh1hF","OUYuFlH1kt","9iGoT2TRI7","7fsYMhe9IA","Dz1R3Kr8ys","s4786VNCPd","i7WMQAmdQd",
+"dQ586i7WMQ","7hyVv9XyT9","5VZjSRmDcr","0BmCy9XyT9","oVQp6xciqp","ZzJHWNxx9V","yEfy9AIYUu","yvOMIYf2Ec","K4GS8rz7Ut","ECMvU16lHc",
+"Cp3mZ8xEKz","Q6hMCW7cTs","I7p2aQYxC0","3weIFFcWrW","DQimpk85Ae","S77LHBbwgA","iB08ljeskS","blLA9rz7Ut","RACujIn3NS","uZPqgNOHsz",
+"0BmCy14FLR","dQ586gdQsS","NOHszzbIYY","BpYhVBGaQY","9GXkXYjB9t","5IhmGFNYIM","RzaZALDk6f","ydG8Ua00b5","OUYuF0Kyfs","Yh1hFtaOXK",
+"lH1kt0Kyfs","tAOsrUvlv4","zz4ZUni2v1","IRh480PktI","9rlg93weIF","NAFuwpv0i7","uupzkZzJHW","zqH0W07n1c","zFgtBOHaBz","ciuWzpAhR1",
+"Pb1pacmXIX","dhSuHt98iW","4dEz67hyVv","sqVrfC2Irc","7hyVvHP433","lH1ktQChxs","8cVD3WreyP","DQimpECMvU","OHaBzzFgtB","Yf2EccQOnv",
+"MaJQsNxx9V","JXljWSjskQ","aez9yP6bcg","l83Ud6q6L9","lViBvqaofN","CNHmvNcICA","ZzJHWAXpwE","Dz1R38hJdt","RmDcrP6bcg","QWxoTnnP8o",
+"s7MxkyluBx","piJSkHzZT8","jtn0XiKqhr","RkQkeru4UG","gIYvE9XyT9","fqypyfqypy","CNHmv45cIH","ogLgcSWfou","jiVBPsqVrf","RpBQmuTacx",
+"7fsYMFLsph","K20wKWMiS3","QChxsuAWyp","zbIYYOxWIH","ksJbykZANm","MK07YuLtKs","jtn0XoQ87r","WreyP7X3uy","LDk6fS77LH","StlDJDz1R3",
+"Gv3FqgtCA5","M6qcGG1RhS","lViBv14FLR","14FLRt59lR","lpF6WKASQ8","Mkgy8oQ87r","wiHrZCK5W7","aL6AJnlaBy","J2mQiUl4a1","618Dis7Mxk",
+"fFDrJ55rfB","5iGN5HlUbF","Y1mC0nlaBy","rKDLJlpF6W","GWqqXni2v1","NAFuw9iGoT","hUTw7v1Hln","oQ87rqQxHP","6q6L9Yw2oU","QWxoTCxVEf",
+"GWqqXyvOMI","hE1QllViBv","k85AeVerEA","QYxC0gf8rI","RkQkemX2GE","K4GS8lCMxy","6q6L9kB5nP","IKxdLAOgEe","CK5W7lViBv","o8UydOHaBz",
+"faHirrz7Ut","pvgjSzz4ZU","FwEJzUmaEv","pmeCdzbIYY","4dEz6hE1Ql","zmLYDatef2","v1HlnBpYhV","lpF6W0YAGH","AOgEe5Namm","lCMxy9iGoT",
+"kB5nPpAhR1","ru4UGqQxHP","KASQ8uupzk","No0QbuoStw","B3qemyofH3","7lUXZTCgPp","bZLvSeuZA5","LbRTHFFDui","ksJbyfaHir","gjUTuI7p2a",
+"5iGN5YOfrY","xciqpZzJHW","yluBxFPfSE","WmadAM6qcG","BpYhVmz8gx","JkzUnD6rBy","JRJQBECMvU","No0QbSbRYy","QnJ1Ssoy9t","DG4sT7fKYU",
+"djsrv8U2nU","sx5GlRACuj","TCgPpuvf7A","29QAzQChxs","WmadAzHF1q","UlU3MDcpWB","FcWrWStlDJ","NOHszMGlTF","nlaByWPmlx","cShY2soy9t",
+"uJScXqaofN","4dEz6tuDyS","pv0i7JJs5m","S77LHyToGW","lm0pDK20wK","xciqpAkKTk","2Yz7EMmKGJ","fcJOytjQxs","7X3uyn1pmO","lsQGomX2GE",
+"MGlTFCxVEf","No0QbYh1hF","CxVEfVNCPd","cL0aEXflUq","7hyVvEoToP","nlaByVjCZq","b29RJt59lR","Mkgy8pT8wu","DQimpLbRTH","In3NSfaHir",
+"hUTw7k85Ae","M3zXLMojnP","JXljWFxX9q","5drc6JKWYR","tlILtFFDui","AIYUuyToGW","MGlTFZJTXH","iqv4kpWiOs","zHF1q5Drn0","oVQp6pWiOs",
+"b29RJlXFOB","LbRTHuJScX","Q6hMCjfREu","GrDg7wiHrZ","BFkb8NAFuw","580YDC2Irc","lm0pDQChxs","Waim6mz8gx","aFFss6AFT0","Mkgy8L7cGc",
+"FwEJz2TRI7","t59lRFhtgl","Q6hMCReKEW","Zv7z0C2Irc","d7vjMv8yFN","yEfy9LbRTH","nnP8o6q6L9","4W0Tl45cIH","WMiS3t98iW","9rlg9XyPZN",
+"5nmWv64s8N","CqqaD5iGN5","6AFT0ZUnqt","9eoRcpFrrl","FnPFBCqqaD","2Yz7EkB5nP","oGu6xWreyP","OHaBzbZLvS","gdQsSVprf2","VIlwPi7WMQ",
+"7X3uyblLA9","S2DfudmoS7","lkMUA7ku1p","BbwgAblLA9","i3pydxciqp","l83UdgdQsS","fcJOy8U2nU","AIYUuy94nw","2DREsZUnqt","IKxdLKsjRK",
+"jfREunlaBy","07n1cThjNn","BFkb8aez9y","suY4xyofH3","8FmFHxReec","NOHszjzUqR","ix74rL7cGc","CdyBVSmGzv","55rfBksJby","gdQsSFVMxo",
+"1j5L8pmeCd","RkQkeIn3NS","MezSWTa8f6","lXFOBRxrsm","Chuy3Rxrsm","yEfy9nnP8o","jSjS30MR5X","5NammIn3NS","jtn0Xv1Hln","5VZjSNo0Qb",
+"lj07Qv1Hln","uLtKsogLgc","s7Mxkatef2","FFDuilm0pD","bZLvSRsQUq","2ZHdkuvf7A","KsjRKwiHrZ","WMiS3MojnP","oVQp60h1b1","a00b59XyT9",
+"AIYUuRxrsm","S2DfuMmsIo","0h1b1lpF6W","8U2nUStlDJ","okgRi5Mg9r","Uvlv4AIYUu","hSSvQFGzgp","5Drn0s93Ml","faHiryluBx","Mm8siFNYIM",
+"CxVEfuZPqg","aDGtSVprf2","QnJ1SVIlwP","5iGN5kB5nP","pv0i7FwEJz","pmeCdC2Irc","uJScX4dEz6","MK07YdmoS7","Uvlv4M3zXL","VLTy6Cp3mZ",
+"cmXIXSs0Zu","faHirfcwDa","zQt6QdQ586","yToGWgdQsS","B3qeml83Ud","DcpWBfLNg8","3otm6tlILt","1v5hHS77LH","ZJTXHrhl0J","yToGWlCMxy",
+"JIqXiguMb8","8RCUA8cVD3","qQxHPn1pmO","jfREufcJOy","FFDuiKZamH","1LB1LNo0Qb","fqypyIBe8k","9iGoTt98iW","aL6AJI7p2a","FnPFBydG8U",
+"n1pmOAOgEe","8FmFHx3LDe","fFDrJVerEA","FjHXRDQimp","pv0i7StlDJ","ZJTXHZv7z0","FxX9qgtCA5","UmaEvWreyP","KASQ88cVD3","K4GS82DREs",
+"blLA95drc6","vkCHHiB08l","5nmWvReKEW","Oz8yZZzJHW","WMiS3iqv4k","iwzGkF6PT2","QnJ1SuJScX","ksJbydpe1v","wiHrZTwano","oVQp65IhmG",
+"FNYIMYOfrY","y94nwhUTw7","jzUqRVerEA","29QAzAIYUu","uZPqgCK5W7","pmeCdGXdoH","rKDLJlViBv","JkzUnn1pmO","DLhzMW3VFH","o8UydfcJOy",
+"16lHcFwEJz","uQIczyvOMI","VLTy6MmKGJ","JKWYRs93Ml","MezSWqQxHP","pAhR1jtn0X","5VZjS0ao3l","Ta8f629QAz","0YAGHY1mC0","LbRTHBFkb8",
+"DG4sTqaofN","BCxeCFhtgl","GWqqXQssNC","DG4sT7lUXZ","IBe8kFPfSE","NOHszpFrrl","uLtKs0YAGH","y94nwBCxeC","s93MlyluBx","rz7UtzqH0W",
+"P6bcgQnJ1S","v8yFNeuZA5","uPX7GSmGzv","RzaZAy94nw","EoToPNo0Qb","Ul4a18TxD7","i3pydblLA9","XflUq5iGN5","M3zXLzQt6Q","Cp3mZIn3NS",
+"0h1b1AgJHQ","FLsphVerEA","vLsmSFcWrW","zqH0Ws4786","lViBvaL6AJ","64s8NZzJHW","WMiS3Chuy3","4W0Tl580YD","M3zXLReKEW","5NammsuY4x",
+"piJSk1v5hH","GrDg7BGaQY","ReKEWG1RhS","uJScXCxVEf","6q6L9wiHrZ","oGu6xcL0aE","YjB9tuAWyp","Mm8siCIShG","FjHXRSjskQ","pvgjSa00b5",
+"RACujVBjhz","jS1ajU3yw5","jfREuulk41","Y1mC0fLNg8","ulk41StlDJ","b29RJv2eC3","yEfy9HlUbF","Dz1R3jSjS3","t59lRYOfrY","a00b5lViBv",
+"jSjS3WPmlx","ZJTXH9GXkX","zHF1qv1Hln","DLhzM64s8N","FnPFBtl72W","G1RhSfqypy","ulk41K4GS8","7Ow5CIjTwP","Cp3mZD6rBy","DcpWBGWqqX",
+"nFqik8xEKz","JJs5mazIWp","CqqaD7Ow5C","64s8NCqqaD","tlILtokgRi","In3NS9y4lw","Nxx9VWMiS3","5nmWvjzUqR","8FmFHGrDg7","vOqCE45cIH",
+"XflUq8cVD3","6AFT0I7p2a","Cp3mZuPX7G","Rxrsmni2v1","ix74ryEfy9","hi5X7BbwgA","Z4I1vpAhR1","Z4I1vIjTwP","8cVD3lViBv","U3yw5m4bxU",
+"9GXkXNo0Qb","HRxd8fmIK1","iB08lNo0Qb","gtCA5ulk41","bgJAzjzUqR","ZuDtDoVQp6","qUJMdCfgr3","I7p2a9GXkX","Cp3mZ9eoRc","ksJby4dEz6",
+"taOXK2ZHdk","HzZT87X3uy","VIlwPlkMUA","SjskQCp3mZ","1LB1LRkQke","GWqqXFxX9q","W7cTsFxX9q","Waim6jfREu","OUqFMlkMUA","uN6r3SmGzv",
+"5nmWvKsjRK","hi5X7Yw2oU","fmIK17lUXZ","OUYuFoQ87r","fFDrJiB08l","fqypytlILt","0Kyfs2ZHdk","ciuWzRsQUq","5VZjSHfyNQ","NcICAQbxXc",
+"dpe1vlweGy","FnPFBaFFss","zbIYYn1pmO","CqqaDmz8gx","EoToPM6qcG","SmGzvogLgc","8TxD7yvOMI","QChxsfFDrJ","ECMvUYjB9t","Oz8yZOxWIH",
+"NhXduyEfy9","QssNCWaim6","9GXkXjtn0X","X6PinjiVBP","uPX7GuTacx","s93MlxReec","xXTI4FVMxo","C2IrcyofH3","t59lRokgRi","euZA5QYxC0",
+"pT8wuEOE1o","5VZjSaL6AJ","1j5L8pT8wu","In3NSNAFuw","wDajXG1RhS","lXFOB580YD","zQt6Qaez9y","CNHmvhE1Ql","ru4UGlm0pD","Pb1pafFDrJ",
+"ix74rbZLvS","LbRTHSbRYy","hYBCKSs0Zu","o8Uyddjsrv","UmaEvs4786","JkzUn7X3uy","2TRI7MaJQs","ogLgcoVQp6","FxX9q0PktI","FcWrWQbxXc",
+"CNHmvQClRL","7X3uyydG8U","oGu6xksJby","JJs5mkB5nP","lm0pD7X3uy","yluBxh1zcH","7ku1pRmDcr","5VZjSWMiS3","fLNg8M3zXL","zz4ZUG1RhS",
+"ZUnqtd7vjM","9y4lwQYxC0","Waim6GXdoH","uupzkFwEJz","W7cTss7Mxk","NAFuwzz4ZU","SbRYysqVrf","2TRI7fcwDa","BCxeCatef2","ogLgc9iGoT",
+"tAOsr2ZHdk","mX2GEO3iyQ","iqv4kECMvU","QworutaOXK","pAhR1uJScX","5drc6pvgjS","2Yz7EM6qcG","FVMxogIYvE","QbxXcAXpwE","qUJMdNcICA",
+"euZA5qaofN","VjCZqrKDLJ","vOqCEMojnP","IjTwPpiJSk","azIWpGWqqX","hYBCKi3pyd","ECMvUK4GS8","HP433QbxXc","SbRYyyofH3","Pb1paZUnqt",
+"8RCUAZJTXH","JKWYRlpF6W","ZUnqtpFrrl","QYxC0BbwgA","4dEz6he9IA","e6e4zvLsmS","QClRL7Ow5C","azIWp7ku1p","ogLgcdhSuH","guMb8G1RhS",
+"BGaQYix74r","RzaZA8cVD3","nlaBydQ586","0ao3llXFOB","s93Ml0ao3l","NcICAlCMxy","P6bcg64s8N","MojnPh1zcH","7X3uyRmDcr","Waim6LbRTH",
+"vLsmSAmdQd","KsjRKpmeCd","BCxeCOxWIH","fqypyVBjhz","XflUq45cIH","LewvMk85Ae","WmadA8xEKz","Vprf28xEKz","hYBCKJRJQB","tAOsrdjsrv",
+"MK07Y7ku1p","lViBvWaim6","CxVEfsuY4x","he9IAiKqhr","RkQkezQt6Q","EdBKcIBe8k","MK07YjzUqR","RBhp0hi5X7","s47868FmFH","ciuWz6q6L9",
+"xciqpt59lR","gjUTuGrDg7","8U2nUaDGtS","64s8NfaHir","uTacxksJby","lpF6W0MR5X","tl72WtjQxs","RkQketvdkD","zY1GYCIShG","WDVWJ9eoRc",
+"S2Dfulm0pD","3otm6okgRi","LbRTH8RCUA","jiVBP9XyT9","v1HlnMK07Y","HRxd83weIF","yToGWMK07Y","aFFssdmoS7","uQIczaFFss","7hyVvFnPFB",
+"2TRI7M3zXL","QssNCQ6Lix","faHir9XyT9","WMiS3GrDg7","pAhR1okgRi","Cp3mZnnP8o","lm0pD8RCUA","AIYUuAmdQd","xXTI4fcwDa","2hEEUHfyNQ",
+"7fsYM2ZHdk","HfyNQdQ586","CxVEfe6e4z","EoToPprNT6","HlUbFMojnP","fFDrJgjUTu","AkKTkDLhzM","BGaQYuTacx","lsQGoHzZT8","W7cTsQbxXc",
+"64s8NWMiS3","fLNg8KsjRK","JJs5mJ2mQi","OUYuFqUJMd","a00b53weIF","Waim6618Di","BbwgArz7Ut","Yf2EcMmKGJ","jS1ajtAOsr","8hJdt64s8N",
+"Nxx9V8cVD3","uupzkMm8si","HP433vLsmS","s4786Mm8si","16lHcWaWsv","NhXdu7ku1p","ZUnqt6AFT0","iKqhrSmGzv","RACuj7ku1p","0Kyfs8RCUA",
+"soy9tn1pmO","ZuDtDMkgy8","n1pmOJJs5m","tjQxsjtn0X","ZUnqtazIWp","CIShGWPmlx","i3pydRmDcr","Dz1R3K20wK","Yw2oUyToGW","7hyVvMkgy8",
+"ReKEWWPmlx","I7p2atlILt","WreyPSmGzv","Yh1hFIn3NS","JXljW7lUXZ","UlU3MEoToP","VNCPdYf2Ec","PYBf4Pb1pa","J2mQi4dEz6","aFFssn8pJ9",
+"IKxdLfLNg8","8hJdtmX2GE","lCMxyaFFss","jiVBPWreyP","8U2nUQbxXc","Z4I1vGv3Fq","taOXKHzZT8","5Mg9raFFss","XflUqLewvM","7lUXZEoToP",
+"ZUnqtgIYvE","hE1QlLewvM","pAhR1JKWYR","sx5Gl580YD","s4786MojnP","Qworu7hyVv","S77LHVBjhz","Oz8yZ5iGN5","2ZHdk5IhmG","WaWsvGSQwj",
+"HRxd86AFT0","uLtKsXflUq","ZzJHWOHaBz","Ss0ZuDG4sT","jzUqRTa8f6","sqVrfuoStw","IRh48FnPFB","Y1mC0vkCHH","s93MlI7p2a","WMiS3cShY2",
+"he9IAksJby","faHir16lHc","StlDJ5VZjS","blLA9ZuDtD","POUYS3otm6","iwzGkQworu","jtn0XKZamH","0BmCyBCxeC","v1Hlns7Mxk","4W0TltuDyS",
+"8cVD33otm6","uvf7AjSjS3","xciqp618Di","JIqXiStlDJ","1v5hHFGzgp","EoToPbgJAz","GrDg716lHc","pvgjSsqVrf","ZJTXH29QAz","pmeCdqQxHP",
+"YOfrYP6bcg","GWqqXjS1aj","KsjRKBbwgA","ciuWzRpBQm","StlDJMkgy8","tvdkD55rfB","WMiS3uupzk","VBjhz7fKYU","JRJQBo8Uyd","taOXKStlDJ",
+"aL6AJFNYIM","29QAzX6Pin","x3LDeIn3NS","MmsIo4W0Tl","9eoRcChuy3","blLA9OHaBz","o8Uyds4786","t59lRgIYvE","W3VFHFNYIM","oQ87rlXFOB",
+"k85AeAmdQd","FPfSE7ku1p","JRJQBVIlwP","Gv3FqlH1kt","vkCHH618Di","OxWIH8TxD7","UmaEvDLhzM","MK07YogLgc","2Yz7EOHaBz","5nmWvUmaEv",
+"b29RJMK07Y","ni2v1Z4I1v","lkMUA8TxD7","7fsYMd85a9","guMb8cShY2","aez9yXflUq","cmXIXX6Pin","3otm6IBe8k","0Wr5ypv0i7","hYBCKazIWp",
+"0PktICfgr3","UmaEvjS1aj","ydG8Us4786","Vprf2XflUq","Y1mC0pvgjS","oQ87riB08l","0BmCyAIYUu","ogLgcru4UG","9XyT9RsQUq","NcICAuQIcz",
+"CK5W7iB08l","ogLgc2Nslm","TXQ0ZzbIYY","64s8NKZamH","pv0i7nnP8o","7Ow5Cd85a9","KsjRKuAWyp","C2IrcKr8ys","yvOMIxciqp","fqypyFGzgp",
+"cL0aEP6bcg","WMiS3n8pJ9","3otm6v8yFN","HlUbFReKEW","IKxdLxciqp","yvOMI5ZaEz","gIYvEvLsmS","2DREsXflUq","aDGtSpv0i7","5NammBCxeC",
+"djsrv2ZHdk","faHirkZANm","FVMxo7hyVv","vkCHHMK07Y","M3zXLWaWsv","dQ586JJs5m","HzZT8hi5X7","Dz1R3pFrrl","6q6L9mX2GE","HP433DLhzM",
+"ZuDtDgIYvE","Mkgy8FwEJz","k85AelCMxy","WDVWJMGlTF","FxX9qJXljW","JIqXiiKqhr","bgJAz7hyVv","M3zXLGSQwj","Nxx9VogLgc","CdyBVuJScX",
+"FGzgp48cHL","kZANmTCgPp","gIYvE07n1c","kZANmsx5Gl","xciqplH1kt","azIWpqUJMd","jiVBPuvf7A","CNHmvjS1aj","MezSWZUnqt","16lHc1j5L8",
+"9GXkXWmadA","uQIcz8hJdt","AgJHQ2DREs","J2mQipAhR1","nlaByXflUq","X6PinI7p2a","8hJdtuupzk","d7vjMVprf2","pAhR124ARF","dpe1vyEfy9",
+"2Yz7E5IhmG","hUTw74QMc9","GSQwj4QMc9","fFDrJkB5nP","BpYhVY1mC0","ReKEWzz4ZU","yToGWYf2Ec","8TxD7MezSW","zz4ZUZuDtD","9iGoTjeskS",
+"pT8wuazIWp","KZamHfcwDa","MGlTFhYBCK","dQ586MaJQs","uN6r3AgJHQ","tAOsrcL0aE","WaWsv07n1c","wDajX48cHL","hUTw7Uvlv4","rKDLJCK5W7",
+"8U2nU14FLR","YjB9tSjskQ","9XyT9CIShG","xXTI4ThjNn","WmadAPYBf4","7Ow5CyluBx","XflUqxXTI4","t59lRVBjhz","JRJQBlCMxy","okgRiL7cGc",
+"POUYS9iGoT","ZJTXHF6PT2","5NammSmGzv","djsrvIKxdL","pWiOsiqv4k","YjB9tNxx9V","iqv4k1j5L8","a00b5jfREu","4dEz6FnPFB","8cVD32DREs",
+"2hEEUVerEA","pvgjSfFDrJ","jfREuiwzGk","cL0aEThjNn","K4GS8KsjRK","pv0i7XyPZN","GSQwjRsQUq","XyPZNt98iW","HfyNQaez9y","pmeCda00b5",
+"DG4sT5drc6","Q6hMCpT8wu","iB08lX6Pin","AXpwEtaOXK","X6PinuAWyp","Cp3mZIBe8k","AIYUuzY1GY","ZhwG1IjTwP","JkzUnRzaZA","aFFssJXljW",
+"5ZaEzRpBQm","JRJQByvOMI","ksJbySjskQ","blLA98TxD7","DcpWBaez9y","MezSW2Yz7E","WmadA2hEEU","JXljW2Nslm","he9IAWDVWJ","iwzGkZv7z0",
+"wiHrZCNHmv","Pb1paReKEW","azIWp48cHL","ni2v1soy9t","ru4UGkZANm","JRJQBpmeCd","jtn0XTa8f6","TXQ0Zs7Mxk","sx5Gla00b5","HzZT8JkzUn",
+"pmeCdOUqFM","yvOMIvLsmS","JKWYR0Kyfs","vOqCEI7p2a","fcJOy580YD","JXljWpv0i7","ReKEW2Nslm","atef2lViBv","rhl0Jiqv4k","OUqFMDQimp",
+"aez9ysqVrf","uJScXxReec","14FLR0MR5X","VerEAB3qem","OxWIHm4bxU","07n1cRBhp0","S2Dfu5iGN5","UlU3MFLsph","Nxx9Vuupzk","dhSuHPYBf4",
+"NcICAsoy9t","KASQ8SjskQ","EoToPU3yw5","lXFOBAkKTk","DQimpuQIcz","8cVD3CxVEf","lweGylCMxy","FPfSEoGu6x","lCMxyIRh48","faHiratef2",
+"lXFOBfqypy","uLtKsS77LH","zHF1qQChxs","Ul4a1e6e4z","gIYvEs7Mxk","FLsphIn3NS","jfREuGWqqX","i7WMQxReec","h1zcH7fKYU","CdyBV7hyVv",
+"rKDLJ64s8N","F6PT2CIShG","0Wr5yhSSvQ","yToGWEdBKc","Mkgy8AOgEe","24ARFuupzk","wDajXTCgPp","1LB1LDz1R3","9eoRc5Namm","QnJ1Saez9y",
+"8xEKzL7cGc","XflUqcL0aE","Mkgy8rhl0J","5drc6hi5X7","29QAzru4UG","NAFuwWreyP","Yh1hFKr8ys","WMiS3QClRL","djsrvxReec","uZPqg8hJdt",
+"s7MxkhSSvQ","GSQwj48cHL","xciqpIRh48","HlUbFWMiS3","lkMUACqqaD","b29RJSmGzv","pAhR1K20wK","8xEKzI7p2a","kZANmfFDrJ","soy9tMaJQs",
+"tlILtlpF6W","tAOsrogLgc","zqH0Waez9y","sqVrflkMUA","Waim6W3VFH","yEfy93otm6","fmIK1uN6r3","5drc6CqqaD","O3iyQrz7Ut","45cIHCp3mZ",
+"ThjNnogLgc","5IhmGQYxC0","VerEALDk6f","NOHszzz4ZU","uZPqgpWiOs","IBe8k8U2nU","wDajXIn3NS","CqqaDTCgPp","hSSvQ0h1b1","EoToPmX2GE",
+"i3pyd64s8N","vOqCEgjUTu","5nmWvRpBQm","CqqaDyvOMI","hSSvQCK5W7","pWiOs14FLR","azIWpv2eC3","zmLYDZUnqt","QYxC0GWqqX","gf8rI55rfB",
+"ECMvU8FmFH","k85Ae14FLR","v1Hlny94nw","TXQ0ZGSQwj","faHirFxX9q","aDGtSt59lR","M6qcG45cIH","2hEEUvkCHH","0Wr5yFhtgl","zY1GYnFqik",
+"taOXKNAFuw","dmoS7ni2v1","7fKYUMGlTF","5Mg9rFVMxo","hi5X7e6e4z","Uvlv4VBjhz","TCgPpVNCPd","rhl0JVBjhz","2ZHdk7hyVv","SbRYyQbxXc",
+"Ul4a1uLtKs","LbRTHCK5W7","b29RJRxrsm","Dz1R3XflUq","yofH3580YD","lCMxyRsQUq","5VZjSoQ87r","6AFT09y4lw","yofH3jeskS","ogLgc14FLR",
+"lsQGoqUJMd","CIShG8TxD7","fcwDaTCgPp","ReKEWJRJQB","W7cTsix74r","0BmCysuY4x","zHF1qB3qem","dmoS7FLsph","Waim6Zv7z0","1v5hHx3LDe",
+"lkMUAMmsIo","fqypylj07Q","7hyVvxReec","jS1ajQssNC","Z4I1v9y4lw","BFkb88U2nU","LDk6fm4bxU","Zv7z0BCxeC","sqVrfDz1R3","nnP8oMGlTF",
+"ogLgc2ZHdk","45cIHPOUYS","StlDJFLsph","RACujPYBf4","lH1kt0MR5X","euZA5HP433","mX2GEPb1pa","pT8wulpF6W","uPX7GtAOsr","W7cTsO3iyQ",
+"CqqaDCNHmv","M3zXLFwEJz","L7cGcFVMxo","zY1GYlj07Q","Pb1padmoS7","DQimppiJSk","gtCA5pAhR1","5Namm7ku1p","AgJHQ0h1b1","D6rBy55rfB",
+"VLTy6ThjNn","Pb1paJXljW","uLtKs5iGN5","AkKTkEoToP","hSSvQkZANm","DQimpjtn0X","8RCUAW3VFH","hi5X72TRI7","VjCZqZv7z0","64s8NMaJQs",
+"Vprf25drc6","tuDySazIWp","JRJQBmX2GE","uZPqgJXljW","lj07QprNT6","I7p2aVNCPd","29QAzfqypy","MaJQspT8wu","ZuDtD5IhmG","CNHmvuAWyp",
+"wiHrZFNYIM","M6qcG5IhmG","W3VFHFFDui","FNYIMSjskQ","zz4ZUxciqp","0ao3lFPfSE","DG4sTZv7z0","QYxC0iB08l","iKqhr4dEz6","guMb8fqypy",
+"DQimp5nmWv","VLTy6BFkb8","Ta8f6SWfou","dmoS7pT8wu","0PktI2ZHdk","4QMc92ZHdk","QssNC24ARF","TCgPpMojnP","8RCUAKZamH","GrDg7d85a9",
+"2TRI79GXkX","2Yz7Eru4UG","suY4xblLA9","No0Qb2Nslm","C2Irc9iGoT","1LB1LLewvM","vOqCEDG4sT","0ao3l7fsYM","wiHrZjiVBP","CxVEfVLTy6",
+"VjCZqsuY4x","K20wKXflUq","7hyVvjiVBP","8U2nUM6qcG","Chuy3iB08l","OHaBztl72W","CxVEfuoStw","nlaByhe9IA","pvgjSThjNn","jS1ajQworu",
+"zY1GY8xEKz","SWfouuTacx","lm0pDChuy3","IjTwPydG8U","DQimp8cVD3","uN6r3NhXdu","uvf7AuLtKs","4dEz6aL6AJ","ix74rU3yw5","ZhwG1Nxx9V",
+"k85AeZhwG1","vLsmSuoStw","JXljWuPX7G","pAhR1FVMxo","qQxHPZJTXH","IjTwPDG4sT","xciqpWmadA","6q6L9Ta8f6","DG4sTGSQwj","IKxdLZzJHW",
+"NOHszFcWrW","fcJOyZzJHW","UlU3MO3iyQ","FwEJzCdyBV","JXljWWaim6","uTacxqaofN","GrDg77Ow5C","ogLgcix74r","Nxx9VnFqik","8cVD3Kr8ys",
+"CK5W7uoStw","zqH0WUl4a1","1j5L8xXTI4","ThjNnvkCHH","ThjNntl72W","9GXkXa00b5","Yf2EcGWqqX","FcWrWvLsmS","ReKEW64s8N","GXdoHI7p2a",
+"RBhp0bgJAz","o8Uydgf8rI","1LB1Lo8Uyd","3otm6HzZT8","48cHLjzUqR","Ul4a1gjUTu","OxWIHdhSuH","0ao3lIn3NS","6q6L9s4786","WmadA9iGoT",
+"CdyBVJIqXi","y94nwFGzgp","GXdoHL7cGc","QYxC07hyVv","KsjRKvLsmS","cShY2ksJby","Nxx9VdmoS7","1j5L8d85a9","1v5hH64s8N","L7cGcQnJ1S",
+"8U2nUjSjS3","VIlwPpT8wu","BpYhVNcICA","8xEKz5Drn0","gjUTu9XyT9","o8UydazIWp","vLsmSoGu6x","vLsmSY1mC0","ciuWzDz1R3","AkKTkAgJHQ",
+"RzaZASmGzv","yEfy9hUTw7","Ta8f67fKYU","uJScXBbwgA","l83UdLDk6f","BpYhVSbRYy","16lHcQnJ1S","GXdoHGSQwj","lkMUAlweGy","djsrvkB5nP",
+"hSSvQZ4I1v","RsQUqGSQwj","Q6Lix1j5L8","4dEz6JIqXi","uJScX5iGN5","mz8gxPOUYS","SWfouIjTwP","s93MlpWiOs","yluBxzQt6Q","HfyNQaFFss",
+"hSSvQi3pyd","pvgjSciuWz","0BmCyD6rBy","ciuWz07n1c","CIShG5Mg9r","zQt6QMmsIo","FVMxo5Namm","MmsIoF6PT2","LDk6fEoToP","brhlQsuY4x",
+"uN6r3zmLYD","cShY20Wr5y","K4GS8h1zcH","1v5hHPOUYS","8FmFHqaofN","0BmCySs0Zu","QClRL0Kyfs","t59lRzFgtB","yEfy9RkQke","HfyNQn1pmO",
+"IRh48vLsmS","x3LDeXyPZN","IRh48HlUbF","AIYUuL7cGc","WaWsv618Di","k85AelViBv","RzaZA0Wr5y","JKWYRoQ87r","7fsYM48cHL","Pb1pa5iGN5",
+"guMb8pv0i7","45cIHgjUTu","8RCUAt59lR","No0QbWaWsv","9iGoTzFgtB","Mkgy8YjB9t","ciuWzI7p2a","mz8gxdhSuH","5drc6uTacx","lj07QjzUqR",
+"QYxC0GXdoH","TCgPpjfREu","PYBf4Rxrsm","5NammguMb8","8hJdtNo0Qb","FnPFBgdQsS","lweGyFwEJz","580YDEdBKc","taOXKQClRL","gIYvEIBe8k",
+"HRxd8JXljW","FcWrWuN6r3","Yh1hF2ZHdk","uJScX8cVD3","3weIFy94nw","0YAGHcL0aE","FcWrW24ARF","Uvlv4MK07Y","fLNg8gtCA5","iB08lU3yw5",
+"fqypy16lHc","TwanoMmKGJ","bgJAz0PktI","IBe8koQ87r","MojnPfqypy","FjHXRJ2mQi","SbRYyOxWIH","QClRLjiVBP","NOHszmX2GE","xXTI4HlUbF",
+"ZuDtDTXQ0Z","G1RhS0h1b1","pT8wutAOsr","CNHmvdpe1v","U3yw57fKYU","taOXKciuWz","Z4I1vI7p2a","WPmlxfqypy","d85a9EoToP","5iGN55Mg9r",
+"ni2v1tlILt","M6qcGRkQke","qUJMdn1pmO","FwEJzTCgPp","0BmCyHRxd8","WmadAPOUYS","UmaEvZhwG1","CqqaDnnP8o","8cVD3UmaEv","pvgjSNOHsz",
+"gIYvEblLA9","fFDrJzFgtB","uTacxuZPqg","jeskSCIShG","uPX7GYf2Ec","618DiM6qcG","suY4xpWiOs","vOqCEJkzUn","zQt6QazIWp","RmDcrcShY2",
+"5IhmGuQIcz","QWxoTjSjS3","FcWrWIRh48","GrDg7Qworu","NcICAatef2","K20wKjiVBP","4dEz6dpe1v","1v5hHuTacx","ThjNndpe1v","G1RhSv2eC3",
+"d85a9dmoS7","nlaByGSQwj","SWfouoVQp6","7hyVvMK07Y","K20wKVBjhz","WaWsvQbxXc","FLsphW7cTs","lpF6WOUqFM","ogLgcuN6r3","5ZaEz14FLR",
+"WreyPpvgjS","WPmlxsuY4x","IRh48atef2","8xEKzIn3NS","uvf7AfcwDa","pmeCdaL6AJ","yluBxMojnP","euZA5hYBCK","iB08ld85a9","RmDcr0BmCy",
+"KZamHlViBv","In3NSmX2GE","QworujfREu","ix74rsuY4x","pWiOss7Mxk","Uvlv4GWqqX","0ao3lgf8rI","07n1cb29RJ","45cIHy94nw","FGzgpVprf2",
+"nFqikhSSvQ","F6PT214FLR","VIlwPQnJ1S","k85Ae8TxD7","gf8rIGSQwj","d7vjMJXljW","vLsmSuN6r3","MK07Ylm0pD","VjCZqfcwDa","MmsIo2TRI7",
+"tlILtYw2oU","faHirRmDcr","yvOMIoQ87r","Zv7z0EOE1o","ydG8UQssNC","guMb8W3VFH","0PktIWMiS3","LDk6fIKxdL","dmoS7nFqik","VjCZqNo0Qb",
+"C2IrcZv7z0","2TRI7sqVrf","16lHcVNCPd","rKDLJCfgr3","580YDoQ87r","iKqhrX6Pin","lm0pDlkMUA","J2mQilH1kt","fcJOyeuZA5","0PktIXflUq",
+"lweGyiwzGk","WPmlx9GXkX","580YDni2v1","CxVEffmIK1","atef2atef2","OUYuFsoy9t","VerEAfqypy","LbRTHxReec","Chuy3xXTI4","RzaZAjSjS3",
+"GrDg7lm0pD","IRh48Fhtgl","gIYvEYOfrY","EOE1oO3iyQ","48cHLEdBKc","yEfy9Z4I1v","MezSWWreyP","7fsYMuTacx","bgJAzPOUYS","rz7Ut2ZHdk",
+"kB5nPzqH0W","DcpWBM3zXL","ulk411v5hH","SbRYyvLsmS","QbxXcFwEJz","Vprf2WmadA","pmeCdzFgtB","CqqaDd7vjM","oGu6xZv7z0","zmLYDWaim6",
+"AgJHQsuY4x","NOHsziB08l","OUYuFTa8f6","xReeche9IA","WDVWJJRJQB","W3VFHiKqhr","zbIYY2hEEU","EoToPIRh48","lH1ktdjsrv","7fKYUmz8gx",
+"s93MlpvgjS","2Yz7EjiVBP","J2mQitl72W","ksJbyMGlTF","m4bxUIKxdL","Pb1paCxVEf","0Kyfs9rlg9","dmoS764s8N","k85AejS1aj","aL6AJnFqik",
+"MmsIo55rfB","SjskQYOfrY","JRJQBbgJAz","jzUqRvkCHH","55rfB2ZHdk","O3iyQwiHrZ","hYBCKI7p2a","QworuzQt6Q","AgJHQwDajX","C2IrcMojnP",
+"4QMc9fLNg8","i7WMQIn3NS","7Ow5CMm8si","fFDrJtjQxs","OxWIH9eoRc","NAFuwYjB9t","aFFsszQt6Q","lsQGo5IhmG","QssNCNhXdu","fcJOyS2Dfu",
+"FxX9q3otm6","soy9tX6Pin","14FLRHlUbF","MojnPlXFOB","s7MxkHP433","zQt6Q618Di","b29RJvOqCE","jeskSQChxs","FFDuitjQxs","xReec0PktI",
+"L7cGcJ2mQi","FxX9qlkMUA","cShY2ix74r","5NammlXFOB","vLsmSMm8si","iKqhrMmsIo","EOE1oNOHsz","45cIH55rfB","QnJ1Se6e4z","U3yw5fmIK1",
+"NOHszChuy3","pmeCddpe1v","WPmlxoGu6x","lpF6W9eoRc","Fhtgl2Yz7E","Yh1hF7ku1p","HlUbFYw2oU","oVQp6S2Dfu","bZLvS7fsYM","lm0pD5Drn0",
+"L7cGc7fsYM","dpe1vEoToP","hSSvQQYxC0","lj07QRACuj","IRh48AOgEe","ThjNnBbwgA","x3LDeVBjhz","FnPFBCxVEf","fmIK1IBe8k","fLNg814FLR",
+"HzZT8yluBx","AgJHQpAhR1","7Ow5CazIWp","yofH3m4bxU","tjQxs9eoRc","aDGtS618Di","KZamHO3iyQ","MojnPgtCA5","s93Mlt59lR","ReKEWoVQp6",
+"7X3uyFVMxo","GWqqXRpBQm","9y4lwblLA9","POUYSfcJOy","FGzgpuPX7G","VNCPdTXQ0Z","tl72W6AFT0","dhSuHlj07Q","uAWypv2eC3","6q6L90h1b1",
+"45cIHTa8f6","2hEEUS2Dfu","piJSkzbIYY","ciuWzhE1Ql","48cHLuZPqg","KsjRKzmLYD","AXpwEM3zXL","PYBf4KsjRK","WmadAAkKTk","KsjRKYf2Ec",
+"hSSvQtvdkD","HlUbFIBe8k","Vprf2BFkb8","M6qcGm4bxU","zY1GYNcICA","MojnPpiJSk","hE1QlWMiS3","i7WMQ5drc6","zmLYDdpe1v","e6e4zuJScX",
+"kZANmHP433","n8pJ9EdBKc","5Drn0jSjS3","faHirrhl0J","0PktI07n1c","8cVD3pWiOs","zHF1quvf7A","BbwgAbZLvS","OHaBz9eoRc","JXljWiB08l",
+"s47867hyVv","cL0aEdhSuH","M3zXLprNT6","Uvlv4prNT6","9iGoTuJScX","5VZjSzqH0W","ogLgcjtn0X","prNT62Nslm","DQimpdQ586","0ao3llkMUA",
+"0ao3l7lUXZ","yofH3LewvM","JkzUnpWiOs","uZPqgMmKGJ","cShY2FPfSE","KsjRKv8yFN","2Nslm0Wr5y","D6rBylj07Q","45cIHjzUqR","fcJOyn8pJ9",
+"zQt6Qv8yFN","Cp3mZ5drc6","fcwDaxReec","gIYvE0PktI","8FmFHqUJMd","ZJTXHiKqhr","zz4ZUNxx9V","ReKEWTCgPp","FnPFBxciqp","vLsmSB3qem",
+"OUqFMjSjS3","FGzgpsqVrf","3weIFSjskQ","gjUTulweGy","zz4ZUThjNn","jS1aj0Kyfs","uLtKsQnJ1S","VLTy63otm6","FFDuieuZA5","guMb8s4786",
+"gjUTu618Di","euZA5DLhzM","2Yz7EO3iyQ","fqypytl72W","vOqCE2TRI7","prNT6iKqhr","DcpWBrKDLJ","lH1ktfFDrJ","0PktIfqypy","F6PT2pT8wu",
+"tlILtvOqCE","QChxsjiVBP","VBjhzogLgc","prNT6CqqaD","lj07QG1RhS","dQ586GXdoH","gtCA5e6e4z","GXdoHoGu6x","uLtKse6e4z","mX2GEBFkb8",
+"4dEz6tvdkD","5ZaEzksJby","tAOsrzz4ZU","d85a9DLhzM","Mkgy8CxVEf","QYxC0fLNg8","SjskQLewvM","s7MxkCdyBV","gf8rIcL0aE","9iGoTkZANm",
+"FjHXRK4GS8","bZLvSQnJ1S","AmdQdFFDui","RzaZAGWqqX","CxVEfBpYhV","5NammAIYUu","7lUXZ0PktI","Zv7z0FNYIM","pmeCdOUYuF","8FmFHM3zXL",
+"mX2GEl83Ud","OHaBz0YAGH","tl72WDLhzM","uoStwHzZT8","RACujLDk6f","POUYSFFDui","blLA90BmCy","tlILtVprf2","P6bcgjSjS3","P6bcgsqVrf",
+"24ARFVIlwP","fFDrJFhtgl","IRh48aL6AJ","WreyPfLNg8","X6PinpT8wu","vOqCE3weIF","1j5L83weIF","MmKGJOz8yZ","jSjS3tAOsr","XyPZNydG8U",
+"oQ87rWPmlx","C2IrcKASQ8","mz8gxzY1GY","55rfBqaofN","tlILttaOXK","Vprf2hSSvQ","tjQxsru4UG","uQIcztuDyS","Mm8si48cHL","FcWrWBFkb8",
+"1j5L8K20wK","ogLgcuoStw","ZUnqtfLNg8","l83UdJXljW","bZLvSfFDrJ","cShY2ydG8U","QbxXc29QAz","zbIYYpFrrl","FNYIMVLTy6","QClRLuvf7A",
+"No0QbFxX9q","O3iyQo8Uyd","rhl0JuAWyp","tvdkDoGu6x","CNHmvru4UG","GWqqXlViBv","CxVEfyofH3","64s8NGrDg7","DQimpvLsmS","OxWIHOHaBz",
+"P6bcgzHF1q","fLNg8ZUnqt","Q6hMCG1RhS","U3yw5L7cGc","1LB1LKZamH","F6PT2o8Uyd","QbxXcG1RhS","uoStwyluBx","v8yFNiqv4k","1j5L855rfB",
+"YOfrYO3iyQ","WaWsvvLsmS","SmGzvPOUYS","BbwgAPb1pa","UlU3MXyPZN","Y1mC0LbRTH","DLhzMFxX9q","v8yFNIjTwP","16lHcFxX9q","Twano580YD",
+"oVQp6FjHXR","atef23otm6","d85a9t59lR","JKWYRi7WMQ","VerEApiJSk","kZANmix74r","ni2v1oVQp6","ciuWzulk41","CNHmvv1Hln","nFqiknnP8o",
+"jiVBPzz4ZU","uLtKstAOsr","2TRI7t59lR","fcwDa7fsYM","9eoRc45cIH","jSjS3RkQke","S2Dfu7hyVv","pmeCdGv3Fq","No0QbqUJMd","jfREuogLgc",
+"0Kyfs8xEKz","zz4ZUtvdkD","s4786F6PT2","AXpwEJkzUn","YOfrY14FLR","SmGzvIjTwP","iKqhrW7cTs","XflUqLbRTH","0PktIgIYvE","Nxx9Vlj07Q",
+"dpe1vZUnqt","m4bxUVerEA","v8yFNgIYvE","vkCHHulk41","tuDyS55rfB","pWiOsMaJQs","x3LDehYBCK","C2Irc48cHL","FNYIM0h1b1","2DREsrhl0J",
+"VjCZqFPfSE","Ss0ZuMmKGJ","ru4UGGXdoH","M3zXLCxVEf","2DREsYOfrY","CdyBVgIYvE","hE1QlRzaZA","ZUnqtLewvM","ydG8U9eoRc","LbRTHy94nw",
+"J2mQitvdkD","hE1QlGv3Fq","qaofNVjCZq","gtCA5SWfou","16lHcQClRL","euZA5bZLvS","J2mQiNxx9V","VjCZqMK07Y","WDVWJ8FmFH","Vprf2cmXIX",
+"Ss0Zu5Mg9r","B3qem9rlg9","d85a9NOHsz","StlDJm4bxU","WMiS32ZHdk","07n1cyofH3","2ZHdk9GXkX","8TxD7s93Ml","v8yFN9rlg9","ThjNnDQimp",
+"BpYhVX6Pin","2TRI7ZUnqt","LewvMSs0Zu","kZANmlsQGo","Cfgr3zz4ZU","0MR5XXflUq","AkKTkxciqp","Y1mC0fcJOy","GSQwjMm8si","Cp3mZ7hyVv",
+"uZPqgM6qcG","jiVBPVprf2","e6e4zQWxoT","QClRLuupzk","L7cGcYf2Ec","pWiOslH1kt","o8UydyvOMI","TXQ0ZFnPFB","W3VFHTa8f6","ulk41pFrrl",
+"gIYvEIRh48","BFkb8QYxC0","WreyPuQIcz","DLhzMb29RJ","580YDJJs5m","C2IrcQssNC","cmXIXCdyBV","S77LHs7Mxk","MojnPFNYIM","ZuDtDdjsrv",
+"a00b5ECMvU","CNHmvCp3mZ","24ARFGv3Fq","vLsmSjzUqR","lViBvkB5nP","fLNg816lHc","QssNC3weIF","TCgPpOHaBz","2Yz7EQ6Lix","8RCUAxReec",
+"zQt6QVLTy6","M3zXL9GXkX","tjQxsReKEW","0PktI7lUXZ","Mkgy8n8pJ9","2hEEU7fsYM","taOXKiKqhr","4dEz6KASQ8","lkMUAPb1pa","FGzgpIRh48",
+"euZA5JJs5m","uAWyp48cHL","SjskQWaWsv","a00b5Z4I1v","brhlQtvdkD","AOgEeuLtKs","rKDLJkB5nP","8RCUA2ZHdk","L7cGcHzZT8","580YD45cIH",
+"UlU3MzmLYD","cShY2XflUq","cShY2pmeCd","lH1kts93Ml","9XyT95drc6","4dEz6wDajX","cL0aESmGzv","QClRLRpBQm","POUYS0h1b1","fLNg8Rxrsm",
+"8xEKzHRxd8","tl72WWreyP","lj07QQnJ1S","P6bcgrhl0J","3weIFEoToP","hE1QljSjS3","xXTI4StlDJ","lXFOBI7p2a","Cp3mZiKqhr","aez9yhi5X7",
+"Yw2oUQnJ1S","AIYUulpF6W","cmXIXGSQwj","EdBKcpvgjS","jSjS3K20wK","QClRLIRh48","tvdkD2Nslm","9y4lwUvlv4","uJScX45cIH","4W0Tl3weIF",
+"VjCZquTacx","FGzgpX6Pin","WaWsvS2Dfu","FNYIMjzUqR","7Ow5CzFgtB","Kr8ysdmoS7","zz4ZU2Nslm","XflUqPOUYS","S77LH5iGN5","NOHsz9rlg9",
+"Fhtgl5Namm","QChxsru4UG","0MR5XCdyBV","1j5L8JkzUn","atef2wDajX","0KyfslpF6W","nFqikOz8yZ","0KyfsvkCHH","SjskQ9rlg9","VjCZqnlaBy",
+"lH1ktsoy9t","J2mQigf8rI","45cIHs7Mxk","lCMxy8xEKz","aDGtSjSjS3","uPX7GEoToP","iB08lW7cTs","GWqqXFFDui","RmDcrMkgy8","RzaZAsqVrf",
+"F6PT2VBjhz","SWfousuY4x","m4bxU8xEKz","uJScXW3VFH","0PktIYw2oU","GrDg77fKYU","24ARFuJScX","7X3uy5Drn0","3otm65Namm","gdQsSQ6Lix",
+"YOfrYIBe8k","DQimpZJTXH","2DREsZzJHW","RxrsmjfREu","uTacxjS1aj","CdyBVguMb8","3otm6uJScX","0PktISmGzv","Ta8f6M6qcG","tuDySx3LDe",
+"FxX9qMkgy8","MaJQsNhXdu","dhSuHciuWz","sqVrflpF6W","he9IAwiHrZ","AOgEeZzJHW","7ku1pTa8f6","RACujmX2GE","0MR5XxReec","5VZjSZzJHW",
+"C2Ircuvf7A","cL0aEUl4a1","tjQxs5ZaEz","VIlwPhi5X7","SWfouaez9y","zbIYYuvf7A","vOqCEK20wK","soy9ttuDyS","jzUqRWreyP","AkKTk3otm6",
+"EOE1oTa8f6","WmadAOz8yZ","PYBf4MmsIo","k85AesqVrf","guMb8wiHrZ","Yh1hFK4GS8","gdQsSgIYvE","pFrrlQnJ1S","jtn0XNhXdu","0ao3lQ6hMC",
+"d7vjMfcJOy","kB5nPQWxoT","W7cTspFrrl","d7vjMfaHir","WreyPdhSuH","ciuWz2Yz7E","Y1mC0faHir","BFkb8azIWp","Q6LixlpF6W","9XyT9s7Mxk",
+"LewvMMm8si","iB08luPX7G","ZhwG1o8Uyd","qQxHPCNHmv","oQ87r48cHL","he9IA45cIH","CNHmvVNCPd","tvdkDSWfou","l83Udzz4ZU","L7cGc5Namm",
+"m4bxUAXpwE","Q6hMCjSjS3","yToGWtAOsr","JKWYRvOqCE","aDGtSuJScX","OxWIHU3yw5","JXljWgtCA5","QworuCxVEf","CK5W7tjQxs","QChxsiqv4k",
+"n8pJ9C2Irc","8cVD3ReKEW","lweGyCp3mZ","0Wr5yblLA9","MK07YRACuj","29QAzU3yw5","6q6L9EOE1o","BbwgAMojnP","zmLYD6q6L9","lsQGoQssNC",
+"ZUnqtksJby","t98iWlCMxy","NOHsz2hEEU","No0Qb7fKYU","HP433sqVrf","1j5L8l83Ud","jeskSiB08l","QbxXc9eoRc","sqVrfFjHXR","6AFT0n8pJ9",
+"2Yz7EcQOnv","2hEEUciuWz","uvf7ANxx9V","VjCZqEdBKc","JIqXi3otm6","jiVBPZzJHW","jS1ajIBe8k","mz8gxCqqaD","CNHmv0YAGH","kB5nPi7WMQ",
+"48cHLNOHsz","i3pydpAhR1","POUYSjSjS3","9eoRcTCgPp","VjCZqFnPFB","cmXIXsuY4x","rKDLJni2v1","hE1QlbZLvS","taOXKvOqCE","pWiOsHlUbF",
+"Pb1paazIWp","Uvlv4n8pJ9","faHirPYBf4","dhSuHgjUTu","IRh48G1RhS","iKqhrrz7Ut","S77LHydG8U","K20wKgIYvE","nFqikzQt6Q","7X3uyyluBx",
+"2hEEUjzUqR","d85a9QWxoT","24ARFUl4a1","SWfou5nmWv","Q6LixlCMxy","s93MlAIYUu","2DREs7X3uy","ZzJHWIKxdL","dpe1vIRh48","ydG8U9XyT9",
+"QWxoTHRxd8","S77LHsx5Gl","ydG8ULewvM","FPfSELewvM","16lHcBpYhV","8cVD3580YD","uN6r329QAz","rhl0J48cHL","7X3uyjtn0X","Ta8f6ru4UG",
+"MezSWCK5W7","0PktIC2Irc","29QAzHfyNQ","WreyPjfREu","5NammHlUbF","IBe8kjS1aj","yofH3tlILt","JXljWVjCZq","QChxs14FLR","zqH0WFNYIM",
+"3weIFhe9IA","vOqCEbgJAz","WMiS3qQxHP","y94nwlXFOB","CIShGIjTwP","HlUbFOz8yZ","W7cTsBGaQY","GSQwj1LB1L","8FmFHtlILt","ni2v1OUYuF",
+"faHir5iGN5","jzUqRS2Dfu","HzZT8suY4x","TCgPpFxX9q","MGlTFs4786","PYBf4ZUnqt","QworuVIlwP","tlILtjS1aj","BFkb8QnJ1S","BbwgAjfREu",
+"0KyfsThjNn","6AFT0M6qcG","7hyVvwiHrZ","WmadA0Kyfs","0YAGHyToGW","n1pmOL7cGc","RpBQmIKxdL","okgRi5nmWv","h1zcHKr8ys","YOfrYiwzGk",
+"jfREuaDGtS","JIqXixciqp","9XyT9nlaBy","8xEKzjtn0X","iwzGkUvlv4","jSjS3P6bcg","wiHrZ1LB1L","tAOsr5ZaEz","BpYhVzFgtB","45cIHs93Ml",
+"guMb8okgRi","aDGtSTwano","lkMUAjtn0X","X6Pinsoy9t","ThjNnbZLvS","F6PT2S2Dfu","HfyNQblLA9","gdQsSEOE1o","NcICAbgJAz","tl72WuQIcz",
+"Vprf20Wr5y","nnP8oUmaEv","kZANmrz7Ut","KASQ8RmDcr","tjQxs8U2nU","3otm6oQ87r","X6Pind7vjM","OHaBzHlUbF","UlU3MfaHir","ZhwG1vLsmS",
+"lsQGoDcpWB","h1zcHWaWsv","Q6hMCogLgc","0MR5X8U2nU","lpF6WYjB9t","uvf7AtaOXK","yofH3RpBQm","d85a97fKYU","FcWrWFhtgl","IKxdLDLhzM",
+"ZhwG1QClRL","AkKTklH1kt","piJSkgtCA5","8xEKzKr8ys","In3NSUl4a1","8RCUAm4bxU","5drc67ku1p","POUYS2DREs","kZANmk85Ae","3weIFv1Hln",
+"fcwDaFLsph","ThjNnHlUbF","ogLgcd7vjM","WreyPSWfou","8cVD3W3VFH","FnPFBgjUTu","yluBxokgRi","MaJQsyofH3","5nmWvjS1aj","2DREs8FmFH",
+"iwzGkK20wK","DLhzMuZPqg","OUqFMJXljW","GSQwjRxrsm","kB5nPv1Hln","piJSk4W0Tl","xciqpFFDui","v8yFNqaofN","ydG8UpT8wu","B3qem580YD",
+"POUYSMmKGJ","SmGzvyvOMI","5drc6brhlQ","v8yFNm4bxU","tlILti3pyd","zY1GYlXFOB","jeskStaOXK","QssNC5Mg9r","t98iWQClRL","5Drn0HzZT8",
+"8RCUAQWxoT","v8yFNwiHrZ","618DiMaJQs","16lHcyofH3","CxVEf4W0Tl","hE1QlChuy3","VBjhzatef2","AkKTkd85a9","YjB9tSs0Zu","uoStwuoStw",
+"cL0aEXyPZN","s4786S2Dfu","WMiS3M6qcG","cL0aEsoy9t","iqv4kCqqaD","d7vjMPb1pa","6q6L9BFkb8","5iGN5FwEJz","tl72W5IhmG","v8yFNY1mC0",
+"07n1cdhSuH","ZhwG1aFFss","JXljWS2Dfu","ReKEWpiJSk","nFqikJ2mQi","atef21v5hH","2hEEUVIlwP","HlUbF5Namm","mX2GEZzJHW","7fsYMcmXIX",
+"8xEKz7fKYU","ni2v1HP433","LDk6fYf2Ec","Waim6aFFss","t59lRoQ87r","i3pyd7fsYM","16lHcogLgc","tjQxsd85a9","16lHc55rfB","dQ586WPmlx",
+"kZANm29QAz","Yh1hFfcwDa","7fsYMNhXdu","Zv7z0IRh48","LbRTHDG4sT","FjHXR3weIF","Zv7z0QssNC","pWiOsjSjS3","gjUTuydG8U","45cIHxReec",
+"BFkb8XflUq","k85AeBFkb8","lkMUAfFDrJ","hUTw7GSQwj","Zv7z06AFT0","QnJ1SFLsph","TCgPp7hyVv","7fKYUJXljW","SjskQksJby","VerEAvkCHH",
+"AIYUu9iGoT","SjskQpT8wu","VjCZqvkCHH","L7cGcCNHmv","b29RJNOHsz","blLA9nFqik","TXQ0ZO3iyQ","yToGWCK5W7","GWqqX5drc6","0h1b15Namm",
+"5IhmG7Ow5C","FNYIMzY1GY","xciqpHlUbF","blLA964s8N","SWfoud85a9","hE1QldQ586","fFDrJLewvM","atef2RmDcr","OHaBztjQxs","d7vjMi7WMQ",
+"IKxdLKr8ys","iKqhrv2eC3","0YAGH5iGN5","jtn0X580YD","9GXkXpWiOs","lj07Q55rfB","zFgtB5Drn0","HRxd8S2Dfu","IBe8kZ4I1v","wiHrZfmIK1",
+"gdQsStuDyS","ReKEW3weIF","2Nslm0ao3l","0ao3lv1Hln","wDajX0PktI","VBjhzRmDcr","fLNg8RACuj","s7MxkzHF1q","Chuy3CdyBV","Mm8sidpe1v",
+"OxWIHECMvU","5drc6uJScX","fFDrJ5ZaEz","J2mQinFqik","0BmCyZuDtD","lCMxyCp3mZ","brhlQWMiS3","BbwgAYf2Ec","v8yFNi3pyd","OxWIH9y4lw",
+"ThjNnfmIK1","48cHLhE1Ql","pv0i7RkQke","tl72WogLgc","8TxD7pWiOs","BbwgAYOfrY","tjQxsNAFuw","M6qcGMK07Y","HP433blLA9","XflUqIRh48",
+"ix74r618Di","QWxoTAgJHQ","JXljWSWfou","Nxx9VFLsph","lCMxy0ao3l","v1HlnNcICA","QbxXcUl4a1","JKWYR8FmFH","QClRLo8Uyd","ZuDtDAIYUu",
+"uupzkTa8f6","6q6L9IjTwP","b29RJVprf2","gf8rIZ4I1v","qQxHPKsjRK","hi5X7KZamH","64s8NpWiOs","jiVBP5Mg9r","0MR5XuoStw","tjQxsBGaQY",
+"LbRTHK20wK","8xEKzHzZT8","0ao3lCK5W7","WDVWJAmdQd","7hyVvFPfSE","FLsphzmLYD","ZJTXHv2eC3","O3iyQfaHir","YOfrYVprf2","yToGWbrhlQ",
+"CdyBVCp3mZ","pFrrllsQGo","wDajXfmIK1","aez9yFFDui","qUJMd8U2nU","a00b5tjQxs","M6qcGSbRYy","mz8gxuupzk","2ZHdkWreyP","ECMvU7ku1p",
+"K4GS8bZLvS","7hyVvuZPqg","0KyfsmX2GE","cL0aEtl72W","soy9tdpe1v","pWiOsDcpWB","k85AeCdyBV","8RCUA3weIF","BFkb8k85Ae","Gv3FqZ4I1v",
+"fFDrJ9iGoT","7fsYMbgJAz","gIYvEJ2mQi","faHir7fsYM","X6Pin1j5L8","MezSWQ6Lix","dmoS7HlUbF","VjCZqECMvU","jSjS3zqH0W","azIWpAmdQd",
+"FLsphRxrsm","uoStwCNHmv","faHirHP433","lm0pDTa8f6","ZUnqtUl4a1","4dEz6zz4ZU","SbRYyHlUbF","AOgEegjUTu","nlaBy4W0Tl","gtCA5tuDyS",
+"yEfy9FNYIM","POUYSyToGW","CNHmvcmXIX","jSjS3zz4ZU","s93MlksJby","F6PT2B3qem","29QAz8TxD7","QWxoTFjHXR","FhtglPYBf4","aFFssqaofN",
+"pFrrl5Drn0","fcwDaOHaBz","TCgPpydG8U","fcJOyVprf2","fmIK1vLsmS","CNHmvdmoS7","jS1ajYw2oU","AmdQdBGaQY","Dz1R39y4lw","djsrvydG8U",
+"16lHct59lR","8U2nUm4bxU","QWxoTuupzk","jSjS3t59lR","jeskSjS1aj","FGzgp9iGoT","FjHXRfFDrJ","Vprf207n1c","b29RJSs0Zu","SWfouRBhp0",
+"he9IAv8yFN","MK07YAgJHQ","ydG8UhE1Ql","2Yz7E7fKYU","s4786s4786","LDk6f2ZHdk","uAWyp4QMc9","8hJdt618Di","KsjRKFVMxo","Yw2oUBFkb8",
+"lXFOBY1mC0","CxVEfguMb8","5Drn0xXTI4","TXQ0ZfFDrJ","ZJTXHWaWsv","uoStwbgJAz","0KyfshE1Ql","tl72Wh1zcH","iwzGkMmKGJ","pFrrl5IhmG",
+"7X3uyNxx9V","zqH0WW7cTs","MK07YMmKGJ","VIlwPSjskQ","KZamHStlDJ","y94nwzY1GY","OxWIHpv0i7","VNCPdcShY2","0PktIQWxoT","ogLgccmXIX",
+"Vprf27Ow5C","Yf2EclCMxy","ydG8UY1mC0","45cIHlj07Q","DG4sTHRxd8","QnJ1Sdpe1v","LbRTHFPfSE","zz4ZUO3iyQ","fcwDauN6r3","2ZHdkPOUYS",
+"dQ586iwzGk","prNT67lUXZ","uupzk5iGN5","JKWYRxXTI4","hSSvQXyPZN","uQIczQClRL","S2DfukZANm","JRJQBwDajX","piJSknnP8o","cL0aE0Kyfs",
+"yToGWFjHXR","RzaZA1v5hH","s4786s7Mxk","t59lRlXFOB","5Drn0OxWIH","guMb8Cp3mZ","Yw2oUlpF6W","618DiIKxdL","Chuy3hE1Ql","Pb1papmeCd",
+"iwzGkwiHrZ","n1pmO7fKYU","6q6L9gIYvE","M6qcG8U2nU","QClRLChuy3","fLNg8fFDrJ","GWqqXFwEJz","zqH0W0Wr5y","ZJTXH0YAGH","FwEJzCNHmv",
+"7lUXZNAFuw","ix74roQ87r","EdBKcIKxdL","oQ87rAOgEe","4QMc955rfB","Yw2oUChuy3","7lUXZRxrsm","5Drn0ZhwG1","MGlTFRACuj","aDGtSNhXdu",
+"lpF6WQssNC","OUqFMFLsph","pv0i7n8pJ9","Dz1R3DLhzM","W7cTsoVQp6","Gv3Fqrz7Ut","lkMUAFGzgp","9rlg9Gv3Fq","n1pmOaDGtS","OxWIHMaJQs",
+"DLhzMcQOnv","MojnPiwzGk","kZANmJ2mQi","soy9te6e4z","vOqCEThjNn","MezSWVNCPd","618DiAmdQd","24ARFS77LH","G1RhSOHaBz","FFDui5Namm",
+"CIShG580YD","lkMUAEdBKc","GWqqXDQimp","blLA9NhXdu","S77LHJ2mQi","24ARFQChxs","7hyVvQYxC0","ksJby2TRI7","0Wr5yOxWIH","BGaQYblLA9",
+"guMb8VNCPd","FLsphdmoS7","2ZHdkn8pJ9","5NammMojnP","0Wr5ydjsrv","ZhwG1wDajX","Gv3FqjS1aj","soy9tFjHXR","0KyfszbIYY","Uvlv45ZaEz",
+"FwEJzzmLYD","fLNg8t59lR","qUJMdxXTI4","QYxC0rhl0J","gjUTuU3yw5","OHaBzoQ87r","2NslmpAhR1","9y4lwFjHXR","QChxsGXdoH","tjQxsStlDJ",
+"ulk41AkKTk","WDVWJSbRYy","In3NSjtn0X","5Drn0Q6Lix","fcJOy24ARF","dQ586tlILt","SbRYyuN6r3","7ku1p1LB1L","2ZHdkUvlv4","soy9tDLhzM",
+"Qworurz7Ut","XyPZNStlDJ","I7p2aVIlwP","FcWrWdjsrv","Q6LixjeskS","i7WMQlweGy","v8yFN2Nslm","qQxHPuQIcz","Y1mC0ZhwG1","QworufmIK1",
+"9XyT9K4GS8","5ZaEzThjNn","fFDrJcShY2","5nmWvnnP8o","blLA9RBhp0","DcpWBS2Dfu","wDajXuQIcz","cShY25drc6","lCMxy5iGN5","Pb1paZzJHW",
+"Pb1parhl0J","s4786ZJTXH","mX2GEM6qcG","uoStwatef2","7lUXZvOqCE","m4bxUdjsrv","GWqqXCxVEf","ZUnqtWmadA","faHirCp3mZ","yofH3xciqp",
+"pvgjS29QAz","iwzGk1j5L8","ogLgcfcwDa","QWxoTi7WMQ","7hyVvl83Ud","ksJby8U2nU","K4GS8BbwgA","IjTwPJKWYR","BpYhVhe9IA","7ku1pOUqFM",
+"WreyPzQt6Q","tvdkDd85a9","5nmWvM6qcG","gtCA5Chuy3","Yw2oUyEfy9","euZA5U3yw5","vOqCEtAOsr","IKxdL55rfB","ReKEWSmGzv","OUYuF0h1b1",
+"i3pydlweGy","8U2nUy94nw","6q6L9JXljW","uAWypJIqXi","LewvMNOHsz","2ZHdkfLNg8","gjUTupv0i7","cShY2IRh48","TCgPpuAWyp","atef2ciuWz",
+"hUTw7wDajX","8TxD79y4lw","cShY2b29RJ","nFqik0ao3l","xXTI4KsjRK","MK07YjS1aj","5NammY1mC0","IKxdLhSSvQ","FPfSEBFkb8","pvgjSS77LH",
+"lViBvSjskQ","VerEAmz8gx","JIqXiBCxeC","lViBvW3VFH","ZuDtDMmKGJ","cL0aEksJby","v1Hln5drc6","RzaZAB3qem","Z4I1vmz8gx","DLhzMMmKGJ",
+"L7cGciB08l","hSSvQ9XyT9","WreyPIRh48","ix74rCK5W7","gjUTugdQsS","azIWpWaWsv","i3pyd0YAGH","ydG8UChuy3","xXTI4M6qcG","nlaByAgJHQ",
+"ksJbyi7WMQ","Mm8sipvgjS","2ZHdkEdBKc","jtn0XL7cGc","n1pmOG1RhS","pv0i7he9IA","yvOMIulk41","NAFuwnlaBy","WPmlx7hyVv","S77LHzqH0W",
+"aDGtSzbIYY","jeskSRsQUq","AgJHQKsjRK","5drc62hEEU","QbxXcVerEA","7X3uyDLhzM","WreyPnnP8o","0BmCyk85Ae","8RCUAjzUqR","0Wr5yYh1hF",
+"2DREsNhXdu","HRxd8uTacx","M6qcGBbwgA","IjTwPYh1hF","L7cGc4dEz6","64s8NazIWp","MmKGJ8hJdt","AIYUunnP8o","v1Hln7fsYM","tjQxsuZPqg",
+"k85AehUTw7","WMiS3IRh48","tAOsrG1RhS","gdQsSCp3mZ","atef2WDVWJ","ECMvUWMiS3","8xEKzK4GS8","ZuDtDlj07Q","lkMUAFLsph","FnPFBpmeCd",
+"WreyPZ4I1v","2ZHdkOHaBz","2Yz7EDz1R3","QnJ1SpAhR1","hE1QlwiHrZ","P6bcgaDGtS","ksJbyUlU3M","7hyVvCNHmv","0Kyfs6q6L9","s4786xXTI4",
+"0KyfsM3zXL","uupzksqVrf","HlUbFAmdQd","FGzgpWMiS3","ReKEWlpF6W","d7vjMd7vjM","zz4ZUCp3mZ","4QMc9S2Dfu","fFDrJJkzUn","rhl0JWDVWJ",
+"oVQp6Fhtgl","fFDrJfcJOy","v8yFNW3VFH","5IhmGqUJMd","y94nw0MR5X","16lHcqaofN","iB08lxReec","cmXIX618Di","FjHXREdBKc","M3zXL2Nslm",
+"pmeCde6e4z","uJScX7hyVv","EdBKcZUnqt","pv0i7FjHXR","In3NSTXQ0Z","tAOsrhSSvQ","gdQsS580YD","M3zXL24ARF","9y4lwfmIK1","DcpWBDz1R3",
+"wDajXHzZT8","Ul4a1B3qem","Kr8ysx3LDe","3weIFYh1hF","7ku1pcmXIX","s93MlcmXIX","7hyVvqUJMd","Dz1R39eoRc","jiVBPThjNn","h1zcHFLsph",
+"gIYvEIKxdL","P6bcgWMiS3","vkCHHzz4ZU","RsQUqvkCHH","lsQGoi7WMQ","gIYvEnFqik","fmIK19rlg9","FFDui7hyVv","rhl0JOHaBz","I7p2alH1kt",
+"SbRYy9rlg9","UlU3MuLtKs","guMb8uAWyp","S2DfujfREu","mX2GEIjTwP","AXpwEatef2","JIqXitl72W","vOqCE2DREs","ThjNnGWqqX","vOqCEY1mC0",
+"guMb8bgJAz","e6e4z7hyVv","CIShG5ZaEz","JJs5mFjHXR","Cp3mZzFgtB","VerEANOHsz","fcJOy4W0Tl","EOE1oP6bcg","HP433U3yw5","Q6LixtjQxs",
+"XflUqiwzGk","pAhR1pv0i7","OxWIHn8pJ9","hYBCK24ARF","oGu6xIBe8k","JIqXilpF6W","hE1QlhUTw7","SjskQ0ao3l","pFrrlpv0i7","jS1ajEdBKc",
+"7fKYU2hEEU","HRxd8CqqaD","d7vjMJIqXi","9iGoTBCxeC","MK07Y8xEKz","bZLvS2DREs","lH1ktChuy3","WMiS3lkMUA","VIlwPMezSW","Kr8ysh1zcH",
+"CK5W70PktI","45cIH9y4lw","wDajXqQxHP","L7cGc8xEKz","VIlwPEoToP","JXljWThjNn","Vprf2iwzGk","8TxD78xEKz","HP433cL0aE","FnPFBzmLYD",
+"QnJ1Sv8yFN","zmLYDn1pmO","FPfSE8RCUA","yvOMIStlDJ","7fKYUazIWp","lm0pDZUnqt","WreyPbgJAz","Zv7z0k85Ae","RmDcr8U2nU","aFFssmz8gx",
+"tl72WtAOsr","RACuj7Ow5C","d7vjMdmoS7","W7cTssoy9t","jtn0XY1mC0","2ZHdk5Namm","iwzGksqVrf","X6Pin4dEz6","zqH0WtaOXK","iwzGkYOfrY",
+"dpe1v45cIH","gf8rIy94nw","2hEEUQ6hMC","Uvlv4BFkb8","lj07QBbwgA","atef2FcWrW","hSSvQ8cVD3","lViBvuZPqg","ciuWzOUYuF","bZLvSazIWp",
+"oVQp6dQ586","fFDrJ580YD","pWiOslm0pD","GWqqXKZamH","jSjS3ydG8U","zHF1qzqH0W","t59lRKr8ys","HfyNQQworu","8TxD7yToGW","QnJ1SuQIcz",
+"jSjS3OUqFM","5nmWvlm0pD","ni2v1x3LDe","s7Mxk8hJdt","CxVEflm0pD","CqqaD16lHc","9eoRclCMxy","pv0i7tAOsr","ECMvUsx5Gl","45cIHvOqCE",
+"NhXdu0PktI","nlaByWDVWJ","BGaQYGWqqX","brhlQ8xEKz","SbRYysuY4x","mX2GElXFOB","xXTI4GSQwj","8U2nUYOfrY","ZuDtDXyPZN","WreyP7ku1p",
+"QClRLSWfou","bgJAz5iGN5","QWxoTJkzUn","CxVEfQnJ1S","rKDLJBpYhV","cmXIXuJScX","IjTwPUvlv4","AgJHQyluBx","n8pJ9NhXdu","29QAzChuy3",
+"rz7Ut580YD","KZamHQYxC0","yEfy9tjQxs","Q6hMCulk41","580YDWMiS3","TXQ0ZbgJAz","vOqCE9eoRc","Mkgy8WPmlx","lm0pDzz4ZU","zqH0WWaWsv",
+"IKxdLzmLYD","G1RhSqUJMd","n8pJ9a00b5","IKxdLdpe1v","618DiNcICA","pWiOsix74r","hSSvQjS1aj","2Yz7Exciqp","I7p2akZANm","MezSW7lUXZ",
+"0MR5XJRJQB","zqH0WrKDLJ","K4GS8lsQGo","JRJQBaDGtS","FxX9qhE1Ql","Yw2oUtl72W","AmdQdNAFuw","FxX9qnFqik","1LB1LOz8yZ","SmGzvWDVWJ",
+"lXFOB2hEEU","SjskQeuZA5","SjskQlH1kt","VLTy629QAz","BpYhVAIYUu","M3zXL580YD","atef2jzUqR","J2mQiVerEA","Nxx9VazIWp","uJScXCK5W7",
+"FGzgpfLNg8","oVQp6tjQxs","lpF6Ws4786","AgJHQThjNn","7fKYUFnPFB","TCgPp8FmFH","8cVD35IhmG","ZUnqtG1RhS","sx5GlReKEW","nnP8ohSSvQ",
+"7Ow5CAXpwE","LewvMKASQ8","fLNg8e6e4z","FVMxopAhR1","1j5L8UlU3M","Y1mC0tjQxs","FnPFBQssNC","Q6hMC9rlg9","L7cGcfqypy","zFgtB1LB1L",
+"yEfy9SmGzv","gtCA5IjTwP","CxVEfuQIcz","0YAGHlm0pD","VBjhz4dEz6","J2mQiqUJMd","guMb8JkzUn","In3NSKZamH","fmIK1n8pJ9","lXFOBAIYUu",
+"W7cTs0Kyfs","Uvlv407n1c","2ZHdktaOXK","AgJHQciuWz","29QAzMmsIo","oQ87rzz4ZU","FGzgpuJScX","xciqp1v5hH","bgJAzCp3mZ","45cIHlXFOB",
+"gIYvE9rlg9","MK07YGWqqX","ECMvUSWfou","9iGoTHzZT8","QChxsCIShG","yvOMIAOgEe","C2IrcFwEJz","0Wr5yWmadA","GXdoHVNCPd","lweGytaOXK",
+"3otm6J2mQi","5drc6uZPqg","8U2nUuZPqg","LewvMKZamH","euZA50Wr5y","nFqikdmoS7","sqVrf55rfB","piJSk8hJdt","Uvlv49XyT9","LewvMuZPqg",
+"QssNC0BmCy","BpYhVAmdQd","djsrvNcICA","C2Irc8U2nU","Chuy3fLNg8","CqqaDpWiOs","QChxsTwano","TXQ0Zgf8rI","atef25iGN5","BpYhVRsQUq",
+"wDajXGv3Fq","5drc6mX2GE","2TRI79XyT9","1LB1LIBe8k","k85AeIKxdL","MmKGJpmeCd","POUYS618Di","FVMxojSjS3","Yh1hFuPX7G","2Yz7EMm8si",
+"Kr8ystvdkD","NcICAQChxs","0BmCyJIqXi","uZPqg9y4lw","pT8wux3LDe","zbIYYtAOsr","WaWsvUmaEv","gjUTuuupzk","MaJQs4QMc9","IKxdLyluBx",
+"BpYhVs93Ml","ciuWzcQOnv","14FLRguMb8","lCMxyTa8f6","hSSvQsx5Gl","7fKYUfcJOy","HzZT8h1zcH","Y1mC07X3uy","NhXduKZamH","MojnPDG4sT",
+"Z4I1vU3yw5","fFDrJKsjRK","ReKEWLewvM","QYxC0CK5W7","ciuWz9eoRc","e6e4z5IhmG","GrDg7J2mQi","DLhzMaDGtS","IBe8kRBhp0","LbRTHC2Irc",
+"7X3uy8U2nU","lweGy0h1b1","xReecGWqqX","NAFuwt59lR","BGaQYnlaBy","k85AeHlUbF","BFkb8L7cGc","Gv3Fq9eoRc","FnPFB5Namm","DcpWB4QMc9",
+"SbRYy9eoRc","tAOsre6e4z","lweGyZzJHW","VerEAAIYUu","jfREuOz8yZ","618DizmLYD","BFkb8WreyP","DG4sTECMvU","2TRI7Y1mC0","jtn0XECMvU",
+"Chuy35IhmG","FwEJzuvf7A","i3pydksJby","RzaZA580YD","prNT60YAGH","wiHrZ9GXkX","y94nwTXQ0Z","okgRi4W0Tl","i3pydMojnP","jtn0Xl83Ud",
+"BCxeCzz4ZU","FhtglBbwgA","QworubgJAz","xReecVIlwP","uPX7GfmIK1","Chuy3SmGzv","MojnPHlUbF","CNHmvPYBf4","CIShGU3yw5","RACujuLtKs",
+"Mkgy8Fhtgl","TwanoguMb8","VBjhzFwEJz","tvdkDB3qem","ZUnqtpT8wu","9y4lwSmGzv","o8UydDQimp","GrDg71j5L8","guMb8xReec","h1zcHFGzgp",
+"k85AeCK5W7","BGaQYzmLYD","zHF1qoGu6x","gjUTuSmGzv","ZuDtDHP433","lViBv24ARF","vkCHHlXFOB","QworuDz1R3","v2eC3Nxx9V","v8yFNpiJSk",
+"580YDB3qem","mX2GE0h1b1","tAOsraez9y","FFDuixciqp","CK5W7UlU3M","hSSvQ5Namm","5VZjSCqqaD","soy9tYjB9t","FVMxoRkQke","8U2nU0PktI",
+"HfyNQZJTXH","F6PT2lCMxy","x3LDe8FmFH","ZUnqtcmXIX","jSjS3x3LDe","5IhmGU3yw5","djsrvAgJHQ","1v5hHqaofN","kB5nP5Namm","KZamHksJby",
+"oGu6x2DREs","MmsIo5Namm","HRxd89iGoT","uoStwaez9y","LbRTHFnPFB","FcWrWJJs5m","5Mg9rGv3Fq","cQOnve6e4z","uN6r3aFFss","fqypyKASQ8",
+"CdyBVYw2oU","jtn0XqaofN","CIShGaDGtS","OUYuFCqqaD","SWfouix74r","uoStwe6e4z","lH1kta00b5","i7WMQReKEW","JRJQBTa8f6","ulk419iGoT",
+"fFDrJUvlv4","0MR5X3weIF","MojnP7Ow5C","yluBxjS1aj","SmGzv2DREs","1LB1LzFgtB","SjskQ8TxD7","0Kyfsx3LDe","GWqqX3otm6","YOfrYWreyP",
+"euZA5d85a9","aFFssWmadA","vOqCEGXdoH","Zv7z0yvOMI","C2IrcOUqFM","rhl0J5Mg9r","t98iW0Kyfs","aL6AJo8Uyd","BFkb8uAWyp","fFDrJ7lUXZ",
+"9y4lwM3zXL","soy9tYf2Ec","yofH3RmDcr","ThjNndmoS7","CK5W7sqVrf","0KyfsFGzgp","14FLRjSjS3","QYxC0bgJAz","y94nwFwEJz","uAWypdmoS7",
+"oQ87rHRxd8","v8yFNQChxs","7ku1p16lHc","ZzJHWx3LDe","ksJbyCNHmv","IRh48fcJOy","7fsYMC2Irc","gIYvE0Kyfs","guMb8ru4UG","VerEAgtCA5",
+"uoStw0MR5X","0Wr5yqaofN","PYBf4MaJQs","uN6r3nlaBy","7fsYML7cGc","k85Aeo8Uyd","gIYvEwiHrZ","fqypyRzaZA","ThjNnVLTy6","HP433FGzgp",
+"blLA9pAhR1","djsrvm4bxU","0KyfsJKWYR","AkKTkdmoS7","jS1ajOxWIH","vLsmSatef2","lm0pDzQt6Q","9iGoTBpYhV","5iGN5azIWp","FnPFBJRJQB",
+"DLhzMZhwG1","1v5hHtvdkD","uupzkKsjRK","0Wr5yxReec","S2DfuVjCZq","m4bxU4W0Tl","t98iWpAhR1","lXFOBTwano","OUqFMHRxd8","MmsIo5nmWv",
+"pT8wu5drc6","W7cTsRxrsm","7Ow5Cb29RJ","Mm8siXflUq","uPX7G2Nslm","Twano1LB1L","t98iWlweGy","uN6r3BpYhV","tjQxsYw2oU","WaWsvdpe1v",
+"1LB1L64s8N","GXdoHSbRYy","Ta8f6jSjS3","RkQkeuAWyp","m4bxUChuy3","In3NSFVMxo","soy9thE1Ql","tl72W8xEKz","I7p2auLtKs","suY4xpT8wu",
+"brhlQbgJAz","x3LDeAmdQd","bZLvSulk41","pFrrldmoS7","5ZaEzsx5Gl","gdQsSQssNC","sx5GlIBe8k","VBjhzVjCZq","xXTI4JkzUn","Kr8ysECMvU",
+"sx5GlpWiOs","7X3uyStlDJ","AXpwEK4GS8","FjHXRo8Uyd","QYxC07Ow5C","2ZHdkjeskS","7fKYUWDVWJ","MaJQslViBv","iqv4kWaim6","pv0i7kB5nP",
+"v1Hln5nmWv","8U2nUbrhlQ","jS1ajuupzk","x3LDek85Ae","9GXkXQssNC","tuDySRxrsm","FVMxouvf7A","ni2v1xciqp","FxX9qmz8gx","cL0aEs7Mxk",
+"0MR5XkB5nP","e6e4zUl4a1","Pb1pas7Mxk","4dEz6n8pJ9","CIShG0ao3l","3otm6lm0pD","GXdoHS77LH","VLTy6aFFss","0h1b1nnP8o","uZPqg8U2nU",
+"jfREuNxx9V","FnPFB2TRI7","hUTw7Yh1hF","7fsYMsuY4x","fcJOygtCA5","nlaByMm8si","MmsIoi7WMQ","n1pmO8xEKz","tvdkD3otm6","iwzGko8Uyd",
+"KASQ8uZPqg","pWiOsJXljW","B3qemXyPZN","RACujkB5nP","zbIYY5drc6","rz7UtzHF1q","WreyP8RCUA","fqypyEdBKc","WDVWJazIWp","NhXduAXpwE",
+"Nxx9VNAFuw","QWxoTRpBQm","VLTy6ru4UG","pmeCdReKEW","ZhwG1gtCA5","he9IAJkzUn","ksJbyRzaZA","yofH3NcICA","nlaByjS1aj","k85AeUmaEv",
+"No0Qb7ku1p","FFDuiK20wK","7lUXZ5ZaEz","NOHszaL6AJ","pv0i7KASQ8","YjB9tHzZT8","MojnPOUqFM","LDk6fuupzk","QWxoT8hJdt","EOE1o55rfB",
+"ulk41qQxHP","lkMUAuTacx","zbIYYRkQke","fFDrJqaofN","fFDrJ16lHc","cmXIXEOE1o","QssNCprNT6","faHir7ku1p","kZANmJJs5m","Chuy3CNHmv",
+"fcwDapiJSk","m4bxUKASQ8","uLtKstaOXK","24ARFCfgr3","BpYhVOUYuF","mX2GE7fsYM","AmdQdVjCZq","zY1GY07n1c","uAWypJRJQB","pvgjSkZANm",
+"suY4xtAOsr","gjUTu9GXkX","9rlg9bZLvS","OUYuFiqv4k","pvgjSW7cTs","SjskQfLNg8","dmoS7BbwgA","Mm8siK4GS8","2Nslm55rfB","RmDcrlj07Q",
+"7Ow5C7Ow5C","J2mQi9eoRc","DcpWB5IhmG","AgJHQi7WMQ","pAhR1n8pJ9","IjTwPKASQ8","e6e4zW3VFH","lm0pDDQimp","ECMvU0Kyfs","x3LDeSbRYy",
+"LDk6fcL0aE","pmeCdUl4a1","KASQ80Kyfs","FjHXRBbwgA","3weIFm4bxU","wiHrZMojnP","Zv7z0oVQp6","uoStwuN6r3","y94nwNOHsz","jS1ajCxVEf",
+"P6bcg7X3uy","FwEJz618Di","LDk6fQssNC","55rfBMezSW","5drc6QChxs","Yh1hFRBhp0","gIYvElsQGo","ZUnqtydG8U","uQIczulk41","Oz8yZW7cTs",
+"faHirCqqaD","K20wKFFDui","s4786t98iW","RzaZAzbIYY","7Ow5CFNYIM","NOHszFnPFB","9XyT9v1Hln","J2mQifLNg8","IjTwPJkzUn","IKxdLuN6r3",
+"lsQGoatef2","kZANmcL0aE","FcWrWuZPqg","7fsYMxXTI4","BFkb8FLsph","EdBKcGWqqX","580YD9GXkX","yofH3FLsph","Vprf2FVMxo","M6qcG7ku1p",
+"dQ586he9IA","2DREsIKxdL","zz4ZUQ6Lix","MojnPuupzk","IKxdLQClRL","LewvMuN6r3","0h1b1W3VFH","jeskSjSjS3","FFDuiNhXdu","prNT6lkMUA",
+"FhtglNAFuw","Q6Lixb29RJ","Yw2oU07n1c","G1RhSRzaZA","Q6LixzQt6Q","1v5hHaez9y","m4bxUHfyNQ","7hyVvQWxoT","aFFsslViBv","RzaZAKr8ys",
+"xReec0ao3l","FnPFBJkzUn","AkKTkqaofN","Waim6KZamH","IRh48QYxC0","X6Pin2TRI7","uTacxkZANm","HfyNQD6rBy","hE1QlcQOnv","ru4UGM6qcG",
+"1LB1LfaHir","45cIHpmeCd","F6PT2pmeCd","CqqaD4dEz6","RxrsmFhtgl","UlU3MOHaBz","RBhp00MR5X","Yw2oUQworu","lH1ktEdBKc","GXdoHPb1pa",
+"e6e4zmz8gx","FxX9q1v5hH","Mkgy8y94nw","fmIK17ku1p","LbRTHlCMxy","aez9yMm8si","GWqqXtlILt","jeskSuQIcz","suY4xbZLvS","2ZHdkgjUTu",
+"Oz8yZ1v5hH","Ul4a1KsjRK","Vprf2FwEJz","QworuiwzGk","nnP8onFqik","l83UdtuDyS","BbwgA9eoRc","m4bxUfcwDa","2TRI7WmadA","2NslmnFqik",
+"VLTy6B3qem","jeskSlsQGo","5ZaEzjSjS3","IKxdLguMb8","Cp3mZFGzgp","Cfgr3Fhtgl","gjUTuFLsph","618DimX2GE","prNT6Kr8ys","DQimp7X3uy",
+"v8yFN2TRI7","l83UdoQ87r","suY4xFGzgp","LewvMMezSW","7fKYUcL0aE","jfREux3LDe","M3zXLfFDrJ","4dEz6Mm8si","pv0i7RpBQm","YOfrYFLsph",
+"MojnPWreyP","VBjhz1v5hH","lj07QSmGzv","Y1mC0QbxXc","he9IAblLA9","hSSvQOz8yZ","CNHmvTwano","RBhp0Kr8ys","580YDDQimp","LDk6flkMUA",
+"kZANmW3VFH","Rxrsmx3LDe","xciqp2ZHdk","jSjS3lH1kt","s7MxkS2Dfu","CdyBVjSjS3","yluBxJ2mQi","uZPqgAOgEe","4dEz67fKYU","tl72WAkKTk",
+"I7p2aK20wK","VIlwPpvgjS","GWqqX7ku1p","kZANm4W0Tl","tl72WgdQsS","JJs5mBGaQY","iB08l0PktI","uLtKs5nmWv","rhl0JK20wK","ReKEWOUYuF",
+"5VZjSyofH3","qUJMd29QAz","cShY24dEz6","QWxoTtjQxs","0MR5Xn1pmO","W7cTsfLNg8","7lUXZiwzGk","3weIFDz1R3","BFkb8DLhzM","e6e4z14FLR",
+"D6rByuZPqg","SmGzvuupzk","uTacxQYxC0","qUJMdTXQ0Z","o8UydWMiS3","Y1mC0uTacx","ECMvURBhp0","Vprf2FNYIM","WPmlxQnJ1S","tuDySoVQp6",
+"5drc6xXTI4","Qworu9GXkX","suY4x8RCUA","lsQGo2hEEU","0MR5X0MR5X","ydG8Utl72W","M6qcGZJTXH","9GXkXaDGtS","TXQ0ZRpBQm","mz8gxBCxeC",
+"d85a9fcJOy","QnJ1SwDajX","bZLvSpmeCd","Ta8f6IRh48","2hEEUv2eC3","zqH0WAOgEe","EdBKcHRxd8","xReec5Drn0","9rlg9v1Hln","ReKEWLDk6f",
+"MGlTFrz7Ut","dhSuHYf2Ec","W3VFHQChxs","KASQ8EoToP","55rfBeuZA5","hSSvQ2ZHdk","3weIFBGaQY","MaJQssqVrf","ulk41DcpWB","1LB1L5Mg9r",
+"pFrrlpmeCd","JXljW5Drn0","BGaQYFGzgp","wDajXni2v1","RpBQmBFkb8","lCMxy7fsYM","FcWrWatef2","LbRTHv2eC3","d85a9AXpwE","Vprf2No0Qb",
+"CNHmv1v5hH","Ss0Zufqypy","M3zXL1v5hH","Chuy3k85Ae","TXQ0ZB3qem","M6qcGYjB9t","ciuWzuQIcz","14FLRI7p2a","kZANmvLsmS","uoStwv2eC3",
+"O3iyQ5IhmG","0h1b1qQxHP","zz4ZUKsjRK","ksJbylViBv","xReecZuDtD","GSQwj9iGoT","1j5L8FNYIM","JXljWni2v1","FGzgpJ2mQi","oGu6x5nmWv",
+"JIqXiEdBKc","pmeCdQClRL","F6PT2yToGW","No0QbEOE1o","0YAGHnlaBy","8FmFHlsQGo","ru4UG9GXkX","WPmlxNo0Qb","Y1mC0yToGW","MmKGJ9GXkX",
+"euZA5n1pmO","KASQ8X6Pin","tjQxsMojnP","SbRYy24ARF","cShY2QWxoT","djsrvDLhzM","4dEz6t98iW","9XyT93otm6","WreyPtuDyS","TXQ0ZZzJHW",
+"n8pJ9FPfSE","C2IrcRsQUq","qQxHPYf2Ec","2NslmpiJSk","v1HlnlkMUA","TwanoQChxs","7Ow5CFhtgl","Ul4a1AgJHQ","B3qem4W0Tl","blLA9WaWsv",
+"Pb1pa0MR5X","UmaEvAgJHQ","TXQ0ZzqH0W","AgJHQHfyNQ","ZhwG18FmFH","DLhzMMK07Y","WaWsvjeskS","wDajXqaofN","3weIFUlU3M","Zv7z0xciqp",
+"JkzUnfLNg8","580YD2ZHdk","nnP8oMmsIo","Cfgr30Kyfs","Q6LixyofH3","piJSkRzaZA","zQt6QVNCPd","Kr8ysJXljW","CxVEfQ6hMC","7X3uyv2eC3",
+"I7p2aOz8yZ","ru4UGgtCA5","2NslmQ6hMC","M3zXLMK07Y","l83Ud3weIF","1j5L8WreyP","Vprf2X6Pin","FhtglFwEJz","NOHszjfREu","hSSvQGrDg7",
+"WPmlxlCMxy","4W0TlRsQUq","UlU3MjS1aj","Q6Lixa00b5","48cHLVIlwP","B3qemVprf2","QClRL7X3uy","lm0pDh1zcH","7ku1pZUnqt","I7p2axXTI4",
+"ZhwG10MR5X","No0QbEdBKc","EOE1ocmXIX","JXljWDG4sT","lj07QAkKTk","yEfy9Chuy3","Waim6uJScX","CdyBVlweGy","0ao3l55rfB","faHirsqVrf",
+"JkzUnAmdQd","guMb8Yh1hF","JkzUnB3qem","uJScXI7p2a","nlaByzbIYY","yEfy9iqv4k","pAhR1RBhp0","Oz8yZh1zcH","2hEEUJkzUn","4dEz6WreyP",
+"29QAzM3zXL","VLTy6mz8gx","7hyVvhUTw7","5VZjSRBhp0","No0Qb5Mg9r","RsQUqMaJQs","h1zcHhSSvQ","jeskS3otm6","5IhmGKZamH","M6qcGsuY4x",
+"faHirSWfou","WmadApiJSk","e6e4zlXFOB","sx5Glt98iW","lweGyBbwgA","Oz8yZuvf7A","oVQp69y4lw","dpe1vdhSuH","uLtKs5IhmG","ZzJHWatef2",
+"nFqikZUnqt","aFFssJKWYR","hSSvQSWfou","POUYSS2Dfu","VerEANcICA","cmXIXBFkb8","7lUXZtjQxs","1j5L80PktI","t59lRv8yFN","8xEKzdjsrv",
+"7lUXZtlILt","guMb8lCMxy","MojnPFcWrW","JRJQBjiVBP","ZhwG1piJSk","qaofNK4GS8","v8yFNhi5X7","fmIK1nlaBy","faHirtAOsr","AgJHQTXQ0Z",
+"KZamHokgRi","fLNg8uAWyp","1v5hHnnP8o","5IhmGBbwgA","mX2GEjS1aj","S2Dfuuupzk","ni2v1JXljW","zFgtB5ZaEz","0Wr5yzY1GY","tvdkD0PktI",
+"RkQkeQnJ1S","e6e4zeuZA5","Yf2EclkMUA","9XyT98U2nU","lViBv0PktI","fLNg8vLsmS","24ARFatef2","lH1ktF6PT2","In3NSjeskS","CqqaD2ZHdk",
+"uTacxJkzUn","8hJdtAgJHQ","618Di7hyVv","WDVWJ1j5L8","dQ586t98iW","KsjRKIRh48","hSSvQpFrrl","FLsphVIlwP","I7p2aix74r","NhXdunnP8o",
+"2TRI7jSjS3","pWiOsQworu","RkQkennP8o","JKWYR8cVD3","CIShGFVMxo","7ku1pQWxoT","7hyVvoGu6x","ciuWzlweGy","fFDrJnlaBy","rhl0JAXpwE",
+"HfyNQRACuj","W3VFHLDk6f","VBjhzCK5W7","Q6hMCBCxeC","zqH0WfFDrJ","QChxs5Mg9r","rhl0Je6e4z","DLhzMfLNg8","Q6LixQnJ1S","BFkb8tjQxs",
+"BpYhVlViBv","oQ87r29QAz","7fKYUFNYIM","F6PT2QClRL","lXFOBX6Pin","d85a9a00b5","tlILtZhwG1","GSQwjjzUqR","ulk41nlaBy","8TxD7dmoS7",
+"lCMxydmoS7","AmdQd2Yz7E","RACujJkzUn","0Wr5y0PktI","FhtglcL0aE","M3zXL7X3uy","okgRiogLgc","zY1GY0Wr5y","hSSvQFhtgl","NhXdu0h1b1",
+"ru4UGMaJQs","fFDrJpv0i7","Rxrsmzz4ZU","dmoS7IjTwP","ZUnqt0PktI","VBjhz2ZHdk","L7cGcqUJMd","Yw2oUBpYhV","CdyBVaez9y","aDGtStvdkD",
+"1j5L8WDVWJ","DcpWBQChxs","pT8wun1pmO","No0QbAOgEe","hUTw7VNCPd","iB08ldpe1v","Mm8sifmIK1","gjUTugIYvE","P6bcgrKDLJ","yvOMInFqik",
+"2Yz7E3otm6","POUYSs93Ml","o8UydO3iyQ","QssNCjeskS","8FmFHCxVEf","5iGN5yToGW","JXljWtaOXK","AOgEeDG4sT","lm0pDFPfSE","mz8gxMGlTF",
+"zqH0WpAhR1","rKDLJtuDyS","suY4xPOUYS","BbwgAStlDJ","0ao3lGrDg7","QChxsKsjRK","hUTw7uN6r3","v2eC3QWxoT","5ZaEzsuY4x","DQimpbZLvS",
+"EOE1oReKEW","vkCHHLewvM","atef2h1zcH","y94nwMmKGJ","RmDcrd85a9","ix74rM6qcG","JIqXiblLA9","n8pJ9cShY2","VjCZqeuZA5","5drc6MojnP",
+"mX2GEJJs5m","MojnPdmoS7","h1zcHIRh48","uLtKsJIqXi","VerEAwiHrZ","v8yFNlj07Q","Mkgy8tl72W","FFDuiDcpWB","ix74rxReec","d85a97fsYM",
+"BbwgA2TRI7","2ZHdkpT8wu","8TxD7s4786","Pb1paFLsph","uLtKsuPX7G","RpBQmUmaEv","WmadAG1RhS","8RCUAyEfy9","3weIF5IhmG","GXdoHfaHir",
+"W3VFHlH1kt","StlDJL7cGc","zY1GYdhSuH","CqqaDy94nw","Vprf2JKWYR","hi5X7vOqCE","euZA5Nxx9V","Y1mC00YAGH","cmXIXaFFss","3weIFt59lR",
+"ZJTXHAOgEe","ru4UGBpYhV","6q6L9k85Ae","hYBCKhUTw7","8U2nUOz8yZ","gIYvEChuy3","2TRI7QWxoT","JKWYRfqypy","pWiOs0PktI","yEfy9IKxdL",
+"WDVWJyEfy9","rKDLJBFkb8","6AFT0EOE1o","AmdQd7fKYU","dhSuH5nmWv","48cHLyvOMI","0MR5XfFDrJ","3weIFRBhp0","okgRitvdkD","lj07QS2Dfu",
+"29QAzogLgc","0Wr5yoQ87r","GSQwjix74r","7Ow5CPb1pa","RpBQmQClRL","zHF1qx3LDe","tuDySDz1R3","G1RhSYf2Ec","hYBCKkB5nP","FNYIMiwzGk",
+"K4GS8brhlQ","3otm6ReKEW","ix74r8FmFH","O3iyQpvgjS","Qworuix74r","618Di5Namm","pvgjSyToGW","ni2v1EoToP","DcpWBs7Mxk","v2eC3ZUnqt",
+"uQIczXflUq","suY4xzbIYY","P6bcgjiVBP","uupzkjfREu","Gv3FqZuDtD","yluBxWmadA","Q6hMCvLsmS","dQ586PYBf4","MmsIojfREu","e6e4z5VZjS",
+"i3pydx3LDe","ThjNniKqhr","0Wr5yksJby","3otm6t98iW","bZLvSlm0pD","2TRI7oGu6x","sx5GlkZANm","ThjNnd85a9","9iGoTW3VFH","yofH3AmdQd",
+"No0QbgjUTu","0BmCy0MR5X","0YAGHlj07Q","lViBv0Kyfs","C2IrcVLTy6","D6rByn1pmO","FFDuiG1RhS","qaofNOz8yZ","iKqhr64s8N","Cfgr30h1b1",
+"qUJMdQssNC","dmoS7MmKGJ","WaWsvFGzgp","FPfSEhYBCK","ydG8UQnJ1S","zY1GY8cVD3","xReecHP433","rKDLJECMvU","o8UydFcWrW","vLsmSguMb8",
+"Vprf2aFFss","AXpwEjzUqR","SWfouni2v1","CK5W7CxVEf","RkQkehSSvQ","sx5GlRzaZA","ZUnqtEOE1o","9y4lwogLgc","mz8gxlj07Q","UmaEv4QMc9",
+"ZuDtDzFgtB","tl72WDG4sT","hYBCKhSSvQ","KASQ8ogLgc","7fsYMIBe8k","4QMc9jiVBP","FcWrWtlILt","0KyfsRBhp0","O3iyQJ2mQi","48cHLQWxoT",
+"POUYS2Yz7E","Mkgy829QAz","5ZaEzCdyBV","0MR5Xs7Mxk","NOHszYh1hF","8U2nUjeskS","Oz8yZlH1kt","a00b5uTacx","48cHLxciqp","Mm8siKZamH",
+"oVQp6zQt6Q","m4bxUzz4ZU","ogLgczQt6Q","gtCA5580YD","5ZaEzjS1aj","jtn0XyluBx","y94nwni2v1","5iGN5Q6hMC","Q6hMCZzJHW","iB08lStlDJ",
+"KASQ8No0Qb","yToGWRACuj","jtn0Xlm0pD","nFqikC2Irc","s93MlHRxd8","k85AefaHir","9eoRcv2eC3","QworuokgRi","Z4I1v580YD","In3NSfFDrJ",
+"FLsphWPmlx","he9IACdyBV","x3LDeogLgc","d85a9KZamH","QnJ1Sn1pmO","Cfgr3580YD","618Dii3pyd","h1zcH0YAGH","t59lRVjCZq","zFgtBd7vjM",
+"uZPqgb29RJ","t98iWNAFuw","5Mg9r4dEz6","U3yw5oGu6x","kZANmRACuj","Ul4a1nFqik","d85a9ydG8U","5nmWvKr8ys","iwzGk580YD","CdyBVNo0Qb",
+"0h1b12Yz7E","5IhmGMmsIo","9GXkXQWxoT","K20wKl83Ud","dhSuHY1mC0","yofH3M3zXL","xciqpK4GS8","pAhR1MmsIo","m4bxU9eoRc","EoToPlXFOB",
+"AIYUuuoStw","WmadASs0Zu","FFDuii3pyd","QssNCECMvU","Oz8yZs4786","lsQGopT8wu","RzaZA9iGoT","s7MxkRACuj","GSQwjd85a9","v1Hlnaez9y",
+"yvOMIU3yw5","pv0i7QChxs","suY4xFxX9q","RkQkeVIlwP","CdyBVxXTI4","ydG8U55rfB","v8yFNHRxd8","Cp3mZWmadA","hSSvQIjTwP","StlDJ4W0Tl",
+"iwzGk29QAz","e6e4zQbxXc","vkCHHQnJ1S","24ARF4QMc9","tjQxsMkgy8","s7MxkQChxs","8xEKz5Mg9r","8TxD7ulk41","FLsph5VZjS","zz4ZU9GXkX",
+"VIlwPWaim6","JKWYRsoy9t","BbwgAMkgy8","blLA9tl72W","Z4I1vazIWp","J2mQiuLtKs","JkzUnv1Hln","5Nammpv0i7","C2IrcbrhlQ","JJs5mcL0aE",
+"he9IAtvdkD","UmaEvhYBCK","5IhmGVprf2","taOXKPYBf4","MojnPYh1hF","xReecK4GS8","brhlQYh1hF","rz7UtuoStw","ru4UGFGzgp","HRxd8FxX9q",
+"7lUXZOUqFM","qUJMdCp3mZ","5nmWvjeskS","16lHcChuy3","uQIczix74r","ksJby7ku1p","RsQUqni2v1","JKWYRB3qem","qaofNhUTw7","QClRL14FLR",
+"IKxdLtaOXK","uoStw5IhmG","aL6AJCp3mZ","5Mg9rFPfSE","TwanoGXdoH","5drc65Drn0","wiHrZd7vjM","nFqikDz1R3","BpYhVJJs5m","BGaQYs93Ml",
+"CK5W7t59lR","xciqps7Mxk","CqqaDb29RJ","Chuy3Pb1pa","RsQUqBCxeC","WMiS3tuDyS","RsQUqlj07Q","9GXkXzbIYY","5iGN5Yh1hF","KZamHaL6AJ",
+"ECMvUaez9y","guMb8gjUTu","Cp3mZaL6AJ","7fsYMiqv4k","HP433CIShG","2Yz7EQworu","s93MlRsQUq","Pb1pa2hEEU","v2eC3C2Irc","BpYhVsoy9t",
+"a00b5pFrrl","ru4UGFxX9q","BpYhV9XyT9","gf8rIiKqhr","7lUXZGSQwj","fcwDaYh1hF","ni2v10MR5X","pmeCdfcwDa","ksJbyTa8f6","5VZjSgf8rI",
+"CNHmvksJby","BpYhVZv7z0","Cp3mZogLgc","Ul4a1MGlTF","O3iyQStlDJ","ix74rtjQxs","jSjS3Pb1pa","lViBva00b5","D6rBy2Nslm","ulk41ZuDtD",
+"vLsmSK20wK","uupzksx5Gl","zmLYDlj07Q","9eoRcNo0Qb","FnPFB7fKYU","Waim6Fhtgl","taOXKlViBv","qaofNEdBKc","SjskQIn3NS","iqv4kBFkb8",
+"s4786wDajX","pAhR1n1pmO","azIWpMmsIo","C2IrcS2Dfu","hUTw7Pb1pa","t98iWRpBQm","Yw2oUzQt6Q","uQIcz2Yz7E","0PktIF6PT2","dhSuH45cIH",
+"9eoRcrhl0J","h1zcHnlaBy","8U2nUWaim6","FLsphOHaBz","QssNCQnJ1S","n8pJ9D6rBy","faHirsx5Gl","5ZaEzMmKGJ","2TRI7HP433","Ul4a1vLsmS",
+"rz7UtzFgtB","prNT6o8Uyd","lweGybrhlQ","Waim6M6qcG","MmsIoM3zXL","AmdQdUlU3M","CK5W70BmCy","Gv3FqyvOMI","uQIczogLgc","RpBQmOHaBz",
+"taOXKn8pJ9","ThjNnCIShG","AOgEeWreyP","FcWrWZzJHW","8FmFHdhSuH","m4bxUmz8gx","S2DfuZuDtD","iKqhrCqqaD","UmaEvC2Irc","3weIFYOfrY",
+"DG4sTpWiOs","Cp3mZjSjS3","MGlTF0Kyfs","jiVBPd85a9","IBe8kRpBQm","dhSuHVjCZq","yvOMIC2Irc","SjskQ5iGN5","4dEz6ix74r","K4GS8qaofN",
+"fmIK1RpBQm","uJScXZv7z0","0BmCyAOgEe","JRJQBni2v1","CxVEfiKqhr","rKDLJMezSW","GWqqXRxrsm","JIqXiM6qcG","Yw2oUuPX7G","gtCA50h1b1",
+"qaofNM3zXL","t98iWSbRYy","LbRTHTwano","nFqikYOfrY","Ss0ZupmeCd","jtn0Xy94nw","NhXduZ4I1v","aDGtSOxWIH","DG4sTFxX9q","jeskSC2Irc",
+"ZUnqtdpe1v","8U2nUYw2oU","6q6L92Yz7E","oGu6xcQOnv","3weIFokgRi","XflUq2DREs","BGaQYrz7Ut","4QMc9gdQsS","9y4lwlm0pD","G1RhSTa8f6",
+"gtCA5EOE1o","HlUbFuPX7G","OUYuFxReec","14FLRQYxC0","oQ87r0PktI","x3LDeCqqaD","pvgjSjtn0X","JkzUn9iGoT","dpe1vlpF6W","X6PinChuy3",
+"Dz1R3Dz1R3","0Kyfst59lR","vkCHHiKqhr","I7p2aJkzUn","yEfy98TxD7","CqqaDyEfy9","Yf2Ec48cHL","mX2GEi3pyd","B3qemdQ586","bZLvS6AFT0",
+"a00b5yluBx","2hEEUWDVWJ","StlDJ6q6L9","VNCPdjtn0X","i7WMQFnPFB","SjskQOz8yZ","okgRiFcWrW","IRh48tvdkD","OUqFM0Wr5y","uAWyplViBv",
+"RACuj7lUXZ","Cfgr3uLtKs","XflUqNxx9V","brhlQAOgEe","NAFuwyToGW","ix74rpT8wu","7fKYUdhSuH","8cVD3uLtKs","faHirOUYuF","ni2v1o8Uyd",
+"Q6LixOUqFM","rKDLJatef2","MGlTFMaJQs","Chuy3oQ87r","ThjNnCqqaD","mX2GEpFrrl","JKWYRIKxdL","8TxD7Yh1hF","AXpwElCMxy","29QAzs4786",
+"xciqpI7p2a","fcwDaI7p2a","uupzkYjB9t","uPX7GGWqqX","8U2nUKsjRK","IRh48JKWYR","5IhmGStlDJ","fcJOy7fsYM","vLsmSyluBx","16lHcNo0Qb",
+"FVMxoECMvU","gf8rIDQimp","RACujb29RJ","lpF6WCqqaD","wDajXVBjhz","O3iyQgjUTu","SbRYyJ2mQi","NAFuwuPX7G","DG4sTpvgjS","uLtKsksJby",
+"9rlg9VjCZq","J2mQiNcICA","yluBxiqv4k","uZPqg2hEEU","9rlg9VBjhz","Pb1paEoToP","VNCPd8FmFH","UmaEvVNCPd","yEfy9hYBCK","4dEz6n1pmO",
+"8U2nU16lHc","IKxdLQbxXc","kB5nPOUqFM","fcJOyWmadA","kZANmb29RJ","Yh1hFPb1pa","hUTw7HfyNQ","StlDJ16lHc","lXFOBU3yw5","RACujnFqik",
+"XflUqWPmlx","FVMxojtn0X","0Wr5yuvf7A","JKWYR8xEKz","VNCPdo8Uyd","cL0aEoGu6x","pFrrlD6rBy","VIlwPG1RhS","dhSuHC2Irc","jeskSMK07Y",
+"AIYUu45cIH","3otm6X6Pin","BGaQY9iGoT","cQOnvvkCHH","4QMc9Chuy3","lCMxysx5Gl","Nxx9V2Yz7E","AIYUuqUJMd","fcwDaVIlwP","45cIHmX2GE",
+"ni2v1Oz8yZ","guMb8ksJby","iqv4kkB5nP","piJSkEoToP","CdyBVK4GS8","QChxsrhl0J","JRJQBS2Dfu","Uvlv47ku1p","Uvlv4WDVWJ","piJSkWaWsv",
+"bgJAzKr8ys","zbIYYuN6r3","POUYSuupzk","RsQUqMojnP","AXpwEMmsIo","SWfouGXdoH","FwEJzyEfy9","8hJdtqUJMd","ciuWzIBe8k","7fsYMBFkb8",
+"blLA9VerEA","nlaByQWxoT","yToGWWaim6","e6e4znnP8o","4dEz6MmsIo","5VZjSBCxeC","hYBCKMmKGJ","ciuWz0Wr5y","uvf7AkB5nP","xReec1LB1L",
+"IKxdLgjUTu","lm0pDI7p2a","WMiS314FLR","uoStwTXQ0Z","JkzUn3otm6","Ta8f6WreyP","EOE1olH1kt","tuDySxciqp","RACujGSQwj","48cHL9XyT9",
+"FhtglQnJ1S","qQxHPFPfSE","x3LDeMkgy8","pT8wu8RCUA","Yh1hFd7vjM","OUqFM0PktI","2hEEURkQke","OUqFM14FLR","AmdQdSWfou","yToGWrz7Ut",
+"RkQkeuvf7A","wDajXWreyP","bZLvSNo0Qb","x3LDelsQGo","Oz8yZY1mC0","WPmlxdmoS7","xciqpQbxXc","lweGyEdBKc","wDajXs7Mxk","s7Mxk2TRI7",
+"vLsmSDz1R3","zqH0WBpYhV","zQt6QJJs5m","pAhR1ulk41","gdQsSBpYhV","Y1mC0blLA9","hUTw7JIqXi","7Ow5CvLsmS","cShY22Yz7E","MmsIoVIlwP",
+"ni2v1a00b5","S77LHcShY2","rKDLJzHF1q","xXTI4WPmlx","brhlQ580YD","qaofNHzZT8","RBhp0RpBQm","5drc6lViBv","tlILtD6rBy","9eoRca00b5",
+"sqVrfECMvU","RzaZAuN6r3","JXljWzHF1q","BbwgA7ku1p","gjUTuCqqaD","hYBCK2hEEU","BbwgAhE1Ql","W3VFHTCgPp","hi5X7lweGy","8FmFHIRh48",
+"Dz1R3hi5X7","k85AejeskS","lkMUAKr8ys","0PktIjtn0X","7X3uyfLNg8","jS1ajv2eC3","i7WMQRxrsm","9iGoTTCgPp","qUJMdbgJAz","7ku1pFPfSE",
+"mz8gx4W0Tl","dhSuHni2v1","NhXdulH1kt","K4GS8tuDyS","FcWrWEOE1o","uAWypsx5Gl","kB5nPk85Ae","h1zcHQClRL","tjQxsMezSW","zqH0WnlaBy",
+"d7vjMdhSuH","45cIHCIShG","uQIcz14FLR","wDajXFLsph","AIYUuSmGzv","7lUXZyofH3","Ta8f6Mm8si","lViBvC2Irc","ydG8UTXQ0Z","mX2GE5Namm",
+"YjB9tEdBKc","Gv3FqyluBx","JJs5mtuDyS","O3iyQkZANm","64s8NQYxC0","BGaQYcShY2","uQIczWMiS3","Mkgy8LDk6f","pAhR1pmeCd","BpYhVlweGy",
+"5VZjSZJTXH","h1zcHLDk6f","FNYIMuLtKs","s7MxkSbRYy","uJScXuoStw","pmeCdRACuj","55rfBgIYvE","WPmlxVLTy6","brhlQQChxs","Mkgy8Yw2oU",
+"F6PT2L7cGc","tuDyS2DREs","Ta8f6nnP8o","JJs5mX6Pin","2NslmjS1aj","qaofN4dEz6","yofH3b29RJ","v2eC3Cp3mZ","m4bxUhE1Ql","atef2K20wK",
+"7hyVvQbxXc","uJScXFjHXR","OUqFMCqqaD","oGu6xnnP8o","8U2nUFhtgl","7ku1pzFgtB","QbxXcVLTy6","2Nslmm4bxU","iwzGkO3iyQ","Ss0Zu0Wr5y",
+"gIYvElpF6W","Cp3mZQssNC","QnJ1SVBjhz","wiHrZzz4ZU","Mkgy8cShY2","FFDuiQ6Lix","Waim6S77LH","5IhmGSbRYy","2Yz7Eix74r","Yw2oUfqypy",
+"qaofNhi5X7","RmDcrpmeCd","3otm6pFrrl","AOgEejtn0X","7hyVv0YAGH","lsQGoni2v1","24ARFLbRTH","8U2nU0Wr5y","nnP8ozHF1q","lj07Q5iGN5",
+"GWqqXGv3Fq","SWfouCNHmv","NhXduqaofN","jeskSzFgtB","Kr8ys8hJdt","0ao3lfcwDa","rKDLJokgRi","n8pJ9W7cTs","yofH3iqv4k","Q6LixRBhp0",
+"hi5X7ZhwG1","zz4ZUhSSvQ","lpF6WOHaBz","lj07Q29QAz","gjUTu0Wr5y","580YDChuy3","aL6AJv2eC3","iwzGkzHF1q","t98iW64s8N","iB08llViBv",
+"HzZT8HzZT8","0ao3l48cHL","Mm8si9GXkX","VLTy67X3uy","PYBf4EoToP","RBhp0WPmlx","XyPZN8U2nU","d7vjMZzJHW","5drc6jSjS3","Ta8f6rhl0J",
+"8xEKzd85a9","pv0i7F6PT2","uAWypJ2mQi","K4GS8uTacx","FjHXRZzJHW","kB5nPjzUqR","y94nwuQIcz","jtn0XlXFOB","rKDLJHfyNQ","VerEAyvOMI",
+"soy9tM3zXL","HfyNQQChxs","M3zXL4W0Tl","LDk6f2DREs","SjskQfFDrJ","0KyfsKsjRK","v1Hln8xEKz","45cIHWaim6","RzaZAfcJOy","ogLgceuZA5",
+"vkCHH07n1c","KASQ8uAWyp","S77LHgtCA5","zmLYDv8yFN","fcwDaeuZA5","VBjhzzbIYY","hUTw7WMiS3","FhtglCK5W7","Vprf29rlg9","tuDySvkCHH",
+"Yw2oUX6Pin","POUYSY1mC0","n1pmONcICA","Cp3mZ8U2nU","48cHLd7vjM","8TxD7Mkgy8","dQ586HRxd8","tvdkDX6Pin","x3LDegtCA5","Mm8siiKqhr",
+"WDVWJThjNn","ReKEWC2Irc","9y4lwv1Hln","ReKEWdpe1v","POUYSIRh48","DQimpUl4a1","guMb8piJSk","GXdoHqUJMd","cL0aEtuDyS","24ARFlsQGo",
+"prNT6QChxs","JIqXi7fKYU","Vprf2ksJby","v2eC3ogLgc","L7cGc24ARF","fmIK1BbwgA","8RCUA1LB1L","YOfrYfmIK1","uvf7A7fsYM","2hEEUe6e4z",
+"Kr8ysv1Hln","MmsIoSjskQ","t98iWVprf2","cL0aEMGlTF","AmdQdQbxXc","Q6LixGv3Fq","fcwDa7hyVv","fcwDahSSvQ","J2mQiCfgr3","0PktI4W0Tl",
+"NhXduTa8f6","MmKGJAOgEe","VLTy6M3zXL","lCMxym4bxU","VNCPdP6bcg","hSSvQgdQsS","0ao3lDQimp","wiHrZ8hJdt","JIqXiqQxHP","Cfgr3GrDg7",
+"580YDBFkb8","ksJbyReKEW","C2Irczz4ZU","9rlg9dpe1v","9iGoTPYBf4","s7Mxkv1Hln","jeskSEOE1o","14FLRpAhR1","hE1QlYjB9t","UmaEvMmKGJ",
+"8FmFH9eoRc","FVMxoguMb8","euZA5t59lR","tl72W24ARF","he9IAjfREu","8xEKzGWqqX","EdBKck85Ae","tAOsrQ6Lix","O3iyQnnP8o","SjskQBbwgA",
+"lViBvMojnP","uvf7AzQt6Q","IRh48hSSvQ","AmdQdBbwgA","Uvlv48FmFH","RBhp0zHF1q","jtn0XzY1GY","BFkb8IBe8k","gtCA5WMiS3","VLTy6he9IA",
+"SjskQxReec","5drc6uPX7G","HlUbFQClRL","NAFuwI7p2a","8xEKztaOXK","zqH0WzFgtB","0ao3l24ARF","BFkb8Q6Lix","BFkb8RBhp0","jtn0XCqqaD",
+"RBhp0RmDcr","uPX7GnnP8o","SmGzv7fsYM","i3pydI7p2a","yluBxhSSvQ","o8UydC2Irc","5ZaEzBFkb8","aFFssWreyP","lXFOBk85Ae","0PktISWfou",
+"NAFuwnFqik","zQt6Qni2v1","CK5W7xReec","GWqqX45cIH","JRJQBYw2oU","Chuy3MmKGJ","fFDrJhUTw7","9y4lwFwEJz","taOXKzz4ZU","DQimpNAFuw",
+"brhlQAXpwE","JIqXi48cHL","6q6L9Z4I1v","RzaZA16lHc","HP433QYxC0","uQIcz4QMc9","QbxXcU3yw5","lpF6W2DREs","OUYuFJXljW","Ss0ZusqVrf",
+"29QAzprNT6","s93MlcShY2","CIShGB3qem","d7vjMUlU3M","NAFuwx3LDe","16lHcfcJOy","CK5W7xXTI4","BpYhVatef2","MK07Y580YD","FNYIMVprf2",
+"QClRLYf2Ec","8TxD7o8Uyd","5Mg9r55rfB","yEfy9xReec","ogLgcQnJ1S","atef2xciqp","cmXIXsoy9t","n8pJ9AIYUu","FwEJztaOXK","64s8N55rfB",
+"VLTy6faHir","7Ow5CHfyNQ","xReecfcwDa","o8UydfmIK1","zbIYY7ku1p","yEfy9mz8gx","dmoS7GWqqX","RpBQm9GXkX","MmsIodpe1v","G1RhSuQIcz",
+"h1zcHKASQ8","IBe8kSmGzv","jtn0XLewvM","CqqaDQYxC0","FVMxoqUJMd","U3yw5HRxd8","W7cTsydG8U","YjB9tThjNn","n1pmOOUYuF","oQ87rNAFuw",
+"L7cGc1LB1L","FwEJz1j5L8","SbRYyzz4ZU","oQ87rGXdoH","d85a9v2eC3","7lUXZh1zcH","FwEJzlCMxy","Yw2oUguMb8","QssNCiqv4k","QssNCOUYuF",
+"2hEEUqUJMd","EoToPtAOsr","55rfB29QAz","uZPqgDG4sT","FFDuiv8yFN","cmXIXIn3NS","0KyfsI7p2a","D6rByStlDJ","ZhwG1RmDcr","7X3uy48cHL",
+"4W0TlRmDcr","uupzkvOqCE","gtCA5GrDg7","FxX9qFwEJz","K20wKoVQp6","7fKYUNxx9V","Cfgr3DG4sT","TwanogIYvE","vOqCEcL0aE","IjTwPgIYvE",
+"AmdQdOxWIH","l83Ud8cVD3","d85a9zFgtB","fmIK1dpe1v","BCxeCTCgPp","0KyfsJ2mQi","uPX7G4dEz6","ni2v1KsjRK","ZUnqtmz8gx","C2IrcBCxeC",
+"6AFT048cHL","tlILtjSjS3","qaofNLewvM","5IhmGokgRi","0BmCyQ6Lix","HRxd8Y1mC0","QWxoTM3zXL","tvdkDru4UG","Zv7z07hyVv","KZamHWPmlx",
+"jS1ajDz1R3","FxX9q8RCUA","4dEz6atef2","cQOnvD6rBy","CxVEfuAWyp","JKWYR5nmWv","tuDySMmsIo","No0Qb07n1c","yEfy9OUqFM","CdyBVtuDyS",
+"uupzkUvlv4","2Nslmru4UG","okgRiaez9y","Uvlv4e6e4z","HzZT8M3zXL","OHaBzaL6AJ","gtCA5uLtKs","DcpWB2Nslm","5ZaEzUl4a1","Y1mC05iGN5",
+"zQt6QS2Dfu","FnPFBSs0Zu","NOHszKASQ8","9eoRcsx5Gl","Ul4a1J2mQi","3otm6vOqCE","yToGWdhSuH","zmLYDlsQGo","dmoS7QWxoT","K4GS8zFgtB",
+"yEfy9taOXK","iKqhrM6qcG","5Mg9rPb1pa","qUJMd4W0Tl","POUYSqUJMd","lm0pD16lHc","jtn0XOxWIH","24ARFQworu","9GXkX5Drn0","s47868hJdt",
+"HRxd8tlILt","UmaEv0BmCy","2ZHdkNxx9V","DQimpjiVBP","2Nslm5nmWv","jfREu0h1b1","No0Qbl83Ud","lweGyokgRi","pv0i7FPfSE","QworuuJScX",
+"S77LH7ku1p","dmoS7ciuWz","ZuDtDQYxC0","vLsmSJIqXi","hE1Qlo8Uyd","BCxeCQbxXc","QChxs2ZHdk","fqypyXflUq","Yh1hFCqqaD","FcWrWJXljW",
+"vOqCEFPfSE","CNHmvW7cTs","FGzgp580YD","TXQ0ZzHF1q","Mm8sim4bxU","EOE1oSbRYy","azIWpK4GS8","VerEAlsQGo","DQimpazIWp","0Wr5yzQt6Q",
+"Waim6uoStw","oVQp6WDVWJ","MmKGJFwEJz","v1HlnHlUbF","QworuFcWrW","P6bcg55rfB","HRxd8O3iyQ","uoStw2Yz7E","X6PinGWqqX","zqH0WqUJMd",
+"0Kyfsb29RJ","OHaBzazIWp","8FmFHFwEJz","gdQsS7lUXZ","X6PinyvOMI","07n1cUl4a1","NAFuwX6Pin","MGlTFtl72W","HfyNQZzJHW","mz8gxyvOMI",
+"yofH36AFT0","taOXKY1mC0","faHirFFDui","ydG8UvOqCE","XflUquLtKs","QChxsAkKTk","suY4xguMb8","hUTw745cIH","0Wr5yMezSW","QYxC0NhXdu",
+"jSjS3d85a9","ZJTXH14FLR","OxWIHdmoS7","2NslmrKDLJ","K4GS8Pb1pa","UlU3Mzz4ZU","BpYhVjiVBP","wDajXF6PT2","tAOsrfLNg8","9y4lwpvgjS",
+"brhlQCNHmv","zY1GYi7WMQ","5ZaEzMezSW","0YAGH2ZHdk","yvOMIk85Ae","QssNCzFgtB","HRxd8JKWYR","IKxdLoGu6x","tvdkD580YD","FFDuiBGaQY",
+"wiHrZs4786","GrDg7WreyP","48cHLRxrsm","xXTI4taOXK","lweGynlaBy","gdQsS3otm6","F6PT2faHir","YjB9tUmaEv","fcJOyVIlwP","J2mQi0YAGH",
+"piJSkDQimp","xciqpgjUTu","YjB9tBpYhV","EoToPAOgEe","9rlg9cQOnv","VBjhz5IhmG","AkKTk2hEEU","SWfoufqypy","x3LDebrhlQ","J2mQi5iGN5",
+"AkKTk9eoRc","0YAGHvLsmS","lpF6WAkKTk","l83UdZJTXH","pFrrl16lHc","BFkb8LbRTH","8TxD7JIqXi","64s8NpT8wu","IRh48ZUnqt","pWiOsCIShG",
+"D6rByTwano","zHF1q7hyVv","SWfouStlDJ","P6bcgqQxHP","wDajXogLgc","VerEAcQOnv","HP433TCgPp","WPmlxOHaBz","7Ow5CStlDJ","No0QbbgJAz",
+"pAhR1Pb1pa","CqqaDjzUqR","rhl0Jpv0i7","cmXIXRxrsm","uvf7As4786","zQt6QzqH0W","WmadAZ4I1v","FLsphrKDLJ","AkKTkgtCA5","CK5W755rfB",
+"LDk6fNhXdu","n1pmOB3qem","IjTwPkZANm","ZzJHW8cVD3","zFgtBFjHXR","jeskSa00b5","L7cGcSbRYy","NcICA3weIF","pT8wuRBhp0","xciqpGWqqX",
+"oGu6xjS1aj","5iGN524ARF","TCgPpVIlwP","DLhzMk85Ae","uN6r3t98iW","XflUqYjB9t","piJSkWreyP","FNYIMNo0Qb","3otm6Zv7z0","W3VFHl83Ud",
+"4QMc9EoToP","qQxHPX6Pin","jiVBPBGaQY","zqH0WI7p2a","UmaEvm4bxU","9rlg9qUJMd","3weIFKr8ys","l83UdcmXIX","i7WMQcL0aE","9iGoTcQOnv",
+"CxVEfTCgPp","cShY2rKDLJ","JXljWBCxeC","VjCZq4dEz6","POUYSJRJQB","OxWIHQ6hMC","pvgjSEoToP","EdBKcZuDtD","LbRTHn1pmO","GSQwjaL6AJ",
+"djsrv8RCUA","ZzJHWZv7z0","k85Ae48cHL","07n1cFnPFB","v1HlnbgJAz","16lHcb29RJ","9y4lwoGu6x","yEfy9jfREu","4dEz6uoStw","7hyVvs93Ml",
+"FLsphbrhlQ","xReect98iW","6q6L9RsQUq","Twanos93Ml","8TxD7IjTwP","MmsIopT8wu","XflUqPYBf4","jeskSnnP8o","wiHrZMezSW","jS1ajfLNg8",
+"6AFT02Nslm","4QMc9l83Ud","kZANmiqv4k","HfyNQ7hyVv","C2IrcO3iyQ","3otm6i3pyd","FNYIMciuWz","mX2GECp3mZ","fLNg8prNT6","ni2v1Nxx9V",
+"TCgPpzmLYD","2TRI7Ta8f6","QClRLjfREu","aL6AJkZANm","zHF1qciuWz","5drc6nFqik","yEfy9HRxd8","s4786i3pyd","LewvMThjNn","ZuDtDv1Hln",
+"QYxC0pWiOs","zHF1qQ6Lix","lkMUAzHF1q","uupzk580YD","uoStwMGlTF","QYxC0JXljW","pWiOs3otm6","1LB1Lrz7Ut","5iGN5BCxeC","0KyfsyEfy9",
+"0KyfsBbwgA","AmdQduJScX","B3qemZhwG1","580YDOHaBz","yluBxDQimp","cQOnvOHaBz","IjTwPlCMxy","KASQ8SWfou","aez9yRmDcr","OUYuFOUYuF",
+"NcICADcpWB","tuDySv1Hln","zHF1qFcWrW","5nmWvQWxoT","atef2qUJMd","JJs5m9GXkX","CIShGWaWsv","C2Ircn1pmO","WreyP618Di","9eoRche9IA",
+"wiHrZvLsmS","2hEEU7lUXZ","suY4xDLhzM","vOqCE7fKYU","qaofNiB08l","jS1ajblLA9","ReKEWKZamH","SmGzvMmsIo","vkCHHRkQke","JIqXiIKxdL",
+"LewvMuJScX","n8pJ9RBhp0","9iGoTAXpwE","POUYSW3VFH","s7Mxksx5Gl","6q6L9bZLvS","64s8Nru4UG","uQIczfaHir","fcJOyZuDtD","atef2Dz1R3",
+"dhSuHwiHrZ","Oz8yZWDVWJ","0YAGHlweGy","Yf2EchYBCK","CxVEfFFDui","k85AeI7p2a","8hJdtHzZT8","Ul4a1NhXdu","atef2AkKTk","aez9yqQxHP",
+"Dz1R3ZUnqt","4dEz6G1RhS","SbRYyiwzGk","1j5L8tlILt","9eoRcFhtgl","2hEEUTa8f6","ulk41HzZT8","zz4ZUX6Pin","ZzJHWsuY4x","5nmWv0MR5X",
+"GXdoHs93Ml","JRJQBhE1Ql","FwEJzFwEJz","AgJHQ29QAz","Gv3FqWaWsv","aL6AJMojnP","fLNg8Cfgr3","JIqXiFPfSE","uoStwrKDLJ","0MR5XIjTwP",
+"0MR5XzHF1q","W3VFHFLsph","s7MxkaDGtS","pFrrlni2v1","o8UydZhwG1","GXdoHLbRTH","fLNg8JkzUn","i3pydCdyBV","5NammcmXIX","FGzgpDcpWB",
+"MaJQsJXljW","uvf7AK4GS8","8TxD7OUqFM","jSjS3ulk41","FnPFBpFrrl","7X3uyMmKGJ","C2IrclweGy","WMiS3kB5nP","soy9tS2Dfu","gf8rIVLTy6",
+"jSjS3i3pyd","blLA9SWfou","rz7UtMojnP","HlUbF45cIH","Dz1R3QWxoT","yvOMIzY1GY","lpF6WAOgEe","mX2GEsoy9t","JJs5mHfyNQ","uTacxlH1kt",
+"GSQwjlH1kt","QbxXcHRxd8","2DREs2Yz7E","uAWypNo0Qb","VerEA0PktI","No0Qb8hJdt","HRxd8Qworu","Y1mC0zmLYD","MmKGJvOqCE","AXpwEECMvU",
+"ni2v1BGaQY","7Ow5CY1mC0","MaJQsVNCPd","1j5L8iB08l","5VZjSRxrsm","RkQketaOXK","hYBCKP6bcg","NcICATa8f6","FxX9qt98iW","lsQGoUlU3M",
+"AOgEePYBf4","2Yz7Elj07Q","7Ow5CJJs5m","9rlg90Kyfs","l83UdhE1Ql","n1pmO8RCUA","0Wr5yIBe8k","Q6hMC0Wr5y","24ARFZJTXH","U3yw5XflUq",
+"QssNCOUqFM","S2DfucQOnv","1j5L807n1c","KsjRK0PktI","lweGy5IhmG","n1pmO9GXkX","M3zXLdhSuH","5ZaEzECMvU","0MR5XtAOsr","S2Dfu8FmFH",
+"K4GS8fqypy","lm0pDsqVrf","OxWIHKZamH","RzaZANcICA","BpYhVlCMxy","Uvlv4xReec","SWfouFhtgl","FcWrWBCxeC","zbIYYpWiOs","lsQGoOxWIH",
+"W3VFHqaofN","CxVEftaOXK","EOE1ooGu6x","BGaQY9y4lw","jfREuEdBKc","uLtKsuupzk","ECMvUTXQ0Z","tl72WYh1hF","OUYuF9XyT9","xReec9y4lw",
+"Yf2EcNcICA","48cHLJKWYR","SbRYys93Ml","iB08lS77LH","FVMxo64s8N","aez9yQworu","580YDOz8yZ","d85a9iqv4k","CIShGQ6Lix","RpBQm8cVD3",
+"hSSvQ5Mg9r","Fhtgllm0pD","fcJOy7hyVv","nFqik7fsYM","CqqaDjfREu","sx5GllXFOB","s7MxkFNYIM","4QMc9KZamH","M3zXLP6bcg","cQOnvfcJOy",
+"ksJbyGXdoH","Q6LixhSSvQ","M6qcGlCMxy","FjHXRAOgEe","7ku1pRzaZA","gtCA5prNT6","pT8wulViBv","nlaByb29RJ","uN6r3mz8gx","24ARF580YD",
+"WMiS33weIF","1LB1LQbxXc","ECMvULbRTH","SWfouVNCPd","DQimpOUqFM","JRJQBpFrrl","hSSvQfcJOy","t59lRwDajX","ECMvU5nmWv","dmoS7cQOnv",
+"3otm6cShY2","vkCHHjiVBP","WaWsvuZPqg","9iGoTguMb8","5Mg9ri7WMQ","BFkb80Kyfs","prNT6ZhwG1","n1pmOAXpwE","qQxHPDz1R3","ZUnqtGrDg7",
+"fLNg8yToGW","ydG8UGSQwj","XflUq7lUXZ","UlU3MdhSuH","MK07YBCxeC","pmeCd14FLR","ix74rAIYUu","RBhp06AFT0","0YAGHP6bcg","KASQ8cmXIX",
+"5VZjSuJScX","0Kyfsrhl0J","2TRI77lUXZ","BpYhVy94nw","RACujAIYUu","uN6r3xXTI4","9y4lw2DREs","iwzGks7Mxk","IBe8kt59lR","EOE1oK4GS8",
+"9eoRcy94nw","lCMxyeuZA5","tvdkDLbRTH","uZPqgJkzUn","MezSWUvlv4","WreyPTXQ0Z","KASQ8KZamH","7lUXZ8xEKz","5IhmGwiHrZ","uLtKs6AFT0",
+"a00b58TxD7","IRh48AIYUu","vLsmS24ARF","jfREudQ586","ThjNnv8yFN","ThjNnwDajX","uZPqg6AFT0","qUJMdzQt6Q","WaWsvlViBv","faHirNhXdu",
+"rhl0JciuWz","TCgPp3otm6","BCxeCC2Irc","hYBCK2DREs","hUTw7djsrv","aL6AJmX2GE","hE1QlzqH0W","tvdkDS2Dfu","0ao3lciuWz","mX2GEZv7z0",
+"m4bxUGv3Fq","EoToPCdyBV","euZA58hJdt","hSSvQX6Pin","uvf7A5nmWv","atef2he9IA","zbIYYqUJMd","TwanodQ586","Dz1R3Vprf2","pAhR19XyT9",
+"bZLvSt59lR","MmsIo8xEKz","qUJMdatef2","yofH3AOgEe","QssNC7X3uy","sqVrfSmGzv","KsjRKatef2","ReKEWW3VFH","IjTwPoVQp6","UmaEvNAFuw",
+"D6rBy0PktI","taOXK5drc6","9y4lwt59lR","hUTw7BGaQY","yEfy90PktI","UlU3MNcICA","7fKYUIjTwP","DG4sTjzUqR","lXFOBL7cGc","NAFuwC2Irc",
+"F6PT25drc6","aL6AJGrDg7","s7Mxksoy9t","Yh1hFuZPqg","0h1b1gIYvE","uJScXWaim6","AOgEeChuy3","soy9ty94nw","iKqhrzY1GY","cShY2UlU3M",
+"suY4xzHF1q","MojnPVjCZq","NcICAMGlTF","fmIK1blLA9","UlU3MEOE1o","bgJAzOUYuF","JIqXiRmDcr","0MR5XFjHXR","LewvMrz7Ut","JKWYRlViBv",
+"t98iW3weIF","tuDyS7fsYM","h1zcHo8Uyd","ni2v1aDGtS","Gv3FqoGu6x","aDGtSRpBQm","blLA9qaofN","9XyT9oGu6x","Pb1pa0PktI","k85AezY1GY",
+"blLA9taOXK","G1RhSsoy9t","yluBxs4786","LbRTHM6qcG","NcICAP6bcg","QssNCCqqaD","VBjhzuoStw","IjTwPWDVWJ","O3iyQXyPZN","tjQxsbgJAz",
+"FPfSEM6qcG","JJs5m2Nslm","Oz8yZv1Hln","580YDv1Hln","uJScX8FmFH","8hJdtyToGW","rz7UtVNCPd","S2Dfu3weIF","IKxdLdjsrv","EdBKc5IhmG",
+"hYBCK07n1c","NcICAx3LDe","IBe8k7hyVv","ydG8UTwano","zY1GYYjB9t","uvf7AnFqik","5Nammd85a9","5ZaEzTXQ0Z","RBhp0ZuDtD","0KyfsiwzGk",
+"DQimp8U2nU","SWfoujSjS3","vkCHH29QAz","QChxsfcwDa","JkzUnFjHXR","S2DfuY1mC0","YOfrYMezSW","ZhwG15IhmG","J2mQiOUYuF","P6bcgCIShG",
+"Q6hMCZJTXH","ix74rjeskS","2ZHdkAkKTk","AOgEed7vjM","TCgPpyluBx","KZamHfFDrJ","iKqhrv8yFN","UlU3MydG8U","Yh1hFhUTw7","VLTy6jzUqR",
+"W7cTsDz1R3","dpe1vjiVBP","Ta8f6RpBQm","Cp3mZ0MR5X","16lHcWmadA","Uvlv4Twano","tl72WCp3mZ","ogLgcbZLvS","suY4x29QAz","0h1b1GWqqX",
+"Mm8siRACuj","W3VFHFwEJz","QssNCni2v1","FPfSE618Di","7hyVvzbIYY","sqVrfdpe1v","tuDySzQt6Q","B3qem6AFT0","14FLRFPfSE","DLhzMJkzUn",
+"okgRiwiHrZ","pWiOsRmDcr","7lUXZzmLYD","IKxdLvkCHH","7hyVvx3LDe","wDajXpWiOs","GXdoH0ao3l","No0QbGXdoH","In3NSKsjRK","t59lRU3yw5",
+"FwEJzzFgtB","pT8wu4QMc9","euZA5jS1aj","cQOnvQbxXc","2NslmCqqaD","dQ586ksJby","8FmFH7ku1p","OUqFMsuY4x","mX2GEThjNn","BpYhVS2Dfu",
+"GXdoH16lHc","GSQwjfaHir","wDajXn1pmO","e6e4zaFFss","guMb8Mkgy8","2TRI7POUYS","yluBxnFqik","vLsmSpAhR1","TXQ0Z0MR5X","CNHmvFPfSE",
+"nnP8o7Ow5C","oVQp6aFFss","vLsmSBGaQY","taOXK2hEEU","CdyBVBbwgA","45cIH6q6L9","IRh48tAOsr","AIYUuSbRYy","nnP8ofcwDa","ni2v1Qworu",
+"DLhzMMaJQs","RsQUqK4GS8","TwanogdQsS","HP433Uvlv4","0BmCyB3qem","8TxD7fmIK1","s93MllXFOB","StlDJM3zXL","Ta8f6hUTw7","CIShGMezSW",
+"0Wr5yW7cTs","lCMxyWPmlx","8cVD3RkQke","0h1b19rlg9","IjTwPv8yFN","sx5GluQIcz","MmsIojzUqR","tAOsrrKDLJ","MK07YuPX7G","xciqpsqVrf",
+"NcICA24ARF","uTacxyToGW","v1HlnZhwG1","OUqFMuN6r3","618DiWreyP","Dz1R35IhmG","CdyBVU3yw5","07n1cs93Ml","a00b5NcICA","fcwDazFgtB",
+"ZzJHWWaim6","5Mg9rWreyP","8TxD7pFrrl","tuDySWPmlx","nnP8onlaBy","CNHmvtuDyS","uPX7GX6Pin","qUJMd8hJdt","Uvlv4tlILt","64s8Nuvf7A",
+"tlILtK4GS8","y94nwtuDyS","DLhzMWreyP","FLsphru4UG","FxX9qvLsmS","SbRYyJkzUn","FjHXRIn3NS","3weIFsuY4x","zbIYYWreyP","5ZaEzTa8f6",
+"bZLvS9eoRc","Q6hMCAmdQd","uvf7AHlUbF","AgJHQNhXdu","ZJTXHdmoS7","9eoRcgdQsS","HRxd8I7p2a","uN6r3CK5W7","rz7Ut8RCUA","1LB1LaL6AJ",
+"bZLvSxXTI4","JRJQBqQxHP","rz7Ut48cHL","CNHmvni2v1","9XyT9AkKTk","OUqFMPYBf4","cmXIXeuZA5","uN6r3Waim6","5Drn007n1c","lXFOBEoToP",
+"lCMxyzmLYD","FhtglP6bcg","qQxHPMkgy8","ZJTXHEoToP","TXQ0ZjzUqR","okgRinFqik","TXQ0ZxXTI4","RxrsmRzaZA","dhSuHIBe8k","rKDLJy94nw",
+"e6e4z8TxD7","fcwDauJScX","ZuDtDFnPFB","xXTI4uoStw","4W0Tlt98iW","MmsIosoy9t","AkKTkMGlTF","cmXIXDcpWB","lkMUAP6bcg","FcWrWni2v1",
+"07n1ciB08l","OUqFMjiVBP","hSSvQokgRi","cmXIXZhwG1","580YDdhSuH","5Drn02hEEU","yluBxydG8U","QWxoTfqypy","blLA9Oz8yZ","OHaBz5Namm",
+"BbwgAjiVBP","Zv7z0zQt6Q","QWxoTlXFOB","Cfgr3tlILt","RpBQmoQ87r","Twano5Namm","uupzkLDk6f","SbRYyJXljW","8cVD3aL6AJ","WMiS3DQimp",
+"mz8gxzz4ZU","lsQGoJJs5m","VNCPdJRJQB","dmoS7W3VFH","mX2GETa8f6","618DiqUJMd","Cp3mZStlDJ","7lUXZyToGW","uTacxcmXIX","s47862TRI7",
+"0BmCyFVMxo","FwEJzRmDcr","RsQUqIn3NS","uJScXZ4I1v","DcpWB0Wr5y","ZzJHWKsjRK","VIlwPKr8ys","WmadACNHmv","QworuAIYUu","i7WMQbgJAz",
+"7fsYMStlDJ","SmGzvWPmlx","W7cTs9iGoT","Y1mC0gjUTu","QnJ1STCgPp","he9IAjiVBP","Waim6lViBv","tAOsr2Yz7E","K20wKCdyBV","Yh1hFx3LDe",
+"0ao3lpT8wu","2hEEUNxx9V","8cVD3TCgPp","FPfSEmX2GE","hUTw70BmCy","O3iyQCqqaD","d85a9uAWyp","aFFssQClRL","v1HlnCK5W7","h1zcHS2Dfu",
+"jfREuChuy3","jiVBP24ARF","VNCPd0MR5X","Zv7z0WmadA","uPX7GZv7z0","QWxoT8RCUA","gIYvEpFrrl","uQIcz5IhmG","y94nwMaJQs","JIqXi2TRI7",
+"U3yw5VerEA","wiHrZZzJHW","FxX9qSs0Zu","K20wK0PktI","FxX9qAkKTk","nlaBybgJAz","qaofNvkCHH","aL6AJStlDJ","RzaZAQ6hMC","3weIFHlUbF",
+"hE1Ql8cVD3","o8Uydaez9y","55rfBl83Ud","cL0aEDG4sT","zmLYDUvlv4","0h1b1zFgtB","t59lR5VZjS","Kr8ysWmadA","48cHL1j5L8","Mm8sirKDLJ",
+"blLA97fKYU","rz7UtSmGzv","tl72WO3iyQ","Mm8si7fsYM","rz7Ut2TRI7","o8UydIn3NS","sx5GlpmeCd","fmIK19eoRc","WDVWJRACuj","ulk41Dz1R3",
+"lweGyaL6AJ","pT8wuksJby","uoStwgjUTu","DcpWBvLsmS","DQimpC2Irc","VLTy6D6rBy","uQIczPYBf4","CqqaDF6PT2","v2eC3lm0pD","t59lR2Nslm",
+"atef2dQ586","xReecYf2Ec","WPmlxZv7z0","hUTw7n1pmO","lH1ktZhwG1","U3yw55Namm","64s8NCxVEf","n1pmO0h1b1","Nxx9Vhe9IA","5Drn07hyVv",
+"9y4lwUmaEv","WMiS3Q6Lix","Q6hMCaez9y","2ZHdk0Wr5y","FcWrW2DREs","24ARFoVQp6","TXQ0ZbZLvS","5VZjSJ2mQi","FjHXRQWxoT","9XyT924ARF",
+"VjCZqFLsph","7Ow5CfLNg8","rz7UtMK07Y","lweGySWfou","zQt6QnFqik","k85Ae9iGoT","atef2zHF1q","9XyT91v5hH","RsQUqaez9y","x3LDejSjS3",
+"9iGoTHP433","FjHXRzY1GY","CxVEfRBhp0","1LB1LMojnP","fFDrJpiJSk","piJSkMaJQs","lpF6WC2Irc","Dz1R3bZLvS","uZPqg2DREs","IRh48cShY2",
+"2Yz7EBpYhV","16lHcNAFuw","ix74ro8Uyd","zFgtBfcJOy","LbRTHAkKTk","Y1mC0i7WMQ","VjCZqKr8ys","FFDui7X3uy","lsQGohYBCK","GrDg75nmWv",
+"Cp3mZLDk6f","kZANmPYBf4","AgJHQk85Ae","pv0i7fqypy","HfyNQ0PktI","8xEKz2DREs","UlU3MhUTw7","brhlQUmaEv","oVQp6QssNC","X6PinQnJ1S",
+"Dz1R3Nxx9V","qQxHP3weIF","s47860Kyfs","bZLvS5nmWv","y94nw6q6L9","FjHXRMojnP","Vprf2WPmlx","oGu6xn1pmO","6q6L95Namm","45cIHdpe1v",
+"a00b5AgJHQ","dmoS79rlg9","RzaZALbRTH","gdQsShSSvQ","Uvlv4MmsIo","HfyNQ2Yz7E","5Mg9rIKxdL","IjTwPJ2mQi","24ARFiqv4k","WaWsvStlDJ",
+"4QMc95drc6","lsQGopmeCd","AgJHQCfgr3","wiHrZ0h1b1","jS1ajIKxdL","tlILttvdkD","cL0aELewvM","gIYvEQYxC0","euZA5SWfou","pFrrlRmDcr",
+"mX2GERxrsm","rz7UtMm8si","uPX7GRpBQm","J2mQi2DREs","7ku1pAIYUu","WDVWJhSSvQ","HRxd8zFgtB","Cp3mZMmsIo","piJSktaOXK","JRJQBZv7z0",
+"16lHc8xEKz","OUqFMgdQsS","dmoS77X3uy","U3yw5zQt6Q","0Kyfs7hyVv","o8UydTwano","RkQke6q6L9","yEfy94QMc9","CxVEfru4UG","Cp3mZtuDyS",
+"sx5Glhe9IA","nlaByGWqqX","Cp3mZsx5Gl","lH1ktnFqik","7ku1pfFDrJ","ZuDtDsqVrf","No0Qblj07Q","8xEKz618Di","BCxeC5ZaEz","DcpWBFnPFB",
+"fcJOyvLsmS","HRxd845cIH","guMb8RACuj","GXdoHCNHmv","xciqpmz8gx","MK07YoQ87r","ZJTXHKASQ8","3otm6NAFuw","FwEJz1LB1L","fLNg8JXljW",
+"TwanoaL6AJ","4QMc9a00b5","bZLvSNxx9V","JRJQBru4UG","n8pJ9Waim6","uLtKsEOE1o","OxWIHlweGy","ciuWzF6PT2","jSjS3s4786","MojnP7fsYM",
+"jfREuuZPqg","hi5X73otm6","uPX7Gy94nw","5ZaEzl83Ud","WaWsvQssNC","FFDui7fsYM","RmDcr7hyVv","FwEJzWaWsv","7Ow5CAIYUu","Cp3mZ9rlg9",
+"No0Qb29QAz","dQ586hSSvQ","hUTw7No0Qb","yvOMI0ao3l","lj07QFPfSE","3otm6FxX9q","7fsYMQChxs","fmIK1pT8wu","5Drn0G1RhS","WDVWJ8RCUA",
+"bgJAzFGzgp","VBjhzjiVBP","pv0i7I7p2a","UlU3MJKWYR","gdQsSwDajX","7hyVvUl4a1","J2mQiqQxHP","fcJOyNcICA","QnJ1SWaim6","0Kyfs7fsYM",
+"lpF6WvOqCE","S77LHcL0aE","OxWIH2TRI7","dpe1vGv3Fq","PYBf4bgJAz","faHirzFgtB","RACujHP433","Ul4a1K20wK","0YAGHL7cGc","Q6hMCCNHmv",
+"Pb1paWreyP","jiVBPzmLYD","8hJdtvOqCE","yofH3zY1GY","a00b5M6qcG","x3LDet98iW","In3NSZ4I1v","sqVrfksJby","Y1mC05nmWv","GWqqXK20wK",
+"16lHctvdkD","7lUXZZzJHW","tAOsrhUTw7","5NammCfgr3","rKDLJ9iGoT","0Wr5yTwano","Dz1R3RsQUq","5iGN5BGaQY","uupzklCMxy","zbIYYZuDtD",
+"hSSvQTCgPp","HP433QssNC","vLsmSP6bcg","RxrsmtlILt","RpBQmhYBCK","xReeczbIYY","IBe8kfaHir","MaJQszY1GY","zbIYYSbRYy","TXQ0Zulk41",
+"WaWsvlCMxy","tl72Wn8pJ9","QYxC0SWfou","piJSk8RCUA","29QAzdpe1v","tuDyS07n1c","hUTw7lViBv","JKWYRjzUqR","prNT6OUqFM","Gv3FqZv7z0",
+"9rlg9Dz1R3","iqv4klCMxy","4dEz6rKDLJ","WDVWJHP433","9y4lw2Nslm","zQt6QzY1GY","DG4sTnnP8o","RsQUqD6rBy","RpBQmXyPZN","zY1GY3otm6",
+"tl72WyvOMI","IKxdLt98iW","2NslmLewvM","gdQsSK20wK","nFqikfqypy","yEfy955rfB","EoToPlH1kt","ulk41MGlTF","uJScX2Nslm","zQt6QdmoS7",
+"xciqpeuZA5","B3qemru4UG","oGu6xCqqaD","24ARFokgRi","5ZaEzO3iyQ","RmDcrlXFOB","pT8wuuZPqg","0BmCyEOE1o","ZuDtDrhl0J","TCgPp7fsYM",
+"rz7Ut07n1c","J2mQitaOXK","yofH3pWiOs","VLTy6RsQUq","qQxHPpFrrl","4dEz67lUXZ","W7cTsWDVWJ","VjCZqdmoS7","5IhmG3otm6","K20wKIKxdL",
+"0KyfsjiVBP","L7cGcUvlv4","7hyVvSmGzv","fcwDagjUTu","m4bxU5drc6","ZuDtDSWfou","No0QbyToGW","d85a9WaWsv","ECMvUgdQsS","b29RJdpe1v",
+"16lHcFhtgl","RACuj2Nslm","vkCHHvLsmS","pvgjSru4UG","2NslmRmDcr","AOgEetlILt","I7p2aRkQke","5VZjSAOgEe","MK07YpFrrl","VerEA2Nslm",
+"lpF6WhE1Ql","lj07QazIWp","5Namm1v5hH","wDajXrKDLJ","5ZaEzLbRTH","m4bxU7fKYU","2TRI7lCMxy","uQIczDQimp","48cHLpmeCd","55rfBhUTw7",
+"5nmWvZ4I1v","tl72WC2Irc","14FLR4W0Tl","OUqFMksJby","IRh48jiVBP","YjB9tru4UG","QbxXctvdkD","IBe8kWmadA","FjHXRVerEA","rhl0JrKDLJ",
+"yofH3tuDyS","DLhzM6AFT0","i3pydogLgc","yofH3zHF1q","5nmWvcShY2","9GXkXSmGzv","tAOsrThjNn","rz7UtFVMxo","HfyNQprNT6","ThjNniqv4k",
+"0KyfsRkQke","RsQUq1v5hH","YjB9thUTw7","GWqqXK4GS8","2hEEUFNYIM","BCxeCiwzGk","tAOsrqQxHP","BCxeCyvOMI","zY1GYnlaBy","MGlTFFnPFB",
+"b29RJ7lUXZ","7lUXZazIWp","UlU3M0BmCy","KsjRKvOqCE","UlU3MUlU3M","2hEEUlj07Q","F6PT2fFDrJ","Ta8f67X3uy","RxrsmFnPFB","POUYSfmIK1",
+"yluBxxReec","AgJHQBFkb8","JkzUnatef2","uN6r3ksJby","2ZHdkx3LDe","gIYvELewvM","i3pydjS1aj","gIYvEMmsIo","VBjhzFxX9q","lViBv29QAz",
+"Yh1hFiwzGk","ciuWzaL6AJ","M3zXLAkKTk","kB5nPRACuj","x3LDehE1Ql","s4786aFFss","0YAGHlViBv","AgJHQi3pyd","XyPZNQYxC0","9iGoTGWqqX",
+"y94nws7Mxk","5drc6WMiS3","QnJ1Sh1zcH","uPX7GFwEJz","5Mg9rxXTI4","GSQwjpWiOs","taOXK3weIF","FVMxoF6PT2","7Ow5CKASQ8","s4786Twano",
+"S2DfuBbwgA","CxVEfdQ586","ZJTXHGXdoH","XyPZN2DREs","EOE1o5Namm","xReechUTw7","s7MxkNAFuw","7X3uy45cIH","TXQ0ZFjHXR","gIYvEuvf7A",
+"S2Dfuulk41","djsrvbrhlQ","d7vjMn8pJ9","8U2nUn8pJ9","Zv7z0zY1GY","0PktIO3iyQ","hi5X7faHir","ni2v1ydG8U","UlU3Mix74r","Ss0ZubgJAz",
+"piJSksx5Gl","zqH0WPOUYS","qQxHP24ARF","uZPqgaFFss","Zv7z0fFDrJ","VjCZqgjUTu","EoToPAkKTk","AXpwEaez9y","WMiS3s7Mxk","BpYhV8TxD7",
+"2DREsoQ87r","7fsYM5Mg9r","lXFOB2ZHdk","BCxeCIjTwP","M3zXL5Mg9r","GXdoHWreyP","s93MlWMiS3","vkCHHyofH3","Yw2oUTa8f6","TXQ0Zuupzk",
+"jfREufqypy","CIShGwDajX","oVQp6i3pyd","Dz1R3mz8gx","L7cGckZANm","Oz8yZyluBx","t98iWDcpWB","azIWpGSQwj","ZzJHWpAhR1","mz8gx6AFT0",
+"QChxsZhwG1","tlILtU3yw5","In3NSmz8gx","wDajXWaim6","MmKGJfcJOy","faHirOz8yZ","Yw2oUVjCZq","JKWYRjfREu","hE1QlMGlTF","5Drn0uupzk",
+"FPfSEY1mC0","5nmWvZhwG1","pT8wuXyPZN","e6e4zPb1pa","zHF1q6AFT0","Vprf2zbIYY","L7cGc29QAz","S2DfupmeCd","IRh48sx5Gl","fcJOyatef2",
+"iqv4kjtn0X","jSjS316lHc","tvdkDRBhp0","Oz8yZlj07Q","0h1b1W7cTs","zY1GY7X3uy","tlILtru4UG","d85a9cL0aE","0PktIpvgjS","NcICA8U2nU",
+"s7MxkVNCPd","U3yw5oVQp6","uQIcz5drc6","M3zXLWPmlx","DLhzMECMvU","RmDcrzz4ZU","nnP8o9XyT9","dQ5863otm6","8FmFHMK07Y","VBjhzguMb8",
+"BGaQYCK5W7","NcICAokgRi","tvdkD5nmWv","ru4UGlH1kt","dmoS78RCUA","07n1cReKEW","qUJMd48cHL","gdQsSulk41","t98iW4W0Tl","he9IA0Wr5y",
+"x3LDejfREu","RmDcr2Nslm","tjQxspvgjS","n1pmOpT8wu","aDGtSjfREu","WMiS3L7cGc","1LB1LFjHXR","JXljWWMiS3","B3qemMK07Y","WmadAbgJAz",
+"cmXIXru4UG","jfREujSjS3","OxWIHv8yFN","TwanoEoToP","IKxdLuQIcz","JXljWS77LH","3otm6sqVrf","S2Dfu8TxD7","Cfgr3FjHXR","2ZHdkSs0Zu",
+"fqypy2TRI7","RsQUqd85a9","1v5hHtAOsr","nFqik5nmWv","mz8gx7fsYM","OHaBzuZPqg","Q6LixXflUq","AOgEeSbRYy","bgJAzFjHXR","J2mQiDG4sT",
+"pFrrl14FLR","taOXKjiVBP","xXTI4gIYvE","CNHmvwiHrZ","QworuWmadA","FjHXRNo0Qb","zqH0WVprf2","uLtKsCp3mZ","CIShGLbRTH","uoStwSWfou",
+"uJScXJJs5m","J2mQiBFkb8","xReec7Ow5C","RsQUqJkzUn","4W0TlWPmlx","uZPqgW3VFH","JkzUnNOHsz","Mkgy8J2mQi","48cHLvkCHH","NcICAhYBCK",
+"ni2v1DcpWB","hE1QlVBjhz","UmaEvbrhlQ","gIYvEx3LDe","3otm6M6qcG","4dEz624ARF","S2Dfun8pJ9","580YDdmoS7","y94nwZzJHW","2ZHdk618Di",
+"dhSuHnnP8o","ZzJHWfcJOy","nFqik0Wr5y","i7WMQMK07Y","7ku1p2hEEU","IjTwPMmsIo","gjUTuDG4sT","sx5GlUl4a1","0h1b1YOfrY","RzaZAulk41",
+"QbxXcv2eC3","v2eC3Cfgr3","sx5GlHRxd8","M6qcGRpBQm","cShY2W7cTs","8RCUAx3LDe","soy9tmz8gx","MGlTF64s8N","AIYUulweGy","FnPFBB3qem",
+"cmXIXuupzk","IjTwPIjTwP","dQ586fcJOy","L7cGcPb1pa","S2DfuaFFss","gIYvEWMiS3","he9IAFGzgp","ZJTXH2DREs","16lHcokgRi","zmLYDYh1hF",
+"Yw2oUnlaBy","gjUTuaez9y","uJScXaFFss","Q6LixYh1hF","YjB9tpiJSk","RsQUqnFqik","prNT6qQxHP","aez9ymX2GE","t59lRt59lR","AmdQdlCMxy",
+"ReKEWYf2Ec","aez9yNo0Qb","uLtKsh1zcH","StlDJaFFss","Kr8ys0h1b1","TwanohUTw7","v8yFNQworu","HRxd8RpBQm","v8yFNK4GS8","RACujZuDtD",
+"euZA5v8yFN","s4786rhl0J","7ku1pRBhp0","QClRLGSQwj","8RCUAuPX7G","8TxD7b29RJ","S77LHv8yFN","k85AetAOsr","RACujAgJHQ","kZANmQYxC0",
+"fcJOyL7cGc","aL6AJS2Dfu","ReKEW580YD","1LB1LeuZA5","ThjNn1j5L8","2hEEU8cVD3","MmsIoDcpWB","i3pydzFgtB","DQimptlILt","jzUqRDQimp",
+"5Mg9r8U2nU","zbIYYs4786","KASQ82DREs","zbIYYs7Mxk","VLTy6ciuWz","YjB9thE1Ql","7ku1pblLA9","QssNCPb1pa","POUYSFnPFB","fcJOyJRJQB",
+"ZJTXHCdyBV","RzaZArKDLJ","pAhR1guMb8","MGlTF580YD","2ZHdkAXpwE","DG4sTSmGzv","EdBKctuDyS","45cIHzQt6Q","1j5L86AFT0","dmoS70YAGH",
+"bgJAzZJTXH","U3yw514FLR","sx5GlVNCPd","BCxeCtlILt","ksJbyuN6r3","jtn0X5Namm","jSjS3Mm8si","x3LDeQ6Lix","VNCPdtuDyS","aez9yPYBf4",
+"P6bcg2TRI7","S77LH9rlg9","dQ586djsrv","rz7UtcQOnv","uPX7GuZPqg","9XyT9hYBCK","wDajXkB5nP","fFDrJyEfy9","8hJdtMezSW","Yw2oUlj07Q",
+"lViBvy94nw","HzZT8zFgtB","n8pJ95drc6","uLtKsfqypy","HzZT8RpBQm","uJScXQworu","gIYvEHRxd8","EdBKcYjB9t","DcpWBiwzGk","2ZHdkhe9IA",
+"HzZT89GXkX","cmXIXzqH0W","2ZHdkCqqaD","ZJTXHfaHir","ECMvUYh1hF","bZLvSprNT6","W3VFHRmDcr","Mkgy80PktI","2NslmQClRL","8cVD3pvgjS",
+"7hyVvuoStw","1v5hHFnPFB","x3LDeWMiS3","aDGtSQssNC","7lUXZFLsph","yofH3sqVrf","aFFssB3qem","UmaEv5ZaEz","v8yFNAkKTk","bgJAzQWxoT",
+"7fKYU0MR5X","tuDySo8Uyd","8hJdtFjHXR","RmDcrl83Ud","MK07YX6Pin","RkQkezbIYY","y94nw5drc6","x3LDe64s8N","QnJ1SMK07Y","zFgtBGSQwj",
+"7fKYU24ARF","iqv4k55rfB","NhXdubgJAz","zY1GYeuZA5","AgJHQiqv4k","B3qemHRxd8","RmDcrW3VFH","tAOsrlweGy","O3iyQoVQp6","Dz1R30BmCy",
+"tvdkDDLhzM","nFqikWaWsv","piJSknlaBy","Cp3mZjeskS","iB08lOUYuF","FPfSEQChxs","Nxx9Vt98iW","DcpWBKr8ys","o8UydFPfSE","pmeCdBFkb8",
+"mz8gxsuY4x","zqH0WVLTy6","KASQ8uLtKs","Ss0Zu4W0Tl","aL6AJxReec","aez9yni2v1","Vprf2gtCA5","0BmCy5IhmG","GrDg7cShY2","F6PT2dpe1v",
+"618DiVLTy6","5iGN5LewvM","UlU3MZuDtD","soy9tFxX9q","64s8NdmoS7","Pb1paIBe8k","tl72W3otm6","YOfrYSbRYy","24ARFaez9y","HzZT8OxWIH",
+"45cIHJJs5m","VLTy6lj07Q","lweGy9GXkX","2hEEUGrDg7","Ul4a15drc6","VBjhztlILt","FVMxoNcICA","azIWp5Drn0","8hJdtcShY2","48cHLfqypy",
+"8xEKz8FmFH","uupzk0Wr5y","o8UydZzJHW","2ZHdkW7cTs","9y4lwdjsrv","pWiOss93Ml","4W0Tll83Ud","cQOnvuvf7A","nFqikThjNn","zqH0WWDVWJ",
+"lweGyGSQwj","G1RhSYOfrY","Zv7z0yofH3","48cHLS2Dfu","GXdoHAmdQd","LDk6f0MR5X","iKqhr8U2nU","MezSWNo0Qb","MGlTFCqqaD","mX2GE0MR5X",
+"AkKTkCqqaD","JkzUnzHF1q","YOfrYru4UG","LbRTHRmDcr","U3yw5Kr8ys","GrDg7cQOnv","DcpWBh1zcH","7hyVvZUnqt","ydG8UNxx9V","v8yFNEdBKc",
+"gtCA5v8yFN","t59lRuN6r3","Yh1hFP6bcg","KsjRKFLsph","O3iyQ8xEKz","KZamH9rlg9","lCMxyHfyNQ","brhlQn8pJ9","SmGzv7lUXZ","OxWIHSjskQ",
+"iqv4kHlUbF","RkQkeMkgy8","8hJdtB3qem","jfREudjsrv","yEfy9M3zXL","ECMvU9y4lw","Cfgr34W0Tl","HfyNQuQIcz","aDGtSCxVEf","pvgjStaOXK",
+"uAWyplm0pD","jS1ajFhtgl","zqH0WUlU3M","kZANmWPmlx","WDVWJv2eC3","brhlQ8U2nU","cShY25iGN5","MmKGJNhXdu","MaJQsjSjS3","9eoRcIjTwP",
+"Nxx9VVNCPd","aFFssMm8si","yofH3VLTy6","iwzGkjeskS","7fKYUTa8f6","JIqXiNAFuw","IKxdLhi5X7","14FLRvOqCE","AOgEeqQxHP","MaJQsgIYvE",
+"yvOMIvkCHH","X6PinJRJQB","SbRYy6q6L9","AOgEeMGlTF","lkMUAD6rBy","HfyNQi3pyd","4QMc9MojnP","BbwgAFLsph","jS1aj0BmCy","aDGtSzqH0W",
+"blLA9gtCA5","LewvMDLhzM","jS1ajwiHrZ","TXQ0Ziqv4k","atef2NOHsz","brhlQVBjhz","XflUqFnPFB","lH1ktMmKGJ","KsjRKzFgtB","faHir5ZaEz",
+"ru4UG5Drn0","gtCA5JJs5m","JXljWprNT6","fcJOyM3zXL","azIWp8U2nU","xXTI4Q6Lix","7lUXZ0ao3l","zz4ZUOHaBz","aL6AJa00b5","Cfgr3uJScX",
+"dmoS7ZJTXH","ZuDtDThjNn","qUJMdv8yFN","ciuWz1v5hH","ulk410MR5X","TwanoVNCPd","In3NS5VZjS","cL0aEuTacx","6AFT0jS1aj","W3VFHFjHXR",
+"atef2dhSuH","yToGWBFkb8","7ku1pjiVBP","jSjS35Drn0","fFDrJciuWz","DLhzMFFDui","uAWyphUTw7","WPmlx55rfB","mz8gxxciqp","pvgjSOUYuF",
+"yvOMIwiHrZ","5Drn0jeskS","QWxoTe6e4z","jiVBPpWiOs","EOE1oGSQwj","pWiOsqUJMd","5NammReKEW","MGlTFVNCPd","VNCPdI7p2a","ECMvUgjUTu",
+"FjHXRWaim6","vLsmSaDGtS","Cp3mZGWqqX","Chuy38RCUA","sx5GlblLA9","jfREuHlUbF","rKDLJCxVEf","WMiS3lsQGo","XflUqGv3Fq","AIYUuKr8ys",
+"tAOsrJIqXi","l83Udsoy9t","D6rBy7fKYU","7fKYU9rlg9","2Yz7EVLTy6","FFDuinlaBy","In3NS3otm6","Ul4a15VZjS","8TxD7t59lR","RkQkelCMxy",
+"StlDJZuDtD","fLNg8lViBv","hE1QlhSSvQ","ECMvU2Yz7E","8xEKzuQIcz","brhlQMK07Y","Cfgr3k85Ae","Uvlv4d85a9","dQ58664s8N","n8pJ9mX2GE",
+"GrDg7gjUTu","G1RhSjeskS","QClRLix74r","ru4UGvLsmS","CIShGXflUq","IBe8kSs0Zu","oQ87r8hJdt","0h1b1hi5X7","s7MxkuAWyp","piJSkCK5W7",
+"xReecQbxXc","uZPqguTacx","Chuy3DQimp","OUYuFTwano","lm0pDmz8gx","NhXduJJs5m","3weIFiqv4k","16lHcMkgy8","GrDg729QAz","Vprf2MojnP",
+"aDGtSFhtgl","Uvlv4lj07Q","8RCUAYjB9t","0Wr5ycmXIX","2NslmRxrsm","dhSuHru4UG","Zv7z0mz8gx","x3LDe1j5L8","jfREuNOHsz","fcwDa4W0Tl",
+"uPX7GMezSW","IjTwPazIWp","LbRTHZ4I1v","fLNg8VNCPd","P6bcgGv3Fq","LDk6fjtn0X","W7cTs16lHc","nFqiksoy9t","lkMUAguMb8","ru4UGMmsIo",
+"v1HlnFFDui","8xEKzRBhp0","P6bcgVerEA","Oz8yZ5ZaEz","CNHmvyEfy9","lj07QjSjS3","QworuSWfou","WmadA9eoRc","pWiOsKASQ8","9rlg9P6bcg",
+"aDGtSbrhlQ","lsQGoCIShG","7fsYMIn3NS","No0Qb2TRI7","fqypyJRJQB","aL6AJNhXdu","HP433MaJQs","azIWpeuZA5","aL6AJEoToP","m4bxUguMb8",
+"cQOnvlCMxy","9rlg94W0Tl","O3iyQsqVrf","NAFuwYh1hF","DG4sT6q6L9","L7cGcBFkb8","VLTy6Mkgy8","X6Pin6AFT0","soy9tfcwDa","VjCZqIBe8k",
+"FcWrWKASQ8","uPX7GOxWIH","oQ87rkB5nP","Qworu8hJdt","VLTy6S2Dfu","QssNCk85Ae","8RCUAZv7z0","RBhp0Dz1R3","nFqikni2v1","WPmlxBFkb8",
+"OUqFM580YD","JXljWb29RJ","Ss0ZutAOsr","fcJOyVBjhz","FVMxov8yFN","lweGyFxX9q","FVMxoZJTXH","e6e4zt59lR","KsjRKix74r","BpYhVoGu6x",
+"yToGW7fKYU","b29RJ5nmWv","WDVWJzY1GY","vLsmSUlU3M","55rfBNo0Qb","sqVrfo8Uyd","i7WMQlH1kt","zHF1qjeskS","618DiFVMxo","QWxoTfmIK1",
+"Dz1R3Uvlv4","RkQkevkCHH","dhSuHVNCPd","h1zcHazIWp","TXQ0ZlsQGo","nlaByIjTwP","DcpWB8FmFH","RxrsmQWxoT","ZhwG1AkKTk","W3VFHS2Dfu",
+"zbIYYix74r","yofH35Drn0","a00b5K4GS8","EdBKcOUqFM","24ARF7fsYM","ZUnqt9rlg9","cmXIXJKWYR","rKDLJDcpWB","faHirFwEJz","QnJ1SRzaZA",
+"9y4lw0PktI","ZJTXHm4bxU","cShY2VLTy6","LDk6fX6Pin","gjUTujS1aj","aFFssNAFuw","nnP8oNOHsz","CIShGMojnP","Chuy3OUqFM","3otm62TRI7",
+"b29RJh1zcH","uAWypFjHXR","JkzUn64s8N","FGzgpkB5nP","v2eC3hi5X7","F6PT2cL0aE","VNCPdHfyNQ","4W0TlYOfrY","CIShGKr8ys","SbRYyguMb8",
+"brhlQDG4sT","yvOMIbgJAz","HzZT8CqqaD","KsjRKQWxoT","oQ87rYw2oU","S77LHm4bxU","lm0pDOUqFM","v2eC35drc6","W3VFHZuDtD","piJSktuDyS",
+"5ZaEzhE1Ql","ThjNn4QMc9","gIYvETXQ0Z","W7cTs5IhmG","CxVEfdmoS7","hSSvQaFFss","uPX7GIRh48","TCgPplweGy","DG4sTwDajX","lsQGoY1mC0",
+"pFrrlm4bxU","Uvlv42TRI7","4W0TlokgRi","Cp3mZMaJQs","zHF1qlkMUA","Chuy3ydG8U","FjHXR0BmCy","0BmCyhi5X7","zqH0WtAOsr","uupzkzbIYY",
+"QChxs9eoRc","zz4ZU8FmFH","rz7UtAgJHQ","hSSvQy94nw","iB08lwDajX","ix74rlkMUA","2Yz7EFhtgl","hE1QlMK07Y","KASQ8vkCHH","ECMvUC2Irc",
+"2DREsW3VFH","tlILtqUJMd","pmeCduLtKs","IjTwP9y4lw","qUJMdEOE1o","7fsYMCNHmv","ogLgcs93Ml","lH1kt7fKYU","FcWrWDz1R3","FNYIMv1Hln",
+"ReKEWuTacx","2TRI7YjB9t","VIlwPI7p2a","bgJAzyToGW","Nxx9VkB5nP","nFqikDQimp","dQ586xXTI4","AIYUu5Namm","brhlQC2Irc","XyPZNpv0i7",
+"fcwDaxciqp","JRJQBW7cTs","i3pydMK07Y","Waim6vkCHH","HRxd8J2mQi","a00b5VIlwP","7Ow5Chi5X7","lkMUA5ZaEz","dhSuHtlILt","0YAGHZuDtD",
+"BGaQYUlU3M","2Yz7E48cHL","7fsYM9GXkX","VjCZql83Ud","OHaBzJIqXi","QbxXcQ6Lix","8xEKzFFDui","5drc6wDajX","uPX7G5iGN5","2ZHdkThjNn",
+"lj07Q8xEKz","JJs5msqVrf","0PktIYh1hF","7fsYMiB08l","5NammQYxC0","JKWYRVNCPd","HzZT8gdQsS","faHir0YAGH","16lHccShY2","5nmWvJJs5m",
+"cQOnvtl72W","W3VFHNo0Qb","zFgtBZ4I1v","OUYuFlCMxy","BCxeCix74r","dhSuHnlaBy","Cfgr3hE1Ql","9eoRcnFqik","RkQkegjUTu","uJScXECMvU",
+"QChxshUTw7","7fsYMi3pyd","SjskQ2ZHdk","ru4UGt59lR","TXQ0ZMmsIo","64s8NIBe8k","mX2GE2hEEU","nlaBy9y4lw","Y1mC0hUTw7","FwEJzQYxC0",
+"LbRTH4QMc9","uQIczNxx9V","F6PT2Vprf2","dmoS7Chuy3","hUTw7i3pyd","HzZT8bgJAz","NhXduQChxs","I7p2ajtn0X","0h1b1iwzGk","ReKEWFhtgl",
+"h1zcH8U2nU","MmsIoThjNn","1j5L8nlaBy","HP433BbwgA","ReKEWWDVWJ","618DiBpYhV","zFgtBpFrrl","POUYSru4UG","NOHszHlUbF","Q6hMC3otm6",
+"Ta8f6Q6hMC","iwzGkYf2Ec","y94nwCNHmv","jzUqRCK5W7","W7cTsuupzk","OxWIH1LB1L","euZA5LewvM","U3yw5s93Ml","nlaByC2Irc","S77LHfmIK1",
+"CK5W7piJSk","2NslmcShY2","JKWYR14FLR","Uvlv4cL0aE","Mkgy8h1zcH","4W0TlaL6AJ","YjB9tfFDrJ","Chuy3QChxs","AmdQdzHF1q","GXdoHMezSW",
+"IjTwPeuZA5","Mm8sih1zcH","8hJdtix74r","lXFOBfmIK1","IBe8kwiHrZ","07n1cqaofN","LbRTHzqH0W","gdQsSuQIcz","Vprf29iGoT","bZLvSHzZT8",
+"GSQwjNOHsz","x3LDeFwEJz","v2eC3Dz1R3","JkzUnZJTXH","WPmlxRACuj","Twanoni2v1","K20wKlj07Q","lsQGoZhwG1","MaJQs0BmCy","KASQ8AXpwE",
+"cQOnvdhSuH","QChxsTCgPp","jS1ajGrDg7","B3qemuPX7G","nnP8obrhlQ","pWiOs2ZHdk","55rfByEfy9","tuDySZJTXH","M3zXLs7Mxk","S77LHCNHmv",
+"lViBvRzaZA","2hEEULbRTH","qQxHPKr8ys","zQt6QlpF6W","0YAGHjSjS3","FcWrWgf8rI","BpYhV5VZjS","EOE1odpe1v","kB5nPeuZA5","PYBf4HRxd8",
+"hi5X7Rxrsm","M3zXL0BmCy","hYBCKMGlTF","jeskSbgJAz","uoStwfLNg8","gtCA5HlUbF","OUqFML7cGc","s4786FjHXR","qQxHPThjNn","bgJAzoVQp6",
+"SbRYy2ZHdk","OUqFMBGaQY","24ARFs7Mxk","i7WMQOz8yZ","LbRTHhSSvQ","ciuWzAIYUu","CK5W716lHc","pmeCdYh1hF","24ARF5Drn0","dQ586S2Dfu",
+"ZzJHW55rfB","cQOnv4W0Tl","45cIHKASQ8","guMb87lUXZ","4QMc9DLhzM","cmXIXfaHir","Mkgy8fcJOy","vOqCECxVEf","gdQsSsuY4x","prNT61j5L8",
+"o8UydjeskS","DQimp0BmCy","LbRTHfcJOy","l83Ud16lHc","t98iWguMb8","n8pJ9suY4x","5NammWaim6","2TRI7C2Irc","tjQxstaOXK","W7cTs0h1b1",
+"FxX9qyofH3","yofH3tjQxs","ulk41FnPFB","ZhwG1FVMxo","dmoS7pvgjS","DQimpQssNC","2ZHdktAOsr","ciuWzMmKGJ","SbRYy7fKYU","WDVWJMezSW",
+"NAFuwAmdQd","hi5X7QbxXc","0YAGHuvf7A","2ZHdkIKxdL","uLtKsRmDcr","Mkgy8Cp3mZ","guMb8Dz1R3","MojnPBbwgA","RkQkeRmDcr","AXpwEYw2oU",
+"lpF6WEdBKc","guMb8QbxXc","zY1GY8TxD7","YOfrYSjskQ","QnJ1STwano","fmIK1lViBv","x3LDeuoStw","ThjNn0PktI","B3qemZzJHW","cShY2JJs5m",
+"JRJQBwiHrZ","Waim6YOfrY","JXljWd7vjM","8hJdt0Kyfs","MojnPNo0Qb","BCxeCogLgc","VBjhzAOgEe","fmIK1pWiOs","DLhzMbrhlQ","bZLvSiqv4k",
+"MGlTFFLsph","lj07QuZPqg","9iGoTIKxdL","ciuWzZUnqt","AgJHQP6bcg","5nmWvQbxXc","24ARFRpBQm","yEfy9Dz1R3","QssNCSbRYy","xciqpEOE1o",
+"uvf7AcL0aE","MGlTFeuZA5","5VZjSW3VFH","hi5X7M3zXL","IRh48tjQxs","lkMUAJkzUn","hSSvQ2DREs","dmoS7OUYuF","HzZT8RkQke","CqqaDblLA9",
+"lweGytjQxs","LDk6fZUnqt","580YDCdyBV","FjHXRbrhlQ","DLhzM2Yz7E","2hEEUgIYvE","RmDcrZzJHW","RkQkeNcICA","FLsphl83Ud","HlUbFjS1aj",
+"Cfgr3rhl0J","s4786580YD","FVMxoTa8f6","hi5X7o8Uyd","07n1c48cHL","mz8gxXyPZN","MmsIolkMUA","jS1aj2Yz7E","MGlTFZuDtD","soy9tpiJSk",
+"aez9yzY1GY","7X3uyKASQ8","QYxC0s93Ml","16lHcZv7z0","nnP8oYh1hF","WmadAru4UG","2DREsdpe1v","iB08lkB5nP","8cVD3t98iW","i3pydsx5Gl",
+"yToGWFPfSE","fcwDa9eoRc","cmXIXdmoS7","pAhR1yvOMI","yofH3FcWrW","kZANmatef2","LewvMv1Hln","5IhmG4W0Tl","vOqCEciuWz","VIlwP9XyT9",
+"SWfouydG8U","G1RhSBFkb8","RBhp0FnPFB","v8yFN3otm6","Fhtglfqypy","zz4ZUYh1hF","9iGoTTwano","mX2GEjiVBP","9XyT9oVQp6","D6rByMezSW",
+"pAhR1iqv4k","hYBCKru4UG","mz8gxlXFOB","9rlg9WMiS3","2DREspiJSk","RkQkefFDrJ","JRJQBe6e4z","0Wr5yWaim6","KsjRKQbxXc","VjCZqlXFOB",
+"6q6L9ECMvU","Ul4a10YAGH","64s8N7ku1p","Z4I1vO3iyQ","uTacxaFFss","piJSkGWqqX","ru4UGhYBCK","mz8gxvOqCE","7fKYUqQxHP","yToGW5Drn0",
+"cL0aEQ6Lix","yofH3ECMvU","DcpWB0BmCy","uupzkNOHsz","iKqhrS77LH","WaWsvRBhp0","SmGzvM6qcG","uLtKsYw2oU","5Drn0J2mQi","uupzkix74r",
+"KsjRK0ao3l","6q6L9n1pmO","v1HlnyToGW","bZLvSMkgy8","MK07YZ4I1v","lm0pD45cIH","FwEJz7X3uy","tuDyS0Wr5y","5NammFFDui","S2Dfu8U2nU",
+"lsQGo7X3uy","oGu6xe6e4z","JKWYRtlILt","4dEz6QbxXc","azIWp8xEKz","ZuDtDG1RhS","JJs5mD6rBy","GWqqXi3pyd","tuDySuoStw","s4786ulk41",
+"0BmCyOUqFM","ReKEWQssNC","v2eC3OHaBz","gjUTuJ2mQi","TCgPp55rfB","Vprf2VLTy6","e6e4zuZPqg","zqH0WuQIcz","zY1GYfcwDa","MGlTFxXTI4",
+"wiHrZn8pJ9","2NslmFLsph","djsrvlViBv","MojnPCqqaD","QYxC0qQxHP","M3zXLOUYuF","jSjS3tl72W","ZUnqtaez9y","Yw2oUogLgc","lm0pDCp3mZ",
+"uupzkLbRTH","W3VFHqQxHP","FwEJzMojnP","2ZHdkNOHsz","jeskSMGlTF","O3iyQ2DREs","TCgPpatef2","YOfrY4W0Tl","8hJdtAIYUu","MK07YW7cTs",
+"yToGWaL6AJ","Ta8f66q6L9","okgRiKsjRK","m4bxUP6bcg","7X3uyEoToP","MojnPjSjS3","jS1ajlm0pD","okgRijfREu","FFDui8U2nU","8xEKzaDGtS",
+"xReecuupzk","n8pJ95Namm","618Dirz7Ut","lH1ktReKEW","MmsIoI7p2a","UlU3Mv2eC3","oQ87rfqypy","tuDySUmaEv","hYBCKM6qcG","Chuy3d85a9",
+"FjHXRrhl0J","cQOnvfLNg8","lH1ktX6Pin","ciuWz4QMc9","CxVEfCxVEf","GSQwjVIlwP","xXTI40Kyfs","hUTw7AOgEe","EOE1oGrDg7","Yw2oUFNYIM",
+"lpF6WQworu","VNCPd5Namm","Zv7z0AgJHQ","hSSvQmX2GE","7fKYUSjskQ","M3zXL4QMc9","FxX9q618Di","FVMxozz4ZU","7fsYM8xEKz","fLNg8BpYhV",
+"RpBQmTXQ0Z","zFgtBKASQ8","48cHLYOfrY","2Yz7ERmDcr","IRh48SjskQ","TCgPpCNHmv","OxWIHWaim6","2hEEUt98iW","v1Hlntl72W","nFqikFLsph",
+"IRh48cQOnv","rKDLJ2ZHdk","QbxXc7ku1p","tlILt9eoRc","Qworu8RCUA","CK5W7ECMvU","uupzkDcpWB","KASQ8NhXdu","MaJQsuJScX","uQIczpvgjS",
+"9iGoTQnJ1S","FNYIMbrhlQ","faHirAXpwE","4QMc97Ow5C","Ss0Zu0ao3l","POUYSW7cTs","wDajX1v5hH","xciqpCNHmv","y94nwTCgPp","0h1b18RCUA",
+"ZhwG1JRJQB","AOgEeCfgr3","TwanoC2Irc","iB08l14FLR","3weIFrz7Ut","QnJ1S8FmFH","bZLvSW7cTs","FFDuiNxx9V","3otm6D6rBy","cQOnvJ2mQi",
+"o8Uydm4bxU","FhtgljeskS","XyPZNFhtgl","OHaBzzbIYY","yvOMIprNT6","55rfBECMvU","NcICAUlU3M","pT8wuUlU3M","pAhR1WPmlx","dpe1vMaJQs",
+"uLtKsFjHXR","QChxsStlDJ","FNYIMMaJQs","7hyVvAmdQd","GWqqXZUnqt","4QMc9MGlTF","NOHsz64s8N","BpYhVyofH3","RsQUqX6Pin","JkzUnkB5nP",
+"l83UdC2Irc","ECMvUFNYIM","faHir8hJdt","pAhR1Cfgr3","9iGoTrKDLJ","Vprf2zz4ZU","ni2v1okgRi","fcJOyIBe8k","NOHsz4dEz6","kB5nPoVQp6",
+"8cVD3Oz8yZ","jfREukB5nP","StlDJjfREu","atef2ZzJHW","v8yFNvLsmS","rKDLJDz1R3","s93MldhSuH","Cfgr34dEz6","5ZaEznFqik","CNHmvyvOMI",
+"8RCUA55rfB","EdBKcYOfrY","7fsYMYw2oU","n1pmORmDcr","hYBCK7lUXZ","yluBxe6e4z","ix74rtvdkD","GSQwjvLsmS","oVQp6DcpWB","ix74rhSSvQ",
+"C2IrcCqqaD","JkzUnPOUYS","ulk414W0Tl","L7cGcguMb8","JKWYR9eoRc","FFDuiJ2mQi","7X3uy5iGN5","VNCPdNhXdu","FhtglpvgjS","Uvlv4atef2",
+"FxX9qtlILt","8U2nUFxX9q","8FmFHXflUq","aL6AJFLsph","FFDuiW7cTs","lweGyMmsIo","b29RJv1Hln","7hyVv0h1b1","djsrv4QMc9","QChxsuvf7A",
+"v2eC32Nslm","9iGoT48cHL","2TRI74QMc9","ksJbyzmLYD","5IhmGWaWsv","L7cGcNcICA","M3zXLjeskS","8hJdtwiHrZ","gf8rIru4UG","OUqFMChuy3",
+"dQ586QChxs","GXdoHIKxdL","rKDLJNAFuw","J2mQiDQimp","hUTw7atef2","pAhR1gtCA5","brhlQxReec","FNYIMe6e4z","OHaBzaFFss","i7WMQbZLvS",
+"s7MxkXflUq","CxVEfAOgEe","soy9t5Drn0","zQt6QNo0Qb","K20wKFGzgp","CqqaD9eoRc","QssNCLbRTH","CNHmvzz4ZU","b29RJ8cVD3","zHF1qYOfrY",
+"e6e4zQChxs","JJs5mRsQUq","mz8gx5Namm","lkMUAwiHrZ","4QMc9WreyP","dhSuHQClRL","5Mg9rcmXIX","n8pJ95iGN5","s93MlMezSW","zFgtBXyPZN",
+"aL6AJjtn0X","64s8N7fKYU","uAWypCIShG","xXTI4Rxrsm","ix74rgIYvE","XyPZNblLA9","QnJ1SMezSW","d7vjMjS1aj","8TxD77lUXZ","zz4ZUDz1R3",
+"2DREszbIYY","K4GS8CK5W7","4dEz6CIShG","prNT65iGN5","tlILt5IhmG","ZUnqtiqv4k","ru4UGCp3mZ","lpF6W9XyT9","0YAGHblLA9","zY1GYHfyNQ",
+"F6PT23weIF","l83UdF6PT2","lkMUAuvf7A","G1RhSECMvU","yluBxSjskQ","Ul4a1cQOnv","v2eC3wDajX","s93MltAOsr","TwanoFnPFB","FFDuiZv7z0",
+"AgJHQhe9IA","9y4lwDcpWB","y94nw1v5hH","NOHsz8cVD3","JKWYRZhwG1","DLhzMVIlwP","RsQUq0ao3l","5IhmGGv3Fq","W3VFHQClRL","pAhR1Oz8yZ",
+"W7cTs618Di","tlILtBGaQY","HRxd89eoRc","oGu6xlCMxy","i3pydaDGtS","HRxd8LbRTH","azIWpW7cTs","C2IrcvOqCE","0ao3lpvgjS","0YAGHBpYhV",
+"O3iyQ618Di","OUqFMFjHXR","LewvMIjTwP","t98iWxciqp","fcwDa0BmCy","IKxdLYOfrY","guMb8NOHsz","RpBQmuPX7G","s7MxkWDVWJ","t59lR0YAGH",
+"FVMxoDLhzM","SWfouWPmlx","tjQxsKr8ys","a00b50MR5X","uAWypZv7z0","AkKTktuDyS","6q6L9CxVEf","n1pmOAIYUu","s4786BFkb8","VLTy64W0Tl",
+"aFFsslXFOB","No0Qbatef2","AOgEes93Ml","fcwDaJkzUn","W3VFHWreyP","POUYSLbRTH","dmoS7In3NS","6AFT0Dz1R3","WreyPs4786","EoToPY1mC0",
+"F6PT2WDVWJ","QWxoTcQOnv","RBhp0DG4sT","1LB1LTwano","n8pJ9qQxHP","0Wr5ynnP8o","PYBf4jiVBP","9rlg9W7cTs","StlDJUvlv4","PYBf4K20wK",
+"lsQGoZJTXH","7fKYUVBjhz","7fsYM0Kyfs","qUJMdJkzUn","In3NSX6Pin","tvdkDRpBQm","hi5X7x3LDe","guMb88cVD3","fFDrJb29RJ","B3qem2TRI7",
+"RmDcrqaofN","Ta8f6ZJTXH","euZA5KZamH","JKWYRFhtgl","gdQsSeuZA5","ulk41lH1kt","FjHXROHaBz","8U2nU8hJdt","Yf2Ec0BmCy","kZANmyvOMI",
+"bZLvSrhl0J","WreyPa00b5","fqypyuLtKs","n8pJ98hJdt","kB5nPhi5X7","gf8rIydG8U","atef2BFkb8","4QMc9m4bxU","gIYvElj07Q","F6PT2gdQsS",
+"jeskSRzaZA","RzaZAnFqik","pT8wuzFgtB","AOgEecmXIX","GrDg7iqv4k","lsQGofmIK1","d7vjMjzUqR","lpF6W6q6L9","GXdoHIjTwP","4W0TlPYBf4",
+"ciuWzzqH0W","IKxdLlj07Q","QWxoTIn3NS","D6rByIKxdL","qQxHPBGaQY","M6qcGs4786","uN6r3Rxrsm","tuDySgjUTu","fLNg8HzZT8","t59lRhi5X7",
+"aL6AJG1RhS","55rfBv2eC3","QssNCO3iyQ","KZamHFVMxo","Zv7z0HP433","6q6L9zqH0W","LbRTHjS1aj","MezSWIn3NS","4W0Tl7fsYM","zz4ZUmz8gx",
+"6q6L9EdBKc","EdBKcjS1aj","FLsphiB08l","JRJQBl83Ud","OHaBzWaWsv","TwanocmXIX","4QMc9lj07Q","L7cGcNAFuw","oGu6xJ2mQi","StlDJzQt6Q",
+"MmKGJHlUbF","WmadAokgRi","VBjhzYjB9t","DcpWBHfyNQ","TCgPplj07Q","618Dirhl0J","FjHXR9rlg9","iKqhrzz4ZU","uoStwBbwgA","XyPZN8FmFH",
+"gjUTux3LDe","dQ5867ku1p","ru4UGuAWyp","pvgjS7ku1p","zqH0WtvdkD","Pb1paHRxd8","x3LDebZLvS","5iGN5WmadA","SjskQW3VFH","jzUqR5nmWv",
+"pvgjSJRJQB","gIYvEhi5X7","ZJTXH48cHL","jeskSQ6Lix","kZANmTa8f6","M3zXL8U2nU","i7WMQqUJMd","hYBCKZhwG1","2Yz7Edjsrv","jeskSWDVWJ",
+"FVMxoRmDcr","14FLR618Di","7lUXZVerEA","7lUXZDz1R3","RsQUqEdBKc","lCMxyNcICA","zHF1qRxrsm","Vprf25IhmG","uPX7G1v5hH","FhtglWMiS3",
+"0YAGHuupzk","M6qcGW7cTs","DQimpYOfrY","rhl0JfcJOy","4QMc99XyT9","pFrrl29QAz","lXFOBqUJMd","cQOnvxXTI4","uN6r3F6PT2","Gv3FqlkMUA",
+"RACujYh1hF","GSQwjy94nw","yluBxStlDJ","MGlTFlH1kt","qaofN9rlg9","iwzGk618Di","Gv3Fqfqypy","ru4UGBCxeC","yToGWprNT6","LDk6flsQGo",
+"9eoRcS77LH","okgRiO3iyQ","CqqaD6AFT0","YjB9t14FLR","d7vjMCdyBV","brhlQprNT6","uAWypMmsIo","2Yz7EpmeCd","IKxdLmz8gx","ECMvUBGaQY",
+"3weIF9rlg9","d85a9jiVBP","7X3uyK20wK","HzZT8618Di","fcJOyOz8yZ","ix74r8cVD3","zbIYYrKDLJ","FjHXRkZANm","SWfouB3qem","KZamHpmeCd",
+"LbRTHNOHsz","uTacxCIShG","uZPqgWDVWJ","LDk6fhUTw7","WPmlxW7cTs","uAWypjeskS","yvOMIi3pyd","zmLYDQClRL","JXljWQWxoT","cQOnvjiVBP",
+"NOHsz6q6L9","FGzgptaOXK","0BmCydQ586","Yw2oUOz8yZ","t59lRBFkb8","RxrsmKASQ8","HP433MGlTF","IKxdLQworu","FNYIMx3LDe","pvgjSOHaBz",
+"NAFuwuTacx","I7p2aPb1pa","AmdQdGXdoH","0h1b15nmWv","TCgPpWMiS3","lj07Q9y4lw","5VZjSMezSW","h1zcH2hEEU","FnPFBwDajX","dpe1vzbIYY",
+"K20wKGWqqX","DLhzMJJs5m","lm0pDC2Irc","fFDrJOxWIH","cShY2CdyBV","atef2QbxXc","DQimpFVMxo","0BmCye6e4z","GSQwjFnPFB","uJScXyToGW",
+"FxX9qO3iyQ","9rlg9FVMxo","oVQp6jtn0X","mX2GEWmadA","gdQsSrhl0J","Q6hMCSs0Zu","oGu6xECMvU","he9IAcmXIX","1LB1Liqv4k","EoToPlsQGo",
+"4QMc9ZJTXH","QssNCqaofN","5IhmGBFkb8","gdQsSdjsrv","POUYSMGlTF","Rxrsmuvf7A","HlUbFd85a9","7fKYUTCgPp","dmoS7SmGzv","mX2GEAgJHQ",
+"okgRis7Mxk","y94nwTwano","OUqFMwDajX","16lHciwzGk","3otm68RCUA","s93MlWaWsv","k85Ae4QMc9","yToGWMojnP","6AFT05VZjS","dpe1vQWxoT",
+"lViBvM3zXL","W7cTsWreyP","taOXKFcWrW","CxVEfhE1Ql","ni2v1IRh48","M3zXLIn3NS","0YAGHmX2GE","5IhmGCNHmv","Q6Lixulk41","vkCHHQWxoT",
+"yvOMIJkzUn","5drc6JRJQB","a00b5tAOsr","FNYIMJkzUn","nnP8o16lHc","WDVWJIRh48","5VZjSni2v1","4dEz6lkMUA","3weIFksJby","vkCHHpvgjS",
+"guMb8taOXK","FcWrWOxWIH","cQOnv6AFT0","YOfrYyToGW","9XyT9Chuy3","LewvMo8Uyd","M3zXL8xEKz","CK5W7IjTwP","ni2v1QClRL","Cp3mZ2ZHdk",
+"Uvlv45nmWv","No0QbvkCHH","FFDuipWiOs","FxX9q29QAz","OxWIHcQOnv","m4bxUlweGy","aL6AJMkgy8","iwzGkGSQwj","W3VFHOUYuF","AmdQdMGlTF",
+"7X3uyDz1R3","5iGN5FPfSE","0BmCyFcWrW","dpe1voVQp6","SWfouHlUbF","QssNCEdBKc","7ku1prKDLJ","yToGWoGu6x","ZuDtDJJs5m","Z4I1vCfgr3",
+"n8pJ9aez9y","UmaEv07n1c","aDGtScL0aE","CIShGWMiS3","7ku1pd7vjM","FwEJzoVQp6","ZzJHWTXQ0Z","GrDg7sqVrf","9iGoTGSQwj","yvOMIpmeCd",
+"d7vjMNo0Qb","48cHL0Kyfs","HlUbFMaJQs","AkKTkVLTy6","tjQxszz4ZU","xciqptAOsr","CNHmvJ2mQi","FPfSEhe9IA","azIWpCqqaD","QnJ1SS77LH",
+"cQOnvRxrsm","Kr8ysTXQ0Z","5Mg9r8xEKz","45cIHru4UG","Vprf22TRI7","4QMc9cShY2","fcJOyfcwDa","EOE1olsQGo","8FmFHMkgy8","CK5W71LB1L",
+"mX2GE0BmCy","fcwDaiB08l","Yf2Ec0MR5X","Uvlv4hi5X7","FPfSEQbxXc","YOfrYFFDui","0Wr5yU3yw5","uN6r3YOfrY","fcwDa0Wr5y","FLsphuZPqg",
+"POUYSFVMxo","hi5X7J2mQi","S2DfuhSSvQ","GXdoHbZLvS","5IhmGOHaBz","yluBxRACuj","jS1aj0YAGH","aDGtSMkgy8","uZPqgK4GS8","SWfou5VZjS",
+"h1zcH7Ow5C","aez9ylpF6W","24ARFyvOMI","zY1GYhe9IA","FPfSEprNT6","FjHXRQworu","NOHszdQ586","Cfgr3JIqXi","s4786Yf2Ec","NOHszXyPZN",
+"zbIYYhUTw7","LbRTHU3yw5","iwzGkciuWz","hYBCK5ZaEz","07n1cFjHXR","4W0Tl0PktI","4W0TlRxrsm","StlDJrz7Ut","KASQ8k85Ae","0ao3lBpYhV",
+"vkCHHFVMxo","pWiOsRBhp0","d7vjMv2eC3","DLhzMyofH3","MojnPRpBQm","jiVBPTa8f6","5IhmGv2eC3","5Drn00Wr5y","StlDJxReec","iqv4kiB08l",
+"jeskSHzZT8","fLNg8VerEA","VBjhzvkCHH","zz4ZUpFrrl","suY4x48cHL","jfREus7Mxk","lkMUAJJs5m","07n1cMK07Y","cmXIX9iGoT","l83UdlXFOB",
+"dhSuHi7WMQ","7hyVv9GXkX","lkMUAOz8yZ","HRxd8jiVBP","Mm8siHzZT8","7X3uyEdBKc","hYBCKEoToP","Waim6pFrrl","No0QbThjNn","LDk6f24ARF",
+"9GXkXqUJMd","Waim6zQt6Q","QClRLVNCPd","1v5hHK4GS8","5VZjStvdkD","HRxd87X3uy","hi5X72hEEU","suY4xVprf2","AIYUuWMiS3","fmIK1QWxoT",
+"b29RJQWxoT","uPX7Gsoy9t","VerEAt98iW","WaWsvkB5nP","8TxD7aDGtS","CIShGOHaBz","YOfrYRmDcr","v2eC31j5L8","MmKGJnFqik","4dEz6IBe8k",
+"jeskSWPmlx","vLsmSOUqFM","Ta8f6K20wK","9eoRczY1GY","NcICAlViBv","lViBv16lHc","fcwDaulk41","Cfgr3BbwgA","5VZjSDQimp","K20wKdmoS7",
+"tlILtIKxdL","AmdQdS2Dfu","CIShGx3LDe","VerEAwDajX","No0Qbdjsrv","piJSk7fKYU","7X3uyyofH3","iB08ldhSuH","1LB1LO3iyQ","vkCHHG1RhS",
+"WPmlxoVQp6","5Mg9r0BmCy","IjTwPEOE1o","2TRI7b29RJ","yEfy9Uvlv4","y94nwmX2GE","fqypy55rfB","ciuWzAmdQd","HRxd8MK07Y","fmIK1FPfSE",
+"2NslmpWiOs","jiVBPRsQUq","aez9yVIlwP","uTacxFPfSE","IjTwPhi5X7","Waim6gf8rI","v2eC3tvdkD","CIShGVprf2","2Nslmv8yFN","vkCHHxciqp",
+"Uvlv4okgRi","aez9yX6Pin","JJs5m2Yz7E","uAWypYf2Ec","s7Mxk0ao3l","5Mg9rvkCHH","ZUnqtcQOnv","RsQUq9XyT9","zz4ZUEdBKc","580YDRkQke",
+"Yh1hFuupzk","gjUTuOxWIH","No0QbFcWrW","JKWYRZv7z0","POUYSYOfrY","TwanojzUqR","FLsphEOE1o","kZANmuQIcz","5drc60YAGH","AmdQdl83Ud",
+"TCgPp2Yz7E","hE1QlzQt6Q","lsQGoKsjRK","hi5X7OxWIH","MezSWpT8wu","aDGtSn1pmO","tlILtuAWyp","EOE1oQ6Lix","rz7UtYjB9t","8xEKztl72W",
+"s93MlkB5nP","zY1GYFPfSE","SWfougf8rI","LewvMLDk6f","Nxx9VTa8f6","W3VFHG1RhS","rhl0JHzZT8","lViBvGWqqX","IBe8kK20wK","8RCUAkZANm",
+"fcJOyZhwG1","s7Mxk9eoRc","hUTw7L7cGc","GSQwjPOUYS","O3iyQcL0aE","IjTwP5Mg9r","t59lR24ARF","uvf7AdQ586","zY1GYKsjRK","AIYUu7fsYM",
+"1j5L8jfREu","2Yz7EpWiOs","FPfSETwano","618DiCNHmv","DQimpSjskQ","TXQ0ZhSSvQ","OUYuF3otm6","AOgEeK20wK","LewvMbZLvS","lj07QjeskS",
+"ix74rYf2Ec","s4786FPfSE","I7p2apAhR1","Yf2EcLDk6f","6q6L9ciuWz","KZamHSWfou","Z4I1vQClRL","9rlg9Mkgy8","WaWsvVjCZq","RkQkeuQIcz",
+"lpF6W5Namm","RsQUqJRJQB","QClRLIBe8k","sx5GlWaWsv","iB08ldmoS7","9iGoTWmadA","ReKEWuJScX","i3pydUmaEv","5iGN5XflUq","1j5L8brhlQ",
+"LewvMX6Pin","uupzkjS1aj","2TRI72DREs","vkCHHiwzGk","tjQxsbZLvS","FGzgpRBhp0","tAOsrRzaZA","oVQp6okgRi","hSSvQ07n1c","cL0aEtaOXK",
+"5IhmGMK07Y","jfREudmoS7","In3NS8cVD3","ZuDtDcQOnv","lsQGodpe1v","6AFT0MaJQs","UlU3M0YAGH","Q6hMCl83Ud","lkMUAU3yw5","4W0TloGu6x",
+"Cfgr35VZjS","5Mg9rpmeCd","1LB1LguMb8","IBe8kDG4sT","pFrrlksJby","ZzJHW0h1b1","blLA9suY4x","CK5W7RACuj","gIYvEpv0i7","e6e4zLewvM",
+"suY4xAkKTk","FVMxowDajX","C2IrcJIqXi","TCgPpXyPZN","AXpwES2Dfu","i7WMQFPfSE","rz7Utb29RJ","HP433jzUqR","dpe1vulk41","0ao3lVNCPd",
+"QworuMmsIo","lXFOB7fsYM","fcJOyJ2mQi","gf8rIuoStw","vLsmSuTacx","Ta8f6OUYuF","TCgPp5ZaEz","jzUqRmX2GE","Q6hMCJRJQB","xciqpAXpwE",
+"ni2v1618Di","l83UdRACuj","gdQsSRsQUq","pFrrlLewvM","9eoRcThjNn","55rfBIKxdL","FPfSEyEfy9","aez9ys93Ml","DG4sTiwzGk","Qworudpe1v",
+"ru4UGIn3NS","yEfy97hyVv","M6qcGt59lR","MGlTFWMiS3","Yw2oUazIWp","K4GS8Q6hMC","IRh480h1b1","lm0pDWreyP","IjTwPZv7z0","07n1cxXTI4",
+"e6e4zdhSuH","2TRI78RCUA","guMb80YAGH","atef25Namm","uoStwni2v1","tuDySCNHmv","YjB9ta00b5","QChxsSmGzv","TCgPpblLA9","RpBQmNxx9V",
+"ix74rRsQUq","faHiruZPqg","euZA55Drn0","uQIczdhSuH","5Mg9rZUnqt","lH1ktTwano","ReKEWfcJOy","jeskSW7cTs","Mkgy8lkMUA","CxVEfJ2mQi",
+"GXdoH5Drn0","zmLYDzY1GY","W7cTsjzUqR","W7cTsrhl0J","bZLvS64s8N","hi5X7jeskS","B3qeme6e4z","UmaEvDG4sT","uQIczpT8wu","aFFssdhSuH",
+"FPfSEaFFss","5iGN5ReKEW","dmoS7Oz8yZ","yEfy90h1b1","DG4sT7Ow5C","JRJQBKr8ys","14FLRgdQsS","In3NSPOUYS","fcJOyni2v1","gf8rISbRYy",
+"fcJOyo8Uyd","CNHmvlsQGo","gIYvEjtn0X","hYBCKRmDcr","lkMUAIn3NS","wDajXjiVBP","tAOsruLtKs","POUYSrz7Ut","FNYIMVNCPd","U3yw5RBhp0",
+"uTacxpiJSk","jiVBPbrhlQ","GWqqXRACuj","fmIK1s93Ml","xReecFjHXR","yvOMISs0Zu","yEfy916lHc","lm0pD24ARF","gf8rItvdkD","ix74rQnJ1S",
+"zY1GYuAWyp","hi5X7Qworu","7fsYMt59lR","OUYuFcmXIX","SjskQNAFuw","e6e4zMK07Y","wDajXDcpWB","fqypyBGaQY","qUJMdEoToP","VerEA8RCUA",
+"S2DfuuAWyp","I7p2aF6PT2","CxVEf8TxD7","SmGzv45cIH","tAOsr0ao3l","Dz1R3RkQke","xReecZUnqt","Yw2oU0Wr5y","jeskS2ZHdk","29QAzGSQwj",
+"lm0pDSbRYy","29QAzyofH3","2NslmMaJQs","1LB1LUmaEv","Ul4a1soy9t","UmaEvpvgjS","cShY2uLtKs","C2Ircd7vjM","yvOMIgf8rI","0BmCyC2Irc",
+"uPX7GfcJOy","2Yz7ElsQGo","gdQsSyofH3","LewvMguMb8","EoToPVprf2","e6e4zlViBv","QssNCQChxs","I7p2aUmaEv","POUYSNo0Qb","FjHXRjzUqR",
+"HRxd8MezSW","mz8gxRzaZA","jS1ajs4786","Ul4a1AIYUu","vkCHHqaofN","1v5hHFjHXR","HRxd82Yz7E","LbRTH7fKYU","S2DfuYf2Ec","0YAGHFGzgp",
+"zFgtBFLsph","hE1QlY1mC0","zbIYYF6PT2","GrDg7SmGzv","tuDyShUTw7","jtn0XO3iyQ","uLtKsVBjhz","8FmFHFhtgl","QWxoTAOgEe","ni2v1ogLgc",
+"oQ87r5VZjS","suY4x7fsYM","i7WMQpAhR1","yToGWHfyNQ","CIShGKZamH","0h1b1jS1aj","7fsYMfqypy","Rxrsm0ao3l","uTacxjeskS","SmGzvpT8wu",
+"8RCUAtvdkD","a00b5okgRi","5nmWvECMvU","atef2ni2v1","euZA5pv0i7","M3zXLFVMxo","MmKGJB3qem","lm0pDoGu6x","atef2JRJQB","cShY2WDVWJ",
+"0KyfstjQxs","gf8rIWDVWJ","gIYvEzQt6Q","bgJAzsoy9t","Yw2oU8U2nU","55rfB0Wr5y","hE1QlksJby","5NammCK5W7","UlU3MkB5nP","OxWIHG1RhS",
+"RkQkejS1aj","WaWsvjiVBP","4W0TlNo0Qb","IBe8kNxx9V","JXljWCNHmv","ru4UGlweGy","ogLgcMm8si","DcpWBMojnP","nlaBy4QMc9","MaJQsFPfSE",
+"hE1Qltl72W","CxVEfAkKTk","o8Uyd2TRI7","prNT6P6bcg","RBhp0Ta8f6","7X3uyJRJQB","XflUqSbRYy","xXTI4LewvM","NhXduQ6hMC","lweGyOUYuF",
+"lm0pD0BmCy","0BmCyKr8ys","5Mg9rWmadA","mz8gx8hJdt","0BmCy0YAGH","9GXkX14FLR","VerEA7hyVv","v1HlnAXpwE","lm0pDTCgPp","9GXkXS77LH",
+"MK07Y5ZaEz","VerEAkB5nP","Ss0Zu5Drn0","lsQGofFDrJ","fcJOyuvf7A","6AFT0cShY2","QWxoTRsQUq","FjHXR9GXkX","prNT6AgJHQ","5Mg9rHP433",
+"tvdkDhe9IA","s4786MK07Y","dhSuHiKqhr","iqv4kMkgy8","RkQke0ao3l","55rfBWMiS3","lweGy16lHc","VBjhzfmIK1","Mkgy8bgJAz","bgJAze6e4z",
+"I7p2aKr8ys","n1pmORACuj","FhtglUlU3M","hi5X7euZA5","GrDg7UmaEv","gf8rI2Nslm","uupzks4786","7ku1p0Wr5y","FPfSEydG8U","aFFssCp3mZ",
+"jfREuQ6hMC","uQIcziKqhr","3weIFazIWp","aDGtSW7cTs","VBjhz9GXkX","FPfSEhi5X7","suY4xyvOMI","D6rByfqypy","VLTy6s4786","CK5W7cQOnv",
+"mX2GEi7WMQ","0Kyfs29QAz","618DinlaBy","ZJTXHSmGzv","CNHmvcShY2","RBhp0hUTw7","MK07Yt98iW","RBhp0MezSW","Mkgy8FxX9q","IRh48i7WMQ",
+"0BmCy5ZaEz","xXTI4fmIK1","P6bcghE1Ql","Mkgy8zmLYD","GXdoHQbxXc","7fsYMjzUqR","LewvM29QAz","Ss0Zugf8rI","s7Mxki3pyd","jS1ajEoToP",
+"s93MlgtCA5","i3pydSjskQ","Ul4a1ksJby","RzaZAwiHrZ","m4bxUtaOXK","t59lRb29RJ","x3LDeJkzUn","0PktI7hyVv","JkzUnJKWYR","gdQsSxciqp",
+"VNCPdfFDrJ","he9IAEdBKc","tl72W580YD","okgRikZANm","ECMvUTCgPp","brhlQ16lHc","2TRI7GSQwj","BGaQYJXljW","JJs5mBCxeC","vLsmSuZPqg",
+"uJScXYw2oU","5ZaEz8xEKz","fFDrJqUJMd","bZLvS4dEz6","h1zcHWDVWJ","OUYuFrz7Ut","0KyfsFLsph","XflUqQbxXc","5Mg9rJXljW","VNCPdDLhzM",
+"5VZjSKZamH","ru4UGHP433","gIYvEuN6r3","GWqqXpWiOs","CNHmvuQIcz","tlILttl72W","F6PT2RpBQm","yofH39XyT9","sqVrfVBjhz","Nxx9VvLsmS",
+"CK5W7In3NS","pFrrlYjB9t","dhSuH7Ow5C","QChxsUl4a1","azIWpGXdoH","uN6r3P6bcg","uPX7GWmadA","S2Dfuzz4ZU","rz7Ut2Nslm","4W0TlCfgr3",
+"n1pmO0PktI","YjB9tJKWYR","QYxC05iGN5","8cVD3AgJHQ","zY1GYs7Mxk","8RCUAi3pyd","hi5X7Ss0Zu","9GXkXWreyP","AmdQdD6rBy","oGu6x48cHL",
+"JKWYRgtCA5","7Ow5CNhXdu","CIShGQChxs","G1RhSjSjS3","JJs5m4QMc9","hSSvQjeskS","0ao3lRpBQm","CNHmvC2Irc","ZJTXHzFgtB","fmIK1StlDJ",
+"lweGymz8gx","FPfSEKsjRK","JRJQBQYxC0","Pb1paQClRL","wiHrZVprf2","CxVEfa00b5","iB08l8FmFH","HfyNQ5ZaEz","o8UydlkMUA","rz7UtyofH3",
+"5nmWvQssNC","VLTy6Ss0Zu","prNT6xReec","Yw2oUoVQp6","4QMc9uLtKs","v2eC345cIH","CNHmvzY1GY","VLTy6zqH0W","MojnPmX2GE","jSjS34W0Tl",
+"4W0Tl2Nslm","lweGy8xEKz","RmDcrdQ586","UlU3M5iGN5","Ss0Zu24ARF","7Ow5CZJTXH","Ss0ZuIn3NS","6q6L9cShY2","MezSWyluBx","v2eC3EOE1o",
+"0BmCyBbwgA","5iGN57ku1p","CdyBV9rlg9","3weIFtuDyS","hSSvQ2hEEU","CxVEfpv0i7","MGlTFm4bxU","8xEKzCxVEf","45cIHI7p2a","QClRLlH1kt",
+"MGlTFzz4ZU","MGlTFMojnP","8cVD3aFFss","NhXducQOnv","7ku1pxXTI4","hYBCKFwEJz","FNYIMaL6AJ","JKWYRgdQsS","BCxeCyluBx","NcICApT8wu",
+"CIShGuLtKs","yvOMIpiJSk","ThjNnuPX7G","0BmCy618Di","gjUTuK4GS8","fcJOyEOE1o","No0Qb7Ow5C","yofH3y94nw","nFqik9GXkX","v1HlnY1mC0",
+"8xEKzokgRi","0BmCysoy9t","s7MxkZv7z0","uAWypuAWyp","iKqhrlweGy","CNHmvSWfou","ReKEWMkgy8","Mm8si8RCUA","Mkgy864s8N","lsQGonnP8o",
+"euZA5jzUqR","LbRTHNhXdu","XflUqRpBQm","5Drn0cQOnv","M3zXLJXljW","MmKGJUvlv4","WreyP7fKYU","FnPFBRsQUq","Dz1R36AFT0","D6rBy7X3uy",
+"5Nammt98iW","HP433J2mQi","618DiiwzGk","wDajXguMb8","pT8wugtCA5","cL0aELbRTH","lsQGoDz1R3","O3iyQNhXdu","oQ87rokgRi","v2eC3lXFOB",
+"0Wr5yNhXdu","NAFuw5nmWv","pAhR1aFFss","XyPZNokgRi","UlU3MC2Irc","soy9t1v5hH","5drc6YjB9t","BpYhVfqypy","QbxXciB08l","VBjhzpT8wu",
+"580YDgjUTu","qUJMdWreyP","5Mg9rMezSW","Cfgr3he9IA","FGzgp0Wr5y","NOHszUvlv4","BGaQYoQ87r","Mkgy8HP433","gIYvE8xEKz","W7cTsuZPqg",
+"VLTy6RACuj","Zv7z0hE1Ql","KZamH9iGoT","RkQke48cHL","64s8NlweGy","LbRTH0MR5X","MaJQsZ4I1v","mX2GE2TRI7","cmXIXrz7Ut","16lHc8RCUA",
+"taOXKi7WMQ","pvgjSiqv4k","Cp3mZpWiOs","QbxXcS2Dfu","wDajXFGzgp","Fhtgl8RCUA","Nxx9V5IhmG","lH1ktYf2Ec","1v5hHLDk6f","VIlwPRpBQm",
+"GWqqXmz8gx","HlUbFyluBx","OUYuFYh1hF","5VZjSJKWYR","LewvMjzUqR","14FLR1LB1L","rhl0JAkKTk","0h1b1jtn0X","vOqCERxrsm","GSQwjYOfrY",
+"lkMUAWPmlx","ECMvUW3VFH","s4786HRxd8","WMiS3QWxoT","HfyNQOUYuF","QClRLNxx9V","wiHrZKZamH","QClRLHfyNQ","dQ586lH1kt","qaofNGv3Fq",
+"Yf2EctuDyS","64s8NgdQsS","0Wr5ylweGy","GrDg78TxD7","JIqXin1pmO","gIYvEpAhR1","aDGtSkB5nP","UmaEvlm0pD","fqypyThjNn","Yw2oU5drc6",
+"SjskQBpYhV","Mkgy8nnP8o","gjUTuXflUq","fmIK1RsQUq","Ta8f6hSSvQ","D6rBySs0Zu","WaWsv4W0Tl","jSjS3XflUq","Y1mC0AmdQd","7fKYUUmaEv",
+"ni2v1uvf7A","oVQp6JkzUn","lH1kt8RCUA","5iGN5oQ87r","QbxXcokgRi","Zv7z0MGlTF","BpYhVZ4I1v","ECMvUn8pJ9","3weIFFxX9q","NhXduCdyBV",
+"jSjS3Mkgy8","lpF6WFnPFB","nlaByQssNC","8hJdtBCxeC","7fsYM0YAGH","Nxx9VyEfy9","hi5X7C2Irc","W3VFHfcwDa","OUYuFOUqFM","5ZaEzdpe1v",
+"ZhwG18TxD7","7ku1puupzk","8RCUA9iGoT","UlU3MlkMUA","kB5nPix74r","AgJHQJIqXi","AkKTkFNYIM","MGlTFStlDJ","SWfouOUYuF","Yf2Ecdpe1v",
+"jeskSRpBQm","KsjRKzbIYY","gjUTuF6PT2","lsQGoFjHXR","Yw2oUxXTI4","0YAGHcmXIX","lH1ktQ6hMC","OxWIH0MR5X","dhSuHdQ586","e6e4z4dEz6",
+"6q6L9e6e4z","gf8rIzbIYY","hUTw7CK5W7","dmoS7xciqp","uLtKsbZLvS","Fhtgl16lHc","faHirqQxHP","5Mg9r5IhmG","7lUXZaez9y","iB08lEoToP",
+"DcpWBTwano","jzUqRVNCPd","9eoRc6q6L9","NhXduThjNn","uZPqgAmdQd","t98iW580YD","DQimpMmsIo","M6qcG7fsYM","J2mQiG1RhS","lsQGoD6rBy",
+"IRh48J2mQi","k85AedhSuH","IBe8kyToGW","5IhmGuZPqg","Vprf2cShY2","pAhR1yofH3","VerEApvgjS","NhXduUvlv4","ZzJHW5Drn0","XyPZNni2v1",
+"S2DfuQClRL","ZUnqtBFkb8","BpYhVYh1hF","Yf2EctaOXK","S77LHpmeCd","TCgPpuZPqg","StlDJjzUqR","piJSkwiHrZ","fcwDaa00b5","gIYvEZuDtD",
+"QssNC9eoRc","Nxx9VAgJHQ","HzZT8PYBf4","lj07QRmDcr","zqH0WAkKTk","zHF1q16lHc","xciqpazIWp","0Wr5ycQOnv","pFrrlprNT6","IBe8kjfREu",
+"64s8NS77LH","CNHmvPOUYS","BFkb8FxX9q","gf8rIs4786","rz7UtCfgr3","rKDLJcShY2","WPmlxStlDJ","9eoRcogLgc","Mm8sifqypy","zY1GYlpF6W",
+"RkQke0h1b1","8hJdtdjsrv","2hEEU1LB1L","QworuOHaBz","JIqXiMm8si","y94nwSjskQ","tuDySVIlwP","dQ586dQ586","Ta8f6KsjRK","JIqXisoy9t",
+"ZuDtD55rfB","4QMc9SmGzv","h1zcHcShY2","HP4335nmWv","EOE1oCNHmv","Ta8f6s93Ml","MGlTFzQt6Q","9y4lwiKqhr","7fsYMdmoS7","D6rBysuY4x",
+"KZamH2ZHdk","ThjNncL0aE","lj07QuTacx","oVQp6QbxXc","t59lRlsQGo","9eoRcHzZT8","blLA9uQIcz","5Mg9rMmsIo","AOgEeMojnP","tlILt5VZjS",
+"MmKGJni2v1","48cHL0BmCy","aDGtSVIlwP","hi5X7ECMvU","prNT62Yz7E","lm0pDHlUbF","vLsmS5VZjS","XyPZNKZamH","C2Ircs93Ml","Vprf2Y1mC0",
+"7fsYMm4bxU","QnJ1SK4GS8","FNYIMuQIcz","7ku1pDcpWB","xReeccL0aE","NcICA2Yz7E","EdBKc0YAGH","Ta8f6KASQ8","FPfSEsoy9t","v2eC30Wr5y",
+"Q6hMCpAhR1","VBjhz8xEKz","5Drn0faHir","xReecFhtgl","ogLgclj07Q","xReecVBjhz","Yf2Ec8hJdt","iwzGkpiJSk","lkMUAdjsrv","ZUnqttl72W",
+"Y1mC0xReec","8hJdtprNT6","faHirlViBv","lm0pDLDk6f","uQIczqQxHP","s93Ml8hJdt","oQ87rhYBCK","prNT6tvdkD","nnP8o24ARF","1v5hHgIYvE",
+"VNCPdciuWz","lViBvGXdoH","OUYuFFxX9q","FVMxo7fsYM","FwEJzX6Pin","aez9yfaHir","jtn0Xa00b5","ulk41Qworu","Uvlv41j5L8","FjHXRIKxdL",
+"BbwgAC2Irc","Gv3Fq618Di","2Yz7EMK07Y","tjQxsIKxdL","Waim6BGaQY","48cHLWaWsv","d7vjMPYBf4","Dz1R307n1c","8xEKzYjB9t","PYBf4KASQ8",
+"Kr8ysv8yFN","hi5X7BpYhV","s93Mln8pJ9","CK5W7DG4sT","oGu6xRzaZA","2DREsMezSW","d7vjMOxWIH","GrDg75iGN5","ZhwG1Yh1hF","QClRLY1mC0",
+"ulk41F6PT2","2TRI7BFkb8","AIYUu8TxD7","azIWpjeskS","xXTI4fcJOy","Rxrsm5Mg9r","iB08l580YD","tjQxs1v5hH","Z4I1vMGlTF","ciuWziKqhr",
+"StlDJuoStw","BGaQYGSQwj","KZamHmX2GE","euZA555rfB","0BmCyzQt6Q","SjskQHzZT8","HP433zmLYD","fqypytAOsr","yofH3ksJby","ECMvUKsjRK",
+"QChxsuJScX","d85a9UmaEv","t98iWAXpwE","prNT60PktI","L7cGc1v5hH","3weIFuvf7A","D6rByuLtKs","G1RhSVLTy6","bgJAzMojnP","HP4337X3uy",
+"jfREuSs0Zu","t59lRK4GS8","mX2GESmGzv","qUJMdyEfy9","Kr8yslH1kt","azIWpuoStw","zFgtBFPfSE","AkKTkbrhlQ","pWiOs5IhmG","Y1mC07lUXZ",
+"tvdkDKZamH","zQt6QTwano","hi5X7bZLvS","okgRiWmadA","gtCA5Y1mC0","8TxD7HfyNQ","WreyP0ao3l","Ss0Zu5nmWv","7X3uylweGy","POUYSlpF6W",
+"JKWYRaL6AJ","tvdkDM3zXL","W3VFHyEfy9","h1zcHY1mC0","nFqikTXQ0Z","2hEEUmz8gx","9iGoToGu6x","OUYuFs7Mxk","e6e4zjiVBP","B3qemFFDui",
+"SjskQzFgtB","RpBQmfcwDa","MezSWzQt6Q","IRh480Kyfs","pvgjS8TxD7","Z4I1vv8yFN","KsjRKlkMUA","uvf7AtvdkD","brhlQpiJSk","4W0TlVprf2",
+"lsQGo5ZaEz","MmKGJRpBQm","0YAGHAmdQd","gIYvERmDcr","uN6r3iKqhr","7ku1pP6bcg","zFgtB7ku1p","fqypy8xEKz","atef2FxX9q","0BmCy6q6L9",
+"yofH3MaJQs","J2mQiZJTXH","FxX9qAmdQd","y94nwprNT6","jtn0XFLsph","3weIFTa8f6","bgJAzGSQwj","8U2nUgIYvE","ZUnqt2ZHdk","2hEEU7X3uy",
+"RsQUqOxWIH","2ZHdk4dEz6","bgJAzK4GS8","Uvlv48RCUA","9GXkXdmoS7","0BmCymz8gx","AOgEepiJSk","dpe1vlXFOB","MGlTFuJScX","Oz8yZDz1R3",
+"P6bcgd7vjM","48cHLn1pmO","NAFuwP6bcg","AkKTkblLA9","64s8NCfgr3","lpF6WYw2oU","QworuEOE1o","S77LHtaOXK","FGzgp45cIH","7X3uyZJTXH",
+"wDajXPOUYS","m4bxUgjUTu","QnJ1SFjHXR","zFgtB2Yz7E","OUYuF0BmCy","VLTy6DLhzM","pv0i7ThjNn","UlU3Mrz7Ut","CNHmv48cHL","8U2nUVerEA",
+"8U2nUMaJQs","14FLRMojnP","Ul4a1Q6hMC","Kr8ysgtCA5","djsrvjS1aj","1j5L85VZjS","oGu6xQnJ1S","uAWyphi5X7","BCxeCZzJHW","xXTI4WDVWJ",
+"P6bcgFxX9q","hSSvQpAhR1","JXljWHlUbF","No0QbzFgtB","ix74rQChxs","0Wr5yv8yFN","KZamHFGzgp","pAhR1EdBKc","zz4ZU5Mg9r","zbIYY48cHL",
+"2Yz7EHlUbF","07n1c1v5hH","HlUbFuJScX","VIlwPnFqik","X6Pinn1pmO","d85a9ZhwG1","1v5hHJIqXi","2Yz7Eatef2","9rlg9dhSuH","i7WMQrhl0J",
+"l83UdUvlv4","QbxXcNxx9V","5drc6suY4x","fqypyDz1R3","v8yFNBGaQY","4W0TlnlaBy","QWxoTsqVrf","pT8wuUl4a1","RBhp0YjB9t","1j5L8RACuj",
+"CxVEfSmGzv","rKDLJyluBx","uAWyp4W0Tl","ni2v1ThjNn","ydG8UCxVEf","zY1GY9eoRc","PYBf4uQIcz","FVMxouJScX","kZANmzbIYY","RBhp0VNCPd",
+"B3qem5Drn0","AOgEedmoS7","2ZHdklViBv","lweGyTCgPp","UmaEvNo0Qb","vOqCEgIYvE","BCxeCM3zXL","s4786qQxHP","8FmFHMm8si","CNHmvnFqik",
+"x3LDeMGlTF","Dz1R3JXljW","dpe1vFPfSE","pv0i7zmLYD","FFDuixXTI4","Nxx9VcShY2","lXFOBtvdkD","fFDrJYw2oU","YOfrYoGu6x","SbRYyTwano",
+"hYBCKhe9IA","7ku1pVprf2","POUYSAkKTk","GXdoHwDajX","iwzGkVerEA","0ao3lAkKTk","djsrvFwEJz","pFrrl7hyVv","suY4x9XyT9","soy9t48cHL",
+"1LB1LYh1hF","0PktIRsQUq","QClRLazIWp","EoToPECMvU","0ao3lFwEJz","yluBxaFFss","M3zXLFGzgp","iwzGk8FmFH","Nxx9VlpF6W","4dEz6QClRL",
+"U3yw5M6qcG","ECMvURmDcr","0MR5X5Drn0","soy9tlsQGo","n1pmOQ6hMC","24ARFjS1aj","fqypydhSuH","hE1QlIRh48","FLsphCqqaD","9GXkXjS1aj",
+"yEfy9ciuWz","RmDcr48cHL","ciuWzyvOMI","0BmCyJXljW","n8pJ92Yz7E","PYBf42hEEU","sx5GljzUqR","Dz1R3qaofN","lsQGoRzaZA","DLhzMQ6hMC",
+"AXpwEhE1Ql","Yh1hFe6e4z","AkKTk14FLR","NhXdu2DREs","XyPZN8RCUA","uoStwVerEA","yvOMIZJTXH","CK5W78hJdt","dhSuHChuy3","v2eC3i3pyd",
+"tvdkDlH1kt","uAWypZhwG1","lweGyzz4ZU","DG4sTuvf7A","OUqFMzHF1q","UlU3M5nmWv","I7p2auAWyp","n1pmOYjB9t","lCMxylkMUA","pv0i7QClRL",
+"iwzGkjzUqR","s7MxktuDyS","yToGW9eoRc","0h1b1GSQwj","CNHmvLewvM","M6qcGb29RJ","dpe1vTwano","YOfrYsqVrf","MezSW8TxD7","ciuWzM3zXL",
+"uoStwJXljW","4W0TlpAhR1","n1pmO64s8N","EoToPpv0i7","5NammwDajX","gf8rIfaHir","blLA9zHF1q","7ku1piB08l","pWiOsMm8si","euZA5uZPqg",
+"45cIH2ZHdk","BFkb8EOE1o","xXTI4IRh48","sqVrfQ6Lix","M6qcGOUYuF","2Yz7EX6Pin","h1zcHpv0i7","vOqCENo0Qb","oQ87raez9y","kB5nP0h1b1",
+"ZzJHWTwano","DLhzMRpBQm","kB5nPnFqik","kZANmQssNC","9GXkXTwano","iwzGkcShY2","aL6AJP6bcg","GWqqXDLhzM","t98iWOUYuF","0KyfsL7cGc",
+"lsQGozQt6Q","DLhzMtlILt","t98iW8U2nU","Mkgy8YOfrY","B3qemYjB9t","9eoRccmXIX","vOqCEo8Uyd","kB5nP6AFT0","xReecs7Mxk","lm0pDzqH0W",
+"9GXkXQnJ1S","QWxoTBGaQY","ZzJHWzbIYY","oQ87rjiVBP","wiHrZqUJMd","NOHszFGzgp","MGlTFtvdkD","X6PinM6qcG","l83UdBFkb8","uZPqgZUnqt",
+"KASQ8v1Hln","b29RJ0h1b1","DQimpCdyBV","zqH0W5ZaEz","gtCA5gIYvE","lm0pDpiJSk","AkKTkAOgEe","GXdoH0h1b1","CqqaDAmdQd","ciuWzjSjS3",
+"J2mQiYh1hF","y94nwO3iyQ","5VZjSZ4I1v","zqH0WtuDyS","7Ow5CWaWsv","t98iWjtn0X","FhtglYw2oU","8FmFH0MR5X","hYBCKs7Mxk","KsjRKKr8ys",
+"hUTw70YAGH","8cVD3Mkgy8","aez9y4QMc9","pT8wuThjNn","d7vjMuvf7A","hi5X7aL6AJ","aDGtSSWfou","pT8wuNhXdu","Nxx9V16lHc","uvf7A5ZaEz",
+"45cIHkZANm","LewvMyEfy9","zbIYYSjskQ","ix74rFnPFB","e6e4z07n1c","jtn0XC2Irc","2DREsZJTXH","gdQsSWaWsv","UlU3My94nw","aez9yQnJ1S",
+"iKqhrxXTI4","M6qcGOz8yZ","n1pmOLDk6f","29QAz8hJdt","zmLYDFGzgp","i3pydnlaBy","JkzUnuvf7A","Q6LixVerEA","KASQ8BpYhV","FNYIMXyPZN",
+"ZJTXHZuDtD","BCxeCAkKTk","PYBf4rKDLJ","Uvlv4J2mQi","FnPFBmz8gx","dpe1vFxX9q","Vprf2jfREu","zHF1qNOHsz","gjUTuUlU3M","uN6r3Ta8f6",
+"rz7UtStlDJ","ulk41jS1aj","ix74rPYBf4","S77LHoVQp6","zbIYYEdBKc","uZPqgCIShG","y94nwn1pmO","lkMUAX6Pin","F6PT28RCUA","lweGyP6bcg",
+"DG4sTAIYUu","i3pydFPfSE","lpF6WMojnP","fqypyHlUbF","CdyBVDz1R3","NhXdus93Ml","zY1GY1j5L8","jiVBPLewvM","l83UddmoS7","Vprf2Vprf2",
+"8TxD7Gv3Fq","IRh48JXljW","yofH3mX2GE","FxX9qYf2Ec","0BmCyuAWyp","7fKYUY1mC0","45cIHoGu6x","t59lR07n1c","AgJHQFLsph","KASQ81v5hH",
+"JIqXi7fsYM","hE1QlMojnP","kB5nPRpBQm","xciqpfcJOy","2ZHdkiKqhr","Y1mC0lXFOB","ZhwG1suY4x","U3yw5tuDyS","qUJMddQ586","HP4332Yz7E",
+"gf8rIM6qcG","RmDcrCdyBV","b29RJtl72W","l83UdvLsmS","EdBKche9IA","FcWrWydG8U","C2IrcZhwG1","Cfgr3cShY2","K20wKEoToP","ZzJHWS77LH",
+"tuDySkB5nP","i3pydFhtgl","Q6hMCQnJ1S","BGaQYIKxdL","uAWypt98iW","t59lRx3LDe","HlUbF0ao3l","k85AeaDGtS","RpBQm14FLR","Qworus7Mxk",
+"he9IAsx5Gl","IKxdLWDVWJ","yToGWtuDyS","lm0pDCNHmv","AXpwE8U2nU","dmoS7QClRL","v2eC3O3iyQ","Ul4a1C2Irc","v8yFNjS1aj","x3LDe580YD",
+"uQIczAgJHQ","7ku1pYOfrY","tlILt7Ow5C","gjUTuo8Uyd","vLsmSuPX7G","uTacxv8yFN","WaWsvtjQxs","TCgPpsuY4x","VBjhzfqypy","29QAzUl4a1",
+"mz8gxuAWyp","yofH364s8N","2ZHdk0PktI","5NammQnJ1S","FwEJzuJScX","pvgjScL0aE","6q6L9IRh48","n1pmOkZANm","CdyBVuPX7G","MezSW3weIF",
+"pv0i7Yh1hF","zY1GYqUJMd","0h1b1oVQp6","pv0i7bZLvS","In3NSru4UG","Yh1hFMaJQs","5Drn0SbRYy","MaJQshe9IA","OUYuFtvdkD","QClRLKr8ys",
+"F6PT2NOHsz","O3iyQUvlv4","Cp3mZQ6hMC","CdyBV64s8N","cShY2zQt6Q","nnP8o7lUXZ","gf8rId7vjM","5VZjSjzUqR","M3zXLO3iyQ","yvOMIjfREu",
+"ZUnqtiB08l","Oz8yZsqVrf","KsjRKlsQGo","nlaByjeskS","jzUqR9GXkX","P6bcgVIlwP","2Nslmaez9y","Gv3FqWmadA","t59lR0BmCy","fqypyAXpwE",
+"n8pJ94QMc9","XyPZNAXpwE","Cp3mZ3weIF","ZzJHWAOgEe","GSQwjpvgjS","l83UdfFDrJ","ZhwG1FxX9q","taOXKO3iyQ","yEfy9azIWp","pv0i7lViBv",
+"24ARFsqVrf","FnPFB24ARF","zFgtByToGW","9eoRcAkKTk","v1Hlnrhl0J","OHaBzStlDJ","sx5Gl6AFT0","rhl0JZJTXH","AIYUugtCA5","GXdoHaL6AJ",
+"uvf7A07n1c","jeskS5drc6","LewvMuTacx","EOE1oWPmlx","sqVrfVjCZq","EdBKcDG4sT","Oz8yZAXpwE","VLTy6GrDg7","mX2GE4dEz6","LbRTHHzZT8",
+"8U2nUPYBf4","P6bcgjfREu","m4bxUzQt6Q","iwzGkVBjhz","StlDJRkQke","GXdoHpWiOs","brhlQtlILt","xciqpM6qcG","rKDLJMojnP","No0Qbn8pJ9",
+"mz8gxTXQ0Z","5nmWvEOE1o","hYBCKMaJQs","4dEz63weIF","J2mQiyluBx","sqVrfDQimp","t59lRni2v1","L7cGc7X3uy","9y4lwDG4sT","pFrrlCIShG",
+"0YAGHfcJOy","P6bcgQbxXc","S2DfukB5nP","brhlQuTacx","8xEKz4QMc9","lm0pDCIShG","vLsmSbgJAz","n8pJ9jtn0X","AkKTks4786","QnJ1Spv0i7",
+"hE1Qls7Mxk","gf8rI16lHc","zmLYD0Kyfs","JkzUn5nmWv","yToGWciuWz","bgJAzuvf7A","oGu6xrz7Ut","v1HlnuAWyp","ydG8U9y4lw","blLA91j5L8",
+"zQt6Q2Nslm","Dz1R3ThjNn","7fsYMpT8wu","IjTwPjS1aj","iwzGkhUTw7","uAWypVBjhz","FhtgllCMxy","8RCUA4W0Tl","ReKEWvOqCE","BCxeCVerEA",
+"Q6Lixn1pmO","8hJdt9y4lw","oVQp60Wr5y","sx5Gl7fKYU","soy9tBGaQY","gIYvE6AFT0","faHirhi5X7","EOE1obrhlQ","hE1Ql6AFT0","gf8rIuZPqg",
+"vOqCEQWxoT","Z4I1vvLsmS","nnP8oBGaQY","POUYS9y4lw","FNYIM6AFT0","ZzJHWWreyP","0BmCyIjTwP","PYBf4fFDrJ","hE1Ql4W0Tl","StlDJWaWsv",
+"K20wKPOUYS","oQ87rpiJSk","nlaByMkgy8","RzaZA0BmCy","gf8rIStlDJ","8U2nUpmeCd","uN6r3zFgtB","6q6L9dmoS7","WmadAy94nw","HRxd8ru4UG",
+"xXTI45VZjS","iKqhrKZamH","uPX7Gsx5Gl","uN6r3qQxHP","GWqqXciuWz","guMb8HfyNQ","2TRI7yofH3","nFqikMmsIo","VerEAaFFss","cQOnvlkMUA",
+"yluBxCdyBV","mX2GEqaofN","RACujGv3Fq","h1zcHvkCHH","zqH0WsqVrf","okgRiY1mC0","Cp3mZRxrsm","XflUqGWqqX","lH1ktn1pmO","kZANm07n1c",
+"8xEKziB08l","TCgPpFnPFB","RBhp0uN6r3","tAOsruvf7A","n8pJ9RkQke","QnJ1SpiJSk","AgJHQMm8si","guMb8cL0aE","TCgPp0Kyfs","Y1mC0qUJMd",
+"cQOnvFwEJz","s7Mxks7Mxk","s93MlPOUYS","618DiRxrsm","HfyNQSbRYy","k85AeoQ87r","RACujuoStw","v1HlnzFgtB","y94nwCfgr3","K4GS8JXljW",
+"DcpWBW3VFH","fqypyGrDg7","RxrsmjeskS","8xEKzk85Ae","pv0i72DREs","VjCZqEoToP","RzaZAWmadA","StlDJAmdQd","dmoS7v8yFN","iB08luTacx",
+"ReKEWhe9IA","Cfgr3Cfgr3","ReKEWM6qcG","5VZjSv1Hln","yEfy929QAz","qQxHPRsQUq","Oz8yZv8yFN","Nxx9VDcpWB","ZJTXHFjHXR","uTacxQChxs",
+"n8pJ9NOHsz","uvf7ADQimp","0ao3lWmadA","djsrvFhtgl","lCMxykZANm","XflUq5nmWv","W7cTs6AFT0","n8pJ9CqqaD","VLTy6o8Uyd","NhXduQnJ1S",
+"0h1b1IjTwP","FwEJzIRh48","zHF1qiKqhr","jeskSK4GS8","9eoRckB5nP","AXpwE1j5L8","dpe1vCdyBV","0h1b1JJs5m","jfREuIKxdL","48cHLVLTy6",
+"yofH3ciuWz","lH1ktBGaQY","Kr8ysJJs5m","W3VFHCfgr3","i3pydrhl0J","MmKGJlj07Q","Nxx9VWaWsv","hSSvQvLsmS","9eoRc9XyT9","VLTy6No0Qb",
+"Pb1pan1pmO","uQIczOUYuF","tlILtuZPqg","lpF6WMm8si","pv0i78U2nU","jfREuiB08l","soy9tguMb8","piJSkRsQUq","yofH3rz7Ut","FnPFB0h1b1",
+"pFrrlrhl0J","xReecKsjRK","WDVWJgjUTu","zQt6QOxWIH","5VZjSXyPZN","DG4sTlCMxy","VBjhzpiJSk","aez9yGXdoH","uZPqgni2v1","QssNClm0pD",
+"dmoS7WreyP","8FmFHqQxHP","FGzgpuoStw","2Yz7EMGlTF","jS1ajjeskS","CqqaDtvdkD","FnPFBF6PT2","MK07YFcWrW","8U2nU9XyT9","pFrrlIBe8k",
+"QYxC0HfyNQ","FxX9qoQ87r","HP433tAOsr","s7Mxk7Ow5C","Cp3mZt59lR","MK07Ylj07Q","x3LDedjsrv","pv0i7W7cTs","MK07YRBhp0","hSSvQKASQ8",
+"B3qemAXpwE","QssNCQ6hMC","9GXkXv8yFN","VjCZqStlDJ","9iGoTAkKTk","OxWIH7X3uy","wDajX0BmCy","2ZHdkNhXdu","6AFT08hJdt","aFFsscL0aE",
+"jtn0Xt59lR","s4786PYBf4","FxX9qECMvU","uQIcz8FmFH","fLNg8v2eC3","cShY25VZjS","ru4UGprNT6","8U2nUSmGzv","GWqqXsuY4x","7fsYMyEfy9",
+"cmXIXTCgPp","aDGtSjzUqR","NcICAReKEW","AXpwESjskQ","qQxHPkB5nP","ThjNnFGzgp","iB08lQbxXc","sqVrfZzJHW","KZamHMGlTF","K4GS8ydG8U",
+"bZLvSNAFuw","cmXIXpv0i7","zbIYYgf8rI","Yh1hFi3pyd","FNYIMnlaBy","yluBx8RCUA","8cVD3uoStw","ZhwG1Yw2oU","FFDuii7WMQ","faHirFLsph",
+"euZA5lsQGo","WaWsvzqH0W","Yw2oU1j5L8","fLNg8cQOnv","gIYvEix74r","U3yw5MmsIo","HRxd8WPmlx","J2mQiuAWyp","YjB9tulk41","RmDcrwiHrZ",
+"NAFuwQ6hMC","hUTw7M6qcG","FVMxot98iW","lXFOBJkzUn","5drc6fmIK1","tl72WWaim6","pmeCdlkMUA","9GXkXdjsrv","soy9ti3pyd","DcpWB48cHL",
+"ZUnqtRsQUq","gtCA5lweGy","8cVD3Uvlv4","GXdoHHfyNQ","GWqqXMm8si","VerEAUmaEv","CdyBVOz8yZ","Cp3mZAOgEe","fmIK1t98iW","Q6hMCFVMxo",
+"7hyVv7Ow5C","K4GS86q6L9","dhSuHDz1R3","QnJ1SzHF1q","aez9yVerEA","0ao3l6AFT0","WaWsvQWxoT","O3iyQt59lR","LbRTH2DREs","FnPFBjeskS",
+"uQIcza00b5","NAFuwCfgr3","UmaEvMezSW","W3VFHVIlwP","580YDBGaQY","tuDyS5iGN5","OxWIHX6Pin","aFFssS77LH","jzUqRMezSW","uJScXQYxC0",
+"QnJ1SO3iyQ","HRxd8fFDrJ","uAWypAXpwE","Waim6LDk6f","ydG8UvLsmS","PYBf4XyPZN","aFFss2Nslm","n8pJ9nlaBy","sqVrfjSjS3","5Mg9r14FLR",
+"ZUnqtk85Ae","Y1mC0VNCPd","ReKEWlsQGo","S77LHQChxs","RkQkeGrDg7","piJSkOUqFM","O3iyQQ6Lix","KZamHL7cGc","CdyBVh1zcH","zbIYY4QMc9",
+"D6rByogLgc","SmGzv9XyT9","IjTwPHzZT8","SWfouyofH3","5nmWvOz8yZ","fFDrJDG4sT","jeskSv1Hln","QbxXcMK07Y","jS1ajZv7z0","CqqaD3weIF",
+"sqVrf3otm6","4QMc9B3qem","9XyT9Nxx9V","FcWrWb29RJ","lXFOBSs0Zu","zmLYDWmadA","AIYUuuJScX","MGlTFF6PT2","iKqhrBCxeC","8TxD7nlaBy",
+"prNT6TCgPp","pAhR1hi5X7","XyPZNJXljW","DcpWBBGaQY","618DidmoS7","t98iWuTacx","VLTy6xciqp","xXTI4piJSk","nnP8os93Ml","qQxHPIKxdL",
+"Oz8yZfLNg8","i7WMQgdQsS","zQt6QpWiOs","ni2v1h1zcH","DcpWB45cIH","azIWpfcwDa","iKqhruQIcz","Cp3mZGSQwj","uTacxNcICA","vLsmSTwano",
+"v2eC3azIWp","OxWIHQbxXc","ZUnqtSbRYy","zFgtBjzUqR","BbwgA9GXkX","jzUqRZ4I1v","HzZT8AgJHQ","MmKGJK20wK","7fsYMQYxC0","cmXIXXyPZN",
+"yEfy9fcJOy","uTacxd7vjM","IRh487ku1p","8FmFHtl72W","AOgEe5VZjS","faHir0ao3l","Kr8ysuTacx","nFqiklViBv","vLsmSqaofN","SjskQ7fKYU",
+"9y4lwvOqCE","CdyBV0PktI","MmsIoogLgc","LewvMlXFOB","bgJAzSbRYy","ThjNn5iGN5","WDVWJtvdkD","No0Qbjtn0X","1v5hH3weIF","lweGyazIWp",
+"AgJHQbZLvS","zqH0WJRJQB","VNCPdS77LH","45cIHpvgjS","5iGN5uTacx","ni2v1X6Pin","Mkgy8FLsph","SjskQAIYUu","7X3uy6q6L9","kB5nPCxVEf",
+"BpYhVuvf7A","7ku1pQYxC0","iwzGkrKDLJ","v8yFNoQ87r","Cfgr3yofH3","NOHszSbRYy","wiHrZRBhp0","5nmWvZv7z0","xXTI4uLtKs","NcICAdpe1v",
+"uAWypRACuj","HlUbF0BmCy","k85AeQClRL","L7cGcdjsrv","Cp3mZxReec","AOgEejiVBP","xXTI4tl72W","bZLvSy94nw","QworutuDyS","fmIK1bgJAz",
+"IjTwPJRJQB","uPX7GIn3NS","Ss0Zu9GXkX","TCgPpkZANm","t59lRDz1R3","brhlQgdQsS","HzZT8ReKEW","xciqpbgJAz","faHirgdQsS","ECMvUblLA9",
+"MaJQsTwano","rz7Uth1zcH","Ta8f6HP433","55rfBKsjRK","Z4I1vfFDrJ","DG4sTvkCHH","e6e4zOz8yZ","vkCHH3weIF","FLsphyluBx","lCMxyCNHmv",
+"7X3uygjUTu","WmadAazIWp","uLtKsHRxd8","RBhp0JIqXi","mX2GEgtCA5","a00b5taOXK","K20wKKASQ8","AgJHQd85a9","gtCA5Vprf2","HP433JkzUn",
+"ciuWzS77LH","M6qcGVjCZq","2TRI7Q6Lix","FFDuiNAFuw","mz8gxpT8wu","48cHL14FLR","jeskS64s8N","sqVrfkB5nP","OUqFMMojnP","kB5nPO3iyQ",
+"OHaBzReKEW","BbwgAEOE1o","he9IAqUJMd","8U2nURpBQm","WMiS3HlUbF","i3pydQworu","9GXkXRACuj","BbwgASs0Zu","fcJOyl83Ud","VNCPdk85Ae",
+"C2IrcjzUqR","azIWpEOE1o","uupzkI7p2a","WmadAMmsIo","djsrvLbRTH","XflUqfqypy","prNT6tAOsr","iwzGkrz7Ut","KZamHQ6Lix","W7cTsP6bcg",
+"t59lRblLA9","dpe1vkZANm","QssNCvkCHH","POUYSiqv4k","euZA5MezSW","2hEEU1v5hH","ZzJHWMK07Y","azIWpuJScX","W7cTsHP433","uAWypGWqqX",
+"CIShGfLNg8","KZamHPb1pa","0Wr5ySmGzv","Kr8ysSs0Zu","JJs5m1j5L8","uZPqg8FmFH","ZzJHWpWiOs","VBjhzU3yw5","yEfy9D6rBy","CqqaDSs0Zu",
+"8FmFHs7Mxk","mz8gx8xEKz","kB5nPM6qcG","zFgtBdjsrv","9XyT9ECMvU","GrDg7QnJ1S","nnP8oK4GS8","FLsphpvgjS","brhlQdhSuH","rz7UtuJScX",
+"Mm8sis4786","PYBf49rlg9","MaJQsGv3Fq","lweGyDz1R3","Kr8ysRBhp0","OUqFMFhtgl","ReKEWHfyNQ","oGu6xTwano","xReecn8pJ9","uupzkP6bcg",
+"5ZaEz8FmFH","tl72WuAWyp","7X3uyuTacx","M3zXLRACuj","fmIK1uAWyp","QworuECMvU","rhl0JFPfSE","ix74ruTacx","v1HlnuPX7G","QYxC00YAGH",
+"fcwDauPX7G","IjTwPFwEJz","rz7UtgjUTu","lpF6WgjUTu","C2IrcqQxHP","MezSWWaWsv","U3yw59y4lw","zY1GYfLNg8","BbwgAaez9y","7ku1pguMb8",
+"lpF6WtaOXK","AgJHQbgJAz","Mm8sioGu6x","nlaByRBhp0","S77LHNhXdu","QnJ1SHzZT8","2ZHdkBbwgA","AgJHQ8FmFH","0PktIy94nw","lweGyOz8yZ",
+"e6e4zJkzUn","AXpwELewvM","gf8rIqQxHP","suY4xksJby","lm0pDpv0i7","zQt6QRpBQm","WmadANAFuw","BpYhVQ6hMC","Zv7z0QChxs","lweGyhE1Ql",
+"TXQ0ZnlaBy","JIqXid7vjM","VjCZqaL6AJ","FVMxodjsrv","Ss0ZutvdkD","TCgPp2DREs","Ul4a1kZANm","uQIczZzJHW","7X3uyM6qcG","t59lRjzUqR",
+"mX2GEfLNg8","Chuy3d7vjM","azIWpv1Hln","lj07QW3VFH","v1Hlnb29RJ","CxVEf5iGN5","IRh48XflUq","RpBQmtAOsr","1v5hHNcICA","7ku1pHP433",
+"FwEJzpvgjS","XyPZNIBe8k","O3iyQQssNC","jS1ajRsQUq","OHaBzd7vjM","VNCPd7X3uy","NcICApFrrl","qUJMdIn3NS","2Yz7EQnJ1S","TCgPpFGzgp",
+"rhl0J14FLR","0ao3lJIqXi","FNYIMlkMUA","M6qcGiB08l","RsQUqIRh48","QworuoQ87r","s93Ml0BmCy","CdyBVWreyP","wDajXFxX9q","HlUbFrKDLJ",
+"EOE1oHRxd8","gIYvEEOE1o","lj07QEOE1o","nlaByFhtgl","pv0i7jzUqR","prNT6Fhtgl","uupzkK20wK","VerEAtlILt","taOXK618Di","QWxoT0MR5X",
+"6AFT0AIYUu","0YAGHGrDg7","zQt6Q14FLR","KASQ8Q6Lix","wiHrZIBe8k","rhl0Jv8yFN","AkKTk7lUXZ","lH1ktIRh48","cShY2pWiOs","jzUqRulk41",
+"ZUnqt8FmFH","WmadA45cIH","48cHLZv7z0","faHirZuDtD","uAWypSjskQ","HRxd8NhXdu","oQ87r0Wr5y","kB5nPAkKTk","qaofNlViBv","pFrrlCNHmv",
+"RACujjS1aj","GrDg7QChxs","5nmWvlH1kt","nFqikeuZA5","Uvlv4ru4UG","uTacxDG4sT","jtn0X4W0Tl","RpBQmvkCHH","BFkb8GXdoH","7lUXZSjskQ",
+"d85a9JRJQB","JkzUnuN6r3","5VZjSTa8f6","RmDcr5ZaEz","wDajXBGaQY","9eoRcRzaZA","Cfgr3lj07Q","0Wr5yk85Ae","1LB1LZzJHW","rhl0JChuy3",
+"HP433O3iyQ","TCgPpW7cTs","HzZT8TCgPp","NhXdukZANm","DcpWBfcJOy","SbRYyC2Irc","taOXKKr8ys","cmXIXiqv4k","QChxsQworu","DG4sTOUqFM",
+"soy9tyToGW","8hJdtMK07Y","Kr8ysS2Dfu","lXFOBpWiOs","CqqaDUvlv4","y94nwo8Uyd","M6qcG1j5L8","RkQkei7WMQ","hSSvQCxVEf","Chuy3uZPqg",
+"1v5hH24ARF","lpF6WEoToP","gdQsSB3qem","lweGyDcpWB","xXTI429QAz","5IhmGG1RhS","M6qcGIRh48","WDVWJGWqqX","qQxHPGWqqX","JJs5mPOUYS",
+"k85Aeulk41","lH1ktP6bcg","cQOnvSs0Zu","U3yw5FnPFB","RzaZAhUTw7","uZPqgLDk6f","O3iyQe6e4z","JJs5m7X3uy","jeskS0Wr5y","gjUTu7fsYM",
+"nlaBy8hJdt","ydG8UGrDg7","Cfgr3v2eC3","wiHrZMm8si","07n1cBFkb8","he9IAIBe8k","Zv7z0I7p2a","kB5nPatef2","7ku1pzmLYD","2DREsFLsph",
+"AIYUum4bxU","yluBx7fKYU","e6e4zVLTy6","2TRI7s93Ml","8RCUApT8wu","NcICAsx5Gl","BpYhVd7vjM","wiHrZk85Ae","0h1b1euZA5","jiVBPIRh48",
+"VerEADLhzM","NcICAJRJQB","0h1b1WmadA","azIWppT8wu","ksJbypT8wu","pvgjS0PktI","TCgPp8cVD3","RpBQmJRJQB","ix74rFxX9q","bgJAzxReec",
+"yEfy92Yz7E","Q6Lix9y4lw","FNYIMd85a9","SbRYy580YD","QbxXcdQ586","48cHLVBjhz","0MR5XEOE1o","I7p2aBFkb8","uvf7ApiJSk","jtn0XFNYIM",
+"prNT6ru4UG","nFqikZJTXH","24ARFUmaEv","45cIHjSjS3","6q6L9s93Ml","WaWsvX6Pin","gjUTusuY4x","QssNCZuDtD","ogLgcrKDLJ","VLTy6Yw2oU",
+"G1RhSwiHrZ","ZJTXHxciqp","pv0i74QMc9","v8yFNjzUqR","uN6r314FLR","6AFT0ciuWz","ydG8UTCgPp","4W0TlcQOnv","pT8wui7WMQ","14FLR9y4lw",
+"2NslmJRJQB","lXFOBDcpWB","zFgtBRmDcr","sqVrflsQGo","cShY2Gv3Fq","AOgEeMm8si","MojnPuJScX","P6bcgprNT6","ThjNnX6Pin","5NammGSQwj",
+"DQimpBGaQY","a00b5J2mQi","ReKEWdjsrv","5ZaEz2TRI7","fcJOyW7cTs","KsjRK55rfB","d7vjMcL0aE","FPfSEAIYUu","VIlwPh1zcH","Cp3mZcQOnv",
+"qQxHPVBjhz","RzaZA5Drn0","ni2v1SbRYy","Y1mC08xEKz","U3yw5xReec","Pb1pa0ao3l","LDk6fxXTI4","Cp3mZFcWrW","pFrrlv1Hln","qQxHPIBe8k",
+"AXpwEMezSW","cL0aEuPX7G","FVMxoAOgEe","zqH0Whe9IA","24ARFMm8si","IKxdLIRh48","M3zXLYf2Ec","dpe1vpv0i7","d85a9bgJAz","In3NSBGaQY",
+"RmDcruAWyp","qQxHPFxX9q","tjQxsCIShG","4QMc914FLR","1v5hH5IhmG","zqH0WReKEW","ogLgcVjCZq","Mm8siOUYuF","s93MlCNHmv","v8yFNGWqqX",
+"L7cGc7Ow5C","AXpwEs93Ml","gtCA5FGzgp","uTacxRBhp0","gdQsSOxWIH","TCgPpC2Irc","brhlQQ6hMC","xXTI4FxX9q","lXFOBrz7Ut","nFqikHRxd8",
+"Pb1pavOqCE","cmXIXuN6r3","hUTw7BCxeC","BCxeC2Yz7E","cQOnvZJTXH","XflUqCqqaD","W7cTsEdBKc","KsjRKokgRi","faHirGWqqX","OUYuF29QAz",
+"HP4332ZHdk","Gv3Fq7fKYU","Ta8f6atef2","2Yz7EAkKTk","fLNg8aL6AJ","FcWrWMK07Y","4dEz6uupzk","i7WMQWaWsv","WPmlx9iGoT","14FLR2hEEU",
+"MezSWhE1Ql","ydG8UXyPZN","KASQ8CK5W7","45cIHlCMxy","taOXKaFFss","FjHXRBGaQY","o8UydQnJ1S","HfyNQuupzk","lj07QksJby","ReKEWGXdoH",
+"vOqCErhl0J","5VZjSBbwgA","t59lRuQIcz","oVQp6HfyNQ","xReecdjsrv","5IhmG48cHL","uTacxWDVWJ","jtn0XjiVBP","2hEEUaez9y","NOHszyluBx",
+"RxrsmCfgr3","aez9yoQ87r","lViBvsuY4x","Cp3mZ07n1c","aL6AJy94nw","UlU3MFcWrW","i7WMQRsQUq","UlU3Mni2v1","BFkb80Wr5y","XyPZNd85a9",
+"AkKTksuY4x","NOHszdhSuH","tjQxseuZA5","NOHszNOHsz","Z4I1vOxWIH","lH1kt9XyT9","Chuy35Mg9r","POUYSCIShG","uJScXM3zXL","CK5W7gIYvE",
+"BGaQYzQt6Q","jeskScShY2","BGaQYiB08l","uN6r3lweGy","SbRYyBCxeC","4dEz60ao3l","NOHszMK07Y","uTacxZUnqt","S77LHY1mC0","0Kyfs7fKYU",
+"QClRLNAFuw","1j5L8bgJAz","7lUXZpWiOs","RsQUqDLhzM","sx5Glm4bxU","RACujQ6Lix","cQOnvjeskS","B3qemogLgc","Vprf2zqH0W","o8UydoQ87r",
+"5drc6FGzgp","gf8rIP6bcg","iwzGkQbxXc","0ao3lVerEA","DQimpguMb8","piJSkOHaBz","iKqhrbrhlQ","NcICApAhR1","IBe8kFwEJz","MmsIohE1Ql",
+"X6PinuLtKs","tjQxsAXpwE","dhSuHJKWYR","s7MxkFwEJz","h1zcHMGlTF","FnPFBThjNn","MGlTFNAFuw","MezSWgjUTu","2DREsSWfou","dhSuHgIYvE",
+"5ZaEzuupzk","VjCZq6AFT0","HzZT8ZhwG1","EOE1o8xEKz","prNT6a00b5","ReKEWlkMUA","cQOnvy94nw","Yh1hFgf8rI","L7cGc5nmWv","7ku1pkB5nP",
+"FxX9q6q6L9","ZUnqtZJTXH","HzZT8lkMUA","Uvlv4lViBv","i7WMQJ2mQi","HzZT8yToGW","G1RhSvkCHH","Ul4a19rlg9","I7p2aQClRL","mX2GEMmKGJ",
+"LbRTHStlDJ","y94nwAOgEe","GrDg7Mm8si","xXTI4vOqCE","5Drn0Gv3Fq","lj07QuAWyp","8cVD3gIYvE","l83UdP6bcg","6AFT0gtCA5","Oz8yZjS1aj",
+"jSjS31LB1L","lkMUA9eoRc","n1pmOt98iW","LbRTHKr8ys","KASQ8nFqik","jSjS3VLTy6","OUYuFxXTI4","MmKGJtjQxs","OUYuFwDajX","NAFuwyvOMI",
+"s7Mxk1LB1L","ix74r5nmWv","3weIFgIYvE","6q6L9m4bxU","oQ87rVIlwP","tlILtNxx9V","OHaBziwzGk","a00b5ReKEW","HzZT8Cp3mZ","FxX9qazIWp",
+"Mm8siKASQ8","fFDrJS2Dfu","FnPFB2hEEU","YjB9t8FmFH","SmGzvHlUbF","d85a9QChxs","cL0aEIKxdL","5IhmGWmadA","kB5nPJXljW","aL6AJY1mC0",
+"HRxd8cQOnv","tl72WfFDrJ","Pb1paguMb8","tvdkDuN6r3","QClRLuLtKs","PYBf4StlDJ","lCMxyNOHsz","AmdQdoQ87r","16lHcn8pJ9","6AFT0ru4UG",
+"tvdkDyEfy9","zY1GY7hyVv","LbRTHd7vjM","gjUTuWreyP","AOgEeW3VFH","aez9yzqH0W","TwanobrhlQ","Mm8siNcICA","0BmCyTwano","ix74r0ao3l",
+"mz8gxM6qcG","t59lR5ZaEz","5nmWvogLgc","HP433CqqaD","qaofN2ZHdk","ThjNnMmsIo","VIlwP4QMc9","zHF1qLDk6f","QssNCIn3NS","vkCHH2DREs",
+"Fhtgl5Drn0","WaWsvhE1Ql","azIWpAgJHQ","Z4I1v6AFT0","ZUnqtAXpwE","v8yFNLewvM","zmLYDkB5nP","uPX7GPYBf4","EoToPHfyNQ","hYBCKMmsIo",
+"jS1ajReKEW","K20wKAkKTk","VBjhzNhXdu","tvdkDaDGtS","ZhwG1AOgEe","9eoRcbrhlQ","ZUnqt9iGoT","Uvlv4FjHXR","mX2GEazIWp","Z4I1vqaofN",
+"TCgPpoGu6x","zHF1q0PktI","a00b5rKDLJ","vkCHH0Kyfs","7ku1pulk41","NOHsz9GXkX","uJScXUmaEv","SbRYyAXpwE","1j5L8cShY2","lweGyru4UG",
+"PYBf4s93Ml","JRJQBgIYvE","F6PT2PYBf4","Mkgy8fFDrJ","guMb8JKWYR","hYBCKs93Ml","aez9yL7cGc","45cIHlViBv","ciuWzQworu","pvgjSOz8yZ",
+"HlUbFGv3Fq","VLTy6ZzJHW","qQxHPjfREu","7lUXZStlDJ","hE1Ql7lUXZ","AOgEeRACuj","B3qem0Wr5y","AOgEefcwDa","6AFT02DREs","o8UydoGu6x",
+"3otm6CIShG","MK07YZUnqt","fcwDaU3yw5","guMb8zmLYD","Uvlv4HfyNQ","Mm8siatef2","UmaEvOxWIH","wiHrZtl72W","x3LDeZUnqt","8TxD7piJSk",
+"AmdQdZv7z0","5VZjSdjsrv","K20wKdhSuH","1v5hHhYBCK","o8Uyd9XyT9","sx5GlzmLYD","Gv3FqMK07Y","VNCPdSs0Zu","zmLYDCdyBV","Yh1hFsuY4x",
+"ThjNnEdBKc","0Wr5yWaWsv","9XyT94QMc9","v8yFNU3yw5","t98iWFLsph","5Mg9rZ4I1v","MmsIozHF1q","EoToPsx5Gl","5ZaEzhi5X7","M6qcGlsQGo",
+"UlU3Mdjsrv","S77LHMK07Y","xciqpuN6r3","CIShGvOqCE","taOXKl83Ud","Y1mC0jfREu","AgJHQQ6Lix","zz4ZU14FLR","F6PT2DG4sT","K20wKlsQGo",
+"FcWrWiKqhr","i7WMQjiVBP","sx5GlTXQ0Z","AgJHQGrDg7","Ss0Zu2Yz7E","aez9yuupzk","MK07YMGlTF","mz8gxi3pyd","NOHszyvOMI","EOE1oFVMxo",
+"zY1GYv8yFN","tvdkDkZANm","S77LHbrhlQ","Q6LixJRJQB","FLsphQWxoT","QbxXch1zcH","WmadA9XyT9","VLTy6Rxrsm","LDk6f8FmFH","K4GS8ThjNn",
+"uJScXXflUq","t59lRfcwDa","OUYuFk85Ae","XyPZNB3qem","rKDLJuupzk","Twanoi7WMQ","ECMvU5Mg9r","atef2m4bxU","YOfrYjtn0X","cmXIXGv3Fq",
+"5NammS2Dfu","BCxeCfqypy","GrDg7NOHsz","v1HlnNo0Qb","wiHrZZ4I1v","QnJ1SzqH0W","uupzkJRJQB","aez9yyluBx","uLtKsMaJQs","Yf2EcUvlv4",
+"uQIczpiJSk","IKxdLMojnP","LDk6fjeskS","cQOnvlXFOB","BbwgAtuDyS","07n1cLDk6f","580YDjeskS","djsrvY1mC0","SjskQFPfSE","oVQp6uN6r3",
+"jtn0XFwEJz","dpe1vVNCPd","KsjRKn1pmO","M6qcGAmdQd","azIWpVjCZq","yToGW9XyT9","cmXIXt98iW","0BmCy8RCUA","07n1c580YD","ydG8Uo8Uyd",
+"2TRI7tuDyS","M6qcGyToGW","taOXKogLgc","dQ586Twano","aL6AJbrhlQ","FwEJzNxx9V","HP43355rfB","0Wr5yfcJOy","qQxHPQworu","GSQwjCK5W7",
+"s4786l83Ud","cQOnv16lHc","sqVrfx3LDe","64s8NDG4sT","h1zcHLbRTH","m4bxUdhSuH","HzZT8IBe8k","WaWsvaez9y","No0QbJ2mQi","pFrrlxciqp",
+"Z4I1vy94nw","lweGyksJby","DQimpQbxXc","vLsmSx3LDe","ZJTXHfFDrJ","KZamH48cHL","zbIYYLewvM","AgJHQdQ586","4W0Tlzz4ZU","HRxd8ogLgc",
+"d7vjMAgJHQ","tAOsrO3iyQ","cL0aEvOqCE","Ta8f6dpe1v","IRh48djsrv","vOqCEYjB9t","cmXIXUl4a1","rKDLJTwano","hE1QlIKxdL","JKWYRhE1Ql",
+"wDajXm4bxU","qQxHPFGzgp","cmXIXoQ87r","S2Dfu5VZjS","SbRYyCqqaD","nlaByBGaQY","IBe8kDQimp","UlU3MuQIcz","v8yFNaDGtS","lpF6WdmoS7",
+"Dz1R3JJs5m","9iGoTtl72W","s7MxkjzUqR","tlILtfmIK1","UlU3MKZamH","guMb8yofH3","yEfy9TCgPp","lsQGoWaWsv","JIqXiyEfy9","iKqhrS2Dfu",
+"ciuWz2TRI7","HRxd8S77LH","K4GS8U3yw5","FLsphhE1Ql","0Kyfs48cHL","0MR5Xfqypy","MmKGJ5IhmG","FGzgpciuWz","8RCUAn1pmO","aFFss8U2nU",
+"9XyT92hEEU","taOXKhi5X7","TXQ0Z48cHL","tlILtiKqhr","tlILtcmXIX","pmeCdG1RhS","Vprf2qUJMd","4QMc9MmsIo","0MR5X0Kyfs","zz4ZUoVQp6",
+"QClRLRBhp0","iqv4kcL0aE","WDVWJUl4a1","Kr8ys5iGN5","MojnPG1RhS","Q6hMC55rfB","blLA9AmdQd","LDk6fbrhlQ","Ss0ZuCIShG","tjQxsB3qem",
+"MGlTFECMvU","cmXIX9y4lw","Cfgr3hYBCK","uLtKsJJs5m","uJScXhYBCK","rKDLJYh1hF","FNYIMI7p2a","DQimp4W0Tl","WaWsvaL6AJ","nFqikGWqqX",
+"Uvlv4Yw2oU","WaWsvsx5Gl","QWxoTiKqhr","s4786U3yw5","IRh485Namm","tvdkD0MR5X","2DREsRBhp0","I7p2aIjTwP","J2mQiRsQUq","cShY2IBe8k",
+"48cHLDz1R3","uPX7Gx3LDe","7fsYMkB5nP","Mkgy8s4786","ZJTXH24ARF","VBjhzTa8f6","sx5GlZuDtD","fcJOyTa8f6","zbIYYFGzgp","y94nw0Kyfs",
+"Zv7z0QWxoT","Y1mC0HlUbF","WDVWJvkCHH","MmKGJUmaEv","zY1GYcmXIX","uQIczhE1Ql","vLsmSEOE1o","Nxx9VWreyP","BbwgA0YAGH","lj07QpT8wu",
+"WDVWJcShY2","7ku1pO3iyQ","5Drn0Yf2Ec","Zv7z0DQimp","faHirogLgc","QssNCe6e4z","e6e4zl83Ud","QClRLOUYuF","C2IrcJJs5m","QClRLyvOMI",
+"yofH3AIYUu","3otm6Mkgy8","uLtKsaez9y","cQOnvHzZT8","AkKTkOHaBz","WreyPuLtKs","3weIFFFDui","dmoS7l83Ud","Ul4a1oGu6x","LDk6fAXpwE",
+"b29RJ9XyT9","NAFuwMGlTF","IjTwPnnP8o","5Drn0wiHrZ","aez9yFnPFB","I7p2alXFOB","TXQ0ZYjB9t","WmadAQnJ1S","9y4lwMmsIo","soy9tFwEJz",
+"prNT6ciuWz","9eoRculk41","gf8rIb29RJ","8U2nUBpYhV","uN6r3o8Uyd","uvf7AWreyP","CIShGM6qcG","hUTw7Fhtgl","uupzkpv0i7","ydG8UFFDui",
+"tl72WSWfou","W3VFHydG8U","lCMxyyEfy9","BFkb8RsQUq","GXdoHydG8U","5NammDcpWB","Uvlv49y4lw","o8UydTCgPp","jzUqRRpBQm","ksJbyv8yFN",
+"ZzJHWfqypy","WaWsvB3qem","5drc6GrDg7","jSjS3DQimp","NAFuwM6qcG","uN6r3In3NS","GWqqXMojnP","9rlg9F6PT2","DG4sTaFFss","sqVrfyofH3",
+"J2mQi0Wr5y","YjB9tiwzGk","MmsIos4786","ReKEWXflUq","9y4lwCfgr3","lkMUAzz4ZU","55rfB9eoRc","pmeCdZzJHW","VerEAPb1pa","5nmWvaL6AJ",
+"W3VFHi7WMQ","XyPZNC2Irc","IKxdLJKWYR","aL6AJ0h1b1","e6e4zjeskS","SbRYyCK5W7","XyPZNrKDLJ","ulk41JRJQB","atef2Z4I1v","OxWIH5Mg9r",
+"16lHcIBe8k","blLA9x3LDe","5nmWvWreyP","F6PT2zY1GY","aFFssFLsph","0h1b1Ss0Zu","wiHrZWPmlx","oQ87rYf2Ec","DLhzMfcwDa","FPfSE0Wr5y",
+"vkCHHPb1pa","dhSuHS2Dfu","fFDrJzHF1q","dmoS7iqv4k","DQimpFwEJz","Ta8f6WaWsv","lm0pDtl72W","RACujsoy9t","Kr8ysVerEA","RsQUqEoToP",
+"1LB1LYOfrY","o8Uydjtn0X","tuDySi7WMQ","jzUqRsx5Gl","xReecM6qcG","lm0pD0PktI","x3LDe5nmWv","aez9yl83Ud","Q6LixnlaBy","lpF6WFPfSE",
+"Uvlv4qUJMd","FNYIMPYBf4","oGu6xzmLYD","Mm8siP6bcg","NOHsz5IhmG","F6PT2K20wK","WmadAJIqXi","FPfSEogLgc","uvf7AHzZT8","yEfy9RsQUq",
+"Vprf2Ss0Zu","GSQwjsqVrf","v2eC3dpe1v","Ss0ZucShY2","ulk41CIShG","SWfous7Mxk","AXpwERkQke","qQxHPXflUq","dQ586yluBx","fcJOyDz1R3",
+"YOfrYGXdoH","lH1kt1LB1L","cL0aEpvgjS","YjB9tCp3mZ","v8yFNChuy3","No0QblH1kt","ECMvURpBQm","gIYvEFVMxo","MmsIoTa8f6","TCgPp45cIH",
+"ThjNnyluBx","jzUqRcShY2","t98iWCp3mZ","lH1ktFhtgl","IjTwP0h1b1","4W0TlbZLvS","wiHrZ5nmWv","Nxx9V0PktI","VjCZq2hEEU","L7cGcMK07Y",
+"MaJQsOxWIH","lViBvWPmlx","JIqXiFVMxo","FwEJzJXljW","a00b5Q6Lix","55rfB7fsYM","VLTy6atef2","K4GS8QnJ1S","zz4ZU0ao3l","AIYUu3otm6",
+"l83Udk85Ae","FwEJzlj07Q","IKxdLydG8U","euZA5uJScX","CqqaDzz4ZU","Yh1hFazIWp","TCgPpGrDg7","h1zcHHP433","XyPZNCK5W7","Cfgr3SbRYy",
+"lm0pDS77LH","DLhzM8RCUA","5ZaEzPOUYS","Ul4a1Mm8si","8RCUACIShG","t59lRQssNC","nlaByzFgtB","tAOsrmX2GE","AXpwElkMUA","vOqCEuZPqg",
+"AIYUuAXpwE","e6e4zBGaQY","ni2v1Chuy3","gf8rISs0Zu","e6e4z0h1b1","K20wKjzUqR","VBjhzGSQwj","DG4sTMezSW","Cfgr3n1pmO","VNCPdksJby",
+"lCMxyU3yw5","uoStw7ku1p","fLNg84dEz6","qUJMdFPfSE","VerEA5Drn0","NAFuwgIYvE","aDGtS7hyVv","CdyBVhe9IA","IjTwPvOqCE","oQ87rpT8wu",
+"gtCA5B3qem","5NammDz1R3","QChxslpF6W","zQt6Qd7vjM","atef29eoRc","aez9yNAFuw","NOHszYOfrY","5drc6iKqhr","0KyfspiJSk","Q6LixQssNC",
+"WPmlx5iGN5","XflUqHzZT8","JRJQBiB08l","cShY2HfyNQ","tl72Wrz7Ut","5VZjSuupzk","Vprf20MR5X","8RCUANOHsz","F6PT2JXljW","55rfBOUqFM",
+"PYBf4FcWrW","Dz1R3ix74r","jiVBPJIqXi","ksJbyIKxdL","uTacx2Nslm","SmGzvgIYvE","fFDrJ9eoRc","jeskSRBhp0","PYBf4C2Irc","Pb1pa7lUXZ",
+"gtCA5k85Ae","JXljWFVMxo","ydG8U07n1c","8xEKzoGu6x","K4GS8xciqp","zz4ZUBCxeC","MmKGJMm8si","0PktIbgJAz","EdBKcPYBf4","s93MlQClRL",
+"uTacxo8Uyd","StlDJgf8rI","t98iWxXTI4","FcWrWgjUTu","xXTI4580YD","zmLYDFnPFB","IRh48Q6Lix","iB08lBFkb8","8xEKzRzaZA","5drc6uN6r3",
+"Cfgr3ru4UG","HlUbFtlILt","BGaQYmz8gx","SWfouSmGzv","uvf7AksJby","ulk41AgJHQ","y94nwpFrrl","l83Uduvf7A","FxX9qKASQ8","gf8rIuPX7G",
+"YOfrYpv0i7","8U2nUlH1kt","uAWypazIWp","jeskSd7vjM","VNCPd5IhmG","StlDJFxX9q","POUYS55rfB","6AFT0FxX9q","VIlwP0h1b1","lm0pDVIlwP",
+"BpYhVM6qcG","vOqCEIjTwP","JJs5mTwano","vLsmS16lHc","DG4sTRpBQm","a00b5Fhtgl","YjB9tGSQwj","rKDLJm4bxU","BbwgAvOqCE","aez9ySWfou",
+"2DREsZ4I1v","lH1ktYjB9t","zz4ZUhi5X7","7Ow5CS77LH","WreyPC2Irc","EOE1olweGy","G1RhSxciqp","2NslmCdyBV","FPfSEMmKGJ","qUJMdnlaBy",
+"jzUqRuN6r3","BFkb8ZuDtD","dmoS7BGaQY","FcWrWiB08l","C2Irc1LB1L","BGaQYS77LH","IRh48W7cTs","0PktIAXpwE","hYBCKoQ87r","0KyfsEOE1o",
+"NcICAzY1GY","L7cGchUTw7","In3NSO3iyQ","9y4lwzmLYD","kB5nPqaofN","ZhwG14dEz6","piJSkCxVEf","QClRLrhl0J","Ta8f6uupzk","dhSuH4QMc9",
+"t98iWFwEJz","WPmlxi3pyd","rKDLJAmdQd","Ss0Zu5IhmG","KASQ8b29RJ","fLNg8fmIK1","yluBxlkMUA","vkCHHOUqFM","OUYuFMojnP","NAFuw4dEz6",
+"rhl0JB3qem","tlILtQ6hMC","GSQwjjtn0X","ReKEW4dEz6","LbRTHFwEJz","JkzUnhi5X7","BFkb8uJScX","Chuy3djsrv","mz8gxHRxd8","WPmlxpFrrl",
+"iqv4kFjHXR","1j5L8CK5W7","Mm8si55rfB","jzUqRt59lR","a00b5uZPqg","9y4lwqUJMd","5VZjSRsQUq","5Mg9rSmGzv","djsrv1v5hH","BbwgADQimp",
+"8xEKzCfgr3","VjCZqD6rBy","jzUqRxXTI4","5ZaEzs7Mxk","zQt6Qi7WMQ","JkzUnWMiS3","ni2v1s93Ml","RzaZAjeskS","lViBvoGu6x","uoStwWPmlx",
+"9rlg9ciuWz","ZUnqtDQimp","7Ow5C4QMc9","AIYUujSjS3","qaofNO3iyQ","7X3uy1v5hH","dmoS75Namm","Y1mC0RmDcr","SmGzv5ZaEz","uPX7GNo0Qb",
+"0ao3lUvlv4","BFkb8580YD","JRJQBQClRL","5Drn0hYBCK","lj07QY1mC0","guMb8CK5W7","aDGtSNAFuw","JKWYRWreyP","Zv7z0RpBQm","sqVrfBGaQY",
+"Mm8sijiVBP","JkzUncShY2","rKDLJM3zXL","5drc67fsYM","5iGN5s4786","WmadAYOfrY","Cp3mZ7X3uy","Ta8f6gjUTu","S77LHKsjRK","pvgjSSjskQ",
+"RpBQmIn3NS","QYxC0FcWrW","Q6hMCzFgtB","3weIFCK5W7","uoStwBGaQY","xXTI4lH1kt","blLA9uoStw","Ss0ZuuZPqg","DcpWBhi5X7","zFgtBpWiOs",
+"CNHmvo8Uyd","8RCUACNHmv","SWfouhi5X7","pFrrlFcWrW","8TxD77X3uy","0PktIni2v1","aDGtSOUqFM","mz8gxGrDg7","9GXkXiwzGk","LDk6fiKqhr",
+"AgJHQatef2","uLtKsjtn0X","5Namm0Kyfs","OxWIH2DREs","v1HlnFjHXR","hi5X7jfREu","Rxrsm5Drn0","zqH0WlCMxy","Yh1hFPYBf4","2DREsjtn0X",
+"a00b5FPfSE","RmDcrCIShG","K4GS8v8yFN","U3yw5D6rBy","0ao3lEdBKc","W3VFHHlUbF","ogLgcRBhp0","2ZHdkxciqp","C2Ircs4786","0MR5XKZamH",
+"K4GS8uJScX","2TRI7lsQGo","piJSkTCgPp","xXTI4jzUqR","fqypyQbxXc","CdyBV16lHc","zbIYY07n1c","AkKTk16lHc","uLtKsIRh48","DQimpPOUYS",
+"S77LHQbxXc","FnPFBulk41","Chuy3Mkgy8","VIlwP618Di","HP433y94nw","2ZHdk4W0Tl","vkCHHtuDyS","XflUqaFFss","In3NSzQt6Q","taOXK0Kyfs",
+"v2eC3Q6hMC","o8UydbZLvS","VjCZqdhSuH","VIlwPPOUYS","JXljW8cVD3","29QAzfaHir","mX2GEdjsrv","y94nw8cVD3","Gv3FqG1RhS","0KyfscmXIX",
+"fmIK1P6bcg","HP433ReKEW","vOqCE4dEz6","tAOsrTwano","RpBQmi7WMQ","WaWsvSjskQ","AmdQdmX2GE","IBe8kFcWrW","8hJdtoQ87r","Waim6n8pJ9",
+"jtn0XXflUq","QbxXcStlDJ","JJs5mzQt6Q","XyPZNlkMUA","DG4sTEdBKc","9GXkXYOfrY","ulk41yEfy9","4W0Tls4786","MmKGJsoy9t","iwzGk0YAGH",
+"jS1ajVprf2","J2mQiRpBQm","GXdoH5ZaEz","fqypy8U2nU","FwEJzulk41","yToGWMGlTF","EdBKcQssNC","5iGN5yEfy9","okgRi3weIF","blLA9dQ586",
+"0MR5XeuZA5","nFqik1j5L8","0MR5XlweGy","Pb1paTXQ0Z","lm0pDYw2oU","jiVBPB3qem","xXTI4v1Hln","BbwgAv8yFN","PYBf4PYBf4","9iGoTFhtgl",
+"ulk41t59lR","WPmlxTa8f6","ogLgcuQIcz","S77LHlweGy","YOfrYUvlv4","AmdQdP6bcg","5IhmG0MR5X","7Ow5ClH1kt","JkzUn8RCUA","J2mQinlaBy",
+"aL6AJUlU3M","2ZHdkIBe8k","7X3uyCK5W7","zmLYDjeskS","618DiNxx9V","b29RJhE1Ql","lj07QpmeCd","ZuDtDjfREu","iKqhrlXFOB","tjQxshe9IA",
+"Cfgr31v5hH","HlUbFQYxC0","guMb8LewvM","pmeCd5Namm","DcpWByvOMI","2hEEUAOgEe","VerEAM3zXL","FVMxoCqqaD","AmdQdmz8gx","7fKYUgtCA5",
+"lXFOBHlUbF","ydG8UMmsIo","wDajXfcwDa","brhlQv1Hln","4W0TlzbIYY","sqVrffmIK1","he9IApv0i7","FxX9qChuy3","J2mQilpF6W","64s8NUlU3M",
+"P6bcg45cIH","mz8gxnFqik","7fsYMCdyBV","M6qcGNxx9V","ydG8UuoStw","45cIHuupzk","NhXduFPfSE","lH1ktjfREu","PYBf47Ow5C","tl72W0ao3l",
+"VjCZqO3iyQ","JKWYRzHF1q","580YDk85Ae","uZPqg8TxD7","9rlg94QMc9","rhl0JM6qcG","BFkb8UmaEv","gIYvEogLgc","FcWrWLbRTH","s478624ARF",
+"M3zXLIBe8k","M6qcGlViBv","dmoS7WDVWJ","FVMxoUl4a1","pWiOsi3pyd","Zv7z0Kr8ys","LewvMhSSvQ","pFrrlgf8rI","Pb1paJIqXi","D6rByBpYhV",
+"L7cGcdQ586","VLTy6oVQp6","0Wr5yChuy3","brhlQfmIK1","zHF1qgIYvE","RBhp09iGoT","0MR5XBpYhV","OUYuFogLgc","Nxx9VeuZA5","JKWYRHfyNQ",
+"MezSWzqH0W","n1pmOIn3NS","Kr8ysjfREu","yEfy9Ta8f6","OHaBz4dEz6","0ao3llweGy","wiHrZQ6Lix","RACujgdQsS","16lHcguMb8","O3iyQZzJHW",
+"lCMxyOUYuF","FcWrWPYBf4","ZJTXHzqH0W","S77LHuupzk","Waim6POUYS","KZamH5Namm","4dEz6hUTw7","8hJdtqaofN","ni2v1gtCA5","BpYhVs4786",
+"45cIHK20wK","MojnPCIShG","wiHrZ580YD","i7WMQC2Irc","Yf2EcDcpWB","lpF6Wd7vjM","pWiOsSmGzv","2NslmI7p2a","Ss0Zus7Mxk","zmLYDgf8rI",
+"yluBxNhXdu","24ARFDcpWB","5IhmGciuWz","vOqCEzQt6Q","aez9yDcpWB","ulk41uTacx","EOE1oNhXdu","iKqhr7Ow5C","euZA5IRh48","0BmCy5Namm",
+"JkzUnzz4ZU","ru4UGFjHXR","rhl0J7X3uy","D6rBy7ku1p","IRh48k85Ae","29QAzs93Ml","v1Hlnt98iW","djsrvQ6Lix","FnPFBTCgPp","RxrsmksJby",
+"v8yFNOz8yZ","16lHcYw2oU","cShY2rz7Ut","No0QblweGy","AIYUuKZamH","5VZjSi3pyd","6AFT0Twano","BFkb88FmFH","VjCZqJRJQB","W7cTs5ZaEz",
+"Yf2EchE1Ql","4dEz6Twano","GXdoHNhXdu","HzZT86AFT0","5ZaEzlsQGo","BGaQYVprf2","uZPqgqQxHP","7Ow5Ciqv4k","VNCPd45cIH","JKWYRHlUbF",
+"ciuWzWmadA","580YDydG8U","JRJQBulk41","RpBQmRBhp0","TXQ0ZDG4sT","OxWIHnFqik","aL6AJ7fKYU","nnP8oLewvM","KASQ8hE1Ql","GWqqXNhXdu",
+"NcICAFhtgl","cL0aEuN6r3","VLTy6Nxx9V","d85a9yofH3","ZJTXH580YD","wDajXUlU3M","StlDJlm0pD","gjUTuCIShG","lViBvChuy3","Q6hMCVLTy6",
+"uLtKs16lHc","EOE1oD6rBy","tl72WReKEW","euZA5C2Irc","xReec0h1b1","AmdQdYf2Ec","M6qcGhYBCK","O3iyQFcWrW","FLsphs4786","lpF6WuTacx",
+"hUTw7Ul4a1","jeskS4QMc9","zmLYDCK5W7","xciqpCxVEf","qaofNzFgtB","tvdkDnFqik","a00b5t98iW","Dz1R3i7WMQ","t59lRh1zcH","VerEAhE1Ql",
+"tlILtJKWYR","l83UdlCMxy","mz8gx16lHc","v2eC3JRJQB","yofH3Uvlv4","J2mQi4QMc9","UmaEvhUTw7","K20wKyofH3","FhtglQClRL","DQimpcL0aE",
+"Cfgr3v1Hln","CIShGYh1hF","5drc6ECMvU","Yh1hF16lHc","Uvlv4dmoS7","VIlwPCK5W7","oVQp6AOgEe","rz7UtoVQp6","t59lRpvgjS","5nmWvHP433",
+"Chuy3RpBQm","Kr8ysRsQUq","WmadAblLA9","uQIczdjsrv","kZANmSmGzv","JIqXim4bxU","7X3uycL0aE","5Drn0VLTy6","C2IrcSjskQ","2hEEU3otm6",
+"0h1b1o8Uyd","ZzJHWPYBf4","uvf7AIRh48","7ku1pPYBf4","J2mQiKZamH","JIqXiMkgy8","GWqqXDcpWB","t59lRyvOMI","HfyNQFnPFB","h1zcHXflUq",
+"3otm6ZJTXH","VerEAQClRL","uQIcz29QAz","0Wr5yb29RJ","MaJQssoy9t","hE1Ql7hyVv","KZamHNhXdu","618Dim4bxU","EoToPAXpwE","MojnPWDVWJ",
+"ciuWzMm8si","qQxHP48cHL","e6e4zqUJMd","ru4UGfqypy","o8Uyd64s8N","ulk41xciqp","oVQp6F6PT2","uLtKsOHaBz","9XyT9LbRTH","EdBKcCxVEf",
+"Yf2EcStlDJ","14FLRQnJ1S","s7MxkpWiOs","bgJAzlH1kt","ZUnqtlweGy","MmKGJChuy3","FPfSEjS1aj","Pb1pa9rlg9","FnPFBuoStw","GWqqXVLTy6",
+"FhtglbZLvS","uvf7ASjskQ","C2IrchYBCK","v1HlnVjCZq","bgJAzFnPFB","hUTw7cmXIX","brhlQQ6Lix","UmaEvpv0i7","QbxXcYOfrY","d85a9lsQGo",
+"jeskS5ZaEz","FVMxoFFDui","L7cGcWreyP","P6bcgcmXIX","Zv7z07ku1p","KASQ8DLhzM","MojnP2TRI7","ydG8Uaez9y","Oz8yZMezSW","LbRTHJIqXi",
+"uPX7G0h1b1","gtCA50Kyfs","blLA9GWqqX","9y4lwOUqFM","l83UdfcJOy","zY1GYNOHsz","TXQ0ZDz1R3","CdyBVSs0Zu","QClRLfmIK1","uZPqglsQGo",
+"PYBf41v5hH","5iGN5ZhwG1","7X3uyMGlTF","SmGzvgf8rI","jeskSWmadA","gtCA5t59lR","gdQsSbrhlQ","lH1ktStlDJ","rKDLJRsQUq","bgJAzJIqXi",
+"IjTwPZ4I1v","MojnPS77LH","J2mQiUvlv4","bgJAzUvlv4","zY1GYbrhlQ","2DREsOxWIH","DLhzMpFrrl","cShY2v2eC3","JKWYRAmdQd","vkCHHl83Ud",
+"QworuTCgPp","KASQ8aDGtS","ZJTXHBGaQY","5drc6cShY2","Ss0ZuydG8U","FwEJzzbIYY","pmeCdlpF6W","GWqqX0h1b1","tjQxsdpe1v","wDajX29QAz",
+"OxWIHFhtgl","KASQ8HRxd8","1LB1Ljtn0X","RkQkes93Ml","lweGyGrDg7","Twanom4bxU","WDVWJB3qem","uvf7AwDajX","sx5GlFPfSE","5Drn0qQxHP",
+"hSSvQuPX7G","pvgjSgjUTu","lH1ktY1mC0","6q6L97fKYU","pvgjSgtCA5","azIWplm0pD","0BmCySbRYy","v2eC3SWfou","aez9yrKDLJ","KZamHzFgtB",
+"EoToPh1zcH","uPX7GaFFss","1LB1LQClRL","n8pJ9bgJAz","LbRTHrhl0J","RxrsmwDajX","uPX7GjfREu","lH1ktWreyP","mX2GE29QAz","NhXduQYxC0",
+"3weIF8xEKz","v8yFNaez9y","cL0aEKASQ8","9eoRcSbRYy","OHaBzeuZA5","8FmFHSbRYy","pmeCdl83Ud","SWfouJRJQB","i7WMQnFqik","VNCPdEoToP",
+"zHF1qfqypy","K4GS8JkzUn","8xEKzxReec","oVQp6zbIYY","qaofNlXFOB","zbIYYZJTXH","ReKEWnnP8o","24ARF1j5L8","ZuDtDxXTI4","IRh48d85a9",
+"DG4sThSSvQ","OHaBzguMb8","uupzkrhl0J","aDGtS5VZjS","J2mQiL7cGc","MojnP5Drn0","B3qem5iGN5","F6PT2uZPqg","CIShGk85Ae","5nmWvBGaQY",
+"5IhmGxciqp","FhtgltvdkD","Chuy30h1b1","xXTI4Vprf2","2hEEUaFFss","lm0pDGXdoH","C2IrcPOUYS","ksJby2hEEU","QWxoTHfyNQ","ReKEWjfREu",
+"FhtglYjB9t","EoToP5IhmG","UmaEvMkgy8","9iGoToVQp6","RkQkelpF6W","P6bcgKZamH","LewvMa00b5","sqVrfO3iyQ","FnPFBNOHsz","YOfrYCdyBV",
+"rhl0JRmDcr","UlU3MuJScX","qaofNrKDLJ","jS1ajhUTw7","14FLRiKqhr","aez9yCNHmv","rz7UtBbwgA","7Ow5CJ2mQi","tuDySJJs5m","Ss0ZuHP433",
+"uvf7AyvOMI","uPX7GRBhp0","Pb1paAkKTk","pFrrllweGy","GXdoH4W0Tl","3otm6Q6Lix","7fsYMYjB9t","lkMUAn8pJ9","BCxeCvOqCE","FVMxopmeCd",
+"JRJQBzHF1q","AgJHQksJby","JRJQBiKqhr","GXdoHJJs5m","0BmCybgJAz","sx5GldmoS7","jS1aj7ku1p","24ARF7hyVv","lm0pDpmeCd","48cHLIBe8k",
+"MmKGJs93Ml","BpYhVuZPqg","aFFsstAOsr","AOgEeKZamH","l83UdydG8U","YjB9tAXpwE","Cp3mZRpBQm","GSQwjtuDyS","oGu6xUlU3M","Cp3mZdpe1v",
+"QbxXcP6bcg","oGu6xVIlwP","jiVBPMmsIo","S77LHIBe8k","xReeciB08l","okgRi0Wr5y","S77LHoGu6x","hYBCKKsjRK","BFkb8ni2v1","8TxD7PYBf4",
+"aFFss0h1b1","O3iyQksJby","QClRLTXQ0Z","8TxD7IKxdL","VjCZqxXTI4","GXdoHi3pyd","9rlg9lViBv","StlDJVBjhz","rKDLJnlaBy","blLA9QnJ1S",
+"C2IrcAgJHQ","QworuYw2oU","JkzUnKZamH","iB08l5VZjS","djsrvdpe1v","M6qcG7fKYU","hUTw7y94nw","pvgjSL7cGc","WaWsvEoToP","LbRTHd85a9",
+"lkMUApWiOs","ZUnqtUmaEv","YjB9td85a9","RxrsmDcpWB","BpYhV5drc6","uZPqgwiHrZ","HRxd8hYBCK","VjCZqGSQwj","1LB1L7fsYM","2DREsPYBf4",
+"WmadAk85Ae","9XyT9BbwgA","AOgEeblLA9","7fsYMs7Mxk","5VZjSNcICA","fcwDa8hJdt","ZzJHWksJby","pWiOs8cVD3","QYxC0uPX7G","8U2nU0h1b1",
+"iwzGkvLsmS","5Drn0d85a9","euZA5MmKGJ","sx5GluAWyp","MmKGJPb1pa","TCgPp2Nslm","dhSuHNhXdu","zz4ZUIRh48","ulk41k85Ae","Kr8ysuQIcz",
+"CIShGS2Dfu","5drc6OHaBz","HP433mz8gx","SbRYyjS1aj","WDVWJFxX9q","ulk416q6L9","BpYhVJXljW","Kr8ysJKWYR","FFDui5iGN5","9rlg9UmaEv",
+"64s8Natef2","Yw2oUOxWIH","ulk4129QAz","B3qemOxWIH","FhtglQChxs","NOHsz7hyVv","7ku1psx5Gl","SjskQzY1GY","cShY2Ul4a1","Mkgy8ZhwG1",
+"vkCHHrhl0J","ThjNnRpBQm","5VZjSMmsIo","24ARFyluBx","2ZHdkPYBf4","Z4I1v0YAGH","5Namm2hEEU","9GXkX6q6L9","2hEEUokgRi","zqH0W9eoRc",
+"fLNg88U2nU","4dEz6i7WMQ","Oz8yZ5Mg9r","4W0TlcShY2","W7cTsZhwG1","1j5L8mz8gx","K20wKnlaBy","9XyT9CNHmv","WMiS3FVMxo","aFFss7lUXZ",
+"Dz1R3Gv3Fq","lweGyt98iW","l83UdJRJQB","J2mQijSjS3","GXdoHOHaBz","okgRia00b5","ru4UGVjCZq","kZANmv8yFN","uPX7G5Namm","YjB9tFcWrW",
+"0MR5XfmIK1","okgRi1j5L8","pT8wuFPfSE","MezSWl83Ud","nlaByuupzk","fcwDanFqik","JKWYRThjNn","0Wr5yQ6hMC","lViBvQClRL","jiVBPiwzGk",
+"8hJdtn1pmO","BGaQYcmXIX","Zv7z0iB08l","I7p2aDG4sT","618Dilm0pD","fFDrJWMiS3","BpYhV1v5hH","9XyT9yEfy9","yvOMIfcwDa","Y1mC0FxX9q",
+"6q6L9fcwDa","uZPqg9iGoT","k85AeQworu","In3NS16lHc","suY4xQ6Lix","ciuWz5iGN5","ZhwG1i3pyd","Cp3mZ24ARF","UlU3MSWfou","jfREuAXpwE",
+"WPmlxjzUqR","zHF1qZ4I1v","WDVWJpFrrl","2TRI74dEz6","Q6LixSjskQ","zFgtBt98iW","pWiOsFhtgl","GWqqXCqqaD","QWxoTWPmlx","EdBKcRzaZA",
+"DG4sTU3yw5","8TxD75nmWv","7X3uy9XyT9","NcICAZUnqt","prNT65IhmG","aL6AJwiHrZ","X6PinP6bcg","In3NSWaim6","CNHmvF6PT2","Mkgy8vOqCE",
+"FVMxopiJSk","Ul4a19iGoT","BCxeCRBhp0","cShY22hEEU","yToGWyofH3","48cHL5VZjS","x3LDeDLhzM","euZA548cHL","uQIczEoToP","AXpwEuoStw",
+"ZhwG1bZLvS","xciqp2TRI7","0MR5XhE1Ql","2TRI7yvOMI","jfREuO3iyQ","tAOsr2TRI7","JRJQBOHaBz","M6qcGVLTy6","uPX7GP6bcg","KZamHhi5X7",
+"DQimpyToGW","M3zXLCIShG","FhtglTwano","ni2v1HlUbF","6q6L9GSQwj","s47866q6L9","dpe1vksJby","HzZT8OUYuF","RxrsmUl4a1","jS1ajHlUbF",
+"Zv7z0OxWIH","uoStwDz1R3","GSQwjDcpWB","GSQwjo8Uyd","OHaBzCdyBV","WMiS3jeskS","xXTI4VIlwP","ThjNnzqH0W","zY1GYW3VFH","No0QbC2Irc",
+"MGlTFiqv4k","hE1QllXFOB","2Yz7EVerEA","3otm68hJdt","ZhwG1m4bxU","5nmWvOUqFM","oVQp6v8yFN","m4bxUQ6hMC","U3yw51LB1L","taOXKFGzgp",
+"FGzgpYf2Ec","pWiOsDQimp","QworuuLtKs","IKxdLNo0Qb","2hEEUZ4I1v","yluBxdmoS7","HlUbFW7cTs","OUYuF4dEz6","7Ow5CRBhp0","dpe1vG1RhS",
+"29QAzuPX7G","gjUTufaHir","Cfgr39GXkX","NcICAY1mC0","JIqXixXTI4","16lHc5VZjS","iB08lWaWsv","HP433zQt6Q","VerEAhYBCK","jiVBP2Yz7E",
+"QbxXcThjNn","MezSWSs0Zu","v8yFN0ao3l","Dz1R3JRJQB","iwzGkCqqaD","aDGtSAkKTk","FhtglUl4a1","pT8wu9GXkX","RACujFLsph","xciqpzmLYD",
+"FjHXRiwzGk","zHF1qZhwG1","bgJAzHP433","fmIK1Fhtgl","t59lRLbRTH","FnPFB9y4lw","gIYvE2hEEU","MK07YF6PT2","Nxx9V14FLR","P6bcgL7cGc",
+"he9IAThjNn","8U2nUVprf2","M3zXLSjskQ","GrDg7ZUnqt","6q6L9kZANm","NOHszt98iW","7fsYMRsQUq","9XyT9AIYUu","618DiVerEA","FLsphKZamH",
+"Yw2oUhYBCK","0PktIlXFOB","SbRYyy94nw","VLTy6Q6Lix","JKWYRuN6r3","iKqhrmz8gx","9eoRcRxrsm","h1zcHFjHXR","blLA9bZLvS","FjHXR4W0Tl",
+"fmIK1OHaBz","AOgEeYf2Ec","S77LHlm0pD","AIYUu55rfB","Dz1R3d7vjM","Nxx9VM3zXL","uTacxlm0pD","FVMxoxXTI4","SjskQ580YD","tlILt8U2nU",
+"9XyT9D6rBy","CNHmvNOHsz","G1RhSyToGW","i7WMQDz1R3","Oz8yZDG4sT","uvf7AChuy3","ulk41FGzgp","8xEKzUl4a1","In3NSTa8f6","s7MxkF6PT2",
+"ZJTXHpFrrl","uPX7GzHF1q","FGzgppmeCd","WmadABFkb8","J2mQiBGaQY","jzUqRJkzUn","Q6hMCuupzk","9GXkXgtCA5","FPfSEfqypy","Chuy3Yw2oU",
+"07n1cix74r","NcICATCgPp","TwanoPb1pa","45cIHKsjRK","1v5hHhE1Ql","uAWypEOE1o","i3pydDG4sT","07n1cM3zXL","MmKGJJRJQB","IKxdL48cHL",
+"Ss0ZudQ586","brhlQqUJMd","RzaZAdhSuH","dpe1vKZamH","618DiRzaZA","O3iyQVLTy6","K20wKlweGy","lm0pDDLhzM","GrDg7JkzUn","jtn0XHP433",
+"xReecNAFuw","hYBCKzbIYY","zY1GYuQIcz","lsQGoRBhp0","ECMvUChuy3","MezSWyofH3","0Wr5yWPmlx","uAWypNhXdu","fcwDaSs0Zu","tuDySRACuj",
+"oQ87raFFss","WDVWJFhtgl","4W0Tlgf8rI","QbxXcRBhp0","YjB9tWmadA","16lHc8hJdt","ReKEWrKDLJ","FwEJzBFkb8","3otm6hE1Ql","I7p2aFFDui",
+"MmsIoRACuj","AmdQdMK07Y","vOqCEX6Pin","VjCZquAWyp","W7cTspv0i7","QClRLx3LDe","WaWsvpWiOs","jtn0XFFDui","GWqqXYf2Ec","CNHmv8hJdt",
+"yofH3Cp3mZ","EOE1oB3qem","ydG8UpWiOs","vLsmSy94nw","WreyPdQ586","cmXIXqUJMd","8RCUA64s8N","5VZjSFhtgl","t98iWqaofN","5ZaEzNhXdu",
+"8TxD7Cfgr3","4W0TlVLTy6","n8pJ9MezSW","YOfrY3otm6","45cIHMGlTF","lCMxy2DREs","fcJOyqUJMd","2ZHdkhUTw7","NhXduAgJHQ","MojnPC2Irc",
+"wDajXciuWz","yofH3n1pmO","7hyVvxciqp","JKWYRvLsmS","U3yw5djsrv","lweGy2ZHdk","jfREu9y4lw","HRxd8wDajX","QChxsBGaQY","HfyNQbgJAz",
+"FLsphAIYUu","9GXkXVNCPd","jiVBP9y4lw","8xEKz0YAGH","v1Hln8U2nU","K4GS80MR5X","i3pydzqH0W","StlDJQYxC0","kB5nPiB08l","gtCA5Kr8ys",
+"pv0i7YOfrY","aez9yqUJMd","7ku1pFcWrW","fcJOy618Di","8RCUAU3yw5","tl72W0MR5X","hUTw71j5L8","JkzUnFNYIM","a00b5Yh1hF","v8yFNjiVBP",
+"X6PinqaofN","WmadA1j5L8","AgJHQNxx9V","FnPFBM3zXL","QYxC0Ul4a1","sx5GluN6r3","nFqik5Namm","QYxC0J2mQi","NcICArKDLJ","ksJbyJRJQB",
+"B3qemX6Pin","cmXIXVerEA","QWxoTfcwDa","Cp3mZCxVEf","AgJHQFVMxo","QChxszFgtB","2hEEUYf2Ec","oVQp6W3VFH","5ZaEzhYBCK","8hJdtulk41",
+"Uvlv4LDk6f","i7WMQOxWIH","FxX9q4dEz6","XflUqCdyBV","7ku1p6AFT0","4dEz6jeskS","7fKYUDcpWB","bgJAzW3VFH","l83UdBCxeC","zQt6QAXpwE",
+"rKDLJHzZT8","Kr8yszHF1q","L7cGcStlDJ","uTacxzY1GY","TCgPpVerEA","Z4I1vtl72W","ix74rTa8f6","soy9t07n1c","9eoRcKsjRK","vkCHHyluBx",
+"7fKYUvOqCE","hE1Qli3pyd","EdBKcEoToP","MK07YCIShG","x3LDeQChxs","CK5W7n1pmO","8RCUAUlU3M","fcwDaUlU3M","dhSuHn8pJ9","iqv4kh1zcH",
+"MezSWAOgEe","hE1QlWmadA","CK5W72TRI7","lweGyZv7z0","fLNg8RkQke","0Wr5ySjskQ","lm0pDGrDg7","BFkb8C2Irc","cShY25Mg9r","0YAGHFcWrW",
+"zmLYD8FmFH","VerEADz1R3","lpF6WOUYuF","iKqhrCfgr3","Y1mC0Vprf2","ksJbyfcwDa","fmIK1k85Ae","7ku1plCMxy","BGaQYQbxXc","tvdkDfmIK1",
+"Zv7z0Cp3mZ","0h1b1gf8rI","FwEJzjeskS","CIShGi3pyd","SbRYy0BmCy","pWiOsQChxs","lj07QpAhR1","gf8rI0YAGH","5Drn0BFkb8","M3zXL1LB1L",
+"HzZT8blLA9","Dz1R30PktI","BpYhVuN6r3","7fKYUX6Pin","zbIYYyEfy9","RzaZAlH1kt","BCxeCKZamH","NcICAgtCA5","7X3uyix74r","K4GS8AXpwE",
+"ReKEWFwEJz","uAWypMkgy8","FVMxovkCHH","Q6hMCDG4sT","i7WMQwDajX","6q6L9DG4sT","NAFuwNxx9V","aL6AJZJTXH","6q6L9lsQGo","pFrrl4W0Tl",
+"MK07Yjtn0X","Zv7z0VerEA","FNYIMCp3mZ","d85a9HP433","F6PT2Y1mC0","uTacxx3LDe","Dz1R3s7Mxk","7hyVvJIqXi","Yw2oUxciqp","X6PinSmGzv",
+"HRxd8tuDyS","RkQkeVBjhz","5NammydG8U","guMb8Twano","I7p2aHlUbF","dQ586tAOsr","FxX9qTa8f6","M3zXLru4UG","dmoS7ulk41","lsQGoSWfou",
+"s4786No0Qb","TCgPp9y4lw","MGlTFlj07Q","n1pmOCdyBV","QChxsoGu6x","5Mg9rMm8si","yvOMIs93Ml","hSSvQ2TRI7","UlU3MYOfrY","atef2BbwgA",
+"CdyBVoGu6x","b29RJGXdoH","HzZT8zmLYD","lH1ktaDGtS","dpe1vZuDtD","3weIFSbRYy","48cHLbgJAz","RzaZAzHF1q","kZANmhi5X7","t59lRs93Ml",
+"MmsIoqQxHP","rz7Utaez9y","tvdkDMmKGJ","ogLgcjeskS","t59lRxXTI4","y94nwQYxC0","7fKYUmX2GE","KZamH1LB1L","JXljWlkMUA","AmdQdAgJHQ",
+"xXTI4euZA5","t59lR7Ow5C","ogLgcuTacx","yluBxCfgr3","SbRYyJJs5m","pv0i7OHaBz","ZUnqtqUJMd","lpF6WydG8U","DcpWBJIqXi","fqypyv2eC3",
+"dmoS7GrDg7","NcICAxReec","GrDg7OxWIH","tl72WFPfSE","BGaQYcL0aE","d7vjMxXTI4","SjskQK4GS8","jzUqRMaJQs","48cHLECMvU","piJSkRBhp0",
+"GSQwjhYBCK","KZamHqaofN","ECMvUdQ586","pAhR11j5L8","jS1ajMezSW","BFkb8QbxXc","wDajXsoy9t","07n1c8FmFH","FjHXRtjQxs","pFrrlaez9y",
+"kZANmMaJQs","uN6r3Kr8ys","IjTwPoGu6x","gdQsSTXQ0Z","uupzkHRxd8","nlaByokgRi","FNYIMv8yFN","EdBKcDQimp","0h1b1cQOnv","JXljWSs0Zu",
+"29QAzQbxXc","Cp3mZQnJ1S","EOE1oQssNC","Vprf2Gv3Fq","lpF6WqaofN","cmXIXMaJQs","MezSWdpe1v","ix74r24ARF","cmXIXzQt6Q","NAFuwcQOnv",
+"OxWIHfqypy","nlaBysuY4x","BGaQYzz4ZU","Vprf2vOqCE","8U2nUUmaEv","QWxoTQssNC","jS1ajVerEA","TwanoZUnqt","n1pmOTwano","he9IA4QMc9",
+"WaWsv8cVD3","XflUqeuZA5","Waim6Kr8ys","nnP8o48cHL","B3qemMaJQs","Chuy3Q6hMC","WreyPCp3mZ","5NammxReec","MaJQs8TxD7","2Yz7EvOqCE",
+"Vprf2OHaBz","CNHmvKZamH","RACujQworu","uTacxy94nw","29QAzJJs5m","ydG8UtjQxs","aFFsss4786","Yw2oUTCgPp","rKDLJd7vjM","cQOnv5ZaEz",
+"14FLRzY1GY","W3VFHprNT6","uLtKs5ZaEz","TwanoydG8U","EdBKcOxWIH","pFrrlCfgr3","TwanocShY2","0Wr5ytaOXK","tuDySU3yw5","Q6hMCHfyNQ",
+"brhlQ618Di","he9IA8cVD3","3otm6XflUq","nlaBy1LB1L","ix74roVQp6","2Yz7EJ2mQi","WMiS3s93Ml","yvOMIW3VFH","16lHc5iGN5","5ZaEzVNCPd",
+"Cfgr3lweGy","K4GS88FmFH","NOHsz5Namm","JIqXiI7p2a","SWfoulViBv","Q6hMCJ2mQi","K4GS8o8Uyd","zqH0WJ2mQi","HP433kZANm","2DREsDLhzM",
+"ru4UGRmDcr","prNT69iGoT","MojnPD6rBy","DQimppWiOs","WMiS3JKWYR","dhSuHEdBKc","soy9t29QAz","8U2nU8U2nU","Dz1R3uoStw","LewvM0ao3l",
+"L7cGcEOE1o","zqH0WyToGW","nlaByuAWyp","5iGN5pvgjS","MojnPQbxXc","Nxx9V9rlg9","4QMc9FFDui","IKxdLW7cTs","MmKGJ2Nslm","Ta8f6euZA5",
+"m4bxUDcpWB","WmadAVNCPd","prNT6AOgEe","IRh48NcICA","djsrvYOfrY","GSQwjOHaBz","HzZT8Gv3Fq","DLhzMm4bxU","QClRLksJby","gIYvElkMUA",
+"7fKYUCK5W7","S77LH2Yz7E","7fKYUsqVrf","BCxeC9y4lw","kZANm2DREs","MK07YdhSuH","7X3uyK4GS8","BGaQYQChxs","JJs5mv1Hln","vOqCEWDVWJ",
+"TCgPpStlDJ","8hJdtF6PT2","uupzkxciqp","QssNCFNYIM","D6rByG1RhS","uQIczhSSvQ","5Drn0Ss0Zu","VjCZquQIcz","NAFuwnnP8o","GWqqXcQOnv",
+"GSQwjIKxdL","GrDg75Namm","CdyBVkB5nP","djsrvFjHXR","HRxd8GSQwj","oGu6xs7Mxk","Yf2EcCp3mZ","mX2GExciqp","iwzGk5IhmG","RzaZAtlILt",
+"FGzgp5Mg9r","CdyBVv8yFN","FhtglFcWrW","KsjRKaDGtS","1j5L8uTacx","dmoS7JKWYR","C2IrcCxVEf","lkMUAt59lR","t59lR5Mg9r","Oz8yZ48cHL",
+"cL0aEEdBKc","uupzkzmLYD","uAWypogLgc","IBe8ko8Uyd","45cIH9XyT9","lCMxytuDyS","uvf7A5VZjS","CqqaDix74r","gdQsSJJs5m","vLsmS0Kyfs",
+"CK5W7VerEA","QnJ1SK20wK","FxX9qQssNC","ciuWzciuWz","YjB9tVIlwP","Zv7z0RmDcr","AIYUui7WMQ","n8pJ9zqH0W","NcICAuupzk","AkKTkd7vjM",
+"8cVD3zHF1q","WPmlxKr8ys","NOHsz48cHL","nnP8oFGzgp","t59lRJ2mQi","StlDJYOfrY","AmdQdBpYhV","o8UydHzZT8","zHF1qFVMxo","24ARFVNCPd",
+"POUYSMojnP","h1zcHG1RhS","iB08l7Ow5C","Ul4a1sx5Gl","CxVEfMezSW","0ao3lIRh48","45cIH0YAGH","RzaZAsx5Gl","EdBKc0PktI","m4bxUQClRL",
+"pmeCdyvOMI","oVQp6lXFOB","tl72WGXdoH","MmsIoxXTI4","Oz8yZoQ87r","64s8N3weIF","QClRLtuDyS","okgRifFDrJ","K20wKm4bxU","WPmlx3weIF",
+"BGaQYYw2oU","QnJ1SFGzgp","Ta8f6FLsph","TXQ0ZpAhR1","kZANm6AFT0","lCMxyC2Irc","FLsphogLgc","6AFT0hUTw7","MaJQszQt6Q","SbRYy2TRI7",
+"Mm8siVLTy6","Z4I1vnlaBy","5ZaEz0YAGH","POUYSFjHXR","MmsIo9XyT9","L7cGcs7Mxk","d7vjMoVQp6","rz7UtGSQwj","0YAGHNAFuw","8cVD3dhSuH",
+"i3pyd6AFT0","v8yFNNcICA","v1Hln6AFT0","he9IAZhwG1","xciqp64s8N","Ul4a1ZzJHW","taOXK9y4lw","LDk6fBpYhV","5nmWvfLNg8","Ss0ZuMGlTF",
+"cmXIXdQ586","48cHLMmsIo","8cVD3gdQsS","8xEKz9rlg9","t98iWHfyNQ","UlU3MRmDcr","AkKTk8cVD3","1v5hHlpF6W","RACujCqqaD","Kr8ysMaJQs",
+"W3VFH0Wr5y","hUTw77fsYM","jS1ajYh1hF","tAOsrBGaQY","LbRTHAIYUu","XyPZNjiVBP","QnJ1SvOqCE","JIqXiciuWz","DG4sTrz7Ut","pvgjSWPmlx",
+"Oz8yZkB5nP","jeskSMojnP","B3qem9y4lw","8RCUABCxeC","IRh48HP433","VjCZqlH1kt","t98iWa00b5","In3NSSmGzv","TwanoCfgr3","Q6LixIn3NS",
+"x3LDeSmGzv","AOgEeFcWrW","a00b5G1RhS","FxX9q0MR5X","bgJAzFcWrW","G1RhSiKqhr","vLsmSVerEA","0h1b1In3NS","uPX7G8cVD3","QbxXcrhl0J",
+"QbxXctaOXK","gtCA5M3zXL","EoToPb29RJ","uQIczGrDg7","QWxoTfFDrJ","7lUXZ9y4lw","SWfou7Ow5C","atef245cIH","HlUbFt98iW","7lUXZzHF1q",
+"HP4331v5hH","aL6AJuvf7A","WPmlxJ2mQi","FwEJzsoy9t","48cHLjtn0X","Kr8ysY1mC0","vOqCEECMvU","lsQGomz8gx","jeskSJ2mQi","14FLRlXFOB",
+"lkMUAb29RJ","JJs5m16lHc","lkMUAciuWz","IRh48uJScX","FLsphSs0Zu","JRJQBTCgPp","dQ586iqv4k","a00b5XyPZN","guMb8IKxdL","vLsmSQworu",
+"JRJQBUvlv4","rKDLJuJScX","8U2nUMezSW","AkKTknFqik","xXTI4SmGzv","yEfy9lViBv","16lHc24ARF","sqVrfWMiS3","vOqCENxx9V","hE1QlQChxs",
+"WaWsvbgJAz","QnJ1SReKEW","faHirVerEA","hYBCKdhSuH","pWiOsuoStw","FGzgp7hyVv","Ul4a1RkQke","TwanoLewvM","C2IrcWMiS3","Mm8sivkCHH",
+"HP433brhlQ","KsjRKdpe1v","WreyPFFDui","sx5GllsQGo","uN6r38FmFH","5VZjS5drc6","BGaQYJ2mQi","0BmCy8xEKz","QssNCrhl0J","yvOMI8U2nU",
+"Kr8ysGrDg7","dQ586uN6r3","IRh48ZJTXH","WmadAlH1kt","s93MlReKEW","POUYSFPfSE","tlILtuJScX","POUYSzQt6Q","KsjRKDQimp","Yf2Ecs4786",
+"AOgEeWPmlx","ZhwG1sx5Gl","In3NSLewvM","VjCZqMkgy8","F6PT2DLhzM","fcJOynlaBy","tvdkDJkzUn","t59lRFjHXR","0MR5XWmadA","Cfgr39iGoT",
+"Kr8ys2TRI7","MK07Y0Wr5y","WmadAgf8rI","fmIK19y4lw","FwEJzuZPqg","n8pJ9NAFuw","WPmlx64s8N","lH1ktUlU3M","DQimpzz4ZU","X6PindQ586",
+"J2mQidmoS7","VLTy645cIH","WaWsvNcICA","zHF1qCK5W7","RBhp00BmCy","h1zcHUmaEv","atef24QMc9","VLTy6a00b5","cShY2B3qem","qUJMdeuZA5",
+"Chuy3i7WMQ","VjCZqpAhR1","pT8wuRmDcr","v2eC3fcwDa","NAFuwRmDcr","0PktIhUTw7","P6bcgb29RJ","JkzUniqv4k","ZUnqt8RCUA","2hEEUuAWyp",
+"s4786GSQwj","X6Pin7fKYU","zqH0WlweGy","kB5nP618Di","HP433uoStw","BFkb8SWfou","WPmlxt59lR","s93Ml618Di","KZamHFNYIM","y94nwxciqp",
+"AkKTkTCgPp","h1zcHfLNg8","JIqXifcJOy","l83UdblLA9","16lHcUvlv4","ZUnqtfcJOy","okgRi45cIH","MmsIorhl0J","qUJMdVjCZq","MaJQshSSvQ",
+"tuDySBFkb8","LDk6fFPfSE","Y1mC0MGlTF","gdQsSd7vjM","sqVrf5IhmG","JJs5mFFDui","uN6r3rKDLJ","uTacxaL6AJ","Waim6WreyP","FFDuisx5Gl",
+"8cVD3QWxoT","tjQxsJkzUn","AIYUuAOgEe","Kr8ysyofH3","cmXIXMmsIo","0h1b1UmaEv","Cfgr3RpBQm","lXFOBXflUq","Zv7z0Twano","JXljWiwzGk",
+"EoToPrz7Ut","AOgEemX2GE","FhtglfLNg8","RpBQmHfyNQ","NhXdu8hJdt","lXFOBgtCA5","ZJTXHL7cGc","FcWrW7X3uy","SbRYyzY1GY","FVMxo4W0Tl",
+"QbxXcQWxoT","ni2v1ZUnqt","Ul4a1jeskS","jiVBPni2v1","SWfouuLtKs","B3qemSs0Zu","3otm6zz4ZU","lkMUAKASQ8","Yh1hFYOfrY","fqypyGXdoH",
+"Vprf2Qworu","WDVWJ2TRI7","azIWp2Nslm","Nxx9Vfqypy","No0QbbZLvS","8U2nUK20wK","O3iyQHRxd8","Yf2EcIKxdL","IBe8k14FLR","VjCZq0BmCy",
+"wiHrZyToGW","8xEKzcL0aE","soy9tiB08l","ZzJHWlkMUA","POUYSlsQGo","ix74rRpBQm","Uvlv4pFrrl","Mm8siM6qcG","jS1aja00b5","dhSuHSjskQ",
+"yluBx45cIH","RzaZAn1pmO","HfyNQpT8wu","RpBQm8U2nU","cL0aEZJTXH","n1pmOMGlTF","s4786NcICA","BCxeCFVMxo","fFDrJIRh48","FhtglBGaQY",
+"QClRLtlILt","zFgtBMojnP","xciqpa00b5","VLTy6dQ586","mX2GEFPfSE","oGu6xsx5Gl","lm0pDsuY4x","RsQUqFVMxo","0KyfsFPfSE","RzaZAiKqhr",
+"7lUXZNcICA","QChxsOHaBz","Cp3mZydG8U","oVQp6l83Ud","tlILt9rlg9","nnP8o1v5hH","y94nwVNCPd","1j5L8vkCHH","VBjhzYh1hF","DQimpzQt6Q",
+"t98iWoGu6x","pAhR1NAFuw","MezSWCdyBV","taOXKGWqqX","AgJHQpmeCd","MK07YpmeCd","gjUTuqUJMd","BpYhVyluBx","WaWsvd7vjM","rhl0JaDGtS",
+"2hEEUulk41","lkMUA0Wr5y","MK07YRmDcr","8RCUAuTacx","9XyT97fsYM","fmIK1gjUTu","1LB1LWaWsv","QssNC2ZHdk","HzZT82hEEU","WPmlxaL6AJ",
+"VIlwPBpYhV","xXTI4fqypy","Dz1R3oVQp6","RsQUq5drc6","Waim6P6bcg","pWiOsfLNg8","zbIYYfaHir","K4GS8DcpWB","tjQxsjSjS3","i3pydXflUq",
+"FwEJzECMvU","8hJdtuoStw","EoToPWmadA","5IhmGcQOnv","7lUXZ1LB1L","wDajXt98iW","3otm6Ul4a1","FFDui48cHL","NAFuwazIWp","WreyPfFDrJ",
+"W3VFHZzJHW","fcwDaWmadA","7lUXZlpF6W","2NslmK4GS8","DcpWBRBhp0","B3qemQbxXc","jtn0XSWfou","iqv4kO3iyQ","TwanoVjCZq","4dEz6EdBKc",
+"uQIczHzZT8","tl72WZuDtD","W3VFHbrhlQ","Z4I1vrKDLJ","euZA5X6Pin","TXQ0ZNhXdu","Zv7z0qaofN","Uvlv4uQIcz","ZUnqtZUnqt","uN6r3QChxs",
+"tAOsr0h1b1","b29RJkB5nP","9iGoTmz8gx","NOHszuPX7G","lViBvuN6r3","uAWypgjUTu","8RCUAydG8U","OUYuF7X3uy","1v5hHYf2Ec","rKDLJG1RhS",
+"zY1GYm4bxU","lCMxy6q6L9","ydG8U5Drn0","yofH3cQOnv","IKxdLFNYIM","QworuvLsmS","aez9ydjsrv","h1zcHdhSuH","Q6hMCd7vjM","rhl0JqUJMd",
+"i3pyd0ao3l","AXpwEBFkb8","Ss0ZuhE1Ql","Q6LixBbwgA","29QAzuN6r3","ZuDtD5Mg9r","No0QbDz1R3","oGu6xpiJSk","HRxd8suY4x","StlDJ0MR5X",
+"FVMxocShY2","oVQp6QnJ1S","dmoS71LB1L","iqv4k4W0Tl","4QMc9OxWIH","xReec7lUXZ","uZPqg5ZaEz","SbRYyl83Ud","AmdQdQnJ1S","2ZHdk5drc6",
+"i3pydFwEJz","kB5nPMm8si","fmIK1kB5nP","BFkb8brhlQ","FGzgppWiOs","P6bcgIn3NS","9XyT9xReec","AXpwENhXdu","NhXdu6q6L9","5drc63weIF",
+"kZANmCNHmv","pmeCd0MR5X","yofH3uLtKs","uJScXlm0pD","NAFuw580YD","yToGWvOqCE","48cHL6AFT0","TXQ0ZW7cTs","5VZjSM3zXL","QbxXcuLtKs",
+"45cIHpAhR1","45cIHt98iW","taOXKbrhlQ","0Wr5yyofH3","ECMvUP6bcg","QssNCBpYhV","9y4lwbZLvS","Vprf2zQt6Q","RACujQnJ1S","FjHXRSmGzv",
+"rz7UtZ4I1v","Twano48cHL","GSQwja00b5","8FmFHVjCZq","i3pydrKDLJ","uJScXGWqqX","prNT6v8yFN","l83Ud6AFT0","ZhwG18hJdt","Vprf2iB08l",
+"Cp3mZs7Mxk","yluBxJXljW","VjCZq580YD","F6PT2AIYUu","3otm6P6bcg","BGaQY7hyVv","5VZjS6AFT0","Pb1paqQxHP","Oz8yZStlDJ","5drc6FVMxo",
+"Y1mC0pmeCd","jzUqRGXdoH","blLA9yofH3","lj07QDz1R3","AOgEe2Yz7E","Vprf22DREs","D6rByni2v1","WmadAFPfSE","tlILtAIYUu","IBe8k7Ow5C",
+"IjTwPOz8yZ","7lUXZAmdQd","YOfrYiB08l","HlUbFsx5Gl","jfREuStlDJ","hYBCK9eoRc","lweGyjSjS3","sx5GlPOUYS","VIlwPZhwG1","Kr8ys5Mg9r",
+"h1zcHe6e4z","StlDJDQimp","iKqhrVjCZq","tuDySM6qcG","SbRYygdQsS","qaofNfFDrJ","jfREuMojnP","WDVWJtl72W","azIWpvLsmS","DLhzMhSSvQ",
+"lViBv6AFT0","0Kyfsgf8rI","AgJHQZJTXH","ru4UGjSjS3","suY4x0Wr5y","gIYvEDz1R3","lXFOBFVMxo","0MR5XzFgtB","lXFOBzz4ZU","MezSW5drc6",
+"5Mg9rfqypy","wiHrZlXFOB","hUTw7VjCZq","d7vjMoQ87r","7hyVvlkMUA","wiHrZOz8yZ","kB5nPuPX7G","F6PT29iGoT","sqVrfGXdoH","rz7Utuupzk",
+"ECMvUZhwG1","M6qcGn1pmO","sqVrf7hyVv","5Mg9rfFDrJ","nlaByDQimp","SbRYyLbRTH","Zv7z0POUYS","MojnPZv7z0","xReecJ2mQi","pv0i75nmWv",
+"QssNCVBjhz","POUYSsx5Gl","Ss0ZuuoStw","cQOnvHP433","Q6hMCL7cGc","9iGoTpFrrl","h1zcHMezSW","CIShGzqH0W","618Di2Yz7E","n1pmOZhwG1",
+"F6PT2Rxrsm","1v5hHZuDtD","07n1cIKxdL","ulk41Q6Lix","WDVWJK4GS8","M3zXLRkQke","hi5X7ksJby","24ARF0MR5X","POUYSQWxoT","dpe1vJIqXi",
+"5drc6uoStw","OUYuFrhl0J","GWqqX5Drn0","d85a90Kyfs","tl72WSjskQ","zmLYD2Nslm","CqqaDJ2mQi","QYxC0Dz1R3","9XyT9ZUnqt","FjHXRn8pJ9",
+"2Yz7EK4GS8","NOHszWaWsv","zz4ZUQ6hMC","8FmFHm4bxU","Oz8yZbZLvS","dQ586LDk6f","gdQsSuZPqg","QssNC6AFT0","QnJ1S0BmCy","Mkgy8Twano",
+"v2eC3FcWrW","ksJby4W0Tl","uoStwfcJOy","8TxD7NOHsz","1LB1L24ARF","aez9yMK07Y","K4GS8v1Hln","JJs5m8RCUA","oQ87rVLTy6","LewvMG1RhS",
+"9iGoTjfREu","b29RJFNYIM","DQimp0MR5X","fmIK1CxVEf","8xEKzcQOnv","uAWypyofH3","nFqikwDajX","n1pmOVNCPd","FFDui0Wr5y","0MR5XS77LH",
+"ogLgcOUYuF","pFrrlaDGtS","ni2v1wiHrZ","ni2v1HRxd8","7fsYMOUYuF","XflUqK4GS8","iB08lcmXIX","nFqikpAhR1","XyPZNFGzgp","d85a99iGoT",
+"5Drn0dQ586","XyPZN0h1b1","t59lRJJs5m","9iGoTmX2GE","1j5L8XflUq","BGaQYuQIcz","M6qcGhUTw7","bgJAzMaJQs","7Ow5C5Drn0","BFkb8GrDg7",
+"xciqpMGlTF","BFkb8Kr8ys","LDk6fSs0Zu","GXdoHi7WMQ","5Drn0zqH0W","iKqhrG1RhS","16lHcaL6AJ","G1RhSThjNn","7fKYUuZPqg","zQt6QEoToP",
+"BGaQYHfyNQ","tlILtFcWrW","HfyNQrz7Ut","FwEJzt59lR","Q6hMCpFrrl","Ul4a1euZA5","h1zcHVBjhz","uoStwVjCZq","5iGN56AFT0","RmDcrtaOXK",
+"S77LH8U2nU","hYBCKuvf7A","Kr8yss93Ml","9XyT9AmdQd","Z4I1v4dEz6","QClRLk85Ae","Mkgy8zz4ZU","64s8N2Nslm","6AFT0lsQGo","soy9tCp3mZ",
+"atef2WMiS3","tlILtcShY2","0h1b13otm6","wiHrZJkzUn","vkCHHlViBv","4W0TlFNYIM","lsQGouQIcz","MGlTFni2v1","KASQ8UmaEv","FPfSEFcWrW",
+"618DizFgtB","euZA5xXTI4","07n1cGSQwj","HRxd8C2Irc","FcWrW7hyVv","7fsYMZzJHW","P6bcguQIcz","uTacx5nmWv","8xEKzjSjS3","l83Ud24ARF",
+"U3yw5W3VFH","tjQxsQYxC0","NhXdu5drc6","5IhmGyToGW","xReecaDGtS","AkKTkWMiS3","ciuWzuAWyp","GSQwjcQOnv","AXpwEyvOMI","ogLgcyofH3",
+"2ZHdkZJTXH","gdQsSZ4I1v","fqypyhi5X7","iqv4kQnJ1S","K4GS8JKWYR","2Yz7EFxX9q","ni2v1uPX7G","v2eC3JkzUn","jS1ajRpBQm","CdyBVFnPFB",
+"cShY2zz4ZU","TCgPpgtCA5","mX2GEtl72W","DG4sTsoy9t","AXpwE8FmFH","Mm8sigjUTu","P6bcgHzZT8","SWfou5Drn0","FVMxoxciqp","StlDJ9y4lw",
+"ydG8UgdQsS","ThjNnciuWz","RpBQmI7p2a","UlU3MPYBf4","OUYuFBbwgA","rz7UtKsjRK","7ku1p1v5hH","xReecyluBx","AkKTkSs0Zu","I7p2aOUYuF",
+"24ARFlj07Q","hYBCKSmGzv","tAOsrVLTy6","JJs5mMkgy8","C2IrcReKEW","MK07YiB08l","DQimpCIShG","lXFOBNxx9V","HfyNQFVMxo","k85AecQOnv",
+"lm0pDIjTwP","aez9y16lHc","EOE1oiB08l","y94nwS2Dfu","vkCHHB3qem","pWiOsWaim6","55rfBFxX9q","5Mg9rpv0i7","Z4I1vuPX7G","ZhwG1pT8wu",
+"9XyT97hyVv","okgRiGXdoH","gjUTuuAWyp","24ARFnnP8o","djsrvU3yw5","DLhzMd85a9","HzZT8he9IA","5nmWvCfgr3","i7WMQfqypy","aFFssEOE1o",
+"fFDrJVBjhz","3weIFIKxdL","t98iWVNCPd","BbwgASmGzv","EdBKcFcWrW","uupzkGv3Fq","RpBQmMmKGJ","Q6hMCoGu6x","piJSkDG4sT","GWqqXzY1GY",
+"JkzUnuQIcz","X6Pinulk41","ydG8U7fKYU","9GXkXRkQke","uoStwVLTy6","ru4UGru4UG","2TRI7prNT6","pmeCdh1zcH","Qworu8xEKz","FVMxol83Ud",
+"uZPqgIKxdL","uQIczxXTI4","8hJdtiqv4k","5IhmGNOHsz","FwEJzSjskQ","lm0pDjtn0X","7fKYUzHF1q","yEfy9v2eC3","2TRI7fFDrJ","BFkb8LDk6f",
+"7lUXZd85a9","CNHmvoGu6x","WDVWJzqH0W","lm0pDFhtgl","QssNCh1zcH","bZLvS48cHL","lCMxynFqik","Nxx9V8RCUA","lH1ktGWqqX","uN6r3Qworu",
+"mz8gxydG8U","K20wKCfgr3","C2IrcIBe8k","uoStwgdQsS","RACujtvdkD","4QMc9tuDyS","i3pydRzaZA","CK5W7QClRL","FwEJzydG8U","16lHcZJTXH",
+"yluBxGrDg7","iKqhr2Nslm","QssNCv2eC3","cShY2pT8wu","QClRLzbIYY","yofH3S77LH","zz4ZUgdQsS","zmLYDBGaQY","W3VFHfqypy","gtCA5WDVWJ",
+"GXdoHYw2oU","euZA5s7Mxk","NAFuwzqH0W","mX2GECK5W7","bZLvSrKDLJ","Rxrsmhi5X7","Q6hMCuN6r3","b29RJZv7z0","uvf7ATXQ0Z","SjskQxciqp",
+"O3iyQDG4sT","QssNC14FLR","nFqikFwEJz","M3zXLlH1kt","5ZaEzy94nw","ni2v1aL6AJ","LDk6fNcICA","hE1QlgtCA5","RpBQmYh1hF","3otm6qQxHP",
+"ZuDtD9GXkX","tAOsr55rfB","7Ow5Ci3pyd","8xEKzv1Hln","618DijSjS3","lweGyRpBQm","5IhmGP6bcg","7fsYM3otm6","AmdQd6AFT0","DcpWBXflUq",
+"pvgjSZzJHW","D6rByd7vjM","qaofNPYBf4","uQIczEdBKc","OUqFMogLgc","AOgEe0PktI","tAOsrFVMxo","14FLRi7WMQ","lm0pDhYBCK","fmIK1aFFss",
+"7fsYMprNT6","07n1cYh1hF","BFkb8JIqXi","iqv4kwDajX","pFrrl3otm6","SbRYyPb1pa","t59lRJKWYR","rhl0JbrhlQ","e6e4z16lHc","tl72WsuY4x",
+"zY1GYyvOMI","48cHLGSQwj","Yh1hFIKxdL","xXTI4rKDLJ","DLhzMF6PT2","WmadAiqv4k","L7cGcuoStw","CdyBVIBe8k","TXQ0Z0Wr5y","KASQ8Dz1R3",
+"LbRTHlweGy","VNCPd618Di","HRxd8ZhwG1","NhXduyToGW","U3yw55nmWv","Cp3mZlXFOB","jtn0XStlDJ","CdyBVQbxXc","y94nwpWiOs","kB5nPprNT6",
+"M6qcGatef2","EOE1oatef2","v2eC32Yz7E","uAWyp9y4lw","2Nslm8TxD7","lweGyd7vjM","WmadARzaZA","BFkb8TCgPp","Ta8f6VIlwP","9rlg9t98iW",
+"HlUbFNcICA","Vprf2618Di","CIShGciuWz","JXljWxReec","okgRiwDajX","F6PT2lH1kt","fcJOyYh1hF","uQIczLewvM","CNHmvCqqaD","uN6r3s93Ml",
+"rhl0J55rfB","GWqqXJkzUn","y94nw7hyVv","7Ow5CIn3NS","VIlwPVjCZq","SbRYyD6rBy","hUTw7t59lR","iqv4kTwano","BpYhVzHF1q","bZLvSO3iyQ",
+"SmGzvt59lR","uAWyplj07Q","WmadAAIYUu","a00b5jeskS","Mkgy8GXdoH","oVQp6sqVrf","AIYUutvdkD","SbRYy8TxD7","9GXkX3otm6","ni2v1HzZT8",
+"lkMUASs0Zu","CK5W78FmFH","QClRLxciqp","hYBCKpiJSk","QClRLuJScX","FxX9qJJs5m","OUYuFpWiOs","0BmCy580YD","JXljWLewvM","RmDcrPb1pa",
+"fFDrJazIWp","XyPZNLbRTH","FwEJzZuDtD","uTacxhE1Ql","HP433cmXIX","JkzUnJkzUn","tvdkD1LB1L","FNYIMblLA9","a00b51v5hH","VBjhzbZLvS",
+"ZhwG1K20wK","piJSkJIqXi","atef2iwzGk","xciqp4QMc9","MezSWWPmlx","tAOsr2DREs","8RCUAuoStw","djsrvtl72W","zz4ZUFxX9q","KsjRKfFDrJ",
+"mz8gxZJTXH","8xEKzfcwDa","fcwDaBGaQY","TXQ0ZUlU3M","zY1GYuJScX","fqypygf8rI","8xEKz14FLR","d7vjMiwzGk","DLhzMMGlTF","lXFOBsoy9t",
+"7Ow5CqQxHP","F6PT26q6L9","e6e4zo8Uyd","yEfy99eoRc","uN6r3QClRL","v1HlndmoS7","iqv4kJRJQB","Cp3mZWreyP","rz7Ut1j5L8","MaJQs64s8N",
+"uupzkZUnqt","ydG8U2Nslm","lXFOBNAFuw","TXQ0ZRsQUq","jS1ajnFqik","9eoRcyToGW","vLsmS8TxD7","07n1cqUJMd","9y4lwWaim6","29QAz5Mg9r",
+"Yw2oUJRJQB","oQ87rVjCZq","tuDyS8RCUA","xciqpo8Uyd","XyPZNVNCPd","ZzJHWMojnP","ZUnqtUlU3M","CIShG6q6L9","pFrrld85a9","a00b5jSjS3",
+"9GXkXrhl0J","wiHrZfFDrJ","5Drn0IBe8k","he9IAVIlwP","AkKTkMm8si","VIlwPBbwgA","S2Dfu9eoRc","aL6AJuLtKs","uTacxFNYIM","x3LDeni2v1",
+"Vprf2Ta8f6","UmaEvL7cGc","QChxsyluBx","hSSvQdmoS7","8hJdtt98iW","S77LHOUYuF","JRJQB0BmCy","MGlTFVLTy6","MmKGJDLhzM","d85a9gjUTu",
+"5Drn0P6bcg","sx5Glmz8gx","6q6L9zmLYD","Kr8ysOUqFM","FFDuiFFDui","uoStwVBjhz","LDk6fix74r","2Nslm14FLR","zqH0Wx3LDe","VjCZqfmIK1",
+"MaJQsSs0Zu","CNHmvix74r","Ta8f6RzaZA","BbwgA8xEKz","jtn0XuZPqg","NhXdufqypy","IKxdLaDGtS","5drc6GSQwj","OxWIHuupzk","Cp3mZhYBCK",
+"0KyfsWreyP","ZzJHWuZPqg","pv0i7xciqp","Q6LixtvdkD","Ul4a1x3LDe","uAWyp9GXkX","fqypyUmaEv","LDk6fwDajX","D6rBy618Di","RzaZACp3mZ",
+"IRh48OxWIH","wiHrZiKqhr","euZA52Yz7E","5ZaEzQnJ1S","cL0aE7hyVv","aL6AJRACuj","taOXKDcpWB","2hEEUZzJHW","aFFssM3zXL","VBjhz580YD",
+"pFrrlyToGW","J2mQiuupzk","pT8wuAgJHQ","uoStwhe9IA","EoToPguMb8","CqqaDpvgjS","VjCZqulk41","CNHmvfmIK1","AXpwEfaHir","ZzJHWOz8yZ",
+"BCxeC3weIF","sx5Gl9GXkX","Vprf2TXQ0Z","FwEJztlILt","Q6hMCSjskQ","VLTy6BpYhV","9rlg9BbwgA","PYBf4zz4ZU","zHF1q2Yz7E","kZANmuPX7G",
+"xciqpix74r","y94nwPYBf4","7lUXZLewvM","bgJAz45cIH","s7MxkhYBCK","jS1ajgjUTu","oGu6xNcICA","vLsmSpiJSk","lViBvCfgr3","blLA91LB1L",
+"yToGWgf8rI","CIShGhE1Ql","GSQwjCxVEf","0h1b1OxWIH","bZLvSTXQ0Z","ThjNn7ku1p","AOgEe3weIF","v8yFN8TxD7","QssNCRkQke","tvdkDuupzk",
+"yofH3TXQ0Z","vkCHH0ao3l","lsQGoBCxeC","AmdQdTwano","jSjS3W3VFH","OxWIHY1mC0","7fsYMfaHir","jfREuv1Hln","SjskQPOUYS","jtn0XyEfy9",
+"RpBQmBGaQY","uupzk5drc6","ReKEWhYBCK","RpBQmGWqqX","prNT6sqVrf","D6rBy8TxD7","tuDySTXQ0Z","0PktIaDGtS","4W0TljS1aj","lCMxytlILt",
+"55rfBWDVWJ","pAhR1XyPZN","2Yz7ErKDLJ","BGaQY4dEz6","OUqFMaFFss","ReKEWCNHmv","8xEKz16lHc","tlILtGWqqX","bZLvS7hyVv","UmaEvFGzgp",
+"EdBKciqv4k","l83Udd7vjM","CqqaDydG8U","0PktIQbxXc","W7cTs0ao3l","StlDJtvdkD","WaWsv0Kyfs","C2IrcIjTwP","hUTw7Ta8f6","MmsIolXFOB",
+"XyPZNDcpWB","2Yz7EtAOsr","7X3uysx5Gl","RACujO3iyQ","hYBCK6AFT0","m4bxUlm0pD","RxrsmnlaBy","jSjS3MaJQs","v8yFNHzZT8","J2mQiVLTy6",
+"BbwgAZuDtD","IjTwPpAhR1","Chuy3v2eC3","ZJTXHOHaBz","fLNg8tl72W","5ZaEzQbxXc","JIqXiWPmlx","gdQsSpAhR1","Uvlv4W7cTs","NAFuwtAOsr",
+"QWxoTPOUYS","uQIczDz1R3","DLhzMIjTwP","taOXKQworu","fcwDapv0i7","uupzkhi5X7","NOHszrKDLJ","RACujFnPFB","rKDLJAXpwE","hSSvQYjB9t",
+"azIWpSjskQ","ulk41AXpwE","soy9t0BmCy","Yf2EcZJTXH","ReKEWP6bcg","JXljW5IhmG","GrDg7t59lR","fLNg8zQt6Q","0BmCynlaBy","SWfouFVMxo",
+"IRh48zFgtB","VerEAuAWyp","vLsmSK4GS8","J2mQirz7Ut","fLNg8ZzJHW","Yw2oULbRTH","OUYuFNhXdu","NhXduBGaQY","zmLYDtAOsr","uQIczlCMxy",
+"0BmCyNxx9V","1j5L8tjQxs","lsQGoAIYUu","pWiOsGrDg7","FFDuiGXdoH","UmaEvzFgtB","OHaBzLewvM","ReKEWgf8rI","Ul4a1IjTwP","5ZaEzfaHir",
+"O3iyQ3otm6","i3pyd5Namm","45cIHCK5W7","kZANm5iGN5","ZJTXHvOqCE","pWiOsI7p2a","2ZHdkfqypy","ReKEW8U2nU","X6PiniB08l","QYxC0QChxs",
+"rz7Utv8yFN","uAWypCxVEf","fmIK1lCMxy","iKqhr9y4lw","uvf7A0YAGH","zqH0WyofH3","KZamHU3yw5","KsjRKtAOsr","M6qcGHzZT8","hUTw7UmaEv",
+"CxVEfv1Hln","AOgEeS2Dfu","v8yFN7fsYM","580YDFVMxo","hi5X7ciuWz","nlaByJKWYR","Pb1paAOgEe","pWiOsjiVBP","ciuWz24ARF","lViBvRxrsm",
+"ZuDtDGrDg7","dmoS76AFT0","BbwgAjSjS3","qUJMdqQxHP","48cHLa00b5","pvgjSMGlTF","OHaBzb29RJ","SWfou0MR5X","XyPZN6q6L9","prNT6Ul4a1",
+"Dz1R3BCxeC","MK07YhE1Ql","Mkgy8RBhp0","Z4I1vpv0i7","8cVD3n8pJ9","DcpWB5Mg9r","EoToPQYxC0","tlILt64s8N","nFqikX6Pin","AOgEepvgjS",
+"7lUXZAIYUu","No0QbBCxeC","ThjNn29QAz","IjTwP6AFT0","aDGtSdQ586","FjHXRuZPqg","BGaQYhE1Ql","Yw2oUZJTXH","8cVD3i3pyd","uQIczB3qem",
+"Chuy3FNYIM","uoStwjeskS","FNYIMVBjhz","uN6r3gtCA5","soy9t0Kyfs","QWxoTReKEW","dpe1vtuDyS","zmLYDfLNg8","rhl0JWaWsv","NhXduVprf2",
+"3weIFMK07Y","Yf2Ecl83Ud","JkzUnRBhp0","VNCPdLDk6f","Mm8siPOUYS","oVQp65Namm","s47867fKYU","ECMvUa00b5","zHF1q24ARF","iqv4kYjB9t",
+"s478645cIH","Kr8ysUlU3M","JRJQBgjUTu","BFkb85Drn0","faHirtjQxs","zz4ZUVprf2","pFrrl2Nslm","Twanolm0pD","d7vjMU3yw5","HzZT8l83Ud",
+"yofH3LDk6f","MmsIoDz1R3","C2IrcpvgjS","VBjhzuAWyp","piJSkFnPFB","pT8wu7lUXZ","UlU3MRsQUq","cL0aE2DREs","QnJ1Srhl0J","Yh1hFL7cGc",
+"L7cGcWDVWJ","5Namm9iGoT","tAOsrn8pJ9","AgJHQ8cVD3","ni2v1Yf2Ec","blLA9gjUTu","BbwgA8FmFH","Cfgr3cmXIX","JkzUnuoStw","rhl0Js7Mxk",
+"55rfBnlaBy","hE1Ql8FmFH","iqv4kuAWyp","5drc6s4786","CxVEfNhXdu","zHF1qt98iW","hE1Qlrhl0J","lweGyM6qcG","tlILtKsjRK","lm0pD5iGN5",
+"v2eC3KASQ8","VNCPdoQ87r","O3iyQ580YD","OUqFMi3pyd","s4786cmXIX","U3yw5MezSW","pmeCdatef2","580YDokgRi","S77LHBpYhV","1LB1LvLsmS",
+"FjHXRcShY2","gjUTuuPX7G","xciqpJ2mQi","tAOsrFPfSE","Nxx9VChuy3","In3NSDG4sT","OUqFMD6rBy","5Drn07lUXZ","NOHszdjsrv","prNT6uAWyp",
+"qaofNdjsrv","5VZjSFxX9q","F6PT28U2nU","t59lRd85a9","FjHXR45cIH","tl72W8U2nU","dpe1vRmDcr","tlILtWDVWJ","brhlQtAOsr","Yh1hFCdyBV",
+"jeskSNxx9V","M6qcGKASQ8","5iGN5Y1mC0","o8Uyd8xEKz","XflUquTacx","BpYhVa00b5","0KyfsuJScX","hi5X7XflUq","ECMvUUlU3M","I7p2aFLsph",
+"Y1mC0QYxC0","kZANmlm0pD","RmDcrZJTXH","CxVEfb29RJ","RBhp0pmeCd","2hEEUxXTI4","he9IAuJScX","Qworus93Ml","CK5W7lsQGo","0MR5XiwzGk",
+"wiHrZNxx9V","t98iWRkQke","dQ586k85Ae","RACujRBhp0","uupzk6AFT0","HzZT807n1c","yvOMIWaWsv","s7MxkZzJHW","RACujdmoS7","AOgEeRsQUq",
+"POUYSoVQp6","07n1cS2Dfu","lpF6WhUTw7","Cfgr3VBjhz","OHaBzJkzUn","t98iWNcICA","64s8NtvdkD","0h1b18TxD7","X6PinuTacx","BbwgAfaHir",
+"Chuy3aL6AJ","HlUbFCK5W7","JkzUnCK5W7","Q6Lix0Wr5y","oVQp6FnPFB","ydG8UDz1R3","sqVrfjS1aj","VBjhzokgRi","dpe1v8hJdt","No0QbRkQke",
+"tuDyS2hEEU","RACujjtn0X","m4bxUulk41","jzUqRjzUqR","ZuDtDpvgjS","YOfrYCp3mZ","xReecFFDui","ogLgcaDGtS","W3VFHUlU3M","HRxd8oGu6x",
+"TwanoIjTwP","oGu6xRpBQm","yofH3Yf2Ec","U3yw5ru4UG","5IhmG580YD","Yh1hFcShY2","v2eC3aFFss","ksJby0MR5X","gf8rIGXdoH","ogLgcxReec",
+"euZA5FwEJz","lsQGoFnPFB","VIlwPWmadA","ReKEW7fKYU","BFkb8a00b5","6q6L9nlaBy","RsQUqlm0pD","ksJbyP6bcg","StlDJdhSuH","7fsYMhUTw7",
+"euZA5AmdQd","VjCZq618Di","gjUTulm0pD","ydG8UVNCPd","gjUTuPb1pa","BCxeCkB5nP","EOE1oyToGW","4W0TlWreyP","5Mg9rRACuj","0YAGHWaWsv",
+"EOE1oCp3mZ","1LB1LtuDyS","9rlg9qaofN","RsQUq618Di","zY1GYJRJQB","t59lRQWxoT","RsQUqRkQke","Ss0ZuCfgr3","AIYUuBpYhV","2hEEUJJs5m",
+"xciqpzbIYY","MmsIoJkzUn","RpBQmeuZA5","Yh1hFyluBx","YOfrYatef2","X6PinRzaZA","NAFuwTCgPp","fLNg85nmWv","GSQwjRkQke","7ku1pyvOMI",
+"14FLRJIqXi","4dEz6FPfSE","GWqqXVjCZq","Z4I1vTwano","Chuy3ZzJHW","AIYUu8cVD3","tjQxscmXIX","gjUTuWMiS3","StlDJNhXdu","iwzGkjtn0X",
+"Yh1hFThjNn","TCgPp580YD","SmGzvQ6hMC","JJs5mOUqFM","TCgPpKASQ8","FnPFB580YD","Mkgy8580YD","lH1kttaOXK","FLsphC2Irc","7ku1pNxx9V",
+"ulk412TRI7","jzUqRpvgjS","WmadAciuWz","fmIK1HlUbF","NhXdu9XyT9","MojnP0h1b1","QClRL0Wr5y","Y1mC05VZjS","ECMvUix74r","B3qemFhtgl",
+"oVQp6fFDrJ","RACujuvf7A","jtn0XaFFss","x3LDeFGzgp","wDajXZ4I1v","tuDySDG4sT","GSQwjQYxC0","AIYUus7Mxk","gjUTuFGzgp","No0QbYOfrY",
+"8FmFHK20wK","uQIczYf2Ec","7fsYMWmadA","rhl0J5ZaEz","RACujRsQUq","ksJbyzY1GY","KASQ8pT8wu","lkMUA55rfB","iqv4k9eoRc","sx5Gl6q6L9",
+"MK07Yxciqp","P6bcgFhtgl","uPX7GiB08l","G1RhSguMb8","MmKGJuJScX","9y4lwk85Ae","zHF1qM3zXL","45cIHd85a9","zqH0WFFDui","24ARFD6rBy",
+"DLhzMrz7Ut","jzUqRX6Pin","ZuDtDMmsIo","VIlwPFPfSE","Q6hMCP6bcg","sqVrfWPmlx","lkMUAdpe1v","IjTwPiqv4k","m4bxUcShY2","AmdQd9XyT9",
+"Cfgr3M3zXL","tvdkDNAFuw","8FmFHBbwgA","QnJ1Sn8pJ9","Mkgy8uupzk","24ARFfcJOy","DLhzMD6rBy","FFDuim4bxU","DG4sTQbxXc","UlU3MGv3Fq",
+"TCgPpnnP8o","Q6Lix9iGoT","taOXKNOHsz","d85a9yvOMI","HlUbFJRJQB","s4786Q6Lix","SjskQMojnP","ulk41BFkb8","QbxXclCMxy","CK5W7EOE1o",
+"lXFOBvkCHH","NAFuwsx5Gl","tjQxs1LB1L","IjTwPThjNn","nlaByl83Ud","X6PinJKWYR","JXljWIBe8k","rKDLJU3yw5","yToGWa00b5","5VZjSs7Mxk",
+"i3pyduTacx","Kr8ysMmKGJ","0Kyfshi5X7","07n1c8U2nU","piJSklpF6W","djsrv5drc6","iKqhrqUJMd","WDVWJJkzUn","t59lRfFDrJ","s47865Drn0",
+"cL0aEReKEW","jSjS3lpF6W","IBe8kVprf2","2TRI7StlDJ","FwEJzDLhzM","618DiyvOMI","rz7Uti7WMQ","Q6Lixru4UG","IKxdLCfgr3","yvOMIDG4sT",
+"VerEAIRh48","DG4sTDLhzM","vLsmSzqH0W","BpYhV6AFT0","4dEz6WMiS3","k85AeKsjRK","fqypyyEfy9","Nxx9VprNT6","JKWYR7fsYM","JXljWrhl0J",
+"zFgtBzqH0W","uLtKsOUqFM","FjHXRguMb8","8cVD3Q6Lix","ogLgcVIlwP","P6bcgReKEW","Dz1R3wDajX","MezSWaDGtS","16lHcmz8gx","ogLgcKZamH",
+"HP433yofH3","B3qem5IhmG","0KyfsVNCPd","CxVEf8RCUA","bZLvSBbwgA","sqVrf5nmWv","ni2v10PktI","AgJHQD6rBy","okgRiuupzk","mX2GEqQxHP",
+"t59lRtAOsr","lsQGoDG4sT","CdyBVTXQ0Z","lViBvm4bxU","I7p2agIYvE","lj07Qhi5X7","ECMvUvOqCE","lm0pDt98iW","XyPZNa00b5","zz4ZUuJScX",
+"aez9yRzaZA","M6qcGFhtgl","wiHrZJXljW","WmadAuJScX","x3LDeFhtgl","ZzJHWk85Ae","yEfy9faHir","UlU3MS77LH","2Yz7EUmaEv","o8UydyofH3",
+"GrDg7soy9t","5drc6UlU3M","WaWsvQClRL","Gv3FqChuy3","YOfrY2Yz7E","ru4UGCxVEf","lkMUA5Drn0","HzZT8Nxx9V","gIYvERpBQm","taOXKhe9IA",
+"y94nw7Ow5C","aez9ypmeCd","gjUTuhUTw7","NhXduDG4sT","Yw2oUzqH0W","No0QbpiJSk","S2DfuyToGW","jeskS9y4lw","pWiOs6AFT0","s7Mxk4dEz6",
+"Ss0ZubZLvS","FxX9qSjskQ","48cHLFcWrW","zQt6QiB08l","QYxC0lH1kt","wDajXD6rBy","55rfBxXTI4","qUJMduoStw","7X3uys4786","tuDySrhl0J",
+"e6e4zlCMxy","RBhp0QbxXc","pv0i7pT8wu","aL6AJ5Namm","dpe1vO3iyQ","AmdQdDcpWB","LewvMn1pmO","vLsmSYjB9t","fcJOyCfgr3","faHirpT8wu",
+"n8pJ9W3VFH","y94nwNxx9V","7fKYUix74r","BFkb88RCUA","vkCHHECMvU","euZA5DcpWB","Chuy3sqVrf","CdyBVVBjhz","24ARFtuDyS","soy9tL7cGc",
+"uJScXEdBKc","9eoRcHRxd8","bZLvSd85a9","0YAGHvkCHH","tl72WM6qcG","RkQkeEOE1o","ZhwG1PYBf4","RBhp0Qworu","FhtglhUTw7","WmadA5ZaEz",
+"vLsmSSjskQ","lsQGo45cIH","v8yFNrKDLJ","QClRL5Drn0","YjB9tb29RJ","bgJAzUl4a1","ZuDtDIjTwP","QClRLfLNg8","mz8gxMkgy8","MmsIoAgJHQ",
+"LDk6fs4786","gIYvE5drc6","CxVEfQ6Lix","SjskQCdyBV","zmLYDeuZA5","ReKEWM3zXL","tuDySydG8U","Ul4a1i7WMQ","cQOnv7X3uy","zY1GYRmDcr",
+"ydG8UHzZT8","Mm8siTXQ0Z","atef2tl72W","VerEAFcWrW","v8yFNJJs5m","iwzGkyvOMI","NAFuwtlILt","0Kyfsni2v1","Y1mC08U2nU","lCMxylj07Q",
+"Cfgr324ARF","7Ow5Cm4bxU","cmXIX5nmWv","XyPZNTCgPp","5VZjSfcwDa","iwzGkfFDrJ","3otm6MmsIo","rhl0Jb29RJ","2Nslm8FmFH","hi5X7Yh1hF",
+"1v5hHydG8U","CxVEfbgJAz","LDk6fpv0i7","ciuWzprNT6","FxX9qFhtgl","QWxoTLDk6f","FhtglnlaBy","Ul4a1Mkgy8","O3iyQyEfy9","Yh1hFJXljW",
+"U3yw5fcwDa","0MR5XSbRYy","FLsphGrDg7","zFgtBRxrsm","5ZaEzLDk6f","7lUXZMkgy8","MGlTFzHF1q","L7cGcfLNg8","qQxHPMmsIo","tjQxs55rfB",
+"MojnPZJTXH","VLTy655rfB","bZLvSDz1R3","FcWrWMm8si","EdBKcVNCPd","HlUbFPOUYS","SjskQLbRTH","zQt6QDcpWB","UmaEvdhSuH","t98iWuQIcz",
+"0h1b1SbRYy","he9IA1j5L8","G1RhSHzZT8","wDajXzmLYD","WDVWJ7ku1p","16lHcdmoS7","U3yw5rhl0J","AIYUuK4GS8","7ku1pECMvU","ThjNnix74r",
+"MaJQsWaWsv","FFDuizz4ZU","FwEJzMaJQs","iqv4kS2Dfu","IjTwPSmGzv","taOXK8RCUA","D6rByU3yw5","2ZHdkQssNC","iqv4k3weIF","Ul4a13weIF",
+"M6qcGzqH0W","hYBCKlm0pD","5nmWvy94nw","Mm8siOxWIH","55rfBoVQp6","DcpWBYf2Ec","VNCPd0PktI","Ta8f68RCUA","PYBf445cIH","guMb8dpe1v",
+"v1HlnGSQwj","580YD8TxD7","lkMUAiB08l","YjB9tx3LDe","KZamHGSQwj","dQ586FFDui","QYxC0FVMxo","i7WMQlpF6W","lH1ktRkQke","aFFssSs0Zu",
+"qaofN5Drn0","EoToP29QAz","tuDySHfyNQ","GWqqXbZLvS","4QMc9VerEA","29QAzBpYhV","gf8rIlpF6W","DQimpsuY4x","1v5hHCNHmv","9XyT9Yh1hF",
+"RBhp0MGlTF","fqypyCfgr3","djsrv7fsYM","7hyVvDz1R3","yofH3MmKGJ","Mm8siIKxdL","UmaEveuZA5","2ZHdkMmKGJ","MaJQsMGlTF","Yf2EcL7cGc",
+"bgJAzS77LH","jfREugf8rI","LewvMVLTy6","FnPFBv2eC3","Mkgy8VLTy6","ciuWzWPmlx","WMiS3ru4UG","I7p2aWaim6","D6rBylpF6W","ogLgcZ4I1v",
+"Vprf2mX2GE","jS1ajlXFOB","o8UydQClRL","2hEEUsuY4x","cmXIXuvf7A","iwzGkFLsph","LDk6fOxWIH","lweGyh1zcH","RsQUq6q6L9","a00b5s7Mxk",
+"NhXduCIShG","TCgPpXflUq","uN6r3XflUq","MojnPDQimp","blLA9lH1kt","JJs5mfqypy","VLTy6BGaQY","ECMvUgf8rI","RkQkeZv7z0","hSSvQtuDyS",
+"ni2v1nlaBy","FhtglhSSvQ","guMb8pT8wu","ogLgcL7cGc","D6rByx3LDe","m4bxUB3qem","9iGoTuQIcz","vkCHHF6PT2","QnJ1SECMvU","7Ow5C8RCUA",
+"k85AeL7cGc","gf8rIl83Ud","gdQsSfFDrJ","8RCUAgjUTu","55rfB1LB1L","SjskQnFqik","1LB1LW7cTs","uZPqgkZANm","CdyBV45cIH","2TRI7i3pyd",
+"GrDg7RBhp0","tuDySdpe1v","NAFuwlCMxy","ydG8UzqH0W","zbIYYIBe8k","brhlQzbIYY","tuDyS29QAz","uPX7GqUJMd","16lHcMmsIo","8hJdtOz8yZ",
+"fcJOyJKWYR","K4GS8J2mQi","3weIFuN6r3","n8pJ9guMb8","TCgPpqQxHP","dhSuHBbwgA","VerEAe6e4z","WreyP9GXkX","FhtglRzaZA","RzaZAIKxdL",
+"I7p2a9XyT9","MojnPFwEJz","s7Mxkru4UG","gf8rIU3yw5","pvgjSIRh48","O3iyQguMb8","ZUnqtVLTy6","WPmlx2ZHdk","uAWypRsQUq","I7p2aAIYUu",
+"lm0pDKASQ8","GWqqX618Di","v1Hlno8Uyd","MGlTFjiVBP","lViBvaDGtS","ciuWz6AFT0","MaJQsatef2","24ARFSWfou","d7vjM5iGN5","Pb1pa14FLR",
+"gtCA5jS1aj","RACujZv7z0","rz7UtjS1aj","tjQxsiB08l","i7WMQguMb8","gdQsSCIShG","aL6AJAOgEe","5drc6e6e4z","0KyfsTwano","Yh1hFOz8yZ",
+"lj07Q0YAGH","hUTw7cQOnv","Waim67fsYM","ydG8UYh1hF","16lHczY1GY","rhl0J5IhmG","Chuy3IRh48","s7MxkVjCZq","qaofNZUnqt","Cp3mZlm0pD",
+"MojnPGWqqX","GSQwjdhSuH","guMb8FnPFB","QChxsOUqFM","B3qemuTacx","dQ586xciqp","OHaBzZJTXH","LDk6fUvlv4","sqVrf2DREs","fLNg85Namm",
+"qUJMdlCMxy","yofH3QClRL","SbRYy1j5L8","aL6AJ2ZHdk","uPX7GFjHXR","Y1mC0OUqFM","Q6Lix55rfB","hE1QltAOsr","TXQ0ZYw2oU","5IhmGwDajX",
+"dhSuHogLgc","VBjhz14FLR","IjTwPGrDg7","U3yw5nlaBy","9XyT9azIWp","8TxD7KASQ8","5nmWvNcICA","tuDySaFFss","8hJdtWMiS3","J2mQigtCA5",
+"TCgPp7fKYU","zqH0Wv1Hln","uZPqgzbIYY","aDGtSFPfSE","atef2yofH3","QWxoTK4GS8","CqqaD7X3uy","AXpwEgtCA5","cmXIXpiJSk","Waim6580YD",
+"0BmCytvdkD","JKWYRDz1R3","OxWIHjeskS","7ku1pMojnP","0h1b1AXpwE","FxX9qhSSvQ","cQOnvHRxd8","MaJQsB3qem","bgJAzYjB9t","NhXdulsQGo",
+"RzaZADcpWB","KZamHJkzUn","dpe1vXyPZN","CxVEflH1kt","Cp3mZTCgPp","taOXKsqVrf","55rfBHlUbF","iwzGkMK07Y","ZuDtD5Drn0","5iGN5k85Ae",
+"X6Pin5nmWv","FxX9qHzZT8","1v5hHSbRYy","C2Irc4QMc9","aDGtS6q6L9","9iGoTt59lR","rz7UtX6Pin","ru4UGWPmlx","3otm6NOHsz","guMb8dhSuH",
+"iKqhruTacx","BpYhVNxx9V","2DREsgjUTu","uQIczzHF1q","48cHLazIWp","MGlTF24ARF","prNT61LB1L","JXljWQChxs","BbwgA0Kyfs","nlaByUlU3M",
+"faHirQChxs","aFFssFnPFB","9iGoTD6rBy","Nxx9VjfREu","s7MxklCMxy","brhlQYOfrY","AIYUuJRJQB","CdyBVFVMxo","8FmFH0PktI","7Ow5CrKDLJ",
+"QClRLuQIcz","FxX9qRkQke","5drc6zbIYY","RpBQmFwEJz","CxVEftuDyS","tjQxsrhl0J","GrDg7SWfou","tuDySL7cGc","s7MxkqaofN","5drc6tuDyS",
+"8xEKzt59lR","TCgPpQ6Lix","s4786rz7Ut","0Wr5yjtn0X","JJs5moVQp6","iwzGkd7vjM","MmsIoTCgPp","0PktIVerEA","EOE1oStlDJ","zY1GYfmIK1",
+"5iGN5mX2GE","aL6AJ1j5L8","7Ow5C5VZjS","BbwgA3otm6","JRJQB9rlg9","rz7Ut5Mg9r","qUJMdLDk6f","JRJQB8hJdt","In3NSMGlTF","RsQUqlpF6W",
+"9rlg9JRJQB","0MR5XU3yw5","FhtgluQIcz","FVMxoVNCPd","7fKYURkQke","YOfrYdpe1v","FwEJzcL0aE","5Mg9rCfgr3","nlaByO3iyQ","v1HlnIjTwP",
+"jSjS3MGlTF","uLtKstlILt","2TRI7kZANm","i3pyd2Yz7E","iqv4kAmdQd","IjTwPatef2","ZzJHWDLhzM","oQ87r8U2nU","b29RJUvlv4","P6bcglweGy",
+"M6qcGt98iW","lsQGowiHrZ","lm0pDni2v1","FLsphGSQwj","J2mQicL0aE","RxrsmcShY2","NcICAK20wK","SjskQECMvU","BCxeCpAhR1","uAWypSbRYy",
+"W3VFH0ao3l","dpe1vhE1Ql","RxrsmjzUqR","djsrvBFkb8","RACuj0h1b1","CxVEfJkzUn","pWiOsIjTwP","ydG8UpvgjS","LewvMQWxoT","G1RhSpv0i7",
+"JKWYRd7vjM","tlILtQ6Lix","Ul4a1ulk41","zz4ZURxrsm","AkKTk7fsYM","qUJMd0h1b1","RACujMGlTF","pWiOsni2v1","S2DfuU3yw5","Oz8yZBFkb8",
+"X6PinMK07Y","jzUqRFhtgl","lXFOB8FmFH","FhtglzFgtB","y94nwuLtKs","bgJAzoQ87r","v1Hln07n1c","0Wr5yfcwDa","soy9tFcWrW","FFDuiVLTy6",
+"uupzk9iGoT","zz4ZUtlILt","rz7UtQbxXc","J2mQicQOnv","EoToPWaim6","v2eC3QnJ1S","hYBCKAOgEe","QYxC0nFqik","qaofNS2Dfu","5NammjiVBP",
+"M3zXLLewvM","piJSkjzUqR","EoToPBpYhV","M6qcGgdQsS","cQOnvaFFss","FnPFBQClRL","NcICAvOqCE","Cfgr3uoStw","S2DfuGrDg7","5ZaEzOxWIH",
+"i3pydpFrrl","8FmFHEdBKc","cmXIXOUYuF","dpe1vVjCZq","EoToP0BmCy","b29RJuLtKs","M6qcGbgJAz","fcwDaJKWYR","tAOsrTCgPp","JXljWdjsrv",
+"piJSkWmadA","fcJOyiwzGk","BpYhVxciqp","P6bcgh1zcH","aDGtSqaofN","l83UdcQOnv","yEfy98cVD3","iwzGk5Drn0","piJSkGXdoH","Dz1R3t59lR",
+"iqv4kSmGzv","prNT6XyPZN","KASQ8YOfrY","nFqikt98iW","AIYUuguMb8","QClRLv8yFN","BFkb82hEEU","piJSkVNCPd","M6qcGxciqp","jeskStuDyS",
+"9y4lw5ZaEz","WMiS3B3qem","0KyfsYjB9t","yvOMIRzaZA","Rxrsm1LB1L","0PktIsx5Gl","Pb1pad85a9","uJScXRkQke","FhtglNhXdu","cL0aEG1RhS",
+"fcwDa1v5hH","UmaEvCp3mZ","jS1ajzQt6Q","t59lR7hyVv","s93Mlrhl0J","FFDuiaFFss","he9IAB3qem","aFFsspiJSk","i7WMQdQ586","16lHcBCxeC",
+"SbRYyvkCHH","AIYUun1pmO","yluBxFhtgl","uupzk9GXkX","VLTy6I7p2a","OUqFMMGlTF","BFkb8EoToP","YOfrYfLNg8","QWxoT14FLR","d7vjM45cIH",
+"Yf2EcuN6r3","D6rByMkgy8","AOgEeFNYIM","1LB1L8FmFH","16lHcSWfou","uPX7GnFqik","JkzUnAIYUu","Vprf2GXdoH","9y4lwMojnP","y94nwQworu",
+"ZhwG1K4GS8","ZUnqtaL6AJ","zFgtBQ6hMC","Pb1paK4GS8","rz7UtoGu6x","jiVBPoQ87r","EdBKcVLTy6","GrDg748cHL","UmaEvUl4a1","WPmlxQChxs",
+"7X3uyoVQp6","vkCHH7fKYU","jiVBPPb1pa","k85AeMGlTF","2TRI7tjQxs","M3zXLulk41","FnPFBi7WMQ","CxVEf16lHc","4QMc90MR5X","KZamHQChxs",
+"8RCUAe6e4z","WreyPAOgEe","In3NSzY1GY","NcICAy94nw","7X3uyXyPZN","jeskSHP433","BpYhVpT8wu","KASQ8i3pyd","pmeCdVNCPd","1j5L8GSQwj",
+"IBe8kguMb8","VIlwPzmLYD","9y4lwyluBx","YOfrYQWxoT","VIlwPAkKTk","QbxXcOxWIH","CqqaDzHF1q","qUJMdazIWp","XflUq1v5hH","U3yw5LDk6f",
+"YjB9tVerEA","bZLvSAIYUu","hYBCKlkMUA","h1zcHYw2oU","Q6hMCNOHsz","fcwDas4786","2Nslm5VZjS","7ku1pFxX9q","h1zcHWMiS3","jeskSsqVrf",
+"hi5X7WPmlx","ZhwG1NAFuw","8xEKzM3zXL","WMiS3ZUnqt","7ku1pYjB9t","B3qem3weIF","VerEArKDLJ","bgJAzlm0pD","euZA5dhSuH","xciqpv8yFN",
+"a00b5hUTw7","5drc6W7cTs","ThjNnOUqFM","gdQsSNOHsz","ciuWzFxX9q","2DREs29QAz","RmDcrqUJMd","RxrsmEdBKc","tAOsrpmeCd","29QAzYh1hF",
+"OUqFM8xEKz","8cVD3xXTI4","ZUnqtzbIYY","oGu6xhUTw7","M6qcGSs0Zu","uN6r3No0Qb","In3NSG1RhS","IBe8kvLsmS","RBhp0EdBKc","5VZjSAXpwE",
+"gdQsSsoy9t","ThjNnWaWsv","hi5X7IBe8k","djsrviKqhr","RmDcruoStw","24ARF5VZjS","suY4xNo0Qb","sx5GlCp3mZ","yEfy9BbwgA","RmDcraL6AJ",
+"JIqXiReKEW","uPX7GXyPZN","Ss0Zui3pyd","jSjS32TRI7","MmKGJzbIYY","aDGtSzFgtB","DQimp9rlg9","NOHsza00b5","Oz8yZ0Kyfs","0h1b1QClRL",
+"a00b5DQimp","rKDLJdjsrv","CxVEfrhl0J","cQOnvtjQxs","X6PinQClRL","FPfSEdpe1v","X6Pin7hyVv","D6rBy0Kyfs","MezSWoQ87r","YjB9tzbIYY",
+"CNHmvRxrsm","y94nwUmaEv","cmXIXy94nw","tl72W2TRI7","lj07QIKxdL","ReKEWUlU3M","SmGzvMGlTF","zFgtBStlDJ","Nxx9VBCxeC","v2eC39iGoT",
+"xciqp8U2nU","uJScX1LB1L","FxX9qWreyP","JKWYRGrDg7","pFrrl64s8N","Uvlv4MezSW","mX2GEKr8ys","K4GS88hJdt","uAWyp0MR5X","TCgPpuLtKs",
+"Waim6VNCPd","uoStwFLsph","rhl0JcmXIX","yluBx4dEz6","ECMvUBCxeC","4QMc9prNT6","lH1kthi5X7","WaWsvOxWIH","ru4UG2hEEU","tAOsr9iGoT",
+"Pb1paW7cTs","55rfBuLtKs","S77LH8TxD7","7Ow5C9y4lw","7lUXZhi5X7","vkCHHM3zXL","DG4sTPYBf4","uAWypfFDrJ","Cp3mZNOHsz","Dz1R3lpF6W",
+"Q6hMC2Yz7E","HRxd8FjHXR","9rlg9YjB9t","2Yz7EYjB9t","I7p2aYf2Ec","kZANmcQOnv","QnJ1SnlaBy","v8yFNAIYUu","mz8gxzQt6Q","RkQkeKASQ8",
+"KASQ8kB5nP","CqqaDlweGy","MK07YWmadA","1j5L8SjskQ","QYxC048cHL","cQOnvChuy3","yofH3HfyNQ","0BmCy0Kyfs","D6rBybZLvS","aL6AJ2Nslm",
+"VNCPdDG4sT","2DREsuQIcz","aez9yHzZT8","BFkb8WDVWJ","ydG8UgIYvE","TXQ0Z6q6L9","SbRYy0PktI","Ss0ZuFwEJz","kB5nPdjsrv","nlaBym4bxU",
+"CxVEfQChxs","45cIHuoStw","QYxC0jeskS","zz4ZUjS1aj","bgJAzlweGy","gdQsSMmKGJ","14FLRjzUqR","580YDzqH0W","2DREsaDGtS","tl72WB3qem",
+"HzZT8EdBKc","ulk41OUYuF","AXpwEuupzk","X6PinYh1hF","QbxXcIn3NS","pWiOsv1Hln","CxVEfyToGW","lj07QWMiS3","BpYhVJKWYR","ZUnqtNAFuw",
+"RzaZAGrDg7","8FmFHpvgjS","AkKTke6e4z","lsQGouupzk","s93Ml9GXkX","HzZT8F6PT2","Cfgr38TxD7","uLtKswiHrZ","FjHXRaez9y","NhXduHP433",
+"vOqCECqqaD","faHiruTacx","zbIYYQnJ1S","MezSWfcwDa","9eoRctjQxs","yvOMIK4GS8","MGlTFpT8wu","gIYvEzbIYY","I7p2aS77LH","5iGN5pFrrl",
+"TCgPpgf8rI","0ao3lPYBf4","Vprf21j5L8","BbwgAQssNC","OxWIHQWxoT","jtn0Xsx5Gl","StlDJhE1Ql","iB08lpvgjS","t59lRhYBCK","7fKYUSmGzv",
+"HRxd8dQ586","zQt6QbrhlQ","ZhwG1MGlTF","MmsIouPX7G","zY1GYVIlwP","AOgEeVLTy6","v1HlnprNT6","Vprf2AXpwE","iB08lAgJHQ","t98iWStlDJ",
+"QnJ1S8TxD7","GXdoHpFrrl","euZA5lCMxy","qaofNxReec","ydG8Ue6e4z","SjskQDQimp","6q6L9uPX7G","YOfrYWMiS3","IjTwPcQOnv","AmdQdaL6AJ",
+"CxVEf5nmWv","mX2GE0Wr5y","0Wr5ydmoS7","ThjNn7Ow5C","2hEEUGv3Fq","VerEA16lHc","kB5nPBCxeC","CxVEfVIlwP","8FmFHhi5X7","M6qcGpFrrl",
+"Cp3mZCK5W7","ogLgcFhtgl","Ta8f6gdQsS","uLtKsUvlv4","ydG8UIRh48","ulk41OHaBz","W7cTslsQGo","TXQ0ZpmeCd","MojnPNcICA","9eoRclViBv",
+"t98iW8xEKz","MojnPMezSW","QClRLMezSW","fcwDalweGy","48cHLCp3mZ","618Di07n1c","6q6L9hSSvQ","Oz8yZAmdQd","W3VFH4dEz6","YOfrYNcICA",
+"48cHLYw2oU","oVQp6Gv3Fq","Q6LixAmdQd","BFkb848cHL","NAFuwbrhlQ","l83UdzQt6Q","k85Aed85a9","jtn0XK4GS8","ulk41MmKGJ","J2mQiIKxdL",
+"v8yFNReKEW","MK07Y2DREs","5Nammhe9IA","GSQwjaDGtS","1v5hH16lHc","oGu6xMm8si","lCMxy0Wr5y","rz7UtS77LH","14FLRVIlwP","IKxdLTXQ0Z",
+"dpe1vWMiS3","lXFOBoVQp6","cL0aE0BmCy","VBjhzVerEA","nnP8ozQt6Q","CxVEfnFqik","Yw2oUcmXIX","zFgtBaL6AJ","WaWsvzmLYD","ogLgcBpYhV",
+"wDajXRBhp0","wiHrZ7fsYM","KsjRKqUJMd","WreyPUmaEv","brhlQOUYuF","EoToPF6PT2","6AFT0yEfy9","cL0aEuZPqg","TXQ0Z2ZHdk","55rfBjfREu",
+"IBe8k9GXkX","J2mQiUmaEv","HRxd8XflUq","IKxdLlsQGo","I7p2a48cHL","atef2lXFOB","uoStwgtCA5","a00b5uAWyp","0BmCys7Mxk","uTacxLDk6f",
+"UlU3MTa8f6","GXdoHRmDcr","2hEEU2DREs","ix74r2DREs","zz4ZU7hyVv","jtn0X618Di","dhSuHLDk6f","oQ87rFjHXR","lj07QkB5nP","S77LHyEfy9",
+"azIWp45cIH","iwzGkatef2","x3LDeqQxHP","VerEA3otm6","kZANm0MR5X","suY4xZUnqt","Q6LixfaHir","M6qcGyluBx","hUTw7pFrrl","v8yFNFnPFB",
+"ZUnqt5ZaEz","TXQ0ZC2Irc","BGaQYs4786","mX2GELDk6f","t98iW1LB1L","Qworuy94nw","ReKEWY1mC0","jSjS3NOHsz","aFFsstl72W","TwanoHlUbF",
+"Y1mC0S2Dfu","qUJMdl83Ud","X6PinksJby","uvf7AQbxXc","6AFT0JXljW","pAhR10BmCy","29QAzFGzgp","yvOMISbRYy","RACuj7fKYU","mz8gxrhl0J",
+"CIShGlkMUA","FhtglvOqCE","0h1b1C2Irc","618Dia00b5","CqqaD0h1b1","rz7UtyEfy9","nlaByNAFuw","PYBf4blLA9","xReecmX2GE","VLTy6i7WMQ",
+"nnP8ov1Hln","XflUqjeskS","ZuDtD2Yz7E","Q6LixJkzUn","MGlTF0Wr5y","45cIH24ARF","prNT6AXpwE","yluBxdhSuH","suY4xjeskS","ThjNngdQsS",
+"45cIHVBjhz","Ul4a1IBe8k","oQ87rM3zXL","Mm8sipWiOs","lH1ktjSjS3","FwEJzpAhR1","0ao3lCp3mZ","FnPFBQworu","uZPqgZ4I1v","2Yz7EFVMxo",
+"faHirhUTw7","Oz8yZQClRL","SjskQzmLYD","kB5nPSmGzv","uQIczxReec","U3yw5CdyBV","zmLYD24ARF","ix74rEdBKc","IjTwPC2Irc","i7WMQVerEA",
+"kZANmJXljW","azIWp1LB1L","FjHXRulk41","8hJdto8Uyd","QnJ1SMGlTF","ZhwG1pvgjS","Cfgr3d7vjM","fLNg8OxWIH","n8pJ9XflUq","EdBKcCIShG",
+"CNHmv5drc6","VBjhz8U2nU","2DREs8cVD3","VIlwPBCxeC","lm0pDvkCHH","jtn0Xaez9y","M3zXL0Wr5y","IRh48m4bxU","suY4xBGaQY","3otm6lpF6W",
+"LbRTHiqv4k","0KyfsfcwDa","n8pJ9OUqFM","CqqaDO3iyQ","jS1aj0Wr5y","Yw2oUYh1hF","gjUTulj07Q","580YDIKxdL","FPfSEQ6hMC","djsrv618Di",
+"iKqhraDGtS","lj07QO3iyQ","In3NSlkMUA","CdyBVx3LDe","lpF6WfLNg8","4QMc9kZANm","KZamHSs0Zu","MGlTFtjQxs","K20wKzHF1q","ZzJHW16lHc",
+"M3zXL0ao3l","G1RhSn1pmO","tl72WhSSvQ","lH1kt5iGN5","jtn0XUvlv4","K20wKOz8yZ","l83UdSbRYy","24ARFIn3NS","zz4ZUydG8U","jzUqRDz1R3",
+"hYBCK5VZjS","LbRTHqUJMd","6q6L9QnJ1S","dmoS7jzUqR","7Ow5C5Mg9r","Mm8siwiHrZ","pAhR1Waim6","M6qcGsoy9t","Yf2EcTCgPp","wiHrZlkMUA",
+"FhtgluN6r3","s7MxkTa8f6","8hJdtRzaZA","ZhwG1FjHXR","oGu6x0h1b1","piJSkVIlwP","RBhp0m4bxU","dpe1v0YAGH","07n1cUmaEv","pAhR1Q6Lix",
+"jtn0Xv8yFN","x3LDeVprf2","TCgPps4786","W3VFHtAOsr","S77LHF6PT2","0PktIJXljW","qUJMdRmDcr","uvf7AlsQGo","618DiKZamH","Y1mC0ogLgc",
+"fLNg8guMb8","48cHLbZLvS","azIWpVNCPd","aL6AJix74r","uTacxb29RJ","0PktIRpBQm","YOfrYdmoS7","rhl0JuLtKs","v2eC3gf8rI","e6e4zWMiS3",
+"WDVWJOUqFM","VNCPd48cHL","W7cTsdjsrv","iKqhrXyPZN","hE1Qlhi5X7","WmadAEoToP","Ss0ZuSjskQ","IRh48rKDLJ","d7vjMQssNC","B3qemWPmlx",
+"uZPqgrz7Ut","JJs5mGXdoH","piJSkuvf7A","zbIYYcL0aE","NOHszEoToP","7fsYMydG8U","DLhzMi7WMQ","BpYhVgtCA5","7X3uyulk41","OxWIHo8Uyd",
+"GSQwjGXdoH","QChxstvdkD","MmsIoChuy3","J2mQie6e4z","7ku1pUmaEv","BFkb8PYBf4","zmLYDd7vjM","XflUqDcpWB","yvOMIdjsrv","Q6LixZv7z0",
+"Nxx9VzQt6Q","OxWIH5ZaEz","nFqik5VZjS","Uvlv4FFDui","oQ87rkZANm","gdQsSuvf7A","d85a9kZANm","pFrrlC2Irc","5nmWv5Mg9r","RpBQmrhl0J",
+"t59lRAmdQd","D6rBySjskQ","AmdQdcShY2","CK5W7618Di","uQIczG1RhS","Z4I1vuZPqg","5iGN5FNYIM","JKWYRh1zcH","AOgEeSmGzv","fLNg8X6Pin",
+"I7p2auTacx","HfyNQCqqaD","WDVWJ8hJdt","lXFOBTXQ0Z","5drc6KZamH","29QAzv2eC3","BbwgAXflUq","Waim68TxD7","U3yw5piJSk","48cHLdhSuH",
+"pmeCdZ4I1v","uJScXSmGzv","2TRI7Gv3Fq","WaWsvaDGtS","o8UydNxx9V","lViBvpT8wu","ECMvUFhtgl","MmsIodQ586","ksJbyiKqhr","24ARFk85Ae",
+"zz4ZUU3yw5","b29RJHzZT8","G1RhSoVQp6","EoToPVBjhz","Gv3FqFGzgp","FjHXRQClRL","ydG8Uulk41","0KyfsU3yw5","nnP8oWDVWJ","OUqFMNo0Qb",
+"CK5W7580YD","pvgjS07n1c","piJSkoGu6x","fFDrJWaim6","aez9yxReec","XyPZN16lHc","0YAGHHzZT8","lCMxyk85Ae","JkzUnGSQwj","VerEALewvM",
+"lViBvTa8f6","lweGyAmdQd","t59lRuvf7A","UmaEvEdBKc","S77LH1LB1L","5ZaEzvLsmS","POUYS5Drn0","7Ow5Crhl0J","Oz8yZaez9y","0YAGHVIlwP",
+"ciuWzblLA9","gdQsS9y4lw","M6qcGhE1Ql","QYxC0JkzUn","EdBKcuLtKs","F6PT2s93Ml","d7vjMlCMxy","FxX9qAOgEe","xciqppT8wu","16lHcJ2mQi",
+"4W0TlPb1pa","16lHc6q6L9","Nxx9V8U2nU","Yf2Ec2Yz7E","aL6AJMm8si","QnJ1SlCMxy","GXdoHReKEW","pFrrl5nmWv","3otm6ix74r","9XyT9uLtKs",
+"jtn0XAgJHQ","Pb1pa7X3uy","prNT6jzUqR","GWqqXTCgPp","HlUbFWmadA","sx5GlgdQsS","48cHLKr8ys","soy9tZv7z0","IKxdLuLtKs","FGzgpAgJHQ",
+"JIqXiNxx9V","Ul4a1MaJQs","faHirbrhlQ","SjskQTCgPp","ZuDtD8FmFH","ulk41FjHXR","XyPZNFnPFB","ydG8Ux3LDe","OxWIHhYBCK","LbRTHi7WMQ",
+"ru4UGo8Uyd","vOqCEyofH3","uLtKsFcWrW","tlILtVLTy6","7lUXZy94nw","W7cTs2Yz7E","d7vjM6AFT0","IKxdLyToGW","5IhmGguMb8","5Drn0WaWsv",
+"JIqXiW3VFH","i7WMQS77LH","hi5X7JJs5m","VLTy6QWxoT","hYBCKvkCHH","uPX7GmX2GE","zqH0WFGzgp","1LB1LQssNC","QClRLFcWrW","aL6AJ8cVD3",
+"AOgEem4bxU","Oz8yZcmXIX","9GXkX9GXkX","Ul4a1FGzgp","7Ow5CFwEJz","Cfgr32Nslm","NcICA0Wr5y","vkCHHK20wK","dQ586OHaBz","9y4lwmX2GE",
+"gIYvEWaim6","vOqCEzqH0W","iB08lyluBx","2NslmRzaZA","xciqp6q6L9","ZzJHWIRh48","StlDJQbxXc","zFgtBFwEJz","tvdkDEOE1o","yofH3dpe1v",
+"7fsYMksJby","5Nammrhl0J","fqypyJXljW","kB5nPvOqCE","lViBvogLgc","hUTw707n1c","SbRYyKsjRK","VNCPdChuy3","k85Aehi5X7","jSjS3h1zcH",
+"zY1GYx3LDe","9iGoT2DREs","TwanoB3qem","SbRYyd7vjM","qQxHPCxVEf","5Namm2DREs","RACujzY1GY","x3LDe2ZHdk","o8Uydv1Hln","lpF6WPOUYS",
+"vOqCEqUJMd","Yh1hFQssNC","cL0aEQbxXc","BbwgAuAWyp","D6rBylH1kt","rKDLJlXFOB","S2DfulCMxy","CK5W7TCgPp","EoToPSmGzv","8xEKziwzGk",
+"9eoRcCNHmv","POUYSlXFOB","ru4UGuTacx","AOgEefLNg8","WPmlxyluBx","5ZaEzZ4I1v","ThjNn1LB1L","fFDrJRzaZA","h1zcHJKWYR","i3pydZ4I1v",
+"brhlQ6q6L9","taOXK7fKYU","tlILt2Yz7E","lsQGo3weIF","JXljW24ARF","zY1GYKr8ys","ksJbyvLsmS","FVMxo0BmCy","uoStw0h1b1","jiVBPt98iW",
+"J2mQiFwEJz","hi5X7K20wK","prNT68RCUA","l83UdyofH3","aL6AJM3zXL","FnPFBBbwgA","QnJ1SFnPFB","FLsphsqVrf","lkMUAtaOXK","S2DfucL0aE",
+"jS1ajn1pmO","ydG8UHRxd8","7hyVvpFrrl","DcpWB3weIF","ksJbyAOgEe","HP433580YD","ciuWzMaJQs","EOE1o9eoRc","0ao3lMmsIo","yofH3v1Hln",
+"64s8NiKqhr","iqv4kpAhR1","WmadA0MR5X","5ZaEzaL6AJ","TXQ0ZAmdQd","hE1QlFhtgl","zz4ZUHRxd8","cmXIXlkMUA","IBe8kJkzUn","BGaQYFnPFB",
+"QbxXc9rlg9","jeskSCdyBV","CxVEfhSSvQ","nnP8oaFFss","lpF6WjS1aj","5ZaEz8TxD7","mX2GEvkCHH","fLNg864s8N","uJScXd85a9","7fKYUNAFuw",
+"F6PT21v5hH","l83UdW7cTs","oVQp6CIShG","WMiS3qUJMd","RzaZAvOqCE","zz4ZUD6rBy","Yh1hFlkMUA","djsrvrhl0J","D6rBy5Namm","cShY2IKxdL",
+"cL0aE8xEKz","4W0TlnFqik","FPfSEI7p2a","d85a9UlU3M","EdBKcIjTwP","Oz8yZGSQwj","QChxsFPfSE","5Drn0QWxoT","QssNC16lHc","WmadAFLsph",
+"ThjNnW3VFH","EoToPoGu6x","OUqFMFwEJz","lj07QjS1aj","vLsmSJJs5m","lH1ktuZPqg","x3LDe1v5hH","1LB1LpAhR1","wDajX07n1c","1j5L80MR5X",
+"F6PT2D6rBy","0BmCyGXdoH","64s8NQClRL","1LB1LCxVEf","W3VFH2ZHdk","KZamHIRh48","K4GS8lViBv","2hEEUNOHsz","CIShGThjNn","Q6LixvLsmS",
+"1LB1LFPfSE","QYxC0AIYUu","5ZaEzWPmlx","prNT6Ta8f6","Yf2EcnlaBy","BFkb8Nxx9V","2NslmydG8U","IKxdLn1pmO","yToGWOxWIH","jfREuKr8ys",
+"0YAGHgIYvE","9GXkXmz8gx","ECMvUwDajX","pFrrlAIYUu","HP433d7vjM","W3VFHRBhp0","VNCPdvkCHH","xXTI45drc6","RpBQmFLsph","CNHmvK4GS8",
+"Y1mC0soy9t","tuDySNcICA","Yw2oUtjQxs","x3LDes7Mxk","zY1GYJIqXi","lweGy8U2nU","5nmWvqaofN","5drc6hYBCK","ulk41MaJQs","ksJby8FmFH",
+"HzZT8xXTI4","Waim60ao3l","8FmFH9XyT9","X6PinfcwDa","U3yw5pWiOs","0MR5Xpv0i7","kB5nPuAWyp","4W0TlRzaZA","UmaEvQChxs","ogLgcJ2mQi",
+"nFqik2TRI7","EdBKcl83Ud","iwzGkIBe8k","14FLRRBhp0","Vprf2tAOsr","jfREuGv3Fq","6AFT0rz7Ut","O3iyQCdyBV","d85a9d7vjM","dpe1vaL6AJ",
+"sx5GljeskS","2hEEUUl4a1","gtCA5azIWp","X6PinZUnqt","QClRLRsQUq","ReKEW5IhmG","IBe8kRkQke","sx5GlZv7z0","WPmlxwiHrZ","vLsmStuDyS",
+"aL6AJNo0Qb","hYBCKLDk6f","uJScXmz8gx","uvf7AoQ87r","K20wKS2Dfu","cShY2NhXdu","SmGzvW3VFH","07n1c4dEz6","8U2nUC2Irc","MmKGJWDVWJ",
+"Cp3mZuoStw","zqH0WRxrsm","ru4UG9eoRc","7fKYUatef2","fLNg8jtn0X","JRJQB5iGN5","dhSuHiqv4k","s47868xEKz","7hyVv7ku1p","O3iyQ5nmWv",
+"uLtKslweGy","hYBCKjSjS3","rz7UtK20wK","ECMvULDk6f","gtCA5brhlQ","a00b54W0Tl","0PktIVIlwP","HzZT82ZHdk","3otm6UlU3M","2Nslm7fKYU",
+"blLA9Pb1pa","ZhwG1tAOsr","pFrrlM3zXL","5Nammdjsrv","9GXkXSs0Zu","vkCHHGv3Fq","8RCUAVLTy6","lsQGoo8Uyd","NcICAtjQxs","IKxdLGSQwj",
+"O3iyQWaim6","jiVBPdpe1v","MaJQs07n1c","QWxoTni2v1","WmadApT8wu","he9IACqqaD","HRxd88U2nU","m4bxUs7Mxk","jeskSDLhzM","0YAGH0YAGH",
+"GXdoHTa8f6","FnPFB1j5L8","YjB9t64s8N","YjB9tLDk6f","h1zcHfqypy","JRJQBHzZT8","BFkb8gtCA5","KZamHBGaQY","vLsmSFGzgp","UmaEvPb1pa",
+"iKqhrF6PT2","0ao3lMezSW","s47865drc6","618DiHRxd8","X6PinMojnP","IKxdLQ6Lix","U3yw5yluBx","Mm8si29QAz","5VZjS618Di","Zv7z0K20wK",
+"Dz1R37X3uy","ZJTXHDQimp","JkzUnqaofN","jtn0X2hEEU","LDk6flm0pD","h1zcHuQIcz","RmDcrjfREu","iB08luN6r3","l83UdqUJMd","ReKEWguMb8",
+"Waim6hi5X7","3otm6tvdkD","wDajX4dEz6","JkzUnBGaQY","MaJQsUl4a1","pvgjSzmLYD","Dz1R3zqH0W","GXdoH64s8N","VNCPdBpYhV","MK07Ymz8gx",
+"55rfBJRJQB","ogLgc0MR5X","zQt6QvOqCE","t59lR8cVD3","gtCA5LDk6f","xciqpRACuj","zmLYD0Wr5y","yEfy9uvf7A","NAFuwprNT6","aFFssGv3Fq",
+"JKWYRnFqik","PYBf4HP433","ksJbygdQsS","P6bcgNxx9V","hSSvQzHF1q","gdQsSv2eC3","KASQ88U2nU","MK07YQChxs","4W0TlS2Dfu","ThjNnrKDLJ",
+"7Ow5CQClRL","okgRibrhlQ","MezSWzHF1q","5VZjS5iGN5","L7cGcuQIcz","24ARFM6qcG","okgRi2DREs","6AFT0MmKGJ","CxVEffcJOy","zY1GYzQt6Q",
+"Oz8yZO3iyQ","aL6AJMK07Y","yEfy9lCMxy","WaWsvZUnqt","MaJQs9eoRc","JJs5m7Ow5C","NhXduZhwG1","BpYhVFnPFB","RACujZJTXH","rz7Ut0Kyfs",
+"ZzJHWsqVrf","uZPqg0Wr5y","RpBQm0BmCy","KsjRKRxrsm","tjQxs4dEz6","FPfSERpBQm","QChxsy94nw","Qworu07n1c","Qworuuupzk","F6PT2wDajX",
+"LbRTHGWqqX","JXljWCIShG","uTacx5ZaEz","WPmlxECMvU","prNT6uJScX","RsQUqhSSvQ","2TRI7lkMUA","yvOMI618Di","pWiOsQYxC0","XyPZN64s8N",
+"M3zXLQnJ1S","jtn0XP6bcg","5IhmG2Nslm","vkCHH0YAGH","45cIHWmadA","cQOnvQWxoT","mX2GECIShG","iB08l7lUXZ","t59lRKASQ8","48cHLfmIK1",
+"m4bxUsuY4x","blLA9BFkb8","ZJTXHdjsrv","uQIczRACuj","5VZjSpiJSk","oVQp6oQ87r","RpBQmn1pmO","kB5nP8RCUA","kB5nPpFrrl","uupzkru4UG",
+"kZANmprNT6","NOHszEdBKc","tuDyS2ZHdk","vOqCEblLA9","h1zcHNo0Qb","7lUXZK20wK","ni2v1dhSuH","G1RhS5Namm","8hJdtuZPqg","qQxHPqaofN",
+"Mkgy8O3iyQ","i3pydStlDJ","RBhp0ogLgc","5nmWvS2Dfu","cQOnvFLsph","a00b5QWxoT","uTacxuAWyp","Dz1R3x3LDe","0BmCyjeskS","Oz8yZOHaBz",
+"cL0aEQssNC","sx5Glb29RJ","ru4UGuLtKs","5NammJKWYR","zQt6Qa00b5","yofH3uPX7G","uvf7AAgJHQ","U3yw5SWfou","Ss0ZuMezSW","gjUTuTa8f6",
+"Gv3FqjzUqR","M3zXLOUqFM","TXQ0ZYh1hF","IRh48Pb1pa","HzZT8MGlTF","4dEz648cHL","IBe8kBGaQY","AgJHQMkgy8","djsrvuZPqg","VNCPdStlDJ",
+"CdyBVS2Dfu","UlU3MOUqFM","s7MxkWmadA","ZzJHWgtCA5","jSjS3pFrrl","gf8rIhE1Ql","Ss0ZukB5nP","v2eC3qQxHP","jSjS3uN6r3","hUTw7h1zcH",
+"FNYIMW7cTs","0h1b19eoRc","pv0i78hJdt","uZPqgnFqik","OxWIHdQ586","hi5X7v1Hln","NhXduIn3NS","WmadAIRh48","hSSvQ7Ow5C","Ul4a1FVMxo",
+"J2mQis7Mxk","m4bxUQbxXc","JKWYRv8yFN","580YDK4GS8","OxWIHChuy3","Pb1pauZPqg","yvOMIBpYhV","RmDcr2ZHdk","HzZT8v8yFN","LbRTHkB5nP",
+"euZA5Z4I1v","Ss0ZuyToGW","FGzgpzQt6Q","WDVWJ24ARF","CqqaDbZLvS","aL6AJoVQp6","ciuWzHP433","kZANmVerEA","vLsmSzHF1q","v1HlnrKDLJ",
+"zHF1qrKDLJ","IjTwP5IhmG","ogLgcEoToP","Y1mC0F6PT2","0BmCyhE1Ql","SmGzvMmKGJ","5Drn0U3yw5","v2eC30ao3l","uTacxAIYUu","JkzUn0MR5X",
+"KZamHqQxHP","OUYuFdmoS7","6AFT0ni2v1","ciuWzuupzk","ni2v1lkMUA","jeskSqaofN","uupzkYh1hF","8xEKz29QAz","yEfy9uPX7G","yEfy9QClRL",
+"RsQUq14FLR","1j5L8s93Ml","ZzJHWJXljW","14FLRL7cGc","oGu6xGSQwj","AmdQdFwEJz","4QMc9vLsmS","XflUq2TRI7","RxrsmbrhlQ","D6rByMaJQs",
+"rz7Ut5iGN5","FPfSEkZANm","ru4UGpv0i7","Ss0ZuEOE1o","lweGyhi5X7","zbIYYNcICA","aDGtSo8Uyd","DG4sTCdyBV","0KyfsvLsmS","Yf2EcYOfrY",
+"PYBf4YOfrY","v8yFN14FLR","mX2GEatef2","oGu6xjfREu","s93Mlxciqp","MojnPVIlwP","blLA9CNHmv","FPfSEIn3NS","hYBCKlXFOB","tl72WOUqFM",
+"NcICAWaWsv","5drc6RACuj","5iGN5Gv3Fq","s7MxkzqH0W","BCxeCWPmlx","8cVD348cHL","8hJdtpvgjS","IRh48KASQ8","9rlg9FcWrW","prNT64dEz6",
+"QClRLWMiS3","7fKYUS77LH","l83UdMGlTF","0ao3ljtn0X","DLhzMfaHir","tvdkDJXljW","zmLYDuvf7A","W3VFHlXFOB","dhSuHRACuj","64s8NoGu6x",
+"Yf2EcUlU3M","RsQUqpWiOs","dhSuHuJScX","14FLRAgJHQ","bgJAzzbIYY","yToGWiKqhr","16lHcdhSuH","IBe8kdpe1v","mz8gxVerEA","d7vjMM6qcG",
+"xReec6q6L9","oGu6xCfgr3","CIShGs93Ml","AOgEeCNHmv","AOgEeSjskQ","jzUqR7Ow5C","6q6L9WaWsv","uupzk0ao3l","Waim67lUXZ","S2DfuDz1R3",
+"e6e4zQworu","JXljWMm8si","EdBKc24ARF","ix74rSmGzv","guMb8fcJOy","U3yw59iGoT","9rlg9Y1mC0","6AFT0h1zcH","jzUqRCIShG","FNYIM8cVD3",
+"8hJdttAOsr","jS1aj7X3uy","jiVBPWmadA","gjUTus4786","D6rByhYBCK","dpe1vs93Ml","Twano7fsYM","o8UydFFDui","EoToPzz4ZU","XflUqfaHir",
+"7fKYUD6rBy","ix74ruvf7A","n1pmONAFuw","t98iWP6bcg","K20wKHlUbF","D6rBysx5Gl","FPfSElCMxy","QssNC8FmFH","uJScX0Wr5y","uJScXNOHsz",
+"lpF6W14FLR","he9IAYOfrY","lViBvJ2mQi","jSjS3VerEA","n1pmO0BmCy","ogLgcReKEW","uQIczFhtgl","8hJdtZuDtD","C2IrcQClRL","6q6L9uJScX",
+"HP4332Nslm","pT8wuZJTXH","9XyT90YAGH","hSSvQwDajX","3weIFmX2GE","ulk41prNT6","uoStwI7p2a","Ul4a18U2nU","7ku1pzQt6Q","n1pmODQimp",
+"In3NSDQimp","CxVEfJKWYR","zqH0W7ku1p","0KyfsB3qem","pvgjSQnJ1S","MaJQsd85a9","5NammCxVEf","G1RhS3weIF","CxVEfKZamH","JJs5mJkzUn",
+"zHF1qazIWp","SmGzvRpBQm","xciqpn8pJ9","QbxXc0h1b1","lkMUA3weIF","EdBKcFwEJz","bgJAzuPX7G","m4bxUh1zcH","MezSWQnJ1S","Ss0Zu8cVD3",
+"6q6L9tvdkD","h1zcHmz8gx","x3LDecL0aE","hE1QlMaJQs","kZANmXflUq","cShY2ThjNn","C2IrctlILt","Cp3mZMGlTF","qaofNFjHXR","nnP8o3weIF",
+"y94nw24ARF","Waim6Ta8f6","CK5W7pmeCd","9iGoTiqv4k","yEfy9b29RJ","tjQxsNo0Qb","vOqCEjeskS","No0QbogLgc","D6rByzFgtB","FxX9qgIYvE",
+"24ARFfFDrJ","hYBCKYw2oU","ThjNn7lUXZ","DLhzMQbxXc","MmKGJIRh48","brhlQQbxXc","SWfouEOE1o","OHaBz5VZjS","nnP8oNxx9V","piJSkSjskQ",
+"Ul4a14dEz6","prNT6fcwDa","pAhR1suY4x","NcICAYw2oU","FGzgpQChxs","zmLYDzz4ZU","BCxeCWmadA","0MR5Xdpe1v","i7WMQI7p2a","OxWIHoGu6x",
+"Fhtgl9rlg9","2ZHdkFcWrW","CIShGlm0pD","ECMvUQ6hMC","NOHszblLA9","bgJAzIBe8k","GrDg7hUTw7","07n1c2Yz7E","qQxHPIn3NS","xXTI4PYBf4",
+"NAFuwjtn0X","dpe1vOHaBz","FnPFBOHaBz","wDajXpv0i7","gtCA5F6PT2","hE1Qljtn0X","x3LDeKr8ys","7Ow5CtvdkD","tjQxsWaim6","In3NSQbxXc",
+"yofH3tl72W","1v5hHyToGW","lXFOB64s8N","RACujIjTwP","ThjNnUmaEv","0BmCya00b5","5Mg9rtAOsr","Yh1hF2Nslm","uvf7An8pJ9","2TRI7WDVWJ",
+"RmDcriqv4k","QChxsRxrsm","IKxdLOxWIH","In3NS6AFT0","k85Ae9rlg9","LbRTHoGu6x","Nxx9VYh1hF","JXljWru4UG","BCxeCdQ586","Z4I1vPOUYS",
+"CqqaDuN6r3","Zv7z09y4lw","ksJbyuupzk","9y4lwnnP8o","d7vjMZuDtD","Dz1R3OHaBz","mz8gxSbRYy","2NslmECMvU","OHaBz64s8N","55rfB5Namm",
+"7Ow5CLDk6f","CdyBV618Di","Zv7z04dEz6","MGlTFuoStw","G1RhSprNT6","1j5L8IKxdL","16lHcAXpwE","NcICAO3iyQ","LDk6fi3pyd","fcwDaL7cGc",
+"qaofNW7cTs","lsQGobZLvS","SbRYyEoToP","0Wr5ys4786","tuDyS7fKYU","24ARFZuDtD","FNYIM618Di","AXpwEsqVrf","ReKEWciuWz","VIlwPs4786",
+"SmGzvjSjS3","a00b5BFkb8","CqqaDIKxdL","FnPFBDz1R3","hi5X729QAz","8cVD3cL0aE","RACujpWiOs","ciuWz0MR5X","vkCHHSjskQ","Kr8ysRACuj",
+"5nmWvk85Ae","16lHcZhwG1","7X3uyGXdoH","ogLgcLDk6f","nFqikiB08l","8RCUAsx5Gl","ZzJHWQnJ1S","Mkgy85Namm","QworutAOsr","I7p2aZzJHW",
+"s47868U2nU","iwzGkaDGtS","tjQxsdhSuH","blLA948cHL","QssNCHfyNQ","1v5hHogLgc","8RCUADG4sT","ThjNnK20wK","8RCUA4dEz6","VNCPdTwano",
+"VNCPd9iGoT","hE1Ql5ZaEz","IjTwPXyPZN","Cfgr3soy9t","RBhp0W3VFH","cL0aEMkgy8","9iGoTFGzgp","MmKGJNo0Qb","a00b5L7cGc","s4786Ul4a1",
+"jzUqRMK07Y","lCMxyMaJQs","oQ87ruZPqg","Waim6qaofN","IKxdL2TRI7","fqypyzHF1q","ksJbyy94nw","KZamHFwEJz","zHF1qMK07Y","AXpwEfcwDa",
+"lsQGos4786","ZUnqtbrhlQ","D6rByKZamH","QClRLStlDJ","taOXKQbxXc","9iGoTFnPFB","jiVBPpT8wu","NcICAyvOMI","cL0aEAgJHQ","DLhzMdmoS7",
+"uTacxAgJHQ","Kr8ys8U2nU","vOqCEPb1pa","soy9t7hyVv","cL0aEbrhlQ","t98iWk85Ae","blLA9KsjRK","7lUXZWDVWJ","QssNCtAOsr","RmDcrnnP8o",
+"s93MlOUqFM","9XyT9X6Pin","ZhwG1EOE1o","uN6r3v8yFN","prNT62hEEU","pvgjSSs0Zu","Y1mC0rhl0J","hYBCKlViBv","jtn0XZv7z0","LDk6fAkKTk",
+"Waim6v1Hln","h1zcHOUYuF","POUYSsqVrf","jiVBPQ6hMC","pmeCdFjHXR","soy9tvOqCE","FxX9q9rlg9","8hJdt9iGoT","rhl0JQChxs","EdBKc5Drn0",
+"Waim6zHF1q","cQOnvJXljW","FPfSEqaofN","OUqFMQClRL","RxrsmzY1GY","XyPZNS2Dfu","Yw2oUni2v1","Gv3FqLbRTH","SWfouDcpWB","jS1ajkZANm",
+"EOE1otlILt","Ul4a1i3pyd","pT8wu55rfB","DcpWB0YAGH","iKqhrfcwDa","fmIK1HRxd8","QnJ1SMmsIo","Nxx9VokgRi","zY1GYJkzUn","zz4ZUUvlv4",
+"XflUq2Yz7E","FjHXRM3zXL","FhtglzqH0W","t98iWjeskS","jfREuciuWz","ru4UGQnJ1S","F6PT2WMiS3","zHF1qkB5nP","HzZT8iKqhr","faHirm4bxU",
+"uoStwyvOMI","RxrsmfcJOy","lkMUAuoStw","No0QbjeskS","x3LDevLsmS","mz8gxhe9IA","VjCZquZPqg","AmdQdK20wK","pWiOscShY2","hSSvQIRh48",
+"29QAzIBe8k","LbRTHL7cGc","K4GS8AIYUu","ZhwG10ao3l","Pb1paFVMxo","Zv7z02hEEU","x3LDe4QMc9","In3NSo8Uyd","POUYSWPmlx","kZANmvkCHH",
+"rhl0J5iGN5","s4786v1Hln","KsjRKOz8yZ","Yf2Ec5nmWv","yvOMIfFDrJ","MGlTFwDajX","AOgEey94nw","0h1b12ZHdk","7lUXZbZLvS","TwanofcwDa",
+"Z4I1vECMvU","QbxXcNAFuw","Dz1R3ECMvU","48cHL2hEEU","GrDg7Yf2Ec","fcJOyrhl0J","8U2nUd7vjM","WmadAThjNn","Waim6CK5W7","xXTI4k85Ae",
+"o8Uyd0PktI","lkMUAuN6r3","5Drn08hJdt","K20wKU3yw5","taOXK0MR5X","RACujpmeCd","TwanopWiOs","aez9yHP433","OUYuFokgRi","Cp3mZU3yw5",
+"RsQUq9rlg9","2NslmuPX7G","qQxHPlj07Q","ogLgcKASQ8","yluBxtjQxs","wiHrZMGlTF","AOgEeM3zXL","cShY2C2Irc","Ul4a1Uvlv4","CdyBV3otm6",
+"CxVEfXflUq","9XyT945cIH","QnJ1SNOHsz","JRJQBt59lR","dpe1v2hEEU","a00b5DG4sT","1LB1LWreyP","OxWIHi3pyd","WreyPOxWIH","cQOnv55rfB",
+"jeskSlweGy","piJSkIn3NS","okgRiEOE1o","n8pJ9I7p2a","h1zcHuupzk","lj07QVLTy6","vOqCEjSjS3","s7MxkazIWp","vkCHHUmaEv","GXdoHHP433",
+"ZuDtDbrhlQ","tuDySPOUYS","Z4I1v07n1c","3otm6SjskQ","djsrvUl4a1","7Ow5CVIlwP","VNCPdokgRi","7ku1p8RCUA","2DREsQbxXc","BbwgAaFFss",
+"2Yz7EKZamH","QWxoTZhwG1","cShY2QYxC0","EOE1oWaWsv","IRh48PYBf4","hE1QlpAhR1","mz8gx0Wr5y","0BmCy16lHc","he9IAGWqqX","Y1mC0wiHrZ",
+"rhl0J8xEKz","he9IABFkb8","djsrvdmoS7","hi5X7580YD","4W0Tl0BmCy","9GXkXfFDrJ","SjskQgjUTu","v1HlnQ6hMC","EOE1oJKWYR","zz4ZUHzZT8",
+"PYBf4piJSk","QssNCTa8f6","K20wKtlILt","ECMvUazIWp","BFkb8ru4UG","GWqqXblLA9","h1zcH0h1b1","pT8wurhl0J","suY4xSWfou","G1RhSCxVEf",
+"MK07YMojnP","v8yFNxciqp","AgJHQn8pJ9","8hJdts7Mxk","nFqikgjUTu","uQIcz5nmWv","8xEKzVBjhz","In3NSm4bxU","gf8rIEdBKc","GWqqX16lHc",
+"C2IrcVprf2","tuDySVprf2","wiHrZQnJ1S","hE1QlYf2Ec","okgRiyToGW","64s8N2DREs","nlaBylpF6W","ogLgclViBv","k85Aed7vjM","yofH3jfREu",
+"PYBf4wiHrZ","brhlQ0PktI","jfREuzz4ZU","dpe1vatef2","ru4UGW7cTs","AXpwEXyPZN","n1pmOOHaBz","ZUnqtlXFOB","jzUqR29QAz","VLTy6Qworu",
+"VerEAjiVBP","MaJQsBCxeC","24ARF618Di","GrDg7ZJTXH","aez9yMaJQs","zqH0W5Drn0","9GXkXuQIcz","dpe1v7Ow5C","CNHmvCNHmv","iqv4kfcwDa",
+"n1pmOxciqp","vLsmSpmeCd","qQxHPrhl0J","I7p2alm0pD","3weIFdQ586","sqVrfWreyP","rhl0JQbxXc","5VZjSKASQ8","UmaEvChuy3","WMiS3CxVEf",
+"lCMxylsQGo","618Di0MR5X","aFFsst98iW","yToGWJ2mQi","5VZjSX6Pin","kB5nPlsQGo","xXTI414FLR","uAWypuN6r3","mX2GEzbIYY","8hJdtFnPFB",
+"M3zXL14FLR","JJs5mDcpWB","16lHcCp3mZ","2hEEURBhp0","zY1GYBCxeC","VBjhzuQIcz","48cHLIRh48","he9IApiJSk","kB5nPAIYUu","gtCA55ZaEz",
+"ix74r580YD","7lUXZPb1pa","nnP8o618Di","dmoS75iGN5","dmoS7Gv3Fq","StlDJpvgjS","BGaQYuoStw","uupzk29QAz","6q6L948cHL","5Drn0GSQwj",
+"ciuWziwzGk","7lUXZn8pJ9","vOqCEdjsrv","djsrvqUJMd","JkzUn0BmCy","e6e4zFGzgp","0YAGHDcpWB","L7cGc1j5L8","618DiwiHrZ","HRxd8uLtKs",
+"Yf2EcpT8wu","lkMUA8hJdt","BGaQYWaim6","EoToPSWfou","tvdkDgjUTu","gIYvE29QAz","HzZT8VjCZq","xReeczqH0W","piJSkBFkb8","QworuZuDtD",
+"faHirQnJ1S","IKxdLlpF6W","48cHLZuDtD","piJSk9XyT9","P6bcgQWxoT","EoToPcL0aE","tl72WNAFuw","pWiOs5Namm","t98iWzQt6Q","aez9ygtCA5",
+"jS1ajaFFss","XyPZNUvlv4","DG4sTcQOnv","yluBx5Drn0","Z4I1vFPfSE","No0Qb7X3uy","ReKEWbZLvS","ReKEWh1zcH","QClRLMGlTF","Ul4a1d7vjM",
+"6q6L95ZaEz","7X3uyGrDg7","7fKYUru4UG","jeskSYjB9t","ciuWzrhl0J","5iGN5zqH0W","tlILtguMb8","9XyT9Vprf2","IBe8kC2Irc","iB08ltl72W",
+"vLsmSPYBf4","4QMc9lm0pD","TXQ0ZY1mC0","y94nwRACuj","fcJOyUvlv4","zHF1qlpF6W","pWiOsO3iyQ","piJSkOxWIH","0h1b1dpe1v","zHF1qZJTXH",
+"UlU3MVNCPd","QClRLM3zXL","tvdkDjeskS","n1pmOFcWrW","24ARFCdyBV","MGlTFSjskQ","ECMvUdjsrv","pvgjSaFFss","ulk41he9IA","vkCHHjtn0X",
+"sx5Gl7hyVv","kZANmzQt6Q","uZPqgguMb8","k85AehYBCK","VBjhzVNCPd","L7cGcOHaBz","LbRTHQ6Lix","ydG8UU3yw5","L7cGch1zcH","7fsYMFxX9q",
+"jSjS3aez9y","VIlwPYf2Ec","wDajXFcWrW","Kr8ys580YD","uQIczUl4a1","RkQkeAOgEe","zQt6QuTacx","580YD2Yz7E","Yf2Ecn1pmO","AXpwELDk6f",
+"blLA9faHir","48cHLSbRYy","yToGWlkMUA","9eoRcCK5W7","Ul4a1G1RhS","aez9yeuZA5","KASQ8IBe8k","AOgEeKsjRK","lm0pDJIqXi","s93MlMGlTF",
+"cL0aE3weIF","RpBQmQnJ1S","lpF6WDG4sT","MK07Yv8yFN","fqypyiwzGk","xReecWreyP","Y1mC07Ow5C","CK5W7gdQsS","5IhmGulk41","JRJQBWaWsv",
+"4QMc9QbxXc","HfyNQ1j5L8","s4786cL0aE","0MR5XGXdoH","fqypyblLA9","he9IAZuDtD","pvgjSn1pmO","Mm8sigf8rI","Cp3mZvLsmS","Cfgr31j5L8",
+"taOXKMojnP","2DREsK4GS8","SWfoupv0i7","ix74rRBhp0","fFDrJgf8rI","tlILtuupzk","e6e4z0PktI","2Yz7EbZLvS","Cp3mZZJTXH","hSSvQprNT6",
+"JJs5mFGzgp","48cHL9GXkX","MK07YQssNC","8RCUAMm8si","tAOsr8hJdt","AkKTkjS1aj","OHaBz618Di","zY1GYFcWrW","bZLvSbrhlQ","lkMUAfqypy",
+"ThjNnFnPFB","SjskQB3qem","C2Ircaez9y","QnJ1SpT8wu","azIWpCdyBV","uTacxiB08l","CqqaDo8Uyd","MmKGJn8pJ9","QbxXcUmaEv","QssNC8U2nU",
+"tuDySVjCZq","QworuFhtgl","RsQUqpAhR1","AmdQd1j5L8","xciqpUmaEv","8RCUAbZLvS","8RCUADLhzM","fLNg81LB1L","SmGzvzbIYY","B3qemRmDcr",
+"CdyBV8hJdt","rhl0JUl4a1","lCMxyhUTw7","zHF1qb29RJ","S2Dfu2Yz7E","kZANmdmoS7","14FLRDz1R3","lH1ktazIWp","UmaEvQ6hMC","IKxdLCNHmv",
+"tuDySpvgjS","8RCUAhYBCK","UlU3MkZANm","0h1b1fqypy","RmDcrWaWsv","lm0pDUlU3M","JRJQBsuY4x","SbRYy0h1b1","D6rByblLA9","VBjhzuJScX",
+"SbRYysoy9t","MGlTFW3VFH","kB5nPsqVrf","RkQkea00b5","4W0TlFVMxo","rhl0J16lHc","VBjhzPb1pa","VIlwPTa8f6","Pb1pagtCA5","euZA5kB5nP",
+"pmeCdNxx9V","bgJAzblLA9","bZLvSCfgr3","QbxXccL0aE","faHir5drc6","MezSW4dEz6","TwanotlILt","8U2nUVIlwP","aez9y7X3uy","QnJ1Smz8gx",
+"16lHciqv4k","2TRI7aDGtS","XyPZN1LB1L","wDajX0YAGH","In3NSkZANm","In3NSCNHmv","piJSkjfREu","8xEKztvdkD","hSSvQsoy9t","4W0Tl0Kyfs",
+"X6PinrKDLJ","BCxeCBCxeC","xReecv2eC3","Ul4a1d85a9","7ku1pxciqp","DLhzMJRJQB","4dEz6suY4x","aez9y7hyVv","blLA9l83Ud","lXFOB8cVD3",
+"v1HlnVIlwP","BbwgAk85Ae","v8yFNX6Pin","M3zXLl83Ud","OUYuFCdyBV","OHaBzuTacx","YjB9tpT8wu","pmeCdxXTI4","B3qem16lHc","hUTw7IjTwP",
+"m4bxUCxVEf","StlDJMGlTF","pAhR1Uvlv4","yluBx5iGN5","8U2nU7X3uy","AmdQdtjQxs","TCgPpd85a9","QYxC0l83Ud","JKWYRtl72W","RBhp0t59lR",
+"rhl0JEoToP","48cHLM3zXL","guMb8S77LH","lCMxys7Mxk","4QMc9WMiS3","ThjNnSs0Zu","7ku1p5nmWv","IjTwPTa8f6","ZJTXHjeskS","0Kyfsuvf7A",
+"Yf2EcS2Dfu","9eoRcAIYUu","0KyfsnlaBy","blLA97fsYM","NhXduDQimp","DQimpaez9y","uvf7AM3zXL","6AFT0tvdkD","JkzUnuLtKs","fLNg8tlILt",
+"StlDJZUnqt","cQOnvCNHmv","MaJQsv1Hln","FFDuipFrrl","KASQ8ksJby","0h1b1Gv3Fq","8hJdtHRxd8","xXTI4Z4I1v","tlILtbZLvS","rz7UtaDGtS",
+"VjCZqdQ586","AmdQdzbIYY","mz8gxl83Ud","AIYUuqQxHP","faHirTXQ0Z","v8yFNl83Ud","tvdkDReKEW","Mm8siTCgPp","HP433d85a9","LewvMsoy9t",
+"faHiruupzk","rz7UtFxX9q","kZANmLbRTH","45cIHn8pJ9","RkQkes7Mxk","m4bxUfaHir","hi5X7aez9y","zQt6QO3iyQ","piJSkKASQ8","oVQp6pFrrl",
+"GWqqXQnJ1S","48cHLP6bcg","d85a9IKxdL","bgJAzyvOMI","xXTI448cHL","HRxd8VerEA","v1HlnOUYuF","AXpwEQssNC","fcJOyFGzgp","AmdQdFLsph",
+"RACuj0MR5X","sx5GlLDk6f","EdBKczY1GY","5drc6zqH0W","FLsphCp3mZ","tvdkDQbxXc","5IhmGFLsph","MK07YJ2mQi","aL6AJ8U2nU","Gv3FqpiJSk",
+"yEfy9ulk41","KASQ8U3yw5","3otm6AgJHQ","M6qcGZhwG1","xciqpQYxC0","YOfrYZv7z0","fmIK1tl72W","fLNg8i3pyd","aDGtS580YD","vOqCEm4bxU",
+"hYBCKciuWz","7lUXZwiHrZ","UmaEvtAOsr","Cfgr3ix74r","VBjhzECMvU","n1pmOQWxoT","IjTwPVNCPd","K4GS8FPfSE","FFDuipiJSk","uTacxAXpwE",
+"RpBQmS77LH","BGaQYSs0Zu","Vprf2AmdQd","a00b5MmsIo","5VZjSt98iW","0Wr5y8FmFH","ogLgcyvOMI","5drc6zY1GY","Vprf2ZUnqt","5IhmG7ku1p",
+"sqVrfStlDJ","taOXKrhl0J","WPmlxO3iyQ","VIlwP8FmFH","faHir9eoRc","v8yFNt98iW","7fsYMThjNn","29QAz2Nslm","EoToPni2v1","hE1QliKqhr",
+"jzUqRLewvM","MmsIoSs0Zu","o8UydW3VFH","Gv3FqS77LH","fcwDahYBCK","16lHcOz8yZ","HP433Pb1pa","8cVD3JIqXi","NhXduS2Dfu","7hyVvsuY4x",
+"azIWpzqH0W","pWiOsTa8f6","RsQUqFjHXR","2DREsiB08l","fFDrJQ6hMC","4W0Tlx3LDe","h1zcHZzJHW","v1HlnJJs5m","aL6AJciuWz","W7cTsQssNC",
+"8hJdt8FmFH","Yh1hFvLsmS","VBjhzLDk6f","uN6r3sqVrf","jSjS3FPfSE","NAFuwK20wK","okgRiPb1pa","RkQkepFrrl","jtn0X2DREs","faHirfcJOy",
+"qUJMda00b5","GSQwjzbIYY","CIShG1v5hH","RpBQmsuY4x","AXpwE0MR5X","uZPqgAkKTk","P6bcgFjHXR","B3qematef2","DLhzMNAFuw","mX2GEv1Hln",
+"CqqaDRzaZA","uoStw7Ow5C","pAhR1SmGzv","48cHLydG8U","MaJQsW3VFH","bZLvSiwzGk","ru4UGcShY2","uJScXblLA9","29QAzLbRTH","fcwDafFDrJ",
+"vOqCEQssNC","P6bcgRACuj","aL6AJFxX9q","cShY2OUYuF","fLNg8Vprf2","Ul4a129QAz","IBe8k2Nslm","blLA97Ow5C","HlUbFpvgjS","0h1b1MmKGJ",
+"7X3uyG1RhS","Oz8yZGrDg7","7X3uy5VZjS","tl72WuN6r3","9iGoTokgRi","U3yw5h1zcH","n8pJ9QClRL","WMiS3Waim6","qUJMdgtCA5","64s8NHzZT8",
+"pAhR17Ow5C","RsQUqOHaBz","8U2nUguMb8","P6bcgpv0i7","2DREs6AFT0","tvdkDY1mC0","64s8NUl4a1","i3pyd14FLR","faHirRACuj","AgJHQs7Mxk",
+"yvOMI2Nslm","zmLYDt59lR","rKDLJ45cIH","zbIYYlpF6W","cL0aES77LH","WDVWJFcWrW","cL0aEFNYIM","qaofNcShY2","MaJQs5Drn0","PYBf4zqH0W",
+"Yf2EcW3VFH","xXTI46q6L9","TCgPpP6bcg","pT8wufcJOy","TXQ0ZtuDyS","Pb1pa9y4lw","FNYIMbZLvS","fcJOyW3VFH","a00b5YjB9t","uLtKst59lR",
+"CK5W75ZaEz","qQxHPZzJHW","5IhmGFPfSE","GWqqXazIWp","Cfgr3gjUTu","48cHLRpBQm","NhXduUlU3M","guMb8jtn0X","hE1QlFPfSE","16lHcReKEW",
+"uLtKsTCgPp","pmeCdVBjhz","pAhR1Chuy3","UlU3M5Namm","TwanoThjNn","2ZHdkQWxoT","DQimpe6e4z","iKqhrQnJ1S","yluBxLewvM","HRxd87Ow5C",
+"QWxoTGSQwj","n8pJ9RACuj","v1HlnaDGtS","azIWp5drc6","BFkb8okgRi","jeskSKZamH","0PktIQ6Lix","EoToPBFkb8","pmeCdW7cTs","hSSvQuN6r3",
+"I7p2aCfgr3","TXQ0ZGrDg7","sx5Gl16lHc","Z4I1v5nmWv","xReecFwEJz","uPX7GPb1pa","v1HlnOHaBz","dQ586sqVrf","8xEKzn8pJ9","MaJQsVjCZq",
+"KsjRKdhSuH","OHaBzSbRYy","M6qcGHP433","vOqCEhe9IA","F6PT2Q6Lix","P6bcg0YAGH","lXFOBYh1hF","brhlQWmadA","uAWypLewvM","jSjS3BCxeC",
+"rz7Utsoy9t","uoStwtlILt","euZA5gdQsS","RzaZAdQ586","oQ87roQ87r","mz8gxWreyP","FxX9qDz1R3","pAhR11v5hH","5VZjSzHF1q","Ul4a12TRI7",
+"zHF1qe6e4z","y94nwQClRL","ZUnqtB3qem","qUJMdAgJHQ","XyPZNyEfy9","2hEEUUvlv4","okgRinnP8o","iwzGkS77LH","StlDJdmoS7","GXdoH55rfB",
+"HP4330YAGH","4QMc9Zv7z0","okgRiJJs5m","VLTy6JKWYR","FGzgpeuZA5","RzaZA48cHL","3otm6WaWsv","piJSkIRh48","WMiS3pAhR1","WDVWJF6PT2",
+"EdBKcOHaBz","xReeclweGy","5Mg9rS77LH","cmXIXFjHXR","zQt6Qfqypy","XflUqNcICA","FVMxoK20wK","tuDySFNYIM","14FLRyofH3","AgJHQY1mC0",
+"29QAzpT8wu","QWxoTF6PT2","tuDyS8TxD7","yToGWWMiS3","IjTwPReKEW","kZANmFPfSE","d7vjMaDGtS","ogLgchSSvQ","MK07YYf2Ec","HfyNQMK07Y",
+"EOE1otjQxs","VjCZqYw2oU","brhlQAmdQd","Ul4a1ZUnqt","45cIH5Namm","n1pmOS2Dfu","FxX9qU3yw5","P6bcgCqqaD","faHirhe9IA","1v5hH7X3uy",
+"W7cTs2ZHdk","VBjhz0MR5X","X6PinWDVWJ","uN6r348cHL","DG4sTReKEW","OUYuFM3zXL","HRxd8mz8gx","VerEA5iGN5","MmKGJLewvM","YjB9tlViBv",
+"SbRYycL0aE","AIYUuFhtgl","TwanoKr8ys","QChxsTXQ0Z","TCgPpIn3NS","7ku1pZ4I1v","5iGN5FcWrW","lCMxyn1pmO","XflUqtjQxs","DcpWBy94nw",
+"SbRYyjeskS","IjTwPuAWyp","DcpWBaFFss","2Yz7E8FmFH","uJScXChuy3","yToGWS2Dfu","9rlg9ZhwG1","5drc6fLNg8","RsQUqGXdoH","ZUnqtru4UG",
+"Uvlv4G1RhS","zqH0W2ZHdk","bgJAzKsjRK","S77LHcmXIX","6AFT0xXTI4","3otm6s93Ml","9GXkXDcpWB","FwEJzy94nw","Yh1hFMGlTF","wiHrZXyPZN",
+"lXFOBO3iyQ","RACuj07n1c","Dz1R3QClRL","jSjS3lj07Q","BFkb8y94nw","2TRI7blLA9","uJScXbrhlQ","iqv4kvkCHH","Y1mC024ARF","jS1ajPOUYS",
+"7lUXZPOUYS","9rlg98RCUA","zY1GYFFDui","FwEJzksJby","t59lRciuWz","ECMvUCK5W7","tuDySYw2oU","6q6L955rfB","zmLYDMaJQs","okgRiFnPFB",
+"0h1b1prNT6","uupzkS2Dfu","brhlQAgJHQ","oVQp6kB5nP","HzZT8JXljW","OUYuFFjHXR","s4786JXljW","K4GS8ni2v1","yToGWix74r","hSSvQ5Drn0",
+"16lHcTCgPp","wiHrZpFrrl","FNYIMuZPqg","mz8gxo8Uyd","piJSk6AFT0","kB5nPRmDcr","dpe1v5iGN5","VIlwPReKEW","5Drn0rKDLJ","0Wr5y2Nslm",
+"aL6AJfaHir","PYBf4UlU3M","IjTwPs4786","6q6L9SmGzv","6AFT0X6Pin","Ta8f67Ow5C","FPfSEOUqFM","SjskQQYxC0","0KyfsMkgy8","OHaBzyluBx",
+"HP433Ta8f6","lViBvSmGzv","FhtglaFFss","POUYSoGu6x","FwEJzU3yw5","qQxHPK20wK","8xEKztlILt","ogLgcdpe1v","lH1ktWaWsv","In3NS7fKYU",
+"pT8wu2Yz7E","Q6hMCksJby","he9IA6AFT0","vkCHHs4786","gIYvEGWqqX","AXpwED6rBy","RsQUqgdQsS","yofH3prNT6","vLsmSoVQp6","Waim6KsjRK",
+"YjB9t5IhmG","LbRTHSs0Zu","Y1mC0yvOMI","jzUqR1j5L8","yvOMI8cVD3","HfyNQt98iW","5VZjSoGu6x","vkCHHciuWz","gf8rIHzZT8","QnJ1SOz8yZ",
+"CdyBVzHF1q","piJSk0YAGH","kZANmKZamH","lCMxyfcJOy","s4786wiHrZ","No0QbpvgjS","8FmFHYjB9t","55rfBjzUqR","8hJdt5Namm","lCMxygf8rI",
+"Ul4a1ogLgc","oQ87rs7Mxk","HfyNQ580YD","VBjhze6e4z","NcICARACuj","yluBxx3LDe","BCxeCQChxs","5NammgIYvE","jiVBPWaim6","cQOnvoGu6x",
+"GrDg7m4bxU","RACujFwEJz","fLNg8d85a9","Vprf2tvdkD","UlU3MdmoS7","AXpwEKsjRK","KZamHI7p2a","Yh1hFUmaEv","RzaZAEdBKc","JJs5mYOfrY",
+"5nmWv2TRI7","Cfgr3lm0pD","MmsIozY1GY","8cVD36q6L9","ksJbyxXTI4","No0QbIKxdL","hE1QlOz8yZ","IRh48hi5X7","Mkgy89rlg9","hSSvQeuZA5",
+"t59lRNxx9V","NOHszC2Irc","x3LDeCp3mZ","8xEKzt98iW","BCxeCblLA9","hYBCKx3LDe","NhXdupAhR1","HzZT8fcJOy","uoStw9y4lw","piJSkX6Pin",
+"bgJAza00b5","AgJHQRsQUq","VLTy6O3iyQ","SmGzvtvdkD","5Drn0RkQke","BbwgAzQt6Q","xXTI4oVQp6","uvf7ACfgr3","Kr8ysNxx9V","gf8rIAkKTk",
+"IKxdLVjCZq","jiVBPDcpWB","yEfy9BGaQY","hUTw7uLtKs","lj07QXyPZN","8xEKzpAhR1","2ZHdkazIWp","5NammxXTI4","BpYhV2ZHdk","7ku1pFnPFB",
+"oGu6xX6Pin","MmsIo8hJdt","jfREu0MR5X","k85AeJIqXi","brhlQjS1aj","KASQ8Zv7z0","JXljWRpBQm","3otm6zQt6Q","7lUXZRpBQm","cmXIXSmGzv",
+"MaJQsGSQwj","pFrrlSbRYy","NOHsz7Ow5C","dQ586FGzgp","29QAz2DREs","Yw2oU9GXkX","vkCHHpWiOs","NOHszLbRTH","b29RJ5Drn0","tvdkDQWxoT",
+"rz7UtIRh48","Q6LixyEfy9","AXpwEHP433","aFFsstjQxs","dmoS7VIlwP","8RCUA5drc6","kB5nPydG8U","zFgtBv2eC3","OUYuF8RCUA","QssNCNOHsz",
+"07n1cuN6r3","QYxC0v8yFN","Yf2EcGv3Fq","guMb8t59lR","8cVD3Yh1hF","lweGyI7p2a","k85AeK20wK","Yh1hFuLtKs","sqVrfWDVWJ","P6bcg9eoRc",
+"ZhwG1HlUbF","yvOMINhXdu","BCxeCK4GS8","8xEKzoVQp6","prNT6bgJAz","7lUXZCdyBV","yofH3hYBCK","JRJQB2ZHdk","5nmWvJIqXi","ru4UGv2eC3",
+"7fsYM580YD","gdQsSQWxoT","pWiOspvgjS","IKxdLjtn0X","x3LDe9rlg9","W7cTsv1Hln","uN6r3l83Ud","Dz1R3d85a9","ulk41FxX9q","8cVD3FVMxo",
+"kB5nP8U2nU","jeskS5nmWv","lpF6W07n1c","BbwgAQ6Lix","D6rBy0MR5X","CdyBVmX2GE","4dEz6pv0i7","h1zcHt59lR","Cfgr3XflUq","Gv3FqRBhp0",
+"J2mQi8FmFH","07n1cIBe8k","NcICAVIlwP","K4GS8oQ87r","tl72WTCgPp","lH1ktZzJHW","ciuWz48cHL","ZhwG1Mkgy8","uupzkQ6Lix","CIShGrhl0J",
+"5iGN5v2eC3","rhl0JKASQ8","Oz8yZK4GS8","qUJMdOHaBz","faHirlXFOB","7fKYUKsjRK","BFkb84W0Tl","zz4ZU7ku1p","dhSuHzQt6Q","DcpWBix74r",
+"5iGN5580YD","B3qemYh1hF","HlUbF9iGoT","GWqqX2ZHdk","Dz1R30ao3l","Gv3FqtaOXK","0YAGHuZPqg","5iGN5uupzk","DcpWBUl4a1","atef2Ta8f6",
+"yEfy9ydG8U","Cp3mZWaWsv","RsQUqzY1GY","Pb1pa1LB1L","tvdkD0BmCy","0Wr5y4W0Tl","UmaEvlweGy","FxX9q8cVD3","cShY2QnJ1S","ReKEWIBe8k",
+"ciuWz3otm6","rKDLJZzJHW","5nmWvNxx9V","Yf2EcM3zXL","bZLvSOxWIH","xXTI48TxD7","S2DfuUmaEv","sqVrfJRJQB","GrDg7OUYuF","8U2nUzY1GY",
+"LDk6fyofH3","WreyPY1mC0","uvf7AFhtgl","lH1ktiwzGk","7hyVvsqVrf","VIlwPXflUq","TCgPpTwano","uupzkQWxoT","MmsIoVprf2","s47865VZjS",
+"lkMUA7fKYU","okgRizFgtB","HP43316lHc","YOfrYMm8si","atef2HfyNQ","6q6L9OUqFM","SjskQlXFOB","zFgtBfLNg8","CdyBVOxWIH","sqVrfIBe8k",
+"Kr8ysWaim6","e6e4zFLsph","CqqaDpT8wu","MmKGJLbRTH","0ao3l7X3uy","d85a9FxX9q","PYBf4RmDcr","rhl0Jxciqp","taOXKQChxs","gf8rIyluBx",
+"Vprf2JIqXi","uupzkPb1pa","FnPFBW7cTs","RsQUqCdyBV","S77LH7Ow5C","Qworu7Ow5C","zbIYY2DREs","0BmCy8U2nU","ulk41lViBv","C2IrcguMb8",
+"CK5W7SmGzv","i3pydFGzgp","G1RhSv1Hln","45cIHIKxdL","uupzktl72W","QChxsPYBf4","pT8wu0MR5X","djsrvOUYuF","hi5X7hE1Ql","B3qemCp3mZ",
+"AmdQd8RCUA","5iGN52hEEU","DG4sTuZPqg","oVQp6ix74r","brhlQWDVWJ","kB5nPDG4sT","yluBxBFkb8","Gv3FqCfgr3","d85a9okgRi","3weIFbgJAz",
+"RzaZAQbxXc","jfREufLNg8","uTacxTwano","VBjhzHfyNQ","Z4I1vAOgEe","kZANmogLgc","IjTwPix74r","v2eC3xXTI4","cQOnvCIShG","ydG8UoGu6x",
+"lCMxyIBe8k","BGaQYJKWYR","tuDySFjHXR","RpBQmSbRYy","CIShGlXFOB","d85a9JkzUn","SWfou5Mg9r","8FmFH0BmCy","fcJOyDQimp","VIlwP5Mg9r",
+"faHirdjsrv","aFFssJRJQB","oVQp62ZHdk","ZuDtDaDGtS","v1Hln0YAGH","iqv4kBbwgA","lViBvhi5X7","NhXduaL6AJ","Zv7z0atef2","RACujL7cGc",
+"dpe1vQssNC","WaWsva00b5","ZUnqt5drc6","jfREuhe9IA","gtCA5x3LDe","piJSkGrDg7","wiHrZHRxd8","pAhR18RCUA","DG4sTgf8rI","uQIczKsjRK",
+"brhlQB3qem","8hJdtBGaQY","SmGzvhSSvQ","RsQUqQYxC0","WDVWJ3weIF","LDk6fJIqXi","fcwDaIBe8k","CxVEf580YD","jtn0XMm8si","atef2GWqqX",
+"NOHszOz8yZ","PYBf448cHL","JJs5mi7WMQ","djsrvCNHmv","sqVrfuvf7A","SbRYy07n1c","s93MllsQGo","XyPZNThjNn","2Yz7EFPfSE","iwzGkCxVEf",
+"UmaEvYf2Ec","0MR5XBCxeC","14FLR7ku1p","C2IrcuTacx","HfyNQZ4I1v","5iGN5C2Irc","Q6hMCDcpWB","d7vjMFPfSE","dmoS7tvdkD","Ul4a1uJScX",
+"iB08l5drc6","FLsphEoToP","bZLvSGv3Fq","rKDLJUlU3M","In3NSdhSuH","m4bxUtAOsr","48cHLt98iW","gdQsSW7cTs","dQ586fmIK1","GWqqXfaHir",
+"ZzJHWzFgtB","S77LH9eoRc","HfyNQs7Mxk","zY1GYU3yw5","tvdkDpvgjS","vkCHHuPX7G","ksJbyECMvU","TwanouAWyp","s7MxkIn3NS","lm0pDHRxd8",
+"zFgtBDcpWB","2ZHdkuAWyp","5nmWvt59lR","i7WMQydG8U","HlUbFCxVEf","DQimpv2eC3","uAWypWreyP","VjCZqhYBCK","soy9tGWqqX","G1RhSNOHsz",
+"9iGoTIRh48","YjB9tYh1hF","IjTwPWreyP","jiVBPiKqhr","wiHrZvkCHH","ZzJHWFxX9q","zqH0WSmGzv","faHiraDGtS","9GXkXuAWyp","PYBf4SbRYy",
+"BbwgAHzZT8","uQIcz07n1c","Yh1hFMK07Y","ni2v1atef2","sqVrf9iGoT","QWxoTxXTI4","yvOMI2hEEU","gdQsSgf8rI","BpYhV5IhmG","aFFsst59lR",
+"BFkb8zbIYY","s93MlzY1GY","ru4UGHRxd8","TXQ0ZX6Pin","uAWyp1LB1L","lCMxylm0pD","Yf2EchUTw7","8cVD35ZaEz","9XyT9VBjhz","G1RhSBCxeC",
+"DLhzMtl72W","IKxdLNhXdu","kB5nP1v5hH","gtCA5vkCHH","7lUXZhUTw7","xReecuLtKs","FxX9qcShY2","Kr8yst59lR","okgRi6q6L9","HP433AmdQd",
+"uLtKsfFDrJ","YjB9tjSjS3","tl72W0PktI","DG4sTGv3Fq","9eoRc8FmFH","CdyBVt98iW","ECMvUhE1Ql","SjskQqQxHP","cmXIXdpe1v","oQ87rwiHrZ",
+"yEfy9uZPqg","Mkgy80Kyfs","uPX7G16lHc","45cIHMm8si","9iGoT9rlg9","ciuWz0Kyfs","S77LHrz7Ut","8xEKzpmeCd","QbxXcMojnP","QnJ1SVjCZq",
+"ulk410ao3l","9XyT98cVD3","zz4ZUFnPFB","cL0aETCgPp","zFgtBcQOnv","RpBQmLbRTH","JJs5mXflUq","WmadAzmLYD","yvOMIDz1R3","ni2v1QbxXc",
+"Oz8yZ24ARF","55rfBpvgjS","t59lRGXdoH","2ZHdkciuWz","qQxHPzFgtB","qUJMdxReec","UlU3MlH1kt","580YDfqypy","pmeCdDz1R3","lj07QaFFss",
+"5nmWvDG4sT","i3pydKsjRK","FwEJzHfyNQ","n8pJ9OHaBz","MezSWzbIYY","9GXkXoQ87r","blLA9prNT6","AIYUuZUnqt","nnP8oZ4I1v","YOfrYTCgPp",
+"he9IApWiOs","gdQsSQYxC0","sqVrfM6qcG","W3VFHzY1GY","CIShG45cIH","yEfy9ZJTXH","Q6LixQYxC0","zmLYDa00b5","uPX7GRmDcr","KZamHEOE1o",
+"qaofNsqVrf","pAhR1zbIYY","Ul4a1K4GS8","k85Aes7Mxk","5nmWvW3VFH","hE1QlG1RhS","QnJ1SeuZA5","y94nwhi5X7","RxrsmCNHmv","AXpwEQClRL",
+"QClRLS77LH","GSQwji7WMQ","TXQ0ZQbxXc","VerEAStlDJ","tl72W4W0Tl","ThjNnAIYUu","pAhR107n1c","Fhtglv1Hln","GWqqXpT8wu","GSQwjlpF6W",
+"WmadA7Ow5C","8TxD7UlU3M","guMb8k85Ae","iKqhrtaOXK","B3qemRsQUq","8TxD7m4bxU","Q6hMCHP433","guMb8VBjhz","OUYuFFwEJz","aez9yd7vjM",
+"DLhzM9GXkX","EOE1olXFOB","dpe1vt98iW","Yh1hF4W0Tl","1v5hHv1Hln","mX2GE2DREs","VBjhzQClRL","t98iWKASQ8","FnPFBNo0Qb","uAWypPOUYS",
+"Yf2EcrKDLJ","CxVEf3otm6","O3iyQ5VZjS","pvgjSzqH0W","1v5hHU3yw5","F6PT2FcWrW","zFgtBtl72W","Cfgr3tvdkD","29QAzzFgtB","U3yw57fsYM",
+"OHaBzNOHsz","KsjRKW7cTs","rz7Ut8TxD7","Oz8yZ6q6L9","L7cGchE1Ql","lCMxyJXljW","JKWYRCNHmv","MGlTFQnJ1S","UmaEvsqVrf","gdQsSaFFss",
+"dhSuHHP433","0Wr5yMmKGJ","ogLgcZUnqt","SbRYyhi5X7","29QAz16lHc","2ZHdkQClRL","J2mQiOHaBz","FPfSErKDLJ","v2eC3tl72W","pT8wuyluBx",
+"aez9y5Drn0","jeskS5iGN5","nlaByfcJOy","zY1GYzHF1q","CdyBVwiHrZ","iB08lRmDcr","uN6r3prNT6","Z4I1vn1pmO","8hJdtuTacx","aL6AJHfyNQ",
+"nlaBywiHrZ","zqH0W5IhmG","Dz1R3xXTI4","DG4sTVBjhz","ogLgcFLsph","Chuy3guMb8","9XyT99GXkX","P6bcgxReec","3otm6uPX7G","OxWIHaez9y",
+"dhSuHfqypy","hYBCKIBe8k","blLA9WmadA","zmLYDlCMxy","nlaByMGlTF","HP433HRxd8","4dEz6bZLvS","S2Dfui3pyd","8xEKzCqqaD","Kr8ysBbwgA",
+"O3iyQUlU3M","uLtKsb29RJ","Chuy3zmLYD","8U2nUBGaQY","9iGoTY1mC0","tjQxsxXTI4","taOXKOxWIH","VjCZqUlU3M","hYBCKTwano","W3VFHPb1pa",
+"BGaQYAIYUu","ECMvU64s8N","cL0aElj07Q","Chuy3QbxXc","iwzGk6q6L9","jS1ajzqH0W","mX2GE4W0Tl","nFqikvLsmS","VNCPdFxX9q","QWxoTprNT6",
+"FhtglECMvU","s93Ml0Kyfs","v8yFND6rBy","NhXdu9eoRc","lpF6WnnP8o","PYBf4d7vjM","M6qcGPOUYS","24ARFyEfy9","NcICAXyPZN","2ZHdkIRh48",
+"Vprf2LewvM","GXdoHgIYvE","qQxHPcL0aE","ydG8UqUJMd","uQIczUmaEv","AkKTkru4UG","QClRLhE1Ql","fcJOyBFkb8","uupzkdpe1v","CIShGCIShG",
+"IBe8krKDLJ","JkzUn7fsYM","uZPqg0MR5X","lm0pDaFFss","AIYUuVerEA","5drc6BCxeC","fFDrJuvf7A","NAFuwlweGy","QYxC0yvOMI","pmeCdWmadA",
+"uZPqgVBjhz","SmGzvqaofN","y94nwgjUTu","i7WMQWMiS3","prNT6NOHsz","Mm8sidQ586","9XyT9RzaZA","wiHrZBFkb8","Ss0ZuCNHmv","CK5W7IBe8k",
+"7ku1pFGzgp","RmDcrM3zXL","uupzkEOE1o","K4GS8Nxx9V","M6qcGOUqFM","M6qcGFwEJz","fqypy7lUXZ","uPX7GFLsph","AmdQd5ZaEz","gf8rIazIWp",
+"h1zcHtAOsr","ru4UGwDajX","StlDJuupzk","yluBxjiVBP","P6bcgQworu","2hEEUQChxs","fmIK1uupzk","GrDg7l83Ud","cmXIXlViBv","LewvM5drc6",
+"iB08lfcJOy","2ZHdkJkzUn","CIShGRpBQm","MK07YRkQke","pv0i7Vprf2","iqv4kPOUYS","OUqFMnFqik","ZhwG1sqVrf","djsrvs93Ml","2Nslm07n1c",
+"cQOnvazIWp","aFFsszz4ZU","HP433IBe8k","BpYhVtvdkD","lCMxyMojnP","xXTI4U3yw5","3weIFn1pmO","9iGoTpT8wu","k85Ae29QAz","IKxdLJRJQB",
+"MGlTFwiHrZ","DLhzMhYBCK","7X3uyFGzgp","FwEJzEoToP","vLsmS6AFT0","7Ow5CF6PT2","zHF1qtvdkD","1j5L8QChxs","0Wr5yvLsmS","QClRLVBjhz",
+"x3LDedpe1v","W7cTsOz8yZ","Pb1paSmGzv","hSSvQNOHsz","29QAz9iGoT","QnJ1S5drc6","16lHche9IA","qUJMdbrhlQ","iwzGk2Yz7E","FLsphAOgEe",
+"XflUqNhXdu","s4786cShY2","HlUbFHRxd8","7fKYUMmKGJ","0Wr5yaez9y","4QMc94QMc9","dmoS7FPfSE","Waim6pT8wu","FFDuix3LDe","Mkgy8BpYhV",
+"WmadAfaHir","yToGWCxVEf","nnP8oAXpwE","mz8gxRpBQm","BpYhVt59lR","xciqpVIlwP","lj07Q2Yz7E","dpe1v8xEKz","fmIK1Vprf2","rhl0JfaHir",
+"7fsYMsqVrf","aDGtS0h1b1","BCxeCyToGW","JIqXijfREu","W3VFHC2Irc","55rfBvkCHH","6q6L9cL0aE","0PktIulk41","atef2lH1kt","zz4ZUDLhzM",
+"DG4sTGWqqX","7hyVvlweGy","ZUnqtSs0Zu","S77LHiqv4k","Nxx9VZhwG1","MGlTFPOUYS","C2Irc1j5L8","MmKGJatef2","RsQUqn8pJ9","qUJMdmz8gx",
+"ni2v1kZANm","Z4I1vatef2","fmIK1nFqik","zFgtBJJs5m","HzZT8SWfou","IjTwPLDk6f","mz8gxdQ586","x3LDe5VZjS","mz8gxxReec","uQIcziqv4k",
+"yvOMIs7Mxk","AgJHQMK07Y","tuDySNhXdu","hi5X7QChxs","cQOnvprNT6","lViBvYOfrY","LDk6fOUqFM","6AFT08cVD3","cmXIXMojnP","TCgPpdmoS7",
+"07n1cuLtKs","gjUTu2ZHdk","TXQ0ZAgJHQ","9rlg9EdBKc","FcWrW6q6L9","zQt6Qh1zcH","vkCHHWDVWJ","uvf7AzqH0W","2ZHdky94nw","8U2nUBFkb8",
+"e6e4zCp3mZ","ydG8UNAFuw","QnJ1SNAFuw","ksJby9y4lw","RBhp0OHaBz","YjB9taez9y","7fsYMdQ586","jtn0XfcJOy","s4786taOXK","tuDyScL0aE",
+"RkQke8RCUA","5iGN5VLTy6","rhl0JcShY2","dhSuHCp3mZ","rKDLJ07n1c","0h1b1vLsmS","QChxs5drc6","LbRTHuAWyp","QbxXckZANm","cQOnvuupzk",
+"y94nwulk41","hSSvQWreyP","FGzgpfmIK1","5iGN5iKqhr","nnP8o0PktI","ksJbyzbIYY","faHirKsjRK","jeskSfqypy","n8pJ9dmoS7","No0Qbgf8rI",
+"KsjRKSbRYy","6q6L9pAhR1","TCgPpMmsIo","8FmFHdpe1v","ReKEWJJs5m","RxrsmG1RhS","X6Pinxciqp","Mm8siuAWyp","rhl0J2DREs","piJSkpWiOs",
+"lj07QokgRi","cmXIXuPX7G","4dEz6AXpwE","4W0TlCNHmv","yvOMIaL6AJ","2NslmpFrrl","ru4UGFNYIM","8xEKzZUnqt","QworupvgjS","7fsYMyluBx",
+"07n1cJkzUn","KASQ8I7p2a","VjCZqs93Ml","s93MlaDGtS","wiHrZ0MR5X","rKDLJfLNg8","K20wK0MR5X","NAFuwk85Ae","lViBvDG4sT","prNT6nFqik",
+"suY4xCK5W7","0h1b1Q6Lix","EdBKcM3zXL","ZUnqtmX2GE","VNCPdlXFOB","aL6AJSmGzv","lXFOBgIYvE","OxWIHuLtKs","MK07Y0ao3l","1LB1LCp3mZ",
+"iwzGkVjCZq","CIShGt59lR","WreyPGWqqX","nlaByazIWp","5iGN5pv0i7","a00b545cIH","M3zXLv2eC3","5Drn0FGzgp","BFkb89XyT9","n8pJ9IBe8k",
+"3otm6RsQUq","G1RhSNAFuw","xciqpQ6hMC","djsrvSs0Zu","P6bcgs7Mxk","DG4sTfaHir","Fhtgl6q6L9","v2eC3piJSk","i3pyds7Mxk","lweGylkMUA",
+"ni2v1zQt6Q","0KyfsBGaQY","JXljWqaofN","aDGtSnlaBy","bZLvS07n1c","BGaQYAmdQd","DcpWBl83Ud","4QMc9lkMUA","QssNClsQGo","1v5hHfcJOy",
+"AOgEennP8o","SmGzv0PktI","5NammlkMUA","WDVWJaL6AJ","IRh48cmXIX","oGu6xtuDyS","RxrsmMK07Y","MGlTF5drc6","fLNg8CdyBV","QssNCM3zXL",
+"zHF1qnlaBy","OxWIHCK5W7","KZamHCNHmv","MezSW2TRI7","FLsphXflUq","9XyT9cShY2","9iGoTv2eC3","ulk41W7cTs","gjUTu1LB1L","sqVrf0Wr5y",
+"nFqikYw2oU","QClRLVjCZq","1j5L8hUTw7","xXTI4FnPFB","3otm6JJs5m","W3VFHhi5X7","HP433gdQsS","16lHcLDk6f","ReKEWQbxXc","yToGW2TRI7",
+"Chuy364s8N","BGaQYXyPZN","QClRLhYBCK","xciqpMmKGJ","UlU3M1j5L8","S77LHnFqik","GXdoH1LB1L","0Wr5y7lUXZ","sx5GliwzGk","uTacxBFkb8",
+"DQimpjSjS3","CdyBVKZamH","gf8rI8xEKz","6AFT016lHc","pWiOsgjUTu","Vprf2suY4x","djsrv2Yz7E","s7MxkpiJSk","0ao3lHRxd8","MmKGJuPX7G",
+"DcpWBFVMxo","FPfSEdQ586","gdQsSFcWrW","07n1cQssNC","HlUbF8RCUA","Mkgy8WmadA","K20wKfaHir","0KyfszmLYD","yluBxvLsmS","VLTy6YjB9t",
+"Mkgy8EdBKc","VjCZq07n1c","QYxC02ZHdk","Dz1R3580YD","Gv3Fq4W0Tl","4W0TllCMxy","VIlwPSs0Zu","8hJdtuvf7A","48cHLPOUYS","cShY2Yw2oU",
+"HlUbFk85Ae","ru4UGiqv4k","v2eC3B3qem","Q6LixcQOnv","uTacxiqv4k","ReKEWQ6Lix","VNCPdWmadA","fLNg8SjskQ","aDGtSMm8si","ZzJHWHRxd8",
+"vOqCE5IhmG","VLTy6Fhtgl","zY1GYFGzgp","ZhwG1CdyBV","Ss0ZuOxWIH","s93MlMkgy8","Vprf21LB1L","YOfrYuPX7G","QnJ1SDz1R3","55rfBo8Uyd",
+"iqv4kciuWz","FxX9qCp3mZ","XflUq9rlg9","14FLRRACuj","HfyNQDG4sT","JJs5mnFqik","DLhzMRkQke","GSQwjlj07Q","Cfgr3CqqaD","aez9ynnP8o",
+"Zv7z08RCUA","kZANm7X3uy","9iGoTCxVEf","5ZaEzBbwgA","okgRiyluBx","SWfou6AFT0","pvgjSD6rBy","zHF1q14FLR","No0QbAgJHQ","RACujciuWz",
+"uAWypmz8gx","16lHcl83Ud","l83UdGSQwj","Mkgy8QbxXc","D6rByDLhzM","dmoS7EdBKc","suY4xpAhR1","K4GS81j5L8","6q6L9KASQ8","FFDuiuupzk",
+"jiVBPGrDg7","Yh1hFFVMxo","lkMUAjS1aj","7Ow5Cni2v1","VNCPdm4bxU","In3NS0ao3l","64s8NFcWrW","uJScXfFDrJ","1LB1L5iGN5","RzaZAAXpwE",
+"48cHLO3iyQ","FFDuiDG4sT","RBhp08U2nU","VLTy6HRxd8","lj07Qo8Uyd","x3LDeK20wK","yvOMI7fsYM","piJSk2DREs","AmdQd9iGoT","RmDcrlH1kt",
+"ReKEWwDajX","AgJHQC2Irc","blLA9KZamH","ulk41ZzJHW","FwEJziqv4k","5iGN53weIF","iqv4kdmoS7","FhtglMK07Y","aL6AJZv7z0","ThjNnzbIYY",
+"VjCZqAXpwE","L7cGc5Mg9r","i3pyduAWyp","i3pydQWxoT","OHaBzKZamH","S77LHJkzUn","QChxsUmaEv","B3qemDLhzM","64s8NMK07Y","5iGN5pWiOs",
+"djsrv3otm6","45cIHhUTw7","ReKEWFGzgp","VLTy65Namm","yToGWYh1hF","iwzGkiB08l","ru4UGQbxXc","Ul4a1PYBf4","24ARFEdBKc","Twanod7vjM",
+"zz4ZUi7WMQ","NcICACqqaD","atef2Mm8si","pWiOsC2Irc","lsQGo8cVD3","JRJQBY1mC0","lpF6WTCgPp","YOfrYL7cGc","lCMxyoQ87r","FjHXRRACuj",
+"Y1mC0iKqhr","lCMxy5IhmG","Cp3mZzHF1q","1v5hH6AFT0","gjUTu1v5hH","VBjhzfLNg8","MezSWYf2Ec","zqH0WzHF1q","Ta8f6qQxHP","HP433tlILt",
+"xciqp7fKYU","ZUnqt16lHc","07n1c6q6L9","5Mg9rLewvM","ZhwG1KASQ8","zFgtBAgJHQ","nFqikvOqCE","B3qem9GXkX","7ku1pgf8rI","zQt6Q1j5L8",
+"XyPZNrz7Ut","LDk6fsx5Gl","Uvlv4uTacx","WmadABpYhV","8hJdtuPX7G","RkQkeQworu","s7MxkcShY2","MezSWZv7z0","LDk6fa00b5","ZUnqtAgJHQ",
+"0BmCy5VZjS","zqH0WGWqqX","pT8wuX6Pin","Waim6CdyBV","ZuDtD2hEEU","No0Qb8cVD3","0h1b1CIShG","4W0Tlrhl0J","0BmCyK20wK","e6e4z5ZaEz",
+"D6rByJJs5m","K20wK8xEKz","AmdQdRsQUq","hYBCKdmoS7","3weIF7hyVv","guMb8y94nw","pvgjSpv0i7","BCxeC7fKYU","5Drn0qUJMd","9eoRclH1kt",
+"8cVD3lCMxy","EOE1oX6Pin","FPfSEWMiS3","0BmCyvLsmS","tlILtn1pmO","ksJby9XyT9","prNT6OxWIH","B3qemFPfSE","y94nwSbRYy","0Wr5y5IhmG",
+"M6qcGh1zcH","lH1ktDQimp","uLtKso8Uyd","VIlwPiwzGk","qaofN7hyVv","vLsmSLDk6f","W7cTs3weIF","wiHrZiwzGk","taOXKuN6r3","TXQ0ZHzZT8",
+"MK07YFLsph","JIqXi5drc6","16lHcfmIK1","RxrsmZhwG1","tAOsrZJTXH","CK5W7Ul4a1","5IhmG8hJdt","sx5Gls7Mxk","t98iWKZamH","9y4lwEoToP",
+"nFqikciuWz","OHaBzQWxoT","AkKTkpvgjS","sqVrfuPX7G","AgJHQ2ZHdk","o8UydQWxoT","x3LDev1Hln","t59lRGWqqX","nFqiknFqik","e6e4zkZANm",
+"ciuWzlH1kt","JXljWkB5nP","0YAGHguMb8","FLsphFLsph","K4GS8WDVWJ","Yh1hFOHaBz","7fKYU7X3uy","lsQGouLtKs","07n1c14FLR","o8UydjSjS3",
+"FPfSEnFqik","tuDyS48cHL","lH1ktPOUYS","QnJ1SQ6hMC","Oz8yZzY1GY","ECMvUQbxXc","pFrrlF6PT2","lweGyPb1pa","9XyT9nFqik","WPmlxGv3Fq",
+"Yf2EcKASQ8","GXdoH0PktI","h1zcHlpF6W","ulk41guMb8","zbIYYydG8U","VerEATwano","JRJQBNhXdu","xciqpoQ87r","lH1ktuTacx","7fKYUciuWz",
+"G1RhSVNCPd","ZhwG1BpYhV","zqH0WgIYvE","QnJ1SxReec","S2DfunlaBy","MaJQsRmDcr","DG4sT2TRI7","iKqhrGv3Fq","oQ87rzbIYY","0Wr5yFVMxo",
+"uJScXhE1Ql","s4786jS1aj","yofH3DG4sT","pmeCdKr8ys","taOXKdQ586","vLsmSUvlv4","prNT6gdQsS","O3iyQtjQxs","zQt6QWaWsv","JkzUnfFDrJ",
+"S77LHVprf2","WaWsvIjTwP","zY1GYsqVrf","L7cGcWaWsv","dQ586qQxHP","QnJ1S48cHL","brhlQFxX9q","HlUbFWreyP","9iGoThi5X7","rz7Utv2eC3",
+"nFqikpvgjS","Waim6UlU3M","zbIYYzHF1q","FcWrWbrhlQ","8TxD7Kr8ys","djsrv6q6L9","64s8NFNYIM","5iGN5S2Dfu","HzZT8VNCPd","1j5L8sx5Gl",
+"HRxd84QMc9","9GXkXhUTw7","Vprf2RACuj","yluBxv1Hln","OUqFM0Kyfs","2Yz7E5iGN5","hi5X7P6bcg","y94nwgtCA5","B3qemFLsph","AkKTkuLtKs",
+"uJScXRACuj","ECMvUDcpWB","oGu6xMGlTF","Z4I1vtvdkD","0YAGHgjUTu","a00b5Yw2oU","CqqaDOHaBz","14FLRWaim6","pv0i7jiVBP","tl72WVBjhz",
+"5IhmGDLhzM","sx5Gl7ku1p","l83UdyvOMI","MmsIoprNT6","prNT6Cfgr3","29QAzjiVBP","OHaBzfmIK1","jtn0X3otm6","wDajXmX2GE","HfyNQrhl0J",
+"W3VFHFcWrW","L7cGcGrDg7","jSjS3Chuy3","MmKGJhe9IA","AOgEetl72W","v2eC3uZPqg","xXTI4ECMvU","9rlg9Uvlv4","ZuDtDVIlwP","pvgjS7Ow5C",
+"8xEKz64s8N","LewvMcmXIX","NhXdujeskS","pWiOsVprf2","MojnPVBjhz","6q6L9vOqCE","lXFOBQ6Lix","AXpwEjfREu","lm0pD580YD","uLtKsRzaZA",
+"Kr8ysMmsIo","VBjhz5Namm","k85AeuPX7G","JkzUnCqqaD","7lUXZUvlv4","xXTI4tvdkD","AXpwE0PktI","fLNg8Yf2Ec","d85a9djsrv","W7cTszz4ZU",
+"b29RJEoToP","9iGoT2hEEU","2ZHdkh1zcH","vkCHH7fsYM","jfREuprNT6","Uvlv416lHc","ZJTXH1j5L8","QbxXcoVQp6","m4bxUVjCZq","MaJQsFGzgp",
+"B3qemzFgtB","RBhp0VIlwP","EOE1oiKqhr","JJs5mfaHir","POUYS7ku1p","rKDLJFLsph","NAFuw5Mg9r","AXpwEJ2mQi","OUqFMDz1R3","iB08lVjCZq",
+"lpF6W0PktI","zz4ZUReKEW","gtCA57hyVv","HP433HlUbF","0Wr5y1LB1L","55rfBGrDg7","CK5W7jiVBP","FhtglAXpwE","zqH0WCIShG","bZLvSVBjhz",
+"AIYUuU3yw5","2DREsStlDJ","F6PT2ciuWz","AgJHQcQOnv","jSjS3ksJby","yluBxTCgPp","yofH3ni2v1","wiHrZ5Namm","9y4lwM6qcG","DcpWBIKxdL",
+"wDajX1LB1L","zbIYYVLTy6","1j5L87fKYU","JJs5mkZANm","xReecNOHsz","OHaBzjeskS","MK07YyluBx","i3pydhSSvQ","StlDJQnJ1S","WDVWJAgJHQ",
+"he9IAaL6AJ","NAFuwVjCZq","jiVBPhe9IA","Mm8siUvlv4","IjTwP9iGoT","CqqaDQssNC","RsQUqDG4sT","EOE1oyvOMI","nnP8oTCgPp","s4786tlILt",
+"taOXKLbRTH","ZJTXH1v5hH","NhXdubrhlQ","atef2cQOnv","ksJbyiB08l","ulk41d7vjM","9rlg948cHL","i3pydEOE1o","BCxeCNo0Qb","M6qcGx3LDe",
+"S2DfuFwEJz","rKDLJvkCHH","fLNg83otm6","zbIYYyToGW","S2DfuTCgPp","6AFT0x3LDe","bZLvSiKqhr","4QMc9o8Uyd","nFqiks93Ml","rKDLJXflUq",
+"xciqpC2Irc","yluBxyvOMI","zHF1qFPfSE","l83UdQssNC","jiVBPMm8si","iwzGkmz8gx","uTacx2Yz7E","2ZHdkaez9y","kZANmQWxoT","Q6hMCPYBf4",
+"1LB1LI7p2a","AkKTkbZLvS","ZJTXHPOUYS","MGlTF2hEEU","BFkb82Yz7E","qQxHPdjsrv","U3yw5CK5W7","yEfy99GXkX","7Ow5CwDajX","Ss0ZuKsjRK",
+"I7p2aS2Dfu","WmadANOHsz","MK07Yiqv4k","9rlg9lpF6W","KASQ8GXdoH","4QMc9jfREu","Q6LixTXQ0Z","GXdoHiB08l","Q6hMC8FmFH","DcpWBdjsrv",
+"RACujW3VFH","AmdQdO3iyQ","UlU3MFxX9q","jS1ajs93Ml","B3qemJRJQB","MaJQsydG8U","uoStwJRJQB","uvf7AjzUqR","aDGtSBGaQY","CNHmvfLNg8",
+"Z4I1vZhwG1","iB08lqaofN","VIlwP5Namm","MezSWtAOsr","SjskQZuDtD","J2mQijiVBP","FGzgprhl0J","2NslmfLNg8","2TRI7D6rBy","AkKTkFPfSE",
+"sx5Gl9eoRc","9XyT9WPmlx","ulk41RBhp0","yToGWfmIK1","brhlQ9eoRc","dQ586b29RJ","iKqhruN6r3","6AFT0o8Uyd","WPmlx9y4lw","b29RJzFgtB",
+"WDVWJaez9y","lXFOBLbRTH","L7cGceuZA5","I7p2aK4GS8","uZPqgHfyNQ","Chuy3s93Ml","9XyT9JXljW","dQ5860Wr5y","ni2v1VLTy6","14FLRbZLvS",
+"HfyNQtlILt","CNHmvEoToP","P6bcgIKxdL","Yw2oUQssNC","dmoS7L7cGc","FVMxoAmdQd","pAhR1yEfy9","gjUTuVerEA","RmDcraez9y","dQ586Kr8ys",
+"zz4ZURBhp0","n1pmOuoStw","ZhwG1lXFOB","sx5GlGv3Fq","WreyPQWxoT","DcpWBblLA9","KZamHbgJAz","tjQxsFPfSE","9y4lwDz1R3","ciuWziB08l",
+"xciqpFNYIM","h1zcH4W0Tl","zQt6QEOE1o","FxX9qtuDyS","d85a98TxD7","he9IAgjUTu","DcpWBprNT6","U3yw5WMiS3","Mkgy8oVQp6","OHaBzlH1kt",
+"zHF1qTCgPp","kB5nPoQ87r","m4bxUFcWrW","fLNg8azIWp","4QMc9Gv3Fq","uN6r3FPfSE","FnPFBjiVBP","lH1ktrhl0J","b29RJ64s8N","n1pmOzQt6Q",
+"dQ586G1RhS","cmXIX8U2nU","uvf7AjS1aj","k85AehE1Ql","HzZT8aFFss","b29RJD6rBy","FPfSE1LB1L","UmaEv9XyT9","QnJ1SWMiS3","64s8NTCgPp",
+"MojnPFPfSE","4dEz66q6L9","cShY2d7vjM","yvOMIMezSW","guMb8ReKEW","x3LDeuJScX","pT8wuzHF1q","2DREsb29RJ","oQ87rFPfSE","suY4xh1zcH",
+"3otm6In3NS","24ARFRACuj","Q6hMCMK07Y","BCxeCsx5Gl","8TxD7yluBx","MK07Yl83Ud","2hEEUOz8yZ","ZJTXHMaJQs","Nxx9VVLTy6","Mm8siJIqXi",
+"JXljW0h1b1","Mm8siWmadA","sqVrfpFrrl","nnP8ozY1GY","RpBQmcShY2","xciqp7ku1p","Mm8siYOfrY","FFDuibZLvS","uJScXv2eC3","0YAGHAXpwE",
+"gf8rIlweGy","Cp3mZi7WMQ","cL0aEUvlv4","580YDOUqFM","oVQp68hJdt","ix74rWaWsv","2DREsxXTI4","BGaQYlkMUA","HlUbFRkQke","he9IAjzUqR",
+"NhXduVBjhz","uPX7GpAhR1","Ss0ZuYOfrY","FxX9qzbIYY","Kr8ysydG8U","5nmWvZzJHW","MojnPd7vjM","HzZT8MK07Y","euZA5he9IA","FcWrWVNCPd",
+"RxrsmiKqhr","uTacxwDajX","W3VFHIRh48","lweGyYw2oU","v2eC3GSQwj","uvf7AxXTI4","pv0i7piJSk","hi5X7StlDJ","fcwDaQ6Lix","7fsYMTwano",
+"DcpWBO3iyQ","Gv3FqIKxdL","e6e4zNxx9V","zqH0W7lUXZ","OUqFMNhXdu","FnPFBQWxoT","nnP8oIjTwP","GSQwjK20wK","QbxXcKZamH","jS1ajWmadA",
+"48cHLMmKGJ","1LB1Lrhl0J","brhlQn1pmO","J2mQiuTacx","5VZjS7Ow5C","L7cGcFhtgl","suY4xYOfrY","bgJAzbgJAz","HlUbFpmeCd","2NslmlCMxy",
+"Ss0ZuyvOMI","qQxHPPOUYS","ThjNnqQxHP","Kr8ysEoToP","bgJAzDz1R3","pAhR1qQxHP","Fhtgl9XyT9","7fsYM7Ow5C","BCxeC29QAz","oQ87rCfgr3",
+"No0QbQChxs","lXFOBFxX9q","GrDg7BFkb8","qQxHPv8yFN","8cVD3dQ586","zqH0W0Kyfs","W3VFHMmKGJ","XyPZNdjsrv","qaofNQClRL","SjskQoVQp6",
+"lXFOBogLgc","lCMxyogLgc","cQOnvOz8yZ","fmIK1QChxs","VNCPdzbIYY","VLTy6WMiS3","soy9tjzUqR","zqH0WnFqik","FVMxoRBhp0","JRJQBJJs5m",
+"F6PT2s7Mxk","uJScXCdyBV","P6bcg2hEEU","nnP8os7Mxk","Oz8yZa00b5","LDk6fyToGW","7Ow5CCqqaD","IKxdLlH1kt","Chuy35iGN5","rhl0Jgf8rI",
+"ZUnqtReKEW","euZA51j5L8","aL6AJvOqCE","t98iWMmsIo","HzZT8okgRi","8RCUAHfyNQ","CIShGatef2","2NslmReKEW","0MR5XaDGtS","uupzkUl4a1",
+"ThjNnVIlwP","VBjhzwiHrZ","OUYuFiKqhr","QbxXcjSjS3","CqqaDyToGW","EOE1oRpBQm","s4786Cp3mZ","1v5hHv2eC3","zqH0WprNT6","5Drn0Qworu",
+"azIWpuLtKs","FwEJzMmsIo","Chuy3yvOMI","lm0pD6q6L9","PYBf4fqypy","EoToPfaHir","45cIHRkQke","Vprf24dEz6","OxWIH4QMc9","UmaEvK20wK",
+"i7WMQm4bxU","faHiry94nw","i3pydBCxeC","yToGWQWxoT","NAFuwCdyBV","ZUnqtW3VFH","Yh1hFGrDg7","No0QbfmIK1","8FmFHulk41","FVMxoCxVEf",
+"t98iWx3LDe","L7cGcCdyBV","t59lRjS1aj","jzUqRFNYIM","o8UydBFkb8","9eoRcGSQwj","sx5Gl8hJdt","Cp3mZYOfrY","AmdQdKr8ys","G1RhSix74r",
+"aDGtShSSvQ","S2DfuyofH3","Q6hMCsx5Gl","4W0Tlxciqp","0Wr5y7hyVv","FjHXRMmKGJ","O3iyQHfyNQ","Pb1payofH3","Q6hMC45cIH","Yh1hFpWiOs",
+"n8pJ9tAOsr","FnPFBm4bxU","lpF6WIn3NS","yluBxZzJHW","nFqikCp3mZ","0PktINAFuw","zqH0WNhXdu","AOgEeMezSW","Waim62hEEU","In3NS9rlg9",
+"Fhtglhe9IA","y94nwsqVrf","fcwDaM6qcG","qUJMdzFgtB","7hyVvF6PT2","C2IrcblLA9","Zv7z0hYBCK","MojnPFFDui","5Mg9rOUYuF","aez9ypiJSk",
+"ZUnqtdmoS7","i3pyduQIcz","uQIcz9XyT9","gf8rIix74r","hUTw7HP433","qaofNtaOXK","rKDLJpvgjS","fFDrJ1v5hH","yEfy9oQ87r","5drc6ogLgc",
+"JIqXi8cVD3","fqypy0MR5X","S2DfuFFDui","ciuWzpvgjS","1v5hHBGaQY","S77LHxXTI4","uAWypFPfSE","9y4lwXyPZN","euZA5uoStw","gtCA5O3iyQ",
+"gdQsS5Mg9r","rhl0Jv1Hln","v8yFNXflUq","aL6AJjfREu","3weIFPYBf4","Zv7z0Y1mC0","QWxoTydG8U","WPmlxpAhR1","0YAGHIKxdL","pT8wu0PktI",
+"ix74rVjCZq","n8pJ9zQt6Q","CNHmvaFFss","Ul4a1jzUqR","Y1mC029QAz","HfyNQJ2mQi","uQIczguMb8","JXljWlm0pD","tvdkDcShY2","JkzUnfaHir",
+"9rlg9wiHrZ","taOXKWreyP","7fKYUEOE1o","Vprf2FFDui","djsrvlkMUA","Yw2oU2Yz7E","BFkb829QAz","BGaQYZJTXH","RmDcrSs0Zu","2Nslmulk41",
+"5VZjSJIqXi","KZamHv8yFN","IjTwPG1RhS","x3LDeVIlwP","S2Dfu0h1b1","IRh48aez9y","RACujd7vjM","qQxHPmX2GE","B3qemuoStw","GSQwjTwano",
+"580YDpiJSk","cL0aEn8pJ9","D6rByPYBf4","7fsYMY1mC0","uLtKsazIWp","k85AeQWxoT","GXdoHhi5X7","TCgPppiJSk","Uvlv4FGzgp","FPfSEFwEJz",
+"16lHcS2Dfu","guMb816lHc","GXdoHOUqFM","jtn0X14FLR","VerEACp3mZ","TCgPps7Mxk","EdBKch1zcH","s4786WmadA","BCxeCn8pJ9","SmGzv8FmFH",
+"9rlg9MK07Y","zFgtB6q6L9","iKqhrsoy9t","soy9t4QMc9","e6e4zWDVWJ","D6rByGXdoH","9eoRcFxX9q","lXFOB0BmCy","Ss0ZuBbwgA","XflUqydG8U",
+"hE1QljeskS","2DREsWaWsv","VIlwPRBhp0","v1HlnlpF6W","tjQxsUlU3M","taOXKo8Uyd","Z4I1vQworu","hSSvQAmdQd","FGzgpjSjS3","iB08lBpYhV",
+"7X3uyFhtgl","rz7UtGrDg7","Q6hMCVjCZq","AkKTkO3iyQ","U3yw5ZuDtD","aL6AJzbIYY","rz7UtXflUq","ReKEW9y4lw","zQt6QMezSW","2DREsFnPFB",
+"DcpWBdQ586","ix74rAgJHQ","Q6Lix5IhmG","d85a9Yw2oU","k85Ae8FmFH","BGaQYbrhlQ","Y1mC0jS1aj","uvf7A618Di","zqH0WblLA9","oQ87rHzZT8",
+"MmKGJzmLYD","azIWps93Ml","MGlTFsuY4x","KZamHiKqhr","VjCZqIRh48","Yw2oUO3iyQ","5Mg9rVLTy6","DQimp0YAGH","FNYIMM3zXL","5drc6QbxXc",
+"AgJHQfFDrJ","fLNg8DG4sT","SmGzvuTacx","vOqCE4QMc9","StlDJyluBx","YjB9tjzUqR","S77LHzbIYY","7ku1pfqypy","pFrrlciuWz","IBe8kDLhzM",
+"Zv7z0Ss0Zu","J2mQiOxWIH","suY4xFcWrW","FVMxoZv7z0","SmGzvNxx9V","jSjS3VjCZq","yvOMICp3mZ","suY4xFhtgl","v1HlnFNYIM","48cHLFwEJz",
+"GSQwjgdQsS","lkMUAZUnqt","ydG8UlkMUA","zQt6QVIlwP","VLTy6SmGzv","aDGtSCdyBV","pWiOsDLhzM","9rlg9CqqaD","fLNg8C2Irc","fcJOyaL6AJ",
+"Waim6HP433","prNT6Uvlv4","jSjS3n1pmO","fFDrJJJs5m","Waim6t59lR","jSjS3dpe1v","FPfSEzz4ZU","0ao3lmX2GE","OUqFMGWqqX","dpe1vzHF1q",
+"GSQwj6AFT0","gIYvEd85a9","ZUnqtNxx9V","No0QbWMiS3","AXpwEhSSvQ","kB5nP7lUXZ","lCMxyF6PT2","DG4sTjiVBP","KsjRKbgJAz","AXpwEjSjS3",
+"9y4lwprNT6","BFkb8gIYvE","RpBQmksJby","qQxHPWmadA","8U2nUyluBx","zHF1qEOE1o","CIShGuN6r3","O3iyQS77LH","FnPFBpT8wu","kB5nP0MR5X",
+"6AFT0uTacx","Z4I1vciuWz","JKWYRKZamH","8cVD3ECMvU","OUYuFksJby","i7WMQNhXdu","D6rByatef2","ksJby5Mg9r","Uvlv4Z4I1v","lXFOBl83Ud",
+"JXljWcQOnv","9y4lwBpYhV","zz4ZU0Kyfs","n1pmODz1R3","JIqXi45cIH","6q6L9uAWyp","zHF1qVIlwP","Mkgy8hSSvQ","8xEKzTXQ0Z","64s8NnlaBy",
+"aez9yjfREu","cQOnvJIqXi","2Nslmfqypy","mX2GEGv3Fq","Oz8yZUlU3M","M3zXLUmaEv","QbxXc0PktI","uAWypFFDui","AOgEePb1pa","1v5hHNhXdu",
+"RzaZAi7WMQ","2ZHdkI7p2a","55rfBs7Mxk","1j5L8yEfy9","XyPZNYOfrY","WaWsvlj07Q","wiHrZDcpWB","ydG8U4QMc9","JKWYRWmadA","Kr8ysC2Irc",
+"DLhzMyToGW","1j5L8QbxXc","ciuWzs93Ml","yEfy9fmIK1","wiHrZrz7Ut","PYBf4HfyNQ","rz7Uti3pyd","0BmCyzbIYY","StlDJwiHrZ","5IhmGfqypy",
+"VIlwPYw2oU","s93MlokgRi","cmXIXCfgr3","n8pJ9ZuDtD","iwzGkaez9y","pAhR1bZLvS","uTacxjzUqR","aFFssrKDLJ","zz4ZUi3pyd","uZPqgYOfrY",
+"Yw2oU0YAGH","TwanoWPmlx","OHaBzYf2Ec","9iGoTuoStw","JRJQBn8pJ9","KZamHMm8si","rKDLJuZPqg","t59lRuPX7G","8FmFHO3iyQ","ix74rWPmlx",
+"SmGzvFwEJz","pWiOspiJSk","pT8wuoGu6x","Cp3mZM3zXL","aDGtSRBhp0","dmoS7HRxd8","gf8rIRkQke","AOgEe8U2nU","Mkgy8Chuy3","vLsmS5Mg9r",
+"d85a9D6rBy","zmLYDtl72W","aL6AJsuY4x","0ao3lksJby","45cIHJkzUn","BFkb80h1b1","lkMUAoQ87r","b29RJF6PT2","guMb8pmeCd","qUJMdWDVWJ",
+"ogLgc1LB1L","Q6Lixt59lR","fcJOy9rlg9","Ta8f6AgJHQ","Waim664s8N","yToGWdmoS7","jzUqRuQIcz","MK07YsqVrf","jfREujfREu","7fsYMy94nw",
+"FFDuiAmdQd","Ta8f6FVMxo","FjHXRtlILt","FjHXRKZamH","W3VFHU3yw5","he9IAOUqFM","AmdQdydG8U","zz4ZUQWxoT","BpYhVuLtKs","zqH0WHfyNQ",
+"Waim6SjskQ","jeskSIn3NS","NcICAuoStw","a00b56q6L9","jiVBPv2eC3","NhXduRBhp0","jzUqRv8yFN","0KyfsIjTwP","GSQwj8RCUA","Oz8yZEdBKc",
+"guMb8gf8rI","DLhzMcShY2","No0Qbtl72W","uvf7ACqqaD","6q6L9Waim6","atef2pmeCd","CdyBV5Namm","CdyBVsx5Gl","uN6r3WPmlx","7hyVvcmXIX",
+"uZPqgsqVrf","FNYIMAOgEe","FNYIM2Nslm","0YAGHzHF1q","FjHXR6AFT0","Cfgr37ku1p","MmKGJuupzk","vOqCEWreyP","cL0aE0PktI","5Drn0BbwgA",
+"8RCUAguMb8","WMiS3UlU3M","v1HlnMm8si","ulk410Wr5y","mz8gxy94nw","55rfBgf8rI","U3yw545cIH","8FmFH1j5L8","NcICA07n1c","4dEz65nmWv",
+"7fKYULewvM","Yh1hF9eoRc","AkKTk9iGoT","FcWrWK20wK","Mkgy8sqVrf","nnP8o8hJdt","S77LHFjHXR","lCMxyFxX9q","kZANmJKWYR","jzUqRNAFuw",
+"IBe8k7fsYM","RpBQmnFqik","dmoS716lHc","aDGtSJRJQB","TwanoK4GS8","0YAGHsoy9t","Kr8ysnnP8o","Dz1R38FmFH","5nmWvv2eC3","ReKEWuN6r3",
+"bZLvSDG4sT","jeskS4W0Tl","SWfouAIYUu","NcICAcmXIX","aDGtSfaHir","JKWYRYh1hF","AmdQdRBhp0","NAFuwkB5nP","O3iyQ0ao3l","IRh48gf8rI",
+"In3NSpvgjS","NcICAGWqqX","nFqikZzJHW","lViBvQWxoT","QYxC0pmeCd","LewvMIn3NS","taOXKDQimp","Ta8f68cVD3","OxWIHk85Ae","9rlg9OxWIH",
+"lj07Qs93Ml","9y4lw618Di","jzUqR6AFT0","RBhp0tuDyS","jSjS3Ss0Zu","zFgtByluBx","Kr8ysCxVEf","gIYvEoGu6x","Yw2oUtaOXK","uLtKsxReec",
+"HzZT8t59lR","xXTI40YAGH","iwzGkbgJAz","7hyVvpAhR1","uJScX7Ow5C","0h1b1M6qcG","YOfrYnlaBy","RmDcr0Wr5y","uAWypS2Dfu","iqv4k0Kyfs",
+"gjUTuyToGW","DLhzM2DREs","lkMUA6AFT0","vkCHH5IhmG","Zv7z0ulk41","8FmFH7hyVv","gtCA5D6rBy","0Kyfspv0i7","PYBf4e6e4z","FjHXRVprf2",
+"1v5hHMmKGJ","d85a9pmeCd","rhl0J2Nslm","AkKTkxXTI4","TXQ0ZW3VFH","pmeCdFhtgl","QYxC0FFDui","VjCZqOUqFM","24ARFqQxHP","BCxeCVLTy6",
+"sqVrf2ZHdk","K4GS8jfREu","soy9tNOHsz","IjTwPlH1kt","9XyT9piJSk","yluBxFNYIM","Cp3mZBFkb8","blLA9aDGtS","5IhmG3weIF","Kr8yso8Uyd",
+"JkzUnx3LDe","Kr8ysfcJOy","fcwDa0MR5X","0YAGH618Di","BpYhV48cHL","NcICAfLNg8","7hyVv5Namm","y94nw9rlg9","2hEEUrKDLJ","o8Uydatef2",
+"Mkgy8qQxHP","8xEKzCK5W7","xXTI4QYxC0","v1Hln618Di","VNCPdydG8U","Uvlv40Kyfs","i7WMQYw2oU","0BmCyFxX9q","4W0TlHRxd8","AkKTkGSQwj",
+"zY1GY16lHc","x3LDeb29RJ","2ZHdk2Nslm","zY1GYDz1R3","EOE1ojfREu","qaofN9y4lw","ogLgcFGzgp","SjskQZhwG1","Nxx9V5Drn0","d7vjMru4UG",
+"o8Uydt98iW","tjQxsGSQwj","7Ow5CogLgc","jzUqRRsQUq","IKxdLYw2oU","AIYUuoQ87r","BpYhVVNCPd","gdQsS8TxD7","UlU3MY1mC0","45cIHi3pyd",
+"fcwDayEfy9","rKDLJ0PktI","D6rByOUYuF","FnPFBlCMxy","ix74r14FLR","brhlQVerEA","Ta8f6XyPZN","zQt6QBpYhV","dQ586FxX9q","DcpWBP6bcg",
+"TwanoBbwgA","QYxC0b29RJ","Qworut98iW","8TxD70PktI","zY1GY8U2nU","2Yz7EWaWsv","lXFOByofH3","tAOsrJ2mQi","JXljW5ZaEz","BbwgANOHsz",
+"jeskSb29RJ","9XyT9In3NS","0BmCyru4UG","okgRiI7p2a","YOfrYAgJHQ","ulk41TXQ0Z","5nmWvNAFuw","G1RhSFNYIM","MojnPhSSvQ","1j5L8cQOnv",
+"cQOnv24ARF","TXQ0ZKsjRK","24ARFFNYIM","atef2ECMvU","WMiS3pmeCd","JkzUnSWfou","yEfy9dQ586","3weIFlCMxy","BCxeCDLhzM","mX2GEzY1GY",
+"6AFT0GWqqX","vOqCEOxWIH","9rlg9OUqFM","8U2nUcQOnv","1j5L8X6Pin","SWfouQWxoT","Cp3mZW7cTs","zqH0WNOHsz","Rxrsm8cVD3","45cIHDLhzM",
+"AXpwEQbxXc","iwzGkzmLYD","atef29XyT9","CdyBVlsQGo","IBe8kNo0Qb","vLsmSQChxs","ZUnqtCIShG","uZPqgd7vjM","ru4UGoVQp6","t98iWZzJHW",
+"lCMxy6AFT0","MaJQs5iGN5","tl72WI7p2a","qaofNlkMUA","W7cTs2TRI7","pvgjSokgRi","MGlTFhe9IA","POUYSNhXdu","UlU3MTCgPp","KZamHsoy9t",
+"8cVD3S2Dfu","xReecpv0i7","v8yFNLbRTH","HlUbFHlUbF","7X3uyJXljW","3otm6oVQp6","xReecd85a9","W3VFHVNCPd","Oz8yZ5nmWv","a00b5lj07Q",
+"Vprf2B3qem","BFkb8FcWrW","qQxHP0ao3l","ogLgcOz8yZ","BGaQYJkzUn","IBe8kwDajX","HRxd8K20wK","YOfrYlsQGo","kB5nPa00b5","Q6hMC8U2nU",
+"TCgPpazIWp","rz7Ut5nmWv","Uvlv4CdyBV","2DREsuJScX","2Yz7ECK5W7","OxWIHEdBKc","vkCHHdmoS7","Kr8ysFLsph","EOE1oAkKTk","Pb1paMojnP",
+"tvdkDRACuj","Oz8yZsuY4x","pAhR1bgJAz","kZANm9GXkX","pvgjSVprf2","yofH3C2Irc","ksJbyZzJHW","QClRLpiJSk","cmXIX580YD","uoStwIBe8k",
+"Rxrsmxciqp","SmGzvDQimp","qaofNv1Hln","9eoRchi5X7","JJs5maDGtS","Y1mC0FnPFB","tAOsrlsQGo","580YD0PktI","hYBCK8xEKz","1j5L8M6qcG",
+"9iGoTQworu","KASQ8bgJAz","Q6hMCNxx9V","9rlg9mX2GE","Gv3Fq0h1b1","9iGoToQ87r","HzZT8LDk6f","EoToPVjCZq","QWxoT07n1c","Z4I1v5Mg9r",
+"a00b58xEKz","Vprf2hYBCK","FGzgpTXQ0Z","aL6AJ8TxD7","Waim6FnPFB","YOfrY8U2nU","DG4sT8U2nU","VLTy6Z4I1v","3otm65IhmG","qQxHPUvlv4",
+"Yh1hFprNT6","wDajXYjB9t","pT8wumX2GE","24ARFcL0aE","ThjNn1v5hH","16lHcNhXdu","y94nwZhwG1","8hJdtS77LH","tvdkDI7p2a","oVQp6xReec",
+"5Mg9rLDk6f","8cVD3iqv4k","2ZHdkSmGzv","FNYIMvkCHH","zQt6Q5iGN5","GXdoHnnP8o","guMb8vkCHH","suY4xmX2GE","NhXduQClRL","MmsIouoStw",
+"16lHcOUqFM","JXljWG1RhS","AkKTkQnJ1S","pvgjSbrhlQ","P6bcgfFDrJ","Cfgr3Vprf2","Ta8f6UmaEv","zqH0WEOE1o","JJs5mYf2Ec","n1pmOSbRYy",
+"2hEEUWPmlx","pWiOsRzaZA","U3yw5jeskS","JJs5mZhwG1","rKDLJ9eoRc","POUYSlj07Q","FxX9q0h1b1","CIShGY1mC0","tvdkD29QAz","FjHXRMmsIo",
+"8TxD7ni2v1","14FLRW7cTs","d7vjMUl4a1","mz8gxksJby","45cIHgf8rI","MaJQszHF1q","S2Dfu5ZaEz","uQIczBGaQY","sx5Gl9rlg9","5Mg9rUvlv4",
+"9y4lwNxx9V","qQxHPLDk6f","WMiS3F6PT2","Q6hMCuvf7A","FLsphYOfrY","tjQxscShY2","KsjRKZ4I1v","lpF6WsqVrf","pFrrlFLsph","0h1b1AOgEe",
+"hSSvQUvlv4","WreyP55rfB","azIWpyvOMI","iB08lvLsmS","VBjhzJRJQB","hE1QlaDGtS","fqypyK4GS8","gtCA5J2mQi","QWxoTpiJSk","dhSuHulk41",
+"BCxeCaDGtS","OUYuFOHaBz","QnJ1S8RCUA","O3iyQpiJSk","OUYuFX6Pin","VerEAYh1hF","O3iyQlCMxy","iB08lZUnqt","NcICAK4GS8","GXdoHru4UG",
+"WaWsvzbIYY","Zv7z0FGzgp","TXQ0ZOxWIH","kB5nPCp3mZ","pAhR1J2mQi","sx5Gl14FLR","gjUTuKsjRK","WDVWJNOHsz","RACujHfyNQ","Mkgy8dQ586",
+"QYxC0tuDyS","dhSuHDLhzM","GWqqXcmXIX","NcICA7fKYU","7Ow5C6AFT0","KASQ8LbRTH","RxrsmThjNn","9rlg964s8N","S2Dfu7lUXZ","8FmFHoVQp6",
+"jSjS3QnJ1S","lCMxyMkgy8","L7cGcOUYuF","WPmlx7X3uy","WreyPbZLvS","5iGN5GWqqX","JkzUnGrDg7","FFDuiGv3Fq","nnP8oxXTI4","yvOMIMmsIo",
+"prNT6MGlTF","sx5GlZUnqt","M6qcGQChxs","JJs5ma00b5","ZuDtD0Kyfs","rz7Ut2Yz7E","GSQwjLewvM","lsQGotuDyS","kZANm4dEz6","7hyVvbrhlQ",
+"tuDyS6q6L9","CxVEfhe9IA","8RCUAOHaBz","YOfrY29QAz","MezSWMGlTF","tl72WS77LH","RACujQ6hMC","MmKGJ1v5hH","jtn0X7hyVv","D6rBytaOXK",
+"48cHL8cVD3","Cfgr3X6Pin","Oz8yZF6PT2","ni2v1K20wK","Y1mC0JKWYR","Mkgy8l83Ud","cL0aETwano","MmKGJvLsmS","nFqiklm0pD","oVQp6Yw2oU",
+"hi5X7RkQke","DG4sTaDGtS","AgJHQXyPZN","zmLYDxReec","d85a9atef2","fFDrJ0BmCy","l83Udiqv4k","2DREsi7WMQ","n8pJ9NcICA","RmDcrFVMxo",
+"In3NScQOnv","AgJHQuoStw","AXpwEG1RhS","brhlQTXQ0Z","tuDySKr8ys","WDVWJpWiOs","uupzkgtCA5","yEfy9hi5X7","qaofNChuy3","QnJ1SpWiOs",
+"6q6L9mz8gx","piJSkUvlv4","SbRYySs0Zu","zz4ZUuTacx","IKxdL8FmFH","K20wK7fsYM","W3VFHhSSvQ","B3qemksJby","BpYhVh1zcH","x3LDel83Ud",
+"CdyBVZJTXH","9iGoT5nmWv","nFqikAXpwE","FGzgpa00b5","I7p2apv0i7","2NslmzqH0W","MmKGJRsQUq","AIYUurz7Ut","s93MlazIWp","Y1mC0C2Irc",
+"ZJTXHpvgjS","AXpwEuPX7G","RxrsmWmadA","7lUXZnnP8o","0KyfsuPX7G","6AFT0FcWrW","7X3uyFcWrW","7fKYUNcICA","qUJMdDLhzM","FNYIMni2v1",
+"dmoS7M6qcG","7fsYMQssNC","zqH0WMkgy8","C2IrcPYBf4","7Ow5CBGaQY","Qworu0h1b1","KASQ8tAOsr","fcwDaSmGzv","AIYUut59lR","AkKTk5VZjS",
+"pvgjSmX2GE","cmXIXL7cGc","LbRTHCIShG","KsjRKjtn0X","taOXKK4GS8","NAFuwhSSvQ","lXFOBhe9IA","OHaBzXflUq","Vprf2rKDLJ","I7p2aMmsIo",
+"Gv3Fqtl72W","Kr8ysHfyNQ","FhtgllkMUA","okgRin8pJ9","JRJQBIn3NS","LbRTHbrhlQ","dQ586lCMxy","SjskQh1zcH","I7p2aJRJQB","AIYUuOHaBz",
+"RkQkedQ586","tl72WCIShG","lViBvNo0Qb","lpF6WThjNn","uAWypaDGtS","uN6r3ogLgc","EdBKczFgtB","KASQ8qQxHP","QClRLjSjS3","Dz1R3O3iyQ",
+"IRh48Yf2Ec","nnP8ohe9IA","9iGoTuZPqg","vOqCEFxX9q","7X3uyZv7z0","QWxoT9y4lw","OUqFMEOE1o","dmoS7uJScX","tAOsrAOgEe","lkMUAKZamH",
+"uJScXy94nw","VjCZqCp3mZ","lH1ktYh1hF","Gv3FqX6Pin","S2DfuMGlTF","lXFOBjeskS","7fsYMpmeCd","S77LH4dEz6","TXQ0Z9eoRc","hE1QlrKDLJ",
+"RkQkehUTw7","MojnPTwano","uupzkCNHmv","dpe1vZv7z0","lCMxyiB08l","uPX7GzmLYD","nFqikxciqp","QssNC5drc6","iB08lcQOnv","uQIcz1j5L8",
+"pv0i7i7WMQ","FVMxoGrDg7","FNYIM0Kyfs","taOXKjfREu","P6bcg0h1b1","n8pJ9Kr8ys","SmGzv16lHc","M3zXLvOqCE","5iGN548cHL","QYxC0tlILt",
+"lweGyFNYIM","RBhp0JRJQB","dQ586suY4x","gtCA548cHL","BCxeCPOUYS","aDGtSPYBf4","uvf7Ao8Uyd","cL0aEyvOMI","48cHLRACuj","dhSuHThjNn",
+"vOqCEaFFss","M3zXLK4GS8","AOgEezQt6Q","8TxD7Zv7z0","8xEKzlH1kt","d7vjMhe9IA","prNT6AmdQd","IKxdLxXTI4","7fsYMRxrsm","mX2GECfgr3",
+"HzZT8GSQwj","5drc6wiHrZ","blLA9aL6AJ","HlUbFL7cGc","gf8rIOHaBz","Waim6yEfy9","MmsIoIBe8k","14FLRnFqik","XyPZNO3iyQ","v8yFNDG4sT",
+"uvf7Ah1zcH","b29RJ29QAz","I7p2aQ6Lix","5IhmG5Namm","a00b5yToGW","he9IAfaHir","WaWsvm4bxU","uQIczQssNC","FFDuiBpYhV","Q6hMCiwzGk",
+"uN6r34QMc9","gjUTuWaim6","xciqprz7Ut","fmIK1lsQGo","azIWpd85a9","4W0TltjQxs","aDGtS8hJdt","16lHcVerEA","dhSuHZJTXH","uQIcz45cIH",
+"n1pmONOHsz","djsrvi3pyd","UmaEvfLNg8","GXdoHB3qem","vkCHHprNT6","xXTI4zFgtB","MGlTFnlaBy","8cVD3FwEJz","0BmCyYh1hF","NAFuwrz7Ut",
+"piJSkyofH3","AkKTkJKWYR","pFrrljfREu","8FmFHOz8yZ","Ul4a1Cfgr3","2NslmKASQ8","JkzUn9GXkX","5IhmGyluBx","QWxoTCfgr3","OHaBzC2Irc",
+"LewvMFxX9q","OxWIHBGaQY","a00b5oQ87r","gtCA5Mkgy8","iKqhrFnPFB","QWxoTQYxC0","FVMxo4dEz6","RBhp0pAhR1","e6e4zZv7z0","kB5nPulk41",
+"JIqXiJkzUn","NOHszJIqXi","FwEJzlH1kt","ZhwG1s4786","3otm6wDajX","DcpWBAkKTk","VerEAYw2oU","tvdkDStlDJ","TCgPpKsjRK","qQxHPfcwDa",
+"AIYUujeskS","tl72W29QAz","jiVBPprNT6","Ss0ZuOHaBz","7fsYMVBjhz","Uvlv4m4bxU","0PktIaez9y","FFDuid85a9","LDk6fAmdQd","cQOnvCdyBV",
+"yofH3fFDrJ","yofH3Yh1hF","XflUqmX2GE","WMiS3LbRTH","WreyPuvf7A","AOgEeQ6hMC","FcWrWd7vjM","9XyT9ReKEW","YjB9tuvf7A","wiHrZS2Dfu",
+"fLNg8blLA9","8TxD755rfB","nlaByprNT6","RzaZApiJSk","45cIHv1Hln","t59lRtlILt","s4786fcwDa","StlDJlkMUA","AOgEeU3yw5","wiHrZazIWp",
+"EOE1o5Mg9r","0YAGHM6qcG","WreyPkZANm","QChxs0ao3l","AXpwEIjTwP","n8pJ9OUYuF","5NammQworu","FxX9qUvlv4","Yf2EcfcwDa","prNT6SbRYy",
+"UmaEvSmGzv","ThjNn24ARF","0ao3lni2v1","iwzGkIjTwP","Ul4a1a00b5","C2IrcFcWrW","9XyT9UmaEv","lXFOBKASQ8","RmDcr45cIH","GXdoHS2Dfu",
+"jS1ajIRh48","EOE1om4bxU","wiHrZTCgPp","s93MlDQimp","8cVD3AmdQd","cQOnvwDajX","jzUqRa00b5","hSSvQIn3NS","Mm8sisx5Gl","FPfSEWmadA",
+"rKDLJ14FLR","lsQGoX6Pin","azIWpt59lR","Cp3mZpiJSk","W7cTs7fKYU","14FLRDcpWB","XflUqX6Pin","2hEEUJXljW","AgJHQPYBf4","5IhmGkB5nP",
+"K20wKlpF6W","8hJdtjiVBP","0ao3lZzJHW","SWfouYf2Ec","FnPFBmX2GE","WDVWJ5drc6","QworuyvOMI","8RCUA5Namm","Yh1hF5Namm","WMiS3WMiS3",
+"QnJ1StvdkD","7Ow5CKr8ys","WPmlxDz1R3","K20wK4QMc9","EOE1oazIWp","45cIH7X3uy","hUTw7xReec","RmDcrS2Dfu","AIYUu0BmCy","lXFOB8U2nU",
+"CqqaDulk41","t98iWhE1Ql","IKxdL7Ow5C","W7cTsCdyBV","HP4334QMc9","7Ow5CSmGzv","EoToP2DREs","Chuy3ulk41","prNT6dQ586","FnPFBZhwG1",
+"tvdkDQssNC","zz4ZUFGzgp","2TRI7QssNC","HP433lCMxy","IRh48pmeCd","Pb1paqaofN","618DibgJAz","FFDuiWreyP","iwzGk7fsYM","EOE1ouAWyp",
+"pT8wudpe1v","uJScXt98iW","Twano0ao3l","0ao3l2DREs","FVMxo9eoRc","KZamHgIYvE","nnP8o9GXkX","POUYSgdQsS","Pb1pazFgtB","QnJ1SZzJHW",
+"i3pydDQimp","IKxdLpAhR1","Q6hMC1v5hH","5nmWvnFqik","LewvMd7vjM","5iGN5VerEA","MaJQsiKqhr","lViBvru4UG","Pb1paokgRi","7ku1pFjHXR",
+"GrDg7CNHmv","uQIczUvlv4","n8pJ9JKWYR","8RCUAlpF6W","0Wr5yJKWYR","7hyVv4W0Tl","Y1mC00Kyfs","QWxoTX6Pin","euZA5ZUnqt","RzaZAsuY4x",
+"gf8rI1j5L8","jeskSPb1pa","nnP8ov2eC3","MmsIopWiOs","9iGoTs4786","tAOsrlCMxy","9rlg9Z4I1v","9rlg9jS1aj","Vprf2WDVWJ","5ZaEzMm8si",
+"X6Pin45cIH","uPX7GVLTy6","ZuDtDuvf7A","djsrvprNT6","nlaByJIqXi","wiHrZHzZT8","lViBvUvlv4","Oz8yZZJTXH","hi5X75IhmG","B3qemKASQ8",
+"4QMc9pmeCd","d85a9oQ87r","dpe1vU3yw5","POUYS5IhmG","x3LDetaOXK","pFrrl5VZjS","WMiS3k85Ae","8RCUAYOfrY","pWiOsZJTXH","VLTy6fFDrJ",
+"VjCZqsqVrf","Kr8ysksJby","okgRiQ6hMC","uZPqgFVMxo","U3yw52DREs","Chuy3uQIcz","zqH0W24ARF","VerEAxXTI4","M3zXLSWfou","7Ow5CChuy3",
+"D6rByKASQ8","QssNCFjHXR","9rlg9Kr8ys","euZA5suY4x","D6rByW3VFH","5drc6Q6hMC","nlaBydmoS7","C2IrcRkQke","lXFOBx3LDe","qUJMdS77LH",
+"S2DfuxXTI4","taOXKReKEW","VBjhz7fsYM","KASQ8Qworu","tAOsrFxX9q","i7WMQzQt6Q","ogLgcGrDg7","C2IrcUvlv4","UlU3M24ARF","MK07Yni2v1",
+"9eoRc0Kyfs","BbwgA4QMc9","FwEJzPYBf4","okgRiD6rBy","uupzkS77LH","fFDrJUl4a1","BGaQYMm8si","0ao3luN6r3","nFqikoVQp6","oGu6x1LB1L",
+"2hEEUBpYhV","0Kyfsn1pmO","Q6hMCiB08l","8xEKzM6qcG","Ss0ZuGWqqX","BGaQYD6rBy","Mm8siqUJMd","GXdoHix74r","cmXIX1v5hH","prNT6CdyBV",
+"5Drn0Yh1hF","NOHszPYBf4","dpe1vuLtKs","WPmlxWreyP","VerEApv0i7","6AFT0Pb1pa","zbIYYJ2mQi","HRxd8FPfSE","C2IrcI7p2a","ZhwG1d85a9",
+"zqH0WuN6r3","Gv3FqDLhzM","HlUbFBpYhV","tAOsr45cIH","48cHLTa8f6","3otm6azIWp","FxX9qQChxs","sqVrfFwEJz","U3yw52TRI7","t98iWhe9IA",
+"CxVEfuLtKs","aL6AJgtCA5","CK5W745cIH","2ZHdkgf8rI","b29RJuZPqg","s7MxkKZamH","rKDLJ5drc6","VBjhzQWxoT","mz8gx9GXkX","brhlQSbRYy",
+"s4786IRh48","DG4sTI7p2a","i3pydxReec","nlaBygdQsS","OUYuFgtCA5","iB08lzFgtB","yofH3lj07Q","uJScXaL6AJ","OUqFM5nmWv","ZUnqtF6PT2",
+"brhlQFGzgp","ReKEWJXljW","suY4xG1RhS","piJSkfcwDa","3weIFv8yFN","MK07YTXQ0Z","8FmFHRACuj","mX2GExXTI4","FcWrWPb1pa","YOfrY5IhmG",
+"24ARFLDk6f","uJScXlCMxy","zFgtBKsjRK","K20wKBFkb8","Z4I1vb29RJ","FwEJzQnJ1S","FcWrWru4UG","3otm6KsjRK","MGlTFZhwG1","9y4lwaez9y",
+"xciqpm4bxU","JIqXiix74r","aFFssRpBQm","djsrvjzUqR","faHirt98iW","oQ87rrKDLJ","RsQUqM6qcG","OUYuFAkKTk","Waim6Mm8si","hi5X7nnP8o",
+"YjB9tD6rBy","Dz1R3ciuWz","FLsph0ao3l","uupzkReKEW","QworulsQGo","9y4lwjS1aj","POUYSUvlv4","oVQp655rfB","QnJ1S5Mg9r","J2mQiHfyNQ",
+"7fKYUa00b5","16lHci7WMQ","7hyVvTCgPp","0Wr5ya00b5","RkQkek85Ae","9iGoTSs0Zu","8TxD7uZPqg","Pb1pa8U2nU","Yh1hFWmadA","P6bcgIBe8k",
+"GWqqXMezSW","TCgPpReKEW","7Ow5Cdjsrv","CxVEfqQxHP","ZJTXHRzaZA","iqv4k7ku1p","OUqFMRkQke","FVMxoMm8si","tvdkDIBe8k","4W0TlRpBQm",
+"GXdoHuTacx","zmLYD4W0Tl","d7vjM8FmFH","RkQke5iGN5","qUJMdQbxXc","iqv4kRACuj","gIYvEY1mC0","FLsphpv0i7","ulk41SbRYy","U3yw5lCMxy",
+"gtCA5KsjRK","uupzkM6qcG","d85a9gf8rI","8U2nUPb1pa","9rlg9lj07Q","he9IAuvf7A","MmsIoQ6Lix","m4bxUo8Uyd","HlUbFoVQp6","QChxsYh1hF",
+"ni2v1F6PT2","guMb8he9IA","QbxXcxciqp","yEfy9GXdoH","MaJQst59lR","YOfrYyluBx","Z4I1vYOfrY","FnPFBzFgtB","MGlTFRmDcr","4dEz6jS1aj",
+"AgJHQS77LH","oVQp68RCUA","ReKEWMaJQs","sqVrfTwano","SWfouiKqhr","HfyNQMaJQs","soy9t9eoRc","G1RhSU3yw5","DcpWBx3LDe","Yf2EcSjskQ",
+"FGzgpaFFss","v8yFNd85a9","J2mQiWreyP","In3NSqQxHP","mz8gxQWxoT","mX2GEgdQsS","UmaEvMK07Y","jtn0XEOE1o","Mkgy8i3pyd","vkCHHdhSuH",
+"bZLvSJ2mQi","v1HlnWaWsv","ulk41AOgEe","UmaEve6e4z","tl72WG1RhS","Yw2oUk85Ae","Mm8siqQxHP","n8pJ9YjB9t","iB08l45cIH","FjHXRP6bcg",
+"2TRI74W0Tl","uvf7A5drc6","sx5Gl7X3uy","I7p2aSWfou","hUTw7VIlwP","yvOMIIKxdL","7X3uyECMvU","In3NSs93Ml","uTacxZzJHW","VIlwPNcICA",
+"Mkgy8HRxd8","In3NSprNT6","uPX7G580YD","Twano0Kyfs","DQimp5drc6","uQIczTwano","xXTI4LbRTH","QChxs0PktI","QbxXcdmoS7","RBhp0Cp3mZ",
+"14FLRn1pmO","hYBCKMkgy8","i7WMQ6AFT0","FPfSEHfyNQ","zmLYDuoStw","zqH0Wt59lR","o8UydTXQ0Z","OxWIHh1zcH","uoStwSbRYy","tl72WY1mC0",
+"55rfBnnP8o","TCgPpBFkb8","e6e4zBbwgA","pFrrlkZANm","azIWp9rlg9","Yw2oUnnP8o","Kr8yspWiOs","0YAGHfaHir","djsrvMezSW","9rlg9YOfrY",
+"FPfSE7fKYU","JKWYR6q6L9","Ul4a1nlaBy","fqypyTCgPp","16lHcBFkb8","gtCA5NOHsz","jtn0XprNT6","aez9yv1Hln","618DipT8wu","64s8NnFqik",
+"5nmWvSs0Zu","VBjhzFjHXR","djsrvYjB9t","pmeCdGWqqX","Twanofqypy","k85AelpF6W","BGaQY5Namm","cShY2Q6hMC","jSjS3jeskS","ZUnqt64s8N",
+"faHirWMiS3","O3iyQMGlTF","uN6r3faHir","yEfy9NAFuw","iwzGkxXTI4","64s8NGWqqX","AgJHQWreyP","Yh1hF618Di","L7cGcGv3Fq","MaJQsRzaZA",
+"4dEz6lsQGo","GXdoHWaim6","9iGoTIn3NS","QbxXcyEfy9","BFkb85drc6","djsrvgf8rI","WmadAVIlwP","FwEJzoQ87r","3weIFNcICA","8FmFHCdyBV",
+"F6PT2t59lR","5NammNo0Qb","0BmCyuPX7G","9eoRcQ6hMC","uvf7AZhwG1","OUYuFHP433","6AFT0tAOsr","Mkgy8TXQ0Z","NOHsz0MR5X","ZUnqtCNHmv",
+"5Mg9rVjCZq","ni2v1fcwDa","dhSuHoVQp6","qUJMdVerEA","uLtKsjzUqR","LbRTHThjNn","JkzUnMmKGJ","NAFuwaDGtS","pmeCdWPmlx","uPX7GJkzUn",
+"blLA9cmXIX","MojnP0Kyfs","JXljW7fKYU","48cHLfLNg8","Chuy3uN6r3","y94nwYw2oU","7fsYMJ2mQi","ECMvUfaHir","lViBvFwEJz","hi5X7y94nw",
+"xXTI4iwzGk","8cVD3t59lR","64s8NqUJMd","vOqCElH1kt","lXFOBFnPFB","Oz8yZ7lUXZ","0KyfsLDk6f","1v5hHMm8si","ZzJHWdmoS7","2DREsMaJQs",
+"UlU3Ms93Ml","Kr8ys6AFT0","U3yw5AmdQd","5nmWvRBhp0","zY1GY4dEz6","jS1ajVIlwP","CxVEfnnP8o","Uvlv4ulk41","tAOsrtAOsr","ReKEWAkKTk",
+"lH1ktlm0pD","8RCUArKDLJ","a00b57hyVv","3otm6zHF1q","lweGyTXQ0Z","k85AeTwano","Kr8ysSWfou","29QAzP6bcg","JKWYRiqv4k","hi5X7AkKTk",
+"JJs5mhSSvQ","s7MxklH1kt","tlILtReKEW","mX2GEJIqXi","9GXkXK4GS8","brhlQ9GXkX","7hyVvMmKGJ","JJs5mCfgr3","Waim6pv0i7","ydG8UZJTXH",
+"atef2JXljW","VNCPd8RCUA","K4GS8NhXdu","gIYvEyToGW","0ao3l4W0Tl","jiVBPcShY2","dhSuHcQOnv","YOfrYVLTy6","he9IA14FLR","rhl0J580YD",
+"8RCUAWmadA","L7cGcv8yFN","BpYhVTCgPp","MmsIo5VZjS","HfyNQNcICA","AIYUuNxx9V","pFrrlTCgPp","e6e4zTCgPp","QClRLeuZA5","CdyBVX6Pin",
+"pWiOswDajX","RsQUqVerEA","b29RJSjskQ","uN6r3RsQUq","VNCPdXflUq","gIYvEUmaEv","VNCPdfcwDa","nFqik07n1c","5IhmGBGaQY","BCxeCYOfrY",
+"dmoS7DQimp","Mm8sipT8wu","zQt6Q8hJdt","7fKYUDz1R3","TCgPp8TxD7","S2DfuF6PT2","0KyfshSSvQ","0YAGHtjQxs","aDGtSguMb8","oGu6xiwzGk",
+"AmdQdDLhzM","Y1mC01v5hH","vkCHHzY1GY","lXFOBThjNn","ZzJHWgf8rI","cQOnvFGzgp","FVMxodmoS7","DLhzMOHaBz","k85AefmIK1","ZuDtDQ6Lix",
+"zqH0WNAFuw","JIqXi0PktI","s7Mxkuvf7A","0KyfsjeskS","CqqaDWaWsv","iKqhrC2Irc","yEfy9Q6hMC","cQOnvksJby","Ss0Zu618Di","1j5L8b29RJ",
+"MaJQsEdBKc","29QAzydG8U","DLhzMSs0Zu","IKxdLlViBv","AgJHQxReec","fcwDaAkKTk","P6bcgGSQwj","uZPqgMaJQs","9y4lwZzJHW","nlaBypv0i7",
+"nlaByx3LDe","gtCA564s8N","No0QbP6bcg","NhXduGv3Fq","EoToPtjQxs","CqqaDQWxoT","CIShGNo0Qb","s7MxkWaWsv","pv0i7ix74r","uvf7Ad85a9",
+"pAhR1lCMxy","K4GS8cShY2","CqqaDaFFss","6AFT0RzaZA","Cfgr38U2nU","okgRi2Yz7E","6AFT0lXFOB","gIYvErz7Ut","QWxoTuQIcz","pT8wuStlDJ",
+"Pb1paKsjRK","DQimpUlU3M","EoToPB3qem","Pb1paMGlTF","lj07QfmIK1","jzUqRrhl0J","BCxeCokgRi","0YAGHCdyBV","No0QbBbwgA","b29RJhi5X7",
+"suY4xCIShG","OHaBzMojnP","S77LHCK5W7","K4GS8GrDg7","VjCZqkB5nP","vOqCEJRJQB","9iGoTgtCA5","OHaBzW3VFH","lsQGoBFkb8","2TRI77fsYM",
+"RpBQmIBe8k","RxrsmFcWrW","fqypyEoToP","DQimpZUnqt","UlU3Mn8pJ9","8hJdtx3LDe","I7p2as7Mxk","tl72WjeskS","BCxeCJXljW","MGlTFZUnqt",
+"jeskS2hEEU","jeskSGrDg7","jeskSVerEA","Cp3mZ0BmCy","In3NSs4786","RzaZApv0i7","OxWIHgf8rI","yvOMIcL0aE","L7cGcv1Hln","PYBf4KZamH",
+"MezSWpAhR1","qUJMdLbRTH","uAWyp580YD","hSSvQ6q6L9","gtCA5WmadA","6AFT0uQIcz","KZamHa00b5","dmoS7nnP8o","AmdQdkZANm","O3iyQlweGy",
+"QnJ1Six74r","ydG8Uv2eC3","FPfSEFnPFB","RmDcrEOE1o","VNCPd9rlg9","v1HlnUvlv4","GWqqXTXQ0Z","J2mQiLbRTH","Mkgy8XflUq","2TRI7pv0i7",
+"qUJMdNo0Qb","lkMUAGWqqX","VerEAO3iyQ","9GXkXVIlwP","gf8rIrhl0J","QssNCdmoS7","5drc6WmadA","VerEAMaJQs","azIWpix74r","BCxeCMojnP",
+"Ss0ZupFrrl","Uvlv4Q6Lix","gf8rIHfyNQ","WMiS3DG4sT","CxVEfhYBCK","guMb8nnP8o","6q6L9FxX9q","HzZT8SbRYy","gdQsSa00b5","QChxsyEfy9",
+"JIqXijSjS3","7ku1pjtn0X","WMiS3NcICA","QClRLru4UG","m4bxUAgJHQ","wiHrZXflUq","hE1Qls4786","rKDLJL7cGc","brhlQiKqhr","kZANm9XyT9",
+"s7MxkBFkb8","JkzUntl72W","n8pJ9uZPqg","zbIYY29QAz","AOgEefFDrJ","hUTw7sqVrf","HlUbFdmoS7","9rlg9yToGW","8RCUAfaHir","WaWsv7lUXZ",
+"djsrvCqqaD","nFqikXyPZN","YjB9t5drc6","55rfBTXQ0Z","MmKGJFGzgp","mX2GEMkgy8","pT8wuQbxXc","lj07QyofH3","djsrv5Mg9r","3otm6I7p2a",
+"Dz1R3FLsph","CdyBVJ2mQi","9GXkXdhSuH","tAOsr4dEz6","Kr8ysMkgy8","BGaQYNxx9V","rhl0Jd7vjM","rKDLJ4QMc9","Y1mC0YOfrY","RmDcrRACuj",
+"uAWyp14FLR","EOE1oSmGzv","WaWsve6e4z","zQt6QFPfSE","RACujJRJQB","AkKTkF6PT2","Y1mC0cmXIX","7ku1p9XyT9","CdyBVmz8gx","nFqikWmadA",
+"9y4lwFnPFB","soy9tiKqhr","aez9ylkMUA","lweGyEoToP","o8Uyd5Mg9r","DcpWBZ4I1v","SWfouogLgc","B3qemYw2oU","s7MxkbgJAz","HP433F6PT2",
+"ZhwG1lj07Q","gtCA5ReKEW","blLA9atef2","aFFssM6qcG","yEfy9HfyNQ","fcJOyFLsph","JXljWyvOMI","mX2GEgjUTu","xReecCdyBV","6AFT0qaofN",
+"BCxeCbZLvS","yEfy97ku1p","ni2v1v8yFN","oVQp6580YD","Zv7z0jSjS3","XflUqAIYUu","rKDLJhi5X7","C2IrcjS1aj","B3qemGWqqX","QWxoT7fsYM",
+"FVMxozHF1q","64s8NBGaQY","k85AeS77LH","fFDrJ0PktI","3otm6y94nw","yluBxlXFOB","5Mg9rjiVBP","piJSk7X3uy","XyPZNgjUTu","Rxrsm07n1c",
+"ogLgcK4GS8","AXpwEGSQwj","MGlTF5VZjS","jfREuJkzUn","MK07YMK07Y","v2eC3kB5nP","QYxC0brhlQ","VNCPdDz1R3","24ARFAkKTk","he9IAyEfy9",
+"ReKEWxReec","y94nw2hEEU","zHF1qkZANm","xReecDLhzM","xciqpyofH3","IKxdLPb1pa","7hyVvfcJOy","xReecvLsmS","YOfrYhi5X7","QClRLMkgy8",
+"Pb1pa1v5hH","ogLgcFnPFB","sqVrfMmsIo","7Ow5CSWfou","WDVWJEoToP","Y1mC0CNHmv","rz7UtjzUqR","BGaQYNcICA","4W0TlZUnqt","gjUTutaOXK",
+"WmadAnFqik","D6rByTXQ0Z","CdyBVhUTw7","SWfoutjQxs","uQIczv8yFN","0Wr5y7fKYU","RpBQmtaOXK","LewvMZv7z0","W7cTs7X3uy","P6bcgbZLvS",
+"Z4I1vGrDg7","KZamHqUJMd","iqv4kfcJOy","Nxx9VblLA9","taOXK5Drn0","UmaEvGrDg7","7fsYMXflUq","t59lR9rlg9","JKWYR2ZHdk","VerEASs0Zu",
+"Chuy3D6rBy","tvdkDh1zcH","BpYhVs7Mxk","DLhzMnlaBy","M6qcGWDVWJ","m4bxU55rfB","uQIczYjB9t","KZamH7hyVv","2DREs07n1c","6q6L98xEKz",
+"FLsphCK5W7","QnJ1SkB5nP","ogLgc7hyVv","zFgtB8hJdt","pWiOsatef2","AkKTk48cHL","dQ586qUJMd","DLhzMfmIK1","QnJ1Sv2eC3","ogLgcGSQwj",
+"7hyVvHzZT8","Ss0Zu4dEz6","IjTwPQssNC","AkKTkYf2Ec","mz8gxNo0Qb","qaofNHfyNQ","StlDJ9rlg9","ix74rVprf2","2DREs8hJdt","m4bxUd85a9",
+"rKDLJFwEJz","14FLRAkKTk","IKxdLSWfou","PYBf4t98iW","VerEA55rfB","5ZaEzk85Ae","tvdkDSjskQ","iKqhr55rfB","8hJdtUvlv4","TCgPpL7cGc",
+"xciqpkZANm","nlaByiqv4k","CIShGHRxd8","GSQwjfqypy","kB5nPFFDui","LDk6fFnPFB","HfyNQ0Kyfs","QWxoT5Namm","GrDg7VBjhz","8TxD78U2nU",
+"J2mQi5nmWv","uvf7AUl4a1","07n1cVBjhz","piJSkm4bxU","FNYIMCqqaD","CK5W7taOXK","FwEJzXyPZN","AXpwEEdBKc","MGlTFXflUq","HfyNQChuy3",
+"CNHmvd7vjM","hUTw7FxX9q","AIYUu5VZjS","he9IAuPX7G","WDVWJQWxoT","55rfBSWfou","Q6LixpFrrl","KsjRKNAFuw","lm0pD1v5hH","aFFssoVQp6",
+"HzZT8vOqCE","ciuWz618Di","AXpwElH1kt","Cfgr3CNHmv","iwzGkDQimp","XflUqRkQke","sqVrfFLsph","4dEz6qQxHP","k85AeciuWz","Cfgr3uTacx",
+"DQimp8FmFH","EoToPQClRL","rhl0Jjtn0X","h1zcHNxx9V","SmGzvNhXdu","y94nwru4UG","EOE1oUl4a1","5Mg9rbgJAz","gjUTukB5nP","29QAzZzJHW",
+"9GXkXlH1kt","yEfy9qUJMd","FFDuiKASQ8","dhSuH0MR5X","iKqhrFjHXR","CxVEfMmKGJ","FGzgpHlUbF","bZLvS7ku1p","GrDg78U2nU","gjUTus93Ml",
+"8FmFH3weIF","6q6L9HfyNQ","i7WMQ5iGN5","Mkgy8SjskQ","uupzkoGu6x","wDajXL7cGc","2TRI78TxD7","Ta8f6BFkb8","NhXduiqv4k","In3NStAOsr",
+"0Wr5yrz7Ut","FnPFBiwzGk","qUJMdFNYIM","jSjS3piJSk","v1HlnYjB9t","8FmFHfFDrJ","I7p2atAOsr","BGaQYlpF6W","zY1GYZzJHW","1v5hHDcpWB",
+"RACujtAOsr","F6PT2cmXIX","bZLvSFnPFB","2ZHdk7X3uy","LbRTHO3iyQ","d7vjMnnP8o","yluBxLDk6f","CqqaDQnJ1S","xReecMkgy8","zz4ZUl83Ud",
+"v8yFNRxrsm","AmdQdSs0Zu","ydG8U1LB1L","4dEz6sqVrf","VIlwPsuY4x","iKqhrLbRTH","QnJ1S5Drn0","5VZjSpvgjS","JkzUnmz8gx","5Drn0vLsmS",
+"yToGWQ6Lix","lCMxySs0Zu","G1RhSlViBv","e6e4zIjTwP","uAWyp29QAz","2Yz7Epv0i7","QssNCMmKGJ","VIlwPvLsmS","Oz8yZFPfSE","jiVBPuoStw",
+"ni2v1fqypy","0YAGH580YD","7X3uyWmadA","YjB9tlXFOB","lCMxyRkQke","MezSWd85a9","cQOnvUvlv4","vkCHHatef2","Y1mC0ksJby","v8yFN5IhmG",
+"suY4xCp3mZ","tAOsrNo0Qb","AmdQdRpBQm","CdyBVzY1GY","8cVD3TXQ0Z","8TxD7hE1Ql","CK5W7W3VFH","YjB9ts7Mxk","Q6Lixs7Mxk","lj07QwDajX",
+"HP433JRJQB","yToGWfLNg8","t98iWrhl0J","7X3uypFrrl","guMb83weIF","64s8NvkCHH","BpYhVoVQp6","0MR5XgdQsS","uTacx55rfB","t98iWdhSuH",
+"lH1kt2Yz7E","jeskS7Ow5C","M6qcGRmDcr","No0Qb5ZaEz","l83UdW3VFH","HfyNQix74r","M3zXLCdyBV","4W0Tliqv4k","uZPqgPb1pa","zQt6QRACuj",
+"POUYSjzUqR","d7vjMZUnqt","FFDuiyofH3","jeskSNo0Qb","L7cGcgtCA5","YjB9tJ2mQi","Vprf2MmsIo","0MR5XzY1GY","taOXKpAhR1","6q6L9FFDui",
+"pFrrlOxWIH","5Drn0uN6r3","mX2GEulk41","HP433hUTw7","dpe1viqv4k","FLsphNhXdu","POUYSv1Hln","55rfBguMb8","O3iyQGrDg7","2Yz7EJIqXi",
+"ksJbyuoStw","tl72WUmaEv","9y4lwFFDui","zFgtBaFFss","GXdoHAIYUu","nlaByWreyP","7fKYUuLtKs","uTacx8FmFH","mX2GEFFDui","djsrvpFrrl",
+"fmIK15ZaEz","atef2580YD","uPX7G1LB1L","zz4ZUHfyNQ","jiVBPyToGW","iqv4kVerEA","kZANmoVQp6","TCgPpk85Ae","tvdkDVNCPd","yluBx580YD",
+"euZA5OUqFM","lm0pDpvgjS","e6e4zkB5nP","0BmCyi3pyd","VBjhzFNYIM","7Ow5CyToGW","Oz8yZmX2GE","hUTw7CqqaD","FNYIM7fsYM","B3qem5ZaEz",
+"Cp3mZcL0aE","VBjhz4QMc9","MK07YQ6hMC","UlU3MiKqhr","UlU3MRzaZA","lweGyuPX7G","JIqXizqH0W","9eoRcL7cGc","0KyfswiHrZ","QworuOxWIH",
+"pvgjSsuY4x","y94nwuZPqg","oVQp6lViBv","JKWYRK20wK","JJs5mGrDg7","y94nwnlaBy","zqH0W6AFT0","FxX9qs7Mxk","Ul4a1tl72W","KASQ8MezSW",
+"Ss0ZuhSSvQ","6AFT0SmGzv","BGaQYOz8yZ","uTacxGrDg7","gf8rIYOfrY","RACujOz8yZ","In3NSiwzGk","Y1mC0n8pJ9","L7cGczY1GY","2DREslj07Q",
+"MmKGJokgRi","n8pJ9JRJQB","jfREuFVMxo","bgJAz0YAGH","LDk6f5ZaEz","618DiK20wK","MmsIoOxWIH","5VZjSpWiOs","lH1ktMGlTF","W3VFHWMiS3",
+"azIWpuPX7G","0MR5XWMiS3","FGzgpSbRYy","v2eC37lUXZ","6AFT0jiVBP","HP4335Namm","lweGypv0i7","WPmlxiqv4k","zFgtB2hEEU","CIShG2Nslm",
+"oVQp6vkCHH","KsjRKciuWz","8cVD3GWqqX","HlUbFjtn0X","dpe1v9eoRc","RsQUqCK5W7","FFDui8FmFH","zbIYYFFDui","F6PT2RBhp0","Mm8sigtCA5",
+"GXdoHDcpWB","14FLR5Mg9r","uN6r3tl72W","64s8NzmLYD","suY4xStlDJ","SWfouvOqCE","5iGN59y4lw","1j5L8G1RhS","PYBf4Cp3mZ","ZuDtDjeskS",
+"piJSk8TxD7","4dEz6Yh1hF","BCxeCY1mC0","FjHXRFLsph","cShY2pvgjS","iB08lxXTI4","SmGzvxXTI4","uZPqgOHaBz","24ARFJKWYR","NhXduix74r",
+"LbRTHYOfrY","lsQGoyToGW","5nmWvpAhR1","JkzUnM6qcG","0YAGHPOUYS","2hEEUazIWp","vOqCETCgPp","lsQGoVBjhz","CNHmvjSjS3","lsQGoQbxXc",
+"MmKGJxReec","S77LHZJTXH","8TxD7X6Pin","0MR5XLewvM","6AFT0qQxHP","X6PinhE1Ql","Dz1R32DREs","Vprf2lj07Q","aDGtSa00b5","jzUqRlCMxy",
+"hE1QlUlU3M","4W0Tlrz7Ut","gtCA5aL6AJ","45cIHP6bcg","M6qcGThjNn","l83Udt59lR","oQ87rPb1pa","ZUnqtBpYhV","aFFssMezSW","oVQp6yvOMI",
+"VerEAl83Ud","HzZT8t98iW","jtn0Xdjsrv","mX2GElH1kt","OHaBzLDk6f","s93Ml2DREs","fmIK1GXdoH","KASQ8cQOnv","0YAGH8TxD7","nnP8oCfgr3",
+"9iGoTxReec","SmGzv55rfB","kB5nPuupzk","5ZaEzOz8yZ","7hyVvCp3mZ","zz4ZUJIqXi","HzZT8yofH3","he9IA3otm6","brhlQjfREu","zFgtBQClRL",
+"ZzJHWsoy9t","UmaEvs7Mxk","mz8gxDcpWB","hE1Ql5iGN5","5iGN5CqqaD","WmadADz1R3","yToGWKZamH","VjCZq0YAGH","cmXIXIBe8k","nnP8ogtCA5",
+"ciuWzWMiS3","5ZaEziB08l","fcJOyjS1aj","uN6r3t59lR","JkzUnUmaEv","5VZjSB3qem","pv0i7hE1Ql","UlU3MazIWp","B3qemmX2GE","QbxXcuZPqg",
+"8xEKzWaim6","W3VFHix74r","CIShGChuy3","vOqCEZuDtD","mX2GE8TxD7","8xEKzVprf2","lsQGocShY2","1j5L8zFgtB","SmGzvWMiS3","rz7Ut0Wr5y",
+"Ss0ZuqaofN","dmoS76q6L9","ZzJHW7fKYU","KsjRKi3pyd","qaofNtjQxs","QbxXcFxX9q","CIShGiqv4k","JIqXiSmGzv","MmKGJlCMxy","soy9tulk41",
+"9iGoTKZamH","0YAGHrhl0J","MmsIooVQp6","s7MxktAOsr","CqqaDQbxXc","0YAGHM3zXL","DQimpyEfy9","NcICAcShY2","v8yFNa00b5","PYBf4pT8wu",
+"fcJOyjSjS3","lCMxyTwano","ECMvUxXTI4","sqVrfix74r","ZzJHWNo0Qb","9GXkXfmIK1","IjTwPuoStw","yToGWNhXdu","lweGyThjNn","AmdQdguMb8",
+"ni2v1S2Dfu","cL0aEtlILt","v1Hlns93Ml","FcWrWgdQsS","zFgtBM3zXL","MmKGJh1zcH","AXpwEMojnP","djsrvQssNC","lsQGoMaJQs","QssNCDz1R3",
+"ogLgc0ao3l","9y4lwdhSuH","BFkb8Zv7z0","3otm6OHaBz","5ZaEzzQt6Q","zY1GYjeskS","9XyT9GSQwj","MK07YzHF1q","brhlQ29QAz","uupzkXflUq",
+"jtn0XpWiOs","Mm8siHfyNQ","pAhR17X3uy","14FLRNo0Qb","K20wKFPfSE","oQ87rSjskQ","iqv4kMK07Y","pmeCd3weIF","ru4UGn8pJ9","RsQUqMGlTF",
+"gIYvEBCxeC","K20wKeuZA5","P6bcgtjQxs","RpBQmWDVWJ","i3pydni2v1","SjskQM3zXL","WaWsvfcwDa","ru4UGGv3Fq","pT8wuWaim6","uPX7GqQxHP",
+"yluBxbZLvS","BbwgApv0i7","0h1b1v2eC3","jSjS3M6qcG","s7MxkpmeCd","WMiS3pWiOs","GWqqXoVQp6","VNCPdLewvM","EdBKcblLA9","F6PT2gIYvE",
+"lweGyaDGtS","QbxXcuAWyp","aDGtS0MR5X","s93Mljtn0X","zmLYDEOE1o","bZLvSMm8si","jSjS3JKWYR","lpF6WZuDtD","0h1b1OUqFM","guMb8lkMUA",
+"uupzk0Kyfs","1LB1Lru4UG","Yh1hFsoy9t","X6PinVLTy6","8U2nUcShY2","LbRTHSjskQ","9eoRcECMvU","618DiWmadA","suY4x4W0Tl","Waim6F6PT2",
+"Kr8ysZJTXH","7Ow5CjS1aj","0PktIl83Ud","lj07QYOfrY","taOXK5VZjS","P6bcgDG4sT","tvdkD8FmFH","faHirZUnqt","ZzJHWxReec","P6bcgpFrrl",
+"Oz8yZ1j5L8","Dz1R3AgJHQ","F6PT2QWxoT","blLA9JkzUn","azIWpMojnP","n1pmO5iGN5","07n1cF6PT2","RxrsmeuZA5","GWqqXSs0Zu","CqqaDprNT6",
+"vkCHH0MR5X","RmDcr0Kyfs","euZA5oQ87r","jfREuv8yFN","7fsYMcL0aE","jfREuLewvM","iqv4k7fsYM","MmKGJUlU3M","vOqCEni2v1","pvgjSFPfSE",
+"oQ87rtl72W","Mm8sijS1aj","SbRYyni2v1","EoToPJRJQB","FPfSEe6e4z","MmKGJOHaBz","tvdkDatef2","0PktIX6Pin","ReKEWzHF1q","fcwDaMojnP",
+"CdyBV5iGN5","lpF6W5Drn0","X6PinLbRTH","UlU3MpiJSk","WreyPjzUqR","zY1GYdmoS7","OUqFMOHaBz","qQxHP64s8N","d7vjMAXpwE","SmGzvYf2Ec",
+"azIWpFFDui","gdQsSReKEW","CNHmvuTacx","cL0aEQ6hMC","O3iyQlj07Q","JkzUnlsQGo","brhlQGv3Fq","ZhwG114FLR","uvf7Amz8gx","NhXduRsQUq",
+"zmLYDtaOXK","Dz1R3MaJQs","v1HlnG1RhS","okgRiIBe8k","FnPFBFVMxo","XflUq9iGoT","Uvlv4K4GS8","QYxC0SbRYy","qQxHPOUYuF","8U2nUIn3NS",
+"tuDySJXljW","rz7UtKZamH","FFDuikZANm","CIShGGWqqX","tvdkDsoy9t","M6qcG0YAGH","pT8wuJRJQB","F6PT2euZA5","QChxsiwzGk","3weIFx3LDe",
+"BCxeCpiJSk","rKDLJZuDtD","fcwDaaez9y","ksJbylpF6W","ThjNnTa8f6","Uvlv4Gv3Fq","AXpwE7ku1p","FwEJzfcJOy","wiHrZO3iyQ","azIWprKDLJ",
+"pv0i729QAz","suY4xEoToP","MezSWbZLvS","Ta8f6W7cTs","piJSk16lHc","dpe1v0Kyfs","fFDrJGXdoH","Mkgy8SWfou","rhl0J9GXkX","Dz1R30Wr5y",
+"a00b5d7vjM","QYxC0ZuDtD","CdyBVdQ586","s7MxkI7p2a","yToGWuQIcz","0ao3lVIlwP","14FLR9GXkX","ulk41hYBCK","Pb1paciuWz","ksJbym4bxU",
+"5Mg9rECMvU","AOgEezFgtB","lj07QI7p2a","ZuDtDRxrsm","QnJ1SLewvM","oQ87rgIYvE","JXljW7hyVv","5Drn0OHaBz","lCMxyoGu6x","RsQUqYjB9t",
+"3weIFk85Ae","24ARFUlU3M","07n1coQ87r","4W0TloVQp6","zbIYYZhwG1","t98iWWreyP","07n1cjS1aj","uJScXKASQ8","S2DfuJ2mQi","Uvlv4QChxs",
+"t59lR7fKYU","AXpwEZUnqt","ciuWzB3qem","jtn0XJJs5m","Cp3mZuvf7A","t98iWrKDLJ","1v5hHuJScX","Y1mC0Yf2Ec","VBjhzfFDrJ","JRJQBVjCZq",
+"FjHXRSWfou","IRh48hE1Ql","jfREuVerEA","7ku1pStlDJ","QClRL5iGN5","he9IA5Namm","7lUXZru4UG","tjQxsPYBf4","ZuDtDtAOsr","TXQ0ZJKWYR",
+"OHaBzv8yFN","TXQ0ZfLNg8","RACujrhl0J","hi5X748cHL","Rxrsm9eoRc","blLA96AFT0","uJScX1v5hH","0Kyfs3otm6","e6e4z5drc6","16lHccL0aE",
+"yEfy9L7cGc","StlDJMmKGJ","MmKGJguMb8","xciqpDz1R3","MojnP14FLR","b29RJbgJAz","hSSvQBpYhV","FwEJz1v5hH","ZUnqtuJScX","Gv3Fq4QMc9",
+"DQimp07n1c","DLhzM4dEz6","VNCPdatef2","h1zcHsoy9t","vkCHHxReec","8FmFHbrhlQ","hUTw7Mkgy8","LbRTHpT8wu","Uvlv4JKWYR","No0QblViBv",
+"8hJdtzQt6Q","GrDg7tvdkD","Mm8sifaHir","WaWsvEOE1o","S2DfujiVBP","lm0pDECMvU","kZANms7Mxk","X6PinMmsIo","Uvlv4EoToP","J2mQiTwano",
+"BCxeCCK5W7","Zv7z0W7cTs","yvOMIS77LH","kZANmuupzk","2TRI7Waim6","GSQwj0BmCy","CqqaDFwEJz","CIShGprNT6","fqypyMK07Y","No0QbMm8si",
+"FPfSEFGzgp","L7cGcMm8si","fmIK1qaofN","HlUbF24ARF","ulk41n8pJ9","5iGN5Yw2oU","GWqqXaFFss","Yh1hFgIYvE","lXFOBIKxdL","RACujSs0Zu",
+"8xEKzJJs5m","lCMxy8U2nU","OUqFM3otm6","aDGtSRACuj","I7p2aX6Pin","5iGN5FjHXR","Vprf2s7Mxk","taOXKZhwG1","IKxdL7fKYU","0MR5XFPfSE",
+"Mm8silH1kt","DLhzMKZamH","ni2v1NOHsz","hUTw7FcWrW","5Mg9ri3pyd","tl72W0Wr5y","DG4sToQ87r","BbwgAtl72W","BGaQYYjB9t","CxVEfEOE1o",
+"nnP8ozmLYD","9iGoTThjNn","jeskSh1zcH","lCMxyFVMxo","5NammQbxXc","9XyT914FLR","16lHcx3LDe","vOqCEWMiS3","brhlQzqH0W","GSQwjFFDui",
+"9y4lwB3qem","taOXKPb1pa","CxVEfUlU3M","1LB1L6q6L9","HP433ZJTXH","5VZjSuvf7A","oQ87r5drc6","QChxsXyPZN","D6rByK20wK","PYBf49XyT9",
+"X6Pin29QAz","aFFss2ZHdk","n1pmORsQUq","64s8Nrhl0J","lm0pDbrhlQ","lkMUAZv7z0","Uvlv49GXkX","t98iWBGaQY","14FLRfcJOy","0BmCycmXIX",
+"Yf2EctjQxs","LDk6fprNT6","VerEArz7Ut","bgJAziB08l","ciuWzgdQsS","bZLvSBFkb8","lsQGoVNCPd","YjB9t4dEz6","0PktIFhtgl","2NslmuJScX",
+"RmDcrQYxC0","SbRYy8U2nU","0BmCyCdyBV","Yf2EcIjTwP","F6PT2580YD","KsjRKlj07Q","jS1ajDQimp","uJScXAkKTk","nnP8oWmadA","nlaBy2hEEU",
+"atef2MmsIo","hYBCKFFDui","SWfouFLsph","pv0i7AXpwE","nnP8okZANm","uLtKsWreyP","7hyVvRACuj","VNCPdOxWIH","jS1ajpvgjS","HzZT8W7cTs",
+"iqv4knlaBy","StlDJI7p2a","7lUXZIBe8k","fmIK1pv0i7","JRJQBK4GS8","O3iyQiB08l","ZuDtD7fsYM","7lUXZpvgjS","VIlwPyToGW","9XyT9brhlQ",
+"ydG8USbRYy","MezSWx3LDe","4W0TlksJby","W3VFH9y4lw","i7WMQQ6hMC","ThjNnOUYuF","xXTI4zqH0W","ReKEWCIShG","0MR5XTXQ0Z","8hJdtMkgy8",
+"ru4UGsuY4x","SmGzvhE1Ql","yvOMI2DREs","JkzUnKASQ8","cShY2taOXK","2DREsuN6r3","O3iyQyvOMI","t98iWoVQp6","zqH0WjS1aj","2DREsC2Irc",
+"DQimp2DREs","fLNg8ksJby","vLsmSMmKGJ","KsjRKSmGzv","0BmCyoVQp6","AXpwEn1pmO","IBe8ks7Mxk","h1zcH618Di","aDGtSpT8wu","aFFssOUqFM",
+"KsjRKjiVBP","qUJMdt59lR","uLtKsguMb8","QbxXcOz8yZ","S2DfuNxx9V","x3LDe4W0Tl","dhSuH9y4lw","B3qem0ao3l","5ZaEztjQxs","lH1kt4W0Tl",
+"lXFOBMK07Y","16lHc4QMc9","5iGN564s8N","Dz1R3fqypy","fcJOyEoToP","7lUXZv8yFN","bgJAzK20wK","MmKGJNOHsz","nnP8oOUYuF","vkCHHD6rBy",
+"i3pydVIlwP","Yw2oUStlDJ","EOE1ohSSvQ","l83Ud5nmWv","euZA5CNHmv","dhSuHSmGzv","ZuDtDU3yw5","580YDFFDui","mz8gx4dEz6","aez9yKASQ8",
+"tvdkDpiJSk","CxVEfFPfSE","1j5L8K4GS8","9GXkXCqqaD","mz8gxStlDJ","CxVEfkB5nP","5Drn0QbxXc","AIYUuQClRL","iB08lhi5X7","7hyVvAOgEe",
+"HlUbFRsQUq","VerEAMojnP","XflUqQWxoT","0h1b124ARF","tAOsrRxrsm","Nxx9V618Di","QssNC8cVD3","HRxd8tl72W","yvOMIFLsph","POUYS8U2nU",
+"8cVD3djsrv","a00b5cmXIX","soy9tfaHir","iqv4kMm8si","tl72WCK5W7","QWxoTVjCZq","fcJOyhi5X7","oGu6xqaofN","2Yz7E2Nslm","Zv7z0rhl0J",
+"BbwgAix74r","8RCUApvgjS","sx5Gl8cVD3","FGzgp5iGN5","nlaByCNHmv","5NammQ6hMC","uvf7AJJs5m","FGzgpAkKTk","618Di5Mg9r","oVQp64W0Tl",
+"gjUTupFrrl","6q6L9oGu6x","LewvMkZANm","JIqXiXflUq","DLhzMVBjhz","Ta8f62Yz7E","dpe1vpFrrl","5VZjSMK07Y","580YDIRh48","d85a9RkQke",
+"8TxD70BmCy","s7MxkS77LH","HlUbFzQt6Q","CdyBVJJs5m","Yf2Ec07n1c","blLA9GSQwj","MmKGJThjNn","blLA9DLhzM","NAFuwoGu6x","RzaZAF6PT2",
+"lpF6WWaim6","Cfgr3HzZT8","QClRLZ4I1v","RpBQmlpF6W","8RCUAJIqXi","5nmWvO3iyQ","vLsmSgjUTu","d85a92Yz7E","CIShG7lUXZ","dhSuHWMiS3",
+"ni2v1bgJAz","JkzUn5IhmG","5Mg9r9GXkX","RmDcrhi5X7","DLhzM5iGN5","ReKEW0Kyfs","lH1kt5Mg9r","oQ87r0h1b1","StlDJSWfou","580YDNhXdu",
+"No0QbtvdkD","QbxXcKsjRK","OHaBztaOXK","CK5W7Q6Lix","pT8wus4786","FjHXR5ZaEz","AgJHQ0BmCy","FFDuihE1Ql","jtn0X0BmCy","QbxXcyofH3",
+"pFrrlMK07Y","aez9ykB5nP","45cIHW7cTs","GrDg7Rxrsm","UmaEviKqhr","AOgEeP6bcg","8xEKzQChxs","Pb1pa4QMc9","JRJQBzmLYD","FcWrWW3VFH",
+"XflUq0ao3l","0YAGHMmKGJ","zHF1q9GXkX","aez9y9rlg9","No0QbHzZT8","DG4sTzY1GY","BpYhVvkCHH","lj07QReKEW","iB08lJXljW","AOgEeHRxd8",
+"hE1Qlb29RJ","Yw2oUFFDui","Oz8yZvOqCE","QYxC0zz4ZU","d85a9W7cTs","IjTwPlweGy","HP4330h1b1","mX2GEJRJQB","HlUbFlj07Q","AgJHQQ6hMC",
+"9iGoTd7vjM","qaofNlweGy","t59lRnlaBy","Nxx9V07n1c","6AFT01LB1L","VLTy6IRh48","ReKEWRmDcr","FPfSElkMUA","aFFssS2Dfu","EOE1oK20wK",
+"ZJTXHWaim6","14FLRuN6r3","kB5nPaez9y","CNHmvCfgr3","7ku1pG1RhS","XyPZNgdQsS","dpe1vRxrsm","16lHcqQxHP","ni2v10ao3l","ydG8UIjTwP",
+"MGlTFv2eC3","Kr8ysJkzUn","9GXkXxXTI4","fqypyQnJ1S","zmLYDU3yw5","hSSvQyToGW","Z4I1vru4UG","rKDLJtAOsr","OxWIH5drc6","MezSW4W0Tl",
+"o8Uyd5nmWv","uN6r3fmIK1","5Drn0uTacx","OUYuFBFkb8","CIShGZzJHW","uPX7GGrDg7","MmsIofFDrJ","0MR5XzqH0W","tl72Wxciqp","0Kyfs8cVD3",
+"CxVEfmX2GE","bgJAzNOHsz","fFDrJ4dEz6","cmXIXQWxoT","VBjhzD6rBy","fcJOyt98iW","jiVBPQbxXc","h1zcHWmadA","9iGoTTa8f6","guMb8WreyP",
+"S77LHAXpwE","0BmCycQOnv","rhl0JWPmlx","UlU3MaFFss","FcWrWF6PT2","9GXkXKZamH","jiVBP0MR5X","NOHsz45cIH","zbIYYbrhlQ","ksJbyFhtgl",
+"dpe1vuZPqg","oGu6xatef2","lj07QQbxXc","dpe1vLDk6f","lH1kt5nmWv","qUJMdLewvM","djsrvfcJOy","yluBxNxx9V","fcJOyd7vjM","M6qcGNo0Qb",
+"tuDySlweGy","QYxC0qaofN","QChxsTa8f6","fcJOy1j5L8","faHirdpe1v","DLhzMQClRL","Zv7z0aFFss","JXljWHfyNQ","y94nwRxrsm","fFDrJ1LB1L",
+"dmoS75VZjS","oVQp6zHF1q","ydG8UyofH3","5VZjSNhXdu","oGu6xFhtgl","No0QbtuDyS","zQt6QAgJHQ","GWqqXgf8rI","8RCUAVBjhz","jS1ajqaofN",
+"0YAGH9y4lw","gjUTulsQGo","y94nwZUnqt","14FLRlViBv","RBhp0Fhtgl","Chuy3KsjRK","GSQwj5Mg9r","ECMvUIBe8k","v8yFNZUnqt","VNCPdL7cGc",
+"8RCUAcShY2","W7cTsd85a9","BCxeC4dEz6","8TxD7FjHXR","Mm8si2ZHdk","Yf2Ec5Namm","Pb1pa7Ow5C","uupzkBbwgA","5drc6EdBKc","a00b5n1pmO",
+"zqH0W7X3uy","ksJbyW7cTs","FwEJzRpBQm","HP433SWfou","IBe8ka00b5","nlaByAmdQd","CNHmvcL0aE","SbRYyzbIYY","48cHLL7cGc","FNYIMdQ586",
+"Yh1hFgjUTu","xciqp07n1c","JXljW07n1c","DG4sT2Yz7E","AIYUuZ4I1v","Uvlv4No0Qb","FnPFBMGlTF","Yf2EczmLYD","GWqqXlsQGo","8xEKzdpe1v",
+"ECMvUB3qem","gtCA5BCxeC","4QMc9GXdoH","AgJHQfmIK1","3otm6m4bxU","uZPqggjUTu","2DREszQt6Q","IKxdLNcICA","ix74r5ZaEz","5ZaEzjeskS",
+"fcJOytl72W","MezSWwiHrZ","hUTw7AgJHQ","kB5nPguMb8","5Drn0zz4ZU","9eoRcjeskS","n1pmOrhl0J","UmaEvkB5nP","SWfous4786","7lUXZn1pmO",
+"GWqqXtaOXK","HlUbFXflUq","6AFT0t98iW","jSjS3OxWIH","aFFss9GXkX","lsQGofLNg8","WreyPI7p2a","RzaZAyofH3","SbRYyqQxHP","euZA5pAhR1",
+"0h1b1JXljW","SbRYypv0i7","WmadAcL0aE","LDk6fhi5X7","tuDyS8hJdt","M6qcGBGaQY","QChxsMkgy8","Gv3Fqk85Ae","m4bxUBFkb8","U3yw5y94nw",
+"0BmCyuupzk","vLsmSDG4sT","xciqpOHaBz","FnPFBnFqik","1LB1LZUnqt","5iGN5yvOMI","7Ow5Cs7Mxk","aez9yRpBQm","pAhR1WDVWJ","CdyBV48cHL",
+"mz8gxpv0i7","ru4UGdpe1v","oQ87rO3iyQ","VLTy60YAGH","618DiPOUYS","Q6hMC4dEz6","jzUqRYh1hF","29QAzlkMUA","VLTy6pv0i7","CIShGS77LH",
+"5iGN5K4GS8","IKxdLiqv4k","tvdkDFxX9q","EoToPcmXIX","tAOsrkZANm","m4bxUiKqhr","IRh48C2Irc","SWfou8RCUA","WmadAIjTwP","uN6r38TxD7",
+"qUJMd8cVD3","mX2GEXyPZN","CNHmvjiVBP","RxrsmrKDLJ","GXdoHBpYhV","jSjS3LewvM","ZJTXHKZamH","U3yw5FFDui","FjHXR1LB1L","fFDrJUlU3M",
+"AkKTkBbwgA","jtn0Xk85Ae","lsQGoGv3Fq","8U2nUn1pmO","CIShGlj07Q","In3NSyEfy9","QssNCzHF1q","64s8NokgRi","SmGzvD6rBy","fFDrJpAhR1",
+"mz8gxm4bxU","2Yz7ELewvM","QssNCJJs5m","Z4I1vMaJQs","lm0pDfFDrJ","2ZHdkPb1pa","JKWYRAXpwE","6AFT0OUqFM","lpF6WTXQ0Z","hE1QlCdyBV",
+"NAFuwlpF6W","0PktI5IhmG","ni2v1RACuj","tAOsrPOUYS","pv0i7cQOnv","qQxHPJJs5m","8hJdtDcpWB","FFDuiQnJ1S","bgJAz7ku1p","QnJ1SZUnqt",
+"W7cTslViBv","uPX7GKsjRK","7lUXZY1mC0","CqqaDMGlTF","jzUqRFFDui","lsQGoiwzGk","ZhwG1pWiOs","5Mg9rHRxd8","K20wKwDajX","tuDySOHaBz",
+"7fKYUJJs5m","WMiS3Twano","Ss0ZuksJby","UmaEv0h1b1","cmXIXyEfy9","Q6hMC3weIF","0ao3lxXTI4","nnP8oFnPFB","bgJAzciuWz","wiHrZuN6r3",
+"uJScXuN6r3","AXpwEgf8rI","IjTwP5drc6","fcwDaECMvU","8hJdtLewvM","djsrvs7Mxk","uN6r3HRxd8","4W0TlyEfy9","NcICAxXTI4","x3LDe5Drn0",
+"okgRi4dEz6","9eoRc3otm6","1LB1LUl4a1","guMb8BbwgA","a00b5WDVWJ","VjCZqAOgEe","AgJHQYh1hF","uTacxYh1hF","Uvlv4ciuWz","ZzJHWlj07Q",
+"ogLgc9XyT9","DQimp7hyVv","suY4xReKEW","GrDg7qUJMd","HP433rKDLJ","jSjS3zFgtB","P6bcgguMb8","hSSvQiKqhr","FwEJzJKWYR","4dEz6lCMxy",
+"lH1ktuQIcz","nlaByhYBCK","Q6hMCJkzUn","l83UdAgJHQ","4dEz6IRh48","zY1GYgIYvE","ThjNn0Wr5y","Chuy3EoToP","HfyNQnlaBy","7hyVvDcpWB",
+"Ul4a1lXFOB","QbxXclpF6W","iwzGkHP433","okgRiIn3NS","BpYhVUlU3M","0PktIhSSvQ","GWqqXqUJMd","Q6Lixv8yFN","5VZjSGSQwj","oQ87rFGzgp",
+"d85a9MmKGJ","Oz8yZxciqp","k85AeSs0Zu","wiHrZ2TRI7","KZamHzY1GY","FPfSEoQ87r","GSQwjhSSvQ","d85a9t98iW","Q6hMCtAOsr","k85Aerz7Ut",
+"WPmlxhYBCK","RpBQm0YAGH","MK07Yi3pyd","EoToPWMiS3","MmKGJa00b5","DcpWBuvf7A","K4GS8fmIK1","mz8gx2TRI7","SWfoud7vjM","RkQkerz7Ut",
+"9rlg95IhmG","cShY2GXdoH","RxrsmzbIYY","5Mg9riqv4k","DQimpDG4sT","o8UydZuDtD","n8pJ9TXQ0Z","Q6LixIjTwP","yluBxC2Irc","S77LHP6bcg",
+"jeskSWaim6","RACujazIWp","KASQ8he9IA","7fsYM7fKYU","55rfBni2v1","4dEz6rz7Ut","1LB1LpmeCd","uupzkGrDg7","QYxC0hSSvQ","suY4xgf8rI",
+"ZUnqtsqVrf","iKqhr5iGN5","WDVWJCfgr3","uoStwuAWyp","Kr8ysYf2Ec","iqv4kJJs5m","y94nwYjB9t","he9IAiqv4k","FNYIM9XyT9","KsjRKStlDJ",
+"atef2yvOMI","Ul4a1VjCZq","IKxdLFLsph","jfREuAgJHQ","QbxXciwzGk","3weIFPb1pa","2ZHdkOxWIH","Gv3Fqzz4ZU","prNT6NcICA","hUTw7QnJ1S",
+"t98iWuZPqg","JkzUn14FLR","GrDg7GSQwj","gtCA5pmeCd","uZPqgRmDcr","5ZaEzYh1hF","Z4I1vUmaEv","X6Pin0YAGH","soy9tNxx9V","Ul4a1QnJ1S",
+"MojnP2ZHdk","cmXIXHRxd8","9rlg9Ta8f6","t98iWtaOXK","CNHmvDG4sT","EdBKcUl4a1","O3iyQJIqXi","soy9tzY1GY","5nmWvKASQ8","ZuDtD9eoRc",
+"IKxdLaFFss","qQxHPQnJ1S","55rfBx3LDe","dpe1v9iGoT","2ZHdktuDyS","L7cGcrhl0J","atef2djsrv","JRJQBRACuj","MojnPLbRTH","uJScXyluBx",
+"FjHXRxReec","FhtglgjUTu","iwzGkpFrrl","5VZjSiwzGk","ECMvUVBjhz","s4786ksJby","iqv4kHP433","TXQ0ZWreyP","24ARF4dEz6","suY4xazIWp",
+"6AFT0Waim6","ydG8U8U2nU","0Kyfs0PktI","D6rBy5Mg9r","uN6r3Q6hMC","TXQ0ZgjUTu","FwEJzh1zcH","U3yw5QChxs","brhlQBpYhV","NhXdujtn0X",
+"djsrvfmIK1","RkQkeCxVEf","jzUqR4dEz6","XflUqd7vjM","AgJHQpiJSk","VBjhzM3zXL","v1Hln7X3uy","7ku1pFFDui","x3LDeksJby","jzUqRqQxHP",
+"1v5hHhe9IA","8U2nULbRTH","O3iyQGXdoH","lpF6Wrhl0J","RmDcrLewvM","yofH3ReKEW","YOfrY5ZaEz","lH1ktSmGzv","tAOsr1LB1L","P6bcgiKqhr",
+"dQ586RpBQm","zz4ZUYOfrY","kZANm5Mg9r","v1Hln7ku1p","5IhmGRxrsm","nnP8ozqH0W","ECMvU7hyVv","oGu6xmz8gx","vLsmSAIYUu","t59lRt98iW",
+"HP433RmDcr","29QAziB08l","s7Mxkn1pmO","YjB9tMGlTF","Mm8sinFqik","JRJQBCfgr3","tuDyScmXIX","Twano5Mg9r","RzaZAv8yFN","fLNg8KASQ8",
+"YjB9tDQimp","t59lRfLNg8","o8UydiKqhr","JIqXiCp3mZ","oGu6xpv0i7","HfyNQ5Mg9r","GSQwj2DREs","POUYSZ4I1v","qUJMdMGlTF","sx5GlW3VFH",
+"zY1GY6AFT0","uQIczmX2GE","aez9yFjHXR","2ZHdk8U2nU","RzaZAatef2","lH1kt580YD","lweGyt59lR","MGlTFQWxoT","SjskQMmKGJ","NAFuwVprf2",
+"POUYSRpBQm","yluBxt98iW","3weIFhi5X7","aez9yXyPZN","nFqikIKxdL","WDVWJuLtKs","ZJTXHuAWyp","M3zXLAOgEe","dhSuHs93Ml","6q6L9euZA5",
+"YjB9tRkQke","mz8gxru4UG","fcwDaQ6hMC","xXTI4AkKTk","nlaByRzaZA","HzZT8Yf2Ec","QbxXcpT8wu","bZLvSnFqik","55rfBM6qcG","4W0TluoStw",
+"9eoRcP6bcg","G1RhShi5X7","EOE1oLbRTH","7hyVvlXFOB","9XyT99eoRc","ix74rEOE1o","sqVrffaHir","7Ow5CFGzgp","O3iyQ7ku1p","nlaBy55rfB",
+"uAWyp8TxD7","yvOMIZhwG1","soy9tzFgtB","07n1ck85Ae","7ku1pAgJHQ","AmdQd16lHc","8cVD3azIWp","MGlTFa00b5","hUTw7FVMxo","8U2nUQworu",
+"piJSkbgJAz","8FmFHRzaZA","uZPqgazIWp","pv0i7ZUnqt","iqv4kuPX7G","FwEJziB08l","e6e4z8RCUA","L7cGctlILt","MGlTFZv7z0","4W0Tls93Ml",
+"JJs5m0ao3l","2NslmTa8f6","WmadAdjsrv","0Wr5yI7p2a","FNYIMzbIYY","djsrvP6bcg","5VZjSkZANm","GWqqXStlDJ","Nxx9VyvOMI","AOgEezqH0W",
+"0ao3liKqhr","lViBvEOE1o","S77LHPYBf4","9iGoTHRxd8","9GXkXFjHXR","9XyT9VLTy6","VIlwPbrhlQ","0ao3lrKDLJ","tuDySPb1pa","lweGyzFgtB",
+"MK07YM6qcG","Uvlv4lpF6W","blLA96q6L9","kB5nPgf8rI","yEfy9In3NS","dmoS7ogLgc","hUTw71v5hH","AmdQdxXTI4","mz8gxUl4a1","J2mQi48cHL",
+"WaWsvAOgEe","UmaEvQ6Lix","XflUqbrhlQ","yvOMIFhtgl","NAFuw9XyT9","SbRYymz8gx","aFFssQWxoT","FhtglRkQke","7ku1ptl72W","VIlwPuJScX",
+"0Wr5ycShY2","VjCZqo8Uyd","W7cTsnnP8o","pv0i7IRh48","faHirUlU3M","x3LDeIRh48","CNHmvyofH3","BGaQYFLsph","X6PinRkQke","Cfgr3Kr8ys",
+"29QAzdmoS7","7ku1pru4UG","M6qcGLewvM","QssNCZUnqt","8U2nUyEfy9","s4786BbwgA","8cVD3QbxXc","ECMvUvkCHH","NhXduguMb8","VIlwPQ6Lix",
+"7hyVvWmadA","0ao3loGu6x","M6qcG5ZaEz","BCxeCxReec","64s8NguMb8","soy9tv1Hln","BbwgAEdBKc","RzaZAQWxoT","MojnPS2Dfu","n1pmO16lHc",
+"gjUTufcwDa","RBhp0jfREu","ReKEWRACuj","MmKGJ24ARF","In3NS8RCUA","9iGoTcL0aE","In3NSIjTwP","7fsYMSWfou","VIlwPoVQp6","CNHmvlXFOB",
+"rhl0Jdpe1v","iwzGkRxrsm","v8yFNfaHir","VjCZqHP433","Kr8ysgdQsS","jzUqR5drc6","fFDrJ6AFT0","lpF6WHRxd8","No0Qb8U2nU","zbIYYIRh48",
+"5Drn0MezSW","RkQkeaL6AJ","BCxeCaFFss","PYBf48FmFH","F6PT20Wr5y","IKxdLzQt6Q","7ku1psoy9t","fcwDaRBhp0","WreyPKsjRK","lCMxyQworu",
+"9y4lwzbIYY","UmaEvNxx9V","VerEA9GXkX","guMb8P6bcg","lsQGoFVMxo","RkQkeeuZA5","aFFss0Wr5y","K20wKFLsph","zQt6Qs4786","MmKGJix74r",
+"24ARFStlDJ","1LB1Ln1pmO","K20wK14FLR","0MR5XGSQwj","M6qcGWMiS3","ZhwG19GXkX","Yf2EcuPX7G","ru4UGs7Mxk","DcpWBlsQGo","FFDuiAIYUu",
+"No0QbuLtKs","WmadAyToGW","FjHXRm4bxU","Q6LixSWfou","MGlTFFGzgp","dQ586L7cGc","XflUqpFrrl","zHF1q8U2nU","azIWpyofH3","lpF6WGSQwj",
+"s93Ml16lHc","tjQxs2DREs","6q6L9h1zcH","oQ87r8xEKz","VNCPdX6Pin","7X3uyCNHmv","sqVrfRACuj","VLTy6DG4sT","QssNCJkzUn","kB5nPrhl0J",
+"MojnPQworu","lXFOBAgJHQ","4W0TlprNT6","IBe8klViBv","hi5X77hyVv","KZamHYjB9t","HlUbFmX2GE","fcwDa2Nslm","MaJQsulk41","W3VFHm4bxU",
+"2Yz7Ek85Ae","i7WMQ9eoRc","7fKYURmDcr","VLTy6HzZT8","h1zcHru4UG","JRJQBdjsrv","FcWrWdpe1v","soy9tGrDg7","0ao3ljiVBP","pvgjS7X3uy",
+"UlU3Mgf8rI","tAOsrHfyNQ","tjQxsKASQ8","d7vjMQ6Lix","wiHrZSmGzv","KASQ8rKDLJ","EOE1oRBhp0","he9IApAhR1","SmGzvGv3Fq","FPfSESmGzv",
+"lH1ktdmoS7","0YAGH24ARF","StlDJHfyNQ","cQOnvtAOsr","UlU3MVIlwP","uvf7A0Kyfs","uvf7AuQIcz","a00b53otm6","Waim6RACuj","VBjhz7hyVv",
+"ZUnqt5VZjS","CqqaDuZPqg","AIYUuJIqXi","l83UduPX7G","pvgjS9GXkX","ZzJHWzz4ZU","gjUTuuvf7A","QnJ1Sjtn0X","fcwDa5ZaEz","GWqqXs7Mxk",
+"QChxslkMUA","6q6L90BmCy","14FLRVLTy6","Oz8yZ9GXkX","ZhwG10BmCy","8FmFHzHF1q","JkzUnIBe8k","lpF6WjeskS","S77LHfcwDa","JKWYRyToGW",
+"0MR5XOz8yZ","iKqhrni2v1","azIWpxciqp","QClRLC2Irc","K4GS8M3zXL","AkKTkhe9IA","Mkgy8NOHsz","uZPqgQWxoT","W3VFHMojnP","zHF1q7ku1p",
+"9XyT9pWiOs","Vprf2oGu6x","v8yFNuZPqg","suY4xHlUbF","t59lRRxrsm","lH1ktYw2oU","Uvlv4zmLYD","CIShGFGzgp","07n1cZUnqt","sqVrfUl4a1",
+"t59lRAOgEe","DcpWBv1Hln","jiVBPiqv4k","SjskQF6PT2","QChxsK20wK","JIqXiKASQ8","RmDcrgjUTu","rhl0JZzJHW","guMb8prNT6","W7cTsQChxs",
+"Pb1pabZLvS","J2mQiwiHrZ","hSSvQC2Irc","ix74rFwEJz","FcWrW14FLR","IRh48zqH0W","2TRI7qaofN","RsQUqtlILt","64s8NzY1GY","GSQwjHzZT8",
+"Y1mC0pWiOs","oQ87rZv7z0","rhl0Jix74r","nlaByZ4I1v","SjskQJRJQB","8hJdtS2Dfu","QworuSs0Zu","Pb1paOz8yZ","JKWYRsqVrf","2Yz7Eaez9y",
+"bZLvSvkCHH","n1pmO9iGoT","No0QbgIYvE","Twanotl72W","cShY2ni2v1","yluBx9XyT9","ZzJHWFNYIM","ciuWzhYBCK","Vprf2KZamH","FGzgphYBCK",
+"GWqqXMmKGJ","Y1mC0WreyP","cL0aEpT8wu","DcpWBCIShG","CK5W74QMc9","7fKYUlXFOB","KASQ8Q6hMC","SjskQAOgEe","FcWrW5iGN5","yvOMINo0Qb",
+"5IhmGrKDLJ","7fsYMsoy9t","LewvMM6qcG","GSQwjXyPZN","M6qcGkZANm","fcJOywDajX","GWqqXsx5Gl","5NammZv7z0","QssNCUvlv4","zqH0WbgJAz",
+"ulk41FPfSE","xXTI4O3iyQ","Kr8ys4dEz6","uTacxyvOMI","Dz1R30h1b1","jSjS35drc6","VNCPdpT8wu","HlUbFQWxoT","Gv3FqpmeCd","aFFssC2Irc",
+"7fKYUHlUbF","DQimpyvOMI","AgJHQuLtKs","XyPZNuoStw","FGzgptuDyS","IBe8kBFkb8","QYxC0uoStw","VjCZqI7p2a","HzZT8BpYhV","lViBv45cIH",
+"v1HlnAkKTk","tAOsr9XyT9","Yw2oUGXdoH","5Mg9rTCgPp","pT8wuxXTI4","okgRipmeCd","b29RJQChxs","CIShGGv3Fq","0PktIix74r","Kr8ysvkCHH",
+"07n1cOUYuF","RzaZABpYhV","RxrsmzqH0W","LbRTHJkzUn","7hyVviqv4k","tAOsrM6qcG","ru4UGDQimp","jzUqRBbwgA","h1zcHzHF1q","RzaZAfFDrJ",
+"BpYhV5Drn0","9rlg96AFT0","rhl0JhYBCK","zY1GYFxX9q","ReKEWZ4I1v","v2eC3TXQ0Z","JkzUnhSSvQ","YOfrY45cIH","lm0pDIRh48","fFDrJprNT6",
+"Mm8siQChxs","OUqFMsx5Gl","TXQ0Z5VZjS","rhl0JzFgtB","kZANm580YD","vLsmSFhtgl","Dz1R3mX2GE","QssNC55rfB","DQimp5iGN5","DcpWBbZLvS",
+"L7cGciwzGk","BGaQYBpYhV","s93MlKr8ys","fmIK1AIYUu","sqVrf5iGN5","hYBCKMK07Y","NOHszaFFss","lH1ktDcpWB","VBjhzcmXIX","nnP8osx5Gl",
+"qQxHPfmIK1","pWiOsblLA9","FNYIM7ku1p","yluBxJkzUn","aL6AJPYBf4","yofH3TCgPp","Nxx9ViB08l","JIqXiWmadA","7fKYUFVMxo","ni2v1zFgtB",
+"MGlTFSbRYy","MmsIouupzk","hE1QlHlUbF","4QMc99GXkX","UmaEvDcpWB","GWqqXFPfSE","iKqhrfaHir","FLsph0h1b1","CdyBVtjQxs","pT8wuv8yFN",
+"8hJdtPb1pa","QssNC7hyVv","NcICAStlDJ","TwanozHF1q","WPmlx48cHL","jtn0XAOgEe","580YDfLNg8","pmeCdblLA9","WPmlxmz8gx","QnJ1SJIqXi",
+"tAOsrazIWp","KASQ85Drn0","qQxHPfqypy","t59lRn8pJ9","zz4ZUUlU3M","7Ow5C6q6L9","a00b5GrDg7","FwEJzChuy3","W3VFHdjsrv","TwanopFrrl",
+"fcwDadhSuH","Uvlv4AXpwE","HfyNQ8xEKz","HRxd8WaWsv","45cIHSbRYy","dmoS7CxVEf","FhtglMojnP","aDGtSECMvU","POUYSVprf2","ciuWzFwEJz",
+"atef2Zv7z0","rz7UtZv7z0","3otm6uQIcz","UmaEvrhl0J","MmKGJ7ku1p","gjUTu1j5L8","fqypyuupzk","BGaQYbgJAz","v1HlnDcpWB","uQIcz9rlg9",
+"rKDLJKsjRK","FhtglzQt6Q","s7Mxkdpe1v","EOE1oFFDui","VjCZqlweGy","yluBxd85a9","h1zcHl83Ud","djsrvv2eC3","BCxeCRACuj","iwzGky94nw",
+"RBhp05iGN5","cQOnvCfgr3","618DiDcpWB","dQ586lkMUA","5VZjSYOfrY","SWfouNxx9V","UlU3MFFDui","AIYUu0ao3l","JIqXiRACuj","aL6AJyEfy9",
+"rhl0J5Drn0","jzUqR0Wr5y","jiVBPQWxoT","pvgjSv8yFN","FnPFBlj07Q","WaWsvtuDyS","dhSuHgtCA5","zbIYYlH1kt","dQ5867Ow5C","24ARF9eoRc",
+"StlDJsoy9t","rz7UtRBhp0","nlaByoQ87r","yofH3oVQp6","Oz8yZFVMxo","cShY2nnP8o","mz8gxPb1pa","ciuWzjfREu","VjCZquN6r3","KsjRKNcICA",
+"nFqiklpF6W","Y1mC0lsQGo","fcJOyCxVEf","5ZaEzhe9IA","F6PT25ZaEz","0h1b1618Di","zqH0W8U2nU","FnPFB14FLR","hi5X7FFDui","djsrvXyPZN",
+"MmKGJ16lHc","MmKGJtvdkD","oVQp6RzaZA","SbRYyF6PT2","taOXKsx5Gl","29QAzCp3mZ","2ZHdk5ZaEz","Chuy3yluBx","M6qcGhSSvQ","FLsphIBe8k",
+"FxX9qEdBKc","HlUbFsuY4x","QssNCHzZT8","lsQGov8yFN","pmeCdX6Pin","cQOnvMezSW","VerEAsqVrf","4dEz6NOHsz","FFDuifcwDa","Oz8yZNAFuw",
+"nnP8omX2GE","NcICAsqVrf","Oz8yZM6qcG","GrDg7WDVWJ","TCgPpiqv4k","TCgPpaL6AJ","lweGycShY2","Nxx9VaDGtS","0PktIpv0i7","vLsmSThjNn",
+"14FLRZzJHW","yluBxVLTy6","Zv7z0lm0pD","NcICARpBQm","fLNg8yvOMI","KsjRKSs0Zu","nFqik6q6L9","fFDrJ618Di","WPmlxRkQke","Mkgy8NhXdu",
+"WMiS3S77LH","WreyPS77LH","hSSvQ0Wr5y","EoToP48cHL","K20wKFNYIM","JRJQBOUqFM","ciuWz14FLR","NOHsz0h1b1","FVMxo5nmWv","s4786vkCHH",
+"0MR5XRACuj","y94nwFVMxo","x3LDeFnPFB","GSQwj5drc6","ReKEWs7Mxk","S77LH0YAGH","HRxd8TCgPp","jzUqRCp3mZ","Cp3mZfFDrJ","StlDJt98iW",
+"EdBKcKASQ8","8U2nUuPX7G","7fKYUv2eC3","rKDLJK4GS8","4dEz6Dz1R3","xReecl83Ud","F6PT28FmFH","J2mQilj07Q","kB5nPReKEW","yluBxMm8si",
+"VBjhzJIqXi","7Ow5CcQOnv","bgJAzgf8rI","Mm8siVIlwP","0Kyfsdjsrv","B3qemFxX9q","v8yFNlkMUA","fqypyx3LDe","FnPFBFxX9q","hi5X7NOHsz",
+"5drc6oQ87r","KZamH5nmWv","JRJQBoVQp6","0PktI7Ow5C","SbRYyJKWYR","KASQ80YAGH","6q6L9RmDcr","ni2v15IhmG","7X3uyF6PT2","8TxD7EdBKc",
+"RBhp0uupzk","gf8rIcmXIX","48cHLh1zcH","JKWYRBpYhV","fcJOy8RCUA","Dz1R3KsjRK","dpe1v0MR5X","Kr8ysaL6AJ","HlUbFB3qem","5Mg9r7X3uy",
+"2ZHdkVerEA","t98iWGv3Fq","gIYvEfFDrJ","Uvlv4EdBKc","QnJ1SfaHir","SWfouxciqp","tAOsrbrhlQ","45cIHvLsmS","1v5hHWDVWJ","TCgPpGv3Fq",
+"IRh485ZaEz","DLhzM2ZHdk","Ta8f64dEz6","aFFssgf8rI","uN6r3uLtKs","64s8Nrz7Ut","5iGN5AgJHQ","UlU3Mulk41","uQIczQWxoT","FFDuimX2GE",
+"45cIHo8Uyd","TwanolkMUA","AIYUuxXTI4","v2eC3ZhwG1","hi5X78cVD3","tuDySzHF1q","3otm6FnPFB","lweGyWaim6","D6rByYw2oU","fmIK1yToGW",
+"No0Qbv1Hln","vLsmSPOUYS","5nmWvFwEJz","RzaZA9rlg9","Cp3mZ5iGN5","dQ58624ARF","MezSWZzJHW","Chuy3mz8gx","1j5L8azIWp","8RCUAlXFOB",
+"8cVD3gtCA5","hi5X7Q6Lix","FwEJz8cVD3","F6PT2aFFss","Vprf2ZJTXH","LewvM0Kyfs","B3qemy94nw","Ss0ZuTa8f6","MmKGJ9rlg9","zHF1q5VZjS",
+"EOE1ouZPqg","IKxdLs7Mxk","jfREu0YAGH","atef2TCgPp","BbwgAAXpwE","pmeCdEdBKc","ydG8UWMiS3","7hyVvsoy9t","ogLgcyEfy9","M3zXLpv0i7",
+"uoStwkB5nP","Vprf2LDk6f","t59lR9eoRc","ZzJHWI7p2a","YOfrYFxX9q","FnPFBStlDJ","MGlTFJKWYR","aez9ys7Mxk","X6Pin2ZHdk","D6rBy3weIF",
+"Cfgr3BpYhV","suY4xatef2","D6rByS77LH","ZUnqtSmGzv","nFqiktjQxs","qQxHPHfyNQ","Nxx9VhUTw7","WreyPCqqaD","sx5Gl0BmCy","4dEz6PYBf4",
+"TCgPpK4GS8","48cHLUmaEv","K4GS8Mm8si","RkQkeStlDJ","CxVEfNo0Qb","JkzUnQworu","RmDcr7lUXZ","Dz1R3qQxHP","55rfBReKEW","zz4ZUMGlTF",
+"s93MlXyPZN","55rfBuupzk","bgJAz7lUXZ","Yh1hFVerEA","RsQUqpvgjS","wDajXoGu6x","I7p2aQChxs","gIYvEBFkb8","5IhmGYh1hF","JkzUn0PktI",
+"CNHmvDLhzM","POUYSFLsph","5ZaEzFFDui","7lUXZW7cTs","5drc6tlILt","rhl0JMmsIo","RmDcr6AFT0","AIYUusuY4x","CxVEfvOqCE","ciuWzhe9IA",
+"JKWYRwDajX","taOXKtAOsr","tAOsrPb1pa","dQ586prNT6","IRh48FwEJz","LDk6faDGtS","8FmFHRxrsm","5nmWvOHaBz","tuDySRzaZA","FPfSEGv3Fq",
+"jzUqRjiVBP","uPX7G07n1c","aez9yiKqhr","OUqFMUlU3M","zFgtBxXTI4","FVMxobZLvS","AmdQdjzUqR","gIYvEfmIK1","No0QbhUTw7","J2mQiyofH3",
+"7lUXZDG4sT","tuDySDLhzM","8cVD3gf8rI","s47865Namm","QClRLAmdQd","blLA9MaJQs","lsQGoECMvU","uPX7GhE1Ql","MojnPQYxC0","7X3uyGSQwj",
+"jiVBPciuWz","oQ87rn8pJ9","pmeCdDG4sT","XflUquAWyp","xXTI4Uvlv4","KsjRKpWiOs","zmLYDEdBKc","piJSkFwEJz","ZUnqtfFDrJ","YOfrY6AFT0",
+"WMiS307n1c","i3pydlsQGo","brhlQuJScX","64s8N5nmWv","iB08l1LB1L","jtn0Xn8pJ9","W3VFH1v5hH","WPmlxhUTw7","07n1cGXdoH","AkKTk7hyVv",
+"o8UydUmaEv","qQxHPAOgEe","tjQxsuN6r3","29QAzrKDLJ","9eoRcZv7z0","TwanoCK5W7","0KyfsQnJ1S","s47861j5L8","IBe8k55rfB","AmdQdNOHsz",
+"Chuy3BCxeC","U3yw5aL6AJ","lkMUA2ZHdk","0YAGHb29RJ","5VZjSzFgtB","iB08lb29RJ","MaJQsdjsrv","SjskQulk41","ZhwG16q6L9","lViBvtl72W",
+"WmadAAOgEe","hSSvQFxX9q","AXpwEh1zcH","brhlQuAWyp","8FmFHFNYIM","zY1GYgtCA5","nnP8opiJSk","0ao3lSWfou","HlUbFjzUqR","aFFssfaHir",
+"zz4ZUNo0Qb","CxVEfZzJHW","xciqpEoToP","K20wKi3pyd","YjB9tZJTXH","uTacxS2Dfu","i3pyd2TRI7","lXFOBcQOnv","VIlwP1LB1L","pvgjSWaWsv",
+"0h1b1yToGW","fLNg8Qworu","yofH3MmsIo","fcwDaNhXdu","IjTwPogLgc","3weIFxciqp","NOHszZUnqt","WreyP3otm6","l83Udaez9y","4QMc9QWxoT",
+"14FLRjeskS","SbRYyECMvU","i7WMQaFFss","Yf2EcWmadA","Q6hMCa00b5","i3pydZJTXH","OHaBz7ku1p","FPfSEzQt6Q","uLtKsAOgEe","IjTwPyluBx",
+"P6bcgRBhp0","yvOMIXyPZN","RzaZAs4786","nFqikLDk6f","QWxoT0Wr5y","pAhR1zz4ZU","ThjNnx3LDe","VLTy62Yz7E","yEfy9aFFss","Ta8f6he9IA",
+"CIShGnlaBy","0BmCyrhl0J","n1pmOK4GS8","fcwDaMmsIo","fqypyAOgEe","VjCZqWMiS3","suY4xVLTy6","LbRTHqQxHP","l83Uddpe1v","F6PT2aL6AJ",
+"OUqFMWPmlx","hYBCKBFkb8","gIYvEBpYhV","jSjS3Qworu","Ta8f6hE1Ql","ix74rY1mC0","FNYIMNOHsz","DcpWBNcICA","vOqCEatef2","ZuDtDIRh48",
+"QChxsKZamH","s7MxkW7cTs","cmXIXuTacx","HfyNQJKWYR","n8pJ9Oz8yZ","Ul4a1FNYIM","oQ87rSbRYy","OHaBzfLNg8","pv0i7RsQUq","faHirzz4ZU",
+"VNCPdQWxoT","5ZaEz3weIF","Ul4a1zqH0W","HP433DQimp","AOgEe9XyT9","hSSvQRxrsm","gIYvEFcWrW","FhtglIn3NS","CdyBVGSQwj","0PktI580YD",
+"ThjNnFcWrW","uAWyplpF6W","618DiGXdoH","HRxd8jfREu","yluBxni2v1","hUTw7azIWp","2ZHdkYf2Ec","zz4ZUKZamH","5NammM6qcG","Oz8yZYOfrY",
+"WMiS3ZhwG1","I7p2aFcWrW","Fhtglrz7Ut","iqv4k9iGoT","qaofNReKEW","7fKYUCfgr3","LDk6fEdBKc","MezSWhUTw7","P6bcgpmeCd","7fKYUUl4a1",
+"Yw2oUatef2","0KyfsGSQwj","FxX9qgdQsS","JIqXinnP8o","iqv4kvLsmS","Mm8sitl72W","5VZjSpmeCd","hYBCKdpe1v","prNT6prNT6","IBe8kQssNC",
+"RACujiwzGk","4QMc9uupzk","OxWIHe6e4z","KZamHpiJSk","FxX9qb29RJ","mX2GEEdBKc","RBhp02TRI7","CIShGzmLYD","fmIK1gf8rI","MaJQsDz1R3",
+"kZANmi3pyd","dhSuHlweGy","QnJ1SPOUYS","SmGzvFhtgl","5VZjS48cHL","rKDLJEOE1o","yvOMIHP433","IKxdLVIlwP","CK5W7uN6r3","FNYIMtuDyS",
+"zQt6QFcWrW","9rlg9Chuy3","0Wr5yK4GS8","VNCPd0ao3l","VjCZq7fKYU","tlILtuN6r3","1v5hH8RCUA","QClRLgdQsS","lweGyrhl0J","HlUbFStlDJ",
+"LewvMOz8yZ","UlU3MtaOXK","JIqXirKDLJ","ydG8UlCMxy","ydG8U2ZHdk","i7WMQyofH3","O3iyQ5Drn0","IRh485iGN5","sqVrfUlU3M","GXdoHVBjhz",
+"WreyPKr8ys","vOqCE9y4lw","AgJHQ7fKYU","8TxD7Oz8yZ","5drc6AXpwE","2NslmYjB9t","Uvlv4a00b5","hYBCKkZANm","5drc6uvf7A","lj07QNxx9V",
+"ogLgcIjTwP","In3NS5Mg9r","yofH3ru4UG","SmGzvgdQsS","VBjhzK4GS8","yEfy9zmLYD","F6PT21LB1L","BCxeCpWiOs","MK07YDQimp","rz7UtUmaEv",
+"QYxC0SmGzv","iKqhrguMb8","FnPFBAIYUu","8RCUAcQOnv","KsjRKlCMxy","NOHszKsjRK","5VZjSU3yw5","JKWYRlXFOB","cQOnvcL0aE","ReKEW5Namm",
+"FVMxovLsmS","FnPFB8RCUA","KsjRKLbRTH","AmdQd7hyVv","HRxd89rlg9","aL6AJcShY2","QssNCUlU3M","EoToPiwzGk","4dEz6ZhwG1","wDajXFhtgl",
+"gdQsSK4GS8","gdQsSVjCZq","fLNg8v1Hln","nlaByPOUYS","DQimpksJby","UmaEvzqH0W","MezSWdhSuH","Vprf27X3uy","D6rBy5iGN5","48cHLBbwgA",
+"lXFOBMaJQs","atef2hi5X7","YOfrY7X3uy","GrDg79eoRc","lXFOBIn3NS","s4786ReKEW","lCMxy9XyT9","0h1b1fLNg8","4dEz6ReKEW","29QAzlXFOB",
+"2Yz7EIn3NS","14FLRuvf7A","FnPFBO3iyQ","JIqXiPOUYS","MaJQsLewvM","lViBvgf8rI","NAFuwXyPZN","zmLYDCIShG","kZANmLewvM","In3NSblLA9",
+"jSjS3e6e4z","YjB9tReKEW","C2Irc0BmCy","0PktIQChxs","QssNCQClRL","yToGWWaWsv","dpe1v16lHc","VNCPdMaJQs","GWqqXGSQwj","KZamHXflUq",
+"n8pJ9DG4sT","GrDg70PktI","sqVrfKsjRK","FxX9qMmKGJ","RsQUqCxVEf","AOgEeAgJHQ","iqv4kuoStw","Pb1paBFkb8","cL0aEMaJQs","sx5Gl618Di",
+"0h1b10PktI","No0QbB3qem","S77LHgf8rI","m4bxU48cHL","jS1ajtl72W","MK07YVNCPd","hUTw7m4bxU","iKqhrdmoS7","4W0Tl5ZaEz","7Ow5CgjUTu",
+"JIqXifLNg8","RACujv1Hln","HfyNQCfgr3","uLtKscShY2","AgJHQIBe8k","48cHL2ZHdk","VBjhzqaofN","lpF6WCIShG","prNT6jSjS3","IRh48ogLgc",
+"AgJHQZzJHW","Q6hMCdjsrv","n1pmOlH1kt","DcpWBFhtgl","b29RJazIWp","Cp3mZSjskQ","7X3uyCp3mZ","8hJdtoVQp6","lweGyQ6Lix","1v5hHe6e4z",
+"hYBCKNhXdu","sx5GlYf2Ec","K4GS8ogLgc","oVQp6v1Hln","zY1GYFVMxo","t59lRqQxHP","0MR5XpT8wu","AkKTkU3yw5","wiHrZpv0i7","dpe1vHfyNQ",
+"aL6AJfmIK1","M6qcGMezSW","wDajXO3iyQ","fcJOyLbRTH","TwanoSs0Zu","zHF1qiwzGk","iwzGk9GXkX","9eoRcv8yFN","v8yFNzFgtB","hE1QlzY1GY",
+"Q6LixCxVEf","2NslmZhwG1","GSQwj3otm6","BCxeCgdQsS","StlDJ580YD","cQOnvDG4sT","4W0TlD6rBy","0BmCy0Wr5y","jSjS3rKDLJ","Uvlv4wDajX",
+"Pb1paQssNC","KsjRKRBhp0","FVMxoPOUYS","U3yw5Chuy3","dpe1vW3VFH","s7MxkRpBQm","WDVWJDQimp","i3pydLDk6f","GWqqXvOqCE","6AFT0blLA9",
+"ulk4155rfB","5drc6ReKEW","hSSvQQ6hMC","6AFT0d85a9","EdBKc45cIH","iKqhr0Kyfs","cL0aEK20wK","Ul4a1Dz1R3","rz7UtzbIYY","P6bcgSWfou",
+"iB08lFFDui","K20wKGv3Fq","pv0i7Chuy3","OHaBzVjCZq","M3zXLqUJMd","2ZHdkCIShG","tjQxs2hEEU","hSSvQn1pmO","uZPqgix74r","Kr8ysQWxoT",
+"ciuWzjeskS","Q6hMCzQt6Q","ix74rgjUTu","wDajX0Kyfs","lm0pDAXpwE","HzZT87fsYM","MmsIoMGlTF","vkCHHRxrsm","dQ5865drc6","sx5GljiVBP",
+"F6PT2CK5W7","IKxdL9eoRc","hUTw7WreyP","o8UydpiJSk","fLNg8GWqqX","OUqFMprNT6","h1zcHgjUTu","RpBQmDz1R3","RkQkefqypy","POUYS0PktI",
+"ZJTXHlm0pD","SmGzvEoToP","2TRI7FjHXR","TwanoWMiS3","sqVrfyluBx","yToGWQYxC0","lkMUAmX2GE","xXTI4RpBQm","faHirAOgEe","MmsIoB3qem",
+"GXdoHOxWIH","ulk413otm6","618Dit59lR","XyPZNDQimp","Q6hMCyofH3","gIYvECxVEf","Waim6pAhR1","a00b5uoStw","zFgtBWDVWJ","IKxdL9GXkX",
+"wDajXoVQp6","i7WMQ8xEKz","29QAzYf2Ec","EdBKcOz8yZ","16lHckB5nP","9y4lwThjNn","JIqXiK20wK","HfyNQlH1kt","hSSvQ0YAGH","Qworud85a9",
+"9eoRcWmadA","9XyT9sx5Gl","oVQp6n8pJ9","aFFssuAWyp","5NammMezSW","0YAGHuJScX","IjTwPh1zcH","9iGoTzQt6Q","K4GS8hYBCK","QChxslCMxy",
+"aFFss5nmWv","pAhR1RkQke","GrDg7JXljW","ciuWzSWfou","tjQxssqVrf","KASQ8t59lR","F6PT2618Di","SmGzvfaHir","uJScXFhtgl","lpF6WvkCHH",
+"WMiS3aFFss","8xEKzAmdQd","gtCA5hE1Ql","uN6r3Yf2Ec","FVMxoy94nw","vLsmS9XyT9","qUJMd1j5L8","tvdkD0ao3l","QbxXcQYxC0","oQ87rxReec",
+"zz4ZUFhtgl","FxX9qRpBQm","No0Qb4W0Tl","GSQwj16lHc","suY4xiB08l","lj07QM6qcG","hUTw7D6rBy","aez9ynFqik","qUJMdHfyNQ","lXFOBCfgr3",
+"LbRTHuQIcz","Uvlv4rKDLJ","4QMc9brhlQ","iKqhra00b5","iwzGknFqik","ZhwG1jeskS","1LB1Lx3LDe","nFqikQYxC0","HfyNQHP433","uAWypZUnqt",
+"uJScXlj07Q","RACujS77LH","2NslmlweGy","xciqplkMUA","oVQp61LB1L","0YAGHiqv4k","aL6AJ4W0Tl","2NslmlpF6W","8FmFHTXQ0Z","zY1GYzY1GY",
+"CIShGlH1kt","QChxszHF1q","aFFss0Kyfs","BpYhV4dEz6","uPX7Ggf8rI","pAhR1RsQUq","pT8wuy94nw","ThjNnyvOMI","tAOsr8xEKz","Y1mC0K20wK",
+"FnPFBCIShG","7X3uyPb1pa","8FmFHStlDJ","9iGoTRACuj","1v5hHiqv4k","JkzUnFwEJz","O3iyQKASQ8","piJSkBbwgA","uTacxOUYuF","SjskQuZPqg",
+"DLhzMPOUYS","uupzk64s8N","Ss0ZuWaim6","07n1cVLTy6","Q6hMCwiHrZ","uoStwaFFss","55rfBQChxs","zbIYYW7cTs","jeskS7lUXZ","RsQUqCqqaD",
+"48cHLYh1hF","gdQsSuoStw","No0QbpmeCd","Gv3FqW7cTs","0PktIFFDui","8hJdtfmIK1","2TRI7FxX9q","yluBxJIqXi","vLsmStAOsr","brhlQt98iW",
+"VIlwPzHF1q","rKDLJnFqik","yEfy9dpe1v","O3iyQ0MR5X","zbIYYS77LH","iwzGkY1mC0","Cfgr3VerEA","8RCUAWaWsv","CNHmvChuy3","QworuQbxXc",
+"OHaBz9iGoT","lm0pDAkKTk","yEfy97lUXZ","W3VFHRpBQm","8xEKzUvlv4","euZA5Rxrsm","MezSWM3zXL","1v5hHIn3NS","tjQxsnFqik","zY1GYNhXdu",
+"ZuDtDt98iW","pT8wuOUYuF","uTacxoVQp6","AIYUud85a9","RBhp0QYxC0","Chuy3FjHXR","GrDg7yofH3","aFFss5drc6","lH1ktfaHir","WPmlxYOfrY",
+"CqqaDZuDtD","fcJOyjzUqR","8TxD7nnP8o","S2DfuIn3NS","d7vjMX6Pin","prNT6piJSk","guMb8POUYS","mX2GEJ2mQi","wiHrZ14FLR","07n1ckB5nP",
+"JJs5mx3LDe","lweGyjtn0X","IBe8kGrDg7","0KyfsjfREu","ru4UGnlaBy","KASQ8StlDJ","uZPqglH1kt","WMiS348cHL","XflUqJJs5m","uAWypQbxXc",
+"29QAzFFDui","pmeCdCp3mZ","HlUbFY1mC0","9XyT9n8pJ9","he9IAd7vjM","0Wr5yJ2mQi","Mkgy8I7p2a","soy9tciuWz","MaJQsVprf2","Yw2oUd7vjM",
+"QnJ1SRxrsm","0KyfskB5nP","i3pydFxX9q","tvdkDSs0Zu","LewvM14FLR","RBhp0FFDui","WaWsv8TxD7","AXpwE7lUXZ","d7vjMFjHXR","8cVD3Vprf2",
+"CK5W7ogLgc","0BmCyiqv4k","uupzkVNCPd","Dz1R3GrDg7","1j5L8MmsIo","m4bxUHzZT8","CK5W7CIShG","hE1QlQworu","rz7UtbgJAz","nlaBy0h1b1",
+"WDVWJ5Drn0","ReKEWi7WMQ","BGaQYdQ586","pvgjSGXdoH","DcpWBuQIcz","G1RhSZ4I1v","FhtglKr8ys","OUYuFv1Hln","kB5nPChuy3","s7MxkTCgPp",
+"MojnPZzJHW","FLsphoVQp6","7lUXZokgRi","kZANmD6rBy","WreyPpiJSk","JIqXiWreyP","MezSWcShY2","xciqp2Nslm","JKWYRwiHrZ","xXTI455rfB",
+"TXQ0ZS77LH","b29RJciuWz","WMiS3euZA5","S2Dfu0ao3l","uQIczTa8f6","2TRI7S77LH","Y1mC0Nxx9V","7hyVvM6qcG","oGu6xZhwG1","MezSWSmGzv",
+"sqVrfEoToP","LbRTHbZLvS","NhXduCxVEf","L7cGcyEfy9","LewvM2Yz7E","8FmFHcL0aE","t59lRzz4ZU","BpYhV6q6L9","jeskS7ku1p","nlaBy9XyT9",
+"MGlTFQbxXc","blLA9EOE1o","JIqXitlILt","L7cGculk41","FVMxoWDVWJ","vOqCEM6qcG","NAFuwAOgEe","dmoS7SjskQ","HfyNQfcJOy","jfREu55rfB",
+"2DREs0YAGH","EdBKc64s8N","IRh48IKxdL","1LB1LOHaBz","fmIK1FxX9q","v2eC3zY1GY","qQxHP9GXkX","7lUXZlm0pD","pvgjSVjCZq","v1HlnTCgPp",
+"lweGyPOUYS","K20wKRmDcr","bgJAzpiJSk","Oz8yZMmKGJ","uQIczrKDLJ","aez9yW3VFH","CK5W7QChxs","6q6L9MojnP","F6PT2ydG8U","WPmlxlkMUA",
+"29QAzlsQGo","WaWsvDQimp","Cp3mZyEfy9","2DREs5VZjS","NAFuwFjHXR","D6rBy7lUXZ","16lHcjSjS3","7Ow5C64s8N","BbwgA5drc6","Kr8ysCK5W7",
+"fcwDadpe1v","nlaBykZANm","0h1b1L7cGc","iKqhrk85Ae","uAWyp0YAGH","NOHszRmDcr","kZANmuvf7A","yToGWuAWyp","64s8NYjB9t","F6PT2sqVrf",
+"xReec5iGN5","Yh1hFydG8U","tjQxsDLhzM","o8UydzbIYY","M6qcGWmadA","uZPqg8cVD3","7ku1pm4bxU","bgJAz9eoRc","uAWypL7cGc","KZamHAOgEe",
+"MojnPnnP8o","0BmCy55rfB","VerEAUlU3M","7fsYMLDk6f","a00b5MmKGJ","1LB1LSjskQ","IKxdLUlU3M","ydG8Uh1zcH","5Drn0uJScX","4dEz6uJScX",
+"v1HlnyEfy9","rz7Ut14FLR","AOgEe4W0Tl","2Nslmmz8gx","tlILtm4bxU","K4GS8G1RhS","jzUqRru4UG","gIYvE9eoRc","9XyT9uN6r3","zFgtBChuy3",
+"wiHrZ0Kyfs","2ZHdkaFFss","9iGoTjS1aj","CdyBVo8Uyd","NAFuw0ao3l","pv0i7S2Dfu","Waim6mX2GE","QbxXcCqqaD","OUqFMU3yw5","WPmlxWMiS3",
+"tlILtJIqXi","he9IA0h1b1","JRJQBQChxs","QClRLtvdkD","tvdkDQworu","atef2fmIK1","jiVBPHRxd8","rhl0JFjHXR","WMiS3dmoS7","Q6hMCLewvM",
+"VIlwP5Drn0","OxWIHqaofN","VerEAix74r","BCxeCuoStw","Fhtgla00b5","s7Mxks4786","55rfB2Yz7E","tl72WHP433","Ul4a1okgRi","sqVrfPb1pa",
+"FPfSEZJTXH","FLsphMaJQs","nFqikD6rBy","wDajXNAFuw","lpF6WfcwDa","pv0i77lUXZ","0ao3lK4GS8","faHirDLhzM","yluBxZv7z0","2Nslmn8pJ9",
+"WPmlxuLtKs","xciqpuAWyp","pAhR1WmadA","MojnPYf2Ec","piJSkThjNn","0PktIFwEJz","5VZjSuAWyp","J2mQi7ku1p","YOfrYCK5W7","pv0i7zY1GY",
+"In3NSM3zXL","GrDg7Vprf2","8TxD7Q6Lix","IKxdL14FLR","NcICA7hyVv","JRJQBlm0pD","vOqCERACuj","VLTy6VLTy6","NAFuwSbRYy","uoStwmX2GE",
+"5ZaEz2DREs","iKqhr07n1c","kZANmYh1hF","B3qemqQxHP","lCMxyDLhzM","d7vjMbrhlQ","gdQsSqUJMd","d7vjMqQxHP","OxWIHjtn0X","K20wKF6PT2",
+"EOE1ogf8rI","7ku1pCdyBV","yToGW7X3uy","zbIYYni2v1","FGzgp2ZHdk","MmKGJlpF6W","bgJAzB3qem","9y4lw9iGoT","LbRTHGv3Fq","brhlQMmKGJ",
+"5VZjStjQxs","lsQGoLDk6f","uQIczrhl0J","zQt6QoVQp6","lm0pDcShY2","0Kyfs0BmCy","AIYUuyluBx","FwEJzOUqFM","M6qcG7X3uy","xciqpVLTy6",
+"fcwDaDLhzM","dhSuHsuY4x","7X3uyyEfy9","DcpWBaL6AJ","oVQp6SWfou","uN6r3WaWsv","QYxC0FPfSE","48cHLpAhR1","lpF6WzFgtB","AmdQdpAhR1",
+"nnP8oC2Irc","7Ow5C7ku1p","D6rByTa8f6","pT8wu0ao3l","faHir1j5L8","0Wr5ygdQsS","RBhp0Z4I1v","Z4I1vVerEA","HzZT8580YD","n8pJ9GXdoH",
+"lH1ktuPX7G","ix74rzQt6Q","pmeCdNOHsz","GSQwjFxX9q","2ZHdk7fsYM","GSQwjEoToP","2hEEUYjB9t","HRxd8DcpWB","prNT6618Di","t98iWNOHsz",
+"ECMvUzY1GY","FFDuiReKEW","GXdoHThjNn","QbxXc7fsYM","MojnPhYBCK","cL0aEuvf7A","yToGWd85a9","ix74rJkzUn","VNCPdhSSvQ","AgJHQRxrsm",
+"RzaZAuoStw","JJs5mFPfSE","LewvMCK5W7","qUJMdwDajX","zHF1qYh1hF","s4786WMiS3","jtn0X2Nslm","WmadAX6Pin","ZzJHWru4UG","dmoS7tuDyS",
+"soy9tUmaEv","1v5hHfmIK1","kZANmv1Hln","suY4xsoy9t","lweGy7Ow5C","vkCHH2ZHdk","Vprf2BGaQY","pFrrluTacx","Zv7z0tuDyS","SjskQcQOnv",
+"kB5nPU3yw5","tlILtrKDLJ","tl72WqUJMd","mX2GEVBjhz","PYBf4Kr8ys","ru4UGW3VFH","BpYhVIjTwP","b29RJulk41","VerEAVIlwP","8TxD7jzUqR",
+"7X3uyQYxC0","14FLRYOfrY","gIYvETCgPp","RkQkegtCA5","5ZaEzlCMxy","PYBf4lCMxy","h1zcHTwano","FNYIMYw2oU","IRh4829QAz","G1RhSzFgtB",
+"RACujFNYIM","Ss0Zu2DREs","14FLR7fsYM","ZzJHWYw2oU","4QMc9hSSvQ","FxX9qYjB9t","O3iyQn1pmO","qQxHPuN6r3","D6rByv2eC3","8cVD3MGlTF",
+"G1RhScmXIX","jzUqR4W0Tl","W7cTs7hyVv","MmsIoiqv4k","pWiOsfmIK1","ydG8U29QAz","FPfSEJIqXi","RBhp0tl72W","DLhzMvLsmS","MaJQsX6Pin",
+"BbwgAVBjhz","guMb8mX2GE","7fKYUzQt6Q","ogLgc8FmFH","uAWyptaOXK","t59lRmX2GE","s4786vLsmS","CqqaDhUTw7","Uvlv4GSQwj","iqv4kyofH3",
+"GrDg7jzUqR","PYBf4AmdQd","zqH0W45cIH","14FLR2TRI7","DcpWBqQxHP","s47867lUXZ","pWiOsbZLvS","uQIczQChxs","QssNC45cIH","lH1kt0ao3l",
+"ru4UGMm8si","i7WMQPb1pa","lH1ktFLsph","AgJHQ5nmWv","ZzJHWaDGtS","2TRI7PYBf4","fcwDafaHir","pv0i745cIH","MezSW29QAz","HP433B3qem",
+"uTacxYf2Ec","BCxeCoGu6x","gf8rIIRh48","NhXduvLsmS","RBhp0RACuj","Yh1hFQnJ1S","pAhR1gjUTu","JXljWVBjhz","uoStwFGzgp","FNYIMIn3NS",
+"vOqCEiwzGk","AIYUuKsjRK","P6bcgRxrsm","yEfy9ReKEW","AIYUuYOfrY","gjUTutAOsr","s4786Zv7z0","MK07Y9y4lw","AmdQdNxx9V","X6PinoVQp6",
+"aFFss3otm6","uAWypRBhp0","IBe8k0h1b1","suY4xuPX7G","lj07QlsQGo","FGzgpMK07Y","5drc6Uvlv4","ulk41tuDyS","Mkgy8Waim6","CK5W7lweGy",
+"RsQUqhe9IA","jzUqRaL6AJ","lweGyCxVEf","8xEKzpvgjS","kZANml83Ud","VIlwPCp3mZ","0Wr5yJkzUn","LDk6fZuDtD","JKWYRaDGtS","SjskQFjHXR",
+"ZUnqtoQ87r","i3pydfqypy","AgJHQ55rfB","6q6L96AFT0","ogLgclm0pD","Yw2oUcL0aE","VerEAjS1aj","d7vjM0PktI","wiHrZ48cHL","okgRicmXIX",
+"JXljWVIlwP","FVMxoMezSW","No0QbKZamH","Ta8f6OHaBz","Vprf2fmIK1","2hEEUoQ87r","zbIYY3weIF","IjTwP7ku1p","yofH3s7Mxk","YOfrYRpBQm",
+"0YAGHvOqCE","uvf7AtAOsr","AIYUuaez9y","W7cTsXflUq","gf8rI29QAz","o8UydogLgc","lweGyd85a9","WDVWJOUYuF","GSQwj55rfB","aez9yFPfSE",
+"Yf2EcMmsIo","VIlwP14FLR","gf8rIa00b5","tvdkDksJby","Waim6qQxHP","JkzUnni2v1","vkCHH2TRI7","OUqFMBpYhV","prNT6dpe1v","MojnPiKqhr",
+"64s8Nl83Ud","RkQkeogLgc","fFDrJoGu6x","KASQ8ciuWz","DG4sTni2v1","gdQsS7ku1p","Q6LixKr8ys","yToGWzQt6Q","ulk41jfREu","i3pydv2eC3",
+"WaWsvDz1R3","yvOMIP6bcg","No0QbguMb8","fmIK1xReec","dhSuHMmKGJ","CdyBVSbRYy","sx5GlIRh48","tlILtOUYuF","atef2FLsph","CxVEfCIShG",
+"oQ87r7fsYM","VNCPdiwzGk","Oz8yZ7fsYM","9eoRcdjsrv","2DREsJIqXi","CNHmv5ZaEz","8hJdtgdQsS","Mkgy88TxD7","DQimplweGy","7Ow5C45cIH",
+"2NslmciuWz","yToGWPYBf4","aez9y8U2nU","TwanolViBv","KZamHsx5Gl","Q6hMCYf2Ec","0Kyfs45cIH","CxVEfn8pJ9","1LB1Luvf7A","45cIHuAWyp",
+"0KyfsOUYuF","TXQ0ZVBjhz","HzZT8RACuj","Gv3FqOUqFM","QnJ1SX6Pin","DcpWBUvlv4","Dz1R3v2eC3","CNHmveuZA5","ru4UGO3iyQ","Yw2oUa00b5",
+"Nxx9VyToGW","07n1cjiVBP","CIShGuTacx","jzUqRo8Uyd","MojnPRkQke","okgRiguMb8","JRJQBgtCA5","48cHL8TxD7","iwzGkhYBCK","RsQUqtaOXK",
+"gIYvEL7cGc","euZA52DREs","d7vjMmz8gx","vOqCEMK07Y","Oz8yZ9rlg9","vOqCEVBjhz","yvOMISmGzv","hYBCKW3VFH","AgJHQFjHXR","BFkb8AIYUu",
+"FGzgp0PktI","W3VFHhYBCK","0YAGHlpF6W","U3yw5SjskQ","v2eC3MK07Y","pFrrlo8Uyd","B3qem0MR5X","LDk6fFGzgp","U3yw5WmadA","5Mg9rlpF6W",
+"TCgPpeuZA5","BCxeCzHF1q","ZUnqt3otm6","64s8NLbRTH","3weIFYjB9t","0h1b1pmeCd","X6PindhSuH","zmLYD8hJdt","ni2v1sx5Gl","dpe1vdpe1v",
+"5drc6t98iW","ni2v1U3yw5","RsQUqfmIK1","C2IrctvdkD","Oz8yZm4bxU","uQIczJRJQB","DcpWB2hEEU","o8UydSjskQ","Zv7z0gIYvE","HRxd8euZA5",
+"HlUbFpT8wu","cShY2WreyP","7hyVvoQ87r","yEfy94dEz6","9XyT9kB5nP","uZPqgB3qem","BpYhVSWfou","qUJMdqaofN","CNHmvyluBx","yvOMIyEfy9",
+"QbxXc9XyT9","iB08lCK5W7","C2IrclXFOB","tl72WP6bcg","CIShGgtCA5","e6e4z55rfB","FGzgpMojnP","Yf2Ec64s8N","FnPFBTXQ0Z","CxVEfPYBf4",
+"blLA9bgJAz","580YD5IhmG","9GXkXIRh48","zbIYYKZamH","ThjNnaFFss","5NammGrDg7","uQIczKZamH","B3qem0YAGH","M6qcGFNYIM","BGaQYzFgtB",
+"WDVWJECMvU","07n1cJXljW","CqqaDRACuj","FFDuitl72W","cmXIX0YAGH","7X3uydpe1v","8cVD3lj07Q","ulk41UmaEv","MGlTFChuy3","rKDLJJkzUn",
+"0YAGHyEfy9","v1HlnKsjRK","gdQsSVLTy6","ciuWzzHF1q","azIWp2TRI7","24ARFVBjhz","7lUXZMm8si","FcWrWprNT6","zqH0WLDk6f","580YDX6Pin",
+"fFDrJjS1aj","29QAztjQxs","i3pyd45cIH","kZANmcShY2","9iGoTFFDui","x3LDeMezSW","hUTw70PktI","iwzGkkB5nP","hYBCKIjTwP","he9IAuupzk",
+"9y4lwJIqXi","5NammRBhp0","lkMUAQnJ1S","nnP8oHRxd8","sqVrfFcWrW","7fKYUbZLvS","0h1b1NAFuw","uQIcz7ku1p","fqypyjtn0X","RkQkeCIShG",
+"ZhwG1v2eC3","fLNg8brhlQ","y94nwdmoS7","guMb8Qworu","RBhp0AgJHQ","ZuDtD9rlg9","ZUnqtFhtgl","RmDcrpvgjS","0PktIUmaEv","DG4sTzbIYY",
+"FLsph4QMc9","ksJbyBGaQY","dmoS7Ss0Zu","ReKEWAIYUu","sqVrftjQxs","S2DfuyvOMI","NcICAb29RJ","WmadAC2Irc","h1zcHn8pJ9","QbxXcpvgjS",
+"gdQsS2ZHdk","2ZHdk3otm6","MK07Ym4bxU","Nxx9V5VZjS","FcWrWCfgr3","JRJQByofH3","6q6L92Nslm","dpe1vZhwG1","dmoS7Yw2oU","RmDcryEfy9",
+"JRJQBNxx9V","sx5GlazIWp","UmaEvfqypy","i3pydNOHsz","vOqCE55rfB","ksJbyOxWIH","8FmFH4W0Tl","M3zXLQWxoT","k85AeNOHsz","OUYuFv8yFN",
+"uQIczjS1aj","vkCHHd7vjM","Oz8yZjzUqR","iKqhrprNT6","iKqhrzbIYY","DcpWBFFDui","v1Hln7Ow5C","v2eC3Rxrsm","o8UydYf2Ec","RzaZAmX2GE",
+"fLNg8YOfrY","jtn0XciuWz","OHaBzQbxXc","7hyVvFcWrW","HzZT87lUXZ","B3qemLewvM","AgJHQ8RCUA","GXdoHazIWp","HlUbFksJby","8cVD3ZzJHW",
+"oGu6xM6qcG","QChxsIjTwP","gIYvEpWiOs","ydG8UyluBx","BpYhVsqVrf","uLtKsOxWIH","5Drn0ZuDtD","yvOMIx3LDe","M6qcGJ2mQi","7fKYUMojnP",
+"ZzJHWpvgjS","d85a9OUqFM","DQimpStlDJ","FnPFBogLgc","CxVEfReKEW","lm0pD0Kyfs","ECMvUJ2mQi","ydG8UsuY4x","yvOMIv8yFN","QClRLNo0Qb",
+"zmLYD5Namm","Q6hMCYOfrY","RzaZA8RCUA","uLtKsMmKGJ","BFkb8i7WMQ","JkzUnfmIK1","iwzGkkZANm","B3qem7ku1p","lweGyVjCZq","n1pmObrhlQ",
+"ogLgc7ku1p","45cIHpT8wu","n8pJ9kB5nP","RmDcrFnPFB","7X3uyMojnP","gf8rIxciqp","he9IA9rlg9","d7vjMJRJQB","zFgtB4dEz6","lweGyHlUbF",
+"JRJQByToGW","lweGyhSSvQ","djsrvTXQ0Z","hUTw78FmFH","SWfounFqik","sx5Gl8U2nU","FPfSENcICA","0ao3l5iGN5","618DiB3qem","ni2v1cmXIX",
+"cShY2SbRYy","GWqqXNAFuw","Kr8ysyEfy9","NhXdupWiOs","AkKTkuAWyp","blLA90Kyfs","CK5W7QWxoT","WreyPQbxXc","uZPqgMojnP","M3zXLhE1Ql",
+"CK5W7O3iyQ","k85AeIRh48","uTacxpmeCd","he9IAAOgEe","yToGWpAhR1","Yw2oUFPfSE","uZPqgThjNn","hE1QlKsjRK","ZJTXHvkCHH","tlILtdmoS7",
+"dQ586zmLYD","AmdQdMaJQs","xReecuTacx","EOE1o1v5hH","dQ586faHir","JJs5mPYBf4","ciuWzBCxeC","BGaQYMmKGJ","IjTwP1LB1L","P6bcgDQimp",
+"ZhwG15iGN5","NAFuw5VZjS","J2mQi2Nslm","s93MloQ87r","RsQUqS2Dfu","wDajX580YD","a00b5fFDrJ","uvf7AVBjhz","JkzUnuPX7G","BpYhVYOfrY",
+"PYBf407n1c","HlUbFGXdoH","lViBvBGaQY","FFDuiulk41","HzZT88RCUA","CK5W7vkCHH","uvf7AS77LH","zbIYYtuDyS","n1pmOoVQp6","aFFssGrDg7",
+"ulk410BmCy","JXljWa00b5","BbwgABFkb8","fqypymX2GE","24ARFFwEJz","t98iWzY1GY","55rfBGSQwj","x3LDewDajX","y94nwX6Pin","Yh1hFWPmlx",
+"8RCUAPOUYS","UmaEv7Ow5C","KsjRK2TRI7","2TRI7tAOsr","taOXKaL6AJ","ix74rzqH0W","tvdkDDQimp","ECMvUjSjS3","uoStwrz7Ut","2Yz7EzmLYD",
+"No0QbjiVBP","FhtglCNHmv","pAhR1cmXIX","pAhR1WMiS3","6AFT0Yw2oU","h1zcHjS1aj","uPX7GS77LH","EdBKcLbRTH","QnJ1SOUYuF","b29RJPb1pa",
+"rhl0Jn8pJ9","07n1c7fKYU","cQOnvuJScX","pT8wuokgRi","FFDuiQYxC0","suY4xi3pyd","NOHszMmKGJ","0YAGHDLhzM","gIYvEulk41","1v5hHB3qem",
+"pmeCdSmGzv","ZuDtDsuY4x","JKWYR6AFT0","tlILtGrDg7","7ku1p5drc6","lXFOBlsQGo","Ss0Zuulk41","AIYUuuLtKs","F6PT2Zv7z0","14FLRoVQp6",
+"MK07YvkCHH","he9IAY1mC0","Ul4a1WMiS3","2Yz7Es7Mxk","ZUnqtzFgtB","FNYIMKr8ys","FcWrWXflUq","Z4I1vJRJQB","Yf2EcQssNC","0BmCyd7vjM",
+"s93Ml6AFT0","yofH3K20wK","iwzGkIn3NS","RACujM6qcG","CIShGzz4ZU","brhlQ6AFT0","cL0aE8TxD7","XyPZNRpBQm","BCxeClj07Q","JkzUn16lHc",
+"W7cTsNcICA","pAhR1uAWyp","vkCHHQChxs","xReeccQOnv","kB5nPokgRi","5drc6QssNC","CqqaD618Di","oVQp6bZLvS","piJSkMmKGJ","XflUqe6e4z",
+"atef2s93Ml","sx5GlprNT6","7fsYMjeskS","8RCUApv0i7","S2Dfu9y4lw","wiHrZX6Pin","uN6r3kB5nP","okgRi8cVD3","Mkgy84dEz6","1LB1LHRxd8",
+"pv0i7pvgjS","OUYuFStlDJ","FxX9qPb1pa","nlaByulk41","EdBKc8hJdt","HP433v8yFN","zHF1qtl72W","RxrsmXyPZN","QWxoTd7vjM","tl72W0YAGH",
+"FFDuihi5X7","CK5W7bZLvS","jeskSt98iW","1v5hHh1zcH","euZA54QMc9","1v5hHHP433","LDk6fFxX9q","atef25Drn0","OUqFMLbRTH","FFDuiTa8f6",
+"zz4ZUulk41","GrDg7WaWsv","ciuWzDQimp","1j5L8pAhR1","iwzGkG1RhS","M6qcGgf8rI","WPmlxTXQ0Z","HP433pWiOs","5Drn0SmGzv","W7cTs1v5hH",
+"v8yFN0Wr5y","Chuy3atef2","HzZT8POUYS","POUYSZhwG1","guMb8PYBf4","y94nwxXTI4","zQt6QDQimp","gIYvEC2Irc","n1pmO24ARF","CK5W7JkzUn",
+"he9IADz1R3","xXTI4Q6hMC","fLNg8Z4I1v","rhl0JCp3mZ","e6e4zHzZT8","QClRLAIYUu","8RCUAHRxd8","kB5nPnlaBy","n8pJ9blLA9","Yf2EcXflUq",
+"24ARF29QAz","Q6Lixlj07Q","cShY2aFFss","SWfouBpYhV","JIqXifqypy","sx5GlXyPZN","aDGtSuupzk","dmoS7y94nw","fmIK1wiHrZ","7fKYU1j5L8",
+"WreyPNAFuw","lj07QDQimp","RpBQmni2v1","4dEz6zbIYY","uLtKsZuDtD","oVQp6ciuWz","v2eC3QssNC","F6PT2FFDui","RACujtlILt","pAhR1AOgEe",
+"yvOMIRBhp0","iqv4kzY1GY","nlaByyEfy9","jiVBPMkgy8","TwanoMGlTF","L7cGcL7cGc","d7vjMuAWyp","Mkgy8RACuj","P6bcgCdyBV","NOHszlViBv",
+"EOE1osqVrf","CqqaD55rfB","QssNCFFDui","cQOnvpAhR1","Dz1R3pvgjS","cmXIXHlUbF","lkMUACp3mZ","vkCHHpv0i7","9GXkXJKWYR","BFkb8EdBKc",
+"CK5W7KASQ8","t98iWL7cGc","16lHcOxWIH","0ao3lZv7z0","QbxXc4dEz6","suY4xhe9IA","Ta8f65IhmG","I7p2a3otm6","rz7UtlH1kt","faHircmXIX",
+"EoToP1j5L8","s93Mllm0pD","No0QbgtCA5","IRh48lpF6W","2Yz7EMezSW","JXljWQbxXc","FjHXRIRh48","lkMUAlj07Q","3otm6atef2","7lUXZFjHXR",
+"ru4UG7fKYU","x3LDesqVrf","s4786Y1mC0","FVMxozqH0W","Zv7z0okgRi","lweGyblLA9","3otm6jzUqR","e6e4zHP433","DG4sTK20wK","mX2GEYf2Ec",
+"k85AeoGu6x","iwzGk14FLR","pT8wuKsjRK","RsQUqv1Hln","dmoS7KsjRK","GSQwjaez9y","NcICAD6rBy","Ta8f6n1pmO","BFkb8Gv3Fq","ksJbyk85Ae",
+"bgJAz16lHc","Z4I1viKqhr","NAFuwXflUq","IjTwP8U2nU","WaWsvzHF1q","SWfoupFrrl","PYBf4brhlQ","AmdQdDQimp","IBe8k1LB1L","ciuWzNhXdu",
+"AkKTkyToGW","zFgtBtuDyS","S77LH14FLR","OHaBznnP8o","RzaZA5iGN5","EdBKcFLsph","Mm8siAgJHQ","sx5GlQClRL","mX2GEK4GS8","FcWrWNxx9V",
+"lH1ktOz8yZ","AgJHQpv0i7","prNT6RzaZA","b29RJblLA9","rKDLJQChxs","iqv4kd7vjM","Oz8yZZ4I1v","6q6L9bgJAz","WMiS3uAWyp","M6qcGjtn0X",
+"LewvMZ4I1v","taOXKIn3NS","9iGoT4W0Tl","uPX7Gulk41","MK07YZv7z0","piJSkU3yw5","LewvMuoStw","9rlg9FNYIM","580YDWaWsv","ydG8UDG4sT",
+"ZuDtDuQIcz","lkMUAFNYIM","kZANmSs0Zu","X6Pini3pyd","0BmCy45cIH","brhlQRmDcr","In3NS2Yz7E","s7MxkIjTwP","ECMvUlsQGo","48cHL7fsYM",
+"yluBxzHF1q","Waim6zFgtB","cShY2wiHrZ","mz8gxt98iW","K20wKO3iyQ","YOfrY1LB1L","RsQUq9eoRc","24ARF1LB1L","WaWsvtlILt","yluBxciuWz",
+"5ZaEzQYxC0","uQIczuLtKs","8cVD30PktI","M3zXLjzUqR","iqv4ktvdkD","8hJdtkZANm","2TRI7ThjNn","dhSuHfFDrJ","fLNg8LDk6f","5iGN5vOqCE",
+"k85AeOHaBz","6AFT0FnPFB","0YAGHtuDyS","VBjhzuTacx","LDk6fRzaZA","QChxsHP433","he9IA0MR5X","zQt6Q0PktI","hi5X7uPX7G","P6bcg4W0Tl",
+"Q6hMCK4GS8","Pb1paDG4sT","0MR5X2DREs","tvdkDL7cGc","M3zXLmz8gx","uLtKsrz7Ut","JKWYRRACuj","oGu6xzHF1q","Waim63weIF","HP433XyPZN",
+"HfyNQzY1GY","0BmCys93Ml","tjQxsIBe8k","LewvMlweGy","dpe1vJ2mQi","tl72WzmLYD","GrDg7y94nw","uTacx0ao3l","QbxXce6e4z","zY1GYCp3mZ",
+"atef2O3iyQ","CdyBVTa8f6","U3yw5sqVrf","GXdoHOUYuF","prNT6KASQ8","NOHszF6PT2","xXTI4VLTy6","s7MxknFqik","NhXduEOE1o","8cVD3rz7Ut",
+"In3NS0Wr5y","Ta8f6pT8wu","8xEKzKsjRK","uTacxRkQke","e6e4ze6e4z","m4bxUwiHrZ","Gv3Fq2DREs","EOE1oe6e4z","prNT6Vprf2","2Yz7E5Namm",
+"gjUTuJRJQB","8U2nUuN6r3","VLTy6UmaEv","yToGWzY1GY","euZA5ciuWz","AOgEee6e4z","zqH0W4dEz6","LbRTH7lUXZ","soy9tEoToP","BpYhVvOqCE",
+"S77LHMezSW","ZzJHWfLNg8","2NslmHzZT8","MojnPMaJQs","yofH3kB5nP","7Ow5CYh1hF","EoToPiqv4k","4dEz6zHF1q","HRxd8GWqqX","Q6LixnnP8o",
+"dmoS75Mg9r","PYBf4i3pyd","4W0Tl9eoRc","fcJOyuPX7G","FjHXR5IhmG","AIYUuQWxoT","9iGoTfFDrJ","lweGyAkKTk","9GXkXW7cTs","1j5L8Gv3Fq",
+"uvf7ADLhzM","AOgEe7hyVv","FjHXRyofH3","Q6hMCOUqFM","WmadAS2Dfu","HfyNQkB5nP","9eoRcUmaEv","t59lRUl4a1","Vprf2rz7Ut","ulk41mX2GE",
+"QClRLprNT6","0BmCyS2Dfu","lH1ktpvgjS","2Yz7EZ4I1v","ydG8UiB08l","iqv4kCK5W7","7X3uybrhlQ","K20wKfcJOy","aDGtSChuy3","ni2v1RzaZA",
+"MaJQs0ao3l","IBe8kJKWYR","QworuBCxeC","IKxdLy94nw","s93MlP6bcg","MK07YjeskS","S77LHgdQsS","EoToPQWxoT","ReKEWiwzGk","SjskQbZLvS",
+"jSjS324ARF","lpF6WoVQp6","8hJdtkB5nP","U3yw5JIqXi","i7WMQStlDJ","MaJQsDG4sT","O3iyQzz4ZU","1j5L8BGaQY","No0QbMmsIo","HfyNQHRxd8",
+"SmGzv7fKYU","Y1mC0IjTwP","WDVWJiKqhr","bgJAzvLsmS","HfyNQuLtKs","WDVWJzHF1q","guMb8ogLgc","ECMvUOxWIH","v2eC3VBjhz","WMiS3pT8wu",
+"07n1ccQOnv","pmeCdazIWp","yvOMIlkMUA","BbwgAGrDg7","uPX7GBGaQY","580YDuZPqg","yofH3YOfrY","GWqqXgdQsS","45cIHe6e4z","5drc6O3iyQ",
+"qQxHPW7cTs","OUqFMBbwgA","hYBCKrz7Ut","Q6hMCQworu","PYBf4WreyP","QClRLLbRTH","0MR5Xsoy9t","UmaEvBpYhV","zz4ZUiqv4k","VNCPdzQt6Q",
+"s93MliB08l","uN6r3he9IA","TwanoAmdQd","YOfrYCIShG","GXdoHZJTXH","DLhzMtvdkD","nFqiknlaBy","wiHrZwiHrZ","Kr8ysYOfrY","tlILtqaofN",
+"qQxHP618Di","wiHrZKr8ys","Mm8siFxX9q","29QAzHzZT8","guMb8cQOnv","s93MlY1mC0","M6qcGNAFuw","iB08lBbwgA","0PktIjiVBP","7hyVvdhSuH",
+"dQ586P6bcg","RsQUqlsQGo","5VZjSJRJQB","WPmlxciuWz","iB08lDz1R3","2ZHdkhi5X7","5IhmGYw2oU","t59lRW7cTs","d7vjMMezSW","0MR5XCNHmv",
+"fqypypFrrl","jzUqRbgJAz","x3LDepFrrl","x3LDeuTacx","SmGzvMaJQs","FFDuizbIYY","QssNCFLsph","azIWp8FmFH","Nxx9Vaez9y","ksJbymX2GE",
+"rz7UtFNYIM","EoToPcShY2","0BmCyChuy3","0KyfsOUqFM","Ta8f6CK5W7","t98iWW3VFH","RkQkeHP433","RpBQmW7cTs","iqv4kfmIK1","azIWpwiHrZ",
+"s93Ml8xEKz","0MR5XVprf2","2ZHdkBpYhV","b29RJ8xEKz","gdQsSrz7Ut","Yh1hFIBe8k","M3zXL8RCUA","tuDyStl72W","16lHcsoy9t","55rfBUmaEv",
+"IRh48Yh1hF","SjskQ6AFT0","qaofN45cIH","DG4sTX6Pin","TCgPppWiOs","uPX7Gjtn0X","NAFuwTa8f6","uJScXdjsrv","gIYvE4QMc9","aFFssBCxeC",
+"e6e4zpAhR1","BbwgAFFDui","FwEJzC2Irc","Q6hMCx3LDe","yvOMIpv0i7","iqv4kzz4ZU","0KyfsaFFss","suY4xWPmlx","8RCUA14FLR","GXdoHcQOnv",
+"o8UydxXTI4","tvdkDCIShG","wDajXtAOsr","h1zcHuZPqg","Z4I1vxciqp","NcICAtaOXK","jeskS16lHc","zqH0WJIqXi","cShY2bZLvS","8U2nUFNYIM",
+"gtCA57lUXZ","n1pmOECMvU","5drc6fqypy","UlU3MnFqik","IRh48aDGtS","ReKEWYjB9t","MmKGJ7Ow5C","KZamH0YAGH","9y4lwcShY2","mX2GERkQke",
+"Kr8ysHRxd8","CIShGy94nw","W3VFHUmaEv","DLhzMEoToP","Yh1hFSs0Zu","he9IAO3iyQ","CdyBVrz7Ut","TwanowiHrZ","29QAzoGu6x","FjHXRZuDtD",
+"MaJQsn1pmO","uLtKslkMUA","FGzgpd85a9","CK5W7NhXdu","0Kyfsiqv4k","0Wr5yl83Ud","S2Dfu6q6L9","jzUqRprNT6","5VZjSCdyBV","QClRLogLgc",
+"S77LH580YD","BbwgAjzUqR","yluBx8FmFH","0KyfsCIShG","MmKGJkZANm","JKWYRjeskS","8RCUA7lUXZ","ZhwG18cVD3","uTacxsuY4x","TCgPptjQxs",
+"Yf2EcHP433","QClRLAOgEe","bZLvSpiJSk","faHirL7cGc","FPfSE9iGoT","K4GS8UlU3M","tjQxsC2Irc","GXdoHU3yw5","NcICAqaofN","oGu6xiB08l",
+"BpYhVUl4a1","JkzUni3pyd","1LB1LIKxdL","2DREsfFDrJ","BCxeC8U2nU","OHaBzG1RhS","tjQxslkMUA","nnP8oFNYIM","jiVBP0Wr5y","FGzgpPb1pa",
+"jiVBPNhXdu","M6qcGWPmlx","nlaByZUnqt","HRxd8IKxdL","kZANmlpF6W","dpe1vM6qcG","CIShGKsjRK","Kr8yskB5nP","SmGzvPb1pa","ZUnqt07n1c",
+"4W0TlNcICA","SmGzvZ4I1v","OUqFMnlaBy","MGlTFtAOsr","pv0i7cL0aE","hYBCKStlDJ","uoStwcShY2","FPfSELbRTH","6q6L9DQimp","64s8N6AFT0",
+"ZhwG1FGzgp","3weIFIn3NS","Oz8yZazIWp","qQxHPUmaEv","5NammuZPqg","FcWrW29QAz","7fKYUuQIcz","s4786ciuWz","SjskQSjskQ","prNT68hJdt",
+"oVQp6bgJAz","8TxD7RsQUq","t59lRdmoS7","JJs5mDLhzM","Waim6FFDui","In3NSQ6Lix","FFDuiZJTXH","9eoRc0Wr5y","cmXIXuoStw","GXdoHlsQGo",
+"FwEJzM6qcG","jeskS5IhmG","0PktIcQOnv","1LB1LlweGy","Qworu1j5L8","pvgjSWaim6","cShY2hi5X7","ECMvU6AFT0","8FmFHmX2GE","BGaQYGv3Fq",
+"jzUqRJ2mQi","8TxD79iGoT","618Di48cHL","RzaZAgIYvE","rKDLJhUTw7","0h1b15VZjS","v2eC3iKqhr","Yf2Ecs7Mxk","6q6L9tjQxs","cmXIXPb1pa",
+"pvgjSQClRL","1LB1L1v5hH","zbIYYdmoS7","9eoRcjiVBP","6AFT0CxVEf","9XyT9MmKGJ","No0QbCxVEf","GrDg7uupzk","RpBQmix74r","Oz8yZ0PktI",
+"d7vjMvkCHH","YOfrYQnJ1S","rKDLJzqH0W","uZPqgQnJ1S","soy9tPb1pa","jS1aje6e4z","JIqXiHfyNQ","pvgjSyvOMI","CxVEfOUYuF","UmaEvBFkb8",
+"LbRTHMK07Y","t98iWxReec","nnP8ojfREu","8RCUAtaOXK","qUJMdlH1kt","RACujJIqXi","uvf7AJKWYR","gIYvEZ4I1v","s7Mxkb29RJ","K4GS8pT8wu",
+"t98iW29QAz","Yf2EclweGy","S77LHVIlwP","I7p2ai7WMQ","atef2J2mQi","1j5L88FmFH","BpYhVuQIcz","Vprf29y4lw","l83UdvkCHH","L7cGc9y4lw",
+"WaWsvBCxeC","BpYhVksJby","XyPZN9rlg9","ZUnqtnlaBy","8TxD7v8yFN","MmsIoZhwG1","CK5W7EdBKc","SbRYyBFkb8","AkKTkZUnqt","kZANmQbxXc",
+"uN6r3dpe1v","nlaByTXQ0Z","7ku1pVNCPd","Z4I1vMmKGJ","CqqaDJkzUn","gtCA5BpYhV","uupzkm4bxU","DQimppFrrl","RACujCK5W7","gjUTuB3qem",
+"IKxdLyofH3","suY4xHRxd8","LDk6fQWxoT","uN6r3Y1mC0","3otm6RpBQm","gtCA53otm6","jfREuP6bcg","Mm8siSWfou","45cIHQ6hMC","IBe8kM6qcG",
+"DG4sT2ZHdk","8U2nUv2eC3","AIYUuReKEW","pAhR1HzZT8","uZPqgsx5Gl","MaJQsEoToP","DG4sTAXpwE","h1zcH1v5hH","0h1b1ZuDtD","HP433KZamH",
+"ZJTXHEdBKc","nnP8oUvlv4","3weIFuQIcz","kB5nPQYxC0","bgJAzDLhzM","xReec5Namm","Gv3FqVerEA","uoStwU3yw5","Cfgr31LB1L","sqVrfYh1hF",
+"1LB1L8xEKz","Nxx9V9GXkX","vOqCEXflUq","EOE1oWreyP","TCgPpGWqqX","2Yz7Eh1zcH","VerEAh1zcH","ksJbyfcJOy","h1zcHgtCA5","CdyBVokgRi",
+"tjQxsRkQke","POUYS7Ow5C","a00b5Cfgr3","9eoRcOz8yZ","GSQwjMmKGJ","8cVD3qaofN","QworujzUqR","7ku1ppmeCd","Nxx9VWaim6","6q6L9ZzJHW",
+"aDGtS5Mg9r","I7p2aWreyP","bZLvSStlDJ","aL6AJ9XyT9","7lUXZuN6r3","2NslmPYBf4","PYBf4oVQp6","580YDMojnP","8FmFHzmLYD","a00b5DcpWB",
+"AkKTkuZPqg","t98iWhYBCK","pFrrl5Namm","GWqqXbrhlQ","7Ow5CVerEA","AXpwE2TRI7","FjHXR07n1c","StlDJ9GXkX","6AFT0tlILt","D6rByuJScX",
+"jS1ajMmsIo","YjB9taFFss","BGaQYvLsmS","Yw2oUZ4I1v","7fKYU48cHL","zmLYDi7WMQ","FnPFBOxWIH","lj07QJXljW","QbxXccmXIX","d7vjMAIYUu",
+"uQIczZUnqt","Z4I1voQ87r","v2eC3RzaZA","NcICAtuDyS","tuDySZUnqt","LewvMaDGtS","8TxD7Z4I1v","MK07YlpF6W","zqH0WhSSvQ","faHirPOUYS",
+"7lUXZMojnP","LbRTH0h1b1","pAhR1RmDcr","OxWIHGXdoH","DLhzMTwano","FcWrWOUYuF","okgRiS77LH","3weIFMkgy8","tjQxs45cIH","iB08lWPmlx",
+"Vprf2NAFuw","lCMxy5drc6","x3LDeLbRTH","MezSWKsjRK","HRxd8iqv4k","8xEKzLbRTH","suY4xoQ87r","Gv3FqS2Dfu","zQt6QWMiS3","he9IAdpe1v",
+"KsjRKuupzk","RxrsmdmoS7","BFkb8MaJQs","8hJdt2ZHdk","Oz8yZlm0pD","fcJOypT8wu","iqv4khYBCK","sqVrf2Nslm","9GXkXQworu","24ARF5iGN5",
+"Yh1hFcL0aE","CNHmvh1zcH","CIShG4W0Tl","AIYUuO3iyQ","fcJOybrhlQ","qaofNyToGW","RzaZA6q6L9","CqqaDpiJSk","CNHmvRpBQm","RsQUqOUqFM",
+"0PktIFnPFB","HlUbF2ZHdk","OUqFMpWiOs","NhXdu8RCUA","euZA5MojnP","Pb1pa5Namm","QYxC0S2Dfu","kB5nPyluBx","16lHczQt6Q","fFDrJzqH0W",
+"l83UdEOE1o","RsQUqHP433","DQimpJIqXi","RxrsmzmLYD","CqqaDIBe8k","TXQ0Z5nmWv","FLsphRpBQm","580YDjzUqR","0MR5XkZANm","MmKGJYf2Ec",
+"uoStwQChxs","9iGoTCp3mZ","cL0aEL7cGc","5Drn0bZLvS","LewvMCxVEf","Chuy3F6PT2","uN6r3tvdkD","F6PT27fKYU","2ZHdkNcICA","xciqpU3yw5",
+"gf8rIIn3NS","55rfB5iGN5","jiVBP16lHc","O3iyQKr8ys","3weIFfLNg8","9y4lwMm8si","s7Mxkhe9IA","gf8rIMojnP","WaWsv5Mg9r","qaofNDG4sT",
+"W3VFHIKxdL","D6rByv1Hln","FcWrWgtCA5","5ZaEzDQimp","hUTw7OHaBz","NOHszlH1kt","5VZjSIKxdL","n8pJ9FLsph","JIqXidjsrv","fcJOyD6rBy",
+"fmIK1Mm8si","8FmFHhUTw7","iKqhrJJs5m","Ta8f6cShY2","tjQxsW7cTs","8xEKzfcJOy","No0QbuN6r3","bZLvSI7p2a","GWqqXSWfou","taOXKZ4I1v",
+"5ZaEzuZPqg","CK5W7s93Ml","WMiS3No0Qb","tlILtCfgr3","MmKGJQChxs","lH1kt7X3uy","FnPFB2ZHdk","MojnPpWiOs","PYBf4zQt6Q","M3zXLWaim6",
+"WreyPQClRL","lkMUAfmIK1","64s8NWaWsv","Z4I1vvkCHH","5IhmGuupzk","LDk6fUlU3M","zbIYY9GXkX","ulk41KZamH","YjB9tZ4I1v","piJSkiwzGk",
+"0BmCyWMiS3","5nmWvcmXIX","7fKYUMaJQs","7ku1pThjNn","lpF6W1j5L8","yvOMIXflUq","Cp3mZFwEJz","s4786Ss0Zu","2hEEUTwano","24ARFJ2mQi",
+"HlUbFOUYuF","M6qcGsx5Gl","nFqiki3pyd","fqypy618Di","Chuy3lXFOB","cShY2580YD","yEfy9s4786","3otm6xciqp","AmdQdWreyP","ZJTXH1LB1L",
+"DG4sTaL6AJ","S2DfuQworu","7Ow5CUmaEv","t59lRydG8U","FGzgpB3qem","IKxdLCxVEf","fqypyh1zcH","BbwgAU3yw5","ZUnqtVIlwP","ulk41gtCA5",
+"uQIczNhXdu","XyPZNFjHXR","oQ87roVQp6","DQimpi3pyd","blLA98FmFH","3otm6AmdQd","JJs5mlj07Q","CdyBVCdyBV","9eoRcblLA9","FVMxoGXdoH",
+"ZuDtDiKqhr","Chuy3AIYUu","Oz8yZJIqXi","07n1cn1pmO","S2DfuuQIcz","QssNCv1Hln","pmeCdQChxs","fcJOyaFFss","Ta8f6Chuy3","4W0TlaFFss",
+"SbRYyv8yFN","zmLYDh1zcH","n8pJ9fFDrJ","rhl0JP6bcg","0Wr5yjzUqR","pAhR1euZA5","cShY2zbIYY","mz8gx0YAGH","o8Uyd0MR5X","Yf2Eck85Ae",
+"9XyT9xciqp","Cp3mZy94nw","K20wKM6qcG","pT8wutjQxs","m4bxU45cIH","v1HlnBbwgA","Mkgy80BmCy","v2eC3o8Uyd","RmDcrFxX9q","xciqp7hyVv",
+"i3pydW3VFH","WreyP29QAz","MmKGJPYBf4","zz4ZUCxVEf","StlDJRmDcr","zFgtBYh1hF","FFDuiCfgr3","FVMxoQworu","OUqFMiwzGk","3otm6JXljW",
+"suY4xZuDtD","y94nwgdQsS","IRh485drc6","dmoS7QYxC0","vkCHHuoStw","KZamHNOHsz","IKxdL8xEKz","I7p2aGXdoH","KZamHIn3NS","QChxslH1kt",
+"KZamHJJs5m","16lHcMK07Y","y94nwJkzUn","F6PT2W3VFH","he9IAfqypy","uN6r3cQOnv","FcWrWjzUqR","CdyBVi7WMQ","jiVBPvkCHH","5NammuPX7G",
+"6q6L9Fhtgl","JIqXiuLtKs","d85a9b29RJ","1j5L8S2Dfu","jtn0XM6qcG","QChxsMmsIo","uZPqgs4786","LbRTHm4bxU","BpYhVzY1GY","KASQ8wDajX",
+"5ZaEzazIWp","uupzkx3LDe","xciqpBpYhV","AkKTkPYBf4","uJScX3otm6","8xEKzFPfSE","pT8wu8cVD3","WmadASWfou","brhlQ5VZjS","4dEz6tl72W",
+"QClRLCNHmv","qQxHPjeskS","Cp3mZ48cHL","AXpwEiwzGk","LDk6fSjskQ","FGzgp5drc6","NAFuw2Yz7E","lm0pDZv7z0","pv0i7d85a9","Ta8f6lm0pD",
+"DG4sThYBCK","O3iyQ1j5L8","5Namm55rfB","TCgPp8RCUA","WreyPtlILt","xciqp5ZaEz","AgJHQh1zcH","UmaEv7X3uy","t98iW45cIH","4dEz6UlU3M",
+"zY1GYhi5X7","gtCA5UmaEv","nlaByZuDtD","lsQGok85Ae","kB5nP3otm6","GXdoHcL0aE","Vprf2WaWsv","AkKTkKr8ys","PYBf4kB5nP","ru4UGNAFuw",
+"AIYUuzmLYD","jSjS3DLhzM","xciqpReKEW","TXQ0ZFcWrW","ZuDtDOxWIH","lCMxy8FmFH","dmoS7No0Qb","J2mQi7Ow5C","iKqhrbgJAz","zqH0WTCgPp",
+"kB5nPhYBCK","Cfgr3Pb1pa","e6e4zC2Irc","Waim6BFkb8","n8pJ9faHir","he9IAHfyNQ","SWfouFxX9q","2Yz7EB3qem","tvdkDxciqp","WDVWJuZPqg",
+"Rxrsmt98iW","FxX9qiwzGk","8hJdthE1Ql","Twanouupzk","Cfgr3t98iW","8hJdtpWiOs","HfyNQIBe8k","FVMxo07n1c","suY4xlCMxy","W3VFHAgJHQ",
+"jeskSxXTI4","fcJOyiKqhr","SbRYyHRxd8","2hEEUQbxXc","ogLgcYOfrY","euZA5QnJ1S","xciqpblLA9","LbRTHYjB9t","dmoS7gdQsS","LbRTHcL0aE",
+"S2DfubrhlQ","Chuy36q6L9","pT8wuBbwgA","KZamH8xEKz","2DREsulk41","aFFss8xEKz","s4786CNHmv","vkCHHcL0aE","EoToPLbRTH","ix74rIRh48",
+"S2DfulweGy","guMb89rlg9","n1pmOHRxd8","2ZHdkQbxXc","WmadAOxWIH","64s8NlXFOB","S2DfuChuy3","2NslmtaOXK","aFFss5Namm","h1zcHy94nw",
+"FGzgpWDVWJ","dQ586jzUqR","tjQxsVerEA","FnPFBgIYvE","qaofN24ARF","lCMxyNo0Qb","MGlTFb29RJ","n8pJ99XyT9","FGzgpbgJAz","pWiOsnnP8o",
+"CdyBV0h1b1","pmeCdAmdQd","IBe8kZJTXH","5ZaEzRzaZA","0YAGHfFDrJ","RBhp0s7Mxk","qUJMdo8Uyd","5nmWvksJby","6q6L9x3LDe","fmIK1pvgjS",
+"hSSvQi7WMQ","fmIK1IKxdL","lXFOBkZANm","Z4I1v9iGoT","cL0aEaDGtS","HP433VLTy6","iKqhraFFss","Ss0ZupiJSk","tAOsrReKEW","sqVrfMK07Y",
+"KsjRK2hEEU","zz4ZUlH1kt","iB08liKqhr","No0QbhE1Ql","n8pJ9ru4UG","7Ow5CoQ87r","dpe1vPOUYS","k85AebrhlQ","fFDrJBpYhV","sqVrflH1kt",
+"lsQGoK4GS8","vLsmSECMvU","MezSWQworu","zmLYDKr8ys","LbRTHksJby","RmDcrWPmlx","0YAGHkB5nP","d7vjMGSQwj","FNYIMRBhp0","RxrsmQ6Lix",
+"MmsIoSbRYy","tl72WSmGzv","rz7UtD6rBy","MaJQs24ARF","0Wr5yogLgc","SjskQ0Kyfs","No0QbTwano","Mm8siCK5W7","0MR5XJ2mQi","4dEz65drc6",
+"iqv4kjS1aj","0h1b1ReKEW","X6PinnFqik","n1pmOZuDtD","l83UdFwEJz","RzaZA55rfB","OxWIHBFkb8","lweGyfLNg8","YOfrYlm0pD","J2mQihUTw7",
+"Oz8yZyToGW","uN6r3L7cGc","5VZjS0Kyfs","FxX9qNOHsz","FPfSE7hyVv","No0Qb3otm6","ksJbymz8gx","yToGWuLtKs","5Drn0F6PT2","2ZHdkFxX9q",
+"mX2GEAmdQd","2Yz7EFwEJz","Cfgr3UlU3M","k85AeZzJHW","HlUbFn1pmO","BpYhVn1pmO","0MR5XtaOXK","QWxoT6q6L9","faHiryEfy9","blLA9CdyBV",
+"8xEKzMezSW","0MR5XFGzgp","Q6hMClViBv","tl72WU3yw5","MGlTFVerEA","0PktIIBe8k","Cfgr3W7cTs","45cIHiKqhr","pvgjSatef2","16lHcDG4sT",
+"xciqpqQxHP","BFkb8blLA9","DcpWByEfy9","pFrrluPX7G","x3LDeU3yw5","29QAzjSjS3","lpF6WMmKGJ","VNCPdSmGzv","8RCUA2DREs","DcpWBRpBQm",
+"5ZaEzXyPZN","ksJbygtCA5","xXTI4prNT6","JKWYRZzJHW","6AFT0WaWsv","OUYuFe6e4z","QssNCIBe8k","Ta8f6n8pJ9","J2mQiJKWYR","GSQwjs7Mxk",
+"KASQ8MojnP","s7MxkeuZA5","RsQUqjfREu","4W0Tl1LB1L","Qworu5Drn0","L7cGcnnP8o","YOfrYx3LDe","BFkb8s93Ml","m4bxUnnP8o","cShY2kZANm",
+"lpF6WEOE1o","lj07QOz8yZ","ReKEWt59lR","JXljWgdQsS","zFgtByvOMI","9rlg9UlU3M","v2eC3Mkgy8","CdyBVMGlTF","Zv7z0AOgEe","iwzGkgIYvE",
+"RACujaL6AJ","OxWIHOz8yZ","NOHszWmadA","iB08lgf8rI","pmeCdlViBv","CNHmvlkMUA","s93MlWPmlx","yofH3NhXdu","vLsmSZzJHW","x3LDerKDLJ",
+"fLNg8mz8gx","i7WMQlXFOB","rKDLJSjskQ","Dz1R3jzUqR","AkKTkIBe8k","fcwDavkCHH","5NammbgJAz","euZA5i3pyd","s7MxkhE1Ql","MojnPZuDtD",
+"YjB9tpv0i7","fcwDafqypy","azIWp6q6L9","pAhR1tvdkD","WaWsvRxrsm","RxrsmMGlTF","gjUTupAhR1","prNT6ZzJHW","Mkgy8aez9y","NcICAKZamH",
+"YjB9tC2Irc","VBjhzRsQUq","uPX7GKASQ8","pT8wuYf2Ec","AkKTkJkzUn","fFDrJjiVBP","HRxd8cL0aE","a00b5FFDui","cShY2h1zcH","xXTI47hyVv",
+"VLTy6QClRL","brhlQblLA9","s4786KASQ8","PYBf4zmLYD","5Namm0ao3l","iKqhrcmXIX","m4bxUblLA9","y94nw8hJdt","guMb8oQ87r","3weIFqaofN",
+"kB5nPY1mC0","cL0aEn1pmO","9GXkXAmdQd","hE1Ql3weIF","hUTw75VZjS","o8UydTa8f6","hUTw7he9IA","Q6hMCguMb8","2TRI7QnJ1S","8TxD7ydG8U",
+"zqH0W9y4lw","Z4I1vRkQke","MaJQs9iGoT","S2DfuwDajX","Nxx9Vv2eC3","Cp3mZI7p2a","atef20YAGH","gIYvE5Namm","8FmFH580YD","tjQxsK4GS8",
+"dQ586v2eC3","cL0aEy94nw","wiHrZOxWIH","OUYuFfaHir","rhl0JuQIcz","IKxdLK20wK","1v5hH2ZHdk","i3pydY1mC0","HzZT8JJs5m","S2Dfuv8yFN",
+"48cHLQYxC0","xXTI4zz4ZU","5ZaEzi3pyd","Y1mC02TRI7","C2IrcJKWYR","bZLvSzQt6Q","Yh1hFWaWsv","WmadAAXpwE","v8yFNM3zXL","5iGN5oGu6x",
+"WreyPIKxdL","azIWpChuy3","WaWsv24ARF","t59lRatef2","FwEJzguMb8","NOHszBGaQY","8hJdtXflUq","FVMxoYOfrY","D6rByuN6r3","ksJbydjsrv",
+"mX2GEBCxeC","jS1ajsx5Gl","jeskSjfREu","DcpWB4W0Tl","zFgtB9eoRc","EdBKcnnP8o","tvdkDqaofN","Q6hMCBbwgA","hSSvQMGlTF","mX2GEGXdoH",
+"L7cGca00b5","VBjhzpWiOs","RACujYOfrY","nFqike6e4z","lViBv2ZHdk","ZuDtDFLsph","atef2MmKGJ","8U2nUAOgEe","IRh48fcwDa","s93MlHfyNQ",
+"lH1ktcmXIX","2Yz7E6q6L9","jzUqR48cHL","s7Mxk0PktI","RzaZAPYBf4","rhl0JjiVBP","U3yw5jzUqR","X6PinMmKGJ","1v5hHulk41","Mkgy88U2nU",
+"dpe1vD6rBy","ciuWzqUJMd","VerEAlkMUA","guMb8580YD","jtn0XqUJMd","Chuy35ZaEz","fcJOyazIWp","uJScXS2Dfu","L7cGc2Nslm","jSjS3uJScX",
+"TCgPpLbRTH","sqVrfZhwG1","zmLYDjSjS3","GrDg7v8yFN","Ul4a1o8Uyd","Nxx9VRACuj","gIYvE7X3uy","s93MlYw2oU","7fKYUx3LDe","qaofNnlaBy",
+"IjTwPk85Ae","FxX9qZ4I1v","0PktIaL6AJ","SbRYyKASQ8","JXljWguMb8","WPmlxMmKGJ","ZUnqtRmDcr","FNYIMyofH3","hE1QlnnP8o","ZJTXHxXTI4",
+"In3NS64s8N","ru4UGYh1hF","NOHszuAWyp","lkMUAXflUq","uoStwsx5Gl","45cIHl83Ud","uLtKss7Mxk","L7cGcfFDrJ","Kr8ysqUJMd","EoToPd85a9",
+"580YDVBjhz","EoToPMezSW","29QAz6q6L9","QWxoTeuZA5","v8yFNzY1GY","tlILtjzUqR","dpe1vfaHir","uN6r3QssNC","HlUbFvOqCE","QClRLFPfSE",
+"FFDuiVIlwP","HRxd8IRh48","lXFOBOxWIH","uupzkcmXIX","Uvlv4tl72W","guMb8C2Irc","4W0Tlk85Ae","e6e4zxciqp","Yw2oUKr8ys","gIYvE7Ow5C",
+"guMb8WMiS3","pAhR1pT8wu","3otm6fLNg8","TCgPpHzZT8","sqVrfPOUYS","lXFOBsx5Gl","FxX9q5Drn0","RpBQmgjUTu","EoToPTXQ0Z","aez9y48cHL",
+"RmDcrdpe1v","B3qemaL6AJ","pmeCdWaim6","nlaByuvf7A","7fsYMblLA9","XflUqYw2oU","lCMxyZv7z0","7fKYUgf8rI","lViBvkZANm","fqypy64s8N",
+"3otm6MezSW","ru4UGdjsrv","07n1cNo0Qb","Z4I1vM6qcG","OUYuFx3LDe","C2IrcX6Pin","P6bcgECMvU","ReKEWOUqFM","bgJAz580YD","7fKYUFFDui",
+"UmaEvY1mC0","Y1mC0he9IA","Qworurhl0J","IjTwPNcICA","azIWpMmKGJ","k85AeyluBx","KASQ85IhmG","U3yw5dmoS7","ix74rtlILt","4QMc9JKWYR",
+"RkQkedmoS7","MaJQsiwzGk","FnPFBhUTw7","MojnPwDajX","gdQsSBGaQY","Uvlv4JIqXi","Q6LixFnPFB","0h1b11v5hH","HP43345cIH","kZANm8RCUA",
+"fmIK1Waim6","PYBf4vkCHH","HRxd8sqVrf","he9IAguMb8","Gv3FquTacx","Waim6MezSW","EdBKciB08l","MmKGJCxVEf","ECMvUpAhR1","pFrrlIn3NS",
+"zHF1qMmsIo","zHF1qAIYUu","16lHcuJScX","L7cGcPYBf4","RmDcrwDajX","5ZaEznlaBy","NhXduYh1hF","CK5W7WPmlx","KASQ8Yh1hF","FnPFBReKEW",
+"WDVWJfmIK1","4dEz6ulk41","piJSktlILt","CIShGd85a9","No0Qb0YAGH","gdQsSM6qcG","taOXKGXdoH","FjHXRNhXdu","Ss0Zud85a9","jzUqRi3pyd",
+"8hJdtKsjRK","QYxC0GSQwj","aL6AJhe9IA","2hEEUCIShG","Q6hMCRpBQm","KsjRKnnP8o","YOfrYvLsmS","uLtKs0ao3l","LewvMVjCZq","5iGN5XyPZN",
+"soy9t7Ow5C","he9IAFNYIM","QssNCRmDcr","QssNCWreyP","v8yFNIBe8k","i7WMQuTacx","FhtglW7cTs","ydG8UAOgEe","S77LH2Nslm","7fKYUsuY4x",
+"D6rByAkKTk","jeskS8RCUA","v1Hln0BmCy","uJScXOxWIH","OxWIH5VZjS","MmKGJTa8f6","HlUbF9eoRc","KASQ8Ss0Zu","7Ow5Clj07Q","brhlQyEfy9",
+"qaofNuvf7A","HzZT8d7vjM","tlILtgdQsS","FGzgpVIlwP","MGlTFix74r","m4bxUjeskS","m4bxUWaim6","pv0i7zz4ZU","SjskQzHF1q","WreyPlsQGo",
+"MezSW0h1b1","14FLRQworu","C2IrcQChxs","nFqikm4bxU","IKxdLFFDui","HP4335VZjS","C2IrclViBv","Cp3mZ9XyT9","hE1QlCIShG","VNCPdlsQGo",
+"1LB1LxReec","8xEKzRpBQm","580YDJIqXi","Waim6EOE1o","qUJMdi7WMQ","RkQkeDQimp","Uvlv4EOE1o","GrDg7EOE1o","piJSkGv3Fq","Cp3mZKr8ys",
+"Cfgr3tjQxs","yToGWKASQ8","TXQ0ZCIShG","W3VFHBCxeC","BpYhV8FmFH","Cp3mZtlILt","Mkgy8G1RhS","NOHszMaJQs","2TRI7VerEA","6q6L97ku1p",
+"yofH3Vprf2","WMiS3SmGzv","2DREsVNCPd","zz4ZUWaWsv","VBjhzSbRYy","hSSvQksJby","uN6r3uTacx","1j5L8LewvM","Rxrsm9XyT9","QWxoTTa8f6",
+"BGaQYfcwDa","lm0pD55rfB","RxrsmCp3mZ","zmLYD580YD","Uvlv4BCxeC","LbRTHe6e4z","8U2nUzz4ZU","5ZaEz45cIH","9rlg92DREs","CdyBV0Kyfs",
+"Ul4a1oQ87r","RzaZAVjCZq","MojnPGXdoH","e6e4z8hJdt","No0QbJKWYR","2NslmNAFuw","rKDLJn1pmO","EoToPGXdoH","s7Mxk16lHc","a00b5lkMUA",
+"StlDJfcJOy","5ZaEzo8Uyd","zz4ZUSbRYy","IjTwPWmadA","o8UydOUYuF","ydG8U5VZjS","4QMc98TxD7","QClRL7lUXZ","RzaZAdjsrv","KsjRK0MR5X",
+"NAFuw8xEKz","QYxC0pv0i7","X6PinWaim6","kB5nPn8pJ9","POUYSOHaBz","zFgtBCxVEf","IjTwPaDGtS","IRh48Cp3mZ","jzUqRLDk6f","ogLgcFFDui",
+"2DREssuY4x","FPfSElj07Q","lCMxy7X3uy","Z4I1vnFqik","2DREsuPX7G","NhXdutlILt","suY4x7fKYU","MGlTF16lHc","1v5hHMezSW","iKqhrCK5W7",
+"0Wr5yJJs5m","LewvMYf2Ec","GWqqXEOE1o","Uvlv4lsQGo","VBjhzhUTw7","Kr8ysCNHmv","8cVD3mX2GE","YOfrYuoStw","sqVrfi7WMQ","lXFOBuJScX",
+"FPfSECp3mZ","QWxoTs4786","8hJdtgIYvE","7hyVvk85Ae","7hyVv3weIF","iB08lgIYvE","BbwgAt98iW","nlaByTa8f6","QbxXc2DREs","S2DfuXflUq",
+"9y4lwCdyBV","GXdoHM6qcG","Yf2EcG1RhS","m4bxU580YD","0ao3lHP433","v8yFNVBjhz","FxX9q7fsYM","pmeCdtvdkD","7fKYU2ZHdk","lj07QcmXIX",
+"2TRI75drc6","zqH0WMojnP","n8pJ9K4GS8","h1zcHAkKTk","HRxd88FmFH","Ul4a1YOfrY","uvf7AqaofN","S2Dful83Ud","i3pydZhwG1","BbwgAdjsrv",
+"29QAz0ao3l","brhlQDcpWB","hSSvQGv3Fq","suY4xyEfy9","lsQGoStlDJ","ulk41zqH0W","Pb1pabrhlQ","s93MlbgJAz","AIYUu0MR5X","n8pJ9oQ87r",
+"CNHmvYh1hF","e6e4zjfREu","7fKYUs93Ml","HlUbFAIYUu","v1Hln5Namm","Rxrsmy94nw","zQt6QZhwG1","rhl0JjSjS3","64s8NSs0Zu","580YDM6qcG",
+"RpBQmlm0pD","ksJbyWaWsv","7Ow5C9GXkX","xReecPYBf4","618DilH1kt","uAWypBpYhV","FFDuiMezSW","G1RhSMmKGJ","vLsmSa00b5","FLsph8FmFH",
+"OUYuFQbxXc","atef2Uvlv4","VBjhzAgJHQ","t98iWoQ87r","FwEJz0Wr5y","ydG8UcShY2","gdQsS4dEz6","55rfBzQt6Q","atef224ARF","U3yw54QMc9",
+"FLsphtlILt","ix74rCxVEf","ZhwG1I7p2a","tl72WTwano","lsQGoEoToP","D6rByqaofN","J2mQi9y4lw","iwzGkksJby","zz4ZU2ZHdk","Q6hMCuTacx",
+"brhlQfFDrJ","0BmCyF6PT2","soy9tnnP8o","tvdkDCqqaD","sx5GlOUqFM","ThjNnAgJHQ","HP4332DREs","KZamHRzaZA","2ZHdkuQIcz","euZA5PYBf4",
+"VBjhz48cHL","WreyPFjHXR","lsQGoe6e4z","AXpwECxVEf","D6rBykZANm","yvOMIUl4a1","pFrrlfqypy","ni2v1RkQke","n1pmOQworu","uAWypgf8rI",
+"Pb1paYjB9t","7fsYMHlUbF","RkQkeKZamH","suY4x2DREs","UlU3MZ4I1v","k85AetaOXK","he9IARxrsm","s7Mxkiqv4k","FPfSEaDGtS","In3NSuAWyp",
+"HP433EOE1o","yluBxtAOsr","XyPZNsx5Gl","CNHmvYf2Ec","TXQ0Zhi5X7","KZamHaez9y","M3zXL8FmFH","SmGzvru4UG","uPX7GzY1GY","euZA5ogLgc",
+"ThjNnThjNn","pFrrl8FmFH","5NammHRxd8","nFqik4dEz6","8FmFHpT8wu","G1RhSokgRi","euZA5nlaBy","jiVBPhUTw7","s7MxkzQt6Q","MmsIoGv3Fq",
+"lkMUAJIqXi","FcWrWdmoS7","RzaZAOxWIH","CIShGcL0aE","Uvlv4QWxoT","ni2v1guMb8","VerEASmGzv","d7vjMSWfou","HfyNQSmGzv","hUTw72DREs",
+"zY1GYGrDg7","zQt6Q7X3uy","vkCHHru4UG","RzaZAUlU3M","aDGtSWaim6","LDk6f4dEz6","tl72WTa8f6","i7WMQSjskQ","5iGN5cShY2","64s8NuTacx",
+"FGzgpS77LH","ru4UGJRJQB","O3iyQuupzk","ECMvUiqv4k","5IhmGfLNg8","iKqhr48cHL","8hJdtQbxXc","RmDcrFcWrW","W3VFH8cVD3","NAFuwjiVBP",
+"Q6hMCPOUYS","7ku1pMm8si","ogLgcXflUq","sqVrfv8yFN","TXQ0ZM6qcG","HlUbFLDk6f","2hEEUKsjRK","618Di0Wr5y","aFFsse6e4z","7lUXZI7p2a",
+"jiVBPNAFuw","ulk41WreyP","lXFOBaez9y","sx5Gl5ZaEz","DLhzM45cIH","3weIF2DREs","okgRiDz1R3","jzUqRPOUYS","B3qemNOHsz","sqVrfEOE1o",
+"ZuDtDru4UG","Cp3mZZhwG1","BGaQY0YAGH","xReecxReec","ZuDtDo8Uyd","Q6hMCokgRi","F6PT2X6Pin","tl72WQworu","StlDJ2TRI7","dmoS7lXFOB",
+"StlDJcShY2","Yh1hFQYxC0","RmDcrDcpWB","9y4lwChuy3","LDk6fAOgEe","QChxsNcICA","Z4I1vMK07Y","jS1ajrz7Ut","lCMxytl72W","CNHmvW3VFH",
+"7Ow5CgtCA5","k85AeGrDg7","OxWIHJkzUn","4QMc9Rxrsm","Y1mC0lm0pD","fmIK1IRh48","b29RJ5IhmG","tjQxsfqypy","7hyVvHlUbF","FwEJzVjCZq",
+"pT8wujiVBP","JkzUnlH1kt","fcwDaRACuj","SbRYyDG4sT","y94nwFPfSE","IBe8kyvOMI","xXTI4soy9t","LbRTHYw2oU","JkzUnSs0Zu","uvf7AQ6hMC",
+"2DREs0MR5X","Pb1pa8xEKz","CK5W7JRJQB","29QAz0MR5X","EoToPO3iyQ","U3yw524ARF","fFDrJG1RhS","ogLgcuPX7G","lXFOBprNT6","FxX9qogLgc",
+"EoToPFjHXR","iqv4kLewvM","Q6LixlweGy","K4GS8IRh48","XyPZNVBjhz","5VZjSi7WMQ","6AFT0QClRL","NhXduVerEA","QbxXcM3zXL","s4786aDGtS",
+"lH1ktKASQ8","FLsphBbwgA","ECMvURsQUq","dQ586zY1GY","uN6r3C2Irc","jeskSJkzUn","pAhR13otm6","Gv3FqjSjS3","6q6L9v2eC3","oQ87rKASQ8",
+"RzaZAokgRi","WDVWJIn3NS","rKDLJjSjS3","QbxXcZzJHW","mz8gx29QAz","d7vjMyvOMI","qUJMddmoS7","SbRYy4QMc9","zY1GYQChxs","aez9ygdQsS",
+"hUTw7zz4ZU","VBjhzs4786","aFFssaL6AJ","MGlTF5Mg9r","cmXIXMGlTF","6AFT0580YD","fFDrJfmIK1","24ARFdpe1v","Uvlv4uZPqg","Yh1hFs7Mxk",
+"xciqplm0pD","AgJHQnnP8o","5VZjSThjNn","Ta8f6CqqaD","b29RJoVQp6","uAWypFNYIM","9GXkXStlDJ","JIqXiFLsph","3otm6DG4sT","VLTy6v8yFN",
+"NAFuwuQIcz","EoToPWaWsv","fLNg8D6rBy","LbRTHOz8yZ","BbwgAlViBv","d85a9lpF6W","Pb1palsQGo","4W0Tlt59lR","VLTy60Wr5y","KASQ8DcpWB",
+"aL6AJeuZA5","0BmCyaFFss","5nmWvMojnP","y94nw0ao3l","M3zXL3weIF","jfREucShY2","Zv7z0BbwgA","JKWYRulk41","W7cTsuJScX","hi5X70ao3l",
+"tl72WQWxoT","ThjNnoGu6x","5IhmGi3pyd","pmeCdVprf2","t59lRuTacx","zY1GYqQxHP","l83UdZv7z0","WDVWJIKxdL","cQOnv9rlg9","OUqFMm4bxU",
+"4dEz66AFT0","HRxd85Namm","h1zcH55rfB","fmIK1fcJOy","jS1aj5Namm","KZamHv2eC3","iqv4kb29RJ","CNHmvBGaQY","SbRYySWfou","zbIYYD6rBy",
+"0KyfsW3VFH","K20wKMGlTF","JKWYR64s8N","DQimpwDajX","qUJMdgIYvE","Ul4a1IRh48","lH1ktFFDui","aL6AJdpe1v","M3zXLUlU3M","tAOsruupzk",
+"9iGoTaFFss","HzZT8lH1kt","KASQ8lViBv","5IhmGJkzUn","s93Ml2ZHdk","1v5hH9y4lw","EoToPfmIK1","16lHcRACuj","cShY2nFqik","Rxrsm1j5L8",
+"i7WMQ6q6L9","djsrvWaWsv","M3zXL8cVD3","RmDcrlsQGo","IjTwPlm0pD","zHF1qs7Mxk","sqVrfTCgPp","0Wr5yAgJHQ","KASQ8ix74r","ydG8U618Di",
+"CIShGa00b5","FNYIMmX2GE","m4bxUIBe8k","Gv3FqFhtgl","HfyNQyEfy9","J2mQi580YD","tvdkDpWiOs","NOHszzFgtB","ni2v1BbwgA","Pb1paO3iyQ",
+"n8pJ9FwEJz","OxWIHUlU3M","PYBf4ZzJHW","ni2v1JKWYR","MezSW5ZaEz","1v5hHtuDyS","StlDJyToGW","uN6r3jtn0X","Q6LixqUJMd","zqH0WCfgr3",
+"t59lRlj07Q","Q6hMC8xEKz","dhSuHhUTw7","nnP8ojeskS","t98iWEoToP","O3iyQpT8wu","pAhR1gIYvE","64s8NPOUYS","JXljWCfgr3","In3NSguMb8",
+"suY4xWMiS3","MGlTF6q6L9","hi5X7uvf7A","Yw2oUWPmlx","Z4I1vCdyBV","0MR5XNAFuw","KASQ8yvOMI","KZamH4W0Tl","16lHcuupzk","FGzgpLewvM",
+"pWiOshe9IA","dhSuHx3LDe","U3yw5rKDLJ","pmeCdMGlTF","Oz8yZLbRTH","Ta8f68hJdt","MGlTFYf2Ec","uTacxQbxXc","faHir9rlg9","brhlQPYBf4",
+"9rlg9soy9t","zFgtBjtn0X","FhtglWaim6","JKWYRVIlwP","tvdkD3weIF","wiHrZ5VZjS","dhSuHjS1aj","lH1ktlpF6W","Chuy3BpYhV","soy9tpAhR1",
+"9XyT9MmsIo","kB5nPOHaBz","VjCZqZ4I1v","uupzkAgJHQ","jtn0X9eoRc","rKDLJpFrrl","Ss0ZuP6bcg","RBhp0NAFuw","hUTw7FGzgp","0BmCylweGy",
+"i3pydgIYvE","PYBf4xReec","IjTwPmX2GE","wiHrZAIYUu","x3LDeSWfou","v8yFNFcWrW","Chuy3blLA9","TXQ0ZNxx9V","BCxeCHP433","Mm8si07n1c",
+"IBe8kfmIK1","CxVEfzmLYD","Q6Lixs93Ml","ydG8UcL0aE","AgJHQOUqFM","CNHmvkZANm","7fsYMt98iW","QnJ1SgdQsS","lj07QZuDtD","JKWYRv1Hln",
+"uQIczP6bcg","yofH3blLA9","TwanozqH0W","ciuWzAXpwE","oGu6x3weIF","AXpwErz7Ut","RpBQmjiVBP","9eoRctl72W","sx5GlYOfrY","suY4xsqVrf",
+"oQ87rJ2mQi","Ss0ZuM6qcG","5IhmGQClRL","prNT6hi5X7","JXljWFjHXR","Mm8sijSjS3","I7p2atvdkD","pWiOsyofH3","blLA90PktI","RzaZADLhzM",
+"JJs5mzmLYD","BFkb8CK5W7","DcpWBFjHXR","jeskSqQxHP","xXTI4CdyBV","NAFuwtjQxs","yvOMITwano","OUqFMeuZA5","618DibrhlQ","QChxsQbxXc",
+"kZANmYjB9t","CdyBVgtCA5","CqqaD5Namm","jiVBPZ4I1v","5VZjS9iGoT","OUqFMpvgjS","YjB9tnlaBy","aFFssjS1aj","ZuDtDrKDLJ","QChxsSs0Zu",
+"WaWsvD6rBy","VNCPdt59lR","ThjNnJIqXi","RACujv2eC3","NhXdurKDLJ","yToGWl83Ud","yToGWWDVWJ","3weIF1j5L8","zz4ZU7X3uy","IRh48taOXK",
+"Z4I1v8TxD7","Yf2EcCK5W7","0h1b1ciuWz","EoToPReKEW","5VZjSQChxs","WPmlx8cVD3","45cIH8cVD3","OUYuF0PktI","tAOsrYw2oU","8RCUAnnP8o",
+"7hyVvjtn0X","pFrrlBFkb8","5Drn0bgJAz","Ta8f6pvgjS","U3yw50Wr5y","Z4I1vo8Uyd","8hJdtzFgtB","8hJdtTwano","xciqpChuy3","FxX9q9eoRc",
+"S77LH8FmFH","fmIK1lkMUA","3otm6uvf7A","yluBxuupzk","LDk6fmX2GE","lsQGoWPmlx","K4GS8lweGy","AXpwEpmeCd","uLtKsMmsIo","tuDySQbxXc",
+"CIShG3otm6","QworupmeCd","5IhmG0ao3l","d7vjM5drc6","fqypyOUYuF","ZuDtDbgJAz","Waim6cQOnv","QChxsRBhp0","RpBQmqQxHP","WaWsvfcJOy",
+"UlU3MKsjRK","euZA5FjHXR","8RCUAO3iyQ","1LB1LuZPqg","s93Ml7hyVv","LDk6fHlUbF","pmeCdMaJQs","JIqXieuZA5","CNHmvSs0Zu","qUJMdYf2Ec",
+"RsQUqO3iyQ","pFrrlcShY2","okgRifcwDa","ulk41BpYhV","lpF6Wi7WMQ","lm0pDuN6r3","nlaByKZamH","5NammKZamH","I7p2auQIcz","lpF6WjSjS3",
+"2NslmMojnP","bgJAzZhwG1","yvOMIThjNn","FcWrWv1Hln","XflUqv8yFN","Waim6M3zXL","aL6AJFhtgl","2TRI7VjCZq","cmXIXVNCPd","BpYhVv8yFN",
+"rhl0Ji7WMQ","HzZT8JRJQB","FPfSECK5W7","PYBf4WaWsv","b29RJCdyBV","brhlQM6qcG","DcpWBGSQwj","s7Mxk3weIF","FVMxoJ2mQi","mX2GESjskQ",
+"pmeCd8U2nU","uLtKsiKqhr","Q6hMC7lUXZ","Nxx9V5nmWv","Yh1hFru4UG","a00b5oGu6x","DcpWBDG4sT","7hyVvYw2oU","FcWrWJkzUn","hSSvQ2Nslm",
+"JJs5mK4GS8","ydG8UlH1kt","tAOsrCK5W7","W3VFHuQIcz","rz7UtnnP8o","16lHcMGlTF","ECMvUJIqXi","2hEEUlViBv","hYBCKRBhp0","prNT607n1c",
+"Z4I1vTXQ0Z","dmoS7FVMxo","soy9tdmoS7","SWfouAmdQd","1j5L8FVMxo","uTacxguMb8","Mkgy8AmdQd","K4GS80ao3l","WDVWJxReec","4W0TlYf2Ec",
+"gdQsSs4786","hE1QlqaofN","jeskSNOHsz","vOqCEXyPZN","TCgPpAIYUu","QClRLh1zcH","uAWypO3iyQ","WmadAQChxs","GWqqXoGu6x","lsQGo7fKYU",
+"MojnPcmXIX","TXQ0Zi7WMQ","4dEz6LbRTH","ThjNnZuDtD","NOHszTXQ0Z","lsQGoVLTy6","IRh48IRh48","MK07YaFFss","azIWpJIqXi","DcpWB3otm6",
+"Chuy3qaofN","i7WMQ580YD","atef2X6Pin","soy9tC2Irc","7ku1pAOgEe","gtCA5Q6Lix","W3VFH4W0Tl","1LB1LRmDcr","v1HlnjeskS","1LB1LgtCA5",
+"taOXKxXTI4","y94nwDLhzM","7hyVvPOUYS","ZzJHWjSjS3","hUTw7VerEA","HP433ZhwG1","WDVWJ8TxD7","Cp3mZ29QAz","uN6r3v2eC3","zQt6QFVMxo",
+"OHaBzZv7z0","WmadANxx9V","S2DfuI7p2a","QbxXc7fKYU","uLtKs5Mg9r","XflUqd85a9","Cp3mZCdyBV","DLhzM2TRI7","Gv3FqWreyP","he9IAv2eC3",
+"xXTI4cQOnv","aDGtSP6bcg","VIlwP7X3uy","EOE1oVprf2","Y1mC0k85Ae","5IhmGuJScX","gjUTuNAFuw","Oz8yZVerEA","7ku1pHlUbF","fLNg8CIShG",
+"ciuWzBFkb8","guMb8yvOMI","DcpWBQbxXc","lj07QW7cTs","GWqqXx3LDe","uLtKsPOUYS","Uvlv4YjB9t","Q6Lix580YD","NAFuwcShY2","pFrrl5Mg9r",
+"BGaQYWMiS3","pWiOsJRJQB","Zv7z0580YD","XflUqVIlwP","MojnP9GXkX","b29RJJ2mQi","zmLYDQssNC","cL0aED6rBy","QWxoTDG4sT","LewvMfcJOy",
+"M3zXLFcWrW","OUqFM6AFT0","FwEJzd7vjM","5iGN5he9IA","wDajXjS1aj","6AFT0d7vjM","SbRYy3weIF","8cVD3ZUnqt","C2IrcRpBQm","2TRI7GWqqX",
+"pvgjSLDk6f","nnP8otAOsr","CNHmvIn3NS","s7MxkyEfy9","d85a96AFT0","5nmWvaDGtS","QYxC0x3LDe","VBjhzlm0pD","RkQkeU3yw5","prNT6lH1kt",
+"MK07YFxX9q","07n1caFFss","O3iyQB3qem","dpe1vSs0Zu","iKqhri7WMQ","0ao3lTCgPp","K4GS8TCgPp","UmaEvgIYvE","O3iyQ7Ow5C","vkCHHDQimp",
+"ru4UGEoToP","blLA9Yf2Ec","pAhR1WaWsv","0h1b1kZANm","XyPZNgf8rI","QworufcwDa","7X3uyXflUq","hE1QlMezSW","0MR5XqaofN","lCMxyydG8U",
+"vkCHHm4bxU","lkMUAQ6Lix","D6rByi3pyd","1v5hHEoToP","GSQwjpiJSk","YjB9txciqp","nFqikYh1hF","Ta8f6cL0aE","HfyNQaDGtS","HRxd85ZaEz",
+"Vprf2i3pyd","tvdkDVIlwP","Cp3mZuTacx","LDk6fRsQUq","OxWIHhi5X7","hYBCKtvdkD","ogLgcYjB9t","lViBvlweGy","JIqXizHF1q","lViBvlViBv",
+"RmDcrSmGzv","jtn0XJKWYR","OUYuFAIYUu","FNYIMHzZT8","SjskQSs0Zu","ciuWzjtn0X","fLNg8sx5Gl","J2mQi9iGoT","FwEJzpWiOs","zmLYD0YAGH",
+"lsQGo5Namm","MezSWReKEW","ZhwG1TCgPp","ni2v114FLR","gf8rIs7Mxk","3weIFFVMxo","KZamHatef2","gjUTuOz8yZ","5ZaEzrhl0J","okgRisqVrf",
+"o8UydX6Pin","atef2W7cTs","Cp3mZRkQke","XflUqSWfou","5NammU3yw5","HfyNQWaim6","iqv4koVQp6","07n1crhl0J","pv0i7QWxoT","ZzJHWAIYUu",
+"hE1QlGXdoH","gjUTuUl4a1","MmsIoM6qcG","POUYSnnP8o","h1zcHzqH0W","t98iWEOE1o","QYxC0s4786","GSQwjoQ87r","yvOMIWPmlx","uQIczpWiOs",
+"RmDcr4QMc9","zbIYYciuWz","suY4xVIlwP","HfyNQOHaBz","In3NSoGu6x","0ao3lfaHir","MojnPuvf7A","JXljWMmKGJ","pvgjSNo0Qb","EoToP8FmFH",
+"UmaEva00b5","CK5W7a00b5","2NslmFVMxo","S2DfuLewvM","48cHLk85Ae","SmGzviwzGk","7ku1pZJTXH","jiVBPTXQ0Z","L7cGcRpBQm","CqqaDe6e4z",
+"Vprf2DLhzM","v8yFN2DREs","tlILtFPfSE","uoStwThjNn","uupzkjiVBP","i3pydDcpWB","0MR5XG1RhS","lpF6WogLgc","OUqFMJRJQB","gIYvE8FmFH",
+"qaofNHP433","GSQwj7fsYM","ksJby9iGoT","lm0pDPOUYS","HlUbFQnJ1S","brhlQJkzUn","GSQwjTa8f6","uJScXCqqaD","07n1cJKWYR","ciuWzPb1pa",
+"5VZjSuPX7G","5ZaEzMmsIo","BbwgALbRTH","gjUTuTXQ0Z","xXTI4QChxs","7X3uytjQxs","aDGtSKsjRK","C2Irc7lUXZ","580YDVNCPd","Yw2oU5nmWv",
+"RsQUq580YD","VjCZqiKqhr","sqVrfwDajX","580YDlsQGo","1j5L8ulk41","IBe8kP6bcg","oQ87rt59lR","SjskQni2v1","7fKYUOxWIH","7X3uyNcICA",
+"euZA59iGoT","AOgEefaHir","LDk6fCqqaD","QWxoTzmLYD","n1pmOgjUTu","tl72WEoToP","FNYIMFGzgp","yvOMIgdQsS","RmDcr1LB1L","ni2v15drc6",
+"prNT648cHL","SmGzv1v5hH","jS1aj2DREs","S77LHpvgjS","RpBQmReKEW","v8yFNlweGy","gjUTuQbxXc","Uvlv4VLTy6","P6bcgpiJSk","v8yFNuvf7A",
+"uZPqgS77LH","ReKEWtl72W","hE1QlRBhp0","lCMxylH1kt","uAWypHRxd8","Zv7z0b29RJ","nFqiktvdkD","5Mg9rKASQ8","Yf2EcQClRL","No0QbVBjhz",
+"GWqqXrKDLJ","nnP8oIBe8k","Ss0Zu5iGN5","l83UdRxrsm","2DREs9y4lw","KsjRKDz1R3","uLtKsqaofN","yofH3d85a9","RzaZA0h1b1","x3LDeW7cTs",
+"14FLR0h1b1","BCxeCHRxd8","lXFOBuN6r3","piJSkFPfSE","MaJQslpF6W","ni2v1TCgPp","RpBQmDG4sT","WmadA0h1b1","QbxXc5drc6","Y1mC0POUYS",
+"StlDJ3weIF","ThjNncmXIX","5ZaEzyluBx","vOqCEIn3NS","h1zcHiKqhr","Gv3FqAgJHQ","s47860ao3l","hE1Ql6q6L9","LewvMru4UG","uupzklm0pD",
+"tlILtgjUTu","G1RhSM6qcG","FFDuijzUqR","8hJdtuQIcz","PYBf4SjskQ","aez9yprNT6","dmoS7GSQwj","JIqXirz7Ut","lweGy5iGN5","CqqaDv8yFN",
+"cShY2Q6Lix","Yw2oUZhwG1","jSjS3VNCPd","pAhR1jSjS3","C2Irc9XyT9","ThjNnDLhzM","QWxoTAIYUu","sqVrfdmoS7","64s8NSjskQ","e6e4ztvdkD",
+"fLNg8OUYuF","dmoS78xEKz","MaJQsuoStw","Fhtgl9iGoT","y94nwuJScX","WaWsvDG4sT","jzUqRMm8si","NcICAJXljW","CxVEf2Nslm","qUJMd2DREs",
+"Zv7z0NhXdu","wDajXuoStw","hE1QlSWfou","i7WMQdjsrv","QYxC0e6e4z","VIlwPRzaZA","FPfSEazIWp","MojnP3otm6","iB08lXyPZN","Gv3FqQworu",
+"kB5nPVBjhz","MK07YGv3Fq","sqVrfQ6hMC","cShY2n1pmO","4QMc9qUJMd","tuDySB3qem","BpYhVJIqXi","Mkgy845cIH","uJScX0BmCy","suY4xk85Ae",
+"iKqhrpT8wu","WmadArKDLJ","X6PinStlDJ","0PktImX2GE","jfREu8TxD7","wiHrZ4QMc9","VerEAatef2","I7p2auZPqg","jS1ajtjQxs","DLhzMn1pmO",
+"RACujECMvU","HfyNQFLsph","bgJAzDcpWB","m4bxU8U2nU","HfyNQK4GS8","Mkgy848cHL","9eoRc9iGoT","l83UdDz1R3","aFFssx3LDe","9GXkXyluBx",
+"BpYhVaFFss","FjHXRvkCHH","lweGykZANm","Ul4a17lUXZ","Ta8f6Yf2Ec","xciqppmeCd","Waim6cL0aE","xciqppWiOs","4QMc9cL0aE","iKqhrlpF6W",
+"ECMvUOHaBz","BbwgAL7cGc","ZzJHWblLA9","euZA5XyPZN","FLsphJKWYR","8FmFHQssNC","fLNg8Mm8si","WMiS3h1zcH","5Mg9rW3VFH","WPmlx6q6L9",
+"MGlTFXyPZN","blLA9VBjhz","ZJTXHuPX7G","TwanoX6Pin","8TxD7ECMvU","prNT6cQOnv","blLA9XflUq","M3zXLn1pmO","B3qemQYxC0","t59lR1j5L8",
+"Uvlv40YAGH","uoStwiB08l","ksJbyv2eC3","4QMc95nmWv","x3LDeRkQke","2TRI7BGaQY","LewvM9XyT9","1LB1LMkgy8","oGu6x0BmCy","QnJ1SqQxHP",
+"64s8NNAFuw","nFqik7lUXZ","KZamHxReec","45cIHdhSuH","tjQxsoQ87r","JIqXioGu6x","kZANm7Ow5C","StlDJKZamH","uQIczCfgr3","FxX9qF6PT2",
+"M3zXLRmDcr","hE1QlX6Pin","POUYSQChxs","C2IrcLbRTH","CqqaDAIYUu","wiHrZNcICA","VjCZqZJTXH","hSSvQlsQGo","pvgjSzFgtB","5Namm1j5L8",
+"QssNCo8Uyd","ZuDtDuPX7G","Cp3mZ0PktI","EoToPxReec","9GXkXd85a9","blLA95iGN5","5nmWv7X3uy","hUTw72hEEU","vkCHHQYxC0","8hJdtiKqhr",
+"MmsIoix74r","LDk6fTCgPp","bZLvSzz4ZU","CIShGVLTy6","Ta8f6OxWIH","F6PT2vLsmS","he9IAD6rBy","0PktIyEfy9","BpYhVnFqik","suY4xM6qcG",
+"IRh48lXFOB","yEfy99iGoT","fqypyv8yFN","AXpwE5nmWv","d85a9RsQUq","lm0pD0YAGH","AmdQdfLNg8","ru4UG24ARF","uLtKspT8wu","45cIHcShY2",
+"HRxd8NOHsz","0PktIfmIK1","J2mQi7fsYM","VIlwPvkCHH","b29RJdhSuH","64s8Nn1pmO","qUJMdhYBCK","v1HlnvOqCE","TXQ0ZMK07Y","24ARFzY1GY",
+"yToGWJKWYR","BFkb8prNT6","jiVBPrz7Ut","lpF6WMGlTF","HzZT8tlILt","s93MlD6rBy","ulk41OUqFM","s47869rlg9","K20wKkB5nP","5Drn0VNCPd",
+"1j5L8v1Hln","i7WMQ07n1c","QYxC0Yw2oU","0KyfsMGlTF","I7p2a0ao3l","i3pydbrhlQ","wDajXECMvU","n1pmOJKWYR","VIlwPQClRL","FVMxoFxX9q",
+"zY1GYGSQwj","RkQke2Yz7E","X6PinzmLYD","U3yw59rlg9","VNCPdKZamH","3weIFNxx9V","uAWyp16lHc","5NammBbwgA","taOXKMaJQs","64s8Nsx5Gl",
+"pAhR1ECMvU","n1pmO4W0Tl","M6qcGmz8gx","ECMvUlkMUA","ogLgciwzGk","5Drn0WreyP","lkMUAydG8U","pFrrlVIlwP","ru4UG5VZjS","JXljW1LB1L",
+"Chuy3OUYuF","2TRI7Twano","L7cGcpiJSk","AgJHQlXFOB","JXljW2hEEU","MmKGJuZPqg","lj07Qdpe1v","ZJTXHTa8f6","wDajXMaJQs","xReec0BmCy",
+"rKDLJWmadA","3weIFK4GS8","QWxoTx3LDe","m4bxUzHF1q","uTacx2hEEU","zY1GYciuWz","5ZaEz9rlg9","RACujk85Ae","MmKGJ7hyVv","RmDcrtvdkD",
+"tAOsrHlUbF","9iGoT3otm6","yToGWuPX7G","tAOsrDLhzM","Zv7z0bZLvS","d85a9yEfy9","JkzUnciuWz","mX2GE1v5hH","7lUXZ8TxD7","uoStwLbRTH",
+"AmdQd7lUXZ","dmoS7yvOMI","dmoS7OHaBz","uLtKsaFFss","t59lRS77LH","xReecogLgc","he9IAChuy3","fmIK1tlILt","tuDySZ4I1v","2DREsuoStw",
+"AIYUuHzZT8","fLNg8iB08l","CNHmvQnJ1S","0h1b1a00b5","XflUq3otm6","QbxXcSjskQ","1LB1Ly94nw","atef2QWxoT","jtn0X5IhmG","EdBKcTXQ0Z",
+"gIYvELDk6f","DG4sTVLTy6","GWqqXiqv4k","s7Mxks93Ml","pWiOsydG8U","atef2euZA5","sqVrf9rlg9","ulk41yToGW","2Yz7E0Kyfs","14FLRLewvM",
+"8FmFHsoy9t","5Drn0GWqqX","MK07Yn1pmO","djsrvazIWp","ksJbyMezSW","zbIYYpT8wu","vOqCEaDGtS","K20wKHP433","VerEATXQ0Z","qaofNHlUbF",
+"0PktIFVMxo","3otm61j5L8","CIShGAOgEe","VIlwPv1Hln","bZLvSyofH3","CqqaDksJby","zqH0WiKqhr","7fsYMSbRYy","qaofNAmdQd","n8pJ9zbIYY",
+"yToGWs7Mxk","v2eC307n1c","JJs5maL6AJ","2ZHdkwDajX","ZUnqtt59lR","lj07Q0PktI","Q6LixjS1aj","lCMxyUvlv4","jSjS3UmaEv","9GXkXy94nw",
+"BCxeCZUnqt","7lUXZrz7Ut","fcwDauoStw","Kr8ysTCgPp","sqVrfpT8wu","NAFuwNAFuw","ZzJHW0PktI","48cHLnnP8o","xReecsuY4x","lj07QRpBQm",
+"atef2ZUnqt","jzUqRHP433","x3LDebgJAz","RmDcr64s8N","No0QbRzaZA","ksJbyX6Pin","vLsmS2hEEU","Uvlv4gjUTu","iB08lLbRTH","gtCA5KZamH",
+"d85a9vOqCE","sx5GlvkCHH","OxWIHtAOsr","rhl0J7fKYU","WMiS3Cfgr3","M6qcGuoStw","S2Dfu7fsYM","CxVEfi3pyd","zY1GYGv3Fq","POUYSFxX9q",
+"SbRYys7Mxk","7fKYU3otm6","uZPqgksJby","Ta8f6b29RJ","2Yz7ETwano","8U2nUtaOXK","qaofNs4786","FFDuizqH0W","TXQ0Ze6e4z","JRJQBuJScX",
+"PYBf4faHir","Uvlv4vLsmS","suY4xIRh48","JJs5mcQOnv","RBhp0he9IA","oVQp69XyT9","piJSkB3qem","ThjNnbrhlQ","kB5nPsuY4x","nlaByRsQUq",
+"14FLRt98iW","0YAGH4dEz6","LbRTHD6rBy","D6rByVBjhz","tjQxsfmIK1","gtCA5W7cTs","W7cTsLewvM","sqVrfzFgtB","fLNg8faHir","sx5Gls93Ml",
+"yluBxvOqCE","s93MlF6PT2","RkQke3weIF","gIYvEtuDyS","AkKTklm0pD","VLTy6uPX7G","FjHXRgdQsS","24ARFzQt6Q","W7cTs8U2nU","3weIFsoy9t",
+"HzZT8tuDyS","AkKTk580YD","ydG8UuLtKs","F6PT2Fhtgl","MGlTFY1mC0","dpe1vlH1kt","Cp3mZiqv4k","okgRiOHaBz","0PktIUl4a1","SbRYyUvlv4",
+"7lUXZrhl0J","0KyfsyluBx","8xEKz5ZaEz","7fKYUVprf2","YjB9tzFgtB","Mm8sik85Ae","VIlwPM6qcG","oVQp6Nxx9V","NOHszZJTXH","0PktIJ2mQi",
+"n8pJ9Mkgy8","Q6hMCprNT6","h1zcHk85Ae","M6qcGL7cGc","uZPqguQIcz","LewvMciuWz","v2eC3S77LH","0ao3lOHaBz","uPX7GWDVWJ","K4GS8uQIcz",
+"aL6AJFnPFB","NOHszKr8ys","dmoS7CqqaD","Mkgy8Zv7z0","s4786o8Uyd","Q6hMC7X3uy","uvf7ABCxeC","8RCUAtAOsr","RmDcriKqhr","lpF6WgIYvE",
+"8hJdttaOXK","QYxC0618Di","CxVEfgtCA5","atef2uPX7G","ThjNnksJby","7lUXZJ2mQi","DLhzMi3pyd","L7cGcDz1R3","uLtKsm4bxU","FFDuilCMxy",
+"s7Mxk9XyT9","ThjNnRsQUq","HzZT87fKYU","JRJQB5Namm","Z4I1vG1RhS","yToGW580YD","07n1cLbRTH","8xEKz0Wr5y","kB5nP5drc6","0h1b1uZPqg",
+"SmGzvLDk6f","ru4UGtaOXK","uJScX24ARF","b29RJyToGW","M6qcGo8Uyd","AOgEeWaim6","uLtKs55rfB","uJScXiwzGk","hSSvQh1zcH","M6qcGulk41",
+"bZLvSQChxs","jiVBPQYxC0","xReec0Kyfs","suY4xNcICA","JIqXiMmKGJ","OHaBz1j5L8","8TxD75drc6","k85AeRxrsm","7ku1pTCgPp","yToGWBGaQY",
+"QChxslViBv","aL6AJ4dEz6","HP433Qworu","ThjNnjSjS3","CdyBVpv0i7","xReecFxX9q","AgJHQ7fsYM","KASQ8FPfSE","RkQked7vjM","MaJQsfFDrJ",
+"soy9tMmKGJ","jtn0XDLhzM","QssNCUmaEv","tjQxsa00b5","rKDLJfaHir","FwEJzjfREu","I7p2afaHir","JXljWzbIYY","I7p2a8FmFH","POUYSOUqFM",
+"MmsIoBbwgA","oGu6xHzZT8","MGlTFxReec","WMiS3AXpwE","piJSksqVrf","7fsYMqUJMd","2ZHdkVLTy6","pFrrljS1aj","mz8gxlweGy","QnJ1Srz7Ut",
+"UmaEvVprf2","OxWIHSWfou","5drc60ao3l","JJs5m3weIF","pT8wujfREu","qaofNuupzk","hi5X77fsYM","8xEKztjQxs","guMb8Y1mC0","zFgtB0BmCy",
+"pFrrli7WMQ","yluBxcQOnv","hi5X7CdyBV","5ZaEzoVQp6","2Yz7Emz8gx","P6bcgiB08l","FcWrWHzZT8","SWfouulk41","aDGtSM6qcG","faHir7X3uy",
+"Dz1R314FLR","2ZHdkjSjS3","Nxx9VMK07Y","UlU3MNxx9V","qUJMdHRxd8","QChxsIn3NS","FVMxo7X3uy","OUqFMb29RJ","EoToP5drc6","CdyBVRzaZA",
+"4W0TlyvOMI","jSjS3OHaBz","C2IrcCp3mZ","n8pJ9yToGW","aFFssThjNn","dhSuH4dEz6","Ss0Zuhe9IA","pWiOsY1mC0","In3NS5nmWv","DcpWBzQt6Q",
+"ulk41Fhtgl","ZhwG1BGaQY","MK07YWDVWJ","blLA9QYxC0","uoStw29QAz","7ku1pFVMxo","Kr8yscQOnv","4dEz6MojnP","48cHL2Yz7E","nnP8ogf8rI",
+"0PktIFjHXR","FnPFB4dEz6","faHirZhwG1","JKWYR2TRI7","GWqqXJKWYR","yvOMItAOsr","AIYUuMmsIo","bZLvS7fKYU","0KyfsVprf2","lCMxyi7WMQ",
+"dQ586pFrrl","dpe1vQYxC0","CqqaDYf2Ec","2Yz7EECMvU","MojnPk85Ae","RzaZA14FLR","7hyVvBbwgA","Ta8f6ogLgc","pv0i7P6bcg","dpe1va00b5",
+"EdBKcuZPqg","8xEKzBFkb8","D6rByzbIYY","FhtglOUqFM","KsjRKuTacx","JkzUnsqVrf","Yw2oUm4bxU","ksJbyqaofN","vkCHHlpF6W","JkzUnxXTI4",
+"t98iWK20wK","VIlwP5ZaEz","5ZaEzgf8rI","nlaByuZPqg","uTacxuupzk","EoToPYOfrY","CqqaDJXljW","a00b59rlg9","y94nwgf8rI","v8yFNSjskQ",
+"1LB1LKr8ys","WDVWJFnPFB","AOgEepT8wu","RACujoVQp6","0ao3l8FmFH","5Mg9ruoStw","lViBvQ6Lix","mz8gxMmsIo","uLtKsFnPFB","IKxdLL7cGc",
+"lm0pDRxrsm","7fKYUPb1pa","uLtKsni2v1","jeskSlH1kt","Y1mC0WmadA","piJSki3pyd","zmLYD5drc6","RsQUqeuZA5","AOgEeKr8ys","WaWsvQYxC0",
+"XflUqy94nw","fLNg8zmLYD","Zv7z0he9IA","8TxD7WaWsv","Q6hMCuZPqg","aFFssiKqhr","8FmFHW7cTs","9XyT9fcJOy","Rxrsml83Ud","PYBf44QMc9",
+"24ARFlpF6W","Cp3mZjS1aj","6AFT0HP433","uZPqgNo0Qb","9GXkXRsQUq","fcwDaVLTy6","cL0aENOHsz","GrDg74W0Tl","QClRL07n1c","TCgPpQworu",
+"MK07YDz1R3","vkCHHlj07Q","aez9ygjUTu","Uvlv4faHir","suY4x5ZaEz","nlaByi3pyd","Cfgr3Zv7z0","oVQp6Oz8yZ","6AFT0EoToP","7Ow5CZuDtD",
+"rKDLJS77LH","CqqaDoGu6x","RpBQmyToGW","K20wK5iGN5","iKqhr2hEEU","azIWpprNT6","hUTw7KZamH","0BmCy7X3uy","k85Ae1LB1L","ni2v1QChxs",
+"8xEKzxXTI4","WmadAlViBv","9rlg9tAOsr","WMiS3uLtKs","16lHcaez9y","zFgtBRACuj","2NslmgjUTu","uZPqgiqv4k","IjTwPM6qcG","uoStwiqv4k",
+"s4786NhXdu","DcpWBfmIK1","HlUbFJXljW","M3zXLpT8wu","rhl0JprNT6","HzZT89y4lw","5Drn0ydG8U","lpF6WRpBQm","618DiFhtgl","zz4ZU2TRI7",
+"fcJOy48cHL","JKWYRCfgr3","QnJ1SUlU3M","FjHXR0PktI","StlDJcL0aE","CNHmvy94nw","NcICAlm0pD","In3NSlweGy","45cIHL7cGc","XflUqprNT6",
+"RkQketjQxs","gdQsSzY1GY","Q6hMCcShY2","BpYhVlpF6W","lkMUA618Di","v8yFNAgJHQ","yvOMI5IhmG","LbRTHRBhp0","nlaByStlDJ","yToGWuN6r3",
+"StlDJpmeCd","uZPqguZPqg","FFDuiMojnP","S2DfuiKqhr","Rxrsm7X3uy","jfREubZLvS","MojnPVprf2","wDajXHP433","Ss0ZuThjNn","kZANmCxVEf",
+"pT8wuRzaZA","ZuDtDhE1Ql","Z4I1v5IhmG","yToGWFNYIM","LewvMprNT6","64s8NrKDLJ","Cfgr3xciqp","hYBCK14FLR","6q6L9Uvlv4","CdyBVBFkb8",
+"IjTwP7X3uy","cL0aEuQIcz","S77LH48cHL","C2IrcazIWp","rKDLJYw2oU","uJScXZuDtD","EOE1oM6qcG","MojnP5VZjS","4W0TldmoS7","WMiS3CqqaD",
+"gdQsSRpBQm","9GXkXlm0pD","yvOMIxXTI4","5iGN5P6bcg","RpBQmY1mC0","FhtglFjHXR","5Drn0pAhR1","CK5W7lXFOB","VLTy6iwzGk","ZJTXHHP433",
+"9rlg9pv0i7","8RCUAJXljW","VIlwPOz8yZ","Cp3mZni2v1","5ZaEzm4bxU","nFqiks4786","2NslmQ6Lix","NhXduB3qem","yofH3zz4ZU","NAFuw45cIH",
+"CxVEfFnPFB","0YAGH29QAz","i3pydWPmlx","HlUbFlCMxy","64s8N3otm6","FGzgph1zcH","Z4I1vUl4a1","14FLRfmIK1","Dz1R329QAz","KASQ8WPmlx",
+"uZPqgdQ586","lm0pDP6bcg","MmKGJCK5W7","k85Ae8hJdt","W7cTsVjCZq","LewvMB3qem","lpF6WuN6r3","nnP8opmeCd","lpF6Wdjsrv","mX2GENo0Qb",
+"taOXK7hyVv","NAFuwVBjhz","Zv7z0WPmlx","qUJMdWaim6","y94nwLDk6f","VIlwPxReec","SjskQm4bxU","rhl0JhE1Ql","OUYuFZuDtD","Mkgy8JXljW",
+"16lHcrhl0J","DQimpgtCA5","IjTwPaL6AJ","Vprf2euZA5","zHF1qFhtgl","zHF1qQ6hMC","LbRTHpFrrl","FcWrWECMvU","lm0pDtaOXK","hE1Ql8RCUA",
+"iwzGkSmGzv","dhSuHlXFOB","I7p2aWPmlx","lkMUAO3iyQ","HP433tjQxs","fcwDacL0aE","kZANmlweGy","WDVWJ7fKYU","6q6L9lH1kt","kZANms93Ml",
+"IBe8kkZANm","EdBKctlILt","M3zXLC2Irc","n8pJ92hEEU","tl72Wulk41","zbIYYyvOMI","bgJAzBFkb8","Vprf2CK5W7","5VZjSEOE1o","5nmWv4W0Tl",
+"jSjS3i7WMQ","dQ586mz8gx","atef28TxD7","vLsmSaL6AJ","o8UydvLsmS","SbRYyDz1R3","uTacxWMiS3","ZzJHWMkgy8","LbRTHfqypy","yEfy9jiVBP",
+"jeskSPYBf4","5Mg9rlkMUA","uvf7A5Drn0","BGaQYFjHXR","iKqhrrKDLJ","jSjS3Gv3Fq","JIqXiHP433","WaWsv6q6L9","zFgtBuPX7G","HzZT8XflUq",
+"2DREsHlUbF","s93MljeskS","mz8gxkB5nP","Waim6HzZT8","7fKYUoVQp6","4QMc9S77LH","FcWrWW7cTs","3otm6BFkb8","NhXduaFFss","hYBCK9GXkX",
+"0BmCyMGlTF","OUqFMoGu6x","RBhp07ku1p","1LB1Latef2","nlaByS2Dfu","I7p2aXflUq","IjTwPv1Hln","okgRiWaWsv","0h1b1wiHrZ","ECMvUAIYUu",
+"POUYSDQimp","2TRI7Kr8ys","gdQsSk85Ae","pv0i7b29RJ","55rfBoQ87r","zY1GYReKEW","hi5X7GrDg7","KZamHMmsIo","oGu6xEOE1o","lViBvZuDtD",
+"h1zcH5Namm","7ku1pHzZT8","QWxoTguMb8","jSjS3uPX7G","Ss0ZuxXTI4","Yw2oUMm8si","wDajXeuZA5","tvdkDbZLvS","IjTwPpvgjS","i7WMQWDVWJ",
+"HzZT8HP433","qQxHPhE1Ql","5ZaEzReKEW","BFkb8RkQke","jtn0XBFkb8","b29RJyofH3","0BmCydmoS7","gf8rIIjTwP","bgJAzIKxdL","uZPqgS2Dfu",
+"6AFT0sqVrf","hE1QlRsQUq","dhSuHzHF1q","FjHXRBpYhV","oGu6xvLsmS","hSSvQdQ586","zY1GYK4GS8","Ss0Zuxciqp","FFDuiVprf2","uJScXs93Ml",
+"No0QbjfREu","8cVD3Pb1pa","oVQp6rhl0J","5Drn0AXpwE","AXpwElsQGo","FPfSEW7cTs","Kr8ysI7p2a","5nmWv7Ow5C","TCgPp5drc6","EoToPjtn0X",
+"zmLYDK4GS8","3weIFKsjRK","Ss0ZuguMb8","pmeCdRBhp0","AmdQdHRxd8","VIlwPzY1GY","FwEJzuLtKs","lpF6WS2Dfu","GWqqXKASQ8","prNT6FcWrW",
+"5iGN5d85a9","7hyVvQChxs","Cp3mZazIWp","uTacxCK5W7","Cfgr3fLNg8","nFqik5IhmG","Uvlv4soy9t","dmoS7ReKEW","HlUbFoGu6x","9eoRcuJScX",
+"IRh48ksJby","QnJ1S5ZaEz","lViBv2hEEU","3otm6C2Irc","ZzJHW5IhmG","iqv4kl83Ud","KZamHECMvU","5drc6xciqp","lH1ktb29RJ","qaofND6rBy",
+"ZUnqtHlUbF","oVQp6gIYvE","O3iyQPb1pa","9iGoTKr8ys","sx5Gl0YAGH","CK5W7AkKTk","XyPZNDz1R3","SmGzv14FLR","jS1ajVLTy6","djsrvAXpwE",
+"Cp3mZAmdQd","KsjRKVerEA","zFgtBd85a9","uPX7GlkMUA","lXFOBtlILt","9GXkXrz7Ut","SjskQRmDcr","IRh480MR5X","DG4sTTa8f6","Pb1paa00b5",
+"SjskQZUnqt","CK5W7i3pyd","mz8gxP6bcg","VjCZqCK5W7","zz4ZUvkCHH","uPX7G8FmFH","nFqikWreyP","i7WMQ14FLR","7X3uygdQsS","lsQGo4dEz6",
+"vkCHHLbRTH","mX2GEdQ586","fcJOybZLvS","RpBQmuLtKs","OUqFMzQt6Q","GWqqX8TxD7","SbRYyxReec","x3LDeP6bcg","taOXKHfyNQ","SjskQFVMxo",
+"vkCHHgjUTu","LewvMOUqFM","MezSWStlDJ","BbwgAWmadA","iwzGk9rlg9","CNHmvpWiOs","nlaBy7ku1p","Cfgr3K20wK","Ul4a1ZuDtD","x3LDeuLtKs",
+"pWiOsjeskS","SWfouJIqXi","RsQUqiB08l","Gv3FqAXpwE","hYBCKQssNC","WMiS3wDajX","NhXdut98iW","0Wr5yzHF1q","YjB9to8Uyd","MaJQsIRh48",
+"W7cTsbZLvS","t98iWRsQUq","2DREsHRxd8","iKqhrulk41","okgRijeskS","OUqFMoQ87r","L7cGcYh1hF","9XyT9HP433","FPfSEGrDg7","YOfrYYw2oU",
+"POUYSZuDtD","o8UydtvdkD","FGzgpNhXdu","VjCZqksJby","s47868RCUA","ZhwG19eoRc","okgRiPOUYS","Q6hMCTXQ0Z","gtCA5tAOsr","1v5hHwiHrZ",
+"uoStwix74r","ksJbyjS1aj","gdQsSJRJQB","cShY207n1c","QChxsM3zXL","QnJ1S0Kyfs","e6e4zpvgjS","B3qemP6bcg","IKxdL5iGN5","K4GS8QWxoT",
+"jfREuFGzgp","B3qem1v5hH","kB5nPDcpWB","ydG8U0ao3l","AgJHQVerEA","o8Uyd7lUXZ","CK5W7ZJTXH","lkMUAMkgy8","FcWrWUvlv4","uvf7AGXdoH",
+"7ku1pXyPZN","SmGzvOz8yZ","3weIFiB08l","aDGtSMmKGJ","blLA9he9IA","lpF6W5drc6","QYxC0DLhzM","iwzGkyluBx","okgRihi5X7","NOHszDG4sT",
+"RxrsmWaim6","uN6r3NcICA","jeskSZ4I1v","JkzUnxReec","Vprf2SjskQ","suY4xCNHmv","EdBKcoGu6x","WDVWJyluBx","C2Irc1v5hH","4QMc9BFkb8",
+"RkQkeMGlTF","9XyT9ydG8U","v2eC3Ul4a1","AkKTk5Namm","AkKTkReKEW","t98iW7ku1p","ksJbylkMUA","JXljWiqv4k","uoStw7fKYU","AIYUuCfgr3",
+"45cIHJIqXi","cL0aEiqv4k","Z4I1vfmIK1","9GXkXFcWrW","TwanoHfyNQ","RACujG1RhS","RACujRxrsm","i7WMQjeskS","o8Uyd5Namm","Z4I1vMm8si",
+"atef2Cp3mZ","uJScXlXFOB","1j5L8IRh48","PYBf4Ul4a1","Waim6tvdkD","x3LDeRmDcr","djsrvAmdQd","yEfy96AFT0","KZamH3weIF","Uvlv4CIShG",
+"Yw2oUhUTw7","Z4I1vUvlv4","hYBCKRkQke","k85AezqH0W","M6qcGvLsmS","JRJQBJKWYR","xReecLDk6f","CdyBVZv7z0","hYBCK55rfB","8cVD3K20wK",
+"KsjRK3weIF","bZLvSoVQp6","HzZT8zz4ZU","OUqFMHfyNQ","8FmFHdjsrv","zQt6Q9y4lw","RBhp0EOE1o","0Wr5yy94nw","NcICA9GXkX","XyPZNReKEW",
+"rKDLJ5Namm","9y4lwFNYIM","Chuy3cL0aE","ZUnqtlkMUA","OUqFMxciqp","lH1ktAgJHQ","JJs5mFnPFB","lCMxynnP8o","0BmCyi7WMQ","iqv4khE1Ql",
+"OUqFM7fsYM","M3zXLS77LH","t59lRiqv4k","gtCA5cmXIX","Ta8f60MR5X","v1HlngjUTu","AgJHQKr8ys","7X3uy4dEz6","HlUbFCqqaD","MmsIoyofH3",
+"n8pJ98FmFH","PYBf4JKWYR","uvf7AQClRL","1v5hH0PktI","lj07QNo0Qb","HRxd8WmadA","MezSWpiJSk","RxrsmAXpwE","MaJQsoVQp6","oQ87ro8Uyd",
+"AmdQdFnPFB","fcwDapvgjS","DcpWBKsjRK","lweGyHzZT8","ZuDtDyofH3","ThjNnNhXdu","oQ87ryEfy9","ix74rciuWz","Waim64QMc9","StlDJuJScX",
+"Q6hMCoVQp6","8FmFHh1zcH","J2mQiaFFss","gf8rIMmKGJ","9eoRcQWxoT","5nmWv16lHc","LbRTHOHaBz","o8UydFLsph","d7vjMCK5W7","i7WMQix74r",
+"NhXduulk41","29QAzjfREu","pAhR1BCxeC","NAFuwfcwDa","rhl0J1LB1L","6AFT0zHF1q","kZANmXyPZN","580YDd7vjM","5ZaEzd85a9","Q6LixRmDcr",
+"v1Hln45cIH","cQOnvydG8U","TXQ0ZMojnP","guMb85IhmG","5drc6DcpWB","uN6r3LewvM","8U2nUokgRi","JJs5mgjUTu","HP433Nxx9V","lkMUAYjB9t",
+"ulk41uJScX","2DREsEdBKc","euZA5YjB9t","uZPqgkB5nP","HlUbFv1Hln","blLA9hi5X7","uoStwQbxXc","5nmWvRACuj","k85AeYh1hF","AOgEeHzZT8",
+"7lUXZa00b5","AgJHQOUYuF","yEfy90YAGH","kB5nPVjCZq","MmsIo8TxD7","Yh1hFVBjhz","Yw2oUQWxoT","lsQGo2DREs","TCgPpWreyP","i3pydJJs5m",
+"UmaEvGSQwj","Yf2Ec9eoRc","zQt6Qlm0pD","WreyPBbwgA","CqqaDY1mC0","ni2v12Yz7E","J2mQiDLhzM","fcwDa7ku1p","WmadAMmKGJ","QYxC07X3uy",
+"lsQGoZzJHW","uTacxtlILt","dhSuHZUnqt","9XyT97X3uy","zqH0WMm8si","pFrrlhe9IA","WmadApvgjS","ZzJHWaFFss","suY4xYh1hF","RsQUqi3pyd",
+"ECMvUdpe1v","cmXIX2TRI7","m4bxUsqVrf","5Nammv8yFN","Mm8sie6e4z","Yh1hFMkgy8","StlDJlXFOB","zqH0WSjskQ","JJs5mogLgc","MmsIoPb1pa",
+"zz4ZUrKDLJ","lj07QIn3NS","d7vjMiqv4k","fLNg86AFT0","Ul4a1cmXIX","2hEEUuupzk","FGzgpZJTXH","8cVD3dpe1v","4W0TluZPqg","atef27ku1p",
+"xciqpJkzUn","X6PinyToGW","Gv3FqazIWp","L7cGcLbRTH","IRh48iwzGk","JkzUnTXQ0Z","zqH0Wm4bxU","WPmlxCK5W7","HP433k85Ae","oQ87rpmeCd",
+"CK5W7lj07Q","0ao3lprNT6","iKqhrThjNn","0PktIK4GS8","IjTwPvkCHH","hYBCKtlILt","pvgjSGSQwj","AIYUuQworu","5ZaEztl72W","Ss0ZuUlU3M",
+"Pb1payToGW","pT8wutl72W","pFrrlpWiOs","3weIF7ku1p","No0QbkB5nP","Mm8sikB5nP","SbRYylweGy","vLsmSzz4ZU","QClRLWmadA","ni2v1P6bcg",
+"ECMvUhi5X7","dhSuHF6PT2","C2IrcW7cTs","k85Aelj07Q","RzaZA1LB1L","YjB9t16lHc","dpe1vtl72W","Yw2oURkQke","cQOnvwiHrZ","ZuDtDDLhzM",
+"ThjNn7fKYU","FjHXRRxrsm","0ao3lzY1GY","CK5W7VNCPd","CdyBVMK07Y","KZamH16lHc","zQt6Ql83Ud","DLhzMWDVWJ","zz4ZUS77LH","WreyPaL6AJ",
+"Q6hMCbrhlQ","jfREuQ6Lix","5nmWviKqhr","Ta8f6WmadA","D6rBy0YAGH","5Mg9rQYxC0","nlaByFjHXR","bZLvS5Mg9r","zY1GYpWiOs","s7MxkP6bcg",
+"StlDJ8U2nU","suY4xdhSuH","FcWrWzQt6Q","MmKGJ7fKYU","xReecuPX7G","guMb8uJScX","RzaZAt98iW","faHirVjCZq","BpYhVNAFuw","Yh1hFdhSuH",
+"HzZT8uPX7G","Q6LixXyPZN","h1zcH8TxD7","2TRI745cIH","ReKEWhi5X7","s47868cVD3","b29RJ5ZaEz","QYxC09eoRc","HlUbFZzJHW","ksJbylXFOB",
+"AXpwEfmIK1","hYBCKWreyP","atef27fKYU","hYBCKCfgr3","uoStw14FLR","qQxHPqUJMd","rhl0J0MR5X","7ku1pQworu","1j5L8dQ586","CIShGi7WMQ",
+"5IhmGd7vjM","lXFOBjtn0X","StlDJgIYvE","gIYvEzmLYD","HzZT8GWqqX","IKxdLF6PT2","jSjS30Wr5y","D6rByRpBQm","pAhR1aL6AJ","hYBCKb29RJ",
+"MmKGJJkzUn","WMiS3FjHXR","FVMxogdQsS","jSjS3IjTwP","HlUbF16lHc","AIYUuaL6AJ","taOXKHRxd8","580YDPOUYS","5Mg9rzz4ZU","D6rByW7cTs",
+"DLhzM24ARF","580YDtl72W","pv0i7EOE1o","0ao3lo8Uyd","ZUnqtogLgc","uZPqgJRJQB","bgJAzFVMxo","jS1ajAIYUu","fqypy3weIF","JJs5mY1mC0",
+"ix74rMezSW","JIqXie6e4z","WDVWJlViBv","fcwDaQssNC","GSQwjulk41","qaofNWMiS3","VBjhzZUnqt","Uvlv4Uvlv4","9XyT9Oz8yZ","24ARFIKxdL",
+"55rfBQnJ1S","zqH0WK4GS8","pT8wuprNT6","oQ87rl83Ud","tl72WSs0Zu","VerEAAgJHQ","zFgtBzY1GY","zmLYDyofH3","FcWrW0YAGH","3weIFK20wK",
+"HzZT8uZPqg","FxX9qVjCZq","0ao3lAXpwE","zQt6QFwEJz","kZANmUmaEv","FNYIMJ2mQi","sqVrfm4bxU","vkCHHTCgPp","s93MllViBv","vOqCEwiHrZ",
+"Waim6v2eC3","5Mg9rKr8ys","FcWrWksJby","jeskSzbIYY","uoStwJIqXi","7fsYM29QAz","euZA5RmDcr","LbRTH3weIF","nlaByhi5X7","TXQ0ZMkgy8",
+"Yh1hF8U2nU","JJs5mS77LH","U3yw5n8pJ9","HRxd8580YD","POUYSWaim6","FNYIMgjUTu","0PktIa00b5","TCgPp5VZjS","JRJQBeuZA5","v1HlnoQ87r",
+"EoToPoQ87r","aL6AJQChxs","0Kyfsv1Hln","RmDcrv8yFN","FcWrWqQxHP","aez9yIRh48","24ARFuZPqg","SbRYyVIlwP","QYxC0he9IA","W7cTsWmadA",
+"29QAzn1pmO","ksJbyFVMxo","JkzUnOUYuF","lH1ktjeskS","uQIcz1LB1L","fLNg8VjCZq","iKqhrOHaBz","zqH0W0PktI","3otm6U3yw5","7X3uylkMUA",
+"55rfBQClRL","7hyVvQ6hMC","dpe1vpT8wu","okgRiSWfou","vLsmSLewvM","tuDySFxX9q","prNT6ThjNn","VjCZqRmDcr","WDVWJuvf7A","LewvM1j5L8",
+"8cVD3Cp3mZ","5nmWv0YAGH","QClRLCp3mZ","WmadAUvlv4","aFFssjSjS3","IBe8kS2Dfu","x3LDeQ6hMC","FPfSE580YD","bZLvSAkKTk","kB5nPCdyBV",
+"lkMUAThjNn","5Namm7X3uy","14FLR5VZjS","hE1QlDQimp","FnPFBuTacx","Yh1hFWMiS3","vLsmSVprf2","5VZjSjeskS","AmdQdQChxs","CdyBVWPmlx",
+"qQxHPGSQwj","atef2bgJAz","5VZjSvkCHH","Vprf2dmoS7","Yh1hFOxWIH","IBe8k2DREs","s4786Qworu","CqqaDNo0Qb","Mkgy8zHF1q","yEfy9WDVWJ",
+"lpF6W29QAz","7Ow5CWMiS3","9iGoTtaOXK","48cHLMGlTF","wiHrZUmaEv","O3iyQuQIcz","Cp3mZaDGtS","tlILtQClRL","RxrsmWMiS3","S77LHRpBQm",
+"RkQkeTa8f6","lpF6WSs0Zu","StlDJCdyBV","EoToPFVMxo","1LB1L0ao3l","POUYSb29RJ","YOfrYDcpWB","k85Ae0Wr5y","AIYUuRkQke","euZA57fKYU",
+"0PktItjQxs","5nmWvIBe8k","Oz8yZSmGzv","8FmFHi7WMQ","QworuCK5W7","HlUbFyEfy9","9y4lwd7vjM","zQt6Q07n1c","s4786jzUqR","brhlQPOUYS",
+"CK5W7VBjhz","atef2xReec","ZzJHWKr8ys","zbIYYVIlwP","QWxoTZ4I1v","QChxsLbRTH","In3NSjS1aj","bgJAzv8yFN","QWxoTBFkb8","yToGWcQOnv",
+"VIlwPn1pmO","hSSvQBCxeC","iB08l0BmCy","Cp3mZMK07Y","RmDcrguMb8","jfREuLDk6f","tAOsrjeskS","Z4I1vWMiS3","M6qcG0Wr5y","9rlg9o8Uyd",
+"9XyT9AXpwE","soy9tRzaZA","FhtglD6rBy","CIShGFxX9q","SmGzvPYBf4","lkMUAcShY2","16lHcyEfy9","soy9tWDVWJ","Mkgy8a00b5","suY4x0PktI",
+"HfyNQm4bxU","DG4sToGu6x","cShY2tuDyS","XyPZNMmsIo","wiHrZ4W0Tl","bgJAzKASQ8","cQOnvNcICA","9iGoT9iGoT","2TRI78hJdt","618DiGSQwj",
+"RzaZAlweGy","qUJMdgdQsS","zY1GYgdQsS","AIYUuhE1Ql","kZANm5ZaEz","AIYUu8xEKz","uJScXx3LDe","ni2v1qUJMd","SmGzvjtn0X","ZJTXH5iGN5",
+"ix74rxciqp","55rfBFGzgp","9rlg9IBe8k","2NslmKZamH","KZamHVerEA","s7Mxk5Namm","BbwgAdQ586","IKxdLFcWrW","v1HlnMkgy8","K20wK2Yz7E",
+"gdQsSxReec","OUqFM7hyVv","wDajX55rfB","ulk418U2nU","ydG8UAIYUu","uPX7G29QAz","580YDjS1aj","7fKYUIRh48","Cp3mZgjUTu","AIYUuYf2Ec",
+"NAFuwMK07Y","gdQsSdhSuH","0PktIlkMUA","580YDh1zcH","Cfgr3EdBKc","7X3uyUvlv4","618DizqH0W","LDk6f5iGN5","C2Ircb29RJ","lkMUA2Nslm",
+"0ao3lQbxXc","EdBKcqaofN","d85a92ZHdk","prNT6dmoS7","FxX9qzY1GY","CqqaDa00b5","zbIYYCdyBV","ReKEWZuDtD","QChxs9rlg9","i7WMQnlaBy",
+"MmsIoZ4I1v","2NslmKr8ys","W7cTsru4UG","hYBCKCqqaD","pvgjS8FmFH","blLA9fFDrJ","JJs5m3otm6","VLTy60Kyfs","jS1ajcShY2","SbRYy16lHc",
+"jS1ajvkCHH","uAWypBGaQY","lpF6WJIqXi","Vprf2b29RJ","XyPZNBbwgA","2DREsFNYIM","1j5L8F6PT2","UmaEvCdyBV","C2IrcC2Irc","Y1mC0NOHsz",
+"uN6r3tjQxs","AgJHQYf2Ec","ZJTXHFPfSE","nlaByuN6r3","KsjRKgtCA5","Ss0ZuSmGzv","wiHrZB3qem","Yf2EcFjHXR","zz4ZU9iGoT","Y1mC0AkKTk",
+"bZLvSYOfrY","pFrrlqQxHP","NhXduzHF1q","dhSuH24ARF","Yf2EcI7p2a","Yw2oU6AFT0","RzaZARxrsm","ix74rQ6Lix","piJSks7Mxk","sx5Gle6e4z",
+"Nxx9VJ2mQi","MmsIohUTw7","VBjhzaez9y","QssNCxReec","l83UdWaWsv","k85AeZUnqt","i7WMQoGu6x","fmIK1jSjS3","Yf2EcCdyBV","hYBCKMezSW",
+"i7WMQdmoS7","5IhmGv8yFN","CNHmvStlDJ","580YDFNYIM","EdBKcMojnP","pvgjSaDGtS","SjskQdhSuH","HzZT87hyVv","prNT6lm0pD","U3yw5s7Mxk",
+"HlUbFcL0aE","faHir14FLR","uLtKsn1pmO","EdBKcs7Mxk","AOgEe7fKYU","CxVEfRmDcr","Z4I1viwzGk","zHF1qxXTI4","xReecL7cGc","lkMUABGaQY",
+"SWfouGrDg7","DQimpOHaBz","QssNCL7cGc","NcICAbrhlQ","uN6r3yvOMI","faHirJRJQB","hSSvQjiVBP","XflUqF6PT2","BpYhVGrDg7","7X3uyx3LDe",
+"i3pydlkMUA","EOE1oNxx9V","8U2nUaez9y","8xEKz2Nslm","Oz8yZni2v1","0BmCynnP8o","zHF1qksJby","dmoS724ARF","aez9yKsjRK","nFqikBGaQY",
+"9eoRcTwano","0MR5XyToGW","4W0TlzqH0W","tAOsrUmaEv","pWiOs0Wr5y","hYBCKnFqik","k85Ae5nmWv","ix74r48cHL","faHirlkMUA","a00b5SWfou",
+"64s8Ndpe1v","l83UdQClRL","v8yFNC2Irc","Y1mC055rfB","Pb1pas93Ml","O3iyQOUYuF","hYBCKB3qem","MaJQsa00b5","ksJbyXflUq","v1HlnblLA9",
+"i7WMQ5IhmG","Ul4a1I7p2a","ru4UGgdQsS","D6rBymX2GE","oGu6xlH1kt","FGzgpFGzgp","Kr8ysWaWsv","Cfgr3jfREu","mX2GEEoToP","JJs5m4W0Tl",
+"rhl0JC2Irc","WreyPRACuj","WaWsv5nmWv","hSSvQd85a9","16lHcDLhzM","SjskQ48cHL","Ss0ZuLDk6f","5drc6DQimp","hE1Qluvf7A","CK5W79GXkX",
+"07n1cpFrrl","3otm6hi5X7","8U2nUEoToP","Chuy3uJScX","XflUqjtn0X","zFgtB16lHc","1j5L85ZaEz","14FLRAmdQd","5NammYjB9t","MmsIoCK5W7",
+"TCgPpFFDui","lH1ktDLhzM","Waim6JkzUn","blLA9IRh48","ru4UG3otm6","Ta8f6uAWyp","RzaZA9y4lw","CxVEfvLsmS","QWxoTTCgPp","IKxdLStlDJ",
+"8FmFHaL6AJ","nFqikBCxeC","Dz1R32Nslm","MGlTFfLNg8","Uvlv4hE1Ql","StlDJWPmlx","zHF1qDcpWB","M3zXLv8yFN","5drc68RCUA","RsQUqXyPZN",
+"hSSvQMojnP","yEfy9oVQp6","iwzGktuDyS","uQIcztAOsr","s4786Q6hMC","No0Qb8xEKz","yEfy9wiHrZ","JkzUnRsQUq","uPX7Gk85Ae","8hJdt55rfB",
+"jiVBPUlU3M","ru4UGSjskQ","O3iyQWMiS3","Ta8f6WDVWJ","07n1cogLgc","uLtKswDajX","lCMxyP6bcg","0h1b1EOE1o","nnP8oKZamH","CNHmvWMiS3",
+"DG4sTdpe1v","580YDW7cTs","gdQsSSWfou","0ao3lgjUTu","cQOnvRBhp0","0BmCyqUJMd","W3VFHBGaQY","1v5hHlH1kt","qQxHPbZLvS","lpF6Wv2eC3",
+"8U2nUtjQxs","zY1GYvkCHH","07n1cSbRYy","cShY2CNHmv","5iGN5Oz8yZ","W7cTsM3zXL","ksJbyzFgtB","DQimpuJScX","lj07QPOUYS","5Mg9rb29RJ",
+"Ta8f6Nxx9V","h1zcH5ZaEz","uN6r3Vprf2","29QAz8cVD3","WaWsvjSjS3","0h1b1ydG8U","jzUqRZUnqt","Z4I1vQ6hMC","Oz8yZwiHrZ","e6e4zjS1aj",
+"0ao3ldQ586","ulk41euZA5","VjCZqQnJ1S","GWqqXpv0i7","VerEAdpe1v","jfREuWmadA","I7p2aRxrsm","RBhp0lj07Q","K4GS8fLNg8","CdyBVl83Ud",
+"gIYvE14FLR","v8yFNcmXIX","5Drn0v8yFN","8U2nU618Di","55rfBVerEA","xXTI4FcWrW","StlDJ1LB1L","07n1cgf8rI","guMb8rz7Ut","8RCUAThjNn",
+"jiVBP7X3uy","Gv3FqWMiS3","lkMUAlCMxy","7X3uyoGu6x","580YDKr8ys","O3iyQulk41","5NammEoToP","FxX9qX6Pin","KsjRK3otm6","1j5L8SWfou",
+"Mm8si2hEEU","5IhmGt98iW","cL0aElweGy","QworuFwEJz","gtCA52hEEU","In3NSJkzUn","yvOMIEdBKc","2ZHdkprNT6","5iGN5NcICA","5Drn0nFqik",
+"tjQxsm4bxU","MezSWyToGW","6AFT0zz4ZU","7lUXZHzZT8","v2eC3YjB9t","tl72WAXpwE","VLTy6IBe8k","v1Hlnd7vjM","YOfrYQ6Lix","CqqaDFjHXR",
+"ru4UGkB5nP","ix74rt59lR","djsrvhE1Ql","vOqCEReKEW","0PktInnP8o","M3zXLjfREu","a00b5BpYhV","8RCUANhXdu","tl72WdhSuH","9y4lwVIlwP",
+"4dEz6pmeCd","1v5hH7Ow5C","qUJMdOUYuF","6q6L9SjskQ","TwanozmLYD","ECMvU7fKYU","euZA50YAGH","Yw2oUOUYuF","FxX9qwiHrZ","k85AenlaBy",
+"FGzgpWaWsv","pv0i7Oz8yZ","CqqaDVIlwP","XyPZNhi5X7","7Ow5CuTacx","kB5nPLbRTH","2DREsciuWz","YOfrYlCMxy","MojnPM6qcG","4W0Tlni2v1",
+"B3qem5Namm","n8pJ9atef2","dpe1vsx5Gl","iB08lWMiS3","MGlTF3otm6","fcwDaYf2Ec","ZJTXHECMvU","ru4UGNhXdu","cQOnvjfREu","5drc6Ul4a1",
+"d7vjMdjsrv","D6rByfmIK1","Y1mC0yofH3","FjHXRCNHmv","MmsIoSWfou","ulk41Mkgy8","jzUqRWDVWJ","zY1GYiwzGk","soy9tprNT6","GXdoHxReec",
+"cmXIX07n1c","In3NSksJby","Nxx9VThjNn","cShY2cmXIX","ciuWzZhwG1","64s8NfLNg8","FxX9qsoy9t","ydG8UFVMxo","tl72WPb1pa","D6rBym4bxU",
+"QYxC007n1c","Q6Lix2Yz7E","LbRTHAgJHQ","TwanoGrDg7","Chuy33weIF","gf8rIJXljW","Zv7z0aDGtS","wiHrZUvlv4","8cVD3FjHXR","BFkb8K20wK",
+"Mm8siQWxoT","Mm8sijzUqR","WaWsvTwano","zFgtBYOfrY","45cIH5IhmG","RkQkejSjS3","iKqhrZhwG1","J2mQizz4ZU","J2mQixXTI4","Yf2Ec2Nslm",
+"qUJMd8xEKz","24ARFpv0i7","14FLR5drc6","hi5X7DQimp","fcwDaEOE1o","AgJHQaez9y","dpe1vokgRi","4W0TlfaHir","wiHrZK4GS8","mz8gxWaWsv",
+"QbxXcru4UG","lweGydhSuH","oVQp62TRI7","DLhzM7Ow5C","QnJ1S9iGoT","Nxx9V0h1b1","jSjS3RsQUq","SWfou55rfB","y94nwoQ87r","ZJTXHBFkb8",
+"hi5X7EdBKc","RsQUqK20wK","d7vjMtl72W","iB08liqv4k","xciqprKDLJ","GSQwjSjskQ","DG4sT4W0Tl","gIYvESs0Zu","O3iyQzY1GY","ZJTXHLDk6f",
+"Q6hMCn1pmO","Mm8siThjNn","iKqhrXflUq","lCMxyYh1hF","O3iyQ3weIF","Kr8ysdjsrv","PYBf4Q6hMC","ix74rJXljW","tvdkDYOfrY","nlaBynFqik",
+"FVMxoNOHsz","Yw2oUjzUqR","pAhR15Mg9r","iqv4kaez9y","Ss0ZuBpYhV","b29RJpiJSk","fcwDa48cHL","mX2GEni2v1","gtCA5yluBx","gf8rIIBe8k",
+"MaJQs8RCUA","ru4UGydG8U","Z4I1vFFDui","5Drn0UlU3M","NAFuwzmLYD","CxVEfgjUTu","FVMxoFLsph","45cIHX6Pin","JIqXi8FmFH","zQt6QpAhR1",
+"taOXK9eoRc","uupzki7WMQ","Mm8siYf2Ec","SmGzvm4bxU","WPmlxFVMxo","ZuDtDCqqaD","kZANmQ6hMC","l83Ud618Di","Ss0ZuNo0Qb","MmKGJs4786",
+"t98iWpFrrl","qUJMd2ZHdk","Waim6NOHsz","Mm8siG1RhS","uTacxAkKTk","tAOsr9eoRc","zmLYDTCgPp","0MR5X5VZjS","pmeCdVerEA","wDajXK20wK",
+"ogLgcWaWsv","he9IAlkMUA","vLsmSm4bxU","RxrsmKZamH","gIYvEWreyP","1j5L80h1b1","lj07QTXQ0Z","5Namm8RCUA","s93MlMaJQs","AIYUuvkCHH",
+"lm0pDGWqqX","IjTwPZuDtD","0Kyfs1j5L8","n8pJ914FLR","DG4sTokgRi","CqqaDFLsph","bgJAzBCxeC","HP433VIlwP","8U2nUnnP8o","fmIK1Ta8f6",
+"GXdoH7fKYU","In3NSlsQGo","fLNg829QAz","45cIHMkgy8","cL0aERzaZA","P6bcg0PktI","Oz8yZXyPZN","07n1ctuDyS","HfyNQGSQwj","JkzUn9eoRc",
+"qUJMdU3yw5","n1pmOs4786","h1zcH580YD","In3NSsx5Gl","K4GS8QClRL","RmDcrZv7z0","nnP8olViBv","ZUnqtoGu6x","uN6r39rlg9","M3zXLiwzGk",
+"0Wr5ym4bxU","JXljWI7p2a","RACujAmdQd","rKDLJVprf2","AmdQd29QAz","W3VFHLewvM","yluBxl83Ud","5Drn05Drn0","In3NSulk41","zz4ZUtuDyS",
+"Ta8f6k85Ae","SjskQ2TRI7","uQIczy94nw","uLtKstvdkD","JKWYRnlaBy","Kr8ys5nmWv","DcpWB8hJdt","lXFOBeuZA5","NAFuwW3VFH","9GXkXksJby",
+"x3LDeB3qem","9GXkXCNHmv","pT8wu5ZaEz","OUqFMECMvU","ksJbye6e4z","0ao3l45cIH","K20wKFwEJz","zFgtB0MR5X","1LB1L2Yz7E","sx5GlaDGtS",
+"v2eC3gdQsS","wDajXW3VFH","uN6r3uZPqg","Gv3Fq16lHc","JRJQBfcwDa","pv0i7a00b5","2TRI7VNCPd","VerEAi7WMQ","piJSk618Di","fFDrJNo0Qb",
+"14FLRzQt6Q","Z4I1vJKWYR","Ss0ZudmoS7","WreyPoQ87r","Ss0Zutl72W","NcICAG1RhS","uJScXMezSW","h1zcHyluBx","MojnPnlaBy","48cHLQbxXc",
+"lweGyCK5W7","WmadA0BmCy","NAFuwru4UG","lH1ktMK07Y","uAWyp5Namm","vkCHHqQxHP","FnPFBJIqXi","Oz8yZiwzGk","RsQUq9iGoT","RxrsmcmXIX",
+"Ss0ZuQbxXc","s4786NOHsz","7X3uyS77LH","lsQGoK20wK","VIlwPfLNg8","X6PinOHaBz","jiVBPuLtKs","HP433okgRi","KZamHhE1Ql","aez9yZUnqt",
+"FxX9quPX7G","pvgjSpFrrl","tAOsrt59lR","NhXdunlaBy","tlILt0Kyfs","24ARFDz1R3","GWqqXCNHmv","RxrsmRACuj","AOgEeAIYUu","MK07YazIWp",
+"9iGoTPOUYS","xXTI4P6bcg","5NammNOHsz","jeskS0h1b1","yvOMIlm0pD","hSSvQCIShG","IRh48DG4sT","BGaQY5nmWv","uAWypuZPqg","gdQsSNAFuw",
+"2hEEUReKEW","JJs5mRBhp0","tvdkD64s8N","MK07YRsQUq","azIWpUmaEv","jeskSVIlwP","F6PT25Mg9r","XflUqsx5Gl","NhXdud7vjM","Z4I1vgdQsS",
+"gdQsSIn3NS","3weIF8hJdt","Y1mC0CdyBV","zbIYYLbRTH","5Drn0piJSk","sqVrfjeskS","hUTw729QAz","1LB1Lv8yFN","cQOnviB08l","Mkgy8uoStw",
+"ZJTXH7hyVv","9XyT9pT8wu","hi5X7lH1kt","OxWIHS2Dfu","HlUbFhe9IA","QChxsn1pmO","aL6AJPb1pa","o8UydYh1hF","4W0Tlmz8gx","BCxeC5iGN5",
+"7fKYU4W0Tl","piJSkVjCZq","XyPZNb29RJ","FVMxo3otm6","RACujzHF1q","tl72WZv7z0","7hyVvhYBCK","GrDg7uQIcz","3otm6CdyBV","nFqikJRJQB",
+"UlU3MStlDJ","zFgtBUvlv4","5drc6JJs5m","K20wKJRJQB","U3yw5e6e4z","uLtKsCNHmv","fqypysx5Gl","TXQ0ZHP433","0Wr5yOUYuF","EoToPy94nw",
+"RpBQm9eoRc","Mkgy8EoToP","5IhmGaDGtS","n8pJ9zmLYD","gjUTuRxrsm","RsQUqzQt6Q","fqypyIKxdL","1v5hHQworu","5drc648cHL","ZuDtDRACuj",
+"9rlg9yEfy9","yluBxUmaEv","ni2v1i3pyd","Uvlv4ksJby","DQimpcmXIX","zqH0Whi5X7","ZJTXH55rfB","QbxXcqUJMd","Cp3mZlsQGo","Cp3mZsuY4x",
+"KZamHBCxeC","zQt6QHP433","Mm8siQworu","Ta8f6soy9t","faHirdmoS7","fcJOyVNCPd","ydG8UjSjS3","vLsmSAXpwE","Chuy32hEEU","B3qemRkQke",
+"BpYhVnlaBy","jiVBPNOHsz","blLA9Yh1hF","OHaBz3weIF","0Wr5y5VZjS","bgJAzsuY4x","7X3uyQ6Lix","cShY2WPmlx","In3NSzHF1q","tlILtdhSuH",
+"a00b5hi5X7","7fsYMlkMUA","iwzGkEoToP","rKDLJhSSvQ","dhSuHQssNC","sx5GlyToGW","MezSW9iGoT","s93MlW7cTs","fqypyzqH0W","RmDcrdmoS7",
+"U3yw5ydG8U","Yh1hF3otm6","FNYIMOz8yZ","uQIczzFgtB","rKDLJyvOMI","yEfy9lm0pD","lH1kttvdkD","B3qemlkMUA","StlDJfmIK1","bZLvSECMvU",
+"9XyT9ni2v1","KsjRKkB5nP","d7vjMksJby","KsjRKRkQke","FwEJzIjTwP","2DREsB3qem","MGlTFWaWsv","QWxoTQnJ1S","s7Mxk1j5L8","Pb1pa5Mg9r",
+"rhl0J0BmCy","KZamHMkgy8","rz7Ut4dEz6","7ku1pJIqXi","pT8wuguMb8","M3zXLlm0pD","qQxHP5IhmG","hi5X7gjUTu","v8yFNQ6Lix","Kr8ysHP433",
+"LbRTHHP433","bZLvSuN6r3","x3LDeoQ87r","jiVBP5VZjS","lXFOBECMvU","MezSWAXpwE","wDajXaez9y","5Drn08FmFH","QworuHRxd8","RACujZzJHW",
+"e6e4zSjskQ","Yf2EcTXQ0Z","dQ586IKxdL","FnPFBksJby","d7vjMQChxs","AXpwE14FLR","K20wKt98iW","OUqFM45cIH","Dz1R3MmsIo","zqH0WGXdoH",
+"vOqCEAmdQd","cShY2qQxHP","vkCHHOxWIH","ECMvUKZamH","wiHrZhi5X7","9rlg9lCMxy","k85Ae618Di","kB5nPuZPqg","uQIczpv0i7","lCMxyKASQ8",
+"lH1ktHRxd8","WMiS3AkKTk","vkCHHiqv4k","x3LDeBpYhV","WDVWJdQ586","IBe8kxciqp","ydG8UC2Irc","XyPZNzY1GY","QnJ1SZv7z0","MaJQsY1mC0",
+"iKqhrfcJOy","kZANmaL6AJ","CNHmvIBe8k","fqypyatef2","hUTw72ZHdk","M3zXLEoToP","FVMxoGSQwj","7ku1pbZLvS","hi5X7RsQUq","ECMvUQworu",
+"sqVrffFDrJ","pT8wu1j5L8","M3zXLfqypy","zQt6QyofH3","8FmFHUlU3M","9rlg9IRh48","iqv4k64s8N","uLtKs2Yz7E","zQt6QfcJOy","hUTw7EOE1o",
+"FPfSEIRh48","RACuj7hyVv","4QMc9Ta8f6","JKWYRatef2","hE1QlEoToP","xReecwiHrZ","HfyNQcQOnv","zqH0WFjHXR","fLNg8Ta8f6","GWqqX8U2nU",
+"7fsYMVerEA","v8yFN7hyVv","aL6AJ24ARF","xReecdQ586","55rfBTCgPp","kB5nPdpe1v","oGu6x9XyT9","5Mg9rzqH0W","v1HlnPb1pa","CIShGSWfou",
+"EoToPt98iW","EoToPsuY4x","Cp3mZqaofN","AkKTkoQ87r","TwanoRxrsm","ECMvU7lUXZ","azIWpDLhzM","Ss0ZubrhlQ","DLhzMtaOXK","fcwDaZuDtD",
+"Q6hMCOxWIH","dhSuHpAhR1","J2mQiWMiS3","0YAGH4QMc9","AkKTkVIlwP","wDajXRpBQm","lViBvNOHsz","t59lR6q6L9","FGzgpFNYIM","29QAz1j5L8",
+"qQxHP5ZaEz","G1RhSaL6AJ","AOgEev1Hln","W7cTsvLsmS","Oz8yZatef2","b29RJQssNC","0ao3l1LB1L","QChxsuPX7G","55rfBi3pyd","bZLvSiB08l",
+"tvdkDKASQ8","BFkb8b29RJ","azIWppWiOs","i7WMQKr8ys","IRh48EdBKc","FGzgpBpYhV","0MR5X618Di","brhlQEdBKc","U3yw5Gv3Fq","Oz8yZWMiS3",
+"ECMvUCp3mZ","blLA9Ta8f6","VIlwPyluBx","DQimplXFOB","ZhwG1nnP8o","7X3uy7fKYU","B3qem8cVD3","KASQ8P6bcg","atef2ZhwG1","JIqXiTwano",
+"h1zcHNOHsz","Zv7z0FLsph","brhlQCqqaD","yofH3FxX9q","jiVBPU3yw5","W7cTs5nmWv","FhtgljSjS3","XyPZNBCxeC","0MR5XY1mC0","QClRLyEfy9",
+"In3NSVNCPd","8cVD3RmDcr","G1RhSfFDrJ","I7p2aMmKGJ","WMiS3zz4ZU","5Drn0dmoS7","5Drn0StlDJ","W3VFHnlaBy","2ZHdkcmXIX","yvOMIRsQUq",
+"Yw2oU9rlg9","RsQUqJKWYR","yvOMI0YAGH","ZuDtDCK5W7","XyPZN7lUXZ","iwzGkMkgy8","iwzGkAgJHQ","9XyT9tuDyS","Pb1pas4786","Ta8f6RBhp0",
+"qQxHPAkKTk","9rlg9WaWsv","IjTwPd85a9","fcJOyGv3Fq","6AFT09eoRc","QssNCGrDg7","0PktIzHF1q","3otm65iGN5","hE1Qln8pJ9","48cHLpv0i7",
+"Y1mC0FjHXR","JJs5mlkMUA","0BmCyCxVEf","UlU3Matef2","EoToP1v5hH","OUqFMuoStw","QWxoTzqH0W","AXpwEuTacx","Ul4a1hi5X7","WPmlxX6Pin",
+"DQimpvOqCE","iqv4kazIWp","0ao3lChuy3","zHF1qVNCPd","fcwDaqUJMd","24ARFfmIK1","Mm8siuPX7G","W7cTsdmoS7","nFqikyToGW","soy9t5iGN5",
+"nnP8oEOE1o","m4bxUYw2oU","taOXKoVQp6","oVQp6oVQp6","IBe8kx3LDe","J2mQiMK07Y","0BmCy2Nslm","RzaZAuJScX","k85AepvgjS","dQ586RsQUq",
+"Y1mC0oQ87r","zFgtB2DREs","lH1ktHP433","RsQUqEOE1o","FwEJzDG4sT","iKqhrCIShG","16lHcSbRYy","wDajXsuY4x","fmIK1Mkgy8","DG4sToVQp6",
+"J2mQi7hyVv","CqqaDS2Dfu","ydG8U1v5hH","jfREu5nmWv","rz7UtDz1R3","JJs5m0h1b1","dpe1vIBe8k","QChxsWPmlx","4dEz6HzZT8","jzUqRni2v1",
+"lkMUA0MR5X","SWfou4QMc9","jiVBPMmKGJ","l83UdWDVWJ","DG4sT7fsYM","aez9yI7p2a","ni2v1v2eC3","Yh1hFiKqhr","WreyPMmsIo","OUYuFWPmlx",
+"i3pydAXpwE","BGaQY48cHL","GSQwjt98iW","NOHszO3iyQ","jiVBPlViBv","QssNC0YAGH","GrDg7aFFss","cL0aEcmXIX","uPX7GY1mC0","lsQGoB3qem",
+"8FmFHfLNg8","618DiJKWYR","cmXIXgtCA5","uJScXjfREu","GWqqXn8pJ9","ru4UG1LB1L","JKWYRCp3mZ","zHF1q2Nslm","9GXkXMojnP","WMiS39y4lw",
+"tuDySQworu","VIlwPiB08l","rKDLJHP433","tjQxsciuWz","uAWyptl72W","9XyT9WMiS3","ZuDtDcShY2","KsjRKW3VFH","Q6Lixix74r","Pb1pazz4ZU",
+"8U2nUMGlTF","euZA5piJSk","J2mQiksJby","2TRI7QClRL","DLhzMFPfSE","AXpwE9eoRc","UlU3MsqVrf","FxX9qMmsIo","faHirx3LDe","29QAzpmeCd",
+"6AFT0C2Irc","o8Uydrz7Ut","0h1b1ix74r","ZUnqtAIYUu","TCgPpcQOnv","9GXkXZJTXH","8cVD3WPmlx","dQ586hi5X7","he9IAciuWz","6q6L9rz7Ut",
+"mX2GE9iGoT","9eoRcWPmlx","blLA9wDajX","2hEEUGWqqX","ulk41atef2","ZJTXHs93Ml","aez9yZv7z0","uAWyp3weIF","7X3uytlILt","9XyT9lViBv",
+"FGzgplH1kt","O3iyQTwano","yToGWulk41","pT8wuRkQke","OxWIHiwzGk","XflUqaDGtS","HRxd8uZPqg","i3pydyToGW","9eoRcXflUq","VIlwPD6rBy",
+"v2eC3F6PT2","7Ow5C2DREs","7hyVv45cIH","SbRYyeuZA5","HlUbFa00b5","NAFuwrhl0J","Z4I1vbgJAz","5IhmGOUYuF","vkCHHIRh48","JRJQB2Yz7E",
+"9XyT9ogLgc","uupzk16lHc","lpF6Wmz8gx","pWiOsCxVEf","WmadApAhR1","fcJOyO3iyQ","CdyBVFcWrW","IRh48s93Ml","nnP8oRxrsm","pFrrlVerEA",
+"vOqCEOz8yZ","7Ow5Ct59lR","6q6L90Wr5y","QChxsD6rBy","DLhzMMkgy8","pv0i7YjB9t","MmKGJyluBx","4W0TlEOE1o","Dz1R3NcICA","uZPqgXyPZN",
+"W3VFHjSjS3","gjUTusx5Gl","WmadASjskQ","WmadAaDGtS","FNYIMQChxs","uPX7GtaOXK","HzZT8WDVWJ","OxWIHlCMxy","bgJAzdpe1v","5nmWvYf2Ec",
+"pT8wu2ZHdk","x3LDeeuZA5","7lUXZQssNC","AIYUuVprf2","QClRL4QMc9","GWqqXTa8f6","tl72WIBe8k","gjUTuhi5X7","piJSkCqqaD","KASQ82TRI7",
+"JXljWatef2","CdyBVlXFOB","oVQp6hE1Ql","v1HlnWPmlx","pT8wuiwzGk","suY4x9y4lw","LewvMZzJHW","taOXKWMiS3","Ta8f6aDGtS","RBhp0Yw2oU",
+"ulk41DLhzM","9XyT9lH1kt","dpe1vhi5X7","Q6LixaL6AJ","ZzJHWRxrsm","jtn0Xulk41","55rfBVprf2","5nmWvKZamH","CNHmvdjsrv","W7cTsEoToP",
+"hYBCKlCMxy","J2mQit59lR","GSQwjHfyNQ","uTacxEOE1o","HRxd8IjTwP","Zv7z0uPX7G","euZA5fmIK1","uZPqgtuDyS","fcwDa0h1b1","Ul4a1hUTw7",
+"B3qemlXFOB","CIShG7ku1p","BCxeCChuy3","rKDLJuvf7A","NhXdu5Namm","Uvlv4PYBf4","kB5nPWaWsv","CK5W7OUYuF","1j5L8zY1GY","7lUXZzQt6Q",
+"vkCHHVerEA","Oz8yZSbRYy","RxrsmYw2oU","tjQxs4W0Tl","taOXKcL0aE","WreyP7fsYM","guMb8x3LDe","brhlQkB5nP","8xEKz1v5hH","s7MxkyofH3",
+"0YAGHHfyNQ","Yh1hF64s8N","RsQUqdQ586","BpYhVW3VFH","oGu6xhi5X7","LbRTHBGaQY","WmadAZJTXH","BbwgAfFDrJ","JIqXid85a9","QClRLZUnqt",
+"8hJdtFLsph","9GXkX0ao3l","FNYIM3weIF","WmadAoGu6x","jtn0XRsQUq","mz8gxlViBv","oGu6xNo0Qb","LDk6fCK5W7","2hEEUBFkb8","hi5X7SbRYy",
+"fLNg82ZHdk","hUTw7hi5X7","CqqaDgtCA5","M3zXLFxX9q","zY1GYxReec","faHirK20wK","FjHXRdmoS7","n1pmOKASQ8","2ZHdkJRJQB","8U2nUfmIK1",
+"HP4339XyT9","DLhzM7fsYM","9GXkXNAFuw","MmKGJyEfy9","1v5hHpT8wu","D6rBySbRYy","X6PinTXQ0Z","KASQ8QssNC","uoStwsuY4x","zz4ZUFLsph",
+"fmIK1QbxXc","kB5nPjiVBP","VIlwPlpF6W","Chuy3JKWYR","qQxHP16lHc","0BmCyPb1pa","9rlg9tvdkD","2Yz7E07n1c","LDk6fECMvU","AmdQdpFrrl",
+"pFrrlTXQ0Z","lj07QYf2Ec","8cVD3VLTy6","Vprf2KASQ8","cShY2iqv4k","uvf7Aatef2","gjUTu4dEz6","vLsmSOz8yZ","5ZaEz5nmWv","FFDuiIRh48",
+"lkMUAhi5X7","vOqCEpWiOs","0KyfsoVQp6","i3pydOUqFM","d7vjMnlaBy","gtCA5pFrrl","Waim6AOgEe","guMb8JIqXi","cShY2nlaBy","MojnPv8yFN",
+"HRxd8zY1GY","k85AeHfyNQ","iqv4kxReec","YOfrYogLgc","gIYvEsuY4x","dhSuHFNYIM","W7cTscShY2","dQ586uoStw","bZLvSQClRL","M6qcGVerEA",
+"okgRiYh1hF","X6PinyluBx","LbRTHv8yFN","Q6Lix7fKYU","Y1mC0aFFss","Cp3mZdhSuH","lweGyHfyNQ","QChxsi7WMQ","uN6r3ZuDtD","XyPZNXyPZN",
+"bZLvSCdyBV","KZamHxciqp","2hEEU5ZaEz","xciqpLbRTH","Yh1hFuQIcz","iB08lFwEJz","0BmCyWmadA","2DREsLbRTH","0BmCyRkQke","ru4UG9y4lw",
+"8hJdtpmeCd","lCMxycmXIX","euZA5oVQp6","cL0aE1j5L8","VerEAni2v1","CNHmvQ6hMC","lkMUAQWxoT","gf8rITwano","WDVWJSjskQ","C2IrcFNYIM",
+"lweGy3weIF","m4bxUPOUYS","BbwgA45cIH","TCgPp8U2nU","zbIYYPYBf4","POUYSuTacx","Chuy3Kr8ys","Q6hMCh1zcH","0BmCyTa8f6","OUqFMuTacx",
+"aez9y5Mg9r","v1HlnfaHir","Vprf2nnP8o","Nxx9VRBhp0","KASQ8JXljW","qaofNDQimp","3otm6YjB9t","F6PT2tvdkD","sx5Glo8Uyd","FPfSEHzZT8",
+"nlaByYf2Ec","tl72WCfgr3","qQxHPRBhp0","Mkgy8NcICA","lm0pDiB08l","d7vjMlm0pD","blLA9AgJHQ","hUTw7FLsph","yToGWTwano","UmaEvFcWrW",
+"RpBQmMm8si","nlaBylkMUA","Nxx9VRxrsm","DG4sTCxVEf","AIYUudpe1v","5ZaEzS2Dfu","K20wKVjCZq","d85a9ciuWz","Q6LixUl4a1","2TRI7cL0aE",
+"FhtglRxrsm","gtCA5b29RJ","QClRLxReec","FPfSE4dEz6","CxVEf8hJdt","fFDrJS77LH","hSSvQhi5X7","QworutjQxs","8RCUA45cIH","0YAGHJIqXi",
+"IKxdLgIYvE","5ZaEzFcWrW","LbRTHyToGW","cL0aEVjCZq","qQxHPFVMxo","JJs5mbgJAz","okgRisx5Gl","Mm8sizQt6Q","CK5W7FnPFB","zbIYYOz8yZ",
+"YjB9tTwano","NhXduxReec","24ARFgdQsS","YOfrYSmGzv","CqqaDkB5nP","TXQ0Z2TRI7","QChxsuQIcz","zY1GYGXdoH","ix74ruJScX","lsQGo14FLR",
+"VBjhzW3VFH","oQ87rGv3Fq","s7Mxkuupzk","CxVEfW3VFH","7hyVvy94nw","ReKEWDQimp","AXpwENo0Qb","t59lRMmKGJ","QClRL5drc6","azIWpWaim6",
+"zFgtBi7WMQ","KsjRK7ku1p","Mm8si24ARF","BpYhVMmsIo","atef2XyPZN","Ta8f6NcICA","MojnPrhl0J","8TxD7VjCZq","CNHmvQssNC","NOHszlm0pD",
+"sqVrfFNYIM","5VZjSK20wK","uQIcz0ao3l","CK5W7QnJ1S","64s8N8RCUA","NOHszMojnP","e6e4zYh1hF","kZANmFLsph","tvdkDPb1pa","Zv7z0uupzk",
+"Mm8siLDk6f","qUJMduJScX","uN6r3zY1GY","ru4UGQChxs","BFkb8bZLvS","AgJHQUmaEv","taOXKgjUTu","NOHszLDk6f","uZPqg618Di","W3VFH0Kyfs",
+"JKWYRoVQp6","aFFssnFqik","SmGzvlsQGo","aez9yv2eC3","lj07QJJs5m","sx5GlHfyNQ","ZUnqt5IhmG","RzaZAtaOXK","AkKTkIjTwP","55rfBblLA9",
+"M3zXLlXFOB","OUYuFRpBQm","wiHrZjS1aj","WDVWJrz7Ut","zHF1qSWfou","okgRiMojnP","fLNg8WaWsv","55rfB8FmFH","FNYIMazIWp","he9IAVprf2",
+"JIqXicQOnv","b29RJnnP8o","3weIF2TRI7","ECMvUqUJMd","EoToPrhl0J","DLhzMhE1Ql","618DiMezSW","FGzgpwiHrZ","5Drn0KZamH","WMiS355rfB",
+"pFrrlhYBCK","prNT6qUJMd","2hEEUiwzGk","64s8NpFrrl","kZANmpvgjS","Waim6RsQUq","VIlwPnlaBy","vLsmSTCgPp","bgJAzJKWYR","IKxdLFxX9q",
+"Mm8siuoStw","KZamHpAhR1","X6PinKZamH","580YD0BmCy","nnP8okB5nP","y94nwaDGtS","ReKEWPYBf4","uQIcz8RCUA","cShY2RkQke","n1pmOQnJ1S",
+"Mm8sikZANm","i3pydqaofN","5NammWDVWJ","ni2v1G1RhS","FhtglMmsIo","AOgEeRxrsm","5nmWvm4bxU","Mm8siWreyP","zHF1qIjTwP","Q6hMCYw2oU",
+"he9IAAXpwE","yofH35ZaEz","6q6L9DcpWB","uN6r36AFT0","uN6r3uN6r3","FGzgpGXdoH","xciqpFhtgl","Z4I1v48cHL","zQt6Qjtn0X","Pb1paxReec",
+"5Mg9rnlaBy","ix74rsoy9t","d7vjM4dEz6","Cfgr3OHaBz","pFrrlzqH0W","DQimpd85a9","0Kyfs9eoRc","kB5nPLDk6f","MojnPM3zXL","suY4xB3qem",
+"M6qcGjzUqR","Cp3mZnlaBy","WDVWJjtn0X","jtn0XMmKGJ","14FLRxReec","VjCZqzmLYD","FLsphLDk6f","OUYuFrKDLJ","KZamHZUnqt","IBe8kTCgPp",
+"K20wKMezSW","0YAGHLDk6f","Chuy3POUYS","yvOMIuupzk","8FmFHNOHsz","ogLgcQssNC","CqqaDvOqCE","0ao3lnlaBy","GSQwjhi5X7","X6PinMGlTF",
+"K4GS8CIShG","mX2GEHzZT8","Q6Lix0Kyfs","0PktIDG4sT","580YDaFFss","zz4ZU24ARF","t98iWtlILt","yofH30BmCy","9eoRcW3VFH","hYBCKlpF6W",
+"kZANm2hEEU","brhlQxXTI4","5VZjSlj07Q","dmoS7ZzJHW","RACujEdBKc","29QAzsuY4x","MojnPxciqp","ru4UGi3pyd","2Yz7EZzJHW","Z4I1vbrhlQ",
+"jtn0Xi7WMQ","FcWrW8xEKz","pWiOsi7WMQ","gf8rItl72W","29QAz55rfB","GXdoHWMiS3","tvdkDfLNg8","MezSWQWxoT","LewvMQworu","guMb8gdQsS",
+"GXdoHStlDJ","ECMvUHlUbF","2DREsJ2mQi","VIlwPF6PT2","oVQp6TXQ0Z","LewvM618Di","Q6hMCNhXdu","vLsmSvOqCE","t59lRI7p2a","lsQGoTCgPp",
+"Dz1R3EOE1o","jiVBPhSSvQ","MGlTFFxX9q","wiHrZ7lUXZ","G1RhSGXdoH","RzaZAPb1pa","ZuDtDCp3mZ","d7vjMsqVrf","uvf7AoGu6x","uJScXoGu6x",
+"FnPFBHP433","VBjhzDQimp","hi5X7VjCZq","2TRI716lHc","tuDyS8U2nU","m4bxUa00b5","MGlTFP6bcg","JkzUniKqhr","0BmCyVerEA","wDajXtl72W",
+"Cp3mZlViBv","qUJMdogLgc","a00b52hEEU","tlILtS77LH","5ZaEzTCgPp","lViBvYjB9t","iqv4kWmadA","fmIK1GSQwj","LbRTH45cIH","a00b5jS1aj",
+"580YDGSQwj","x3LDedhSuH","MK07Y1j5L8","NhXduzqH0W","jzUqROz8yZ","S77LHcQOnv","lkMUAtjQxs","pT8wu2TRI7","v1HlnydG8U","7hyVvn8pJ9",
+"okgRiXyPZN","mz8gxLbRTH","8FmFHKsjRK","nlaByzHF1q","ciuWzCp3mZ","DQimpqQxHP","uJScXhSSvQ","taOXKUvlv4","9eoRciqv4k","M6qcGblLA9",
+"cmXIXhi5X7","RxrsmqaofN","FFDuid7vjM","DG4sTtuDyS","5VZjSrhl0J","XflUqiB08l","zFgtBnlaBy","uN6r3jiVBP","Cfgr35Namm","8TxD7sx5Gl",
+"lsQGogjUTu","GrDg7FLsph","kB5nP4W0Tl","CqqaDqUJMd","m4bxUpv0i7","29QAzuAWyp","ECMvUyluBx","IRh48WreyP","cShY2aDGtS","FwEJzQbxXc",
+"FhtglVNCPd","2Yz7ElViBv","StlDJzqH0W","pv0i7PYBf4","okgRisuY4x","UlU3MW3VFH","ZUnqtv1Hln","7ku1p2DREs","Y1mC0azIWp","cQOnvK4GS8",
+"jS1ajAmdQd","ulk41NhXdu","Ul4a1EdBKc","jSjS3iwzGk","Gv3FqQ6hMC","WDVWJwiHrZ","1j5L8uN6r3","8FmFHcmXIX","MmsIot98iW","Mkgy8B3qem",
+"Z4I1vpvgjS","tAOsrUl4a1","EOE1opv0i7","IKxdLLbRTH","9XyT9Waim6","zz4ZUIBe8k","DG4sT07n1c","jS1ajsuY4x","gtCA5zz4ZU","Gv3FqFLsph",
+"uLtKsjfREu","FVMxoiqv4k","ydG8Uuupzk","SmGzvW7cTs","HRxd8zqH0W","uupzk4QMc9","CIShGn8pJ9","zbIYYUmaEv","soy9tQworu","ECMvUoQ87r",
+"UmaEv9GXkX","jS1ajCNHmv","D6rByru4UG","ru4UGRsQUq","fLNg8hUTw7","prNT6t98iW","StlDJK4GS8","m4bxUyToGW","AkKTk2Yz7E","8RCUAwDajX",
+"ydG8UOz8yZ","48cHL4QMc9","MaJQsIKxdL","C2IrcdhSuH","jeskSTa8f6","VIlwPjzUqR","5drc6NcICA","hE1QlpvgjS","TXQ0Z7ku1p","Vprf2O3iyQ",
+"29QAz4dEz6","45cIH2Nslm","Q6hMCgjUTu","aFFss7ku1p","lsQGoeuZA5","atef2dmoS7","jSjS3S77LH","cL0aEnlaBy","fLNg8jS1aj","WmadAMaJQs",
+"oQ87rvOqCE","ZhwG1zbIYY","jeskSuLtKs","Yh1hFJkzUn","gIYvEm4bxU","Zv7z02ZHdk","oVQp6iwzGk","O3iyQ8RCUA","MojnPnFqik","vkCHH3otm6",
+"0MR5XdhSuH","FLsphfLNg8","IjTwPY1mC0","BpYhViqv4k","9GXkXiqv4k","xXTI4BpYhV","ECMvUogLgc","tl72WDcpWB","FGzgp4W0Tl","VBjhzJKWYR",
+"0h1b13weIF","FhtglZ4I1v","FLsphL7cGc","d85a9JIqXi","4QMc93weIF","XyPZNfmIK1","hi5X7W3VFH","piJSk64s8N","IjTwPD6rBy","fqypyGv3Fq",
+"tl72W2Nslm","WMiS3BGaQY","qaofNd7vjM","pAhR1Ss0Zu","euZA5RzaZA","Fhtgl8cVD3","pAhR1qaofN","ECMvUQClRL","aDGtSYw2oU","5ZaEzpFrrl",
+"uoStwMaJQs","9XyT9AgJHQ","7X3uyaFFss","soy9tD6rBy","lViBvcmXIX","CdyBVtlILt","2TRI7MGlTF","faHirLbRTH","RsQUq7fKYU","S77LHKZamH",
+"pv0i7tlILt","ulk41MezSW","zz4ZUTwano","6AFT0vLsmS","JkzUndhSuH","zmLYDnlaBy","MaJQs2ZHdk","o8UydUvlv4","l83Ud7Ow5C","EoToPxXTI4",
+"sx5GlIjTwP","lj07Qs7Mxk","9XyT9GrDg7","U3yw5JJs5m","VBjhzix74r","jtn0XcmXIX","tlILtNhXdu","VLTy6d85a9","hYBCKGSQwj","prNT6FxX9q",
+"CdyBVcQOnv","uPX7G0BmCy","9iGoTK4GS8","Cp3mZQYxC0","ThjNnJkzUn","yluBxTXQ0Z","sqVrfAOgEe","gtCA57Ow5C","2ZHdknnP8o","BFkb8jSjS3",
+"yluBx0ao3l","cQOnvdpe1v","MojnP618Di","64s8NOUYuF","ThjNnIKxdL","NhXduZJTXH","tlILtY1mC0","IBe8kUl4a1","jSjS3lweGy","IjTwPn1pmO",
+"MaJQsdmoS7","wDajXWmadA","vLsmS0BmCy","16lHcWPmlx","MaJQsjeskS","t98iW2ZHdk","uoStwUmaEv","TCgPpWaim6","JXljWOz8yZ","tl72WVprf2",
+"ThjNna00b5","sqVrfzqH0W","HRxd8aez9y","HP433SbRYy","rKDLJ5Drn0","No0QbD6rBy","4dEz614FLR","SjskQIRh48","fcwDapFrrl","suY4xt59lR",
+"B3qemuN6r3","mX2GEGWqqX","YOfrYoQ87r","oGu6xy94nw","ydG8UprNT6","Cp3mZ5ZaEz","jiVBP4W0Tl","uTacxmz8gx","aL6AJVprf2","2TRI7QbxXc",
+"0YAGH6q6L9","KsjRKhUTw7","Q6LixuJScX","b29RJni2v1","xciqpBGaQY","B3qemFGzgp","OUYuF5Drn0","MmKGJTCgPp","QworuWPmlx","3weIFXyPZN",
+"gf8rIRzaZA","sqVrfMm8si","B3qemo8Uyd","taOXKJRJQB","v1HlnogLgc","FwEJz8FmFH","t59lRSbRYy","hi5X7FGzgp","Yw2oUYjB9t","hE1QljzUqR",
+"cmXIXzz4ZU","jfREutlILt","GWqqX5IhmG","1v5hHiwzGk","BFkb8FVMxo","MojnPlkMUA","QClRLPb1pa","O3iyQrhl0J","aez9y07n1c","uupzkuAWyp",
+"Dz1R37Ow5C","uPX7GYw2oU","9XyT9cmXIX","o8UydCxVEf","BFkb8Cfgr3","Kr8ysaez9y","RsQUqQ6hMC","4W0Tl8TxD7","RsQUqgtCA5","aL6AJMmKGJ",
+"dQ586MGlTF","nnP8o07n1c","bgJAzqQxHP","0Wr5yqQxHP","a00b5aDGtS","jtn0XW3VFH","lkMUAMm8si","yEfy9WaWsv","P6bcgYh1hF","uvf7AnnP8o",
+"CIShG14FLR","FhtglzHF1q","NcICAzbIYY","lm0pDrz7Ut","MezSWBGaQY","K20wKpWiOs","5nmWvyToGW","fFDrJB3qem","4QMc9oQ87r","a00b5s4786",
+"MezSWni2v1","5nmWvuAWyp","t59lRtuDyS","5iGN5CxVEf","7Ow5CK4GS8","0h1b1sqVrf","FGzgp16lHc","GSQwjOUqFM","MmsIocL0aE","2TRI7n1pmO",
+"M3zXLRBhp0","0Kyfsd7vjM","s7Mxkm4bxU","cQOnviqv4k","0h1b1WreyP","4QMc9ogLgc","WaWsv5IhmG","OUYuFChuy3","fqypypAhR1","ksJby5iGN5",
+"djsrvHRxd8","FnPFBCNHmv","EdBKclweGy","4QMc9FPfSE","v8yFNiB08l","BFkb8uoStw","DcpWB5Namm","Yh1hFOUYuF","X6Pin5drc6","7fsYMaez9y",
+"48cHLIjTwP","dhSuHjzUqR","EoToPLewvM","fqypyfaHir","16lHc9rlg9","Gv3FqSs0Zu","HRxd8yEfy9","P6bcgiwzGk","nlaByUmaEv","pmeCdP6bcg",
+"JkzUnG1RhS","s7MxkOUqFM","cmXIX4W0Tl","YOfrYJXljW","8TxD7VBjhz","HzZT8ECMvU","MmsIo2Yz7E","VjCZqMm8si","jfREuIRh48","lViBvX6Pin",
+"lkMUA8xEKz","Mkgy82ZHdk","BbwgA5Drn0","9GXkXOUqFM","v1Hlnpv0i7","S2DfuS2Dfu","Q6LixMkgy8","faHiryofH3","TXQ0ZaL6AJ","9eoRcpvgjS",
+"tuDySs4786","7lUXZaL6AJ","oVQp67fKYU","fcwDa9XyT9","IKxdL0ao3l","oQ87rRxrsm","XflUqQYxC0","G1RhSDz1R3","bZLvSvLsmS","SjskQOxWIH",
+"CqqaDgIYvE","rKDLJRzaZA","tuDySMK07Y","zFgtBmX2GE","faHir8FmFH","5IhmGHfyNQ","jzUqREdBKc","YjB9tiB08l","07n1cXflUq","ix74rC2Irc",
+"OUqFMzmLYD","5ZaEzIn3NS","tuDySoGu6x","faHirDG4sT","CdyBVxReec","C2Irc14FLR","M6qcG2hEEU","AmdQdjtn0X","n8pJ9uvf7A","0YAGHn8pJ9",
+"v1Hlnlj07Q","5VZjS2TRI7","JRJQBSs0Zu","zFgtB7lUXZ","5Drn0VerEA","2ZHdkCfgr3","1LB1L7lUXZ","s47861v5hH","5VZjSrKDLJ","s93Ml7Ow5C",
+"DLhzMpAhR1","VIlwPlCMxy","FVMxoOz8yZ","0MR5XjS1aj","aFFssxXTI4","yluBxNcICA","iB08lk85Ae","3weIFAmdQd","IRh48AXpwE","o8UydRxrsm",
+"mz8gxmz8gx","4dEz6O3iyQ","kB5nPS2Dfu","ni2v1CIShG","2hEEUblLA9","5VZjSMGlTF","PYBf45ZaEz","pWiOsd85a9","M3zXLCK5W7","Pb1paC2Irc",
+"n8pJ95Mg9r","JXljW4dEz6","s7Mxkgf8rI","wiHrZYw2oU","YjB9t8RCUA","FGzgpNcICA","jzUqRStlDJ","7fsYMOUqFM","gdQsSIBe8k","FjHXRs7Mxk",
+"64s8NEoToP","a00b5zY1GY","HzZT8IKxdL","0YAGHpFrrl","0ao3lIjTwP","POUYSyofH3","3otm6lsQGo","iqv4kuvf7A","tAOsr618Di","e6e4zlkMUA",
+"vLsmSblLA9","b29RJBGaQY","aFFssFjHXR","9eoRc4dEz6","M3zXLuQIcz","64s8Niqv4k","24ARF5drc6","FxX9qWMiS3","piJSkhi5X7","VBjhzM6qcG",
+"lpF6WCfgr3","B3qemdhSuH","ulk41faHir","HzZT88U2nU","GSQwjiwzGk","AmdQdIn3NS","QbxXcyToGW","FLsphNcICA","C2Irchi5X7","MGlTFRBhp0",
+"uupzkulk41","MmsIoBFkb8","pWiOsrhl0J","pvgjSIKxdL","euZA5sqVrf","VBjhzSmGzv","ksJbyd85a9","uPX7Guvf7A","WmadAlj07Q","QClRLfqypy",
+"EoToPxciqp","K20wKs7Mxk","xciqpStlDJ","OUqFMCp3mZ","J2mQiAmdQd","lm0pDqQxHP","I7p2aCK5W7","Gv3FqfaHir","s93MlFxX9q","zY1GY5Namm",
+"2ZHdkAIYUu","kZANmydG8U","FcWrWSjskQ","GSQwjF6PT2","7lUXZsqVrf","OUYuFZv7z0","cQOnvpvgjS","vOqCElweGy","fFDrJNhXdu","Pb1paYh1hF",
+"oGu6x5IhmG","TwanoTa8f6","gtCA5Nxx9V","AgJHQhi5X7","Chuy3s7Mxk","zHF1q7lUXZ","L7cGc9iGoT","Cfgr37fKYU","9GXkX07n1c","5Drn0Zv7z0",
+"Mm8siiqv4k","gIYvEuoStw","rhl0JRzaZA","6AFT0zbIYY","l83Udulk41","RzaZAzFgtB","KZamHZJTXH","UlU3M0MR5X","uAWypVjCZq","0ao3lvkCHH",
+"rz7UtQworu","WDVWJZUnqt","9XyT9SbRYy","QYxC0FNYIM","gjUTus7Mxk","OxWIHsoy9t","5VZjS0Wr5y","ix74rMaJQs","gtCA5kB5nP","QssNClH1kt",
+"tAOsrLewvM","ZuDtDO3iyQ","TwanouTacx","VLTy69rlg9","IBe8k0PktI","DcpWBlXFOB","MaJQstuDyS","EoToPXyPZN","Twano5VZjS","Oz8yZRsQUq",
+"9rlg9nlaBy","HRxd8Uvlv4","2NslmqQxHP","zmLYDzFgtB","EoToPFwEJz","oQ87rIKxdL","Yh1hFzQt6Q","LDk6fEOE1o","MmsIoSmGzv","NcICAnlaBy",
+"he9IAPYBf4","AkKTk2Nslm","Q6hMCjiVBP","CdyBV8cVD3","gIYvEt59lR","dpe1vM3zXL","fmIK1CIShG","ru4UGCIShG","LDk6fpmeCd","8cVD3Twano",
+"ru4UGxReec","pWiOs9GXkX","lH1ktv2eC3","zqH0WaFFss","ulk41QWxoT","piJSk45cIH","prNT6JRJQB","zmLYD8U2nU","RsQUqd7vjM","QChxsRzaZA",
+"WaWsv9XyT9","6AFT0s93Ml","8RCUAX6Pin","WDVWJNcICA","uPX7GFhtgl","0PktIv1Hln","a00b5Pb1pa","uZPqgtjQxs","ZJTXHzz4ZU","hSSvQ4dEz6",
+"pv0i7oVQp6","QnJ1S4QMc9","3weIFFnPFB","P6bcghi5X7","QClRLzY1GY","GXdoHSjskQ","SjskQ9eoRc","uZPqgP6bcg","FjHXRAXpwE","LewvMhE1Ql",
+"45cIHcQOnv","v1HlnRACuj","k85AeBGaQY","rhl0JNhXdu","azIWp0h1b1","iKqhrZzJHW","RACujzqH0W","0PktI2Nslm","vkCHHk85Ae","gIYvEOUYuF",
+"i3pydn1pmO","hE1Qlmz8gx","W7cTszHF1q","KASQ8CNHmv","WDVWJgdQsS","24ARFjeskS","LewvMNhXdu","KsjRKFFDui","LewvMni2v1","9iGoTs93Ml",
+"iwzGkvkCHH","LbRTHni2v1","ru4UGzqH0W","Pb1paSjskQ","sqVrfMmKGJ","OHaBzECMvU","lj07QMmsIo","6AFT0gdQsS","rKDLJcL0aE","618DiNOHsz",
+"FcWrWTXQ0Z","AmdQdaez9y","B3qemZv7z0","wiHrZIjTwP","bZLvS14FLR","hYBCKzmLYD","CK5W7Ss0Zu","he9IAZzJHW","0KyfsM6qcG","Ta8f63otm6",
+"yluBxrKDLJ","Ul4a1dmoS7","M3zXLix74r","brhlQ45cIH","7lUXZOz8yZ","HRxd8zz4ZU","Vprf2o8Uyd","kZANm618Di","14FLROUqFM","jtn0XFGzgp",
+"yToGWAkKTk","5nmWvFPfSE","No0QbOz8yZ","uJScXOUqFM","zFgtBJKWYR","DLhzMVerEA","tuDySqUJMd","5NammuQIcz","1LB1L29QAz","jeskSLewvM",
+"1LB1LogLgc","xReectlILt","M3zXLdQ586","kZANmhSSvQ","mz8gxlH1kt","07n1cvLsmS","FVMxoQWxoT","WDVWJFVMxo","tAOsrSjskQ","pFrrlsuY4x",
+"d7vjMS77LH","P6bcgYw2oU","pT8wuWDVWJ","FPfSExciqp","U3yw5tjQxs","wiHrZCxVEf","Q6hMCtl72W","YjB9tlH1kt","fmIK1sqVrf","t59lRVLTy6",
+"2hEEUtuDyS","soy9tsuY4x","wDajXBpYhV","VIlwPVerEA","6q6L9o8Uyd","55rfB0Kyfs","Ta8f6XflUq","cQOnvW7cTs","ReKEWRzaZA","wDajXi7WMQ",
+"tjQxspFrrl","RACuj2Yz7E","prNT6v2eC3","K4GS8QbxXc","BGaQYgjUTu","I7p2a5nmWv","Q6LixDz1R3","TCgPpogLgc","FcWrWl83Ud","16lHcKASQ8",
+"JkzUnNAFuw","yluBxi3pyd","uN6r3lXFOB","bgJAzI7p2a","OUYuFpv0i7","Gv3FqhUTw7","xciqp16lHc","MezSWfFDrJ","IBe8khe9IA","OHaBzKASQ8",
+"5Drn0RACuj","JXljWFFDui","hi5X7RACuj","VIlwP9GXkX","1j5L8tl72W","4W0TlfcwDa","yToGWC2Irc","s93MlVBjhz","jS1ajcL0aE","iB08lJJs5m",
+"zFgtBKZamH","2Yz7Ei7WMQ","faHirMaJQs","cShY25Drn0","ydG8UcmXIX","zqH0WmX2GE","0MR5XMm8si","iKqhryvOMI","KZamHUvlv4","HRxd8lweGy",
+"5VZjSBpYhV","HRxd8Yf2Ec","ni2v1WMiS3","jiVBP5ZaEz","RACuj580YD","gf8rIBCxeC","16lHcuvf7A","TCgPplViBv","CqqaDStlDJ","NAFuwksJby",
+"FPfSED6rBy","5iGN58xEKz","4W0TlazIWp","MK07YqaofN","v2eC3AmdQd","vOqCEFLsph","CqqaDThjNn","MK07YL7cGc","sx5GlQ6hMC","NAFuwMojnP",
+"ZhwG12Yz7E","oGu6xd85a9","aFFssCdyBV","Ta8f6cmXIX","ix74rZUnqt","wDajXdjsrv","CxVEf9y4lw","prNT6RmDcr","5Drn0jzUqR","Q6hMCru4UG",
+"GWqqXjfREu","ydG8UvkCHH","lH1kt5Drn0","l83UdYh1hF","Chuy3KASQ8","5ZaEzlH1kt","G1RhSbZLvS","a00b5ru4UG","KsjRKTCgPp","D6rByY1mC0",
+"WmadA5nmWv","SjskQjSjS3","ZJTXHGrDg7","KZamHMmKGJ","9rlg9In3NS","ni2v1uZPqg","0Wr5yPOUYS","9XyT9RpBQm","RACuj8RCUA","LewvMaFFss",
+"yToGW2Nslm","IBe8kZUnqt","soy9tiwzGk","n8pJ9pv0i7","v2eC3WaWsv","xXTI49GXkX","ru4UGqUJMd","uupzk9rlg9","8cVD3qQxHP","e6e4zRmDcr",
+"x3LDe48cHL","iwzGk45cIH","QChxscL0aE","C2Irc8xEKz","48cHLwDajX","Yw2oUWaim6","oQ87r55rfB","jSjS3Uvlv4","No0QbqaofN","oGu6xpFrrl",
+"Cp3mZh1zcH","TXQ0ZFPfSE","5VZjSQ6Lix","v2eC3HfyNQ","h1zcHQ6Lix","tlILtSs0Zu","k85AedQ586","7ku1ptaOXK","X6Pin7lUXZ","VBjhzvLsmS",
+"fcwDaO3iyQ","gtCA5FnPFB","OUqFMK4GS8","0ao3lECMvU","QnJ1SDG4sT","VjCZqru4UG","SbRYyfmIK1","0Wr5ytuDyS","DcpWBfFDrJ","2TRI7OxWIH",
+"ZJTXH8U2nU","fFDrJCqqaD","hYBCKzY1GY","xReeclm0pD","VerEAiqv4k","ogLgcChuy3","nlaByYw2oU","vkCHHDLhzM","uZPqgfmIK1","aL6AJfFDrJ",
+"8FmFHAkKTk","Z4I1vuLtKs","NhXdujfREu","Pb1paY1mC0","Oz8yZIBe8k","aFFssGWqqX","WPmlxRpBQm","qQxHPJKWYR","KASQ8BGaQY","8cVD37fsYM",
+"Rxrsms93Ml","ZhwG1gdQsS","Cp3mZ5Namm","Kr8ysrhl0J","lm0pDG1RhS","SmGzvfcJOy","G1RhSlCMxy","1v5hHuvf7A","7X3uyWreyP","HzZT85VZjS",
+"VIlwP3otm6","8TxD7AOgEe","v8yFNzqH0W","FwEJzprNT6","CIShGt98iW","7Ow5C0h1b1","lpF6W16lHc","9y4lwQnJ1S","xReecTXQ0Z","djsrvKASQ8",
+"cL0aEtjQxs","GSQwjDG4sT","YOfrYIRh48","Oz8yZKsjRK","tlILtMmsIo","0YAGHOUYuF","8TxD7lXFOB","JRJQBRBhp0","SjskQlpF6W","ciuWzxciqp",
+"dQ586ReKEW","9XyT9FNYIM","BbwgAiB08l","DcpWB6q6L9","SbRYyMaJQs","DQimpzFgtB","HfyNQd85a9","TCgPpUlU3M","I7p2aP6bcg","sqVrftvdkD",
+"nFqikmX2GE","bgJAzuoStw","5NammoQ87r","n1pmOOUqFM","CqqaD0PktI","guMb8KASQ8","C2IrctaOXK","yEfy9CqqaD","8TxD7FLsph","YjB9tIjTwP",
+"MojnPzbIYY","wiHrZRACuj","9eoRci3pyd","FnPFBsqVrf","guMb8e6e4z","lCMxyJ2mQi","Gv3Fq3otm6","AIYUuFcWrW","24ARFW7cTs","MojnP4dEz6",
+"cQOnvGXdoH","7X3uyYw2oU","uTacxYjB9t","YOfrYnnP8o","lkMUAaDGtS","n8pJ9VerEA","0KyfsOz8yZ","iB08l8hJdt","NAFuwRzaZA","F6PT2ZJTXH",
+"8FmFH0Wr5y","KZamHulk41","7ku1p24ARF","ZuDtDYw2oU","gjUTuiqv4k","VerEAHP433","mX2GEkB5nP","LewvMFFDui","l83UdhSSvQ","jeskSfmIK1",
+"LewvMJXljW","l83UdMmKGJ","lweGyxXTI4","0KyfstlILt","VBjhzv8yFN","NcICAYOfrY","KASQ82hEEU","BpYhVRkQke","4dEz6cmXIX","WDVWJ16lHc",
+"J2mQiprNT6","NAFuwlH1kt","okgRizmLYD","TwanoyEfy9","wiHrZSWfou","euZA57ku1p","Pb1paL7cGc","6q6L9rhl0J","CK5W7vOqCE","lXFOBuoStw",
+"yvOMIyvOMI","zbIYYYw2oU","MK07Y3otm6","RACujbrhlQ","618DiuLtKs","8cVD38TxD7","6AFT0MmsIo","P6bcgRsQUq","Dz1R3WDVWJ","ciuWzsqVrf",
+"lm0pDVjCZq","55rfBtuDyS","7lUXZtuDyS","2hEEUfmIK1","a00b5soy9t","lkMUAiwzGk","hE1QlogLgc","CIShGQbxXc","KASQ8gjUTu","FcWrWa00b5",
+"VerEAWMiS3","Gv3FqRkQke","HRxd80MR5X","5ZaEzLewvM","uJScXrz7Ut","1v5hHsqVrf","v8yFN0Kyfs","AXpwEFGzgp","aL6AJRkQke","9rlg9KASQ8",
+"FhtglnnP8o","hSSvQNo0Qb","QYxC0LbRTH","hYBCKd7vjM","QChxsXflUq","WMiS3soy9t","X6PinfmIK1","qaofNOUqFM","uupzk9y4lw","ciuWzzbIYY",
+"4W0Tlv1Hln","kB5nPhSSvQ","pvgjSwDajX","RkQkeAXpwE","d7vjMtjQxs","O3iyQjS1aj","X6PinFLsph","GrDg7jtn0X","48cHLx3LDe","IBe8kStlDJ",
+"tl72WFVMxo","JXljWaFFss","OxWIHLDk6f","RsQUqlXFOB","XflUqsoy9t","gjUTuPYBf4","iwzGk7ku1p","jiVBP29QAz","0h1b1bZLvS","C2IrcK20wK",
+"WMiS3JRJQB","aL6AJbZLvS","jS1ajiB08l","Yw2oUCxVEf","tvdkDjtn0X","n1pmOK20wK","o8UydnFqik","aFFssMmKGJ","XyPZNLDk6f","dQ586In3NS",
+"SmGzvtAOsr","MGlTFqaofN","lH1kt8FmFH","ru4UGQssNC","S77LHhi5X7","fFDrJSs0Zu","7Ow5C2ZHdk","WaWsvOHaBz","7lUXZi7WMQ","S2DfuVBjhz",
+"a00b5iqv4k","dhSuHStlDJ","RsQUq64s8N","VIlwPi3pyd","zqH0WDz1R3","dQ586M6qcG","UlU3Msoy9t","cShY2xReec","pWiOsWaWsv","jtn0XGWqqX",
+"dpe1vv8yFN","Mkgy8hE1Ql","n1pmOLbRTH","VerEAgIYvE","rhl0JzQt6Q","ydG8UYOfrY","e6e4zFhtgl","MmKGJ2TRI7","Waim6ogLgc","WPmlx07n1c",
+"yEfy95ZaEz","piJSkRACuj","uTacxjfREu","uZPqglkMUA","cL0aEciuWz","blLA95ZaEz","s93Mlru4UG","Z4I1v16lHc","okgRiCfgr3","7lUXZRACuj",
+"zmLYDciuWz","ThjNnG1RhS","0ao3lIBe8k","LbRTHQnJ1S","OxWIHPb1pa","VerEAQbxXc","mz8gxMm8si","jS1ajM3zXL","sqVrfsx5Gl","OxWIHhUTw7",
+"5drc6l83Ud","SWfouguMb8","ZJTXHQbxXc","ZhwG1FLsph","dpe1v2TRI7","NAFuws93Ml","JKWYRbgJAz","uQIczdQ586","wDajXDQimp","fcwDa9rlg9",
+"zQt6QOHaBz","AOgEeAXpwE","sqVrfeuZA5","HfyNQOUqFM","EOE1oYOfrY","pvgjShi5X7","Waim655rfB","YOfrYa00b5","Zv7z0gf8rI","HRxd8vOqCE",
+"C2Irc9rlg9","K20wKoQ87r","RsQUqjeskS","7fsYMv1Hln","m4bxU4dEz6","tuDyS2Yz7E","uupzkWPmlx","ReKEWZUnqt","tlILt24ARF","7Ow5CNcICA",
+"Rxrsmrhl0J","DQimpK4GS8","K4GS8mX2GE","G1RhS5iGN5","iB08lfmIK1","K20wKs4786","h1zcHuN6r3","07n1cNOHsz","QssNCJKWYR","uN6r3i7WMQ",
+"oGu6xuoStw","RsQUqhi5X7","Ss0Zu0Kyfs","oVQp6ru4UG","W7cTsaL6AJ","iKqhr580YD","yvOMIuAWyp","BbwgA0PktI","O3iyQBpYhV","VNCPdh1zcH",
+"brhlQI7p2a","Gv3FqQ6Lix","RACuj8FmFH","7X3uyrKDLJ","3otm6nnP8o","5ZaEzUvlv4","yEfy9uupzk","pWiOsCdyBV","rKDLJbZLvS","VIlwPFNYIM",
+"NOHszhSSvQ","QClRL9rlg9","kZANmIKxdL","vLsmSlkMUA","cQOnvNOHsz","RsQUq24ARF","JRJQBjfREu","W7cTsb29RJ","8RCUA0BmCy","pvgjSEOE1o",
+"jeskS9XyT9","s93Ml55rfB","vLsmSVIlwP","t59lRpFrrl","pT8wuBFkb8","cmXIXWmadA","0h1b1RBhp0","fLNg8lkMUA","Kr8ysCqqaD","IBe8k4dEz6",
+"C2IrcWDVWJ","Q6hMCSbRYy","J2mQiRACuj","8RCUAs7Mxk","P6bcghe9IA","0PktIrKDLJ","9XyT92ZHdk","gf8rIDz1R3","Pb1pav1Hln","4W0TlZuDtD",
+"K4GS8IBe8k","5IhmGblLA9","JRJQBMm8si","pvgjSB3qem","7fKYUrz7Ut","pFrrlChuy3","qQxHPmz8gx","NcICAfqypy","5VZjS8cVD3","JkzUnbgJAz",
+"580YDMm8si","pT8wu7X3uy","ThjNnpiJSk","OUYuFm4bxU","29QAzSs0Zu","7Ow5CtaOXK","rKDLJEdBKc","WPmlxvOqCE","FhtglReKEW","SmGzvAOgEe",
+"B3qemtAOsr","zz4ZUcQOnv","t59lRUvlv4","FhtglGXdoH","Chuy3Ta8f6","O3iyQVerEA","jfREuD6rBy","XflUq8hJdt","euZA5FcWrW","zFgtBK20wK",
+"Waim69rlg9","AXpwERACuj","rKDLJuLtKs","pFrrluQIcz","K20wKuLtKs","0YAGH1j5L8","NhXduokgRi","MaJQs0YAGH","QbxXcaez9y","Gv3FqSWfou",
+"VBjhzyofH3","QnJ1S2hEEU","taOXKOUqFM","BGaQY8cVD3","5NammYw2oU","fLNg85ZaEz","yToGWDz1R3","m4bxUIjTwP","gIYvEni2v1","IKxdLlCMxy",
+"POUYSNcICA","zQt6Qhi5X7","SWfouaL6AJ","guMb8MmsIo","qUJMd55rfB","cShY2yvOMI","AOgEeSs0Zu","d85a9hSSvQ","aez9yfmIK1","DQimpa00b5",
+"Q6hMCqaofN","P6bcgNAFuw","WDVWJ7lUXZ","NhXduwDajX","JXljWU3yw5","ni2v15Mg9r","Mm8siuJScX","Ta8f6nlaBy","GSQwj0h1b1","gf8rIfcJOy",
+"FxX9qNAFuw","WDVWJ2hEEU","oVQp6m4bxU","618DiFwEJz","ReKEW1LB1L","2hEEUAXpwE","Chuy329QAz","yofH3QYxC0","n1pmOfcwDa","CqqaDhYBCK",
+"K4GS85iGN5","d85a9sqVrf","29QAzhe9IA","ogLgcoGu6x","HfyNQ1v5hH","yvOMIFGzgp","uJScXFwEJz","0YAGHWmadA","2TRI7HzZT8","aez9yUl4a1",
+"l83UdpAhR1","MmKGJQworu","wDajXHfyNQ","MK07YMmsIo","NAFuwiqv4k","uAWypx3LDe","lH1kt5VZjS","xReecThjNn","b29RJk85Ae","TCgPpF6PT2",
+"4dEz6m4bxU","yvOMIzFgtB","5Mg9r5Mg9r","MezSWuN6r3","dpe1vTXQ0Z","TwanoDQimp","F6PT2uJScX","zbIYYFnPFB","pvgjSQworu","16lHclm0pD",
+"SmGzvkZANm","3otm6qUJMd","b29RJpWiOs","Yf2EcRBhp0","DG4sTM3zXL","pvgjS9XyT9","7Ow5C7fsYM","aDGtSQ6hMC","2ZHdkD6rBy","lXFOBxReec",
+"K20wKsuY4x","IKxdLWaWsv","n1pmO1v5hH","x3LDeRxrsm","8hJdtIjTwP","OHaBzVBjhz","fcJOyFVMxo","OUqFMlH1kt","POUYSIBe8k","atef216lHc",
+"YjB9tbrhlQ","LDk6f9rlg9","uJScXpmeCd","FGzgpNOHsz","jfREucL0aE","9y4lw5nmWv","JkzUnzmLYD","xciqpTCgPp","Waim6qUJMd","24ARFO3iyQ",
+"580YDFjHXR","zmLYD4QMc9","lj07Q9iGoT","lweGyIKxdL","8hJdtG1RhS","lj07QQClRL","cmXIXIjTwP","FVMxod7vjM","oGu6xaez9y","2ZHdkCdyBV",
+"fcJOylj07Q","VLTy6618Di","v1HlnQ6Lix","RsQUqt59lR","iB08lSs0Zu","NAFuwaez9y","FhtglaDGtS","NhXduM3zXL","yEfy9OxWIH","pmeCdEOE1o",
+"EdBKcGv3Fq","XyPZN7fKYU","tjQxsOUqFM","IKxdLuupzk","QnJ1Sv1Hln","5nmWvblLA9","QnJ1SiKqhr","VIlwPZJTXH","aFFssCNHmv","16lHcIjTwP",
+"29QAzi7WMQ","i7WMQdpe1v","lj07QvLsmS","D6rBycmXIX","prNT6C2Irc","2ZHdkWaWsv","guMb8QWxoT","VIlwPlm0pD","k85AeMojnP","zbIYYuupzk",
+"RpBQmCdyBV","S77LHAkKTk","Y1mC0OHaBz","brhlQWreyP","bgJAztl72W","WDVWJtuDyS","l83UdK4GS8","jiVBPpvgjS","8TxD7BbwgA","FPfSEzY1GY",
+"2DREshe9IA","v1HlnJIqXi","Q6hMCtjQxs","ThjNnSbRYy","KsjRKgf8rI","m4bxUMezSW","QClRLMojnP","AOgEeQbxXc","HRxd8xXTI4","FwEJzDcpWB",
+"F6PT2YOfrY","dmoS7SWfou","FjHXRTa8f6","wDajXfcJOy","FVMxoBpYhV","Cp3mZCIShG","5VZjSHlUbF","Yw2oUrhl0J","i3pyd8RCUA","iKqhrDz1R3",
+"aDGtSoVQp6","vLsmSMkgy8","2NslmOxWIH","KASQ8FxX9q","k85Ae9eoRc","qQxHPpT8wu","8xEKzWDVWJ","fFDrJd85a9","hE1QlLDk6f","d7vjMYf2Ec",
+"tvdkDFGzgp","9rlg9ZzJHW","fmIK1SWfou","dpe1vguMb8","8cVD3uJScX","AkKTkMojnP","wiHrZBCxeC","HlUbFQ6hMC","uoStwx3LDe","uJScXlH1kt",
+"pFrrlJ2mQi","7Ow5Cl83Ud","OUYuF45cIH","YOfrYHRxd8","hSSvQRkQke","W7cTsn8pJ9","wDajXgIYvE","FVMxofmIK1","1j5L8PYBf4","pv0i7soy9t",
+"RsQUqU3yw5","45cIH0Kyfs","ogLgcjfREu","jzUqR5VZjS","ni2v1tAOsr","S2DfuZUnqt","RACujy94nw","jfREuUl4a1","cL0aEoVQp6","t59lRJIqXi",
+"8TxD7yEfy9","VLTy6HP433","5iGN5wDajX","zmLYDpiJSk","pmeCdMK07Y","ZzJHWtjQxs","ogLgcCK5W7","9XyT9tjQxs","DcpWBIn3NS","rhl0JSjskQ",
+"v2eC3oVQp6","9GXkXLbRTH","Cfgr316lHc","faHirnFqik","jfREuHzZT8","cmXIXXflUq","hSSvQuZPqg","5drc6CNHmv","LDk6ffaHir","gf8rI7Ow5C",
+"GXdoHXflUq","sqVrf5drc6","jSjS34QMc9","618DiIBe8k","s4786HlUbF","7fsYMlXFOB","s7MxkCfgr3","xciqpZUnqt","DLhzMe6e4z","pAhR19iGoT",
+"8FmFH9rlg9","Ta8f6guMb8","a00b5pWiOs","2DREsWPmlx","zQt6Q8FmFH","guMb87fKYU","9XyT9lj07Q","64s8NkB5nP","0h1b1yEfy9","jfREurz7Ut",
+"BpYhVtlILt","lViBvzFgtB","hYBCKtAOsr","IKxdLDG4sT","OUYuFlViBv","wDajX7hyVv","Ul4a1CxVEf","WDVWJOxWIH","ru4UGaFFss","QClRL2Nslm",
+"5drc6VLTy6","UlU3MRxrsm","VIlwPlsQGo","EOE1oDLhzM","hE1QlDz1R3","tl72Wiqv4k","Mkgy8rz7Ut","OxWIHgjUTu","KZamHlm0pD","oVQp6zz4ZU",
+"lweGyJRJQB","y94nwCIShG","9GXkX9iGoT","LDk6f3otm6","QnJ1SGSQwj","Ul4a1aDGtS","5Drn0RmDcr","jeskSdmoS7","QnJ1SEoToP","TCgPp0h1b1",
+"OUqFMcmXIX","pFrrlyluBx","gtCA5RACuj","X6Pintl72W","uoStwpFrrl","MGlTFl83Ud","kB5nPDLhzM","0YAGHRACuj","fmIK1hSSvQ","5Nammdpe1v",
+"VBjhzk85Ae","nlaBypAhR1","n1pmOuLtKs","YOfrYe6e4z","nlaByzz4ZU","jfREuuQIcz","29QAzzz4ZU","uQIczzY1GY","Zv7z0yluBx","2NslmbZLvS",
+"9y4lwS77LH","hi5X7iB08l","MezSWPYBf4","KZamHMojnP","FwEJzGWqqX","lkMUAVjCZq","7hyVvAgJHQ","jiVBPiB08l","dQ586FVMxo","KsjRK5Mg9r",
+"zmLYD7ku1p","HfyNQ4W0Tl","zqH0WcShY2","Q6hMC2Nslm","ciuWzjS1aj","4W0TlVBjhz","ogLgc64s8N","RzaZAWreyP","EOE1oiqv4k","uZPqgCNHmv",
+"WreyPKZamH","8hJdtQYxC0","SbRYyaDGtS","RkQke8FmFH","TCgPpYOfrY","fcwDacmXIX","fcJOyRpBQm","CdyBVW7cTs","nnP8oVerEA","fmIK1W3VFH",
+"I7p2aaez9y","jfREupmeCd","Qworui7WMQ","gIYvERsQUq","prNT6lXFOB","Kr8ys9rlg9","SbRYyblLA9","WmadAwiHrZ","No0QbvOqCE","3otm6GXdoH",
+"6q6L9qUJMd","W3VFHsx5Gl","qaofN5IhmG","YjB9tUl4a1","pT8wuLDk6f","lXFOBnFqik","fcwDa580YD","9eoRcaL6AJ","0h1b1zbIYY","FjHXR7fKYU",
+"G1RhSni2v1","QssNCpiJSk","7X3uymz8gx","brhlQdpe1v","2hEEUhUTw7","4dEz6KsjRK","7fKYU5Mg9r","8RCUA2Nslm","No0QbiKqhr","JIqXi5ZaEz",
+"9GXkXMmKGJ","64s8Nk85Ae","MmKGJzQt6Q","prNT6ReKEW","dpe1vBpYhV","jzUqRUmaEv","vkCHH6q6L9","K4GS8XflUq","7fKYU0YAGH","C2Ircv2eC3",
+"WmadAK20wK","45cIHuLtKs","MojnPuZPqg","zY1GYxciqp","wDajXsx5Gl","dpe1vv1Hln","G1RhSjzUqR","5Drn09eoRc","pWiOsjzUqR","KZamH618Di",
+"29QAzksJby","64s8NJRJQB","Ul4a1gdQsS","8cVD3qUJMd","v2eC3fLNg8","7fsYM64s8N","xReecW3VFH","ZuDtDnlaBy","W3VFHAIYUu","7lUXZjeskS",
+"MaJQsQssNC","lH1kt7fsYM","ciuWz7hyVv","pv0i7HzZT8","HfyNQVerEA","G1RhSUvlv4","9GXkXs93Ml","DQimpVBjhz","EOE1opFrrl","d85a9RpBQm",
+"taOXKpFrrl","7ku1pogLgc","l83Ud2TRI7","y94nwv8yFN","rhl0JStlDJ","hE1QlZ4I1v","WaWsvv2eC3","5IhmGhYBCK","0BmCy2TRI7","pT8wufaHir",
+"CIShGCK5W7","MK07YLDk6f","xciqp8RCUA","TCgPpdhSuH","FnPFBP6bcg","y94nwBbwgA","OUqFMrz7Ut","QChxsYw2oU","AmdQdo8Uyd","brhlQStlDJ",
+"EOE1o7fsYM","LbRTHcQOnv","TwanoGSQwj","BpYhVRmDcr","DcpWBcShY2","ZuDtDNOHsz","WMiS3cQOnv","ZzJHW8RCUA","RACujlpF6W","ZuDtD5Namm",
+"W7cTsNAFuw","BpYhVFwEJz","WDVWJCdyBV","ni2v1suY4x","jiVBPcL0aE","48cHLxReec","zqH0WDLhzM","ciuWz0PktI","tjQxsDQimp","QChxsAXpwE",
+"mX2GE8hJdt","EdBKcAgJHQ","FFDuiWPmlx","rhl0JguMb8","qQxHPQssNC","BbwgA0Wr5y","bZLvS9y4lw","uupzkOz8yZ","cShY2YjB9t","taOXKpiJSk",
+"pvgjSCdyBV","K20wKWaim6","uTacx4QMc9","4W0Tl29QAz","v1Hln8TxD7","hUTw7fqypy","lweGyix74r","KsjRKKsjRK","v2eC3BGaQY","xReecydG8U",
+"rz7UtmX2GE","FVMxosx5Gl","hUTw71LB1L","0Wr5y2TRI7","uQIczjtn0X","O3iyQ2Yz7E","pFrrloQ87r","l83UdiB08l","atef2Kr8ys","WMiS3oQ87r",
+"guMb8fcwDa","IBe8kVNCPd","cShY2kB5nP","b29RJdQ586","mz8gx3weIF","xReeczQt6Q","uJScXpvgjS","48cHLvLsmS","wDajX16lHc","NAFuwYOfrY",
+"HP4338RCUA","s93MlDLhzM","uupzkNcICA","RmDcrulk41","i7WMQQssNC","soy9ttaOXK","OxWIH618Di","MmKGJLDk6f","AkKTkDz1R3","bZLvSuJScX",
+"Z4I1v64s8N","EoToPpvgjS","WaWsvY1mC0","wiHrZ9eoRc","4W0TlSWfou","aDGtSMaJQs","d7vjM64s8N","RpBQmHzZT8","Chuy39XyT9","Pb1patl72W",
+"7ku1p5IhmG","JKWYRFPfSE","6AFT0iB08l","VNCPdVLTy6","2hEEU5nmWv","RmDcrokgRi","Z4I1vXyPZN","W7cTsUlU3M","cQOnvXyPZN","yofH3qUJMd",
+"uoStw8U2nU","zz4ZUtjQxs","gtCA5JkzUn","Oz8yZy94nw","RsQUqKASQ8","gf8rIcShY2","uupzkCIShG","JJs5mfLNg8","FwEJzI7p2a","rhl0JpvgjS",
+"NAFuwuoStw","s7Mxk2DREs","DcpWBZJTXH","hUTw7FnPFB","RpBQm8RCUA","CxVEfoGu6x","uLtKsK4GS8","JXljWnlaBy","7fsYMfcwDa","uoStw2Nslm",
+"8cVD3uZPqg","vLsmSRxrsm","8hJdt8RCUA","I7p2aAXpwE","k85AeECMvU","DQimpbgJAz","qUJMdru4UG","CNHmvReKEW","AgJHQuZPqg","HP4330ao3l",
+"iKqhrFVMxo","sx5GlvLsmS","faHirpvgjS","M6qcGEOE1o","dpe1vCxVEf","kB5nP5Drn0","NAFuwBpYhV","RsQUqVNCPd","2NslmFwEJz","zz4ZUksJby",
+"5NammMK07Y","WmadAjiVBP","lpF6W5VZjS","LDk6fDLhzM","FGzgpMaJQs","k85AeydG8U","W3VFHHzZT8","YjB9tuJScX","ciuWzjiVBP","MaJQsVerEA",
+"BbwgAKASQ8","G1RhSRpBQm","Mm8si5drc6","ni2v1RpBQm","P6bcgU3yw5","TwanokZANm","Chuy3G1RhS","Mkgy8fmIK1","4dEz6DQimp","gtCA5MmsIo",
+"4W0Tl7X3uy","suY4xCqqaD","RxrsmLbRTH","JRJQBn1pmO","hi5X7SWfou","v2eC3VjCZq","uvf7AVNCPd","qUJMdECMvU","i7WMQpT8wu","a00b5gdQsS",
+"zbIYYokgRi","BGaQYVerEA","RsQUq0Wr5y","3weIFRmDcr","7Ow5CAOgEe","Waim6NAFuw","7lUXZguMb8","SjskQYjB9t","wDajXbrhlQ","lpF6WFxX9q",
+"2NslmVerEA","tlILtQYxC0","2hEEUcL0aE","uQIczv1Hln","xXTI4K4GS8","Gv3Fq1LB1L","hi5X70BmCy","8FmFHrz7Ut","tjQxszmLYD","GSQwjcmXIX",
+"k85Aea00b5","ydG8UmX2GE","VerEAP6bcg","MmsIo64s8N","0Wr5yaFFss","zbIYYJkzUn","rKDLJZJTXH","GXdoHFPfSE","8U2nUuJScX","SbRYyHfyNQ",
+"fLNg8xReec","WMiS3FPfSE","0h1b1cL0aE","YjB9tiqv4k","VjCZqC2Irc","n8pJ9In3NS","pFrrlDQimp","SmGzvpAhR1","Cfgr32Yz7E","taOXK8cVD3",
+"EoToPnlaBy","WDVWJQbxXc","BFkb89rlg9","Dz1R3QbxXc","IBe8kGXdoH","QnJ1Sulk41","45cIHF6PT2","K20wKbZLvS","wDajXIRh48","IBe8kVjCZq",
+"jfREuuN6r3","BCxeCRxrsm","guMb8StlDJ","lViBvnnP8o","t98iWBFkb8","M6qcG2TRI7","0MR5XpvgjS","1LB1LzmLYD","gdQsSFwEJz","lm0pDM3zXL",
+"gtCA50MR5X","jS1ajyluBx","MK07YQnJ1S","FcWrWCp3mZ","hE1QlbrhlQ","lweGyJJs5m","FFDuiWDVWJ","CxVEfRxrsm","tvdkD7fsYM","tuDySVNCPd",
+"TXQ0ZpWiOs","Gv3FqMkgy8","VIlwPQssNC","EOE1oix74r","pFrrl48cHL","qaofNQYxC0","ReKEWBFkb8","ZUnqt5nmWv","UmaEvMmsIo","8RCUAIBe8k",
+"ix74rGSQwj","n1pmOgdQsS","DLhzMAOgEe","MmsIo9iGoT","he9IAoGu6x","uTacxfcwDa","X6PinJkzUn","8TxD7CK5W7","8FmFHlpF6W","ZJTXH9y4lw",
+"0Kyfslm0pD","pmeCdDQimp","m4bxUoVQp6","Kr8ys8cVD3","S2DfuJJs5m","o8UydIBe8k","cQOnvIn3NS","uZPqgdhSuH","Fhtglt59lR","sqVrfNAFuw",
+"sx5GlC2Irc","nFqikAOgEe","StlDJjtn0X","AmdQdSmGzv","nlaByWMiS3","5nmWvCIShG","oGu6xfqypy","AIYUuprNT6","7Ow5Cv1Hln","uvf7AsqVrf",
+"9rlg9Q6Lix","FnPFBtlILt","vOqCEQ6hMC","8xEKzEdBKc","oGu6xIRh48","24ARFtlILt","3otm6kB5nP","e6e4z2DREs","ECMvU45cIH","x3LDeHfyNQ",
+"hUTw75drc6","OxWIHM3zXL","JkzUnIn3NS","9XyT99iGoT","prNT6s93Ml","uQIczZv7z0","d85a9suY4x","uAWyppWiOs","GrDg745cIH","StlDJlsQGo",
+"QssNC4QMc9","3otm6jiVBP","s4786yofH3","QssNChe9IA","fcJOyFPfSE","lweGylpF6W","okgRiTwano","vkCHHVBjhz","dQ586uJScX","uLtKsQYxC0",
+"M6qcGJKWYR","C2Irch1zcH","i7WMQXflUq","2Yz7E5drc6","GXdoHLDk6f","PYBf4pv0i7","uvf7AyEfy9","ZUnqttAOsr","GSQwjWmadA","ZhwG1M6qcG",
+"yluBxYw2oU","2ZHdklCMxy","B3qemgIYvE","In3NSSjskQ","2Yz7Eni2v1","xXTI4rhl0J","W3VFH5Drn0","NhXduMmsIo","2hEEUdjsrv","9XyT9Rxrsm",
+"RBhp07X3uy","OUYuFaDGtS","OUYuFWMiS3","qUJMddpe1v","aL6AJqaofN","n8pJ964s8N","ix74rOz8yZ","xReecoGu6x","QnJ1SAgJHQ","dQ586BpYhV",
+"jeskSB3qem","AIYUuFFDui","2Yz7EgdQsS","s47867Ow5C","BCxeCfaHir","HfyNQSWfou","Q6hMCQClRL","9iGoTvOqCE","MmsIowiHrZ","2TRI7he9IA",
+"brhlQv8yFN","ix74rd85a9","M6qcGqUJMd","uupzkLewvM","45cIHprNT6","P6bcg6AFT0","C2IrcqaofN","hSSvQFNYIM","POUYSkZANm","DLhzM0ao3l",
+"Kr8ysqaofN","5IhmGM3zXL","uLtKsRACuj","StlDJQ6Lix","Kr8ysS77LH","OHaBz0Wr5y","pvgjSZv7z0","zFgtBVNCPd","WPmlxyEfy9","pvgjSUlU3M",
+"JXljWDz1R3","FnPFBazIWp","uTacxrKDLJ","Pb1paoVQp6","YOfrYh1zcH","Chuy3HP433","DLhzMjzUqR","NcICA2Nslm","i3pyd1j5L8","i7WMQF6PT2",
+"MGlTFtaOXK","KASQ8zQt6Q","fmIK1lXFOB","TXQ0Zuvf7A","F6PT224ARF","FNYIMhUTw7","EdBKcpWiOs","tl72WHzZT8","POUYSguMb8","8FmFH9y4lw",
+"rhl0JazIWp","gIYvEhe9IA","rhl0JI7p2a","2hEEUuZPqg","uN6r33weIF","i3pydQnJ1S","5VZjShYBCK","5Drn0CxVEf","bZLvSVLTy6","oQ87rFcWrW",
+"QClRLi7WMQ","e6e4zguMb8","BGaQYPYBf4","7Ow5C14FLR","soy9tuJScX","5ZaEzW7cTs","qUJMdoQ87r","e6e4zEOE1o","9y4lw0MR5X","1j5L8KZamH",
+"2hEEUyEfy9","6AFT0HlUbF","lViBvlCMxy","nlaByFLsph","gdQsSFNYIM","07n1cB3qem","ZUnqt24ARF","FGzgpQ6hMC","Yh1hFmX2GE","MGlTFGXdoH",
+"U3yw5Pb1pa","LewvMWMiS3","v2eC3ru4UG","aez9yiqv4k","jS1ajbgJAz","4QMc9soy9t","HP433MK07Y","2hEEUxReec","uLtKsDG4sT","sx5Glk85Ae",
+"B3qemix74r","HRxd8nlaBy","t98iWuPX7G","0h1b1FPfSE","pWiOs5drc6","IBe8k5Mg9r","i3pyd2Nslm","7hyVv6q6L9","O3iyQ6q6L9","NhXduQssNC",
+"brhlQaDGtS","suY4xgdQsS","azIWp0ao3l","UlU3MfFDrJ","4dEz6SWfou","QWxoTZv7z0","ZuDtDDQimp","rz7UtAmdQd","hYBCKtjQxs","8FmFHFcWrW",
+"euZA5L7cGc","RpBQmi3pyd","tvdkDPYBf4","yToGW5iGN5","M3zXLgjUTu","MojnP2Nslm","RACuj55rfB","F6PT2prNT6","JkzUnIjTwP","vLsmS1j5L8",
+"HzZT8lCMxy","gjUTuvOqCE","lkMUAAkKTk","guMb8W7cTs","FNYIMsuY4x","EOE1oLewvM","580YD14FLR","pmeCdvOqCE","uvf7AMkgy8","piJSkd85a9",
+"Cp3mZOz8yZ","9eoRcBFkb8","LDk6fdjsrv","CqqaD7fsYM","LewvMVIlwP","K20wKOUYuF","8hJdtnnP8o","gf8rIX6Pin","ulk41XflUq","No0QbnlaBy",
+"F6PT2AgJHQ","uJScX55rfB","6q6L9yluBx","tl72WRpBQm","MK07Y2Yz7E","l83Ud8hJdt","Yf2EcuQIcz","SbRYytvdkD","0KyfsUlU3M","zFgtB580YD",
+"wDajXvLsmS","qUJMdy94nw","n8pJ9hE1Ql","aL6AJRBhp0","d7vjMRBhp0","Uvlv4Zv7z0","dhSuHPb1pa","W7cTspmeCd","pvgjS5ZaEz","Z4I1v0Wr5y",
+"CNHmvY1mC0","2Nslme6e4z","qQxHP5VZjS","gf8rIuTacx","sqVrf45cIH","kZANmOUYuF","AgJHQW7cTs","2Yz7E1LB1L","Chuy3VIlwP","tjQxsDz1R3",
+"2Yz7E7X3uy","OUYuFB3qem","atef2IRh48","kB5nPzz4ZU","oGu6xuupzk","s4786s93Ml","0MR5X3otm6","ydG8UAmdQd","cL0aEpv0i7","cShY2OHaBz",
+"7fsYMatef2","mz8gxgjUTu","suY4xZJTXH","BpYhVdpe1v","FLsphjSjS3","XflUq07n1c","ZzJHWn1pmO","MK07Y64s8N","gtCA5nlaBy","yofH3Oz8yZ",
+"TwanouLtKs","8TxD7Chuy3","s4786nlaBy","lViBv48cHL","0YAGH7ku1p","5IhmG7lUXZ","s7MxkMojnP","J2mQiAgJHQ","MmsIoh1zcH","Vprf2ThjNn",
+"jtn0XRzaZA","L7cGcYjB9t","zQt6QYh1hF","8hJdtThjNn","5ZaEzCK5W7","JXljWOxWIH","jzUqRqUJMd","uZPqg0Kyfs","EoToP8hJdt","Nxx9VMmKGJ",
+"YOfrYFVMxo","W7cTsUmaEv","Kr8ysFwEJz","jzUqR7fKYU","FwEJzhi5X7","yToGWpiJSk","soy9tjfREu","iqv4kAXpwE","2DREsNOHsz","WMiS3zHF1q",
+"KsjRKGXdoH","L7cGcEoToP","SmGzv2Nslm","0YAGH7fsYM","KZamHCIShG","45cIHlweGy","zQt6Qrz7Ut","uvf7ANhXdu","rz7Ut5Drn0","zqH0Wd7vjM",
+"2DREsWreyP","JIqXipWiOs","MmKGJO3iyQ","8RCUAQssNC","FVMxoCNHmv","8FmFHFjHXR","Ss0ZuaL6AJ","s93MlCfgr3","AkKTkb29RJ","aez9yPb1pa",
+"cShY2S2Dfu","C2Irc2DREs","wDajXTwano","ZUnqtGWqqX","RsQUqYw2oU","suY4xS2Dfu","x3LDeYOfrY","8xEKzKZamH","LewvMWreyP","Y1mC0rz7Ut",
+"WPmlxs7Mxk","e6e4zZzJHW","QworuyofH3","AIYUubZLvS","7fsYMcShY2","RzaZAFhtgl","djsrv9y4lw","suY4xcmXIX","taOXKnnP8o","1LB1LksJby",
+"uJScXjiVBP","s7MxkVprf2","W7cTsXyPZN","a00b5lpF6W","pT8wu0h1b1","Yw2oURzaZA","1v5hHJ2mQi","2DREslsQGo","kZANmfaHir","tlILt0YAGH",
+"uTacxvkCHH","Z4I1vZJTXH","ZzJHWbrhlQ","1LB1LK4GS8","ECMvU2hEEU","9rlg9fcwDa","atef2k85Ae","7hyVvs7Mxk","rz7UthUTw7","580YDb29RJ",
+"BbwgA1j5L8","lweGy5Mg9r","jiVBPcmXIX","RsQUqMmsIo","8cVD3zY1GY","OUYuFC2Irc","SjskQy94nw","v8yFNguMb8","3otm6PYBf4","IKxdLHRxd8",
+"x3LDeLDk6f","soy9tVIlwP","yofH3soy9t","I7p2aRmDcr","taOXK29QAz","WDVWJ64s8N","ZuDtDKsjRK","uoStwIjTwP","aez9yuLtKs","8cVD31v5hH",
+"x3LDeUmaEv","ciuWz9XyT9","8FmFHzz4ZU","FnPFBRACuj","WaWsvBFkb8","ydG8UwiHrZ","Zv7z0hi5X7","G1RhSVerEA","GSQwjfLNg8","MezSWEdBKc",
+"BbwgAwiHrZ","QChxsZ4I1v","W3VFH618Di","zQt6QaDGtS","ThjNnqUJMd","suY4xhSSvQ","IKxdLtAOsr","Ss0ZuPOUYS","he9IA0Kyfs","piJSkjSjS3",
+"tvdkD8xEKz","4W0Tl8cVD3","lpF6W2Nslm","HfyNQCdyBV","RsQUq1j5L8","zmLYD3weIF","3otm6ulk41","v2eC3AOgEe","6q6L9ZhwG1","MmKGJ5Mg9r",
+"ECMvU4QMc9","azIWp5ZaEz","dQ586IjTwP","0KyfsBpYhV","Cp3mZokgRi","jS1ajpAhR1","faHirlweGy","64s8NtuDyS","Dz1R3s4786","YOfrYhe9IA",
+"dpe1vrKDLJ","RxrsmyofH3","sx5GlaFFss","In3NSZhwG1","9XyT9Dz1R3","8hJdtDz1R3","hSSvQWDVWJ","4dEz6v2eC3","5drc6qQxHP","2Yz7EAgJHQ",
+"ZuDtD29QAz","s7MxkblLA9","RzaZA8TxD7","CxVEfgf8rI","uPX7GqaofN","v1HlnFhtgl","okgRiblLA9","5NammsqVrf","IKxdL0Kyfs","cL0aEpiJSk",
+"JJs5mzz4ZU","XyPZNFPfSE","7hyVvvLsmS","yEfy9FnPFB","Zv7z0fqypy","jeskSQbxXc","RxrsmlCMxy","he9IACp3mZ","W3VFHpWiOs","Kr8ys4QMc9",
+"MK07YtuDyS","uoStw9eoRc","QChxstjQxs","e6e4zb29RJ","WMiS3LDk6f","pmeCd8FmFH","pv0i7Fhtgl","CxVEfK20wK","9GXkXaFFss","Q6hMCCK5W7",
+"MojnPB3qem","uZPqgl83Ud","zFgtBblLA9","YjB9tZuDtD","IBe8kgdQsS","8TxD7MojnP","0ao3lzmLYD","5nmWvNo0Qb","JkzUnChuy3","tjQxsuupzk",
+"YjB9twiHrZ","fcJOyzz4ZU","b29RJzY1GY","2NslmOUYuF","y94nwNhXdu","Nxx9VgtCA5","bZLvS7X3uy","7X3uyt59lR","fLNg82DREs","rKDLJ9y4lw",
+"QnJ1StlILt","rhl0JMkgy8","7ku1pK20wK","8FmFHt98iW","lViBv5iGN5","Dz1R3jfREu","JIqXitjQxs","pv0i7MK07Y","FnPFBt59lR","blLA9FxX9q",
+"C2IrcMGlTF","8cVD39rlg9","pv0i7ogLgc","nnP8odmoS7","FFDuidpe1v","o8Uyd9rlg9","wiHrZydG8U","uN6r3MGlTF","CNHmvFFDui","oQ87rpvgjS",
+"OxWIH2Nslm","Z4I1vQnJ1S","O3iyQjSjS3","tl72Waez9y","uTacxM6qcG","euZA507n1c","SmGzv0YAGH","uZPqgyluBx","QnJ1ScShY2","9GXkX2TRI7",
+"MojnPQChxs","L7cGcGXdoH","e6e4zRpBQm","QssNCGWqqX","EoToPBGaQY","oQ87r9rlg9","fmIK1K20wK","P6bcgtlILt","i7WMQ7X3uy","LbRTHyEfy9",
+"K4GS8hE1Ql","RACujMK07Y","xciqpIjTwP","ZJTXHOz8yZ","pAhR1he9IA","FGzgpWaim6","oVQp6x3LDe","pWiOszbIYY","jfREu0PktI","pvgjSAmdQd",
+"wDajXZv7z0","zY1GY1v5hH","5drc6BpYhV","2ZHdkDcpWB","NOHsz7X3uy","dpe1vFcWrW","RmDcrzFgtB","AOgEe0Kyfs","yToGW8U2nU","x3LDemX2GE",
+"SmGzvKZamH","5ZaEzFVMxo","pWiOs24ARF","7fsYMMK07Y","HP433NOHsz","vOqCECK5W7","D6rByQYxC0","aFFssRsQUq","y94nwfcwDa","6AFT0SbRYy",
+"ulk41SmGzv","JRJQBCK5W7","l83Ude6e4z","Dz1R3Pb1pa","ksJbyx3LDe","3otm6CqqaD","2ZHdkUl4a1","QbxXcQssNC","9y4lwfqypy","S2DfuZzJHW",
+"yToGWZv7z0","EoToPqQxHP","KZamHmz8gx","8TxD7fcJOy","gf8rI5nmWv","5VZjSAIYUu","9rlg98TxD7","RkQke9iGoT","ZzJHW4QMc9","ReKEWFLsph",
+"nlaBypvgjS","Yh1hFl83Ud","GrDg7JJs5m","Gv3FqbZLvS","o8Uydx3LDe","B3qemQWxoT","7fKYUdpe1v","ReKEWVLTy6","i3pydFLsph","k85AeLbRTH",
+"hi5X7zY1GY","fFDrJCp3mZ","jS1ajxciqp","blLA9ThjNn","HzZT8pWiOs","h1zcHK4GS8","a00b5QbxXc","pFrrliB08l","kB5nP580YD","gdQsS9rlg9",
+"JkzUnyEfy9","ZUnqt1LB1L","8FmFHvLsmS","pWiOsLewvM","OxWIHRkQke","RsQUquN6r3","9GXkXJ2mQi","6AFT0e6e4z","AIYUuazIWp","yluBxrhl0J",
+"64s8NFPfSE","MmsIoQChxs","jfREuatef2","K4GS8dQ586","oVQp6TCgPp","StlDJGrDg7","IKxdLM6qcG","Gv3FqlCMxy","JXljWi3pyd","jSjS3JXljW",
+"Z4I1vBGaQY","ix74rIjTwP","AgJHQSmGzv","Cp3mZB3qem","TXQ0ZazIWp","7fsYM7X3uy","7lUXZ580YD","GSQwjrhl0J","0BmCyiB08l","5VZjSqUJMd",
+"5Drn0dhSuH","euZA5JRJQB","RmDcr0MR5X","RACujv8yFN","lpF6W7Ow5C","8xEKze6e4z","StlDJuLtKs","jzUqRZJTXH","07n1c29QAz","AXpwE9GXkX",
+"8hJdtyluBx","B3qemtaOXK","k85Aehe9IA","TXQ0ZP6bcg","FNYIMsqVrf","9y4lwzHF1q","DcpWBWmadA","rhl0JlweGy","G1RhSCfgr3","SbRYyfFDrJ",
+"iqv4kDLhzM","HlUbF2Yz7E","0MR5XaFFss","8xEKzcmXIX","WreyP6AFT0","QYxC0RACuj","48cHLOUYuF","he9IA2DREs","pAhR1CNHmv","MojnPZ4I1v",
+"vkCHHPYBf4","Ta8f6VerEA","MojnPMGlTF","fcJOyxciqp","Ta8f61v5hH","ZuDtDwDajX","NOHszJRJQB","dhSuH580YD","2Yz7EVNCPd","Dz1R3W7cTs",
+"IBe8kmX2GE","piJSk1LB1L","Q6LixReKEW","pT8wuTCgPp","tvdkDJ2mQi","VerEA0BmCy","HP433Yf2Ec","KASQ8WMiS3","5Drn0NcICA","Zv7z02TRI7",
+"x3LDeVLTy6","rhl0JWaim6","s4786hSSvQ","lm0pDHP433","0ao3lBbwgA","zqH0WCdyBV","bgJAz1j5L8","cmXIXVjCZq","QnJ1SAmdQd","HfyNQ5Namm",
+"3otm60Wr5y","tlILt5iGN5","6q6L9fcJOy","lCMxy2Nslm","580YDulk41","TXQ0Zl83Ud","dpe1vQworu","7X3uyk85Ae","bgJAz8hJdt","QbxXcjfREu",
+"zmLYDzbIYY","2TRI7UmaEv","WmadA3weIF","LDk6fsoy9t","CxVEfZUnqt","5nmWvK20wK","9iGoTNhXdu","HP433Fhtgl","VLTy6pT8wu","d7vjMZv7z0",
+"pT8wulH1kt","hYBCKdQ586","9XyT9guMb8","EdBKcuN6r3","LewvM8xEKz","tAOsryofH3","m4bxUk85Ae","sx5GlyluBx","ix74rfcwDa","IBe8kCK5W7",
+"UlU3M5Drn0","pvgjSRxrsm","yofH3nnP8o","y94nwpAhR1","aL6AJEdBKc","sx5GlFxX9q","RACuj14FLR","DcpWBpvgjS","bZLvSOHaBz","YOfrYwiHrZ",
+"iwzGkLDk6f","Kr8ysazIWp","BbwgAuZPqg","XflUqaez9y","fFDrJOUYuF","lj07QL7cGc","14FLR4QMc9","HfyNQUl4a1","HRxd8SmGzv","MK07Yrz7Ut",
+"d85a9No0Qb","zQt6Q4QMc9","pFrrlFnPFB","9XyT9iB08l","BFkb8S77LH","UlU3MF6PT2","7lUXZksJby","IRh48e6e4z","9XyT9Twano","StlDJTCgPp",
+"lsQGoWDVWJ","X6PinHzZT8","FcWrWVIlwP","8FmFHU3yw5","VLTy69GXkX","ECMvUuJScX","b29RJru4UG","hUTw7X6Pin","oQ87ruupzk","hi5X7wDajX",
+"EOE1osx5Gl","fqypyyvOMI","uTacxSs0Zu","nFqikIn3NS","NAFuw1v5hH","VjCZq5IhmG","S2DfuRACuj","blLA9BbwgA","2Yz7EnnP8o","tlILtpiJSk",
+"5ZaEzQ6hMC","TCgPpxXTI4","yToGWMmsIo","8TxD7K4GS8","ZzJHWvLsmS","MK07Y2Nslm","7fsYM4dEz6","SjskQSWfou","Dz1R3n1pmO","okgRiDLhzM",
+"MojnP8U2nU","fFDrJZJTXH","v2eC3XyPZN","1v5hHvkCHH","QYxC0IBe8k","JIqXiWaWsv","UmaEvpiJSk","5VZjSe6e4z","tvdkDP6bcg","0BmCyokgRi",
+"aL6AJDLhzM","QWxoTXflUq","2hEEUksJby","QworulViBv","Cp3mZPb1pa","MojnP1v5hH","BCxeCqaofN","24ARFJkzUn","I7p2aKsjRK","FjHXRTCgPp",
+"QnJ1SjSjS3","RmDcrsuY4x","OHaBz0MR5X","5IhmG9XyT9","S2DfuRBhp0","d7vjMFFDui","5Mg9rhYBCK","tlILtKr8ys","16lHcHRxd8","8xEKzCp3mZ",
+"vOqCEogLgc","DLhzMrKDLJ","qUJMdThjNn","5VZjSy94nw","atef2SbRYy","9y4lwYjB9t","Yh1hFGSQwj","ZzJHWLbRTH","tvdkDazIWp","OUYuF6AFT0",
+"8RCUA8xEKz","VNCPdRBhp0","K4GS8suY4x","L7cGcjeskS","nlaBy9GXkX","S77LHt59lR","v2eC3yEfy9","EOE1oAmdQd","618DiZhwG1","Chuy3fqypy",
+"NOHszgf8rI","uPX7GAgJHQ","VjCZqJIqXi","K4GS845cIH","DG4sTRkQke","0ao3lm4bxU","o8Uydi7WMQ","kZANmZv7z0","y94nw5IhmG","7fKYUReKEW",
+"S77LHTCgPp","HRxd8yluBx","J2mQiXflUq","BCxeC14FLR","2ZHdkpiJSk","suY4xJXljW","YjB9tnFqik","b29RJK20wK","t59lRQ6Lix","ni2v1rhl0J",
+"qaofNjfREu","Cfgr3uvf7A","9rlg9he9IA","MmsIoRkQke","64s8N2hEEU","SbRYyW7cTs","0Wr5ybZLvS","SmGzvs93Ml","uLtKsnnP8o","VIlwPFnPFB",
+"DLhzM580YD","uLtKsa00b5","JJs5mfcJOy","HzZT8J2mQi","cmXIX7fKYU","IBe8kYf2Ec","Yh1hFYjB9t","C2IrcLewvM","MaJQsd7vjM","9XyT9k85Ae",
+"S2Dfu1LB1L","n1pmOLewvM","580YDJRJQB","4dEz60h1b1","fcJOyNhXdu","0BmCyUmaEv","e6e4zS77LH","RpBQmblLA9","5iGN5ciuWz","cShY2MK07Y",
+"0PktIHRxd8","jiVBP5drc6","FwEJzgjUTu","DG4sTCp3mZ","5drc6zQt6Q","Ta8f648cHL","618DiQ6Lix","ZuDtDtaOXK","ZUnqtMGlTF","iqv4kcmXIX",
+"IKxdLazIWp","OxWIHnlaBy","TXQ0ZciuWz","VIlwPprNT6","StlDJQssNC","MmKGJsx5Gl","MmsIo4QMc9","3otm6xXTI4","7fsYMPOUYS","ZuDtDjS1aj",
+"BpYhVCNHmv","MojnPy94nw","i7WMQ1LB1L","AgJHQwiHrZ","D6rByjeskS","2Nslm7X3uy","EOE1os4786","ksJbyHzZT8","d85a9Mkgy8","FcWrWKr8ys",
+"jS1ajVBjhz","7fsYMCfgr3","P6bcgzqH0W","n1pmO5Namm","VerEAtvdkD","GSQwjRmDcr","EoToPjfREu","RzaZAnlaBy","uTacx3otm6","zFgtBpT8wu",
+"fqypykB5nP","MmKGJC2Irc","FGzgp7fKYU","PYBf4RACuj","RACujzmLYD","b29RJoGu6x","In3NS0Kyfs","16lHcyvOMI","Pb1paQbxXc","W7cTsZzJHW",
+"brhlQQssNC","guMb8QChxs","hE1QlQssNC","i3pydiB08l","uAWypuoStw","FVMxoulk41","U3yw5faHir","yToGWUmaEv","7fsYMazIWp","JXljWLDk6f",
+"HlUbFjfREu","gf8rIAmdQd","zqH0WcL0aE","RBhp0Q6Lix","IRh48ZhwG1","fLNg8hYBCK","nlaBytAOsr","HP4337fsYM","OUqFMvOqCE","CdyBVWaim6",
+"brhlQv2eC3","HfyNQv2eC3","9rlg9uvf7A","jzUqRQYxC0","FwEJz14FLR","MmsIoHfyNQ","yofH3BGaQY","nFqikOUqFM","MmKGJAXpwE","m4bxUOz8yZ",
+"fFDrJ5Namm","yluBxi7WMQ","lXFOByvOMI","QYxC0EdBKc","9GXkXSbRYy","tvdkD45cIH","hYBCK0PktI","SmGzvyEfy9","DcpWBFwEJz","Zv7z0uN6r3",
+"2TRI7zmLYD","StlDJ8hJdt","2hEEU48cHL","QbxXc618Di","Fhtgl8xEKz","o8UydtjQxs","5NammzFgtB","dmoS7KZamH","m4bxUGSQwj","guMb8xciqp",
+"5IhmGzY1GY","Rxrsmh1zcH","jzUqRBFkb8","iqv4kmX2GE","ZuDtDyToGW","UmaEv29QAz","fcJOyDLhzM","zmLYDulk41","hSSvQyluBx","QClRLd7vjM",
+"Waim65drc6","I7p2ajzUqR","VerEACxVEf","rKDLJFnPFB","zQt6QL7cGc","FwEJzgtCA5","M6qcGS2Dfu","TXQ0ZQssNC","AmdQd14FLR","hUTw7JkzUn",
+"jtn0Xrz7Ut","n1pmOBGaQY","prNT6cL0aE","jSjS3BGaQY","5nmWvFcWrW","pvgjSWmadA","WmadAP6bcg","ni2v1XyPZN","5nmWvaFFss","J2mQiRBhp0",
+"MmKGJlm0pD","RxrsmBpYhV","a00b5rhl0J","VjCZq7X3uy","I7p2afcJOy","48cHLEoToP","Cp3mZksJby","v1HlnzmLYD","JIqXizFgtB","brhlQzY1GY",
+"RsQUqGv3Fq","LewvMHfyNQ","QWxoTiwzGk","In3NSMmsIo","jfREuGXdoH","8RCUAfcwDa","v8yFN8RCUA","9iGoT9XyT9","JKWYR4dEz6","9rlg9xciqp",
+"lkMUAM3zXL","4dEz664s8N","zHF1qaFFss","CNHmv2DREs","POUYSFcWrW","9y4lwpiJSk","gIYvEnnP8o","Mm8siFhtgl","sqVrfuQIcz","0ao3llCMxy",
+"OUqFMMaJQs","0YAGH7X3uy","TXQ0ZgIYvE","NAFuwMmsIo","WaWsvulk41","iwzGkOxWIH","FPfSE0Kyfs","AkKTki7WMQ","JXljWBpYhV","mz8gxjSjS3",
+"RxrsmlViBv","oVQp62hEEU","Vprf2MGlTF","Dz1R3B3qem","QClRL64s8N","zz4ZUaez9y","K4GS8S77LH","Ss0ZuI7p2a","uupzkiwzGk","zFgtBnnP8o",
+"iqv4kLbRTH","WPmlxThjNn","FhtglpiJSk","RmDcruJScX","xXTI4mz8gx","0Wr5yFxX9q","fcJOyzY1GY","XflUqhSSvQ","GXdoHhe9IA","fLNg8h1zcH",
+"VIlwPHfyNQ","iB08lKsjRK","P6bcgt59lR","tlILtVBjhz","gdQsSKZamH","pT8wugjUTu","oQ87rM6qcG","lH1ktC2Irc","MGlTFBFkb8","taOXKcmXIX",
+"ru4UGsoy9t","hUTw7tlILt","e6e4zCdyBV","lm0pDv2eC3","FVMxon1pmO","nFqikbrhlQ","ciuWzhSSvQ","MaJQsMezSW","JIqXiYh1hF","FGzgpyEfy9",
+"MK07YG1RhS","B3qemtuDyS","7lUXZyvOMI","b29RJbZLvS","DcpWBVprf2","CxVEfMmsIo","Mkgy8uTacx","lH1ktK20wK","lm0pDKsjRK","Dz1R32Yz7E",
+"BpYhVAkKTk","2hEEUTCgPp","G1RhSTXQ0Z","zY1GYY1mC0","MK07YCfgr3","AIYUublLA9","lXFOBCp3mZ","uPX7GHRxd8","i3pydFjHXR","5iGN5DcpWB",
+"BbwgAzbIYY","XflUqRACuj","0MR5Xhe9IA","Chuy3GSQwj","S77LHlsQGo","CxVEfHRxd8","tl72WFFDui","IjTwPy94nw","Uvlv4QClRL","MojnPuQIcz",
+"a00b5Mm8si","FnPFBDLhzM","rhl0JCNHmv","Waim6AgJHQ","azIWp0YAGH","gIYvE5iGN5","X6PinkB5nP","IRh481LB1L","lweGyBFkb8","CqqaDrKDLJ",
+"y94nws4786","NAFuwDQimp","RmDcrSbRYy","CIShGOUqFM","lXFOBpv0i7","RxrsmOz8yZ","5IhmGC2Irc","VerEA07n1c","GXdoHuAWyp","k85AennP8o",
+"ru4UGb29RJ","QYxC0cL0aE","JJs5mzHF1q","5drc6M3zXL","HzZT8VIlwP","uLtKs6q6L9","Pb1paFwEJz","I7p2aokgRi","QYxC0Waim6","FjHXRxXTI4",
+"X6PinEdBKc","16lHc29QAz","580YDbgJAz","okgRi29QAz","MGlTFlweGy","DQimpKASQ8","Pb1paNo0Qb","MmsIoDLhzM","tuDySQnJ1S","fqypyhe9IA",
+"lCMxyQ6Lix","CxVEfLewvM","Waim6cShY2","JXljWoQ87r","Dz1R3yvOMI","VBjhzRzaZA","U3yw5dhSuH","EoToPoVQp6","CqqaD5IhmG","he9IAe6e4z",
+"KASQ8uvf7A","rz7Utrz7Ut","FxX9qrKDLJ","s93Mlrz7Ut","7ku1p7hyVv","WDVWJHRxd8","7Ow5CBbwgA","W7cTsdQ586","NcICAChuy3","NAFuwGrDg7",
+"CxVEf0ao3l","ZJTXH0PktI","yEfy9Twano","yToGW5Mg9r","jtn0Xh1zcH","lm0pD48cHL","4dEz6guMb8","pWiOsKZamH","K4GS8RmDcr","FVMxo580YD",
+"NhXduzmLYD","FLsph7fKYU","AkKTklkMUA","5Namm8cVD3","5drc6aDGtS","cL0aEJRJQB","AgJHQl83Ud","Ss0ZunFqik","Cp3mZ5Mg9r","Yh1hFpmeCd",
+"hYBCKaFFss","dhSuH9XyT9","K20wKazIWp","3weIFMojnP","mX2GES2Dfu","ni2v1Uvlv4","yToGWpFrrl","zmLYDdhSuH","Mkgy8xciqp","nFqik0Kyfs",
+"uvf7ApFrrl","hYBCKk85Ae","GSQwjXflUq","Cfgr3MezSW","KASQ8Nxx9V","F6PT2xciqp","qUJMd9XyT9","OxWIHuQIcz","gIYvEEoToP","nFqikv1Hln",
+"Zv7z00PktI","uLtKsoGu6x","k85AePYBf4","bgJAzlCMxy","sqVrfogLgc","EoToPfqypy","In3NSFhtgl","s7MxkIKxdL","jtn0X2TRI7","hi5X7prNT6",
+"zmLYDbZLvS","fFDrJZuDtD","qaofNGXdoH","ix74rWmadA","nFqiktl72W","ru4UGReKEW","rz7UtJ2mQi","0h1b1IBe8k","lsQGoZv7z0","BGaQY0BmCy",
+"Yh1hFI7p2a","DQimpRmDcr","e6e4zfcJOy","GWqqXlj07Q","lweGyzQt6Q","IRh48WDVWJ","nlaByZhwG1","rz7UtNcICA","RBhp0euZA5","yEfy9d7vjM",
+"No0QbaDGtS","Fhtgl2Nslm","0BmCyyluBx","FwEJzfLNg8","5Mg9rlH1kt","14FLRv1Hln","pvgjSYjB9t","2ZHdkHlUbF","8U2nUCfgr3","Yf2EclsQGo",
+"EdBKclH1kt","9rlg9gdQsS","Yh1hFFGzgp","Chuy3ZuDtD","FcWrWi7WMQ","Waim6kZANm","aDGtSuZPqg","CdyBV2hEEU","lkMUAAOgEe","DcpWB8xEKz",
+"n8pJ9Q6hMC","BFkb8MmKGJ","FFDui8RCUA","qQxHPtuDyS","8RCUAECMvU","o8UydFNYIM","JIqXivOqCE","HP433pFrrl","1j5L8RpBQm","64s8NJKWYR",
+"SmGzvdmoS7","xciqpBbwgA","5ZaEzSmGzv","5VZjS0BmCy","NAFuwDcpWB","8TxD77hyVv","zqH0WpiJSk","UmaEvSbRYy","lm0pDOz8yZ","WmadA8U2nU",
+"KZamHGrDg7","jS1ajm4bxU","FxX9qbrhlQ","uN6r31v5hH","16lHcrKDLJ","4W0TlZzJHW","JXljWbZLvS","rhl0JDcpWB","azIWpaL6AJ","YjB9t5VZjS",
+"SjskQuLtKs","jS1ajiwzGk","gf8rIBFkb8","0MR5XFNYIM","Y1mC09eoRc","DLhzMXyPZN","tjQxsEoToP","CdyBVRxrsm","nFqikNAFuw","JkzUnd85a9",
+"jzUqRhYBCK","WMiS3m4bxU","FxX9qxciqp","HzZT8VLTy6","s7Mxk8FmFH","ZzJHWGSQwj","0BmCyWPmlx","Ss0ZuzbIYY","t98iWO3iyQ","FjHXRX6Pin",
+"y94nwrhl0J","8cVD3HfyNQ","oQ87rguMb8","IBe8kG1RhS","pFrrlP6bcg","9rlg9FLsph","lpF6WVprf2","No0QbkZANm","dpe1vb29RJ","ru4UGGSQwj",
+"qUJMdiKqhr","RsQUqtjQxs","DcpWBazIWp","ni2v1tjQxs","4W0TlkB5nP","zqH0WX6Pin","UlU3MRkQke","C2IrcfcwDa","HzZT8zHF1q","7fsYM7fsYM",
+"jiVBPzbIYY","2TRI7kB5nP","uQIczHRxd8","2Yz7E5Drn0","WPmlx8RCUA","4QMc9tAOsr","v8yFNsx5Gl","2TRI7JIqXi","uoStwbZLvS","FPfSEfFDrJ",
+"NOHszi7WMQ","tAOsrcQOnv","NAFuwciuWz","i3pydCNHmv","cmXIX4dEz6","lweGyKZamH","v2eC3tjQxs","uoStwAOgEe","uZPqg4dEz6","5IhmG9GXkX",
+"29QAzgjUTu","n8pJ9HzZT8","5IhmGcmXIX","8xEKzYw2oU","Kr8ysK4GS8","oVQp6C2Irc","MaJQslkMUA","ZhwG1zmLYD","lXFOB0PktI","7fKYUogLgc",
+"JIqXiDQimp","0BmCyM3zXL","X6Pina00b5","zbIYYnnP8o","0BmCypWiOs","HlUbFlH1kt","lsQGoxReec","wiHrZAgJHQ","ZUnqtFcWrW","0ao3luvf7A",
+"BGaQYzqH0W","QnJ1SlXFOB","CqqaD24ARF","DG4sTC2Irc","aFFsslkMUA","lj07Q8U2nU","OxWIHWmadA","No0QbIRh48","0YAGH2hEEU","vkCHHpT8wu",
+"Ss0Zu4QMc9","RkQke29QAz","ReKEW0h1b1","azIWpzz4ZU","SjskQv8yFN","jzUqRK4GS8","iqv4kQChxs","W3VFH16lHc","yToGWzFgtB","U3yw5SmGzv",
+"uLtKsBFkb8","sx5Glru4UG","SjskQRzaZA","Q6LixfmIK1","yEfy98RCUA","FjHXRblLA9","yofH3WMiS3","ix74rSs0Zu","hE1QlgjUTu","NhXduRpBQm",
+"0Wr5y5Namm","m4bxURBhp0","GrDg7ni2v1","RsQUqdhSuH","iKqhrgjUTu","fcwDaNOHsz","BpYhVMojnP","vLsmS8xEKz","Vprf2lkMUA","gdQsShe9IA",
+"uvf7AMmKGJ","RmDcrGrDg7","8U2nUWmadA","6AFT0piJSk","O3iyQlkMUA","hUTw7taOXK","ReKEWl83Ud","i3pydFcWrW","vOqCE8U2nU","U3yw5lj07Q",
+"uZPqgn1pmO","OHaBzokgRi","0Wr5yZUnqt","FjHXRsoy9t","vkCHHb29RJ","2hEEUtAOsr","b29RJFxX9q","iB08lfaHir","zz4ZUdpe1v","zFgtBcmXIX",
+"JKWYRrhl0J","2ZHdkCxVEf","8cVD3X6Pin","DQimpAmdQd","aL6AJVNCPd","e6e4zDz1R3","5nmWvPYBf4","SjskQHlUbF","nFqikPb1pa","zqH0W3otm6",
+"Y1mC0wDajX","FVMxoWMiS3","8xEKzqUJMd","OUqFMhi5X7","euZA545cIH","brhlQSjskQ","55rfBOHaBz","FcWrWVBjhz","DG4sTBbwgA","WreyPuPX7G",
+"YjB9tqaofN","C2IrcwiHrZ","fLNg87ku1p","JKWYRUl4a1","JRJQB2DREs","WaWsvxciqp","QbxXc2ZHdk","zFgtBJkzUn","rhl0JWMiS3","2NslmJKWYR",
+"aFFssZJTXH","yToGWe6e4z","tvdkDPOUYS","tuDyS0h1b1","8U2nUDQimp","pT8wuYjB9t","rhl0J2Yz7E","dmoS7StlDJ","Ta8f6lsQGo","oVQp6Q6Lix",
+"S77LHWaim6","9eoRcxciqp","jS1ajoGu6x","uJScXZUnqt","xciqpS2Dfu","L7cGc6AFT0","WPmlxd85a9","t98iWnFqik","lH1kt4QMc9","8U2nUB3qem",
+"8RCUA7Ow5C","SmGzvJkzUn","lweGyL7cGc","W7cTsiwzGk","fFDrJWreyP","F6PT2d85a9","dmoS7SbRYy","mz8gx0Kyfs","JXljWkZANm","YjB9tVLTy6",
+"piJSkfFDrJ","G1RhSStlDJ","29QAznlaBy","ZzJHW5Namm","mz8gxXflUq","9iGoTbgJAz","0Wr5yvkCHH","fmIK1SjskQ","hi5X7sqVrf","xciqpK20wK",
+"K4GS87X3uy","AmdQdAmdQd","G1RhSVIlwP","uJScXIjTwP","HlUbFuLtKs","8cVD3Ta8f6","BGaQYAkKTk","W3VFHguMb8","Yw2oUNo0Qb","Q6hMC2hEEU",
+"ZzJHWUmaEv","2TRI7TCgPp","cL0aE14FLR","OUqFMVNCPd","dhSuHblLA9","In3NSpAhR1","ulk41RkQke","b29RJFwEJz","IjTwPuJScX","2Yz7EK20wK",
+"DLhzM9eoRc","9y4lwBCxeC","45cIHfaHir","v8yFNlH1kt","oVQp6Ta8f6","QClRL9XyT9","Nxx9VRkQke","IjTwPOHaBz","VLTy6ECMvU","RmDcrZ4I1v",
+"qQxHPru4UG","ReKEWsoy9t","s4786pvgjS","6q6L92TRI7","BCxeCBpYhV","fmIK1rhl0J","fmIK1rz7Ut","sx5GlWDVWJ","QChxsOxWIH","s7MxkFxX9q",
+"jS1ajzmLYD","dQ586hUTw7","pmeCdKsjRK","jtn0Xs4786","618DiZuDtD","iqv4kzqH0W","NhXduCqqaD","t98iWlj07Q","dhSuHWaim6","VNCPdmz8gx",
+"rhl0JnFqik","Chuy3t59lR","MaJQsaez9y","8TxD7soy9t","JKWYR0PktI","n1pmOuAWyp","prNT6v1Hln","5drc6X6Pin","hSSvQ24ARF","FnPFB6q6L9",
+"G1RhSoGu6x","FNYIMmz8gx","7hyVv7lUXZ","QClRLgjUTu","Ta8f60h1b1","O3iyQi7WMQ","uPX7GOHaBz","wiHrZtaOXK","jtn0XD6rBy","0KyfsZv7z0",
+"euZA5uLtKs","JIqXiuJScX","KASQ8guMb8","he9IAMmsIo","OUqFMtjQxs","Yw2oUtuDyS","TXQ0ZRkQke","M3zXLoGu6x","uupzkFGzgp","hUTw7b29RJ",
+"OxWIH48cHL","GWqqXIn3NS","FGzgpBCxeC","sqVrf48cHL","fmIK1cmXIX","fLNg80ao3l","fmIK1lweGy","gf8rIxXTI4","9rlg9aDGtS","uAWypThjNn",
+"SWfouatef2","NcICASmGzv","QnJ1SRACuj","VerEAK20wK","vLsmSMojnP","HP4339rlg9","MaJQsS77LH","MGlTFuupzk","5drc6Zv7z0","0PktIY1mC0",
+"zHF1qsoy9t","EdBKcG1RhS","uN6r3JKWYR","lCMxyaL6AJ","WreyPCfgr3","vkCHHhSSvQ","jfREuEOE1o","v1HlnQworu","ZzJHWkB5nP","QYxC0FnPFB",
+"hi5X7VBjhz","CK5W77ku1p","h1zcHJkzUn","EoToP45cIH","soy9tLewvM","IKxdLtjQxs","ECMvUpT8wu","2ZHdkm4bxU","RBhp0v8yFN","k85Aek85Ae",
+"VBjhzSs0Zu","uTacxs7Mxk","ThjNnHzZT8","BGaQY2ZHdk","iKqhrvLsmS","FPfSEnnP8o","lj07QFLsph","HzZT8yEfy9","gjUTuoGu6x","euZA52hEEU",
+"9XyT9FPfSE","dpe1vOz8yZ","GSQwjDz1R3","uTacxulk41","zbIYYazIWp","Yf2Ec1v5hH","kB5nP7fKYU","NhXdu14FLR","CIShGgdQsS","uTacxJKWYR",
+"pAhR1gdQsS","2DREsOUYuF","FLsphWreyP","2Yz7EcmXIX","uPX7GcL0aE","n1pmO48cHL","uTacxMK07Y","xXTI4hYBCK","CIShGulk41","iB08ltAOsr",
+"JJs5mQssNC","Y1mC0U3yw5","2hEEU8xEKz","DQimpv1Hln","faHiriqv4k","JXljWe6e4z","a00b5DLhzM","No0QbFGzgp","pmeCdY1mC0","i3pydv1Hln",
+"prNT6cmXIX","v2eC3iqv4k","jtn0XZhwG1","Mkgy8djsrv","HlUbFy94nw","iwzGkKsjRK","JJs5mG1RhS","5VZjSdpe1v","fcwDajtn0X","8RCUAAmdQd",
+"ZuDtDPOUYS","FPfSEFhtgl","5Mg9rm4bxU","OUqFM24ARF","lj07QlViBv","5NammnFqik","zY1GYRACuj","0BmCyNAFuw","EOE1oMojnP","cmXIX0Wr5y",
+"S77LH1v5hH","OUYuFjeskS","JXljWD6rBy","lweGyIBe8k","RBhp0h1zcH","16lHcydG8U","sx5GlK20wK","RBhp0GrDg7","aDGtSJIqXi","CqqaDGrDg7",
+"VLTy6hUTw7","FnPFBuZPqg","O3iyQhUTw7","CxVEfx3LDe","s7MxkuPX7G","dhSuHpT8wu","ru4UGYw2oU","JJs5mW3VFH","s7MxkMmKGJ","lH1ktJIqXi",
+"Dz1R3J2mQi","9XyT9yvOMI","y94nwn8pJ9","i3pydEdBKc","tAOsr7hyVv","RmDcre6e4z","gf8rIfFDrJ","Y1mC0cShY2","FjHXRtaOXK","dmoS7WPmlx",
+"LDk6fZJTXH","VBjhz0Wr5y","ru4UGYOfrY","S77LHuLtKs","NOHszfmIK1","UmaEvCxVEf","EOE1oVIlwP","OxWIHEOE1o","xReecOHaBz","tuDySksJby",
+"XflUqjfREu","Y1mC08TxD7","GXdoHAOgEe","vLsmShe9IA","OUYuFVLTy6","nnP8oWMiS3","jS1ajGSQwj","ZhwG1IKxdL","WaWsvix74r","3otm6FcWrW",
+"o8UydFGzgp","taOXKXyPZN","Q6LixQWxoT","3weIFCp3mZ","ZuDtD5nmWv","FNYIMfcJOy","J2mQi1v5hH","Twano2DREs","64s8NVprf2","dmoS7lsQGo",
+"Dz1R3lweGy","JXljWRxrsm","jSjS3SmGzv","SmGzvlkMUA","0KyfsPOUYS","8TxD7NcICA","rKDLJYf2Ec","LewvMmz8gx","GrDg7G1RhS","WaWsvM3zXL",
+"hUTw7gjUTu","55rfBtjQxs","S77LHGWqqX","SbRYy1LB1L","hUTw7mz8gx","cQOnvLewvM","PYBf43otm6","yEfy9fqypy","JKWYRuQIcz","BCxeCS2Dfu",
+"wiHrZpiJSk","ZzJHW8hJdt","YOfrYn1pmO","7X3uySs0Zu","ogLgcZhwG1","0h1b1lXFOB","5VZjSciuWz","fcJOyKZamH","QChxsEoToP","I7p2aVprf2",
+"lsQGoW3VFH","pT8wucL0aE","gdQsSRxrsm","7ku1pQbxXc","BGaQY0MR5X","pFrrlwDajX","2hEEUWmadA","JkzUn2DREs","0PktI9y4lw","5IhmGiwzGk",
+"h1zcHBGaQY","8FmFH618Di","DG4sTZJTXH","HzZT8HRxd8","7ku1plH1kt","2DREszqH0W","k85Aeb29RJ","9rlg9zz4ZU","5iGN5JXljW","FVMxoEdBKc",
+"ZUnqtBGaQY","RBhp0MK07Y","OxWIHDQimp","HP433C2Irc","4W0TlFGzgp","RxrsmzHF1q","1v5hHEdBKc","jzUqRZv7z0","9iGoT5VZjS","l83UdHfyNQ",
+"KASQ8iB08l","55rfBQssNC","brhlQFNYIM","Ul4a15IhmG","cL0aEFxX9q","Fhtgli7WMQ","ECMvUNxx9V","QClRLbrhlQ","0Wr5ymX2GE","VIlwPOUYuF",
+"rKDLJW7cTs","euZA5JXljW","cShY2pFrrl","BCxeC5Drn0","8RCUACK5W7","5drc6rhl0J","piJSkblLA9","5nmWvZuDtD","4W0TloQ87r","jtn0X6q6L9",
+"pmeCdb29RJ","n1pmOMmsIo","pvgjS7fKYU","dmoS7lm0pD","BpYhVOz8yZ","ZJTXHYOfrY","x3LDeOxWIH","DcpWBMGlTF","W7cTsi7WMQ","zbIYY5IhmG",
+"kZANmuAWyp","7lUXZ2hEEU","lXFOBdpe1v","CIShGhe9IA","kZANmRBhp0","Ul4a1piJSk","0ao3lQssNC","y94nwlCMxy","X6PinDG4sT","RpBQmQworu",
+"iKqhrJkzUn","Yh1hFksJby","zQt6QhSSvQ","EoToPGSQwj","blLA9QbxXc","4QMc9dhSuH","FLsphlpF6W","AmdQdpT8wu","RxrsmoQ87r","azIWpKsjRK",
+"QYxC0HlUbF","5ZaEzHlUbF","kB5nPM3zXL","2DREsdjsrv","NhXduk85Ae","RkQkeChuy3","BFkb8HP433","fqypy5nmWv","soy9tDQimp","GrDg70YAGH",
+"okgRi0BmCy","RxrsmqUJMd","5NammzbIYY","580YDsoy9t","FVMxopv0i7","CxVEfX6Pin","o8UydGSQwj","hYBCKYjB9t","MK07YIKxdL","MmKGJBCxeC",
+"iwzGkCdyBV","yToGWzmLYD","JKWYRzz4ZU","jS1aj5iGN5","xReecYOfrY","Yf2EctlILt","lViBv1LB1L","faHirxXTI4","uAWyp2ZHdk","JRJQBlH1kt",
+"mX2GERpBQm","AmdQdQ6Lix","oGu6xXflUq","y94nwSmGzv","nnP8ouupzk","7fsYMlH1kt","TwanoQbxXc","16lHcaFFss","S2DfuMojnP","y94nwwDajX",
+"QWxoTFwEJz","pFrrlMmsIo","MezSWCIShG","ulk41iKqhr","suY4xlViBv","iwzGkl83Ud","fcJOy2Nslm","2ZHdkF6PT2","l83UdQbxXc","kZANm8hJdt",
+"L7cGcx3LDe","fcJOyTwano","tjQxsMK07Y","Ss0Zuix74r","v1Hln5Mg9r","7ku1pSbRYy","G1RhS0ao3l","KASQ8xReec","VNCPdpmeCd","B3qemzY1GY",
+"HRxd8RBhp0","AXpwE0Wr5y","uupzk8xEKz","hSSvQ7hyVv","MmsIoRsQUq","zqH0W5nmWv","Kr8ysyToGW","FnPFBGrDg7","ni2v1FwEJz","5ZaEzVIlwP",
+"he9IAdmoS7","d85a9Yf2Ec","hE1Ql1LB1L","brhlQvOqCE","GrDg7fmIK1","pmeCdNcICA","55rfBRBhp0","G1RhSlpF6W","HlUbFi7WMQ","Qworu24ARF",
+"UmaEvsuY4x","tjQxs9XyT9","qaofNSWfou","zmLYD1j5L8","RzaZAblLA9","yluBxKr8ys","EOE1oWmadA","blLA9s4786","JJs5mF6PT2","48cHLt59lR",
+"7lUXZix74r","i3pydHP433","2DREsi3pyd","qUJMdQworu","W3VFHNhXdu","WMiS3VerEA","ZUnqti7WMQ","0BmCyyvOMI","MaJQsfmIK1","yofH3CIShG",
+"i7WMQfLNg8","euZA5yluBx","7ku1p5Namm","Chuy3uTacx","7hyVv8U2nU","8U2nU48cHL","nlaBypWiOs","DLhzMs7Mxk","BGaQYxXTI4","KASQ8ZuDtD",
+"S2Dfusx5Gl","ReKEW5drc6","e6e4zDG4sT","55rfBaDGtS","8xEKzVIlwP","pFrrl7Ow5C","Dz1R3CNHmv","lkMUAdQ586","5drc6o8Uyd","yToGWFxX9q",
+"EdBKcHfyNQ","HlUbFU3yw5","QClRLW7cTs","uQIczECMvU","HRxd8M3zXL","jeskSprNT6","bgJAzQworu","vOqCE48cHL","tl72W5ZaEz","07n1cVerEA",
+"LDk6frKDLJ","DcpWBChuy3","VIlwPTCgPp","v1Hlnx3LDe","lm0pDMkgy8","i7WMQuAWyp","dhSuHxciqp","AOgEejfREu","qaofNpFrrl","WDVWJ7X3uy",
+"4W0TlKASQ8","Chuy3lj07Q","ZuDtDXflUq","n1pmOKZamH","5NammdQ586","WmadAQ6hMC","lm0pD8FmFH","VerEAKASQ8","guMb8AgJHQ","RzaZAcL0aE",
+"rz7UtDG4sT","W7cTsguMb8","HlUbFDLhzM","zHF1qtAOsr","oVQp6DG4sT","aFFss8cVD3","MojnPIn3NS","s7MxkJkzUn","Z4I1vhUTw7","Z4I1vDQimp",
+"ciuWz9y4lw","OUYuFS77LH","d85a907n1c","BbwgApFrrl","ZzJHWlH1kt","xXTI4ZhwG1","lCMxypWiOs","okgRiSjskQ","uLtKsqQxHP","lweGyX6Pin",
+"JXljW5Mg9r","gtCA5CxVEf","zz4ZUSjskQ","2hEEUF6PT2","iKqhrCxVEf","dpe1vOxWIH","fmIK1NhXdu","jiVBPFNYIM","dhSuHfcJOy","Nxx9Vni2v1",
+"VerEARpBQm","Chuy3FxX9q","qQxHPRmDcr","Chuy3No0Qb","uoStwFFDui","8RCUAlCMxy","JRJQB7X3uy","WMiS3DLhzM","DG4sTMm8si","RACujYw2oU",
+"vkCHHlweGy","2NslmFnPFB","Q6LixVIlwP","WmadAMGlTF","qaofNIjTwP","jzUqRtjQxs","qaofNcmXIX","VBjhzAkKTk","n1pmOJkzUn","K4GS80PktI",
+"7lUXZDcpWB","t59lRQChxs","8cVD3hYBCK","FcWrWpvgjS","Ss0ZuD6rBy","3otm6JRJQB","rhl0JeuZA5","n8pJ91j5L8","zbIYYtl72W","AgJHQZv7z0",
+"P6bcgGrDg7","TXQ0ZjSjS3","QYxC0L7cGc","MaJQs5Mg9r","pvgjSNhXdu","7fsYMCp3mZ","AXpwEtl72W","Dz1R3ni2v1","HP433i7WMQ","QnJ1SbrhlQ",
+"B3qemRBhp0","16lHcuQIcz","Z4I1vK20wK","iKqhrVerEA","nFqikcShY2","VerEAfcwDa","nlaByVprf2","sx5Gl48cHL","wiHrZQbxXc","tuDySbrhlQ",
+"lpF6WBFkb8","WPmlxHlUbF","No0QbZuDtD","5ZaEzNo0Qb","qaofNFVMxo","HfyNQSs0Zu","HfyNQyluBx","taOXKZUnqt","9GXkX2DREs","UmaEvjiVBP",
+"MezSWm4bxU","618DiMmKGJ","CqqaDWaim6","Nxx9VVIlwP","5ZaEzAkKTk","IKxdL8cVD3","hE1QljfREu","fcwDagtCA5","jfREuS77LH","8hJdtsx5Gl",
+"sqVrf0MR5X","he9IA16lHc","6q6L9suY4x","prNT6O3iyQ","0ao3lSmGzv","iwzGktaOXK","B3qemtl72W","No0QbcQOnv","16lHc9eoRc","QbxXcRkQke",
+"OHaBz8hJdt","FNYIMQ6hMC","uoStwhi5X7","ni2v1tvdkD","xReecjzUqR","W7cTsl83Ud","0PktIiqv4k","0PktIQssNC","guMb8fLNg8","1v5hH29QAz",
+"Dz1R3RzaZA","b29RJcL0aE","7Ow5CcL0aE","lXFOBSWfou","yToGWEOE1o","YOfrYzbIYY","W3VFHhUTw7","HP433DcpWB","taOXKLDk6f","cL0aERkQke",
+"zz4ZULDk6f","OHaBzM3zXL","GWqqXJIqXi","tAOsr5nmWv","taOXKhE1Ql","FNYIMd7vjM","AkKTkfqypy","CdyBVhYBCK","fcJOys93Ml","FGzgpoVQp6",
+"oQ87rzqH0W","7Ow5CfcwDa","uPX7G7Ow5C","cL0aEru4UG","FnPFBbZLvS","s4786b29RJ","Yw2oUWMiS3","ZhwG1ksJby","d7vjMogLgc","dQ586HlUbF",
+"8FmFH5drc6","NAFuwiKqhr","zqH0WQ6hMC","uupzklViBv","LDk6ftaOXK","CIShGMK07Y","MojnPsoy9t","StlDJqUJMd","Q6LixKZamH","QClRLuTacx",
+"s93MlQworu","xciqpCqqaD","bZLvSlweGy","W7cTsy94nw","vLsmSzmLYD","Mkgy8CNHmv","zqH0WwDajX","Oz8yZOz8yZ","i7WMQulk41","pWiOsAOgEe",
+"JJs5mHlUbF","DQimpIBe8k","MojnPn1pmO","uTacxtvdkD","0BmCyyEfy9","Yf2EcMGlTF","AmdQdFGzgp","oGu6xoVQp6","9y4lwK4GS8","rz7Utuvf7A",
+"Chuy3Oz8yZ","RkQke8cVD3","Waim6X6Pin","azIWpqaofN","mX2GEtAOsr","qaofNlCMxy","FNYIMvOqCE","Yf2Ec16lHc","MmKGJv2eC3","JKWYRJ2mQi",
+"NOHszzY1GY","IKxdLCK5W7","ix74ryluBx","GWqqX6AFT0","jfREuguMb8","FGzgpv2eC3","VLTy6JRJQB","zmLYDStlDJ","64s8ND6rBy","G1RhS9GXkX",
+"9XyT9mz8gx","wiHrZiB08l","LDk6fMezSW","L7cGcUl4a1","kB5nPFLsph","GXdoH7hyVv","0PktIvLsmS","pFrrltl72W","Pb1pal83Ud","Nxx9VI7p2a",
+"FVMxorz7Ut","LbRTHEOE1o","yEfy9pT8wu","tjQxsMGlTF","Cp3mZblLA9","Cfgr3DLhzM","jSjS30YAGH","TCgPpzQt6Q","AXpwEMmKGJ","wiHrZwDajX",
+"JkzUn3weIF","2ZHdk0Kyfs","EOE1oKASQ8","7fKYUFcWrW","8TxD76AFT0","Q6Lixs4786","iB08lWDVWJ","zmLYDjiVBP","BCxeCIn3NS","Twano29QAz",
+"No0Qbzz4ZU","tuDySQ6hMC","t98iWpT8wu","MGlTFjfREu","tlILtpWiOs","lpF6W4QMc9","AmdQd9GXkX","HP433GSQwj","No0Qb2DREs","6AFT04dEz6",
+"xReecCfgr3","y94nwgIYvE","GrDg7W3VFH","BpYhVe6e4z","8U2nU5drc6","M3zXLVprf2","RxrsmlXFOB","MmKGJMGlTF","G1RhS5drc6","VLTy6taOXK",
+"7fsYM16lHc","8hJdtfqypy","5IhmGd85a9","QbxXcni2v1","XyPZNvLsmS","HzZT80BmCy","JkzUnXflUq","4W0TlUlU3M","FhtglQWxoT","4QMc99iGoT",
+"rhl0JcL0aE","5Nammt59lR","oGu6xThjNn","Chuy3vLsmS","bgJAzt59lR","fmIK1MmKGJ","4W0TlQClRL","GWqqXzFgtB","QWxoTHlUbF","uPX7G2ZHdk",
+"GSQwjWPmlx","FPfSEReKEW","0MR5XuPX7G","8hJdtbgJAz","IjTwPFGzgp","uLtKsGWqqX","prNT6tl72W","Yh1hFoVQp6","aez9yFwEJz","rhl0JJRJQB",
+"Vprf2Q6hMC","I7p2a07n1c","jeskSoVQp6","fcwDaWaWsv","MojnPTCgPp","16lHcCqqaD","dmoS7RzaZA","JRJQBjeskS","h1zcHRpBQm","QYxC0CIShG",
+"wDajXU3yw5","hSSvQAOgEe","MmKGJVprf2","MGlTFbrhlQ","CxVEfd7vjM","ZzJHW0MR5X","L7cGcaez9y","bZLvSQssNC","F6PT2VerEA","MmsIo2hEEU",
+"2hEEU14FLR","Waim648cHL","aL6AJgIYvE","Yf2Ecsoy9t","RACujMezSW","MmKGJiKqhr","WaWsvJXljW","WDVWJsuY4x","JKWYRfcJOy","sqVrfhi5X7",
+"W7cTs14FLR","lweGyYf2Ec","BbwgA5nmWv","tlILtzmLYD","EoToPOHaBz","CIShGZv7z0","fcJOySmGzv","TCgPpgjUTu","nnP8oKsjRK","DLhzMuoStw",
+"StlDJrKDLJ","Mkgy8ogLgc","oGu6xFNYIM","1v5hHpiJSk","WaWsv5ZaEz","pmeCdLbRTH","4W0Tl0h1b1","5Drn0ZJTXH","zmLYDsuY4x","lpF6WciuWz",
+"45cIHuJScX","VNCPdjS1aj","jzUqRiKqhr","AgJHQmX2GE","wDajXuN6r3","Q6hMCgIYvE","WDVWJPb1pa","lj07Quvf7A","6AFT0y94nw","pmeCdfmIK1",
+"In3NS2DREs","s7MxkQYxC0","IjTwPKZamH","YOfrYyofH3","8cVD3QssNC","DG4sTjS1aj","gIYvEcShY2","UmaEvJIqXi","MK07Yulk41","jSjS38xEKz",
+"fmIK1618Di","azIWpFhtgl","uoStwkZANm","guMb8BpYhV","RzaZAUl4a1","EOE1ozqH0W","fcwDa2Yz7E","FnPFBMmKGJ","bgJAzLewvM","HzZT8ZJTXH",
+"aL6AJChuy3","FPfSEtjQxs","yToGWUlU3M","FGzgpQbxXc","ReKEWAgJHQ","6AFT0W7cTs","zHF1q0Wr5y","M3zXLuvf7A","qaofNKASQ8","S2DfuRzaZA",
+"lm0pDxXTI4","atef21LB1L","zHF1qKsjRK","S2DfuO3iyQ","W3VFHuAWyp","uZPqgjeskS","uupzkoQ87r","zY1GYfqypy","pv0i7Pb1pa","vkCHH2Nslm",
+"xReec3weIF","Ul4a107n1c","mX2GEuZPqg","uJScXQChxs","VLTy6pmeCd","FwEJzWDVWJ","4QMc9HfyNQ","s4786oQ87r","OxWIHQ6Lix","zFgtBUmaEv",
+"pmeCd8RCUA","5NammlViBv","ZzJHWyEfy9","Zv7z0hUTw7","qUJMdCxVEf","VIlwPW7cTs","CdyBVbZLvS","guMb89GXkX","AgJHQDG4sT","8hJdtcmXIX",
+"h1zcHCIShG","qaofNaFFss","ZUnqtpv0i7","pvgjSGv3Fq","580YDQ6Lix","s93MlkZANm","W3VFHDLhzM","KZamHgtCA5","Nxx9VFnPFB","SbRYy2Yz7E",
+"1v5hHd7vjM","pv0i7CK5W7","AIYUuWDVWJ","16lHczbIYY","ogLgcLbRTH","580YDZuDtD","FwEJzEOE1o","pFrrl6q6L9","WreyP9eoRc","fLNg8QbxXc",
+"SjskQFhtgl","AIYUuatef2","QYxC0F6PT2","aFFsswiHrZ","K4GS8piJSk","45cIHMojnP","AXpwEWPmlx","BpYhVfcwDa","LDk6fzQt6Q","ciuWzpFrrl",
+"5Mg9ruQIcz","ZhwG1taOXK","5NammdhSuH","2TRI7t98iW","EdBKclm0pD","F6PT2zQt6Q","jeskSOUYuF","Q6Lix8cVD3","8TxD7jfREu","K4GS88RCUA",
+"BCxeCni2v1","oQ87rOHaBz","2Yz7EWaim6","d85a9qaofN","qUJMdJIqXi","4dEz69GXkX","CIShGIBe8k","2TRI7e6e4z","m4bxUG1RhS","kB5nPMK07Y",
+"7Ow5COUYuF","OxWIHQYxC0","POUYSRsQUq","jiVBP14FLR","gtCA5QssNC","Q6LixOHaBz","uZPqguLtKs","M3zXLeuZA5","piJSkXyPZN","U3yw5tvdkD",
+"JIqXibZLvS","cmXIXRkQke","FLsphQssNC","ZhwG1BFkb8","d85a9m4bxU","rhl0J0Wr5y","i3pydazIWp","n8pJ9dhSuH","ECMvUVerEA","Ta8f62ZHdk",
+"azIWpJKWYR","ThjNnlXFOB","zqH0W5VZjS","uPX7GwiHrZ","9eoRcd7vjM","DG4sTl83Ud","5NammSbRYy","WPmlxReKEW","zY1GY9iGoT","kB5nPhe9IA",
+"ciuWz5Mg9r","o8Uyd9iGoT","hi5X76q6L9","2Yz7Eiqv4k","qQxHP45cIH","uAWypY1mC0","M3zXLYh1hF","RzaZADG4sT","6AFT0K20wK","fFDrJI7p2a",
+"ru4UGdQ586","FPfSEQnJ1S","kZANm5Namm","l83UdHRxd8","qUJMdt98iW","ru4UGlXFOB","DcpWBoVQp6","gIYvE580YD","FwEJzAIYUu","7ku1pIjTwP",
+"n1pmOt59lR","Waim6ReKEW","6AFT0NhXdu","M6qcGi7WMQ","1j5L8fFDrJ","CdyBVtaOXK","BGaQYVBjhz","jSjS3Kr8ys","LDk6fhE1Ql","G1RhSUmaEv",
+"CIShGBbwgA","cL0aElViBv","b29RJtlILt","7hyVvYjB9t","yluBxgjUTu","zbIYYStlDJ","580YDgIYvE","ix74rs7Mxk","MK07YCqqaD","O3iyQK4GS8",
+"14FLRReKEW","Ul4a1FLsph","7hyVvaez9y","uQIcz5VZjS","QWxoTblLA9","FnPFByofH3","FFDuiZ4I1v","IKxdLIBe8k","7lUXZ16lHc","AkKTkaez9y",
+"7ku1pqQxHP","uZPqgFwEJz","I7p2ajeskS","K20wK8RCUA","oGu6xRBhp0","pvgjSguMb8","1j5L8MojnP","bgJAzzHF1q","0KyfsC2Irc","gtCA5uPX7G",
+"oGu6xSmGzv","okgRiXflUq","b29RJGrDg7","POUYSjfREu","VBjhz6q6L9","9y4lwbgJAz","piJSkl83Ud","pT8wu4dEz6","3otm6gf8rI","W3VFHuLtKs",
+"DQimpWmadA","bZLvSGWqqX","Pb1pauQIcz","CNHmvWPmlx","SjskQG1RhS","CxVEf5VZjS","Chuy3StlDJ","hSSvQReKEW","EOE1oZzJHW","zHF1qi7WMQ",
+"I7p2aW3VFH","yofH3IRh48","zbIYY2Nslm","suY4xfqypy","y94nwFcWrW","VBjhzS77LH","dhSuHhSSvQ","8cVD39iGoT","W3VFH6q6L9","8cVD3uTacx",
+"Twano0PktI","taOXKJIqXi","Waim6dmoS7","618Di2DREs","uoStwFxX9q","2TRI7oVQp6","dQ5860PktI","ru4UGiB08l","8TxD7XyPZN","0KyfsTXQ0Z",
+"JKWYRSs0Zu","NAFuwokgRi","hUTw7RpBQm","xciqplsQGo","XflUqUmaEv","qaofNNOHsz","fFDrJdhSuH","uLtKsC2Irc","0ao3ldmoS7","Y1mC0uJScX",
+"euZA5VLTy6","aFFss7fsYM","OxWIHFNYIM","GrDg7C2Irc","No0Qb16lHc","uAWypqQxHP","suY4xTwano","ciuWznFqik","Zv7z0NAFuw","9XyT9dpe1v",
+"CIShGTXQ0Z","taOXKRkQke","lH1ktZuDtD","ZUnqtokgRi","CdyBVStlDJ","UmaEv0PktI","CxVEfWaim6","ix74rrz7Ut","9GXkXkB5nP","5VZjSn1pmO",
+"i7WMQlsQGo","GXdoHBGaQY","F6PT2x3LDe","L7cGc45cIH","7hyVvi3pyd","FPfSE7X3uy","8FmFH7Ow5C","euZA59rlg9","POUYSKASQ8","uTacxdjsrv",
+"lkMUAEoToP","FcWrWGrDg7","nlaByEOE1o","mX2GEvLsmS","8U2nUogLgc","64s8NM6qcG","9XyT9cL0aE","FnPFBMaJQs","7hyVvjSjS3","O3iyQaez9y",
+"Rxrsmiqv4k","Ul4a1EoToP","KsjRKwDajX","VerEAzmLYD","2DREsd85a9","14FLRy94nw","HP433sx5Gl","B3qempiJSk","l83Udn8pJ9","CNHmvAIYUu",
+"faHirWaWsv","WDVWJ1LB1L","dpe1vazIWp","fcJOyydG8U","xXTI4tuDyS","jiVBPIjTwP","7ku1pMmKGJ","UlU3MQworu","BbwgAkZANm","Chuy3cQOnv",
+"Q6LixzqH0W","lkMUAVNCPd","JIqXiUlU3M","POUYSblLA9","5IhmGjtn0X","AmdQduN6r3","rhl0JYOfrY","5Drn0ZUnqt","FFDuiWMiS3","rhl0J5nmWv",
+"MK07Y3weIF","uQIczDLhzM","ECMvUStlDJ","SjskQs93Ml","d85a9ThjNn","hYBCKKr8ys","CIShGCdyBV","QWxoTlkMUA","8TxD7Ta8f6","DLhzMGrDg7",
+"5iGN52ZHdk","vOqCE2Nslm","M6qcG9eoRc","ECMvUReKEW","UmaEvFnPFB","faHirb29RJ","CIShG4QMc9","RmDcr5Namm","qQxHPdQ586","L7cGce6e4z",
+"AXpwE0ao3l","2Yz7EGv3Fq","uZPqgvLsmS","DQimpCxVEf","DLhzMCK5W7","Y1mC0K4GS8","SmGzvMK07Y","FhtglEdBKc","5nmWvdQ586","suY4xOUYuF",
+"FxX9q2TRI7","ZzJHW2TRI7","Dz1R3oQ87r","1v5hHTCgPp","ix74rBbwgA","16lHcuZPqg","1j5L89XyT9","hYBCKBpYhV","QworuaL6AJ","1LB1LQworu",
+"WreyPCK5W7","rhl0JW7cTs","OxWIHSmGzv","5Namm0YAGH","580YD55rfB","pv0i78FmFH","euZA5DQimp","S77LH7hyVv","IRh48lCMxy","hi5X7Mm8si",
+"he9IAJKWYR","ru4UGHzZT8","zQt6Q2DREs","pWiOsaFFss","n8pJ9iB08l","Dz1R3nFqik","3weIFkZANm","FNYIMQbxXc","KASQ8S77LH","MmKGJSs0Zu",
+"9y4lwcL0aE","lH1ktVjCZq","pFrrliKqhr","fmIK1fcwDa","t59lRyluBx","gf8rIlj07Q","SmGzvIRh48","GXdoHyofH3","FcWrWaFFss","VIlwPPb1pa",
+"sqVrffqypy","Dz1R3IKxdL","BCxeCfFDrJ","rhl0JjfREu","K20wKgdQsS","qaofNdmoS7","UlU3Mfqypy","kZANmFhtgl","jeskShe9IA","oQ87rGrDg7",
+"WDVWJDcpWB","aez9ylH1kt","y94nw580YD","Waim64W0Tl","LewvMrhl0J","PYBf4QYxC0","Zv7z0v2eC3","JKWYRuoStw","aL6AJL7cGc","i7WMQ5Drn0",
+"fFDrJy94nw","fFDrJjeskS","suY4xRmDcr","XflUqAmdQd","RACujIKxdL","hUTw7C2Irc","SWfouS2Dfu","lm0pD9GXkX","cShY2prNT6","Cfgr3jtn0X",
+"8RCUAblLA9","Zv7z0CxVEf","OUYuFoGu6x","W7cTsyvOMI","6AFT0Qworu","zbIYYfLNg8","zY1GYlCMxy","lpF6WO3iyQ","zQt6QReKEW","Cfgr3ECMvU",
+"K20wKgtCA5","fcJOyuN6r3","VerEA1j5L8","1j5L8GrDg7","DLhzMWaim6","RmDcryvOMI","uQIczWaim6","EdBKcn1pmO","TwanoAkKTk","QYxC0blLA9",
+"NhXduOz8yZ","8U2nUNcICA","gIYvEcmXIX","JKWYRTCgPp","n8pJ9KsjRK","hSSvQEdBKc","nnP8o7ku1p","Mm8sit98iW","Gv3FqAkKTk","AmdQd0PktI",
+"W3VFHFhtgl","RmDcrbrhlQ","Ta8f6gf8rI","v2eC3M6qcG","pv0i7lpF6W","MaJQsm4bxU","vOqCEZ4I1v","ReKEWuAWyp","fmIK1jeskS","oGu6x5drc6",
+"3weIFPOUYS","s4786tjQxs","ECMvUJXljW","Mkgy8mX2GE","Y1mC0i3pyd","gjUTuiB08l","RACujTa8f6","aDGtSvkCHH","s7MxkDG4sT","qQxHPdhSuH",
+"WDVWJuoStw","oGu6xrKDLJ","SmGzvjS1aj","d85a9Rxrsm","QworuL7cGc","GXdoHzz4ZU","lViBvI7p2a","tjQxs07n1c","K4GS88cVD3","hYBCKCxVEf",
+"RpBQmFNYIM","F6PT2Nxx9V","Mkgy8DG4sT","JKWYRy94nw","h1zcHXyPZN","MezSW1LB1L","QssNCjzUqR","Mm8siyEfy9","x3LDeqUJMd","7ku1pHfyNQ",
+"WaWsvMojnP","iqv4kFFDui","t98iWOz8yZ","uAWypi7WMQ","lCMxyOz8yZ","guMb85nmWv","FPfSEDz1R3","48cHLv8yFN","FhtglBpYhV","JIqXiv8yFN",
+"IBe8kXflUq","8U2nUVNCPd","uvf7Aru4UG","Waim6FGzgp","07n1ctjQxs","RmDcrAgJHQ","jSjS3FwEJz","8U2nUSjskQ","lViBvhUTw7","EoToPD6rBy",
+"WPmlxv1Hln","Vprf2dQ586","sqVrf0BmCy","24ARFECMvU","9rlg9rhl0J","ulk419XyT9","ksJbyYh1hF","oQ87rD6rBy","QworupT8wu","ni2v1CdyBV",
+"fFDrJ5IhmG","NhXdu64s8N","HRxd8kB5nP","ZUnqt48cHL","JXljW2DREs","TwanoazIWp","hYBCKFxX9q","uJScXSjskQ","RmDcrLDk6f","5IhmGCqqaD",
+"9y4lwtlILt","jfREuoGu6x","POUYSmX2GE","djsrvuQIcz","bgJAzaFFss","ZUnqt618Di","zY1GYRxrsm","pAhR1ZJTXH","vLsmShUTw7","v8yFN3weIF",
+"16lHcPYBf4","gdQsSdQ586","xReecs4786","OHaBzSjskQ","uQIczydG8U","BGaQYn8pJ9","he9IAzz4ZU","Z4I1vkB5nP","nlaBySs0Zu","s93MllweGy",
+"WmadAs7Mxk","6q6L9JIqXi","07n1cPb1pa","oQ87r618Di","ZJTXHx3LDe","FFDuiuQIcz","yEfy9IBe8k","EOE1oMezSW","9y4lwVprf2","RBhp0lm0pD",
+"lViBvhSSvQ","pWiOsHP433","Waim6Gv3Fq","Ta8f6ReKEW","GXdoHCdyBV","ciuWz8RCUA","uQIczx3LDe","JXljWzQt6Q","4W0Tlulk41","AkKTkokgRi",
+"brhlQWPmlx","XflUqYf2Ec","GXdoHHlUbF","0Wr5yLDk6f","iB08lx3LDe","aL6AJIKxdL","MGlTFCK5W7","8xEKz5nmWv","GSQwj7lUXZ","RACujvOqCE",
+"gIYvE3otm6","1j5L8Ta8f6","Gv3FqRsQUq","ix74rAOgEe","P6bcgYOfrY","0MR5XbZLvS","W3VFHIn3NS","2hEEU5Drn0","RxrsmaDGtS","7fsYMMmsIo",
+"0YAGHEOE1o","d85a9FjHXR","Rxrsmv1Hln","CqqaDOxWIH","2DREsx3LDe","prNT63otm6","M3zXLoVQp6","0MR5XFxX9q","AXpwEU3yw5","brhlQaez9y",
+"iqv4k618Di","HlUbFQworu","JXljWZ4I1v","fLNg8NOHsz","zbIYYPb1pa","lpF6WCNHmv","5IhmGZuDtD","zFgtBydG8U","2Nslmsx5Gl","S2DfuGXdoH",
+"lm0pDnlaBy","CK5W7I7p2a","uQIczCNHmv","hi5X7RBhp0","vLsmSs7Mxk","CK5W7RBhp0","UlU3Ma00b5","DG4sTJXljW","n1pmOjSjS3","yvOMIlH1kt",
+"euZA5i7WMQ","2DREszY1GY","Oz8yZYh1hF","8cVD3HP433","QClRLgtCA5","n1pmO2hEEU","Ta8f6blLA9","QbxXclm0pD","SmGzv4QMc9","IBe8kQbxXc",
+"o8UydqQxHP","he9IA8hJdt","iKqhrIBe8k","0MR5XVBjhz","l83Udix74r","yofH3ogLgc","3weIFzbIYY","fmIK1G1RhS","zqH0WYjB9t","7ku1pyofH3",
+"C2Irci7WMQ","MezSWECMvU","DLhzMVjCZq","kZANmVprf2","gjUTuIKxdL","S2Dfugf8rI","HzZT8hYBCK","sqVrflj07Q","faHirlm0pD","8RCUAW7cTs",
+"07n1cW7cTs","pT8wuMm8si","euZA5ZuDtD","lsQGoM3zXL","RkQkeKsjRK","XyPZNZuDtD","ni2v1ReKEW","AmdQdY1mC0","yEfy9GrDg7","iwzGkpv0i7",
+"ogLgczFgtB","KASQ8cL0aE","9eoRc618Di","cL0aEVBjhz","soy9tzmLYD","8RCUAKASQ8","PYBf4rhl0J","qaofNAOgEe","WmadAyEfy9","MGlTF618Di",
+"cL0aECfgr3","dmoS7D6rBy","2ZHdkRBhp0","7fKYUkZANm","6AFT0wDajX","Zv7z0GXdoH","CIShGzQt6Q","9eoRczbIYY","BFkb87ku1p","2DREsRxrsm",
+"48cHL0YAGH","J2mQi0BmCy","Dz1R3yluBx","azIWp7lUXZ","cShY2LDk6f","3weIFwDajX","K20wKe6e4z","HfyNQM3zXL","pmeCduN6r3","8U2nUnFqik",
+"zmLYDwDajX","FnPFBXyPZN","WaWsvNxx9V","v1HlnhUTw7","7fsYM7ku1p","StlDJqaofN","y94nwatef2","d7vjMNOHsz","YOfrYMmKGJ","BFkb8iwzGk",
+"NOHszGWqqX","WmadAnlaBy","pv0i7WmadA","ogLgc8hJdt","9GXkXqQxHP","nFqikQClRL","d85a9ReKEW","8xEKzJ2mQi","tlILtfcJOy","FNYIM45cIH",
+"CdyBVBCxeC","Twanoo8Uyd","lH1ktbZLvS","FcWrWi3pyd","pFrrlaFFss","FnPFB6AFT0","RACujjzUqR","Mkgy8tjQxs","NAFuwv2eC3","L7cGc2DREs",
+"FwEJzfcwDa","ECMvUt59lR","WMiS3U3yw5","tlILtFLsph","Q6hMC5ZaEz","0ao3lO3iyQ","Q6Lixaez9y","iKqhrVNCPd","zHF1qbZLvS","FcWrWsx5Gl",
+"KsjRKFGzgp","guMb88hJdt","K20wKzbIYY","ZUnqtWaim6","nFqikwiHrZ","nnP8oGv3Fq","y94nwtAOsr","64s8NAXpwE","14FLRWreyP","tuDySQClRL",
+"0YAGHsqVrf","tlILtNcICA","gtCA5I7p2a","8xEKz4W0Tl","MmsIojeskS","jeskSDz1R3","AgJHQm4bxU","29QAzFjHXR","2Nslm2TRI7","LDk6fQYxC0",
+"tAOsrMaJQs","S77LHK20wK","Nxx9Vrz7Ut","RkQkeNxx9V","lweGyWDVWJ","TwanodhSuH","WDVWJfcwDa","blLA9IBe8k","xReecDQimp","Ta8f6Waim6",
+"7fKYUgIYvE","FPfSEsuY4x","16lHcCIShG","euZA5uupzk","K20wKQssNC","pmeCdHRxd8","5IhmGru4UG","ru4UGzQt6Q","uPX7GLewvM","5IhmGFnPFB",
+"zHF1qL7cGc","uvf7AblLA9","qQxHPEoToP","7X3uyIBe8k","UlU3MHfyNQ","Q6LixuAWyp","fcJOyvOqCE","16lHcuoStw","CK5W7pT8wu","QClRLlsQGo",
+"QYxC0mz8gx","Oz8yZlXFOB","djsrvgjUTu","HRxd8piJSk","45cIHlkMUA","Yh1hFRpBQm","jtn0XzmLYD","hUTw7DG4sT","uQIczI7p2a","dmoS7lweGy",
+"n8pJ9d85a9","Ss0Zuv2eC3","faHirni2v1","Nxx9VrKDLJ","QnJ1SzbIYY","qaofNS77LH","hYBCKZJTXH","hYBCK7X3uy","Uvlv4xciqp","3weIFNAFuw",
+"1v5hHJkzUn","JKWYR1j5L8","t59lRCqqaD","TwanooVQp6","fqypySs0Zu","lpF6WBCxeC","pAhR1MGlTF","6AFT0PYBf4","AOgEesx5Gl","ulk41ciuWz",
+"aDGtSC2Irc","Yf2EcHfyNQ","euZA59XyT9","dQ5862TRI7","M3zXLQClRL","7X3uyRkQke","aL6AJuAWyp","HP433GWqqX","cmXIXOHaBz","9eoRcJkzUn",
+"n1pmOn8pJ9","6AFT08RCUA","Yh1hFMmsIo","LDk6fFcWrW","ru4UGVBjhz","ulk41Yw2oU","tlILtAOgEe","brhlQhYBCK","zqH0WQssNC","jS1ajoQ87r",
+"uoStwHRxd8","tjQxs7ku1p","UlU3MHRxd8","JIqXi5nmWv","iwzGkWaim6","gf8rIJ2mQi","DLhzMpv0i7","ni2v1AgJHQ","48cHLMkgy8","iB08lpT8wu",
+"0YAGHuLtKs","oGu6xUmaEv","UmaEv2hEEU","ciuWzatef2","YjB9tMm8si","9GXkXFxX9q","HlUbFhYBCK","Y1mC0vOqCE","2TRI7pvgjS","5iGN5pmeCd",
+"rhl0JUmaEv","P6bcgdpe1v","fLNg8QssNC","5iGN5jeskS","45cIHnlaBy","VBjhz55rfB","Oz8yZFnPFB","faHiriB08l","0KyfsOHaBz","zqH0WlsQGo",
+"vLsmSd85a9","Nxx9VjS1aj","tlILtCNHmv","IRh48brhlQ","QClRLGrDg7","b29RJ8TxD7","djsrvmX2GE","tAOsr7fsYM","7X3uy3otm6","t98iWi7WMQ",
+"gIYvEDG4sT","bgJAz55rfB","Cfgr3QWxoT","16lHccmXIX","6q6L9hYBCK","Y1mC0FwEJz","dQ586C2Irc","9eoRce6e4z","gjUTuCp3mZ","AmdQdIRh48",
+"Ta8f6GXdoH","AXpwEuZPqg","tjQxszQt6Q","bZLvSdQ586","zQt6QlkMUA","djsrvnlaBy","fqypyi7WMQ","lViBvFLsph","lkMUA1j5L8","nnP8o8RCUA",
+"580YDI7p2a","WmadASbRYy","Ta8f6t98iW","X6PinKr8ys","HlUbFVLTy6","Q6LixkB5nP","rz7Ut9y4lw","iqv4kVprf2","tlILtulk41","SWfouUlU3M",
+"pFrrlFVMxo","uLtKsyvOMI","aL6AJVIlwP","VjCZqqaofN","aez9yKZamH","cL0aEfLNg8","0KyfsaL6AJ","7X3uyVLTy6","jSjS3WmadA","1LB1LHlUbF",
+"5Drn0t59lR","Ss0ZuHfyNQ","pv0i7Dz1R3","3otm6K20wK","5Drn0C2Irc","brhlQjzUqR","8cVD3AkKTk","ZUnqthi5X7","y94nwqQxHP","GSQwjHP433",
+"pv0i7ZuDtD","LDk6fYjB9t","djsrvZuDtD","IBe8k2ZHdk","oVQp67ku1p","SjskQ9GXkX","HzZT8UmaEv","0PktIHP433","sx5GlRmDcr","prNT6lj07Q",
+"tjQxsQnJ1S","FNYIMQ6Lix","zqH0Wru4UG","hSSvQ9eoRc","oQ87rNo0Qb","uoStwjSjS3","mz8gxIBe8k","5IhmG5Drn0","jS1aj14FLR","Cp3mZF6PT2",
+"24ARFGSQwj","0PktIMmKGJ","kZANmIRh48","VNCPdSbRYy","ni2v1ZuDtD","qaofNAXpwE","Oz8yZ9XyT9","v8yFNKASQ8","soy9tOUqFM","zY1GYfcJOy",
+"v1HlnWaim6","a00b5gf8rI","FhtglDLhzM","QClRLS2Dfu","iKqhr0h1b1","618Di2ZHdk","0KyfsD6rBy","uupzkjSjS3","aFFssPb1pa","vOqCEb29RJ",
+"FwEJzxReec","9GXkXpT8wu","6AFT0fmIK1","rz7UtcL0aE","HfyNQ9eoRc","v1Hln0Kyfs","dmoS7s4786","e6e4zM3zXL","vLsmShSSvQ","Yw2oUIjTwP",
+"uLtKsprNT6","8U2nUWaWsv","JXljWsqVrf","brhlQYw2oU","mX2GEHfyNQ","mz8gxWPmlx","b29RJfqypy","QbxXc7lUXZ","fcJOyiqv4k","0MR5Xv2eC3",
+"uN6r3POUYS","v8yFNMojnP","s47865ZaEz","lkMUA64s8N","hUTw78cVD3","X6Pin618Di","HfyNQs4786","prNT6t59lR","0YAGHU3yw5","4QMc9k85Ae",
+"v2eC3LDk6f","YOfrYeuZA5","2hEEUvLsmS","LewvMS2Dfu","J2mQi1LB1L","iqv4ks4786","BCxeC7ku1p","iKqhrpAhR1","NOHszd85a9","YOfrYQChxs",
+"NhXduRmDcr","kB5nPWmadA","K20wKcmXIX","FVMxoWPmlx","sx5GldhSuH","zHF1qMm8si","I7p2a55rfB","sqVrfpv0i7","Mkgy87hyVv","CxVEf0YAGH",
+"FnPFBh1zcH","8hJdtfaHir","ydG8UDcpWB","nlaBySmGzv","kZANmI7p2a","s4786lViBv","tAOsryvOMI","FNYIMCxVEf","gf8rIQChxs","IBe8klH1kt",
+"lsQGogdQsS","Dz1R3KZamH","29QAzTa8f6","BbwgAS2Dfu","Yf2Ec8RCUA","QbxXcsqVrf","HP433aFFss","FGzgpi3pyd","piJSkZUnqt","AIYUuHfyNQ",
+"TXQ0ZrKDLJ","jSjS3qQxHP","s93Ml580YD","OxWIH8hJdt","9y4lwwDajX","MojnPCNHmv","tjQxsjS1aj","OUYuFsqVrf","YjB9tMezSW","tuDySn8pJ9",
+"pv0i7HfyNQ","okgRijzUqR","BpYhVpFrrl","TXQ0Z1j5L8","Z4I1vChuy3","uoStwRsQUq","SmGzv3weIF","Kr8ysulk41","QYxC0QClRL","hSSvQVBjhz",
+"HfyNQtaOXK","fLNg8qUJMd","14FLRvkCHH","pWiOsK20wK","jfREudhSuH","14FLRJkzUn","fmIK1i3pyd","ru4UGgIYvE","2DREslpF6W","7hyVvrKDLJ",
+"TwanouJScX","zmLYDTXQ0Z","dpe1vyToGW","WmadA7X3uy","dmoS7jiVBP","Waim6h1zcH","fFDrJC2Irc","P6bcgtAOsr","XyPZNVIlwP","5VZjS3weIF",
+"tvdkDs4786","IBe8ksuY4x","hYBCK3weIF","pAhR12hEEU","pFrrliqv4k","FxX9q0Kyfs","W3VFHKsjRK","0KyfsqaofN","i7WMQM3zXL","4W0TlgIYvE",
+"dpe1vWaWsv","QClRLECMvU","yEfy9RzaZA","tlILtSmGzv","Yf2EcVprf2","lH1kt1j5L8","WPmlxKsjRK","L7cGcTCgPp","oGu6xVjCZq","ZUnqtFLsph",
+"ciuWzFNYIM","ZuDtDvkCHH","t98iWCK5W7","aDGtS7fsYM","BbwgAl83Ud","xXTI4W3VFH","Vprf2JXljW","VIlwPrKDLJ","OHaBzAIYUu","aFFssZv7z0",
+"rhl0Juvf7A","DQimpvkCHH","C2IrcoVQp6","iKqhriKqhr","VBjhzqQxHP","k85AeyToGW","0Wr5y3otm6","uupzklkMUA","zY1GY5Mg9r","sx5Glatef2",
+"cShY2qaofN","8FmFH2Nslm","xXTI4WreyP","OUYuFWaim6","Ul4a1uoStw","OHaBzFwEJz","S2Dfuxciqp","3otm6OUYuF","UlU3MyvOMI","VLTy65iGN5",
+"gdQsSmz8gx","14FLRZJTXH","zqH0Wn1pmO","QssNC9iGoT","AOgEejzUqR","bgJAzKZamH","Chuy3RzaZA","I7p2a7fsYM","QYxC0ECMvU","x3LDeuQIcz",
+"0Kyfsm4bxU","WMiS3ZzJHW","CqqaDs4786","LewvMHzZT8","n8pJ9MK07Y","5NammChuy3","n1pmOMmKGJ","C2IrcuZPqg","v2eC3MmKGJ","wDajXiwzGk",
+"AmdQdtaOXK","7X3uyKsjRK","GSQwjJRJQB","lXFOBlViBv","KZamH2TRI7","FGzgpNo0Qb","AkKTkbgJAz","aDGtSlH1kt","cShY2StlDJ","QYxC0yToGW",
+"RkQkeFhtgl","QssNCWPmlx","VNCPdkZANm","StlDJdjsrv","uZPqg5iGN5","zmLYDMkgy8","5IhmGNcICA","7ku1pNhXdu","MGlTFDQimp","cL0aEbZLvS",
+"AIYUuZzJHW","s93MlIKxdL","G1RhS9eoRc","pv0i7RzaZA","48cHLcQOnv","ThjNn8U2nU","7ku1pL7cGc","K4GS8tAOsr","GrDg7MmKGJ","4QMc9ksJby",
+"zqH0Wsoy9t","OUYuFECMvU","ydG8UMezSW","Ta8f6RmDcr","B3qemAkKTk","7Ow5CRpBQm","uoStw0YAGH","DLhzMDQimp","KsjRKMojnP","VNCPdru4UG",
+"0PktIThjNn","iKqhrPYBf4","jSjS39iGoT","6q6L9ix74r","FjHXRoGu6x","FGzgpCNHmv","atef2OUqFM","yToGWFwEJz","55rfBiB08l","Y1mC0JRJQB",
+"vLsmSZ4I1v","wDajXcL0aE","X6PinpiJSk","vOqCE14FLR","FjHXRhE1Ql","9eoRc8U2nU","ksJbyFwEJz","618DiyToGW","cL0aEzQt6Q","Vprf2xReec",
+"7hyVvZv7z0","EoToPEOE1o","FjHXR1v5hH","a00b5jzUqR","0YAGHNOHsz","FxX9qStlDJ","9rlg9FxX9q","AIYUuMezSW","TXQ0ZFFDui","G1RhSPb1pa",
+"pFrrl9iGoT","Mkgy8M3zXL","pvgjScmXIX","RpBQmXflUq","QworuQnJ1S","Waim6aL6AJ","FPfSElH1kt","SjskQC2Irc","uJScXNhXdu","2ZHdkyluBx",
+"i3pydKASQ8","zbIYYmX2GE","zY1GYyToGW","h1zcHFxX9q","AgJHQaL6AJ","k85AeRACuj","x3LDeX6Pin","WMiS3Kr8ys","Ss0ZuQssNC","AmdQdgdQsS",
+"45cIHsuY4x","X6Pinaez9y","soy9tUl4a1","IKxdLRxrsm","9rlg98FmFH","HRxd82ZHdk","NhXduVIlwP","pFrrlDG4sT","9GXkX580YD","zQt6QU3yw5",
+"Q6hMCxXTI4","Q6LixAgJHQ","MmsIoKZamH","7fKYUpT8wu","cQOnvZzJHW","64s8NRpBQm","0h1b1uupzk","djsrvHzZT8","1v5hHXyPZN","iqv4k5nmWv",
+"WPmlxFcWrW","AIYUuulk41","SjskQPb1pa","jeskS3weIF","pmeCdzHF1q","5IhmGn8pJ9","blLA9tjQxs","pT8wu5IhmG","ciuWzUl4a1","3otm69iGoT",
+"zz4ZUk85Ae","rKDLJbgJAz","KZamHRBhp0","hE1QlHRxd8","v8yFNJRJQB","zz4ZUQYxC0","i7WMQZ4I1v","7fKYUiqv4k","0YAGHy94nw","fcwDas7Mxk",
+"mX2GE8FmFH","yToGWuoStw","tAOsrlViBv","k85AecL0aE","xciqpOz8yZ","aez9yokgRi","yluBxfmIK1","HlUbFd7vjM","RBhp064s8N","HfyNQQ6hMC",
+"nFqik8TxD7","atef2CNHmv","lViBvS77LH","NAFuw4W0Tl","7X3uyhYBCK","t59lRv1Hln","KASQ8m4bxU","VIlwPDG4sT","he9IAUmaEv","gf8rIYf2Ec",
+"uAWypQYxC0","S77LHRmDcr","7ku1pYw2oU","RACujNo0Qb","IBe8klCMxy","UlU3MtlILt","qQxHPnlaBy","OUqFMQbxXc","AgJHQ48cHL","GWqqXfcwDa",
+"5nmWvFjHXR","ZhwG164s8N","wDajXSWfou","5nmWvd85a9","bZLvSSmGzv","suY4x2hEEU","CqqaDM3zXL","Nxx9Vsx5Gl","ni2v1LDk6f","I7p2aChuy3",
+"fcJOyRACuj","QssNCI7p2a","yofH30YAGH","v8yFNWDVWJ","fmIK1nnP8o","zY1GYzFgtB","zz4ZU2hEEU","prNT6QbxXc","Cfgr3nlaBy","0h1b1d85a9",
+"lViBvLbRTH","lXFOBZhwG1","lpF6WCdyBV","SmGzvXflUq","iqv4kReKEW","Chuy3aFFss","WaWsvuupzk","tjQxs2Nslm","o8UyduLtKs","IBe8kQWxoT",
+"B3qemciuWz","7fsYMuLtKs","dhSuHSWfou","7ku1pXflUq","AmdQdfmIK1","CxVEf0Wr5y","UlU3MJkzUn","uoStwwiHrZ","lViBvDz1R3","UlU3MD6rBy",
+"ksJbyIBe8k","2hEEUpWiOs","lj07QRzaZA","xReecgjUTu","ni2v1iwzGk","YjB9tkB5nP","RpBQm8FmFH","8cVD3Cfgr3","8cVD34dEz6","SmGzvRmDcr",
+"mX2GE6q6L9","Q6Lix45cIH","djsrvMaJQs","UmaEvOUqFM","0PktIcmXIX","fmIK1POUYS","yToGW0Kyfs","pmeCdTXQ0Z","Mkgy8IRh48","soy9tPOUYS",
+"Yh1hFBpYhV","xXTI424ARF","SjskQzQt6Q","POUYSMmsIo","ZuDtDCdyBV","xciqpRBhp0","6AFT05Drn0","3otm6yofH3","FPfSEfmIK1","D6rBymz8gx",
+"dmoS7cL0aE","QnJ1SJ2mQi","2Yz7EyEfy9","MmKGJuoStw","618DilXFOB","Gv3Fq1j5L8","FFDuini2v1","NOHszGXdoH","oVQp69iGoT","qQxHPtl72W",
+"Zv7z0HlUbF","DcpWBRACuj","qUJMd07n1c","MojnP07n1c","hi5X7JRJQB","uN6r3SbRYy","uAWypgIYvE","l83Ud2Nslm","uQIczAOgEe","yvOMIjzUqR",
+"lpF6W1v5hH","faHirpFrrl","CqqaD9y4lw","O3iyQHzZT8","zmLYD9iGoT","OHaBzWaim6","D6rByOz8yZ","v2eC3K20wK","jSjS37Ow5C","BbwgAZhwG1",
+"S77LHiB08l","ksJbyF6PT2","cL0aETa8f6","zmLYDguMb8","JJs5mjiVBP","LDk6f55rfB","BGaQYRsQUq","HP433In3NS","WDVWJRzaZA","0h1b1sx5Gl",
+"8xEKzU3yw5","y94nwAmdQd","0YAGHTCgPp","XyPZNP6bcg","XyPZNLewvM","piJSk7fsYM","AmdQdzqH0W","IKxdLQYxC0","ru4UGyvOMI","YOfrY64s8N",
+"7fKYUFGzgp","lsQGo9XyT9","cQOnvDLhzM","uZPqg7Ow5C","HP433I7p2a","Z4I1v0ao3l","Q6LixD6rBy","hSSvQxciqp","uPX7G7fsYM","tvdkDhE1Ql",
+"BFkb87X3uy","FLsphgjUTu","hi5X7Twano","uupzkIKxdL","jeskSmX2GE","n8pJ9CK5W7","4W0TlCxVEf","FFDuihYBCK","dpe1vYf2Ec","M3zXLIKxdL",
+"WMiS3hi5X7","iqv4kJKWYR","LDk6f3weIF","16lHcEOE1o","LDk6fzz4ZU","0BmCynFqik","64s8Nhe9IA","kZANmjtn0X","RACuj64s8N","Vprf2F6PT2",
+"jiVBP7lUXZ","pv0i7G1RhS","jS1ajlViBv","FnPFBaez9y","9eoRctvdkD","MGlTFlpF6W","dhSuHazIWp","NcICAOUYuF","JIqXipmeCd","9GXkXGWqqX",
+"jtn0X4QMc9","qUJMdksJby","s7MxkpT8wu","MmKGJ8xEKz","1v5hHrKDLJ","OUqFMv2eC3","uupzkyvOMI","s7Mxkk85Ae","FnPFBbrhlQ","Mkgy8M6qcG",
+"AXpwEjtn0X","MojnPNOHsz","fcJOyKr8ys","uPX7G24ARF","fFDrJdmoS7","POUYSKr8ys","5Drn0Kr8ys","Kr8ysRpBQm","FFDuiKr8ys","djsrvoQ87r",
+"CIShGZ4I1v","NAFuw0h1b1","QssNCS77LH","QWxoTkZANm","e6e4zbrhlQ","cmXIX8TxD7","uZPqg24ARF","Yf2EcQ6Lix","Vprf264s8N","RBhp0RBhp0",
+"vOqCEfmIK1","nnP8oWPmlx","RzaZAxciqp","29QAztuDyS","cQOnvv8yFN","F6PT2tAOsr","azIWplCMxy","8TxD7WreyP","n1pmOMaJQs","lH1kth1zcH",
+"Yw2oUZzJHW","d7vjM9y4lw","yofH3gdQsS","azIWpsx5Gl","yofH38FmFH","0YAGHDz1R3","iwzGkn1pmO","nFqikjeskS","HfyNQJJs5m","blLA9WMiS3",
+"OHaBzjSjS3","Oz8yZnlaBy","yvOMIwDajX","MmKGJrz7Ut","UlU3MZv7z0","F6PT2uoStw","OxWIHblLA9","cQOnvYf2Ec","fFDrJzmLYD","29QAz29QAz",
+"lj07QOUYuF","MmsIoBGaQY","b29RJqQxHP","48cHLAkKTk","ECMvUCIShG","tuDySMGlTF","6AFT0ydG8U","DQimpFnPFB","LDk6fcQOnv","YOfrYFPfSE",
+"KsjRKdQ586","5IhmG4dEz6","sqVrfcShY2","RsQUqyEfy9","pFrrlvLsmS","IKxdLBFkb8","h1zcHF6PT2","v1HlnJKWYR","RpBQmy94nw","hi5X7uAWyp",
+"AgJHQqaofN","s7Mxk1v5hH","ECMvURkQke","zz4ZUAkKTk","K20wKIRh48","2Yz7E1j5L8","lkMUADQimp","lViBv4QMc9","mz8gxd85a9","zHF1q7fsYM",
+"9rlg9tjQxs","azIWp2DREs","RkQkejeskS","B3qemqaofN","VLTy6Oz8yZ","EoToPa00b5","iB08lpmeCd","KsjRKlweGy","yEfy9Kr8ys","b29RJMm8si",
+"AgJHQpWiOs","5Mg9rPOUYS","LDk6fTwano","NhXdu0Wr5y","YOfrYb29RJ","RmDcreuZA5","qUJMdDcpWB","5nmWvQ6Lix","MmKGJNxx9V","aDGtSStlDJ",
+"C2IrcIn3NS","5Mg9rVNCPd","KASQ8LDk6f","zmLYDfmIK1","ciuWzFVMxo","uLtKsx3LDe","IjTwPWaim6","0ao3liqv4k","RBhp0CxVEf","lkMUAlm0pD",
+"6q6L9JKWYR","YOfrYcmXIX","QChxsM6qcG","cShY21LB1L","NcICA55rfB","SWfoue6e4z","L7cGcyToGW","piJSkZv7z0","t59lRzbIYY","JIqXiGrDg7",
+"FPfSETa8f6","l83UdEdBKc","QClRLhe9IA","yluBx64s8N","DG4sTOxWIH","he9IAyvOMI","Ss0ZutlILt","MezSWuPX7G","0Wr5yt59lR","tlILteuZA5",
+"5Drn0i3pyd","xReecFLsph","FxX9qPYBf4","DQimpWDVWJ","iB08lL7cGc","vLsmStjQxs","7ku1pOxWIH","Kr8ysLbRTH","VerEAcShY2","CIShGCfgr3",
+"AOgEeK4GS8","B3qemsoy9t","d85a9jtn0X","s93Mldjsrv","v2eC3SjskQ","9iGoTyToGW","NOHsz8U2nU","C2IrcZUnqt","jS1ajfcwDa","8hJdtKASQ8",
+"0h1b10YAGH","i3pydvLsmS","B3qemhe9IA","D6rByVerEA","JKWYREoToP","DLhzMy94nw","qaofNI7p2a","VjCZqHzZT8","RkQkeVjCZq","SmGzvStlDJ",
+"9XyT9OHaBz","guMb85VZjS","dmoS7DLhzM","UlU3MWMiS3","brhlQuLtKs","zQt6QpiJSk","uJScXwDajX","0ao3lCqqaD","zY1GYlH1kt","oVQp6qQxHP",
+"5Mg9rtlILt","ZUnqti3pyd","5iGN5dpe1v","0BmCyb29RJ","yofH3ZJTXH","fFDrJZUnqt","1v5hHEOE1o","xciqplpF6W","FxX9qFNYIM","atef20ao3l",
+"ECMvU9XyT9","FxX9q1j5L8","AmdQdFPfSE","Chuy3lm0pD","DQimpEOE1o","LbRTHhE1Ql","64s8NWreyP","uTacxrhl0J","hSSvQ5nmWv","ciuWz64s8N",
+"Z4I1vVIlwP","hYBCKU3yw5","Mm8sizqH0W","zmLYDiKqhr","yluBx4W0Tl","Waim6okgRi","oVQp6KZamH","qQxHPB3qem","zmLYDAkKTk","zmLYD2Yz7E",
+"gjUTudQ586","VIlwPAmdQd","pmeCd24ARF","uPX7GIjTwP","suY4xd85a9","TCgPp9GXkX","FGzgppFrrl","a00b5FnPFB","gjUTuuZPqg","NcICA8cVD3",
+"QbxXcGSQwj","2hEEUThjNn","Nxx9V5drc6","L7cGcfaHir","FGzgps93Ml","lpF6WkZANm","nFqikFcWrW","W3VFHaez9y","taOXKa00b5","lpF6WECMvU",
+"K20wKaDGtS","Z4I1v8cVD3","BpYhVZzJHW","IjTwPs7Mxk","29QAzRmDcr","S2Dfulj07Q","2Nslm4QMc9","8FmFHWaim6","9y4lwEOE1o","7lUXZxXTI4",
+"gf8rI0BmCy","HzZT8i7WMQ","suY4x64s8N","MGlTFnFqik","WMiS3tvdkD","1v5hHW3VFH","RxrsmZUnqt","9y4lw9y4lw","atef2uJScX","kB5nPOUYuF",
+"pAhR1lsQGo","fFDrJEOE1o","AIYUu7ku1p","D6rBycL0aE","faHirB3qem","nnP8oiqv4k","8hJdtaez9y","Twanoru4UG","blLA95Namm","8TxD7JRJQB",
+"lm0pDOxWIH","zmLYDm4bxU","YOfrY2Nslm","8hJdtjS1aj","D6rByqUJMd","QbxXctAOsr","7ku1pQnJ1S","qUJMdRACuj","8U2nUCxVEf","ni2v1pvgjS",
+"cmXIXcmXIX","NAFuwvkCHH","kB5nP8FmFH","gtCA5uZPqg","QbxXcJkzUn","iwzGk4W0Tl","3weIF5ZaEz","Mkgy84QMc9","TCgPpVLTy6","AXpwEX6Pin",
+"wDajX8hJdt","618DiW3VFH","Yf2Ecrhl0J","G1RhS2ZHdk","8FmFHydG8U","i3pydOxWIH","Yf2EcVLTy6","FhtglM3zXL","vLsmS5drc6","pT8wuk85Ae",
+"POUYSyEfy9","3otm6RzaZA","S77LHkZANm","RkQkeblLA9","JIqXiQYxC0","jzUqRKsjRK","2DREs5drc6","gjUTuYh1hF","LDk6fvOqCE","UlU3M64s8N",
+"MGlTFU3yw5","piJSkpmeCd","U3yw5iKqhr","fLNg8OHaBz","DG4sTydG8U","FGzgp1j5L8","FcWrWZJTXH","8RCUAK4GS8","SjskQuN6r3","S77LHdQ586",
+"ydG8UFjHXR","VjCZqzY1GY","QssNC618Di","J2mQieuZA5","NAFuwiB08l","In3NSDcpWB","zHF1q1LB1L","i3pydfcJOy","07n1clH1kt","pvgjSC2Irc",
+"aFFss16lHc","pmeCdyofH3","5drc6GWqqX","NcICAtvdkD","ydG8UnlaBy","jSjS3brhlQ","lsQGo5VZjS","lH1ktCK5W7","zbIYY4W0Tl","n8pJ9WmadA",
+"atef2Fhtgl","vkCHHJXljW","lViBvnFqik","iKqhrwDajX","580YDe6e4z","okgRiK4GS8","v1HlnFGzgp","hUTw7ZUnqt","CIShGxReec","SWfouoQ87r",
+"aFFssSjskQ","jiVBPWDVWJ","nFqik9y4lw","CK5W7X6Pin","Zv7z0oQ87r","LDk6fUmaEv","HRxd8lj07Q","IBe8kzFgtB","o8UydQbxXc","07n1ctlILt",
+"lweGyS77LH","RsQUqSbRYy","7lUXZ2DREs","lj07Qlm0pD","qQxHP4QMc9","b29RJgIYvE","guMb80h1b1","cShY216lHc","MK07YVerEA","O3iyQ7X3uy",
+"hYBCKs4786","3weIFS2Dfu","ZJTXHgtCA5","6q6L91LB1L","zHF1qLewvM","LewvM3weIF","qQxHPpWiOs","Vprf2Waim6","8cVD3atef2","WDVWJ0Wr5y",
+"jeskS2Yz7E","Ss0Zu3otm6","fcJOydQ586","BFkb8tvdkD","iKqhrHfyNQ","lsQGo0h1b1","SmGzvGrDg7","d85a9x3LDe","Nxx9V24ARF","14FLRRsQUq",
+"qUJMdciuWz","BFkb8VLTy6","F6PT2RzaZA","s93MlZv7z0","GXdoHJ2mQi","gdQsSFxX9q","lsQGoQClRL","QbxXchSSvQ","dpe1v5Mg9r","QbxXcgf8rI",
+"7fKYU7fsYM","lH1kto8Uyd","7hyVvLbRTH","In3NSpiJSk","MezSW5IhmG","Z4I1vcShY2","8xEKzhi5X7","Mm8sioQ87r","7fsYMs4786","JJs5mzY1GY",
+"gIYvEs93Ml","e6e4zQ6hMC","pAhR1k85Ae","MGlTF5nmWv","ZzJHWVjCZq","QYxC0uvf7A","G1RhSWreyP","h1zcHZhwG1","GWqqXNo0Qb","cmXIXYjB9t",
+"5ZaEzlpF6W","d85a9uJScX","i7WMQ0Wr5y","wiHrZrKDLJ","XflUqUlU3M","FwEJzVerEA","RzaZA0PktI","ZuDtDmX2GE","wDajXe6e4z","J2mQiv1Hln",
+"oQ87rCNHmv","MaJQsF6PT2","JKWYRFwEJz","kZANmFnPFB","xciqpQworu","GSQwj24ARF","8cVD3FNYIM","D6rByJXljW","jfREuhUTw7","n1pmOmz8gx",
+"G1RhSWmadA","RpBQmK20wK","0Wr5yVjCZq","IBe8kpT8wu","K20wKCNHmv","MmsIoyvOMI","iwzGkJ2mQi","pv0i75Mg9r","tjQxslm0pD","JXljWulk41",
+"dQ586h1zcH","pvgjS2TRI7","2NslmfcwDa","WPmlx0Kyfs","Uvlv4cQOnv","QClRLQnJ1S","I7p2av1Hln","jtn0XBpYhV","B3qemAOgEe","prNT67hyVv",
+"JIqXiVerEA","jtn0XVerEA","tvdkDiB08l","uQIczyofH3","7ku1pv8yFN","blLA9Q6hMC","tuDySBpYhV","xciqpxciqp","uoStwIRh48","OUqFM2hEEU",
+"Waim6WDVWJ","WDVWJs7Mxk","jfREu2hEEU","C2IrcZuDtD","U3yw5ThjNn","s93MloVQp6","AmdQdStlDJ","dmoS7M3zXL","uLtKs8FmFH","KsjRKGv3Fq",
+"aFFssdjsrv","ZuDtDlsQGo","nFqikhi5X7","gdQsSF6PT2","zqH0WCxVEf","Uvlv4suY4x","5IhmGnlaBy","ydG8UpFrrl","POUYSx3LDe","tuDySIKxdL",
+"BbwgAB3qem","ulk41YjB9t","Cp3mZECMvU","RsQUquQIcz","WMiS3CIShG","WPmlxTwano","jfREuNAFuw","8RCUAtjQxs","aL6AJ8hJdt","J2mQiZ4I1v",
+"FGzgpTa8f6","vLsmSKZamH","HlUbFWaim6","HRxd8bgJAz","fFDrJqQxHP","soy9tGXdoH","l83UdtAOsr","WPmlxb29RJ","JKWYR3weIF","rz7Utn1pmO",
+"In3NSIKxdL","lViBvReKEW","guMb8n1pmO","UlU3MuPX7G","jSjS3pvgjS","sx5Gldjsrv","GWqqXIBe8k","uoStwb29RJ","e6e4z7fKYU","M6qcGtaOXK",
+"9rlg9WreyP","lCMxygdQsS","taOXK3otm6","he9IAl83Ud","Pb1pam4bxU","Gv3FqcQOnv","ZJTXHYw2oU","Ul4a13otm6","GSQwjRpBQm","SmGzvMezSW",
+"FhtglQssNC","7fsYMNcICA","FcWrWuQIcz","0BmCyl83Ud","9iGoTCdyBV","fcwDaix74r","lH1kt07n1c","s7Mxk2hEEU","Ss0ZuX6Pin","FwEJzKr8ys",
+"tlILtSbRYy","fqypy5IhmG","i7WMQ7lUXZ","2Yz7EguMb8","1LB1Lhi5X7","KsjRK4W0Tl","16lHcJIqXi","zHF1qlH1kt","0Wr5yCqqaD","uupzkpAhR1",
+"W3VFHChuy3","fqypyLewvM","yofH3QChxs","7fKYUfLNg8","8cVD3DG4sT","JKWYR48cHL","WDVWJTwano","7fKYUpAhR1","MaJQs0h1b1","7lUXZKr8ys",
+"GWqqXlkMUA","5drc6F6PT2","prNT60Wr5y","hE1QlzmLYD","IRh48hUTw7","0h1b1Mkgy8","S2DfuThjNn","Ta8f6wiHrZ","lCMxyWMiS3","hSSvQFjHXR",
+"lXFOBi3pyd","dQ5865Namm","zbIYY45cIH","zHF1qyEfy9","Dz1R3CxVEf","piJSkTwano","LbRTHwDajX","9iGoTWDVWJ","QworuZJTXH","hYBCKtaOXK",
+"uPX7GdhSuH","yToGWGXdoH","BpYhVpv0i7","LewvMe6e4z","v2eC39GXkX","i7WMQx3LDe","NcICA14FLR","h1zcHI7p2a","s93MlIjTwP","uPX7Grhl0J",
+"zQt6QjeskS","0h1b1MK07Y","5IhmGIBe8k","QWxoTVBjhz","MmsIoFFDui","2Nslm8RCUA","4W0TlIKxdL","lXFOBhUTw7","VerEAVprf2","ksJbyjfREu",
+"J2mQiWaWsv","BCxeCJKWYR","tAOsrdhSuH","jfREuL7cGc","4QMc907n1c","WPmlxBCxeC","2DREsFVMxo","LDk6flCMxy","G1RhS8U2nU","gjUTuX6Pin",
+"Cfgr3SWfou","piJSkLDk6f","lkMUAWreyP","piJSk5iGN5","hUTw7zHF1q","zmLYDv2eC3","pvgjSM3zXL","uJScXDG4sT","P6bcg9iGoT","0BmCywDajX",
+"DG4sTYjB9t","a00b5pmeCd","5Drn0HfyNQ","Waim65VZjS","8TxD75Drn0","X6PinCK5W7","jfREuDQimp","IjTwP9GXkX","lm0pDW3VFH","9y4lwlH1kt",
+"DG4sTWreyP","L7cGcFNYIM","Oz8yZdhSuH","hYBCKpvgjS","Zv7z0YOfrY","CIShGsoy9t","NcICAa00b5","OUqFMMmsIo","JKWYRLewvM","Ul4a1hE1Ql",
+"EOE1onnP8o","Yw2oUlm0pD","S77LHSjskQ","M3zXLlpF6W","X6PinokgRi","618Di5nmWv","tlILtcL0aE","Cfgr3C2Irc","MGlTFuN6r3","CxVEfGSQwj",
+"5Mg9rJkzUn","MezSWVjCZq","jfREuJ2mQi","tvdkDyluBx","t59lRCp3mZ","zz4ZUjeskS","TwanoFjHXR","VIlwPBFkb8","hSSvQRpBQm","YjB9txReec",
+"0Wr5yEoToP","SWfouwDajX","uoStwMm8si","MezSWlCMxy","RzaZA2Nslm","CdyBVReKEW","2hEEUpmeCd","fcJOyhUTw7","sqVrfJkzUn","zqH0WhUTw7",
+"5VZjSIRh48","ECMvUI7p2a","S77LH9GXkX","3otm6l83Ud","dQ586oGu6x","oVQp6pT8wu","oGu6xb29RJ","KASQ8VerEA","dQ586Ss0Zu","QYxC0IjTwP",
+"Yw2oU4dEz6","Yw2oUv1Hln","5NammRxrsm","WaWsvwDajX","FFDuiS77LH","kZANmlXFOB","hi5X7yluBx","Pb1paogLgc","CK5W7aDGtS","LDk6fnFqik",
+"NAFuwYf2Ec","O3iyQ5iGN5","lpF6WZhwG1","cShY2hUTw7","zbIYYIKxdL","OxWIHn1pmO","Fhtglk85Ae","M6qcGuPX7G","0ao3l64s8N","lj07QMaJQs",
+"4W0TlwDajX","Cfgr3ZUnqt","JKWYRpv0i7","C2IrcwDajX","l83UdAkKTk","4W0TlbrhlQ","nFqikK4GS8","faHirZzJHW","AXpwEVjCZq","kB5nPEOE1o",
+"wDajXQWxoT","guMb8b29RJ","Q6LixS77LH","AOgEeaez9y","2Nslmgf8rI","14FLRdhSuH","1j5L8zQt6Q","lj07QHfyNQ","ulk41618Di","QworuuoStw",
+"lj07QzQt6Q","brhlQ2hEEU","YjB9tmz8gx","ECMvU7X3uy","kB5nPdmoS7","BFkb8BbwgA","sqVrfOz8yZ","1v5hHpFrrl","K4GS848cHL","LbRTH7ku1p",
+"LewvMlH1kt","FcWrW4dEz6","DQimpSbRYy","QClRL2ZHdk","16lHc5nmWv","MGlTFgf8rI","Mkgy8DQimp","WmadA8hJdt","BFkb8d85a9","LbRTHMezSW",
+"NhXdujiVBP","FnPFBru4UG","Q6Lix5drc6","v2eC3ECMvU","vOqCE5Namm","dmoS7iB08l","zHF1qlm0pD","cL0aEM6qcG","CIShGblLA9","xXTI4Waim6",
+"IjTwP9XyT9","7hyVvS2Dfu","cShY21v5hH","5Drn09GXkX","L7cGcHfyNQ","yluBxReKEW","5IhmGtvdkD","FPfSEa00b5","RkQkeX6Pin","TCgPpqUJMd",
+"BCxeCEOE1o","tlILtzbIYY","rKDLJ24ARF","QnJ1S4dEz6","MmsIofmIK1","07n1cPYBf4","tuDySuN6r3","x3LDeSs0Zu","a00b5guMb8","vLsmSgdQsS",
+"b29RJUlU3M","RpBQmyofH3","uLtKs0Kyfs","PYBf4AXpwE","SbRYyGrDg7","FLsph6q6L9","No0Qb8TxD7","aFFssXflUq","XyPZNQbxXc","ulk41GSQwj",
+"fqypy9y4lw","Mkgy8Nxx9V","dQ586U3yw5","tAOsrhe9IA","lViBvi7WMQ","he9IAfFDrJ","gf8rID6rBy","yToGWk85Ae","16lHc0Kyfs","SWfouZhwG1",
+"ZUnqtQbxXc","vkCHHguMb8","8xEKzYOfrY","jSjS37X3uy","RzaZA7X3uy","GrDg7TXQ0Z","HP433soy9t","yluBxcShY2","ZuDtDi7WMQ","Kr8ys64s8N",
+"uN6r3zHF1q","FwEJzJRJQB","d85a9M6qcG","wDajXfFDrJ","blLA9JIqXi","lH1kt8U2nU","Q6Lixsoy9t","k85AeuJScX","dhSuH6AFT0","NcICAM6qcG",
+"StlDJix74r","Fhtgldpe1v","n1pmOlCMxy","pFrrlS77LH","Yf2Ec9GXkX","t59lRFGzgp","WaWsv2Nslm","WreyPW7cTs","Mm8sib29RJ","qaofNsx5Gl",
+"h1zcHLewvM","ZzJHWwDajX","RpBQmQWxoT","7fKYUQChxs","7Ow5ClpF6W","hi5X7v2eC3","FjHXRfqypy","VLTy6X6Pin","MojnPlCMxy","I7p2ahi5X7",
+"QYxC0I7p2a","ydG8Ugf8rI","JKWYR3otm6","nlaByuQIcz","8xEKzsuY4x","i7WMQnnP8o","Rxrsm9iGoT","x3LDeazIWp","s7MxkRxrsm","uoStwuZPqg",
+"fcJOyQ6Lix","VerEAYOfrY","fFDrJ7fsYM","AOgEerhl0J","uQIczSbRYy","Yh1hFyofH3","W3VFHZUnqt","W7cTsuPX7G","UmaEvMm8si","zY1GYZUnqt",
+"gf8rIQworu","Yw2oUvOqCE","taOXKFPfSE","zY1GYXyPZN","xXTI4pFrrl","IRh48DcpWB","guMb8uPX7G","uvf7Alm0pD","tuDyS45cIH","EOE1o7lUXZ",
+"GrDg7OUqFM","16lHcFVMxo","LewvMokgRi","RpBQmlH1kt","TwanoJkzUn","uPX7GVIlwP","i7WMQ9y4lw","yvOMIgtCA5","uoStwi7WMQ","BGaQYdmoS7",
+"zHF1q4dEz6","dhSuHW7cTs","2TRI7F6PT2","n1pmOZv7z0","SmGzvaez9y","HlUbFHfyNQ","blLA9a00b5","gdQsSiB08l","BpYhVfmIK1","blLA99iGoT",
+"yEfy9IRh48","GXdoHHRxd8","xXTI4G1RhS","suY4x14FLR","9iGoTQChxs","Yf2Ec2TRI7","GWqqXuvf7A","CIShGdhSuH","HfyNQBbwgA","14FLRtlILt",
+"NAFuwv1Hln","P6bcgVNCPd","yluBx5nmWv","KZamHs7Mxk","WaWsv7ku1p","b29RJxciqp","lXFOB9iGoT","UlU3M0h1b1","QworuaFFss","1v5hHAkKTk",
+"8RCUA2hEEU","tjQxskZANm","LDk6fuPX7G","8xEKzFcWrW","ZhwG1Chuy3","FhtglhYBCK","gIYvEoVQp6","07n1cWmadA","0ao3lWaim6","bgJAz2DREs",
+"Pb1paVerEA","xXTI4sx5Gl","Yh1hFgdQsS","7fsYMogLgc","8RCUAGv3Fq","cmXIXQnJ1S","okgRiLbRTH","faHirzmLYD","S77LHX6Pin","piJSkqQxHP",
+"Z4I1vgtCA5","h1zcHThjNn","sqVrfdhSuH","EdBKcqUJMd","ReKEWs4786","ni2v1IKxdL","ciuWzmz8gx","Q6LixNcICA","M6qcGIBe8k","ix74raFFss",
+"s93Ml0h1b1","BbwgASbRYy","CK5W7VjCZq","4W0TlqUJMd","taOXKD6rBy","S2Dfu45cIH","ZuDtDuLtKs","tjQxsiKqhr","Waim6Twano","K4GS8hi5X7",
+"MGlTFEoToP","RACujCdyBV","1LB1LCqqaD","uJScXzz4ZU","In3NSoQ87r","MGlTFFVMxo","MojnPEdBKc","DQimpKZamH","zFgtBGv3Fq","I7p2aaFFss",
+"FxX9qn8pJ9","gjUTu5drc6","m4bxU9GXkX","WMiS30Kyfs","sx5GlSs0Zu","uLtKs5Drn0","dhSuHaFFss","nlaBymz8gx","WMiS3uTacx","MaJQslweGy",
+"jzUqRFnPFB","RmDcrD6rBy","wDajXlCMxy","S77LHiKqhr","AgJHQgtCA5","QClRLW3VFH","ksJbyChuy3","FnPFBG1RhS","2hEEUJKWYR","580YDGWqqX",
+"2ZHdkzqH0W","bgJAzBpYhV","AkKTk45cIH","brhlQatef2","MGlTFZ4I1v","iKqhr9rlg9","yToGWrhl0J","lCMxyUmaEv","rhl0JFGzgp","okgRirhl0J",
+"o8UydbgJAz","VjCZqTwano","rhl0J8FmFH","Rxrsmtl72W","fFDrJuLtKs","OUYuF7Ow5C","QworuFNYIM","JRJQBogLgc","1v5hHHRxd8","580YDzbIYY",
+"AXpwE5Drn0","Nxx9VlXFOB","8xEKzl83Ud","8TxD7HlUbF","MK07Yfqypy","C2IrcOUYuF","dpe1vAgJHQ","ZJTXHHlUbF","zFgtBFcWrW","RxrsmO3iyQ",
+"qQxHP7fKYU","DLhzM8xEKz","ECMvUNo0Qb","cQOnv0Wr5y","Dz1R39rlg9","5Drn0oQ87r","24ARFTwano","ZuDtDJIqXi","aL6AJCxVEf","2Yz7E6AFT0",
+"NOHszBbwgA","VIlwP1v5hH","jtn0XwDajX","W7cTsaFFss","NhXdum4bxU","0YAGHC2Irc","lsQGoUmaEv","2hEEUSs0Zu","aDGtSs7Mxk","J2mQiKr8ys",
+"M6qcGKZamH","3otm6djsrv","7fsYMMGlTF","WDVWJM6qcG","8FmFHJXljW","yToGWlpF6W","07n1cC2Irc","NcICASjskQ","2TRI7uAWyp","xciqpCIShG",
+"dpe1vX6Pin","faHirguMb8","QssNCKsjRK","tlILtUl4a1","zmLYDMmsIo","FjHXRFPfSE","J2mQi5IhmG","Ul4a1SmGzv","aez9yyofH3","W3VFH1j5L8",
+"GrDg7B3qem","Chuy32TRI7","Zv7z0pAhR1","EdBKcJ2mQi","FVMxoBGaQY","y94nw2Nslm","IKxdLm4bxU","2NslmHRxd8","ZzJHW7lUXZ","K20wKaFFss",
+"5drc68FmFH","NhXduW3VFH","CxVEflViBv","e6e4zqaofN","XflUqnnP8o","7lUXZt59lR","QnJ1SjfREu","C2Irc2ZHdk","rKDLJgjUTu","ru4UGatef2",
+"CIShGydG8U","BFkb8xXTI4","v2eC3SmGzv","tlILtfaHir","M3zXLzY1GY","iwzGkDLhzM","Y1mC02DREs","pAhR1ogLgc","AmdQddjsrv","OHaBzWDVWJ",
+"6q6L9U3yw5","piJSkcQOnv","i7WMQDLhzM","aDGtSdmoS7","0BmCyv8yFN","nlaBylm0pD","9XyT9IKxdL","P6bcgvkCHH","ksJby5nmWv","jS1ajfFDrJ",
+"lweGyv2eC3","tl72WUl4a1","pFrrlFxX9q","iqv4kzHF1q","xReecWDVWJ","In3NSy94nw","Mm8siGrDg7","pvgjSU3yw5","ksJbyHRxd8","xXTI4cShY2",
+"LbRTHguMb8","UlU3MgtCA5","FFDuiuvf7A","P6bcgpWiOs","KASQ8G1RhS","FnPFBn8pJ9","1j5L88RCUA","9GXkXO3iyQ","RsQUqzz4ZU","vkCHHdpe1v",
+"tl72WJKWYR","Cp3mZ3otm6","ZJTXHgf8rI","suY4xP6bcg","VjCZqrhl0J","BFkb8i3pyd","D6rByNo0Qb","BCxeCFFDui","AgJHQtlILt","ru4UGBbwgA",
+"4dEz6RBhp0","pWiOsoGu6x","5IhmGjS1aj","cQOnv8xEKz","7hyVv7fKYU","I7p2alj07Q","Pb1paUvlv4","hUTw75Drn0","9iGoTVLTy6","tAOsrru4UG",
+"lm0pDD6rBy","ZuDtDGXdoH","hSSvQYw2oU","hE1QlW3VFH","NcICAX6Pin","uQIcz3otm6","MojnP8RCUA","SmGzvHRxd8","5VZjSVNCPd","L7cGcY1mC0",
+"IKxdLs93Ml","mX2GEZJTXH","DQimpoQ87r","Yf2Ecm4bxU","BFkb8x3LDe","vLsmSbZLvS","JKWYRbrhlQ","uoStwd85a9","yToGWMm8si","K20wKQworu",
+"okgRiKZamH","gIYvEfcwDa","CK5W7WmadA","taOXKEdBKc","jzUqRReKEW","piJSkK20wK","VerEApT8wu","JXljWGv3Fq","Y1mC014FLR","Mkgy86AFT0",
+"CdyBVW3VFH","RACujRACuj","K4GS87fKYU","In3NSnlaBy","RpBQm45cIH","LbRTH5IhmG","jiVBPgjUTu","Zv7z0ThjNn","uoStwM6qcG","9GXkXsuY4x",
+"1j5L8gjUTu","TCgPpyvOMI","zHF1qsx5Gl","5Mg9rrhl0J","vLsmS0h1b1","7Ow5CRxrsm","dhSuHkZANm","RkQkeYf2Ec","ogLgcciuWz","BbwgAfcwDa",
+"djsrvW3VFH","7Ow5CFFDui","VerEA580YD","jzUqRW3VFH","QYxC0lXFOB","YOfrYqaofN","kZANmlj07Q","lm0pDIBe8k","jeskSxciqp","MGlTFrKDLJ",
+"pmeCdVjCZq","DLhzMO3iyQ","pmeCdJIqXi","y94nwB3qem","uLtKszbIYY","9XyT9dmoS7","RzaZAYh1hF","brhlQQnJ1S","SjskQt59lR","1LB1LfcwDa",
+"FcWrWk85Ae","NhXduMojnP","d85a9ZzJHW","uTacx8xEKz","dQ586AOgEe","pWiOstl72W","vkCHH9rlg9","2DREscmXIX","RmDcrNhXdu","EdBKc2Yz7E",
+"jiVBPlweGy","QClRLK20wK","9GXkXuJScX","s4786bZLvS","CdyBV6AFT0","TXQ0ZFVMxo","8FmFHkZANm","dmoS75IhmG","uoStwAkKTk","n8pJ9qaofN",
+"24ARFi3pyd","9GXkXv1Hln","iB08lKZamH","7hyVvXyPZN","y94nwjiVBP","zbIYYC2Irc","Z4I1vzFgtB","WreyPlpF6W","QnJ1SfcJOy","qaofNDz1R3",
+"0Kyfs9y4lw","i3pydO3iyQ","O3iyQtvdkD","2hEEUx3LDe","VerEA5IhmG","LbRTHpWiOs","QWxoTSs0Zu","9XyT9fmIK1","G1RhSt59lR","lm0pDTwano",
+"9y4lwNOHsz","4W0TlZhwG1","1j5L8Qworu","OUqFM8cVD3","cQOnvVjCZq","0h1b1cShY2","gtCA59iGoT","gjUTuZUnqt","bZLvSTwano","KASQ81LB1L",
+"JIqXiVBjhz","VLTy6tl72W","oGu6xhYBCK","580YDprNT6","5NammfaHir","fmIK1EdBKc","OxWIHt59lR","VIlwPjiVBP","55rfBM3zXL","yEfy9Mm8si",
+"DQimp7fsYM","5NammW3VFH","U3yw5ReKEW","0MR5X0ao3l","bgJAzMmKGJ","RsQUqo8Uyd","2ZHdkk85Ae","RsQUqrKDLJ","JkzUnuAWyp","h1zcHGSQwj",
+"hSSvQ5iGN5","dQ586VBjhz","K20wKFcWrW","Mm8siUmaEv","6q6L9MGlTF","QssNCi7WMQ","tvdkDs7Mxk","djsrv55rfB","vOqCEOHaBz","FNYIMRzaZA",
+"8cVD3uAWyp","o8Uyd9y4lw","rz7UtsuY4x","Dz1R3lj07Q","BbwgAW3VFH","CNHmvEdBKc","ix74rLewvM","d85a9zbIYY","EOE1oxXTI4","Vprf2BCxeC",
+"uJScXatef2","BCxeCpv0i7","vkCHHTXQ0Z","vLsmSEoToP","pv0i7v2eC3","uPX7GZuDtD","4QMc9SWfou","QnJ1SYh1hF","cShY2ZhwG1","d7vjMUvlv4",
+"BGaQYni2v1","iwzGkqQxHP","QYxC0tvdkD","pAhR1ydG8U","rhl0JyvOMI","xciqpOUqFM","uJScX7fKYU","dQ586No0Qb","hUTw7ru4UG","580YDVjCZq",
+"FnPFB5Drn0","zmLYDS2Dfu","NAFuwIjTwP","lweGylj07Q","mz8gxazIWp","618DiAXpwE","CxVEfuupzk","QWxoTdhSuH","FLsphJIqXi","uoStwM3zXL",
+"gjUTuAOgEe","8xEKzzQt6Q","yEfy9580YD","ni2v1jeskS","NOHszhYBCK","dpe1vWPmlx","In3NS48cHL","t59lRa00b5","soy9tKASQ8","8U2nU45cIH",
+"CxVEfcShY2","MGlTFzmLYD","TwanookgRi","yEfy9yofH3","MaJQsSbRYy","3otm6lXFOB","pv0i7IBe8k","Ul4a12ZHdk","dmoS77fKYU","C2IrcFnPFB",
+"lXFOBF6PT2","prNT69eoRc","W7cTsjtn0X","uAWypxXTI4","uvf7A7hyVv","StlDJs7Mxk","yToGWVIlwP","tlILtWreyP","FVMxo45cIH","WreyPn1pmO",
+"Yf2EcprNT6","LDk6f7Ow5C","pAhR1F6PT2","WMiS3OUqFM","6AFT0dpe1v","zqH0W0ao3l","OUYuFgIYvE","hi5X7aDGtS","WreyP4W0Tl","MezSW618Di",
+"fcwDa618Di","jfREuuJScX","JKWYROUYuF","NcICALDk6f","U3yw5Yh1hF","gIYvEkZANm","FPfSEJXljW","guMb8XyPZN","FFDui2TRI7","ZzJHW8xEKz",
+"zHF1q0h1b1","RxrsmAgJHQ","LbRTH9eoRc","ydG8Ujtn0X","L7cGcokgRi","x3LDetuDyS","xXTI4S2Dfu","bZLvSi7WMQ","KZamHrKDLJ","dhSuHX6Pin",
+"JIqXiCNHmv","3weIFVLTy6","ZUnqtFnPFB","dQ586zz4ZU","StlDJt59lR","prNT6brhlQ","O3iyQlsQGo","5Drn0tuDyS","Nxx9VFNYIM","Rxrsm2TRI7",
+"OUYuFTCgPp","zY1GY4QMc9","pAhR1WreyP","uupzk8FmFH","ThjNnyofH3","WaWsvRsQUq","G1RhSuTacx","IRh48IjTwP","Yw2oU2hEEU","djsrvReKEW",
+"7Ow5C5IhmG","X6Pinv2eC3","bgJAzQnJ1S","ksJbyIn3NS","HlUbFYf2Ec","pmeCdpmeCd","oVQp6zFgtB","sx5GlVBjhz","3weIFtaOXK","I7p2ahYBCK",
+"45cIHlpF6W","I7p2aoVQp6","azIWp0Kyfs","KASQ8yofH3","ciuWzCfgr3","wiHrZ6q6L9","64s8NxReec","tl72WjS1aj","FnPFBQYxC0","fLNg8MojnP",
+"ni2v1W7cTs","Zv7z05Drn0","uZPqg7lUXZ","nnP8oLbRTH","DQimpn8pJ9","14FLR7X3uy","16lHcLewvM","D6rByZzJHW","7fsYM7lUXZ","gIYvEZUnqt",
+"FGzgpv8yFN","fmIK1TXQ0Z","kB5nPHfyNQ","x3LDeiqv4k","y94nw5iGN5","XflUq8U2nU","7lUXZKZamH","s93MlGXdoH","F6PT2pv0i7","AOgEeWmadA",
+"AgJHQyofH3","NOHszTCgPp","YjB9tguMb8","LDk6fgjUTu","soy9tsx5Gl","HlUbFfaHir","Ul4a19y4lw","piJSkIKxdL","VLTy68RCUA","FFDuiGWqqX",
+"Ss0ZuWreyP","v1HlndhSuH","StlDJ7hyVv","ksJbytl72W","he9IAGSQwj","0Wr5y48cHL","XflUqBpYhV","EOE1oKZamH","vOqCEJKWYR","zbIYYOHaBz",
+"CqqaDMmKGJ","o8UydWreyP","GWqqXuJScX","pAhR1JkzUn","OHaBzS77LH","C2IrczY1GY","PYBf49y4lw","jSjS32ZHdk","fqypy7ku1p","7lUXZCK5W7",
+"djsrv0h1b1","5Mg9rX6Pin","RzaZABCxeC","wiHrZHP433","GSQwjCp3mZ","580YD7lUXZ","dhSuHksJby","AOgEeFjHXR","BGaQYPOUYS","v8yFNprNT6",
+"IRh48M3zXL","tAOsrVNCPd","S2Dfu16lHc","MaJQsgtCA5","HP433uupzk","7Ow5CGv3Fq","jiVBP2Nslm","FFDuiprNT6","7X3uyokgRi","6q6L9blLA9",
+"YjB9tL7cGc","pmeCdlCMxy","VerEAYf2Ec","D6rBy580YD","Y1mC0oGu6x","zQt6QZv7z0","0h1b1F6PT2","lCMxy9GXkX","IBe8kQnJ1S","VjCZqb29RJ",
+"0YAGHVprf2","ydG8UjfREu","BCxeCpvgjS","TXQ0Zaez9y","lm0pDThjNn","AOgEetaOXK","yEfy9ru4UG","NcICA7Ow5C","W7cTsRpBQm","FcWrWM6qcG",
+"YjB9tokgRi","9y4lwn8pJ9","vkCHHlsQGo","QClRLiB08l","yofH30Kyfs","vkCHHKr8ys","VBjhzdQ586","cmXIXFxX9q","kB5nPRBhp0","cmXIXAmdQd",
+"WDVWJuQIcz","pWiOsStlDJ","Ul4a1NAFuw","e6e4zmX2GE","t98iWbrhlQ","i7WMQCqqaD","uZPqgDLhzM","pvgjSnlaBy","piJSk8xEKz","BpYhVru4UG",
+"dhSuHUlU3M","OHaBztvdkD","YjB9tSmGzv","qQxHPrKDLJ","OHaBzfqypy","rz7UtNhXdu","JkzUn8FmFH","t98iWksJby","8TxD7D6rBy","i7WMQs4786",
+"2hEEUwiHrZ","RsQUqOz8yZ","X6Pins93Ml","1v5hH48cHL","Ta8f60Kyfs","QClRLwDajX","9y4lwAIYUu","lweGyKsjRK","bgJAzjiVBP","pWiOsuTacx",
+"gIYvEO3iyQ","QWxoTgtCA5","azIWpnFqik","M3zXLoQ87r","bZLvSwDajX","d7vjMIjTwP","iB08l5Namm","4W0TlG1RhS","HzZT824ARF","rhl0JydG8U",
+"cL0aEJJs5m","taOXK8U2nU","RzaZAKASQ8","5Mg9rEOE1o","8xEKzUmaEv","WreyPQworu","uupzkFxX9q","bgJAzeuZA5","FLsphyofH3","pT8wuogLgc",
+"BGaQYHP433","POUYS9XyT9","iqv4ktjQxs","0Wr5yYjB9t","45cIHOUqFM","uupzkBCxeC","ydG8UgtCA5","4dEz6CNHmv","a00b5I7p2a","d7vjMpFrrl",
+"yEfy948cHL","jtn0XEoToP","0YAGHBFkb8","0Wr5yNcICA","zmLYDcShY2","qaofNv8yFN","0YAGHF6PT2","pAhR1aez9y","W3VFHQYxC0","zbIYYGrDg7",
+"14FLRVBjhz","ulk41jiVBP","IjTwPMojnP","3otm6zFgtB","Gv3Fqxciqp","1v5hHCqqaD","nFqikRkQke","ydG8UKASQ8","vkCHHQbxXc","In3NSvkCHH",
+"QChxs48cHL","tl72WQYxC0","AXpwExReec","9GXkXnlaBy","0YAGHs93Ml","jzUqRgtCA5","IKxdLzz4ZU","t59lR2hEEU","D6rByQworu","yToGWlXFOB",
+"zbIYYCfgr3","ZzJHWAmdQd","FhtglIKxdL","aL6AJSs0Zu","2Nslm9iGoT","S2DfuFjHXR","BpYhVMmKGJ","HlUbFhE1Ql","AkKTk2TRI7","0YAGHt59lR",
+"lkMUAfcJOy","bgJAzpWiOs","JKWYR7lUXZ","tuDySThjNn","DLhzMl83Ud","FjHXRLbRTH","rKDLJ0Kyfs","RsQUqQnJ1S","3otm62hEEU","AkKTkv2eC3",
+"DcpWBs93Ml","2ZHdkZhwG1","Ss0ZuIKxdL","RBhp0AIYUu","QWxoTDz1R3","aez9yYjB9t","5ZaEz7fKYU","CqqaDlj07Q","FLsphjeskS","1LB1LFhtgl",
+"CxVEfAgJHQ","JKWYRiKqhr","i3pydciuWz","SbRYyFnPFB","taOXKBFkb8","Waim6IBe8k","ZuDtDa00b5","14FLRmz8gx","yofH3uQIcz","C2Irc7fsYM",
+"2hEEUlsQGo","O3iyQFPfSE","U3yw5soy9t","Qworu4QMc9","SjskQVBjhz","Q6LixHfyNQ","29QAzuQIcz","Yw2oUhSSvQ","gIYvEjeskS","Yf2EcEdBKc",
+"5Drn0B3qem","07n1c618Di","tjQxsrKDLJ","SmGzvYh1hF","K20wKrKDLJ","VerEATCgPp","HRxd8lkMUA","s7MxkYjB9t","UmaEv9iGoT","djsrvjSjS3",
+"5iGN5uLtKs","7hyVvi7WMQ","GWqqXrhl0J","m4bxUpWiOs","fLNg88xEKz","5nmWvuJScX","AkKTk29QAz","JIqXiWDVWJ","lm0pDK4GS8","VNCPd1j5L8",
+"m4bxUJ2mQi","0YAGHx3LDe","Chuy35Drn0","OUYuFmX2GE","JKWYRLDk6f","yluBxOUYuF","QnJ1S45cIH","Y1mC0RpBQm","rz7UtpiJSk","16lHcWDVWJ",
+"JkzUn2TRI7","fcwDatlILt","CK5W7JXljW","zHF1qP6bcg","YjB9t29QAz","9XyT9M3zXL","7X3uyJ2mQi","FnPFBOUYuF","s4786piJSk","7Ow5CiKqhr",
+"7hyVvSjskQ","KsjRK5ZaEz","uoStw0ao3l","Q6hMCCfgr3","Dz1R3Zv7z0","faHiriwzGk","WDVWJgtCA5","MaJQsPOUYS","pFrrlpvgjS","vkCHHlm0pD",
+"v2eC3WPmlx","9GXkXOz8yZ","7Ow5CDG4sT","yluBxBpYhV","Uvlv4JkzUn","In3NS07n1c","FGzgp7lUXZ","xXTI4WmadA","K20wKSs0Zu","uupzkZJTXH",
+"nFqikUl4a1","guMb8FjHXR","a00b5LewvM","bgJAzazIWp","yofH3euZA5","Yf2EcQworu","GSQwjjeskS","DQimpeuZA5","Waim62DREs","pFrrlAgJHQ",
+"0BmCyQYxC0","FhtglNo0Qb","Z4I1vFLsph","fcJOyZ4I1v","d85a9KsjRK","CK5W75IhmG","JRJQBFNYIM","jzUqRhE1Ql","Chuy3BbwgA","tuDySKsjRK",
+"pT8wu8FmFH","nnP8oG1RhS","ZhwG1xXTI4","F6PT2S77LH","v2eC30MR5X","NcICAU3yw5","jzUqRFGzgp","64s8NRkQke","fFDrJ2ZHdk","Gv3FqPb1pa",
+"e6e4zlj07Q","AOgEeD6rBy","v8yFNiwzGk","dQ586uTacx","ZJTXH8xEKz","M3zXLJ2mQi","8TxD7fcwDa","J2mQi3weIF","NOHszbZLvS","uvf7AgIYvE",
+"dQ586s4786","a00b5xciqp","LewvMzFgtB","uQIcz2ZHdk","ZhwG1Dz1R3","WPmlxDG4sT","F6PT2bZLvS","GSQwjtAOsr","Waim6e6e4z","tuDySS77LH",
+"soy9tWMiS3","iqv4k6q6L9","qQxHPl83Ud","618DiZzJHW","taOXK8xEKz","JKWYRTXQ0Z","7X3uyBFkb8","JXljWKr8ys","5Mg9rP6bcg","Nxx9VGWqqX",
+"v1Hln5Drn0","uN6r32Nslm","oGu6xjtn0X","WmadA4QMc9","Mm8sidjsrv","BFkb8dQ586","pv0i7FVMxo","Ss0ZuogLgc","HzZT8bZLvS","OUqFMZhwG1",
+"x3LDeQWxoT","VerEApWiOs","lViBvUlU3M","TCgPpGSQwj","lj07QPYBf4","8hJdtEOE1o","mX2GEOUYuF","ZUnqtvOqCE","vkCHHYf2Ec","oVQp6Yf2Ec",
+"G1RhSogLgc","wDajXlpF6W","i7WMQZJTXH","CdyBV7X3uy","5IhmGh1zcH","5Mg9rlCMxy","2NslmdhSuH","L7cGcuN6r3","9y4lw6AFT0","CqqaDdjsrv",
+"nFqikaFFss","ReKEW7Ow5C","5Mg9rYjB9t","tlILtAXpwE","In3NSTwano","Oz8yZnFqik","uvf7AVerEA","JRJQB9XyT9","45cIHaFFss","y94nwOHaBz",
+"WreyP2hEEU","CIShGtvdkD","QClRL0YAGH","atef2n1pmO","n8pJ955rfB","pv0i7FGzgp","JkzUnyToGW","9eoRcpWiOs","Yh1hFjeskS","ksJby9GXkX",
+"ulk41oGu6x","pvgjSlXFOB","7ku1pEdBKc","mX2GE7lUXZ","Q6LixtuDyS","uPX7GFxX9q","B3qemFjHXR","MojnPSs0Zu","0KyfsP6bcg","zY1GYpiJSk",
+"e6e4zy94nw","yvOMIIn3NS","W3VFHTwano","1LB1LbgJAz","lpF6WblLA9","2hEEUTXQ0Z","jSjS3L7cGc","Vprf2GWqqX","fcJOyWreyP","Mkgy8v8yFN",
+"lpF6WgdQsS","AXpwEKZamH","D6rByMK07Y","ReKEWMm8si","mX2GE55rfB","pAhR15Drn0","SjskQogLgc","gtCA5soy9t","7hyVveuZA5","2TRI7IRh48",
+"HP433Twano","Zv7z0JRJQB","l83UdRkQke","hi5X71j5L8","TCgPpWaWsv","qaofNBbwgA","W3VFH3weIF","uvf7A8cVD3","RsQUqZzJHW","zbIYYzQt6Q",
+"FLsphQnJ1S","14FLRlCMxy","nFqikLbRTH","MaJQsRBhp0","OUqFMtAOsr","U3yw5v1Hln","v1Hlnh1zcH","piJSkBpYhV","jtn0XcShY2","euZA5WMiS3",
+"F6PT248cHL","guMb8LbRTH","HRxd8y94nw","I7p2aKZamH","prNT6POUYS","pmeCdi3pyd","Mm8siI7p2a","pmeCdPb1pa","e6e4z9y4lw","lweGyeuZA5",
+"XyPZNX6Pin","i7WMQ2Yz7E","lm0pDuPX7G","xciqpsoy9t","5Nammd7vjM","CdyBVksJby","mX2GEjeskS","RkQkeJJs5m","14FLR9rlg9","WMiS3QssNC",
+"CdyBV9eoRc","lCMxylCMxy","J2mQijS1aj","29QAzuvf7A","zz4ZUkZANm","nlaByv8yFN","AmdQdlweGy","XflUqv2eC3","zQt6Qgf8rI","m4bxUy94nw",
+"Zv7z0OUqFM","G1RhSiB08l","X6PinciuWz","nnP8olH1kt","Nxx9VFxX9q","UlU3M8FmFH","fmIK124ARF","S77LHS77LH","ECMvUlj07Q","QssNCcmXIX",
+"P6bcgHfyNQ","b29RJFPfSE","5iGN5wiHrZ","iqv4kB3qem","8hJdtVjCZq","zHF1qhe9IA","jS1ajWMiS3","QnJ1SvkCHH","i7WMQCK5W7","8cVD3Dz1R3",
+"1LB1L7Ow5C","B3qemTa8f6","soy9tSmGzv","bgJAz5drc6","oVQp60ao3l","ECMvU2ZHdk","8cVD30MR5X","9rlg9uJScX","uPX7G7ku1p","0KyfseuZA5",
+"rKDLJ48cHL","wiHrZzHF1q","d85a9xReec","Mm8sizY1GY","NAFuwOUYuF","Q6Lix8TxD7","Yf2EctvdkD","MmKGJcL0aE","qUJMdGrDg7","kZANmuTacx",
+"AgJHQJXljW","MezSWQClRL","Nxx9VPb1pa","QChxsGrDg7","9XyT95IhmG","Mkgy8yluBx","8cVD3he9IA","JJs5mxciqp","oVQp6zqH0W","StlDJgtCA5",
+"L7cGczmLYD","AmdQdqaofN","UmaEvSjskQ","prNT6L7cGc","s4786dmoS7","SbRYyuJScX","BCxeCEdBKc","8cVD3a00b5","JKWYRhUTw7","29QAzFLsph",
+"pvgjS6q6L9","euZA57Ow5C","jzUqRBCxeC","EOE1ofcwDa","uJScX9y4lw","Ul4a18RCUA","FnPFBrhl0J","mz8gx0h1b1","suY4x5IhmG","nFqikaL6AJ",
+"14FLRuTacx","3weIFZuDtD","0YAGHFwEJz","lH1kt8hJdt","JJs5mTCgPp","CIShGAgJHQ","2hEEUn8pJ9","a00b524ARF","WDVWJRpBQm","G1RhS29QAz",
+"azIWpFnPFB","jeskS8xEKz","IRh48Qworu","1LB1Li3pyd","RACujjfREu","GXdoHsuY4x","M3zXLtlILt","azIWppiJSk","HzZT8W3VFH","MmsIoXyPZN",
+"a00b5XflUq","CK5W7lpF6W","LbRTHfFDrJ","yofH3v8yFN","dhSuH8U2nU","ThjNn7hyVv","9GXkXYw2oU","ReKEWa00b5","oGu6xciuWz","x3LDe07n1c",
+"DLhzMCIShG","HlUbF5VZjS","okgRiKr8ys","Mm8sifFDrJ","Cfgr3e6e4z","faHirlsQGo","RxrsmUvlv4","8TxD7Yf2Ec","7lUXZSbRYy","tjQxscQOnv",
+"Uvlv4Vprf2","NOHsz2DREs","FPfSE1j5L8","QChxsLewvM","KASQ8QClRL","dmoS7yEfy9","nFqikVerEA","IBe8kbgJAz","l83UdpmeCd","07n1cFLsph",
+"uN6r3O3iyQ","W3VFHZJTXH","VjCZqpiJSk","FcWrWqUJMd","CxVEf8FmFH","lViBv5Mg9r","5ZaEzRkQke","iKqhr1j5L8","gtCA5zY1GY","7fKYULbRTH",
+"IjTwPRBhp0","9rlg9mz8gx","uTacxX6Pin","6q6L94dEz6","NhXdufaHir","8FmFHAXpwE","he9IAIjTwP","DQimpDcpWB","oVQp6MezSW","JIqXib29RJ",
+"QYxC0uLtKs","t98iWgf8rI","RACujNOHsz","iwzGkFNYIM","aDGtSSmGzv","JXljW0Wr5y","RACujaDGtS","n8pJ9Chuy3","ksJbys7Mxk","yEfy9AmdQd",
+"lweGyFcWrW","W3VFHNxx9V","hUTw7tjQxs","faHirbgJAz","D6rByCfgr3","lCMxy7hyVv","v8yFNLDk6f","hYBCKAIYUu","sx5GlS2Dfu","0MR5XYjB9t",
+"CIShG7fKYU","hYBCKzqH0W","tAOsrVBjhz","FnPFBcL0aE","WMiS3FcWrW","EdBKczmLYD","oVQp6fLNg8","dhSuH5ZaEz","StlDJJKWYR","CK5W79rlg9",
+"BFkb8jS1aj","KsjRKnlaBy","Oz8yZS77LH","07n1cFFDui","POUYSQYxC0","WmadARpBQm","W7cTs9eoRc","cShY25Namm","FPfSEXyPZN","yToGWjzUqR",
+"cShY2aez9y","0MR5XMK07Y","GrDg7IRh48","dmoS7IRh48","LDk6f6q6L9","64s8NFjHXR","v8yFNv1Hln","ydG8UThjNn","8cVD3StlDJ","Pb1pauTacx",
+"CK5W7dmoS7","OHaBzPOUYS","X6Pinni2v1","MK07YblLA9","QClRLpWiOs","MGlTFo8Uyd","blLA9kZANm","64s8N29QAz","vOqCEdQ586","lkMUApFrrl",
+"vOqCEU3yw5","I7p2a5drc6","oVQp6QYxC0","4W0TlCdyBV","48cHL7X3uy","uQIczEOE1o","FPfSEMojnP","IKxdLFwEJz","QWxoTCIShG","QYxC0RzaZA",
+"BCxeCgtCA5","uoStwFNYIM","JIqXiO3iyQ","6q6L9CK5W7","D6rByHRxd8","hi5X7KASQ8","ReKEWEOE1o","tvdkD8U2nU","AOgEemz8gx","07n1cbgJAz",
+"fFDrJGSQwj","zmLYD8cVD3","PYBf4XflUq","EOE1ohe9IA","k85AeJXljW","PYBf4AOgEe","HlUbFJKWYR","Vprf2VerEA","lCMxy5nmWv","EoToPWDVWJ",
+"gtCA5rKDLJ","CNHmvVLTy6","Pb1paCp3mZ","4W0TljiVBP","Q6LixbgJAz","faHirfmIK1","0Wr5yt98iW","Dz1R3UlU3M","VjCZqrz7Ut","yvOMIdpe1v",
+"NOHszFNYIM","8xEKzbgJAz","hi5X7FPfSE","hUTw7SjskQ","zHF1qzFgtB","9y4lwQworu","2Yz7EVIlwP","jtn0XG1RhS","bgJAzbrhlQ","SWfou2ZHdk",
+"IRh48soy9t","fLNg8StlDJ","No0Qb64s8N","Nxx9VCp3mZ","AIYUuogLgc","BbwgA16lHc","aL6AJFwEJz","8TxD7RkQke","7fKYUuPX7G","n8pJ9jSjS3",
+"FVMxoRxrsm","Gv3Fq9GXkX","RkQkelsQGo","RzaZA0MR5X","VerEA7fKYU","5ZaEzvOqCE","yluBxWreyP","4W0Tl7fKYU","djsrvmz8gx","gdQsSfcwDa",
+"LbRTHtl72W","SmGzvulk41","ZhwG1lH1kt","CIShGZuDtD","OUYuFMaJQs","CNHmvRkQke","rKDLJ5Mg9r","uLtKssx5Gl","zmLYDDz1R3","16lHczmLYD",
+"618DiLewvM","5NammhYBCK","QworubZLvS","FFDui8cVD3","nnP8o7hyVv","D6rBy8cVD3","U3yw5HfyNQ","9rlg9fFDrJ","9eoRc8xEKz","GSQwjX6Pin",
+"gIYvEdjsrv","Z4I1v14FLR","CIShGazIWp","O3iyQFFDui","a00b52Nslm","fqypyPOUYS","okgRiEdBKc","e6e4zyToGW","hi5X7U3yw5","djsrvhSSvQ",
+"Q6hMCuAWyp","fcJOyHfyNQ","1j5L8uvf7A","FNYIMAXpwE","zmLYDrKDLJ","9GXkXprNT6","piJSkNAFuw","uAWypa00b5","iwzGkuJScX","rKDLJTCgPp",
+"GrDg7Q6hMC","a00b5S2Dfu","fqypygIYvE","aDGtSt98iW","45cIHyluBx","6AFT0NOHsz","0Wr5y0h1b1","07n1c8RCUA","LDk6f8hJdt","3otm60YAGH",
+"Mkgy8aDGtS","FFDuiEoToP","5drc6KsjRK","I7p2a6AFT0","DQimpS77LH","Ta8f6s7Mxk","AIYUu8U2nU","StlDJC2Irc","ksJbyXyPZN","2NslmZUnqt",
+"BGaQYFVMxo","SbRYyMGlTF","D6rByDz1R3","FVMxoMaJQs","Y1mC0lH1kt","FPfSEpmeCd","Mm8siuQIcz","3otm6lj07Q","lH1ktOHaBz","EOE1oZUnqt",
+"pAhR1zqH0W","jtn0Xs7Mxk","YOfrYblLA9","gtCA5DLhzM","2TRI7rhl0J","GSQwjUmaEv","HRxd81j5L8","qUJMd5Namm","rz7UtUvlv4","UlU3Mhi5X7",
+"3weIFsqVrf","yvOMIn1pmO","Yw2oUhE1Ql","HRxd8pmeCd","gdQsSb29RJ","45cIHGrDg7","SjskQQssNC","16lHcpiJSk","Z4I1vStlDJ","SbRYytuDyS",
+"FcWrWfqypy","7hyVvDG4sT","P6bcgBFkb8","MezSWSbRYy","45cIHSs0Zu","taOXK45cIH","7ku1pDQimp","2hEEU5iGN5","29QAzulk41","vkCHHazIWp",
+"VNCPd580YD","m4bxUTXQ0Z","vOqCEksJby","VerEAKZamH","5Mg9ruJScX","MmsIoOz8yZ","8cVD3s4786","QClRLs4786","K20wK45cIH","4dEz6Kr8ys",
+"4W0TlRBhp0","X6PinUl4a1","8RCUAjS1aj","FxX9qyvOMI","lH1ktI7p2a","P6bcgBGaQY","oVQp6In3NS","v8yFN5Drn0","MmsIorz7Ut","XflUqEdBKc",
+"TwanoxReec","OUYuFuLtKs","qaofNlpF6W","Ta8f6tvdkD","QssNChYBCK","KsjRKKZamH","Yf2EciKqhr","In3NSlj07Q","aFFssl83Ud","Oz8yZFGzgp",
+"gjUTuDLhzM","6AFT0tl72W","h1zcHpiJSk","gdQsSSs0Zu","zbIYY8hJdt","uJScXU3yw5","n8pJ97ku1p","RzaZAHzZT8","GSQwjzmLYD","GXdoHUl4a1",
+"AgJHQmz8gx","jSjS3cmXIX","IjTwPTCgPp","cL0aEhe9IA","ulk41OxWIH","zmLYDSbRYy","he9IADcpWB","wiHrZhe9IA","MojnPciuWz","uPX7GoVQp6",
+"iwzGkWmadA","NOHszvOqCE","AXpwEI7p2a","zY1GY618Di","dpe1vgtCA5","8cVD31LB1L","2TRI70YAGH","gjUTutjQxs","RpBQmd85a9","EdBKcNo0Qb",
+"ZuDtDKASQ8","Cfgr3ulk41","JXljWCqqaD","aez9yStlDJ","X6PinogLgc","lXFOBJ2mQi","lj07QB3qem","yofH3OxWIH","RpBQmCNHmv","24ARFt98iW",
+"xXTI4MmsIo","BCxeCCqqaD","45cIHM6qcG","uLtKs9eoRc","CqqaD1j5L8","9rlg9jzUqR","9iGoTe6e4z","pWiOsVerEA","5IhmGWMiS3","SWfoumX2GE",
+"RACujAOgEe","DcpWBv8yFN","ksJbyZv7z0","mz8gxK20wK","oGu6xs4786","LewvM2TRI7","CqqaDJJs5m","K4GS8CqqaD","MezSW7Ow5C","uAWypNOHsz",
+"5IhmGUl4a1","pvgjSHzZT8","lsQGoS2Dfu","F6PT2he9IA","HRxd8POUYS","OUqFMW3VFH","hi5X764s8N","W7cTsuAWyp","F6PT29eoRc","OUYuFFhtgl",
+"EOE1osoy9t","SjskQsqVrf","Cp3mZguMb8","JIqXiQChxs","2hEEUjeskS","lViBvOHaBz","RBhp0S2Dfu","vOqCE2Yz7E","55rfBDcpWB","EdBKciKqhr",
+"TXQ0Zjtn0X","zHF1qC2Irc","TXQ0ZOUYuF","yEfy9cmXIX","MaJQsk85Ae","Zv7z0uTacx","ZUnqtHRxd8","zbIYYd85a9","hUTw714FLR","8U2nUS2Dfu",
+"uN6r3FFDui","lViBvVjCZq","HRxd8DLhzM","JkzUna00b5","d85a9GXdoH","v1HlnPOUYS","6AFT0WreyP","e6e4zMezSW","gIYvEh1zcH","RkQkeAmdQd",
+"gtCA5v2eC3","Kr8ysKsjRK","OUqFMl83Ud","2DREsJJs5m","n8pJ96q6L9","WmadAM3zXL","Pb1paMm8si","2NslmC2Irc","QbxXc55rfB","5nmWvsx5Gl",
+"hE1QlHP433","ni2v1dQ586","nnP8ozbIYY","M6qcGaDGtS","aFFssuN6r3","lViBvFcWrW","CdyBVHP433","W3VFHzbIYY","s93MlCdyBV","Uvlv4lweGy",
+"oGu6x2TRI7","Oz8yZuJScX","v8yFN2ZHdk","EoToPJIqXi","jfREuVjCZq","mX2GESWfou","pv0i73weIF","hi5X7vLsmS","uvf7Ani2v1","oQ87rX6Pin",
+"TXQ0ZAXpwE","ix74rMK07Y","0Kyfs0h1b1","6q6L9J2mQi","uN6r3gIYvE","suY4x0BmCy","5Mg9r64s8N","Kr8ysFFDui","RBhp0fmIK1","prNT6ZJTXH",
+"L7cGcIjTwP","jtn0XqQxHP","d85a9S2Dfu","vkCHHAgJHQ","BGaQYC2Irc","Fhtgl4W0Tl","hE1QluLtKs","OHaBzYOfrY","ksJbyaFFss","fmIK1JRJQB",
+"QbxXcHzZT8","07n1cuJScX","Q6hMCKr8ys","AOgEeb29RJ","vLsmSv2eC3","EdBKcy94nw","NcICAeuZA5","aDGtShi5X7","BCxeC0BmCy","Gv3FqVIlwP",
+"Yf2Ec5IhmG","KsjRKPYBf4","iqv4k9y4lw","hi5X7Cfgr3","NcICA0PktI","Waim6hE1Ql","Waim6RmDcr","NcICAWreyP","LewvMSWfou","Yh1hFpAhR1",
+"uQIczoQ87r","qQxHPhYBCK","EOE1oCK5W7","SjskQEdBKc","BpYhV24ARF","prNT6suY4x","1LB1L0Kyfs","CxVEf5Mg9r","OUqFMlm0pD","1j5L8gtCA5",
+"MGlTFRsQUq","s7Mxkt59lR","v1HlnQnJ1S","HRxd8m4bxU","1v5hHjfREu","WmadALDk6f","ZzJHWaL6AJ","7hyVv7X3uy","s93MldmoS7","RACuja00b5",
+"lH1ktCNHmv","i3pydWaim6","2Yz7E618Di","CqqaD64s8N","TCgPpmX2GE","W3VFHK20wK","RACuj5drc6","t98iWqUJMd","yToGWVBjhz","Ta8f6v1Hln",
+"uupzkiB08l","iqv4kzQt6Q","7X3uy5nmWv","29QAzECMvU","cmXIXyluBx","uvf7ASmGzv","3weIFpT8wu","KASQ8s4786","5Mg9r3otm6","8hJdti3pyd",
+"he9IASmGzv","xXTI45Drn0","VNCPdG1RhS","sx5GloVQp6","hSSvQvkCHH","CdyBVQYxC0","DG4sThE1Ql","S77LHFLsph","gjUTuMK07Y","1LB1L07n1c",
+"qaofNRmDcr","W3VFH8RCUA","brhlQCxVEf","rz7UtwDajX","AkKTkNOHsz","h1zcHuoStw","7hyVvv1Hln","HP433aDGtS","EdBKc29QAz","VLTy6GSQwj",
+"FVMxoMGlTF","JRJQB8cVD3","cQOnv9y4lw","hE1QlNAFuw","1v5hHRpBQm","jeskSv8yFN","5NammgjUTu","RsQUqVLTy6","EOE1odhSuH","lpF6WcQOnv",
+"ydG8U16lHc","uPX7GK20wK","tlILtWMiS3","Kr8ysogLgc","Ta8f6LbRTH","XyPZNiqv4k","Cfgr30PktI","oQ87r9GXkX","FNYIMMojnP","dmoS7zY1GY",
+"HRxd8Q6Lix","Yf2EcMezSW","soy9tNcICA","X6Pin0MR5X","NcICAoQ87r","tl72WOUYuF","FwEJzSWfou","jSjS3rz7Ut","piJSkCfgr3","MezSWyEfy9",
+"JKWYR0Wr5y","X6Pinuvf7A","ECMvU0h1b1","nnP8oVIlwP","GrDg7EdBKc","Q6hMCC2Irc","7hyVvNo0Qb","Y1mC0ix74r","WmadAoQ87r","7lUXZuupzk",
+"AmdQd3weIF","IBe8kuZPqg","ksJbyrhl0J","azIWpZ4I1v","yToGWM3zXL","In3NS5Drn0","fqypys4786","ciuWzaez9y","CxVEf1v5hH","5drc6lpF6W",
+"HlUbFvLsmS","guMb89y4lw","OHaBz0PktI","48cHLReKEW","L7cGczHF1q","8U2nUzHF1q","rhl0JuZPqg","CxVEfKASQ8","NOHsz16lHc","azIWpblLA9",
+"PYBf4F6PT2","BpYhVD6rBy","zz4ZU2Yz7E","FFDuipv0i7","gjUTugtCA5","9eoRcJJs5m","aDGtS8RCUA","lViBvTwano","SbRYydQ586","yofH3qaofN",
+"lCMxy1j5L8","IKxdLMm8si","HzZT8HfyNQ","pAhR1uLtKs","K4GS8IjTwP","oQ87r1v5hH","2NslmChuy3","jS1ajmX2GE","pT8wubZLvS","8hJdtW7cTs",
+"Q6Lixtl72W","0KyfszHF1q","8xEKzfaHir","uAWyp7lUXZ","uPX7GWMiS3","7ku1pPb1pa","zQt6QoGu6x","EdBKcjfREu","JRJQB0h1b1","FcWrWRpBQm",
+"QssNCMm8si","7X3uytaOXK","hUTw7P6bcg","LbRTHB3qem","2ZHdklH1kt","RpBQmRmDcr","7fKYUfqypy","ksJby16lHc","hYBCKIRh48","oVQp6GSQwj",
+"jiVBP0YAGH","2NslmMezSW","OUYuFru4UG","QChxsKASQ8","8hJdty94nw","LDk6f0ao3l","s93MlVNCPd","zqH0Wmz8gx","uZPqgRACuj","OUqFMX6Pin",
+"v8yFNtuDyS","ksJbydmoS7","QbxXcTCgPp","45cIHk85Ae","MmKGJFNYIM","dQ586WMiS3","soy9tLDk6f","faHirQClRL","FcWrWCxVEf","dpe1vRACuj",
+"LbRTHQssNC","qUJMdnnP8o","Vprf2EdBKc","0PktIqaofN","5drc60BmCy","0PktILbRTH","FjHXRprNT6","rz7UtFFDui","7Ow5CeuZA5","m4bxUlXFOB",
+"Yh1hFuTacx","RACujCIShG","hi5X714FLR","L7cGcVIlwP","ni2v14W0Tl","M3zXLJkzUn","JRJQB64s8N","ix74r4dEz6","HRxd8Z4I1v","i7WMQfcwDa",
+"QYxC0RmDcr","FcWrWpv0i7","48cHLCdyBV","fLNg8FNYIM","QbxXcbZLvS","9y4lw07n1c","S77LHJKWYR","GSQwjjSjS3","YOfrYs7Mxk","RxrsmTwano",
+"GSQwjP6bcg","rhl0JgtCA5","8FmFHyEfy9","prNT68FmFH","UmaEvStlDJ","9XyT9tl72W","Q6LixpmeCd","24ARFBCxeC","ThjNnQClRL","JKWYRgf8rI",
+"XflUqa00b5","zY1GYtvdkD","8FmFHNo0Qb","kB5nPKr8ys","M3zXLZzJHW","pmeCdydG8U","VNCPdF6PT2","s7MxkVIlwP","jeskSYOfrY","pmeCdMm8si",
+"uZPqgUlU3M","MmsIoQWxoT","bZLvS6q6L9","HlUbF2TRI7","NcICAm4bxU","rz7UtRpBQm","uQIczBFkb8","WDVWJuupzk","jS1ajlpF6W","YOfrY55rfB",
+"9iGoTlCMxy","2Yz7EZuDtD","vkCHHnnP8o","StlDJFNYIM","RmDcrM6qcG","IjTwPzbIYY","e6e4z8cVD3","2ZHdkoVQp6","No0QbM6qcG","ydG8UCIShG",
+"2NslmVBjhz","07n1cprNT6","9eoRcQbxXc","GWqqXFVMxo","9GXkXfqypy","FxX9qHfyNQ","JkzUnsuY4x","fFDrJhYBCK","zmLYDnFqik","0Wr5yFjHXR",
+"mz8gxFjHXR","CNHmvx3LDe","9iGoTDG4sT","ZhwG1Gv3Fq","MojnP8TxD7","EdBKcjeskS","0MR5XXyPZN","KZamHHzZT8","KsjRKMK07Y","atef27hyVv",
+"O3iyQW3VFH","5iGN5Twano","JRJQBoQ87r","d85a99XyT9","fcJOy4dEz6","BGaQYY1mC0","29QAzdhSuH","7lUXZFcWrW","FnPFBzQt6Q","FGzgpRsQUq",
+"DcpWByofH3","DQimpQworu","YjB9tvkCHH","yluBxuN6r3","piJSkW7cTs","W3VFHRkQke","5VZjSt59lR","Zv7z0SjskQ","55rfBMm8si","uTacxYw2oU",
+"8xEKzSjskQ","No0Qb2ZHdk","FGzgpXyPZN","4QMc9he9IA","v8yFNs93Ml","tuDySGrDg7","JIqXiY1mC0","e6e4zhSSvQ","lweGyS2Dfu","wDajX2Yz7E",
+"d7vjMsuY4x","jS1ajCqqaD","cQOnvt59lR","WmadA14FLR","zY1GYWMiS3","qQxHPUlU3M","e6e4zQYxC0","OHaBzzmLYD","faHirzqH0W","jzUqRk85Ae",
+"fqypyLDk6f","JRJQBgdQsS","HfyNQjfREu","HRxd8s7Mxk","AmdQd9rlg9","5iGN5ogLgc","LbRTHIKxdL","yEfy9suY4x","U3yw5G1RhS","pWiOs0Kyfs",
+"fmIK16AFT0","nFqikDLhzM","guMb8Ss0Zu","mX2GEguMb8","JkzUnHlUbF","Rxrsm0Kyfs","uLtKspvgjS","FLsphtvdkD","JJs5mAmdQd","2hEEUWaWsv",
+"Oz8yZWPmlx","pT8wuydG8U","RxrsmXflUq","zQt6QWaim6","4QMc9lCMxy","WaWsvK4GS8","piJSk2TRI7","LDk6fgtCA5","rz7UtvkCHH","QnJ1Ss93Ml",
+"Ta8f6SmGzv","QWxoTvLsmS","tlILtpvgjS","2DREsJRJQB","Zv7z0MK07Y","FNYIMyvOMI","FPfSEs93Ml","lpF6WJkzUn","rhl0JOUqFM","X6PinPb1pa",
+"2hEEUP6bcg","EdBKcJJs5m","1v5hH2TRI7","WmadAdpe1v","5ZaEzGv3Fq","0Kyfsru4UG","0Wr5yHzZT8","vkCHHTwano","lj07Q0Kyfs","Uvlv4zqH0W",
+"jiVBPVIlwP","HzZT8Pb1pa","NAFuwjSjS3","14FLRM3zXL","SmGzviB08l","jS1ajlsQGo","7fsYMVNCPd","cQOnvY1mC0","580YDn8pJ9","tvdkDciuWz",
+"EdBKchUTw7","MmKGJKZamH","dmoS70h1b1","WreyPs93Ml","aez9yvLsmS","OUYuFFPfSE","ZUnqt2DREs","JXljWHP433","d7vjMK4GS8","7hyVvSWfou",
+"t59lR8FmFH","hi5X7CIShG","BCxeCBGaQY","HRxd8atef2","Zv7z0lViBv","1j5L8pvgjS","uZPqg1v5hH","Uvlv4IBe8k","zFgtBdpe1v","tl72WNxx9V",
+"lsQGodjsrv","Chuy3GWqqX","KsjRKHfyNQ","JKWYRcQOnv","zqH0WBbwgA","rz7UtqaofN","JRJQBrhl0J","Qworu29QAz","SjskQCNHmv","U3yw5v8yFN",
+"8TxD7BGaQY","CxVEfC2Irc","4dEz6blLA9","mz8gxTa8f6","azIWpVLTy6","8xEKzuvf7A","0h1b1gtCA5","uPX7GTa8f6","Fhtgl64s8N","SbRYyCxVEf",
+"9eoRcCxVEf","VerEAaDGtS","CxVEfWPmlx","K4GS8Uvlv4","tuDyStlILt","Nxx9VlsQGo","XyPZN7hyVv","SmGzvCdyBV","5Drn0WPmlx","0Wr5y8RCUA",
+"QnJ1SF6PT2","aL6AJru4UG","dhSuHM6qcG","cmXIXblLA9","piJSkiB08l","IRh48Q6hMC","kB5nPMojnP","qaofNSjskQ","tl72WydG8U","oGu6x5ZaEz",
+"HP433aL6AJ","aDGtSpiJSk","aFFssY1mC0","NcICAix74r","ulk41hE1Ql","dhSuHZ4I1v","pT8wujSjS3","xXTI4W7cTs","ThjNnVBjhz","oVQp60BmCy",
+"5NammvOqCE","guMb8LDk6f","JIqXiQWxoT","0Wr5yatef2","tvdkDvLsmS","wDajX7Ow5C","okgRigdQsS","MmKGJ45cIH","D6rByprNT6","DQimpgjUTu",
+"pWiOsbrhlQ","i7WMQP6bcg","M6qcGC2Irc","tl72Wi7WMQ","aez9ytaOXK","2Yz7EkZANm","JIqXiK4GS8","yToGWi7WMQ","GWqqXD6rBy","Q6LixNOHsz",
+"BpYhVP6bcg","zY1GYwiHrZ","2hEEUVjCZq","yEfy9Waim6","ECMvU0BmCy","djsrvtuDyS","GSQwjn8pJ9","lXFOBHP433","Chuy3rKDLJ","NcICA8FmFH",
+"azIWpF6PT2","5Drn0NOHsz","24ARF0Wr5y","KsjRKuPX7G","faHirDQimp","b29RJjSjS3","8TxD7KZamH","0YAGHW3VFH","TCgPpFcWrW","fcwDannP8o",
+"Yf2EcZhwG1","pmeCdIjTwP","3otm6VjCZq","QnJ1SpFrrl","brhlQK20wK","FwEJzS77LH","X6Pin7Ow5C","tuDySRpBQm","MK07YThjNn","LDk6fPb1pa",
+"5Drn05nmWv","CNHmvguMb8","VIlwPSWfou","ThjNnBpYhV","cQOnvWPmlx","i7WMQjtn0X","P6bcgEdBKc","okgRilm0pD","DQimpCfgr3","aez9yVLTy6",
+"RsQUqgIYvE","yofH3ZuDtD","FwEJzFhtgl","rhl0JiwzGk","hUTw7l83Ud","16lHc4dEz6","I7p2as93Ml","5Mg9rY1mC0","2Nslmt98iW","KsjRKblLA9",
+"FcWrW2TRI7","K4GS85drc6","fqypyhUTw7","KZamHuAWyp","Y1mC0kB5nP","6AFT0JKWYR","FwEJzdQ586","J2mQipFrrl","DQimpPb1pa","guMb8FPfSE",
+"Rxrsmmz8gx","0MR5X1v5hH","pvgjScShY2","MmKGJru4UG","0BmCyAXpwE","brhlQpmeCd","lXFOBNOHsz","GXdoHlm0pD","fcJOylm0pD","0h1b1rhl0J",
+"64s8NTa8f6","yvOMIuvf7A","i3pydRkQke","fmIK10YAGH","SWfouTXQ0Z","BGaQY64s8N","iqv4k0BmCy","5nmWvuQIcz","W3VFHL7cGc","uTacxS77LH",
+"F6PT2JJs5m","he9IAIn3NS","cL0aEiKqhr","v1HlnNxx9V","WPmlxAmdQd","yEfy9SbRYy","xciqpAIYUu","lH1ktWmadA","Ta8f6AOgEe","AIYUuVIlwP",
+"Ta8f6QbxXc","Ss0ZuUl4a1","WmadA9y4lw","WreyPVjCZq","5nmWvtlILt","3weIF5Drn0","cmXIX0h1b1","fFDrJ0ao3l","RmDcrhSSvQ","X6PinNo0Qb",
+"taOXKS2Dfu","Q6hMCyEfy9","SWfouUmaEv","Q6hMCtlILt","WaWsv3otm6","aDGtSAIYUu","XflUq5Drn0","8xEKz0BmCy","64s8NlH1kt","7hyVvni2v1",
+"9y4lw7fKYU","suY4xXflUq","uoStwTwano","16lHcpvgjS","SbRYyDLhzM","5Mg9rAXpwE","iwzGk5ZaEz","yToGWB3qem","0BmCyoQ87r","lweGygIYvE",
+"d7vjMjtn0X","TCgPpiKqhr","B3qemzmLYD","5iGN514FLR","7fKYUaL6AJ","kB5nP5Mg9r","EoToPVerEA","CK5W7zFgtB","PYBf4S77LH","AIYUut98iW",
+"0BmCyVLTy6","k85Aeni2v1","jiVBPulk41","D6rBy5drc6","CqqaDBbwgA","No0QbfFDrJ","Cfgr3Y1mC0","uLtKskZANm","fqypytaOXK","S2DfuDLhzM",
+"CK5W72ZHdk","QWxoTjS1aj","RxrsmjiVBP","8RCUA7hyVv","he9IAtAOsr","Waim645cIH","IRh48fmIK1","No0QbpWiOs","CqqaDguMb8","uN6r3ThjNn",
+"taOXKgf8rI","fFDrJ8hJdt","h1zcHsuY4x","gdQsSVBjhz","0ao3lix74r","YOfrYlXFOB","euZA5BpYhV","9GXkX8TxD7","CqqaDGXdoH","tuDyS9GXkX",
+"a00b514FLR","Qworun1pmO","pv0i75IhmG","nlaByru4UG","blLA9CqqaD","xciqpCK5W7","WPmlx1LB1L","UmaEvvLsmS","WreyPVIlwP","gf8rIRsQUq",
+"0PktIgtCA5","48cHLAmdQd","AkKTkS2Dfu","KASQ8ZUnqt","6AFT09GXkX","hUTw7t98iW","guMb82DREs","LDk6fCxVEf","sqVrfUmaEv","LbRTHru4UG",
+"WDVWJGXdoH","WaWsvRmDcr","WMiS3hSSvQ","Uvlv4oQ87r","iB08lGSQwj","Q6LixlH1kt","dmoS7jtn0X","y94nwECMvU","zHF1quTacx","29QAzlpF6W",
+"618DiFjHXR","5Drn0CdyBV","MmKGJAgJHQ","MmsIox3LDe","BFkb8TXQ0Z","7ku1pCIShG","jzUqR7lUXZ","ix74rPOUYS","cShY2FxX9q","48cHLl83Ud",
+"s7MxkbZLvS","F6PT2bgJAz","5drc607n1c","FwEJzzY1GY","Pb1pa7hyVv","07n1cOxWIH","b29RJfFDrJ","P6bcgX6Pin","MojnPlH1kt","W7cTsVBjhz",
+"RxrsmDz1R3","Nxx9VfaHir","HfyNQcShY2","ECMvUVprf2","lsQGobrhlQ","pvgjSdhSuH","fcJOyuZPqg","Z4I1vsuY4x","pT8wuUmaEv","djsrvo8Uyd",
+"Y1mC0Mkgy8","AkKTkFwEJz","ZUnqtVerEA","WreyPAIYUu","5Drn0L7cGc","B3qemfaHir","qQxHPC2Irc","JKWYRlCMxy","9iGoTEdBKc","mz8gxHzZT8",
+"taOXKMezSW","XflUqVjCZq","fcwDaBbwgA","dmoS7a00b5","faHir2Nslm","mX2GEW7cTs","NAFuwO3iyQ","hYBCKRzaZA","lsQGookgRi","ZhwG1GSQwj",
+"X6Pin24ARF","I7p2aPOUYS","RzaZAI7p2a","FVMxohE1Ql","Z4I1vYh1hF","iB08lkZANm","POUYS7hyVv","sqVrfcL0aE","HzZT80h1b1","jtn0XRBhp0",
+"yluBxVjCZq","wiHrZVIlwP","JKWYRY1mC0","No0QbJkzUn","fqypyU3yw5","v2eC38FmFH","zY1GYrz7Ut","okgRid85a9","DLhzMpmeCd","GWqqXoQ87r",
+"ThjNnyToGW","uvf7AxReec","Chuy3FVMxo","StlDJv8yFN","euZA5S77LH","gdQsSNxx9V","WreyPOUYuF","zbIYY2ZHdk","Ul4a1GWqqX","pmeCd48cHL",
+"VNCPdogLgc","aez9yEoToP","5iGN5Vprf2","5ZaEzuN6r3","aDGtSyvOMI","OHaBzUlU3M","FGzgpW3VFH","fcwDaiwzGk","i7WMQAOgEe","i7WMQGrDg7",
+"d7vjMRkQke","9rlg99iGoT","v8yFN4dEz6","Rxrsm9GXkX","uZPqg4W0Tl","CdyBVqQxHP","AkKTkfcJOy","1LB1LPYBf4","dQ586e6e4z","yToGWS77LH",
+"4dEz60Wr5y","pT8wu8U2nU","MojnPs7Mxk","9iGoT5IhmG","Twanopv0i7","IjTwPCqqaD","FjHXRpWiOs","9GXkXCK5W7","AOgEeuJScX","QssNCNo0Qb",
+"fcwDaCp3mZ","ydG8UyToGW","fcwDaCxVEf","VIlwPNo0Qb","SWfouTCgPp","RzaZAdmoS7","1LB1LjeskS","sx5GlBGaQY","zHF1q7Ow5C","yofH345cIH",
+"ogLgci7WMQ","ECMvU9eoRc","QWxoT2Nslm","AXpwELbRTH","AkKTklCMxy","WMiS3nlaBy","vOqCEpv0i7","8hJdtVerEA","lXFOBpFrrl","G1RhSlm0pD",
+"DQimpTwano","i3pyd8FmFH","IBe8kuupzk","mz8gxQnJ1S","hYBCKuTacx","vkCHHydG8U","8TxD72hEEU","s4786QssNC","Yf2Ecru4UG","AkKTkzmLYD",
+"SjskQCK5W7","DQimpzmLYD","Ul4a1tjQxs","RsQUqVBjhz","WaWsvMkgy8","0BmCylpF6W","atef27lUXZ","WMiS3FnPFB","GXdoHjeskS","WMiS3yToGW",
+"VjCZq0ao3l","4W0Tl5drc6","2TRI7M6qcG","hUTw7Waim6","RsQUqLewvM","YjB9tQssNC","JJs5m7fKYU","TCgPpMkgy8","X6Pin5Namm","XflUqru4UG",
+"zFgtBW3VFH","yluBxdpe1v","MezSWgIYvE","48cHLeuZA5","CK5W7uupzk","cQOnvs4786","Gv3FqHlUbF","tlILtIBe8k","QssNCHP433","dmoS7gIYvE",
+"MojnP9rlg9","HzZT8Mkgy8","Yf2EcwiHrZ","cQOnvCK5W7","tAOsrWreyP","In3NSqUJMd","ciuWzzFgtB","tlILtL7cGc","vOqCEfcwDa","In3NSJXljW",
+"LDk6f0Wr5y","mX2GEd7vjM","5IhmGAXpwE","5Mg9r8cVD3","m4bxUix74r","TwanoaFFss","FVMxos7Mxk","dpe1v0ao3l","MojnPgdQsS","jiVBPDz1R3",
+"NcICACK5W7","mX2GE07n1c","8RCUAdQ586","IRh48s4786","5drc6DG4sT","nnP8ozz4ZU","FGzgpWreyP","jeskSpmeCd","mX2GEX6Pin","bZLvSCK5W7",
+"xReecni2v1","s93MlPb1pa","29QAzOUYuF","MmsIonlaBy","Fhtgl5nmWv","lViBvU3yw5","KsjRKbZLvS","iqv4kxciqp","uupzkdQ586","SjskQpFrrl",
+"BCxeC07n1c","zqH0W8hJdt","LbRTH618Di","qaofNIRh48","s47864W0Tl","azIWpHP433","x3LDem4bxU","BGaQY16lHc","7hyVvFNYIM","uAWypUvlv4",
+"BCxeCt59lR","ciuWzyofH3","fLNg8soy9t","ReKEWaL6AJ","zqH0WQworu","uN6r3d85a9","lweGy9iGoT","xReecUlU3M","JXljWjfREu","zbIYYHfyNQ",
+"dhSuHkB5nP","QworuStlDJ","fcwDawDajX","b29RJoQ87r","kB5nPHlUbF","hSSvQcL0aE","Pb1pagf8rI","7fKYUlH1kt","n8pJ9P6bcg","SjskQaFFss",
+"MezSWFxX9q","wDajX8U2nU","QnJ1StjQxs","hUTw7iB08l","CqqaDM6qcG","XflUqbgJAz","zbIYYUl4a1","IKxdLrKDLJ","KsjRKYw2oU","HzZT8Uvlv4",
+"tl72WBCxeC","Fhtgl8U2nU","64s8NL7cGc","TwanouoStw","gdQsSokgRi","8FmFHZhwG1","8hJdt8TxD7","zQt6QxReec","FjHXRVBjhz","OUYuFyEfy9",
+"AIYUu7hyVv","KASQ8zFgtB","HfyNQb29RJ","ZhwG1yofH3","4W0Tl5Drn0","azIWps4786","FFDui6q6L9","MmsIo14FLR","hi5X7jS1aj","jS1aj8U2nU",
+"m4bxUprNT6","d85a9JXljW","Cfgr3wiHrZ","CIShGFnPFB","45cIHRmDcr","IRh486AFT0","zbIYYAXpwE","64s8NwDajX","ZuDtDuZPqg","i3pyd4dEz6",
+"6AFT0ZuDtD","s4786VBjhz","0BmCy0BmCy","uoStwiKqhr","AOgEeCdyBV","dmoS7zHF1q","t98iWpvgjS","aFFsstaOXK","EdBKcBGaQY","Q6Lix1v5hH",
+"5iGN5soy9t","LbRTHcmXIX","7lUXZ7lUXZ","uvf7AAIYUu","Dz1R3hYBCK","cL0aE6AFT0","ksJbyTCgPp","UmaEvxXTI4","AXpwEokgRi","dQ586DQimp",
+"RBhp0HP433","piJSkMGlTF","Uvlv4SWfou","MmKGJVBjhz","guMb824ARF","0KyfsxReec","KASQ8oVQp6","8hJdtfcwDa","euZA5FNYIM","JRJQBPOUYS",
+"29QAzZUnqt","lkMUAi7WMQ","JJs5mjfREu","tuDySG1RhS","gjUTuMaJQs","FwEJz9iGoT","1LB1LbZLvS","Dz1R3GSQwj","sx5GlStlDJ","W7cTsChuy3",
+"CqqaDjS1aj","OxWIHAOgEe","n8pJ9hi5X7","WreyPs7Mxk","blLA9JRJQB","l83UdVerEA","zHF1qVBjhz","Zv7z0vLsmS","XyPZNKASQ8","Cp3mZJkzUn",
+"jzUqRXyPZN","pAhR1jzUqR","uQIczzqH0W","Qworu64s8N","KZamHDQimp","ReKEWFNYIM","VerEAzqH0W","7Ow5CZ4I1v","FVMxoW3VFH","CNHmvDcpWB",
+"v1HlngdQsS","Ul4a1fLNg8","azIWpMkgy8","xXTI48xEKz","ZJTXHJKWYR","v1HlnLDk6f","U3yw5DLhzM","WmadAWPmlx","lViBvFFDui","fqypyDQimp",
+"OHaBzcQOnv","8xEKzMojnP","EoToPhSSvQ","07n1cRzaZA","iB08lyvOMI","FGzgpKZamH","45cIHwiHrZ","9iGoTZJTXH","3otm6QssNC","D6rBypiJSk",
+"TCgPp2TRI7","gdQsS64s8N","hSSvQSjskQ","d7vjMKr8ys","Ta8f6P6bcg","JkzUnaFFss","zHF1qCdyBV","gIYvEGv3Fq","piJSkL7cGc","ZuDtDlXFOB",
+"GrDg7zHF1q","3weIFWmadA","MmKGJqUJMd","CqqaD6q6L9","pWiOsgf8rI","SjskQb29RJ","Z4I1vL7cGc","64s8NRxrsm","AkKTkEOE1o","FcWrWNo0Qb",
+"LDk6f48cHL","okgRidmoS7","FxX9q2DREs","5Drn0OUYuF","a00b5FwEJz","S2DfupWiOs","In3NSY1mC0","M3zXLrz7Ut","pFrrlB3qem","NAFuw2DREs",
+"sx5Gl9y4lw","yToGW7ku1p","RACujHlUbF","QClRL9GXkX","QYxC0XflUq","vLsmSS77LH","S2Dfu1v5hH","brhlQnFqik","Dz1R33weIF","zmLYDtuDyS",
+"yvOMI5Namm","blLA9y94nw","AIYUuxReec","BFkb8AmdQd","9y4lwSbRYy","0PktIUvlv4","qUJMdd85a9","tl72W7lUXZ","0PktIOUYuF","45cIHhE1Ql",
+"fFDrJL7cGc","3weIFoQ87r","zY1GYtl72W","ThjNn45cIH","kZANm3weIF","3weIFwiHrZ","RACujRzaZA","WmadAYh1hF","MmKGJM3zXL","HzZT8RzaZA",
+"ZzJHW07n1c","n8pJ9yluBx","GWqqXPOUYS","mz8gxdjsrv","nlaBynlaBy","RpBQmbZLvS","Waim6MmKGJ","K20wKQ6Lix","2ZHdkJIqXi","8RCUAHP433",
+"HlUbFgf8rI","Ul4a1nnP8o","EOE1oPOUYS","gIYvEPYBf4","uJScXpWiOs","NhXdueuZA5","pFrrlHRxd8","nlaBy4dEz6","FnPFB2DREs","v8yFNix74r",
+"rz7UtMmKGJ","5iGN5RkQke","k85AeF6PT2","v8yFNd7vjM","wiHrZL7cGc","zbIYYiqv4k","zQt6QpFrrl","8RCUAprNT6","cmXIX6AFT0","pv0i7jSjS3",
+"AgJHQaDGtS","NAFuw0YAGH","zQt6Qsx5Gl","Yh1hFRsQUq","piJSk4QMc9","DLhzMzHF1q","atef2GSQwj","B3qemjzUqR","2DREsLDk6f","U3yw5lm0pD",
+"NcICAMkgy8","prNT6QnJ1S","OUqFMM6qcG","C2Ircgf8rI","OUqFMFNYIM","dhSuHWDVWJ","5drc6dQ586","nlaByaez9y","blLA9aFFss","QbxXc9iGoT",
+"y94nwNcICA","RpBQmJKWYR","CIShG07n1c","2TRI7s7Mxk","2TRI7EoToP","kZANmHzZT8","UmaEvWPmlx","vLsmSS2Dfu","W3VFHQworu","5Mg9ryEfy9",
+"9eoRczz4ZU","MK07YJXljW","5IhmGRpBQm","aFFssDLhzM","qaofNCxVEf","2ZHdkblLA9","7fsYMMkgy8","oGu6xIjTwP","blLA9HP433","MojnPa00b5",
+"pWiOsvkCHH","0KyfsFFDui","lViBvRkQke","618DifcwDa","xXTI4ciuWz","WDVWJSmGzv","VNCPdpiJSk","L7cGc9GXkX","Q6hMCHlUbF","0MR5XBGaQY",
+"ulk41dpe1v","HlUbFRzaZA","JkzUnlm0pD","tuDySLewvM","Pb1patlILt","hUTw7rhl0J","b29RJZJTXH","ECMvUCqqaD","lCMxyrhl0J","FnPFBhSSvQ",
+"JXljWtlILt","8TxD7MmKGJ","lXFOB5VZjS","RzaZAAkKTk","PYBf4J2mQi","9y4lwa00b5","mX2GEgIYvE","djsrvRxrsm","RmDcrEdBKc","Chuy3L7cGc",
+"6q6L9S77LH","SWfouK20wK","HlUbFtuDyS","CIShGuJScX","fqypysoy9t","dQ586SWfou","yluBxSbRYy","Q6Lixhi5X7","5NammFhtgl","uTacxWPmlx",
+"W3VFHIjTwP","UlU3MFNYIM","2hEEUkZANm","AOgEeyluBx","IKxdLuPX7G","t59lROz8yZ","JRJQBcQOnv","FVMxogf8rI","bgJAz5nmWv","zbIYYYjB9t",
+"GXdoH24ARF","7X3uyOxWIH","Q6hMCbZLvS","CK5W7s7Mxk","0YAGHFVMxo","KASQ8d7vjM","1LB1LuLtKs","MaJQs5nmWv","Z4I1v0BmCy","FGzgpdmoS7",
+"zbIYYm4bxU","HP4337hyVv","BCxeCWaWsv","EdBKcRBhp0","M3zXLrKDLJ","EdBKcd7vjM","M6qcGB3qem","Z4I1v55rfB","CxVEfDG4sT","suY4x1LB1L",
+"l83Ud48cHL","azIWpjSjS3","guMb8i3pyd","2hEEUCxVEf","dhSuHhe9IA","HlUbFO3iyQ","qQxHP8TxD7","lXFOBzFgtB","G1RhSFFDui","tAOsrh1zcH",
+"2hEEUs4786","WMiS3rhl0J","VLTy68TxD7","vOqCEVjCZq","GWqqXFGzgp","soy9tAXpwE","qaofNtl72W","lj07Qd85a9","x3LDes4786","ZUnqtNcICA",
+"0YAGHjiVBP","tuDySUl4a1","5Mg9rAIYUu","DQimp8xEKz","i3pydh1zcH","fFDrJAXpwE","h1zcHdjsrv","5Drn0uoStw","jtn0XZUnqt","iB08l0YAGH",
+"S2DfuPOUYS","tjQxsiwzGk","guMb8uQIcz","cmXIXazIWp","sqVrfi3pyd","NOHszx3LDe","hUTw7W3VFH","QClRLHP433","t98iWIn3NS","CNHmvJIqXi",
+"VLTy6uupzk","MojnPUl4a1","HzZT8fFDrJ","yluBxgdQsS","EdBKcuvf7A","QChxsyToGW","NOHsz0Wr5y","yluBxQYxC0","I7p2aZJTXH","0YAGHFnPFB",
+"zHF1qSs0Zu","pFrrl0ao3l","YjB9tCqqaD","D6rBye6e4z","CIShGpvgjS","cmXIXVBjhz","580YDrhl0J","d85a9FVMxo","ReKEWk85Ae","RxrsmfcwDa",
+"RmDcrWMiS3","cmXIX2Yz7E","fqypyuAWyp","MojnPfcJOy","FwEJzMGlTF","aez9yatef2","SjskQL7cGc","QYxC0bZLvS","taOXKazIWp","5Mg9rTa8f6",
+"e6e4zYOfrY","kZANmFGzgp","ydG8URsQUq","lH1ktiB08l","lCMxyuAWyp","soy9t3otm6","7Ow5CblLA9","soy9t2hEEU","1v5hHQChxs","gf8rIkZANm",
+"gf8rI7fsYM","F6PT2JIqXi","2Nslmhe9IA","ix74rKsjRK","jeskSk85Ae","Q6hMCtvdkD","FxX9qtjQxs","QChxsQssNC","TXQ0ZTwano","pv0i7NOHsz",
+"tvdkDZzJHW","azIWpxXTI4","CxVEfBCxeC","yEfy9RpBQm","b29RJjzUqR","brhlQpWiOs","pAhR15nmWv","8cVD3EOE1o","G1RhSWaWsv","uupzkMmKGJ",
+"VLTy6BbwgA","24ARFPOUYS","IKxdLtlILt","QWxoT7lUXZ","ix74rVBjhz","FFDuie6e4z","ReKEWD6rBy","2hEEUPb1pa","StlDJNAFuw","WMiS3zFgtB",
+"ru4UGmX2GE","CNHmvlpF6W","FwEJzuupzk","cmXIXNcICA","RxrsmFxX9q","WMiS3vkCHH","JIqXilkMUA","xXTI4okgRi","nFqikgIYvE","0Wr5yfFDrJ",
+"8xEKzChuy3","BbwgAsoy9t","s7MxkK20wK","9XyT9ZhwG1","AkKTkQWxoT","9GXkX5Namm","RACuj6q6L9","NAFuwMaJQs","ReKEWMmKGJ","2TRI7O3iyQ",
+"5iGN5RzaZA","No0QbdmoS7","BbwgA0h1b1","yofH3yEfy9","07n1czqH0W","64s8NRzaZA","iwzGkguMb8","IBe8kKZamH","gdQsSQnJ1S","3otm6ZhwG1",
+"7fKYUVerEA","QbxXcaFFss","QWxoTEoToP","d7vjMC2Irc","Yf2EcksJby","YOfrYJkzUn","uupzk0PktI","MojnPBGaQY","kB5nPUmaEv","1v5hHbgJAz",
+"5nmWvnlaBy","lweGy0Wr5y","ReKEWS2Dfu","zqH0WhE1Ql","5drc6MK07Y","ZJTXHn1pmO","v1Hlnuupzk","mz8gxQYxC0","AgJHQ9GXkX","fLNg8aez9y",
+"kB5nPqUJMd","dmoS7Fhtgl","vkCHHAIYUu","Waim6RkQke","2DREsM6qcG","G1RhSAgJHQ","dpe1vuTacx","FVMxosoy9t","ogLgc8cVD3","Twano2Nslm",
+"fmIK1I7p2a","5Mg9rkB5nP","In3NS7Ow5C","CdyBVyvOMI","soy9tHP433","U3yw5l83Ud","v8yFN64s8N","0Wr5yIjTwP","48cHLuPX7G","OHaBzZuDtD",
+"NOHszmz8gx","brhlQ8FmFH","W3VFHdpe1v","KsjRK4dEz6","yluBxyluBx","ZJTXHokgRi","DcpWB2DREs","mz8gxgf8rI","Yf2EcJkzUn","mX2GEt98iW",
+"b29RJJkzUn","t98iW0YAGH","2TRI7LewvM","8U2nUv8yFN","48cHLcShY2","JXljWLbRTH","d85a98cVD3","K4GS89GXkX","OxWIHgdQsS","dhSuHECMvU",
+"8U2nUMmsIo","cL0aEuupzk","Dz1R3vkCHH","7X3uyW7cTs","8FmFHXyPZN","jS1aji3pyd","64s8NCK5W7","9y4lwzqH0W","zmLYD7fsYM","AOgEeJkzUn",
+"iKqhrJKWYR","EoToPs7Mxk","QYxC0kZANm","JRJQBGSQwj","GSQwjkZANm","qUJMduvf7A","GrDg72Yz7E","yluBxblLA9","pFrrlUl4a1","FwEJzd85a9",
+"WMiS3kZANm","SbRYyJRJQB","taOXKqQxHP","7hyVv8cVD3","9iGoTwiHrZ","GXdoHlXFOB","jSjS3jfREu","piJSkyluBx","kZANmO3iyQ","GrDg7CK5W7",
+"cmXIXoGu6x","DLhzMHlUbF","CIShG48cHL","W3VFHy94nw","zmLYDaL6AJ","ZUnqtaDGtS","W3VFHQbxXc","YjB9tXyPZN","o8UydReKEW","gjUTuuoStw",
+"K20wK6AFT0","2ZHdkJKWYR","5nmWvfqypy","d7vjM5VZjS","Oz8yZpWiOs","fcJOymz8gx","aFFsspFrrl","MmKGJjfREu","lweGytvdkD","WaWsvdQ586",
+"AIYUu9XyT9","dQ586tl72W","qUJMdjSjS3","QYxC0fFDrJ","taOXKQssNC","dmoS7BpYhV","6AFT0v8yFN","oGu6xChuy3","YOfrYDQimp","ciuWzlXFOB",
+"BGaQYt98iW","uupzkStlDJ","IRh48y94nw","ulk41ksJby","B3qemSmGzv","07n1cru4UG","n8pJ9HfyNQ","J2mQi8RCUA","hYBCKWmadA","9rlg9dmoS7",
+"Yw2oUMmsIo","OUqFMzz4ZU","9GXkXbgJAz","atef2d7vjM","J2mQiD6rBy","uupzkBpYhV","suY4xlpF6W","ZuDtDUlU3M","uN6r3CxVEf","RBhp0kB5nP",
+"yEfy9HP433","rz7Utzz4ZU","VBjhzdmoS7","VNCPdCdyBV","aL6AJC2Irc","XyPZNs7Mxk","GSQwjFNYIM","VNCPdaDGtS","SjskQ7fsYM","MmsIomz8gx",
+"pvgjSv2eC3","2hEEUzbIYY","dpe1vbgJAz","uvf7Aaez9y","n1pmO9XyT9","AIYUu7Ow5C","t59lRFFDui","OHaBzgdQsS","fcwDapT8wu","FwEJztl72W",
+"s93MlAmdQd","a00b5VNCPd","7X3uyQworu","FjHXRlweGy","XyPZNOz8yZ","uJScXni2v1","4dEz6ThjNn","MmsIo0h1b1","t98iWnnP8o","d85a9Uvlv4",
+"Mm8siyluBx","6q6L9MK07Y","45cIH0PktI","ThjNn64s8N","v8yFN7ku1p","BpYhV9rlg9","qaofNm4bxU","ZzJHWGv3Fq","QYxC0B3qem","zqH0W7fKYU",
+"wiHrZzbIYY","ZUnqtK4GS8","Yh1hFt59lR","VNCPd16lHc","2TRI7jeskS","Nxx9V0YAGH","TwanoMojnP","ThjNnhUTw7","GWqqXC2Irc","uAWyp2Yz7E",
+"RzaZATa8f6","0PktIsoy9t","he9IAP6bcg","hUTw7JJs5m","AOgEeUvlv4","LDk6fiqv4k","zmLYDDQimp","fFDrJLbRTH","MGlTFThjNn","ZuDtDuupzk",
+"yofH36q6L9","jiVBPFcWrW","L7cGcuupzk","QWxoTs93Ml","pvgjSJKWYR","JRJQB8U2nU","hE1QlCxVEf","t98iWLDk6f","Dz1R35ZaEz","Cp3mZru4UG",
+"hUTw7lpF6W","uQIczPb1pa","pvgjSsx5Gl","e6e4zjtn0X","kB5nPYw2oU","X6Pin9XyT9","1j5L8Pb1pa","iwzGki3pyd","OUYuFjfREu","d85a9Yh1hF",
+"yEfy94W0Tl","faHirn8pJ9","9eoRcIBe8k","hYBCKFcWrW","ZUnqt9GXkX","tl72WoQ87r","8TxD7kB5nP","D6rByLDk6f","VjCZqMezSW","Uvlv4S77LH",
+"MaJQsQbxXc","MezSWlkMUA","JIqXiZ4I1v","lViBv0BmCy","8FmFH4QMc9","Ul4a1lViBv","KASQ88hJdt","X6Pin1v5hH","RzaZAQYxC0","qUJMdFGzgp",
+"2TRI7mX2GE","FNYIMzQt6Q","mX2GEG1RhS","wDajXCIShG","VIlwPogLgc","uTacx29QAz","0YAGHTXQ0Z","0KyfsHRxd8","VerEAEdBKc","ydG8UFGzgp",
+"BCxeCnlaBy","uN6r3hSSvQ","pvgjSdpe1v","TXQ0ZJXljW","L7cGcuJScX","pmeCd8hJdt","XyPZNqaofN","7Ow5Co8Uyd","1LB1LhE1Ql","cShY2ZuDtD",
+"fqypyUl4a1","aez9yPOUYS","prNT6zz4ZU","7hyVvPb1pa","X6PinkZANm","POUYSZv7z0","QssNCydG8U","ciuWzbgJAz","DLhzMpiJSk","gf8rIWaim6",
+"l83UdUlU3M","9GXkXYh1hF","LbRTHtlILt","QbxXcoQ87r","RkQke9GXkX","KsjRKMezSW","5IhmGTwano","zz4ZUqQxHP","blLA9vLsmS","0PktIWPmlx",
+"zmLYDnnP8o","RzaZAAIYUu","IKxdLdhSuH","QssNCAgJHQ","fqypyRsQUq","s7MxkAgJHQ","CK5W7yEfy9","MmKGJbgJAz","aFFssNo0Qb","zHF1qBbwgA",
+"aFFssYw2oU","Mm8si5IhmG","o8UydguMb8","hYBCKZ4I1v","zY1GY4W0Tl","dmoS7S2Dfu","PYBf42DREs","euZA5580YD","OxWIHGWqqX","ciuWzpmeCd",
+"aL6AJW3VFH","LbRTH6AFT0","8hJdth1zcH","dpe1vlm0pD","yofH3hSSvQ","xXTI4Cp3mZ","uLtKsPYBf4","zQt6QCIShG","tl72WuTacx","MaJQsprNT6",
+"5drc6In3NS","9y4lw5Drn0","3otm6MmKGJ","SjskQjeskS","oQ87rlkMUA","guMb8RBhp0","QClRLUmaEv","tl72WECMvU","hUTw7x3LDe","s4786iB08l",
+"SWfou9XyT9","wDajXKZamH","CqqaDUlU3M","pFrrl8xEKz","gtCA5Rxrsm","kZANmeuZA5","qUJMdBCxeC","ni2v1cShY2","prNT65nmWv","DQimp9iGoT",
+"UlU3MxXTI4","WaWsvNOHsz","UmaEv9y4lw","5nmWvbgJAz","QYxC07fKYU","5drc6ZhwG1","2Yz7EG1RhS","3otm6TXQ0Z","QChxscShY2","W7cTsd7vjM",
+"euZA5TCgPp","faHirNOHsz","SWfouqaofN","RzaZA6AFT0","lm0pD5VZjS","oGu6xHP433","cL0aEKr8ys","RACujni2v1","zQt6QP6bcg","ciuWzQbxXc",
+"CxVEfJJs5m","lViBvPb1pa","rhl0JWreyP","8FmFH6AFT0","QssNCi3pyd","RkQkebrhlQ","StlDJnnP8o","Oz8yZuN6r3","5nmWvYh1hF","s47864dEz6",
+"F6PT2Yw2oU","MGlTFfFDrJ","G1RhSkB5nP","AmdQduQIcz","dmoS7he9IA","uQIczbrhlQ","QClRLuPX7G","GXdoH6AFT0","VBjhzo8Uyd","JKWYRQClRL",
+"Mkgy8ciuWz","d7vjMazIWp","L7cGcQworu","ZhwG10YAGH","FcWrWJIqXi","TCgPpzz4ZU","9XyT9v2eC3","okgRi2Nslm","iqv4kSjskQ","Nxx9VHlUbF",
+"jfREuC2Irc","WmadAv8yFN","hi5X7FcWrW","aL6AJ5IhmG","fmIK1JKWYR","NOHszQworu","RACuj0ao3l","nlaByjiVBP","suY4xU3yw5","ksJbycQOnv",
+"cmXIXQYxC0","5iGN5OxWIH","WmadApWiOs","WaWsvThjNn","LbRTHaL6AJ","2hEEUhe9IA","3otm6yEfy9","5IhmGlsQGo","5NammOz8yZ","vkCHHaFFss",
+"ni2v1Q6hMC","CNHmvXflUq","Yh1hFfLNg8","Pb1paVjCZq","zHF1qTXQ0Z","X6PinQ6Lix","S2DfuaL6AJ","Kr8ysVIlwP","wDajX7X3uy","yvOMI9iGoT",
+"RkQkeJKWYR","xXTI4jtn0X","Yw2oUpT8wu","5nmWvl83Ud","HfyNQYf2Ec","FFDuijfREu","Y1mC0P6bcg","zqH0WQ6Lix","MmsIobZLvS","i3pyduvf7A",
+"zFgtBjS1aj","yvOMIvOqCE","0YAGHogLgc","OxWIH5Namm","t98iWo8Uyd","IBe8kCxVEf","ogLgcO3iyQ","ZhwG1jiVBP","ydG8Ub29RJ","b29RJzz4ZU",
+"MaJQsAOgEe","Rxrsmk85Ae","MmsIoYjB9t","9eoRcGv3Fq","RpBQmSjskQ","DG4sTb29RJ","BFkb8pFrrl","0MR5XDLhzM","O3iyQ0Kyfs","W3VFHReKEW",
+"gjUTuGv3Fq","BbwgAnFqik","Mm8siL7cGc","hSSvQMkgy8","7fKYUfcwDa","Q6LixMaJQs","ZzJHWcL0aE","SWfouuoStw","2hEEU2TRI7","9rlg9RzaZA",
+"dmoS7oGu6x","OxWIHgtCA5","lH1ktJRJQB","pAhR1ksJby","8U2nUMkgy8","ix74r07n1c","fqypyrhl0J","l83UdM6qcG","OUqFMXflUq","S2Dfu0PktI",
+"VjCZqJJs5m","Twano7ku1p","CIShGBGaQY","YjB9tSbRYy","VIlwPtAOsr","RsQUqtAOsr","FFDuiM3zXL","v8yFNSmGzv","3weIFVerEA","7fKYUBCxeC",
+"0MR5XO3iyQ","B3qemQChxs","Kr8ysYh1hF","dpe1vWaim6","sqVrfxciqp","ThjNnBGaQY","cShY2uQIcz","v2eC3uJScX","fcwDaFnPFB","AOgEex3LDe",
+"Waim61LB1L","y94nwRpBQm","y94nwAXpwE","WaWsvlsQGo","Gv3FqJkzUn","8U2nUlViBv","fFDrJWDVWJ","iKqhrRxrsm","hE1QlNhXdu","IKxdLiwzGk",
+"ZhwG1VLTy6","brhlQIBe8k","RzaZAThjNn","tjQxs5drc6","ni2v1ksJby","gtCA5MezSW","kB5nPBpYhV","yvOMIn8pJ9","8FmFHjeskS","7fKYUy94nw",
+"IBe8kuAWyp","yluBxiwzGk","taOXK14FLR","aFFssChuy3","5VZjSVjCZq","euZA5In3NS","QssNCKASQ8","6AFT0LewvM","jSjS3StlDJ","NhXduSbRYy",
+"lCMxy3otm6","cShY23otm6","ECMvUU3yw5","Ta8f6Z4I1v","9rlg9ksJby","16lHcru4UG","uoStwzmLYD","uTacx5drc6","nFqiko8Uyd","6AFT0nFqik",
+"LewvMTwano","guMb8oVQp6","CqqaD2hEEU","14FLRnnP8o","ZzJHWMGlTF","oQ87rMmsIo","gtCA5Yh1hF","FVMxoKr8ys","cQOnv5IhmG","xReecRpBQm",
+"jS1aj2hEEU","FwEJzogLgc","WaWsv5iGN5","FcWrW5VZjS","VBjhzt98iW","WreyPzz4ZU","S77LH7X3uy","mz8gxWaim6","Mkgy8yofH3","lH1ktzqH0W",
+"VNCPdaez9y","vLsmSMGlTF","14FLRzHF1q","SjskQ8hJdt","CdyBVfqypy","wiHrZgtCA5","xXTI4oGu6x","3weIFTCgPp","W7cTsoQ87r","jiVBPsuY4x",
+"AOgEeHlUbF","IBe8khi5X7","TXQ0ZzmLYD","7X3uyRpBQm","sqVrfiqv4k","zHF1qWreyP","kZANm0Wr5y","gf8rIwDajX","RmDcrK4GS8","gdQsSWmadA",
+"HzZT8zQt6Q","YjB9t8U2nU","OUqFMuJScX","X6Pin9GXkX","0Wr5yUlU3M","8hJdtSbRYy","QWxoTFVMxo","yluBx3otm6","tlILthE1Ql","RpBQm7fsYM",
+"VerEA0Kyfs","bgJAzAXpwE","jeskSVNCPd","wiHrZ7X3uy","In3NSQChxs","2DREsFcWrW","t59lRMezSW","VNCPdi3pyd","1v5hHQYxC0","yluBxRzaZA",
+"Yf2Ec0Kyfs","vkCHHNxx9V","yvOMI16lHc","Q6hMCFxX9q","bZLvSRmDcr","2DREs2TRI7","U3yw5he9IA","atef2lm0pD","MmKGJ0Wr5y","3weIFpv0i7",
+"CIShGQYxC0","s4786HzZT8","6AFT02TRI7","QnJ1SuPX7G","EdBKc5nmWv","pT8wublLA9","v2eC3BCxeC","OxWIHulk41","EdBKcAOgEe","gjUTulkMUA",
+"IRh48vkCHH","ZzJHWi7WMQ","B3qemRpBQm","7lUXZBpYhV","s7Mxk0h1b1","5VZjShi5X7","l83UdWaim6","v2eC3HRxd8","DcpWBgdQsS","Q6LixgIYvE",
+"7ku1psqVrf","6AFT0FFDui","jS1ajulk41","CdyBVpmeCd","uAWypo8Uyd","fLNg8zHF1q","4QMc9HRxd8","CK5W7VIlwP","7fsYMgIYvE","7hyVv0MR5X",
+"K20wKRACuj","fqypyNcICA","BCxeCFcWrW","KASQ8dpe1v","EdBKcx3LDe","618DicShY2","7lUXZQbxXc","yvOMIuoStw","2TRI7NhXdu","gIYvEQClRL",
+"618Di618Di","YOfrYDLhzM","5nmWvi3pyd","s93MlNhXdu","2DREsGXdoH","5VZjShSSvQ","5ZaEzkZANm","qQxHPogLgc","SWfouiqv4k","nFqik9iGoT",
+"QbxXcY1mC0","ni2v1Cp3mZ","BCxeC5Mg9r","MaJQsP6bcg","pT8wuL7cGc","4dEz6iqv4k","9eoRcuLtKs","RmDcrU3yw5","CqqaDiKqhr","aFFssFFDui",
+"pv0i7ECMvU","BCxeCRzaZA","DG4sTatef2","64s8N24ARF","FnPFBvkCHH","gdQsSlsQGo","DLhzMW7cTs","zFgtBnFqik","4W0TlFnPFB","OHaBz5IhmG",
+"tuDySh1zcH","VjCZq7fsYM","t98iWlsQGo","brhlQ14FLR","JJs5mFxX9q","FjHXRhSSvQ","pvgjSYw2oU","45cIH580YD","hi5X7dhSuH","1v5hHAgJHQ",
+"NcICAM3zXL","uPX7GQ6hMC","fcJOykZANm","6AFT0Fhtgl","ZJTXHDLhzM","8hJdtVprf2","W7cTsatef2","AOgEekZANm","jS1aj8TxD7","MezSWHzZT8",
+"G1RhS8cVD3","PYBf4tAOsr","suY4xUmaEv","kB5nPrKDLJ","CNHmvZzJHW","ru4UGaez9y","qQxHPsx5Gl","lXFOBGrDg7","soy9tzQt6Q","4W0Tltl72W",
+"FxX9qY1mC0","WaWsv3weIF","8RCUAzHF1q","BpYhVQbxXc","QWxoT7Ow5C","aFFssUvlv4","ciuWz8TxD7","CNHmvfqypy","pv0i75ZaEz","ECMvUlm0pD",
+"zHF1qCfgr3","64s8NOxWIH","Waim6C2Irc","piJSkdmoS7","AmdQdTCgPp","TwanoyvOMI","nlaByCqqaD","WDVWJC2Irc","2TRI7iB08l","FhtglpAhR1",
+"RBhp05Namm","ulk41IRh48","CdyBVDcpWB","uTacxoQ87r","Oz8yZrKDLJ","0MR5X8cVD3","0PktIM6qcG","l83UdQChxs","hE1Ql5VZjS","cmXIX6q6L9",
+"he9IAhSSvQ","ni2v1DG4sT","AgJHQQworu","1j5L8RBhp0","K4GS89y4lw","GWqqX2DREs","ni2v1SWfou","aDGtSZv7z0","3otm6oGu6x","uJScXSbRYy",
+"IjTwP0Wr5y","MmsIokZANm","Cfgr3aez9y","DcpWBtvdkD","bZLvSK20wK","brhlQFVMxo","HfyNQlCMxy","oVQp6jeskS","MaJQspiJSk","TCgPp0MR5X",
+"BbwgAVprf2","mX2GEWDVWJ","lXFOBWreyP","JXljWRsQUq","tvdkDwDajX","EdBKc9y4lw","i3pydYw2oU","v1Hln8RCUA","xReecjfREu","5ZaEzkB5nP",
+"Gv3FqlViBv","lsQGoQ6hMC","0PktIo8Uyd","XflUqJ2mQi","ulk41dQ586","XflUqgdQsS","o8UydaDGtS","L7cGcW7cTs","618DiF6PT2","faHir0Wr5y",
+"7fsYMrKDLJ","W3VFH5ZaEz","I7p2abgJAz","MojnPO3iyQ","3otm6ksJby","JIqXini2v1","45cIHAgJHQ","VNCPdn8pJ9","5drc6SjskQ","9eoRcqQxHP",
+"SjskQsoy9t","SmGzv9GXkX","pAhR1uupzk","TCgPpFwEJz","xXTI4ogLgc","soy9tlpF6W","HRxd8iwzGk","W3VFHjtn0X","Dz1R3FFDui","Ss0ZuVLTy6",
+"WPmlxvkCHH","okgRiZzJHW","BCxeCIRh48","jtn0XQYxC0","7lUXZlkMUA","580YDCfgr3","gjUTuzqH0W","JXljWx3LDe","8TxD7mz8gx","ZhwG10Wr5y",
+"fLNg8RmDcr","x3LDeYf2Ec","OxWIHRpBQm","ZzJHW9eoRc","ZJTXHYf2Ec","8U2nUjS1aj","FVMxoiKqhr","Z4I1vFNYIM","EOE1obgJAz","mz8gxVBjhz",
+"ZJTXHi3pyd","OUqFMi7WMQ","tAOsrIRh48","dpe1vFGzgp","64s8NQWxoT","VNCPd3weIF","zHF1qFwEJz","Dz1R3fFDrJ","euZA5MK07Y","rz7UtaFFss",
+"jtn0Xdpe1v","UlU3MMK07Y","3weIFTXQ0Z","JRJQB5ZaEz","OUqFMuLtKs","xXTI4FLsph","AmdQdOUYuF","bZLvSogLgc","yofH3JRJQB","ReKEWlXFOB",
+"AgJHQx3LDe","m4bxURpBQm","QWxoT618Di","QChxsyofH3","jeskSfaHir","uTacxRsQUq","n1pmOsuY4x","OHaBzuvf7A","SbRYyP6bcg","qaofNZJTXH",
+"Gv3FqJKWYR","7lUXZUlU3M","JkzUnWaim6","580YDOUYuF","ZUnqtDz1R3","v1HlnRpBQm","ReKEWIKxdL","S2DfuMezSW","UlU3MpvgjS","cQOnvdQ586",
+"14FLRNxx9V","SWfoufFDrJ","618Di0ao3l","RBhp0blLA9","oQ87rWaim6","wDajXBbwgA","uQIcztjQxs","OxWIHvkCHH","8RCUAuvf7A","FLsphXyPZN",
+"07n1cKr8ys","QWxoT64s8N","CxVEflweGy","djsrvlCMxy","0BmCy4W0Tl","7hyVvhE1Ql","yToGWru4UG","aL6AJ3otm6","NhXdu5nmWv","EdBKcmX2GE",
+"fcJOyuupzk","Q6hMCxciqp","oQ87rTwano","ThjNnv2eC3","UmaEvAIYUu","Pb1paIRh48","FFDuiTwano","W3VFH14FLR","JXljWn1pmO","xciqp2DREs",
+"fcwDa0PktI","v2eC3pvgjS","tuDySS2Dfu","LDk6f6AFT0","dQ586Fhtgl","sqVrfVprf2","aFFssP6bcg","JRJQB5drc6","DG4sTNo0Qb","rKDLJiKqhr",
+"Pb1paaFFss","Q6LixCqqaD","pvgjSVerEA","gIYvEWDVWJ","EOE1oCfgr3","WDVWJ8xEKz","Nxx9VMaJQs","Q6LixJKWYR","yofH3bgJAz","okgRiJ2mQi",
+"0MR5XcL0aE","y94nwcQOnv","uN6r3VjCZq","wDajXMK07Y","ReKEWo8Uyd","J2mQiiqv4k","sx5Gllj07Q","soy9tfmIK1","Oz8yZMGlTF","QWxoTKZamH",
+"QYxC0Ta8f6","sqVrfCIShG","POUYSt59lR","uQIczVBjhz","CqqaDNcICA","Waim6DQimp","ZhwG1soy9t","WDVWJt59lR","gIYvEdQ586","jzUqR9XyT9",
+"VLTy6blLA9","FVMxoyluBx","pv0i7Y1mC0","sx5GlCIShG","ru4UGk85Ae","BbwgAGv3Fq","aDGtSru4UG","wDajXNo0Qb","8cVD35Mg9r","24ARFnFqik",
+"he9IAs4786","lweGyWMiS3","wiHrZqQxHP","7ku1phe9IA","Z4I1vzmLYD","ThjNnlViBv","ix74rTwano","9GXkXIBe8k","OUYuF3weIF","KsjRKazIWp",
+"QYxC0uZPqg","EoToPDG4sT","GSQwjLbRTH","9y4lwOUYuF","5Mg9raDGtS","iKqhrTa8f6","guMb8S2Dfu","jzUqRI7p2a","Nxx9VY1mC0","KsjRKqQxHP",
+"9iGoTOUYuF","d85a9blLA9","mz8gxK4GS8","b29RJn8pJ9","FGzgpoGu6x","9iGoTuAWyp","uLtKsFFDui","iwzGk64s8N","UmaEvWMiS3","azIWpS77LH",
+"J2mQi5Mg9r","lm0pDYjB9t","TCgPp2hEEU","OHaBzkB5nP","lm0pDX6Pin","aL6AJguMb8","FPfSEJJs5m","2ZHdkpv0i7","EoToPFNYIM","uZPqgHP433",
+"FLsph8U2nU","mX2GEy94nw","piJSkcL0aE","C2IrcuJScX","1v5hHVprf2","J2mQit98iW","24ARFhE1Ql","WMiS3fLNg8","gf8rIpvgjS","tAOsr64s8N",
+"QChxswiHrZ","iB08lRzaZA","DcpWBpv0i7","W3VFHW7cTs","BGaQYNAFuw","9GXkXix74r","WDVWJhE1Ql","GXdoHHzZT8","64s8N1LB1L","i3pydQChxs",
+"ni2v1lm0pD","BFkb8AgJHQ","vOqCECNHmv","7Ow5CjiVBP","e6e4zMaJQs","7Ow5CFnPFB","gf8rIWreyP","uLtKsFNYIM","QbxXcCp3mZ","aFFssZuDtD",
+"lCMxyVerEA","7X3uyjeskS","0PktIksJby","euZA5pmeCd","VjCZqQssNC","tAOsrHzZT8","ZUnqtIKxdL","TXQ0Z64s8N","d85a9dQ586","DcpWBQssNC",
+"tlILt2hEEU","KsjRKjfREu","SbRYyStlDJ","zHF1qFxX9q","qUJMdXyPZN","pFrrliwzGk","o8Uyd55rfB","3weIF5VZjS","JXljW5nmWv","i7WMQQYxC0",
+"Waim6Z4I1v","RACujGXdoH","k85AezQt6Q","SjskQvOqCE","D6rByNAFuw","HlUbFt59lR","RACuj8cVD3","9iGoT0ao3l","x3LDepAhR1","pmeCd0Wr5y",
+"2hEEU7Ow5C","gtCA5MaJQs","5ZaEzgIYvE","AkKTknnP8o","CxVEfYOfrY","pvgjSqQxHP","v1HlnRxrsm","UlU3Miqv4k","5ZaEzuPX7G","iB08lFGzgp",
+"he9IAvkCHH","oQ87rs93Ml","lkMUAs93Ml","k85AeNo0Qb","Mkgy8he9IA","t98iWBbwgA","pmeCdAOgEe","ix74rI7p2a","Oz8yZpv0i7","iqv4kgdQsS",
+"0BmCy7fKYU","OUqFMTa8f6","RxrsmHfyNQ","LbRTH64s8N","JkzUnNxx9V","VBjhzfaHir","GrDg7KASQ8","pAhR1rKDLJ","QbxXcRsQUq","KsjRKO3iyQ",
+"HzZT8UlU3M","Y1mC0yluBx","Z4I1vDLhzM","JRJQB0MR5X","oGu6xRkQke","uLtKsl83Ud","fqypyPb1pa","WDVWJMK07Y","Ss0ZuRzaZA","5IhmGuoStw",
+"4W0TlpvgjS","lpF6WHzZT8","yofH3iwzGk","s7MxkSmGzv","zz4ZUVjCZq","EoToPwDajX","POUYStuDyS","5VZjSksJby","EoToP8cVD3","Gv3FqMaJQs",
+"RmDcrNo0Qb","aez9yh1zcH","azIWphe9IA","CqqaDFFDui","FNYIM9rlg9","yEfy9fLNg8","tjQxs7Ow5C","soy9tqQxHP","EdBKcbrhlQ","FNYIMOUYuF",
+"55rfBdpe1v","RpBQm0Wr5y","UlU3MFhtgl","FhtglDQimp","GrDg7RkQke","DQimp4QMc9","0MR5XmX2GE","C2Irc7ku1p","BFkb8ciuWz","D6rByi7WMQ",
+"UlU3MVLTy6","n1pmOgtCA5","atef2zFgtB","3weIFlsQGo","gdQsSpFrrl","WaWsvfqypy","MGlTFgIYvE","WPmlxwDajX","tvdkDcQOnv","8FmFHPYBf4",
+"HP433zHF1q","RmDcrQ6Lix","K4GS8EOE1o","QChxsb29RJ","TCgPpFjHXR","he9IABCxeC","zqH0Watef2","9y4lw0ao3l","S2DfuK20wK","MezSWAkKTk",
+"pv0i7AmdQd","UmaEvYh1hF","Y1mC0dmoS7","gdQsS1v5hH","qaofNpT8wu","CxVEfSs0Zu","EoToPJ2mQi","e6e4zIn3NS","uN6r3mX2GE","Nxx9Vgf8rI",
+"9iGoT5iGN5","4W0TlJKWYR","Ta8f6zqH0W","aDGtSXflUq","uQIczjiVBP","StlDJDcpWB","QChxsCqqaD","Cfgr37Ow5C","mz8gx8TxD7","5Mg9rNhXdu",
+"0PktI2Yz7E","euZA5cShY2","KASQ8oGu6x","AkKTkKASQ8","rz7UtvOqCE","QworuZv7z0","WaWsvQ6Lix","GWqqXCfgr3","07n1cFGzgp","n8pJ9fqypy",
+"tvdkDzz4ZU","e6e4zhe9IA","aDGtS07n1c","zFgtBh1zcH","yToGWW3VFH","C2Irca00b5","AOgEeJ2mQi","ZJTXHWPmlx","WMiS3fqypy","hSSvQwiHrZ",
+"AgJHQrhl0J","ECMvUW7cTs","l83UdtjQxs","D6rBygdQsS","cQOnvQworu","Zv7z0ni2v1","Gv3FqwDajX","ydG8U5ZaEz","618DiydG8U","MaJQszmLYD",
+"7X3uyAgJHQ","Z4I1vokgRi","KsjRKAIYUu","l83UdkB5nP","9eoRcReKEW","fcwDa7X3uy","EdBKcuAWyp","FwEJzCxVEf","dQ586n1pmO","GXdoHs7Mxk",
+"JKWYRZuDtD","aez9ybZLvS","BpYhVVIlwP","faHir1v5hH","rz7UtOUqFM","aez9yReKEW","0YAGHm4bxU","QWxoTrKDLJ","FGzgpVLTy6","MojnPfmIK1",
+"FGzgpAmdQd","lsQGoPOUYS","TCgPphYBCK","I7p2aRACuj","WreyPogLgc","s4786DG4sT","lj07QOxWIH","he9IATCgPp","lweGy8hJdt","Ul4a1zFgtB",
+"ZhwG1x3LDe","ni2v1yofH3","ZUnqtxReec","IRh48gjUTu","gtCA55drc6","aDGtSFwEJz","8U2nUFGzgp","fcJOyi7WMQ","LbRTHjfREu","W7cTsMmsIo",
+"ulk41P6bcg","QbxXc6q6L9","AmdQdSbRYy","uPX7Gt98iW","07n1cuTacx","TwanoJXljW","d7vjMWreyP","djsrvxciqp","M3zXLZhwG1","3weIFgjUTu",
+"8TxD7QClRL","WDVWJQssNC","CK5W79y4lw","2Yz7Ey94nw","Vprf2RBhp0","taOXKokgRi","mz8gxHfyNQ","IBe8koGu6x","14FLRv8yFN","7lUXZQYxC0",
+"zFgtBB3qem","QYxC01j5L8","5drc6PYBf4","JRJQB2TRI7","7fsYMWaim6","Mkgy8d85a9","618DiRACuj","8cVD3mz8gx","lCMxy48cHL","fcwDamz8gx",
+"VerEAcmXIX","d85a9zHF1q","rhl0JVIlwP","S77LH8xEKz","CNHmv5Drn0","9XyT9Zv7z0","JRJQBblLA9","Dz1R3JKWYR","9y4lwPYBf4","yvOMIAgJHQ",
+"5Mg9rogLgc","lCMxyWDVWJ","JIqXiECMvU","taOXKB3qem","xciqpzqH0W","FjHXRpv0i7","mX2GEY1mC0","9iGoTbZLvS","wDajXkZANm","RpBQm3weIF",
+"5ZaEzulk41","FcWrWfaHir","JRJQBQ6Lix","faHirtvdkD","M3zXLLDk6f","JkzUn24ARF","rz7Utrhl0J","ThjNncShY2","Ta8f6ulk41","cL0aEZhwG1",
+"X6Pin5Drn0","suY4xpFrrl","dhSuHl83Ud","yluBxt59lR","7lUXZCxVEf","RxrsmPb1pa","dQ5861v5hH","IBe8kVBjhz","16lHcRpBQm","l83UdJJs5m",
+"cQOnvZ4I1v","1j5L8yToGW","ZuDtDF6PT2","PYBf4RkQke","gjUTuZuDtD","P6bcgix74r","D6rBy5Drn0","ix74rYOfrY","NcICA8RCUA","atef2VLTy6",
+"BpYhVuoStw","dpe1vyvOMI","Waim6piJSk","FxX9qJkzUn","mz8gxZUnqt","LbRTHlsQGo","ZuDtDy94nw","xXTI47fsYM","5drc6Fhtgl","x3LDelXFOB",
+"cL0aEYjB9t","HzZT8AXpwE","MojnPqaofN","1j5L8yofH3","atef2pvgjS","OHaBzjS1aj","BpYhVcQOnv","ZuDtDrz7Ut","LewvMJkzUn","uN6r3iwzGk",
+"YjB9tY1mC0","IjTwP8TxD7","FPfSEM3zXL","L7cGcAmdQd","soy9t8xEKz","ZuDtDMK07Y","UlU3McmXIX","S77LHuvf7A","piJSkoVQp6","IjTwPfFDrJ",
+"lH1ktFVMxo","ZhwG1a00b5","WMiS3D6rBy","24ARF14FLR","uupzkv1Hln","iqv4kD6rBy","L7cGc8cVD3","dmoS7piJSk","i3pydYjB9t","AgJHQ9rlg9",
+"ZhwG1lpF6W","Nxx9VKZamH","prNT6oVQp6","HzZT8AOgEe","9y4lwRpBQm","atef22hEEU","580YDRzaZA","VLTy6lCMxy","Ta8f61LB1L","9XyT9aDGtS",
+"Mkgy8nlaBy","AXpwEtAOsr","pT8wuZuDtD","cL0aE0YAGH","zmLYDFxX9q","ReKEWtjQxs","aDGtSuAWyp","TXQ0Z7fsYM","CxVEfv2eC3","24ARFaL6AJ",
+"d7vjMY1mC0","uZPqgs7Mxk","5Drn045cIH","a00b5iKqhr","uvf7At59lR","FwEJzni2v1","0MR5X9y4lw","FPfSEpvgjS","WaWsvOz8yZ","uZPqgmX2GE",
+"zFgtBCfgr3","pmeCdsqVrf","aez9yQChxs","atef2dpe1v","aL6AJ7hyVv","aDGtSUmaEv","CdyBVuN6r3","WMiS3e6e4z","2ZHdkv2eC3","O3iyQfqypy",
+"aDGtSHzZT8","rKDLJdpe1v","qaofNkB5nP","NhXduJkzUn","uQIczRzaZA","HP433jtn0X","Yh1hFtAOsr","Zv7z0Nxx9V","JKWYR618Di","NhXduRzaZA",
+"NcICA64s8N","MojnPIRh48","CxVEfDz1R3","HP433StlDJ","WaWsvuAWyp","8FmFHMmKGJ","EOE1oU3yw5","NAFuwHzZT8","AmdQdChuy3","7lUXZO3iyQ",
+"2NslmDcpWB","y94nwVLTy6","cL0aECqqaD","fqypyZv7z0","fcJOyMojnP","nFqikqUJMd","tvdkDtaOXK","lj07Q618Di","X6Piny94nw","s4786JRJQB",
+"3otm6QnJ1S","fmIK1HfyNQ","hSSvQtAOsr","0h1b1FwEJz","v1HlnNOHsz","SjskQFGzgp","RkQke5Namm","F6PT2suY4x","gdQsSfLNg8","WMiS3bZLvS",
+"AXpwEEOE1o","5Drn0gf8rI","ZzJHWLDk6f","0MR5XCK5W7","WaWsvciuWz","faHirSjskQ","CIShG5VZjS","fqypy5Namm","yvOMIYjB9t","fqypytjQxs",
+"0YAGHJXljW","zbIYY9rlg9","pWiOsYh1hF","ydG8Us93Ml","2DREsnFqik","AgJHQjfREu","Oz8yZ0h1b1","64s8NIRh48","hE1QlBGaQY","Waim6FPfSE",
+"Mm8siU3yw5","gIYvEjfREu","nnP8ouTacx","FLsphQYxC0","hSSvQRzaZA","t59lRWaWsv","ciuWzFhtgl","Nxx9VoGu6x","fFDrJVjCZq","F6PT2v1Hln",
+"jfREutuDyS","5Drn0QYxC0","n1pmOFLsph","8U2nUi3pyd","0PktIP6bcg","CK5W75VZjS","i7WMQokgRi","tl72WjfREu","8U2nUZuDtD","uLtKsQChxs",
+"29QAzt98iW","mX2GE0Kyfs","nnP8olj07Q","zHF1qyvOMI","dhSuHyluBx","G1RhSLewvM","uPX7GksJby","QYxC0yEfy9","n8pJ9EOE1o","tl72WpWiOs",
+"In3NSyvOMI","No0QbrKDLJ","2Yz7EhYBCK","EdBKc618Di","MaJQsjiVBP","VLTy65IhmG","cmXIXYOfrY","0YAGHOUqFM","ix74rv8yFN","d7vjMAkKTk",
+"ZhwG116lHc","ru4UGa00b5","tjQxsaL6AJ","zmLYD7fKYU","lkMUA6q6L9","5VZjSazIWp","M3zXLCfgr3","pmeCdaDGtS","5iGN5MGlTF","Cp3mZaFFss",
+"HRxd85iGN5","M6qcGiwzGk","uN6r3euZA5","AgJHQDLhzM","Dz1R3Mm8si","h1zcHSbRYy","uTacxpvgjS","soy9tM6qcG","618Di7X3uy","WreyPEOE1o",
+"FLsph48cHL","uoStwB3qem","QworuCdyBV","ni2v1FVMxo","OUqFM7fKYU","GWqqXChuy3","tlILte6e4z","Ta8f6FPfSE","mz8gx5Mg9r","EOE1o0Wr5y",
+"Cp3mZ0h1b1","JKWYRKASQ8","7fsYMUl4a1","JIqXi5Namm","fcJOypiJSk","l83UdfLNg8","9GXkXWaWsv","7fKYUkB5nP","No0QbMK07Y","24ARFhe9IA",
+"y94nwpv0i7","EOE1o0PktI","hUTw78U2nU","EoToPRzaZA","KsjRKOxWIH","No0Qbt59lR","v8yFNS77LH","hE1QlguMb8","tuDySv8yFN","PYBf4QClRL",
+"RpBQmOUqFM","aL6AJIjTwP","hE1QltlILt","48cHLmz8gx","7hyVvTXQ0Z","zbIYYRxrsm","xciqpVNCPd","jtn0X64s8N","MaJQscShY2","FFDuilpF6W",
+"KsjRKUvlv4","48cHLaez9y","y94nwWreyP","4QMc9ReKEW","CIShGPOUYS","C2IrcJ2mQi","zHF1qtuDyS","Zv7z0vOqCE","s7MxkAIYUu","lXFOBDLhzM",
+"iKqhrFcWrW","Oz8yZL7cGc","RsQUqThjNn","Z4I1vPb1pa","RpBQmEOE1o","3weIF7fKYU","n8pJ9WreyP","BpYhV5Mg9r","rz7UtHRxd8","W3VFHZ4I1v",
+"tlILtxReec","2NslmNxx9V","zHF1qStlDJ","ZUnqtt98iW","lpF6WW3VFH","29QAzW3VFH","brhlQLbRTH","lweGyyluBx","5Drn02Nslm","pFrrlsqVrf",
+"yEfy9n8pJ9","jS1ajdhSuH","IRh48i3pyd","M3zXLuoStw","Cfgr3AgJHQ","29QAzMaJQs","DG4sTEOE1o","lweGy3otm6","8U2nUCqqaD","jSjS3ogLgc",
+"Dz1R3ulk41","pmeCdyEfy9","VjCZquvf7A","rhl0J3otm6","gtCA5jiVBP","MezSWYw2oU","W7cTsdpe1v","qUJMdfLNg8","9rlg9nnP8o","FxX9quJScX",
+"DG4sTFGzgp","zqH0Wulk41","K4GS8WMiS3","RkQkeydG8U","LewvMdmoS7","PYBf4tlILt","GrDg7VjCZq","WPmlxZhwG1","Vprf2uPX7G","ix74r9GXkX",
+"MaJQsKZamH","JkzUnuZPqg","W3VFHkB5nP","6AFT0RmDcr","Q6Lix5VZjS","Yh1hFWreyP","7ku1pQClRL","vOqCE6q6L9","8RCUA5IhmG","tAOsrD6rBy",
+"zz4ZU1LB1L","WDVWJ3otm6","ksJbyGrDg7","2ZHdkru4UG","WaWsvfmIK1","FxX9qQ6hMC","7X3uyDG4sT","ZJTXHtvdkD","gf8rIZzJHW","yluBxK4GS8",
+"ulk41tvdkD","QworuC2Irc","QWxoTyofH3","fqypyRpBQm","WPmlxBpYhV","zY1GYguMb8","7lUXZ9rlg9","euZA5pFrrl","gf8rIOUYuF","2Yz7EtvdkD",
+"45cIH0ao3l","EdBKcWDVWJ","0KyfsOxWIH","F6PT2iB08l","FGzgpY1mC0","2hEEUKZamH","FFDuin8pJ9","Rxrsm5ZaEz","soy9t8RCUA","gtCA58U2nU",
+"pWiOsZv7z0","YOfrYIjTwP","mz8gxdmoS7","BGaQYsoy9t","tAOsrEdBKc","gdQsSlXFOB","he9IAqaofN","3otm6kZANm","Oz8yZDLhzM","FcWrWoQ87r",
+"pmeCdM6qcG","J2mQiQworu","CqqaDn8pJ9","lpF6WKr8ys","EdBKcZ4I1v","ogLgcnnP8o","FjHXRpFrrl","0ao3lNAFuw","uQIczO3iyQ","0Wr5yC2Irc",
+"dmoS7bZLvS","W3VFHtlILt","e6e4zydG8U","QnJ1SEdBKc","wiHrZvOqCE","7hyVv5nmWv","okgRioQ87r","Nxx9VYw2oU","AIYUuPb1pa","QWxoT0ao3l",
+"pvgjSFcWrW","HlUbFGWqqX","hi5X7h1zcH","ZhwG1cmXIX","WDVWJ5Namm","MK07Yd7vjM","aDGtS8FmFH","9eoRc7ku1p","hi5X79GXkX","n8pJ9J2mQi",
+"ix74rkZANm","RzaZAMmKGJ","5iGN5FLsph","Z4I1vx3LDe","fLNg87fKYU","1j5L85nmWv","RBhp0djsrv","HlUbFQ6Lix","2NslmK20wK","FwEJzqaofN",
+"0h1b1zqH0W","DG4sTyEfy9","ZhwG1prNT6","FcWrWNhXdu","GXdoHfFDrJ","ksJbyQYxC0","zHF1qYw2oU","5iGN5e6e4z","brhlQRzaZA","FcWrWqaofN",
+"5Namm24ARF","oGu6xi3pyd","5Mg9rjfREu","djsrvVNCPd","fmIK1GrDg7","SjskQfcwDa","BGaQY55rfB","y94nwwiHrZ","0h1b1tlILt","tjQxsCxVEf",
+"RsQUqWaWsv","azIWptvdkD","h1zcHkZANm","4W0TlAXpwE","FcWrWyToGW","uPX7GKZamH","xXTI4l83Ud","JJs5mokgRi","BCxeCFjHXR","d85a9VerEA",
+"gtCA5Ss0Zu","LDk6fh1zcH","wiHrZFcWrW","QWxoTSmGzv","azIWpJkzUn","W3VFH7ku1p","FFDuigdQsS","lViBvjiVBP","NAFuwOz8yZ","lj07QDLhzM",
+"cL0aErhl0J","zqH0WfaHir","LbRTHLewvM","jzUqRn1pmO","KZamHyEfy9","hSSvQQ6Lix","CdyBVZuDtD","ZhwG1zz4ZU","lkMUA4W0Tl","SWfoutaOXK",
+"1v5hHaL6AJ","AgJHQYw2oU","okgRiOUqFM","SjskQWMiS3","Cp3mZQbxXc","9rlg9uAWyp","LbRTHFcWrW","hE1QlJ2mQi","5VZjSVBjhz","l83Udx3LDe",
+"AIYUuzQt6Q","Z4I1vVBjhz","POUYSzmLYD","JRJQBs93Ml","JRJQBEOE1o","W7cTsEOE1o","SmGzv5drc6","VNCPdU3yw5","hi5X7G1RhS","SWfouWaim6",
+"W7cTs5VZjS","MojnPJkzUn","gdQsSt59lR","gdQsSJIqXi","euZA5Q6Lix","xReecSWfou","m4bxURmDcr","MojnPazIWp","nnP8ouPX7G","HP433OUqFM",
+"Q6hMCciuWz","7fsYMl83Ud","FxX9qlj07Q","guMb8FGzgp","tlILt0MR5X","lj07QFVMxo","9eoRco8Uyd","qQxHP1j5L8","ZhwG1uoStw","tAOsrcmXIX",
+"VerEAChuy3","wiHrZoGu6x","2hEEUlCMxy","D6rByaDGtS","suY4xVjCZq","fLNg8uoStw","KZamHB3qem","4W0TlS77LH","M3zXLzFgtB","qUJMdrhl0J",
+"oGu6xgf8rI","1v5hHL7cGc","8FmFHEOE1o","GrDg7Q6Lix","mX2GEMmsIo","9iGoT3weIF","mz8gxnlaBy","ECMvUuAWyp","FNYIM8RCUA","rz7UtJIqXi",
+"2ZHdkEOE1o","FwEJz6AFT0","BGaQY9rlg9","uTacxjiVBP","Chuy3O3iyQ","LbRTHFGzgp","pAhR1FLsph","9y4lwhe9IA","5Drn0CIShG","ZzJHWoQ87r",
+"ZzJHWjtn0X","ni2v1vLsmS","0MR5X48cHL","4W0Tlatef2","lCMxyJJs5m","Yw2oUBGaQY","lj07QECMvU","zmLYDAXpwE","5Mg9r1v5hH","v8yFNjfREu",
+"bgJAzOz8yZ","5nmWvn8pJ9","5NammjSjS3","L7cGcnFqik","zHF1qaez9y","0h1b1JKWYR","1LB1LK20wK","wDajXHlUbF","CdyBVKr8ys","FxX9qMezSW",
+"nnP8oY1mC0","ZzJHWAgJHQ","ogLgcy94nw","TXQ0ZVprf2","jeskSzHF1q","5drc6IRh48","gdQsSpvgjS","uupzkaL6AJ","5IhmG9y4lw","0YAGH5Mg9r",
+"K20wKiqv4k","3weIFQnJ1S","WaWsviB08l","SjskQiB08l","0BmCyprNT6","1LB1LNhXdu","S2DfubZLvS","jSjS3pv0i7","hi5X7jzUqR","2Yz7Es93Ml",
+"SbRYyjzUqR","QChxsazIWp","MK07YOHaBz","RkQkev8yFN","7hyVvd7vjM","WaWsvVNCPd","6AFT0guMb8","y94nwnFqik","rKDLJY1mC0","M3zXLNxx9V",
+"OHaBz7hyVv","Uvlv455rfB","7fKYUKZamH","jS1ajJXljW","MezSW45cIH","3weIF3weIF","RzaZAfLNg8","tvdkDtlILt","618Di5iGN5","S77LHhe9IA",
+"S2DfuIKxdL","djsrvvkCHH","WmadAogLgc","zqH0Wpv0i7","B3qemW7cTs","Zv7z0Yw2oU","3otm6pAhR1","hE1QlMmKGJ","hYBCKksJby","5NammpAhR1",
+"QChxsaDGtS","4QMc9CqqaD","BCxeCZv7z0","LewvM2ZHdk","atef2pv0i7","zFgtBfFDrJ","l83UdDLhzM","FcWrWxReec","UlU3M2DREs","9y4lwRxrsm",
+"ni2v1B3qem","hUTw7euZA5","ix74rb29RJ","gIYvE24ARF","FwEJzjSjS3","gjUTui3pyd","2DREsbZLvS","3weIFCNHmv","QworuVprf2","CdyBVCqqaD",
+"t98iW5drc6","rz7UtC2Irc","Oz8yZlpF6W","Qworu2ZHdk","24ARFSbRYy","xciqp9rlg9","0BmCySjskQ","dpe1v5IhmG","v1HlnvkCHH","lm0pDe6e4z",
+"TXQ0ZcL0aE","UlU3MDG4sT","RBhp0l83Ud","m4bxUvkCHH","StlDJTwano","TCgPpaDGtS","pT8wuyofH3","JRJQBStlDJ","v2eC3IRh48","2Yz7Edpe1v",
+"In3NSoVQp6","UmaEv8cVD3","aDGtSLbRTH","DQimpHzZT8","MaJQsQnJ1S","QbxXcazIWp","FxX9qOxWIH","iqv4ktaOXK","LDk6fuAWyp","lCMxyx3LDe",
+"9GXkXEoToP","fcwDafcwDa","WDVWJa00b5","zz4ZU29QAz","bgJAz5Drn0","VBjhzBCxeC","5iGN5K20wK","lm0pDDG4sT","F6PT22hEEU","i3pydJIqXi",
+"GXdoHRsQUq","Fhtgl0h1b1","jSjS3yvOMI","hUTw7QClRL","gtCA5IBe8k","4W0TlXyPZN","tAOsrblLA9","3weIFXflUq","v8yFNRpBQm","zz4ZUWMiS3",
+"2hEEUVLTy6","azIWpMm8si","jSjS3cQOnv","ru4UGaDGtS","BFkb8YjB9t","FnPFB55rfB","O3iyQKZamH","8hJdtYw2oU","lj07QqaofN","Gv3FqCIShG",
+"n8pJ9MmKGJ","2DREslkMUA","lsQGoogLgc","8U2nU2DREs","zFgtB0Kyfs","iwzGkzbIYY","uN6r35drc6","ciuWz7Ow5C","pvgjS2Nslm","aez9yOUYuF",
+"Dz1R3vLsmS","FFDuiqQxHP","GWqqXGXdoH","qUJMdtAOsr","atef2uN6r3","t59lREOE1o","piJSkQWxoT","5NammQChxs","8xEKz1LB1L","QClRLM6qcG",
+"Q6LixJIqXi","ksJby2ZHdk","JRJQBqUJMd","UlU3MnlaBy","DLhzMGWqqX","qUJMd0YAGH","LbRTHMmsIo","5IhmG24ARF","zHF1qU3yw5","QbxXcMm8si",
+"m4bxU7hyVv","Q6Lix16lHc","7X3uy5Mg9r","CqqaDFPfSE","aFFssSmGzv","ru4UGJ2mQi","HfyNQhi5X7","JXljWRACuj","2DREsCxVEf","WDVWJatef2",
+"LewvMjSjS3","aL6AJXyPZN","9GXkX0Kyfs","M6qcG48cHL","qaofNyEfy9","DG4sTlj07Q","tlILtatef2","vLsmSlsQGo","SjskQSbRYy","PYBf4BpYhV",
+"FPfSEhE1Ql","9iGoTgjUTu","ogLgcD6rBy","1LB1LLDk6f","0h1b1Vprf2","jzUqRJIqXi","7X3uys93Ml","FLsphFNYIM","IjTwPDLhzM","U3yw5Nxx9V",
+"DcpWB580YD","PYBf4uPX7G","wiHrZ5drc6","lH1ktuAWyp","hE1Ql7fKYU","mX2GEzmLYD","StlDJ8TxD7","gjUTu29QAz","uoStwC2Irc","AIYUu6q6L9",
+"VerEAblLA9","dQ586i3pyd","xciqp14FLR","In3NSpv0i7","uZPqgqaofN","WPmlxZuDtD","QClRL48cHL","W7cTspiJSk","9XyT9QClRL","yToGWwDajX",
+"MmKGJgf8rI","pFrrlVjCZq","4QMc9gf8rI","lH1ktHlUbF","lweGyG1RhS","d7vjMBGaQY","nFqikaez9y","Cp3mZVjCZq","aDGtSDz1R3","YOfrYfaHir",
+"JJs5mdmoS7","v8yFNMmKGJ","DG4sT5VZjS","FVMxolXFOB","t59lRHfyNQ","DQimpRxrsm","GrDg7Gv3Fq","yvOMIs4786","v2eC3MGlTF","zmLYDaez9y",
+"ThjNn7X3uy","2hEEUd7vjM","VLTy616lHc","MojnPyEfy9","IjTwPo8Uyd","Qworugf8rI","GXdoHZuDtD","5VZjSd7vjM","rz7Utlm0pD","CqqaDFhtgl",
+"8hJdt7hyVv","VBjhz9eoRc","okgRimz8gx","Nxx9VM6qcG","QClRLd85a9","pmeCd5IhmG","lsQGo0Wr5y","YjB9t5ZaEz","FNYIMFcWrW","FjHXROz8yZ",
+"zQt6QLDk6f","o8UydHRxd8","TXQ0Z5Mg9r","GWqqXQClRL","ReKEW4QMc9","WreyPfcwDa","VerEAHRxd8","rz7Ut8cVD3","5drc6RsQUq","vOqCEMm8si",
+"5drc6h1zcH","VLTy6IKxdL","ReKEWGSQwj","cL0aESbRYy","dhSuHYjB9t","rz7UtcmXIX","I7p2aAmdQd","GWqqXlCMxy","L7cGcgf8rI","AXpwEhUTw7",
+"IRh48KZamH","pAhR15IhmG","XyPZNhSSvQ","atef2tAOsr","pWiOsVBjhz","wDajXix74r","S77LH16lHc","FnPFBM6qcG","2TRI7oQ87r","aL6AJcQOnv",
+"VerEA5VZjS","8hJdt5ZaEz","e6e4zzqH0W","Q6hMCGrDg7","uN6r3aL6AJ","t98iWjiVBP","tuDySQWxoT","jzUqRyvOMI","NAFuwfLNg8","fqypyaDGtS",
+"SbRYyoQ87r","jtn0X7ku1p","a00b5NAFuw","6q6L9QWxoT","9rlg955rfB","JRJQBMmKGJ","3weIFlXFOB","Ss0ZuNxx9V","FcWrWoVQp6","gdQsSnlaBy",
+"he9IAbgJAz","piJSko8Uyd","lpF6WOxWIH","fcwDayvOMI","0BmCyTCgPp","Yh1hFAkKTk","m4bxULewvM","SjskQe6e4z","Cfgr3qaofN","MaJQsFxX9q",
+"Kr8yshi5X7","dhSuHKr8ys","nnP8oMK07Y","d85a9azIWp","x3LDeWreyP","CK5W7LbRTH","Y1mC0zqH0W","MGlTFlsQGo","5nmWv29QAz","gIYvEFGzgp",
+"ciuWzuJScX","rKDLJNxx9V","dhSuH9GXkX","KASQ8pmeCd","L7cGcWMiS3","QbxXczHF1q","5Drn0DLhzM","1v5hHJXljW","cL0aErz7Ut","BCxeCAgJHQ",
+"7fsYMUvlv4","RmDcr2DREs","atef2HP433","7X3uySmGzv","0Kyfss4786","iwzGkiqv4k","WDVWJnFqik","ulk41uAWyp","k85AeogLgc","ksJbyDLhzM",
+"brhlQi3pyd","M6qcGQ6hMC","8TxD7ogLgc","fcwDaCNHmv","PYBf4D6rBy","TCgPpQssNC","MojnPFhtgl","he9IAIRh48","oGu6x9iGoT","bZLvSPOUYS",
+"4W0TlUl4a1","pT8wu9y4lw","TCgPphi5X7","atef2oGu6x","6q6L929QAz","9y4lwqaofN","Zv7z0iKqhr","yEfy99XyT9","Cp3mZyToGW","2TRI7uZPqg",
+"fFDrJVIlwP","pAhR1nnP8o","e6e4zwiHrZ","EdBKcFxX9q","rz7UtlCMxy","rhl0J7ku1p","FLsph5ZaEz","t59lR8U2nU","9rlg9QYxC0","lpF6WjiVBP",
+"WreyP9y4lw","okgRifLNg8","OUYuFAmdQd","DQimppv0i7","hSSvQ7ku1p","ulk41v2eC3","0h1b1No0Qb","618DiaL6AJ","FcWrWHRxd8","pFrrlPOUYS",
+"brhlQNcICA","1j5L8QssNC","VIlwPfmIK1","16lHcD6rBy","atef25ZaEz","FPfSEKZamH","BCxeC5VZjS","pT8wua00b5","fFDrJM3zXL","3otm6FGzgp",
+"RmDcr07n1c","lj07QFxX9q","DcpWBtuDyS","uupzk9XyT9","tlILtlCMxy","W7cTsTa8f6","WreyPStlDJ","s93MlzqH0W","hSSvQRsQUq","RkQkemz8gx",
+"1v5hHjtn0X","lj07QUlU3M","zQt6Q4dEz6","ThjNn9GXkX","9GXkXFFDui","cShY2Z4I1v","iwzGkRkQke","gdQsScmXIX","TCgPpa00b5","IBe8k16lHc",
+"YOfrYHlUbF","Nxx9VWPmlx","ZzJHWa00b5","HP4338FmFH","x3LDeDQimp","i7WMQtlILt","Q6hMCNAFuw","UmaEvLewvM","AXpwEZv7z0","TXQ0ZCfgr3",
+"dmoS7yluBx","n1pmOuPX7G","xciqpn1pmO","uvf7AjfREu","i3pydHlUbF","sqVrflXFOB","Uvlv40PktI","AIYUuCNHmv","zHF1qbrhlQ","NhXduFhtgl",
+"MK07YCK5W7","GrDg7Uvlv4","dpe1vvLsmS","k85AebZLvS","2TRI7qQxHP","FLsphVjCZq","bgJAzfmIK1","HfyNQlXFOB","8FmFHDLhzM","8hJdtru4UG",
+"ksJbyJkzUn","QWxoTYOfrY","POUYS1j5L8","G1RhSiwzGk","0Wr5yQworu","fmIK1yvOMI","WreyPIn3NS","o8UydQ6Lix","0ao3lMkgy8","nFqikmz8gx",
+"XflUquPX7G","BGaQYdhSuH","EOE1oC2Irc","n1pmOVjCZq","EOE1oi3pyd","2TRI77Ow5C","uN6r3v1Hln","OHaBzWMiS3","MmsIoPOUYS","Cp3mZfqypy",
+"Dz1R3Z4I1v","tjQxsksJby","5IhmGlj07Q","n8pJ97hyVv","s93MlCqqaD","MmsIonFqik","KZamHCxVEf","hE1QlyluBx","K4GS8ZhwG1","Uvlv4RpBQm",
+"gf8rI4QMc9","ogLgcFPfSE","kB5nPYh1hF","FnPFBK20wK","C2IrcWPmlx","M3zXLdmoS7","5ZaEziqv4k","jfREuAIYUu","lCMxy0Kyfs","1v5hHS2Dfu",
+"BFkb8xReec","ZzJHWSWfou","48cHL24ARF","J2mQiY1mC0","OHaBzfcJOy","mz8gxs7Mxk","iqv4kWPmlx","i3pyddhSuH","ix74rCIShG","jeskSuAWyp",
+"CdyBV2Yz7E","v8yFN4W0Tl","GXdoHprNT6","Pb1pafcwDa","e6e4zuAWyp","0MR5Xuupzk","b29RJiwzGk","24ARFBpYhV","ZUnqtgdQsS","S2DfulH1kt",
+"hUTw7JRJQB","nlaBys7Mxk","DQimpxXTI4","CK5W7Chuy3","e6e4z7fsYM","UlU3Me6e4z","FjHXRThjNn","BpYhVWreyP","KsjRKlXFOB","9XyT9Fhtgl",
+"Cfgr3piJSk","5Mg9rQssNC","Q6LixZ4I1v","7ku1phUTw7","9XyT9aez9y","S77LHYOfrY","2hEEUSmGzv","0YAGHFhtgl","29QAzlViBv","qUJMdaDGtS",
+"uQIczD6rBy","GrDg70Wr5y","Uvlv4pWiOs","lj07QOUqFM","faHir8RCUA","tuDySOUYuF","4W0Tlru4UG","uvf7AKr8ys","Zv7z0y94nw","b29RJDLhzM",
+"JRJQB7fsYM","5IhmG6q6L9","AXpwEPOUYS","e6e4zpT8wu","RkQkezHF1q","ciuWzEoToP","8xEKzni2v1","lweGy7hyVv","M6qcGFjHXR","Vprf2MaJQs",
+"uupzkd7vjM","oQ87rG1RhS","vkCHH4dEz6","aL6AJJ2mQi","S77LHmX2GE","G1RhSC2Irc","SmGzvKsjRK","pFrrl0BmCy","ReKEWv2eC3","VIlwPAOgEe",
+"dpe1v6q6L9","yluBxG1RhS","wDajXRsQUq","mX2GENxx9V","VerEA8xEKz","ni2v1t98iW","In3NSQnJ1S","yEfy9FGzgp","SmGzvRsQUq","Mkgy8dpe1v",
+"jSjS3gjUTu","lpF6WX6Pin","SbRYyMmKGJ","HfyNQy94nw","aFFssTwano","t59lRIRh48","Oz8yZVjCZq","jzUqRuTacx","VNCPd2TRI7","7ku1puQIcz",
+"4QMc9KsjRK","OUYuFtaOXK","VBjhzIjTwP","tl72WtvdkD","DLhzM5VZjS","U3yw5bZLvS","SjskQdpe1v","3otm6RkQke","0h1b1xReec","FPfSEd7vjM",
+"v2eC364s8N","VBjhzbrhlQ","RxrsmTXQ0Z","AgJHQAIYUu","WDVWJiqv4k","soy9tEdBKc","14FLRpFrrl","Cp3mZv8yFN","wDajXlsQGo","hE1QlFVMxo",
+"WaWsvNAFuw","ix74rv2eC3","azIWp5IhmG","uJScXWDVWJ","JkzUnjS1aj","jeskS8cVD3","zqH0WUmaEv","J2mQiFhtgl","HRxd8W3VFH","vLsmSRBhp0",
+"hE1QlyEfy9","MK07YK20wK","NcICASs0Zu","KsjRK6AFT0","JIqXiaFFss","L7cGcMmsIo","5Mg9r2Nslm","VjCZqfFDrJ","FLsphuupzk","EdBKcnlaBy",
+"vkCHHKZamH","HzZT8mz8gx","uPX7GQYxC0","ZhwG1FFDui","CdyBV4W0Tl","TXQ0ZcQOnv","uN6r3AIYUu","FnPFBuLtKs","YjB9tdmoS7","suY4xaFFss",
+"0ao3lCfgr3","1j5L8WmadA","4dEz6v1Hln","4QMc9F6PT2","MGlTF4QMc9","n1pmODcpWB","45cIH3otm6","618DiQWxoT","S77LHM6qcG","qaofNhe9IA",
+"NcICASWfou","ydG8U2DREs","CdyBVyofH3","0BmCyjfREu","WPmlx7lUXZ","uQIczY1mC0","WPmlxFxX9q","5Drn0BGaQY","mX2GEjfREu","VBjhzzY1GY",
+"8U2nUtlILt","b29RJGWqqX","In3NSHfyNQ","K20wK5Mg9r","GWqqXcShY2","SbRYyFLsph","euZA5tjQxs","aFFssGSQwj","K20wKW3VFH","JXljWM6qcG",
+"UmaEvYw2oU","DLhzMKsjRK","M6qcGFLsph","jS1ajBCxeC","lsQGo6AFT0","pFrrlDz1R3","WDVWJjSjS3","MezSWvOqCE","ZJTXHix74r","hSSvQrz7Ut",
+"KASQ8Fhtgl","taOXKhSSvQ","D6rBy2TRI7","DcpWBgjUTu","fqypycQOnv","FGzgpKsjRK","uupzk5Drn0","v1Hln16lHc","kB5nP7fsYM","7Ow5ClsQGo",
+"tl72WdmoS7","3otm6ZuDtD","14FLRHP433","zbIYYRmDcr","uLtKspiJSk","aez9y8TxD7","qQxHP2TRI7","prNT6BbwgA","uupzkfFDrJ","O3iyQ14FLR",
+"WreyPy94nw","uJScXt59lR","jtn0XkZANm","ciuWzY1mC0","GSQwjM6qcG","L7cGcKZamH","WaWsvMm8si","pT8wupFrrl","iKqhrqaofN","RkQkehE1Ql",
+"lkMUAUl4a1","S77LHa00b5","nFqikSs0Zu","9GXkXuvf7A","t59lRqUJMd","Yw2oUUvlv4","0MR5XDcpWB","SWfou5IhmG","QbxXclj07Q","uLtKs7fKYU",
+"bZLvS24ARF","DcpWB7lUXZ","zHF1qRpBQm","MezSWRpBQm","cmXIXv1Hln","b29RJAIYUu","OUYuFFNYIM","LDk6fvLsmS","XflUqblLA9","Yw2oUK20wK",
+"dpe1vK20wK","FhtglxReec","JkzUnEdBKc","2DREs5Mg9r","yluBxsoy9t","7ku1prhl0J","AXpwEvLsmS","2TRI7wDajX","FjHXR7hyVv","yofH3wiHrZ",
+"7fKYUblLA9","oVQp6lj07Q","4QMc9Waim6","uPX7G618Di","2hEEUOUqFM","hSSvQbgJAz","uupzkQssNC","piJSkaL6AJ","uupzkBGaQY","618Di45cIH",
+"OxWIH0Wr5y","he9IAYjB9t","EoToP3otm6","0MR5Xrhl0J","fmIK1tjQxs","t98iWVBjhz","L7cGc55rfB","uQIczwiHrZ","SWfouIRh48","HlUbFqaofN",
+"G1RhSB3qem","YOfrYgf8rI","RACujcmXIX","cQOnv8U2nU","uvf7A5Mg9r","VerEA4QMc9","ksJbyzz4ZU","zHF1qWmadA","a00b5gtCA5","euZA5HRxd8",
+"zHF1qO3iyQ","jeskS55rfB","pv0i72ZHdk","d85a9Zv7z0","9eoRczHF1q","7fsYM5nmWv","MmsIoZJTXH","aFFssqUJMd","3weIFBpYhV","lpF6WzQt6Q",
+"S77LHwiHrZ","iB08lulk41","l83Ud0h1b1","GXdoHZhwG1","dhSuHuupzk","QWxoTd85a9","sqVrfuAWyp","JkzUnBbwgA","Ta8f6W3VFH","qQxHPGXdoH",
+"v8yFNAOgEe","0MR5X6q6L9","RkQkeDz1R3","IBe8kEoToP","2Yz7EOz8yZ","OxWIHIBe8k","SjskQ45cIH","RxrsmWDVWJ","Yf2EchSSvQ","o8UydlpF6W",
+"cmXIXNxx9V","uoStwguMb8","ni2v18FmFH","OUYuFiwzGk","uupzklH1kt","ZzJHWChuy3","7hyVvG1RhS","Gv3Fq9XyT9","ciuWzXyPZN","AOgEeciuWz",
+"gtCA5ru4UG","aFFssHzZT8","0YAGHlXFOB","pvgjSs93Ml","8xEKzpT8wu","lweGyMK07Y","wDajXJKWYR","6q6L9djsrv","MK07Yrhl0J","xXTI4VNCPd",
+"aL6AJogLgc","jeskSEdBKc","fcwDa1LB1L","VIlwPuN6r3","m4bxUMaJQs","O3iyQlViBv","xXTI4xReec","4W0TlpFrrl","Q6LixEOE1o","RACujWMiS3",
+"LDk6ftuDyS","QClRLRzaZA","hi5X7ZuDtD","Yw2oUL7cGc","ciuWzBbwgA","SjskQFwEJz","0Kyfssx5Gl","0h1b17fsYM","yofH3tvdkD","FVMxoQClRL",
+"5Drn0uvf7A","AkKTkChuy3","CqqaDKASQ8","yvOMImz8gx","hYBCKZUnqt","QClRLUl4a1","tuDyS7hyVv","SWfouYw2oU","vOqCEGSQwj","DLhzMSjskQ",
+"QChxsQnJ1S","s93MlMmsIo","uAWypQ6Lix","OUYuFQClRL","bZLvSSjskQ","tAOsr2Nslm","taOXKqaofN","Twano7Ow5C","HlUbFVIlwP","Ul4a1jtn0X",
+"MezSWVprf2","xciqpNhXdu","QClRLQworu","9iGoTnlaBy","RmDcrGWqqX","lH1ktzz4ZU","ThjNnwiHrZ","gf8rI6q6L9","jfREu0Kyfs","MmKGJ5drc6",
+"Cp3mZfaHir","WreyPQYxC0","e6e4z0YAGH","Nxx9VSjskQ","C2Irctl72W","kZANm64s8N","Y1mC0ZzJHW","tuDySYjB9t","Yw2oUHP433","jfREuBFkb8",
+"o8UydMmKGJ","6q6L95nmWv","bgJAzP6bcg","gtCA5TXQ0Z","a00b5Twano","POUYSJKWYR","gtCA5oQ87r","0ao3lhUTw7","Chuy3C2Irc","14FLRECMvU",
+"FLsph0PktI","he9IAOz8yZ","3weIFjSjS3","Kr8ysBpYhV","fcwDajiVBP","uvf7Ai7WMQ","pWiOsOz8yZ","hi5X7pAhR1","P6bcgzY1GY","FFDuigtCA5",
+"P6bcgJKWYR","FNYIMrhl0J","14FLR48cHL","taOXKVprf2","gjUTu5Namm","hE1QlFjHXR","sqVrfZJTXH","0h1b1FNYIM","zFgtBatef2","2DREs55rfB",
+"fcwDaIn3NS","CdyBV0MR5X","W7cTsDcpWB","DQimpHP433","EoToPuJScX","GXdoHQChxs","ydG8UuN6r3","POUYSReKEW","fqypyCdyBV","7ku1ppT8wu",
+"Yw2oUSWfou","b29RJjS1aj","0PktIlm0pD","TwanoZ4I1v","LDk6fJ2mQi","MezSWMK07Y","v8yFNpWiOs","G1RhSMojnP","zHF1qk85Ae","5ZaEzfcwDa",
+"cL0aEY1mC0","t59lRUlU3M","29QAzy94nw","uTacxWaWsv","GrDg7FxX9q","vOqCEn1pmO","7fsYMfLNg8","uPX7GhYBCK","hYBCKuoStw","AmdQdru4UG",
+"s93MlyEfy9","zz4ZUYw2oU","9eoRcuoStw","euZA5cL0aE","4QMc9VIlwP","d85a99GXkX","5nmWvCxVEf","tuDyS2Nslm","euZA5IjTwP","RsQUqfqypy",
+"ThjNnulk41","7X3uyFLsph","2DREsix74r","KZamHIBe8k","OUqFMKZamH","zHF1q2hEEU","TXQ0ZdmoS7","POUYSK4GS8","0h1b1rz7Ut","blLA9D6rBy",
+"NhXdu48cHL","wDajXQYxC0","AOgEeHP433","618DiNAFuw","4W0TlBGaQY","8TxD7oGu6x","Oz8yZVNCPd","lViBvP6bcg","gIYvEMkgy8","FjHXRQYxC0",
+"djsrvDQimp","ZuDtDpT8wu","7fKYUtuDyS","tl72WD6rBy","l83UdThjNn","SbRYyuvf7A","7fsYMtvdkD","AmdQd6q6L9","14FLRtuDyS","Twano9XyT9",
+"0YAGH0Wr5y","3weIFatef2","I7p2aHP433","JXljWblLA9","vkCHHMm8si","J2mQi16lHc","Rxrsm5iGN5","VNCPdmX2GE","uLtKsJXljW","9iGoTBbwgA",
+"ZJTXHU3yw5","Mkgy8suY4x","9rlg9suY4x","vLsmS4dEz6","In3NSt59lR","POUYSxXTI4","fcwDaX6Pin","JIqXiQbxXc","HP433NhXdu","OxWIHjSjS3",
+"QYxC0EOE1o","55rfBNhXdu","7ku1pni2v1","fFDrJCxVEf","iKqhrCp3mZ","BpYhVMK07Y","uPX7GLbRTH","G1RhSHP433","oGu6xuJScX","RACujyEfy9",
+"KASQ85VZjS","jtn0XnnP8o","GWqqX580YD","9y4lw1LB1L","OHaBz14FLR","VjCZqYh1hF","jS1ajt59lR","F6PT2SbRYy","rz7UtYh1hF","TwanogjUTu",
+"CdyBVa00b5","RsQUqP6bcg","JJs5mSs0Zu","YjB9tOz8yZ","MK07Y9GXkX","JIqXia00b5","m4bxUK4GS8","F6PT2brhlQ","iB08lW3VFH","0KyfsDQimp",
+"gtCA5Qworu","SmGzvU3yw5","JXljWnFqik","QssNCt59lR","5IhmGx3LDe","iKqhrFwEJz","8TxD7MaJQs","taOXKgdQsS","GXdoHmz8gx","PYBf4aDGtS",
+"07n1clCMxy","VIlwPaFFss","rhl0JQ6Lix","GSQwjKZamH","bZLvSkB5nP","NhXdue6e4z","5Mg9ryvOMI","55rfBSjskQ","hi5X7uJScX","aFFssdpe1v",
+"NcICAjSjS3","MK07Yix74r","IBe8kcL0aE","yofH3suY4x","rhl0JCdyBV","EdBKc1LB1L","sqVrfChuy3","P6bcgRpBQm","5nmWvuN6r3","1j5L85iGN5",
+"AOgEeGrDg7","iKqhrZUnqt","jfREuLbRTH","WDVWJ7fsYM","Twanox3LDe","cmXIXQbxXc","ZhwG1QbxXc","In3NS9GXkX","cQOnvv1Hln","v1HlnjfREu",
+"uQIczjeskS","FNYIMZhwG1","HlUbFBbwgA","okgRiZv7z0","dQ586s7Mxk","uLtKsX6Pin","7lUXZxciqp","Z4I1vs4786","WPmlxlViBv","MK07YEOE1o",
+"0MR5XnlaBy","IKxdLfqypy","lViBv8cVD3","iB08lblLA9","FGzgpDz1R3","UlU3Mtl72W","gdQsStaOXK","cmXIXRzaZA","TwanotvdkD","BpYhVfFDrJ",
+"FxX9qpFrrl","uoStw2hEEU","G1RhSIn3NS","QssNCMojnP","guMb8lViBv","Yh1hFo8Uyd","pWiOsG1RhS","IRh48prNT6","NOHszBFkb8","RpBQmpWiOs",
+"16lHcuPX7G","J2mQinnP8o","lj07QzqH0W","NOHszxReec","a00b5ni2v1","pvgjSKsjRK","GSQwjBpYhV","uAWypiwzGk","POUYS14FLR","VerEA14FLR",
+"jS1aj0PktI","xXTI4GXdoH","MaJQs4dEz6","FPfSE9rlg9","DQimplkMUA","WreyP5drc6","RACujU3yw5","cmXIXt59lR","hYBCKVjCZq","9eoRckZANm",
+"yluBxulk41","vOqCE9XyT9","t98iWMojnP","lXFOBQ6hMC","P6bcgHRxd8","64s8NcShY2","FVMxoM6qcG","Oz8yZru4UG","lViBvcShY2","4QMc9uvf7A",
+"ZJTXH9XyT9","yEfy9VerEA","cL0aEDcpWB","0Wr5yBGaQY","KsjRKo8Uyd","9XyT9yToGW","Mm8sis7Mxk","55rfB8xEKz","oGu6xRmDcr","hi5X7xXTI4",
+"J2mQiEoToP","zmLYDIRh48","Mkgy8yToGW","HlUbFCp3mZ","dhSuH5Namm","GSQwjv8yFN","Ul4a1Ss0Zu","BFkb8CNHmv","pv0i7JIqXi","MaJQslXFOB",
+"tAOsrpWiOs","d7vjMCp3mZ","bgJAzmX2GE","NhXdufcJOy","uJScXQ6Lix","zqH0W8TxD7","9XyT9BGaQY","K4GS80YAGH","l83Udlm0pD","hUTw7Zv7z0",
+"JkzUn0h1b1","LewvMUmaEv","fmIK116lHc","zmLYDlXFOB","nlaByWaim6","5NammAgJHQ","yToGWpv0i7","zHF1qdQ586","GSQwjO3iyQ","MGlTFGSQwj",
+"M6qcGMm8si","gjUTuNcICA","t59lRzY1GY","uTacx6q6L9","uAWyphe9IA","FwEJzQChxs","P6bcg4dEz6","QWxoTPYBf4","2DREsjzUqR","BGaQYiwzGk",
+"OUYuFtuDyS","No0Qb14FLR","x3LDeZuDtD","PYBf48TxD7","8RCUAkB5nP","fLNg8iqv4k","atef2lj07Q","AXpwENOHsz","pWiOsPYBf4","9GXkXoVQp6",
+"NAFuwJ2mQi","FwEJzP6bcg","uupzkhUTw7","jS1ajJ2mQi","7lUXZ0MR5X","jiVBPCxVEf","I7p2a5Namm","vkCHHIBe8k","dhSuHTXQ0Z","uJScXEOE1o",
+"Pb1pa07n1c","zQt6QpT8wu","Uvlv4RACuj","fqypyVIlwP","Ta8f6FnPFB","HzZT8pv0i7","s93Ml8RCUA","POUYSn1pmO","i7WMQFFDui","ZJTXHt59lR",
+"cL0aEUmaEv","tuDySt59lR","QbxXcxReec","VNCPdNcICA","7Ow5CZhwG1","ciuWzwDajX","2DREseuZA5","jzUqRIKxdL","StlDJOxWIH","S77LHzHF1q",
+"UlU3MPb1pa","DQimpQClRL","h1zcHtlILt","ciuWzCNHmv","yToGWoQ87r","Y1mC0x3LDe","suY4x7lUXZ","7hyVvVBjhz","QYxC0NOHsz","tjQxsni2v1",
+"ZJTXHpmeCd","HlUbFuoStw","QClRLKASQ8","3weIFWreyP","nFqikyofH3","NOHszVIlwP","NAFuwxReec","ksJby2Yz7E","ix74rv1Hln","HzZT8s7Mxk",
+"v1HlnCxVEf","No0Qbpv0i7","pWiOs8xEKz","5nmWvWMiS3","m4bxUWmadA","uoStwaL6AJ","C2Irc07n1c","mz8gxiKqhr","FVMxohe9IA","8cVD3JXljW",
+"s93MlfaHir","CxVEfs93Ml","GWqqXlweGy","RzaZAJkzUn","sx5GljSjS3","W7cTsQ6hMC","gtCA5s93Ml","8U2nUAIYUu","nlaBy0ao3l","Mkgy8okgRi",
+"C2IrcZzJHW","WMiS3WmadA","cmXIXfcwDa","fLNg8Twano","NhXdufLNg8","StlDJjS1aj","IKxdL7fsYM","J2mQiFPfSE","blLA9IjTwP","kZANmX6Pin",
+"guMb8sx5Gl","Yh1hFpT8wu","WmadAjSjS3","xReecyvOMI","cShY2KsjRK","VjCZq5Drn0","Pb1paECMvU","cShY248cHL","jfREuEoToP","lkMUA16lHc",
+"Ss0Zu0PktI","LDk6fLDk6f","cShY22ZHdk","48cHLlCMxy","JXljWYf2Ec","16lHcqUJMd","VNCPdS2Dfu","i3pydWreyP","VLTy6W7cTs","MK07YYh1hF",
+"9GXkX3weIF","tvdkD2DREs","mX2GEBbwgA","zmLYDIKxdL","zqH0WWMiS3","Cfgr39eoRc","pT8wuW7cTs","7fKYUQbxXc","tuDySd85a9","OxWIHAmdQd",
+"vOqCEuupzk","EOE1ouLtKs","W7cTsWaWsv","Pb1patjQxs","dhSuHCfgr3","5Drn0M6qcG","bZLvSQbxXc","X6PinBpYhV","rz7UtCxVEf","euZA58RCUA",
+"qaofNBFkb8","In3NSOxWIH","QbxXc14FLR","FxX9qaez9y","8xEKznlaBy","ciuWz45cIH","lCMxynlaBy","MmsIofcwDa","0Wr5yBpYhV","pWiOsOUqFM",
+"VLTy6MGlTF","AmdQdPYBf4","gIYvE8U2nU","dpe1vmz8gx","0BmCypFrrl","BbwgARBhp0","9GXkXJIqXi","fmIK1zmLYD","gIYvE5VZjS","n8pJ9b29RJ",
+"Cp3mZRBhp0","VjCZq1LB1L","CK5W7tvdkD","FLsphciuWz","qUJMdlsQGo","D6rByJIqXi","lsQGoKASQ8","iwzGkfaHir","6q6L9W3VFH","aez9y7lUXZ",
+"okgRiZJTXH","0h1b10MR5X","lweGyuN6r3","VjCZqBpYhV","7Ow5ChE1Ql","DQimpv8yFN","FjHXRuAWyp","K20wKuN6r3","4QMc9X6Pin","Mkgy807n1c",
+"fFDrJChuy3","ydG8UhYBCK","BGaQYGXdoH","ThjNn580YD","Zv7z0zHF1q","FxX9qD6rBy","HzZT8K20wK","ydG8URxrsm","iKqhrs4786","IKxdLEdBKc",
+"AIYUu0Wr5y","nFqik0BmCy","ThjNnWaim6","KsjRKMmKGJ","No0QbQ6Lix","t59lRAXpwE","d85a9AgJHQ","pmeCdwiHrZ","3weIFCqqaD","G1RhSTwano",
+"C2IrcK4GS8","Cp3mZHlUbF","pv0i7Ul4a1","In3NSJKWYR","HfyNQe6e4z","azIWpPYBf4","i7WMQhUTw7","UmaEvCfgr3","MezSWFNYIM","zqH0W5Mg9r",
+"14FLRAIYUu","YOfrYqQxHP","lj07QHP433","gIYvEP6bcg","ZhwG1qQxHP","NAFuwlj07Q","fcwDa5Mg9r","gtCA5RkQke","ni2v16AFT0","W7cTsogLgc",
+"uupzkAOgEe","FwEJzaDGtS","CIShGhSSvQ","SmGzvK20wK","tl72Wy94nw","okgRiNhXdu","MmsIoX6Pin","1v5hHhUTw7","x3LDeFjHXR","iqv4kGrDg7",
+"v1HlnAgJHQ","5nmWvbZLvS","AgJHQFcWrW","zmLYDFhtgl","YOfrYd85a9","VIlwPQbxXc","QWxoTtuDyS","IKxdLtl72W","RpBQmgIYvE","lsQGod85a9",
+"guMb83otm6","QbxXcMGlTF","HRxd8WMiS3","hE1QlSmGzv","U3yw5guMb8","nFqik4W0Tl","sx5GlGSQwj","yEfy9BFkb8","jSjS3NAFuw","tAOsrFcWrW",
+"tAOsrZv7z0","7Ow5Ci7WMQ","XflUqni2v1","FPfSE6q6L9","LewvMRxrsm","ZhwG14W0Tl","07n1cEoToP","iKqhrhUTw7","Yh1hFNAFuw","AOgEet98iW",
+"aL6AJuTacx","guMb8s93Ml","WmadAuvf7A","4dEz6AmdQd","S77LHD6rBy","vkCHHsoy9t","RpBQm3otm6","hi5X7Fhtgl","rz7UtWmadA","jiVBPOHaBz",
+"faHirYh1hF","5VZjSgjUTu","FxX9qni2v1","n1pmO29QAz","nnP8oHzZT8","iB08lNcICA","ZzJHWSjskQ","nnP8os4786","1LB1LpT8wu","D6rBypFrrl",
+"7fsYMe6e4z","xReecuAWyp","yEfy9mX2GE","nnP8oP6bcg","Yh1hFk85Ae","lm0pDuvf7A","WaWsv6AFT0","FFDuiuoStw","t59lRF6PT2","ZuDtDFwEJz",
+"lCMxyh1zcH","fqypyJJs5m","vOqCEjiVBP","Fhtgltl72W","pWiOsWMiS3","IBe8kBpYhV","qaofNZ4I1v","KZamHOz8yZ","JRJQBJkzUn","Chuy3zFgtB",
+"UmaEvFxX9q","Pb1paBbwgA","djsrvFFDui","gdQsSyEfy9","5IhmGZzJHW","FFDuipmeCd","MK07Yd85a9","Chuy3ZhwG1","uN6r3MezSW","AmdQdni2v1",
+"kB5nPjS1aj","0MR5XFFDui","5NammMkgy8","wDajXDz1R3","9GXkXMmsIo","16lHcXyPZN","RACujFjHXR","uLtKsgIYvE","jzUqRAXpwE","FPfSEru4UG",
+"sqVrfzmLYD","qQxHPO3iyQ","gf8rI9XyT9","FNYIMFPfSE","Mm8siHP433","sx5GlfLNg8","fFDrJCK5W7","BpYhV2Yz7E","4QMc9G1RhS","qQxHPMezSW",
+"FGzgpokgRi","U3yw5AIYUu","BCxeCJkzUn","DG4sTcShY2","zFgtB0YAGH","AmdQdx3LDe","DQimpFPfSE","x3LDeMK07Y","CNHmvmX2GE","uTacxTXQ0Z",
+"azIWpRkQke","FPfSEqQxHP","KZamHW3VFH","cShY2ogLgc","MojnP9eoRc","zFgtBDG4sT","dQ5865VZjS","8hJdtbZLvS","zbIYYHP433","LDk6fzmLYD",
+"HRxd8zmLYD","VjCZqF6PT2","RzaZA2DREs","zz4ZUv2eC3","Q6hMC64s8N","CqqaDbrhlQ","DcpWBtAOsr","Ss0Zumz8gx","FPfSEjtn0X","L7cGc2TRI7",
+"Dz1R3atef2","RkQkeSbRYy","Dz1R3DcpWB","IKxdLeuZA5","CNHmve6e4z","MmKGJGXdoH","yEfy9hSSvQ","azIWpuN6r3","yEfy9VIlwP","3weIF16lHc",
+"GSQwj9y4lw","EOE1od85a9","BbwgAuJScX","Mm8siGWqqX","Q6hMCcmXIX","Zv7z0pFrrl","yToGW9y4lw","t98iWrz7Ut","uZPqgQ6Lix","16lHctlILt",
+"POUYSBFkb8","uoStwBCxeC","8TxD7MmsIo","EoToPBbwgA","5nmWvI7p2a","XflUqRmDcr","4QMc9WDVWJ","fcwDaQChxs","rKDLJtvdkD","LbRTHuvf7A",
+"lH1ktvkCHH","U3yw55VZjS","5VZjS9eoRc","he9IAtlILt","ZhwG10PktI","he9IA7fsYM","9y4lw8FmFH","uupzkhYBCK","okgRib29RJ","m4bxUydG8U",
+"n8pJ9piJSk","5drc6UmaEv","uN6r3Ss0Zu","rKDLJb29RJ","lXFOB1j5L8","UmaEv2Yz7E","bgJAz3otm6","iwzGkK4GS8","VBjhz618Di","e6e4zzmLYD",
+"8FmFHuPX7G","X6PinTCgPp","xReecTCgPp","OUqFMAIYUu","6q6L9v8yFN","vLsmSVjCZq","S2DfuJKWYR","fmIK1uoStw","b29RJlkMUA","rz7Utpv0i7",
+"8FmFH5nmWv","MezSW7hyVv","NOHszjS1aj","oVQp6lweGy","OHaBzHP433","5drc6SWfou","cQOnv7fsYM","7ku1ppvgjS","ru4UGPYBf4","0MR5XAIYUu",
+"bZLvSAXpwE","MmKGJ0Kyfs","pAhR1LDk6f","24ARFEOE1o","MaJQsuAWyp","k85AeuAWyp","QssNCvLsmS","tl72WYjB9t","OxWIHlm0pD","pv0i7zFgtB",
+"uN6r3Z4I1v","atef2WmadA","VNCPd5iGN5","xciqpni2v1","IKxdLtvdkD","Chuy3QWxoT","JKWYRK4GS8","uAWypyEfy9","XflUq4W0Tl","8RCUAt98iW",
+"SWfou8TxD7","ZUnqtKASQ8","WPmlxlsQGo","ZuDtDn1pmO","UlU3MP6bcg","4QMc9x3LDe","lCMxy0h1b1","JRJQBkZANm","I7p2aGSQwj","fFDrJ5Drn0",
+"VIlwPuAWyp","OxWIHOUqFM","AOgEed85a9","UmaEvI7p2a","K20wKL7cGc","uLtKs0MR5X","29QAziwzGk","07n1cVIlwP","7fsYMBCxeC","7hyVv2ZHdk",
+"I7p2aNAFuw","DG4sTYh1hF","Vprf2zY1GY","Y1mC0d85a9","ciuWzU3yw5","iB08lRsQUq","gtCA51j5L8","2TRI77hyVv","uoStwnnP8o","0PktIMmsIo",
+"vLsmSCfgr3","WMiS3NhXdu","SbRYyuAWyp","dmoS7qQxHP","Waim6zmLYD","pAhR1nFqik","No0Qb0MR5X","SWfouEdBKc","IjTwPCp3mZ","ksJby580YD",
+"OxWIHDG4sT","FxX9qjtn0X","GXdoH618Di","1LB1LSmGzv","Yw2oUfcwDa","9y4lwjfREu","8FmFHLbRTH","8hJdtJRJQB","J2mQiVprf2","JXljWQ6Lix",
+"AmdQdi7WMQ","JkzUnydG8U","uvf7AokgRi","S77LH29QAz","pvgjSGrDg7","rz7UtOHaBz","jS1aj4QMc9","uZPqgReKEW","MezSWaL6AJ","Dz1R3Ss0Zu",
+"Yw2oUfmIK1","HfyNQ618Di","HlUbFprNT6","Ss0ZuHzZT8","NAFuwHlUbF","FwEJzD6rBy","MmKGJy94nw","d85a9LDk6f","M3zXL2DREs","pFrrl1v5hH",
+"Cp3mZuN6r3","0MR5XSWfou","vkCHH4W0Tl","rKDLJVBjhz","HP433s7Mxk","BGaQYIRh48","L7cGcv2eC3","gf8rIgdQsS","CNHmvAgJHQ","QbxXcCdyBV",
+"bgJAzSmGzv","nlaByrhl0J","cL0aEfFDrJ","PYBf4TCgPp","rKDLJi3pyd","0KyfsNcICA","8xEKzPYBf4","soy9t2Yz7E","vLsmSn8pJ9","RACujm4bxU",
+"JJs5mguMb8","4W0TlQworu","HzZT82TRI7","n8pJ9Gv3Fq","U3yw5gIYvE","lpF6WlweGy","o8Uyd8U2nU","lpF6Wn1pmO","oQ87rJXljW","PYBf45Mg9r",
+"zQt6Q5nmWv","pT8wuaFFss","ni2v1mX2GE","9rlg9BFkb8","v8yFNuPX7G","QnJ1SVerEA","K20wKzqH0W","QWxoTqUJMd","618Di8U2nU","ThjNnGv3Fq",
+"MGlTFUl4a1","PYBf4oQ87r","l83UdPb1pa","iB08lIjTwP","K4GS8DQimp","taOXKsuY4x","MK07YZhwG1","xReecSbRYy","GXdoHs4786","tuDySlm0pD",
+"48cHLY1mC0","7hyVvNcICA","5iGN5JJs5m","uN6r3FLsph","5Drn06q6L9","fqypypmeCd","BFkb8lH1kt","8RCUAgf8rI","4W0TlDz1R3","9iGoTni2v1",
+"D6rByfLNg8","W7cTsYjB9t","RACujokgRi","tvdkDXflUq","Mkgy8Uvlv4","MK07Ya00b5","zY1GYzqH0W","jSjS3bgJAz","29QAzVprf2","jtn0XYjB9t",
+"gtCA5WPmlx","5IhmG5VZjS","lpF6WUl4a1","tl72WzqH0W","FnPFBDG4sT","RkQkejfREu","FLsphCfgr3","tvdkDlCMxy","bgJAz8RCUA","Yf2EciwzGk",
+"GrDg7ReKEW","cShY2POUYS","ReKEWGWqqX","8FmFH7fKYU","fLNg8HlUbF","Y1mC0Waim6","DLhzMFjHXR","aFFss07n1c","dhSuHFVMxo","S2DfuCp3mZ",
+"oVQp6O3iyQ","wiHrZJKWYR","iqv4kFnPFB","VLTy6zbIYY","FLsphqQxHP","HRxd824ARF","In3NSlpF6W","uZPqg07n1c","uAWypWMiS3","C2IrcdQ586",
+"sx5GlXflUq","55rfBAmdQd","d7vjMcShY2","lXFOB8TxD7","0KyfsfcJOy","CK5W7HzZT8","D6rByVIlwP","9GXkX8xEKz","brhlQFLsph","5nmWv8TxD7",
+"618DiuPX7G","prNT60BmCy","tuDySe6e4z","gtCA55Namm","S77LHDG4sT","5drc6RkQke","djsrv7Ow5C","QWxoTuTacx","0YAGHciuWz","GWqqXM6qcG",
+"FNYIMHfyNQ","lkMUAAIYUu","4QMc9StlDJ","AgJHQzQt6Q","nFqik7fKYU","WreyPwiHrZ","8U2nUzqH0W","FjHXRs93Ml","ru4UGFhtgl","2TRI7hi5X7",
+"QnJ1S07n1c","bgJAzDQimp","JIqXiogLgc","Cp3mZXflUq","RpBQm5iGN5","gjUTu9eoRc","W3VFHzHF1q","8U2nU7Ow5C","0PktIn1pmO","RpBQmNo0Qb",
+"BGaQYo8Uyd","0Wr5yOHaBz","uoStw5iGN5","5Namm7fKYU","gjUTumX2GE","L7cGcBGaQY","ciuWzzY1GY","J2mQiFnPFB","Fhtgl5ZaEz","KZamHSjskQ",
+"uAWyp5Drn0","fcwDaPOUYS","mX2GELbRTH","tvdkDUmaEv","RxrsmDQimp","7X3uyuupzk","5IhmGMmKGJ","XflUqlViBv","7fKYUjeskS","ciuWzJJs5m",
+"kZANmF6PT2","4QMc90ao3l","ru4UGVerEA","Gv3FqCdyBV","4dEz6hSSvQ","v8yFNZ4I1v","pvgjSMaJQs","2NslmS77LH","8xEKziKqhr","ZuDtDFPfSE",
+"okgRiCp3mZ","C2IrcCNHmv","gjUTuBGaQY","d7vjMFGzgp","n8pJ9JIqXi","9iGoTBGaQY","CqqaDv2eC3","Kr8ys48cHL","HP4336q6L9","RBhp00YAGH",
+"uoStwS77LH","1v5hHdpe1v","oVQp60Kyfs","3otm6rz7Ut","QClRL7ku1p","HzZT8tjQxs","tjQxs7lUXZ","fqypy5VZjS","BCxeCcmXIX","AXpwEjiVBP",
+"D6rBybgJAz","NOHsz8TxD7","Dz1R3UmaEv","OUqFMFnPFB","C2IrcYf2Ec","MGlTFVjCZq","lsQGorKDLJ","RpBQmS2Dfu","LbRTHGSQwj","ThjNnTXQ0Z",
+"I7p2aciuWz","TXQ0ZFNYIM","4QMc9faHir","NcICAgf8rI","F6PT2jeskS","he9IAbZLvS","POUYSU3yw5","YjB9teuZA5","F6PT2lXFOB","48cHLzz4ZU",
+"hSSvQCp3mZ","fcJOyNxx9V","AIYUuWreyP","mX2GEWaim6","AXpwEo8Uyd","HP433P6bcg","24ARFs4786","hYBCKGrDg7","Uvlv48xEKz","48cHLzqH0W",
+"EOE1odmoS7","RsQUq7lUXZ","jzUqR0PktI","RBhp0sqVrf","14FLREdBKc","t59lRpWiOs","48cHLWreyP","zqH0Wlj07Q","6AFT0vOqCE","wDajXpT8wu",
+"lkMUAFcWrW","guMb8ZzJHW","uN6r3ZUnqt","blLA9euZA5","zFgtBOUYuF","K4GS89eoRc","UmaEvPYBf4","FhtglfaHir","n1pmOCqqaD","2TRI7iwzGk",
+"Q6LixLbRTH","suY4x0Kyfs","zqH0Wi7WMQ","45cIH7lUXZ","zQt6QRxrsm","P6bcgk85Ae","MmKGJrhl0J","zFgtBECMvU","yvOMIuTacx","Vprf2OUYuF",
+"LDk6fThjNn","Cp3mZM6qcG","7hyVvOHaBz","uupzkpmeCd","55rfBBGaQY","mX2GEogLgc","WMiS3zbIYY","BCxeCVNCPd","OHaBzJRJQB","gdQsStvdkD",
+"MmKGJgjUTu","Oz8yZtaOXK","Zv7z0piJSk","2NslmThjNn","YOfrYl83Ud","NOHszM3zXL","gtCA5uupzk","rz7Ut0MR5X","Nxx9VUvlv4","ZzJHWfmIK1",
+"prNT6sx5Gl","o8UydprNT6","VIlwPUvlv4","580YDZv7z0","fqypyFNYIM","RpBQmTwano","uoStwCK5W7","vkCHHMkgy8","ni2v145cIH","WreyPoGu6x",
+"PYBf4P6bcg","m4bxUPb1pa","7Ow5CjzUqR","8cVD3GXdoH","xReecDz1R3","5NammnnP8o","TXQ0ZReKEW","5Mg9rCIShG","MGlTFru4UG","AIYUujfREu",
+"5ZaEzS77LH","MojnPlj07Q","KZamHLewvM","HlUbFFNYIM","RsQUqbZLvS","hi5X7NcICA","OxWIHtuDyS","aFFssogLgc","cL0aEOz8yZ","RsQUqb29RJ",
+"Pb1pai3pyd","jfREuXyPZN","s7Mxkn8pJ9","lweGy14FLR","taOXKKZamH","6AFT0atef2","CxVEfLDk6f","CdyBVD6rBy","POUYS8hJdt","azIWpUlU3M",
+"zz4ZUWDVWJ","EoToPVNCPd","S77LHGXdoH","1LB1LRzaZA","djsrv8xEKz","WreyPcmXIX","8cVD3oVQp6","h1zcHSmGzv","9GXkXlkMUA","UmaEvuN6r3",
+"uoStwP6bcg","jtn0XlsQGo","In3NS4QMc9","EOE1oY1mC0","FjHXRdpe1v","zQt6Qn1pmO","EoToPRACuj","t98iWe6e4z","fcJOyzqH0W","NhXdut59lR",
+"tuDySjeskS","pT8wuFNYIM","IKxdLni2v1","RxrsmYOfrY","MaJQsD6rBy","dpe1v6AFT0","EOE1o1j5L8","GWqqXECMvU","RBhp0P6bcg","VIlwP07n1c",
+"zHF1qCqqaD","y94nwYf2Ec","lm0pDLewvM","16lHcpT8wu","0h1b1TXQ0Z","pT8wusqVrf","VBjhzRkQke","aez9y2Nslm","b29RJOxWIH","zQt6Qx3LDe",
+"fcwDaBpYhV","LDk6fJkzUn","fcwDaY1mC0","Mm8siD6rBy","zqH0WxReec","qaofNMK07Y","Vprf2Chuy3","618DiRpBQm","ThjNnKASQ8","VIlwPhE1Ql",
+"GrDg7euZA5","ZUnqtQWxoT","S77LHS2Dfu","CIShGn1pmO","GSQwjlkMUA","Q6hMC5iGN5","Kr8ysoQ87r","7lUXZCIShG","oGu6xv2eC3","Uvlv48cVD3",
+"nnP8ofcJOy","JRJQB0PktI","FVMxociuWz","FhtglKASQ8","dmoS7lCMxy","FnPFBuJScX","6q6L9a00b5","5iGN5MezSW","TXQ0ZoVQp6","a00b5zz4ZU",
+"J2mQifaHir","yofH38xEKz","wDajXOUYuF","AkKTkulk41","dpe1vXflUq","D6rBy9XyT9","ZJTXHOxWIH","tjQxsWreyP","VBjhzjtn0X","zbIYYAgJHQ",
+"tl72WIRh48","BbwgAMaJQs","VjCZqoVQp6","s4786QClRL","K20wKmX2GE","gf8rIY1mC0","FPfSEZ4I1v","WmadA29QAz","Dz1R3kB5nP","atef2gjUTu",
+"DG4sT7X3uy","3weIFuTacx","5drc6U3yw5","2Yz7EBbwgA","nlaByVNCPd","uJScXW7cTs","uJScXUlU3M","UlU3M8xEKz","zmLYDksJby","5Drn0FcWrW",
+"lH1ktpmeCd","wiHrZlj07Q","Yw2oUFhtgl","WPmlxd7vjM","nnP8o5IhmG","nnP8oFwEJz","o8UydDcpWB","uTacxm4bxU","S2Dfu0Wr5y","JJs5mlpF6W",
+"d85a9ogLgc","CqqaDtl72W","ZzJHWEOE1o","WreyPXyPZN","ix74rru4UG","lpF6WqQxHP","Cfgr3AOgEe","7lUXZQworu","0ao3lXyPZN","dhSuHaL6AJ",
+"VjCZqguMb8","kZANmiB08l","tlILtDG4sT","IRh48fqypy","uQIczW7cTs","zY1GYe6e4z","s7MxkL7cGc","atef22Nslm","EOE1o8RCUA","Vprf2PYBf4",
+"lm0pDQ6hMC","yEfy9MK07Y","BbwgAuvf7A","BpYhVl83Ud","FPfSEKASQ8","bgJAzFLsph","tAOsrqaofN","24ARFX6Pin","zQt6QfaHir","rz7UtprNT6",
+"FwEJzgdQsS","i7WMQhSSvQ","CK5W7Nxx9V","L7cGcNOHsz","lj07Q0BmCy","jtn0XeuZA5","zqH0WSbRYy","7fKYUWaim6","7lUXZ7fsYM","yofH3s93Ml",
+"MezSWThjNn","Q6LixPOUYS","s4786lj07Q","OUqFMqaofN","lCMxydQ586","gdQsSDcpWB","QnJ1SFNYIM","tlILtOxWIH","aFFssDQimp","pAhR1faHir",
+"Nxx9Vtl72W","K4GS8No0Qb","fcwDaAIYUu","n1pmOFPfSE","bZLvSsx5Gl","dQ58645cIH","lj07Qrz7Ut","dhSuH7ku1p","0MR5Xni2v1","TXQ0ZWMiS3",
+"7fsYM1j5L8","jSjS3Zv7z0","lj07QIBe8k","J2mQipmeCd","kB5nPs93Ml","YOfrYtvdkD","oVQp6QWxoT","xReec618Di","EOE1oKr8ys","WPmlxUmaEv",
+"hi5X7KsjRK","h1zcHvLsmS","CdyBVFPfSE","KZamHuQIcz","l83UdQnJ1S","n1pmOVerEA","S2DfuTa8f6","FFDuiuPX7G","29QAzm4bxU","jiVBPtaOXK",
+"7ku1pjzUqR","Kr8yse6e4z","Yh1hFaL6AJ","OHaBzdhSuH","gjUTuMmKGJ","580YDLbRTH","MGlTFWPmlx","OHaBzVIlwP","aFFssk85Ae","3otm6aez9y",
+"QWxoT5drc6","Nxx9VOHaBz","h1zcHTa8f6","8U2nUGWqqX","lXFOBs93Ml","ni2v1mz8gx","rKDLJ5VZjS","LewvMBFkb8","vkCHHReKEW","sx5GlVIlwP",
+"Uvlv4L7cGc","yvOMI14FLR","WreyPNxx9V","sx5GlpFrrl","0PktITXQ0Z","AXpwEuN6r3","VLTy61LB1L","guMb85Mg9r","yEfy9t59lR","IBe8kCfgr3",
+"piJSk48cHL","gjUTuVjCZq","580YDsuY4x","oQ87rCqqaD","ru4UG45cIH","pmeCdpv0i7","xciqpgIYvE","rhl0JokgRi","14FLRFNYIM","Chuy3ru4UG",
+"aFFssFVMxo","Q6hMCWreyP","29QAzzY1GY","HP433gtCA5","7lUXZgtCA5","fLNg8FxX9q","OHaBzM6qcG","RsQUqKZamH","SjskQQWxoT","ru4UG0Kyfs",
+"RBhp05VZjS","dmoS7fcwDa","SjskQlCMxy","yToGWGWqqX","YjB9tk85Ae","EoToPtl72W","QbxXcuTacx","sqVrf5Mg9r","faHirGrDg7","uN6r3RkQke",
+"jS1ajksJby","WMiS3NOHsz","hE1QlRkQke","lpF6WNhXdu","48cHL0PktI","kB5nPFhtgl","AIYUuBGaQY","W7cTslH1kt","zmLYDQnJ1S","7X3uyRxrsm",
+"1j5L8NOHsz","8cVD3IjTwP","0YAGHECMvU","Oz8yZYw2oU","B3qemd85a9","16lHcAOgEe","1LB1LlkMUA","pvgjSpiJSk","pAhR17fsYM","GWqqXFnPFB",
+"9y4lwi3pyd","9iGoTG1RhS","FnPFB29QAz","Gv3FqqaofN","X6PinSjskQ","v2eC3lweGy","F6PT2MezSW","FwEJz48cHL","gIYvERxrsm","SjskQjfREu",
+"SbRYyU3yw5","UmaEvXyPZN","VNCPdRsQUq","VerEASWfou","hi5X7PYBf4","mX2GErKDLJ","qQxHPYw2oU","s93MlQ6Lix","X6PinKsjRK","3otm6hUTw7",
+"LDk6f0YAGH","RmDcr4dEz6","m4bxU1LB1L","UlU3MuTacx","b29RJpT8wu","uoStwdhSuH","AgJHQLbRTH","7ku1paez9y","uvf7ARACuj","64s8NLewvM",
+"jzUqReuZA5","NcICANOHsz","kB5nPDQimp","x3LDeChuy3","ZhwG1uupzk","BFkb8o8Uyd","h1zcH4dEz6","aL6AJhi5X7","4QMc9CIShG","Cp3mZwDajX",
+"MK07YyofH3","fqypy4QMc9","fcwDalpF6W","W7cTsWPmlx","uAWyp0PktI","v2eC3Y1mC0","5ZaEz07n1c","taOXKlj07Q","CK5W7hSSvQ","uN6r3uAWyp",
+"jiVBPL7cGc","ZJTXHRACuj","pAhR1Ta8f6","GrDg7XyPZN","OHaBzFhtgl","DcpWB6AFT0","iwzGk07n1c","MK07YlXFOB","F6PT2In3NS","RACujDQimp",
+"X6PinEoToP","AXpwEdhSuH","24ARFFhtgl","VIlwP2hEEU","bgJAzTCgPp","zqH0Wtl72W","K20wKQnJ1S","MK07YlViBv","Pb1pazHF1q","0BmCy29QAz",
+"tvdkDuJScX","ix74rRkQke","SjskQcL0aE","CNHmvsuY4x","CqqaDVBjhz","ZuDtDFVMxo","JJs5m0YAGH","In3NS9iGoT","BpYhVWmadA","m4bxUS77LH",
+"i3pydiqv4k","CqqaDW7cTs","l83Udfqypy","0ao3ljeskS","uvf7Av8yFN","iwzGkJKWYR","mX2GENOHsz","Mkgy8hYBCK","ThjNnsx5Gl","NhXdudmoS7",
+"uvf7Ak85Ae","KsjRK29QAz","5Namm7fsYM","SWfouhE1Ql","QYxC0hUTw7","GXdoHpAhR1","uJScXFnPFB","brhlQ55rfB","h1zcHm4bxU","dhSuHCdyBV",
+"FcWrW3weIF","QssNCyofH3","GSQwjVprf2","Y1mC05Mg9r","n1pmO618Di","v2eC3uPX7G","WaWsvSmGzv","4W0Tl24ARF","lH1ktbrhlQ","h1zcHOz8yZ",
+"NhXdui3pyd","SjskQ5VZjS","zmLYDdjsrv","soy9tyvOMI","rKDLJ7fKYU","Chuy3oVQp6","ni2v1aFFss","Pb1pa2Nslm","618DivLsmS","taOXK8FmFH",
+"brhlQhUTw7","8U2nUNAFuw","Ss0ZuDcpWB","QbxXcB3qem","QnJ1S3weIF","qaofNjzUqR","BbwgACqqaD","BbwgAfmIK1","BbwgAQClRL","W7cTsgtCA5",
+"iqv4kuupzk","uPX7G8U2nU","VerEAFwEJz","QClRLMm8si","v1HlnlCMxy","taOXKFnPFB","CNHmv0ao3l","VNCPdsoy9t","5Mg9ruvf7A","lkMUAokgRi",
+"S2DfuFnPFB","hSSvQAgJHQ","5drc6bgJAz","he9IA1v5hH","ydG8U24ARF","lH1ktgIYvE","QChxsgdQsS","Nxx9VD6rBy","F6PT2Yh1hF","W7cTsF6PT2",
+"64s8NQssNC","BGaQYtlILt","pv0i7BCxeC","QworuCqqaD","BpYhVzqH0W","5Mg9rVBjhz","zqH0WfLNg8","JJs5mzqH0W","wDajXX6Pin","FGzgpoQ87r",
+"CK5W7StlDJ","WDVWJD6rBy","CK5W7hUTw7","55rfB7X3uy","jiVBP8FmFH","7lUXZLbRTH","dpe1vkB5nP","EdBKcLewvM","lm0pDHzZT8","lH1ktm4bxU",
+"iwzGkHfyNQ","uQIczfLNg8","2DREsECMvU","uAWypaez9y","HP433W3VFH","O3iyQFhtgl","lCMxypiJSk","FVMxoFcWrW","hSSvQguMb8","2ZHdkUlU3M",
+"8TxD75ZaEz","zmLYDHlUbF","VjCZqhE1Ql","MmKGJmX2GE","i3pyd0Wr5y","NhXduDz1R3","uPX7GoGu6x","0Wr5y24ARF","W3VFHv1Hln","VLTy6qaofN",
+"U3yw5NAFuw","M6qcGX6Pin","JIqXiRzaZA","HfyNQatef2","zHF1q9rlg9","8U2nUIKxdL","qaofN7X3uy","5Mg9rRzaZA","9eoRc7Ow5C","Chuy3W7cTs",
+"b29RJlsQGo","uLtKsQ6hMC","48cHLD6rBy","Chuy3W3VFH","lm0pDgtCA5","ciuWzmX2GE","9rlg9EoToP","v2eC314FLR","jS1ajQnJ1S","JJs5mCNHmv",
+"2DREsCqqaD","uN6r3VNCPd","l83Udd85a9","zHF1qzz4ZU","FFDuiuLtKs","2DREs48cHL","5NammAkKTk","tl72WXflUq","RkQkeMm8si","IRh488RCUA",
+"WPmlxokgRi","L7cGc0BmCy","yluBx9iGoT","Twano07n1c","KASQ8RBhp0","SWfouQYxC0","6AFT0UmaEv","lj07Q64s8N","CqqaDjiVBP","Q6Lix4W0Tl",
+"JXljWdpe1v","h1zcHFPfSE","xXTI4ulk41","gtCA5cL0aE","P6bcgG1RhS","d85a9jzUqR","48cHLM6qcG","PYBf4v8yFN","55rfBaFFss","S77LH5Drn0",
+"gtCA5RsQUq","IKxdLyvOMI","KASQ81j5L8","HlUbFgdQsS","QClRLQWxoT","NcICAuAWyp","QbxXc0Kyfs","ECMvUDz1R3","1v5hHlXFOB","HfyNQ2Nslm",
+"vOqCEuQIcz","MK07YyvOMI","45cIHpFrrl","Qworu5IhmG","tl72WdQ586","BFkb8ZzJHW","zFgtB0PktI","RzaZAkB5nP","NOHszKZamH","v1HlnRmDcr",
+"mX2GE7X3uy","nlaByKsjRK","ksJbyhSSvQ","0MR5Xb29RJ","Q6LixPYBf4","tvdkDlm0pD","9iGoTFNYIM","EOE1oRxrsm","hi5X7nFqik","POUYS9rlg9",
+"Zv7z0euZA5","UmaEvAOgEe","lViBvoVQp6","jfREuaFFss","5iGN5zbIYY","kZANmNxx9V","Vprf27fKYU","fFDrJvkCHH","iqv4k8RCUA","JXljWEdBKc",
+"fcJOypAhR1","QWxoT4W0Tl","tuDySRkQke","k85AeRzaZA","fLNg8tjQxs","HRxd81LB1L","tl72WAmdQd","AgJHQ0YAGH","pvgjSIn3NS","zz4ZUPb1pa",
+"WreyPWreyP","wiHrZlCMxy","zbIYY7fsYM","tAOsry94nw","16lHcAkKTk","n1pmOCfgr3","0MR5X5ZaEz","pAhR1b29RJ","VBjhzjS1aj","U3yw5GWqqX",
+"14FLRFFDui","ni2v1NhXdu","IjTwP0MR5X","yEfy907n1c","bgJAzWaWsv","d85a92hEEU","0KyfsyToGW","8cVD30ao3l","9GXkX7fKYU","MGlTFsqVrf",
+"Kr8ys5Namm","k85Aee6e4z","rKDLJLDk6f","CIShGVerEA","F6PT2AOgEe","2DREsyToGW","dpe1ve6e4z","kZANmWMiS3","xXTI48cVD3","bgJAzFhtgl",
+"Yf2EclpF6W","C2Irc0h1b1","ReKEWFFDui","64s8NGv3Fq","bZLvS0BmCy","iB08lTXQ0Z","G1RhSFwEJz","Uvlv4FVMxo","WmadAe6e4z","Yh1hFTCgPp",
+"lH1ktokgRi","uJScXPYBf4","s93MlWreyP","RpBQmRzaZA","ydG8Un1pmO","55rfBWPmlx","ulk41L7cGc","uPX7G0YAGH","jtn0X7fsYM","EdBKcWPmlx",
+"GrDg7AOgEe","Ta8f6ZzJHW","piJSki7WMQ","rhl0JxReec","CqqaDPb1pa","S2DfuHfyNQ","s93MlJkzUn","pvgjS5IhmG","5VZjSuLtKs","ydG8Ut59lR",
+"xXTI4GrDg7","XyPZN9eoRc","24ARFy94nw","qUJMdprNT6","GXdoH8hJdt","GrDg75Drn0","IRh48UlU3M","0BmCyYf2Ec","0KyfsY1mC0","JKWYRs7Mxk",
+"RpBQmMK07Y","o8UydCqqaD","s7MxkfcJOy","ciuWzgjUTu","pT8wuvkCHH","07n1c5ZaEz","48cHL5Mg9r","lH1ktJJs5m","okgRiRpBQm","aFFssBpYhV",
+"jS1ajyofH3","uAWyp6AFT0","KsjRKmz8gx","qQxHPFwEJz","prNT6ZuDtD","iKqhrK4GS8","KsjRKECMvU","5Drn0rz7Ut","nnP8oK20wK","lViBv7fKYU",
+"pv0i7K20wK","0BmCyQ6hMC","SbRYyuTacx","Yf2EcHRxd8","t59lRs4786","AXpwES77LH","e6e4zRzaZA","8cVD3iB08l","U3yw516lHc","ru4UGCqqaD",
+"prNT6VIlwP","Mm8sid85a9","i7WMQxciqp","k85AeC2Irc","ReKEWzFgtB","dpe1vJkzUn","ulk41NOHsz","B3qemdjsrv","AOgEe5Mg9r","ZzJHWPOUYS",
+"FwEJziwzGk","RzaZAStlDJ","29QAzaDGtS","uZPqgzmLYD","5Drn0580YD","t59lRlViBv","yToGWLbRTH","5drc6HlUbF","QbxXcjtn0X","uPX7GHlUbF",
+"Mkgy80h1b1","FLsphzY1GY","8hJdtt59lR","lj07QvOqCE","cL0aEzHF1q","ulk41IKxdL","7ku1pWMiS3","CdyBVAIYUu","QChxsFwEJz","YjB9tydG8U",
+"tAOsrIn3NS","2Nslm3weIF","8FmFHzbIYY","t59lR8RCUA","RzaZAHP433","X6PinuPX7G","DG4sTPb1pa","uN6r37hyVv","s93Ml8FmFH","zmLYDMmKGJ",
+"djsrvOz8yZ","In3NSsoy9t","9iGoTB3qem","55rfBjSjS3","CNHmvmz8gx","NAFuwCNHmv","QssNCpT8wu","RBhp0O3iyQ","IRh489eoRc","gjUTufmIK1",
+"8U2nUTwano","5nmWv8hJdt","FnPFBfcwDa","lweGyOHaBz","s93MlcQOnv","i7WMQsuY4x","HzZT8e6e4z","m4bxUCqqaD","8RCUAzqH0W","RpBQm7X3uy",
+"MK07YpAhR1","uvf7AoVQp6","NAFuwWMiS3","oGu6x16lHc","oQ87r2ZHdk","lsQGonlaBy","cQOnvdmoS7","o8UydAkKTk","fmIK18hJdt","brhlQQworu",
+"WreyPt59lR","7hyVvHRxd8","P6bcgsoy9t","M6qcGPb1pa","3weIFQbxXc","8FmFHnFqik","aDGtSCqqaD","16lHc9iGoT","FnPFB7X3uy","CIShGRBhp0",
+"9GXkXo8Uyd","pmeCd9rlg9","RmDcrru4UG","RsQUq8U2nU","okgRiiqv4k","QnJ1SUvlv4","lViBvfmIK1","lpF6W55rfB","OHaBzsx5Gl","QWxoTS2Dfu",
+"qaofNs93Ml","mz8gx2Yz7E","IRh485nmWv","POUYSvLsmS","xXTI4HP433","OUqFMcL0aE","lXFOBfFDrJ","fqypyulk41","h1zcHyToGW","580YDtaOXK",
+"ZzJHWJIqXi","BpYhVK4GS8","ECMvUjeskS","pAhR1MaJQs","iwzGkLewvM","FxX9q16lHc","ZuDtDLewvM","5IhmGVLTy6","dhSuHFLsph","s7MxkuN6r3",
+"guMb8Q6hMC","7fKYU5Drn0","IjTwPtvdkD","4dEz6In3NS","i7WMQFhtgl","fcwDaogLgc","GrDg7tAOsr","BCxeCLbRTH","1LB1LkZANm","618DiRBhp0",
+"Cp3mZlCMxy","GWqqX3weIF","yvOMIHzZT8","FcWrWAkKTk","pWiOslViBv","8cVD3brhlQ","yluBxoGu6x","2ZHdkqUJMd","h1zcHZJTXH","5Mg9rdpe1v",
+"JJs5mLbRTH","9XyT9ciuWz","HzZT8MezSW","6AFT0RACuj","0MR5XCp3mZ","VLTy6FFDui","WPmlxDcpWB","soy9ttjQxs","jS1ajlkMUA","HRxd81v5hH",
+"K20wKMmsIo","9iGoTNxx9V","0MR5XFVMxo","HP433Q6hMC","atef2blLA9","DcpWBCNHmv","9rlg9DQimp","lpF6WhYBCK","Waim6B3qem","l83Ud7X3uy",
+"MmsIohYBCK","8FmFHL7cGc","MK07YGrDg7","kZANmVjCZq","0PktIZUnqt","6AFT0jfREu","FVMxookgRi","aL6AJWreyP","zz4ZUv1Hln","In3NSFnPFB",
+"MezSWRzaZA","pvgjSlj07Q","lXFOBiKqhr","0MR5XqQxHP","BFkb8M3zXL","he9IAn1pmO","v2eC3atef2","1LB1LXyPZN","Zv7z0rz7Ut","CqqaDBpYhV",
+"O3iyQDz1R3","nnP8oCp3mZ","ECMvUn1pmO","Yh1hFnnP8o","uvf7AlkMUA","Cfgr3ZzJHW","ksJbyYOfrY","YjB9tAkKTk","Q6hMCjS1aj","pv0i7JKWYR",
+"nlaByhE1Ql","FGzgpCK5W7","HfyNQFPfSE","QssNC0ao3l","fcJOygIYvE","tuDySsx5Gl","NcICAQssNC","mX2GE9GXkX","5drc6i3pyd","S2DfuFVMxo",
+"Ta8f6faHir","rz7Uthi5X7","ciuWzVerEA","6q6L9uupzk","uupzki3pyd","HzZT8sqVrf","55rfB8TxD7","o8UyduTacx","n1pmOa00b5","MojnPlm0pD",
+"QChxsFcWrW","I7p2a5IhmG","LDk6fIn3NS","lH1ktMm8si","Cfgr3aFFss","9XyT9NcICA","BFkb8WaWsv","CIShG0h1b1","wDajXnnP8o","0h1b1uoStw",
+"W7cTsU3yw5","gdQsS4QMc9","JIqXilsQGo","wiHrZyEfy9","HfyNQ2ZHdk","NcICAs93Ml","K20wKs93Ml","m4bxUuoStw","uQIcz6q6L9","HfyNQ3weIF",
+"gIYvEJKWYR","zbIYYuJScX","VerEAfFDrJ","azIWpYf2Ec","POUYSEdBKc","WmadA16lHc","rKDLJKASQ8","0ao3ltvdkD","MezSWSWfou","jiVBPqUJMd",
+"ksJbyiqv4k","AXpwEpWiOs","iB08ll83Ud","fmIK1dmoS7","BGaQYDQimp","Ss0ZuL7cGc","Ul4a1LewvM","Yw2oU7Ow5C","gdQsSQChxs","RkQkeQ6hMC",
+"SbRYyIKxdL","Nxx9V9y4lw","U3yw5P6bcg","tAOsrVprf2","WaWsvqaofN","6q6L9lj07Q","Uvlv4lXFOB","rhl0JdQ586","Oz8yZUl4a1","HlUbFFhtgl",
+"5Mg9rFjHXR","YjB9tZhwG1","4QMc9uJScX","jfREuvkCHH","RmDcrO3iyQ","In3NSrhl0J","cQOnvb29RJ","D6rBy14FLR","ogLgc6AFT0","MaJQsEOE1o",
+"OUYuFcL0aE","faHir7lUXZ","IRh48K20wK","7X3uyKZamH","0PktI2hEEU","GXdoHYf2Ec","lCMxysqVrf","jfREuSmGzv","uTacxCqqaD","NAFuwQChxs",
+"lkMUAMK07Y","O3iyQJkzUn","WreyPdjsrv","9XyT9VjCZq","0KyfsWMiS3","t59lRgtCA5","C2IrcpFrrl","FLsphpmeCd","IBe8kd7vjM","MaJQspAhR1",
+"zqH0WThjNn","HRxd8CxVEf","K20wK7fKYU","fqypyOUqFM","RBhp0FGzgp","guMb8azIWp","v8yFNn8pJ9","pvgjSKASQ8","Uvlv4JRJQB","QClRLCqqaD",
+"gf8rItaOXK","MezSW1v5hH","n8pJ98RCUA","8hJdtReKEW","Mkgy8618Di","d7vjMqaofN","rKDLJ1v5hH","7Ow5CoGu6x","9rlg9AkKTk","YjB9tuLtKs",
+"zY1GY29QAz","iwzGk5Namm","48cHLwiHrZ","VBjhzt59lR","XyPZNPOUYS","MmsIo29QAz","s4786yvOMI","F6PT2Q6hMC","2DREsxReec","m4bxUuLtKs",
+"bZLvSW3VFH","nnP8orz7Ut","QYxC0NcICA","ECMvUKr8ys","AkKTkuPX7G","LbRTHs93Ml","soy9tPYBf4","GWqqXzHF1q","3weIFjS1aj","t98iWvOqCE",
+"KASQ8uN6r3","KsjRKcL0aE","dpe1vI7p2a","i7WMQaL6AJ","X6Pin9iGoT","lkMUApvgjS","4W0Tln1pmO","HfyNQjSjS3","pAhR1C2Irc","8hJdtAXpwE",
+"AXpwEY1mC0","uPX7GlH1kt","WmadAdQ586","J2mQiIBe8k","KsjRKpvgjS","gtCA5yEfy9","jeskSxReec","7fKYUMkgy8","Pb1papAhR1","xciqpZuDtD",
+"yEfy9CdyBV","WMiS3uQIcz","ThjNnOz8yZ","MmsIoeuZA5","No0QbuZPqg","yvOMI8RCUA","O3iyQRxrsm","HP433rhl0J","sx5GlHlUbF","7X3uysqVrf",
+"iqv4k8hJdt","yEfy9EoToP","MojnPKr8ys","i7WMQ7fKYU","uZPqgzHF1q","UlU3MDz1R3","Yw2oUpvgjS","lXFOBwDajX","v1Hlnni2v1","2DREsWMiS3",
+"FwEJzRxrsm","Z4I1vThjNn","7X3uyksJby","fLNg8XyPZN","tvdkDJKWYR","he9IA48cHL","ksJbyOz8yZ","16lHc7X3uy","lweGy1v5hH","5VZjSblLA9",
+"ZhwG15Drn0","FxX9qEOE1o","0h1b1KZamH","48cHLpvgjS","CxVEf07n1c","bgJAzQ6hMC","vOqCEtlILt","FjHXRru4UG","ThjNnokgRi","2ZHdkS77LH",
+"SjskQhYBCK","DQimp5Drn0","No0QbdQ586","FjHXRfmIK1","C2IrcfFDrJ","WreyPlweGy","zY1GYiKqhr","FNYIMOHaBz","1j5L8uLtKs","uN6r31LB1L",
+"G1RhSQYxC0","pv0i7Z4I1v","1j5L8uZPqg","3otm6Q6hMC","t98iWWaim6","3otm6fmIK1","v8yFNk85Ae","uZPqgMK07Y","lkMUAyEfy9","2ZHdkgdQsS",
+"DcpWBmX2GE","mz8gxgdQsS","BbwgAe6e4z","lm0pDM6qcG","d85a9FwEJz","bZLvSZhwG1","pAhR14W0Tl","4dEz6uPX7G","dQ586IRh48","QClRLBFkb8",
+"lj07QhYBCK","zFgtB1v5hH","x3LDeStlDJ","tl72WAOgEe","ZuDtDciuWz","iKqhrjtn0X","XflUqqaofN","8cVD3UlU3M","SjskQRBhp0","VNCPduQIcz",
+"ydG8U7X3uy","Yw2oUHRxd8","MK07YzqH0W","kB5nP8xEKz","W3VFHYh1hF","CxVEfqaofN","xReeck85Ae","uJScXTCgPp","uAWypJkzUn","zqH0WXyPZN",
+"v2eC3pWiOs","D6rByuPX7G","n8pJ9TCgPp","uZPqgFFDui","dmoS7580YD","55rfBP6bcg","lpF6W2Yz7E","FhtglZJTXH","5VZjSBFkb8","Q6hMCpvgjS",
+"RBhp0TXQ0Z","suY4x6q6L9","yluBxv2eC3","euZA5BCxeC","mz8gxX6Pin","uoStwWaWsv","5drc6rz7Ut","9iGoT07n1c","NAFuwBCxeC","DcpWBHlUbF",
+"AkKTkx3LDe","SjskQYw2oU","uQIcz7lUXZ","i7WMQHP433","8RCUAGrDg7","dhSuHt59lR","HRxd85nmWv","cmXIX8xEKz","gIYvE9GXkX","HP4338cVD3",
+"pAhR1azIWp","EoToP3weIF","HlUbFh1zcH","lCMxy2ZHdk","7ku1pfcJOy","M6qcGuJScX","zY1GY2DREs","fFDrJDz1R3","prNT6oGu6x","hYBCKDLhzM",
+"l83UdZUnqt","No0QbFjHXR","s93MlM6qcG","rhl0JlViBv","W7cTs7ku1p","SmGzvv1Hln","Chuy3bZLvS","o8Uyd4QMc9","aFFssX6Pin","O3iyQs93Ml",
+"KASQ8piJSk","9GXkXzqH0W","JIqXi2DREs","BpYhV8RCUA","y94nwblLA9","JXljW7ku1p","7fsYM5iGN5","pFrrlfLNg8","AmdQdJRJQB","CIShGMmsIo",
+"e6e4zOUYuF","iKqhroGu6x","tlILtjiVBP","ksJby64s8N","1v5hHAXpwE","Uvlv4mz8gx","WreyP0Wr5y","RBhp0tvdkD","vOqCEM3zXL","KASQ87ku1p",
+"hE1Ql8TxD7","zY1GYSs0Zu","CxVEfGv3Fq","580YD07n1c","K20wK8U2nU","Cfgr3gdQsS","pWiOsYjB9t","EdBKcJXljW","CNHmv0h1b1","8FmFHjS1aj",
+"2Yz7ES77LH","mz8gxVNCPd","OUqFM9XyT9","RmDcrFjHXR","nFqikazIWp","pAhR1hE1Ql","t98iWuAWyp","pv0i7OUYuF","pWiOszqH0W","45cIHAkKTk",
+"Zv7z0MmKGJ","euZA5Dz1R3","EoToPeuZA5","YjB9t0YAGH","OxWIHXyPZN","Kr8ysF6PT2","hYBCKaez9y","9GXkXzFgtB","tjQxsjfREu","pmeCdNAFuw",
+"nnP8otuDyS","uTacx4dEz6","KASQ8dmoS7","7fsYMFVMxo","FwEJzsqVrf","aFFssiqv4k","MaJQso8Uyd","IBe8katef2","CxVEfciuWz","Yh1hF14FLR",
+"I7p2apvgjS","rKDLJvLsmS","FFDui6AFT0","sqVrfulk41","POUYSJ2mQi","No0QbNcICA","ThjNndQ586","d7vjMuQIcz","W3VFHKZamH","5Drn0LewvM",
+"IKxdLoVQp6","KsjRKAXpwE","9GXkXuLtKs","VjCZqfqypy","VjCZqK4GS8","B3qem3otm6","7fsYMpiJSk","zmLYDZuDtD","x3LDeCNHmv","CNHmv8TxD7",
+"YOfrYaDGtS","OHaBzNAFuw","fqypytuDyS","5IhmGpFrrl","gjUTu2Yz7E","gjUTu0h1b1","dpe1vFLsph","Ul4a1FPfSE","AXpwERBhp0","OUYuFuTacx",
+"v1HlnXyPZN","8hJdtzY1GY","VerEApAhR1","piJSk580YD","s4786B3qem","MojnPSmGzv","QWxoTy94nw","iB08logLgc","5ZaEzbrhlQ","brhlQHRxd8",
+"48cHLZhwG1","Mkgy8NAFuw","FFDuiJXljW","jiVBPjiVBP","Y1mC0fmIK1","piJSkQChxs","29QAz9y4lw","fcwDaqQxHP","h1zcHgf8rI","hE1Qlv8yFN",
+"Ul4a14QMc9","SmGzvy94nw","uN6r35nmWv","CIShGbZLvS","WreyPPYBf4","iB08lFnPFB","QYxC0cmXIX","x3LDeZJTXH","SWfouzHF1q","Gv3FqKASQ8",
+"StlDJZ4I1v","Waim6atef2","rz7Ut2hEEU","IBe8kJ2mQi","x3LDesx5Gl","qQxHPM3zXL","lH1ktO3iyQ","Zv7z0NOHsz","8FmFHiB08l","CxVEfpmeCd",
+"IjTwPPb1pa","ZhwG1No0Qb","KsjRK7lUXZ","AIYUumz8gx","lj07Q2DREs","RpBQmUvlv4","IKxdLkB5nP","AmdQdfFDrJ","VjCZqRkQke","QChxsYOfrY",
+"soy9tECMvU","4QMc9IRh48","fcJOyRmDcr","DLhzMiwzGk","s7MxkMaJQs","0YAGHBCxeC","gIYvEjiVBP","Q6hMCfmIK1","JXljWTXQ0Z","Q6LixOz8yZ",
+"5nmWv2Yz7E","e6e4zDLhzM","nlaByAkKTk","hSSvQuvf7A","hSSvQ8xEKz","Yh1hFiqv4k","VLTy6k85Ae","SmGzvv8yFN","8U2nUmX2GE","FFDuizQt6Q",
+"VNCPdZ4I1v","pT8wuulk41","FNYIM6q6L9","M3zXLNcICA","9eoRcRpBQm","UlU3Mk85Ae","VjCZqyofH3","jzUqR0ao3l","e6e4zGrDg7","KASQ8QnJ1S",
+"KASQ8VBjhz","rKDLJZv7z0","M3zXLMmsIo","VLTy6SbRYy","2Yz7E64s8N","pWiOsQ6hMC","oVQp6gdQsS","UlU3MHP433","bZLvSwiHrZ","JkzUnSjskQ",
+"Uvlv4fLNg8","oGu6xtlILt","uZPqgRxrsm","iKqhrvOqCE","wDajXzHF1q","oQ87r2Nslm","XyPZNXflUq","2DREspv0i7","oQ87r0YAGH","qaofNfcJOy",
+"AkKTksx5Gl","CxVEf3weIF","uoStwTCgPp","aL6AJzQt6Q","aDGtSlsQGo","OUYuFPb1pa","brhlQ4QMc9","lpF6Wb29RJ","DQimpRkQke","uN6r3EoToP",
+"wDajXCNHmv","qQxHPXyPZN","jzUqRzHF1q","zY1GYgf8rI","QChxstaOXK","Z4I1vSWfou","QbxXc1v5hH","YjB9tUvlv4","FLsphBFkb8","NhXduP6bcg",
+"TwanoRsQUq","9XyT9JIqXi","45cIHJKWYR","0Kyfs0YAGH","GXdoH07n1c","Cfgr3jeskS","8U2nUd85a9","8cVD3S77LH","In3NSJJs5m","K20wKJkzUn",
+"gtCA5NAFuw","Yw2oUMezSW","zmLYDuPX7G","0PktIZzJHW","7lUXZWPmlx","kB5nP0Wr5y","1LB1LAmdQd","5IhmGlViBv","uLtKsv1Hln","qUJMd2TRI7",
+"I7p2a6q6L9","QClRLjzUqR","AkKTkzHF1q","CxVEf6AFT0","CNHmvcQOnv","x3LDeJIqXi","yofH3MGlTF","Yw2oUQYxC0","S2DfuZ4I1v","cmXIXHzZT8",
+"zqH0WlpF6W","55rfB6q6L9","8RCUAAOgEe","AIYUuY1mC0","x3LDei3pyd","uJScXFLsph","NcICABCxeC","ZJTXHQworu","FwEJzaL6AJ","0BmCyS77LH",
+"Q6hMC580YD","1v5hHv8yFN","tlILtxXTI4","8FmFHEoToP","Ta8f62Nslm","vOqCEt98iW","prNT6BCxeC","0Kyfs5IhmG","0ao3lOUqFM","VNCPd5VZjS",
+"SWfouMojnP","ZzJHWjiVBP","gIYvEn8pJ9","gIYvEDLhzM","D6rByaFFss","HRxd8fcJOy","0MR5XzQt6Q","5ZaEzdmoS7","Oz8yZWreyP","FnPFBD6rBy",
+"qQxHPm4bxU","yEfy9FPfSE","nFqikprNT6","x3LDeUvlv4","MGlTFyvOMI","dhSuHe6e4z","W7cTsTCgPp","4dEz6t59lR","IjTwPblLA9","XflUqbZLvS",
+"uQIczKr8ys","a00b5ZhwG1","4W0Tle6e4z","JJs5mgIYvE","gIYvEiKqhr","8cVD3uPX7G","WaWsv1j5L8","GWqqXuupzk","MezSWv2eC3","JkzUne6e4z",
+"zHF1qMmKGJ","QbxXcmz8gx","zQt6QjS1aj","bZLvSGSQwj","BCxeCnnP8o","gtCA5HzZT8","fFDrJ07n1c","hSSvQ7lUXZ","29QAz3otm6","Y1mC0uupzk",
+"QChxshE1Ql","zQt6QNAFuw","B3qemCdyBV","24ARFB3qem","atef2iqv4k","v8yFNDz1R3","Cfgr3In3NS","Vprf2pT8wu","i3pydRACuj","fLNg8uZPqg",
+"Twano8FmFH","ru4UGuvf7A","gf8rIHRxd8","yToGWKsjRK","BFkb8uLtKs","Ta8f6LDk6f","No0QbksJby","k85Ae0ao3l","t59lRIKxdL","14FLRFhtgl",
+"FjHXRFNYIM","G1RhShE1Ql","WaWsvl83Ud","BCxeCk85Ae","M6qcGdjsrv","ogLgcCdyBV","oGu6x7X3uy","X6PinRxrsm","FVMxojiVBP","JKWYRFnPFB",
+"fmIK19GXkX","lm0pDhe9IA","uN6r3ydG8U","Cfgr3oGu6x","AXpwEWreyP","CIShGSmGzv","aL6AJuupzk","iB08lo8Uyd","9y4lw5VZjS","NcICARzaZA",
+"Vprf2M6qcG","MmsIoaez9y","GSQwjogLgc","uoStwulk41","kZANmAIYUu","0PktICdyBV","xReec8U2nU","IRh48lm0pD","VNCPdBFkb8","IjTwPlkMUA",
+"yToGW55rfB","i7WMQh1zcH","mX2GEjtn0X","OUYuF0Wr5y","fqypyTa8f6","WMiS3OHaBz","o8Uydl83Ud","prNT6hUTw7","FPfSE8FmFH","dmoS7FNYIM",
+"WDVWJhe9IA","Vprf2jS1aj","SWfouFGzgp","atef2ydG8U","GXdoHfmIK1","lweGypT8wu","guMb82Nslm","y94nw2DREs","4dEz67ku1p","FNYIMzmLYD",
+"s4786Cfgr3","uN6r3MK07Y","BCxeCO3iyQ","MK07Yv1Hln","9eoRcHfyNQ","m4bxUEdBKc","vOqCEzHF1q","jSjS33weIF","RkQkeUlU3M","GWqqXCK5W7",
+"Q6hMCrhl0J","faHirLDk6f","2DREsgf8rI","zmLYDpWiOs","NOHszGv3Fq","Q6hMCrz7Ut","FcWrWVjCZq","BGaQYSWfou","yofH3NOHsz","QnJ1SokgRi",
+"hi5X7pT8wu","QYxC07fsYM","mz8gxhi5X7","M3zXLMm8si","SmGzvfqypy","Q6LixbrhlQ","kB5nPciuWz","5drc6JkzUn","5IhmGHP433","RBhp03otm6",
+"cShY20ao3l","J2mQiReKEW","UlU3Mo8Uyd","ZhwG11LB1L","tvdkDFVMxo","i7WMQ0ao3l","Cp3mZoQ87r","soy9tlH1kt","e6e4zAmdQd","IRh4855rfB",
+"yofH39GXkX","Pb1paB3qem","1j5L8hSSvQ","7ku1pS77LH","FGzgpJkzUn","RzaZAYw2oU","K4GS8Ta8f6","ix74rQClRL","XflUqs4786","M3zXLfmIK1",
+"29QAz0Kyfs","XflUq0PktI","AgJHQRzaZA","ogLgczz4ZU","EdBKcPOUYS","StlDJlViBv","S2DfuOUYuF","Ul4a1JIqXi","VIlwPNxx9V","XflUqcmXIX",
+"45cIHChuy3","VNCPdyToGW","fmIK1OxWIH","KsjRKzHF1q","BpYhVpiJSk","qQxHPKZamH","No0QbQssNC","dQ586IBe8k","5nmWv9XyT9","CdyBVfcwDa",
+"XflUqb29RJ","yofH37Ow5C","8cVD3Yw2oU","GSQwjazIWp","jzUqRGrDg7","24ARFReKEW","uoStwStlDJ","OHaBzB3qem","lViBvMezSW","y94nwcL0aE",
+"zY1GYTwano","dQ586aL6AJ","m4bxU2TRI7","X6Pin5VZjS","5nmWvAgJHQ","L7cGcVjCZq","QbxXciKqhr","fcJOye6e4z","b29RJd85a9","IKxdLwiHrZ",
+"QbxXcYh1hF","RzaZAaFFss","ThjNn3weIF","jSjS3ni2v1","UmaEv2TRI7","faHirCK5W7","rz7Ut0PktI","Yf2EcVBjhz","soy9tTa8f6","tjQxssuY4x",
+"No0QbAmdQd","bZLvSni2v1","CK5W7dQ586","MaJQs16lHc","jfREuk85Ae","nFqikRmDcr","6q6L98U2nU","RACujyvOMI","4dEz6W3VFH","Gv3FqCK5W7",
+"LewvMv2eC3","TXQ0ZEOE1o","MojnPaFFss","55rfB8cVD3","VBjhztjQxs","W3VFHnFqik","YjB9t5iGN5","1j5L816lHc","OxWIHs93Ml","jS1ajSWfou",
+"rz7UtGv3Fq","VNCPdtAOsr","jS1ajRxrsm","Oz8yZW3VFH","v2eC3WreyP","FhtgluPX7G","n1pmOvLsmS","8xEKzyofH3","QClRLFNYIM","lkMUAvOqCE",
+"gf8rIn8pJ9","BpYhVWDVWJ","RACujhYBCK","IjTwPFPfSE","VIlwPIBe8k","jS1aj1v5hH","zHF1qsqVrf","AmdQd2DREs","ECMvUCxVEf","LewvMFGzgp",
+"AIYUuFLsph","CdyBVbgJAz","taOXKBpYhV","MaJQsCp3mZ","9y4lwG1RhS","ni2v1sqVrf","5iGN5jSjS3","X6Pinjtn0X","7fsYMX6Pin","hUTw7qQxHP",
+"VLTy6TXQ0Z","jeskSsoy9t","pWiOsCfgr3","9GXkX8RCUA","zbIYY5Mg9r","TCgPptvdkD","48cHLkB5nP","guMb8AOgEe","QWxoT1v5hH","nnP8osoy9t",
+"lm0pD8xEKz","MGlTF9rlg9","VNCPdyofH3","v2eC3wiHrZ","0BmCym4bxU","M3zXL4dEz6","7ku1pFwEJz","G1RhSS2Dfu","jfREuW3VFH","vOqCEYw2oU",
+"FcWrW5IhmG","IKxdLBpYhV","soy9t618Di","FGzgpru4UG","k85AeGXdoH","bZLvSzY1GY","cShY2xXTI4","AXpwEB3qem","BpYhVk85Ae","tAOsrEoToP",
+"t98iWkZANm","XflUqgtCA5","FjHXRnFqik","iKqhruLtKs","RzaZAhSSvQ","okgRii3pyd","wiHrZWDVWJ","RmDcrlCMxy","faHir8TxD7","Kr8ystuDyS",
+"CdyBVogLgc","MmsIoUvlv4","MK07Y8RCUA","ReKEWazIWp","5drc655rfB","J2mQirhl0J","1LB1LRpBQm","6AFT0ThjNn","POUYSzY1GY","atef2OHaBz",
+"cShY2P6bcg","zHF1q0Kyfs","Mkgy8lweGy","ZhwG17Ow5C","J2mQi7X3uy","FxX9qCxVEf","QWxoTDcpWB","hE1QlC2Irc","he9IAzqH0W","v8yFNlCMxy",
+"IRh48rz7Ut","iB08lwiHrZ","Z4I1vfcwDa","Q6hMCCqqaD","FxX9qhYBCK","WaWsvgjUTu","QssNCulk41","rhl0J6q6L9","FVMxouupzk","jeskSzmLYD",
+"FPfSEgdQsS","cShY2GrDg7","W7cTsVIlwP","JkzUndjsrv","DQimpaL6AJ","FwEJzYOfrY","iB08lQClRL","5Drn0v2eC3","HRxd8BCxeC","SbRYywDajX",
+"b29RJXyPZN","cmXIXrhl0J","nnP8oogLgc","580YDQnJ1S","FLsphlweGy","F6PT2b29RJ","nlaByFFDui","hE1Ql4QMc9","dmoS7J2mQi","Dz1R3uQIcz",
+"d85a9ksJby","0MR5X1j5L8","pvgjSWDVWJ","MK07YiKqhr","NcICAuLtKs","XflUqlj07Q","fcwDaQYxC0","FVMxocQOnv","FVMxoYjB9t","lCMxyyluBx",
+"ZJTXHMmKGJ","ksJbyCqqaD","5drc6D6rBy","ciuWzfcJOy","zFgtBvOqCE","fcJOylpF6W","fmIK1WaWsv","FxX9quLtKs","618DicQOnv","9y4lwRmDcr",
+"9y4lwgjUTu","LewvMzbIYY","Yf2Ec3otm6","MGlTFv1Hln","RpBQmWreyP","nlaBylCMxy","FNYIMUlU3M","nlaByiwzGk","dQ586fcwDa","s4786Yh1hF",
+"MezSWrz7Ut","TwanoWmadA","5Mg9rs7Mxk","zQt6Q9iGoT","QssNCsqVrf","nFqikfcJOy","PYBf4JkzUn","atef2FjHXR","LDk6fgIYvE","OUYuFKsjRK",
+"OUYuFEOE1o","d85a9s93Ml","QYxC0fmIK1","vLsmSOxWIH","7lUXZQ6Lix","jfREu0ao3l","RpBQmZhwG1","ThjNnazIWp","dQ586LbRTH","4QMc97lUXZ",
+"Dz1R3pmeCd","i3pydVprf2","2DREsrz7Ut","uoStws7Mxk","Twanot59lR","rKDLJRkQke","jS1ajFFDui","gf8rI7lUXZ","wDajX1j5L8","l83UdyEfy9",
+"2ZHdkrz7Ut","14FLRXyPZN","gjUTu0MR5X","55rfBDz1R3","FNYIMHlUbF","Kr8ysGWqqX","9XyT9PYBf4","zbIYYk85Ae","D6rByeuZA5","9iGoTWreyP",
+"0YAGHAgJHQ","s47867X3uy","7hyVvRxrsm","JkzUnX6Pin","ZuDtDVNCPd","WDVWJCK5W7","0YAGHBGaQY","TCgPpDG4sT","CIShGpv0i7","jzUqR8U2nU",
+"CNHmvNAFuw","Pb1pa7ku1p","zFgtBzQt6Q","faHirsuY4x","zQt6QUmaEv","nFqikMK07Y","zmLYDUl4a1","lViBvrz7Ut","5Mg9r5Namm","HRxd8G1RhS",
+"QYxC02DREs","pFrrl1j5L8","7fsYMuPX7G","uLtKsWaim6","Mkgy8RkQke","QssNCbZLvS","FNYIMRxrsm","FjHXRWmadA","hSSvQlXFOB","HlUbFlXFOB",
+"5VZjSStlDJ","uvf7AYOfrY","55rfBJ2mQi","jzUqRRACuj","S2DfuDG4sT","7Ow5CSbRYy","5ZaEzmX2GE","dmoS714FLR","7fsYMtl72W","aFFssReKEW",
+"uAWypyluBx","piJSklsQGo","zbIYY5Drn0","uPX7Gb29RJ","FNYIMWreyP","UlU3M9rlg9","jfREupWiOs","dmoS7FjHXR","fmIK10BmCy","CxVEf0Kyfs",
+"2DREsM3zXL","uvf7AiKqhr","uvf7A7fKYU","ZUnqtnnP8o","Cp3mZ7lUXZ","4dEz6RpBQm","nlaByXyPZN","O3iyQU3yw5","soy9tZzJHW","t98iW5Mg9r",
+"l83Ud5Namm","Cp3mZuJScX","tvdkDJRJQB","atef2hUTw7","FGzgp29QAz","iqv4kdhSuH","EOE1o0MR5X","SbRYyprNT6","5VZjSSbRYy","I7p2aiwzGk",
+"hUTw7aFFss","jzUqRIn3NS","1j5L8uupzk","vOqCEqQxHP","uLtKsd7vjM","zqH0WJKWYR","cQOnv0PktI","ZJTXHlpF6W","IjTwPO3iyQ","ECMvUjtn0X",
+"7lUXZK4GS8","Mm8si5VZjS","7fKYUzqH0W","SbRYyS77LH","QbxXcuN6r3","5IhmGtAOsr","14FLRix74r","yofH3AgJHQ","O3iyQMmsIo","tvdkDQChxs",
+"RmDcrCqqaD","FhtglZUnqt","HRxd8YjB9t","7X3uyciuWz","aez9yBGaQY","Ul4a1guMb8","fcwDaS77LH","2Yz7EvLsmS","azIWpzmLYD","dpe1v7ku1p",
+"jtn0XoGu6x","h1zcHhYBCK","uoStwqaofN","In3NS0BmCy","dmoS7JIqXi","TXQ0Zrz7Ut","hUTw7MaJQs","KsjRKHRxd8","8RCUAzz4ZU","tlILtsoy9t",
+"64s8NWPmlx","618DifcJOy","HfyNQCNHmv","XflUqGXdoH","iKqhrhE1Ql","Nxx9VBbwgA","HRxd8guMb8","Yw2oUt98iW","a00b5S77LH","yluBxHfyNQ",
+"C2IrcgtCA5","IBe8kLewvM","NOHszTa8f6","P6bcgHlUbF","JKWYRW3VFH","VNCPdvLsmS","QworuNxx9V","NhXduQ6Lix","dhSuHJXljW","SmGzv0MR5X",
+"7fsYMTa8f6","WDVWJNxx9V","HfyNQS77LH","gjUTuStlDJ","TCgPpTCgPp","580YDuTacx","8RCUA5Mg9r","7Ow5CBFkb8","Gv3FqzY1GY","P6bcgatef2",
+"fcJOyfmIK1","1LB1LOUqFM","DLhzMFVMxo","DG4sTAmdQd","e6e4zJJs5m","wiHrZJJs5m","d7vjMZ4I1v","NcICA7ku1p","Q6hMCoQ87r","Cp3mZzz4ZU",
+"0ao3ljS1aj","AgJHQlm0pD","iKqhrtuDyS","JkzUnReKEW","8FmFHS77LH","hE1QlVerEA","LewvMFLsph","NcICAQ6hMC","cL0aEnnP8o","8FmFHoQ87r",
+"zQt6QuPX7G","TwanodmoS7","Cfgr3I7p2a","FwEJzReKEW","HzZT8kB5nP","5iGN5JKWYR","qaofNpv0i7","OUqFMfLNg8","MezSWYOfrY","OxWIHQnJ1S",
+"9GXkXFPfSE","zqH0WZJTXH","Q6LixlsQGo","AIYUupvgjS","Zv7z0LbRTH","lH1kt0YAGH","a00b5i7WMQ","BFkb8ThjNn","Yh1hFqaofN","NcICARkQke",
+"45cIHeuZA5","VNCPdxReec","Cp3mZWMiS3","tvdkDqQxHP","gIYvEM3zXL","HfyNQCxVEf","QworuhUTw7","LDk6fkZANm","BbwgAZ4I1v","GSQwjnnP8o",
+"VNCPdVNCPd","oGu6xKr8ys","QClRLF6PT2","5ZaEzjiVBP","lm0pDy94nw","0h1b18hJdt","StlDJn8pJ9","JKWYR5iGN5","YOfrY16lHc","IjTwPfLNg8",
+"ni2v1Fhtgl","NOHszYw2oU","vOqCEt59lR","RACujI7p2a","ulk415nmWv","MmKGJhSSvQ","GWqqXRkQke","yofH3lsQGo","2Yz7E0MR5X","s7MxkAXpwE",
+"F6PT2WreyP","0MR5XQnJ1S","v8yFNn1pmO","IRh489GXkX","J2mQizHF1q","AXpwEGrDg7","G1RhSpWiOs","rKDLJDLhzM","v1HlnMojnP","0PktIpWiOs",
+"YjB9tX6Pin","djsrvYh1hF","RBhp0POUYS","JKWYRtjQxs","MojnPs4786","Cfgr3StlDJ","gIYvElCMxy","OxWIHWMiS3","FFDuiwDajX","WMiS3mz8gx",
+"Uvlv4Ss0Zu","xReec7hyVv","QnJ1Slm0pD","nnP8o2DREs","CxVEfPOUYS","n8pJ9UmaEv","oGu6xoGu6x","6q6L9IBe8k","FnPFBlViBv","ksJbylm0pD",
+"WMiS39GXkX","24ARFSjskQ","zmLYDQYxC0","5IhmGGSQwj","hUTw77fKYU","1LB1LW3VFH","CdyBVi3pyd","pmeCdSs0Zu","B3qempv0i7","vOqCEAgJHQ",
+"WaWsvRkQke","POUYSJkzUn","zz4ZUVNCPd","PYBf4CdyBV","9eoRcs93Ml","k85AefcJOy","M3zXL5Namm","QWxoTQ6Lix","hYBCKDG4sT","uQIczv2eC3",
+"s4786I7p2a","8hJdtUlU3M","7lUXZdmoS7","JJs5m7hyVv","ZzJHWZhwG1","UlU3MVBjhz","8FmFHv1Hln","i3pydK20wK","Ta8f6Uvlv4","xXTI4vLsmS",
+"WmadADG4sT","5nmWvTXQ0Z","FcWrW45cIH","aDGtSIKxdL","Twanon1pmO","0Wr5ynlaBy","aFFssyofH3","OxWIHatef2","azIWpbrhlQ","XyPZNCqqaD",
+"48cHLWMiS3","Waim6PYBf4","GrDg7GXdoH","pWiOsQ6Lix","RACujdQ586","xciqpb29RJ","Z4I1vyofH3","k85AeQChxs","VjCZqvOqCE","FVMxoY1mC0",
+"rhl0JPOUYS","BCxeCVIlwP","qUJMd7Ow5C","QClRL5ZaEz","6q6L9FwEJz","ciuWza00b5","Mm8siFwEJz","QssNCSs0Zu","NAFuwSjskQ","0MR5XSmGzv",
+"RzaZAciuWz","QnJ1S2Nslm","FnPFBOz8yZ","soy9t5nmWv","prNT6atef2","SmGzv5VZjS","7X3uycShY2","QworujeskS","B3qemlH1kt","tjQxslXFOB",
+"qaofNTXQ0Z","t98iWYw2oU","zz4ZUIjTwP","uJScXHzZT8","Fhtgl8FmFH","SjskQn8pJ9","0YAGHhi5X7","FjHXRfLNg8","WPmlxjiVBP","ZuDtD7hyVv",
+"uN6r3jS1aj","uvf7ACNHmv","DG4sTlpF6W","JXljW2Yz7E","RkQkebgJAz","pAhR1oQ87r","Ta8f6oGu6x","o8UydiwzGk","qQxHPtvdkD","a00b5CdyBV",
+"fcwDagIYvE","ix74r7fsYM","aFFss2Yz7E","zqH0WaL6AJ","Zv7z0FVMxo","QChxs0YAGH","hE1QlZhwG1","pFrrltuDyS","ciuWzFLsph","hSSvQK4GS8",
+"9XyT9MojnP","QbxXcmX2GE","d85a9he9IA","wDajXlXFOB","uAWypfcJOy","IBe8kMaJQs","LewvMW7cTs","RkQke580YD","iKqhrRACuj","Ul4a1OHaBz",
+"uTacx24ARF","5Nammi3pyd","GrDg7RmDcr","CxVEfSbRYy","IjTwPQ6Lix","5drc6d85a9","qaofNOxWIH","OxWIHJKWYR","7ku1p1j5L8","zHF1qoVQp6",
+"nnP8oB3qem","b29RJQbxXc","HP4338U2nU","pWiOsogLgc","uJScXcQOnv","Ul4a1S77LH","uvf7Am4bxU","QworuoVQp6","AXpwEHfyNQ","suY4xGWqqX",
+"8xEKzlj07Q","sx5GlpAhR1","hUTw7uTacx","n1pmOkB5nP","9rlg9ZUnqt","9iGoTdjsrv","AkKTktAOsr","ZUnqtzHF1q","Mkgy81j5L8","brhlQKsjRK",
+"FhtglMaJQs","FLsphi3pyd","QChxsni2v1","7hyVvIjTwP","RkQkeIBe8k","Ul4a1RBhp0","lweGygtCA5","SmGzvLewvM","LewvMAmdQd","9y4lwyvOMI",
+"okgRipAhR1","zQt6Q6AFT0","CNHmv8RCUA","tjQxsdQ586","l83UdTXQ0Z","W3VFHSs0Zu","64s8NFLsph","CNHmvJJs5m","QChxsCxVEf","pAhR1CIShG",
+"Pb1paQChxs","v2eC3Mm8si","HRxd8VLTy6","J2mQiGrDg7","O3iyQZuDtD","n1pmOokgRi","RmDcr7ku1p","yofH3aFFss","e6e4zHfyNQ","jSjS3fFDrJ",
+"KASQ8SbRYy","9GXkXWDVWJ","faHird85a9","RxrsmSWfou","djsrve6e4z","mz8gxFGzgp","OHaBzPYBf4","iKqhrKsjRK","YOfrYuAWyp","jzUqRCfgr3",
+"AmdQdv2eC3","24ARFBGaQY","uPX7GYOfrY","2DREslCMxy","C2IrcY1mC0","L7cGcS77LH","WreyPSbRYy","JRJQBs7Mxk","XflUqdmoS7","Ul4a1X6Pin",
+"HzZT8v1Hln","MmsIolViBv","guMb8pWiOs","AgJHQPb1pa","lm0pDlj07Q","9rlg9hYBCK","QWxoTGv3Fq","Yw2oUJkzUn","HRxd8kZANm","azIWpHlUbF",
+"64s8NzqH0W","RzaZAJKWYR","Ta8f6i3pyd","vkCHHOz8yZ","2NslmUl4a1","M6qcGDz1R3","soy9tTCgPp","fLNg8fLNg8","QClRLPYBf4","XflUqsuY4x",
+"QssNCsx5Gl","i7WMQd85a9","StlDJFGzgp","FVMxoSbRYy","9rlg9jSjS3","Mm8sii3pyd","7ku1p0Kyfs","ciuWzJkzUn","s93MlMmKGJ","atef2Vprf2",
+"uvf7AZJTXH","0Wr5y6q6L9","FNYIMIRh48","I7p2aaL6AJ","HRxd8taOXK","lViBvv8yFN","Cfgr35ZaEz","faHir5Mg9r","No0QbfcwDa","WDVWJ4W0Tl",
+"yToGW29QAz","RBhp00Kyfs","uoStws93Ml","mz8gxZzJHW","GXdoHulk41","QChxsuN6r3","jS1ajAkKTk","CdyBVThjNn","55rfBHfyNQ","9rlg9lweGy",
+"jeskSAgJHQ","1v5hHOz8yZ","0Wr5yJXljW","TwanoaDGtS","DcpWB7ku1p","pmeCdnFqik","580YD5ZaEz","3weIFFjHXR","M3zXLyofH3","2TRI7QChxs",
+"MojnPSWfou","48cHLEOE1o","cL0aERxrsm","nlaByFnPFB","dQ586UlU3M","ciuWz9rlg9","v8yFNv2eC3","d7vjMfFDrJ","NcICAVjCZq","aDGtSaDGtS",
+"K20wK5drc6","cL0aEHP433","HP433hYBCK","yEfy9K4GS8","29QAzni2v1","aez9yAmdQd","618Di0PktI","StlDJd7vjM","yEfy9guMb8","48cHLmX2GE",
+"8FmFH8U2nU","S2DfudhSuH","618DixReec","KZamHFFDui","W7cTsqaofN","vOqCETa8f6","2DREsWDVWJ","VIlwPCfgr3","RmDcrAXpwE","gf8rIAIYUu",
+"IBe8kjiVBP","ThjNnoVQp6","kZANmC2Irc","VjCZqGrDg7","djsrvCIShG","CdyBVdjsrv","GWqqXThjNn","JJs5m24ARF","5Mg9rbrhlQ","TwanopvgjS",
+"Mkgy8jeskS","xXTI4ni2v1","Vprf2Yf2Ec","BbwgAPOUYS","hSSvQhSSvQ","ZhwG1djsrv","UlU3Mt98iW","BpYhVyvOMI","dpe1vvkCHH","K20wKAgJHQ",
+"GrDg78FmFH","pAhR1VLTy6","lweGy0Kyfs","SWfouFwEJz","azIWpQbxXc","QWxoTxReec","jeskSY1mC0","fqypy1v5hH","cShY2d85a9","U3yw564s8N",
+"bZLvS7Ow5C","uQIczSjskQ","i7WMQRkQke","VLTy6K20wK","wiHrZG1RhS","h1zcH0Kyfs","AgJHQsqVrf","x3LDejiVBP","zFgtBMGlTF","Gv3Fqru4UG",
+"D6rByaez9y","zFgtBRBhp0","QClRLmz8gx","In3NSYf2Ec","lCMxyMGlTF","Pb1paGWqqX","hi5X7cmXIX","Zv7z0BGaQY","xciqpTXQ0Z","7ku1pZuDtD",
+"qaofNatef2","HRxd8Kr8ys","iB08lix74r","cQOnvRmDcr","tjQxsJXljW","tl72WCNHmv","IBe8kd85a9","taOXKsoy9t","pWiOsIRh48","4dEz6faHir",
+"kZANmSjskQ","cL0aEHfyNQ","uoStwYw2oU","AIYUulXFOB","W7cTsFhtgl","lViBvO3iyQ","ReKEW9eoRc","jfREuzqH0W","8hJdtJKWYR","5Drn0IRh48",
+"tlILtUmaEv","2ZHdkSjskQ","hUTw7OUqFM","Z4I1vhi5X7","9XyT9ZzJHW","5iGN51LB1L","Ul4a1lm0pD","nFqikMm8si","Mm8siZJTXH","pmeCdlweGy",
+"zmLYDOUqFM","7fsYMgtCA5","LDk6fx3LDe","LewvMhYBCK","ZUnqtwiHrZ","zz4ZUOUYuF","FhtglB3qem","oQ87r3weIF","ciuWzMojnP","3weIFs7Mxk",
+"RBhp0RzaZA","dQ586W3VFH","GrDg7KsjRK","5Mg9rn1pmO","uAWyp45cIH","IBe8kNOHsz","QworuTa8f6","hE1QlNo0Qb","7fKYU4dEz6","C2IrcHlUbF",
+"pT8wuVNCPd","vLsmStaOXK","0Wr5yNOHsz","pvgjStvdkD","qQxHPs93Ml","In3NSiB08l","Kr8ysAXpwE","v8yFNhe9IA","ECMvUS77LH","uZPqgGrDg7",
+"qQxHPNAFuw","14FLRaL6AJ","WDVWJHlUbF","ni2v1uN6r3","m4bxUAmdQd","zqH0WG1RhS","EdBKcn8pJ9","618Di14FLR","9y4lwydG8U","Cp3mZ7ku1p",
+"MmKGJP6bcg","W7cTs8cVD3","GXdoHdQ586","AkKTksoy9t","iqv4ki3pyd","P6bcgDcpWB","Yf2EcCfgr3","hE1QlFwEJz","Mm8siZ4I1v","AIYUuThjNn",
+"vOqCEW7cTs","zmLYDM3zXL","gdQsS4W0Tl","taOXKlpF6W","VBjhzOUqFM","b29RJZ4I1v","CqqaDI7p2a","1LB1Ld85a9","0KyfsoQ87r","9iGoTrhl0J",
+"WmadAzY1GY","s93MljiVBP","dQ586CxVEf","CxVEfcQOnv","9GXkXwiHrZ","1LB1L9XyT9","OHaBzRACuj","gdQsSJKWYR","RxrsmVprf2","7ku1pgdQsS",
+"ZuDtDHRxd8","aDGtSKr8ys","4W0TlK4GS8","4dEz6dhSuH","MGlTFGv3Fq","RsQUqtl72W","ru4UGy94nw","jS1aj64s8N","vLsmS618Di","W3VFHh1zcH",
+"NOHszl83Ud","cL0aES2Dfu","5nmWvyEfy9","RACujDz1R3","YjB9tnnP8o","5Mg9rokgRi","blLA9djsrv","tvdkDDcpWB","fqypyFVMxo","JKWYRMkgy8",
+"cL0aENo0Qb","uLtKsoQ87r","mX2GEZuDtD","fmIK1YjB9t","618DiDz1R3","t98iWjzUqR","sx5GlBbwgA","JkzUni7WMQ","RBhp0CK5W7","7hyVv8xEKz",
+"HRxd8B3qem","45cIHFcWrW","WmadARmDcr","rKDLJOUYuF","dpe1vKsjRK","YjB9tQ6Lix","ydG8UWPmlx","48cHLuQIcz","SbRYyOHaBz","vOqCEMGlTF",
+"9rlg95Namm","v8yFNQ6hMC","FjHXR7lUXZ","okgRihUTw7","ru4UGZuDtD","pFrrlQ6Lix","CNHmvSmGzv","UlU3MM3zXL","ni2v1gdQsS","Yw2oUfcJOy",
+"NOHszdmoS7","Ul4a1ReKEW","iwzGk9XyT9","gtCA5vLsmS","8hJdtrz7Ut","XflUqvOqCE","W3VFHZhwG1","hUTw7i7WMQ","Fhtgl7ku1p","qaofNOHaBz",
+"0PktI9iGoT","MezSWdQ586","0YAGHWMiS3","b29RJCK5W7","F6PT2ReKEW","fcJOyyluBx","aFFssFNYIM","ni2v1Vprf2","s4786RsQUq","o8UydP6bcg",
+"zQt6QuN6r3","580YD7hyVv","k85AeStlDJ","YOfrYMkgy8","P6bcgM6qcG","DG4sT5iGN5","QYxC0uTacx","zz4ZUQworu","uPX7Gd85a9","ReKEWhUTw7",
+"hSSvQ16lHc","soy9t2TRI7","9rlg9lm0pD","lH1ktsx5Gl","AkKTkcShY2","d85a9ECMvU","blLA9GXdoH","iB08lRACuj","qQxHPBpYhV","blLA97ku1p",
+"Mkgy8pFrrl","0Wr5y0ao3l","Zv7z0SWfou","EdBKcHP433","lkMUAStlDJ","9y4lwd85a9","sx5Gl5Namm","QChxswDajX","5VZjSZhwG1","vOqCEhE1Ql",
+"JKWYR4QMc9","s4786Waim6","n8pJ9aL6AJ","Y1mC0ReKEW","1LB1LgIYvE","BbwgA7Ow5C","iB08laDGtS","oGu6x4dEz6","uoStwuLtKs","jSjS3o8Uyd",
+"tjQxskB5nP","k85AeAkKTk","d7vjMECMvU","ZzJHWSbRYy","FcWrWQ6Lix","kB5nPtlILt","sx5GlAXpwE","HzZT8nlaBy","MK07YKsjRK","fmIK1lH1kt",
+"0ao3lJJs5m","jeskS7hyVv","lViBvFnPFB","t98iWdQ586","tvdkDZJTXH","HfyNQ8cVD3","yEfy9AXpwE","i7WMQQWxoT","kB5nPjeskS","tuDySciuWz",
+"fcwDaYjB9t","Vprf2KsjRK","FGzgpx3LDe","IBe8kNhXdu","WPmlxCxVEf","5Namm0BmCy","pv0i7CIShG","07n1cpiJSk","DLhzMlweGy","pFrrlX6Pin",
+"IBe8kOUYuF","Uvlv4fFDrJ","xXTI4S77LH","atef2jfREu","d85a9MezSW","VBjhzEOE1o","k85Ae64s8N","Chuy3tlILt","d85a95ZaEz","DG4sT8xEKz",
+"uAWypDcpWB","dpe1vMezSW","s93Mltl72W","2NslmStlDJ","JRJQB2hEEU","QworuzY1GY","FLsphK20wK","7fsYMHRxd8","AkKTksqVrf","OUYuFYjB9t",
+"7lUXZFwEJz","prNT6kB5nP","jfREu7hyVv","QChxsydG8U","Dz1R3JIqXi","F6PT2XflUq","4QMc9n1pmO","Vprf2QChxs","UmaEvi7WMQ","zHF1qGXdoH",
+"WaWsvK20wK","Nxx9VJXljW","x3LDeuupzk","ix74rmX2GE","lsQGo07n1c","3otm6WPmlx","jeskSAXpwE","FLsphEdBKc","9rlg9HfyNQ","MK07YK4GS8",
+"BGaQYTwano","ciuWzAkKTk","HRxd8lViBv","mz8gxRkQke","ix74rThjNn","HlUbFThjNn","vOqCE1v5hH","gjUTuazIWp","In3NSd85a9","fcwDaBCxeC",
+"QssNCCNHmv","Oz8yZGv3Fq","AIYUuuvf7A","FFDuiQChxs","QWxoTKASQ8","ThjNnuvf7A","QChxsaL6AJ","RACujHRxd8","l83UdQWxoT","9XyT9LewvM",
+"0ao3l5Mg9r","EOE1ojiVBP","8TxD7v2eC3","zQt6QjSjS3","S2Dfui7WMQ","iqv4kgf8rI","VBjhzgjUTu","3weIFJ2mQi","In3NStuDyS","KsjRK5nmWv",
+"8RCUAQworu","8cVD3jSjS3","vOqCEyEfy9","zbIYYbZLvS","2NslmJkzUn","vOqCEDcpWB","9eoRcyluBx","hUTw7VLTy6","0PktIKr8ys","zHF1q0ao3l",
+"GrDg7zbIYY","2NslmAXpwE","Dz1R3v8yFN","NOHszk85Ae","MmKGJFjHXR","WmadAPb1pa","cShY2iKqhr","HRxd829QAz","kZANmRkQke","8cVD3PYBf4",
+"Nxx9VlkMUA","yEfy92DREs","Mkgy85IhmG","O3iyQoQ87r","iB08l55rfB","P6bcg5VZjS","5Drn0FVMxo","i7WMQni2v1","t59lRcQOnv","h1zcHiqv4k",
+"DLhzM5ZaEz","QworuIBe8k","IRh48o8Uyd","Mm8si7fKYU","8U2nUjiVBP","uoStwoVQp6","d85a9BbwgA","SbRYyHP433","9iGoTfaHir","L7cGcpWiOs",
+"Mm8siCdyBV","Q6hMCQWxoT","No0QbS77LH","JkzUnK4GS8","BFkb8P6bcg","yluBx0MR5X","2ZHdkL7cGc","MmsIoFnPFB","uoStwhUTw7","AkKTkzFgtB",
+"yluBxlj07Q","55rfBVLTy6","14FLRzbIYY","9GXkXfLNg8","Yw2oUUl4a1","ZzJHWQClRL","tlILt14FLR","uupzknnP8o","VerEADG4sT","t98iW8FmFH",
+"AmdQdFxX9q","P6bcgfaHir","CNHmvfcJOy","Mkgy88hJdt","xciqp8cVD3","d7vjMiB08l","ksJby0Kyfs","qaofNWaim6","oGu6xLbRTH","PYBf4OHaBz",
+"cL0aEDLhzM","QssNCrKDLJ","lsQGoksJby","HfyNQDQimp","AOgEeEdBKc","6q6L9jS1aj","No0QbzqH0W","pmeCdAkKTk","hYBCKWPmlx","0PktIru4UG",
+"RzaZANOHsz","6AFT0BFkb8","euZA5xciqp","P6bcgfcJOy","9eoRcs4786","16lHccQOnv","zbIYYv1Hln","8hJdtCNHmv","sx5GlYw2oU","cQOnvxReec",
+"ECMvUtjQxs","cShY2Dz1R3","cShY2hE1Ql","O3iyQzFgtB","Yw2oUW7cTs","b29RJL7cGc","Waim6Q6Lix","9y4lwciuWz","mX2GE8cVD3","blLA9CxVEf",
+"VBjhzFVMxo","zqH0Wix74r","aDGtS9eoRc","IjTwPDz1R3","ogLgciKqhr","n8pJ92Nslm","29QAzuupzk","rKDLJmz8gx","uoStw5Namm","tl72WyofH3",
+"tl72WciuWz","lpF6WWDVWJ","v8yFNGSQwj","jtn0XfmIK1","0BmCyDLhzM","ix74rYh1hF","7hyVvbgJAz","RpBQmYw2oU","vOqCEjzUqR","OHaBzpFrrl",
+"v8yFN5VZjS","e6e4zhE1Ql","WreyPiB08l","OxWIH1v5hH","AXpwERxrsm","rKDLJfcwDa","b29RJWMiS3","Z4I1vVjCZq","s93MluJScX","IBe8kAkKTk",
+"4dEz6iKqhr","fFDrJKASQ8","uQIczfcwDa","i7WMQMkgy8","zQt6QzFgtB","2DREsCdyBV","GSQwjoVQp6","KASQ8JkzUn","n1pmOSjskQ","dpe1vo8Uyd",
+"SbRYyfqypy","NhXdu7X3uy","dQ586XyPZN","8hJdtzz4ZU","1LB1LJIqXi","FwEJzk85Ae","BCxeCiB08l","EOE1oPb1pa","8TxD7Uvlv4","WmadAXflUq",
+"pFrrllViBv","WMiS3l83Ud","QbxXc8TxD7","uPX7GUl4a1","CdyBVKsjRK","s4786J2mQi","pT8wupT8wu","5Mg9rAOgEe","Yw2oUCp3mZ","VjCZqVIlwP",
+"QssNCIRh48","lweGyHRxd8","kZANmuoStw","6q6L9GWqqX","ix74rD6rBy","SbRYytaOXK","zqH0W9rlg9","5Mg9rOUqFM","VNCPdjeskS","fcJOyaDGtS",
+"W3VFHokgRi","fqypyDcpWB","uJScX5Drn0","IBe8kb29RJ","pvgjS1j5L8","L7cGcuTacx","ZUnqtxciqp","U3yw55iGN5","0ao3lcmXIX","tuDyS1j5L8",
+"ix74rzHF1q","RBhp0y94nw","JKWYRRkQke","Ta8f6CIShG","CIShGd7vjM","P6bcgBpYhV","DcpWBjS1aj","AkKTkCNHmv","zY1GYyofH3","2Yz7ELbRTH",
+"UmaEv5nmWv","AkKTkQworu","pAhR1QChxs","EdBKcguMb8","3weIF2ZHdk","ksJbyMm8si","FjHXRQnJ1S","jeskSulk41","jiVBPfaHir","aFFssIBe8k",
+"CK5W7IKxdL","fcwDalkMUA","h1zcHyEfy9","uvf7Aiqv4k","7Ow5CGXdoH","JKWYRYOfrY","lpF6WKZamH","FPfSEiqv4k","GXdoH0Kyfs","s4786Nxx9V",
+"uPX7GfaHir","BpYhVdQ586","JIqXiv1Hln","WreyPLewvM","3otm6Rxrsm","7fsYMDz1R3","Gv3FqpT8wu","h1zcH1LB1L","IBe8kv8yFN","uZPqgQClRL",
+"9GXkXb29RJ","0MR5X8TxD7","vOqCE4W0Tl","faHir64s8N","AIYUudjsrv","FFDuiCNHmv","t98iWQYxC0","1j5L8580YD","AIYUuPOUYS","oGu6xnFqik",
+"euZA5P6bcg","SjskQ5nmWv","ZhwG1LbRTH","DG4sTNOHsz","Gv3Fqhi5X7","faHirF6PT2","djsrv2hEEU","FPfSE5ZaEz","zQt6QZ4I1v","zbIYYMmKGJ",
+"x3LDeMaJQs","RkQke8U2nU","Oz8yZRBhp0","EOE1oyEfy9","nFqikSmGzv","OUqFM0MR5X","i3pydAgJHQ","azIWpiwzGk","YOfrYFjHXR","Yf2EcfLNg8",
+"oVQp6Pb1pa","580YDmz8gx","HP433CK5W7","MmKGJgtCA5","X6PinS77LH","fmIK1AgJHQ","IjTwPqUJMd","i7WMQMmsIo","zQt6Q0Kyfs","zFgtBF6PT2",
+"VNCPdzFgtB","iKqhrNhXdu","Mm8simX2GE","yEfy9t98iW","RACujdjsrv","ru4UGOz8yZ","P6bcgSjskQ","HRxd8aL6AJ","vOqCEChuy3","VjCZqIKxdL",
+"NcICA5Mg9r","VjCZqprNT6","14FLRgtCA5","O3iyQCK5W7","yofH3JkzUn","uPX7GJXljW","B3qemIjTwP","0ao3lJKWYR","hi5X79eoRc","BGaQYG1RhS",
+"RzaZAUvlv4","9y4lwW7cTs","jtn0XHRxd8","JRJQBChuy3","2ZHdkfcwDa","hE1QlBbwgA","Ss0Zus93Ml","QYxC00ao3l","RxrsmwiHrZ","Q6hMCEoToP",
+"ru4UG0PktI","6q6L9prNT6","Q6Lix6q6L9","9GXkXUl4a1","Chuy3Cp3mZ","gtCA5nnP8o","AmdQdeuZA5","FGzgpblLA9","2hEEU5drc6","WreyPIBe8k",
+"SjskQxXTI4","4QMc9K20wK","prNT6vOqCE","brhlQ9rlg9","UmaEvd85a9","JkzUnVNCPd","4QMc9AOgEe","blLA9cQOnv","dhSuHydG8U","jiVBPYOfrY",
+"bgJAzhe9IA","e6e4zSbRYy","580YDzY1GY","gdQsSjfREu","zz4ZUuN6r3","Ss0ZuMkgy8","IBe8kuPX7G","U3yw5suY4x","8hJdtRACuj","FNYIM48cHL",
+"WreyPZuDtD","D6rByCxVEf","tvdkDSbRYy","n8pJ9s7Mxk","iwzGkSWfou","UmaEv580YD","NOHszNo0Qb","VBjhzWaim6","ix74rsqVrf","WDVWJx3LDe",
+"4dEz69y4lw","ZzJHWCK5W7","prNT6jeskS","Vprf2s4786","B3qemI7p2a","3otm6jeskS","ksJbylsQGo","AIYUuhSSvQ","No0QbMojnP","lXFOBHfyNQ",
+"QssNCVjCZq","BCxeCx3LDe","FjHXRGrDg7","EdBKc7hyVv","K4GS8ZUnqt","taOXKYOfrY","ZJTXH0Wr5y","FFDuik85Ae","3otm62Nslm","wDajXt59lR",
+"iqv4kjfREu","zHF1qmz8gx","7Ow5ClXFOB","PYBf4b29RJ","MK07Yhi5X7","jSjS35nmWv","JXljWpAhR1","OxWIHvOqCE","soy9trz7Ut","K4GS8XyPZN",
+"Cfgr3hSSvQ","5VZjSvLsmS","LbRTHF6PT2","4QMc9Q6Lix","GrDg7uJScX","NhXduKsjRK","FhtglCdyBV","GrDg7oVQp6","QnJ1Sx3LDe","hE1QljiVBP",
+"uQIczIjTwP","Dz1R3BFkb8","FxX9qMojnP","a00b5hE1Ql","RxrsmBbwgA","NAFuwGv3Fq","ciuWzStlDJ","5NammRpBQm","lsQGoru4UG","dpe1v0PktI",
+"0MR5XdmoS7","4W0Tlv8yFN","iwzGkdhSuH","5NammBpYhV","UlU3M7fsYM","uAWypKr8ys","WmadAGSQwj","fcJOyBbwgA","vOqCEVNCPd","JIqXii3pyd",
+"CIShGO3iyQ","Q6LixHlUbF","zQt6QbZLvS","JKWYR7Ow5C","fmIK1Ul4a1","QworuIKxdL","QYxC0dQ586","n1pmOWDVWJ","vOqCENhXdu","lweGyLDk6f",
+"o8UydfLNg8","zQt6QNcICA","bgJAz0h1b1","qQxHPcQOnv","KsjRKd85a9","vkCHHYjB9t","07n1cpv0i7","PYBf4gjUTu","FwEJznFqik","SbRYyRsQUq",
+"uJScXd7vjM","UmaEvFjHXR","0PktIBGaQY","Vprf2HfyNQ","lsQGoBpYhV","FPfSE5drc6","Cp3mZCNHmv","xciqplViBv","07n1cmX2GE","D6rByKsjRK",
+"ru4UGi7WMQ","CxVEfXyPZN","KASQ8GSQwj","Q6Lixi3pyd","5iGN5U3yw5","StlDJtuDyS","9GXkXpiJSk","QWxoT8FmFH","s4786EoToP","lViBvuoStw",
+"h1zcHhe9IA","OHaBzzY1GY","vkCHHSmGzv","mz8gxEdBKc","FNYIMxReec","n1pmOjfREu","Cfgr3fmIK1","RkQke7fsYM","Ss0ZuWmadA","AXpwEi3pyd",
+"2TRI7bgJAz","bgJAzDG4sT","JIqXi9GXkX","GrDg7kZANm","0YAGHv8yFN","ix74rReKEW","QClRLUlU3M","MaJQsMK07Y","VerEABCxeC","h1zcH8xEKz",
+"oGu6xIn3NS","YjB9tO3iyQ","9XyT9W7cTs","7Ow5CJXljW","6AFT0pWiOs","QssNCsuY4x","zQt6QYf2Ec","1LB1LStlDJ","pFrrlulk41","xXTI4Ta8f6",
+"hUTw7aez9y","2TRI78xEKz","L7cGcPOUYS","Dz1R3oGu6x","24ARFKsjRK","uTacxF6PT2","WmadAbrhlQ","x3LDeblLA9","FnPFBFNYIM","sx5GlJ2mQi",
+"CNHmvn8pJ9","MmKGJ1LB1L","ZJTXHNxx9V","Vprf2pWiOs","AOgEe5drc6","ZuDtDHfyNQ","K4GS8StlDJ","FxX9q0BmCy","In3NSReKEW","dQ586Cfgr3",
+"ksJbyb29RJ","YOfrYtAOsr","JJs5mfcwDa","i7WMQ9iGoT","lH1kt14FLR","ZzJHW0YAGH","rhl0JYjB9t","dhSuH2Yz7E","tvdkDzmLYD","1v5hHChuy3",
+"Chuy3RsQUq","9eoRcuPX7G","prNT614FLR","NAFuwpiJSk","dmoS7P6bcg","aDGtSydG8U","9XyT91j5L8","x3LDe0h1b1","55rfB7fKYU","FwEJz0YAGH",
+"VNCPdCfgr3","OHaBz7X3uy","KASQ8jSjS3","HRxd8uPX7G","HzZT88xEKz","S77LHYh1hF","zHF1qNAFuw","taOXKTwano","tvdkDwiHrZ","KASQ8WaWsv",
+"hE1QlwDajX","uJScXQ6hMC","S2DfuMm8si","GSQwjKsjRK","VNCPdl83Ud","lXFOBC2Irc","4QMc9QnJ1S","Ss0ZujeskS","dmoS7okgRi","hi5X71LB1L",
+"gIYvErhl0J","64s8NMmKGJ","RxrsmDLhzM","ZJTXHlViBv","8U2nU2Yz7E","Dz1R3FxX9q","Yf2EcfmIK1","BGaQYv1Hln","5VZjSFGzgp","x3LDen1pmO",
+"Z4I1vdQ586","CqqaDCqqaD","wiHrZlsQGo","l83Ud0ao3l","7ku1pmz8gx","AIYUu0PktI","jSjS3TXQ0Z","FGzgpGSQwj","iB08l2TRI7","gIYvERzaZA",
+"KZamHOxWIH","rz7Ut0ao3l","580YDUlU3M","lweGyk85Ae","0PktIBbwgA","kZANm55rfB","uN6r3djsrv","Zv7z0taOXK","oVQp6BGaQY","lH1ktFjHXR",
+"NOHszEOE1o","Uvlv4OUYuF","UmaEvgdQsS","hUTw7s7Mxk","soy9tlkMUA","lCMxyzQt6Q","qQxHPjiVBP","tjQxsWPmlx","fLNg8YjB9t","7Ow5CaL6AJ",
+"Ss0ZunlaBy","aFFssZzJHW","fmIK1WPmlx","uTacxlsQGo","FxX9qHlUbF","3otm6ogLgc","Ss0ZuFhtgl","BpYhVaez9y","IjTwPzFgtB","VjCZqPb1pa",
+"ReKEWulk41","uPX7GStlDJ","dmoS7Kr8ys","64s8Ni7WMQ","aez9yHlUbF","cmXIXoVQp6","uZPqgGXdoH","fcJOypv0i7","9y4lwlViBv","tAOsr14FLR",
+"AIYUu14FLR","aez9yIjTwP","OHaBzciuWz","x3LDezQt6Q","uvf7AfaHir","Uvlv4WmadA","BFkb8rz7Ut","SmGzvtjQxs","QworuUlU3M","PYBf40ao3l",
+"o8Uyd45cIH","fcwDaQWxoT","CIShGJJs5m","QnJ1SStlDJ","OHaBzulk41","BCxeClm0pD","NAFuwQWxoT","HRxd8ulk41","6q6L9t59lR","hSSvQqaofN",
+"lm0pDbZLvS","Waim62ZHdk","Oz8yZlsQGo","atef2b29RJ","5Mg9rYh1hF","QnJ1SzmLYD","BGaQYpAhR1","prNT6IKxdL","lkMUA0YAGH","JIqXiZUnqt",
+"AmdQdMojnP","aFFssKr8ys","uAWypjSjS3","RBhp0lpF6W","d85a9uupzk","RpBQmMezSW","lweGyjfREu","5VZjShE1Ql","uAWypMK07Y","IKxdLW3VFH",
+"n1pmOlm0pD","XflUqfcwDa","7lUXZLDk6f","rhl0Jk85Ae","fqypyMaJQs","QYxC0X6Pin","VLTy6kZANm","bgJAz7X3uy","0h1b1SjskQ","RzaZAoVQp6",
+"hYBCK48cHL","IjTwPYjB9t","FVMxoUlU3M","t98iWC2Irc","zFgtB8RCUA","HP433EdBKc","64s8NZUnqt","8TxD7tuDyS","MezSWYjB9t","VjCZqyToGW",
+"MojnP8FmFH","Ta8f6FjHXR","7lUXZeuZA5","F6PT2oVQp6","ksJbypmeCd","7fKYUlpF6W","8xEKzguMb8","0Wr5yhE1Ql","P6bcggIYvE","s93Mlulk41",
+"o8UydCdyBV","zFgtB5VZjS","7fKYUn1pmO","hUTw7iqv4k","16lHcgf8rI","Mkgy8MmsIo","uQIcz2DREs","OHaBzfFDrJ","Fhtgl5VZjS","i7WMQzFgtB",
+"k85AeM6qcG","AOgEetuDyS","AXpwEpT8wu","nnP8o7fKYU","he9IArKDLJ","WDVWJgf8rI","0h1b1x3LDe","Y1mC0jeskS","a00b5KsjRK","TwanoSjskQ",
+"WaWsvpFrrl","wDajXyToGW","ogLgcSs0Zu","8xEKzbrhlQ","qQxHPt59lR","5nmWvjiVBP","jtn0XLbRTH","55rfBVIlwP","BCxeCFNYIM","618DihSSvQ",
+"RzaZA45cIH","0KyfsdmoS7","jiVBPgIYvE","TwanoCqqaD","VBjhz8RCUA","MezSW9eoRc","xXTI4Yf2Ec","29QAz8FmFH","h1zcHt98iW","ru4UGpFrrl",
+"AgJHQfcJOy","pT8wutvdkD","ksJby29QAz","D6rByksJby","wDajXhUTw7","GrDg70BmCy","KASQ85Namm","taOXKK20wK","cShY2RACuj","vkCHHx3LDe",
+"D6rBysoy9t","zmLYDJkzUn","uQIczvOqCE","FFDuiQbxXc","GSQwjbgJAz","mz8gx24ARF","aFFssCfgr3","yToGWjtn0X","i7WMQNAFuw","wiHrZ45cIH",
+"0PktIEdBKc","3weIF7Ow5C","qaofNQssNC","ZJTXHTCgPp","iKqhr5Mg9r","O3iyQdpe1v","YjB9tGXdoH","9rlg9KsjRK","pAhR1lpF6W","ECMvUyToGW",
+"BbwgARkQke","NhXduX6Pin","FLsphfcwDa","CxVEfjfREu","UlU3Mmz8gx","yEfy9uQIcz","ZzJHWECMvU","VNCPdRkQke","Q6hMCaL6AJ","t98iWReKEW",
+"iwzGk7hyVv","XflUqL7cGc","WDVWJJIqXi","jiVBPIBe8k","y94nwOxWIH","m4bxUKZamH","fqypywiHrZ","prNT65Drn0","b29RJP6bcg","1j5L8Chuy3",
+"AXpwEFjHXR","Gv3FqQWxoT","S2DfuK4GS8","pmeCdB3qem","BFkb8pmeCd","ZzJHWL7cGc","0ao3lk85Ae","64s8NDLhzM","tl72WFwEJz","ksJbycL0aE",
+"16lHcQChxs","pmeCdbgJAz","uZPqgPYBf4","Mkgy8QnJ1S","29QAztlILt","JkzUnJIqXi","WaWsv8FmFH","VIlwPaDGtS","HlUbF4W0Tl","VjCZqoGu6x",
+"tl72Wd85a9","QChxsnnP8o","oVQp6Dz1R3","Nxx9VqQxHP","7hyVvmz8gx","16lHc8TxD7","AIYUuuPX7G","lkMUAWmadA","HRxd8KsjRK","8RCUAix74r",
+"nFqikv2eC3","yEfy9B3qem","yvOMIhi5X7","v1HlnsqVrf","0Wr5yix74r","MaJQsAIYUu","fmIK10ao3l","ZzJHWgdQsS","9rlg9QClRL","0PktI4QMc9",
+"HfyNQd7vjM","lXFOBh1zcH","djsrvdjsrv","29QAzEdBKc","lkMUARBhp0","VNCPdPOUYS","zQt6QCdyBV","7fsYMvLsmS","Cfgr3CIShG","Ta8f6GSQwj",
+"W7cTsdhSuH","uvf7A0PktI","JIqXiyToGW","gdQsStAOsr","ru4UG0Wr5y","KsjRKHlUbF","pv0i77hyVv","iqv4kiqv4k","OHaBzaDGtS","WMiS3mX2GE",
+"M6qcGfmIK1","nnP8oi7WMQ","8RCUArz7Ut","t98iWlkMUA","pFrrlyEfy9","i7WMQMm8si","hE1QlpFrrl","6AFT0aez9y","suY4x1v5hH","DG4sTAkKTk",
+"xciqp5Drn0","7lUXZ8FmFH","MojnPjfREu","BbwgApAhR1","FnPFBGSQwj","djsrv3weIF","zFgtBWmadA","bgJAz7fKYU","d7vjM0YAGH","MojnPKZamH",
+"BGaQY1j5L8","JJs5mcShY2","Z4I1vDG4sT","Vprf2CdyBV","0BmCyU3yw5","HlUbFFVMxo","IKxdLbgJAz","lXFOBrhl0J","i7WMQjzUqR","MK07YGSQwj",
+"5Nammsx5Gl","7lUXZThjNn","HfyNQFGzgp","mz8gxKr8ys","BpYhVjzUqR","tl72WMezSW","GWqqXzz4ZU","YjB9tpFrrl","dQ586MmsIo","aFFssfmIK1",
+"zmLYD7X3uy","D6rByD6rBy","6AFT0hi5X7","Q6hMCU3yw5","uZPqg5Drn0","cQOnvMaJQs","uN6r3IjTwP","POUYSAgJHQ","dhSuHpWiOs","MezSW24ARF",
+"PYBf4VjCZq","RxrsmPYBf4","8U2nUFnPFB","4dEz6OxWIH","uZPqgQChxs","0PktICqqaD","3otm614FLR","gjUTuvkCHH","uLtKs4QMc9","cL0aEjtn0X",
+"8FmFHs93Ml","S2DfuSs0Zu","bZLvS8TxD7","iB08l29QAz","jiVBPAXpwE","ydG8U9GXkX","e6e4zblLA9","NhXduh1zcH","G1RhS6AFT0","yvOMIpT8wu",
+"5nmWv1j5L8","Ta8f6lkMUA","taOXKKsjRK","atef2uQIcz","VBjhzd85a9","n8pJ9FNYIM","VBjhzNo0Qb","MojnPtlILt","RmDcrRBhp0","xXTI4e6e4z",
+"GSQwjVLTy6","ReKEWxXTI4","zbIYYSs0Zu","Gv3FqFNYIM","oGu6xK4GS8","cShY2JIqXi","mz8gxhE1Ql","aDGtSSjskQ","POUYS7fsYM","CK5W7S77LH",
+"dQ586NhXdu","oGu6xB3qem","D6rByVprf2","Vprf2nFqik","gf8rIdQ586","uvf7A580YD","taOXKOHaBz","bgJAzMm8si","CNHmvtlILt","8U2nU0YAGH",
+"djsrvOHaBz","Zv7z0Waim6","0PktItl72W","BFkb8bgJAz","OUYuFQ6hMC","gIYvEYh1hF","dQ586lViBv","7X3uy7Ow5C","t98iW5VZjS","azIWpgf8rI",
+"618DiBCxeC","iB08lY1mC0","QChxsMm8si","GWqqXnnP8o","uoStwOz8yZ","EdBKcVerEA","y94nwMezSW","mX2GEpWiOs","ReKEWRkQke","ix74rn1pmO",
+"MGlTFQ6hMC","CK5W7Yh1hF","euZA5s4786","K4GS8b29RJ","TCgPpYjB9t","bgJAzVLTy6","QClRL8cVD3","gdQsSsqVrf","dpe1vjSjS3","vOqCEL7cGc",
+"6AFT0i7WMQ","yluBxQ6hMC","StlDJuN6r3","6AFT08FmFH","24ARFuAWyp","HzZT8KASQ8","Ss0ZuFPfSE","9y4lw1j5L8","ksJbyYf2Ec","M6qcGTXQ0Z",
+"faHirKZamH","X6PinzqH0W","KsjRKQ6Lix","FGzgp7Ow5C","oGu6xkB5nP","0YAGHd85a9","VNCPdhE1Ql","b29RJOUqFM","okgRii7WMQ","ThjNnYjB9t",
+"lweGyBCxeC","o8Uyd07n1c","29QAzWreyP","Y1mC0VBjhz","RmDcrQWxoT","HfyNQksJby","QbxXcQworu","VNCPdO3iyQ","faHirJ2mQi","XyPZNuvf7A",
+"RpBQmFnPFB","Y1mC0v1Hln","AgJHQdpe1v","DcpWBQnJ1S","2NslmfcJOy","k85AehSSvQ","jiVBPFPfSE","yvOMIbZLvS","QYxC0Vprf2","d7vjM2Nslm",
+"14FLRh1zcH","No0QbzbIYY","SbRYyhYBCK","WMiS3RzaZA","PYBf40MR5X","BFkb8pT8wu","dhSuHyvOMI","jS1ajJRJQB","8hJdtOUqFM","MmsIoiKqhr",
+"jzUqRPYBf4","VerEAfLNg8","EoToPYjB9t","DcpWBEdBKc","zHF1qjzUqR","cQOnvFFDui","Y1mC0tlILt","LewvMzQt6Q","8TxD70h1b1","4W0TlzY1GY",
+"d85a9pT8wu","XyPZNHzZT8","ThjNnJXljW","FxX9qsx5Gl","guMb8KZamH","uupzkPOUYS","0KyfsZ4I1v","nFqiktuDyS","AOgEe1v5hH","ydG8U8FmFH",
+"ZuDtDJ2mQi","HzZT89iGoT","ZzJHWVIlwP","piJSkUl4a1","CqqaDGWqqX","ulk41qUJMd","tuDySAmdQd","AmdQdksJby","JkzUnWmadA","guMb8CdyBV",
+"e6e4z2TRI7","dmoS7Ul4a1","14FLRQClRL","RxrsmZ4I1v","CxVEfS77LH","VerEA7X3uy","mz8gxPYBf4","ulk41Ta8f6","8hJdtdQ586","KsjRKFjHXR",
+"lsQGoUl4a1","2Yz7EDQimp","DLhzMblLA9","NOHszOxWIH","h1zcHprNT6","fLNg8cShY2","hUTw75nmWv","VerEAuTacx","VLTy6IjTwP","pFrrluLtKs",
+"5nmWvUl4a1","MGlTFhE1Ql","Zv7z0pvgjS","xciqpzFgtB","he9IAQWxoT","W3VFHoVQp6","uJScXReKEW","Oz8yZ2DREs","Q6LixCdyBV","8hJdtZv7z0",
+"Zv7z0OHaBz","NAFuwMmKGJ","pvgjSAXpwE","faHirAgJHQ","Waim6iKqhr","jS1ajnnP8o","0MR5Xatef2","dpe1vnFqik","MmsIoFNYIM","NhXduNAFuw",
+"qUJMdRxrsm","v2eC32hEEU","taOXKbZLvS","vLsmSMaJQs","Uvlv4WreyP","XyPZNjSjS3","JRJQBW3VFH","x3LDeaL6AJ","yvOMIksJby","2DREsReKEW",
+"B3qemrhl0J","KZamH0ao3l","1v5hHYOfrY","piJSkzz4ZU","0h1b1P6bcg","Pb1paPOUYS","FjHXRNxx9V","oVQp6BFkb8","jfREu580YD","StlDJOHaBz",
+"3otm6FFDui","IjTwPi7WMQ","d85a9JJs5m","8RCUAlj07Q","VBjhzFFDui","0PktI8cVD3","o8UydnnP8o","SjskQtuDyS","zz4ZURkQke","K4GS8MK07Y",
+"G1RhSlH1kt","O3iyQtAOsr","16lHcS77LH","BFkb80BmCy","tvdkDhYBCK","CdyBVMmKGJ","ru4UG7lUXZ","wDajXCqqaD","tlILtiwzGk","lH1ktoQ87r",
+"IjTwPbgJAz","2TRI7XflUq","Waim6lH1kt","RACuj9GXkX","jiVBPHP433","suY4xm4bxU","24ARF0Kyfs","Pb1palXFOB","5nmWvJkzUn","rKDLJpv0i7",
+"2NslmSmGzv","B3qempAhR1","mX2GEsuY4x","Z4I1vwDajX","v1Hln1v5hH","mz8gxUlU3M","zqH0Wuupzk","RzaZARzaZA","Dz1R3rz7Ut","JXljWuoStw",
+"qUJMdDz1R3","HfyNQVLTy6","Zv7z0RBhp0","B3qem24ARF","DLhzM1j5L8","QClRLU3yw5","Ul4a1jiVBP","tjQxsHlUbF","FhtglOxWIH","Mm8si7X3uy",
+"IKxdLB3qem","StlDJpFrrl","jeskSWMiS3","JKWYRGSQwj","RpBQm5Drn0","gIYvE9iGoT","n1pmOGrDg7","P6bcg580YD","VjCZqVNCPd","IjTwPUl4a1",
+"jS1ajFGzgp","uN6r3KASQ8","CK5W7uvf7A","FjHXRMm8si","1j5L82DREs","cmXIXKASQ8","6AFT0xReec","NOHsziKqhr","bgJAzMkgy8","CdyBVRACuj",
+"Nxx9VlH1kt","qaofNJKWYR","CdyBV2ZHdk","NcICAKsjRK","QnJ1S7X3uy","Ss0ZuuQIcz","14FLRgIYvE","uQIczNOHsz","Ta8f6v2eC3","8hJdtlm0pD",
+"3otm6ydG8U","euZA5ZJTXH","24ARFuvf7A","oVQp6Y1mC0","Gv3FqRACuj","Yf2EcpmeCd","P6bcgiqv4k","M3zXLJKWYR","NcICAMK07Y","B3qemWaWsv",
+"Kr8ysOHaBz","24ARFNOHsz","GWqqXbgJAz","JIqXiGXdoH","e6e4zK4GS8","1j5L88hJdt","VjCZqn8pJ9","k85AeeuZA5","5nmWvcL0aE","JkzUnaDGtS",
+"JRJQBtjQxs","4dEz6OUYuF","yvOMIVjCZq","0PktIK20wK","kB5nPfLNg8","s93Ml4dEz6","J2mQiydG8U","fcJOynFqik","4dEz6RmDcr","e6e4zCxVEf",
+"EOE1oUlU3M","y94nwi3pyd","5IhmGEoToP","Dz1R37lUXZ","7X3uykB5nP","OxWIHIKxdL","suY4xDQimp","K4GS8hSSvQ","8cVD3lXFOB","zmLYDB3qem",
+"yluBxGSQwj","jtn0XI7p2a","yluBxsx5Gl","K20wKnnP8o","xXTI4oQ87r","RzaZAVprf2","QWxoTlCMxy","YOfrYBpYhV","5IhmGoQ87r","pmeCdO3iyQ",
+"VNCPdZzJHW","n1pmOtlILt","Qworu9eoRc","faHirIKxdL","FVMxoHP433","16lHcFLsph","d85a9cQOnv","zmLYDhSSvQ","jfREuK4GS8","gIYvE45cIH",
+"POUYShe9IA","s7MxklXFOB","Cfgr3zQt6Q","QbxXcrKDLJ","Waim6XyPZN","7fsYM2hEEU","Vprf29eoRc","7lUXZJJs5m","fqypylH1kt","QbxXcn8pJ9",
+"5Drn0K20wK","sqVrfv2eC3","atef2cShY2","AIYUuAgJHQ","48cHL2TRI7","jzUqRzmLYD","QssNCzqH0W","Cfgr3RkQke","MaJQsRsQUq","K4GS8vLsmS",
+"cShY2618Di","FhtglThjNn","I7p2ayToGW","RzaZASs0Zu","CxVEf0h1b1","HfyNQC2Irc","uLtKsyluBx","iwzGkNOHsz","rz7UtxXTI4","4dEz6Ta8f6",
+"NcICAUl4a1","lXFOB7Ow5C","euZA5jiVBP","kZANmwDajX","ZhwG1vkCHH","GrDg7DcpWB","45cIHHlUbF","NAFuw9eoRc","VjCZqx3LDe","dhSuHFGzgp",
+"1LB1LwDajX","PYBf4MK07Y","Yh1hFK20wK","ZzJHWs93Ml","KZamH3otm6","cmXIX0MR5X","S2DfuS77LH","jtn0XgdQsS","atef2K4GS8","HRxd8i3pyd",
+"4dEz6ZzJHW","RzaZApT8wu","9XyT95iGN5","8TxD7zQt6Q","2hEEUEOE1o","9XyT9jeskS","zFgtB618Di","GWqqX9rlg9","ZzJHWlpF6W","Zv7z0SmGzv",
+"MmKGJCfgr3","MmsIoStlDJ","QChxsuupzk","fcJOydpe1v","guMb8Zv7z0","hi5X7lkMUA","0h1b1dmoS7","dpe1vi7WMQ","oQ87rDz1R3","ogLgcFjHXR",
+"0BmCyNo0Qb","yluBxGv3Fq","cmXIXYh1hF","CdyBVWDVWJ","AIYUuk85Ae","VjCZqM6qcG","uAWyp07n1c","XyPZNyToGW","In3NSJIqXi","yvOMInnP8o",
+"ZuDtDlH1kt","OxWIHUmaEv","5IhmG2hEEU","WaWsv5drc6","uTacxIjTwP","YOfrYQworu","prNT66q6L9","FcWrWnnP8o","G1RhSZuDtD","t59lRn1pmO",
+"v8yFNDQimp","Fhtglsoy9t","DG4sTyvOMI","6AFT0UlU3M","48cHLThjNn","J2mQiOz8yZ","QClRL7hyVv","8TxD7ThjNn","VjCZq64s8N","vLsmS29QAz",
+"tlILtWaWsv","580YDAXpwE","hUTw7PYBf4","K4GS8VBjhz","jzUqRfFDrJ","mz8gxulk41","4dEz65Namm","lsQGon1pmO","yluBx2Yz7E","GXdoHv8yFN",
+"he9IA7lUXZ","lj07Q2TRI7","gIYvEcL0aE","Z4I1vKr8ys","fFDrJk85Ae","MGlTFGWqqX","LDk6fTXQ0Z","9rlg93otm6","qQxHPgtCA5","B3qemtlILt",
+"NcICAVprf2","vkCHHC2Irc","yofH3he9IA","FxX9qxXTI4","8U2nUhUTw7","9rlg9RkQke","soy9th1zcH","FxX9qYw2oU","FNYIM5iGN5","QbxXckB5nP",
+"CdyBVnlaBy","IBe8kAmdQd","brhlQ1j5L8","prNT6NAFuw","8RCUAwiHrZ","aez9yYh1hF","8TxD7xXTI4","X6PinFNYIM","iwzGkfcwDa","C2IrcXflUq",
+"uTacxzz4ZU","FjHXRCdyBV","BbwgAs93Ml","9y4lwuN6r3","9y4lwzz4ZU","CIShG1LB1L","AkKTkFGzgp","Yw2oU7fKYU","kZANmQ6Lix","v8yFN8FmFH",
+"MmsIoUl4a1","uQIczReKEW","4QMc9kB5nP","JIqXiX6Pin","ni2v1fcJOy","yvOMIGrDg7","EdBKcNxx9V","lj07QjiVBP","HzZT8qaofN","FcWrWI7p2a",
+"K20wKprNT6","lj07Q2hEEU","dpe1vYw2oU","ZzJHWSs0Zu","UlU3MLewvM","AOgEeprNT6","MmsIoTXQ0Z","v2eC3he9IA","s47862hEEU","fmIK1MmsIo",
+"JIqXiydG8U","e6e4zVprf2","5Mg9rzbIYY","618DiUmaEv","gdQsSzHF1q","9iGoTzbIYY","atef2yToGW","ydG8U8xEKz","KASQ8FnPFB","618DiYf2Ec",
+"djsrvDz1R3","yluBxpFrrl","mz8gx5iGN5","NhXdun8pJ9","uZPqg9GXkX","AOgEeIKxdL","Nxx9VhE1Ql","0BmCyrKDLJ","Waim6Nxx9V","VNCPdQbxXc",
+"tuDySTCgPp","5ZaEzKASQ8","n1pmOFVMxo","TCgPpNcICA","24ARFJJs5m","tAOsrFNYIM","uLtKsRkQke","Ss0ZufcJOy","QWxoThE1Ql","gf8rIKr8ys",
+"cShY2iB08l","Yh1hFt98iW","v2eC3W3VFH","Yf2EcBGaQY","MK07YHzZT8","Waim6fcJOy","uJScXWPmlx","iqv4kzbIYY","uPX7Gn1pmO","Chuy3Zv7z0",
+"jfREuKZamH","m4bxUTCgPp","lj07QQssNC","gdQsSQ6hMC","7Ow5CvOqCE","RxrsmFGzgp","SbRYyjfREu","vkCHHQworu","jSjS3IKxdL","FjHXR0MR5X",
+"AXpwEeuZA5","atef2zqH0W","RpBQm8TxD7","BCxeCnFqik","oVQp6cmXIX","KASQ8lkMUA","UlU3MlsQGo","2Yz7ExReec","jeskSiKqhr","FjHXRtl72W",
+"Vprf2vLsmS","vOqCExReec","UmaEvHlUbF","618DiMGlTF","v8yFNsoy9t","bZLvSgdQsS","Ss0ZuIjTwP","FjHXRqaofN","Mm8sini2v1","uLtKs7fsYM",
+"29QAzWmadA","RACujd85a9","WaWsv4dEz6","uPX7GUmaEv","OHaBztAOsr","FcWrWjeskS","lViBvRACuj","WreyPZUnqt","Twanoulk41","tuDyShe9IA",
+"5iGN5M6qcG","3weIFvOqCE","t59lRY1mC0","v1Hlnt59lR","618Did7vjM","lm0pDBFkb8","s47860Wr5y","s93MlMojnP","9iGoTDcpWB","zHF1qDLhzM",
+"No0Qbdpe1v","8FmFHOUYuF","J2mQidQ586","ix74r7Ow5C","prNT6rKDLJ","jSjS3uLtKs","s4786GWqqX","aFFsspWiOs","GWqqXNxx9V","D6rByFVMxo",
+"Ss0ZuoGu6x","uPX7Gtl72W","HlUbFyofH3","y94nwuPX7G","ksJby1j5L8","HP433UlU3M","t59lRrhl0J","580YDqaofN","ogLgcnlaBy","CdyBV2TRI7",
+"ydG8Ulj07Q","ZJTXHAIYUu","v1HlnKASQ8","SbRYypFrrl","OHaBzNo0Qb","djsrvlpF6W","lm0pDogLgc","lsQGoCxVEf","he9IAlH1kt","RxrsmMm8si",
+"TCgPpMm8si","AOgEedpe1v","i3pyd8xEKz","TXQ0Zv2eC3","MmsIodmoS7","wDajXuJScX","Zv7z0No0Qb","NOHsz9XyT9","AkKTklpF6W","iB08lhYBCK",
+"7hyVvlj07Q","gIYvEhE1Ql","K4GS8pFrrl","zQt6QQWxoT","soy9tgdQsS","CqqaDmX2GE","0Wr5ypFrrl","zmLYD07n1c","s4786ydG8U","jSjS3jSjS3",
+"Z4I1vLewvM","8TxD7TXQ0Z","0ao3lFGzgp","AXpwEdjsrv","WMiS3O3iyQ","B3qemh1zcH","tvdkDsuY4x","qUJMdTa8f6","1j5L8QWxoT","taOXKv1Hln",
+"uupzk6q6L9","0BmCyuQIcz","ksJby5IhmG","gtCA5GSQwj","8cVD3oQ87r","a00b5Oz8yZ","9XyT9FwEJz","DG4sT618Di","hE1Qlxciqp","m4bxUJKWYR",
+"LbRTHlXFOB","K4GS8HRxd8","azIWpJRJQB","fmIK1djsrv","brhlQgtCA5","Z4I1vDz1R3","OxWIHAkKTk","0h1b1B3qem","KZamHJRJQB","FcWrWjtn0X",
+"Ss0ZuzmLYD","jS1ajO3iyQ","jfREuaL6AJ","Zv7z0pv0i7","9XyT9K20wK","YOfrYksJby","zz4ZUuLtKs","M3zXL48cHL","k85AeLDk6f","C2IrcWaim6",
+"WDVWJHfyNQ","ECMvUuLtKs","x3LDeyEfy9","Q6hMCKsjRK","zFgtBK4GS8","Vprf2uJScX","2ZHdkGSQwj","OUqFMgf8rI","Oz8yZdpe1v","WmadA5Mg9r",
+"yEfy9oGu6x","FwEJzBbwgA","s4786pT8wu","e6e4zMkgy8","s7MxkJJs5m","OUYuF5IhmG","SjskQlj07Q","In3NSx3LDe","ciuWzWaWsv","tjQxsMaJQs",
+"XflUqxReec","ThjNn2Nslm","guMb845cIH","ZUnqtMK07Y","UmaEvnnP8o","hSSvQciuWz","LbRTHfcwDa","hUTw7hE1Ql","9eoRcQClRL","7lUXZ7X3uy",
+"t59lRGv3Fq","5NammjzUqR","qQxHP0BmCy","pAhR1oVQp6","JXljWh1zcH","DcpWBbgJAz","Q6hMCpmeCd","16lHc8U2nU","8FmFH5ZaEz","CK5W7aL6AJ",
+"0ao3lSjskQ","Cp3mZBGaQY","0MR5X4W0Tl","M3zXLQ6hMC","atef2gdQsS","fFDrJdpe1v","jfREugIYvE","n8pJ9pT8wu","4W0TlogLgc","0MR5XuAWyp",
+"fcJOypmeCd","ix74rzY1GY","tuDySJkzUn","Chuy3gf8rI","lm0pDJJs5m","pmeCdIn3NS","5iGN5kZANm","e6e4zgIYvE","VIlwP55rfB","EoToPatef2",
+"qUJMd3otm6","aez9yt59lR","9XyT9GXdoH","iwzGkNAFuw","d7vjMWaim6","e6e4z8FmFH","ru4UG48cHL","ReKEW5VZjS","I7p2auvf7A","FjHXRVLTy6",
+"uAWyp0Wr5y","mz8gxDG4sT","AOgEetAOsr","KsjRKgIYvE","PYBf4LDk6f","o8UydRpBQm","pmeCdDcpWB","2Yz7E7Ow5C","zY1GYTCgPp","RkQke7ku1p",
+"zY1GYkB5nP","iKqhrUvlv4","RmDcr29QAz","BGaQYRzaZA","64s8NlkMUA","QnJ1ScQOnv","zqH0W8cVD3","9y4lwm4bxU","pFrrlQClRL","xciqpdmoS7",
+"W7cTsSjskQ","5IhmG0YAGH","0h1b1jSjS3","JXljWHzZT8","nlaByn8pJ9","ru4UG4W0Tl","L7cGcpFrrl","K4GS80BmCy","jS1ajBbwgA","QssNC7lUXZ",
+"ksJbyjeskS","qaofNVBjhz","XflUqFLsph","Gv3FqoVQp6","NAFuwpWiOs","UmaEvQworu","lpF6WpmeCd","AIYUuDQimp","C2Ircni2v1","CIShGF6PT2",
+"RBhp0Gv3Fq","RBhp0QnJ1S","5ZaEz5iGN5","QChxsoVQp6","x3LDeNo0Qb","ru4UGblLA9","D6rByHP433","FPfSEk85Ae","dhSuHKASQ8","n1pmO2Nslm",
+"4QMc9Cp3mZ","kZANmi7WMQ","e6e4zKr8ys","i3pyduupzk","FLsphmX2GE","CK5W7WreyP","FLsphy94nw","5iGN5dmoS7","Yf2EcuJScX","IRh48gIYvE",
+"ZuDtD0ao3l","Oz8yZFhtgl","FGzgplkMUA","0Wr5yhi5X7","7ku1p618Di","rz7Utsx5Gl","lCMxy7lUXZ","MmKGJFLsph","UmaEvnFqik","RxrsmJkzUn",
+"rz7UtQChxs","ulk41M3zXL","tlILtpv0i7","tvdkDv1Hln","3weIFciuWz","ix74rlCMxy","uoStwhYBCK","RkQke7Ow5C","4QMc9GrDg7","WreyP5Drn0",
+"P6bcggdQsS","EdBKcUvlv4","Q6hMC5drc6","1j5L8WaWsv","iKqhruPX7G","Zv7z0lCMxy","rKDLJM6qcG","ZUnqtuQIcz","iB08llCMxy","U3yw58RCUA",
+"JJs5mlsQGo","iKqhrMm8si","jS1ajMaJQs","x3LDeyvOMI","5Namm618Di","5VZjS4QMc9","XyPZNU3yw5","uN6r3y94nw","ZhwG1MaJQs","NAFuwZv7z0",
+"BpYhVcmXIX","ogLgcOxWIH","RxrsmyEfy9","IjTwPFxX9q","qQxHPCqqaD","vLsmSFjHXR","CNHmvrhl0J","7fsYMS77LH","h1zcHv1Hln","iwzGkFFDui",
+"Nxx9V9eoRc","yEfy9jSjS3","dQ586Q6Lix","yEfy98xEKz","Waim6kB5nP","Kr8yszmLYD","hE1QlThjNn","9iGoTDQimp","5Drn0iB08l","Ul4a1yToGW",
+"UmaEvNOHsz","fmIK1cShY2","Cfgr3fFDrJ","cmXIXyvOMI","U3yw5lH1kt","Mm8siWaim6","48cHLcmXIX","QssNCCfgr3","jS1ajyvOMI","qQxHPDG4sT",
+"azIWp9eoRc","ni2v1lCMxy","CNHmv2TRI7","x3LDe7lUXZ","0h1b1KsjRK","4W0TlWaWsv","StlDJ2ZHdk","prNT6BGaQY","dpe1vzz4ZU","U3yw5ulk41",
+"ECMvU8hJdt","8hJdt0PktI","KsjRK2DREs","aDGtSzmLYD","SjskQ4W0Tl","VjCZqRsQUq","4dEz6lViBv","Qworu14FLR","618DigdQsS","RBhp0M6qcG",
+"cL0aECp3mZ","Yf2EcgIYvE","pT8wuPb1pa","Z4I1vC2Irc","U3yw5fcJOy","blLA9tvdkD","oVQp6MK07Y","dQ586d85a9","yEfy90MR5X","BGaQYpv0i7",
+"aFFssVerEA","YjB9ttjQxs","7lUXZgf8rI","fLNg8SbRYy","tlILtvkCHH","nFqikFFDui","JXljWTwano","9XyT9v8yFN","QClRLuN6r3","MK07YBGaQY",
+"RxrsmpAhR1","QWxoTzY1GY","pFrrlxReec","NhXdu1LB1L","9rlg9CIShG","2ZHdkVNCPd","Uvlv4IKxdL","v2eC3Gv3Fq","v8yFNfcwDa","jfREu48cHL",
+"pvgjSjSjS3","pWiOslsQGo","i7WMQkB5nP","uupzkYOfrY","fcJOydjsrv","Cp3mZ4dEz6","U3yw55IhmG","FnPFBLewvM","5nmWvhe9IA","yluBxlsQGo",
+"h1zcH8FmFH","RmDcrtl72W","kB5nPlkMUA","RkQked85a9","RkQkeZhwG1","MGlTF29QAz","uAWypTa8f6","XyPZN8cVD3","XyPZNRACuj","FFDuiDQimp",
+"DG4sTVerEA","QworuYf2Ec","HzZT8kZANm","9GXkXuTacx","xXTI4J2mQi","DG4sTtaOXK","gIYvES77LH","lH1ktKr8ys","SjskQ2hEEU","16lHc5IhmG",
+"Gv3FqEoToP","oVQp65Mg9r","5VZjSjfREu","9XyT9QChxs","XyPZNkZANm","aFFsssqVrf","618DirKDLJ","hUTw7WmadA","ThjNnO3iyQ","wDajX0MR5X",
+"MmsIoJKWYR","ECMvUaL6AJ","SjskQ9y4lw","3otm6t59lR","VNCPdUmaEv","SjskQM6qcG","DQimpD6rBy","vLsmSEdBKc","5VZjSd85a9","lkMUA9XyT9",
+"yEfy9LewvM","9rlg97fKYU","Vprf2brhlQ","n1pmOWPmlx","Yw2oUMmKGJ","2hEEURmDcr","AkKTkW7cTs","hE1QlNOHsz","0h1b1fcJOy","aL6AJDG4sT",
+"nFqiktaOXK","WDVWJlweGy","FFDuiRBhp0","iB08lQYxC0","v8yFN7fKYU","x3LDeOUqFM","l83UdDG4sT","DcpWBb29RJ","2Yz7EgtCA5","suY4xdQ586",
+"7hyVvFFDui","iKqhrksJby","Waim6ZJTXH","5ZaEz1LB1L","Zv7z0fLNg8","D6rByhUTw7","FLsph5drc6","GrDg7S77LH","8hJdtv8yFN","M3zXLNo0Qb",
+"dQ586StlDJ","pmeCdNo0Qb","0h1b1ru4UG","k85AelweGy","zqH0WQClRL","zqH0WRkQke","K20wKFVMxo","uvf7AlweGy","oGu6xUvlv4","6AFT0lpF6W",
+"aL6AJ0BmCy","uJScXlpF6W","0Wr5ylkMUA","uJScXtAOsr","WMiS3Rxrsm","Mm8siCxVEf","M6qcGzFgtB","s93MlFnPFB","nnP8oRBhp0","ZhwG1J2mQi",
+"fmIK1AkKTk","0h1b1VBjhz","fqypy2Nslm","24ARFdQ586","RpBQmMmsIo","lsQGovkCHH","OUYuFJKWYR","uAWypUl4a1","9XyT9I7p2a","xReec8RCUA",
+"1LB1LUvlv4","e6e4zMmsIo","kB5nP2hEEU","fcwDaVjCZq","VerEAHfyNQ","piJSkbrhlQ","VNCPdY1mC0","sqVrfKr8ys","cQOnv5Namm","CdyBVWaWsv",
+"W7cTsxciqp","2ZHdkGWqqX","VerEAGrDg7","oGu6xW7cTs","64s8NuJScX","iwzGkYw2oU","O3iyQaL6AJ","1LB1LBpYhV","4dEz6UmaEv","Q6LixO3iyQ",
+"SWfoumz8gx","piJSkru4UG","StlDJbrhlQ","pv0i7zQt6Q","GXdoHtvdkD","M3zXLbZLvS","djsrvQChxs","GWqqXpiJSk","RxrsmHP433","TXQ0ZJ2mQi",
+"Ss0ZuSWfou","9iGoT9eoRc","POUYSAXpwE","618DiZUnqt","xReec0Wr5y","yEfy92ZHdk","suY4xQnJ1S","xReecUmaEv","tl72Wdpe1v","LbRTH0ao3l",
+"SWfoufcJOy","Y1mC05drc6","ciuWzqQxHP","1j5L8gIYvE","IBe8kPYBf4","VjCZqQbxXc","FjHXR64s8N","IRh48mz8gx","vkCHHaDGtS","n1pmOFxX9q",
+"uN6r3hi5X7","jS1aj580YD","oGu6xm4bxU","jeskSX6Pin","kZANmhUTw7","gf8rIfqypy","mX2GEJXljW","29QAzTwano","djsrvLDk6f","jSjS3IBe8k",
+"uQIczSs0Zu","lCMxy9eoRc","8xEKzd7vjM","djsrvSbRYy","tjQxsI7p2a","gdQsS0YAGH","uoStwEdBKc","BGaQY0PktI","Z4I1vlkMUA","MojnPNAFuw",
+"5iGN59iGoT","fFDrJtlILt","0h1b1lViBv","IKxdLVBjhz","yofH3SbRYy","TXQ0ZECMvU","Ss0Zua00b5","lm0pDguMb8","Y1mC0lj07Q","Uvlv4azIWp",
+"NOHsz9eoRc","gdQsS2Yz7E","zY1GY64s8N","uvf7AyToGW","M3zXLuTacx","ni2v17ku1p","kB5nPcL0aE","Nxx9VuN6r3","zY1GYjtn0X","vkCHHsqVrf",
+"ulk41RzaZA","Ta8f65Namm","Yf2Ecni2v1","8TxD7iqv4k","0YAGH2DREs","n1pmOStlDJ","nnP8oprNT6","v2eC3Zv7z0","gf8rIokgRi","8U2nUOUqFM",
+"FVMxo8cVD3","ulk41tjQxs","lH1kt7lUXZ","D6rByC2Irc","CdyBVHlUbF","tuDySpmeCd","O3iyQcShY2","KASQ8Yw2oU","k85Ae5Namm","sqVrfGrDg7",
+"F6PT2jiVBP","wDajXo8Uyd","4QMc9ix74r","8hJdtSjskQ","OxWIHpWiOs","9eoRcCdyBV","v8yFNhUTw7","SWfouRACuj","tlILtFNYIM","OxWIH2Yz7E",
+"7ku1plweGy","0PktIoGu6x","LDk6fFFDui","xXTI4n1pmO","b29RJ4dEz6","d85a9QnJ1S","XflUqNo0Qb","0Wr5y5ZaEz","y94nwa00b5","9iGoT8U2nU",
+"16lHcHP433","5NammtaOXK","GSQwje6e4z","ZJTXHQ6Lix","t98iWprNT6","nFqikQssNC","7fKYUYw2oU","MezSWFFDui","KsjRKFNYIM","wiHrZoQ87r",
+"ogLgcLewvM","zHF1qni2v1","rz7Ut8FmFH","uPX7Gm4bxU","QWxoTQbxXc","BbwgApmeCd","QClRLVprf2","FwEJzMkgy8","Ss0ZugtCA5","LbRTH0Wr5y",
+"O3iyQEOE1o","Yf2EcSmGzv","4QMc9lH1kt","VjCZqk85Ae","1j5L8sqVrf","MK07YCNHmv","tuDySSs0Zu","iKqhrIjTwP","NcICAiwzGk","X6Pind85a9",
+"v8yFNpv0i7","QnJ1SSs0Zu","FjHXRuoStw","nlaByQ6Lix","uN6r3gdQsS","ksJbyyluBx","7ku1pFLsph","L7cGcoQ87r","fqypydQ586","Dz1R3EdBKc",
+"5ZaEz4W0Tl","lViBv0ao3l","ZhwG1ReKEW","lpF6WbgJAz","hi5X7dpe1v","lj07QnFqik","lj07Q9rlg9","uvf7AYw2oU","BCxeCv8yFN","xReecy94nw",
+"uLtKsdpe1v","WPmlxCqqaD","RzaZA4W0Tl","CxVEfdhSuH","48cHLKASQ8","KsjRK8FmFH","X6PinhUTw7","azIWpAIYUu","pFrrlXyPZN","e6e4z3otm6",
+"DG4sTa00b5","QssNCfLNg8","F6PT22TRI7","Oz8yZVIlwP","IBe8kHfyNQ","hE1QlFNYIM","MK07YMm8si","8TxD7Rxrsm","brhlQ7lUXZ","KsjRKQClRL",
+"tvdkDn1pmO","OUYuFuPX7G","9GXkXIjTwP","KsjRKiB08l","l83UdBpYhV","zHF1q0BmCy","FjHXRnlaBy","KZamHe6e4z","EdBKcMK07Y","MojnPFjHXR",
+"HP433RACuj","8FmFHgtCA5","lH1ktQ6Lix","DcpWBU3yw5","v1HlnzY1GY","M6qcGFVMxo","cmXIXprNT6","aez9yDLhzM","sqVrflweGy","29QAzJ2mQi",
+"nlaByAOgEe","taOXKWDVWJ","XflUqciuWz","TwanocQOnv","fcwDahi5X7","QClRLVerEA","CNHmv55rfB","XflUqogLgc","0Wr5y0Wr5y","uPX7GOz8yZ",
+"v2eC3RpBQm","CIShGb29RJ","jS1aj5Mg9r","hi5X70YAGH","tjQxsIRh48","uN6r3W3VFH","618DifmIK1","NcICAFFDui","4dEz6Yw2oU","FxX9q5VZjS",
+"fqypy8TxD7","48cHLCNHmv","POUYSogLgc","Yf2EczbIYY","hSSvQpv0i7","MojnPWMiS3","he9IARzaZA","LDk6fuoStw","uvf7AogLgc","qaofN580YD",
+"9GXkXnFqik","jtn0XfcwDa","m4bxUl83Ud","HfyNQW3VFH","okgRi0h1b1","AgJHQJ2mQi","jiVBPVNCPd","iwzGklH1kt","B3qemwiHrZ","QnJ1Sy94nw",
+"s4786Rxrsm","MojnPe6e4z","lsQGoDQimp","hi5X7Uvlv4","piJSkS77LH","8U2nUDG4sT","RACujSWfou","mz8gxYOfrY","wDajX2TRI7","5ZaEzatef2",
+"CxVEf8U2nU","pvgjSRsQUq","fcwDabgJAz","uPX7G8xEKz","DQimpRsQUq","JJs5mmz8gx","s93Mle6e4z","JJs5mo8Uyd","Oz8yZJXljW","M6qcGv8yFN",
+"RsQUquJScX","uTacxMm8si","SWfoulkMUA","FGzgp8xEKz","dpe1v24ARF","n1pmOW3VFH","dpe1vCfgr3","i3pyduPX7G","G1RhSDLhzM","DcpWBGrDg7",
+"oVQp616lHc","iKqhrd7vjM","SjskQWPmlx","7fsYMpAhR1","iKqhrtAOsr","uLtKsVprf2","h1zcHh1zcH","AkKTk8U2nU","lsQGoHlUbF","QbxXcuoStw",
+"AIYUu1v5hH","JRJQBGWqqX","CqqaDLbRTH","BCxeCd85a9","m4bxUrz7Ut","dQ586yToGW","3weIFhYBCK","xReeczHF1q","lXFOBWMiS3","zFgtBZzJHW",
+"dmoS7v1Hln","JkzUnguMb8","CdyBVZzJHW","FPfSEL7cGc","4QMc9ECMvU","Pb1pauJScX","L7cGclCMxy","okgRil83Ud","ksJbyC2Irc","a00b5rz7Ut",
+"kB5nPlCMxy","zQt6Q5Namm","SbRYyZUnqt","W3VFHK4GS8","AkKTkt98iW","iB08lmz8gx","ZuDtD8hJdt","9iGoTEOE1o","ogLgcRkQke","NhXduTCgPp",
+"vLsmSlViBv","VjCZqi3pyd","LDk6faFFss","ECMvUaFFss","580YDVIlwP","gjUTuDz1R3","OxWIHVprf2","cmXIXMezSW","5IhmGa00b5","0h1b1t98iW",
+"ECMvUoGu6x","QWxoTRACuj","FnPFBBpYhV","qUJMduLtKs","iwzGkprNT6","FPfSEThjNn","HRxd8pvgjS","lpF6W5iGN5","lm0pDHfyNQ","jzUqRSs0Zu",
+"qQxHPgIYvE","ZzJHWM6qcG","RzaZAYjB9t","I7p2aL7cGc","kZANmY1mC0","HfyNQMGlTF","LbRTHW3VFH","zbIYYQWxoT","Yw2oUb29RJ","CIShGLDk6f",
+"7Ow5CMK07Y","HzZT8rhl0J","OUqFM7ku1p","L7cGcfcJOy","jiVBP0Kyfs","7lUXZlj07Q","CqqaDsx5Gl","CK5W7Ta8f6","5Drn0AIYUu","618Di29QAz",
+"taOXKt59lR","AOgEe8xEKz","NhXduNhXdu","x3LDesoy9t","pv0i7jS1aj","XyPZNciuWz","blLA9SmGzv","W7cTsVNCPd","2TRI7hYBCK","5NammkZANm",
+"uvf7AB3qem","uN6r3K20wK","YOfrYU3yw5","faHirpiJSk","QnJ1SAXpwE","RxrsmQworu","Cfgr3IRh48","xXTI4NhXdu","0YAGHOHaBz","WMiS3brhlQ",
+"S2DfuP6bcg","8RCUAQChxs","gdQsSdmoS7","TwanoNcICA","FjHXRi3pyd","XyPZNGSQwj","8hJdtTCgPp","mX2GEUmaEv","Kr8yslweGy","I7p2alpF6W",
+"K20wKb29RJ","M6qcGiqv4k","14FLRBpYhV","yEfy9O3iyQ","IKxdLhE1Ql","Uvlv4FnPFB","fmIK1S2Dfu","16lHcHfyNQ","YOfrYWmadA","QWxoTuZPqg",
+"5Namm5ZaEz","CIShG7Ow5C","5Drn0zQt6Q","xXTI4aFFss","8xEKzn1pmO","hYBCKJKWYR","pT8wuni2v1","SbRYy5Mg9r","ogLgcZv7z0","jfREuVIlwP",
+"BGaQYd7vjM","S2DfuuTacx","iwzGkBGaQY","TXQ0ZhYBCK","7fsYMoQ87r","64s8Nv2eC3","Mkgy83weIF","rKDLJi7WMQ","dmoS7PYBf4","IBe8kOHaBz",
+"FPfSEMaJQs","qaofNkZANm","AgJHQzz4ZU","vOqCEd85a9","YOfrY8TxD7","WmadAksJby","8RCUAEOE1o","HP43314FLR","G1RhSblLA9","qaofN2hEEU",
+"5nmWvFGzgp","FNYIM8hJdt","9GXkXMm8si","s7MxkM6qcG","24ARFnlaBy","oVQp6taOXK","48cHL3weIF","W3VFHBpYhV","uupzkW7cTs","Pb1palH1kt",
+"okgRiQClRL","nFqikdpe1v","vOqCE8RCUA","0YAGHThjNn","fcwDa0ao3l","LbRTHi3pyd","jiVBPFFDui","lsQGoh1zcH","ThjNnQworu","QbxXcpAhR1",
+"zFgtBO3iyQ","BbwgAAmdQd","azIWpZUnqt","0h1b1dQ586","Chuy37hyVv","FwEJzix74r","P6bcg7ku1p","WMiS30ao3l","LDk6fMK07Y","CK5W7M6qcG",
+"Pb1pab29RJ","0PktI8U2nU","NOHszQssNC","nnP8oBCxeC","jzUqRIjTwP","POUYSDcpWB","J2mQiuN6r3","JJs5mtAOsr","BGaQY9eoRc","AOgEehUTw7",
+"tlILt6AFT0","Cfgr3Nxx9V","tvdkDU3yw5","EdBKcBFkb8","M6qcGLbRTH","l83UdVBjhz","v1HlnU3yw5","QChxszbIYY","S2DfufLNg8","8U2nUiKqhr",
+"F6PT2BCxeC","3weIFVBjhz","GSQwjksJby","6q6L9FGzgp","fcwDakZANm","GrDg7YOfrY","lsQGoguMb8","55rfBsuY4x","FcWrWLewvM","ulk41VLTy6",
+"VNCPdOHaBz","aDGtSatef2","5IhmGWPmlx","MGlTFAXpwE","S77LHCxVEf","pv0i7KZamH","o8Uyds7Mxk","aFFssNOHsz","7lUXZ24ARF","taOXK2DREs",
+"X6PinFxX9q","GrDg7tjQxs","NOHszpT8wu","v1HlnOz8yZ","ciuWzqaofN","UlU3M8U2nU","SjskQaL6AJ","KZamHdpe1v","HRxd8WreyP","4W0TlyofH3",
+"2Yz7EgIYvE","FjHXR14FLR","9iGoTCIShG","S77LH5nmWv","uTacxtjQxs","48cHL1LB1L","lViBvqUJMd","fqypylsQGo","tjQxsVBjhz","Waim6ciuWz",
+"xReecn1pmO","v8yFNYf2Ec","07n1ccShY2","dhSuHguMb8","AXpwEzFgtB","lj07Q1j5L8","Ta8f6aFFss","hYBCKl83Ud","6AFT0gIYvE","b29RJBpYhV",
+"VLTy6VIlwP","KsjRKd7vjM","dpe1vMm8si","h1zcHUlU3M","07n1cWPmlx","fqypyuN6r3","1LB1Lni2v1","xXTI4v2eC3","64s8N618Di","iqv4kgIYvE",
+"VNCPdwDajX","uZPqglViBv","NhXduZUnqt","No0Qb1j5L8","Z4I1vaDGtS","24ARFqaofN","7ku1pcL0aE","yvOMIAIYUu","7ku1pCK5W7","WaWsvQ6hMC",
+"RACujpv0i7","Yw2oUAIYUu","0Wr5yYOfrY","F6PT2HzZT8","G1RhS8hJdt","9GXkXCIShG","M3zXLpAhR1","XyPZNKsjRK","9eoRcFNYIM","o8Uydd85a9",
+"CK5W7K4GS8","yEfy95drc6","bgJAzOHaBz","4dEz6Fhtgl","CxVEfKr8ys","Fhtgl4QMc9","QWxoTIRh48","yToGW24ARF","uN6r3d7vjM","o8Uyd5iGN5",
+"lweGyIRh48","M6qcG14FLR","rhl0JlH1kt","oQ87rRsQUq","VLTy6jiVBP","JRJQBcL0aE","618DiO3iyQ","Pb1paIn3NS","55rfBVjCZq","blLA9guMb8",
+"1LB1LlH1kt","BpYhVQYxC0","U3yw5FxX9q","aFFssBFkb8","fmIK1IjTwP","2DREsCIShG","pAhR1Q6hMC","VNCPdIjTwP","nlaByW7cTs","1j5L85Mg9r",
+"0MR5Xtl72W","VNCPdZhwG1","KZamHazIWp","DcpWBZv7z0","pmeCduupzk","MezSWXflUq","brhlQNhXdu","h1zcH5nmWv","BFkb814FLR","b29RJXflUq",
+"8U2nUxReec","4W0Tl0Wr5y","5drc6t59lR","m4bxUv2eC3","CK5W7jtn0X","zqH0WFnPFB","Yw2oUDLhzM","fqypyHzZT8","qUJMdFhtgl","lpF6WF6PT2",
+"BFkb8D6rBy","QChxs8RCUA","FLsph5nmWv","RpBQmydG8U","JIqXiJKWYR","lsQGojiVBP","8cVD3WDVWJ","ZJTXH9iGoT","5iGN5HzZT8","Zv7z0dpe1v",
+"iB08l5IhmG","29QAzfmIK1","5Drn0MojnP","AkKTk55rfB","d85a9oVQp6","BpYhV7ku1p","AIYUufcwDa","qaofNW3VFH","pmeCdZv7z0","zbIYYhYBCK",
+"XflUqdjsrv","5VZjS8FmFH","Yh1hFFhtgl","EoToPDz1R3","vLsmSKASQ8","Cp3mZ8FmFH","NAFuwatef2","yvOMIm4bxU","lm0pDZuDtD","YjB9tVjCZq",
+"FcWrWRBhp0","lm0pDMmKGJ","mX2GEFwEJz","uLtKszqH0W","Vprf2CNHmv","wiHrZY1mC0","Yf2EcqaofN","hE1QlaFFss","zHF1qt59lR","zFgtBEoToP",
+"lm0pDd7vjM","K4GS8JJs5m","JJs5mNAFuw","EoToPChuy3","580YDatef2","o8UydQssNC","JKWYRsuY4x","zFgtBLDk6f","CNHmvQ6Lix","m4bxU2hEEU",
+"rKDLJgtCA5","he9IAFcWrW","2hEEU2Nslm","Zv7z0t98iW","ksJbyWaim6","t98iWMaJQs","jiVBPlH1kt","2TRI7lm0pD","mX2GEyofH3","OUqFMRpBQm",
+"5VZjSI7p2a","uJScXIRh48","vLsmSfqypy","O3iyQqaofN","7X3uyhe9IA","FLsphUl4a1","SmGzvNo0Qb","lViBvh1zcH","iwzGkfmIK1","piJSkXflUq",
+"GrDg7lpF6W","FVMxo1v5hH","55rfB5ZaEz","RBhp0xciqp","NOHszt59lR","QssNCNAFuw","JIqXiAmdQd","8TxD7zz4ZU","GWqqXJJs5m","XyPZNzz4ZU",
+"24ARF7lUXZ","8U2nU6q6L9","FcWrWfcwDa","16lHchYBCK","FNYIMF6PT2","GrDg7RpBQm","fcwDaciuWz","8FmFHZ4I1v","MK07Y6AFT0","2TRI7tlILt",
+"7ku1puoStw","RzaZAWaim6","d85a9euZA5","CNHmv2Yz7E","14FLROUYuF","LewvMiqv4k","WPmlxFFDui","hSSvQVLTy6","tvdkD9y4lw","Dz1R3FGzgp",
+"YOfrY5drc6","tvdkDmz8gx","tlILtM6qcG","ogLgcDz1R3","4QMc9Uvlv4","Cfgr3O3iyQ","BFkb8VIlwP","ZhwG1IBe8k","M6qcGe6e4z","5Drn0WmadA",
+"IBe8k4QMc9","cL0aEHzZT8","t59lRIn3NS","k85AemX2GE","5nmWvDcpWB","lm0pDs4786","ogLgcguMb8","he9IA9y4lw","uPX7GlsQGo","sx5GlW7cTs",
+"8cVD3s7Mxk","guMb8K4GS8","64s8Nuupzk","W7cTszQt6Q","Chuy3hi5X7","580YD5VZjS","WmadACIShG","5drc6lsQGo","ogLgcyluBx","d7vjMtAOsr",
+"vkCHHfLNg8","DLhzMdhSuH","tjQxst98iW","wDajXfLNg8","uJScXWreyP","EOE1opAhR1","5Mg9r8FmFH","BCxeC2TRI7","uoStwGXdoH","x3LDeVNCPd",
+"YOfrY6q6L9","1j5L87X3uy","Uvlv4AOgEe","hE1QlTXQ0Z","O3iyQPYBf4","Zv7z0Vprf2","jSjS3xReec","yEfy97Ow5C","ydG8Umz8gx","QWxoTtaOXK",
+"faHirWaim6","VNCPdZuDtD","Ta8f6bgJAz","yEfy9tAOsr","lweGySmGzv","gjUTuMojnP","OxWIHRxrsm","C2IrcWaWsv","kZANmStlDJ","FwEJzpFrrl",
+"OxWIHyofH3","VBjhzgf8rI","Chuy3iwzGk","64s8NksJby","2ZHdkkB5nP","SWfou14FLR","EdBKcAXpwE","pT8wuuLtKs","07n1cFNYIM","yToGWxXTI4",
+"n8pJ9uJScX","aFFsszqH0W","oGu6xAXpwE","5IhmGuAWyp","BbwgAv2eC3","PYBf4fcwDa","WPmlxl83Ud","RpBQmHlUbF","9y4lwjzUqR","Cfgr3t59lR",
+"djsrvtAOsr","e6e4zulk41","uN6r3B3qem","GrDg7b29RJ","580YDM3zXL","n8pJ9xciqp","8RCUAfqypy","OUYuFCK5W7","x3LDeMm8si","8xEKzzbIYY",
+"e6e4zcShY2","lXFOB9GXkX","L7cGchYBCK","hUTw7QWxoT","RxrsmfFDrJ","9eoRcSjskQ","9eoRc2Nslm","CqqaDtjQxs","24ARFDQimp","zqH0WDG4sT",
+"O3iyQsx5Gl","kB5nPbgJAz","jzUqRrz7Ut","s7MxksuY4x","gdQsS24ARF","XyPZN4W0Tl","oQ87r2DREs","cQOnvtuDyS","guMb8lweGy","n1pmOHlUbF",
+"WaWsvd85a9","RkQkexXTI4","QworucShY2","KZamHRkQke","tl72WnlaBy","MaJQstvdkD","EOE1oGXdoH","bZLvSzFgtB","ix74r8hJdt","No0QbQ6hMC",
+"CK5W7YjB9t","YjB9tv1Hln","S77LHI7p2a","bgJAzAkKTk","QChxsZUnqt","CdyBVL7cGc","lXFOBuZPqg","oQ87ruLtKs","JXljW48cHL","fcJOyx3LDe",
+"8U2nUgjUTu","lViBvix74r","atef2MaJQs","FjHXR9y4lw","uQIczU3yw5","M3zXLSmGzv","uupzkuoStw","AXpwE29QAz","tuDySn1pmO","hYBCKwiHrZ",
+"8hJdtWaWsv","brhlQ3weIF","RsQUqiqv4k","uTacxuPX7G","aDGtS5ZaEz","piJSkFjHXR","CxVEfpFrrl","B3qem4QMc9","8hJdtCqqaD","GSQwjiqv4k",
+"lViBvUl4a1","hSSvQgtCA5","WPmlx29QAz","M3zXLt59lR","9rlg9t59lR","lCMxylpF6W","nFqik8hJdt","yToGWJRJQB","ZUnqttaOXK","lCMxy0MR5X",
+"F6PT2Mkgy8","nnP8oReKEW","BbwgA0MR5X","Ss0ZuQworu","5ZaEza00b5","U3yw56AFT0","gjUTu5iGN5","X6PinsqVrf","64s8NtaOXK","2Yz7EJKWYR",
+"ciuWzwiHrZ","cL0aEUlU3M","9y4lw8cVD3","VNCPdgf8rI","SjskQblLA9","okgRiuJScX","zY1GYMezSW","pvgjSix74r","BbwgAPYBf4","GSQwjIn3NS",
+"2hEEUzY1GY","4QMc9lXFOB","aL6AJoQ87r","VjCZq2TRI7","ZhwG1X6Pin","b29RJ2Nslm","pT8wuyvOMI","VIlwPlXFOB","fFDrJWPmlx","RkQkeiqv4k",
+"pT8wuFcWrW","nnP8oRzaZA","blLA9oQ87r","KsjRKRzaZA","8U2nUAgJHQ","ZzJHW24ARF","9iGoTRpBQm","NOHsztaOXK","KASQ8yEfy9","Vprf2AgJHQ",
+"wiHrZCdyBV","W7cTsuQIcz","BCxeCZhwG1","9rlg945cIH","ru4UGQ6Lix","9XyT9Z4I1v","JkzUnMkgy8","euZA59GXkX","NhXdumX2GE","jzUqRciuWz",
+"RzaZAY1mC0","pmeCdLewvM","qUJMdW3VFH","tAOsraL6AJ","0KyfspWiOs","FnPFBRBhp0","piJSkzFgtB","JIqXiDcpWB","P6bcgCK5W7","uLtKslsQGo",
+"tlILtMmKGJ","iwzGk2Nslm","Fhtgl0PktI","VNCPdMK07Y","uAWypciuWz","hYBCKFPfSE","FwEJzVBjhz","s4786okgRi","xXTI4i7WMQ","Oz8yZ7Ow5C",
+"4QMc9nnP8o","fLNg8QClRL","CIShGX6Pin","tvdkDAOgEe","UlU3MFGzgp","MmsIoG1RhS","YjB9tix74r","QnJ1S1v5hH","HP433rz7Ut","Y1mC0RACuj",
+"2ZHdklkMUA","jS1aj5ZaEz","ulk41YOfrY","7X3uyTwano","BpYhVZhwG1","d7vjMEoToP","oVQp6NhXdu","zY1GYoVQp6","QnJ1ShE1Ql","jzUqRZhwG1",
+"7ku1pGWqqX","suY4xBbwgA","StlDJReKEW","QYxC0Pb1pa","zz4ZUMkgy8","QbxXcMkgy8","TwanozQt6Q","hi5X7B3qem","xciqpIBe8k","9rlg9FwEJz",
+"oVQp6No0Qb","tvdkDuvf7A","pmeCdKASQ8","0h1b1dhSuH","atef2FwEJz","ni2v1piJSk","prNT6ogLgc","lweGyuZPqg","No0QbVIlwP","h1zcHcmXIX",
+"JIqXis4786","euZA5gf8rI","zQt6QFxX9q","Mkgy8SbRYy","5ZaEztlILt","SWfouMezSW","Cp3mZL7cGc","y94nwtl72W","mz8gxx3LDe","OUqFM5Namm",
+"LewvMDG4sT","pFrrlPb1pa","S2Dfus4786","vLsmSCK5W7","uZPqgDcpWB","zY1GYzz4ZU","s4786AOgEe","zqH0WMK07Y","IKxdLRzaZA","ZhwG1guMb8",
+"MojnPgf8rI","blLA94dEz6","Mkgy8OHaBz","J2mQi29QAz","uTacxVNCPd","iB08l07n1c","n1pmOyluBx","LbRTH48cHL","X6PinaFFss","OxWIHFLsph",
+"aez9yxXTI4","3weIFdjsrv","7X3uyOUYuF","EOE1oDcpWB","BCxeCMm8si","suY4xSjskQ","RsQUqgf8rI","2DREsSjskQ","CK5W7XyPZN","Q6hMCm4bxU",
+"uTacxzQt6Q","9eoRcokgRi","ciuWzhi5X7","piJSkFGzgp","okgRijtn0X","mX2GEOxWIH","suY4xHzZT8","Mkgy8k85Ae","HP433G1RhS","JkzUnVLTy6",
+"3otm6ECMvU","55rfBIjTwP","jiVBPxReec","FGzgpt59lR","uJScXcL0aE","HlUbFjSjS3","LDk6fVLTy6","YjB9tbgJAz","S2DfuBFkb8","yluBxFxX9q",
+"Uvlv4s4786","FLsphAkKTk","24ARF8hJdt","FxX9qvkCHH","GWqqXG1RhS","lweGyuvf7A","XyPZNfcJOy","dmoS7Uvlv4","JkzUniwzGk","vLsmSt59lR",
+"wDajXGSQwj","hE1QlCp3mZ","suY4xJkzUn","bZLvSuTacx","L7cGci3pyd","tlILtgf8rI","CIShGP6bcg","RxrsmIKxdL","v8yFNfcJOy","hE1QlsqVrf",
+"ThjNnbgJAz","ksJbyY1mC0","zQt6Q64s8N","lH1ktulk41","soy9ts7Mxk","WaWsv5Drn0","7X3uyvOqCE","6AFT0GXdoH","yofH37fsYM","aL6AJJKWYR",
+"0Wr5yNxx9V","QYxC0v2eC3","sqVrfzY1GY","ix74rJRJQB","DLhzMuvf7A","pWiOsgtCA5","qaofNgf8rI","guMb8ZhwG1","8TxD7vkCHH","16lHcjzUqR",
+"uupzka00b5","WMiS3pv0i7","8RCUAfcJOy","RkQkeulk41","zQt6Q7ku1p","G1RhSyEfy9","BGaQY5IhmG","qaofN1v5hH","Waim6QClRL","pFrrlBGaQY",
+"MmsIoFjHXR","i3pydVBjhz","S77LHZhwG1","No0QbFVMxo","rKDLJ9GXkX","tvdkD7X3uy","F6PT2m4bxU","ZUnqtn1pmO","tAOsrQYxC0","vkCHHnFqik",
+"FNYIMnnP8o","8U2nUfcJOy","LewvM2Nslm","K20wKQChxs","0Wr5ylCMxy","0BmCyix74r","t59lRNhXdu","C2Ircfqypy","mX2GEMGlTF","d85a9wiHrZ",
+"pAhR19eoRc","uZPqgnnP8o","QnJ1SCdyBV","KZamH5drc6","9y4lwZuDtD","2TRI79rlg9","2DREsFwEJz","sx5GlbZLvS","bgJAz4W0Tl","JkzUnNcICA",
+"DG4sTrhl0J","QssNCX6Pin","2TRI77fKYU","JXljWpFrrl","XflUqYOfrY","aFFssXyPZN","atef28hJdt","In3NSh1zcH","k85AeAOgEe","zz4ZUiKqhr",
+"0ao3la00b5","8U2nUcL0aE","nFqikFhtgl","xXTI4FFDui","4W0TlQssNC","Mkgy83otm6","FGzgpStlDJ","TwanoIRh48","ix74ruAWyp","OUqFM9eoRc",
+"gtCA5AgJHQ","B3qemrKDLJ","45cIH1LB1L","ydG8UtAOsr","t98iWWDVWJ","0YAGHpAhR1","Yw2oUTXQ0Z","bgJAzHfyNQ","NcICAUmaEv","RxrsmSmGzv",
+"9iGoTQssNC","uvf7APb1pa","9eoRcYOfrY","LbRTHhi5X7","he9IAsoy9t","lViBvb29RJ","VNCPdx3LDe","d7vjMDQimp","Fhtglru4UG","bgJAzwiHrZ",
+"RsQUqxReec","POUYSC2Irc","nFqikRACuj","rKDLJS2Dfu","CNHmvzqH0W","L7cGcFGzgp","2NslmSjskQ","hYBCKgjUTu","qUJMdbZLvS","tl72WpT8wu",
+"8TxD7fFDrJ","pFrrlWreyP","brhlQVIlwP","WaWsvfaHir","aez9y6AFT0","5ZaEzFLsph","cL0aEgtCA5","D6rByZhwG1","GWqqXguMb8","lsQGoU3yw5",
+"Oz8yZ3weIF","In3NSBbwgA","7lUXZIn3NS","jtn0XIn3NS","MmsIookgRi","JJs5mCdyBV","dhSuHcL0aE","pmeCdcQOnv","WaWsvFFDui","bZLvSv1Hln",
+"45cIHx3LDe","UlU3MSmGzv","dQ586CqqaD","0Wr5yAXpwE","ThjNndhSuH","ix74rVIlwP","uvf7ARmDcr","pvgjSsoy9t","J2mQidhSuH","fLNg8vOqCE",
+"xReecAgJHQ","IKxdLDQimp","WDVWJbrhlQ","M6qcGSjskQ","yofH3o8Uyd","ZuDtDRkQke","ZhwG16AFT0","Nxx9VW7cTs","sx5GlQworu","NOHszAmdQd",
+"Oz8yZaFFss","FGzgpnFqik","AmdQdhSSvQ","suY4xBpYhV","SmGzv07n1c","TCgPpDcpWB","lViBvQYxC0","uJScXIKxdL","vLsmSvkCHH","djsrvC2Irc",
+"ZzJHWOxWIH","BFkb845cIH","9eoRcdhSuH","ZuDtDAXpwE","7ku1pa00b5","ECMvUbgJAz","lweGyQYxC0","RxrsmReKEW","HP433JXljW","Ss0ZuNhXdu",
+"vkCHHMmsIo","jS1ajQbxXc","h1zcHFcWrW","lpF6WwiHrZ","LewvMFhtgl","rKDLJfqypy","fLNg8oQ87r","ulk41yluBx","QbxXci7WMQ","48cHLQworu",
+"fcJOy3otm6","GWqqXprNT6","hi5X7zqH0W","AOgEel83Ud","BGaQYpmeCd","FGzgpcL0aE","Uvlv47X3uy","IRh48jS1aj","5drc6VjCZq","JKWYR5IhmG",
+"BGaQYtAOsr","IKxdLVerEA","tl72WksJby","Vprf2IBe8k","QssNCZ4I1v","gdQsSZhwG1","bgJAzuTacx","lsQGoThjNn","4QMc9tvdkD","S77LHPb1pa",
+"POUYSvkCHH","UlU3M4dEz6","djsrvBbwgA","Uvlv4GXdoH","Uvlv4uvf7A","pv0i764s8N","vkCHHlkMUA","rhl0JFhtgl","OHaBzzqH0W","vkCHHQssNC",
+"lj07QYjB9t","wiHrZZuDtD","FxX9qFFDui","y94nwYh1hF","qaofNeuZA5","tAOsrfaHir","ix74rChuy3","1LB1L7X3uy","CxVEft59lR","CNHmvEOE1o",
+"FcWrWMmKGJ","KsjRKtaOXK","ksJbyVerEA","I7p2ai3pyd","NcICA0MR5X","Oz8yZQbxXc","pv0i7MezSW","zbIYYzY1GY","zFgtBBGaQY","CxVEf1LB1L",
+"RkQkeOUYuF","5Mg9r0YAGH","QworufcJOy","Uvlv4pmeCd","ZJTXHP6bcg","h1zcHRkQke","9rlg9Mm8si","a00b5AOgEe","7hyVvsx5Gl","hi5X7vkCHH",
+"M3zXLYw2oU","29QAz8xEKz","FPfSEFNYIM","xReecx3LDe","uupzkfLNg8","blLA9pWiOs","brhlQfLNg8","vLsmSNAFuw","Oz8yZjiVBP","D6rBy7fsYM",
+"yvOMIe6e4z","dQ586zqH0W","Mkgy8fqypy","GrDg7cL0aE","7hyVvlsQGo","uN6r3GWqqX","aez9ypAhR1","WDVWJix74r","aez9yblLA9","tlILtZuDtD",
+"YjB9tPOUYS","KsjRKVBjhz","pT8wul83Ud","I7p2aThjNn","Kr8yslViBv","AmdQdcmXIX","sqVrfd7vjM","t59lR4dEz6","HfyNQBGaQY","SWfouIBe8k",
+"ciuWzjzUqR","5VZjSbrhlQ","RkQkesuY4x","Cp3mZFFDui","AmdQd9y4lw","Yh1hFJKWYR","TXQ0ZJRJQB","lCMxyJIqXi","ogLgccShY2","yofH3IBe8k",
+"8xEKzIRh48","1j5L8WMiS3","HRxd8Gv3Fq","RpBQmBCxeC","HP433AOgEe","tAOsrFLsph","nnP8osuY4x","ydG8U5iGN5","J2mQii3pyd","t98iWLbRTH",
+"LewvMpiJSk","fqypyCNHmv","AkKTkciuWz","v1HlnP6bcg","pmeCdbZLvS","0MR5XpWiOs","7fKYUrhl0J","29QAz9eoRc","NcICAzqH0W","AXpwEkZANm",
+"MK07YRzaZA","xReec5VZjS","lsQGoNo0Qb","FcWrWP6bcg","MmsIouTacx","d85a9y94nw","29QAzmX2GE","7X3uyAXpwE","yvOMItvdkD","fcwDas93Ml",
+"jiVBPbZLvS","7ku1pciuWz","7hyVvD6rBy","WaWsvJIqXi","OxWIHzbIYY","DcpWBYh1hF","pvgjSCp3mZ","JkzUnM3zXL","yofH32TRI7","M6qcGM3zXL",
+"nlaByGrDg7","Z4I1vFcWrW","HP433jeskS","7lUXZjSjS3","FGzgpUvlv4","n8pJ9wDajX","AIYUuQChxs","pT8wuSWfou","OHaBzni2v1","EOE1ozQt6Q",
+"kB5nPOxWIH","2Yz7Et59lR","tAOsrBpYhV","ru4UG14FLR","AkKTkQChxs","gjUTuzz4ZU","RpBQmpiJSk","lsQGo29QAz","oVQp6atef2","yofH3BbwgA",
+"5Mg9ro8Uyd","BCxeCQssNC","uQIczMmKGJ","gdQsSFjHXR","ciuWzRkQke","he9IAJJs5m","FVMxozbIYY","0YAGHCfgr3","LDk6f9y4lw","AOgEe2Nslm",
+"NhXdu0ao3l","wiHrZaez9y","QbxXcYjB9t","s7MxkWaim6","X6PinRmDcr","bgJAztuDyS","atef24W0Tl","LewvMGv3Fq","CxVEf7hyVv","yofH3fcwDa",
+"I7p2a5Drn0","LewvMcShY2","s93MlNxx9V","uN6r3IKxdL","LDk6fuTacx","pmeCd2TRI7","BpYhVMm8si","fcJOy5iGN5","zbIYYdpe1v","uLtKsBpYhV",
+"dhSuHWmadA","S2DfuD6rBy","VLTy6FVMxo","atef248cHL","EdBKctAOsr","l83Udatef2","ciuWzni2v1","0BmCyYOfrY","l83UdSs0Zu","7hyVvqQxHP",
+"8hJdtYjB9t","uupzk24ARF","oQ87r7hyVv","mz8gx14FLR","2NslmzFgtB","tjQxsQ6hMC","v8yFN5ZaEz","EOE1olj07Q","5ZaEzfmIK1","14FLR4dEz6",
+"K4GS8VNCPd","Kr8ysM6qcG","RBhp0HlUbF","hUTw716lHc","oGu6xOUqFM","aez9yvOqCE","C2IrcVNCPd","No0Qb0h1b1","uJScXJKWYR","MGlTFEdBKc",
+"64s8NFVMxo","uTacxxciqp","5IhmGFFDui","VNCPd4QMc9","lm0pDlweGy","wDajXQbxXc","v2eC3yToGW","W7cTsfqypy","Cfgr3xReec","QnJ1S2Yz7E",
+"zz4ZUogLgc","wiHrZiqv4k","fmIK1DQimp","CqqaDFnPFB","Yf2EcU3yw5","gtCA5VerEA","14FLRhYBCK","QYxC0lj07Q","tvdkDGSQwj","VerEAeuZA5",
+"XyPZN0Kyfs","5Drn0Ta8f6","OHaBzRmDcr","xciqpJXljW","nnP8od7vjM","pAhR1VerEA","AOgEe7X3uy","5NammfLNg8","BGaQYhi5X7","FwEJzYf2Ec",
+"J2mQiCNHmv","ReKEWjeskS","s7MxkksJby","VjCZqUvlv4","mX2GEJkzUn","bZLvS9rlg9","uAWypSmGzv","brhlQ5Namm","NOHsz3weIF","CqqaDDLhzM",
+"wDajXYOfrY","azIWpP6bcg","FcWrWt98iW","prNT69y4lw","azIWpRxrsm","zmLYDPb1pa","tAOsrTa8f6","9XyT9h1zcH","0ao3lFxX9q","55rfBh1zcH",
+"guMb88FmFH","XflUqCNHmv","hUTw7Mm8si","8RCUATXQ0Z","v8yFNy94nw","CqqaD1LB1L","xXTI4MezSW","SbRYypT8wu","QWxoTOHaBz","n8pJ95ZaEz",
+"faHirhE1Ql","B3qem0PktI","CdyBVCIShG","S77LHuQIcz","S77LH5drc6","n1pmOTCgPp","64s8NVBjhz","JJs5m4dEz6","dpe1v1j5L8","XflUqMm8si",
+"h1zcHSjskQ","gf8rItuDyS","9GXkXuZPqg","OUqFMdpe1v","7fKYUtvdkD","pAhR1lkMUA","i7WMQZzJHW","CqqaD0ao3l","lXFOBpmeCd","EoToPPYBf4",
+"ThjNnt98iW","VBjhzoVQp6","FLsphjS1aj","IKxdL2Nslm","d7vjMCNHmv","WmadACdyBV","yToGWY1mC0","5Drn09y4lw","gtCA5t98iW","ru4UGhE1Ql",
+"jzUqRY1mC0","64s8NC2Irc","C2IrcyToGW","cL0aEBGaQY","S77LHWreyP","8U2nUjtn0X","k85AeWPmlx","HRxd85VZjS","FLsphZUnqt","Zv7z0VjCZq",
+"9rlg9xReec","iKqhrqQxHP","o8UydYjB9t","okgRijiVBP","rz7UtNAFuw","1LB1LSWfou","XflUq9y4lw","pvgjSStlDJ","D6rBy0Wr5y","mX2GEtjQxs",
+"QChxsh1zcH","YjB9tFjHXR","7ku1pokgRi","wiHrZ0ao3l","NcICAS2Dfu","7Ow5CsuY4x","TXQ0Z4dEz6","L7cGcdhSuH","XflUqmz8gx","0Wr5yprNT6",
+"07n1cChuy3","WMiS38U2nU","JIqXiyluBx","RpBQmhUTw7","he9IAmX2GE","FPfSEvOqCE","DG4sTOHaBz","3weIFqUJMd","55rfBuPX7G","2Yz7EoVQp6",
+"aDGtScmXIX","bgJAzhi5X7","Ul4a1FxX9q","uQIczBbwgA","xReecDG4sT","dQ586pmeCd","zQt6QokgRi","HfyNQuoStw","rKDLJaez9y","YjB9tprNT6",
+"ciuWzxReec","0PktI2TRI7","zHF1qnnP8o","fqypyvLsmS","FFDui4W0Tl","UmaEv618Di","EdBKc5VZjS","qUJMdyToGW","IKxdLJJs5m","e6e4zTwano",
+"hUTw78TxD7","ix74rBFkb8","bZLvSk85Ae","dpe1vwDajX","2ZHdkO3iyQ","IKxdLXyPZN","618Difqypy","29QAz2Yz7E","55rfBlH1kt","48cHLru4UG",
+"FxX9qZuDtD","ZzJHWiwzGk","P6bcgI7p2a","pWiOs48cHL","n1pmO07n1c","VjCZqvLsmS","8U2nUeuZA5","JJs5ms93Ml","2Nslm5ZaEz","tlILtblLA9",
+"8U2nU07n1c","GWqqXyToGW","cmXIXwiHrZ","fLNg85VZjS","AkKTkPb1pa","ZhwG1ydG8U","Ss0ZuNOHsz","0ao3luJScX","dmoS7blLA9","Yh1hFTwano",
+"zQt6QFhtgl","atef2F6PT2","AIYUuvLsmS","sqVrf8U2nU","07n1clkMUA","jS1ajSs0Zu","3otm6s4786","lkMUA4QMc9","S77LHvOqCE","NhXdu8U2nU",
+"atef2NAFuw","jfREuZ4I1v","zqH0WtjQxs","TXQ0ZVIlwP","6AFT0Vprf2","XflUqChuy3","LewvMoVQp6","Ul4a1W3VFH","UlU3MQYxC0","9eoRcciuWz",
+"hSSvQU3yw5","uQIczOHaBz","fcwDa24ARF","WreyPtvdkD","6AFT0Chuy3","55rfBpFrrl","ZhwG1StlDJ","S77LHhUTw7","8U2nUdmoS7","d7vjMRpBQm",
+"hUTw7WDVWJ","9rlg9QnJ1S","zz4ZUxReec","RzaZAyEfy9","l83UdYw2oU","Rxrsm0YAGH","fcwDabrhlQ","K4GS82hEEU","0PktIDcpWB","2Nslm0YAGH",
+"vLsmSJRJQB","jtn0XgIYvE","nnP8o5Namm","0h1b15drc6","5nmWvFxX9q","CxVEfZv7z0","hSSvQYh1hF","okgRiZ4I1v","gjUTuVprf2","d85a9vkCHH",
+"lH1ktni2v1","7X3uyvLsmS","BCxeCqQxHP","aDGtSfFDrJ","cL0aEMmsIo","lweGyfaHir","xciqppiJSk","hYBCKatef2","pFrrlvkCHH","BFkb86q6L9",
+"xciqpUlU3M","45cIH5VZjS","MojnPoGu6x","ZUnqts7Mxk","JRJQBBbwgA","dhSuHlH1kt","nnP8o0MR5X","tl72WvLsmS","QChxsdjsrv","NAFuwAgJHQ",
+"9XyT9EoToP","WaWsvXyPZN","2DREstlILt","55rfBCNHmv","gdQsSSmGzv","QWxoTwiHrZ","WaWsvpmeCd","jzUqR2Yz7E","14FLRKZamH","v2eC39XyT9",
+"VjCZqlm0pD","fFDrJLDk6f","StlDJnFqik","wiHrZ9XyT9","0MR5XwiHrZ","TCgPpAmdQd","YjB9tTXQ0Z","In3NSJ2mQi","mz8gxQworu","Kr8ysbrhlQ",
+"GXdoHx3LDe","Pb1pad7vjM","prNT6CxVEf","FxX9qm4bxU","RxrsmOUYuF","VLTy60ao3l","bgJAz2Nslm","wiHrZ0BmCy","lm0pDFjHXR","W3VFH2TRI7",
+"d85a9U3yw5","a00b5aez9y","S77LHOxWIH","RxrsmaFFss","hSSvQFcWrW","i7WMQuupzk","uTacx7ku1p","BpYhVjSjS3","m4bxU6q6L9","lH1ktQbxXc",
+"3weIFMezSW","4QMc9Ul4a1","uPX7GsuY4x","lm0pD9iGoT","nlaBy5nmWv","CdyBVMm8si","lCMxyDG4sT","cL0aE48cHL","1j5L8Vprf2","2ZHdk16lHc",
+"5Drn0aL6AJ","qQxHPSs0Zu","tl72WfcJOy","C2IrcgIYvE","nnP8o4W0Tl","XyPZNQssNC","xReecU3yw5","Kr8ysn1pmO","lsQGoSs0Zu","Yf2EcyluBx",
+"PYBf4s4786","uvf7AJkzUn","atef2tlILt","MGlTFFPfSE","rz7Utx3LDe","IRh48l83Ud","WaWsvWPmlx","CxVEfrKDLJ","s7MxkFLsph","FhtglQ6Lix",
+"hSSvQQnJ1S","gtCA5bgJAz","AOgEeStlDJ","Waim6brhlQ","MK07YBFkb8","FPfSEtaOXK","cShY2ru4UG","wDajXhe9IA","Dz1R3LDk6f","Pb1paiB08l",
+"YOfrYRBhp0","EoToP7fKYU","cShY2bgJAz","ydG8UMm8si","OUYuFd7vjM","LbRTHZJTXH","5drc6pT8wu","POUYSMezSW","pFrrlHfyNQ","SbRYyEdBKc",
+"lViBvmX2GE","4QMc9tlILt","jtn0XjfREu","xciqpZhwG1","P6bcgv1Hln","7Ow5Ct98iW","OUqFMNAFuw","atef264s8N","qaofNuQIcz","hSSvQECMvU",
+"VjCZqCxVEf","hYBCKCdyBV","XyPZNIjTwP","vLsmSX6Pin","K4GS82ZHdk","0PktIWmadA","lm0pDazIWp","yToGWQworu","JXljWzmLYD","nFqikQ6Lix",
+"2ZHdkFNYIM","jfREuG1RhS","e6e4zd85a9","uoStwWreyP","ZuDtDlCMxy","iKqhrzqH0W","FGzgpd7vjM","Ta8f6azIWp","ni2v1BFkb8","ZhwG1jSjS3",
+"TwanoiB08l","DQimpru4UG","oGu6xNAFuw","DG4sTe6e4z","t59lRqaofN","SWfouFcWrW","nlaByIn3NS","aL6AJtAOsr","uN6r3zbIYY","nnP8olCMxy",
+"zY1GY2hEEU","QworuWaim6","AgJHQuN6r3","GSQwjrz7Ut","pT8wuiqv4k","t98iWCdyBV","EoToPJXljW","sx5Gl64s8N","45cIHhi5X7","zz4ZUuZPqg",
+"sqVrfQbxXc","jzUqRRBhp0","KASQ8gIYvE","v2eC3JIqXi","vLsmSiKqhr","Cp3mZThjNn","K4GS8BFkb8","5VZjSChuy3","OUqFMhe9IA","uoStwcmXIX",
+"WmadAuTacx","9rlg9ydG8U","HRxd8OUYuF","mX2GEfcwDa","O3iyQAgJHQ","64s8Nv8yFN","XflUqBFkb8","zqH0WMaJQs","F6PT2M3zXL","W7cTs8FmFH",
+"KZamHzmLYD","oGu6xlj07Q","MaJQsvOqCE","618Di7ku1p","GWqqX07n1c","DLhzMU3yw5","gtCA5euZA5","jiVBPZv7z0","07n1ckZANm","StlDJxXTI4",
+"2Yz7EW7cTs","jiVBPuupzk","7fsYMU3yw5","atef2ReKEW","SWfoutuDyS","WmadARACuj","Kr8ysYw2oU","DLhzMuPX7G","l83UdECMvU","zY1GYni2v1",
+"ogLgcwDajX","pT8wuyEfy9","F6PT2fLNg8","XflUqFVMxo","Waim6Cp3mZ","0MR5XReKEW","uJScXkZANm","Waim6pvgjS","guMb8ZUnqt","zmLYDGv3Fq",
+"Z4I1v8xEKz","IBe8k0Wr5y","brhlQy94nw","5NammwiHrZ","vOqCELbRTH","4dEz6mX2GE","tAOsrFnPFB","lm0pD1j5L8","QChxsJ2mQi","K4GS8zY1GY",
+"JIqXixReec","PYBf4okgRi","U3yw5zz4ZU","NcICAIBe8k","HP433TXQ0Z","gtCA555rfB","RkQkenFqik","In3NSFwEJz","lXFOB0MR5X","MK07Y0BmCy",
+"qUJMdiB08l","AOgEefcJOy","oVQp69GXkX","VNCPdrz7Ut","n1pmO6AFT0","jzUqR45cIH","HzZT86q6L9","MGlTFWreyP","qQxHPJkzUn","1v5hHCdyBV",
+"FGzgpYOfrY","QworuuAWyp","Chuy3wiHrZ","W3VFH0PktI","K20wKUvlv4","pv0i7OUqFM","NAFuwGWqqX","1j5L8M3zXL","K4GS8W7cTs","0YAGHQWxoT",
+"nlaByMojnP","h1zcHlXFOB","WmadA4dEz6","zqH0WYw2oU","618DiMmsIo","ThjNnVjCZq","7fsYMBbwgA","gIYvE4W0Tl","AIYUufcJOy","ciuWznlaBy",
+"GXdoH4QMc9","QssNCMK07Y","POUYS16lHc","ru4UG2TRI7","PYBf4zY1GY","WPmlxVerEA","iKqhrHP433","No0Qb9rlg9","kZANmThjNn","lXFOB24ARF",
+"uLtKsHlUbF","XyPZN2ZHdk","iwzGkfcJOy","RmDcrKZamH","fLNg8dQ586","MGlTFAgJHQ","RACujOUqFM","I7p2aZhwG1","StlDJAgJHQ","sx5GlS77LH",
+"k85Aen1pmO","O3iyQFwEJz","MGlTF7Ow5C","HlUbFaDGtS","7hyVvkZANm","okgRiiwzGk","Z4I1vkZANm","YjB9tn8pJ9","DcpWBDLhzM","nFqikfaHir",
+"Dz1R3hE1Ql","b29RJyEfy9","VjCZqWreyP","i7WMQuPX7G","2hEEUVBjhz","Ta8f6EdBKc","SjskQn1pmO","K4GS816lHc","djsrvZUnqt","5Mg9rD6rBy",
+"MmKGJt59lR","fFDrJMaJQs","DLhzMzQt6Q","MezSWnnP8o","sx5Glaez9y","UmaEvo8Uyd","YjB9tGv3Fq","HfyNQ24ARF","nnP8ojtn0X","yEfy9pAhR1",
+"zHF1qUlU3M","zHF1qs4786","K20wKfcwDa","07n1cgIYvE","S2Dfu618Di","RzaZAGSQwj","QbxXclweGy","580YDMezSW","P6bcg7fKYU","JXljWpT8wu",
+"6q6L9Chuy3","2ZHdkGv3Fq","RmDcrHzZT8","QssNCD6rBy","t59lR29QAz","M6qcGlm0pD","fFDrJhE1Ql","gtCA5DQimp","MojnPbgJAz","DQimpFNYIM",
+"L7cGcMezSW","gdQsSFFDui","9XyT9C2Irc","07n1cyToGW","SbRYyv2eC3","WaWsvCK5W7","48cHLJ2mQi","TCgPpSmGzv","l83UdfcwDa","oQ87r7fKYU",
+"CdyBVMezSW","jeskSU3yw5","s7MxkDcpWB","fcJOy0Wr5y","x3LDe8TxD7","O3iyQTXQ0Z","xReecJRJQB","pWiOs8FmFH","MezSWMkgy8","gtCA5RmDcr",
+"JkzUncmXIX","lCMxyqUJMd","IKxdL6AFT0","QClRLPOUYS","24ARFqUJMd","rKDLJfmIK1","v2eC3IKxdL","jfREu7fsYM","B3qemlViBv","prNT6G1RhS",
+"Gv3FqDQimp","uPX7GpiJSk","d7vjMFNYIM","VNCPd9eoRc","QnJ1Sgf8rI","zz4ZUs93Ml","Yh1hFbgJAz","uJScX0PktI","RBhp0sx5Gl","uN6r3TXQ0Z",
+"dQ586Q6hMC","Yf2Echi5X7","cQOnvoVQp6","POUYSFGzgp","kB5nPNAFuw","pv0i714FLR","RACujK4GS8","djsrvulk41","zmLYDCqqaD","IKxdLZv7z0",
+"RpBQmGv3Fq","LDk6fmz8gx","bZLvSqQxHP","xReecJkzUn","W7cTshe9IA","UmaEvFPfSE","WMiS3Mkgy8","SjskQCfgr3","AgJHQ5VZjS","0Wr5ybgJAz",
+"0Kyfsxciqp","RpBQmuZPqg","24ARFlViBv","5iGN5bgJAz","wDajXFnPFB","uZPqg5nmWv","iKqhrMojnP","FGzgpQworu","J2mQi5ZaEz","J2mQi6AFT0",
+"zQt6QwiHrZ","LewvMqaofN","AIYUuP6bcg","BpYhVVBjhz","d85a9EOE1o","8cVD3faHir","NAFuwFPfSE","vOqCEOUqFM","JXljWcmXIX","JXljWjeskS",
+"9XyT9W3VFH","hE1Qllm0pD","0MR5XuN6r3","TCgPpEOE1o","QssNCblLA9","zY1GYhYBCK","ZuDtDTwano","cmXIXB3qem","m4bxUt59lR","DLhzMIKxdL",
+"14FLR8cVD3","x3LDeQYxC0","WPmlxLbRTH","64s8Ny94nw","QYxC08hJdt","OUYuFS2Dfu","FcWrWS2Dfu","IBe8kix74r","soy9ttAOsr","IjTwPZhwG1",
+"djsrvzqH0W","jfREu5drc6","mz8gxThjNn","zmLYDVjCZq","TXQ0Z8TxD7","yEfy9pWiOs","IRh48MmKGJ","580YDYOfrY","QWxoTThjNn","S2Dfu5IhmG",
+"sqVrfdQ586","JRJQBDz1R3","8cVD3wDajX","5nmWvhi5X7","UmaEvazIWp","Yh1hFnFqik","ZJTXHHfyNQ","RBhp0prNT6","prNT6m4bxU","jS1ajvLsmS",
+"8hJdtHfyNQ","NhXduNcICA","yEfy98FmFH","v1Hln5VZjS","hUTw7tl72W","16lHcOHaBz","mX2GEEOE1o","tjQxsTCgPp","5VZjSdQ586","jiVBP8cVD3",
+"dpe1v2ZHdk","AXpwEqaofN","RsQUqUlU3M","uAWypix74r","zQt6QlsQGo","8TxD7WDVWJ","CxVEfYw2oU","QClRLzqH0W","07n1cBpYhV","VerEAVLTy6",
+"kZANm2TRI7","IjTwPFhtgl","WreyP7hyVv","VjCZqY1mC0","o8UydHP433","7X3uyReKEW","k85AeokgRi","QssNChUTw7","CqqaDCp3mZ","9rlg98cVD3",
+"vOqCEUmaEv","0Wr5yKr8ys","0PktI3weIF","bgJAzGWqqX","AmdQduoStw","lXFOBFFDui","Z4I1vlsQGo","zQt6Q3weIF","DcpWB0PktI","BGaQYyToGW",
+"pFrrlZuDtD","lm0pD3otm6","M6qcG8hJdt","MK07YmX2GE","dpe1vIjTwP","blLA9tAOsr","5Mg9rUl4a1","uZPqgC2Irc","VNCPdhUTw7","TCgPp5Drn0",
+"tAOsrMkgy8","iqv4kiwzGk","9GXkXdpe1v","HfyNQCp3mZ","3weIFpFrrl","OxWIHzz4ZU","G1RhSSWfou","zbIYYoQ87r","ZhwG1HRxd8","uupzkFhtgl",
+"DcpWBLDk6f","rz7UtwiHrZ","BFkb8yvOMI","Ul4a1U3yw5","U3yw5sx5Gl","GrDg74QMc9","jeskSJKWYR","KsjRK14FLR","AXpwEXflUq","580YDi7WMQ",
+"C2Ircsx5Gl","jiVBPG1RhS","LewvMIRh48","CdyBVFxX9q","OUYuFjzUqR","Ta8f6QYxC0","MezSWyvOMI","tuDySNxx9V","6AFT04W0Tl","45cIHJ2mQi",
+"2TRI7yToGW","tuDySprNT6","WPmlxVjCZq","1j5L8pWiOs","W7cTs2Nslm","5NammIjTwP","o8UydpWiOs","Z4I1v45cIH","StlDJhYBCK","9iGoTMK07Y",
+"djsrvzbIYY","5NammlH1kt","a00b59iGoT","cL0aEzFgtB","VjCZqmz8gx","ni2v17fsYM","HRxd85Drn0","FxX9qNhXdu","tl72WJIqXi","zFgtBQChxs",
+"Mkgy8pWiOs","dmoS7ksJby","7X3uyBbwgA","fcwDaWPmlx","M6qcGCdyBV","CdyBVAOgEe","oQ87rzQt6Q","Y1mC0Rxrsm","i3pydQClRL","OUYuFs4786",
+"I7p2adpe1v","5NammK4GS8","Z4I1vQWxoT","kB5nPWaim6","07n1cWMiS3","JIqXiZzJHW","DcpWBXyPZN","fcwDaFhtgl","nFqikn1pmO","29QAzcShY2",
+"Oz8yZb29RJ","bgJAz5VZjS","atef29GXkX","pmeCdRkQke","xXTI4nFqik","5IhmGI7p2a","oVQp6FxX9q","RxrsmuZPqg","YOfrYPOUYS","s93MlS2Dfu",
+"wiHrZuQIcz","0YAGHru4UG","55rfBqQxHP","djsrvh1zcH","1v5hHWPmlx","ix74r7lUXZ","7ku1pBCxeC","azIWpWDVWJ","HP433qaofN","l83Ud7fsYM",
+"hE1QlZzJHW","ThjNnZv7z0","nFqik0YAGH","fmIK1b29RJ","qaofNMaJQs","GXdoHyToGW","ZUnqtIBe8k","ReKEWjtn0X","VLTy6sqVrf","2Yz7EjSjS3",
+"9iGoTDLhzM","zHF1qK4GS8","soy9tv8yFN","uLtKs2hEEU","D6rBy2hEEU","LbRTHHRxd8","o8UydThjNn","cQOnvWDVWJ","xXTI4mX2GE","lCMxyFNYIM",
+"i3pydOz8yZ","W3VFH07n1c","rz7UtydG8U","8U2nUQssNC","DLhzM29QAz","Yf2EcsuY4x","EOE1o0h1b1","tvdkDNo0Qb","QnJ1SQChxs","yofH3hE1Ql",
+"Vprf28hJdt","BpYhV55rfB","ZuDtDfqypy","s93MlSWfou","IKxdLZ4I1v","RkQkeGSQwj","0ao3lfLNg8","cQOnvd85a9","soy9tyEfy9","tjQxsZUnqt",
+"WPmlx16lHc","gjUTuM3zXL","K4GS85Drn0","tlILtiqv4k","jS1ajOz8yZ","KsjRKCK5W7","M3zXLdjsrv","rKDLJWreyP","BGaQYmX2GE","CdyBVHRxd8",
+"9eoRcYf2Ec","s93MlSbRYy","W3VFHjzUqR","uTacxlj07Q","KASQ8ThjNn","yofH3pv0i7","45cIHIRh48","In3NSSs0Zu","RxrsmuoStw","gdQsSwiHrZ",
+"euZA5s93Ml","fcwDaZJTXH","fLNg8Yw2oU","IRh48uvf7A","d85a9LbRTH","Cfgr3Mm8si","d7vjMDG4sT","RmDcratef2","Vprf2NcICA","QbxXcsoy9t",
+"8TxD7Pb1pa","ECMvUIjTwP","lpF6WpWiOs","xciqpFVMxo","uvf7A16lHc","WreyPAkKTk","yToGWmX2GE","0Wr5yjiVBP","VjCZqkZANm","pFrrluAWyp",
+"uQIcz4dEz6","4W0Tl4dEz6","5nmWvIRh48","xciqp3otm6","3otm6XyPZN","BpYhVXyPZN","4W0TlYjB9t","bgJAz9y4lw","JRJQBThjNn","NhXduFLsph",
+"soy9tvkCHH","lj07QCIShG","F6PT2P6bcg","ZUnqt0BmCy","29QAz7X3uy","lH1ktQClRL","LbRTH29QAz","Q6LixYw2oU","pWiOs5Drn0","2DREsCfgr3",
+"07n1c9XyT9","QnJ1S8cVD3","3weIFECMvU","QssNCbgJAz","ZzJHWe6e4z","v2eC3brhlQ","KZamH580YD","SjskQ1v5hH","S77LHn1pmO","JJs5mix74r",
+"4QMc9n8pJ9","v8yFNhE1Ql","MaJQsU3yw5","CNHmvSbRYy","GXdoHuJScX","ru4UGiwzGk","k85AeaFFss","ydG8UciuWz","qQxHPxciqp","Chuy3dpe1v",
+"IBe8kn8pJ9","tvdkDdpe1v","gjUTudjsrv","0BmCyFNYIM","gIYvEStlDJ","BCxeCb29RJ","B3qemnnP8o","No0Qba00b5","vOqCEpAhR1","atef29rlg9",
+"oGu6xydG8U","OUYuFVNCPd","29QAzJXljW","TXQ0Z7X3uy","8FmFHECMvU","ZuDtDQssNC","RkQkeoVQp6","zFgtBHzZT8","MmsIoVNCPd","jiVBP6AFT0",
+"9rlg9MmsIo","wiHrZIn3NS","Yf2Ecuvf7A","a00b5tuDyS","zmLYD64s8N","Pb1papv0i7","2ZHdkMm8si","zQt6QNhXdu","9eoRcRkQke","taOXK7Ow5C",
+"SWfouOz8yZ","cL0aEPb1pa","t59lRpiJSk","C2IrcGWqqX","lweGyEOE1o","Cp3mZtjQxs","Twanodjsrv","8U2nUGrDg7","IBe8kL7cGc","6AFT0In3NS",
+"RBhp0dhSuH","hYBCKt59lR","QworuRmDcr","IjTwPuvf7A","VNCPdsuY4x","3otm6pmeCd","RzaZA5VZjS","lj07QSjskQ","W7cTsZUnqt","v8yFNS2Dfu",
+"Yw2oUCIShG","GXdoH8xEKz","QbxXcOUYuF","JRJQBuLtKs","0ao3lYjB9t","jSjS3s7Mxk","x3LDeRBhp0","Zv7z0LDk6f","W7cTsAgJHQ","iwzGkZhwG1",
+"Pb1panFqik","uvf7AVLTy6","pmeCdm4bxU","brhlQTCgPp","sx5GlJkzUn","SWfouqQxHP","WPmlxuN6r3","14FLRqUJMd","EdBKcnFqik","gf8rIFLsph",
+"LewvMhUTw7","YOfrYEdBKc","nFqikStlDJ","ThjNngtCA5","lCMxyvLsmS","U3yw5618Di","64s8N0Kyfs","cQOnvHlUbF","CK5W7zbIYY","In3NSRkQke",
+"blLA9LewvM","Mm8siuupzk","hSSvQpWiOs","MojnPJXljW","X6PinDz1R3","IRh48zz4ZU","CqqaDB3qem","tuDySNo0Qb","2hEEUZhwG1","7X3uyQClRL",
+"ciuWz7fsYM","s93MlChuy3","Cp3mZDcpWB","FLsphF6PT2","SjskQdQ586","yofH3dhSuH","AmdQdcQOnv","zbIYY0h1b1","BFkb8G1RhS","VLTy6OUYuF",
+"jeskSFGzgp","ksJbyMojnP","RmDcrBFkb8","taOXKMm8si","S2DfuKASQ8","Chuy3hSSvQ","soy9tCqqaD","2NslmIKxdL","7hyVvP6bcg","BCxeCSbRYy",
+"7X3uyfaHir","EoToP2ZHdk","lCMxyIn3NS","C2Ircn8pJ9","0ao3lRzaZA","rhl0JoQ87r","J2mQi14FLR","IRh48FNYIM","jSjS35Namm","YOfrYKr8ys",
+"pmeCdzz4ZU","D6rByZUnqt","Cp3mZ16lHc","e6e4zokgRi","JIqXi9y4lw","S77LHn8pJ9","uZPqge6e4z","D6rByCdyBV","SmGzvMkgy8","fLNg8S77LH",
+"8cVD3BbwgA","uAWypMezSW","cmXIXYf2Ec","cQOnvI7p2a","0PktI0PktI","AXpwE8xEKz","5drc6tAOsr","lweGy6AFT0","QbxXcTa8f6","AgJHQ8xEKz",
+"9XyT9Qworu","Dz1R3lsQGo","DQimpSmGzv","8xEKzi3pyd","HlUbFzz4ZU","h1zcHDG4sT","x3LDei7WMQ","MaJQsSjskQ","djsrvXflUq","soy9thSSvQ",
+"Q6LixjiVBP","VIlwPfcJOy","vkCHHWreyP","Twano0MR5X","ZJTXHhSSvQ","DG4sTmz8gx","2Yz7ENhXdu","QYxC0FjHXR","BFkb8pvgjS","6AFT0gjUTu",
+"0BmCyfFDrJ","atef20MR5X","VBjhzOHaBz","zHF1qcQOnv","M3zXLaL6AJ","vkCHHhe9IA","Y1mC0aL6AJ","0YAGHaDGtS","aFFss7hyVv","jfREuZv7z0",
+"0ao3lFcWrW","RxrsmtvdkD","nlaBy618Di","0Wr5yCxVEf","MmsIo7X3uy","uvf7ASWfou","Y1mC0L7cGc","ulk41taOXK","sqVrfXflUq","cQOnvqQxHP",
+"pT8wu48cHL","Kr8ysQ6Lix","ECMvUlweGy","VNCPdCqqaD","1LB1LCIShG","FVMxoNo0Qb","StlDJRpBQm","pAhR1QClRL","2NslmlXFOB","QworuQClRL",
+"jS1ajDcpWB","SbRYygtCA5","07n1ctaOXK","faHirulk41","W7cTsFGzgp","NAFuwuvf7A","mz8gxrKDLJ","16lHcYf2Ec","HfyNQydG8U","x3LDeCIShG",
+"14FLRUmaEv","zFgtBFnPFB","y94nw9y4lw","FLsphD6rBy","0BmCyGSQwj","KsjRKt59lR","OHaBzJKWYR","8xEKzmX2GE","IRh48M6qcG","Oz8yZprNT6",
+"580YDxXTI4","MK07YfcJOy","IKxdLNAFuw","uN6r345cIH","DLhzMWPmlx","FFDui5IhmG","ZUnqtOHaBz","3weIFlm0pD","Twano0h1b1","yToGWpmeCd",
+"OUqFMAXpwE","RACujhE1Ql","14FLRS2Dfu","LewvMVNCPd","BGaQYtuDyS","0YAGHdjsrv","d85a9gdQsS","ogLgcfLNg8","5Mg9r4QMc9","pWiOs2hEEU",
+"ZJTXHB3qem","WPmlxk85Ae","l83UdS77LH","5Mg9rv1Hln","F6PT2mX2GE","Pb1pa6q6L9","zbIYYAOgEe","G1RhSaFFss","F6PT2MGlTF","TXQ0ZSjskQ",
+"qUJMdjfREu","AgJHQnlaBy","brhlQM3zXL","F6PT2lm0pD","8U2nUL7cGc","EoToPyToGW","JIqXiZJTXH","EdBKcyvOMI","t59lRCK5W7","lXFOBBCxeC",
+"lViBvzHF1q","48cHLCqqaD","Cp3mZFVMxo","1j5L8ReKEW","VBjhzBpYhV","NOHszZv7z0","IRh487lUXZ","fcJOysqVrf","qQxHPRpBQm","ZzJHWpmeCd",
+"guMb8WmadA","OHaBzNcICA","I7p2azQt6Q","CdyBVVLTy6","Q6LixAOgEe","EOE1oTCgPp","Oz8yZxReec","mX2GEJKWYR","QbxXcZv7z0","XyPZNoQ87r",
+"zY1GYMkgy8","jzUqR8cVD3","suY4xni2v1","JIqXilViBv","yToGWiqv4k","zY1GYTXQ0Z","wiHrZP6bcg","t98iWvLsmS","oQ87rhi5X7","9rlg9iwzGk",
+"fmIK1ix74r","zQt6QhUTw7","gf8rIGrDg7","8TxD7ksJby","LDk6f8RCUA","VerEAs4786","MaJQsVLTy6","7X3uypmeCd","ReKEW8cVD3","jtn0XCfgr3",
+"FNYIM9iGoT","lXFOBlXFOB","5VZjSFjHXR","JKWYRyofH3","cmXIXHP433","SmGzvFxX9q","64s8N8U2nU","SWfouzbIYY","rKDLJOxWIH","4W0Tljtn0X",
+"FcWrWn1pmO","uTacxAOgEe","WaWsvlm0pD","5iGN5xciqp","KZamHS2Dfu","7fKYUuvf7A","07n1cAIYUu","v2eC316lHc","TCgPpVjCZq","Kr8ysl83Ud",
+"zqH0WoQ87r","okgRiAgJHQ","pmeCdkB5nP","d7vjMDLhzM","d7vjMPOUYS","XflUqW7cTs","nlaBylsQGo","a00b5k85Ae","WDVWJZzJHW","Y1mC0gdQsS",
+"XyPZN3weIF","uQIczFcWrW","wiHrZStlDJ","DG4sTjtn0X","4dEz6MaJQs","sx5GlGWqqX","VjCZqThjNn","vLsmS3weIF","bgJAzzQt6Q","S2DfuYOfrY",
+"M3zXLS2Dfu","Gv3FqzQt6Q","HRxd8AOgEe","NhXduUmaEv","h1zcH5IhmG","8U2nU4W0Tl","48cHL2DREs","lj07QfFDrJ","qQxHPdpe1v","RACuj24ARF",
+"RmDcrlpF6W","8cVD3yluBx","pFrrlMm8si","16lHcbrhlQ","FNYIMuupzk","sqVrfDcpWB","MaJQsjtn0X","zz4ZUru4UG","nnP8ocL0aE","5drc68xEKz",
+"EdBKcuupzk","CqqaDHzZT8","MojnPNhXdu","sqVrftuDyS","ECMvUFxX9q","JRJQB1LB1L","hi5X7jSjS3","14FLRMmKGJ","Kr8yssqVrf","ru4UGYf2Ec",
+"16lHclsQGo","QWxoT0h1b1","EdBKcvkCHH","mX2GE0ao3l","lViBvx3LDe","lj07QUl4a1","uLtKsW3VFH","GrDg71LB1L","dQ5867X3uy","CxVEfM3zXL",
+"fcwDaChuy3","IjTwPgtCA5","Kr8ysQbxXc","Cp3mZnFqik","dpe1v5drc6","DLhzM4QMc9","fcwDarz7Ut","pv0i7ru4UG","uvf7AmX2GE","8TxD75Namm",
+"W3VFHd7vjM","BpYhVQ6Lix","lsQGo580YD","Twanoatef2","Mkgy8s93Ml","KASQ8MK07Y","taOXKv8yFN","FcWrWG1RhS","K4GS87fsYM","7Ow5CB3qem",
+"FhtglcmXIX","CK5W79iGoT","AIYUuFxX9q","0KyfsUvlv4","s4786yToGW","d85a9IjTwP","iB08ln8pJ9","XflUqFxX9q","tl72WZJTXH","WDVWJo8Uyd",
+"FPfSEDLhzM","prNT6580YD","Z4I1vqUJMd","FFDuisoy9t","JKWYRQ6hMC","fcJOyksJby","hi5X78xEKz","P6bcgs93Ml","K20wKlm0pD","5nmWvNOHsz",
+"5VZjSDcpWB","dmoS7rKDLJ","GXdoH2Nslm","MaJQss93Ml","Mkgy8IKxdL","VBjhzX6Pin","45cIHvkCHH","0h1b15iGN5","ECMvUMkgy8","pAhR1FnPFB",
+"M3zXLnlaBy","ogLgcRzaZA","HlUbFRBhp0","9rlg9PYBf4","Q6hMC6q6L9","0h1b1hSSvQ","QnJ1Siqv4k","8TxD7VIlwP","rhl0J0YAGH","lpF6WFVMxo",
+"bgJAzSs0Zu","zz4ZUZJTXH","55rfB8U2nU","okgRiCdyBV","jSjS3qaofN","ThjNnzY1GY","tvdkD0h1b1","gdQsS0h1b1","uQIczpFrrl","zQt6QyEfy9",
+"qQxHPSmGzv","VIlwPP6bcg","WPmlxn8pJ9","7ku1pIRh48","FGzgpaDGtS","RmDcrlkMUA","IjTwP8hJdt","nFqikGrDg7","580YDYw2oU","MmsIobgJAz",
+"uZPqgcL0aE","Kr8ysFnPFB","FcWrWL7cGc","aL6AJnnP8o","sqVrfOUqFM","s4786FLsph","QWxoThi5X7","NAFuwogLgc","MojnPMmKGJ","cShY2cL0aE",
+"FcWrWbZLvS","aez9yi7WMQ","M6qcGAXpwE","n1pmOFFDui","3weIFNo0Qb","M3zXLYjB9t","QbxXcGWqqX","MojnPokgRi","dpe1v9GXkX","SWfoutlILt",
+"5Drn0YOfrY","CxVEf5Namm","9y4lwDLhzM","POUYS5iGN5","tlILtRpBQm","QbxXchUTw7","WmadAOUYuF","7hyVvtuDyS","MaJQsHRxd8","fFDrJNAFuw",
+"ZuDtDEoToP","gtCA5JIqXi","8hJdtL7cGc","ogLgcIRh48","gtCA5Ul4a1","t59lR7lUXZ","5IhmGjzUqR","MezSWi3pyd","e6e4zvOqCE","K4GS8l83Ud",
+"JkzUnuTacx","iqv4kRmDcr","0ao3lbrhlQ","J2mQiFGzgp","ZhwG1tl72W","ni2v1yToGW","b29RJ8hJdt","G1RhSGrDg7","yEfy9zbIYY","W7cTsMK07Y",
+"m4bxUZzJHW","9XyT94dEz6","6AFT0hSSvQ","DQimp55rfB","e6e4zPYBf4","pWiOsD6rBy","9GXkXsqVrf","GWqqX29QAz","rz7UtRzaZA","soy9tIRh48",
+"Dz1R3F6PT2","lsQGozz4ZU","FNYIMiqv4k","uQIczlm0pD","6AFT0AOgEe","618Dio8Uyd","zmLYD45cIH","CK5W7BCxeC","SmGzv8cVD3","5iGN5ni2v1",
+"0ao3l1j5L8","Q6hMCyvOMI","POUYSBGaQY","YOfrYCfgr3","LewvMvLsmS","CIShG5Drn0","S77LH2TRI7","JIqXi618Di","16lHcYjB9t","G1RhSuZPqg",
+"RsQUqfFDrJ","EOE1o24ARF","ECMvU1j5L8","vkCHHGWqqX","9eoRclweGy","fLNg8tvdkD","XflUqMmsIo","dQ586azIWp","JIqXiyofH3","oQ87rd7vjM",
+"OxWIHlXFOB","FjHXRRsQUq","UmaEvfmIK1","Zv7z0WMiS3","VBjhz07n1c","EOE1ot98iW","FwEJzJ2mQi","GSQwjl83Ud","CK5W70h1b1","e6e4zpmeCd",
+"LbRTH4W0Tl","vkCHHCxVEf","Oz8yZtvdkD","Uvlv4RBhp0","Mkgy8FFDui","uAWypfcwDa","Yf2EcGrDg7","uAWypqUJMd","WPmlx0YAGH","azIWplpF6W",
+"KsjRK1j5L8","FFDuiRsQUq","BbwgAUlU3M","gdQsSAkKTk","FjHXR48cHL","OUqFMcQOnv","OxWIHzY1GY","s4786RACuj","7lUXZ2Nslm","RzaZAhYBCK",
+"ZhwG1UmaEv","9XyT9NAFuw","FjHXRDcpWB","L7cGcru4UG","Dz1R3VBjhz","nlaByv2eC3","tl72Whe9IA","zHF1qfcJOy","s93MlnFqik","8FmFH4dEz6",
+"iqv4kbrhlQ","RzaZARsQUq","n8pJ9VLTy6","gIYvEa00b5","6q6L9iqv4k","OxWIH3weIF","hYBCKHlUbF","gIYvENhXdu","OxWIHvLsmS","pmeCdMojnP",
+"RmDcrAIYUu","qaofN4QMc9","s7MxkHRxd8","a00b5MK07Y","PYBf4ogLgc","rhl0JSbRYy","5IhmG5Mg9r","Waim6OxWIH","fcJOyv1Hln","QWxoTtAOsr",
+"SjskQvLsmS","rKDLJKZamH","AXpwEFPfSE","8cVD3618Di","5iGN5fmIK1","t59lRFLsph","m4bxUpAhR1","Vprf2I7p2a","BCxeC0Kyfs","AgJHQfqypy",
+"d85a9FnPFB","QYxC08FmFH","yofH3UmaEv","x3LDe16lHc","s93Ml7fsYM","0BmCy9iGoT","9iGoTMGlTF","Twano1v5hH","fcJOytuDyS","XyPZNxReec",
+"uQIczzQt6Q","1j5L8iKqhr","BpYhVrKDLJ","x3LDeoGu6x","Q6hMCnFqik","OxWIHfmIK1","qaofN7fsYM","wDajXPb1pa","CqqaD0BmCy","Kr8ysBCxeC",
+"Y1mC0Y1mC0","uupzkxReec","b29RJatef2","RkQkeiKqhr","hYBCKCp3mZ","brhlQdmoS7","48cHL16lHc","aFFsspvgjS","soy9t5drc6","6AFT00Kyfs",
+"Mkgy8ru4UG","618DiXyPZN","MGlTFzqH0W","TXQ0ZwDajX","5drc6XyPZN","cShY2hSSvQ","B3qemoQ87r","uoStwru4UG","xciqpMojnP","EOE1oHfyNQ",
+"cmXIXlj07Q","piJSkmz8gx","ciuWzNOHsz","HzZT8zbIYY","fqypyB3qem","24ARFuoStw","iKqhrU3yw5","uAWypCdyBV","SbRYykB5nP","FPfSEMezSW",
+"NcICAZJTXH","sqVrfiwzGk","blLA9S2Dfu","5drc6CIShG","jfREuOHaBz","yvOMIcQOnv","0ao3lxciqp","blLA9JKWYR","Dz1R348cHL","ZzJHWRpBQm",
+"WPmlxaDGtS","24ARFIBe8k","W7cTsFPfSE","OHaBzZUnqt","HfyNQKr8ys","Yw2oUuoStw","m4bxU2DREs","aDGtSCK5W7","8U2nUDcpWB","8FmFH1v5hH",
+"Ta8f6jtn0X","Chuy3ciuWz","fcwDaBFkb8","Uvlv4b29RJ","YOfrYDz1R3","ZhwG1CNHmv","FhtglOHaBz","1v5hHZUnqt","FLsphVNCPd","FGzgpkZANm",
+"WMiS3dQ586","Waim6jSjS3","Vprf2pAhR1","WDVWJSs0Zu","9GXkXGv3Fq","FxX9quupzk","ciuWzQ6hMC","UlU3Mm4bxU","W7cTsKASQ8","lXFOBAXpwE",
+"KZamHoQ87r","U3yw5RACuj","euZA55IhmG","JKWYRbZLvS","CNHmv2Nslm","xciqpzY1GY","6q6L9oVQp6","5VZjSlViBv","P6bcgVBjhz","jSjS3k85Ae",
+"WreyPzbIYY","4dEz65Mg9r","5ZaEz9y4lw","tlILtrz7Ut","jfREuMaJQs","qaofNmz8gx","Ss0ZuLbRTH","NAFuwzHF1q","0YAGHl83Ud","SjskQYh1hF",
+"MmKGJIKxdL","WMiS3OUYuF","Oz8yZCxVEf","S77LHi7WMQ","zQt6QCxVEf","jfREuJXljW","16lHcG1RhS","bZLvSJIqXi","M6qcG7lUXZ","l83UdzqH0W",
+"4dEz6S77LH","8RCUA5nmWv","hE1Qlsoy9t","RxrsmOHaBz","FPfSEn1pmO","0YAGHlkMUA","ogLgcIBe8k","XyPZNvOqCE","LbRTH8TxD7","mz8gx2Nslm",
+"TXQ0ZkZANm","yofH3BCxeC","BGaQYdpe1v","AkKTkeuZA5","EOE1o8TxD7","BbwgAMGlTF","guMb8AXpwE","UlU3MXflUq","2TRI7FnPFB","jtn0XVLTy6",
+"U3yw529QAz","e6e4ziwzGk","ZzJHWgjUTu","45cIHRpBQm","No0Qb5Drn0","JIqXiCdyBV","QChxs29QAz","mz8gxBFkb8","AkKTkAkKTk","fcJOyVjCZq",
+"K4GS8zHF1q","VerEAECMvU","HfyNQ5IhmG","1j5L82hEEU","AmdQdv8yFN","aez9yyEfy9","bgJAzYw2oU","GrDg75VZjS","azIWpQnJ1S","QChxslm0pD",
+"POUYSyvOMI","QnJ1SkZANm","WreyPQssNC","M3zXLokgRi","5IhmGfmIK1","rKDLJulk41","lXFOBuAWyp","0BmCy2ZHdk","tAOsrgtCA5","Cfgr3jS1aj",
+"lj07QSbRYy","FnPFB5IhmG","VNCPduupzk","8TxD7hi5X7","uAWypKASQ8","lkMUAd85a9","dQ5867fKYU","HzZT8FGzgp","RBhp01LB1L","S2DfuVprf2",
+"4dEz6SbRYy","LbRTH8hJdt","uoStwPb1pa","cmXIXvkCHH","HRxd8CIShG","EdBKcyofH3","J2mQiPb1pa","yluBxsuY4x","24ARFMGlTF","ThjNnpT8wu",
+"DcpWBVBjhz","580YDs7Mxk","29QAzRkQke","RpBQmdQ586","MmKGJi7WMQ","JXljWZJTXH","tvdkDxXTI4","uPX7GQWxoT","SmGzv1LB1L","lCMxyAIYUu",
+"ogLgcbgJAz","29QAzZ4I1v","0ao3lv2eC3","xXTI42hEEU","9rlg9dQ586","RkQkeFwEJz","14FLRsoy9t","1v5hHhi5X7","JJs5mECMvU","55rfBAgJHQ",
+"wiHrZOHaBz","WMiS3618Di","aL6AJAIYUu","s7Mxk7X3uy","m4bxUgf8rI","bZLvSFPfSE","8xEKzDQimp","U3yw5hSSvQ","sqVrfwiHrZ","mz8gxW7cTs",
+"i7WMQyToGW","S77LH5VZjS","rKDLJSbRYy","zqH0WOUYuF","TXQ0ZQYxC0","fcwDalCMxy","zbIYYnlaBy","RpBQmfqypy","M3zXL0YAGH","OUYuFDG4sT",
+"ZzJHWpT8wu","ThjNnF6PT2","XflUqyToGW","DcpWBdmoS7","FPfSEJ2mQi","5ZaEzDG4sT","5ZaEzSs0Zu","s7MxkFnPFB","WreyPVBjhz","S2Dfu9rlg9",
+"EoToPBCxeC","hUTw7RkQke","jiVBPs93Ml","JJs5mdjsrv","ZJTXHTXQ0Z","StlDJPb1pa","qUJMdUlU3M","mX2GE0YAGH","Yw2oUdhSuH","lm0pDKr8ys",
+"4W0TlHzZT8","0ao3lSbRYy","ru4UGrKDLJ","1LB1LU3yw5","EOE1oqQxHP","mX2GElj07Q","JXljWrz7Ut","zQt6QD6rBy","No0QbydG8U","s7MxkzbIYY",
+"QssNCDLhzM","gdQsSksJby","618DiCqqaD","5drc6I7p2a","2DREsMkgy8","JXljWZUnqt","NAFuwRxrsm","GSQwjiB08l","rz7UtZhwG1","d7vjMgdQsS",
+"Z4I1vzY1GY","GrDg7lj07Q","nnP8oNcICA","CNHmvS2Dfu","fmIK1WreyP","07n1cv8yFN","MmsIol83Ud","jSjS3QYxC0","qaofN0Kyfs","s7MxktjQxs",
+"4dEz6JKWYR","n1pmOAgJHQ","zY1GYjS1aj","s7Mxka00b5","Cp3mZG1RhS","7ku1pJJs5m","nnP8oZzJHW","DLhzMprNT6","oQ87rh1zcH","RACujFhtgl",
+"iqv4kv1Hln","Q6Lixt98iW","618DiCdyBV","CNHmvOUYuF","YjB9tMK07Y","yEfy9MmKGJ","1v5hHFNYIM","OUYuFZJTXH","uLtKs1j5L8","Q6LixZUnqt",
+"lpF6WMmsIo","fcJOy2DREs","nlaBySjskQ","0KyfspAhR1","dhSuHo8Uyd","zHF1qgdQsS","uAWypOUYuF","P6bcgmz8gx","jzUqRJRJQB","Yw2oUulk41",
+"sx5GltvdkD","5Drn0WMiS3","AXpwEblLA9","zFgtBZUnqt","ru4UGyToGW","pT8wuM3zXL","n1pmOAmdQd","MmsIos7Mxk","yofH3WmadA","Yh1hFzY1GY",
+"OxWIHBpYhV","OUYuFIjTwP","POUYSGWqqX","gtCA5HfyNQ","dmoS7uvf7A","h1zcHlm0pD","24ARFbZLvS","a00b5Kr8ys","BbwgAOHaBz","lj07QKZamH",
+"5IhmGDQimp","lViBv5ZaEz","Uvlv4yvOMI","HzZT85ZaEz","zbIYYqQxHP","7Ow5CM6qcG","lH1kt0h1b1","faHirU3yw5","QYxC04W0Tl","y94nw6AFT0",
+"IBe8kFLsph","zz4ZUsx5Gl","oGu6xgdQsS","zFgtBVBjhz","lkMUAFVMxo","ReKEWBGaQY","3weIFEOE1o","4dEz6jiVBP","ZzJHWEoToP","Twanob29RJ",
+"yluBxCIShG","IRh48b29RJ","GWqqXdpe1v","Z4I1vuTacx","Pb1paWMiS3","ZJTXH45cIH","1LB1LfFDrJ","piJSkYOfrY","jeskSwiHrZ","pFrrlCK5W7",
+"yluBxhi5X7","jfREuJJs5m","29QAzx3LDe","2hEEUcmXIX","brhlQ8RCUA","pAhR1h1zcH","RkQkeVerEA","aDGtSNOHsz","0YAGHFjHXR","wDajXyEfy9",
+"yEfy97fKYU","n8pJ9lm0pD","aFFss618Di","GSQwjQClRL","aDGtSjS1aj","5iGN5nlaBy","ECMvUeuZA5","oVQp6HzZT8","Pb1paKASQ8","NhXduv8yFN",
+"ZUnqta00b5","zY1GYBpYhV","uAWypZ4I1v","MezSWy94nw","wiHrZdpe1v","e6e4zNhXdu","VjCZqlkMUA","GrDg7RzaZA","F6PT2fmIK1","LDk6fk85Ae",
+"wiHrZFPfSE","kB5nP5ZaEz","faHirgjUTu","iB08lksJby","vkCHHd85a9","Kr8ysiqv4k","B3qemuAWyp","2Yz7EWmadA","W7cTsqUJMd","AIYUuG1RhS",
+"L7cGcTXQ0Z","RBhp0BbwgA","KsjRKgdQsS","8cVD3MojnP","HzZT80ao3l","MmKGJxciqp","ZzJHW2Yz7E","OUqFMQ6Lix","i7WMQQChxs","FjHXRCIShG",
+"BGaQYFFDui","zHF1qprNT6","uJScXGXdoH","VjCZqjS1aj","djsrvQClRL","aDGtSxciqp","Q6hMCuPX7G","KZamHTwano","VLTy6JkzUn","Waim6lj07Q",
+"hE1Qlix74r","ZJTXHrz7Ut","ZzJHWU3yw5","ulk41D6rBy","FxX9qJ2mQi","zmLYDSs0Zu","ZuDtDv8yFN","OxWIHLbRTH","OxWIHL7cGc","nFqik618Di",
+"DQimpKr8ys","jSjS3FjHXR","ZJTXHVjCZq","dQ5860MR5X","B3qemXflUq","guMb8EdBKc","GSQwjWaim6","RmDcrJIqXi","oGu6xCK5W7","uoStwpmeCd",
+"StlDJydG8U","dQ586OUYuF","QClRLHzZT8","2hEEUyToGW","8hJdt5VZjS","Yh1hFECMvU","ix74rWDVWJ","cL0aEnFqik","CxVEfuJScX","MojnPGSQwj",
+"RACujwDajX","9rlg9wDajX","h1zcH0BmCy","SjskQwiHrZ","vLsmSkZANm","O3iyQQnJ1S","fLNg8JIqXi","2Yz7EprNT6","yofH3EOE1o","pWiOsB3qem",
+"lCMxy7Ow5C","zY1GYIn3NS","pvgjSuAWyp","azIWpZuDtD","tjQxstjQxs","8FmFHOxWIH","0MR5X8hJdt","24ARFThjNn","tlILtOUqFM","taOXKZJTXH",
+"hi5X7HfyNQ","jiVBPjfREu","uoStwokgRi","QYxC0a00b5","ZzJHWguMb8","8U2nUjfREu","QnJ1S9rlg9","uupzkuTacx","UmaEvaez9y","ogLgcAkKTk",
+"BpYhVSmGzv","9eoRc7hyVv","Mkgy8AgJHQ","djsrvIjTwP","MmKGJprNT6","Z4I1voGu6x","2ZHdkQYxC0","uvf7AZ4I1v","ksJby0PktI","No0QbRACuj",
+"iB08lFxX9q","QWxoT16lHc","JKWYR2DREs","FGzgpjS1aj","cmXIXIRh48","JKWYRgIYvE","5ZaEzoGu6x","7fKYU0BmCy","UlU3MiB08l","QWxoTLbRTH",
+"TCgPpWmadA","AkKTkazIWp","faHirtl72W","uLtKsjSjS3","W3VFHjfREu","yluBxoQ87r","CdyBVrhl0J","ECMvUfFDrJ","lpF6WoQ87r","LewvMRpBQm",
+"2DREsqQxHP","JXljWv2eC3","ZzJHW9y4lw","Cp3mZJJs5m","l83UdaDGtS","0Wr5y5Drn0","xXTI4CK5W7","2Nslmxciqp","S77LH45cIH","4QMc9EOE1o",
+"a00b5RBhp0","F6PT2fcwDa","djsrv5ZaEz","M3zXLHzZT8","QClRLMmsIo","cL0aEVNCPd","ciuWzo8Uyd","uAWyp1j5L8","6AFT0m4bxU","zz4ZUBpYhV",
+"WaWsv4QMc9","tjQxsFhtgl","azIWp7fKYU","Q6LixiB08l","ThjNnSWfou","Z4I1vRACuj","EOE1oa00b5","7Ow5Cs93Ml","v2eC3rhl0J","VBjhzPYBf4",
+"2Nslm6q6L9","nlaByX6Pin","WMiS34W0Tl","Kr8ysCfgr3","StlDJVjCZq","5ZaEz0BmCy","qUJMdKZamH","MojnPKsjRK","Chuy38xEKz","t98iWv2eC3",
+"lm0pDsoy9t","2Nslml83Ud","Cfgr3jSjS3","i7WMQO3iyQ","3weIFJkzUn","F6PT24dEz6","2TRI79iGoT","7fsYMnFqik","24ARF2Yz7E","gf8rIsqVrf",
+"55rfBOz8yZ","Ul4a1BFkb8","POUYS0YAGH","QClRLn1pmO","Cfgr3tAOsr","2hEEU580YD","dmoS7EoToP","SbRYyciuWz","ni2v1JkzUn","FhtgljS1aj",
+"fqypynnP8o","AgJHQb29RJ","a00b5GXdoH","UlU3MfmIK1","TXQ0ZI7p2a","6q6L9uTacx","IBe8kPb1pa","rKDLJBCxeC","2Yz7En1pmO","d7vjMP6bcg",
+"NAFuwFnPFB","FwEJzpmeCd","U3yw5IRh48","OUqFMfaHir","8TxD78TxD7","NAFuwIKxdL","rhl0JG1RhS","4dEz6x3LDe","pmeCdiwzGk","JJs5mgdQsS",
+"pvgjSlH1kt","SWfouDLhzM","MezSWiqv4k","piJSkgjUTu","s93MlYjB9t","taOXKFVMxo","0BmCy7hyVv","NOHszY1mC0","ogLgcGWqqX","v8yFNRkQke",
+"tjQxsFwEJz","xXTI43otm6","0h1b1LDk6f","ZUnqtBbwgA","vkCHHBbwgA","lViBvlH1kt","hSSvQDcpWB","e6e4zzQt6Q","Kr8ysZUnqt","tl72WFjHXR",
+"55rfBS2Dfu","JXljWzFgtB","Ss0ZuYjB9t","uvf7AReKEW","zqH0WjSjS3","jiVBP9GXkX","1LB1Lhe9IA","K4GS8SWfou","lsQGo2Nslm","2ZHdkXyPZN",
+"zQt6QcmXIX","vLsmSYh1hF","yvOMIqUJMd","8TxD7Yw2oU","EoToPtaOXK","rhl0JBFkb8","8TxD7pv0i7","pmeCdRpBQm","azIWpBGaQY","Pb1payluBx",
+"wDajXiqv4k","NhXdu16lHc","L7cGci7WMQ","cQOnvgIYvE","UlU3M4W0Tl","NcICABbwgA","zqH0WZ4I1v","v8yFNTwano","fmIK1Uvlv4","s4786jiVBP",
+"SmGzvguMb8","FNYIMgtCA5","FGzgpHzZT8","8RCUARACuj","Z4I1vhe9IA","pvgjSIBe8k","5ZaEzlViBv","DG4sTnlaBy","okgRiUlU3M","iB08lnFqik",
+"POUYSuZPqg","uN6r30ao3l","k85AeUlU3M","nnP8oVNCPd","hE1Ql5Drn0","uupzkhe9IA","jS1aj5IhmG","lkMUAd7vjM","zY1GYWaim6","X6Pins4786",
+"a00b5CqqaD","gdQsSPb1pa","lkMUAtlILt","NhXduiKqhr","AmdQd45cIH","D6rByrKDLJ","piJSkuoStw","djsrv5IhmG","SmGzvpv0i7","In3NSFNYIM",
+"dmoS7MojnP","F6PT2Gv3Fq","9y4lwLDk6f","n1pmOQChxs","zz4ZUfqypy","JJs5mxXTI4","5iGN5WaWsv","DcpWBmz8gx","GWqqXdhSuH","VBjhzXyPZN",
+"gtCA5XyPZN","MezSWd7vjM","AIYUub29RJ","K20wKokgRi","nFqikReKEW","48cHLLbRTH","EoToPKsjRK","jtn0XhE1Ql","ZzJHWt98iW","DQimp2TRI7",
+"tlILtHlUbF","iwzGksuY4x","RBhp0tlILt","FLsphsx5Gl","64s8N5ZaEz","JRJQB45cIH","rKDLJiwzGk","M3zXLsuY4x","64s8Nt98iW","0KyfsO3iyQ",
+"O3iyQIKxdL","5nmWvqQxHP","l83UdNOHsz","0BmCyX6Pin","faHirHlUbF","ThjNnXflUq","HzZT8FNYIM","0KyfsSWfou","AOgEeix74r","JRJQBfFDrJ",
+"1j5L8faHir","x3LDeHlUbF","i7WMQzHF1q","QYxC0Mkgy8","OUqFMJKWYR","hUTw7faHir","RxrsmVjCZq","uTacx7fsYM","IBe8kQYxC0","hYBCKgdQsS",
+"cQOnvjtn0X","16lHcUl4a1","QbxXcEdBKc","StlDJRxrsm","pv0i7dhSuH","F6PT2XyPZN","KASQ83otm6","kZANmjeskS","SmGzvtlILt","xXTI4uN6r3",
+"pmeCd0h1b1","xXTI4SbRYy","S77LH8hJdt","Kr8ys4W0Tl","YjB9tZv7z0","oGu6x580YD","d85a9iwzGk","OUqFM2DREs","No0QbYw2oU","DG4sTnFqik",
+"YOfrYjiVBP","VNCPdlweGy","1j5L8VBjhz","RpBQmYOfrY","Z4I1vD6rBy","ECMvUzbIYY","CNHmvOxWIH","Yf2EcPOUYS","kB5nPFjHXR","aDGtS24ARF",
+"8cVD3yvOMI","qaofN618Di","ZzJHW48cHL","pFrrla00b5","QYxC0jiVBP","aL6AJjS1aj","fLNg8Gv3Fq","WreyPuJScX","fmIK1O3iyQ","BCxeChUTw7",
+"JJs5mhe9IA","ydG8UJKWYR","Uvlv47fKYU","dQ5860BmCy","xciqp48cHL","XyPZNdpe1v","BGaQYQWxoT","pWiOsyluBx","tlILtW7cTs","mz8gxfFDrJ",
+"CxVEfjtn0X","TXQ0ZBCxeC","No0QbAIYUu","hSSvQRmDcr","AgJHQo8Uyd","aez9yCqqaD","W7cTsCp3mZ","ZuDtDjiVBP","ru4UGaL6AJ","tl72WBpYhV",
+"gtCA5RBhp0","1LB1L7ku1p","faHirS77LH","RpBQmVIlwP","VBjhzCdyBV","0PktIOz8yZ","jfREuRxrsm","uLtKsn8pJ9","45cIHYw2oU","hUTw75ZaEz",
+"aDGtSFjHXR","3weIF7lUXZ","oVQp6lm0pD","5Drn02DREs","BGaQYTCgPp","y94nwRkQke","hYBCKY1mC0","Yh1hF4dEz6","B3qemGXdoH","uAWypcQOnv",
+"gf8rICxVEf","S77LHSs0Zu","CIShGKASQ8","GXdoHuPX7G","jSjS3m4bxU","OUYuF6q6L9","9GXkXYf2Ec","oGu6xCdyBV","yEfy9MaJQs","RzaZAK20wK",
+"24ARFgIYvE","0h1b1Cp3mZ","OHaBzKsjRK","wDajXEOE1o","o8Uyd3weIF","Nxx9VIKxdL","ZUnqttlILt","lkMUAWaim6","GWqqXYOfrY","s7MxkRmDcr",
+"D6rBycQOnv","WPmlxlj07Q","zY1GYsoy9t","uQIcz0MR5X","cShY28FmFH","M6qcGtjQxs","uvf7AQworu","zbIYYjfREu","5ZaEz1j5L8","euZA5hSSvQ",
+"zqH0Wxciqp","uupzkVLTy6","MGlTFt98iW","djsrv6AFT0","8xEKzAXpwE","lpF6WiB08l","7X3uypvgjS","hE1QlEOE1o","3weIFCfgr3","taOXKXflUq",
+"WaWsvP6bcg","M6qcGVprf2","CK5W7Yf2Ec","n8pJ9uPX7G","6AFT0DLhzM","GWqqXtuDyS","lm0pD29QAz","d7vjML7cGc","dhSuHI7p2a","QChxsyvOMI",
+"No0Qb45cIH","W3VFHyluBx","pAhR1jfREu","EoToPCp3mZ","1v5hHJKWYR","FFDuivLsmS","IRh48JIqXi","QClRLNOHsz","zFgtBuTacx","pvgjSXyPZN",
+"pWiOsh1zcH","K4GS8faHir","1v5hHpmeCd","DQimp6q6L9","FVMxoLDk6f","piJSk0Kyfs","i7WMQCxVEf","azIWpaez9y","JIqXiVjCZq","cL0aEjeskS",
+"yToGWqaofN","I7p2aW7cTs","7ku1pPOUYS","uupzkfcwDa","UmaEvzz4ZU","jSjS3fmIK1","lsQGonFqik","hSSvQfLNg8","uupzkDLhzM","AXpwElpF6W",
+"soy9tQChxs","zHF1qv2eC3","ZhwG1D6rBy","oGu6xFnPFB","iB08llm0pD","v8yFN5Mg9r","oVQp629QAz","FNYIMFxX9q","s7MxkAkKTk","tjQxshE1Ql",
+"HzZT8b29RJ","zz4ZUMezSW","hUTw7gIYvE","L7cGcMmKGJ","uvf7A0h1b1","Yf2EcRmDcr","s93Mla00b5","tuDySuAWyp","cmXIXKr8ys","ksJbyuAWyp",
+"CxVEfatef2","QChxsgtCA5","lH1ktdhSuH","cShY2Pb1pa","nFqikFPfSE","8RCUAhe9IA","s93MlCp3mZ","1LB1L0YAGH","FGzgpAOgEe","64s8NsuY4x",
+"zFgtBU3yw5","Q6hMCb29RJ","6AFT0b29RJ","IKxdLTwano","uAWypokgRi","yvOMI7X3uy","HP433jS1aj","4QMc9nlaBy","hi5X7L7cGc","yvOMIAkKTk",
+"uLtKssqVrf","sx5GlkB5nP","9y4lwXflUq","RACujSmGzv","4W0TlBpYhV","o8UydzHF1q","RsQUqa00b5","580YDhSSvQ","FcWrWbgJAz","5VZjSprNT6",
+"qUJMdvkCHH","Dz1R3brhlQ","fFDrJlXFOB","CIShGQClRL","fFDrJokgRi","NcICAgIYvE","5nmWvkB5nP","5ZaEzSWfou","LewvMlj07Q","gIYvEXyPZN",
+"VBjhzJ2mQi","F6PT2cShY2","fcJOySs0Zu","qQxHPSbRYy","QbxXchi5X7","64s8N1j5L8","ECMvUuN6r3","J2mQi0h1b1","8RCUA4QMc9","SWfouJ2mQi",
+"Yh1hFFLsph","gjUTutuDyS","AmdQdvkCHH","55rfB5drc6","MojnPWaWsv","pAhR1fcwDa","55rfB1j5L8","BCxeCjSjS3","MezSWdmoS7","WaWsv0MR5X",
+"8RCUA7fKYU","OxWIHCxVEf","tlILtYjB9t","MGlTFbZLvS","2DREsv2eC3","WDVWJy94nw","ksJby9rlg9","07n1c64s8N","WmadAhYBCK","Nxx9VCNHmv",
+"QYxC0FGzgp","tlILt7X3uy","prNT6AIYUu","3weIFOUqFM","0KyfsBCxeC","pT8wulCMxy","0MR5Xa00b5","3weIF07n1c","580YDAmdQd","yvOMIazIWp",
+"16lHcAgJHQ","M6qcGZ4I1v","GWqqXFNYIM","xReec48cHL","xReec64s8N","14FLRjiVBP","FPfSEB3qem","FcWrW16lHc","OxWIHxXTI4","YjB9tRBhp0",
+"lH1ktaL6AJ","v2eC3POUYS","vkCHHjfREu","2Nslmrz7Ut","LbRTHIRh48","ZUnqto8Uyd","WaWsvguMb8","tjQxsfFDrJ","1v5hHuoStw","Qworuk85Ae",
+"WPmlxY1mC0","lViBvQssNC","1j5L8oGu6x","uPX7GvkCHH","45cIHGSQwj","d85a97X3uy","m4bxU07n1c","fFDrJX6Pin","CNHmvprNT6","AOgEeSWfou",
+"M3zXLjSjS3","k85AeU3yw5","AIYUuFnPFB","atef2t98iW","IBe8k64s8N","iwzGkFGzgp","9GXkXcmXIX","Gv3Fqix74r","1LB1LzqH0W","iwzGkxReec",
+"uTacxmX2GE","ogLgcTXQ0Z","MGlTFpiJSk","MmsIoMK07Y","lj07QXflUq","0h1b1Twano","EdBKczbIYY","7fsYMvOqCE","QClRLuZPqg","oVQp6Cfgr3",
+"hi5X7Z4I1v","QssNCYOfrY","L7cGcni2v1","EOE1olkMUA","JKWYRydG8U","lsQGolpF6W","qUJMdS2Dfu","QYxC0Uvlv4","xXTI42Yz7E","aL6AJuoStw",
+"QYxC01v5hH","IRh48VLTy6","i3pyd7lUXZ","a00b5Gv3Fq","zY1GYIKxdL","580YDCNHmv","iB08ls93Ml","nnP8ooVQp6","ThjNnkZANm","SWfouazIWp",
+"ogLgc5nmWv","rKDLJBbwgA","Ta8f6YjB9t","pvgjSbgJAz","prNT6FPfSE","fcJOyv8yFN","0BmCyd85a9","WPmlxS77LH","8cVD3VjCZq","NAFuwZhwG1",
+"IBe8kfcJOy","DcpWB9XyT9","QYxC0t98iW","X6PinAIYUu","KZamHcmXIX","In3NSuLtKs","aDGtSpmeCd","EoToPzY1GY","h1zcHuLtKs","Twano7fKYU",
+"JkzUnjSjS3","okgRiqQxHP","GrDg7Zv7z0","Oz8yZBbwgA","okgRiyofH3","QworuyToGW","nFqikMGlTF","uAWyp7fsYM","1v5hH8U2nU","SbRYyQYxC0",
+"yvOMIUmaEv","yEfy9NcICA","SbRYyOUqFM","uPX7GoQ87r","ZJTXHtAOsr","vLsmSCdyBV","No0QbMaJQs","QYxC0RsQUq","lViBvjtn0X","FwEJzsx5Gl",
+"EdBKc2Nslm","cShY2VNCPd","0Kyfs2DREs","D6rBy7hyVv","faHirJIqXi","9y4lwSWfou","zqH0WWaim6","9GXkX2Nslm","lH1ktlH1kt","guMb8Ta8f6",
+"GSQwjBCxeC","580YD9y4lw","kZANmFFDui","FhtglMezSW","QssNCVLTy6","KASQ8HfyNQ","ECMvUt98iW","ru4UGUvlv4","t98iWdpe1v","9iGoTMojnP",
+"fLNg8QWxoT","dpe1vUl4a1","MmKGJoVQp6","580YDY1mC0","RmDcrI7p2a","fcJOyhE1Ql","fqypyrKDLJ","Z4I1vOUYuF","RmDcr7X3uy","pv0i7GSQwj",
+"ksJbyuZPqg","1j5L8JRJQB","DLhzM5Namm","e6e4zECMvU","BGaQYXflUq","2Yz7EiKqhr","EOE1orhl0J","fcwDaVNCPd","zbIYYguMb8","8cVD3h1zcH",
+"BpYhVb29RJ","tAOsriqv4k","k85AeJ2mQi","ZzJHW8U2nU","JkzUngdQsS","K4GS8aL6AJ","OxWIHF6PT2","07n1cd7vjM","pAhR129QAz","EdBKc8xEKz",
+"CNHmvQworu","VjCZq2ZHdk","hSSvQ1j5L8","FGzgpFcWrW","M3zXLMmKGJ","Ss0ZuKZamH","CK5W7hYBCK","gf8rI0Wr5y","d7vjMQClRL","Oz8yZ7ku1p",
+"0MR5XgIYvE","b29RJFVMxo","rhl0JSWfou","7lUXZQClRL","VIlwPpv0i7","dpe1vcQOnv","hE1QlfmIK1","GXdoHt59lR","HlUbFcmXIX","BbwgAJXljW",
+"jfREupAhR1","pmeCdpWiOs","kB5nPVerEA","Dz1R3uvf7A","8cVD3fmIK1","iB08lQ6hMC","lH1ktqUJMd","o8UydhUTw7","i7WMQi3pyd","suY4xnnP8o",
+"RBhp0jeskS","pWiOseuZA5","qUJMdCdyBV","o8Uyduvf7A","aez9yOz8yZ","MojnP7hyVv","fLNg8xXTI4","FcWrWRxrsm","iwzGk2DREs","fcwDakB5nP",
+"cmXIXkB5nP","zz4ZUCqqaD","XyPZN0PktI","cShY2faHir","tlILtBpYhV","pmeCdW3VFH","n1pmOnFqik","AXpwEhYBCK","y94nwHfyNQ","gIYvEksJby",
+"HlUbFS2Dfu","yluBxOHaBz","2DREs9GXkX","IKxdLh1zcH","bgJAzlViBv","FVMxoLbRTH","nnP8oFhtgl","7fKYUlj07Q","fqypyjS1aj","CxVEfjSjS3",
+"uLtKsUlU3M","8FmFHpWiOs","ZJTXHjS1aj","Yh1hFqQxHP","AgJHQokgRi","lXFOBuupzk","jS1aj0ao3l","0Wr5ypAhR1","RBhp0ru4UG","XflUqokgRi",
+"n1pmOD6rBy","HzZT8y94nw","fLNg8EoToP","CqqaDAkKTk","Uvlv4OxWIH","zHF1q4W0Tl","lsQGo8RCUA","iB08l9eoRc","G1RhSS77LH","lsQGoOUYuF",
+"BbwgAcShY2","3weIFi7WMQ","yofH3vOqCE","n8pJ9AXpwE","KASQ8EdBKc","MmsIoMm8si","uJScXqUJMd","48cHL55rfB","HRxd8FGzgp","uZPqgI7p2a",
+"mz8gxatef2","2DREsbgJAz","guMb848cHL","IBe8kJIqXi","i3pyd9iGoT","FPfSECxVEf","kZANmMezSW","Mkgy8Y1mC0","sx5GlF6PT2","jfREuo8Uyd",
+"s4786ZzJHW","cShY2k85Ae","fLNg85Drn0","BpYhV618Di","n8pJ9AkKTk","zHF1qJkzUn","pmeCdRmDcr","mz8gxlsQGo","jiVBPKASQ8","VNCPdulk41",
+"lXFOBFcWrW","XyPZNo8Uyd","gtCA5K4GS8","L7cGc8FmFH","y94nwEoToP","GrDg79GXkX","Mm8siy94nw","KASQ8NOHsz","AOgEeVprf2","MmsIoLewvM",
+"ECMvUFGzgp","1v5hHGv3Fq","k85AeIBe8k","K20wKpAhR1","jSjS3guMb8","L7cGchi5X7","KZamHfqypy","LewvMStlDJ","G1RhS9iGoT","azIWp9y4lw",
+"d7vjMaez9y","gjUTut59lR","0MR5XyEfy9","ZuDtDC2Irc","5Drn05IhmG","tl72W7Ow5C","O3iyQwDajX","WPmlx2hEEU","djsrvQnJ1S","dhSuHqUJMd",
+"iKqhrQssNC","rhl0JXflUq","fqypyprNT6","azIWp24ARF","lXFOB7lUXZ","iqv4kAgJHQ","7ku1pk85Ae","AXpwEqUJMd","gjUTu14FLR","zHF1qlsQGo",
+"fLNg8yEfy9","i3pydt98iW","zz4ZUEOE1o","zbIYYNhXdu","OHaBzgf8rI","vLsmSXyPZN","7X3uypAhR1","n1pmOChuy3","atef2D6rBy","jeskSdjsrv",
+"zY1GYQworu","QssNCuQIcz","RzaZAIBe8k","azIWpiB08l","MGlTF9eoRc","taOXKQYxC0","5drc624ARF","YjB9tv2eC3","blLA9W3VFH","MmsIotAOsr",
+"pmeCdaFFss","8xEKzjiVBP","EoToPZJTXH","AmdQdB3qem","gdQsSAIYUu","Chuy37ku1p","euZA5F6PT2","m4bxUsoy9t","618DiaDGtS","FnPFBGv3Fq",
+"KASQ8soy9t","ECMvUXyPZN","Ss0ZuTXQ0Z","hE1QlRmDcr","1v5hHtl72W","Y1mC0CIShG","MmsIovLsmS","ReKEWdQ586","No0Qb1v5hH","jiVBPVBjhz",
+"DLhzMQ6Lix","WaWsvhi5X7","OUYuFGv3Fq","MmsIopiJSk","ru4UGbgJAz","zFgtBG1RhS","D6rBy5IhmG","WaWsvtvdkD","7fsYMaDGtS","PYBf4FVMxo",
+"i7WMQLbRTH","uupzkRmDcr","3otm68TxD7","NcICAkB5nP","FVMxoSjskQ","IKxdLFnPFB","07n1cBGaQY","pvgjSgIYvE","JXljWKASQ8","IjTwPKr8ys",
+"16lHcxciqp","zFgtB4QMc9","gjUTuVLTy6","sx5Gl07n1c","EOE1oOz8yZ","rhl0JNcICA","ydG8UZuDtD","JkzUnQWxoT","7Ow5ClCMxy","fqypyokgRi",
+"Mkgy8GWqqX","uZPqgSjskQ","J2mQicmXIX","ZUnqtOz8yZ","5IhmGFGzgp","yToGW5drc6","uvf7A3weIF","Oz8yZiqv4k","C2IrcpWiOs","GrDg7iwzGk",
+"ZJTXH4QMc9","Gv3FqOUYuF","ydG8UMojnP","9rlg9a00b5","Vprf2xciqp","8TxD7FGzgp","zHF1qAOgEe","euZA5cmXIX","Ul4a1MojnP","oGu6xxXTI4",
+"zHF1q8hJdt","pT8wuEdBKc","cQOnv48cHL","uAWypjtn0X","h1zcHWaim6","0Wr5yUvlv4","0MR5XQClRL","hE1Qlv2eC3","suY4xcQOnv","F6PT2pvgjS",
+"t98iWIjTwP","IjTwPGv3Fq","FNYIMWMiS3","JkzUnoGu6x","i3pydNcICA","WMiS3uN6r3","s7MxktvdkD","EOE1opmeCd","BbwgAFxX9q","s4786BpYhV",
+"2DREsPOUYS","QbxXcK20wK","EOE1oPYBf4","ogLgcKsjRK","MK07YTwano","FxX9qjzUqR","580YDzz4ZU","e6e4zs4786","DQimpQWxoT","580YD5Namm",
+"CqqaDQChxs","0ao3lQYxC0","k85Aelm0pD","tAOsrDz1R3","Ss0ZuGrDg7","jiVBP580YD","K20wKdQ586","lsQGotlILt","lCMxyHzZT8","aFFssd7vjM",
+"xReec2Nslm","sqVrfUvlv4","JXljWStlDJ","580YDVerEA","l83UdMK07Y","gf8rIaFFss","euZA52ZHdk","v2eC3WMiS3","RsQUqYf2Ec","LDk6ffcwDa",
+"ZhwG1MezSW","W3VFHs93Ml","4QMc9d85a9","WreyPmz8gx","ThjNn9eoRc","FFDuiydG8U","QWxoTmX2GE","1v5hHECMvU","QYxC0jtn0X","5ZaEz3otm6",
+"IRh48RkQke","FnPFB0PktI","QnJ1SG1RhS","mz8gxcL0aE","4QMc9FVMxo","BbwgALDk6f","Yh1hFjfREu","euZA5XflUq","JkzUngf8rI","pFrrluJScX",
+"48cHLprNT6","5Drn01v5hH","bgJAzZUnqt","MaJQsCxVEf","CdyBVlViBv","e6e4zNAFuw","tAOsrCNHmv","QssNCMaJQs","VerEANAFuw","5Drn0hi5X7",
+"lweGy0ao3l","uLtKs64s8N","MezSWzz4ZU","WaWsvFwEJz","1LB1LTXQ0Z","Y1mC08RCUA","TXQ0ZtlILt","cmXIXuLtKs","yluBxVIlwP","9iGoTLewvM",
+"Dz1R345cIH","AXpwEQ6hMC","ECMvUtAOsr","jSjS3AIYUu","gjUTuAmdQd","WreyPMojnP","CdyBVGWqqX","Nxx9VWDVWJ","S2Dfu8RCUA","2DREsU3yw5",
+"WreyPDQimp","dpe1v7hyVv","he9IAoVQp6","55rfBbgJAz","Uvlv4ZzJHW","iB08lnnP8o","DG4sTs7Mxk","gdQsSUvlv4","MmKGJRmDcr","uLtKsYOfrY",
+"tjQxs48cHL","fqypyyluBx","GWqqXKr8ys","9XyT9suY4x","9rlg9VNCPd","aDGtS9GXkX","7Ow5Cs4786","RkQkeECMvU","v1HlnjiVBP","HP433b29RJ",
+"BGaQYlj07Q","pv0i77X3uy","gtCA5MGlTF","AgJHQJRJQB","HfyNQQbxXc","P6bcgVjCZq","FwEJzfFDrJ","euZA5hUTw7","MmsIo7Ow5C","rKDLJOz8yZ",
+"9rlg9uTacx","soy9tzHF1q","uTacxfFDrJ","NcICAfcwDa","jzUqRiwzGk","ZUnqtYh1hF","QWxoTnFqik","IRh48lsQGo","kB5nPvLsmS","qQxHP6AFT0",
+"RACujXflUq","6q6L9PYBf4","jfREuU3yw5","AmdQdtAOsr","suY4xfFDrJ","WreyPpFrrl","Cfgr30YAGH","2Nslm8U2nU","WreyP8xEKz","UmaEvD6rBy",
+"gf8rIMaJQs","MK07YAkKTk","okgRifcJOy","9rlg9piJSk","qaofNiKqhr","9iGoTPb1pa","t98iWXflUq","nlaByFwEJz","sqVrf4W0Tl","lsQGoblLA9",
+"MmKGJjeskS","14FLRY1mC0","HlUbFMmsIo","e6e4zJXljW","FPfSEtAOsr","fqypyMmsIo","kB5nPUvlv4","pvgjSNxx9V","BGaQYReKEW","SWfoutl72W",
+"RpBQmoVQp6","zqH0WogLgc","lpF6W7lUXZ","45cIH2TRI7","ulk41fcJOy","djsrvM6qcG","FNYIMhe9IA","sx5GlQChxs","IBe8kBCxeC","n8pJ9ksJby",
+"HfyNQMmKGJ","t59lR7X3uy","6q6L9KZamH","wDajXydG8U","lViBviB08l","EOE1oZuDtD","dhSuHJIqXi","m4bxUYjB9t","uZPqgQssNC","Ta8f6jeskS",
+"oGu6xlsQGo","618Did85a9","Vprf2P6bcg","TwanoyofH3","piJSkGSQwj","1LB1LuJScX","ogLgcJJs5m","48cHLBGaQY","EdBKcdjsrv","a00b5tvdkD",
+"pWiOsHRxd8","zY1GYX6Pin","Ss0ZuwiHrZ","m4bxUhe9IA","VBjhz5iGN5","lkMUADz1R3","zQt6QksJby","KASQ8CIShG","GWqqXQworu","Z4I1vRsQUq",
+"MmKGJ0ao3l","IKxdLHlUbF","dpe1v580YD","9XyT9ZJTXH","pWiOsMmKGJ","zQt6QtuDyS","cQOnvFhtgl","BpYhVIKxdL","Ta8f6MmsIo","jSjS3POUYS",
+"BCxeCFLsph","K20wKuupzk","vOqCEdpe1v","yofH3U3yw5","Vprf2fLNg8","h1zcHRsQUq","0BmCyDcpWB","NcICAHfyNQ","I7p2a0h1b1","F6PT2SmGzv",
+"5NammokgRi","fLNg8RBhp0","5drc6WDVWJ","618Di8xEKz","YjB9tyEfy9","GWqqXhi5X7","24ARFKr8ys","euZA5ThjNn","lH1ktJXljW","x3LDe7fsYM",
+"JIqXiCK5W7","SbRYyX6Pin","pAhR16AFT0","hSSvQYOfrY","jtn0XNcICA","HzZT8faHir","qQxHPtAOsr","5iGN5tuDyS","ix74rzz4ZU","AkKTkhi5X7",
+"sx5GlUmaEv","8xEKzFGzgp","OHaBzcShY2","QnJ1SIBe8k","zHF1quN6r3","8xEKzlsQGo","pWiOsmX2GE","RkQkeoQ87r","W7cTsAIYUu","Yw2oUh1zcH",
+"FnPFB0Wr5y","Ta8f6oQ87r","BCxeCtl72W","0Wr5y2ZHdk","fFDrJMezSW","lsQGoEOE1o","BbwgAZv7z0","0Kyfslj07Q","EoToPgf8rI","YOfrYlj07Q",
+"DQimpJKWYR","tAOsrfcJOy","v2eC30YAGH","RxrsmBFkb8","AgJHQ5IhmG","KsjRKUlU3M","7hyVvuTacx","B3qemoGu6x","FNYIM7lUXZ","h1zcHguMb8",
+"pFrrluZPqg","v8yFNzbIYY","YOfrYkZANm","gIYvEZJTXH","HlUbFatef2","2Yz7EsuY4x","jfREusx5Gl","ciuWzKsjRK","i7WMQciuWz","K4GS8uLtKs",
+"mX2GEwDajX","0YAGHSjskQ","pv0i75Namm","5drc6Ss0Zu","IjTwPNOHsz","lweGyIn3NS","7hyVv5iGN5","OHaBzGWqqX","ECMvUdhSuH","HfyNQ55rfB",
+"aFFssprNT6","VjCZqGWqqX","hUTw7Y1mC0","NcICAPYBf4","UlU3MhYBCK","5Namm14FLR","x3LDefLNg8","zqH0W1LB1L","mz8gxprNT6","CqqaDReKEW",
+"KZamHcQOnv","zmLYDtjQxs","SmGzvgjUTu","K4GS8VIlwP","D6rByfaHir","OUYuFZ4I1v","9y4lw8hJdt","8FmFHHRxd8","WreyPatef2","fFDrJECMvU",
+"ydG8UokgRi","t98iWQbxXc","WPmlxU3yw5","e6e4zVIlwP","CxVEfogLgc","Dz1R3t98iW","0BmCyvkCHH","4W0TlMmsIo","HzZT8n8pJ9","vkCHHtAOsr",
+"FwEJz5ZaEz","XflUqfmIK1","gtCA50YAGH","0h1b12Nslm","lCMxyfmIK1","64s8N64s8N","d7vjMt98iW","ThjNnn1pmO","4dEz6lH1kt","FPfSECNHmv",
+"S2Dfu1j5L8","FhtglHlUbF","t98iW5Drn0","bZLvS5IhmG","b29RJMmKGJ","EdBKcfqypy","MK07YWreyP","bZLvSlCMxy","07n1cBCxeC","14FLRcQOnv",
+"NOHszReKEW","NhXduru4UG","h1zcHEOE1o","iKqhr4W0Tl","7hyVvW3VFH","RzaZARACuj","0h1b1zz4ZU","azIWplkMUA","iB08lNhXdu","Uvlv4XflUq",
+"OUqFMIjTwP","atef2uTacx","dpe1vfLNg8","zY1GYpv0i7","LbRTH0Kyfs","FhtglguMb8","TXQ0Z3otm6","7hyVvNAFuw","t98iW48cHL","blLA9ru4UG",
+"ThjNnQ6hMC","tuDySFVMxo","Z4I1vvOqCE","piJSk3otm6","QnJ1SM3zXL","sqVrfFnPFB","PYBf4sqVrf","8xEKzHfyNQ","d7vjMni2v1","wiHrZWreyP",
+"YOfrYpFrrl","Mkgy8FVMxo","JRJQBMezSW","BGaQYi3pyd","xXTI48RCUA","IKxdLCp3mZ","zY1GYW7cTs","uLtKsuQIcz","brhlQuZPqg","7fKYUGWqqX",
+"t59lRjiVBP","618DiRkQke","TCgPpKr8ys","tlILt0PktI","Kr8ysru4UG","pvgjSRBhp0","WDVWJ5VZjS","Yh1hFBCxeC","9GXkXmX2GE","qUJMdkZANm",
+"B3qemECMvU","wiHrZsoy9t","GrDg7lXFOB","v1HlntAOsr","C2Irc64s8N","5Namm8hJdt","WDVWJkB5nP","uoStwazIWp","IBe8kdhSuH","EOE1oQWxoT",
+"xReecyofH3","AOgEecL0aE","tAOsrsuY4x","wiHrZfcwDa","zFgtB9rlg9","OHaBz3otm6","s93Ml5iGN5","FhtglTXQ0Z","v2eC3JXljW","iwzGkThjNn",
+"W3VFHCIShG","No0Qb0BmCy","5Drn00Kyfs","NAFuwmX2GE","vkCHHBFkb8","yofH30h1b1","xXTI445cIH","Pb1paLewvM","OUqFMs7Mxk","SbRYynFqik",
+"Yf2EcJRJQB","9XyT9uTacx","9y4lwdQ586","Ss0ZuBGaQY","sqVrf4QMc9","zmLYDCp3mZ","WmadAs4786","Ta8f6DQimp","8hJdt5iGN5","dmoS74dEz6",
+"aL6AJ9GXkX","1j5L8ThjNn","Zv7z0CqqaD","pv0i7uQIcz","pvgjSd85a9","Zv7z0ZhwG1","sx5GlNo0Qb","gIYvEWmadA","S2DfuoGu6x","AkKTkOUYuF",
+"iwzGkPOUYS","4W0TlhYBCK","TwanoMezSW","v8yFNuLtKs","yToGWfaHir","5iGN55Drn0","uupzkMaJQs","lViBvAOgEe","i3pyd2hEEU","AOgEeDQimp",
+"yEfy9gdQsS","GrDg7Fhtgl","Y1mC0OxWIH","7X3uyzmLYD","1LB1LdQ586","8TxD7lCMxy","Q6LixEdBKc","55rfBjS1aj","Y1mC0DLhzM","5NammFGzgp",
+"Uvlv4ogLgc","BpYhVtuDyS","OUYuFtAOsr","OUYuFkZANm","ulk41FNYIM","B3qemS2Dfu","iKqhrsx5Gl","lkMUAKsjRK","4W0TlJRJQB","hSSvQ48cHL",
+"KsjRK8cVD3","QnJ1SOHaBz","GXdoH5IhmG","b29RJuN6r3","oVQp6qUJMd","SbRYyYw2oU","JJs5m8U2nU","n8pJ9YOfrY","RzaZAfmIK1","16lHcksJby",
+"pT8wus7Mxk","suY4xRACuj","OUqFMVjCZq","Z4I1vFGzgp","RBhp0lweGy","NAFuwsuY4x","zz4ZUQssNC","tl72Wv8yFN","wiHrZMaJQs","tuDySCp3mZ",
+"XyPZNd7vjM","cL0aEIRh48","IjTwPni2v1","AgJHQNAFuw","1v5hH9XyT9","lCMxyJKWYR","b29RJIKxdL","Cp3mZCp3mZ","Mm8siuvf7A","gjUTunnP8o",
+"Waim60h1b1","EdBKcJIqXi","oGu6xkZANm","9GXkX1v5hH","D6rBytjQxs","JJs5muZPqg","zqH0WFLsph","45cIHM3zXL","Vprf2zFgtB","5ZaEzK4GS8",
+"zz4ZUiwzGk","24ARF45cIH","s93MlzbIYY","StlDJsuY4x","brhlQ0YAGH","FwEJz0h1b1","uLtKsZJTXH","S2DfuLDk6f","djsrv14FLR","okgRi9eoRc",
+"1j5L8fcwDa","zmLYDGrDg7","KZamH5Drn0","W7cTsFNYIM","zFgtB7X3uy","rKDLJRmDcr","VIlwPl83Ud","hSSvQsuY4x","rhl0JMm8si","VIlwPGSQwj",
+"he9IAuTacx","h1zcHZ4I1v","fcwDalsQGo","M3zXL6AFT0","kB5nPCK5W7","nFqik1v5hH","5iGN5MmsIo","2hEEURpBQm","WPmlxyvOMI","fqypyogLgc",
+"8hJdthYBCK","JRJQB4QMc9","In3NSOHaBz","zmLYD29QAz","Ss0ZuzY1GY","GrDg7IKxdL","LbRTHsoy9t","sqVrfRmDcr","azIWpAXpwE","QChxslsQGo",
+"zHF1qOUqFM","JKWYRQChxs","WaWsvOUqFM","jiVBPx3LDe","jtn0XiwzGk","fcJOy1LB1L","uvf7AtuDyS","uLtKsd85a9","ydG8UReKEW","vLsmS4W0Tl",
+"Q6hMCKZamH","vkCHHjeskS","DLhzMBGaQY","ReKEWjiVBP","NhXduyluBx","oVQp6CqqaD","RBhp06q6L9","AgJHQ4dEz6","piJSkQnJ1S","RkQkefmIK1",
+"Q6hMCQbxXc","FNYIM5Namm","FnPFBqQxHP","lH1ktG1RhS","ThjNn8FmFH","s4786RzaZA","NhXduuZPqg","Q6hMCk85Ae","CdyBVLDk6f","5Drn0QssNC",
+"vOqCEHRxd8","MezSW9rlg9","Kr8ysFxX9q","bgJAzprNT6","hYBCKzz4ZU","1LB1LpvgjS","uJScXe6e4z","QworuEoToP","gIYvES2Dfu","7fsYMM6qcG",
+"wDajXd7vjM","8xEKzsqVrf","ni2v1uJScX","v1HlnO3iyQ","48cHLS77LH","Mkgy8BCxeC","0YAGHXyPZN","5NammVIlwP","Nxx9V9XyT9","pWiOs7fsYM",
+"iwzGkgtCA5","8RCUAFnPFB","LewvMMK07Y","8TxD76q6L9","fqypyyofH3","oGu6xpmeCd","In3NS24ARF","LDk6fWPmlx","aez9yKr8ys","MmKGJM6qcG",
+"zbIYYksJby","fcwDaPYBf4","U3yw5tlILt","Ss0Zu6AFT0","FwEJzJkzUn","7X3uyuLtKs","lpF6W24ARF","JJs5myEfy9","pFrrl0h1b1","ZzJHWD6rBy",
+"d85a9lkMUA","QworuPb1pa","TCgPpTXQ0Z","9XyT91LB1L","uQIczPOUYS","Yw2oUAOgEe","zFgtBHlUbF","FjHXRVIlwP","pWiOsBCxeC","Zv7z048cHL",
+"WreyPpAhR1","dmoS7xReec","8cVD3d85a9","GSQwjwiHrZ","atef2pWiOs","WMiS3CK5W7","Q6hMCSWfou","v8yFNbgJAz","Mkgy8tAOsr","AOgEe8RCUA",
+"gf8rIXflUq","aDGtSDG4sT","suY4xM3zXL","HzZT8ZUnqt","Ta8f6MGlTF","fFDrJIKxdL","Oz8yZBCxeC","pAhR1L7cGc","CNHmviB08l","4W0TltvdkD",
+"oVQp6CxVEf","WPmlxuQIcz","NcICA2DREs","G1RhSZzJHW","aez9yZ4I1v","lkMUA45cIH","CK5W7uLtKs","8cVD3tuDyS","x3LDe0Kyfs","NOHsz2ZHdk",
+"2DREsQnJ1S","zHF1qYjB9t","WMiS3POUYS","pAhR1OHaBz","xciqpguMb8","ReKEW2ZHdk","7hyVvhi5X7","uvf7AcShY2","atef2Cfgr3","2ZHdkUmaEv",
+"Yh1hF45cIH","LewvMiB08l","14FLRni2v1","Nxx9VG1RhS","o8Uyd618Di","Q6hMCMmsIo","VNCPdZUnqt","AXpwEFLsph","0BmCypAhR1","wiHrZlweGy",
+"D6rByYjB9t","YOfrYprNT6","tl72WTXQ0Z","lViBvG1RhS","yEfy9XyPZN","RmDcruLtKs","lCMxyZzJHW","sx5GlFhtgl","Vprf2Mkgy8","5NammVprf2",
+"WMiS3vOqCE","blLA9lm0pD","Zv7z0WDVWJ","NcICAaez9y","gdQsSi3pyd","y94nwDQimp","ZJTXHfLNg8","29QAz6AFT0","djsrv4dEz6","GrDg7QWxoT",
+"blLA9yvOMI","J2mQiVBjhz","iKqhrix74r","Chuy3ix74r","RBhp0hSSvQ","618DiUlU3M","C2IrcNOHsz","vOqCE24ARF","1j5L81v5hH","pv0i7s93Ml",
+"5nmWvB3qem","HRxd8Mm8si","qQxHPksJby","7ku1pdpe1v","DcpWBFLsph","oGu6xpWiOs","JkzUnxciqp","taOXKyToGW","0YAGH0MR5X","yToGWNxx9V",
+"M3zXLnFqik","bZLvSuPX7G","zz4ZU7lUXZ","WPmlxOUqFM","7Ow5CDQimp","64s8N5iGN5","ix74rRACuj","WaWsvv8yFN","OUYuFmz8gx","gtCA5PYBf4",
+"rz7UtlkMUA","JRJQBIKxdL","0Wr5y8TxD7","Kr8ystAOsr","LDk6f0BmCy","VBjhzVLTy6","mz8gxjtn0X","bgJAzfaHir","48cHLuAWyp","fcJOyMezSW",
+"lpF6WtlILt","8xEKzatef2","W7cTsDQimp","QnJ1SWmadA","FVMxonnP8o","uLtKsKZamH","ciuWzksJby","SbRYyyToGW","sqVrfzHF1q","zmLYDt98iW",
+"45cIHzbIYY","uvf7AWmadA","jfREuM6qcG","5IhmGfcwDa","JIqXihE1Ql","QworucQOnv","KASQ8OUYuF","okgRiBbwgA","Ul4a1fmIK1","jzUqRAOgEe",
+"v2eC3J2mQi","IKxdLSbRYy","618DipFrrl","AIYUuWaim6","dhSuHvkCHH","lXFOBdjsrv","CIShGvLsmS","TXQ0ZyluBx","DQimpiB08l","Gv3FqaFFss",
+"wiHrZv2eC3","8FmFHJJs5m","JIqXiQworu","oVQp6mz8gx","gf8rIo8Uyd","uN6r32Yz7E","t98iWFjHXR","Uvlv4dhSuH","pvgjSlm0pD","1j5L8djsrv",
+"rKDLJxciqp","KASQ85drc6","ogLgcM6qcG","iwzGk0h1b1","4dEz6okgRi","zQt6QEdBKc","sx5Gl8FmFH","QWxoTOz8yZ","tlILt8cVD3","LbRTHfLNg8",
+"XflUqP6bcg","x3LDeAgJHQ","O3iyQXflUq","iKqhrpmeCd","rKDLJWMiS3","CK5W7rz7Ut","uJScXZzJHW","pWiOsGSQwj","x3LDezFgtB","QYxC0zbIYY",
+"8xEKzfLNg8","F6PT2MojnP","GWqqXAkKTk","7Ow5CmX2GE","dpe1vdjsrv","0PktIEOE1o","FNYIMNhXdu","s4786XyPZN","8hJdt7fKYU","DQimp24ARF",
+"POUYSGrDg7","POUYSzHF1q","prNT6k85Ae","lViBvWmadA","9iGoTFLsph","RACujpiJSk","v2eC31LB1L","yluBxQ6Lix","zFgtBS77LH","16lHcK20wK",
+"CIShGFLsph","oGu6xU3yw5","lCMxyfFDrJ","fmIK1PYBf4","Fhtgl7fsYM","TXQ0Zlm0pD","Rxrsm5nmWv","faHir4dEz6","P6bcgMaJQs","azIWp7hyVv",
+"kZANmjS1aj","BFkb8KZamH","lj07QAgJHQ","hE1QlYOfrY","RmDcr5Mg9r","7ku1phE1Ql","Y1mC0s4786","yofH3hUTw7","0BmCyhYBCK","kZANmFjHXR",
+"hi5X7Ta8f6","Dz1R3WmadA","s93MlThjNn","DcpWBSbRYy","cQOnv9iGoT","8RCUAZuDtD","JIqXiGSQwj","9eoRcgjUTu","qUJMdSbRYy","07n1c0ao3l",
+"fLNg88hJdt","dhSuH1LB1L","3weIF7fsYM","Nxx9VCqqaD","DG4sTVNCPd","tl72WoGu6x","YOfrYQssNC","OHaBz9y4lw","5Mg9rBGaQY","blLA9jiVBP",
+"5IhmGbrhlQ","Ul4a1atef2","cL0aEKZamH","5VZjSOUqFM","uupzkOUqFM","yEfy90ao3l","IjTwPStlDJ","MezSWZhwG1","BFkb8ogLgc","FGzgpfcJOy",
+"No0Qbs7Mxk","L7cGcS2Dfu","mz8gxOUqFM","KZamHIjTwP","uN6r3cmXIX","NAFuwcL0aE","t59lRprNT6","Nxx9VgIYvE","h1zcH14FLR","5IhmGpv0i7",
+"9eoRch1zcH","euZA529QAz","EoToP5ZaEz","AkKTkzQt6Q","QYxC00Wr5y","oVQp6BCxeC","POUYSlweGy","BbwgARmDcr","O3iyQQbxXc","0YAGHUl4a1",
+"fcJOyTXQ0Z","zqH0WF6PT2","FPfSEb29RJ","K4GS8Yw2oU","yofH324ARF","dmoS7uupzk","zY1GYB3qem","t98iWPYBf4","uN6r355rfB","SjskQciuWz",
+"Waim6FVMxo","SjskQtAOsr","64s8NCNHmv","pWiOsFwEJz","RsQUqMmKGJ","ix74rvLsmS","Nxx9VpiJSk","CxVEfI7p2a","IBe8kk85Ae","RsQUqW7cTs",
+"rKDLJWaim6","J2mQiuPX7G","HfyNQ3otm6","djsrvJIqXi","cShY2jS1aj","FPfSE8U2nU","Uvlv4oVQp6","W7cTsZ4I1v","45cIH8RCUA","KASQ8pv0i7",
+"48cHL0h1b1","yofH3DQimp","24ARFMezSW","Nxx9VVerEA","euZA5uPX7G","fFDrJrz7Ut","QYxC09iGoT","XyPZNlXFOB","LDk6f5drc6","ru4UGzHF1q",
+"k85AefFDrJ","yToGWhE1Ql","l83Ud7hyVv","lH1ktL7cGc","Kr8ysMezSW","DLhzMnFqik","yluBxSs0Zu","KASQ8DG4sT","0Wr5yUl4a1","Mm8si0Wr5y",
+"FjHXRChuy3","ECMvUxReec","ThjNnY1mC0","Ss0ZuyofH3","Cp3mZ8RCUA","hE1QlHzZT8","BbwgABGaQY","zqH0WJJs5m","AkKTkgdQsS","xReecvkCHH",
+"5Mg9rBFkb8","MaJQs9XyT9","JXljWXyPZN","OUYuFNcICA","SmGzvlm0pD","POUYSUl4a1","lm0pDRBhp0","QssNCx3LDe","AgJHQHzZT8","FxX9qLbRTH",
+"uZPqgYf2Ec","Kr8ysXflUq","P6bcgAXpwE","VerEAZv7z0","aFFssm4bxU","8U2nUZv7z0","gjUTudhSuH","fFDrJ2Yz7E","pvgjSVIlwP","JXljWBGaQY",
+"VIlwPuZPqg","gjUTuG1RhS","FGzgpZv7z0","VjCZq0Wr5y","FcWrWvOqCE","Kr8ysZ4I1v","lpF6WlCMxy","aL6AJiKqhr","bZLvSWDVWJ","faHir5Namm",
+"ni2v18cVD3","6AFT0CIShG","FnPFBVIlwP","lCMxyjS1aj","vkCHHhE1Ql","SbRYygjUTu","5ZaEzcQOnv","yofH3Gv3Fq","CxVEf7fsYM","pAhR1NcICA",
+"U3yw5jiVBP","48cHLpFrrl","suY4x9iGoT","uupzkk85Ae","7lUXZb29RJ","7X3uy580YD","MmKGJIn3NS","dpe1vYjB9t","FcWrWDQimp","FcWrWNcICA",
+"FNYIMvLsmS","5Mg9rh1zcH","xReecaL6AJ","SmGzvAIYUu","zmLYDmX2GE","djsrvx3LDe","lH1ktVIlwP","lsQGoMezSW","2TRI729QAz","SWfougtCA5",
+"CIShGGrDg7","v1HlnFVMxo","pFrrlhSSvQ","mz8gx618Di","MGlTFs7Mxk","6q6L9CNHmv","G1RhSJRJQB","WDVWJs4786","55rfBMojnP","NAFuwWaWsv",
+"uoStw8cVD3","prNT6wiHrZ","lsQGotl72W","Cp3mZqQxHP","0h1b16q6L9","i7WMQKASQ8","EdBKc0ao3l","5Namm580YD","RsQUquLtKs","ogLgcmz8gx",
+"VNCPdQClRL","d7vjMmX2GE","MezSWZ4I1v","kB5nPPb1pa","pv0i7i3pyd","7fKYUtlILt","WreyPU3yw5","fLNg8Dz1R3","5drc6JXljW","8hJdtMGlTF",
+"lXFOBIRh48","QYxC0M3zXL","yToGWrKDLJ","9y4lw5iGN5","Q6LixpT8wu","SjskQjzUqR","HlUbF7fKYU","5NammJkzUn","55rfBOUYuF","YOfrYWPmlx",
+"SWfouk85Ae","Dz1R316lHc","UlU3MlViBv","2NslmQworu","lweGy9rlg9","0ao3lfmIK1","Cp3mZbZLvS","x3LDefFDrJ","AmdQdlj07Q","uZPqgfqypy",
+"8hJdtCxVEf","uZPqgSmGzv","MmsIoVBjhz","45cIH2DREs","MK07Y7fsYM","s7Mxkd7vjM","uPX7GCxVEf","SWfou2TRI7","PYBf4he9IA","DLhzMNo0Qb",
+"WmadAix74r","s7Mxk0Wr5y","CK5W7prNT6","lweGytAOsr","lCMxypmeCd","lCMxyTCgPp","aFFssIn3NS","WreyPiqv4k","wDajXGWqqX","aL6AJ7fsYM",
+"ydG8Uxciqp","RmDcrYjB9t","7fKYU2DREs","EOE1ookgRi","55rfBO3iyQ","DLhzMX6Pin","cmXIXDG4sT","2NslmXflUq","kZANmYw2oU","0h1b1yvOMI",
+"5Namm5VZjS","h1zcHW3VFH","lXFOB4W0Tl","CIShGyEfy9","Z4I1v7lUXZ","Z4I1vJXljW","DG4sTyofH3","hSSvQo8Uyd","QWxoTkB5nP","o8Uydo8Uyd",
+"Nxx9Vs7Mxk","hi5X7FLsph","y94nwyvOMI","GSQwjJIqXi","guMb8lj07Q","7ku1pLbRTH","oQ87rTXQ0Z","FVMxo2ZHdk","gIYvEThjNn","xReecO3iyQ",
+"BbwgATa8f6","2ZHdkWmadA","5ZaEzaFFss","0KyfsyvOMI","S2DfuIjTwP","LewvM0YAGH","ThjNnuJScX","IKxdLyEfy9","EdBKcWaim6","8TxD7nFqik",
+"cmXIXAkKTk","xXTI48FmFH","FcWrW580YD","QbxXcsuY4x","yEfy9ksJby","NhXdu4W0Tl","lpF6WUvlv4","s4786zFgtB","5VZjSlCMxy","8hJdt7Ow5C",
+"FwEJzYjB9t","Rxrsmv8yFN","IKxdLReKEW","dhSuHOUqFM","ulk41BbwgA","jfREua00b5","XyPZNAOgEe","ZzJHWHzZT8","s4786OUqFM","P6bcgdhSuH",
+"4QMc9qaofN","KsjRKBGaQY","MGlTFtuDyS","CK5W7MojnP","uN6r35iGN5","I7p2aUl4a1","gdQsSG1RhS","QWxoTOUYuF","VBjhz6AFT0","Dz1R3ReKEW",
+"7fKYU2Nslm","zmLYDKZamH","VjCZqUmaEv","2NslmbrhlQ","azIWpZzJHW","S2DfuCfgr3","0h1b1CK5W7","5IhmG1LB1L","pWiOsazIWp","2DREsZuDtD",
+"GWqqXm4bxU","Waim6QssNC","jiVBP0h1b1","LbRTHPOUYS","hi5X7pmeCd","P6bcgUlU3M","fqypyzbIYY","lH1kt7hyVv","l83UdjSjS3","qUJMdM6qcG",
+"ReKEWt98iW","OUYuFi7WMQ","ZzJHWOUYuF","CdyBV24ARF","JJs5miKqhr","aL6AJpvgjS","64s8NEdBKc","OHaBz7fKYU","brhlQMGlTF","gIYvElweGy",
+"QWxoTpT8wu","Yf2Ecpv0i7","8RCUAJ2mQi","GrDg7hi5X7","BpYhVOUqFM","CNHmv8FmFH","RpBQmD6rBy","AOgEe55rfB","WreyPfqypy","BGaQYB3qem",
+"lkMUASWfou","HzZT8JIqXi","S77LHpv0i7","WreyPlm0pD","OUqFMuQIcz","bZLvS9XyT9","d7vjMOUqFM","gjUTugf8rI","lH1ktMezSW","FnPFB8TxD7",
+"C2IrcQYxC0","ReKEWUvlv4","VLTy6RpBQm","XyPZNzmLYD","GXdoHGXdoH","RsQUqzbIYY","EOE1o16lHc","7lUXZzz4ZU","d7vjMlH1kt","Waim62Nslm",
+"o8Uydrhl0J","8xEKzHP433","jS1ajIjTwP","8xEKzFVMxo","hi5X7O3iyQ","MmsIoIjTwP","uQIczokgRi","FLsphni2v1","XyPZNCxVEf","djsrvBpYhV",
+"WmadAhE1Ql","xciqpQ6Lix","1LB1Lzz4ZU","HP4337lUXZ","FVMxovOqCE","pAhR1G1RhS","gtCA5FxX9q","pWiOs29QAz","lXFOBgdQsS","k85AepWiOs",
+"zz4ZUsoy9t","Yh1hF1j5L8","lsQGouvf7A","uZPqgrhl0J","Yf2EcpvgjS","GSQwjwDajX","C2IrctAOsr","VBjhzmX2GE","IKxdLKASQ8","dmoS7MGlTF",
+"5IhmGFwEJz","AmdQdlm0pD","qaofNGSQwj","HP433he9IA","NAFuwQbxXc","DQimpkB5nP","lsQGoGrDg7","azIWpokgRi","5VZjS6q6L9","ZJTXHSbRYy",
+"okgRiUl4a1","piJSkzY1GY","In3NSW7cTs","i7WMQs93Ml","djsrvwDajX","LDk6fCfgr3","EOE1oFjHXR","5IhmGS2Dfu","KZamHn1pmO","b29RJW3VFH",
+"Ul4a1VBjhz","K20wKSjskQ","m4bxUHlUbF","TCgPpJRJQB","ru4UG5iGN5","uPX7GlweGy","prNT6MK07Y","vLsmSuJScX","OHaBzCqqaD","2Yz7EJJs5m",
+"9XyT9gdQsS","24ARFo8Uyd","ECMvU6q6L9","i7WMQ618Di","cQOnvU3yw5","lweGy07n1c","24ARFYOfrY","OxWIHYOfrY","KsjRKAgJHQ","7lUXZTwano",
+"KZamHiqv4k","CIShGFjHXR","kB5nPrz7Ut","HP433Ul4a1","lkMUAhUTw7","sx5Glv2eC3","tuDySC2Irc","FVMxoAXpwE","okgRiydG8U","Oz8yZvkCHH",
+"Dz1R3aFFss","RxrsmkB5nP","OHaBzCp3mZ","a00b5AmdQd","gtCA5uAWyp","Gv3Fq7lUXZ","8FmFHLewvM","n1pmOMK07Y","1v5hHBCxeC","d7vjMW3VFH",
+"9eoRcfLNg8","lXFOBRpBQm","0YAGHzQt6Q","tl72Wv2eC3","Dz1R3HfyNQ","lViBvk85Ae","IBe8kB3qem","ciuWz3weIF","FxX9qThjNn","x3LDeC2Irc",
+"fFDrJVNCPd","guMb84dEz6","m4bxUlViBv","qUJMdd7vjM","uLtKsAXpwE","X6PinlCMxy","ru4UGnnP8o","9rlg9Twano","Yf2EcSbRYy","vLsmSdjsrv",
+"IBe8k8xEKz","FnPFBo8Uyd","uTacxfaHir","m4bxUi3pyd","Gv3FqIjTwP","e6e4zuPX7G","kZANmyEfy9","L7cGcpmeCd","BFkb8lkMUA","atef2RBhp0",
+"jzUqRjeskS","lCMxyyvOMI","nnP8oS77LH","X6PinWPmlx","uTacxhSSvQ","lH1ktwDajX","FLsphDz1R3","No0Qb0ao3l","JKWYRBGaQY","14FLRcL0aE",
+"Dz1R3Q6Lix","bgJAzAIYUu","jfREuYh1hF","LewvMQ6Lix","mX2GEZ4I1v","1j5L8Twano","5Mg9rQChxs","L7cGcW3VFH","CqqaDaez9y","v2eC3SbRYy",
+"MK07YokgRi","VIlwPFFDui","BCxeCP6bcg","Gv3FqksJby","29QAzNOHsz","QClRLOz8yZ","uJScXgdQsS","tlILtiB08l","RACujlCMxy","IRh4848cHL",
+"EoToPQbxXc","StlDJtaOXK","lkMUA8FmFH","IBe8k0YAGH","atef2AOgEe","piJSkgIYvE","pmeCd5drc6","PYBf4y94nw","piJSknFqik","NhXdugIYvE",
+"8U2nUqUJMd","jeskSzz4ZU","GWqqX5iGN5","Mm8siMezSW","EOE1oOHaBz","pAhR1EoToP","RkQkeVNCPd","aDGtSazIWp","RmDcrzQt6Q","WmadA3otm6",
+"lViBv5nmWv","Oz8yZAkKTk","Y1mC0DcpWB","ulk41hSSvQ","ni2v15Namm","1LB1LP6bcg","0MR5X5Namm","ZzJHWzHF1q","xXTI4gtCA5","zY1GYjiVBP",
+"fqypyNo0Qb","uJScXn8pJ9","LDk6f7fKYU","5Mg9rK4GS8","yluBxWaWsv","C2IrcDG4sT","M3zXLNAFuw","LbRTHuZPqg","uupzkokgRi","NAFuwWmadA",
+"uPX7GQbxXc","S77LH4W0Tl","7Ow5CcmXIX","KASQ8uJScX","uupzk45cIH","aL6AJfLNg8","0Wr5yMm8si","OUYuFRsQUq","ZuDtDFFDui","ydG8UJIqXi",
+"QworuCfgr3","hUTw7vLsmS","5Mg9rFhtgl","UmaEvQClRL","2Yz7EbrhlQ","pv0i7RBhp0","yEfy9ogLgc","IjTwPhE1Ql","pmeCdlXFOB","lj07QVjCZq",
+"CK5W7oGu6x","K4GS8Cp3mZ","24ARFix74r","K4GS8Zv7z0","JKWYR5Mg9r","fLNg8Q6Lix","WreyP45cIH","1v5hHzbIYY","QworuuQIcz","zbIYYpv0i7",
+"RzaZAbgJAz","TCgPpzFgtB","zz4ZUSmGzv","nnP8ookgRi","SjskQD6rBy","0Kyfsv8yFN","iwzGkgdQsS","aDGtShYBCK","CqqaDuLtKs","GSQwjbZLvS",
+"uAWyp0Kyfs","djsrv7lUXZ","K20wKmz8gx","v8yFNgtCA5","vOqCEJJs5m","o8UydzY1GY","5iGN5tvdkD","9iGoTv8yFN","ogLgcHlUbF","9eoRcEOE1o",
+"8hJdtIBe8k","lsQGo7ku1p","7hyVv7fsYM","K20wKsx5Gl","ru4UGBFkb8","qUJMdNxx9V","ru4UGDz1R3","K4GS8CNHmv","LewvMGrDg7","5Drn08cVD3",
+"gdQsSMm8si","tuDySDcpWB","i3pyduJScX","piJSkUlU3M","t59lRDLhzM","jS1ajix74r","kB5nPiqv4k","bZLvSru4UG","n8pJ9s4786","9XyT9OUqFM",
+"iwzGkStlDJ","pFrrlNo0Qb","CdyBVyluBx","hE1Ql5nmWv","JXljW3otm6","lViBvYh1hF","VBjhzeuZA5","a00b5HzZT8","AkKTkDG4sT","soy9tjeskS",
+"zFgtBNcICA","Mm8sieuZA5","JRJQB5nmWv","lXFOB6AFT0","JXljWydG8U","fcJOy6AFT0","sqVrfNxx9V","55rfBYjB9t","BbwgAa00b5","HfyNQ9iGoT",
+"tvdkDFFDui","qUJMdni2v1","HzZT85iGN5","RxrsmciuWz","L7cGcMojnP","xReec7X3uy","RzaZAHfyNQ","HP433zz4ZU","3otm6QClRL","n8pJ97fKYU",
+"5nmWv8RCUA","45cIHuZPqg","ogLgcblLA9","uupzkbZLvS","7fKYUvLsmS","ZhwG1fLNg8","zqH0WyvOMI","Dz1R3uN6r3","No0QbTa8f6","Twanouvf7A",
+"he9IAQbxXc","Kr8ysTa8f6","Waim6TCgPp","CIShG7fsYM","mz8gxNhXdu","cQOnvFcWrW","GSQwjJJs5m","Rxrsmt59lR","8FmFHoGu6x","DG4sTK4GS8",
+"9eoRcYh1hF","iqv4kBGaQY","MojnP5IhmG","wDajXpmeCd","Yf2EcyEfy9","Kr8ysmz8gx","vkCHHogLgc","djsrvb29RJ","GWqqXMkgy8","5nmWvpiJSk",
+"RzaZAXflUq","K4GS8EdBKc","xciqp1j5L8","ThjNnQssNC","zmLYDoVQp6","fLNg8pmeCd","yvOMI0Wr5y","OUqFMF6PT2","P6bcg0BmCy","x3LDeuvf7A",
+"lj07Qi3pyd","faHirEdBKc","W7cTsokgRi","Ta8f6brhlQ","5ZaEzuTacx","L7cGc64s8N","24ARFQ6hMC","BGaQYDG4sT","BpYhV0MR5X","CIShGUmaEv",
+"1j5L8FLsph","pT8wuPOUYS","wiHrZ7Ow5C","oGu6x07n1c","MK07Y7hyVv","JKWYRW7cTs","CNHmv7lUXZ","CK5W78U2nU","brhlQJRJQB","WMiS3jSjS3",
+"XyPZNQWxoT","guMb81j5L8","zQt6QOz8yZ","WMiS3Z4I1v","bZLvSZv7z0","b29RJokgRi","Ss0Zuatef2","nnP8oKASQ8","HlUbFChuy3","Yh1hFFwEJz",
+"2hEEU7hyVv","9rlg9cL0aE","M3zXLZuDtD","bgJAz07n1c","uoStwGSQwj","uoStwUlU3M","NcICApmeCd","ix74rhe9IA","Nxx9VoQ87r","FjHXRLewvM",
+"W7cTsMmKGJ","ogLgcpFrrl","zHF1qHRxd8","618DivkCHH","7fKYU7ku1p","VjCZqK20wK","DG4sTChuy3","jeskSM3zXL","StlDJAOgEe","MojnPCK5W7",
+"GWqqX5ZaEz","DQimpo8Uyd","FnPFBv1Hln","rz7UtP6bcg","pFrrleuZA5","s4786kZANm","L7cGche9IA","yEfy9618Di","uLtKsyToGW","BbwgA580YD",
+"iB08lbrhlQ","sx5Glv8yFN","PYBf4GrDg7","hi5X7JKWYR","cQOnvzQt6Q","7Ow5CpvgjS","KsjRKhYBCK","BpYhVHlUbF","Chuy3FLsph","07n1ctl72W",
+"jSjS3lsQGo","JJs5mFhtgl","MmsIoGWqqX","2DREsJKWYR","AmdQdaFFss","Mkgy8kZANm","he9IAsqVrf","8U2nUGSQwj","QworulweGy","IBe8kuTacx",
+"JRJQBB3qem","BGaQYhSSvQ","azIWpyEfy9","uvf7AzHF1q","2NslmyToGW","yToGWblLA9","n1pmOJRJQB","lsQGo2Yz7E","Pb1paRxrsm","jtn0XMaJQs",
+"TXQ0ZYf2Ec","dpe1vRkQke","ulk41QYxC0","WaWsvYw2oU","S2DfuguMb8","NOHszoVQp6","K4GS8lj07Q","jeskSrhl0J","9rlg9W3VFH","ogLgche9IA",
+"i7WMQpiJSk","NcICAzmLYD","Nxx9VnlaBy","SbRYy618Di","fcJOyix74r","OHaBzatef2","o8Uyd580YD","Pb1pavLsmS","Mkgy8hi5X7","7ku1pjeskS",
+"2Nslm1v5hH","QnJ1StuDyS","WreyPDz1R3","5ZaEzAgJHQ","sqVrfW3VFH","WmadAcShY2","gf8rIzz4ZU","mX2GEksJby","jS1ajRACuj","J2mQigjUTu",
+"fFDrJaez9y","mX2GEjzUqR","dQ586OUqFM","J2mQijtn0X","2TRI70h1b1","Vprf2bgJAz","SmGzvlCMxy","dmoS7wDajX","2Yz7EcL0aE","okgRiEoToP",
+"iKqhrRzaZA","LbRTHVNCPd","uZPqgSbRYy","IBe8kOUqFM","ciuWzQClRL","NcICAYh1hF","FVMxo5Drn0","VLTy6uAWyp","y94nwZ4I1v","4W0TlmX2GE",
+"FFDuiRzaZA","zmLYDRzaZA","VBjhzdhSuH","2hEEU2ZHdk","UmaEvVLTy6","Yh1hFQworu","ZzJHWQWxoT","2DREs0h1b1","uZPqgNhXdu","uLtKssoy9t",
+"qaofNdhSuH","gIYvE2Yz7E","VLTy6t59lR","ydG8UJJs5m","2Yz7E9iGoT","LbRTHW7cTs","G1RhS07n1c","No0QbWmadA","9rlg9aez9y","ZUnqtWMiS3",
+"vkCHHFxX9q","FNYIMrKDLJ","Yw2oUhe9IA","HRxd8OHaBz","iKqhrgtCA5","Cfgr3JKWYR","0h1b1K20wK","1v5hHZ4I1v","hSSvQkB5nP","IBe8k7ku1p",
+"5ZaEzJKWYR","jSjS3fcwDa","rKDLJGXdoH","cQOnvOUqFM","oVQp6EdBKc","soy9tx3LDe","lweGy7X3uy","DQimpx3LDe","ogLgctl72W","nFqikpmeCd",
+"Uvlv43otm6","xciqp2hEEU","VNCPdn1pmO","fqypyNOHsz","5Mg9rtaOXK","48cHLaDGtS","rKDLJ3otm6","8FmFHSWfou","tl72WlH1kt","BFkb8FwEJz",
+"POUYSCNHmv","lViBvni2v1","k85AeGv3Fq","EdBKcThjNn","gjUTuHlUbF","qQxHPAIYUu","k85AeCp3mZ","lpF6WtuDyS","tvdkDWaim6","24ARFZUnqt",
+"SbRYyQChxs","tuDySbgJAz","K4GS8BCxeC","ThjNnsqVrf","8U2nUrKDLJ","Q6LixS2Dfu","aL6AJzHF1q","uPX7GcShY2","hYBCKRxrsm","mz8gxSs0Zu",
+"tvdkDIn3NS","RACujuZPqg","HfyNQRmDcr","azIWp4W0Tl","0BmCyyofH3","YOfrY5Mg9r","CxVEfwDajX","IKxdLwDajX","fqypyix74r","WmadAGWqqX",
+"he9IAjeskS","DcpWBTa8f6","WreyPxciqp","0BmCyIBe8k","5Drn05Mg9r","JIqXiAXpwE","F6PT2ogLgc","v2eC3ZuDtD","aez9y3weIF","oVQp6brhlQ",
+"ZzJHWtvdkD","16lHc1v5hH","HfyNQ5VZjS","Y1mC0J2mQi","zqH0WuPX7G","OUYuFn8pJ9","FFDui9XyT9","X6Pin64s8N","uZPqgCfgr3","CNHmvUlU3M",
+"uvf7APYBf4","fmIK1tuDyS","jeskSfLNg8","VBjhzStlDJ","8xEKzNAFuw","uN6r32hEEU","J2mQixReec","sx5Gltl72W","JXljWhUTw7","4dEz65iGN5",
+"Twanos4786","TXQ0ZSs0Zu","jS1ajni2v1","LbRTHblLA9","IBe8knFqik","QClRLcQOnv","s7Mxk0Kyfs","x3LDeGv3Fq","aFFssDG4sT","AOgEe580YD",
+"v8yFNGrDg7","he9IAt98iW","L7cGco8Uyd","Dz1R3euZA5","v8yFN7Ow5C","0PktI618Di","4W0TlhSSvQ","vkCHHAmdQd","fcwDaF6PT2","580YD8xEKz",
+"1v5hHNAFuw","VLTy6JIqXi","aL6AJn8pJ9","4W0TlCqqaD","he9IApvgjS","iqv4kqaofN","580YDNAFuw","gjUTu2TRI7","uJScXoVQp6","oQ87rvkCHH",
+"8xEKzaFFss","hE1QlVLTy6","StlDJOUqFM","ksJby24ARF","VjCZqMmsIo","7X3uylj07Q","ulk4116lHc","zz4ZUaDGtS","lpF6WIBe8k","pvgjSZhwG1",
+"mz8gxcShY2","XyPZNqUJMd","2hEEUuoStw","RxrsmCK5W7","AkKTk0ao3l","CNHmv2ZHdk","TXQ0ZKASQ8","dpe1vIKxdL","CxVEfkZANm","UmaEvM6qcG",
+"fLNg8pvgjS","jSjS3cShY2","d85a9MaJQs","ogLgcuvf7A","hi5X74QMc9","v1HlntjQxs","jfREujiVBP","W3VFHa00b5","BpYhVCdyBV","lH1ktZJTXH",
+"9XyT9Mkgy8","zY1GYpFrrl","cShY2mz8gx","yEfy9CxVEf","U3yw5FjHXR","xReecbrhlQ","QWxoTO3iyQ","RsQUqvLsmS","iB08lzmLYD","K4GS8NOHsz",
+"3otm6MojnP","ksJbyQssNC","bZLvSLbRTH","Cfgr3euZA5","0ao3lMK07Y","VLTy65nmWv","9eoRcl83Ud","MezSW64s8N","VBjhzwDajX","FcWrWlH1kt",
+"2ZHdkmX2GE","CqqaDLDk6f","CxVEfFLsph","Fhtgl0MR5X","HP433Chuy3","azIWpI7p2a","1j5L88TxD7","Oz8yZfaHir","AkKTkOz8yZ","Q6LixprNT6",
+"BGaQYyluBx","uTacx7fKYU","y94nwIjTwP","07n1cdpe1v","DLhzMxReec","jtn0XsuY4x","AOgEe8FmFH","lj07Ql83Ud","IjTwPQnJ1S","pT8wuJIqXi",
+"Waim6VerEA","9iGoTk85Ae","hUTw7uoStw","zz4ZUrz7Ut","KsjRKF6PT2","jeskSSbRYy","QYxC04QMc9","t59lRIBe8k","gdQsSjtn0X","X6PinD6rBy",
+"v2eC3cQOnv","Pb1papFrrl","bgJAz9GXkX","M6qcGdQ586","vLsmSBFkb8","fcJOy0MR5X","aez9yxciqp","LDk6fFNYIM","BpYhVlkMUA","45cIHZzJHW",
+"5Mg9rulk41","OxWIHC2Irc","sx5GlU3yw5","7Ow5CfcJOy","GSQwjFPfSE","EdBKc2DREs","lXFOBUl4a1","8cVD3zz4ZU","YOfrYDG4sT","MmsIozQt6Q",
+"uZPqg29QAz","jS1ajY1mC0","RpBQm24ARF","7Ow5ChYBCK","pv0i7tvdkD","5iGN5sqVrf","VerEA1LB1L","pFrrl9y4lw","JKWYRCdyBV","n8pJ9gtCA5",
+"uTacxlXFOB","D6rBys4786","piJSkRkQke","TwanoYf2Ec","B3qemKsjRK","YOfrYLDk6f","U3yw5qaofN","CNHmvgdQsS","7lUXZNo0Qb","9iGoTyEfy9",
+"Kr8ysgjUTu","aL6AJMaJQs","9XyT9hUTw7","5NammZUnqt","8TxD78FmFH","jfREu7ku1p","aL6AJZhwG1","MmKGJ0h1b1","jS1ajUmaEv","ciuWzRxrsm",
+"fFDrJoQ87r","FwEJzv1Hln","MezSWFLsph","ix74r0BmCy","BCxeCYf2Ec","WMiS32hEEU","gdQsSfcJOy","i7WMQPYBf4","S2DfuG1RhS","K20wK0Kyfs",
+"cQOnv0h1b1","L7cGczz4ZU","o8UydOxWIH","GWqqXTwano","aDGtSlj07Q","uLtKsJRJQB","lsQGodQ586","1j5L8FjHXR","hE1QlVjCZq","AmdQdAIYUu",
+"GXdoHFhtgl","d7vjMSs0Zu","2hEEUjiVBP","9XyT9d7vjM","0YAGH0ao3l","PYBf4ciuWz","gjUTudmoS7","Ul4a1Oz8yZ","OUqFMYh1hF","v2eC3jiVBP",
+"HRxd8uJScX","qQxHPpv0i7","VjCZqNOHsz","NcICAhUTw7","29QAztaOXK","zQt6QCK5W7","GXdoHsqVrf","jSjS3VBjhz","t98iWyluBx","0h1b1HzZT8",
+"a00b58cVD3","mX2GEblLA9","5NammWMiS3","4QMc9lsQGo","BGaQYLewvM","mz8gxvLsmS","jiVBPru4UG","VLTy69eoRc","hYBCKEOE1o","580YDECMvU",
+"4QMc9aDGtS","jiVBPSmGzv","7fKYUDLhzM","uvf7AMmsIo","AXpwEYf2Ec","s7MxkECMvU","guMb8UmaEv","5NammDQimp","ZJTXHJXljW","aFFss2DREs",
+"djsrvCK5W7","Yw2oUNcICA","24ARFpFrrl","U3yw5MK07Y","blLA9SjskQ","Fhtgldjsrv","cQOnvAOgEe","AXpwElXFOB","lH1ktWDVWJ","OxWIHFwEJz",
+"14FLRG1RhS","hYBCKLewvM","qQxHPrz7Ut","fLNg8Zv7z0","7X3uyYh1hF","gjUTuRsQUq","gtCA516lHc","DcpWBJJs5m","VNCPdQChxs","a00b5U3yw5",
+"euZA5lpF6W","No0QbI7p2a","3otm6FwEJz","Nxx9VxXTI4","VLTy67Ow5C","uJScXQClRL","3weIF8U2nU","rKDLJHlUbF","lweGycmXIX","blLA9XyPZN",
+"tuDyS3weIF","5VZjS24ARF","uupzk1LB1L","lm0pDVBjhz","d85a9Ss0Zu","U3yw548cHL","i3pyd5drc6","ZuDtDs7Mxk","W7cTsKsjRK","kZANmguMb8",
+"FNYIMs7Mxk","AOgEeThjNn","azIWpiqv4k","ECMvUwiHrZ","fFDrJFLsph","WmadAFVMxo","GWqqXS2Dfu","HlUbFb29RJ","ThjNnjfREu","iwzGkRsQUq",
+"dpe1vs4786","24ARF9y4lw","Nxx9VuZPqg","HfyNQulk41","HlUbFaez9y","lweGyprNT6","SjskQyofH3","8TxD7lkMUA","zqH0WzQt6Q","B3qemlpF6W",
+"S77LHwDajX","GXdoH7Ow5C","yofH35Namm","qaofNWPmlx","IjTwPx3LDe","5NammcQOnv","VIlwPni2v1","HzZT8cShY2","8cVD3RBhp0","5Drn0fLNg8",
+"Q6LixCIShG","v2eC30BmCy","9XyT929QAz","OUqFMcShY2","2DREsni2v1","k85AeRsQUq","qaofNAgJHQ","1LB1LJ2mQi","yToGWatef2","AOgEeeuZA5",
+"faHirPb1pa","2ZHdkXflUq","JIqXiuQIcz","lCMxyqaofN","NcICANo0Qb","0KyfsJIqXi","O3iyQEdBKc","Yw2oUHfyNQ","AgJHQuJScX","gtCA5suY4x",
+"yToGWsqVrf","qUJMd14FLR","4QMc9wiHrZ","C2IrcFxX9q","lm0pD9y4lw","hUTw7d85a9","tvdkDK20wK","pv0i7DcpWB","kZANmMkgy8","WmadAFjHXR",
+"lkMUAksJby","fcJOyChuy3","dmoS70PktI","Q6LixVprf2","tlILtaL6AJ","iqv4klj07Q","oQ87rhe9IA","M6qcG5Drn0","mX2GEGSQwj","NAFuwNo0Qb",
+"CdyBVn1pmO","e6e4zKZamH","AOgEeJJs5m","MK07YY1mC0","nnP8oGXdoH","NcICAlweGy","JXljWfaHir","aez9yQ6Lix","hi5X78RCUA","dQ586aez9y",
+"e6e4zFxX9q","NhXduAIYUu","WreyPYh1hF","gtCA5uJScX","rz7UtQssNC","Cp3mZLbRTH","rKDLJs7Mxk","7fsYMFcWrW","L7cGcUmaEv","5IhmGs7Mxk",
+"suY4xGv3Fq","uJScXXyPZN","n8pJ90ao3l","JJs5mFNYIM","JJs5mb29RJ","XyPZN2Nslm","0KyfsZzJHW","i7WMQblLA9","FLsph4W0Tl","CdyBVHfyNQ",
+"0h1b17fKYU","aDGtSSbRYy","wDajXRmDcr","AgJHQyToGW","Yw2oUWaWsv","AIYUuwDajX","s4786a00b5","POUYSNxx9V","Uvlv4lH1kt","soy9t5VZjS",
+"SjskQkZANm","Q6LixnFqik","CIShGMmKGJ","IBe8ki7WMQ","BGaQYZv7z0","2NslmpT8wu","TwanoFNYIM","NhXdusuY4x","uJScXdpe1v","Chuy3gjUTu",
+"2DREsyluBx","GWqqXGrDg7","24ARFHRxd8","tlILtlViBv","IKxdLWaim6","dpe1vNOHsz","L7cGcMaJQs","lViBv64s8N","SWfouMGlTF","uN6r34dEz6",
+"W7cTsSmGzv","Kr8yshUTw7","Vprf2ni2v1","ogLgce6e4z","gf8rIEoToP","lXFOBBbwgA","nlaBylXFOB","AmdQdblLA9","CNHmvzbIYY","8FmFHQbxXc",
+"NOHszhUTw7","cL0aEuoStw","lsQGom4bxU","nlaByFPfSE","uN6r3fqypy","I7p2an8pJ9","pmeCdv1Hln","zmLYDni2v1","LDk6foQ87r","FjHXRMkgy8",
+"In3NS1LB1L","BCxeCIKxdL","Ta8f6tl72W","yToGWTXQ0Z","IRh48RzaZA","gIYvEQ6hMC","tl72WLbRTH","SbRYyiKqhr","S77LHi3pyd","uupzkCdyBV",
+"jS1ajThjNn","s4786AIYUu","FLsphMkgy8","0PktIQnJ1S","L7cGcOz8yZ","MezSWW3VFH","jeskSlXFOB","2DREsGv3Fq","uLtKsi7WMQ","MezSWpvgjS",
+"XflUqQ6hMC","G1RhS7fKYU","VBjhz7lUXZ","BCxeCNcICA","vLsmSSs0Zu","vkCHHpAhR1","rz7UtzmLYD","jeskS0ao3l","CdyBVsqVrf","taOXKJXljW",
+"2DREsKZamH","RsQUqZv7z0","Yf2EcvkCHH","4QMc9HlUbF","qUJMdk85Ae","7Ow5CIKxdL","fFDrJOz8yZ","faHirGSQwj","Y1mC0ZJTXH","WDVWJtAOsr",
+"DLhzMNOHsz","zmLYDYjB9t","IKxdLbrhlQ","uoStwlCMxy","RBhp0ZJTXH","In3NS2ZHdk","tAOsr1j5L8","lViBvciuWz","WMiS3Vprf2","CqqaD1v5hH",
+"t98iWGXdoH","W7cTsMaJQs","2ZHdkatef2","D6rByRsQUq","CxVEfiwzGk","8xEKz45cIH","HRxd8aFFss","MmsIon1pmO","RxrsmEOE1o","ZJTXHAXpwE",
+"ydG8U0BmCy","GWqqXuZPqg","zFgtBlj07Q","faHirtlILt","m4bxUtuDyS","618Diy94nw","IBe8klXFOB","vkCHHO3iyQ","Chuy3azIWp","AIYUu2DREs",
+"07n1c7hyVv","nFqikfLNg8","FwEJzAOgEe","wiHrZBbwgA","8cVD3bZLvS","CqqaDCxVEf","uupzkuvf7A","hUTw7FPfSE","Y1mC0WPmlx","lj07Qb29RJ",
+"aez9yU3yw5","hYBCKUl4a1","FjHXRn1pmO","pT8wuNAFuw","JKWYRYf2Ec","uTacxuN6r3","o8UydY1mC0","9rlg9lH1kt","9rlg90Wr5y","xReecBpYhV",
+"55rfBuAWyp","mX2GERBhp0","Zv7z09iGoT","StlDJ0Kyfs","tlILtx3LDe","Yh1hFaDGtS","WmadAo8Uyd","tlILtVNCPd","lweGyO3iyQ","Cfgr3EOE1o",
+"0YAGHoVQp6","2DREsn1pmO","qUJMdsuY4x","Ss0Zusx5Gl","8U2nUzmLYD","ZzJHWdjsrv","xReecjtn0X","AXpwEIKxdL","o8UydStlDJ","pT8wuaDGtS",
+"7X3uyaDGtS","WmadAdhSuH","pFrrl4dEz6","uTacxMmsIo","WmadA8RCUA","okgRi07n1c","HlUbFDz1R3","i3pyduZPqg","hYBCK2TRI7","Vprf2XyPZN",
+"zqH0WAgJHQ","YjB9tqQxHP","9GXkXpFrrl","POUYSuLtKs","L7cGcGWqqX","7lUXZhE1Ql","zmLYDzqH0W","jzUqRMkgy8","S2DfuOUqFM","WMiS3d7vjM",
+"SmGzveuZA5","nFqikEoToP","hSSvQW7cTs","ix74rSbRYy","lViBvfaHir","QChxsa00b5","8FmFH2ZHdk","BbwgAaDGtS","HfyNQ0Wr5y","YOfrY0ao3l",
+"M3zXL0PktI","IKxdLIKxdL","7ku1puZPqg","9eoRcC2Irc","K20wKVIlwP","RpBQmQ6Lix","LDk6fo8Uyd","AIYUuydG8U","lweGyhYBCK","B3qemn1pmO",
+"dQ586UmaEv","Ta8f6ksJby","MK07YRxrsm","FNYIMZv7z0","d85a9TCgPp","ZUnqt5Namm","yvOMIGWqqX","QworuW3VFH","Chuy31LB1L","WaWsvFjHXR",
+"2hEEU16lHc","kB5nPBbwgA","xXTI4iB08l","mX2GErz7Ut","yvOMI5Drn0","B3qemQ6hMC","9eoRctuDyS","BbwgAMezSW","Mm8siFPfSE","FNYIM9y4lw",
+"FhtglgdQsS","jeskSQworu","VjCZqG1RhS","Gv3FqVjCZq","guMb8BGaQY","YjB9t4W0Tl","vOqCE64s8N","5NammECMvU","Mm8sizz4ZU","1v5hHiB08l",
+"M6qcGbZLvS","ZhwG1O3iyQ","uvf7AcmXIX","ECMvUuZPqg","gtCA5FcWrW","k85AezbIYY","uPX7Gs7Mxk","hE1QlQYxC0","BGaQYh1zcH","CIShGnnP8o",
+"In3NS9eoRc","YjB9tG1RhS","MaJQsFcWrW","RACujHzZT8","IRh48OUqFM","KASQ8NcICA","9GXkXcL0aE","i3pydVerEA","9iGoTQ6hMC","nlaByYjB9t",
+"RkQke0MR5X","lCMxyK4GS8","07n1cnlaBy","iwzGkW3VFH","WaWsvUl4a1","cQOnvrKDLJ","lViBvK20wK","okgRi5VZjS","okgRiKASQ8","FwEJzlViBv",
+"Cp3mZoVQp6","FwEJzrhl0J","Dz1R3djsrv","DcpWBQworu","jS1ajXflUq","lm0pDQ6Lix","5nmWvUvlv4","FhtglSWfou","zz4ZUokgRi","lViBv2DREs",
+"5iGN5D6rBy","Vprf2FLsph","0Wr5ylpF6W","5VZjSlpF6W","5iGN5QWxoT","rhl0JQ6hMC","8TxD7n8pJ9","B3qemydG8U","PYBf4VLTy6","ru4UG5IhmG",
+"YOfrY0MR5X","rz7UtY1mC0","FxX9qOz8yZ","FNYIMoGu6x","tlILtzFgtB","0MR5XguMb8","mz8gxpAhR1","7Ow5CRsQUq","QbxXciqv4k","WMiS32TRI7",
+"DLhzMlCMxy","a00b5xXTI4","y94nwXyPZN","brhlQW3VFH","8cVD3CNHmv","7Ow5CAgJHQ","QssNCmz8gx","bZLvSguMb8","zQt6QFNYIM","cShY2Nxx9V",
+"qaofN48cHL","aFFsstlILt","MmKGJQYxC0","FGzgpl83Ud","BCxeCSs0Zu","XflUqlXFOB","BbwgAuTacx","D6rBy1v5hH","Fhtgl24ARF","tuDySi3pyd",
+"pFrrlrKDLJ","F6PT22Nslm","SmGzv0ao3l","MezSW6AFT0","qUJMdWaWsv","oGu6x0Wr5y","h1zcHFnPFB","s93MlGv3Fq","s7MxkuLtKs","5VZjSxXTI4",
+"2hEEUjSjS3","t59lRrKDLJ","LewvMjeskS","BpYhVzz4ZU","1v5hHfFDrJ","OxWIHzFgtB","16lHcVBjhz","FxX9qBCxeC","55rfBlsQGo","24ARFMmKGJ",
+"48cHLF6PT2","W3VFHEoToP","atef2JJs5m","7fsYMW3VFH","QWxoTk85Ae","yofH3Q6hMC","6AFT0Uvlv4","ZhwG1pFrrl","s7Mxk9iGoT","okgRiOz8yZ",
+"BCxeCzbIYY","O3iyQ9y4lw","qQxHPpAhR1","0YAGHprNT6","W3VFHBbwgA","Q6LixaDGtS","OUYuFydG8U","aL6AJ8RCUA","J2mQijeskS","G1RhSpiJSk",
+"580YDUmaEv","2TRI75Namm","ru4UG4QMc9","lm0pDpAhR1","BpYhVPOUYS","QssNCcShY2","xReeczFgtB","yToGWcmXIX","2TRI7NAFuw","RzaZARmDcr",
+"J2mQiFNYIM","8hJdtNxx9V","aL6AJgf8rI","HfyNQI7p2a","NcICAblLA9","l83UdtlILt","pFrrllm0pD","Y1mC0hYBCK","lkMUANxx9V","VBjhz7X3uy",
+"zmLYDHRxd8","xciqpru4UG","IRh48Mkgy8","7X3uynnP8o","CqqaDs7Mxk","Yw2oUSmGzv","rz7UtpmeCd","lkMUAIjTwP","tl72W5nmWv","lCMxyIjTwP",
+"zQt6QYw2oU","jSjS3QClRL","IRh482Nslm","IKxdLogLgc","MK07YQbxXc","7fsYMkZANm","0MR5XFnPFB","zY1GYZ4I1v","5ZaEzRxrsm","prNT6iqv4k",
+"o8UydVjCZq","POUYSgjUTu","DLhzMTXQ0Z","ksJbyZuDtD","uvf7Afqypy","1j5L8qaofN","VLTy6VjCZq","POUYSIKxdL","Z4I1vX6Pin","zQt6QuZPqg",
+"IBe8kWaim6","TCgPp29QAz","guMb8CxVEf","8hJdtNAFuw","uupzkuJScX","JJs5mydG8U","Mkgy8lH1kt","CqqaDGv3Fq","uAWyp55rfB","oQ87rfcwDa",
+"FxX9qaFFss","WreyPYOfrY","d85a9fcwDa","i7WMQ3otm6","FVMxo8xEKz","rz7Ut5drc6","HRxd8okgRi","zmLYDx3LDe","lweGywiHrZ","ix74rfmIK1",
+"hE1QlHfyNQ","24ARFNAFuw","hYBCKHfyNQ","brhlQ7Ow5C","gdQsS7fsYM","ogLgcKr8ys","nnP8ovOqCE","xReecBbwgA","WmadAl83Ud","Twano6AFT0",
+"wDajXB3qem","uoStwGrDg7","14FLRSWfou","hSSvQJKWYR","hUTw7mX2GE","CxVEffcwDa","VLTy6K4GS8","S2Dfuk85Ae","Mkgy8CqqaD","lCMxyZhwG1",
+"StlDJEdBKc","2Nslm9GXkX","Kr8ys3weIF","hUTw77Ow5C","2NslmLDk6f","ZUnqttjQxs","45cIHBbwgA","aDGtSPb1pa","HlUbFYh1hF","M3zXL9rlg9",
+"yEfy9POUYS","4QMc9LDk6f","Cp3mZulk41","8hJdtMmKGJ","aDGtSksJby","JRJQBiwzGk","zFgtBLewvM","StlDJaez9y","ECMvUNhXdu","nFqikpT8wu",
+"5NammfmIK1","gf8rI8U2nU","Ta8f6uTacx","sx5GlyvOMI","FVMxoKZamH","oVQp6I7p2a","DLhzMLDk6f","SWfouUvlv4","l83UdLewvM","CIShGM3zXL",
+"ZhwG1RACuj","9iGoTOz8yZ","55rfBX6Pin","8xEKzAOgEe","Twano9GXkX","atef2BCxeC","Rxrsm5VZjS","5IhmGMojnP","VLTy6sx5Gl","L7cGcK4GS8",
+"EOE1on1pmO","4dEz6djsrv","iKqhrUmaEv","dpe1vogLgc","AkKTkfaHir","45cIHSWfou","5ZaEzW3VFH","ZhwG1vOqCE","RsQUqh1zcH","lpF6WZ4I1v",
+"yEfy9NhXdu","ksJby7fKYU","Y1mC0jSjS3","pFrrlfmIK1","DG4sT64s8N","QWxoTGWqqX","0MR5XjiVBP","2Yz7EFjHXR","9rlg9L7cGc","gdQsSVIlwP",
+"sx5Gl5drc6","CxVEfIRh48","lj07Qrhl0J","rKDLJmX2GE","IjTwPRpBQm","UmaEvK4GS8","iKqhr0Wr5y","FLsphX6Pin","uZPqgLewvM","zQt6QUvlv4",
+"kZANms4786","XyPZNQworu","9rlg9WDVWJ","Gv3Fq2hEEU","d85a9WDVWJ","Yw2oUMGlTF","azIWpFxX9q","VIlwP6AFT0","mz8gxMK07Y","i7WMQVNCPd",
+"ZJTXHeuZA5","GWqqXUvlv4","tlILtwDajX","uoStw5Mg9r","lpF6WDLhzM","ix74rZhwG1","29QAzaL6AJ","BpYhVv2eC3","aDGtSRsQUq","RACujkZANm",
+"hUTw7ZJTXH","xXTI4NAFuw","Cp3mZKASQ8","JXljW1v5hH","8TxD7jSjS3","VBjhzQ6hMC","wiHrZyvOMI","L7cGcm4bxU","1LB1LXflUq","Dz1R39GXkX",
+"5Mg9rWaim6","Mm8siQ6Lix","5Mg9rQClRL","Oz8yZgtCA5","JKWYRa00b5","2ZHdkVprf2","1j5L8Waim6","2Yz7EI7p2a","t98iWpv0i7","DcpWBThjNn",
+"2TRI7DG4sT","lpF6WpAhR1","2Yz7E8U2nU","euZA5POUYS","s7Mxk8RCUA","7fKYUjiVBP","zFgtBjfREu","WreyPWmadA","taOXKNcICA","9rlg9aFFss",
+"jtn0XJkzUn","9y4lwn1pmO","kZANmtl72W","dQ586okgRi","Chuy3pv0i7","LDk6f9GXkX","8FmFHFLsph","WaWsvnnP8o","ydG8U0Wr5y","jeskSAkKTk",
+"VerEAWreyP","CxVEfMK07Y","n8pJ9t98iW","jzUqRNcICA","Chuy3soy9t","n8pJ9QnJ1S","AgJHQRkQke","16lHcwiHrZ","QYxC0o8Uyd","cQOnvbZLvS",
+"MK07YOUqFM","aez9ylweGy","x3LDe5Namm","lweGyzHF1q","pT8wuOz8yZ","ulk415ZaEz","Dz1R3tuDyS","lj07QFnPFB","tl72Wfqypy","fmIK1cL0aE",
+"FGzgp5Drn0","9eoRcGXdoH","SbRYy5IhmG","zHF1qhi5X7","G1RhSJkzUn","HzZT8iB08l","8RCUAlweGy","I7p2aVerEA","W3VFH2hEEU","YjB9tOUYuF",
+"W7cTsqQxHP","1j5L8SmGzv","lj07QWDVWJ","Z4I1vMezSW","BFkb89GXkX","v1HlnhE1Ql","DLhzMLewvM","FwEJzfmIK1","1LB1LqaofN","0h1b1lj07Q",
+"dmoS7UmaEv","7fsYMpWiOs","CK5W7uTacx","RkQkezmLYD","cmXIXZUnqt","jzUqRwDajX","s4786uLtKs","k85AetuDyS","VNCPdJ2mQi","VjCZqJKWYR",
+"YOfrYX6Pin","618DikB5nP","cShY2WmadA","9y4lwpv0i7","brhlQazIWp","KASQ8J2mQi","VjCZq3otm6","QYxC0WreyP","jiVBPdQ586","ydG8UzmLYD",
+"WaWsvQnJ1S","RBhp0cL0aE","NOHsz7fKYU","gdQsS0MR5X","NAFuws7Mxk","d85a929QAz","hE1QlAXpwE","7fKYUwDajX","y94nwazIWp","zbIYYCqqaD",
+"YjB9t8hJdt","suY4xDz1R3","FwEJz7fKYU","5drc6VBjhz","Yh1hF2Yz7E","9rlg929QAz","kB5nPTwano","lpF6Wni2v1","iqv4kZzJHW","pFrrl8TxD7",
+"lj07QiKqhr","ZzJHWMaJQs","Oz8yZlweGy","2ZHdkxXTI4","uTacxogLgc","Cfgr3uAWyp","i7WMQ0h1b1","cL0aE2Nslm","6AFT0prNT6","xXTI4a00b5",
+"Kr8ysFVMxo","In3NSNxx9V","o8Uyd9GXkX","qUJMdZJTXH","cL0aE7Ow5C","b29RJOUYuF","PYBf4v2eC3","jfREuAkKTk","5IhmGlpF6W","07n1c8TxD7",
+"BCxeCtjQxs","NcICA0BmCy","gtCA57fKYU","8TxD7okgRi","zY1GYYOfrY","FNYIMNAFuw","faHirSbRYy","MmsIowDajX","2DREsn8pJ9","LDk6f8U2nU",
+"Mkgy8zqH0W","ECMvUuPX7G","OxWIHtjQxs","WDVWJ4QMc9","FVMxo7fKYU","lXFOBVBjhz","WaWsvHRxd8","gjUTuBpYhV","9GXkX0BmCy","Ul4a1iKqhr",
+"NhXdublLA9","Pb1pabgJAz","LbRTHFLsph","lm0pDFVMxo","t59lRtl72W","Dz1R3vOqCE","ksJbyix74r","s93Ml7X3uy","uN6r3QYxC0","64s8NCIShG",
+"WreyPB3qem","JkzUnnlaBy","Mm8si8hJdt","BGaQYAgJHQ","WreyPX6Pin","SjskQhUTw7","Oz8yZAgJHQ","LbRTHfmIK1","2Yz7EUlU3M","cmXIXvLsmS",
+"LDk6fCdyBV","uN6r3VBjhz","WreyP7lUXZ","xciqpVprf2","x3LDeD6rBy","i7WMQhE1Ql","Cfgr3VLTy6","tvdkDiKqhr","jzUqRRzaZA","C2IrcaFFss",
+"lCMxyjSjS3","oGu6xWDVWJ","K20wK9eoRc","zbIYYuPX7G","t59lRix74r","nnP8oDcpWB","FxX9qbgJAz","1j5L8OUqFM","OHaBzbrhlQ","FFDuijiVBP",
+"cmXIXFwEJz","wiHrZru4UG","soy9tGv3Fq","taOXKs4786","CxVEfeuZA5","zz4ZUQChxs","yEfy9x3LDe","PYBf40h1b1","tjQxsUvlv4","pT8wuChuy3",
+"0PktI0h1b1","B3qemfcwDa","2Nslm5drc6","9eoRcXyPZN","dhSuHQworu","b29RJtAOsr","QClRLblLA9","vkCHHCIShG","VerEAnlaBy","zFgtB7Ow5C",
+"K20wK1LB1L","SbRYyiqv4k","wDajXPYBf4","mX2GETwano","bgJAzk85Ae","jiVBPtjQxs","FVMxoC2Irc","Ss0ZuCp3mZ","sx5GlVLTy6","Qworutl72W",
+"k85AeQ6Lix","5Drn0Cp3mZ","0h1b1DQimp","uTacxpWiOs","X6PinguMb8","qQxHPuLtKs","FjHXRNcICA","0h1b1v8yFN","7lUXZcmXIX","O3iyQ9rlg9",
+"6q6L9UlU3M","OUqFMbrhlQ","k85AeXyPZN","cShY2uJScX","DcpWBokgRi","SmGzvYOfrY","sx5GlyofH3","aDGtSsx5Gl","guMb864s8N","DcpWBvOqCE",
+"uN6r3QbxXc","4dEz6euZA5","KZamHFhtgl","n1pmOpv0i7","Nxx9V8xEKz","lCMxyBFkb8","KZamHYOfrY","P6bcgMkgy8","AgJHQZuDtD","dpe1v8RCUA",
+"GXdoHFcWrW","nFqikUlU3M","8U2nUiB08l","prNT6i7WMQ","MmKGJSbRYy","HlUbF6q6L9","S77LHJIqXi","618Dini2v1","2ZHdkQ6hMC","zHF1qCxVEf",
+"uAWypChuy3","tAOsrdmoS7","o8UydmX2GE","iqv4k5VZjS","QYxC0vkCHH","MojnPt59lR","64s8N0h1b1","ZzJHWtaOXK","MojnPHzZT8","oVQp6FLsph",
+"GWqqXZv7z0","jiVBPCNHmv","WreyPQ6hMC","ZzJHW4dEz6","prNT68TxD7","SmGzvBCxeC","8hJdtv1Hln","BCxeCMaJQs","jeskSlpF6W","2TRI7sx5Gl",
+"Fhtgl0BmCy","fmIK1BCxeC","fcwDaJRJQB","suY4xnFqik","vkCHHFGzgp","Gv3Fqs93Ml","BFkb87fKYU","ciuWz8hJdt","3otm6EdBKc","b29RJvkCHH",
+"piJSklCMxy","hSSvQlweGy","hE1QlAgJHQ","Mkgy8cL0aE","MmKGJGrDg7","t98iWdmoS7","NcICAkZANm","RpBQml83Ud","hUTw7FjHXR","VLTy6CxVEf",
+"FhtgltAOsr","nlaBy7lUXZ","RpBQmWMiS3","FPfSElsQGo","qaofNU3yw5","PYBf4CxVEf","JkzUn5drc6","DG4sTZ4I1v","8xEKzeuZA5","Z4I1v4QMc9",
+"S77LH2DREs","jSjS3C2Irc","KASQ8Uvlv4","iwzGkW7cTs","07n1cgtCA5","ThjNnVNCPd","Mkgy8RzaZA","FwEJzWMiS3","2Nslm4dEz6","GWqqXksJby",
+"ZUnqtTXQ0Z","FGzgp1LB1L","iB08l64s8N","Yf2EcJIqXi","jS1ajguMb8","tlILtO3iyQ","zz4ZUsuY4x","2TRI7KZamH","dhSuH0Kyfs","4QMc9Yw2oU",
+"S77LHMm8si","EoToPCIShG","FLsphuTacx","pT8wuQ6hMC","t98iWni2v1","kB5nPt98iW","oVQp6Qworu","MmsIoiwzGk","GrDg7HfyNQ","he9IArhl0J",
+"EdBKcAmdQd","tuDySxXTI4","n1pmOaez9y","i3pydGWqqX","prNT6FwEJz","lXFOBoQ87r","JKWYR55rfB","pT8wuCNHmv","xciqp0MR5X","9GXkX4dEz6",
+"zQt6QBGaQY","WPmlxrhl0J","zz4ZUMaJQs","ThjNnydG8U","bgJAzUlU3M","yluBxSWfou","TwanoD6rBy","POUYSqQxHP","jSjS3gIYvE","7ku1pCp3mZ",
+"9GXkXFVMxo","lCMxyFwEJz","fFDrJDLhzM","k85Ae5IhmG","euZA50h1b1","fqypyazIWp","vkCHHVjCZq","07n1c4W0Tl","cmXIXl83Ud","gtCA5POUYS",
+"uoStw0BmCy","P6bcgFcWrW","0BmCyIKxdL","t98iWv1Hln","JkzUnGXdoH","jS1aj2Nslm","2hEEUW3VFH","hYBCKiwzGk","HfyNQZhwG1","UmaEv5Namm",
+"soy9tjiVBP","uAWypjzUqR","Yf2EcDQimp","M3zXLIRh48","MK07Y9iGoT","AIYUuAIYUu","rhl0J6AFT0","lH1ktFwEJz","i3pydP6bcg","iB08l8U2nU",
+"ZuDtD6AFT0","Cp3mZVprf2","QClRLJJs5m","MmsIonnP8o","MmKGJiqv4k","Yw2oUJJs5m","24ARF2hEEU","F6PT2IRh48","cmXIX5VZjS","LDk6fJJs5m",
+"LewvM7X3uy","cL0aElH1kt","55rfBRxrsm","Zv7z08FmFH","IRh48v8yFN","ksJby7fsYM","9y4lwfcJOy","pFrrlatef2","0Wr5ysuY4x","FFDuinnP8o",
+"JJs5mAkKTk","OUqFM5ZaEz","ogLgcs7Mxk","qQxHPydG8U","BFkb8s4786","rz7UtHP433","n1pmOFNYIM","7Ow5CJIqXi","gf8rIjS1aj","9GXkXru4UG",
+"VNCPddhSuH","yluBxBGaQY","GXdoH0BmCy","9rlg9CNHmv","pFrrls4786","ix74rFLsph","lweGyo8Uyd","MmKGJKr8ys","zHF1qZzJHW","0h1b1BbwgA",
+"pWiOsRkQke","J2mQiciuWz","5VZjSfFDrJ","JIqXiQssNC","a00b5fcJOy","Mkgy8Kr8ys","QClRLWDVWJ","W7cTsS77LH","Pb1pat59lR","MGlTFQYxC0",
+"soy9tMK07Y","suY4xOxWIH","nFqikiwzGk","CdyBVzQt6Q","PYBf4IBe8k","7X3uyt98iW","7X3uyKr8ys","i3pydfFDrJ","NhXduYw2oU","MezSWWDVWJ",
+"YjB9tNcICA","5Drn0e6e4z","0Wr5yxciqp","cmXIX9rlg9","uAWypk85Ae","QssNCFhtgl","pvgjS48cHL","1v5hHI7p2a","StlDJLewvM","zHF1qrz7Ut",
+"ciuWzkB5nP","5IhmGgdQsS","8hJdtni2v1","KZamHDz1R3","azIWppFrrl","YOfrYNhXdu","3otm6d85a9","GXdoHZUnqt","M3zXLZJTXH","ReKEWbgJAz",
+"EoToPqUJMd","MGlTFzbIYY","QWxoTIBe8k","FjHXR2hEEU","VNCPd4W0Tl","WreyPGrDg7","MmKGJMmKGJ","K4GS8yofH3","ksJby3weIF","y94nwogLgc",
+"IBe8kZuDtD","soy9tFNYIM","ZzJHWBbwgA","ThjNn8RCUA","vkCHH7Ow5C","uoStwZJTXH","QssNCRzaZA","fmIK15drc6","QnJ1Si3pyd","tjQxsqQxHP",
+"W3VFHGSQwj","vLsmSyvOMI","VIlwP2ZHdk","FcWrWIn3NS","Cfgr3Uvlv4","Yf2EcYf2Ec","gIYvEs4786","brhlQlj07Q","MaJQsAgJHQ","a00b5HRxd8",
+"4QMc9MaJQs","v1HlnFwEJz","64s8NVjCZq","ThjNnlj07Q","taOXKjS1aj","suY4xjtn0X","D6rByQnJ1S","CK5W77X3uy","QbxXcFVMxo","jzUqR5Namm",
+"VIlwPFcWrW","5Mg9rs93Ml","uvf7A2Nslm","QYxC0uQIcz","ZhwG1Ul4a1","k85AeWMiS3","n8pJ90h1b1","AIYUuo8Uyd","8xEKzuAWyp","zbIYYQbxXc",
+"aDGtSCIShG","GXdoHxciqp","dQ586vOqCE","hSSvQ580YD","RACuj5ZaEz","4QMc9ZhwG1","55rfBogLgc","Zv7z0uAWyp","U3yw5Yw2oU","uPX7GJIqXi",
+"zHF1qd7vjM","FxX9qjS1aj","M6qcGTa8f6","mX2GEiwzGk","ZUnqtRpBQm","he9IA580YD","s4786VLTy6","uoStwRBhp0","okgRiJIqXi","1v5hHgtCA5",
+"VLTy6uvf7A","Y1mC0UmaEv","prNT6Y1mC0","ru4UGB3qem","AXpwE7X3uy","8U2nUD6rBy","WMiS3JkzUn","b29RJl83Ud","KZamHpT8wu","AIYUuokgRi",
+"48cHLXflUq","BGaQYBCxeC","QYxC0Q6hMC","nFqikG1RhS","tjQxsn1pmO","8U2nUKr8ys","cQOnv7lUXZ","d85a9VNCPd","okgRilkMUA","b29RJd7vjM",
+"M6qcGOHaBz","uoStwtaOXK","NcICAMaJQs","hi5X7lm0pD","NAFuwDG4sT","pFrrlK20wK","K20wK5nmWv","Ul4a1UlU3M","7X3uy9rlg9","M6qcG4dEz6",
+"NhXduFjHXR","AIYUuJJs5m","uoStwJ2mQi","zHF1qHzZT8","MaJQsuupzk","blLA9NcICA","pAhR1M3zXL","DG4sT0BmCy","S77LHGv3Fq","WDVWJ5iGN5",
+"QnJ1SgIYvE","hi5X7CNHmv","Kr8ysiwzGk","55rfBpv0i7","rhl0JpFrrl","zqH0Wl83Ud","Dz1R3VIlwP","MezSWWMiS3","uoStwv1Hln","I7p2a8U2nU",
+"F6PT2pWiOs","fqypyL7cGc","580YDuAWyp","Yw2oUl83Ud","k85Ae2hEEU","iB08ltaOXK","fFDrJiqv4k","n8pJ9KASQ8","lm0pDs7Mxk","pFrrlzFgtB",
+"IjTwPVprf2","16lHcgjUTu","In3NSfqypy","bgJAzfqypy","ZuDtDpFrrl","DLhzMs93Ml","580YD3weIF","WMiS3oGu6x","EdBKclXFOB","FNYIM2hEEU",
+"GWqqX9iGoT","NcICAdQ586","jfREupvgjS","WDVWJQ6Lix","ZzJHWNcICA","oGu6xZ4I1v","WPmlxbrhlQ","C2IrcjiVBP","s4786lm0pD","PYBf4RpBQm",
+"KZamHdhSuH","In3NS8hJdt","sqVrfMezSW","Rxrsm0BmCy","uTacxVLTy6","nlaByaDGtS","9iGoTtjQxs","P6bcgyluBx","gf8rI7fKYU","0YAGH8RCUA",
+"ECMvUs7Mxk","EdBKcLDk6f","Waim6l83Ud","SmGzvQworu","CIShGiKqhr","0Wr5ysx5Gl","UlU3MCqqaD","x3LDeFcWrW","jiVBP5Drn0","SbRYyxciqp",
+"QbxXcpv0i7","lweGyaez9y","VIlwPjS1aj","WaWsvSbRYy","yofH3FVMxo","JJs5mjtn0X","RxrsmZJTXH","UmaEvS2Dfu","mz8gxYf2Ec","9GXkXpvgjS",
+"blLA9qUJMd","Fhtgl3weIF","0Kyfs7ku1p","cShY27fsYM","RBhp0BpYhV","1j5L8m4bxU","HfyNQ7fKYU","B3qemzqH0W","fFDrJGrDg7","zQt6QUlU3M",
+"45cIHQChxs","hE1QlpWiOs","cmXIX7hyVv","Cfgr3SmGzv","2Yz7EP6bcg","wDajXn8pJ9","bgJAz14FLR","v1Hlnm4bxU","M6qcG0h1b1","Mkgy8lpF6W",
+"AIYUutl72W","5iGN5W7cTs","fLNg8Pb1pa","pvgjSbZLvS","LbRTHTXQ0Z","dpe1vMGlTF","rKDLJVIlwP","s7MxkfcwDa","gf8rIdmoS7","bZLvSOz8yZ",
+"U3yw5VNCPd","lXFOBJRJQB","HfyNQjS1aj","DG4sTB3qem","y94nwx3LDe","uJScXHlUbF","uAWypsuY4x","QYxC0ZUnqt","QworuZ4I1v","2ZHdkLewvM",
+"Cfgr3J2mQi","GXdoHpT8wu","hYBCK9XyT9","JRJQB9iGoT","hE1QlK4GS8","NOHsze6e4z","48cHLDLhzM","Mkgy8uJScX","l83Ud5Mg9r","7ku1pFNYIM",
+"hUTw7xciqp","WmadArhl0J","QssNCAmdQd","D6rBypvgjS","ksJby4QMc9","zbIYYLDk6f","aDGtSMK07Y","wDajXaFFss","he9IANxx9V","0PktItuDyS",
+"Ss0ZuReKEW","gjUTuyvOMI","StlDJIn3NS","K4GS829QAz","ciuWzrKDLJ","uQIczQworu","DG4sTd85a9","pT8wuGWqqX","5NammC2Irc","Waim6I7p2a",
+"s7Mxk5Drn0","zFgtBuvf7A","Yf2Eczz4ZU","StlDJsx5Gl","0YAGH07n1c","fqypycL0aE","RmDcr16lHc","9eoRcvLsmS","mz8gxiqv4k","JJs5m5ZaEz",
+"I7p2aMezSW","zHF1qlXFOB","DG4sTCqqaD","t98iWZUnqt","9eoRcRACuj","vLsmSAgJHQ","BGaQYFhtgl","he9IAAIYUu","gIYvENxx9V","lXFOBdmoS7",
+"SjskQTXQ0Z","TwanoChuy3","BCxeCHzZT8","pmeCdulk41","yvOMITCgPp","FVMxoYf2Ec","VjCZqblLA9","dQ586pvgjS","Yf2EcIBe8k","gf8rIVIlwP",
+"No0Qb4QMc9","tuDySuvf7A","s93MltvdkD","v2eC3aez9y","CdyBVpvgjS","8FmFHwiHrZ","CIShG8hJdt","8FmFHM6qcG","FFDuiYOfrY","O3iyQgIYvE",
+"ZhwG1uN6r3","MmKGJZ4I1v","dmoS7W7cTs","Y1mC0Uvlv4","hi5X7No0Qb","taOXKuJScX","JXljWlj07Q","7lUXZvkCHH","aFFssWaim6","HlUbFUvlv4",
+"lCMxyuoStw","bZLvSD6rBy","pv0i7cmXIX","GXdoHMaJQs","mX2GEwiHrZ","BbwgA0BmCy","J2mQi07n1c","07n1cFwEJz","nlaByBCxeC","5Drn0AmdQd",
+"WreyPUlU3M","I7p2a8TxD7","QClRLRxrsm","pFrrl5iGN5","J2mQiiwzGk","iB08lVerEA","MmKGJEdBKc","JKWYRDQimp","CxVEfbZLvS","mz8gxzHF1q",
+"FNYIMyluBx","AmdQdxciqp","oQ87rYOfrY","7fKYUQnJ1S","HRxd8HlUbF","uZPqgoVQp6","gf8rIZUnqt","Ul4a1he9IA","5Namm4QMc9","pAhR1RzaZA",
+"M6qcGGv3Fq","Gv3FqMojnP","tAOsrNAFuw","CIShGWaim6","07n1cZ4I1v","Z4I1vZUnqt","0MR5XlkMUA","hE1QluJScX","AmdQdAXpwE","HzZT855rfB",
+"K20wK7lUXZ","QWxoTjfREu","8FmFHRkQke","aFFsskB5nP","In3NStjQxs","IBe8kaez9y","jzUqRGWqqX","HfyNQk85Ae","M6qcGLDk6f","FxX9qRmDcr",
+"VerEAcL0aE","ydG8UOxWIH","4W0TllpF6W","CqqaDfLNg8","dhSuHcmXIX","7hyVvRkQke","kB5nPAXpwE","qUJMdCqqaD","v8yFNvOqCE","azIWpCfgr3",
+"sx5GloQ87r","QnJ1S14FLR","jzUqRogLgc","aL6AJGSQwj","vLsmSReKEW","pmeCdgf8rI","wiHrZOUYuF","euZA5GSQwj","OUYuFUl4a1","XyPZNK4GS8",
+"uTacxHP433","gf8rIfcwDa","FNYIM0PktI","AXpwEM6qcG","pv0i7fLNg8","fLNg8kZANm","ZJTXH7fKYU","uJScXRzaZA","RmDcri3pyd","guMb81v5hH",
+"Zv7z0iqv4k","lXFOByluBx","lkMUAZhwG1","uPX7GAmdQd","IRh48K4GS8","he9IAgf8rI","v8yFNWPmlx","jeskSs93Ml","n8pJ9brhlQ","2hEEUFGzgp",
+"L7cGcCfgr3","9y4lwhi5X7","GrDg7zQt6Q","HfyNQPYBf4","4QMc9TXQ0Z","t59lRbgJAz","I7p2aSmGzv","3weIFFGzgp","618DiM3zXL","lpF6WLbRTH",
+"jtn0Xtl72W","0ao3lStlDJ","6q6L9xReec","7X3uypT8wu","pvgjS8RCUA","SmGzvJJs5m","8U2nUciuWz","uupzkhE1Ql","5iGN5o8Uyd","JKWYRQbxXc",
+"0ao3lRsQUq","SWfouNAFuw","fcwDa6q6L9","Y1mC0n1pmO","TCgPpi7WMQ","FjHXR2DREs","jtn0XdhSuH","07n1cpvgjS","guMb8TXQ0Z","fcwDaMkgy8",
+"FwEJz8xEKz","POUYSi3pyd","s93MlhSSvQ","GXdoHblLA9","xciqp5VZjS","s7MxkydG8U","yvOMI7ku1p","gf8rIQnJ1S","45cIHQnJ1S","n8pJ9No0Qb",
+"P6bcg1j5L8","BFkb8Mkgy8","CNHmvHfyNQ","EdBKcSWfou","lCMxyhe9IA","5nmWvyluBx","Q6LixiKqhr","FhtglAgJHQ","qUJMdYw2oU","KASQ8FLsph",
+"HRxd8xciqp","SWfouWaWsv","lCMxylweGy","zY1GYhUTw7","580YD0ao3l","tAOsrv2eC3","he9IA2Yz7E","WPmlxCIShG","NcICAd85a9","OUqFM9iGoT",
+"7Ow5CuJScX","0PktIRxrsm","pWiOsIKxdL","BCxeCwiHrZ","F6PT2soy9t","Uvlv4Chuy3","29QAze6e4z","GSQwj64s8N","2Yz7EMojnP","0Wr5yru4UG",
+"FVMxoFjHXR","blLA9wiHrZ","GrDg7Dz1R3","jzUqRdhSuH","K20wKjfREu","tuDyS2TRI7","L7cGclXFOB","vOqCEAOgEe","tl72Wt59lR","kB5nPQChxs",
+"YOfrYaFFss","5Namm2Yz7E","SmGzvFGzgp","ECMvUYOfrY","uQIczkB5nP","dpe1vDcpWB","lCMxyb29RJ","AIYUu9rlg9","tvdkDeuZA5","8U2nUsuY4x",
+"MojnP16lHc","JRJQBzY1GY","kB5nPxReec","b29RJ0MR5X","GWqqX8cVD3","QnJ1SWPmlx","tvdkDzQt6Q","zbIYYsqVrf","faHiraFFss","8FmFHokgRi",
+"6q6L9sx5Gl","QssNCChuy3","s7Mxkv8yFN","iqv4kI7p2a","Cfgr3FGzgp","yToGW45cIH","1LB1LciuWz","gtCA59y4lw","C2IrcBFkb8","IBe8kF6PT2",
+"BbwgAv1Hln","CNHmvLbRTH","EdBKc580YD","zQt6Q0h1b1","pv0i72Yz7E","sx5GlydG8U","vLsmS4QMc9","Chuy34W0Tl","kZANmCfgr3","ogLgcpiJSk",
+"5IhmGlweGy","hE1QljS1aj","yluBxRsQUq","DcpWBhe9IA","5NammpT8wu","s93MlCxVEf","DG4sTF6PT2","XflUqXyPZN","azIWpCNHmv","7X3uyVjCZq",
+"atef2YOfrY","FjHXRbZLvS","JXljWNxx9V","5Drn0HP433","Oz8yZ2ZHdk","BCxeCFGzgp","8TxD7fLNg8","pAhR1y94nw","jeskSi7WMQ","FxX9qfaHir",
+"Chuy3m4bxU","cL0aEJ2mQi","s7MxkuTacx","sx5GlDQimp","fcJOy7lUXZ","O3iyQru4UG","8xEKzSs0Zu","Gv3FqnnP8o","Vprf27hyVv","hSSvQa00b5",
+"ThjNnxXTI4","M6qcGXflUq","gdQsSuJScX","v1HlnS77LH","Yh1hFDz1R3","8U2nUoVQp6","hi5X7K4GS8","WMiS3GXdoH","TXQ0Z0Kyfs","9y4lwgtCA5",
+"9y4lwtvdkD","7lUXZX6Pin","NOHszsx5Gl","soy9tJIqXi","7ku1pyEfy9","TXQ0Z9GXkX","S77LHQworu","v2eC37hyVv","XflUqt59lR","GrDg7QYxC0",
+"4W0Tli7WMQ","P6bcgni2v1","dQ58655rfB","16lHcUmaEv","v2eC3RBhp0","NcICArz7Ut","b29RJVNCPd","5Nammrz7Ut","vLsmSlCMxy","uLtKshi5X7",
+"FxX9qTwano","sx5Glni2v1","580YD1LB1L","StlDJVerEA","0PktI1LB1L","5nmWvF6PT2","gIYvERkQke","VNCPdCxVEf","AIYUuMmKGJ","0YAGHnnP8o",
+"ydG8UsqVrf","QssNC8RCUA","WmadABCxeC","SbRYyuLtKs","uTacxuLtKs","ZuDtDyEfy9","taOXKVBjhz","hi5X7dQ586","uZPqgKASQ8","RzaZArhl0J",
+"yvOMII7p2a","sqVrfaez9y","ogLgcEOE1o","Chuy3YOfrY","B3qemsuY4x","Twano0Wr5y","MojnPzY1GY","ix74rfqypy","a00b5kB5nP","OHaBzs93Ml",
+"IRh48IBe8k","s93MlB3qem","uoStwciuWz","0KyfstaOXK","s93MlIRh48","jtn0XpT8wu","5ZaEzIBe8k","5VZjSlsQGo","Mkgy8iB08l","d7vjM3weIF",
+"CNHmvoQ87r","tjQxsoGu6x","fcJOy6q6L9","d85a9iB08l","MezSWGSQwj","OHaBzGv3Fq","qUJMdjS1aj","dpe1vnlaBy","lpF6WFwEJz","In3NSNo0Qb",
+"ydG8UOUYuF","uN6r3NOHsz","n8pJ9RzaZA","SbRYyo8Uyd","DQimps93Ml","KsjRKIn3NS","hUTw77X3uy","brhlQqaofN","ThjNntvdkD","vOqCEJIqXi",
+"MK07Yn8pJ9","QbxXcQChxs","ZhwG1WreyP","Cfgr3hUTw7","2hEEUzmLYD","9y4lwjeskS","ZzJHWTCgPp","POUYSXyPZN","5iGN5FGzgp","DcpWBB3qem",
+"JRJQByEfy9","lViBvRBhp0","atef2QClRL","Kr8ysuvf7A","jeskSJXljW","Z4I1vhE1Ql","RkQkeDG4sT","Chuy3ThjNn","FGzgp9rlg9","he9IAMm8si",
+"618DiuAWyp","yofH3FwEJz","24ARFxReec","sqVrfRxrsm","Waim6ZuDtD","5VZjSFFDui","nlaBytl72W","LDk6fguMb8","LDk6f4QMc9","jfREuDG4sT",
+"JkzUnhe9IA","5nmWvv8yFN","soy9tfLNg8","MmsIoFcWrW","Gv3FqKZamH","5nmWvSjskQ","zY1GYMojnP","iwzGkMezSW","2Nslm5Drn0","UmaEvdQ586",
+"14FLRTa8f6","ru4UGTa8f6","FcWrWEdBKc","gjUTuAkKTk","cL0aEW3VFH","8hJdtlkMUA","J2mQiJkzUn","KZamH4QMc9","Mkgy8ix74r","2Yz7En8pJ9",
+"aez9yQbxXc","VIlwPDQimp","iwzGkMGlTF","YjB9t5Drn0","580YDHRxd8","GWqqXfcJOy","55rfBlm0pD","6q6L9In3NS","S2Dfuatef2","y94nwWPmlx",
+"8xEKzOUqFM","OHaBzt98iW","WMiS39eoRc","IRh48WaWsv","ydG8UZ4I1v","3otm6TCgPp","RBhp0e6e4z","KASQ87hyVv","RxrsmECMvU","Oz8yZn1pmO",
+"XyPZNJRJQB","5IhmGmX2GE","2NslmgtCA5","2ZHdkokgRi","Chuy3NhXdu","0Wr5yAOgEe","ru4UGguMb8","CqqaDdhSuH","RzaZAFGzgp","dhSuHhi5X7",
+"W3VFHLbRTH","ogLgcsoy9t","pWiOs9rlg9","IRh4824ARF","a00b5fqypy","b29RJzbIYY","lsQGocQOnv","zbIYYwDajX","JRJQBMGlTF","IjTwP5ZaEz",
+"soy9tRpBQm","FxX9qZv7z0","W7cTsQYxC0","pFrrlpT8wu","RpBQm2hEEU","2TRI7ReKEW","i7WMQtjQxs","Gv3Fqlj07Q","Ss0ZuciuWz","5iGN5uoStw",
+"7fsYMMezSW","euZA5ni2v1","2NslmtjQxs","0MR5XS2Dfu","AmdQduLtKs","FVMxoAIYUu","EoToPuQIcz","x3LDezz4ZU","jfREuMGlTF","fmIK10Wr5y",
+"dhSuHtjQxs","HfyNQFFDui","64s8NWmadA","ni2v1nnP8o","cShY2Uvlv4","Oz8yZQChxs","B3qemxciqp","7X3uy0h1b1","07n1crz7Ut","a00b5JKWYR",
+"zFgtBFFDui","9XyT9WaWsv","RBhp0FVMxo","atef2B3qem","RzaZAjS1aj","RpBQmiqv4k","S2DfuqaofN","tl72Wk85Ae","euZA5VIlwP","LewvMjtn0X",
+"RxrsmdQ586","0KyfsgjUTu","ogLgcQ6Lix","M3zXLECMvU","5Drn0MK07Y","x3LDe3otm6","C2IrcCdyBV","wDajXIBe8k","d7vjMFLsph","hE1Qlni2v1",
+"rz7UtuAWyp","OUYuFgdQsS","IBe8kl83Ud","580YDQ6hMC","Zv7z0ogLgc","uvf7A8U2nU","QClRL55rfB","cShY2rhl0J","Vprf2iKqhr","HfyNQ9GXkX",
+"5nmWvrKDLJ","suY4xGrDg7","VNCPdv2eC3","5drc6b29RJ","UlU3M14FLR","7fsYMG1RhS","8FmFHni2v1","Kr8ysgIYvE","vOqCESWfou","EoToPRBhp0",
+"gIYvEi7WMQ","9GXkXXyPZN","lweGyRzaZA","Q6Lix7lUXZ","C2IrcGSQwj","Twano5ZaEz","1LB1LSbRYy","VNCPdQ6Lix","dpe1vjzUqR","wDajXlkMUA",
+"FFDui1j5L8","6AFT0a00b5","DcpWB9rlg9","CK5W7NcICA","gjUTuIRh48","Z4I1vjS1aj","gIYvEVBjhz","djsrv9GXkX","zHF1qaL6AJ","5Mg9r5VZjS",
+"lm0pDYf2Ec","RACujlj07Q","CqqaDogLgc","e6e4zbgJAz","WMiS3Ta8f6","HRxd8Cfgr3","W7cTsHlUbF","RzaZAvLsmS","fmIK10h1b1","7hyVvcShY2",
+"bZLvSIjTwP","jiVBPblLA9","EoToPzmLYD","5drc6M6qcG","jzUqRfcJOy","ru4UG6AFT0","AOgEeOHaBz","Oz8yZ2TRI7","8FmFH6q6L9","Waim616lHc",
+"JIqXiTCgPp","e6e4zFFDui","QWxoTOxWIH","m4bxUlsQGo","UmaEvNhXdu","24ARFGXdoH","bZLvSMmKGJ","ThjNns93Ml","AmdQduupzk","64s8NMmsIo",
+"9y4lwWMiS3","ksJby0ao3l","Y1mC016lHc","Yh1hFTXQ0Z","8RCUAaFFss","07n1cCNHmv","fLNg8WmadA","CK5W7qQxHP","yvOMI1j5L8","yofH3XyPZN",
+"XflUqxciqp","NAFuwJJs5m","t98iWgdQsS","W3VFH8U2nU","4W0TlB3qem","TXQ0ZUl4a1","Yw2oUix74r","pFrrlWaWsv","yluBxzY1GY","VNCPdxXTI4",
+"ix74rIKxdL","FLsphfqypy","2hEEU0Kyfs","blLA9OUYuF","s7MxkB3qem","QbxXcZuDtD","2hEEUtvdkD","hSSvQOHaBz","zbIYYatef2","7hyVvzHF1q",
+"RzaZAjiVBP","29QAzCqqaD","RBhp0FcWrW","9eoRcI7p2a","lXFOBciuWz","lsQGolViBv","tvdkD24ARF","Q6LixaFFss","atef2aez9y","7ku1phYBCK",
+"vOqCEnlaBy","cL0aEECMvU","BGaQYtl72W","zHF1qVprf2","5Mg9rMkgy8","jSjS3KASQ8","uupzkSmGzv","FGzgp55rfB","In3NSfLNg8","QClRLVIlwP",
+"tl72WJ2mQi","aDGtS0BmCy","WaWsvUvlv4","faHir5VZjS","Cfgr3MGlTF","JIqXihi5X7","Ta8f6iKqhr","AOgEe8hJdt","Zv7z0hSSvQ","tlILtF6PT2",
+"HlUbFVNCPd","lpF6WL7cGc","8FmFHsuY4x","pT8wub29RJ","sx5GlcmXIX","i7WMQhe9IA","FVMxoWmadA","fmIK1s4786","QYxC0euZA5","QChxsk85Ae",
+"CK5W7k85Ae","hE1Ql9iGoT","hSSvQEoToP","oVQp6NOHsz","zFgtBlXFOB","pAhR1RACuj","RsQUqJ2mQi","aDGtS64s8N","7hyVvvkCHH","ThjNnlCMxy",
+"ECMvUGXdoH","QnJ1SlH1kt","lH1ktrz7Ut","CIShGfqypy","tvdkDHP433","Yh1hFLewvM","uupzkFLsph","5Mg9rNo0Qb","sx5GllkMUA","Cfgr3CxVEf",
+"Z4I1ve6e4z","MojnPzmLYD","DG4sTuAWyp","7hyVvYh1hF","Yh1hFPOUYS","jzUqRChuy3","MmsIoQClRL","lm0pDdQ586","cmXIXNo0Qb","Q6hMCMmKGJ",
+"NhXdujSjS3","vLsmSogLgc","iwzGkZzJHW","pWiOsIBe8k","zQt6QhE1Ql","hi5X7uoStw","MezSWMojnP","qQxHPzQt6Q","uoStwydG8U","HP433pAhR1",
+"CK5W7ydG8U","9XyT9Kr8ys","fFDrJ8cVD3","VBjhzNAFuw","SmGzv2hEEU","zFgtBCIShG","BpYhVcL0aE","lpF6WQYxC0","8xEKz7hyVv","Z4I1vpmeCd",
+"pWiOsyvOMI","QYxC0Yf2Ec","pWiOst98iW","48cHLaL6AJ","lH1ktfqypy","0h1b1jiVBP","atef2jeskS","OxWIHuPX7G","tvdkDThjNn","gf8rI5Drn0",
+"YOfrYK20wK","EdBKcSs0Zu","M6qcGW3VFH","Nxx9Vy94nw","YOfrYTwano","nFqikcmXIX","rhl0J7lUXZ","cShY2F6PT2","9GXkXZhwG1","ydG8U48cHL",
+"MGlTFcQOnv","P6bcgQChxs","JRJQBd7vjM","29QAzRACuj","xciqpRxrsm","oGu6x0PktI","CIShGv2eC3","faHirJXljW","07n1cJJs5m","BFkb8AkKTk",
+"ciuWzVIlwP","AkKTkZv7z0","6AFT05drc6","14FLRokgRi","jSjS3KsjRK","okgRi7fsYM","FNYIMpAhR1","QnJ1SUmaEv","n8pJ9S2Dfu","dQ5864W0Tl",
+"nlaByvkCHH","Kr8ysDG4sT","Pb1pa8TxD7","ECMvUK20wK","QnJ1SGXdoH","BFkb8l83Ud","CqqaDDG4sT","48cHLulk41","hi5X78U2nU","DQimp5VZjS",
+"cmXIXBbwgA","a00b5FxX9q","m4bxUDz1R3","Uvlv4LbRTH","aez9yFLsph","8TxD7hSSvQ","GXdoHfcwDa","jtn0XVprf2","RxrsmFjHXR","lkMUAtl72W",
+"uTacxMezSW","vOqCENcICA","FjHXRgf8rI","P6bcgTa8f6","1j5L8C2Irc","Q6LixK20wK","14FLRdpe1v","ulk41CNHmv","SmGzvn1pmO","IKxdLCqqaD",
+"BGaQYPb1pa","W7cTsyofH3","aez9yogLgc","G1RhSfcwDa","zFgtBn8pJ9","ECMvU9iGoT","TXQ0ZMezSW","8xEKzIBe8k","4dEz6NhXdu","uQIczsx5Gl",
+"PYBf4ydG8U","Cfgr3bZLvS","he9IAECMvU","tl72WuoStw","AgJHQYOfrY","vOqCEJXljW","IjTwPzHF1q","pAhR1jiVBP","vOqCErKDLJ","No0QbeuZA5",
+"I7p2aQbxXc","AmdQd24ARF","qQxHPxXTI4","aDGtSKASQ8","okgRi7Ow5C","atef2WreyP","45cIHGWqqX","LDk6flpF6W","CqqaDFGzgp","FjHXRcmXIX",
+"hSSvQ1LB1L","RsQUqzFgtB","zY1GYK20wK","MmsIoMojnP","rhl0J3weIF","zbIYYMK07Y","uLtKsciuWz","uupzkrKDLJ","BGaQYokgRi","RBhp05nmWv",
+"5iGN5zmLYD","0Wr5yZv7z0","xciqpprNT6","Yh1hF07n1c","d85a9hYBCK","GrDg75ZaEz","MmKGJvkCHH","YOfrY9XyT9","HP433618Di","7fsYMwDajX",
+"sqVrf1j5L8","o8Uydi3pyd","blLA9U3yw5","8U2nUzQt6Q","55rfB4W0Tl","m4bxUfqypy","jS1ajuZPqg","rhl0JoVQp6","WmadAaFFss","EoToPYw2oU",
+"AOgEeDLhzM","6AFT0iwzGk","FcWrWv8yFN","faHirKASQ8","4dEz6FGzgp","RsQUqIKxdL","pmeCdTwano","RzaZAi3pyd","3otm6Kr8ys","v8yFNokgRi",
+"POUYSZUnqt","FVMxoZuDtD","48cHLRmDcr","uTacxs4786","AOgEe7Ow5C","n1pmO14FLR","24ARFn8pJ9","hE1Ql5Namm","3otm6Fhtgl","gjUTusoy9t",
+"HP433YOfrY","uvf7A8hJdt","cmXIXxReec","4QMc9Pb1pa","pFrrlWPmlx","5Namms93Ml","cShY2piJSk","MojnPK4GS8","SmGzvuAWyp","Yf2EcnnP8o",
+"tlILtaDGtS","fFDrJ7hyVv","JkzUnZUnqt","sx5Gl2hEEU","VerEAIKxdL","EOE1oXflUq","48cHLlm0pD","tAOsrx3LDe","5drc6HRxd8","jS1aj8hJdt",
+"9y4lwRACuj","Ta8f6OUqFM","O3iyQMm8si","RkQkeBpYhV","IKxdLuJScX","7hyVvOz8yZ","gjUTuzbIYY","8U2nUoQ87r","Yw2oUuAWyp","U3yw5pT8wu",
+"i3pydjeskS","No0Qb4dEz6","ix74rDcpWB","KASQ8ZzJHW","8U2nUo8Uyd","ix74raL6AJ","WDVWJFGzgp","lViBvmz8gx","0h1b1zY1GY","jSjS3vLsmS",
+"uJScXCNHmv","2DREsUlU3M","2TRI7zHF1q","ydG8Un8pJ9","Ss0Zu7Ow5C","5ZaEzJIqXi","580YD8FmFH","n1pmOo8Uyd","DcpWBdhSuH","HfyNQjzUqR",
+"0BmCyuvf7A","QWxoT580YD","lXFOB6q6L9","9XyT9Gv3Fq","5VZjScmXIX","lsQGoTa8f6","pmeCd9GXkX","XyPZN8hJdt","wiHrZpAhR1","7fsYMWreyP",
+"OxWIHkZANm","lj07QHlUbF","jSjS3hUTw7","aez9yK20wK","9eoRcdQ586","KASQ8fmIK1","8xEKzVLTy6","2TRI7RkQke","yToGWfcwDa","jfREuQnJ1S",
+"Zv7z0RzaZA","7X3uyIKxdL","3otm6dpe1v","HlUbFVBjhz","FPfSEzmLYD","DG4sTQWxoT","djsrvkZANm","CxVEffaHir","In3NSix74r","uJScXLewvM",
+"SmGzv29QAz","IjTwP0YAGH","TCgPpm4bxU","RpBQmuupzk","Zv7z00Kyfs","5Drn0FPfSE","m4bxUoQ87r","lpF6Wlj07Q","7Ow5CzQt6Q","FVMxoK4GS8",
+"uvf7Axciqp","mz8gxEOE1o","vkCHH9eoRc","9GXkXHzZT8","8FmFHxciqp","jiVBPjtn0X","WPmlxjtn0X","dQ586y94nw","djsrvW7cTs","YOfrYpiJSk",
+"zHF1q9y4lw","BCxeCWMiS3","0h1b1BCxeC","Ss0Zurhl0J","aL6AJDz1R3","8FmFHSs0Zu","No0QbqQxHP","Yh1hFv8yFN","HRxd8x3LDe","OUqFMBFkb8",
+"xciqpaL6AJ","NhXdulCMxy","ZUnqtwDajX","m4bxUQ6Lix","7hyVv0PktI","ZhwG1RkQke","lkMUAuPX7G","4W0Tl7lUXZ","lweGyBGaQY","0KyfsnFqik",
+"6q6L9yofH3","HlUbF55rfB","brhlQ48cHL","8hJdtdhSuH","bgJAz6q6L9","sqVrfzbIYY","Ta8f6YOfrY","oQ87riKqhr","9rlg9pmeCd","8RCUA5VZjS",
+"6AFT0lweGy","fqypyI7p2a","tvdkDHzZT8","l83UdzFgtB","48cHLpiJSk","RzaZApAhR1","jeskSYf2Ec","lweGy5nmWv","a00b5WMiS3","uAWypLbRTH",
+"hSSvQlm0pD","Vprf2QYxC0","ZhwG1uvf7A","zbIYY1LB1L","djsrvrKDLJ","fmIK1ru4UG","wDajX2Nslm","RzaZAQ6Lix","4QMc9pAhR1","t59lR9XyT9",
+"zqH0Wdjsrv","O3iyQv2eC3","d7vjMzQt6Q","he9IAvLsmS","nFqikSjskQ","iwzGkWreyP","VBjhzrKDLJ","cmXIXgdQsS","gdQsSyvOMI","7lUXZatef2",
+"0ao3l0Kyfs","l83Udjtn0X","Kr8yslm0pD","5ZaEzyToGW","TCgPpFLsph","2Nslms4786","v8yFNJIqXi","BGaQYxReec","uPX7G0PktI","P6bcg14FLR",
+"WreyPydG8U","BFkb84QMc9","m4bxUSWfou","OxWIHcL0aE","WaWsv0BmCy","FjHXR580YD","M6qcG2DREs","rKDLJtl72W","jzUqRP6bcg","xReecIRh48",
+"dmoS7UlU3M","wiHrZ55rfB","cL0aEvkCHH","guMb8Yw2oU","guMb8ZJTXH","3otm6Twano","SmGzvlViBv","blLA9fLNg8","he9IAJRJQB","JJs5m29QAz",
+"K4GS8RACuj","NhXdu7hyVv","fLNg8aDGtS","Twanov1Hln","5Drn0NAFuw","9y4lwFLsph","MaJQsJKWYR","nlaByMmsIo","DcpWBI7p2a","0Kyfs8FmFH",
+"1j5L8ZUnqt","24ARFni2v1","Y1mC0ni2v1","aFFssDcpWB","0ao3lBCxeC","QbxXcWMiS3","8U2nUhi5X7","2hEEU5VZjS","bgJAz7Ow5C","IjTwPiB08l",
+"1j5L8gf8rI","qUJMdv1Hln","WreyPYw2oU","xXTI4jfREu","48cHLdmoS7","55rfBn1pmO","LDk6fWreyP","TCgPpprNT6","uAWypU3yw5","MGlTFBbwgA",
+"7ku1p8cVD3","JKWYRM6qcG","ThjNn8TxD7","0YAGHzz4ZU","nlaBy5drc6","VLTy6nnP8o","zQt6Qy94nw","POUYSQ6hMC","HRxd8oVQp6","lsQGoFxX9q",
+"Q6LixOxWIH","W7cTslpF6W","LewvMsqVrf","0BmCyUvlv4","fmIK1h1zcH","CNHmvThjNn","Z4I1vtAOsr","NOHszs7Mxk","5drc6Mkgy8","oGu6xRsQUq",
+"M3zXL55rfB","v1Hln2DREs","lViBv7X3uy","ogLgc7Ow5C","xReecYjB9t","v2eC3pT8wu","G1RhSsqVrf","MaJQs8xEKz","bZLvSpFrrl","VerEA5Mg9r",
+"AkKTkYh1hF","0h1b1CqqaD","W3VFHyofH3","yofH38TxD7","EdBKcIRh48","jSjS3oVQp6","rKDLJlkMUA","0PktIMojnP","gtCA5qUJMd","OUqFMCxVEf",
+"rhl0JtAOsr","FPfSEpT8wu","s4786FxX9q","AkKTkXflUq","SmGzvBpYhV","29QAzKZamH","a00b5fmIK1","mz8gxv8yFN","atef27Ow5C","AkKTkgIYvE",
+"tjQxsYOfrY","XyPZNPb1pa","b29RJiqv4k","JJs5mI7p2a","IjTwPgjUTu","GWqqXXyPZN","FNYIMUvlv4","WreyPaFFss","VjCZqa00b5","RxrsmSjskQ",
+"16lHclCMxy","nFqikW3VFH","uTacx45cIH","2hEEUyvOMI","OHaBzNhXdu","Fhtgl5Mg9r","pWiOsyToGW","fcJOyY1mC0","DQimpqaofN","QYxC0rz7Ut",
+"C2IrcBpYhV","2DREsvkCHH","dmoS7EOE1o","FhtglSs0Zu","ThjNnqaofN","OHaBzfaHir","No0QbGv3Fq","zFgtBgf8rI","n8pJ9zz4ZU","TwanolH1kt",
+"lkMUAbZLvS","OUYuF14FLR","oGu6x4QMc9","xXTI4BGaQY","8hJdtvkCHH","DcpWBK4GS8","618Di8FmFH","IKxdLpv0i7","6AFT0djsrv","jfREugjUTu",
+"prNT6WreyP","s7MxkLDk6f","FwEJzmz8gx","EOE1oi7WMQ","5iGN5OHaBz","2ZHdk5iGN5","7fsYMReKEW","29QAzFwEJz","1j5L8DG4sT","KsjRKXyPZN",
+"VNCPdUlU3M","QworuXflUq","8hJdtpT8wu","ciuWzTCgPp","D6rByDcpWB","0PktI0BmCy","e6e4zyofH3","cL0aEaFFss","uAWypCqqaD","tAOsrjfREu",
+"lViBvPYBf4","gf8rI2ZHdk","v1HlneuZA5","M6qcGrKDLJ","ReKEWlCMxy","TCgPpgIYvE","lCMxyS2Dfu","l83UdjeskS","kB5nPaFFss","Yw2oUzbIYY",
+"8FmFHTwano","3otm6pvgjS","8FmFHIn3NS","ZhwG1SmGzv","JXljW7Ow5C","uQIczVerEA","FFDuiWmadA","IRh48HRxd8","GWqqXjtn0X","O3iyQNOHsz",
+"7fsYM0MR5X","5ZaEzYOfrY","hSSvQjtn0X","v8yFNgjUTu","MK07Y6q6L9","hE1QlTa8f6","JKWYR2hEEU","07n1cU3yw5","suY4xQClRL","StlDJHlUbF",
+"jS1ajTCgPp","uZPqgRsQUq","Y1mC0Chuy3","y94nwdhSuH","jS1ajOHaBz","s93MlAOgEe","VBjhzNOHsz","VNCPdTa8f6","W7cTs9GXkX","07n1cRxrsm",
+"RsQUqLDk6f","zFgtBOxWIH","d7vjM8RCUA","0ao3lFNYIM","JRJQBlj07Q","8RCUACp3mZ","oGu6x0MR5X","taOXK0Wr5y","5drc6NhXdu","l83Udru4UG",
+"SmGzv5Namm","qaofNZzJHW","iB08lzbIYY","lpF6Wl83Ud","lsQGoix74r","tvdkDWaWsv","zHF1qOz8yZ","dpe1vHlUbF","16lHc2Nslm","xciqpF6PT2",
+"v1HlncL0aE","lXFOBguMb8","7fsYMB3qem","qUJMdzY1GY","uvf7AkZANm","lkMUAzFgtB","JRJQBy94nw","BpYhVRpBQm","FhtglM6qcG","okgRizz4ZU",
+"cL0aE9iGoT","ix74rGWqqX","FwEJzCqqaD","uupzklpF6W","yEfy9pv0i7","07n1cuQIcz","zQt6QMK07Y","fFDrJxXTI4","uJScX7X3uy","2NslmhSSvQ",
+"h1zcHX6Pin","fmIK1MaJQs","xReecWaim6","qUJMdBpYhV","m4bxUHRxd8","fFDrJlViBv","djsrvvOqCE","J2mQiRxrsm","2hEEUZuDtD","G1RhSZUnqt",
+"1LB1LdhSuH","Ss0ZuZuDtD","ZUnqtulk41","CdyBVXyPZN","S2Dfu580YD","uN6r3I7p2a","U3yw5WaWsv","2ZHdkRkQke","LewvMnlaBy","FVMxoJkzUn",
+"AmdQduvf7A","okgRiRzaZA","6q6L9YOfrY","bgJAzogLgc","VerEA9y4lw","fcJOy8FmFH","n1pmOs93Ml","aL6AJvLsmS","QbxXcn1pmO","cShY2aL6AJ",
+"ZzJHW64s8N","iqv4kFLsph","zbIYYt59lR","aez9yAkKTk","1LB1Llm0pD","Chuy3pvgjS","iwzGklm0pD","hSSvQcShY2","Vprf2ZzJHW","VNCPdJkzUn",
+"Mkgy87fsYM","FjHXR55rfB","RpBQmaez9y","prNT6ulk41","lkMUAQClRL","9rlg9SjskQ","RkQkesqVrf","EoToPJkzUn","Q6hMCZUnqt","taOXK4W0Tl",
+"I7p2aD6rBy","5ZaEzokgRi","wiHrZAXpwE","OUYuF5Mg9r","Dz1R3Qworu","4dEz6FVMxo","xciqphSSvQ","lj07QVNCPd","2TRI7No0Qb","K4GS8yEfy9",
+"h1zcHQnJ1S","qUJMdwiHrZ","i3pydZuDtD","wDajXBCxeC","i7WMQBbwgA","SbRYy4W0Tl","JKWYR8RCUA","HlUbFtaOXK","sqVrflm0pD","iB08lsqVrf",
+"tlILt16lHc","cmXIXVLTy6","YOfrYLewvM","cmXIXbrhlQ","a00b5l83Ud","FFDuiyEfy9","Q6hMCB3qem","tl72WjSjS3","0KyfsECMvU","0h1b1oQ87r",
+"zQt6Q7lUXZ","Fhtglv8yFN","jtn0XdQ586","1LB1LQChxs","Uvlv4Qworu","LDk6fCp3mZ","AgJHQFNYIM","0BmCyDz1R3","pFrrllpF6W","ZhwG1JkzUn",
+"QbxXcrz7Ut","JkzUnk85Ae","4QMc95ZaEz","b29RJ14FLR","6AFT0bgJAz","vLsmSJ2mQi","iqv4kRzaZA","9eoRcnnP8o","uupzkqQxHP","vkCHHfcJOy",
+"Chuy3y94nw","7lUXZ3otm6","yToGWm4bxU","VBjhzZzJHW","dhSuHuoStw","L7cGcBpYhV","aFFssFPfSE","FxX9q55rfB","LDk6fi7WMQ","9eoRc580YD",
+"v2eC35Drn0","FVMxozmLYD","jiVBPvLsmS","y94nwjfREu","zQt6QQworu","YOfrYW3VFH","gf8rI6AFT0","WaWsvtAOsr","cShY2lH1kt","s93MlciuWz",
+"S77LHBGaQY","cmXIXhYBCK","5iGN5bZLvS","S77LHiwzGk","1v5hH7hyVv","cmXIX2Nslm","pFrrlI7p2a","uupzkMK07Y","TXQ0ZKr8ys","Dz1R3soy9t",
+"fmIK1uPX7G","uN6r3lm0pD","VLTy6gjUTu","WmadAQworu","1LB1LxXTI4","yluBxJKWYR","AIYUuJkzUn","gdQsSEoToP","WMiS3K4GS8","4W0TlIBe8k",
+"9rlg9brhlQ","Ss0Zuzz4ZU","48cHL2Nslm","iqv4kYOfrY","Vprf2Oz8yZ","0PktIQYxC0","45cIHjiVBP","pFrrl8U2nU","uTacx5Drn0","Waim6JRJQB",
+"piJSkYjB9t","FNYIMzFgtB","s93MlG1RhS","IKxdL5Drn0","HlUbFlViBv","14FLRRmDcr","POUYSfFDrJ","hi5X70MR5X","JXljWCdyBV","W3VFHuZPqg",
+"L7cGcJKWYR","I7p2apFrrl","k85AeMmsIo","VBjhzlViBv","ZUnqtatef2","SbRYylj07Q","KASQ8QWxoT","mX2GEQbxXc","e6e4zhYBCK","4W0TlGSQwj",
+"G1RhSulk41","C2IrcGrDg7","faHirZv7z0","fcJOylXFOB","faHir29QAz","IjTwPOxWIH","jfREuuvf7A","iwzGk55rfB","jSjS3MezSW","KsjRKaez9y",
+"yToGWVprf2","cQOnvvLsmS","0h1b1LbRTH","5Drn0QChxs","xReecfcJOy","WaWsvksJby","h1zcHK20wK","hE1Ql9rlg9","bgJAzHzZT8","1v5hH0h1b1",
+"vLsmSQssNC","Waim6ix74r","n1pmOIKxdL","v1HlnMezSW","1v5hHjSjS3","jeskSZv7z0","9iGoTYh1hF","5Mg9ruPX7G","fcwDaCIShG","QnJ1SzY1GY",
+"PYBf4uoStw","ZUnqtsoy9t","8TxD7W7cTs","wiHrZGv3Fq","jzUqRguMb8","O3iyQatef2","M3zXLt98iW","blLA9No0Qb","JJs5mUlU3M","GSQwjgf8rI",
+"8hJdtWPmlx","OUYuFFnPFB","Waim6AkKTk","vkCHHeuZA5","2TRI7DQimp","AkKTkOxWIH","K4GS82Nslm","rhl0Ji3pyd","48cHLQnJ1S","s7MxkciuWz",
+"ZhwG1ZhwG1","CqqaDbgJAz","Cfgr3WPmlx","jeskSix74r","7lUXZbrhlQ","C2Irc3otm6","HfyNQUlU3M","pvgjSlsQGo","DG4sTZuDtD","8hJdtQ6Lix",
+"IKxdLOUYuF","rKDLJGSQwj","dhSuH64s8N","5VZjSDLhzM","4dEz6fFDrJ","MojnPHfyNQ","JkzUnfcwDa","EdBKc0h1b1","yToGW0h1b1","xciqptlILt",
+"P6bcg5Mg9r","GSQwjReKEW","Qworu0YAGH","oVQp6IBe8k","2NslmDG4sT","uupzkFVMxo","2Yz7EPOUYS","NOHszB3qem","v2eC3Q6Lix","lsQGouN6r3",
+"jS1ajSmGzv","djsrvFcWrW","7lUXZs93Ml","K4GS8djsrv","55rfBMK07Y","sx5GlEOE1o","lViBvSWfou","ZhwG1HfyNQ","I7p2a618Di","hSSvQJXljW",
+"7fKYUNOHsz","FFDuiIjTwP","lXFOBVerEA","ZzJHWtlILt","5drc6zmLYD","L7cGcgjUTu","PYBf4HlUbF","580YDjtn0X","MK07YjfREu","ogLgcS2Dfu",
+"FxX9qVIlwP","CdyBVVprf2","FNYIMSWfou","pAhR1tuDyS","W7cTsRmDcr","SjskQqUJMd","brhlQ9XyT9","soy9tBbwgA","lViBvJkzUn","Z4I1vWPmlx",
+"zY1GYRBhp0","cmXIXsqVrf","45cIHBFkb8","9y4lw7lUXZ","iqv4kTCgPp","7fKYUksJby","0h1b1D6rBy","nnP8oyToGW","Chuy3QYxC0","v1HlnBGaQY",
+"3weIFUvlv4","55rfB9iGoT","1j5L8jtn0X","RkQkeXyPZN","7hyVvFjHXR","45cIH64s8N","IKxdLDz1R3","PYBf4EdBKc","pT8wuFjHXR","jfREuBCxeC",
+"VerEAsx5Gl","gjUTubrhlQ","0PktIuAWyp","29QAzjzUqR","fFDrJbrhlQ","okgRi9XyT9","ulk412hEEU","yofH3gf8rI","JKWYRAkKTk","9y4lwZUnqt",
+"uoStw0PktI","xciqpWMiS3","x3LDexReec","wDajXHRxd8","nnP8oJJs5m","JJs5mEOE1o","X6PingtCA5","Waim60YAGH","uN6r3OxWIH","VBjhz5nmWv",
+"cL0aEFVMxo","pWiOsPb1pa","GWqqXuAWyp","LewvMiKqhr","Mm8siCp3mZ","Cp3mZOUqFM","mz8gxD6rBy","ogLgc0BmCy","No0Qbru4UG","Ss0ZuMm8si",
+"7lUXZgdQsS","AkKTkIRh48","BbwgAOUYuF","BbwgAyluBx","dpe1vNo0Qb","xReecZhwG1","BCxeCNAFuw","AIYUu8hJdt","C2IrcNAFuw","gf8rICNHmv",
+"RxrsmSbRYy","RzaZAcShY2","X6Pinrhl0J","64s8NJXljW","DLhzMLbRTH","2DREsjeskS","tuDyS9XyT9","MaJQsGWqqX","v2eC3FnPFB","mz8gx9y4lw",
+"pmeCdtl72W","rz7UtLbRTH","jiVBPS2Dfu","9y4lwYOfrY","0ao3lYf2Ec","9rlg9Cp3mZ","o8UydNcICA","BCxeCru4UG","ydG8UiKqhr","MGlTFKASQ8",
+"blLA9POUYS","HlUbFD6rBy","580YDQssNC","t59lRVerEA","7fKYUzY1GY","faHirEoToP","0BmCylsQGo","5Mg9rFnPFB","KZamHC2Irc","Ul4a1xciqp",
+"rKDLJQnJ1S","ZzJHWDcpWB","zmLYDl83Ud","zbIYYhSSvQ","tAOsrJXljW","yEfy9i3pyd","NhXduNOHsz","o8Uyd4W0Tl","taOXKTXQ0Z","HlUbFKr8ys",
+"Mkgy8ReKEW","MK07YXflUq","t98iWQ6hMC","LewvM8FmFH","djsrvM3zXL","uvf7A29QAz","Dz1R3zbIYY","zz4ZUFFDui","FnPFBMojnP","uvf7AIn3NS",
+"ogLgcJKWYR","pT8wun8pJ9","6AFT05iGN5","2hEEUh1zcH","guMb8Pb1pa","jeskSKsjRK","sqVrf1LB1L","pv0i7Mm8si","5Drn0OUqFM","U3yw5OxWIH",
+"DcpWBfcwDa","FGzgpWPmlx","0BmCypiJSk","fcwDa8TxD7","0BmCyJkzUn","oVQp6AIYUu","Y1mC0StlDJ","nnP8o4dEz6","hUTw7soy9t","7ku1p7fsYM",
+"VIlwP2TRI7","8hJdtFNYIM","vOqCEcmXIX","nnP8oMm8si","BpYhVbZLvS","RmDcruQIcz","ZhwG1lweGy","24ARF2Nslm","JKWYROz8yZ","vOqCEFnPFB",
+"oVQp6qaofN","F6PT2qaofN","K20wKhSSvQ","v1HlnFLsph","vLsmSjSjS3","rhl0Jn1pmO","D6rByCqqaD","faHirGv3Fq","55rfBkB5nP","S77LHNo0Qb",
+"5ZaEzwDajX","7fKYUOUYuF","RkQkekZANm","Zv7z0JJs5m","B3qemzz4ZU","Gv3Fqgf8rI","yofH3WPmlx","0ao3lMojnP","pWiOsQnJ1S","vLsmSi3pyd",
+"KsjRKs93Ml","7hyVv2hEEU","ZuDtDaL6AJ","dhSuHgdQsS","m4bxUW7cTs","hYBCKxXTI4","YOfrY0h1b1","atef2Qworu","tlILtjtn0X","Nxx9VQworu",
+"QWxoT1j5L8","lkMUA5VZjS","QWxoTjzUqR","taOXKJKWYR","TwanoZuDtD","5NammRkQke","dpe1vjtn0X","0BmCyPYBf4","jfREuQChxs","6AFT0mX2GE",
+"RkQkeFNYIM","sx5Gl5Drn0","NOHsz14FLR","h1zcHdQ586","ZzJHWvkCHH","XyPZNCNHmv","QChxslj07Q","soy9tXyPZN","FxX9qCNHmv","BbwgAUl4a1",
+"AmdQdZ4I1v","ciuWzs7Mxk","Pb1paFPfSE","S2DfuCdyBV","RBhp08TxD7","9eoRchE1Ql","WmadAIBe8k","NcICAQnJ1S","EdBKcVBjhz","TCgPpQChxs",
+"StlDJ07n1c","7Ow5CNAFuw","GrDg79iGoT","s93MlcL0aE","5IhmGRACuj","BGaQY5ZaEz","xciqp5Mg9r","he9IAix74r","okgRiYw2oU","uAWypQClRL",
+"3otm6dmoS7","1j5L8ru4UG","0BmCyt98iW","FnPFBVBjhz","Z4I1vrhl0J","uvf7AMaJQs","Kr8ysGv3Fq","GSQwjFjHXR","t98iWW7cTs","RzaZAxXTI4",
+"KASQ89XyT9","aL6AJBbwgA","he9IAUvlv4","lm0pDokgRi","Dz1R34QMc9","OHaBzEdBKc","618DiBbwgA","oGu6xP6bcg","WmadAFhtgl","O3iyQG1RhS",
+"tAOsrRmDcr","OUYuFeuZA5","v8yFNIn3NS","vkCHH8xEKz","gf8rIXyPZN","6q6L9pv0i7","pAhR1RpBQm","RmDcrpiJSk","1LB1LVBjhz","48cHLOxWIH",
+"Vprf2DcpWB","FNYIMWPmlx","uTacxQClRL","9y4lwgdQsS","Q6Lix48cHL","oVQp6s4786","ciuWzdjsrv","fcwDasqVrf","zmLYDs7Mxk","lH1ktl83Ud",
+"QClRLKsjRK","4QMc9BbwgA","lpF6WVNCPd","AgJHQblLA9","sqVrf24ARF","tlILtpmeCd","AgJHQ16lHc","SbRYy5Drn0","y94nw45cIH","16lHc7ku1p",
+"Qworu5ZaEz","v8yFN1v5hH","azIWp5iGN5","0h1b1fFDrJ","No0QbyluBx","QbxXcHlUbF","5drc6IBe8k","07n1cpmeCd","JXljWs7Mxk","7lUXZNOHsz",
+"MGlTFD6rBy","IjTwPCfgr3","VerEAzQt6Q","BCxeCgIYvE","JKWYRBCxeC","dmoS7mz8gx","IRh48Ss0Zu","jSjS3oQ87r","QbxXcsx5Gl","Pb1paMmsIo",
+"FjHXRtAOsr","aDGtS0ao3l","SjskQX6Pin","tl72WQbxXc","AmdQdHfyNQ","cQOnv5nmWv","atef2uAWyp","rhl0J8cVD3","4dEz69eoRc","i3pydIBe8k",
+"uPX7GfcwDa","3otm6hYBCK","cL0aE8FmFH","CxVEfQworu","nnP8ofmIK1","yEfy9gIYvE","fcJOytvdkD","UmaEv2Nslm","5IhmGfcJOy","lpF6WiwzGk",
+"zmLYDJXljW","FFDui618Di","M3zXLm4bxU","gIYvEokgRi","NOHszkZANm","5drc6kZANm","SWfouTwano","8cVD3zFgtB","tuDySAOgEe","2NslmNcICA",
+"QYxC0Nxx9V","14FLRm4bxU","P6bcgv8yFN","XyPZNs93Ml","oQ87rQChxs","gdQsS8cVD3","vkCHHKsjRK","tl72WzQt6Q","QssNC7fsYM","5ZaEz0ao3l",
+"dpe1vUlU3M","QChxsOUYuF","ZzJHWn8pJ9","cL0aEwDajX","bgJAzpvgjS","QssNCxXTI4","QnJ1SfLNg8","tjQxst59lR","AXpwExXTI4","taOXKHP433",
+"ydG8U9iGoT","dmoS7Qworu","pT8wugdQsS","ECMvUbZLvS","brhlQnlaBy","Gv3FqLewvM","i7WMQ2hEEU","X6PinblLA9","aL6AJYf2Ec","aez9yW7cTs",
+"kB5nP8cVD3","9rlg9Pb1pa","dhSuHgf8rI","QClRLuoStw","D6rByGWqqX","jtn0XPb1pa","lweGyRkQke","pFrrlNhXdu","faHireuZA5","D6rBy4QMc9",
+"RzaZADQimp","gf8rIOxWIH","fFDrJPOUYS","Gv3Fqi7WMQ","TCgPpRmDcr","0YAGHgdQsS","rKDLJa00b5","4dEz60PktI","d85a9tuDyS","gtCA5zQt6Q",
+"P6bcg3weIF","IKxdLZUnqt","pFrrlQworu","8U2nUJJs5m","W3VFHZv7z0","0BmCy24ARF","JJs5mSWfou","soy9tO3iyQ","RkQkeQssNC","uvf7AvkCHH",
+"580YDyofH3","No0QbFhtgl","G1RhSa00b5","VLTy6FGzgp","U3yw5kB5nP","d7vjMtaOXK","XflUqSs0Zu","Ul4a1djsrv","prNT6BFkb8","FLsphFxX9q",
+"jtn0X2ZHdk","OHaBzi7WMQ","JJs5m0PktI","ZJTXHMGlTF","5iGN50YAGH","yluBxBCxeC","pFrrl3weIF","CqqaDHRxd8","580YDLDk6f","yvOMI07n1c",
+"bgJAzXflUq","Kr8ys45cIH","IRh48I7p2a","5Mg9rPYBf4","lkMUAtuDyS","AIYUul83Ud","IBe8knlaBy","pvgjSfqypy","DLhzM2Nslm","n1pmOFhtgl",
+"TwanoNxx9V","9GXkXl83Ud","Kr8ys0MR5X","W7cTsn1pmO","pv0i7blLA9","suY4xMm8si","FFDuiIKxdL","nlaByVerEA","qUJMds93Ml","2Yz7EzHF1q",
+"VBjhzGrDg7","I7p2aksJby","n1pmOsqVrf","8hJdtRsQUq","FwEJzJJs5m","s7Mxkzz4ZU","VNCPdkB5nP","14FLRdQ586","k85AevkCHH","ydG8UlViBv",
+"J2mQis4786","d7vjMF6PT2","NcICAAkKTk","SWfoufcwDa","Cfgr3uPX7G","ni2v1ZzJHW","EoToPNxx9V","StlDJh1zcH","UmaEvlkMUA","tvdkDni2v1",
+"cL0aESjskQ","cL0aECIShG","uoStwdjsrv","Vprf20h1b1","vLsmSFFDui","2Yz7EEdBKc","pvgjSgf8rI","K4GS8iwzGk","suY4xuN6r3","14FLRQbxXc",
+"yofH3fmIK1","hUTw7QYxC0","Chuy3MojnP","ru4UGMojnP","oVQp6iqv4k","DcpWBkZANm","t59lRe6e4z","MK07YMezSW","aDGtSdjsrv","y94nwuAWyp",
+"J2mQiMmKGJ","JkzUn55rfB","JRJQBrz7Ut","6AFT0TCgPp","OUqFMjtn0X","ni2v1Ul4a1","LewvMLbRTH","QClRLdpe1v","VLTy6Uvlv4","6AFT0sx5Gl",
+"UlU3MsuY4x","0KyfsEoToP","MezSW8RCUA","GXdoHkZANm","580YDyToGW","lsQGoTwano","atef2n8pJ9","aez9yJkzUn","Z4I1v8FmFH","K4GS8ZzJHW",
+"euZA5yToGW","Yh1hF1v5hH","OxWIHNOHsz","jtn0XYw2oU","I7p2aTa8f6","rKDLJ8RCUA","ECMvUD6rBy","64s8NX6Pin","Z4I1vBbwgA","BbwgA5ZaEz",
+"jSjS3wDajX","lweGyNhXdu","ReKEW5Drn0","NcICAKr8ys","4QMc9zqH0W","pv0i7SWfou","s4786xReec","D6rByRkQke","mX2GEdhSuH","W3VFHmz8gx",
+"FxX9qYOfrY","8hJdttjQxs","9GXkXEdBKc","3weIFgtCA5","Vprf2jtn0X","8TxD7FxX9q","7Ow5C9iGoT","ZzJHWZJTXH","WPmlx5VZjS","yEfy9zY1GY",
+"U3yw5ZJTXH","UlU3M5IhmG","wiHrZjfREu","DLhzMyEfy9","uoStwWmadA","gdQsSlj07Q","pAhR114FLR","HP433ksJby","iB08l7fsYM","U3yw5CqqaD",
+"EdBKc8U2nU","tlILtydG8U","pmeCdjiVBP","HzZT8xciqp","Nxx9V5Mg9r","5drc60Kyfs","M3zXL0h1b1","tlILtOHaBz","zQt6QQ6Lix","EdBKc7X3uy",
+"QClRL0BmCy","QWxoTt98iW","8RCUA07n1c","YOfrYQYxC0","RsQUqWmadA","ksJbyQbxXc","GrDg7jSjS3","ydG8UQ6hMC","iqv4kn8pJ9","DcpWBBCxeC",
+"tAOsrrhl0J","J2mQid7vjM","CIShGzbIYY","M6qcGVNCPd","qaofNVerEA","MGlTF5iGN5","UmaEvuvf7A","zqH0WCp3mZ","Q6Lix8hJdt","MmKGJFhtgl",
+"soy9tIBe8k","X6PintaOXK","DQimpoVQp6","Y1mC0fFDrJ","3otm6MaJQs","CNHmvd85a9","aez9yJIqXi","StlDJvLsmS","PYBf4ni2v1","GSQwjaFFss",
+"DG4sT0YAGH","FcWrWUlU3M","0BmCyJ2mQi","RpBQmPOUYS","sqVrf0PktI","1LB1L0BmCy","i3pydlj07Q","FNYIM55rfB","0ao3li3pyd","ZuDtDStlDJ",
+"GSQwjQWxoT","8xEKzuupzk","618DiQnJ1S","iwzGkS2Dfu","fcJOyOUqFM","2DREsFjHXR","ZuDtDPYBf4","CqqaDlm0pD","JJs5ms4786","PYBf4yToGW",
+"fmIK1VBjhz","Qworuuvf7A","SmGzvrhl0J","WDVWJwDajX","s93MlFNYIM","djsrvjiVBP","i7WMQRmDcr","24ARFLewvM","5iGN5lj07Q","mX2GELewvM",
+"I7p2a64s8N","nFqik5ZaEz","8xEKzECMvU","2TRI7okgRi","pT8wu7ku1p","hE1QluoStw","Twanoe6e4z","48cHLQ6Lix","sx5GlMojnP","Q6hMCRzaZA",
+"ZzJHWBpYhV","HfyNQnFqik","b29RJx3LDe","kB5nPhE1Ql","5iGN5fqypy","O3iyQs4786","IBe8kbrhlQ","nFqikWPmlx","UmaEvl83Ud","dpe1vtaOXK",
+"I7p2aCp3mZ","MmKGJGSQwj","NAFuwWPmlx","Gv3FqNAFuw","azIWpydG8U","VjCZqpv0i7","FxX9qoVQp6","DQimpTCgPp","rhl0JnnP8o","Dz1R34dEz6",
+"NcICA618Di","brhlQNAFuw","IBe8kUmaEv","nFqikCfgr3","4dEz6zY1GY","FxX9qRsQUq","EOE1ouTacx","fFDrJRACuj","In3NSlm0pD","OHaBzlkMUA",
+"rKDLJoGu6x","ZuDtDS2Dfu","fmIK1uvf7A","QChxsgjUTu","WPmlxL7cGc","OUqFMk85Ae","4W0TlStlDJ","fmIK1Z4I1v","jeskSaL6AJ","s93MlsqVrf",
+"rz7UtMGlTF","AmdQdpmeCd","wiHrZI7p2a","uLtKsdhSuH","Mkgy87ku1p","QClRLQ6hMC","K20wK7hyVv","5iGN5jS1aj","uZPqgJKWYR","YjB9tsqVrf",
+"24ARFd85a9","CNHmvbgJAz","gdQsSn1pmO","WmadAXyPZN","ni2v1LewvM","48cHLRBhp0","6AFT0Q6hMC","0ao3l9GXkX","IKxdL29QAz","vLsmScL0aE",
+"vkCHHTa8f6","NcICAIjTwP","MmKGJfLNg8","cShY2okgRi","Dz1R3No0Qb","W3VFHQ6hMC","LbRTHo8Uyd","OHaBzAOgEe","x3LDe9y4lw","BGaQYKsjRK",
+"zmLYD5ZaEz","nnP8ogdQsS","PYBf4ix74r","7ku1pt98iW","XflUqKASQ8","pmeCd9y4lw","VBjhzMGlTF","wiHrZzmLYD","i7WMQIBe8k","hSSvQIKxdL",
+"JKWYRC2Irc","KsjRKCfgr3","pmeCdGrDg7","24ARFCNHmv","0MR5XlViBv","8U2nUZ4I1v","Y1mC06AFT0","0MR5XHRxd8","iwzGkoVQp6","16lHckZANm",
+"yToGWnlaBy","BFkb81j5L8","KASQ8GrDg7","rhl0JkZANm","WaWsv9y4lw","yEfy98U2nU","W3VFHMK07Y","AXpwEru4UG","XyPZNh1zcH","pvgjSMm8si",
+"pvgjSLbRTH","QChxs8U2nU","1v5hHCIShG","FcWrWRzaZA","FxX9qwDajX","OUqFM0h1b1","WaWsvoVQp6","YjB9tgIYvE","6AFT0618Di","QbxXcl83Ud",
+"IjTwPNhXdu","B3qemWMiS3","dQ5868cVD3","prNT6yluBx","v8yFNTXQ0Z","t98iWt59lR","1j5L87Ow5C","fqypyIjTwP","3weIFaez9y","BbwgAYjB9t",
+"EoToPjiVBP","BCxeCTwano","0YAGHjtn0X","xXTI4o8Uyd","RxrsmaL6AJ","KASQ8QYxC0","uupzkIjTwP","5NammNAFuw","Cfgr3Waim6","QssNCQworu",
+"Twano9eoRc","tl72WblLA9","KASQ8ydG8U","Ta8f6tlILt","azIWpFwEJz","tjQxscL0aE","UlU3MNOHsz","5Nammy94nw","a00b5Zv7z0","RkQkeGXdoH",
+"kZANmGv3Fq","LbRTHuPX7G","Uvlv4n1pmO","YjB9tuN6r3","tlILtuQIcz","tAOsrsoy9t","S77LHtvdkD","8FmFHZv7z0","mz8gx1j5L8","JIqXi64s8N",
+"8xEKz55rfB","aFFssVprf2","nnP8ogIYvE","0BmCyMaJQs","ZuDtDazIWp","Yh1hFtjQxs","7fsYMa00b5","o8Uyd0Kyfs","29QAzZv7z0","fqypydmoS7",
+"CK5W7fLNg8","5iGN5aFFss","ReKEWTa8f6","SmGzvCxVEf","n8pJ9pmeCd","TwanoHRxd8","jiVBPn8pJ9","OUYuFP6bcg","guMb8jzUqR","pv0i79GXkX",
+"oQ87rW7cTs","y94nwdQ586","XyPZNRBhp0","ZJTXH3otm6","d7vjMdpe1v","he9IAqQxHP","rKDLJaDGtS","lH1ktvOqCE","k85AeMezSW","Vprf20ao3l",
+"CK5W7atef2","QChxsMojnP","S2Dfuy94nw","QChxsDG4sT","Cfgr3XyPZN","ni2v1MGlTF","qUJMduupzk","mX2GEVprf2","OUYuFtl72W","FLsphd7vjM",
+"FwEJzAXpwE","8hJdtlCMxy","FNYIM2DREs","9GXkX45cIH","VNCPdIBe8k","ThjNny94nw","FhtglZzJHW","F6PT2taOXK","zHF1qpv0i7","14FLRJKWYR",
+"FnPFBsx5Gl","5ZaEzVjCZq","wDajXQClRL","oQ87r4W0Tl","2NslmoVQp6","SWfouRkQke","aL6AJiB08l","xXTI4nlaBy","h1zcHW7cTs","Chuy3JXljW",
+"RBhp0UmaEv","cL0aEgdQsS","zY1GY7fsYM","fFDrJDcpWB","QWxoTuvf7A","8hJdt4dEz6","QssNCy94nw","qUJMdPb1pa","Yf2EcNo0Qb","HlUbFEOE1o",
+"RxrsmFwEJz","mz8gxQssNC","HlUbFP6bcg","PYBf4nFqik","SjskQKr8ys","cQOnvS77LH","3otm6Yf2Ec","ZhwG1zY1GY","Q6LixciuWz","WMiS3MGlTF",
+"RkQkev1Hln","ni2v1KZamH","atef2HRxd8","taOXKUl4a1","mX2GEm4bxU","ZUnqtzY1GY","dQ586Uvlv4","lXFOB9XyT9","atef2uupzk","0KyfsK20wK",
+"CIShGuQIcz","iwzGkJkzUn","Yh1hFix74r","CK5W7Uvlv4","FLsphyvOMI","jfREu9eoRc","jSjS3zmLYD","nnP8omz8gx","0h1b1tjQxs","i7WMQwiHrZ",
+"7fKYU2TRI7","0MR5Xh1zcH","8cVD35drc6","jfREuRACuj","n1pmOYh1hF","M3zXLFhtgl","7ku1pVBjhz","7ku1pMGlTF","AIYUu2Yz7E","K20wKzQt6Q",
+"Ul4a1taOXK","nnP8oBpYhV","zHF1qECMvU","HRxd8Ta8f6","F6PT2J2mQi","YOfrYOUqFM","2NslmRACuj","FcWrWyofH3","IjTwPUmaEv","FGzgpUlU3M",
+"SjskQs7Mxk","HfyNQ8U2nU","0PktIyofH3","8U2nUmz8gx","i7WMQ5Mg9r","yluBxW3VFH","14FLR9eoRc","5iGN5uZPqg","Ul4a1rKDLJ","v1HlnnFqik",
+"5drc6zz4ZU","DG4sTRmDcr","n8pJ9MaJQs","yofH3nFqik","nlaBySbRYy","tAOsrSWfou","0PktIjzUqR","QbxXc0MR5X","VBjhzWPmlx","IBe8khE1Ql",
+"MojnPFGzgp","TXQ0Z16lHc","WDVWJLDk6f","aDGtStjQxs","FnPFBEdBKc","BFkb8X6Pin","a00b57Ow5C","5Drn0pv0i7","WPmlxQssNC","FhtglU3yw5",
+"VIlwPWPmlx","5VZjStuDyS","NcICAHP433","lweGytlILt","FVMxoyEfy9","RzaZAJRJQB","YjB9tChuy3","djsrvAOgEe","WMiS3JIqXi","Nxx9VQYxC0",
+"Yh1hFUlU3M","gIYvEtaOXK","tl72W7X3uy","OUYuFY1mC0","TCgPpoVQp6","ZzJHWhi5X7","SbRYy9y4lw","3weIFDQimp","JIqXiM3zXL","n1pmOOxWIH",
+"BpYhVCxVEf","VjCZqyEfy9","WmadAFxX9q","FjHXRoVQp6","HP433fFDrJ","s4786v8yFN","Ul4a11LB1L","W7cTsJKWYR","FjHXRgjUTu","2TRI7uvf7A",
+"UlU3MKASQ8","W3VFHThjNn","VjCZqOz8yZ","zFgtB8xEKz","GrDg7ciuWz","dhSuHpFrrl","TwanoLbRTH","e6e4zlweGy","RmDcrQClRL","i7WMQJXljW",
+"uZPqgF6PT2","8FmFHMojnP","NAFuwvLsmS","ogLgc0Kyfs","Nxx9VDLhzM","y94nwQWxoT","k85Ae2TRI7","LDk6fMkgy8","BCxeCZJTXH","CxVEfCK5W7",
+"e6e4ztjQxs","Oz8yZjSjS3","FcWrWZhwG1","7Ow5CMGlTF","580YDoVQp6","HzZT8CdyBV","iB08lpAhR1","qUJMdWmadA","J2mQi6q6L9","MmsIoCxVEf",
+"aL6AJgjUTu","lViBv5drc6","cShY2v1Hln","Kr8ysguMb8","zqH0WECMvU","Q6hMChSSvQ","EdBKcs4786","dhSuHpmeCd","5ZaEzNcICA","B3qemM3zXL",
+"ulk41oQ87r","uoStwsoy9t","7fKYU1LB1L","HlUbFdpe1v","b29RJ4QMc9","DLhzMDG4sT","C2IrcSs0Zu","WaWsv7hyVv","wDajXlj07Q","M6qcGHRxd8",
+"gf8rIFFDui","uupzkxXTI4","1j5L8xciqp","qUJMdMkgy8","4QMc9HzZT8","lm0pD2hEEU","WMiS3QbxXc","VerEAMGlTF","jiVBPzFgtB","piJSkt59lR",
+"prNT6ECMvU","jeskSFwEJz","v1Hlniqv4k","Nxx9V0MR5X","l83UdtaOXK","QworuKsjRK","64s8Ns4786","FVMxo8TxD7","2Nslm618Di","yluBxlCMxy",
+"cL0aE24ARF","KsjRKDcpWB","RxrsmQYxC0","2TRI7ydG8U","oQ87rZUnqt","2Yz7E4W0Tl","Yh1hFoQ87r","SmGzvuQIcz","5ZaEzuAWyp","ZJTXHcL0aE",
+"0h1b1HlUbF","4QMc9JIqXi","D6rByyofH3","AXpwE3otm6","48cHLMm8si","5Drn0CqqaD","t59lRLDk6f","DQimpdjsrv","ThjNnDz1R3","fmIK1LbRTH",
+"faHirn1pmO","ydG8Upv0i7","CqqaDDcpWB","QChxs618Di","9eoRcLewvM","xXTI4uTacx","ZJTXHpAhR1","Zv7z0IjTwP","RpBQmyvOMI","VLTy6iB08l",
+"pT8wuEoToP","Rxrsm29QAz","aFFssUmaEv","sx5GllViBv","MGlTFhUTw7","k85Ae2Nslm","VBjhz9y4lw","SmGzvlweGy","RpBQmAIYUu","jzUqRD6rBy",
+"pvgjShe9IA","tl72WRxrsm","pWiOsYw2oU","zmLYDMGlTF","xXTI4lm0pD","0ao3lOz8yZ","EOE1oNcICA","b29RJtaOXK","16lHci3pyd","VLTy6oQ87r",
+"1j5L8Q6hMC","kB5nPlweGy","AIYUuRzaZA","D6rByazIWp","EOE1oFcWrW","uLtKsmz8gx","StlDJlweGy","JkzUnb29RJ","uPX7Gv2eC3","rhl0JNAFuw",
+"vLsmSlweGy","No0QbMmKGJ","ReKEWQ6hMC","aFFss8hJdt","cQOnvVBjhz","2TRI7ECMvU","LDk6f2Yz7E","vLsmSfFDrJ","StlDJSmGzv","yluBxU3yw5",
+"ThjNnCp3mZ","UlU3MSbRYy","HzZT8yvOMI","1LB1LGSQwj","yToGWlweGy","4W0TlQ6hMC","EOE1oEOE1o","W3VFH7fsYM","QYxC0xXTI4","RpBQmzY1GY",
+"0BmCyRzaZA","xXTI4I7p2a","IBe8kMmKGJ","EoToPv8yFN","Yf2EccL0aE","yluBxFFDui","v2eC3gIYvE","RACujNxx9V","WDVWJhUTw7","0MR5XPYBf4",
+"tlILtgtCA5","ZhwG1uJScX","QClRLiwzGk","CIShG9GXkX","580YDpT8wu","rhl0Js4786","FwEJzNo0Qb","DLhzM8FmFH","2NslmqaofN","EOE1o48cHL",
+"7X3uyCIShG","IKxdLMmsIo","fqypyO3iyQ","EoToPOz8yZ","yofH3azIWp","EoToPPOUYS","DQimpMm8si","GXdoH5iGN5","uupzkXyPZN","djsrvECMvU",
+"jzUqRpFrrl","rhl0JIBe8k","dmoS77lUXZ","0Wr5ys93Ml","DcpWBMkgy8","9iGoTAmdQd","8xEKz0PktI","djsrvhe9IA","uTacxKZamH","HRxd8uN6r3",
+"0MR5XM6qcG","gf8rIyEfy9","piJSkEdBKc","IBe8kZv7z0","BCxeCTa8f6","QYxC0iwzGk","k85AeCfgr3","blLA9WDVWJ","Uvlv4nnP8o","1j5L8Uvlv4",
+"Uvlv448cHL","JIqXidQ586","1v5hHHzZT8","X6PinIKxdL","aFFss5IhmG","UlU3MFPfSE","atef2RzaZA","Zv7z0zbIYY","jS1ajTwano","LDk6fhYBCK",
+"zQt6Q5ZaEz","o8UydzmLYD","29QAzl83Ud","BpYhVpAhR1","W3VFHHRxd8","jtn0X8cVD3","GWqqXP6bcg","48cHL3otm6","J2mQiBbwgA","L7cGcQClRL",
+"GrDg7zz4ZU","9y4lwJ2mQi","cQOnvWMiS3","tuDySdQ586","0MR5Xs4786","1j5L8a00b5","ogLgcCqqaD","lH1kt16lHc","IKxdL618Di","QYxC0s7Mxk",
+"HfyNQQnJ1S","RmDcr8RCUA","KZamHrz7Ut","tvdkDMK07Y","prNT6rhl0J","5IhmG4QMc9","O3iyQ8U2nU","yEfy9C2Irc","8RCUA9XyT9","9GXkXI7p2a",
+"wDajXAgJHQ","No0QboQ87r","sqVrfIn3NS","e6e4zqQxHP","8RCUAzQt6Q","v1HlnDLhzM","lkMUAru4UG","VIlwPYh1hF","OUYuFIKxdL","cmXIX8RCUA",
+"StlDJBFkb8","RpBQmpFrrl","mz8gxsoy9t","a00b5m4bxU","ZzJHWFhtgl","OUqFM5iGN5","FVMxoGv3Fq","o8Uydt59lR","sqVrfQworu","pFrrlUlU3M",
+"cL0aEAOgEe","pv0i7dpe1v","7X3uyBpYhV","WPmlx0ao3l","uTacxFjHXR","uN6r3KZamH","gtCA5CK5W7","HfyNQNhXdu","t98iWFGzgp","Cfgr3yluBx",
+"wiHrZuoStw","ciuWzVNCPd","ThjNnmX2GE","h1zcHhi5X7","GSQwjSbRYy","14FLRpWiOs","uvf7AjeskS","aFFssuoStw","ciuWzQChxs","BGaQYWreyP",
+"t59lR4QMc9","lweGyjzUqR","HlUbFVprf2","ulk41aDGtS","2TRI7rz7Ut","7lUXZOHaBz","8RCUAsuY4x","HfyNQDz1R3","xciqpaFFss","ZhwG145cIH",
+"2NslmZJTXH","s4786MmsIo","ZhwG1cL0aE","L7cGcpv0i7","qaofNzY1GY","7lUXZhYBCK","No0QbnnP8o","prNT6hSSvQ","FPfSErz7Ut","RBhp0wiHrZ",
+"BbwgAs7Mxk","HlUbFuupzk","1v5hHdmoS7","jtn0Xatef2","Yf2EcRzaZA","I7p2a9y4lw","sqVrfFhtgl","lCMxyYOfrY","Pb1pamz8gx","5nmWv5Drn0",
+"6q6L9xciqp","ZuDtDZv7z0","zmLYDP6bcg","lkMUA9GXkX","wiHrZyofH3","CqqaDQworu","YOfrYxciqp","7fsYMZ4I1v","pT8wu6q6L9","P6bcglH1kt",
+"KsjRKfqypy","yluBxWaim6","MGlTF2DREs","0YAGH0Kyfs","fFDrJgIYvE","gjUTuM6qcG","HzZT8hSSvQ","uTacxn1pmO","KZamHbZLvS","guMb8xXTI4",
+"WMiS3guMb8","oGu6xEdBKc","lkMUANcICA","Mkgy8bZLvS","6AFT00PktI","S2DfuKsjRK","24ARFjzUqR","FjHXRl83Ud","faHirFVMxo","KsjRKOHaBz",
+"ogLgcprNT6","XyPZN4dEz6","fqypysqVrf","0ao3logLgc","3weIFYw2oU","ydG8UW3VFH","ix74rdmoS7","8xEKzMkgy8","i3pyd7hyVv","ReKEWlViBv",
+"J2mQiYf2Ec","euZA5Y1mC0","ix74rpiJSk","2Yz7EfcwDa","No0QboVQp6","s93MlAgJHQ","ru4UG9XyT9","UlU3M7lUXZ","Rxrsm48cHL","RsQUqFwEJz",
+"VLTy66q6L9","aez9yFxX9q","55rfBuJScX","PYBf4zbIYY","fcJOyAmdQd","Waim624ARF","tuDySvOqCE","48cHLtvdkD","l83Uda00b5","W7cTsDG4sT",
+"4W0TlfFDrJ","xXTI4QnJ1S","Q6hMCTwano","LewvMkB5nP","TwanoAIYUu","vOqCEdhSuH","jiVBP8TxD7","rKDLJFhtgl","In3NStlILt","QbxXcIRh48",
+"618Di9rlg9","TXQ0ZyofH3","TXQ0Z8U2nU","RzaZAOz8yZ","No0QbuPX7G","0BmCyCp3mZ","pv0i7TXQ0Z","bZLvSMojnP","MojnPsx5Gl","Nxx9Vv8yFN",
+"1j5L8CqqaD","WMiS364s8N","VBjhzC2Irc","VerEAD6rBy","s7Mxkx3LDe","brhlQFcWrW","aez9yLbRTH","W7cTsrKDLJ","mX2GESbRYy","WDVWJVjCZq",
+"B3qemLbRTH","iKqhrru4UG","QYxC0lsQGo","8TxD7IRh48","ReKEWtuDyS","0BmCy0h1b1","tl72W48cHL","GWqqXhYBCK","MmsIo7fsYM","vkCHHFLsph",
+"64s8NtAOsr","djsrvFVMxo","y94nwK20wK","ReKEWyvOMI","FwEJzCfgr3","UmaEvsx5Gl","d7vjMzz4ZU","GSQwjL7cGc","jtn0X9rlg9","Cfgr3fcJOy",
+"x3LDeFNYIM","uoStwzFgtB","DcpWBtaOXK","suY4xYw2oU","Ta8f6d7vjM","1v5hHZJTXH","d85a9OUYuF","VjCZqMaJQs","X6PinBGaQY","UlU3MbrhlQ",
+"5IhmGEOE1o","tuDyS0ao3l","hUTw7Oz8yZ","POUYSpiJSk","ZJTXHoQ87r","vOqCEQbxXc","S77LHtjQxs","OUqFMjzUqR","fqypy2DREs","6q6L9Ul4a1",
+"sx5GlQYxC0","ydG8U5Namm","8RCUAYw2oU","8RCUAPb1pa","55rfBKr8ys","7X3uyo8Uyd","W3VFHKr8ys","Mm8sigIYvE","Cfgr3rKDLJ","y94nw5ZaEz",
+"pT8wuru4UG","TCgPpO3iyQ","0h1b1VLTy6","kZANmOz8yZ","TCgPpU3yw5","8U2nUsqVrf","SbRYy0MR5X","Rxrsm8xEKz","nFqikRpBQm","8U2nUVjCZq",
+"8FmFHQYxC0","s93MluoStw","9GXkXVLTy6","BCxeCtAOsr","jtn0XCNHmv","J2mQijfREu","4W0TlMaJQs","BCxeC8cVD3","mX2GEiqv4k","aFFssfqypy",
+"brhlQuoStw","lpF6WtAOsr","ECMvU5Drn0","tjQxsokgRi","K4GS8JRJQB","uN6r3lpF6W","fFDrJCdyBV","OHaBzzz4ZU","t98iWCfgr3","0BmCyLbRTH",
+"lH1ktzQt6Q","AgJHQFFDui","pmeCd7fsYM","4dEz6ydG8U","pAhR1atef2","TXQ0ZhUTw7","zqH0Wv8yFN","MGlTFlCMxy","VNCPdprNT6","cQOnvgdQsS",
+"m4bxU7X3uy","jS1ajqUJMd","rz7UtEdBKc","RzaZAgf8rI","BCxeCjeskS","FxX9qpT8wu","s7Mxk4QMc9","16lHchi5X7","okgRiAIYUu","o8Uydn8pJ9",
+"guMb8faHir","QClRLzz4ZU","0PktIzmLYD","JkzUnwiHrZ","AmdQdF6PT2","nlaByuJScX","uTacxiKqhr","s7MxkEdBKc","sx5GlDcpWB","WreyPCdyBV",
+"AOgEerKDLJ","ix74rlH1kt","IKxdLEOE1o","ThjNn0YAGH","tAOsrQssNC","RsQUq1LB1L","lkMUAPYBf4","YOfrYzmLYD","uLtKsQ6Lix","Chuy3lpF6W",
+"RACujh1zcH","W3VFHlj07Q","Pb1paSbRYy","oGu6xjiVBP","QssNCQWxoT","ogLgcwiHrZ","aDGtSUl4a1","AkKTkix74r","7lUXZrKDLJ","WPmlxVBjhz",
+"Y1mC06q6L9","S77LHlViBv","lCMxytvdkD","2hEEU3weIF","iKqhrNAFuw","ZUnqt5Drn0","jiVBPXflUq","ciuWzbZLvS","GrDg7hE1Ql","StlDJpiJSk",
+"4QMc9CdyBV","piJSkHP433","MaJQsFhtgl","zFgtBix74r","Ta8f60Wr5y","WmadA7fsYM","UlU3M0ao3l","GXdoHzqH0W","ZuDtDQbxXc","FVMxoWaWsv",
+"aL6AJTXQ0Z","OxWIH9iGoT","8RCUAoQ87r","tlILtnnP8o","nFqikHP433","cShY2XyPZN","J2mQiMkgy8","6AFT0soy9t","he9IAK4GS8","JIqXi24ARF",
+"VIlwPkZANm","SjskQkB5nP","NOHszMm8si","UmaEvaL6AJ","9eoRcJXljW","hSSvQ618Di","FGzgpG1RhS","d85a9soy9t","S2DfuMaJQs","okgRiZhwG1",
+"Vprf2StlDJ","ciuWzdpe1v","FPfSEtlILt","P6bcgoVQp6","fmIK1Y1mC0","lH1ktv8yFN","lkMUAhYBCK","v2eC3NhXdu","GSQwjcL0aE","OUqFMStlDJ",
+"fFDrJe6e4z","yofH3x3LDe","yToGWlH1kt","CK5W7brhlQ","2hEEUFFDui","QChxsBCxeC","Ss0Zu07n1c","uupzk7X3uy","uTacxThjNn","W3VFHMezSW",
+"hE1QloGu6x","blLA9DcpWB","hSSvQ5ZaEz","okgRiyEfy9","CxVEfQYxC0","SjskQgIYvE","pv0i7jtn0X","jiVBPF6PT2","Q6hMCK20wK","yToGWnnP8o",
+"8hJdtguMb8","zQt6Q24ARF","Yf2EcCNHmv","aDGtSMojnP","07n1cMkgy8","2ZHdkECMvU","nFqikWaim6","soy9taFFss","JKWYRi3pyd","wiHrZfcJOy",
+"kB5nPGSQwj","fcJOyxXTI4","5drc6AmdQd","ZuDtDKZamH","QbxXcAmdQd","lkMUALbRTH","Q6Lix24ARF","Chuy3uvf7A","uTacx0h1b1","Ul4a1SjskQ",
+"4QMc9FNYIM","JJs5mBbwgA","RACuj8U2nU","cQOnvyToGW","t59lRThjNn","iqv4kKsjRK","KASQ8lsQGo","CIShGDQimp","tl72WGWqqX","No0Qbo8Uyd",
+"618DijzUqR","4dEz607n1c","2hEEUDG4sT","Oz8yZguMb8","7lUXZZJTXH","BGaQYtaOXK","euZA5SjskQ","Pb1pa5nmWv","POUYSlH1kt","5nmWviwzGk",
+"HRxd8NAFuw","1LB1Lb29RJ","kZANm0PktI","NOHsztvdkD","ZJTXHyToGW","Yf2Ec8TxD7","5NammJIqXi","b29RJCp3mZ","IjTwPzz4ZU","UlU3MyToGW",
+"ReKEWzbIYY","kB5nP5VZjS","ZhwG1jS1aj","t98iWpWiOs","UlU3M8cVD3","a00b5Dz1R3","QWxoTFFDui","8U2nUHRxd8","NAFuweuZA5","Waim67X3uy",
+"6q6L9Mkgy8","JKWYRSmGzv","uvf7Ai3pyd","CIShGxXTI4","8U2nUP6bcg","5Drn0lm0pD","b29RJydG8U","ZUnqtTCgPp","Mm8sivOqCE","Yw2oUVprf2",
+"FxX9qd85a9","RzaZAydG8U","8xEKzQ6hMC","FnPFBWaim6","JRJQB0Wr5y","JKWYR2Nslm","1j5L8CNHmv","azIWpNo0Qb","Q6hMC5VZjS","IBe8kOz8yZ",
+"FPfSEn8pJ9","29QAz5Drn0","VBjhzaDGtS","4W0TliB08l","jfREuB3qem","VNCPdYh1hF","0PktIlweGy","XflUqMGlTF","kB5nPGv3Fq","l83UdoGu6x",
+"AgJHQoVQp6","rz7UtjfREu","l83UdFjHXR","5VZjS4W0Tl","XflUquvf7A","QChxs1j5L8","oGu6xjSjS3","qQxHPRzaZA","zQt6QuoStw","Oz8yZRkQke",
+"vLsmSxciqp","HRxd80Kyfs","MK07Y2ZHdk","HfyNQVprf2","Waim69y4lw","piJSkCNHmv","ECMvUaDGtS","cQOnvnnP8o","JIqXiS2Dfu","JkzUnv2eC3",
+"8TxD7StlDJ","guMb8SjskQ","dQ5861j5L8","5IhmGDz1R3","POUYSCfgr3","dmoS7ix74r","zHF1qpvgjS","9iGoTX6Pin","hSSvQbrhlQ","Yw2oUW3VFH",
+"EdBKcECMvU","lkMUAx3LDe","Fhtgll83Ud","14FLR64s8N","qQxHP9y4lw","uQIczhYBCK","fmIK1DG4sT","HRxd8MojnP","CqqaDokgRi","WPmlx5Mg9r",
+"s93MlwiHrZ","LDk6fyvOMI","QClRL8hJdt","Yf2Ec5VZjS","piJSkNo0Qb","YOfrYo8Uyd","bZLvSZuDtD","Ta8f6VLTy6","0ao3lbgJAz","45cIHVjCZq",
+"fqypyRkQke","0h1b16AFT0","soy9toGu6x","hSSvQnFqik","hE1QlQ6hMC","AOgEeuZPqg","sqVrfZUnqt","gdQsSuTacx","7ku1pAXpwE","n8pJ9y94nw",
+"5ZaEzyofH3","SjskQNo0Qb","StlDJ64s8N","0ao3lFFDui","JRJQBd85a9","HzZT8ni2v1","Ss0ZuwDajX","guMb8a00b5","GXdoHEOE1o","4dEz6tjQxs",
+"BCxeCFwEJz","Pb1pao8Uyd","e6e4zd7vjM","GSQwj2Yz7E","QbxXcPb1pa","DLhzM8TxD7","prNT6EoToP","DQimpAXpwE","VIlwPoGu6x","WaWsv9iGoT",
+"BbwgADG4sT","TCgPps93Ml","uoStwXyPZN","MGlTF0PktI","zqH0WS2Dfu","BCxeClCMxy","ni2v1qQxHP","K4GS8vkCHH","Gv3Fqhe9IA","dhSuHfmIK1",
+"pvgjSjeskS","7lUXZFVMxo","Pb1pa7fKYU","tuDySdjsrv","zbIYY64s8N","ru4UG7hyVv","OUYuF5Namm","P6bcgGWqqX","Mkgy8QChxs","wDajXtlILt",
+"uAWypQworu","mX2GEM3zXL","C2IrcogLgc","K20wKAIYUu","rz7UtKr8ys","qUJMdpvgjS","yofH3k85Ae","zmLYDn8pJ9","JXljWM3zXL","AgJHQpT8wu",
+"6AFT0D6rBy","SbRYyBGaQY","0MR5XfaHir","pFrrlIRh48","s4786StlDJ","WmadA7lUXZ","uQIczQYxC0","WreyPRsQUq","e6e4zGv3Fq","pvgjSulk41",
+"vLsmSYf2Ec","faHiruJScX","X6PingIYvE","gtCA5FPfSE","soy9tuZPqg","lCMxypAhR1","pmeCd7X3uy","5IhmGy94nw","fLNg8MaJQs","fLNg8rhl0J",
+"QssNCn1pmO","zmLYD9XyT9","ReKEWJkzUn","L7cGcThjNn","Q6LixydG8U","e6e4zhUTw7","lj07QRkQke","euZA5tlILt","2Yz7E0YAGH","9GXkXn8pJ9",
+"ix74rP6bcg","iB08lDQimp","rz7UtnlaBy","Qworut59lR","yvOMIJRJQB","jiVBPatef2","aL6AJksJby","yluBx2hEEU","Kr8ysJ2mQi","UlU3MMmKGJ",
+"KASQ8y94nw","d85a91j5L8","WDVWJpmeCd","0Wr5yF6PT2","S77LHFnPFB","BbwgA2hEEU","uoStwtuDyS","BbwgAdmoS7","Ta8f6BpYhV","ni2v1No0Qb",
+"hi5X7Yf2Ec","fmIK1FGzgp","LewvM580YD","lkMUA580YD","jS1ajZ4I1v","vkCHHuZPqg","VLTy6zY1GY","GrDg7L7cGc","yvOMIhSSvQ","FxX9qKsjRK",
+"Waim65nmWv","IKxdLdmoS7","Q6Lix14FLR","Ul4a1Twano","cL0aEFhtgl","FGzgpOHaBz","S2DfupFrrl","oQ87rFVMxo","16lHcsuY4x","mz8gxGSQwj",
+"FwEJzkB5nP","EOE1orKDLJ","jSjS3nFqik","sqVrfMojnP","0ao3lDG4sT","fcwDaW3VFH","KASQ8FjHXR","zHF1qnFqik","ciuWzGWqqX","8TxD7C2Irc",
+"i3pydfLNg8","FhtglKZamH","8cVD30Wr5y","djsrviqv4k","vLsmS8hJdt","8cVD3tjQxs","GSQwjjiVBP","B3qemZuDtD","soy9tJXljW","pT8wuCIShG",
+"hE1QlU3yw5","pvgjSI7p2a","AmdQdZUnqt","jSjS3nnP8o","9eoRcprNT6","m4bxU5IhmG","ZhwG1S77LH","EoToPFGzgp","FPfSEOxWIH","zY1GYvLsmS",
+"x3LDeNhXdu","xReecMm8si","qQxHPuPX7G","GrDg7ZuDtD","AOgEeBbwgA","Rxrsm16lHc","y94nwGSQwj","LDk6frz7Ut","brhlQKASQ8","gf8rIAOgEe",
+"lkMUAsx5Gl","F6PT2TXQ0Z","iwzGk0PktI","8RCUAFVMxo","MaJQsMkgy8","2DREsuTacx","JJs5mjzUqR","9XyT9KsjRK","QworuqaofN","vOqCES77LH",
+"KsjRK9GXkX","AkKTkMmsIo","4W0TlQWxoT","48cHLtAOsr","1j5L8Kr8ys","prNT6IjTwP","TCgPplsQGo","7X3uyEOE1o","ECMvUSmGzv","07n1c1j5L8",
+"4dEz6TCgPp","Yw2oU8hJdt","TCgPplm0pD","kZANmsqVrf","lj07Q9GXkX","NOHszh1zcH","F6PT2BbwgA","Cp3mZ14FLR","1v5hHM3zXL","v2eC3nlaBy",
+"4QMc9AIYUu","dmoS7gf8rI","Pb1pa2Yz7E","8U2nUqQxHP","uupzktjQxs","HlUbF0YAGH","Q6Lix2Nslm","C2IrcEoToP","CIShG24ARF","oGu6xRACuj",
+"nlaByfaHir","aL6AJPOUYS","jS1ajtaOXK","oGu6xyvOMI","FxX9qCIShG","tlILt618Di","5nmWvpT8wu","dQ586M3zXL","IjTwP4QMc9","zbIYYuoStw",
+"Cfgr3UmaEv","HlUbF2Nslm","Q6Lixhe9IA","bZLvSoGu6x","SbRYydpe1v","StlDJMojnP","OUYuFuAWyp","QnJ1S16lHc","Dz1R3MmKGJ","8xEKzZhwG1",
+"VerEAo8Uyd","9GXkXBbwgA","QssNCLDk6f","FGzgphUTw7","fcJOy64s8N","Oz8yZWaWsv","pT8wuRxrsm","lsQGozmLYD","mz8gxKASQ8","fqypy580YD",
+"8FmFHJRJQB","AXpwEEoToP","dQ586FLsph","8U2nUAXpwE","MGlTFFhtgl","iB08lprNT6","YOfrYI7p2a","MK07YwDajX","dpe1vAmdQd","sqVrf7ku1p",
+"a00b55nmWv","Chuy3JRJQB","lkMUAIKxdL","Kr8ysSmGzv","pv0i7lj07Q","zY1GYnnP8o","3weIFDG4sT","vLsmSk85Ae","uoStwFjHXR","24ARFgf8rI",
+"3otm6Yw2oU","prNT6WPmlx","aFFssPYBf4","jtn0XMmsIo","ECMvUtuDyS","Chuy3VLTy6","G1RhS0PktI","ru4UGzbIYY","oVQp6CdyBV","JIqXipFrrl",
+"uAWypRzaZA","ru4UGQWxoT","s7MxkYf2Ec","Oz8yZQssNC","faHirIBe8k","DLhzM0PktI","hE1Ql4dEz6","TwanoPOUYS","9rlg9DG4sT","uvf7AuJScX",
+"FcWrWhYBCK","MaJQsbgJAz","8FmFHJkzUn","tvdkDiwzGk","0BmCyh1zcH","iqv4kNhXdu","lXFOBWaWsv","zFgtBzFgtB","Q6LixgtCA5","Nxx9VjSjS3",
+"ZuDtD14FLR","ZUnqtjS1aj","KZamH5Mg9r","djsrv0YAGH","0PktIpmeCd","0Wr5yuupzk","lkMUATXQ0Z","tl72Wru4UG","piJSkqUJMd","lj07Qzz4ZU",
+"Cp3mZhi5X7","3weIFRkQke","RsQUq5Namm","brhlQMezSW","uupzkd85a9","AOgEe5ZaEz","VjCZqCIShG","tuDySNOHsz","uQIczZuDtD","n1pmOS77LH",
+"uvf7A0Wr5y","6AFT07hyVv","Zv7z0o8Uyd","2DREsoVQp6","uQIczMK07Y","NcICAn1pmO","GrDg7i3pyd","ni2v1jS1aj","8U2nUZzJHW","Chuy30BmCy",
+"cL0aEuAWyp","5Drn0TCgPp","ydG8U8hJdt","WreyPTwano","he9IADQimp","gjUTuMezSW","LewvM0MR5X","7hyVvydG8U","t59lRulk41","No0QbQbxXc",
+"CK5W7l83Ud","QChxs7X3uy","gf8rIUvlv4","QnJ1SWreyP","SjskQyToGW","pmeCdn8pJ9","ZzJHWFPfSE","14FLRsqVrf","0PktI64s8N","HP433BFkb8",
+"RBhp0aL6AJ","AmdQdv1Hln","55rfBxReec","gtCA5v1Hln","0ao3lI7p2a","pAhR1x3LDe","6AFT0lCMxy","RzaZASjskQ","oGu6xprNT6","WDVWJAIYUu",
+"OUqFMS2Dfu","gIYvEzz4ZU","a00b5EoToP","uLtKsmX2GE","gf8rI9GXkX","BCxeC2hEEU","ZUnqt0ao3l","yluBxs93Ml","KsjRK7fsYM","MK07Y7X3uy",
+"RBhp007n1c","JXljWWmadA","oVQp6D6rBy","LDk6fP6bcg","kB5nPGXdoH","O3iyQsoy9t","FjHXRksJby","s93MlVjCZq","L7cGcprNT6","4QMc9zHF1q",
+"hYBCKaL6AJ","faHirIRh48","U3yw5jfREu","UlU3MK4GS8","LewvMt98iW","W7cTsYh1hF","4QMc95VZjS","RpBQmm4bxU","hSSvQpT8wu","n8pJ9wiHrZ",
+"nFqikiKqhr","Cfgr3v8yFN","FxX9ql83Ud","W7cTsCfgr3","MGlTFcShY2","55rfBfcJOy","QChxsblLA9","MezSWcQOnv","GrDg7FwEJz","mz8gxZuDtD",
+"5drc6xReec","kZANmtuDyS","MojnPAkKTk","kB5nPv8yFN","HzZT848cHL","fqypyFPfSE","ZhwG1tlILt","Pb1paZv7z0","ZJTXHtuDyS","gtCA5Ta8f6",
+"In3NSfmIK1","h1zcHVIlwP","JRJQBm4bxU","h1zcH8RCUA","GSQwjUvlv4","uPX7GCNHmv","45cIHulk41","bgJAzv2eC3","zHF1qS2Dfu","QworuMaJQs",
+"S77LH07n1c","dQ586uLtKs","NhXduWDVWJ","9iGoTo8Uyd","Oz8yZWaim6","uAWypaL6AJ","Vprf2piJSk","pWiOs5VZjS","dQ586JRJQB","FFDuiaez9y",
+"AIYUu580YD","Vprf2fqypy","ru4UGVIlwP","BCxeCn1pmO","b29RJ0ao3l","hE1Ql29QAz","S2DfuNo0Qb","uZPqgru4UG","StlDJzbIYY","P6bcgJIqXi",
+"rhl0J618Di","WPmlxe6e4z","lm0pDjS1aj","hUTw7hSSvQ","QworugIYvE","v2eC3tuDyS","8hJdtQworu","EoToPFxX9q","7X3uyCxVEf","n8pJ9Y1mC0",
+"NhXdudpe1v","zbIYYZv7z0","uvf7A5IhmG","8hJdtaL6AJ","n8pJ9prNT6","K4GS8ix74r","hSSvQ55rfB","OUqFMRACuj","TXQ0ZfmIK1","YOfrYYh1hF",
+"hE1QluPX7G","CdyBVuAWyp","pv0i7pv0i7","29QAzd85a9","VNCPdDQimp","l83Ud0MR5X","9GXkXKr8ys","o8UydzQt6Q","MmKGJHfyNQ","oQ87rAXpwE",
+"0PktIzz4ZU","AkKTkgf8rI","5iGN5vkCHH","0Wr5yWreyP","nFqikUvlv4","ulk41lweGy","In3NSBCxeC","YjB9tOHaBz","pT8wupAhR1","fcwDajzUqR",
+"FhtglMGlTF","B3qemjS1aj","zmLYD5iGN5","GXdoHpvgjS","LewvM5Namm","iwzGkQWxoT","VerEAs93Ml","hSSvQaL6AJ","vOqCEpvgjS","7X3uyYOfrY",
+"nnP8ofaHir","Yh1hFhe9IA","fcJOyjtn0X","iB08l2Yz7E","cShY2Chuy3","5VZjStAOsr","lViBvulk41","xReecRBhp0","wDajXJ2mQi","sx5Glix74r",
+"OHaBz8xEKz","IRh48Twano","nnP8o8xEKz","OUYuFoVQp6","4QMc9fcwDa","i7WMQZhwG1","Y1mC0NAFuw","SWfouFFDui","pv0i7uN6r3","b29RJBFkb8",
+"lsQGobgJAz","5drc6ZUnqt","KASQ8FGzgp","FjHXRlH1kt","hSSvQQbxXc","uQIczlXFOB","MmsIoOUqFM","tlILtgIYvE","b29RJpv0i7","dQ5863weIF",
+"5iGN53otm6","EdBKcNcICA","iB08luJScX","9GXkX1LB1L","7fsYMrz7Ut","pvgjSrz7Ut","0h1b1RmDcr","Ss0ZufLNg8","W7cTslj07Q","sx5GlM6qcG",
+"CxVEfTwano","Q6LixvkCHH","BCxeCs7Mxk","WDVWJiwzGk","h1zcHNhXdu","nFqikblLA9","s93MlhYBCK","n8pJ9dQ586","XyPZNJIqXi","07n1c0Kyfs",
+"aez9yJRJQB","v8yFN48cHL","i3pydyofH3","TXQ0ZyToGW","vOqCEVLTy6","FVMxopFrrl","guMb8lm0pD","MojnP8cVD3","WDVWJaFFss","ksJbyuTacx",
+"aez9yaez9y","VLTy6C2Irc","FnPFBMkgy8","9rlg9SbRYy","5Mg9rnnP8o","U3yw5VjCZq","euZA5yofH3","pvgjSs4786","7fKYUxReec","618DiQClRL",
+"9eoRc64s8N","qUJMdpWiOs","Dz1R3cmXIX","StlDJWMiS3","JIqXi5Drn0","0MR5XogLgc","lCMxyAXpwE","zmLYDuZPqg","uZPqgCdyBV","okgRiGrDg7",
+"iB08lZv7z0","cShY2i7WMQ","29QAz1v5hH","ogLgcuLtKs","M3zXLlkMUA","AgJHQqUJMd","SbRYy8cVD3","FLsphAmdQd","lsQGoxXTI4","VNCPdVerEA",
+"zQt6Qdpe1v","4W0TljzUqR","DQimpzqH0W","HP433qUJMd","lweGyQWxoT","LDk6f0Kyfs","07n1cTCgPp","5NammpWiOs","9GXkXCxVEf","s7MxklkMUA",
+"9iGoT5drc6","atef2guMb8","faHir4W0Tl","Cfgr3i3pyd","xciqpiqv4k","e6e4zI7p2a","ECMvUDQimp","580YDWmadA","jS1aj2TRI7","J2mQiatef2",
+"he9IAMmKGJ","CxVEfVprf2","POUYSokgRi","d7vjMlj07Q","xciqpgdQsS","s4786cQOnv","U3yw5bgJAz","pv0i7vOqCE","B3qembrhlQ","JXljWix74r",
+"ni2v1zmLYD","ZhwG1ZzJHW","MGlTFxciqp","8U2nUZUnqt","QWxoTzz4ZU","dQ586nlaBy","B3qemEOE1o","LewvMAkKTk","Uvlv4SjskQ","WaWsvx3LDe",
+"9GXkXZuDtD","6AFT00MR5X","jS1ajK20wK","7fKYUcmXIX","lj07QWreyP","PYBf4yEfy9","SmGzvFPfSE","oVQp6PYBf4","ReKEWK4GS8","8xEKzyvOMI",
+"ZzJHWDQimp","OHaBz2ZHdk","C2IrcNhXdu","YOfrYt59lR","MaJQsrKDLJ","QnJ1SWDVWJ","KASQ8ECMvU","6q6L9lXFOB","jiVBPyofH3","B3qemC2Irc",
+"StlDJIBe8k","qaofNNo0Qb","h1zcHQChxs","gdQsSKASQ8","QworuZhwG1","FjHXRB3qem","AgJHQhSSvQ","QChxspmeCd","M6qcGAkKTk","fLNg8AkKTk",
+"okgRiMaJQs","ZJTXHuQIcz","DQimpUmaEv","8FmFHaDGtS","QnJ1SRsQUq","1j5L8zbIYY","QChxsSjskQ","QClRL0MR5X","Mkgy8tuDyS","UmaEvgf8rI",
+"ogLgcv2eC3","0ao3li7WMQ","0BmCyfcwDa","hYBCKt98iW","rz7UtJXljW","O3iyQIBe8k","1v5hHlweGy","XyPZNaez9y","ReKEWm4bxU","Fhtgls7Mxk",
+"6AFT0nnP8o","In3NSatef2","v8yFNWmadA","DLhzMZv7z0","RACujRmDcr","faHirfqypy","k85AejSjS3","Mm8si2Nslm","7hyVvZ4I1v","gtCA5ksJby",
+"P6bcgnnP8o","8U2nU8xEKz","2TRI7UlU3M","F6PT29y4lw","mX2GEv8yFN","ulk41pT8wu","bZLvSsoy9t","ZUnqtYf2Ec","zbIYY8xEKz","tAOsrZhwG1",
+"gtCA5taOXK","piJSkulk41","Waim6zz4ZU","OUYuF8hJdt","dhSuHXflUq","lCMxyfaHir","WreyPd7vjM","6AFT0GSQwj","3weIFulk41","fcwDaJ2mQi",
+"2ZHdkt98iW","1LB1L7hyVv","3weIFt98iW","brhlQdjsrv","MezSWGXdoH","lpF6WuQIcz","pvgjS5nmWv","DG4sTZUnqt","ksJbyIRh48","UmaEvjSjS3",
+"BCxeCrz7Ut","GWqqX55rfB","HP433W7cTs","MaJQsxXTI4","Cp3mZ9iGoT","CIShG64s8N","d7vjMRxrsm","KsjRKWPmlx","W7cTsYw2oU","ydG8UdmoS7",
+"L7cGcDLhzM","8U2nUThjNn","wDajXzz4ZU","ulk415iGN5","5iGN5UmaEv","8TxD7JkzUn","7X3uybZLvS","Mm8sit59lR","FcWrWOHaBz","ZUnqth1zcH",
+"WMiS3GWqqX","jSjS3hi5X7","MojnPjiVBP","8xEKzuN6r3","K4GS8tlILt","pAhR1uN6r3","RxrsmGrDg7","WmadAyofH3","ZzJHW5iGN5","v1HlnzQt6Q",
+"9XyT9dQ586","k85Ae07n1c","RkQkezFgtB","jfREu0BmCy","v1HlntlILt","7X3uyMaJQs","QworuRzaZA","MK07YaDGtS","9eoRcWDVWJ","gIYvEMK07Y",
+"5IhmGNhXdu","ZzJHWBGaQY","ReKEWAOgEe","55rfBQ6Lix","M6qcGix74r","aez9y5ZaEz","07n1csuY4x","5ZaEzaDGtS","2ZHdkjzUqR","0PktIIKxdL",
+"d7vjMWmadA","fcwDa5Drn0","k85AeXflUq","GSQwjFVMxo","Yw2oUNOHsz","IjTwPRxrsm","tjQxs7hyVv","GrDg7lkMUA","FPfSE2Nslm","uQIczGSQwj",
+"x3LDerhl0J","O3iyQ0Wr5y","QssNCyluBx","rhl0JyToGW","7fsYMW7cTs","CK5W7blLA9","StlDJiB08l","azIWp14FLR","jSjS35ZaEz","brhlQt59lR",
+"RmDcrMaJQs","QYxC0oVQp6","6q6L9StlDJ","2hEEUXyPZN","HfyNQlpF6W","WmadAfqypy","5nmWv8U2nU","OHaBzksJby","VIlwPK20wK","uLtKsaDGtS",
+"blLA9b29RJ","Cfgr3Yh1hF","FLsph2TRI7","tl72Wsx5Gl","jS1ajbZLvS","RpBQmzbIYY","oVQp6cQOnv","G1RhSfcJOy","P6bcgWaWsv","DLhzMZzJHW",
+"zFgtBlpF6W","xReecazIWp","1v5hHCK5W7","mz8gxFnPFB","Oz8yZfFDrJ","9XyT9Cfgr3","FxX9qUmaEv","IjTwPL7cGc","Zv7z00MR5X","JJs5mzFgtB",
+"580YDFxX9q","azIWpaFFss","Nxx9VQ6hMC","FcWrWo8Uyd","FwEJzuTacx","v2eC3d7vjM","PYBf4WmadA","k85AetlILt","RsQUq2DREs","aDGtSTCgPp",
+"jiVBPpv0i7","8U2nUwiHrZ","qaofNDLhzM","mz8gxtlILt","he9IAcShY2","MmsIoEdBKc","gdQsSRmDcr","mX2GE9y4lw","MK07YFVMxo","zqH0WRzaZA",
+"lj07QP6bcg","uZPqgQ6hMC","WreyPokgRi","S2DfutAOsr","7X3uyNhXdu","GrDg7KZamH","W3VFHcmXIX","QClRLnlaBy","HlUbFS77LH","lViBvIBe8k",
+"S77LHBCxeC","RmDcrChuy3","hi5X7XyPZN","RpBQm0PktI","Yh1hFRkQke","D6rBygf8rI","lCMxy7fKYU","uJScXi7WMQ","k85AebgJAz","sqVrfuLtKs",
+"qQxHPHP433","KASQ8pvgjS","ni2v1pmeCd","Q6hMCEOE1o","gjUTuP6bcg","Yw2oUS77LH","ZzJHWhUTw7","O3iyQOHaBz","AgJHQKASQ8","lViBvWaWsv",
+"StlDJlj07Q","8TxD70Kyfs","DG4sTuLtKs","L7cGcAkKTk","C2Irce6e4z","BGaQYM3zXL","MmKGJtAOsr","lj07QBGaQY","hYBCKuAWyp","GXdoHK20wK",
+"QssNClViBv","YOfrY0BmCy","qaofNECMvU","5IhmGdpe1v","LewvMQbxXc","Ss0ZuXyPZN","HzZT8BbwgA","Mkgy8StlDJ","jzUqRHlUbF","ReKEWCdyBV",
+"9iGoTlViBv","2hEEUCK5W7","Mm8siCNHmv","JkzUntuDyS","fcJOyRBhp0","Vprf2kB5nP","euZA5QWxoT","ydG8UYf2Ec","0h1b1RACuj","uZPqgjiVBP",
+"uTacxlkMUA","KZamHPYBf4","FLsphVBjhz","Mkgy8azIWp","LewvM6AFT0","SmGzvcShY2","5Drn0suY4x","JRJQBpiJSk","oQ87r2hEEU","QbxXcL7cGc",
+"CNHmvTa8f6","OHaBzuJScX","SjskQpAhR1","IKxdLS2Dfu","M6qcGGrDg7","14FLR7lUXZ","d85a9yToGW","CK5W7Kr8ys","i3pydtvdkD","iKqhrQClRL",
+"8RCUAF6PT2","tjQxsS2Dfu","cmXIXZJTXH","No0QbGrDg7","mz8gxJ2mQi","Ss0Zudjsrv","zFgtBSmGzv","JIqXiOxWIH","TCgPpCxVEf","Mkgy8JIqXi",
+"aFFss6q6L9","cShY2zqH0W","jzUqRB3qem","qUJMdiwzGk","sx5GlgIYvE","Cfgr3pT8wu","7ku1pfmIK1","pAhR1ZUnqt","lkMUAogLgc","HP433RzaZA",
+"kB5nPTCgPp","djsrvNxx9V","8hJdtBFkb8","pT8wuRsQUq","QworuHzZT8","MK07Yt59lR","x3LDeUl4a1","1LB1L2TRI7","CdyBVt59lR","CNHmv4W0Tl",
+"G1RhShYBCK","5ZaEzWreyP","Gv3Fqt98iW","WreyPjiVBP","prNT6Zv7z0","euZA5CxVEf","Kr8ysQ6hMC","LewvMzz4ZU","W3VFHzz4ZU","Vprf2uupzk",
+"RACuj5Mg9r","okgRi0ao3l","rhl0Jmz8gx","prNT6HP433","FcWrWuvf7A","CqqaDlXFOB","v1HlnbrhlQ","NOHszfqypy","oVQp6SjskQ","W7cTskB5nP",
+"lweGys93Ml","Ta8f6IBe8k","bgJAzaez9y","OUqFMK20wK","FNYIMChuy3","MmsIoMezSW","atef2P6bcg","yToGWECMvU","0Wr5y0MR5X","Z4I1vzqH0W",
+"JKWYRF6PT2","cQOnvfmIK1","LDk6fzY1GY","FcWrWDG4sT","h1zcHfaHir","yluBxfcwDa","EoToPMmsIo","9iGoTUlU3M","kB5nPgjUTu","48cHLiwzGk",
+"UlU3MBpYhV","CK5W7JKWYR","4dEz60YAGH","9eoRc0PktI","KASQ8qaofN","faHirFcWrW","618DihYBCK","7fsYMQ6hMC","ZuDtDY1mC0","sqVrfpiJSk",
+"MojnPFnPFB","S2DfuvOqCE","ru4UGt98iW","guMb8fFDrJ","AkKTkUlU3M","P6bcgChuy3","0BmCyFPfSE","lweGyMGlTF","618DiYh1hF","VLTy6gIYvE",
+"Yh1hFZ4I1v","NhXdulweGy","rz7UtCdyBV","lm0pDqaofN","pT8wuhi5X7","RACujUmaEv","dhSuHB3qem","TwanoUmaEv","zz4ZUM3zXL","WmadAHfyNQ",
+"Cp3mZbrhlQ","Chuy3RBhp0","tjQxs29QAz","No0QbNOHsz","7fKYUqaofN","RpBQmBbwgA","sqVrfaFFss","LDk6fWaim6","Pb1pa7fsYM","lsQGooQ87r",
+"nFqikZ4I1v","B3qemEdBKc","NOHsz3otm6","a00b58FmFH","rhl0JlCMxy","GrDg7P6bcg","29QAzzQt6Q","QssNCwDajX","jS1ajlH1kt","v8yFNvkCHH",
+"v2eC3W7cTs","D6rByO3iyQ","G1RhSCqqaD","euZA59eoRc","pFrrlPYBf4","IRh48jfREu","uQIczVjCZq","aDGtSnFqik","JXljWeuZA5","nlaBycL0aE",
+"xXTI4GWqqX","Q6LixWreyP","2Yz7El83Ud","okgRizbIYY","sqVrfvLsmS","MmsIolpF6W","QworueuZA5","3weIFcQOnv","d7vjMs93Ml","Twanol83Ud",
+"14FLRKASQ8","DQimpuoStw","0YAGHO3iyQ","QClRLO3iyQ","s7MxkoQ87r","HzZT8WPmlx","9eoRcCp3mZ","ciuWzKZamH","OxWIHGrDg7","Oz8yZ618Di",
+"IKxdLY1mC0","K4GS8MGlTF","fFDrJZ4I1v","l83UdOUqFM","HP433yEfy9","Qworu5iGN5","cQOnvnlaBy","Waim6uQIcz","29QAzDLhzM","FwEJzi7WMQ",
+"Nxx9VyofH3","cShY29iGoT","2NslmFNYIM","TCgPpnFqik","soy9t24ARF","07n1cG1RhS","U3yw5xciqp","yluBxlpF6W","Oz8yZJ2mQi","GrDg7W7cTs",
+"iqv4kVjCZq","7ku1pfLNg8","o8UydBpYhV","1j5L8atef2","TXQ0ZRzaZA","M6qcGdmoS7","8TxD7yofH3","pFrrlwiHrZ","CNHmvqUJMd","1LB1L2ZHdk",
+"RBhp0lsQGo","Mkgy8lj07Q","1v5hHoVQp6","FhtglUvlv4","SWfouqUJMd","07n1clsQGo","ogLgcuupzk","6q6L98FmFH","U3yw5RkQke","v8yFNFPfSE",
+"0h1b164s8N","6AFT0S2Dfu","UmaEv7lUXZ","x3LDeZzJHW","9XyT9QYxC0","VjCZqlsQGo","JIqXiOUqFM","lj07QHzZT8","AmdQdsx5Gl","J2mQilkMUA",
+"XflUqFPfSE","jtn0XxXTI4","VjCZqciuWz","dQ5865Mg9r","l83Udi7WMQ","wiHrZdmoS7","W3VFHb29RJ","tuDySFGzgp","07n1cyEfy9","D6rBy0h1b1",
+"prNT6bZLvS","9GXkXjSjS3","atef2Twano","7hyVvThjNn","JRJQBMaJQs","ru4UG8U2nU","vLsmSuQIcz","gdQsSAmdQd","MmKGJQbxXc","uoStwxReec",
+"MGlTFdmoS7","v8yFNuupzk","Vprf2Kr8ys","8TxD7jS1aj","gdQsSQworu","2TRI7Qworu","Mkgy8OxWIH","XyPZNHlUbF","0BmCyGv3Fq","QssNCBFkb8",
+"J2mQiNAFuw","AOgEeRkQke","JXljWsx5Gl","m4bxUIRh48","MmKGJdhSuH","x3LDeMmsIo","C2IrcFPfSE","NcICA2TRI7","lsQGo5nmWv","WPmlxzQt6Q",
+"jSjS3BFkb8","zqH0W2DREs","RkQkeYjB9t","M6qcG2Nslm","8RCUAaL6AJ","s4786K20wK","FjHXRdhSuH","24ARFgjUTu","Nxx9VNcICA","M6qcG07n1c",
+"MaJQsPYBf4","ZzJHWdhSuH","W3VFHDcpWB","taOXKtlILt","GWqqXF6PT2","TXQ0Zzz4ZU","Ta8f6LewvM","s7MxkLewvM","SWfous93Ml","dhSuHDcpWB",
+"rz7UtM6qcG","I7p2aqQxHP","uJScXoQ87r","e6e4zB3qem","taOXKuZPqg","ogLgcMaJQs","djsrvIRh48","Yw2oUn8pJ9","48cHL8RCUA","Vprf2tjQxs",
+"No0QbYjB9t","taOXKx3LDe","dpe1vsuY4x","soy9td85a9","ZuDtDMezSW","LbRTH2Nslm","IKxdLRsQUq","kB5nPOz8yZ","jeskSFPfSE","pAhR1vkCHH",
+"48cHL5nmWv","v1HlnxXTI4","RsQUqcmXIX","5ZaEzJJs5m","14FLRDQimp","0BmCyQnJ1S","ksJbyaez9y","RsQUqv2eC3","M3zXLpiJSk","16lHc0ao3l",
+"JIqXi5IhmG","Nxx9V0BmCy","CdyBVUl4a1","jS1ajJIqXi","LDk6fBFkb8","5IhmGnFqik","HfyNQlweGy","JJs5mt59lR","sqVrf5VZjS","XflUqM6qcG",
+"lH1ktt59lR","45cIHblLA9","jS1ajpWiOs","1j5L8ECMvU","uoStwiwzGk","GSQwjmz8gx","Uvlv4gtCA5","rKDLJCp3mZ","gtCA5jzUqR","G1RhSD6rBy",
+"fcJOySWfou","9eoRcMaJQs","Gv3FqxReec","7lUXZ4dEz6","iB08latef2","uTacxs93Ml","JRJQBpv0i7","rhl0JZ4I1v","2DREs5IhmG","07n1coGu6x",
+"Ss0ZuEdBKc","OxWIHpFrrl","MaJQspWiOs","RkQkeTXQ0Z","pvgjSFjHXR","hYBCKThjNn","uJScXPb1pa","ZJTXHSs0Zu","v2eC3DG4sT","FGzgpjtn0X",
+"MaJQsi7WMQ","0KyfsAmdQd","JkzUn9rlg9","dmoS7FwEJz","jfREucmXIX","h1zcHpFrrl","3otm6NcICA","ZuDtD5drc6","jzUqRatef2","QssNCtl72W",
+"RmDcrbZLvS","QYxC0XyPZN","tl72WHRxd8","AgJHQfaHir","zbIYYMaJQs","ZUnqtVprf2","RmDcrCp3mZ","SjskQv2eC3","RzaZACqqaD","jeskSQWxoT",
+"QworuJXljW","qQxHPSWfou","lm0pDJXljW","tl72W2hEEU","jzUqRhe9IA","taOXKuQIcz","sx5GlNcICA","FjHXRuN6r3","yToGW0MR5X","HzZT8Qworu",
+"uN6r3M6qcG","618DiLbRTH","CNHmvAmdQd","6q6L9VjCZq","7hyVvTwano","iB08llsQGo","8RCUABFkb8","DG4sTRACuj","gf8rIGWqqX","Zv7z06q6L9",
+"U3yw54dEz6","jeskSyofH3","IKxdLBCxeC","xXTI4CNHmv","CdyBVpAhR1","ReKEWOz8yZ","e6e4zuoStw","azIWpgtCA5","dmoS7aDGtS","GSQwjkB5nP",
+"EdBKcCNHmv","24ARFblLA9","45cIHciuWz","lj07Q0ao3l","pv0i7VjCZq","6AFT0cmXIX","oQ87r1LB1L","FwEJzZzJHW","55rfBa00b5","IjTwPP6bcg",
+"CK5W7CK5W7","ZhwG1dQ586","i3pyd16lHc","zY1GYMK07Y","QbxXcOHaBz","WDVWJZv7z0","uN6r3ZzJHW","m4bxUcQOnv","fcJOy9GXkX","VNCPdQ6hMC",
+"PYBf4zFgtB","i3pydb29RJ","FnPFBBCxeC","5IhmGdjsrv","GXdoHsx5Gl","blLA9IKxdL","mz8gxbZLvS","0KyfsQClRL","jS1aj7Ow5C","a00b5MGlTF",
+"Zv7z0lsQGo","9y4lwl83Ud","MezSWMezSW","ReKEWn1pmO","uTacx8U2nU","2Nslm1LB1L","uPX7GC2Irc","OxWIH8U2nU","VBjhztAOsr","fqypyMm8si",
+"aDGtSJKWYR","QworuNhXdu","k85AesuY4x","uQIczyluBx","MezSWgtCA5","bZLvSQworu","CxVEfO3iyQ","GSQwjzz4ZU","aFFssWaWsv","FPfSEF6PT2",
+"JkzUnjiVBP","WDVWJzmLYD","FhtglLbRTH","RmDcrjtn0X","1j5L8No0Qb","8xEKzGv3Fq","IBe8kFhtgl","6AFT0CK5W7","5nmWv0PktI","bZLvStjQxs",
+"48cHLMaJQs","VNCPdSjskQ","M6qcGa00b5","VLTy6OxWIH","guMb8ix74r","KsjRKX6Pin","4dEz6VIlwP","sqVrfxXTI4","S2DfuKZamH","jtn0X5Drn0",
+"48cHLhe9IA","wDajX8FmFH","RzaZAbZLvS","qUJMdh1zcH","QChxsY1mC0","yToGWgjUTu","LbRTHBbwgA","b29RJLewvM","dpe1vhUTw7","RBhp0FwEJz",
+"WPmlxdhSuH","ulk41KASQ8","UmaEvEOE1o","v1HlnqaofN","iKqhr9eoRc","2NslmzY1GY","QworuGv3Fq","Ul4a1v1Hln","EOE1oOxWIH","RmDcrIn3NS",
+"i7WMQ8cVD3","0Wr5yjSjS3","0Wr5y9rlg9","a00b5M3zXL","ru4UGM3zXL","POUYSCdyBV","5Drn0lj07Q","i3pydyvOMI","JKWYR16lHc","9XyT99y4lw",
+"VIlwPMm8si","lm0pDo8Uyd","Q6LixQ6Lix","a00b5iwzGk","Vprf2jzUqR","pWiOsfcwDa","t59lRMK07Y","tl72WuLtKs","9rlg9iB08l","HfyNQciuWz",
+"9XyT9qaofN","gtCA5JXljW","48cHLpWiOs","Q6LixqaofN","RxrsmnnP8o","yofH3Ta8f6","uPX7GSjskQ","ydG8Ui7WMQ","lViBvK4GS8","Waim6tl72W",
+"Twano8U2nU","zmLYDiB08l","0KyfsRzaZA","UlU3MU3yw5","3otm69rlg9","VjCZqzqH0W","IBe8kcmXIX","brhlQoQ87r","Mm8siAXpwE","MmsIo3weIF",
+"kZANmFwEJz","8TxD7QYxC0","PYBf4VerEA","zQt6QOUYuF","ulk41fmIK1","0Wr5yQnJ1S","jeskS580YD","lH1ktQWxoT","0ao3lyEfy9","14FLREoToP",
+"yofH3RACuj","fFDrJxReec","8U2nUZJTXH","i3pydoQ87r","RkQkegIYvE","LewvM7fKYU","IKxdL3otm6","s4786RmDcr","uN6r3Dz1R3","VBjhzdpe1v",
+"gjUTuS77LH","MK07Y48cHL","Waim6tjQxs","aez9yNxx9V","suY4xK20wK","FGzgpUl4a1","2DREss7Mxk","lXFOBKr8ys","0PktIAOgEe","NOHszRzaZA",
+"3weIFWaim6","pv0i7lkMUA","tuDySMm8si","M6qcGwDajX","Cp3mZzqH0W","45cIHQ6Lix","aez9yTa8f6","FFDuizmLYD","piJSkOz8yZ","AgJHQlViBv",
+"ogLgcU3yw5","RmDcrJkzUn","EdBKcQWxoT","oGu6xfcJOy","Z4I1vjiVBP","KZamHhUTw7","8TxD7HRxd8","4QMc9CxVEf","tlILt8hJdt","gf8rIC2Irc",
+"tjQxs6q6L9","gdQsSjS1aj","RBhp0Y1mC0","1LB1LnnP8o","ReKEWn8pJ9","xReecMojnP","MmsIoEoToP","bgJAz2Yz7E","POUYSCK5W7","EdBKcwDajX",
+"yluBxxciqp","HzZT88cVD3","lH1ktlj07Q","ZJTXHd85a9","RBhp00ao3l","d85a93otm6","prNT6zbIYY","6q6L9ni2v1","pFrrlDLhzM","3otm6soy9t",
+"tAOsrzFgtB","5VZjS5ZaEz","jSjS3MK07Y","14FLRTCgPp","1v5hHK20wK","0KyfsAgJHQ","9y4lwpFrrl","Ta8f645cIH","mz8gxhSSvQ","rz7UtSs0Zu",
+"FwEJzLbRTH","HfyNQU3yw5","prNT645cIH","fmIK164s8N","lj07Q3otm6","xciqpDG4sT","AmdQdK4GS8","ogLgcVerEA","ZJTXH2ZHdk","9iGoTHfyNQ",
+"QClRLcShY2","MK07Yzz4ZU","m4bxUC2Irc","CqqaDAXpwE","lm0pD8cVD3","wDajXoQ87r","BGaQYThjNn","JIqXiW7cTs","WMiS31LB1L","n1pmO5VZjS",
+"1LB1LL7cGc","okgRixciqp","FPfSE6AFT0","CK5W7EoToP","pmeCdpvgjS","ciuWzHfyNQ","PYBf4xXTI4","9iGoT7lUXZ","n1pmO8cVD3","2DREsThjNn",
+"RBhp0Uvlv4","MmsIoL7cGc","zFgtBkZANm","FnPFBCp3mZ","2TRI75ZaEz","xciqpgf8rI","HfyNQO3iyQ","xXTI4zmLYD","ZzJHWuPX7G","mz8gxYh1hF",
+"cL0aEjSjS3","QbxXc2TRI7","hi5X7ydG8U","gtCA5yofH3","WaWsvpv0i7","kB5nPMaJQs","zFgtBlkMUA","uJScXFGzgp","AOgEeZ4I1v","16lHcxXTI4",
+"zFgtBFGzgp","zQt6Q45cIH","EdBKcYh1hF","W3VFHQnJ1S","uQIcz9eoRc","fcwDaReKEW","S77LHHlUbF","W7cTsCIShG","7fsYMUmaEv","K4GS8nFqik",
+"B3qemcmXIX","sx5GlNxx9V","LbRTHIBe8k","sx5GlQbxXc","cmXIXGrDg7","jSjS3GXdoH","SmGzvBFkb8","gIYvE9y4lw","pAhR1uoStw","cShY2cShY2",
+"JkzUnHfyNQ","2Nslmjtn0X","Zv7z0ksJby","tjQxsLDk6f","piJSk7hyVv","16lHcFjHXR","Q6LixQChxs","VBjhzRACuj","5IhmGChuy3","5Mg9rNOHsz",
+"QChxsMezSW","nlaBypFrrl","jiVBPnnP8o","gdQsSs7Mxk","sqVrfD6rBy","Yf2Ecd7vjM","5Mg9ruAWyp","bgJAzs93Ml","rKDLJsqVrf","Mkgy8VerEA",
+"DQimpogLgc","lpF6WRxrsm","I7p2a24ARF","YOfrYHzZT8","16lHcaDGtS","i7WMQNo0Qb","F6PT2K4GS8","0BmCyQClRL","hSSvQb29RJ","yEfy92Nslm",
+"CdyBV5IhmG","ogLgcpAhR1","nFqikn8pJ9","m4bxUyofH3","4dEz67fsYM","qQxHPs4786","OxWIHM6qcG","OUYuFW3VFH","29QAzpvgjS","aDGtS2Nslm",
+"pFrrlcQOnv","QWxoTDLhzM","iB08lHlUbF","8FmFHuQIcz","lCMxyLDk6f","Rxrsmi3pyd","TXQ0ZVerEA","hSSvQhYBCK","WDVWJDG4sT","MmKGJQnJ1S",
+"guMb8h1zcH","azIWp9GXkX","cShY2x3LDe","jzUqRlj07Q","aL6AJUl4a1","0h1b1LewvM","M3zXLv1Hln","xXTI4Mkgy8","64s8NoVQp6","MezSWsoy9t",
+"45cIHsqVrf","1LB1LHfyNQ","pAhR1GSQwj","ZhwG1qaofN","uoStwZUnqt","RzaZA64s8N","G1RhSe6e4z","5Drn0gIYvE","0KyfsVjCZq","prNT6LewvM",
+"Yf2Ec0YAGH","0BmCy1j5L8","BbwgAO3iyQ","Yw2oU3weIF","WmadAsoy9t","RkQketl72W","EOE1o4QMc9","MmsIoIRh48","NcICAuPX7G","pvgjS0ao3l",
+"IRh48Kr8ys","JRJQBJIqXi","RxrsmMojnP","RzaZA9GXkX","45cIHjeskS","8FmFH64s8N","qUJMdblLA9","POUYSJXljW","PYBf4fLNg8","tvdkDtvdkD",
+"iqv4kXflUq","tjQxs5VZjS","9iGoT8RCUA","KsjRKpFrrl","lweGyfFDrJ","KASQ8XyPZN","bZLvS2TRI7","BpYhVCIShG","DG4sTLDk6f","C2Irc5Namm",
+"JIqXimX2GE","s93MllCMxy","lsQGojzUqR","xReecAXpwE","n8pJ9lj07Q","tAOsruZPqg","fLNg8ZhwG1","OxWIHxReec","Mm8sis93Ml","ZUnqtjiVBP",
+"iB08laFFss","dQ58614FLR","K20wK07n1c","VIlwPbgJAz","580YD8RCUA","I7p2anFqik","dQ5865iGN5","TXQ0ZzY1GY","taOXKYh1hF","JKWYRx3LDe",
+"QClRL9eoRc","ksJbyB3qem","0ao3ld7vjM","DcpWBjiVBP","jS1ajlj07Q","prNT6DLhzM","AgJHQguMb8","oVQp6fcJOy","D6rBydQ586","oGu6xVNCPd",
+"7fsYMZUnqt","4QMc9W3VFH","Kr8ys1LB1L","580YDuupzk","pT8wuNo0Qb","Y1mC0BbwgA","QWxoT7hyVv","djsrvv8yFN","RBhp045cIH","TwanolCMxy",
+"QYxC0MmsIo","I7p2avkCHH","Q6Lixl83Ud","4dEz655rfB","tlILtXyPZN","POUYSdQ586","IjTwPulk41","CNHmvCxVEf","1j5L8mX2GE","3otm6AIYUu",
+"lm0pDXyPZN","BGaQYyEfy9","0BmCySmGzv","nFqikfcwDa","he9IA2TRI7","jtn0X9GXkX","TwanoqUJMd","DG4sTtl72W","DcpWBS77LH","lViBvzqH0W",
+"vOqCEDLhzM","LDk6fXyPZN","MaJQsOUYuF","x3LDezmLYD","9rlg9uQIcz","YjB9tDLhzM","MojnP9iGoT","lweGyRsQUq","0PktIxReec","StlDJHRxd8",
+"FLsphBpYhV","e6e4z2hEEU","I7p2ayEfy9","lXFOBi7WMQ","UlU3MReKEW","HRxd8ThjNn","guMb8HzZT8","Oz8yZk85Ae","HRxd87ku1p","W7cTsWMiS3",
+"PYBf44dEz6","JKWYRBFkb8","FLsphix74r","ydG8UFhtgl","yofH3jiVBP","KsjRKReKEW","e6e4zogLgc","qUJMdsqVrf","48cHLFnPFB","RkQkefLNg8",
+"lsQGolj07Q","8U2nUiqv4k","OxWIHK4GS8","S2DfuCK5W7","VLTy6HlUbF","JkzUngjUTu","0KyfscShY2","HP433xReec","FNYIMa00b5","VLTy6lsQGo",
+"lj07QQChxs","yToGWCqqaD","iwzGk9eoRc","hYBCKcShY2","WaWsvvOqCE","RxrsmGv3Fq","HfyNQvkCHH","cL0aEB3qem","Dz1R3Q6hMC","gf8rII7p2a",
+"d85a9yluBx","Yf2Eciqv4k","8TxD7lH1kt","MK07YaL6AJ","3otm67hyVv","QnJ1SVprf2","dpe1vWmadA","dpe1vTa8f6","lm0pD5nmWv","LDk6ffcJOy",
+"ZuDtD1v5hH","uZPqguvf7A","ZuDtDzbIYY","JIqXijeskS","WreyPZv7z0","WaWsv16lHc","QssNCRBhp0","8cVD3yofH3","oQ87rnnP8o","VjCZqh1zcH",
+"uPX7GyofH3","CqqaDcmXIX","mX2GEpv0i7","yofH3lViBv","tlILtSjskQ","QbxXcs93Ml","X6Pin5Mg9r","K20wKCp3mZ","Waim6O3iyQ","RsQUqwiHrZ",
+"lViBvD6rBy","QChxshi5X7","MK07YzFgtB","gjUTuwDajX","NhXdu7fsYM","kZANmqaofN","uLtKsAgJHQ","FwEJzIKxdL","qaofN0h1b1","nFqikS2Dfu",
+"S77LHqaofN","sx5Gl8xEKz","fLNg87hyVv","x3LDeEdBKc","HzZT8Kr8ys","KsjRKLDk6f","FwEJzMK07Y","uZPqgjtn0X","9eoRct59lR","xReecK20wK",
+"VIlwPOxWIH","FNYIMuN6r3","NOHszwDajX","aFFssLewvM","7ku1pGv3Fq","M6qcGZuDtD","FLsphOUqFM","8FmFHi3pyd","soy9tWPmlx","fmIK1SmGzv",
+"Q6LixL7cGc","Zv7z0pWiOs","M6qcGGWqqX","hUTw79rlg9","t98iWgjUTu","JIqXi8TxD7","SWfou1LB1L","In3NSYw2oU","gdQsSVNCPd","QWxoTNo0Qb",
+"aFFsssx5Gl","uJScXYjB9t","hYBCKIKxdL","i3pyd4QMc9","ciuWzFjHXR","CNHmvfaHir","Yw2oUdpe1v","KASQ8nlaBy","guMb8dmoS7","AOgEebgJAz",
+"EOE1o1LB1L","07n1cTa8f6","DcpWBcmXIX","CdyBVMojnP","9GXkXXflUq","FnPFByvOMI","faHirQbxXc","07n1c8xEKz","5VZjSMojnP","ciuWz29QAz",
+"GSQwjMGlTF","tl72W7fKYU","1j5L8Ss0Zu","hUTw7K20wK","JRJQBbZLvS","aDGtSK20wK","8xEKzix74r","Fhtgli3pyd","6AFT0F6PT2","yToGWt59lR",
+"a00b5CK5W7","1j5L8AOgEe","VBjhzrhl0J","C2IrcoQ87r","blLA9t98iW","BGaQY6q6L9","2Yz7EaFFss","guMb8RkQke","4QMc98RCUA","StlDJRsQUq",
+"NOHsz07n1c","VerEAogLgc","7fKYUHRxd8","tuDySiwzGk","cQOnvsx5Gl","FGzgpFxX9q","nnP8oAmdQd","oQ87riwzGk","iwzGk9iGoT","hE1Ql618Di",
+"0KyfsfFDrJ","CqqaDpmeCd","lsQGoydG8U","uPX7GzFgtB","e6e4z1LB1L","gjUTud85a9","i3pydwDajX","TXQ0ZHlUbF","LbRTH5ZaEz","Kr8ysuPX7G",
+"5ZaEz48cHL","IjTwPtuDyS","VIlwPW3VFH","t98iWU3yw5","dQ5868U2nU","jtn0XUlU3M","JKWYRIn3NS","uN6r3LbRTH","DcpWBguMb8","k85AePOUYS",
+"5IhmG0Kyfs","3otm6W3VFH","aL6AJIn3NS","9rlg9MGlTF","bgJAzZzJHW","lkMUAGv3Fq","brhlQNOHsz","JkzUnBFkb8","RpBQmVjCZq","CxVEf9rlg9",
+"TXQ0ZJIqXi","oVQp6M6qcG","wDajX5ZaEz","CdyBVM6qcG","s93MlBGaQY","NAFuwn8pJ9","BGaQYEdBKc","Ss0Zu7hyVv","EoToP5iGN5","aez9ycShY2",
+"MojnPoQ87r","i7WMQNcICA","tuDySgf8rI","aez9yNOHsz","uvf7AzmLYD","PYBf4jtn0X","Mm8si8FmFH","cShY2lXFOB","uPX7Gi3pyd","tl72WZhwG1",
+"JJs5mWDVWJ","FxX9qDG4sT","bZLvSjzUqR","lkMUAtvdkD","sx5GlWaim6","AkKTktlILt","b29RJAmdQd","jzUqRtAOsr","RpBQmnlaBy","bgJAzx3LDe",
+"VerEAAXpwE","hYBCKuJScX","jiVBPFLsph","fFDrJHfyNQ","WreyP0YAGH","tl72WStlDJ","jtn0XjeskS","HP433taOXK","s93Mlv8yFN","ru4UGCfgr3",
+"3otm6faHir","WPmlxm4bxU","ZJTXHHRxd8","0Wr5yuLtKs","lCMxyBGaQY","Vprf2d7vjM","pWiOsChuy3","EdBKc2TRI7","9XyT9QnJ1S","i7WMQMojnP",
+"atef2t59lR","aDGtSZzJHW","cShY2iwzGk","m4bxUzbIYY","POUYSpT8wu","M3zXL29QAz","Pb1pa0h1b1","F6PT2nlaBy","jS1ajZzJHW","aL6AJkB5nP",
+"07n1cciuWz","tuDySrKDLJ","DQimpCqqaD","LbRTHdQ586","Cp3mZMm8si","0YAGHKr8ys","VjCZqn1pmO","CqqaDru4UG","Ul4a1AmdQd","7fsYMwiHrZ",
+"y94nwZJTXH","zFgtBMm8si","8U2nUUlU3M","QChxsQYxC0","9eoRcKZamH","ksJbyRkQke","Q6LixoVQp6","VLTy6StlDJ","07n1co8Uyd","oGu6xAIYUu",
+"5IhmG8FmFH","YjB9tcQOnv","580YDPb1pa","9GXkXtaOXK","MojnPzz4ZU","uJScXiB08l","WaWsvhYBCK","GSQwjDQimp","djsrv2DREs","Mkgy8jzUqR",
+"2Yz7EsqVrf","CqqaD9rlg9","OHaBzsqVrf","jfREuJIqXi","uoStwRmDcr","kB5nPTXQ0Z","Vprf20YAGH","7lUXZyluBx","LbRTH0BmCy","14FLRd85a9",
+"FjHXRhe9IA","4W0TlfmIK1","kB5nPG1RhS","X6PinXyPZN","4dEz6NcICA","W7cTsGWqqX","5Mg9r2DREs","MaJQsuLtKs","uQIczS77LH","CdyBVru4UG",
+"pmeCdv2eC3","WPmlxqUJMd","CdyBVhi5X7","AIYUuvOqCE","LDk6fC2Irc","4W0Tln8pJ9","AkKTka00b5","5Mg9rIn3NS","d85a9uLtKs","ZuDtDpmeCd",
+"Twano1j5L8","uAWyp8xEKz","8U2nUaL6AJ","WaWsvHfyNQ","MaJQsL7cGc","Waim6lm0pD","AXpwEwDajX","BGaQYUmaEv","yofH3RBhp0","FnPFBoQ87r",
+"ydG8UFxX9q","W7cTs4W0Tl","IKxdLaez9y","h1zcHqaofN","AIYUukB5nP","HfyNQvLsmS","5drc6MmKGJ","FNYIM0Wr5y","pvgjSXflUq","8TxD7Ul4a1",
+"WmadAjeskS","0KyfsbrhlQ","n1pmOiwzGk","3otm6KASQ8","v1Hln55rfB","sx5Gl55rfB","VNCPdtlILt","Pb1paNhXdu","MK07YfFDrJ","n1pmOBpYhV",
+"0h1b1I7p2a","FPfSEDG4sT","S77LHMGlTF","M3zXLDLhzM","hE1QltjQxs","ulk41zQt6Q","7lUXZNxx9V","Zv7z0TXQ0Z","QChxsAmdQd","pAhR1hYBCK",
+"fLNg8iwzGk","l83Ud9rlg9","jS1aj9y4lw","XflUql83Ud","WDVWJpvgjS","RsQUqrhl0J","2ZHdk9eoRc","G1RhS3otm6","azIWpQChxs","CNHmvhUTw7",
+"RxrsmDG4sT","8FmFHQChxs","i7WMQ24ARF","Uvlv40ao3l","K4GS8aFFss","guMb8qUJMd","uTacxOHaBz","QworuI7p2a","MmKGJyToGW","qQxHP9XyT9",
+"QnJ1SazIWp","LDk6f7X3uy","5VZjS2Nslm","GrDg7a00b5","d85a9J2mQi","ZhwG1L7cGc","uTacxWaim6","vLsmSGSQwj","Y1mC04QMc9","lCMxyQ6hMC",
+"pAhR1pWiOs","FxX9qru4UG","GWqqXVBjhz","MmsIoW7cTs","2NslmHfyNQ","Ta8f6e6e4z","Ul4a1gf8rI","XyPZNZ4I1v","blLA955rfB","NAFuw8FmFH",
+"D6rBypAhR1","vOqCEGWqqX","uoStwTa8f6","HfyNQi7WMQ","5nmWvBFkb8","JJs5msuY4x","QworunlaBy","Cfgr3TCgPp","aL6AJZuDtD","07n1crKDLJ",
+"FwEJzYw2oU","guMb8618Di","GrDg7hSSvQ","fcJOyQnJ1S","S77LHjfREu","FnPFBn1pmO","d7vjMRzaZA","Mkgy8x3LDe","BCxeCWreyP","fmIK1QnJ1S",
+"G1RhSFcWrW","tuDySVLTy6","cQOnvd7vjM","uPX7GuoStw","UmaEvHP433","Vprf2C2Irc","lH1ktCfgr3","lXFOBOUYuF","jeskSlViBv","gtCA5MK07Y",
+"pvgjSi3pyd","uZPqgWMiS3","OUYuF7fKYU","OUYuFEoToP","BpYhVWMiS3","14FLRfcwDa","pAhR1fcJOy","he9IACNHmv","ECMvUjS1aj","IRh48mX2GE",
+"HRxd8qaofN","dpe1vzmLYD","h1zcHTXQ0Z","yEfy9xXTI4","ZUnqtjfREu","7hyVvKASQ8","GSQwj7X3uy","0ao3l8hJdt","JXljWXflUq","U3yw5fqypy",
+"ciuWz8FmFH","lj07QStlDJ","5ZaEz5ZaEz","i7WMQIRh48","9eoRczqH0W","NcICAAIYUu","gIYvExReec","7lUXZ2TRI7","HzZT8RsQUq","HlUbF7X3uy",
+"nnP8oOxWIH","iwzGkhSSvQ","8FmFHjSjS3","o8UydBCxeC","LewvMXflUq","7Ow5CpiJSk","D6rByFNYIM","FwEJzo8Uyd","9rlg91j5L8","xReecoVQp6",
+"sqVrf9eoRc","9eoRc0BmCy","HlUbFJ2mQi","t59lRhUTw7","atef2qQxHP","ix74rECMvU","B3qemjtn0X","bZLvSB3qem","x3LDekZANm","iB08l7hyVv",
+"MmsIoFPfSE","BCxeCyofH3","HlUbFJkzUn","uZPqgo8Uyd","DG4sTxXTI4","NAFuw9GXkX","ogLgcX6Pin","ulk41VjCZq","lXFOBPOUYS","Yh1hFCK5W7",
+"jzUqRG1RhS","mz8gx580YD","FVMxoVIlwP","NOHszDz1R3","XyPZNGv3Fq","QYxC0P6bcg","uZPqg5VZjS","5iGN5pAhR1","QClRLJ2mQi","uQIczZJTXH",
+"BFkb8yluBx","Cp3mZHP433","zFgtBhE1Ql","AgJHQReKEW","Ul4a1Vprf2","16lHclH1kt","tuDySFhtgl","In3NSWaWsv","QworuU3yw5","lj07Qy94nw",
+"4W0TlGXdoH","v2eC30Kyfs","guMb8TCgPp","5drc64dEz6","KZamHpv0i7","WMiS3VjCZq","jfREulViBv","3otm6No0Qb","SWfouksJby","ReKEWBpYhV",
+"9rlg9OHaBz","WPmlxBGaQY","M6qcGlpF6W","29QAzh1zcH","iwzGkdmoS7","v2eC3UlU3M","jfREuZzJHW","NAFuwBbwgA","suY4x55rfB","bZLvSmX2GE",
+"SjskQru4UG","e6e4zRsQUq","GrDg7MaJQs","7fKYUChuy3","Ss0ZuprNT6","WPmlxcmXIX","ciuWzYw2oU","ReKEWfaHir","rz7Ut5ZaEz","a00b5gIYvE",
+"JIqXicmXIX","CNHmvGSQwj","0h1b1JkzUn","IKxdLru4UG","sqVrfbgJAz","RxrsmkZANm","Gv3Fq7ku1p","JXljWOUqFM","Yw2oU580YD","faHirJJs5m",
+"FFDuiLDk6f","7fKYUjtn0X","fcJOyMK07Y","0BmCyNOHsz","4QMc9YOfrY","oQ87rRkQke","Zv7z0lH1kt","tuDyS8FmFH","0Wr5ypWiOs","ReKEW7fsYM",
+"iKqhrWmadA","Ul4a1TCgPp","qQxHPnnP8o","t98iWMezSW","xReeclCMxy","uoStwOHaBz","X6PinGSQwj","uJScXBpYhV","rhl0JqQxHP","D6rByzqH0W",
+"xciqp7Ow5C","iKqhrlViBv","hE1QlFLsph","hi5X78hJdt","Mm8siuTacx","zz4ZUQnJ1S","IjTwPpFrrl","Ss0ZuokgRi","b29RJeuZA5","pWiOssuY4x",
+"X6PinVIlwP","QYxC05IhmG","fFDrJD6rBy","RmDcrt59lR","UmaEv64s8N","MmKGJ5nmWv","b29RJ0BmCy","d7vjM7hyVv","Pb1pawiHrZ","euZA5jtn0X",
+"rz7UtNo0Qb","fLNg8IKxdL","NAFuwReKEW","cShY2WMiS3","zFgtBfqypy","HRxd8rz7Ut","3weIFnnP8o","nFqik0PktI","64s8N2ZHdk","Zv7z0zz4ZU",
+"VLTy62ZHdk","lsQGoJKWYR","QWxoTQ6hMC","hSSvQNxx9V","7lUXZwDajX","FGzgpaL6AJ","IjTwPTXQ0Z","lsQGozHF1q","Oz8yZaL6AJ","VNCPdMkgy8",
+"CK5W7F6PT2","ydG8Uiqv4k","RxrsmSs0Zu","7fsYMPb1pa","WmadAgtCA5","2hEEUv8yFN","jeskSFhtgl","sx5GlSjskQ","KsjRKHzZT8","618DiL7cGc",
+"CIShGpT8wu","uAWypHlUbF","PYBf4tuDyS","14FLR5IhmG","GSQwjbrhlQ","ciuWzReKEW","14FLRwDajX","WPmlxgtCA5","O3iyQZhwG1","7Ow5CuoStw",
+"RkQke0BmCy","dQ586KASQ8","ZUnqtX6Pin","OxWIHMmKGJ","IjTwPQWxoT","sqVrfcQOnv","4dEz6zmLYD","fmIK1BGaQY","aFFssNhXdu","pmeCdFNYIM",
+"zz4ZUwDajX","zbIYY7Ow5C","WaWsvyluBx","lCMxyjtn0X","VerEACIShG","dpe1vn8pJ9","oVQp607n1c","pv0i7SbRYy","oGu6xWaWsv","Z4I1vjfREu",
+"RpBQm9y4lw","ZhwG1y94nw","sx5Glzz4ZU","VNCPdLbRTH","AmdQdwDajX","OHaBzIn3NS","l83UdcShY2","VBjhzlH1kt","WMiS3TCgPp","yvOMI6AFT0",
+"t59lRYw2oU","9GXkXReKEW","okgRihE1Ql","FNYIMcQOnv","MojnPBpYhV","ciuWzdQ586","zQt6QZJTXH","zqH0WqQxHP","AXpwE48cHL","he9IAYf2Ec",
+"9eoRcyvOMI","AIYUuaFFss","y94nwtvdkD","HP433BpYhV","pWiOsRxrsm","FVMxo5ZaEz","AmdQd5iGN5","S2DfutlILt","Ul4a1DcpWB","Q6LixSs0Zu",
+"9y4lwU3yw5","oVQp6nFqik","W3VFHMm8si","JIqXiHlUbF","zQt6QXflUq","QWxoTru4UG","In3NSfcwDa","nFqik9XyT9","QbxXcvLsmS","QssNCRsQUq",
+"ksJbyjSjS3","gtCA5yToGW","ciuWz7X3uy","Yh1hFM6qcG","lweGyMezSW","dQ586QYxC0","Gv3FqgIYvE","FnPFBYf2Ec","xXTI4pv0i7","MmKGJQClRL",
+"lCMxyCfgr3","NhXduatef2","AIYUuOxWIH","BGaQYm4bxU","mX2GES77LH","RsQUquoStw","JkzUnvLsmS","blLA9MGlTF","MmKGJOxWIH","zFgtBAOgEe",
+"euZA5yEfy9","cmXIXpWiOs","S77LHMaJQs","qUJMdJRJQB","oQ87rfaHir","0h1b1uvf7A","GSQwj5nmWv","0MR5XTCgPp","t98iWMGlTF","WPmlxsx5Gl",
+"kZANm1LB1L","IjTwP0Kyfs","rz7UtfcwDa","ulk41wiHrZ","Cfgr3ThjNn","qQxHPFLsph","B3qemhE1Ql","tlILtlj07Q","DQimp2hEEU","TCgPpRpBQm",
+"07n1czbIYY","QWxoTJKWYR","NcICAiKqhr","8TxD74dEz6","tuDySiB08l","VBjhz8TxD7","pT8wu2Nslm","SjskQuPX7G","TwanoUl4a1","5drc6fFDrJ",
+"lXFOBwiHrZ","qaofNIBe8k","uN6r3k85Ae","CqqaD9iGoT","8hJdtlH1kt","fmIK16q6L9","xciqpS77LH","WMiS3fcJOy","7ku1plXFOB","m4bxUZuDtD",
+"ZzJHW6AFT0","sqVrfRzaZA","aFFssjtn0X","Pb1paNOHsz","kB5nPFnPFB","DQimppAhR1","7ku1piwzGk","jSjS3AOgEe","b29RJRkQke","CxVEfzQt6Q",
+"aDGtSokgRi","I7p2aQworu","7X3uyfFDrJ","gjUTuqaofN","WMiS3W3VFH","bgJAzIn3NS","14FLRoQ87r","XyPZNNOHsz","CIShGhi5X7","IKxdLMezSW",
+"5VZjSOz8yZ","qQxHP0Kyfs","bZLvSXflUq","0h1b1CNHmv","AXpwEFhtgl","oQ87rDQimp","DcpWBOxWIH","pAhR1Fhtgl","QbxXcfcwDa","hYBCKbZLvS",
+"fLNg8AgJHQ","GWqqX0PktI","K20wKsoy9t","PYBf429QAz","FwEJzGSQwj","4W0TlWMiS3","Oz8yZe6e4z","iqv4kW7cTs","QChxspT8wu","64s8NAkKTk",
+"ZuDtDYOfrY","QworucL0aE","RBhp0nFqik","3weIFjtn0X","CIShGDLhzM","9iGoT29QAz","M6qcGQYxC0","MaJQsjS1aj","tuDySOz8yZ","t98iWuoStw",
+"cL0aEWPmlx","djsrvtvdkD","CdyBVaL6AJ","8RCUAG1RhS","JkzUn8hJdt","UlU3M6q6L9","jfREulH1kt","sx5Gl0MR5X","9eoRcoGu6x","JRJQBRxrsm",
+"FLsph5IhmG","fcwDaP6bcg","aFFsso8Uyd","blLA9Mkgy8","0MR5XuJScX","2hEEURsQUq","kZANm0YAGH","zFgtBoVQp6","AkKTkCfgr3","ix74r5Mg9r",
+"Yw2oUM6qcG","AXpwExciqp","Ul4a1FFDui","5Mg9rUmaEv","AkKTkWaWsv","LewvMSmGzv","faHirVLTy6","ZhwG1uLtKs","0PktIBCxeC","Oz8yZzHF1q",
+"oVQp6S77LH","NAFuwRsQUq","brhlQChuy3","W3VFHDG4sT","v2eC3JKWYR","uupzkkB5nP","VLTy6pWiOs","WMiS37fsYM","rhl0J0h1b1","FLsphiwzGk",
+"9rlg9B3qem","M3zXLlsQGo","djsrvYw2oU","vLsmSC2Irc","TCgPplCMxy","oGu6xDcpWB","Kr8ysuLtKs","zz4ZUL7cGc","CdyBV7fKYU","FGzgp0h1b1",
+"6AFT0kZANm","WPmlxeuZA5","9XyT9Ss0Zu","YOfrYokgRi","Y1mC0gf8rI","gtCA5gjUTu","pmeCdrhl0J","o8UydEOE1o","uZPqgOUqFM","7X3uygf8rI",
+"9iGoTjSjS3","sqVrfThjNn","ZJTXHqQxHP","zQt6QPb1pa","Yw2oUJ2mQi","WmadAQssNC","Uvlv4VjCZq","uAWypyvOMI","WmadAlweGy","RzaZAFnPFB",
+"hYBCKrhl0J","Qworuv8yFN","ciuWzIjTwP","Waim6rz7Ut","HzZT8I7p2a","uN6r3QnJ1S","SbRYycShY2","v2eC3uupzk","8TxD7BpYhV","jSjS3l83Ud",
+"QChxsDLhzM","djsrvuN6r3","kZANmBpYhV","MojnPrKDLJ","iqv4k14FLR","WaWsv1LB1L","uvf7AbZLvS","QChxsqQxHP","CqqaDqaofN","WmadA6AFT0",
+"NOHszoGu6x","n8pJ9RmDcr","9iGoT14FLR","S77LHHfyNQ","yvOMIKr8ys","kZANm1j5L8","FnPFBuupzk","FxX9qIRh48","24ARFXyPZN","rKDLJrKDLJ",
+"LbRTHmX2GE","ZzJHW8TxD7","tjQxsRzaZA","pFrrl9GXkX","YOfrYciuWz","dQ586QClRL","Mm8siBGaQY","OUqFMRBhp0","TCgPpOxWIH","5NammWmadA",
+"soy9tMmsIo","wDajX5IhmG","FhtglZuDtD","EdBKcix74r","iB08lYh1hF","EoToPyluBx","ksJby7Ow5C","tl72WNcICA","JRJQBtAOsr","AmdQd580YD",
+"ogLgc7fsYM","kB5nPPOUYS","HzZT8gIYvE","1LB1LQnJ1S","VNCPdoVQp6","5iGN5SmGzv","2Nslm0PktI","he9IAOxWIH","lm0pDtAOsr","lpF6WIRh48",
+"qaofNlm0pD","2ZHdka00b5","QClRLNcICA","ix74rqUJMd","LewvMhe9IA","b29RJiB08l","zHF1qjS1aj","oGu6xG1RhS","8cVD3vkCHH","Nxx9VJRJQB",
+"e6e4zVjCZq","cQOnv9GXkX","yEfy9Cfgr3","m4bxUhSSvQ","Cfgr3ydG8U","IKxdLhUTw7","Q6hMCVIlwP","OUqFM6q6L9","fqypye6e4z","t59lRB3qem",
+"M3zXLIjTwP","zY1GYG1RhS","Yw2oUzFgtB","9GXkXDz1R3","iwzGkwDajX","VLTy6cmXIX","Ta8f6B3qem","Waim6euZA5","gdQsSW3VFH","yluBx5Namm",
+"2Yz7EPYBf4","F6PT2azIWp","jeskSlm0pD","Mm8siTwano","DQimphi5X7","OxWIHZ4I1v","FwEJz9eoRc","FGzgpEoToP","KASQ8hSSvQ","piJSkkZANm",
+"UlU3MAkKTk","FxX9qNcICA","atef26AFT0","Cp3mZNhXdu","Yf2EcciuWz","X6PinlH1kt","W3VFH5Namm","Chuy3s4786","uoStw618Di","guMb8Waim6",
+"Z4I1vWDVWJ","uoStwUl4a1","Cfgr35IhmG","MaJQsJIqXi","jSjS37fKYU","Nxx9VReKEW","ix74rt98iW","6q6L9FNYIM","tAOsrECMvU","ZzJHWJkzUn",
+"0MR5X24ARF","WmadAWaWsv","FhtglK20wK","Yf2EcWaWsv","StlDJoGu6x","EOE1oWaim6","In3NSI7p2a","uQIcz0Wr5y","UmaEvcmXIX","oGu6xZuDtD",
+"l83UdKsjRK","55rfBCdyBV","hUTw7MezSW","P6bcgFFDui","8TxD7prNT6","5iGN58cVD3","uPX7GYh1hF","iB08lDcpWB","rz7UtQ6Lix","piJSk7ku1p",
+"o8UyddQ586","uoStwpWiOs","wDajXAOgEe","hE1QlciuWz","K4GS8uPX7G","BFkb8RzaZA","Uvlv464s8N","AmdQdZzJHW","StlDJzHF1q","DLhzMAgJHQ",
+"VIlwPFjHXR","qQxHPiKqhr","pv0i7ulk41","sx5GlPYBf4","P6bcgo8Uyd","ix74r2Yz7E","lj07QAmdQd","WPmlxAIYUu","ZhwG1hi5X7","ZuDtDDz1R3",
+"O3iyQuPX7G","ZuDtDMaJQs","4dEz65Drn0","jeskS48cHL","SbRYyn8pJ9","uupzkK4GS8","he9IA8RCUA","AOgEes7Mxk","DcpWBLewvM","lpF6WNAFuw",
+"XflUqtl72W","pFrrlRkQke","3otm6GrDg7","s7MxkRsQUq","1v5hH45cIH","Y1mC0fqypy","ix74rAkKTk","CK5W7HP433","lsQGoFcWrW","vLsmSjiVBP",
+"45cIHfqypy","euZA5uAWyp","9rlg99XyT9","Vprf28U2nU","qUJMdHP433","RmDcr8TxD7","0YAGHsx5Gl","IBe8kyluBx","JkzUnjzUqR","MmKGJksJby",
+"DcpWB9iGoT","ZhwG1VBjhz","jeskSG1RhS","qaofN0ao3l","aDGtSn8pJ9","cQOnvZv7z0","cQOnvhUTw7","0Kyfs5Namm","aez9yjSjS3","GXdoHYh1hF",
+"48cHLhSSvQ","Y1mC0FVMxo","Q6hMCtuDyS","8xEKzwDajX","fmIK1580YD","nlaBywDajX","yvOMINAFuw","oGu6xAgJHQ","i3pydCp3mZ","uvf7AZv7z0",
+"0MR5XZUnqt","n8pJ9lweGy","pWiOs0BmCy","48cHL7lUXZ","3otm6i7WMQ","8xEKzNo0Qb","TXQ0Z8cVD3","fcwDaQnJ1S","HP433ciuWz","jS1ajRmDcr",
+"euZA5taOXK","580YDNcICA","K20wKa00b5","IKxdLGXdoH","HlUbFjeskS","jeskSBbwgA","i7WMQyluBx","QClRLTCgPp","yvOMIFcWrW","uLtKs0PktI",
+"7ku1pb29RJ","K4GS8QChxs","SjskQcmXIX","P6bcgi3pyd","wiHrZtjQxs","t59lRsx5Gl","48cHL7ku1p","618DijeskS","14FLRgf8rI","CxVEfCqqaD",
+"BpYhVKsjRK","lj07Q2Nslm","ZzJHWwiHrZ","aL6AJjiVBP","Kr8ysDLhzM","Nxx9VQWxoT","hE1QlVNCPd","cShY2MaJQs","Q6LixChuy3","nlaByVLTy6",
+"l83UdnlaBy","FNYIMjS1aj","MK07YS77LH","6AFT0aDGtS","7X3uy6AFT0","WDVWJTCgPp","RpBQmBpYhV","yEfy9zz4ZU","3weIFOUYuF","2hEEUFhtgl",
+"uupzk3weIF","WMiS3Nxx9V","BpYhVprNT6","vLsmSzbIYY","gf8rIRpBQm","0h1b1i3pyd","1v5hHyvOMI","AmdQduPX7G","soy9the9IA","dQ586J2mQi",
+"24ARFJIqXi","azIWpThjNn","azIWpQYxC0","t59lRFcWrW","aDGtShe9IA","jtn0XgtCA5","lj07Qix74r","aDGtSciuWz","taOXKZuDtD","d85a9Nxx9V",
+"taOXKMK07Y","8cVD355rfB","wiHrZW7cTs","Kr8ysNhXdu","iqv4k8U2nU","7X3uyzbIYY","IjTwP7fsYM","OxWIHdjsrv","8hJdthUTw7","DG4sT1v5hH",
+"jSjS3QWxoT","In3NSaFFss","Ul4a1iqv4k","aL6AJ1LB1L","S77LHDLhzM","4dEz69rlg9","FGzgpQssNC","Q6hMCXyPZN","qUJMdlj07Q","Twano5drc6",
+"Q6LixNxx9V","XyPZNuupzk","t98iWzmLYD","AgJHQO3iyQ","hUTw7JXljW","vLsmS55rfB","vLsmSrKDLJ","pWiOsUmaEv","G1RhSs7Mxk","ZuDtDsoy9t",
+"rhl0JnlaBy","jS1ajzY1GY","8TxD7y94nw","Oz8yZ5Drn0","faHiroGu6x","Q6LixWDVWJ","cmXIX64s8N","uLtKsXyPZN","h1zcHtjQxs","2TRI7jtn0X",
+"Cfgr3WreyP","y94nwbZLvS","oGu6xSs0Zu","VerEAtl72W","ZhwG19iGoT","atef2fFDrJ","lkMUAvkCHH","brhlQW7cTs","IjTwPi3pyd","0YAGHpWiOs",
+"XyPZN0YAGH","uLtKsyEfy9","TCgPpAgJHQ","Qworuzz4ZU","bZLvSWmadA","yofH3mz8gx","1j5L8BbwgA","uZPqgBbwgA","mz8gxUvlv4","lXFOBzY1GY",
+"HlUbFQChxs","lm0pDUvlv4","RmDcrk85Ae","CqqaDiqv4k","GWqqXUlU3M","aez9yjtn0X","uoStw7lUXZ","FLsphZJTXH","gf8rIOUqFM","blLA9v1Hln",
+"azIWpCK5W7","QbxXcI7p2a","DQimp9eoRc","MezSW5VZjS","IRh48Ul4a1","0ao3liB08l","vkCHHVNCPd","n8pJ9ydG8U","GrDg79XyT9","DcpWBvkCHH",
+"JkzUnyluBx","Qworusx5Gl","WaWsvVLTy6","WaWsv2ZHdk","lsQGov2eC3","UmaEv24ARF","6AFT0uAWyp","tAOsrCIShG","rhl0JvOqCE","WDVWJDLhzM",
+"SbRYyNhXdu","gf8rIEOE1o","t59lRMm8si","dhSuHlm0pD","14FLRQ6Lix","iwzGkAXpwE","bZLvS1j5L8","cL0aEPOUYS","7ku1p9rlg9","BFkb8MGlTF",
+"gf8rI9eoRc","cShY2jeskS","mz8gxGWqqX","zqH0WlXFOB","ReKEWVjCZq","gdQsSUlU3M","2hEEUsqVrf","MmKGJRkQke","LbRTHMmKGJ","pAhR19GXkX",
+"AkKTkNo0Qb","FcWrW7fKYU","FcWrWfmIK1","fcJOyIKxdL","JKWYRokgRi","2NslmBpYhV","jzUqRJKWYR","8TxD7Q6hMC","yluBxMmsIo","zQt6QuLtKs",
+"zqH0WMmKGJ","NhXdugf8rI","x3LDeGSQwj","LDk6fB3qem","vkCHHS2Dfu","SbRYywiHrZ","8hJdt2hEEU","K20wK3weIF","rhl0JWmadA","580YDQChxs",
+"618DiJ2mQi","hUTw7fmIK1","yofH3zFgtB","AkKTktaOXK","suY4xaez9y","oVQp6MGlTF","JIqXiKsjRK","lH1kt8xEKz","a00b5CxVEf","KZamHvkCHH",
+"MmsIoKsjRK","qaofNpmeCd","KASQ8v2eC3","piJSkSmGzv","gf8rIe6e4z","7X3uyFxX9q","vOqCEuTacx","v1HlnKr8ys","VIlwPXyPZN","aFFssHlUbF",
+"Gv3FqZUnqt","BFkb8QChxs","7X3uyVBjhz","KZamHtaOXK","ReKEWWMiS3","X6PinazIWp","zbIYY580YD","Cfgr3o8Uyd","1v5hHYh1hF","PYBf4CK5W7",
+"9eoRcFPfSE","uN6r3lViBv","tjQxsyofH3","Yf2EcMkgy8","Dz1R3VerEA","EoToPZuDtD","CK5W78xEKz","piJSkNcICA","WDVWJ0PktI","FVMxoTCgPp",
+"djsrv0Kyfs","lH1kthE1Ql","rKDLJdhSuH","MmsIoS77LH","v2eC39rlg9","vOqCE5drc6","jzUqRd85a9","HlUbF8TxD7","LDk6fni2v1","jS1ajhYBCK",
+"SmGzvix74r","fcwDa2ZHdk","8FmFHGXdoH","DcpWBxReec","GrDg7Y1mC0","7fsYMqQxHP","jSjS3DcpWB","Uvlv4FwEJz","8cVD32Yz7E","zHF1q5iGN5",
+"ReKEWSs0Zu","7fKYUTXQ0Z","LewvMcL0aE","RpBQmx3LDe","uAWyphSSvQ","Gv3FqtvdkD","gjUTuaDGtS","2hEEURACuj","zY1GYuvf7A","JJs5mv2eC3",
+"Q6LixSbRYy","M3zXLWMiS3","lXFOBlCMxy","HP433dpe1v","jiVBPWMiS3","FwEJz2Nslm","0YAGHKASQ8","ZzJHW5drc6","yEfy95Drn0","uvf7AQ6Lix",
+"bgJAzGrDg7","sx5GlSbRYy","CqqaDhe9IA","FcWrWcShY2","lkMUAaFFss","Oz8yZEOE1o","Kr8ysAmdQd","RzaZAZUnqt","DcpWB14FLR","AkKTkZ4I1v",
+"24ARF9iGoT","5nmWvuTacx","wiHrZrhl0J","K20wKQYxC0","W3VFHMkgy8","1v5hHIKxdL","In3NSxReec","gf8rIpFrrl","fFDrJFNYIM","uPX7G9iGoT",
+"sqVrfxReec","suY4x7Ow5C","JJs5mL7cGc","jeskSD6rBy","nnP8od85a9","x3LDenFqik","M6qcGU3yw5","4dEz6vkCHH","soy9tni2v1","zz4ZUVIlwP",
+"hYBCKYh1hF","LbRTHlj07Q","HRxd8jeskS","fLNg8FjHXR","kB5nPfaHir","gtCA5BbwgA","n1pmOydG8U","s4786In3NS","t59lR3otm6","8hJdtuJScX",
+"a00b5dQ586","pAhR1SjskQ","iqv4klH1kt","QbxXcjzUqR","xciqpyluBx","fLNg8B3qem","ZhwG12DREs","EdBKclCMxy","dmoS7POUYS","lH1ktFPfSE",
+"3otm6yluBx","OUYuFF6PT2","WDVWJNhXdu","GSQwjLDk6f","FjHXRwiHrZ","7Ow5C618Di","3weIFFPfSE","DQimp29QAz","CK5W748cHL","suY4xzFgtB",
+"MaJQsbZLvS","1v5hHCxVEf","WDVWJDz1R3","he9IAcQOnv","SbRYyTa8f6","uJScX8TxD7","FcWrWFcWrW","BFkb8Q6hMC","djsrvksJby","LewvMO3iyQ",
+"lkMUAcmXIX","prNT6K20wK","LDk6fpAhR1","qQxHP8cVD3","9y4lwWPmlx","iwzGkL7cGc","tl72WOz8yZ","uPX7GMm8si","KsjRKFhtgl","2Yz7E8TxD7",
+"jS1ajXyPZN","zFgtBvLsmS","RpBQmNcICA","rz7UtO3iyQ","xXTI4XyPZN","lCMxyCK5W7","BpYhVIRh48","pWiOs8U2nU","QworuFPfSE","S2DfuB3qem",
+"fqypyv1Hln","FcWrW4QMc9","hYBCKSjskQ","fqypyX6Pin","tuDySGv3Fq","aFFss9XyT9","JXljWMaJQs","ulk41uvf7A","uZPqgTwano","BbwgAqQxHP",
+"okgRiVprf2","StlDJ8cVD3","fFDrJsoy9t","oVQp6pmeCd","Ta8f6EoToP","nFqikDcpWB","45cIHsx5Gl","AOgEeYh1hF","Ta8f6SbRYy","lweGydQ586",
+"zmLYDprNT6","QClRLni2v1","WPmlxRBhp0","JKWYRDcpWB","RpBQmKsjRK","lkMUAhe9IA","yEfy9y94nw","iKqhrQ6Lix","k85Ae5VZjS","B3qemCIShG",
+"uQIczjSjS3","djsrvJ2mQi","qUJMdaFFss","AkKTkpmeCd","FVMxo0YAGH","YOfrYsx5Gl","ydG8UazIWp","atef2mX2GE","mX2GEfcJOy","ulk41CqqaD",
+"5IhmG9eoRc","WMiS3XflUq","K20wKd85a9","jeskS8TxD7","UlU3MaL6AJ","0KyfshYBCK","CdyBVd85a9","guMb8QYxC0","ZzJHWBCxeC","zmLYDfaHir",
+"tuDySK4GS8","64s8Nb29RJ","48cHLi7WMQ","FNYIM5Mg9r","U3yw5tl72W","NAFuwIRh48","d7vjMhi5X7","5IhmGaFFss","i3pyd8TxD7","cQOnvO3iyQ",
+"EOE1o2Yz7E","pvgjSzHF1q","guMb8ECMvU","Q6LixTwano","4W0TlMm8si","s93Mldpe1v","blLA9blLA9","bZLvSAOgEe","gtCA5ogLgc","LDk6fatef2",
+"EOE1ouoStw","I7p2azbIYY","prNT6kZANm","K20wKfqypy","OUYuF1j5L8","HP433DG4sT","ulk41EoToP","UlU3MUl4a1","CqqaDvkCHH","tvdkDe6e4z",
+"8TxD7wiHrZ","lXFOBQChxs","Mm8siNo0Qb","cQOnvRACuj","nlaByJJs5m","djsrvKsjRK","dQ5867lUXZ","pAhR1fmIK1","Ul4a1pWiOs","5Mg9rSWfou",
+"yEfy9uLtKs","G1RhSciuWz","lViBvFVMxo","KZamHrhl0J","1j5L8EdBKc","uJScXLbRTH","618DinFqik","BGaQY8hJdt","GSQwjTCgPp","3otm6lkMUA",
+"2hEEUgdQsS","djsrvgdQsS","I7p2aQnJ1S","BCxeC9rlg9","X6Pint98iW","0Kyfs5VZjS","uPX7GSbRYy","t59lRfmIK1","RpBQme6e4z","vOqCEi7WMQ",
+"uAWypCK5W7","Zv7z0MaJQs","uvf7AK20wK","rKDLJ0MR5X","QnJ1St98iW","8cVD3HzZT8","64s8NQworu","LDk6fSmGzv","n8pJ9LewvM","pWiOs9XyT9",
+"0BmCy2hEEU","WMiS3lXFOB","WaWsvVBjhz","uLtKs8RCUA","L7cGcuAWyp","jiVBPECMvU","euZA5QbxXc","CNHmvKASQ8","HzZT8n1pmO","P6bcgazIWp",
+"DcpWBtjQxs","RBhp0gdQsS","pmeCdgjUTu","zFgtBjiVBP","7hyVv9eoRc","a00b5qUJMd","618DiS2Dfu","1v5hHBpYhV","580YDpv0i7","oVQp6Ul4a1",
+"8TxD764s8N","Nxx9VpT8wu","OUYuFdhSuH","0MR5XMmKGJ","d7vjMThjNn","14FLRD6rBy","yofH30ao3l","Pb1paoQ87r","AmdQdXyPZN","oVQp6aez9y",
+"14FLRyToGW","5Mg9rMmKGJ","OHaBz07n1c","k85Ae8U2nU","1j5L8aDGtS","ZuDtDCxVEf","No0QbDQimp","KASQ8Chuy3","NcICAoGu6x","pFrrlZUnqt",
+"FjHXRpT8wu","8cVD3ix74r","OUYuFcQOnv","FwEJz0ao3l","nlaByHfyNQ","EOE1ozz4ZU","XyPZNhe9IA","QbxXcm4bxU","lCMxyfqypy","gjUTufcJOy",
+"Waim6MaJQs","K4GS8yToGW","7ku1p48cHL","uAWypEoToP","8xEKzdQ586","xReecOxWIH","sqVrf0ao3l","ECMvUWaWsv","YOfrYvOqCE","WreyPlViBv",
+"sx5GlP6bcg","uAWyp5drc6","DG4sTgIYvE","5VZjSECMvU","brhlQlkMUA","OUYuFMkgy8","Ta8f6jzUqR","8U2nUZhwG1","qaofNaez9y","5iGN5aDGtS",
+"Chuy3OxWIH","BFkb8iqv4k","Gv3Fqd85a9","2hEEUyofH3","7lUXZ6q6L9","DcpWBJRJQB","v8yFN8U2nU","VLTy6i3pyd","GrDg7lViBv","3otm65drc6",
+"SWfou618Di","Vprf27fsYM","aDGtSHP433","vLsmSJKWYR","0h1b1Cfgr3","16lHcNcICA","B3qem64s8N","gdQsSlCMxy","CNHmvTCgPp","b29RJO3iyQ",
+"ZhwG1fqypy","Waim6Yh1hF","X6PinHRxd8","2DREsS2Dfu","xciqpO3iyQ","O3iyQfcJOy","iB08lCdyBV","o8Uyd0h1b1","yofH35iGN5","QssNCgf8rI",
+"BbwgAFVMxo","ZJTXHNOHsz","ydG8UbZLvS","WMiS345cIH","UmaEv5iGN5","aez9yMmKGJ","brhlQyToGW","pv0i7WaWsv","QworuqUJMd","vkCHHgtCA5",
+"lpF6W6AFT0","0BmCysx5Gl","CIShGyluBx","iB08llH1kt","J2mQiyToGW","IBe8k1v5hH","0KyfsQChxs","yvOMIKZamH","14FLRciuWz","uupzkWaim6",
+"NOHszQClRL","nnP8oNo0Qb","Q6LixRkQke","lViBvzz4ZU","Yf2EcSWfou","MGlTFdQ586","ZhwG11j5L8","ogLgcBCxeC","ZuDtDhe9IA","8RCUAM6qcG",
+"4W0Tlo8Uyd","yToGWIKxdL","FFDui45cIH","sx5GlfcJOy","yvOMIOz8yZ","JkzUnHP433","BbwgAogLgc","ZUnqt8xEKz","ulk41ix74r","pWiOsjtn0X",
+"d85a9VLTy6","zQt6QMm8si","8TxD7zFgtB","64s8NZ4I1v","okgRiMkgy8","ksJbyfmIK1","8hJdtk85Ae","aez9yNhXdu","SmGzvM3zXL","uN6r3SWfou",
+"ni2v1C2Irc","PYBf40Wr5y","0MR5XKASQ8","6q6L9ZuDtD","SmGzvCfgr3","CqqaDuTacx","ZuDtDUl4a1","zHF1q55rfB","yvOMIGv3Fq","ni2v1WmadA",
+"O3iyQQWxoT","In3NSYOfrY","v2eC3MezSW","0MR5X0Wr5y","6AFT05Mg9r","lj07QtaOXK","U3yw53weIF","s93MlDG4sT","s93MlyToGW","Ss0ZuWPmlx",
+"AmdQdHP433","NcICAmz8gx","DQimpWaWsv","GSQwjWaWsv","HRxd8uAWyp","GWqqX8FmFH","DcpWB2ZHdk","Qworu2hEEU","d7vjMguMb8","lH1ktlsQGo",
+"nFqikGSQwj","oQ87rfmIK1","taOXKlXFOB","jSjS3HP433","AXpwE0h1b1","ksJby2DREs","StlDJ0ao3l","he9IA2hEEU","24ARF3weIF","WDVWJuPX7G",
+"uZPqgdjsrv","YOfrYRACuj","0BmCy5drc6","P6bcgSmGzv","kZANmtvdkD","qaofNgtCA5","LewvMRmDcr","IRh48a00b5","OUYuFn1pmO","hE1Qlaez9y",
+"QworusuY4x","K4GS85IhmG","2TRI7OHaBz","Q6hMCIn3NS","2ZHdksuY4x","pAhR1pFrrl","9eoRc7fsYM","MezSWaFFss","Chuy30Wr5y","4QMc9OUqFM",
+"TCgPpuN6r3","C2Irc45cIH","fcJOyWDVWJ","ECMvUydG8U","7ku1p7X3uy","RkQke6AFT0","yToGWtlILt","lm0pDSjskQ","taOXKnlaBy","cQOnv7Ow5C",
+"yofH3oGu6x","pAhR1iwzGk","Vprf2lsQGo","QClRLlkMUA","1LB1LFcWrW","CxVEfWDVWJ","i3pydfaHir","M6qcGsqVrf","iqv4kRpBQm","yvOMILbRTH",
+"AXpwEHlUbF","G1RhSGWqqX","9eoRc1v5hH","ix74rCqqaD","Nxx9VSmGzv","EoToPW7cTs","gtCA52Yz7E","vOqCEPYBf4","5ZaEzuoStw","2TRI7618Di",
+"uZPqgjzUqR","yToGWazIWp","0BmCygf8rI","B3qemDG4sT","t98iW7fKYU","Pb1pa29QAz","ZzJHWxciqp","RsQUq3weIF","he9IAKZamH","cL0aENhXdu",
+"1j5L8CdyBV","8cVD39eoRc","7fsYMQworu","TCgPpyToGW","WmadAtl72W","JJs5mwDajX","RkQke3otm6","1v5hHSWfou","mz8gxh1zcH","FVMxo7ku1p",
+"8xEKzo8Uyd","uZPqghUTw7","BbwgAgf8rI","lViBvd7vjM","vkCHH8cVD3","Ss0ZuG1RhS","brhlQzFgtB","DcpWBjzUqR","8RCUAuQIcz","QChxskZANm",
+"45cIHQClRL","he9IAJIqXi","Ul4a1aL6AJ","piJSkMmsIo","B3qemUvlv4","kB5nPJIqXi","W3VFHP6bcg","uQIczTXQ0Z","P6bcgblLA9","CxVEfksJby",
+"1j5L8S77LH","fcwDav2eC3","dmoS7d85a9","pWiOsuJScX","lj07QLDk6f","uvf7AOUYuF","S2DfuhE1Ql","Cp3mZpvgjS","QbxXcbgJAz","8cVD3iwzGk",
+"No0QbX6Pin","UmaEvDz1R3","lsQGotAOsr","ru4UGKZamH","tuDySUvlv4","O3iyQ0BmCy","qQxHPhSSvQ","KASQ87X3uy","EOE1oFhtgl","wiHrZ618Di",
+"aDGtSWaWsv","v1HlngtCA5","blLA95VZjS","7fKYUaFFss","lsQGoRpBQm","VjCZqqQxHP","B3qem0h1b1","In3NSVBjhz","Ul4a1RACuj","IBe8kru4UG",
+"ksJby5drc6","F6PT2uupzk","wDajXcmXIX","W7cTs6q6L9","v2eC3xciqp","EoToPZ4I1v","LDk6fsuY4x","K20wKW7cTs","o8Uydsx5Gl","F6PT2uvf7A",
+"Gv3FqfcJOy","0Wr5yTa8f6","d7vjMWMiS3","DcpWBsuY4x","Nxx9VZUnqt","In3NSXflUq","K20wKiKqhr","4QMc9FxX9q","VBjhzCxVEf","v8yFNxReec",
+"ru4UGlpF6W","In3NSOz8yZ","pvgjSVBjhz","yofH3i3pyd","Vprf2uLtKs","BbwgA1v5hH","uLtKsYf2Ec","BCxeCksJby","S2Dfut98iW","faHirgtCA5",
+"n1pmO5ZaEz","DG4sTxciqp","lm0pD9XyT9","LewvMtjQxs","euZA5UlU3M","iKqhrK20wK","0PktIv2eC3","nnP8oqQxHP","Cfgr3x3LDe","8xEKzOz8yZ",
+"JkzUnHRxd8","lpF6Whe9IA","3otm6o8Uyd","29QAz14FLR","QYxC0D6rBy","lm0pDfqypy","DG4sTGXdoH","blLA95Drn0","2ZHdkeuZA5","ZzJHWfcwDa",
+"0h1b1suY4x","0MR5XFhtgl","wDajXMm8si","8hJdtK20wK","VerEAWaWsv","gtCA5EdBKc","VerEAFLsph","aL6AJ0YAGH","suY4xMaJQs","CdyBVFjHXR",
+"Z4I1vzHF1q","taOXKCdyBV","wDajXAkKTk","WMiS3KZamH","rhl0JxXTI4","QWxoT1LB1L","d7vjMYh1hF","xXTI4UmaEv","ni2v1t59lR","piJSkn8pJ9",
+"blLA9hUTw7","X6PinDQimp","FVMxoWaim6","nnP8oyluBx","IBe8k4W0Tl","hE1QlWaim6","oVQp6SmGzv","QnJ1SKASQ8","2NslmNOHsz","lsQGoGXdoH",
+"AIYUufFDrJ","618DikZANm","n8pJ9LDk6f","yvOMIfLNg8","NcICAv8yFN","Ss0ZuYw2oU","zmLYDokgRi","8xEKzyEfy9","jtn0X5drc6","b29RJuAWyp",
+"UmaEvWDVWJ","In3NSrz7Ut","SjskQuJScX","GWqqX7fKYU","qQxHPlweGy","m4bxUWaWsv","RmDcrni2v1","0KyfsNAFuw","JXljWAkKTk","Mm8sii7WMQ",
+"cmXIXZv7z0","No0QbEoToP","LewvM8TxD7","QWxoTgjUTu","Q6hMCQssNC","Ta8f6StlDJ","HRxd8CdyBV","W7cTsTwano","HRxd8tjQxs","uQIcz9GXkX",
+"blLA9HzZT8","MojnPYOfrY","StlDJ7fsYM","OUYuF0MR5X","lm0pDJ2mQi","8TxD7MGlTF","iqv4kDcpWB","lpF6WgtCA5","euZA5gtCA5","VjCZq8hJdt",
+"bgJAzMGlTF","5VZjSLewvM","dhSuHQbxXc","dmoS729QAz","iqv4kF6PT2","Yf2EcjS1aj","lXFOBRsQUq","Pb1paAXpwE","o8Uyd48cHL","IKxdLsx5Gl",
+"CK5W74W0Tl","GWqqXM3zXL","2DREsyofH3","FNYIMuJScX","aDGtSqQxHP","lkMUAv8yFN","HP433dhSuH","AXpwEix74r","zY1GY580YD","DG4sTIn3NS",
+"IBe8k9y4lw","he9IASbRYy","EOE1oulk41","fmIK14QMc9","rKDLJpmeCd","he9IANo0Qb","RBhp0wDajX","djsrvFPfSE","0BmCyJKWYR","b29RJQYxC0",
+"aez9ygf8rI","CK5W7JIqXi","VjCZqFGzgp","WDVWJtaOXK","2TRI7K4GS8","e6e4zOUqFM","Yw2oUrKDLJ","nFqikzbIYY","jSjS3ciuWz","2Nslm5Mg9r",
+"Cp3mZm4bxU","5iGN5Cp3mZ","M3zXLbgJAz","lj07Qatef2","4QMc9IKxdL","guMb8wDajX","lH1ktaFFss","YOfrY0Kyfs","xciqpuPX7G","Mkgy8brhlQ",
+"FcWrWm4bxU","gjUTuv1Hln","ZzJHWbZLvS","pFrrlZ4I1v","atef2lpF6W","KASQ8Waim6","v8yFNEOE1o","lXFOBWmadA","ZhwG1FNYIM","4W0TluTacx",
+"9XyT9WreyP","8RCUASbRYy","CxVEfHfyNQ","FGzgp2Yz7E","aL6AJulk41","fcJOylweGy","Ss0ZulH1kt","JIqXiFcWrW","i3pydS77LH","Mm8si5nmWv",
+"5VZjSpT8wu","OxWIHGv3Fq","FFDui5ZaEz","5IhmGjfREu","3weIF0ao3l","RpBQmtuDyS","OUYuFCfgr3","24ARFWmadA","EdBKcAkKTk","dmoS7ZuDtD",
+"0BmCypv0i7","ksJby6AFT0","soy9tt59lR","WreyPAgJHQ","FFDuiYh1hF","9XyT9djsrv","mX2GEUl4a1","2ZHdkiB08l","M6qcGFPfSE","RkQkeM3zXL",
+"wDajXKsjRK","AXpwEFcWrW","QbxXcqQxHP","No0QbAXpwE","9XyT9uJScX","QnJ1S6q6L9","ciuWz0YAGH","UlU3MBbwgA","2Yz7EU3yw5","5ZaEzMojnP",
+"ECMvU5ZaEz","TwanoEOE1o","2hEEUQworu","DQimphe9IA","JJs5m8TxD7","EoToP2Yz7E","s4786hE1Ql","JJs5mIKxdL","cL0aE4W0Tl","FGzgpm4bxU",
+"vOqCEMmKGJ","QbxXcFcWrW","BbwgACfgr3","vkCHHQClRL","taOXK2Yz7E","ZuDtD4QMc9","9y4lwrz7Ut","Waim65Mg9r","xciqpGSQwj","OxWIHx3LDe",
+"1j5L8FxX9q","okgRiv1Hln","FNYIMo8Uyd","QssNCVNCPd","5Mg9rqQxHP","m4bxUDG4sT","55rfBn8pJ9","XflUqM3zXL","O3iyQL7cGc","S2DfuprNT6",
+"cShY2uN6r3","uupzkZuDtD","MGlTF0h1b1","0PktITwano","8U2nUHlUbF","jtn0XsqVrf","G1RhSOxWIH","S2Dfuhi5X7","iB08lQWxoT","0BmCyjiVBP",
+"JJs5m5Namm","4W0Tlaez9y","yofH3HRxd8","hi5X7k85Ae","zmLYDWreyP","JXljWCxVEf","8xEKzF6PT2","2hEEUMaJQs","X6PinoQ87r","iwzGkNxx9V",
+"zQt6QJKWYR","wiHrZ0Wr5y","FNYIMGrDg7","QssNCWMiS3","C2IrcOHaBz","rKDLJ8cVD3","i3pydeuZA5","nnP8oaDGtS","AgJHQlkMUA","lXFOBhi5X7",
+"fmIK1ZhwG1","ZuDtDvOqCE","CqqaD5Mg9r","xXTI4t98iW","fFDrJYf2Ec","xciqpbrhlQ","iKqhrtvdkD","azIWp4dEz6","ZzJHW3otm6","24ARFVprf2",
+"0KyfsprNT6","pAhR1FxX9q","aez9yQYxC0","y94nw9eoRc","Cp3mZChuy3","jeskSMmsIo","LDk6fL7cGc","NcICAuZPqg","jiVBPKsjRK","QWxoTlsQGo",
+"zbIYYRACuj","L7cGcn1pmO","lXFOBGSQwj","UlU3MZhwG1","UmaEv3otm6","9XyT9fcwDa","L7cGcl83Ud","azIWpd7vjM","3weIFJKWYR","JIqXiv2eC3",
+"Q6hMCdhSuH","5Drn0FxX9q","cQOnvlViBv","pWiOs1j5L8","HzZT8jSjS3","AOgEeQYxC0","FPfSEPYBf4","iKqhryofH3","ydG8UWreyP","blLA9QWxoT",
+"FhtglVIlwP","bZLvS580YD","MmKGJcmXIX","uN6r3b29RJ","5iGN57lUXZ","8hJdt8xEKz","bgJAzzmLYD","K20wK2hEEU","MmKGJFnPFB","iqv4kulk41",
+"48cHL0MR5X","C2IrcUl4a1","pT8wuZ4I1v","1j5L8oVQp6","GXdoHVjCZq","FFDuiKsjRK","he9IAo8Uyd","HP433IKxdL","Dz1R3tlILt","IBe8kYh1hF",
+"TwanoNo0Qb","DQimpU3yw5","tAOsr0MR5X","d7vjM2ZHdk","GXdoHYOfrY","CIShGVBjhz","Uvlv4aez9y","NOHszaDGtS","s4786x3LDe","G1RhSZhwG1",
+"NcICAjiVBP","1v5hHQbxXc","EOE1o0BmCy","FnPFByluBx","TwanoeuZA5","FFDui9GXkX","2NslmxReec","QbxXc1j5L8","oVQp6OUqFM","t98iWlm0pD",
+"Yh1hFpiJSk","zY1GY9rlg9","8hJdtXyPZN","5Drn0s4786","kZANm3otm6","TCgPpv8yFN","5VZjSVLTy6","euZA5MmsIo","QworuvkCHH","BbwgA9y4lw",
+"EOE1oFnPFB","LewvMDz1R3","B3qemb29RJ","fFDrJWaWsv","7Ow5Cuupzk","AmdQddhSuH","pv0i7v1Hln","2TRI7MK07Y","J2mQiy94nw","Twanoiqv4k",
+"8U2nU1j5L8","ksJbyU3yw5","O3iyQ6AFT0","blLA93otm6","BbwgA0ao3l","y94nwVjCZq","tvdkDMm8si","FjHXRyEfy9","rz7UtHlUbF","hYBCKgf8rI",
+"tvdkDNxx9V","oVQp65Drn0","prNT62DREs","nnP8oU3yw5","IjTwP7Ow5C","C2Irct98iW","Vprf2D6rBy","FwEJz5IhmG","FGzgp5ZaEz","t98iWM6qcG",
+"h1zcHAXpwE","C2IrcVjCZq","zHF1q3weIF","SWfouOUqFM","QbxXcFNYIM","d85a99y4lw","vLsmSWmadA","uJScXlViBv","yofH3lXFOB","6q6L9M3zXL",
+"VjCZq9y4lw","UmaEvW3VFH","9iGoTulk41","piJSkECMvU","zbIYYkZANm","HlUbF9y4lw","K4GS82Yz7E","uZPqghi5X7","hUTw7guMb8","J2mQizbIYY",
+"U3yw5d7vjM","3weIFL7cGc","JIqXiwiHrZ","ulk41lCMxy","FPfSEaL6AJ","48cHLU3yw5","580YDd85a9","5Mg9rCp3mZ","ThjNnMaJQs","oQ87rDLhzM",
+"qQxHPWaWsv","29QAzwDajX","QYxC0KsjRK","S2Dfus93Ml","L7cGc618Di","NAFuwHRxd8","0KyfstvdkD","8U2nUlCMxy","yvOMI1v5hH","QClRLCdyBV",
+"I7p2acShY2","AXpwEaDGtS","8cVD3FcWrW","RzaZAVerEA","HRxd8FVMxo","Q6hMCpv0i7","XflUqix74r","pv0i7k85Ae","oQ87rL7cGc","Cfgr3mX2GE",
+"xciqpZJTXH","vLsmSzY1GY","Qworufqypy","MezSWQ6hMC","0h1b1CxVEf","TCgPpLewvM","P6bcgSbRYy","BbwgAzmLYD","zz4ZUgjUTu","ksJbylCMxy",
+"ZuDtDDcpWB","jS1aj3weIF","Q6LixFLsph","t98iWTa8f6","16lHcRmDcr","euZA5LbRTH","hE1QlkB5nP","TwanoVIlwP","HzZT8Ss0Zu","RACujZUnqt",
+"DLhzMqUJMd","gjUTuZ4I1v","jeskSpvgjS","K20wKqaofN","VLTy6cL0aE","sqVrf07n1c","k85AefLNg8","ZzJHWuAWyp","8hJdtZJTXH","ThjNnrz7Ut",
+"TXQ0Zv8yFN","Dz1R3XyPZN","8hJdtZzJHW","pv0i7lweGy","AgJHQTa8f6","uN6r30h1b1","QChxsBFkb8","xReecRACuj","VLTy6QYxC0","OUqFM07n1c",
+"JJs5mni2v1","iKqhrGSQwj","AXpwEv8yFN","B3qemguMb8","Dz1R3BbwgA","RkQke16lHc","IKxdLgdQsS","SWfou7X3uy","MezSWjS1aj","QClRLciuWz",
+"ZJTXHdhSuH","HzZT8qQxHP","8hJdtY1mC0","WmadAYf2Ec","hi5X7M6qcG","HlUbFkB5nP","suY4xoVQp6","JXljWRzaZA","5VZjSOxWIH","ZJTXHtl72W",
+"580YDFGzgp","he9IAKsjRK","vLsmSChuy3","ZJTXH4W0Tl","lCMxyMezSW","8U2nUTCgPp","iKqhrrhl0J","OxWIHNhXdu","K20wKB3qem","pmeCd7lUXZ",
+"hE1QlxXTI4","uQIczZhwG1","Mm8sitaOXK","iqv4kfFDrJ","0Wr5y1j5L8","QChxsjS1aj","AkKTkVBjhz","QbxXc64s8N","e6e4zF6PT2","8RCUAuZPqg",
+"yluBxEdBKc","soy9tHfyNQ","uvf7ApvgjS","iB08l9GXkX","djsrvdQ586","lj07QQworu","4dEz65VZjS","29QAz7fKYU","JKWYR8TxD7","IRh48uLtKs",
+"euZA5EdBKc","dhSuHEOE1o","ogLgc1v5hH","48cHLuN6r3","RBhp0o8Uyd","FVMxotuDyS","8cVD3W7cTs","cmXIXFVMxo","qQxHPCIShG","Q6hMClsQGo",
+"2hEEUiqv4k","zbIYY24ARF","uupzkDz1R3","jeskSMaJQs","hSSvQcQOnv","ogLgcb29RJ","azIWpjzUqR","JIqXiRpBQm","RmDcrfcJOy","lpF6WlkMUA",
+"n8pJ945cIH","vLsmSIBe8k","VBjhz0BmCy","rhl0JRsQUq","uupzkCxVEf","QworuCNHmv","k85AeMmKGJ","SWfouJKWYR","Y1mC0AIYUu","lViBvLDk6f",
+"7Ow5CjeskS","5iGN5xReec","7ku1pdjsrv","aL6AJCK5W7","AmdQd8xEKz","2ZHdkNo0Qb","fcwDataOXK","qUJMdOz8yZ","fmIK1zbIYY","zFgtB2Nslm",
+"5ZaEzB3qem","WMiS3QYxC0","RpBQm0ao3l","Yw2oUru4UG","uvf7AazIWp","FcWrWlsQGo","1v5hH2DREs","n1pmOpmeCd","vOqCEFjHXR","RmDcrQChxs",
+"RpBQmatef2","JXljWIRh48","x3LDe8RCUA","yluBxfcJOy","zbIYYcShY2","WmadAiKqhr","7hyVvRmDcr","Oz8yZt59lR","kB5nPQ6Lix","mz8gx55rfB",
+"ydG8UEdBKc","lViBvpWiOs","lj07Qaez9y","tuDySO3iyQ","16lHc3weIF","Q6Lixm4bxU","jzUqRokgRi","pvgjSPYBf4","oQ87rMK07Y","gf8rI4dEz6",
+"m4bxUYh1hF","RBhp0fcJOy","8TxD7h1zcH","RmDcruZPqg","1LB1L1j5L8","jzUqRHRxd8","d7vjMi3pyd","DG4sTAOgEe","LewvMC2Irc","uLtKspv0i7",
+"Zv7z0fmIK1","M3zXLh1zcH","6q6L9WmadA","uTacxFwEJz","jzUqR7hyVv","FhtgluLtKs","3weIF2Nslm","nFqikRsQUq","QssNCt98iW","nnP8ojzUqR",
+"QnJ1S7fsYM","CqqaDuQIcz","suY4xciuWz","nlaByCK5W7","29QAzxciqp","l83UdRmDcr","UmaEvBCxeC","mz8gxCNHmv","cmXIXpFrrl","HzZT8pvgjS",
+"jiVBP5iGN5","gjUTuogLgc","AgJHQAOgEe","SbRYyPYBf4","pWiOszz4ZU","8xEKzQClRL","RACujtjQxs","x3LDeatef2","wDajXCdyBV","HRxd87fsYM",
+"Ss0ZuGv3Fq","MGlTFQ6Lix","zQt6QAIYUu","xciqpuLtKs","In3NS8TxD7","e6e4zFwEJz","Z4I1vt98iW","EoToPsqVrf","n1pmOUmaEv","0KyfsPYBf4",
+"FPfSEni2v1","GXdoHv1Hln","ksJby3otm6","XyPZNQ6hMC","7fKYUv8yFN","dmoS7sx5Gl","X6PineuZA5","U3yw5Q6Lix","FGzgp1v5hH","0Kyfs8hJdt",
+"W7cTsNxx9V","he9IAuoStw","Gv3Fq2ZHdk","ReKEWcL0aE","gf8rIgIYvE","uoStwLDk6f","NOHsz0ao3l","ZJTXHogLgc","Nxx9VLDk6f","lCMxydjsrv",
+"BCxeCfLNg8","ogLgcvkCHH","4QMc9wDajX","fLNg8djsrv","dpe1vSjskQ","ECMvUIKxdL","tvdkDlweGy","GXdoH2ZHdk","WPmlxy94nw","9iGoTcShY2",
+"LewvM07n1c","LbRTHhe9IA","1v5hHD6rBy","zbIYYaL6AJ","Chuy3XyPZN","nFqikJJs5m","gf8rIlViBv","uZPqghSSvQ","d85a95nmWv","WMiS3blLA9",
+"ECMvUl83Ud","BGaQYK4GS8","0YAGHrKDLJ","FLsphRsQUq","7Ow5CnnP8o","nlaBygf8rI","Dz1R3pWiOs","VjCZqVLTy6","9GXkXG1RhS","RBhp0Oz8yZ",
+"uoStwKASQ8","IKxdLzFgtB","piJSkrKDLJ","ZJTXHjSjS3","v1HlnCp3mZ","KASQ8AIYUu","FLsphMmsIo","guMb8uTacx","bgJAzX6Pin","ZJTXHzQt6Q",
+"uLtKsCIShG","Yw2oUUlU3M","tlILtd85a9","zz4ZUlm0pD","aez9ykZANm","cmXIXRACuj","Kr8yspvgjS","hE1QlJKWYR","pT8wuBCxeC","F6PT2ulk41",
+"lj07Qjtn0X","WmadA2TRI7","he9IAXflUq","0Wr5y0Kyfs","5Namm6AFT0","jtn0XyToGW","m4bxUe6e4z","Rxrsm7hyVv","i7WMQUvlv4","EoToPUvlv4",
+"4dEz6GSQwj","CxVEf7Ow5C","dmoS7soy9t","DcpWBpiJSk","lH1ktt98iW","Q6hMCDQimp","55rfBQWxoT","brhlQcQOnv","s4786DQimp","o8UydIRh48",
+"MmsIoQnJ1S","W7cTsFcWrW","pWiOshi5X7","LbRTHEoToP","B3qemnlaBy","8xEKz5VZjS","KASQ8n8pJ9","OHaBzChuy3","DQimpdmoS7","CdyBVIKxdL",
+"TXQ0ZlViBv","iqv4kChuy3","FhtgluAWyp","Yf2EcuZPqg","t59lRHRxd8","cL0aEe6e4z","P6bcgFNYIM","tjQxsWMiS3","lkMUA0Kyfs","Mkgy8Z4I1v",
+"tjQxs2ZHdk","7hyVvfqypy","64s8NMojnP","55rfBzFgtB","k85Ae0Kyfs","l83UdLbRTH","Pb1paPYBf4","Chuy3UmaEv","2Yz7EgjUTu","2Nslmv2eC3",
+"i7WMQa00b5","aL6AJHlUbF","MojnPWaim6","Fhtgluupzk","S77LHni2v1","9rlg98U2nU","cL0aEsqVrf","ZhwG1zFgtB","lm0pDFLsph","uN6r3618Di",
+"CxVEfzFgtB","EOE1o8FmFH","aL6AJhE1Ql","ni2v1Twano","Y1mC0bgJAz","SWfou2DREs","Yw2oUtlILt","iqv4k2TRI7","pmeCdt59lR","WaWsvKASQ8",
+"pFrrln8pJ9","StlDJThjNn","JkzUnprNT6","3weIFaL6AJ","bZLvSMmsIo","hSSvQbZLvS","K4GS8fcwDa","RmDcrJ2mQi","7X3uy07n1c","WreyP5Namm",
+"cmXIXgf8rI","Yf2EcWPmlx","dhSuHvLsmS","2NslmkB5nP","FjHXR2Yz7E","FGzgphE1Ql","5VZjSkB5nP","mX2GEQYxC0","OxWIHJ2mQi","9iGoTO3iyQ",
+"Mm8sil83Ud","MaJQsCdyBV","ZzJHW0Wr5y","2Yz7EY1mC0","TwanoFGzgp","iB08l7ku1p","tAOsrCdyBV","FFDuiFjHXR","Q6LixUlU3M","bgJAz0Kyfs",
+"WreyPlkMUA","uvf7AL7cGc","2hEEUHzZT8","KZamHReKEW","1j5L8uQIcz","Uvlv4Yh1hF","AmdQdJIqXi","gdQsSUmaEv","Nxx9V8FmFH","7hyVv24ARF",
+"9XyT9Yw2oU","atef2sx5Gl","8cVD3BCxeC","RACujJKWYR","prNT6pvgjS","0MR5XDG4sT","k85AeQ6hMC","2TRI7G1RhS","m4bxUUl4a1","iwzGkcmXIX",
+"O3iyQfcwDa","pAhR1Cp3mZ","hUTw7dhSuH","zbIYYcmXIX","iwzGkUmaEv","piJSkuQIcz","uLtKsLDk6f","EOE1oYh1hF","fLNg8gjUTu","zbIYYKr8ys",
+"lm0pD2Nslm","RsQUqZUnqt","8TxD72Nslm","aFFsszbIYY","W3VFHpT8wu","faHirThjNn","wiHrZGSQwj","1j5L8aL6AJ","gdQsSWMiS3","cL0aEoQ87r",
+"qQxHPWMiS3","VLTy6n8pJ9","QClRL7fsYM","BGaQYJJs5m","tl72WVLTy6","lH1ktbgJAz","EdBKcRmDcr","YjB9the9IA","QWxoTh1zcH","SjskQ1LB1L",
+"prNT6h1zcH","4dEz6pT8wu","djsrvpWiOs","zqH0W14FLR","hi5X7i3pyd","mX2GE2ZHdk","CdyBViB08l","8TxD7Qworu","jSjS3faHir","QChxsG1RhS",
+"AmdQdAkKTk","8TxD7tjQxs","XyPZN45cIH","lj07Qa00b5","CIShG5iGN5","qQxHPyluBx","5VZjS7X3uy","v2eC3580YD","QYxC0uN6r3","bgJAz8FmFH",
+"QworuPYBf4","uZPqgCqqaD","Pb1pahi5X7","yluBx24ARF","iqv4kQYxC0","K20wKtjQxs","t59lRXflUq","Dz1R3zHF1q","0PktIPOUYS","FcWrWRmDcr",
+"0YAGHydG8U","zFgtBtAOsr","WMiS3RsQUq","AgJHQZUnqt","8FmFHCNHmv","JXljWUvlv4","hYBCKZzJHW","AOgEeazIWp","l83UdbgJAz","rKDLJ1LB1L",
+"aFFssG1RhS","0KyfsVerEA","45cIHMmKGJ","OxWIH4dEz6","suY4xVBjhz","IKxdLix74r","suY4xsuY4x","JJs5m9XyT9","oQ87rBbwgA","SWfounlaBy",
+"yvOMIBGaQY","qaofNFNYIM","nlaByD6rBy","5iGN5Qworu","zmLYDqaofN","OUYuFuJScX","i3pydPb1pa","7Ow5C3weIF","iB08ldjsrv","suY4xKZamH",
+"Oz8yZ7fKYU","gf8rI5drc6","d7vjMJJs5m","UmaEvzbIYY","NcICAWDVWJ","2Nslm8cVD3","QworuD6rBy","MaJQsK20wK","0YAGHzmLYD","6q6L9CdyBV",
+"lXFOBe6e4z","0h1b1580YD","9rlg9yvOMI","5Mg9rxReec","xXTI4hi5X7","YOfrYFNYIM","iwzGkn8pJ9","uN6r3K4GS8","uN6r3G1RhS","tAOsr3otm6",
+"8U2nUSs0Zu","zY1GY9XyT9","F6PT2Ta8f6","VerEAlViBv","aL6AJzz4ZU","IRh48Vprf2","uZPqgn8pJ9","9iGoTlH1kt","ZuDtDVprf2","K20wKP6bcg",
+"Ta8f6uQIcz","FLsphSWfou","iwzGkydG8U","HP4335ZaEz","1v5hHVBjhz","suY4x8hJdt","TCgPpjiVBP","6AFT0Yh1hF","kB5nPpvgjS","DQimpn1pmO",
+"SmGzvoGu6x","rhl0JMmKGJ","ZJTXHru4UG","ulk41zY1GY","dhSuHjtn0X","Ta8f6AmdQd","GWqqXEoToP","x3LDe0ao3l","FxX9q64s8N","5nmWv0Wr5y",
+"2DREsfcwDa","O3iyQHP433","VLTy6ZuDtD","Q6hMCgf8rI","Yf2Ecx3LDe","gtCA5KASQ8","14FLRlj07Q","Y1mC0MK07Y","jfREuWDVWJ","i7WMQAXpwE",
+"uAWypuJScX","kZANmh1zcH","NOHszS77LH","Ul4a1JRJQB","Vprf29GXkX","pFrrlRxrsm","FcWrWTa8f6","y94nwpiJSk","gdQsSKr8ys","M6qcGpv0i7",
+"cQOnvogLgc","RACujWaim6","t59lRNo0Qb","SmGzvyofH3","lpF6WtjQxs","zmLYDsqVrf","2TRI7uPX7G","YjB9tVprf2","9rlg9X6Pin","POUYSM3zXL",
+"sx5Glhi5X7","oQ87rTa8f6","gdQsSYh1hF","lXFOBlH1kt","W3VFHFVMxo","8TxD7Fhtgl","Mm8siJKWYR","uN6r3DG4sT","OUqFM5VZjS","pmeCd5Drn0",
+"Yh1hFlj07Q","bgJAz9iGoT","QworuJJs5m","brhlQhi5X7","FnPFBqaofN","1j5L8he9IA","okgRidhSuH","FLsph45cIH","JRJQBjS1aj","zY1GY0h1b1",
+"s7MxkaL6AJ","v1HlnpT8wu","fcJOyRxrsm","14FLRK4GS8","FPfSEdjsrv","jiVBP8xEKz","yluBxZuDtD","5drc629QAz","jfREuFjHXR","WreyP2Yz7E",
+"2Yz7EOUYuF","DcpWBhUTw7","FLsphblLA9","taOXKv2eC3","Cfgr3ciuWz","iB08lI7p2a","5nmWvCNHmv","Uvlv4tvdkD","iB08lyEfy9","7hyVvW7cTs",
+"4W0TltaOXK","pv0i7e6e4z","Yf2EcQYxC0","SmGzvk85Ae","uvf7ABpYhV","GXdoHBbwgA","5IhmGWreyP","uLtKs0Wr5y","jS1ajdpe1v","Q6hMCydG8U",
+"uZPqgUl4a1","iKqhrMGlTF","k85Ae6q6L9","prNT6Waim6","CxVEfFwEJz","DQimpPYBf4","WPmlxfmIK1","RzaZAFjHXR","jSjS3ThjNn","GSQwjCqqaD",
+"TwanoO3iyQ","hYBCK4dEz6","RACujtaOXK","rhl0JDz1R3","VBjhzvOqCE","NcICAjtn0X","soy9toVQp6","L7cGcIBe8k","atef2WaWsv","vkCHHpFrrl",
+"ZhwG1WMiS3","s7Mxk5iGN5","JIqXiVIlwP","ksJbyFnPFB","45cIHWMiS3","RBhp0jtn0X","okgRitjQxs","FcWrWuAWyp","AmdQdh1zcH","7X3uyS2Dfu",
+"fFDrJiKqhr","iqv4k5IhmG","iwzGk0BmCy","U3yw5hi5X7","JRJQB9eoRc","tlILtd7vjM","Cp3mZ2TRI7","jzUqR6q6L9","dQ586x3LDe","uupzkfcJOy",
+"pWiOs0ao3l","VLTy6LewvM","W3VFH0YAGH","BGaQYt59lR","TCgPplXFOB","kZANmtaOXK","tuDySD6rBy","y94nwThjNn","8hJdtQClRL","zHF1q9iGoT",
+"8xEKz6AFT0","fFDrJMm8si","QbxXcatef2","D6rByoQ87r","cmXIXi3pyd","cShY2dpe1v","uoStwvOqCE","iB08ljtn0X","PYBf4AIYUu","FPfSEdmoS7",
+"GXdoHfLNg8","ZuDtDFhtgl","JIqXiuTacx","MK07YvLsmS","atef2iKqhr","kZANmSWfou","1v5hHDz1R3","SmGzv48cHL","2TRI7x3LDe","oVQp6uZPqg",
+"aDGtSZ4I1v","uN6r3YjB9t","MaJQstjQxs","5Drn07fKYU","ciuWzRBhp0","ZhwG1YOfrY","4W0TlGWqqX","atef2QnJ1S","hSSvQ3otm6","l83UdsuY4x",
+"RzaZAS2Dfu","VLTy63weIF","b29RJX6Pin","gjUTu2DREs","FVMxomX2GE","oQ87rHlUbF","8hJdt6AFT0","NOHszy94nw","0h1b1lm0pD","y94nwTa8f6",
+"RsQUqNcICA","Vprf2W3VFH","YOfrYtjQxs","ZhwG1GXdoH","JJs5mVIlwP","5VZjSL7cGc","fFDrJTwano","SmGzv0BmCy","uupzkNhXdu","ZUnqtcL0aE",
+"xciqpKASQ8","QChxsv1Hln","lj07QeuZA5","lViBv2TRI7","JIqXiC2Irc","ix74rk85Ae","6q6L9HlUbF","2NslmaL6AJ","2hEEUzz4ZU","Waim6RzaZA",
+"WaWsvsoy9t","EdBKcfcJOy","W7cTsrz7Ut","JkzUnRmDcr","ReKEWqaofN","Zv7z0KASQ8","euZA5okgRi","9iGoTJIqXi","n8pJ9XyPZN","FGzgp5IhmG",
+"FPfSERzaZA","uupzkVprf2","zQt6QprNT6","JKWYRMm8si","nnP8oxReec","55rfB2Nslm","pv0i70Kyfs","RpBQmn8pJ9","lm0pDprNT6","48cHLfcwDa",
+"StlDJO3iyQ","FFDuiSs0Zu","KZamHRsQUq","NhXduNo0Qb","FPfSELDk6f","ThjNn618Di","tlILt7ku1p","FnPFBcmXIX","Zv7z0zmLYD","jiVBPlpF6W",
+"bZLvSFVMxo","I7p2ablLA9","lpF6WAgJHQ","2hEEU618Di","ZhwG18U2nU","jiVBPAIYUu","qaofN7Ow5C","nFqik0MR5X","lweGyoGu6x","lViBvgdQsS",
+"8xEKzWmadA","UmaEvmX2GE","MK07Y0PktI","i3pydL7cGc","b29RJWmadA","fcJOycShY2","5Mg9rjSjS3","KsjRKs4786","i3pydUvlv4","pvgjSQChxs",
+"64s8N4W0Tl","MK07YGXdoH","FxX9qFLsph","ReKEWiB08l","uZPqg580YD","fcJOyn1pmO","Zv7z0dhSuH","yEfy9e6e4z","zmLYDZJTXH","fcJOyk85Ae",
+"RxrsmfmIK1","cShY2HzZT8","QworuDcpWB","LewvMRBhp0","lCMxybZLvS","uvf7AiwzGk","lm0pDuoStw","blLA99y4lw","HfyNQv8yFN","v2eC3FNYIM",
+"WMiS3JJs5m","qaofN8RCUA","DLhzMAXpwE","e6e4zUlU3M","atef2aFFss","iqv4kZUnqt","jzUqRb29RJ","IBe8kzqH0W","ZuDtDTa8f6","RkQkeThjNn",
+"jSjS32hEEU","HlUbFFwEJz","i3pydTXQ0Z","IjTwPbrhlQ","uZPqgHzZT8","yToGWFFDui","lm0pDMm8si","2DREsiqv4k","F6PT27X3uy","i3pyd48cHL",
+"0MR5Xt98iW","IKxdL5IhmG","vkCHHvkCHH","AIYUuXyPZN","pAhR1YOfrY","0ao3lfFDrJ","Q6LixAkKTk","OHaBz6q6L9","lH1ktnnP8o","he9IA0PktI",
+"XyPZNOxWIH","aFFssO3iyQ","C2Irc0Kyfs","8hJdtazIWp","OxWIHMkgy8","14FLRtjQxs","Cp3mZfcJOy","iB08lFNYIM","BCxeCjzUqR","sx5GlBFkb8",
+"5IhmGt59lR","9XyT9Q6hMC","Uvlv4M6qcG","yvOMIJXljW","2NslmFhtgl","uZPqgiwzGk","AkKTkJIqXi","b29RJgjUTu","b29RJGSQwj","OxWIHZv7z0",
+"RsQUqciuWz","i7WMQYf2Ec","uPX7GyvOMI","QWxoTTXQ0Z","ThjNnKr8ys","MaJQsaL6AJ","jiVBPFxX9q","jzUqRqaofN","lweGywDajX","ogLgcatef2",
+"CK5W7cL0aE","4W0Tl07n1c","MojnPtvdkD","GrDg7nnP8o","b29RJ0PktI","WreyPhYBCK","9eoRcjzUqR","atef2U3yw5","J2mQiuZPqg","ThjNnUlU3M",
+"48cHLNo0Qb","DQimpJXljW","lsQGoXyPZN","ogLgcIKxdL","CxVEffLNg8","HzZT8AIYUu","uJScXMojnP","U3yw5F6PT2","PYBf4ru4UG","dQ586dhSuH",
+"ulk41i3pyd","VerEA3weIF","ZJTXHJJs5m","8RCUAStlDJ","Y1mC0FLsph","9eoRcFFDui","WaWsvFcWrW","VIlwPcL0aE","SmGzvWaWsv","UmaEvokgRi",
+"QbxXcy94nw","VjCZqtAOsr","wiHrZogLgc","CIShGQ6hMC","JXljWtuDyS","hi5X7xReec","580YDXyPZN","CxVEfdjsrv","DcpWBCK5W7","580YDSs0Zu",
+"LewvM9y4lw","jSjS3FFDui","FNYIM7Ow5C","i3pydoVQp6","Vprf2dpe1v","vLsmSRsQUq","uoStwoQ87r","9iGoT64s8N","K20wKuAWyp","tuDySpWiOs",
+"yofH37hyVv","HfyNQ4QMc9","WreyPMaJQs","NOHszrhl0J","Z4I1vl83Ud","CxVEf2DREs","Ss0ZuFFDui","nnP8oZJTXH","580YDtvdkD","16lHc7fsYM",
+"wiHrZGrDg7","wDajX3otm6","tl72WL7cGc","8RCUAVjCZq","jeskShi5X7","pmeCd2Yz7E","jeskS9GXkX","Dz1R3azIWp","Waim6YjB9t","a00b56AFT0",
+"DLhzMlsQGo","3weIFOxWIH","GSQwjMaJQs","QWxoTcmXIX","ZuDtDJRJQB","KASQ8nnP8o","MGlTF7ku1p","4W0TlAgJHQ","IjTwPuLtKs","cmXIXQ6Lix",
+"VjCZqCdyBV","suY4x5iGN5","WreyPyluBx","RBhp05Mg9r","lkMUAHP433","C2IrcW3VFH","AXpwElj07Q","FFDui0h1b1","vOqCEGv3Fq","e6e4zdmoS7",
+"BCxeCW3VFH","lweGyfcJOy","HlUbFNxx9V","FxX9qfqypy","zY1GYt59lR","HlUbFZJTXH","uvf7AOUqFM","djsrvcQOnv","rKDLJ0h1b1","hUTw7U3yw5",
+"0ao3lCdyBV","n1pmOCK5W7","ru4UGpvgjS","JXljWd85a9","7X3uy2hEEU","n8pJ9zY1GY","rz7UtazIWp","JRJQBWMiS3","DLhzMYh1hF","zQt6Qd85a9",
+"sx5GlsqVrf","CqqaDaDGtS","gIYvEIn3NS","lXFOBn1pmO","ulk41jSjS3","VerEAgjUTu","wDajXd85a9","RkQkeUvlv4","J2mQiYw2oU","euZA5iKqhr",
+"Kr8ysIRh48","zz4ZU0h1b1","7Ow5CDLhzM","pAhR1IKxdL","MojnP7lUXZ","Gv3FqUl4a1","IjTwPVBjhz","EOE1ogIYvE","ECMvUsqVrf","gtCA5wDajX",
+"oQ87rJJs5m","2ZHdk8TxD7","zz4ZUatef2","X6PinPOUYS","DLhzMa00b5","UmaEvn8pJ9","S2Dfuv1Hln","fmIK1faHir","C2IrcfmIK1","TCgPpfFDrJ",
+"fmIK1e6e4z","9XyT9zHF1q","9iGoTTXQ0Z","azIWphUTw7","djsrvaez9y","vkCHHGXdoH","v1HlnBCxeC","0ao3lHzZT8","NhXdu0MR5X","iqv4kMaJQs",
+"qQxHPLewvM","Q6LixWPmlx","FnPFBNAFuw","M6qcGd7vjM","cQOnv3weIF","IRh48uPX7G","nFqikZuDtD","VBjhzulk41","JkzUnzbIYY","jzUqRwiHrZ",
+"MojnPuoStw","8FmFHHlUbF","M3zXL9eoRc","No0QbaL6AJ","jS1ajFcWrW","RkQkeQClRL","ksJbywDajX","o8UydjfREu","FNYIMHRxd8","W3VFHru4UG",
+"aFFssMojnP","FGzgpMm8si","WDVWJRmDcr","9eoRcMojnP","KASQ8OUqFM","fFDrJydG8U","ix74riwzGk","No0QbSWfou","L7cGcI7p2a","0PktIGXdoH",
+"uAWypMojnP","oGu6xVerEA","X6PinZuDtD","aL6AJQssNC","tjQxsLewvM","FnPFBwiHrZ","9y4lwZJTXH","hSSvQF6PT2","64s8NgtCA5","Q6hMCnnP8o",
+"K4GS8kB5nP","0YAGH7fKYU","1v5hH14FLR","k85Aeru4UG","64s8N16lHc","4QMc9bgJAz","8FmFHZuDtD","618Dit98iW","3otm6JIqXi","QChxsL7cGc",
+"fmIK1zz4ZU","mX2GEAXpwE","M3zXLChuy3","J2mQi2Yz7E","VNCPdB3qem","Mm8siHlUbF","zmLYDCfgr3","7Ow5CuN6r3","2hEEUU3yw5","tlILtRsQUq",
+"uJScX14FLR","euZA5vOqCE","IKxdLZhwG1","uPX7GBbwgA","hSSvQZUnqt","Waim6NhXdu","5nmWvmX2GE","No0QbJIqXi","ECMvUgIYvE","CdyBVRmDcr",
+"FLsphRBhp0","NhXduMmKGJ","B3qemFwEJz","FjHXR0YAGH","RmDcrVNCPd","zmLYDazIWp","5drc6ThjNn","MaJQsGrDg7","0YAGHd7vjM","uPX7GKr8ys",
+"Ul4a15Namm","tl72W5iGN5","2DREsksJby","WMiS3FwEJz","jzUqRkB5nP","xReecB3qem","ZzJHWs7Mxk","CNHmv07n1c","29QAzhYBCK","iwzGkblLA9",
+"dQ586Y1mC0","5IhmGyEfy9","WaWsvChuy3","CqqaDTwano","Yh1hF7hyVv","s7MxkjfREu","RzaZAWDVWJ","NhXduO3iyQ","NcICA0ao3l","oGu6xuTacx",
+"0h1b10Wr5y","WDVWJyofH3","x3LDeQssNC","vOqCEv1Hln","yToGW0Wr5y","2NslmjfREu","9iGoTgIYvE","AIYUuuAWyp","ksJbyfqypy","iB08l3weIF",
+"RxrsmvOqCE","2NslmvOqCE","7fKYUokgRi","wDajXb29RJ","0Wr5yeuZA5","EOE1odjsrv","OHaBzru4UG","yEfy9qQxHP","ulk41fcwDa","pAhR1AgJHQ",
+"QworufLNg8","0h1b1EoToP","FFDuiatef2","m4bxUwDajX","fmIK1SbRYy","WmadATwano","yofH3JIqXi","SWfou45cIH","djsrvs4786","0KyfsW7cTs",
+"RmDcruupzk","7lUXZFFDui","OxWIHqUJMd","RkQket98iW","KZamHVprf2","SbRYyUl4a1","FwEJz0Kyfs","mz8gxCIShG","W3VFHVLTy6","6AFT0JIqXi",
+"DcpWBpFrrl","ECMvUXflUq","faHirZ4I1v","BCxeC618Di","RsQUq48cHL","RkQkesx5Gl","uoStw8TxD7","NOHsznFqik","U3yw5NhXdu","uQIczLDk6f",
+"WmadAtjQxs","lpF6WFcWrW","b29RJStlDJ","7X3uyqUJMd","HRxd8Oz8yZ","9iGoTdpe1v","UmaEvFhtgl","hE1Qlt98iW","brhlQOxWIH","uTacxk85Ae",
+"4dEz6uvf7A","EOE1otl72W","8FmFHI7p2a","QChxsNxx9V","MaJQs7Ow5C","AgJHQVNCPd","07n1cX6Pin","Zv7z0UmaEv","cQOnv7ku1p","2ZHdkuupzk",
+"HlUbFfFDrJ","VIlwPM3zXL","h1zcHHRxd8","Mkgy8t98iW","ZUnqtQnJ1S","Gv3FqU3yw5","QWxoTFxX9q","ThjNnsuY4x","mX2GE9rlg9","4QMc9DG4sT",
+"4W0TluN6r3","fmIK1iKqhr","ksJbypFrrl","Uvlv4blLA9","a00b5No0Qb","xReecpiJSk","IjTwPfaHir","s7MxkdQ586","J2mQipvgjS","W7cTsKr8ys",
+"tvdkDyofH3","QYxC0AkKTk","d85a9Cfgr3","yToGWFGzgp","B3qemAgJHQ","a00b5e6e4z","hYBCKGWqqX","0YAGHcQOnv","jS1ajatef2","2NslmCNHmv",
+"W3VFHFPfSE","DLhzMAmdQd","d7vjMMkgy8","7ku1pB3qem","ksJby7hyVv","Vprf2fFDrJ","he9IAW3VFH","OUYuFEdBKc","WPmlx0BmCy","QworuzmLYD",
+"tuDySHRxd8","2ZHdkogLgc","d7vjMVIlwP","blLA9uN6r3","S2Dfue6e4z","QYxC0pFrrl","aez9ylj07Q","uLtKs14FLR","t98iWgIYvE","Ul4a19XyT9",
+"jtn0Xrhl0J","CIShGJKWYR","jfREuQworu","pAhR1K4GS8","uJScXpAhR1","Gv3FqYh1hF","lsQGohe9IA","s7MxkM3zXL","0YAGHOxWIH","MmsIotvdkD",
+"aDGtSuvf7A","ECMvUpiJSk","FFDuiBFkb8","YjB9t24ARF","euZA50PktI","1LB1LX6Pin","0PktIvOqCE","QnJ1S0PktI","Chuy3cmXIX","5nmWvRkQke",
+"oQ87r8TxD7","QssNCuPX7G","1v5hH9iGoT","pFrrlyofH3","RmDcrDQimp","BGaQYMaJQs","euZA5wiHrZ","RxrsmYf2Ec","U3yw5s4786","X6PinoGu6x",
+"BbwgAFNYIM","1j5L8YOfrY","MGlTFTCgPp","VNCPdEOE1o","VBjhzAmdQd","S2DfujeskS","n8pJ9MGlTF","pWiOskZANm","BCxeCtvdkD","SjskQUl4a1",
+"Cp3mZrKDLJ","azIWpEoToP","fmIK1NcICA","0BmCylkMUA","jzUqRIBe8k","GSQwjFcWrW","7fsYMS2Dfu","RmDcrVjCZq","pvgjSjS1aj","Cfgr3NhXdu",
+"AkKTkiwzGk","GrDg7618Di","azIWpDG4sT","ydG8UydG8U","CK5W7U3yw5","I7p2afLNg8","sx5GlfaHir","Yw2oU45cIH","Z4I1vdmoS7","LbRTH2hEEU",
+"pT8wuwDajX","lCMxyuTacx","wDajXcQOnv","D6rByAXpwE","uLtKsatef2","RxrsmFFDui","uupzkHfyNQ","uJScX5nmWv","DLhzMuN6r3","EoToPhE1Ql",
+"n8pJ9uN6r3","In3NSdjsrv","n8pJ9djsrv","kB5nP2TRI7","yofH3uN6r3","YOfrYFnPFB","FNYIMWaim6","v2eC3suY4x","qUJMdWMiS3","MGlTFFNYIM",
+"GSQwjprNT6","OUqFMMm8si","zY1GYQnJ1S","gjUTuix74r","In3NSRzaZA","pmeCd2ZHdk","mz8gxaDGtS","OxWIHlViBv","l83Udo8Uyd","2TRI7guMb8",
+"XflUq2hEEU","2TRI72ZHdk","9rlg9okgRi","3weIFZhwG1","CdyBVcmXIX","euZA5No0Qb","RkQkeqUJMd","OHaBzvOqCE","qUJMdgf8rI","JRJQBHP433",
+"OxWIHtaOXK","FNYIM1j5L8","RzaZAIn3NS","tl72WhE1Ql","pmeCdpT8wu","YjB9tzmLYD","aDGtS29QAz","24ARF7X3uy","NhXduwiHrZ","hSSvQDG4sT",
+"uPX7GaDGtS","Oz8yZhE1Ql","CqqaDuJScX","zY1GY48cHL","580YDKASQ8","NOHszQ6Lix","d7vjMDz1R3","LewvMqQxHP","mz8gxM3zXL","5NammFNYIM",
+"Waim6Yf2Ec","HRxd8fcwDa","HzZT8o8Uyd","yEfy9UlU3M","uN6r3tAOsr","WPmlxuPX7G","ru4UGIBe8k","soy9tFPfSE","UmaEvKASQ8","GrDg7LewvM",
+"MK07Y4dEz6","S2DfuMmKGJ","AkKTk4W0Tl","oQ87rJkzUn","y94nwiwzGk","JJs5mP6bcg","vLsmSQnJ1S","9rlg9WPmlx","AkKTk9XyT9","pv0i7POUYS",
+"Vprf2hi5X7","3otm6gjUTu","VIlwPMmsIo","8FmFHMmsIo","d85a9Ta8f6","v1HlnaL6AJ","W3VFHjS1aj","WDVWJEdBKc","uAWypuLtKs","NhXdu2Yz7E",
+"YjB9tDz1R3","MmsIoY1mC0","ksJbyRACuj","taOXKblLA9","fmIK1dQ586","QWxoTWaWsv","n1pmOcmXIX","xReeciKqhr","Zv7z01LB1L","BFkb8Chuy3",
+"i7WMQFjHXR","5ZaEzvkCHH","oGu6xYjB9t","Waim6JJs5m","RBhp05Drn0","pFrrlBpYhV","faHirlpF6W","ru4UGh1zcH","6AFT07ku1p","VerEA45cIH",
+"Y1mC0Ss0Zu","FGzgpOz8yZ","POUYSRzaZA","ZUnqtuLtKs","SjskQd85a9","9rlg9jeskS","0ao3lLDk6f","ksJbyni2v1","Zv7z0MmsIo","ulk41POUYS",
+"Vprf2MezSW","Ul4a1v8yFN","rKDLJNOHsz","MK07YCxVEf","cQOnvReKEW","lkMUA5IhmG","YjB9tQYxC0","d85a9fmIK1","atef2XflUq","L7cGczbIYY",
+"gtCA5yvOMI","aFFsspv0i7","soy9t3weIF","JRJQB5IhmG","oQ87r5IhmG","uQIczaL6AJ","sqVrftaOXK","KsjRKGSQwj","NAFuwDLhzM","ReKEWWreyP",
+"FGzgplsQGo","Yh1hF0MR5X","yToGWOUqFM","EOE1o6AFT0","nnP8oksJby","CIShG2Yz7E","5nmWvgf8rI","ReKEWni2v1","azIWpjiVBP","jS1ajQChxs",
+"SbRYy0ao3l","NOHszqUJMd","fFDrJ0h1b1","5Drn0ThjNn","OUqFMIKxdL","pT8wu7hyVv","2DREsIjTwP","djsrvzY1GY","uZPqgFnPFB","1j5L8x3LDe",
+"Q6LixogLgc","GSQwjyEfy9","y94nwI7p2a","8cVD3QChxs","45cIHDG4sT","tjQxsvkCHH","Ta8f6FcWrW","6q6L9POUYS","I7p2aFGzgp","i7WMQHfyNQ",
+"MmKGJVerEA","b29RJOHaBz","fmIK1Twano","GrDg7vOqCE","qQxHPjzUqR","fcJOyulk41","PYBf4Yf2Ec","hUTw7S77LH","5ZaEzQClRL","0ao3l07n1c",
+"fcwDa2hEEU","d7vjMGv3Fq","MGlTFuLtKs","3otm6CNHmv","vkCHHmX2GE","VLTy6zFgtB","NOHszcQOnv","fmIK1iwzGk","jeskSQClRL","zQt6QgtCA5",
+"Ul4a1tlILt","xciqpX6Pin","9eoRcUvlv4","BGaQYiqv4k","X6PinlkMUA","azIWpvOqCE","t98iWOHaBz","v1HlnQWxoT","8xEKzK20wK","CIShGK20wK",
+"55rfBJXljW","Uvlv4ydG8U","BFkb8fFDrJ","kB5nPMezSW","uJScXzHF1q","5ZaEzSbRYy","FjHXRjiVBP","fcJOyLewvM","EoToPuZPqg","QYxC0ydG8U",
+"EOE1oKsjRK","TXQ0Zsoy9t","gdQsSkB5nP","gjUTugjUTu","9GXkXiKqhr","v8yFNb29RJ","16lHcZzJHW","BFkb85Namm","5ZaEzoQ87r","W7cTsMGlTF",
+"cL0aEhSSvQ","0YAGHQClRL","bgJAz5Mg9r","jSjS3S2Dfu","IRh48QChxs","lXFOBOHaBz","taOXKwiHrZ","iB08lHfyNQ","4QMc9aFFss","StlDJXyPZN",
+"oGu6xF6PT2","2hEEUdQ586","FFDuiciuWz","YOfrYbrhlQ","pvgjSOxWIH","OUYuFDz1R3","LewvMReKEW","J2mQiLewvM","lpF6Wv8yFN","prNT6jtn0X",
+"W3VFHVprf2","BCxeCOUYuF","QChxs9XyT9","FLsph14FLR","lj07QD6rBy","OHaBzPb1pa","Yf2Ec0PktI","CdyBV8xEKz","qUJMdlweGy","OUqFMrKDLJ",
+"9GXkX5Mg9r","2TRI7AOgEe","B3qemIKxdL","L7cGcazIWp","MezSW07n1c","azIWpHfyNQ","4dEz6jSjS3","9XyT9POUYS","tuDySaDGtS","qaofNazIWp",
+"C2Irc29QAz","zqH0WAXpwE","tAOsrS77LH","FGzgp2Nslm","VerEAbrhlQ","zbIYYtlILt","PYBf4G1RhS","uZPqgtl72W","o8Uydmz8gx","uN6r3xReec",
+"AgJHQazIWp","JRJQBVerEA","I7p2admoS7","RACujuupzk","iB08llXFOB","Ta8f6C2Irc","yEfy9gtCA5","Q6hMCaFFss","qUJMdpAhR1","ogLgcydG8U",
+"jSjS35Mg9r","SbRYyFVMxo","MK07YFwEJz","LewvMblLA9","iwzGkNhXdu","h1zcHFFDui","45cIH9rlg9","RkQkeWreyP","FjHXR5Mg9r","jfREuzQt6Q",
+"2hEEUQClRL","VLTy65ZaEz","QbxXcFnPFB","n8pJ99eoRc","MezSWDG4sT","AgJHQ07n1c","o8Uydzz4ZU","Mm8siOUqFM","RmDcrzmLYD","580YDUvlv4",
+"UlU3MQ6Lix","pWiOstvdkD","ogLgc6q6L9","P6bcgJRJQB","GXdoHDQimp","5Mg9rpAhR1","24ARFQYxC0","hSSvQhUTw7","rz7UtuLtKs","RpBQmW3VFH",
+"gdQsSMGlTF","ZhwG1ZUnqt","m4bxUkB5nP","XyPZNnnP8o","zFgtBsoy9t","C2IrcThjNn","Q6hMCfcwDa","0Wr5yJIqXi","VNCPdAkKTk","NAFuwlsQGo",
+"pWiOsBpYhV","16lHcECMvU","BCxeCoQ87r","zQt6QGrDg7","pvgjS8U2nU","prNT6CK5W7","M3zXLxXTI4","zqH0WuoStw","fcwDayluBx","ReKEWblLA9",
+"ZhwG1zqH0W","Yf2EcChuy3","X6PinFcWrW","4QMc9LewvM","qQxHPuupzk","hUTw7YOfrY","aFFssfFDrJ","Y1mC0FPfSE","X6Pin7X3uy","4W0TlSs0Zu",
+"bZLvSuQIcz","rKDLJZ4I1v","BpYhVW7cTs","HzZT8Yh1hF","DLhzM7fKYU","IRh48RpBQm","hSSvQBGaQY","Pb1paWmadA","IRh48blLA9","M6qcGJIqXi",
+"vOqCE5ZaEz","PYBf4Ss0Zu","BFkb8jzUqR","XyPZNwDajX","GXdoHRBhp0","bZLvSKZamH","aFFssaez9y","taOXKF6PT2","7ku1pnFqik","EOE1oVBjhz",
+"xXTI4dhSuH","3weIFBCxeC","2TRI7RsQUq","RxrsmOxWIH","K4GS8HlUbF","MojnPuN6r3","8FmFHpAhR1","HzZT8vLsmS","kZANmzFgtB","5drc6B3qem",
+"vkCHH24ARF","MmsIoyluBx","n8pJ9CIShG","tuDyS5Drn0","BCxeCo8Uyd","dQ586WDVWJ","QnJ1SM6qcG","dhSuHfaHir","14FLR29QAz","5drc6Gv3Fq",
+"0PktIdjsrv","TCgPplpF6W","Gv3FqM6qcG","3weIFHRxd8","1v5hHPYBf4","oQ87rCxVEf","uQIczk85Ae","RzaZAeuZA5","7hyVvHfyNQ","ThjNnQYxC0",
+"uTacxVerEA","gIYvE7hyVv","qaofNC2Irc","mX2GEMaJQs","iB08lNOHsz","OHaBzDcpWB","FcWrWWMiS3","DG4sTSWfou","yluBxjtn0X","QnJ1SpvgjS",
+"blLA92Yz7E","2ZHdklpF6W","k85AeSjskQ","Ta8f67ku1p","FhtglRmDcr","2ZHdkRzaZA","uJScXlsQGo","l83UdKZamH","SmGzv1j5L8","HzZT8gjUTu",
+"xReecgtCA5","d85a9piJSk","M6qcGFnPFB","X6Pin9eoRc","64s8NWaim6","dQ586uZPqg","L7cGcLDk6f","POUYSRBhp0","lpF6Watef2","6q6L9Rxrsm",
+"HlUbFjiVBP","2hEEU4dEz6","Qworu5nmWv","s4786fLNg8","YjB9tmX2GE","CxVEflpF6W","5drc6VIlwP","7hyVvMezSW","SjskQbrhlQ","5drc6kB5nP",
+"uupzkAkKTk","uTacx3weIF","b29RJDG4sT","Yh1hFulk41","QWxoTWaim6","YOfrYtlILt","5ZaEzZv7z0","VerEAyluBx","tAOsrMK07Y","ksJby0YAGH",
+"jiVBPvOqCE","uTacxECMvU","0Wr5yFGzgp","jfREu6q6L9","S2DfuX6Pin","FNYIMDG4sT","55rfBMGlTF","RpBQm4dEz6","QworuWMiS3","KsjRK07n1c",
+"zFgtBNxx9V","HfyNQK20wK","hSSvQqUJMd","yofH3pvgjS","lkMUABFkb8","ThjNnuQIcz","a00b5v2eC3","1j5L8Ul4a1","5VZjSWaWsv","JJs5m0MR5X",
+"atef2Nxx9V","5Mg9r3weIF","MGlTFuAWyp","5iGN5BFkb8","lCMxyEoToP","bZLvSWPmlx","07n1cDLhzM","CNHmv3weIF","Z4I1vksJby","HRxd8KZamH",
+"Ta8f6MK07Y","No0QbIjTwP","AgJHQIRh48","zFgtBP6bcg","Vprf2VjCZq","mX2GEv2eC3","AkKTk6q6L9","64s8NcQOnv","uJScXFVMxo","fqypy24ARF",
+"RkQkeMmKGJ","55rfB24ARF","hSSvQ8hJdt","uN6r3Pb1pa","wiHrZbZLvS","zHF1qy94nw","0PktIZhwG1","5VZjSWaim6","cShY2I7p2a","qUJMdFwEJz",
+"2ZHdkCp3mZ","QYxC0ThjNn","RzaZAwDajX","yToGWSWfou","o8UydcL0aE","pFrrld7vjM","POUYSsoy9t","lH1ktWaim6","QClRLyToGW","uQIczlkMUA",
+"FcWrWCIShG","iwzGkAIYUu","JKWYRhi5X7","W7cTsS2Dfu","BGaQYW3VFH","uZPqgGSQwj","tuDySW7cTs","JKWYRnnP8o","2NslmRBhp0","4dEz6HRxd8",
+"0BmCyBGaQY","jiVBPguMb8","GrDg7FcWrW","Zv7z0WreyP","618Di9iGoT","Nxx9VTwano","SbRYygIYvE","SWfouzFgtB","In3NSgIYvE","pFrrlxXTI4",
+"CNHmvuvf7A","YOfrYjS1aj","mX2GEReKEW","I7p2aKASQ8","TXQ0ZBbwgA","blLA9TXQ0Z","YjB9tzQt6Q","5drc6EoToP","QbxXcBbwgA","QYxC0IRh48",
+"h1zcHoGu6x","dhSuHv2eC3","vkCHH45cIH","nFqikdjsrv","9eoRcY1mC0","G1RhS4W0Tl","9rlg907n1c","MmsIoCp3mZ","2Yz7EeuZA5","MaJQsYf2Ec",
+"FLsphNOHsz","uupzkRkQke","yofH3gtCA5","KZamHQssNC","UlU3MHlUbF","MK07YFhtgl","ThjNnhYBCK","Zv7z0oGu6x","BpYhVtjQxs","9GXkXhe9IA",
+"K20wK0YAGH","lViBviwzGk","IBe8kKsjRK","QChxs0MR5X","ZuDtDpAhR1","blLA9PYBf4","ru4UG16lHc","aDGtS16lHc","ksJbyydG8U","RpBQmpAhR1",
+"prNT6ydG8U","29QAzJkzUn","aDGtShUTw7","7hyVvZuDtD","LDk6fFwEJz","IjTwPtjQxs","4W0TlNOHsz","Pb1pafqypy","n1pmOHP433","s4786DcpWB",
+"ni2v1ix74r","QClRLlCMxy","LbRTHZv7z0","nnP8oI7p2a","oGu6xpT8wu","tvdkDcmXIX","HRxd8sx5Gl","3weIF6AFT0","nFqikF6PT2","0PktIlH1kt",
+"yluBxaDGtS","NcICAFPfSE","xciqpOxWIH","0YAGHGv3Fq","P6bcgJ2mQi","MaJQs8U2nU","JIqXiFxX9q","8xEKzFwEJz","5nmWvciuWz","Ta8f6Y1mC0",
+"7Ow5CWPmlx","lkMUACdyBV","7ku1pWPmlx","1v5hHpWiOs","dmoS7MezSW","ksJbyRmDcr","vOqCEkZANm","QworuWaWsv","euZA5nFqik","tjQxsGrDg7",
+"U3yw5gdQsS","ZUnqt29QAz","nlaBy9iGoT","QnJ1SXyPZN","iKqhrt59lR","yToGWjeskS","v1Hlnv8yFN","lm0pDRpBQm","zQt6QCfgr3","t59lRfcJOy",
+"CIShG0MR5X","uTacxUlU3M","3weIFfaHir","MmsIoCNHmv","cShY2OUqFM","guMb8YOfrY","8cVD37lUXZ","Zv7z0yEfy9","1v5hHDQimp","iwzGklCMxy",
+"3otm6UmaEv","jiVBPIKxdL","QbxXc07n1c","Q6LixRzaZA","gf8rIM3zXL","rhl0JDLhzM","8FmFHGSQwj","EOE1oRACuj","Gv3Fqdpe1v","Ta8f65iGN5",
+"MojnPVLTy6","Cfgr33weIF","3otm6prNT6","29QAzOHaBz","sx5GlFcWrW","I7p2aTwano","fFDrJZv7z0","C2Irc6q6L9","brhlQ0MR5X","DQimpVIlwP",
+"djsrvpAhR1","5Drn0KsjRK","atef2Waim6","HRxd8Ul4a1","LDk6fOz8yZ","jS1ajIn3NS","Oz8yZxXTI4","L7cGcRmDcr","i7WMQfmIK1","sqVrfNhXdu",
+"JRJQBS77LH","9y4lwYf2Ec","8TxD7gtCA5","zbIYYlsQGo","TXQ0ZCdyBV","ydG8UguMb8","KZamHgdQsS","kZANmHlUbF","K4GS8Chuy3","ZJTXHuupzk",
+"MojnP5iGN5","tvdkDRkQke","piJSkPOUYS","n8pJ99y4lw","P6bcg8xEKz","uupzkgIYvE","wDajXVLTy6","YOfrYv8yFN","K4GS8soy9t","rKDLJzQt6Q",
+"14FLRuQIcz","nlaByRACuj","FLsphcmXIX","zFgtBuQIcz","JKWYR9y4lw","Mkgy8QClRL","Kr8ysNAFuw","VerEANhXdu","B3qemNcICA","5ZaEzCNHmv",
+"JKWYRhYBCK","POUYSNAFuw","Chuy3MezSW","Cfgr314FLR","FjHXRStlDJ","tuDySMezSW","nFqikM6qcG","he9IARkQke","7lUXZYOfrY","Vprf2jeskS",
+"JRJQBMkgy8","NOHszlsQGo","IRh482hEEU","QWxoTWreyP","ECMvUnFqik","mX2GEBGaQY","OUqFMkZANm","zY1GY7Ow5C","P6bcgO3iyQ","jzUqRQbxXc",
+"iKqhrAmdQd","cL0aE0Wr5y","In3NSQWxoT","oGu6xlpF6W","No0QbUlU3M","IRh487X3uy","sx5GlAgJHQ","QnJ1SuN6r3","AXpwE618Di","GWqqX0MR5X",
+"QnJ1SHfyNQ","mz8gxpFrrl","tjQxsX6Pin","NcICAjfREu","lViBvHfyNQ","EoToPMojnP","cL0aElkMUA","7X3uyX6Pin","yToGWjiVBP","i7WMQoVQp6",
+"ZhwG1WPmlx","qaofNxXTI4","dmoS7Nxx9V","vkCHHIjTwP","GrDg7M3zXL","cShY2fFDrJ","v2eC3jSjS3","KsjRKaL6AJ","rz7UtSjskQ","2ZHdkJ2mQi",
+"t98iWOxWIH","S77LHbZLvS","EoToPZzJHW","tuDySXflUq","ix74rlXFOB","tjQxsYh1hF","y94nwPb1pa","TXQ0ZG1RhS","he9IAfLNg8","48cHLi3pyd",
+"MaJQsiqv4k","580YD5Drn0","wDajXTXQ0Z","tlILtogLgc","9eoRcjfREu","rhl0Jlj07Q","7hyVvWaim6","CK5W7ksJby","Kr8ysFjHXR","hE1QlfcwDa",
+"W7cTsReKEW","VNCPdxciqp","Chuy3xciqp","ThjNnSjskQ","JRJQBJXljW","uN6r3guMb8","JXljWQssNC","LbRTH0PktI","o8Uydni2v1","fLNg8qQxHP",
+"xciqp5IhmG","tuDySbZLvS","s7Mxk5VZjS","ZzJHWlCMxy","MojnPDcpWB","VNCPd8hJdt","sx5GlSWfou","Dz1R3WreyP","faHir2TRI7","7Ow5C0BmCy",
+"wiHrZFwEJz","wiHrZIKxdL","No0Qby94nw","8U2nUHP433","gjUTuThjNn","qUJMdGSQwj","rKDLJVNCPd","0ao3lMmKGJ","0Wr5y5drc6","I7p2aBpYhV",
+"CqqaDEoToP","pAhR1yluBx","RpBQm0MR5X","GXdoHcmXIX","5IhmGSWfou","lCMxyv8yFN","CdyBV7ku1p","AkKTk1j5L8","jSjS36q6L9","6q6L97fsYM",
+"HlUbFYOfrY","RkQken1pmO","VIlwPcmXIX","uN6r3Mm8si","BpYhVHfyNQ","lXFOB1v5hH","BpYhVfcJOy","qaofNoQ87r","rz7Ut8xEKz","t98iWDLhzM",
+"UmaEvt98iW","JRJQBnnP8o","In3NSpT8wu","S77LHsoy9t","WPmlxM6qcG","xciqpmX2GE","suY4xMGlTF","2NslmjSjS3","Gv3Fq2Yz7E","aFFssokgRi",
+"yluBxW7cTs","8cVD3sx5Gl","pT8wuHzZT8","euZA5hi5X7","OUqFM2TRI7","WMiS3Oz8yZ","0ao3lQWxoT","b29RJSbRYy","1j5L8FGzgp","MGlTFgjUTu",
+"Yh1hF5drc6","bZLvSlViBv","618Di8hJdt","2Yz7EQ6hMC","v2eC3i7WMQ","prNT65VZjS","OHaBzDLhzM","Yh1hFlsQGo","4W0TlvOqCE","Chuy3prNT6",
+"RkQke4W0Tl","pv0i7O3iyQ","7hyVvcL0aE","7fKYUSWfou","uupzkRsQUq","FxX9q9y4lw","nlaByqQxHP","VBjhzRxrsm","FFDuizY1GY","LbRTHaDGtS",
+"vkCHH5iGN5","lweGysqVrf","QssNCjtn0X","VBjhzL7cGc","qQxHPOHaBz","IKxdLkZANm","5IhmGYOfrY","0Wr5yCNHmv","TXQ0ZxReec","G1RhS4QMc9",
+"b29RJMkgy8","VLTy6aez9y","lH1ktBFkb8","lweGySs0Zu","oGu6xYh1hF","uJScXtlILt","Zv7z04QMc9","yluBxtvdkD","618DiZ4I1v","NAFuw2ZHdk",
+"BGaQYAXpwE","oGu6xsuY4x","Z4I1v2hEEU","pFrrlVNCPd","TXQ0Zo8Uyd","HP433GXdoH","EdBKceuZA5","FNYIMv2eC3","ZhwG1LewvM","VerEAFNYIM",
+"kB5nPtaOXK","POUYSYw2oU","MezSWmz8gx","45cIHFhtgl","MezSWtl72W","QWxoTMm8si","jiVBPs4786","Yf2Ec2hEEU","YjB9tS77LH","i7WMQFLsph",
+"5nmWvxciqp","uupzkyluBx","hi5X7rhl0J","aFFssTXQ0Z","Y1mC0EoToP","zbIYY6q6L9","S2DfuIRh48","gf8rI14FLR","ydG8U2TRI7","JKWYRciuWz",
+"QssNCIjTwP","Chuy37lUXZ","ZhwG1AXpwE","uvf7AhE1Ql","07n1cwDajX","GrDg7hYBCK","v1HlnECMvU","Q6hMC5Namm","kB5nP5iGN5","16lHc580YD",
+"RmDcrMGlTF","YOfrYgIYvE","4dEz6fLNg8","dhSuHYw2oU","9iGoT45cIH","FcWrWSWfou","v1HlnVNCPd","SmGzvOHaBz","vOqCETXQ0Z","lpF6Wuupzk",
+"M3zXL7lUXZ","m4bxUYOfrY","CxVEfcmXIX","0PktIXyPZN","7lUXZbgJAz","blLA9pvgjS","W7cTs64s8N","hUTw78hJdt","Qworu2Yz7E","lm0pD1LB1L",
+"n1pmOSs0Zu","K4GS8qQxHP","In3NS618Di","he9IAQClRL","Vprf2K20wK","Yh1hFlXFOB","64s8Npv0i7","dpe1vqUJMd","JKWYRksJby","kB5nPXflUq",
+"Chuy3uPX7G","jS1ajjfREu","0Wr5yqUJMd","No0QbQWxoT","e6e4zQ6Lix","QYxC0W3VFH","nnP8oW3VFH","EOE1ovOqCE","5VZjSLbRTH","KASQ8VIlwP",
+"MK07Y8hJdt","F6PT2guMb8","piJSkFcWrW","16lHcCdyBV","hE1Qlzz4ZU","Chuy37fsYM","Gv3FqWPmlx","h1zcHStlDJ","QYxC0Y1mC0","Cp3mZgtCA5",
+"suY4xuvf7A","5Drn0n1pmO","uN6r37fKYU","uTacxI7p2a","3otm6CK5W7","Zv7z0h1zcH","xXTI4JRJQB","WPmlxMmsIo","cShY214FLR","hSSvQv1Hln",
+"qUJMdFcWrW","Yh1hFC2Irc","yofH3uZPqg","RACujOHaBz","kB5nPlXFOB","W7cTsW3VFH","L7cGcFxX9q","BGaQYAOgEe","KASQ84dEz6","Oz8yZ7X3uy",
+"brhlQl83Ud","QChxsFVMxo","1LB1L8RCUA","n1pmOcShY2","VjCZq55rfB","pWiOsJkzUn","Yw2oUtAOsr","QworudmoS7","7X3uywDajX","Twanolj07Q",
+"Cp3mZLewvM","PYBf4tjQxs","FnPFBAmdQd","24ARFIjTwP","iqv4kPYBf4","tlILtEoToP","D6rByJ2mQi","EdBKcydG8U","UlU3MGXdoH","JIqXiP6bcg",
+"lViBvtAOsr","FhtglQ6hMC","cmXIXdjsrv","Zv7z0kB5nP","FPfSEEoToP","CqqaDuAWyp","Zv7z0v8yFN","MmsIofaHir","DcpWB07n1c","ulk41CdyBV",
+"DQimp16lHc","JRJQBUl4a1","QnJ1SprNT6","NAFuwAXpwE","l83UdCdyBV","Dz1R3xReec","kZANmM6qcG","StlDJSjskQ","nnP8oYf2Ec","mX2GEI7p2a",
+"gtCA5Fhtgl","Cfgr3KsjRK","2DREsCK5W7","EoToPYh1hF","0MR5XfcwDa","pvgjS3weIF","2TRI75Drn0","YOfrYk85Ae","jeskS14FLR","oVQp63weIF",
+"8RCUAeuZA5","JRJQBVprf2","jzUqRGSQwj","s7MxkUvlv4","ReKEWBCxeC","B3qemGv3Fq","uupzkzY1GY","14FLRFwEJz","lweGyB3qem","pAhR1ZzJHW",
+"m4bxUNo0Qb","uupzkUlU3M","VjCZqsx5Gl","AmdQdW3VFH","qQxHPlCMxy","7Ow5Crz7Ut","hSSvQiB08l","cL0aEFjHXR","dQ586GWqqX","fmIK1No0Qb",
+"Q6LixrKDLJ","2hEEUDcpWB","EoToPCNHmv","2ZHdkuTacx","6q6L9iwzGk","NcICAVNCPd","Nxx9Vmz8gx","ix74rQYxC0","0ao3l5drc6","Nxx9VEdBKc",
+"Yh1hF8hJdt","1j5L8pv0i7","1j5L8taOXK","7fKYUSs0Zu","t98iWF6PT2","Y1mC0gIYvE","SjskQ0YAGH","ZuDtD0YAGH","45cIHqQxHP","yvOMIChuy3",
+"uvf7Ab29RJ","tlILtyToGW","dhSuHs7Mxk","d7vjM7fKYU","9rlg9SmGzv","uZPqgVerEA","tl72Wi3pyd","fmIK1pmeCd","v8yFN5iGN5","Kr8ysRzaZA",
+"FnPFB2Nslm","IBe8k0ao3l","16lHcUlU3M","9XyT9aFFss","zz4ZUzQt6Q","IjTwP8FmFH","uTacxRmDcr","BCxeCzY1GY","8xEKzs93Ml","GXdoHRACuj",
+"k85AeZv7z0","GWqqXuoStw","MGlTFMmsIo","7lUXZGrDg7","lViBvMK07Y","FwEJzqQxHP","K20wKoGu6x","14FLRS77LH","Q6Lix7ku1p","9y4lwP6bcg",
+"Uvlv4qQxHP","he9IAs93Ml","G1RhSbgJAz","yvOMIMojnP","AmdQd8hJdt","QYxC0AgJHQ","d7vjMCIShG","7fKYUJIqXi","K20wKKr8ys","jeskSbrhlQ",
+"SWfoudhSuH","W3VFHQssNC","9GXkXiB08l","Waim6sqVrf","FFDuiEOE1o","HlUbFSjskQ","J2mQiyvOMI","fqypyDG4sT","K4GS89XyT9","K20wK0Wr5y",
+"OxWIHru4UG","lXFOB16lHc","faHirCNHmv","WDVWJrhl0J","L7cGcWaim6","uQIczWreyP","5nmWvJRJQB","48cHLb29RJ","lViBvVBjhz","Zv7z0StlDJ",
+"C2IrcTwano","t98iWY1mC0","SWfoulm0pD","8TxD7CIShG","HRxd8lm0pD","FjHXR1j5L8","JIqXi9rlg9","BGaQYHzZT8","d85a9Mm8si","Uvlv4Kr8ys",
+"gf8rIlm0pD","YOfrYgtCA5","JJs5mHzZT8","tvdkDRzaZA","SbRYyvOqCE","tuDyS5drc6","2hEEUBbwgA","VLTy6rhl0J","xXTI4lsQGo","pvgjSb29RJ",
+"5nmWv7fsYM","v8yFNciuWz","8RCUAvOqCE","aFFssxciqp","fqypyF6PT2","7hyVvZJTXH","45cIHWDVWJ","FNYIMD6rBy","tuDySSjskQ","fcJOy7ku1p",
+"DG4sTsqVrf","piJSkVLTy6","dpe1vhYBCK","ZUnqtIn3NS","h1zcHyofH3","VLTy6Y1mC0","n1pmOogLgc","sx5GlCfgr3","QnJ1SGv3Fq","he9IAxReec",
+"sx5Gl9iGoT","FnPFBe6e4z","ZzJHW2Nslm","7X3uy0PktI","VNCPdjiVBP","tuDySuQIcz","5NammiB08l","GWqqXHP433","hYBCK4QMc9","fLNg8hSSvQ",
+"Pb1paaDGtS","ni2v12hEEU","X6PinjS1aj","24ARFxciqp","2Yz7Euupzk","P6bcgF6PT2","MmsIoYf2Ec","BpYhVYjB9t","9eoRcuQIcz","7ku1pK4GS8",
+"1v5hHuAWyp","k85AeOUYuF","iKqhrNOHsz","ydG8UOHaBz","ogLgcHzZT8","WreyPix74r","zbIYYfcJOy","MGlTFRpBQm","L7cGcyvOMI","GrDg70h1b1",
+"Dz1R3OxWIH","JRJQB3weIF","L7cGcRzaZA","iwzGkcQOnv","5VZjSsqVrf","n1pmORxrsm","Yw2oUSbRYy","FNYIMW3VFH","Uvlv4MojnP","3weIFs4786",
+"gtCA5pvgjS","8U2nUru4UG","jSjS3O3iyQ","iqv4k580YD","MK07YprNT6","45cIHuvf7A","lm0pDBGaQY","djsrvG1RhS","7fsYMYh1hF","FjHXRYw2oU",
+"9GXkXKsjRK","wDajXZUnqt","UlU3Ms4786","MezSWS77LH","yToGWgIYvE","BCxeClsQGo","azIWpKr8ys","lCMxyGSQwj","5iGN54dEz6","i7WMQuLtKs",
+"WMiS38TxD7","ZzJHWJ2mQi","No0Qb2Yz7E","bgJAzyEfy9","m4bxUmX2GE","kB5nP5nmWv","FnPFBrz7Ut","RzaZASbRYy","VjCZqHfyNQ","W7cTsuN6r3",
+"KsjRKjeskS","lsQGo8U2nU","OUYuFb29RJ","lCMxyqQxHP","JkzUnWPmlx","tvdkDjSjS3","U3yw5euZA5","VerEATa8f6","mz8gxuTacx","K4GS8FxX9q",
+"uvf7Ay94nw","6q6L9Y1mC0","5Drn0yEfy9","h1zcHjfREu","ydG8UMkgy8","atef2CxVEf","Zv7z0ydG8U","MaJQs55rfB","hi5X7RzaZA","djsrvSjskQ",
+"FLsphtjQxs","RACujrz7Ut","d85a9nFqik","Yh1hFoGu6x","jSjS3ZhwG1","YjB9t9iGoT","GrDg7lsQGo","JXljWAIYUu","dpe1v1v5hH","ZzJHWY1mC0",
+"IRh48s7Mxk","I7p2aZv7z0","i7WMQsqVrf","zqH0WKr8ys","8RCUAY1mC0","hUTw7RACuj","RkQketuDyS","G1RhSIKxdL","EdBKcBCxeC","ReKEWThjNn",
+"4W0TlEoToP","0BmCygtCA5","9rlg9uPX7G","RmDcrbgJAz","OHaBzCxVEf","TXQ0ZQworu","QbxXcgtCA5","vkCHHpmeCd","WreyPPb1pa","hi5X7hi5X7",
+"tlILtkB5nP","MezSWQYxC0","qUJMdK20wK","h1zcHatef2","CK5W7NOHsz","OUqFMciuWz","X6PinNOHsz","7Ow5ChUTw7","pAhR1ciuWz","K4GS8uoStw",
+"0BmCygdQsS","O3iyQ24ARF","RzaZARBhp0","zQt6QkB5nP","NcICAIRh48","CIShGW3VFH","JRJQBL7cGc","4dEz6oVQp6","XflUqNAFuw","W7cTsmX2GE",
+"7fKYU9y4lw","atef2o8Uyd","FxX9qWPmlx","5IhmGlkMUA","lweGyrz7Ut","7Ow5Cfqypy","RACujgtCA5","45cIHQssNC","zFgtBNo0Qb","jfREut59lR",
+"JRJQB4dEz6","xXTI4D6rBy","Z4I1vRpBQm","Mkgy8xXTI4","64s8N9GXkX","4QMc9jtn0X","0PktICp3mZ","9eoRcEdBKc","lViBvn1pmO","zmLYDNhXdu",
+"sx5GlD6rBy","4QMc9RpBQm","2ZHdkSbRYy","QChxspv0i7","TwanozFgtB","0PktIRmDcr","MaJQsaFFss","POUYSpvgjS","AIYUupFrrl","In3NSUmaEv",
+"jSjS3RBhp0","FcWrWs7Mxk","bZLvShSSvQ","7Ow5CcShY2","5IhmGFVMxo","s4786gdQsS","IjTwPFNYIM","pWiOsuLtKs","S77LHtlILt","2ZHdkWPmlx",
+"aez9y8xEKz","lH1ktzY1GY","OxWIHHRxd8","FLsphgf8rI","lweGy4dEz6","4dEz6pAhR1","uTacxQssNC","KsjRKRsQUq","GWqqXzbIYY","JKWYRuPX7G",
+"yofH3s4786","Q6LixG1RhS","GSQwjtlILt","ix74r2Nslm","tvdkDMojnP","tvdkDix74r","tvdkDKsjRK","FnPFBL7cGc","QnJ1SyluBx","AIYUugf8rI",
+"hSSvQOUqFM","Mkgy81v5hH","RsQUqix74r","FcWrW5Mg9r","5Nammfqypy","4QMc9BpYhV","dQ586F6PT2","nnP8odpe1v","zQt6QRkQke","tAOsrVerEA",
+"aDGtSFFDui","0BmCyatef2","oVQp6ZUnqt","WaWsvi3pyd","pT8wuqUJMd","piJSkJKWYR","SbRYyi3pyd","hSSvQPYBf4","yluBxCxVEf","ThjNnuN6r3",
+"0h1b1MmsIo","O3iyQlH1kt","FPfSEv1Hln","ReKEW8TxD7","wiHrZYh1hF","v2eC3Uvlv4","Uvlv4QssNC","tAOsrSs0Zu","FxX9qJIqXi","9eoRcNhXdu",
+"JRJQBsqVrf","5drc6uupzk","JkzUnsx5Gl","RmDcrnlaBy","FGzgptlILt","WDVWJL7cGc","i7WMQlViBv","O3iyQaDGtS","MGlTF4W0Tl","jS1ajWDVWJ",
+"piJSkAOgEe","5Mg9r580YD","5iGN5FnPFB","prNT6yEfy9","dmoS7aL6AJ","FLsphRkQke","cL0aEBbwgA","2TRI7zY1GY","ZJTXHQChxs","1v5hH1j5L8",
+"JRJQB8FmFH","bZLvSyvOMI","guMb8FLsph","POUYS07n1c","cL0aEhYBCK","7Ow5CMmKGJ","0ao3l4QMc9","i7WMQpv0i7","cShY2EoToP","45cIHwDajX",
+"FcWrWlCMxy","Waim6IKxdL","TXQ0ZuAWyp","RkQkeAIYUu","kB5nPiKqhr","FVMxohi5X7","fcJOyM6qcG","dmoS7ECMvU","n1pmOwiHrZ","ZUnqtkZANm",
+"CxVEfFGzgp","Chuy3okgRi","W3VFH1LB1L","VIlwPrz7Ut","0h1b1blLA9","Mkgy8MGlTF","1j5L8bZLvS","bZLvS45cIH","618DiIjTwP","ksJbyjzUqR",
+"FPfSElm0pD","IKxdL0Wr5y","pT8wu5Drn0","Dz1R3zQt6Q","NAFuwmz8gx","FFDuiMK07Y","WaWsvYjB9t","8hJdtGXdoH","cShY2mX2GE","he9IAuQIcz",
+"oVQp6tlILt","G1RhS1v5hH","kZANmni2v1","9GXkXuPX7G","suY4xx3LDe","x3LDe45cIH","tjQxs9iGoT","UlU3MChuy3","zz4ZU07n1c","S2DfuTXQ0Z",
+"4dEz6gIYvE","M6qcGnlaBy","2NslmIBe8k","nnP8oQ6hMC","ulk41cmXIX","RBhp0Yf2Ec","iKqhrDLhzM","sx5Gln8pJ9","zHF1quoStw","IBe8kCqqaD",
+"IjTwPGSQwj","OUqFMbZLvS","SmGzvsoy9t","qQxHPdmoS7","S2DfuFcWrW","QWxoTW3VFH","45cIHaez9y","0Wr5yNo0Qb","uZPqgbrhlQ","B3qemazIWp",
+"pAhR1HRxd8","I7p2a8xEKz","MGlTFGrDg7","ZUnqtJRJQB","hi5X75Namm","FjHXRQbxXc","dmoS7brhlQ","hE1QloVQp6","azIWpa00b5","WPmlxBbwgA",
+"zqH0WGv3Fq","Mkgy89XyT9","ru4UGJIqXi","yToGW1j5L8","ThjNn07n1c","x3LDeaDGtS","AIYUuyEfy9","G1RhStlILt","FLsph6AFT0","SmGzvyluBx",
+"s4786GXdoH","n1pmOtuDyS","pv0i7s4786","bgJAzCqqaD","Uvlv4KsjRK","ix74ryvOMI","MmsIo5IhmG","MmKGJsqVrf","i7WMQyvOMI","b29RJ1LB1L",
+"24ARFAgJHQ","YjB9tcShY2","OUqFMQYxC0","Ul4a1VNCPd","14FLRBGaQY","BbwgADz1R3","DcpWBlH1kt","suY4xe6e4z","gf8rIulk41","FPfSEuN6r3",
+"VBjhz16lHc","07n1cXyPZN","0ao3l0YAGH","s47867fsYM","7lUXZv1Hln","prNT67X3uy","uupzkMkgy8","JXljWUlU3M","Z4I1vyluBx","AIYUuWaWsv",
+"Yh1hF7lUXZ","nlaByyvOMI","Q6hMCvkCHH","KsjRKulk41","zbIYYCNHmv","LbRTH7X3uy","QChxsHlUbF","07n1chYBCK","qQxHPyofH3","lkMUAzbIYY",
+"JXljW0BmCy","5Mg9r7fsYM","xciqpVBjhz","DcpWBOHaBz","fmIK1CK5W7","7fKYUlkMUA","SmGzvciuWz","cQOnvAmdQd","Ul4a1rz7Ut","fcwDagdQsS",
+"cmXIXjfREu","HfyNQ9y4lw","QnJ1SC2Irc","hYBCKFLsph","BpYhVChuy3","UmaEvlViBv","5nmWvydG8U","hYBCKuQIcz","atef2RsQUq","MojnP55rfB",
+"yEfy9pFrrl","VjCZqcL0aE","LewvMVerEA","blLA9aez9y","lm0pDfmIK1","1v5hHVjCZq","AgJHQK20wK","lViBvF6PT2","P6bcggf8rI","Dz1R3KASQ8",
+"n1pmOzmLYD","hUTw7Rxrsm","Ta8f6v8yFN","dhSuHMezSW","vkCHHAkKTk","M6qcGFFDui","Oz8yZvLsmS","yofH3SmGzv","1LB1LlCMxy","7Ow5C8U2nU",
+"rz7UtjSjS3","TXQ0Z5ZaEz","IBe8k29QAz","AgJHQUvlv4","dQ586MK07Y","MmsIo7ku1p","W7cTsECMvU","O3iyQVBjhz","VjCZqfLNg8","FVMxodpe1v",
+"rhl0JFNYIM","FxX9qQWxoT","ydG8UCqqaD","HP433UmaEv","2ZHdk9XyT9","IjTwPAgJHQ","2DREs5ZaEz","zQt6QiwzGk","blLA9ZhwG1","IBe8kydG8U",
+"JRJQBuN6r3","RACujfmIK1","zqH0Wdpe1v","5Mg9rMaJQs","TwanoBGaQY","jzUqRtlILt","mz8gxF6PT2","k85AeEdBKc","Mkgy8o8Uyd","WmadAtvdkD",
+"a00b5uQIcz","IRh48faHir","m4bxUCp3mZ","djsrvNOHsz","faHirDcpWB","fmIK1zFgtB","GXdoHRxrsm","mz8gxv2eC3","v1HlnqQxHP","t98iW0h1b1",
+"brhlQh1zcH","8U2nURkQke","48cHLFNYIM","MojnPtaOXK","5NammWPmlx","7fKYU4QMc9","xXTI4Chuy3","jzUqRhUTw7","xXTI4RACuj","ogLgcm4bxU",
+"6q6L9aDGtS","Waim68hJdt","QWxoTBpYhV","cQOnvsuY4x","ThjNnDG4sT","ZzJHWcmXIX","lpF6WGXdoH","FwEJzKASQ8","he9IAVjCZq","zz4ZUd85a9",
+"dmoS7x3LDe","ReKEWHRxd8","CNHmvYjB9t","DLhzMKr8ys","S2Dfuix74r","ciuWz2ZHdk","ksJbyNOHsz","9rlg9Q6hMC","jfREuwDajX","9y4lwGrDg7",
+"RxrsmxReec","sx5GlWmadA","0ao3lx3LDe","lXFOBjfREu","KZamHD6rBy","RkQkeEdBKc","Chuy3JkzUn","ZUnqtCqqaD","SWfouaDGtS","SWfouMkgy8",
+"qaofNksJby","UlU3MFVMxo","h1zcHfmIK1","B3qemSWfou","0MR5Xulk41","lH1ktdQ586","B3qemuZPqg","8TxD7Vprf2","4QMc9UlU3M","faHirjzUqR",
+"i3pyd9eoRc","tlILtvLsmS","lsQGooGu6x","ECMvU5IhmG","BCxeCI7p2a","b29RJprNT6","1j5L8euZA5","M3zXLzbIYY","MmsIokB5nP","tuDySxReec",
+"CqqaD5nmWv","FLsphk85Ae","NAFuwni2v1","zY1GYv2eC3","DcpWB5drc6","VLTy6xXTI4","ECMvUY1mC0","fcwDa5VZjS","LbRTH4dEz6","FLsphUlU3M",
+"Gv3FqUlU3M","atef2AmdQd","piJSkChuy3","EOE1od7vjM","lm0pDuTacx","KsjRKjzUqR","Cp3mZYjB9t","PYBf45iGN5","yEfy9blLA9","zqH0W0MR5X",
+"2TRI7pWiOs","5iGN5zHF1q","QClRLaDGtS","MmsIozFgtB","CqqaD48cHL","RsQUqJJs5m","9XyT9Uvlv4","aDGtSZuDtD","DcpWBuLtKs","L7cGc9XyT9",
+"jtn0Xb29RJ","ni2v1qaofN","yluBxJRJQB","JRJQBRsQUq","StlDJl83Ud","Vprf2a00b5","atef2KASQ8","7Ow5CS2Dfu","AOgEeF6PT2","aez9y6q6L9",
+"ulk41uLtKs","5Drn0aDGtS","0MR5XnnP8o","Z4I1vFnPFB","ZhwG1QWxoT","1v5hHQ6Lix","64s8NuAWyp","JkzUnlViBv","JkzUnRkQke","cL0aEguMb8",
+"NAFuwqaofN","U3yw52Yz7E","RBhp0JkzUn","K4GS8d85a9","JIqXiWMiS3","0h1b19GXkX","MaJQs1LB1L","OUYuF7lUXZ","UlU3M16lHc","29QAz0h1b1",
+"ZuDtDhUTw7","P6bcgK20wK","S77LHlkMUA","1j5L8jS1aj","55rfBEOE1o","0Wr5yuAWyp","fqypyQssNC","In3NSZzJHW","DG4sTlViBv","NOHszAOgEe",
+"6AFT0K4GS8","Q6hMCdpe1v","tuDySfLNg8","9iGoTVNCPd","vkCHHxXTI4","h1zcHblLA9","s93Ml5Drn0","QWxoTlH1kt","QYxC0hi5X7","JkzUnECMvU",
+"hE1QlaL6AJ","mz8gxfcJOy","5drc69y4lw","D6rByOUqFM","1v5hHlsQGo","uvf7AYjB9t","Dz1R3AOgEe","P6bcglm0pD","lXFOBWDVWJ","7fsYMuupzk",
+"lpF6W580YD","pmeCd6q6L9","lkMUAM6qcG","uAWypGXdoH","lj07Q48cHL","bZLvS5Namm","uAWypzHF1q","e6e4z0ao3l","BFkb855rfB","4dEz6YOfrY",
+"NOHszuTacx","ReKEWZzJHW","mX2GEAIYUu","k85Aei3pyd","pv0i7ni2v1","VBjhzgIYvE","HRxd89y4lw","ulk410YAGH","jtn0X1LB1L","tvdkDKr8ys",
+"WaWsvhUTw7","rhl0J07n1c","dmoS7faHir","X6Pin5iGN5","ulk415IhmG","uoStwfqypy","h1zcHFwEJz","6q6L9Zv7z0","gdQsS07n1c","yToGWjSjS3",
+"Vprf248cHL","S77LHRsQUq","GrDg7QClRL","K20wKNAFuw","vkCHH8TxD7","StlDJDLhzM","07n1cpAhR1","FNYIMVjCZq","CxVEfS2Dfu","9iGoTyvOMI",
+"ciuWzhUTw7","9XyT9uvf7A","dmoS7suY4x","7hyVvaDGtS","RpBQmgtCA5","hYBCK5drc6","BbwgAuPX7G","OUYuFnnP8o","5Drn0kB5nP","5IhmGlCMxy",
+"vOqCEi3pyd","lCMxysuY4x","No0QbU3yw5","ogLgclXFOB","i3pydSmGzv","vOqCElpF6W","IKxdL5ZaEz","TXQ0ZvOqCE","iqv4kDz1R3","5iGN55iGN5",
+"ZuDtDOz8yZ","3weIFVjCZq","Yw2oUEOE1o","iwzGkJRJQB","fFDrJuJScX","oGu6xI7p2a","CNHmvQbxXc","ksJbyMmKGJ","VBjhzJJs5m","9iGoTOHaBz",
+"sx5GlFnPFB","fcJOyNo0Qb","hYBCKgtCA5","gdQsSTa8f6","FxX9qGSQwj","jfREuJRJQB","tl72Wuvf7A","pv0i7MaJQs","Q6hMC8hJdt","EdBKcxReec",
+"nlaBytuDyS","7hyVvIn3NS","MmKGJblLA9","wiHrZn1pmO","2hEEUlm0pD","jS1aj1LB1L","FVMxooGu6x","mz8gxdpe1v","JkzUnMm8si","W7cTsyToGW",
+"4QMc9jS1aj","d85a9tvdkD","s93MlJRJQB","9GXkXlCMxy","gjUTu8U2nU","ZUnqt4QMc9","fLNg8ZuDtD","zmLYDJ2mQi","7ku1ptuDyS","X6PinNhXdu",
+"jiVBP64s8N","fLNg8DQimp","L7cGcyluBx","jfREu4QMc9","fLNg8tuDyS","dmoS7FcWrW","Oz8yZdjsrv","FnPFBfLNg8","9iGoTMaJQs","iwzGk4QMc9",
+"mX2GEPOUYS","b29RJgdQsS","piJSkpiJSk","uAWypOz8yZ","WreyP7Ow5C","NhXduoVQp6","YOfrYStlDJ","wiHrZNo0Qb","2Yz7EtjQxs","9rlg9EOE1o",
+"AIYUuCIShG","YjB9tAOgEe","6q6L9BGaQY","EdBKcWaWsv","2ZHdkBCxeC","Z4I1vogLgc","SWfouM6qcG","Kr8ysHzZT8","uZPqgRBhp0","YjB9t2Yz7E",
+"MezSWbgJAz","uZPqguPX7G","hYBCKJJs5m","jSjS3pAhR1","0YAGHVerEA","zHF1qW3VFH","4QMc9jeskS","fcJOy14FLR","v2eC329QAz","7ku1paL6AJ",
+"jfREuuupzk","5nmWvlpF6W","YOfrYWaWsv","pAhR1DLhzM","mX2GEpmeCd","7hyVvqaofN","Q6Lixatef2","9rlg9I7p2a","Uvlv4WaWsv","MGlTFzFgtB",
+"qQxHPWreyP","AkKTkhE1Ql","16lHclj07Q","7X3uy9GXkX","EoToP7Ow5C","vLsmSGXdoH","MK07YYjB9t","B3qemvLsmS","DQimpgf8rI","ZuDtDQnJ1S",
+"ReKEWoQ87r","Twano45cIH","uQIczzmLYD","Z4I1v8hJdt","hi5X70Kyfs","Ss0ZulCMxy","ydG8USmGzv","tvdkDQYxC0","fFDrJFGzgp","FwEJzlsQGo",
+"Yw2oUWmadA","uN6r3dhSuH","Dz1R3suY4x","HP433KsjRK","BbwgAtvdkD","taOXKAgJHQ","Yw2oUSjskQ","taOXKy94nw","MmKGJhE1Ql","0BmCyRmDcr",
+"zHF1qSmGzv","ThjNnm4bxU","v8yFN580YD","FwEJzatef2","9XyT9iKqhr","jfREuX6Pin","HlUbFUmaEv","0PktIvkCHH","uvf7AEOE1o","HfyNQjtn0X",
+"EOE1o7hyVv","KZamHpvgjS","Pb1paJKWYR","yluBxzFgtB","MGlTFRxrsm","BGaQY5drc6","ZuDtDoGu6x","hYBCKQYxC0","d7vjMjfREu","S77LHpT8wu",
+"Yh1hFfmIK1","hE1Ql0MR5X","1v5hHfcwDa","ulk41Waim6","Z4I1vFVMxo","FGzgpFLsph","WmadA0YAGH","d85a9ni2v1","RzaZAaDGtS","QChxspiJSk",
+"FxX9qHP433","iKqhr7lUXZ","s93MlNo0Qb","GSQwjuQIcz","vLsmS14FLR","2TRI7qUJMd","VjCZqL7cGc","8xEKzBbwgA","Rxrsm2ZHdk","M3zXLHlUbF",
+"9XyT9e6e4z","FxX9qP6bcg","taOXKRzaZA","Zv7z00ao3l","Y1mC0ulk41","0Wr5yVprf2","Q6hMC0BmCy","vLsmShi5X7","5nmWvuLtKs","pFrrluN6r3",
+"kZANmEoToP","2ZHdkzY1GY","Zv7z0XyPZN","S2DfuwiHrZ","FxX9qaDGtS","QssNC0MR5X","7lUXZ8RCUA","618Diuvf7A","oVQp6uQIcz","lXFOBQYxC0",
+"kB5nPYf2Ec","SWfouZ4I1v","Vprf2lXFOB","lm0pDcQOnv","F6PT2RmDcr","O3iyQ2hEEU","ru4UGuupzk","WPmlxtuDyS","RpBQm2DREs","9XyT9tAOsr",
+"FFDuiv1Hln","5Mg9rDLhzM","Ta8f6DG4sT","NhXduKASQ8","VIlwPeuZA5","I7p2aM3zXL","QssNCXyPZN","pWiOs0h1b1","1LB1LEoToP","oVQp6POUYS",
+"5Namm5Drn0","okgRirz7Ut","F6PT2QnJ1S","dQ586Waim6","29QAzlH1kt","ogLgcsx5Gl","lweGyni2v1","pAhR18FmFH","B3qemd7vjM","DLhzM3weIF",
+"rKDLJcQOnv","QbxXcpFrrl","NhXdunFqik","KsjRKyvOMI","CdyBVF6PT2","ZUnqtrz7Ut","S2DfuWaim6","BpYhVRzaZA","1j5L8nFqik","KZamHDG4sT",
+"iwzGkGWqqX","NhXdugtCA5","ZUnqtYOfrY","hUTw7618Di","IBe8kaDGtS","Yf2EcVIlwP","lCMxyBCxeC","X6PinbgJAz","OxWIHQworu","WMiS3QChxs",
+"0BmCyMkgy8","ECMvUlH1kt","dhSuH14FLR","ogLgcWreyP","16lHc0PktI","NOHszWPmlx","UmaEv7fsYM","8TxD79GXkX","580YDSbRYy","CIShG7hyVv",
+"C2IrcaDGtS","fmIK1D6rBy","XyPZNyluBx","azIWplsQGo","pAhR1kB5nP","FPfSEHlUbF","hi5X7i7WMQ","VBjhzGXdoH","Dz1R3IjTwP","wDajX2ZHdk",
+"QYxC0zY1GY","WPmlx5nmWv","soy9tIjTwP","Waim6vLsmS","zQt6QOUqFM","hYBCKuLtKs","sx5Gld85a9","MaJQsBGaQY","fcJOyOxWIH","vLsmSIn3NS",
+"RBhp0zz4ZU","wiHrZVBjhz","KZamHK20wK","Yh1hFHfyNQ","pmeCdWaWsv","RmDcrdjsrv","6AFT0AXpwE","ix74rpWiOs","CIShGpWiOs","dmoS7HP433",
+"bgJAznlaBy","h1zcHzFgtB","EdBKcuoStw","zz4ZUuupzk","Yh1hFaez9y","W3VFH6AFT0","EdBKcFVMxo","8TxD70ao3l","Yf2Ecb29RJ","Gv3FqvkCHH",
+"TXQ0Z0YAGH","4dEz6Vprf2","rz7UtM3zXL","NhXdupT8wu","64s8NjzUqR","fcwDat98iW","0MR5XoGu6x","mz8gxZv7z0","iqv4kFVMxo","Q6Lixe6e4z",
+"48cHLuTacx","uupzkVIlwP","CK5W7rKDLJ","ru4UGGrDg7","zbIYYa00b5","VjCZq6q6L9","AmdQd9eoRc","29QAzQWxoT","In3NSqaofN","OUYuFdQ586",
+"WreyP0BmCy","OHaBzWmadA","FNYIMKASQ8","618DiC2Irc","Vprf25VZjS","d85a9taOXK","Fhtgl7lUXZ","nFqikpWiOs","lkMUAhE1Ql","FLsph9y4lw",
+"WPmlxZUnqt","zQt6QFjHXR","CIShGe6e4z","DG4sTrKDLJ","AmdQdbrhlQ","JKWYRpWiOs","xciqpB3qem","KsjRKJ2mQi","azIWpgjUTu","ZhwG1AmdQd",
+"l83Udpv0i7","NAFuw14FLR","uN6r3HP433","a00b5RkQke","EoToPhe9IA","45cIHVerEA","fFDrJjzUqR","7hyVvIKxdL","DQimpIn3NS","8FmFHReKEW",
+"VIlwPv2eC3","Yw2oUAkKTk","TXQ0ZNAFuw","6AFT0uoStw","AmdQdtlILt","HzZT87ku1p","b29RJWaim6","CNHmvsqVrf","uQIcz16lHc","0BmCyBpYhV",
+"MK07YlH1kt","LbRTHokgRi","IRh48jtn0X","GSQwjVBjhz","DQimpJRJQB","rz7UtZJTXH","hSSvQblLA9","L7cGcjfREu","8FmFHdQ586","GSQwjU3yw5",
+"Cp3mZv2eC3","5iGN5ZJTXH","Yw2oUv2eC3","atef2nnP8o","cmXIX5Mg9r","MojnPxReec","MaJQsQChxs","RBhp0VLTy6","soy9tNo0Qb","ReKEWpAhR1",
+"9y4lwfLNg8","0MR5X0h1b1","Cp3mZuZPqg","he9IA0YAGH","m4bxUGXdoH","i7WMQd7vjM","cShY2Mm8si","he9IAzbIYY","VNCPdNAFuw","oGu6xlm0pD",
+"WaWsvQChxs","FwEJzRBhp0","QClRLJRJQB","J2mQifqypy","s7MxkogLgc","No0QbZ4I1v","yluBxOUqFM","7fKYUAmdQd","FPfSE2Yz7E","t98iWKsjRK",
+"9XyT9tlILt","8hJdt9XyT9","aez9yd85a9","BGaQYX6Pin","nlaByB3qem","uQIczjfREu","zz4ZUpT8wu","v8yFN6q6L9","pv0i7KsjRK","guMb8t98iW",
+"CxVEf2ZHdk","EdBKcXflUq","qUJMdfcwDa","B3qemQssNC","iwzGktl72W","yvOMIBbwgA","SWfouCqqaD","y94nwdjsrv","2DREsaL6AJ","tvdkD2Yz7E",
+"HlUbFRxrsm","KZamHMaJQs","J2mQipv0i7","7hyVvtAOsr","YjB9t0BmCy","0BmCyWaim6","Nxx9V0ao3l","QbxXcnlaBy","zFgtBlCMxy","zQt6QKZamH",
+"0Wr5yi7WMQ","aez9yv8yFN","EdBKca00b5","VIlwP2Nslm","vkCHHIKxdL","mX2GEzFgtB","QssNCyEfy9","FLsphFPfSE","rKDLJYOfrY","5IhmGm4bxU",
+"9GXkXblLA9","fmIK1QssNC","Gv3Fq0Wr5y","CNHmvFNYIM","dQ586xReec","tAOsrHRxd8","dpe1vPb1pa","Chuy3QClRL","Ta8f6L7cGc","yvOMICqqaD",
+"14FLR2Nslm","xciqptaOXK","SbRYysx5Gl","TwanopiJSk","oVQp6k85Ae","5Drn0ru4UG","sqVrfSs0Zu","jS1ajHRxd8","vOqCEgf8rI","3otm6ZUnqt",
+"ZhwG15ZaEz","FLsphi7WMQ","fcJOyyEfy9","s7MxkQWxoT","prNT6mz8gx","7X3uydQ586","ru4UGLewvM","uJScXzqH0W","Pb1paU3yw5","W3VFHlweGy",
+"lweGyQClRL","NAFuwEdBKc","vOqCEsoy9t","ru4UGXflUq","Cp3mZOHaBz","iKqhr0PktI","KZamHCdyBV","SjskQ24ARF","pWiOsMmsIo","ReKEWQYxC0",
+"K4GS8rhl0J","tuDyS8cVD3","JkzUnUvlv4","l83UdIBe8k","D6rBybrhlQ","0MR5XF6PT2","6AFT0CqqaD","uupzkCqqaD","pWiOsZUnqt","2DREst59lR",
+"m4bxUsx5Gl","0Wr5y16lHc","i7WMQ5ZaEz","fLNg87lUXZ","gtCA54dEz6","RxrsmCxVEf","ThjNn5IhmG","lH1ktRpBQm","rhl0JRxrsm","uN6r3gf8rI",
+"0Wr5yuN6r3","EoToP9rlg9","WmadACp3mZ","EdBKccShY2","BGaQYQ6Lix","BGaQYprNT6","45cIHOUYuF","kZANme6e4z","FFDuiU3yw5","3weIFIBe8k",
+"lj07QPb1pa","B3qemuvf7A","uoStw0Kyfs","AOgEeG1RhS","0h1b1cmXIX","yvOMIcShY2","9y4lwix74r","jS1ajhe9IA","Yf2EcBpYhV","iKqhr2TRI7",
+"HfyNQXyPZN","lkMUAdhSuH","D6rByxciqp","gf8rIMkgy8","FLsphokgRi","VLTy6Gv3Fq","jSjS38cVD3","8RCUAUvlv4","7X3uyAIYUu","JkzUnCIShG",
+"AkKTk8RCUA","NhXduBFkb8","gIYvE2ZHdk","LewvMgjUTu","jzUqRv1Hln","YOfrYGWqqX","TCgPp5Mg9r","Yh1hFS77LH","FwEJz9GXkX","64s8NAOgEe",
+"brhlQguMb8","48cHLYjB9t","lkMUATa8f6","JKWYRix74r","ksJbyVIlwP","piJSkpT8wu","5VZjSIBe8k","9GXkXs4786","fLNg8s93Ml","Yw2oUkZANm",
+"VIlwP0MR5X","XflUqFwEJz","azIWpru4UG","M6qcG0PktI","2TRI7IBe8k","OUYuFJ2mQi","U3yw5yvOMI","wiHrZ24ARF","2hEEU5Namm","Mkgy8piJSk",
+"a00b5C2Irc","guMb82hEEU","CK5W7FNYIM","Mm8sisqVrf","9iGoTlj07Q","FwEJzF6PT2","Kr8ysNOHsz","qaofNuJScX","yvOMIMK07Y","t59lRL7cGc",
+"0PktIDLhzM","pT8wu4W0Tl","fcwDao8Uyd","Mkgy8U3yw5","8hJdtxciqp","n8pJ9hYBCK","DQimpK20wK","CNHmvGWqqX","16lHc5Drn0","LewvMHlUbF",
+"KASQ8MmsIo","Waim6fcwDa","07n1c16lHc","tuDySFFDui","nlaBy5ZaEz","i7WMQrz7Ut","jzUqRtvdkD","vLsmSU3yw5","v1HlnsuY4x","WaWsvhSSvQ",
+"580YDgf8rI","b29RJ9eoRc","OxWIHYh1hF","No0QbFLsph","gtCA5xReec","FLsphuAWyp","uoStwvLsmS","tvdkDfcwDa","a00b5HlUbF","iqv4kZ4I1v",
+"yvOMIWaim6","CdyBVuvf7A","taOXKFjHXR","HlUbFtjQxs","lkMUAvLsmS","JJs5m07n1c","suY4xprNT6","lm0pD64s8N","GWqqXZ4I1v","pAhR1lweGy",
+"FNYIMgdQsS","xReeciqv4k","ru4UGn1pmO","5ZaEzMK07Y","2TRI7HfyNQ","Nxx9VlViBv","uZPqglCMxy","7hyVvGrDg7","MojnPru4UG","GSQwj618Di",
+"ZuDtD8RCUA","48cHLfaHir","jfREuSWfou","rz7UtOz8yZ","2TRI7FLsph","pvgjSuZPqg","fFDrJMojnP","8hJdtM6qcG","iB08lG1RhS","t98iWOUqFM",
+"RBhp0ydG8U","IBe8ktl72W","OUYuFJIqXi","2Yz7E2ZHdk","2DREsRACuj","I7p2agtCA5","wiHrZ1j5L8","n1pmOMm8si","BbwgAuLtKs","2NslmhE1Ql",
+"Zv7z0Chuy3","QbxXcXyPZN","ciuWzd85a9","lH1ktxciqp","jS1ajNAFuw","OUqFMhYBCK","Ul4a1BpYhV","2ZHdkxReec","D6rByEOE1o","TXQ0ZWPmlx",
+"DQimpGXdoH","VjCZqtl72W","CNHmv5iGN5","blLA9Uvlv4","AXpwE5Namm","EOE1o580YD","k85AeLewvM","BFkb8wiHrZ","FhtglRACuj","0h1b1HfyNQ",
+"WPmlxxXTI4","rhl0JOxWIH","EdBKcW3VFH","FNYIMhSSvQ","24ARFtjQxs","HP433guMb8","Kr8ysQworu","7Ow5CMojnP","8cVD3XflUq","uoStwa00b5",
+"XflUqdpe1v","ZzJHWv2eC3","uupzkTXQ0Z","xReec29QAz","uAWypTXQ0Z","O3iyQ1LB1L","vOqCERkQke","y94nwl83Ud","t98iWzHF1q","JKWYRWaWsv",
+"qQxHP7Ow5C","AmdQdG1RhS","PYBf4IjTwP","5nmWvhE1Ql","pAhR1NOHsz","Zv7z0Mkgy8","NcICAn8pJ9","5iGN5In3NS","FLsphuLtKs","dpe1vsoy9t",
+"gtCA5lpF6W","MmsIo5Drn0","QClRL3weIF","jS1aj9rlg9","cL0aEyEfy9","AkKTkG1RhS","faHirS2Dfu","Pb1paVprf2","ThjNnNo0Qb","nnP8oFPfSE",
+"5iGN5uvf7A","djsrvnFqik","0PktICIShG","FNYIM8U2nU","CNHmvRACuj","yToGWSs0Zu","7hyVvgf8rI","xXTI4CqqaD","fFDrJ45cIH","W7cTs8TxD7",
+"K20wK8FmFH","RxrsmoVQp6","I7p2aLewvM","8TxD7uTacx","zmLYDBpYhV","iqv4kGWqqX","oQ87ri3pyd","OHaBz1v5hH","45cIHEOE1o","AOgEeIRh48",
+"ZhwG1nFqik","K20wKpiJSk","fqypyZJTXH","JIqXiJ2mQi","5drc6Z4I1v","CNHmvQYxC0","tuDySChuy3","ulk41xXTI4","m4bxUYf2Ec","uTacxL7cGc",
+"Nxx9VFwEJz","SjskQGSQwj","ni2v1yEfy9","F6PT2xReec","5Mg9rGWqqX","LDk6fNOHsz","fLNg8JRJQB","dpe1vVprf2","CNHmv9GXkX","kZANmU3yw5",
+"FPfSEYh1hF","iqv4k29QAz","aL6AJWaim6","0KyfspT8wu","NcICAo8Uyd","oQ87rhE1Ql","ZhwG1SbRYy","m4bxU5ZaEz","atef2YjB9t","VerEAIn3NS",
+"BCxeCd7vjM","i7WMQ3weIF","RkQkeYh1hF","fLNg807n1c","ThjNn5drc6","tuDyS5Namm","F6PT2RACuj","8hJdtlViBv","XflUqBbwgA","SmGzv24ARF",
+"uQIczgdQsS","YOfrYHfyNQ","5VZjSguMb8","e6e4zyluBx","yofH3Y1mC0","uTacxVIlwP","jSjS3LDk6f","0MR5XC2Irc","bZLvSJJs5m","EoToPjS1aj",
+"zY1GYSmGzv","RACujYf2Ec","jfREuMm8si","euZA5Kr8ys","S77LHKr8ys","7Ow5CyvOMI","8RCUAJRJQB","QssNC4W0Tl","dpe1vMK07Y","GWqqXhUTw7",
+"QChxsogLgc","M6qcGogLgc","tjQxs7X3uy","FNYIM8xEKz","Kr8ysoVQp6","QChxs2TRI7","zHF1qSjskQ","1v5hHdhSuH","FVMxo2Nslm","UmaEvuJScX",
+"aDGtSReKEW","FnPFBIn3NS","Dz1R3blLA9","oQ87rtuDyS","OUqFMGrDg7","4QMc9FwEJz","zQt6QQChxs","4dEz6iB08l","Mm8si2DREs","GWqqXix74r",
+"M6qcGcmXIX","uupzk1v5hH","Yh1hFn1pmO","mz8gxCdyBV","YOfrY7lUXZ","YjB9tYOfrY","yofH3Twano","JJs5mKASQ8","iwzGkru4UG","FFDuituDyS",
+"GrDg7gf8rI","qaofNjeskS","4dEz68cVD3","lCMxyy94nw","RpBQmogLgc","taOXKMGlTF","lweGy5Drn0","MaJQsVBjhz","cmXIXFnPFB","3otm6LbRTH",
+"FwEJzpT8wu","VLTy6t98iW","VBjhzs7Mxk","zHF1qv8yFN","1LB1LS2Dfu","0PktIokgRi","SbRYybgJAz","jfREugdQsS","zqH0WpvgjS","FGzgp4QMc9",
+"9iGoTeuZA5","WPmlxVNCPd","XflUqGrDg7","FFDuiFLsph","prNT6GWqqX","J2mQik85Ae","7hyVvtlILt","GSQwjh1zcH","S2DfuqQxHP","RBhp0ix74r",
+"2DREsIRh48","uZPqgG1RhS","5drc61j5L8","Yh1hFpFrrl","RACujuPX7G","W3VFHTXQ0Z","Oz8yZ07n1c","FNYIMkB5nP","16lHcC2Irc","VIlwPJJs5m",
+"dpe1vix74r","ZUnqtjeskS","jS1ajt98iW","jSjS3FNYIM","tvdkDsx5Gl","QWxoTogLgc","n1pmOlkMUA","Ss0ZuVBjhz","SWfouQ6Lix","iKqhr9iGoT",
+"LDk6fhe9IA","Ss0ZuuPX7G","POUYSTwano","yvOMIpvgjS","FjHXRzHF1q","pv0i7zHF1q","RkQkeFnPFB","FjHXR2Nslm","soy9tZ4I1v","B3qema00b5",
+"tlILtRkQke","AOgEeZv7z0","uN6r3IRh48","Uvlv4RkQke","FxX9qVNCPd","29QAzThjNn","s4786blLA9","5Nammv2eC3","XflUq8xEKz","D6rBygtCA5",
+"W3VFH4QMc9","yofH3Q6Lix","cL0aEfmIK1","uupzkX6Pin","oVQp6ni2v1","VNCPdJJs5m","FcWrWokgRi","Z4I1vhYBCK","Dz1R3StlDJ","AXpwEIn3NS",
+"Zv7z0cL0aE","0Wr5yS2Dfu","rhl0JcQOnv","FFDuiOUYuF","DQimp0h1b1","tuDyS5Mg9r","Vprf2Zv7z0","yToGW14FLR","tuDyS14FLR","QChxsvLsmS",
+"29QAzo8Uyd","uN6r3RBhp0","djsrvoGu6x","1LB1LyluBx","Q6LixQ6hMC","RACujCp3mZ","rz7Ut6q6L9","blLA9FPfSE","brhlQs7Mxk","VjCZqAIYUu",
+"QbxXcHfyNQ","M3zXLlCMxy","pT8wuhe9IA","7hyVvVerEA","7hyVvdmoS7","jfREuPOUYS","Cfgr36q6L9","DcpWBUlU3M","U3yw5zmLYD","7X3uylsQGo",
+"MojnPkZANm","m4bxU9rlg9","yToGWokgRi","CxVEfKsjRK","Ta8f67hyVv","3weIFMmKGJ","IjTwPEdBKc","ksJbypiJSk","FVMxozQt6Q","5drc6C2Irc",
+"618Di5drc6","s7Mxk7fsYM","fqypyuJScX","MojnPYw2oU","ogLgc8U2nU","QYxC0FwEJz","pmeCd6AFT0","ru4UGlj07Q","5drc68U2nU","cmXIXVIlwP",
+"e6e4zxXTI4","uAWypguMb8","SjskQNOHsz","pT8wum4bxU","J2mQiThjNn","RsQUqRBhp0","soy9t16lHc","iKqhrIn3NS","pWiOsJIqXi","9GXkXaez9y",
+"ix74r0Kyfs","SmGzvNAFuw","AmdQdUvlv4","prNT67fsYM","Ta8f6J2mQi","FFDuiguMb8","Yh1hF5nmWv","AXpwE7hyVv","8xEKzrhl0J","L7cGcQYxC0",
+"K4GS8FnPFB","cmXIXa00b5","fcJOy2Yz7E","6AFT0cQOnv","iB08lpiJSk","QChxsZuDtD","7fsYMRmDcr","IRh48618Di","uZPqgVNCPd","DG4sTFjHXR",
+"UlU3MguMb8","atef2Pb1pa","azIWpTXQ0Z","2TRI7vLsmS","RzaZAReKEW","Uvlv4euZA5","YjB9tNhXdu","AgJHQzqH0W","RzaZACdyBV","iB08lSjskQ",
+"7lUXZpv0i7","VIlwPS2Dfu","8xEKz07n1c","3otm6suY4x","vkCHHlH1kt","FjHXRTwano","HlUbFsoy9t","5nmWvix74r","uJScXOUYuF","45cIHOHaBz",
+"POUYSEOE1o","Pb1padhSuH","TCgPpOUYuF","Cfgr3wDajX","pv0i7JRJQB","WPmlxQbxXc","7Ow5CCIShG","5iGN58U2nU","pv0i7EoToP","vOqCEkB5nP",
+"fFDrJulk41","RmDcrCfgr3","Qworue6e4z","Twanoaez9y","zmLYDru4UG","aDGtS4QMc9","0YAGH6AFT0","tlILt0ao3l","pAhR1FFDui","0Wr5yuoStw",
+"NAFuw5IhmG","ThjNnlH1kt","s7MxkMGlTF","o8UydGXdoH","EOE1oFxX9q","DG4sTzFgtB","rKDLJd85a9","sqVrfhSSvQ","55rfBOxWIH","Dz1R3D6rBy",
+"zHF1ql83Ud","azIWpwDajX","No0QblsQGo","M3zXLi3pyd","fmIK1CdyBV","b29RJReKEW","1j5L8jzUqR","rKDLJJXljW","ogLgcMGlTF","BpYhVJ2mQi",
+"UlU3MTXQ0Z","IRh482Yz7E","VIlwPWMiS3","pT8wulweGy","8TxD7FwEJz","ReKEWaez9y","45cIHLDk6f","W7cTsfcwDa","4QMc9ThjNn","cL0aEo8Uyd",
+"Pb1paHlUbF","FGzgpSWfou","U3yw5ix74r","uoStwhE1Ql","UlU3MBGaQY","s4786SjskQ","aDGtSi7WMQ","VBjhzGWqqX","POUYSaL6AJ","dhSuHqaofN",
+"Gv3Fq0BmCy","nlaByG1RhS","nFqikSWfou","yofH3CNHmv","CIShGECMvU","FnPFBChuy3","3weIF1v5hH","FLsphMezSW","n8pJ9QssNC","n1pmOTXQ0Z",
+"14FLR14FLR","ZUnqtl83Ud","P6bcgFLsph","IKxdLjfREu","48cHLyluBx","i7WMQ2ZHdk","I7p2aoQ87r","v1HlnK4GS8","WmadAfLNg8","n8pJ94dEz6",
+"t59lR5drc6","OUqFMhE1Ql","Yw2oUG1RhS","0YAGHtvdkD","MmKGJEoToP","uLtKsvkCHH","8xEKzydG8U","ni2v10h1b1","BGaQYZhwG1","JJs5mZUnqt",
+"vLsmS1v5hH","PYBf4JJs5m","zqH0WYh1hF","S2DfupAhR1","CNHmvJXljW","FhtglC2Irc","gdQsSRBhp0","6q6L9dhSuH","fLNg8SmGzv","n8pJ9tjQxs",
+"Mm8sin8pJ9","0ao3lwDajX","CIShGaFFss","PYBf4tl72W","Yw2oUY1mC0","POUYS2Nslm","9rlg9FnPFB","xReecxXTI4","pWiOszFgtB","xciqpiB08l",
+"Oz8yZ4QMc9","RmDcra00b5","fLNg8AmdQd","X6PinEOE1o","D6rByrz7Ut","HlUbFtAOsr","pT8wu618Di","S2DfuZJTXH","gf8rI5VZjS","F6PT2EOE1o",
+"tlILtzQt6Q","Q6hMCOUYuF","Twano64s8N","K20wKPYBf4","2TRI7AIYUu","ix74rS2Dfu","dpe1vL7cGc","pv0i7GrDg7","Cp3mZzQt6Q","ydG8UQYxC0",
+"v1Hln3weIF","AXpwEciuWz","3weIFWDVWJ","t59lRAgJHQ","5iGN5Z4I1v","s4786Pb1pa","piJSkxXTI4","pT8wuciuWz","AgJHQVIlwP","IKxdLjS1aj",
+"vOqCEFhtgl","2NslmhUTw7","lCMxyhE1Ql","K4GS8Kr8ys","16lHcMm8si","uLtKskB5nP","yToGWdpe1v","taOXKiwzGk","VLTy6NAFuw","5IhmGAmdQd",
+"6q6L99eoRc","Pb1paatef2","WPmlxydG8U","StlDJ2Yz7E","iKqhrFhtgl","7X3uyJkzUn","n1pmO7Ow5C","HfyNQx3LDe","ZhwG13otm6","TwanoSmGzv",
+"F6PT2HfyNQ","UlU3MhE1Ql","UlU3MdQ586","FVMxoksJby","Gv3FqEOE1o","DcpWBYOfrY","rhl0J0Kyfs","o8UydIKxdL","ni2v1yvOMI","he9IAlViBv",
+"BFkb89y4lw","FLsphThjNn","7Ow5Cy94nw","bgJAz0Wr5y","CxVEflkMUA","0KyfsydG8U","FPfSEzHF1q","8U2nU8TxD7","tvdkDHlUbF","MmsIo5iGN5",
+"uvf7AC2Irc","XyPZNQ6Lix","rhl0JPYBf4","Chuy30Kyfs","KsjRKP6bcg","i3pyd9GXkX","aL6AJRzaZA","lpF6WyToGW","L7cGcEdBKc","RsQUqQChxs",
+"7Ow5CdQ586","uoStwdpe1v","3otm64dEz6","ciuWztvdkD","Cfgr3d85a9","M3zXLRxrsm","qQxHP8hJdt","IjTwP2Yz7E","MaJQsuZPqg","ECMvUdmoS7",
+"Kr8yszQt6Q","AIYUui3pyd","ZzJHWzmLYD","J2mQilsQGo","Yw2oUgtCA5","7fKYUI7p2a","7lUXZmX2GE","mz8gxRxrsm","vkCHHUl4a1","djsrvlweGy",
+"QWxoTNxx9V","DG4sT5Mg9r","ReKEW07n1c","MojnPAOgEe","jeskSRACuj","oVQp66AFT0","8xEKzzqH0W","FnPFBuPX7G","FxX9qBGaQY","DcpWB0Kyfs",
+"Mm8siyofH3","tAOsr0BmCy","TwanoYjB9t","oQ87rOxWIH","pv0i7xXTI4","jiVBPlsQGo","5nmWvZUnqt","7hyVvReKEW","YOfrYix74r","QChxsP6bcg",
+"v2eC3mz8gx","kZANmcmXIX","n1pmOqaofN","gtCA5VjCZq","aDGtSJ2mQi","n8pJ9uupzk","8TxD7WPmlx","SbRYyRpBQm","vOqCEYh1hF","hSSvQtjQxs",
+"bZLvSQWxoT","WMiS3ogLgc","5drc6RpBQm","8xEKzVerEA","v2eC324ARF","a00b5QClRL","8TxD7JKWYR","lH1ktlkMUA","Nxx9V4QMc9","LbRTHJXljW",
+"HfyNQpmeCd","W3VFHJJs5m","yofH3fLNg8","aez9y2ZHdk","ThjNn7fsYM","zqH0WzbIYY","0h1b1i7WMQ","l83UdFnPFB","DcpWBUmaEv","fcJOyMmKGJ",
+"0h1b1OHaBz","nnP8oyofH3","0PktI8RCUA","xReecjSjS3","ZJTXHHzZT8","Oz8yZyEfy9","suY4xZhwG1","iwzGklsQGo","FFDuiB3qem","RACujQssNC",
+"AIYUuSWfou","8xEKz8hJdt","Z4I1vaez9y","55rfBs4786","Ss0Zupv0i7","K4GS8618Di","C2Ircuupzk","jiVBPcQOnv","uJScX5VZjS","ix74r0h1b1",
+"JIqXigtCA5","d85a9G1RhS","Z4I1v2Yz7E","b29RJC2Irc","7fsYMh1zcH","CK5W7P6bcg","aDGtSdpe1v","QChxsmX2GE","W3VFHgIYvE","fLNg8yluBx",
+"pWiOsWDVWJ","VIlwPGWqqX","Nxx9Vdpe1v","CK5W7HRxd8","ksJbyQChxs","hUTw7blLA9","i3pydlXFOB","NOHszAXpwE","o8UydfcwDa","AkKTkRzaZA",
+"45cIHFVMxo","hSSvQDQimp","lm0pDrhl0J","rz7Utdjsrv","45cIHS77LH","K20wKJIqXi","v2eC3soy9t","0MR5XK20wK","pT8wudhSuH","2Yz7ELDk6f",
+"DQimpcShY2","xXTI4wDajX","D6rBy9iGoT","F6PT2KZamH","0Kyfs7X3uy","07n1cHP433","1j5L8aFFss","M6qcGuAWyp","NOHszOUYuF","AmdQdoVQp6",
+"S2DfumX2GE","KZamH8FmFH","TXQ0ZiwzGk","lj07QblLA9","lj07Q1LB1L","QClRLL7cGc","iB08lVNCPd","aFFssQ6hMC","BGaQYZUnqt","QClRLdmoS7",
+"ZhwG1brhlQ","BbwgAW7cTs","QnJ1StaOXK","uvf7AdhSuH","2hEEUwDajX","HP4333weIF","AXpwEcmXIX","Twanoh1zcH","NcICA9eoRc","VjCZqm4bxU",
+"s93MlJXljW","d85a9xXTI4","Yf2EcoQ87r","euZA5AIYUu","DG4sTs4786","yofH3HzZT8","vOqCEgdQsS","GXdoHgtCA5","8U2nUhSSvQ","VjCZqLewvM",
+"5ZaEzx3LDe","GXdoHMmKGJ","QClRLoVQp6","W7cTszbIYY","9y4lwIjTwP","S2DfuAIYUu","I7p2aatef2","ydG8UDLhzM","hSSvQBbwgA","0KyfsMm8si",
+"AOgEeNcICA","gjUTu4QMc9","Uvlv4S2Dfu","7X3uyMm8si","uPX7GTwano","euZA5MGlTF","ogLgcpvgjS","m4bxUQWxoT","piJSkaez9y","yofH3GXdoH",
+"6AFT07lUXZ","lweGyiB08l","kB5nPD6rBy","9eoRcyofH3","XflUqyEfy9","ZhwG1Yf2Ec","n1pmOnnP8o","FLsphOxWIH","qUJMdCK5W7","MojnPCfgr3",
+"i7WMQ0YAGH","h1zcH0Wr5y","jtn0X8U2nU","LewvMtAOsr","FLsphvOqCE","MmKGJzY1GY","7fsYMs93Ml","lweGytl72W","0PktIqUJMd","UmaEv1j5L8",
+"wiHrZCqqaD","DG4sTNxx9V","VLTy6HfyNQ","rhl0JOUYuF","h1zcHzmLYD","nnP8oRmDcr","DLhzMYf2Ec","ECMvUb29RJ","DQimpS2Dfu","azIWpkZANm",
+"wiHrZi3pyd","QChxshe9IA","v8yFNcShY2","piJSkjtn0X","45cIHWreyP","Uvlv4DLhzM","NhXduSmGzv","DQimpuN6r3","9eoRcPYBf4","tAOsrlH1kt",
+"gjUTuDcpWB","Mkgy8JkzUn","7X3uyuQIcz","2NslmF6PT2","gtCA5jtn0X","Nxx9VCK5W7","5NammHzZT8","ulk41CxVEf","RsQUqnnP8o","uN6r3pvgjS",
+"BpYhVCqqaD","Cfgr3yToGW","VNCPdKr8ys","ZUnqthSSvQ","8FmFHZzJHW","brhlQDQimp","HlUbF14FLR","8RCUAni2v1","hUTw7jtn0X","IjTwPuZPqg",
+"qQxHPzz4ZU","he9IAQssNC","t59lR2DREs","2TRI75IhmG","8hJdt2Nslm","YOfrYBFkb8","X6PinVjCZq","jeskSeuZA5","sqVrfVIlwP","0h1b1U3yw5",
+"VBjhz24ARF","Mkgy8WaWsv","HzZT84W0Tl","pv0i7euZA5","ix74rQworu","AOgEewiHrZ","XyPZNtAOsr","lCMxyn8pJ9","zY1GYCqqaD","FGzgpulk41",
+"WMiS3UmaEv","mX2GEWPmlx","ECMvU580YD","gIYvEcQOnv","pT8wuQnJ1S","yluBxsqVrf","I7p2auupzk","48cHL5Drn0","EoToPAmdQd","7X3uyChuy3",
+"vLsmSksJby","m4bxUjSjS3","Ul4a1iwzGk","guMb807n1c","pmeCdmX2GE","oQ87rEoToP","AgJHQd7vjM","MK07YRpBQm","uLtKsECMvU","VNCPdbgJAz",
+"VNCPdBGaQY","DLhzMCxVEf","B3qemfmIK1","CNHmvtvdkD","7Ow5CbgJAz","HzZT8v2eC3","45cIH0MR5X","GrDg7ru4UG","gdQsSaL6AJ","vOqCEKsjRK",
+"MaJQsuTacx","CNHmv2hEEU","IjTwPvLsmS","NAFuwsqVrf","yEfy9VNCPd","0YAGHQYxC0","nlaBy7hyVv","vkCHHDcpWB","WDVWJjfREu","BpYhVFLsph",
+"14FLR2ZHdk","ECMvUJJs5m","zmLYDO3iyQ","vOqCEydG8U","oVQp6lH1kt","D6rByZJTXH","VIlwPS77LH","9y4lwfFDrJ","XflUq48cHL","5Mg9rtjQxs",
+"CxVEfBGaQY","uN6r3hUTw7","Vprf2Cp3mZ","14FLRYh1hF","ZUnqt7hyVv","s4786n8pJ9","8xEKz7Ow5C","AmdQdzY1GY","6AFT0CdyBV","taOXKoGu6x",
+"HRxd8cmXIX","B3qemv8yFN","zY1GYDG4sT","jfREu4dEz6","hSSvQ8FmFH","VjCZqUl4a1","55rfBfFDrJ","suY4x580YD","pmeCdHfyNQ","jtn0XMK07Y",
+"pv0i7guMb8","pvgjSAkKTk","XyPZNnlaBy","zqH0WfcJOy","ix74r0Wr5y","In3NSM6qcG","b29RJY1mC0","oGu6xaFFss","ECMvUVjCZq","8cVD3cQOnv",
+"48cHLBpYhV","FNYIMuoStw","CK5W7ix74r","v1HlniKqhr","WreyPRzaZA","UmaEvMaJQs","pWiOs1LB1L","xciqpxReec","IRh48FxX9q","C2Irc5Mg9r",
+"fmIK1jzUqR","fFDrJTXQ0Z","yEfy9cQOnv","yEfy9k85Ae","X6PinW7cTs","GWqqXQWxoT","CxVEfDLhzM","FxX9qUlU3M","WreyPWMiS3","jSjS3jiVBP",
+"ZUnqtKr8ys","X6Pin55rfB","gf8rIpT8wu","Nxx9VXyPZN","tlILtdQ586","7fsYMjSjS3","x3LDeDcpWB","ru4UGokgRi","zFgtBkB5nP","1j5L8JXljW",
+"CK5W7hE1Ql","Nxx9Vdjsrv","BpYhVIBe8k","TCgPpjtn0X","xXTI4hSSvQ","hUTw7s93Ml","Ss0ZuMK07Y","Q6hMCgtCA5","AgJHQ5drc6","D6rByP6bcg",
+"jzUqRtl72W","blLA9UlU3M","FhtglCxVEf","jiVBPX6Pin","I7p2ahSSvQ","Waim6OUqFM","h1zcHuAWyp","48cHL8FmFH","Yw2oU7fsYM","ksJbyGWqqX",
+"n8pJ9FcWrW","hi5X7yofH3","aDGtSv2eC3","ThjNnfqypy","aFFssCqqaD","AmdQdYjB9t","LDk6ftvdkD","RpBQmPb1pa","v2eC3VerEA","dpe1v2DREs",
+"aez9yaDGtS","0ao3lmz8gx","VIlwPZuDtD","Y1mC0Cp3mZ","taOXKqUJMd","fmIK1cQOnv","aFFssblLA9","CNHmvxReec","0PktIPYBf4","BCxeCi3pyd",
+"Ul4a1RpBQm","fmIK1x3LDe","aez9y7fsYM","FGzgpK20wK","J2mQi7fKYU","K20wKwiHrZ","ru4UG55rfB","lsQGoQYxC0","aDGtSUlU3M","X6Pinuupzk",
+"Ul4a1l83Ud","zbIYYOUYuF","FnPFBMezSW","y94nwaez9y","L7cGcn8pJ9","n8pJ916lHc","WmadArz7Ut","UmaEvJkzUn","kZANmxReec","ZhwG1oVQp6",
+"Nxx9VfLNg8","ZUnqtFxX9q","i3pydXyPZN","ksJbyD6rBy","ZJTXHhe9IA","VBjhzB3qem","VerEA7lUXZ","3otm6O3iyQ","XflUqs93Ml","nnP8oJKWYR",
+"MK07YJKWYR","jSjS38RCUA","MaJQs7fKYU","C2IrcYw2oU","fLNg88cVD3","hYBCKpWiOs","BFkb8he9IA","tvdkDbrhlQ","lm0pDb29RJ","QChxsSWfou",
+"lm0pDfcwDa","d85a9lViBv","5Drn0okgRi","lH1ktRmDcr","3weIFThjNn","HP433JJs5m","x3LDe2hEEU","Chuy3Fhtgl","OUYuFtlILt","2DREsSmGzv",
+"5IhmGCdyBV","KASQ8mX2GE","5Drn07fsYM","y94nw5nmWv","uTacxprNT6","NcICA4W0Tl","2ZHdk1j5L8","tl72WhUTw7","lsQGowDajX","sx5GltaOXK",
+"rKDLJgIYvE","U3yw51j5L8","XyPZNIKxdL","vOqCEzmLYD","8hJdtn8pJ9","uTacxazIWp","VLTy6CIShG","C2IrclsQGo","xciqpFcWrW","dQ586oQ87r",
+"CIShGlweGy","RsQUqvOqCE","7ku1pMaJQs","VIlwP5iGN5","JJs5mB3qem","uZPqgW7cTs","hSSvQLewvM","EoToPksJby","5Drn016lHc","StlDJmX2GE",
+"tuDySkZANm","BGaQY5Drn0","pAhR1prNT6","9XyT9OxWIH","I7p2ahe9IA","k85AeqUJMd","vkCHH9GXkX","iB08lSWfou","pmeCd5Mg9r","mX2GErhl0J",
+"7fsYMQClRL","7ku1p64s8N","cmXIXW3VFH","YjB9tfcwDa","Gv3Fqe6e4z","hYBCKyToGW","Twano8cVD3","ZuDtDQChxs","lkMUA8cVD3","sqVrfguMb8",
+"Ta8f69y4lw","pvgjS2Yz7E","9rlg9blLA9","atef2LewvM","vkCHHJRJQB","yvOMIGSQwj","cL0aEhi5X7","v1Hln5IhmG","rKDLJ9XyT9","aDGtSzHF1q",
+"Mkgy8In3NS","Twanohi5X7","yEfy9ThjNn","3weIFn8pJ9","hi5X7FnPFB","ulk4114FLR","x3LDeWPmlx","GrDg7xXTI4","9y4lwaDGtS","blLA9Twano",
+"VBjhzv2eC3","lweGyxReec","jSjS3uupzk","8xEKzFnPFB","iqv4klkMUA","KsjRKBFkb8","OxWIHyToGW","bgJAzguMb8","Yf2EcK4GS8","Kr8yszz4ZU",
+"QssNC6q6L9","8hJdtC2Irc","O3iyQzbIYY","dpe1vzqH0W","ZJTXHUlU3M","L7cGclm0pD","l83UdFPfSE","FPfSEDQimp","pv0i73otm6","IKxdLgf8rI",
+"DG4sTIKxdL","MmsIoaFFss","piJSkJkzUn","Uvlv4VNCPd","LewvMCqqaD","nlaBygtCA5","yluBxdQ586","K4GS8Ss0Zu","9rlg9Cfgr3","cQOnv8cVD3",
+"POUYSQssNC","YjB9t2DREs","fcJOytlILt","SbRYyxXTI4","QWxoTKr8ys","16lHcFFDui","qaofNMm8si","EdBKcpv0i7","JJs5mlViBv","lpF6WQChxs",
+"5ZaEzU3yw5","ru4UGP6bcg","B3qemZJTXH","bgJAznnP8o","Fhtglb29RJ","aL6AJi3pyd","RpBQm55rfB","prNT6iB08l","MmsIoO3iyQ","bZLvSuZPqg",
+"y94nwEOE1o","lm0pDNcICA","45cIH7hyVv","yEfy91v5hH","xXTI4VBjhz","5Namm5iGN5","fmIK1ni2v1","lsQGolm0pD","QChxsFjHXR","i7WMQAIYUu",
+"45cIHtAOsr","XflUqIjTwP","Chuy3zqH0W","14FLRrKDLJ","Ul4a1xXTI4","uZPqgsuY4x","CK5W75iGN5","Gv3Fq0ao3l","7X3uy8hJdt","b29RJpvgjS",
+"RkQkefaHir","PYBf4fmIK1","BGaQYCqqaD","okgRiM3zXL","QChxsFnPFB","5NammqaofN","pFrrlCdyBV","5VZjSDz1R3","fqypyTwano","45cIHNxx9V",
+"VerEAoVQp6","aDGtSs4786","hUTw7WPmlx","5VZjSo8Uyd","brhlQVLTy6","JRJQB3otm6","4QMc9AgJHQ","v8yFNUl4a1","AIYUugjUTu","X6PinFhtgl",
+"8cVD3NAFuw","29QAzFPfSE","9XyT9DcpWB","B3qemvkCHH","16lHcsqVrf","s93MltlILt","ix74rSWfou","0BmCyRsQUq","a00b5SjskQ","GSQwjZhwG1",
+"nlaByAXpwE","ix74r29QAz","580YDVLTy6","rKDLJeuZA5","PYBf4M3zXL","yvOMIoVQp6","1LB1LZ4I1v","fcwDaOUqFM","7fKYU55rfB","oQ87r7X3uy",
+"bgJAzQ6Lix","wDajXM6qcG","UlU3MzbIYY","pWiOsuQIcz","vOqCE580YD","OHaBz6AFT0","piJSkW3VFH","Oz8yZDQimp","s4786sqVrf","KASQ8AgJHQ",
+"DcpWBQWxoT","v2eC3FPfSE","2Yz7EwDajX","MaJQsYw2oU","nFqikogLgc","MGlTFfcJOy","kB5nPZzJHW","MmsIofLNg8","vkCHHzbIYY","Pb1paRBhp0",
+"FhtglY1mC0","XflUqQssNC","uJScXvOqCE","pmeCdBCxeC","uQIcz9y4lw","GrDg70ao3l","n1pmOP6bcg","07n1cv1Hln","guMb87fsYM","FPfSE8hJdt",
+"6q6L9uvf7A","t59lRMaJQs","Z4I1vReKEW","OHaBz29QAz","l83UdvOqCE","QChxsgIYvE","X6Pine6e4z","VerEAiKqhr","WPmlxhSSvQ","hi5X7n1pmO",
+"7hyVvB3qem","Mm8si6q6L9","7fKYU8cVD3","d7vjMzHF1q","BpYhVi3pyd","iKqhrECMvU","M6qcGS77LH","8xEKzksJby","cQOnv5drc6","VBjhzblLA9",
+"YjB9t3otm6","Dz1R3MGlTF","POUYS8RCUA","GrDg7uPX7G","s7MxkiwzGk","ZzJHWb29RJ","2TRI7SbRYy","IjTwPt59lR","hSSvQVIlwP","fLNg845cIH",
+"9y4lwBFkb8","nnP8o5ZaEz","0BmCy7lUXZ","CNHmvqQxHP","xXTI42TRI7","FFDuiiB08l","HlUbFuN6r3","VLTy67lUXZ","okgRi2ZHdk","fmIK1jtn0X",
+"Nxx9Vi7WMQ","CNHmv5VZjS","tAOsrpv0i7","OUqFMQChxs","tl72WgjUTu","1v5hHOxWIH","kZANmVBjhz","vOqCE5Drn0","n8pJ9LbRTH","2hEEUpFrrl",
+"I7p2ad7vjM","FPfSEWDVWJ","FLsphkB5nP","Cp3mZo8Uyd","C2IrcYjB9t","9GXkXChuy3","v1HlnjS1aj","soy9ttl72W","djsrvGv3Fq","KASQ8zY1GY",
+"fFDrJ5nmWv","LDk6f64s8N","7hyVvY1mC0","QWxoTIjTwP","ECMvUL7cGc","s4786hi5X7","s7MxkCK5W7","WreyPHfyNQ","8cVD3U3yw5","Q6hMCRBhp0",
+"EOE1ok85Ae","bZLvSCxVEf","B3qemBGaQY","fcwDauLtKs","uTacxBbwgA","vOqCE5VZjS","StlDJrhl0J","FPfSE0h1b1","mX2GEGrDg7","FxX9qt59lR",
+"MezSW7X3uy","v2eC3MojnP","lsQGojS1aj","CdyBVix74r","iKqhrAXpwE","oGu6xOUYuF","L7cGcKr8ys","2ZHdkJXljW","QnJ1SuLtKs","mX2GE45cIH",
+"lweGyyEfy9","M3zXLOxWIH","LDk6fWaWsv","U3yw5Vprf2","5Mg9rAmdQd","WreyPprNT6","FcWrWlm0pD","W3VFHlViBv","prNT6QYxC0","uvf7A5iGN5",
+"9y4lwGSQwj","lpF6WZUnqt","yvOMI55rfB","hi5X7yToGW","VjCZqzz4ZU","LewvMEOE1o","jiVBPSWfou","iqv4kfaHir","UmaEvuPX7G","O3iyQuvf7A",
+"ThjNnl83Ud","B3qemokgRi","iKqhrmX2GE","K4GS8TXQ0Z","sqVrfOUYuF","BFkb8BCxeC","fmIK1KASQ8","8U2nUWMiS3","d7vjMvLsmS","VerEAxciqp",
+"s93Ml9XyT9","pv0i7taOXK","zmLYDcQOnv","KZamH29QAz","qaofNRBhp0","HzZT8fmIK1","AOgEe1j5L8","brhlQ7hyVv","P6bcgIRh48","24ARFe6e4z",
+"0KyfsS2Dfu","5nmWvx3LDe","ciuWzt98iW","aL6AJrz7Ut","xXTI4FwEJz","HRxd8Cp3mZ","29QAzd7vjM","sx5Gl0PktI","0h1b1S2Dfu","7fKYUK20wK",
+"2TRI7ZzJHW","OxWIHHlUbF","mz8gxSjskQ","Yw2oUCNHmv","nnP8o2hEEU","JJs5m5nmWv","9eoRc4QMc9","6q6L9G1RhS","7ku1pWreyP","pFrrlFFDui",
+"pT8wuMK07Y","zqH0WM6qcG","s7MxkiKqhr","EOE1oLDk6f","5Namm4W0Tl","7lUXZFGzgp","Z4I1vMkgy8","HlUbFblLA9","TXQ0ZHRxd8","JKWYRpFrrl",
+"Waim6uTacx","DLhzMCqqaD","nnP8oQYxC0","ECMvUzFgtB","yvOMI2TRI7","1v5hHjiVBP","QWxoT2ZHdk","iB08lqQxHP","J2mQiuvf7A","5drc6Qworu",
+"HRxd88xEKz","euZA5RkQke","WPmlxhi5X7","ru4UGS77LH","MmsIozbIYY","v1HlnB3qem","X6PincL0aE","9GXkXzmLYD","J2mQiPYBf4","cmXIX2DREs",
+"NAFuwpvgjS","jS1ajk85Ae","EdBKcdQ586","RsQUq0BmCy","gf8rI2TRI7","cL0aE64s8N","rKDLJlm0pD","WDVWJokgRi","LDk6fGrDg7","d7vjMtlILt",
+"sqVrfY1mC0","U3yw5gtCA5","7Ow5CWaim6","uJScXQbxXc","580YDL7cGc","iKqhrOxWIH","K20wKuQIcz","tuDySZhwG1","Oz8yZqaofN","zmLYDpT8wu",
+"ZhwG1Fhtgl","BpYhVgdQsS","uvf7AGrDg7","s7MxkEoToP","FxX9qSbRYy","aFFsscmXIX","K20wKIn3NS","Pb1pakB5nP","FPfSEWaWsv","zz4ZUdmoS7",
+"NAFuwy94nw","W7cTsJXljW","Waim6GSQwj","2hEEUVprf2","cQOnvfqypy","jfREuSbRYy","pWiOs9y4lw","NAFuwyluBx","hE1QlcL0aE","I7p2a2Yz7E",
+"0BmCylj07Q","pT8wuuupzk","VNCPdzz4ZU","RBhp0nnP8o","blLA9VIlwP","Cfgr3pv0i7","RxrsmWreyP","9GXkXbZLvS","h1zcHKZamH","jS1aj1j5L8",
+"Gv3FqciuWz","ksJbyokgRi","5Mg9r7hyVv","JkzUnThjNn","VIlwPVBjhz","8RCUAWreyP","lH1ktOUqFM","IRh48DLhzM","d85a9CdyBV","Cfgr3BFkb8",
+"dmoS7ZUnqt","NhXdu580YD","9eoRc8hJdt","CNHmvsx5Gl","WPmlx4W0Tl","Nxx9VBFkb8","K20wKVLTy6","O3iyQ0PktI","G1RhS0BmCy","vOqCEVprf2",
+"5IhmGksJby","GXdoHuQIcz","ZUnqtvkCHH","gtCA5l83Ud","vLsmSsuY4x","QWxoTi3pyd","MojnPMmsIo","AOgEeZhwG1","0Wr5y2Yz7E","suY4xvLsmS",
+"gtCA58xEKz","BpYhV0YAGH","n1pmOcQOnv","guMb8VIlwP","jS1ajI7p2a","fmIK1In3NS","0BmCyVNCPd","VLTy6CdyBV","CNHmvWaim6","8RCUAsqVrf",
+"IBe8kYOfrY","BCxeCbgJAz","t59lRy94nw","Dz1R38U2nU","OUYuFKASQ8","aez9yYOfrY","0YAGHGSQwj","dmoS7uoStw","v2eC35Mg9r","zQt6Qiqv4k",
+"M6qcGReKEW","48cHLC2Irc","n8pJ9sqVrf","e6e4zi3pyd","i3pydRBhp0","ZUnqtgtCA5","ZhwG1YjB9t","Pb1pav8yFN","ulk41djsrv","Nxx9VaFFss",
+"GSQwjJKWYR","OHaBzm4bxU","8hJdtksJby","Yw2oUlXFOB","fcJOyWaim6","JKWYRFVMxo","lpF6WbZLvS","9eoRcoVQp6","Gv3Fqy94nw","9GXkXsoy9t",
+"azIWpZhwG1","Cp3mZGv3Fq","zqH0WpWiOs","BCxeCsuY4x","he9IARACuj","sqVrfK20wK","TXQ0Zpv0i7","dmoS79iGoT","CNHmvJkzUn","uZPqgGWqqX",
+"iqv4kY1mC0","ReKEWNo0Qb","VBjhzKsjRK","JkzUnRxrsm","cmXIXWreyP","NhXdudQ586","djsrvSmGzv","HzZT8ciuWz","9y4lwECMvU","0Wr5yL7cGc",
+"gIYvEzFgtB","b29RJ7hyVv","zY1GYIBe8k","S2DfuLbRTH","s4786nFqik","gjUTuFjHXR","Ul4a1IKxdL","7lUXZo8Uyd","5Drn064s8N","s93MlVLTy6",
+"xXTI4uZPqg","7lUXZiKqhr","VLTy6GWqqX","rhl0JlpF6W","oQ87rFFDui","QWxoTAmdQd","RxrsmfaHir","FLsphksJby","lViBvNAFuw","wDajXFPfSE",
+"yvOMInlaBy","BGaQY2Yz7E","Ul4a1AOgEe","Chuy3lkMUA","5Drn0JRJQB","AXpwElViBv","ulk41gdQsS","Ta8f6BGaQY","W7cTsOxWIH","bgJAzJ2mQi",
+"pWiOsGXdoH","LbRTHkZANm","IjTwPaFFss","7ku1p7lUXZ","FNYIMUl4a1","GSQwjBFkb8","pT8wuoVQp6","Ul4a114FLR","hSSvQdhSuH","o8UydvOqCE",
+"wiHrZgjUTu","nnP8oAOgEe","VLTy6x3LDe","uTacxFcWrW","Q6LixMmsIo","DLhzMIBe8k","8U2nUYh1hF","YOfrYazIWp","uTacxcShY2","ksJbyprNT6",
+"No0Qbh1zcH","FGzgpgdQsS","ydG8UFNYIM","uAWypWaim6","F6PT21j5L8","Zv7z0tl72W","5NammyofH3","lpF6WwDajX","NcICAGXdoH","RpBQmqUJMd",
+"WMiS3SjskQ","FLsphHfyNQ","l83Ud2Yz7E","l83UdIKxdL","l83UdXflUq","CIShGFPfSE","5IhmGrz7Ut","tjQxsdmoS7","xReec8FmFH","CxVEfBbwgA",
+"gIYvElm0pD","suY4xaDGtS","iqv4kM3zXL","t98iWSmGzv","ZUnqtguMb8","CqqaD8FmFH","Ul4a1sqVrf","OUqFMMmKGJ","0PktIs4786","uPX7GDz1R3",
+"jiVBP2hEEU","Yh1hFSmGzv","lViBvCqqaD","fFDrJ2Nslm","OxWIHhE1Ql","he9IAM6qcG","Waim60Kyfs","2NslmGWqqX","v1Hln7fKYU","PYBf4euZA5",
+"RkQke9XyT9","8cVD3ZJTXH","IRh48wiHrZ","2Nslm8hJdt","FwEJzStlDJ","yToGWEoToP","iKqhrhi5X7","tAOsrLDk6f","oGu6xGrDg7","FVMxo7Ow5C",
+"yvOMIRxrsm","IKxdL1LB1L","580YDRpBQm","3weIFVIlwP","D6rBygjUTu","Gv3FqMmsIo","d7vjMW7cTs","C2IrcL7cGc","jSjS3jtn0X","b29RJNcICA",
+"PYBf4uAWyp","580YDv8yFN","fLNg8Ul4a1","48cHLRkQke","dQ586brhlQ","4QMc9Kr8ys","LewvMS77LH","Waim6JIqXi","Cp3mZHRxd8","VIlwPY1mC0",
+"CxVEftlILt","i3pydNhXdu","KZamHi7WMQ","JKWYRVjCZq","GXdoHpmeCd","aez9yQWxoT","U3yw5QWxoT","Uvlv45iGN5","OHaBzmX2GE","CqqaDIn3NS",
+"J2mQiFcWrW","4W0TlYw2oU","vOqCE29QAz","B3qemIRh48","iB08lNAFuw","soy9tQ6Lix","pmeCdhSSvQ","IRh48pv0i7","gjUTuW7cTs","2DREszz4ZU",
+"lm0pDzFgtB","VIlwPKZamH","Waim6jtn0X","nlaByK20wK","YOfrY7ku1p","QbxXcRACuj","HP433iKqhr","djsrvPYBf4","hE1QlblLA9","X6PinWMiS3",
+"taOXK7X3uy","jfREuHfyNQ","9GXkX7Ow5C","HfyNQPOUYS","brhlQm4bxU","SjskQ5ZaEz","azIWpoQ87r","LDk6fiB08l","s7MxkNxx9V","4W0TlReKEW",
+"4W0Tl9rlg9","GrDg77X3uy","Mkgy85Mg9r","CIShGIRh48","NhXdu2TRI7","4dEz6F6PT2","YOfrY3weIF","AIYUuYh1hF","uJScXX6Pin","ZJTXHhUTw7",
+"JKWYRX6Pin","GXdoH48cHL","JIqXiTXQ0Z","blLA9HlUbF","CxVEfChuy3","vOqCEprNT6","qUJMdNhXdu","VLTy6S77LH","l83UduZPqg","lkMUAyluBx",
+"e6e4zP6bcg","zFgtBY1mC0","Vprf2uvf7A","PYBf4MGlTF","K4GS8Twano","2hEEU2Yz7E","atef2JIqXi","MmsIoRzaZA","DQimp7Ow5C","KsjRK45cIH",
+"3weIFX6Pin","SjskQk85Ae","FxX9qVprf2","K20wK2DREs","FGzgpuLtKs","iwzGk6AFT0","POUYSd7vjM","5drc6ZuDtD","2TRI764s8N","NhXduzz4ZU",
+"xReecokgRi","YjB9tJkzUn","NOHsz5ZaEz","DLhzMaFFss","o8UydG1RhS","s93MliKqhr","lCMxyRxrsm","M6qcG24ARF","MmKGJpT8wu","OUYuF5drc6",
+"VLTy66AFT0","FVMxo2DREs","uZPqg2ZHdk","vLsmS64s8N","VIlwPHP433","wiHrZJRJQB","ZhwG1OHaBz","9y4lwWreyP","JJs5mDG4sT","IBe8kMkgy8",
+"HRxd8W7cTs","zz4ZUgIYvE","tjQxsM3zXL","XflUqOxWIH","Oz8yZPYBf4","pFrrlOz8yZ","jfREu9iGoT","lH1ktiKqhr","FhtgltaOXK","zqH0WIBe8k",
+"lweGyoVQp6","ulk41NAFuw","Ta8f6G1RhS","580YDpvgjS","7X3uy0YAGH","NOHszWMiS3","MK07YfaHir","FwEJzUvlv4","Oz8yZRmDcr","WPmlxqaofN",
+"fFDrJHRxd8","bZLvSv2eC3","Cp3mZmX2GE","YjB9tv8yFN","5ZaEz4QMc9","cmXIX0PktI","VIlwPVLTy6","FLsphMm8si","RpBQmdhSuH","CdyBVdpe1v",
+"oGu6x7fsYM","soy9tReKEW","KZamHFLsph","EdBKc7fsYM","xReecZzJHW","ZJTXHTwano","5iGN529QAz","qaofNd85a9","oQ87r3otm6","9XyT916lHc",
+"WaWsvJJs5m","gdQsSqQxHP","HP4339eoRc","45cIHRsQUq","wiHrZksJby","WaWsvfFDrJ","CNHmva00b5","t59lR16lHc","ZJTXHStlDJ","RmDcr7Ow5C",
+"LbRTHzz4ZU","5nmWvs93Ml","bgJAzNAFuw","In3NSMezSW","JXljWEOE1o","GrDg7i7WMQ","Gv3FqCp3mZ","LDk6fb29RJ","aL6AJzqH0W","FGzgpiwzGk",
+"VjCZq9eoRc","faHirKr8ys","i7WMQLDk6f","SbRYydhSuH","gtCA5uQIcz","2Nslmk85Ae","cL0aEulk41","vLsmSsx5Gl","hE1QlxReec","qUJMdpmeCd",
+"zHF1qDG4sT","RpBQmuN6r3","JKWYR24ARF","oQ87ruJScX","8FmFHyofH3","aez9ycmXIX","8cVD3tlILt","QYxC0DG4sT","NhXdua00b5","lsQGoaFFss",
+"5Mg9r0PktI","MmsIoaL6AJ","JXljWUl4a1","2DREsvLsmS","48cHLnFqik","jiVBPZuDtD","jtn0XYf2Ec","zbIYY0PktI","fFDrJRxrsm","vLsmSrz7Ut",
+"v2eC3kZANm","mz8gx7lUXZ","tjQxsNhXdu","JKWYRMmsIo","SWfouzY1GY","ECMvUMezSW","VerEA5Namm","In3NStaOXK","Mm8siMkgy8","Yw2oUuQIcz",
+"6q6L9Cp3mZ","RpBQm618Di","ZhwG1CqqaD","AXpwE2Yz7E","07n1cCK5W7","WaWsvn8pJ9","gtCA5YOfrY","LDk6fdpe1v","Chuy3tuDyS","1j5L88xEKz",
+"ulk41kB5nP","QClRL8RCUA","fFDrJBbwgA","gf8rIn1pmO","Ss0ZuoVQp6","GrDg7rKDLJ","nlaBy6AFT0","4W0TlKr8ys","ReKEWYOfrY","prNT6nlaBy",
+"CdyBVaDGtS","RmDcrVLTy6","soy9tVLTy6","0h1b19iGoT","ECMvUYw2oU","dQ586Pb1pa","i3pydB3qem","AXpwEzqH0W","Gv3Fq7Ow5C","16lHcP6bcg",
+"ReKEWjS1aj","CqqaDP6bcg","MojnPvLsmS","CxVEfjeskS","5Drn0fqypy","U3yw5UlU3M","CK5W7fqypy","P6bcgzz4ZU","Gv3FqAOgEe","QYxC0rKDLJ",
+"Qworu0ao3l","MGlTFjtn0X","euZA5HlUbF","zmLYD0MR5X","KsjRKFxX9q","UlU3MRpBQm","SWfouI7p2a","suY4xvkCHH","tAOsrzmLYD","soy9tsoy9t",
+"brhlQS77LH","VBjhzlpF6W","ECMvUM3zXL","zmLYDDG4sT","uLtKsVjCZq","gIYvEiqv4k","tAOsrSmGzv","BFkb8fcJOy","k85AeCxVEf","3weIFhUTw7",
+"5Mg9r6q6L9","3otm6W7cTs","ciuWz1j5L8","16lHcRBhp0","NcICAHRxd8","0YAGHi3pyd","sqVrfni2v1","n1pmOBCxeC","LewvMQnJ1S","cQOnvzbIYY",
+"iB08lChuy3","gIYvE2DREs","ulk41ZhwG1","RkQkee6e4z","okgRiG1RhS","tAOsrb29RJ","yofH38hJdt","ksJbyIjTwP","t59lR580YD","lsQGopv0i7",
+"Ta8f67lUXZ","sx5GlogLgc","Cp3mZcmXIX","BFkb8vOqCE","0KyfsVLTy6","9XyT9BpYhV","Mm8si7hyVv","Vprf2HP433","LewvM5Drn0","5NammMmsIo",
+"gf8rIYh1hF","EoToPdhSuH","HzZT8LbRTH","4W0TlOUqFM","CK5W7SjskQ","HP433nlaBy","29QAzjS1aj","LDk6fGXdoH","qUJMdfmIK1","oQ87ry94nw",
+"Vprf2Yh1hF","SmGzvDG4sT","pT8wufFDrJ","ZhwG1dhSuH","ogLgc5IhmG","l83UdVjCZq","IBe8kqaofN","pFrrl2TRI7","azIWp9XyT9","wiHrZcmXIX",
+"v8yFNNxx9V","RxrsmdhSuH","QssNCnnP8o","2NslmWaWsv","oVQp6ReKEW","U3yw5zY1GY","oQ87rcQOnv","Ul4a18cVD3","DLhzMlXFOB","StlDJguMb8",
+"5Mg9r2hEEU","9iGoTM3zXL","VjCZqJXljW","7lUXZRzaZA","HRxd8ZzJHW","QChxsRmDcr","faHirxciqp","uN6r3UmaEv","AXpwEGWqqX","soy9tI7p2a",
+"RACujuQIcz","SWfouhe9IA","xXTI4OxWIH","DG4sTWaim6","MaJQsZUnqt","9iGoTs7Mxk","07n1cd85a9","QnJ1S7ku1p","WPmlxJIqXi","B3qemFnPFB",
+"LDk6fs7Mxk","0BmCydpe1v","14FLRQChxs","m4bxUFFDui","zbIYYyofH3","tuDySru4UG","RpBQm0Kyfs","CK5W7jS1aj","0ao3lK20wK","4W0TlFjHXR",
+"DLhzMokgRi","7ku1pzbIYY","lweGy7ku1p","gdQsSNcICA","NOHszfcwDa","0Kyfs5drc6","OHaBzEoToP","uZPqgfFDrJ","OHaBzuAWyp","M3zXLLbRTH",
+"UlU3MNAFuw","pmeCd3otm6","wDajXK4GS8","prNT6zqH0W","gIYvEEdBKc","J2mQiECMvU","S77LHjS1aj","v8yFNPb1pa","rKDLJ3weIF","lj07QRsQUq",
+"SjskQW7cTs","x3LDeix74r","Waim6zqH0W","b29RJ5iGN5","VjCZqB3qem","jS1ajCfgr3","tAOsrZuDtD","0Wr5yOUqFM","zY1GYFjHXR","9eoRcBCxeC",
+"ksJbyMaJQs","ix74rnnP8o","pWiOsCNHmv","0Wr5y8hJdt","Oz8yZcL0aE","a00b5Cp3mZ","SmGzvxciqp","e6e4zzHF1q","e6e4z2ZHdk","sqVrf9y4lw",
+"ulk41v8yFN","RkQkeXflUq","lweGyQChxs","FnPFB0Kyfs","lXFOBOUqFM","S2DfuokgRi","XflUqFhtgl","cL0aEFLsph","xReecprNT6","d7vjMB3qem",
+"yvOMIM6qcG","8RCUAOxWIH","M3zXLQbxXc","2TRI75nmWv","ECMvUi7WMQ","14FLRZ4I1v","dmoS7LDk6f","ZJTXH7fsYM","0YAGHt98iW","UlU3McL0aE",
+"RmDcr6q6L9","prNT6jS1aj","D6rByKr8ys","cL0aEAmdQd","5iGN5xXTI4","pAhR10ao3l","uN6r364s8N","jfREuzY1GY","CqqaDsqVrf","pAhR1IBe8k",
+"JXljWuupzk","RmDcruvf7A","AkKTk24ARF","7Ow5Cjtn0X","Pb1paulk41","aDGtS8TxD7","0BmCyqaofN","faHirnnP8o","FLsphJRJQB","vOqCE1LB1L",
+"KsjRKSWfou","fcJOya00b5","7Ow5C8xEKz","jeskSUvlv4","sx5GlMezSW","YjB9tCNHmv","dpe1vReKEW","2NslmAOgEe","RBhp0xReec","hi5X7OHaBz",
+"kZANmAkKTk","FFDuio8Uyd","AIYUuoVQp6","xReeciwzGk","yofH3EdBKc","8RCUAuJScX","yofH3a00b5","8RCUADcpWB","Uvlv4bgJAz","VLTy6vOqCE",
+"jSjS3kB5nP","FcWrWQnJ1S","faHirBbwgA","1LB1LcL0aE","tAOsrRkQke","wiHrZhUTw7","Nxx9VCxVEf","zFgtBfaHir","hE1QlS77LH","0KyfsTCgPp",
+"GXdoH7fsYM","kZANmWDVWJ","9y4lwMK07Y","7Ow5CkB5nP","OHaBzzQt6Q","ZuDtDfLNg8","OxWIHNcICA","BFkb8Waim6","0YAGHiwzGk","580YDlH1kt",
+"ReKEW14FLR","9eoRc29QAz","WPmlxQ6Lix","atef2kB5nP","nlaByfLNg8","fcwDalj07Q","azIWpB3qem","TXQ0ZZUnqt","IjTwPrKDLJ","KsjRKlpF6W",
+"G1RhSFGzgp","lm0pDZhwG1","OUYuFyvOMI","RkQkel83Ud","Uvlv45Mg9r","JkzUntvdkD","kZANmBFkb8","8cVD3WaWsv","1v5hHsx5Gl","Cp3mZ6AFT0",
+"s47861LB1L","NhXduKr8ys","m4bxU14FLR","UmaEv2DREs","zFgtB0Wr5y","jtn0XM3zXL","i7WMQ7fsYM","dhSuHM3zXL","yluBxMezSW","tjQxsv8yFN",
+"b29RJ0Kyfs","dhSuH2TRI7","IBe8k6q6L9","Pb1paAIYUu","0PktIlCMxy","pWiOsZuDtD","e6e4zY1mC0","QWxoTFGzgp","5NammpiJSk","2Yz7EqUJMd",
+"7hyVvKsjRK","BbwgAjtn0X","OUqFMzFgtB","RxrsmpFrrl","Zv7z0Uvlv4","2NslmRpBQm","VerEAUvlv4","FxX9qokgRi","VjCZqQClRL","QYxC0EoToP",
+"NcICAECMvU","okgRiX6Pin","MojnPzFgtB","OUYuFU3yw5","HlUbFfcJOy","fmIK1fmIK1","yEfy9qaofN","Z4I1vlm0pD","Q6LixfcwDa","QssNCSmGzv",
+"VjCZqix74r","WMiS39rlg9","KASQ8EOE1o","RACujNcICA","XyPZNChuy3","zqH0WgdQsS","MmKGJyofH3","okgRieuZA5","uoStwOUqFM","FjHXRatef2",
+"cL0aEQnJ1S","oVQp6OUYuF","v1Hlnv1Hln","fcwDa29QAz","uQIczqaofN","v2eC3AkKTk","WMiS3EOE1o","JIqXi9iGoT","GWqqXDz1R3","s4786JKWYR",
+"cmXIXpAhR1","BpYhV07n1c","m4bxUBCxeC","45cIHyvOMI","piJSkuAWyp","HRxd8rhl0J","5VZjSKr8ys","zqH0WWreyP","yvOMIQClRL","DcpWBQClRL",
+"MK07YxReec","0BmCy9rlg9","wDajXxciqp","uN6r3nFqik","qaofNFnPFB","jiVBPHfyNQ","4W0Tl9iGoT","P6bcg8TxD7","ECMvUNOHsz","lXFOBsuY4x",
+"L7cGc9eoRc","07n1cKsjRK","2DREspFrrl","NAFuwwDajX","16lHc8cVD3","Pb1palCMxy","euZA5djsrv","F6PT2oQ87r","O3iyQOUqFM","IKxdLcQOnv",
+"HRxd8Ss0Zu","atef26q6L9","5iGN5taOXK","fFDrJOUqFM","QbxXcBCxeC","S77LHtAOsr","SWfouF6PT2","JKWYR5VZjS","Ta8f6tjQxs","oGu6x618Di",
+"iB08l6q6L9","ReKEWECMvU","0ao3lcQOnv","AIYUupv0i7","uAWyp9iGoT","b29RJB3qem","wiHrZokgRi","h1zcHIn3NS","bgJAzVNCPd","BbwgAXyPZN",
+"CNHmvMK07Y","uPX7G9y4lw","Gv3Fqn1pmO","lXFOBWPmlx","DLhzMhUTw7","zQt6QPOUYS","JKWYRJXljW","9eoRc07n1c","Pb1paGSQwj","X6PinUlU3M",
+"I7p2a2hEEU","XflUq5drc6","d85a9fqypy","fcwDalViBv","vLsmSStlDJ","lweGygjUTu","dhSuHBGaQY","FNYIMy94nw","6q6L97X3uy","l83UdCNHmv",
+"tuDySuupzk","yluBxFnPFB","gjUTuXyPZN","9eoRclm0pD","0PktIuPX7G","kZANmoGu6x","MmKGJW3VFH","ix74rtaOXK","oGu6xlXFOB","vLsmSVNCPd",
+"dhSuHRzaZA","WaWsvoGu6x","HfyNQjeskS","Yh1hFn8pJ9","PYBf4Zv7z0","2hEEUWaim6","ZhwG1AgJHQ","KsjRKTwano","MGlTFoQ87r","hE1QlJJs5m",
+"MaJQsBpYhV","14FLRprNT6","uvf7AG1RhS","M6qcGRACuj","dmoS7CNHmv","ECMvUoVQp6","L7cGc4W0Tl","DQimpdpe1v","RBhp01j5L8","Vprf2hUTw7",
+"VLTy6pvgjS","5Mg9rVprf2","OUYuF8TxD7","O3iyQuTacx","MojnPzqH0W","uQIczzz4ZU","d7vjM0MR5X","soy9t0YAGH","SjskQ29QAz","KsjRKtjQxs",
+"Nxx9Vrhl0J","okgRioGu6x","ZUnqtuPX7G","oVQp6FPfSE","oGu6xix74r","KsjRKni2v1","TXQ0ZZ4I1v","5drc6sqVrf","0MR5XVLTy6","FPfSElXFOB",
+"MezSWeuZA5","s7Mxk7hyVv","GrDg7SjskQ","CNHmv0BmCy","P6bcg2ZHdk","XflUqpT8wu","Ss0Zu5drc6","wDajXYw2oU","lXFOBDz1R3","ciuWzuZPqg",
+"tlILttjQxs","QworuNo0Qb","v8yFN9eoRc","s47860BmCy","v1Hln6q6L9","0BmCyP6bcg","TwanoMaJQs","RzaZAyToGW","tl72WUlU3M","24ARFbrhlQ",
+"hYBCKSbRYy","Ss0ZuVprf2","mz8gxECMvU","atef2Yh1hF","VLTy6MK07Y","Q6LixFxX9q","JKWYRWPmlx","h1zcHRmDcr","VjCZqsoy9t","FxX9qnlaBy",
+"8hJdtuLtKs","POUYSVBjhz","FcWrWlkMUA","IRh48pFrrl","BpYhVPb1pa","9rlg9GSQwj","TwanoOHaBz","o8UyduQIcz","ciuWzOHaBz","BCxeC4W0Tl",
+"rhl0JY1mC0","RACujlm0pD","o8UydydG8U","AgJHQX6Pin","HzZT80YAGH","CK5W7gf8rI","Yf2EcHzZT8","h1zcHRBhp0","pAhR1nlaBy","mX2GEeuZA5",
+"ksJbyWMiS3","SjskQDcpWB","Yw2oUdQ586","5NammogLgc","W3VFHFGzgp","ru4UGazIWp","KZamH64s8N","8U2nUpT8wu","U3yw5Qworu","0YAGH8cVD3",
+"TCgPpd7vjM","yToGWZJTXH","X6Pin48cHL","HzZT8brhlQ","KsjRKK4GS8","NAFuwxciqp","k85AeQnJ1S","zQt6QeuZA5","In3NS0h1b1","uN6r3JRJQB",
+"FFDuiFVMxo","9y4lwuQIcz","kZANmzHF1q","dpe1vJKWYR","64s8NVLTy6","1j5L8Cfgr3","gIYvEAgJHQ","M6qcG580YD","ix74rVerEA","64s8NUvlv4",
+"7hyVvgdQsS","WDVWJAkKTk","9y4lwhYBCK","VBjhz1LB1L","MezSWblLA9","StlDJZhwG1","x3LDeiKqhr","0MR5XGv3Fq","QClRLGXdoH","FLsph8cVD3",
+"C2IrcP6bcg","NAFuwPb1pa","mX2GEiKqhr","uvf7AGWqqX","SWfouy94nw","LbRTHEdBKc","pmeCdix74r","Waim6pWiOs","FNYIMMGlTF","C2IrcfaHir",
+"0ao3lEOE1o","aL6AJCdyBV","2ZHdkYh1hF","hUTw7CIShG","M3zXLSs0Zu","jS1ajYjB9t","GWqqXVNCPd","Yf2EcFcWrW","0BmCytaOXK","Q6hMCMm8si",
+"RsQUq8TxD7","FLsph9iGoT","BGaQYJRJQB","QssNC5Drn0","k85AeW3VFH","SWfoujS1aj","cQOnvDQimp","pAhR1rz7Ut","zmLYDjtn0X","iB08lazIWp",
+"d85a948cHL","xXTI4VjCZq","8hJdtP6bcg","pT8wuDG4sT","hSSvQ4QMc9","cmXIXQClRL","Vprf2ciuWz","16lHctAOsr","CxVEfTa8f6","yluBxVBjhz",
+"lj07QNOHsz","FcWrWGWqqX","Uvlv4uN6r3","soy9tB3qem","JkzUn5Mg9r","2hEEUcShY2","WPmlxogLgc","WMiS3lm0pD","t59lRhe9IA","ZuDtD4dEz6",
+"IRh48QbxXc","TCgPpCdyBV","Pb1paxXTI4","cShY2BCxeC","lweGyGWqqX","Q6hMC4W0Tl","0ao3ltjQxs","IRh48TXQ0Z","QssNCqQxHP","jtn0XIjTwP",
+"a00b5QssNC","8U2nU4QMc9","NOHszv8yFN","5NammzQt6Q","RmDcry94nw","StlDJCxVEf","uQIczFPfSE","mz8gxNcICA","dpe1vLewvM","FLsphNxx9V",
+"ogLgcZzJHW","dmoS7S77LH","7lUXZyEfy9","uoStwXflUq","J2mQi64s8N","ogLgclweGy","Nxx9VHfyNQ","FxX9qWmadA","okgRiU3yw5","wDajXXflUq",
+"RzaZAZv7z0","Cfgr3mz8gx","aez9yk85Ae","kB5nPAOgEe","hSSvQ9y4lw","iwzGkZ4I1v","4W0Tllm0pD","9rlg9Yh1hF","pT8wuIjTwP","Cfgr3TXQ0Z",
+"6q6L9hi5X7","CK5W7AXpwE","2ZHdk7Ow5C","soy9tYw2oU","D6rByzmLYD","GSQwjuvf7A","MezSWRxrsm","5nmWvd7vjM","IRh48YOfrY","5Mg9rDcpWB",
+"zFgtBdQ586","tuDySMojnP","5VZjSVIlwP","YjB9t1v5hH","GWqqXxciqp","JkzUnDz1R3","xReecVprf2","S77LHjeskS","UlU3MRBhp0","Kr8ysJIqXi",
+"fLNg8sqVrf","bZLvSjSjS3","MK07Yb29RJ","nlaByCp3mZ","FcWrWZuDtD","tl72WYw2oU","SWfoulpF6W","MGlTFC2Irc","0BmCyt59lR","pvgjS4W0Tl",
+"M6qcGy94nw","8hJdt1v5hH","BbwgAyEfy9","0MR5XdQ586","zQt6QtjQxs","IBe8kIBe8k","FFDuiSbRYy","QChxsNOHsz","vLsmSUmaEv","ulk41pmeCd",
+"7Ow5Catef2","tvdkDuTacx","gf8rIChuy3","ulk41ReKEW","tvdkDjzUqR","NOHszYjB9t","hi5X7atef2","nnP8oAIYUu","14FLRChuy3","3weIFNhXdu",
+"QYxC055rfB","FhtglyofH3","sx5GllpF6W","C2IrcIRh48","qaofNWmadA","UlU3MzY1GY","9eoRcIRh48","MmsIo8cVD3","hYBCK7hyVv","M3zXLhYBCK",
+"2DREskB5nP","nnP8oatef2","GSQwjZuDtD","soy9ts93Ml","U3yw5IKxdL","uLtKscmXIX","8xEKzVjCZq","5Drn0Q6hMC","GXdoHKZamH","lj07QChuy3",
+"jiVBPHlUbF","CqqaDMojnP","JkzUnuJScX","29QAzBbwgA","9iGoTb29RJ","ZzJHWK20wK","Z4I1v6q6L9","uAWypPYBf4","xReecBFkb8","iwzGkD6rBy",
+"DQimpmz8gx","ZuDtD8cVD3","iwzGkuZPqg","hYBCKhYBCK","xXTI4DcpWB","n8pJ9gdQsS","FnPFBguMb8","JJs5mhYBCK","fcwDaMm8si","JIqXi2Nslm",
+"Uvlv4IjTwP","QssNCEOE1o","t98iWiwzGk","JXljW29QAz","uN6r3s4786","YOfrYMGlTF","M3zXLksJby","AOgEeQWxoT","W7cTspvgjS","uAWypksJby",
+"HRxd8FLsph","BCxeC580YD","fqypyStlDJ","HlUbF1j5L8","M6qcGtl72W","2DREspT8wu","gIYvEAmdQd","k85Ael83Ud","8U2nUQYxC0","cmXIXTa8f6",
+"zQt6Qzz4ZU","RBhp0Zv7z0","14FLRfLNg8","7fKYUQ6hMC","kZANmCK5W7","DG4sTpT8wu","d85a9faHir","ni2v1pv0i7","he9IAJXljW","W7cTswDajX",
+"IRh4807n1c","aez9yRxrsm","9rlg95Mg9r","bZLvSlkMUA","FNYIMDz1R3","Vprf214FLR","lpF6WyluBx","Z4I1vlViBv","BFkb8U3yw5","jfREuQClRL",
+"jtn0XSjskQ","Uvlv4QbxXc","Uvlv4NOHsz","QbxXc7Ow5C","yvOMIsuY4x","AXpwEtuDyS","zmLYD8RCUA","BFkb8m4bxU","uPX7GuAWyp","FjHXRWPmlx",
+"Uvlv4D6rBy","No0QbCK5W7","NcICAazIWp","RBhp04QMc9","FVMxofcwDa","taOXK6q6L9","l83UdpiJSk","FLsph8xEKz","dQ5867fsYM","Cfgr3P6bcg",
+"KASQ8W3VFH","xXTI4t59lR","cmXIXU3yw5","yEfy9ECMvU","xReecsqVrf","BCxeC64s8N","MGlTF0BmCy","n1pmO1LB1L","HP4339y4lw","SWfouDQimp",
+"lkMUARACuj","RkQkewiHrZ","1v5hHfLNg8","14FLRwiHrZ","pWiOsAXpwE","Ta8f6JJs5m","zQt6Qsoy9t","Kr8ysPb1pa","pWiOsMK07Y","tjQxsQssNC",
+"LbRTHK4GS8","VerEAoGu6x","jfREu5VZjS","OUqFMe6e4z","FGzgpBbwgA","ksJbyksJby","RpBQmSmGzv","HP433ECMvU","i7WMQOUYuF","ZhwG1TXQ0Z",
+"2DREslViBv","JJs5mSjskQ","16lHc7Ow5C","cQOnvJKWYR","SmGzvTwano","EdBKcoVQp6","1LB1Luupzk","FVMxoo8Uyd","ZhwG1ru4UG","MmsIouLtKs",
+"SmGzvatef2","Cp3mZxciqp","DcpWBYjB9t","StlDJzY1GY","lm0pDEdBKc","2Yz7EFLsph","wiHrZPb1pa","0PktI5Mg9r","SbRYyFhtgl","FPfSE1v5hH",
+"ZhwG10h1b1","FGzgpHRxd8","pvgjSh1zcH","QChxsB3qem","rz7UtGXdoH","bZLvSi3pyd","aDGtSni2v1","WreyPFVMxo","iqv4kHRxd8","K4GS8RBhp0",
+"kZANmTwano","qQxHP1LB1L","K4GS8Oz8yZ","JKWYRkB5nP","IjTwPVerEA","lpF6WMK07Y","XflUqS2Dfu","QWxoTWmadA","Kr8ysL7cGc","lsQGoZUnqt",
+"gf8rIRmDcr","RsQUq5IhmG","k85AeWDVWJ","MmKGJcQOnv","DG4sTv1Hln","MGlTFHzZT8","blLA9ECMvU","580YD1j5L8","4W0TlVIlwP","Ss0ZuyEfy9",
+"AXpwEy94nw","tAOsr7fKYU","P6bcgMmsIo","J2mQiIRh48","8TxD7LbRTH","FcWrWzz4ZU","lkMUAsqVrf","RkQkeCK5W7","9iGoT6q6L9","tvdkDChuy3",
+"azIWpHzZT8","aDGtSZhwG1","jfREulXFOB","No0QbJJs5m","VIlwPAXpwE","yEfy9cShY2","Ul4a1TXQ0Z","KZamH7fKYU","8xEKz24ARF","dQ586BbwgA",
+"NOHszuvf7A","cQOnvni2v1","NAFuwDz1R3","5Mg9rksJby","s4786EOE1o","CxVEf0PktI","ZzJHWuTacx","OUYuFvOqCE","SmGzvQYxC0","tuDyS0MR5X",
+"lsQGoRmDcr","OHaBzpmeCd","55rfB2TRI7","yToGWM6qcG","xReecSs0Zu","9y4lw55rfB","DLhzMNxx9V","K4GS8FLsph","jiVBPTCgPp","uJScXtvdkD",
+"wDajXJXljW","nlaByjfREu","AmdQdWMiS3","P6bcgZ4I1v","OxWIHYjB9t","ydG8UMK07Y","BGaQYFxX9q","55rfB0BmCy","soy9tuAWyp","W7cTsxReec",
+"rhl0JzqH0W","48cHLTCgPp","EOE1oOUqFM","wiHrZZv7z0","QYxC0Mm8si","cQOnvQChxs","CIShG6AFT0","FVMxoNhXdu","K20wKx3LDe","uAWypFcWrW",
+"hUTw7NhXdu","zY1GYPOUYS","Y1mC0MaJQs","Kr8ysn8pJ9","IjTwPAmdQd","TXQ0ZuoStw","rz7UtEoToP","2DREsBFkb8","fmIK1zQt6Q","o8UydhE1Ql",
+"VNCPdnnP8o","i7WMQlm0pD","Z4I1vlpF6W","FVMxoMkgy8","pv0i7QbxXc","6q6L9BpYhV","jfREueuZA5","QnJ1S64s8N","16lHcnlaBy","0KyfsEdBKc",
+"8xEKzgf8rI","MmKGJBGaQY","Mm8sitAOsr","KASQ87fsYM","ZuDtD2DREs","Y1mC0PYBf4","4QMc9Oz8yZ","tAOsr8FmFH","Mm8si4QMc9","OxWIH24ARF",
+"PYBf4lH1kt","m4bxU7ku1p","Twano7X3uy","ZzJHWCqqaD","yvOMIhe9IA","gf8rIpAhR1","zY1GYSjskQ","JIqXi7ku1p","lkMUAChuy3","xReecpmeCd",
+"618DiOUYuF","tlILtMkgy8","NOHszW3VFH","ulk418cVD3","e6e4ztuDyS","lXFOBRACuj","FPfSEi3pyd","dhSuHfcwDa","QClRLBGaQY","djsrvjtn0X",
+"i7WMQ0PktI","8hJdtpv0i7","IBe8kqUJMd","lweGyVerEA","5iGN5piJSk","Cp3mZsoy9t","iKqhrVIlwP","07n1c5Mg9r","TXQ0ZK4GS8","Vprf2yToGW",
+"GrDg7CdyBV","Zv7z0FPfSE","IBe8kZhwG1","uvf7ADz1R3","Zv7z0Dz1R3","QnJ1SguMb8","JkzUnpAhR1","KZamHQClRL","Pb1paZJTXH","ru4UG3weIF",
+"Q6LixjSjS3","iKqhrZ4I1v","618Di24ARF","RsQUq0YAGH","SWfougdQsS","CNHmvtAOsr","VNCPdAIYUu","W3VFH5drc6","6q6L9FLsph","RBhp0jSjS3",
+"zmLYD7hyVv","CNHmvvkCHH","rz7UtPYBf4","iB08lSbRYy","Oz8yZuZPqg","lpF6W8FmFH","Q6hMCIBe8k","45cIHlsQGo","FLsph29QAz","2hEEUhYBCK",
+"iKqhr0BmCy","SjskQOUqFM","ix74rBpYhV","k85Aei7WMQ","XyPZNsqVrf","tl72WYOfrY","zY1GYUl4a1","DcpWBMK07Y","WmadAm4bxU","lCMxyv2eC3",
+"TCgPpSbRYy","jeskS8U2nU","k85Aexciqp","tAOsrYOfrY","5ZaEzYf2Ec","uJScXpFrrl","QbxXcK4GS8","Kr8ystjQxs","5iGN5KZamH","hE1QlReKEW",
+"WPmlxyofH3","24ARF8RCUA","tvdkDjS1aj","cQOnv45cIH","5drc6Ta8f6","2Yz7EC2Irc","Z4I1vMmsIo","Kr8ysnlaBy","ReKEWfLNg8","9iGoTJ2mQi",
+"IKxdLFGzgp","S77LHqUJMd","BFkb8KsjRK","WmadAjfREu","GWqqXDG4sT","soy9tCNHmv","DG4sTMkgy8","M3zXLtvdkD","lCMxyDz1R3","Kr8ysyvOMI",
+"cShY2fqypy","M6qcGKsjRK","cShY2Mkgy8","fFDrJKr8ys","8cVD3bgJAz","v1Hln5iGN5","yToGWJJs5m","O3iyQuLtKs","6q6L9d7vjM","oQ87rMezSW",
+"nlaBycmXIX","lweGy0PktI","0MR5XyofH3","JJs5mmX2GE","W7cTsQClRL","FFDuiOUqFM","d7vjMlViBv","W3VFHuvf7A","rKDLJvOqCE","VIlwPMaJQs",
+"aDGtSaL6AJ","blLA90YAGH","KZamHHlUbF","24ARFhYBCK","zz4ZUWaim6","CdyBVFwEJz","MaJQsv2eC3","ogLgcXyPZN","uAWypd85a9","taOXKDz1R3",
+"48cHL7fKYU","tAOsrEOE1o","UlU3Md85a9","oGu6x2ZHdk","Cfgr3ogLgc","VBjhzlkMUA","QYxC0CdyBV","FcWrWOUqFM","jtn0XThjNn","POUYSsuY4x",
+"PYBf4UmaEv","Y1mC0RsQUq","DG4sTiB08l","fcwDaKsjRK","ZzJHW9GXkX","M6qcGKr8ys","uN6r30Kyfs","mz8gx9rlg9","pWiOsTCgPp","5NammIKxdL",
+"zQt6QWPmlx","WaWsvECMvU","hSSvQxReec","Chuy3MGlTF","OxWIHCIShG","1v5hHMmsIo","jSjS3lkMUA","zqH0WuAWyp","jS1ajF6PT2","v1HlnlViBv",
+"5nmWvfaHir","IjTwPoQ87r","lViBvo8Uyd","MmKGJx3LDe","FNYIMZzJHW","rhl0Jrhl0J","x3LDey94nw","lViBvcQOnv","RzaZAFVMxo","Z4I1vt59lR",
+"QClRL1v5hH","BFkb80ao3l","NOHszVerEA","AOgEeBFkb8","W7cTsIn3NS","qQxHPd85a9","jfREuVLTy6","piJSkhE1Ql","vLsmSdhSuH","5nmWvzmLYD",
+"G1RhSyluBx","pFrrl8hJdt","yEfy9zHF1q","FcWrWpmeCd","pFrrl0YAGH","uLtKsbgJAz","PYBf4hE1Ql","7fsYMWMiS3","VIlwP6q6L9","L7cGctaOXK",
+"FjHXRy94nw","MmKGJAmdQd","ZUnqtyofH3","QnJ1S5Namm","QWxoTpWiOs","nlaByLbRTH","b29RJHRxd8","zmLYDi3pyd","m4bxUMm8si","cQOnvpT8wu",
+"dQ586X6Pin","t59lRQ6hMC","VBjhz5ZaEz","EOE1o9y4lw","hi5X7yvOMI","nnP8oGSQwj","8xEKz5drc6","RmDcrtjQxs","Yf2EcWaim6","lpF6WMkgy8",
+"KZamHuN6r3","QworuvOqCE","e6e4zfaHir","ciuWzTa8f6","7fsYMRpBQm","suY4xjfREu","CIShGYjB9t","MGlTFlkMUA","24ARFNo0Qb","y94nwIKxdL",
+"v2eC3ksJby","GSQwjzFgtB","5VZjSuZPqg","8cVD3kB5nP","YOfrYsoy9t","EOE1o4dEz6","VLTy6lViBv","55rfBBpYhV","FwEJzSmGzv","2TRI7y94nw",
+"t59lRM6qcG","hYBCKqaofN","oGu6xfcwDa","suY4xO3iyQ","8RCUALewvM","jS1aj8RCUA","K4GS8K20wK","GrDg7DLhzM","4QMc9GWqqX","AgJHQW3VFH",
+"Waim6BpYhV","hYBCK0MR5X","5VZjSYjB9t","Q6hMCs7Mxk","UmaEv5VZjS","wiHrZsqVrf","KASQ8e6e4z","faHirFnPFB","QChxsulk41","jSjS3CqqaD",
+"lXFOBM6qcG","sqVrf7lUXZ","tl72WcQOnv","1LB1LFGzgp","DQimpFLsph","580YDS77LH","ix74rHP433","WaWsvuLtKs","HzZT8rKDLJ","lXFOB2DREs",
+"cQOnvMojnP","3otm69GXkX","SmGzvhYBCK","SjskQvkCHH","2Yz7EGrDg7","8xEKzZuDtD","Pb1paDcpWB","blLA9k85Ae","FNYIMuvf7A","kB5nPCqqaD",
+"8TxD7iB08l","i7WMQiKqhr","kB5nPcQOnv","Q6hMCFPfSE","QnJ1S6AFT0","b29RJ24ARF","TXQ0ZlkMUA","wiHrZpT8wu","uJScXIBe8k","AkKTkqQxHP",
+"BFkb8fmIK1","EdBKcgtCA5","0ao3lBGaQY","ZJTXHsqVrf","8hJdt9eoRc","U3yw5FcWrW","fmIK1QYxC0","POUYSZJTXH","QClRLJXljW","jeskSoGu6x",
+"okgRiWDVWJ","GrDg7dQ586","IKxdLsuY4x","v1HlnD6rBy","vkCHHJkzUn","tvdkD8hJdt","tvdkDl83Ud","IjTwP3otm6","LDk6fblLA9","tjQxsMmKGJ",
+"vOqCEoVQp6","8RCUAnlaBy","AIYUuQnJ1S","7lUXZFxX9q","2NslmblLA9","s7MxkbrhlQ","uvf7AgtCA5","5NammGWqqX","AmdQdyofH3","uN6r3Twano",
+"tjQxsCK5W7","ni2v1faHir","zz4ZUpWiOs","4W0TlRkQke","9GXkXB3qem","oGu6xMmsIo","0Wr5yaDGtS","O3iyQMojnP","faHirJKWYR","cmXIXv2eC3",
+"tAOsrzHF1q","CK5W7tl72W","WaWsv9GXkX","azIWpQClRL","7fsYMFPfSE","pFrrlt98iW","pmeCdokgRi","uJScXazIWp","guMb89XyT9","pvgjSM6qcG",
+"x3LDeS77LH","uAWyph1zcH","In3NSWMiS3","Q6hMClkMUA","JKWYRn1pmO","5Mg9rYf2Ec","lpF6WD6rBy","07n1cNAFuw","JRJQBydG8U","tl72WWMiS3",
+"yToGWmz8gx","ZUnqtP6bcg","4dEz67X3uy","CNHmvD6rBy","WaWsvEdBKc","StlDJhUTw7","FFDuiFNYIM","MaJQsFVMxo","ZhwG1OxWIH","YjB9t9rlg9",
+"Uvlv42Nslm","O3iyQs7Mxk","Cfgr3dpe1v","LDk6fK4GS8","kB5nPCNHmv","zFgtBRkQke","lweGyuLtKs","yToGW3weIF","fmIK1XyPZN","UlU3MGrDg7",
+"hYBCKVNCPd","i3pydkZANm","9eoRcfaHir","LbRTHvkCHH","HzZT8aDGtS","suY4xMojnP","BCxeC2Nslm","tAOsrjtn0X","S77LHzz4ZU","faHir48cHL",
+"d7vjMIn3NS","0BmCyCIShG","dmoS7vLsmS","DLhzMuJScX","U3yw5blLA9","uupzkl83Ud","0MR5XFcWrW","Cfgr33otm6","lkMUAMezSW","1v5hHWaim6",
+"64s8NprNT6","lm0pD5IhmG","RkQkeAkKTk","0MR5XksJby","iqv4kmz8gx","oVQp63otm6","K20wKxReec","Mkgy8No0Qb","5VZjSWPmlx","48cHLgdQsS",
+"soy9tFLsph","MmKGJPOUYS","9rlg9zFgtB","6AFT0MezSW","9y4lw8RCUA","VerEADcpWB","DcpWBOUqFM","d7vjMzqH0W","YOfrYm4bxU","jzUqRM3zXL",
+"2TRI70Kyfs","gIYvEb29RJ","uJScX8RCUA","7Ow5COz8yZ","CdyBVB3qem","e6e4zKASQ8","ZJTXH8RCUA","RBhp0pv0i7","sx5GlhYBCK","24ARFCqqaD",
+"BpYhVqUJMd","0ao3lW3VFH","EdBKcJKWYR","7X3uyhE1Ql","rz7Ut8hJdt","16lHc9XyT9","64s8NW7cTs","2Yz7EpAhR1","yvOMIFNYIM","iwzGkFcWrW",
+"KsjRKS77LH","hE1Ql8U2nU","Vprf2uAWyp","FGzgpgf8rI","EOE1opvgjS","RmDcrVIlwP","TXQ0ZfaHir","fqypyaL6AJ","t59lRHP433","a00b5FcWrW",
+"SjskQo8Uyd","Zv7z0RkQke","64s8Nlm0pD","ZuDtDgdQsS","2Yz7E9GXkX","Yw2oUiKqhr","UlU3MAIYUu","cShY2tjQxs","0ao3lYw2oU","d85a9ZuDtD",
+"RxrsmAIYUu","MK07YBpYhV","OHaBz8TxD7","qUJMdMm8si","Gv3FqgdQsS","16lHcWaim6","Mkgy8b29RJ","djsrvlXFOB","qUJMddjsrv","yToGWZzJHW",
+"oQ87rksJby","TXQ0Z0BmCy","dQ5860h1b1","Yf2EcjfREu","Yh1hFDLhzM","lXFOBEdBKc","yEfy9Yw2oU","tAOsriwzGk","ZuDtD5VZjS","uJScXZhwG1",
+"Waim6bgJAz","RzaZAaL6AJ","guMb86AFT0","JkzUnyofH3","atef2piJSk","TXQ0ZIKxdL","5IhmGOz8yZ","zbIYYQworu","VjCZqDz1R3","uJScXMK07Y",
+"B3qem4dEz6","5nmWvdhSuH","mX2GEnnP8o","Nxx9VjzUqR","NOHszS2Dfu","hYBCKuN6r3","1v5hHRACuj","FjHXRDz1R3","lm0pD7lUXZ","QYxC0lm0pD",
+"yToGW7fsYM","Pb1paFjHXR","QClRLWaWsv","8RCUANxx9V","8RCUAXflUq","CqqaD7hyVv","s4786m4bxU","FGzgpzz4ZU","Chuy3GXdoH","m4bxUdQ586",
+"d85a9gIYvE","yToGW6q6L9","uJScX5drc6","PYBf4pWiOs","WmadAAmdQd","FhtglLewvM","djsrvlH1kt","QssNCn8pJ9","nFqikECMvU","L7cGcVNCPd",
+"xReec8TxD7","6AFT0euZA5","ECMvUzz4ZU","MojnP0MR5X","taOXK5IhmG","xXTI4pT8wu","AIYUuLbRTH","GXdoHFxX9q","2DREsfLNg8","tuDySyEfy9",
+"ogLgcQYxC0","AgJHQ64s8N","JKWYRoGu6x","soy9to8Uyd","Y1mC0zHF1q","J2mQidjsrv","M6qcGdpe1v","Waim6CxVEf","zz4ZUzY1GY","5IhmGcShY2",
+"G1RhSRkQke","blLA945cIH","jiVBPgf8rI","OUqFMM3zXL","9GXkXni2v1","azIWpOHaBz","FNYIMQnJ1S","Ul4a12DREs","VBjhzzmLYD","Ss0ZuQ6hMC",
+"FhtglSjskQ","OUYuF4QMc9","BbwgApT8wu","ZzJHWsx5Gl","Vprf2fcJOy","Mkgy8MojnP","zz4ZUpAhR1","d7vjMlkMUA","HfyNQiqv4k","StlDJprNT6",
+"iB08lGv3Fq","1j5L8vLsmS","RkQke5drc6","oVQp6MmKGJ","LbRTH1v5hH","yofH3WaWsv","PYBf4aez9y","2Yz7Esoy9t","s7MxkAmdQd","zQt6QtlILt",
+"P6bcguupzk","v2eC3LewvM","7fsYMokgRi","gdQsSzz4ZU","NhXduuAWyp","Ta8f6taOXK","uupzkYf2Ec","JXljWJkzUn","MGlTFprNT6","rz7UtS2Dfu",
+"kZANmRpBQm","EdBKcQChxs","K20wKuPX7G","lCMxyru4UG","MGlTFuvf7A","HP433M6qcG","euZA5SmGzv","No0Qbxciqp","2TRI70ao3l","Mm8siDQimp",
+"SbRYyNcICA","azIWpi3pyd","xXTI45IhmG","WreyPEdBKc","NhXdulj07Q","4dEz6VerEA","KZamHy94nw","WDVWJ5Mg9r","nnP8oeuZA5","8TxD7taOXK",
+"Uvlv4Ul4a1","y94nw8FmFH","I7p2apT8wu","RBhp0MmsIo","uN6r3Cfgr3","QYxC0TCgPp","pv0i79y4lw","Y1mC0uAWyp","jtn0X5iGN5","QYxC0Yh1hF",
+"cL0aEWreyP","3otm6jSjS3","4W0TlIRh48","7hyVv29QAz","zQt6QFFDui","5drc6lXFOB","Oz8yZi3pyd","gf8rIPb1pa","zY1GY5Drn0","8xEKzD6rBy",
+"tlILtLbRTH","5nmWvUlU3M","29QAztvdkD","Dz1R3YOfrY","Ta8f6l83Ud","RxrsmZzJHW","b29RJJIqXi","s93Mlni2v1","0h1b1pAhR1","gf8rIciuWz",
+"pT8wu8hJdt","WmadAa00b5","vLsmSJXljW","2ZHdk5VZjS","QWxoTrhl0J","Cfgr3uZPqg","ni2v12DREs","BGaQYOUqFM","e6e4zsx5Gl","F6PT2jzUqR",
+"MmsIoTwano","jS1ajkB5nP","UmaEvThjNn","iqv4kZhwG1","ni2v1uAWyp","16lHcHzZT8","Ta8f6jiVBP","m4bxUCIShG","2Yz7Ejtn0X","qUJMdStlDJ",
+"iB08l16lHc","KsjRKnFqik","l83UduAWyp","LewvMd85a9","vOqCECfgr3","WDVWJCIShG","Vprf2wDajX","4QMc9yluBx","MK07YzQt6Q","MGlTFqUJMd",
+"SjskQlweGy","DLhzMzz4ZU","FwEJzrz7Ut","iKqhrAIYUu","5Mg9rCdyBV","NhXdub29RJ","FLsph2Nslm","Q6LixFFDui","3weIFe6e4z","lkMUAVIlwP",
+"618DiQworu","OxWIHy94nw","he9IA9XyT9","tvdkDTCgPp","FxX9qa00b5","WreyPK20wK","QChxsxciqp","SjskQVjCZq","6q6L9jtn0X","RBhp0TCgPp",
+"K20wKBpYhV","WDVWJRBhp0","0ao3lcShY2","6q6L9VNCPd","fcwDa3otm6","RsQUqFFDui","soy9tqaofN","RBhp0yofH3","lweGyguMb8","1j5L87ku1p",
+"uoStwLewvM","7fsYMyofH3","wiHrZix74r","FwEJzwiHrZ","JIqXiB3qem","ZUnqtJKWYR","NAFuwa00b5","2ZHdkZzJHW","xReecPOUYS","K20wKyToGW",
+"uZPqgBGaQY","AgJHQ0MR5X","Uvlv47lUXZ","4QMc9i3pyd","MmKGJ618Di","soy9tbgJAz","nnP8oTwano","0YAGHNo0Qb","J2mQiNhXdu","brhlQsx5Gl",
+"ru4UGZ4I1v","9y4lwtaOXK","MK07YD6rBy","azIWpoVQp6","rKDLJWDVWJ","XyPZNGXdoH","5NammLewvM","FGzgpyvOMI","RmDcrrKDLJ","Waim6K20wK",
+"AgJHQJJs5m","4dEz6o8Uyd","iqv4kIKxdL","CqqaDIjTwP","aL6AJAkKTk","KASQ82ZHdk","JKWYRcL0aE","ciuWzb29RJ","AIYUulj07Q","DcpWBzFgtB",
+"MK07YW3VFH","KsjRKIKxdL","POUYSjtn0X","WmadALbRTH","C2IrczQt6Q","qaofNk85Ae","NAFuwoVQp6","mX2GEdmoS7","8hJdtwDajX","4QMc9Fhtgl",
+"ru4UG07n1c","d7vjMx3LDe","ECMvUyEfy9","MmKGJZJTXH","iwzGkDz1R3","580YDhE1Ql","M3zXLhe9IA","tuDySHlUbF","4QMc9v1Hln","atef2tvdkD",
+"fqypyFwEJz","GWqqX9GXkX","uZPqgJIqXi","yvOMId7vjM","xciqpYjB9t","lH1ktMkgy8","i3pydVLTy6","C2IrcUmaEv","tAOsrzQt6Q","FhtglGSQwj",
+"B3qemStlDJ","XyPZNnFqik","4W0TlMmKGJ","Oz8yZhe9IA","DcpWBWreyP","K20wK7ku1p","8RCUAAkKTk","prNT6uN6r3","s7Mxklj07Q","AXpwEDQimp",
+"fmIK1qUJMd","J2mQiFjHXR","B3qemulk41","uPX7GM6qcG","uPX7GprNT6","VIlwP0PktI","5ZaEzWmadA","7fKYUG1RhS","zmLYDlViBv","AkKTkuTacx",
+"tjQxs4QMc9","BGaQYgtCA5","dQ586wDajX","U3yw5FwEJz","StlDJv2eC3","PYBf40Kyfs","mX2GEkZANm","In3NSStlDJ","CIShGlsQGo","qUJMdpFrrl",
+"jSjS3X6Pin","IKxdLLDk6f","8FmFHfcwDa","xciqpkB5nP","qUJMd2hEEU","1j5L8fqypy","uPX7GtuDyS","WPmlxAgJHQ","MezSWn1pmO","5drc6y94nw",
+"t59lRiwzGk","7fsYMFwEJz","8FmFHUvlv4","VerEAazIWp","m4bxUWDVWJ","VerEAFnPFB","P6bcg16lHc","AXpwE3weIF","5Drn0yToGW","Waim6VIlwP",
+"K20wKVerEA","3weIFMGlTF","OHaBzFFDui","JKWYRfcwDa","dQ586yvOMI","MK07Yatef2","bZLvSaDGtS","taOXKYw2oU","WMiS3AIYUu","iwzGkzqH0W",
+"Waim6Q6hMC","AgJHQn1pmO","NhXduuoStw","zY1GYVNCPd","7fKYUC2Irc","C2Irc618Di","Nxx9VuoStw","W7cTsv8yFN","fcwDaZhwG1","ZUnqty94nw",
+"suY4xSmGzv","MaJQsJJs5m","i3pydRpBQm","0MR5XK4GS8","uoStwFnPFB","UlU3MNo0Qb","nlaBy8cVD3","8RCUAjtn0X","StlDJa00b5","Q6LixMmKGJ",
+"TXQ0ZRBhp0","pWiOstuDyS","M6qcGM6qcG","2DREshi5X7","8RCUAPYBf4","WMiS3iB08l","v1HlnMmsIo","uupzkYw2oU","AXpwEJJs5m","uupzklweGy",
+"tl72Wgf8rI","lkMUADcpWB","kZANmIjTwP","ZzJHWogLgc","lH1ktqaofN","2DREs2Nslm","pvgjSOUqFM","yvOMIlViBv","pAhR1BGaQY","aFFssvOqCE",
+"FNYIMqUJMd","0KyfsMaJQs","2ZHdklsQGo","Q6LixGXdoH","yvOMIgjUTu","7Ow5CyofH3","lm0pDgIYvE","HRxd8NcICA","L7cGccQOnv","uoStwcQOnv",
+"soy9tru4UG","i7WMQFcWrW","v2eC3K4GS8","ReKEW2hEEU","GSQwjzHF1q","MaJQs2Yz7E","4dEz6GrDg7","U3yw5Rxrsm","yluBxyToGW","Ul4a15nmWv",
+"uLtKsZUnqt","5nmWvprNT6","gdQsSNo0Qb","FPfSEUvlv4","FGzgpydG8U","ni2v1Q6Lix","9XyT9NhXdu","ZUnqtuAWyp","Yf2EcZUnqt","nFqikatef2",
+"FnPFBZzJHW","DcpWBatef2","Ta8f69XyT9","NAFuwpT8wu","jiVBPLDk6f","RpBQmtvdkD","6q6L99rlg9","8cVD3L7cGc","B3qem6q6L9","Nxx9VzqH0W",
+"uLtKsRxrsm","yluBxb29RJ","48cHLcL0aE","uAWyp5IhmG","jS1aj7hyVv","2ZHdkfFDrJ","XyPZNBFkb8","zz4ZUhE1Ql","BpYhVZJTXH","8RCUAZUnqt",
+"n1pmOru4UG","3weIFRsQUq","s4786QChxs","e6e4zpFrrl","BbwgAlH1kt","yofH3zbIYY","Ss0Zulm0pD","Ss0ZuSs0Zu","WMiS3bgJAz","TCgPpQnJ1S",
+"MGlTFG1RhS","UmaEvcShY2","Dz1R31v5hH","tl72WHlUbF","WreyPAXpwE","FjHXRRmDcr","Mm8silweGy","8hJdtRBhp0","OUYuFvkCHH","d7vjMt59lR",
+"lH1ktMmsIo","0Wr5yWMiS3","StlDJkB5nP","uQIczSmGzv","RkQkeBGaQY","FcWrWD6rBy","MGlTFLbRTH","JJs5mRmDcr","5ZaEzMaJQs","a00b55IhmG",
+"4dEz6JRJQB","DQimpDLhzM","Cfgr3iB08l","jtn0XzqH0W","t98iWHRxd8","Mkgy8qaofN","HzZT8uQIcz","DLhzMix74r","l83UdOz8yZ","IBe8kgjUTu",
+"hi5X7Nxx9V","XflUqCIShG","yvOMINOHsz","iB08lAXpwE","a00b50PktI","0h1b1BFkb8","yToGWF6PT2","5drc6LDk6f","XyPZNjfREu","NhXduUl4a1",
+"MGlTF7X3uy","ydG8UtlILt","7X3uy8TxD7","fLNg8gdQsS","2Nslm9eoRc","uLtKsVNCPd","HzZT8YjB9t","i7WMQ5Namm","x3LDelm0pD","RBhp0n8pJ9",
+"14FLRMK07Y","VjCZqpT8wu","Z4I1vVNCPd","FwEJzlweGy","pWiOsk85Ae","ni2v1blLA9","14FLRGXdoH","8RCUA0MR5X","U3yw5wiHrZ","gdQsSSjskQ",
+"7X3uyCqqaD","oGu6xOHaBz","SjskQaDGtS","fqypyBpYhV","atef2gIYvE","NcICA9rlg9","RpBQmNAFuw","rKDLJ4W0Tl","qQxHPOxWIH","jzUqRnFqik",
+"4dEz6MezSW","8hJdtjzUqR","hUTw7NcICA","UlU3M7Ow5C","B3qem5nmWv","ReKEWaDGtS","Dz1R3MezSW","jS1ajo8Uyd","VjCZqJkzUn","8TxD7i7WMQ",
+"2ZHdkdmoS7","mX2GE48cHL","1LB1LprNT6","iB08lPOUYS","lXFOBXyPZN","24ARFWaim6","0Kyfsi7WMQ","ZuDtDzz4ZU","QYxC0WPmlx","M3zXLyluBx",
+"FwEJz4QMc9","NcICAB3qem","S2DfuQ6hMC","2ZHdktjQxs","k85AeSmGzv","NAFuwtaOXK","16lHco8Uyd","n1pmOW7cTs","jiVBPzHF1q","uTacxtaOXK",
+"Oz8yZC2Irc","mX2GE8U2nU","cQOnvMGlTF","JJs5mMmsIo","VerEAWPmlx","pv0i7In3NS","QworufaHir","ThjNnNxx9V","dhSuHUmaEv","UmaEvJ2mQi",
+"fFDrJ1j5L8","FNYIM07n1c","pAhR1SbRYy","aL6AJFVMxo","Yf2Eca00b5","ZJTXHl83Ud","hSSvQlpF6W","K4GS8WmadA","PYBf4BbwgA","mX2GEfqypy",
+"RsQUqZhwG1","nlaByRmDcr","7fsYM5Drn0","QClRLAkKTk","QbxXc5ZaEz","vkCHHEdBKc","fqypy9eoRc","Q6LixFGzgp","jzUqROUqFM","1j5L8LbRTH",
+"ZuDtD6q6L9","LbRTHUlU3M","KASQ8M3zXL","CNHmvCK5W7","Kr8ysKZamH","ksJbyO3iyQ","WDVWJCNHmv","8hJdtTa8f6","HP433cShY2","aez9y9eoRc",
+"KASQ87fKYU","8hJdthSSvQ","MojnPuPX7G","Mm8siZhwG1","yEfy9VjCZq","8U2nUuTacx","k85AeuZPqg","CNHmvs4786","oGu6xXyPZN","In3NSQYxC0",
+"BbwgAuoStw","8U2nUWreyP","X6Pini7WMQ","wDajXjzUqR","VLTy6s7Mxk","iwzGkvOqCE","ogLgcuJScX","HlUbFKASQ8","LDk6ftl72W","Q6Lix7Ow5C",
+"suY4x4dEz6","uoStw16lHc","SbRYynnP8o","b29RJFhtgl","M6qcGY1mC0","LewvMRsQUq","OUYuFQChxs","HfyNQKASQ8","0h1b1ksJby","azIWpFLsph",
+"UmaEv7fKYU","07n1cSjskQ","NhXduOxWIH","U3yw5BpYhV","5Drn0qaofN","TwanoBFkb8","aL6AJjzUqR","okgRixXTI4","aez9yLDk6f","JJs5mAgJHQ",
+"C2IrcCK5W7","WDVWJKZamH","yofH3faHir","iqv4kMmKGJ","Yw2oUECMvU","ulk41fqypy","DLhzMZUnqt","S77LHFGzgp","QssNC48cHL","IRh48tl72W",
+"HfyNQgIYvE","vLsmSgtCA5","FPfSEvLsmS","pAhR12DREs","QworuReKEW","Q6LixqQxHP","yEfy9vOqCE","qUJMdrz7Ut","ydG8UZUnqt","5nmWvFFDui",
+"FNYIMcmXIX","v8yFNnlaBy","uupzk7fKYU","RACuj9iGoT","LbRTHAOgEe","Pb1paQYxC0","BbwgAatef2","POUYSgf8rI","8FmFHC2Irc","FjHXROUqFM",
+"CNHmvZhwG1","5Namm0Wr5y","55rfBL7cGc","HP4331j5L8","fcwDawiHrZ","BFkb8lXFOB","jzUqRCdyBV","qUJMduAWyp","QssNCpWiOs","n8pJ9xXTI4",
+"QYxC0aDGtS","zFgtBMaJQs","0MR5XRxrsm","DLhzMuLtKs","BbwgAmX2GE","s93MluLtKs","Y1mC0zbIYY","0KyfsJkzUn","euZA5e6e4z","piJSk9rlg9",
+"QChxsVNCPd","MaJQs8FmFH","KZamHNcICA","9rlg9Fhtgl","gjUTusqVrf","pWiOsv2eC3","lpF6W8RCUA","GXdoHuvf7A","k85AeQYxC0","K20wK55rfB",
+"zqH0WuZPqg","4W0TlvLsmS","NAFuwt98iW","U3yw5PYBf4","uJScXrKDLJ","W7cTs9y4lw","0ao3lVBjhz","hi5X7tuDyS","4dEz6TXQ0Z","OUqFMfqypy",
+"zmLYDWPmlx","suY4xlm0pD","wDajXdpe1v","o8UydkZANm","9eoRctaOXK","JJs5mC2Irc","he9IAhe9IA","5drc6blLA9","jSjS3WMiS3","pvgjSWMiS3",
+"blLA9EoToP","CIShGCp3mZ","RsQUqsqVrf","FxX9qYh1hF","8U2nUgtCA5","CK5W70YAGH","VjCZqRBhp0","zY1GY9GXkX","SjskQ7hyVv","hUTw7BFkb8",
+"2Yz7EKASQ8","oQ87rQ6Lix","VBjhzUl4a1","iKqhrY1mC0","cmXIXK20wK","D6rBy2Yz7E","Zv7z0BFkb8","WDVWJbgJAz","YjB9tEOE1o","4dEz6CxVEf",
+"VIlwPCxVEf","gtCA5piJSk","SjskQlViBv","atef2ix74r","Cfgr3aL6AJ","VjCZqX6Pin","580YDcQOnv","cQOnvyofH3","MGlTFlXFOB","s7MxkU3yw5",
+"fcwDaZzJHW","VNCPddmoS7","M3zXLjS1aj","oVQp6Zv7z0","9y4lwUl4a1","djsrvciuWz","CNHmvWreyP","FhtglWreyP","ni2v1cL0aE","EdBKcCfgr3",
+"W3VFHblLA9","guMb8RpBQm","5NammtlILt","AIYUuhYBCK","WreyPpmeCd","1v5hH0Wr5y","B3qemuupzk","oQ87rzY1GY","0ao3lMaJQs","580YDs93Ml",
+"G1RhS0Kyfs","0MR5XEoToP","EoToPStlDJ","wiHrZy94nw","fqypyMojnP","FjHXRuupzk","CdyBVCK5W7","55rfBNxx9V","faHir6AFT0","ydG8U8RCUA",
+"blLA9RpBQm","euZA5Qworu","5drc6yofH3","tuDySCqqaD","taOXKQ6hMC","07n1culk41","AXpwEOz8yZ","7ku1phi5X7","HRxd8RkQke","kZANm5VZjS",
+"P6bcgMmKGJ","kZANmRzaZA","cShY2SWfou","pFrrlECMvU","24ARFFVMxo","1v5hHRsQUq","O3iyQ7fsYM","MmKGJGv3Fq","fFDrJYOfrY","SmGzvuJScX",
+"nFqikFVMxo","TwanoCp3mZ","tAOsr7ku1p","NcICAmX2GE","BbwgAThjNn","Oz8yZjtn0X","Yh1hFvOqCE","taOXKIjTwP","m4bxUvOqCE","FGzgp9GXkX",
+"WDVWJZhwG1","2TRI7rKDLJ","RzaZAhi5X7","EOE1oBCxeC","uZPqgqUJMd","HlUbFCfgr3","GXdoHKASQ8","TCgPpfcwDa","qUJMdQ6hMC","Mm8si9XyT9",
+"lsQGoIKxdL","uQIczFwEJz","TwanopT8wu","9y4lwqQxHP","Gv3FqsqVrf","QbxXcRxrsm","ulk41SWfou","JKWYRFLsph","SmGzvThjNn","taOXKOz8yZ",
+"1j5L85Drn0","iwzGkEOE1o","FcWrWFxX9q","AIYUuQbxXc","dQ586NcICA","y94nwd85a9","n1pmOfmIK1","m4bxUogLgc","Y1mC0RkQke","LDk6fO3iyQ",
+"NcICAv1Hln","In3NSRsQUq","euZA5KASQ8","X6PinC2Irc","JRJQBtaOXK","FwEJzjS1aj","xciqpdhSuH","5Mg9rni2v1","45cIHuTacx","tAOsr9rlg9",
+"i7WMQBpYhV","tuDySzY1GY","F6PT2nnP8o","ogLgcpT8wu","RACujtl72W","SbRYyRkQke","vkCHHyToGW","ydG8UGv3Fq","lH1ktOxWIH","zbIYYv8yFN",
+"lCMxyQClRL","uPX7GgIYvE","lXFOBK20wK","h1zcHfFDrJ","LbRTHpAhR1","XflUq0Wr5y","0KyfsNo0Qb","LDk6fAIYUu","618DigjUTu","CK5W7zY1GY",
+"zz4ZUAgJHQ","qaofNuPX7G","29QAzNhXdu","7ku1puJScX","FFDui5Mg9r","oQ87rqaofN","M3zXLwDajX","uJScXdhSuH","VBjhzChuy3","OUYuFUvlv4",
+"iqv4kyEfy9","5NammlweGy","nFqikJXljW","OUqFM64s8N","MmsIoqaofN","64s8Ne6e4z","IjTwPFLsph","piJSkksJby","0Wr5yD6rBy","No0QbLewvM",
+"SWfouNhXdu","pAhR1wDajX","VerEA618Di","HfyNQQssNC","zY1GYJ2mQi","29QAzhUTw7","9iGoTh1zcH","qUJMddhSuH","Q6hMC07n1c","YOfrYECMvU",
+"K4GS8HzZT8","qQxHPoQ87r","VIlwPYOfrY","iB08lXflUq","jiVBP0BmCy","M3zXLgIYvE","U3yw5OUYuF","P6bcgGXdoH","Ul4a1pT8wu","nlaBys4786",
+"l83UdqQxHP","5VZjSyluBx","gtCA5xXTI4","7Ow5Cmz8gx","JKWYRYjB9t","CIShGix74r","piJSkPb1pa","Nxx9VPOUYS","CxVEfFxX9q","AXpwEbrhlQ",
+"JIqXiuvf7A","B3qem8hJdt","CqqaDeuZA5","iKqhrYf2Ec","ru4UGWDVWJ","8hJdtQnJ1S","AXpwEiqv4k","5ZaEzJXljW","0BmCyzFgtB","jzUqRfcwDa",
+"HfyNQxXTI4","zFgtB5nmWv","zqH0Wrhl0J","StlDJLbRTH","JRJQBHRxd8","TwanoqQxHP","SWfoukB5nP","dmoS7NAFuw","Fhtglix74r","AmdQdVBjhz",
+"iqv4ktl72W","tvdkDulk41","lpF6WfaHir","gf8rIAgJHQ","FnPFBjfREu","v1HlnHP433","U3yw5ksJby","ThjNnMm8si","vkCHHkB5nP","Ta8f6HlUbF",
+"5NammSs0Zu","hSSvQHP433","tlILtAmdQd","M6qcGnnP8o","b29RJuJScX","vkCHH48cHL","aez9yix74r","2ZHdkKr8ys","yofH3Zv7z0","uTacxSjskQ",
+"hYBCKVIlwP","BbwgApWiOs","LbRTHt98iW","07n1c5VZjS","TCgPpYw2oU","pT8wuaez9y","JJs5mIBe8k","Zv7z0soy9t","oGu6xFcWrW","nnP8oyvOMI",
+"29QAzVLTy6","faHircShY2","ZJTXH2Nslm","IRh48suY4x","S77LHjSjS3","Kr8ysZuDtD","gtCA5Yf2Ec","WPmlx4dEz6","ciuWz2hEEU","AmdQdQssNC",
+"4W0TlU3yw5","rKDLJ2DREs","tvdkDpT8wu","he9IAMojnP","lj07Q7X3uy","RsQUqOUYuF","cShY2K20wK","GWqqXtl72W","Zv7z0yToGW","RBhp0IjTwP",
+"djsrvokgRi","FPfSE16lHc","7fsYMF6PT2","gf8rIFNYIM","a00b5sqVrf","B3qemUl4a1","uoStwAgJHQ","jiVBP1LB1L","Z4I1vHfyNQ","tuDySFwEJz",
+"8U2nUFVMxo","ZJTXHfmIK1","oVQp6Twano","jS1aj8cVD3","hUTw7QbxXc","2hEEUsx5Gl","D6rByAOgEe","zQt6Quvf7A","NAFuws4786","lXFOB618Di",
+"5iGN5AOgEe","cQOnvFnPFB","FjHXRjSjS3","VNCPdv1Hln","ogLgc45cIH","8hJdtfcJOy","bgJAzs4786","IjTwPokgRi","qaofNRACuj","QssNCb29RJ",
+"WaWsvlweGy","4W0TlVjCZq","vkCHHoQ87r","JKWYRVerEA","7Ow5CuPX7G","Mm8sitlILt","9iGoTtAOsr","vkCHHFFDui","blLA9F6PT2","MaJQsnFqik",
+"Cp3mZ2Yz7E","Dz1R3FPfSE","WreyP2DREs","KsjRKK20wK","IRh48iKqhr","t98iWGSQwj","4QMc9ni2v1","GSQwjru4UG","qaofNru4UG","vOqCEFFDui",
+"kB5nPni2v1","v1HlnM6qcG","2hEEU1j5L8","SmGzvOUqFM","No0QbW7cTs","SWfouSbRYy","wiHrZnFqik","QWxoTOUqFM","gIYvEMGlTF","Oz8yZnnP8o",
+"FcWrW1LB1L","Kr8ystaOXK","24ARFRxrsm","fqypyhSSvQ","CdyBVSjskQ","0KyfsDLhzM","RzaZAfqypy","FGzgp8hJdt","atef2ZJTXH","lCMxyYw2oU",
+"hE1Ql9y4lw","jiVBPYw2oU","MaJQsCIShG","48cHLFVMxo","0h1b1uQIcz","zFgtBLbRTH","AgJHQMojnP","NhXdu0YAGH","IKxdL5drc6","ReKEWU3yw5",
+"ksJbyCK5W7","aFFssMK07Y","OHaBzpAhR1","lpF6Wm4bxU","uJScXQssNC","OUYuFpFrrl","5ZaEz6AFT0","he9IApmeCd","FhtglqQxHP","l83UdRpBQm",
+"ReKEWHlUbF","StlDJvkCHH","bgJAzy94nw","SWfouM3zXL","oQ87rIRh48","WaWsvIn3NS","lj07Q45cIH","580YD3otm6","8TxD77fKYU","RACujfFDrJ",
+"Y1mC0jiVBP","IBe8k2hEEU","W7cTsMkgy8","MK07Y9rlg9","FhtglIBe8k","cShY20BmCy","7ku1pnlaBy","5ZaEzPYBf4","i7WMQ0BmCy","Ul4a1b29RJ",
+"Uvlv4oGu6x","AXpwE5drc6","uoStwQClRL","y94nw29QAz","7X3uyBGaQY","Gv3FqfcwDa","gdQsSpmeCd","HfyNQ0ao3l","0KyfsDG4sT","uTacxSWfou",
+"aFFssi7WMQ","SWfouuAWyp","FNYIMi7WMQ","ZzJHWNAFuw","LDk6frhl0J","qUJMd7fsYM","FVMxoaL6AJ","wDajXReKEW","DQimpGSQwj","aDGtS45cIH",
+"pmeCdFPfSE","bZLvSuoStw","2DREsSs0Zu","2DREs5iGN5","JRJQBprNT6","9eoRc9y4lw","NcICAtl72W","QssNC1j5L8","lm0pDZJTXH","Yh1hFGXdoH",
+"tvdkDaL6AJ","Y1mC0LewvM","tlILtCqqaD","he9IAt59lR","sqVrfjtn0X","FNYIMfmIK1","Y1mC0d7vjM","M3zXLGWqqX","RsQUqoVQp6","v1HlngIYvE",
+"IjTwPxXTI4","pWiOsFnPFB","lsQGoIRh48","5drc6cmXIX","FwEJzFnPFB","RBhp0RsQUq","4QMc9sqVrf","HRxd8dhSuH","5drc6jtn0X","RkQkex3LDe",
+"pv0i71LB1L","9XyT9Yf2Ec","1v5hHMK07Y","i7WMQRACuj","gf8rIhUTw7","zQt6Q8U2nU","AXpwEYh1hF","GrDg7ZhwG1","5ZaEzi7WMQ","yToGW8xEKz",
+"Dz1R3rKDLJ","xXTI4In3NS","vLsmSNhXdu","HlUbFTXQ0Z","okgRiHP433","fqypylm0pD","5IhmGRkQke","KASQ8OHaBz","JkzUnQChxs","Waim6gIYvE",
+"fFDrJlm0pD","oVQp6wDajX","kB5nPK4GS8","M6qcGzY1GY","Cfgr3lH1kt","JIqXiIBe8k","7ku1pkZANm","ni2v1lH1kt","ZJTXHJ2mQi","Yf2EcGXdoH",
+"VerEAGv3Fq","Mkgy8i7WMQ","5VZjSaDGtS","lViBvJJs5m","NAFuwS2Dfu","m4bxUkZANm","9rlg9jiVBP","RmDcrC2Irc","tl72W0Kyfs","tlILt7fsYM",
+"zqH0WVNCPd","9rlg9VIlwP","zHF1q618Di","W3VFHksJby","Dz1R3FcWrW","lViBv5VZjS","vOqCEyvOMI","G1RhSLbRTH","HlUbFWDVWJ","s4786SbRYy",
+"jtn0XpFrrl","dhSuHv1Hln","0YAGHWreyP","16lHcPOUYS","7Ow5Ca00b5","RsQUqfaHir","Z4I1vZv7z0","kB5nPblLA9","FxX9qs4786","e6e4zcQOnv",
+"IKxdLWPmlx","K4GS8Yh1hF","8hJdtJXljW","W3VFHtvdkD","WMiS3gf8rI","WMiS35IhmG","euZA5CK5W7","OxWIHHfyNQ","8RCUAVprf2","Z4I1vFxX9q",
+"CK5W7fmIK1","YOfrYpT8wu","48cHLjeskS","QssNCoQ87r","B3qemBbwgA","1v5hHqQxHP","DcpWB64s8N","xReecix74r","WMiS3VBjhz","JJs5mzbIYY",
+"pvgjSJIqXi","tlILtlXFOB","zFgtByofH3","Gv3Fqlm0pD","fcJOyRzaZA","lViBvLewvM","guMb8HRxd8","JkzUnlweGy","7lUXZtaOXK","K20wKrhl0J",
+"fcwDaZUnqt","xReecLewvM","FnPFBvOqCE","WMiS37lUXZ","e6e4zm4bxU","y94nwRsQUq","yluBxUl4a1","m4bxUaDGtS","FVMxos4786","uLtKshe9IA",
+"2ZHdks7Mxk","48cHL45cIH","KsjRKU3yw5","GWqqXokgRi","QbxXctuDyS","lj07QU3yw5","9y4lwaL6AJ","MmsIoHP433","gtCA5CdyBV","Q6hMC0ao3l",
+"fcwDaG1RhS","hi5X7JXljW","IjTwPIn3NS","WaWsv2TRI7","JXljWfLNg8","Yw2oUtvdkD","gIYvEnlaBy","uAWyprKDLJ","Kr8ysNo0Qb","cL0aEcShY2",
+"HfyNQB3qem","xXTI4v8yFN","Yf2Ec4dEz6","9y4lwOxWIH","i3pydfcwDa","n1pmO0Wr5y","UmaEvvkCHH","9eoRcLDk6f","45cIHCqqaD","s93MlYf2Ec",
+"IBe8k7fKYU","Fhtgl0Kyfs","ksJbyiwzGk","RmDcrlViBv","M3zXL0Kyfs","5NammO3iyQ","FNYIM5drc6","5VZjSn8pJ9","y94nwDcpWB","PYBf4CqqaD",
+"fcJOyRkQke","bZLvSnnP8o","JKWYRU3yw5","ThjNnvLsmS","uJScXCIShG","1j5L8B3qem","Yf2EccmXIX","JkzUngtCA5","VLTy6FxX9q","HP433v2eC3",
+"2NslmyvOMI","fLNg8FnPFB","4W0TluQIcz","U3yw5uoStw","o8UydyluBx","zbIYYFwEJz","DG4sTHP433","zQt6Q7Ow5C","48cHLuvf7A","kZANm9iGoT",
+"RpBQmaFFss","B3qem9eoRc","uLtKslViBv","oVQp6BpYhV","SWfouCIShG","0Wr5ytl72W","0PktIx3LDe","yofH307n1c","euZA56AFT0","RsQUquupzk",
+"ZJTXHcmXIX","8cVD3pFrrl","LDk6ffmIK1","EdBKcChuy3","JkzUnNo0Qb","AXpwE5IhmG","hE1QlpmeCd","fcwDahE1Ql","tl72WprNT6","Uvlv45VZjS",
+"hUTw7prNT6","tvdkDoVQp6","OUqFMuvf7A","o8UydVprf2","SWfoupT8wu","RkQkeZ4I1v","s4786he9IA","pAhR18cVD3","Twanoix74r","P6bcgNo0Qb",
+"uvf7AFxX9q","uvf7AJIqXi","piJSklViBv","rz7Uts93Ml","TCgPp48cHL","NcICAFnPFB","iwzGkqUJMd","LbRTH9rlg9","7ku1patef2","I7p2azqH0W",
+"o8UydFnPFB","lj07QWaWsv","L7cGcYOfrY","EdBKchYBCK","4W0Tlsx5Gl","7X3uyhi5X7","kB5nPWPmlx","gf8rICqqaD","8hJdt48cHL","M3zXLWmadA",
+"CdyBVPOUYS","CK5W7okgRi","0YAGHbgJAz","sx5GlxXTI4","FcWrWlj07Q","CxVEfJIqXi","WreyPDLhzM","dmoS7dpe1v","taOXKNhXdu","NOHszguMb8",
+"yofH3Ul4a1","NcICAPb1pa","jSjS3uTacx","SmGzvNcICA","TXQ0Z7lUXZ","48cHLCfgr3","ThjNnJKWYR","euZA5rKDLJ","ThjNni7WMQ","dpe1vCqqaD",
+"iKqhrAgJHQ","NcICAlH1kt","14FLRRpBQm","soy9ta00b5","ThjNnzHF1q","oVQp61v5hH","OUqFMvLsmS","dhSuH8RCUA","JJs5mHP433","rz7UtL7cGc",
+"b29RJs7Mxk","uZPqgWaim6","uJScXbZLvS","8TxD7qUJMd","iwzGkuLtKs","7fKYUFhtgl","RsQUq5Drn0","W7cTslkMUA","jfREuyEfy9","CdyBVsoy9t",
+"pv0i7wDajX","Mm8siSbRYy","oVQp6B3qem","hE1QlTwano","t59lRdhSuH","s4786QbxXc","lpF6WGWqqX","v2eC3ni2v1","EoToPi7WMQ","dQ586MojnP",
+"CK5W77lUXZ","Yf2EclViBv","MGlTFUvlv4","7Ow5CP6bcg","fcwDazHF1q","D6rByZ4I1v","yvOMITXQ0Z","CNHmv6AFT0","9iGoTHlUbF","NOHszHfyNQ",
+"EoToPL7cGc","OxWIHQChxs","taOXKni2v1","mz8gxpWiOs","uAWypJKWYR","xReectAOsr","W7cTsZuDtD","48cHLJRJQB","FjHXR2ZHdk","1LB1LfmIK1",
+"2ZHdk0BmCy","QWxoT6AFT0","Yw2oUlkMUA","Uvlv4s7Mxk","nFqikoGu6x","FcWrWSbRYy","jSjS3Vprf2","atef2d85a9","ECMvUFPfSE","IKxdLlXFOB",
+"JKWYRjtn0X","8hJdt2TRI7","oQ87rgf8rI","JkzUnMK07Y","8FmFHQ6Lix","LewvM55rfB","guMb8Chuy3","5Drn0GrDg7","9rlg90YAGH","GrDg714FLR",
+"GSQwj3weIF","n8pJ9580YD","nlaByt98iW","2NslmXyPZN","yToGWlj07Q","NAFuw6AFT0","mX2GEQChxs","xReeclpF6W","suY4xFPfSE","AkKTk5iGN5",
+"Ta8f6AkKTk","jSjS3wiHrZ","8FmFHy94nw","5Drn00ao3l","XflUqMkgy8","TCgPp14FLR","9rlg97Ow5C","5iGN5euZA5","gjUTuFcWrW","S77LH8RCUA",
+"Ul4a1fcJOy","QworuS77LH","yvOMIuJScX","IKxdLNOHsz","Yw2oURpBQm","ZJTXH2hEEU","aL6AJ7ku1p","lH1ktoGu6x","QYxC0M6qcG","fcJOygf8rI",
+"DLhzMlpF6W","D6rBywiHrZ","VerEAReKEW","WreyPv8yFN","45cIHbZLvS","lXFOBjSjS3","PYBf4LbRTH","16lHcVjCZq","WDVWJdpe1v","nnP8oTa8f6",
+"Pb1pa4dEz6","K20wKZJTXH","yvOMIBFkb8","HP433HP433","FFDuigf8rI","FNYIMAIYUu","Zv7z0uvf7A","ECMvUCdyBV","WDVWJMmsIo","NOHszd7vjM",
+"hUTw7fLNg8","W3VFH2DREs","EdBKcbZLvS","5NammCNHmv","9y4lwaFFss","ix74rFNYIM","AgJHQuTacx","8hJdtjtn0X","QssNCMmsIo","HzZT8wiHrZ",
+"LewvMAgJHQ","FVMxo7lUXZ","x3LDepT8wu","AgJHQU3yw5","Yf2EcyvOMI","64s8NJkzUn","7fsYMuZPqg","rKDLJfcJOy","OUYuFDQimp","0ao3lKASQ8",
+"Gv3FqguMb8","2NslmS2Dfu","UlU3MYf2Ec","a00b5vOqCE","okgRiuQIcz","yofH3Fhtgl","M6qcGIn3NS","piJSkyEfy9","X6PinVBjhz","DQimpBFkb8",
+"FjHXRHP433","aL6AJdhSuH","uLtKsP6bcg","HzZT8Oz8yZ","RACujn8pJ9","cShY24W0Tl","0MR5Xd7vjM","KASQ8RACuj","MaJQs7lUXZ","Yf2Ech1zcH",
+"taOXKyofH3","nnP8oSmGzv","2DREs5Namm","UlU3MVprf2","KsjRK7X3uy","ZhwG1GrDg7","ogLgc4dEz6","8FmFHWPmlx","LewvMPYBf4","9GXkX6AFT0",
+"Zv7z0prNT6","tAOsrQClRL","oGu6xJRJQB","QYxC0AmdQd","DG4sTFVMxo","a00b5Rxrsm","8FmFHRmDcr","QbxXc9y4lw","7hyVv580YD","7lUXZQ6hMC",
+"he9IATwano","I7p2aECMvU","HRxd8ZUnqt","Q6hMCBGaQY","TXQ0Zv1Hln","qUJMdMaJQs","1v5hH5drc6","L7cGcuPX7G","pAhR1X6Pin","VIlwPFxX9q",
+"BCxeCt98iW","0PktIzqH0W","S2DfuDQimp","7Ow5C8TxD7","iB08l2hEEU","WDVWJLbRTH","O3iyQOxWIH","In3NSMkgy8","YjB9tAmdQd","IKxdLVNCPd",
+"h1zcH9y4lw","MGlTFaez9y","WaWsvydG8U","nFqikokgRi","zQt6QuQIcz","ulk41vLsmS","FLsphcShY2","OUYuFzqH0W","JRJQBYh1hF","CIShG4dEz6",
+"WmadATCgPp","fqypyNhXdu","SWfou07n1c","zz4ZUhYBCK","0PktIblLA9","CK5W7YOfrY","lXFOBHRxd8","JXljWjtn0X","BCxeCECMvU","oGu6x1j5L8",
+"FGzgpyofH3","bZLvS2ZHdk","i7WMQazIWp","m4bxUVNCPd","SmGzvgtCA5","prNT6y94nw","guMb8uupzk","2ZHdkzHF1q","CqqaD45cIH","Yh1hF0ao3l",
+"kB5nP16lHc","Dz1R3l83Ud","aFFssF6PT2","VjCZqoQ87r","mz8gx6q6L9","4W0Tl5Namm","24ARF7fKYU","e6e4zn1pmO","StlDJmz8gx","9rlg9djsrv",
+"SbRYyZJTXH","7X3uyfqypy","618DiP6bcg","zbIYYkB5nP","Ul4a1In3NS","m4bxUeuZA5","HfyNQNxx9V","uupzkWreyP","pvgjSxReec","oVQp6K20wK",
+"djsrvQWxoT","FjHXRZUnqt","2ZHdknlaBy","In3NSCdyBV","DcpWBe6e4z","hE1Ql8xEKz","ogLgc8TxD7","he9IAsuY4x","9XyT9pvgjS","zmLYD55rfB",
+"29QAzzHF1q","7lUXZuTacx","pv0i7J2mQi","uJScX7ku1p","9GXkXyToGW","t59lRTa8f6","HRxd8n1pmO","7Ow5CpWiOs","NhXduTwano","ZzJHWJJs5m",
+"RkQkeRkQke","rhl0JBCxeC","JXljW618Di","AmdQdJ2mQi","8TxD716lHc","EoToPKr8ys","Ul4a17X3uy","ni2v1ulk41","HlUbFIKxdL","QClRLatef2",
+"bZLvSb29RJ","sqVrfh1zcH","piJSkgdQsS","29QAzC2Irc","FNYIMFwEJz","GXdoHLewvM","KASQ8uTacx","D6rBykB5nP","lweGy64s8N","FwEJzZhwG1",
+"Cfgr3zbIYY","U3yw52hEEU","SjskQpvgjS","mX2GEHP433","2Yz7E5VZjS","ReKEWQChxs","QWxoTfLNg8","lm0pDAmdQd","v8yFNStlDJ","VIlwPgIYvE",
+"Mkgy8pAhR1","gdQsS5ZaEz","bZLvSKr8ys","jSjS3Cfgr3","atef28xEKz","yToGWQChxs","pAhR1NhXdu","bZLvSYh1hF","IRh48rhl0J","FjHXRKASQ8",
+"G1RhS2TRI7","MojnPzQt6Q","hUTw70h1b1","ECMvUECMvU","0MR5XcShY2","FjHXRPOUYS","GSQwjRzaZA","lsQGoNxx9V","GXdoHGWqqX","SWfouFPfSE",
+"QssNCpv0i7","7Ow5C5iGN5","aDGtS0YAGH","NOHszfLNg8","GXdoHP6bcg","RxrsmK4GS8","BGaQYuAWyp","CqqaDrz7Ut","29QAzuZPqg","ni2v1RmDcr",
+"ZzJHWhYBCK","K4GS8zQt6Q","gjUTuuQIcz","bZLvSh1zcH","FGzgpcShY2","I7p2aIRh48","pv0i7CdyBV","1LB1LMm8si","GSQwjnFqik","PYBf40YAGH",
+"lj07QtvdkD","ksJbyCfgr3","ulk417fsYM","uPX7GdQ586","DG4sTW7cTs","29QAzqQxHP","FwEJz55rfB","POUYS0ao3l","LewvMt59lR","WreyP4QMc9",
+"oGu6xzbIYY","45cIHtl72W","RsQUq7hyVv","MezSW8cVD3","qQxHPpmeCd","ru4UGtuDyS","14FLRyluBx","uQIczLbRTH","Nxx9V7ku1p","v8yFNjtn0X",
+"uvf7AUlU3M","MaJQsJ2mQi","jzUqRpmeCd","Ss0ZuFNYIM","FNYIML7cGc","yvOMIoGu6x","AIYUuTa8f6","64s8NjSjS3","uQIczVLTy6","LbRTHZhwG1",
+"t59lROUYuF","euZA5ReKEW","Yw2oUuTacx","Kr8ysWPmlx","SbRYyW3VFH","CxVEf7lUXZ","OUqFMMezSW","tjQxsXflUq","Nxx9VKsjRK","Q6LixCp3mZ",
+"Yh1hFZJTXH","cL0aERACuj","0MR5XVNCPd","zHF1qmX2GE","nnP8o9rlg9","hUTw7lXFOB","64s8Ns7Mxk","S2DfuQ6Lix","5drc6BbwgA","tuDySaL6AJ",
+"FGzgpD6rBy","HP4330BmCy","cQOnvYh1hF","uJScXMmsIo","k85AeJJs5m","oGu6xAkKTk","he9IAjSjS3","W3VFH5Mg9r","t59lRStlDJ","K20wKfmIK1",
+"5Drn0Rxrsm","RsQUqFxX9q","XyPZNW3VFH","lCMxyd85a9","RzaZAlpF6W","kZANmtAOsr","W3VFHOUqFM","16lHcrz7Ut","2Yz7EhUTw7","iwzGkt59lR",
+"9iGoThSSvQ","0ao3lFhtgl","d7vjMKASQ8","24ARFiwzGk","nlaBypiJSk","yvOMI8TxD7","ECMvUFLsph","a00b5IRh48","FVMxo6q6L9","fcJOyIn3NS",
+"WMiS3jtn0X","KASQ8o8Uyd","0Kyfst98iW","Nxx9VAkKTk","cQOnvm4bxU","wDajXOHaBz","fcwDaru4UG","b29RJogLgc","v8yFNogLgc","QnJ1S2TRI7",
+"MezSWtaOXK","nFqikRBhp0","P6bcglpF6W","4dEz6jtn0X","UmaEvqUJMd","djsrvWaim6","RsQUqUl4a1","t59lR9GXkX","uLtKsJ2mQi","Uvlv4lCMxy",
+"cmXIXfqypy","0YAGHlH1kt","iwzGkUlU3M","OHaBzbgJAz","dmoS7I7p2a","ZJTXH5Drn0","JKWYROxWIH","2ZHdkP6bcg","jfREus93Ml","he9IAwDajX",
+"v1HlnksJby","uQIczyToGW","wiHrZs7Mxk","YOfrYpAhR1","b29RJ9iGoT","OHaBz0BmCy","ciuWzfLNg8","dhSuHRmDcr","RxrsmChuy3","QChxsQ6hMC",
+"gtCA5FVMxo","uZPqgpFrrl","cQOnvpFrrl","Ta8f6NOHsz","iKqhrn1pmO","VerEAfmIK1","ZzJHWjeskS","9GXkX9rlg9","0h1b1yofH3","Zv7z014FLR",
+"G1RhSBpYhV","K20wKhYBCK","pT8wuFxX9q","KZamHQworu","KASQ864s8N","HlUbFHP433","rKDLJDG4sT","tlILt45cIH","JKWYRjS1aj","hYBCKYOfrY",
+"9eoRcfcJOy","FcWrWYh1hF","ZUnqtJXljW","qaofNBCxeC","nlaByHzZT8","ru4UGMkgy8","1j5L8MK07Y","In3NSn1pmO","HzZT8fqypy","oVQp6VerEA",
+"NOHszK20wK","nnP8oHlUbF","X6PintuDyS","W7cTsIKxdL","Q6LixxXTI4","nnP8oVjCZq","Pb1pai7WMQ","k85AeoVQp6","5IhmGMGlTF","4QMc9uZPqg",
+"W3VFH9rlg9","ksJbyt59lR","QChxsokgRi","ZJTXHv1Hln","GSQwjK4GS8","iqv4kC2Irc","DQimp64s8N","7X3uyOUqFM","7fsYMtaOXK","Cp3mZzbIYY",
+"JRJQBD6rBy","hE1QlokgRi","l83UdjzUqR","JJs5mZv7z0","dmoS7OUqFM","bZLvSGXdoH","5nmWv5iGN5","0BmCyVBjhz","xReeclH1kt","5Drn0TXQ0Z",
+"nFqikIBe8k","jtn0XSmGzv","uTacx16lHc","HP433kB5nP","FhtglyEfy9","e6e4zSWfou","WreyPnFqik","uupzkdjsrv","qQxHPVLTy6","W3VFH8hJdt",
+"kB5nPZ4I1v","I7p2aGrDg7","jSjS3Cp3mZ","VBjhzBFkb8","ogLgcW7cTs","tvdkDZv7z0","FwEJz580YD","jeskSciuWz","yluBxEoToP","FLsphpWiOs",
+"7Ow5CAmdQd","MmsIojSjS3","QbxXcs4786","uZPqguoStw","FNYIMStlDJ","2DREsyvOMI","prNT6jfREu","QYxC0No0Qb","Cfgr3ZJTXH","pWiOsVNCPd",
+"8hJdtChuy3","bZLvSlH1kt","Fhtglx3LDe","9eoRclsQGo","BFkb8pAhR1","Dz1R35VZjS","2TRI72Nslm","07n1cQChxs","Uvlv4P6bcg","AkKTkjSjS3",
+"ReKEWL7cGc","fmIK1bZLvS","AXpwEgdQsS","uTacxQworu","QChxszQt6Q","aL6AJKsjRK","K20wKWaWsv","rz7UtRxrsm","AgJHQFnPFB","guMb8KsjRK",
+"lkMUAyToGW","AIYUu8FmFH","jSjS3pWiOs","hi5X7SmGzv","GXdoHgjUTu","ogLgcS77LH","Uvlv4djsrv","nFqikXflUq","hi5X7oGu6x","Nxx9Vs4786",
+"aez9yn1pmO","GWqqXrz7Ut","ZhwG1aez9y","BGaQYkZANm","Q6hMCW3VFH","Yh1hFrKDLJ","M3zXLPOUYS","lCMxyOxWIH","0PktIMaJQs","a00b5vkCHH",
+"Oz8yZfqypy","hi5X7FwEJz","gtCA5ECMvU","5VZjS9XyT9","bgJAz5ZaEz","oQ87rMaJQs","yofH3SjskQ","KZamHEoToP","S2Dfufqypy","kZANm2Yz7E",
+"MGlTFgtCA5","0MR5Xdjsrv","4dEz6h1zcH","Kr8ysU3yw5","uZPqg0PktI","S2DfuzqH0W","OUYuFsx5Gl","QChxsRsQUq","7X3uyFNYIM","AXpwEhi5X7",
+"v2eC3b29RJ","DLhzM1v5hH","mX2GEWMiS3","iKqhr29QAz","Yw2oUP6bcg","iB08lMK07Y","hUTw75iGN5","d7vjM6q6L9","NAFuwStlDJ","AXpwE580YD",
+"RACujprNT6","Q6hMCSmGzv","dQ586MmKGJ","24ARFY1mC0","VIlwPLewvM","uN6r3Mkgy8","Cfgr3IBe8k","tjQxspWiOs","NOHszhe9IA","k85Aedjsrv",
+"nlaByxciqp","lj07QuLtKs","xReecatef2","VjCZqKsjRK","Yf2EclH1kt","hi5X7okgRi","AkKTkK20wK","7hyVvMmsIo","0YAGHatef2","POUYSfcwDa",
+"VBjhz64s8N","uPX7GFFDui","Yh1hFQbxXc","hE1QlyvOMI","uTacxBpYhV","CIShGyToGW","D6rByQClRL","2Yz7EcShY2","zHF1qgjUTu","W7cTsJkzUn",
+"16lHcIn3NS","JJs5mdQ586","gdQsSDQimp","BCxeCwDajX","t98iWvkCHH","gIYvEqQxHP","OUqFMguMb8","5iGN5lCMxy","GSQwjPYBf4","WreyPFcWrW",
+"GrDg7pT8wu","jfREuHRxd8","Qworu45cIH","YjB9tatef2","VNCPdBbwgA","s4786MmKGJ","lm0pDi3pyd","rKDLJjzUqR","YOfrYjSjS3","7X3uyTCgPp",
+"5ZaEzuvf7A","5ZaEzFhtgl","Mkgy8DLhzM","cQOnvTwano","POUYSAOgEe","okgRilweGy","LbRTHNxx9V","2TRI7lViBv","BCxeCuTacx","i3pydwiHrZ",
+"7lUXZHRxd8","Q6Lixv2eC3","hi5X72ZHdk","v1HlnC2Irc","prNT6WaWsv","BFkb8v1Hln","JIqXiF6PT2","lm0pDNhXdu","JXljWF6PT2","ThjNnIBe8k",
+"2TRI7Uvlv4","bgJAztjQxs","0Wr5yIn3NS","5ZaEzC2Irc","zbIYYPOUYS","jS1ajWaim6","atef22ZHdk","JJs5mtjQxs","s93Ml7fKYU","MK07Y0MR5X",
+"AOgEegIYvE","hE1QlRACuj","uTacxIKxdL","uJScXSWfou","ksJbyWDVWJ","jfREu9XyT9","FwEJzcmXIX","55rfBokgRi","uQIczNAFuw","TCgPpMaJQs",
+"ru4UGG1RhS","pT8wuzz4ZU","6AFT0pAhR1","8RCUAHlUbF","5VZjSJXljW","PYBf4Dz1R3","jfREuoVQp6","P6bcghSSvQ","QClRLI7p2a","5NammFVMxo",
+"In3NSGSQwj","0PktIt59lR","Yw2oU1v5hH","1v5hHVNCPd","JXljWK20wK","CK5W7Pb1pa","i7WMQgIYvE","EOE1oBGaQY","jeskSVjCZq","uAWypK4GS8",
+"yofH3QnJ1S","29QAz0PktI","rKDLJStlDJ","n1pmOM6qcG","lCMxyFcWrW","aFFss9eoRc","QnJ1SuAWyp","uLtKsdjsrv","7hyVvUmaEv","Y1mC0cQOnv",
+"3otm6xReec","3otm655rfB","HfyNQECMvU","Mm8siX6Pin","jiVBPi7WMQ","xReecfLNg8","IjTwPFFDui","Chuy3zz4ZU","pWiOskB5nP","PYBf45Namm",
+"d7vjMFhtgl","yEfy9QnJ1S","lsQGotjQxs","gtCA5dpe1v","VBjhzyEfy9","9y4lwkB5nP","1v5hHuupzk","7X3uyyToGW","5drc6RmDcr","DG4sTfFDrJ",
+"F6PT2iKqhr","QChxs5ZaEz","EOE1o618Di","AOgEedQ586","FNYIMdhSuH","bgJAz9XyT9","Cfgr3hi5X7","fqypy8RCUA","GrDg7AmdQd","L7cGcVLTy6",
+"BbwgAWaWsv","pmeCdLDk6f","hE1QlGrDg7","M6qcGEoToP","DQimpuupzk","POUYSRACuj","SbRYy55rfB","AXpwEogLgc","VerEAi3pyd","cShY2Ss0Zu",
+"a00b5RsQUq","a00b5piJSk","bgJAzcmXIX","5ZaEze6e4z","s4786L7cGc","5iGN5b29RJ","hi5X79rlg9","qaofNYOfrY","cL0aE07n1c","ix74rjiVBP",
+"NOHsz4QMc9","v1Hln0Wr5y","LbRTHGrDg7","l83UdRBhp0","WMiS32Nslm","AmdQdhYBCK","pWiOspT8wu","7X3uyUl4a1","FVMxov2eC3","2Yz7EEOE1o",
+"ydG8Uru4UG","QWxoTU3yw5","zHF1qix74r","jS1ajogLgc","vOqCESjskQ","pv0i7X6Pin","FPfSE5Namm","vLsmSL7cGc","soy9txciqp","pWiOs5iGN5",
+"FwEJzBpYhV","y94nwtaOXK","fcJOy8xEKz","EdBKc14FLR","5Mg9rRmDcr","FhtglzmLYD","v2eC3s4786","bZLvSmz8gx","wiHrZbrhlQ","JXljWIKxdL",
+"zHF1qzQt6Q","MGlTFW7cTs","EOE1ojzUqR","9iGoTx3LDe","tlILtCp3mZ","FcWrWpWiOs","CNHmvRBhp0","tjQxsFjHXR","Dz1R3IBe8k","VerEAQssNC",
+"nnP8oQ6Lix","CqqaDDQimp","U3yw5uQIcz","sx5Gl5VZjS","LbRTHcShY2","B3qemgjUTu","yluBxYf2Ec","Dz1R35Drn0","b29RJ7Ow5C","yvOMIM3zXL",
+"VBjhzCfgr3","mz8gxBpYhV","KASQ814FLR","FLsph5Namm","HfyNQRsQUq","n1pmONhXdu","QClRL580YD","QworupFrrl","Yf2Ec2DREs","5nmWvaez9y",
+"SbRYyAOgEe","FwEJzNhXdu","fcJOyrKDLJ","MezSWNAFuw","VNCPdWaWsv","iqv4kLDk6f","IRh48GrDg7","Rxrsm3otm6","k85AeRpBQm","K4GS8ZJTXH",
+"BCxeCBbwgA","m4bxUMmKGJ","zQt6QMojnP","8TxD7W3VFH","uoStwhSSvQ","K4GS855rfB","dQ586pT8wu","s93MlJJs5m","AOgEeJKWYR","5Mg9rsx5Gl",
+"s93MlSs0Zu","OxWIHVNCPd","ZuDtDokgRi","ZuDtDmz8gx","0Wr5yVerEA","t59lR0PktI","W7cTsNhXdu","55rfB3otm6","9y4lw7ku1p","FNYIMlm0pD",
+"MmsIoVLTy6","t98iWJKWYR","hi5X7v8yFN","FPfSEWPmlx","Mm8siS77LH","Vprf2MmKGJ","BGaQYK20wK","AmdQdhi5X7","QChxsYf2Ec","GXdoHKr8ys",
+"FjHXRJIqXi","ogLgc5VZjS","ReKEWyluBx","4dEz6ni2v1","bgJAzb29RJ","Yf2EcbZLvS","ogLgcQClRL","RzaZACNHmv","0YAGHZUnqt","WreyPb29RJ",
+"M3zXLd85a9","PYBf45Drn0","BpYhVAXpwE","jfREu1j5L8","pFrrls7Mxk","6AFT0IRh48","LewvM4QMc9","BpYhVEoToP","okgRiGSQwj","JRJQB48cHL",
+"lH1ktFnPFB","iqv4kNOHsz","YjB9tni2v1","NhXduCfgr3","B3qem7hyVv","FjHXRs4786","OxWIHrKDLJ","Cp3mZuQIcz","7lUXZAXpwE","kB5nPIn3NS",
+"s7Mxkxciqp","FNYIMUmaEv","GXdoHlpF6W","JIqXi2Yz7E","ogLgcWPmlx","v2eC3t59lR","RpBQmrz7Ut","ReKEWrz7Ut","BGaQYZzJHW","AkKTkzz4ZU",
+"OHaBzDQimp","1j5L8uPX7G","7X3uyqaofN","2NslmdQ586","xciqpjS1aj","pAhR18xEKz","jiVBPWaWsv","RsQUq2TRI7","cQOnvrhl0J","5VZjS8hJdt",
+"e6e4z8U2nU","FFDuia00b5","O3iyQciuWz","580YDMaJQs","CxVEfzz4ZU","5Drn0HlUbF","uupzkRzaZA","ogLgc9eoRc","ni2v1K4GS8","RzaZAFwEJz",
+"D6rByMmsIo","jiVBP7ku1p","MezSWuZPqg","i7WMQCdyBV","JIqXiCxVEf","v1HlnzbIYY","0ao3l7ku1p","580YDt98iW","DQimpy94nw","K4GS8ZuDtD",
+"XyPZNUmaEv","rhl0JSmGzv","VNCPd8cVD3","ECMvUIRh48","618DioVQp6","O3iyQvLsmS","2Yz7EiB08l","zbIYYsoy9t","pT8wu45cIH","v1HlntaOXK",
+"soy9t2DREs","RpBQmSWfou","soy9tMm8si","jzUqR580YD","lXFOBQnJ1S","zY1GYQWxoT","FLsphfFDrJ","DcpWBQYxC0","BCxeCCIShG","rz7UtFLsph",
+"FLsphAXpwE","RxrsmJXljW","J2mQiTCgPp","9iGoT7fsYM","VIlwPRACuj","8TxD7qQxHP","BpYhVrhl0J","SbRYyK4GS8","JKWYRhe9IA","guMb8atef2",
+"14FLRYw2oU","FLsphReKEW","soy9tlXFOB","LewvMGWqqX","zz4ZUlpF6W","SmGzvdjsrv","ZhwG1aDGtS","zbIYYDz1R3","9GXkXM6qcG","LDk6ft59lR",
+"5VZjSgtCA5","Yf2EcOUqFM","HRxd8fqypy","rhl0JDQimp","uJScX580YD","piJSkFFDui","d85a99eoRc","suY4xLbRTH","RsQUqG1RhS","jS1ajD6rBy",
+"yToGWv8yFN","yEfy9ZUnqt","EoToP4QMc9","lpF6WqUJMd","7fsYM8cVD3","MaJQsHfyNQ","b29RJ7fsYM","rz7UtjiVBP","8TxD77fsYM","VNCPdgtCA5",
+"fFDrJPYBf4","IjTwP2hEEU","16lHcTa8f6","CNHmvJRJQB","QChxsfcJOy","0YAGH5IhmG","KsjRK7hyVv","MGlTFydG8U","bgJAzcShY2","In3NS0PktI",
+"580YDyEfy9","brhlQlweGy","s93MlhE1Ql","ThjNncQOnv","PYBf4QssNC","x3LDeS2Dfu","16lHcoGu6x","No0QbFPfSE","oGu6xSbRYy","d7vjMiKqhr",
+"gtCA54W0Tl","Oz8yZs7Mxk","5drc6dpe1v","GWqqXEdBKc","sx5GlokgRi","64s8NqQxHP","iKqhrJXljW","6AFT0pFrrl","iwzGkqaofN","k85Aex3LDe",
+"ZUnqt7fsYM","MezSWP6bcg","aFFssbgJAz","blLA9ZzJHW","GWqqX7Ow5C","tvdkDBFkb8","wDajXS77LH","d7vjM4QMc9","yofH3B3qem","Vprf2gIYvE",
+"VerEAdQ586","Chuy3l83Ud","FGzgpTwano","F6PT2tl72W","lCMxyKZamH","C2Irc7fKYU","xciqp0h1b1","Uvlv4fqypy","2TRI7VLTy6","gtCA5ZJTXH",
+"xReecv8yFN","zQt6Qt98iW","brhlQVNCPd","MaJQsyluBx","0BmCyzmLYD","JXljWgIYvE","i3pydkB5nP","IjTwPzY1GY","MezSWFwEJz","Z4I1v24ARF",
+"RpBQmhe9IA","CqqaDKr8ys","GWqqX0YAGH","dpe1viB08l","POUYSK20wK","v8yFNVNCPd","S77LHAIYUu","OHaBzjzUqR","jSjS3vOqCE","jeskSgjUTu",
+"ThjNno8Uyd","jzUqR3otm6","07n1c9rlg9","3weIF2Yz7E","vOqCEyToGW","6AFT0NcICA","Nxx9Vt59lR","vOqCEl83Ud","C2Ircxciqp","RpBQmLDk6f",
+"ZhwG1mX2GE","OUqFMix74r","s93Ml8U2nU","QYxC0gIYvE","W7cTs7fsYM","s7Mxkni2v1","GWqqX0BmCy","rKDLJpiJSk","wiHrZkZANm","Uvlv4HlUbF",
+"iKqhrkZANm","Oz8yZHRxd8","CxVEfrz7Ut","MGlTFmz8gx","zHF1qa00b5","JJs5mcmXIX","oVQp6DQimp","EdBKc3weIF","QworuFnPFB","B3qemiKqhr",
+"0MR5XUvlv4","VBjhzxXTI4","8TxD748cHL","Cfgr3GSQwj","55rfBIn3NS","IjTwPhe9IA","ZJTXH5Mg9r","o8UydFVMxo","B3qem618Di","YOfrY2TRI7",
+"PYBf46q6L9","o8UydFxX9q","ReKEWwiHrZ","Nxx9V1j5L8","ZUnqthUTw7","i7WMQ1j5L8","1j5L8IBe8k","he9IAiwzGk","Ul4a1WDVWJ","aez9yaFFss",
+"Yw2oUdjsrv","x3LDe8hJdt","D6rByyToGW","4QMc9rhl0J","48cHLlkMUA","zqH0WyluBx","prNT6ni2v1","qaofNGWqqX","lViBvQworu","WMiS3cmXIX",
+"jzUqRy94nw","07n1cbrhlQ","dmoS7JXljW","J2mQiZuDtD","2Yz7E8RCUA","uLtKsM6qcG","1LB1LuPX7G","tlILtjeskS","AmdQdKZamH","9rlg97hyVv",
+"AkKTkGWqqX","WmadA8TxD7","zHF1quLtKs","aFFssECMvU","oVQp6GrDg7","mz8gx5Drn0","MaJQsdhSuH","soy9tfqypy","ZuDtDgf8rI","rz7Utt59lR",
+"2TRI7v8yFN","FhtgltuDyS","ThjNnZzJHW","3weIFIjTwP","FPfSEx3LDe","9GXkXlpF6W","hUTw7qUJMd","9y4lwZv7z0","ZJTXHReKEW","tuDySOUqFM",
+"4W0TlzHF1q","VerEAQYxC0","jtn0XfaHir","euZA5WPmlx","brhlQIRh48","S2DfuBCxeC","dhSuHFhtgl","ZzJHWuLtKs","JRJQBnFqik","WPmlxYh1hF",
+"fmIK1Yw2oU","NhXduReKEW","djsrvQ6hMC","lH1kt9iGoT","ix74rKASQ8","1j5L8L7cGc","BFkb8cShY2","iKqhriwzGk","v8yFNAmdQd","oVQp6lCMxy",
+"brhlQFnPFB","24ARFjSjS3","euZA57fsYM","TCgPp64s8N","CIShGVNCPd","lsQGosqVrf","EOE1ojeskS","zHF1qhYBCK","Cfgr3b29RJ","oVQp6Waim6",
+"xciqptvdkD","euZA5I7p2a","okgRitlILt","Zv7z0dmoS7","xXTI41j5L8","29QAz07n1c","LDk6ffFDrJ","okgRiMK07Y","Kr8ysRkQke","uLtKszY1GY",
+"5drc65nmWv","Ss0ZuAgJHQ","4dEz6J2mQi","45cIHEdBKc","bgJAzdmoS7","gjUTuOUqFM","D6rBytlILt","M3zXLuAWyp","WMiS3yEfy9","2Yz7EuQIcz",
+"L7cGcaL6AJ","FNYIMTwano","5Drn0xReec","FGzgp0MR5X","I7p2aQWxoT","AIYUuuupzk","fLNg8L7cGc","JkzUny94nw","M6qcGCNHmv","EOE1oEdBKc",
+"lj07QoVQp6","ZuDtDpiJSk","Ul4a10h1b1","MojnPL7cGc","Pb1paMaJQs","No0Qb5drc6","pvgjSHfyNQ","gdQsSyToGW","v2eC3vkCHH","9y4lwLewvM",
+"xciqpRkQke","JkzUnCdyBV","GSQwjEOE1o","zY1GYWPmlx","Q6LixTa8f6","jfREupiJSk","lViBvVprf2","OUqFMHzZT8","tjQxslj07Q","okgRiSmGzv",
+"qQxHPECMvU","QWxoTUvlv4","taOXKprNT6","iqv4k0h1b1","24ARFOxWIH","jeskSnFqik","5drc6TCgPp","taOXKFFDui","l83Udn1pmO","pvgjSoVQp6",
+"618Di7Ow5C","RpBQmDQimp","QbxXcNcICA","3otm6QbxXc","uN6r3rz7Ut","7fsYMtuDyS","MK07YhUTw7","4W0Tl7Ow5C","8U2nUazIWp","VLTy6lkMUA",
+"tjQxs5Namm","TXQ0Z8FmFH","yluBxfFDrJ","lm0pDCxVEf","0h1b1QssNC","Uvlv4RsQUq","xReec2Yz7E","tlILtECMvU","Z4I1vBFkb8","ZzJHWtl72W",
+"YjB9t5Namm","5IhmGbgJAz","iqv4kQClRL","HzZT8No0Qb","BpYhV7fKYU","DcpWBVjCZq","8hJdt9rlg9","MezSWt59lR","pWiOs0MR5X","OHaBzxXTI4",
+"P6bcg9GXkX","SWfouVIlwP","6AFT0L7cGc","XyPZNMGlTF","DQimpW3VFH","uTacxdmoS7","NcICAlj07Q","atef2Chuy3","1j5L8RsQUq","s93MlQssNC",
+"uZPqgk85Ae","xXTI4xciqp","SjskQNhXdu","No0QbfLNg8","uQIczlweGy","QYxC0Gv3Fq","fcJOytAOsr","gdQsSjzUqR","QssNCuAWyp","t98iWDz1R3",
+"B3qemyvOMI","blLA9RACuj","29QAzYOfrY","vOqCExXTI4","9XyT9F6PT2","Dz1R3C2Irc","nnP8oTXQ0Z","CK5W7Rxrsm","s7MxkStlDJ","Ss0ZuvLsmS",
+"QYxC0StlDJ","tAOsr29QAz","MmKGJVLTy6","VIlwP0Kyfs","qQxHPh1zcH","MezSW9GXkX","Zv7z0gtCA5","NhXduuvf7A","1v5hHUvlv4","Ta8f69eoRc",
+"lH1ktmX2GE","FxX9qv1Hln","pFrrlFwEJz","RACujOxWIH","IRh48jeskS","I7p2abZLvS","sx5GlnnP8o","l83UdlsQGo","Mkgy8soy9t","d85a90PktI",
+"AgJHQgf8rI","lCMxymz8gx","iwzGk2TRI7","6q6L9UmaEv","v1HlnJ2mQi","FLsphFcWrW","jzUqRSbRYy","3otm6iKqhr","Gv3FquPX7G","vLsmSFLsph",
+"QChxso8Uyd","dpe1vblLA9","24ARFlkMUA","5ZaEzhSSvQ","zz4ZULbRTH","zz4ZUfcJOy","cQOnvFxX9q","x3LDeprNT6","MaJQssx5Gl","sx5GlKZamH",
+"jzUqRuJScX","MezSWo8Uyd","6AFT0GrDg7","BpYhVYf2Ec","lCMxyAOgEe","wDajXFNYIM","W7cTsTXQ0Z","1v5hHkB5nP","KZamHW7cTs","QssNCm4bxU",
+"K20wKQWxoT","nFqikoQ87r","LDk6fOHaBz","JkzUnQ6Lix","uQIcz64s8N","fcJOyVerEA","JIqXi0Wr5y","0h1b1SWfou","No0QbtaOXK","pmeCd0PktI",
+"GrDg7kB5nP","cShY2MezSW","hi5X7DcpWB","3otm6FVMxo","SjskQJJs5m","U3yw58hJdt","lj07Q3weIF","RxrsmgdQsS","guMb8WaWsv","zmLYDKASQ8",
+"gjUTuGSQwj","n8pJ9B3qem","0ao3lnFqik","NcICA4QMc9","WmadA2DREs","s478648cHL","IRh483weIF","JRJQBksJby","v8yFNOUYuF","WreyPChuy3",
+"U3yw5TXQ0Z","bgJAziqv4k","qUJMd9rlg9","9eoRcD6rBy","FPfSEjzUqR","LbRTHBpYhV","nFqik5Drn0","VLTy6WreyP","8xEKzJRJQB","CIShGtuDyS",
+"rKDLJuN6r3","No0Qbs93Ml","QworuQssNC","0PktInlaBy","yluBxpiJSk","zHF1qMkgy8","Vprf2JkzUn","cQOnvKsjRK","7X3uy8RCUA","uJScXmX2GE",
+"taOXKmz8gx","yluBx9GXkX","HRxd8ix74r","FLsphhSSvQ","0h1b19y4lw","VjCZqMojnP","Fhtgl2hEEU","LewvMuQIcz","Dz1R3uLtKs","4W0TljSjS3",
+"tlILtWPmlx","rhl0JAmdQd","C2Irc5IhmG","ThjNnFxX9q","h1zcHBCxeC","jS1ajZhwG1","Zv7z0RsQUq","AOgEezbIYY","WaWsv0YAGH","tjQxs8FmFH",
+"xciqpFwEJz","AOgEejS1aj","618DiCIShG","1v5hHzQt6Q","4QMc9fcJOy","s4786X6Pin","Q6hMCM6qcG","FcWrWQssNC","ydG8UDQimp","HfyNQ14FLR",
+"5NammtvdkD","5iGN5s93Ml","iB08lEOE1o","ThjNn5Namm","MGlTFuZPqg","55rfByofH3","qUJMdtvdkD","8xEKzh1zcH","o8UydXyPZN","i7WMQFVMxo",
+"tAOsrl83Ud","xXTI4RsQUq","atef2EOE1o","JkzUn1v5hH","RBhp05IhmG","gf8rIFGzgp","OxWIH9GXkX","zFgtBS2Dfu","AgJHQ6q6L9","aFFss5iGN5",
+"QWxoTgf8rI","l83Ud9y4lw","vLsmSOHaBz","KsjRKpv0i7","BFkb8Oz8yZ","0MR5XW3VFH","5VZjS8xEKz","v2eC3ZJTXH","ydG8UeuZA5","BpYhVuAWyp",
+"POUYSCqqaD","7X3uy24ARF","JKWYR5drc6","AgJHQSs0Zu","1LB1LMmKGJ","ECMvU5iGN5","nFqikMojnP","Y1mC0NcICA","HlUbFzFgtB","5Mg9rOxWIH",
+"QworuZzJHW","AIYUudQ586","lsQGoJXljW","9GXkXaL6AJ","dQ586RmDcr","0PktIpFrrl","uvf7AIBe8k","0YAGHD6rBy","JXljWdmoS7","wDajXMmKGJ",
+"LDk6fxReec","B3qemqUJMd","oGu6xFLsph","FLsphh1zcH","zqH0WS77LH","BbwgARzaZA","iwzGkVLTy6","07n1caDGtS","8U2nU8FmFH","ru4UGrhl0J",
+"OUYuFBCxeC","Ss0Zu8TxD7","kZANmsuY4x","7fsYM24ARF","RpBQmwDajX","0BmCyLewvM","jfREuWMiS3","0MR5Xk85Ae","5iGN5Ul4a1","RsQUqjzUqR",
+"0h1b1he9IA","GWqqXOUqFM","WaWsvdhSuH","gIYvEtAOsr","ksJbyFGzgp","5nmWvlViBv","VjCZqgIYvE","zbIYYGXdoH","zQt6Qatef2","lm0pDfaHir",
+"Q6hMCLDk6f","s4786DLhzM","UlU3MprNT6","FFDuirKDLJ","aL6AJ618Di","fmIK1ulk41","JXljWqQxHP","Ul4a1EOE1o","dpe1vxReec","mX2GEgf8rI",
+"Pb1paGXdoH","CqqaDUl4a1","5Mg9rQnJ1S","xciqpuTacx","SbRYyQWxoT","lpF6WNo0Qb","7hyVvv8yFN","MaJQsTa8f6","i3pyd0MR5X","ReKEWpmeCd",
+"ReKEWWaim6","Yf2EcNxx9V","SmGzvUvlv4","S2Dfu2ZHdk","9GXkX0h1b1","l83UdVprf2","DcpWBiKqhr","tuDyS16lHc","uvf7ABFkb8","Kr8ysaFFss",
+"VjCZqJ2mQi","FhtglTCgPp","SWfouRxrsm","QClRLRkQke","RsQUqWDVWJ","s93MluZPqg","JIqXiFjHXR","fcwDaWDVWJ","okgRi24ARF","Gv3Fq7X3uy",
+"14FLRJRJQB","yofH3JJs5m","6q6L9LDk6f","t98iWRmDcr","StlDJG1RhS","gjUTudpe1v","uTacxlpF6W","JkzUnUl4a1","ThjNnWreyP","gIYvEKZamH",
+"NAFuw7fsYM","jeskSuZPqg","hUTw72TRI7","XflUqnlaBy","rhl0JNo0Qb","O3iyQSmGzv","I7p2aWaWsv","qaofNEOE1o","piJSkG1RhS","FxX9qiKqhr",
+"CIShGtl72W","AOgEeguMb8","Chuy3XflUq","X6PinQworu","M6qcGzbIYY","Nxx9VB3qem","zQt6Q0Wr5y","qUJMdiqv4k","hE1QlWPmlx","RzaZAe6e4z",
+"ksJbyThjNn","Z4I1v1j5L8","ru4UGDLhzM","W3VFHkZANm","Z4I1v2TRI7","5Drn0lsQGo","Ta8f6Vprf2","lpF6W8xEKz","dpe1vDLhzM","YOfrYRkQke",
+"Q6LixMezSW","v1Hlnatef2","ru4UGZhwG1","oVQp6M3zXL","pAhR1tlILt","hi5X7tlILt","0Wr5ybrhlQ","qQxHP9rlg9","x3LDeQnJ1S","qUJMdGXdoH",
+"Waim6DcpWB","RBhp0mX2GE","aL6AJWPmlx","uZPqg7fKYU","FxX9qQ6Lix","TXQ0Zb29RJ","soy9tTwano","aL6AJe6e4z","gIYvEjS1aj","aFFssiB08l",
+"Q6hMCCIShG","FhtgllViBv","OUqFM8hJdt","oGu6xBCxeC","8xEKz48cHL","6q6L95iGN5","S77LH1j5L8","vkCHHcmXIX","b29RJPOUYS","7lUXZVNCPd",
+"kZANmgf8rI","xciqpSs0Zu","NOHsz5VZjS","cL0aEv2eC3","7fsYMlCMxy","dQ586Vprf2","XyPZNuZPqg","QbxXcReKEW","vkCHHDG4sT","2Yz7EyToGW",
+"IBe8k8RCUA","16lHcBGaQY","ZuDtDqQxHP","M3zXL2ZHdk","jiVBPbgJAz","qQxHPk85Ae","2ZHdkKsjRK","Waim6VBjhz","7fKYULDk6f","CNHmvBCxeC",
+"8cVD3aDGtS","D6rByVjCZq","n1pmORpBQm","zmLYD618Di","bgJAzdQ586","HP433suY4x","ReKEWy94nw","2hEEUMezSW","GrDg7MezSW","iB08lTCgPp",
+"BbwgAqUJMd","64s8Nlj07Q","jfREuuPX7G","wiHrZuJScX","lkMUAlXFOB","QClRLy94nw","M3zXLNhXdu","8cVD3SbRYy","5nmWvlsQGo","zz4ZU618Di",
+"hE1QlvkCHH","7X3uyxReec","djsrvblLA9","yluBxHP433","cL0aE2Yz7E","mz8gxtAOsr","QWxoTQClRL","DcpWBC2Irc","4QMc9hYBCK","MaJQsAXpwE",
+"gjUTuVBjhz","QYxC0suY4x","IBe8kfFDrJ","ciuWzCxVEf","D6rByYf2Ec","m4bxUVLTy6","uupzk7lUXZ","Yh1hF8FmFH","4QMc924ARF","jSjS3PYBf4",
+"5Drn05iGN5","zmLYDSjskQ","K20wKciuWz","M6qcGs93Ml","y94nwfcJOy","HP433RsQUq","kZANm8U2nU","45cIHjS1aj","TCgPpzbIYY","xciqpIKxdL",
+"8cVD3yEfy9","C2Irc9eoRc","vkCHHFjHXR","kZANmxciqp","HfyNQeuZA5","FjHXRsqVrf","mz8gx07n1c","6AFT07X3uy","Waim6CIShG","qUJMdPOUYS",
+"MK07YeuZA5","oQ87r580YD","HP4336AFT0","v2eC3xReec","gIYvEzqH0W","ThjNn9XyT9","t59lRlCMxy","tuDySlsQGo","Ss0ZuaDGtS","uLtKsjS1aj",
+"BbwgAK20wK","VBjhzDcpWB","zHF1qfFDrJ","MmKGJBbwgA","VBjhzVIlwP","jzUqRzqH0W","lj07QlkMUA","gIYvECfgr3","Gv3FqoQ87r","aDGtSGXdoH",
+"x3LDezbIYY","pT8wuzbIYY","CdyBV0BmCy","MmsIoydG8U","Uvlv4aL6AJ","BpYhV2TRI7","aDGtStlILt","lViBvksJby","CNHmvi7WMQ","VNCPd7hyVv",
+"5drc63otm6","9eoRcNAFuw","HfyNQni2v1","ZhwG1DQimp","iwzGkgjUTu","FNYIM4dEz6","dQ586VNCPd","RkQkeK4GS8","uoStwW7cTs","8TxD7v1Hln",
+"5ZaEzfqypy","6AFT0fFDrJ","v1HlnpmeCd","5Mg9rWPmlx","6AFT0iKqhr","8RCUAWDVWJ","fqypyHP433","hE1QlDLhzM","FPfSETXQ0Z","6q6L93otm6",
+"07n1ccL0aE","Cfgr3y94nw","zbIYYEOE1o","Chuy3WaWsv","5NammMmKGJ","AOgEepWiOs","07n1cqQxHP","Nxx9VuJScX","RBhp0rhl0J","BGaQYEOE1o",
+"3otm6Dz1R3","WMiS31j5L8","C2IrcD6rBy","piJSkAmdQd","o8UydkB5nP","Ul4a1DG4sT","zmLYDNo0Qb","IBe8kogLgc","i3pydAOgEe","vOqCEOUYuF",
+"8RCUAS2Dfu","jiVBP07n1c","fcwDaokgRi","ru4UG64s8N","MezSWtvdkD","55rfBFcWrW","tvdkDWreyP","618DiazIWp","xXTI4DLhzM","5drc6tjQxs",
+"0Wr5y9y4lw","HzZT85Drn0","Gv3FqrKDLJ","pWiOscQOnv","No0Qb5nmWv","cQOnvgtCA5","RBhp0Ul4a1","jSjS3QssNC","HzZT8nFqik","FcWrWLDk6f",
+"HlUbFAXpwE","jfREu8U2nU","v1HlnXflUq","8xEKzMmKGJ","DcpWBsqVrf","v2eC3TCgPp","nnP8oix74r","UlU3MECMvU","S77LHy94nw","Ss0Zurz7Ut",
+"t59lRsqVrf","HfyNQZUnqt","soy9tn8pJ9","YjB9tRmDcr","uJScXHRxd8","JkzUnStlDJ","Vprf2uTacx","PYBf4lsQGo","okgRiuN6r3","s93MlZzJHW",
+"vLsmSRpBQm","FNYIMix74r","OHaBziqv4k","aL6AJRpBQm","J2mQiVIlwP","s4786euZA5","48cHLgIYvE","uupzkFcWrW","hi5X7piJSk","vLsmSW7cTs",
+"NcICAwDajX","tlILt8FmFH","YOfrYIKxdL","Mkgy86q6L9","faHirQ6hMC","ZJTXHVIlwP","oVQp6AkKTk","9y4lw45cIH","aL6AJ2TRI7","WPmlxsoy9t",
+"Mkgy8WMiS3","tuDyS7Ow5C","7fKYUyvOMI","U3yw5Cfgr3","JXljWFLsph","GXdoHY1mC0","aFFssFxX9q","OHaBzk85Ae","RmDcrX6Pin","2DREsogLgc",
+"7ku1plViBv","XflUqjiVBP","ZuDtDtvdkD","C2IrchE1Ql","azIWpTCgPp","rz7Ut9XyT9","IBe8ktuDyS","gf8rIsoy9t","ZhwG1GWqqX","gtCA5oVQp6",
+"IjTwPB3qem","StlDJF6PT2","bZLvS2Yz7E","VjCZqlpF6W","m4bxUgtCA5","nlaBy16lHc","rz7UtpT8wu","2hEEUDz1R3","jS1ajydG8U","YOfrYrz7Ut",
+"FVMxopT8wu","uZPqgoGu6x","cL0aE2ZHdk","WaWsvO3iyQ","lkMUAFxX9q","J2mQiS77LH","n8pJ9BbwgA","FNYIMoVQp6","Uvlv4BbwgA","oVQp645cIH",
+"soy9tBpYhV","L7cGcZzJHW","0BmCyXflUq","FwEJzMmKGJ","EoToP5Drn0","cmXIXfcJOy","ix74rdjsrv","7lUXZJKWYR","YOfrYF6PT2","pmeCdNhXdu",
+"rKDLJF6PT2","3weIFzmLYD","pT8wuuAWyp","tvdkDBpYhV","CxVEfwiHrZ","pFrrlzHF1q","n8pJ929QAz","ciuWzs4786","HfyNQmz8gx","K4GS8Waim6",
+"qQxHPBFkb8","FhtglksJby","uJScXD6rBy","CK5W7MK07Y","xXTI4QbxXc","LDk6fcmXIX","9y4lwRsQUq","pv0i70PktI","wDajXRxrsm","AkKTkZhwG1",
+"atef207n1c","suY4xhYBCK","djsrvyluBx","P6bcgOxWIH","DG4sTJ2mQi","9GXkXazIWp","CIShGqUJMd","fmIK12hEEU","AgJHQFhtgl","K20wKRzaZA",
+"EdBKcS77LH","Oz8yZQ6hMC","iwzGkazIWp","W7cTspAhR1","n1pmOrKDLJ","0BmCy9eoRc","2DREss93Ml","b29RJYjB9t","faHirvLsmS","Yw2oU4W0Tl",
+"ZJTXHUmaEv","zqH0Wy94nw","uoStwy94nw","GXdoHSWfou","2DREsX6Pin","PYBf4lpF6W","TCgPpfmIK1","uvf7Auvf7A","zY1GY8hJdt","FxX9qKr8ys",
+"WmadAxciqp","uPX7Gh1zcH","pAhR1DQimp","FcWrWguMb8","IjTwPMezSW","9eoRc5Drn0","ulk41VBjhz","X6PinVerEA","hi5X7WaWsv","OxWIHiKqhr",
+"UmaEvpWiOs","rhl0JgjUTu","QWxoTbgJAz","tAOsrWmadA","O3iyQMezSW","8FmFH2Yz7E","uQIczn1pmO","lkMUApv0i7","JIqXiBbwgA","ReKEWd85a9",
+"FhtglQbxXc","Zv7z0K4GS8","2ZHdk7ku1p","J2mQi0ao3l","NcICAFxX9q","uvf7AStlDJ","azIWpvkCHH","ksJbyFjHXR","guMb8FNYIM","BbwgAQ6hMC",
+"lpF6WksJby","AgJHQF6PT2","qaofNFhtgl","vLsmS5iGN5","RACuj6AFT0","RACujjSjS3","d85a9I7p2a","cQOnvzqH0W","9rlg9BCxeC","J2mQiWaim6",
+"hUTw7G1RhS","CNHmvpv0i7","BGaQYSmGzv","9iGoTL7cGc","zY1GYRzaZA","FnPFBnnP8o","7X3uyRsQUq","5drc6QnJ1S","tuDySSmGzv","MGlTF8hJdt",
+"nFqiklH1kt","aL6AJ8FmFH","uN6r3sx5Gl","0BmCy1v5hH","vOqCE7lUXZ","Cp3mZFjHXR","rz7UtvLsmS","e6e4zMGlTF","FVMxoblLA9","cQOnvmz8gx",
+"07n1cdQ586","HfyNQDcpWB","LbRTHaez9y","yofH32DREs","OHaBz5nmWv","prNT6aDGtS","F6PT2UmaEv","QYxC0AXpwE","YOfrYRzaZA","Zv7z055rfB",
+"m4bxUDQimp","WreyPNOHsz","Ss0ZuWMiS3","taOXKL7cGc","3otm6zY1GY","DQimpMkgy8","0h1b1brhlQ","rz7Ut6AFT0","a00b5Nxx9V","0YAGHtaOXK",
+"SmGzv9iGoT","QChxsF6PT2","aL6AJrhl0J","nlaBybZLvS","OxWIHMm8si","VjCZqpmeCd","TXQ0ZDcpWB","taOXKd85a9","FnPFBQ6hMC","Nxx9VtAOsr",
+"RBhp0BFkb8","JJs5mQChxs","Dz1R3P6bcg","C2Ircv8yFN","618DiblLA9","7hyVvQClRL","6AFT0ix74r","TXQ0ZlXFOB","7X3uynlaBy","No0QbcmXIX",
+"FNYIM5nmWv","ix74rblLA9","Mkgy82Yz7E","gIYvEtjQxs","aDGtSlkMUA","VjCZqqUJMd","FVMxoL7cGc","k85AeBCxeC","Yw2oUcQOnv","0h1b1Waim6",
+"iB08lPb1pa","iB08lZhwG1","ciuWzrz7Ut","9rlg9Nxx9V","Pb1paFGzgp","8xEKzNcICA","Pb1pahE1Ql","lH1ktiqv4k","LewvM7hyVv","K20wKni2v1",
+"Z4I1v8RCUA","i7WMQNOHsz","faHirNxx9V","KsjRK16lHc","b29RJTXQ0Z","5iGN5Pb1pa","Y1mC0HP433","KZamHuTacx","VIlwPsoy9t","dpe1v2Yz7E",
+"y94nwrKDLJ","m4bxUBGaQY","Oz8yZQYxC0","pmeCdbrhlQ","okgRibZLvS","EoToPv2eC3","FPfSEMK07Y","yofH3Z4I1v","QnJ1SChuy3","Cfgr3BCxeC",
+"lweGyPYBf4","IBe8knnP8o","sqVrfvOqCE","jfREuUmaEv","atef2l83Ud","he9IAYw2oU","KZamHuJScX","cShY2FLsph","i3pydNAFuw","lXFOBdhSuH",
+"55rfBatef2","ReKEWNAFuw","L7cGcciuWz","CNHmv5Namm","LewvMAOgEe","CK5W7CqqaD","dmoS7xXTI4","ksJbyn1pmO","n8pJ9F6PT2","2hEEUFwEJz",
+"xciqpBFkb8","MmKGJmz8gx","MaJQsIBe8k","aDGtSuN6r3","LDk6fYw2oU","tjQxsY1mC0","FPfSEJKWYR","BbwgAy94nw","580YDsqVrf","StlDJ5nmWv",
+"ogLgcRACuj","mz8gx2ZHdk","aFFssuJScX","DG4sTfcwDa","OUYuFVerEA","VIlwPrhl0J","QWxoTCNHmv","d7vjMdQ586","he9IACxVEf","OUqFMa00b5",
+"wDajXlweGy","nFqikb29RJ","blLA9fqypy","2DREsaFFss","dhSuHFFDui","nnP8olpF6W","ciuWzIKxdL","S77LHCfgr3","CIShGgIYvE","P6bcguPX7G",
+"brhlQCfgr3","5NammeuZA5","Dz1R3ZzJHW","RxrsmStlDJ","n8pJ9pvgjS","BGaQYrKDLJ","14FLR0Wr5y","x3LDe5Mg9r","NhXduOHaBz","JRJQBLewvM",
+"uJScXjS1aj","pvgjSSWfou","pv0i7FLsph","Mkgy8aFFss","Chuy39iGoT","kZANmzz4ZU","0MR5X7ku1p","QWxoT7X3uy","WmadAlpF6W","fcJOyGSQwj",
+"EdBKcDz1R3","CqqaDzbIYY","AIYUu6AFT0","fLNg8vkCHH","CdyBViwzGk","rKDLJCqqaD","gIYvEHzZT8","gtCA5tl72W","Cp3mZ6q6L9","faHir2Yz7E",
+"M6qcGwiHrZ","pWiOs5nmWv","fcwDaK20wK","fcJOymX2GE","S2DfuuoStw","tlILtI7p2a","14FLRd7vjM","StlDJWmadA","WMiS34QMc9","1j5L8lsQGo",
+"0YAGH9rlg9","RsQUqUvlv4","yEfy9ZhwG1","DQimpNxx9V","64s8NXyPZN","taOXKtjQxs","KASQ80MR5X","5drc6d7vjM","W7cTsJ2mQi","Mm8siK20wK",
+"nlaBynnP8o","BbwgA2ZHdk","pWiOsaL6AJ","xXTI4FPfSE","HzZT8ix74r","QYxC0CqqaD","cShY2a00b5","FnPFBpv0i7","fqypygtCA5","gjUTu45cIH",
+"64s8N0YAGH","9eoRcuAWyp","IBe8kRzaZA","NOHsz7fsYM","suY4xQWxoT","MaJQsXyPZN","C2IrcIKxdL","BGaQYjS1aj","oGu6xBFkb8","1j5L8cL0aE",
+"4W0TljeskS","t59lRFVMxo","hi5X7QYxC0","zFgtBJ2mQi","tl72WCxVEf","t98iWlXFOB","aL6AJQworu","JJs5mk85Ae","I7p2aFxX9q","zY1GYfFDrJ",
+"IBe8kY1mC0","CNHmv9rlg9","MmsIoUmaEv","U3yw5RzaZA","9iGoTa00b5","DcpWBgIYvE","zHF1qAXpwE","TCgPpS77LH","VIlwPpAhR1","aDGtSM3zXL",
+"zY1GYbZLvS","RxrsmpvgjS","Yh1hFlweGy","GXdoHrKDLJ","a00b5580YD","yofH316lHc","xXTI4AgJHQ","5VZjSlXFOB","ogLgclH1kt","UmaEvG1RhS",
+"0MR5Xm4bxU","atef2suY4x","t98iWAIYUu","2ZHdknFqik","VLTy664s8N","yEfy9pvgjS","uJScXK4GS8","pFrrlMmKGJ","FVMxos93Ml","LbRTHCp3mZ",
+"No0Qbfqypy","IjTwPtl72W","5nmWvazIWp","Ta8f6FNYIM","t59lR8TxD7","Y1mC0aez9y","L7cGcRBhp0","AXpwEStlDJ","aDGtSEdBKc","WMiS3JXljW",
+"Chuy3gIYvE","taOXKCfgr3","0YAGHCIShG","5NammhSSvQ","zY1GYtuDyS","POUYScQOnv","2NslmEoToP","mX2GEhi5X7","uJScX3weIF","DQimp7lUXZ",
+"Ta8f6dhSuH","TCgPpcL0aE","k85AepT8wu","oGu6xJKWYR","Kr8yslkMUA","cmXIXnlaBy","AOgEea00b5","EoToPI7p2a","yofH3RsQUq","P6bcgWaim6",
+"QbxXc5nmWv","CK5W72DREs","5Drn07X3uy","taOXKUlU3M","FxX9q5Namm","3otm6fqypy","ZhwG15drc6","oVQp67Ow5C","jeskSFjHXR","7hyVvAIYUu",
+"0YAGHS77LH","HfyNQJkzUn","5VZjSG1RhS","I7p2aHfyNQ","CK5W7fFDrJ","AmdQdvLsmS","HlUbF4QMc9","W3VFHYf2Ec","2NslmTXQ0Z","GXdoHpv0i7",
+"DQimphSSvQ","taOXKlCMxy","LewvM45cIH","AkKTkWmadA","7hyVvBFkb8","G1RhSVjCZq","gjUTuciuWz","HlUbF7lUXZ","Z4I1vcQOnv","HfyNQyvOMI",
+"oGu6x3otm6","RzaZAMK07Y","dpe1vMojnP","9iGoTqQxHP","jSjS3s93Ml","07n1cQWxoT","jzUqR1v5hH","tAOsrhE1Ql","zqH0WaDGtS","Waim6OUYuF",
+"F6PT2v8yFN","2Yz7E580YD","v1HlnWDVWJ","WaWsvn1pmO","Uvlv4Mm8si","GSQwj8TxD7","vOqCEuoStw","7fsYMfcJOy","qQxHPJRJQB","C2IrcpAhR1",
+"AXpwEulk41","atef2PYBf4","v2eC38U2nU","uLtKscQOnv","vOqCEs93Ml","FNYIM2Yz7E","lpF6W2hEEU","JRJQB6AFT0","RmDcrsoy9t","pv0i7CxVEf",
+"9GXkXPYBf4","hSSvQuJScX","uLtKsM3zXL","ru4UGCdyBV","ThjNnvOqCE","WDVWJCp3mZ","Ta8f6vkCHH","n1pmO5Mg9r","CxVEfyvOMI","XyPZNRxrsm",
+"4dEz6s4786","KZamHwiHrZ","M6qcGTwano","0YAGHbrhlQ","uvf7AWPmlx","x3LDeGXdoH","ThjNn4W0Tl","aDGtS9y4lw","AkKTklj07Q","uZPqgv2eC3",
+"HfyNQoQ87r","sx5GlCdyBV","s93MlVprf2","cShY2lsQGo","9XyT948cHL","Gv3FqlweGy","yToGW0PktI","rKDLJkZANm","M6qcG1LB1L","fFDrJQnJ1S",
+"5Mg9rJJs5m","qaofN16lHc","VIlwP0BmCy","0Kyfsl83Ud","qUJMdKsjRK","SWfouQworu","guMb8YjB9t","VerEAuLtKs","Dz1R3K4GS8","FFDuiqaofN",
+"P6bcgpvgjS","64s8NQbxXc","8TxD714FLR","8TxD7bZLvS","W7cTsStlDJ","ni2v1hUTw7","yToGW64s8N","zbIYYWaim6","ZhwG1faHir","SjskQpv0i7",
+"ThjNnQnJ1S","aFFssa00b5","lj07QVIlwP","5VZjSDG4sT","FxX9qBbwgA","prNT6ksJby","tAOsrgjUTu","OxWIHAIYUu","FhtglprNT6","ZJTXHzmLYD",
+"FwEJzuAWyp","ReKEWuupzk","Kr8ysM3zXL","zbIYYCIShG","iqv4k45cIH","hYBCKyEfy9","4QMc9yEfy9","yvOMIjeskS","d7vjMuPX7G","9eoRclpF6W",
+"0h1b1QnJ1S","uPX7GsqVrf","Waim6suY4x","8hJdtIRh48","14FLRThjNn","X6Pin0Kyfs","brhlQEOE1o","XyPZNDLhzM","JRJQBZUnqt","F6PT2i7WMQ",
+"NhXduMezSW","XyPZNoVQp6","uupzk0YAGH","vLsmSciuWz","uJScXB3qem","HRxd8aDGtS","0PktIwDajX","7fKYUYjB9t","CK5W7Qworu","n1pmO2Yz7E",
+"iB08lNxx9V","BpYhV5iGN5","t98iW0MR5X","EOE1oMm8si","t59lR8hJdt","zQt6QnlaBy","24ARFgtCA5","DG4sTFFDui","5NammoVQp6","9rlg9StlDJ",
+"WmadAgdQsS","tl72W7ku1p","KASQ8uPX7G","LbRTH7fsYM","vOqCE7Ow5C","RBhp0WMiS3","X6Pin8FmFH","Pb1paP6bcg","RpBQmCp3mZ","i3pydW7cTs",
+"JKWYRZJTXH","jSjS3suY4x","v2eC3JJs5m","BpYhVhYBCK","cQOnvGv3Fq","o8UydeuZA5","iKqhrRpBQm","jfREumX2GE","BFkb8UlU3M","GSQwj5IhmG",
+"JXljW3weIF","zQt6QMkgy8","wDajXv2eC3","ni2v1EOE1o","W3VFH9XyT9","2Yz7EiwzGk","cL0aEdpe1v","yEfy9s7Mxk","x3LDeECMvU","FnPFBuvf7A",
+"I7p2aYjB9t","FGzgpPOUYS","h1zcH64s8N","suY4xd7vjM","580YDn1pmO","he9IAZJTXH","AIYUuiB08l","0ao3lRBhp0","d85a9vLsmS","ReKEWdhSuH",
+"wiHrZPOUYS","NOHszOHaBz","rz7UtIBe8k","okgRiDG4sT","ECMvUi3pyd","RzaZAv1Hln","3otm6v2eC3","LDk6fFjHXR","tAOsrBFkb8","7fsYMJkzUn",
+"tvdkD9rlg9","0h1b1lkMUA","jeskSyToGW","8xEKzThjNn","hUTw79GXkX","iB08lgtCA5","i7WMQgtCA5","SjskQ9iGoT","hi5X7tAOsr","24ARFHfyNQ",
+"QbxXcdjsrv","QworuMkgy8","aL6AJ07n1c","45cIHpiJSk","DQimpEoToP","UmaEvXflUq","azIWpQssNC","aL6AJZ4I1v","uLtKsFGzgp","VBjhz9rlg9",
+"hE1QlCK5W7","FnPFBt98iW","4dEz69iGoT","yluBxn8pJ9","5IhmGJKWYR","MmsIoZUnqt","AgJHQs4786","55rfBWaim6","Oz8yZd7vjM","t59lRECMvU",
+"jSjS38TxD7","nFqikQChxs","SjskQjiVBP","ulk4148cHL","Z4I1vsqVrf","1LB1L2hEEU","uupzk1j5L8","MK07YWaim6","ni2v15VZjS","ksJby6q6L9",
+"zQt6QFLsph","POUYSRmDcr","rz7Utxciqp","JIqXitvdkD","v1HlnZUnqt","n8pJ9AgJHQ","9rlg95iGN5","8cVD3ru4UG","FFDui8TxD7","xciqpv1Hln",
+"faHirl83Ud","y94nwOUYuF","L7cGcxciqp","5iGN5IKxdL","1LB1LVprf2","U3yw5Oz8yZ","WPmlxFNYIM","TCgPp4dEz6","580YDIjTwP","7fsYMCxVEf",
+"VjCZqxReec","cmXIXhe9IA","yEfy9OHaBz","yToGWs4786","Ta8f68xEKz","iwzGklViBv","mz8gxjS1aj","OxWIHfFDrJ","RmDcrRxrsm","okgRiQChxs",
+"s93MlPYBf4","29QAzFcWrW","2DREss4786","JJs5mpAhR1","WreyPqQxHP","GSQwjrKDLJ","StlDJ7fKYU","HfyNQRxrsm","v1HlnZ4I1v","Gv3FqJ2mQi",
+"Z4I1v618Di","e6e4zIRh48","NhXduL7cGc","CdyBVnFqik","NAFuw8TxD7","oVQp6IjTwP","jfREunFqik","fFDrJt98iW","uTacxoGu6x","KsjRK8U2nU",
+"6q6L9soy9t","uJScXru4UG","tuDyStuDyS","2NslmoQ87r","UmaEvhe9IA","PYBf4ReKEW","0MR5X2Yz7E","nlaByMaJQs","5NammYOfrY","fFDrJjfREu",
+"uPX7G8RCUA","b29RJ7X3uy","zz4ZUPYBf4","QbxXctlILt","3weIFeuZA5","MezSWVBjhz","TXQ0ZJJs5m","FPfSEU3yw5","MojnPQWxoT","TCgPptAOsr",
+"7fKYUCIShG","AIYUuDLhzM","9rlg9d85a9","RkQke45cIH","piJSkKr8ys","NcICAFVMxo","bgJAzEOE1o","iB08l48cHL","yEfy9cL0aE","jfREubrhlQ",
+"n8pJ9fLNg8","VIlwPIKxdL","F6PT2CNHmv","tuDySogLgc","azIWpnnP8o","vLsmS7fKYU","tvdkDHfyNQ","taOXKOUYuF","JRJQBfmIK1","QYxC02Yz7E",
+"K20wKYf2Ec","WDVWJ5IhmG","TwanoYOfrY","Q6hMCECMvU","ZUnqtzQt6Q","WaWsv7fsYM","Kr8ysQnJ1S","5ZaEzK20wK","Yf2Eci7WMQ","SjskQJ2mQi",
+"dQ586rz7Ut","xXTI42DREs","soy9tZUnqt","S2DfuStlDJ","a00b5iB08l","FwEJzLDk6f","fcwDaThjNn","MezSWIKxdL","0Kyfsatef2","OHaBzwDajX",
+"i3pyd618Di","h1zcHDcpWB","ksJbyaDGtS","S77LHaL6AJ","9y4lwBGaQY","D6rBy6q6L9","lsQGopWiOs","fFDrJXflUq","SbRYypWiOs","2Yz7EEoToP",
+"5Mg9r7fKYU","StlDJaDGtS","yToGWAXpwE","djsrvpvgjS","2Yz7EWreyP","IKxdLuTacx","fLNg84W0Tl","atef2LbRTH","7hyVvJkzUn","qQxHPjS1aj",
+"fcwDatAOsr","Yw2oUK4GS8","W7cTs2DREs","ksJbyVprf2","VIlwPcShY2","HlUbF5nmWv","OUqFMsqVrf","NAFuwSmGzv","Chuy3AXpwE","t59lRyToGW",
+"Q6hMCWPmlx","QChxs7Ow5C","d7vjMQYxC0","aez9yVprf2","kZANmuJScX","CK5W7kB5nP","AmdQdfqypy","TCgPpaez9y","hSSvQn8pJ9","tl72WS2Dfu",
+"BFkb8qQxHP","B3qemCqqaD","6q6L9tlILt","qaofNprNT6","tl72WfcwDa","v1HlnaFFss","UmaEvwiHrZ","CK5W7BGaQY","SbRYy5ZaEz","1LB1Ln8pJ9",
+"uupzkpvgjS","HRxd8JkzUn","0MR5XKsjRK","uoStwlsQGo","Yf2EcwDajX","ulk41oVQp6","LbRTHAXpwE","d85a95VZjS","jSjS3ru4UG","azIWp5Namm",
+"Ta8f6hi5X7","S2DfuNAFuw","7fsYMAgJHQ","FGzgpEOE1o","atef2SmGzv","LewvMhi5X7","8U2nUlweGy","i3pydD6rBy","C2IrcMkgy8","0BmCyZ4I1v",
+"oVQp6Cp3mZ","0BmCyCK5W7","ciuWzZJTXH","M6qcGBFkb8","dQ586v1Hln","iwzGk48cHL","8cVD3C2Irc","MmKGJSWfou","8U2nUFLsph","2NslmMGlTF",
+"FcWrWNOHsz","nnP8ot59lR","taOXKfLNg8","v2eC348cHL","rhl0JZv7z0","uupzkEoToP","qQxHPbrhlQ","rz7UtJKWYR","2Yz7E8cVD3","yvOMItlILt",
+"Cp3mZVNCPd","t98iWaFFss","I7p2ajfREu","NAFuw16lHc","sqVrf8hJdt","AmdQdn8pJ9","LewvMfaHir","IjTwPnFqik","cShY2BGaQY","iKqhrHzZT8",
+"suY4xECMvU","Mm8siTa8f6","2ZHdkuZPqg","K20wKfFDrJ","07n1cgjUTu","cShY2MojnP","ZUnqtW7cTs","ReKEWFnPFB","uupzkY1mC0","55rfBRzaZA",
+"lkMUA7X3uy","AOgEeHfyNQ","qUJMdyvOMI","0YAGHkZANm","5NammPb1pa","euZA5fFDrJ","7ku1p9GXkX","kZANmdpe1v","2hEEUnlaBy","NAFuwZ4I1v",
+"8FmFHatef2","iqv4kNcICA","bZLvSdpe1v","a00b5he9IA","0h1b1Dz1R3","0ao3lHfyNQ","xXTI416lHc","v1HlnFxX9q","7fsYMGSQwj","CIShGrKDLJ",
+"L7cGcU3yw5","RsQUqQbxXc","6AFT0Ul4a1","HRxd8lpF6W","fLNg8HP433","QChxs5VZjS","24ARF0BmCy","HP433Vprf2","LbRTHazIWp","9eoRcn8pJ9",
+"LbRTHtvdkD","fqypy14FLR","CNHmvpFrrl","DcpWB8U2nU","iqv4k6AFT0","OUYuFFLsph","lXFOBYjB9t","t59lRVNCPd","piJSkDcpWB","pFrrlMaJQs",
+"fFDrJ4QMc9","6AFT0VerEA","Nxx9VOxWIH","HfyNQlViBv","NOHsz5Drn0","RBhp00PktI","jeskSuvf7A","XflUqWDVWJ","MojnPQClRL","IjTwPl83Ud",
+"FNYIMprNT6","rKDLJjtn0X","5nmWvguMb8","qQxHPHlUbF","GrDg7ksJby","BpYhVjeskS","zz4ZUs4786","fLNg80PktI","14FLRpmeCd","IRh48Waim6",
+"MezSW16lHc","faHirrKDLJ","cShY2KASQ8","C2IrcsqVrf","F6PT2W7cTs","piJSk07n1c","QbxXcIjTwP","tjQxsHfyNQ","cmXIXlweGy","2TRI7CNHmv",
+"vOqCEcQOnv","FxX9qrhl0J","6AFT0fcwDa","soy9tIKxdL","9iGoTvLsmS","3otm62Yz7E","29QAzCfgr3","aFFssHP433","jeskSSWfou","t98iWv8yFN",
+"uTacxi3pyd","BFkb8Rxrsm","8RCUAiqv4k","0PktI16lHc","5iGN5jiVBP","x3LDeTCgPp","bZLvS1v5hH","6q6L9F6PT2","QbxXcW7cTs","RmDcrVerEA",
+"QbxXcvkCHH","kZANmfqypy","M3zXL45cIH","fcJOyUlU3M","GWqqXb29RJ","4QMc99rlg9","lXFOBni2v1","8RCUAbgJAz","zbIYYpvgjS","EoToPt59lR",
+"CIShGMaJQs","48cHLUvlv4","hi5X7zFgtB","iqv4kYh1hF","lCMxyni2v1","kZANmKsjRK","lXFOBpvgjS","QChxstuDyS","3weIF2hEEU","gf8rIjtn0X",
+"tjQxsK20wK","B3qemsqVrf","t98iWK4GS8","pT8wuI7p2a","MmsIouQIcz","s4786QYxC0","jtn0X7lUXZ","uJScXO3iyQ","7hyVvuN6r3","XflUq7fsYM",
+"OHaBzXyPZN","mz8gxKsjRK","Uvlv4uoStw","GSQwjb29RJ","qQxHPqQxHP","9y4lw9XyT9","d85a9MK07Y","4dEz6Gv3Fq","X6PinQWxoT","pv0i76q6L9",
+"GWqqXW3VFH","t98iW0Wr5y","LDk6flViBv","b29RJNhXdu","cShY28RCUA","LbRTHFjHXR","IjTwP2ZHdk","QWxoThYBCK","BFkb8ksJby","Gv3Fq2TRI7",
+"sx5GlFwEJz","0ao3lPb1pa","fmIK1ECMvU","3otm67fsYM","mX2GE5iGN5","gf8rIaez9y","jSjS3ReKEW","JKWYRGWqqX","MmsIo5Mg9r","yvOMIiKqhr",
+"jtn0XlH1kt","oVQp6tl72W","YOfrYy94nw","nFqikB3qem","Waim6uAWyp","SWfoupiJSk","AkKTkVerEA","nlaBy2Nslm","qaofNb29RJ","CNHmvVjCZq",
+"JXljW6q6L9","QYxC0JRJQB","8cVD3y94nw","16lHcv8yFN","L7cGcIRh48","Ta8f63weIF","pvgjSChuy3","KZamHd85a9","Pb1paMmKGJ","y94nwpvgjS",
+"FVMxoa00b5","FwEJzBGaQY","FcWrWzmLYD","StlDJogLgc","WmadAb29RJ","euZA5VBjhz","OxWIHFnPFB","TwanofcJOy","UmaEv1LB1L","zmLYD16lHc",
+"B3qemhi5X7","FwEJzJIqXi","hUTw7ZuDtD","FcWrWlweGy","mz8gxSmGzv","uQIczd85a9","J2mQiFFDui","iwzGktlILt","lXFOBpT8wu","HlUbF0Kyfs",
+"HzZT8RBhp0","zmLYD0BmCy","BbwgAru4UG","8cVD38cVD3","8RCUANAFuw","h1zcH5VZjS","euZA5AXpwE","OUqFMlj07Q","UmaEvhE1Ql","7fsYMuvf7A",
+"RmDcrG1RhS","oQ87rNOHsz","5VZjS8TxD7","pWiOsYOfrY","AkKTkX6Pin","48cHL5ZaEz","VBjhzEoToP","SbRYy64s8N","7fsYMlViBv","yluBxnnP8o",
+"LewvM5iGN5","uAWypOUqFM","tvdkDD6rBy","pmeCdhi5X7","29QAzRzaZA","CNHmvuPX7G","16lHcgdQsS","UlU3MQnJ1S","3weIF4dEz6","MGlTFdhSuH",
+"XyPZNZUnqt","SbRYyVBjhz","Yh1hFdQ586","RzaZALewvM","5ZaEzFjHXR","d7vjM580YD","sqVrfWmadA","x3LDegIYvE","RACujpAhR1","kB5nPQworu",
+"faHiroVQp6","uPX7GuPX7G","OUYuFaL6AJ","BGaQY07n1c","FFDuirhl0J","dpe1vjS1aj","AOgEeni2v1","EOE1oFLsph","2Yz7EWDVWJ","FNYIMtAOsr",
+"Y1mC0MmKGJ","2hEEUAIYUu","I7p2abrhlQ","soy9t5ZaEz","uvf7AfLNg8","yluBxO3iyQ","2Yz7ENOHsz","x3LDe2Yz7E","RpBQms4786","Mm8siqaofN",
+"7X3uyd7vjM","GrDg7blLA9","e6e4zgtCA5","djsrvRkQke","4dEz6RkQke","dmoS79GXkX","IRh489rlg9","No0QbWPmlx","BpYhVzbIYY","Rxrsm9y4lw",
+"y94nw8xEKz","MaJQsRpBQm","ZhwG1Q6hMC","AXpwE5Mg9r","AkKTkY1mC0","OUYuFYOfrY","ni2v1ZhwG1","D6rByjtn0X","580YDvLsmS","uJScX4W0Tl",
+"0ao3lMm8si","ni2v1iKqhr","jtn0X8hJdt","uAWypbrhlQ","jtn0X2Yz7E","qaofNfqypy","wiHrZTa8f6","07n1cZv7z0","KZamHt59lR","lm0pDQClRL",
+"Uvlv4FPfSE","iB08lReKEW","9eoRcyEfy9","wDajXUvlv4","lsQGo5Mg9r","n1pmObgJAz","IjTwPguMb8","AIYUulkMUA","3otm664s8N","QChxsECMvU",
+"VIlwPlH1kt","FnPFBlpF6W","55rfBCxVEf","SmGzv6q6L9","C2Irc16lHc","QnJ1SCIShG","QworuKASQ8","cL0aEv1Hln","Cp3mZtvdkD","8xEKzoQ87r",
+"In3NS1j5L8","24ARFpWiOs","l83UdwiHrZ","5ZaEz8U2nU","MezSWAgJHQ","2hEEUgjUTu","AOgEepFrrl","gIYvE0BmCy","e6e4zt98iW","azIWptAOsr",
+"hUTw7FNYIM","WDVWJ55rfB","ZJTXHZzJHW","uN6r3kZANm","MezSWmX2GE","Q6LixK4GS8","K4GS8KZamH","DLhzMaL6AJ","QssNCazIWp","d85a9X6Pin",
+"piJSkaDGtS","gIYvEpT8wu","uoStwWDVWJ","2TRI70Wr5y","lj07Q9eoRc","W3VFHxXTI4","dQ586ThjNn","2DREsMK07Y","Z4I1v7fsYM","vOqCEuPX7G",
+"cmXIXtAOsr","l83UdCp3mZ","t98iWydG8U","sx5Gld7vjM","Kr8yshe9IA","5Mg9rXyPZN","jtn0XWPmlx","uTacx0BmCy","Zv7z0Z4I1v","v2eC3zHF1q",
+"CxVEfnlaBy","QClRLm4bxU","pv0i7LDk6f","rhl0JhSSvQ","uAWyps4786","iB08lpv0i7","9XyT9BFkb8","7fKYUHP433","pWiOs4QMc9","RACuj5nmWv",
+"WaWsvCxVEf","KZamHvOqCE","MaJQsjfREu","n1pmOF6PT2","ZzJHWdQ586","SWfoulXFOB","9rlg9oGu6x","JIqXicShY2","KZamHdjsrv","fmIK1K4GS8",
+"Z4I1vyvOMI","RpBQmjSjS3","RBhp0okgRi","GWqqXXflUq","QbxXcAkKTk","CK5W7B3qem","piJSkjS1aj","Pb1pav2eC3","7fsYMvkCHH","m4bxUQnJ1S",
+"MmsIoP6bcg","Pb1papiJSk","CdyBVbrhlQ","fcJOypWiOs","DLhzMStlDJ","lweGyReKEW","8xEKzkB5nP","RxrsmlsQGo","K20wKv8yFN","yvOMI4W0Tl",
+"6q6L9pvgjS","yvOMIyToGW","BCxeCUvlv4","h1zcHQworu","JKWYRYw2oU","LDk6fjiVBP","Dz1R3HRxd8","AOgEeh1zcH","LDk6fRxrsm","8FmFHRpBQm",
+"uoStwKsjRK","hi5X7fLNg8","8FmFHgf8rI","mX2GEFhtgl","jtn0XjSjS3","blLA9StlDJ","55rfB3weIF","x3LDeO3iyQ","RpBQmX6Pin","EdBKcP6bcg",
+"ni2v17hyVv","qaofNFwEJz","Ul4a1uPX7G","Y1mC0Yh1hF","0h1b1Yw2oU","QClRL1LB1L","NOHszQnJ1S","aDGtS2ZHdk","8cVD32Nslm","1v5hH1LB1L",
+"hYBCKiqv4k","yEfy9v8yFN","QssNCcL0aE","hi5X7s4786","2NslmWMiS3","FPfSEpWiOs","pvgjSFVMxo","LDk6fPYBf4","pvgjS8cVD3","tjQxsL7cGc",
+"OxWIHRzaZA","EdBKczQt6Q","VBjhzuvf7A","8hJdtW3VFH","Ss0ZuW3VFH","7ku1p29QAz","uoStwqUJMd","8xEKzzY1GY","yvOMItuDyS","kZANmMmsIo",
+"xReecfmIK1","o8UydQworu","xciqpzz4ZU","7X3uyIn3NS","RBhp0GSQwj","lXFOB0h1b1","jzUqRpT8wu","HlUbFKZamH","h1zcHgIYvE","cmXIXJXljW",
+"6AFT0zmLYD","Q6hMCzHF1q","5iGN5B3qem","Dz1R3NAFuw","TCgPpChuy3","0PktIydG8U","soy9t45cIH","fqypyjSjS3","2DREssoy9t","Z4I1vQYxC0",
+"9GXkXTXQ0Z","NcICAQYxC0","yofH3Rxrsm","MmsIoIKxdL","dpe1v4dEz6","sx5GlQWxoT","GrDg78RCUA","2DREsD6rBy","Waim6QWxoT","yEfy9HzZT8",
+"VerEAlpF6W","I7p2aUlU3M","FGzgpFhtgl","tAOsrFhtgl","HP43348cHL","lsQGoLewvM","M6qcGDLhzM","S77LHFVMxo","bgJAzTXQ0Z","mX2GEuPX7G",
+"n8pJ9Uvlv4","F6PT2yvOMI","RmDcrGXdoH","WmadAEOE1o","XyPZNQClRL","29QAzokgRi","pv0i7kZANm","Yf2Ec7ku1p","KASQ8fcwDa","jzUqRaDGtS",
+"nFqik14FLR","Pb1palweGy","AIYUuOz8yZ","64s8NlsQGo","5drc6v2eC3","0KyfsNOHsz","OHaBzlXFOB","JJs5mdhSuH","3weIFdpe1v","pT8wudQ586",
+"8U2nUOUYuF","4QMc9lweGy","jS1ajJJs5m","0YAGHKsjRK","FVMxolj07Q","FwEJz5iGN5","Kr8ysThjNn","FFDuiJKWYR","ZJTXHQWxoT","7ku1pIBe8k",
+"he9IA7hyVv","WDVWJpiJSk","Yw2oU24ARF","d85a9Kr8ys","FLsphHP433","LbRTHpv0i7","AIYUuI7p2a","iqv4kEOE1o","y94nwW7cTs","6q6L9P6bcg",
+"pAhR1BFkb8","djsrvt59lR","NcICA4dEz6","5Mg9r6AFT0","d85a9580YD","X6Pin4QMc9","pmeCdy94nw","MGlTFfcwDa","RBhp0jzUqR","618DiFFDui",
+"W3VFH7hyVv","hYBCKGv3Fq","8cVD3nFqik","qUJMdTCgPp","64s8NkZANm","FjHXR29QAz","rz7UttlILt","YjB9trz7Ut","IRh48guMb8","Kr8ysHlUbF",
+"Cp3mZQworu","8U2nUSWfou","e6e4zHRxd8","GrDg7HP433","fmIK1TCgPp","gdQsSLewvM","prNT6soy9t","FLsphe6e4z","d7vjMQworu","qUJMdNOHsz",
+"uoStw07n1c","WPmlxrKDLJ","0MR5XQWxoT","ogLgcF6PT2","kB5nP7Ow5C","JKWYRMojnP","t59lRdjsrv","RkQkeatef2","DcpWBG1RhS","atef2BGaQY",
+"YjB9tsuY4x","BFkb8nFqik","aFFssgjUTu","dhSuH5IhmG","s7MxkvLsmS","Dz1R3Waim6","xReecfqypy","tl72WMmsIo","7hyVvGv3Fq","i7WMQD6rBy",
+"VIlwPpFrrl","vkCHHHlUbF","M3zXL5ZaEz","3otm607n1c","G1RhSgtCA5","U3yw58TxD7","Chuy3xReec","P6bcgy94nw","7fKYUQ6Lix","TwanoJIqXi",
+"lCMxyGrDg7","Kr8ys9eoRc","JXljWwiHrZ","h1zcHM6qcG","QssNCKZamH","FPfSEXflUq","FhtglhE1Ql","LewvMW3VFH","dhSuHlCMxy","SmGzvsuY4x",
+"WPmlxPb1pa","QbxXcCfgr3","a00b5prNT6","Rxrsm6AFT0","d85a9bZLvS","QClRLlXFOB","k85AeFhtgl","FNYIMb29RJ","Y1mC0S77LH","pv0i7W3VFH",
+"5iGN5S77LH","3weIFTwano","XyPZNprNT6","hSSvQMmsIo","3weIFGv3Fq","rhl0JLewvM","QChxsUvlv4","RsQUqpv0i7","FcWrWzY1GY","hUTw7uvf7A",
+"0MR5X580YD","2ZHdk7lUXZ","GrDg7v2eC3","8FmFHlweGy","QworudQ586","5Mg9ruLtKs","0Wr5y0BmCy","CqqaDt59lR","k85Ae5Mg9r","RxrsmRxrsm",
+"wiHrZpvgjS","soy9tUlU3M","Y1mC0qQxHP","TXQ0Z1LB1L","Zv7z0XflUq","AkKTkDQimp","pAhR1QWxoT","yEfy9okgRi","cQOnv2TRI7","d7vjMIBe8k",
+"HRxd8MmKGJ","brhlQP6bcg","b29RJi7WMQ","oVQp6rz7Ut","uTacxqUJMd","uAWypBFkb8","DLhzMbZLvS","MK07YJRJQB","gjUTuv2eC3","G1RhSx3LDe",
+"618DiFNYIM","FPfSEnlaBy","No0QbY1mC0","5Mg9rzQt6Q","MezSWPOUYS","9rlg90ao3l","lj07Q5nmWv","3weIFY1mC0","GrDg7fqypy","VNCPda00b5",
+"zY1GY0MR5X","QChxs9GXkX","4dEz6fqypy","cQOnv3otm6","AXpwElm0pD","FhtglwiHrZ","h1zcHn1pmO","7ku1pOz8yZ","bZLvSzbIYY","tl72WQnJ1S",
+"64s8NU3yw5","djsrv8TxD7","O3iyQFGzgp","UlU3Mi3pyd","vkCHHIn3NS","CNHmvYOfrY","hSSvQuupzk","lsQGoOUqFM","P6bcgciuWz","QssNCAkKTk",
+"tlILt6q6L9","Waim6taOXK","azIWpzY1GY","tl72W2ZHdk","fLNg8iKqhr","X6PinyEfy9","AXpwE2DREs","Pb1paVBjhz","ZzJHWydG8U","9iGoTNOHsz",
+"ksJbyFNYIM","hYBCKguMb8","9GXkXAgJHQ","RsQUqM3zXL","HlUbF0Wr5y","hE1QlIjTwP","IjTwP2TRI7","x3LDecShY2","5ZaEzQWxoT","VNCPdWPmlx",
+"m4bxUzY1GY","jiVBPxciqp","AIYUuEOE1o","cL0aEMezSW","dpe1vFjHXR","jtn0XSs0Zu","07n1ct59lR","XyPZN9y4lw","lsQGokZANm","Dz1R3OUYuF",
+"MGlTFsoy9t","tlILt5drc6","TXQ0ZPOUYS","7lUXZsx5Gl","BFkb8HfyNQ","sx5Gl8TxD7","Ss0ZuCqqaD","9y4lw24ARF","soy9trKDLJ","hi5X7S2Dfu",
+"uPX7G48cHL","IRh48MaJQs","C2Irc9y4lw","J2mQiSbRYy","lsQGolCMxy","SjskQMezSW","Cfgr3IjTwP","s4786Chuy3","D6rByWaim6","iwzGkzQt6Q",
+"oQ87rI7p2a","CxVEfokgRi","CK5W7OxWIH","Q6hMC2DREs","iwzGk3otm6","ZUnqtO3iyQ","7X3uytuDyS","fcJOysuY4x","SbRYyqaofN","55rfBFPfSE",
+"ogLgccQOnv","gjUTuReKEW","yluBxVprf2","iB08llj07Q","zQt6QuJScX","VLTy6WDVWJ","hi5X7AmdQd","X6PinX6Pin","QClRL4dEz6","B3qemtvdkD",
+"jeskSW3VFH","FPfSE7Ow5C","uupzkjeskS","MezSWEOE1o","QssNCoVQp6","M6qcG618Di","MaJQs48cHL","nnP8oS2Dfu","DG4sTCNHmv","QYxC0jzUqR",
+"K20wKEOE1o","KsjRKrKDLJ","IjTwPuN6r3","lViBvHRxd8","y94nwVprf2","hYBCKhE1Ql","IKxdLHzZT8","KsjRKM6qcG","yofH348cHL","BCxeC8hJdt",
+"lXFOBFhtgl","Kr8ysGSQwj","QYxC0DcpWB","9eoRc5ZaEz","AmdQdFNYIM","SWfousoy9t","rKDLJ8xEKz","FjHXR2TRI7","Gv3FquZPqg","xReecrKDLJ",
+"jiVBP6q6L9","wiHrZJ2mQi","xciqpG1RhS","FVMxouQIcz","prNT6zY1GY","oQ87rK20wK","pmeCdv8yFN","guMb8MojnP","iKqhr8RCUA","zmLYDcmXIX",
+"zqH0WWmadA","HfyNQzFgtB","OxWIH8RCUA","OUYuFCIShG","zFgtB5iGN5","OUYuFaez9y","FxX9q4W0Tl","45cIHVLTy6","HzZT8B3qem","gIYvEmz8gx",
+"Vprf2oVQp6","uLtKsJkzUn","Pb1paHzZT8","v2eC3Pb1pa","tjQxsChuy3","5drc6zFgtB","oQ87rTCgPp","MmsIo5drc6","uQIczThjNn","t98iWn1pmO",
+"h1zcHGv3Fq","RACujbZLvS","F6PT2OxWIH","PYBf4580YD","X6Pin8xEKz","uLtKs0BmCy","xXTI4yvOMI","t98iWs7Mxk","BCxeC0ao3l","BGaQYI7p2a",
+"JIqXiazIWp","pWiOsNcICA","KsjRK9rlg9","v8yFNatef2","qQxHP5Drn0","gjUTuzQt6Q","FPfSEpiJSk","oVQp6Mm8si","X6PinYf2Ec","LbRTHoQ87r",
+"64s8NIjTwP","Z4I1vpT8wu","uoStwRxrsm","Q6hMCMezSW","JRJQBv1Hln","soy9tlweGy","HP433lH1kt","ECMvUfqypy","RxrsmAOgEe","Mm8siAkKTk",
+"9GXkXGSQwj","QbxXcRmDcr","uPX7GkB5nP","GrDg71v5hH","29QAzNo0Qb","CqqaDFcWrW","QssNCjfREu","lj07Q07n1c","pv0i7hi5X7","gf8rIQbxXc",
+"y94nwQssNC","i3pydSbRYy","QWxoTwDajX","P6bcgQ6Lix","UlU3M5VZjS","IjTwPhYBCK","l83UdChuy3","d7vjMVNCPd","uvf7A5Namm","ni2v1VBjhz",
+"W3VFHzFgtB","qaofNNhXdu","Yw2oUi3pyd","GrDg75Mg9r","MmsIoWDVWJ","64s8Nm4bxU","5drc6tl72W","zHF1qOHaBz","1j5L8fcJOy","4W0Tl14FLR",
+"P6bcgdQ586","Gv3FqdhSuH","gf8rIyofH3","Nxx9VGv3Fq","GXdoH9iGoT","UlU3MiwzGk","uJScXa00b5","7ku1poVQp6","xciqpKZamH","cL0aE5IhmG",
+"Yh1hFLbRTH","xReeclViBv","e6e4zFVMxo","D6rByOxWIH","F6PT2G1RhS","FFDuib29RJ","o8UydVLTy6","FLsph2hEEU","uTacxOUqFM","POUYSazIWp",
+"ZhwG17hyVv","uupzkSbRYy","5Mg9rFNYIM","7X3uy7fsYM","o8Uyd16lHc","aDGtSMGlTF","4W0TlFxX9q","S2DfuuJScX","HlUbFiB08l","JRJQBtlILt",
+"MGlTFhi5X7","hYBCKJ2mQi","ThjNnnlaBy","fcwDaHlUbF","FnPFBdjsrv","Mkgy8BFkb8","hi5X7cShY2","blLA9I7p2a","CdyBVyToGW","6q6L9jiVBP",
+"suY4xJKWYR","hUTw7brhlQ","618Div1Hln","lj07Q0h1b1","NcICAfmIK1","cL0aE8hJdt","JKWYRzmLYD","Yf2EcRpBQm","MaJQsxReec","lH1ktQworu",
+"tjQxsnnP8o","DLhzMsx5Gl","D6rBylsQGo","gdQsSv8yFN","9eoRcNcICA","Qworu3weIF","okgRiECMvU","pv0i7yToGW","ydG8UCK5W7","16lHcRkQke",
+"iKqhrdhSuH","vLsmSDLhzM","yEfy9MojnP","v8yFNJ2mQi","W3VFHk85Ae","7fsYMMojnP","AmdQdy94nw","uPX7GMojnP","aL6AJatef2","oQ87rfFDrJ",
+"BbwgAM3zXL","yEfy9jS1aj","mz8gxoVQp6","VerEAaez9y","uoStwYf2Ec","Vprf2yluBx","5NammcShY2","0ao3laez9y","Zv7z0MezSW","fcwDaCK5W7",
+"MmsIoAIYUu","AIYUusqVrf","FxX9qWaWsv","gIYvEJXljW","6AFT0dhSuH","1v5hHLbRTH","IjTwPAIYUu","1j5L8y94nw","5IhmGIKxdL","5iGN5gf8rI",
+"S77LHd7vjM","ZUnqt0h1b1","EoToPOUqFM","d7vjMnFqik","1j5L8oQ87r","wDajXIjTwP","RpBQmJIqXi","AIYUuHRxd8","jSjS3qUJMd","StlDJ4dEz6",
+"jfREuMezSW","uvf7AXyPZN","IKxdLS77LH","5VZjSfcJOy","zY1GYs4786","ulk41sqVrf","vOqCElCMxy","Vprf2CqqaD","EoToPpT8wu","UlU3Mjtn0X",
+"5VZjS14FLR","48cHLBCxeC","29QAzyluBx","AkKTkyluBx","5VZjStlILt","7ku1puN6r3","uQIczmz8gx","soy9tVNCPd","yluBx3weIF","y94nw0BmCy",
+"QClRLXflUq","K4GS8zz4ZU","zQt6Q7hyVv","tvdkDpAhR1","ksJbyrz7Ut","uN6r3vkCHH","e6e4zJIqXi","Vprf28TxD7","FjHXRS2Dfu","XflUqpiJSk",
+"GWqqXBFkb8","IRh48t98iW","ZuDtDn8pJ9","tuDySlCMxy","BbwgAWaim6","aL6AJ64s8N","BGaQYhYBCK","0h1b1aL6AJ","zz4ZUK4GS8","FVMxoprNT6",
+"tlILtQbxXc","BGaQYqUJMd","Zv7z0VLTy6","VIlwPwDajX","qaofN8TxD7","RpBQmAkKTk","iKqhraez9y","CNHmvOz8yZ","CdyBVjeskS","hi5X7soy9t",
+"cL0aEEOE1o","BCxeCyEfy9","soy9tcmXIX","QnJ1Ss4786","EdBKcGXdoH","In3NSQworu","7fKYUKASQ8","pT8wuNxx9V","uQIcz9iGoT","jeskSRmDcr",
+"zHF1q7X3uy","Z4I1vB3qem","a00b55drc6","7Ow5C1j5L8","2hEEUmX2GE","OxWIHxciqp","vkCHHMmKGJ","Dz1R3zmLYD","7X3uy7lUXZ","PYBf424ARF",
+"lkMUAJXljW","v2eC3pmeCd","Gv3FqWaim6","qaofNL7cGc","SbRYyb29RJ","sx5GlQ6Lix","0BmCyOz8yZ","Cfgr3suY4x","AXpwEYOfrY","OUYuF0YAGH",
+"fLNg8FVMxo","n1pmOUlU3M","Twanodpe1v","OUqFMvkCHH","uupzkIBe8k","4QMc9h1zcH","qaofNi3pyd","lkMUANOHsz","QClRLGv3Fq","EdBKcsqVrf",
+"zqH0WSWfou","KZamHkB5nP","0YAGH8FmFH","zz4ZUjtn0X","L7cGcNo0Qb","MojnPtl72W","VjCZqAgJHQ","K4GS8jS1aj","3weIFrhl0J","he9IAJ2mQi",
+"Z4I1vcL0aE","prNT6x3LDe","cL0aECdyBV","ZuDtDyluBx","yvOMIReKEW","BpYhV5Namm","yluBxPb1pa","aL6AJbgJAz","AOgEei3pyd","BpYhV16lHc",
+"AIYUuuN6r3","hUTw78RCUA","guMb8kZANm","9iGoTqaofN","8U2nUVLTy6","EOE1o07n1c","fmIK1RBhp0","pv0i7fFDrJ","jSjS3MmsIo","he9IAL7cGc",
+"CIShGfaHir","rz7Ut7ku1p","jiVBP45cIH","YOfrYWDVWJ","HP433t98iW","e6e4zgdQsS","cQOnvuLtKs","zz4ZUMmKGJ","hi5X7AOgEe","cQOnvv2eC3",
+"AXpwE9rlg9","X6PinO3iyQ","bZLvSLewvM","Oz8yZmz8gx","F6PT25IhmG","AmdQdYOfrY","48cHLy94nw","gjUTujiVBP","aL6AJ5nmWv","GWqqXVerEA",
+"yofH37X3uy","JXljWMkgy8","he9IA7fKYU","sqVrfvkCHH","NAFuw5Namm","8xEKzCdyBV","WaWsvzY1GY","C2IrclpF6W","O3iyQSjskQ","VLTy6BCxeC",
+"X6PinWaWsv","djsrvGXdoH","45cIHfLNg8","XyPZNlj07Q","X6PinQYxC0","CxVEf9eoRc","3otm6fcwDa","9y4lwQChxs","uJScXogLgc","s93Mlmz8gx",
+"2DREsprNT6","MezSWiKqhr","3otm629QAz","LbRTHIjTwP","tjQxsVprf2","i3pydOHaBz","0MR5XpiJSk","SbRYyWPmlx","55rfBk85Ae","6q6L9XyPZN",
+"SmGzvHP433","WPmlx5IhmG","EdBKcStlDJ","n1pmO0YAGH","wiHrZ9rlg9","hUTw7In3NS","5Nammv1Hln","Ul4a1ni2v1","VBjhzqUJMd","0BmCyn8pJ9",
+"lViBvwiHrZ","hi5X7t98iW","RkQkeuLtKs","QworuyEfy9","MK07Yo8Uyd","K4GS85nmWv","yToGWbZLvS","RpBQmVLTy6","xXTI4Pb1pa","zQt6QW3VFH",
+"ECMvUDG4sT","Chuy35Namm","8hJdtOUYuF","faHirtaOXK","M3zXLAXpwE","vOqCEtjQxs","soy9tMojnP","b29RJtvdkD","Uvlv4gf8rI","Cfgr348cHL",
+"MmKGJulk41","yToGWW7cTs","DcpWBpWiOs","oQ87r5Namm","YjB9t1LB1L","zbIYYNo0Qb","P6bcg48cHL","RpBQmPYBf4","07n1cS77LH","aDGtSB3qem",
+"Nxx9VqaofN","0KyfslXFOB","2hEEUQYxC0","AOgEeCqqaD","C2IrcvkCHH","jeskSCfgr3","JRJQBSjskQ","nFqikiqv4k","ECMvU7Ow5C","MezSWqUJMd",
+"4dEz6XflUq","Ul4a11j5L8","ydG8UPb1pa","29QAzAmdQd","0MR5XpAhR1","dhSuH2DREs","gf8rICK5W7","EdBKcCdyBV","In3NSK4GS8","FhtglpmeCd",
+"24ARFFxX9q","XflUq580YD","I7p2aqUJMd","IjTwP07n1c","SjskQQChxs","uN6r3RpBQm","Zv7z0HRxd8","W3VFHogLgc","lweGypFrrl","gtCA5i7WMQ",
+"7Ow5C5Namm","k85Aedpe1v","JXljWRkQke","Ta8f6TCgPp","Vprf24QMc9","0YAGHChuy3","d85a9qUJMd","FNYIMfqypy","P6bcgPYBf4","Yf2EcaDGtS",
+"7Ow5CpT8wu","uAWypzQt6Q","QYxC0RkQke","FxX9q0Wr5y","t98iWYOfrY","Pb1paqUJMd","RkQkeSmGzv","uAWypVprf2","QWxoTRxrsm","nFqik9rlg9",
+"2DREsMmsIo","6q6L9TCgPp","suY4xtuDyS","S77LHJRJQB","BFkb8hE1Ql","d85a9cmXIX","uQIczIn3NS","QClRLIjTwP","t59lR2Yz7E","TCgPpt98iW",
+"GSQwjx3LDe","s93MluTacx","MmsIo07n1c","0h1b1GrDg7","5iGN5zQt6Q","uN6r3FjHXR","WPmlxi7WMQ","aFFssSbRYy","OUqFM2Yz7E","FwEJzvOqCE",
+"tAOsrMezSW","HlUbFX6Pin","lCMxyO3iyQ","0h1b1SmGzv","BGaQYkB5nP","ZUnqt6q6L9","xciqp55rfB","VjCZqBFkb8","OHaBz5iGN5","iwzGkQssNC",
+"atef2ogLgc","Yw2oU7X3uy","9y4lwt98iW","aFFssIjTwP","9XyT9jS1aj","24ARFOUYuF","6AFT0QbxXc","tAOsrQChxs","aFFssFGzgp","O3iyQThjNn",
+"LewvMzqH0W","IjTwP9eoRc","cQOnv8TxD7","ix74rZzJHW","PYBf4pmeCd","RpBQm6AFT0","S2DfuVNCPd","ydG8U14FLR","FPfSE5Mg9r","djsrvoVQp6",
+"dhSuHpv0i7","hSSvQjfREu","hSSvQK20wK","ciuWzW7cTs","WreyPZJTXH","IKxdL4W0Tl","StlDJSs0Zu","mX2GEpT8wu","OUYuFzQt6Q","POUYS580YD",
+"QClRLLDk6f","9y4lwxReec","FwEJzazIWp","WDVWJRxrsm","WmadAgjUTu","zQt6QY1mC0","RACujGWqqX","OHaBzMK07Y","fLNg8DcpWB","FcWrWWaim6",
+"QClRLlweGy","QnJ1SmX2GE","RzaZA7lUXZ","mX2GECxVEf","VerEAOUYuF","fqypyfLNg8","BbwgA8RCUA","ZhwG107n1c","VerEAuQIcz","FPfSEFPfSE",
+"QssNCksJby","Yh1hFBFkb8","KZamHAgJHQ","qaofNCIShG","RmDcrZhwG1","uN6r3KsjRK","gtCA5WreyP","dQ586ciuWz","iqv4kwiHrZ","WreyP5VZjS",
+"zY1GYqaofN","lkMUAxReec","RsQUqW3VFH","FjHXR618Di","zFgtBAXpwE","FxX9qLewvM","t98iWb29RJ","GXdoHG1RhS","rKDLJtaOXK","bgJAzd7vjM",
+"RxrsmogLgc","0PktIyluBx","5NammAmdQd","UlU3MlweGy","JKWYRlm0pD","9GXkXvLsmS","VjCZqQWxoT","oVQp6wiHrZ","xciqpCfgr3","Yh1hFciuWz",
+"d7vjM8hJdt","KsjRKpAhR1","i3pydjSjS3","dpe1vyluBx","In3NSiqv4k","2DREs8TxD7","uoStw4dEz6","OHaBzd85a9","M3zXLtuDyS","0Kyfs5nmWv",
+"uJScXY1mC0","a00b55Namm","zmLYDmz8gx","S77LHTwano","tjQxsjeskS","jiVBP0PktI","bZLvS29QAz","8RCUA24ARF","qQxHPNhXdu","RpBQmcmXIX",
+"9GXkXrKDLJ","7fsYM9y4lw","GWqqXvkCHH","VLTy6LbRTH","rhl0JHRxd8","FxX9qo8Uyd","brhlQIn3NS","3weIFvLsmS","64s8NB3qem","3otm6hSSvQ",
+"9iGoTZhwG1","2Yz7EIjTwP","prNT6aL6AJ","1LB1LAgJHQ","16lHc0BmCy","zHF1qS77LH","rhl0JfFDrJ","v8yFNAXpwE","In3NS0MR5X","WmadAiwzGk",
+"OHaBzRkQke","X6Pin5ZaEz","CqqaDoQ87r","zqH0WuTacx","0KyfsFcWrW","s93MlNcICA","lj07QuoStw","n8pJ9aDGtS","dhSuHtaOXK","RzaZAk85Ae",
+"5Mg9re6e4z","MmKGJHRxd8","dQ586cShY2","EdBKcuTacx","Yf2EcyofH3","zY1GYaFFss","NhXdu1j5L8","55rfBiqv4k","29QAzReKEW","9XyT9tvdkD",
+"gjUTuEdBKc","Ss0ZudhSuH","v2eC3hE1Ql","QChxsFLsph","oQ87rU3yw5","29QAz24ARF","i3pyd3weIF","zHF1qm4bxU","QbxXcEoToP","SWfouRsQUq",
+"ydG8UlXFOB","tuDySulk41","CK5W75Namm","LDk6fyluBx","tlILt580YD","gjUTuRmDcr","AOgEedhSuH","FVMxo24ARF","k85Aet98iW","8RCUAFGzgp",
+"MmsIo7fKYU","fcJOyMGlTF","mX2GElCMxy","07n1cK20wK","FPfSEix74r","hE1Qls93Ml","AgJHQiwzGk","FjHXRKsjRK","xXTI47X3uy","LbRTH8FmFH",
+"Q6LixGSQwj","tvdkDVLTy6","0ao3lZJTXH","7ku1pzHF1q","HfyNQ64s8N","RsQUqSjskQ","TCgPpbrhlQ","qQxHPpvgjS","lweGyQnJ1S","ogLgcxciqp",
+"MezSWzmLYD","vOqCE3otm6","FwEJzIn3NS","4W0Tl0ao3l","JRJQB8TxD7","a00b5fcwDa","dQ586bZLvS","Q6hMClj07Q","xciqpjtn0X","07n1c4QMc9",
+"580YDSmGzv","gIYvElXFOB","LDk6f0PktI","gtCA5ix74r","No0QbTXQ0Z","pmeCdJKWYR","iKqhr5Drn0","Pb1pat98iW","Zv7z0fcJOy","4QMc9e6e4z",
+"OHaBzK20wK","JIqXiwDajX","HzZT8m4bxU","ksJby07n1c","wiHrZZJTXH","KZamHhYBCK","LbRTHWaim6","CK5W7BFkb8","7X3uyZuDtD","blLA9uPX7G",
+"lweGy0YAGH","8FmFHPb1pa","vkCHHUvlv4","yToGWydG8U","iB08luAWyp","CK5W7Mm8si","FxX9qgjUTu","5ZaEzGSQwj","o8Uyd6q6L9","uTacxbZLvS",
+"e6e4znFqik","UlU3M5drc6","FnPFBS77LH","fFDrJP6bcg","bZLvSnlaBy","Mm8sicShY2","zY1GYvOqCE","NOHsz9y4lw","MGlTFaFFss","S2DfuXyPZN",
+"EoToPi3pyd","64s8Nni2v1","fmIK18xEKz","0YAGHfmIK1","8cVD3v2eC3","sqVrfHRxd8","cmXIXCqqaD","jSjS3yToGW","LbRTH07n1c","fqypybgJAz",
+"CK5W7zz4ZU","1v5hHCfgr3","HRxd8FnPFB","JIqXivkCHH","WreyPP6bcg","7fKYUiwzGk","3weIFtjQxs","WMiS3HP433","tjQxsQClRL","uQIcztaOXK",
+"JKWYRDLhzM","GXdoHyvOMI","tlILtIjTwP","GWqqXHlUbF","fcJOyIjTwP","RmDcrStlDJ","8cVD32hEEU","RpBQm8xEKz","fFDrJcQOnv","ZuDtDjSjS3",
+"pvgjSMkgy8","5iGN5L7cGc","aDGtSoQ87r","XflUqlm0pD","ZUnqtJIqXi","QworugdQsS","VerEAJ2mQi","rhl0JZuDtD","J2mQiaDGtS","C2IrcSmGzv",
+"hi5X7OUqFM","K20wKtuDyS","pT8wuQWxoT","s4786FFDui","jiVBPM3zXL","ECMvUnlaBy","atef2HlUbF","Mm8siZuDtD","l83UdKASQ8","fFDrJpmeCd",
+"hi5X7BFkb8","8cVD30h1b1","2DREsd7vjM","QssNC5iGN5","L7cGct98iW","wDajXmz8gx","8TxD7LDk6f","3weIFJRJQB","BGaQYNo0Qb","VNCPdWDVWJ",
+"WaWsvJKWYR","SjskQlsQGo","FNYIMhE1Ql","0Wr5yCK5W7","MGlTFvLsmS","3weIFlH1kt","SmGzvCp3mZ","fLNg8fcJOy","taOXK55rfB","QChxsNAFuw",
+"Chuy3aDGtS","ix74rwDajX","6AFT0uJScX","Nxx9VvkCHH","OUqFMaL6AJ","5NammCp3mZ","HzZT81v5hH","FLsphv1Hln","zqH0WKASQ8","8TxD7I7p2a",
+"QChxsS77LH","XflUqpmeCd","euZA50BmCy","OHaBzThjNn","K4GS8DG4sT","B3qemoVQp6","lCMxyMm8si","iB08l3otm6","5nmWvru4UG","S77LHCqqaD",
+"W7cTsMezSW","GrDg74dEz6","zQt6QIKxdL","QClRLdhSuH","ciuWzZv7z0","MGlTFfqypy","zqH0WpmeCd","7hyVvnnP8o","HP433ZUnqt","hSSvQS77LH",
+"d85a9MojnP","uTacxhe9IA","v2eC3mX2GE","No0QbpAhR1","e6e4zS2Dfu","Nxx9VMGlTF","TXQ0ZNo0Qb","l83Udi3pyd","LewvMUl4a1","KZamHzHF1q",
+"618DifFDrJ","i7WMQGWqqX","1LB1LmX2GE","2ZHdkhSSvQ","X6Pino8Uyd","7fKYUEoToP","AmdQd5IhmG","4W0TlIjTwP","ni2v18RCUA","5IhmGuLtKs",
+"9GXkXThjNn","7fKYU0PktI","Yh1hF3weIF","uQIcz5Mg9r","CK5W7uQIcz","iwzGkHzZT8","zbIYYJIqXi","ydG8UPOUYS","fFDrJYjB9t","4QMc9Y1mC0",
+"faHirjtn0X","zFgtB4W0Tl","tuDySCfgr3","i3pydqQxHP","0MR5Xix74r","WmadA0Wr5y","oGu6xwiHrZ","CqqaDzFgtB","5Mg9rFxX9q","zFgtB07n1c",
+"K4GS8cmXIX","QYxC0LewvM","ix74ruupzk","HzZT8vkCHH","s93Mlb29RJ","tvdkDXyPZN","uAWypuQIcz","SWfou8U2nU","KsjRKKASQ8","RmDcrWreyP",
+"I7p2ajiVBP","TXQ0ZHfyNQ","Yw2oUJXljW","2Yz7Ezz4ZU","tjQxsFNYIM","o8UydBGaQY","EoToPDLhzM","lXFOBcShY2","e6e4zEdBKc","4dEz68U2nU",
+"ZJTXH0BmCy","5Mg9rGrDg7","9iGoTUl4a1","yToGWzz4ZU","s4786d85a9","0MR5XhUTw7","CK5W7azIWp","MGlTF7fKYU","d7vjMS2Dfu","Nxx9Vd7vjM",
+"prNT6AkKTk","HRxd8gf8rI","EoToPHlUbF","580YD0Kyfs","l83UdCxVEf","XflUq0YAGH","QClRLFLsph","wiHrZh1zcH","Ul4a1xReec","W3VFHHP433",
+"oVQp6ThjNn","UmaEv0Kyfs","hYBCKPOUYS","FVMxohSSvQ","GXdoHD6rBy","qaofNnnP8o","euZA5fqypy","FPfSEfcwDa","GrDg7guMb8","x3LDe5IhmG",
+"9XyT9ThjNn","U3yw5qUJMd","HfyNQ7Ow5C","jiVBPMK07Y","JkzUnZzJHW","ydG8UbgJAz","0ao3lpAhR1","lCMxywiHrZ","aFFss8RCUA","Yh1hFVjCZq",
+"Y1mC0618Di","CqqaDK20wK","zqH0Wo8Uyd","uvf7ALDk6f","X6PincShY2","24ARFprNT6","djsrvRpBQm","tAOsrm4bxU","faHiruvf7A","X6PinZJTXH",
+"Q6hMC9iGoT","1v5hHQClRL","WreyPG1RhS","uupzk5IhmG","FjHXRqQxHP","CxVEf5Drn0","v8yFNWaWsv","azIWpx3LDe","cShY2SmGzv","hUTw7LbRTH",
+"Ss0Zu9y4lw","azIWpcQOnv","RBhp0Twano","HRxd82DREs","ydG8UVjCZq","1LB1LcmXIX","tuDyS0PktI","K20wKuTacx","i7WMQ4dEz6","zY1GY5nmWv",
+"MaJQsvkCHH","55rfBDG4sT","rz7Ut55rfB","okgRi5ZaEz","FFDui7ku1p","i3pydBGaQY","Waim60MR5X","8cVD3FxX9q","9XyT9HzZT8","fcJOy5VZjS",
+"FVMxoVLTy6","DQimpqUJMd","jeskSCqqaD","h1zcH9rlg9","b29RJVerEA","O3iyQD6rBy","ni2v1VjCZq","qUJMdX6Pin","KASQ8tuDyS","WaWsvs93Ml",
+"jzUqRjSjS3","7lUXZVLTy6","DcpWBSjskQ","8hJdtdpe1v","v8yFNYw2oU","8xEKz2ZHdk","VLTy607n1c","t59lRMkgy8","ru4UGlsQGo","TXQ0ZSWfou",
+"KASQ8jzUqR","OUYuFWaWsv","Chuy3Dz1R3","S2DfuVerEA","he9IAuZPqg","okgRi6AFT0","5IhmGK4GS8","5ZaEzlm0pD","FPfSEcL0aE","ZuDtDSbRYy",
+"AkKTkjzUqR","xXTI4y94nw","9GXkXfaHir","rKDLJOUqFM","t98iWYf2Ec","XflUqlH1kt","WreyPwDajX","UmaEvU3yw5","fmIK1okgRi","ReKEWcmXIX",
+"LbRTH580YD","hE1QlMm8si","iB08lDG4sT","lkMUAgIYvE","IjTwPFcWrW","uTacxZ4I1v","v8yFNlViBv","JkzUno8Uyd","oQ87rNhXdu","oGu6xNxx9V",
+"618DiGv3Fq","HzZT8ZuDtD","5ZaEzFxX9q","RxrsmIjTwP","GWqqXZJTXH","FwEJzZv7z0","ZUnqtkB5nP","n1pmOI7p2a","Y1mC0tAOsr","DQimpatef2",
+"o8UydwiHrZ","2Yz7EqaofN","dpe1vtAOsr","BbwgAx3LDe","WmadAReKEW","B3qemgdQsS","TCgPp8hJdt","pT8wunnP8o","hUTw7jSjS3","s7MxkWPmlx",
+"FGzgp5Namm","VerEAQChxs","lCMxySWfou","29QAzPb1pa","16lHcRzaZA","Dz1R3tjQxs","uJScXjzUqR","SbRYy9iGoT","tl72Wjtn0X","hi5X7YjB9t",
+"a00b5a00b5","uTacxrz7Ut","Q6LixMojnP","s93MllkMUA","QbxXcF6PT2","JJs5mUmaEv","cShY2QClRL","CNHmvciuWz","9eoRc5IhmG","5nmWvHlUbF",
+"gIYvERACuj","5ZaEzRsQUq","ECMvUbrhlQ","7fKYUWreyP","m4bxUnlaBy","lCMxyzY1GY","pT8wu5iGN5","5Nammru4UG","FGzgpXflUq","lsQGo55rfB",
+"jzUqRlweGy","lweGyzY1GY","MojnPY1mC0","qUJMdzHF1q","lpF6WZzJHW","3weIFGWqqX","G1RhSAmdQd","DG4sTLewvM","FPfSEyToGW","MaJQsECMvU",
+"2TRI7S2Dfu","uAWypW3VFH","AXpwEYjB9t","K20wK0h1b1","pAhR1cQOnv","ZJTXHZhwG1","s93Mlpv0i7","a00b5cQOnv","Qworum4bxU","taOXKDG4sT",
+"fLNg8XflUq","gdQsSTwano","L7cGcVerEA","uN6r35VZjS","oGu6xL7cGc","uN6r3uoStw","zz4ZU16lHc","8cVD3KZamH","RmDcrThjNn","d7vjMvOqCE",
+"s4786RpBQm","HzZT8oQ87r","tjQxsFnPFB","suY4xUl4a1","BCxeCBFkb8","RmDcrsqVrf","s4786KsjRK","uAWypzbIYY","pmeCdwDajX","n8pJ9fcJOy",
+"ksJbyPYBf4","QClRL1j5L8","cShY2TXQ0Z","aL6AJ1v5hH","rhl0JfcwDa","jtn0Xpv0i7","s93Mlaez9y","48cHLguMb8","faHiruAWyp","pvgjS45cIH",
+"PYBf4FjHXR","0YAGHxReec","M6qcGAOgEe","0h1b1pT8wu","GWqqXi7WMQ","yofH3VNCPd","AkKTkfcwDa","yEfy96q6L9","48cHLQ6hMC","SjskQS77LH",
+"bgJAzn8pJ9","vLsmSTa8f6","JRJQBUlU3M","e6e4zGWqqX","aez9ytvdkD","Ta8f6o8Uyd","tjQxsuLtKs","DG4sTpmeCd","6AFT0uvf7A","FNYIMt98iW",
+"2NslmwDajX","pAhR1ix74r","9y4lwxXTI4","x3LDeJXljW","GWqqX2TRI7","kB5nPzmLYD","soy9td7vjM","NAFuw2hEEU","zY1GYFNYIM","9iGoTQClRL",
+"RpBQm7hyVv","HP433WPmlx","FPfSEVNCPd","hUTw7okgRi","Ta8f65VZjS","tjQxsKsjRK","DQimpaDGtS","CdyBVe6e4z","JkzUnYw2oU","StlDJn1pmO",
+"ix74rulk41","FFDuiaL6AJ","618DilweGy","fcJOyK4GS8","QworuFGzgp","v1HlnuN6r3","QssNCSjskQ","hi5X7IjTwP","IBe8kv1Hln","VLTy6ni2v1",
+"7ku1pJXljW","HP433vOqCE","ni2v1uLtKs","gdQsS29QAz","5ZaEzZJTXH","zFgtBYjB9t","n8pJ9l83Ud","tl72WK20wK","6q6L9hE1Ql","FnPFBCdyBV",
+"BFkb8FFDui","zY1GY2TRI7","iB08lZ4I1v","uupzkb29RJ","qaofNQChxs","euZA5HzZT8","NAFuwLewvM","suY4xThjNn","7lUXZ48cHL","0Wr5yUmaEv",
+"nnP8ofLNg8","vOqCEdmoS7","Gv3FqyEfy9","FGzgpzY1GY","fmIK1lpF6W","In3NSWreyP","l83UdjfREu","7lUXZvLsmS","tl72WMGlTF","e6e4zk85Ae",
+"8cVD3LDk6f","EOE1ogjUTu","Cp3mZmz8gx","ni2v1I7p2a","ZzJHWyofH3","pFrrlzQt6Q","lpF6WjfREu","C2IrcokgRi","BGaQYU3yw5","bZLvSlsQGo",
+"l83Ud8RCUA","MK07Y8TxD7","soy9tgIYvE","jeskStjQxs","VIlwP7fKYU","ReKEWuQIcz","3weIFyofH3","dQ586YOfrY","4W0Tld85a9","Gv3FquQIcz",
+"GXdoHYjB9t","aDGtSKZamH","0KyfsTa8f6","FnPFBs7Mxk","ZJTXHkZANm","NcICAfaHir","QWxoT7fKYU","fFDrJSjskQ","dhSuHyofH3","xXTI4DG4sT",
+"qUJMd0ao3l","vOqCEEdBKc","SmGzvoQ87r","lkMUAnlaBy","dpe1vVLTy6","U3yw5iB08l","FhtglHRxd8","Q6hMCKASQ8","tAOsrC2Irc","dhSuH1v5hH",
+"tuDyS7ku1p","P6bcgAIYUu","i3pydv8yFN","OHaBzcmXIX","8TxD7e6e4z","djsrvYf2Ec","LewvMRzaZA","0KyfsQ6hMC","JkzUnrhl0J","uLtKs7X3uy",
+"IKxdLiB08l","gdQsSCK5W7","1j5L8d7vjM","7X3uyuAWyp","lH1ktd85a9","fcwDaVBjhz","5Mg9rWDVWJ","UlU3MPOUYS","AkKTk0h1b1","CdyBV5Drn0",
+"6q6L97hyVv","14FLRMm8si","d85a9QbxXc","gtCA5dQ586","VjCZqQ6hMC","e6e4zuN6r3","0Wr5yZhwG1","U3yw52ZHdk","QChxsfmIK1","3weIFF6PT2",
+"iB08le6e4z","Dz1R3ZJTXH","aL6AJsoy9t","9y4lwlCMxy","rz7Ut16lHc","4dEz6piJSk","NhXducmXIX","hUTw7SbRYy","bgJAzlsQGo","G1RhS64s8N",
+"DQimpuTacx","5VZjStaOXK","cQOnvx3LDe","azIWpdmoS7","VLTy6EoToP","2NslmhYBCK","1v5hHRkQke","pmeCdru4UG","rz7UtXyPZN","AIYUu2hEEU",
+"RzaZAM3zXL","x3LDeaFFss","Yw2oUAmdQd","azIWpFcWrW","gIYvE7fsYM","9iGoTReKEW","xReecSmGzv","v1HlnIn3NS","9eoRcrz7Ut","Vprf2v2eC3",
+"EoToPFcWrW","zz4ZUbgJAz","QClRLYjB9t","NhXdudjsrv","7fsYM6AFT0","hE1Qlk85Ae","b29RJ580YD","oVQp6pAhR1","0BmCyblLA9","Vprf25Mg9r",
+"PYBf4Uvlv4","2hEEUtaOXK","Ul4a1zY1GY","EOE1o7ku1p","Yh1hFtuDyS","16lHcU3yw5","CqqaDLewvM","tl72Ws7Mxk","RBhp0atef2","XflUqnFqik",
+"tjQxsJIqXi","CK5W7Zv7z0","5NammDLhzM","YjB9t07n1c","W7cTslCMxy","0Wr5ysqVrf","CIShGfcJOy","kB5nPKASQ8","48cHLlH1kt","CNHmvVIlwP",
+"cL0aEni2v1","brhlQIjTwP","QClRLBbwgA","RpBQmVerEA","aFFsshe9IA","s93Ml0PktI","QClRL618Di","pFrrl7X3uy","NOHsz8FmFH","s93Ml2TRI7",
+"2ZHdk55rfB","Rxrsmb29RJ","bgJAzlj07Q","iwzGkrhl0J","jtn0Xni2v1","qQxHPuvf7A","F6PT2mz8gx","ru4UGSmGzv","uQIcz2hEEU","FNYIMZJTXH",
+"uAWypfqypy","C2Irc2hEEU","Yf2EcOUYuF","bgJAzjtn0X","5Drn0tvdkD","zbIYY16lHc","POUYSQClRL","qaofNgdQsS","WreyPhUTw7","FjHXRiKqhr",
+"MmKGJuTacx","LDk6fzFgtB","16lHcKZamH","uPX7GWaim6","uQIczs7Mxk","VLTy6AOgEe","K20wKbgJAz","AgJHQtl72W","jSjS3he9IA","y94nwWmadA",
+"QbxXcC2Irc","DQimppT8wu","zbIYY9eoRc","t98iW7lUXZ","s4786gtCA5","ulk41EOE1o","No0Qbulk41","IjTwPCxVEf","3weIFa00b5","DLhzMoVQp6",
+"SbRYydmoS7","8U2nUBbwgA","v8yFN8cVD3","hYBCKFjHXR","Nxx9Vlm0pD","e6e4z8xEKz","cL0aENcICA","RxrsmD6rBy","S77LHdjsrv","RsQUqv8yFN",
+"lCMxy4dEz6","2Yz7EyluBx","D6rBygIYvE","lj07QvkCHH","AmdQd8TxD7","uvf7Arhl0J","iwzGkTXQ0Z","WmadAoVQp6","7X3uyPOUYS","Yw2oUoGu6x",
+"8U2nUlkMUA","wiHrZMkgy8","KZamHaFFss","taOXK5Namm","Nxx9VYjB9t","zHF1qJXljW","lXFOB7X3uy","AmdQdt59lR","J2mQiJJs5m","7fsYM5ZaEz",
+"SjskQGrDg7","RsQUqXflUq","8hJdt0ao3l","2Yz7Ev1Hln","5NammzY1GY","Oz8yZbrhlQ","Cfgr3cQOnv","SjskQ3otm6","5drc6RBhp0","EdBKc0Wr5y",
+"WreyPJJs5m","0PktI5iGN5","7fKYUECMvU","ZuDtDlkMUA","pT8wupv0i7","VjCZq24ARF","KZamHY1mC0","iKqhr8cVD3","29QAzsx5Gl","0MR5XCIShG",
+"uupzklsQGo","RACujJJs5m","jzUqR8xEKz","3weIFW7cTs","ZUnqtlH1kt","piJSkEOE1o","sqVrfjzUqR","Chuy3lH1kt","9y4lwfaHir","jzUqR7X3uy",
+"4dEz6No0Qb","SmGzvSbRYy","AXpwEaL6AJ","vkCHHmz8gx","n8pJ9SmGzv","9XyT9iqv4k","24ARFEoToP","fFDrJpvgjS","tuDySBbwgA","ZUnqtfcwDa",
+"o8UydFhtgl","Cp3mZUvlv4","uJScXjSjS3","t98iW5Namm","QnJ1SAOgEe","BbwgAfqypy","U3yw5Fhtgl","b29RJMezSW","he9IAEoToP","LewvM5VZjS",
+"Dz1R3VNCPd","2DREsbrhlQ","Kr8ys0BmCy","DcpWB8TxD7","qaofNpiJSk","0MR5Xsx5Gl","xXTI4atef2","v1HlnAOgEe","VBjhzoGu6x","uupzkIn3NS",
+"uN6r3ZhwG1","fLNg8IRh48","qaofNwDajX","pv0i7QssNC","BFkb8NhXdu","45cIHRzaZA","Z4I1vd85a9","Cfgr3tuDyS","ZUnqt45cIH","580YDTa8f6",
+"qQxHPn8pJ9","lj07QfLNg8","guMb8pFrrl","zz4ZUBGaQY","UlU3MpWiOs","1j5L8I7p2a","W3VFHGv3Fq","qQxHPyEfy9","WDVWJYOfrY","CxVEfgIYvE",
+"lpF6W4W0Tl","7hyVvb29RJ","IBe8kbZLvS","xReec580YD","1LB1LbrhlQ","FPfSEVLTy6","9GXkXJXljW","yluBxpT8wu","RkQkeh1zcH","7hyVvprNT6",
+"0ao3lhSSvQ","CxVEfsoy9t","0KyfsFhtgl","3otm6GWqqX","ZuDtDiwzGk","X6Pinv8yFN","S2DfuW7cTs","b29RJWaWsv","3weIF5nmWv","yToGWMaJQs",
+"FNYIM3otm6","RBhp0NcICA","xReec9GXkX","IKxdLoQ87r","6q6L9TXQ0Z","ru4UG5Mg9r","HlUbFLbRTH","CIShGpiJSk","nlaBytvdkD","ThjNnTwano",
+"Dz1R3POUYS","NcICAdmoS7","uAWypQWxoT","GSQwj5Namm","JIqXiuPX7G","pT8wuVLTy6","cQOnvECMvU","P6bcgFwEJz","wDajXuLtKs","IBe8kuJScX",
+"vOqCEG1RhS","WaWsvBGaQY","gdQsSQbxXc","iqv4kpT8wu","rhl0JECMvU","lViBvvOqCE","OHaBzoGu6x","s93MlmX2GE","I7p2a8RCUA","faHirK4GS8",
+"SbRYyY1mC0","618DiFcWrW","EdBKcDcpWB","BpYhVWPmlx","pmeCduAWyp","prNT6In3NS","iKqhrwiHrZ","SjskQpWiOs","2NslmEOE1o","cmXIXlpF6W",
+"s93Mli3pyd","lXFOBcL0aE","djsrv0MR5X","v8yFNfFDrJ","LbRTHvLsmS","9y4lwCK5W7","zz4ZUFwEJz","QChxsReKEW","zFgtBsuY4x","tvdkDnlaBy",
+"TCgPprz7Ut","RsQUquZPqg","tuDySnFqik","QWxoTCqqaD","RmDcrt98iW","7X3uykZANm","Ta8f6In3NS","B3qemlm0pD","sqVrfYjB9t","YOfrYs93Ml",
+"DQimpuZPqg","zQt6Q16lHc","hi5X7iqv4k","i3pydYf2Ec","zQt6Q8cVD3","i3pydWmadA","5Drn0S77LH","OHaBz9rlg9","5Mg9rVerEA","ix74rMojnP",
+"he9IApFrrl","HlUbF6AFT0","xciqpqUJMd","2TRI7v2eC3","iB08lM6qcG","7hyVvuAWyp","HP433MmsIo","16lHcMezSW","In3NSogLgc","pT8wuU3yw5",
+"7fsYMDQimp","xciqp8xEKz","qQxHPxReec","1j5L8RzaZA","FLsphJkzUn","2hEEUWMiS3","HP4335Drn0","yEfy9Yh1hF","RmDcrPYBf4","azIWpv8yFN",
+"3weIFHP433","dQ5865nmWv","2Yz7EogLgc","fLNg89XyT9","7fKYUGXdoH","TCgPpEoToP","oGu6xlViBv","HfyNQtuDyS","Ta8f6ni2v1","cL0aEGrDg7",
+"Pb1paFnPFB","ReKEWmz8gx","vkCHH5ZaEz","RpBQmRsQUq","WmadAydG8U","8TxD7uQIcz","NhXduD6rBy","suY4xa00b5","5ZaEzKZamH","WDVWJm4bxU",
+"NcICACIShG","QYxC0zqH0W","Pb1paZ4I1v","cShY26q6L9","guMb8BCxeC","he9IAFnPFB","bZLvS5ZaEz","Dz1R3jeskS","16lHcjeskS","ThjNngf8rI",
+"ydG8U0PktI","ni2v10YAGH","gf8rI8FmFH","blLA9BGaQY","nnP8o5drc6","Yh1hFUvlv4","580YDSWfou","gjUTunFqik","QClRLl83Ud","ogLgcpv0i7",
+"Ul4a1UmaEv","2ZHdkOz8yZ","5Mg9rqaofN","Pb1pa2ZHdk","DLhzMOxWIH","yToGWaDGtS","5drc65iGN5","BCxeC8FmFH","oGu6xd7vjM","h1zcH5drc6",
+"okgRiIKxdL","XyPZN5Mg9r","fLNg8Uvlv4","Cfgr3618Di","ni2v1FLsph","FcWrWSs0Zu","K20wKYw2oU","8cVD3Mm8si","Q6LixSmGzv","jeskS8hJdt",
+"AXpwEyEfy9","ECMvUQWxoT","OUqFMIn3NS","ECMvUZzJHW","uPX7Ga00b5","VNCPdeuZA5","NOHsz1LB1L","PYBf4lweGy","P6bcgkZANm","guMb8VerEA",
+"ogLgc3weIF","yvOMI2ZHdk","Mm8siReKEW","CK5W73weIF","0Wr5yv2eC3","BFkb88xEKz","dhSuH0ao3l","FFDuilkMUA","X6Pin2hEEU","BFkb8sx5Gl",
+"EOE1olpF6W","aez9yyToGW","2NslmJJs5m","zbIYYSWfou","ru4UGF6PT2","TwanofmIK1","aFFssRBhp0","M6qcGfcJOy","fqypyfmIK1","Ss0Zuuvf7A",
+"QworuJKWYR","FNYIMogLgc","rz7Ut7fKYU","Ss0ZufcwDa","k85AexXTI4","nnP8obgJAz","Cp3mZlH1kt","AIYUuCqqaD","gtCA5dhSuH","7X3uyD6rBy",
+"LDk6fXflUq","FPfSEHP433","580YDF6PT2","55rfBjeskS","DG4sTFNYIM","vkCHH0h1b1","gIYvEOUqFM","yluBxZ4I1v","fcwDa45cIH","taOXKX6Pin",
+"64s8N14FLR","pT8wu0BmCy","Uvlv4pv0i7","bZLvSgf8rI","i3pydpv0i7","blLA9gIYvE","8xEKzC2Irc","FxX9q5IhmG","CqqaDMezSW","i7WMQpmeCd",
+"lH1ktfmIK1","VBjhzRpBQm","7Ow5CQ6hMC","2ZHdkMojnP","OUqFMC2Irc","v8yFNQssNC","fqypy45cIH","v8yFNni2v1","blLA9C2Irc","piJSkvOqCE",
+"d85a9QYxC0","YjB9thYBCK","7lUXZtl72W","DcpWBv2eC3","cL0aEpmeCd","BFkb8djsrv","s93Ml0YAGH","oVQp6AXpwE","QWxoTEdBKc","OUYuFh1zcH",
+"G1RhSvLsmS","ZhwG1JJs5m","wiHrZkB5nP","ECMvUQssNC","Ul4a1KASQ8","BFkb85iGN5","FxX9qM3zXL","l83UdI7p2a","MmKGJZuDtD","hUTw7UlU3M",
+"WmadAO3iyQ","b29RJ5Mg9r","uoStw0Wr5y","2ZHdkVjCZq","djsrv9XyT9","zY1GYk85Ae","BCxeCMkgy8","CK5W7fcwDa","kZANmjfREu","qQxHPBbwgA",
+"n1pmOGWqqX","Y1mC0taOXK","K4GS8OUqFM","HfyNQFjHXR","ZJTXHGv3Fq","qUJMd5Mg9r","WDVWJ0BmCy","SWfouiwzGk","piJSkix74r","4QMc9v8yFN",
+"ix74r7ku1p","vLsmSFnPFB","iqv4k9XyT9","UmaEvtuDyS","ni2v116lHc","SjskQThjNn","s93MlGWqqX","nlaByMmKGJ","hi5X7Cp3mZ","uN6r38xEKz",
+"n8pJ90YAGH","hSSvQChuy3","Cfgr3PYBf4","yvOMIPb1pa","NAFuwFLsph","KZamHuupzk","mz8gx1LB1L","QChxs8xEKz","pv0i7fmIK1","EoToPVIlwP",
+"atef2uoStw","hYBCKlH1kt","RzaZAprNT6","uAWypIBe8k","M3zXLpvgjS","h1zcHaFFss","RBhp0uAWyp","n1pmOSWfou","Zv7z0Cfgr3","GWqqXOz8yZ",
+"MezSWJRJQB","RsQUqWMiS3","MezSWEoToP","mX2GEiB08l","cmXIXtjQxs","IRh48LDk6f","s93Ml5ZaEz","wDajXQssNC","BGaQYDcpWB","jtn0XjS1aj",
+"JkzUnEOE1o","HzZT8MmKGJ","B3qemzbIYY","UmaEvJJs5m","K4GS8POUYS","IRh485Drn0","4dEz6cQOnv","GXdoHqaofN","ReKEWQworu","pvgjS0Wr5y",
+"K20wKtaOXK","cQOnvMK07Y","Oz8yZKZamH","yvOMIMaJQs","iqv4kGSQwj","3otm67fKYU","0Kyfs7lUXZ","0ao3l2TRI7","24ARFuPX7G","9rlg9FGzgp",
+"MaJQsMaJQs","Z4I1vS77LH","WaWsvsuY4x","aDGtS5IhmG","Z4I1v0Kyfs","jiVBPtAOsr","Zv7z0VBjhz","RBhp0uLtKs","iwzGkzY1GY","VIlwPWDVWJ",
+"dQ586Mkgy8","5ZaEzAIYUu","uAWypP6bcg","zbIYY0ao3l","IRh48Chuy3","hE1Ql7Ow5C","CxVEfydG8U","cL0aE2hEEU","ru4UGWmadA","s4786brhlQ",
+"7Ow5CCdyBV","hYBCK1v5hH","2DREsG1RhS","ksJbyLewvM","GWqqX2Nslm","POUYSSWfou","64s8N2Yz7E","zQt6QS77LH","bgJAzaDGtS","WaWsvnFqik",
+"UmaEvhi5X7","brhlQY1mC0","jtn0X9iGoT","24ARFG1RhS","HRxd82hEEU","0KyfskZANm","Yw2oUMkgy8","rz7UtJkzUn","piJSkv1Hln","NcICALbRTH",
+"rhl0JVerEA","tlILtBbwgA","ZUnqtAkKTk","WPmlxMaJQs","fqypyQClRL","AOgEeuN6r3","d7vjMK20wK","9y4lwQClRL","TCgPpI7p2a","WmadA5iGN5",
+"xReecG1RhS","FPfSEjeskS","ThjNnLbRTH","WaWsvpAhR1","WPmlxh1zcH","HfyNQhe9IA","FwEJzyofH3","S77LHC2Irc","580YDiqv4k","jzUqRFxX9q",
+"In3NSECMvU","qaofN5nmWv","OHaBzlViBv","QClRLQ6Lix","5Mg9rdjsrv","vkCHH2hEEU","S77LHIjTwP","o8UydZv7z0","t98iWjS1aj","FwEJzeuZA5",
+"fmIK1BpYhV","mz8gxfmIK1","Gv3FqY1mC0","AXpwEFFDui","Q6hMC0YAGH","7hyVvM3zXL","StlDJMK07Y","lj07Q8cVD3","6AFT0IjTwP","s93MlUlU3M",
+"CqqaDazIWp","SWfoudQ586","BbwgAWPmlx","FwEJz4W0Tl","5VZjSwiHrZ","F6PT2FVMxo","KZamHi3pyd","OHaBzWreyP","ogLgcRmDcr","RkQkeRBhp0",
+"pAhR1v1Hln","O3iyQhE1Ql","zbIYYWaWsv","tjQxsHzZT8","0YAGHni2v1","azIWppv0i7","lCMxyZUnqt","HRxd8PYBf4","JRJQBjSjS3","OUqFMFcWrW",
+"Z4I1vm4bxU","tAOsroGu6x","LewvMxciqp","55rfBFVMxo","FGzgpuupzk","0MR5XGrDg7","I7p2ao8Uyd","yvOMIDQimp","AXpwEBpYhV","dpe1v29QAz",
+"HzZT8QWxoT","GrDg7zqH0W","Waim6FNYIM","1v5hH5nmWv","XyPZN5nmWv","JRJQBEoToP","WMiS3VIlwP","SWfouD6rBy","lj07Q7hyVv","nlaByFVMxo",
+"n8pJ9h1zcH","AOgEeCK5W7","Cp3mZIRh48","TCgPphe9IA","RmDcriwzGk","SjskQI7p2a","Ta8f6okgRi","In3NS8xEKz","zz4ZU55rfB","PYBf48xEKz",
+"No0QbDcpWB","JRJQBaFFss","IjTwPjeskS","yofH3e6e4z","xciqpLewvM","zFgtBpvgjS","rhl0JbgJAz","uJScXvkCHH","uN6r3Fhtgl","5NammqQxHP",
+"AIYUuiwzGk","jiVBPGWqqX","iqv4kXyPZN","0PktIJJs5m","WreyPNo0Qb","9XyT9Q6Lix","rz7UtEOE1o","Gv3FqCNHmv","DQimpprNT6","sx5GlEoToP",
+"EdBKcazIWp","2NslmkZANm","MmsIoCfgr3","rz7Uty94nw","uvf7AOHaBz","8TxD7he9IA","AIYUusx5Gl","CK5W73otm6","Y1mC0KZamH","he9IARsQUq",
+"6q6L9yvOMI","tl72WFNYIM","8hJdtYh1hF","lkMUAFjHXR","hSSvQWaWsv","OHaBzlCMxy","FGzgplweGy","ZhwG1FnPFB","S77LHUmaEv","CxVEfUvlv4",
+"8TxD7atef2","In3NSZJTXH","9y4lwSjskQ","VerEA6q6L9","Gv3FqFxX9q","NhXduYOfrY","qQxHP7X3uy","jeskSAIYUu","TXQ0ZF6PT2","FPfSEjiVBP",
+"QWxoT8TxD7","uupzkAIYUu","FPfSENo0Qb","Y1mC0prNT6","uZPqgv8yFN","RACuj5iGN5","v2eC3HzZT8","7Ow5CCNHmv","2TRI75iGN5","rhl0JYw2oU",
+"WmadAuN6r3","BpYhVC2Irc","uQIczgjUTu","s7MxkqUJMd","UlU3MvLsmS","5Namm7hyVv","48cHLNcICA","FGzgplj07Q","FLsphaL6AJ","ydG8UNo0Qb",
+"aez9yBbwgA","64s8NydG8U","s7MxkpAhR1","YjB9tHRxd8","Pb1patuDyS","0KyfsMezSW","DcpWBuN6r3","cShY2Cfgr3","azIWpG1RhS","Oz8yZiKqhr",
+"C2Irc4dEz6","uoStwCdyBV","0Wr5yguMb8","Yw2oUJIqXi","In3NSv8yFN","FPfSEblLA9","X6PinCxVEf","pAhR1pvgjS","48cHLogLgc","ulk41blLA9",
+"NhXdu29QAz","bgJAzjeskS","9GXkXe6e4z","v1HlnVerEA","45cIHAOgEe","qUJMdSs0Zu","FwEJzbgJAz","s93Ml5Mg9r","UlU3MZUnqt","EdBKcyToGW",
+"pmeCdhE1Ql","BbwgAsx5Gl","EoToP9y4lw","5IhmGfFDrJ","618DiQYxC0","i7WMQRpBQm","JRJQB55rfB","L7cGcTa8f6","y94nwJ2mQi","guMb88RCUA",
+"8cVD3Y1mC0","NcICA5VZjS","AIYUuDz1R3","580YD618Di","2Yz7EhSSvQ","Yw2oU6q6L9","fqypyNxx9V","dQ586rhl0J","S77LHsuY4x","EOE1oRkQke",
+"B3qemaFFss","ni2v1FNYIM","zqH0WfcwDa","5VZjS5nmWv","4QMc9qQxHP","pv0i7SmGzv","he9IAzFgtB","lweGyZJTXH","KZamHzQt6Q","dQ586yofH3",
+"suY4x16lHc","qUJMdVprf2","RACujAXpwE","lViBvIn3NS","GrDg7he9IA","dmoS7hUTw7","5ZaEzWDVWJ","yvOMIIjTwP","WDVWJZJTXH","n1pmOiB08l",
+"VLTy6vkCHH","7Ow5C9XyT9","WmadAMK07Y","pmeCdhYBCK","UlU3MMmsIo","JRJQBP6bcg","LDk6faL6AJ","djsrvhi5X7","mz8gxOHaBz","gjUTu8FmFH",
+"zHF1q5ZaEz","xReecNhXdu","ZuDtD618Di","sqVrfWaim6","HRxd82TRI7","5drc6pFrrl","ZJTXHaDGtS","7lUXZuJScX","bgJAzVerEA","zHF1qWDVWJ",
+"7Ow5CGrDg7","vOqCElj07Q","zbIYYfcwDa","QWxoTzFgtB","P6bcgv2eC3","G1RhSuvf7A","fFDrJQChxs","h1zcHD6rBy","xXTI4cL0aE","Yh1hFKsjRK",
+"JJs5muQIcz","MK07YZuDtD","BGaQY2hEEU","FVMxolweGy","dmoS7Zv7z0","s7MxkuZPqg","zHF1qpT8wu","CdyBVlm0pD","i3pydokgRi","OUqFMCIShG",
+"RpBQmVNCPd","7hyVvWaWsv","QbxXculk41","ciuWzpT8wu","C2IrcPb1pa","FNYIMReKEW","v2eC3D6rBy","v2eC3Yf2Ec","RmDcr55rfB","OxWIHAXpwE",
+"0PktIs7Mxk","ZJTXHMm8si","AOgEek85Ae","piJSkVerEA","HfyNQEOE1o","hYBCK2Yz7E","RpBQmtl72W","ksJbyjiVBP","MojnP6q6L9","WDVWJUmaEv",
+"0MR5XYOfrY","jtn0XFjHXR","No0QbRpBQm","uoStwPOUYS","uLtKs7lUXZ","POUYSpAhR1","RBhp0faHir","JIqXi7Ow5C","uLtKs5VZjS","AOgEe2hEEU",
+"W3VFHn1pmO","fcJOy1v5hH","bZLvSEOE1o","jzUqRQChxs","tlILtFnPFB","mX2GEStlDJ","RxrsmIRh48","1j5L8aez9y","FLsphjiVBP","QbxXcSWfou",
+"SmGzvprNT6","HzZT8U3yw5","yvOMIEOE1o","8cVD37ku1p","K4GS8M6qcG","J2mQiP6bcg","P6bcgW3VFH","nnP8o2TRI7","5drc6ZJTXH","MGlTFNhXdu",
+"lsQGoWMiS3","In3NSWmadA","pWiOsGv3Fq","24ARF0h1b1","piJSk5Drn0","VIlwPtlILt","iKqhrW3VFH","Yw2oU2ZHdk","nnP8oMezSW","07n1cVNCPd",
+"pT8wuSjskQ","OxWIHfaHir","wDajXLewvM","QChxsl83Ud","DLhzM0Kyfs","l83UdZzJHW","0ao3lNxx9V","bgJAzcQOnv","FnPFB618Di","EdBKcs93Ml",
+"oGu6xHRxd8","7Ow5ClweGy","FxX9qVBjhz","2TRI7d85a9","BbwgAzqH0W","aFFssydG8U","y94nwk85Ae","JKWYRpAhR1","zz4ZUJXljW","AXpwEaFFss",
+"FFDuiSWfou","ZhwG18xEKz","ciuWzQ6Lix","XflUqdQ586","t98iWQ6Lix","S2DfuGSQwj","ECMvUFFDui","RsQUq2Yz7E","5Mg9roGu6x","K20wKo8Uyd",
+"JRJQB7ku1p","zQt6QDz1R3","h1zcHzbIYY","YOfrYVjCZq","TCgPprhl0J","nlaByHRxd8","LDk6fY1mC0","oVQp6HRxd8","C2IrcydG8U","pvgjSBFkb8",
+"tuDySlViBv","yvOMIaFFss","Ss0ZuhYBCK","29QAzvOqCE","SWfouZJTXH","4W0Tl2hEEU","WreyPjSjS3","Zv7z0cQOnv","JJs5mJRJQB","v8yFNB3qem",
+"P6bcgzbIYY","WMiS37hyVv","v1HlnJkzUn","bZLvSjtn0X","FFDuiy94nw","VNCPdIKxdL","QnJ1SIjTwP","pvgjSMezSW","djsrvzQt6Q","VIlwPKASQ8",
+"CdyBVoVQp6","KASQ8YjB9t","5ZaEzrKDLJ","Yw2oUiB08l","JRJQBGrDg7","MmsIoNo0Qb","zz4ZUNOHsz","Oz8yZfcwDa","x3LDehSSvQ","jfREun8pJ9",
+"VNCPdpFrrl","AIYUu5drc6","FLsphs7Mxk","nlaByfcwDa","atef2CqqaD","No0QbCp3mZ","IRh48CxVEf","jfREuTXQ0Z","AIYUuGv3Fq","oVQp6sx5Gl",
+"sqVrfLDk6f","n1pmODLhzM","FcWrWJKWYR","P6bcgThjNn","GrDg7PYBf4","sx5GltuDyS","55rfBcShY2","uTacx0PktI","xciqppFrrl","MojnPPb1pa",
+"cShY2lj07Q","7fsYMCK5W7","7fsYMhYBCK","fFDrJwiHrZ","lViBvKASQ8","5NammFPfSE","DG4sTEoToP","7lUXZ6AFT0","Z4I1voVQp6","B3qemD6rBy",
+"s93MlSmGzv","B3qemHfyNQ","xReecyEfy9","v2eC3CNHmv","8hJdtAmdQd","soy9tQ6hMC","KsjRK0YAGH","29QAzbrhlQ","aez9yzHF1q","IjTwPfcwDa",
+"ZJTXHXflUq","1LB1LjzUqR","i3pydzQt6Q","2NslmAmdQd","VLTy6OHaBz","9eoRchUTw7","9eoRc8cVD3","WDVWJguMb8","vOqCEDz1R3","nlaBy5IhmG",
+"VNCPdlj07Q","O3iyQhSSvQ","tAOsroQ87r","lXFOBP6bcg","JKWYRFGzgp","Cfgr3CK5W7","FLsphGWqqX","lCMxy1v5hH","TCgPpBbwgA","4W0Tli3pyd",
+"FFDuiSmGzv","uAWypTCgPp","L7cGcd85a9","Waim6U3yw5","M6qcGksJby","AXpwE8cVD3","OUqFM7X3uy","Dz1R3DQimp","CK5W7lkMUA","lViBvsx5Gl",
+"2Yz7EKsjRK","KASQ8Y1mC0","K20wKMkgy8","y94nwQ6hMC","uQIczuZPqg","xXTI4zHF1q","7hyVvru4UG","FGzgpRACuj","lXFOBCK5W7","uLtKsD6rBy",
+"5Drn0JXljW","ThjNnZhwG1","580YDksJby","8xEKznnP8o","pWiOs2TRI7","l83UdJkzUn","Pb1pa8cVD3","KsjRKpiJSk","Q6LixAIYUu","9rlg9y94nw",
+"K20wKulk41","EoToP9XyT9","OUqFMaez9y","ciuWzkZANm","vkCHHrKDLJ","HfyNQoVQp6","S2Dfudjsrv","IRh48BFkb8","K20wKk85Ae","v8yFNQbxXc",
+"YjB9tlweGy","guMb8hi5X7","ix74rrKDLJ","9rlg9NcICA","lViBv2Nslm","lCMxyRACuj","nnP8oaez9y","7hyVvBCxeC","FLsphQworu","FNYIMatef2",
+"ZJTXHYh1hF","F6PT28TxD7","lCMxyvOqCE","45cIHFGzgp","jtn0XblLA9","NAFuw7lUXZ","uQIczl83Ud","mz8gx0ao3l","UmaEv5drc6","MK07Y5IhmG",
+"pv0i7nFqik","SmGzvNOHsz","5VZjSEdBKc","ru4UGTCgPp","pmeCdhUTw7","taOXKQ6Lix","s4786fmIK1","WMiS3RACuj","uLtKsDLhzM","vLsmSyEfy9",
+"tAOsrdQ586","TCgPpCp3mZ","S77LH5IhmG","fcwDa1j5L8","0PktIxXTI4","xReecm4bxU","0h1b1qaofN","fFDrJNOHsz","MmKGJfqypy","kZANmgdQsS",
+"HlUbF3otm6","i7WMQn8pJ9","Yh1hF4QMc9","uZPqgIn3NS","7Ow5Ck85Ae","y94nwhE1Ql","hE1QlazIWp","ni2v1StlDJ","Oz8yZi7WMQ","5iGN5O3iyQ",
+"zqH0W2TRI7","TwanofFDrJ","cmXIXBCxeC","cmXIX24ARF","zFgtBrhl0J","zY1GYD6rBy","Oz8yZThjNn","VLTy6TCgPp","QYxC0ZhwG1","QworuQ6hMC",
+"b29RJJRJQB","ksJbyUvlv4","0ao3lzFgtB","FVMxo0ao3l","IKxdL64s8N","Yf2EcAgJHQ","dQ586dmoS7","VjCZqSbRYy","ogLgczHF1q","KZamHCfgr3",
+"lViBv7fsYM","xciqp0Kyfs","yEfy9ZuDtD","s7Mxk9rlg9","1LB1LOxWIH","5nmWv7lUXZ","d85a9dpe1v","soy9tbZLvS","ogLgc7lUXZ","K20wKpvgjS",
+"he9IA0BmCy","ogLgc4W0Tl","X6PinuQIcz","BGaQY29QAz","DG4sT8FmFH","IKxdLCIShG","nFqikNhXdu","fqypylpF6W","29QAz2TRI7","580YDlj07Q",
+"iKqhrh1zcH","1v5hHxXTI4","wDajXIKxdL","CqqaDfmIK1","dpe1vcmXIX","OUYuFaFFss","4dEz6VBjhz","RkQkeZuDtD","AkKTkhSSvQ","CNHmvMojnP",
+"1LB1LC2Irc","Yw2oUs93Ml","SbRYyI7p2a","tAOsriB08l","Ss0ZuVjCZq","soy9tuN6r3","lH1ktjS1aj","gdQsSRACuj","CdyBVulk41","In3NSEoToP",
+"GSQwjS2Dfu","ulk41No0Qb","ogLgcgIYvE","1v5hHTXQ0Z","OUYuFW7cTs","55rfBs93Ml","ru4UGUl4a1","45cIH5nmWv","lH1ktkZANm","vLsmSnnP8o",
+"WaWsvCfgr3","POUYS7lUXZ","K4GS8ulk41","AmdQdcL0aE","OUqFMHP433","0BmCyuoStw","gtCA5guMb8","zmLYDhe9IA","5IhmGTCgPp","JKWYRPOUYS",
+"Uvlv4l83Ud","ydG8UjzUqR","8TxD7hYBCK","qQxHPK4GS8","UmaEvZv7z0","s4786lCMxy","2TRI7zqH0W","7lUXZ5iGN5","ZJTXHCp3mZ","v8yFN0BmCy",
+"pT8wuBpYhV","Cp3mZMezSW","5ZaEzKsjRK","zz4ZUoQ87r","RBhp0F6PT2","StlDJd85a9","Vprf2S2Dfu","iKqhrd85a9","MezSWlViBv","9iGoTBFkb8",
+"bgJAzJRJQB","X6Pin7fsYM","n1pmOFwEJz","XflUqhe9IA","ogLgcgf8rI","FhtglRsQUq","uN6r3soy9t","tlILttAOsr","Z4I1vlH1kt","ThjNnS2Dfu",
+"07n1czFgtB","l83UdX6Pin","hUTw7OUYuF","Oz8yZXflUq","U3yw57Ow5C","CIShGcQOnv","uQIczsuY4x","Pb1papWiOs","AXpwE9XyT9","nFqikBpYhV",
+"7fsYMJKWYR","IjTwPAOgEe","CNHmvb29RJ","aDGtSjtn0X","rKDLJoVQp6","G1RhSfLNg8","Yw2oUMojnP","IBe8kW3VFH","IKxdLpWiOs","2Yz7EMaJQs",
+"8TxD7RmDcr","k85Ae8cVD3","24ARFChuy3","cShY2gjUTu","BFkb87hyVv","Yh1hFCNHmv","ksJby14FLR","Chuy3fcwDa","faHirNcICA","VjCZq8xEKz",
+"KsjRKkZANm","2hEEUfFDrJ","tvdkDfcJOy","3otm6tl72W","NhXdus4786","i3pydHfyNQ","b29RJK4GS8","G1RhSL7cGc","FLsphZ4I1v","P6bcgpAhR1",
+"8cVD3AXpwE","AkKTkM6qcG","BbwgAF6PT2","9XyT9FjHXR","zmLYDjS1aj","CK5W7HlUbF","JkzUnJJs5m","VNCPdlm0pD","5Nammi7WMQ","4QMc91LB1L",
+"DG4sTlm0pD","oGu6xoQ87r","RpBQmv8yFN","GSQwj29QAz","brhlQZ4I1v","45cIHDz1R3","jiVBPZUnqt","TwanoVerEA","JXljW14FLR","W3VFHpmeCd",
+"ydG8UdhSuH","uN6r3uJScX","VIlwP0ao3l","MaJQsKr8ys","8hJdtRxrsm","tuDyS0YAGH","vLsmStl72W","s4786y94nw","29QAzWaWsv","HP433QnJ1S",
+"S2DfuFLsph","s93MlCK5W7","zqH0WYf2Ec","9XyT9xXTI4","he9IAbrhlQ","vLsmSRmDcr","jfREuECMvU","Mm8siMK07Y","8cVD3lpF6W","DQimpYf2Ec",
+"gIYvEKsjRK","zqH0WD6rBy","cQOnv8FmFH","zmLYDEoToP","WMiS3TXQ0Z","dQ586atef2","0PktIm4bxU","In3NSFcWrW","29QAzMK07Y","s47862DREs",
+"14FLRzFgtB","vOqCEP6bcg","LDk6fpWiOs","IRh487hyVv","W7cTs2hEEU","e6e4zhi5X7","24ARF2TRI7","guMb8v2eC3","SjskQ8FmFH","4W0TlM6qcG",
+"yluBxv8yFN","SmGzvdpe1v","brhlQiwzGk","ReKEWqUJMd","IBe8kuvf7A","JkzUnjeskS","RmDcrh1zcH","KASQ8Gv3Fq","7ku1pCfgr3","lsQGo1LB1L",
+"lm0pDFxX9q","LDk6fLbRTH","CIShGEdBKc","07n1c7ku1p","gjUTuOUYuF","CqqaDdQ586","fmIK11LB1L","iqv4kQbxXc","cQOnvCqqaD","uJScXAgJHQ",
+"ZhwG1uAWyp","Waim6jeskS","6q6L94W0Tl","AkKTk2DREs","LewvMMmKGJ","RBhp0StlDJ","cmXIXS2Dfu","HRxd8Fhtgl","FjHXRTXQ0Z","pmeCdaez9y",
+"FnPFBBFkb8","F6PT27Ow5C","JkzUnksJby","OHaBz1LB1L","7hyVvblLA9","QChxsxReec","xciqprhl0J","ogLgcJIqXi","JXljWbrhlQ","WDVWJyvOMI",
+"WreyPM6qcG","a00b5mX2GE","fFDrJ0MR5X","ZuDtDWMiS3","zHF1quPX7G","Ul4a1zz4ZU","jtn0XReKEW","W7cTsMojnP","XflUqB3qem","JJs5m6AFT0",
+"3otm6JkzUn","TCgPppvgjS","uN6r3Oz8yZ","uTacxQ6hMC","QbxXc3otm6","RsQUqt98iW","uupzkh1zcH","Gv3FqhYBCK","yToGWqQxHP","4QMc9azIWp",
+"580YD0MR5X","CqqaDMm8si","jiVBPAkKTk","SmGzvDcpWB","Y1mC0X6Pin","ReKEWbrhlQ","taOXKfcJOy","5NammCdyBV","BpYhVbgJAz","oVQp6Vprf2",
+"d85a9VIlwP","7fKYUMmsIo","RBhp0v2eC3","L7cGctjQxs","3otm6v1Hln","cL0aEb29RJ","FFDuiJRJQB","VerEA1v5hH","OxWIHMojnP","SWfout59lR",
+"wiHrZhSSvQ","vLsmSvLsmS","hi5X7lXFOB","Cfgr3QbxXc","oVQp6U3yw5","55rfBFnPFB","GSQwjd7vjM","F6PT2FGzgp","aez9y7fKYU","ciuWz5nmWv",
+"8TxD72ZHdk","VLTy6MezSW","BFkb8taOXK","AXpwECK5W7","Ul4a1QssNC","lViBvuAWyp","Zv7z0iwzGk","wiHrZgIYvE","MezSWxReec","07n1cUlU3M",
+"sqVrfVLTy6","Vprf2pvgjS","IRh48No0Qb","BCxeCciuWz","HfyNQfmIK1","Mkgy8iKqhr","azIWpBCxeC","No0QbTCgPp","KsjRKeuZA5","TXQ0Z1v5hH",
+"KZamHQWxoT","o8UydOz8yZ","Rxrsm2Nslm","LDk6fpFrrl","aFFsslsQGo","cL0aE1LB1L","7X3uyGv3Fq","DcpWBulk41","FnPFBKASQ8","LewvMZhwG1",
+"2DREsWmadA","IBe8kRxrsm","zbIYYmz8gx","iqv4kqQxHP","Yw2oU8TxD7","WreyPn8pJ9","Ul4a1CK5W7","lCMxyAmdQd","ThjNnjeskS","WMiS3rKDLJ",
+"Gv3FqZhwG1","SbRYy48cHL","fmIK1DLhzM","8RCUAVIlwP","FnPFB45cIH","UmaEvNcICA","618Diru4UG","KZamHWmadA","EdBKcFPfSE","WreyPVerEA",
+"UmaEv7ku1p","JJs5mv8yFN","U3yw5taOXK","MezSWlsQGo","Ul4a10PktI","lweGyUl4a1","pFrrlCxVEf","3weIFCdyBV","FcWrWFNYIM","CIShGjS1aj",
+"QWxoToGu6x","DcpWBiB08l","LewvM1v5hH","CIShGPb1pa","UmaEvBGaQY","zY1GYwDajX","IBe8kgIYvE","cShY2pAhR1","aL6AJGWqqX","14FLRW3VFH",
+"FFDuiblLA9","lj07QAIYUu","LewvMtl72W","jtn0XlpF6W","BCxeCzQt6Q","4QMc99eoRc","7lUXZB3qem","CNHmvogLgc","x3LDe0BmCy","lweGyKASQ8",
+"QbxXcNo0Qb","6q6L945cIH","JkzUnC2Irc","7hyVvyluBx","dpe1vlsQGo","v1HlnSbRYy","U3yw5VIlwP","lCMxyksJby","vLsmSo8Uyd","ciuWzP6bcg",
+"0ao3l5Namm","uvf7AsuY4x","m4bxUnFqik","hSSvQogLgc","a00b5WreyP","aFFssdQ586","AmdQdpWiOs","45cIHPb1pa","xReecCIShG","5Drn04W0Tl",
+"UlU3M9eoRc","tlILtPYBf4","9iGoTiKqhr","zmLYDzHF1q","s93MlBpYhV","uvf7AECMvU","BGaQYjiVBP","qaofN5Namm","dhSuHVBjhz","bZLvSYf2Ec",
+"Mm8siVprf2","NhXduJXljW","P6bcgMK07Y","uJScX9iGoT","soy9tzz4ZU","ydG8URkQke","uAWypoQ87r","ReKEWtvdkD","07n1cD6rBy","gIYvEuJScX",
+"8cVD3GrDg7","S77LHaez9y","W3VFHJKWYR","s7MxkMm8si","YOfrYOUYuF","m4bxUbgJAz","oGu6xDz1R3","Pb1pahYBCK","y94nwMkgy8","GXdoH8U2nU",
+"Gv3FqtuDyS","W7cTswiHrZ","6AFT05Namm","29QAz4W0Tl","OUqFMXyPZN","8U2nUlj07Q","MmKGJ8FmFH","lweGyC2Irc","v2eC3Kr8ys","IKxdLuAWyp",
+"nFqikgf8rI","wiHrZa00b5","4W0TlMojnP","LbRTH5Drn0","Y1mC0IRh48","55rfB0h1b1","he9IAzY1GY","SWfouHRxd8","AkKTkBGaQY","HzZT829QAz",
+"lViBvThjNn","VNCPdv8yFN","uN6r3MmKGJ","F6PT2qQxHP","gdQsSDLhzM","uoStw9rlg9","wDajXjSjS3","qaofNogLgc","0BmCycL0aE","LDk6fNo0Qb",
+"fcJOyPb1pa","fcwDacShY2","vkCHHK4GS8","FwEJzhSSvQ","wiHrZAkKTk","brhlQL7cGc","JIqXisx5Gl","Ul4a1yvOMI","HzZT8CIShG","uPX7GFcWrW",
+"D6rByYh1hF","2DREstaOXK","5VZjSQnJ1S","Mm8si1v5hH","lkMUAYw2oU","WreyP3weIF","No0Qbrhl0J","Q6hMCBFkb8","cmXIXiwzGk","Yf2EcnFqik",
+"AXpwEcL0aE","wiHrZF6PT2","LDk6fM6qcG","jS1ajcmXIX","2Yz7EHP433","pWiOslj07Q","okgRi0YAGH","wiHrZaDGtS","gtCA5sqVrf","5drc64QMc9",
+"0PktI5Namm","pvgjSjzUqR","Nxx9VAmdQd","HfyNQo8Uyd","KASQ8blLA9","MmKGJUl4a1","4QMc9UmaEv","EdBKc5drc6","bZLvSAgJHQ","aDGtSW3VFH",
+"XyPZNNhXdu","Q6LixW7cTs","rhl0JXyPZN","StlDJ5Mg9r","suY4xFnPFB","F6PT2QbxXc","kB5nPThjNn","rhl0J9rlg9","sx5GlJIqXi","9y4lwPb1pa",
+"zFgtB9GXkX","FnPFB5VZjS","VNCPdpv0i7","WmadAHP433","x3LDeokgRi","uLtKsChuy3","uQIczRBhp0","pAhR1lViBv","pAhR1ThjNn","QChxsQChxs",
+"a00b5wDajX","StlDJMm8si","QWxoTVprf2","zbIYY7lUXZ","Mm8siazIWp","lsQGoGSQwj","AgJHQFPfSE","JKWYRpiJSk","StlDJCp3mZ","rKDLJ580YD",
+"uupzkKASQ8","uZPqgEdBKc","Chuy3gtCA5","5NammfcwDa","xReecAOgEe","fLNg8Oz8yZ","RzaZAjfREu","t98iWSWfou","RkQkeO3iyQ","7X3uyjS1aj",
+"ECMvULewvM","jfREuJKWYR","GrDg72DREs","CxVEfoVQp6","ix74rFPfSE","5drc6FxX9q","9iGoTzHF1q","0BmCyjSjS3","JkzUn7hyVv","FxX9qdhSuH",
+"SbRYyMezSW","lj07QFcWrW","CqqaDW3VFH","lkMUA5nmWv","AgJHQQssNC","5NammyEfy9","Qworu5drc6","AOgEefmIK1","P6bcg5Namm","QWxoTJ2mQi",
+"Uvlv4guMb8","Ul4a1Rxrsm","EdBKcGrDg7","aDGtS2hEEU","taOXK0PktI","iqv4kuLtKs","yEfy924ARF","Y1mC0yEfy9","jzUqRxciqp","2TRI7uupzk",
+"0PktIfcwDa","GrDg707n1c","lweGy4QMc9","dpe1vRpBQm","SmGzvmX2GE","LbRTHWMiS3","FLsphv2eC3","yofH3In3NS","y94nwyluBx","Vprf2ogLgc",
+"5nmWvgdQsS","Dz1R3k85Ae","24ARF7Ow5C","rhl0JLbRTH","wiHrZVNCPd","uupzk2TRI7","kZANmMojnP","ZJTXHRBhp0","GXdoHogLgc","8RCUAfmIK1",
+"tvdkDJIqXi","9rlg9i3pyd","fcwDazz4ZU","s7MxkYh1hF","jS1ajjtn0X","PYBf4prNT6","29QAz64s8N","he9IAS77LH","zmLYDVBjhz","HfyNQbZLvS",
+"aFFssW3VFH","ThjNnM6qcG","D6rByGv3Fq","ulk41M6qcG","WMiS3cL0aE","TXQ0ZQClRL","O3iyQQClRL","JKWYRqUJMd","Dz1R3WaWsv","L7cGcatef2",
+"d85a9NAFuw","9GXkXFGzgp","DLhzMM6qcG","lXFOB07n1c","9rlg9b29RJ","XyPZN24ARF","JJs5mm4bxU","29QAzatef2","MojnPguMb8","suY4xOz8yZ",
+"lViBv9y4lw","AIYUuLDk6f","J2mQiAIYUu","DcpWBo8Uyd","he9IABGaQY","lCMxyiqv4k","soy9t0PktI","BGaQY4W0Tl","h1zcHlkMUA","RBhp0rz7Ut",
+"gtCA50ao3l","gtCA55Drn0","TwanogtCA5","RsQUqKr8ys","5IhmGYf2Ec","EdBKcni2v1","ZuDtD0PktI","sx5GlTa8f6","RpBQmo8Uyd","tuDySAkKTk",
+"5iGN5CIShG","BGaQYsqVrf","IjTwPRmDcr","ciuWz9GXkX","FGzgpvkCHH","fmIK15Namm","i3pydVjCZq","MmsIo618Di","8xEKzciuWz","WreyPx3LDe",
+"S77LHpFrrl","FVMxo2TRI7","gf8rIQClRL","X6PinDcpWB","RxrsmS77LH","EdBKc2ZHdk","gIYvEgdQsS","qQxHPNOHsz","uQIczciuWz","K20wK7X3uy",
+"Z4I1vzQt6Q","vLsmSMmsIo","yofH3ZUnqt","yofH31v5hH","FLsphECMvU","FnPFBFhtgl","azIWpguMb8","G1RhSiqv4k","Cp3mZyvOMI","2TRI7Chuy3",
+"okgRi7fKYU","yvOMIUvlv4","5ZaEz7X3uy","O3iyQhe9IA","UmaEvQbxXc","Zv7z0faHir","K4GS8jzUqR","d7vjM0BmCy","b29RJyluBx","IRh483otm6",
+"yvOMI0BmCy","ReKEWQWxoT","jeskSZhwG1","HfyNQTa8f6","0Kyfsn8pJ9","s4786FVMxo","tAOsrRpBQm","ru4UGGWqqX","LewvMpmeCd","7Ow5CiwzGk",
+"6AFT0OHaBz","n8pJ9Ta8f6","lsQGoNAFuw","dhSuH0BmCy","2hEEUXflUq","WMiS35nmWv","6q6L9KsjRK","mX2GEFNYIM","8RCUA5ZaEz","HlUbFMmKGJ",
+"2DREst98iW","v1Hlna00b5","5drc6VNCPd","RxrsmpWiOs","B3qemcQOnv","Mm8siKr8ys","yofH32ZHdk","v8yFNW7cTs","UlU3McQOnv","K4GS8iqv4k",
+"v2eC3guMb8","Waim6Dz1R3","SjskQYf2Ec","bgJAz0BmCy","OHaBzjiVBP","HRxd8TXQ0Z","b29RJPYBf4","piJSkJJs5m","mX2GEcL0aE","FGzgp2DREs",
+"MK07YfcwDa","faHiroQ87r","FcWrW8TxD7","tlILtVerEA","8FmFHiqv4k","OUYuFVjCZq","tlILtMGlTF","24ARFOz8yZ","8FmFHQ6hMC","okgRiFLsph",
+"b29RJ618Di","faHirBCxeC","fFDrJTa8f6","FGzgp8cVD3","nFqik8FmFH","RACujVNCPd","B3qemuLtKs","RpBQmxciqp","gdQsSpiJSk","8RCUA9rlg9",
+"GWqqX1v5hH","l83UdiKqhr","5Mg9rl83Ud","TwanoQ6hMC","K4GS8pv0i7","48cHLyEfy9","i7WMQrKDLJ","IRh48Ta8f6","sx5GlI7p2a","4dEz629QAz",
+"6q6L95IhmG","RACujDcpWB","WmadAStlDJ","Mm8siVNCPd","Ta8f6Fhtgl","RsQUqqQxHP","FnPFBQbxXc","0ao3l2Yz7E","7fsYMKr8ys","3weIF7X3uy",
+"azIWptuDyS","m4bxUazIWp","soy9tVprf2","VLTy6iKqhr","Z4I1vFjHXR","0MR5XNcICA","580YD8hJdt","MaJQsI7p2a","mz8gxfqypy","aL6AJpiJSk",
+"Pb1paDLhzM","7Ow5CU3yw5","uJScXiKqhr","5IhmG45cIH","ru4UG580YD","S77LHoQ87r","RkQkeOxWIH","uJScXlkMUA","0KyfsAXpwE","qUJMdUvlv4",
+"OHaBzYh1hF","ciuWzX6Pin","FwEJzL7cGc","i3pydsuY4x","zFgtBuoStw","QWxoTyluBx","uN6r3Cp3mZ","QWxoTM6qcG","pvgjS16lHc","v2eC3Yw2oU",
+"Gv3FqVBjhz","Y1mC0AgJHQ","3otm6618Di","1LB1Lfqypy","TCgPp7Ow5C","1v5hHVIlwP","CNHmvfcwDa","JRJQBv2eC3","lXFOBulk41","0BmCyy94nw",
+"LewvM9GXkX","rz7Uts4786","7fKYUZzJHW","vkCHHHfyNQ","PYBf4gf8rI","iqv4kt98iW","ulk41s93Ml","v2eC3gtCA5","kB5nPRzaZA","ThjNnUl4a1",
+"0KyfsJXljW","brhlQpAhR1","Waim6gjUTu","WDVWJVIlwP","Chuy3jfREu","b29RJuQIcz","v8yFNFhtgl","Yh1hF5VZjS","cL0aEfcJOy","CK5W7TXQ0Z",
+"OxWIHb29RJ","m4bxUzFgtB","GWqqXAmdQd","o8Uyd0BmCy","t98iWTXQ0Z","NcICA1LB1L","MmsIo580YD","kB5nPECMvU","LbRTHtuDyS","t59lRlm0pD",
+"CqqaDQClRL","cmXIXLewvM","KZamHpWiOs","S2DfuGv3Fq","W3VFHiB08l","vOqCEqaofN","v1Hlnfqypy","iB08laez9y","ThjNnIjTwP","uAWypgdQsS",
+"StlDJtlILt","zmLYDReKEW","9iGoTzY1GY","tAOsrTXQ0Z","JRJQBAIYUu","618Die6e4z","FjHXRzFgtB","aL6AJ9iGoT","FPfSEoVQp6","RACujK20wK",
+"uZPqglj07Q","he9IAlm0pD","gIYvESWfou","HfyNQKsjRK","GrDg7AXpwE","1LB1L48cHL","CdyBVs7Mxk","IjTwPHRxd8","euZA5SbRYy","ulk41jtn0X",
+"HzZT85drc6","RACujTCgPp","a00b5RpBQm","EoToPFFDui","iB08lRkQke","tvdkDUlU3M","MezSWFhtgl","iqv4k7Ow5C","9y4lwNcICA","Zv7z007n1c",
+"v2eC3lH1kt","LbRTH8xEKz","0MR5XgjUTu","WDVWJhYBCK","zmLYDfcwDa","OUYuFnlaBy","BGaQYqQxHP","CxVEfIKxdL","t59lRhSSvQ","ksJbyFPfSE",
+"cL0aEQClRL","6q6L93weIF","RmDcrjzUqR","FFDuisuY4x","gf8rIJRJQB","fLNg87X3uy","PYBf4i7WMQ","Waim67fKYU","xReecMaJQs","S77LHv1Hln",
+"8xEKzlXFOB","0MR5XVjCZq","Yw2oU5IhmG","AXpwEBbwgA","hUTw7MK07Y","5nmWvDLhzM","CIShGIn3NS","kB5nPAmdQd","ix74r5IhmG","ksJbyhUTw7",
+"xciqpnnP8o","9y4lwHfyNQ","2ZHdkVBjhz","Yw2oUwDajX","t98iWcShY2","QworuOz8yZ","Uvlv48TxD7","euZA5StlDJ","VIlwP5nmWv","S2DfuFPfSE",
+"sqVrfXyPZN","W7cTsFFDui","QClRLP6bcg","brhlQRpBQm","Z4I1vjzUqR","oVQp6Yh1hF","zqH0WO3iyQ","RkQke7lUXZ","JIqXizmLYD","S2DfuHRxd8",
+"5VZjSMaJQs","MaJQsMmKGJ","i7WMQCIShG","Cfgr3WMiS3","0Wr5y9eoRc","5nmWvRmDcr","WreyPyofH3","ogLgclsQGo","yvOMI48cHL","uPX7G4QMc9",
+"16lHculk41","2NslmuQIcz","lViBvfcJOy","dhSuHQWxoT","QChxsx3LDe","FGzgpMmsIo","AIYUun8pJ9","Pb1papT8wu","SbRYyWaim6","Twanot98iW",
+"i7WMQECMvU","he9IAFjHXR","0BmCyoGu6x","n1pmOhE1Ql","PYBf4Mkgy8","LbRTHjiVBP","dpe1voGu6x","4W0TlJXljW","FjHXRaL6AJ","K20wKvOqCE",
+"qaofNgjUTu","3otm6AkKTk","M3zXLKASQ8","RBhp02ZHdk","hE1Ql45cIH","pv0i7l83Ud","lweGyi3pyd","Cfgr3pWiOs","lXFOBK4GS8","8U2nUiwzGk",
+"S2DfuWaWsv","pFrrlpFrrl","AXpwEnFqik","qaofN7ku1p","n8pJ9fmIK1","uoStw7X3uy","JKWYRNo0Qb","bZLvSdjsrv","tAOsrcShY2","VerEA4W0Tl",
+"fqypyFcWrW","VNCPdfcJOy","FFDuiogLgc","uJScXix74r","FNYIMh1zcH","2hEEUv1Hln","POUYSOz8yZ","HRxd8MaJQs","TXQ0ZRmDcr","NAFuwS77LH",
+"9XyT9Ul4a1","okgRini2v1","cQOnv9XyT9","Oz8yZZhwG1","pmeCdlH1kt","RmDcrCxVEf","RACujZ4I1v","CNHmviqv4k","KASQ88xEKz","dQ586AXpwE",
+"2ZHdktl72W","qaofNi7WMQ","suY4x618Di","zFgtBDLhzM","ydG8UzHF1q","e6e4zuvf7A","he9IAk85Ae","14FLRB3qem","M3zXL6q6L9","KZamHjiVBP",
+"zY1GYru4UG","ogLgcgjUTu","wiHrZK20wK","v8yFNtl72W","CqqaDnFqik","NAFuwFwEJz","JJs5mrKDLJ","MmKGJgIYvE","XflUqo8Uyd","AmdQd1v5hH",
+"oQ87rKsjRK","UmaEv6AFT0","i7WMQfFDrJ","4dEz6BFkb8","n1pmOUvlv4","Zv7z0mX2GE","5Mg9r9y4lw","C2IrcyvOMI","WmadAt98iW","uAWyp2TRI7",
+"GrDg7I7p2a","iKqhrFFDui","Uvlv4NhXdu","uupzkuLtKs","QChxs8TxD7","aDGtSFVMxo","WmadAuPX7G","TwanouPX7G","ECMvUhUTw7","k85AeFjHXR",
+"Y1mC0t59lR","dmoS7jSjS3","mz8gxQChxs","qUJMdZzJHW","2TRI7d7vjM","RACujQYxC0","FVMxoSmGzv","Rxrsm55rfB","YjB9ttAOsr","lweGyW3VFH",
+"v8yFNt59lR","29QAz2hEEU","MezSW0PktI","y94nwpmeCd","ZzJHWK4GS8","k85AeHRxd8","fLNg8LbRTH","3otm6StlDJ","n1pmO2DREs","MezSWCp3mZ",
+"VjCZqv2eC3","2hEEUtlILt","7fKYU9XyT9","jSjS3hSSvQ","G1RhSfaHir","Q6LixYjB9t","7fsYMKASQ8","o8UydAOgEe","zFgtBgtCA5","pv0i74dEz6",
+"9XyT9qUJMd","POUYSUmaEv","J2mQivOqCE","cQOnv2Yz7E","uupzkhSSvQ","618Dib29RJ","LDk6f5VZjS","Yf2EcuAWyp","ulk41lj07Q","GXdoH7X3uy",
+"5nmWvuvf7A","YOfrY8RCUA","vLsmSmX2GE","2TRI7CdyBV","jeskSFcWrW","fcwDaLDk6f","55rfBQbxXc","nnP8opFrrl","jSjS36AFT0","vOqCE8xEKz",
+"Vprf28cVD3","ZhwG1DG4sT","Kr8ysrKDLJ","TXQ0ZnFqik","azIWpKZamH","8TxD7mX2GE","VerEAS2Dfu","ogLgcCIShG","MGlTFh1zcH","CxVEfyEfy9",
+"RpBQmkZANm","okgRiQYxC0","SWfouCp3mZ","uPX7Gfqypy","ZuDtDJKWYR","29QAzzqH0W","ZJTXHFFDui","o8UydvkCHH","5drc6NAFuw","uoStw8FmFH",
+"v2eC3v8yFN","v8yFNydG8U","WaWsvtaOXK","X6Pin07n1c","fcwDaPb1pa","gf8rIgf8rI","Cp3mZhe9IA","2DREsI7p2a","8RCUAUl4a1","DLhzMIRh48",
+"7lUXZpAhR1","WreyPfaHir","MGlTFOHaBz","BbwgANo0Qb","Yf2Ec1j5L8","hUTw7580YD","fcwDa4QMc9","HfyNQ9rlg9","s7Mxk8xEKz","WmadAJkzUn",
+"MaJQsrhl0J","zFgtBEOE1o","n1pmOfcJOy","Q6hMCt59lR","NAFuw5ZaEz","QYxC0YOfrY","CdyBVO3iyQ","P6bcgOz8yZ","NOHszn8pJ9","45cIHMaJQs",
+"hYBCK5iGN5","pWiOsOxWIH","uQIczW3VFH","Mm8siLewvM","3otm6VBjhz","lweGyzbIYY","aez9yzQt6Q","jSjS3rhl0J","cShY2yToGW","KZamH0PktI",
+"1LB1LVNCPd","48cHLyofH3","xReecoQ87r","2TRI7dhSuH","blLA9ulk41","QnJ1SNxx9V","vOqCEHlUbF","QClRLoQ87r","CIShGZhwG1","uZPqgpiJSk",
+"o8Uydy94nw","QWxoTZJTXH","BFkb87lUXZ","jS1ajn8pJ9","Pb1payEfy9","Ul4a10ao3l","BFkb8uN6r3","Gv3FqiB08l","prNT6YjB9t","hYBCKcQOnv",
+"9y4lwtjQxs","euZA5lm0pD","FcWrWjfREu","Z4I1vEOE1o","OHaBzrhl0J","8FmFHtuDyS","xReecS2Dfu","OxWIHjzUqR","ksJbyBpYhV","gIYvE5Drn0",
+"ru4UGHlUbF","v1HlnlXFOB","F6PT2BGaQY","lViBvt98iW","cShY2O3iyQ","7fsYMzY1GY","zFgtB3weIF","uZPqgM3zXL","s4786Gv3Fq","qQxHPlpF6W",
+"azIWpXflUq","gf8rINxx9V","K4GS8dmoS7","NAFuw8U2nU","Q6hMCni2v1","5Drn0m4bxU","7X3uyrz7Ut","piJSkt98iW","zY1GY2ZHdk","bZLvSCqqaD",
+"ZzJHWjzUqR","CdyBVCxVEf","HfyNQNAFuw","5Namm5drc6","CqqaDVjCZq","HzZT8uoStw","uJScXPOUYS","G1RhSWMiS3","lj07QIjTwP","fcwDayToGW",
+"DG4sTpAhR1","Chuy3AgJHQ","LbRTHLbRTH","kZANmBCxeC","FhtglVLTy6","6AFT0Yf2Ec","fcwDaS2Dfu","hYBCKEdBKc","VNCPdpvgjS","7lUXZoGu6x",
+"RBhp0Rxrsm","7Ow5CCfgr3","8hJdtqQxHP","Q6Lix8FmFH","cQOnvRpBQm","9iGoTi7WMQ","WMiS3jiVBP","BGaQYTa8f6","QssNCbrhlQ","VBjhzW7cTs",
+"DQimpiwzGk","pv0i7B3qem","v1HlnEOE1o","ru4UGFLsph","RsQUqJXljW","rhl0JuoStw","No0QbUmaEv","cQOnvtvdkD","n8pJ9vkCHH","AmdQdS77LH",
+"uvf7A2Yz7E","uTacx5Namm","MezSWRkQke","CNHmvMaJQs","v2eC37fsYM","VjCZqWPmlx","FnPFBWMiS3","OUYuFatef2","FPfSEQClRL","nFqik0h1b1",
+"okgRiCqqaD","Gv3Fq2Nslm","zbIYYtvdkD","t59lRWaim6","pmeCdciuWz","S2DfutjQxs","HlUbFMm8si","hi5X7ulk41","8TxD7ciuWz","qaofNa00b5",
+"BFkb8AXpwE","lj07QTCgPp","WPmlxSbRYy","dQ586mX2GE","Y1mC0ciuWz","tAOsrGWqqX","ulk41suY4x","blLA9P6bcg","ciuWzMK07Y","NcICAfcJOy",
+"SbRYyRACuj","AkKTkVjCZq","t98iWtvdkD","aDGtSWmadA","DcpWBZhwG1","zbIYYjzUqR","ydG8U1j5L8","UmaEvyofH3","uN6r3atef2","gjUTu7fKYU",
+"8FmFHuJScX","JIqXiRkQke","JKWYRuvf7A","djsrv9iGoT","ru4UGnFqik","Waim6Pb1pa","CdyBVzmLYD","taOXKcQOnv","2Yz7ETa8f6","JRJQBrKDLJ",
+"brhlQHzZT8","fmIK145cIH","LbRTHsuY4x","yofH3JXljW","t98iWyvOMI","taOXKzFgtB","JKWYR7ku1p","uoStwZhwG1","n1pmO9rlg9","7lUXZRsQUq",
+"SbRYyydG8U","S77LHZUnqt","SmGzvoVQp6","jeskSt59lR","xXTI4pmeCd","4QMc9uTacx","GXdoHlkMUA","zz4ZUI7p2a","0PktIG1RhS","kZANmfLNg8",
+"cmXIX7lUXZ","9y4lwCp3mZ","jzUqRaFFss","VNCPdcQOnv","GrDg7VIlwP","6AFT0rKDLJ","ZUnqtuTacx","M6qcGxXTI4","YjB9tCfgr3","ciuWz4W0Tl",
+"5IhmGJJs5m","I7p2a0PktI","Dz1R3yEfy9","aez9yK4GS8","rz7Uta00b5","4dEz6Waim6","pWiOs7fKYU","TwanoDz1R3","AgJHQMmsIo","VIlwPRkQke",
+"ru4UGQworu","F6PT2ix74r","ni2v1AkKTk","XflUqCK5W7","2hEEUix74r","W7cTsRACuj","i7WMQtvdkD","zQt6QWreyP","5drc6HP433","ZUnqtYjB9t",
+"Y1mC0VjCZq","7X3uy4QMc9","brhlQ2TRI7","TwanoXyPZN","WaWsvWmadA","zmLYD5Mg9r","v1Hlni7WMQ","lj07QlpF6W","uTacxgtCA5","8TxD77Ow5C",
+"xXTI4iKqhr","K20wKYjB9t","sqVrfjiVBP","IKxdLpvgjS","BpYhVHzZT8","n1pmOlj07Q","HfyNQMojnP","C2Irc55rfB","oGu6x5VZjS","brhlQru4UG",
+"FwEJzlm0pD","BbwgAjeskS","b29RJRBhp0","2ZHdkaL6AJ","uvf7Av2eC3","UlU3MzqH0W","MGlTFWmadA","ydG8UWmadA","BpYhVm4bxU","RmDcrOUqFM",
+"5Mg9rNxx9V","nlaBy5VZjS","JJs5m580YD","DG4sTbrhlQ","hi5X7EoToP","QClRL8xEKz","618DilsQGo","Pb1paD6rBy","Ul4a1SbRYy","RsQUq7ku1p",
+"oQ87rlViBv","KsjRKMGlTF","0Wr5yRkQke","taOXKtvdkD","gf8rIQYxC0","kZANmMK07Y","Q6LixuLtKs","VNCPdvOqCE","AOgEejSjS3","vLsmS2ZHdk",
+"xciqpt98iW","VNCPdZv7z0","OxWIHZJTXH","M3zXL64s8N","24ARFMK07Y","WPmlxC2Irc","5drc6Oz8yZ","bZLvS0MR5X","Yh1hFJRJQB","s7Mxk7fKYU",
+"rhl0JwiHrZ","k85AegjUTu","gjUTuHfyNQ","FcWrW7ku1p","8FmFHQworu","5nmWvHzZT8","7hyVviwzGk","aFFssmX2GE","d7vjM9rlg9","2DREsuLtKs",
+"IRh48yofH3","IBe8kGSQwj","GXdoHjiVBP","5Nammuvf7A","BGaQYjtn0X","Yw2oU8RCUA","2TRI7vkCHH","tjQxsk85Ae","tjQxsCp3mZ","IjTwPJXljW",
+"48cHLFLsph","b29RJ16lHc","JRJQBs4786","KZamHAmdQd","YOfrYJIqXi","ZzJHWWDVWJ","EdBKcKr8ys","QClRLCIShG","X6PinAgJHQ","y94nwG1RhS",
+"FNYIM2ZHdk","gdQsSFGzgp","jeskS618Di","OxWIHKsjRK","mX2GEHRxd8","5NammdmoS7","nnP8oFxX9q","tuDyS7lUXZ","prNT6e6e4z","tlILt1LB1L",
+"No0Qbn1pmO","mX2GEFjHXR","8TxD7U3yw5","Pb1pasuY4x","2Yz7E0Wr5y","7fsYM45cIH","kB5nPxXTI4","rhl0J1v5hH","lm0pD8U2nU","yEfy9SjskQ",
+"LbRTHRsQUq","NcICAtAOsr","VerEARzaZA","RBhp0FLsph","ogLgcuZPqg","FnPFByEfy9","WPmlxjSjS3","cmXIXPOUYS","zHF1qCIShG","s7Mxk5IhmG",
+"wDajXqUJMd","hE1QlFcWrW","WmadAfcwDa","oQ87rZhwG1","yluBxLbRTH","s4786pFrrl","gjUTuxXTI4","S77LHlH1kt","Twanorhl0J","OxWIHIn3NS",
+"XyPZNjS1aj","cmXIXqQxHP","zmLYDe6e4z","KASQ8aL6AJ","Kr8ysjtn0X","IBe8ke6e4z","pT8wuOHaBz","jtn0XpmeCd","X6PinFPfSE","LewvMnFqik",
+"gjUTuL7cGc","uupzk0MR5X","ix74ryofH3","ReKEWTXQ0Z","d85a9Oz8yZ","QnJ1SSjskQ","9eoRcZuDtD","ZuDtDTCgPp","TwanoNOHsz","XflUqFNYIM",
+"YjB9tBCxeC","QWxoTatef2","suY4xFNYIM","FNYIM9eoRc","0Kyfs2Nslm","hYBCKoGu6x","8xEKzyToGW","n1pmOuJScX","lkMUAFhtgl","aL6AJWMiS3",
+"lsQGoyEfy9","NhXduuN6r3","XyPZN2TRI7","ZhwG1lsQGo","RkQkeGv3Fq","ciuWziqv4k","tAOsra00b5","Zv7z0FFDui","suY4x7X3uy","o8Uyd2Yz7E",
+"OHaBztlILt","a00b5FLsph","VIlwPt98iW","0Wr5y55rfB","mX2GEFcWrW","IBe8kt98iW","s4786fFDrJ","NhXduIjTwP","OxWIH0PktI","MojnP5Mg9r",
+"7ku1pJKWYR","jtn0XHlUbF","zHF1qfmIK1","FxX9qfcwDa","taOXKIBe8k","d7vjM55rfB","NhXduEdBKc","7X3uy2DREs","9iGoTfLNg8","b29RJEOE1o",
+"hSSvQKsjRK","fqypyxReec","JKWYROUqFM","faHirydG8U","gjUTuTwano","GrDg7VNCPd","JJs5mpT8wu","FVMxo4QMc9","LDk6fkB5nP","5iGN5uN6r3",
+"KsjRKTa8f6","ydG8UYw2oU","jiVBPnFqik","SbRYytjQxs","S2DfuZhwG1","DG4sTtAOsr","FVMxoEoToP","uTacxFFDui","LewvMvkCHH","ogLgcqQxHP",
+"6AFT08TxD7","zz4ZUzbIYY","SbRYygf8rI","tuDySCdyBV","GrDg7Nxx9V","XyPZNtvdkD","tl72W55rfB","W7cTsQnJ1S","prNT6FGzgp","nnP8oM6qcG",
+"nFqikWDVWJ","i7WMQFxX9q","QWxoTmz8gx","lpF6WQ6Lix","DG4sTmX2GE","lXFOBuLtKs","6AFT0nlaBy","VBjhzJkzUn","NOHszK4GS8","tuDyS4QMc9",
+"FPfSEzFgtB","cL0aEfcwDa","soy9tfcJOy","tuDySrz7Ut","Ul4a1iB08l","P6bcge6e4z","D6rByPb1pa","O3iyQix74r","618DiOHaBz","tjQxsQbxXc",
+"gdQsS5iGN5","vkCHHBpYhV","zQt6QJRJQB","Yh1hF5iGN5","gIYvE0YAGH","fcwDaXflUq","tuDySIRh48","7X3uyVprf2","fcJOyFnPFB","qaofN14FLR",
+"StlDJLDk6f","dQ586VIlwP","HRxd8d85a9","RBhp0AmdQd","Ss0ZuZv7z0","Chuy3CK5W7","b29RJKsjRK","pv0i7AOgEe","5ZaEzWaWsv","jfREutvdkD",
+"aDGtS4W0Tl","UlU3MMm8si","0YAGHEoToP","sx5GlnFqik","xXTI4sqVrf","StlDJVNCPd","GSQwjgtCA5","PYBf48U2nU","I7p2axciqp","FLsph9XyT9",
+"2DREsxciqp","pAhR1zQt6Q","iwzGkZUnqt","5drc6NOHsz","bgJAzIRh48","yofH3D6rBy","W3VFHpv0i7","5NammQssNC","zz4ZU2DREs","aDGtSGv3Fq",
+"VBjhzFPfSE","2TRI7jiVBP","SmGzvFNYIM","ciuWzL7cGc","QworuzqH0W","Cfgr3RBhp0","hUTw7ReKEW","yofH3h1zcH","4dEz6618Di","fqypyBFkb8",
+"FLsph64s8N","K20wKNxx9V","RxrsmLDk6f","s93Ml2hEEU","8xEKzXyPZN","piJSkhSSvQ","6q6L907n1c","lCMxy8cVD3","o8UydL7cGc","qQxHPtjQxs",
+"SmGzvHfyNQ","07n1cblLA9","2hEEUMm8si","HP433fLNg8","RACujBGaQY","FNYIMSmGzv","FVMxofFDrJ","8xEKzhe9IA","x3LDeAOgEe","Yf2Ec7fsYM",
+"yvOMI24ARF","x3LDeRzaZA","gf8rIMK07Y","HlUbFbgJAz","s4786uAWyp","2hEEUO3iyQ","SWfouuZPqg","9y4lwcmXIX","55rfBCIShG","m4bxUOHaBz",
+"K20wKGSQwj","WreyPlCMxy","3weIFNOHsz","JJs5maez9y","AXpwETwano","YjB9tQWxoT","DLhzMzmLYD","rhl0Jhe9IA","2DREsAOgEe","QnJ1SRBhp0",
+"tlILtVIlwP","ksJbyQworu","fcJOypvgjS","pWiOsgdQsS","WMiS3i7WMQ","MezSWqaofN","0Wr5yY1mC0","aez9ySs0Zu","AIYUufaHir","jS1ajLbRTH",
+"DG4sTazIWp","pmeCdrz7Ut","2NslmFPfSE","lkMUAi3pyd","HlUbFgtCA5","QssNC1v5hH","cL0aEx3LDe","2DREsFhtgl","Waim62Yz7E","SbRYyXflUq",
+"5Drn0zFgtB","TCgPpsx5Gl","lCMxyuQIcz","m4bxUbrhlQ","CdyBVjfREu","iqv4kIBe8k","jiVBPRBhp0","QworulkMUA","uAWypMmKGJ","4dEz6WPmlx",
+"kZANmy94nw","RACujcL0aE","VIlwPK4GS8","XflUqzQt6Q","QYxC0580YD","uupzk8TxD7","lm0pDCdyBV","KZamHzbIYY","0KyfsFVMxo","MojnPaez9y",
+"Vprf2jiVBP","Dz1R38cVD3","pWiOsFFDui","RkQkeo8Uyd","v8yFNnFqik","t59lRgjUTu","7X3uyMmsIo","TwanovkCHH","gtCA5XflUq","MaJQsYjB9t",
+"soy9tlj07Q","ThjNntaOXK","8TxD7euZA5","8cVD3jS1aj","GXdoHJkzUn","zbIYYoGu6x","Z4I1vRzaZA","wiHrZFFDui","cmXIXi7WMQ","5Nammjtn0X",
+"pvgjSlweGy","TwanoSbRYy","Yf2EcFPfSE","1v5hHcmXIX","MmKGJqaofN","2Yz7ESjskQ","WMiS3YOfrY","5nmWvX6Pin","WDVWJYjB9t","55rfB1v5hH",
+"k85AeuoStw","uN6r3VIlwP","RmDcrcL0aE","Qworun8pJ9","gdQsStlILt","uupzkciuWz","OUYuFMm8si","K4GS8gdQsS","Zv7z0fcwDa","NOHszzmLYD",
+"POUYS5VZjS","h1zcHM3zXL","jiVBPOz8yZ","7fKYUdjsrv","prNT6cShY2","pAhR1tl72W","Zv7z07X3uy","WDVWJb29RJ","OUYuFhE1Ql","RBhp0lCMxy",
+"AgJHQWmadA","9rlg9fqypy","pAhR1MK07Y","lweGysoy9t","618Di2hEEU","DLhzMxciqp","hSSvQaDGtS","ulk41BCxeC","e6e4zAgJHQ","Waim65Drn0",
+"FxX9qReKEW","0MR5XOHaBz","s7MxkzY1GY","jeskSDQimp","DcpWBpT8wu","Gv3FqAmdQd","prNT6QssNC","brhlQRBhp0","2ZHdkWaim6","B3qemCfgr3",
+"lj07QhSSvQ","0PktIS77LH","fmIK1jfREu","oGu6xlkMUA","Nxx9VEOE1o","ni2v1euZA5","pAhR13weIF","vOqCElm0pD","v8yFNI7p2a","2ZHdkdjsrv",
+"BCxeC0YAGH","rKDLJoQ87r","TCgPpIBe8k","GWqqXiwzGk","O3iyQCIShG","yvOMI3weIF","RBhp05ZaEz","S2Dfu5Drn0","8U2nU3otm6","0ao3lru4UG",
+"pmeCdlsQGo","2DREshUTw7","24ARFAOgEe","TCgPpX6Pin","Cp3mZZ4I1v","MK07YVIlwP","L7cGcOxWIH","tAOsrv1Hln","zQt6QZUnqt","Yw2oUKASQ8",
+"gjUTuYOfrY","RkQkeQbxXc","qUJMdQChxs","hE1QlqUJMd","BbwgAFcWrW","lViBvpiJSk","ZJTXHydG8U","MaJQsWaim6","Rxrsm14FLR","uZPqgs93Ml",
+"WPmlxSmGzv","y94nwGv3Fq","qQxHPG1RhS","YjB9t0Kyfs","oQ87ruPX7G","hi5X716lHc","BpYhV2DREs","0YAGHZ4I1v","5ZaEzGXdoH","cL0aEpWiOs",
+"0MR5XBFkb8","IRh48zY1GY","yToGW5ZaEz","FPfSE29QAz","DLhzMMezSW","IKxdLOHaBz","FLsphB3qem","iwzGkM3zXL","7lUXZRBhp0","UmaEv4W0Tl",
+"MK07YiwzGk","G1RhSjfREu","pWiOs618Di","S77LHqQxHP","jzUqRhi5X7","e6e4z7lUXZ","5Namm0h1b1","dQ586ogLgc","RxrsmM3zXL","P6bcgqaofN",
+"n8pJ9vOqCE","PYBf4dhSuH","J2mQiZhwG1","O3iyQTCgPp","azIWpRACuj","oVQp6oGu6x","RBhp0Ss0Zu","0MR5XLbRTH","gdQsS5nmWv","4QMc9fmIK1",
+"No0QbECMvU","uZPqg2Yz7E","ni2v12Nslm","BCxeCQnJ1S","MmsIoAmdQd","lweGybgJAz","piJSkAkKTk","7X3uyxXTI4","fFDrJ3weIF","BFkb8cmXIX",
+"kZANmaFFss","RACuji7WMQ","0YAGH3otm6","QnJ1SsuY4x","yluBxQworu","FhtglX6Pin","v1HlnReKEW","FhtglChuy3","uLtKss93Ml","8RCUACdyBV",
+"CIShGpmeCd","GSQwjJkzUn","5IhmGVjCZq","4W0TlvkCHH","iB08lJ2mQi","9XyT9CxVEf","jfREufcwDa","16lHcfFDrJ","QworuprNT6","M3zXLAgJHQ",
+"uJScX8xEKz","8cVD38hJdt","QworuTXQ0Z","RBhp048cHL","FnPFBXflUq","X6PinOz8yZ","YOfrYpmeCd","5Drn0zHF1q","8hJdtK4GS8","Mm8si5ZaEz",
+"b29RJuPX7G","jfREufaHir","djsrvtaOXK","I7p2aCqqaD","sqVrfqQxHP","tlILtjfREu","Yf2EclXFOB","nFqikpv0i7","ThjNnfcwDa","W3VFHni2v1",
+"rz7Utlj07Q","F6PT2FnPFB","TwanoF6PT2","8cVD3G1RhS","3otm6fcJOy","xReecLbRTH","fqypyYf2Ec","9XyT9BCxeC","BFkb8DcpWB","pWiOsVLTy6",
+"VBjhzVprf2","8U2nU55rfB","FxX9qjeskS","brhlQtuDyS","Uvlv4rhl0J","zqH0WVjCZq","xReeci7WMQ","CNHmvUl4a1","45cIH0Wr5y","Y1mC0uPX7G",
+"Q6LixBGaQY","zz4ZUBbwgA","pvgjSBpYhV","jeskSVprf2","RpBQmkB5nP","cShY2J2mQi","0h1b11j5L8","Nxx9VQ6Lix","yluBx2Nslm","pAhR1xciqp",
+"h1zcHzY1GY","24ARFQWxoT","SmGzvpmeCd","PYBf45IhmG","y94nwzHF1q","KZamHBbwgA","ydG8ULDk6f","0KyfsRxrsm","ZUnqtFPfSE","AmdQdzmLYD",
+"ZUnqtHzZT8","5nmWvOxWIH","fmIK1Pb1pa","QChxspWiOs","fmIK1M6qcG","ZJTXHYjB9t","K4GS84QMc9","s4786pAhR1","45cIHK4GS8","EoToP2hEEU",
+"In3NSIn3NS","o8Uydd7vjM","1v5hHokgRi","zFgtBCdyBV","NOHszzQt6Q","RmDcr9iGoT","pmeCdqUJMd","KsjRKG1RhS","zqH0WLewvM","ru4UGKASQ8",
+"No0QbMGlTF","BbwgAksJby","RkQkeYw2oU","MojnPPYBf4","pv0i7azIWp","5Mg9rt98iW","5IhmGZUnqt","WDVWJEOE1o","2TRI724ARF","ix74rQWxoT",
+"MmKGJSmGzv","yluBxAIYUu","FwEJzzqH0W","VjCZqiwzGk","8RCUAqQxHP","2TRI7o8Uyd","7X3uy5drc6","yluBxksJby","NAFuwuN6r3","Vprf2ECMvU",
+"yEfy9OUYuF","rKDLJ7X3uy","Mkgy8Dz1R3","FwEJzHzZT8","RACujqUJMd","0MR5XQ6hMC","AgJHQru4UG","2TRI755rfB","0KyfsfLNg8","jSjS3DG4sT",
+"Pb1pagjUTu","0YAGHrz7Ut","NcICA5nmWv","jS1ajrhl0J","ru4UGAkKTk","5drc6bZLvS","3otm6FPfSE","6AFT0Y1mC0","JJs5m0Wr5y","JkzUnDG4sT",
+"RBhp0LbRTH","WreyPQ6Lix","HfyNQ16lHc","MaJQsogLgc","fFDrJFFDui","zmLYDdQ586","gtCA5ZhwG1","ReKEW9rlg9","5Drn0JJs5m","K20wKQ6hMC",
+"Zv7z0YjB9t","2NslmSWfou","VIlwPs93Ml","v1HlnGv3Fq","QClRLjtn0X","Ul4a1Q6Lix","t59lRAIYUu","I7p2a7Ow5C","Z4I1vYw2oU","Oz8yZ16lHc",
+"zz4ZU6AFT0","BbwgAMmKGJ","cmXIXVprf2","nFqikJIqXi","QClRLMmKGJ","DQimpfcwDa","i3pydcL0aE","LewvMBCxeC","VNCPdzY1GY","zFgtBpv0i7",
+"TXQ0Zxciqp","9GXkX0YAGH","B3qemQ6Lix","FPfSEdhSuH","FVMxoh1zcH","MmsIotaOXK","zQt6QtvdkD","faHirC2Irc","blLA9lweGy","580YDBpYhV",
+"aL6AJLbRTH","fqypyQworu","5Drn0NhXdu","uJScX9eoRc","cL0aEJkzUn","zbIYYeuZA5","atef24dEz6","Zv7z0lweGy","cL0aEt98iW","lCMxyyToGW",
+"WDVWJW3VFH","Z4I1v0MR5X","L7cGc7fKYU","pFrrlv2eC3","BFkb8CqqaD","RxrsmVIlwP","Vprf2RzaZA","SmGzv5Drn0","45cIHUlU3M","VIlwPaez9y",
+"Ss0ZuzFgtB","24ARFMaJQs","iwzGkdpe1v","hi5X7VerEA","pmeCd1v5hH","4QMc9xciqp","fmIK1Gv3Fq","RmDcrF6PT2","BbwgA7lUXZ","24ARFazIWp",
+"cmXIXlH1kt","uPX7G5ZaEz","K4GS8qUJMd","FxX9qZzJHW","djsrvogLgc","KASQ8v8yFN","F6PT2AXpwE","MmKGJlXFOB","2ZHdklweGy","aL6AJx3LDe",
+"xXTI40MR5X","WPmlxK20wK","RmDcrn8pJ9","RmDcr5VZjS","DG4sTYw2oU","Ul4a1lH1kt","48cHLNhXdu","blLA9M6qcG","UlU3MvOqCE","xXTI4suY4x",
+"bZLvSFNYIM","WPmlxSWfou","9XyT9euZA5","uupzkqaofN","QbxXcWaWsv","FxX9q45cIH","ZzJHWGXdoH","TXQ0Zni2v1","K20wKpmeCd","7ku1p0h1b1",
+"IBe8kNcICA","vOqCE0Wr5y","1LB1LydG8U","SjskQTa8f6","07n1cQbxXc","aL6AJJkzUn","FjHXRpAhR1","i7WMQCfgr3","Y1mC0TXQ0Z","fqypy5iGN5",
+"zqH0WiB08l","QWxoTEOE1o","Dz1R3NOHsz","XflUqgIYvE","Ul4a1WPmlx","SmGzvjiVBP","dmoS7XyPZN","oVQp6e6e4z","zQt6QaFFss","DLhzMn8pJ9",
+"580YDCxVEf","JXljWpvgjS","S2DfujzUqR","rKDLJYjB9t","YOfrYxReec","4dEz62DREs","MmKGJ4QMc9","9rlg9fLNg8","3weIFFNYIM","Pb1paKr8ys",
+"Chuy3RkQke","vOqCEKASQ8","Nxx9VksJby","9XyT9IRh48","i7WMQK20wK","P6bcgFGzgp","d7vjMgIYvE","1LB1LMaJQs","RzaZArz7Ut","ciuWz7lUXZ",
+"NhXdutAOsr","OHaBzxciqp","NOHsznlaBy","FcWrWAXpwE","OHaBzS2Dfu","7hyVvQworu","FVMxoOxWIH","tuDySTa8f6","rKDLJAkKTk","0Wr5yVIlwP",
+"jSjS3gdQsS","kZANmd85a9","7Ow5C0Kyfs","K4GS8Y1mC0","07n1cHzZT8","ksJbyxReec","NAFuwThjNn","14FLRIRh48","hYBCKfmIK1","4QMc9zQt6Q",
+"t59lR9iGoT","29QAz3weIF","GrDg7FNYIM","9eoRcDcpWB","0MR5XlpF6W","TCgPpgdQsS","uQIczpAhR1","JIqXi2hEEU","vkCHHNAFuw","blLA9i7WMQ",
+"0h1b1ZUnqt","YOfrYdQ586","wDajXtaOXK","a00b5BbwgA","5Drn0M3zXL","Yf2EcYw2oU","gjUTu7X3uy","HzZT8EoToP","IBe8klpF6W","QYxC0Oz8yZ",
+"Cp3mZNAFuw","yToGWhUTw7","2NslmY1mC0","lj07Qxciqp","FPfSEuQIcz","LewvMn8pJ9","ZUnqtoVQp6","5nmWvni2v1","zz4ZUJkzUn","0Wr5yni2v1",
+"FLsph618Di","Pb1paaez9y","GXdoHciuWz","tl72WfaHir","sx5GlG1RhS","Nxx9V4W0Tl","JKWYRSjskQ","ksJbyazIWp","lViBvlkMUA","HlUbFRmDcr",
+"L7cGcReKEW","0PktIVNCPd","F6PT2Uvlv4","uJScXDcpWB","5iGN5M3zXL","uoStwuTacx","guMb8No0Qb","Cfgr3VIlwP","O3iyQjiVBP","n1pmOBbwgA",
+"RBhp055rfB","soy9tzqH0W","RmDcrRsQUq","QnJ1S9XyT9","Waim68U2nU","zz4ZUPOUYS","POUYSlCMxy","uupzkwDajX","7fsYM9rlg9","a00b5OHaBz",
+"tlILt0h1b1","5Mg9rGXdoH","7lUXZJXljW","16lHcIKxdL","QWxoTzQt6Q","UlU3Mv1Hln","y94nwkB5nP","ydG8UlweGy","6q6L9n8pJ9","xXTI4bZLvS",
+"HlUbFPb1pa","BFkb8hYBCK","n1pmOdQ586","MojnPiqv4k","OUqFMOUYuF","v2eC3k85Ae","i3pydCK5W7","Z4I1vulk41","WmadAyvOMI","2Yz7EokgRi",
+"0ao3l9eoRc","yToGWRsQUq","X6PinuoStw","yvOMIWMiS3","HfyNQvOqCE","45cIHD6rBy","MmKGJCdyBV","qaofNhE1Ql","ulk41FVMxo","nFqikQ6hMC",
+"7X3uyRzaZA","24ARFhUTw7","QworujiVBP","F6PT2lsQGo","yToGW7hyVv","gdQsSzqH0W","uupzkNAFuw","cQOnvlpF6W","5Drn0fcwDa","sqVrfgjUTu",
+"zQt6QfcwDa","pWiOsXyPZN","FjHXRuJScX","ZzJHWpFrrl","2DREsO3iyQ","FcWrWpT8wu","cL0aE55rfB","7X3uyWDVWJ","zHF1qTwano","n8pJ9yofH3",
+"PYBf4aFFss","GrDg7sx5Gl","Ul4a1GSQwj","FPfSEYf2Ec","Mkgy8WDVWJ","RpBQmazIWp","AXpwE4W0Tl","lsQGoyluBx","Y1mC0jtn0X","QClRLCfgr3",
+"faHir618Di","X6Pin8RCUA","VIlwPgtCA5","taOXKrKDLJ","RzaZA29QAz","5nmWv4QMc9","NcICAaFFss","tvdkD5Mg9r","3otm65nmWv","o8UyduZPqg",
+"RzaZA1j5L8","zbIYY14FLR","WDVWJUlU3M","soy9t5Mg9r","0PktIJRJQB","hi5X7JIqXi","zqH0WokgRi","hYBCKnlaBy","dmoS7NOHsz","24ARFFcWrW",
+"MaJQs3otm6","ix74rDG4sT","UmaEvdjsrv","jS1ajHfyNQ","DcpWBECMvU","BFkb8VBjhz","rz7UtOUYuF","fLNg8JKWYR","piJSkZhwG1","Z4I1vWmadA",
+"uAWyp8FmFH","J2mQiW3VFH","t59lRXyPZN","4dEz6D6rBy","AgJHQ7X3uy","zQt6Q48cHL","QWxoT5Drn0","nnP8oHP433","y94nwWDVWJ","FxX9qOHaBz",
+"uPX7GVerEA","jSjS3mX2GE","7X3uyY1mC0","JkzUnVjCZq","AXpwEBGaQY","45cIHokgRi","e6e4zzFgtB","mz8gxGXdoH","WDVWJZuDtD","JkzUn9y4lw",
+"OUYuFlweGy","cL0aEGv3Fq","RpBQmRxrsm","t59lRPYBf4","0KyfsfaHir","U3yw5Mkgy8","MaJQsWMiS3","MmsIoD6rBy","29QAz8RCUA","2Nslmsoy9t",
+"KASQ8uQIcz","2TRI7WaWsv","sqVrfIRh48","fmIK15Mg9r","uQIczrz7Ut","B3qempWiOs","VerEAjzUqR","2TRI73weIF","uoStwprNT6","In3NS8FmFH",
+"9XyT97ku1p","nnP8oYOfrY","WMiS3lH1kt","G1RhSBbwgA","HfyNQRzaZA","lCMxyRzaZA","qaofNStlDJ","2NslmKsjRK","I7p2aBCxeC","cShY2jfREu",
+"lH1ktCxVEf","cQOnvzFgtB","MezSWZuDtD","ZUnqtL7cGc","Z4I1vjeskS","vLsmSn1pmO","07n1cxReec","0Wr5y1v5hH","taOXKiqv4k","29QAzUlU3M",
+"G1RhSuJScX","JRJQBuvf7A","1j5L8StlDJ","uLtKsJKWYR","9y4lwzY1GY","JXljWGXdoH","OHaBzfcwDa","aez9yG1RhS","fFDrJYh1hF","prNT68cVD3",
+"B3qemVBjhz","yluBxjzUqR","0Wr5yQYxC0","NOHszRACuj","fcJOyaez9y","IRh48RsQUq","QWxoTMkgy8","uLtKsvOqCE","QChxs8hJdt","16lHcJKWYR",
+"xciqpd7vjM","5VZjSWmadA","Ss0ZuRsQUq","iB08lTa8f6","prNT6U3yw5","lCMxy3weIF","1j5L8AXpwE","jeskSHRxd8","0h1b10BmCy","WMiS3MezSW",
+"uQIcz8cVD3","euZA50Kyfs","XyPZNCp3mZ","BbwgANhXdu","dpe1vCp3mZ","GWqqXv8yFN","FNYIM5ZaEz","6q6L9aFFss","ECMvUHfyNQ","FLsphMK07Y",
+"NAFuwo8Uyd","faHirMkgy8","yEfy9Y1mC0","piJSks93Ml","ECMvU9GXkX","MezSWGrDg7","x3LDeFVMxo","h1zcHCdyBV","MGlTFMezSW","HRxd8v8yFN",
+"uPX7GbZLvS","Waim6xXTI4","3otm6iqv4k","2NslmzQt6Q","tuDyScShY2","ksJby8cVD3","3weIF8RCUA","7fKYU5Namm","uZPqgvkCHH","ulk41cL0aE",
+"QssNC0h1b1","rz7UtBGaQY","07n1clm0pD","gjUTuy94nw","rKDLJSs0Zu","6q6L9RkQke","618DiEOE1o","0BmCyhSSvQ","aFFss4W0Tl","Cfgr3FLsph",
+"MGlTFCdyBV","e6e4z2Yz7E","0PktIsuY4x","d7vjMZJTXH","W3VFHcQOnv","blLA9lj07Q","ThjNnRACuj","hYBCK7Ow5C","DG4sTfcJOy","lsQGos7Mxk",
+"9rlg9MmKGJ","WmadA1v5hH","uvf7ApT8wu","5ZaEzFwEJz","zHF1qDz1R3","UlU3MLDk6f","7ku1pY1mC0","pWiOspFrrl","AkKTkcmXIX","WPmlxksJby",
+"2hEEUi7WMQ","64s8NHRxd8","MmKGJfmIK1","JIqXiMmsIo","iB08ltuDyS","SbRYyKr8ys","OUYuFfcwDa","EdBKcNOHsz","ZuDtDogLgc","FcWrW2hEEU",
+"0PktIgf8rI","XflUq8RCUA","gIYvEtlILt","GXdoHe6e4z","OxWIH5Drn0","0PktISbRYy","BpYhVlj07Q","RpBQmb29RJ","yEfy9lXFOB","a00b5ZUnqt",
+"aDGtSh1zcH","FGzgpfcwDa","BGaQYIn3NS","piJSkrhl0J","tjQxs0YAGH","uvf7AuoStw","sx5GlDG4sT","aez9yazIWp","uQIczbZLvS","Z4I1vQChxs",
+"BFkb8atef2","uoStwChuy3","uJScXKsjRK","EOE1oChuy3","1j5L8RmDcr","oQ87rBCxeC","uLtKsF6PT2","n8pJ9Twano","WaWsvyEfy9","4dEz6JJs5m",
+"QbxXcRpBQm","8xEKzpv0i7","zY1GYuoStw","m4bxUZv7z0","TwanoKsjRK","48cHLGv3Fq","64s8N580YD","RACujxXTI4","WDVWJxXTI4","yluBxpAhR1",
+"9y4lwtl72W","nnP8o0Kyfs","14FLRMezSW","PYBf4qQxHP","Uvlv4yluBx","1v5hHJRJQB","5Nammb29RJ","pmeCdVLTy6","FPfSEQWxoT","Oz8yZpmeCd",
+"8U2nUuAWyp","8TxD7MK07Y","1j5L8rz7Ut","07n1czQt6Q","MmKGJl83Ud","AkKTkrz7Ut","s93MlLDk6f","MmKGJjSjS3","sqVrfZv7z0","uvf7AzY1GY",
+"IRh48gtCA5","1j5L8v2eC3","i3pydM3zXL","ulk41QnJ1S","jS1ajgtCA5","1v5hHFLsph","SbRYy14FLR","EoToPrKDLJ","euZA5lViBv","4dEz6pvgjS",
+"D6rBy5VZjS","hYBCK5IhmG","RmDcrydG8U","LewvMuupzk","2TRI72Yz7E","tjQxs5IhmG","Nxx9VW3VFH","3otm6b29RJ","pFrrllkMUA","BFkb8tAOsr",
+"wiHrZcQOnv","pWiOsZ4I1v","lXFOB2Yz7E","PYBf4IRh48","prNT6WDVWJ","XflUqSmGzv","JJs5mCK5W7","Cp3mZn1pmO","bgJAzC2Irc","TCgPp6q6L9",
+"cmXIXUlU3M","gf8rIMm8si","BbwgAkB5nP","QClRLoGu6x","uvf7ACdyBV","7fsYMMmKGJ","LDk6fdmoS7","VjCZqReKEW","EOE1oxReec","L7cGcM3zXL",
+"v2eC3X6Pin","X6PinxReec","HlUbFiwzGk","jeskSKASQ8","xciqptl72W","Nxx9VIBe8k","1v5hH8hJdt","qaofNrz7Ut","HfyNQLbRTH","5IhmGdhSuH",
+"9iGoTCNHmv","kB5nPAgJHQ","0YAGHIBe8k","rhl0JJKWYR","AgJHQWaWsv","pvgjSlCMxy","0Wr5yKsjRK","uN6r38hJdt","CK5W7D6rBy","QYxC0Ss0Zu",
+"jeskSdQ586","7Ow5C580YD","Q6Lixn8pJ9","2NslmBCxeC","J2mQiCK5W7","KZamHLbRTH","rz7UtokgRi","GrDg72TRI7","nnP8oCxVEf","t59lRvLsmS",
+"suY4xCdyBV","RBhp0U3yw5","lsQGoJIqXi","KASQ8jS1aj","gf8rIxReec","iqv4ks7Mxk","zz4ZUZ4I1v","55rfBhe9IA","L7cGc0PktI","F6PT2uTacx",
+"9rlg9n8pJ9","hYBCKix74r","TCgPpaFFss","BFkb87Ow5C","1v5hH7ku1p","jSjS3tvdkD","6AFT0v1Hln","KsjRKksJby","GXdoHQClRL","v2eC35ZaEz",
+"pvgjSO3iyQ","AkKTkZzJHW","v8yFN1LB1L","ThjNnAOgEe","v8yFNL7cGc","XflUqcQOnv","Yw2oU9eoRc","MK07YpvgjS","lH1kt618Di","ru4UGyEfy9",
+"POUYS8FmFH","NOHszlkMUA","cQOnv5iGN5","tAOsrOHaBz","StlDJ5Namm","AIYUu7X3uy","618DijiVBP","0Wr5yNAFuw","yEfy9prNT6","In3NSL7cGc",
+"CNHmvzFgtB","tjQxsCdyBV","djsrvdhSuH","BbwgAgjUTu","tAOsrJRJQB","HzZT8WaWsv","mz8gxmX2GE","kB5nPNhXdu","WMiS3yvOMI","5IhmGK20wK",
+"uZPqgulk41","atef2TXQ0Z","Rxrsm8hJdt","zmLYDVerEA","dmoS7d7vjM","5VZjSO3iyQ","WMiS3FxX9q","faHirTwano","Waim6fqypy","d85a964s8N",
+"aez9yCK5W7","QClRLTa8f6","fcJOyGXdoH","fFDrJFVMxo","8xEKziqv4k","Zv7z0kZANm","xReec5ZaEz","TCgPprKDLJ","o8Uyd0ao3l","djsrvUvlv4",
+"2hEEUzHF1q","OUqFM4W0Tl","B3qemAmdQd","WaWsvIRh48","uLtKs9rlg9","B3qemv2eC3","xReecciuWz","5drc6pv0i7","NcICAFNYIM","ZuDtDQ6hMC",
+"FFDuixReec","1v5hHRBhp0","Kr8ysQChxs","S77LHblLA9","uQIcz0YAGH","dpe1v7fKYU","JRJQBk85Ae","AmdQdYw2oU","7fKYUi7WMQ","RzaZASWfou",
+"fqypynFqik","QssNCC2Irc","gf8rIi3pyd","lj07Qm4bxU","O3iyQkB5nP","qUJMdfcJOy","v8yFNrhl0J","kZANm8FmFH","POUYSpv0i7","BGaQYCxVEf",
+"jeskS6AFT0","FFDuiZzJHW","0h1b1AkKTk","ZUnqteuZA5","2Yz7EtaOXK","M6qcGFGzgp","yluBxqQxHP","aDGtSF6PT2","UmaEvJRJQB","vLsmSydG8U",
+"POUYSOUYuF","618DiVIlwP","Zv7z0M3zXL","t98iWFNYIM","No0QbWaim6","ReKEWRxrsm","Uvlv42hEEU","Pb1pa8hJdt","FLsphnlaBy","zqH0WnnP8o",
+"5Namm07n1c","zbIYYuZPqg","v2eC3CqqaD","cShY2lweGy","J2mQi8hJdt","4W0Tl7ku1p","ciuWzNcICA","AOgEeMK07Y","BFkb8uZPqg","euZA5guMb8",
+"5VZjSaez9y","RmDcrzbIYY","sx5Gl3weIF","bgJAz1v5hH","gIYvEjSjS3","SWfouAkKTk","mz8gxoQ87r","tuDySjSjS3","HlUbFZUnqt","bZLvSRzaZA",
+"s7MxkOUYuF","tjQxs2Yz7E","MmKGJY1mC0","AgJHQXflUq","suY4xRxrsm","tjQxsTXQ0Z","07n1cEOE1o","hE1Ql14FLR","faHirjS1aj","tAOsrd85a9",
+"uZPqg9eoRc","i7WMQuZPqg","4QMc9NhXdu","ZzJHWFnPFB","MK07YksJby","8cVD3euZA5","K20wKZhwG1","dQ586WmadA","8U2nUzbIYY","3otm68U2nU",
+"618Di7fKYU","pFrrlk85Ae","pAhR12Nslm","hYBCKbrhlQ","YjB9t48cHL","FnPFBX6Pin","EOE1oydG8U","I7p2aYh1hF","SbRYyd85a9","azIWpYw2oU",
+"EoToPQworu","Pb1pax3LDe","WPmlxWPmlx","VLTy6FNYIM","fqypy9iGoT","F6PT2jfREu","ni2v155rfB","wiHrZVLTy6","lm0pDdhSuH","a00b5b29RJ",
+"Q6LixRpBQm","qUJMdFxX9q","cL0aEzmLYD","F6PT2uPX7G","EdBKcF6PT2","F6PT2IjTwP","EOE1oksJby","8U2nUydG8U","a00b564s8N","cmXIXReKEW",
+"G1RhSJXljW","lm0pDpWiOs","rz7Utd85a9","jSjS32Yz7E","rhl0Jrz7Ut","cQOnvn1pmO","4dEz6yToGW","hSSvQyvOMI","MmsIo16lHc","618DiprNT6",
+"S77LH3otm6","RzaZA618Di","MezSWC2Irc","MmsIotuDyS","prNT6pmeCd","TCgPpuoStw","RxrsmWPmlx","Vprf26AFT0","CqqaDSjskQ","FjHXRSs0Zu",
+"DcpWBWDVWJ","2DREso8Uyd","LbRTHoVQp6","FnPFB7fsYM","Kr8ys14FLR","guMb8HlUbF","zHF1qdmoS7","DLhzMjSjS3","cQOnvpiJSk","tvdkDIRh48",
+"prNT6d85a9","pT8wuAOgEe","29QAzlweGy","sqVrfQnJ1S","FxX9qsuY4x","QssNClCMxy","O3iyQvkCHH","pT8wurz7Ut","TwanoKASQ8","9XyT9JKWYR",
+"L7cGcK20wK","hUTw7qaofN","hYBCKBGaQY","d7vjM0Kyfs","qQxHP07n1c","CdyBVgjUTu","8TxD7GSQwj","he9IA8xEKz","hSSvQ0Kyfs","GrDg7ulk41",
+"uupzkrz7Ut","jeskSSmGzv","WMiS35Mg9r","8TxD7pmeCd","fcwDasuY4x","2hEEUfaHir","lsQGoMojnP","zQt6QFGzgp","QWxoTB3qem","GXdoHl83Ud",
+"UlU3MuZPqg","FjHXR7fsYM","piJSkwDajX","yEfy9TXQ0Z","uN6r3vOqCE","guMb89eoRc","Yw2oUVNCPd","ECMvUs4786","1v5hHk85Ae","8TxD7GXdoH",
+"ZuDtDBpYhV","UmaEvzHF1q","HP433atef2","0PktI2DREs","Yh1hF7fsYM","07n1cvkCHH","vkCHHfcwDa","rz7UtuPX7G","UmaEvjzUqR","Ss0ZuiB08l",
+"KsjRKNo0Qb","B3qemFVMxo","qaofNPOUYS","oQ87rWreyP","OHaBzgtCA5","VjCZq16lHc","yofH3CqqaD","nlaByWaWsv","U3yw5No0Qb","In3NSDz1R3",
+"MmKGJb29RJ","ZzJHWprNT6","hYBCKyluBx","JIqXiHzZT8","L7cGcJkzUn","Pb1paVLTy6","VBjhzDLhzM","jSjS31v5hH","Qworu7ku1p","fcJOyStlDJ",
+"NOHszJKWYR","CxVEf5ZaEz","1j5L8s7Mxk","WmadAfmIK1","7ku1psuY4x","uupzkOHaBz","FFDuiMaJQs","8hJdtMaJQs","s7MxkFGzgp","I7p2aguMb8",
+"jtn0XuTacx","GXdoHvOqCE","7lUXZZ4I1v","6q6L9zbIYY","qaofNRxrsm","JJs5muJScX","8xEKzSbRYy","XyPZNuN6r3","POUYSjeskS","SbRYyDQimp",
+"MmsIoYw2oU","8TxD7uoStw","Oz8yZv2eC3","jiVBPs7Mxk","fqypy1LB1L","5ZaEz8cVD3","jSjS3Twano","MGlTFCIShG","fLNg89rlg9","h1zcHVerEA",
+"9XyT92Nslm","lm0pD2DREs","e6e4zrKDLJ","zQt6QB3qem","BpYhVLbRTH","zQt6QzmLYD","HzZT8LewvM","jeskSblLA9","0MR5X7fKYU","9eoRcwDajX",
+"uN6r3580YD","hYBCKCNHmv","JJs5mUvlv4","brhlQd85a9","uJScX0MR5X","tjQxsaDGtS","k85AelsQGo","OUqFMrhl0J","F6PT2NAFuw","29QAzNcICA",
+"MezSWs4786","7Ow5CCK5W7","5iGN5m4bxU","faHir580YD","GrDg7qQxHP","h1zcHZuDtD","LbRTHRpBQm","fcJOyMkgy8","9GXkXatef2","m4bxUM6qcG",
+"FwEJztuDyS","t59lRgdQsS","AmdQdFcWrW","NhXdulm0pD","ydG8UWaim6","VLTy6bgJAz","t98iWhUTw7","euZA5Chuy3","7lUXZ8cVD3","QYxC0pT8wu",
+"L7cGcXyPZN","qaofNuLtKs","QbxXcAOgEe","3otm65Mg9r","9XyT9JkzUn","GrDg7MmsIo","cL0aEJIqXi","euZA5S2Dfu","atef2lweGy","VjCZqtvdkD",
+"blLA9Z4I1v","2ZHdkni2v1","zQt6QNxx9V","iKqhr8TxD7","ix74rd7vjM","VerEA5drc6","xXTI4QssNC","hYBCKOxWIH","y94nw9iGoT","iB08li3pyd",
+"DG4sTbZLvS","8xEKz7fsYM","gIYvE16lHc","RpBQmWPmlx","t59lRlpF6W","2hEEU64s8N","DcpWB0MR5X","9iGoTF6PT2","9y4lwdmoS7","2ZHdkZuDtD",
+"K20wKVprf2","580YDtuDyS","IKxdLbZLvS","7ku1pt59lR","OxWIHTwano","JKWYRChuy3","VerEAWaim6","FNYIMFLsph","Ta8f6HzZT8","5iGN5sx5Gl",
+"3otm6cmXIX","LDk6f9iGoT","RkQkeF6PT2","n1pmOHfyNQ","QnJ1SCqqaD","DLhzM9XyT9","MGlTFS77LH","DQimpRBhp0","hYBCKNAFuw","KsjRKcQOnv",
+"blLA9piJSk","pT8wuAmdQd","RBhp0KsjRK","hE1Qlx3LDe","4QMc948cHL","9y4lwb29RJ","fqypyaFFss","2Yz7EAXpwE","bgJAzBbwgA","0PktIaFFss",
+"wDajXWMiS3","7hyVvpv0i7","OUYuF618Di","dQ586lpF6W","5drc6ciuWz","lsQGo48cHL","ru4UGRkQke","Uvlv4cShY2","U3yw5aFFss","3otm6OxWIH",
+"5nmWvuoStw","MmsIoJIqXi","jtn0XydG8U","KZamHdmoS7","cmXIXgIYvE","atef2uvf7A","7ku1pIKxdL","XflUqzqH0W","taOXK4QMc9","14FLRfFDrJ",
+"jiVBPfmIK1","fmIK1fFDrJ","FFDui14FLR","TwanojSjS3","okgRiNOHsz","jSjS3Q6hMC","kZANmPb1pa","M6qcGQbxXc","MK07YbZLvS","7ku1pHRxd8",
+"VjCZqYOfrY","Y1mC0RBhp0","ciuWzRzaZA","S2DfuHP433","MezSW6q6L9","tAOsrpAhR1","D6rByF6PT2","JIqXiprNT6","VBjhzzqH0W","tjQxslsQGo",
+"Gv3FqjiVBP","BGaQYtjQxs","7fsYM3weIF","oQ87ruN6r3","jfREu8RCUA","Mkgy85iGN5","2ZHdkyofH3","lXFOBjzUqR","aDGtS7X3uy","5VZjSYw2oU",
+"qaofN9eoRc","s93MlL7cGc","t59lR45cIH","Z4I1vOUqFM","5nmWvMezSW","K20wKv2eC3","QWxoT3otm6","9XyT9lXFOB","S2DfudQ586","Cp3mZMkgy8",
+"jeskSCNHmv","7Ow5CSjskQ","yEfy9atef2","5ZaEzpv0i7","LewvM2DREs","SmGzvAgJHQ","AkKTkn1pmO","24ARFTCgPp","JJs5mWaim6","nFqik2ZHdk",
+"RpBQmUl4a1","5drc6vLsmS","Q6LixRACuj","Waim6IjTwP","pT8wujS1aj","24ARFGWqqX","GWqqXRBhp0","ciuWzguMb8","Rxrsm7fKYU","nlaBy7fKYU",
+"SbRYyUmaEv","ZJTXH0ao3l","i7WMQWreyP","oVQp6nnP8o","suY4xydG8U","hYBCKcL0aE","WMiS3KASQ8","lpF6WvLsmS","Nxx9V2TRI7","hYBCKrKDLJ",
+"hYBCKFhtgl","gjUTuKr8ys","uN6r3DQimp","v1HlnlH1kt","FVMxoOUYuF","QYxC0k85Ae","In3NSRBhp0","aL6AJRsQUq","pWiOs9eoRc","Zv7z0HzZT8",
+"8TxD7EOE1o","QChxsFGzgp","hi5X7qaofN","vkCHHokgRi","MaJQs7hyVv","yvOMIAXpwE","Nxx9VvOqCE","QbxXcZhwG1","JRJQBFjHXR","bZLvScL0aE",
+"ciuWzCdyBV","2DREsqaofN","5Drn0DG4sT","jzUqRzFgtB","CK5W7pFrrl","jS1aj9XyT9","14FLRPYBf4","zbIYYIn3NS","TwanoIBe8k","tlILtl83Ud",
+"RACujMmsIo","Ss0ZuAOgEe","Chuy35VZjS","TwanoMK07Y","he9IAkZANm","ZhwG12Nslm","6q6L9guMb8","Yf2EcO3iyQ","OxWIHlH1kt","uTacx8RCUA",
+"48cHLSjskQ","sqVrfLewvM","PYBf4n8pJ9","14FLRpiJSk","XyPZNyofH3","yvOMIHRxd8","KZamHMezSW","SbRYy9GXkX","kB5nP4dEz6","SjskQCxVEf",
+"9eoRcGrDg7","cShY2Cp3mZ","7ku1pNo0Qb","FnPFBnlaBy","7fsYMFFDui","FLsphoGu6x","tvdkDa00b5","IBe8kni2v1","lXFOBSbRYy","HlUbFqQxHP",
+"UmaEvcQOnv","pT8wuVprf2","2DREsBpYhV","HzZT8RmDcr","VLTy6okgRi","FhtglJRJQB","LewvM8cVD3","7ku1ph1zcH","tAOsr2hEEU","euZA5UmaEv",
+"soy9tiqv4k","zqH0WHRxd8","rhl0JQYxC0","aez9yCxVEf","5nmWvmz8gx","Q6LixECMvU","NOHsz0BmCy","XyPZNlsQGo","pWiOsTwano","Ul4a1ix74r",
+"RxrsmfLNg8","yEfy9rz7Ut","oGu6xiqv4k","8xEKzX6Pin","QYxC0VIlwP","atef2S2Dfu","pAhR1QssNC","sqVrfGSQwj","JKWYRv2eC3","9GXkXvkCHH",
+"Ul4a1OUqFM","OxWIHO3iyQ","O3iyQFnPFB","0MR5Xv1Hln","OxWIHVjCZq","he9IA07n1c","n1pmOksJby","D6rByChuy3","wiHrZfaHir","dQ586WreyP",
+"Gv3FqNcICA","CqqaDkZANm","pmeCdsx5Gl","iwzGkReKEW","Mm8siRmDcr","jzUqRi7WMQ","WaWsvSWfou","StlDJX6Pin","euZA5RBhp0","IBe8kFGzgp",
+"7ku1pLDk6f","5Mg9rChuy3","FNYIMVIlwP","NcICAVBjhz","VBjhzYf2Ec","KASQ8djsrv","zqH0WEdBKc","Pb1paBCxeC","uZPqgbZLvS","jtn0XfLNg8",
+"zQt6QC2Irc","0Kyfs16lHc","AkKTkStlDJ","ZuDtDgtCA5","JJs5myToGW","5Drn0EOE1o","lH1ktGXdoH","dpe1v2Nslm","yofH3cmXIX","CNHmvqaofN",
+"16lHcZUnqt","wDajXdhSuH","cQOnvThjNn","lkMUABpYhV","L7cGc07n1c","v2eC3fmIK1","lH1kt24ARF","S77LHfLNg8","2Yz7EuJScX","nlaByFcWrW",
+"FLsphuN6r3","ix74rCp3mZ","2hEEU7fKYU","lH1ktVLTy6","v8yFNRzaZA","yEfy9CNHmv","yEfy9UmaEv","QYxC0zHF1q","QClRLJKWYR","OHaBzO3iyQ",
+"SWfouJXljW","DG4sTO3iyQ","i3pydiwzGk","VjCZqcmXIX","aDGtSoGu6x","Q6LixStlDJ","s93MlYOfrY","DG4sTdjsrv","VjCZq0PktI","SmGzvI7p2a",
+"jtn0XJ2mQi","okgRiAOgEe","GSQwj8U2nU","nlaByciuWz","M6qcGYOfrY","tAOsr1v5hH","dmoS78cVD3","ZUnqtTa8f6","Cfgr3vkCHH","nnP8orKDLJ",
+"618DijfREu","nnP8oStlDJ","nlaByyluBx","yofH3SWfou","5drc62Yz7E","uQIczYh1hF","GSQwjZ4I1v","D6rByFGzgp","dQ586lXFOB","WaWsvMGlTF",
+"RkQke24ARF","0MR5XzmLYD","D6rBynFqik","yofH3pT8wu","ydG8UZhwG1","5Mg9rrz7Ut","gtCA55iGN5","Pb1paru4UG","QChxsbrhlQ","TXQ0ZUmaEv",
+"lH1ktRBhp0","CIShGuPX7G","mz8gxokgRi","0PktICK5W7","djsrvF6PT2","FLsphxciqp","RBhp0zFgtB","zmLYDChuy3","VIlwPlj07Q","Gv3FqHP433",
+"hUTw7Yf2Ec","jtn0Xru4UG","yofH3YjB9t","U3yw5a00b5","dpe1vHRxd8","hUTw7Dz1R3","FhtglkZANm","Ta8f6vLsmS","he9IAtuDyS","2hEEUa00b5",
+"ReKEWSWfou","U3yw5KASQ8","16lHclXFOB","ThjNnuAWyp","M6qcG0ao3l","RpBQmECMvU","AgJHQIKxdL","SjskQTwano","B3qemLDk6f","Pb1pa5IhmG",
+"24ARFwDajX","xXTI4Ss0Zu","EOE1oHzZT8","QssNCBbwgA","fcwDaW7cTs","GSQwjt59lR","fcJOyFwEJz","5iGN58FmFH","16lHczFgtB","B3qem8xEKz",
+"LewvMpAhR1","tvdkDv8yFN","7X3uyuN6r3","Chuy3jSjS3","tAOsr0PktI","9GXkXNhXdu","gdQsSYOfrY","5Drn0d7vjM","vLsmS1LB1L","ni2v1dmoS7",
+"rKDLJMmKGJ","5ZaEzJ2mQi","2ZHdkvLsmS","X6PinQssNC","d85a94W0Tl","blLA9CIShG","FVMxo0MR5X","SjskQlm0pD","5IhmGix74r","FFDuiCqqaD",
+"fmIK1qQxHP","S2Dfujtn0X","Kr8ysFGzgp","Gv3FqJRJQB","55rfBKASQ8","FLsphlm0pD","3otm6jtn0X","9GXkXJJs5m","6q6L9he9IA","0Wr5ypvgjS",
+"FLsph0Kyfs","QbxXctjQxs","y94nwyofH3","piJSkk85Ae","lsQGoUvlv4","55rfBd85a9","HzZT8Mm8si","zmLYD0ao3l","zHF1quAWyp","Q6hMCEdBKc",
+"jiVBPaez9y","7Ow5CYf2Ec","F6PT2sx5Gl","tAOsrCfgr3","Pb1paksJby","2hEEU0YAGH","uAWypAgJHQ","tvdkDAgJHQ","tl72W8hJdt","lkMUACfgr3",
+"d7vjMo8Uyd","hYBCKHP433","oVQp6Q6hMC","suY4xQworu","BGaQYjzUqR","QClRLgIYvE","BCxeCDG4sT","FFDuiAXpwE","l83UddhSuH","5Mg9rwiHrZ",
+"tvdkDBGaQY","Y1mC08FmFH","0YAGHYjB9t","3weIFblLA9","VBjhzRBhp0","Ul4a1n8pJ9","WaWsvZhwG1","a00b5618Di","iKqhrSWfou","o8Uydfqypy",
+"CK5W764s8N","rKDLJJKWYR","XflUqn8pJ9","5iGN50BmCy","tAOsrHP433","0ao3lQClRL","fFDrJsuY4x","QssNC8hJdt","QbxXc5IhmG","HzZT8D6rBy",
+"NAFuwulk41","GXdoHIBe8k","2hEEUpvgjS","8FmFHfqypy","o8UydlH1kt","5Mg9rfcwDa","lweGysx5Gl","CK5W7GWqqX","lweGyMmKGJ","ydG8US2Dfu",
+"7ku1pSmGzv","FPfSEgf8rI","618DizY1GY","618DiEoToP","tlILtQnJ1S","9eoRc1j5L8","qQxHPaL6AJ","Cfgr3W3VFH","oQ87rS2Dfu","Cfgr30MR5X",
+"rhl0JMGlTF","Cp3mZsqVrf","RmDcrOz8yZ","pmeCdPYBf4","pvgjSTa8f6","5iGN516lHc","MmKGJRBhp0","S2DfuQbxXc","YOfrYhYBCK","24ARF0YAGH",
+"b29RJQClRL","Ta8f6pFrrl","pT8wu3weIF","uoStwJJs5m","L7cGcSmGzv","uvf7AZzJHW","hYBCKC2Irc","jeskSuJScX","ECMvUulk41","n8pJ9ogLgc",
+"No0QbDLhzM","rKDLJPYBf4","gf8rIv2eC3","i3pyds4786","ECMvUGWqqX","FnPFBjzUqR","kB5nPzbIYY","oQ87rd85a9","14FLRFxX9q","1LB1LkB5nP",
+"GrDg7BCxeC","0ao3lGWqqX","fFDrJv2eC3","gdQsSPYBf4","uN6r3ciuWz","bZLvSn8pJ9","CK5W7Waim6","KZamHuPX7G","lViBvfLNg8","FLsphQ6hMC",
+"PYBf4ECMvU","nnP8on1pmO","AkKTkhYBCK","x3LDe24ARF","Yh1hFD6rBy","okgRiGv3Fq","0Wr5yHfyNQ","gjUTu3weIF","GXdoHQ6Lix","tvdkDgf8rI",
+"HlUbFsqVrf","9rlg9C2Irc","C2IrceuZA5","aez9ynlaBy","M6qcGoGu6x","IRh48ciuWz","SmGzvs7Mxk","faHirRsQUq","16lHcFPfSE","rhl0JuPX7G",
+"618Didjsrv","EOE1oZJTXH","OxWIHtlILt","tlILtlsQGo","zz4ZU5IhmG","jiVBP7hyVv","tuDySSbRYy","3weIFG1RhS","BCxeCQworu","RxrsmuAWyp",
+"BFkb8oVQp6","pv0i7pWiOs","0BmCyo8Uyd","W3VFHUvlv4","FVMxoMojnP","iKqhrxciqp","4QMc9gtCA5","Cp3mZZuDtD","MaJQsO3iyQ","Cfgr3zmLYD",
+"uTacxIBe8k","DcpWBZzJHW","ciuWzfcwDa","fcwDauTacx","k85AeDQimp","zqH0WbrhlQ","pAhR10MR5X","8cVD3ZuDtD","5NammaL6AJ","uupzkWaWsv",
+"2TRI7dpe1v","euZA5azIWp","fLNg8dpe1v","oGu6xtaOXK","CxVEfRpBQm","14FLRSjskQ","dpe1v64s8N","2NslmlH1kt","dpe1v0BmCy","bgJAzJJs5m",
+"i7WMQ7ku1p","GSQwjMezSW","C2IrcgjUTu","tjQxswiHrZ","SjskQsuY4x","K4GS8zmLYD","MaJQsCK5W7","QssNCgdQsS","lH1ktFNYIM","gIYvEYf2Ec",
+"ReKEW7hyVv","TXQ0Zdjsrv","sqVrfqaofN","IRh48qUJMd","Yh1hFW3VFH","xciqp2Yz7E","lj07QoQ87r","atef2x3LDe","0MR5XQworu","AgJHQe6e4z",
+"CqqaDtAOsr","uvf7Ahi5X7","FjHXRcQOnv","Mkgy8F6PT2","5nmWvGXdoH","fqypypv0i7","lsQGoI7p2a","jzUqR2TRI7","W3VFHStlDJ","iB08lCfgr3",
+"d7vjMprNT6","POUYSiwzGk","RkQkeD6rBy","QnJ1S5iGN5","qUJMdkB5nP","uTacxdQ586","BCxeCOz8yZ","RpBQm7fKYU","jzUqR8RCUA","CdyBV0ao3l",
+"ogLgcdmoS7","7X3uyQ6hMC","y94nwNo0Qb","5Drn0l83Ud","kZANmZhwG1","cmXIXRpBQm","S2DfuQnJ1S","RpBQm1j5L8","sqVrfBpYhV","DQimpMojnP",
+"hYBCKjfREu","uZPqghYBCK","HfyNQWmadA","suY4xBCxeC","Chuy3rhl0J","7X3uyCdyBV","gIYvEVIlwP","QWxoTvOqCE","cQOnvFjHXR","UlU3ML7cGc",
+"P6bcgUl4a1","9XyT9zFgtB","3otm6uoStw","ECMvUZJTXH","XflUq618Di","RkQke5ZaEz","JIqXi6AFT0","7ku1pU3yw5","yofH3J2mQi","9y4lwQWxoT",
+"1v5hH8xEKz","FcWrWuupzk","QnJ1S580YD","uAWypaFFss","Yw2oU2TRI7","lsQGojSjS3","S77LHru4UG","fcwDaRzaZA","hYBCKjiVBP","hUTw73weIF",
+"FPfSEX6Pin","9GXkXW3VFH","lsQGo2ZHdk","pWiOspmeCd","oVQp6WPmlx","7hyVvzQt6Q","ZJTXHk85Ae","K4GS8DLhzM","FxX9qTXQ0Z","pT8wuZUnqt",
+"WPmlxQYxC0","s7MxkuQIcz","Yw2oUhi5X7","GWqqXReKEW","tlILtZzJHW","fLNg8suY4x","QnJ1Ssx5Gl","UmaEvyEfy9","DQimp4dEz6","iKqhrI7p2a",
+"Ul4a1jfREu","oVQp6nlaBy","xReec7fsYM","yvOMIaez9y","AkKTk4dEz6","fLNg8KZamH","0Wr5yB3qem","In3NScL0aE","3weIFJIqXi","sqVrf7fKYU",
+"5NammpvgjS","ciuWzFcWrW","lCMxys4786","gdQsSRzaZA","FwEJzEdBKc","tlILt5ZaEz","zz4ZUxXTI4","hi5X724ARF","0ao3l5Drn0","hi5X7TXQ0Z",
+"VerEAAkKTk","xReec2hEEU","Chuy348cHL","aDGtS5drc6","jfREu5Drn0","7ku1ps93Ml","L7cGcsx5Gl","MezSW580YD","gdQsSatef2","uupzkdmoS7",
+"FGzgpzHF1q","zQt6QSmGzv","hE1QlBCxeC","CxVEflsQGo","JKWYRUvlv4","uJScX4QMc9","2Yz7E5Mg9r","BCxeCWDVWJ","JkzUnVIlwP","JIqXiDLhzM",
+"Ss0ZuCxVEf","wiHrZjtn0X","55rfBix74r","Y1mC0CqqaD","CdyBVzFgtB","s93Mlhi5X7","7hyVvuQIcz","uoStwKZamH","Kr8ys0Wr5y","cQOnvUl4a1",
+"n8pJ9pWiOs","5drc67Ow5C","5nmWv6q6L9","v8yFNbZLvS","2hEEUfqypy","sqVrfpvgjS","l83UdCIShG","LbRTHMaJQs","aFFssxReec","YOfrYi7WMQ",
+"kZANm0BmCy","tvdkD07n1c","rhl0JtlILt","KASQ8L7cGc","vLsmSfcJOy","2DREsCNHmv","DLhzMMojnP","580YDDz1R3","faHirt59lR","tvdkDYjB9t",
+"HP433gIYvE","s7MxkgdQsS","8RCUAd85a9","B3qemuQIcz","VjCZqyluBx","C2IrccShY2","ZJTXH0MR5X","aL6AJ5ZaEz","faHirXyPZN","CxVEfRsQUq",
+"0MR5X9GXkX","WaWsvNo0Qb","qaofNFLsph","oQ87rjtn0X","ZUnqtCdyBV","Dz1R3CK5W7","1LB1LQ6Lix","yToGW48cHL","GWqqXJXljW","PYBf4NAFuw",
+"TXQ0ZWmadA","VIlwPtjQxs","zHF1qzHF1q","5IhmG5ZaEz","lsQGopiJSk","gtCA5hYBCK","7ku1p07n1c","ni2v1VNCPd","BpYhV45cIH","PYBf4BGaQY",
+"fFDrJIBe8k","azIWpMK07Y","lj07QydG8U","jiVBPPYBf4","Kr8ysSjskQ","VNCPdVBjhz","k85Aepv0i7","2TRI7X6Pin","4dEz6hYBCK","a00b5jtn0X",
+"WPmlxMkgy8","VLTy6jS1aj","AkKTk2ZHdk","Mm8siRzaZA","W7cTsCxVEf","OUYuFtjQxs","soy9tsqVrf","D6rBypT8wu","24ARFzz4ZU","TXQ0Z5IhmG",
+"I7p2afFDrJ","bgJAzhUTw7","Y1mC00BmCy","Kr8ys0YAGH","7hyVvGXdoH","nFqikzFgtB","I7p2aYOfrY","MezSW7fsYM","NAFuwd85a9","WmadAjS1aj",
+"d7vjMIRh48","rhl0JyofH3","VLTy6tjQxs","0BmCy8TxD7","5VZjSF6PT2","Yh1hFJIqXi","WmadAWDVWJ","uZPqgSs0Zu","O3iyQQworu","RpBQmyluBx",
+"pT8wuvOqCE","CdyBVfaHir","EoToPG1RhS","o8UydNOHsz","0BmCyjzUqR","EOE1o45cIH","8FmFHtAOsr","HlUbFbZLvS","No0QbpT8wu","pvgjSt98iW",
+"ZhwG1cQOnv","8U2nUl83Ud","piJSkFxX9q","7Ow5COUqFM","M3zXLQworu","NAFuwUmaEv","5IhmGrhl0J","GSQwjJXljW","DQimpzY1GY","9y4lw7X3uy",
+"jeskSo8Uyd","IRh48QnJ1S","Yh1hF0BmCy","ECMvUOUqFM","0YAGH0PktI","48cHLHzZT8","piJSkYf2Ec","fcwDa5drc6","jfREuCfgr3","pv0i7S77LH",
+"6AFT02hEEU","7hyVv5drc6","SWfou2Nslm","BbwgAvkCHH","HP433euZA5","Y1mC0Oz8yZ","OUqFMYw2oU","cmXIXjtn0X","FjHXRt59lR","jtn0XguMb8",
+"kB5nPYjB9t","okgRiy94nw","SmGzvi7WMQ","FLsphlj07Q","W3VFHe6e4z","EOE1osuY4x","VBjhzcShY2","0KyfsDz1R3","gjUTuQYxC0","8RCUAcmXIX",
+"2Yz7Ee6e4z","HRxd8ksJby","5iGN57hyVv","DG4sTZhwG1","FLsphCNHmv","hSSvQL7cGc","BGaQYMezSW","KZamHRxrsm","hUTw7kB5nP","2Nslmatef2",
+"IRh48nnP8o","gjUTu5ZaEz","uAWyplXFOB","M3zXLEdBKc","NcICAaL6AJ","TXQ0ZM3zXL","GXdoH29QAz","8TxD7Dz1R3","cShY2oQ87r","CIShG0BmCy",
+"AmdQdzFgtB","KZamHgf8rI","NhXduVLTy6","RBhp0VjCZq","m4bxU5iGN5","t59lRaL6AJ","Q6hMCWaWsv","i7WMQX6Pin","iKqhrxReec","AgJHQzY1GY",
+"yEfy9yluBx","45cIHyToGW","yvOMIguMb8","1j5L8618Di","NhXduU3yw5","lj07Q580YD","XyPZNt59lR","QClRLvOqCE","cmXIXWaWsv","Vprf2OxWIH",
+"dmoS7CK5W7","1LB1L45cIH","GrDg7BbwgA","29QAzlCMxy","zFgtBgIYvE","No0QbuAWyp","VerEAPYBf4","ni2v1PYBf4","qaofN3otm6","SbRYyzmLYD",
+"jfREuW7cTs","iKqhrQWxoT","rhl0JMezSW","AOgEeJRJQB","1LB1LyofH3","Z4I1vNhXdu","2TRI7ciuWz","1v5hH7lUXZ","fmIK1ZuDtD","a00b5MojnP",
+"8RCUAEoToP","WPmlxI7p2a","fmIK1W7cTs","5Drn0zmLYD","FPfSEFxX9q","lsQGoQChxs","MK07YkZANm","JKWYR0MR5X","QnJ1Sni2v1","CdyBVG1RhS",
+"aFFssv1Hln","ZUnqtuN6r3","ogLgcGv3Fq","euZA5Mkgy8","OUYuFMGlTF","hUTw7CxVEf","QYxC06q6L9","djsrvPb1pa","0MR5XWaWsv","t98iWlViBv",
+"5iGN545cIH","YjB9tUlU3M","XflUq5Namm","gtCA5Dz1R3","P6bcgZzJHW","GXdoHWPmlx","TCgPpqaofN","Yf2EcYjB9t","BpYhVfaHir","RBhp0JXljW",
+"ru4UGNo0Qb","UlU3M0Wr5y","uN6r3x3LDe","b29RJsqVrf","jtn0XlViBv","zqH0WRACuj","IjTwPCNHmv","CIShGsuY4x","SmGzv2ZHdk","IBe8kD6rBy",
+"JkzUn4QMc9","7fsYMi7WMQ","CdyBVChuy3","ECMvUPYBf4","VjCZq5Mg9r","qaofNuAWyp","8FmFHDQimp","lkMUAa00b5","1v5hHzmLYD","YjB9tAgJHQ",
+"NcICAJIqXi","FhtglHfyNQ","RxrsmMmKGJ","cmXIXFPfSE","SmGzvIBe8k","hE1Qla00b5","gdQsSXflUq","GrDg7t98iW","vkCHH6AFT0","5NammbZLvS",
+"gdQsSAgJHQ","ksJbyOHaBz","lH1ktmz8gx","1LB1LuN6r3","ix74rx3LDe","tlILtZ4I1v","OHaBzBbwgA","MK07YNo0Qb","5Mg9rNcICA","9rlg9sx5Gl",
+"DG4sTVjCZq","fmIK1lj07Q","MmKGJWaWsv","SmGzv7X3uy","ZhwG1t98iW","D6rByCIShG","WaWsvHP433","TXQ0Z24ARF","7fsYMlsQGo","OxWIHIjTwP",
+"7Ow5C5nmWv","6q6L9RzaZA","RsQUqtuDyS","BpYhV2Nslm","BGaQY7Ow5C","RsQUqaDGtS","3weIF45cIH","FjHXRQssNC","bZLvSzHF1q","pWiOsCqqaD",
+"WDVWJ07n1c","RmDcrfcwDa","gdQsS48cHL","6q6L9LbRTH","CIShGJkzUn","CdyBVYf2Ec","WmadA64s8N","rhl0Jsx5Gl","OHaBzFGzgp","XflUqTa8f6",
+"fLNg8euZA5","W7cTs5iGN5","MK07YHfyNQ","No0QbzHF1q","0h1b15Mg9r","Waim6Mkgy8","ZJTXHguMb8","lsQGoVprf2","s93Mld85a9","yToGWdQ586",
+"3weIFix74r","tl72WW7cTs","BFkb8RmDcr","dmoS7s93Ml","2TRI7uTacx","VBjhzjSjS3","tlILt8RCUA","jtn0XFhtgl","he9IAru4UG","0BmCyJJs5m",
+"FwEJz5drc6","jtn0X16lHc","RpBQmsqVrf","4QMc9uQIcz","dmoS7VNCPd","29QAz9GXkX","uQIczd7vjM","U3yw5t59lR","uvf7AaFFss","gjUTuWDVWJ",
+"FGzgphe9IA","2ZHdkTwano","sx5GlBCxeC","oVQp6jiVBP","pFrrlEoToP","dmoS7YOfrY","zFgtBPYBf4","b29RJBbwgA","IKxdLsqVrf","J2mQiAkKTk",
+"ECMvUyvOMI","UlU3MVjCZq","EOE1oECMvU","rhl0J9y4lw","P6bcgQ6hMC","NAFuwY1mC0","5nmWvTCgPp","NOHsz1j5L8","KZamHJ2mQi","ulk4145cIH",
+"QbxXczqH0W","GWqqXSjskQ","ulk41FFDui","rKDLJ5iGN5","okgRin1pmO","qUJMdokgRi","tl72W9XyT9","J2mQiXyPZN","3weIFCxVEf","PYBf41LB1L",
+"zqH0WCK5W7","piJSkAXpwE","AIYUuNAFuw","5nmWv48cHL","MGlTFyEfy9","faHir07n1c","0Kyfs0Kyfs","okgRiFFDui","iwzGkuoStw","7hyVvO3iyQ",
+"2NslmaDGtS","Cp3mZFnPFB","Waim6tAOsr","x3LDelH1kt","ZJTXHNAFuw","uN6r3FnPFB","CdyBVQnJ1S","EoToPRkQke","2Yz7Etl72W","FVMxogjUTu",
+"GrDg7K4GS8","5iGN5KASQ8","Vprf2yvOMI","AXpwEvOqCE","GWqqXqQxHP","MGlTFpWiOs","MmsIoOUYuF","0BmCyni2v1","uvf7AVjCZq","0Wr5yMojnP",
+"oQ87rnFqik","XflUqBGaQY","pv0i7oQ87r","IRh48W3VFH","2ZHdkFLsph","Dz1R3RACuj","cL0aEcQOnv","IjTwPLewvM","7fKYUIBe8k","uN6r3Nxx9V",
+"AgJHQWDVWJ","t59lRM3zXL","0KyfsgIYvE","s4786VjCZq","1LB1L5drc6","faHirUl4a1","DG4sTUlU3M","2TRI77X3uy","a00b5hSSvQ","jzUqR24ARF",
+"aL6AJ0MR5X","SbRYyS2Dfu","Cfgr3qUJMd","8RCUADQimp","t59lRCdyBV","uvf7ACIShG","DLhzMlH1kt","tl72Wv1Hln","KZamHNo0Qb","uN6r3cShY2",
+"faHirECMvU","CxVEfUl4a1","MmsIoPYBf4","IRh48Oz8yZ","Uvlv4MGlTF","9iGoT4dEz6","QWxoT9XyT9","MGlTFKr8ys","brhlQU3yw5","BCxeCMK07Y",
+"v1Hln9GXkX","jeskS7fsYM","Cp3mZpmeCd","45cIHFwEJz","MojnPJRJQB","piJSk2Nslm","ZuDtDatef2","Oz8yZCdyBV","ksJbyciuWz","9rlg91LB1L",
+"8FmFHFxX9q","s7MxktlILt","rKDLJMm8si","qQxHPTCgPp","fmIK1jiVBP","tvdkDZhwG1","i7WMQcQOnv","8RCUAazIWp","uoStwQ6hMC","BpYhVpWiOs",
+"X6PinQbxXc","fqypy07n1c","ksJbynlaBy","IBe8krhl0J","kB5nPC2Irc","lXFOBZJTXH","VIlwP2Yz7E","sx5GlPb1pa","4W0TlhUTw7","vkCHHZv7z0",
+"zmLYDOUYuF","LbRTHVprf2","HRxd89GXkX","l83Ud7ku1p","1v5hHru4UG","yluBxWPmlx","OHaBzpv0i7","SjskQatef2","dmoS7MK07Y","OHaBzSWfou",
+"hYBCKwDajX","RACujnnP8o","BFkb8n1pmO","RBhp0X6Pin","v1Hlndjsrv","LewvMZuDtD","8U2nUxXTI4","Ss0ZuYf2Ec","FPfSEulk41","Ul4a1cShY2",
+"YOfrYv1Hln","dQ586gIYvE","v8yFNfqypy","ECMvUatef2","uTacx8hJdt","iwzGkFwEJz","jSjS3CK5W7","uTacx5VZjS","XflUqZv7z0","580YDFnPFB",
+"uN6r3FcWrW","AXpwEQworu","MaJQsIn3NS","FLsphI7p2a","ciuWzFFDui","8RCUAi7WMQ","9GXkXMaJQs","hSSvQMezSW","FLsphwDajX","fcJOyQbxXc",
+"BCxeC0Wr5y","hUTw7oVQp6","MaJQsv8yFN","8FmFHZJTXH","RmDcr0ao3l","UlU3MtuDyS","6q6L9b29RJ","v2eC37Ow5C","Ul4a1HfyNQ","QChxs2hEEU",
+"2ZHdk7fKYU","jtn0XWDVWJ","NAFuw3weIF","2ZHdkguMb8","ReKEWgjUTu","JIqXiG1RhS","tlILtpT8wu","XflUqHlUbF","HfyNQAkKTk","580YDx3LDe",
+"1j5L8FcWrW","9rlg9lsQGo","ru4UGFFDui","ix74rRmDcr","55rfBZuDtD","oQ87rStlDJ","k85Aev8yFN","pFrrlfaHir","lkMUAK20wK","24ARFBbwgA",
+"MK07Y5nmWv","3otm6tuDyS","FPfSEP6bcg","NOHszuQIcz","RACujt98iW","DG4sTzmLYD","ZUnqtXyPZN","lViBvUmaEv","FNYIMTa8f6","HzZT8FjHXR",
+"WmadARsQUq","1LB1Lt59lR","b29RJaez9y","ThjNnIRh48","J2mQiMGlTF","EdBKctl72W","MezSW0BmCy","7ku1ppiJSk","aDGtSlXFOB","VjCZqokgRi",
+"hE1QlgIYvE","jfREuZuDtD","BCxeC1LB1L","tvdkDo8Uyd","ThjNnP6bcg","FLsphn1pmO","tlILtrhl0J","zFgtBsx5Gl","tAOsr4W0Tl","yToGW6AFT0",
+"uLtKsY1mC0","DQimpLDk6f","v1HlnX6Pin","jiVBPP6bcg","zz4ZU7fsYM","7hyVvAXpwE","azIWpuupzk","zmLYDbgJAz","7hyVvU3yw5","1j5L8yvOMI",
+"UlU3MhSSvQ","Ul4a1HlUbF","zHF1qZuDtD","Rxrsm5IhmG","LewvMuPX7G","RsQUqMkgy8","QChxs7lUXZ","AOgEeulk41","dmoS7OxWIH","2NslmvkCHH",
+"l83UdFLsph","h1zcHOUqFM","8TxD77ku1p","vLsmS2Yz7E","s7MxkLbRTH","HRxd8hUTw7","O3iyQ8FmFH","jiVBPKZamH","WMiS3aez9y","QnJ1SCp3mZ",
+"Cfgr3sqVrf","pv0i748cHL","RpBQmRACuj","lViBvlXFOB","7fKYUpmeCd","5drc6gtCA5","QworuBbwgA","16lHcyToGW","s4786SmGzv","ix74r9y4lw",
+"nFqiklkMUA","YjB9trhl0J","qUJMdDQimp","qQxHPQClRL","55rfBK20wK","IRh48S77LH","jtn0X9y4lw","yluBx2ZHdk","VBjhztvdkD","cmXIXuQIcz",
+"VLTy6lH1kt","55rfB5Drn0","e6e4zciuWz","xReecJXljW","CxVEfpAhR1","Chuy3FGzgp","TXQ0ZCK5W7","EOE1owiHrZ","qUJMdfFDrJ","3weIFWPmlx",
+"h1zcH6q6L9","sx5GlZJTXH","3otm6VerEA","JkzUncL0aE","9y4lwjiVBP","KASQ8DQimp","fmIK1d7vjM","ZJTXHRsQUq","Q6hMC9y4lw","SmGzvGXdoH",
+"fqypyOHaBz","J2mQiiKqhr","JRJQBRkQke","fcJOy0Kyfs","WmadA7fKYU","mX2GEuTacx","14FLRCfgr3","Waim6hSSvQ","v2eC3jzUqR","Yh1hFQChxs",
+"8hJdtEoToP","CK5W707n1c","IjTwPHfyNQ","b29RJIRh48","LbRTHJRJQB","DG4sT9XyT9","0PktIFxX9q","Ul4a15Mg9r","a00b51j5L8","jS1ajBpYhV",
+"POUYSL7cGc","lsQGoFhtgl","Vprf2gdQsS","zbIYYTa8f6","cShY2LewvM","zbIYYuAWyp","Gv3Fq29QAz","uoStwEOE1o","WmadAkZANm","7fKYUrKDLJ",
+"zz4ZUguMb8","d85a9GrDg7","NAFuwPYBf4","aDGtS8xEKz","dhSuHQ6Lix","FVMxouZPqg","VNCPdtjQxs","Yw2oUFLsph","cmXIXCp3mZ","GrDg7n8pJ9",
+"azIWpSmGzv","FxX9qiqv4k","Kr8ysVNCPd","64s8Na00b5","OUYuFuN6r3","TXQ0ZDLhzM","oVQp6hi5X7","KZamHlH1kt","580YDFcWrW","LbRTH1j5L8",
+"K20wKtl72W","64s8NW3VFH","AIYUubgJAz","s4786ECMvU","G1RhSmz8gx","xXTI4lweGy","zHF1qsuY4x","1LB1LBFkb8","mX2GEDG4sT","ThjNnaL6AJ",
+"SmGzvMm8si","AmdQdCxVEf","DQimpF6PT2","2Yz7EOxWIH","45cIHhe9IA","tjQxshYBCK","lm0pDoVQp6","48cHLDcpWB","AkKTkQClRL","y94nw4dEz6",
+"8RCUASjskQ","gtCA5SbRYy","uupzkFNYIM","5Nammk85Ae","t59lR7ku1p","JKWYRD6rBy","1LB1LMK07Y","MGlTFAkKTk","uN6r3RmDcr","OUYuFzmLYD",
+"Vprf2AOgEe","QWxoT48cHL","VBjhzni2v1","Mkgy80Wr5y","vLsmSIjTwP","0h1b1zQt6Q","2NslmX6Pin","ix74rDz1R3","NOHszru4UG","OUqFMkB5nP",
+"S2DfuECMvU","K4GS8rKDLJ","jeskShYBCK","JJs5mLDk6f","GSQwjUl4a1","yluBxRxrsm","vkCHHt59lR","uQIcz5iGN5","HfyNQ0BmCy","IBe8kDz1R3",
+"okgRiSs0Zu","S77LHEoToP","yToGWVLTy6","FhtglNOHsz","Kr8yslj07Q","xReecQnJ1S","W3VFH8TxD7","4QMc9BGaQY","YOfrYAOgEe","LbRTH5iGN5",
+"WMiS3v1Hln","KsjRK7fKYU","aDGtSFLsph","AkKTkprNT6","rKDLJRxrsm","HlUbFydG8U","ZJTXHgdQsS","CqqaDCIShG","gtCA5AkKTk","4dEz6GXdoH",
+"oGu6xpAhR1","ThjNnRxrsm","dmoS7618Di","0YAGHi7WMQ","QClRLsoy9t","v1Hlnhi5X7","580YDNo0Qb","lpF6WsuY4x","S77LHfqypy","lH1ktGSQwj",
+"DLhzMVLTy6","uN6r3yEfy9","Yf2EcGSQwj","bZLvShi5X7","5iGN5jzUqR","lpF6WkB5nP","D6rByokgRi","hSSvQD6rBy","yluBxX6Pin","CIShGoQ87r",
+"euZA5ksJby","8hJdtDQimp","5ZaEz5Drn0","RmDcrm4bxU","s7Mxk5ZaEz","Chuy3S77LH","v2eC3zbIYY","ZuDtD3weIF","fFDrJK20wK","9iGoTUmaEv",
+"07n1cmz8gx","piJSkNxx9V","QbxXcuPX7G","P6bcgKr8ys","FNYIMdpe1v","4W0TlK20wK","yvOMIFnPFB","gtCA5lCMxy","QbxXc5Namm","lXFOBgf8rI",
+"xXTI4uAWyp","FnPFBAXpwE","n1pmOxXTI4","cL0aEzY1GY","MGlTFTXQ0Z","G1RhSydG8U","tlILtGSQwj","fLNg8lH1kt","mX2GEuJScX","kZANmdQ586",
+"vOqCEulk41","cShY2gIYvE","lj07QVerEA","XyPZNTa8f6","Ta8f6xciqp","prNT6tjQxs","IKxdLGv3Fq","FFDuit98iW","SmGzvY1mC0","RmDcrIBe8k",
+"FxX9qfFDrJ","m4bxUiqv4k","gf8rIKASQ8","aDGtSGSQwj","QWxoTtvdkD","Oz8yZ9iGoT","jtn0XJIqXi","5VZjSQYxC0","I7p2a2Nslm","MGlTFWaim6",
+"0BmCylCMxy","hYBCKuPX7G","fLNg8zY1GY","zz4ZUlweGy","prNT6HRxd8","14FLRMGlTF","POUYS48cHL","GWqqXBGaQY","sx5GlqUJMd","XyPZNv2eC3",
+"BGaQYQYxC0","C2Ircdjsrv","v8yFNVLTy6","RmDcrx3LDe","piJSkPYBf4","gIYvEfcJOy","6q6L9gf8rI","he9IAaFFss","Yw2oUiwzGk","n8pJ9Vprf2",
+"lH1kt0BmCy","wiHrZYjB9t","k85AepiJSk","GSQwjWMiS3","QWxoT9eoRc","gIYvEqaofN","VNCPdOUqFM","yvOMIL7cGc","C2IrcnlaBy","48cHL8U2nU",
+"kB5nPogLgc","2hEEUpAhR1","MK07Y8FmFH","nlaByuLtKs","MGlTFciuWz","8cVD3jiVBP","oGu6xCNHmv","hi5X7s93Ml","MaJQsDcpWB","nnP8ol83Ud",
+"P6bcg8RCUA","pT8wulXFOB","FLsph0YAGH","ReKEWcShY2","GWqqXBCxeC","JIqXizQt6Q","TCgPpbZLvS","CK5W7bgJAz","lsQGoXflUq","NcICAhi5X7",
+"YjB9tKsjRK","gtCA5zqH0W","OHaBzvLsmS","EdBKcoQ87r","dhSuHIn3NS","soy9tK20wK","aDGtSD6rBy","LewvMMaJQs","euZA5GXdoH","P6bcgEOE1o",
+"l83UdxXTI4","tuDySMmKGJ","Ta8f6pv0i7","NcICAWPmlx","9GXkXMGlTF","jtn0XQworu","Dz1R3AmdQd","uLtKsI7p2a","aL6AJBpYhV","Ul4a1Qworu",
+"29QAzRpBQm","FGzgp618Di","5Mg9rHzZT8","S77LHdmoS7","hSSvQuLtKs","9iGoTIjTwP","cmXIXP6bcg","QnJ1S8hJdt","EdBKc3otm6","lViBvhE1Ql",
+"pT8wuD6rBy","dhSuHAgJHQ","oQ87rx3LDe","C2Ircrhl0J","CxVEfMGlTF","Pb1pazY1GY","zqH0WciuWz","gtCA5618Di","d7vjMjeskS","0h1b1NcICA",
+"e6e4zBFkb8","zQt6QcShY2","b29RJgf8rI","CxVEfNAFuw","Y1mC0mX2GE","XyPZNGWqqX","TCgPpuupzk","NAFuw48cHL","zFgtBdhSuH","ECMvUHRxd8",
+"7Ow5CKZamH","JXljWYOfrY","bZLvSOUYuF","fFDrJ0Wr5y","iB08lF6PT2","VNCPdKsjRK","uN6r3qaofN","ciuWzyToGW","suY4xlj07Q","1v5hHprNT6",
+"piJSkCp3mZ","iB08ljzUqR","tuDyS4dEz6","kZANm8cVD3","jSjS3FnPFB","uAWypJXljW","l83Udy94nw","BGaQYMkgy8","lweGy5ZaEz","lpF6W5nmWv",
+"14FLRsuY4x","BpYhVfLNg8","dhSuHHzZT8","B3qem0Kyfs","POUYSjS1aj","vOqCEs4786","MaJQs8hJdt","2Yz7EuZPqg","IRh48lH1kt","EoToP0YAGH",
+"m4bxUtvdkD","DG4sT5IhmG","piJSk2Yz7E","wiHrZThjNn","XyPZNVLTy6","lsQGogf8rI","YOfrYM3zXL","QChxsRkQke","RBhp03weIF","jSjS3uvf7A",
+"b29RJIBe8k","ZJTXHNcICA","U3yw5hYBCK","jtn0XUmaEv","HfyNQNOHsz","C2IrcdmoS7","FcWrWTwano","OxWIHfcJOy","piJSkmX2GE","24ARFKASQ8",
+"AkKTkuoStw","29QAzGWqqX","azIWpFVMxo","jfREuMmsIo","CNHmvTXQ0Z","KZamH1j5L8","soy9tkZANm","tjQxsfLNg8","HzZT8Yw2oU","jtn0XDG4sT",
+"FNYIMQClRL","KASQ88FmFH","wDajXMGlTF","W3VFHoQ87r","8TxD7YjB9t","a00b5uPX7G","GrDg7Ta8f6","zQt6QQYxC0","gjUTuru4UG","iqv4k7fKYU",
+"b29RJS2Dfu","RsQUqRsQUq","Z4I1veuZA5","FGzgppvgjS","oQ87rUmaEv","lkMUAoGu6x","9iGoT9y4lw","ReKEWru4UG","oQ87r6q6L9","aDGtSfqypy",
+"Chuy3n1pmO","S2Dfu64s8N","qUJMdHzZT8","yEfy9JkzUn","QClRLFwEJz","BbwgAIKxdL","AkKTkECMvU","BbwgA7hyVv","MezSWLewvM","zY1GYJJs5m",
+"MGlTFJJs5m","GXdoHguMb8","7ku1pNcICA","5Drn05ZaEz","RBhp0uvf7A","YOfrYuupzk","CxVEfjS1aj","NOHszlj07Q","SjskQRACuj","RBhp0FxX9q",
+"lCMxyokgRi","5Mg9ruN6r3","IKxdLJIqXi","BpYhVGv3Fq","hUTw7zFgtB","FPfSEy94nw","48cHLtjQxs","tuDySAIYUu","FLsphCIShG","K20wKdjsrv",
+"IRh48OUYuF","uupzkpiJSk","8FmFHBpYhV","ZuDtDdhSuH","ZuDtDzQt6Q","rhl0Jh1zcH","ECMvUcQOnv","piJSk2hEEU","P6bcgAgJHQ","yEfy9P6bcg",
+"Uvlv42Yz7E","1LB1L4W0Tl","rz7UttuDyS","gdQsSl83Ud","Cfgr3QClRL","TwanozY1GY","J2mQioQ87r","piJSkAIYUu","jtn0XDQimp","FFDuiFhtgl",
+"SjskQ2DREs","uQIczFjHXR","CqqaDfaHir","SWfouZv7z0","UmaEvyvOMI","AgJHQ9XyT9","ReKEWF6PT2","55rfBcQOnv","i3pydi3pyd","8RCUASmGzv",
+"7ku1pWaim6","2Yz7EYw2oU","JJs5mFcWrW","CdyBVjS1aj","pmeCd0ao3l","DcpWBogLgc","W7cTs45cIH","WDVWJFwEJz","VBjhzAXpwE","gdQsSm4bxU",
+"QbxXc7X3uy","618DiTCgPp","oQ87rMkgy8","VIlwP64s8N","YOfrYAIYUu","FNYIMO3iyQ","3otm6dQ586","5ZaEz9XyT9","1LB1LDLhzM","QbxXcBFkb8",
+"s7MxkDLhzM","uLtKsDz1R3","soy9tW3VFH","b29RJ4W0Tl","C2IrcUlU3M","kB5nPlj07Q","KsjRKyEfy9","jeskSl83Ud","bgJAzOxWIH","5Drn0Chuy3",
+"S77LHl83Ud","IKxdL3weIF","FcWrWsoy9t","tjQxsVLTy6","VjCZqAkKTk","e6e4z48cHL","JIqXiVprf2","Ta8f6uJScX","JKWYRAgJHQ","0ao3lyToGW",
+"Q6LixlViBv","FhtglyvOMI","s7MxkoVQp6","faHir3otm6","tvdkDvOqCE","M3zXLJJs5m","OUYuFRACuj","AgJHQ4W0Tl","HP433gf8rI","5Drn0euZA5",
+"Yw2oUGWqqX","nlaBy14FLR","MojnP48cHL","UlU3MYw2oU","fqypy0h1b1","euZA5brhlQ","lXFOBtuDyS","8TxD7tAOsr","NhXduGrDg7","sqVrfpWiOs",
+"fcwDapWiOs","MmKGJDG4sT","MK07YXyPZN","6q6L90Kyfs","JkzUnOHaBz","uN6r3WDVWJ","WPmlxgIYvE","FjHXRk85Ae","FjHXRgIYvE","i3pydRxrsm",
+"sx5GlK4GS8","atef2RkQke","ZJTXHO3iyQ","K20wKlH1kt","POUYSzbIYY","RmDcrGSQwj","oGu6xTCgPp","taOXKCIShG","dmoS7BCxeC","NAFuwhYBCK",
+"soy9tRsQUq","5iGN5oVQp6","HfyNQAmdQd","uTacx4W0Tl","0YAGHoQ87r","dmoS7QnJ1S","55rfBRsQUq","JIqXi1LB1L","EOE1oIBe8k","jiVBPqQxHP",
+"Yh1hF29QAz","0PktIwiHrZ","MGlTFDz1R3","pWiOsd7vjM","suY4xSs0Zu","QChxsQ6Lix","nFqikQnJ1S","XflUqHfyNQ","AXpwEJIqXi","xciqpdpe1v",
+"b29RJiKqhr","n8pJ9IjTwP","2Yz7EjeskS","ulk41y94nw","LbRTHyluBx","mX2GE24ARF","CdyBV8FmFH","i3pyddQ586","WPmlxK4GS8","a00b5QChxs",
+"k85AedmoS7","16lHc14FLR","kZANmhE1Ql","RkQkey94nw","64s8NyofH3","FwEJzPb1pa","Mkgy8taOXK","cShY2ulk41","lH1kte6e4z","uLtKsfmIK1",
+"lXFOBZzJHW","hSSvQ9GXkX","L7cGccL0aE","pWiOsFGzgp","RzaZAgtCA5","CqqaDn1pmO","oQ87riqv4k","MaJQs580YD","suY4xNAFuw","zz4ZUTXQ0Z",
+"HP433FFDui","Qworuhi5X7","fcwDaFFDui","JXljW8hJdt","dpe1vy94nw","WDVWJChuy3","UlU3MjiVBP","0YAGHVNCPd","s93MlKZamH","BbwgA7fsYM",
+"D6rByLewvM","euZA5dmoS7","WPmlx7fsYM","n8pJ9lCMxy","yToGWMmKGJ","FFDui4dEz6","uZPqgYjB9t","lm0pDciuWz","gIYvEHfyNQ","b29RJcShY2",
+"lCMxyuLtKs","fLNg8zFgtB","uAWypVNCPd","jtn0XK20wK","16lHcFnPFB","fFDrJDQimp","OUqFMn8pJ9","Oz8yZYf2Ec","okgRiFPfSE","hUTw7Qworu",
+"StlDJW3VFH","b29RJJJs5m","jSjS3SWfou","MaJQsYh1hF","tuDySlXFOB","gf8rIqaofN","JIqXiCfgr3","ciuWztaOXK","Dz1R38RCUA","FPfSEGWqqX",
+"JXljWYw2oU","WreyPGv3Fq","HP433s93Ml","5NammMGlTF","ZJTXHAmdQd","qQxHPTa8f6","cQOnvXflUq","0MR5XokgRi","Mm8siRsQUq","5drc67hyVv",
+"B3qemOHaBz","WaWsvdjsrv","AmdQdMezSW","aez9y8RCUA","Y1mC0EOE1o","ZuDtDzmLYD","HP433bgJAz","ECMvUAkKTk","1LB1L0Wr5y","F6PT255rfB",
+"uN6r3pWiOs","VLTy6580YD","2hEEUBCxeC","WaWsvHlUbF","BCxeCB3qem","BpYhVFhtgl","prNT6guMb8","1v5hHs93Ml","5Mg9rUlU3M","SbRYyn1pmO",
+"W3VFHpvgjS","jiVBPD6rBy","Uvlv4dQ586","Gv3FqnFqik","U3yw5M3zXL","jzUqRFjHXR","v8yFNBCxeC","aez9yMmsIo","JKWYRblLA9","oGu6xPOUYS",
+"cQOnvs93Ml","W7cTsmz8gx","64s8NTwano","9y4lwQ6Lix","iwzGkNo0Qb","hE1Ql16lHc","iKqhrlsQGo","HP433zY1GY","xXTI4gdQsS","jfREuCdyBV",
+"taOXKW3VFH","zz4ZU9rlg9","Ss0ZuIBe8k","8FmFHD6rBy","uJScXwiHrZ","vkCHHblLA9","uJScXpiJSk","FNYIMM6qcG","hE1Ql580YD","WDVWJnnP8o",
+"7fsYMKsjRK","WPmlxuAWyp","yvOMIGXdoH","MGlTFUmaEv","dpe1v4QMc9","ni2v1VerEA","fcJOyQWxoT","dhSuHdmoS7","AIYUuRpBQm","DG4sTDcpWB",
+"VIlwP9eoRc","aDGtSm4bxU","MaJQsC2Irc","d85a9Q6Lix","nnP8oCNHmv","Nxx9V7Ow5C","b29RJ07n1c","uZPqgZv7z0","zqH0WksJby","618Di16lHc",
+"aL6AJVerEA","fmIK1uZPqg","55rfBdmoS7","uTacxydG8U","5ZaEzn8pJ9","0YAGHaFFss","3weIFReKEW","FFDuiChuy3","DQimplH1kt","VIlwPqaofN",
+"dhSuH55rfB","hi5X7hUTw7","vOqCEQ6Lix","yToGW2Yz7E","s93MloGu6x","Pb1palm0pD","pmeCd7ku1p","jeskSzqH0W","lViBvhYBCK","VerEAa00b5",
+"8TxD7lsQGo","QWxoTNcICA","J2mQiMezSW","TXQ0ZaFFss","hYBCKKASQ8","ZJTXHoVQp6","euZA5RsQUq","5ZaEzVerEA","ReKEWHP433","45cIHB3qem",
+"dhSuHdjsrv","Uvlv4SmGzv","jfREu45cIH","m4bxUuN6r3","FNYIMNxx9V","aez9ylXFOB","14FLRksJby","POUYSGXdoH","VjCZqDcpWB","GXdoHBFkb8",
+"pFrrlFjHXR","okgRiJKWYR","piJSk9y4lw","FjHXRS77LH","MmsIociuWz","NhXdusqVrf","RzaZAWPmlx","YOfrYdhSuH","prNT6KZamH","KASQ8iqv4k",
+"faHiruQIcz","oGu6xtjQxs","nlaByiKqhr","TXQ0ZlweGy","lXFOB14FLR","b29RJ2hEEU","JKWYRPb1pa","HP433QWxoT","cQOnvpmeCd","ksJbyGv3Fq",
+"pFrrlfcwDa","fcJOyOUYuF","d85a9tjQxs","7hyVvUvlv4","fqypyhE1Ql","VBjhzazIWp","v1HlncShY2","FhtgltlILt","LewvMzmLYD","uupzkGWqqX",
+"5iGN5l83Ud","VIlwPjeskS","Qworuhe9IA","NOHsznnP8o","n1pmOOz8yZ","zz4ZU8RCUA","s4786uJScX","rhl0J45cIH","DcpWBjfREu","XyPZNFwEJz",
+"t98iWChuy3","aDGtSTXQ0Z","AXpwEBCxeC","StlDJgdQsS","IjTwP0BmCy","tuDyStaOXK","vLsmS9y4lw","RACujgjUTu","9eoRc8RCUA","s478607n1c",
+"RzaZAtl72W","WreyPEoToP","qUJMdzmLYD","n8pJ97fsYM","MezSWCNHmv","5IhmGHlUbF","07n1c1LB1L","d7vjM9eoRc","MmKGJJ2mQi","RACujWmadA",
+"F6PT2uAWyp","jeskSqUJMd","BFkb8qUJMd","5Drn0ECMvU","uLtKs3otm6","QWxoT5IhmG","RsQUq16lHc","OHaBzMezSW","i7WMQVLTy6","cQOnvCxVEf",
+"M6qcGDG4sT","nlaByQworu","OxWIHVBjhz","Uvlv4rz7Ut","LewvMQClRL","JIqXiLewvM","Vprf2Yw2oU","45cIHrz7Ut","GSQwjS77LH","Mm8situDyS",
+"iKqhrChuy3","MezSW5Mg9r","oVQp6ECMvU","VIlwPZzJHW","No0QbfaHir","bgJAzL7cGc","RsQUqAOgEe","lm0pDyToGW","BpYhVTa8f6","azIWpoGu6x",
+"7X3uyiwzGk","2ZHdklj07Q","uZPqgXflUq","1j5L845cIH","EdBKcZJTXH","lpF6WDcpWB","8hJdtFPfSE","GSQwj8cVD3","IKxdL8RCUA","v8yFNEoToP",
+"Uvlv4RzaZA","7fsYMLewvM","KZamHsqVrf","HfyNQfcwDa","CxVEfEdBKc","C2IrcECMvU","cQOnv0BmCy","ciuWzQssNC","9y4lwsuY4x","d7vjMBpYhV",
+"bgJAzn1pmO","ZzJHWvOqCE","B3qemNhXdu","DcpWBNo0Qb","uAWypru4UG","RxrsmJRJQB","aez9yO3iyQ","RpBQmbgJAz","1v5hHsoy9t","faHirAmdQd",
+"3weIFQ6hMC","HlUbF5iGN5","AgJHQ8U2nU","hYBCKd85a9","RkQkejiVBP","QWxoTsuY4x","4W0Tluupzk","Mkgy8Cfgr3","tl72WtlILt","2TRI7s4786",
+"FVMxoSs0Zu","lweGyUlU3M","Chuy3EOE1o","mX2GEru4UG","CIShGHfyNQ","TXQ0Zrhl0J","580YDBbwgA","D6rByjzUqR","aL6AJSjskQ","4QMc9O3iyQ",
+"45cIH48cHL","24ARFpAhR1","MojnPQ6hMC","UlU3MyEfy9","rhl0JzHF1q","X6PintAOsr","QssNCnlaBy","uoStwG1RhS","xciqpCdyBV","Chuy3yToGW",
+"J2mQixciqp","n1pmOiKqhr","B3qemB3qem","YjB9tI7p2a","S77LHLbRTH","qQxHPiqv4k","iwzGkAOgEe","iB08lLewvM","djsrvxXTI4","uvf7A7X3uy",
+"kZANm5Drn0","iKqhrUlU3M","2hEEU9XyT9","JRJQBlsQGo","UlU3MK20wK","CxVEfJXljW","n1pmOvkCHH","8FmFHKr8ys","rhl0JKsjRK","zHF1q2ZHdk",
+"lweGyJkzUn","0KyfsuZPqg","faHirkB5nP","HRxd8618Di","AXpwEx3LDe","DQimps4786","kZANmG1RhS","vkCHHuupzk","dhSuHzmLYD","TwanoZJTXH",
+"2DREs7fsYM","JJs5mfmIK1","14FLRn8pJ9","M6qcG5drc6","UmaEv5Drn0","vkCHHXyPZN","8xEKzhE1Ql","SjskQ5Namm","a00b5EdBKc","ciuWzJRJQB",
+"dhSuHtvdkD","ni2v1gjUTu","7Ow5CFLsph","fqypyciuWz","ThjNn5nmWv","S77LHGrDg7","kB5nPmX2GE","KASQ8Cfgr3","m4bxUv8yFN","VIlwPgf8rI",
+"oQ87rVerEA","zY1GYokgRi","M6qcGI7p2a","uJScXsqVrf","oVQp6GXdoH","cmXIXx3LDe","uTacxdpe1v","C2IrcAOgEe","In3NSuQIcz","5ZaEzChuy3",
+"TXQ0ZhE1Ql","RsQUqPOUYS","Chuy3IKxdL","MaJQsTCgPp","Q6LixIKxdL","Cfgr3faHir","prNT616lHc","Q6Lix5nmWv","8cVD3No0Qb","9XyT9DG4sT",
+"5VZjSfaHir","Z4I1vQbxXc","tuDyShE1Ql","azIWpiKqhr","atef2VNCPd","Kr8yseuZA5","DcpWBxciqp","8RCUAyToGW","CxVEfaFFss","Ss0ZuuN6r3",
+"uJScXn1pmO","VjCZqnFqik","h1zcHnFqik","HlUbFEdBKc","CxVEfZuDtD","8FmFHd7vjM","YjB9ts93Ml","v8yFN5drc6","D6rByvLsmS","pFrrlIKxdL",
+"D6rByHlUbF","uZPqgtAOsr","zmLYDuLtKs","kB5nPQssNC","ydG8UksJby","hE1QlfaHir","BpYhVyToGW","0ao3ljSjS3","OHaBzFnPFB","JIqXizY1GY",
+"Kr8yskZANm","4QMc92Nslm","0h1b1FnPFB","ZUnqtJJs5m","zmLYDiqv4k","I7p2asqVrf","7hyVvStlDJ","fFDrJfLNg8","Yh1hFuJScX","1j5L89y4lw",
+"EdBKcQClRL","RpBQmWaim6","xXTI4yEfy9","HlUbF8U2nU","XyPZNYjB9t","vLsmSG1RhS","MGlTFBpYhV","uAWypSs0Zu","RmDcrRmDcr","lweGy2TRI7",
+"BCxeCqUJMd","dhSuH3otm6","1v5hHrz7Ut","8FmFH9GXkX","lj07QSs0Zu","Zv7z029QAz","KASQ8pFrrl","2DREsvOqCE","LewvMCfgr3","FnPFBgtCA5",
+"blLA9lpF6W","tlILtStlDJ","qQxHPNxx9V","MojnPW3VFH","QChxsqaofN","Mm8siMm8si","9eoRcMkgy8","jtn0Xuupzk","rKDLJMK07Y","rKDLJJ2mQi",
+"5VZjSCfgr3","jzUqRRkQke","4dEz6gjUTu","FVMxolkMUA","v2eC3tlILt","0PktI5ZaEz","lH1ktcQOnv","Yf2EcFGzgp","8FmFHuLtKs","taOXKBGaQY",
+"BpYhVFxX9q","PYBf4a00b5","hSSvQ14FLR","Vprf2pv0i7","618DigIYvE","blLA9FLsph","0ao3lxReec","AmdQdU3yw5","K20wKzmLYD","KsjRKMkgy8",
+"ThjNnJJs5m","J2mQivLsmS","AOgEeRpBQm","blLA92Nslm","SbRYyThjNn","gjUTuC2Irc","P6bcgm4bxU","piJSk5drc6","okgRi0MR5X","2NslmYf2Ec",
+"lm0pDlpF6W","n8pJ90BmCy","jSjS3WreyP","aez9ybrhlQ","HRxd8uvf7A","ydG8UJRJQB","gdQsSCfgr3","pWiOshE1Ql","iwzGkKr8ys","DQimpWreyP",
+"oVQp6hUTw7","M6qcGQworu","FPfSEBpYhV","J2mQi9XyT9","lXFOBGv3Fq","MaJQsPb1pa","FxX9qGrDg7","gtCA55IhmG","Kr8ysy94nw","pT8wu6AFT0",
+"tAOsrRBhp0","yofH3uAWyp","C2IrccmXIX","JkzUnZuDtD","8FmFHVIlwP","jS1ajv1Hln","6q6L9ReKEW","YOfrYWaim6","pFrrljzUqR","uPX7G1j5L8",
+"0YAGHa00b5","580YDfFDrJ","hYBCK0Wr5y","Mm8siKsjRK","FcWrWUmaEv","zY1GYpvgjS","iB08l8TxD7","24ARFGrDg7","5NammI7p2a","GWqqXjiVBP",
+"XflUqJRJQB","CqqaDsoy9t","DG4sTGrDg7","zFgtBSjskQ","24ARFjfREu","FGzgpKr8ys","gf8rIvkCHH","OUYuFSjskQ","618DiQ6hMC","7Ow5CUl4a1",
+"zY1GYECMvU","qaofNlj07Q","oGu6xhe9IA","XyPZN5iGN5","M3zXLMkgy8","CdyBV9iGoT","vOqCE8TxD7","YjB9tfmIK1","Oz8yZBGaQY","F6PT2KsjRK",
+"StlDJZzJHW","5VZjSTCgPp","zFgtBbgJAz","EoToPTa8f6","guMb8cmXIX","QbxXcVNCPd","aFFssn1pmO","ZhwG1tvdkD","3weIFgf8rI","brhlQbZLvS",
+"fmIK1MK07Y","XflUqRzaZA","iKqhrkB5nP","lXFOB7hyVv","nlaBy1v5hH","tAOsrGrDg7","FVMxoRACuj","5drc6FFDui","L7cGcDQimp","pvgjS4dEz6",
+"JKWYRm4bxU","Cp3mZt98iW","dmoS7RpBQm","4dEz6lj07Q","cQOnvyEfy9","CxVEfaez9y","VIlwPulk41","5ZaEzNxx9V","SbRYyCfgr3","0BmCyv2eC3",
+"ni2v1d7vjM","CNHmvydG8U","BFkb8rKDLJ","3otm6NhXdu","JRJQBh1zcH","DG4sTAgJHQ","zz4ZUAmdQd","9rlg95ZaEz","zFgtBgdQsS","RzaZA24ARF",
+"55rfBFLsph","AkKTkJJs5m","RpBQmCIShG","5ZaEz2hEEU","o8UydpT8wu","uTacx1LB1L","JXljW0Kyfs","gf8rIYw2oU","s7Mxk5nmWv","PYBf4jSjS3",
+"K4GS87ku1p","OxWIH07n1c","WmadAW7cTs","ogLgcokgRi","5IhmGoGu6x","blLA9Cfgr3","prNT6DG4sT","jSjS3ZUnqt","ru4UG2DREs","bZLvSksJby",
+"RpBQm6q6L9","C2IrczmLYD","QnJ1S7fKYU","CIShG0Wr5y","F6PT2LbRTH","ZJTXHfcJOy","aDGtSprNT6","9y4lwjtn0X","uoStwnFqik","ix74rB3qem",
+"Cfgr30BmCy","P6bcgqUJMd","t98iWblLA9","S77LHulk41","ogLgc4QMc9","AIYUu29QAz","Vprf2ulk41","lweGyogLgc","okgRiMezSW","aDGtSDQimp",
+"64s8NbZLvS","dhSuHfLNg8","ix74riB08l","4dEz6P6bcg","cL0aEMm8si","dhSuHiwzGk","QWxoTv8yFN","hi5X7ZUnqt","55rfBW3VFH","d7vjM8U2nU",
+"LDk6ffqypy","AmdQdhe9IA","ru4UGv1Hln","9eoRcMmsIo","No0QbNxx9V","O3iyQzQt6Q","pmeCd9eoRc","qaofN07n1c","AIYUuFNYIM","8cVD3fqypy",
+"VIlwPdhSuH","FhtglMmKGJ","I7p2aUvlv4","QChxsK4GS8","SWfou1j5L8","kB5nP0PktI","WPmlxuTacx","cQOnvMmKGJ","fLNg8MezSW","0BmCyVIlwP",
+"kZANmiKqhr","o8Uyd5drc6","U3yw50YAGH","9rlg92Nslm","W7cTsiB08l","uN6r307n1c","uupzkNxx9V","07n1caL6AJ","IjTwPK20wK","VIlwP7ku1p",
+"mz8gxCp3mZ","Gv3FqTa8f6","iKqhrKASQ8","Vprf2s93Ml","4QMc9uPX7G","FjHXRhUTw7","xciqpSWfou","BbwgAQbxXc","v2eC3QYxC0","QClRLJIqXi",
+"d85a9uPX7G","SmGzvMojnP","VBjhzi7WMQ","Dz1R324ARF","d7vjMSbRYy","0BmCybrhlQ","5Drn02Yz7E","3otm6lViBv","PYBf4Mm8si","FcWrWBGaQY",
+"WmadAxReec","Yw2oU5iGN5","Yh1hFAgJHQ","hE1Ql0BmCy","5Mg9rzmLYD","OUqFMAgJHQ","AIYUuv2eC3","FnPFBuN6r3","RmDcrHlUbF","OHaBz48cHL",
+"m4bxUS2Dfu","hUTw7F6PT2","XflUqKr8ys","PYBf4MojnP","Ta8f60PktI","RzaZAuvf7A","tvdkD9XyT9","JJs5mSbRYy","uoStwgIYvE","P6bcgSs0Zu",
+"yvOMIpFrrl","JIqXiThjNn","5iGN5tAOsr","8TxD7brhlQ","vOqCEzFgtB","zY1GYd7vjM","vLsmSjS1aj","ReKEWGrDg7","I7p2aY1mC0","B3qemWaim6",
+"618DiuN6r3","VIlwPyEfy9","8xEKzzz4ZU","XyPZNEOE1o","QnJ1SYOfrY","JKWYRuAWyp","dhSuHU3yw5","24ARF3otm6","7fKYUlCMxy","Q6LixY1mC0",
+"UmaEvKZamH","fqypyuPX7G","QbxXcGrDg7","3weIFzFgtB","hYBCKYf2Ec","k85AepFrrl","OxWIH64s8N","tAOsrOxWIH","6AFT0FLsph","QbxXcb29RJ",
+"5iGN5Ta8f6","d7vjMhE1Ql","lkMUATwano","4QMc97ku1p","l83Ud5iGN5","IRh48CdyBV","lH1kt0PktI","Gv3FqKsjRK","jiVBPRkQke","BCxeCLewvM",
+"pFrrlW3VFH","Waim6CNHmv","aFFss1LB1L","xXTI4he9IA","S77LHh1zcH","VjCZquJScX","Z4I1vs7Mxk","UmaEvF6PT2","JXljWGWqqX","KsjRKCIShG",
+"m4bxUcmXIX","pWiOsm4bxU","cmXIXF6PT2","Dz1R3fmIK1","Z4I1vF6PT2","b29RJdjsrv","FcWrWXyPZN","3otm6QWxoT","e6e4zzbIYY","HfyNQFhtgl",
+"RzaZAa00b5","8cVD3M6qcG","zbIYYYh1hF","Gv3FqlpF6W","FnPFB5iGN5","dpe1vS77LH","4QMc9RmDcr","VerEAW3VFH","Uvlv4t98iW","wiHrZTXQ0Z",
+"JkzUnAXpwE","piJSkuLtKs","vOqCEhYBCK","4QMc9gjUTu","WreyPDG4sT","n8pJ9FjHXR","m4bxUqQxHP","i3pyd2ZHdk","jS1ajK4GS8","8FmFHhE1Ql",
+"FNYIMuPX7G","brhlQlH1kt","fFDrJbZLvS","0YAGH7lUXZ","vOqCEpmeCd","FGzgpfFDrJ","gjUTuChuy3","pWiOsVIlwP","Ss0ZuB3qem","JkzUn8U2nU",
+"mz8gx7X3uy","dmoS7ydG8U","LewvMBpYhV","hi5X7GSQwj","CdyBVwDajX","ZhwG1Twano","FnPFBhe9IA","5Nammgf8rI","IRh48yluBx","cQOnv8hJdt",
+"8U2nU5IhmG","h1zcHdpe1v","FPfSEzbIYY","7hyVvRBhp0","h1zcH9iGoT","1LB1LdmoS7","lkMUABCxeC","CqqaDgdQsS","mX2GEFxX9q","Gv3Fqn8pJ9",
+"ciuWzJ2mQi","SjskQVprf2","5IhmGpiJSk","9XyT9NOHsz","Y1mC0zFgtB","m4bxUxXTI4","HzZT8IRh48","F6PT2StlDJ","GrDg78hJdt","CIShGs4786",
+"Cp3mZJRJQB","d7vjMQ6hMC","gf8rIS77LH","7lUXZChuy3","i7WMQ5VZjS","zz4ZUciuWz","4dEz6AIYUu","618DiqaofN","8hJdtsuY4x","FcWrW0Kyfs",
+"RpBQmAOgEe","FFDuiNo0Qb","v1HlnYw2oU","tlILt8xEKz","580YDZzJHW","QworuCp3mZ","Z4I1vIRh48","MGlTFCNHmv","ThjNnjtn0X","ZUnqtv2eC3",
+"iKqhr5ZaEz","7hyVvChuy3","Vprf2uoStw","64s8NwiHrZ","d85a9lm0pD","5NammaFFss","0Wr5yCp3mZ","VNCPdQYxC0","29QAzcL0aE","s7MxkBGaQY",
+"lH1ktZv7z0","he9IAs7Mxk","sx5GlFLsph","14FLRFVMxo","2Yz7ECNHmv","cmXIXtlILt","ZJTXHZUnqt","zY1GYpT8wu","0BmCyfLNg8","580YDqUJMd",
+"uZPqgyvOMI","RsQUqdpe1v","VIlwPIRh48","MK07Y5Drn0","zHF1qCp3mZ","16lHcSmGzv","lm0pDBbwgA","JIqXi8xEKz","a00b5ZzJHW","FnPFBlXFOB",
+"5NammfcJOy","YOfrYJJs5m","0KyfsHlUbF","i7WMQ45cIH","J2mQid85a9","uupzk5nmWv","FVMxoSWfou","4QMc9FjHXR","TwanoTCgPp","euZA5zbIYY",
+"h1zcH2ZHdk","D6rBy9eoRc","Gv3Fquvf7A","nFqikO3iyQ","DLhzMsuY4x","I7p2asoy9t","QworuWDVWJ","Ta8f6QWxoT","t98iWtuDyS","MmKGJbZLvS",
+"dhSuHwDajX","rz7Utd7vjM","uvf7A9eoRc","I7p2av2eC3","Q6hMCFFDui","UlU3M8hJdt","SbRYyogLgc","iB08l0MR5X","tjQxsGWqqX","QYxC0dmoS7",
+"L7cGcYw2oU","7X3uylH1kt","vOqCERmDcr","aFFssVBjhz","OUYuFWreyP","BGaQYjfREu","t59lRZhwG1","RmDcrHP433","IKxdLcmXIX","hE1QlmX2GE",
+"JIqXi5VZjS","Zv7z05iGN5","oQ87rhUTw7","aDGtSlpF6W","t59lRWreyP","pmeCdI7p2a","C2IrcAkKTk","sqVrfIKxdL","55rfBlkMUA","hi5X7oVQp6",
+"hE1QlyofH3","WreyPmX2GE","AmdQdDG4sT","fcwDaEoToP","ZJTXHatef2","WMiS3iKqhr","AkKTkQssNC","nnP8ocQOnv","IKxdLPOUYS","SmGzvpvgjS",
+"FVMxoXflUq","AIYUuPYBf4","cmXIXO3iyQ","cmXIXjSjS3","07n1cCxVEf","hE1QlJXljW","iwzGkKZamH","MaJQsXflUq","8RCUAnFqik","y94nwKASQ8",
+"jfREuQbxXc","8hJdtCfgr3","1j5L8OHaBz","lkMUAXyPZN","cQOnvVLTy6","e6e4zaDGtS","uAWypFGzgp","QworupiJSk","blLA9jS1aj","fFDrJuPX7G",
+"KASQ8WreyP","fcJOyQClRL","9iGoT7Ow5C","TXQ0Z0h1b1","yEfy9yvOMI","FjHXRGv3Fq","jfREuzFgtB","lm0pDEOE1o","RsQUqjiVBP","l83Udh1zcH",
+"4QMc929QAz","Cfgr3zFgtB","BpYhVrz7Ut","zY1GYXflUq","VNCPdRzaZA","2ZHdkDQimp","Mm8siyvOMI","MGlTFHRxd8","KASQ8fFDrJ","JKWYRHP433",
+"FnPFBHzZT8","0ao3lpmeCd","vkCHHFPfSE","CK5W7Gv3Fq","0Wr5yMaJQs","AIYUucQOnv","618DiuJScX","lH1ktIn3NS","8FmFH0Kyfs","soy9tpmeCd",
+"IKxdLYjB9t","GSQwjqQxHP","StlDJNcICA","X6PinFVMxo","QChxs4QMc9","JXljW8RCUA","9rlg9ix74r","zbIYYd7vjM","ogLgczY1GY","3weIFDcpWB",
+"XyPZN2hEEU","KsjRKuLtKs","aez9yciuWz","zz4ZU8xEKz","MmsIo9rlg9","uupzkRxrsm","Q6Lix618Di","b29RJYh1hF","Zv7z0AmdQd","bZLvS9GXkX",
+"uupzk4dEz6","SjskQrhl0J","QnJ1SUl4a1","yofH3O3iyQ","gjUTu55rfB","CqqaD4W0Tl","tuDySiKqhr","9rlg9NOHsz","ciuWzZzJHW","5Mg9rIjTwP",
+"5IhmGdmoS7","IBe8kmz8gx","0h1b1K4GS8","fqypyuZPqg","okgRik85Ae","YOfrYM6qcG","ciuWzQWxoT","48cHLZJTXH","1v5hHbrhlQ","uLtKsfaHir",
+"ogLgcfFDrJ","RmDcruPX7G","TXQ0ZoGu6x","tlILtGXdoH","VIlwPjfREu","sqVrfGWqqX","oQ87r9XyT9","BGaQYl83Ud","KASQ8JRJQB","SjskQx3LDe",
+"CqqaDh1zcH","NAFuwtuDyS","JJs5mJXljW","K4GS8lkMUA","5VZjS2Yz7E","9iGoTwDajX","atef2FNYIM","5Namm8xEKz","GWqqXlm0pD","IRh486q6L9",
+"zFgtB64s8N","JJs5mtlILt","QYxC0cShY2","fFDrJyofH3","lViBvXflUq","CNHmv1j5L8","UmaEvHfyNQ","I7p2a4QMc9","a00b5Q6hMC","VNCPduZPqg",
+"JKWYRb29RJ","v1HlnZzJHW","ECMvUhSSvQ","cShY2vLsmS","lCMxyi3pyd","MmKGJOUqFM","blLA92TRI7","7ku1pRsQUq","mz8gxfLNg8","IjTwPCdyBV",
+"CqqaD8hJdt","I7p2avOqCE","OUYuFa00b5","Yw2oU8cVD3","HRxd8FFDui","ECMvUThjNn","s93MlgjUTu","lH1ktprNT6","AIYUuVBjhz","ZJTXHUl4a1",
+"pmeCdJkzUn","9rlg9d7vjM","Nxx9Vzz4ZU","rz7Ut7Ow5C","Chuy37fKYU","7Ow5CaDGtS","uvf7AFNYIM","Gv3FqOxWIH","D6rByh1zcH","HlUbFXyPZN",
+"d7vjMD6rBy","TCgPplkMUA","M6qcG3weIF","POUYSydG8U","uPX7Giqv4k","uN6r3jzUqR","GSQwjhE1Ql","LewvMogLgc","ix74rpmeCd","fqypyl83Ud",
+"2hEEUk85Ae","OxWIHpAhR1","8xEKzRACuj","AkKTkyvOMI","Cfgr3ZuDtD","gf8rIZJTXH","Cfgr3fqypy","Oz8yZ2hEEU","uLtKsGXdoH","ZuDtD9XyT9",
+"ZUnqtcShY2","jiVBPPOUYS","IKxdLJ2mQi","5Mg9rv8yFN","7fKYUl83Ud","8FmFHYf2Ec","Kr8ysAgJHQ","5drc6pmeCd","uLtKsFVMxo","2ZHdkfcJOy",
+"brhlQAIYUu","a00b5ogLgc","LbRTHxXTI4","FVMxo8U2nU","KZamH8cVD3","AOgEe24ARF","fLNg82Nslm","IBe8kECMvU","oQ87rMojnP","lweGyYh1hF",
+"uLtKsWMiS3","cQOnvvOqCE","DcpWBeuZA5","VNCPdUl4a1","rhl0J24ARF","fcwDav1Hln","gf8rISmGzv","brhlQix74r","4W0TlTCgPp","mz8gxAmdQd",
+"K4GS8pmeCd","UlU3MoQ87r","i3pyd7ku1p","580YDlViBv","5VZjSKsjRK","cShY2jzUqR","cQOnvX6Pin","WreyPzFgtB","MaJQslm0pD","m4bxUqaofN",
+"o8UydSbRYy","sx5GlmX2GE","iqv4kCNHmv","nnP8oQChxs","bgJAzqUJMd","guMb8dQ586","rz7UtzY1GY","DQimpuPX7G","FPfSEIBe8k","YjB9tK20wK",
+"cL0aE5drc6","C2Ircdpe1v","AXpwE16lHc","5drc6ru4UG","aL6AJSbRYy","jzUqRAgJHQ","ThjNnM3zXL","a00b5Yf2Ec","ni2v1e6e4z","pvgjSRpBQm",
+"0PktIazIWp","faHirCdyBV","JkzUnFnPFB","VerEAn8pJ9","5nmWvFnPFB","piJSkC2Irc","QssNCFnPFB","uLtKsuoStw","HRxd84W0Tl","QClRLSbRYy",
+"8FmFHdmoS7","64s8N07n1c","Waim6ZhwG1","64s8NRsQUq","lj07QKsjRK","S2DfueuZA5","t59lRZv7z0","No0QbGSQwj","6q6L9NhXdu","5ZaEzI7p2a",
+"7fKYUFPfSE","M3zXLxReec","n8pJ9pAhR1","RzaZAQnJ1S","7hyVvRzaZA","9rlg9m4bxU","BCxeC4QMc9","4W0Tl8xEKz","uZPqgJJs5m","45cIHbrhlQ",
+"Ta8f6CNHmv","pAhR1taOXK","0BmCyMezSW","Vprf2RkQke","m4bxUs93Ml","jSjS38hJdt","StlDJJkzUn","qQxHPiwzGk","jtn0XNo0Qb","IjTwPCIShG",
+"pvgjSQWxoT","24ARFsoy9t","RBhp0jiVBP","hE1QlZJTXH","Gv3Fqsx5Gl","1j5L8VLTy6","CIShGfcwDa","gtCA5VNCPd","7Ow5CW7cTs","yluBxOxWIH",
+"FFDuiqUJMd","QYxC0jfREu","k85AeCNHmv","yluBxogLgc","55rfBlpF6W","Cfgr3tl72W","CqqaDXflUq","MojnPdpe1v","nlaByZv7z0","fFDrJ0YAGH",
+"tAOsrhi5X7","WreyPni2v1","fmIK129QAz","ix74r64s8N","HfyNQ0h1b1","5drc6FPfSE","pmeCd7Ow5C","ksJbywiHrZ","lCMxygjUTu","VNCPdReKEW",
+"9iGoT5Drn0","gf8rIgtCA5","LewvMYjB9t","gtCA5GXdoH","9iGoTdQ586","6AFT0KsjRK","euZA5kZANm","QnJ1S1LB1L","yvOMIxReec","JJs5muoStw",
+"618DiwDajX","Yf2EcEoToP","dmoS7iKqhr","14FLRNhXdu","wDajXfqypy","n1pmO3weIF","o8UydaFFss","Uvlv4ZJTXH","29QAzfcJOy","MK07YQYxC0",
+"O3iyQ4W0Tl","lCMxyMmsIo","OUYuFRzaZA","aL6AJblLA9","OUYuFVprf2","lsQGoW7cTs","8cVD3EdBKc","MojnPtAOsr","HlUbFni2v1","L7cGcsoy9t",
+"jSjS3taOXK","FLsphuvf7A","BFkb8JXljW","s7Mxk7lUXZ","rhl0J1j5L8","mz8gxtaOXK","VIlwPMGlTF","5VZjSSjskQ","MGlTFMkgy8","IKxdL0YAGH",
+"guMb8suY4x","qaofNydG8U","C2Irc580YD","07n1cnnP8o","VjCZqSjskQ","In3NSpFrrl","SbRYyMkgy8","o8Uyduupzk","yofH3EoToP","GSQwjjfREu",
+"NOHszUlU3M","I7p2acQOnv","nlaByRxrsm","I7p2afqypy","BCxeCmX2GE","Kr8ysPOUYS","8FmFHWMiS3","vkCHHuTacx","h1zcHJJs5m","DQimpFhtgl",
+"M6qcGpmeCd","piJSk8U2nU","9eoRcK20wK","KsjRKlm0pD","t98iW0BmCy","blLA9AkKTk","taOXKKASQ8","MaJQshi5X7","6AFT0BbwgA","Ta8f6yvOMI",
+"07n1chE1Ql","oVQp65iGN5","mz8gxRmDcr","CqqaD29QAz","FjHXRK20wK","I7p2aHRxd8","FPfSElViBv","LbRTHh1zcH","DLhzMt59lR","W7cTszmLYD",
+"8U2nU24ARF","9XyT9580YD","CIShGFFDui","RACujKsjRK","fcwDax3LDe","Mkgy85VZjS","jiVBP7fsYM","VNCPd5ZaEz","9eoRcMK07Y","v8yFNoVQp6",
+"oVQp6pv0i7","KASQ8h1zcH","iKqhrpvgjS","UmaEvprNT6","wDajXAmdQd","FFDuiAgJHQ","zbIYYFPfSE","48cHLaFFss","FwEJzBCxeC","0KyfsblLA9",
+"tuDyS5nmWv","In3NSPb1pa","xciqplj07Q","X6PinzbIYY","AXpwEd7vjM","RsQUqnlaBy","AOgEe9rlg9","GrDg7lH1kt","O3iyQQChxs","Yw2oU48cHL",
+"X6Pink85Ae","yToGWyvOMI","4dEz62Nslm","0KyfsjzUqR","ydG8UiwzGk","NhXduVjCZq","0Wr5yfqypy","GSQwjoGu6x","suY4xdpe1v","XyPZN580YD",
+"iKqhrl83Ud","64s8NpiJSk","uTacx7Ow5C","16lHctaOXK","AmdQdRxrsm","jfREuMmKGJ","oVQp6ZuDtD","WDVWJFLsph","14FLRK20wK","atef2ThjNn",
+"QClRLQYxC0","xciqpWaim6","VjCZqzFgtB","0ao3lM6qcG","qQxHPUl4a1","FnPFBxXTI4","6q6L9I7p2a","dmoS7oQ87r","CxVEfL7cGc","G1RhSY1mC0",
+"fFDrJIn3NS","xReecrhl0J","piJSkQYxC0","64s8N7Ow5C","nFqikRxrsm","nnP8oFFDui","P6bcg7Ow5C","QssNCuvf7A","okgRi9y4lw","DG4sTWaWsv",
+"cmXIXbZLvS","IBe8kFxX9q","Oz8yZFFDui","oQ87rVNCPd","n1pmOhYBCK","LewvMfLNg8","0ao3lUlU3M","i7WMQt98iW","RmDcrjiVBP","CxVEfxReec",
+"CdyBVhE1Ql","tlILtDQimp","M6qcG0Kyfs","tl72WNo0Qb","AkKTkMmKGJ","xXTI4d85a9","48cHLCxVEf","29QAzuLtKs","8cVD3Z4I1v","iB08lVLTy6",
+"K4GS8BGaQY","QbxXcCxVEf","jS1ajzbIYY","RzaZAHlUbF","d85a9s4786","Nxx9VzmLYD","zY1GYl83Ud","MK07YVLTy6","yluBxQWxoT","vLsmSAkKTk",
+"KZamHvLsmS","iwzGkv1Hln","WDVWJCqqaD","8xEKzWPmlx","OUqFMLewvM","618Di0Kyfs","JIqXilm0pD","s7MxkThjNn","JkzUnulk41","djsrvd85a9",
+"tjQxsyluBx","7fKYUnFqik","piJSk9iGoT","Mm8siRpBQm","MmsIo8U2nU","DQimpfmIK1","ni2v1DLhzM","0PktIQworu","45cIHd7vjM","7fKYU8U2nU",
+"QssNCjSjS3","AmdQd0ao3l","FwEJzn1pmO","xReecCNHmv","jtn0Xi3pyd","RACujsx5Gl","oGu6xFxX9q","oGu6xStlDJ","7fKYUjS1aj","JIqXiNOHsz",
+"Q6LixjzUqR","suY4x5Drn0","AgJHQ5Namm","ogLgc16lHc","uAWyphYBCK","Z4I1vguMb8","kZANmtlILt","EOE1o5IhmG","AgJHQWaim6","2ZHdkMK07Y",
+"uQIcz55rfB","POUYSO3iyQ","VLTy6FjHXR","7fKYU29QAz","lViBv6q6L9","OxWIHjS1aj","Y1mC0GXdoH","WaWsvMmsIo","S2DfuNOHsz","CNHmvt59lR",
+"aFFss2hEEU","fmIK1Cfgr3","Ul4a1BGaQY","uN6r324ARF","yEfy9vLsmS","IBe8k45cIH","pT8wu9eoRc","zmLYD1v5hH","Y1mC0UlU3M","jfREulkMUA",
+"In3NSuvf7A","jiVBP4dEz6","YjB9tl83Ud","WmadADLhzM","9iGoTAOgEe","lpF6WJKWYR","4W0TlpWiOs","DG4sTvOqCE","qaofNWaWsv","HfyNQJRJQB",
+"XyPZNSWfou","lm0pD7fsYM","AIYUuX6Pin","SWfourz7Ut","tvdkDZuDtD","9GXkXSjskQ","okgRih1zcH","fFDrJuQIcz","vkCHHlCMxy","5IhmGgjUTu",
+"zY1GYAgJHQ","DG4sTOUYuF","fmIK1iqv4k","FwEJz5Mg9r","i3pydOUYuF","zmLYDyluBx","Mkgy8AXpwE","e6e4z5Namm","blLA95IhmG","zFgtBlH1kt",
+"WmadASmGzv","GSQwjIjTwP","Uvlv4HzZT8","jtn0XcQOnv","0Wr5yzFgtB","1j5L8P6bcg","sx5GluPX7G","JXljW64s8N","FLsph2ZHdk","NhXduyofH3",
+"l83UdxReec","d85a9v8yFN","i7WMQjfREu","5drc6he9IA","tlILtnlaBy","7fKYUIn3NS","ZuDtDRzaZA","d85a945cIH","hSSvQ9rlg9","n1pmOJIqXi",
+"BFkb8v2eC3","Yw2oUKsjRK","5IhmG5iGN5","14FLRiB08l","FGzgpUmaEv","v1HlnpWiOs","qaofNyvOMI","uLtKs4W0Tl","QClRLFVMxo","aez9yydG8U",
+"GrDg7mX2GE","POUYSdhSuH","ix74rbrhlQ","soy9tjS1aj","2NslmksJby","2ZHdkB3qem","2ZHdkbZLvS","pFrrlWMiS3","fFDrJJ2mQi","J2mQiJRJQB",
+"nlaByydG8U","nlaByYOfrY","atef2UlU3M","5Mg9rprNT6","7fKYUFjHXR","MK07Y5Mg9r","gjUTuDQimp","lpF6W7ku1p","JRJQBFFDui","RkQkeSWfou",
+"n8pJ9GSQwj","fFDrJ5drc6","uvf7AS2Dfu","uPX7GCp3mZ","uvf7A3otm6","oVQp6Chuy3","5ZaEzCqqaD","2DREs0BmCy","TwanoiKqhr","zFgtBoGu6x",
+"tl72WnnP8o","nnP8ooGu6x","J2mQiQChxs","RmDcrd7vjM","hi5X7ZJTXH","lkMUA2hEEU","aDGtSgdQsS","Pb1pauoStw","CNHmvFGzgp","WreyPVNCPd",
+"VIlwPlweGy","dhSuHprNT6","lpF6WWMiS3","t98iWmX2GE","L7cGcmX2GE","CqqaDnlaBy","mz8gx5nmWv","lCMxyQbxXc","MmsIoWreyP","WmadAAgJHQ",
+"OHaBzAgJHQ","Z4I1vM3zXL","ciuWz9iGoT","lsQGoOz8yZ","tjQxsv2eC3","okgRiRACuj","EOE1oVjCZq","7fKYUi3pyd","vkCHHChuy3","djsrvhUTw7",
+"b29RJRACuj","y94nwFjHXR","OUqFMfcJOy","atef2taOXK","JkzUnmX2GE","IRh48jSjS3","gIYvEW3VFH","uTacxzqH0W","4QMc945cIH","2NslmOUqFM",
+"FnPFBQ6Lix","RpBQmGrDg7","e6e4zFnPFB","5ZaEzStlDJ","gdQsS8FmFH","FFDuiStlDJ","2ZHdkAgJHQ","Dz1R3uPX7G","580YDYf2Ec","NAFuwpAhR1",
+"LDk6fU3yw5","a00b55VZjS","jfREu1LB1L","NAFuwYw2oU","W3VFHWDVWJ","RsQUqxXTI4","1v5hHJJs5m","No0QbReKEW","55rfBuoStw","G1RhS14FLR",
+"UmaEvv8yFN","F6PT2DQimp","ksJbygjUTu","Dz1R32hEEU","aez9ywDajX","HP4335drc6","tAOsrs93Ml","iB08lMmsIo","LDk6fwiHrZ","M3zXLjiVBP",
+"Chuy39eoRc","cL0aEHRxd8","x3LDedQ586","xciqps93Ml","ksJbyCdyBV","TXQ0ZOHaBz","G1RhSKASQ8","2DREsUl4a1","d7vjMjSjS3","X6PinLewvM",
+"a00b5azIWp","0MR5XSjskQ","IjTwP64s8N","uLtKsix74r","J2mQiIjTwP","h1zcHxXTI4","IKxdLMK07Y","m4bxUVprf2","14FLRPOUYS","RsQUqs4786",
+"OxWIHZUnqt","iqv4k5ZaEz","sqVrffLNg8","MK07YAmdQd","dpe1vd7vjM","tl72Wlm0pD","aDGtSvLsmS","0ao3lKZamH","lViBvCxVEf","guMb8MmKGJ",
+"2DREsVprf2","fmIK1ogLgc","55rfBbZLvS","Yf2EcThjNn","ECMvUlViBv","VjCZqChuy3","WaWsvMmKGJ","cShY2Oz8yZ","CqqaD5VZjS","DcpWBOUYuF",
+"jSjS30h1b1","618Diaez9y","jiVBPBpYhV","jiVBPo8Uyd","O3iyQjtn0X","S77LH6AFT0","Uvlv4tuDyS","hE1Ql5drc6","AkKTkLbRTH","rhl0JVLTy6",
+"vOqCEiKqhr","cL0aEZ4I1v","lXFOB8xEKz","Chuy3In3NS","LbRTHFVMxo","RkQkeSs0Zu","WDVWJfFDrJ","fLNg8S2Dfu","YOfrYvkCHH","DLhzM6q6L9",
+"MmsIoJRJQB","e6e4z1v5hH","MaJQs618Di","xciqpFnPFB","yofH3Pb1pa","1j5L8SbRYy","IRh48RBhp0","Vprf2taOXK","guMb8nlaBy","U3yw52Nslm",
+"jtn0XOz8yZ","zbIYYJKWYR","rz7UtWaWsv","fqypy6AFT0","wiHrZNAFuw","2hEEUM6qcG","WMiS3azIWp","jtn0XRpBQm","HP433fcJOy","zz4ZUcmXIX",
+"Y1mC0Mm8si","NhXdu7fKYU","HlUbFW3VFH","0ao3lThjNn","pmeCduQIcz","ydG8UCp3mZ","MaJQsBbwgA","s47864QMc9","J2mQiOUqFM","blLA914FLR",
+"G1RhSs4786","5ZaEzFnPFB","Waim6AXpwE","NAFuwb29RJ","VNCPdYjB9t","ZhwG1lm0pD","yluBxRmDcr","FxX9qlViBv","45cIHiqv4k","0ao3lpv0i7",
+"3weIFSWfou","BGaQY8RCUA","d85a9WPmlx","4W0Tl2TRI7","ciuWzcShY2","Yh1hFNcICA","oQ87rKZamH","0ao3lYh1hF","Pb1paThjNn","iB08l8xEKz",
+"vOqCEBFkb8","AXpwEZhwG1","W7cTsAmdQd","pFrrl0Wr5y","8hJdtWreyP","RmDcrs4786","K20wKTa8f6","VjCZq7ku1p","jiVBPlkMUA","uN6r35Mg9r",
+"zmLYDb29RJ","WaWsvRACuj","PYBf48RCUA","b29RJe6e4z","hi5X78FmFH","TXQ0ZydG8U","Gv3FqbrhlQ","s93MlRkQke","wiHrZ29QAz","qaofNjtn0X",
+"RkQkeni2v1","ulk410PktI","v1HlnwiHrZ","taOXK2TRI7","EOE1oJXljW","DQimpAkKTk","QbxXc7hyVv","o8UydcmXIX","lpF6Wrz7Ut","lsQGoPYBf4",
+"Cp3mZTwano","9GXkXDG4sT","VLTy69y4lw","WmadAatef2","DLhzMpT8wu","Uvlv4WMiS3","FPfSEAgJHQ","t98iW2Nslm","4W0Tl5VZjS","SmGzvCIShG",
+"SmGzvv2eC3","RACujX6Pin","jS1aj4dEz6","ReKEWFVMxo","ECMvUJKWYR","RzaZAChuy3","s93Mlix74r","cmXIXOxWIH","o8UydOUqFM","ni2v1VIlwP",
+"QworuQWxoT","RmDcryofH3","KASQ8okgRi","RBhp0fqypy","MojnPbZLvS","fFDrJHlUbF","3weIFlViBv","yluBx0h1b1","zmLYDgIYvE","Yw2oUYw2oU",
+"uQIczWaWsv","2TRI7OUqFM","uAWypb29RJ","CqqaDsuY4x","aFFssAgJHQ","OUYuFbrhlQ","JXljWaL6AJ","NhXduiB08l","FcWrWgIYvE","0KyfsRsQUq",
+"tvdkDWmadA","blLA9fmIK1","qQxHPoVQp6","zbIYYDQimp","rz7UtAkKTk","e6e4zgjUTu","ulk41jzUqR","Mm8sio8Uyd","guMb84W0Tl","FjHXRYh1hF",
+"h1zcHGWqqX","hi5X7rz7Ut","cmXIXKZamH","vLsmSuupzk","G1RhSBGaQY","o8Uyd2hEEU","gIYvEBbwgA","v8yFN8xEKz","aez9ySjskQ","mz8gx8U2nU",
+"7ku1p8FmFH","taOXKvLsmS","yToGW0BmCy","cL0aEAkKTk","gtCA5iKqhr","SmGzvYjB9t","64s8NjS1aj","F6PT2IKxdL","euZA5HfyNQ","jzUqRFwEJz",
+"IBe8kvkCHH","zmLYDrhl0J","KsjRKpT8wu","8FmFHDz1R3","y94nw3otm6","580YD0h1b1","MGlTFx3LDe","B3qemhUTw7","JXljWv1Hln","HfyNQ45cIH",
+"DG4sTM6qcG","tjQxsCqqaD","0Wr5y2hEEU","he9IAokgRi","TwanocL0aE","9eoRcSmGzv","lH1ktVprf2","YjB9t6AFT0","W7cTsIjTwP","azIWp6AFT0",
+"D6rBy9rlg9","GSQwj0Wr5y","nlaByd85a9","hYBCKjS1aj","x3LDemz8gx","qQxHPFNYIM","hUTw7FwEJz","pmeCdRxrsm","gtCA5a00b5","QYxC0qUJMd",
+"S2DfuYjB9t","yluBxFGzgp","Gv3FqDz1R3","iB08lmX2GE","9GXkX5nmWv","yvOMI0Kyfs","IjTwPt98iW","9eoRcM3zXL","WDVWJ29QAz","1j5L8xReec",
+"ix74r0YAGH","55rfBRpBQm","aFFssKsjRK","cmXIXsx5Gl","qQxHPAXpwE","RkQkepmeCd","24ARF8cVD3","aFFssRkQke","0h1b148cHL","tvdkDM6qcG",
+"7ku1pW3VFH","Q6hMCRsQUq","azIWpX6Pin","uPX7Guupzk","yvOMIJ2mQi","Ta8f6MaJQs","Uvlv4iwzGk","m4bxUNcICA","J2mQiokgRi","HfyNQhUTw7",
+"IBe8kWPmlx","hYBCKOUqFM","fqypyKsjRK","LewvMGXdoH","i3pydzmLYD","FVMxoO3iyQ","uPX7GAOgEe","ZUnqtyEfy9","BGaQY4QMc9","MGlTF5ZaEz",
+"JkzUnlpF6W","ru4UG5Namm","OHaBzTwano","vLsmSaez9y","U3yw5QClRL","he9IAeuZA5","AkKTkogLgc","uTacxzbIYY","F6PT2n1pmO","7X3uyuZPqg",
+"7Ow5CuAWyp","3otm6Yh1hF","qaofN2Nslm","v1Hln5ZaEz","Uvlv4brhlQ","CK5W7lH1kt","jzUqRaez9y","Yw2oUciuWz","4dEz67Ow5C","hi5X7CK5W7",
+"uLtKs5drc6","ZUnqtjzUqR","45cIH1v5hH","8cVD3prNT6","AkKTkfLNg8","FFDuiyluBx","Mm8sijeskS","FPfSExXTI4","pvgjSFhtgl","dQ586SbRYy",
+"t59lRrz7Ut","tAOsr5iGN5","uoStwMojnP","rhl0JJXljW","piJSkHlUbF","PYBf44W0Tl","QWxoTJJs5m","NcICAZhwG1","Ul4a1FwEJz","7ku1pqUJMd",
+"BGaQYfmIK1","HzZT8KsjRK","yofH3oQ87r","aDGtSiB08l","MezSWcmXIX","ksJbyogLgc","jzUqRPb1pa","lsQGox3LDe","MmKGJ8TxD7","LewvM7Ow5C",
+"qQxHP7lUXZ","8U2nUJRJQB","FLsphuoStw","Mm8sioVQp6","FhtglKsjRK","VLTy6fcwDa","jtn0XOUqFM","RBhp0fcwDa","XflUqoGu6x","C2IrcxXTI4",
+"s7Mxkpv0i7","64s8NWDVWJ","gtCA5K20wK","9y4lwuZPqg","FFDuitlILt","2hEEUK20wK","MmsIoHzZT8","vLsmSFPfSE","J2mQiKASQ8","iB08lPYBf4",
+"dmoS70ao3l","tjQxsl83Ud","5iGN5hSSvQ","OHaBzCK5W7","FxX9qyToGW","dhSuHQChxs","yofH3bZLvS","piJSk3weIF","Yh1hFGv3Fq","pv0i7ydG8U",
+"AOgEeAkKTk","cL0aEGSQwj","lXFOBS77LH","POUYS45cIH","ni2v1RBhp0","7hyVvkB5nP","MezSWrKDLJ","zbIYYfmIK1","OUYuFIn3NS","sqVrf580YD",
+"uQIczFLsph","tl72WMojnP","Dz1R3dhSuH","ulk41C2Irc","sqVrfYf2Ec","jSjS31j5L8","lpF6WlViBv","pWiOsulk41","Rxrsm3weIF","zQt6Q3otm6",
+"Nxx9Viqv4k","h1zcH7hyVv","FwEJzRsQUq","JkzUnLDk6f","5VZjSAgJHQ","8RCUAMmKGJ","QworuGWqqX","ydG8UB3qem","hi5X7pvgjS","RmDcrXflUq",
+"nnP8ouJScX","vkCHHKASQ8","TXQ0ZNcICA","AmdQd3otm6","aez9yqaofN","oVQp6EoToP","qaofNqQxHP","9GXkX5drc6","0ao3ls93Ml","djsrvpT8wu",
+"9iGoTogLgc","5NammVerEA","zz4ZUWPmlx","mX2GEuvf7A","TCgPpIKxdL","azIWpO3iyQ","RzaZAn8pJ9","uvf7AuN6r3","G1RhSRACuj","MK07YrKDLJ",
+"Yh1hFogLgc","P6bcgrz7Ut","cQOnvaDGtS","nnP8otjQxs","WreyPOUqFM","Cfgr3brhlQ","6q6L90MR5X","uTacx5iGN5","FLsphzbIYY","tuDySzFgtB",
+"d7vjMpvgjS","jSjS3iKqhr","B3qemkB5nP","0Wr5yhYBCK","jzUqRix74r","OUqFMmz8gx","GWqqXAIYUu","ydG8U4W0Tl","lpF6Wlm0pD","8TxD7VNCPd",
+"fFDrJGWqqX","Waim6ksJby","pv0i7o8Uyd","fFDrJd7vjM","he9IAF6PT2","tlILtaFFss","lXFOB3otm6","FPfSEpAhR1","RBhp01v5hH","QworuNcICA",
+"YOfrYtl72W","DQimplViBv","tjQxsZzJHW","CdyBVb29RJ","a00b5t59lR","VLTy68hJdt","5nmWvIjTwP","uAWypFnPFB","NhXdu5ZaEz","fcwDaIKxdL",
+"Zv7z0CNHmv","4dEz6ru4UG","hYBCKuupzk","zbIYYYf2Ec","hSSvQEOE1o","pmeCdWreyP","s93MlRmDcr","zFgtBNhXdu","AgJHQCqqaD","soy9tZhwG1",
+"lsQGo0PktI","0Wr5yDcpWB","6AFT0QWxoT","VLTy6yToGW","uJScXGrDg7","iB08lFPfSE","FPfSE0MR5X","AXpwEs7Mxk","iwzGkWDVWJ","0BmCyDQimp",
+"BbwgA3weIF","2DREsMmKGJ","MezSWW7cTs","i3pydYh1hF","X6PinCqqaD","jzUqRMGlTF","azIWpIjTwP","JIqXizbIYY","4QMc96q6L9","FGzgpdpe1v",
+"aez9yhE1Ql","580YDQClRL","AgJHQ7ku1p","DLhzM0Wr5y","5nmWvCK5W7","cShY2he9IA","1j5L80BmCy","RsQUqFcWrW","Vprf2Z4I1v","5drc6VerEA",
+"guMb8zz4ZU","dQ586jfREu","h1zcHDQimp","n8pJ9HlUbF","fqypyoGu6x","Ta8f614FLR","wiHrZW3VFH","DcpWB0h1b1","uZPqgFNYIM","jfREuBbwgA",
+"5VZjSCIShG","tuDySRmDcr","5nmWvSbRYy","MojnPgIYvE","ZhwG155rfB","s93Ml5Namm","FVMxo2hEEU","K4GS8UmaEv","mz8gxU3yw5","EOE1otvdkD",
+"NAFuwtvdkD","ix74r0MR5X","blLA9ciuWz","fmIK1WmadA","n1pmOtAOsr","9eoRcfmIK1","MGlTFaL6AJ","pT8wuQYxC0","BCxeCDQimp","pvgjSCK5W7",
+"7fKYU16lHc","2Yz7ETCgPp","d7vjMcQOnv","JkzUnh1zcH","Zv7z0Oz8yZ","JkzUnIRh48","jiVBPwiHrZ","IBe8kpmeCd","SmGzv618Di","0ao3l8RCUA",
+"5drc68cVD3","Nxx9VRzaZA","zFgtBQ6Lix","lViBve6e4z","07n1cpWiOs","LewvMOUYuF","5Drn0kZANm","FFDui24ARF","9rlg9aL6AJ","9iGoT2Nslm",
+"SbRYylH1kt","No0QblCMxy","Chuy3n8pJ9","SjskQOHaBz","5Namm4dEz6","kZANmulk41","MGlTFCp3mZ","pWiOsfqypy","EoToPdpe1v","lj07QCxVEf",
+"0BmCylH1kt","IjTwPlViBv","M3zXLDQimp","StlDJsqVrf","8xEKzGSQwj","pWiOsvLsmS","fFDrJ7X3uy","Yf2Ec5ZaEz","fmIK1VerEA","gtCA5Cp3mZ",
+"Kr8ys2Nslm","5IhmGlm0pD","tlILtUlU3M","YjB9tsx5Gl","gIYvEFhtgl","qUJMd2Nslm","HfyNQNo0Qb","yluBx5drc6","Mkgy8lViBv","pFrrlhE1Ql",
+"zbIYYCp3mZ","X6Pint59lR","gf8rIdhSuH","uvf7AqUJMd","5nmWv8FmFH","YOfrY7fKYU","QbxXcHP433","e6e4z5nmWv","dmoS7zbIYY","qaofNJIqXi",
+"4dEz6qUJMd","7hyVvOxWIH","pmeCdfLNg8","C2IrcB3qem","Zv7z0FnPFB","djsrveuZA5","4QMc97X3uy","okgRi2TRI7","bZLvSSWfou","atef2pT8wu",
+"MezSWe6e4z","iwzGkIKxdL","QnJ1SfcwDa","dQ586Oz8yZ","DG4sTQClRL","K4GS8GXdoH","iqv4kdQ586","IRh48euZA5","Mkgy8POUYS","JKWYRFNYIM",
+"yToGWRxrsm","AXpwEThjNn","7fsYMIjTwP","BGaQYuLtKs","I7p2aJKWYR","s7MxkNhXdu","hYBCKn8pJ9","0ao3lWPmlx","VjCZqIjTwP","6q6L9WPmlx",
+"vkCHHMezSW","MaJQsyEfy9","8TxD7gdQsS","C2IrcFLsph","MmsIobrhlQ","HfyNQl83Ud","AIYUuWPmlx","EdBKczz4ZU","QnJ1SciuWz","iKqhrb29RJ",
+"Q6LixpWiOs","WMiS3Yf2Ec","RkQkevLsmS","7Ow5C7X3uy","WmadAGXdoH","iqv4k0YAGH","RACujSjskQ","ZzJHWYh1hF","Chuy3YjB9t","7ku1puPX7G",
+"2Yz7E4QMc9","5NammFcWrW","uPX7GRACuj","zHF1qqQxHP","FVMxouAWyp","euZA5LDk6f","KASQ8l83Ud","zHF1qdjsrv","ix74rcL0aE","AmdQdpiJSk",
+"qaofNzbIYY","EOE1oaez9y","Zv7z0ix74r","WMiS3jzUqR","qaofNB3qem","tuDySJRJQB","LewvMgtCA5","VjCZqQworu","POUYSfqypy","8RCUAv8yFN",
+"4W0TlLDk6f","lXFOB5Namm","GrDg7RACuj","24ARFjiVBP","v8yFNKr8ys","SjskQyEfy9","618DiUl4a1","uTacxuTacx","i7WMQeuZA5","piJSksoy9t",
+"nFqika00b5","pAhR1xReec","5NammAXpwE","bZLvSyToGW","yluBxSmGzv","NhXduazIWp","xciqpokgRi","W3VFH5IhmG","rz7UtuN6r3","5iGN5HfyNQ",
+"nlaBy9eoRc","JKWYRkZANm","pAhR1zY1GY","yvOMImX2GE","16lHcOUYuF","Ta8f6qUJMd","Pb1pasoy9t","ru4UGksJby","zY1GYdjsrv","24ARFU3yw5",
+"XflUquN6r3","jtn0XokgRi","ni2v1GSQwj","yvOMItaOXK","QWxoThSSvQ","rKDLJ2Nslm","cmXIXfFDrJ","i7WMQzY1GY","SmGzvVLTy6","QClRLwiHrZ",
+"lXFOBVIlwP","OUqFMYjB9t","FnPFBDQimp","yvOMIlweGy","DcpWB5nmWv","5Drn0ulk41","Cp3mZyluBx","HlUbFv2eC3","SWfouMaJQs","s7MxklViBv",
+"16lHcbgJAz","Zv7z0v1Hln","i3pydTCgPp","JkzUnjfREu","4dEz6taOXK","ThjNnxciqp","gf8rIqUJMd","W3VFHSbRYy","WDVWJMkgy8","DcpWB5ZaEz",
+"QYxC00BmCy","ReKEWWaWsv","VLTy6GXdoH","WreyPJkzUn","XflUqKsjRK","cQOnvFNYIM","blLA97hyVv","OUYuFix74r","Q6hMClCMxy","n8pJ9FGzgp",
+"PYBf4BCxeC","9rlg9tlILt","hYBCKvOqCE","tvdkDF6PT2","dpe1vaFFss","wiHrZ2hEEU","pv0i7t98iW","Oz8yZfmIK1","WMiS32DREs","5iGN5yluBx",
+"jS1ajuLtKs","kB5nPBFkb8","jiVBP5IhmG","RxrsmTCgPp","FVMxobgJAz","U3yw5RsQUq","rz7UtksJby","JJs5m8hJdt","pT8wu0YAGH","Q6hMCd85a9",
+"5Namm9y4lw","D6rBytl72W","DcpWBlpF6W","7Ow5CECMvU","ZJTXHjtn0X","lj07QIRh48","LewvMuLtKs","QYxC0RBhp0","JRJQBQWxoT","Chuy3X6Pin",
+"prNT6UlU3M","TCgPpZ4I1v","aDGtS5Drn0","EOE1oSs0Zu","tjQxsv1Hln","FnPFBaL6AJ","nnP8oSbRYy","NcICAZuDtD","Waim6vOqCE","mX2GEL7cGc",
+"cShY2KZamH","Pb1pauupzk","RkQkecmXIX","ZuDtDD6rBy","IBe8kaFFss","9iGoTn8pJ9","ReKEW9GXkX","VLTy6NOHsz","s7MxkMezSW","5ZaEzFGzgp",
+"FnPFBtuDyS","JIqXihYBCK","Oz8yZOUYuF","SjskQhe9IA","cL0aEtAOsr","lViBvVLTy6","5Drn0MmsIo","jfREulpF6W","b29RJHfyNQ","xReecb29RJ",
+"o8UydpvgjS","a00b5GSQwj","dQ5866q6L9","yluBxDz1R3","uupzk5Mg9r","vkCHHFcWrW","zmLYDBCxeC","2Yz7EOUqFM","AmdQdCqqaD","RzaZAqUJMd",
+"3weIFhE1Ql","atef2s7Mxk","VIlwPhSSvQ","djsrvMm8si","8hJdttl72W","0Wr5yDLhzM","Chuy3piJSk","5nmWvC2Irc","mz8gxMezSW","JJs5mQYxC0",
+"16lHcni2v1","MmKGJS2Dfu","iqv4kFcWrW","Mkgy8s7Mxk","t98iWKr8ys","580YDRxrsm","v1Hlngf8rI","0Wr5yJRJQB","jfREuCK5W7","QssNCF6PT2",
+"cShY2AOgEe","0PktI0Kyfs","K20wK5IhmG","ZuDtDRmDcr","QYxC0K20wK","wiHrZulk41","SWfouv8yFN","tAOsrk85Ae","CK5W7fcJOy","GSQwj0PktI",
+"RkQkeyvOMI","AOgEeMmsIo","zbIYYvLsmS","v2eC3DQimp","he9IA5Mg9r","SjskQJXljW","lm0pD0h1b1","MmKGJnnP8o","5Mg9raL6AJ","VNCPdlkMUA",
+"7X3uyI7p2a","FLspht59lR","XyPZN3otm6","n8pJ9hUTw7","Nxx9VGrDg7","BbwgAHRxd8","xReecEOE1o","Q6hMCjtn0X","guMb8EOE1o","DQimpMezSW",
+"ydG8U3otm6","dpe1v4W0Tl","QssNC9rlg9","VIlwPZ4I1v","IjTwPksJby","LDk6fCNHmv","S2DfutuDyS","uupzkGSQwj","45cIHatef2","pWiOsS77LH",
+"1LB1LTa8f6","UmaEvSs0Zu","VLTy62TRI7","s7MxkaFFss","gjUTuQClRL","SbRYyCNHmv","QnJ1S618Di","L7cGcvkCHH","FxX9q5nmWv","Ul4a1fqypy",
+"cQOnvuN6r3","FLsph1v5hH","l83UdazIWp","hYBCKZuDtD","6q6L9pWiOs","Kr8ystlILt","hYBCKsqVrf","qUJMdtuDyS","hE1QlS2Dfu","FLsphjzUqR",
+"IKxdLiKqhr","uPX7GMGlTF","J2mQilm0pD","zHF1qHP433","AgJHQtuDyS","yvOMIsoy9t","Cp3mZFxX9q","DLhzMRxrsm","t98iWpiJSk","AIYUuzbIYY",
+"QYxC06AFT0","lpF6WDQimp","MmKGJ8U2nU","M6qcG9iGoT","Y1mC0oVQp6","YOfrYW7cTs","F6PT2h1zcH","qaofNVIlwP","kB5nPQbxXc","BbwgAm4bxU",
+"vkCHHksJby","jiVBPJRJQB","K20wK8cVD3","HzZT8BFkb8","ZUnqtAmdQd","1j5L8nnP8o","U3yw5vkCHH","FFDuiOHaBz","45cIHKr8ys","7ku1p3otm6",
+"xciqpBCxeC","HzZT8QnJ1S","pv0i7hYBCK","jfREu7fKYU","uPX7Gs4786","xXTI4nnP8o","nnP8oy94nw","zqH0WUvlv4","UmaEv9eoRc","WPmlx4QMc9",
+"ogLgc0h1b1","AkKTkI7p2a","EOE1oAOgEe","J2mQiFVMxo","IRh48he9IA","EdBKcMaJQs","EOE1o9rlg9","HfyNQLDk6f","pWiOsuAWyp","FPfSEeuZA5",
+"gf8rIv8yFN","DQimpSs0Zu","IBe8k5iGN5","zHF1q5Namm","AmdQdlkMUA","14FLRAXpwE","lCMxyTXQ0Z","CK5W7ThjNn","VBjhzn8pJ9","aez9y0h1b1",
+"8FmFHyToGW","jeskSBpYhV","GrDg7ogLgc","faHirQssNC","y94nwM6qcG","ZhwG1OUYuF","suY4x8FmFH","fcwDatjQxs","dQ586piJSk","iwzGks93Ml",
+"jS1ajECMvU","IRh48x3LDe","kZANmd7vjM","zbIYYFNYIM","Waim6i3pyd","FFDuiThjNn","vLsmSGv3Fq","pvgjS3otm6","8RCUAuupzk","cQOnv618Di",
+"tuDySuZPqg","fqypyjeskS","3weIFU3yw5","FjHXRWDVWJ","VjCZqW3VFH","pmeCdk85Ae","jS1ajDLhzM","X6PinW3VFH","KZamHX6Pin","Yw2oUThjNn",
+"WmadAU3yw5","55rfBrKDLJ","5iGN5RpBQm","Q6hMCix74r","jzUqRlViBv","5IhmG7hyVv","iqv4kx3LDe","kB5nPn1pmO","7ku1pi7WMQ","Gv3FqvLsmS",
+"7fsYMNo0Qb","a00b5i3pyd","OHaBzoVQp6","WmadAUmaEv","DQimpsoy9t","MezSWoGu6x","qQxHPfLNg8","MaJQseuZA5","fcwDaFcWrW","DQimpZhwG1",
+"m4bxUU3yw5","Yw2oUPOUYS","WmadA0PktI","jSjS3fLNg8","gf8rIgjUTu","tAOsruQIcz","24ARFK20wK","2Nslmy94nw","ciuWzfqypy","uJScXhe9IA",
+"AkKTkSmGzv","SWfouCK5W7","FNYIMK4GS8","euZA5zqH0W","pvgjS5Mg9r","fmIK1LDk6f","DQimpXflUq","9XyT93weIF","rz7Ut0BmCy","pT8wuQssNC",
+"uZPqgLbRTH","0YAGHgf8rI","FcWrWmz8gx","gIYvEFNYIM","0MR5XhYBCK","LbRTHQworu","ciuWzvOqCE","ZJTXHuN6r3","suY4xWDVWJ","uTacxzHF1q",
+"ZJTXHiqv4k","uLtKsB3qem","WaWsvWaim6","ZJTXH2TRI7","M3zXLAmdQd","VNCPdlH1kt","hE1QlcmXIX","64s8N8xEKz","atef2StlDJ","ydG8Uv1Hln",
+"QbxXcAIYUu","aDGtSCfgr3","S2DfuuPX7G","tl72WGv3Fq","FNYIMMm8si","s7Mxk45cIH","tjQxsHP433","VIlwPQWxoT","l83Ud2hEEU","14FLRCp3mZ",
+"soy9tQYxC0","bZLvSgtCA5","IRh488U2nU","580YDD6rBy","7ku1pqaofN","JXljWJIqXi","29QAzWPmlx","uPX7GDQimp","k85Ae2DREs","4QMc9vOqCE",
+"RzaZAguMb8","9iGoTuTacx","tvdkDOUYuF","yluBxAgJHQ","Waim6L7cGc","zHF1qWaim6","ru4UG5drc6","blLA9Waim6","gjUTu48cHL","07n1cMm8si",
+"o8UydQChxs","yEfy9XflUq","MezSWulk41","9rlg9CdyBV","jeskSMmKGJ","dpe1v8cVD3","hUTw7zbIYY","QbxXcUlU3M","U3yw5CNHmv","QChxsv2eC3",
+"CqqaDuupzk","sqVrf16lHc","Pb1pahe9IA","VIlwP4dEz6","uupzkcShY2","NOHszG1RhS","GrDg7tl72W","cShY2MGlTF","AmdQds93Ml","cQOnvNxx9V",
+"OUYuFMezSW","rKDLJjiVBP","jtn0XHfyNQ","tAOsrIKxdL","v8yFNIRh48","VNCPd07n1c","OHaBzKr8ys","Fhtgl6AFT0","Yw2oU2Nslm","fmIK1hYBCK",
+"CxVEfgdQsS","HP433S77LH","fLNg8CNHmv","POUYSfLNg8","l83Udv2eC3","No0QbvLsmS","45cIHFPfSE","HfyNQY1mC0","yluBxHlUbF","pAhR1hUTw7",
+"tl72WKZamH","RzaZAOUqFM","AXpwEJXljW","ogLgciqv4k","8hJdtokgRi","jS1ajUvlv4","vkCHHaL6AJ","zQt6QFnPFB","iqv4kRxrsm","cmXIXpmeCd",
+"iqv4kUmaEv","07n1clXFOB","Z4I1vW3VFH","7lUXZ4QMc9","aFFssZhwG1","jzUqRpWiOs","HzZT8oVQp6","NOHszLewvM","fFDrJrKDLJ","Q6LixlXFOB",
+"QbxXcbrhlQ","hE1QlYh1hF","VLTy614FLR","uJScXaez9y","IjTwPtlILt","9rlg9Yf2Ec","t98iWyToGW","zFgtBQnJ1S","U3yw5uN6r3","h1zcHtvdkD",
+"ECMvUJRJQB","pT8wusuY4x","yToGWIBe8k","zY1GYWreyP","fFDrJs7Mxk","kZANmHRxd8","EdBKc4dEz6","XflUq4QMc9","tlILtW3VFH","dQ586jSjS3",
+"JXljWfmIK1","lkMUAFwEJz","RkQkeFxX9q","IRh4814FLR","WPmlxjS1aj","0ao3lL7cGc","2Nslm9y4lw","WMiS3XyPZN","F6PT2tjQxs","BbwgAvLsmS",
+"7X3uywiHrZ","0YAGHVBjhz","dpe1vOUqFM","okgRiiB08l","4QMc9M6qcG","guMb8l83Ud","3weIFAgJHQ","FcWrWPOUYS","StlDJCfgr3","tAOsrZ4I1v",
+"ix74rMkgy8","Zv7z0PYBf4","4QMc95Namm","yToGWy94nw","GSQwjcShY2","zz4ZU8hJdt","FPfSEjSjS3","OxWIHMezSW","hYBCKh1zcH","CIShGDz1R3",
+"QnJ1SLDk6f","sx5GldQ586","FLsphW3VFH","k85AeqaofN","O3iyQbgJAz","2ZHdkzmLYD","FwEJzpv0i7","AkKTkuJScX","48cHLSWfou","WDVWJReKEW",
+"ulk41WDVWJ","K4GS8WaWsv","48cHLblLA9","ru4UGPb1pa","IRh48ru4UG","prNT6MojnP","WaWsv8hJdt","9iGoTYOfrY","wDajXazIWp","Waim6uLtKs",
+"d7vjM1j5L8","s4786FnPFB","5ZaEz29QAz","uQIczQ6Lix","29QAzJKWYR","2ZHdk6AFT0","0YAGHJkzUn","MGlTFVIlwP","zY1GYbgJAz","ZzJHWazIWp",
+"FGzgpW7cTs","tAOsrB3qem","5Namm48cHL","GSQwjtjQxs","JXljWNOHsz","RkQkeCfgr3","djsrvK4GS8","tjQxsUmaEv","7X3uyRACuj","Chuy30YAGH",
+"lweGyQworu","jfREu64s8N","JkzUnBCxeC","soy9tRkQke","LewvM6q6L9","kB5nPl83Ud","BFkb8GSQwj","jtn0XNOHsz","pmeCdqaofN","hi5X7TCgPp",
+"CNHmvGXdoH","ZuDtDVLTy6","QChxs0Kyfs","gIYvE2Nslm","16lHcfcwDa","0ao3l2ZHdk","5Mg9rRsQUq","qaofN5drc6","AIYUu4QMc9","FLsph5iGN5",
+"wiHrZAmdQd","oGu6x5iGN5","5iGN52TRI7","m4bxUXyPZN","2Yz7EzqH0W","GrDg7xciqp","dQ586K20wK","CdyBV2DREs","pv0i755rfB","5Mg9rTwano",
+"IBe8kuQIcz","FjHXRlCMxy","xciqpx3LDe","lweGyuAWyp","FVMxo48cHL","uvf7AI7p2a","1v5hHXflUq","Yh1hF5IhmG","GWqqXWaWsv","tAOsrmz8gx",
+"BbwgACNHmv","CxVEfPb1pa","d7vjMxReec","9y4lwVNCPd","29QAz2ZHdk","3otm6IjTwP","n1pmOqUJMd","HRxd80PktI","FnPFBd85a9","Chuy3CqqaD",
+"24ARFJRJQB","v2eC3FxX9q","WmadAYjB9t","yvOMICIShG","kB5nPuoStw","bZLvSfcwDa","580YDO3iyQ","WPmlx7fKYU","xReecFPfSE","OHaBzpT8wu",
+"ni2v10Kyfs","LDk6fDz1R3","lj07QmX2GE","B3qemYOfrY","8U2nUQ6Lix","OUqFMTwano","mX2GEZUnqt","0MR5Xx3LDe","Pb1paRACuj","zQt6Q9eoRc",
+"ThjNns4786","vLsmSDcpWB","FnPFB7hyVv","iwzGkOUYuF","5VZjSIn3NS","Yw2oUpmeCd","k85AeuLtKs","WDVWJFNYIM","sqVrfkZANm","uLtKsSWfou",
+"zmLYDWaWsv","azIWpMaJQs","I7p2alViBv","BCxeCJJs5m","ksJbyJJs5m","JXljW8TxD7","Nxx9V5iGN5","NhXdu3weIF","RmDcrAOgEe","jeskS5Drn0",
+"aDGtS2DREs","uZPqgPOUYS","Z4I1v5Namm","S2DfuFhtgl","bZLvS5iGN5","FVMxoX6Pin","AOgEegtCA5","wiHrZWaWsv","5iGN5HP433","PYBf4Oz8yZ",
+"1v5hHKsjRK","jiVBPFGzgp","2TRI7AkKTk","P6bcgt98iW","CK5W7UmaEv","EoToPCxVEf","1j5L8piJSk","NAFuw8hJdt","lm0pDzmLYD","wDajXMezSW",
+"AXpwEuAWyp","RACujQbxXc","9XyT9yluBx","yofH3WreyP","sx5GlM3zXL","cShY2vOqCE","JkzUnRACuj","RmDcrfaHir","Fhtglpv0i7","7hyVvguMb8",
+"48cHLoGu6x","RACujLbRTH","x3LDefaHir","7fKYUprNT6","MaJQsAmdQd","U3yw5HP433","uJScXQWxoT","M3zXLdpe1v","v1HlnF6PT2","Mm8siyToGW",
+"fFDrJHzZT8","QChxsU3yw5","2Yz7EDG4sT","i7WMQIKxdL","guMb8sqVrf","9GXkXRmDcr","In3NSdmoS7","FcWrWZUnqt","8cVD3NOHsz","24ARFCK5W7",
+"ix74rIBe8k","yvOMIpWiOs","fcJOyzHF1q","2TRI7B3qem","t98iWYjB9t","POUYSoQ87r","prNT6d7vjM","POUYS0Wr5y","uoStwRkQke","xXTI4L7cGc",
+"Z4I1vAIYUu","Y1mC0Ul4a1","wiHrZpmeCd","DG4sT9iGoT","5Mg9rCK5W7","s7MxkjS1aj","9GXkX64s8N","wiHrZRzaZA","M3zXL7fKYU","dmoS72ZHdk",
+"WPmlxuJScX","StlDJlCMxy","FGzgp0Kyfs","dQ586BFkb8","gdQsSn8pJ9","X6PinJIqXi","IRh48UmaEv","ZhwG1iKqhr","Rxrsmatef2","ThjNnpWiOs",
+"VerEAuupzk","uZPqg7fsYM","k85AeNhXdu","cShY2Fhtgl","JIqXiOUYuF","YjB9tyvOMI","NhXduv2eC3","dmoS7LewvM","gtCA5EoToP","iqv4kMGlTF",
+"k85AeyEfy9","S77LH7fsYM","QYxC0zFgtB","2hEEUqaofN","Dz1R3aez9y","0BmCyEdBKc","Nxx9VKr8ys","lH1ktuN6r3","lm0pDGSQwj","OHaBzOz8yZ",
+"DLhzMgdQsS","yofH3ix74r","4QMc9s93Ml","FNYIMZ4I1v","dQ5860Kyfs","LDk6fSWfou","2TRI7Rxrsm","HP433AgJHQ","lj07QJIqXi","ksJbyxciqp",
+"jzUqRh1zcH","Yf2EcMm8si","rKDLJChuy3","yToGWXyPZN","uvf7AuTacx","ulk412DREs","yvOMIlj07Q","nnP8oJRJQB","C2IrcZ4I1v","Chuy3hUTw7",
+"ni2v1pFrrl","RkQkepvgjS","xciqpiwzGk","8xEKzCNHmv","5IhmGv1Hln","gtCA5zHF1q","EdBKcb29RJ","2hEEUhi5X7","gIYvENcICA","Oz8yZFLsph",
+"FVMxoNAFuw","IRh48F6PT2","UlU3MzFgtB","uZPqgzFgtB","lpF6WJJs5m","i7WMQVjCZq","Waim69XyT9","JRJQBIBe8k","d85a9OxWIH","kB5nPcShY2",
+"NhXduuupzk","yEfy9Zv7z0","FhtgldmoS7","BCxeCuPX7G","RpBQmv2eC3","2TRI7FNYIM","KZamHXyPZN","POUYSDLhzM","Cfgr3yEfy9","BGaQY5Mg9r",
+"OUqFMTXQ0Z","s7Mxk3otm6","4dEz6bgJAz","JkzUnwDajX","9GXkXFhtgl","FcWrWlpF6W","gdQsSe6e4z","RBhp0CqqaD","wDajX14FLR","IjTwPMK07Y",
+"U3yw5KsjRK","RsQUqGrDg7","9GXkXL7cGc","YjB9tWaim6","TXQ0Zd85a9","Waim6JXljW","Y1mC0WaWsv","y94nwM3zXL","YOfrYFhtgl","8FmFHd85a9",
+"yEfy9lkMUA","WDVWJGrDg7","sx5Gl7fsYM","7hyVv2Nslm","dQ5869rlg9","s93MlQYxC0","0YAGHh1zcH","yToGWzbIYY","NOHszksJby","AIYUuFjHXR",
+"uupzkRACuj","4W0TlxXTI4","Zv7z0aL6AJ","GWqqXjzUqR","45cIHZv7z0","GSQwjWDVWJ","lj07QzY1GY","ECMvU5VZjS","zz4ZUa00b5","VLTy6prNT6",
+"xXTI4n8pJ9","O3iyQRpBQm","CIShGtjQxs","U3yw5nnP8o","IBe8klm0pD","sqVrfrhl0J","FnPFBlm0pD","RpBQmzQt6Q","yEfy9LDk6f","ciuWzCIShG",
+"24ARF8FmFH","ni2v1jiVBP","lViBvCIShG","uAWypAIYUu","Ss0ZugdQsS","2DREs0ao3l","BbwgAIBe8k","D6rBy07n1c","LDk6fjzUqR","W3VFHs4786",
+"fcJOy5Mg9r","o8UydSmGzv","48cHLgjUTu","F6PT2ZzJHW","v2eC38xEKz","ZzJHWPb1pa","zz4ZUCIShG","WaWsvuQIcz","ru4UGsx5Gl","yvOMINxx9V",
+"DcpWBuoStw","ulk41LDk6f","6q6L9No0Qb","Vprf2uZPqg","45cIHogLgc","ix74reuZA5","nlaByJ2mQi","3weIF9iGoT","FcWrWY1mC0","S77LH0PktI",
+"QbxXc5Drn0","FGzgpQWxoT","tlILt48cHL","x3LDehi5X7","gf8rIPOUYS","zY1GYoGu6x","1v5hHjzUqR","UlU3Muupzk","blLA9d7vjM","YjB9tdhSuH",
+"lpF6WB3qem","wiHrZ8FmFH","uAWypfaHir","uZPqgFjHXR","hi5X7nlaBy","uoStwZzJHW","prNT62TRI7","Ss0ZugIYvE","Kr8yss4786","gf8rIUmaEv",
+"oQ87rdmoS7","0PktIk85Ae","Yw2oU16lHc","BCxeCCdyBV","pFrrljiVBP","i7WMQvOqCE","JRJQBfcJOy","cmXIXm4bxU","FjHXRF6PT2","LbRTHOUYuF",
+"Zv7z0n8pJ9","lsQGo64s8N","gjUTuSjskQ","Pb1paaL6AJ","FLsph8RCUA","07n1c5Drn0","7fsYMlm0pD","JIqXiMaJQs","pT8wuS77LH","8xEKzsoy9t",
+"LDk6fHP433","tjQxsD6rBy","In3NSdQ586","FjHXRQ6hMC","zqH0WFVMxo","4dEz6Zv7z0","O3iyQZ4I1v","In3NS29QAz","4QMc90BmCy","CNHmvuJScX",
+"v1HlnJRJQB","zbIYY1j5L8","TCgPpb29RJ","RmDcrmz8gx","vkCHH7lUXZ","Vprf20BmCy","7Ow5CNo0Qb","gdQsS14FLR","Zv7z0pmeCd","suY4xaL6AJ",
+"n1pmOuZPqg","RzaZAlCMxy","1LB1LZuDtD","iKqhrOUqFM","3otm6rKDLJ","uZPqgVprf2","Dz1R3rhl0J","taOXKUmaEv","J2mQiC2Irc","zFgtBIBe8k",
+"faHirD6rBy","lm0pDJkzUn","e6e4zZuDtD","ix74rXflUq","gIYvEQ6Lix","9eoRcFjHXR","XflUqwiHrZ","dpe1vk85Ae","lj07QQ6hMC","ReKEWokgRi",
+"580YDkZANm","ogLgc9rlg9","zz4ZUfmIK1","ZzJHWAkKTk","VLTy6DcpWB","Twano2ZHdk","hUTw7ThjNn","WDVWJIjTwP","EdBKc5Namm","JRJQBkB5nP",
+"S77LH24ARF","WreyPJIqXi","4QMc9FnPFB","TCgPpG1RhS","9XyT9iwzGk","sqVrf64s8N","jfREuBpYhV","55rfBMmsIo","uTacxQ6Lix","FcWrWQClRL",
+"14FLRuAWyp","8xEKzY1mC0","QWxoTiqv4k","BGaQYJIqXi","k85AeHP433","yofH31j5L8","OUYuFd85a9","UlU3M7X3uy","dpe1vuoStw","Qworua00b5",
+"uQIcznlaBy","lsQGoAOgEe","16lHcJkzUn","K20wKi7WMQ","zQt6QMGlTF","0YAGH9XyT9","nFqikAgJHQ","blLA9hE1Ql","bZLvSjiVBP","zmLYDxXTI4",
+"pFrrlGrDg7","qaofNzHF1q","Zv7z0AkKTk","StlDJZJTXH","pvgjSfaHir","8RCUAd7vjM","5Mg9rTXQ0Z","xReecNo0Qb","JJs5mYw2oU","CqqaDMaJQs",
+"GXdoHuN6r3","D6rByguMb8","ZzJHWzQt6Q","Y1mC09XyT9","GrDg7jiVBP","W7cTs07n1c","F6PT2oGu6x","bZLvS0Wr5y","tvdkDWPmlx","OxWIH7fsYM",
+"blLA9iKqhr","3weIFQssNC","cmXIXpT8wu","AgJHQQWxoT","6q6L92ZHdk","0h1b1guMb8","kB5nPcmXIX","16lHcDQimp","he9IALewvM","0KyfsKr8ys",
+"pWiOsCp3mZ","RmDcr9GXkX","07n1cGv3Fq","Dz1R3pT8wu","9y4lwHP433","uZPqgpmeCd","0KyfsGWqqX","SmGzvb29RJ","Ul4a145cIH","5VZjSjS1aj",
+"k85AerKDLJ","No0QbZJTXH","9y4lwdpe1v","dmoS7MmsIo","2Yz7Euvf7A","5Drn0ksJby","SbRYyMmsIo","WMiS3Qworu","I7p2aVBjhz","sqVrfBbwgA",
+"lj07QxReec","1LB1LRsQUq","hE1QlAIYUu","cL0aEYw2oU","GSQwjyofH3","okgRilH1kt","jS1ajGWqqX","5drc6J2mQi","DG4sTx3LDe","2Nslmo8Uyd",
+"MezSWrhl0J","n8pJ9SWfou","2hEEUYOfrY","lpF6WxXTI4","0Wr5yrhl0J","WDVWJ0MR5X","2DREstAOsr","kB5nPNxx9V","VjCZqs7Mxk","lCMxyCxVEf",
+"yofH3Dz1R3","J2mQirKDLJ","zHF1qxciqp","e6e4zWreyP","AIYUuTCgPp","soy9taDGtS","Vprf2K4GS8","s7MxkZhwG1","Waim6OHaBz","b29RJksJby",
+"fcJOyCp3mZ","fLNg8nlaBy","ni2v1OxWIH","ZuDtDkB5nP","aDGtSQWxoT","1v5hHuLtKs","aDGtSbZLvS","y94nwAkKTk","Vprf2JRJQB","7fKYUbgJAz",
+"UlU3MWaim6","vOqCEtl72W","v8yFNSWfou","rz7Ut2DREs","uTacxFLsph","CIShGVjCZq","zmLYDQworu","pmeCds93Ml","X6PiniKqhr","gjUTuTCgPp",
+"zHF1qzbIYY","euZA5gIYvE","Yf2EcY1mC0","VLTy6RBhp0","MK07YtlILt","Pb1pazQt6Q","lpF6WlH1kt","gdQsSZuDtD","iwzGkTa8f6","fLNg8MmsIo",
+"ydG8UK4GS8","FxX9qi7WMQ","t59lRTwano","J2mQicShY2","aDGtSEOE1o","rhl0JMojnP","aL6AJ8xEKz","XyPZN0BmCy","JXljWtvdkD","pvgjSUl4a1",
+"d85a9aFFss","Gv3FqD6rBy","VLTy6P6bcg","lsQGo618Di","PYBf4h1zcH","2Yz7Ei3pyd","2ZHdkrhl0J","lm0pDLbRTH","jSjS3tuDyS","7X3uyZ4I1v",
+"hE1QlnlaBy","ZUnqtQssNC","CNHmvOUqFM","HzZT8NcICA","uQIczazIWp","fFDrJRpBQm","uZPqgChuy3","WreyP48cHL","XflUqTXQ0Z","Ul4a116lHc",
+"HzZT8a00b5","ThjNnhSSvQ","n8pJ95VZjS","6AFT0ulk41","CqqaDPOUYS","LewvM9iGoT","LbRTHlH1kt","5drc6yvOMI","VBjhzuLtKs","iqv4kjzUqR",
+"DLhzMChuy3","KZamH24ARF","brhlQb29RJ","AkKTkv1Hln","7fsYMNOHsz","nFqikHlUbF","gf8rItAOsr","lXFOBRmDcr","2TRI7DcpWB","5iGN5Mm8si",
+"48cHLzHF1q","JJs5m14FLR","580YDiKqhr","FjHXRhi5X7","EOE1ouupzk","faHire6e4z","TCgPpt59lR","sqVrf0h1b1","WmadAKr8ys","QWxoTxciqp",
+"he9IAVLTy6","KZamHuZPqg","AXpwEdpe1v","7fsYMxciqp","IjTwPpT8wu","SWfouAgJHQ","hi5X7n8pJ9","pv0i7Waim6","MGlTFZzJHW","AIYUujzUqR",
+"sqVrf9XyT9","RpBQmMkgy8","DG4sTyToGW","MmKGJaez9y","lweGy55rfB","Waim6StlDJ","NcICAwiHrZ","YOfrY4dEz6","QYxC0GrDg7","sqVrfgIYvE",
+"uAWypZJTXH","lXFOBCdyBV","djsrvMK07Y","O3iyQjeskS","FxX9qxReec","CqqaDTa8f6","DcpWBsoy9t","xReecZv7z0","s93Ml14FLR","d85a9pWiOs",
+"m4bxUokgRi","P6bcgJXljW","Waim6TXQ0Z","gjUTuWaWsv","fcwDaRpBQm","FGzgpAXpwE","NcICAiB08l","MK07YStlDJ","F6PT2rz7Ut","QssNCYjB9t",
+"OxWIHZuDtD","iKqhrGWqqX","tjQxsW3VFH","QssNCYh1hF","pv0i7MmKGJ","zbIYYTwano","ZuDtDblLA9","lCMxyrKDLJ","fLNg8dhSuH","QClRLtAOsr",
+"TwanoogLgc","Dz1R3b29RJ","ZJTXHgIYvE","OUYuFKr8ys","DG4sTfqypy","F6PT2fcJOy","aDGtSYf2Ec","FVMxoZzJHW","Mm8sitjQxs","CIShGXyPZN",
+"8hJdtxXTI4","aez9y8cVD3","ksJbyDz1R3","618DiReKEW","qQxHPhi5X7","14FLReuZA5","zz4ZUMm8si","24ARFv2eC3","24ARFtvdkD","Pb1paydG8U",
+"y94nwWaim6","5Drn0n8pJ9","yToGWBCxeC","qaofNIn3NS","GXdoH5Namm","fFDrJsx5Gl","s7MxkGSQwj","fqypy5Drn0","qUJMdix74r","Ul4a1dpe1v",
+"HRxd8djsrv","lsQGoNOHsz","5Drn0ix74r","FVMxo5iGN5","d7vjMatef2","29QAzQYxC0","QworuNAFuw","Mkgy8jS1aj","7fKYUt59lR","Uvlv4K20wK",
+"brhlQrhl0J","okgRihYBCK","TwanoHzZT8","dpe1vNcICA","aDGtSy94nw","AkKTkKZamH","x3LDevOqCE","UmaEvUmaEv","ru4UG0ao3l","FhtglAkKTk",
+"zHF1qgtCA5","qQxHPYOfrY","JkzUnhUTw7","JKWYRMmKGJ","WPmlx1j5L8","WMiS3ZJTXH","ciuWz5ZaEz","OUYuFguMb8","8TxD75IhmG","Uvlv4t59lR",
+"s93Mln1pmO","WreyPHzZT8","AmdQds7Mxk","piJSkKZamH","nFqikVIlwP","n8pJ90PktI","0h1b1AIYUu","M3zXLpWiOs","Pb1paW3VFH","jfREuWPmlx",
+"AgJHQni2v1","FPfSEfaHir","Nxx9VsuY4x","n1pmOWaWsv","lpF6W7hyVv","FNYIM29QAz","AOgEevkCHH","he9IAdQ586","7fsYMhSSvQ","16lHcRxrsm",
+"pvgjSLewvM","7X3uyuvf7A","Ss0Zu7fKYU","W7cTss4786","n8pJ9tl72W","K20wK2Nslm","JkzUnn8pJ9","FGzgpEdBKc","O3iyQFjHXR","VerEAhi5X7",
+"oVQp6djsrv","WreyPMGlTF","ZhwG1pAhR1","XflUqoVQp6","yToGWL7cGc","Ul4a18xEKz","b29RJwiHrZ","pT8wuhE1Ql","uQIczxciqp","DLhzMFNYIM",
+"dpe1vgf8rI","zY1GYCfgr3","m4bxUZUnqt","ZzJHWFcWrW","oQ87rFNYIM","YOfrYFGzgp","nnP8oM3zXL","Yf2EcXyPZN","FjHXRpmeCd","9iGoTOUqFM",
+"ogLgcSbRYy","zmLYDlkMUA","BbwgAOUqFM","MojnPcL0aE","blLA9dmoS7","2NslmpvgjS","MGlTFVBjhz","cShY2BpYhV","45cIHjtn0X","PYBf4zHF1q",
+"uJScXnnP8o","FhtglNxx9V","zFgtBuN6r3","uoStwk85Ae","tAOsrP6bcg","XyPZNTwano","CdyBV4dEz6","tuDySFPfSE","lweGyZuDtD","dpe1vmX2GE",
+"LDk6fogLgc","dhSuHHlUbF","dpe1v55rfB","Waim60PktI","PYBf4OUqFM","8xEKzOxWIH","ydG8UL7cGc","YjB9toQ87r","cShY229QAz","uvf7AZuDtD",
+"aL6AJrKDLJ","uLtKsKASQ8","FNYIM5VZjS","fcJOyzFgtB","0h1b1Ta8f6","MaJQsmz8gx","24ARFXflUq","aDGtSZUnqt","uN6r3SjskQ","DLhzMdpe1v",
+"uLtKsuJScX","YjB9tXflUq","jSjS3Waim6","pv0i7rKDLJ","LewvMAIYUu","RpBQmChuy3","yEfy99rlg9","zqH0WGrDg7","Gv3FqpFrrl","jzUqRt98iW",
+"7lUXZkZANm","StlDJAIYUu","2TRI7RzaZA","16lHcPb1pa","RACujUl4a1","cQOnvVerEA","EdBKcfFDrJ","euZA5faHir","8U2nU9iGoT","EdBKczqH0W",
+"EdBKcHlUbF","CqqaDK4GS8","Gv3FquAWyp","07n1chUTw7","In3NSEdBKc","1j5L8MGlTF","LewvMgdQsS","uLtKsTa8f6","UmaEvyToGW","sqVrfIjTwP",
+"LbRTHQ6hMC","zY1GYrhl0J","OHaBzNxx9V","JIqXiVLTy6","Rxrsm0MR5X","m4bxUoGu6x","ciuWzv8yFN","FnPFBix74r","fcwDaLbRTH","GSQwjMkgy8",
+"W3VFHuupzk","Zv7z08hJdt","d85a98xEKz","FLsphJ2mQi","VNCPdQssNC","2ZHdkZv7z0","wDajXpFrrl","OUYuFulk41","fcJOyAXpwE","P6bcgtl72W",
+"xXTI4djsrv","0PktIJkzUn","Mm8si2Yz7E","d7vjMGWqqX","In3NSYh1hF","RsQUqfcJOy","HlUbF5IhmG","FwEJz45cIH","RsQUqGWqqX","I7p2aFnPFB",
+"QworubrhlQ","8hJdtNhXdu","JRJQBfLNg8","lkMUASmGzv","7fKYUZhwG1","Q6LixJJs5m","hi5X7zHF1q","Yh1hFsqVrf","YOfrYlViBv","Mm8si5Namm",
+"HfyNQQ6Lix","t98iW55rfB","RBhp0580YD","pWiOsxXTI4","lViBvs93Ml","TwanoFVMxo","AgJHQt98iW","JIqXiSWfou","azIWpUvlv4","gIYvEk85Ae",
+"BCxeCjiVBP","GSQwj5ZaEz","DLhzMdjsrv","jfREuPb1pa","yofH3uvf7A","ThjNnCfgr3","IKxdL2ZHdk","pT8wufLNg8","JJs5mAIYUu","QYxC0AOgEe",
+"GWqqX8hJdt","9iGoTfcJOy","cL0aE580YD","he9IAyluBx","IjTwPS2Dfu","5VZjSydG8U","nlaByCxVEf","aL6AJ9y4lw","5ZaEz0h1b1","BGaQYWmadA",
+"5Drn0MGlTF","MaJQsNOHsz","Mm8si0BmCy","v8yFNRBhp0","mz8gxVIlwP","gtCA5UlU3M","rKDLJqQxHP","0h1b1ZzJHW","oQ87rHfyNQ","Q6LixOUYuF",
+"Gv3Fq8TxD7","fmIK1CNHmv","k85AeMm8si","iKqhrfFDrJ","YjB9tPYBf4","1v5hHThjNn","pmeCd2Nslm","mX2GEix74r","MezSW5nmWv","6q6L9azIWp",
+"v1HlnoGu6x","FjHXR6q6L9","RmDcrJRJQB","14FLR7Ow5C","DcpWBMmKGJ","lj07Q2ZHdk","fqypyK20wK","KASQ8BFkb8","oQ87r14FLR","5Drn0POUYS",
+"a00b5d85a9","L7cGcd7vjM","v2eC3aDGtS","v1HlnCfgr3","BFkb8RACuj","dQ586cmXIX","0h1b1MezSW","P6bcg6q6L9","Dz1R3iKqhr","qUJMd7lUXZ",
+"7fKYUVjCZq","8RCUA9GXkX","WPmlxB3qem","WPmlxPOUYS","XflUqfLNg8","e6e4zCK5W7","XyPZNFNYIM","G1RhSSbRYy","2ZHdkv1Hln","Gv3FqdmoS7",
+"I7p2a0YAGH","AmdQdWaWsv","8TxD7lm0pD","pmeCdogLgc","FjHXRU3yw5","Mkgy8MezSW","tvdkD7ku1p","C2Ircd85a9","x3LDe8cVD3","StlDJazIWp",
+"4QMc98hJdt","lweGypAhR1","XyPZNZJTXH","JXljWhYBCK","yToGWOUYuF","fFDrJW7cTs","aez9yiwzGk","zqH0WL7cGc","RBhp014FLR","jtn0XzQt6Q",
+"vkCHH7hyVv","gjUTuv8yFN","TXQ0Z9iGoT","HRxd8ZJTXH","atef2v1Hln","AXpwE64s8N","W3VFHF6PT2","jzUqRJXljW","ni2v1POUYS","fcwDaWMiS3",
+"4QMc9VjCZq","tjQxsnlaBy","nnP8ohE1Ql","lH1ktvLsmS","s7MxklweGy","O3iyQ64s8N","Vprf229QAz","ZuDtDtlILt","U3yw5aez9y","GrDg7CxVEf",
+"FGzgp6q6L9","4W0TllkMUA","Mkgy8SmGzv","CIShGDG4sT","9GXkXNxx9V","ReKEWKASQ8","WDVWJGSQwj","suY4xCxVEf","QbxXcjeskS","Y1mC0pv0i7",
+"rz7UttjQxs","RzaZAFLsph","uvf7AFcWrW","cQOnvYOfrY","yluBxNOHsz","EdBKcdpe1v","NcICA16lHc","xXTI4Fhtgl","okgRiksJby","jzUqRkZANm",
+"iB08lHRxd8","fFDrJFnPFB","dmoS7t59lR","Mkgy8pmeCd","WPmlxfFDrJ","HzZT8k85Ae","WDVWJfaHir","pmeCdCIShG","FcWrWsqVrf","7lUXZYw2oU",
+"StlDJjeskS","ZhwG1Pb1pa","RsQUqIjTwP","o8UydjiVBP","7X3uyJJs5m","pmeCd4dEz6","sqVrfDG4sT","GXdoHVIlwP","nFqikFGzgp","dpe1vl83Ud",
+"S2Dfu07n1c","NcICArhl0J","pv0i7Cfgr3","Oz8yZyvOMI","Ul4a1P6bcg","DcpWBSWfou","aL6AJ4QMc9","HlUbFlweGy","StlDJ2hEEU","Yw2oUsqVrf",
+"cmXIXAgJHQ","IKxdLb29RJ","wiHrZhE1Ql","8RCUARzaZA","lCMxySjskQ","uQIczAIYUu","5Mg9ruZPqg","Ta8f6SjskQ","SmGzvni2v1","2hEEUYh1hF",
+"KsjRK64s8N","blLA9uAWyp","BGaQYlH1kt","ni2v1fLNg8","3weIFsx5Gl","tvdkDBCxeC","W7cTs3otm6","RmDcrvLsmS","vkCHHDz1R3","ZUnqte6e4z",
+"AmdQdVLTy6","MmsIoBCxeC","s7MxkgtCA5","5Mg9rB3qem","JKWYRuZPqg","9XyT9lkMUA","Dz1R3lkMUA","CxVEf4QMc9","e6e4z64s8N","W7cTs7Ow5C",
+"Z4I1v3otm6","AOgEe5Drn0","MmsIoUlU3M","9rlg9v8yFN","iB08l4W0Tl","8TxD79eoRc","Ul4a1Yh1hF","SmGzv2Yz7E","BbwgACp3mZ","gtCA5lViBv",
+"2Yz7Erz7Ut","F6PT22DREs","ZuDtDAmdQd","IBe8kHP433","5Mg9rL7cGc","WDVWJNo0Qb","tjQxsOxWIH","3otm6SmGzv","GrDg7lweGy","AmdQdqUJMd",
+"U3yw5BGaQY","JRJQBatef2","Ul4a1M6qcG","ksJbyK20wK","b29RJAkKTk","9GXkXSWfou","0PktI9eoRc","45cIHUmaEv","Mkgy8oGu6x","Q6hMCS77LH",
+"7hyVvJXljW","pAhR1CdyBV","Pb1paGv3Fq","JXljWpmeCd","Ta8f6zY1GY","guMb8F6PT2","GWqqXa00b5","F6PT2rhl0J","QChxsO3iyQ","bZLvSCNHmv",
+"uN6r3wiHrZ","I7p2aogLgc","suY4xW7cTs","lj07QMezSW","Vprf2lm0pD","n8pJ9gf8rI","Pb1pa4W0Tl","lj07QyToGW","ThjNn48cHL","BpYhV7X3uy",
+"pmeCd16lHc","Vprf2BbwgA","fcwDaOz8yZ","W7cTsHfyNQ","v2eC3djsrv","vkCHHuvf7A","8cVD3MK07Y","ZuDtDPb1pa","JIqXit98iW","cShY2LbRTH",
+"iKqhr618Di","zz4ZUjfREu","LDk6fHzZT8","zz4ZUKr8ys","B3qemCNHmv","ECMvURACuj","dhSuHZuDtD","oVQp6EOE1o","DG4sTHfyNQ","7hyVvQnJ1S",
+"JJs5m0Kyfs","MK07YP6bcg","2TRI79y4lw","pWiOspAhR1","zY1GYuN6r3","nFqikh1zcH","vkCHH5Mg9r","MojnPReKEW","zHF1qW7cTs","nnP8ocmXIX",
+"taOXKfFDrJ","I7p2aDQimp","YOfrYfcwDa","fLNg8pv0i7","k85AeAgJHQ","CK5W7m4bxU","OHaBzlweGy","jSjS3IRh48","fcwDaIjTwP","Zv7z0RACuj",
+"v8yFNulk41","7Ow5CzmLYD","CK5W7uAWyp","x3LDeTwano","zbIYY7X3uy","Cp3mZZzJHW","7ku1pSWfou","cQOnvCp3mZ","Ul4a1BCxeC","kZANmQClRL",
+"7fsYMTXQ0Z","hE1QlgdQsS","0YAGHzbIYY","MojnPlpF6W","U3yw5Twano","JXljWhi5X7","MmKGJZUnqt","WDVWJY1mC0","uPX7GgdQsS","JXljWYjB9t",
+"MK07YbgJAz","8U2nUGXdoH","GXdoHWaWsv","WaWsvbZLvS","UmaEvb29RJ","lViBvzbIYY","t98iWSjskQ","Yf2EcRxrsm","VerEAXyPZN","jtn0XlCMxy",
+"S77LHfaHir","prNT6FVMxo","jzUqR7fsYM","pAhR1KASQ8","zHF1qRACuj","X6PinFGzgp","8xEKzFjHXR","5iGN50Wr5y","fLNg8uupzk","VNCPdnlaBy",
+"iKqhrSbRYy","brhlQYjB9t","sx5GlSmGzv","GrDg7wDajX","1LB1L5Namm","iKqhr7fKYU","ZuDtDb29RJ","kZANmDcpWB","gtCA5jeskS","cmXIXtl72W",
+"Waim6MojnP","ZJTXHblLA9","qUJMdBGaQY","WMiS35iGN5","l83UdTa8f6","5Drn0yvOMI","pT8wu2hEEU","BpYhVFNYIM","Pb1paCdyBV","LbRTHLDk6f",
+"kZANmAOgEe","uJScXokgRi","AIYUuhi5X7","x3LDeNcICA","tlILtix74r","SmGzvuvf7A","RxrsmGWqqX","W7cTsJIqXi","Ta8f6vOqCE","vOqCETwano",
+"RmDcrVBjhz","FwEJzOHaBz","DG4sT3weIF","GXdoHjtn0X","qUJMdpiJSk","YjB9tKr8ys","piJSkfqypy","lsQGo16lHc","jeskS29QAz","ZJTXHlH1kt",
+"EOE1onlaBy","ulk41tlILt","SjskQazIWp","BGaQYaL6AJ","xXTI4h1zcH","tAOsrI7p2a","bZLvS2Nslm","Y1mC0Dz1R3","QWxoTtlILt","64s8NSbRYy",
+"07n1cVjCZq","8cVD39y4lw","MezSWuTacx","D6rBylweGy","POUYSP6bcg","ix74rCNHmv","zFgtBHRxd8","jtn0X8TxD7","OxWIH8FmFH","9eoRcBbwgA",
+"jtn0XS77LH","lj07QguMb8","DQimpDQimp","jzUqRQWxoT","Gv3FqfFDrJ","ulk412Nslm","8RCUAMojnP","TwanoYw2oU","lXFOBMmsIo","HP433ThjNn",
+"Twano14FLR","JXljWOUYuF","OxWIH4W0Tl","F6PT2uLtKs","9iGoT0h1b1","fmIK18TxD7","U3yw59GXkX","W7cTstl72W","ogLgcksJby","VIlwP580YD",
+"GXdoHChuy3","LDk6fK20wK","WPmlx2Yz7E","i7WMQOHaBz","EdBKcI7p2a","blLA9FwEJz","DcpWBtl72W","AOgEeyToGW","F6PT2OUqFM","zbIYYlXFOB",
+"jS1ajv8yFN","y94nwQChxs","faHir7Ow5C","5nmWvOUYuF","ni2v1BCxeC","aFFssaFFss","QbxXcdpe1v","yofH3LbRTH","uN6r3W7cTs","aez9ytAOsr",
+"MezSWkZANm","nlaByfmIK1","Vprf2L7cGc","n1pmOXflUq","0ao3lNhXdu","GWqqXvLsmS","m4bxUjtn0X","hi5X7iKqhr","48cHLatef2","lpF6WLDk6f",
+"Oz8yZzFgtB","16lHc64s8N","wDajXzbIYY","9rlg9HlUbF","FcWrWzbIYY","FcWrW618Di","Q6LixP6bcg","tl72WxReec","ciuWzFPfSE","AOgEeksJby",
+"iwzGkfLNg8","ciuWzpv0i7","AgJHQ9iGoT","SmGzv8TxD7","Q6LixdmoS7","prNT6uPX7G","In3NS5drc6","YOfrYHP433","CK5W7v8yFN","Uvlv46q6L9",
+"FPfSEbZLvS","QssNCjiVBP","rz7UtfFDrJ","v1HlnBFkb8","bgJAzd85a9","FjHXRM6qcG","Yf2EcaL6AJ","Ta8f6Ul4a1","MaJQszz4ZU","lCMxy7ku1p",
+"580YDKsjRK","ciuWzUlU3M","HRxd8AmdQd","uoStwNhXdu","580YDuQIcz","jfREusuY4x","KASQ8CdyBV","aDGtSIRh48","2hEEUS77LH","5drc6Yw2oU",
+"EdBKcxciqp","zbIYY0BmCy","C2Irche9IA","azIWpfmIK1","suY4xbrhlQ","EOE1oW7cTs","6AFT0lm0pD","cQOnvGSQwj","Kr8ysEdBKc","JRJQBCdyBV",
+"blLA9jSjS3","8FmFHX6Pin","618DiFGzgp","OUqFMFGzgp","HlUbFuvf7A","B3qemjSjS3","gtCA5s4786","jSjS3WDVWJ","n8pJ9euZA5","FjHXRlpF6W",
+"Rxrsmjtn0X","MaJQsFFDui","Dz1R3zY1GY","OHaBz7Ow5C","zz4ZUJ2mQi","YOfrYJ2mQi","1LB1Llj07Q","2hEEUjS1aj","8FmFHMaJQs","O3iyQ5ZaEz",
+"J2mQikB5nP","O3iyQYh1hF","n8pJ9ni2v1","WDVWJ9GXkX","45cIHIBe8k","dQ586EoToP","tjQxs14FLR","TCgPpQYxC0","VIlwPUmaEv","UlU3M8RCUA",
+"Dz1R3cQOnv","aFFssSWfou","wDajX64s8N","euZA5ZhwG1","VIlwP0YAGH","aL6AJHzZT8","BGaQY7X3uy","zbIYYM3zXL","D6rBylCMxy","0KyfsYh1hF",
+"OUYuFLDk6f","gjUTu7hyVv","PYBf4FxX9q","0Kyfs5Mg9r","Yh1hFHzZT8","IRh48Z4I1v","wDajX4QMc9","Mm8siIjTwP","MmKGJMaJQs","aez9yF6PT2",
+"zmLYDRmDcr","jS1ajQ6hMC","BCxeCgf8rI","Ta8f6yToGW","rz7Utn8pJ9","kZANmpT8wu","M6qcGQssNC","QnJ1SQClRL","CqqaDvLsmS","fmIK1MGlTF",
+"D6rByReKEW","bZLvS3otm6","uZPqgIjTwP","VLTy6Ta8f6","9eoRcPOUYS","DcpWBZuDtD","VNCPddpe1v","KsjRKhe9IA","wiHrZFjHXR","W7cTs5Mg9r",
+"GXdoH2TRI7","tlILtFjHXR","uQIczAmdQd","CNHmvdhSuH","IKxdL9iGoT","Uvlv4F6PT2","55rfBWreyP","o8UydK4GS8","RkQke5Mg9r","gtCA5y94nw",
+"8cVD3Gv3Fq","Kr8yspT8wu","jfREuhYBCK","iwzGkuAWyp","6q6L9atef2","HRxd8SbRYy","yofH3CdyBV","Qworu9rlg9","s47869y4lw","FVMxoi7WMQ",
+"QClRLs93Ml","ReKEWRpBQm","VLTy6fmIK1","hE1QlpiJSk","7fsYMZv7z0","0YAGHfLNg8","Y1mC0QChxs","RpBQmEoToP","IBe8k5Namm","UlU3M1v5hH",
+"UmaEvyluBx","RkQke2hEEU","JKWYR9rlg9","d85a9LewvM","tlILtC2Irc","QClRL3otm6","GSQwj5iGN5","e6e4zChuy3","8hJdtCp3mZ","Cp3mZNxx9V",
+"AgJHQ8TxD7","Mkgy8fLNg8","StlDJGv3Fq","Kr8yst98iW","8xEKz5IhmG","QYxC0hE1Ql","zFgtBVprf2","gIYvEeuZA5","taOXKMkgy8","GSQwjD6rBy",
+"Mm8siC2Irc","zqH0W48cHL","Q6LixzHF1q","i3pyds93Ml","Vprf25nmWv","aL6AJ7lUXZ","pvgjSvkCHH","WmadAZUnqt","Ul4a1azIWp","GSQwjGrDg7",
+"e6e4zuQIcz","EdBKce6e4z","580YD1v5hH","yToGW7lUXZ","WmadAzQt6Q","45cIHnFqik","DLhzMv1Hln","JKWYRL7cGc","rz7UtdQ586","YjB9tuoStw",
+"Gv3Fq5VZjS","7hyVvuLtKs","5Mg9rmX2GE","taOXKQnJ1S","blLA95Mg9r","JXljWDLhzM","wiHrZmz8gx","M3zXLzHF1q","GWqqXB3qem","45cIHXflUq",
+"CdyBVRpBQm","IRh48B3qem","2hEEUhSSvQ","HzZT80Wr5y","pmeCdHlUbF","lm0pDtuDyS","lCMxyMK07Y","O3iyQyofH3","aFFssv8yFN","vLsmScQOnv",
+"sqVrfl83Ud","Nxx9VNxx9V","mz8gxcmXIX","ZhwG15Mg9r","OUYuF48cHL","lViBvZzJHW","I7p2aNo0Qb","S77LHv2eC3","Z4I1vTCgPp","2NslmIRh48",
+"Chuy30MR5X","16lHceuZA5","uZPqg7X3uy","Nxx9VUl4a1","ogLgcI7p2a","9rlg99eoRc","bZLvSjfREu","rKDLJyEfy9","hYBCKCIShG","ZhwG1SWfou",
+"QChxsNhXdu","WaWsvNhXdu","AkKTklsQGo","ZJTXHuTacx","gjUTuO3iyQ","SmGzvECMvU","2TRI7AgJHQ","cL0aEfqypy","yvOMIhYBCK","FGzgpxciqp",
+"Mkgy8CK5W7","ZuDtDJkzUn","ydG8Ut98iW","JRJQBOz8yZ","uTacxcQOnv","16lHc4W0Tl","U3yw50PktI","3weIFKASQ8","pFrrlKsjRK","2DREsSbRYy",
+"1LB1L5Drn0","4W0TlJkzUn","uQIcz0h1b1","xciqpD6rBy","tAOsrFwEJz","6AFT0IBe8k","K20wKNo0Qb","dhSuHrKDLJ","uLtKs9XyT9","lH1ktpFrrl",
+"NhXduStlDJ","OxWIH7fKYU","EdBKcv1Hln","lH1ktVerEA","GSQwj5VZjS","4dEz6d85a9","5Drn0aez9y","KsjRKPOUYS","zY1GYNo0Qb","BbwgAtAOsr",
+"hi5X7guMb8","euZA5m4bxU","LDk6f29QAz","JXljWjzUqR","2Yz7EnlaBy","ksJby7X3uy","n8pJ9RsQUq","lkMUAblLA9","NhXduoQ87r","7fKYUNhXdu",
+"lj07QM3zXL","Kr8ysD6rBy","RmDcrKASQ8","K20wKOHaBz","O3iyQFLsph","DLhzMlm0pD","7ku1pDz1R3","Fhtgl618Di","9y4lwKZamH","azIWpn1pmO",
+"Q6LixM3zXL","yEfy93weIF","soy9tS77LH","ru4UGpiJSk","45cIHEoToP","mX2GEQworu","hUTw75Mg9r","FLsphwiHrZ","S2DfuyEfy9","6AFT0KZamH",
+"NAFuw0Kyfs","blLA9ogLgc","m4bxUfFDrJ","y94nwIRh48","ThjNnZJTXH","soy9t5IhmG","JXljWfFDrJ","EOE1oYw2oU","QbxXcoGu6x","yToGW9iGoT",
+"BFkb8fLNg8","jzUqRECMvU","8xEKzNxx9V","jzUqRoGu6x","618DiCK5W7","1LB1LNOHsz","8RCUAL7cGc","tAOsrY1mC0","1v5hHOUYuF","IBe8kCp3mZ",
+"nlaByfqypy","7fKYU9eoRc","B3qemL7cGc","QWxoTDQimp","CIShGZUnqt","jtn0XpAhR1","Q6LixKASQ8","AmdQdgf8rI","618Div2eC3","45cIH3weIF",
+"qaofNHRxd8","b29RJlH1kt","BbwgAZzJHW","9XyT9CdyBV","vkCHHY1mC0","uoStw2ZHdk","L7cGcJIqXi","iB08l0Kyfs","Q6hMCJIqXi","CIShGzFgtB",
+"Rxrsmuupzk","2NslmuLtKs","x3LDeBbwgA","lpF6WRBhp0","JkzUnHzZT8","AkKTkkB5nP","oQ87rqUJMd","brhlQRkQke","FwEJz8U2nU","FPfSEuupzk",
+"QnJ1SSWfou","yEfy9S2Dfu","sx5GlEdBKc","GXdoHiqv4k","8RCUA8TxD7","ECMvUDLhzM","5Mg9r29QAz","gIYvEAXpwE","0h1b1DG4sT","uoStwFwEJz",
+"oVQp6n1pmO","VBjhzSWfou","SWfouW3VFH","DG4sTS2Dfu","mz8gxni2v1","UmaEv8xEKz","ru4UGbrhlQ","taOXKCqqaD","ECMvUAgJHQ","RkQkehYBCK",
+"8FmFHNAFuw","y94nwm4bxU","uTacxPOUYS","GSQwjdjsrv","MojnPsuY4x","v1HlnqUJMd","HlUbFK20wK","Q6hMCTa8f6","gf8rIWmadA","sqVrfL7cGc",
+"EdBKckZANm","PYBf4oGu6x","zz4ZUVerEA","FNYIMlpF6W","e6e4zAXpwE","d7vjMzY1GY","n8pJ9yEfy9","ix74re6e4z","Cp3mZ9y4lw","D6rByZv7z0",
+"s93MlZJTXH","qUJMdlViBv","gIYvESjskQ","oQ87rRzaZA","LbRTHPb1pa","QChxsmz8gx","uAWypKZamH","Ul4a1jSjS3","lsQGo4QMc9","HzZT8Cfgr3",
+"FnPFB3weIF","v1HlnMmKGJ","In3NS9XyT9","HfyNQX6Pin","kB5nP2DREs","Nxx9VydG8U","dmoS7lj07Q","0PktId7vjM","NOHszSs0Zu","dmoS74W0Tl",
+"BGaQY0h1b1","WPmlxxciqp","lj07QzFgtB","64s8NJ2mQi","0ao3lFVMxo","Z4I1vYf2Ec","FGzgpjfREu","Mm8siZzJHW","wiHrZ8U2nU","Nxx9VZzJHW",
+"FxX9qlweGy","FxX9qpWiOs","UlU3MMojnP","ZzJHW580YD","t98iWAkKTk","ogLgckB5nP","l83UdWmadA","d7vjMKZamH","HzZT8Waim6","W3VFHUl4a1",
+"YjB9tRACuj","Z4I1vAmdQd","48cHL64s8N","CdyBV7Ow5C","uoStwMmKGJ","tAOsrydG8U","cL0aE9y4lw","TCgPpIRh48","ThjNnjS1aj","QYxC05Drn0",
+"rhl0Jzz4ZU","ZzJHWnlaBy","Uvlv4zFgtB","AXpwEQYxC0","Ul4a1aez9y","iqv4k0Wr5y","hSSvQSmGzv","d7vjM2TRI7","4QMc9dpe1v","QYxC0kB5nP",
+"EOE1o8hJdt","JIqXiuupzk","zQt6QqUJMd","euZA5zz4ZU","UmaEvSWfou","QWxoTksJby","xXTI4d7vjM","bgJAzru4UG","S2Dfus7Mxk","F6PT2TCgPp",
+"L7cGcgdQsS","5VZjSPOUYS","Waim6aez9y","e6e4z0Wr5y","gIYvEReKEW","ZUnqtrhl0J","s4786IBe8k","uN6r35Drn0","RkQke1j5L8","lH1ktAOgEe",
+"ECMvUuoStw","uoStwFhtgl","VLTy6Pb1pa","fcJOyReKEW","BbwgAQChxs","0ao3lzqH0W","QworuQ6Lix","b29RJThjNn","Yw2oUQClRL","AIYUuMm8si",
+"MojnPWPmlx","nnP8o0ao3l","uPX7GMaJQs","5nmWvxXTI4","oQ87r7lUXZ","Y1mC0uN6r3","oQ87rDcpWB","ThjNns7Mxk","P6bcgXyPZN","aDGtSQbxXc",
+"OHaBzQYxC0","TCgPpfcJOy","Mm8siv1Hln","uAWypzqH0W","7fKYUlm0pD","M3zXLtjQxs","CNHmvsoy9t","zY1GYRpBQm","XflUqulk41","lm0pDFFDui",
+"fmIK1JIqXi","QYxC0ksJby","6q6L9uLtKs","lsQGo1v5hH","yvOMIyluBx","NhXdu8cVD3","ni2v1lweGy","P6bcg0Kyfs","8FmFHGWqqX","tlILtFVMxo",
+"dQ5866AFT0","zHF1qtjQxs","bZLvSAmdQd","ni2v1pAhR1","5nmWvAmdQd","qQxHPcShY2","1j5L8FFDui","RkQketlILt","EdBKc2hEEU","zz4ZUpiJSk",
+"lkMUAFPfSE","5nmWvQnJ1S","CdyBVJRJQB","VNCPdiqv4k","gIYvEbZLvS","vLsmSO3iyQ","0KyfsQWxoT","RACujMm8si","pmeCdZJTXH","b29RJ2ZHdk",
+"14FLR7fKYU","B3qemJJs5m","e6e4zYf2Ec","2hEEUs93Ml","oQ87rRmDcr","e6e4z6q6L9","iB08lvOqCE","azIWpl83Ud","aDGtSAOgEe","Yf2Eci3pyd",
+"6AFT0yvOMI","ksJbys4786","ZuDtD9iGoT","16lHc5Mg9r","CK5W7iKqhr","zY1GYuTacx","3weIF64s8N","KsjRKuN6r3","lj07QMK07Y","fLNg8n8pJ9",
+"gf8rItjQxs","1v5hHZv7z0","CNHmvZuDtD","CIShGyvOMI","SjskQtjQxs","64s8NRmDcr","S2DfuJXljW","lkMUAZuDtD","qQxHPni2v1","y94nwQ6Lix",
+"Yh1hFlm0pD","k85Aes93Ml","jeskS2TRI7","i7WMQFwEJz","CqqaD7ku1p","EOE1o4W0Tl","VLTy6ReKEW","n8pJ9QWxoT","uLtKsOz8yZ","9rlg95Drn0",
+"Nxx9VS77LH","piJSkSWfou","CNHmvRzaZA","X6Pin580YD","IBe8k7X3uy","AmdQdQworu","MmsIo2Nslm","FhtglPOUYS","mz8gxWmadA","xciqp9iGoT",
+"xXTI4tlILt","l83UdnFqik","kB5nPxciqp","kB5nPgtCA5","faHiri7WMQ","ZzJHWuJScX","i3pydLbRTH","QssNC4dEz6","AgJHQG1RhS","MmKGJtlILt",
+"9eoRcWaim6","aFFssRmDcr","hSSvQ64s8N","5VZjSQssNC","LewvM4W0Tl","iKqhr3weIF","HzZT8zqH0W","5Drn0lkMUA","ThjNnUvlv4","4QMc92DREs",
+"uoStwuQIcz","FGzgpgIYvE","JXljWzY1GY","DG4sTQChxs","S2DfuMK07Y","QbxXcKr8ys","l83UdPOUYS","lweGy2hEEU","DQimpt98iW","NOHszFxX9q",
+"9y4lwFhtgl","POUYSiB08l","ksJbyyEfy9","7lUXZlViBv","Ul4a1k85Ae","dpe1vqQxHP","Oz8yZMm8si","S77LH0Kyfs","CNHmvtaOXK","MK07YFGzgp",
+"ZUnqtFjHXR","618DixXTI4","TXQ0Z5Drn0","1LB1LvOqCE","jzUqRVprf2","Pb1paOUqFM","K4GS8wiHrZ","G1RhSFLsph","mz8gx4QMc9","UlU3MokgRi",
+"7fKYUBpYhV","lViBv0h1b1","AIYUuW3VFH","5ZaEzblLA9","NhXduWreyP","tuDyS24ARF","JRJQBDG4sT","zFgtBzHF1q","NAFuwjS1aj","64s8Naez9y",
+"WMiS3xReec","taOXKFwEJz","yToGWFhtgl","0YAGH9GXkX","lpF6W2TRI7","OxWIHThjNn","QnJ1STXQ0Z","EdBKcFhtgl","zY1GYn8pJ9","0ao3lLewvM",
+"fqypyGSQwj","pAhR1dmoS7","sx5Gl5IhmG","HfyNQEoToP","jiVBPEoToP","K20wKIBe8k","M3zXLX6Pin","OHaBzK4GS8","14FLRJ2mQi","lXFOB9rlg9",
+"MGlTFvOqCE","suY4xzmLYD","0Wr5yiqv4k","d7vjMO3iyQ","LDk6fQnJ1S","b29RJEdBKc","GWqqXcL0aE","guMb8euZA5","prNT6yvOMI","wDajXWaWsv",
+"F6PT22ZHdk","bZLvSNcICA","xXTI4QWxoT","8TxD7cShY2","n8pJ9S77LH","vOqCEpFrrl","hE1QlQnJ1S","0YAGHVjCZq","SjskQHP433","uQIczCqqaD",
+"o8UyduPX7G","hE1QlTCgPp","VNCPd6q6L9","yluBxo8Uyd","v2eC3jeskS","MmsIocmXIX","ZzJHWs4786","5Drn0JKWYR","KASQ8pWiOs","Zv7z0L7cGc",
+"xXTI4YOfrY","LbRTHVjCZq","RpBQmO3iyQ","AkKTkni2v1","FNYIMYjB9t","6AFT0VjCZq","k85AeRkQke","gtCA59XyT9","ulk411LB1L","vkCHHFwEJz",
+"In3NSlXFOB","Z4I1vSmGzv","24ARFzqH0W","RpBQmQChxs","Y1mC0fcwDa","S2DfuvLsmS","EoToPFhtgl","YOfrY5nmWv","StlDJDG4sT","580YD4QMc9",
+"uvf7ASbRYy","xReecvOqCE","OxWIHOUYuF","uTacxatef2","ogLgctlILt","vkCHHWMiS3","29QAzv8yFN","VNCPd8xEKz","FFDuiJJs5m","h1zcHO3iyQ",
+"SjskQ5IhmG","AXpwE7Ow5C","iwzGkm4bxU","OUqFMZUnqt","nlaByHlUbF","Waim6oGu6x","JXljWyEfy9","mz8gxtuDyS","M3zXLEOE1o","taOXKAmdQd",
+"3weIFkB5nP","QWxoTRzaZA","zHF1qQYxC0","h1zcHaL6AJ","zmLYDtlILt","2NslmsqVrf","he9IAMaJQs","Fhtgl5iGN5","bZLvSK4GS8","GWqqX2Yz7E",
+"sx5Glpv0i7","oVQp6mX2GE","d7vjMgjUTu","7X3uyjSjS3","ThjNnn8pJ9","StlDJFPfSE","HP433RpBQm","iKqhrnlaBy","xReec7ku1p","tvdkDoQ87r",
+"55rfBlCMxy","D6rByHzZT8","e6e4zCfgr3","jS1ajS77LH","NhXduM6qcG","zbIYYvkCHH","m4bxUGWqqX","5nmWvpWiOs","OUqFMv8yFN","s4786Kr8ys",
+"cShY2FNYIM","QworuQworu","MaJQshUTw7","CqqaDEOE1o","prNT6MmsIo","O3iyQblLA9","2hEEUb29RJ","HfyNQnnP8o","FGzgpdjsrv","SmGzvpWiOs",
+"jtn0XYh1hF","iB08lMm8si","QClRLAgJHQ","7Ow5CL7cGc","l83UdpvgjS","WDVWJ2Yz7E","HzZT8dhSuH","tjQxsDcpWB","pv0i7lsQGo","yToGWHRxd8",
+"n8pJ9Rxrsm","YOfrYD6rBy","cQOnvWreyP","8FmFH5iGN5","LDk6fQChxs","l83UdReKEW","Mm8siEdBKc","JkzUnFhtgl","2Yz7ERBhp0","WaWsvlkMUA",
+"QbxXcguMb8","6AFT08xEKz","TXQ0ZLbRTH","8cVD3Fhtgl","bgJAz24ARF","JIqXiQClRL","WPmlxjeskS","S2DfusqVrf","Ta8f6RsQUq","t98iWuJScX",
+"KASQ8jtn0X","FxX9qe6e4z","FLsphs93Ml","zmLYDpvgjS","ECMvUjiVBP","d85a97lUXZ","FGzgpDQimp","FxX9qprNT6","dpe1vVBjhz","yEfy9brhlQ",
+"7fsYMQWxoT","Q6hMC0MR5X","FNYIMXflUq","ydG8UQChxs","uN6r3AXpwE","atef2i3pyd","QYxC0TXQ0Z","yToGWyluBx","RACujnlaBy","5nmWv9iGoT",
+"xReeca00b5","FnPFBUmaEv","RmDcrZUnqt","GWqqXMGlTF","8xEKzNhXdu","W7cTsgjUTu","hUTw74W0Tl","F6PT2djsrv","2ZHdkulk41","lViBvY1mC0",
+"pAhR1DG4sT","pAhR1DcpWB","8cVD3dmoS7","8hJdtvLsmS","3weIFiKqhr","l83Udrz7Ut","Cp3mZSs0Zu","HzZT8jS1aj","SWfouNOHsz","XyPZNYf2Ec",
+"MmKGJjzUqR","0Wr5ye6e4z","mX2GERsQUq","yToGWO3iyQ","2ZHdkGrDg7","RsQUqIBe8k","dhSuHtuDyS","BGaQYpiJSk","pvgjSzbIYY","suY4xEOE1o",
+"WPmlxatef2","kZANmpFrrl","64s8NMkgy8","l83UdL7cGc","Ul4a1bZLvS","mX2GEmz8gx","zz4ZUuoStw","U3yw5DG4sT","dmoS70Wr5y","RpBQmmX2GE",
+"tuDySdhSuH","dQ586RkQke","s7MxkJXljW","azIWpFjHXR","ZzJHW0Kyfs","cmXIX3otm6","Cfgr3LbRTH","5nmWvLbRTH","5nmWvzqH0W","pAhR1dQ586",
+"uJScXMkgy8","gf8rIW7cTs","suY4xfLNg8","GSQwjW3VFH","aDGtSGrDg7","9iGoThUTw7","OUYuFsuY4x","OHaBz7fsYM","JXljWIjTwP","piJSkokgRi",
+"pvgjS5Drn0","RzaZApvgjS","blLA9s7Mxk","2TRI7fLNg8","JIqXiZhwG1","gf8rITCgPp","DG4sTXflUq","QworuYjB9t","dQ5864QMc9","ReKEWpvgjS",
+"fmIK1Oz8yZ","Cfgr3lCMxy","TXQ0ZMmKGJ","IKxdLZuDtD","gdQsSOUqFM","3weIFrKDLJ","C2IrcS77LH","8TxD7d85a9","FVMxo5IhmG","IRh48azIWp",
+"wiHrZSs0Zu","7fKYUd7vjM","fcJOyCNHmv","tAOsrK20wK","BpYhVpvgjS","x3LDeo8Uyd","3weIFDLhzM","5Drn0tjQxs","Q6hMC48cHL","AmdQdM3zXL",
+"BpYhV3weIF","Oz8yZNOHsz","taOXKlkMUA","NcICApWiOs","S2Dfun1pmO","MK07Y5iGN5","uPX7GAkKTk","8U2nUk85Ae","SWfoulH1kt","ix74rfFDrJ",
+"tl72W1LB1L","JIqXiOHaBz","pvgjSyluBx","4W0TlWmadA","aDGtSO3iyQ","lXFOBn8pJ9","FcWrWFwEJz","jeskSazIWp","ru4UGD6rBy","jS1ajKASQ8",
+"sx5GlDLhzM","ZhwG1S2Dfu","sx5GlQnJ1S","taOXKix74r","sqVrfMkgy8","FwEJzyvOMI","fmIK1uJScX","zqH0WoGu6x","WPmlxdpe1v","uZPqgMGlTF",
+"AOgEevLsmS","Q6LixyluBx","HfyNQ5iGN5","W3VFHuPX7G","2Yz7EFFDui","fqypyn1pmO","Mkgy8UlU3M","EoToPo8Uyd","vOqCEYf2Ec","t59lRFxX9q",
+"uAWypdpe1v","Yw2oUQbxXc","SbRYyAkKTk","oGu6xfaHir","lH1ktogLgc","yEfy9DG4sT","Nxx9VQssNC","djsrvDG4sT","X6Pin0BmCy","RxrsmM6qcG",
+"580YD0Wr5y","yluBxB3qem","8FmFHo8Uyd","8FmFH8hJdt","yEfy9tl72W","OUqFMd85a9","n1pmOGv3Fq","JkzUn8xEKz","VjCZqDG4sT","VIlwP7fsYM",
+"VNCPd3otm6","lpF6WQbxXc","nnP8o0YAGH","SbRYyfcwDa","HfyNQrKDLJ","CIShGL7cGc","RzaZAcQOnv","HlUbFzHF1q","StlDJGWqqX","IjTwPSbRYy",
+"jzUqRDG4sT","I7p2aru4UG","h1zcHCp3mZ","BGaQYKZamH","b29RJ55rfB","0MR5X07n1c","HRxd80YAGH","FNYIM4QMc9","xXTI4blLA9","1LB1LLbRTH",
+"n1pmOIjTwP","DLhzMpvgjS","iqv4kKZamH","IRh48ThjNn","wiHrZzY1GY","OUYuFDLhzM","kB5nPpT8wu","AmdQdWDVWJ","lsQGoi3pyd","FGzgpVjCZq",
+"8FmFH9iGoT","DcpWBL7cGc","gtCA5aez9y","kB5nPJKWYR","Yh1hFEdBKc","TXQ0ZUvlv4","Zv7z0JKWYR","OUYuFOz8yZ","lkMUAgtCA5","gjUTuNxx9V",
+"s93MlzmLYD","Kr8ysni2v1","DcpWBksJby","1LB1LEOE1o","OHaBzZzJHW","nlaByxXTI4","jS1ajHP433","2NslmMK07Y","ksJbybrhlQ","uoStwzqH0W",
+"tl72WzbIYY","vLsmSCp3mZ","uN6r3taOXK","dhSuHpvgjS","tlILt07n1c","8xEKzStlDJ","FNYIMzz4ZU","qUJMdK4GS8","WPmlxuoStw","HRxd8qQxHP",
+"HP433x3LDe","YjB9tQChxs","faHirYf2Ec","1j5L8Y1mC0","v8yFNx3LDe","taOXKpvgjS","DLhzMUlU3M","HRxd8fLNg8","iqv4kZJTXH","0KyfslCMxy",
+"I7p2a2ZHdk","aL6AJjeskS","ix74rDLhzM","uupzk2DREs","k85AezHF1q","XyPZN8TxD7","RmDcrTa8f6","hSSvQM3zXL","P6bcglj07Q","yluBxK20wK",
+"5IhmGbZLvS","9rlg9gf8rI","5drc6s7Mxk","ZzJHWjS1aj","Gv3FqkB5nP","WreyPv1Hln","VIlwPStlDJ","ZhwG1POUYS","iwzGkgf8rI","MGlTFt59lR",
+"S2DfuPYBf4","5Drn00YAGH","WPmlxFLsph","Q6hMCo8Uyd","zFgtBReKEW","MK07YC2Irc","aL6AJUmaEv","8TxD71LB1L","WMiS3Ul4a1","gIYvE55rfB",
+"Pb1pa580YD","gf8rI24ARF","FwEJzv2eC3","FLspheuZA5","uN6r3OHaBz","8cVD3POUYS","wDajXTa8f6","tuDySKASQ8","d7vjMuTacx","pv0i7WMiS3",
+"M6qcGZUnqt","lkMUAHfyNQ","0YAGHK20wK","lsQGo9y4lw","WPmlxpmeCd","dhSuHs4786","2NslmYh1hF","TwanoJJs5m","P6bcg5iGN5","DcpWBpmeCd",
+"K4GS8gtCA5","ulk41e6e4z","ydG8Uhe9IA","ogLgc9y4lw","BbwgA2DREs","2hEEUUlU3M","HfyNQfFDrJ","jS1aj24ARF","5VZjSdhSuH","i3pydJKWYR",
+"POUYSMaJQs","Oz8yZpAhR1","MmsIoCdyBV","JkzUnMojnP","ni2v1ru4UG","QYxC0iKqhr","Mm8sizFgtB","rKDLJlCMxy","FVMxo618Di","3otm6wiHrZ",
+"Mkgy824ARF","oGu6xYw2oU","W3VFHlCMxy","RkQkeuupzk","gf8rIFVMxo","iKqhr8hJdt","ix74rHfyNQ","GWqqXgIYvE","55rfBvLsmS","5NammKr8ys",
+"guMb87Ow5C","pWiOs2Nslm","64s8N9XyT9","4W0TlciuWz","WPmlxfcwDa","8FmFHuAWyp","gjUTupiJSk","tvdkDdhSuH","RpBQmDLhzM","IjTwPe6e4z",
+"Cfgr3sx5Gl","K20wKydG8U","lj07QpvgjS","RBhp0hE1Ql","fcwDaB3qem","uvf7AMGlTF","Cfgr3KASQ8","EdBKcjtn0X","kZANmMmKGJ","oQ87ryofH3",
+"oQ87rJKWYR","tAOsratef2","uAWyp4dEz6","FxX9qIBe8k","uoStwn8pJ9","jiVBPjzUqR","bgJAzJXljW","ulk41lkMUA","MmsIoDQimp","GXdoHTwano",
+"lsQGosoy9t","uLtKsru4UG","GWqqXl83Ud","JJs5mW7cTs","gf8rIbgJAz","W3VFHFxX9q","ZhwG1aL6AJ","oQ87rS77LH","7fsYMDcpWB","pFrrlOHaBz",
+"EoToPzFgtB","ZUnqtSWfou","fLNg83weIF","tlILtThjNn","SbRYy5iGN5","RmDcrIRh48","zqH0W5drc6","9y4lwuTacx","AkKTk64s8N","aFFssguMb8",
+"jfREuMkgy8","2DREsYh1hF","rhl0JjS1aj","zmLYDECMvU","RpBQm4QMc9","qQxHP5Namm","yEfy9FFDui","QnJ1SLbRTH","mX2GEKASQ8","cmXIXogLgc",
+"tvdkDlXFOB","CqqaDwiHrZ","pmeCdU3yw5","7X3uyVIlwP","8FmFHpFrrl","HP433Oz8yZ","mz8gxWMiS3","BFkb8hSSvQ","VerEAx3LDe","7ku1pMkgy8",
+"5drc6lCMxy","8cVD3OUqFM","v1HlnIKxdL","FFDuiRmDcr","NcICAgdQsS","Pb1pannP8o","a00b5zQt6Q","NcICAJKWYR","d85a9hi5X7","MK07Y5drc6",
+"hYBCKWMiS3","UlU3MpAhR1","HfyNQoGu6x","fLNg8IjTwP","ogLgcJkzUn","aDGtSd85a9","I7p2aDcpWB","OHaBzdjsrv","Dz1R3gtCA5","FNYIMxXTI4",
+"dQ586ECMvU","8xEKzS2Dfu","dpe1v7X3uy","fcJOyAIYUu","Chuy3FcWrW","07n1chi5X7","U3yw5QssNC","4dEz6QnJ1S","cmXIX5iGN5","tlILti7WMQ",
+"yEfy9W7cTs","14FLR5Drn0","fqypyVLTy6","OxWIH5nmWv","jiVBP3otm6","WmadAMkgy8","QbxXcFGzgp","n1pmONxx9V","euZA5h1zcH","zz4ZUK20wK",
+"v8yFNrz7Ut","WreyPcShY2","D6rByTCgPp","sx5GlCK5W7","0YAGHdmoS7","lj07Quupzk","t98iWy94nw","J2mQi55rfB","I7p2aFVMxo","v1HlnuQIcz",
+"8TxD7x3LDe","BCxeChE1Ql","iqv4kbZLvS","xReecnnP8o","cmXIXfmIK1","PYBf4SWfou","QClRL5Namm","NOHszni2v1","i3pydM6qcG","s4786P6bcg",
+"gIYvECIShG","29QAzAgJHQ","LbRTHQWxoT","9XyT9SWfou","FNYIMWmadA","L7cGcG1RhS","8U2nURmDcr","lsQGoMmsIo","5drc6WreyP","hUTw7IRh48",
+"K20wKZv7z0","ciuWzECMvU","QClRLpAhR1","ZuDtD48cHL","J2mQiS2Dfu","QWxoTokgRi","48cHLciuWz","ciuWz7ku1p","PYBf4dmoS7","cShY2wDajX",
+"MaJQsCNHmv","29QAz4QMc9","yluBxuAWyp","kB5nPW3VFH","B3qemv1Hln","AXpwEOUqFM","K4GS8GWqqX","e6e4zWaim6","xReecfFDrJ","yvOMIrhl0J",
+"d7vjMJkzUn","s93MlDz1R3","0Wr5ytvdkD","x3LDetvdkD","cQOnvBpYhV","MK07YUl4a1","55rfBFFDui","faHirdQ586","oGu6x7Ow5C","x3LDeoVQp6",
+"pmeCdAIYUu","Zv7z0zFgtB","faHirhYBCK","S2DfuzFgtB","BpYhVdjsrv","lj07Q5ZaEz","Nxx9Vx3LDe","MmKGJ0PktI","x3LDeF6PT2","GWqqXe6e4z",
+"uAWypLDk6f","J2mQipT8wu","hE1QlVIlwP","WaWsviqv4k","HzZT8NhXdu","IRh48CNHmv","UmaEvblLA9","07n1cMojnP","FnPFBtvdkD","8TxD7CdyBV",
+"24ARFZ4I1v","WMiS3okgRi","qaofN3weIF","yluBxfLNg8","Z4I1vKASQ8","dQ586BGaQY","FwEJzGrDg7","8FmFHuN6r3","fLNg89eoRc","LDk6ftAOsr",
+"lH1ktoVQp6","48cHLoQ87r","AOgEeUmaEv","HfyNQ2DREs","Kr8ys9GXkX","4QMc9IjTwP","YjB9t2TRI7","vLsmSRACuj","9iGoTQYxC0","IBe8klj07Q",
+"fLNg88TxD7","v8yFNuoStw","IBe8kblLA9","rKDLJaL6AJ","bgJAzNhXdu","14FLR6q6L9","RsQUqhE1Ql","fcJOyHP433","he9IAReKEW","AmdQdb29RJ",
+"xciqpMezSW","fqypyZhwG1","9GXkXU3yw5","tjQxsyEfy9","SmGzvcL0aE","GXdoHNo0Qb","uvf7An1pmO","Nxx9VAIYUu","gdQsS6q6L9","jtn0XQ6hMC",
+"VBjhzG1RhS","M6qcGni2v1","WaWsvgf8rI","SWfouuQIcz","gjUTuJKWYR","29QAzKsjRK","0h1b1lweGy","aL6AJtaOXK","Ta8f62DREs","B3qemTCgPp",
+"FFDui1LB1L","MezSWOxWIH","ulk41lpF6W","5nmWv7ku1p","7hyVvh1zcH","Mkgy8uvf7A","Q6LixzmLYD","nFqikEdBKc","s7Mxko8Uyd","No0QbRBhp0",
+"i7WMQtaOXK","5iGN5iwzGk","POUYSuvf7A","Nxx9VzFgtB","fcJOyru4UG","n1pmOEOE1o","Fhtgl4dEz6","CqqaDYw2oU","DLhzMulk41","ZzJHWt59lR",
+"zz4ZUIKxdL","lH1ktDz1R3","guMb8yEfy9","5ZaEz8hJdt","M6qcGl83Ud","uQIczuupzk","580YDtAOsr","okgRilXFOB","M6qcGazIWp","LbRTHVBjhz",
+"pWiOsZzJHW","v8yFNjeskS","qQxHPnFqik","OHaBzhUTw7","NOHsz618Di","uvf7ArKDLJ","yvOMI3otm6","Yf2Ec0ao3l","2TRI7m4bxU","HfyNQWPmlx",
+"DLhzMtuDyS","OUqFMblLA9","K20wKdpe1v","L7cGcSs0Zu","prNT6uQIcz","iqv4kqUJMd","NcICAtlILt","i7WMQxXTI4","cL0aEBFkb8","2Yz7EQYxC0",
+"TXQ0ZIjTwP","P6bcgTCgPp","uPX7GeuZA5","sqVrfhE1Ql","CdyBV3weIF","64s8N9iGoT","MGlTFRkQke","9eoRccL0aE","WPmlxQ6hMC","2hEEUSbRYy",
+"zz4ZUyToGW","ZzJHWFLsph","uupzkDQimp","W7cTst59lR","UlU3MOUYuF","4W0TlpiJSk","8hJdtDLhzM","lpF6Ws93Ml","pv0i7AIYUu","FwEJzQssNC",
+"OUqFMCfgr3","QbxXcDcpWB","0KyfsWmadA","yluBx7hyVv","lj07Qx3LDe","xReecuJScX","lweGyCqqaD","Ta8f6fFDrJ","tAOsrlXFOB","48cHL29QAz",
+"618DizHF1q","brhlQCK5W7","pvgjStlILt","pv0i7U3yw5","CK5W7lCMxy","580YDo8Uyd","sx5GlzQt6Q","h1zcHJIqXi","TXQ0ZogLgc","uAWypXyPZN",
+"2DREswiHrZ","vLsmSFxX9q","lViBv8hJdt","Waim64dEz6","Ss0ZuJkzUn","zmLYDjfREu","lsQGozFgtB","i7WMQMezSW","JXljWfcwDa","dmoS7i7WMQ",
+"2DREsIBe8k","zY1GYzmLYD","BGaQYcQOnv","RxrsmYjB9t","t59lRjtn0X","S2Dfuaez9y","tjQxsQChxs","xReec4dEz6","4dEz6pFrrl","dQ5868RCUA",
+"RBhp0UlU3M","v2eC3EoToP","Yf2EcqUJMd","iqv4kGXdoH","azIWpzHF1q","jSjS3No0Qb","x3LDe8xEKz","IBe8kCNHmv","4W0Tlix74r","suY4xYf2Ec",
+"n8pJ9sx5Gl","jfREuCp3mZ","Uvlv4ECMvU","MGlTFPYBf4","ZUnqtgjUTu","Yw2oUIRh48","pv0i7d7vjM","o8UydEoToP","SmGzvfFDrJ","kB5nPoGu6x",
+"5VZjSZv7z0","oGu6xzz4ZU","rKDLJciuWz","24ARFiKqhr","64s8Nh1zcH","nlaBysoy9t","AkKTkNhXdu","Dz1R3tl72W","vLsmSZv7z0","VLTy6POUYS",
+"7X3uya00b5","8xEKzO3iyQ","W3VFHtuDyS","Q6hMCI7p2a","jfREuokgRi","24ARFFjHXR","RzaZAuupzk","iwzGkVNCPd","wDajX8xEKz","ZUnqtNo0Qb",
+"vkCHHs93Ml","iqv4kzFgtB","AkKTkjtn0X","9eoRcQYxC0","i3pydJRJQB","WreyPtAOsr","fcJOyjiVBP","k85AeVjCZq","v2eC3cShY2","zFgtBCNHmv",
+"rhl0JReKEW","Yh1hFd85a9","s93MlfmIK1","Pb1pataOXK","qUJMdGWqqX","5VZjSMm8si","S77LHrhl0J","i7WMQb29RJ","WDVWJi3pyd","qUJMdL7cGc",
+"No0Qbi7WMQ","9XyT9OUYuF","piJSkpvgjS","AXpwEi7WMQ","Y1mC0AXpwE","QWxoTECMvU","h1zcHQbxXc","64s8NhYBCK","5Drn02TRI7","sx5GlJJs5m",
+"FPfSEcmXIX","9y4lwuAWyp","djsrvVjCZq","OUqFMqQxHP","29QAzuoStw","iB08lYOfrY","LbRTHZuDtD","WreyP8hJdt","S77LHprNT6","8hJdtPOUYS",
+"cQOnvS2Dfu","e6e4zoVQp6","OUYuF64s8N","fLNg8uPX7G","Qworu8cVD3","K20wK0ao3l","FxX9qkB5nP","0h1b145cIH","CIShGksJby","WPmlxDLhzM",
+"5Nammmz8gx","n1pmOjtn0X","xXTI4jS1aj","pvgjSBGaQY","EoToPaez9y","vLsmSgIYvE","2ZHdk9rlg9","Uvlv45Namm","QWxoTn8pJ9","GrDg77hyVv",
+"Q6hMC8TxD7","2NslmokgRi","14FLRGrDg7","In3NSLDk6f","n8pJ9zHF1q","iwzGkQ6Lix","ThjNnB3qem","0Wr5yAIYUu","zmLYDzQt6Q","DLhzMaez9y",
+"ciuWzbrhlQ","lweGy24ARF","2hEEUOHaBz","HfyNQFxX9q","gdQsSgdQsS","GrDg7HlUbF","X6PinOUqFM","dpe1vlViBv","UlU3M45cIH","S2Dfu29QAz",
+"GSQwjuZPqg","m4bxUuJScX","9iGoT4QMc9","XflUqZuDtD","W7cTsIRh48","v1HlnFPfSE","WreyPsoy9t","Ta8f6bZLvS","xReecru4UG","7fsYMiwzGk",
+"8TxD7dQ586","aez9y24ARF","MaJQsl83Ud","RkQke64s8N","Gv3FquJScX","No0QbO3iyQ","9iGoTRBhp0","prNT6yofH3","5NammuJScX","Ss0Zu580YD",
+"azIWpRsQUq","Gv3FqqUJMd","ZJTXHCNHmv","VjCZqS77LH","fqypyVjCZq","o8UydECMvU","FhtglvLsmS","gIYvEdmoS7","D6rByiB08l","SmGzv64s8N",
+"hSSvQZuDtD","WDVWJvLsmS","07n1cWaim6","ZhwG1uQIcz","0ao3lTa8f6","3otm6euZA5","580YDuLtKs","Yf2EcC2Irc","POUYS4dEz6","CxVEflXFOB",
+"2TRI7iKqhr","pmeCdlj07Q","CqqaD9XyT9","W3VFHfcJOy","m4bxUfmIK1","ydG8UNOHsz","MmsIoWmadA","HlUbFCIShG","s4786AgJHQ","2NslmzmLYD",
+"8hJdtiB08l","nnP8oFcWrW","0BmCykZANm","t98iWRxrsm","P6bcgkB5nP","OHaBzFLsph","Y1mC00MR5X","cQOnvzz4ZU","aez9yGSQwj","BpYhViwzGk",
+"9eoRcLbRTH","WDVWJ580YD","tl72Wni2v1","POUYSyluBx","fcJOy07n1c","7lUXZoVQp6","lkMUALewvM","RkQkeyEfy9","7hyVvgjUTu","zbIYYFhtgl",
+"NhXduMaJQs","4dEz6oGu6x","0ao3lOUYuF","wiHrZ5IhmG","BbwgA7fKYU","uZPqgZuDtD","JIqXilXFOB","AkKTkMkgy8","yToGWkB5nP","BFkb8ulk41",
+"s7MxkFPfSE","HlUbFwDajX","IBe8kFVMxo","ZUnqtx3LDe","8hJdtHP433","StlDJ14FLR","2TRI7FFDui","nlaByjtn0X","Q6Lixni2v1","I7p2a0Wr5y",
+"Zv7z0Rxrsm","U3yw5jtn0X","o8UydNAFuw","Y1mC0lweGy","0MR5Xzz4ZU","lCMxy5Mg9r","EoToPIBe8k","iqv4k0PktI","ix74rZuDtD","WPmlxx3LDe",
+"brhlQZUnqt","bgJAzgtCA5","8xEKzlweGy","tuDyS4W0Tl","WmadAMm8si","IRh48SbRYy","soy9t9XyT9","9XyT9atef2","pFrrllXFOB","Twano5Drn0",
+"L7cGcC2Irc","9GXkXv2eC3","RpBQmRkQke","guMb8rKDLJ","0YAGH2Nslm","oGu6xjeskS","X6Pinlm0pD","XflUqYh1hF","FxX9qQClRL","LbRTHsx5Gl",
+"o8UydPYBf4","yluBxCp3mZ","3otm6BGaQY","7lUXZWmadA","JXljWJRJQB","mz8gxFNYIM","tl72WpAhR1","guMb8Fhtgl","Pb1pa0Kyfs","IjTwPzmLYD",
+"5nmWvtaOXK","9rlg9Zv7z0","SWfouJkzUn","JJs5mprNT6","vkCHHkZANm","zHF1qXflUq","t59lRReKEW","dmoS7XflUq","pv0i7t59lR","IBe8kCdyBV",
+"MmKGJ55rfB","uN6r3a00b5","In3NSsqVrf","d85a9uZPqg","No0QbxReec","nFqikW7cTs","WDVWJlj07Q","RmDcrcmXIX","POUYSHRxd8","618Di4W0Tl",
+"AgJHQtjQxs","I7p2aGWqqX","k85Aejtn0X","J2mQiB3qem","C2IrcYh1hF","8xEKzP6bcg","Oz8yZSjskQ","zFgtBDz1R3","Zv7z0DG4sT","Cfgr3Oz8yZ",
+"ZzJHWQYxC0","i7WMQ8U2nU","OHaBzBGaQY","uLtKsLbRTH","FFDuiFGzgp","7fKYU5VZjS","1j5L8lViBv","lViBv1v5hH","tAOsr7X3uy","4W0TluPX7G",
+"v8yFNGv3Fq","IRh48VNCPd","8RCUApmeCd","RACujpvgjS","5nmWvThjNn","Z4I1vYjB9t","WmadA5drc6","sqVrftlILt","VNCPdZJTXH","uPX7GIKxdL",
+"pT8wuGv3Fq","QssNCfqypy","uTacxFxX9q","FhtglzbIYY","FnPFB0BmCy","blLA9FVMxo","MK07Ytl72W","zY1GYM6qcG","7lUXZd7vjM","5NammgdQsS",
+"hSSvQMm8si","FcWrWJRJQB","QWxoTUmaEv","kZANmFNYIM","G1RhSQworu","i3pydMmsIo","jS1ajpv0i7","8U2nUFPfSE","qaofNK20wK","2TRI7JJs5m",
+"MmKGJwDajX","jeskSFVMxo","SmGzvVprf2","AgJHQuQIcz","BFkb8Uvlv4","t98iWPb1pa","4W0Tlpv0i7","FcWrWaez9y","TwanojeskS","zmLYD14FLR",
+"M3zXLUvlv4","ni2v1lsQGo","U3yw5yEfy9","W3VFHuJScX","lCMxy2hEEU","8TxD7lweGy","FGzgpPYBf4","djsrvLewvM","S77LH2hEEU","UmaEvt59lR",
+"8cVD3JKWYR","suY4xt98iW","lXFOBaDGtS","oQ87rWDVWJ","vOqCEa00b5","EOE1okZANm","soy9tuLtKs","5IhmGzmLYD","GSQwjiKqhr","MGlTFOUqFM",
+"5iGN59eoRc","fcwDaGv3Fq","S77LH0h1b1","9iGoTYw2oU","pT8wuh1zcH","0Kyfs5Drn0","W7cTsFVMxo","IRh48WMiS3","J2mQi5Drn0","pvgjSwiHrZ",
+"Q6LixMm8si","cShY2t59lR","Cp3mZhSSvQ","uoStwQssNC","LDk6fBCxeC","lkMUAHlUbF","ZJTXHs4786","pAhR1FGzgp","KASQ8MmKGJ","nlaBy1j5L8",
+"AmdQdvOqCE","Cfgr3G1RhS","QClRLb29RJ","Uvlv4Oz8yZ","1j5L8BpYhV","gdQsSGv3Fq","6q6L9piJSk","dpe1vYh1hF","O3iyQZUnqt","O3iyQoGu6x",
+"pFrrltAOsr","AIYUuWmadA","5iGN5Chuy3","he9IAQ6hMC","pAhR1soy9t","07n1ci7WMQ","GXdoH4dEz6","Z4I1vIBe8k","sqVrfRpBQm","I7p2aMojnP",
+"dhSuHxXTI4","gdQsSkZANm","NOHszlpF6W","lkMUAlH1kt","5Drn0W7cTs","0h1b1RpBQm","pFrrls93Ml","Uvlv4DQimp","6q6L914FLR","LewvMD6rBy",
+"DG4sTBGaQY","tl72WvkCHH","uPX7GCIShG","JRJQBfqypy","7Ow5CRkQke","iB08lRpBQm","KsjRKhi5X7","AOgEeFhtgl","7lUXZiqv4k","5drc6cL0aE",
+"blLA9WPmlx","No0Qb2hEEU","5Mg9rcQOnv","TCgPpThjNn","SWfouOxWIH","QbxXcGXdoH","7fKYUAkKTk","FLsph1LB1L","64s8NBCxeC","8U2nUIBe8k",
+"Waim6D6rBy","OHaBzYw2oU","5VZjSqQxHP","FLsphYh1hF","ZhwG1jzUqR","s93Mls4786","TCgPpRBhp0","StlDJ0Wr5y","oGu6xQClRL","MojnPWmadA",
+"jeskSi3pyd","oGu6xaL6AJ","ksJbydQ586","CxVEfmz8gx","618DiYjB9t","ru4UG0h1b1","suY4xAmdQd","zz4ZUKASQ8","M3zXLwiHrZ","taOXKxReec",
+"Nxx9V2hEEU","FNYIMpFrrl","AXpwEDz1R3","GWqqXd7vjM","POUYSLewvM","POUYSB3qem","64s8NpAhR1","RACujdhSuH","RxrsmLewvM","RBhp0JKWYR",
+"okgRilsQGo","lkMUATCgPp","gf8rIDcpWB","W7cTsFwEJz","Q6hMCQ6hMC","MojnPpFrrl","SWfouMmsIo","ZUnqtrKDLJ","FhtgljfREu","jtn0Xgf8rI",
+"1j5L84dEz6","Uvlv4i7WMQ","bZLvSokgRi","gIYvEFnPFB","EoToPjSjS3","POUYSBCxeC","lpF6Wn8pJ9","RACujMmKGJ","CIShGh1zcH","FPfSENhXdu",
+"9eoRc5nmWv","XflUqS77LH","LbRTHWaWsv","tuDySJKWYR","AmdQdIjTwP","64s8N7hyVv","cL0aETXQ0Z","uupzkC2Irc","SWfout98iW","cL0aEaL6AJ",
+"tvdkDsqVrf","5drc6uAWyp","i7WMQQworu","X6PinzFgtB","Mm8siRBhp0","lViBvCK5W7","O3iyQv1Hln","hYBCK618Di","0h1b17X3uy","rKDLJuoStw",
+"0YAGHTa8f6","cL0aERBhp0","CxVEfU3yw5","64s8NyluBx","QssNC580YD","HzZT8lViBv","QnJ1SvLsmS","piJSkpAhR1","ru4UGSbRYy","e6e4zatef2",
+"BpYhVZUnqt","1j5L8tAOsr","zqH0WOz8yZ","VBjhz0Kyfs","QbxXcQ6hMC","rKDLJhE1Ql","JKWYRFcWrW","t98iWMm8si","oVQp68cVD3","djsrv1LB1L",
+"VBjhzWMiS3","jSjS3XyPZN","XflUqhE1Ql","IjTwPLbRTH","GWqqXOUYuF","J2mQio8Uyd","9rlg9l83Ud","55rfBBCxeC","UlU3MOz8yZ","1j5L8Cp3mZ",
+"HP433pT8wu","uAWyp64s8N","QworuMGlTF","iKqhratef2","FwEJzVprf2","euZA5EoToP","EoToPv1Hln","Nxx9VVBjhz","FGzgpnnP8o","BFkb8JKWYR",
+"jiVBPI7p2a","B3qem1j5L8","ogLgcqUJMd","uN6r3e6e4z","rz7UtcShY2","bgJAzCIShG","pmeCdWMiS3","qUJMdKASQ8","3otm6bZLvS","bZLvSUmaEv",
+"lm0pDuJScX","fqypy2Yz7E","ni2v1xReec","FLsphTCgPp","zz4ZU48cHL","2hEEUy94nw","4dEz6vOqCE","L7cGc14FLR","yvOMI64s8N","OUYuFfLNg8",
+"7lUXZYjB9t","atef2lsQGo","C2Irc7Ow5C","4QMc9piJSk","uvf7AQChxs","I7p2apmeCd","uQIczgf8rI","FFDuilXFOB","WreyPm4bxU","piJSkVBjhz",
+"mX2GEUvlv4","uZPqg9rlg9","G1RhStl72W","S77LHk85Ae","DG4sT580YD","IBe8kQClRL","pWiOsM6qcG","Nxx9VSWfou","ksJbyStlDJ","lm0pDFNYIM",
+"hE1QlyToGW","Pb1pa0BmCy","zz4ZUGWqqX","S2DfuWreyP","sx5GlFVMxo","AOgEeM6qcG","Dz1R3iqv4k","AXpwEzz4ZU","zQt6Quupzk","48cHLUlU3M",
+"ulk41GXdoH","Ss0ZuAmdQd","VLTy68cVD3","LewvMJJs5m","SbRYyyluBx","QworuuPX7G","SWfouyluBx","RkQkeQ6Lix","Q6Lix2DREs","JRJQBDcpWB",
+"7fsYM9XyT9","K20wKh1zcH","n1pmOv1Hln","pWiOsAmdQd","MmsIoqUJMd","hUTw7AmdQd","okgRiatef2","dhSuHh1zcH","xReecY1mC0","suY4xsx5Gl",
+"Q6LixcL0aE","CK5W7aez9y","fmIK1EoToP","UmaEvk85Ae","iqv4kDQimp","GSQwjVNCPd","jtn0XCK5W7","FxX9qjiVBP","YjB9tTa8f6","7fKYUB3qem",
+"nlaByChuy3","5ZaEzIjTwP","1LB1LsqVrf","xReec5nmWv","9GXkXtAOsr","FwEJzAgJHQ","gjUTu0PktI","CIShGmz8gx","pmeCdS2Dfu","blLA9lkMUA",
+"K20wKqQxHP","FNYIMPOUYS","7ku1pOHaBz","tl72WfmIK1","4dEz6AgJHQ","WMiS3n1pmO","FcWrWIjTwP","AmdQdfcwDa","uLtKslCMxy","9y4lwpAhR1",
+"I7p2a8hJdt","ogLgcjzUqR","wDajXDLhzM","t98iW4QMc9","jfREuPYBf4","1j5L8jeskS","In3NSNcICA","o8UydMezSW","DG4sTJIqXi","VjCZq45cIH",
+"ReKEWiqv4k","OxWIHZhwG1","6q6L9MmsIo","n1pmOVIlwP","3weIF5iGN5","ulk41azIWp","24ARFVLTy6","FcWrWYf2Ec","lCMxyThjNn","dQ586v8yFN",
+"aFFssvkCHH","dmoS7kZANm","lViBvFhtgl","7fsYMn1pmO","aez9yGrDg7","4dEz61LB1L","NOHszStlDJ","tvdkDv2eC3","oQ87rcL0aE","wiHrZWmadA",
+"zmLYDLbRTH","dmoS7b29RJ","sqVrfMaJQs","wDajXStlDJ","2Yz7EPb1pa","NcICA5Drn0","hYBCKQworu","BCxeCCp3mZ","CIShGNOHsz","JRJQBSWfou",
+"0ao3l16lHc","suY4xtvdkD","8TxD7uAWyp","yofH3uTacx","MezSWsuY4x","AIYUuru4UG","0PktIFLsph","Waim65IhmG","OHaBznlaBy","VLTy6L7cGc",
+"JJs5m7fsYM","ZzJHWuN6r3","cQOnvHfyNQ","e6e4zFcWrW","dhSuHRBhp0","Yh1hFtl72W","Cp3mZjzUqR","5Mg9rwDajX","5ZaEzG1RhS","IKxdLrz7Ut",
+"lXFOB3weIF","Nxx9Vb29RJ","uoStw4QMc9","5IhmGgtCA5","dmoS7dmoS7","djsrv1j5L8","8TxD7azIWp","5nmWvqUJMd","Yw2oUWDVWJ","WDVWJprNT6",
+"IKxdL7hyVv","WPmlxgjUTu","KZamHUl4a1","t98iWqQxHP","KsjRK5drc6","pWiOsxReec","4QMc9fFDrJ","SbRYyrhl0J","L7cGcQssNC","pWiOsqQxHP",
+"yEfy9JXljW","tlILtSWfou","gIYvEdpe1v","K4GS8zbIYY","6AFT0AkKTk","ECMvUkZANm","VBjhzaFFss","EoToP8xEKz","O3iyQQ6hMC","DLhzM7lUXZ",
+"0ao3l9iGoT","AgJHQfLNg8","v1HlnWreyP","lj07Q4dEz6","StlDJyEfy9","S77LH5ZaEz","2TRI7W7cTs","brhlQBCxeC","xReecMmKGJ","K20wKuvf7A",
+"tl72WNOHsz","Z4I1v9GXkX","FFDuiP6bcg","0PktIrz7Ut","RpBQmZ4I1v","EOE1oBbwgA","FLsphTa8f6","gdQsS9XyT9","qUJMdcmXIX","n8pJ9uTacx",
+"EoToPlweGy","oQ87rRpBQm","iB08lWmadA","EOE1oUmaEv","GrDg7pvgjS","AmdQdlXFOB","5VZjSfmIK1","5VZjSjSjS3","16lHcYOfrY","SbRYyQnJ1S",
+"FFDuit59lR","lm0pDRzaZA","vOqCE0ao3l","SbRYy7fsYM","JXljWNAFuw","7fsYM0ao3l","IKxdLuZPqg","gjUTuYw2oU","GXdoHoVQp6","blLA9nnP8o",
+"lm0pDiKqhr","HzZT8pmeCd","pmeCdAXpwE","SmGzvzz4ZU","uvf7ASs0Zu","fqypy48cHL","PYBf4uJScX","k85AeCIShG","5Mg9rdhSuH","vOqCEhSSvQ",
+"ix74r9rlg9","In3NS4W0Tl","9rlg9WmadA","zFgtBHfyNQ","azIWpdjsrv","Twano3weIF","VNCPdVIlwP","KsjRK9XyT9","hSSvQ0MR5X","FVMxouoStw",
+"cL0aEgIYvE","zQt6Qdjsrv","QssNClj07Q","5ZaEzyEfy9","MaJQsFnPFB","KsjRKtlILt","DQimpnlaBy","FVMxoIjTwP","OUqFMqUJMd","yToGWYw2oU",
+"24ARF07n1c","U3yw5MmKGJ","7Ow5CThjNn","azIWpXyPZN","VerEA9rlg9","okgRi4QMc9","lm0pD8TxD7","MmKGJJKWYR","gf8rI580YD","9eoRcxReec",
+"hE1Ql3otm6","DQimplj07Q","lpF6WJXljW","07n1cfmIK1","JIqXiS77LH","OUqFMuPX7G","POUYSChuy3","FLsphVLTy6","W3VFHHfyNQ","zmLYDwiHrZ",
+"2hEEUuN6r3","xXTI4lpF6W","0ao3lbZLvS","AIYUuNcICA","pWiOsVjCZq","VLTy6jtn0X","2hEEUFjHXR","8U2nU0BmCy","Cp3mZ8hJdt","7Ow5CTwano",
+"JkzUnjtn0X","In3NSMojnP","7Ow5CRACuj","RzaZAZuDtD","IKxdLatef2","pmeCdYw2oU","64s8NjeskS","GXdoHFVMxo","14FLRCqqaD","29QAzciuWz",
+"nnP8oXflUq","HzZT8rz7Ut","hUTw7aDGtS","bZLvSLDk6f","CxVEfxXTI4","2ZHdkSWfou","Ss0ZuS77LH","ogLgcuAWyp","lkMUAECMvU","zqH0WpFrrl",
+"djsrvuJScX","7ku1pEoToP","Ss0ZutaOXK","sx5GlpvgjS","ReKEWUl4a1","d7vjM5Namm","fLNg8RpBQm","uupzk5ZaEz","gIYvELbRTH","kB5nPmz8gx",
+"FcWrW9y4lw","zqH0WcQOnv","jeskSmz8gx","uLtKslj07Q","1LB1LyToGW","h1zcHs7Mxk","gdQsSEdBKc","uAWyp2hEEU","nlaByS77LH","WDVWJk85Ae",
+"SmGzvCqqaD","SjskQ5Drn0","Oz8yZuTacx","QChxsRACuj","uQIczYOfrY","tl72WjzUqR","5VZjS1j5L8","yToGWJIqXi","580YDkB5nP","GWqqX7hyVv",
+"Cfgr3yvOMI","AXpwEnnP8o","VNCPdTCgPp","GSQwjlweGy","AXpwEpiJSk","kZANmhe9IA","QClRLZuDtD","B3qemS77LH","0h1b1pWiOs","tuDySk85Ae",
+"ix74r7X3uy","7hyVvhSSvQ","2ZHdk29QAz","he9IAVerEA","zQt6Qe6e4z","9GXkXogLgc","jfREuy94nw","oQ87rCK5W7","oGu6xDLhzM","uPX7GlCMxy",
+"mz8gxeuZA5","KZamHguMb8","bZLvSs7Mxk","hUTw7W7cTs","U3yw5RmDcr","NcICAlpF6W","PYBf49eoRc","hE1QlhE1Ql","8cVD35Drn0","9GXkXMezSW",
+"FjHXRUvlv4","d85a93weIF","hE1QlQ6Lix","v1HlnMGlTF","xciqplXFOB","L7cGc5ZaEz","FwEJzGXdoH","GXdoH9eoRc","zmLYDsx5Gl","x3LDeDG4sT",
+"0YAGHhe9IA","VIlwP8RCUA","y94nwsoy9t","iwzGkVprf2","Yf2EcpFrrl","3otm6piJSk","BCxeCStlDJ","2ZHdkfaHir","JJs5m618Di","Chuy3Q6Lix",
+"Yh1hFhi5X7","VIlwPhYBCK","LewvMK20wK","FLsphazIWp","uupzkMGlTF","2ZHdk14FLR","14FLRoGu6x","5drc6FwEJz","rhl0JkB5nP","aFFssNxx9V",
+"5ZaEzAmdQd","zFgtBCqqaD","AIYUuIBe8k","ksJbycShY2","RmDcr7fKYU","AkKTk0Wr5y","Dz1R30Kyfs","bgJAzQClRL","QYxC0In3NS","1LB1LPOUYS",
+"gIYvEECMvU","7lUXZ0Wr5y","faHirYw2oU","Gv3FqogLgc","Ss0ZuQYxC0","vOqCEF6PT2","IRh48TCgPp","3weIFo8Uyd","cQOnvh1zcH","zY1GYYf2Ec",
+"StlDJeuZA5","0Wr5yRzaZA","lkMUArKDLJ","vkCHHAOgEe","HP4330PktI","7Ow5C0ao3l","zY1GYKZamH","No0QbQClRL","LewvMfmIK1","ix74ruPX7G",
+"SjskQDG4sT","rz7UtoQ87r","4dEz6ogLgc","dQ586I7p2a","9GXkXhE1Ql","tl72WMm8si","Zv7z0Q6Lix","FPfSEFjHXR","hE1Qlgf8rI","yvOMICK5W7",
+"uQIczOUqFM","FnPFBkZANm","azIWp8hJdt","HRxd8EOE1o","580YDW3VFH","iKqhrtlILt","yvOMIOUqFM","d85a9Vprf2","oVQp6gf8rI","0KyfsuLtKs",
+"lm0pDkB5nP","KsjRKZzJHW","U3yw5pvgjS","IRh48JkzUn","nnP8ooQ87r","jfREurKDLJ","RzaZAuAWyp","FFDuiIBe8k","RsQUqDQimp","NcICA7X3uy",
+"AIYUuzHF1q","mX2GE1LB1L","Dz1R3Twano","a00b58RCUA","2TRI7XyPZN","djsrvRBhp0","NhXdutaOXK","vkCHHAXpwE","7ku1p0MR5X","lViBvjeskS",
+"lm0pDhUTw7","jiVBPBCxeC","POUYSSjskQ","JJs5mpvgjS","QYxC09XyT9","5IhmG2TRI7","tl72WVIlwP","RxrsmNhXdu","jtn0XAXpwE","n8pJ9VBjhz",
+"Vprf2QbxXc","Pb1pa9XyT9","nFqikrKDLJ","5VZjS9GXkX","HRxd8t59lR","WPmlxrz7Ut","bgJAzWPmlx","QnJ1SFhtgl","soy9tSbRYy","qQxHPv1Hln",
+"SbRYy2DREs","OUYuFPYBf4","nFqikcL0aE","FwEJzFLsph","OHaBzhe9IA","k85AeEoToP","m4bxUTwano","07n1c5Namm","zFgtBQssNC","ZhwG1ogLgc",
+"RkQkeciuWz","IBe8kuLtKs","BpYhV8cVD3","DQimpHfyNQ","RsQUqSs0Zu","iB08lyofH3","WPmlx5Namm","aDGtS48cHL","FFDuifcJOy","6AFT07Ow5C",
+"uLtKsv8yFN","XyPZNVerEA","2hEEUQWxoT","OUqFM8FmFH","P6bcgtuDyS","OUYuFpAhR1","FFDuiv2eC3","zY1GYjfREu","9XyT9wiHrZ","7ku1pBbwgA",
+"29QAzQssNC","WaWsvpT8wu","LDk6fDcpWB","ECMvUIn3NS","JRJQBlweGy","uJScXWMiS3","faHir0MR5X","WreyPWPmlx","iB08lguMb8","lkMUAL7cGc",
+"EdBKcS2Dfu","GrDg7vkCHH","HlUbFSs0Zu","aL6AJVBjhz","55rfBrhl0J","AXpwEnlaBy","h1zcH7X3uy","iqv4kWMiS3","3weIFb29RJ","fcJOy2hEEU",
+"LbRTH9y4lw","3otm6BpYhV","VerEAQ6hMC","k85Ae7ku1p","Mm8sixReec","SmGzvSs0Zu","hUTw77lUXZ","uQIczVNCPd","uPX7Ghe9IA","6q6L9Vprf2",
+"G1RhSF6PT2","7fsYMni2v1","GrDg7HRxd8","yvOMItjQxs","nlaBy07n1c","7lUXZYf2Ec","BbwgA6AFT0","FVMxozFgtB","uZPqgy94nw","dpe1vAkKTk",
+"O3iyQb29RJ","9GXkXuoStw","QClRL45cIH","KsjRKuvf7A","NOHszlweGy","2Yz7E7lUXZ","Y1mC0pT8wu","6q6L9jSjS3","BCxeClH1kt","O3iyQnFqik",
+"UlU3M2Yz7E","U3yw5POUYS","wiHrZtAOsr","lsQGo1j5L8","okgRiZuDtD","0BmCyCqqaD","EOE1ot59lR","4W0Tl6q6L9","F6PT2ECMvU","8cVD3nlaBy",
+"iwzGklXFOB","nlaByrz7Ut","pvgjSfmIK1","ulk41x3LDe","ZJTXHpWiOs","jiVBPfqypy","zHF1qBGaQY","7X3uy0Wr5y","QnJ1SNo0Qb","9y4lwSs0Zu",
+"IRh48gdQsS","iqv4kdjsrv","t59lRBpYhV","XflUqcShY2","lCMxy580YD","XflUqguMb8","StlDJb29RJ","b29RJ7fKYU","kB5nPfcJOy","nlaBy7fsYM",
+"ix74rmz8gx","blLA99eoRc","lXFOBtl72W","RACujYjB9t","AkKTk0YAGH","kB5nPhUTw7","FcWrWpFrrl","vOqCEUvlv4","EdBKc8RCUA","I7p2ahUTw7",
+"AmdQdVNCPd","TCgPpECMvU","RBhp0DLhzM","cmXIXtaOXK","FFDuibrhlQ","zHF1qFNYIM","zHF1qQWxoT","JRJQB07n1c","dmoS7FnPFB","TCgPpWPmlx",
+"DLhzMUl4a1","lViBvVerEA","GSQwjpmeCd","hYBCKIn3NS","VjCZqDQimp","EoToPfFDrJ","Cp3mZuupzk","8xEKzuJScX","VNCPd9GXkX","OUqFM8U2nU",
+"2hEEUX6Pin","jtn0X0Wr5y","2TRI75Mg9r","oQ87rrz7Ut","16lHc2Yz7E","7Ow5CokgRi","azIWpuQIcz","U3yw5ni2v1","n8pJ9HRxd8","7ku1p7fKYU",
+"2Yz7E2hEEU","FNYIMpiJSk","o8Uyd2Nslm","zQt6Qn8pJ9","mX2GEZhwG1","64s8Nt59lR","B3qem2Yz7E","Mkgy8uQIcz","No0QbHfyNQ","aez9ydQ586",
+"Yf2EcKZamH","zFgtBulk41","KZamHciuWz","gdQsSCdyBV","lViBvuvf7A","Chuy3KZamH","WPmlxMGlTF","tjQxs0Kyfs","FhtgluJScX","cmXIXC2Irc",
+"DQimpIjTwP","fqypyuoStw","azIWpfcJOy","GSQwjuAWyp","zY1GYatef2","S2DfuWPmlx","4W0TlI7p2a","3weIFcL0aE","XflUq7ku1p","taOXKdmoS7",
+"DQimpNOHsz","i3pydcShY2","uZPqgzqH0W","VIlwPRsQUq","0YAGHmz8gx","lsQGoEdBKc","8cVD3xReec","nnP8o5Mg9r","QssNCuZPqg","FhtglAmdQd",
+"jiVBPgtCA5","0PktIYjB9t","yToGWDQimp","55rfBQ6hMC","fLNg8MK07Y","hSSvQZJTXH","TCgPpVBjhz","zY1GYy94nw","O3iyQbrhlQ","WaWsvFLsph",
+"Q6LixvOqCE","QbxXcydG8U","vLsmSWaim6","9XyT9sqVrf","Pb1paTa8f6","dmoS7QChxs","pmeCdGSQwj","NAFuwguMb8","XyPZNdQ586","8cVD3BGaQY",
+"7lUXZlweGy","PYBf4mz8gx","PYBf4In3NS","S2DfuNhXdu","guMb8Kr8ys","iB08loGu6x","4W0Tl2Yz7E","oGu6xFVMxo","dhSuH0h1b1","gdQsSWreyP",
+"POUYSs4786","ksJbyRxrsm","uTacx2DREs","uPX7GZhwG1","HfyNQDLhzM","fFDrJ0Kyfs","zbIYY8RCUA","ECMvUuQIcz","0ao3l9XyT9","ni2v1gf8rI",
+"Mkgy8ECMvU","Z4I1vJkzUn","AXpwEKASQ8","LewvMpFrrl","rKDLJprNT6","EdBKcv8yFN","cShY2l83Ud","zmLYDuupzk","7hyVvzFgtB","Waim6dQ586",
+"uQIczUlU3M","7lUXZhSSvQ","zmLYDfFDrJ","d7vjM1v5hH","BpYhVix74r","7fKYUpWiOs","L7cGchSSvQ","UmaEvYjB9t","2hEEULewvM","FxX9qzQt6Q",
+"8xEKz2hEEU","piJSkRpBQm","TwanoReKEW","OUqFMyToGW","zQt6QcQOnv","Mm8si1LB1L","9GXkXhSSvQ","rz7UthYBCK","7hyVv0ao3l","JIqXiKZamH",
+"DcpWB1j5L8","BCxeChYBCK","lsQGouPX7G","KASQ8MaJQs","qUJMdJKWYR","FhtglS77LH","SmGzviqv4k","S77LHQWxoT","P6bcgCfgr3","Twanon8pJ9",
+"hUTw7EoToP","kZANmtjQxs","Ss0ZuNcICA","5nmWvLDk6f","VjCZqlViBv","lXFOBxciqp","7fKYUpiJSk","djsrvD6rBy","4QMc9FcWrW","BFkb89iGoT",
+"okgRilj07Q","EOE1oEoToP","2Yz7Ex3LDe","0YAGHNxx9V","FnPFBZuDtD","l83UdYOfrY","XflUqvkCHH","okgRi8hJdt","azIWpjtn0X","WmadAQWxoT",
+"F6PT2cQOnv","DQimpTXQ0Z","pWiOsLDk6f","FGzgpJJs5m","2NslmfaHir","ksJbybZLvS","VerEAqQxHP","yEfy9d85a9","vOqCEFVMxo","tlILtFwEJz",
+"5NammHP433","b29RJYw2oU","BGaQYMK07Y","8U2nUQClRL","atef2ZuDtD","tjQxsRACuj","zbIYYECMvU","UmaEvoQ87r","QssNCzQt6Q","lkMUApT8wu",
+"No0QbtjQxs","8FmFH0YAGH","RsQUqoQ87r","Mkgy814FLR","djsrvMmsIo","MmsIoFwEJz","i7WMQhYBCK","9y4lwL7cGc","ciuWz2DREs","pWiOs2DREs",
+"RkQkeokgRi","0KyfswDajX","M3zXLVIlwP","64s8NmX2GE","fmIK1DcpWB","1v5hHcShY2","Yf2EcgjUTu","5Drn0CNHmv","618DiYOfrY","RxrsmydG8U",
+"fLNg8VLTy6","Yf2EcTa8f6","Cfgr3MK07Y","QWxoTAkKTk","fcwDam4bxU","5NammZhwG1","iB08l4QMc9","ECMvUMmKGJ","EdBKcsuY4x","Gv3Fqatef2",
+"QssNCmX2GE","s7Mxkfqypy","KZamH9XyT9","TwanolsQGo","0YAGH45cIH","d7vjMulk41","7fKYUzFgtB","2NslmUlU3M","uQIczHlUbF","lj07QNAFuw",
+"ThjNnzmLYD","RpBQmNhXdu","DQimpHRxd8","0MR5X9iGoT","MK07YnlaBy","7lUXZZhwG1","KZamHAIYUu","1LB1LFNYIM","WmadA618Di","jiVBPOxWIH",
+"bZLvSDQimp","GWqqXJ2mQi","KASQ8K20wK","Ta8f6FGzgp","WaWsvVprf2","KsjRKqaofN","XflUqm4bxU","7ku1ppv0i7","zHF1qUmaEv","FxX9qy94nw",
+"gtCA5BGaQY","e6e4zCNHmv","zFgtBrz7Ut","ru4UGFPfSE","uupzk5VZjS","soy9tblLA9","9eoRcPb1pa","X6Pinh1zcH","5nmWvStlDJ","kZANmGWqqX",
+"uN6r3m4bxU","ThjNnSmGzv","guMb8tlILt","vkCHHZUnqt","cShY2EOE1o","FPfSE45cIH","nFqikyEfy9","ni2v1zz4ZU","8FmFHuvf7A","2hEEUECMvU",
+"7X3uyxciqp","9XyT9FLsph","n8pJ9UlU3M","euZA5rhl0J","9y4lwuLtKs","Gv3FqJJs5m","BCxeCGrDg7","EoToPKZamH","45cIHaL6AJ","14FLROHaBz",
+"Ta8f6DLhzM","uLtKsCqqaD","sx5GlUvlv4","vOqCEiB08l","b29RJsx5Gl","KASQ8atef2","KsjRKCdyBV","m4bxU24ARF","lH1ktNOHsz","QbxXceuZA5",
+"IjTwP16lHc","CIShG9rlg9","SWfouG1RhS","AmdQdVIlwP","6AFT0v2eC3","b29RJMGlTF","8TxD7No0Qb","ZzJHWFFDui","jiVBPJKWYR","5ZaEz7ku1p",
+"1LB1LjfREu","XyPZNfFDrJ","FGzgpJXljW","StlDJFwEJz","Fhtgl1j5L8","rhl0JTwano","QssNCStlDJ","29QAzgf8rI","v8yFN07n1c","O3iyQ2TRI7",
+"hE1QllCMxy","o8UydXflUq","ZJTXHW3VFH","uPX7GW7cTs","SWfouPOUYS","pAhR1LbRTH","AOgEetvdkD","WDVWJBGaQY","zbIYYh1zcH","HzZT8X6Pin",
+"jzUqRiB08l","ZhwG1lCMxy","dhSuHVerEA","okgRiDQimp","qaofNTwano","5Nammatef2","GXdoHRpBQm","3weIF9GXkX","cmXIX5IhmG","mz8gxBGaQY",
+"RmDcrxXTI4","JRJQBXyPZN","0Wr5y5iGN5","Dz1R33otm6","DG4sTCIShG","pFrrlazIWp","FLspho8Uyd","tvdkDTXQ0Z","SbRYyk85Ae","t59lRlweGy",
+"0ao3lyluBx","Yh1hFSbRYy","8cVD3VBjhz","vOqCELewvM","K4GS8W3VFH","FPfSERkQke","580YD7Ow5C","5iGN5ksJby","SjskQ7ku1p","M6qcGHlUbF",
+"iqv4ksqVrf","2DREs4dEz6","aDGtSOUYuF","580YDFPfSE","S77LH55rfB","euZA5l83Ud","Nxx9VuPX7G","IBe8kuN6r3","9eoRcgIYvE","kZANmNo0Qb",
+"U3yw5wDajX","ksJbyAgJHQ","UmaEvTwano","TCgPp24ARF","m4bxUAIYUu","0h1b1ECMvU","StlDJMmsIo","dpe1vhe9IA","zFgtBVLTy6","MojnPHRxd8",
+"yToGW8TxD7","h1zcHFhtgl","KZamHlweGy","Cfgr3s4786","QnJ1S5IhmG","nnP8ohi5X7","kZANm6q6L9","ru4UGfaHir","uN6r3AmdQd","07n1cIjTwP",
+"taOXKGSQwj","NAFuwLbRTH","5iGN5hUTw7","lCMxy45cIH","mX2GEokgRi","FcWrWGv3Fq","lm0pDvOqCE","okgRiWPmlx","pmeCdEoToP","2NslmAkKTk",
+"ulk411j5L8","taOXKzY1GY","v8yFNFLsph","5ZaEzZUnqt","3weIFru4UG","SWfouzQt6Q","vkCHHtvdkD","fLNg8BGaQY","iqv4kcShY2","618Di4dEz6",
+"lCMxyK20wK","14FLRs93Ml","fFDrJvOqCE","5iGN5vLsmS","9y4lwO3iyQ","KZamH55rfB","KASQ8s7Mxk","fqypys7Mxk","zz4ZUtAOsr","zmLYDCxVEf",
+"OHaBzQClRL","S77LHB3qem","cL0aEqaofN","hUTw7hYBCK","Cfgr3AXpwE","lpF6WChuy3","L7cGcbrhlQ","RpBQmfcJOy","SmGzvSjskQ","D6rByThjNn",
+"GXdoHUmaEv","M3zXLuPX7G","s93Mlm4bxU","YjB9t8xEKz","s93Mliqv4k","Chuy3faHir","NOHszjiVBP","vOqCEfqypy","4dEz6d7vjM","okgRiqaofN",
+"Cp3mZ7fKYU","7Ow5Cd7vjM","h1zcHogLgc","h1zcH9XyT9","Chuy37Ow5C","2Yz7EpvgjS","tvdkDOUqFM","tuDySjfREu","n8pJ9RpBQm","lCMxyQChxs",
+"FGzgpECMvU","9rlg9iqv4k","ix74rWMiS3","gtCA5QClRL","QbxXct98iW","blLA9LbRTH","ZuDtDLbRTH","4W0TlBCxeC","jtn0Xhe9IA","RzaZA3otm6",
+"ni2v1MaJQs","gjUTuQssNC","3weIFprNT6","9XyT9s93Ml","2ZHdkpvgjS","wiHrZQClRL","AOgEe8cVD3","hUTw7cL0aE","uupzk5Namm","e6e4zcL0aE",
+"Pb1paYf2Ec","I7p2aJ2mQi","Ta8f6QChxs","Dz1R3lViBv","gjUTun8pJ9","FPfSEguMb8","BbwgA9iGoT","45cIH0BmCy","GXdoH5VZjS","Cfgr3pmeCd",
+"x3LDeGWqqX","xXTI4Yw2oU","TCgPpYf2Ec","yEfy9U3yw5","FVMxonFqik","SWfouzmLYD","VBjhziqv4k","aez9yQssNC","GrDg7DG4sT","ni2v1AIYUu",
+"BbwgA14FLR","Yw2oUpWiOs","07n1c0Wr5y","FLsphZv7z0","v8yFNQClRL","tlILtsuY4x","StlDJM6qcG","EdBKc8FmFH","G1RhSRmDcr","EOE1o8cVD3",
+"NAFuwCK5W7","ECMvU2Nslm","PYBf4hYBCK","D6rBynnP8o","CxVEfFVMxo","s93Ml1v5hH","FnPFBFPfSE","FxX9qZUnqt","cShY20h1b1","XflUqlCMxy",
+"0PktIRzaZA","Mm8sipFrrl","kB5nPuLtKs","M6qcGAgJHQ","Z4I1vZ4I1v","e6e4z9rlg9","zqH0WQnJ1S","X6PinTa8f6","24ARFFFDui","uPX7Gru4UG",
+"FcWrWdQ586","AkKTkP6bcg","lH1ktru4UG","29QAzZJTXH","he9IAv1Hln","M3zXLfLNg8","8U2nUfLNg8","suY4xlXFOB","JkzUnix74r","v8yFNQnJ1S",
+"tvdkDlsQGo","e6e4zix74r","h1zcHAgJHQ","RkQkerhl0J","jtn0X1v5hH","Q6hMCM3zXL","CNHmvHRxd8","VNCPdtaOXK","SbRYyQssNC","VNCPd7fKYU",
+"24ARFuLtKs","9y4lwpWiOs","v2eC3dQ586","YOfrYZhwG1","MK07YNcICA","0KyfsAOgEe","W3VFH8xEKz","S77LHNOHsz","zQt6Qv1Hln","tvdkDuPX7G",
+"RzaZAVIlwP","5VZjSUlU3M","XyPZNzHF1q","dhSuHSbRYy","gjUTuKASQ8","Ul4a1OxWIH","RsQUqmz8gx","0ao3loVQp6","cL0aEDz1R3","DcpWBxXTI4",
+"Uvlv4B3qem","Oz8yZ29QAz","ix74rn8pJ9","BFkb8Y1mC0","sx5GlqaofN","jiVBPjeskS","fLNg8d7vjM","VBjhzCqqaD","aez9ysuY4x","EdBKc5Mg9r",
+"e6e4zfFDrJ","MezSWPb1pa","he9IAG1RhS","RACujStlDJ","nnP8oO3iyQ","fFDrJ7fKYU","WDVWJmX2GE","NcICAIn3NS","DQimp3weIF","bZLvSIn3NS",
+"1LB1LHP433","bZLvSJRJQB","6q6L98TxD7","8RCUAqaofN","uoStwn1pmO","uTacx0Kyfs","7fsYMDG4sT","vLsmSpFrrl","iB08lWreyP","2ZHdkjtn0X",
+"gtCA5ThjNn","Oz8yZ9y4lw","ru4UGEdBKc","qaofNcL0aE","2hEEUDQimp","8FmFHb29RJ","yofH329QAz","MojnPpmeCd","CK5W7FFDui","WMiS3MmKGJ",
+"Ta8f6NhXdu","EdBKcTa8f6","5nmWvgtCA5","55rfBwDajX","sx5Gls4786","pAhR1OUYuF","No0QbF6PT2","5Mg9rblLA9","pAhR1GWqqX","ru4UGSs0Zu",
+"8TxD7guMb8","Mm8si64s8N","HP433s4786","ECMvUiwzGk","Gv3FqBpYhV","vkCHHBGaQY","1j5L8iwzGk","tl72WaFFss","yToGWAOgEe","IKxdLv8yFN",
+"jSjS3nlaBy","In3NSGv3Fq","4QMc9uAWyp","NAFuwNhXdu","okgRie6e4z","KZamHfLNg8","LbRTH3otm6","mX2GETXQ0Z","4dEz6QChxs","RACujxReec",
+"CdyBVUlU3M","VLTy648cHL","hE1Qll83Ud","tlILtTa8f6","VjCZqdjsrv","ReKEW0PktI","VBjhz4W0Tl","6q6L9FnPFB","cmXIXCNHmv","Dz1R38TxD7",
+"xXTI4aDGtS","5IhmG2DREs","dQ586wiHrZ","mX2GEC2Irc","Y1mC048cHL","QChxs9iGoT","ulk41soy9t","QChxsUlU3M","0h1b155rfB","M3zXLuZPqg",
+"IBe8ktvdkD","Nxx9VBGaQY","SmGzvlpF6W","UmaEvHRxd8","14FLRjtn0X","JRJQBUmaEv","Oz8yZuPX7G","kB5nPX6Pin","9y4lw9eoRc","0YAGHGXdoH",
+"l83UdjiVBP","hYBCK9y4lw","NhXduWmadA","Qworu1LB1L","blLA9NOHsz","U3yw57X3uy","lkMUAe6e4z","mX2GEDz1R3","WreyPgf8rI","VerEA64s8N",
+"lj07Qfqypy","8xEKzvLsmS","Yh1hFeuZA5","O3iyQpv0i7","yofH3dQ586","ogLgcB3qem","D6rByRzaZA","uN6r3NAFuw","Yw2oUksJby","uQIczJIqXi",
+"ru4UGtl72W","i3pyddmoS7","hYBCKFGzgp","Chuy307n1c","CdyBVEOE1o","zY1GYEOE1o","qQxHPWDVWJ","6AFT0WPmlx","F6PT2MaJQs","618DifaHir",
+"FjHXRuLtKs","JRJQBF6PT2","mz8gxTCgPp","FjHXRCp3mZ","VLTy6NhXdu","RkQkeiB08l","5iGN5gjUTu","9rlg9POUYS","Q6hMClm0pD","6q6L98RCUA",
+"l83UdiwzGk","BGaQYfFDrJ","7fsYMSmGzv","uvf7ATa8f6","4QMc9aL6AJ","CIShGEoToP","TCgPpJ2mQi","FwEJzFGzgp","QWxoTdmoS7","2Yz7ExXTI4",
+"n1pmO55rfB","dhSuHi3pyd","zz4ZUAIYUu","FnPFB07n1c","ydG8UJXljW","qaofNRzaZA","ThjNnIn3NS","d85a9h1zcH","tjQxsb29RJ","pAhR10PktI",
+"ZzJHWRmDcr","sx5GllweGy","xciqpxXTI4","4dEz6mz8gx","blLA9VLTy6","fmIK12TRI7","azIWpOUYuF","tjQxs9y4lw","GrDg78xEKz","fFDrJcmXIX",
+"gdQsScL0aE","yEfy9FVMxo","suY4xy94nw","qUJMdlkMUA","RkQkeHfyNQ","pvgjSNAFuw","Yf2EcWDVWJ","ksJbyZhwG1","lsQGorhl0J","LewvMRACuj",
+"lXFOBOz8yZ","t59lRnnP8o","RsQUqL7cGc","FPfSENAFuw","fcJOyP6bcg","nFqikNcICA","zbIYYy94nw","hUTw7GWqqX","Mkgy8MaJQs","kZANmDLhzM",
+"gIYvEzHF1q","ru4UG9rlg9","0h1b1BGaQY","HlUbF9rlg9","uLtKsBGaQY","WmadAMezSW","zz4ZUe6e4z","618DizbIYY","HlUbFlkMUA","d7vjMk85Ae",
+"v2eC3M3zXL","2Yz7EpiJSk","jtn0XxReec","6AFT0IKxdL","8U2nUuupzk","7fsYMlj07Q","POUYSbrhlQ","lViBvwDajX","dhSuHIKxdL","StlDJIjTwP",
+"Fhtgl07n1c","blLA9Y1mC0","tl72WgtCA5","0h1b1jfREu","yluBx14FLR","n8pJ9oGu6x","Gv3FqYw2oU","rhl0JbZLvS","5ZaEzru4UG","SjskQQnJ1S",
+"gdQsStl72W","e6e4zpWiOs","dpe1vStlDJ","C2IrcbZLvS","bgJAz6AFT0","GSQwjeuZA5","guMb8DcpWB","aL6AJ7X3uy","BbwgAlkMUA","2hEEURxrsm",
+"2NslmHlUbF","taOXKwDajX","KsjRKoQ87r","UmaEvtjQxs","zFgtBHP433","4W0Tluvf7A","5IhmGhi5X7","NAFuw4QMc9","8U2nURBhp0","Vprf20PktI",
+"CqqaD2TRI7","cQOnvDcpWB","NAFuwFxX9q","yofH3QssNC","Zv7z0s7Mxk","QWxoTcShY2","prNT6uoStw","64s8N9rlg9","IKxdLOz8yZ","iKqhruupzk",
+"AXpwEpvgjS","zz4ZUvOqCE","QssNCiB08l","FwEJzQWxoT","gIYvEG1RhS","M3zXLFjHXR","RmDcrs7Mxk","MmsIo48cHL","ydG8UoVQp6","lXFOB8RCUA",
+"ciuWz5Drn0","2ZHdkjiVBP","J2mQifcJOy","BbwgA5VZjS","CIShGRxrsm","FcWrWChuy3","Dz1R3618Di","3weIFfFDrJ","UlU3Mi7WMQ","zY1GYC2Irc",
+"mz8gxEoToP","9XyT9GWqqX","BpYhVRxrsm","FNYIMulk41","uAWyppT8wu","IjTwPRACuj","DLhzMgIYvE","5ZaEz618Di","QClRL2Yz7E","VBjhzZhwG1",
+"VNCPdDcpWB","cmXIXyToGW","16lHcQbxXc","uJScX5IhmG","AIYUu9y4lw","AXpwEZzJHW","J2mQiuoStw","oQ87rMmKGJ","NhXduZuDtD","9XyT9zqH0W",
+"YOfrYcL0aE","5Drn0Yw2oU","C2Irc3weIF","cmXIXAIYUu","dmoS7fLNg8","EOE1ooVQp6","yEfy9K20wK","KsjRKsqVrf","HfyNQMmsIo","JkzUnI7p2a",
+"jS1ajNhXdu","FGzgpbZLvS","F6PT2tlILt","5ZaEzlweGy","FnPFBfmIK1","uupzkazIWp","azIWpM3zXL","pv0i7uJScX","zQt6QQ6hMC","CIShGVIlwP",
+"lweGynFqik","Ul4a1QbxXc","WmadAzbIYY","tlILtPb1pa","tuDySblLA9","yEfy9he9IA","nFqik3otm6","lViBvyEfy9","K4GS87hyVv","v1Hln9eoRc",
+"2Yz7EDLhzM","IKxdLGrDg7","Nxx9Vulk41","VNCPdMojnP","tvdkDlj07Q","Q6LixZuDtD","JIqXisqVrf","zz4ZUuQIcz","W7cTsblLA9","7lUXZogLgc",
+"Mm8siaFFss","FFDuin1pmO","wiHrZQworu","MK07Y9XyT9","zFgtBQworu","xXTI4NOHsz","m4bxUMGlTF","sx5GlRsQUq","RmDcr24ARF","pv0i7aDGtS",
+"JJs5mMaJQs","zz4ZUuvf7A","nnP8oFLsph","24ARFYh1hF","580YDbZLvS","5VZjSReKEW","uZPqgxXTI4","5nmWve6e4z","GSQwjSWfou","jzUqRAmdQd",
+"AXpwEzmLYD","55rfBEdBKc","QssNC5ZaEz","okgRiK20wK","580YDfaHir","4W0TlY1mC0","VIlwPt59lR","k85AeG1RhS","7lUXZWaWsv","StlDJksJby",
+"lCMxyFLsph","4QMc9cmXIX","POUYSxReec","b29RJtuDyS","kB5nPo8Uyd","No0QbBpYhV","Pb1palj07Q","7lUXZnlaBy","ZzJHWcShY2","DG4sTHlUbF",
+"mz8gxn1pmO","fcwDai3pyd","AkKTk5Mg9r","FPfSE8TxD7","VLTy6hE1Ql","WreyP16lHc","suY4xF6PT2","RmDcrDG4sT","cL0aEJXljW","M6qcGQWxoT",
+"gdQsScShY2","RsQUqyToGW","i7WMQtAOsr","CqqaDHfyNQ","azIWpuvf7A","GXdoHhUTw7","MezSWpWiOs","uLtKsRpBQm","UlU3Muvf7A","GrDg7GWqqX",
+"QYxC0VjCZq","KsjRK580YD","3weIFpWiOs","NhXduOUYuF","ciuWzsuY4x","EdBKcD6rBy","8RCUAVerEA","0h1b1s93Ml","prNT6HlUbF","zmLYDFPfSE",
+"0Wr5ytAOsr","GXdoHsoy9t","zmLYDK20wK","IKxdLnnP8o","0ao3lGSQwj","4QMc9J2mQi","oGu6xQ6Lix","ECMvU14FLR","2DREsOHaBz","blLA9Dz1R3",
+"6AFT0Kr8ys","yEfy9S77LH","OxWIHEoToP","9iGoT9GXkX","RmDcrHRxd8","rhl0JQworu","W7cTstuDyS","dmoS7bgJAz","pvgjSAIYUu","iKqhrogLgc",
+"aFFss1j5L8","L7cGc8TxD7","t98iWVLTy6","lm0pDn8pJ9","8U2nUUvlv4","iB08l5iGN5","EoToPiB08l","gjUTuYf2Ec","G1RhSzqH0W","O3iyQk85Ae",
+"55rfBGv3Fq","LDk6f07n1c","jeskSJIqXi","14FLR3weIF","K4GS8X6Pin","14FLRyvOMI","Q6hMCMojnP","P6bcg9rlg9","jtn0XbgJAz","lViBv0YAGH",
+"IRh48YjB9t","tjQxsqaofN","Pb1paI7p2a","Yf2EcfFDrJ","3weIFQChxs","DG4sTMmsIo","Y1mC0sx5Gl","tuDySdmoS7","OHaBz8U2nU","5VZjS5VZjS",
+"ogLgcNo0Qb","bZLvSFcWrW","lViBvVNCPd","JRJQBuQIcz","zFgtBtvdkD","5IhmGNxx9V","soy9tBCxeC","Fhtglt98iW","KsjRKzY1GY","oVQp6dpe1v",
+"cmXIXHfyNQ","faHir5Drn0","OxWIH29QAz","aDGtSgf8rI","oQ87rhSSvQ","8xEKzHlUbF","a00b5lsQGo","uZPqgEOE1o","4dEz62hEEU","NAFuwi7WMQ",
+"FhtglCIShG","pv0i7VNCPd","lsQGofaHir","piJSkxciqp","MK07Yru4UG","In3NShi5X7","y94nwJRJQB","qQxHPOUqFM","QClRLhUTw7","yvOMIlsQGo",
+"tl72WFnPFB","BpYhV8U2nU","yluBxUlU3M","6q6L9jeskS","nlaByFGzgp","Ul4a10Wr5y","7X3uyazIWp","AkKTkBpYhV","AXpwEAIYUu","cQOnvUmaEv",
+"cShY2gdQsS","3otm6LewvM","EdBKcciuWz","FPfSE9XyT9","rz7UtQYxC0","M3zXLfcwDa","kZANmfcwDa","nlaBys93Ml","TXQ0ZuN6r3","CK5W7uPX7G",
+"Uvlv4he9IA","BFkb8zz4ZU","MK07YuoStw","zqH0WtlILt","FNYIM580YD","8TxD7BFkb8","fLNg8QnJ1S","yToGWK4GS8","2TRI7zbIYY","tvdkDt98iW",
+"Zv7z0jtn0X","cQOnvnFqik","1LB1Lt98iW","RkQkeUl4a1","d85a9F6PT2","zmLYD3otm6","3weIFni2v1","W3VFHi3pyd","1v5hHnlaBy","b29RJs4786",
+"FLsphlViBv","DLhzMksJby","ZzJHWlm0pD","Yw2oUNxx9V","YjB9t0h1b1","2DREs24ARF","bZLvSVNCPd","fLNg8NhXdu","IRh48FcWrW","Waim6lkMUA",
+"2ZHdktvdkD","2Yz7E9rlg9","SjskQtaOXK","QYxC0vLsmS","8hJdtrhl0J","IjTwPyvOMI","rKDLJs93Ml","XflUqMmKGJ","XyPZNsuY4x","48cHLksJby",
+"F6PT25Drn0","W7cTs29QAz","EOE1oFwEJz","FNYIMm4bxU","IBe8kCIShG","IBe8kFjHXR","zQt6QIjTwP","BbwgAMmsIo","VIlwP7lUXZ","vLsmS2TRI7",
+"580YDzmLYD","brhlQJIqXi","IBe8kksJby","bgJAzsx5Gl","C2IrcuLtKs","5ZaEzUlU3M","9GXkX2Yz7E","5drc6v8yFN","ydG8UW7cTs","tvdkD9eoRc",
+"Vprf2he9IA","QClRLmX2GE","0YAGHnFqik","GSQwj8hJdt","GSQwj2hEEU","cShY2BbwgA","oQ87rblLA9","16lHc7hyVv","JIqXipT8wu","KsjRKjSjS3",
+"8RCUAIjTwP","piJSktAOsr","AIYUulCMxy","0Wr5y8U2nU","zQt6QVjCZq","Waim65ZaEz","QChxsBpYhV","d85a9XflUq","8hJdtBpYhV","AmdQdpvgjS",
+"5IhmGJXljW","fLNg8VIlwP","dmoS72Nslm","FwEJzHP433","pAhR1pAhR1","yofH3vLsmS","KZamH8TxD7","uZPqgQworu","qQxHPTXQ0Z","qQxHPW3VFH",
+"8xEKztAOsr","Fhtglo8Uyd","8FmFHkB5nP","atef2VerEA","dhSuHWreyP","VjCZq0h1b1","OHaBzzHF1q","DG4sThUTw7","cShY2VBjhz","X6Pin5IhmG",
+"k85AecmXIX","vLsmSNxx9V","KZamHAXpwE","OUYuF9GXkX","NcICANAFuw","cShY2D6rBy","sqVrft98iW","DcpWBVerEA","dmoS7vkCHH","CIShG9y4lw",
+"IBe8kpiJSk","vkCHHGrDg7","sqVrf8xEKz","n1pmOrz7Ut","VerEAWDVWJ","0h1b1HP433","atef28cVD3","iB08lMaJQs","SmGzv7hyVv","TwanoOz8yZ",
+"euZA5M3zXL","5Mg9rjS1aj","pFrrlgdQsS","dpe1vRBhp0","o8Uyd8RCUA","8U2nUAmdQd","vOqCEQnJ1S","iwzGkZJTXH","ydG8UVLTy6","O3iyQGWqqX",
+"PYBf4rz7Ut","QssNCG1RhS","GWqqXatef2","GWqqX14FLR","Twano2TRI7","MmKGJFVMxo","GSQwjSs0Zu","Kr8yszY1GY","G1RhSJJs5m","xXTI4Zv7z0",
+"AOgEe9GXkX","YjB9tWPmlx","yofH3VjCZq","Vprf2IKxdL","07n1c0h1b1","uoStwX6Pin","P6bcgZUnqt","yEfy9Fhtgl","Yh1hFRACuj","8U2nUfFDrJ",
+"0h1b1uJScX","o8UydAIYUu","5Drn0jtn0X","yofH35drc6","AkKTkIn3NS","hi5X7oQ87r","aFFss9iGoT","WDVWJfcJOy","uJScXMGlTF","euZA55iGN5",
+"ogLgchYBCK","soy9t14FLR","RmDcr1v5hH","MmsIotlILt","0ao3lgdQsS","Zv7z0ECMvU","VerEAIBe8k","07n1cni2v1","RxrsmxXTI4","zbIYYprNT6",
+"ZJTXH0Kyfs","yEfy9Oz8yZ","W3VFHJXljW","brhlQ5IhmG","X6PinpFrrl","CNHmvrz7Ut","Oz8yZ1LB1L","azIWpFGzgp","FVMxoMmsIo","lsQGo6q6L9",
+"h1zcHaDGtS","lpF6WzHF1q","jSjS3ECMvU","618Dizz4ZU","RpBQmfFDrJ","zHF1qAgJHQ","M6qcGAIYUu","X6PinzY1GY","14FLRGv3Fq","VIlwP8hJdt",
+"RpBQmfmIK1","VLTy60MR5X","blLA9sx5Gl","rKDLJyofH3","v8yFNaL6AJ","uQIcz7Ow5C","pvgjShSSvQ","pvgjSDcpWB","F6PT2pFrrl","8U2nUfqypy",
+"POUYSPOUYS","Oz8yZ0MR5X","ix74rzbIYY","fLNg8GrDg7","guMb8B3qem","MaJQskB5nP","iB08ls7Mxk","DLhzM5Drn0","qaofNUvlv4","P6bcgWreyP",
+"3weIFRpBQm","uupzkAmdQd","9y4lw0h1b1","lweGy9y4lw","y94nwMK07Y","jfREuFFDui","hSSvQJIqXi","Q6hMCsqVrf","aFFss14FLR","aDGtSmz8gx",
+"ZhwG19rlg9","AgJHQZ4I1v","hSSvQgIYvE","SbRYyWDVWJ","StlDJ8RCUA","prNT66AFT0","uLtKsSmGzv","iKqhrMezSW","rKDLJiqv4k","mX2GE1j5L8",
+"45cIHHP433","KsjRKChuy3","lCMxyKr8ys","LDk6fxciqp","14FLRStlDJ","IjTwPjtn0X","SbRYy29QAz","L7cGc3otm6","G1RhSW3VFH","0YAGHsuY4x",
+"s93MlnlaBy","nFqiklCMxy","EOE1oDQimp","soy9tIn3NS","x3LDeZ4I1v","8FmFHblLA9","0h1b1nlaBy","vkCHHRBhp0","LbRTHP6bcg","xciqpThjNn",
+"MmKGJogLgc","FLsphn8pJ9","d85a9aez9y","xciqpfmIK1","guMb8XflUq","Y1mC0LDk6f","9eoRchSSvQ","QssNCDcpWB","IBe8kJXljW","d7vjMjiVBP",
+"MezSWFGzgp","Yh1hF48cHL","uLtKsuAWyp","lXFOBGXdoH","VIlwPfcwDa","HfyNQgf8rI","8cVD3ciuWz","5Drn0taOXK","DG4sTdhSuH","9GXkXcShY2",
+"MezSWNcICA","ThjNnQChxs","YOfrYpWiOs","5IhmGBCxeC","S2DfuPb1pa","KASQ8IKxdL","9y4lwIn3NS","5Drn0uQIcz","BFkb8nlaBy","uQIczRkQke",
+"Oz8yZoVQp6","hi5X75Drn0","3weIFjzUqR","pT8wuGXdoH","CIShG8xEKz","Nxx9VQnJ1S","jS1ajP6bcg","HfyNQF6PT2","Zv7z04W0Tl","YjB9tHlUbF",
+"RsQUqulk41","5VZjSYf2Ec","uupzkWDVWJ","yvOMI8xEKz","2ZHdks4786","zY1GY8FmFH","7lUXZ618Di","8U2nUrhl0J","pFrrli3pyd","Yh1hFB3qem",
+"0BmCydhSuH","a00b5Ss0Zu","J2mQiv2eC3","d7vjMWaWsv","djsrvtjQxs","9y4lwGv3Fq","jS1ajMK07Y","S77LHsqVrf","OUqFMYOfrY","3otm6iB08l",
+"Nxx9V45cIH","vLsmS8RCUA","55rfB8RCUA","BGaQYNhXdu","FNYIMJJs5m","7ku1plsQGo","NOHszVNCPd","LbRTH2TRI7","Yw2oUUmaEv","gdQsS0ao3l",
+"ogLgcAOgEe","FjHXRazIWp","uLtKsoVQp6","SjskQuQIcz","zQt6Qulk41","Fhtgl1v5hH","lViBvXyPZN","a00b5MezSW","KZamHo8Uyd","kB5nPuvf7A",
+"NhXduFFDui","7fsYMnlaBy","FjHXR8TxD7","580YD5Mg9r","HzZT8OUqFM","29QAzDcpWB","oQ87rtlILt","v8yFNpFrrl","Kr8ysDQimp","brhlQjeskS",
+"v2eC34dEz6","d85a94dEz6","AXpwEguMb8","okgRitaOXK","fFDrJReKEW","he9IAM3zXL","Uvlv4DcpWB","0BmCy3otm6","rhl0JZUnqt","5Mg9rru4UG",
+"bZLvSQ6Lix","uJScXRsQUq","Ss0ZugjUTu","C2IrcM3zXL","atef2QssNC","Kr8yscmXIX","S77LHnlaBy","lViBvEoToP","hSSvQvOqCE","BGaQY580YD",
+"okgRipvgjS","yvOMIZzJHW","580YD5nmWv","SmGzvd7vjM","16lHcSjskQ","ZuDtDBGaQY","hSSvQGXdoH","QYxC0uupzk","2TRI70PktI","jfREuzbIYY",
+"L7cGcBbwgA","cQOnvsqVrf","2Yz7EZhwG1","pAhR1Kr8ys","8cVD3cmXIX","I7p2aoGu6x","JKWYRdmoS7","5drc6No0Qb","DcpWBjSjS3","uN6r31j5L8",
+"GSQwjMmsIo","4W0TlcL0aE","8TxD7qaofN","K20wKChuy3","K4GS8tvdkD","IBe8kHRxd8","Ul4a16q6L9","RkQkeMmsIo","uN6r3azIWp","he9IACK5W7",
+"Q6hMCUl4a1","0BmCyhUTw7","5Drn00h1b1","O3iyQ29QAz","ZhwG1XyPZN","he9IAzmLYD","VIlwPUl4a1","zFgtBs93Ml","uoStwtvdkD","x3LDeJRJQB",
+"yToGWaez9y","TwanoFLsph","hUTw7bgJAz","WaWsv8RCUA","07n1czz4ZU","AIYUuZuDtD","ZJTXHOUYuF","F6PT2NcICA","lH1ktaez9y","QYxC0lweGy",
+"IKxdLhYBCK","h1zcHuvf7A","WaWsvPb1pa","FGzgpNAFuw","gIYvEv1Hln","iqv4kpvgjS","euZA5iB08l","x3LDeIBe8k","pmeCdTCgPp","yofH3GrDg7",
+"MezSWjSjS3","ix74rqaofN","RkQkedhSuH","K20wKNOHsz","KsjRKprNT6","1j5L8IjTwP","BFkb82Nslm","0h1b1WPmlx","fcJOyVLTy6","0h1b15Drn0",
+"FhtglRpBQm","VBjhzkZANm","FwEJz64s8N","5IhmGMm8si","64s8NRBhp0","taOXKdpe1v","1v5hHi3pyd","HRxd8h1zcH","ogLgc55rfB","s93Ml4W0Tl",
+"e6e4zMm8si","dmoS7euZA5","zFgtBogLgc","pvgjSnFqik","HzZT8hUTw7","dhSuHVprf2","cL0aE5Drn0","jeskS6q6L9","RACujDLhzM","tuDySYf2Ec",
+"d85a95Namm","ulk41v1Hln","I7p2azHF1q","4W0Tl2ZHdk","D6rByoVQp6","qQxHPhUTw7","FFDuiYw2oU","x3LDe0PktI","K4GS8t59lR","EOE1okB5nP",
+"5drc6i7WMQ","Ta8f6Q6Lix","mz8gxJkzUn","Gv3FqNo0Qb","BGaQY3weIF","5NammB3qem","lj07QgtCA5","h1zcHIBe8k","h1zcH24ARF","5Mg9rcL0aE",
+"X6Pinfqypy","Mm8siVBjhz","iB08loVQp6","0h1b11LB1L","HfyNQyToGW","oGu6xv8yFN","pmeCdzQt6Q","uJScX0h1b1","AIYUuRBhp0","AIYUuCdyBV",
+"ciuWzuvf7A","hYBCKsoy9t","D6rBy48cHL","MK07YoVQp6","oGu6x9eoRc","lj07QFNYIM","gjUTuK20wK","euZA5ECMvU","ni2v1oGu6x","2NslmqUJMd",
+"1v5hHcL0aE","suY4xokgRi","14FLRlweGy","jtn0XEdBKc","prNT6LbRTH","OUqFMVprf2","LewvMSjskQ","XyPZNFVMxo","In3NSUvlv4","W7cTsLDk6f",
+"nnP8oJXljW","7hyVvhe9IA","Uvlv4jzUqR","C2IrcHzZT8","64s8NaDGtS","OUqFMwiHrZ","Gv3Fq9iGoT","lXFOBIjTwP","brhlQuN6r3","WDVWJ6q6L9",
+"uPX7G6AFT0","FLsphvkCHH","hUTw7SmGzv","tlILtZv7z0","LewvMsx5Gl","0BmCyaL6AJ","uN6r3fFDrJ","9iGoTqUJMd","FFDuiFxX9q","taOXKU3yw5",
+"JRJQBPb1pa","Yf2Ec5drc6","RzaZAEoToP","djsrvzHF1q","k85AeprNT6","FwEJzYh1hF","UlU3MAXpwE","lm0pD3weIF","GWqqX5Namm","qUJMd5ZaEz",
+"EdBKcC2Irc","ZUnqtFFDui","StlDJHP433","uQIczaez9y","7X3uyQnJ1S","DcpWBJXljW","WreyP1LB1L","OHaBz9XyT9","HlUbFPYBf4","v8yFNMaJQs",
+"8xEKzDG4sT","jS1ajL7cGc","GrDg7dmoS7","8hJdta00b5","blLA9GrDg7","SjskQqaofN","0KyfslH1kt","uoStwK20wK","FjHXRe6e4z","BbwgAAgJHQ",
+"UlU3M07n1c","Gv3FqnlaBy","B3qemyToGW","GXdoHW3VFH","L7cGcZ4I1v","FcWrWFnPFB","6q6L9zY1GY","jfREujzUqR","I7p2aStlDJ","0PktIFcWrW",
+"WaWsvAmdQd","S77LHvLsmS","K20wKStlDJ","C2IrcFGzgp","SWfou6q6L9","W3VFHn8pJ9","NhXdu24ARF","9GXkX7X3uy","IjTwPjSjS3","QChxsd7vjM",
+"ogLgcbrhlQ","8hJdtbrhlQ","4W0TlydG8U","W7cTsX6Pin","QbxXcciuWz","yvOMIciuWz","azIWpciuWz","9rlg9QWxoT","POUYSa00b5","ZJTXHmX2GE",
+"vkCHHVIlwP","OUYuFDcpWB","kB5nPtjQxs","5IhmGeuZA5","9eoRcaez9y","rhl0JD6rBy","EOE1oprNT6","lj07Q5Namm","XyPZN618Di","UmaEvM3zXL",
+"k85AetjQxs","fmIK14W0Tl","d7vjMzbIYY","FcWrWtjQxs","gtCA5cShY2","7X3uy0ao3l","EoToPIn3NS","DG4sTKsjRK","GWqqX0ao3l","2ZHdkKASQ8",
+"WaWsvJRJQB","0PktIzQt6Q","EoToP0PktI","qaofNLDk6f","GXdoH14FLR","pmeCdOz8yZ","2DREsK20wK","vOqCEzbIYY","Yw2oUprNT6","zz4ZUCfgr3",
+"2NslmD6rBy","8U2nUksJby","ReKEW0Wr5y","uJScXvLsmS","FLsphd85a9","14FLR0BmCy","lXFOBIBe8k","zHF1q45cIH","L7cGcFLsph","0YAGHqUJMd",
+"In3NSt98iW","MojnPZhwG1","yluBxwDajX","uPX7GFPfSE","jiVBPJ2mQi","F6PT2UlU3M","zQt6QDLhzM","4dEz62Yz7E","DLhzMK4GS8","t59lRoGu6x",
+"WreyPLbRTH","K20wK5VZjS","8xEKzb29RJ","LbRTHDLhzM","jS1ajb29RJ","nlaBy24ARF","pWiOsl83Ud","MmsIouAWyp","VLTy6ydG8U","tAOsrni2v1",
+"8FmFHtvdkD","Qworuo8Uyd","5Drn0iKqhr","6q6L9gtCA5","lpF6WGrDg7","fcJOytaOXK","hYBCKSWfou","1LB1LWPmlx","GXdoHF6PT2","n8pJ9taOXK",
+"brhlQ0h1b1","QClRL16lHc","LDk6fG1RhS","bZLvSP6bcg","d85a9iKqhr","16lHcMojnP","gtCA5No0Qb","xciqpuoStw","VBjhza00b5","uupzkUmaEv",
+"Kr8ysK20wK","wDajXCfgr3","AgJHQjSjS3","7fKYU0Wr5y","v1HlnfFDrJ","atef27fsYM","1j5L8o8Uyd","lH1ktEOE1o","s7MxkmX2GE","sqVrffcJOy",
+"euZA5D6rBy","fcwDaYOfrY","GrDg7Twano","ZUnqtCK5W7","kB5nPKZamH","Q6LixsqVrf","VLTy6gf8rI","cL0aE3otm6","VerEApmeCd","Dz1R3uAWyp",
+"StlDJuTacx","TCgPpQClRL","lj07QhUTw7","lXFOB0YAGH","GrDg7S2Dfu","TXQ0ZpFrrl","ZUnqtKsjRK","rz7Utt98iW","e6e4zvkCHH","lkMUAJ2mQi",
+"dhSuHOHaBz","WDVWJVLTy6","SmGzve6e4z","2TRI7ZJTXH","O3iyQMkgy8","m4bxU8TxD7","prNT6Dz1R3","Cfgr3m4bxU","HRxd8MmsIo","9GXkXEOE1o",
+"5Mg9rNAFuw","uQIczOxWIH","nnP8oWaWsv","Q6hMCv8yFN","Chuy3WmadA","0KyfszqH0W","pmeCdXyPZN","sqVrfprNT6","VBjhzydG8U","QssNC8xEKz",
+"pFrrljtn0X","pAhR1OUqFM","S77LHXflUq","5iGN51v5hH","S2DfuQChxs","4W0TlDQimp","fmIK1Q6Lix","aez9yZuDtD","guMb8SmGzv","fcJOyMmsIo",
+"AOgEeFLsph","HzZT8MmsIo","Waim6blLA9","uLtKsSbRYy","Z4I1vKsjRK","uZPqgoQ87r","lH1ktfcwDa","bgJAzXyPZN","RzaZAuLtKs","2DREs1LB1L",
+"gdQsSZv7z0","UmaEvpT8wu","aL6AJDcpWB","45cIHzY1GY","EoToP9iGoT","mX2GEjSjS3","M6qcG6q6L9","pWiOsb29RJ","MGlTFTa8f6","sqVrf8RCUA",
+"xXTI45ZaEz","J2mQiSs0Zu","lCMxyI7p2a","sx5GlgtCA5","pv0i7EdBKc","SmGzvvLsmS","9iGoTRzaZA","45cIHpv0i7","zbIYYZ4I1v","XflUqZhwG1",
+"7X3uy8xEKz","piJSke6e4z","OxWIHokgRi","BbwgATXQ0Z","HfyNQjiVBP","HfyNQqQxHP","POUYSWreyP","okgRiJkzUn","x3LDeFPfSE","ciuWzMkgy8",
+"4QMc97fKYU","yofH3ThjNn","jSjS3sx5Gl","qQxHPblLA9","cmXIXjiVBP","uPX7Gl83Ud","8cVD3Waim6","D6rByFwEJz","P6bcgMojnP","s7MxkFjHXR",
+"gdQsS7fKYU","KASQ8yToGW","EOE1o9GXkX","kB5nPy94nw","MK07YsuY4x","JXljWAgJHQ","VjCZqQ6Lix","lm0pDMaJQs","IRh48LbRTH","cQOnv6q6L9",
+"yEfy91LB1L","bgJAzCK5W7","iB08lhUTw7","t98iWS2Dfu","Y1mC0GWqqX","ksJbynFqik","fFDrJbgJAz","cmXIXSbRYy","ECMvUWDVWJ","mz8gxVLTy6",
+"9rlg97lUXZ","soy9t9rlg9","24ARFru4UG","ReKEWlH1kt","zY1GYCK5W7","ZuDtDdmoS7","o8Uydulk41","ReKEWkB5nP","oGu6xNhXdu","Cfgr38cVD3",
+"LbRTHhUTw7","pT8wu580YD","lm0pDdmoS7","8TxD7zHF1q","v2eC3VNCPd","0h1b1lsQGo","QChxscmXIX","0h1b1BpYhV","zbIYY7hyVv","SmGzvhe9IA",
+"jS1ajPb1pa","Ta8f6HRxd8","0Kyfs7Ow5C","QworuzHF1q","ulk41dmoS7","5nmWvlkMUA","Cfgr3iKqhr","QnJ1S0Wr5y","y94nwSs0Zu","07n1cVprf2",
+"OUYuFNxx9V","iqv4kBpYhV","618Ditl72W","uvf7A0BmCy","5Drn05drc6","PYBf4M6qcG","JXljWs93Ml","J2mQizqH0W","CNHmvIKxdL","RsQUqrz7Ut",
+"nFqik29QAz","8cVD37fKYU","55rfBy94nw","5Drn0jfREu","xReecReKEW","n8pJ9ZzJHW","9rlg9JJs5m","MmKGJo8Uyd","Kr8ys16lHc","yToGWJkzUn",
+"AXpwEZuDtD","iwzGk0Wr5y","I7p2apiJSk","MojnPSbRYy","Ul4a1RzaZA","9rlg9RACuj","L7cGciqv4k","7X3uyzY1GY","EOE1ov2eC3","yofH3dmoS7",
+"zFgtBuJScX","BpYhVzQt6Q","jSjS3RpBQm","KsjRKD6rBy","Cfgr3RACuj","5iGN5MmKGJ","7fKYU0h1b1","EOE1oqaofN","2ZHdkM3zXL","SbRYyRxrsm",
+"fLNg8WPmlx","gjUTuzY1GY","vOqCEgtCA5","hUTw7jS1aj","K20wKJXljW","xXTI4zQt6Q","VLTy6e6e4z","y94nwvOqCE","xXTI4brhlQ","618DiDQimp",
+"IKxdLlkMUA","ZJTXHVprf2","ECMvUWPmlx","tlILtxciqp","jzUqRJJs5m","l83UdbZLvS","JXljWrKDLJ","DLhzMFnPFB","GXdoHNcICA","fcJOy9iGoT",
+"IBe8k3weIF","WaWsvQworu","QWxoTVNCPd","uZPqgCxVEf","VerEA5ZaEz","2hEEUNcICA","lViBvL7cGc","KZamHaDGtS","Chuy3SWfou","K4GS8lpF6W",
+"7X3uyhSSvQ","atef2azIWp","6q6L9W7cTs","sx5GlX6Pin","UlU3MrKDLJ","jS1ajW7cTs","PYBf4Nxx9V","pT8wuzQt6Q","8hJdt3weIF","yEfy9uAWyp",
+"VBjhzYw2oU","pv0i7No0Qb","x3LDes93Ml","fLNg8BFkb8","xciqpRsQUq","29QAzFVMxo","4dEz6W7cTs","ZzJHWlXFOB","XflUqn1pmO","gtCA5LewvM",
+"M3zXL5VZjS","iKqhrAOgEe","VBjhzKZamH","MojnPMkgy8","AmdQdiB08l","W3VFHtjQxs","cQOnvF6PT2","CqqaDCdyBV","8cVD3v8yFN","VjCZqYf2Ec",
+"oVQp6fcwDa","RmDcrksJby","JKWYRCK5W7","lXFOBatef2","pvgjSZUnqt","FnPFBKZamH","9rlg92TRI7","JIqXiPYBf4","JIqXiqaofN","JRJQBdhSuH",
+"i3pydtAOsr","he9IAMkgy8","3weIFLbRTH","aL6AJJJs5m","JKWYRpvgjS","tAOsrNhXdu","BpYhVuupzk","S77LHyluBx","xXTI4JJs5m","uN6r3uvf7A",
+"pv0i78TxD7","ZuDtDksJby","VerEAXflUq","14FLR5iGN5","bZLvS618Di","fcJOyQworu","Pb1paAmdQd","ni2v1SmGzv","Ul4a1580YD","ogLgc2Yz7E",
+"CqqaDt98iW","aL6AJl83Ud","pT8wulj07Q","HlUbFM3zXL","okgRiYf2Ec","pvgjSqaofN","Chuy3fmIK1","lkMUAIBe8k","45cIHZUnqt","5Mg9reuZA5",
+"gtCA5i3pyd","QYxC0yofH3","NcICA5ZaEz","xReec0MR5X","tuDySGWqqX","HlUbFSmGzv","jtn0XKASQ8","0BmCyMm8si","uvf7AMm8si","k85AeVIlwP",
+"RzaZAxReec","QClRL2DREs","FwEJzAmdQd","pT8wulsQGo","0BmCypmeCd","zFgtBI7p2a","PYBf41j5L8","5Mg9rOz8yZ","lCMxyUlU3M","6q6L9C2Irc",
+"d7vjMy94nw","bZLvSG1RhS","faHir8cVD3","lCMxyGXdoH","cL0aEWMiS3","Gv3FqTXQ0Z","7ku1p9eoRc","gIYvEd7vjM","2TRI7Q6hMC","uAWypF6PT2",
+"MmKGJQssNC","Ul4a1RsQUq","kZANmSbRYy","ZzJHWiB08l","9GXkXjfREu","YOfrY8hJdt","faHirHRxd8","QWxoTdpe1v","tl72WlCMxy","ZzJHWStlDJ",
+"iwzGkk85Ae","uZPqgblLA9","0MR5XjSjS3","55rfBCfgr3","7X3uytl72W","Waim6yvOMI","KZamH7fsYM","0ao3l9rlg9","IjTwPdmoS7","pmeCdJXljW",
+"k85AeP6bcg","uupzk14FLR","pvgjSt59lR","fcJOyciuWz","qQxHPzqH0W","jSjS3t98iW","DLhzMAIYUu","fLNg8jiVBP","i3pyduN6r3","iKqhruZPqg",
+"cmXIXDQimp","2NslmQbxXc","tjQxsRxrsm","h1zcHbrhlQ","lpF6WxReec","5nmWvyvOMI","uQIczRmDcr","5Mg9rQ6hMC","iB08lFhtgl","SjskQfqypy",
+"S77LHStlDJ","0BmCyWreyP","euZA5aDGtS","MGlTF8TxD7","3otm6AXpwE","y94nwxReec","HlUbFLewvM","pmeCdCfgr3","CxVEfY1mC0","atef2OUYuF",
+"FwEJzbZLvS","EoToPgIYvE","580YD48cHL","ulk417lUXZ","RACuj0Kyfs","7ku1plm0pD","o8Uyddpe1v","POUYSLDk6f","hUTw7uQIcz","FjHXRbgJAz",
+"WPmlxa00b5","KZamHMK07Y","lj07QGXdoH","BpYhVWaim6","OxWIHyvOMI","Uvlv4mX2GE","K4GS8Dz1R3","okgRiHfyNQ","mz8gxTwano","iwzGkjSjS3",
+"Z4I1vNo0Qb","guMb8HP433","pFrrlRsQUq","yEfy9jeskS","45cIHHfyNQ","AkKTkTXQ0Z","WreyP5Mg9r","lm0pDru4UG","KsjRKUl4a1","D6rByuupzk",
+"5ZaEz7hyVv","s93MlfcJOy","9y4lwJkzUn","Waim6EdBKc","v8yFNFFDui","K20wKlViBv","dhSuHAIYUu","pT8wuIn3NS","nFqikhe9IA","lpF6W0BmCy",
+"Yh1hFhSSvQ","GWqqXyEfy9","lj07Qmz8gx","cShY2ciuWz","4QMc9taOXK","bgJAzAgJHQ","DG4sTMGlTF","5Mg9rQworu","vLsmSOUYuF","8FmFHfcJOy",
+"AmdQdsqVrf","8FmFHUmaEv","qUJMdRpBQm","KZamH9GXkX","atef2nlaBy","TwanoDG4sT","0h1b1QWxoT","24ARFydG8U","uTacxJJs5m","OxWIHCp3mZ",
+"qQxHP580YD","jeskSCp3mZ","1v5hHLewvM","AIYUufLNg8","0PktIuupzk","okgRiFxX9q","WreyPHlUbF","fLNg8piJSk","lm0pDzHF1q","AIYUudmoS7",
+"Pb1pan8pJ9","FPfSEmz8gx","pFrrloGu6x","ThjNnPb1pa","yvOMIjiVBP","QYxC0MojnP","pvgjSMojnP","lm0pDlm0pD","UmaEvIRh48","fqypyy94nw",
+"DQimpZ4I1v","nlaBy5iGN5","tAOsrn1pmO","k85AeCqqaD","pmeCduJScX","JXljW4QMc9","RkQkeQYxC0","sqVrfM3zXL","DG4sTSjskQ","CK5W7zHF1q",
+"0Wr5yGWqqX","CqqaDOUqFM","yofH3uupzk","NAFuwblLA9","DG4sTRsQUq","KZamHfaHir","OxWIHzHF1q","Gv3FqRzaZA","wDajX9iGoT","2hEEUIKxdL",
+"ZUnqtD6rBy","nnP8odhSuH","WDVWJ9rlg9","zqH0WZzJHW","kZANmB3qem","uvf7A1v5hH","9XyT964s8N","MmsIo24ARF","DQimpB3qem","WmadAlsQGo",
+"cQOnvgf8rI","jfREuWaWsv","zFgtB9XyT9","sqVrfWaWsv","SbRYyfLNg8","VNCPdd85a9","MmsIo6q6L9","GSQwjgIYvE","yluBxkZANm","wDajX45cIH",
+"wiHrZ5Mg9r","nnP8o0h1b1","sx5GlVerEA","MmKGJtl72W","uZPqg45cIH","jiVBPl83Ud","suY4xv8yFN","QssNCdhSuH","8FmFHUl4a1","brhlQkZANm",
+"UmaEvTXQ0Z","k85Ae24ARF","xciqpfFDrJ","tjQxsWaWsv","aFFss45cIH","pmeCd5nmWv","Cfgr3gtCA5","KsjRKJJs5m","dQ5860YAGH","sx5Gluupzk",
+"618Di8TxD7","55rfBv8yFN","zmLYD9y4lw","azIWpOz8yZ","TCgPpK20wK","FNYIMokgRi","KASQ8faHir","HfyNQ8RCUA","iB08lEdBKc","a00b5qaofN",
+"In3NSGXdoH","rhl0JdhSuH","jtn0XQnJ1S","nlaBy8RCUA","IjTwPYOfrY","kB5nPBGaQY","mX2GEaDGtS","YjB9th1zcH","a00b5UmaEv","5drc6POUYS",
+"5iGN5lXFOB","pWiOs5Mg9r","tAOsrBbwgA","0BmCyx3LDe","tvdkDDz1R3","64s8NDz1R3","JJs5mNcICA","uJScXLDk6f","h1zcHs4786","UlU3MMGlTF",
+"07n1cuvf7A","TCgPpQWxoT","Nxx9VzY1GY","JKWYRru4UG","XflUq9GXkX","uPX7GkZANm","Zv7z01v5hH","FPfSEOz8yZ","zmLYD6AFT0","45cIHYjB9t",
+"zHF1qBpYhV","wiHrZ8cVD3","NAFuwi3pyd","9y4lwnlaBy","JJs5muPX7G","48cHLFGzgp","d85a97hyVv","ulk41WMiS3","JRJQBTwano","C2IrcnnP8o",
+"RACujxciqp","K4GS88TxD7","blLA9FFDui","yvOMIY1mC0","07n1cAkKTk","DQimpjeskS","iKqhrYh1hF","XflUq7Ow5C","Dz1R3X6Pin","48cHLbrhlQ",
+"ECMvUru4UG","blLA9DG4sT","djsrv48cHL","EOE1oVLTy6","jfREugtCA5","zqH0W8FmFH","VLTy6MmsIo","fcJOyh1zcH","OUqFMSjskQ","lkMUAkB5nP",
+"s4786IKxdL","MezSWIRh48","Mm8sidhSuH","RpBQmFVMxo","uoStwGv3Fq","2TRI7mz8gx","pmeCdhe9IA","IBe8k2TRI7","No0Qbmz8gx","aDGtSHRxd8",
+"jSjS37lUXZ","aDGtSMezSW","8RCUARkQke","gjUTuLDk6f","ECMvUrz7Ut","HzZT8QbxXc","0ao3lKsjRK","BGaQYgIYvE","jeskSwDajX","PYBf4s7Mxk",
+"suY4xJRJQB","0MR5XUl4a1","Zv7z0AIYUu","ydG8Uix74r","U3yw5cL0aE","aez9yzmLYD","QssNCJ2mQi","vLsmSFNYIM","piJSkQ6Lix","RmDcrUmaEv",
+"sqVrfFGzgp","uJScXGv3Fq","7hyVvJKWYR","xXTI49rlg9","BCxeC24ARF","kZANmbZLvS","14FLRCK5W7","jS1ajRkQke","lXFOBbgJAz","Cp3mZ7Ow5C",
+"mz8gxYjB9t","4W0TllXFOB","CK5W7faHir","2ZHdkNAFuw","lXFOBlweGy","uJScXP6bcg","AkKTkpiJSk","9XyT92Yz7E","618Di6AFT0","O3iyQJRJQB",
+"CIShGtlILt","NcICAzz4ZU","B3qemHP433","AIYUu4W0Tl","Ss0ZurKDLJ","fFDrJ8RCUA","5IhmG2ZHdk","9XyT9WDVWJ","2TRI7nFqik","HzZT8MaJQs",
+"Yw2oUkB5nP","kB5nPWDVWJ","lpF6W4dEz6","KsjRK2ZHdk","yvOMIuZPqg","soy9tCdyBV","EOE1os7Mxk","8U2nUpv0i7","LewvMiwzGk","0ao3lNo0Qb",
+"9iGoTLDk6f","JKWYRVBjhz","5nmWvS77LH","oVQp69rlg9","s7MxkCp3mZ","iB08lJkzUn","y94nwCqqaD","QbxXc16lHc","ydG8UIKxdL","jiVBP55rfB",
+"9rlg9No0Qb","9XyT9HfyNQ","uZPqgaez9y","aez9yZhwG1","8hJdt4W0Tl","SbRYy5drc6","POUYSd85a9","lpF6W9GXkX","jS1aj29QAz","B3qempFrrl",
+"VIlwP45cIH","zbIYYFVMxo","ZJTXHG1RhS","AgJHQDz1R3","Pb1pamX2GE","ZzJHWVBjhz","s93MlX6Pin","gf8rId85a9","8FmFHCK5W7","fmIK1VIlwP",
+"gjUTueuZA5","U3yw5GSQwj","lpF6WK20wK","7lUXZTa8f6","b29RJ5VZjS","zmLYDdmoS7","6AFT0Cp3mZ","7lUXZ7ku1p","lkMUAjeskS","piJSkfcJOy",
+"taOXKfaHir","ReKEWEoToP","OxWIHJJs5m","fqypyAkKTk","2Yz7ENxx9V","gf8rI07n1c","CdyBVJKWYR","JKWYRI7p2a","ECMvUFjHXR","S2DfuUl4a1",
+"AXpwE6AFT0","gjUTutlILt","5iGN50Kyfs","rhl0JfLNg8","CqqaDS77LH","t59lR6AFT0","ydG8UGXdoH","prNT6Mm8si","OxWIH0YAGH","RpBQmFxX9q",
+"O3iyQRACuj","o8UydtlILt","MmKGJ29QAz","WDVWJksJby","6q6L9FcWrW","S2DfuL7cGc","8hJdt0Wr5y","YjB9ttaOXK","RxrsmyluBx","tAOsrvkCHH",
+"9rlg9tl72W","hE1QluTacx","fcwDaFPfSE","GSQwjhe9IA","OUYuFpmeCd","jfREuZhwG1","pWiOsL7cGc","W3VFHdQ586","ulk41Gv3Fq","gf8rIhe9IA",
+"ciuWzzz4ZU","jSjS3v2eC3","StlDJfqypy","pmeCdjtn0X","jiVBPAgJHQ","NAFuwBFkb8","S77LH2ZHdk","ix74rFjHXR","iwzGkUl4a1","VIlwPEdBKc",
+"Vprf2WreyP","0h1b1FFDui","BGaQYEoToP","wiHrZxReec","oGu6xwDajX","MGlTFksJby","tl72W618Di","4QMc9RsQUq","fcJOyfLNg8","QYxC0uAWyp",
+"faHir5IhmG","5iGN5618Di","s4786jfREu","hE1Ql9GXkX","8RCUACfgr3","uvf7AZUnqt","ydG8UxReec","Ul4a1tAOsr","K4GS8s93Ml","5iGN5ZzJHW",
+"OUqFMru4UG","SmGzvuoStw","hE1QlK20wK","v1HlnStlDJ","lXFOBM3zXL","JkzUnJ2mQi","StlDJFFDui","i7WMQLewvM","1v5hHFVMxo","he9IAd85a9",
+"qQxHPlm0pD","pmeCdOHaBz","hUTw7RmDcr","JRJQBKZamH","jeskSEoToP","14FLRe6e4z","F6PT22Yz7E","lpF6WAIYUu","uoStw8xEKz","taOXK16lHc",
+"JXljWCp3mZ","Chuy3tAOsr","zbIYY5iGN5","t98iWcmXIX","zz4ZUQClRL","5nmWv5IhmG","9y4lwh1zcH","9XyT9VNCPd","FcWrWuJScX","9GXkXfcwDa",
+"7Ow5CYw2oU","OHaBzF6PT2","uJScX2DREs","DG4sTCfgr3","F6PT2uN6r3","o8UydKZamH","Mkgy8MmKGJ","xXTI4faHir","KZamHyofH3","5Mg9rJ2mQi",
+"ksJbyzqH0W","uLtKsGSQwj","rhl0Juupzk","x3LDe7X3uy","Ss0ZuFnPFB","IjTwPtaOXK","HlUbFguMb8","wiHrZZhwG1","yvOMIfmIK1","ksJbyCp3mZ",
+"VNCPd9XyT9","jS1ajPYBf4","JRJQBCIShG","d7vjM0ao3l","DG4sT2hEEU","Rxrsm0PktI","RxrsmZv7z0","piJSky94nw","7lUXZQWxoT","hi5X7ZzJHW",
+"9XyT9i3pyd","DLhzMZ4I1v","S2Dfutl72W","Ss0ZublLA9","K4GS8HP433","pv0i7hUTw7","Oz8yZDcpWB","lH1kt9GXkX","gf8rIpv0i7","hUTw7lCMxy",
+"Chuy3ogLgc","piJSkYw2oU","hYBCKmz8gx","4QMc9y94nw","0MR5X4QMc9","iwzGkuupzk","pFrrle6e4z","KASQ8VLTy6","BFkb8uupzk","ZhwG1jtn0X",
+"Cp3mZgdQsS","oQ87rOUqFM","24ARFyofH3","n8pJ9K20wK","9eoRcuvf7A","BFkb86AFT0","F6PT2VjCZq","IRh48GSQwj","8hJdt2Yz7E","VerEAMmKGJ",
+"3weIFuLtKs","16lHcW3VFH","RpBQmuQIcz","fcwDaFVMxo","bgJAzWreyP","fqypyD6rBy","uN6r3X6Pin","NAFuwZJTXH","uPX7GMK07Y","n1pmO3otm6",
+"fqypya00b5","MaJQss7Mxk","hUTw79XyT9","WPmlxgf8rI","hUTw7MGlTF","uTacxMojnP","8xEKzFLsph","RxrsmMaJQs","StlDJbZLvS","1v5hHl83Ud",
+"ru4UGtvdkD","fLNg8Cp3mZ","9GXkXoGu6x","IjTwPhSSvQ","tl72WQClRL","blLA9uLtKs","ZhwG1tuDyS","Yh1hFxciqp","IBe8kiB08l","8FmFHjiVBP",
+"lsQGo7lUXZ","vkCHHzqH0W","dhSuH8TxD7","7ku1p2TRI7","GrDg7pWiOs","Dz1R3FjHXR","AgJHQLewvM","zQt6QvLsmS","zz4ZUn1pmO","LDk6flH1kt",
+"mz8gxSWfou","0MR5XbrhlQ","Cp3mZHzZT8","5ZaEzb29RJ","8TxD707n1c","GWqqX6q6L9","NhXduXyPZN","s478616lHc","v8yFNZv7z0","tvdkDgtCA5",
+"ZUnqtS2Dfu","NhXduCp3mZ","TwanoAgJHQ","TXQ0Z7hyVv","SmGzvzmLYD","taOXKtuDyS","IjTwPWaWsv","FnPFBKsjRK","JRJQBix74r","MmKGJzqH0W",
+"HRxd8hE1Ql","zQt6QAkKTk","OxWIH0ao3l","d7vjM7X3uy","zY1GYfaHir","s47865nmWv","55rfBjiVBP","faHirCfgr3","JIqXiYf2Ec","djsrvStlDJ",
+"S2DfuiwzGk","0MR5X9XyT9","h1zcHv8yFN","WDVWJVerEA","BCxeCuQIcz","IKxdLGWqqX","FnPFBdpe1v","Yh1hFHlUbF","uupzkQbxXc","t59lRRBhp0",
+"yToGWZUnqt","uPX7GlpF6W","gjUTuZv7z0","BbwgAEoToP","ogLgc0PktI","W7cTsSs0Zu","6AFT0QChxs","ReKEWv1Hln","nlaByLewvM","d7vjMwiHrZ",
+"8hJdtJIqXi","fmIK1zqH0W","IKxdLtuDyS","MaJQsnlaBy","618Di9eoRc","POUYSG1RhS","vLsmStlILt","HRxd8azIWp","XyPZNUl4a1","Oz8yZTCgPp",
+"vkCHHWPmlx","SjskQ7X3uy","gIYvE8cVD3","gf8rIx3LDe","WDVWJQClRL","xXTI4C2Irc","taOXKrz7Ut","EdBKclj07Q","iqv4kL7cGc","07n1cazIWp",
+"JXljWJXljW","2Yz7Em4bxU","K4GS8IKxdL","Ul4a1VerEA","M6qcG9y4lw","ZhwG1gIYvE","oGu6x2hEEU","0Wr5yZ4I1v","m4bxUpvgjS","8U2nUkB5nP",
+"kB5nPFcWrW","JkzUnFVMxo","jfREuRpBQm","s4786guMb8","QChxsEdBKc","rz7UtW7cTs","B3qemeuZA5","rKDLJqUJMd","5iGN5cmXIX","24ARF4W0Tl",
+"tl72Wt98iW","LbRTHM3zXL","dQ586ydG8U","RkQkesoy9t","Mm8siDLhzM","8FmFHJ2mQi","CNHmvQChxs","gf8rI8hJdt","aFFssnnP8o","dhSuHhE1Ql",
+"9XyT9lsQGo","P6bcgK4GS8","Yw2oUZv7z0","Chuy316lHc","Ta8f6yluBx","YOfrYaL6AJ","WmadAWMiS3","FwEJzwDajX","CNHmvAOgEe","FcWrWtl72W",
+"IjTwPU3yw5","RpBQmJ2mQi","2DREsYf2Ec","yluBxWMiS3","DG4sTDQimp","S77LHkB5nP","uQIcz8U2nU","FLsphDQimp","RACuj9rlg9","oQ87rlH1kt",
+"YjB9tPb1pa","QnJ1S0ao3l","ciuWzlViBv","Mm8siIn3NS","RACujReKEW","uupzkzz4ZU","jfREulsQGo","vLsmS2DREs","7ku1pJRJQB","hE1QlUvlv4",
+"DcpWBhSSvQ","D6rByFFDui","jeskS2DREs","JIqXis7Mxk","07n1cKZamH","0PktIFGzgp","RmDcr2hEEU","iqv4kyluBx","x3LDeHzZT8","7X3uyC2Irc",
+"l83Udhe9IA","tvdkDVBjhz","gf8rITa8f6","DLhzM0MR5X","ulk41LbRTH","Pb1paS77LH","jiVBPrhl0J","ix74rJ2mQi","L7cGcZuDtD","xciqpTa8f6",
+"ni2v11j5L8","QYxC0SjskQ","In3NSdpe1v","pWiOsdhSuH","ydG8UPYBf4","ix74rGXdoH","pvgjSF6PT2","QnJ1S8xEKz","e6e4zOHaBz","brhlQKZamH",
+"B3qemIn3NS","7ku1pRkQke","0PktINcICA","ReKEW5iGN5","RxrsmqQxHP","ni2v1Yh1hF","AXpwEDG4sT","vOqCEe6e4z","L7cGcjS1aj","Pb1paZuDtD",
+"KsjRKLewvM","ZuDtDoQ87r","EoToPLDk6f","djsrvGrDg7","a00b5wiHrZ","EOE1o2Nslm","wiHrZ7hyVv","IjTwPYw2oU","hSSvQZhwG1","0ao3lFnPFB",
+"guMb80PktI","IRh48ydG8U","qQxHPZhwG1","yvOMIeuZA5","t59lRxReec","JXljWECMvU","XyPZNl83Ud","IKxdL6q6L9","yvOMIatef2","pvgjSiwzGk",
+"iKqhrsqVrf","55rfBsoy9t","CdyBVMaJQs","Zv7z0B3qem","5Mg9rCxVEf","VNCPdni2v1","zqH0Wni2v1","ZhwG1oGu6x","pmeCdVIlwP","WmadAdmoS7",
+"Ss0ZuqQxHP","6AFT0uPX7G","2TRI78U2nU","Waim6HfyNQ","gf8rIvOqCE","kZANm8TxD7","CNHmvVerEA","jSjS3Yw2oU","suY4x0MR5X","iwzGkiwzGk",
+"J2mQia00b5","AmdQdtl72W","BCxeCcShY2","VBjhzfcwDa","7X3uyeuZA5","X6Pinrz7Ut","n1pmOfFDrJ","CdyBVfLNg8","ogLgcogLgc","pvgjSWreyP",
+"pFrrlyvOMI","CK5W7K20wK","s93Ml3otm6","FPfSE8xEKz","2ZHdkhE1Ql","Oz8yZB3qem","AOgEeAOgEe","y94nwD6rBy","OHaBzt59lR","FwEJzm4bxU",
+"07n1cQ6Lix","2DREs9XyT9","Yh1hF8TxD7","9y4lw580YD","suY4xn8pJ9","No0QbsuY4x","fcwDaUvlv4","RzaZA5IhmG","MmsIoiB08l","5Drn08U2nU",
+"Yh1hFbrhlQ","lXFOB55rfB","XyPZN7X3uy","ydG8UEoToP","IBe8kOxWIH","soy9tuQIcz","8FmFH0ao3l","pmeCdvLsmS","cmXIXqaofN","lweGyv8yFN",
+"0ao3lzHF1q","CdyBVPb1pa","UlU3MwDajX","ZuDtDZhwG1","qaofNUlU3M","GXdoHlH1kt","CdyBVeuZA5","L7cGcoVQp6","8xEKz8xEKz","VNCPdQnJ1S",
+"AOgEe2ZHdk","ciuWzh1zcH","s93MllpF6W","07n1cfFDrJ","MmsIoC2Irc","ciuWzUvlv4","iKqhrFPfSE","7ku1p8TxD7","MojnPoVQp6","TCgPpvLsmS",
+"rz7UtAXpwE","gf8rIK20wK","QWxoTYjB9t","TwanoxXTI4","kZANmmX2GE","618DiiKqhr","AkKTk5Drn0","PYBf42ZHdk","JJs5myluBx","0MR5XlsQGo",
+"IRh481v5hH","Vprf2FnPFB","5Mg9ryluBx","v8yFNMK07Y","lCMxyWaim6","580YDHzZT8","Ss0ZuZhwG1","n8pJ99GXkX","AmdQdulk41","JkzUnQbxXc",
+"fmIK1Ss0Zu","GWqqXnlaBy","azIWpulk41","djsrvbZLvS","n1pmO8TxD7","M3zXLnnP8o","DQimppvgjS","atef2rhl0J","tvdkD7Ow5C","CxVEffFDrJ",
+"Rxrsme6e4z","7ku1po8Uyd","uZPqgciuWz","BFkb8J2mQi","KASQ8lj07Q","uTacx5Mg9r","Chuy3DG4sT","BbwgAtjQxs","pFrrl618Di","0h1b1atef2",
+"2Nslm7lUXZ","G1RhShSSvQ","CK5W7iwzGk","xciqpk85Ae","S77LH0Wr5y","UlU3M48cHL","fcJOylkMUA","brhlQZv7z0","POUYSYf2Ec","b29RJxReec",
+"580YDru4UG","jeskSGXdoH","jSjS3VIlwP","IRh48fLNg8","yToGWIn3NS","AIYUuJ2mQi","uAWypOxWIH","tl72WwDajX","KsjRKFwEJz","MK07YnnP8o",
+"S2DfuCxVEf","QssNCciuWz","djsrvEdBKc","Mm8si5iGN5","JJs5mhi5X7","29QAzQ6hMC","EoToPSbRYy","v2eC3iB08l","Chuy3Cfgr3","iwzGklweGy",
+"NAFuwHP433","NhXduCNHmv","Q6hMCVerEA","7X3uyMK07Y","okgRihSSvQ","WPmlxKASQ8","L7cGc7ku1p","nlaByt59lR","HfyNQtjQxs","6AFT0U3yw5",
+"2Nslm7fsYM","BFkb8gf8rI","s93MlxXTI4","GWqqX8xEKz","iqv4k2hEEU","hi5X7BGaQY","K20wK64s8N","LbRTHG1RhS","djsrvpmeCd","LewvMHP433",
+"hE1QlOUqFM","CdyBV5drc6","qQxHPVprf2","L7cGc7lUXZ","OUqFM9GXkX","LbRTHRACuj","wDajXdQ586","gf8rINhXdu","Ss0Zu14FLR","JKWYRn8pJ9",
+"QChxsFFDui","SWfoufLNg8","SmGzvRkQke","RBhp0brhlQ","e6e4z4QMc9","QnJ1SP6bcg","5nmWvv1Hln","bZLvSRBhp0","OxWIHUvlv4","AXpwEoVQp6",
+"8hJdtJkzUn","FPfSEgjUTu","d7vjMAmdQd","UmaEvRkQke","nlaBy0Wr5y","2DREs9eoRc","5VZjSmz8gx","16lHc9y4lw","JRJQBCxVEf","ReKEW2Yz7E",
+"ulk414QMc9","VIlwPhUTw7","FPfSEm4bxU","wDajXprNT6","1LB1LlsQGo","1j5L82ZHdk","C2IrciB08l","GrDg7NhXdu","EdBKcFFDui","RBhp0K20wK",
+"aL6AJOz8yZ","HRxd8JRJQB","7Ow5CydG8U","iqv4kSWfou","VNCPdFcWrW","16lHc7lUXZ","7fsYM5Namm","8cVD3uN6r3","iwzGk8hJdt","FPfSEZv7z0",
+"DG4sT5Drn0","BCxeCsoy9t","sqVrfa00b5","QYxC0zmLYD","JIqXi4W0Tl","8xEKzB3qem","ix74r2hEEU","16lHcm4bxU","kB5nPfcwDa","IjTwPjfREu",
+"CqqaDzQt6Q","5Namm6q6L9","QnJ1SMkgy8","m4bxUY1mC0","EOE1oRzaZA","QbxXcpiJSk","uTacx64s8N","vkCHHUlU3M","iwzGkpT8wu","m4bxUksJby",
+"Nxx9VU3yw5","NcICAbZLvS","e6e4zyvOMI","CNHmvU3yw5","aDGtSFxX9q","GSQwjZzJHW","GXdoHkB5nP","QYxC0POUYS","yvOMI5Mg9r","rhl0JsqVrf",
+"K4GS8MezSW","0KyfsnnP8o","DG4sTzQt6Q","JRJQBlkMUA","m4bxUjiVBP","Mkgy8ZuDtD","Uvlv4Yf2Ec","7fKYUuoStw","yEfy9lj07Q","jtn0Xd85a9",
+"2DREsQChxs","JJs5mOUYuF","QnJ1SblLA9","CdyBVZhwG1","OUYuFPOUYS","5IhmGS77LH","rhl0JtjQxs","dmoS7dhSuH","aez9y9XyT9","WPmlxMojnP",
+"pAhR1d7vjM","5Mg9ryofH3","5Drn0BpYhV","WPmlxVIlwP","K20wKI7p2a","YOfrY1v5hH","iKqhrpv0i7","tlILtHRxd8","2TRI7vOqCE","5nmWv8xEKz",
+"ZUnqtn8pJ9","oQ87rXyPZN","prNT6Pb1pa","9XyT9zbIYY","Rxrsmlj07Q","NOHszCqqaD","29QAzSWfou","HRxd8prNT6","sx5GlECMvU","W7cTst98iW",
+"uvf7AdmoS7","5nmWvEoToP","RBhp0n1pmO","b29RJguMb8","5Drn0mX2GE","AmdQdk85Ae","iB08l9y4lw","F6PT2FLsph","EdBKcRkQke","2Yz7EYf2Ec",
+"lH1ktlViBv","iKqhrHlUbF","brhlQzHF1q","4QMc9DQimp","s93MlhUTw7","OUqFM1v5hH","FLsphRmDcr","MojnPprNT6","vLsmSfaHir","n8pJ9lsQGo",
+"Cp3mZCfgr3","5drc6YOfrY","tlILtkZANm","Cfgr3lsQGo","BCxeCcQOnv","yofH3vkCHH","qUJMdZ4I1v","fmIK10PktI","VBjhzlsQGo","W7cTs8RCUA",
+"GrDg7ix74r","KASQ8iKqhr","iqv4katef2","kB5nPNcICA","uTacx9iGoT","hi5X7LDk6f","0BmCyIRh48","X6PinFwEJz","MaJQs0Kyfs","Ta8f6VNCPd",
+"FFDuiZuDtD","jS1ajfaHir","bgJAzokgRi","rKDLJtlILt","Nxx9VguMb8","wiHrZd85a9","okgRi9GXkX","580YDQWxoT","DQimpZv7z0","2DREsHfyNQ",
+"AXpwEuJScX","ydG8UK20wK","G1RhSZJTXH","tjQxsAmdQd","taOXK1j5L8","wDajXxXTI4","e6e4zzz4ZU","Zv7z0GrDg7","2NslmcmXIX","5Drn0XflUq",
+"VIlwPmz8gx","DG4sTFhtgl","UlU3MBFkb8","hSSvQGWqqX","lsQGoYh1hF","07n1cBbwgA","VLTy6WmadA","uupzkO3iyQ","0ao3l14FLR","FLsphFVMxo",
+"6AFT0WDVWJ","ZUnqtuupzk","BFkb85Mg9r","nFqikK20wK","9iGoTMezSW","XyPZNiwzGk","faHirBFkb8","CIShGnFqik","Yh1hFMmKGJ","ZuDtDfcwDa",
+"BCxeCGXdoH","S77LHFcWrW","piJSka00b5","jS1ajyToGW","uJScXHP433","h1zcH8hJdt","v1HlnxReec","O3iyQNcICA","FxX9qhi5X7","Pb1pawDajX",
+"aez9ylm0pD","2Yz7ENcICA","pFrrlsx5Gl","0PktI9GXkX","Z4I1vPYBf4","kB5nPWreyP","2NslmCp3mZ","P6bcgs4786","lViBvqQxHP","7hyVvtl72W",
+"jS1ajGXdoH","YjB9t0Wr5y","atef2Gv3Fq","yEfy9xciqp","XyPZNgIYvE","2ZHdkMkgy8","zz4ZU3weIF","2ZHdkFnPFB","VNCPdqQxHP","atef2hSSvQ",
+"QssNC7Ow5C","Nxx9VK4GS8","k85AeKASQ8","0PktIuLtKs","7X3uy14FLR","BGaQYVNCPd","7fKYUiB08l","ogLgcCfgr3","pvgjSK20wK","ZUnqtsx5Gl",
+"pAhR1lm0pD","48cHLWDVWJ","n1pmOtaOXK","Waim68cVD3","lj07QFFDui","bZLvSa00b5","O3iyQtlILt","e6e4zrhl0J","64s8NNhXdu","O3iyQ8cVD3",
+"dmoS7AOgEe","tjQxsuoStw","o8UydJ2mQi","1v5hH2Nslm","y94nw2TRI7","FwEJzgf8rI","qaofNY1mC0","gdQsSCNHmv","2TRI7TXQ0Z","W7cTs9rlg9",
+"FhtglyToGW","pmeCdK20wK","VNCPdJXljW","BFkb8fqypy","ZhwG1618Di","0KyfsYf2Ec","8cVD3hi5X7","BpYhV3otm6","he9IARBhp0","5Mg9rJIqXi",
+"HRxd8JJs5m","uvf7AuPX7G","5IhmGQ6hMC","LDk6fMaJQs","xXTI4B3qem","FxX9qv2eC3","xXTI4Qworu","oQ87rnlaBy","lCMxyFhtgl","Zv7z0jS1aj",
+"cL0aEW7cTs","2TRI7Oz8yZ","Uvlv4Cp3mZ","uTacxG1RhS","aL6AJQnJ1S","uQIczCIShG","oGu6xbgJAz","2NslmEdBKc","KASQ8sqVrf","Twano618Di",
+"QworuVNCPd","FNYIMydG8U","EOE1o5Drn0","64s8NPYBf4","POUYScmXIX","atef2RpBQm","yEfy9h1zcH","hYBCK1j5L8","e6e4zYw2oU","FhtglSbRYy",
+"jS1ajwDajX","gjUTuHRxd8","NhXdu2ZHdk","AkKTkkZANm","24ARFWPmlx","aez9yrhl0J","JKWYRZ4I1v","1v5hHuN6r3","UmaEvFwEJz","KASQ85ZaEz",
+"L7cGctl72W","Z4I1vzbIYY","RpBQmaDGtS","QbxXcTXQ0Z","suY4xL7cGc","fqypyYw2oU","CIShGRkQke","vkCHHVLTy6","VIlwPqQxHP","uPX7G64s8N",
+"vOqCEaez9y","zz4ZUBFkb8","ThjNndjsrv","EoToPmz8gx","WreyPo8Uyd","FPfSENxx9V","QworuFFDui","pvgjS5drc6","yvOMIMkgy8","lkMUANAFuw",
+"DG4sTdmoS7","M6qcGECMvU","JXljWBFkb8","WMiS30Wr5y","Ta8f6pmeCd","kZANmo8Uyd","J2mQiChuy3","OUYuFfFDrJ","WaWsviKqhr","lpF6WYh1hF",
+"8hJdtECMvU","SjskQuvf7A","Yh1hFxXTI4","brhlQydG8U","7fsYMfFDrJ","vOqCEAIYUu","jeskSF6PT2","QChxsm4bxU","qQxHPGv3Fq","aDGtSWPmlx",
+"vLsmSgf8rI","4QMc99y4lw","QChxss7Mxk","DG4sTuupzk","zqH0WVBjhz","aL6AJKASQ8","zqH0W29QAz","jS1aj618Di","618DiRmDcr","zHF1q4QMc9",
+"bgJAzQYxC0","e6e4zfqypy","5VZjSS77LH","FPfSE3weIF","G1RhSIjTwP","K4GS8RkQke","8U2nUgdQsS","SbRYyTCgPp","7Ow5C2TRI7","lXFOBbrhlQ",
+"pAhR12TRI7","WmadAv2eC3","TwanoQWxoT","M3zXLyEfy9","7lUXZMaJQs","t59lRLewvM","nFqiksuY4x","7lUXZaFFss","pmeCdtlILt","Q6LixDQimp",
+"Z4I1vxXTI4","Rxrsmm4bxU","FVMxoe6e4z","FcWrWiqv4k","4W0TlzQt6Q","hE1QlLbRTH","n1pmOHzZT8","W7cTsPYBf4","TCgPpZuDtD","8TxD7tlILt",
+"uN6r3AOgEe","AOgEelXFOB","ogLgc24ARF","XyPZNZzJHW","1v5hHVLTy6","iqv4kzmLYD","lsQGoBGaQY","2Yz7EUl4a1","MezSWfmIK1","FGzgpiqv4k",
+"tl72W6q6L9","Chuy3IjTwP","jS1ajazIWp","Cp3mZlj07Q","KASQ8VNCPd","ZhwG1MmKGJ","BpYhVjtn0X","6AFT0Ta8f6","ZJTXHjiVBP","gdQsS0PktI",
+"D6rByVLTy6","tvdkD14FLR","5Mg9rx3LDe","aDGtSXyPZN","DQimp2ZHdk","m4bxUKsjRK","0Wr5yjeskS","7lUXZXyPZN","e6e4zs93Ml","7lUXZ8hJdt",
+"pWiOst59lR","k85Ae2ZHdk","DLhzMoGu6x","suY4xMK07Y","HlUbFiKqhr","JkzUnt59lR","uAWypd7vjM","1v5hHjeskS","t59lRW3VFH","5iGN5fcwDa",
+"580YD7fsYM","2DREsDQimp","8FmFHWaWsv","MezSWn8pJ9","KASQ8ni2v1","1v5hHKZamH","5drc6mz8gx","L7cGcfcwDa","55rfBJIqXi","TwanoqaofN",
+"0KyfsFxX9q","OUYuFD6rBy","7Ow5CksJby","VBjhzGv3Fq","TXQ0Zhe9IA","bZLvSWreyP","ZhwG1fcwDa","atef2e6e4z","7lUXZVBjhz","U3yw5lViBv",
+"Ss0ZuFVMxo","ZzJHWyluBx","guMb85ZaEz","BCxeCVjCZq","uvf7AzFgtB","5iGN5lm0pD","xXTI47Ow5C","AOgEexXTI4","piJSkAgJHQ","No0QbyvOMI",
+"ZhwG19y4lw","jSjS3dmoS7","v8yFNHfyNQ","8hJdtGWqqX","Uvlv4jtn0X","BbwgASjskQ","L7cGcZhwG1","jzUqRWmadA","VIlwPtvdkD","StlDJAkKTk",
+"WreyPru4UG","W3VFH5nmWv","PYBf4RBhp0","5iGN5iB08l","MGlTF9XyT9","SbRYypmeCd","Gv3FqJXljW","U3yw58xEKz","PYBf4Vprf2","S77LHpAhR1",
+"MK07YChuy3","2ZHdkuJScX","7X3uym4bxU","yEfy9FxX9q","ThjNniB08l","he9IApT8wu","kZANmfmIK1","BGaQYBbwgA","BGaQYRkQke","he9IAlXFOB",
+"IBe8kgf8rI","fcJOyLDk6f","VLTy65drc6","Yf2Ecv8yFN","F6PT25nmWv","h1zcHSWfou","CqqaDBGaQY","5IhmGxXTI4","hE1QlydG8U","FnPFBzqH0W",
+"MmKGJ5Namm","RmDcrYw2oU","uPX7GzqH0W","l83UdNxx9V","ECMvUpvgjS","HlUbFNAFuw","ThjNnDcpWB","bZLvSNOHsz","pFrrlQssNC","m4bxUlkMUA",
+"jzUqR07n1c","mX2GEMm8si","cmXIXlXFOB","jiVBPksJby","ECMvUv8yFN","jzUqRblLA9","KZamH0Kyfs","IjTwPQbxXc","lweGyJXljW","W7cTsjS1aj",
+"Vprf2rhl0J","h1zcH4QMc9","14FLRFjHXR","8cVD32TRI7","HzZT8StlDJ","9eoRck85Ae","618DiSjskQ","lXFOBJJs5m","gdQsSChuy3","WreyPHRxd8",
+"0h1b1n1pmO","jtn0XuJScX","FxX9qWaim6","uQIczGWqqX","HfyNQiKqhr","07n1cyvOMI","7fsYMcQOnv","LbRTHl83Ud","faHirUmaEv","MaJQscL0aE",
+"BCxeCYjB9t","QssNCNcICA","0Wr5y14FLR","ThjNnjzUqR","MezSWNxx9V","WDVWJcmXIX","aFFss5VZjS","a00b55Mg9r","ZJTXHVNCPd","lCMxyiKqhr",
+"0BmCyAgJHQ","0Wr5yIRh48","FPfSEDcpWB","5NammUvlv4","pv0i7TCgPp","16lHcGWqqX","lXFOBb29RJ","zqH0W5Namm","oVQp6o8Uyd","8xEKzMmsIo",
+"ogLgczbIYY","AOgEeKASQ8","C2IrcStlDJ","Yw2oUCfgr3","qUJMd5iGN5","yluBxyEfy9","Pb1parKDLJ","2ZHdkmz8gx","atef2QChxs","x3LDeYw2oU",
+"hSSvQThjNn","oGu6xPb1pa","yEfy9vkCHH","rhl0JsuY4x","pT8wucQOnv","okgRicL0aE","WaWsvuvf7A","6AFT0ZJTXH","TXQ0ZWDVWJ","IRh48uupzk",
+"ni2v1IjTwP","uAWypxReec","Chuy3uoStw","64s8NM3zXL","5Mg9rU3yw5","LDk6fzbIYY","Yf2EcM6qcG","2NslmUvlv4","x3LDeThjNn","F6PT2fqypy",
+"2hEEUCdyBV","618Di1j5L8","CxVEfWreyP","ZJTXHLewvM","zQt6QHzZT8","MK07Y29QAz","cShY2fLNg8","9eoRcMmKGJ","UmaEvi3pyd","OHaBzU3yw5",
+"WMiS3b29RJ","yofH3pmeCd","5NammMm8si","fmIK1atef2","ZJTXHIjTwP","GSQwjRACuj","FGzgpJIqXi","wDajXgtCA5","W3VFHvOqCE","FLsphChuy3",
+"d85a9wDajX","prNT6VNCPd","Ss0ZuNAFuw","gIYvEl83Ud","y94nw618Di","rz7UttAOsr","BFkb8Twano","brhlQxciqp","9rlg9rKDLJ","uoStw3weIF",
+"FjHXRrz7Ut","RpBQmhi5X7","CdyBVEdBKc","LbRTHjSjS3","JKWYRjSjS3","jS1ajQ6Lix","BGaQYOxWIH","7hyVv1v5hH","45cIHtjQxs","CdyBVDG4sT",
+"RzaZApWiOs","ThjNnTCgPp","ru4UG7fsYM","sqVrfnlaBy","FjHXRRkQke","QWxoTvkCHH","0h1b1xciqp","Pb1paix74r","dpe1vgdQsS","i7WMQCNHmv",
+"8RCUAFFDui","suY4xxciqp","hUTw7o8Uyd","5drc6G1RhS","Fhtgljtn0X","YOfrYY1mC0","i3pydGv3Fq","hE1Qlhe9IA","CqqaDQ6hMC","GSQwjCdyBV",
+"ZJTXHRmDcr","P6bcg2DREs","DLhzMThjNn","Ta8f6GrDg7","Cfgr3Dz1R3","zz4ZUyEfy9","uAWypni2v1","cShY27hyVv","lm0pDyvOMI","VerEAd7vjM",
+"GWqqXulk41","Chuy3TXQ0Z","uoStwO3iyQ","StlDJblLA9","pv0i7qQxHP","7ku1pUvlv4","dQ5869y4lw","WDVWJ2Nslm","zHF1qfaHir","qaofNRsQUq",
+"s93Mllj07Q","azIWphSSvQ","C2Irc0YAGH","9y4lwFGzgp","RkQkeRxrsm","JRJQBLDk6f","zQt6QJIqXi","4dEz6lpF6W","0ao3l5VZjS","b29RJaFFss",
+"lViBv8RCUA","FLsphYf2Ec","M3zXLBFkb8","MmKGJaFFss","WPmlx7ku1p","bgJAzVBjhz","VjCZqtaOXK","DQimpG1RhS","EdBKcBpYhV","TXQ0ZuJScX",
+"VBjhzy94nw","WPmlx14FLR","d7vjMkZANm","faHirX6Pin","atef2L7cGc","fLNg8FGzgp","HzZT8zY1GY","55rfBDQimp","M6qcGaFFss","l83UdS2Dfu",
+"7hyVvMGlTF","faHir0BmCy","5nmWvb29RJ","gIYvEU3yw5","dpe1vQbxXc","GrDg7xReec","W7cTsOUYuF","IRh48BpYhV","FNYIMCdyBV","x3LDeJJs5m",
+"tjQxsBFkb8","OxWIHRmDcr","blLA9uJScX","29QAzoVQp6","QnJ1So8Uyd","he9IAuN6r3","UmaEvtvdkD","PYBf4DcpWB","OxWIHpmeCd","45cIH1j5L8",
+"pWiOsjS1aj","8xEKzlpF6W","qaofNaDGtS","nlaByJkzUn","FFDuivkCHH","FxX9qix74r","2hEEUtjQxs","24ARF8U2nU","SbRYyhUTw7","Ul4a16AFT0",
+"lpF6WNOHsz","JKWYRfFDrJ","iqv4kBCxeC","hi5X7Mkgy8","xXTI45iGN5","S77LH9y4lw","ZJTXHGSQwj","zz4ZUOUqFM","Waim6rhl0J","64s8N7lUXZ",
+"UmaEv2ZHdk","zHF1qTa8f6","cQOnvlsQGo","MmsIoECMvU","lXFOB0Kyfs","45cIHSmGzv","S77LHzY1GY","ydG8Uuvf7A","0YAGHpvgjS","JJs5mlH1kt",
+"qaofNlH1kt","QworujSjS3","uvf7AMezSW","guMb8DLhzM","y94nw1LB1L","bgJAzPYBf4","7hyVv5IhmG","8RCUAP6bcg","ulk41WmadA","ksJbyvkCHH",
+"RACujlViBv","JRJQBNAFuw","d85a9Twano","7ku1pWmadA","Yf2EcKsjRK","bZLvShE1Ql","aDGtSjiVBP","AgJHQiKqhr","48cHLLDk6f","jfREuIjTwP",
+"UmaEvfFDrJ","9eoRcIn3NS","ThjNnCdyBV","Mm8siJ2mQi","AOgEe7ku1p","DcpWBzqH0W","bgJAzGXdoH","6q6L9EoToP","HRxd8gdQsS","zHF1qJJs5m",
+"JJs5m48cHL","3weIFOz8yZ","v2eC3UmaEv","ReKEWzQt6Q","QworuwiHrZ","DLhzMHfyNQ","AIYUuS77LH","SWfoujtn0X","RzaZA2Yz7E","7ku1p2ZHdk",
+"l83UdUl4a1","cShY22TRI7","W3VFHpFrrl","Rxrsms4786","55rfBFhtgl","8U2nUjzUqR","5Drn0VBjhz","atef2i7WMQ","uAWypUmaEv","ulk418TxD7",
+"lViBv5IhmG","XflUqDz1R3","48cHLsqVrf","FLsphZzJHW","JJs5m2DREs","xReecMezSW","LewvMeuZA5","uPX7GNxx9V","5ZaEzgdQsS","fFDrJQClRL",
+"cShY2L7cGc","SbRYyYf2Ec","JJs5mlXFOB","m4bxUciuWz","IRh489y4lw","taOXK5iGN5","dQ586ZJTXH","ReKEWlj07Q","rz7UtIKxdL","hi5X7he9IA",
+"lViBviqv4k","t59lRzHF1q","JJs5moQ87r","CqqaDD6rBy","4QMc9VLTy6","oGu6xEoToP","zY1GY5iGN5","HzZT81j5L8","G1RhSnlaBy","VBjhzOxWIH",
+"EdBKcZv7z0","FGzgpuZPqg","aFFssKASQ8","GrDg7ydG8U","ZUnqt7X3uy","fqypyEOE1o","X6PinB3qem","ReKEWydG8U","4QMc9zbIYY","O3iyQIRh48",
+"0PktIAkKTk","ZUnqtWaWsv","9iGoTSbRYy","0PktIyToGW","AmdQdxReec","Ss0Zu9rlg9","0Kyfsv2eC3","SbRYyIRh48","JIqXilweGy","B3qemNxx9V",
+"t59lRJRJQB","oVQp6soy9t","K20wKRsQUq","CNHmvuN6r3","a00b52Yz7E","IRh484dEz6","MGlTFbgJAz","FPfSE2hEEU","JRJQBuAWyp","o8UydU3yw5",
+"MmsIohi5X7","MaJQs9y4lw","zqH0WvOqCE","3otm6he9IA","TCgPpxReec","XflUqiKqhr","Yf2EcogLgc","uJScXh1zcH","Yh1hFQWxoT","lH1ktAIYUu",
+"l83UdzbIYY","Dz1R3SWfou","n8pJ9jiVBP","Z4I1vydG8U","UlU3Ml83Ud","ni2v16q6L9","DG4sTpiJSk","yvOMIRpBQm","7lUXZ5Mg9r","iwzGkGrDg7",
+"IRh48oVQp6","Mm8siSjskQ","64s8Nix74r","Oz8yZuQIcz","P6bcgQYxC0","HRxd848cHL","tjQxss93Ml","lsQGoFLsph","jfREuzHF1q","s93Ml7lUXZ",
+"F6PT2SjskQ","QYxC0sx5Gl","QssNCCxVEf","55rfBZzJHW","suY4xbgJAz","9eoRcHlUbF","DG4sTkB5nP","Ss0ZuDz1R3","ReKEWdmoS7","7fKYU580YD",
+"9XyT9uPX7G","45cIHcmXIX","2hEEUZJTXH","5Mg9r7lUXZ","dQ586FnPFB","hi5X7hSSvQ","8FmFH7lUXZ","n8pJ98cVD3","I7p2aI7p2a","5Mg9rsqVrf",
+"2NslmnlaBy","guMb8IRh48","WMiS3QnJ1S","TCgPpBCxeC","jfREuxciqp","Yf2Ec7lUXZ","i3pyd7fKYU","lpF6Whi5X7","MojnPulk41","9rlg9uupzk",
+"Zv7z0In3NS","Dz1R37fKYU","CxVEfuTacx","AkKTkaFFss","fqypyUlU3M","uvf7AYf2Ec","v1HlnlweGy","gtCA5AmdQd","FnPFBJJs5m","MGlTFJkzUn",
+"EOE1oMmsIo","Mkgy8jSjS3","wiHrZaFFss","BpYhVF6PT2","djsrvyvOMI","7Ow5Cgf8rI","IRh48ulk41","pFrrlEOE1o","HRxd8lsQGo","2NslmvLsmS",
+"Vprf2kZANm","jiVBPW7cTs","S77LHhE1Ql","8FmFHB3qem","taOXKjSjS3","0ao3lNOHsz","oQ87r0Kyfs","Vprf2sqVrf","QbxXcDQimp","XyPZN5VZjS",
+"dQ586aDGtS","HfyNQWMiS3","UmaEvRpBQm","pv0i7LbRTH","5iGN5VNCPd","YOfrYCNHmv","piJSkcShY2","ni2v1YOfrY","X6PinxXTI4","MaJQsRkQke",
+"zqH0WQYxC0","iqv4khSSvQ","euZA5JkzUn","6AFT014FLR","B3qem1LB1L","Dz1R3wiHrZ","aDGtS9rlg9","ZJTXHPb1pa","JJs5mU3yw5","AgJHQgdQsS",
+"zz4ZUlkMUA","iKqhrGrDg7","HRxd8CK5W7","HRxd8s93Ml","FPfSEQssNC","yToGWtl72W","RzaZAVNCPd","GrDg7VLTy6","faHirlCMxy","5Mg9ry94nw",
+"tAOsrCqqaD","PYBf4FNYIM","VNCPdnFqik","C2IrcfcJOy","1v5hHAmdQd","soy9tAkKTk","Nxx9VEoToP","0PktI29QAz","tjQxsmz8gx","bZLvSRxrsm",
+"Yw2oUNAFuw","n1pmOX6Pin","O3iyQv8yFN","lCMxyhi5X7","14FLR5nmWv","yToGW4W0Tl","euZA5wDajX","uZPqgFGzgp","XyPZNIRh48","Mm8siEOE1o",
+"lm0pDO3iyQ","POUYSD6rBy","DLhzMBbwgA","rz7UtIjTwP","ZhwG1mz8gx","uAWypn1pmO","0Wr5yn1pmO","SWfouSWfou","b29RJQnJ1S","jS1ajd85a9",
+"FnPFBFjHXR","iwzGkCp3mZ","xciqpoGu6x","BbwgAFwEJz","uoStwpAhR1","ulk41o8Uyd","BGaQYwDajX","pT8wuix74r","618Di9GXkX","sx5GlZ4I1v",
+"YOfrYNAFuw","t59lRP6bcg","t59lR48cHL","QWxoTyToGW","aL6AJlViBv","atef22Yz7E","AkKTkksJby","lm0pDxReec","dmoS74QMc9","zqH0W6q6L9",
+"SbRYyVLTy6","B3qemBFkb8","6AFT0lH1kt","soy9tJJs5m","GrDg7Pb1pa","iwzGkyToGW","7lUXZMezSW","dmoS7AIYUu","LbRTHY1mC0","FLsphiqv4k",
+"uN6r3fcwDa","2TRI7RmDcr","l83Udni2v1","lXFOBrKDLJ","v1HlnSWfou","jeskSru4UG","FPfSEtl72W","VIlwP8U2nU","JKWYRcShY2","d85a9IBe8k",
+"ciuWzDLhzM","CqqaDMK07Y","d7vjMzFgtB","6AFT0WmadA","vkCHHEoToP","Ss0ZuDLhzM","3otm6qaofN","CK5W7AOgEe","WaWsvhe9IA","Mm8siRkQke",
+"d85a90MR5X","G1RhSDG4sT","0h1b1FGzgp","F6PT2GrDg7","rz7UtF6PT2","jeskSHlUbF","WDVWJS77LH","WDVWJQ6hMC","qUJMdnFqik","zqH0WIjTwP",
+"ydG8UfcwDa","2NslmgdQsS","xciqpiKqhr","TwanolweGy","6q6L9Dz1R3","4W0Tla00b5","BGaQYksJby","kZANmyofH3","i3pyd24ARF","EOE1ojtn0X",
+"45cIHIjTwP","Waim6Oz8yZ","RACujRkQke","K20wKMojnP","oQ87r5ZaEz","0Wr5yvOqCE","RxrsmKr8ys","zbIYYThjNn","7Ow5CPOUYS","BbwgAFjHXR",
+"9y4lwgf8rI","y94nwt59lR","Kr8ysjeskS","ZhwG1MojnP","0h1b12TRI7","X6PinfLNg8","Mm8siulk41","v2eC30PktI","8xEKzru4UG","M6qcGaez9y",
+"QChxsHfyNQ","AOgEexciqp","FGzgpQ6Lix","tlILtYf2Ec","QChxs64s8N","EdBKcdmoS7","ksJbyJ2mQi","zmLYD5Drn0","IKxdLM3zXL","gtCA5mz8gx",
+"xReec7fKYU","iwzGkFnPFB","PYBf4hUTw7","y94nwaFFss","v1HlnEoToP","RsQUq3otm6","1v5hHvLsmS","D6rByb29RJ","YOfrYAkKTk","07n1cfqypy",
+"WDVWJStlDJ","ZhwG1Zv7z0","i3pydlViBv","OHaBzQnJ1S","WreyPrz7Ut","S2DfugdQsS","Ta8f6m4bxU","AXpwEfFDrJ","W7cTspWiOs","n8pJ92DREs",
+"OxWIHXflUq","qQxHP8xEKz","VNCPdFGzgp","n1pmO0MR5X","M6qcGZzJHW","Kr8ys7fsYM","wiHrZChuy3","Y1mC0GSQwj","AkKTktl72W","dQ586euZA5",
+"lj07Q1v5hH","pv0i7NhXdu","MojnPl83Ud","k85AeTa8f6","uAWypAOgEe","45cIHThjNn","TwanosqVrf","DcpWBD6rBy","ydG8UI7p2a","5VZjSsx5Gl",
+"ZzJHWiKqhr","atef2DQimp","WMiS3aDGtS","J2mQizY1GY","tjQxsF6PT2","uoStwIn3NS","580YDMK07Y","WaWsvyToGW","uLtKsZhwG1","CNHmvdQ586",
+"AkKTk5IhmG","16lHcF6PT2","yToGWfFDrJ","BFkb8uPX7G","29QAzxXTI4","SWfouNcICA","0h1b1hUTw7","sqVrfyEfy9","Pb1pa5ZaEz","5Drn0O3iyQ",
+"RkQkepT8wu","VLTy6ksJby","9GXkX8U2nU","K20wKNhXdu","aez9yYw2oU","Dz1R3jS1aj","lsQGolXFOB","FwEJzuN6r3","5NammuoStw","VBjhzkB5nP",
+"uN6r3CIShG","lH1ktzFgtB","2NslmiKqhr","hSSvQcmXIX","ni2v10Wr5y","RpBQmQYxC0","nFqikxXTI4","t59lRkZANm","Chuy3t98iW","Nxx9VCIShG",
+"aL6AJzFgtB","OUqFMoVQp6","OxWIHmX2GE","ZhwG129QAz","ZJTXHRpBQm","TXQ0Zd7vjM","gf8rI8RCUA","16lHcvOqCE","3otm6lweGy","0BmCyFjHXR",
+"UmaEvW7cTs","pWiOsWmadA","RxrsmzQt6Q","s7MxklsQGo","FVMxogtCA5","9XyT9uAWyp","pvgjSazIWp","TCgPpCIShG","pvgjSd7vjM","QClRL0ao3l",
+"rKDLJlH1kt","i7WMQ4W0Tl","bgJAzF6PT2","yluBxDcpWB","zQt6Q2Yz7E","VjCZqt59lR","zFgtB8FmFH","HP433QChxs","bZLvSGrDg7","uJScXdQ586",
+"jzUqRKZamH","FwEJzPOUYS","qQxHPyToGW","sqVrf8TxD7","MojnP9XyT9","RACujoQ87r","uoStw9XyT9","s47863otm6","5nmWvPb1pa","lweGyhe9IA",
+"55rfBpiJSk","YOfrYAXpwE","Y1mC0VerEA","hUTw7iKqhr","LbRTHTCgPp","7X3uyuJScX","DQimpDz1R3","lsQGohSSvQ","fcwDaGSQwj","WDVWJcL0aE",
+"KZamHRACuj","a00b5lH1kt","Vprf2tl72W","LDk6fSbRYy","hE1QldhSuH","t59lRhE1Ql","0ao3lazIWp","lH1ktblLA9","VjCZqwiHrZ","4W0Tl3otm6",
+"4W0TlVerEA","JIqXilj07Q","zqH0WCNHmv","KZamHZv7z0","5drc6P6bcg","aFFssuZPqg","hUTw7pWiOs","yToGWpvgjS","cQOnvJJs5m","7ku1pfaHir",
+"5Mg9r16lHc","3otm6S77LH","Mm8sibZLvS","tvdkDWDVWJ","TCgPpcShY2","Mkgy8uAWyp","W7cTsQ6Lix","tuDySK20wK","sx5GlCxVEf","v2eC3pAhR1",
+"d85a9JKWYR","5IhmGDcpWB","fcwDaTwano","Yh1hFnlaBy","8hJdtWmadA","Qworu618Di","uvf7ABGaQY","0h1b1lH1kt","TwanojfREu","lm0pDJRJQB",
+"OxWIHiqv4k","xciqpcmXIX","iqv4kFwEJz","x3LDev8yFN","tvdkDt59lR","0PktIKZamH","tjQxsNxx9V","5nmWvQ6hMC","D6rBytvdkD","IBe8kM3zXL",
+"o8UydBbwgA","F6PT2lpF6W","K4GS8jSjS3","5nmWvP6bcg","euZA5OUYuF","cL0aEC2Irc","QbxXcDLhzM","FwEJz07n1c","0MR5XLDk6f","qQxHPprNT6",
+"9iGoTNAFuw","VBjhzVBjhz","NOHszcmXIX","aDGtSbgJAz","GSQwjzQt6Q","SWfouNo0Qb","wDajXVprf2","OUqFMdQ586","faHirru4UG","uAWypRkQke",
+"zFgtBpAhR1","7lUXZ55rfB","8TxD7QbxXc","Dz1R3Fhtgl","x3LDed85a9","DLhzMFGzgp","55rfBdjsrv","7fKYUVNCPd","nFqikuQIcz","rz7UtnFqik",
+"h1zcHydG8U","yvOMIzbIYY","M6qcGXyPZN","uLtKsqUJMd","oQ87rlj07Q","hYBCKL7cGc","BCxeChe9IA","EoToPqaofN","i3pydFVMxo","WaWsvpvgjS",
+"POUYSuJScX","OxWIHprNT6","i3pydG1RhS","D6rByuTacx","tvdkDhSSvQ","FnPFBlH1kt","y94nwJKWYR","Ta8f655rfB","jtn0XZJTXH","IBe8ktaOXK",
+"prNT6NhXdu","iqv4kuTacx","o8UydpFrrl","P6bcgFPfSE","uoStwuvf7A","Mm8si3otm6","QnJ1SgjUTu","qaofN0PktI","hYBCKfcwDa","FFDuiYf2Ec",
+"64s8NChuy3","sqVrfsoy9t","gIYvEpmeCd","uPX7GbgJAz","POUYShYBCK","TCgPpLDk6f","HlUbFciuWz","IBe8kJJs5m","Uvlv4pT8wu","MojnPydG8U",
+"zQt6Q0BmCy","MmKGJkB5nP","OUqFM55rfB","8cVD3HRxd8","7Ow5CC2Irc","Yw2oUjeskS","aL6AJOxWIH","LDk6fqaofN","pmeCdCdyBV","QWxoTC2Irc",
+"ZJTXH3weIF","BbwgA5Namm","a00b5BGaQY","1v5hHQ6hMC","EOE1os93Ml","55rfBAOgEe","VNCPds7Mxk","9y4lwwiHrZ","kB5nPRkQke","Mm8siaez9y",
+"ZuDtDGSQwj","LewvMm4bxU","sqVrfuN6r3","GSQwjThjNn","fcwDaUmaEv","9GXkXlj07Q","yofH3pFrrl","yofH37lUXZ","Rxrsm7lUXZ","cQOnvlweGy",
+"okgRi16lHc","QworugjUTu","QChxsVLTy6","suY4xfcwDa","ogLgc2hEEU","3otm67lUXZ","zFgtBNAFuw","9XyT9KASQ8","gjUTucmXIX","YjB9tt59lR",
+"Yw2oUpv0i7","VNCPd8U2nU","AXpwEVBjhz","RpBQmyEfy9","Q6hMCS2Dfu","ZzJHWZuDtD","I7p2a7hyVv","gIYvEJIqXi","B3qemhSSvQ","ZuDtDK20wK",
+"MmsIoVjCZq","HzZT8xReec","he9IA0ao3l","K4GS8L7cGc","580YD29QAz","HfyNQpFrrl","QworuogLgc","BpYhV2hEEU","guMb8gIYvE","AkKTkpWiOs",
+"CK5W7FLsph","PYBf4qaofN","LewvMoQ87r","JkzUnpiJSk","MmKGJazIWp","fcJOySjskQ","v8yFNUlU3M","Ta8f6y94nw","9y4lwnFqik","jeskSy94nw",
+"EOE1oNo0Qb","qaofNKZamH","k85AeY1mC0","FVMxo9GXkX","CK5W7gtCA5","fcJOyHzZT8","8RCUAAgJHQ","dpe1v618Di","64s8NS2Dfu","M6qcGlj07Q",
+"C2IrcRzaZA","QbxXcKASQ8","RmDcrQssNC","BCxeCi7WMQ","HlUbFJIqXi","NhXduhe9IA","yluBxoVQp6","cmXIXZ4I1v","pFrrlcL0aE","I7p2axReec",
+"tlILtyofH3","qaofNvOqCE","cShY2JRJQB","lm0pDWaWsv","uupzkQworu","m4bxUD6rBy","wDajXYf2Ec","AmdQdKsjRK","FwEJz3weIF","prNT6EOE1o",
+"IKxdLd85a9","Ul4a1Yf2Ec","7fsYMmX2GE","W3VFHWPmlx","UlU3M0Kyfs","RACujVLTy6","8cVD3ogLgc","ru4UGAOgEe","Cp3mZi3pyd","FPfSEVBjhz",
+"iqv4ko8Uyd","HzZT89XyT9","AkKTk4QMc9","VNCPdfaHir","Nxx9VNOHsz","4dEz6tAOsr","RkQkezqH0W","pvgjSFnPFB","0BmCyMojnP","Vprf2HlUbF",
+"gIYvEguMb8","VerEAm4bxU","KZamHDLhzM","JkzUnZhwG1","wiHrZuPX7G","lXFOBkB5nP","XflUq16lHc","5ZaEz2ZHdk","vkCHH1v5hH","0YAGHQ6hMC",
+"ru4UGHfyNQ","BCxeCUmaEv","3weIFcmXIX","RxrsmuLtKs","brhlQBGaQY","rz7UtuTacx","1LB1LEdBKc","YOfrYCqqaD","ThjNnguMb8","lsQGoHRxd8",
+"n8pJ9uoStw","KsjRKWreyP","Gv3Fq6q6L9","rz7UtRACuj","mX2GEHlUbF","EOE1oXyPZN","hYBCKQChxs","DG4sTprNT6","rKDLJOHaBz","fcwDanlaBy",
+"iB08lpFrrl","cShY2vkCHH","bZLvShe9IA","VNCPdFLsph","K20wKqUJMd","lm0pDIn3NS","d7vjMs4786","LbRTHaFFss","jSjS3blLA9","i7WMQv1Hln",
+"48cHLJJs5m","yluBxd7vjM","lViBvi3pyd","s4786FNYIM","F6PT2C2Irc","AkKTkRmDcr","uAWypQssNC","WMiS3FGzgp","nFqikFnPFB","IBe8kGWqqX",
+"RzaZAkZANm","zbIYYVNCPd","iwzGkulk41","uN6r3ECMvU","WmadAUl4a1","uAWyppiJSk","MaJQsgjUTu","7X3uyNAFuw","8hJdtHlUbF","tl72W5VZjS",
+"RxrsmbgJAz","XflUqQChxs","D6rByIjTwP","lXFOB8hJdt","KZamHYw2oU","HP433uJScX","Cp3mZ1v5hH","U3yw5JKWYR","nnP8oRpBQm","ydG8UtaOXK",
+"2ZHdkK4GS8","xciqpzHF1q","OUYuFMmKGJ","B3qemGrDg7","zbIYYVerEA","LewvMFwEJz","uTacxCdyBV","ksJbyblLA9","iqv4kuN6r3","FVMxorKDLJ",
+"K4GS8NcICA","d85a955rfB","suY4xfcJOy","yluBxAmdQd","atef2pFrrl","ni2v1dpe1v","zz4ZUW7cTs","Ss0ZuMmsIo","0KyfsSbRYy","azIWpIn3NS",
+"oQ87rP6bcg","pvgjSJJs5m","DG4sT5ZaEz","xciqpulk41","ZzJHWThjNn","s93Ml2Nslm","s7MxkvkCHH","TXQ0ZGXdoH","AOgEezz4ZU","FcWrW2Yz7E",
+"ReKEWVIlwP","RsQUqQClRL","vLsmSs93Ml","dQ586Yh1hF","bgJAzqaofN","2ZHdkpAhR1","vkCHHuQIcz","lXFOBxXTI4","ksJbyEdBKc","Dz1R3DG4sT",
+"RBhp0gjUTu","ni2v1bZLvS","fcwDaFGzgp","MK07YyEfy9","RBhp0IRh48","uPX7GQnJ1S","vkCHHM6qcG","guMb829QAz","DQimpuLtKs","BFkb8QssNC",
+"lpF6WWPmlx","xciqpaez9y","kZANmvOqCE","lViBvuTacx","qUJMdQYxC0","MojnPJJs5m","SbRYy0Wr5y","9eoRczmLYD","MmKGJ4W0Tl","iwzGk5nmWv",
+"RACujx3LDe","D6rBysqVrf","uQIczkZANm","fcwDaRmDcr","tAOsrzbIYY","QWxoT3weIF","t98iWFFDui","TCgPpDQimp","3otm6ru4UG","v1Hln8hJdt",
+"pWiOsyEfy9","faHir9iGoT","5IhmGQbxXc","RkQke0PktI","X6PinNAFuw","8xEKzSmGzv","ogLgcTwano","QClRLYOfrY","M6qcGGXdoH","vLsmSQbxXc",
+"Q6hMCcL0aE","9y4lwZhwG1","TCgPpjzUqR","SmGzvKASQ8","BGaQYMmsIo","ksJbyVLTy6","4dEz6nlaBy","piJSkTXQ0Z","EoToPEdBKc","lH1ktsqVrf",
+"suY4xvOqCE","6q6L9OHaBz","uvf7AUvlv4","K4GS8CxVEf","Cp3mZJKWYR","BCxeCJ2mQi","zFgtBJIqXi","m4bxUCdyBV","pAhR1ru4UG","0BmCyI7p2a",
+"Nxx9VtaOXK","zz4ZUWmadA","IjTwPgdQsS","FwEJzuPX7G","WDVWJTa8f6","Oz8yZ0YAGH","oVQp6tAOsr","cmXIXiB08l","FFDuiS2Dfu","ECMvU8cVD3",
+"wDajXRACuj","FVMxoru4UG","pAhR1BpYhV","JKWYRNAFuw","vOqCElkMUA","lkMUAYf2Ec","ydG8UaFFss","oVQp6uJScX","y94nwmz8gx","Yw2oUdmoS7",
+"uN6r3JkzUn","tjQxsmX2GE","580YDpWiOs","0Wr5yPYBf4","6AFT07fsYM","QbxXcfqypy","jiVBPJJs5m","blLA9sqVrf","1LB1Ls4786","9XyT9prNT6",
+"atef2s4786","rhl0JpWiOs","RsQUq6AFT0","tAOsruoStw","POUYSm4bxU","IKxdLx3LDe","ZzJHWFjHXR","4W0TlwiHrZ","GXdoHxXTI4","5iGN5Waim6",
+"OUqFMydG8U","Twano7lUXZ","BpYhVblLA9","a00b59y4lw","EoToPK4GS8","bgJAzU3yw5","ECMvUprNT6","Nxx9VFjHXR","ulk413weIF","FcWrWuTacx",
+"0h1b1Yf2Ec","pmeCdeuZA5","Vprf27ku1p","JkzUnvOqCE","618DiTa8f6","48cHLni2v1","AIYUuVNCPd","8RCUAOUqFM","djsrvaDGtS","tjQxsFVMxo",
+"BpYhVvLsmS","L7cGck85Ae","m4bxUi7WMQ","Yh1hFSjskQ","oQ87rydG8U","5NammvkCHH","PYBf4GWqqX","JKWYRPYBf4","lXFOBpAhR1","cL0aE9XyT9",
+"zqH0W4QMc9","ZuDtDQClRL","DG4sTaez9y","RkQkeG1RhS","fcwDauZPqg","s93MlqaofN","VIlwPU3yw5","4W0Tl1j5L8","EoToPXflUq","s93MlFjHXR",
+"YjB9tJRJQB","pvgjShE1Ql","kB5nPJkzUn","AkKTk6AFT0","OxWIHaL6AJ","vLsmScmXIX","uAWypfLNg8","CK5W7jfREu","Yf2EcbrhlQ","BbwgAaL6AJ",
+"S77LHVNCPd","SWfoufaHir","fcwDa4dEz6","pFrrlgIYvE","fmIK1yEfy9","FcWrWX6Pin","hUTw74dEz6","gtCA5tjQxs","fcwDaksJby","euZA51v5hH",
+"nlaBytlILt","8U2nUdhSuH","BCxeCjS1aj","K4GS8Yf2Ec","tvdkDhUTw7","hYBCK0YAGH","QChxs4W0Tl","pmeCdni2v1","AgJHQrKDLJ","ZhwG1NcICA",
+"4W0Tl4QMc9","Dz1R3M3zXL","WmadAVprf2","n1pmOx3LDe","Chuy3zY1GY","jzUqRKr8ys","Ta8f6i7WMQ","64s8NKsjRK","HzZT84dEz6","BFkb8MezSW",
+"ru4UGtlILt","9eoRct98iW","lkMUAG1RhS","GSQwjStlDJ","9iGoTXyPZN","Chuy36AFT0","EoToPkZANm","55rfBRmDcr","kB5nPuTacx","6q6L9IKxdL",
+"XflUqD6rBy","h1zcHChuy3","M3zXLaez9y","VNCPdtvdkD","NAFuwv8yFN","jiVBPYjB9t","EOE1otAOsr","fcJOyblLA9","0PktIIn3NS","uPX7Go8Uyd",
+"VBjhz5drc6","FNYIMPb1pa","VLTy62Nslm","MGlTF3weIF","ZUnqtpWiOs","X6Pin0Wr5y","pT8wuKZamH","TXQ0ZAIYUu","0BmCyVprf2","uAWyp7Ow5C",
+"FPfSE5VZjS","F6PT2ru4UG","B3qemwDajX","blLA9t59lR","5ZaEzQssNC","64s8NO3iyQ","zQt6Q9XyT9","FnPFB5ZaEz","9GXkXpv0i7","UmaEvjtn0X",
+"Q6hMCX6Pin","jSjS3I7p2a","Cfgr3L7cGc","Ta8f6gIYvE","EoToPyofH3","ulk41FcWrW","lXFOB5ZaEz","B3qemPYBf4","TCgPp07n1c","9XyT9No0Qb",
+"6q6L9FPfSE","tjQxsazIWp","zFgtBWMiS3","SjskQQbxXc","b29RJRsQUq","jzUqRd7vjM","9XyT90Wr5y","M3zXL3otm6","MK07YBbwgA","JXljWoGu6x",
+"Cfgr3VjCZq","9eoRcQChxs","7fsYM8TxD7","xXTI4AIYUu","VBjhziwzGk","uoStwWMiS3","7X3uyZUnqt","ciuWzChuy3","hE1Qln1pmO","taOXKAXpwE",
+"JXljWChuy3","jtn0XOHaBz","oGu6xk85Ae","uPX7GU3yw5","MK07Y5Namm","uoStwJKWYR","pWiOsdpe1v","Dz1R3S2Dfu","CK5W7jeskS","dhSuHuTacx",
+"YjB9ttuDyS","J2mQi4W0Tl","Oz8yZRACuj","jiVBPFhtgl","d7vjMsx5Gl","tuDySXyPZN","Chuy3lViBv","FLsphrz7Ut","8U2nUprNT6","Q6hMCPb1pa",
+"ZuDtDlm0pD","gtCA5OUqFM","9XyT9YjB9t","JkzUn7ku1p","IjTwPZUnqt","7hyVvlm0pD","KZamHUmaEv","7Ow5C07n1c","JKWYRBbwgA","IRh48SmGzv",
+"tl72Whi5X7","G1RhSxReec","VLTy6azIWp","FxX9q1LB1L","VjCZqWmadA","5Drn0uLtKs","tlILtTwano","ni2v1n8pJ9","MezSWCqqaD","CIShGCqqaD",
+"vLsmSprNT6","2ZHdkQ6Lix","5Mg9roQ87r","KsjRKydG8U","fmIK1ReKEW","K20wK9y4lw","K4GS8hUTw7","7X3uyzHF1q","0ao3l8cVD3","sqVrfgdQsS",
+"FjHXRJKWYR","i7WMQK4GS8","K4GS89iGoT","gf8rIbrhlQ","uPX7GRxrsm","uZPqg4QMc9","rz7UtVLTy6","6AFT0P6bcg","pFrrlKr8ys","hYBCKe6e4z",
+"580YDGrDg7","lXFOByToGW","d85a98hJdt","XflUqK20wK","3weIFRzaZA","DLhzM0YAGH","dhSuHjSjS3","AOgEeCp3mZ","fcwDaDz1R3","KsjRKAkKTk",
+"0ao3l5ZaEz","bgJAzjfREu","i3pydHzZT8","0PktIWaim6","Yf2EcOz8yZ","WaWsvlH1kt","Pb1paX6Pin","rz7UtkB5nP","lm0pDpT8wu","taOXKuTacx",
+"DLhzM7X3uy","SWfou7fKYU","XyPZNJ2mQi","5Mg9rS2Dfu","UmaEvVerEA","hSSvQB3qem","s4786soy9t","qQxHPStlDJ","48cHLxXTI4","NhXdu9iGoT",
+"Gv3FqxXTI4","gdQsSqaofN","0h1b1faHir","5Nammix74r","bZLvSL7cGc","ni2v1fmIK1","fLNg8s7Mxk","FPfSEi7WMQ","vOqCEMmsIo","8RCUAIn3NS",
+"BFkb8KASQ8","XflUqIn3NS","kB5nPpWiOs","3weIFRxrsm","6AFT0jeskS","Ul4a1BbwgA","s478655rfB","OUYuF7ku1p","No0Qb9GXkX","e6e4z4W0Tl",
+"VLTy6wDajX","s4786jtn0X","zmLYDk85Ae","cShY2yluBx","5IhmG1j5L8","tAOsrwDajX","JXljW0YAGH","Uvlv4HRxd8","jeskSpAhR1","nlaBy6q6L9",
+"FcWrWs93Ml","VIlwPguMb8","Z4I1vBCxeC","KASQ8C2Irc","Waim6Qworu","n1pmOsoy9t","gf8rIvLsmS","MK07YFNYIM","8FmFHeuZA5","No0Qb5iGN5",
+"d7vjMsoy9t","Cfgr3atef2","WMiS3HzZT8","xciqpLDk6f","HlUbFI7p2a","W7cTsIBe8k","P6bcg2Nslm","DG4sTzHF1q","djsrvRACuj","StlDJhe9IA",
+"oQ87rwDajX","8FmFHsx5Gl","BCxeCFxX9q","HP433uLtKs","Chuy3Z4I1v","2hEEUIRh48","MezSWzFgtB","I7p2aFwEJz","RpBQmFPfSE","CdyBVIRh48",
+"5Nammzz4ZU","sqVrfJ2mQi","L7cGcuvf7A","P6bcguvf7A","oQ87r7Ow5C","vLsmS5Namm","pFrrlzbIYY","yluBxtlILt","AgJHQQChxs","yluBxY1mC0",
+"FLsphO3iyQ","yvOMI5nmWv","8RCUAuN6r3","tl72WjiVBP","lCMxyCIShG","jS1ajMGlTF","FVMxopWiOs","GWqqXQChxs","0MR5XYh1hF","MmKGJzFgtB",
+"48cHLOz8yZ","dhSuHGSQwj","BCxeCs4786","hSSvQzY1GY","Cp3mZO3iyQ","NAFuwuJScX","7hyVvWDVWJ","CdyBVFFDui","tjQxsKZamH","DLhzMbgJAz",
+"Cfgr3zHF1q","rz7UtYw2oU","StlDJJXljW","faHirVBjhz","RBhp0KASQ8","ydG8UBpYhV","0MR5XStlDJ","POUYSn8pJ9","580YDiwzGk","tvdkDTwano",
+"gtCA5iB08l","Oz8yZ8cVD3","hE1QllH1kt","y94nw55rfB","StlDJuZPqg","hE1QllsQGo","dpe1vRzaZA","FGzgptjQxs","W7cTsWaim6","dhSuHVIlwP",
+"ThjNn2DREs","JKWYRmz8gx","hE1Qld7vjM","zmLYDFcWrW","GrDg7taOXK","prNT6faHir","FhtglfcwDa","1j5L8BFkb8","29QAzLDk6f","YjB9tfaHir",
+"0PktIeuZA5","14FLRbrhlQ","QssNCThjNn","pFrrlbgJAz","h1zcH3otm6","Chuy3VerEA","gIYvEyEfy9","vOqCE618Di","dhSuHk85Ae","5iGN5YjB9t",
+"kZANm9eoRc","nFqikQworu","3otm6YOfrY","KASQ8UlU3M","POUYSpFrrl","QssNCfFDrJ","tlILtVjCZq","5ZaEzZzJHW","v8yFN16lHc","7X3uy4W0Tl",
+"lViBvDLhzM","Dz1R36q6L9","5iGN5Zv7z0","JXljWWaWsv","uN6r30MR5X","GXdoH5drc6","0ao3luZPqg","jfREuKsjRK","ZUnqtJ2mQi","y94nwP6bcg",
+"KsjRKQworu","Oz8yZhSSvQ","kB5nPFNYIM","aFFssnlaBy","AkKTkFnPFB","Ss0ZuU3yw5","FhtgldQ586","tvdkDFhtgl","QYxC045cIH","QbxXcSs0Zu",
+"uupzkVerEA","LbRTH5Mg9r","VjCZqVjCZq","O3iyQxXTI4","jeskSuoStw","XyPZNJkzUn","zqH0WjfREu","4QMc9JJs5m","jtn0X9XyT9","NhXdu5VZjS",
+"IRh488xEKz","m4bxUQYxC0","jtn0XX6Pin","lm0pD7hyVv","rz7UtQWxoT","5nmWv7hyVv","uupzkQYxC0","Rxrsmru4UG","Ss0ZuRACuj","dmoS7RACuj",
+"CK5W7ZzJHW","kB5nP07n1c","t98iWVjCZq","k85AeyofH3","euZA5qUJMd","JJs5mQnJ1S","16lHcJXljW","55rfBkZANm","i7WMQEoToP","KsjRKWmadA",
+"piJSkQssNC","0MR5XzbIYY","0PktI8TxD7","qQxHPVNCPd","8xEKzfFDrJ","DLhzMRzaZA","RkQkeKr8ys","JIqXifaHir","FPfSE07n1c","8TxD7hUTw7",
+"lkMUApiJSk","X6Pin8U2nU","XyPZNMmKGJ","ksJbySWfou","i3pydaez9y","Mkgy8sx5Gl","Z4I1vlweGy","16lHcnFqik","euZA58xEKz","64s8NcmXIX",
+"2DREsFxX9q","AXpwEOHaBz","AgJHQ2Nslm","yluBxpmeCd","8xEKzMaJQs","ksJbyguMb8","gtCA5FjHXR","t98iWJRJQB","GXdoHrhl0J","9eoRcF6PT2",
+"jeskSXyPZN","Y1mC0okgRi","zY1GY6q6L9","d7vjMMaJQs","t59lRogLgc","580YDFhtgl","UmaEvKsjRK","Cp3mZ618Di","nFqikuAWyp","uTacxzFgtB",
+"Chuy3WreyP","LewvMCNHmv","FwEJzWmadA","CK5W724ARF","DcpWBa00b5","No0QbRxrsm","0Kyfs3weIF","ThjNnReKEW","lH1ktLewvM","bgJAzkZANm",
+"iqv4kuJScX","yofH33weIF","In3NSS77LH","lj07QZJTXH","C2IrcQbxXc","a00b5FVMxo","0h1b1s4786","CNHmvgIYvE","TXQ0ZvLsmS","yluBxuZPqg",
+"Z4I1v2Nslm","zQt6QKr8ys","nFqikFNYIM","uN6r3lH1kt","yofH3FNYIM","wiHrZ7ku1p","okgRiaDGtS","1v5hHVerEA","ksJbypv0i7","aL6AJTwano",
+"DG4sTQ6Lix","v8yFNmz8gx","iB08lIKxdL","mX2GEuLtKs","ciuWzPYBf4","6q6L9K4GS8","LbRTHMm8si","ZhwG1iwzGk","pvgjSprNT6","CdyBV0YAGH",
+"uoStw8RCUA","Ss0ZuvkCHH","Ss0ZuQnJ1S","bZLvSgjUTu","BbwgAM6qcG","iwzGkECMvU","8hJdtX6Pin","lsQGoaez9y","bgJAzzFgtB","yvOMIJJs5m",
+"X6Pinpv0i7","IjTwP55rfB","s7MxkX6Pin","PYBf4X6Pin","VLTy6LDk6f","fLNg8lXFOB","uZPqgStlDJ","AIYUuNo0Qb","Yh1hFCp3mZ","tl72WFxX9q",
+"hi5X7UmaEv","ulk41s4786","lCMxyjfREu","B3qemMmsIo","nFqikpFrrl","nnP8oIRh48","5NammP6bcg","taOXKt98iW","wDajXQ6hMC","nnP8oWreyP",
+"U3yw5nFqik","kB5nPIBe8k","MezSWWmadA","s93MlTwano","dhSuHWPmlx","In3NScmXIX","4QMc9RzaZA","uTacxZuDtD","rKDLJQClRL","RzaZAgdQsS",
+"yEfy9bZLvS","BCxeCrKDLJ","l83UdcL0aE","8FmFHjzUqR","hE1Ql64s8N","b29RJfmIK1","1v5hHqUJMd","uN6r3ZJTXH","KsjRKuQIcz","1v5hHfqypy",
+"5ZaEzdQ586","nlaBybrhlQ","8xEKzgjUTu","cQOnvulk41","24ARF1v5hH","2DREsazIWp","2DREstjQxs","FGzgpxReec","DG4sTFwEJz","HzZT8uN6r3",
+"ogLgcCp3mZ","W7cTszY1GY","0BmCyzqH0W","BFkb8M6qcG","lViBvtlILt","WDVWJvOqCE","AOgEeQssNC","zY1GYaez9y","tlILtk85Ae","9y4lwStlDJ",
+"5ZaEz580YD","mz8gxsqVrf","GXdoH7lUXZ","EdBKc1v5hH","ReKEWHzZT8","aDGtSvOqCE","brhlQFPfSE","7X3uyb29RJ","4W0TlAOgEe","fFDrJh1zcH",
+"rKDLJGv3Fq","0BmCytl72W","s93Mld7vjM","i3pydJkzUn","FwEJzGv3Fq","1j5L8n1pmO","CdyBVFGzgp","EOE1ocQOnv","No0QbUvlv4","uPX7G8hJdt",
+"uupzk7fsYM","RkQkeuJScX","Uvlv48hJdt","jiVBPRxrsm","48cHLs4786","jzUqRuAWyp","24ARFrKDLJ","v2eC3In3NS","AkKTkMezSW","zQt6QThjNn",
+"ZuDtDbZLvS","okgRiOxWIH","s93MlQChxs","atef2nFqik","v2eC3AIYUu","uZPqgxciqp","h1zcHEdBKc","bZLvSC2Irc","o8Uyda00b5","0YAGHzqH0W",
+"Kr8ysd7vjM","cShY2n8pJ9","0BmCysqVrf","dhSuHRsQUq","TCgPpuTacx","POUYSDz1R3","jiVBPNxx9V","Cp3mZbgJAz","lj07QVBjhz","9XyT9n1pmO",
+"S77LH4QMc9","zbIYYtaOXK","BCxeC2DREs","WMiS3Pb1pa","mz8gxbrhlQ","pAhR1sx5Gl","fcJOydmoS7","KASQ84W0Tl","lpF6Wjtn0X","EoToPyEfy9",
+"S2DfuaDGtS","brhlQSs0Zu","gdQsSpWiOs","ZUnqtDLhzM","zbIYYCxVEf","8RCUAs4786","O3iyQdhSuH","ydG8UBFkb8","iB08liB08l","i7WMQlCMxy",
+"C2IrcQ6Lix","lH1ktkB5nP","ydG8URACuj","BbwgAb29RJ","BbwgA2Yz7E","MK07Yx3LDe","ksJbyl83Ud","NhXdu618Di","guMb8zbIYY","Ta8f6DcpWB",
+"580YDaez9y","W3VFHYjB9t","uvf7AX6Pin","CK5W7nnP8o","mz8gx7hyVv","VLTy6uLtKs","aDGtS5nmWv","8hJdts4786","29QAzyEfy9","HRxd8EdBKc",
+"5VZjSxReec","5iGN5i7WMQ","JRJQBNcICA","zmLYDY1mC0","D6rByFPfSE","Q6LixI7p2a","RBhp0uoStw","Q6LixuPX7G","fLNg8In3NS","ru4UGuoStw",
+"tl72WKASQ8","brhlQ8TxD7","GXdoHd7vjM","Y1mC0SjskQ","4QMc9hUTw7","cQOnvB3qem","AOgEelCMxy","yEfy95iGN5","TXQ0Zs4786","No0Qb9y4lw",
+"VerEAs7Mxk","I7p2ayvOMI","Zv7z0ZUnqt","okgRihe9IA","ogLgcG1RhS","uAWypIRh48","7Ow5C9eoRc","RsQUqVprf2","faHirh1zcH","wDajXFjHXR",
+"OUqFMlViBv","ogLgcn1pmO","d7vjMgf8rI","iB08l5Drn0","CNHmvQWxoT","IKxdLP6bcg","djsrvVerEA","XflUqpv0i7","e6e4zThjNn","yofH3uoStw",
+"Mkgy8Oz8yZ","aez9ydpe1v","xReeceuZA5","lkMUAuZPqg","uLtKs9iGoT","7lUXZJIqXi","zQt6QSs0Zu","sx5GlMGlTF","s93Mly94nw","CNHmvFjHXR",
+"9XyT9ksJby","618Dijtn0X","tAOsrgIYvE","S2Dfu2Nslm","uZPqgNcICA","Yh1hFjS1aj","Chuy3lCMxy","RzaZAG1RhS","4dEz6AkKTk","zHF1qReKEW",
+"pT8wu07n1c","LewvMyToGW","iKqhryToGW","uLtKsUl4a1","ReKEWv8yFN","KASQ8qUJMd","iB08l8cVD3","uN6r3WreyP","4dEz645cIH","lj07QCfgr3",
+"jzUqRbrhlQ","lweGyVLTy6","m4bxU9iGoT","OHaBz2Nslm","dQ586WaWsv","h1zcHyvOMI","JRJQBfaHir","JIqXiiqv4k","NOHszcShY2","t98iW07n1c",
+"VBjhzQworu","7hyVv5ZaEz","soy9tuoStw","RpBQmuJScX","Waim6J2mQi","okgRid7vjM","AmdQdQClRL","azIWpsqVrf","guMb85iGN5","0YAGHRpBQm",
+"FxX9q7lUXZ","IRh4864s8N","NAFuw7hyVv","S77LHLewvM","zbIYYQYxC0","blLA9FjHXR","SjskQSmGzv","jSjS3yluBx","iqv4kOUYuF","D6rByRmDcr",
+"7Ow5CYOfrY","JRJQBFnPFB","Q6hMCGXdoH","jeskShUTw7","uLtKsxciqp","zQt6QyToGW","No0QbZzJHW","JkzUn580YD","Kr8ysciuWz","uTacxt98iW",
+"cQOnvlj07Q","y94nw4QMc9","EdBKc9GXkX","9eoRc2TRI7","Yw2oU2DREs","uupzkVBjhz","qaofNbZLvS","O3iyQvOqCE","pvgjSRkQke","618Diiqv4k",
+"zQt6QgIYvE","y94nwguMb8","gdQsSuN6r3","Zv7z05ZaEz","FcWrW1v5hH","rhl0JS77LH","bgJAzix74r","MaJQsRxrsm","zY1GYMmsIo","Mkgy8v1Hln",
+"hi5X72Yz7E","FcWrWDLhzM","RmDcro8Uyd","zmLYDhi5X7","zHF1q0YAGH","X6PinsuY4x","dpe1vZzJHW","h1zcHCNHmv","ru4UGjS1aj","KASQ8Rxrsm",
+"wDajXjfREu","ECMvUlXFOB","MK07Y7lUXZ","zQt6QQssNC","KASQ89iGoT","TCgPpAXpwE","BGaQYzY1GY","8RCUAFhtgl","7lUXZOxWIH","sx5GljS1aj",
+"MGlTFFcWrW","K4GS8lXFOB","gdQsSMK07Y","8cVD3zmLYD","IRh48AgJHQ","fqypyM3zXL","ix74rRxrsm","VerEA0Wr5y","O3iyQh1zcH","VerEACfgr3",
+"VBjhzxReec","GXdoH2DREs","oGu6xl83Ud","CNHmvpvgjS","uTacxEdBKc","qQxHPVerEA","uN6r30Wr5y","8RCUABbwgA","Ss0Zu1v5hH","ThjNn55rfB",
+"dQ586uAWyp","OxWIHgIYvE","MmKGJWPmlx","ksJby0h1b1","lViBvuQIcz","O3iyQIn3NS","t59lRSs0Zu","mX2GEYw2oU","rKDLJQworu","rKDLJCdyBV",
+"jiVBPfcJOy","zz4ZUgf8rI","yToGWAmdQd","okgRikB5nP","0Wr5ytlILt","JkzUnBpYhV","qUJMdAkKTk","Vprf2aez9y","9y4lwEdBKc","lsQGoRACuj",
+"5drc6FcWrW","lsQGoiB08l","Mkgy8qUJMd","Q6Lix8xEKz","DcpWBs4786","cShY2uoStw","S2DfuCqqaD","zz4ZULewvM","tjQxs5Drn0","n8pJ95nmWv",
+"dmoS7WmadA","FGzgp2TRI7","P6bcglViBv","Yf2Ecv2eC3","CqqaDSWfou","d85a9gtCA5","5ZaEz55rfB","a00b5nFqik","aL6AJJIqXi","K20wKJ2mQi",
+"9iGoT1j5L8","gtCA50PktI","Oz8yZFwEJz","lH1ktgjUTu","ReKEWRsQUq","RACujFPfSE","EOE1oAXpwE","NhXduoGu6x","9y4lw0BmCy","IRh48FjHXR",
+"fcwDaSjskQ","xReecsx5Gl","iKqhr6q6L9","Oz8yZaDGtS","SjskQAXpwE","n8pJ9e6e4z","rhl0JjeskS","7lUXZ9GXkX","7hyVvjzUqR","jeskSjzUqR",
+"KASQ8TXQ0Z","Cp3mZGrDg7","hUTw7Yw2oU","uupzkCK5W7","45cIHhSSvQ","RACuj2ZHdk","IjTwP4W0Tl","M3zXLi7WMQ","2ZHdkYOfrY","BFkb8QClRL",
+"v1HlnZJTXH","lweGyyvOMI","580YD2hEEU","hE1QltuDyS","MaJQs2TRI7","v2eC3yofH3","BCxeCYh1hF","tl72WbrhlQ","tuDyS8xEKz","4dEz6vLsmS",
+"W3VFHOxWIH","OUYuFkB5nP","7fsYMGXdoH","Kr8ysd85a9","cmXIXzHF1q","pWiOsEOE1o","cL0aEv8yFN","SbRYyx3LDe","hUTw75Namm","FNYIMk85Ae",
+"mX2GE4QMc9","ZJTXHMkgy8","rhl0Jfqypy","uoStwQnJ1S","4QMc9I7p2a","U3yw5RpBQm","FFDuioQ87r","gdQsSoGu6x","GWqqX9eoRc","2NslmgIYvE",
+"CK5W7y94nw","ru4UGhUTw7","WreyPPOUYS","gIYvEvkCHH","X6PinydG8U","brhlQTwano","fqypyZ4I1v","lpF6WIjTwP","7fKYUdQ586","JIqXi07n1c",
+"mX2GE5Drn0","3otm648cHL","OUqFM2Nslm","QClRL0h1b1","a00b5dmoS7","Chuy3tl72W","HRxd8HzZT8","n1pmOpFrrl","Yw2oUo8Uyd","5ZaEzd7vjM",
+"tvdkDTa8f6","ZJTXHY1mC0","5ZaEzbgJAz","6q6L9FVMxo","AmdQd48cHL","fLNg8m4bxU","Nxx9VkZANm","EdBKciwzGk","GSQwjuupzk","d7vjMrz7Ut",
+"RpBQmlsQGo","StlDJpT8wu","Mm8si3weIF","jiVBPpiJSk","2Nslm2Yz7E","cmXIXiKqhr","RsQUqn1pmO","SWfoujfREu","KASQ8TCgPp","e6e4zdjsrv",
+"lkMUAVprf2","nnP8oMojnP","VBjhzb29RJ","QssNCS2Dfu","lj07QZhwG1","iB08lQworu","aL6AJU3yw5","piJSkWPmlx","o8Uyd14FLR","hi5X7Gv3Fq",
+"EdBKcUlU3M","6AFT0FVMxo","dhSuH8xEKz","GrDg7WMiS3","pv0i7FcWrW","IKxdLJXljW","uoStwjfREu","IjTwPlpF6W","07n1clj07Q","S77LHCIShG",
+"yvOMI8hJdt","CNHmvOHaBz","h1zcHd7vjM","B3qemWDVWJ","D6rByiKqhr","qQxHPaFFss","lCMxyGv3Fq","GSQwj4dEz6","IBe8ks93Ml","Q6hMCMaJQs",
+"0MR5XL7cGc","ni2v1jzUqR","AXpwEfqypy","HfyNQWDVWJ","1LB1L3otm6","Cp3mZpFrrl","DLhzMKASQ8","W3VFHRxrsm","DcpWBuTacx","BbwgAGXdoH",
+"5nmWvhUTw7","0BmCyXyPZN","0h1b1Fhtgl","cShY2qUJMd","CK5W7Mkgy8","MezSWjfREu","64s8NTXQ0Z","a00b59GXkX","AOgEejeskS","qUJMdOUqFM",
+"jSjS3gtCA5","uoStwpv0i7","580YDrKDLJ","PYBf4bZLvS","xReecEoToP","StlDJSbRYy","1j5L8J2mQi","EOE1oSWfou","pFrrl0Kyfs","NcICANhXdu",
+"EoToPAgJHQ","faHir0Kyfs","xReec9XyT9","7lUXZzqH0W","Oz8yZ6AFT0","5Drn0LDk6f","DQimpM6qcG","qQxHPNo0Qb","KASQ8NAFuw","uQIczFFDui",
+"5NammRsQUq","UlU3MM6qcG","GrDg7StlDJ","v2eC3nnP8o","KZamHWaim6","Yw2oUfaHir","fqypyMGlTF","D6rByjSjS3","8hJdt2DREs","SWfouGSQwj",
+"4QMc9PYBf4","CxVEfUmaEv","pWiOsUl4a1","O3iyQWaWsv","FnPFBVprf2","ECMvUZv7z0","LewvM0BmCy","fmIK148cHL","2TRI77ku1p","vOqCESmGzv",
+"FFDui7Ow5C","vkCHHMaJQs","mX2GEpiJSk","tl72WAgJHQ","dQ586K4GS8","iqv4klpF6W","2TRI7JkzUn","2hEEUtl72W","d7vjMSjskQ","uZPqgNAFuw",
+"VjCZq14FLR","O3iyQNxx9V","JkzUnNhXdu","ZuDtD8U2nU","5Mg9r1j5L8","W3VFHjeskS","t59lRDcpWB","FVMxocL0aE","LewvMpv0i7","ksJbySmGzv",
+"ksJbydhSuH","lm0pDx3LDe","XyPZNhYBCK","v2eC3sx5Gl","5VZjS64s8N","OUYuFuoStw","ogLgcUmaEv","RACujbgJAz","5iGN5okgRi","zbIYYzqH0W",
+"JKWYRo8Uyd","zFgtBwDajX","b29RJWDVWJ","Gv3FqFVMxo","HP433uZPqg","CK5W7he9IA","0YAGHSbRYy","taOXKSWfou","tl72WFLsph","S2DfuUvlv4",
+"0Kyfs14FLR","ogLgchUTw7","jeskSpWiOs","xciqp29QAz","J2mQiMm8si","CqqaDtaOXK","AmdQd1LB1L","2ZHdkC2Irc","SjskQKsjRK","2TRI7jfREu",
+"Oz8yZ64s8N","OHaBzAmdQd","pvgjSW3VFH","ZJTXHt98iW","9XyT9O3iyQ","CIShGYf2Ec","h1zcHSs0Zu","rhl0JHfyNQ","64s8NdQ586","Nxx9VNo0Qb",
+"aL6AJtjQxs","SbRYytlILt","OUYuFRBhp0","tvdkDn8pJ9","a00b5WaWsv","U3yw5GrDg7","rKDLJIBe8k","uLtKsIBe8k","fFDrJuZPqg","JkzUnQnJ1S",
+"FhtgliKqhr","RBhp0tjQxs","djsrvOxWIH","SbRYyuZPqg","vOqCEpiJSk","fmIK1mX2GE","t59lRtvdkD","GrDg7SbRYy","IRh48FGzgp","Waim6ru4UG",
+"ZhwG1JXljW","guMb8I7p2a","gIYvErKDLJ","yToGWK20wK","xXTI4iqv4k","djsrvS77LH","yluBxPYBf4","UlU3MQssNC","WreyPCIShG","Ss0Zub29RJ",
+"s93MlK4GS8","yluBxnlaBy","8FmFHaFFss","5drc6hE1Ql","soy9tb29RJ","WMiS3AmdQd","MaJQslCMxy","2TRI7ZhwG1","Gv3FqLDk6f","Waim6WaWsv",
+"2TRI7fcJOy","7X3uys7Mxk","xXTI40Wr5y","F6PT2I7p2a","8hJdtxReec","iKqhruAWyp","29QAzQnJ1S","HlUbFlpF6W","lCMxypvgjS","FxX9qiB08l",
+"jeskS7fKYU","vkCHHtjQxs","faHirBGaQY","48cHLYf2Ec","oQ87rJRJQB","TCgPp8xEKz","lCMxygtCA5","sx5Gl24ARF","i3pydydG8U","pFrrlNAFuw",
+"fmIK12Yz7E","n1pmOazIWp","5VZjSFwEJz","HRxd8yvOMI","5Mg9rMojnP","lweGyIjTwP","JKWYRtuDyS","8FmFHlj07Q","n8pJ9n1pmO","nnP8oZhwG1",
+"jeskSiwzGk","Gv3FqP6bcg","6AFT0Mkgy8","MK07YyToGW","hUTw7O3iyQ","fLNg8EOE1o","W3VFHM6qcG","aez9ydmoS7","fmIK19XyT9","BpYhV9iGoT",
+"OUqFMpT8wu","5Drn0uAWyp","prNT6jiVBP","07n1cOUqFM","VjCZqv8yFN","NcICAcQOnv","F6PT2Cp3mZ","OUYuFZhwG1","iqv4krKDLJ","XflUqatef2",
+"SmGzvyToGW","RsQUquAWyp","Cfgr37fsYM","8hJdt5Mg9r","xReeco8Uyd","fcJOyBpYhV","lm0pDStlDJ","FNYIMAgJHQ","P6bcggtCA5","yToGWpWiOs",
+"L7cGc0MR5X","9iGoT0Wr5y","t98iWs4786","Waim6i7WMQ","2Yz7Egf8rI","yEfy9DLhzM","Mm8sihe9IA","Cfgr3oQ87r","Y1mC02hEEU","Rxrsm580YD",
+"BCxeCNOHsz","HfyNQgtCA5","Y1mC0I7p2a","n1pmOjiVBP","JKWYRiB08l","RsQUqfcwDa","48cHLChuy3","QworuGSQwj","Z4I1vXflUq","07n1cuPX7G",
+"ni2v1LbRTH","rhl0JoGu6x","MojnP9y4lw","RzaZACK5W7","lViBvokgRi","MK07YVjCZq","guMb8M6qcG","G1RhSnFqik","cShY29rlg9","yofH3xXTI4",
+"tl72W5drc6","JRJQBOUYuF","JRJQBuPX7G","FnPFBzY1GY","BbwgAt59lR","pAhR14dEz6","xReecM3zXL","5IhmGsx5Gl","CNHmv7ku1p","7ku1pwiHrZ",
+"lXFOBiB08l","euZA5zY1GY","KsjRKVIlwP","aFFssjeskS","aL6AJIRh48","S2DfuEOE1o","GrDg77ku1p","B3qemThjNn","StlDJS77LH","pmeCdiKqhr",
+"fFDrJRmDcr","i7WMQkZANm","hYBCKtuDyS","oGu6xQWxoT","580YDStlDJ","x3LDe14FLR","Yh1hFjiVBP","lH1ktIKxdL","TwanoOUYuF","P6bcglsQGo",
+"2NslmPOUYS","9eoRcuTacx","Oz8yZbgJAz","uZPqgYw2oU","RsQUqQworu","djsrvChuy3","jS1ajjS1aj","CxVEfdpe1v","cmXIXChuy3","WPmlxKZamH",
+"Cp3mZpT8wu","Ul4a148cHL","lweGyLbRTH","5Drn0SWfou","uAWypDLhzM","FNYIMfcwDa","lkMUA0BmCy","lweGydjsrv","dpe1vBbwgA","NcICAOHaBz",
+"0h1b1DLhzM","GSQwjuLtKs","oQ87rgtCA5","CqqaDZzJHW","ZuDtDhi5X7","pvgjSJkzUn","IBe8kS77LH","uZPqgi7WMQ","EdBKcAIYUu","8FmFHk85Ae",
+"CqqaDhi5X7","Ul4a1h1zcH","FLsphVprf2","Ta8f6PYBf4","G1RhSK20wK","nnP8oGrDg7","2NslmFjHXR","zHF1qeuZA5","RBhp0jS1aj","fmIK1BFkb8",
+"fcwDa64s8N","64s8NuZPqg","pFrrlVBjhz","hi5X7ru4UG","FNYIMBpYhV","WreyPOHaBz","0Wr5ykB5nP","1j5L8zz4ZU","zqH0WYOfrY","ZuDtDWmadA",
+"BFkb81LB1L","OUqFM5Mg9r","2ZHdkDG4sT","OUqFM5IhmG","2NslmlkMUA","zHF1q5nmWv","OUqFMh1zcH","Yf2EcOHaBz","48cHLzY1GY","brhlQlsQGo",
+"K20wKCqqaD","oGu6x64s8N","8hJdtQ6hMC","a00b5aFFss","8hJdtd7vjM","7lUXZYh1hF","JRJQBvOqCE","he9IA7Ow5C","5ZaEzAXpwE","ix74rMm8si",
+"AmdQd8FmFH","l83Udmz8gx","VBjhz9iGoT","m4bxUFPfSE","L7cGcXflUq","piJSkI7p2a","G1RhSW7cTs","AOgEeoVQp6","5iGN5Dz1R3","oQ87rChuy3",
+"kZANmrKDLJ","14FLR0ao3l","ZuDtD7Ow5C","d7vjM5ZaEz","U3yw5jS1aj","gIYvE2TRI7","gdQsS7X3uy","qUJMdM3zXL","lH1ktB3qem","HlUbFC2Irc",
+"FcWrWYw2oU","blLA9xciqp","s7Mxk580YD","9GXkX2ZHdk","Dz1R3QYxC0","8xEKzEoToP","zbIYY7fKYU","NhXduFGzgp","KsjRKxReec","dpe1vfmIK1",
+"WmadAIn3NS","7hyVvjS1aj","OxWIHFFDui","Waim6GrDg7","aDGtSxXTI4","KsjRK1v5hH","4W0TlZJTXH","jzUqRL7cGc","GSQwjm4bxU","ZUnqt2Nslm",
+"RmDcr14FLR","pWiOsaez9y","0h1b1fcwDa","n8pJ96AFT0","JJs5mLewvM","48cHLJIqXi","S77LHuTacx","uPX7GEdBKc","s7MxkK4GS8","tuDySI7p2a",
+"OxWIHsqVrf","QnJ1SThjNn","9rlg9MojnP","1v5hHFFDui","hi5X79y4lw","Kr8yshE1Ql","J2mQiulk41","MGlTF4dEz6","No0QbBFkb8","QChxsMmKGJ",
+"t59lRi7WMQ","uvf7A24ARF","ksJby8TxD7","rz7UtpWiOs","cmXIX5Drn0","VIlwPuvf7A","piJSkQ6hMC","MGlTFuTacx","StlDJ55rfB","ZUnqtpmeCd",
+"oQ87rdQ586","LewvMTXQ0Z","mz8gxReKEW","Ss0ZuFxX9q","MaJQshYBCK","blLA9uvf7A","POUYS5Namm","tlILtCxVEf","WmadAhi5X7","ogLgcNOHsz",
+"pT8wuQ6Lix","hYBCKQnJ1S","KASQ8RsQUq","5IhmG7X3uy","uLtKsVLTy6","gdQsSydG8U","O3iyQUl4a1","euZA5lH1kt","jtn0XUl4a1","n1pmOyvOMI",
+"FLsphsuY4x","RkQkebZLvS","618Di3otm6","DQimpokgRi","OxWIHCNHmv","FFDui0Kyfs","nlaByNOHsz","ZuDtDd85a9","MaJQsJkzUn","uvf7AvOqCE",
+"CIShG55rfB","yToGW5VZjS","gjUTuyluBx","VNCPdCIShG","s7Mxk0BmCy","8cVD3WmadA","v8yFNo8Uyd","9iGoTKASQ8","Yh1hFDQimp","gdQsS5drc6",
+"WreyPfmIK1","POUYSFNYIM","JkzUn4W0Tl","v2eC3Twano","lj07QlH1kt","AOgEeqUJMd","bgJAzlXFOB","8RCUA8FmFH","FGzgpnlaBy","mz8gxFxX9q",
+"8TxD7uvf7A","8xEKzOUYuF","CK5W7MGlTF","9y4lwRBhp0","ni2v1ni2v1","oGu6x0ao3l","8xEKzi7WMQ","AkKTk0PktI","he9IAogLgc","zqH0WMGlTF",
+"07n1cHlUbF","atef2Mkgy8","618DiMK07Y","v2eC3fqypy","14FLR6AFT0","Q6hMCiqv4k","In3NS45cIH","LDk6fuN6r3","JJs5mHRxd8","bgJAzM6qcG",
+"dmoS7Z4I1v","Q6hMC2ZHdk","POUYSgtCA5","Cp3mZjiVBP","tjQxszbIYY","aez9yECMvU","uPX7GYjB9t","0MR5XOUYuF","MezSW4QMc9","zmLYDXflUq",
+"QYxC0LDk6f","rKDLJ7Ow5C","ogLgcWaim6","5iGN5lsQGo","ix74rBCxeC","QworuYOfrY","HfyNQtAOsr","lj07Qt59lR","v1HlnSmGzv","OxWIHW7cTs",
+"RkQke2DREs","I7p2a1LB1L","5NammNxx9V","oVQp6Mkgy8","Kr8ysiB08l","FGzgpO3iyQ","Yf2Ec8FmFH","8FmFH8TxD7","pWiOsMGlTF","LDk6fvkCHH",
+"i3pydThjNn","BGaQYKASQ8","yEfy95IhmG","VerEAKsjRK","FVMxoLewvM","xciqp8hJdt","2Nslmv1Hln","KASQ82Nslm","qQxHPvOqCE","5IhmGiB08l",
+"IBe8kxReec","K4GS81LB1L","s7MxkAOgEe","AgJHQAgJHQ","3weIFAOgEe","In3NSAmdQd","NhXdurz7Ut","pvgjSeuZA5","XflUqjSjS3","lm0pDWmadA",
+"MaJQsS2Dfu","QWxoTMojnP","Waim629QAz","HzZT8In3NS","s4786D6rBy","nlaBy9rlg9","2DREsQWxoT","16lHclweGy","ECMvU0PktI","Uvlv4FLsph",
+"CxVEfCdyBV","mz8gxDz1R3","8hJdt07n1c","XyPZNhUTw7","okgRizQt6Q","nnP8oF6PT2","WmadA48cHL","gtCA5ciuWz","y94nwZuDtD","CqqaDWmadA",
+"zY1GY0YAGH","mz8gxwiHrZ","POUYSWmadA","2hEEU0h1b1","5IhmGSmGzv","mz8gxgtCA5","VIlwPyofH3","MK07YLbRTH","o8UydMGlTF","ix74ra00b5",
+"ReKEWatef2","qaofNqaofN","oVQp6faHir","WPmlxCp3mZ","L7cGcbZLvS","zmLYD9GXkX","fLNg8mX2GE","uJScXuLtKs","2hEEUGXdoH","PYBf4yofH3",
+"StlDJXflUq","vkCHHOUYuF","fqypy7Ow5C","lm0pDCfgr3","FFDui55rfB","GXdoHMkgy8","v1HlncQOnv","gIYvEVprf2","zbIYYaFFss","Mkgy8KsjRK",
+"Yf2Eche9IA","AXpwEqQxHP","wDajXOUqFM","LDk6fW3VFH","G1RhSQWxoT","uZPqgOUYuF","618DiChuy3","dmoS73weIF","pvgjSiKqhr","SjskQpiJSk",
+"G1RhSM3zXL","Uvlv4U3yw5","yToGWbgJAz","IRh48QssNC","fcwDaHzZT8","VBjhzP6bcg","rhl0JIn3NS","IBe8koVQp6","Ss0ZuAkKTk","KsjRK5VZjS",
+"iqv4k5Namm","SmGzvn8pJ9","suY4x24ARF","CIShGQworu","JRJQBtvdkD","Uvlv4CK5W7","fcJOysoy9t","FhtglW3VFH","5ZaEz0Wr5y","B3qemSjskQ",
+"Gv3FqEdBKc","tlILtCdyBV","CxVEfvkCHH","nnP8oSWfou","K4GS8P6bcg","0KyfsgtCA5","ydG8UjeskS","t59lRaDGtS","zz4ZUZhwG1","9eoRc4W0Tl",
+"6AFT0uupzk","GWqqXyluBx","6q6L916lHc","vLsmSuLtKs","0BmCyeuZA5","S2Dfu8hJdt","XyPZNMK07Y","dhSuH5Drn0","ZJTXHS2Dfu","rz7Ut3otm6",
+"oQ87rY1mC0","aFFssAmdQd","i7WMQGXdoH","VNCPdCp3mZ","P6bcgB3qem","Oz8yZ0Wr5y","fLNg8i7WMQ","FwEJzxciqp","Ta8f6EOE1o","4QMc9oGu6x",
+"i3pydSWfou","VjCZqYjB9t","BFkb8aFFss","sx5Glrhl0J","FcWrWCdyBV","MojnPyluBx","zHF1qokgRi","zFgtBDQimp","OxWIHWPmlx","FhtglVprf2",
+"Oz8yZNhXdu","618Dix3LDe","AgJHQSjskQ","S77LHxReec","faHirzHF1q","I7p2aAkKTk","29QAz0YAGH","VBjhzdjsrv","C2IrcMezSW","FVMxoUvlv4",
+"fLNg8O3iyQ","6q6L9jzUqR","Ta8f6lj07Q","DcpWBwDajX","5nmWvgjUTu","IRh48pAhR1","KZamHsuY4x","Q6LixFjHXR","x3LDeCdyBV","iqv4kG1RhS",
+"iqv4kAOgEe","HlUbF48cHL","n1pmOvOqCE","Yh1hFZUnqt","8U2nUHfyNQ","zbIYYG1RhS","h1zcHpWiOs","FFDuicL0aE","aez9y5IhmG","uQIczatef2",
+"wDajXVjCZq","gf8rIjzUqR","5drc68TxD7","ciuWzHRxd8","x3LDepmeCd","5nmWviB08l","5iGN50MR5X","uvf7At98iW","5nmWvHRxd8","atef2hE1Ql",
+"GrDg7D6rBy","7Ow5CCp3mZ","azIWpm4bxU","5Namm5IhmG","MmKGJECMvU","xciqpe6e4z","i7WMQogLgc","ZzJHWKZamH","14FLRpvgjS","9y4lwYw2oU",
+"CNHmv29QAz","tlILtsx5Gl","taOXKeuZA5","618DiNo0Qb","JIqXiIRh48","Ta8f69rlg9","Uvlv4JJs5m","X6PinVNCPd","x3LDex3LDe","AOgEeOUqFM",
+"pv0i74W0Tl","faHircL0aE","NhXduI7p2a","pWiOsv8yFN","mX2GE2Yz7E","d85a9zz4ZU","7Ow5Cru4UG","7hyVv2TRI7","7ku1p45cIH","fqypyd85a9",
+"FcWrWOz8yZ","taOXKS77LH","RmDcr5IhmG","jeskS5Namm","Y1mC07ku1p","piJSk5IhmG","5iGN5QbxXc","In3NSXyPZN","QssNCOz8yZ","uPX7GWaWsv",
+"ThjNnCK5W7","ECMvUtl72W","m4bxUzmLYD","K20wKRpBQm","SjskQIKxdL","580YDmX2GE","QYxC0OUYuF","S77LHuN6r3","EdBKcL7cGc","7ku1pZzJHW",
+"fcwDaRxrsm","ZUnqthe9IA","zFgtBVerEA","FGzgpAIYUu","POUYSzqH0W","5ZaEzh1zcH","OUqFMQworu","Q6Lixx3LDe","2TRI7faHir","6AFT0dmoS7",
+"Cfgr3Cp3mZ","ru4UGTXQ0Z","Yw2oUB3qem","4W0Tl8U2nU","Gv3FqOHaBz","7hyVv8hJdt","dpe1vFwEJz","s93MlgIYvE","9GXkX7lUXZ","AkKTkJXljW",
+"ZuDtDSmGzv","0ao3lgtCA5","fmIK1gdQsS","EoToPSjskQ","5VZjSRpBQm","3weIFKZamH","8hJdt5nmWv","jSjS3RmDcr","tAOsrbZLvS","2Nslma00b5",
+"CdyBVnnP8o","D6rByrhl0J","0PktI9rlg9","uQIcz1v5hH","IjTwPpmeCd","JXljWaDGtS","7fsYMhi5X7","CxVEfm4bxU","MezSWBCxeC","soy9tQClRL",
+"M3zXLsx5Gl","J2mQilViBv","Dz1R3h1zcH","uvf7Aa00b5","aFFssRxrsm","WPmlxOUYuF","nnP8otlILt","tAOsryToGW","3weIFBbwgA","F6PT2Kr8ys",
+"sqVrf5Drn0","cQOnvfaHir","VjCZqTXQ0Z","hYBCKokgRi","h1zcHix74r","PYBf4QbxXc","DG4sT1j5L8","ogLgc5ZaEz","Y1mC02Yz7E","Yf2EcDG4sT",
+"Ss0Zu8xEKz","vOqCEZzJHW","2DREsokgRi","Ul4a1zmLYD","h1zcHjtn0X","GWqqX0Wr5y","2Yz7EdmoS7","rz7UtQnJ1S","Dz1R3qUJMd","Oz8yZVBjhz",
+"bgJAzFPfSE","JJs5mvOqCE","Cfgr3pFrrl","lXFOBNcICA","Kr8ysi3pyd","jS1ajFPfSE","yluBx4QMc9","NcICAlkMUA","dQ586QnJ1S","lXFOB1LB1L",
+"AXpwEJRJQB","5Mg9rYw2oU","ogLgcMezSW","L7cGclkMUA","zqH0WvLsmS","0h1b1aez9y","L7cGccmXIX","Zv7z0UlU3M","618DilpF6W","8cVD3FLsph",
+"pWiOssx5Gl","t98iWWaWsv","MojnPksJby","lj07QdmoS7","tuDySiqv4k","2Yz7EoQ87r","nlaBy0Kyfs","WaWsvazIWp","oQ87rb29RJ","djsrvNAFuw",
+"4dEz6U3yw5","7Ow5CEOE1o","OUqFMIRh48","W7cTsVLTy6","hSSvQTa8f6","UmaEvlj07Q","zqH0WQbxXc","Vprf2Fhtgl","BGaQY8U2nU","07n1cQworu",
+"FxX9qmX2GE","1v5hHNxx9V","WreyPl83Ud","4QMc9Twano","6q6L9XflUq","8cVD30YAGH","8xEKzReKEW","sqVrfoGu6x","fmIK1AXpwE","FjHXRBFkb8",
+"Cfgr3azIWp","IBe8k7lUXZ","vLsmSuvf7A","Zv7z0GSQwj","JJs5mAOgEe","K4GS88xEKz","IBe8kWaWsv","t59lR0Kyfs","fcJOykB5nP","UlU3MCIShG",
+"lXFOBd7vjM","ReKEWzmLYD","bZLvSxReec","G1RhSMaJQs","Mm8siS2Dfu","OUqFM4dEz6","yvOMIOxWIH","RpBQmd7vjM","guMb8ydG8U","OUYuF5ZaEz",
+"WMiS3y94nw","vOqCEIKxdL","0Wr5y580YD","14FLRYf2Ec","LbRTHtjQxs","QnJ1SlweGy","pv0i7FxX9q","8TxD7tvdkD","ulk41WPmlx","MaJQstAOsr",
+"RxrsmIBe8k","CxVEfjzUqR","TCgPpksJby","7lUXZS2Dfu","OHaBzxReec","yEfy9pmeCd","ciuWzyluBx","ThjNn0MR5X","JkzUnFPfSE","TCgPpCfgr3",
+"7Ow5ClViBv","0ao3lTXQ0Z","LbRTHuupzk","G1RhSksJby","TwanoM6qcG","0ao3liwzGk","2DREsaez9y","oVQp6euZA5","UmaEvZUnqt","YOfrY2ZHdk",
+"okgRiulk41","nlaByzmLYD","IKxdLqUJMd","FnPFBk85Ae","TCgPpZv7z0","azIWppmeCd","vkCHH9iGoT","zqH0WKsjRK","0h1b1fmIK1","qQxHP5Mg9r",
+"4dEz6qaofN","pmeCdpAhR1","uoStwW3VFH","aez9y618Di","lsQGoL7cGc","vkCHHn1pmO","JRJQBxXTI4","4dEz6LewvM","EOE1oVNCPd","nFqiksx5Gl",
+"BFkb8WmadA","7ku1pjfREu","Zv7z03otm6","9XyT9AOgEe","P6bcgsuY4x","RsQUqF6PT2","5Mg9rM3zXL","fcwDaRkQke","tvdkDFcWrW","5iGN5ulk41",
+"9iGoT55rfB","uQIczCdyBV","x3LDeZhwG1","oQ87ruAWyp","ReKEWS77LH","lH1ktgf8rI","Dz1R3FVMxo","gjUTunlaBy","EdBKc9eoRc","pvgjSEdBKc",
+"Pb1pacShY2","Q6hMCY1mC0","fcwDa7Ow5C","v2eC3fcJOy","wiHrZ2Nslm","2ZHdkbgJAz","n8pJ9ix74r","EdBKcUmaEv","fqypyzQt6Q","jS1ajBGaQY",
+"2ZHdkFFDui","uAWypQChxs","HRxd8Twano","yvOMIyofH3","v8yFNBpYhV","kZANmt59lR","VjCZqW7cTs","JIqXiEOE1o","MezSWU3yw5","lsQGoRxrsm",
+"FwEJzKZamH","RkQkeQWxoT","RsQUqsoy9t","zHF1qqaofN","29QAzfLNg8","KsjRKEdBKc","7X3uyO3iyQ","SmGzv9eoRc","580YDzHF1q","OxWIHTCgPp",
+"jS1ajhSSvQ","8U2nU5ZaEz","Q6hMCt98iW","ZuDtDEdBKc","prNT6SmGzv","SWfouLbRTH","7lUXZ0YAGH","U3yw5zHF1q","4QMc9OUYuF","FPfSEuJScX",
+"AkKTkUmaEv","WaWsv5VZjS","0PktIoVQp6","blLA9RzaZA","s93MlVIlwP","ZuDtDuTacx","n1pmODG4sT","gtCA5C2Irc","ZhwG1XflUq","wiHrZNhXdu",
+"5iGN5AIYUu","0KyfsCqqaD","ThjNnk85Ae","gdQsSQClRL","AgJHQ0Wr5y","5ZaEz64s8N","FxX9qs93Ml","lH1ktYOfrY","zqH0WjiVBP","cShY2y94nw",
+"ZJTXHCIShG","kB5nPzQt6Q","NAFuwRkQke","aL6AJCNHmv","rKDLJNo0Qb","n8pJ9jfREu","uTacxfmIK1","HfyNQcL0aE","VIlwP2DREs","4W0TlrKDLJ",
+"sqVrfHP433","azIWpRmDcr","7fKYUxciqp","lH1ktAmdQd","Oz8yZciuWz","JJs5mWMiS3","NhXdutl72W","RxrsmZuDtD","bgJAzuAWyp","pAhR1POUYS",
+"SmGzvFFDui","BbwgAoVQp6","RzaZAd85a9","JkzUn4dEz6","5VZjSGv3Fq","qaofN55rfB","IjTwPb29RJ","5nmWvjfREu","mX2GEmX2GE","JIqXiZuDtD",
+"VerEAjtn0X","vLsmSHRxd8","iB08lS2Dfu","pvgjSogLgc","4W0Tl9y4lw","Oz8yZTXQ0Z","AkKTkFcWrW","s4786HfyNQ","pvgjSHlUbF","FwEJzFPfSE",
+"v8yFN6AFT0","zbIYYP6bcg","7lUXZuPX7G","MK07YdQ586","gIYvEF6PT2","3weIFpiJSk","O3iyQcmXIX","aFFssaDGtS","580YDl83Ud","9GXkXyEfy9",
+"uN6r3iqv4k","RmDcrS77LH","s93MlfFDrJ","QClRLGWqqX","J2mQini2v1","GWqqXWMiS3","NAFuwsoy9t","0MR5XWPmlx","o8UydrKDLJ","xXTI4POUYS",
+"fcJOyyToGW","qQxHPCdyBV","FFDui64s8N","yofH31LB1L","SmGzvVjCZq","NAFuw07n1c","v1Hlnxciqp","JIqXiFFDui","AmdQdCp3mZ","CIShGdQ586",
+"RkQkeYOfrY","UmaEv8TxD7","Z4I1vGSQwj","ECMvUGSQwj","IRh489iGoT","uTacxZhwG1","7hyVv7hyVv","16lHcd85a9","uN6r3RACuj","AOgEelkMUA",
+"2ZHdk9y4lw","I7p2aazIWp","t59lR5Drn0","FVMxoBbwgA","MK07YciuWz","Oz8yZ8FmFH","kB5nPZUnqt","9iGoTZUnqt","pWiOsuvf7A","pv0i7MojnP",
+"BCxeCtuDyS","DcpWB5Drn0","TCgPpMezSW","dQ586sx5Gl","QClRLHRxd8","HzZT88TxD7","a00b52DREs","9y4lwru4UG","580YDhe9IA","0h1b1Oz8yZ",
+"Dz1R3hSSvQ","MaJQscQOnv","FnPFB0ao3l","s4786fcJOy","48cHLokgRi","1j5L8ksJby","ZUnqtZzJHW","cmXIXWaim6","Waim6fLNg8","UmaEvatef2",
+"MGlTFI7p2a","v2eC3aL6AJ","J2mQitAOsr","lCMxy618Di","uupzkFFDui","zY1GYS77LH","P6bcgZhwG1","bZLvSUl4a1","d7vjM0Wr5y","lweGyvkCHH",
+"FNYIMJIqXi","5VZjSokgRi","gf8rILDk6f","sqVrfrz7Ut","aDGtSuLtKs","MezSWJ2mQi","rKDLJVerEA","he9IA24ARF","blLA9d85a9","ZzJHW7fsYM",
+"Nxx9VMkgy8","ydG8UzQt6Q","M3zXLe6e4z","uJScXTXQ0Z","WreyPReKEW","9rlg9RmDcr","s4786AkKTk","4QMc9d7vjM","MGlTFJXljW","sx5GlDz1R3",
+"tjQxs5Mg9r","guMb8tl72W","PYBf4aL6AJ","3weIFGXdoH","s93MlC2Irc","hi5X7MK07Y","Ta8f6AIYUu","XyPZNM6qcG","6AFT0zY1GY","EOE1ov8yFN",
+"pFrrlx3LDe","In3NSCK5W7","2Yz7EThjNn","7Ow5CRzaZA","OxWIHcmXIX","580YDcShY2","AOgEev2eC3","m4bxU0ao3l","HfyNQ29QAz","JkzUnDcpWB",
+"gtCA5CqqaD","6AFT0yToGW","ix74rCdyBV","yToGWx3LDe","2NslmaFFss","O3iyQt98iW","64s8NfmIK1","9y4lwyToGW","64s8NK20wK","oQ87rfLNg8",
+"FcWrW0PktI","n8pJ9lpF6W","UlU3M8TxD7","5Drn0tlILt","kZANmgtCA5","FwEJzoGu6x","JkzUnRpBQm","24ARFtl72W","cShY28cVD3","SWfouzqH0W",
+"wDajX3weIF","RkQke8hJdt","DcpWBWaim6","X6PinbZLvS","jeskSaFFss","6AFT0bZLvS","yluBxDG4sT","2hEEUuTacx","RpBQmguMb8","Yw2oUaez9y",
+"RmDcrhYBCK","4QMc9NAFuw","cQOnvW3VFH","ni2v1v1Hln","OUYuFhe9IA","AIYUuLewvM","t98iWEdBKc","rz7UtlweGy","hE1QlAkKTk","7fKYUO3iyQ",
+"AXpwE07n1c","FLsphhe9IA","NOHszsuY4x","Waim6XflUq","JRJQBuTacx","he9IAnnP8o","zmLYDvLsmS","F6PT2CqqaD","U3yw55Drn0","CqqaDTXQ0Z",
+"ydG8UhSSvQ","Yf2Ecjtn0X","ThjNn5Mg9r","xReecrz7Ut","prNT6OHaBz","h1zcHi3pyd","2Yz7EIKxdL","yluBx5VZjS","K20wKix74r","nFqikksJby",
+"0BmCyCNHmv","XflUqSjskQ","cmXIXhUTw7","jtn0XWaWsv","YjB9tFLsph","HfyNQIKxdL","AIYUue6e4z","24ARF0ao3l","W7cTsjiVBP","4dEz6ciuWz",
+"KASQ8618Di","CK5W7cShY2","RsQUqyluBx","Vprf2Cfgr3","FPfSEpFrrl","P6bcgnlaBy","VIlwPy94nw","uJScXcShY2","hSSvQfaHir","d7vjMa00b5",
+"Ul4a1s7Mxk","JXljWtAOsr","ix74rXyPZN","MmsIohSSvQ","5iGN5JkzUn","Ta8f6rKDLJ","AXpwEMm8si","XyPZNfqypy","uZPqg5Namm","vLsmS5IhmG",
+"mX2GEVerEA","AgJHQ1LB1L","5Namm29QAz","CxVEfWMiS3","azIWpLbRTH","ZuDtDFjHXR","Z4I1vZuDtD","pv0i7n1pmO","14FLRGSQwj","Cfgr38xEKz",
+"n1pmOzHF1q","wDajX9y4lw","s7MxkNOHsz","W7cTstjQxs","MezSWUl4a1","yvOMI7hyVv","MojnPW7cTs","Rxrsmaez9y","cQOnvpWiOs","TwanoStlDJ",
+"WmadAqQxHP","Cp3mZdmoS7","VjCZqgtCA5","ZuDtDZ4I1v","lweGy5Namm","zqH0WIRh48","fqypyWMiS3","AmdQd5VZjS","4dEz6VjCZq","dpe1vh1zcH",
+"Mm8sisuY4x","oVQp68TxD7","LbRTHWreyP","Ss0ZutjQxs","uoStwzz4ZU","WreyPFGzgp","8TxD7Ss0Zu","ZuDtD07n1c","s7MxkUlU3M","NAFuw8cVD3",
+"Ss0Zu3weIF","Mkgy80ao3l","ZzJHWF6PT2","FPfSExReec","JIqXitAOsr","In3NSwDajX","Mm8sicL0aE","ni2v1JRJQB","bZLvSyEfy9","hE1Ql2Nslm",
+"RkQke55rfB","FjHXRwDajX","X6Pinn8pJ9","lm0pD6AFT0","ZUnqtIRh48","DG4sTqUJMd","pv0i7DLhzM","HzZT85nmWv","5NammQ6Lix","v1HlnRkQke",
+"cQOnvuTacx","zz4ZUW3VFH","MezSWv8yFN","8cVD32ZHdk","ZuDtDHlUbF","8xEKzdmoS7","i3pydCxVEf","s4786h1zcH","dQ586CK5W7","uvf7AWaim6",
+"zY1GYWDVWJ","ECMvU4dEz6","tjQxsZ4I1v","VBjhznFqik","cShY2tAOsr","8RCUAGSQwj","h1zcHsqVrf","v1HlnUmaEv","IBe8kMezSW","rz7UtZuDtD",
+"BFkb8SjskQ","e6e4zKsjRK","9eoRcTa8f6","7ku1pix74r","Mkgy8IjTwP","qUJMd8FmFH","VNCPdrKDLJ","TCgPp5IhmG","Cp3mZ5VZjS","yToGW8FmFH",
+"e6e4zSs0Zu","Fhtgl2TRI7","XflUq0MR5X","pvgjS6AFT0","LewvML7cGc","MojnPChuy3","07n1cGrDg7","oQ87rFwEJz","rz7UtbrhlQ","nlaByfFDrJ",
+"9GXkXHRxd8","AkKTko8Uyd","WPmlxulk41","m4bxUfcJOy","xciqp7lUXZ","5Drn03otm6","0Wr5yLewvM","0Wr5yuQIcz","dQ586pv0i7","M6qcGbrhlQ",
+"QbxXcgjUTu","OUqFMNxx9V","zHF1qjiVBP","7X3uyiB08l","aFFss9rlg9","kZANmDz1R3","9y4lwtAOsr","MGlTFDLhzM","uvf7Agf8rI","MaJQsM3zXL",
+"K20wKBGaQY","SWfoui7WMQ","x3LDe2TRI7","d85a9B3qem","FcWrW9iGoT","D6rByOHaBz","YOfrYpvgjS","3otm6sx5Gl","OUYuFv2eC3","y94nwL7cGc",
+"QssNCMGlTF","2Yz7E5nmWv","Q6hMChYBCK","OUqFMB3qem","uLtKsReKEW","jfREu5Mg9r","NcICA0Kyfs","J2mQiQbxXc","uLtKspFrrl","pvgjSYOfrY",
+"RBhp07fKYU","dmoS75drc6","HzZT84QMc9","pAhR1U3yw5","4dEz68FmFH","qUJMdGv3Fq","vkCHHyvOMI","d7vjM7Ow5C","S77LHatef2","OxWIHFxX9q",
+"IKxdLWmadA","taOXKyluBx","mX2GEsx5Gl","JKWYRuupzk","ix74rhE1Ql","suY4xK4GS8","sx5GlcL0aE","mz8gx48cHL","CxVEfW7cTs","RkQkes4786",
+"Ul4a1WreyP","S77LHGSQwj","ni2v1s7Mxk","K4GS8NAFuw","0h1b1OUYuF","Ss0ZuFjHXR","ECMvU5Namm","ReKEWFxX9q","LDk6fDG4sT","FnPFByToGW",
+"soy9tUvlv4","VLTy6Cfgr3","EOE1oyluBx","LewvM9eoRc","brhlQDz1R3","Ta8f6HfyNQ","cmXIXY1mC0","5Drn0AkKTk","JIqXiMGlTF","9GXkXi3pyd",
+"HlUbFFxX9q","9GXkXVBjhz","oGu6xY1mC0","G1RhSpFrrl","FPfSEECMvU","EdBKcfLNg8","tAOsrYjB9t","mz8gx0PktI","HlUbFUlU3M","PYBf4iB08l",
+"rKDLJGrDg7","GXdoHDz1R3","uPX7GM3zXL","5ZaEzUmaEv","Kr8ysAOgEe","tuDySGSQwj","KZamH5ZaEz","TXQ0Za00b5","QWxoTyEfy9","jS1aj45cIH",
+"uTacxblLA9","oVQp60PktI","7fKYUfaHir","Yf2Ec14FLR","tl72WqQxHP","WmadAtlILt","GXdoHa00b5","guMb8JJs5m","3weIF580YD","hE1QlhYBCK",
+"pv0i7FFDui","6q6L9NAFuw","7X3uyOz8yZ","GrDg7s93Ml","CqqaDfcJOy","n8pJ9x3LDe","WMiS32Yz7E","rKDLJUl4a1","brhlQJXljW","hi5X7sx5Gl",
+"JRJQBQnJ1S","8cVD3jeskS","F6PT2zFgtB","07n1cNhXdu","0MR5XTwano","1LB1L5VZjS","IBe8klsQGo","BFkb8jfREu","RACujCNHmv","sx5GloGu6x",
+"m4bxUqUJMd","DcpWBRmDcr","TCgPpFPfSE","YOfrYfcJOy","UmaEvVjCZq","M6qcGpT8wu","pAhR1v8yFN","BbwgAAkKTk","OxWIHd85a9","b29RJmX2GE",
+"yofH3taOXK","AmdQdNo0Qb","oVQp6i7WMQ","dQ586ix74r","rz7UtVerEA","i3pyd9y4lw","lpF6WSWfou","ix74rRzaZA","8hJdttlILt","07n1cDz1R3",
+"JJs5msoy9t","FwEJzVLTy6","uAWypCNHmv","s93MlpT8wu","blLA9Ss0Zu","vLsmSd7vjM","M6qcGciuWz","NAFuwpFrrl","dpe1vF6PT2","s93MlvkCHH",
+"v1HlnKZamH","7fsYMOxWIH","0Wr5ySbRYy","h1zcH2Yz7E","pWiOsnFqik","aez9y5nmWv","d7vjM2DREs","Pb1pazbIYY","64s8N5Mg9r","5NammZ4I1v",
+"Vprf2k85Ae","MmsIo8FmFH","bgJAzNo0Qb","FGzgpcmXIX","e6e4zzY1GY","618DiXflUq","Fhtgl580YD","pmeCdfaHir","yvOMIG1RhS","QYxC0pAhR1",
+"48cHLtuDyS","lXFOBuvf7A","EOE1oL7cGc","2ZHdkKZamH","n1pmO6q6L9","uAWypAkKTk","BGaQYwiHrZ","uTacxNOHsz","RpBQmsx5Gl","VBjhzhE1Ql",
+"atef2iB08l","FVMxotl72W","ydG8U7lUXZ","5nmWvWaWsv","he9IABpYhV","h1zcHIKxdL","jzUqRazIWp","cQOnvKASQ8","lH1ktUl4a1","d85a9SWfou",
+"AOgEeGSQwj","POUYSTa8f6","TXQ0ZCqqaD","QChxs3otm6","azIWp8cVD3","3otm6aL6AJ","TXQ0ZPb1pa","rz7UtKASQ8","QssNCgtCA5","he9IALDk6f",
+"pFrrllCMxy","m4bxU8cVD3","2hEEUB3qem","U3yw5WreyP","iqv4ksuY4x","FxX9qlsQGo","oGu6x5Mg9r","ReKEWStlDJ","lm0pDJKWYR","GXdoHFjHXR",
+"SWfou0Kyfs","wDajXP6bcg","OUqFMFPfSE","wDajX6AFT0","24ARFd7vjM","WDVWJCxVEf","Y1mC0e6e4z","B3qem9XyT9","nFqikVjCZq","2NslmDQimp",
+"bZLvSQ6hMC","ZuDtDNAFuw","JJs5mqQxHP","gf8rIQWxoT","5IhmG07n1c","Fhtgl55rfB","e6e4zX6Pin","IRh48wDajX","oQ87rK4GS8","7ku1ps7Mxk",
+"uJScXcmXIX","HzZT8dQ586","SjskQydG8U","5iGN5guMb8","9iGoTyofH3","4W0TlMGlTF","WaWsvS77LH","DcpWBuPX7G","UmaEvuLtKs","NOHszlCMxy",
+"uupzk9eoRc","AmdQdNhXdu","aez9ytuDyS","ThjNnt59lR","zHF1qblLA9","ZzJHWBFkb8","Ul4a1RmDcr","a00b5In3NS","QworuDQimp","HRxd8tvdkD",
+"7hyVvNOHsz","EdBKctaOXK","rz7UtECMvU","y94nwhe9IA","HlUbFFPfSE","MK07YuTacx","guMb8tvdkD","AOgEei7WMQ","9y4lwZ4I1v","WreyPGSQwj",
+"9rlg9HRxd8","AmdQdWPmlx","lweGyYjB9t","QClRLDz1R3","uTacxRACuj","FGzgpLbRTH","4dEz616lHc","DLhzMFhtgl","pFrrlVprf2","tuDySqQxHP",
+"OxWIH7hyVv","aDGtSIBe8k","Mm8siFVMxo","QnJ1Sfqypy","GWqqXFcWrW","7lUXZ1v5hH","I7p2asx5Gl","lkMUAuupzk","ZuDtDNxx9V","JJs5mMm8si",
+"pvgjSFwEJz","zHF1qUl4a1","m4bxUJRJQB","MaJQsoQ87r","5Namm8TxD7","CqqaDIRh48","zFgtBtaOXK","6q6L9Nxx9V","lj07QsuY4x","rKDLJFGzgp",
+"okgRiru4UG","5nmWveuZA5","MmsIorKDLJ","suY4x8xEKz","RsQUqjSjS3","K4GS86AFT0","Waim6BbwgA","QnJ1ShYBCK","RpBQm2Yz7E","6q6L9s7Mxk",
+"XyPZNeuZA5","i3pyd1LB1L","YOfrYSs0Zu","1j5L8kB5nP","JXljW2ZHdk","0Wr5yfLNg8","QChxsbZLvS","8FmFHVprf2","BGaQYDLhzM","ThjNntjQxs",
+"618DihE1Ql","yToGWNOHsz","9GXkXS2Dfu","2Yz7ECqqaD","gIYvEK20wK","d7vjMhYBCK","jfREuDcpWB","VLTy6CqqaD","k85Ae8RCUA","vLsmS5Drn0",
+"BbwgAcmXIX","9rlg9hi5X7","WPmlxWDVWJ","HP433yluBx","y94nwDG4sT","3otm6GSQwj","OUqFM7Ow5C","ix74rDQimp","FNYIMEoToP","MmsIoK20wK",
+"8TxD7djsrv","FhtgllsQGo","pv0i7Rxrsm","ECMvUPb1pa","jS1ajiqv4k","Y1mC03otm6","xReec2DREs","RxrsmuJScX","DQimpzHF1q","X6PinAOgEe",
+"3weIFtvdkD","vLsmSazIWp","RkQkeEoToP","9eoRc8TxD7","5IhmGUmaEv","OxWIHguMb8","SWfouQbxXc","v2eC3cL0aE","VerEA2Yz7E","8U2nUtuDyS",
+"VjCZqMmKGJ","Q6hMCIRh48","fFDrJCfgr3","7fKYUJRJQB","JkzUnZv7z0","hi5X7RmDcr","RACujtuDyS","No0QbCIShG","Ul4a1gIYvE","Z4I1vgf8rI",
+"CqqaDXyPZN","QssNCjS1aj","fLNg8okgRi","JRJQBQworu","iwzGkd85a9","580YD8cVD3","In3NSyofH3","Cfgr3GXdoH","XflUquQIcz","7Ow5CpFrrl",
+"v2eC38RCUA","dhSuH2hEEU","rz7UtIn3NS","VerEAv2eC3","0YAGH4W0Tl","tl72WyToGW","pAhR1Ul4a1","xciqpi7WMQ","Y1mC0QWxoT","IKxdLjSjS3",
+"Ss0ZuuLtKs","Uvlv4XyPZN","gjUTuhe9IA","Q6hMCtaOXK","sx5GlpiJSk","okgRiNcICA","WMiS3Yw2oU","zFgtB1j5L8","lpF6WmX2GE","fLNg8P6bcg",
+"fcwDa9y4lw","618Dihi5X7","e6e4zTa8f6","uPX7GlXFOB","vkCHHoVQp6","DLhzMXflUq","F6PT2M6qcG","brhlQmz8gx","dQ586JkzUn","suY4xzqH0W",
+"hYBCK4W0Tl","JkzUnOz8yZ","QnJ1Satef2","QnJ1SksJby","uTacxJXljW","FwEJzlXFOB","3weIFYf2Ec","bgJAz2hEEU","QnJ1SDLhzM","jS1ajjSjS3",
+"fFDrJtvdkD","W7cTsDLhzM","6AFT0J2mQi","6q6L9cQOnv","KASQ8D6rBy","uAWyplCMxy","VIlwPfFDrJ","64s8NFhtgl","WPmlxnFqik","RBhp0zY1GY",
+"WreyP0PktI","kZANmECMvU","vLsmSzQt6Q","Mm8sirhl0J","HRxd8yofH3","l83UdKr8ys","ksJby0BmCy","yluBxix74r","vOqCEBbwgA","gtCA5YjB9t",
+"WaWsvJ2mQi","Zv7z0n1pmO","l83Udv8yFN","Ta8f60ao3l","ZzJHW1j5L8","yofH3jSjS3","k85AegIYvE","BbwgAtlILt","fcJOyMm8si","Yw2oUGv3Fq",
+"9eoRcvOqCE","BFkb80YAGH","FNYIMAkKTk","lkMUADLhzM","sqVrfSjskQ","Yw2oUDG4sT","azIWprhl0J","VLTy6nFqik","jSjS3CIShG","DLhzMAkKTk",
+"k85AejfREu","uZPqgjSjS3","zmLYDgjUTu","Pb1paUmaEv","i7WMQiB08l","YOfrYJKWYR","8RCUAdpe1v","CIShGCxVEf","CK5W7mz8gx","BCxeC48cHL",
+"7fKYURBhp0","e6e4zUmaEv","7fsYM1LB1L","e6e4zG1RhS","cmXIXzY1GY","kZANmMm8si","AXpwEVIlwP","nnP8o2ZHdk","ZhwG1580YD","Mm8siBFkb8",
+"tuDySMkgy8","sqVrfYw2oU","cmXIXNOHsz","tl72WK4GS8","0BmCyWDVWJ","lH1ktlweGy","0YAGHRxrsm","X6Pinmz8gx","MojnPs93Ml","zmLYDUlU3M",
+"ru4UGuJScX","KZamHwDajX","EOE1ofFDrJ","JRJQBBCxeC","kZANm48cHL","WaWsvBpYhV","yEfy98hJdt","jtn0XzbIYY","8U2nUNxx9V","uoStw45cIH",
+"Mkgy8JJs5m","580YDUl4a1","4dEz6Yf2Ec","zQt6QLbRTH","5IhmG0Wr5y","45cIHtuDyS","UmaEv3weIF","RBhp024ARF","sx5Gl1LB1L","xReec07n1c",
+"e6e4zHlUbF","S77LHmz8gx","tuDySRsQUq","iwzGkpAhR1","5IhmG8TxD7","sqVrfOxWIH","5drc6Kr8ys","7lUXZIjTwP","FwEJznnP8o","EOE1ouQIcz",
+"Ss0Zu1j5L8","FLsphqaofN","UmaEvuTacx","he9IAVBjhz","8cVD3oGu6x","euZA5ulk41","I7p2aulk41","AmdQd618Di","rz7UtCqqaD","AgJHQIjTwP",
+"JIqXilH1kt","he9IAydG8U","o8UydWaim6","JXljWGSQwj","fFDrJzQt6Q","pvgjSpAhR1","hi5X7FxX9q","O3iyQyluBx","MezSWKASQ8","I7p2arhl0J",
+"mz8gx8RCUA","2Yz7EGXdoH","OHaBzsuY4x","i3pyddjsrv","XyPZNix74r","djsrv9rlg9","brhlQG1RhS","prNT6pAhR1","guMb8WDVWJ","HP433hE1Ql",
+"2ZHdk8cVD3","HRxd8uoStw","D6rBy1LB1L","nFqikVBjhz","In3NSuN6r3","QssNCs7Mxk","uvf7Auupzk","WaWsvLewvM","Ta8f6ZUnqt","kZANmazIWp",
+"xXTI4yluBx","AXpwEReKEW","G1RhSaez9y","VIlwPm4bxU","5drc6OxWIH","KZamHKr8ys","t98iWSs0Zu","DLhzMBCxeC","rz7UtrKDLJ","ReKEWrhl0J",
+"zQt6QiKqhr","FxX9qW7cTs","DG4sT45cIH","uTacxwiHrZ","EoToP07n1c","MmKGJDcpWB","ZuDtDt59lR","VBjhztl72W","2DREsVLTy6","FxX9q7X3uy",
+"o8UydblLA9","uTacxCp3mZ","QworuMK07Y","uZPqgGv3Fq","4W0Tls7Mxk","hYBCKAkKTk","gtCA5Q6hMC","nlaByrKDLJ","lkMUArz7Ut","9XyT9RBhp0",
+"ZJTXHnFqik","OUqFMpAhR1","tlILtK20wK","Yf2EcjSjS3","FPfSEiwzGk","5Drn00PktI","J2mQiqaofN","JJs5m5drc6","0MR5XJKWYR","jeskSQssNC",
+"CxVEfVjCZq","CNHmvxXTI4","hi5X7GWqqX","blLA9rKDLJ","rKDLJtjQxs","lsQGoyvOMI","RACujUlU3M","7hyVv8TxD7","djsrvWmadA","x3LDeGrDg7",
+"IRh48yToGW","VLTy6XflUq","Dz1R35drc6","EdBKcqQxHP","jeskS9eoRc","soy9t0MR5X","zY1GYLbRTH","QworuIjTwP","Y1mC0lCMxy","1v5hHRzaZA",
+"gdQsSFhtgl","DLhzM9rlg9","Gv3Fqv1Hln","FnPFBJ2mQi","7lUXZt98iW","Ul4a1YjB9t","lXFOBt98iW","gf8rIFhtgl","fcJOy7fKYU","618Dipv0i7",
+"2hEEUJ2mQi","iqv4kMezSW","K20wKEdBKc","OUqFMI7p2a","MezSWciuWz","RpBQmlweGy","fqypygdQsS","HRxd8SjskQ","MaJQsKsjRK","FGzgpMkgy8",
+"5Namms7Mxk","lH1ktNhXdu","K4GS8ReKEW","yEfy9yToGW","ReKEWMK07Y","JKWYRJRJQB","lpF6WAmdQd","hSSvQTXQ0Z","uZPqgVjCZq","yToGWDG4sT",
+"xciqphi5X7","iqv4k7hyVv","ogLgcRsQUq","W3VFH9eoRc","29QAz5nmWv","s7MxkZuDtD","uZPqg16lHc","d85a9Fhtgl","WPmlxQClRL","oVQp6RBhp0",
+"Y1mC0brhlQ","ni2v1WaWsv","qQxHPNcICA","ix74r4W0Tl","fcwDaYw2oU","WDVWJ618Di","0Wr5yHRxd8","2ZHdkuLtKs","zY1GYQ6hMC","ECMvUTwano",
+"zQt6QwDajX","QClRLpFrrl","cShY2JkzUn","aL6AJ16lHc","faHirOxWIH","LewvMrKDLJ","nlaByYh1hF","QssNC9y4lw","XyPZND6rBy","zHF1qY1mC0",
+"uN6r3QWxoT","Rxrsm24ARF","hi5X7Zv7z0","lj07QSWfou","FjHXROxWIH","pFrrlK4GS8","D6rBys93Ml","atef25nmWv","8TxD7SbRYy","VBjhzx3LDe",
+"OxWIHGSQwj","cL0aEsx5Gl","QChxsrz7Ut","xReecGrDg7","h1zcHtuDyS","64s8NlCMxy","5ZaEzIKxdL","ni2v1taOXK","iKqhrlkMUA","RxrsmuN6r3",
+"Q6LixThjNn","LDk6fjS1aj","uPX7GQChxs","cQOnvBFkb8","ReKEWYh1hF","l83UdjS1aj","n8pJ9o8Uyd","ZzJHWYjB9t","uvf7AXflUq","blLA9DQimp",
+"tAOsrKsjRK","9eoRcAmdQd","uAWypNAFuw","StlDJy94nw","KsjRKI7p2a","yluBxCK5W7","FNYIMQworu","cShY2RmDcr","POUYStAOsr","0Kyfs2hEEU",
+"pvgjSpmeCd","Q6hMC7hyVv","yofH3FFDui","07n1cjfREu","cmXIX14FLR","ZJTXHe6e4z","lCMxy8TxD7","NcICAFGzgp","618DiW7cTs","1v5hHvOqCE",
+"WmadAZuDtD","lkMUAs7Mxk","fmIK15iGN5","VLTy68FmFH","8TxD7pAhR1","2TRI7ksJby","euZA5v2eC3","KASQ8hUTw7","7fsYMlweGy","iqv4kgjUTu",
+"yluBxhE1Ql","Chuy39y4lw","WMiS3ReKEW","yluBxRkQke","55rfBKZamH","suY4xIBe8k","oGu6xt98iW","0Wr5yAkKTk","djsrvFGzgp","KsjRKEOE1o",
+"48cHLK20wK","16lHcI7p2a","xReec9eoRc","zmLYDF6PT2","0Wr5ypiJSk","euZA5pvgjS","0MR5Xy94nw","Zv7z0JXljW","8cVD3M3zXL","IRh48sqVrf",
+"uQIczM6qcG","5drc6ZzJHW","dhSuHDG4sT","29QAzazIWp","CxVEfuvf7A","hi5X7In3NS","Yf2EcAOgEe","HP433NAFuw","VLTy6l83Ud","nnP8oni2v1",
+"suY4xiqv4k","dQ586QssNC","iKqhrJIqXi","tvdkD7lUXZ","VNCPd7lUXZ","TCgPpRsQUq","Oz8yZuupzk","blLA9dhSuH","0MR5Xaez9y","VIlwPX6Pin",
+"Yh1hFX6Pin","ogLgcoQ87r","Ta8f68FmFH","Q6hMCJKWYR","3weIFlweGy","TXQ0ZeuZA5","cL0aEjiVBP","M6qcGguMb8","taOXKYf2Ec","W7cTscQOnv",
+"ogLgc618Di","Y1mC0Q6Lix","U3yw5YjB9t","RBhp0oGu6x","v1HlnTa8f6","5IhmGMkgy8","yEfy9fcwDa","azIWpL7cGc","fFDrJogLgc","StlDJvOqCE",
+"lXFOBs4786","FLsph9eoRc","JkzUnlXFOB","7fsYMaL6AJ","4QMc9pT8wu","jtn0X8RCUA","JkzUn0Kyfs","s93MlRBhp0","EOE1oRsQUq","t98iWJkzUn",
+"lweGyqUJMd","CIShGiwzGk","hYBCKG1RhS","VIlwP5drc6","FhtglnFqik","hYBCK8FmFH","gIYvEtl72W","cQOnvzY1GY","vOqCEDQimp","X6PinlXFOB",
+"ZUnqtdQ586","cL0aEd85a9","ReKEWVprf2","7Ow5CQworu","7Ow5CBCxeC","lCMxyJkzUn","ogLgck85Ae","uTacxzmLYD","G1RhSNhXdu","i3pydGrDg7",
+"WreyP0MR5X","Chuy3Uvlv4","6AFT0tjQxs","lj07QFwEJz","VLTy6bZLvS","dQ586RBhp0","FnPFBdmoS7","9iGoT1LB1L","fcJOyAkKTk","64s8NIn3NS",
+"RzaZAS77LH","xciqppAhR1","Gv3Fq1v5hH","In3NSuoStw","piJSkzqH0W","pmeCdiqv4k","48cHLVNCPd","zqH0Wfqypy","yluBxtaOXK","FxX9qfcJOy",
+"tvdkDs93Ml","gtCA5WaWsv","pFrrlNOHsz","MGlTF7hyVv","zHF1qFFDui","2hEEUStlDJ","OUYuF2hEEU","FPfSEMmsIo","zY1GYuupzk","atef2vLsmS",
+"v8yFNaFFss","jzUqRMojnP","FLsphfcJOy","OxWIHazIWp","7Ow5C7lUXZ","FjHXRfcwDa","6q6L9WDVWJ","WMiS3taOXK","v2eC3BbwgA","8TxD7a00b5",
+"xciqpDQimp","Ss0Zu1LB1L","WPmlxMezSW","d7vjMuN6r3","7hyVvfFDrJ","soy9tWaWsv","IjTwPqaofN","i3pydnFqik","iwzGkokgRi","4dEz6aFFss",
+"Mm8si5Drn0","4QMc9QChxs","Uvlv4ZhwG1","RACujdpe1v","0MR5XIn3NS","7lUXZHP433","he9IAQYxC0","dQ586uQIcz","dQ586o8Uyd","WmadAlm0pD",
+"iKqhrBGaQY","SbRYyrKDLJ","DQimpAIYUu","y94nwFhtgl","JIqXiiB08l","LDk6fIBe8k","l83UdGrDg7","uPX7G5IhmG","dmoS71v5hH","Kr8ys8FmFH",
+"t98iWsoy9t","0BmCyZzJHW","m4bxUO3iyQ","nlaBypT8wu","55rfByluBx","WaWsvLDk6f","Mm8siM3zXL","hUTw7IBe8k","DLhzMx3LDe","EdBKcjSjS3",
+"m4bxUUlU3M","AXpwEtjQxs","GWqqX48cHL","9rlg9kB5nP","55rfBPb1pa","oGu6xa00b5","jiVBP9rlg9","uN6r3suY4x","0MR5XRmDcr","618DiVNCPd",
+"uvf7AaDGtS","6q6L9B3qem","W7cTsC2Irc","lpF6WFjHXR","dhSuHlkMUA","IKxdLYf2Ec","tjQxs8TxD7","kB5nPVprf2","JIqXi4dEz6","StlDJTXQ0Z",
+"oVQp6dmoS7","FNYIMRkQke","9iGoTChuy3","lj07Qk85Ae","MezSWGv3Fq","Pb1paNAFuw","BbwgAprNT6","4QMc98FmFH","uAWypIn3NS","D6rByiwzGk",
+"d85a98U2nU","RkQkepv0i7","0Wr5yM6qcG","PYBf4cmXIX","0PktI5drc6","D6rByEoToP","kB5nPMkgy8","2TRI7U3yw5","Dz1R3FnPFB","CdyBVGrDg7",
+"i3pydCfgr3","1LB1L9y4lw","8RCUAZ4I1v","MmKGJcShY2","KASQ8vLsmS","iKqhrciuWz","RpBQmU3yw5","lsQGoSmGzv","9iGoTIBe8k","ru4UGKr8ys",
+"s4786bgJAz","5VZjS2DREs","AkKTkQYxC0","5IhmGjeskS","qQxHPChuy3","MK07YOz8yZ","I7p2aG1RhS","kZANmru4UG","SbRYyRBhp0","uQIczcShY2",
+"7Ow5CIBe8k","Waim6ZUnqt","jS1ajDG4sT","yvOMI9rlg9","SmGzvh1zcH","yEfy9CIShG","DLhzM7hyVv","LbRTHRkQke","LewvM7lUXZ","he9IAAgJHQ",
+"nFqikFxX9q","JXljWFcWrW","Y1mC0XflUq","EdBKcpAhR1","VNCPdYw2oU","jSjS37fsYM","DG4sTeuZA5","Ta8f6VBjhz","SmGzvLbRTH","4W0Tl5Mg9r",
+"VerEAHzZT8","DLhzMd7vjM","jSjS3YOfrY","WmadAqUJMd","YjB9tKASQ8","Qworusoy9t","No0QbChuy3","VBjhzLewvM","J2mQipWiOs","fmIK1YOfrY",
+"In3NSZv7z0","UmaEvYOfrY","gIYvEuQIcz","RzaZAPOUYS","618DiHzZT8","gdQsSI7p2a","Ul4a1AkKTk","5Mg9rAkKTk","CqqaDSbRYy","TXQ0Zsx5Gl",
+"2ZHdkRsQUq","8TxD7WMiS3","7ku1pWDVWJ","I7p2aMK07Y","W7cTsK20wK","ydG8UgjUTu","ksJbyYw2oU","GSQwjGWqqX","WPmlx8TxD7","48cHLDG4sT",
+"vkCHHRzaZA","hE1QlcShY2","oGu6xGv3Fq","t98iWAOgEe","uTacxQnJ1S","d85a9uQIcz","hSSvQv2eC3","P6bcgBbwgA","CIShGTwano","AXpwEsx5Gl",
+"gtCA5tlILt","iwzGk8U2nU","rhl0JYf2Ec","RzaZA4dEz6","ZzJHWC2Irc","CxVEfk85Ae","iB08lzz4ZU","DcpWBLbRTH","U3yw5FVMxo","Mm8siJkzUn",
+"FnPFB5drc6","LewvMPOUYS","9XyT9XflUq","4QMc9guMb8","he9IADG4sT","vLsmSQ6hMC","pAhR1KZamH","m4bxU0PktI","d7vjM9XyT9","NOHszuN6r3",
+"5iGN5ECMvU","PYBf4MezSW","sx5Gl29QAz","DG4sTbgJAz","fcwDa0YAGH","In3NSHP433","gdQsSGSQwj","MK07Ye6e4z","yluBxI7p2a","AXpwEFwEJz",
+"zHF1qVerEA","1v5hHoGu6x","dhSuHPOUYS","s7MxkqQxHP","fqypy7X3uy","soy9tGSQwj","QChxs2Nslm","AgJHQWPmlx","2TRI7SjskQ","SjskQdmoS7",
+"Yf2EcMaJQs","SjskQRsQUq","dhSuHFjHXR","Q6LixpvgjS","W7cTs0Wr5y","HP4334dEz6","zFgtBMkgy8","TXQ0Zmz8gx","9iGoTsoy9t","qQxHPuJScX",
+"AkKTkKsjRK","kZANmn1pmO","6q6L9qQxHP","ydG8UjiVBP","fmIK1RkQke","aL6AJs93Ml","0MR5Xo8Uyd","hSSvQQChxs","CK5W7MmKGJ","pv0i78xEKz",
+"FjHXR0Kyfs","fLNg8Y1mC0","29QAzkZANm","ZuDtDi3pyd","ogLgcUlU3M","hSSvQs93Ml","pv0i7nlaBy","X6PinReKEW","wDajXGrDg7","CxVEf24ARF",
+"cmXIXbgJAz","HfyNQgdQsS","QssNCQbxXc","HlUbFTCgPp","yEfy95Mg9r","Ta8f6djsrv","zz4ZU8TxD7","0KyfsCdyBV","1j5L8tuDyS","RsQUqtvdkD",
+"prNT6lweGy","okgRiFjHXR","lViBvcL0aE","zmLYDZv7z0","wDajXi3pyd","fmIK1n1pmO","QYxC0gtCA5","FxX9qBpYhV","zbIYYrz7Ut","AmdQd4W0Tl",
+"tl72Wl83Ud","lj07Q8hJdt","SjskQKASQ8","ReKEWMojnP","pvgjSo8Uyd","AIYUuCxVEf","WreyPWaWsv","brhlQoGu6x","7fKYUjzUqR","vkCHHThjNn",
+"zmLYDgtCA5","Q6hMC7fsYM","o8UydUlU3M","cL0aElm0pD","fmIK1AmdQd","gIYvExciqp","UmaEvFFDui","Mkgy8D6rBy","lXFOB5iGN5","2Yz7EaDGtS",
+"7ku1pv1Hln","v1HlnUlU3M","OUYuFt59lR","8cVD38FmFH","YOfrYguMb8","K20wKHzZT8","yofH3tAOsr","gtCA5NhXdu","kB5nP3weIF","Ul4a1MezSW",
+"1LB1LFLsph","U3yw5hUTw7","s93Mluupzk","POUYSVIlwP","FcWrWWPmlx","WDVWJh1zcH","Nxx9VcL0aE","cmXIXQworu","JkzUnGWqqX","oQ87r16lHc",
+"lweGyOUqFM","RBhp0VerEA","iKqhrP6bcg","tAOsri7WMQ","lweGyvLsmS","jS1aj7lUXZ","5Mg9rdmoS7","Yf2Ec45cIH","uZPqg0h1b1","WMiS3WPmlx",
+"soy9twiHrZ","BGaQYydG8U","zmLYDydG8U","hE1QlQbxXc","uJScX5ZaEz","lkMUAW3VFH","OUqFMpmeCd","oVQp6FcWrW","xciqpogLgc","suY4x5Mg9r",
+"0MR5X9rlg9","QYxC0MGlTF","lweGygdQsS","QworuGrDg7","mz8gxzmLYD","jfREu8xEKz","bZLvSaez9y","OUqFM48cHL","i3pydgf8rI","CqqaDMkgy8",
+"5Drn0sqVrf","QWxoTHzZT8","55rfB55rfB","he9IABbwgA","Ta8f6fcwDa","FhtgleuZA5","oQ87rjSjS3","SWfouciuWz","v8yFNlXFOB","5VZjS9rlg9",
+"VIlwPpiJSk","MojnP0ao3l","16lHcNOHsz","Yw2oUqaofN","OHaBzVNCPd","In3NSD6rBy","M3zXLzz4ZU","wDajXFwEJz","OUqFMhUTw7","Mm8siWaWsv",
+"3otm6B3qem","gtCA5xciqp","QWxoTlm0pD","JKWYRTwano","fmIK1fLNg8","bgJAzRkQke","Zv7z0HfyNQ","zz4ZU4W0Tl","D6rByJkzUn","ru4UGMezSW",
+"yluBxDLhzM","5Nammni2v1","Uvlv4OUqFM","jSjS3lm0pD","Cfgr3RmDcr","i3pydFNYIM","5nmWvK4GS8","aFFss29QAz","RzaZAFPfSE","CxVEfHzZT8",
+"7fsYM0Wr5y","dQ586Ul4a1","Cfgr32hEEU","2Nslmhi5X7","StlDJ48cHL","uvf7ApAhR1","DQimpydG8U","uupzkCp3mZ","Zv7z07fsYM","07n1cNxx9V",
+"MmsIo0MR5X","S2DfucShY2","AIYUuM6qcG","RBhp0gf8rI","3weIFzz4ZU","Q6Lixi7WMQ","zFgtB8TxD7","RpBQm7ku1p","fmIK1L7cGc","gtCA5Z4I1v",
+"GXdoHPYBf4","ru4UGvOqCE","hYBCKVBjhz","prNT6I7p2a","FcWrW8U2nU","1v5hHCp3mZ","8xEKzhUTw7","aFFss5ZaEz","Waim68FmFH","Mkgy8S2Dfu",
+"JIqXi0ao3l","v1Hln1j5L8","gdQsSThjNn","MmsIogIYvE","he9IAWaim6","qaofN8cVD3","s7MxkW3VFH","fLNg8pT8wu","ni2v14QMc9","pmeCdHzZT8",
+"8FmFHRsQUq","HzZT8taOXK","Pb1pa3weIF","Fhtgl14FLR","gjUTul83Ud","zFgtBTCgPp","ru4UGS2Dfu","Zv7z08TxD7","BCxeCm4bxU","6AFT0suY4x",
+"tuDySKZamH","14FLRyEfy9","CIShGBFkb8","AOgEe4dEz6","ECMvU0ao3l","X6Pinhe9IA","16lHcxReec","uoStwtjQxs","aFFsslm0pD","k85AeB3qem",
+"07n1cFhtgl","zFgtBRsQUq","W3VFHpiJSk","Qworuv1Hln","rKDLJn8pJ9","7X3uy5ZaEz","OHaBzD6rBy","jS1aj9eoRc","S77LH0ao3l","BbwgAciuWz",
+"Mkgy8DcpWB","pv0i77ku1p","yofH3P6bcg","SbRYyFcWrW","e6e4zcmXIX","cL0aEU3yw5","Vprf2ZhwG1","6AFT0l83Ud","d7vjMXyPZN","ulk41uPX7G",
+"yEfy9FjHXR","uQIczMGlTF","v2eC32TRI7","24ARFfqypy","9eoRcAXpwE","WreyPjS1aj","n8pJ9Z4I1v","29QAztl72W","zY1GYAmdQd","JJs5m5VZjS"
+] } }
+}
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//sorted-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 20000,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//sorted-queue?durable='true'",
+ "_numberOfMessages": 20000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "queue-type:simple-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//simple-queue?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//simple-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 20000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//simple-queue?durable='true'",
+ "_numberOfMessages": 20000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "queue-type:priority-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//priority-queue?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-priorities": 10
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "priority": {"@def": "range", "_lower": 0, "_upper": 9, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//priority-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 20000,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//priority-queue?durable='true'",
+ "_numberOfMessages": 20000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/etc/testdefs/short/VaryingNumberOfParticipants.json b/qpid/java/perftests/etc/testdefs/short/VaryingNumberOfParticipants.json
new file mode 100644
index 0000000000..457b0bc348
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/short/VaryingNumberOfParticipants.json
@@ -0,0 +1,2981 @@
+{
+ "_tests":[
+ {
+ "_name": "Varying number of participants: 1 consumer - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Varying number of participants: 2 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Varying number of participants: 5 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 30000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/etc/testdefs/standard/AcknowledgementModes.json b/qpid/java/perftests/etc/testdefs/standard/AcknowledgementModes.json
new file mode 100644
index 0000000000..db68939a94
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/standard/AcknowledgementModes.json
@@ -0,0 +1,138 @@
+{
+ "_tests":[
+ {
+ "_name": "Acknowledgement Modes - NON_PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 10000000,
+ "_acknowledgeMode": 1,
+ "_deliveryMode": 1
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 2500000,
+ "_acknowledgeMode": 0,
+ "_deliveryMode": 1
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Acknowledgement Modes - PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 1000000,
+ "_acknowledgeMode": 1,
+ "_deliveryMode": 2
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 250000,
+ "_acknowledgeMode": 0,
+ "_deliveryMode": 2
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue?durable='true'",
+ "_durable" : "true"
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/etc/testdefs/standard/BatchSize.json b/qpid/java/perftests/etc/testdefs/standard/BatchSize.json
new file mode 100644
index 0000000000..309cd4d5ed
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/standard/BatchSize.json
@@ -0,0 +1,84 @@
+{
+ "_tests":[
+ {
+ "_name": "Batch Size- PERSISTENT";
+ "_iterations":[
+ {
+ "_batchSize": 1
+ },
+ {
+ "_batchSize": 2
+ },
+ {
+ "_batchSize": 5
+ },
+ {
+ "_batchSize": 10
+ },
+ {
+ "_batchSize": 20
+ },
+ {
+ "_batchSize": 50
+ },
+ {
+ "_batchSize": 100
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//batchSize?durable='true'",
+ "_durable" : true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//batchSize?durable='true'",
+ "_messageSize": 1024,
+ "_maximumDuration": 120000,
+ "_deliveryMode": 2
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//batchSize?durable='true'",
+ "_maximumDuration": 120000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/etc/testdefs/standard/MessageSize.json b/qpid/java/perftests/etc/testdefs/standard/MessageSize.json
new file mode 100644
index 0000000000..b679f81926
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/standard/MessageSize.json
@@ -0,0 +1,213 @@
+{
+ "_tests":[
+ {
+ "_name": "Message Size - 1P-1C - NON_PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 256,
+ "_numberOfMessages": 10000000
+ },
+ {
+ "_messageSize": 512,
+ "_numberOfMessages": 5000000
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": "2500000"
+ },
+ {
+ "_messageSize": 2048,
+ "_numberOfMessages": "1250000"
+ },
+ {
+ "_messageSize": 4096,
+ "_numberOfMessages": "625000"
+ },
+ {
+ "_messageSize": 8192,
+ "_numberOfMessages": 312500
+ },
+ {
+ "_messageSize": 16384,
+ "_numberOfMessages": 156250
+ },
+ {
+ "_messageSize": 32768,
+ "_numberOfMessages": 78125
+ },
+ {
+ "_messageSize": 65536,
+ "_numberOfMessages": 39062
+ },
+ {
+ "_messageSize": 131072,
+ "_numberOfMessages": 1953
+ },
+ {
+ "_messageSize": 262144,
+ "_numberOfMessages": 976
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//messageSize",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//messageSize",
+ "_deliveryMode": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//messageSize"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Message Size - 1P-1C - PERSISTENT";
+ "_iterations":[
+ {
+ "_messageSize": 256,
+ "_numberOfMessages": 200000
+ },
+ {
+ "_messageSize": 512,
+ "_numberOfMessages": 200000
+ },
+ {
+ "_messageSize": 1024,
+ "_numberOfMessages": 200000
+ },
+ {
+ "_messageSize": 2048,
+ "_numberOfMessages": 200000
+ },
+ {
+ "_messageSize": 4096,
+ "_numberOfMessages": 40000
+ },
+ {
+ "_messageSize": 8192,
+ "_numberOfMessages": 40000
+ },
+ {
+ "_messageSize": 16384,
+ "_numberOfMessages": 40000
+ },
+ {
+ "_messageSize": 32768,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 65536,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 131072,
+ "_numberOfMessages": 20000
+ },
+ {
+ "_messageSize": 262144,
+ "_numberOfMessages": 20000
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//messageSize?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//messageSize?durable='true'",
+ "_deliveryMode": 2
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//messageSize?durable='true'"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/etc/testdefs/standard/QueueTypes.json b/qpid/java/perftests/etc/testdefs/standard/QueueTypes.json
new file mode 100644
index 0000000000..479b3be9f1
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/standard/QueueTypes.json
@@ -0,0 +1,16205 @@
+{
+ "_tests":[
+ {
+ "_name": "queue-type:sorted-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//sorted-queue?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608,
+ "qpid.queue_sort_key": "sort-key"
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "sort-key": {"@def": "list", "_items": [
+"GWqqXCp3mZ","b29RJ45cIH","7hyVvgtCA5","16lHcCxVEf","jzUqRuPX7G","0Wr5y4QMc9","pWiOsLbRTH","Dz1R3BGaQY","Cfgr39y4lw","Zv7z0FxX9q",
+"lj07QxXTI4","RACuj9XyT9","MGlTF55rfB","0Wr5yW3VFH","lweGyVprf2","lpF6WuJScX","lCMxy2TRI7","KZamHl83Ud","5drc6jiVBP","rKDLJwDajX",
+"CK5W7MezSW","2TRI7LbRTH","zqH0WiwzGk","hYBCKUvlv4","Mkgy8Q6hMC","8FmFHjtn0X","8FmFH5Mg9r","hUTw7rz7Ut","pmeCdQnJ1S","euZA5dQ586",
+"sqVrfQWxoT","RsQUqTwano","7ku1ptlILt","jzUqRpiJSk","0YAGH5Drn0","7ku1pCxVEf","QbxXc8hJdt","4W0Tldpe1v","MK07Ys7Mxk","zHF1qCNHmv",
+"uoStwRzaZA","KZamHVLTy6","XyPZN5Drn0","7fKYU07n1c","HfyNQiwzGk","mX2GEoGu6x","9eoRcydG8U","pAhR1iKqhr","LbRTHb29RJ","Waim6DLhzM",
+"bgJAzReKEW","pmeCdjeskS","gdQsSguMb8","Oz8yZI7p2a","ogLgculk41","HfyNQ0MR5X","24ARFWDVWJ","uAWypwDajX","lH1kt6AFT0","EOE1oZhwG1",
+"AIYUu0Kyfs","prNT6uTacx","TwanoFPfSE","OUYuFAXpwE","euZA5FVMxo","ni2v10BmCy","5Mg9rJRJQB","nlaBya00b5","7X3uyL7cGc","ECMvU55rfB",
+"JXljW2TRI7","Z4I1vY1mC0","lj07QFhtgl","fqypycmXIX","Ul4a1GrDg7","LDk6fulk41","2Nslm2hEEU","LbRTHuTacx","gIYvEK4GS8","Cfgr3i7WMQ",
+"pWiOss4786","mX2GETCgPp","8xEKzjeskS","uTacxDQimp","ksJbyfFDrJ","7fKYUAOgEe","5Drn0azIWp","he9IAIKxdL","HfyNQTwano","FcWrW0ao3l",
+"iKqhrn8pJ9","BbwgArhl0J","M6qcGjiVBP","b29RJ8U2nU","MK07Y8cVD3","dhSuHjfREu","azIWpjS1aj","qQxHPTwano","QChxsJRJQB","YjB9tuZPqg",
+"FVMxoMmKGJ","JKWYRZUnqt","AIYUuhUTw7","U3yw5Cp3mZ","zz4ZUGXdoH","8hJdtBbwgA","Ul4a155rfB","oVQp6DLhzM","DG4sTfmIK1","zY1GYAXpwE",
+"M3zXLGrDg7","CK5W7jSjS3","fmIK1uTacx","OxWIHkB5nP","xXTI4BFkb8","OUYuFblLA9","RkQkeqaofN","YjB9tuTacx","uLtKsW7cTs","l83UdDcpWB",
+"brhlQRsQUq","GSQwjCIShG","GSQwjFwEJz","HlUbF2DREs","Mkgy8xReec","16lHcwDajX","MaJQs5IhmG","9iGoTdmoS7","DQimplpF6W","bgJAzVjCZq",
+"vLsmSwDajX","DG4sTciuWz","ECMvU48cHL","nlaByqaofN","QWxoTv1Hln","WaWsvqUJMd","F6PT28cVD3","lweGyLewvM","IRh48xciqp","9y4lw8U2nU",
+"2TRI7NOHsz","uAWypuTacx","FhtglcQOnv","bZLvS0PktI","v2eC3DcpWB","ReKEWksJby","ECMvUPOUYS","8RCUATa8f6","gjUTu0YAGH","FcWrWcmXIX",
+"QYxC0zQt6Q","MK07Y7fKYU","qQxHPoGu6x","faHirNo0Qb","aFFss0MR5X","RpBQmokgRi","IBe8kVerEA","OHaBzy94nw","0ao3lDLhzM","tuDySpT8wu",
+"jSjS3JJs5m","VerEA7Ow5C","5NammJXljW","gf8rIhi5X7","M3zXLRsQUq","K4GS8y94nw","aez9yvkCHH","uTacxix74r","RpBQmCqqaD","4dEz6L7cGc",
+"ix74rJKWYR","4W0TlNhXdu","VjCZqogLgc","45cIHNcICA","pT8wufqypy","nnP8odQ586","dpe1vGSQwj","2ZHdkvkCHH","zz4ZUhe9IA","nnP8oCqqaD",
+"vLsmSYw2oU","4QMc9GSQwj","yluBxOz8yZ","0ao3lsqVrf","K20wKCK5W7","fcwDa8FmFH","GWqqXX6Pin","faHird7vjM","RBhp0ZzJHW","EOE1owDajX",
+"QssNC0Kyfs","iqv4kCp3mZ","4W0TlMkgy8","aDGtSdhSuH","uQIcz5Drn0","1v5hHUmaEv","pAhR1MmKGJ","2Yz7EQWxoT","nFqikKASQ8","ZJTXHpT8wu",
+"5iGN5MojnP","gf8rIsuY4x","l83UdHzZT8","uoStwtAOsr","wDajXzFgtB","mz8gxAOgEe","dhSuHMm8si","ZzJHW6q6L9","FjHXRuPX7G","8cVD3MmsIo",
+"Pb1pagdQsS","m4bxUuAWyp","4QMc9suY4x","nnP8ouZPqg","7X3uynFqik","FnPFBRxrsm","Waim6NcICA","KASQ8JIqXi","s7MxkguMb8","KASQ8AkKTk",
+"fFDrJtuDyS","l83UdD6rBy","ZhwG1dmoS7","7ku1pnnP8o","uPX7GpFrrl","7ku1p4W0Tl","zmLYDQbxXc","zY1GYPb1pa","x3LDe3weIF","zbIYYKsjRK",
+"7Ow5COHaBz","dhSuHJJs5m","RzaZAZhwG1","HRxd8DQimp","IjTwPCK5W7","AOgEelpF6W","8FmFHn1pmO","e6e4z0Kyfs","blLA95nmWv","s4786LbRTH",
+"VBjhzuPX7G","WPmlx7Ow5C","soy9tK4GS8","qaofNfcwDa","iB08lOHaBz","4W0Tl0MR5X","FLsphNo0Qb","kZANmZJTXH","fmIK19iGoT","zFgtB7fsYM",
+"tlILtKZamH","zHF1qvkCHH","HzZT8O3iyQ","i3pydMkgy8","GXdoHy94nw","HlUbFyToGW","e6e4za00b5","aDGtSi3pyd","ZJTXHjzUqR","pAhR1FNYIM",
+"5Mg9rhUTw7","QWxoTL7cGc","aFFssfcwDa","GSQwjni2v1","Vprf2Nxx9V","7ku1peuZA5","MaJQsokgRi","DcpWBQ6hMC","HlUbFM6qcG","iqv4kKr8ys",
+"hi5X7cL0aE","fLNg8Nxx9V","zHF1qQbxXc","Yf2EcB3qem","gIYvEQWxoT","CIShGlViBv","8xEKzBCxeC","UmaEvh1zcH","ogLgcfcJOy","ZUnqtGSQwj",
+"2hEEUzQt6Q","rKDLJTXQ0Z","MmsIoru4UG","mz8gxOxWIH","zFgtBhYBCK","bZLvSqUJMd","hi5X7lsQGo","hSSvQs4786","SjskQoGu6x","07n1cJ2mQi",
+"hYBCKjeskS","Chuy324ARF","s4786UlU3M","AkKTkBFkb8","W3VFHulk41","tl72W7fsYM","ZhwG1Rxrsm","K4GS8YOfrY","0PktIxciqp","9rlg90h1b1",
+"Pb1paAgJHQ","WmadAsx5Gl","GWqqXnFqik","QnJ1SFcWrW","XyPZNNo0Qb","9rlg9TXQ0Z","4dEz6oQ87r","WaWsvZ4I1v","7hyVv4dEz6","a00b5TXQ0Z",
+"iqv4kblLA9","pv0i7ciuWz","9GXkXsx5Gl","Yh1hFyEfy9","SWfouQssNC","5NammlsQGo","ciuWzJKWYR","RmDcrWmadA","s47862ZHdk","RACujo8Uyd",
+"hYBCKm4bxU","l83UdMaJQs","9rlg9Qworu","J2mQiTa8f6","jzUqR7ku1p","64s8NSmGzv","ZhwG1NOHsz","fFDrJuoStw","Chuy3RACuj","aL6AJ5drc6",
+"hYBCKS2Dfu","OHaBzJXljW","djsrv0ao3l","zz4ZUsqVrf","TXQ0ZIBe8k","lViBv2Yz7E","cQOnvMm8si","aL6AJLDk6f","ThjNnru4UG","14FLRo8Uyd",
+"pv0i7rz7Ut","tlILtCIShG","WMiS37fKYU","xXTI4b29RJ","8FmFHThjNn","8cVD34QMc9","8xEKzqaofN","Oz8yZs93Ml","tjQxsJRJQB","Chuy3TCgPp",
+"P6bcgfmIK1","OUYuFI7p2a","tlILtQssNC","k85Aem4bxU","RpBQm7lUXZ","StlDJyvOMI","DcpWBFxX9q","iwzGk0ao3l","KASQ8BbwgA","gdQsS45cIH",
+"bZLvSpWiOs","RACujGrDg7","tuDySZv7z0","d85a9Pb1pa","0BmCyQWxoT","ECMvUs93Ml","CIShGmX2GE","uupzktAOsr","1LB1Lgf8rI","24ARFbgJAz",
+"HRxd8hi5X7","1v5hHyluBx","RACujWreyP","vLsmS0ao3l","BFkb8uTacx","7lUXZVjCZq","RACujSbRYy","K20wK1v5hH","uPX7GUvlv4","tvdkDOHaBz",
+"dpe1vKr8ys","5NammJ2mQi","aDGtSQClRL","M6qcGRzaZA","WMiS3SWfou","0KyfsSmGzv","P6bcg0Wr5y","pvgjSfLNg8","RpBQmCK5W7","gf8rIFxX9q",
+"sqVrf8FmFH","lpF6Wzz4ZU","AOgEeTwano","7lUXZNhXdu","64s8NJIqXi","ni2v1d85a9","2DREscQOnv","Mm8silm0pD","xXTI4MK07Y","Q6Lix9XyT9",
+"64s8NG1RhS","RkQkevOqCE","zz4ZUpv0i7","QnJ1SBpYhV","a00b5IKxdL","BpYhV8xEKz","s7MxkPYBf4","ThjNn5Drn0","jfREu7Ow5C","cShY2VjCZq",
+"M3zXLtAOsr","ru4UGRzaZA","5NammF6PT2","CNHmvtjQxs","MmsIoFxX9q","fqypyWPmlx","K20wKMaJQs","7lUXZ0h1b1","sx5Gln1pmO","ZhwG14QMc9",
+"45cIHUvlv4","i3pyd8U2nU","RmDcrXyPZN","Nxx9Ve6e4z","uPX7GO3iyQ","5VZjSbZLvS","jS1ajh1zcH","0Kyfs5iGN5","7X3uyn8pJ9","3weIFOHaBz",
+"IjTwPIRh48","CdyBV1v5hH","hi5X72Nslm","atef2KsjRK","K20wKMmKGJ","nnP8o4QMc9","7ku1pcShY2","Mm8siGv3Fq","dhSuHrz7Ut","5drc6IjTwP",
+"lkMUAjzUqR","lweGyiKqhr","7Ow5Czz4ZU","AmdQdCfgr3","aFFssL7cGc","P6bcggjUTu","s7MxkY1mC0","FVMxoQbxXc","uPX7GblLA9","BFkb8jeskS",
+"8FmFHt59lR","hi5X7pv0i7","DQimpuvf7A","MezSWHlUbF","9y4lw2Yz7E","QssNC2TRI7","HzZT8EOE1o","Ta8f65drc6","WMiS35VZjS","LDk6fGSQwj",
+"uTacxgjUTu","n8pJ9L7cGc","fcJOyQYxC0","8RCUApFrrl","azIWpReKEW","uN6r3Chuy3","CNHmvL7cGc","jzUqR2Nslm","uPX7GGv3Fq","CqqaDlkMUA",
+"zY1GYSbRYy","AgJHQMGlTF","0PktIpT8wu","RxrsmU3yw5","yvOMI6q6L9","Kr8ysStlDJ","QClRLsqVrf","2Yz7EyofH3","7Ow5CprNT6","IKxdLTa8f6",
+"n8pJ92TRI7","qUJMdvOqCE","jSjS3pT8wu","S2DfusuY4x","AXpwEAgJHQ","1j5L8ZhwG1","uAWyp2Nslm","IRh488FmFH","dmoS7VLTy6","CNHmvECMvU",
+"RACujhUTw7","Uvlv4ix74r","Gv3FqaL6AJ","Waim6DG4sT","QYxC0gdQsS","3weIFzY1GY","pvgjSCfgr3","ZJTXHlj07Q","2hEEU29QAz","Cfgr3s93Ml",
+"wiHrZMmKGJ","XyPZNMaJQs","zbIYYNOHsz","brhlQECMvU","J2mQilweGy","fqypyOxWIH","BbwgAyofH3","W3VFHrKDLJ","sx5Gl2TRI7","AXpwE8TxD7",
+"I7p2anlaBy","NhXduqQxHP","fcJOy4QMc9","SWfouKZamH","GSQwjuoStw","fmIK17X3uy","tAOsrQ6hMC","k85Ae45cIH","Y1mC0uQIcz","zbIYY8FmFH",
+"uZPqg3weIF","8TxD7OHaBz","pmeCd4W0Tl","WaWsv0Wr5y","IRh482TRI7","nlaByvLsmS","hSSvQdpe1v","hi5X7xciqp","tl72WAIYUu","OUqFM9rlg9",
+"VBjhzQ6Lix","Cp3mZSWfou","5drc6ksJby","faHirMmsIo","fFDrJvLsmS","ReKEWfqypy","QWxoTGrDg7","2DREsRpBQm","WaWsvZv7z0","8U2nU3weIF",
+"Rxrsmv2eC3","7X3uyaez9y","0MR5XJJs5m","5IhmGdQ586","BpYhVoQ87r","8FmFH8xEKz","ZUnqtqaofN","45cIHlH1kt","48cHLhUTw7","LewvMnnP8o",
+"CNHmvHzZT8","WMiS39iGoT","QChxsjfREu","RmDcr5iGN5","4dEz68RCUA","64s8NOz8yZ","yluBxuoStw","7hyVvWPmlx","FLsphprNT6","ogLgchE1Ql",
+"uPX7G2TRI7","M6qcGv1Hln","n8pJ9t59lR","cmXIXaL6AJ","1j5L8ni2v1","zz4ZUJKWYR","VBjhzru4UG","oVQp6CNHmv","lViBvTXQ0Z","Pb1paGrDg7",
+"FjHXRFjHXR","yEfy9MmsIo","hE1QlJRJQB","xXTI407n1c","8FmFHtaOXK","fqypyReKEW","AXpwEVprf2","RBhp0ECMvU","Chuy3K4GS8","nFqikTa8f6",
+"lkMUARxrsm","a00b5ulk41","64s8NciuWz","IKxdLHfyNQ","2Nslmt59lR","5drc6580YD","uupzk0h1b1","7fsYMdjsrv","CdyBVoQ87r","Yh1hFMezSW",
+"prNT6hE1Ql","Yh1hFSWfou","CIShGG1RhS","2Yz7EJkzUn","zHF1qZUnqt","xXTI4tjQxs","ZzJHWCxVEf","I7p2akB5nP","2NslmMkgy8","KsjRKVLTy6",
+"TXQ0ZFwEJz","HlUbFazIWp","M3zXLs4786","VerEAzFgtB","VNCPdJIqXi","Pb1pafLNg8","8TxD74QMc9","gIYvEv8yFN","FNYIMgIYvE","YOfrYd7vjM",
+"9rlg914FLR","zFgtBC2Irc","4QMc9D6rBy","uLtKsQssNC","Yw2oUWreyP","WaWsvFhtgl","MGlTFdjsrv","tlILtLDk6f","QClRLhSSvQ","QssNCaL6AJ",
+"fcJOy2ZHdk","d85a9RBhp0","lpF6W7fKYU","qUJMdlXFOB","JIqXidpe1v","45cIHCxVEf","t59lR0Wr5y","zFgtBhe9IA","uLtKsCfgr3","YOfrYReKEW",
+"AgJHQhE1Ql","2ZHdk6q6L9","AgJHQChuy3","RACujuAWyp","Yw2oUDz1R3","pAhR1HfyNQ","jeskSaDGtS","CK5W7Dz1R3","3otm6blLA9","X6PinKASQ8",
+"aez9ygIYvE","K20wKhi5X7","suY4xiKqhr","s4786Z4I1v","gIYvEydG8U","AmdQdQ6hMC","gjUTuAXpwE","FPfSEW3VFH","bgJAzatef2","gf8rIO3iyQ",
+"gtCA5blLA9","FVMxoVjCZq","7hyVvfLNg8","zqH0WC2Irc","yEfy9lweGy","JXljWDQimp","wDajXGXdoH","s93MlFwEJz","G1RhS618Di","l83Ud5IhmG",
+"45cIHzFgtB","8RCUAlsQGo","ni2v11LB1L","yvOMI2Yz7E","zz4ZUnnP8o","L7cGcRsQUq","v8yFNdhSuH","5IhmGzz4ZU","yvOMIo8Uyd","Cp3mZS77LH",
+"zz4ZUGSQwj","P6bcgIjTwP","hYBCKDQimp","8cVD3SjskQ","EoToP64s8N","6q6L9QbxXc","wiHrZqaofN","cmXIXxXTI4","3otm6zqH0W","24ARFulk41",
+"VLTy6cShY2","soy9tOHaBz","StlDJ2Nslm","AkKTkwiHrZ","VerEAyEfy9","HfyNQCK5W7","cShY2M6qcG","bZLvSXyPZN","J2mQiWmadA","0ao3lRxrsm",
+"QChxs4dEz6","0ao3lhi5X7","yvOMITa8f6","hSSvQMmKGJ","OHaBzFNYIM","16lHcy94nw","1LB1L8hJdt","SbRYyWmadA","MGlTFKZamH","rKDLJGWqqX",
+"IjTwPdjsrv","EOE1oHP433","Gv3FqZzJHW","RsQUqfLNg8","G1RhS5ZaEz","JKWYR7fKYU","JXljWTa8f6","FPfSEo8Uyd","4QMc9yToGW","HfyNQM6qcG",
+"S77LHFPfSE","fqypyvkCHH","tuDySfFDrJ","gf8rIuQIcz","Oz8yZFNYIM","FGzgpyToGW","8hJdtKr8ys","pAhR1618Di","pmeCdfFDrJ","AkKTkhUTw7",
+"0MR5XoQ87r","RACujs93Ml","dQ586kB5nP","uoStwYOfrY","UmaEvUlU3M","9GXkXxReec","pv0i7tjQxs","OUqFMQssNC","FnPFBuAWyp","WreyPiKqhr",
+"aFFssUlU3M","dhSuHS77LH","vkCHHFNYIM","Oz8yZG1RhS","C2Irc6AFT0","2ZHdkzbIYY","BpYhVTwano","Mkgy8yEfy9","PYBf4RsQUq","FxX9qlpF6W",
+"WaWsvjfREu","M3zXLU3yw5","VjCZqfcJOy","mz8gxIKxdL","WPmlxCNHmv","1v5hHzqH0W","v1HlnjzUqR","G1RhSNo0Qb","Yh1hFNo0Qb","6AFT0ksJby",
+"dhSuHAOgEe","pv0i7JXljW","djsrv29QAz","D6rByix74r","M6qcG4W0Tl","ThjNneuZA5","5drc6S77LH","TXQ0ZfcJOy","UlU3MgIYvE","ReKEW16lHc",
+"lXFOBSmGzv","aL6AJMGlTF","Yf2Ec7fKYU","0MR5XvLsmS","HzZT8NAFuw","gdQsSIRh48","TXQ0ZAOgEe","HfyNQQWxoT","2TRI7aFFss","xXTI4ReKEW",
+"2Yz7EpT8wu","Ta8f6lXFOB","blLA9pFrrl","0h1b1WMiS3","ThjNnAmdQd","FnPFBsoy9t","hUTw7M3zXL","ksJbyZUnqt","taOXKVIlwP","XflUqtlILt",
+"BpYhVpmeCd","zHF1q5IhmG","gdQsSZzJHW","uAWypYh1hF","BCxeCTXQ0Z","yluBxPOUYS","nnP8oaL6AJ","qQxHPFnPFB","VNCPdcL0aE","s93Ml5VZjS",
+"zHF1qIn3NS","jeskSTXQ0Z","v2eC3sqVrf","uAWyp8hJdt","lXFOB5Drn0","OHaBzAXpwE","uTacxGSQwj","Dz1R3VLTy6","zHF1qulk41","EdBKcRpBQm",
+"Gv3Fq5nmWv","Y1mC01j5L8","45cIHfcJOy","ZJTXHuJScX","bZLvSThjNn","3weIF9XyT9","qQxHPHRxd8","55rfBXyPZN","DG4sTXyPZN","suY4xxXTI4",
+"cL0aEjS1aj","pFrrlAXpwE","uoStwlH1kt","vOqCEaL6AJ","RmDcrfLNg8","suY4xZv7z0","TCgPptuDyS","JJs5m45cIH","F6PT2Ul4a1","B3qem8U2nU",
+"K20wK6q6L9","brhlQWaWsv","FjHXRJJs5m","gf8rI3weIF","BGaQY7fKYU","NhXdu7lUXZ","3weIFSmGzv","Cfgr3FVMxo","LewvMlsQGo","55rfBW7cTs",
+"qaofNQ6hMC","NhXduFnPFB","iwzGkhE1Ql","M6qcGPYBf4","XyPZNVjCZq","S2DfuAgJHQ","vLsmS9GXkX","X6PinVprf2","B3qemMezSW","MmKGJKsjRK",
+"FNYIMDLhzM","U3yw5dpe1v","FFDuiFcWrW","JkzUniB08l","azIWpS2Dfu","0KyfsuTacx","lXFOBfaHir","VerEA7fsYM","StlDJQWxoT","brhlQ5Mg9r",
+"CqqaDFxX9q","4dEz6dQ586","nnP8oFjHXR","CNHmvI7p2a","LewvMazIWp","qaofNVNCPd","KsjRKdjsrv","GXdoHJIqXi","aDGtSFcWrW","RkQkepAhR1",
+"RkQkeGWqqX","F6PT229QAz","JKWYRuJScX","v1HlnguMb8","FVMxot59lR","oQ87rrhl0J","WaWsv7Ow5C","Q6hMClweGy","POUYSbgJAz","16lHcRsQUq",
+"qQxHPWaim6","lViBvRpBQm","G1RhS8TxD7","0PktIBpYhV","CIShG2DREs","2ZHdk24ARF","Yh1hFv1Hln","CdyBVxciqp","jiVBPuQIcz","v8yFNPOUYS",
+"OUqFMazIWp","RpBQm5nmWv","6AFT0JJs5m","VBjhz5Drn0","O3iyQSs0Zu","JJs5mRkQke","yvOMIQChxs","fmIK1Yh1hF","LbRTHXflUq","4W0TlqQxHP",
+"ulk41I7p2a","UlU3MtvdkD","5IhmGIjTwP","ciuWzFGzgp","0KyfsxXTI4","580YD2TRI7","tjQxspiJSk","lm0pDrKDLJ","14FLR8hJdt","29QAzWMiS3",
+"t59lRMGlTF","14FLRrz7Ut","lm0pDUl4a1","X6PinCp3mZ","7ku1pAmdQd","48cHLix74r","aL6AJaez9y","t98iWkB5nP","ru4UG2Yz7E","In3NShYBCK",
+"S2DfuQssNC","uLtKsuN6r3","G1RhSsx5Gl","618DiWPmlx","2ZHdkRpBQm","AOgEeIBe8k","lj07QVprf2","TXQ0ZJkzUn","CK5W7zmLYD","AOgEeaFFss",
+"StlDJJIqXi","VjCZqWDVWJ","W7cTsGSQwj","580YDMmKGJ","TwanoS2Dfu","lH1ktRzaZA","uupzko8Uyd","k85AeguMb8","64s8NNcICA","VLTy6uTacx",
+"oVQp67lUXZ","Zv7z0Q6hMC","Q6LixLDk6f","9rlg92Yz7E","ulk41ydG8U","JKWYRQWxoT","ciuWzaFFss","7fKYUQClRL","8FmFH0h1b1","4W0TlMezSW",
+"euZA5gjUTu","lViBv07n1c","uPX7GGXdoH","VjCZq0MR5X","6q6L9nFqik","K20wKHRxd8","580YDIBe8k","aFFss8TxD7","RpBQmHP433","5Drn0gdQsS",
+"5ZaEz9eoRc","fmIK1M3zXL","tAOsruTacx","K20wK8TxD7","48cHL9eoRc","tvdkDzFgtB","Waim6wiHrZ","SjskQWreyP","cQOnvn8pJ9","dQ586AIYUu",
+"SjskQguMb8","hYBCK5Mg9r","ogLgcFNYIM","Chuy3Ss0Zu","580YDReKEW","jzUqRDcpWB","Z4I1vyEfy9","Cfgr3MmsIo","HRxd88RCUA","FnPFBqUJMd",
+"MGlTFBCxeC","NOHszrz7Ut","M6qcGtvdkD","RzaZATwano","s93MlogLgc","tl72WZUnqt","Mkgy8Qworu","m4bxU5Namm","jeskScmXIX","cL0aE5VZjS",
+"FwEJzNOHsz","jS1ajYf2Ec","gtCA5MmKGJ","fFDrJZzJHW","QWxoT24ARF","pT8wuuJScX","5ZaEzxXTI4","QnJ1SY1mC0","cQOnvAkKTk","Ta8f6fqypy",
+"uoStwCxVEf","SbRYytAOsr","MaJQscmXIX","G1RhS2Nslm","okgRiHRxd8","16lHcuN6r3","b29RJ8FmFH","POUYS4QMc9","IKxdLi7WMQ","pvgjSnnP8o",
+"Ss0ZuuAWyp","t59lRiKqhr","0YAGHCp3mZ","WPmlxzbIYY","n8pJ9gjUTu","jSjS3zQt6Q","aez9yFVMxo","pmeCdvkCHH","jiVBP9eoRc","5Mg9r5Drn0",
+"djsrvTa8f6","v1Hln8FmFH","e6e4zZ4I1v","GSQwjBGaQY","fqypyYh1hF","RBhp0aFFss","QChxsnlaBy","gjUTuxciqp","MojnPuLtKs","SWfou8cVD3",
+"HP433HfyNQ","uupzkMezSW","Yf2Ec7hyVv","lkMUAzY1GY","oVQp6MojnP","CK5W7WMiS3","lsQGoKr8ys","v1HlnL7cGc","S2DfucmXIX","Yf2EcpAhR1",
+"v1Hln7hyVv","vkCHHzQt6Q","a00b5RzaZA","StlDJNxx9V","AXpwEHRxd8","OUqFMgtCA5","tuDySaez9y","P6bcgWDVWJ","Chuy3S2Dfu","BpYhVguMb8",
+"cmXIX8hJdt","BGaQYP6bcg","S2DfuydG8U","i7WMQYjB9t","L7cGcFPfSE","cQOnv0Kyfs","t59lRcL0aE","uQIczdpe1v","FLsph7ku1p","CNHmvWDVWJ",
+"EOE1ojS1aj","0BmCymX2GE","TXQ0ZokgRi","lkMUAWDVWJ","3otm6M3zXL","RmDcrPOUYS","AkKTkoGu6x","S2Dfu5Namm","qUJMdAIYUu","soy9tQbxXc",
+"BpYhVDQimp","NcICAyluBx","l83UdYf2Ec","K20wKKZamH","WaWsv0PktI","uJScX9XyT9","HP433tuDyS","dpe1vaDGtS","LDk6f16lHc","oGu6xx3LDe",
+"lm0pDDcpWB","fcwDajS1aj","ru4UGCNHmv","MezSWaez9y","0YAGHHRxd8","5NammfFDrJ","FNYIMBbwgA","faHirWPmlx","ydG8U580YD","tjQxsEdBKc",
+"gjUTucShY2","ydG8UAXpwE","bZLvSIRh48","AgJHQs93Ml","CK5W70MR5X","iKqhrtl72W","MK07YFFDui","ZUnqtbZLvS","GXdoHFnPFB","lkMUAHzZT8",
+"tl72WChuy3","Dz1R3iB08l","uLtKsNhXdu","AXpwEMGlTF","ZJTXHEOE1o","Kr8ysRmDcr","OUYuFWDVWJ","48cHLtl72W","UlU3M2ZHdk","Z4I1vd7vjM",
+"4QMc9K4GS8","SbRYyChuy3","WreyPAmdQd","IKxdL8U2nU","Cfgr3jzUqR","vOqCEguMb8","uQIczn8pJ9","VLTy6xReec","pvgjSYh1hF","kZANmjiVBP",
+"MezSWMmsIo","IKxdLfcJOy","cQOnveuZA5","hi5X7pWiOs","ksJbyKr8ys","uAWypulk41","AIYUuoGu6x","JIqXi0MR5X","5drc6W3VFH","pmeCdtAOsr",
+"yluBxTa8f6","FFDuilH1kt","48cHLuJScX","S2Dfux3LDe","5ZaEzCxVEf","h1zcHCqqaD","jfREufmIK1","s4786ZUnqt","wDajXAIYUu","Qworu2TRI7",
+"5VZjSzmLYD","618DituDyS","tAOsrpiJSk","RkQkePYBf4","RxrsmPOUYS","NhXdumz8gx","kZANmDG4sT","AmdQdlsQGo","QYxC0soy9t","9XyT9he9IA",
+"3otm6ZzJHW","aez9yRACuj","v2eC3iwzGk","lViBvNcICA","lXFOBazIWp","brhlQLewvM","SbRYycQOnv","ZzJHWtAOsr","soy9tuPX7G","0YAGHo8Uyd",
+"zFgtBSs0Zu","h1zcHECMvU","ru4UG5nmWv","AgJHQK4GS8","jtn0XzFgtB","AOgEeW7cTs","Ss0Zu2hEEU","IBe8kReKEW","SWfouEoToP","hSSvQlViBv",
+"euZA5K4GS8","1j5L8lweGy","Q6LixQworu","azIWpazIWp","uQIczVIlwP","okgRiCIShG","YOfrYYf2Ec","PYBf455rfB","nFqikGv3Fq","7lUXZpmeCd",
+"EdBKctvdkD","Mkgy8tlILt","VerEAiwzGk","gdQsSaDGtS","W7cTsbrhlQ","yEfy9wDajX","Dz1R3LbRTH","ksJbyNxx9V","DG4sTYf2Ec","5NammPYBf4",
+"64s8NYh1hF","fcwDaGrDg7","9y4lwni2v1","5nmWv2ZHdk","X6PinvLsmS","sqVrfKASQ8","9rlg97fsYM","DLhzMkB5nP","s7Mxkmz8gx","jtn0X5ZaEz",
+"GSQwjqUJMd","5iGN5NOHsz","yofH3jtn0X","xXTI4HfyNQ","qQxHPS2Dfu","pv0i7Q6Lix","iKqhr7ku1p","3otm6rhl0J","FPfSEZzJHW","Cfgr3ksJby",
+"brhlQ5nmWv","Q6LixCK5W7","lkMUAS2Dfu","BFkb8cQOnv","S2DfuYw2oU","OUqFMQ6hMC","5IhmGvLsmS","Ta8f65ZaEz","sx5GlQssNC","m4bxU7lUXZ",
+"NOHszZuDtD","lH1kt5Namm","kZANmS2Dfu","cShY2FjHXR","ZzJHWpiJSk","FPfSEl83Ud","LewvMlpF6W","ZhwG15nmWv","hi5X7VLTy6","s4786LDk6f",
+"dpe1vQClRL","yofH3JKWYR","iKqhrVLTy6","BGaQYCIShG","ciuWz5Namm","MojnPVerEA","pFrrlbZLvS","VerEA8hJdt","hi5X77ku1p","O3iyQY1mC0",
+"JkzUn48cHL","nFqikCdyBV","48cHLlsQGo","lH1ktzHF1q","FFDuiSjskQ","nnP8oiwzGk","1v5hHaFFss","55rfBvOqCE","Ss0ZuHRxd8","O3iyQ48cHL",
+"faHirfLNg8","Mkgy8FnPFB","8FmFHFVMxo","RxrsmcL0aE","fLNg8gf8rI","MezSWWaim6","okgRiTCgPp","YjB9t7hyVv","7lUXZS77LH","Rxrsmsx5Gl",
+"a00b5xReec","h1zcHoVQp6","QworuHlUbF","xXTI4ix74r","n8pJ9okgRi","h1zcHqUJMd","ciuWzd7vjM","wDajXVIlwP","J2mQigdQsS","SjskQiwzGk",
+"fcwDablLA9","ZUnqtaFFss","lCMxyzHF1q","AgJHQJkzUn","ZUnqtQClRL","gIYvEtvdkD","taOXKydG8U","RxrsmvkCHH","k85AejiVBP","WDVWJ6AFT0",
+"CIShGOUYuF","aFFsshi5X7","taOXKjzUqR","M3zXLHP433","WMiS3wiHrZ","xXTI47fKYU","QworuZUnqt","aL6AJFPfSE","yToGWRkQke","HzZT8oGu6x",
+"IBe8kMojnP","o8Uyd7hyVv","BGaQYvOqCE","vOqCERsQUq","HRxd8HfyNQ","soy9tRBhp0","ksJbysqVrf","wDajX7fsYM","J2mQiTXQ0Z","uvf7AMK07Y",
+"AXpwEyToGW","YjB9tyofH3","LbRTHCxVEf","cQOnvqUJMd","Yf2Ecsx5Gl","5drc66AFT0","XyPZN9XyT9","5Mg9rFGzgp","BFkb8K4GS8","blLA9FNYIM",
+"oVQp67X3uy","jSjS307n1c","HzZT8lm0pD","Cp3mZKZamH","SbRYyBbwgA","n1pmOfqypy","vLsmSni2v1","5drc6L7cGc","he9IA1LB1L","aez9y0Wr5y",
+"5Mg9r24ARF","FGzgp2hEEU","OxWIHRBhp0","aFFssStlDJ","FLsphyToGW","1LB1LAkKTk","uAWypRxrsm","azIWpLDk6f","DQimptl72W","LewvM8RCUA",
+"gIYvEYw2oU","X6PinNcICA","PYBf4iwzGk","jSjS38U2nU","JIqXipvgjS","XyPZNtl72W","UmaEvrKDLJ","uvf7A1LB1L","0YAGHAkKTk","k85AeQssNC",
+"FLsphYjB9t","hYBCKuZPqg","azIWpt98iW","wDajXgdQsS","Mkgy8dmoS7","gtCA5OHaBz","pmeCd45cIH","wDajXfaHir","TXQ0ZOUqFM","K4GS8ru4UG",
+"W3VFHfLNg8","oGu6x45cIH","hSSvQHlUbF","y94nwkZANm","0YAGHoGu6x","M6qcGMmsIo","uPX7GJRJQB","MGlTFlViBv","CNHmv0PktI","iKqhrEOE1o",
+"cQOnvfFDrJ","JXljWMezSW","iqv4kyvOMI","CIShG5IhmG","ru4UGNxx9V","lj07Q7Ow5C","HlUbFZv7z0","Z4I1vyToGW","hE1QlfcJOy","DG4sTgdQsS",
+"CK5W7S2Dfu","Waim6HRxd8","lH1ktTCgPp","Yf2EcgdQsS","5nmWvYOfrY","EdBKcWreyP","bZLvSd7vjM","1j5L88cVD3","lCMxyoVQp6","9XyT90PktI",
+"4dEz6zqH0W","Cp3mZ2DREs","TwanoW3VFH","9XyT907n1c","jzUqRe6e4z","nFqik5drc6","7lUXZEOE1o","2DREshE1Ql","RkQkegf8rI","t98iWAgJHQ",
+"pAhR1LewvM","dmoS7NcICA","9iGoTrz7Ut","gIYvEatef2","FLsphIjTwP","gf8rIk85Ae","K20wKd7vjM","b29RJRpBQm","wiHrZpWiOs","L7cGcM6qcG",
+"oGu6xyofH3","CxVEf48cHL","StlDJP6bcg","Cfgr3GWqqX","pmeCd7fKYU","PYBf4yluBx","RBhp0piJSk","AgJHQCxVEf","ydG8UuAWyp","0YAGHn1pmO",
+"VLTy6EOE1o","Gv3FqzFgtB","WDVWJqQxHP","atef2gtCA5","pT8wu9rlg9","dpe1vDQimp","mz8gxs93Ml","5Drn07ku1p","t98iWwiHrZ","5iGN5PYBf4",
+"29QAzgtCA5","L7cGcNhXdu","618DiDLhzM","Oz8yZWmadA","a00b5JJs5m","cmXIX9XyT9","L7cGcrKDLJ","Zv7z00YAGH","lm0pDn1pmO","EOE1omX2GE",
+"Oz8yZn8pJ9","t59lRlH1kt","mX2GEOUqFM","7hyVvVjCZq","7ku1pn8pJ9","I7p2aRsQUq","Gv3Fqsoy9t","FPfSEiKqhr","uJScXuJScX","9iGoT0Kyfs",
+"zbIYYL7cGc","2hEEUAmdQd","55rfB7lUXZ","jzUqRYjB9t","8xEKzogLgc","BCxeC5Namm","WaWsvZzJHW","GrDg7HzZT8","3weIFMmsIo","rz7Ut0h1b1",
+"Nxx9Vd85a9","8FmFHYOfrY","Ta8f6ix74r","FhtgllXFOB","0BmCypT8wu","HfyNQ7fsYM","pvgjSuupzk","9rlg9FPfSE","sqVrfCNHmv","fLNg8jSjS3",
+"W7cTsL7cGc","07n1cWreyP","yToGWaFFss","okgRiWMiS3","0MR5X45cIH","StlDJoVQp6","pT8wuP6bcg","oQ87rjzUqR","UlU3Mlm0pD","fcJOyyvOMI",
+"azIWp29QAz","0KyfsVIlwP","9y4lwlsQGo","uLtKsiwzGk","0ao3leuZA5","7ku1pKsjRK","QChxszqH0W","VBjhzi3pyd","9XyT9okgRi","RkQkeNAFuw",
+"HRxd8VBjhz","suY4xn1pmO","ciuWzC2Irc","RpBQm07n1c","WPmlxZJTXH","sqVrfCK5W7","jzUqRsqVrf","FnPFBfaHir","hYBCKqUJMd","MaJQs5ZaEz",
+"5nmWvJKWYR","x3LDeWmadA","TwanonlaBy","1j5L8i3pyd","FhtglpFrrl","jiVBPk85Ae","FFDuitaOXK","v2eC3lCMxy","FhtglcShY2","y94nwjzUqR",
+"SbRYySjskQ","AmdQdciuWz","QnJ1SfmIK1","lH1ktv1Hln","pv0i7618Di","i3pydYOfrY","uJScXv1Hln","QChxsaez9y","M6qcGJXljW","6AFT0ogLgc",
+"qaofN2TRI7","pAhR12ZHdk","kB5nP1j5L8","XyPZNbrhlQ","Dz1R39iGoT","tlILtoGu6x","fqypy9rlg9","iwzGkpmeCd","ogLgcpmeCd","KsjRKfcJOy",
+"zqH0WcmXIX","B3qemVIlwP","djsrvZ4I1v","xXTI4ydG8U","pmeCdKZamH","ix74ruLtKs","uvf7AFVMxo","16lHc5drc6","aFFssWPmlx","euZA5G1RhS",
+"2ZHdk8xEKz","iB08l1j5L8","yToGWQssNC","FNYIMB3qem","ksJbyAIYUu","Q6LixZhwG1","djsrvNo0Qb","Mm8siAOgEe","aL6AJtvdkD","lXFOBtaOXK",
+"qQxHP0MR5X","FnPFBWaWsv","NcICAksJby","D6rByWMiS3","Ta8f6uZPqg","MK07Y07n1c","1v5hHb29RJ","dQ586n8pJ9","M3zXLHRxd8","UlU3MQ6hMC",
+"nlaByPYBf4","YOfrYBbwgA","FNYIMkZANm","14FLR580YD","faHir2DREs","AIYUuC2Irc","0PktIiB08l","VIlwPuupzk","ThjNnWMiS3","oGu6xS2Dfu",
+"lXFOBCxVEf","qQxHPt98iW","580YDlCMxy","uAWypl83Ud","P6bcg8hJdt","FGzgp7fsYM","B3qemMGlTF","POUYS0MR5X","P6bcg07n1c","WreyPFNYIM",
+"hYBCKVerEA","iqv4kxXTI4","M6qcGoVQp6","uZPqgY1mC0","pv0i7C2Irc","618DiAkKTk","rz7Ut29QAz","Y1mC0dhSuH","4W0TllweGy","nFqikI7p2a",
+"F6PT20Kyfs","618DiuZPqg","0KyfsPb1pa","azIWptl72W","Qworu8FmFH","n8pJ9G1RhS","lXFOB5drc6","Q6hMCFjHXR","NhXduAOgEe","d85a9rz7Ut",
+"azIWpVBjhz","0ao3l0BmCy","Yf2EcfaHir","ReKEWlweGy","HfyNQVjCZq","Ta8f65nmWv","Chuy3vOqCE","ksJbyoGu6x","DG4sTzqH0W","MmsIolH1kt",
+"KASQ86q6L9","XyPZN5IhmG","faHirHfyNQ","FVMxofcJOy","NAFuwdQ586","GrDg7Mkgy8","yvOMIEoToP","nFqikgdQsS","5ZaEzv2eC3","BbwgAK4GS8",
+"ECMvUy94nw","BFkb8jiVBP","Nxx9VOUYuF","v8yFNSbRYy","VBjhzSjskQ","5IhmG618Di","5iGN5QssNC","jSjS3lXFOB","pvgjSKZamH","BGaQYsuY4x",
+"1v5hHTa8f6","StlDJhi5X7","I7p2a7fKYU","NOHszMmsIo","n8pJ9ReKEW","CNHmv3otm6","D6rByAmdQd","vOqCEZUnqt","GSQwjUlU3M","4dEz6yvOMI",
+"CqqaDgjUTu","CdyBVYjB9t","iwzGkjS1aj","ru4UG8FmFH","k85AeRBhp0","1LB1LMezSW","Mkgy8CIShG","8hJdtFhtgl","euZA5B3qem","a00b516lHc",
+"HzZT8FPfSE","MojnPMK07Y","xciqpM3zXL","KASQ8KASQ8","aL6AJb29RJ","8cVD3x3LDe","e6e4zOxWIH","8FmFHCfgr3","zz4ZUfLNg8","0Wr5yReKEW",
+"IBe8kBbwgA","4W0TlhE1Ql","zz4ZUB3qem","55rfBNAFuw","hYBCK0h1b1","Ta8f6JXljW","SmGzvL7cGc","FVMxo0PktI","No0QbazIWp","9eoRcNxx9V",
+"AgJHQKZamH","VerEAhSSvQ","QssNCd85a9","okgRi5IhmG","MK07Y1v5hH","U3yw5i7WMQ","RpBQmhSSvQ","Yw2oUsuY4x","6AFT0AmdQd","GXdoH3weIF",
+"sx5GlbrhlQ","FLsphFGzgp","9y4lwfcwDa","MaJQswiHrZ","K20wKuJScX","yvOMIK20wK","L7cGclsQGo","yofH3AkKTk","pWiOsDz1R3","7fsYMulk41",
+"K4GS8aez9y","ZJTXHxReec","5ZaEzMGlTF","DcpWByToGW","RmDcrJJs5m","YOfrYS77LH","Ul4a1bgJAz","DG4sT9y4lw","hSSvQfmIK1","Dz1R3piJSk",
+"uoStw55rfB","6q6L9MezSW","CK5W7FVMxo","l83Udlj07Q","NAFuwKASQ8","W3VFHAXpwE","MmKGJGWqqX","rhl0JRBhp0","QClRLYw2oU","oVQp6cL0aE",
+"K4GS8FwEJz","5NammyvOMI","zz4ZUv8yFN","uLtKsMkgy8","AgJHQMezSW","BCxeCKr8ys","zqH0WuJScX","DQimpGrDg7","MmKGJoGu6x","bZLvSBGaQY",
+"OHaBzogLgc","5VZjS7fKYU","cmXIXGXdoH","RpBQmSs0Zu","NOHszRsQUq","0ao3le6e4z","J2mQi5Namm","EdBKcSjskQ","uoStwdQ586","LbRTHyvOMI",
+"v1HlnWMiS3","FNYIMtvdkD","48cHLv1Hln","0KyfsqQxHP","xReecUvlv4","wiHrZx3LDe","HzZT8cQOnv","JJs5m2hEEU","uJScXnFqik","5nmWvXyPZN",
+"okgRi0Kyfs","l83UdFNYIM","Zv7z0GWqqX","fmIK1pAhR1","JRJQBDQimp","fcwDadjsrv","nFqiks7Mxk","55rfBMkgy8","BbwgAYw2oU","xReecksJby",
+"pT8wurKDLJ","zQt6QF6PT2","OxWIHKASQ8","WmadA2Yz7E","5drc6618Di","d7vjMwDajX","n8pJ9iwzGk","OHaBzpWiOs","FVMxoCIShG","WPmlx8hJdt",
+"hUTw7J2mQi","dpe1vOUYuF","VjCZqjfREu","FnPFBLDk6f","CqqaDciuWz","ZuDtDWDVWJ","EoToPzbIYY","S2DfuQYxC0","t98iWMmKGJ","ZzJHW7X3uy",
+"he9IA55rfB","xciqpWreyP","8FmFHwDajX","YjB9tW7cTs","55rfB5IhmG","blLA9ZJTXH","Mkgy8OUqFM","8U2nU0MR5X","BGaQY8xEKz","LbRTHDQimp",
+"HlUbFpWiOs","POUYSQ6Lix","zFgtBlm0pD","cShY25nmWv","SWfouThjNn","DG4sTUl4a1","ZJTXHa00b5","14FLRUvlv4","h1zcHCK5W7","FPfSEwiHrZ",
+"GWqqXdQ586","9y4lwgIYvE","ix74rzmLYD","uZPqg7ku1p","i3pydpmeCd","M3zXL2Yz7E","JKWYReuZA5","xReecIBe8k","QnJ1SBbwgA","gdQsSzbIYY",
+"8TxD7cL0aE","0YAGHQworu","uLtKsWaWsv","DQimpjzUqR","JRJQBbrhlQ","Uvlv4kB5nP","SWfouWmadA","JJs5m0BmCy","ThjNnaez9y","d85a9AmdQd",
+"pvgjS5iGN5","Chuy3nnP8o","ECMvUBbwgA","RsQUqYh1hF","l83Ud5Drn0","Vprf2POUYS","pv0i7jfREu","1v5hHReKEW","lCMxyReKEW","aDGtSwiHrZ",
+"Chuy3AOgEe","WreyPlj07Q","Gv3FqQbxXc","zY1GYjzUqR","pWiOsaDGtS","Oz8yZ5VZjS","Nxx9VxReec","ulk41cShY2","Cp3mZZUnqt","XflUqIBe8k",
+"5drc6gjUTu","J2mQiYOfrY","Nxx9Vo8Uyd","F6PT27ku1p","wiHrZ7fKYU","aL6AJcmXIX","M3zXLyToGW","QnJ1Stl72W","Ta8f6KZamH","8FmFHIBe8k",
+"Zv7z09XyT9","iB08lYjB9t","k85AePb1pa","HlUbF5drc6","16lHcdjsrv","guMb8DG4sT","guMb81LB1L","JJs5mulk41","8TxD7ZhwG1","m4bxU0MR5X",
+"Yw2oUDQimp","rz7Ut5Namm","Ta8f6cQOnv","D6rBylXFOB","5ZaEzFNYIM","Q6LixFNYIM","5NammzmLYD","VjCZqZUnqt","v1HlnDz1R3","prNT6DcpWB",
+"WDVWJIBe8k","POUYSIn3NS","n1pmONo0Qb","7fsYMK20wK","zY1GY0PktI","nnP8o5Drn0","ix74r1v5hH","JkzUnQYxC0","nlaByQbxXc","S2DfufmIK1",
+"aFFssAIYUu","Zv7z0JIqXi","SmGzvF6PT2","iKqhruJScX","HfyNQGWqqX","2ZHdkfmIK1","5IhmG14FLR","k85AegdQsS","sqVrfNOHsz","ZuDtDVBjhz",
+"o8Uydh1zcH","K20wKM3zXL","U3yw5JRJQB","uoStwDG4sT","AIYUuMojnP","dmoS7FFDui","yvOMI9eoRc","AkKTkfFDrJ","GXdoHEoToP","DcpWBIBe8k",
+"HRxd8pWiOs","XyPZNulk41","iwzGk7Ow5C","4W0TlTa8f6","y94nwRmDcr","Uvlv4fmIK1","FNYIMS2Dfu","n1pmORBhp0","uZPqgKsjRK","s93MluPX7G",
+"CNHmvHlUbF","ogLgcv8yFN","n1pmOReKEW","QChxsix74r","BbwgAgIYvE","W3VFHxReec","Oz8yZUvlv4","UmaEvpFrrl","fmIK1aDGtS","euZA5rz7Ut",
+"JJs5muTacx","hE1Qlfqypy","XyPZNazIWp","0ao3latef2","wiHrZCIShG","pmeCdtuDyS","StlDJNo0Qb","aFFssQssNC","5ZaEzOUqFM","uQIczcmXIX",
+"soy9tQWxoT","zHF1qVLTy6","7hyVvEOE1o","tl72WcShY2","kZANmnFqik","gjUTuJJs5m","ix74rnlaBy","lpF6WFGzgp","s93MlQbxXc","NhXduIRh48",
+"Pb1pa45cIH","9rlg9fcJOy","P6bcguZPqg","QChxs0h1b1","9y4lwMmKGJ","HP433AkKTk","iqv4kru4UG","ix74rgf8rI","WDVWJRsQUq","d7vjMfqypy",
+"t59lRtjQxs","WDVWJ45cIH","CqqaDpv0i7","Uvlv44QMc9","FcWrWYOfrY","okgRiAXpwE","nnP8otvdkD","azIWpQWxoT","HP433FLsph","wiHrZEdBKc",
+"faHiri3pyd","P6bcgfLNg8","nlaByQClRL","O3iyQgf8rI","zHF1q1j5L8","IjTwPmz8gx","7ku1pbrhlQ","RsQUqlCMxy","uupzkkZANm","fcJOyguMb8",
+"i3pydQssNC","d7vjMb29RJ","lXFOBhE1Ql","bgJAzMK07Y","Oz8yZtuDyS","IKxdLChuy3","WmadAhe9IA","ru4UGQYxC0","7hyVvtaOXK","yEfy9djsrv",
+"Q6hMCRxrsm","K4GS80Kyfs","n8pJ9m4bxU","y94nwFxX9q","ru4UGFwEJz","a00b51LB1L","iKqhrMkgy8","pT8wusx5Gl","S77LHEOE1o","JRJQBAgJHQ",
+"prNT6VBjhz","WaWsvlXFOB","faHirIjTwP","jtn0Xv2eC3","ZJTXHhE1Ql","Ul4a1Yw2oU","2ZHdkWMiS3","2Yz7E24ARF","soy9tazIWp","8xEKzUlU3M",
+"W3VFHcShY2","gjUTuFVMxo","SmGzvFnPFB","C2IrcMK07Y","Oz8yZHzZT8","NOHszgtCA5","guMb8CNHmv","lViBvdhSuH","zmLYDPOUYS","lm0pDiqv4k",
+"Uvlv4VIlwP","7ku1pF6PT2","jeskSpiJSk","5Drn0cShY2","yluBxrz7Ut","M3zXLVerEA","CK5W7M3zXL","nFqikBFkb8","MGlTF0ao3l","FwEJzxXTI4",
+"Uvlv4taOXK","Yh1hFMojnP","vLsmS7ku1p","cQOnvTCgPp","ulk41t98iW","ru4UGVprf2","s93MlVerEA","uJScXuPX7G","AOgEeVjCZq","fcwDapmeCd",
+"DQimpVLTy6","9XyT9J2mQi","gIYvEuAWyp","azIWplH1kt","CNHmvFVMxo","SWfouh1zcH","jS1ajM6qcG","Ul4a12Nslm","cQOnvEoToP","Gv3FqFwEJz",
+"KZamHfmIK1","he9IAuLtKs","EdBKc5iGN5","pWiOs16lHc","Yf2EcqQxHP","blLA9lViBv","d7vjMNxx9V","d85a9RzaZA","iKqhrPb1pa","m4bxURxrsm",
+"MK07YJkzUn","suY4xlkMUA","AXpwE0YAGH","Yh1hFTa8f6","taOXKvkCHH","QssNCRpBQm","hSSvQ5VZjS","2TRI7CqqaD","soy9tStlDJ","Gv3Fq9y4lw",
+"OxWIH5iGN5","G1RhSaDGtS","dhSuH7fsYM","Kr8ys5VZjS","ZhwG1Vprf2","DG4sTRzaZA","SbRYy5Namm","FNYIMLDk6f","1v5hHix74r","dQ5860ao3l",
+"ThjNnpmeCd","b29RJAOgEe","zqH0W5iGN5","VerEAoQ87r","7ku1pM6qcG","uZPqgsoy9t","DQimpI7p2a","s4786AXpwE","Ss0ZuS2Dfu","v8yFNVjCZq",
+"Waim6djsrv","RBhp0Vprf2","iB08lcShY2","iqv4k9rlg9","FNYIMjSjS3","9rlg96q6L9","MK07YLewvM","jzUqRvOqCE","ksJbyvOqCE","Q6LixxReec",
+"t98iW5ZaEz","POUYSVNCPd","tlILtyluBx","prNT6RpBQm","pv0i7Twano","oGu6xCIShG","OHaBzx3LDe","y94nwKZamH","FjHXRJXljW","YjB9tWaWsv",
+"JRJQBEdBKc","Rxrsma00b5","gjUTu64s8N","2DREs8RCUA","xciqpJIqXi","24ARFAIYUu","Waim6S2Dfu","guMb8ThjNn","iB08lZJTXH","aL6AJMmsIo",
+"OHaBzQ6hMC","e6e4zs7Mxk","vOqCEBCxeC","QChxs5IhmG","8RCUAqUJMd","lj07QtAOsr","dQ586hE1Ql","8hJdtyEfy9","lViBvvLsmS","euZA5b29RJ",
+"lViBvaFFss","Uvlv4v8yFN","h1zcHjeskS","WMiS3tl72W","7lUXZKsjRK","HlUbFokgRi","MmKGJhUTw7","ulk41b29RJ","2NslmQChxs","DcpWBSmGzv",
+"Kr8ys5drc6","vkCHHi7WMQ","uAWype6e4z","ogLgcECMvU","gf8rIrKDLJ","FcWrWmX2GE","euZA5Yw2oU","qQxHPpiJSk","55rfBmX2GE","WPmlxlweGy",
+"Zv7z0Pb1pa","7ku1pRpBQm","8cVD3DLhzM","s7MxkFcWrW","blLA9Mm8si","bgJAzfFDrJ","pvgjSQ6hMC","QWxoTCp3mZ","XflUqTwano","pT8wu24ARF",
+"HlUbFx3LDe","EOE1olViBv","NhXduWMiS3","iwzGkt98iW","YjB9tuupzk","vOqCEHfyNQ","IRh48ZzJHW","XflUqjzUqR","oVQp62Yz7E","KZamHOUqFM",
+"9y4lw0Kyfs","SWfouXflUq","GWqqXFLsph","9iGoTXflUq","ni2v15Drn0","aDGtSQChxs","n8pJ9zFgtB","XyPZNMezSW","zmLYDhUTw7","CxVEfpWiOs",
+"3weIFnFqik","8U2nUXflUq","uvf7A2DREs","aDGtSWMiS3","uLtKszQt6Q","JXljWDcpWB","WDVWJ8cVD3","M6qcGCp3mZ","nlaByDLhzM","piJSkRmDcr",
+"lsQGo7hyVv","SbRYyoVQp6","RBhp0D6rBy","MGlTFvkCHH","yToGWVjCZq","2hEEUogLgc","VerEA8U2nU","O3iyQRmDcr","d85a9HfyNQ","K20wKUmaEv",
+"pAhR1fLNg8","FjHXRL7cGc","ksJbyi3pyd","Ul4a1Cp3mZ","JXljWogLgc","faHirMK07Y","fmIK1rKDLJ","64s8NAgJHQ","CK5W7RzaZA","G1RhStAOsr",
+"5IhmGQChxs","BFkb8zQt6Q","O3iyQi3pyd","guMb85drc6","NcICABpYhV","M6qcGd85a9","MezSWjtn0X","QWxoT4dEz6","FNYIMwiHrZ","gjUTufLNg8",
+"oGu6xYOfrY","MezSWhSSvQ","dmoS7TCgPp","K20wKrz7Ut","0YAGHVLTy6","K4GS8EoToP","FGzgp8TxD7","AgJHQQnJ1S","5nmWvokgRi","jtn0Xix74r",
+"7ku1ptAOsr","8hJdtUmaEv","FNYIMGXdoH","okgRix3LDe","Vprf2VIlwP","l83Ud45cIH","StlDJZv7z0","s4786lweGy","9eoRcJIqXi","5iGN5CNHmv",
+"Yh1hFFxX9q","GSQwjZUnqt","5nmWvDQimp","v2eC3tAOsr","IRh48piJSk","B3qemMkgy8","5iGN59rlg9","t98iWuN6r3","9XyT9zY1GY","TwanoksJby",
+"faHir2ZHdk","aL6AJydG8U","tl72WPOUYS","StlDJzmLYD","6q6L9RACuj","S2Dfu48cHL","gtCA5ZUnqt","2DREsMGlTF","ru4UGJkzUn","mX2GEDQimp",
+"nlaBySWfou","0YAGHuPX7G","KASQ829QAz","Chuy3NcICA","3otm6ciuWz","l83UdM3zXL","e6e4zQClRL","cmXIXLDk6f","KASQ8dQ586","Vprf2vkCHH",
+"ZUnqt5Mg9r","WMiS3nFqik","9iGoTsx5Gl","ReKEW48cHL","IjTwPjzUqR","jiVBPmX2GE","F6PT2JRJQB","prNT6xXTI4","QbxXca00b5","Cp3mZBpYhV",
+"BbwgAQworu","3otm6MK07Y","mX2GEyToGW","lCMxy9y4lw","Nxx9VQClRL","5Drn0djsrv","Gv3FqzHF1q","FFDuiazIWp","KASQ8CqqaD","suY4xQbxXc",
+"lkMUAMaJQs","oQ87rNxx9V","BbwgA9XyT9","AkKTkuupzk","jSjS3BbwgA","QworuX6Pin","FwEJzW3VFH","CNHmvlj07Q","Z4I1vtjQxs","W3VFHgf8rI",
+"BCxeCuN6r3","ulk41580YD","KASQ89rlg9","xXTI4pAhR1","tvdkDpmeCd","jiVBPlCMxy","uLtKsAkKTk","S2DfuVIlwP","5VZjSFcWrW","soy9t9y4lw",
+"LDk6fMmKGJ","sx5GlTCgPp","Mm8siSmGzv","8xEKzJXljW","CdyBVPYBf4","9eoRcRBhp0","NOHszJkzUn","vOqCEFwEJz","vLsmSnFqik","qQxHPMojnP",
+"pWiOsECMvU","IjTwPaez9y","8TxD7CNHmv","B3qems7Mxk","OxWIHMK07Y","piJSkWaim6","s4786Mkgy8","oVQp6ZJTXH","jS1ajEOE1o","hE1Qlru4UG",
+"xXTI44dEz6","Gv3FqQClRL","v2eC3s7Mxk","QYxC0okgRi","h1zcHBbwgA","i3pydS2Dfu","zQt6QRmDcr","3otm61v5hH","GrDg7AIYUu","o8Uyd7ku1p",
+"aL6AJK20wK","QYxC0WMiS3","zFgtBbrhlQ","IRh48tlILt","tvdkDFLsph","Dz1R3faHir","KZamHUlU3M","M6qcGrhl0J","9eoRcbZLvS","UmaEvmz8gx",
+"uAWyp5ZaEz","9iGoTJXljW","OUYuFlsQGo","cQOnvjS1aj","48cHLDQimp","aL6AJqQxHP","DLhzMtjQxs","GSQwjtvdkD","Zv7z0M6qcG","EdBKcrhl0J",
+"5IhmGhSSvQ","jiVBPFjHXR","Zv7z0Zv7z0","lCMxyM3zXL","azIWpuTacx","rhl0JK4GS8","AgJHQy94nw","Yw2oUMK07Y","HzZT8SjskQ","bZLvS8RCUA",
+"ydG8U8cVD3","FjHXRrKDLJ","fcwDavLsmS","MaJQsJRJQB","7ku1pGXdoH","dQ586ZzJHW","8FmFHQClRL","07n1cn8pJ9","e6e4zBpYhV","Ul4a1fFDrJ",
+"Yf2Ec9y4lw","HRxd8vLsmS","jS1aj9GXkX","lweGyQbxXc","RBhp0dQ586","8U2nUJXljW","lweGyY1mC0","x3LDeguMb8","jfREuuTacx","fLNg8Waim6",
+"YjB9tZUnqt","FFDui8xEKz","zmLYDblLA9","zz4ZUqaofN","djsrvSWfou","8FmFHn8pJ9","pWiOso8Uyd","lkMUAF6PT2","HlUbFfqypy","Chuy3zHF1q",
+"QnJ1SU3yw5","faHirOUqFM","oGu6xh1zcH","2hEEUAgJHQ","gf8rIG1RhS","OHaBzRxrsm","3weIFuJScX","ksJbyeuZA5","ciuWz4dEz6","fLNg8v8yFN",
+"8TxD7RpBQm","24ARF8TxD7","6AFT0fLNg8","xXTI4lXFOB","Yh1hF5ZaEz","FPfSEO3iyQ","LewvMBGaQY","xReecAIYUu","i3pydhYBCK","MmKGJNcICA",
+"POUYShE1Ql","07n1c55rfB","M3zXLTCgPp","4dEz6nFqik","uPX7GnlaBy","RxrsmpiJSk","RpBQmt59lR","XflUqazIWp","qQxHPciuWz","TXQ0Zs93Ml",
+"IRh48Nxx9V","No0QbyofH3","ThjNnhi5X7","1LB1LlpF6W","kB5nPd85a9","fFDrJt59lR","qQxHPlViBv","8U2nU1v5hH","bgJAzoGu6x","0BmCy7fsYM",
+"L7cGcQbxXc","ReKEW8FmFH","M6qcGYw2oU","8RCUAGXdoH","5Drn03weIF","5nmWvzz4ZU","Uvlv4kZANm","No0QbHRxd8","WPmlxIRh48","4dEz6CqqaD",
+"MojnPsqVrf","Chuy3JIqXi","Cfgr3YjB9t","l83UdNcICA","07n1ct98iW","bZLvSHlUbF","1LB1LsuY4x","5drc6aL6AJ","FPfSEgIYvE","Mkgy8pv0i7",
+"5ZaEzzHF1q","Ul4a1brhlQ","Mm8siStlDJ","FGzgpHfyNQ","zbIYYjSjS3","v1HlnQYxC0","h1zcHQssNC","IKxdL9y4lw","S2Dfu3otm6","WMiS3EdBKc",
+"v8yFNWaim6","FPfSEVjCZq","QClRLNhXdu","HzZT8gtCA5","XyPZNqQxHP","lm0pDuAWyp","pWiOsfaHir","hUTw7CdyBV","RpBQmJkzUn","uZPqgAXpwE",
+"DQimp9y4lw","k85AecShY2","uvf7A9iGoT","aL6AJqUJMd","MmsIoW3VFH","uvf7AJRJQB","uTacxStlDJ","45cIHgIYvE","Yh1hF0PktI","QWxoTZzJHW",
+"tAOsrtjQxs","SWfou4dEz6","ni2v1hSSvQ","atef22TRI7","3weIF8cVD3","4QMc9zz4ZU","t59lRQbxXc","rKDLJ5ZaEz","bgJAzzqH0W","ulk41s7Mxk",
+"xReecaFFss","WMiS38cVD3","0ao3l1v5hH","HRxd8vkCHH","tuDySX6Pin","s4786gf8rI","ReKEWCp3mZ","POUYSRxrsm","cQOnvSbRYy","Chuy3a00b5",
+"Yf2Ec5Drn0","d85a9l83Ud","8TxD7gf8rI","xciqpPb1pa","RBhp0JJs5m","yluBxaez9y","iqv4k7X3uy","i7WMQru4UG","1LB1LBCxeC","QWxoTt59lR",
+"ZhwG1ZJTXH","LewvMQYxC0","GXdoHtaOXK","OUYuFFVMxo","MaJQszbIYY","NOHsz4W0Tl","prNT6EdBKc","jtn0XkB5nP","5Namm8U2nU","lsQGoCdyBV",
+"NhXdu2Nslm","Z4I1vJIqXi","zqH0WdQ586","5Mg9rKsjRK","Yw2oUJKWYR","uQIczh1zcH","G1RhSwDajX","tlILt4W0Tl","2DREspmeCd","soy9tOxWIH",
+"CxVEf55rfB","8RCUAyvOMI","7lUXZFnPFB","yofH3CK5W7","1LB1LiB08l","14FLRUlU3M","gtCA53weIF","29QAzCIShG","CNHmvK20wK","29QAzzmLYD",
+"5VZjSatef2","6AFT0uN6r3","RsQUqoGu6x","55rfB0YAGH","AOgEeCIShG","oGu6xt59lR","In3NSW3VFH","55rfBVBjhz","VjCZqOUYuF","OUqFMCK5W7",
+"VerEAHlUbF","JJs5mWPmlx","AXpwE2Nslm","HP433lweGy","pT8wuQChxs","tAOsr580YD","Yh1hFm4bxU","zY1GYL7cGc","sqVrfQClRL","FjHXRiB08l",
+"AIYUuyvOMI","24ARFZv7z0","RBhp08FmFH","IRh48FVMxo","uoStwZv7z0","FxX9qRBhp0","BbwgACdyBV","QworuguMb8","guMb8v1Hln","kZANm7fsYM",
+"pvgjSY1mC0","bZLvSEdBKc","l83Udhi5X7","VjCZq8TxD7","s4786n1pmO","CdyBVCfgr3","KASQ8AOgEe","vLsmSh1zcH","O3iyQxciqp","RxrsmJKWYR",
+"LewvMyvOMI","fcwDaD6rBy","ydG8U7hyVv","v8yFN9iGoT","SWfouMm8si","gdQsSjSjS3","8RCUAtl72W","d7vjMHP433","AmdQda00b5","AIYUuD6rBy",
+"azIWpSWfou","tAOsrOUqFM","RsQUqHRxd8","d85a90Wr5y","MGlTFhSSvQ","DG4sTFPfSE","64s8NogLgc","VjCZqhUTw7","55rfBPOUYS","DQimp0PktI",
+"BpYhVStlDJ","8xEKzZzJHW","bZLvS7lUXZ","JIqXi0BmCy","zmLYDGSQwj","e6e4zksJby","SmGzvFjHXR","AmdQdWaim6","fcJOyEdBKc","7lUXZQChxs",
+"o8Uyd1LB1L","8cVD3CIShG","suY4xcShY2","QChxsGv3Fq","48cHLsoy9t","ZJTXHFGzgp","jiVBP8U2nU","MaJQs5Namm","pFrrl2hEEU","ulk41QChxs",
+"tl72WLDk6f","O3iyQlpF6W","yToGWn1pmO","AIYUuv1Hln","lH1ktNo0Qb","nFqik580YD","Vprf2xXTI4","RmDcrpAhR1","vkCHH8FmFH","zQt6QGWqqX",
+"i7WMQJKWYR","7Ow5CguMb8","gtCA5lsQGo","BbwgAYh1hF","sx5Glv1Hln","0KyfsyofH3","euZA5mz8gx","Mm8si7Ow5C","xciqpIn3NS","faHirgIYvE",
+"ZhwG1wiHrZ","MaJQsru4UG","jiVBPS77LH","jeskSokgRi","tuDySa00b5","oVQp6y94nw","FPfSEVprf2","Oz8yZSWfou","GXdoHuZPqg","vkCHHyEfy9",
+"QnJ1SPYBf4","HP433AIYUu","aez9y9y4lw","PYBf4nnP8o","uAWypQnJ1S","AIYUuxciqp","XflUqFFDui","cQOnvKr8ys","S2DfufFDrJ","uN6r3ReKEW",
+"HP433WmadA","9rlg9Oz8yZ","KASQ8zmLYD","S2DfuzHF1q","6q6L9VIlwP","Dz1R3iwzGk","Mkgy8QWxoT","VIlwPQYxC0","LewvMtlILt","djsrvQYxC0",
+"SmGzvRBhp0","UmaEvDQimp","KsjRKSjskQ","zz4ZUzHF1q","prNT6WmadA","gtCA5iqv4k","RpBQmMGlTF","hUTw7Chuy3","ni2v1wDajX","a00b5Waim6",
+"lj07QyEfy9","Rxrsm7Ow5C","0ao3lQ6Lix","VerEAuJScX","uoStwQ6Lix","FVMxo29QAz","O3iyQtl72W","d7vjMFcWrW","yvOMISWfou","OUYuFFGzgp",
+"pvgjSoQ87r","lweGyzmLYD","JkzUnrz7Ut","taOXKzmLYD","JkzUnfcJOy","QClRLulk41","pFrrlAmdQd","zqH0WOUqFM","0MR5Xrz7Ut","U3yw5J2mQi",
+"Q6hMCYh1hF","FcWrWpAhR1","ru4UG2ZHdk","P6bcgjzUqR","cmXIXatef2","VLTy6zmLYD","KZamHtuDyS","jiVBPkB5nP","NcICAKASQ8","OUqFMGXdoH",
+"0PktI3otm6","QClRLdQ586","zQt6QVerEA","MK07YtvdkD","RBhp0NhXdu","dhSuHFnPFB","IKxdLo8Uyd","24ARFeuZA5","9XyT9t98iW","brhlQVprf2",
+"I7p2aaDGtS","RACujKASQ8","taOXK5ZaEz","Chuy3nlaBy","ZUnqtyvOMI","lXFOBW7cTs","8xEKzbZLvS","LbRTHCNHmv","kZANmZ4I1v","DcpWBzY1GY",
+"M6qcGUmaEv","F6PT2VLTy6","TXQ0ZIRh48","guMb87X3uy","i7WMQuJScX","mz8gxe6e4z","fFDrJjSjS3","AIYUuJXljW","lsQGolkMUA","MmKGJ5iGN5",
+"HRxd8ciuWz","zQt6Q55rfB","EdBKcpT8wu","K20wKcQOnv","ReKEWJKWYR","AmdQdOHaBz","Q6LixFhtgl","mX2GE7Ow5C","VerEAMkgy8","yluBxzbIYY",
+"x3LDeNAFuw","MojnP3weIF","M6qcGuQIcz","yofH3atef2","AOgEeNxx9V","1v5hHzY1GY","48cHLSs0Zu","3weIFFLsph","L7cGc3weIF","o8UydzqH0W",
+"OHaBzuQIcz","24ARFlm0pD","nnP8ohYBCK","ogLgc5drc6","0ao3lIKxdL","FcWrWVerEA","ZuDtDlpF6W","tlILtChuy3","suY4xuupzk","ulk41IjTwP",
+"uupzkjtn0X","k85AejzUqR","No0Qblm0pD","hSSvQx3LDe","lpF6WI7p2a","nlaByThjNn","dQ5869eoRc","wDajXk85Ae","zQt6Q5IhmG","ZuDtDm4bxU",
+"580YDQworu","uN6r3UlU3M","8RCUAOz8yZ","tjQxslpF6W","ZuDtDqUJMd","AgJHQNOHsz","aez9yuN6r3","48cHLrKDLJ","d85a9DG4sT","14FLRlm0pD",
+"o8Uyd5Drn0","AOgEehe9IA","2TRI7pT8wu","dmoS7C2Irc","fFDrJtaOXK","BGaQYlViBv","TwanoQnJ1S","ZhwG1kB5nP","lm0pDQworu","ni2v1QssNC",
+"zHF1qJRJQB","hi5X7tjQxs","29QAzMGlTF","SbRYyfcJOy","RzaZAlj07Q","2ZHdko8Uyd","580YDogLgc","OUqFM5Drn0","J2mQib29RJ","NOHszRkQke",
+"fLNg8uLtKs","pAhR1W3VFH","Q6LixhUTw7","RBhp0BGaQY","Waim6pmeCd","vLsmS8cVD3","a00b5NOHsz","uupzkJ2mQi","9rlg92ZHdk","xXTI4KASQ8",
+"bZLvS5VZjS","64s8N48cHL","2NslmWmadA","AIYUuQYxC0","IBe8kqQxHP","W7cTs1LB1L","zFgtBa00b5","LewvM16lHc","nlaByOUqFM","BGaQYgdQsS",
+"WmadAJKWYR","FnPFBEOE1o","AXpwErhl0J","BFkb8ECMvU","iB08lv8yFN","6AFT0RsQUq","cL0aE16lHc","FxX9q8hJdt","DG4sT2Nslm","hSSvQJJs5m",
+"FxX9q2Nslm","HlUbFMkgy8","dpe1vxciqp","2ZHdkAOgEe","lViBvPOUYS","5nmWvdmoS7","jSjS3J2mQi","4dEz6RzaZA","YjB9tFxX9q","9GXkXZUnqt",
+"HlUbFZhwG1","k85AeYOfrY","SmGzvuPX7G","S2DfuFxX9q","FnPFB4W0Tl","6q6L9WMiS3","7fKYUMK07Y","ydG8U2hEEU","zz4ZUIn3NS","KsjRKzz4ZU",
+"FNYIMlViBv","JRJQBaL6AJ","ZuDtDuoStw","gf8rIlsQGo","NcICAydG8U","AkKTk1v5hH","KsjRKzQt6Q","GXdoHjS1aj","6q6L9rKDLJ","oQ87rZJTXH",
+"1j5L8HRxd8","2ZHdkWDVWJ","ThjNnQbxXc","YjB9tFhtgl","AkKTkyEfy9","MojnPi3pyd","uvf7AFwEJz","NOHszFwEJz","16lHczHF1q","CxVEfSWfou",
+"m4bxUCNHmv","2DREsa00b5","uPX7G45cIH","M6qcGn8pJ9","uvf7AtjQxs","TwanoFhtgl","FjHXRYOfrY","s7MxkyToGW","NhXduPYBf4","Mkgy8ThjNn",
+"64s8NZJTXH","AIYUuFwEJz","618Di7fsYM","jzUqRCqqaD","EdBKct59lR","v2eC3bgJAz","kZANmokgRi","l83UdgIYvE","WPmlxuvf7A","9y4lwzQt6Q",
+"WDVWJn1pmO","lViBvxReec","FxX9qzmLYD","yluBx16lHc","taOXKtaOXK","IBe8kTXQ0Z","fFDrJ8xEKz","FFDui0YAGH","yToGWhi5X7","O3iyQUmaEv",
+"ThjNnatef2","9y4lwlkMUA","4W0TlfcJOy","m4bxU0BmCy","No0Qb48cHL","kZANmFcWrW","GrDg7580YD","t98iWRzaZA","BbwgAS77LH","DQimpni2v1",
+"BbwgA7X3uy","Cp3mZkB5nP","7Ow5CW3VFH","FPfSERACuj","64s8NRACuj","okgRinlaBy","FFDuijS1aj","MojnPb29RJ","U3yw5XyPZN","ThjNnU3yw5",
+"GXdoHX6Pin","Nxx9VpAhR1","7ku1pM3zXL","07n1cMmKGJ","x3LDekB5nP","lweGy5drc6","aez9y5drc6","CNHmvl83Ud","DQimpMGlTF","24ARFP6bcg",
+"QClRLyluBx","HRxd8a00b5","qQxHPZuDtD","TXQ0ZZJTXH","lm0pDFGzgp","JJs5muN6r3","OUYuFqaofN","Q6hMCfcJOy","suY4xjSjS3","Y1mC0Gv3Fq",
+"S2Dfu24ARF","djsrvK20wK","zFgtB14FLR","rhl0Jl83Ud","I7p2aeuZA5","L7cGcqQxHP","8FmFHuZPqg","IKxdLaL6AJ","xciqpXflUq","HzZT8fLNg8",
+"MK07YM3zXL","fcJOyuAWyp","EdBKclpF6W","xReeczz4ZU","GrDg7XflUq","J2mQi2ZHdk","3otm64QMc9","Cp3mZuLtKs","EOE1oAIYUu","xXTI4aez9y",
+"xciqpjiVBP","W3VFHOz8yZ","jtn0XzHF1q","QClRLAXpwE","Q6LixKsjRK","zmLYDSWfou","nlaByK4GS8","3otm6gdQsS","ulk41Vprf2","8cVD3NhXdu",
+"2DREsFFDui","okgRi14FLR","8RCUAmz8gx","FnPFBhi5X7","oQ87rB3qem","dhSuHb29RJ","m4bxURkQke","aL6AJxciqp","1LB1LCdyBV","iKqhrJRJQB",
+"s93MlaFFss","pWiOs7lUXZ","kB5nPS77LH","6AFT08U2nU","aez9y1v5hH","taOXKhUTw7","o8UydGrDg7","vLsmSKsjRK","CIShGpAhR1","wDajXy94nw",
+"BFkb8t98iW","jS1ajFLsph","QWxoTqQxHP","FLsphlH1kt","2Yz7ElCMxy","gjUTuMGlTF","WaWsveuZA5","AIYUurhl0J","t59lRTCgPp","s4786gjUTu",
+"ciuWz5VZjS","azIWpUl4a1","Uvlv4KASQ8","K4GS8VLTy6","tuDyS9eoRc","zQt6QlweGy","suY4xUvlv4","lCMxytAOsr","oVQp6h1zcH","BbwgABpYhV",
+"lpF6WJ2mQi","KASQ83weIF","uupzks93Ml","x3LDexciqp","lViBvv2eC3","5drc6BGaQY","gIYvEhYBCK","pmeCdo8Uyd","MGlTFL7cGc","lkMUAjfREu",
+"0Wr5y5Mg9r","DcpWBrz7Ut","EdBKcCqqaD","C2Ircjtn0X","FPfSEuTacx","9eoRcuupzk","K4GS8CdyBV","VLTy68U2nU","2DREs2DREs","nFqiktAOsr",
+"0ao3lhYBCK","PYBf4m4bxU","POUYStvdkD","xReec0YAGH","PYBf4djsrv","gf8rI8cVD3","ni2v19rlg9","pmeCddhSuH","MK07Y8U2nU","wiHrZb29RJ",
+"0Kyfsmz8gx","ksJbySs0Zu","WMiS3VNCPd","CNHmvUmaEv","MmsIo4dEz6","FcWrWv2eC3","oQ87r4QMc9","wDajXatef2","jSjS3MmKGJ","aez9ytlILt",
+"hi5X7Vprf2","fFDrJBCxeC","Pb1pa55rfB","7fsYMChuy3","FxX9qK4GS8","uQIczHP433","okgRiMmKGJ","16lHcO3iyQ","EdBKcDLhzM","HP433wDajX",
+"5iGN57Ow5C","gtCA5AOgEe","EOE1oTXQ0Z","pWiOsoQ87r","BGaQYFcWrW","FwEJzXflUq","i3pydTa8f6","m4bxUUmaEv","7lUXZtvdkD","BpYhVFVMxo",
+"ZJTXHJIqXi","vOqCEFGzgp","QYxC0S77LH","piJSkJRJQB","FcWrWlViBv","JRJQBpWiOs","W7cTsfaHir","Q6Lix1LB1L","16lHcfLNg8","DQimp1LB1L",
+"prNT629QAz","uoStw5ZaEz","TXQ0ZIn3NS","nFqikzqH0W","Z4I1vuJScX","ZUnqttvdkD","HP433CNHmv","t98iWsuY4x","uupzk2hEEU","piJSkDz1R3",
+"JRJQBQ6hMC","45cIHYh1hF","FVMxoM3zXL","5Mg9rtuDyS","vkCHHjSjS3","VLTy6brhlQ","1v5hHsuY4x","SmGzvGWqqX","FFDuiHzZT8","Yw2oUs4786",
+"l83UduLtKs","GXdoHZzJHW","Cfgr3S2Dfu","In3NSokgRi","7fsYMGrDg7","pv0i7Ta8f6","AkKTkFVMxo","Cfgr3SjskQ","FVMxoNxx9V","guMb8iKqhr",
+"3otm6vLsmS","KASQ8K4GS8","8RCUAD6rBy","7Ow5CWDVWJ","okgRi8RCUA","lkMUAGXdoH","9y4lw3otm6","AOgEeDcpWB","fLNg8618Di","UlU3MYh1hF",
+"l83UdStlDJ","GWqqXWPmlx","e6e4z45cIH","pWiOs580YD","5NammOxWIH","7Ow5CZzJHW","l83UdhYBCK","tjQxsZuDtD","ZJTXHgjUTu","8hJdtrKDLJ",
+"D6rByo8Uyd","WreyPRBhp0","ZzJHWrhl0J","oQ87r9iGoT","dmoS7lkMUA","D6rByRBhp0","ZJTXHb29RJ","4dEz6a00b5","Gv3Fq64s8N","Q6hMCLbRTH",
+"5ZaEzXflUq","1LB1LVIlwP","J2mQiYjB9t","55rfBFjHXR","FjHXRni2v1","ThjNntuDyS","5Mg9rEdBKc","zz4ZUoGu6x","FGzgpCdyBV","0BmCyRACuj",
+"CqqaDaL6AJ","Yw2oUYOfrY","7ku1pdhSuH","zqH0WP6bcg","aez9yMojnP","9rlg9D6rBy","faHirwDajX","Q6Lix9GXkX","2Nslmlj07Q","MGlTFOz8yZ",
+"9rlg9KZamH","B3qemBpYhV","euZA5Pb1pa","14FLRAOgEe","ThjNnFhtgl","QWxoTP6bcg","0KyfslkMUA","FnPFBlkMUA","J2mQiwDajX","2Yz7EZUnqt",
+"FPfSESbRYy","yofH3qQxHP","MmKGJm4bxU","55rfBfqypy","zbIYYn8pJ9","cShY2fcwDa","dmoS7Rxrsm","Chuy3QnJ1S","JIqXiRBhp0","NcICAjzUqR",
+"zz4ZU6q6L9","IBe8kThjNn","FPfSESs0Zu","7X3uyyvOMI","IKxdLcL0aE","okgRiVerEA","VIlwPC2Irc","tuDySjtn0X","zmLYDDcpWB","lCMxydhSuH",
+"lweGylViBv","kZANmpWiOs","VNCPdgdQsS","v8yFN7lUXZ","fLNg8FPfSE","k85Aev2eC3","nnP8ouN6r3","16lHc2DREs","uPX7GzQt6Q","ZJTXHBbwgA",
+"Oz8yZpiJSk","h1zcHGrDg7","ZuDtDk85Ae","yofH3gjUTu","uZPqgWaWsv","blLA9MmsIo","ZhwG1DcpWB","618DiiB08l","5iGN5y94nw","5ZaEzydG8U",
+"ciuWzLDk6f","iB08lfcwDa","S2DfuHzZT8","ZhwG1fFDrJ","Cfgr3JRJQB","zFgtBWaWsv","Cfgr3JkzUn","U3yw5dQ586","ru4UGxciqp","JIqXiaDGtS",
+"HlUbFogLgc","pFrrln1pmO","ZJTXHcShY2","tvdkDCp3mZ","yvOMIYw2oU","2ZHdkMezSW","hUTw7zQt6Q","bgJAznFqik","5drc61v5hH","8FmFHiKqhr",
+"StlDJ5ZaEz","ReKEW1v5hH","rKDLJHRxd8","0ao3ltlILt","n1pmOZzJHW","F6PT2VNCPd","qaofNzz4ZU","1LB1LfLNg8","fcwDayofH3","DQimp618Di",
+"8hJdt5IhmG","uAWyptuDyS","5IhmGVerEA","pWiOsjfREu","Pb1pauAWyp","RmDcrTXQ0Z","5ZaEztuDyS","n1pmOfaHir","5nmWv14FLR","oVQp6RpBQm",
+"FVMxo1j5L8","uN6r3zz4ZU","Fhtgl29QAz","K20wK29QAz","0h1b18FmFH","7fKYUNo0Qb","AXpwEWaim6","pT8wuYw2oU","OUYuFi3pyd","s47865Mg9r",
+"qQxHPa00b5","yvOMIbrhlQ","9eoRc55rfB","VjCZqtjQxs","GXdoHtlILt","U3yw5ECMvU","RBhp0azIWp","yofH3i7WMQ","FnPFBZv7z0","k85AeYjB9t",
+"GXdoHFGzgp","J2mQiGSQwj","OUYuFhYBCK","AgJHQUlU3M","ECMvUHzZT8","oVQp6b29RJ","JXljWcL0aE","djsrvAkKTk","5VZjS7lUXZ","gtCA51LB1L",
+"RzaZAtjQxs","t98iW3otm6","hUTw7Vprf2","RxrsmW7cTs","Yh1hFwDajX","NOHszP6bcg","LDk6f45cIH","ZJTXHv8yFN","Nxx9V7X3uy","TwanoRBhp0",
+"ru4UGLbRTH","uPX7GHP433","oVQp6Rxrsm","xciqp0ao3l","pvgjSn8pJ9","GWqqXPYBf4","9rlg9ZJTXH","SmGzvzHF1q","KASQ8iwzGk","0Kyfs9GXkX",
+"5VZjSRACuj","JJs5mlweGy","x3LDe9eoRc","WmadAGrDg7","HP433a00b5","MGlTFX6Pin","zFgtBpmeCd","y94nw0Wr5y","jtn0XtaOXK","uN6r3uupzk",
+"rhl0JZhwG1","XyPZNMojnP","RpBQmCxVEf","uLtKs4dEz6","okgRiUvlv4","JRJQBFwEJz","jiVBPMGlTF","AmdQdOUqFM","2TRI78cVD3","e6e4zCIShG",
+"lXFOBa00b5","Yf2EcCxVEf","ksJbyMmsIo","HzZT83weIF","29QAzhi5X7","HfyNQuvf7A","mz8gxaFFss","xciqpCp3mZ","XflUq2Nslm","bZLvStaOXK",
+"he9IAFxX9q","o8UydLbRTH","9y4lwOHaBz","euZA5blLA9","0MR5XiKqhr","5Drn0jS1aj","4QMc9AkKTk","EdBKcuQIcz","blLA98cVD3","OxWIHNAFuw",
+"t59lRv2eC3","Rxrsmd85a9","OHaBz4QMc9","tAOsraFFss","sqVrfuTacx","07n1cbZLvS","mX2GE9eoRc","0YAGHqaofN","7Ow5CI7p2a","JXljWv8yFN",
+"jfREud7vjM","n8pJ9FVMxo","x3LDen8pJ9","LewvMFnPFB","ZhwG1JIqXi","Waim6gtCA5","BFkb8FGzgp","O3iyQDQimp","SmGzvQWxoT","0MR5XFLsph",
+"Fhtgl0Wr5y","1LB1LRBhp0","hE1Qluupzk","FxX9q5Mg9r","dmoS7mX2GE","zqH0WjeskS","Mm8siJJs5m","nFqikuupzk","POUYSuoStw","wDajXh1zcH",
+"KASQ8tvdkD","8cVD3wiHrZ","pv0i72Nslm","2TRI7FGzgp","JkzUntjQxs","aFFssgtCA5","ulk41aez9y","uJScXrhl0J","5ZaEzHRxd8","wDajXxReec",
+"VBjhzCIShG","RBhp0ulk41","BCxeCpFrrl","prNT6Nxx9V","0Wr5ylXFOB","ni2v1jfREu","kB5nPnnP8o","aL6AJX6Pin","lsQGo9iGoT","0KyfsZhwG1",
+"lH1ktThjNn","POUYS2hEEU","n8pJ98TxD7","7ku1poQ87r","KZamHG1RhS","XflUqpvgjS","Q6hMCVprf2","VIlwPk85Ae","8cVD3CqqaD","NAFuwCp3mZ",
+"3weIFJJs5m","4QMc9580YD","AkKTkJRJQB","pmeCdRsQUq","azIWphYBCK","I7p2aXyPZN","L7cGcCp3mZ","5Drn0soy9t","IKxdL0PktI","NAFuw5Drn0",
+"JKWYRP6bcg","5iGN5SWfou","iB08lgdQsS","8RCUANo0Qb","k85AeM3zXL","gIYvEAkKTk","FwEJzaFFss","JXljW45cIH","VBjhzTXQ0Z","MmsIoMaJQs",
+"Ul4a1ciuWz","VerEA4dEz6","B3qembZLvS","StlDJdpe1v","jS1ajChuy3","jSjS35VZjS","gtCA5okgRi","uN6r316lHc","RBhp09y4lw","pFrrlLDk6f",
+"aez9yMezSW","EoToPlkMUA","4dEz6K4GS8","aez9y0ao3l","RpBQmQbxXc","fcwDarKDLJ","SWfoucShY2","prNT6wDajX","VLTy6Vprf2","rz7Ute6e4z",
+"mX2GEMojnP","NAFuwFhtgl","BGaQY7lUXZ","8TxD7rKDLJ","RACuj3weIF","07n1cPOUYS","0MR5XJXljW","5Mg9r0h1b1","7Ow5CZv7z0","Ul4a1faHir",
+"NcICALewvM","9y4lw2TRI7","OUYuFuupzk","uPX7GcmXIX","xReecQYxC0","AgJHQVprf2","45cIHfFDrJ","xReecqUJMd","taOXKuPX7G","CqqaD5ZaEz",
+"FGzgppv0i7","G1RhScL0aE","lm0pDfLNg8","F6PT2QYxC0","0ao3lJXljW","8xEKzGXdoH","t98iWd85a9","vOqCE7fsYM","n8pJ9Yh1hF","TXQ0Z5drc6",
+"uvf7Aix74r","G1RhSo8Uyd","HP433lXFOB","ZuDtDguMb8","uPX7GMmKGJ","cL0aE5ZaEz","0BmCycShY2","HlUbFtl72W","8hJdtgf8rI","uAWypdQ586",
+"K20wKzY1GY","d7vjMpv0i7","uJScX07n1c","gf8rI2DREs","QChxs9y4lw","CdyBVfcJOy","VNCPdsqVrf","lm0pDblLA9","D6rByDQimp","KsjRKWDVWJ",
+"QYxC0yluBx","7fsYMD6rBy","5nmWvjSjS3","gdQsSMezSW","piJSkFNYIM","lXFOBvOqCE","JkzUn8cVD3","rz7Utv1Hln","djsrvOUqFM","M3zXLuN6r3",
+"RkQkeWDVWJ","7Ow5CHzZT8","WaWsvrz7Ut","CqqaDUmaEv","B3qemHzZT8","64s8N4QMc9","uvf7A9y4lw","6q6L9lm0pD","FVMxoTXQ0Z","wDajXSmGzv",
+"hYBCKNOHsz","d85a9hE1Ql","zHF1qNo0Qb","FPfSEGSQwj","LewvMx3LDe","KsjRK618Di","nFqikbZLvS","s93MlZ4I1v","9GXkXt59lR","jtn0XhSSvQ",
+"7X3uyaL6AJ","cQOnvFVMxo","0h1b1uTacx","oGu6xs93Ml","oVQp6CK5W7","he9IAlj07Q","JJs5mIn3NS","lm0pDbgJAz","okgRiDcpWB","07n1cZzJHW",
+"8RCUAGWqqX","hUTw7cShY2","WreyPvkCHH","piJSkUmaEv","b29RJkZANm","IKxdLokgRi","Cp3mZYw2oU","0h1b116lHc","7Ow5C24ARF","gjUTuQworu",
+"PYBf4TXQ0Z","tuDySFLsph","faHirmX2GE","lj07Qt98iW","ciuWz7fKYU","0PktI6q6L9","VerEANo0Qb","Uvlv40h1b1","pWiOsa00b5","piJSk5VZjS",
+"OHaBzjtn0X","zHF1qzmLYD","Q6LixNhXdu","okgRiuPX7G","iqv4kIjTwP","45cIHn1pmO","U3yw5JkzUn","FnPFBFnPFB","dmoS7i3pyd","I7p2auPX7G",
+"nlaByAIYUu","YOfrYYjB9t","1LB1LThjNn","oGu6x9y4lw","NOHszUl4a1","pT8wufcwDa","lkMUANhXdu","Q6LixGrDg7","wDajX9rlg9","IKxdLIn3NS",
+"GWqqXIRh48","FjHXR8cVD3","7lUXZuQIcz","Y1mC0O3iyQ","EOE1ociuWz","n8pJ9DLhzM","AmdQdRACuj","jfREud85a9","CqqaDcL0aE","5nmWvfcJOy",
+"BFkb8rhl0J","O3iyQFxX9q","iB08lK20wK","Cp3mZlpF6W","JIqXi2ZHdk","5nmWv5drc6","6AFT0wiHrZ","i7WMQTCgPp","i7WMQjSjS3","Gv3FqHfyNQ",
+"lm0pDL7cGc","HzZT8GrDg7","ru4UGiKqhr","aez9yfFDrJ","S2Dfuhe9IA","FxX9qpiJSk","8RCUAKr8ys","9iGoTGXdoH","MezSWnlaBy","ThjNnNAFuw",
+"JJs5mh1zcH","pv0i7BbwgA","QworukZANm","8xEKz2Yz7E","Qworu7fKYU","S2DfugIYvE","MaJQst98iW","PYBf4x3LDe","lViBvMGlTF","EdBKcQworu",
+"suY4xKASQ8","jSjS30ao3l","FjHXRMaJQs","tAOsruPX7G","Yw2oUs7Mxk","pT8wuReKEW","Chuy3SbRYy","0Wr5yZJTXH","jfREunnP8o","hE1Qle6e4z",
+"Ta8f6uPX7G","pvgjSX6Pin","AIYUugIYvE","NhXduMK07Y","zY1GYoQ87r","FcWrWS77LH","hSSvQBFkb8","QssNC2hEEU","DcpWB9y4lw","v1Hln48cHL",
+"FGzgpZ4I1v","AkKTkVprf2","FxX9qOUYuF","FwEJzSbRYy","ydG8Uhi5X7","L7cGcWmadA","guMb8RmDcr","MojnPXyPZN","uPX7GSs0Zu","aez9yHfyNQ",
+"RsQUqqUJMd","U3yw5atef2","7X3uy2Nslm","MaJQs5VZjS","ECMvUh1zcH","8RCUAQ6Lix","MmKGJgdQsS","wDajXQnJ1S","sqVrfS2Dfu","gtCA5pWiOs",
+"pT8wuW3VFH","Mm8siVerEA","hSSvQt98iW","Nxx9Vs93Ml","BFkb8Yf2Ec","FcWrWM3zXL","MezSWatef2","fFDrJAgJHQ","hUTw7pmeCd","m4bxUd7vjM",
+"blLA9BCxeC","oQ87r5iGN5","0Wr5ydQ586","No0QbNAFuw","LewvMPb1pa","TwanoCxVEf","J2mQiM3zXL","Cp3mZY1mC0","3otm6AOgEe","Yw2oUBbwgA",
+"oQ87r64s8N","HP433n8pJ9","O3iyQWDVWJ","VIlwPOHaBz","VerEAbgJAz","cQOnv14FLR","W3VFHXflUq","ReKEWpWiOs","VerEAuvf7A","POUYSv8yFN",
+"5iGN5RBhp0","uvf7Ajtn0X","Y1mC0djsrv","pT8wuWreyP","uQIczGv3Fq","SWfoux3LDe","WmadAmX2GE","Cp3mZEdBKc","hSSvQY1mC0","QClRL6AFT0",
+"AIYUu2TRI7","zFgtBPb1pa","StlDJi3pyd","4QMc9SbRYy","LbRTHSWfou","zmLYDiwzGk","AkKTkCIShG","In3NSe6e4z","taOXKPOUYS","pAhR10Wr5y",
+"yToGWPOUYS","gdQsS5IhmG","EdBKcFNYIM","ru4UGWaWsv","he9IAKr8ys","AOgEePOUYS","Kr8ysPYBf4","JXljWksJby","VNCPdFPfSE","tlILtb29RJ",
+"gIYvEvOqCE","QYxC03otm6","pFrrlMkgy8","EoToPWreyP","CqqaDhE1Ql","QChxsguMb8","JJs5mQ6hMC","MaJQsLbRTH","d7vjMCxVEf","0MR5Xi7WMQ",
+"kZANmgIYvE","ni2v1OHaBz","nFqik7ku1p","BFkb82ZHdk","lpF6W5IhmG","nlaBysx5Gl","uN6r39GXkX","XyPZN7Ow5C","45cIHVprf2","fLNg8AOgEe",
+"suY4xdjsrv","lCMxyciuWz","POUYSWDVWJ","v2eC3uN6r3","0KyfsGrDg7","he9IAMK07Y","lH1ktjtn0X","brhlQZhwG1","EOE1oUvlv4","lViBvZUnqt",
+"aDGtSrhl0J","uTacx8cVD3","7ku1pMmsIo","Gv3Fq07n1c","dQ586Dz1R3","48cHLAXpwE","l83UdRsQUq","iwzGkQChxs","CNHmv5Mg9r","D6rBy9y4lw",
+"Q6hMCWMiS3","yluBxMGlTF","X6PinZv7z0","tvdkD2hEEU","rz7UtFwEJz","fmIK1FLsph","SWfoucmXIX","nFqikCK5W7","8hJdtDG4sT","BGaQYlXFOB",
+"Zv7z0wiHrZ","OHaBz7lUXZ","lpF6Wuvf7A","9iGoTQbxXc","W3VFHuoStw","lXFOB5nmWv","QYxC0VNCPd","OHaBzMaJQs","i7WMQjS1aj","iwzGk1LB1L",
+"ix74rtl72W","4W0Tlhe9IA","t98iWyEfy9","rz7UtHzZT8","Z4I1vi7WMQ","3weIFiwzGk","1j5L8rhl0J","XflUqC2Irc","kZANmn8pJ9","U3yw50Kyfs",
+"nnP8oQClRL","AOgEelViBv","8FmFHzFgtB","t98iWIKxdL","nlaByd7vjM","0Wr5yP6bcg","QWxoTpAhR1","YjB9tFFDui","RmDcr9y4lw","Q6LixF6PT2",
+"5VZjSxciqp","QChxsvOqCE","PYBf4hi5X7","CK5W7NAFuw","CNHmvi3pyd","24ARFuQIcz","DLhzMfcJOy","PYBf4atef2","b29RJhe9IA","a00b5zqH0W",
+"QbxXc8RCUA","1j5L8vOqCE","BFkb8GWqqX","ZuDtDWreyP","NcICAEdBKc","J2mQiX6Pin","VjCZqhi5X7","8xEKzQworu","FGzgpwDajX","nnP8oi3pyd",
+"F6PT2lkMUA","Y1mC0FcWrW","MmsIoXflUq","8RCUAokgRi","l83UdZ4I1v","S2DfuQWxoT","lViBvOxWIH","HRxd8BbwgA","CIShGNcICA","Yh1hFzmLYD",
+"2TRI7KASQ8","LewvMdhSuH","sx5Gl7Ow5C","Mkgy89y4lw","yluBxUvlv4","fcJOyuTacx","AmdQdyEfy9","14FLRhi5X7","C2IrcM6qcG","P6bcgfcwDa",
+"lm0pDQssNC","IBe8kDcpWB","ECMvUMaJQs","RACujRpBQm","2TRI7Yh1hF","Y1mC0YjB9t","MmKGJuAWyp","1v5hHtaOXK","JkzUnTCgPp","Gv3Fq0Kyfs",
+"atef2cmXIX","5Mg9rLbRTH","pmeCduvf7A","v2eC3zqH0W","7ku1ptjQxs","blLA9jzUqR","O3iyQtaOXK","zbIYY1v5hH","FxX9qGv3Fq","t98iWuupzk",
+"C2IrcFVMxo","JRJQB0Kyfs","cmXIXTXQ0Z","uN6r3dmoS7","RBhp0FNYIM","BFkb8WPmlx","zQt6QkZANm","zbIYYJJs5m","ZuDtD0MR5X","Gv3FqL7cGc",
+"SjskQfcJOy","NOHszzqH0W","8xEKzIKxdL","KASQ8Mm8si","HP433QClRL","2Yz7EYh1hF","wiHrZMK07Y","i3pydTwano","S77LHRBhp0","POUYSix74r",
+"uPX7G6q6L9","S2DfuHlUbF","zFgtBvkCHH","yofH355rfB","zY1GYd85a9","ciuWzVjCZq","zFgtBJRJQB","MmsIoFLsph","uupzk2Yz7E","FhtglHzZT8",
+"NOHszW7cTs","lXFOBPb1pa","uN6r3J2mQi","5iGN5AmdQd","fcJOyPOUYS","dmoS7atef2","FLsphJJs5m","RzaZAm4bxU","faHirlH1kt","OUqFMJJs5m",
+"xReecCp3mZ","Ss0ZuY1mC0","cQOnvOUYuF","7X3uy55rfB","taOXK5nmWv","0YAGHv2eC3","AIYUuM3zXL","Gv3FquLtKs","wDajXru4UG","RmDcr9XyT9",
+"ydG8U3weIF","jfREutjQxs","X6PinCfgr3","K20wKWreyP","CqqaDSmGzv","lCMxyL7cGc","EoToPm4bxU","Ss0ZuMojnP","oGu6x14FLR","C2IrcXyPZN",
+"tlILthYBCK","azIWp5nmWv","9y4lwoVQp6","AmdQdRmDcr","cQOnvuZPqg","QbxXc8FmFH","m4bxUOUqFM","F6PT2IBe8k","OHaBzyToGW","aFFssVLTy6",
+"Q6hMCZhwG1","m4bxUVBjhz","AXpwEOUYuF","8TxD7cmXIX","zFgtBeuZA5","WDVWJJ2mQi","4dEz6Pb1pa","HfyNQxciqp","v8yFNJkzUn","ru4UGDcpWB",
+"taOXKksJby","vkCHHuAWyp","ZzJHW618Di","UmaEv8U2nU","i3pydPOUYS","oQ87r5Mg9r","WmadAVjCZq","zqH0Wh1zcH","rKDLJAIYUu","9GXkXs7Mxk",
+"pT8wuJJs5m","WMiS3RmDcr","PYBf4uLtKs","CK5W7Oz8yZ","45cIHhYBCK","9iGoTi3pyd","FVMxoIKxdL","ThjNnv1Hln","aFFssDz1R3","JXljWAOgEe",
+"prNT6aez9y","Chuy3HRxd8","F6PT2xXTI4","AIYUuZJTXH","pv0i7HP433","yluBxuvf7A","Nxx9VcQOnv","O3iyQFNYIM","lsQGoCK5W7","AIYUuix74r",
+"yofH34QMc9","NhXduHRxd8","K20wKxXTI4","5VZjSY1mC0","MK07YTCgPp","8RCUAQbxXc","uoStwSs0Zu","Yf2EcQbxXc","GWqqXIjTwP","0MR5XJkzUn",
+"qaofN64s8N","tlILtyvOMI","a00b5lweGy","XflUqAkKTk","gdQsSHlUbF","azIWpD6rBy","NcICAC2Irc","Yw2oU14FLR","IRh48Rxrsm","HRxd8BFkb8",
+"uvf7AW3VFH","RzaZAqQxHP","ni2v1uQIcz","0BmCyHfyNQ","AOgEe7fsYM","2NslmcQOnv","IBe8kYw2oU","x3LDehe9IA","RpBQmv1Hln","tjQxsVjCZq",
+"vkCHH8RCUA","djsrvl83Ud","Ta8f6ZhwG1","s4786uQIcz","5Mg9rlsQGo","HzZT8piJSk","gIYvEn1pmO","5Mg9ruTacx","Pb1paTwano","iKqhrWaWsv",
+"lCMxyCqqaD","QbxXctl72W","LewvM2hEEU","2ZHdk4QMc9","azIWpVprf2","b29RJW7cTs","MojnP4QMc9","QWxoTMGlTF","v2eC39eoRc","0h1b1e6e4z",
+"uvf7A0ao3l","0h1b1Q6hMC","F6PT2Qworu","1j5L8KsjRK","Yw2oURmDcr","0PktIdQ586","soy9t2Nslm","v1HlnQChxs","yluBxECMvU","EoToPpFrrl",
+"64s8NReKEW","8TxD75iGN5","hSSvQVjCZq","W3VFHGWqqX","QYxC0taOXK","618DiLDk6f","DQimpMaJQs","5drc6AIYUu","JRJQBx3LDe","ksJbyJKWYR",
+"tAOsrW7cTs","5nmWv4dEz6","5drc65drc6","Yf2EcpiJSk","vOqCEBGaQY","uTacxuQIcz","NcICApv0i7","fcJOyogLgc","B3qem14FLR","U3yw5rz7Ut",
+"cmXIX8FmFH","yEfy9Gv3Fq","uLtKsgdQsS","5ZaEzIRh48","yluBxfaHir","faHiriKqhr","o8Uyd2ZHdk","Ul4a1prNT6","FLsph8TxD7","okgRipiJSk",
+"7Ow5Csx5Gl","5Mg9rd7vjM","5Mg9rpT8wu","XyPZNGrDg7","BpYhVVerEA","UmaEvlpF6W","jeskStvdkD","PYBf4cQOnv","hi5X7WmadA","FxX9q7hyVv",
+"QWxoT2hEEU","DQimpX6Pin","4dEz6QYxC0","kZANmUvlv4","iqv4k5Drn0","xXTI4AOgEe","qUJMdzbIYY","TXQ0ZyEfy9","MmsIolsQGo","lj07Q5drc6",
+"SjskQReKEW","gf8rIMezSW","CdyBVQChxs","wiHrZuAWyp","cL0aECxVEf","lweGyfmIK1","7X3uy16lHc","HP433l83Ud","Nxx9VZuDtD","5ZaEzVprf2",
+"dQ586d7vjM","RzaZA5Mg9r","lH1ktjiVBP","i7WMQOUqFM","WMiS3fcwDa","GXdoH5Mg9r","NOHszTwano","9y4lwiqv4k","FNYIM9GXkX","ThjNn8xEKz",
+"JRJQBsx5Gl","RBhp0lViBv","3otm6HfyNQ","2DREsQ6Lix","Yw2oU7lUXZ","d85a9ZUnqt","Mkgy8ZJTXH","Ss0ZuOz8yZ","8xEKzzHF1q","45cIH7Ow5C",
+"hSSvQStlDJ","he9IAWPmlx","Ss0Zum4bxU","e6e4z6AFT0","3weIFHfyNQ","atef2MojnP","W3VFHv2eC3","WmadA2ZHdk","wiHrZtvdkD","0Wr5yRBhp0",
+"zHF1qGSQwj","KsjRKWMiS3","K20wKpv0i7","taOXKi3pyd","W7cTse6e4z","Vprf2NhXdu","iKqhr5VZjS","VjCZqTa8f6","Rxrsm1v5hH","6AFT06AFT0",
+"2NslmTwano","sx5GlKr8ys","5Drn0vOqCE","FFDuicmXIX","CK5W70ao3l","BGaQYtvdkD","Mkgy82DREs","ZzJHWh1zcH","FFDui7lUXZ","16lHcQ6hMC",
+"m4bxUt98iW","DcpWBVNCPd","4dEz65ZaEz","tvdkDCK5W7","qUJMdFnPFB","CqqaDX6Pin","HzZT8qUJMd","W7cTsAkKTk","X6PinaDGtS","FPfSECfgr3",
+"9rlg9JKWYR","BCxeCs93Ml","8U2nU5Namm","48cHLKsjRK","OHaBzo8Uyd","5Mg9rCNHmv","hE1QlCfgr3","6AFT0YOfrY","t98iWJJs5m","t98iWM3zXL",
+"MK07YS2Dfu","AkKTkiB08l","IKxdLECMvU","GXdoHjfREu","ZuDtDxReec","64s8NxXTI4","XyPZNSs0Zu","v8yFNO3iyQ","RxrsmFNYIM","xReec6AFT0",
+"Kr8ysfaHir","bgJAz48cHL","zmLYDFLsph","fLNg8fqypy","WDVWJuTacx","KASQ80h1b1","mX2GEfaHir","blLA9MojnP","G1RhSKZamH","5iGN5lpF6W",
+"iKqhr0ao3l","4dEz64W0Tl","CqqaDuvf7A","8FmFHogLgc","C2IrcDz1R3","JRJQB24ARF","JkzUnYf2Ec","NhXduC2Irc","VerEAtaOXK","rKDLJ9rlg9",
+"M6qcG8TxD7","14FLRtvdkD","brhlQ64s8N","5IhmGReKEW","lsQGosx5Gl","07n1cLewvM","5Mg9r0Kyfs","MaJQs29QAz","5NammEOE1o","0Wr5yThjNn",
+"5VZjS55rfB","zqH0WyEfy9","MmKGJdjsrv","8xEKzVNCPd","EOE1o5drc6","CIShG8U2nU","DG4sTP6bcg","P6bcg8cVD3","M6qcGi3pyd","9y4lwQ6hMC",
+"yToGWtjQxs","rz7UtG1RhS","tuDySCIShG","azIWpCxVEf","CNHmv8xEKz","rz7UtDcpWB","9iGoTEoToP","4QMc9atef2","K4GS8e6e4z","DcpWByluBx",
+"zQt6QVBjhz","5VZjSCNHmv","ulk41h1zcH","lj07QS77LH","2DREsRzaZA","0ao3lzQt6Q","oQ87rMGlTF","C2IrcOxWIH","i7WMQuvf7A","x3LDeQClRL",
+"Q6hMCDLhzM","Ul4a18hJdt","t98iWFVMxo","yofH3Nxx9V","BFkb8AOgEe","ZJTXHdpe1v","tl72WqaofN","gtCA5qaofN","MK07YSbRYy","iqv4k3otm6",
+"P6bcgwiHrZ","AIYUuwiHrZ","JkzUndQ586","e6e4z29QAz","ZUnqtYw2oU","6q6L90YAGH","atef2Y1mC0","he9IAjS1aj","HfyNQt59lR","5drc6s93Ml",
+"G1RhSHfyNQ","IKxdLBbwgA","DLhzM07n1c","pvgjSSmGzv","7hyVvaL6AJ","cL0aEfaHir","TwanohE1Ql","gdQsSYjB9t","v8yFNThjNn","HzZT8nnP8o",
+"L7cGc8RCUA","M6qcGfLNg8","rKDLJydG8U","POUYShSSvQ","0ao3lv8yFN","BFkb8soy9t","CIShGIKxdL","lpF6WNcICA","jiVBPtvdkD","WaWsvcmXIX",
+"FjHXRAIYUu","dQ586uPX7G","i7WMQi7WMQ","Kr8ys7fKYU","d85a9DQimp","RpBQmEdBKc","XflUqpAhR1","qUJMdUmaEv","J2mQiblLA9","v8yFNqQxHP",
+"zFgtBhSSvQ","gtCA5m4bxU","EoToPn1pmO","MaJQs7fsYM","okgRiChuy3","BFkb8xciqp","FnPFBU3yw5","9GXkXHP433","No0QbS2Dfu","CIShGuupzk",
+"Ul4a15ZaEz","X6PingdQsS","ksJbyM6qcG","QChxshSSvQ","nFqikyvOMI","Ss0ZuWDVWJ","Pb1palpF6W","xReecaez9y","vLsmSlpF6W","okgRivkCHH",
+"cL0aEhE1Ql","rz7UtNxx9V","TCgPp6AFT0","GSQwjlsQGo","LDk6f7ku1p","1j5L8BCxeC","1v5hH0ao3l","tuDySCxVEf","29QAzIKxdL","FNYIMRmDcr",
+"jSjS3UlU3M","1v5hHSs0Zu","StlDJjiVBP","5Mg9rv2eC3","zbIYYWPmlx","kB5nP0BmCy","Mm8siHRxd8","LDk6fVBjhz","3otm60h1b1","wDajX2hEEU",
+"FVMxo8hJdt","yvOMIQworu","xciqpDLhzM","rhl0Jlm0pD","W7cTsciuWz","AgJHQuAWyp","F6PT2Waim6","No0QbStlDJ","uPX7GvLsmS","ECMvU8U2nU",
+"a00b5cL0aE","VBjhzMK07Y","AgJHQzmLYD","v1HlnbZLvS","8FmFHIKxdL","IjTwPRkQke","HRxd8he9IA","IRh48zmLYD","I7p2aRBhp0","55rfBVNCPd",
+"GSQwjnlaBy","IRh48P6bcg","8cVD3ThjNn","xXTI4hUTw7","prNT6DQimp","O3iyQlXFOB","sqVrfAXpwE","IjTwPcmXIX","0BmCyfaHir","pWiOsiwzGk",
+"Kr8ysRxrsm","rhl0JUlU3M","cmXIX2hEEU","48cHLPYBf4","UmaEvAXpwE","7fsYMHzZT8","MK07YuAWyp","BbwgATCgPp","Q6LixM6qcG","48cHLn8pJ9",
+"AmdQdtvdkD","SWfoujzUqR","5Nammuupzk","jiVBPh1zcH","blLA90ao3l","lH1kt9y4lw","8xEKz3otm6","0Wr5yQChxs","9GXkXokgRi","iwzGkbrhlQ",
+"8hJdtI7p2a","uAWypTwano","X6Pin3otm6","7fKYUPOUYS","Cfgr34QMc9","mX2GE14FLR","QssNCPOUYS","fcJOyqaofN","fmIK1zY1GY","vOqCEUl4a1",
+"FVMxoHfyNQ","oVQp68FmFH","14FLROz8yZ","tAOsrv8yFN","pT8wuOUqFM","9y4lwVerEA","StlDJFcWrW","xXTI44QMc9","9eoRcCqqaD","t59lRNAFuw",
+"0BmCyPOUYS","ydG8UbrhlQ","pAhR1zmLYD","45cIHNo0Qb","HRxd8QssNC","uN6r3piJSk","OUYuFuQIcz","KsjRKhSSvQ","hE1Ql7X3uy","ReKEWnlaBy",
+"LewvMMojnP","48cHL5iGN5","EoToPMK07Y","Z4I1vni2v1","XflUqzz4ZU","9eoRcFwEJz","RsQUq0Kyfs","cL0aEOUqFM","lH1kti3pyd","o8UydDG4sT",
+"5Drn0gjUTu","AmdQd5drc6","5drc6iB08l","J2mQiJ2mQi","vkCHHP6bcg","I7p2aQssNC","jeskS0MR5X","LDk6fYh1hF","guMb8Oz8yZ","yEfy99y4lw",
+"nlaBylweGy","07n1cjtn0X","0h1b1Qworu","MezSW7fKYU","lkMUA2Yz7E","rz7UtJRJQB","cQOnvNhXdu","ksJbyd7vjM","QYxC0Rxrsm","DG4sTJRJQB",
+"hYBCKPb1pa","n1pmOCxVEf","yluBxmX2GE","o8Uydsoy9t","lViBvtuDyS","Q6LixhE1Ql","qUJMd7X3uy","pvgjSkB5nP","X6PinG1RhS","uQIczFVMxo",
+"pvgjSuTacx","WaWsvFVMxo","CIShGI7p2a","ni2v1k85Ae","D6rBy8RCUA","K4GS8F6PT2","rz7UtyvOMI","zY1GYblLA9","GrDg7gtCA5","AIYUu1j5L8",
+"Mkgy8KASQ8","zmLYDgdQsS","mX2GEWreyP","qaofNAkKTk","5iGN5blLA9","nlaByEdBKc","2Yz7EoGu6x","OxWIH9rlg9","dhSuHIjTwP","NcICA9y4lw",
+"ZUnqts93Ml","C2IrcyEfy9","8U2nUe6e4z","2DREsDcpWB","Uvlv4Nxx9V","9rlg9hE1Ql","5VZjSbgJAz","CIShGMGlTF","hE1QlKASQ8","SbRYy7Ow5C",
+"dpe1vfFDrJ","YjB9tFNYIM","Twano16lHc","14FLRSbRYy","rhl0JQssNC","oGu6x5Namm","wDajXWPmlx","pmeCdzqH0W","Zv7z0DLhzM","MmsIoNxx9V",
+"cL0aEyluBx","FcWrWuoStw","7hyVv55rfB","fFDrJOHaBz","gIYvEJJs5m","sx5GlLewvM","HzZT8FcWrW","FFDuis4786","cL0aESWfou","piJSkMK07Y",
+"gIYvEJkzUn","hE1QlOUYuF","7fsYMhE1Ql","BCxeCJRJQB","s7MxkKASQ8","ThjNnI7p2a","suY4xGXdoH","nnP8o580YD","VIlwPCIShG","dQ586qaofN",
+"yofH3UlU3M","JKWYRiwzGk","S2DfupvgjS","0Wr5yuTacx","oVQp6uPX7G","mz8gxjfREu","TwanoG1RhS","Ul4a1S2Dfu","qaofNGrDg7","TwanoI7p2a",
+"AXpwE24ARF","bgJAz0ao3l","zFgtBQWxoT","7fsYMEoToP","PYBf40BmCy","8xEKzWMiS3","FwEJzyluBx","Yh1hFrhl0J","prNT6rz7Ut","n1pmOGXdoH",
+"x3LDeQbxXc","VBjhzCp3mZ","RpBQmOxWIH","azIWpRBhp0","lsQGoM6qcG","hUTw7s4786","rhl0J4W0Tl","6q6L9S2Dfu","JRJQB29QAz","AIYUugdQsS",
+"DQimpgIYvE","QWxoTUlU3M","CK5W7LDk6f","pFrrlZv7z0","gIYvEgjUTu","okgRiFVMxo","fLNg8taOXK","AIYUuTwano","HzZT8TXQ0Z","JKWYRJIqXi",
+"Ta8f6hYBCK","KASQ8Kr8ys","uoStwogLgc","uTacxl83Ud","FcWrWIKxdL","CxVEf9GXkX","SWfouZzJHW","5VZjSix74r","dmoS72hEEU","RxrsmJ2mQi",
+"GXdoHuoStw","VNCPdRACuj","tl72Wd7vjM","tl72WEOE1o","WMiS3BpYhV","Nxx9Vn8pJ9","yluBx8xEKz","RmDcr9rlg9","ix74rfcJOy","tvdkDk85Ae",
+"Gv3FqMezSW","k85AeNcICA","s7MxkBCxeC","uAWypQ6hMC","QChxsdmoS7","uQIczo8Uyd","kZANmqQxHP","BCxeCSWfou","TCgPpx3LDe","vkCHHrz7Ut",
+"blLA92hEEU","n8pJ91v5hH","QnJ1SaFFss","4dEz6sx5Gl","yofH3lm0pD","P6bcgMezSW","wiHrZ8TxD7","0MR5XyluBx","In3NSU3yw5","jSjS3xXTI4",
+"8xEKzZ4I1v","Cp3mZdQ586","RsQUqHfyNQ","t59lRD6rBy","t59lRpAhR1","ix74rpvgjS","POUYSAmdQd","oGu6xogLgc","4QMc9WaWsv","x3LDeXflUq",
+"lj07Qhe9IA","gjUTuuLtKs","B3qemTXQ0Z","Chuy3I7p2a","VBjhzQYxC0","qQxHPlkMUA","tvdkDyvOMI","uTacxB3qem","7fKYUo8Uyd","FhtglCfgr3",
+"SmGzvlXFOB","s93MlFcWrW","Cfgr3B3qem","9y4lwatef2","tl72WFhtgl","Cp3mZvOqCE","OxWIHni2v1","fcJOyFNYIM","tjQxsCNHmv","lH1ktGrDg7",
+"v8yFNgdQsS","yEfy9WMiS3","vOqCEQworu","CdyBVvOqCE","EdBKcyluBx","azIWptlILt","OUqFMPb1pa","Mkgy8faHir","hYBCKpv0i7","C2IrcRACuj",
+"3otm6Ss0Zu","48cHLXyPZN","JIqXiKr8ys","yvOMI5drc6","rz7UtMmsIo","Y1mC0AOgEe","JXljWlpF6W","7lUXZIKxdL","AmdQdqQxHP","Q6LixDLhzM",
+"RmDcr3weIF","gIYvE7ku1p","gjUTucL0aE","iwzGklj07Q","uoStwSjskQ","UlU3MpT8wu","GWqqX4W0Tl","I7p2aydG8U","8hJdtcQOnv","RxrsmlweGy",
+"lXFOBUmaEv","dmoS7uQIcz","C2IrcVerEA","L7cGc4QMc9","Cp3mZhE1Ql","9eoRcjS1aj","lm0pDv1Hln","8cVD3Zv7z0","hi5X7ix74r","jzUqRAIYUu",
+"x3LDezHF1q","x3LDeuPX7G","fcwDatl72W","SbRYyGXdoH","aFFssh1zcH","8FmFH48cHL","FwEJzhUTw7","CdyBV07n1c","gf8rIVprf2","POUYSFhtgl",
+"7fKYUxXTI4","K4GS8t98iW","HfyNQzmLYD","8xEKzdhSuH","BGaQYF6PT2","jiVBPxXTI4","55rfBcL0aE","gdQsSZUnqt","0Kyfs4QMc9","8cVD3AIYUu",
+"Zv7z05IhmG","580YD5drc6","xReec45cIH","tl72WMkgy8","8cVD3LbRTH","tlILtHzZT8","ydG8U6AFT0","JIqXipiJSk","zz4ZU4dEz6","iqv4kv8yFN",
+"JJs5m1LB1L","CxVEfOUqFM","iKqhr24ARF","v8yFN24ARF","WPmlxdjsrv","JRJQBuoStw","CIShGhUTw7","oGu6xJXljW","aL6AJ0PktI","aL6AJUvlv4",
+"WMiS3tlILt","mX2GEAkKTk","jzUqR9rlg9","MmsIoAXpwE","JkzUntAOsr","wiHrZFhtgl","4QMc9Dz1R3","uQIczt98iW","uAWyppmeCd","4dEz6jfREu",
+"iKqhrRsQUq","M6qcGuTacx","8cVD3ydG8U","TwanoOUqFM","sqVrf6q6L9","lCMxyGWqqX","euZA524ARF","v2eC32DREs","guMb8uN6r3","gf8rI48cHL",
+"2DREsqUJMd","bZLvSvOqCE","jS1ajfqypy","MezSWfaHir","VBjhztaOXK","0h1b1MaJQs","jfREuqUJMd","QnJ1SqUJMd","7Ow5C2Nslm","NOHsz2TRI7",
+"618DiCxVEf","SWfouCdyBV","gdQsSnnP8o","nnP8ofFDrJ","XflUq0BmCy","YjB9tFnPFB","C2IrchUTw7","CIShG9eoRc","sqVrf7fsYM","fqypyfcJOy",
+"Dz1R3WMiS3","b29RJMojnP","FLsph0BmCy","tuDySzqH0W","DLhzMTCgPp","i7WMQfcJOy","5Mg9rOHaBz","pT8wuOxWIH","1j5L87fsYM","618DiMm8si",
+"KZamHFcWrW","2TRI7lpF6W","WmadAuLtKs","EoToPNOHsz","QChxsDQimp","UmaEvcL0aE","FwEJzpiJSk","v2eC3pv0i7","LDk6fbgJAz","Z4I1vdjsrv",
+"MGlTFLDk6f","cQOnvsoy9t","bZLvSlj07Q","Yf2Ec9rlg9","WPmlxtaOXK","Cp3mZK20wK","C2IrccL0aE","1LB1LOUYuF","WreyPjtn0X","yofH3FGzgp",
+"7fKYUWMiS3","24ARFVerEA","24ARFL7cGc","G1RhSk85Ae","0ao3ldjsrv","okgRipWiOs","e6e4z2Nslm","dmoS7uTacx","MezSWuupzk","WPmlxChuy3",
+"vkCHHsuY4x","e6e4z3weIF","Yf2EcJKWYR","Vprf2IjTwP","t98iW9rlg9","ulk41fFDrJ","DcpWBGv3Fq","jtn0X0YAGH","oVQp6BbwgA","l83UdGv3Fq",
+"8hJdtcL0aE","ydG8Ulm0pD","LDk6fhSSvQ","Ss0ZujzUqR","24ARFMojnP","lpF6W8TxD7","BGaQYMojnP","07n1ch1zcH","BGaQYQ6hMC","yToGWVNCPd",
+"FhtglHP433","ReKEW2TRI7","MK07YKASQ8","gdQsSni2v1","4dEz6cShY2","Ul4a1uvf7A","AOgEeOz8yZ","BFkb8RpBQm","blLA91v5hH","iwzGksoy9t",
+"pT8wupWiOs","Gv3FqdQ586","Vprf2IRh48","AgJHQBbwgA","qaofNCfgr3","WPmlx9rlg9","h1zcHBFkb8","jtn0Xe6e4z","fmIK1tAOsr","Ta8f6No0Qb",
+"5Drn0fcJOy","8cVD39GXkX","ZuDtDpv0i7","2DREsBCxeC","2Yz7EAmdQd","I7p2a45cIH","MojnPvkCHH","0KyfsksJby","WaWsvJkzUn","FFDuiL7cGc",
+"AmdQde6e4z","hSSvQCfgr3","ZJTXHVLTy6","hYBCKMm8si","2Yz7EwiHrZ","ZUnqtCfgr3","bgJAzRxrsm","M6qcGuvf7A","VLTy6zHF1q","v1HlnnnP8o",
+"MmKGJJXljW","OHaBzQworu","tl72WBFkb8","618DiyEfy9","Kr8ys07n1c","Ss0ZuPYBf4","16lHcuLtKs","uvf7AKASQ8","9rlg9sqVrf","MmsIoxReec",
+"qQxHPsqVrf","U3yw55drc6","tvdkDtAOsr","TwanoCNHmv","2hEEUYw2oU","zFgtBguMb8","atef2ksJby","ReKEWSjskQ","iqv4k4QMc9","hUTw76q6L9",
+"d85a9lXFOB","uupzkM3zXL","RpBQmsoy9t","45cIHm4bxU","FxX9qQnJ1S","prNT6TXQ0Z","X6PinDLhzM","FLsph9GXkX","okgRiUmaEv","0KyfslweGy",
+"WaWsvpiJSk","blLA9AXpwE","W3VFHJ2mQi","G1RhStaOXK","qaofNvLsmS","2NslmW7cTs","dhSuHQnJ1S","iqv4kQ6hMC","RsQUqRACuj","0ao3lF6PT2",
+"tl72WIjTwP","StlDJY1mC0","LDk6fd85a9","pFrrlFGzgp","RpBQmGXdoH","tjQxslweGy","fLNg8GSQwj","ix74rprNT6","7lUXZGXdoH","KASQ8jeskS",
+"FFDuiD6rBy","pWiOsfFDrJ","EdBKcSbRYy","rhl0Jru4UG","uTacxW3VFH","lsQGozqH0W","qaofNuN6r3","EdBKcrz7Ut","U3yw57hyVv","7hyVv618Di",
+"faHir8xEKz","SbRYyuoStw","rz7Ut5IhmG","zmLYDUmaEv","F6PT245cIH","XyPZNDG4sT","7ku1pYh1hF","Ul4a1FcWrW","55rfB8hJdt","5iGN55IhmG",
+"0ao3lWaWsv","K4GS8B3qem","Zv7z0ciuWz","yvOMIZuDtD","gjUTuUmaEv","ciuWzgf8rI","t98iWs93Ml","gdQsSHRxd8","yToGWv1Hln","cShY2s93Ml",
+"0Wr5yjfREu","J2mQi0MR5X","1v5hH8FmFH","Fhtgld85a9","KASQ8gf8rI","BpYhVQnJ1S","kZANm2ZHdk","M6qcG55rfB","QnJ1SaDGtS","TCgPp7ku1p",
+"uJScXJXljW","nnP8oOz8yZ","IBe8kjtn0X","yEfy9AkKTk","48cHLWPmlx","8RCUA8RCUA","djsrvB3qem","IRh48JRJQB","iwzGkQnJ1S","WMiS3lpF6W",
+"zqH0WOxWIH","FcWrW48cHL","VBjhzxciqp","hUTw7B3qem","2NslmtlILt","zQt6Qxciqp","vLsmS7hyVv","0YAGHyofH3","MmKGJCNHmv","MmKGJTwano",
+"YjB9tLewvM","hUTw7zqH0W","jS1aj8FmFH","NOHsz5nmWv","qUJMdfqypy","EdBKc55rfB","UmaEvOz8yZ","7fKYUOHaBz","ciuWztlILt","lXFOBVprf2",
+"S77LHjzUqR","XflUqWreyP","yEfy9WmadA","prNT6HfyNQ","Oz8yZJRJQB","t98iWFnPFB","t98iWCxVEf","FGzgpZhwG1","EoToPRxrsm","8TxD7QnJ1S",
+"hi5X7taOXK","lpF6WcmXIX","okgRiLDk6f","mX2GE5ZaEz","uvf7AKsjRK","Yw2oUlH1kt","Yw2oUPYBf4","8RCUAFxX9q","AIYUutlILt","TXQ0Zru4UG",
+"5nmWvuupzk","WreyPsqVrf","DG4sTy94nw","BFkb8d7vjM","LDk6fYOfrY","ZuDtD0BmCy","qUJMdRsQUq","Mkgy8VjCZq","ECMvU24ARF","55rfBJJs5m",
+"zFgtBCK5W7","9GXkXzQt6Q","In3NSSbRYy","s93Mll83Ud","In3NSa00b5","OxWIH3otm6","45cIH8U2nU","dhSuHCxVEf","d85a9HlUbF","jtn0XBbwgA",
+"lpF6WfFDrJ","5VZjSLDk6f","2hEEUnFqik","aDGtS4dEz6","Fhtglzz4ZU","zY1GYJKWYR","8RCUAFPfSE","TCgPpSjskQ","8TxD7SmGzv","FFDuibgJAz",
+"bgJAzh1zcH","nnP8oQnJ1S","07n1c2ZHdk","CIShGPYBf4","EOE1oQnJ1S","faHir6q6L9","AXpwE0BmCy","jtn0XZuDtD","9y4lwIRh48","Nxx9ViKqhr",
+"uZPqgzz4ZU","StlDJD6rBy","7fKYUs7Mxk","iwzGki7WMQ","XyPZNF6PT2","MK07Y0YAGH","fmIK1i7WMQ","uPX7GL7cGc","o8UydyEfy9","i7WMQHzZT8",
+"LewvMWaim6","zmLYDuTacx","atef2CIShG","FLsphdpe1v","pT8wuSbRYy","ix74rdQ586","yToGWuJScX","O3iyQO3iyQ","o8Uyd29QAz","RkQkeS2Dfu",
+"QYxC0aFFss","0BmCytjQxs","IBe8kGv3Fq","azIWp8RCUA","Yh1hFQClRL","7lUXZHlUbF","ogLgcDcpWB","NAFuw64s8N","QClRLnnP8o","s4786GrDg7",
+"5ZaEzDcpWB","5IhmGPOUYS","580YDNOHsz","Dz1R3S77LH","QssNC07n1c","0ao3lrhl0J","qaofNXyPZN","HfyNQzHF1q","iqv4kFGzgp","lH1ktCqqaD",
+"KZamH2DREs","rhl0JiB08l","F6PT2Oz8yZ","tjQxsAkKTk","I7p2a16lHc","UmaEv6q6L9","Z4I1vbZLvS","VerEAd85a9","gdQsSBFkb8","FNYIMMmKGJ",
+"Kr8yslpF6W","Yf2EcxXTI4","0KyfsQbxXc","45cIHdmoS7","pWiOsguMb8","h1zcHOHaBz","m4bxUQChxs","9GXkXzz4ZU","FhtglIjTwP","FVMxo9y4lw",
+"pWiOsBbwgA","0YAGHuTacx","e6e4zU3yw5","QnJ1SYw2oU","S77LHReKEW","ReKEWtAOsr","lj07QGSQwj","BGaQYZuDtD","8FmFHlCMxy","RmDcrciuWz",
+"StlDJYh1hF","x3LDeVerEA","580YDtlILt","lweGyK20wK","5iGN5Nxx9V","lsQGoMm8si","55rfB48cHL","O3iyQ0YAGH","AXpwEWDVWJ","xReecDcpWB",
+"ix74rdpe1v","aFFssatef2","2Nslmuupzk","lj07QgdQsS","4W0TliwzGk","djsrvBGaQY","aDGtSY1mC0","8xEKzQnJ1S","DLhzM3otm6","TwanohSSvQ",
+"EdBKcW7cTs","HfyNQsoy9t","OUqFMQnJ1S","QWxoTyvOMI","uTacxokgRi","d85a9IRh48","C2Irc0MR5X","k85AeMaJQs","jiVBPuTacx","5iGN5J2mQi",
+"uupzkcL0aE","OxWIHSbRYy","FVMxo6AFT0","rz7UtRmDcr","gf8rIRxrsm","brhlQZuDtD","HlUbFG1RhS","b29RJ9GXkX","HRxd8oQ87r","zz4ZUkB5nP",
+"n8pJ9pFrrl","CNHmvAXpwE","cL0aEhUTw7","wDajXW7cTs","FLsphtuDyS","CNHmvGv3Fq","NcICATwano","jfREuuLtKs","WmadA07n1c","RBhp0AXpwE",
+"AmdQdi3pyd","580YDv2eC3","LDk6fKASQ8","fLNg8uTacx","1j5L8JIqXi","KASQ8Mkgy8","4QMc9tl72W","XyPZN0MR5X","lweGyCfgr3","YjB9t5nmWv",
+"VNCPd8TxD7","t59lRnFqik","gdQsSFnPFB","TXQ0ZZuDtD","Ta8f6CdyBV","BpYhVBpYhV","FwEJzCIShG","0PktI8xEKz","fmIK1XflUq","NOHszU3yw5",
+"FPfSE3otm6","YOfrYZuDtD","nlaByQYxC0","FFDuiNcICA","Ss0Zu5VZjS","CNHmvaDGtS","AIYUuqaofN","zQt6QjiVBP","gdQsSRkQke","Yh1hFuvf7A",
+"EOE1ofcJOy","jtn0XfFDrJ","o8Uyd1j5L8","s7MxkKsjRK","F6PT2hUTw7","wiHrZuTacx","VIlwPdpe1v","Q6LixcShY2","HzZT8tvdkD","AOgEeGXdoH",
+"7ku1p5iGN5","YjB9ty94nw","lkMUAulk41","RkQkeW3VFH","aDGtSHlUbF","HlUbFuAWyp","7Ow5CZUnqt","tjQxsjzUqR","FFDuifFDrJ","Oz8yZVprf2",
+"DQimpFcWrW","MmKGJDz1R3","zHF1qQworu","55rfBWmadA","FnPFBRkQke","uoStwgf8rI","2TRI7Yw2oU","EoToPpmeCd","iwzGkDcpWB","ECMvUUmaEv",
+"IjTwPzQt6Q","uJScX5Namm","8TxD7P6bcg","h1zcHJ2mQi","IjTwP8RCUA","jfREuM3zXL","RsQUqhUTw7","i7WMQiqv4k","dpe1vECMvU","Gv3Fqd7vjM",
+"64s8NyToGW","gdQsSGXdoH","YjB9tECMvU","580YD2DREs","QWxoTNhXdu","FNYIMFVMxo","VNCPdFVMxo","dpe1vBFkb8","cmXIXW7cTs","POUYSCxVEf",
+"mz8gx7Ow5C","RBhp0OxWIH","e6e4zReKEW","hSSvQulk41","EoToPtvdkD","hYBCKmX2GE","Zv7z0dQ586","LewvMF6PT2","jSjS30PktI","fcJOyYf2Ec",
+"SjskQt98iW","OHaBzFcWrW","FxX9qW3VFH","RBhp0HfyNQ","QbxXcJRJQB","0MR5X14FLR","GWqqXlH1kt","FLsphvLsmS","l83Udrhl0J","wDajXZJTXH",
+"Ss0ZuRxrsm","VNCPdlpF6W","BpYhVLDk6f","uTacxfqypy","XyPZNEdBKc","MezSWhi5X7","F6PT216lHc","BFkb8Mm8si","C2IrctuDyS","v2eC3VIlwP",
+"7Ow5C4W0Tl","XflUqAOgEe","FNYIMnFqik","POUYSTXQ0Z","Dz1R3jtn0X","rKDLJReKEW","9y4lwxciqp","ECMvU0YAGH","MezSW8hJdt","8FmFHuTacx",
+"RmDcrFLsph","lweGyWmadA","y94nwSWfou","pWiOsNAFuw","StlDJW7cTs","SbRYyZ4I1v","uN6r32DREs","VNCPdWMiS3","zY1GY8RCUA","K20wKBCxeC",
+"uQIczYw2oU","rhl0Jtl72W","zz4ZUM6qcG","ECMvUo8Uyd","uZPqgbgJAz","ZhwG1WaWsv","tuDySs93Ml","NAFuwzQt6Q","uN6r3CdyBV","HfyNQHzZT8",
+"WPmlxJkzUn","d85a9W3VFH","gdQsSCqqaD","07n1c0MR5X","WPmlxcQOnv","euZA5FPfSE","0YAGHhUTw7","VIlwPuPX7G","OUqFMKr8ys","No0Qbiqv4k",
+"n8pJ97lUXZ","guMb8yToGW","AkKTkgjUTu","dQ586jtn0X","SbRYy45cIH","L7cGcCxVEf","RsQUqdjsrv","aL6AJ9eoRc","5ZaEz2Yz7E","uLtKsokgRi",
+"0BmCy2DREs","ru4UG8RCUA","lH1ktS77LH","ix74ratef2","tjQxsYf2Ec","StlDJVprf2","XyPZNn1pmO","9GXkX55rfB","JJs5miwzGk","S2DfuiB08l",
+"iKqhr9GXkX","k85AeFxX9q","lweGyVBjhz","In3NSxciqp","iwzGkdjsrv","P6bcgCNHmv","b29RJlweGy","y94nwjeskS","lm0pDzY1GY","QChxsGSQwj",
+"EoToPfcJOy","4QMc90h1b1","9rlg9uN6r3","OxWIHbrhlQ","RpBQmK4GS8","uN6r3Yh1hF","hE1QlvLsmS","9eoRcaDGtS","0h1b1h1zcH","S77LHokgRi",
+"7hyVv14FLR","MGlTF5Drn0","okgRi618Di","0Wr5yBCxeC","TwanoCIShG","hi5X7uZPqg","VerEAdhSuH","taOXKru4UG","oVQp6QClRL","oGu6xLDk6f",
+"yofH3piJSk","rKDLJzmLYD","TCgPpru4UG","pT8wuTa8f6","FwEJzFxX9q","RpBQmulk41","fcJOyZUnqt","WDVWJpAhR1","QWxoTbZLvS","aez9yhe9IA",
+"2NslmYw2oU","tjQxs6AFT0","fLNg8bgJAz","qUJMd2Yz7E","cmXIX9eoRc","vkCHH0Wr5y","FcWrWSmGzv","pv0i7pAhR1","zFgtBzbIYY","ZhwG1s93Ml",
+"VIlwPVNCPd","h1zcHHzZT8","rz7UtI7p2a","i3pyd5nmWv","fFDrJFcWrW","7fsYMrhl0J","Twanod85a9","Yf2EcdQ586","jSjS3soy9t","WMiS3P6bcg",
+"ZJTXHAgJHQ","EdBKckB5nP","pWiOspWiOs","uLtKsYh1hF","J2mQiUlU3M","1j5L8HfyNQ","CdyBV9XyT9","iKqhrjfREu","OxWIHTXQ0Z","5VZjSeuZA5",
+"0ao3llpF6W","F6PT2dhSuH","lkMUA8U2nU","lweGypiJSk","uZPqguupzk","oVQp6yofH3","MezSWBpYhV","QYxC0ulk41","FGzgpprNT6","6q6L9580YD",
+"nlaByZzJHW","MojnPlsQGo","9rlg9i7WMQ","RpBQmlCMxy","0BmCyK4GS8","Oz8yZdQ586","d85a9NhXdu","LbRTHFhtgl","WreyPk85Ae","n1pmOv8yFN",
+"UlU3MW7cTs","BpYhVThjNn","MK07YfLNg8","45cIH8FmFH","0KyfsogLgc","mX2GEaL6AJ","OUqFMFVMxo","F6PT2hSSvQ","VBjhzHP433","Ul4a1Nxx9V",
+"blLA9Q6Lix","tlILt0Wr5y","4W0TlHP433","Oz8yZpvgjS","3weIF1LB1L","BCxeCvkCHH","uPX7GQClRL","RzaZATXQ0Z","GWqqXL7cGc","DQimpFGzgp",
+"8TxD7cQOnv","8hJdtYf2Ec","uPX7GxXTI4","2DREshSSvQ","ksJbyn8pJ9","NOHszfaHir","NAFuwh1zcH","Zv7z0i3pyd","8cVD3lsQGo","jeskSfcwDa",
+"7X3uyzFgtB","5IhmGGXdoH","gdQsSyluBx","rz7Ut7X3uy","SWfouX6Pin","Ss0ZuiKqhr","Dz1R30MR5X","fcJOy0h1b1","cmXIXjzUqR","uTacx9y4lw",
+"0MR5XjzUqR","IKxdLuoStw","fmIK1EOE1o","EoToPJJs5m","Pb1pajzUqR","P6bcgaL6AJ","F6PT27fsYM","CxVEfFhtgl","lkMUAbgJAz","Ul4a1Ul4a1",
+"S77LHksJby","a00b5sx5Gl","nnP8olm0pD","07n1c9eoRc","b29RJJKWYR","bgJAziwzGk","WaWsvMK07Y","v2eC3t98iW","4QMc94dEz6","iKqhrdQ586",
+"jS1ajjiVBP","iB08lCNHmv","zQt6QgdQsS","Z4I1vv1Hln","okgRi7X3uy","CxVEf45cIH","sx5GlAIYUu","tl72WbZLvS","S2DfunFqik","C2IrcTa8f6",
+"WmadAn8pJ9","y94nwUlU3M","uTacxjtn0X","ZhwG1ni2v1","QClRLQChxs","uZPqg48cHL","0PktIpAhR1","fcJOys7Mxk","pvgjSzQt6Q","pWiOsciuWz",
+"s7Mxk618Di","1LB1LWmadA","lj07QzmLYD","Vprf2TCgPp","xReecGv3Fq","zqH0Wk85Ae","3weIFdhSuH","9iGoTFxX9q","3otm6uN6r3","UmaEvn1pmO",
+"W3VFHAOgEe","jiVBPCfgr3","IjTwPfcJOy","In3NSydG8U","X6PinvkCHH","ogLgcHRxd8","IRh48kZANm","YOfrYi3pyd","0BmCylViBv","7fsYM618Di",
+"DG4sTIRh48","VLTy6pAhR1","RACujzFgtB","lViBv55rfB","jfREusqVrf","WPmlxTCgPp","YjB9tjfREu","SbRYyKZamH","aDGtStuDyS","bZLvSqaofN",
+"Kr8ysQssNC","ReKEWYw2oU","Nxx9VJKWYR","xReecuoStw","7X3uyTXQ0Z","xXTI4MmKGJ","Vprf28RCUA","d7vjMaL6AJ","7fsYMRBhp0","5nmWv2hEEU",
+"FcWrW9eoRc","ydG8UBbwgA","y94nwHRxd8","fLNg8BCxeC","fFDrJZhwG1","iqv4kguMb8","GXdoHVprf2","jSjS3Ul4a1","iqv4kpFrrl","zHF1qYf2Ec",
+"oGu6x9GXkX","580YD9iGoT","2DREsfcJOy","jtn0XYOfrY","azIWp9iGoT","aDGtSogLgc","uvf7ARxrsm","RpBQmZuDtD","8RCUAQClRL","BbwgAxciqp",
+"RzaZAW7cTs","lCMxyOUqFM","wiHrZGWqqX","JJs5maFFss","4dEz6brhlQ","lweGy7fsYM","HlUbF5Drn0","14FLRgjUTu","uN6r3pmeCd","zz4ZUjzUqR",
+"JkzUnQssNC","FVMxoazIWp","8U2nUJIqXi","RBhp0t98iW","In3NSVjCZq","yofH3ulk41","24ARFW3VFH","SbRYyYOfrY","aL6AJlkMUA","2NslmQnJ1S",
+"580YD7ku1p","HRxd8gjUTu","0ao3l4dEz6","prNT6Yf2Ec","FFDuiM6qcG","ksJbyrKDLJ","m4bxU3otm6","CxVEfyluBx","RxrsmhE1Ql","Zv7z0brhlQ",
+"hUTw7piJSk","lm0pDZzJHW","HRxd8Pb1pa","lm0pDaez9y","zFgtB2TRI7","hYBCK2Nslm","BCxeCaL6AJ","BGaQYSjskQ","Yf2EcMK07Y","SmGzvYw2oU",
+"cL0aEyToGW","GXdoHFLsph","FVMxoStlDJ","bZLvSaL6AJ","6AFT0hYBCK","0PktIkZANm","yEfy9Mkgy8","rz7UtFjHXR","yToGWBpYhV","Nxx9VVjCZq",
+"vOqCERzaZA","cL0aE2TRI7","oQ87ryluBx","MmsIolweGy","0ao3lZuDtD","In3NSDLhzM","he9IAMezSW","zQt6Q580YD","fqypy0Wr5y","2DREsmz8gx",
+"jiVBPAOgEe","d85a9WreyP","L7cGcB3qem","I7p2aOHaBz","1j5L84W0Tl","tuDySni2v1","QChxss4786","lm0pDm4bxU","fqypys93Ml","ZJTXHoGu6x",
+"uupzkmz8gx","jeskSuPX7G","uN6r3blLA9","DQimp1j5L8","sqVrf5ZaEz","jS1ajokgRi","n8pJ9DQimp","k85AewDajX","MK07YKZamH","XyPZNAmdQd",
+"NcICAQClRL","hi5X79XyT9","WreyPtjQxs","gjUTufqypy","0PktIGSQwj","MojnPv1Hln","e6e4z7ku1p","Waim6LewvM","fcwDafcJOy","pFrrlix74r",
+"5iGN5G1RhS","U3yw5LbRTH","AkKTkB3qem","soy9tpT8wu","ix74rTCgPp","AkKTkSWfou","gIYvE8TxD7","pWiOsNo0Qb","45cIHQWxoT","AOgEeNAFuw",
+"K20wKZUnqt","Uvlv4In3NS","i7WMQatef2","VLTy6AmdQd","45cIHlm0pD","Vprf2VBjhz","guMb89iGoT","hUTw7oGu6x","yofH3CxVEf","lpF6W9rlg9",
+"uAWyplweGy","y94nwFNYIM","uJScXIn3NS","1LB1L5IhmG","XyPZNx3LDe","vLsmSl83Ud","RpBQmF6PT2","iqv4kiKqhr","5nmWvtl72W","hYBCK64s8N",
+"pvgjSP6bcg","AgJHQEoToP","Q6Lixo8Uyd","y94nwfqypy","64s8NPb1pa","YOfrYuTacx","qaofNbgJAz","AkKTkUl4a1","BFkb85nmWv","ZJTXHsoy9t",
+"JXljWGrDg7","DLhzMiKqhr","DG4sT55rfB","uupzkfaHir","FjHXRydG8U","CIShG0YAGH","zQt6QGSQwj","VerEAFVMxo","uoStwZ4I1v","Yh1hFIjTwP",
+"ru4UGWaim6","qUJMd6q6L9","iB08lrhl0J","oQ87rWaWsv","pWiOs9iGoT","vkCHHy94nw","EdBKcPb1pa","fqypy0ao3l","hUTw7RBhp0","Vprf2Pb1pa",
+"tuDySwiHrZ","dQ586580YD","hi5X74W0Tl","HlUbFo8Uyd","9iGoTFVMxo","2ZHdkyvOMI","DLhzMPb1pa","Qworu5VZjS","VIlwPBGaQY","ni2v1iqv4k",
+"Waim6ydG8U","VLTy6jfREu","618DilViBv","tl72W9y4lw","n8pJ9rhl0J","AgJHQL7cGc","7fKYUVIlwP","Nxx9VOz8yZ","a00b5D6rBy","yluBxIjTwP",
+"IKxdL5VZjS","QnJ1SiB08l","zHF1qIRh48","k85AeJRJQB","euZA5uvf7A","gdQsSAXpwE","hUTw7pAhR1","P6bcgFVMxo","16lHc5Namm","faHirtuDyS",
+"ni2v1vOqCE","2ZHdkiwzGk","VNCPdqUJMd","D6rByd85a9","ECMvUQnJ1S","9rlg9AIYUu","5Drn0MaJQs","MezSWDcpWB","dpe1v48cHL","DG4sTgjUTu",
+"Gv3Fqrhl0J","hUTw7a00b5","iqv4k2DREs","5Mg9r48cHL","HzZT864s8N","VerEAfaHir","JIqXisuY4x","9y4lweuZA5","lm0pDOUYuF","Mm8sijtn0X",
+"Chuy3MmsIo","YOfrYThjNn","xReecAmdQd","o8UydCK5W7","FFDuiFwEJz","KASQ8In3NS","ZhwG1U3yw5","8TxD79XyT9","MojnPAgJHQ","S77LHChuy3",
+"b29RJWreyP","VIlwPECMvU","n8pJ9cL0aE","BFkb8DQimp","aez9yrz7Ut","4W0TlEdBKc","CIShGOz8yZ","taOXKyEfy9","Yh1hFfFDrJ","lXFOB0Wr5y",
+"rhl0J5Namm","2Yz7EfcJOy","atef2AXpwE","16lHc16lHc","cShY2MmKGJ","GXdoHnFqik","7fKYUP6bcg","JkzUnaez9y","M3zXLBCxeC","NAFuwAkKTk",
+"tuDySFcWrW","fqypySjskQ","Oz8yZD6rBy","UlU3MThjNn","8U2nU0Kyfs","ciuWzSs0Zu","RsQUqFGzgp","MmsIos93Ml","lsQGoQnJ1S","OUYuF8FmFH",
+"Q6Lixd7vjM","Ss0ZuEoToP","7X3uy9iGoT","t59lRYh1hF","W7cTs0BmCy","uQIczMkgy8","OHaBzwiHrZ","qaofNYh1hF","nFqik3weIF","dQ586VjCZq",
+"lpF6Wk85Ae","lsQGos93Ml","cShY2GSQwj","mz8gxI7p2a","7X3uyuoStw","lkMUAI7p2a","fmIK1NOHsz","K4GS8mz8gx","Chuy3RmDcr","WreyPuupzk",
+"dmoS7jeskS","JKWYRl83Ud","3otm6Ta8f6","9iGoTyluBx","tAOsr5IhmG","TCgPpJkzUn","jiVBPK4GS8","FGzgpRkQke","Pb1pay94nw","uQIczksJby",
+"RsQUqpiJSk","QbxXcv1Hln","qUJMdNAFuw","Mm8siYw2oU","5Mg9rrKDLJ","M6qcGuZPqg","KsjRK7Ow5C","HRxd8d7vjM","iqv4kk85Ae","CK5W7euZA5",
+"B3qemJkzUn","cShY2AkKTk","CqqaDlH1kt","POUYSNOHsz","BCxeCYw2oU","KsjRK8xEKz","1j5L8zmLYD","d85a9XyPZN","d7vjMOz8yZ","L7cGcECMvU",
+"YjB9tcmXIX","AXpwEAOgEe","9y4lw8xEKz","Nxx9VStlDJ","t98iWZJTXH","5drc6m4bxU","GrDg7WmadA","4QMc9v2eC3","F6PT2kZANm","CdyBVyEfy9",
+"RxrsmtaOXK","uQIczjzUqR","cmXIXNhXdu","cQOnvRkQke","CxVEfRkQke","GXdoHzbIYY","NhXduRkQke","AkKTkWDVWJ","lm0pDuZPqg","pmeCdtjQxs",
+"8RCUAjiVBP","b29RJFGzgp","o8UydVerEA","StlDJxciqp","0BmCyzY1GY","tuDySpFrrl","SjskQnlaBy","BbwgAbrhlQ","zmLYDuJScX","CdyBVQssNC",
+"JkzUnrKDLJ","TwanoIKxdL","BpYhVulk41","l83Ud7fKYU","6q6L9LewvM","iqv4klweGy","NOHsztuDyS","UlU3MpmeCd","NcICAnnP8o","0MR5X0YAGH",
+"he9IAm4bxU","guMb814FLR","aL6AJfcwDa","HfyNQMezSW","gtCA524ARF","RzaZAuTacx","MK07YPYBf4","fqypyxXTI4","ThjNn6q6L9","jzUqRjfREu",
+"LewvMfFDrJ","8hJdtpFrrl","AXpwEzHF1q","FPfSERBhp0","xReec1v5hH","GrDg7brhlQ","ZJTXHCfgr3","jtn0XTXQ0Z","o8UydZJTXH","gf8rIoGu6x",
+"FhtglJKWYR","guMb8fmIK1","HzZT81LB1L","tvdkD2ZHdk","VerEAJIqXi","hYBCKK20wK","euZA5RpBQm","i7WMQ2TRI7","WaWsvfLNg8","xciqpGrDg7",
+"s93MlOxWIH","hE1QlSjskQ","KASQ8VjCZq","x3LDet59lR","JIqXiksJby","cmXIXM3zXL","Yh1hF9iGoT","J2mQi9rlg9","FFDuiHP433","ix74rlm0pD",
+"lH1ktuoStw","ZJTXHaL6AJ","cL0aE5Namm","tlILtprNT6","fqypylkMUA","MaJQsNcICA","UlU3MJIqXi","t98iWBCxeC","uLtKsQworu","2TRI7WPmlx",
+"fcJOyMaJQs","jSjS3uAWyp","zmLYDRxrsm","5Mg9rfcJOy","okgRi1v5hH","5Namme6e4z","7lUXZJkzUn","iB08lCqqaD","0Kyfszz4ZU","Y1mC0EdBKc",
+"9XyT9soy9t","FcWrW3otm6","fmIK17fsYM","IBe8k8hJdt","7X3uy1LB1L","BGaQYoVQp6","2DREsTwano","lCMxy8RCUA","rz7UtUl4a1","taOXKAIYUu",
+"1LB1LReKEW","s7MxkiB08l","xReec4QMc9","a00b57lUXZ","TXQ0ZStlDJ","2ZHdk0YAGH","VLTy6s93Ml","nFqikuvf7A","QbxXcVprf2","uoStwAXpwE",
+"zHF1q3otm6","cShY2NcICA","Ss0ZuzHF1q","CqqaDCfgr3","7fKYUUvlv4","jeskSn1pmO","DcpWBqUJMd","y94nwhYBCK","wDajXLbRTH","soy9t8FmFH",
+"XflUquoStw","NhXduaez9y","Ss0ZumX2GE","OHaBzFPfSE","BpYhVBbwgA","oGu6x8cVD3","M6qcGeuZA5","7X3uydjsrv","tlILtEdBKc","4W0TltAOsr",
+"oVQp6X6Pin","9eoRcx3LDe","lweGyCIShG","iwzGk16lHc","5ZaEzbZLvS","gIYvENo0Qb","sx5GlhSSvQ","lCMxyNhXdu","fqypy5Mg9r","Rxrsm7ku1p",
+"bZLvStvdkD","l83UdBGaQY","2NslmGv3Fq","DQimpWPmlx","CdyBVBGaQY","2DREs7ku1p","MmsIoFVMxo","POUYSWMiS3","tjQxsS77LH","kB5nPFGzgp",
+"YjB9taL6AJ","EoToPokgRi","Ta8f6aL6AJ","suY4x7hyVv","FPfSEh1zcH","9y4lwGWqqX","zmLYDd85a9","JIqXi3weIF","ru4UGQ6hMC","2hEEUi3pyd",
+"zqH0W7hyVv","pWiOssoy9t","0PktIB3qem","lpF6WHP433","jeskSzY1GY","uQIcztlILt","hUTw72Yz7E","jeskSZzJHW","bgJAzCxVEf","djsrvuLtKs",
+"7lUXZ8U2nU","ru4UGChuy3","29QAzNAFuw","EoToPdQ586","bgJAzjSjS3","xciqpKsjRK","9eoRc6AFT0","ZJTXHBCxeC","14FLRb29RJ","GWqqXY1mC0",
+"jeskSMm8si","sx5GllCMxy","fmIK13weIF","XyPZNG1RhS","wDajXrhl0J","7lUXZPYBf4","AmdQdjSjS3","dpe1v7lUXZ","ix74r1j5L8","Dz1R3Yw2oU",
+"SmGzvzqH0W","RzaZA2hEEU","8TxD7M3zXL","CNHmvzHF1q","sqVrfNcICA","FVMxotjQxs","uoStwMezSW","k85AeX6Pin","vkCHHRpBQm","Waim6d7vjM",
+"pT8wuQClRL","fLNg8ni2v1","2TRI7CxVEf","SjskQ0h1b1","LewvMM3zXL","7X3uyAkKTk","HP433LewvM","P6bcg9y4lw","tAOsrprNT6","lm0pD9eoRc",
+"JkzUn2Nslm","guMb8ZuDtD","LbRTHVerEA","bgJAzHlUbF","m4bxU5VZjS","zqH0W16lHc","fcJOyYw2oU","yofH3lCMxy","QWxoToQ87r","v8yFNGXdoH",
+"FhtglBFkb8","BFkb8yToGW","o8UydtuDyS","zbIYYx3LDe","HfyNQlm0pD","k85AeblLA9","guMb8Rxrsm","d85a9n8pJ9","lj07Q5IhmG","azIWpsuY4x",
+"8U2nUuvf7A","ZzJHWm4bxU","EoToPaL6AJ","Yh1hFlViBv","FFDuidhSuH","618Di580YD","D6rBySWfou","9eoRc9rlg9","aez9y580YD","jS1aj3otm6",
+"0MR5X7Ow5C","ECMvU07n1c","VLTy6KZamH","zqH0WazIWp","No0QbPb1pa","h1zcHlCMxy","jfREu2ZHdk","uLtKsxXTI4","MezSWVIlwP","AOgEeokgRi",
+"uPX7GOUqFM","lweGyVNCPd","Mm8sinlaBy","aFFssI7p2a","0BmCy5Drn0","Yw2oURACuj","mz8gxk85Ae","MmKGJv1Hln","aez9yuAWyp","W3VFHgtCA5",
+"QnJ1SyEfy9","Q6hMCs93Ml","gjUTu24ARF","In3NS5IhmG","Qworu7fsYM","uvf7APOUYS","mz8gxlCMxy","KASQ8HP433","v2eC3faHir","gjUTuZhwG1",
+"SbRYyYh1hF","GrDg7rhl0J","RkQkeuN6r3","W7cTsBpYhV","0ao3lQChxs","29QAzTCgPp","jS1ajaL6AJ","WDVWJQnJ1S","GSQwjlXFOB","0BmCyYjB9t",
+"8xEKzjS1aj","5nmWvo8Uyd","QnJ1SaL6AJ","mX2GERmDcr","nFqikuJScX","jfREu8cVD3","m4bxUcL0aE","xXTI4FjHXR","NAFuwZUnqt","QYxC0dpe1v",
+"29QAz618Di","YjB9tpAhR1","Cfgr3dQ586","hUTw7ZzJHW","0YAGHQssNC","ksJbyt98iW","lweGyMm8si","mz8gxiB08l","b29RJ9rlg9","okgRiaL6AJ",
+"vkCHH7X3uy","l83UdVLTy6","Cfgr3LewvM","tjQxsO3iyQ","J2mQiCdyBV","SWfouyToGW","s93MlaL6AJ","YjB9tIn3NS","JRJQBM3zXL","mX2GED6rBy",
+"dQ586guMb8","m4bxUL7cGc","s7MxkSjskQ","mX2GE5VZjS","RBhp0s93Ml","5iGN5QChxs","4dEz68hJdt","5Drn014FLR","djsrvlj07Q","jtn0X6AFT0",
+"vkCHHo8Uyd","7lUXZkB5nP","t59lRyofH3","RpBQmKr8ys","7X3uyQbxXc","OHaBzn1pmO","fcJOyQChxs","Yf2Ec5Mg9r","24ARF64s8N","4QMc9yofH3",
+"9iGoTlkMUA","LDk6fGWqqX","QbxXcQClRL","brhlQReKEW","XyPZNpmeCd","QworuPOUYS","GXdoHRkQke","s93MlU3yw5","Yh1hFatef2","azIWp07n1c",
+"rhl0JVNCPd","HfyNQuN6r3","uvf7AfcJOy","SWfoudpe1v","QWxoT2TRI7","AXpwEa00b5","qaofNMmsIo","3otm6580YD","mz8gxW3VFH","0h1b1b29RJ",
+"DQimpVjCZq","yvOMItl72W","K20wKRxrsm","v2eC36AFT0","CIShGTCgPp","Cfgr3FwEJz","lCMxy0YAGH","dmoS7AkKTk","hUTw7nFqik","55rfBzz4ZU",
+"azIWpMezSW","NAFuwEoToP","4QMc95iGN5","Q6hMC7ku1p","v1HlnokgRi","Ul4a1OUYuF","K20wKpFrrl","a00b5uLtKs","5drc6MGlTF","TXQ0Zt59lR",
+"GSQwjQnJ1S","jeskS07n1c","tlILt3weIF","2Yz7EFNYIM","Ul4a1jS1aj","CxVEfMojnP","jtn0Xs93Ml","EoToPQssNC","RkQkeNOHsz","nlaByDG4sT",
+"uLtKs1LB1L","SWfouOHaBz","I7p2aIn3NS","okgRiuLtKs","uQIczuAWyp","Nxx9VUlU3M","BGaQY1v5hH","hSSvQZzJHW","euZA5xReec","RkQkeNhXdu",
+"oVQp6QChxs","x3LDeNxx9V","tjQxsG1RhS","blLA907n1c","IRh48fFDrJ","hE1Qldpe1v","2DREsyEfy9","ulk419GXkX","POUYSJJs5m","cL0aEeuZA5",
+"Q6hMC1j5L8","iqv4kOz8yZ","oVQp6vOqCE","OUqFMSbRYy","MmKGJEOE1o","brhlQ8cVD3","v2eC3HlUbF","l83UdgtCA5","2NslmFGzgp","5iGN5StlDJ",
+"AXpwEUvlv4","Pb1pa1j5L8","s93MlEOE1o","3otm67ku1p","ECMvUMm8si","s4786azIWp","gf8rIsx5Gl","fqypyzmLYD","VjCZq8FmFH","BGaQYpFrrl",
+"ZuDtD7ku1p","MaJQsUvlv4","ZJTXHK20wK","Yf2Ec7X3uy","QbxXcnFqik","lj07Qs4786","Ss0ZupWiOs","hi5X7LbRTH","FcWrWuPX7G","Uvlv4618Di",
+"G1RhSuLtKs","Pb1paUl4a1","YjB9tB3qem","i7WMQpFrrl","IKxdLNxx9V","pWiOsoVQp6","ZJTXHuZPqg","jSjS3EoToP","FVMxoDz1R3","2TRI7J2mQi",
+"CxVEfs7Mxk","5VZjSuN6r3","uvf7AiB08l","Vprf2h1zcH","cmXIXulk41","jS1ajRBhp0","zHF1q580YD","HfyNQTCgPp","MmsIoVerEA","StlDJFhtgl",
+"XflUqAgJHQ","hYBCKQbxXc","RsQUqI7p2a","lkMUA5Mg9r","pFrrlBbwgA","WDVWJv8yFN","iB08lYf2Ec","X6PinpmeCd","Kr8ysCIShG","Ta8f6zmLYD",
+"uPX7G0Kyfs","MGlTFAIYUu","d85a9S77LH","0Kyfsrz7Ut","xXTI4ru4UG","14FLRs4786","he9IA2Nslm","07n1cyluBx","QnJ1SQnJ1S","WPmlxHP433",
+"iB08lQssNC","e6e4zAOgEe","B3qemm4bxU","pT8wuQworu","hUTw70Wr5y","jS1ajpiJSk","ZhwG1HP433","rz7UtAIYUu","tAOsr07n1c","RACujC2Irc",
+"ZzJHW5Mg9r","jS1ajAXpwE","SWfouWMiS3","gIYvEiwzGk","HP433Gv3Fq","FPfSEcQOnv","jtn0XTwano","suY4x0ao3l","fFDrJeuZA5","soy9tpFrrl",
+"ix74rhYBCK","7Ow5C9rlg9","i7WMQCp3mZ","iKqhrUl4a1","9rlg9SWfou","VBjhzIBe8k","29QAzFxX9q","lkMUARsQUq","0Kyfs4dEz6","D6rByWmadA",
+"MaJQsCfgr3","HlUbF2hEEU","hi5X7zmLYD","LbRTHnlaBy","5Drn0dpe1v","JJs5mru4UG","lweGySbRYy","7ku1pzqH0W","ZJTXHW7cTs","t98iW2TRI7",
+"NhXdu5Drn0","hi5X75VZjS","OxWIHYf2Ec","ZUnqtdjsrv","JkzUn2ZHdk","0MR5Xn8pJ9","C2IrcU3yw5","4W0TlZv7z0","AgJHQgjUTu","5Drn0Y1mC0",
+"7X3uyiqv4k","SWfou0h1b1","dpe1vn1pmO","vLsmS5ZaEz","5NammnlaBy","5iGN5WDVWJ","faHir1LB1L","tlILtNOHsz","HRxd8t98iW","qQxHPbgJAz",
+"DLhzMWaWsv","VLTy6In3NS","F6PT2kB5nP","TXQ0ZEoToP","OHaBzgIYvE","gIYvEVerEA","Vprf2mz8gx","OUYuF9rlg9","0Wr5y618Di","fqypyRBhp0",
+"RzaZAiqv4k","x3LDedmoS7","M3zXLUl4a1","FGzgpmX2GE","NOHszHP433","soy9tQssNC","fmIK1hE1Ql","nnP8o2Yz7E","fcJOyqQxHP","Ul4a1n1pmO",
+"MmsIoWMiS3","tAOsrAmdQd","5Mg9r5drc6","yEfy9zqH0W","FjHXRW3VFH","5nmWvQChxs","PYBf4cShY2","pWiOsx3LDe","DQimpThjNn","24ARFsx5Gl",
+"HP433pmeCd","BFkb8nnP8o","cL0aE0MR5X","45cIHb29RJ","7hyVvK4GS8","618DiWMiS3","OxWIHfLNg8","sx5GlIKxdL","B3qemjiVBP","lH1ktCIShG",
+"Cp3mZDLhzM","HRxd8LewvM","zqH0WQChxs","W3VFH7lUXZ","0MR5XQssNC","azIWp2hEEU","7lUXZlsQGo","9XyT92DREs","KZamHogLgc","wDajXzqH0W",
+"3otm6Vprf2","AmdQdJJs5m","MezSW5Namm","uJScXSs0Zu","KZamHGWqqX","pv0i7uupzk","BbwgAAOgEe","qUJMd5VZjS","zY1GYdQ586","uoStw24ARF",
+"ZzJHWoVQp6","ydG8UfLNg8","M3zXLD6rBy","qQxHPs7Mxk","dmoS7Yf2Ec","Yw2oUjtn0X","EOE1oJkzUn","blLA9iB08l","FLspha00b5","EoToPFLsph",
+"IjTwPXflUq","zQt6QmX2GE","6q6L9zQt6Q","RpBQmlkMUA","S77LHguMb8","s7MxktaOXK","piJSkiqv4k","b29RJfaHir","GWqqX9XyT9","he9IAhi5X7",
+"2Nslm45cIH","tAOsrF6PT2","580YD8U2nU","JJs5mnnP8o","blLA9MK07Y","29QAzFnPFB","rKDLJuTacx","48cHLFPfSE","Uvlv4Q6hMC","jS1aj0MR5X",
+"mz8gx7ku1p","MojnPJ2mQi","S77LH9XyT9","8FmFHpv0i7","tAOsrnlaBy","VNCPdb29RJ","d85a9pAhR1","Ul4a1vkCHH","nlaBytjQxs","yluBxGWqqX",
+"FGzgpuTacx","FFDuiWaWsv","dmoS7QssNC","JkzUns7Mxk","OHaBz0Kyfs","hUTw7DQimp","RzaZAQssNC","sx5GltjQxs","618DifLNg8","v8yFNQWxoT",
+"EdBKcgf8rI","0h1b1Mm8si","uPX7Gni2v1","X6PinqUJMd","DLhzM0h1b1","xXTI4ZuDtD","TXQ0Z29QAz","5nmWv0ao3l","wiHrZ1v5hH","Ul4a1kB5nP",
+"gdQsSaez9y","hE1QllweGy","StlDJ0BmCy","BGaQYv2eC3","qaofNNAFuw","580YDa00b5","KASQ8d85a9","FjHXRd7vjM","IKxdLAkKTk","kB5nPVNCPd",
+"tjQxswDajX","D6rByuvf7A","GWqqXWmadA","fqypyvOqCE","M3zXLY1mC0","gf8rIuJScX","Q6hMC618Di","IBe8kulk41","AkKTkTwano","CqqaDiB08l",
+"pT8wuWMiS3","ZJTXHBpYhV","suY4x5Namm","K4GS8wDajX","8TxD7IBe8k","RkQke5nmWv","ksJbyFFDui","8U2nUWDVWJ","Yw2oUQ6Lix","tl72WwiHrZ",
+"FPfSErhl0J","FxX9qAgJHQ","45cIHVNCPd","jiVBPXyPZN","m4bxUxReec","yofH37fKYU","X6PinuN6r3","MGlTFpAhR1","9rlg9JXljW","Oz8yZoGu6x",
+"m4bxUlH1kt","MezSW3otm6","6q6L9sqVrf","ZJTXHfcwDa","XyPZNjeskS","QssNCuLtKs","DG4sTYOfrY","pv0i7brhlQ","MGlTFn1pmO","l83UdMojnP",
+"blLA924ARF","2DREsm4bxU","AmdQdnnP8o","FnPFBx3LDe","uupzkHP433","gdQsSoVQp6","oVQp6KsjRK","0Wr5yfmIK1","ZJTXH7lUXZ","lkMUAyvOMI",
+"xciqpNo0Qb","9iGoTiwzGk","cQOnvl83Ud","Q6hMC16lHc","4QMc9MezSW","Waim6b29RJ","uTacx7hyVv","tlILtzz4ZU","hE1Qlpv0i7","prNT6D6rBy",
+"QWxoTFLsph","UlU3MX6Pin","sx5GluJScX","YjB9tWMiS3","nnP8ojSjS3","MmKGJVjCZq","S2DfuyluBx","QssNCa00b5","h1zcH16lHc","7hyVvQ6Lix",
+"UmaEvCqqaD","pAhR1i3pyd","RmDcrOxWIH","POUYSEoToP","2hEEU07n1c","ZuDtDIn3NS","6AFT0G1RhS","CK5W74dEz6","jtn0XbrhlQ","y94nwoGu6x",
+"29QAzvLsmS","ciuWzJXljW","tl72WlViBv","GSQwj0Kyfs","7Ow5C3otm6","oGu6xRxrsm","4QMc9QssNC","he9IA9eoRc","CIShGWDVWJ","pFrrlCp3mZ",
+"aez9yuPX7G","jiVBPWPmlx","RxrsmtuDyS","dpe1vprNT6","Dz1R3lCMxy","Kr8yssoy9t","5Mg9rix74r","ECMvUfcJOy","Ta8f6MojnP","16lHcjS1aj",
+"cmXIXECMvU","IRh48uQIcz","blLA9580YD","WaWsvAXpwE","iB08lh1zcH","Chuy3jtn0X","I7p2a9rlg9","QssNC7fKYU","8cVD3zqH0W","OxWIHBCxeC",
+"blLA9JXljW","jzUqRWaim6","ZuDtDfFDrJ","618Din1pmO","LDk6f1j5L8","5iGN5KsjRK","WmadA6q6L9","9rlg9CxVEf","lm0pDIKxdL","rhl0JX6Pin",
+"0PktIGrDg7","tl72Wix74r","i3pydlpF6W","UmaEvksJby","zmLYDGWqqX","rhl0Jatef2","MGlTFM6qcG","s93MlNAFuw","HP433yvOMI","ogLgc0YAGH",
+"zQt6QJ2mQi","JIqXituDyS","W3VFHzmLYD","5NammzqH0W","lm0pDY1mC0","iB08llpF6W","Ss0ZuJXljW","BbwgABCxeC","Q6hMCGSQwj","JRJQBMojnP",
+"Ta8f6IKxdL","b29RJZhwG1","ZJTXH4dEz6","CqqaDBCxeC","FwEJziKqhr","atef2CdyBV","W7cTspT8wu","9rlg9DcpWB","xXTI4ZUnqt","zQt6QyluBx",
+"Q6LixzY1GY","HfyNQThjNn","hE1QlFxX9q","jeskS1LB1L","o8Uyd5IhmG","S2Dfu4W0Tl","QssNCgjUTu","55rfBd7vjM","uvf7ARsQUq","y94nw7ku1p",
+"atef2tuDyS","RpBQmpmeCd","lweGybZLvS","Vprf2nlaBy","QnJ1Sru4UG","zFgtBs4786","0BmCyKASQ8","3weIF0Kyfs","v2eC3ZzJHW","mz8gxAXpwE",
+"ulk41ulk41","wiHrZt59lR","lkMUAHRxd8","zz4ZUOxWIH","X6PinFnPFB","W3VFHNAFuw","hE1QluZPqg","fmIK1FnPFB","7fKYUwiHrZ","8xEKzRmDcr",
+"pAhR14QMc9","2NslmGXdoH","uupzkSs0Zu","Yw2oUaDGtS","UmaEvAmdQd","zqH0W0YAGH","NcICATXQ0Z","K4GS8K4GS8","ThjNnfLNg8","uJScXYOfrY",
+"HlUbFFLsph","0Kyfsy94nw","ulk41W3VFH","PYBf4Y1mC0","3otm6pv0i7","EoToP6AFT0","lXFOB4dEz6","VBjhzBbwgA","QWxoTQWxoT","7Ow5CVjCZq",
+"pT8wupmeCd","L7cGcoGu6x","S2DfugjUTu","d7vjMMK07Y","5ZaEz4dEz6","VLTy6Chuy3","VjCZq5iGN5","GXdoHQssNC","HlUbFQssNC","FNYIMTXQ0Z",
+"qUJMdx3LDe","QYxC0RpBQm","RzaZAFxX9q","5nmWv9rlg9","QWxoTqaofN","FcWrW8RCUA","uZPqgVLTy6","FhtgljzUqR","55rfBrz7Ut","jS1ajd7vjM",
+"m4bxUFLsph","rKDLJTa8f6","55rfBChuy3","JKWYRaez9y","gjUTu6AFT0","piJSkZ4I1v","DLhzMWMiS3","sqVrfSbRYy","WmadA9GXkX","U3yw5ZUnqt",
+"NAFuwoQ87r","DLhzMjfREu","FjHXRokgRi","5Mg9rlViBv","ru4UGjfREu","Z4I1vprNT6","pv0i7UlU3M","RACujgIYvE","uvf7AFGzgp","yToGWXflUq",
+"WPmlxRzaZA","CIShGdmoS7","iKqhrcL0aE","7fsYMFGzgp","7hyVvCxVEf","i7WMQMaJQs","BFkb87fsYM","l83UdWMiS3","yvOMIni2v1","dpe1vpAhR1",
+"zbIYY3otm6","FhtglEOE1o","tlILtYOfrY","7fsYMiKqhr","0MR5XQ6Lix","NhXdus7Mxk","MojnPogLgc","yluBx0Kyfs","HP43364s8N","AXpwEQWxoT",
+"pv0i7sx5Gl","8TxD7HzZT8","7fsYMyvOMI","0h1b1n8pJ9","qaofNsoy9t","SbRYyOUYuF","d85a9jS1aj","VIlwPTXQ0Z","lsQGoaL6AJ","wiHrZzFgtB",
+"D6rByS2Dfu","HfyNQuTacx","dmoS7n8pJ9","jSjS3Ta8f6","l83Ud1LB1L","fFDrJx3LDe","QChxsJKWYR","55rfBTwano","qQxHPS77LH","VerEAPOUYS",
+"aDGtSTa8f6","iKqhrLDk6f","C2Irco8Uyd","e6e4zv2eC3","GrDg7uZPqg","HlUbFFcWrW","Q6hMCUmaEv","atef2FnPFB","hE1QlCNHmv","prNT6Z4I1v",
+"l83UdlViBv","GWqqXWaim6","7Ow5CoVQp6","1j5L8dmoS7","jeskSsuY4x","MaJQskZANm","s4786dQ586","Q6hMCeuZA5","lj07QnnP8o","uAWypvLsmS",
+"WreyPO3iyQ","vOqCEokgRi","aFFssuQIcz","3weIFUmaEv","5IhmGk85Ae","zFgtB8U2nU","8cVD3JRJQB","VNCPddjsrv","i7WMQv8yFN","5IhmGNAFuw",
+"D6rByXflUq","guMb8OUYuF","7X3uyJIqXi","AIYUu48cHL","GWqqXQbxXc","ZhwG1n1pmO","JXljWRBhp0","ReKEWCqqaD","aDGtSfcwDa","QnJ1ShSSvQ",
+"uJScXKZamH","uN6r3uQIcz","lViBvpFrrl","d7vjMyToGW","YjB9tpmeCd","jzUqRdmoS7","DQimpTa8f6","mX2GEhUTw7","5drc6lm0pD","FwEJzbrhlQ",
+"cShY28xEKz","Kr8ysEOE1o","64s8N0BmCy","F6PT2Chuy3","ZzJHWbgJAz","QWxoT8xEKz","ciuWzWaim6","G1RhSdhSuH","Ta8f6ZuDtD","o8UydxReec",
+"oGu6xhSSvQ","RxrsmgIYvE","tvdkD4dEz6","ciuWzCqqaD","K20wKfLNg8","ru4UG8hJdt","kB5nP8TxD7","XyPZNOUqFM","K20wKhe9IA","uLtKsRsQUq",
+"PYBf4t59lR","fcJOyRsQUq","tl72We6e4z","djsrvcL0aE","1v5hHGWqqX","HzZT80MR5X","bgJAzRmDcr","Q6Lix4QMc9","okgRiBFkb8","pT8wuDLhzM",
+"vkCHHYh1hF","7ku1p2Yz7E","6q6L9HRxd8","ZzJHWUlU3M","jiVBPoVQp6","uQIczNo0Qb","soy9tqUJMd","TXQ0Z2Nslm","2Yz7E8xEKz","Yf2EcNOHsz",
+"gtCA5fLNg8","pT8wu9XyT9","OHaBzOUqFM","faHirQ6Lix","Waim6a00b5","kZANmaDGtS","oQ87rsoy9t","hE1Ql0ao3l","7lUXZfFDrJ","55rfBBFkb8",
+"lkMUAlkMUA","JIqXiZv7z0","lj07QnlaBy","3otm6FjHXR","yluBxL7cGc","ix74r45cIH","SWfouAOgEe","SjskQQworu","k85AeThjNn","RkQkeIRh48",
+"Yh1hFblLA9","SWfouvkCHH","5nmWvYw2oU","24ARF0PktI","FcWrWcL0aE","vLsmSs4786","Chuy3yofH3","mz8gxCK5W7","uupzkzqH0W","2TRI7JRJQB",
+"0YAGHQ6Lix","D6rByUl4a1","qQxHPReKEW","U3yw5pv0i7","AmdQdiKqhr","OUYuF24ARF","yEfy9JJs5m","G1RhSt98iW","Gv3FqK4GS8","P6bcguLtKs",
+"5VZjS45cIH","WPmlxgdQsS","qQxHPFhtgl","5nmWvpmeCd","8RCUA9y4lw","D6rByy94nw","1v5hHBFkb8","gf8rIlH1kt","qaofNMezSW","KZamHkZANm",
+"BGaQYuupzk","n1pmOoQ87r","nFqikjiVBP","Uvlv4VerEA","Zv7z0sqVrf","Ta8f6NAFuw","Yh1hFtlILt","5ZaEzzY1GY","2DREsfqypy","CxVEfTXQ0Z",
+"NOHszWaim6","lCMxylXFOB","J2mQilXFOB","HzZT8Fhtgl","5NammAOgEe","0ao3lqUJMd","Ta8f6gtCA5","ZUnqtblLA9","W7cTsYf2Ec","qaofNUl4a1",
+"ogLgcVLTy6","zbIYYs93Ml","IKxdLOUqFM","WPmlxGSQwj","Qworu9iGoT","B3qemZUnqt","pT8wuWmadA","Yf2EckB5nP","RBhp016lHc","pvgjSKr8ys",
+"7hyVvFhtgl","Q6LixMK07Y","RzaZACfgr3","EoToPblLA9","ZzJHWQssNC","gdQsSIKxdL","jiVBPb29RJ","AOgEe2TRI7","2NslmzHF1q","xciqpQnJ1S",
+"b29RJtjQxs","tl72WNhXdu","bgJAzY1mC0","pvgjSJXljW","aDGtSEoToP","lViBvZJTXH","Oz8yZdmoS7","Uvlv41v5hH","sx5GlChuy3","5nmWvWDVWJ",
+"OHaBzdpe1v","Mm8si0Kyfs","S2DfuW3VFH","QworuAgJHQ","9iGoTLbRTH","l83UdIRh48","t59lRSmGzv","fcwDaWaim6","rKDLJI7p2a","U3yw50h1b1",
+"IBe8kpWiOs","KsjRK24ARF","rz7UtqQxHP","Q6LixUvlv4","7hyVvEdBKc","WPmlxFnPFB","hYBCK2ZHdk","pmeCdpiJSk","Mm8si7ku1p","Q6hMCFLsph",
+"yluBx9rlg9","DcpWBF6PT2","7hyVvnFqik","Mkgy8Ul4a1","VNCPdMezSW","aez9y0BmCy","tvdkDaFFss","lH1kt9rlg9","vkCHHbgJAz","lCMxyRpBQm",
+"Mkgy8UmaEv","hi5X7WreyP","VjCZqzbIYY","HlUbF07n1c","Kr8ysuupzk","QnJ1S9GXkX","W7cTshi5X7","NcICAvkCHH","zHF1quZPqg","TCgPpMmKGJ",
+"suY4xkB5nP","K4GS8Cfgr3","aL6AJHP433","Q6Lix9rlg9","C2IrcnFqik","ZuDtD580YD","faHir4QMc9","29QAzOUqFM","QClRLHlUbF","XyPZNFLsph",
+"Kr8yspmeCd","fLNg8JJs5m","Y1mC0BGaQY","UmaEvCIShG","mX2GEFLsph","HP433Q6Lix","Y1mC0WMiS3","MmKGJlH1kt","Pb1paEOE1o","FcWrW5drc6",
+"Ta8f6VjCZq","IKxdLAIYUu","QChxsVBjhz","StlDJIKxdL","XyPZNn8pJ9","Qworu7lUXZ","AIYUujS1aj","zHF1qWaWsv","5nmWvzbIYY","SbRYya00b5",
+"48cHLhi5X7","VIlwPLDk6f","16lHct98iW","uZPqgEoToP","zmLYDqUJMd","guMb8ciuWz","AmdQdjiVBP","0h1b1ZhwG1","X6PinCNHmv","2Nslm7hyVv",
+"pWiOsQssNC","ciuWz5IhmG","0Wr5y9XyT9","wDajXNxx9V","tlILtv8yFN","NAFuwgf8rI","Vprf23otm6","jS1ajCdyBV","4W0Tl7hyVv","DLhzMhi5X7",
+"2NslmFxX9q","h1zcHuPX7G","s93MlRACuj","uZPqgFxX9q","IjTwP14FLR","TXQ0ZsuY4x","pFrrlJXljW","ZUnqtzmLYD","OHaBzTa8f6","I7p2ajSjS3",
+"5IhmGtlILt","Pb1paPb1pa","okgRi7ku1p","AOgEepAhR1","cQOnv7hyVv","ydG8Urhl0J","NOHszSWfou","atef2xXTI4","oGu6xMaJQs","OHaBzuLtKs",
+"h1zcHqQxHP","vOqCExciqp","SbRYyatef2","AIYUuZv7z0","DcpWBRsQUq","K4GS8MojnP","AOgEeuvf7A","uN6r3EdBKc","jeskSReKEW","soy9txXTI4",
+"xXTI4MaJQs","I7p2agf8rI","HfyNQs93Ml","3weIFpmeCd","JKWYRGXdoH","WmadAi3pyd","wiHrZSjskQ","Uvlv4DG4sT","Nxx9VtjQxs","ksJbytjQxs",
+"FjHXRUl4a1","JIqXiaez9y","MmsIouJScX","0MR5XhSSvQ","Mkgy8euZA5","6AFT0CNHmv","QnJ1S24ARF","n1pmOQssNC","BGaQY6AFT0","1v5hHM6qcG",
+"lweGyVIlwP","5ZaEzEoToP","mz8gxlm0pD","TwanoYh1hF","kB5nPlH1kt","dmoS7sqVrf","TXQ0ZoQ87r","X6PinzHF1q","Mkgy8AIYUu","5iGN507n1c",
+"PYBf4hSSvQ","iKqhre6e4z","64s8Nfqypy","0MR5XfLNg8","XflUqUl4a1","KsjRKbrhlQ","a00b5jiVBP","7X3uyTa8f6","CqqaDlViBv","9XyT955rfB",
+"nnP8olsQGo","s4786zY1GY","EOE1o5iGN5","BpYhVRACuj","EOE1oblLA9","DcpWBWMiS3","VBjhzNxx9V","guMb8ni2v1","B3qemVerEA","dmoS73otm6",
+"5IhmGuPX7G","jzUqRUl4a1","S77LHhYBCK","FhtglPb1pa","l83Ud8TxD7","s93Mlatef2","lkMUAv1Hln","Mm8siprNT6","8cVD3lweGy","L7cGcwDajX",
+"NhXduvOqCE","uPX7GDG4sT","fcwDav8yFN","7lUXZk85Ae","he9IAC2Irc","yofH3iB08l","CxVEft98iW","MGlTFpmeCd","VLTy6FPfSE","Q6Lix0MR5X",
+"VNCPdFhtgl","FwEJzn8pJ9","RACuj2DREs","wiHrZ4dEz6","t98iWCqqaD","7ku1pDLhzM","KASQ8Z4I1v","NOHsz6AFT0","lm0pD5Mg9r","zmLYDuN6r3",
+"8RCUAaDGtS","s93MlDcpWB","FFDuicQOnv","KsjRKn8pJ9","aDGtSZJTXH","WmadARxrsm","lsQGouJScX","2hEEUoVQp6","FPfSEs4786","2Yz7EuoStw",
+"YjB9tNOHsz","ZzJHWHlUbF","S2DfufcJOy","Chuy3DcpWB","W7cTsi3pyd","5nmWvtjQxs","CK5W77fKYU","aL6AJSWfou","uAWypIjTwP","7hyVviB08l",
+"CdyBV0Wr5y","QnJ1SGrDg7","29QAzF6PT2","lCMxybgJAz","CIShGNhXdu","0h1b1t59lR","4QMc9FLsph","HlUbFRpBQm","AIYUubrhlQ","y94nwvLsmS",
+"lsQGoGWqqX","fqypyDLhzM","FGzgpBFkb8","K20wKaez9y","bgJAztaOXK","HRxd8Q6hMC","9rlg9MaJQs","oVQp6GWqqX","cQOnvxciqp","VNCPdNo0Qb",
+"CdyBVOHaBz","EOE1oJRJQB","8FmFHDcpWB","vLsmSmz8gx","jfREuOxWIH","FhtglIRh48","JIqXiMK07Y","ThjNnaDGtS","6q6L9OxWIH","ogLgct98iW",
+"nlaByCIShG","DG4sTcmXIX","uJScXzY1GY","Mkgy8GrDg7","StlDJ9eoRc","RACujcQOnv","ulk41U3yw5","vLsmSCxVEf","64s8Nv1Hln","MmsIov1Hln",
+"zbIYY5nmWv","WreyPgIYvE","uAWypS77LH","EoToPOxWIH","NAFuw2Nslm","hi5X7Waim6","EOE1o5nmWv","lj07Q24ARF","VIlwPNAFuw","pT8wuvLsmS",
+"tAOsrFGzgp","S2DfulkMUA","0MR5XRBhp0","B3qemG1RhS","oGu6xMmKGJ","S77LHVerEA","xReec8cVD3","B3qemn8pJ9","dmoS7fmIK1","atef2VBjhz",
+"UlU3MWreyP","hi5X7DG4sT","Nxx9Vm4bxU","580YDjfREu","NcICA5iGN5","DcpWBHzZT8","cShY2cQOnv","hUTw7NOHsz","SbRYyWreyP","618DiTwano",
+"lViBvJKWYR","AkKTkaL6AJ","s93Mlh1zcH","SmGzvEdBKc","Nxx9Vatef2","JKWYRNhXdu","L7cGcCqqaD","EoToPhi5X7","suY4xuZPqg","cShY2dQ586",
+"BpYhVVprf2","uZPqgaL6AJ","5Drn0Mm8si","RBhp00Wr5y","O3iyQjfREu","9iGoTpvgjS","QbxXccShY2","ru4UGqaofN","B3qemiB08l","oGu6xdmoS7",
+"Mkgy8OUYuF","RsQUqY1mC0","lm0pD4W0Tl","5drc60PktI","ogLgcZuDtD","JkzUnzQt6Q","NcICA6q6L9","5nmWvn1pmO","FnPFBRmDcr","Cp3mZs93Ml",
+"hE1QlJkzUn","mz8gxuLtKs","14FLRdmoS7","jzUqRFPfSE","Nxx9VTXQ0Z","JKWYR4W0Tl","M3zXLBGaQY","yvOMIOUYuF","K4GS8x3LDe","DQimpMK07Y",
+"s4786tAOsr","ksJbyDcpWB","OxWIH7Ow5C","mz8gx5drc6","m4bxUatef2","m4bxUtlILt","7Ow5CWreyP","5iGN5aL6AJ","Uvlv4O3iyQ","HP4337Ow5C",
+"azIWpEdBKc","aFFssyToGW","nFqikguMb8","iqv4kprNT6","0h1b1tAOsr","7lUXZciuWz","QssNCZJTXH","zHF1q8RCUA","KsjRK8TxD7","lpF6WQ6hMC",
+"MezSWFcWrW","jS1ajG1RhS","CK5W7Cp3mZ","0PktIi7WMQ","bgJAzuJScX","iqv4krhl0J","Dz1R32ZHdk","HRxd8EoToP","zbIYYBpYhV","Dz1R3hUTw7",
+"mz8gxS2Dfu","X6PinGv3Fq","GXdoHdpe1v","tlILthSSvQ","0YAGHtl72W","16lHcmX2GE","5iGN5zz4ZU","3weIFRACuj","fcwDat59lR","6q6L9zFgtB",
+"piJSkFLsph","FGzgp14FLR","5iGN58hJdt","iB08lGXdoH","D6rByI7p2a","KASQ8uoStw","b29RJMmsIo","Yw2oUqQxHP","uoStw4W0Tl","lsQGoiKqhr",
+"VjCZqwDajX","KsjRKh1zcH","ReKEW7X3uy","8cVD3JkzUn","jiVBPaL6AJ","MmKGJSjskQ","ciuWzGXdoH","VIlwPxciqp","Chuy38hJdt","3weIFyvOMI",
+"v2eC3QChxs","6q6L9Pb1pa","9eoRcZhwG1","TXQ0ZBGaQY","Cfgr3Yw2oU","oQ87ruQIcz","t98iWNo0Qb","lXFOBCqqaD","yEfy9KZamH","7fsYM8U2nU",
+"okgRio8Uyd","X6Pinzz4ZU","5Mg9rFcWrW","he9IAFPfSE","d7vjMpmeCd","5Drn0UmaEv","jSjS3iqv4k","h1zcHQWxoT","O3iyQNo0Qb","2NslmAIYUu",
+"lCMxycShY2","zY1GYGWqqX","W7cTsG1RhS","BCxeCl83Ud","FjHXR8xEKz","BpYhV64s8N","0BmCybZLvS","Yw2oUvkCHH","29QAzBFkb8","uTacxPb1pa",
+"0Kyfs1v5hH","BbwgA5iGN5","jtn0X55rfB","JkzUnWreyP","Ss0ZuuJScX","48cHL0ao3l","9GXkXQClRL","M6qcGNcICA","n1pmOWmadA","uPX7Ghi5X7",
+"uJScXNo0Qb","FxX9quZPqg","pFrrlVLTy6","K4GS8580YD","gtCA5SmGzv","Kr8ysxReec","IKxdLuvf7A","tuDyS0Kyfs","brhlQTa8f6","TwanoVLTy6",
+"s4786RBhp0","RxrsmQChxs","KsjRKWaWsv","OHaBz2Yz7E","O3iyQa00b5","XflUqksJby","YjB9t9y4lw","AkKTklViBv","8RCUAxciqp","Q6hMCiKqhr",
+"uupzkOUYuF","uAWypC2Irc","uN6r3Yw2oU","nFqik5Mg9r","pT8wuCfgr3","tvdkD6q6L9","euZA5J2mQi","GXdoHatef2","FPfSE48cHL","VBjhz2Yz7E",
+"pFrrllj07Q","UlU3Mhe9IA","QbxXczmLYD","aFFss0BmCy","rKDLJJRJQB","blLA92ZHdk","hi5X7AgJHQ","9GXkXyofH3","cL0aEmz8gx","cShY2fmIK1",
+"FGzgpP6bcg","3otm624ARF","VBjhz5Mg9r","dpe1vLbRTH","x3LDe618Di","I7p2aO3iyQ","2ZHdkLDk6f","wiHrZ9y4lw","zQt6QQbxXc","s7Mxkv2eC3",
+"0Wr5yVLTy6","lweGy8RCUA","1j5L8MaJQs","b29RJDz1R3","Zv7z0Yf2Ec","vOqCEWaWsv","DcpWBDQimp","3weIFlkMUA","dQ586iB08l","XflUqsqVrf",
+"7fKYUt98iW","JJs5mgf8rI","qUJMdcShY2","NhXdu55rfB","GXdoHwiHrZ","i3pydm4bxU","55rfBBbwgA","zbIYYo8Uyd","U3yw5Y1mC0","blLA9dpe1v",
+"5drc664s8N","1v5hHdQ586","2DREsuAWyp","9y4lwFxX9q","cShY2oVQp6","x3LDewiHrZ","Mm8siBbwgA","MaJQsjzUqR","qUJMdTwano","7lUXZIRh48",
+"hYBCKqQxHP","nFqiklweGy","XyPZNtaOXK","MezSWY1mC0","o8UydNhXdu","M3zXLFnPFB","GXdoHdjsrv","OxWIHDcpWB","0YAGHeuZA5","3otm6Qworu",
+"7fsYMuoStw","hUTw7v2eC3","OUYuFWmadA","ZhwG1hSSvQ","yofH32hEEU","55rfBulk41","BCxeCGWqqX","7ku1pGrDg7","BGaQY7ku1p","BpYhV1j5L8",
+"0YAGHjeskS","QWxoTPb1pa","MojnPX6Pin","DQimpRzaZA","2DREs3weIF","UmaEvqaofN","gf8rIoQ87r","3weIFBFkb8","rhl0Jt59lR","oVQp6hYBCK",
+"jS1ajFNYIM","kZANmKASQ8","IjTwP2Nslm","O3iyQTa8f6","SWfourhl0J","dmoS7IBe8k","wDajXksJby","uJScXgjUTu","8TxD7jtn0X","M3zXLVjCZq",
+"IBe8k5drc6","1v5hHzHF1q","YjB9t0PktI","ksJbyQnJ1S","5drc6SmGzv","tjQxsUl4a1","14FLR24ARF","sx5GlMmKGJ","zbIYYfqypy","FcWrWn8pJ9",
+"DLhzMNcICA","HP433RkQke","FwEJz5Drn0","uoStwOUYuF","lpF6W5Mg9r","nlaByogLgc","TCgPpJIqXi","FLsph1j5L8","AXpwEpAhR1","nlaByyofH3",
+"azIWptaOXK","K20wKDz1R3","YjB9ttvdkD","brhlQlViBv","FGzgpiKqhr","QWxoTY1mC0","TCgPpOUqFM","oVQp6L7cGc","MGlTFFFDui","5iGN5ZuDtD",
+"uoStwd7vjM","ulk418RCUA","2Yz7EBGaQY","i3pydpvgjS","8RCUASs0Zu","vkCHHSs0Zu","dhSuHlpF6W","FGzgppT8wu","yToGWiB08l","RpBQm29QAz",
+"OxWIH7ku1p","FLsphaFFss","tvdkDFnPFB","jSjS3D6rBy","RmDcruN6r3","Ul4a1uN6r3","9y4lwBbwgA","14FLRydG8U","0KyfszQt6Q","IKxdLTCgPp",
+"jzUqRQssNC","D6rByfcwDa","AXpwE8RCUA","GWqqXt98iW","24ARFa00b5","2hEEUFxX9q","dQ586lweGy","FxX9qdjsrv","MK07YWMiS3","uPX7Gix74r",
+"lweGygf8rI","FwEJzMezSW","WMiS35drc6","ReKEW3otm6","KsjRKfLNg8","ciuWzK4GS8","In3NSHlUbF","4W0TlYh1hF","fLNg8OUqFM","dhSuHKsjRK",
+"uLtKsQbxXc","XyPZNwiHrZ","pFrrlt59lR","DcpWBzbIYY","9y4lwNo0Qb","pv0i7QnJ1S","BGaQYoGu6x","7fsYMciuWz","HP433VerEA","GWqqX0Kyfs",
+"yofH33otm6","CK5W7Vprf2","Twano9y4lw","yEfy9uN6r3","8RCUA5Drn0","WaWsvPOUYS","uJScXfcwDa","n8pJ9JJs5m","yvOMI9GXkX","FcWrWCqqaD",
+"CNHmvbrhlQ","2NslmP6bcg","RpBQmpT8wu","uvf7AHfyNQ","lj07QLbRTH","0YAGHpT8wu","2TRI7hSSvQ","2TRI7I7p2a","Uvlv4I7p2a","mz8gx1v5hH",
+"tuDySpAhR1","5VZjSCK5W7","OHaBzQChxs","n1pmOnlaBy","tuDyS9iGoT","BpYhVhi5X7","qUJMdVLTy6","UmaEvuupzk","618DiAIYUu","MezSWKZamH",
+"v8yFNazIWp","jeskSrz7Ut","X6PinbrhlQ","uJScXTwano","5iGN5NAFuw","0MR5XgtCA5","x3LDetjQxs","zY1GYNAFuw","jSjS3B3qem","RsQUqsuY4x",
+"ciuWzvLsmS","TCgPppv0i7","OUYuFVBjhz","yEfy9ix74r","pv0i7UmaEv","ksJbyVBjhz","FVMxoDG4sT","ZhwG1azIWp","Waim6WPmlx","8hJdtlXFOB",
+"tuDySguMb8","2NslmB3qem","QssNC2Yz7E","9y4lw2hEEU","CIShGGSQwj","AIYUuaDGtS","hE1Qlrz7Ut","7lUXZfLNg8","HRxd8QYxC0","HP433oGu6x",
+"jtn0XyofH3","zmLYDQ6Lix","FPfSEhUTw7","bgJAzkB5nP","zHF1qyofH3","xciqpFPfSE","QClRLaez9y","Gv3Fq14FLR","RBhp0taOXK","5Drn0lH1kt",
+"ZUnqtOUqFM","lpF6Wxciqp","ix74razIWp","n8pJ9Cp3mZ","atef2OxWIH","SjskQokgRi","GSQwj9XyT9","YOfrYOz8yZ","yEfy9StlDJ","WMiS30h1b1",
+"DLhzMOUqFM","29QAzQClRL","fqypysuY4x","HP433cQOnv","K4GS8MaJQs","qaofNdQ586","0BmCyzz4ZU","WmadAzz4ZU","WPmlxlH1kt","RzaZAuPX7G",
+"hSSvQpvgjS","jfREu07n1c","DcpWBciuWz","5nmWvyofH3","uAWypVLTy6","fqypyyToGW","Chuy3FPfSE","MGlTFaDGtS","vOqCE9rlg9","Zv7z0tAOsr",
+"pvgjSECMvU","Yf2EcjeskS","lH1ktU3yw5","bgJAz8xEKz","euZA58FmFH","QYxC0guMb8","Yw2oULewvM","tlILtFhtgl","FFDuiCIShG","JKWYRqQxHP",
+"IBe8kW7cTs","7X3uytvdkD","RkQkeuTacx","EoToP4W0Tl","Vprf2UmaEv","AgJHQyEfy9","07n1cHRxd8","nFqik2hEEU","ni2v1rz7Ut","DLhzMjtn0X",
+"J2mQipiJSk","7ku1poGu6x","gf8rI64s8N","euZA5zQt6Q","jS1aj5VZjS","lpF6Wd85a9","uoStwzY1GY","lkMUACK5W7","1LB1LblLA9","aL6AJoGu6x",
+"iwzGkuvf7A","5IhmGCK5W7","RsQUqUmaEv","gjUTud7vjM","2DREsTCgPp","NcICAHlUbF","cL0aE5iGN5","uAWyp7ku1p","fLNg8M6qcG","FhtglFPfSE",
+"fmIK1oQ87r","8U2nUoGu6x","WmadAFNYIM","3otm6jfREu","CdyBVjiVBP","ReKEWCxVEf","8TxD7rz7Ut","fLNg8ReKEW","GSQwjblLA9","XyPZN0Wr5y",
+"sx5GlOUYuF","MmsIoQssNC","5nmWvJ2mQi","FFDuiF6PT2","9iGoTpv0i7","kB5nPKsjRK","ni2v1ZJTXH","fcwDafmIK1","PYBf4VNCPd","zFgtB29QAz",
+"In3NSRmDcr","nlaByqUJMd","StlDJYw2oU","7hyVvFGzgp","lweGyRxrsm","t98iWjfREu","OHaBzcL0aE","LbRTHix74r","No0Qb9XyT9","7hyVvrhl0J",
+"AgJHQ5iGN5","4QMc9Yh1hF","ciuWz8cVD3","AIYUuv8yFN","CNHmv8U2nU","WMiS3xciqp","QnJ1SMmKGJ","gdQsSFPfSE","WreyPzHF1q","xciqpnFqik",
+"0h1b12DREs","AXpwEgjUTu","9y4lw6q6L9","lj07QoGu6x","EoToPK20wK","FVMxo9iGoT","bgJAz0MR5X","AmdQdMmsIo","POUYSv2eC3","QClRLnFqik",
+"gIYvENAFuw","VLTy6djsrv","nnP8osqVrf","pAhR1lXFOB","2TRI71j5L8","Cfgr32ZHdk","cmXIXwDajX","5Nammh1zcH","sx5GlzbIYY","pv0i7MGlTF",
+"CNHmv4QMc9","mX2GE6AFT0","Gv3FqRmDcr","RmDcr3otm6","C2Ircx3LDe","Zv7z0d85a9","5NammGXdoH","UmaEvaDGtS","FPfSESWfou","Mkgy8AkKTk",
+"hi5X7gIYvE","0PktIDQimp","lH1kty94nw","suY4xs93Ml","Mkgy8cQOnv","Chuy3pT8wu","dQ586gtCA5","J2mQizFgtB","Zv7z0uLtKs","GXdoHn1pmO",
+"XflUqtaOXK","RmDcruTacx","SjskQcShY2","Q6LixhYBCK","ni2v1FFDui","GSQwjIRh48","Gv3FqqQxHP","OHaBzOHaBz","pv0i7gjUTu","618Diuupzk",
+"QWxoTFNYIM","FGzgpFnPFB","OUqFMx3LDe","K4GS8uZPqg","PYBf4Qworu","lweGy9XyT9","k85AevOqCE","ydG8UAkKTk","14FLRtaOXK","0MR5XYw2oU",
+"atef2VIlwP","CNHmvt98iW","tlILtQChxs","5IhmGHzZT8","IRh48GXdoH","xciqpfaHir","RBhp0QChxs","t59lRwiHrZ","QbxXcIBe8k","ciuWzJIqXi",
+"VerEAokgRi","brhlQRACuj","CqqaDxciqp","VerEABGaQY","rKDLJogLgc","rKDLJAgJHQ","dmoS7pAhR1","fcwDaKZamH","euZA5Mm8si","Fhtglaez9y",
+"FGzgpIKxdL","VIlwPL7cGc","Y1mC0s7Mxk","7fKYUdmoS7","QbxXcWaim6","qQxHPIRh48","yvOMIb29RJ","pFrrlJIqXi","RBhp05drc6","jSjS3CNHmv",
+"fLNg8ulk41","RmDcrMm8si","DLhzMjeskS","nFqikqaofN","KZamHP6bcg","kB5nPZhwG1","MmsIosuY4x","Uvlv4FNYIM","5iGN5rKDLJ","ECMvUuvf7A",
+"zbIYYRBhp0","jS1ajNo0Qb","FhtglYOfrY","D6rByBGaQY","azIWpYh1hF","fLNg8nnP8o","KsjRKVjCZq","ix74rZv7z0","KASQ85Mg9r","VjCZqBCxeC",
+"0YAGH0h1b1","FGzgpCqqaD","tlILts93Ml","OxWIHuvf7A","iKqhrLewvM","RzaZAhe9IA","RACujTXQ0Z","jzUqRbZLvS","RxrsmUmaEv","v1HlnLbRTH",
+"YOfrYChuy3","8cVD3pAhR1","MezSWi7WMQ","azIWp5VZjS","lXFOBokgRi","YjB9t9GXkX","O3iyQ2Nslm","tuDyS3otm6","0YAGHMm8si","FGzgpb29RJ",
+"FNYIMFnPFB","64s8NDcpWB","zqH0WIn3NS","EOE1oYjB9t","Waim6yToGW","Kr8yssuY4x","ogLgcxXTI4","pvgjSuJScX","CqqaDtuDyS","hYBCKv8yFN",
+"he9IASs0Zu","P6bcgyEfy9","24ARFl83Ud","JJs5mYh1hF","No0QbmX2GE","2TRI7Zv7z0","RpBQm5ZaEz","sqVrfk85Ae","cShY2djsrv","U3yw5mz8gx",
+"tlILt7fKYU","FNYIMuAWyp","VerEA48cHL","OHaBzVprf2","55rfByvOMI","zFgtBe6e4z","P6bcgzmLYD","FLsphKr8ys","07n1cFcWrW","3weIFQClRL",
+"soy9tWmadA","QnJ1SsqVrf","uJScXydG8U","NAFuw0MR5X","HfyNQVNCPd","OUqFMAOgEe","WmadA5IhmG","W3VFHECMvU","mX2GEKZamH","0MR5XAOgEe",
+"FGzgp9eoRc","AgJHQ1j5L8","14FLR1v5hH","hi5X745cIH","i7WMQG1RhS","8xEKz580YD","ydG8UNcICA","2Yz7EFcWrW","lm0pDMmsIo","zY1GYCxVEf",
+"v1HlnGXdoH","XyPZNpiJSk","1LB1L14FLR","x3LDe6q6L9","QClRLOxWIH","6q6L9AOgEe","OHaBziB08l","5Drn0SjskQ","TwanoS77LH","6q6L9uoStw",
+"iKqhrBFkb8","ix74rYjB9t","dmoS7o8Uyd","d7vjMlsQGo","jtn0XCp3mZ","soy9tMkgy8","2ZHdktlILt","9XyT9VIlwP","6AFT0rhl0J","CdyBV1j5L8",
+"dmoS70Kyfs","gjUTuFFDui","v2eC3I7p2a","RxrsmhYBCK","v8yFN45cIH","yofH3uJScX","0h1b1Rxrsm","7ku1px3LDe","AIYUuGWqqX","s7Mxk6q6L9",
+"fmIK14dEz6","jeskS0PktI","MojnPyToGW","WmadAuQIcz","uPX7GlViBv","7fKYUCp3mZ","SbRYybZLvS","IjTwPfqypy","s7MxkQssNC","Pb1paVIlwP",
+"OUqFM8RCUA","tjQxs16lHc","rhl0JyEfy9","FwEJzcShY2","5iGN5SjskQ","5IhmGqaofN","oQ87rF6PT2","07n1c2TRI7","mX2GEVIlwP","55rfBStlDJ",
+"6q6L9AIYUu","0h1b107n1c","7X3uy5IhmG","cL0aEFGzgp","hUTw7yToGW","nlaByv1Hln","lm0pDQbxXc","MK07YNxx9V","xReeci3pyd","Vprf29XyT9",
+"SmGzvaL6AJ","NAFuwZzJHW","L7cGcUlU3M","cQOnv4dEz6","brhlQ2DREs","Cfgr3lpF6W","Yh1hFCxVEf","K20wKjS1aj","zmLYDFjHXR","HzZT8L7cGc",
+"GWqqXO3iyQ","guMb8jfREu","2DREsNxx9V","o8UydyToGW","WMiS3t59lR","ciuWzOUqFM","Nxx9VdQ586","Cp3mZCqqaD","Cfgr3kZANm","Kr8yscShY2",
+"0YAGHS2Dfu","FGzgp4dEz6","dpe1vIn3NS","zHF1qJIqXi","Z4I1vVLTy6","5VZjSs4786","sx5Glsoy9t","azIWpAOgEe","he9IAb29RJ","gjUTu2hEEU",
+"RkQkeRzaZA","MmKGJS77LH","S2Dfud85a9","X6Pins7Mxk","2DREsjiVBP","MmKGJfaHir","0ao3lKr8ys","3weIFAIYUu","ZzJHWi3pyd","J2mQisoy9t",
+"XyPZNMm8si","pmeCdgdQsS","Y1mC0JIqXi","7Ow5Ce6e4z","3weIFGSQwj","QbxXcYf2Ec","pFrrlSs0Zu","AOgEe07n1c","2hEEUlXFOB","yToGW5nmWv",
+"lkMUA5drc6","Mkgy8Q6Lix","0ao3llsQGo","16lHcjfREu","6AFT00Wr5y","KASQ8RpBQm","6AFT0zFgtB","FjHXR0ao3l","2TRI7BCxeC","StlDJ0YAGH",
+"CdyBVazIWp","JXljW6AFT0","gjUTuCK5W7","2Yz7ECfgr3","2TRI7ix74r","QssNCUl4a1","i3pydHRxd8","k85Ae5ZaEz","7ku1pv2eC3","0Kyfs8U2nU",
+"5IhmGs93Ml","HP433Mkgy8","uAWyp5iGN5","KASQ8a00b5","I7p2azz4ZU","7ku1pUl4a1","ksJbyK4GS8","cShY2EdBKc","zbIYYrhl0J","7X3uyl83Ud",
+"UlU3M5Mg9r","JIqXiJIqXi","M3zXLMaJQs","6AFT0i3pyd","FcWrWUl4a1","iB08ls4786","KASQ8Yf2Ec","okgRixReec","AOgEen8pJ9","8TxD71v5hH",
+"9eoRcWaWsv","2NslmguMb8","D6rBy8FmFH","ix74rgtCA5","n1pmOZUnqt","5VZjStl72W","nnP8oblLA9","Y1mC07fsYM","0BmCywiHrZ","fcwDahe9IA",
+"aL6AJni2v1","jfREuRmDcr","QClRLCxVEf","StlDJuQIcz","EdBKcSmGzv","QChxsv8yFN","7hyVv1j5L8","2NslmyluBx","MK07Yuupzk","jfREuFLsph",
+"hUTw755rfB","LDk6fFLsph","xXTI4QClRL","0YAGHhYBCK","ZuDtDMm8si","6AFT0VNCPd","Mkgy89iGoT","0BmCyUlU3M","b29RJv8yFN","oVQp6tvdkD",
+"EOE1ouJScX","16lHcQssNC","B3qemaez9y","MmsIoGXdoH","FxX9qjSjS3","wDajXyvOMI","8hJdtStlDJ","Nxx9Va00b5","S77LHSbRYy","D6rByUlU3M",
+"FPfSEfcJOy","45cIH9GXkX","guMb8IjTwP","618DiBFkb8","5VZjSoVQp6","e6e4zuTacx","2TRI7nlaBy","lCMxyRBhp0","5iGN5RACuj","cShY2hYBCK",
+"DG4sTi3pyd","5Drn00MR5X","lkMUAQChxs","CdyBVciuWz","GSQwjYh1hF","Y1mC00Wr5y","9GXkXF6PT2","M6qcGjSjS3","NcICAoVQp6","2hEEUprNT6",
+"iwzGkbZLvS","Kr8ysReKEW","FnPFBCK5W7","FwEJzKsjRK","5Mg9rlm0pD","EoToP16lHc","uvf7AHRxd8","S2DfuNcICA","EdBKcRACuj","FGzgp7ku1p",
+"ReKEWWmadA","dpe1vrz7Ut","0MR5XWreyP","HlUbFiqv4k","RBhp0zmLYD","dpe1vFnPFB","lj07Q5Mg9r","NcICAWaim6","Kr8ys5IhmG","jSjS3SbRYy",
+"JRJQBXflUq","OUqFMbgJAz","7Ow5CJKWYR","MojnPtuDyS","uvf7A4QMc9","k85Ae1j5L8","2TRI7bZLvS","mz8gxYw2oU","LewvMs4786","16lHchSSvQ",
+"MezSWSjskQ","Zv7z0azIWp","nFqikS77LH","okgRiuAWyp","suY4xcL0aE","CdyBVGXdoH","0Kyfsd85a9","SbRYyQClRL","0Wr5ylViBv","bZLvSWMiS3",
+"faHirAIYUu","FVMxouPX7G","WreyP9XyT9","BFkb8jtn0X","FVMxoaDGtS","zY1GYZuDtD","RkQkeM6qcG","bgJAz7fsYM","prNT6XflUq","HP433WMiS3",
+"JKWYRFFDui","o8Uydiqv4k","Dz1R3a00b5","CNHmv580YD","xXTI4JIqXi","8xEKzYf2Ec","zY1GYNxx9V","P6bcgOUYuF","580YDpmeCd","xXTI4uPX7G",
+"WMiS3IBe8k","3otm67Ow5C","tlILtBCxeC","nFqikl83Ud","NhXduMkgy8","okgRiAkKTk","LDk6f7hyVv","7lUXZCNHmv","580YDKZamH","8RCUAzY1GY",
+"vLsmScShY2","pWiOsS2Dfu","gdQsSzmLYD","dQ586soy9t","jeskSvkCHH","Mm8siLbRTH","pFrrlAOgEe","GSQwjCfgr3","FVMxoydG8U","kB5nPSs0Zu",
+"0PktIsqVrf","cShY2ZzJHW","tjQxsaFFss","iB08laL6AJ","jeskSOxWIH","yvOMIFVMxo","jtn0XnFqik","K4GS80h1b1","AIYUu7lUXZ","QClRLlViBv",
+"guMb8K20wK","8hJdt1LB1L","Cfgr3U3yw5","brhlQBFkb8","B3qemzHF1q","JkzUnEoToP","ru4UGLDk6f","ZhwG1RsQUq","fmIK1GWqqX","rKDLJFxX9q",
+"d7vjMBFkb8","euZA5Twano","QYxC0Qworu","yofH30PktI","AgJHQYjB9t","ni2v1gIYvE","ZJTXHprNT6","S77LHo8Uyd","In3NSaDGtS","JIqXiChuy3",
+"VNCPdRmDcr","lCMxy29QAz","OxWIHUl4a1","gtCA5QWxoT","7X3uyW3VFH","pAhR1FcWrW","lpF6Wa00b5","EOE1o8U2nU","yvOMICNHmv","dmoS7Ta8f6",
+"9y4lwsqVrf","blLA9W7cTs","QssNCGv3Fq","618DigtCA5","b29RJNo0Qb","iKqhrQ6hMC","S77LHlCMxy","suY4xAIYUu","JXljWBbwgA","DLhzMyluBx",
+"FFDui07n1c","YOfrYVBjhz","fqypybZLvS","bZLvSVjCZq","rhl0JjzUqR","s93MlHP433","14FLRx3LDe","VjCZq2DREs","RpBQm5VZjS","uupzksuY4x",
+"MezSW0ao3l","L7cGcs93Ml","Vprf2Q6Lix","W7cTsKZamH","618Di5ZaEz","uoStwAmdQd","7lUXZlH1kt","ZuDtDs93Ml","U3yw5k85Ae","l83UdHP433",
+"RmDcrIjTwP","NAFuwkZANm","5VZjSJkzUn","YjB9txXTI4","KASQ8i7WMQ","iB08lyToGW","NAFuw9rlg9","6q6L9uN6r3","FxX9qK20wK","5NammuAWyp",
+"HP4333otm6","M6qcG16lHc","L7cGcKsjRK","FNYIMhYBCK","s7MxkdhSuH","uQIczpmeCd","Zv7z0U3yw5","ix74rG1RhS","SbRYypAhR1","WDVWJni2v1",
+"VerEA7ku1p","lCMxy4W0Tl","KZamHVBjhz","cL0aElsQGo","07n1czY1GY","WMiS3sqVrf","Yh1hFkB5nP","QYxC0lViBv","oVQp6blLA9","XflUquupzk",
+"5iGN5dhSuH","0h1b1pvgjS","8cVD38RCUA","HRxd8In3NS","JRJQBciuWz","brhlQMm8si","NhXdu7Ow5C","tlILts7Mxk","rKDLJCIShG","Pb1payvOMI",
+"cQOnvK20wK","1LB1LtvdkD","Pb1pa6AFT0","6AFT01v5hH","EOE1o2ZHdk","DLhzMQssNC","HzZT8QssNC","LbRTHiwzGk","Oz8yZQworu","X6Pinl83Ud",
+"tAOsrCxVEf","MK07YSmGzv","KASQ807n1c","zHF1qWMiS3","9iGoTAgJHQ","TCgPpjS1aj","qQxHPI7p2a","5VZjS2ZHdk","FVMxoiB08l","45cIHtaOXK",
+"5Drn0t98iW","gdQsSvLsmS","G1RhSKr8ys","djsrv16lHc","ydG8U5drc6","8RCUAReKEW","hE1QlIn3NS","5ZaEzjzUqR","Waim6jS1aj","Gv3FqpWiOs",
+"dhSuHsx5Gl","lCMxyFjHXR","kB5nP9GXkX","LewvMyofH3","ZuDtD5ZaEz","uLtKs48cHL","GXdoHcShY2","lkMUAW7cTs","SjskQJIqXi","B3qemPb1pa",
+"TXQ0ZguMb8","ThjNnuLtKs","P6bcg1v5hH","brhlQgIYvE","fmIK1CqqaD","wiHrZtuDyS","wDajXNcICA","piJSkpv0i7","LDk6fVIlwP","4W0Tldjsrv",
+"BpYhVlm0pD","In3NS1v5hH","6q6L9pT8wu","2TRI7a00b5","dhSuHFwEJz","TCgPpCK5W7","J2mQivkCHH","Ul4a1aFFss","K4GS8aDGtS","580YDzQt6Q",
+"aL6AJ0Kyfs","n1pmOYOfrY","J2mQi8TxD7","PYBf4ZhwG1","RBhp0Yh1hF","lsQGogtCA5","HRxd85drc6","Mkgy8RsQUq","BpYhVB3qem","fFDrJyToGW",
+"nlaByCdyBV","WreyPguMb8","2hEEUdpe1v","8FmFHprNT6","KsjRKMmsIo","XyPZN9iGoT","AkKTk0MR5X","v8yFNMkgy8","piJSkogLgc","WaWsvYh1hF",
+"580YDTXQ0Z","aez9ydhSuH","FnPFBcQOnv","yofH3Waim6","7Ow5CQssNC","RkQkeTwano","hUTw76AFT0","rKDLJzz4ZU","fmIK12DREs","2Yz7ERpBQm",
+"Q6LixJXljW","gtCA57fsYM","3weIFd7vjM","Ul4a1D6rBy","9GXkXBFkb8","16lHc2TRI7","oQ87r0ao3l","07n1cgdQsS","azIWp55rfB","KZamHCp3mZ",
+"Q6LixgdQsS","Gv3Fq5Mg9r","lm0pDXflUq","6q6L9dQ586","rz7Utatef2","vLsmSoQ87r","EOE1oBFkb8","v1HlnW3VFH","iqv4kQ6Lix","BpYhVcShY2",
+"KsjRKyToGW","SjskQ16lHc","5IhmG7fKYU","OUqFMWreyP","4QMc9rKDLJ","NhXduciuWz","uoStwi3pyd","0YAGH64s8N","9y4lwJRJQB","DLhzMTa8f6",
+"4QMc9OHaBz","rz7UtVjCZq","J2mQi8xEKz","jzUqR4QMc9","CK5W7W7cTs","2Yz7EKr8ys","uPX7GguMb8","M6qcGzmLYD","VIlwPdjsrv","bgJAztAOsr",
+"TCgPp7lUXZ","5nmWviqv4k","UlU3MfLNg8","ZUnqtLDk6f","ZzJHWRzaZA","DQimpNo0Qb","k85AeHzZT8","v1HlnQssNC","ZzJHWix74r","FhtglblLA9",
+"29QAzfcwDa","G1RhSAkKTk","0ao3lDcpWB","RsQUqQssNC","MezSWHfyNQ","FnPFBFcWrW","uvf7AQnJ1S","RsQUqs7Mxk","MojnPdjsrv","0BmCyQbxXc",
+"W7cTsSbRYy","ru4UGfFDrJ","QbxXcAgJHQ","cQOnv0ao3l","blLA9nlaBy","LewvMKsjRK","pFrrl7lUXZ","nlaByeuZA5","DLhzMru4UG","7lUXZFNYIM",
+"v1HlnChuy3","aFFss7X3uy","qaofNYw2oU","zz4ZU1j5L8","uLtKsThjNn","ZJTXHM3zXL","FhtglXflUq","dQ586jiVBP","G1RhSJKWYR","prNT6VerEA",
+"MojnPlweGy","x3LDeyToGW","yofH3wDajX","8RCUAzFgtB","0h1b1TCgPp","okgRiIRh48","MojnPOHaBz","0Wr5ycL0aE","8TxD7t98iW","gIYvE7lUXZ",
+"faHirdhSuH","5ZaEzogLgc","8hJdtQssNC","WreyPBpYhV","O3iyQ9iGoT","okgRiQssNC","OUYuFhi5X7","CNHmvUvlv4","CqqaDRpBQm","HfyNQfLNg8",
+"7fKYUVLTy6","he9IATa8f6","VIlwPDz1R3","KZamHnlaBy","mX2GEMK07Y","QnJ1Sa00b5","2DREsguMb8","aFFsskZANm","fcwDaVprf2","HfyNQRBhp0",
+"5IhmG8RCUA","uPX7GJ2mQi","7fKYUuN6r3","FNYIMlCMxy","zmLYDpFrrl","soy9t1LB1L","hi5X7uN6r3","nnP8oZUnqt","JXljWjS1aj","8cVD3o8Uyd",
+"pv0i7ZzJHW","NhXdun1pmO","rhl0J5drc6","gtCA5Uvlv4","MmsIojS1aj","yEfy9BCxeC","ru4UG8cVD3","Dz1R3uupzk","AmdQdrz7Ut","FVMxon8pJ9",
+"OUqFMdhSuH","HlUbFOUqFM","taOXK07n1c","1v5hHDLhzM","Kr8ys1j5L8","GrDg7fcJOy","pv0i7VIlwP","5ZaEzn1pmO","0Kyfsdpe1v","brhlQuvf7A",
+"dhSuHix74r","8TxD7SjskQ","soy9tP6bcg","WreyP1j5L8","e6e4ztlILt","LewvMIKxdL","IjTwPpWiOs","tjQxsWDVWJ","JkzUnpmeCd","BGaQYVIlwP",
+"C2Irc7X3uy","zHF1qvLsmS","guMb8FxX9q","5ZaEzNAFuw","EoToPnFqik","Cp3mZVLTy6","VBjhz2Nslm","b29RJ0Wr5y","v1HlncmXIX","POUYShUTw7",
+"UlU3Mn1pmO","9y4lwHlUbF","QbxXcRzaZA","jfREuqQxHP","VLTy6Zv7z0","gjUTupvgjS","5Mg9rbZLvS","fcwDa8xEKz","dQ586bgJAz","pvgjStjQxs",
+"SjskQRpBQm","8RCUA0PktI","n1pmOzbIYY","kB5nP14FLR","7lUXZZuDtD","FjHXR5nmWv","wiHrZcL0aE","Yw2oUbrhlQ","FPfSEQ6Lix","LDk6fpT8wu",
+"prNT6ix74r","brhlQhe9IA","guMb8Q6Lix","9y4lws93Ml","yvOMIdQ586","5nmWv5nmWv","hi5X7gtCA5","RACujZhwG1","iqv4kSbRYy","FhtglFnPFB",
+"lViBvQbxXc","2hEEUo8Uyd","1j5L83otm6","YjB9tblLA9","k85AeuTacx","NAFuwB3qem","FVMxoJXljW","suY4xAXpwE","jfREulm0pD","D6rBy24ARF",
+"RpBQmVprf2","yEfy9QYxC0","BpYhVIn3NS","64s8N6q6L9","lH1ktpWiOs","fLNg8lj07Q","uN6r39iGoT","7fKYU5drc6","ciuWzdmoS7","n8pJ9X6Pin",
+"ZhwG1fcJOy","64s8NNo0Qb","ulk41JJs5m","HlUbF580YD","C2Irclj07Q","45cIH7fsYM","9eoRcgf8rI","SjskQAgJHQ","8RCUAB3qem","MGlTFfaHir",
+"TXQ0ZksJby","9rlg90PktI","M6qcGpvgjS","FFDuiHlUbF","n1pmOsx5Gl","JXljWAXpwE","WmadAaez9y","RxrsmyToGW","HlUbFhi5X7","B3qemDz1R3",
+"i7WMQHRxd8","t98iW0ao3l","K4GS8Q6Lix","uvf7AFFDui","F6PT2n8pJ9","FNYIMU3yw5","GrDg7FPfSE","BFkb8FNYIM","KASQ8FcWrW","JRJQB5VZjS",
+"2Yz7EDcpWB","suY4xuQIcz","CNHmvn1pmO","MmsIoS2Dfu","XyPZNK20wK","TXQ0ZCp3mZ","5nmWvTwano","IjTwPPOUYS","zY1GYcQOnv","FNYIMeuZA5",
+"EoToPCqqaD","k85AeDG4sT","0YAGH8xEKz","9y4lwKASQ8","GXdoHksJby","RmDcrDz1R3","5IhmGVBjhz","Y1mC0In3NS","uPX7G2hEEU","Oz8yZM3zXL",
+"MK07YhYBCK","oQ87rzFgtB","pWiOsmz8gx","hi5X7tvdkD","taOXKlsQGo","7hyVvazIWp","QssNCAXpwE","LewvMh1zcH","Mm8siQnJ1S","okgRibgJAz",
+"kB5nPfqypy","Oz8yZ0BmCy","gIYvEaL6AJ","XflUqG1RhS","ciuWzpWiOs","CxVEftvdkD","oVQp6dhSuH","ix74rOUqFM","Yw2oUokgRi","zbIYYqaofN",
+"CIShGaez9y","nnP8o7fsYM","07n1cl83Ud","1j5L8rKDLJ","xReecdpe1v","yluBxzqH0W","VerEA0h1b1","FxX9qL7cGc","ciuWzaDGtS","yToGWOz8yZ",
+"hSSvQzQt6Q","fLNg8cL0aE","Yw2oU9y4lw","ni2v1oQ87r","DQimp580YD","hi5X7CxVEf","iB08lv2eC3","n8pJ9gIYvE","ZJTXHi7WMQ","2Yz7ENo0Qb",
+"t98iWsqVrf","Cfgr3FcWrW","pT8wu16lHc","HRxd8X6Pin","DG4sTxReec","In3NSOUYuF","Y1mC07hyVv","BpYhV0h1b1","JXljWqUJMd","ReKEWNhXdu",
+"oQ87rBpYhV","prNT6pv0i7","Yh1hFkZANm","0PktI5VZjS","RmDcrmX2GE","hUTw79y4lw","FhtglwDajX","n8pJ9BCxeC","55rfBUlU3M","5nmWvXflUq",
+"0ao3lEoToP","yEfy9rKDLJ","lpF6Wt59lR","ZUnqt2TRI7","29QAzwiHrZ","J2mQi3otm6","0PktIW3VFH","CqqaDL7cGc","Z4I1v3weIF","0h1b1CdyBV",
+"WaWsvjtn0X","FFDuiQworu","qUJMduN6r3","MezSWguMb8","azIWpZv7z0","F6PT2e6e4z","5Mg9rlXFOB","hSSvQWaim6","4W0Tlb29RJ","OxWIHVerEA",
+"ciuWz0ao3l","WaWsv7X3uy","suY4xgjUTu","MezSWBbwgA","ogLgcFVMxo","Zv7z07Ow5C","d7vjMblLA9","24ARF16lHc","StlDJciuWz","9y4lwmz8gx",
+"faHiruLtKs","Cp3mZMojnP","EOE1oCdyBV","pWiOs7hyVv","ThjNnfaHir","MaJQsBFkb8","0YAGHNcICA","dQ586VLTy6","LDk6fD6rBy","QYxC0OUqFM",
+"lXFOBjiVBP","tAOsrJKWYR","W3VFHJRJQB","48cHLSmGzv","NAFuwCIShG","C2IrciwzGk","zqH0WEoToP","FnPFB3otm6","Qworud7vjM","9rlg9pAhR1",
+"CIShGJXljW","ogLgca00b5","SWfou8hJdt","RkQkeoGu6x","ix74rlpF6W","WMiS3i3pyd","nFqikMmKGJ","2ZHdkd85a9","L7cGcQChxs","ulk41DG4sT",
+"NOHszSmGzv","I7p2arKDLJ","JJs5mStlDJ","uPX7G7hyVv","xReec8xEKz","yofH3K4GS8","tvdkDpv0i7","9eoRcIKxdL","ThjNnVprf2","K20wKIjTwP",
+"QbxXcJJs5m","uTacx2TRI7","IjTwPyEfy9","XflUqdhSuH","faHirciuWz","8RCUABpYhV","0Wr5yZzJHW","pT8wuB3qem","9iGoTv1Hln","fcwDa07n1c",
+"9eoRc0ao3l","uQIczQbxXc","MmsIo5ZaEz","CNHmvIjTwP","sx5GlTwano","cL0aE6q6L9","Q6hMCyToGW","x3LDe6AFT0","zQt6Qpv0i7","uJScXVjCZq",
+"7fsYM5VZjS","Waim6AIYUu","07n1c3weIF","SWfouuPX7G","taOXK0h1b1","D6rBywDajX","HP433ZuDtD","he9IAlpF6W","0YAGHtlILt","tuDySIn3NS",
+"xReece6e4z","5IhmG5drc6","2NslmVprf2","qQxHPQChxs","lkMUAVBjhz","MojnPt98iW","6AFT0DcpWB","JXljWm4bxU","gIYvEVNCPd","atef20h1b1",
+"EOE1oqUJMd","5Mg9rDQimp","F6PT2RsQUq","iwzGkFhtgl","bgJAzv1Hln","Ta8f6oVQp6","lj07Q8TxD7","fLNg8U3yw5","EdBKcaez9y","U3yw58FmFH",
+"bgJAzpT8wu","DcpWBrhl0J","5Mg9rZhwG1","WmadAWreyP","rKDLJo8Uyd","7fKYUJkzUn","wiHrZQ6hMC","XflUqEOE1o","8cVD3blLA9","MGlTFIRh48",
+"xReecgdQsS","suY4xKsjRK","S77LHNxx9V","CK5W75Drn0","qaofNIKxdL","ru4UGuZPqg","oQ87rtaOXK","IKxdLThjNn","h1zcHCxVEf","5iGN5uPX7G",
+"UmaEvZuDtD","FLsphOUYuF","WDVWJ5ZaEz","FLsphaez9y","fmIK1Yf2Ec","NAFuwF6PT2","azIWp618Di","kZANmGXdoH","tl72WLewvM","QChxst98iW",
+"MojnPjeskS","PYBf48cVD3","24ARFRBhp0","RACuj7fsYM","VBjhzS2Dfu","QworupAhR1","i7WMQ7hyVv","MojnPhUTw7","FVMxosuY4x","qUJMdKr8ys",
+"W3VFHB3qem","FxX9qFVMxo","CqqaD8TxD7","AmdQdXflUq","tvdkDCxVEf","rhl0J8RCUA","RsQUqkZANm","C2IrcpiJSk","Qworu48cHL","X6PinS2Dfu",
+"sqVrfFPfSE","zY1GYxXTI4","Mm8siYh1hF","pvgjSv1Hln","7lUXZjzUqR","GWqqXyofH3","HP433K4GS8","8cVD3jfREu","8cVD3iKqhr","uAWypDz1R3",
+"jtn0XFVMxo","uZPqgydG8U","lsQGo0Kyfs","K4GS8pvgjS","azIWp64s8N","Twanosx5Gl","QssNCGXdoH","pvgjS55rfB","EoToPP6bcg","gdQsS2hEEU",
+"2TRI7SWfou","W3VFHSmGzv","he9IA618Di","lsQGopAhR1","5drc6nlaBy","pvgjSFLsph","RBhp0LewvM","CxVEfd85a9","JkzUn5VZjS","PYBf4Z4I1v",
+"CK5W7DcpWB","5IhmGb29RJ","CNHmv7Ow5C","MojnPMojnP","ZJTXH07n1c","hUTw7lweGy","i7WMQFNYIM","AkKTkmX2GE","WMiS3Yh1hF","FwEJzhE1Ql",
+"XflUqs7Mxk","7fKYUFwEJz","0Wr5yYf2Ec","zqH0W9XyT9","48cHLkZANm","FhtglOUYuF","Mkgy8kB5nP","GWqqX7fsYM","DG4sTL7cGc","BCxeCbrhlQ",
+"No0QbBGaQY","LDk6f618Di","MezSWRmDcr","t98iWUmaEv","uupzk0BmCy","FFDuiCdyBV","gdQsShYBCK","Mkgy8cmXIX","16lHcciuWz","suY4xX6Pin",
+"VNCPdyEfy9","QbxXcFhtgl","zbIYYiKqhr","azIWplViBv","hi5X7QssNC","kB5nPIjTwP","Dz1R3fcwDa","gf8rIPYBf4","No0QbIBe8k","IBe8kzbIYY",
+"4dEz6gdQsS","fcwDavOqCE","lm0pDQnJ1S","EoToPvOqCE","s4786SWfou","DG4sTlkMUA","5drc65Mg9r","PYBf4FLsph","FNYIMYh1hF","RpBQm9iGoT",
+"tuDyS6AFT0","7lUXZGWqqX","FcWrWYjB9t","Ss0Zuo8Uyd","5nmWv0h1b1","3weIFVNCPd","SbRYylViBv","QssNCvOqCE","CxVEfB3qem","lweGy45cIH",
+"VjCZquPX7G","0h1b1kB5nP","FxX9quTacx","iKqhrIRh48","RkQkepiJSk","JkzUngIYvE","8FmFHCp3mZ","oGu6xGWqqX","9rlg9LbRTH","GSQwjGSQwj",
+"IjTwPcL0aE","DQimp0Kyfs","pT8wuFhtgl","mz8gxHlUbF","RpBQm5drc6","W7cTs48cHL","s93Mlo8Uyd","AmdQdGWqqX","FxX9qFnPFB","zHF1qEoToP",
+"e6e4zoGu6x","9GXkXD6rBy","5drc6euZA5","ReKEW4W0Tl","Kr8ysdpe1v","aez9yb29RJ","b29RJcmXIX","uZPqgjfREu","t59lRTXQ0Z","ECMvUEoToP",
+"uZPqgfaHir","djsrvL7cGc","9y4lwMezSW","pv0i7uAWyp","jeskSKr8ys","4QMc9Yf2Ec","4dEz6Cfgr3","5NammBFkb8","0ao3l2Nslm","tl72W8cVD3",
+"uLtKstl72W","KZamHjtn0X","NOHszuJScX","Pb1paUlU3M","lj07QzbIYY","Nxx9VLewvM","i7WMQ2Nslm","i7WMQVprf2","9XyT9jtn0X","55rfBG1RhS",
+"TwanoK20wK","CdyBV5ZaEz","gjUTuSbRYy","I7p2aAgJHQ","KZamHYf2Ec","24ARFZzJHW","Rxrsms7Mxk","oGu6xBGaQY","uTacxvOqCE","zbIYYe6e4z",
+"9GXkXUmaEv","Q6hMC0PktI","WreyPVLTy6","2DREsUmaEv","iqv4kCdyBV","RACujru4UG","ReKEWKsjRK","Zv7z0ZuDtD","uoStwHP433","tAOsrnnP8o",
+"iwzGkTCgPp","I7p2aBGaQY","s93MlBFkb8","v8yFN8hJdt","QssNCiwzGk","zHF1q64s8N","oQ87rUlU3M","IKxdL2DREs","5ZaEzzFgtB","AkKTkpAhR1",
+"14FLRcShY2","QnJ1SiwzGk","7fsYMECMvU","QClRLxXTI4","KsjRKGrDg7","WPmlxW3VFH","YjB9tvLsmS","MmKGJReKEW","rKDLJFFDui","9y4lwrKDLJ",
+"WPmlx0h1b1","v1HlnOxWIH","1v5hHMkgy8","8U2nUBCxeC","yofH3zqH0W","QbxXc8xEKz","JIqXin8pJ9","uupzkB3qem","FxX9q0YAGH","EdBKcsoy9t",
+"BFkb8sqVrf","JIqXiXyPZN","MGlTFogLgc","KASQ8azIWp","Cp3mZRmDcr","DLhzMDcpWB","AOgEe2DREs","qUJMdY1mC0","CxVEfStlDJ","zHF1qOxWIH",
+"IRh48uoStw","9eoRcZ4I1v","Oz8yZzmLYD","1j5L8W3VFH","BGaQYqaofN","Nxx9VuAWyp","IRh48lkMUA","RxrsmguMb8","LewvMb29RJ","uAWypWDVWJ",
+"Ul4a1LbRTH","ZzJHWMm8si","OUqFMtaOXK","55rfBFNYIM","7Ow5C2hEEU","ZhwG17X3uy","cQOnv580YD","jfREuTCgPp","xReeccShY2","oVQp6s93Ml",
+"he9IA4dEz6","WDVWJeuZA5","VjCZqazIWp","gf8rIuN6r3","gtCA5zmLYD","n1pmOyEfy9","POUYSQnJ1S","faHirTa8f6","a00b5VerEA","GSQwjWreyP",
+"VLTy6ogLgc","FNYIMqaofN","dQ586ZhwG1","GWqqXd85a9","jfREu2TRI7","8xEKzxciqp","xXTI40h1b1","RkQkeHRxd8","ZuDtDhSSvQ","FVMxoCp3mZ",
+"tjQxsogLgc","4QMc9xXTI4","U3yw55Mg9r","hi5X7Y1mC0","YOfrYXyPZN","EoToPe6e4z","uoStwlkMUA","ix74rksJby","MaJQsFNYIM","d85a91v5hH",
+"gf8rIhSSvQ","0h1b1Pb1pa","ZhwG1fmIK1","Zv7z0lXFOB","NOHszyToGW","uLtKs1v5hH","9eoRcX6Pin","X6Pin2Yz7E","8TxD7CqqaD","Chuy3FwEJz",
+"uvf7A8xEKz","1LB1LIjTwP","hUTw7uPX7G","s93Ml5IhmG","7lUXZdpe1v","2ZHdkChuy3","6AFT04QMc9","X6PinM3zXL","6AFT0oGu6x","5Namm5Namm",
+"OUqFMgIYvE","ThjNnhE1Ql","yToGWogLgc","WMiS3S2Dfu","kB5nPvkCHH","Q6Lixmz8gx","0ao3lWreyP","580YDlXFOB","0ao3lWDVWJ","MGlTFgdQsS",
+"M6qcG8FmFH","VLTy6yluBx","GXdoHTXQ0Z","jS1ajMm8si","EOE1oDG4sT","3weIF0Wr5y","piJSkY1mC0","t98iWTwano","sqVrfsuY4x","JIqXi5Mg9r",
+"DG4sTQnJ1S","uZPqg5drc6","FPfSEAXpwE","wiHrZt98iW","qaofNBpYhV","0h1b1NOHsz","5NammRACuj","lXFOBQbxXc","uupzkKZamH","BGaQY2DREs",
+"S77LH6q6L9","lj07QCNHmv","uLtKsIjTwP","GrDg7nlaBy","QnJ1SPb1pa","AmdQdTXQ0Z","kB5nPVLTy6","G1RhSQssNC","ciuWzlCMxy","8FmFHAOgEe",
+"rKDLJFjHXR","FjHXR0Wr5y","Rxrsmn8pJ9","ECMvUpFrrl","tvdkDFjHXR","e6e4zIBe8k","Yw2oUyluBx","JKWYR7X3uy","Kr8ys2DREs","nnP8opvgjS",
+"O3iyQgtCA5","F6PT2CdyBV","WreyP2TRI7","guMb8iwzGk","8xEKzy94nw","7X3uyprNT6","he9IAfmIK1","ZJTXHDcpWB","Kr8ys9y4lw","ix74rFcWrW",
+"ZJTXH8cVD3","piJSklH1kt","2DREs0Wr5y","zHF1quQIcz","4QMc97hyVv","AOgEe4QMc9","VjCZqzQt6Q","8U2nU7hyVv","48cHLlViBv","dpe1vWDVWJ",
+"Nxx9VO3iyQ","okgRigtCA5","AkKTkzqH0W","RsQUqiwzGk","3otm6DLhzM","IKxdLqQxHP","jeskSXflUq","lCMxy5ZaEz","HP433djsrv","fcJOy5Namm",
+"AOgEeTa8f6","pv0i70ao3l","ZhwG1LDk6f","pmeCdXflUq","lViBvyofH3","jSjS30BmCy","JJs5mCqqaD","7ku1pW7cTs","48cHLdjsrv","qUJMdO3iyQ",
+"8cVD3RACuj","VIlwPtaOXK","DLhzMYOfrY","jeskSOUqFM","ThjNnKZamH","9eoRc5drc6","StlDJbgJAz","cmXIXNAFuw","LDk6f4W0Tl","KZamHM3zXL",
+"JKWYRJkzUn","Waim67hyVv","1v5hH9eoRc","M6qcGVBjhz","FwEJz7fsYM","aFFss1v5hH","C2IrcWreyP","NcICAAXpwE","C2IrcoGu6x","VerEAMmsIo",
+"X6PinwDajX","CxVEfni2v1","cL0aEyofH3","P6bcgx3LDe","lsQGociuWz","QClRLYh1hF","qaofNhYBCK","pAhR1HlUbF","C2Ircsoy9t","QworuRsQUq",
+"pAhR1aDGtS","RxrsmuTacx","RxrsmVBjhz","7fsYMzQt6Q","QnJ1S0h1b1","hE1QlQWxoT","W3VFHnnP8o","SjskQa00b5","cL0aEs4786","2DREs9rlg9",
+"lj07QogLgc","ix74r2TRI7","ix74rpAhR1","S2DfuUlU3M","VjCZqCNHmv","7lUXZOUYuF","GrDg7Yh1hF","In3NSwiHrZ","3otm6zbIYY","RpBQmIRh48",
+"NAFuwix74r","gIYvE0ao3l","I7p2a4W0Tl","yvOMIzmLYD","lm0pDfcJOy","AXpwEzQt6Q","FwEJz2hEEU","piJSkeuZA5","iwzGkC2Irc","nlaBytaOXK",
+"nFqikCIShG","Gv3FqUvlv4","oVQp6rKDLJ","1j5L8XyPZN","M3zXLZ4I1v","gtCA54QMc9","WMiS3s4786","8U2nUa00b5","0ao3ls7Mxk","Nxx9VHP433",
+"hi5X74dEz6","pv0i7580YD","h1zcH5Mg9r","guMb8jS1aj","n8pJ9kZANm","CIShG8FmFH","55rfBzmLYD","aL6AJO3iyQ","IBe8kQworu","VBjhzlCMxy",
+"EoToPlpF6W","Uvlv4uLtKs","DG4sTNAFuw","CIShGJRJQB","Uvlv4uupzk","GrDg7oQ87r","Kr8ysk85Ae","s7MxkGv3Fq","sqVrf14FLR","9GXkXzHF1q",
+"KASQ8fLNg8","gtCA5lj07Q","8U2nUQnJ1S","lsQGoQworu","UlU3MJRJQB","CNHmv4dEz6","FLsphM6qcG","oGu6xTXQ0Z","JRJQBFxX9q","HP433gjUTu",
+"1j5L8n8pJ9","vkCHHCqqaD","cShY2JKWYR","uPX7GiKqhr","7fsYMzqH0W","Chuy3pWiOs","2NslmuoStw","POUYSciuWz","F6PT2ZuDtD","fcJOyF6PT2",
+"oQ87raDGtS","s47866AFT0","O3iyQBCxeC","0YAGHQnJ1S","HzZT8KZamH","GSQwjAIYUu","blLA9EdBKc","mX2GE7hyVv","1LB1Ldjsrv","yvOMIlpF6W",
+"fcJOycQOnv","oGu6xJkzUn","CqqaDlCMxy","ydG8UVerEA","BGaQY1LB1L","dpe1v14FLR","iqv4kjSjS3","lCMxyRmDcr","I7p2aMkgy8","SbRYyazIWp",
+"tuDySjS1aj","HzZT8jtn0X","VerEAGSQwj","AgJHQaFFss","4dEz6ZuDtD","FNYIMjiVBP","FVMxoQssNC","zQt6Qru4UG","rhl0JuJScX","iqv4kCxVEf",
+"JRJQBhYBCK","6q6L9RpBQm","yluBxgtCA5","Mm8siksJby","uLtKsVIlwP","a00b5VjCZq","StlDJCK5W7","mz8gxvkCHH","VBjhzK20wK","IjTwPJIqXi",
+"ciuWzn1pmO","UlU3MfcwDa","CIShGl83Ud","m4bxUvLsmS","zqH0WdhSuH","WreyPMm8si","64s8NhSSvQ","FjHXRWMiS3","48cHLQChxs","KZamHjfREu",
+"0PktIZ4I1v","djsrvI7p2a","h1zcHYf2Ec","jtn0XtlILt","wDajXMmsIo","WPmlx0MR5X","zmLYDpmeCd","5drc6gIYvE","zqH0WlkMUA","MojnPTa8f6",
+"AIYUu64s8N","IRh48uN6r3","FNYIMiB08l","FwEJzFcWrW","gIYvEyluBx","dQ586MezSW","RBhp08xEKz","FxX9qRzaZA","VNCPdK4GS8","aez9yQClRL",
+"W3VFHlkMUA","rKDLJs4786","Q6hMCdmoS7","BFkb8suY4x","s7Mxk8TxD7","POUYSMK07Y","yEfy9X6Pin","64s8NQ6Lix","euZA5ZzJHW","xXTI4MojnP",
+"Chuy3WMiS3","Yw2oUpAhR1","VNCPd5Mg9r","GrDg7aDGtS","ECMvUQYxC0","Qworu0Kyfs","d85a9VBjhz","JKWYREdBKc","WPmlxPYBf4","kB5nP9eoRc",
+"Uvlv4v1Hln","sx5GlFFDui","n1pmOVLTy6","S2DfuBGaQY","CxVEfQClRL","Yh1hFDcpWB","LbRTHqaofN","hYBCKM3zXL","ZJTXHo8Uyd","gIYvEVjCZq",
+"tAOsrtvdkD","gdQsSuAWyp","TXQ0ZBpYhV","W7cTsLbRTH","1LB1LzQt6Q","RzaZA7fKYU","HP433ni2v1","29QAzMkgy8","24ARFuN6r3","lsQGovLsmS",
+"prNT6W3VFH","1j5L89rlg9","brhlQX6Pin","SmGzvuZPqg","Fhtgly94nw","XflUq55rfB","2NslmDLhzM","WPmlxNAFuw","Ss0ZuzQt6Q","lkMUAYh1hF",
+"Cfgr3AmdQd","RmDcrjeskS","mz8gxVprf2","M3zXLDG4sT","zY1GYCNHmv","Uvlv4lm0pD","5Drn0FjHXR","MaJQspvgjS","uPX7GThjNn","RmDcrUvlv4",
+"LDk6f7lUXZ","qUJMd9eoRc","8xEKz9iGoT","KZamHlj07Q","IjTwPciuWz","dmoS7kB5nP","gdQsSnFqik","rhl0Jdjsrv","DLhzM9y4lw","07n1cHfyNQ",
+"yluBxZhwG1","t98iWIBe8k","RzaZA7ku1p","ECMvUk85Ae","RzaZAQChxs","7Ow5CXyPZN","tl72WlweGy","ThjNnCxVEf","0MR5XJIqXi","AXpwEQChxs",
+"8xEKz8U2nU","9rlg9zbIYY","WMiS3RkQke","FhtglUmaEv","AIYUutaOXK","HP433WDVWJ","jS1ajzHF1q","9rlg9LDk6f","Cfgr3MojnP","B3qemWmadA",
+"J2mQiogLgc","QnJ1Szz4ZU","1v5hH618Di","14FLROxWIH","GXdoHgf8rI","EoToPYf2Ec","a00b5K20wK","B3qemFNYIM","pFrrl9rlg9","Yw2oUyvOMI",
+"ru4UG2Nslm","OUqFMni2v1","qUJMdMK07Y","SmGzvJXljW","TXQ0ZYOfrY","QssNC5IhmG","LbRTHS77LH","TXQ0ZMm8si","FVMxoKASQ8","iqv4kAIYUu",
+"s4786RkQke","i7WMQJRJQB","GXdoHDLhzM","jS1aj7fKYU","Waim68RCUA","NhXduHzZT8","BCxeCW7cTs","mX2GEydG8U","LDk6fyEfy9","CK5W7SWfou",
+"QWxoTK20wK","k85AeDz1R3","I7p2atl72W","jeskSuN6r3","QbxXc45cIH","AIYUus93Ml","5nmWvatef2","BpYhVbrhlQ","DcpWBAgJHQ","Oz8yZx3LDe",
+"aL6AJ48cHL","5nmWvL7cGc","9XyT9P6bcg","prNT6FjHXR","uLtKsMojnP","lj07QEdBKc","uN6r3oGu6x","8xEKzgIYvE","CxVEfJRJQB","XyPZNguMb8",
+"xciqpGv3Fq","Nxx9Vpv0i7","CqqaDrhl0J","Y1mC0M6qcG","wDajX9GXkX","GrDg7x3LDe","b29RJCqqaD","tAOsrlj07Q","djsrvMojnP","VIlwPo8Uyd",
+"Y1mC0GrDg7","Uvlv4aFFss","euZA55ZaEz","lXFOBru4UG","FPfSEUlU3M","ZUnqtQworu","ZUnqtRBhp0","uPX7GTCgPp","Yh1hF55rfB","yvOMI8FmFH",
+"5nmWvsqVrf","lXFOBJIqXi","7fKYUKr8ys","MGlTFHP433","jtn0XtvdkD","VjCZqatef2","uLtKsgtCA5","sqVrfQYxC0","DG4sTSs0Zu","qUJMdoGu6x",
+"F6PT2LewvM","Dz1R3Oz8yZ","jiVBPK20wK","FwEJzx3LDe","a00b52ZHdk","1j5L8lkMUA","Z4I1vEdBKc","o8UydKsjRK","55rfBhE1Ql","x3LDeBCxeC",
+"WPmlxsqVrf","m4bxUhUTw7","yofH314FLR","uZPqg64s8N","BFkb8Yh1hF","uAWypFxX9q","RkQkeWaim6","qUJMd7ku1p","5Drn0CK5W7","RmDcr2Yz7E",
+"C2IrcxReec","qaofNokgRi","QWxoTsx5Gl","MmsIoJJs5m","yluBxlH1kt","45cIHnnP8o","RBhp0qQxHP","faHirprNT6","lkMUAiKqhr","M6qcGgtCA5",
+"iqv4kix74r","jSjS3uQIcz","tuDySNAFuw","fmIK1B3qem","n8pJ907n1c","HP433fmIK1","In3NSnFqik","lkMUA5iGN5","xReec3otm6","HlUbFzqH0W",
+"ix74ruN6r3","G1RhS0YAGH","5IhmGsqVrf","M3zXL618Di","Ta8f6JIqXi","ZhwG1CxVEf","guMb8hE1Ql","uPX7GdmoS7","0h1b1ogLgc","fqypyNAFuw",
+"o8UydDLhzM","VLTy6uZPqg","soy9tMezSW","Mm8siQClRL","1v5hHW7cTs","GSQwjKASQ8","uTacx9XyT9","VBjhzZv7z0","EdBKc0BmCy","hSSvQgf8rI",
+"Yw2oUzY1GY","FhtglXyPZN","rhl0JW3VFH","yEfy9dmoS7","CNHmvs7Mxk","ydG8UFLsph","jiVBPt59lR","a00b5Mkgy8","tvdkDjfREu","ZuDtDFGzgp",
+"QbxXcpWiOs","0PktId85a9","piJSklm0pD","9eoRcfcwDa","Gv3Fq8xEKz","fcJOyJkzUn","aL6AJZzJHW","YOfrYmz8gx","ZuDtDNhXdu","GWqqXwiHrZ",
+"9rlg9tuDyS","Gv3FqQnJ1S","tvdkDO3iyQ","aL6AJWDVWJ","t59lRCxVEf","lweGyOxWIH","QClRL8TxD7","hi5X7Kr8ys","D6rByzY1GY","0PktIbrhlQ",
+"MGlTFMK07Y","ThjNnuoStw","LewvMdpe1v","ZJTXH16lHc","uTacxSmGzv","s4786uoStw","ciuWzTwano","GrDg7Chuy3","64s8NOUqFM","iB08lMmKGJ",
+"fmIK1OUqFM","lm0pDRmDcr","azIWpVerEA","lweGyGXdoH","t59lRNOHsz","Mm8siru4UG","S2DfujSjS3","AXpwECqqaD","Chuy3CxVEf","7fKYUbrhlQ",
+"lweGyD6rBy","7X3uy8cVD3","lViBvprNT6","2TRI7L7cGc","AOgEe0h1b1","pmeCdRzaZA","Ta8f6POUYS","TwanoLDk6f","S2DfugtCA5","pT8wuJXljW",
+"QworuhE1Ql","Yf2EcxReec","FPfSEFLsph","jeskSyvOMI","RBhp0pFrrl","xciqpoVQp6","okgRis4786","MezSWs93Ml","uAWypoGu6x","dpe1vFhtgl",
+"HP4332TRI7","AIYUuIjTwP","ulk419y4lw","GSQwjpT8wu","48cHLK4GS8","IRh48EOE1o","FcWrWnlaBy","HRxd80ao3l","0BmCyxciqp","faHiryvOMI",
+"JXljW0MR5X","M3zXLSbRYy","pFrrlIjTwP","xReec2ZHdk","yofH3POUYS","Dz1R3s93Ml","soy9tWreyP","tvdkDAmdQd","4QMc9Mm8si","vOqCEvLsmS",
+"8hJdttvdkD","mX2GElsQGo","AkKTkjiVBP","POUYSaFFss","oGu6xuvf7A","GWqqXWreyP","faHirzY1GY","okgRiciuWz","IBe8kQ6hMC","pvgjSlkMUA",
+"gjUTu5Mg9r","EOE1oMmKGJ","v1Hlne6e4z","Cp3mZQ6Lix","FNYIMTCgPp","cQOnvjzUqR","i3pydjtn0X","x3LDed7vjM","0Wr5yyEfy9","CK5W7hi5X7",
+"WmadAni2v1","pT8wuatef2","7fsYMaFFss","pmeCduZPqg","JXljW0PktI","Ta8f607n1c","BCxeClViBv","i3pydCIShG","ZUnqtHfyNQ","gjUTuQ6Lix",
+"QYxC0ogLgc","zFgtBThjNn","cmXIXRsQUq","hSSvQW3VFH","M3zXLVBjhz","1v5hHOUqFM","b29RJfcwDa","KsjRK0h1b1","1j5L8e6e4z","WaWsvzFgtB",
+"JkzUnMmsIo","MaJQsmX2GE","FwEJzlkMUA","FLsphzHF1q","HzZT8aL6AJ","nFqik55rfB","Yf2EcuTacx","ogLgcMmsIo","DQimpbrhlQ","6AFT0qUJMd",
+"tlILtyEfy9","jzUqRYf2Ec","cQOnvt98iW","i3pyd5ZaEz","7fsYMdhSuH","JkzUnIKxdL","MmsIoQ6hMC","JKWYRs4786","ulk41FwEJz","hE1QlB3qem",
+"ZhwG1yEfy9","5VZjSpv0i7","In3NSgjUTu","W7cTsHzZT8","CqqaDVLTy6","Q6hMCsuY4x","ZUnqtnFqik","nnP8oDG4sT","In3NSBFkb8","brhlQbrhlQ",
+"lm0pDt59lR","uTacxRxrsm","v8yFNyofH3","WreyPBGaQY","WDVWJ0YAGH","ECMvUqaofN","FhtglJIqXi","AIYUuYjB9t","jSjS3F6PT2","gdQsSMmsIo",
+"NAFuwFNYIM","dmoS7Dz1R3","EdBKc9XyT9","AOgEecShY2","jzUqRx3LDe","Kr8yspv0i7","nFqikVprf2","Cfgr3Rxrsm","I7p2aM6qcG","VerEA9iGoT",
+"Ss0Zu45cIH","qQxHPjSjS3","Gv3FqDcpWB","NAFuwIBe8k","a00b5RmDcr","StlDJpWiOs","NAFuwOHaBz","XflUqfFDrJ","5VZjS5Mg9r","tlILth1zcH",
+"2hEEUZv7z0","5ZaEz2Nslm","uAWyp8RCUA","WmadA8cVD3","Zv7z0QClRL","faHirvOqCE","UmaEv55rfB","v8yFNZhwG1","tAOsrbgJAz","lpF6WStlDJ",
+"iKqhrTwano","VLTy6ZJTXH","P6bcgn8pJ9","5IhmGX6Pin","jfREupFrrl","2NslmlsQGo","fFDrJStlDJ","Y1mC0DG4sT","uupzkzHF1q","ZUnqtC2Irc",
+"9XyT98FmFH","B3qemlCMxy","QworuRxrsm","uN6r3ix74r","G1RhSIBe8k","FGzgp9y4lw","VjCZqWaWsv","TXQ0ZiKqhr","4QMc92hEEU","Q6hMCCxVEf",
+"RmDcrB3qem","brhlQHfyNQ","M3zXLThjNn","0h1b1gdQsS","lpF6WoGu6x","FxX9quN6r3","cL0aERmDcr","faHirStlDJ","s4786JIqXi","qaofN5Mg9r",
+"QYxC09rlg9","FxX9qEoToP","tl72WlkMUA","ReKEWgtCA5","KASQ8kZANm","Q6hMCxReec","EdBKcMGlTF","s93MlfcwDa","M6qcG5nmWv","lCMxyDcpWB",
+"WmadATXQ0Z","AOgEehYBCK","S2Dfu7Ow5C","pWiOsqaofN","EOE1ouPX7G","yofH3yofH3","uPX7GjeskS","lkMUAfaHir","0KyfsbgJAz","uAWypGSQwj",
+"n8pJ9ZhwG1","fmIK1Chuy3","HfyNQWreyP","tvdkD8cVD3","WMiS3lViBv","Vprf2W7cTs","uLtKsgf8rI","v2eC3StlDJ","i7WMQSmGzv","GXdoHNxx9V",
+"G1RhSLDk6f","GXdoHCxVEf","CdyBVv2eC3","t98iWfqypy","FnPFBEoToP","jfREu6AFT0","s4786ix74r","8hJdtFcWrW","tAOsrrz7Ut","fqypypWiOs",
+"uAWypvkCHH","pmeCd8xEKz","45cIHNAFuw","YOfrYGrDg7","CNHmvlweGy","tuDySOxWIH","Cfgr3gf8rI","lsQGov1Hln","UlU3MHzZT8","W7cTs8hJdt",
+"RACuj1j5L8","9GXkXjzUqR","lm0pDBpYhV","BCxeCCfgr3","FhtglqaofN","16lHc0MR5X","FFDuiVNCPd","FVMxom4bxU","zQt6Qrhl0J","aDGtSqUJMd",
+"8hJdtyvOMI","fLNg8W7cTs","HfyNQYh1hF","Waim6dpe1v","s7MxkHfyNQ","GSQwjG1RhS","Q6hMCAOgEe","2Yz7E8hJdt","MojnP4W0Tl","AXpwEoQ87r",
+"tlILthe9IA","1j5L8yluBx","kB5nP7X3uy","5ZaEz7fsYM","OUqFMyEfy9","45cIH618Di","azIWpStlDJ","TCgPpzqH0W","nnP8oXyPZN","atef2fqypy",
+"GXdoH45cIH","K4GS8blLA9","pv0i7Q6hMC","uupzkHlUbF","lH1ktVNCPd","piJSkBGaQY","XyPZNWreyP","IKxdLVLTy6","gjUTua00b5","zQt6Q5Drn0",
+"dpe1vsqVrf","2DREsoGu6x","lXFOBYf2Ec","tvdkDuQIcz","dpe1vpiJSk","EoToPQnJ1S","VLTy6lpF6W","rz7Ut4W0Tl","n8pJ9Yf2Ec","5Nammx3LDe",
+"9eoRcS2Dfu","8FmFHSjskQ","cL0aEVIlwP","YOfrYG1RhS","tuDyShYBCK","FjHXR8RCUA","BpYhV7hyVv","GWqqXFhtgl","M6qcGFcWrW","Q6LixdhSuH",
+"O3iyQC2Irc","LDk6fChuy3","JkzUns93Ml","G1RhSQChxs","AXpwEIBe8k","jeskSChuy3","rhl0JBGaQY","VjCZqZuDtD","2DREs4W0Tl","5drc6QWxoT",
+"zz4ZUprNT6","1LB1Le6e4z","o8Uydv8yFN","GrDg7O3iyQ","FPfSEQYxC0","RxrsmI7p2a","8TxD7S77LH","WDVWJjS1aj","ni2v1Zv7z0","uPX7GQssNC",
+"vOqCEWPmlx","HP433uTacx","dhSuHjeskS","IBe8kzQt6Q","uAWypnnP8o","zqH0WkB5nP","9XyT9dhSuH","l83UdOHaBz","sqVrfciuWz","8RCUAxXTI4",
+"FcWrWhE1Ql","rhl0JLDk6f","CdyBVqaofN","Q6hMCAIYUu","K20wKK4GS8","y94nwdpe1v","Kr8ys0Kyfs","v2eC3OUYuF","i7WMQ0MR5X","7fKYUCxVEf",
+"FjHXRMK07Y","gIYvEVLTy6","FnPFB7ku1p","2Nslm0BmCy","LDk6fksJby","h1zcHjzUqR","JRJQBxciqp","fqypyIRh48","2Yz7Ev8yFN","8FmFHMGlTF",
+"5iGN5FxX9q","1v5hHOHaBz","2TRI7Nxx9V","8U2nUblLA9","uZPqgKZamH","FFDuiPOUYS","1LB1LGWqqX","29QAzFNYIM","kZANmGrDg7","zqH0WJkzUn",
+"lsQGo0YAGH","0MR5XpmeCd","Mkgy8gjUTu","D6rByFjHXR","FjHXR5iGN5","gf8rI45cIH","d85a9jeskS","X6PinZhwG1","LewvMWDVWJ","ThjNnYOfrY",
+"I7p2aYw2oU","07n1cYOfrY","Yf2Eclj07Q","0h1b18xEKz","AOgEelweGy","5Drn0hE1Ql","fFDrJJRJQB","X6PinHfyNQ","FGzgpjiVBP","MojnPI7p2a",
+"djsrvFnPFB","brhlQGSQwj","BCxeCG1RhS","0KyfsReKEW","Kr8yszqH0W","sx5GlzY1GY","hYBCKVLTy6","uPX7GxReec","0PktIuJScX","a00b5RACuj",
+"5IhmGW3VFH","2ZHdkpFrrl","ix74rjtn0X","0PktI7fKYU","gtCA5IRh48","HP4332hEEU","ru4UGzmLYD","OUYuF2TRI7","0KyfsMmsIo","he9IAX6Pin",
+"a00b5ciuWz","QworuUvlv4","9GXkXMK07Y","YjB9tKZamH","cQOnv2Nslm","uvf7AQYxC0","BGaQYS2Dfu","ZJTXHDz1R3","JJs5mMezSW","fFDrJoVQp6",
+"lpF6WXflUq","45cIHQworu","NhXduOUqFM","uLtKsZv7z0","C2IrcGv3Fq","jtn0Xfqypy","Yh1hFsx5Gl","DLhzMCfgr3","LbRTHPYBf4","uvf7A2TRI7",
+"8FmFHKASQ8","POUYS0Kyfs","Fhtgle6e4z","IjTwPQChxs","xReecNxx9V","No0Qbaez9y","FFDuiWaim6","24ARFvLsmS","F6PT26AFT0","tl72WoVQp6",
+"prNT6vkCHH","Yh1hFKASQ8","FxX9qQworu","i7WMQDcpWB","BpYhV5nmWv","UmaEvoVQp6","HRxd84dEz6","4QMc9s4786","aFFssAXpwE","pT8wud85a9",
+"8hJdtIn3NS","gdQsSgtCA5","8TxD7YOfrY","1v5hHPb1pa","FjHXRHfyNQ","AkKTktvdkD","oQ87rRACuj","Kr8yszFgtB","uLtKsNo0Qb","ZzJHWd85a9",
+"jtn0XogLgc","M3zXL9XyT9","7fKYUjfREu","pv0i7uZPqg","48cHL5Namm","uJScXpv0i7","RzaZAzQt6Q","MmsIoksJby","7lUXZM6qcG","KsjRKQ6hMC",
+"suY4xRzaZA","0MR5XfcJOy","JIqXiBGaQY","WMiS36AFT0","jSjS3FxX9q","NOHszQChxs","Cp3mZatef2","x3LDe2DREs","X6PinK4GS8","SjskQK20wK",
+"618DiogLgc","64s8NECMvU","bZLvSfcJOy","lj07Q7lUXZ","ydG8UFPfSE","5iGN5gdQsS","Pb1pauLtKs","hYBCKHzZT8","4W0TlzFgtB","pAhR1TCgPp",
+"cmXIX4QMc9","blLA9i3pyd","14FLRLDk6f","9XyT9vLsmS","7fKYUSbRYy","7fsYMoVQp6","Yw2oUgjUTu","14FLRzz4ZU","wDajXZzJHW","WaWsvcShY2",
+"HP433Zv7z0","BFkb864s8N","fLNg80YAGH","W7cTs0YAGH","3weIFI7p2a","Cp3mZRsQUq","cL0aE9eoRc","FNYIM7hyVv","QYxC0WDVWJ","zHF1qBFkb8",
+"KsjRKrhl0J","1LB1LoGu6x","taOXKM3zXL","FcWrWhUTw7","NAFuwdmoS7","RmDcrpT8wu","lCMxyNxx9V","TXQ0ZL7cGc","9rlg9cmXIX","yluBxaL6AJ",
+"LDk6fnnP8o","AgJHQZhwG1","pv0i7vLsmS","lj07QtlILt","lpF6W8hJdt","VNCPduN6r3","FPfSEYjB9t","GWqqXBpYhV","MGlTFtlILt","n8pJ9BGaQY",
+"yvOMIHfyNQ","lkMUAS77LH","qaofNQnJ1S","RmDcrpv0i7","7lUXZL7cGc","AmdQdNcICA","jzUqRTCgPp","BGaQYeuZA5","mX2GEyluBx","AgJHQCIShG",
+"HRxd8P6bcg","qaofNl83Ud","IBe8kTwano","1LB1Li7WMQ","4W0Tlv2eC3","618Di0YAGH","ReKEWtaOXK","faHirnlaBy","tlILtpFrrl","Mkgy8wiHrZ",
+"i7WMQzz4ZU","ix74rKr8ys","tuDySs7Mxk","fmIK1he9IA","tuDySAgJHQ","ogLgcaez9y","hi5X755rfB","Z4I1vv2eC3","zHF1qMojnP","Oz8yZ5IhmG",
+"fcwDalH1kt","OUYuFHzZT8","1v5hHyEfy9","oGu6xvkCHH","zmLYDo8Uyd","QYxC0wiHrZ","oQ87ryToGW","lj07Q0MR5X","x3LDeK4GS8","JJs5mQWxoT",
+"RkQkeazIWp","FwEJzvLsmS","CIShGwiHrZ","W7cTsQworu","2Nslmtl72W","i7WMQSs0Zu","aDGtSyluBx","CqqaDtlILt","ZuDtDI7p2a","fqypy6q6L9",
+"FPfSE2TRI7","U3yw5okgRi","DQimpJkzUn","FNYIMCIShG","MezSWuQIcz","8U2nUNOHsz","RBhp0soy9t","0h1b1piJSk","rKDLJaFFss","nnP8oCK5W7",
+"wDajX8RCUA","618DiOxWIH","WreyPi7WMQ","45cIHFxX9q","RpBQmMaJQs","pvgjSDG4sT","lpF6WQWxoT","In3NSAOgEe","uLtKstjQxs","MaJQs2hEEU",
+"WDVWJuN6r3","QnJ1Sb29RJ","Q6hMCzmLYD","zqH0Wv2eC3","aez9y7ku1p","FGzgpqUJMd","I7p2arz7Ut","ru4UGzY1GY","4W0TlBFkb8","2Yz7ERzaZA",
+"F6PT2vOqCE","o8UydLewvM","lH1kt1v5hH","X6PinuJScX","tuDySCK5W7","tjQxsBbwgA","CqqaDlsQGo","Vprf2AIYUu","uoStwyToGW","gtCA5CNHmv",
+"OUqFMtlILt","aDGtSX6Pin","taOXKRsQUq","Cp3mZXyPZN","he9IAQworu","aL6AJpT8wu","MmsIovkCHH","BGaQYyvOMI","FFDuiCxVEf","BpYhVYw2oU",
+"zQt6QXyPZN","U3yw5Zv7z0","BbwgArKDLJ","jiVBPBbwgA","ydG8URmDcr","AOgEeMaJQs","fmIK15Drn0","KZamH0MR5X","hSSvQjSjS3","lViBvtaOXK",
+"jiVBPeuZA5","xciqpVjCZq","7X3uyWaim6","TwanoUlU3M","0Wr5yECMvU","S2DfulXFOB","4W0TlFcWrW","uPX7GFnPFB","6AFT0fcJOy","ZJTXHDG4sT",
+"WMiS3HRxd8","vOqCE2hEEU","v1Hln2hEEU","aL6AJuZPqg","Chuy31v5hH","t59lRru4UG","CxVEfBFkb8","W7cTsx3LDe","Mkgy87lUXZ","gdQsS7hyVv",
+"XyPZNJJs5m","FGzgpcQOnv","oGu6xyToGW","WmadAbZLvS","8cVD3OHaBz","No0Qbd85a9","JIqXis93Ml","8xEKzMGlTF","JXljW9GXkX","tvdkDhi5X7",
+"9iGoTpmeCd","K4GS8jiVBP","Y1mC0Z4I1v","uQIczblLA9","RkQkeLDk6f","cmXIXK4GS8","gtCA52Nslm","IKxdLPYBf4","zFgtBWaim6","XyPZNCdyBV",
+"suY4xnlaBy","he9IAlweGy","uAWypxciqp","ni2v1fFDrJ","mX2GEe6e4z","tjQxsZJTXH","pWiOsru4UG","K20wKJJs5m","X6Pin14FLR","oQ87rtvdkD",
+"Ss0ZuCK5W7","lj07QK4GS8","VLTy6fqypy","ogLgc48cHL","VLTy61j5L8","pT8wuC2Irc","pmeCdYOfrY","3weIF5drc6","kZANmChuy3","ulk41G1RhS",
+"5nmWv0BmCy","55rfBi7WMQ","8cVD3VerEA","RkQkeLewvM","Kr8ysFPfSE","YjB9tcL0aE","0h1b1POUYS","uPX7GjiVBP","RmDcr0h1b1","BGaQYpvgjS",
+"kZANmwiHrZ","16lHcfqypy","oGu6xYf2Ec","hE1QlO3iyQ","HfyNQOxWIH","taOXKzbIYY","kZANmOHaBz","qQxHPVjCZq","xReec5IhmG","oGu6xfLNg8",
+"kB5nP7ku1p","CqqaDjSjS3","gtCA5n1pmO","uvf7AW7cTs","o8UydMmsIo","dQ586lj07Q","07n1cvOqCE","7X3uy29QAz","EoToP8TxD7","YjB9tMojnP",
+"3otm6bgJAz","VerEARkQke","lsQGojfREu","UmaEvRACuj","64s8NCp3mZ","qQxHPQYxC0","o8UyduAWyp","jiVBPQChxs","pWiOsQClRL","sqVrf2Yz7E",
+"rz7UtMaJQs","4QMc95Drn0","s7MxkVBjhz","0ao3lAOgEe","7ku1pydG8U","gdQsSlm0pD","n1pmOpvgjS","OxWIH580YD","cQOnvpv0i7","uoStwHlUbF",
+"rKDLJdmoS7","VBjhzrz7Ut","jSjS3ix74r","pAhR1QbxXc","blLA9iqv4k","FPfSEbrhlQ","MGlTFQClRL","M6qcGqaofN","MGlTF0YAGH","hUTw7EdBKc",
+"ix74ryToGW","oVQp6J2mQi","P6bcg7lUXZ","7fKYUqUJMd","fqypyiB08l","EOE1otaOXK","BGaQYy94nw","29QAzK20wK","Mkgy8FNYIM","cL0aEi3pyd",
+"EdBKcU3yw5","4QMc9AmdQd","1v5hHgjUTu","JJs5md7vjM","No0QbLbRTH","BFkb8CxVEf","5IhmGAkKTk","zbIYYpiJSk","ru4UG0YAGH","fqypy9GXkX",
+"16lHc6AFT0","lH1ktM6qcG","KsjRKMm8si","zz4ZURmDcr","a00b5tlILt","ZzJHW3weIF","CNHmvHP433","8cVD3BFkb8","RmDcrrhl0J","FPfSEsx5Gl",
+"d85a9CqqaD","P6bcgd85a9","HRxd8AkKTk","Zv7z0Yh1hF","VLTy6fLNg8","dpe1vGWqqX","o8UydFjHXR","ReKEWW7cTs","hYBCKECMvU","YOfrYXflUq",
+"oQ87rsqVrf","RmDcrzY1GY","M3zXL7Ow5C","FVMxolsQGo","1LB1L0h1b1","Mkgy85nmWv","aez9yguMb8","xReecblLA9","uTacxh1zcH","4dEz6M6qcG",
+"iwzGkHlUbF","zz4ZUCK5W7","GXdoHjzUqR","MmsIoOHaBz","tjQxsAOgEe","JRJQBMK07Y","ydG8USWfou","zQt6QJXljW","uLtKsIKxdL","VIlwP5VZjS",
+"jtn0XuPX7G","W7cTsBbwgA","pAhR1IjTwP","NcICAaDGtS","VBjhzHlUbF","h1zcHNAFuw","0Wr5yhUTw7","GSQwjokgRi","EOE1o2DREs","7fKYUIKxdL",
+"v8yFNtvdkD","l83UdBbwgA","0PktIChuy3","qaofNzQt6Q","MezSW2hEEU","aDGtSyEfy9","vkCHHOHaBz","YjB9t7ku1p","zQt6QhYBCK","W3VFHAkKTk",
+"e6e4zsoy9t","guMb8Z4I1v","Cfgr38RCUA","2hEEUW7cTs","t98iWUlU3M","RBhp0i7WMQ","WmadAtaOXK","KZamHRpBQm","UmaEv7hyVv","CdyBVSWfou",
+"1LB1Ll83Ud","In3NSlViBv","nlaBy8TxD7","kB5nPzY1GY","uQIczyEfy9","1v5hHo8Uyd","ReKEW0YAGH","s93MlYh1hF","9GXkXgf8rI","piJSkuJScX",
+"vLsmSpvgjS","dQ586SmGzv","zz4ZUuPX7G","lViBvIjTwP","2Nslm9XyT9","7lUXZ2ZHdk","MojnPAXpwE","t59lRlkMUA","14FLRHRxd8","jSjS3atef2",
+"d85a9kB5nP","RzaZAU3yw5","zFgtBX6Pin","8cVD3b29RJ","b29RJIn3NS","bZLvS0YAGH","6q6L9ydG8U","dhSuH4W0Tl","bgJAzQChxs","VerEAAmdQd",
+"yvOMIsqVrf","Uvlv4JXljW","2NslmiB08l","aez9yksJby","zFgtBEdBKc","9XyT95Drn0","JRJQBFhtgl","7hyVvVIlwP","AmdQdThjNn","MmsIodjsrv",
+"QClRLpvgjS","hUTw7vkCHH","In3NSgdQsS","X6PiniwzGk","XyPZNWaim6","5VZjSZUnqt","X6PinYOfrY","JKWYRJKWYR","AIYUuOUYuF","5Drn0ciuWz",
+"1LB1LDG4sT","9XyT9gIYvE","ReKEWFPfSE","7fsYMTCgPp","v8yFNECMvU","Q6Lix29QAz","iKqhrpFrrl","mX2GEOz8yZ","M3zXLlj07Q","WaWsvYOfrY",
+"qQxHPMm8si","tl72WiwzGk","K20wKAXpwE","55rfBSbRYy","KZamHgjUTu","JIqXiSjskQ","4W0TlRACuj","8xEKzyluBx","cShY2yofH3","FxX9qlXFOB",
+"VerEAzHF1q","8U2nUMmKGJ","faHirFjHXR","29QAzKr8ys","RzaZA4QMc9","0Kyfs9XyT9","BbwgACIShG","2ZHdkJJs5m","pWiOsMojnP","jzUqRHzZT8",
+"AXpwEUmaEv","BGaQYWPmlx","sx5GlUlU3M","y94nwaL6AJ","iB08lzQt6Q","ni2v1GWqqX","ciuWzeuZA5","LewvMYOfrY","s93MlqQxHP","RACuj3otm6",
+"W3VFHCp3mZ","rhl0Jm4bxU","fmIK1F6PT2","ix74rWaim6","MojnPLewvM","LbRTHFxX9q","Waim6nnP8o","gjUTuokgRi","lkMUA0PktI","0Wr5ygIYvE",
+"FwEJzB3qem","7Ow5CUvlv4","MmKGJlViBv","Rxrsm64s8N","FjHXR7X3uy","WDVWJsx5Gl","pWiOsn1pmO","i3pydtaOXK","Ss0ZuGXdoH","S77LHL7cGc",
+"JRJQB14FLR","brhlQ24ARF","OUqFMRsQUq","oQ87rcmXIX","OHaBz55rfB","NAFuwxXTI4","UmaEvsoy9t","ZuDtDBCxeC","v8yFN55rfB","OxWIHCdyBV",
+"yEfy9zFgtB","hYBCKpmeCd","cShY26AFT0","uN6r3lsQGo","FcWrWQChxs","LewvM5Mg9r","VjCZqVerEA","LDk6fbZLvS","qUJMd9y4lw","C2IrcYOfrY",
+"K4GS8FVMxo","aFFss5Drn0","oQ87rciuWz","8xEKzlViBv","JJs5mDz1R3","SWfouFjHXR","rKDLJQssNC","b29RJ1j5L8","RxrsmmX2GE","9rlg9taOXK",
+"1v5hHSmGzv","x3LDeTa8f6","KsjRKIBe8k","v1HlnwDajX","fFDrJuAWyp","ZuDtD24ARF","cShY2lViBv","Zv7z00h1b1","hYBCKDcpWB","yofH3W3VFH",
+"CIShG5Namm","a00b5FjHXR","rhl0JBbwgA","RkQkeJ2mQi","YjB9tIBe8k","KZamHh1zcH","uvf7ACxVEf","0PktIYOfrY","FFDui2Nslm","gtCA5DcpWB",
+"GSQwjfFDrJ","i3pydQ6hMC","JKWYRAIYUu","5VZjSMkgy8","VLTy6uoStw","lH1ktuvf7A","pv0i7CqqaD","tvdkDOz8yZ","rhl0JlsQGo","djsrvJJs5m",
+"4QMc98U2nU","PYBf4ZuDtD","uupzk07n1c","gjUTuzHF1q","yToGWzqH0W","tAOsrt98iW","07n1c9GXkX","QworujS1aj","0YAGH2Yz7E","8FmFHJKWYR",
+"8RCUAksJby","soy9t1j5L8","qUJMdFjHXR","Mkgy84W0Tl","HP433OUYuF","2TRI7yEfy9","rKDLJUvlv4","lj07QLewvM","B3qemBCxeC","5Nammiqv4k",
+"qaofNXflUq","JKWYR0ao3l","v2eC3FLsph","IRh48FFDui","fqypyeuZA5","GrDg72Nslm","P6bcgl83Ud","n1pmOIBe8k","oQ87rUvlv4","sx5GlGXdoH",
+"okgRim4bxU","k85Ae9XyT9","aez9yThjNn","nlaByCfgr3","yluBxn1pmO","2TRI7AXpwE","VNCPdNOHsz","2DREs580YD","Fhtgl9y4lw","XyPZNWMiS3",
+"XflUq1LB1L","mz8gxNxx9V","jtn0XRmDcr","No0Qbuupzk","zmLYDFwEJz","ZzJHW45cIH","KZamH1v5hH","jSjS3uZPqg","Kr8ysdQ586","hE1QlZv7z0",
+"0PktI4dEz6","djsrvWreyP","0BmCyFwEJz","BCxeCNhXdu","ThjNn8cVD3","IKxdLSjskQ","VIlwPpmeCd","AgJHQjtn0X","OxWIHIRh48","Waim6lweGy",
+"uoStwCqqaD","CNHmvtl72W","NAFuwfaHir","pAhR1S77LH","iqv4k7lUXZ","jtn0Xm4bxU","55rfB618Di","RkQkejzUqR","VjCZqOxWIH","gIYvEUvlv4",
+"QssNCzmLYD","8FmFHnnP8o","2Yz7E0PktI","CdyBVvLsmS","WDVWJnlaBy","FnPFBl83Ud","ogLgczqH0W","9rlg9580YD","CqqaDfqypy","cShY2AmdQd",
+"WPmlxIjTwP","580YDCqqaD","s4786YOfrY","zbIYYDG4sT","n8pJ93otm6","zHF1qatef2","J2mQihE1Ql","JkzUn8TxD7","t59lRcmXIX","uupzk8U2nU",
+"sqVrfgtCA5","fFDrJlCMxy","JJs5mBpYhV","FnPFBAOgEe","0h1b1s7Mxk","tvdkDQnJ1S","Yf2EcNAFuw","BpYhVjfREu","ZzJHWpv0i7","IRh48QWxoT",
+"618DiZv7z0","jS1ajMmKGJ","8U2nURACuj","tl72WCqqaD","zbIYYaDGtS","CK5W7WaWsv","gdQsSpT8wu","Yf2EcLewvM","QChxsJIqXi","HzZT8C2Irc",
+"lsQGoAkKTk","x3LDe5ZaEz","vOqCEAkKTk","i3pydIjTwP","pFrrl1LB1L","VBjhzjzUqR","WmadAKASQ8","24ARFCxVEf","bgJAzZuDtD","aez9yulk41",
+"580YDuoStw","LewvMgf8rI","QWxoTuN6r3","dQ586618Di","DG4sTDz1R3","FGzgpSmGzv","X6Pin9rlg9","K20wKZzJHW","SbRYySmGzv","wiHrZECMvU",
+"suY4xxReec","JIqXi0YAGH","7fKYUFLsph","lweGyvOqCE","OHaBzSmGzv","9GXkXhi5X7","QChxsQWxoT","Pb1pah1zcH","fqypyydG8U","KZamHm4bxU",
+"pFrrlzmLYD","DcpWBJKWYR","B3qem07n1c","ix74rNo0Qb","pAhR1m4bxU","Y1mC0M3zXL","Mm8sijfREu","sx5Glt59lR","fcwDah1zcH","Qworulm0pD",
+"lXFOBpiJSk","LDk6fPOUYS","Q6Lix0PktI","MK07YuJScX","FcWrWiwzGk","pFrrlRzaZA","M3zXLQssNC","0Wr5y2DREs","uPX7Gpv0i7","vkCHHsx5Gl",
+"MGlTFqQxHP","bZLvSBCxeC","ni2v1MmKGJ","QnJ1S5nmWv","ZUnqtuoStw","uJScX2Yz7E","AIYUuGrDg7","GXdoHlweGy","7hyVv3otm6","dmoS7fFDrJ",
+"GSQwjMojnP","cShY2o8Uyd","WmadAguMb8","4W0Tl8hJdt","n1pmO8U2nU","C2IrclCMxy","QWxoTCdyBV","ciuWzMGlTF","Mkgy8TCgPp","vLsmSsoy9t",
+"6q6L9aez9y","QbxXcFFDui","BFkb8vkCHH","uoStwfmIK1","uLtKs8cVD3","POUYSdmoS7","lsQGoSbRYy","jSjS329QAz","gtCA5kZANm","SjskQyluBx",
+"uZPqgSWfou","HRxd8VIlwP","sqVrflCMxy","Mkgy88FmFH","WmadAnnP8o","iKqhrRBhp0","8xEKzgtCA5","RpBQmdmoS7","aL6AJ6AFT0","uupzkgdQsS",
+"lj07QaL6AJ","VjCZqNhXdu","GrDg7dpe1v","RACujBCxeC","rz7UtOxWIH","2Yz7E0BmCy","dpe1vB3qem","gjUTu6q6L9","WDVWJWMiS3","DQimpm4bxU",
+"45cIH5iGN5","Chuy3aez9y","4W0Tl55rfB","55rfB45cIH","U3yw5jSjS3","BFkb85IhmG","yToGWPb1pa","zFgtBSWfou","YjB9thSSvQ","fFDrJnFqik",
+"1j5L8FnPFB","atef2fLNg8","v2eC34QMc9","xReeclkMUA","soy9tLbRTH","ZJTXHvLsmS","OUYuFCxVEf","XyPZNTXQ0Z","CdyBVMkgy8","JJs5mTXQ0Z",
+"lj07QfcJOy","fcJOycmXIX","QssNCgIYvE","a00b5CNHmv","VIlwPNOHsz","cL0aEChuy3","uAWyptjQxs","RBhp0nlaBy","M6qcGWreyP","7fsYMzmLYD",
+"WMiS3Zv7z0","d85a9tl72W","5Namm9GXkX","EdBKcfmIK1","EoToPuTacx","AXpwE8hJdt","UmaEviB08l","P6bcgD6rBy","9rlg9AXpwE","djsrvZJTXH",
+"AmdQdm4bxU","RsQUqk85Ae","lj07Q5VZjS","zHF1qHfyNQ","cL0aE5nmWv","FnPFBUvlv4","PYBf4lViBv","9GXkXulk41","nFqikGXdoH","lm0pDjiVBP",
+"IRh48yEfy9","MGlTFulk41","hE1QlnFqik","B3qemKr8ys","jfREuydG8U","9rlg9uLtKs","3otm65ZaEz","fcJOy5ZaEz","uPX7GHfyNQ","y94nw5Namm",
+"14FLRhE1Ql","ni2v1CxVEf","n8pJ9DcpWB","ZUnqtlm0pD","dmoS77Ow5C","qaofNzqH0W","D6rBycShY2","POUYSYh1hF","jiVBPydG8U","4dEz6JkzUn",
+"uoStwCfgr3","16lHcNxx9V","5iGN5ru4UG","QssNCTXQ0Z","KZamHS77LH","GXdoHaez9y","NOHszZ4I1v","JXljWMK07Y","JJs5mZzJHW","XyPZNSmGzv",
+"azIWpFNYIM","AgJHQcShY2","azIWprz7Ut","KASQ8Oz8yZ","FFDuinFqik","WMiS3Uvlv4","lkMUAAgJHQ","bgJAzRzaZA","hE1QlNcICA","Yw2oUuLtKs",
+"sx5Gl0Wr5y","uZPqg2Nslm","HlUbFFGzgp","POUYSYjB9t","zY1GYZJTXH","M3zXLDcpWB","VerEA9XyT9","0Wr5ylH1kt","jtn0XRxrsm","hSSvQ7fKYU",
+"8xEKzRkQke","CdyBVEoToP","gf8rIt59lR","9XyT9ru4UG","G1RhSqaofN","PYBf4VBjhz","zmLYDJJs5m","lweGye6e4z","qUJMdQ6Lix","qaofNJ2mQi",
+"L7cGcxXTI4","Mkgy8CdyBV","aFFsscQOnv","v2eC3ulk41","x3LDeFLsph","t98iW6AFT0","TXQ0Z55rfB","MojnP8hJdt","RBhp0No0Qb","WaWsvprNT6",
+"1v5hHWMiS3","OxWIHlsQGo","jeskSfFDrJ","QworuFLsph","24ARFQssNC","TCgPpPYBf4","tAOsr8U2nU","Gv3FqcShY2","HP433v1Hln","uPX7GvOqCE",
+"brhlQx3LDe","5ZaEzqUJMd","l83UdoVQp6","CqqaDk85Ae","9rlg9GXdoH","07n1cAmdQd","NOHsz55rfB","8U2nUDz1R3","7Ow5CNOHsz","BGaQYLbRTH",
+"S2DfuEdBKc","618DiksJby","v8yFNpAhR1","S2DfuAkKTk","Chuy3BFkb8","7fKYU8FmFH","xReecTwano","NcICAqUJMd","dhSuHReKEW","LDk6fqUJMd",
+"L7cGcJRJQB","MmsIo2ZHdk","lH1ktKsjRK","StlDJCqqaD","uN6r3yofH3","9rlg9s7Mxk","KZamHix74r","azIWpsoy9t","OUYuFazIWp","fFDrJi3pyd",
+"Uvlv40Wr5y","BFkb81v5hH","xReecyToGW","9iGoT0BmCy","DQimptAOsr","mX2GEtaOXK","zHF1qPb1pa","Ta8f6MezSW","ZzJHWRACuj","e6e4zbZLvS",
+"iwzGksx5Gl","5Mg9rgf8rI","qUJMdYh1hF","bgJAzrKDLJ","zY1GY5ZaEz","uPX7GrKDLJ","6q6L9SWfou","9eoRcJKWYR","2hEEUjfREu","Oz8yZhYBCK",
+"JRJQBSbRYy","n8pJ9cmXIX","yofH3618Di","uoStw6AFT0","RxrsmJIqXi","POUYS6AFT0","blLA9AIYUu","iqv4kokgRi","bgJAzM3zXL","Dz1R3SjskQ",
+"fqypyCK5W7","i7WMQ64s8N","580YDDG4sT","SWfousx5Gl","piJSkHfyNQ","VBjhzsqVrf","HlUbFIn3NS","LbRTHn8pJ9","t59lRBbwgA","Chuy3AmdQd",
+"soy9tlViBv","AOgEeQ6Lix","LbRTHX6Pin","uvf7AlCMxy","Vprf2dhSuH","RACujVprf2","NhXduhSSvQ","QbxXcogLgc","dQ5868FmFH","soy9tpvgjS",
+"8cVD3kZANm","5ZaEz5VZjS","SmGzvJIqXi","CNHmvX6Pin","0Kyfs580YD","zFgtBx3LDe","n1pmOblLA9","azIWp2Yz7E","sx5GliKqhr","X6PinaL6AJ",
+"AmdQd2hEEU","JKWYRogLgc","uvf7Atl72W","QssNCQssNC","StlDJx3LDe","ydG8UlsQGo","F6PT2rKDLJ","aDGtSDcpWB","14FLRSs0Zu","K20wKC2Irc",
+"CNHmvlCMxy","qUJMdtjQxs","cmXIXJIqXi","8RCUAs93Ml","Yf2EcsqVrf","TCgPpyEfy9","xciqp580YD","DG4sTv8yFN","WDVWJhi5X7","s93MlFPfSE",
+"jiVBPyluBx","UmaEv0Wr5y","gjUTuOHaBz","wDajXUl4a1","FFDuiZhwG1","LbRTHJ2mQi","8RCUAhSSvQ","VjCZqRxrsm","VerEA0YAGH","zbIYYAkKTk",
+"rhl0JCIShG","ksJbyEoToP","WPmlxcShY2","BpYhVReKEW","uZPqgogLgc","aDGtSfLNg8","Yh1hFFnPFB","gf8rIuvf7A","pmeCdMezSW","DLhzMzbIYY",
+"taOXKiB08l","DQimpt59lR","L7cGcnlaBy","dQ586pWiOs","7lUXZ14FLR","guMb8U3yw5","GWqqXUl4a1","uPX7GECMvU","MmKGJ4dEz6","RBhp0ciuWz",
+"nlaByblLA9","tl72Wn1pmO","RkQkeC2Irc","14FLRv2eC3","fcwDa6AFT0","pvgjS7lUXZ","zQt6QQClRL","gIYvE5Mg9r","580YDWaim6","Dz1R3m4bxU",
+"JXljWjSjS3","s7Mxktl72W","t59lRZUnqt","2Nslmuvf7A","CNHmv9y4lw","EdBKc7ku1p","QWxoTZUnqt","SmGzvVIlwP","IjTwPsx5Gl","ulk41RmDcr",
+"vOqCEix74r","UlU3MRACuj","OUYuF4W0Tl","RBhp0QssNC","iB08lFLsph","Kr8ysBFkb8","NOHszxXTI4","lXFOBbZLvS","v8yFNfLNg8","JRJQBdQ586",
+"xciqpJJs5m","QChxs2DREs","ReKEWPb1pa","Q6LixiwzGk","5IhmGCp3mZ","DLhzMvkCHH","uPX7Gzz4ZU","24ARF9GXkX","AIYUuAkKTk","prNT6fqypy",
+"Yh1hFVIlwP","580YDS2Dfu","B3qemtjQxs","jzUqR5iGN5","sx5GlzHF1q","WmadA7ku1p","FNYIMdjsrv","v8yFNBbwgA","580YDnnP8o","64s8NuPX7G",
+"UmaEvv1Hln","taOXKECMvU","QYxC0NAFuw","QbxXclsQGo","v2eC3rKDLJ","2NslmPb1pa","J2mQis93Ml","ReKEWSbRYy","1LB1L9iGoT","4dEz6580YD",
+"fmIK1uLtKs","ni2v1OUqFM","t59lR8xEKz","Mm8siJRJQB","nnP8oBFkb8","jiVBPO3iyQ","JXljW16lHc","jfREuKASQ8","jzUqRoQ87r","8cVD3QnJ1S",
+"s7Mxk0YAGH","blLA9VjCZq","pv0i7D6rBy","MaJQsUlU3M","QYxC0aez9y","yluBxgf8rI","VBjhz3weIF","JXljWSmGzv","VIlwPMmKGJ","K4GS8atef2",
+"t98iWokgRi","jSjS3aFFss","HP433prNT6","VIlwPMkgy8","jzUqRRxrsm","UmaEvKr8ys","s4786qUJMd","6q6L9QYxC0","0PktIMK07Y","taOXKP6bcg",
+"D6rByJRJQB","UlU3MmX2GE","16lHcpFrrl","PYBf4jzUqR","wDajXhE1Ql","0h1b1O3iyQ","s93Ml6q6L9","W7cTsB3qem","jeskSJRJQB","vOqCEYOfrY",
+"ydG8UfaHir","CxVEfzbIYY","TCgPpHlUbF","Cfgr3BGaQY","C2IrcFFDui","WmadAuAWyp","zbIYYRsQUq","7fsYMuAWyp","CNHmvv8yFN","CNHmvWaWsv",
+"uTacxbrhlQ","tvdkDlpF6W","jfREub29RJ","mz8gxFLsph","JXljWAmdQd","Fhtgld7vjM","aez9yMkgy8","jiVBPRACuj","uPX7GIBe8k","XyPZNaFFss",
+"FLsphIKxdL","Yh1hFLDk6f","MmKGJOUYuF","QnJ1Shi5X7","lpF6WRmDcr","YjB9tvOqCE","JJs5me6e4z","9GXkXDQimp","uLtKsUmaEv","7fsYMOz8yZ",
+"KZamHjeskS","vOqCEMezSW","Gv3FqXyPZN","ZJTXH7X3uy","7X3uyNOHsz","OUYuFZUnqt","l83UdgjUTu","Mkgy8C2Irc","aFFssAkKTk","XflUqVprf2",
+"euZA5AgJHQ","TCgPpjSjS3","RxrsmlH1kt","29QAzhSSvQ","FVMxo8RCUA","JRJQBtuDyS","k85Ae7fKYU","FVMxo5Mg9r","okgRiW3VFH","3weIFbrhlQ",
+"aDGtS0PktI","Twanoy94nw","yluBx6AFT0","16lHcMmKGJ","jiVBPMezSW","FFDuiUvlv4","pv0i7gtCA5","yToGW2DREs","pFrrlTa8f6","o8Uydhe9IA",
+"SjskQFcWrW","ru4UGEOE1o","y94nwF6PT2","W7cTsUl4a1","WreyPFxX9q","DG4sTFLsph","iwzGkmX2GE","d85a9CK5W7","lkMUAFFDui","Z4I1v7X3uy",
+"IBe8kLbRTH","FVMxofaHir","cShY2Waim6","Vprf2FjHXR","jtn0XIRh48","MojnPCp3mZ","VLTy6ulk41","MK07Y0h1b1","7Ow5CqaofN","lpF6WJRJQB",
+"aFFssW7cTs","dhSuHoQ87r","5VZjSYh1hF","hi5X7ni2v1","5NammazIWp","Pb1pa9iGoT","VBjhz7Ow5C","Vprf2DQimp","9rlg9K4GS8","t98iW8cVD3",
+"6q6L9Mm8si","lCMxyjzUqR","xReecIn3NS","5iGN5TXQ0Z","fmIK1l83Ud","Q6LixRsQUq","CK5W7QbxXc","hE1QltvdkD","oQ87rcShY2","OxWIHB3qem",
+"bZLvSCp3mZ","fqypyG1RhS","bZLvSjeskS","SbRYyHzZT8","2NslmLbRTH","16lHch1zcH","ZhwG1v8yFN","LDk6fVerEA","dpe1voQ87r","IjTwPGWqqX",
+"jeskSLbRTH","WDVWJ0ao3l","GXdoH0MR5X","aDGtSGWqqX","nFqikix74r","M6qcG0MR5X","aDGtSOz8yZ","Ul4a1HP433","MaJQsStlDJ","lj07QcL0aE",
+"mX2GEuQIcz","QnJ1St59lR","e6e4zlpF6W","v2eC3ThjNn","pAhR10YAGH","07n1cO3iyQ","2TRI7YOfrY","zHF1qhSSvQ","OUqFM0BmCy","azIWpCp3mZ",
+"NcICAPOUYS","45cIHiB08l","X6PinvOqCE","1v5hHYw2oU","oQ87r0BmCy","5nmWvCqqaD","POUYSMkgy8","FVMxoFwEJz","e6e4zfmIK1","MojnPJKWYR",
+"qQxHPzbIYY","Twanok85Ae","mX2GE580YD","S2DfuWmadA","mX2GE7ku1p","iwzGkLbRTH","6q6L9JRJQB","cShY2Yf2Ec","iwzGkOUqFM","aez9yWmadA",
+"PYBf4DG4sT","GSQwjB3qem","fcJOyprNT6","FnPFBRzaZA","blLA9CK5W7","jiVBPEdBKc","FGzgp0YAGH","sqVrfAmdQd","Q6LixFwEJz","suY4xRpBQm",
+"nlaBy580YD","ZzJHWQ6hMC","M3zXLM6qcG","jSjS3bZLvS","OxWIHQClRL","zqH0WFxX9q","lXFOBMmKGJ","dhSuHlsQGo","BbwgAHfyNQ","ix74rUvlv4",
+"MmsIolm0pD","BCxeCSjskQ","taOXKJJs5m","S2DfuksJby","VIlwP5IhmG","sqVrf0Kyfs","kB5nPNo0Qb","tuDySix74r","2Yz7EGWqqX","9iGoT0PktI",
+"14FLRuLtKs","0ao3lb29RJ","0Wr5yGrDg7","2DREsGSQwj","zHF1q7fKYU","piJSkD6rBy","ulk41nnP8o","jSjS3mz8gx","FGzgpOUqFM","BbwgAcQOnv",
+"QssNCtaOXK","wDajXYh1hF","NcICAogLgc","m4bxUFhtgl","JkzUnVerEA","uPX7GokgRi","he9IAPb1pa","G1RhSb29RJ","he9IAzQt6Q","Ss0Zuv8yFN",
+"WreyPKASQ8","i3pydoGu6x","AOgEe5nmWv","jiVBPVLTy6","NhXduG1RhS","lH1kt5drc6","tjQxs0MR5X","EOE1o7Ow5C","yluBxCqqaD","WPmlx8FmFH",
+"W3VFH55rfB","bgJAz3weIF","ydG8UWaWsv","7fKYU8RCUA","ogLgcgdQsS","Ta8f6jfREu","gdQsSS2Dfu","6AFT09rlg9","QworuKr8ys","Chuy3ECMvU",
+"gf8rIZuDtD","8TxD7GrDg7","0KyfsuoStw","d7vjMNAFuw","atef2HzZT8","8xEKzXflUq","6q6L9YjB9t","iKqhrYw2oU","aez9ycQOnv","FVMxoyvOMI",
+"hUTw7AkKTk","RmDcraFFss","KZamHjS1aj","RkQke618Di","AmdQdTa8f6","jiVBPqaofN","6q6L91v5hH","qUJMdW7cTs","QYxC0G1RhS","RkQkeK20wK",
+"rhl0JGv3Fq","vLsmSpT8wu","UmaEvQnJ1S","S77LHdpe1v","OxWIHD6rBy","QYxC0BGaQY","POUYS9eoRc","jtn0XrKDLJ","24ARFYjB9t","CIShGuAWyp",
+"d7vjMRsQUq","aFFssulk41","XflUqtvdkD","48cHL48cHL","I7p2a5iGN5","7fsYMBpYhV","Nxx9VFPfSE","HzZT8Q6hMC","s7Mxk48cHL","LewvMMmsIo",
+"vLsmS580YD","5VZjShUTw7","Chuy3brhlQ","Oz8yZRpBQm","SWfouMmKGJ","VBjhzKr8ys","MGlTFyluBx","Waim6iqv4k","7ku1p8hJdt","he9IALbRTH",
+"Cfgr3nnP8o","U3yw5ZzJHW","Vprf2WMiS3","NOHszatef2","SmGzvEOE1o","lXFOBFjHXR","RACujoGu6x","cL0aEMK07Y","PYBf414FLR","l83Udl83Ud",
+"JXljW8FmFH","jiVBPyEfy9","FnPFBiB08l","WPmlxZzJHW","sqVrfiB08l","9rlg9FFDui","bZLvSKsjRK","FwEJzZJTXH","okgRiQ6Lix","Mkgy85drc6",
+"jiVBPHzZT8","HlUbFCdyBV","WPmlxiB08l","Yw2oU0PktI","gf8rI7ku1p","nnP8om4bxU","IBe8kVLTy6","QworuOUYuF","G1RhSX6Pin","RACujCxVEf",
+"mz8gxLewvM","k85AeNAFuw","yofH3OUqFM","RzaZAKsjRK","tl72Wpv0i7","WmadAmz8gx","hYBCK0BmCy","1j5L8Nxx9V","suY4xMmsIo","SmGzvsqVrf",
+"i3pydjfREu","Cp3mZfcwDa","I7p2aa00b5","hE1QlPb1pa","Yf2EcIn3NS","Y1mC0Q6hMC","tAOsr0Wr5y","zmLYDKsjRK","D6rBy3otm6","xXTI49iGoT",
+"nFqikY1mC0","7Ow5CuZPqg","lj07Qsoy9t","AXpwERmDcr","zz4ZU5ZaEz","G1RhSZv7z0","l83UdhUTw7","soy9tm4bxU","mz8gxcQOnv","Chuy3uLtKs",
+"Yf2EcQChxs","Vprf2sx5Gl","he9IAOHaBz","1v5hHSjskQ","J2mQiK4GS8","ni2v1zHF1q","ReKEWoGu6x","CK5W7L7cGc","Yw2oUzz4ZU","vkCHHpiJSk",
+"dmoS7cmXIX","EOE1oZv7z0","pT8wuKASQ8","2DREs1v5hH","SWfouL7cGc","oVQp6zmLYD","lViBvydG8U","HRxd8rKDLJ","AOgEeZJTXH","K20wKOUqFM",
+"zmLYDVLTy6","rz7UtW3VFH","FwEJzzQt6Q","QssNCU3yw5","i3pydatef2","dmoS7wiHrZ","1j5L8AIYUu","VIlwPnnP8o","JJs5mvkCHH","7fKYURpBQm",
+"pAhR1blLA9","zqH0WVIlwP","J2mQiStlDJ","XflUqkB5nP","uJScXMmKGJ","pFrrllH1kt","qaofNYf2Ec","ReKEWvkCHH","5nmWvTa8f6","D6rByiqv4k",
+"QworuK20wK","Gv3Fqh1zcH","8RCUAjfREu","lH1kt0Wr5y","Ss0ZujiVBP","guMb8zqH0W","uLtKs7hyVv","Gv3FqVNCPd","CqqaDpFrrl","MezSWQbxXc",
+"taOXKFLsph","pAhR1In3NS","HlUbF8xEKz","4dEz6xXTI4","FnPFBY1mC0","aFFssiwzGk","prNT65Mg9r","pWiOsiKqhr","LbRTHECMvU","iKqhrWreyP",
+"fLNg8n1pmO","QbxXc0Wr5y","a00b5FGzgp","SWfouBFkb8","XyPZNM3zXL","Yw2oUblLA9","VjCZqPYBf4","vOqCEn8pJ9","NcICAZ4I1v","29QAzRsQUq",
+"2TRI7xciqp","pvgjShUTw7","D6rByBbwgA","0Kyfso8Uyd","EoToPhYBCK","a00b5ZuDtD","oGu6xjzUqR","xXTI4No0Qb","pT8wui3pyd","ZhwG1rz7Ut",
+"FPfSEBbwgA","1LB1LJJs5m","atef2POUYS","yvOMIMmKGJ","YjB9tFwEJz","RxrsmokgRi","oGu6xAOgEe","5Nammlm0pD","8FmFHv2eC3","FGzgpmz8gx",
+"o8UydpAhR1","jS1ajVjCZq","X6PinyofH3","I7p2aAOgEe","ReKEWgIYvE","JkzUnuupzk","hYBCKVprf2","jfREulj07Q","ksJbyhYBCK","pAhR1FjHXR",
+"QnJ1S55rfB","vkCHHfqypy","PYBf4n1pmO","jzUqRs4786","lm0pDpFrrl","7fsYM8FmFH","v8yFNVIlwP","hUTw7FFDui","UmaEvulk41","6AFT0zQt6Q",
+"jeskSYw2oU","fcJOyIRh48","ni2v1M3zXL","h1zcH0PktI","JIqXimz8gx","VIlwPSbRYy","GXdoH1j5L8","AOgEewDajX","VBjhzbgJAz","uZPqgfcJOy",
+"Uvlv4hYBCK","48cHLQClRL","IBe8kMK07Y","Cfgr3NcICA","WMiS3zQt6Q","ZUnqtChuy3","lweGyfqypy","29QAzdjsrv","JkzUnbrhlQ","cShY2sx5Gl",
+"s7MxkfaHir","Oz8yZzqH0W","uLtKsMezSW","ZUnqt55rfB","MmKGJhYBCK","2hEEUY1mC0","ulk41X6Pin","0Wr5ySs0Zu","tl72WWaWsv","NOHszFhtgl",
+"jzUqRO3iyQ","jeskSBGaQY","Zv7z0618Di","iB08l8RCUA","vkCHHYOfrY","O3iyQCp3mZ","i7WMQBCxeC","uvf7A7lUXZ","okgRiQnJ1S","aez9yyvOMI",
+"Ss0ZuSbRYy","FnPFBjSjS3","SjskQFLsph","4dEz6BGaQY","DLhzM16lHc","Uvlv4iB08l","IRh48CqqaD","5Drn0cmXIX","ulk410Kyfs","hi5X7MezSW",
+"piJSkSbRYy","0MR5Xlj07Q","ZuDtDWaim6","AkKTklXFOB","Yh1hFBGaQY","Waim61j5L8","hUTw7ciuWz","IKxdLe6e4z","S77LHe6e4z","lCMxyv1Hln",
+"ZuDtDix74r","J2mQiSWfou","M6qcGQ6Lix","FnPFBWreyP","OUYuF2Yz7E","CdyBVzqH0W","S77LHzQt6Q","NOHszuZPqg","zmLYDZzJHW","tl72WF6PT2",
+"vkCHHMGlTF","StlDJ4QMc9","tjQxsZv7z0","KASQ8prNT6","lj07Qiqv4k","SWfouCxVEf","tlILtuoStw","i7WMQuQIcz","KASQ8dhSuH","TXQ0ZGv3Fq",
+"blLA9ni2v1","he9IAHlUbF","D6rByzQt6Q","9eoRciKqhr","BCxeC2ZHdk","Mm8sisoy9t","6AFT0xciqp","FxX9qCqqaD","CIShGD6rBy","t98iWCIShG",
+"Dz1R3gjUTu","OxWIHFjHXR","UmaEvVBjhz","6q6L9O3iyQ","SbRYyWaWsv","nnP8oSjskQ","djsrvd7vjM","POUYSh1zcH","WPmlxpT8wu","ogLgco8Uyd",
+"NcICAWMiS3","SWfou29QAz","QnJ1SCxVEf","piJSk7lUXZ","G1RhSd85a9","guMb8FFDui","EoToPzqH0W","No0Qbs4786","fcJOym4bxU","Yf2Ect98iW",
+"WaWsvFxX9q","8FmFH5Namm","4QMc9L7cGc","8hJdtsqVrf","Kr8ysvLsmS","AOgEeO3iyQ","lsQGoWmadA","ix74rLbRTH","Waim6FcWrW","U3yw5pmeCd",
+"BFkb8IjTwP","hYBCKjzUqR","lsQGoDLhzM","EOE1oGWqqX","prNT6LDk6f","0BmCytAOsr","5IhmGFcWrW","o8UydZ4I1v","O3iyQ8TxD7","8cVD3OxWIH",
+"nFqikTCgPp","l83UdU3yw5","Dz1R3lXFOB","RBhp0CdyBV","qQxHPCp3mZ","4QMc9ulk41","4W0TlC2Irc","ix74r5Drn0","ni2v18U2nU","XflUqi3pyd",
+"nlaByFxX9q","he9IAtl72W","9iGoT8TxD7","O3iyQM6qcG","5drc68hJdt","FLsphlsQGo","QnJ1SZhwG1","Y1mC0euZA5","vLsmS0MR5X","DQimpReKEW",
+"s4786HP433","MmsIoa00b5","cShY25IhmG","ydG8UHlUbF","QClRLbgJAz","dmoS7Cp3mZ","BFkb8kZANm","sx5GlxReec","tvdkDtuDyS","prNT6lsQGo",
+"VLTy6SjskQ","9iGoT6AFT0","ZuDtDxciqp","uLtKs618Di","t59lRzQt6Q","DQimpM3zXL","vLsmSVLTy6","rhl0JJkzUn","uZPqgO3iyQ","yvOMIzHF1q",
+"16lHcpv0i7","UmaEvtlILt","8hJdt24ARF","Mkgy82hEEU","mX2GEXflUq","3otm6LDk6f","8RCUAvLsmS","P6bcguTacx","bZLvSzmLYD","JKWYRyluBx",
+"JkzUnK20wK","HP433jfREu","618DinnP8o","jfREus4786","guMb8aL6AJ","GSQwjIBe8k","EOE1opT8wu","cShY2QssNC","TXQ0ZVNCPd","RBhp0dpe1v",
+"zQt6QtaOXK","gdQsSL7cGc","Yf2Ecuupzk","Oz8yZgdQsS","HlUbFSbRYy","dhSuH8hJdt","RACujs7Mxk","piJSkWMiS3","7hyVvulk41","2hEEUfcJOy",
+"Ul4a1FnPFB","P6bcgbgJAz","zz4ZU5Drn0","5nmWv1v5hH","1v5hH3otm6","K20wKNcICA","fFDrJfqypy","NhXdu8FmFH","jzUqRS77LH","FcWrWKZamH",
+"YjB9tzY1GY","IRh48BGaQY","uQIcz8TxD7","FVMxoi3pyd","OUqFMlCMxy","fqypyJkzUn","GrDg724ARF","QYxC0lkMUA","NOHszFLsph","4QMc9ru4UG",
+"FjHXR5Drn0","5iGN5DQimp","x3LDeReKEW","FVMxoni2v1","2NslmL7cGc","5Mg9rZuDtD","zY1GYChuy3","wDajXuvf7A","pmeCd580YD","Ul4a1HRxd8",
+"Ss0Zu9XyT9","1LB1LYw2oU","rhl0JaL6AJ","oQ87rmX2GE","VBjhzzz4ZU","UmaEvWmadA","ZuDtDQWxoT","Nxx9VP6bcg","fFDrJRsQUq","QChxs0Wr5y",
+"zmLYDQChxs","Dz1R3AIYUu","cQOnvqaofN","tuDyS9rlg9","Uvlv4Mkgy8","ru4UGZv7z0","NOHszX6Pin","Y1mC0y94nw","ydG8UStlDJ","YOfrYFwEJz",
+"DcpWBfaHir","9eoRc9eoRc","1LB1LokgRi","uoStwzHF1q","PYBf49iGoT","DcpWBcQOnv","brhlQjiVBP","lj07QbgJAz","iKqhrReKEW","uPX7G7lUXZ",
+"QWxoTuLtKs","blLA9zqH0W","jS1ajCK5W7","lj07Q6AFT0","VerEANxx9V","29QAzDG4sT","lpF6Wx3LDe","uPX7GMmsIo","64s8NuLtKs","Uvlv4uJScX",
+"RACujulk41","C2IrcjeskS","e6e4z580YD","GWqqXU3yw5","CxVEfOz8yZ","U3yw5JXljW","In3NShSSvQ","s7MxkwiHrZ","XyPZNMkgy8","IBe8kjeskS",
+"wiHrZsuY4x","oVQp6LDk6f","v8yFNRmDcr","VBjhzUvlv4","MGlTF9iGoT","y94nw9GXkX","OUqFM16lHc","hSSvQhE1Ql","Ss0ZupvgjS","gjUTutl72W",
+"LDk6fMGlTF","MK07YSWfou","jfREuZUnqt","7lUXZ5Drn0","Cp3mZEOE1o","HlUbFRACuj","MaJQshE1Ql","yvOMIhUTw7","4dEz6yEfy9","he9IAyToGW",
+"LewvMLewvM","GrDg7uAWyp","ThjNnStlDJ","TwanonFqik","ZuDtDK4GS8","rhl0JwDajX","ogLgcyToGW","2DREsVIlwP","RsQUq0PktI","RsQUqksJby",
+"BGaQYCfgr3","55rfBfaHir","h1zcHxReec","MmKGJpFrrl","HfyNQXflUq","aez9yLewvM","RACujuN6r3","FhtglfFDrJ","i7WMQZUnqt","2hEEUatef2",
+"ogLgcs4786","FxX9qydG8U","rKDLJsuY4x","fFDrJ14FLR","IBe8klweGy","lj07Qd7vjM","MmKGJZhwG1","pv0i7uoStw","2ZHdkFPfSE","yEfy9JIqXi",
+"GXdoHPOUYS","sx5Gldpe1v","7Ow5Culk41","lCMxy2Yz7E","a00b5JkzUn","MK07YcL0aE","F6PT2iqv4k","uoStwlpF6W","9iGoTFjHXR","WPmlxYw2oU",
+"5Drn05Namm","ogLgc0Wr5y","zQt6QSWfou","BpYhVLewvM","B3qemiqv4k","lH1ktfcJOy","CIShGgjUTu","Oz8yZ8RCUA","Ta8f6F6PT2","pT8wuDcpWB",
+"yToGWyToGW","suY4x8U2nU","CNHmvuZPqg","vLsmSwiHrZ","POUYSzFgtB","4W0Tl1v5hH","n8pJ9Cfgr3","SbRYyjSjS3","Q6LixbZLvS","I7p2alsQGo",
+"EoToPlj07Q","lj07QGv3Fq","zbIYYCK5W7","G1RhStuDyS","dQ586TXQ0Z","jiVBPdjsrv","RkQkeyToGW","euZA53weIF","lsQGooVQp6","FGzgpatef2",
+"S77LHHzZT8","SjskQRxrsm","FxX9qatef2","suY4xFLsph","gf8rIYjB9t","cQOnvtlILt","U3yw5xXTI4","7Ow5CvkCHH","FLsphzz4ZU","2Nslm6AFT0",
+"prNT655rfB","QWxoToVQp6","RmDcrdhSuH","zqH0WTa8f6","EOE1o0ao3l","TCgPpCqqaD","uZPqgIRh48","jtn0XFPfSE","NAFuwjzUqR","okgRiRsQUq",
+"DcpWBEOE1o","QnJ1SogLgc","iwzGkMm8si","blLA9zQt6Q","5Drn0lpF6W","1j5L8suY4x","pmeCdgtCA5","ni2v1KASQ8","UmaEv8FmFH","SjskQRkQke",
+"ix74rpFrrl","i3pydZv7z0","RkQke0Kyfs","rhl0JNxx9V","iwzGkWPmlx","1j5L8h1zcH","ZJTXHNo0Qb","oGu6x8TxD7","Ta8f6piJSk","iqv4k8FmFH",
+"fcwDalXFOB","K4GS8vOqCE","vOqCERBhp0","lj07QRxrsm","gIYvEZv7z0","m4bxU0Wr5y","FPfSEBCxeC","QClRLK4GS8","blLA9UmaEv","iB08ljSjS3",
+"bgJAzTwano","k85Aev1Hln","s93Ml1j5L8","yluBxyofH3","CNHmvkB5nP","yofH3v2eC3","gjUTut98iW","rhl0J9iGoT","atef28FmFH","JJs5mksJby",
+"AgJHQ2hEEU","14FLRa00b5","MmKGJW7cTs","JXljWhSSvQ","oQ87rIBe8k","tlILthi5X7","zFgtBokgRi","Mm8silsQGo","oGu6xFjHXR","jeskSZJTXH",
+"BFkb8In3NS","i3pyd5iGN5","ZJTXHWMiS3","gjUTumz8gx","JXljW7fsYM","CdyBViKqhr","0h1b1Kr8ys","NcICAAgJHQ","dpe1vRsQUq","fqypyAgJHQ",
+"gtCA5ni2v1","BFkb8lpF6W","MaJQsWreyP","lXFOBiwzGk","P6bcgVLTy6","Dz1R30YAGH","v1HlntuDyS","VjCZqiqv4k","VerEAjeskS","iKqhrnnP8o",
+"zFgtBiB08l","cmXIXJJs5m","lsQGoG1RhS","OUYuFvLsmS","djsrvfFDrJ","kZANmWaWsv","uupzkmX2GE","QYxC0gjUTu","lXFOBgjUTu","7fKYU7lUXZ",
+"xXTI4yofH3","QworuEdBKc","WDVWJogLgc","0Wr5ysoy9t","RsQUquvf7A","3otm6Nxx9V","qQxHPhe9IA","gdQsSjeskS","ReKEWuvf7A","s7Mxkjtn0X",
+"TCgPpJKWYR","pv0i7gIYvE","7fKYU5iGN5","O3iyQd7vjM","K4GS8nlaBy","wDajXFVMxo","9GXkXECMvU","gIYvEyofH3","F6PT2FjHXR","t98iWaL6AJ",
+"1LB1LnlaBy","2DREsZhwG1","dmoS7FGzgp","SmGzv5nmWv","gtCA5JRJQB","zqH0WguMb8","0KyfsMmKGJ","okgRiM6qcG","iB08lIRh48","lCMxyQYxC0",
+"MmsIo0PktI","azIWpcmXIX","tjQxspAhR1","uupzknlaBy","JRJQBI7p2a","7X3uyIjTwP","gf8rI5IhmG","lH1kthYBCK","iqv4k1v5hH","8hJdtIKxdL",
+"QClRLsuY4x","AkKTkHP433","7Ow5CJRJQB","JIqXi4QMc9","VLTy65Mg9r","QssNCRxrsm","BCxeCrhl0J","BCxeCzqH0W","azIWpksJby","8U2nUCNHmv",
+"7X3uy0Kyfs","GWqqXaDGtS","cShY28hJdt","D6rByWaWsv","piJSkuTacx","v8yFNRsQUq","ulk41pvgjS","dpe1vd85a9","KASQ8hi5X7","d85a98RCUA",
+"d85a92TRI7","jzUqRyluBx","9eoRcm4bxU","jSjS39eoRc","29QAzLewvM","JkzUnWDVWJ","lj07QcShY2","yvOMIFjHXR","WaWsv48cHL","euZA5lj07Q",
+"WreyPhSSvQ","0MR5XX6Pin","Zv7z0EdBKc","l83UdYjB9t","xReecpvgjS","I7p2a5ZaEz","iwzGktjQxs","dmoS7guMb8","0ao3lpFrrl","Pb1pa2TRI7",
+"Yf2EciB08l","LbRTHNAFuw","3otm6uLtKs","t98iWCNHmv","gf8rI9rlg9","MaJQsOUqFM","MaJQsblLA9","1LB1LaDGtS","BGaQYW7cTs","ThjNnWDVWJ",
+"580YDnFqik","cShY2CIShG","XflUq7hyVv","aez9y7Ow5C","fcJOyX6Pin","55rfB6AFT0","dpe1vgjUTu","2DREstuDyS","k85AeFnPFB","I7p2ak85Ae",
+"jzUqR0YAGH","QClRLWreyP","HfyNQhE1Ql","tlILtlweGy","ru4UGUmaEv","uZPqgpAhR1","uPX7GtvdkD","dQ586kZANm","POUYStl72W","mX2GEprNT6",
+"lH1ktpiJSk","lsQGoSjskQ","ReKEWB3qem","gtCA5uTacx","jfREuSjskQ","zqH0We6e4z","prNT6gIYvE","Mm8sihi5X7","VBjhzn1pmO","d85a9pv0i7",
+"tuDySLbRTH","yvOMIQYxC0","8FmFHpmeCd","HP433YjB9t","7fKYUhi5X7","IBe8k5IhmG","soy9tDz1R3","QWxoTlweGy","24ARFtaOXK","0BmCyOxWIH",
+"MmKGJDQimp","Chuy3ksJby","lj07QFGzgp","Pb1paCfgr3","XflUqJIqXi","2NslmIjTwP","RmDcrhUTw7","OHaBz8RCUA","5nmWvG1RhS","tl72Wlj07Q",
+"F6PT20ao3l","B3qemQClRL","cL0aE29QAz","7X3uytAOsr","8RCUAciuWz","RpBQmFcWrW","P6bcgru4UG","uTacxK4GS8","wiHrZhYBCK","brhlQSmGzv",
+"pWiOs64s8N","JJs5mvLsmS","MmKGJciuWz","HzZT8Twano","0PktIn8pJ9","v1Hln1LB1L","OUYuF8xEKz","3otm6lCMxy","5nmWvAOgEe","h1zcHfcJOy",
+"7X3uyv1Hln","0YAGHiB08l","RzaZAMm8si","M3zXLGXdoH","BbwgAReKEW","DG4sTuN6r3","24ARF8xEKz","9eoRcFVMxo","ix74rNOHsz","CdyBV7lUXZ",
+"hSSvQru4UG","Q6Lix5iGN5","xReecnlaBy","BpYhV29QAz","JRJQBcmXIX","4QMc9rz7Ut","xciqpL7cGc","RACujcShY2","U3yw5O3iyQ","2Nslmd7vjM",
+"yluBxMmKGJ","F6PT2GWqqX","zHF1qAmdQd","suY4xv1Hln","soy9tCK5W7","Yh1hF24ARF","RzaZAXyPZN","a00b5JIqXi","ZUnqthE1Ql","d85a9rhl0J",
+"5drc6QClRL","S2DfuMkgy8","jzUqR5IhmG","MojnPzHF1q","iB08lUlU3M","b29RJNAFuw","pv0i7yluBx","K20wKjSjS3","UmaEvVIlwP","UlU3M618Di",
+"L7cGcOUqFM","y94nwFFDui","uoStwL7cGc","h1zcHlweGy","QYxC0ZzJHW","d85a9FcWrW","euZA5IBe8k","VIlwPuQIcz","jfREuMK07Y","0KyfsIBe8k",
+"hSSvQCdyBV","TXQ0ZpT8wu","dmoS7Mkgy8","AOgEe9iGoT","8FmFH8cVD3","WmadAh1zcH","prNT6J2mQi","zmLYDogLgc","brhlQMaJQs","Vprf2JJs5m",
+"b29RJYOfrY","oQ87ruTacx","RkQkecShY2","tlILt5Namm","iqv4k8cVD3","BGaQYlm0pD","7fKYUzbIYY","lsQGo2TRI7","FwEJz2Yz7E","TCgPphUTw7",
+"Ul4a1WmadA","MmsIoe6e4z","xciqpjSjS3","In3NSSWfou","Vprf2VNCPd","gtCA5fFDrJ","ni2v19iGoT","5nmWvRzaZA","14FLRVjCZq","RxrsmNxx9V",
+"uLtKsv2eC3","XflUq14FLR","v1HlnI7p2a","CK5W7Q6hMC","Yh1hFXyPZN","gtCA5Pb1pa","HzZT8uvf7A","WMiS3Fhtgl","EOE1o0Kyfs","0MR5XYf2Ec",
+"K20wKFjHXR","0ao3luPX7G","5drc6Nxx9V","RmDcrAmdQd","zQt6QjzUqR","PYBf47ku1p","kB5nPm4bxU","gIYvEWaWsv","UmaEvy94nw","azIWpQ6Lix",
+"Yh1hFa00b5","BCxeCHfyNQ","m4bxUKr8ys","uQIczWmadA","oQ87rEOE1o","3weIFqQxHP","3otm6uTacx","16lHcGrDg7","gjUTuFhtgl","gtCA5hSSvQ",
+"Nxx9Vv1Hln","2hEEUPOUYS","Yh1hF6AFT0","mz8gxrz7Ut","RpBQmTCgPp","pmeCdd7vjM","tl72WRACuj","SWfouDG4sT","ulk41pv0i7","bZLvSdmoS7",
+"L7cGcpAhR1","KsjRKyluBx","48cHLqaofN","YOfrYv2eC3","tlILtlm0pD","uTacxNhXdu","RACuj5IhmG","zY1GYMGlTF","bZLvSKASQ8","AkKTkZuDtD",
+"he9IA5nmWv","NhXduTXQ0Z","W3VFHhE1Ql","SbRYyokgRi","XflUqPb1pa","WMiS3ni2v1","SbRYyCp3mZ","8U2nU6AFT0","EOE1oVerEA","JkzUnDQimp",
+"nnP8oVprf2","kZANmVIlwP","0YAGHIn3NS","2hEEUEdBKc","LewvMwDajX","lpF6W7fsYM","VNCPd9y4lw","45cIHi7WMQ","uoStwfaHir","UmaEvwDajX",
+"cmXIXM6qcG","uZPqgOz8yZ","8TxD7fqypy","prNT6FnPFB","lH1ktFcWrW","qUJMdhUTw7","gdQsSdpe1v","t59lRFnPFB","0MR5X2Nslm","Nxx9V5Namm",
+"tl72WrKDLJ","kB5nPyofH3","AgJHQdmoS7","JKWYRUmaEv","FwEJzuoStw","lXFOBKsjRK","dmoS7yToGW","uLtKs29QAz","2NslmZzJHW","MK07YHP433",
+"QChxs0BmCy","D6rByuAWyp","NAFuw7fKYU","uJScX29QAz","QYxC0cQOnv","MK07Yaez9y","7fKYUBbwgA","iKqhraL6AJ","ksJbygf8rI","Ta8f6zz4ZU",
+"pv0i7FnPFB","VNCPdThjNn","YOfrYhUTw7","RzaZAb29RJ","ECMvURzaZA","DG4sT5Namm","FVMxoaez9y","RxrsmRkQke","o8Uydix74r","9iGoTlXFOB",
+"IjTwPSs0Zu","blLA9Zv7z0","Mm8sixciqp","07n1cCfgr3","WreyPgtCA5","tAOsrRsQUq","lpF6WQnJ1S","Yf2Ec0Wr5y","nlaByRpBQm","DLhzMSmGzv",
+"uoStwfcwDa","ThjNnHRxd8","aez9yIBe8k","t59lRsuY4x","RpBQmh1zcH","4QMc9YjB9t","O3iyQBbwgA","XflUq29QAz","lCMxyazIWp","BpYhVlXFOB",
+"5IhmGtuDyS","bgJAzlkMUA","FFDuih1zcH","dQ586JKWYR","No0QbVLTy6","5Drn0IjTwP","n1pmO45cIH","fFDrJ8FmFH","zFgtBWreyP","s7MxkRzaZA",
+"K4GS8zqH0W","0PktI48cHL","4W0TlgjUTu","HP433ix74r","vLsmSI7p2a","9rlg90BmCy","nFqik4QMc9","AXpwE0Kyfs","7ku1pCqqaD","2ZHdkS2Dfu",
+"IRh48pWiOs","TXQ0ZK20wK","KsjRKFcWrW","zY1GYiqv4k","VerEAAOgEe","b29RJa00b5","Chuy3CIShG","gtCA529QAz","Nxx9VyluBx","m4bxUs4786",
+"CNHmvlm0pD","ydG8UQ6Lix","SjskQdjsrv","e6e4ztl72W","NcICAMmsIo","rKDLJx3LDe","aL6AJsqVrf","JJs5mRACuj","Dz1R3QssNC","fcJOyyofH3",
+"618Digf8rI","zHF1qZv7z0","0YAGHI7p2a","KASQ8M6qcG","FnPFBHlUbF","618DiHfyNQ","5ZaEzni2v1","pv0i7x3LDe","CNHmvPb1pa","FcWrWaDGtS",
+"VIlwPVIlwP","Gv3Fq8FmFH","lkMUA14FLR","bgJAz4dEz6","14FLR8TxD7","HRxd8uQIcz","FFDui0BmCy","tvdkDQ6Lix","6AFT0dQ586","aDGtSiwzGk",
+"uTacx1v5hH","Qworupv0i7","yluBxS77LH","fqypylweGy","6AFT0Cfgr3","2DREsCp3mZ","WMiS39XyT9","uupzkEdBKc","lweGyFnPFB","1j5L8Yw2oU",
+"y94nwbrhlQ","wiHrZVerEA","Gv3FqNhXdu","mz8gxiwzGk","BpYhVxXTI4","cQOnvWmadA","LewvMJKWYR","zbIYYwiHrZ","MojnPUmaEv","Dz1R364s8N",
+"lkMUAqaofN","Qworu5Namm","0Wr5yv1Hln","LewvMcQOnv","aDGtSCp3mZ","uTacxHzZT8","WreyPcQOnv","o8UydbrhlQ","yEfy9Pb1pa","Vprf2gjUTu",
+"CIShGCNHmv","dpe1v5VZjS","jSjS3Fhtgl","i3pydIRh48","hi5X75iGN5","DLhzMguMb8","qUJMdWPmlx","UlU3Mx3LDe","FnPFBzbIYY","FNYIMIBe8k",
+"0YAGH9eoRc","faHirpmeCd","TXQ0ZtvdkD","ru4UGcL0aE","nlaBydjsrv","ZJTXH7ku1p","DLhzMJ2mQi","SjskQVLTy6","lkMUAlpF6W","vLsmSZuDtD",
+"TCgPpWDVWJ","sqVrf6AFT0","1LB1LF6PT2","K4GS8oVQp6","uAWypuPX7G","7X3uyiKqhr","2TRI7gf8rI","8TxD724ARF","CdyBVkZANm","RACujlH1kt",
+"kZANmyluBx","NhXdui7WMQ","prNT6MezSW","Qworui3pyd","OxWIHFPfSE","24ARFCIShG","ZUnqtNOHsz","s7Mxkh1zcH","HzZT82DREs","45cIHAmdQd",
+"uJScXK20wK","5Mg9rdQ586","C2IrcNo0Qb","Vprf2aDGtS","VLTy6qUJMd","l83UdTwano","b29RJuvf7A","o8UydlweGy","mz8gxlpF6W","1v5hHm4bxU",
+"iqv4k2Nslm","yToGWAgJHQ","7fKYUAIYUu","K4GS80Wr5y","GXdoHzY1GY","dQ586Gv3Fq","prNT6hYBCK","29QAzO3iyQ","5Drn0FNYIM","QChxsEOE1o",
+"DLhzMUmaEv","s7MxkOHaBz","KZamHru4UG","4dEz6lXFOB","gtCA5HRxd8","fcwDaqaofN","uoStwwDajX","lj07QuN6r3","CNHmvAkKTk","yEfy9o8Uyd",
+"xXTI4FNYIM","CIShGkZANm","uLtKsuTacx","VerEAI7p2a","RkQke8TxD7","14FLR55rfB","cShY2DLhzM","HRxd8YOfrY","ECMvUfmIK1","uupzkRpBQm",
+"zY1GYOz8yZ","ulk41xReec","RmDcrNxx9V","jeskSni2v1","sx5GlhE1Ql","BbwgAd7vjM","1j5L87hyVv","atef2BpYhV","7lUXZTXQ0Z","VerEAt59lR",
+"zY1GY55rfB","RACuj9eoRc","uAWypydG8U","Q6LixHP433","Yf2EcIRh48","kB5nP0ao3l","FLsphS77LH","faHirXflUq","D6rByM3zXL","blLA9OxWIH",
+"dpe1vhSSvQ","MaJQsDQimp","IRh48zbIYY","RkQke9y4lw","4QMc95IhmG","SWfoudmoS7","DcpWBzHF1q","WaWsvqQxHP","KASQ88RCUA","VNCPdD6rBy",
+"fFDrJ48cHL","FjHXRsx5Gl","yToGWZ4I1v","wDajX24ARF","S2DfuJRJQB","ksJbyVjCZq","ru4UGhe9IA","FxX9qi3pyd","2NslmuTacx","5NammuTacx",
+"t98iWfmIK1","TwanoWreyP","7hyVvzmLYD","07n1clViBv","zqH0WuLtKs","ni2v1Waim6","AIYUuBCxeC","K20wKksJby","0ao3ln8pJ9","lkMUAprNT6",
+"Z4I1vi3pyd","Ta8f6Pb1pa","64s8NKASQ8","UmaEvRzaZA","Kr8ysuN6r3","fmIK1pFrrl","oGu6xM3zXL","lpF6WUmaEv","RACujlkMUA","jzUqRSjskQ",
+"POUYSHfyNQ","9iGoTxXTI4","rhl0J8U2nU","5Drn01LB1L","FLsphUvlv4","OHaBzh1zcH","jeskSS2Dfu","uQIcz3weIF","45cIHU3yw5","5Mg9rI7p2a",
+"5nmWvtvdkD","CK5W7d7vjM","8xEKzNOHsz","MmKGJBpYhV","SbRYybrhlQ","Ul4a1ydG8U","DLhzMiqv4k","5IhmGRBhp0","lViBvv1Hln","zmLYDs4786",
+"IBe8kfLNg8","5ZaEzM6qcG","zz4ZUC2Irc","7fKYUtjQxs","RACujKr8ys","7fsYMAIYUu","cL0aErKDLJ","hi5X7ReKEW","oQ87r2Yz7E","jS1aj0h1b1",
+"7fKYUuupzk","64s8N4dEz6","1LB1Ls93Ml","UmaEvru4UG","29QAzgIYvE","RkQkefcwDa","ZuDtDM6qcG","aez9ytjQxs","VerEAuN6r3","IBe8kdQ586",
+"Ul4a1XyPZN","OUYuFlXFOB","DQimpaFFss","tjQxs3weIF","XyPZNlH1kt","M6qcGoQ87r","FwEJzvkCHH","zz4ZURsQUq","Zv7z0Qworu","m4bxU8RCUA",
+"bgJAzAmdQd","MezSW55rfB","ciuWzru4UG","AOgEeECMvU","t59lR2TRI7","CdyBVI7p2a","DG4sTuoStw","hYBCKiB08l","CK5W7Fhtgl","ni2v15ZaEz",
+"ZzJHWFVMxo","Oz8yZblLA9","7Ow5Cv2eC3","RzaZAGv3Fq","lj07QYh1hF","OUYuFfmIK1","Kr8ys618Di","5Drn06AFT0","wiHrZs93Ml","7lUXZpiJSk",
+"OxWIH16lHc","rz7UtWreyP","ru4UGhSSvQ","lsQGoP6bcg","lViBv9rlg9","zqH0WM3zXL","zY1GYcShY2","RmDcrIKxdL","SbRYy8FmFH","XflUqDQimp",
+"1LB1LtlILt","UmaEvIjTwP","BpYhV0Wr5y","lpF6WyEfy9","GXdoHJKWYR","ZUnqtv8yFN","zFgtBXflUq","HRxd8cShY2","d85a9jSjS3","FFDui16lHc",
+"lweGy48cHL","EoToPdjsrv","tlILtJXljW","WmadAOHaBz","6AFT0Zv7z0","QClRLzmLYD","s93MlRxrsm","vOqCEuN6r3","P6bcgn1pmO","yvOMIIRh48",
+"pAhR1StlDJ","Q6Lix7X3uy","gdQsSHzZT8","2hEEUC2Irc","MaJQsguMb8","64s8NyEfy9","sqVrfrKDLJ","8RCUAlm0pD","tjQxss7Mxk","Mm8si0ao3l",
+"O3iyQ16lHc","d7vjMyofH3","5Drn08xEKz","djsrvru4UG","zz4ZUVLTy6","J2mQigIYvE","fLNg8WMiS3","pvgjSdQ586","M3zXLW7cTs","djsrva00b5",
+"fcwDa55rfB","Zv7z0S2Dfu","SbRYyL7cGc","QnJ1Suvf7A","s4786BCxeC","Chuy3euZA5","ni2v1FGzgp","AOgEe1LB1L","lj07Qsx5Gl","iKqhriqv4k",
+"pT8wunlaBy","XyPZNZv7z0","POUYSCp3mZ","ogLgcVBjhz","MezSW0YAGH","t98iWt98iW","i3pydlH1kt","AmdQd0MR5X","2TRI70BmCy","nFqik64s8N",
+"FcWrW9XyT9","D6rByNcICA","0BmCy9y4lw","y94nwBGaQY","s478664s8N","tuDySjzUqR","jiVBPYh1hF","xciqp9XyT9","lH1ktzmLYD","0Kyfs2TRI7",
+"8TxD7580YD","cmXIXFNYIM","JJs5m7lUXZ","9GXkX4QMc9","Kr8ysxciqp","uTacxqQxHP","pWiOsuPX7G","zHF1q2TRI7","dhSuHy94nw","BFkb8BFkb8",
+"soy9t8U2nU","m4bxUyluBx","Kr8ysTwano","SWfoutAOsr","ogLgcrhl0J","brhlQPb1pa","F6PT2y94nw","ZUnqtGXdoH","QbxXclkMUA","fcJOy5drc6",
+"6AFT0okgRi","AOgEepv0i7","tl72WCdyBV","NOHszhE1Ql","xXTI4JXljW","WDVWJOz8yZ","sx5GllH1kt","NOHszn1pmO","fqypyBbwgA","Nxx9V3otm6",
+"x3LDecmXIX","VIlwPAIYUu","VjCZq4W0Tl","m4bxURACuj","YjB9ttlILt","ni2v1TXQ0Z","lH1kt3otm6","RBhp0DcpWB","piJSkdhSuH","l83UdlkMUA",
+"wDajXlH1kt","nnP8oW7cTs","vLsmSqUJMd","QworuUl4a1","bZLvSfaHir","FcWrWMojnP","QClRLv2eC3","m4bxU2Nslm","uJScXDQimp","cmXIXh1zcH",
+"lweGymX2GE","aez9ybgJAz","uN6r3DcpWB","hi5X72DREs","0Wr5yo8Uyd","2ZHdkK20wK","xciqpjeskS","pv0i7tl72W","hi5X7HRxd8","prNT6yToGW",
+"guMb8Cfgr3","XyPZNy94nw","o8Uyd5ZaEz","uLtKs2DREs","uTacxsx5Gl","S2Dfu0MR5X","d7vjM48cHL","5IhmG29QAz","2NslmAgJHQ","RBhp08RCUA",
+"Nxx9VDz1R3","gf8rIcQOnv","kZANmZuDtD","VerEA8cVD3","sqVrfuJScX","gdQsSGrDg7","FjHXRYf2Ec","qaofN5VZjS","0BmCyZhwG1","azIWpbZLvS",
+"2Yz7ERkQke","Q6Lix0YAGH","oVQp6NcICA","mX2GEVjCZq","brhlQqQxHP","s93MlpiJSk","XflUqh1zcH","5NammTCgPp","HRxd8Zv7z0","2NslmHP433",
+"HzZT8guMb8","7lUXZC2Irc","Ul4a1pFrrl","VNCPdIn3NS","ydG8UVBjhz","cShY2dhSuH","RBhp0CIShG","B3qemQworu","W7cTsD6rBy","WDVWJI7p2a",
+"he9IAVNCPd","nlaBykB5nP","qUJMdjzUqR","pT8wuJ2mQi","ulk41zmLYD","dmoS7QbxXc","M6qcG29QAz","HzZT8i3pyd","LewvMK4GS8","AgJHQogLgc",
+"Yh1hFzbIYY","8FmFHxXTI4","5VZjScShY2","RsQUqgjUTu","blLA98RCUA","0Wr5yazIWp","vkCHHW3VFH","0h1b1VerEA","Vprf2qaofN","RsQUqpT8wu",
+"S2Dfumz8gx","oGu6xblLA9","FNYIMtl72W","jS1ajsqVrf","qQxHPfcJOy","LDk6f1LB1L","FPfSEYw2oU","FLsphLewvM","uvf7As7Mxk","pvgjSPb1pa",
+"nlaByuTacx","Yf2Ec55rfB","RzaZA0ao3l","OHaBzlm0pD","OUYuFXyPZN","lViBvgjUTu","POUYSGv3Fq","Q6LixVjCZq","Fhtgls4786","K20wKatef2",
+"AIYUuBFkb8","45cIH4dEz6","tvdkDdjsrv","IRh48DQimp","OUYuFuvf7A","Oz8yZfcJOy","vkCHHbZLvS","WDVWJoQ87r","Cp3mZQChxs","kB5nP2ZHdk",
+"Nxx9VlCMxy","sx5Glx3LDe","t98iWThjNn","suY4xI7p2a","DLhzMRBhp0","zmLYD0PktI","uvf7AtlILt","S77LHciuWz","4W0TlnnP8o","uAWyp7fKYU",
+"64s8NeuZA5","7Ow5CaFFss","s7MxkSWfou","ogLgcMK07Y","yvOMIJKWYR","pvgjSaL6AJ","O3iyQCNHmv","l83UdfmIK1","uAWyp618Di","GXdoHm4bxU",
+"DLhzMQChxs","dhSuHVLTy6","Chuy3SjskQ","3otm60BmCy","wDajXaDGtS","zqH0WTwano","ECMvUrKDLJ","618Dimz8gx","qaofNx3LDe","RpBQmgdQsS",
+"VIlwP8TxD7","48cHLjSjS3","K4GS8sx5Gl","xXTI4Yh1hF","AIYUumX2GE","VNCPdRxrsm","dpe1vC2Irc","5nmWvU3yw5","oGu6xDQimp","9y4lwx3LDe",
+"n1pmOni2v1","WMiS3ksJby","D6rByyvOMI","2TRI7Ul4a1","JKWYRIRh48","UlU3M9iGoT","S77LH618Di","vkCHHZhwG1","zqH0WChuy3","S2DfulsQGo",
+"JIqXiDG4sT","FGzgpzqH0W","cShY2JXljW","WaWsvGv3Fq","jfREujS1aj","k85Ae8xEKz","uPX7GAIYUu","LbRTHHlUbF","jiVBPVerEA","fqypyKr8ys",
+"gf8rIFwEJz","8xEKzpiJSk","zqH0W2Nslm","VBjhzFhtgl","VerEAMm8si","ECMvU3otm6","FFDui9rlg9","BCxeCDcpWB","uvf7ADcpWB","RzaZAjzUqR",
+"lH1ktix74r","SbRYyi7WMQ","MojnP5drc6","lm0pDksJby","zY1GYAOgEe","lweGy6q6L9","fcJOyYjB9t","XflUqoQ87r","HzZT85Mg9r","Yw2oUoQ87r",
+"v2eC3KsjRK","B3qemDQimp","MezSW0MR5X","i7WMQaez9y","2Nslm5Namm","ulk41RACuj","1v5hHuPX7G","uoStwOxWIH","uTacxQWxoT","h1zcH07n1c",
+"tl72WlpF6W","SmGzvChuy3","yofH3MK07Y","vkCHHhYBCK","CdyBVQworu","StlDJGXdoH","BbwgAh1zcH","L7cGc5iGN5","jtn0XaL6AJ","JIqXiGv3Fq",
+"FnPFB8cVD3","yEfy9RmDcr","ru4UGvkCHH","vOqCE5iGN5","RxrsmtjQxs","OUYuFGrDg7","Zv7z0sx5Gl","CK5W79XyT9","RpBQmzmLYD","iwzGkcL0aE",
+"8hJdtaFFss","fLNg8atef2","fLNg85drc6","1j5L8NcICA","D6rByMGlTF","BGaQYVjCZq","tuDySuJScX","5Drn0guMb8","BCxeCpmeCd","HzZT8ru4UG",
+"QChxsYjB9t","ThjNnBFkb8","tl72W1j5L8","gjUTuCdyBV","lj07QOHaBz","QClRLfaHir","pWiOsSs0Zu","nnP8oRkQke","tuDyS1LB1L","pFrrluvf7A",
+"FwEJz2ZHdk","pvgjSRACuj","rKDLJCNHmv","lj07QlCMxy","uN6r3aDGtS","FLsph3otm6","K20wKAOgEe","gIYvEwDajX","64s8NQnJ1S","9iGoTWaWsv",
+"MGlTFsx5Gl","i7WMQlj07Q","W3VFH29QAz","aL6AJ9rlg9","jiVBPYf2Ec","5Mg9rO3iyQ","h1zcHxciqp","Q6hMCfFDrJ","RsQUqm4bxU","fcwDahUTw7",
+"FxX9qdpe1v","nnP8oqUJMd","AmdQddmoS7","vOqCEfLNg8","QworuIn3NS","v1Hlnn8pJ9","pFrrlWmadA","W3VFH24ARF","pAhR18TxD7","n1pmO580YD",
+"FGzgpIBe8k","DG4sT0ao3l","TXQ0ZjfREu","ksJbyhi5X7","W3VFHVBjhz","RpBQmwiHrZ","cmXIX55rfB","I7p2adQ586","zFgtBZuDtD","blLA9YjB9t",
+"FjHXRb29RJ","zz4ZUgtCA5","pWiOsuupzk","Vprf255rfB","QClRLaFFss","Z4I1vgIYvE","rhl0JHlUbF","580YDyluBx","bZLvS2hEEU","7hyVvGSQwj",
+"ksJbyyvOMI","iqv4kFhtgl","ZzJHWDG4sT","tjQxsgtCA5","he9IAatef2","uZPqgfcwDa","cmXIXs7Mxk","7lUXZ5Namm","hi5X73weIF","Yf2Ec29QAz",
+"45cIHFLsph","9rlg9yluBx","yEfy9aez9y","IjTwPuQIcz","djsrvTwano","QssNCOxWIH","Chuy35nmWv","piJSk0MR5X","HlUbFK4GS8","ru4UGe6e4z",
+"tjQxsatef2","9iGoTS2Dfu","jSjS32DREs","ZJTXH0h1b1","azIWpk85Ae","zQt6QStlDJ","55rfBSs0Zu","e6e4zZJTXH","ThjNnS77LH","pv0i7Yf2Ec",
+"pT8wuYOfrY","RsQUqprNT6","QworuThjNn","mX2GEhYBCK","9XyT9pmeCd","h1zcHnnP8o","I7p2am4bxU","QWxoTjiVBP","taOXK8TxD7","Cp3mZcShY2",
+"Qworu1v5hH","W3VFHv8yFN","HlUbFAgJHQ","pmeCdJRJQB","zQt6QRsQUq","4dEz6ZJTXH","djsrvQworu","GrDg7JRJQB","cL0aEZUnqt","7lUXZ9eoRc",
+"FVMxo55rfB","yvOMIRACuj","ciuWzQnJ1S","ZUnqtOxWIH","jfREuQWxoT","o8UydhYBCK","uTacxUl4a1","RpBQma00b5","iwzGk3weIF","B3qemEoToP",
+"b29RJTwano","7ku1pBGaQY","RkQkehe9IA","55rfB580YD","07n1cMGlTF","gdQsSx3LDe","29QAzmz8gx","OxWIHReKEW","M6qcGqQxHP","Mm8siwDajX",
+"GWqqXkB5nP","Y1mC0m4bxU","taOXKzHF1q","M3zXLgtCA5","uupzke6e4z","45cIHWaWsv","5Mg9rSjskQ","XflUqt98iW","DG4sT48cHL","xReecQ6Lix",
+"OHaBzpvgjS","l83UdAXpwE","v1HlnHRxd8","MmsIoCqqaD","Rxrsm4QMc9","0ao3lNcICA","zFgtBcShY2","Twano3otm6","618DiqQxHP","Oz8yZokgRi",
+"suY4x9eoRc","No0QbFwEJz","aFFssCIShG","gdQsSd85a9","Mkgy8yvOMI","OHaBzYjB9t","5ZaEzpAhR1","QYxC016lHc","cQOnvatef2","SmGzvAkKTk",
+"48cHLtaOXK","Yh1hFFNYIM","jzUqR2DREs","SmGzv6AFT0","zbIYY8cVD3","HlUbFnFqik","jSjS3W7cTs","QbxXcQbxXc","wiHrZoVQp6","PYBf4lj07Q",
+"lXFOBaFFss","FPfSEOUYuF","0Wr5yrKDLJ","2TRI7P6bcg","14FLRnlaBy","DG4sTBFkb8","FGzgpfqypy","7Ow5CFxX9q","y94nw7lUXZ","dQ586B3qem",
+"CdyBV14FLR","6AFT0TXQ0Z","iqv4k1LB1L","VBjhzBGaQY","aDGtSLewvM","uPX7GB3qem","NcICABFkb8","SmGzvvkCHH","vkCHHe6e4z","3otm6pT8wu",
+"MmKGJWmadA","prNT6No0Qb","1LB1LuoStw","SbRYy6AFT0","cL0aEd7vjM","pFrrlWaim6","FxX9qNxx9V","CK5W7Z4I1v","FFDuikB5nP","atef2AIYUu",
+"DcpWB7Ow5C","FLsphWDVWJ","1LB1LY1mC0","RsQUqTa8f6","CNHmvlH1kt","pv0i7Cp3mZ","fmIK107n1c","v1Hln2Nslm","Qworu9XyT9","BCxeC0MR5X",
+"azIWppvgjS","rhl0J7Ow5C","Chuy32Nslm","o8UydUl4a1","uTacx1j5L8","KsjRKa00b5","0Kyfs07n1c","djsrvcShY2","UmaEvgjUTu","fmIK1FFDui",
+"o8UydjzUqR","RpBQm16lHc","AXpwEbZLvS","5VZjSpAhR1","jeskSIjTwP","9eoRcFnPFB","CdyBVtAOsr","aL6AJM6qcG","FLsph7hyVv","fqypyuvf7A",
+"dpe1v07n1c","hE1Ql5IhmG","aez9yUlU3M","C2IrccQOnv","b29RJjeskS","piJSkZuDtD","DcpWBjtn0X","guMb8soy9t","FLsph8hJdt","zFgtBlViBv",
+"lm0pDWDVWJ","qaofNt98iW","K20wK8hJdt","ulk41JXljW","ix74r8RCUA","In3NSCfgr3","5drc6iwzGk","d7vjM5Mg9r","QChxsWDVWJ","YjB9t8TxD7",
+"ogLgc5Drn0","jiVBPwDajX","QYxC0jSjS3","L7cGcAIYUu","9rlg9k85Ae","AXpwEMaJQs","4dEz6nnP8o","s4786WaWsv","lCMxyuvf7A","lpF6WyvOMI",
+"ciuWzl83Ud","GXdoHECMvU","i7WMQQClRL","7fsYMPYBf4","JIqXi0h1b1","CNHmvNxx9V","Mm8sicmXIX","RBhp0oVQp6","t98iWZ4I1v","LewvMbgJAz",
+"fcJOybgJAz","iwzGkBFkb8","8RCUAUmaEv","uN6r3jeskS","zFgtB9y4lw","nnP8oSs0Zu","mz8gxFhtgl","0Kyfs5ZaEz","StlDJiwzGk","Nxx9VSbRYy",
+"k85AeVLTy6","t98iWI7p2a","2ZHdkFwEJz","fmIK1UlU3M","O3iyQbZLvS","EdBKcKsjRK","okgRiRmDcr","WPmlxF6PT2","NOHszvLsmS","lweGyxciqp",
+"Cp3mZC2Irc","SWfoubZLvS","ECMvUpv0i7","lpF6WM3zXL","4W0TlWaim6","SmGzvUlU3M","0PktIhi5X7","SmGzvaFFss","lkMUAlsQGo","FPfSEG1RhS",
+"x3LDejzUqR","iB08lFcWrW","MaJQsHlUbF","jfREuWreyP","7fKYUL7cGc","8FmFH1LB1L","Uvlv44dEz6","618DiThjNn","d7vjMLewvM","0YAGHokgRi",
+"aDGtSNxx9V","4QMc9Qworu","AIYUuQ6Lix","FVMxoQ6Lix","Zv7z0s4786","7Ow5CnlaBy","L7cGclj07Q","pvgjS9rlg9","7X3uyQWxoT","pT8wuGrDg7",
+"VerEACNHmv","rKDLJblLA9","xciqpQClRL","CxVEf2Yz7E","y94nwFLsph","6AFT0HfyNQ","t59lRazIWp","okgRivLsmS","ciuWztAOsr","2ZHdkX6Pin",
+"2TRI7Cfgr3","M3zXLhSSvQ","ZUnqtQ6hMC","9rlg9vOqCE","hYBCKOz8yZ","LbRTHulk41","Uvlv4k85Ae","CqqaDGSQwj","fcJOy16lHc","9y4lwAOgEe",
+"AOgEe0BmCy","RACujFxX9q","KsjRKFPfSE","tlILtFGzgp","UlU3MjSjS3","Z4I1vxReec","d7vjMNhXdu","KsjRKrz7Ut","v8yFNzHF1q","fFDrJtAOsr",
+"1j5L8GWqqX","Qworu4dEz6","nFqikJKWYR","MaJQs4W0Tl","lweGyDQimp","uZPqg3otm6","iqv4kjeskS","64s8N0MR5X","RACujQChxs","2DREsGrDg7",
+"BpYhVAgJHQ","M6qcGCqqaD","bgJAz618Di","JJs5mfFDrJ","Dz1R3FwEJz","tjQxsOUYuF","580YDgdQsS","zqH0W618Di","SmGzvFcWrW","MmsIogdQsS",
+"d7vjMChuy3","M6qcGpAhR1","JJs5mdpe1v","bZLvSpvgjS","VNCPdMm8si","lweGyulk41","2Yz7EbgJAz","W7cTs5Namm","cL0aEOxWIH","t59lRzmLYD",
+"CNHmvMmsIo","d85a9RmDcr","VBjhzI7p2a","iwzGkMmsIo","xXTI4BCxeC","HfyNQuPX7G","lH1ktGv3Fq","BpYhVNhXdu","bZLvSY1mC0","FNYIMtaOXK",
+"jfREurhl0J","In3NSBpYhV","KASQ8taOXK","oVQp6OHaBz","RBhp0uJScX","tvdkDxReec","7fKYUOUqFM","JRJQBsoy9t","x3LDe0YAGH","GrDg7s4786",
+"lXFOBzbIYY","i3pydlCMxy","xReecJJs5m","7fsYMBGaQY","CNHmvlViBv","pWiOsMkgy8","O3iyQPOUYS","FhtgloVQp6","618DiVBjhz","prNT6W7cTs",
+"LbRTHgIYvE","IBe8k48cHL","t59lRBCxeC","KsjRKFnPFB","mz8gxDQimp","QbxXc0ao3l","aFFssMaJQs","M3zXLfcJOy","FcWrWWreyP","Q6Lixy94nw",
+"nlaByGv3Fq","fqypyUvlv4","SWfouCfgr3","7fsYMgjUTu","blLA9tuDyS","9eoRcZzJHW","W3VFHDz1R3","2hEEU8FmFH","IBe8kfcwDa","0BmCy1LB1L",
+"ulk41AmdQd","VerEAVBjhz","9rlg9atef2","uupzkuupzk","ThjNnWPmlx","ksJbyzHF1q","XflUqQClRL","Nxx9VfcwDa","7Ow5C0Wr5y","CNHmv5IhmG",
+"8RCUAbrhlQ","uLtKspmeCd","JJs5mIjTwP","GXdoHZ4I1v","zmLYDix74r","B3qemHlUbF","G1RhS5Drn0","xciqpPYBf4","9eoRcQssNC","yToGWU3yw5",
+"pWiOsnlaBy","ZhwG1Qworu","7Ow5CciuWz","VerEAFGzgp","7fKYUni2v1","B3qemFcWrW","DcpWBHP433","nnP8oYw2oU","SjskQix74r","QYxC00h1b1",
+"kB5nPyvOMI","zHF1qDQimp","zQt6QCNHmv","gIYvEoQ87r","ksJbyHfyNQ","9y4lwksJby","5Drn0S2Dfu","8RCUATwano","L7cGctuDyS","fFDrJix74r",
+"SjskQ4QMc9","Cfgr3OUYuF","CK5W7FcWrW","a00b5OxWIH","7hyVvVNCPd","pAhR164s8N","Ta8f6RACuj","RkQkeguMb8","5IhmGnnP8o","jzUqRlH1kt",
+"okgRiP6bcg","0BmCyfqypy","gf8rISWfou","sx5Glrz7Ut","v8yFNRACuj","SjskQJKWYR","yluBxRBhp0","M3zXLF6PT2","RsQUqydG8U","55rfBoGu6x",
+"lViBvMkgy8","BpYhVlH1kt","QworusqVrf","zY1GYFLsph","8cVD39XyT9","NOHsz8xEKz","S2DfuzY1GY","FLsphSbRYy","0YAGHaL6AJ","rhl0J2TRI7",
+"3weIFO3iyQ","0Wr5yVNCPd","cQOnv29QAz","I7p2aCNHmv","tlILt9y4lw","CxVEfprNT6","Cfgr37hyVv","soy9t7lUXZ","guMb8FwEJz","atef2Yf2Ec",
+"8FmFH2hEEU","fqypyuTacx","ECMvUvLsmS","y94nwVIlwP","tAOsrJJs5m","mX2GESs0Zu","a00b58hJdt","14FLRCxVEf","YjB9tCxVEf","rKDLJLewvM",
+"J2mQiRmDcr","ulk41yvOMI","y94nwsx5Gl","fFDrJQWxoT","OUqFMpiJSk","k85Ae7Ow5C","PYBf4SmGzv","WPmlxlXFOB","fqypy8hJdt","lj07QCdyBV",
+"he9IAprNT6","y94nwix74r","dpe1vtlILt","8TxD7J2mQi","v8yFNdmoS7","n1pmOEoToP","lpF6Wdpe1v","0YAGH7hyVv","8FmFHAmdQd","brhlQ5ZaEz",
+"nFqikUmaEv","QYxC0fcJOy","tjQxsfcwDa","FxX9q580YD","ix74rYw2oU","K20wKTXQ0Z","aDGtSrz7Ut","RpBQm580YD","CdyBVDLhzM","jtn0Xt98iW",
+"J2mQiCxVEf","ksJbyoQ87r","zz4ZU64s8N","i3pydChuy3","yluBxk85Ae","LDk6fBGaQY","9XyT9FVMxo","6q6L9JkzUn","6AFT0FNYIM","FFDuiFnPFB",
+"RkQkeS77LH","2Yz7EfFDrJ","G1RhSi3pyd","cShY2AIYUu","aez9yzz4ZU","lm0pDyEfy9","0Wr5yKZamH","2hEEUIBe8k","5Drn07Ow5C","yToGWSmGzv",
+"fFDrJ9rlg9","QbxXcaL6AJ","d7vjM5nmWv","StlDJPOUYS","iwzGkChuy3","mX2GEvOqCE","1j5L8FPfSE","IRh48XyPZN","G1RhS5IhmG","euZA5WmadA",
+"24ARFmz8gx","yofH3QbxXc","DLhzM4W0Tl","6AFT0RBhp0","DLhzMxXTI4","M3zXLo8Uyd","o8UyddhSuH","NhXdulpF6W","dhSuHuN6r3","BbwgAxReec",
+"pT8wulkMUA","StlDJdQ586","lsQGoJRJQB","l83Ud0YAGH","aL6AJD6rBy","x3LDeMmKGJ","8FmFHiwzGk","VjCZq0Kyfs","WreyPi3pyd","16lHcIRh48",
+"YjB9tjtn0X","8cVD3J2mQi","5drc6Yh1hF","vLsmSt98iW","h1zcHb29RJ","xReecCqqaD","VerEAqaofN","sx5GlKsjRK","NOHszeuZA5","lCMxyStlDJ",
+"5IhmGzbIYY","hYBCK6q6L9","aL6AJi7WMQ","soy9tyluBx","t98iW9eoRc","jeskSyEfy9","K4GS8nnP8o","soy9tNAFuw","5drc6KASQ8","MaJQsReKEW",
+"e6e4ztAOsr","CdyBVlCMxy","QbxXcSmGzv","MezSWpFrrl","lH1ktAXpwE","nnP8oEdBKc","6q6L9HzZT8","BpYhVFPfSE","uLtKszmLYD","I7p2azY1GY",
+"tl72WMmKGJ","BpYhVAOgEe","zY1GYThjNn","8U2nUS77LH","IKxdLAmdQd","BGaQY618Di","0BmCyIn3NS","pWiOswiHrZ","iB08l24ARF","5IhmGxReec",
+"HP433tl72W","OxWIHfcwDa","Ul4a1No0Qb","FjHXRD6rBy","m4bxUSmGzv","ReKEWPOUYS","euZA5tl72W","n1pmOTa8f6","jeskS5VZjS","zY1GYF6PT2",
+"B3qemi3pyd","VerEAQnJ1S","NOHszokgRi","9eoRcK4GS8","jzUqROxWIH","cShY29eoRc","aL6AJYw2oU","8U2nU2ZHdk","xciqpvLsmS","LDk6fCIShG",
+"guMb8M3zXL","4QMc9QYxC0","NcICAi3pyd","55rfBgjUTu","gdQsSiwzGk","y94nwh1zcH","AkKTkdhSuH","fcwDaMaJQs","m4bxUiwzGk","Chuy3PYBf4",
+"FwEJz29QAz","Twanohe9IA","pmeCdJ2mQi","0MR5XCfgr3","55rfBt59lR","fmIK18RCUA","aDGtS3otm6","ciuWzuN6r3","GSQwjAXpwE","gtCA5pv0i7",
+"Oz8yZrhl0J","YjB9tEoToP","zY1GYix74r","dhSuHJRJQB","HzZT8Chuy3","FNYIM7fKYU","7Ow5CxXTI4","M3zXLRpBQm","fcwDazmLYD","S77LHTXQ0Z",
+"nFqikpiJSk","45cIHW3VFH","IjTwPm4bxU","ZzJHWZUnqt","QYxC0KZamH","lm0pDNOHsz","EoToPIjTwP","jeskSTCgPp","9GXkXQChxs","0h1b10h1b1",
+"5iGN5gIYvE","vLsmS7X3uy","yofH38RCUA","tjQxsRBhp0","618DiaFFss","JJs5muupzk","2TRI7EdBKc","Ta8f6M3zXL","gIYvE3weIF","SmGzvbgJAz",
+"gjUTum4bxU","C2IrczFgtB","aL6AJk85Ae","m4bxU6AFT0","2ZHdksqVrf","8RCUAMGlTF","6q6L9AkKTk","ogLgcDLhzM","yvOMIVBjhz","aL6AJs4786",
+"3otm6yToGW","uoStw5Drn0","OxWIHAgJHQ","BpYhVZuDtD","In3NSPYBf4","NhXdu5Mg9r","Pb1pauN6r3","SbRYyWMiS3","FcWrWtvdkD","lsQGoCqqaD",
+"JIqXiFnPFB","uupzk2Nslm","prNT6lCMxy","b29RJQ6Lix","8RCUAHzZT8","2NslmG1RhS","rz7UtFcWrW","GSQwjAmdQd","lXFOBt59lR","NAFuwFcWrW",
+"9rlg9G1RhS","Yw2oUBCxeC","9rlg9zY1GY","uupzkydG8U","b29RJ0YAGH","FLsphv8yFN","IRh48VerEA","rz7Utix74r","7fKYUQYxC0","YjB9tjeskS",
+"lj07Qh1zcH","FGzgpjeskS","WmadAD6rBy","Ta8f6zFgtB","9rlg9jfREu","YjB9t7fKYU","CNHmvuoStw","euZA58TxD7","ThjNnd7vjM","VerEAQWxoT",
+"faHirokgRi","hi5X7lCMxy","48cHLtlILt","pFrrldhSuH","RmDcrlm0pD","lH1kthe9IA","HRxd8CNHmv","8U2nUHzZT8","hYBCK0Kyfs","5Namm7lUXZ",
+"MaJQsQ6Lix","PYBf4RzaZA","ThjNnzQt6Q","brhlQUl4a1","9XyT9lm0pD","UlU3MaDGtS","8FmFH3otm6","XyPZNVprf2","WPmlxuupzk","atef2FPfSE",
+"U3yw5uvf7A","oGu6xS77LH","cShY2lm0pD","Ta8f6fLNg8","FLsphG1RhS","GSQwjmX2GE","vOqCEK4GS8","rhl0JogLgc","K4GS8OUYuF","iqv4kQworu",
+"EoToP24ARF","jiVBPMojnP","mz8gxtjQxs","euZA5v1Hln","Cp3mZBCxeC","6AFT0S77LH","uQIczuQIcz","nFqikuLtKs","9y4lwJXljW","taOXKEOE1o",
+"7fsYMCIShG","MojnPXflUq","h1zcHulk41","Chuy3jS1aj","hSSvQJkzUn","pv0i7ReKEW","64s8NGSQwj","W3VFH7Ow5C","yofH3Kr8ys","Zv7z0FjHXR",
+"NOHszFVMxo","HP433lpF6W","uvf7Adpe1v","CK5W7tlILt","4dEz6uLtKs","zz4ZUvLsmS","d7vjM14FLR","prNT6uZPqg","SjskQmz8gx","M3zXLuJScX",
+"580YDEoToP","tuDySzmLYD","qUJMdsoy9t","JKWYRprNT6","DcpWBPOUYS","Q6hMCFnPFB","2Yz7EVjCZq","fLNg8HRxd8","t98iWaDGtS","QssNCJIqXi",
+"8hJdtzmLYD","0YAGHyluBx","WmadAQYxC0","CK5W7BpYhV","8U2nUF6PT2","VLTy6h1zcH","v1HlnUl4a1","aDGtSlViBv","16lHcuAWyp","zqH0W2hEEU",
+"IBe8kUlU3M","X6PinCdyBV","pT8wu5Mg9r","prNT6zmLYD","vOqCEmz8gx","yluBx618Di","9y4lwlweGy","NAFuwhe9IA","s7MxkFFDui","FxX9qlCMxy",
+"5VZjSIjTwP","guMb8uvf7A","Yh1hFChuy3","2DREs3otm6","LDk6fv2eC3","580YDhi5X7","IjTwP9rlg9","prNT60Kyfs","5Drn0k85Ae","3otm6Y1mC0",
+"QClRLFjHXR","0Wr5yzqH0W","vOqCESs0Zu","BGaQYuvf7A","pvgjS0YAGH","Mkgy8Yh1hF","SmGzvwDajX","lm0pDtlILt","D6rByPOUYS","VjCZqSs0Zu",
+"lm0pD0MR5X","Z4I1v5iGN5","sx5GlOxWIH","55rfBfLNg8","IRh48zHF1q","t59lRdQ586","PYBf4Gv3Fq","DQimpciuWz","LbRTHxciqp","DLhzMFLsph",
+"FGzgp8RCUA","fcJOyCdyBV","GSQwjZv7z0","Cp3mZ45cIH","s93MlW3VFH","ThjNn6AFT0","WmadApv0i7","S2DfuRpBQm","uJScXCfgr3","S77LHuPX7G",
+"55rfB9GXkX","1j5L8VNCPd","zbIYYdhSuH","jtn0XQbxXc","LbRTHCdyBV","uTacxKr8ys","0PktI7X3uy","cQOnvhE1Ql","AmdQdL7cGc","AkKTkh1zcH",
+"zbIYY9XyT9","BGaQY0Wr5y","d85a9DcpWB","wDajXlViBv","DcpWBnnP8o","yvOMI580YD","VNCPdFFDui","W7cTsvOqCE","DcpWBEoToP","0MR5XD6rBy",
+"GXdoHO3iyQ","ix74rNhXdu","n1pmO5nmWv","W7cTsRsQUq","nlaByP6bcg","VIlwPKsjRK","jeskSZUnqt","0ao3loQ87r","S77LHFxX9q","BpYhVFFDui",
+"LDk6fuZPqg","TwanoXflUq","G1RhSQbxXc","ECMvU7fsYM","5VZjSyEfy9","rhl0Jhi5X7","s93MlQnJ1S","ulk41i7WMQ","StlDJU3yw5","jtn0XPOUYS",
+"Yw2oUFjHXR","2ZHdk0h1b1","d7vjMd85a9","iB08luoStw","I7p2al83Ud","IjTwPv2eC3","4W0Tllj07Q","vLsmStvdkD","ReKEW9XyT9","NOHszCxVEf",
+"Waim6he9IA","StlDJlpF6W","gIYvEi3pyd","Yw2oU5Namm","GSQwjuN6r3","IBe8k8FmFH","lXFOBiqv4k","BCxeCAXpwE","VNCPd64s8N","VNCPd5drc6",
+"580YDfmIK1","IRh48ni2v1","9y4lw5Namm","yluBxMkgy8","Kr8ysB3qem","NcICAulk41","2TRI7Yf2Ec","5Mg9rmz8gx","5iGN50ao3l","45cIHLbRTH",
+"MezSWXyPZN","NOHszfFDrJ","8FmFHWreyP","POUYSeuZA5","No0QboGu6x","suY4xhi5X7","SjskQuTacx","prNT6OUYuF","RkQkelXFOB","jS1ajuPX7G",
+"5IhmGoVQp6","U3yw5Waim6","ciuWzIRh48","JRJQB7Ow5C","lm0pD4QMc9","FPfSEUl4a1","7fsYMxReec","ZzJHWQworu","StlDJ5IhmG","uLtKsNOHsz",
+"7fsYM0BmCy","0MR5XFwEJz","MojnPCdyBV","fqypyWDVWJ","FjHXRyvOMI","blLA9VNCPd","tvdkDMkgy8","Z4I1vuvf7A","e6e4zGSQwj","jeskSECMvU",
+"EoToPuoStw","IRh485IhmG","GSQwjtaOXK","1j5L85IhmG","0BmCyRBhp0","CNHmvazIWp","soy9t7ku1p","LbRTHyofH3","sx5Gljtn0X","brhlQuupzk",
+"hE1QlL7cGc","VBjhzpmeCd","No0Qbi3pyd","h1zcHJXljW","AgJHQB3qem","ciuWzlpF6W","jiVBPUl4a1","azIWpNhXdu","HRxd8Dz1R3","XflUqVNCPd",
+"1LB1LECMvU","Yf2EcFwEJz","8TxD7NAFuw","ZhwG1QYxC0","7ku1p2Nslm","aez9ym4bxU","uTacxW7cTs","ulk41PYBf4","8hJdt45cIH","K4GS8m4bxU",
+"BpYhV580YD","MK07YMaJQs","uQIczQ6hMC","Waim6aDGtS","4W0Tl2DREs","14FLRKr8ys","pv0i7faHir","nnP8oyEfy9","5nmWv8cVD3","HRxd8uupzk",
+"fLNg8t98iW","uQIczFNYIM","t59lR2ZHdk","lCMxytjQxs","uupzk618Di","pT8wucmXIX","VLTy6J2mQi","AgJHQGXdoH","FnPFBlsQGo","BCxeCaez9y",
+"Ta8f65Drn0","Ss0ZuRkQke","cmXIXBpYhV","OUqFMiKqhr","ZhwG1blLA9","QnJ1SbZLvS","aDGtSQYxC0","AIYUutAOsr","GSQwjYf2Ec","AmdQdzz4ZU",
+"zmLYDfcJOy","gdQsSlweGy","DG4sTdQ586","nlaByy94nw","fcJOylsQGo","Mkgy8uN6r3","OUqFMSmGzv","blLA9FcWrW","t98iWazIWp","WmadAKsjRK",
+"4QMc9HP433","gIYvEUl4a1","7hyVvUlU3M","wiHrZuupzk","tlILtQworu","HfyNQmX2GE","MmKGJpv0i7","0MR5XWDVWJ","IKxdLFVMxo","oQ87rgdQsS",
+"QnJ1SW3VFH","pWiOsWreyP","5iGN5Fhtgl","lkMUAaez9y","KsjRKyofH3","OHaBzCNHmv","ReKEWaFFss","oGu6xFwEJz","StlDJ0h1b1","tAOsr9GXkX",
+"7ku1pi3pyd","CdyBV7fsYM","2NslmMm8si","nnP8olkMUA","Yw2oU0h1b1","0MR5X7fsYM","djsrvpiJSk","UmaEvuQIcz","oGu6xVprf2","8xEKzulk41",
+"gdQsS8U2nU","a00b5WPmlx","16lHc8FmFH","bgJAzdhSuH","xReecjS1aj","lXFOBYw2oU","Cfgr3KZamH","Kr8yscL0aE","a00b5WmadA","hUTw7KsjRK",
+"CqqaDYjB9t","3otm6SbRYy","55rfBGWqqX","UlU3Ms7Mxk","NAFuwlm0pD","8cVD3DQimp","fqypyoVQp6","MojnP580YD","MmKGJlkMUA","s4786suY4x",
+"07n1c7lUXZ","zHF1qJKWYR","BCxeCeuZA5","9iGoTOxWIH","VBjhzNcICA","S77LHRACuj","uQIczsoy9t","RmDcr7fsYM","K4GS8AOgEe","lkMUAQworu",
+"okgRiF6PT2","s4786t59lR","djsrv8cVD3","QnJ1Si7WMQ","4QMc9IBe8k","Uvlv4uAWyp","uupzkuN6r3","ksJbyG1RhS","8FmFHYw2oU","pvgjShYBCK",
+"TCgPphSSvQ","DQimpsqVrf","hE1QlJIqXi","HzZT8lsQGo","NAFuwCqqaD","PYBf4W7cTs","taOXK580YD","AXpwE1LB1L","Ta8f6prNT6","dpe1vSbRYy",
+"BFkb8O3iyQ","hSSvQHRxd8","hYBCKTXQ0Z","Ta8f616lHc","6q6L9D6rBy","1j5L8okgRi","29QAzM6qcG","Rxrsm8TxD7","DcpWBkB5nP","SWfouJJs5m",
+"Ss0ZuGSQwj","jfREukZANm","uJScXgIYvE","FnPFB2Yz7E","lweGycL0aE","5Namm8FmFH","ix74rsx5Gl","zY1GYFhtgl","FxX9qdmoS7","0ao3l618Di",
+"ogLgckZANm","Gv3FqBbwgA","HlUbFZuDtD","P6bcgxXTI4","BGaQYpT8wu","azIWpDcpWB","5nmWvD6rBy","8TxD7pT8wu","pv0i7WreyP","45cIHAXpwE",
+"cQOnvGrDg7","QClRLzHF1q","NcICAQWxoT","TwanoMkgy8","dhSuHzY1GY","pv0i7RmDcr","Vprf2tuDyS","GrDg7fLNg8","OxWIHVLTy6","tvdkD8RCUA",
+"2hEEUVNCPd","rz7Utulk41","AmdQd64s8N","FcWrW7lUXZ","K4GS814FLR","WDVWJd85a9","ydG8UM6qcG","azIWpJJs5m","No0QbG1RhS","TCgPpv2eC3",
+"IBe8kzY1GY","FwEJz8hJdt","oGu6xWMiS3","QssNCs4786","cL0aEcL0aE","azIWpWMiS3","fcJOyHlUbF","FnPFBDcpWB","ZUnqtFwEJz","SWfoufmIK1",
+"6AFT02Yz7E","iwzGk7lUXZ","ZzJHWFwEJz","7X3uyvkCHH","nlaByNhXdu","dmoS7GXdoH","AkKTks7Mxk","7hyVvWreyP","SbRYyYjB9t","lpF6Wfqypy",
+"0BmCyAkKTk","AOgEeFwEJz","dQ586pAhR1","5IhmGLbRTH","zQt6QvkCHH","zQt6QECMvU","uQIczMmsIo","hE1Qlulk41","ReKEWyofH3","LewvMMkgy8",
+"IjTwPuTacx","2DREs45cIH","9y4lwVLTy6","FFDuicShY2","KsjRKuoStw","x3LDefcJOy","24ARFFGzgp","FPfSEUmaEv","GrDg7AgJHQ","o8UydVNCPd",
+"rz7UtTa8f6","aez9ylCMxy","kZANmBbwgA","X6PinYw2oU","WPmlxDQimp","SjskQ0PktI","pAhR1ZhwG1","QYxC03weIF","2DREsLewvM","8xEKzAgJHQ",
+"3otm6ni2v1","Q6hMCfLNg8","nnP8o0Wr5y","qUJMd5drc6","DQimpb29RJ","XflUq64s8N","piJSkO3iyQ","RmDcri7WMQ","xciqpvOqCE","zY1GYZv7z0",
+"6AFT05IhmG","oQ87rQssNC","oQ87rOUYuF","uZPqgZhwG1","EdBKci7WMQ","RmDcrs93Ml","yToGWeuZA5","LbRTHnFqik","C2Irc0ao3l","uJScXKr8ys",
+"ECMvU8RCUA","9eoRczFgtB","cmXIXIKxdL","euZA5mX2GE","XyPZNlweGy","S2Dfuiqv4k","ZhwG1hUTw7","BFkb8Vprf2","jiVBPEOE1o","mz8gx45cIH",
+"suY4xW3VFH","2TRI7taOXK","Ta8f6GWqqX","7lUXZQnJ1S","uN6r3n8pJ9","OxWIHFVMxo","pWiOsSWfou","zQt6QIRh48","5iGN5WPmlx","pAhR17hyVv",
+"LewvMCdyBV","jzUqRZzJHW","d85a90YAGH","aez9ys4786","gjUTuMkgy8","PYBf4MmKGJ","tjQxsBCxeC","OxWIHLewvM","FFDuiI7p2a","3weIFFwEJz",
+"bZLvSaFFss","hYBCKa00b5","wiHrZFGzgp","brhlQmX2GE","oVQp6WMiS3","Waim6Chuy3","AmdQdW7cTs","Yf2EccShY2","C2IrcKsjRK","JJs5mS2Dfu",
+"uQIczNcICA","vkCHHni2v1","L7cGc2ZHdk","SbRYyzQt6Q","0PktItAOsr","NOHszZzJHW","iqv4kOHaBz","WPmlxS2Dfu","TwanoRpBQm","HlUbFs93Ml",
+"Cp3mZIKxdL","zqH0WNxx9V","8FmFHMezSW","K4GS84W0Tl","yEfy92hEEU","OHaBzUl4a1","zHF1qLbRTH","0h1b1G1RhS","QChxshYBCK","C2Irc5nmWv",
+"uvf7AaL6AJ","7fsYMQbxXc","M6qcGNOHsz","J2mQihe9IA","pmeCdIRh48","FwEJzSs0Zu","gf8rIv1Hln","XflUqQworu","C2IrcMmKGJ","GXdoHzQt6Q",
+"b29RJdmoS7","Oz8yZFjHXR","2hEEUrz7Ut","WMiS3DcpWB","uupzkMmsIo","2NslmVjCZq","iwzGkDG4sT","pFrrlOUqFM","Chuy3IBe8k","e6e4zjzUqR",
+"lCMxyEdBKc","fFDrJmX2GE","X6PinBFkb8","atef2DG4sT","5ZaEz5Namm","0YAGH1LB1L","SjskQ3weIF","Twanosoy9t","tuDySHzZT8","fqypyrz7Ut",
+"MojnPfcwDa","AgJHQuupzk","DQimpBpYhV","djsrvVLTy6","uoStwyofH3","X6PinlViBv","tvdkDFwEJz","ZJTXHAkKTk","a00b5nlaBy","IjTwPQ6hMC",
+"prNT65drc6","uJScX6AFT0","IKxdLs4786","DG4sTiqv4k","Mm8siaL6AJ","Cp3mZgIYvE","uupzkvkCHH","pAhR1KsjRK","vLsmSlXFOB","EOE1oG1RhS",
+"NAFuwJXljW","O3iyQ8hJdt","NhXduy94nw","Gv3Fqs7Mxk","okgRidQ586","vOqCEuvf7A","VNCPdBCxeC","Y1mC0FGzgp","7fKYU8TxD7","RACuj2TRI7",
+"RsQUqazIWp","8TxD7DQimp","pFrrlFPfSE","ThjNnXyPZN","oQ87rFnPFB","Mm8siOz8yZ","ZUnqtWreyP","brhlQ7ku1p","VjCZqxciqp","lj07QZUnqt",
+"n8pJ9dpe1v","NOHszNAFuw","brhlQpT8wu","vkCHHNcICA","WMiS3iwzGk","gjUTuUvlv4","v8yFNFNYIM","ThjNnECMvU","zY1GYogLgc","RkQke14FLR",
+"YjB9tMmsIo","No0Qbuvf7A","jSjS3Rxrsm","9y4lwuoStw","5NammhE1Ql","gtCA5VLTy6","pv0i7gdQsS","suY4xuLtKs","KASQ8JJs5m","9GXkX8FmFH",
+"jfREuThjNn","GrDg79y4lw","29QAz5iGN5","ZJTXHS77LH","BGaQY5VZjS","CqqaDm4bxU","ni2v1lj07Q","jiVBP2ZHdk","oQ87rZ4I1v","5Drn0Oz8yZ",
+"e6e4z9eoRc","0KyfsuAWyp","YjB9ti3pyd","CxVEf0MR5X","hi5X7qUJMd","RpBQmFGzgp","cQOnvFPfSE","azIWpbgJAz","24ARFF6PT2","X6PinjSjS3",
+"tuDySF6PT2","aDGtS7fKYU","KsjRKfaHir","yEfy9piJSk","NOHszPOUYS","YjB9tksJby","M6qcGjeskS","LewvMlCMxy","JKWYRzbIYY","LbRTH9GXkX",
+"6AFT045cIH","4QMc96AFT0","uJScXb29RJ","JRJQBZhwG1","Waim6nFqik","h1zcH5Drn0","In3NSVIlwP","POUYSPb1pa","ogLgcHfyNQ","SWfouXyPZN",
+"FLsphBCxeC","JXljWdhSuH","zz4ZUlj07Q","pmeCdMkgy8","LDk6fQbxXc","24ARF2ZHdk","QClRLX6Pin","Z4I1vNOHsz","IRh48hYBCK","4W0TlECMvU",
+"cQOnvPb1pa","KZamHK4GS8","aez9yOUqFM","FnPFBdhSuH","m4bxUWPmlx","uupzkWmadA","GrDg7MojnP","dmoS72TRI7","HlUbFYjB9t","9y4lwvkCHH",
+"Ss0ZuKr8ys","jtn0X0ao3l","CdyBVOUqFM","TwanoRACuj","t98iWtl72W","uZPqgpvgjS","Kr8ysOxWIH","07n1cZuDtD","Kr8ysMm8si","xReecMK07Y",
+"aez9yjiVBP","AgJHQ5Drn0","t59lRWPmlx","CIShG16lHc","FNYIMqQxHP","uN6r3CqqaD","rhl0JO3iyQ","iwzGkhe9IA","soy9t8TxD7","fFDrJWmadA",
+"k85AeFFDui","lXFOBfLNg8","9GXkXPb1pa","8cVD33weIF","8RCUAaez9y","GrDg7qaofN","FjHXRFhtgl","kZANmlViBv","zFgtBru4UG","RpBQmgf8rI",
+"ni2v15iGN5","VIlwPChuy3","IBe8ksoy9t","RpBQm2ZHdk","Gv3Fqaez9y","8cVD314FLR","y94nwZv7z0","0ao3lUmaEv","QWxoTjeskS","pWiOsFjHXR",
+"JXljWlCMxy","yToGW07n1c","55rfB9XyT9","SbRYyZuDtD","BFkb8YOfrY","gIYvECdyBV","CxVEfM6qcG","brhlQfqypy","i7WMQYh1hF","hUTw75IhmG",
+"s47867ku1p","e6e4zpv0i7","k85AeOUqFM","45cIHfcwDa","yEfy9bgJAz","x3LDeIKxdL","NOHszlXFOB","M3zXLcQOnv","HP433o8Uyd","hE1QlRpBQm",
+"KASQ8gdQsS","kB5nPNOHsz","HP433FNYIM","GXdoHSs0Zu","taOXKGrDg7","iqv4koGu6x","v8yFNPYBf4","OUYuFZzJHW","FFDuiPYBf4","d85a9guMb8",
+"0MR5XQChxs","kZANmt98iW","StlDJiqv4k","guMb8djsrv","D6rByydG8U","NcICAuJScX","ZhwG1zHF1q","iB08lECMvU","MojnPRzaZA","d85a9xciqp",
+"hYBCKQWxoT","5IhmGpmeCd","WreyPMmKGJ","nFqikBbwgA","xXTI4FGzgp","FhtglYf2Ec","Kr8ysVLTy6","FFDuiUmaEv","CxVEfiqv4k","OHaBz4W0Tl",
+"QYxC0Z4I1v","EdBKc4QMc9","lweGyCdyBV","brhlQgjUTu","5VZjSs93Ml","uJScXC2Irc","gf8rI0h1b1","zY1GYWmadA","Cfgr3No0Qb","POUYS5ZaEz",
+"v2eC3uoStw","M3zXLsqVrf","cQOnvyvOMI","FGzgpI7p2a","AOgEeUlU3M","pT8wuwiHrZ","jiVBPa00b5","RsQUqcShY2","5Mg9rDz1R3","qaofN1LB1L",
+"qaofNn8pJ9","y94nwWMiS3","oGu6xAmdQd","CxVEfxciqp","6q6L9QChxs","FNYIMMK07Y","29QAz7Ow5C","TXQ0ZTCgPp","zqH0WgjUTu","zQt6QHlUbF",
+"lpF6WDz1R3","cQOnvIBe8k","Qworul83Ud","DcpWBjeskS","xReecWmadA","cShY264s8N","IBe8k24ARF","IjTwPlsQGo","3otm6POUYS","yEfy91j5L8",
+"dpe1vZ4I1v","HzZT8P6bcg","Cfgr3Mkgy8","faHirjiVBP","FcWrWU3yw5","rKDLJiB08l","zz4ZUjSjS3","zQt6QHfyNQ","taOXKoQ87r","mz8gxd7vjM",
+"he9IAOUYuF","0MR5XAmdQd","rhl0J0ao3l","MmKGJ2Yz7E","pAhR1CxVEf","h1zcHhE1Ql","NAFuwPOUYS","2ZHdkpWiOs","P6bcgi7WMQ","brhlQFhtgl",
+"2hEEUguMb8","2hEEU5IhmG","hSSvQQWxoT","8hJdtd85a9","WPmlxqQxHP","Oz8yZIn3NS","ydG8UpmeCd","sqVrfs4786","FxX9qQYxC0","Fhtgl48cHL",
+"RmDcr618Di","SjskQ14FLR","FNYIM24ARF","Zv7z0d7vjM","lkMUAsoy9t","NhXdugjUTu","rz7UtaL6AJ","tjQxs64s8N","v1HlnfmIK1","JkzUnv8yFN",
+"P6bcgxciqp","8hJdtTXQ0Z","Yf2EcmX2GE","nnP8oQWxoT","nlaByoGu6x","aDGtS1v5hH","GWqqXuN6r3","SmGzv2TRI7","lpF6WlpF6W","gtCA51v5hH",
+"5Drn0tAOsr","nnP8o1LB1L","POUYS5Mg9r","HfyNQHfyNQ","fFDrJgtCA5","FcWrWrz7Ut","yEfy9QssNC","JXljWRmDcr","rKDLJ6q6L9","jfREuQYxC0",
+"OUqFMatef2","jiVBPhYBCK","uJScXyvOMI","tjQxsBpYhV","2Yz7E55rfB","AOgEeQClRL","7X3uyLewvM","ZhwG1QnJ1S","8U2nUAkKTk","uvf7AOz8yZ",
+"KZamHeuZA5","5Namm5nmWv","fqypy2ZHdk","lH1ktRACuj","blLA9qQxHP","a00b5gjUTu","ogLgcfaHir","iKqhrm4bxU","FVMxoWreyP","GXdoHUlU3M",
+"9y4lw0Wr5y","Nxx9VpFrrl","EoToPs93Ml","soy9t6AFT0","Waim6QnJ1S","faHirpv0i7","XyPZNhE1Ql","t59lRsoy9t","07n1cAXpwE","pT8wuuTacx",
+"0MR5XtlILt","uoStwRpBQm","lViBvHP433","hi5X7IKxdL","ZuDtDs4786","iqv4kWreyP","n8pJ9FxX9q","9eoRcn1pmO","1v5hHAIYUu","gf8rIzY1GY",
+"RACujiqv4k","JXljWEoToP","BpYhVaL6AJ","HzZT8x3LDe","cQOnvi7WMQ","xXTI4CxVEf","zbIYYjS1aj","pAhR1rhl0J","ZhwG1yluBx","Cfgr3bgJAz",
+"ogLgclkMUA","Kr8ysvOqCE","dhSuHMmsIo","lj07Qpv0i7","t98iW4dEz6","Zv7z0jfREu","MezSW2DREs","IRh48h1zcH","FNYIMbgJAz","4dEz6CK5W7",
+"P6bcgYf2Ec","07n1caez9y","9XyT9fqypy","8xEKzKASQ8","CK5W7s4786","x3LDeOz8yZ","BCxeC3otm6","cmXIXJRJQB","dhSuHCqqaD","pv0i7wiHrZ",
+"VerEAY1mC0","QnJ1SxXTI4","Y1mC0RzaZA","iB08lMezSW","Ul4a1VLTy6","RpBQm48cHL","VNCPd7fsYM","2Yz7EXyPZN","LbRTHdhSuH","b29RJM3zXL",
+"djsrvBCxeC","zHF1qFjHXR","7lUXZsoy9t","StlDJFjHXR","BCxeC0PktI","P6bcgRzaZA","CxVEfDcpWB","HfyNQQYxC0","euZA5Fhtgl","No0QbVjCZq",
+"pmeCd8TxD7","JKWYRLbRTH","b29RJuoStw","Dz1R3uTacx","yToGWUvlv4","AmdQdokgRi","Gv3FqXflUq","RsQUquTacx","7Ow5C8FmFH","MmKGJMezSW",
+"Cp3mZiB08l","kZANm45cIH","Gv3FqPYBf4","S2DfuJIqXi","iqv4kM6qcG","DQimp0ao3l","lsQGoTXQ0Z","EoToPS2Dfu","9GXkXMkgy8","OxWIH0Kyfs",
+"ulk419eoRc","7fKYUYf2Ec","QssNCwiHrZ","FhtglAOgEe","3otm65VZjS","BCxeCEoToP","ksJbyNhXdu","piJSkYh1hF","VLTy6zz4ZU","LbRTHDz1R3",
+"okgRilViBv","vkCHH5Namm","RBhp0WreyP","gf8rICfgr3","v8yFNMm8si","9y4lw14FLR","lkMUAzmLYD","4dEz6HP433","nlaByzqH0W","8cVD3SWfou",
+"hE1Ql2hEEU","k85Ae0YAGH","y94nwzQt6Q","v1HlnlsQGo","7X3uyFPfSE","gf8rI2hEEU","pv0i79rlg9","okgRi2hEEU","pv0i7IjTwP","wiHrZfqypy",
+"fFDrJ29QAz","kB5nP6q6L9","lweGyMkgy8","cL0aEQWxoT","VBjhzsx5Gl","AOgEesqVrf","9XyT9RkQke","U3yw5EOE1o","ZJTXH5nmWv","lweGysuY4x",
+"RpBQmFFDui","wiHrZQYxC0","In3NSTCgPp","9GXkX618Di","DQimpiqv4k","rKDLJ29QAz","FjHXRiqv4k","JkzUnO3iyQ","07n1cWDVWJ","8FmFHs4786",
+"QssNCsoy9t","14FLRFGzgp","FFDui580YD","IKxdLUl4a1","0PktIOUqFM","uPX7GK4GS8","K20wKbrhlQ","x3LDegjUTu","XflUqMK07Y","fcwDab29RJ",
+"U3yw50ao3l","soy9tkB5nP","CIShGJ2mQi","DG4sT8RCUA","bZLvS0ao3l","PYBf4FFDui","0KyfsSs0Zu","MmsIo1LB1L","5IhmG9rlg9","Fhtglh1zcH",
+"Kr8ysuJScX","t59lRMojnP","v1HlnazIWp","VerEAulk41","618DiMojnP","Zv7z0qUJMd","pT8wupvgjS","azIWpgIYvE","I7p2aSjskQ","KZamHiB08l",
+"DcpWB9GXkX","WaWsvGWqqX","brhlQ7fKYU","M6qcGzHF1q","Gv3FqB3qem","55rfBTa8f6","G1RhSd7vjM","GXdoH3otm6","BpYhV8hJdt","okgRiBCxeC",
+"7ku1pazIWp","gdQsSv1Hln","SjskQlkMUA","QbxXcs7Mxk","VBjhzIKxdL","ciuWzix74r","HzZT8sx5Gl","sx5GlyEfy9","nFqikk85Ae","GSQwjzqH0W",
+"GrDg7zmLYD","rz7UtWaim6","Yh1hFyvOMI","MezSWkB5nP","hSSvQtaOXK","JJs5mQbxXc","FLsphgtCA5","XyPZNECMvU","LbRTHjzUqR","2Yz7EzY1GY",
+"zmLYDX6Pin","uJScXfqypy","uN6r3XyPZN","uZPqgokgRi","48cHLsx5Gl","Yh1hFzHF1q","Vprf26q6L9","zbIYYxXTI4","BbwgAIRh48","fcwDaatef2",
+"s93MltjQxs","VLTy6QnJ1S","dhSuHcShY2","JRJQBYf2Ec","M6qcGJkzUn","gdQsSfqypy","GSQwjQChxs","Ss0ZunnP8o","pv0i7lCMxy","7X3uyMezSW",
+"BpYhVGSQwj","vkCHHJIqXi","YjB9tfcJOy","JXljW55rfB","v1Hlnuvf7A","o8UydRzaZA","gtCA52TRI7","SWfoucL0aE","QnJ1SHlUbF","MmKGJk85Ae",
+"v2eC3XflUq","CdyBVVerEA","5IhmGZv7z0","GWqqX64s8N","U3yw5n1pmO","QChxsPb1pa","Oz8yZogLgc","No0QblXFOB","ZhwG1ulk41","Mm8si9iGoT",
+"jS1ajjzUqR","MojnPIKxdL","mz8gxpvgjS","SWfoum4bxU","RBhp0LDk6f","JXljWl83Ud","IKxdL16lHc","n8pJ9IRh48","EdBKc8TxD7","AgJHQ1v5hH",
+"7Ow5ClkMUA","ECMvUv2eC3","U3yw5VLTy6","9eoRcfFDrJ","QnJ1Sd7vjM","Gv3FqTCgPp","7fsYMFNYIM","WMiS3ciuWz","0ao3lAIYUu","7ku1pjS1aj",
+"uLtKsblLA9","s93MlFhtgl","F6PT20MR5X","hi5X77Ow5C","GXdoHtuDyS","e6e4zdpe1v","5IhmGni2v1","ulk41uN6r3","Mm8siEoToP","1LB1L618Di",
+"MK07YpT8wu","EOE1oiwzGk","yToGW2ZHdk","KZamHnnP8o","Mm8siguMb8","BFkb8FjHXR","SWfouBbwgA","jfREuBGaQY","y94nwYOfrY","vOqCEuLtKs",
+"3otm6Mm8si","OUqFMpFrrl","Waim6lsQGo","Z4I1vCNHmv","rKDLJWPmlx","WaWsvrhl0J","jzUqRpv0i7","U3yw5MGlTF","DQimpMmKGJ","jSjS30Kyfs",
+"kZANmfcJOy","hi5X7F6PT2","pv0i7IKxdL","CNHmvS77LH","lm0pDAgJHQ","rz7UtdmoS7","n1pmOfLNg8","xReecFnPFB","5drc6CK5W7","AIYUuNhXdu",
+"v2eC3v1Hln","BCxeCFnPFB","IRh48Uvlv4","xXTI4zY1GY","pFrrlStlDJ","WPmlxUvlv4","FcWrWQworu","hi5X71v5hH","dpe1vuvf7A","W7cTsVerEA",
+"OHaBzdQ586","hUTw7nlaBy","ECMvUMGlTF","Yw2oUlViBv","ogLgctuDyS","oGu6xv1Hln","SbRYylm0pD","dQ586Rxrsm","5Mg9rfaHir","Waim6lpF6W",
+"tvdkDVerEA","IjTwP45cIH","QssNCYf2Ec","dQ586blLA9","cQOnv0YAGH","OUYuFAgJHQ","QbxXcx3LDe","Ta8f68TxD7","n1pmOaFFss","cShY2AXpwE",
+"3weIFl83Ud","uTacxYOfrY","QClRLs7Mxk","KsjRKuZPqg","45cIHpWiOs","FcWrWRACuj","piJSkMojnP","F6PT2jSjS3","IBe8kfqypy","L7cGcaDGtS",
+"o8UydZUnqt","RkQkelH1kt","8xEKzrKDLJ","J2mQi7lUXZ","DLhzMydG8U","zz4ZUyvOMI","0Kyfs618Di","Y1mC0HzZT8","zbIYYAIYUu","ThjNnMezSW",
+"5nmWvQClRL","zHF1q1v5hH","l83UdB3qem","tlILtt59lR","lXFOB45cIH","Waim6No0Qb","EdBKcFGzgp","jeskSm4bxU","1j5L8zqH0W","k85AeS2Dfu",
+"hE1QlD6rBy","5IhmGFhtgl","0MR5XVIlwP","uQIcz2TRI7","618DipmeCd","KZamHCqqaD","SmGzvqQxHP","9y4lwTa8f6","ZJTXHFLsph","9XyT9uQIcz",
+"O3iyQ55rfB","EoToPtlILt","VjCZqCqqaD","ru4UGAIYUu","YOfrY5Drn0","JKWYRhSSvQ","aez9yYf2Ec","x3LDeuAWyp","uvf7ARpBQm","yvOMIECMvU",
+"fmIK1zHF1q","Zv7z0s93Ml","Vprf2ZuDtD","9eoRcjSjS3","8RCUA9eoRc","3otm6HRxd8","UlU3MCxVEf","EdBKcprNT6","Waim6Rxrsm","ZzJHW9iGoT",
+"t98iWlH1kt","ciuWzm4bxU","l83UdCqqaD","gIYvEyvOMI","L7cGcVBjhz","L7cGcZJTXH","FNYIMlXFOB","07n1cjSjS3","YjB9tVNCPd","5drc6EOE1o",
+"he9IAazIWp","VerEAtjQxs","9XyT9hE1Ql","IBe8ks4786","uQIcz580YD","qaofNDcpWB","NcICADQimp","blLA9cShY2","Kr8ysWMiS3","0BmCyiKqhr",
+"dmoS7qaofN","14FLR2DREs","gtCA5TCgPp","jzUqRuLtKs","aL6AJhYBCK","n8pJ9PYBf4","WaWsvCqqaD","GXdoHRzaZA","fLNg8VBjhz","n8pJ9Nxx9V",
+"2TRI7FcWrW","POUYSvOqCE","uQIczlsQGo","Chuy3Yh1hF","iwzGkFjHXR","wiHrZ5Drn0","iB08lHzZT8","CK5W7J2mQi","JXljWPOUYS","B3qemChuy3",
+"tvdkDVprf2","gtCA5AXpwE","Ss0ZuFcWrW","iqv4kMmsIo","DQimpVerEA","oVQp69eoRc","Q6LixNAFuw","M6qcGfaHir","Dz1R3fcJOy","aFFssWDVWJ",
+"1v5hHtlILt","xciqp8FmFH","zY1GYI7p2a","RsQUqFNYIM","gf8rI5iGN5","U3yw51v5hH","hUTw7uZPqg","MK07YEoToP","dmoS7uPX7G","taOXKn1pmO",
+"yToGWNo0Qb","EdBKcm4bxU","DcpWB29QAz","AIYUuCK5W7","HRxd83otm6","lj07QyluBx","fcwDazQt6Q","QYxC02Nslm","MmKGJ580YD","WreyP580YD",
+"dQ586Nxx9V","9eoRcdmoS7","yvOMIy94nw","lCMxyYf2Ec","Uvlv4CNHmv","ZJTXHVerEA","G1RhS7lUXZ","64s8NfcJOy","0h1b15IhmG","OHaBzsoy9t",
+"oGu6x8RCUA","2TRI7Mm8si","tAOsrvLsmS","VNCPd2Yz7E","RxrsmazIWp","YOfrYEOE1o","QClRLIn3NS","pmeCd0Kyfs","n8pJ9GrDg7","v2eC3hYBCK",
+"ksJbyYjB9t","FGzgpDG4sT","JXljWhE1Ql","faHirfaHir","I7p2a0MR5X","XflUqO3iyQ","4QMc9VBjhz","dpe1vlkMUA","dpe1vVerEA","8U2nUGv3Fq",
+"3weIFEdBKc","580YDU3yw5","ydG8URBhp0","zz4ZU5nmWv","ru4UGU3yw5","zmLYD5nmWv","qUJMdzz4ZU","LDk6fM3zXL","dmoS7djsrv","jtn0XFxX9q",
+"WDVWJxciqp","HfyNQJXljW","RsQUqQ6Lix","ksJbypWiOs","VerEAKr8ys","UlU3MbgJAz","4dEz6EOE1o","FxX9qVerEA","sqVrfaDGtS","fqypyMmKGJ",
+"0KyfsG1RhS","8FmFHyluBx","t98iWfFDrJ","580YDvOqCE","xReecdmoS7","ru4UGuQIcz","qQxHP2hEEU","GXdoH2Yz7E","faHirY1mC0","MmsIodhSuH",
+"FVMxojzUqR","MmKGJYh1hF","RxrsmCIShG","QWxoTzbIYY","yvOMIaDGtS","FVMxo16lHc","m4bxUhYBCK","PYBf4LewvM","0KyfshUTw7","Yw2oUvLsmS",
+"Z4I1vHlUbF","Yw2oUnFqik","Ta8f6yofH3","RACujiB08l","BFkb8HRxd8","9eoRcru4UG","lViBvlsQGo","MmsIoatef2","07n1c2Nslm","FVMxoZhwG1",
+"ksJby55rfB","mX2GEciuWz","oGu6xQssNC","RsQUqHzZT8","xciqpUl4a1","pAhR1Qworu","LDk6fRmDcr","cShY27ku1p","l83UdNhXdu","EOE1oIn3NS",
+"QbxXclViBv","Yw2oU9iGoT","xXTI4s93Ml","0PktIlViBv","Yh1hFMm8si","NhXduzQt6Q","DG4sTblLA9","DQimpxReec","BCxeCv1Hln","P6bcgWmadA",
+"In3NSuPX7G","7Ow5C0YAGH","7ku1p4QMc9","cL0aEVprf2","gjUTublLA9","prNT6HzZT8","gtCA5bZLvS","sx5GlMm8si","i3pyduoStw","ru4UGRACuj",
+"7ku1pVjCZq","QbxXczFgtB","BbwgANAFuw","v2eC3VLTy6","prNT6pWiOs","MK07YO3iyQ","9y4lwIKxdL","VNCPdd7vjM","JRJQBnlaBy","ReKEWyToGW",
+"jeskSQYxC0","F6PT2okgRi","dpe1vdQ586","l83Ud0Wr5y","v2eC3QbxXc","aL6AJcL0aE","AOgEeXflUq","tAOsrtaOXK","DcpWBCdyBV","5drc6S2Dfu",
+"yofH3PYBf4","euZA58U2nU","pvgjSjfREu","brhlQd7vjM","a00b5F6PT2","RxrsmAmdQd","0MR5Xe6e4z","jS1ajzz4ZU","lm0pDlViBv","rz7Ut45cIH",
+"NAFuwn1pmO","xXTI4gf8rI","29QAzHP433","NOHszgjUTu","JKWYRDG4sT","uLtKsTXQ0Z","dmoS7VjCZq","PYBf4GSQwj","4QMc9lViBv","5IhmGaL6AJ",
+"Kr8ys2ZHdk","nnP8oWaim6","lm0pDgf8rI","iwzGkSjskQ","B3qemMmKGJ","CxVEfAXpwE","JXljWuZPqg","EdBKcMm8si","QssNCCK5W7","lH1ktS2Dfu",
+"9XyT9FGzgp","aL6AJNxx9V","MojnPIBe8k","HRxd8Yh1hF","LewvMP6bcg","he9IAcL0aE","9XyT9ZuDtD","C2IrcCIShG","5Drn0RpBQm","jiVBPzqH0W",
+"C2IrcMm8si","WaWsvRzaZA","hUTw7BpYhV","pv0i7bgJAz","VBjhzMkgy8","J2mQiazIWp","G1RhSFxX9q","M6qcGOxWIH","zbIYYXflUq","GXdoHAXpwE",
+"zQt6Qmz8gx","4QMc9yvOMI","JIqXiHRxd8","DG4sTHzZT8","CxVEfFNYIM","DG4sTJKWYR","TCgPpZzJHW","Mm8siYjB9t","kZANmS77LH","LbRTH55rfB",
+"No0Qb24ARF","0ao3l0PktI","bgJAzZ4I1v","0KyfsSjskQ","5IhmGyvOMI","VLTy65VZjS","UmaEv5Mg9r","Ul4a1Z4I1v","OHaBzhi5X7","JJs5myofH3",
+"okgRicQOnv","VjCZqLbRTH","2Nslmrhl0J","WmadAzFgtB","4W0Tlhi5X7","l83Ud07n1c","zmLYDTwano","4QMc98xEKz","GrDg7s7Mxk","wiHrZZUnqt",
+"gtCA5lm0pD","sqVrfK4GS8","Zv7z09rlg9","XflUqrhl0J","Nxx9VfcJOy","7ku1pVerEA","fLNg8lpF6W","pFrrlXflUq","aez9yUmaEv","LewvMVBjhz",
+"oQ87rC2Irc","StlDJJJs5m","bZLvSDcpWB","qaofNThjNn","16lHcvkCHH","xReecpAhR1","ru4UGI7p2a","9eoRcnlaBy","IRh489XyT9","6AFT0RpBQm",
+"ZJTXHNhXdu","Mm8siFGzgp","7X3uyuPX7G","iwzGknlaBy","14FLRZUnqt","bgJAzS2Dfu","5iGN5djsrv","ZuDtDpWiOs","uJScXfaHir","WPmlxOxWIH",
+"FjHXRVjCZq","BpYhVU3yw5","AIYUulViBv","tuDySECMvU","uAWypjiVBP","zQt6QVprf2","YOfrYCxVEf","Kr8ys7Ow5C","In3NSThjNn","8RCUAv1Hln",
+"3otm6IRh48","dhSuHzFgtB","P6bcgUmaEv","taOXKCxVEf","GWqqXI7p2a","yluBxwiHrZ","MaJQsHzZT8","xReectjQxs","oGu6x9rlg9","5iGN5Rxrsm",
+"9GXkX16lHc","QworudhSuH","AXpwE6q6L9","gIYvEuTacx","29QAzXyPZN","JRJQBNo0Qb","I7p2auN6r3","cmXIXxciqp","SWfou7fsYM","dQ5867hyVv",
+"nlaByOz8yZ","9eoRclkMUA","s4786WPmlx","t98iWaez9y","zqH0W3weIF","rhl0JCfgr3","EoToPydG8U","Chuy3lweGy","0YAGHdQ586","RxrsmhUTw7",
+"lkMUADG4sT","9XyT9uoStw","NcICANxx9V","o8Uyd4dEz6","WMiS3vLsmS","taOXKBbwgA","Nxx9ViwzGk","hYBCK8RCUA","rhl0JFxX9q","OxWIHHzZT8",
+"ulk41mz8gx","jfREuK20wK","9iGoTVjCZq","UmaEvdpe1v","ReKEWkZANm","iKqhrJ2mQi","gf8rIZv7z0","iwzGks4786","RACujwiHrZ","uvf7A8FmFH",
+"ydG8UtuDyS","0MR5XuLtKs","hSSvQm4bxU","OUYuFyofH3","EOE1oIKxdL","WaWsvogLgc","pWiOsM3zXL","rhl0JtaOXK","lpF6WdhSuH","GXdoHlCMxy",
+"jSjS3GSQwj","TCgPpe6e4z","EOE1odQ586","7fsYM7hyVv","gjUTuNhXdu","wDajXbgJAz","618DiCfgr3","i7WMQo8Uyd","HzZT8BCxeC","BCxeC7fsYM",
+"QworuiKqhr","M6qcGuupzk","Q6hMC5nmWv","8TxD7ZUnqt","DQimphYBCK","a00b5blLA9","24ARFvkCHH","SmGzvnlaBy","Q6hMClpF6W","Cp3mZprNT6",
+"s4786pv0i7","uTacxVBjhz","HP433mX2GE","yvOMIYh1hF","wiHrZi7WMQ","XflUq1j5L8","i3pydMezSW","hi5X77lUXZ","CNHmvZv7z0","pmeCdjzUqR",
+"QworuCIShG","bZLvSVprf2","dhSuHG1RhS","UlU3MIKxdL","C2IrczbIYY","Yw2oUjSjS3","AIYUulH1kt","euZA5n8pJ9","O3iyQQYxC0","L7cGcDcpWB",
+"In3NSjiVBP","EdBKculk41","he9IAUlU3M","F6PT2AkKTk","Vprf27lUXZ","Ss0Zulj07Q","IRh48Yw2oU","nFqikP6bcg","QnJ1SRkQke","In3NSZUnqt",
+"0KyfsK4GS8","uQIczoGu6x","pv0i7SjskQ","FVMxoEOE1o","In3NS5Namm","1j5L8kZANm","Y1mC01LB1L","KASQ8IRh48","6q6L9ksJby","l83UdSjskQ",
+"s93MlguMb8","QworuMojnP","cShY2uPX7G","JRJQBoGu6x","fFDrJ5Mg9r","QChxsZv7z0","BpYhVwiHrZ","SmGzvpFrrl","ru4UGoQ87r","RsQUq55rfB",
+"jeskS5Mg9r","RACujVIlwP","Yh1hFcQOnv","DQimpYw2oU","iKqhrazIWp","pFrrl4QMc9","ZhwG1dpe1v","kZANmJkzUn","zHF1q8TxD7","rhl0JFnPFB",
+"StlDJ7lUXZ","blLA9n8pJ9","yToGWuupzk","S77LHECMvU","lsQGoaDGtS","Yw2oU0Kyfs","zqH0WzmLYD","AXpwEtlILt","qaofNfLNg8","dmoS7Cfgr3",
+"G1RhSFnPFB","ThjNn0Kyfs","a00b50YAGH","jzUqRs93Ml","iB08lm4bxU","AXpwE7fKYU","MojnP45cIH","djsrvfaHir","1LB1L4dEz6","aFFssfLNg8",
+"29QAz7hyVv","bgJAzZv7z0","SbRYyrz7Ut","M3zXL07n1c","LbRTH2ZHdk","QssNCdQ586","oVQp6NAFuw","CqqaDChuy3","n1pmOC2Irc","s4786fqypy",
+"wDajXhYBCK","8FmFHTCgPp","zbIYYBFkb8","ulk41Kr8ys","Nxx9V55rfB","580YDsx5Gl","G1RhS8FmFH","0KyfsFNYIM","9eoRcbgJAz","zbIYYRzaZA",
+"Dz1R31j5L8","Yf2EcBbwgA","qUJMd7fKYU","faHir0h1b1","AIYUuVLTy6","Ss0Zu8hJdt","Yf2EcWreyP","fLNg80BmCy","LbRTHzmLYD","OUqFMKsjRK",
+"ksJbyBCxeC","s7Mxk29QAz","UlU3M7fKYU","G1RhS7ku1p","tvdkDQ6hMC","GWqqXCIShG","AOgEeRzaZA","C2IrcOz8yZ","4dEz6HlUbF","BCxeCMezSW",
+"vLsmSdpe1v","YjB9t4QMc9","9y4lwyofH3","ulk41jeskS","XflUqWMiS3","pT8wuECMvU","Mkgy8uLtKs","NOHszIn3NS","dQ586GrDg7","wiHrZM3zXL",
+"xciqpEdBKc","RBhp0pvgjS","X6PinPYBf4","0Wr5yGv3Fq","Ul4a1hYBCK","W7cTs0PktI","taOXKMmsIo","Cp3mZlweGy","b29RJNxx9V","NcICAhe9IA",
+"5Mg9rBCxeC","ReKEWIjTwP","Mkgy8iwzGk","IKxdL0MR5X","UmaEvxReec","Chuy3kZANm","Z4I1vGXdoH","YOfrYrKDLJ","NOHszBCxeC","uupzkThjNn",
+"okgRiprNT6","v2eC3blLA9","RACuj8xEKz","ZzJHW9XyT9","24ARFNhXdu","XyPZNPYBf4","Fhtgluvf7A","AXpwEyluBx","qaofNP6bcg","AIYUukZANm",
+"M6qcGO3iyQ","9eoRcB3qem","jfREuVBjhz","SmGzvhUTw7","MezSWix74r","QssNCVerEA","2TRI7tvdkD","24ARFZhwG1","blLA9vkCHH","Yw2oUPb1pa",
+"y94nw5Drn0","bZLvSrz7Ut","OHaBz2TRI7","07n1cDQimp","IRh48Cfgr3","G1RhSJIqXi","KASQ8O3iyQ","KASQ8W7cTs","pmeCdQworu","Nxx9VIn3NS",
+"fLNg87Ow5C","CIShGSjskQ","zY1GYUvlv4","Nxx9Vru4UG","ZuDtDwiHrZ","TCgPpi3pyd","29QAzI7p2a","0Wr5ygtCA5","zQt6QSbRYy","k85AenFqik",
+"cmXIXWPmlx","bZLvSPYBf4","Gv3Fq8cVD3","IjTwPS77LH","9iGoTsuY4x","8RCUAWPmlx","Uvlv4ReKEW","FnPFBWPmlx","GSQwj8FmFH","AmdQdjfREu",
+"b29RJs93Ml","ZzJHWIn3NS","3otm6DQimp","uLtKsNAFuw","lm0pDPb1pa","D6rByulk41","sqVrfCdyBV","POUYSrKDLJ","0h1b1WDVWJ","MaJQs9rlg9",
+"yToGWsuY4x","yofH3fqypy","zqH0Wb29RJ","s4786jSjS3","ciuWzQYxC0","yToGWMezSW","GXdoHvkCHH","pAhR1IRh48","OHaBz5Mg9r","RmDcrxciqp",
+"lm0pDuQIcz","48cHLqUJMd","oQ87rThjNn","MaJQsh1zcH","rz7UtfmIK1","TXQ0Z45cIH","OxWIHWDVWJ","IjTwPZJTXH","RxrsmKsjRK","FjHXR0h1b1",
+"Yf2EcMojnP","Q6LixokgRi","t98iWX6Pin","pT8wuDQimp","MojnPlViBv","7X3uy0BmCy","jzUqRlXFOB","t59lRuAWyp","O3iyQiKqhr","ydG8UWDVWJ",
+"SbRYy7hyVv","lj07QK20wK","5ZaEzGrDg7","lj07QZ4I1v","AmdQdjS1aj","NhXdu0BmCy","Nxx9VWmadA","8U2nUYf2Ec","MezSWS2Dfu","l83Ud9iGoT",
+"xciqpZv7z0","lkMUAt98iW","dQ5868hJdt","AmdQdix74r","rhl0JRkQke","BpYhVGWqqX","S77LHMmKGJ","iqv4kCfgr3","y94nwK4GS8","FnPFBTwano",
+"zz4ZUQbxXc","Ss0ZuJKWYR","4W0Tl8FmFH","0YAGHMezSW","he9IA6q6L9","soy9tNhXdu","FGzgpxXTI4","gdQsSlpF6W","5IhmG0BmCy","G1RhSCp3mZ",
+"tAOsryluBx","zmLYDJKWYR","MmKGJFcWrW","Mm8siCqqaD","J2mQiW7cTs","BpYhV14FLR","tAOsrguMb8","nnP8on8pJ9","NcICAThjNn","oQ87rGWqqX",
+"FGzgpqQxHP","3weIFzHF1q","K4GS8S2Dfu","Gv3Fqmz8gx","lweGyzqH0W","0KyfsStlDJ","8U2nUgf8rI","gtCA5hi5X7","nFqikQWxoT","7fKYU14FLR",
+"yEfy9uoStw","8U2nUPOUYS","pWiOsFxX9q","5drc6FjHXR","djsrvS2Dfu","No0QbFFDui","RmDcrVprf2","lXFOB2Nslm","In3NS580YD","AkKTkAmdQd",
+"WreyPtaOXK","SjskQ0BmCy","Ul4a19GXkX","uvf7A9rlg9","hYBCKlsQGo","hSSvQOxWIH","soy9tJkzUn","HP433XflUq","lH1kt55rfB","ZhwG1JKWYR",
+"5nmWvjtn0X","cL0aEzbIYY","ksJbyUmaEv","dpe1v0h1b1","ZJTXHs7Mxk","NOHszyEfy9","VBjhznnP8o","1v5hH7fsYM","Uvlv48U2nU","G1RhSh1zcH",
+"CK5W72hEEU","blLA9n1pmO","faHirCIShG","JKWYRReKEW","lweGyNcICA","VIlwPQ6hMC","FwEJzs93Ml","J2mQiDcpWB","Dz1R3cL0aE","QYxC05nmWv",
+"oQ87rbZLvS","FcWrWkB5nP","8FmFHuupzk","GSQwjlm0pD","OHaBzl83Ud","CxVEfP6bcg","NhXdudhSuH","ogLgcjiVBP","ciuWz16lHc","Chuy3ZJTXH",
+"aez9yTwano","uvf7A7Ow5C","UlU3MfcJOy","O3iyQfmIK1","n8pJ93weIF","DQimpChuy3","gjUTuzFgtB","iKqhrTCgPp","i3pydAkKTk","In3NS7hyVv",
+"kB5nPfFDrJ","MezSWOHaBz","uN6r3qUJMd","AXpwEVNCPd","jiVBPfFDrJ","s47863weIF","xciqp9y4lw","MGlTFjSjS3","EoToPpiJSk","mz8gxjzUqR",
+"cQOnvIKxdL","K20wKQClRL","0MR5XEdBKc","zmLYD7lUXZ","D6rByxXTI4","7X3uyP6bcg","lH1ktwiHrZ","FwEJzqUJMd","Vprf2prNT6","JXljWJKWYR",
+"ReKEW7ku1p","atef214FLR","Y1mC0QnJ1S","Yh1hFy94nw","618DiGrDg7","9eoRcs7Mxk","7lUXZ64s8N","PYBf4L7cGc","Z4I1vOz8yZ","YOfrYsuY4x",
+"uN6r3U3yw5","6q6L9tl72W","ECMvUtvdkD","SjskQtvdkD","lViBvCp3mZ","FwEJztjQxs","8xEKzlkMUA","JRJQBuZPqg","5VZjSiB08l","9XyT9RACuj",
+"azIWpPb1pa","NcICAdjsrv","9XyT9FxX9q","DLhzMG1RhS","jzUqRZuDtD","BCxeCiqv4k","nlaBy5Drn0","RmDcrhe9IA","GSQwjjS1aj","tuDySWDVWJ",
+"suY4xFjHXR","DQimp6AFT0","oQ87rix74r","v1Hlnhe9IA","Ul4a1NcICA","29QAzWDVWJ","In3NSaL6AJ","ZzJHWrKDLJ","qUJMd5IhmG","8xEKzDz1R3",
+"lViBvuupzk","M3zXLkZANm","S2DfuIBe8k","64s8NXflUq","8FmFHzY1GY","djsrvfLNg8","No0QbjSjS3","Oz8yZYjB9t","he9IA29QAz","GWqqXZhwG1",
+"0MR5XHlUbF","ix74rTXQ0Z","rz7UtgIYvE","BpYhVCp3mZ","pv0i7yofH3","P6bcgLewvM","ulk41zz4ZU","ru4UG29QAz","0YAGHJRJQB","0PktIIRh48",
+"IKxdL45cIH","ciuWzM6qcG","5VZjSa00b5","0Wr5ykZANm","jzUqRuupzk","HRxd8MGlTF","iwzGkuQIcz","uZPqgFcWrW","NcICA6AFT0","CqqaDcQOnv",
+"MGlTFNo0Qb","vOqCEmX2GE","uJScXOHaBz","CIShGtaOXK","iKqhr1LB1L","uQIcznFqik","jeskSuupzk","DQimpVNCPd","7fKYUulk41","t59lRRpBQm",
+"UmaEvUvlv4","8hJdtJJs5m","yEfy9nFqik","7X3uyWPmlx","0KyfsciuWz","pmeCd2hEEU","jeskSQnJ1S","yofH3zQt6Q","zqH0WFcWrW","pT8wuuN6r3",
+"WMiS329QAz","IRh48pvgjS","hSSvQCqqaD","uN6r3VLTy6","07n1cwiHrZ","5nmWvVLTy6","b29RJ5drc6","LewvMVprf2","mX2GEIn3NS","ni2v1O3iyQ",
+"RkQkexciqp","DQimp5IhmG","kB5nPuJScX","X6PinMaJQs","zHF1qThjNn","7fsYM14FLR","4dEz6yofH3","VNCPdzqH0W","uLtKsFxX9q","M3zXLyvOMI",
+"QbxXcWreyP","nnP8odjsrv","FNYIMMkgy8","jeskSvLsmS","SjskQXyPZN","K4GS85Mg9r","fqypyo8Uyd","FLsphuPX7G","9eoRcU3yw5","uN6r3HlUbF",
+"24ARFFnPFB","tl72W45cIH","0Wr5yXyPZN","n8pJ9i3pyd","Waim6iB08l","0h1b1RkQke","WPmlxAXpwE","lkMUA2DREs","XflUqCfgr3","VIlwPzz4ZU",
+"BFkb8kB5nP","gdQsSS77LH","ZuDtDaFFss","yEfy9F6PT2","Mkgy8KZamH","9XyT9ulk41","W3VFHPOUYS","07n1catef2","iqv4khUTw7","WDVWJn8pJ9",
+"HlUbF3weIF","FFDui5drc6","soy9t7fsYM","WreyPaDGtS","B3qemUlU3M","uvf7AFnPFB","RxrsmgjUTu","DcpWBlweGy","7lUXZlCMxy","WDVWJtlILt",
+"XyPZNCfgr3","FxX9qDcpWB","b29RJqUJMd","M3zXLuupzk","t98iW2hEEU","lj07QUvlv4","Ta8f6580YD","ZzJHWLewvM","48cHLlweGy","FPfSEJRJQB",
+"cL0aEaez9y","pAhR1CK5W7","TXQ0ZprNT6","8RCUAJJs5m","RBhp0x3LDe","BbwgADLhzM","VerEAjSjS3","suY4xpiJSk","EoToPulk41","jeskS1v5hH",
+"AIYUux3LDe","LDk6fBbwgA","RACuj1LB1L","s4786djsrv","8U2nUcmXIX","0h1b1M3zXL","2ZHdkix74r","MojnPdhSuH","Y1mC0s93Ml","soy9tyofH3",
+"OUYuFjSjS3","8cVD3zbIYY","djsrv5Namm","uJScX7fsYM","NOHszprNT6","RzaZAMmsIo","AXpwEvkCHH","WmadA4W0Tl","QnJ1SnFqik","IRh48Mm8si",
+"rz7Utjtn0X","uTacxNo0Qb","JkzUn618Di","UmaEvJXljW","t59lRtaOXK","o8UyddmoS7","brhlQ5Drn0","5iGN5LbRTH","fcJOy9eoRc","ZhwG1v1Hln",
+"QssNCWDVWJ","cQOnvYjB9t","euZA57X3uy","taOXKs7Mxk","7fsYMYf2Ec","iKqhrvkCHH","RzaZA5drc6","ni2v1FxX9q","AOgEeFPfSE","s93MlOz8yZ",
+"M6qcGRxrsm","F6PT20PktI","wDajXChuy3","Dz1R3I7p2a","5Mg9rk85Ae","wiHrZWMiS3","MmsIo9y4lw","CdyBV6q6L9","BpYhVM3zXL","AXpwE9y4lw",
+"16lHcvLsmS","Waim6tuDyS","Nxx9VgdQsS","lj07QjfREu","l83UdkZANm","1j5L8dhSuH","RxrsmVerEA","IBe8k9iGoT","QnJ1SQssNC","FcWrW5nmWv",
+"YjB9tOUqFM","FwEJzZUnqt","a00b5pT8wu","zY1GYuZPqg","O3iyQF6PT2","9iGoTblLA9","JkzUnL7cGc","ydG8UfmIK1","P6bcgNOHsz","SbRYyIBe8k",
+"lsQGoVjCZq","FNYIMRsQUq","5ZaEz8RCUA","he9IAHP433","pv0i7y94nw","JIqXix3LDe","0h1b1JIqXi","VerEAkZANm","gf8rIprNT6","RACujQWxoT",
+"MojnPfFDrJ","taOXKFxX9q","xXTI4JKWYR","taOXK9iGoT","RACujD6rBy","4dEz6dmoS7","FVMxolH1kt","wiHrZBGaQY","LbRTHUvlv4","WMiS3580YD",
+"M3zXLW3VFH","v1HlnAIYUu","7lUXZCqqaD","ThjNnW7cTs","xciqp0Wr5y","jeskS9rlg9","tvdkDUl4a1","uvf7A1j5L8","euZA5Waim6","uTacxa00b5",
+"MaJQsFjHXR","CdyBVY1mC0","8xEKzQbxXc","1v5hHNOHsz","24ARFdjsrv","n8pJ9SjskQ","cQOnv5VZjS","EOE1oguMb8","AOgEeJXljW","QbxXchE1Ql",
+"jeskSpFrrl","uvf7Al83Ud","Nxx9V3weIF","cQOnvM6qcG","uPX7G7fKYU","SmGzvQnJ1S","AkKTkcL0aE","5NammKsjRK","7Ow5CVLTy6","uTacxEoToP",
+"rz7UtWDVWJ","uJScXdmoS7","VIlwPru4UG","NhXdutvdkD","K20wKZ4I1v","8U2nUvkCHH","zbIYYK4GS8","W7cTsJJs5m","BFkb8iKqhr","WMiS33otm6",
+"JkzUnbZLvS","1v5hH5Drn0","ReKEW8hJdt","zz4ZUjiVBP","C2IrcDQimp","t59lRmz8gx","9eoRcrKDLJ","lweGy8TxD7","fcJOy7X3uy","suY4xC2Irc",
+"yluBxxXTI4","JkzUnFGzgp","fLNg8FFDui","aDGtSlCMxy","Chuy3JJs5m","UlU3MZzJHW","uQIczJkzUn","7lUXZGv3Fq","55rfBEoToP","MojnP5nmWv",
+"guMb8MaJQs","9XyT9ix74r","aDGtSMmsIo","pT8wuLewvM","JKWYRCxVEf","v1HlnhYBCK","FcWrWZv7z0","ni2v1Rxrsm","FVMxoI7p2a","DQimpd7vjM",
+"euZA5iwzGk","rhl0JUvlv4","AOgEeXyPZN","guMb8jSjS3","RmDcrQnJ1S","580YDTCgPp","0MR5Xd85a9","aL6AJ6q6L9","s4786yEfy9","ZzJHWnnP8o",
+"LbRTHiB08l","v2eC3uvf7A","yToGWFcWrW","IKxdLgtCA5","v2eC3pFrrl","cQOnvSmGzv","gtCA5MojnP","Z4I1vpiJSk","07n1chSSvQ","YjB9tdpe1v",
+"iwzGkMaJQs","uZPqgd85a9","s93Ml9eoRc","QChxsNo0Qb","X6Pin8hJdt","kB5nPRsQUq","YOfrY9iGoT","580YDwiHrZ","bgJAzChuy3","soy9tvLsmS",
+"CdyBVfmIK1","ReKEWDcpWB","sx5GlY1mC0","ZuDtDqaofN","0PktIbZLvS","1j5L8guMb8","lweGyFGzgp","FLsph3weIF","NhXduSjskQ","RxrsmF6PT2",
+"AXpwEVLTy6","Yh1hF1LB1L","HlUbFOxWIH","qUJMdzqH0W","SjskQGXdoH","fqypyfcwDa","GrDg7pmeCd","Yh1hF9GXkX","XflUqzY1GY","n8pJ95IhmG",
+"brhlQF6PT2","QWxoTVerEA","lViBvIKxdL","tl72WXyPZN","FnPFBGWqqX","OUqFMZzJHW","lweGyNOHsz","1j5L8EOE1o","prNT6uLtKs","24ARFYf2Ec",
+"9eoRcb29RJ","1LB1LNxx9V","fmIK1sx5Gl","OxWIHNo0Qb","NhXduF6PT2","YOfrYaez9y","580YDy94nw","aez9yaL6AJ","D6rBy8xEKz","3otm6jS1aj",
+"6q6L9AgJHQ","iB08lFjHXR","LewvMbrhlQ","XyPZN6AFT0","lCMxy1LB1L","9y4lw7fsYM","2TRI7HRxd8","HlUbF618Di","TCgPpulk41","aDGtSAgJHQ",
+"aDGtSHfyNQ","W3VFHKASQ8","1v5hHt98iW","Y1mC03weIF","4QMc9TCgPp","Cfgr3fcwDa","vkCHH5Drn0","IjTwPAXpwE","Twano4QMc9","BbwgAiwzGk",
+"dpe1vfqypy","uJScXuZPqg","2hEEU9iGoT","L7cGctAOsr","Ul4a1zHF1q","WaWsvM6qcG","cQOnvWaWsv","0YAGHKZamH","3otm6Waim6","AIYUud7vjM",
+"Yh1hFwiHrZ","lm0pDyofH3","y94nwuTacx","QnJ1SXflUq","tAOsrNxx9V","Z4I1vWreyP","No0Qb580YD","EOE1oMGlTF","okgRi8U2nU","64s8Nulk41",
+"FwEJz7lUXZ","D6rBy64s8N","XflUqv1Hln","jfREuOUYuF","guMb8aFFss","In3NSzz4ZU","FLsph5Mg9r","zqH0WjzUqR","580YDbrhlQ","8xEKz7X3uy",
+"zbIYYgjUTu","QChxsC2Irc","RBhp0d85a9","Q6LixuZPqg","SbRYyG1RhS","DQimprhl0J","gjUTuCfgr3","a00b5Vprf2","soy9tuTacx","2Yz7E45cIH",
+"MmKGJzz4ZU","tuDySmX2GE","8TxD7AmdQd","aFFssyvOMI","3otm6taOXK","BbwgAVjCZq","o8Uydxciqp","Vprf2uN6r3","WmadAyluBx","WPmlxprNT6",
+"cQOnvQssNC","RBhp0Chuy3","3otm6mz8gx","brhlQjtn0X","0MR5X16lHc","8hJdtU3yw5","U3yw5yToGW","AXpwEHzZT8","S2DfulpF6W","6q6L97lUXZ",
+"HP4337ku1p","5Mg9rStlDJ","qaofN0Wr5y","Dz1R3QChxs","uZPqgQbxXc","8FmFH45cIH","0MR5X5iGN5","Y1mC0SWfou","tuDySW3VFH","AmdQdI7p2a",
+"tlILtDz1R3","1LB1LYf2Ec","2DREs7Ow5C","ECMvUAOgEe","0BmCy8FmFH","JKWYRlH1kt","ogLgcC2Irc","pvgjSCNHmv","uLtKsS2Dfu","y94nwtlILt",
+"RACujP6bcg","oVQp65ZaEz","OxWIH7lUXZ","AmdQdfcJOy","s93MlpFrrl","55rfBJKWYR","Yf2EcvLsmS","CK5W7n8pJ9","0PktIuoStw","cmXIXCK5W7",
+"IBe8kTa8f6","bgJAzmz8gx","dpe1veuZA5","CNHmviwzGk","bZLvSatef2","i3pyd9XyT9","Y1mC0BCxeC","DLhzMQworu","WPmlxNhXdu","RkQkeUmaEv",
+"hSSvQtlILt","S2DfurKDLJ","tuDyS0BmCy","Yf2EcS77LH","CNHmv0Wr5y","kB5nPiwzGk","Kr8ysZzJHW","3weIFuupzk","okgRi5Drn0","OUYuFgjUTu",
+"P6bcg3otm6","MezSWK20wK","POUYSHlUbF","2DREs6q6L9","HP433X6Pin","5drc6v1Hln","JIqXinlaBy","5iGN5tl72W","CqqaDZv7z0","uvf7AciuWz",
+"bgJAzYh1hF","hYBCKlj07Q","euZA5Zv7z0","S2Dfu4dEz6","FxX9quQIcz","gIYvEFjHXR","e6e4zEoToP","ix74rm4bxU","P6bcg5Drn0","3otm6e6e4z",
+"lXFOBEOE1o","8FmFHksJby","WDVWJPOUYS","RsQUq8cVD3","MaJQsazIWp","48cHLVerEA","TXQ0Z5iGN5","ZUnqt8TxD7","aL6AJfcJOy","AkKTkMaJQs",
+"lkMUAaL6AJ","lCMxyY1mC0","B3qemcL0aE","ogLgcOUqFM","9GXkXFNYIM","lweGyhUTw7","uJScXAOgEe","W3VFHvLsmS","gdQsSy94nw","bgJAzG1RhS",
+"QssNClXFOB","Yf2EcjzUqR","Vprf25Namm","soy9t7fKYU","gtCA5In3NS","ZUnqtM6qcG","ZuDtDB3qem","sx5Gl0ao3l","fcwDaaDGtS","lsQGoCfgr3",
+"suY4xWreyP","G1RhS2DREs","NhXdu3otm6","euZA5KsjRK","RzaZAYOfrY","8cVD3m4bxU","hi5X7uupzk","lweGylm0pD","0YAGH1v5hH","gIYvEXflUq",
+"cQOnvPYBf4","ru4UGIjTwP","lm0pDcL0aE","5drc6uLtKs","9eoRcDLhzM","8TxD7rhl0J","1j5L82Nslm","aFFssCxVEf","M3zXLuLtKs","cmXIX7Ow5C",
+"t98iWzbIYY","jtn0XFcWrW","pAhR1XflUq","fmIK1RmDcr","8U2nUulk41","IjTwPbZLvS","7lUXZx3LDe","2ZHdkU3yw5","Ul4a1WaWsv","RsQUqlkMUA",
+"jzUqRXflUq","Ss0Zuni2v1","v2eC3WDVWJ","pvgjSblLA9","RxrsmNo0Qb","uZPqg8RCUA","gjUTubZLvS","DcpWBCp3mZ","ni2v1jtn0X","uTacxnFqik",
+"YOfrYlkMUA","UlU3MEdBKc","CIShGlCMxy","Ss0ZuW7cTs","cShY2OxWIH","bgJAz8cVD3","KASQ8QChxs","Vprf224ARF","Nxx9V29QAz","s4786iKqhr",
+"Z4I1vuQIcz","Nxx9VwiHrZ","pAhR1580YD","JkzUn6q6L9","0Wr5y4dEz6","WreyPhe9IA","W3VFHAmdQd","iKqhr2ZHdk","DLhzMfFDrJ","O3iyQlm0pD",
+"h1zcHgdQsS","ThjNnFVMxo","0BmCyFFDui","FVMxoD6rBy","Ta8f6Twano","faHirBpYhV","X6PinBCxeC","F6PT2EoToP","zbIYYQ6hMC","tl72W5Drn0",
+"zY1GYt98iW","KASQ8FVMxo","uLtKsEdBKc","dmoS7uAWyp","RBhp0mz8gx","mX2GEd85a9","RkQkeZzJHW","FNYIMs93Ml","ZUnqt4dEz6","x3LDezY1GY",
+"jtn0XvkCHH","07n1cStlDJ","pAhR155rfB","POUYSX6Pin","Ul4a1O3iyQ","zmLYDLDk6f","l83UdzHF1q","8U2nUsx5Gl","ix74r5VZjS","pvgjSuN6r3",
+"QChxsCK5W7","S77LHMojnP","zbIYYMGlTF","EOE1oRmDcr","HzZT8IjTwP","RmDcrMK07Y","yofH3ydG8U","taOXKfcwDa","QChxsWMiS3","pmeCdFcWrW",
+"OxWIHuoStw","gdQsSMaJQs","3otm6cL0aE","h1zcHlj07Q","S2DfupiJSk","ZhwG1rhl0J","hUTw7lm0pD","HzZT8FVMxo","C2IrcjSjS3","WmadACK5W7",
+"guMb8NAFuw","StlDJqQxHP","ciuWzgIYvE","NcICAW3VFH","L7cGcwiHrZ","oQ87rfcJOy","FxX9qn1pmO","Yh1hFNOHsz","aez9yi3pyd","VjCZqAmdQd",
+"5drc6iqv4k","vOqCE8hJdt","2DREsjSjS3","CK5W7G1RhS","AXpwEt59lR","yEfy9YjB9t","4dEz6FjHXR","uLtKsdmoS7","b29RJZzJHW","yofH3d7vjM",
+"t98iWUvlv4","tlILt29QAz","h1zcH7lUXZ","s93MlGrDg7","5Mg9raez9y","pvgjSvOqCE","55rfBgdQsS","rKDLJMGlTF","G1RhSpmeCd","NcICA9XyT9",
+"TCgPpwDajX","0h1b1Nxx9V","1v5hHG1RhS","zqH0WDcpWB","DQimpoGu6x","SjskQgtCA5","7hyVvCK5W7","oGu6x0YAGH","cShY2FcWrW","I7p2atjQxs",
+"ReKEWhSSvQ","BGaQYnnP8o","NcICAVLTy6","Ss0Zus4786","tvdkDAIYUu","yToGWUl4a1","HP433BGaQY","lH1ktcShY2","StlDJzFgtB","ogLgcW3VFH",
+"atef2prNT6","4QMc9s7Mxk","45cIH4W0Tl","FnPFB0YAGH","ZUnqtIjTwP","45cIHMezSW","8cVD3WMiS3","MGlTF2Yz7E","faHirMojnP","0MR5XHfyNQ",
+"K20wKPb1pa","oQ87rk85Ae","s47860MR5X","IKxdL5nmWv","FxX9qpv0i7","e6e4ziB08l","gf8rInFqik","vOqCEB3qem","MK07YIBe8k","rhl0JVjCZq",
+"O3iyQaFFss","CdyBVuQIcz","QWxoTdjsrv","YjB9trKDLJ","iqv4knFqik","he9IA4W0Tl","VerEASbRYy","lweGyQ6hMC","lj07QpFrrl","gjUTu3otm6",
+"Pb1pani2v1","ZhwG1KZamH","ZUnqthYBCK","U3yw5uTacx","hi5X7BCxeC","jSjS3AXpwE","v8yFNzz4ZU","tjQxstvdkD","GSQwjHlUbF","pWiOs55rfB",
+"WDVWJulk41","X6PintjQxs","ni2v1MmsIo","zqH0WK20wK","aez9yo8Uyd","lCMxyix74r","XflUqqUJMd","v1HlnIBe8k","oVQp6JXljW","pv0i7fcJOy",
+"s7Mxkl83Ud","zHF1qpWiOs","dhSuHeuZA5","W3VFHYw2oU","uvf7AlH1kt","OUYuFxciqp","fLNg8xciqp","8FmFHY1mC0","jzUqRQnJ1S","BpYhVKZamH",
+"HRxd8v1Hln","zHF1qRsQUq","lViBvxciqp","5ZaEzs4786","mz8gxuQIcz","U3yw5X6Pin","fqypyLbRTH","jzUqR16lHc","rhl0JMK07Y","iKqhroQ87r",
+"S77LHyofH3","ZzJHWW3VFH","RBhp0lXFOB","UlU3MUvlv4","vOqCEnFqik","yvOMIdhSuH","uJScXs4786","7hyVvyvOMI","aez9y2TRI7","16lHck85Ae",
+"sqVrfoVQp6","k85AeUl4a1","dmoS7AmdQd","ksJby1LB1L","XflUq0h1b1","lH1ktNAFuw","y94nwjSjS3","In3NSzmLYD","FLsphQ6Lix","dmoS7CIShG",
+"tlILtfqypy","DQimpyofH3","QbxXcCNHmv","55rfBGXdoH","XflUqlweGy","soy9tokgRi","uPX7GG1RhS","W7cTsbgJAz","fFDrJ6q6L9","mX2GEsqVrf",
+"Gv3Fq24ARF","ReKEWK20wK","dhSuHSs0Zu","8hJdt0MR5X","3otm6ThjNn","fFDrJhi5X7","cL0aEFPfSE","LewvM64s8N","MmsIoQbxXc","jfREu7X3uy",
+"0Wr5yMGlTF","WreyPRxrsm","vLsmS7Ow5C","MmsIoazIWp","Y1mC0D6rBy","tvdkDblLA9","48cHLGXdoH","mz8gxuoStw","FLsphAgJHQ","I7p2amz8gx",
+"64s8NcL0aE","QssNCDG4sT","uZPqgprNT6","MGlTFYw2oU","StlDJKsjRK","rhl0JzmLYD","yvOMIzz4ZU","9eoRcMm8si","WreyPdpe1v","CqqaDYOfrY",
+"W7cTsgf8rI","QChxs7hyVv","dmoS77ku1p","m4bxUFVMxo","KASQ85iGN5","2ZHdkdpe1v","v1HlnCqqaD","VNCPdVjCZq","soy9tOz8yZ","KASQ8XflUq",
+"7hyVvLewvM","NhXdukB5nP","zz4ZUUmaEv","n1pmOuN6r3","AOgEeCxVEf","GXdoHAkKTk","bgJAzi7WMQ","8hJdtRpBQm","MK07Y4QMc9","h1zcHQYxC0",
+"uvf7AUmaEv","yToGWChuy3","QnJ1SdmoS7","WDVWJJKWYR","uoStwl83Ud","lweGyx3LDe","WMiS3Ss0Zu","LewvM5IhmG","7Ow5C7fKYU","e6e4zlm0pD",
+"dmoS71j5L8","vOqCEStlDJ","ECMvUZ4I1v","TCgPp5nmWv","EdBKclkMUA","4QMc9RACuj","0YAGHazIWp","jtn0XyvOMI","SWfourKDLJ","5ZaEztaOXK",
+"ZJTXHlweGy","nnP8o8cVD3","blLA9yToGW","gIYvEAOgEe","oVQp6SbRYy","1j5L829QAz","atef229QAz","14FLRtl72W","xReecECMvU","fmIK1kZANm",
+"gtCA5QbxXc","s93Ml29QAz","8U2nU5nmWv","5nmWvW7cTs","HfyNQTXQ0Z","OxWIHdpe1v","ulk41Zv7z0","2TRI7MojnP","JJs5mZ4I1v","5nmWvdpe1v",
+"5iGN5FFDui","FcWrWazIWp","ydG8Uni2v1","Cfgr3djsrv","K4GS8LewvM","SWfou3weIF","Oz8yZAIYUu","xReecHRxd8","jzUqRdjsrv","jeskSs7Mxk",
+"ZhwG10Kyfs","AgJHQtvdkD","DG4sTpv0i7","xXTI4xXTI4","0YAGHPb1pa","gf8rIECMvU","DG4sTs93Ml","t98iW1j5L8","i3pydMGlTF","taOXKbgJAz",
+"C2Irc5drc6","aL6AJFGzgp","45cIHcL0aE","8xEKzW3VFH","Vprf2d85a9","iwzGkIRh48","bZLvSMK07Y","tjQxsy94nw","RxrsmnFqik","0PktIatef2",
+"S77LHSWfou","Yf2EcVerEA","pmeCdx3LDe","lkMUAjSjS3","JRJQBM6qcG","9XyT9TCgPp","jfREu8FmFH","5Mg9r9XyT9","Oz8yZulk41","hSSvQyEfy9",
+"VerEAnnP8o","AOgEeI7p2a","K4GS8FNYIM","YOfrYKASQ8","AmdQdRzaZA","TXQ0ZLDk6f","Ta8f6uLtKs","Z4I1vQssNC","F6PT2Dz1R3","OxWIHa00b5",
+"yofH3VIlwP","wDajXwiHrZ","ulk41Chuy3","S2DfuRkQke","atef2faHir","Gv3FqMmKGJ","MezSWQChxs","uoStwSmGzv","2DREskZANm","t98iWRBhp0",
+"JJs5meuZA5","K20wKTCgPp","uvf7AF6PT2","pAhR1FwEJz","6AFT07fKYU","9rlg9ECMvU","brhlQuQIcz","CxVEftl72W","Mm8sivLsmS","QWxoTjtn0X",
+"FFDui3otm6","WmadAOUqFM","prNT6S77LH","Cp3mZrhl0J","SbRYyVprf2","NAFuwzbIYY","gtCA5d85a9","pWiOs8RCUA","guMb8zY1GY","5iGN5WMiS3",
+"IKxdLfmIK1","WMiS3BbwgA","lm0pD0ao3l","SbRYyIn3NS","okgRizHF1q","0MR5X5Mg9r","yluBxAOgEe","uQIczIRh48","55rfB7ku1p","lpF6WfcJOy",
+"VerEAprNT6","e6e4zPOUYS","G1RhSvOqCE","FFDuiUlU3M","8FmFHa00b5","k85AeReKEW","RBhp0MmKGJ","9rlg9pWiOs","HfyNQsuY4x","gdQsSD6rBy",
+"W3VFH0h1b1","8RCUABGaQY","lsQGoCp3mZ","aL6AJlweGy","zHF1qxReec","HfyNQP6bcg","azIWpC2Irc","MmsIolCMxy","vLsmSsqVrf","lkMUAVLTy6",
+"tjQxsyToGW","JXljWJ2mQi","O3iyQl83Ud","C2Ircs7Mxk","IBe8kX6Pin","fFDrJJXljW","QbxXcZ4I1v","Q6hMCOz8yZ","RACuj0YAGH","StlDJJRJQB",
+"ydG8US77LH","JRJQBlXFOB","29QAziKqhr","lweGyuQIcz","Cp3mZAkKTk","faHirQWxoT","ZJTXHD6rBy","0Wr5yCdyBV","ZuDtDM3zXL","5IhmGpWiOs",
+"PYBf4ksJby","BCxeCdpe1v","AOgEeZuDtD","24ARFrhl0J","9XyT9l83Ud","yEfy9DcpWB","zFgtBcL0aE","uAWyp1v5hH","5nmWvt98iW","mX2GEpvgjS",
+"HzZT8pFrrl","L7cGcaFFss","ix74rni2v1","aDGtSk85Ae","blLA9NAFuw","LDk6f5IhmG","Yh1hFRxrsm","Q6hMCatef2","5VZjS3otm6","wiHrZjzUqR",
+"ZJTXHulk41","Chuy3jeskS","JJs5mGSQwj","cL0aEZzJHW","iB08l1v5hH","55rfBCp3mZ","XyPZNlm0pD","wiHrZUl4a1","CdyBVpiJSk","ZuDtDEOE1o",
+"8FmFHgdQsS","JKWYRQ6Lix","uvf7AyluBx","07n1cIRh48","BbwgAGSQwj","FhtglWDVWJ","n8pJ9JXljW","5Mg9rgdQsS","IKxdLEoToP","Uvlv4pvgjS",
+"zbIYYAmdQd","29QAzpWiOs","x3LDeSjskQ","DG4sT7ku1p","nnP8obZLvS","2hEEU9y4lw","GSQwj6q6L9","WMiS3nnP8o","yluBxVerEA","JXljWVerEA",
+"lpF6WpT8wu","ZzJHWVNCPd","NhXduaDGtS","Yh1hF8RCUA","I7p2a0BmCy","I7p2aDz1R3","JXljWuLtKs","Pb1pa3otm6","lViBvjS1aj","BGaQYHRxd8",
+"JJs5m55rfB","VerEAZuDtD","580YDBCxeC","No0QbW3VFH","Zv7z0lkMUA","FhtglQworu","tvdkDQClRL","Yh1hFlCMxy","0MR5XtuDyS","5ZaEzBpYhV",
+"4QMc9CK5W7","580YDDLhzM","sqVrf1v5hH","BFkb8dmoS7","RpBQmaL6AJ","CqqaDs93Ml","wDajXs4786","QssNCNxx9V","FGzgpFwEJz","M6qcGCK5W7",
+"1v5hHpAhR1","ulk41HRxd8","tAOsrAXpwE","AXpwEv1Hln","xReec55rfB","hi5X7zQt6Q","e6e4zh1zcH","DcpWBK20wK","Pb1paQ6hMC","soy9tAmdQd",
+"xXTI4azIWp","VIlwPaL6AJ","soy9tKr8ys","brhlQlCMxy","0PktIMezSW","J2mQix3LDe","9iGoTDz1R3","zz4ZUFcWrW","5VZjSzQt6Q","Q6hMCazIWp",
+"v1HlnhSSvQ","BbwgALewvM","0PktItlILt","P6bcg5IhmG","kB5nPjSjS3","KsjRKoVQp6","OHaBz16lHc","lsQGoVIlwP","Cfgr3Z4I1v","YjB9t7lUXZ",
+"hSSvQydG8U","aFFssRACuj","hUTw764s8N","JkzUn0Wr5y","XflUq3weIF","i3pydhUTw7","d85a9k85Ae","gIYvEuLtKs","64s8N7fsYM","dhSuHtl72W",
+"7X3uyDQimp","8U2nUpiJSk","yvOMI5iGN5","IBe8k5VZjS","7ku1p6q6L9","prNT6QClRL","uvf7A14FLR","JRJQB5Drn0","RkQkeW7cTs","580YDLewvM",
+"Gv3Fqdjsrv","W7cTsk85Ae","2TRI7zQt6Q","U3yw5B3qem","7Ow5CHlUbF","lm0pDd85a9","1v5hH0Kyfs","cShY27Ow5C","SWfou5drc6","Kr8ys7hyVv",
+"bgJAzVprf2","ksJbyJIqXi","RsQUqaFFss","RzaZAoGu6x","ydG8UD6rBy","qaofNM6qcG","jzUqRW7cTs","XyPZN55rfB","JIqXikZANm","ZUnqt1v5hH",
+"aFFssb29RJ","iwzGkPb1pa","8cVD3zQt6Q","m4bxU2Yz7E","zY1GYFnPFB","lXFOBlj07Q","kB5nPuN6r3","Q6LixoGu6x","dpe1vFNYIM","VLTy6dhSuH",
+"LbRTH5VZjS","29QAzaFFss","cShY2ECMvU","O3iyQprNT6","lViBvAmdQd","guMb8JXljW","S77LH0MR5X","OUYuFRkQke","KASQ8fqypy","pv0i78cVD3",
+"aFFsseuZA5","0BmCygjUTu","JKWYRQnJ1S","QbxXcuQIcz","uPX7GVNCPd","xXTI4Gv3Fq","cShY2RsQUq","vkCHHcQOnv","ECMvUVIlwP","FxX9q14FLR",
+"jiVBPv1Hln","sx5GlAmdQd","ogLgct59lR","4QMc9618Di","vkCHHBCxeC","o8UydgIYvE","XyPZNxciqp","m4bxUOUYuF","uJScXfmIK1","zqH0Wd85a9",
+"X6PinpvgjS","xXTI4lCMxy","l83UdVNCPd","HRxd8Mkgy8","YOfrY5VZjS","jfREujtn0X","y94nwVerEA","ZhwG1Oz8yZ","zY1GYHzZT8","Waim60Wr5y",
+"uN6r3JJs5m","ogLgcRpBQm","5nmWvfcwDa","OUYuF07n1c","lViBvDcpWB","FhtglyluBx","OHaBzydG8U","YOfrY8cVD3","Y1mC0HfyNQ","FVMxod85a9",
+"iKqhrzFgtB","8xEKz0h1b1","jeskSRxrsm","rhl0J64s8N","Cp3mZJXljW","EdBKcNhXdu","blLA99XyT9","IjTwPwDajX","7ku1pdQ586","vOqCEFNYIM",
+"NAFuwUl4a1","AIYUuGSQwj","MmKGJHzZT8","uQIczeuZA5","Kr8ysfFDrJ","s7MxkMmsIo","TwanoCdyBV","uAWypK20wK","AIYUuyofH3","jiVBPuAWyp",
+"CIShGiB08l","zHF1qMezSW","K4GS864s8N","IjTwPQworu","1v5hHFxX9q","FcWrWVprf2","GWqqXtjQxs","zbIYYDLhzM","wiHrZHfyNQ","4QMc9In3NS",
+"ogLgcfmIK1","U3yw5Mm8si","0MR5X5IhmG","JXljW9XyT9","CK5W77fsYM","qUJMdPYBf4","NcICAZv7z0","9iGoT8xEKz","BCxeCe6e4z","JJs5mciuWz",
+"FnPFB8xEKz","jtn0X4dEz6","sqVrfnFqik","n1pmOZJTXH","zz4ZUJJs5m","2NslmcL0aE","fLNg8WDVWJ","pmeCdZhwG1","PYBf4lXFOB","CK5W7FwEJz",
+"No0QbgdQsS","8cVD3In3NS","TwanoTwano","JkzUnQClRL","4QMc9Nxx9V","lXFOBnlaBy","ZJTXHRxrsm","s4786uTacx","QbxXcYw2oU","Q6hMCuQIcz",
+"Zv7z0cShY2","kB5nPFxX9q","ZUnqtM3zXL","FNYIMJXljW","ksJbyLbRTH","MmKGJI7p2a","RmDcrjS1aj","uoStwjiVBP","6AFT007n1c","BFkb8n8pJ9",
+"J2mQiSmGzv","I7p2av8yFN","nlaByhSSvQ","GWqqXKsjRK","tvdkDJJs5m","BpYhVdmoS7","5iGN5n1pmO","uvf7Ae6e4z","StlDJ5drc6","xXTI4wiHrZ",
+"TwanoFxX9q","ix74rLDk6f","rhl0JCK5W7","9GXkXOUYuF","hE1QlI7p2a","NAFuwyofH3","i3pydGXdoH","7hyVvgIYvE","pv0i7MmsIo","9rlg9TCgPp",
+"BGaQYMGlTF","Dz1R3fLNg8","ulk41HfyNQ","5NammYh1hF","gIYvEDcpWB","wiHrZOUqFM","KASQ8ulk41","2ZHdksx5Gl","rz7UtLewvM","Z4I1vgjUTu",
+"5Mg9rzY1GY","uPX7GpmeCd","fcJOyB3qem","MojnPuAWyp","W7cTstaOXK","sqVrfTXQ0Z","7Ow5CMaJQs","guMb8EoToP","5NammbrhlQ","uvf7Aulk41",
+"PYBf4v1Hln","uAWypM3zXL","brhlQCIShG","hUTw7DcpWB","9rlg99y4lw","TXQ0ZFxX9q","Cfgr3K4GS8","HP433OxWIH","0YAGHQChxs","AXpwEWmadA",
+"lViBvEdBKc","yofH3S2Dfu","iKqhrFGzgp","pmeCdFFDui","MojnPQ6Lix","5NammpmeCd","2TRI7IjTwP","fqypyzFgtB","QbxXcWPmlx","64s8NvOqCE",
+"NOHszo8Uyd","vOqCEPOUYS","pFrrlYf2Ec","5Drn0Vprf2","FVMxoYw2oU","2Nslmdpe1v","FVMxok85Ae","5IhmGpT8wu","cmXIX45cIH","Oz8yZLDk6f",
+"L7cGcpT8wu","Chuy3zbIYY","a00b50ao3l","7hyVv8FmFH","a00b5zFgtB","7fKYUQWxoT","MmKGJydG8U","tl72Wdjsrv","618Di6q6L9","JKWYR8U2nU",
+"qUJMdMojnP","yluBx5Mg9r","UmaEvQssNC","pT8wuBGaQY","IKxdLd7vjM","fcJOy0BmCy","Nxx9VMojnP","aFFss64s8N","8TxD7UmaEv","ZJTXHh1zcH",
+"C2Irclm0pD","fLNg8o8Uyd","oGu6xKsjRK","qaofNo8Uyd","6q6L9fLNg8","UmaEvS77LH","SmGzvo8Uyd","zqH0WQWxoT","7lUXZ5VZjS","Q6hMC5Drn0",
+"5iGN5AXpwE","RmDcrkZANm","618DioGu6x","W3VFH0BmCy","JIqXiAgJHQ","Ul4a1ThjNn","vLsmSCNHmv","5nmWv55rfB","lkMUAgdQsS","CqqaD0Wr5y",
+"tjQxs9GXkX","9XyT9pAhR1","PYBf4l83Ud","JJs5mZJTXH","FhtglfmIK1","Gv3FqgjUTu","ix74r6q6L9","3otm67X3uy","5NammUmaEv","lweGy618Di",
+"VBjhz7ku1p","618DiHlUbF","d85a9uTacx","7fKYUUlU3M","0PktITa8f6","AgJHQjiVBP","UlU3MJXljW","euZA5VjCZq","wiHrZguMb8","Twano9iGoT",
+"HzZT8pAhR1","7hyVvjfREu","QWxoTdQ586","tAOsrpvgjS","VjCZqZzJHW","K4GS8SjskQ","pT8wuWPmlx","UlU3MQWxoT","XflUqXflUq","AmdQdogLgc",
+"VjCZqFcWrW","KASQ8AmdQd","8U2nUyvOMI","Q6hMCjeskS","9rlg9CK5W7","aFFsshUTw7","l83UdTCgPp","2NslmZ4I1v","FhtgllweGy","uN6r3BCxeC",
+"Oz8yZ8xEKz","k85AeaL6AJ","MGlTFBGaQY","uPX7GCfgr3","tlILtqQxHP","Yh1hF6q6L9","lj07QhE1Ql","AmdQdReKEW","2DREsAkKTk","DcpWBVLTy6",
+"soy9tJ2mQi","Ss0ZucQOnv","64s8Ntl72W","fcwDatvdkD","dpe1v1LB1L","jtn0XDz1R3","brhlQHlUbF","7fKYU6q6L9","RkQkelweGy","AgJHQxXTI4",
+"5iGN5EoToP","VIlwPwiHrZ","D6rBya00b5","S2DfuDcpWB","8hJdtVLTy6","8cVD3rKDLJ","CK5W7yofH3","oVQp6jzUqR","n8pJ9k85Ae","VjCZqe6e4z",
+"o8UydlCMxy","MGlTF2ZHdk","qaofNZhwG1","uLtKsHfyNQ","i3pydgdQsS","mz8gxMojnP","atef2DcpWB","1LB1Lulk41","FjHXRCfgr3","VNCPdlViBv",
+"zHF1qEdBKc","k85AeiB08l","s93MlJKWYR","cQOnvVIlwP","vLsmSD6rBy","prNT6FNYIM","8hJdt7lUXZ","QClRL8FmFH","HRxd8gIYvE","MaJQsQClRL",
+"1j5L8Q6Lix","9iGoTuvf7A","wDajX5Drn0","jS1ajuvf7A","HzZT8uTacx","pvgjSfcJOy","hSSvQuoStw","9y4lwv2eC3","y94nwBpYhV","guMb80Kyfs",
+"zz4ZUCNHmv","64s8NIKxdL","WPmlxRxrsm","7X3uyjiVBP","KASQ8FwEJz","jSjS3HzZT8","24ARFzbIYY","x3LDe0MR5X","HfyNQ7X3uy","v2eC3uAWyp",
+"h1zcHBpYhV","3weIFtAOsr","WPmlxG1RhS","lViBvRmDcr","bgJAz1LB1L","3otm6MGlTF","FVMxoVerEA","soy9tEOE1o","No0QbuJScX","RxrsmAkKTk",
+"SjskQuoStw","hE1Qliqv4k","lXFOBaL6AJ","Waim6bZLvS","OHaBzhYBCK","piJSk0ao3l","aL6AJQ6hMC","djsrv580YD","QnJ1SFPfSE","1j5L8jSjS3",
+"AOgEeuAWyp","Q6LixzbIYY","5drc6yEfy9","VLTy60BmCy","nFqik8cVD3","29QAzD6rBy","MmsIob29RJ","AXpwEfcJOy","dpe1vMmKGJ","dmoS7t98iW",
+"14FLRVerEA","5nmWvIKxdL","nFqik16lHc","ksJbyyToGW","5drc6TXQ0Z","soy9tuvf7A","FGzgplm0pD","Vprf2faHir","NhXduzFgtB","GrDg7FFDui",
+"AIYUuFVMxo","KsjRKZUnqt","Q6LixcmXIX","7fKYUtaOXK","I7p2a29QAz","lCMxyt59lR","aDGtSaFFss","aFFssgIYvE","WDVWJe6e4z","8U2nUuoStw",
+"AOgEe9eoRc","StlDJWDVWJ","o8UydcQOnv","ix74r8U2nU","MezSWLbRTH","1LB1LAIYUu","rhl0JmX2GE","ECMvUFVMxo","0PktIVprf2","7fKYUDQimp",
+"hYBCKNxx9V","euZA5tvdkD","WaWsvHzZT8","Nxx9V0Wr5y","5nmWvDz1R3","6AFT0jSjS3","LewvMNxx9V","QChxs6q6L9","SmGzvOUYuF","QbxXc2hEEU",
+"VIlwPJkzUn","uoStwpiJSk","RmDcr1j5L8","fLNg8CK5W7","qUJMdhSSvQ","jtn0XuAWyp","rKDLJix74r","TXQ0ZuLtKs","9rlg9HP433","Cfgr3M6qcG",
+"QssNCTCgPp","uupzky94nw","iqv4k8TxD7","suY4xVNCPd","aez9y0YAGH","ulk41aFFss","jiVBP1v5hH","dmoS7tl72W","RBhp0fLNg8","QWxoTnlaBy",
+"I7p2aqaofN","rz7UtxReec","d7vjMzmLYD","jS1ajprNT6","WreyPvOqCE","0YAGH5nmWv","29QAzL7cGc","5NammRmDcr","1j5L8DLhzM","vOqCEtuDyS",
+"MmKGJQ6hMC","qQxHP0YAGH","oVQp6IKxdL","fFDrJblLA9","fcwDa16lHc","TXQ0ZqaofN","fmIK1VjCZq","BbwgA55rfB","EOE1ovkCHH","K20wKzz4ZU",
+"VjCZqM3zXL","qQxHPDLhzM","iwzGkKASQ8","s93MljS1aj","Yf2EcoGu6x","oQ87rv2eC3","yvOMIKsjRK","FnPFBciuWz","ciuWzlkMUA","uLtKsCdyBV",
+"1v5hHxReec","MmKGJX6Pin","soy9tJRJQB","29QAzTXQ0Z","BbwgAsuY4x","ZhwG1iB08l","WmadAECMvU","cmXIX1LB1L","P6bcgwDajX","8U2nUkZANm",
+"oQ87rulk41","X6PinuZPqg","a00b5TCgPp","atef2aDGtS","zmLYDaFFss","Uvlv4i3pyd","KZamHbrhlQ","SWfouChuy3","CIShGFhtgl","ksJbyTwano",
+"fLNg824ARF","iqv4kTXQ0Z","FFDuiMkgy8","rz7UtK4GS8","PYBf4o8Uyd","lViBvl83Ud","aL6AJTCgPp","b29RJ2Yz7E","24ARFTXQ0Z","RzaZAVLTy6",
+"k85AeJKWYR","brhlQksJby","RBhp0pWiOs","lkMUAl83Ud","ZzJHWyvOMI","qaofN2Yz7E","GSQwjyluBx","fqypyZUnqt","2DREstl72W","cQOnvlm0pD",
+"lCMxywDajX","JkzUnazIWp","pvgjS9iGoT","ZJTXHQYxC0","NAFuwdpe1v","TCgPp1v5hH","Yf2EcAmdQd","n1pmOJXljW","dpe1vm4bxU","okgRijSjS3",
+"DQimp3otm6","kZANmEdBKc","he9IA5iGN5","HzZT8Z4I1v","2DREs7fKYU","blLA9Vprf2","G1RhSWaim6","hSSvQKZamH","tvdkDYh1hF","nFqik2Nslm",
+"D6rByfFDrJ","K4GS8LbRTH","GSQwjRBhp0","Ss0Zuiqv4k","HRxd8pT8wu","tl72WazIWp","IKxdLUvlv4","QworuOUqFM","HfyNQAgJHQ","RzaZAt59lR",
+"fLNg8zbIYY","8hJdtO3iyQ","WmadAVBjhz","2Nslm3otm6","LbRTHKZamH","yEfy95VZjS","CqqaDOz8yZ","9iGoTRsQUq","jeskStlILt","HfyNQzqH0W",
+"FxX9qIn3NS","Z4I1vuoStw","IjTwPrz7Ut","JJs5mJJs5m","RpBQm1v5hH","suY4xNhXdu","blLA9RkQke","Kr8ysjzUqR","pAhR1ZuDtD","DcpWBpAhR1",
+"2DREsMojnP","Nxx9VECMvU","Kr8yss7Mxk","FwEJzHRxd8","B3qem7Ow5C","HfyNQRpBQm","zz4ZUt98iW","L7cGcxReec","5iGN5i3pyd","2DREsKASQ8",
+"0MR5Xl83Ud","blLA9v2eC3","oGu6xD6rBy","fcwDai7WMQ","TXQ0ZQ6hMC","uLtKsnFqik","QWxoTzHF1q","0PktIiKqhr","OUYuF55rfB","K4GS8PYBf4",
+"AXpwEQnJ1S","fcJOy2TRI7","suY4xgtCA5","U3yw5C2Irc","0BmCyuZPqg","hSSvQYf2Ec","Ss0ZuhUTw7","FjHXRAkKTk","Q6hMCQYxC0","Vprf2v1Hln",
+"m4bxUn1pmO","7hyVvzz4ZU","gIYvESbRYy","brhlQpv0i7","CK5W7AIYUu","RBhp0W7cTs","9y4lwCxVEf","4dEz6uQIcz","7lUXZFhtgl","WmadAJXljW",
+"uupzkprNT6","55rfB2hEEU","ogLgciB08l","djsrvuoStw","D6rByqQxHP","EdBKctjQxs","sqVrfPYBf4","JJs5miB08l","QYxC0JKWYR","NAFuwhUTw7",
+"tvdkDFNYIM","rKDLJ0BmCy","5Namm5Mg9r","gjUTuksJby","6AFT0taOXK","SWfou9y4lw","xciqpvkCHH","EoToP0MR5X","9GXkXVerEA","5nmWvVjCZq",
+"uPX7G5VZjS","45cIHGv3Fq","jiVBPpmeCd","F6PT2Cfgr3","oQ87r8cVD3","QYxC0UlU3M","7Ow5Cn1pmO","m4bxUbZLvS","OHaBzY1mC0","sx5GlWMiS3",
+"9XyT9aL6AJ","Oz8yZqQxHP","jS1aj8xEKz","rhl0Jaez9y","Kr8ysIjTwP","jiVBP7fKYU","lweGylXFOB","jiVBPuPX7G","yEfy9MezSW","7fsYM07n1c",
+"hUTw7uupzk","jeskShE1Ql","NhXdufcwDa","FxX9qcL0aE","Dz1R3dmoS7","WreyPzqH0W","suY4x2Nslm","48cHLStlDJ","n1pmOl83Ud","WaWsvnlaBy",
+"Ta8f6aez9y","uZPqgIBe8k","rz7UtTwano","x3LDeRsQUq","Gv3FqMGlTF","djsrvbgJAz","brhlQi7WMQ","B3qemlweGy","Rxrsm7fsYM","KASQ8lpF6W",
+"0h1b1AmdQd","4W0TlfLNg8","OUqFMSWfou","yEfy97X3uy","QYxC00Kyfs","RsQUqlViBv","0ao3laL6AJ","LDk6fJKWYR","2NslmCK5W7","suY4xix74r",
+"lpF6WpiJSk","e6e4zNo0Qb","oQ87rW3VFH","D6rByWPmlx","piJSkQClRL","sqVrfF6PT2","dQ586iKqhr","NOHsz7lUXZ","ThjNnlsQGo","TwanoQssNC",
+"0Kyfs1LB1L","pWiOs1v5hH","8hJdtGv3Fq","lweGyoQ87r","Gv3FqQChxs","6q6L95drc6","0BmCyuTacx","In3NS5iGN5","MezSW9XyT9","fcJOyCK5W7",
+"x3LDelViBv","8U2nUM3zXL","9GXkXtl72W","zbIYYBbwgA","W3VFHS77LH","MmsIoWaWsv","Ta8f6JkzUn","8U2nUNhXdu","kB5nPs4786","NhXdupiJSk",
+"WMiS3RpBQm","t59lRMmsIo","y94nwe6e4z","cmXIXcL0aE","8xEKzTa8f6","tl72Ws4786","FNYIMpmeCd","MmKGJlsQGo","No0Qbv2eC3","S2Dfu5Mg9r",
+"EOE1oM3zXL","7hyVvNxx9V","yofH3StlDJ","oVQp6WreyP","8U2nUhYBCK","hE1QlWDVWJ","S2Dfuru4UG","vLsmSUl4a1","MGlTFoVQp6","QnJ1SIRh48",
+"uupzkogLgc","blLA9rhl0J","2ZHdk5nmWv","v2eC3uLtKs","ulk41Uvlv4","EdBKcQ6Lix","3otm62DREs","pWiOsHzZT8","IjTwPnlaBy","2Yz7E16lHc",
+"euZA5Yh1hF","oVQp6fqypy","a00b5POUYS","ReKEWO3iyQ","pmeCddQ586","iKqhrnFqik","0BmCyfcJOy","FNYIMgf8rI","0ao3lOxWIH","blLA9Chuy3",
+"v8yFN618Di","Yw2oUt59lR","PYBf4ZJTXH","FFDuiJkzUn","ZuDtDtuDyS","yluBxtl72W","9y4lwS2Dfu","TCgPp0Wr5y","nFqikIRh48","pWiOs8TxD7",
+"L7cGcAOgEe","lm0pD2TRI7","jfREuRzaZA","BFkb8Fhtgl","DLhzMuAWyp","LbRTHS2Dfu","YjB9tbZLvS","rhl0JCxVEf","vLsmSMezSW","l83UdmX2GE",
+"euZA54dEz6","8RCUAK20wK","Yw2oUHlUbF","Waim6FwEJz","G1RhSlj07Q","CqqaDVNCPd","aL6AJCqqaD","dpe1vMmsIo","ni2v1nFqik","UlU3MCK5W7",
+"8RCUA29QAz","OxWIHBbwgA","3otm6KZamH","3otm645cIH","WmadAYw2oU","aFFsspT8wu","l83Ud64s8N","Kr8ysUvlv4","tvdkDBbwgA","Kr8ysmX2GE",
+"FFDuiXyPZN","X6PinwiHrZ","vkCHHfmIK1","I7p2an1pmO","djsrv5iGN5","mX2GEIKxdL","K4GS84dEz6","0h1b1X6Pin","yofH35nmWv","5nmWv0Kyfs",
+"h1zcHpAhR1","gjUTuiwzGk","Mkgy87X3uy","AOgEehSSvQ","b29RJZUnqt","MmsIo8RCUA","FVMxooQ87r","8U2nUECMvU","uvf7AKZamH","aL6AJv1Hln",
+"BbwgAmz8gx","h1zcHjiVBP","nnP8ot98iW","48cHLJXljW","VBjhzQssNC","v8yFNsqVrf","tjQxsgdQsS","ix74r1LB1L","CqqaDMmsIo","8U2nU7lUXZ",
+"oVQp6pvgjS","YOfrY580YD","P6bcgaez9y","1j5L8CIShG","WMiS3lj07Q","SmGzva00b5","OUYuFnFqik","YOfrYSWfou","4QMc9aez9y","lH1ktECMvU",
+"fLNg8RzaZA","WaWsvwiHrZ","5Drn0mz8gx","Y1mC0pAhR1","5IhmGXflUq","iqv4kUlU3M","uLtKsk85Ae","iB08ly94nw","taOXKAkKTk","Chuy35drc6",
+"faHirWmadA","OxWIH0h1b1","cmXIX7ku1p","VLTy61v5hH","BFkb85VZjS","fLNg8uN6r3","JXljW8xEKz","8xEKzTwano","EoToPMaJQs","GWqqXsoy9t",
+"MmKGJZzJHW","2hEEUaDGtS","DG4sT0Wr5y","pAhR1Nxx9V","5iGN5jfREu","2TRI7Ss0Zu","suY4xtaOXK","lweGyqQxHP","7hyVv0Wr5y","pvgjS0Kyfs",
+"a00b5LDk6f","faHirjSjS3","Yh1hFqUJMd","wiHrZYOfrY","rhl0JgIYvE","QssNCokgRi","8U2nUh1zcH","pmeCdi7WMQ","XflUqVerEA","xciqpl83Ud",
+"JIqXii7WMQ","tvdkDzY1GY","I7p2aWDVWJ","gf8rIVBjhz","tAOsrFjHXR","G1RhSv8yFN","0BmCyMmsIo","7fsYMQ6Lix","okgRiW7cTs","EOE1oy94nw",
+"brhlQyofH3","lsQGoQ6Lix","CqqaDAOgEe","9rlg9kZANm","uTacxlViBv","SjskQiqv4k","ix74rhUTw7","JXljWbgJAz","FLsphatef2","8xEKz7ku1p",
+"Mm8sitvdkD","ThjNnWmadA","16lHctuDyS","jzUqRuZPqg","v8yFNG1RhS","MaJQsVIlwP","WDVWJdjsrv","piJSkgf8rI","2TRI7Vprf2","MojnPThjNn",
+"uAWypt59lR","uN6r3CNHmv","jiVBPoGu6x","Mkgy8BbwgA","No0Qb5Namm","zQt6Qv2eC3","hUTw7StlDJ","zmLYDAgJHQ","3otm6WreyP","azIWphE1Ql",
+"s93MldQ586","euZA5618Di","W3VFHzqH0W","F6PT2a00b5","QbxXcfaHir","jSjS3In3NS","Gv3FqW3VFH","MojnP7fKYU","xciqpFLsph","prNT6gjUTu",
+"RxrsmprNT6","IBe8kjzUqR","ciuWzi7WMQ","y94nwKsjRK","vOqCElViBv","aL6AJt98iW","nlaByksJby","Vprf2wiHrZ","RmDcrHfyNQ","OUYuFlkMUA",
+"Oz8yZECMvU","iqv4ks93Ml","ZuDtDdpe1v","RACujWPmlx","jSjS32Nslm","t98iW7fsYM","FLsphKASQ8","he9IAWreyP","jSjS3TCgPp","ogLgcPYBf4",
+"GSQwj580YD","iqv4keuZA5","aL6AJlm0pD","FxX9qKZamH","DLhzMUvlv4","L7cGcs4786","WreyP8TxD7","nlaByVBjhz","uN6r38cVD3","1v5hH0BmCy",
+"JJs5mMmKGJ","azIWp3otm6","Ul4a1tuDyS","ReKEWqQxHP","Waim6fFDrJ","CIShGFcWrW","iwzGkaFFss","HRxd82Nslm","K4GS8cL0aE","K4GS8MmsIo",
+"IRh48BCxeC","QWxoTbrhlQ","FcWrWRkQke","nlaByLDk6f","IRh48StlDJ","b29RJVjCZq","1LB1L8U2nU","RBhp0618Di","RzaZApFrrl","oGu6xmX2GE",
+"DLhzMeuZA5","AkKTkpT8wu","KASQ8tjQxs","W3VFHbgJAz","ZhwG1IRh48","lm0pDF6PT2","d85a9618Di","tuDySTwano","ix74roGu6x","iKqhr9XyT9",
+"l83UdpFrrl","CdyBVblLA9","CdyBVRsQUq","iKqhrM3zXL","TCgPpdQ586","aFFsss7Mxk","d7vjMNcICA","dpe1vDG4sT","CIShGeuZA5","aDGtSQworu",
+"ulk41Y1mC0","8RCUARpBQm","KsjRKB3qem","HlUbFDG4sT","s47865iGN5","7X3uyi3pyd","7hyVvlCMxy","aL6AJ0ao3l","FhtglOz8yZ","4dEz6tlILt",
+"lweGys4786","9XyT9cQOnv","lCMxycQOnv","ECMvUMK07Y","v2eC3fFDrJ","W3VFHCK5W7","v1Hln0PktI","bZLvShYBCK","lkMUA29QAz","yofH35VZjS",
+"W3VFHWaim6","618DiIRh48","HRxd8faHir","uQIczcQOnv","EdBKcgdQsS","W7cTs7lUXZ","h1zcHVNCPd","lXFOBy94nw","BGaQY2TRI7","k85Aeaez9y",
+"GrDg7NAFuw","StlDJQChxs","mz8gxpiJSk","ZUnqtK20wK","2ZHdkgtCA5","aFFssLbRTH","Waim6nlaBy","azIWpAkKTk","WMiS3a00b5","uLtKshYBCK",
+"JIqXiuN6r3","aez9y0PktI","MmsIo0Kyfs","1j5L8Yh1hF","RsQUqWreyP","iKqhrlm0pD","7Ow5CxReec","QWxoTVIlwP","zY1GYOUYuF","ZhwG1MK07Y",
+"ulk41Yf2Ec","bZLvSpT8wu","fmIK1gIYvE","UmaEv0ao3l","B3qemJXljW","QbxXchYBCK","ZuDtDvLsmS","MK07Y2hEEU","nlaBymX2GE","Q6hMCfaHir",
+"DG4sT9rlg9","MmsIoMkgy8","3weIF8TxD7","GXdoHtAOsr","ZhwG1Ta8f6","fmIK1taOXK","QClRLqUJMd","U3yw5CIShG","qQxHPlsQGo","BCxeCReKEW",
+"Cp3mZIjTwP","bgJAzW7cTs","jtn0XMGlTF","a00b5pAhR1","L7cGcQ6hMC","lViBvMm8si","RzaZA3weIF","AOgEev8yFN","pWiOsFLsph","zHF1qFnPFB",
+"1v5hHStlDJ","QnJ1SL7cGc","guMb8VjCZq","a00b5HP433","GXdoHaDGtS","LewvMdQ586","IRh488cVD3","v2eC3GXdoH","QnJ1SqaofN","Vprf2HzZT8",
+"hUTw7dpe1v","I7p2a2TRI7","nFqiky94nw","MmKGJAIYUu","ru4UGcmXIX","IRh48QClRL","dpe1vbrhlQ","9XyT9zmLYD","s7Mxk24ARF","2NslmOz8yZ",
+"BpYhVQChxs","wDajXS2Dfu","HzZT88hJdt","QnJ1SVNCPd","v1Hln0ao3l","Gv3Fqs4786","Cfgr355rfB","45cIHrKDLJ","EOE1o64s8N","Dz1R31LB1L",
+"HlUbFBGaQY","EdBKchE1Ql","2DREsfaHir","0YAGHBbwgA","7fsYMVIlwP","s4786i7WMQ","nFqikPYBf4","CxVEfMaJQs","d7vjMtuDyS","DG4sTRxrsm",
+"aFFsszY1GY","MmsIoNOHsz","ksJbypAhR1","5VZjSgIYvE","BGaQYQClRL","JKWYRuTacx","lXFOBKZamH","xciqp5iGN5","LewvMv8yFN","tvdkDGXdoH",
+"yToGW0ao3l","0YAGHwDajX","No0Qb6q6L9","i7WMQUmaEv","IRh480Wr5y","sx5GlOz8yZ","rz7Ut7lUXZ","fcwDaJIqXi","l83UdFGzgp","8hJdtQChxs",
+"iB08lCxVEf","8FmFHazIWp","uJScXhUTw7","jtn0X3weIF","SjskQuupzk","ni2v1UmaEv","cmXIX1j5L8","fcJOyCqqaD","ZzJHWhSSvQ","jeskSpv0i7",
+"iwzGkM6qcG","dpe1vtvdkD","zQt6QAmdQd","t98iWUl4a1","Rxrsm8FmFH","FNYIMn1pmO","tAOsr5drc6","guMb8bZLvS","8cVD3FGzgp","uvf7AlXFOB",
+"WMiS3EoToP","VBjhzMmKGJ","IRh48WmadA","faHirQworu","pmeCdtaOXK","8U2nU9GXkX","xciqpFjHXR","v1HlnfcwDa","suY4xPYBf4","ix74rfLNg8",
+"wiHrZuvf7A","8TxD7uPX7G","sqVrfpAhR1","tlILtMK07Y","0h1b1iKqhr","S77LHjiVBP","5nmWvsuY4x","nnP8o1j5L8","hSSvQ7X3uy","TXQ0ZdhSuH",
+"Mkgy8lsQGo","5drc62DREs","i7WMQFGzgp","WPmlxIBe8k","Yh1hFQ6Lix","EdBKcWmadA","FVMxoDQimp","ZUnqtFVMxo","HP433oQ87r","MK07Ypv0i7",
+"Waim6WmadA","kZANmdhSuH","lkMUAy94nw","i3pyduLtKs","fqypylCMxy","ksJbyHlUbF","uLtKs3weIF","Yw2oUIBe8k","nnP8oZv7z0","SbRYyAgJHQ",
+"ru4UG1j5L8","Zv7z00Wr5y","l83UdNAFuw","IjTwPs93Ml","v1Hlnru4UG","GXdoH9GXkX","CdyBV1LB1L","Uvlv4zQt6Q","kZANmBGaQY","jeskSFnPFB",
+"NOHszAgJHQ","nnP8o8U2nU","9y4lwrhl0J","cL0aEogLgc","ix74rvkCHH","zQt6QguMb8","HP4335iGN5","AXpwEFVMxo","0MR5XuZPqg","uQIcz7hyVv",
+"qQxHPazIWp","VNCPdNxx9V","fqypyFFDui","DLhzMEOE1o","I7p2azmLYD","VerEAlm0pD","gdQsSCxVEf","7hyVvK20wK","sx5GliB08l","uoStw6q6L9",
+"CdyBVvkCHH","RBhp09GXkX","VLTy6b29RJ","AgJHQI7p2a","2hEEUFVMxo","gf8rIVjCZq","pmeCdn1pmO","VjCZqpFrrl","gtCA55VZjS","C2Irc0PktI",
+"Uvlv40MR5X","AmdQdGSQwj","F6PT2GXdoH","JJs5mChuy3","Yf2EcSs0Zu","Ul4a1t98iW","FNYIMZuDtD","3weIFD6rBy","JIqXijiVBP","lkMUAOxWIH",
+"gtCA5fqypy","pWiOs8hJdt","qUJMdjiVBP","OUqFMJ2mQi","In3NSFPfSE","MezSWs7Mxk","fLNg8fcwDa","BpYhVgIYvE","dhSuHdhSuH","yvOMIMm8si",
+"blLA9iwzGk","a00b5bgJAz","oGu6xWaim6","oVQp648cHL","55rfBlj07Q","MmsIogjUTu","aL6AJpAhR1","16lHcHlUbF","EOE1oMK07Y","Fhtgln1pmO",
+"JXljWJJs5m","AkKTk7fKYU","M6qcGJRJQB","FcWrWIBe8k","CqqaDhSSvQ","jS1ajsoy9t","64s8NP6bcg","WaWsvWDVWJ","9rlg9pvgjS","HfyNQYw2oU",
+"okgRifqypy","W7cTsPb1pa","qaofNy94nw","Nxx9V580YD","pmeCd1LB1L","atef2IBe8k","FwEJzzHF1q","Ta8f6Yh1hF","zqH0WgtCA5","DcpWB618Di",
+"KASQ8S2Dfu","xciqpECMvU","SbRYyaL6AJ","QClRLWPmlx","dQ586cQOnv","lweGyRBhp0","UmaEvMojnP","BpYhVazIWp","euZA5FLsph","WreyPFPfSE",
+"WmadAsqVrf","Gv3FqhSSvQ","In3NSB3qem","55rfBzqH0W","prNT6MmKGJ","2Nslm2Nslm","pvgjSuQIcz","lweGyHP433","45cIH7fKYU","TCgPpSWfou",
+"7lUXZFPfSE","iKqhr2DREs","vkCHH5drc6","zmLYDTa8f6","brhlQwiHrZ","oQ87r7ku1p","5ZaEz0MR5X","W3VFHJkzUn","5VZjSD6rBy","8RCUAogLgc",
+"M3zXLI7p2a","16lHcpAhR1","lViBvlm0pD","pFrrlM6qcG","zz4ZUx3LDe","LDk6fW7cTs","7fsYMGv3Fq","RBhp0rKDLJ","blLA9Fhtgl","AXpwEFNYIM",
+"2Nslm24ARF","O3iyQ5Mg9r","5IhmGydG8U","d7vjMuupzk","Cfgr3QYxC0","580YDoGu6x","RACujFVMxo","zbIYYzz4ZU","Nxx9VX6Pin","zQt6QnnP8o",
+"zqH0WPb1pa","nFqikx3LDe","580YD6q6L9","jSjS3580YD","AkKTkTa8f6","FGzgpCxVEf","v8yFNh1zcH","aez9y45cIH","kZANm2Nslm","MmsIod85a9",
+"FGzgppiJSk","taOXK5Mg9r","Ss0ZulweGy","BCxeCazIWp","RzaZAnnP8o","Waim6oVQp6","FwEJzi3pyd","cShY29XyT9","dQ586rKDLJ","iqv4kU3yw5",
+"dhSuHUl4a1","fqypyVprf2","m4bxU5nmWv","dpe1v5Namm","MezSWGWqqX","5VZjSXflUq","vkCHHCfgr3","2DREsAmdQd","KsjRKL7cGc","iqv4kdpe1v",
+"jiVBPSjskQ","e6e4zsuY4x","tuDySzz4ZU","n1pmOPOUYS","qUJMdsx5Gl","bZLvSZ4I1v","i3pydt59lR","LewvMi3pyd","OUqFMyvOMI","jS1ajeuZA5",
+"Ta8f6sx5Gl","FVMxoPb1pa","2hEEUFPfSE","kB5nPaL6AJ","rz7UtSWfou","pAhR1ni2v1","pT8wudjsrv","UmaEvWaWsv","AIYUuIKxdL","taOXKpv0i7",
+"U3yw5t98iW","Yw2oUHzZT8","4QMc9jzUqR","bgJAzTa8f6","nFqikOUYuF","tl72WzHF1q","Uvlv4NAFuw","vOqCE16lHc","J2mQiF6PT2","GrDg7nFqik",
+"WDVWJ14FLR","aL6AJazIWp","IBe8kzmLYD","IBe8kpFrrl","07n1cDG4sT","CdyBVm4bxU","KsjRK6q6L9","L7cGc0Kyfs","WMiS3fmIK1","14FLRi3pyd",
+"8xEKzGrDg7","atef2Rxrsm","oVQp6kZANm","WDVWJMojnP","vLsmSIKxdL","v1HlnRBhp0","d85a90h1b1","OUqFMS77LH","s7MxkG1RhS","lH1ktSbRYy",
+"5ZaEzcL0aE","2ZHdkydG8U","Zv7z07lUXZ","0KyfsQssNC","djsrv24ARF","lsQGofcwDa","djsrvNhXdu","2TRI7brhlQ","6q6L94QMc9","RsQUq9y4lw",
+"jzUqRM6qcG","F6PT2BpYhV","Chuy34dEz6","JXljWokgRi","Z4I1v4W0Tl","jzUqR1LB1L","SWfoubgJAz","tl72WJkzUn","aDGtS6AFT0","SWfouQChxs",
+"v8yFNCp3mZ","CNHmvm4bxU","F6PT2l83Ud","ciuWztuDyS","Vprf2ydG8U","0h1b1DcpWB","Waim6tlILt","07n1cP6bcg","cQOnvoQ87r","L7cGcjiVBP",
+"ru4UGzz4ZU","zQt6QX6Pin","dQ586zQt6Q","ksJbyZ4I1v","hi5X7AIYUu","he9IAgIYvE","IRh48BbwgA","t98iWsx5Gl","gjUTurhl0J","lweGyatef2",
+"FxX9qeuZA5","XyPZNNxx9V","WaWsvRpBQm","MojnPaDGtS","TCgPpD6rBy","NhXduJKWYR","580YDAgJHQ","IKxdLI7p2a","h1zcHS77LH","No0QbOUYuF",
+"i7WMQl83Ud","rz7Uts7Mxk","D6rByFcWrW","64s8NMGlTF","fLNg8wiHrZ","EOE1oQClRL","ulk41dhSuH","24ARF6AFT0","9eoRcAgJHQ","blLA9oVQp6",
+"GWqqXaez9y","PYBf4Fhtgl","5VZjSlm0pD","FjHXRW7cTs","uvf7A0MR5X","zqH0Ws93Ml","WPmlxtl72W","IjTwPVLTy6","k85AeDLhzM","7lUXZP6bcg",
+"VLTy6AXpwE","580YDMkgy8","KASQ8lCMxy","W3VFHFnPFB","45cIHFjHXR","7fsYMzHF1q","iqv4kFPfSE","mX2GEPYBf4","MezSWDz1R3","AmdQdfaHir",
+"SmGzvTXQ0Z","v2eC3zz4ZU","zz4ZUh1zcH","ZhwG1uTacx","zY1GYLewvM","0ao3l7hyVv","14FLRHzZT8","Cp3mZFPfSE","sx5GlKASQ8","euZA55nmWv",
+"Yh1hFpv0i7","C2IrcMaJQs","ECMvUzQt6Q","16lHcAmdQd","NAFuwl83Ud","FcWrWjS1aj","zz4ZUtaOXK","UmaEvkZANm","FxX9qBFkb8","45cIHkB5nP",
+"MaJQsfcJOy","ydG8Ud7vjM","GXdoH8cVD3","CIShGjeskS","hSSvQpiJSk","lViBvZv7z0","JXljWQ6hMC","2Yz7EjzUqR","BbwgAUmaEv","HlUbFnnP8o",
+"2TRI7Dz1R3","VBjhzUmaEv","8FmFHK4GS8","GWqqXiKqhr","uQIczCxVEf","0ao3luoStw","MezSWtjQxs","cmXIXQChxs","iKqhrZuDtD","i3pyd5IhmG",
+"dpe1vuPX7G","zmLYDvkCHH","t98iW7hyVv","lH1ktlXFOB","Zv7z09GXkX","qaofNCp3mZ","iKqhrbZLvS","Dz1R3y94nw","DG4sTD6rBy","64s8Ngf8rI",
+"uAWyp0ao3l","YOfrYPb1pa","tvdkD0YAGH","7lUXZgjUTu","ydG8U2Yz7E","AmdQdhUTw7","vkCHHa00b5","AOgEeo8Uyd","rz7UtQClRL","uJScXVBjhz",
+"1v5hH5Mg9r","Gv3Fqv2eC3","lViBvuLtKs","D6rByhSSvQ","RsQUqpFrrl","dmoS7gjUTu","WreyPfcJOy","VjCZqGv3Fq","ru4UGXyPZN","jfREu4W0Tl",
+"jeskSVLTy6","Cp3mZyofH3","lCMxylViBv","pvgjSrhl0J","MojnPm4bxU","WDVWJyToGW","euZA57hyVv","GWqqXsqVrf","hYBCKQ6Lix","RpBQmjtn0X",
+"s4786CxVEf","AIYUuMkgy8","NcICAni2v1","tAOsrU3yw5","gdQsSX6Pin","hE1Ql0YAGH","xciqpMK07Y","nFqikjzUqR","BpYhVFcWrW","Dz1R3M6qcG",
+"7lUXZ0BmCy","Z4I1v1LB1L","KsjRKogLgc","2Yz7ES2Dfu","fcwDa5iGN5","xReecRsQUq","8RCUA0YAGH","JkzUnfqypy","IBe8kK4GS8","k85AeChuy3",
+"zbIYY618Di","BCxeCcL0aE","IRh48D6rBy","Cfgr3HRxd8","FcWrW2Nslm","FwEJzjtn0X","OUYuFprNT6","AkKTkjfREu","vkCHHgf8rI","zQt6QqQxHP",
+"oGu6xO3iyQ","wDajXgjUTu","fFDrJ7Ow5C","FjHXRC2Irc","1j5L8s4786","uLtKszFgtB","guMb84QMc9","EdBKcpmeCd","IKxdLWMiS3","kB5nPQClRL",
+"mX2GElweGy","s93MlTCgPp","hYBCKXflUq","2NslmuAWyp","6AFT0OxWIH","ciuWzRACuj","xciqpMaJQs","bZLvSlXFOB","aFFssgdQsS","In3NSIRh48",
+"No0QbVNCPd","ydG8UKsjRK","GWqqXYjB9t","QClRLjeskS","piJSkazIWp","Gv3FqcmXIX","BGaQYUvlv4","FNYIM0BmCy","FGzgpv1Hln","HfyNQIn3NS",
+"Yh1hFRmDcr","0YAGHs7Mxk","I7p2ajS1aj","qaofNJJs5m","MK07Yi7WMQ","2DREs1j5L8","i3pydZzJHW","0KyfsFnPFB","lsQGoLbRTH","JJs5mVNCPd",
+"RmDcrECMvU","yEfy9kB5nP","3otm6Uvlv4","29QAznFqik","M3zXLDz1R3","VjCZqydG8U","OxWIHogLgc","mX2GEAOgEe","QYxC0xciqp","soy9tzbIYY",
+"VjCZqNxx9V","v2eC3S2Dfu","WMiS3qaofN","24ARFAXpwE","2Nslmdjsrv","4dEz6OHaBz","okgRiaFFss","M3zXLaFFss","BFkb8ReKEW","rKDLJMkgy8",
+"pvgjS5VZjS","Oz8yZtjQxs","FFDuiOz8yZ","SWfoupmeCd","KsjRKZJTXH","jtn0XWaim6","9eoRcmz8gx","uN6r3tuDyS","blLA9xReec","gjUTuCNHmv",
+"PYBf4pAhR1","lkMUAk85Ae","uPX7GpWiOs","lsQGoIn3NS","Y1mC0TCgPp","uPX7Gt59lR","oQ87rUl4a1","RxrsmoGu6x","Kr8ys0PktI","v1Hln4QMc9",
+"oGu6xtl72W","Vprf2i7WMQ","iKqhr8FmFH","7fsYMYOfrY","GSQwj1j5L8","lCMxyHlUbF","4QMc9AXpwE","45cIHyofH3","qaofNix74r","euZA5BbwgA",
+"ThjNne6e4z","MK07Yv2eC3","Cfgr3Chuy3","PYBf4Yw2oU","RBhp0gtCA5","TwanoMmsIo","618DiVprf2","CNHmvRmDcr","blLA9RmDcr","Y1mC0cL0aE",
+"580YDvkCHH","5VZjS4dEz6","e6e4zNcICA","OUqFMfFDrJ","zz4ZUnFqik","qaofNiqv4k","4W0Tlm4bxU","M6qcGWaim6","JXljWi7WMQ","RmDcroVQp6",
+"RACujWDVWJ","9GXkXLewvM","EdBKcCp3mZ","sqVrfU3yw5","pT8wuVBjhz","G1RhSRxrsm","X6Pin1LB1L","VNCPdzHF1q","Mkgy8RmDcr","1j5L8TXQ0Z",
+"jS1ajpFrrl","ThjNn16lHc","cQOnvGWqqX","dhSuHJkzUn","StlDJ6AFT0","Pb1palViBv","AgJHQzFgtB","s7MxkQnJ1S","9iGoTJkzUn","BFkb8No0Qb",
+"AXpwEkB5nP","ogLgcfqypy","0YAGHe6e4z","pvgjS580YD","dmoS7vOqCE","BFkb8MmsIo","2hEEUni2v1","MaJQsgdQsS","v8yFNyToGW","WaWsvMezSW",
+"5IhmGogLgc","yToGWtaOXK","Yw2oUXflUq","cL0aEMmKGJ","zmLYDHP433","POUYS1LB1L","yvOMICfgr3","Chuy3DLhzM","Ss0Zu9eoRc","BFkb8NcICA",
+"BbwgAo8Uyd","aL6AJGXdoH","OUqFMiB08l","6AFT09XyT9","FnPFBSbRYy","ZhwG12TRI7","IjTwP8cVD3","45cIHzmLYD","rKDLJ8TxD7","QssNCHlUbF",
+"ulk41Q6hMC","8TxD7gjUTu","Dz1R3RpBQm","fcwDaIRh48","9iGoT8FmFH","48cHLe6e4z","JJs5m8FmFH","fcwDaVerEA","brhlQzz4ZU","pvgjScQOnv",
+"uoStwm4bxU","bgJAzVIlwP","AgJHQHP433","AIYUuDcpWB","cmXIXLbRTH","jzUqRlm0pD","aFFssNcICA","9XyT9Mm8si","4QMc9XyPZN","AmdQdX6Pin",
+"pvgjSFNYIM","FcWrW7Ow5C","pWiOs45cIH","RzaZAHRxd8","lXFOBVLTy6","jtn0X0h1b1","lj07QWaim6","0BmCyyToGW","aez9yC2Irc","ciuWzLewvM",
+"xciqpY1mC0","nlaByuoStw","wDajX5nmWv","kZANmQworu","FxX9q8FmFH","VBjhzCNHmv","yEfy9tvdkD","5NammmX2GE","QnJ1SRmDcr","tjQxsRpBQm",
+"Cp3mZ0ao3l","uvf7AhUTw7","DQimpCp3mZ","5drc67fKYU","Uvlv4UmaEv","b29RJix74r","MaJQsuQIcz","ciuWzSbRYy","StlDJRACuj","CIShGAmdQd",
+"yvOMIh1zcH","m4bxUEoToP","gIYvEFwEJz","t59lR5IhmG","zQt6QUl4a1","Ul4a1dQ586","5drc69XyT9","FhtglWmadA","WMiS3o8Uyd","KZamHPOUYS",
+"vLsmSb29RJ","9XyT9kZANm","gtCA5uoStw","rz7Ut8U2nU","uTacxCxVEf","8xEKzDcpWB","uLtKsFhtgl","nFqik7hyVv","prNT6azIWp","wiHrZv8yFN",
+"xXTI4RmDcr","xReecIjTwP","RACujWaWsv","ZuDtDe6e4z","K20wK2ZHdk","b29RJVBjhz","4W0TlVNCPd","cQOnvKZamH","14FLRQssNC","4W0Tld7vjM",
+"DQimph1zcH","sx5Gl1j5L8","jzUqRNxx9V","AkKTkCxVEf","zz4ZUlsQGo","v1Hlni3pyd","aL6AJxXTI4","lCMxy24ARF","Ss0Zuk85Ae","SmGzv4dEz6",
+"CxVEfD6rBy","Cfgr3aDGtS","n1pmO8FmFH","1LB1L16lHc","FLsphtAOsr","ix74rPb1pa","dhSuHOxWIH","5Namm3otm6","2ZHdk2hEEU","piJSkMm8si",
+"OHaBzL7cGc","qaofN0MR5X","BGaQYfqypy","YOfrYlH1kt","fFDrJpT8wu","HP433FxX9q","QssNCZv7z0","Chuy31j5L8","9GXkXTa8f6","bgJAzO3iyQ",
+"HfyNQogLgc","CK5W7vLsmS","FhtglpT8wu","GWqqXzmLYD","5iGN5v1Hln","RACujfqypy","IjTwP7lUXZ","U3yw5uLtKs","7lUXZuoStw","fLNg84QMc9",
+"LDk6f5Drn0","U3yw5qQxHP","sx5GlciuWz","i3pydIKxdL","pvgjSZ4I1v","2TRI7ZuDtD","s7MxkzFgtB","VjCZq7Ow5C","Gv3FqECMvU","nFqikRzaZA",
+"YOfrYcShY2","2Nslmix74r","5IhmGgIYvE","FNYIM4W0Tl","mz8gxjiVBP","RxrsmQClRL","AmdQdUl4a1","Uvlv4TXQ0Z","MGlTFEOE1o","StlDJiKqhr",
+"0PktIAIYUu","nFqikCqqaD","8U2nUChuy3","YjB9tRxrsm","StlDJnlaBy","FNYIMG1RhS","07n1ciKqhr","0h1b1k85Ae","Mkgy8RpBQm","JRJQBAOgEe",
+"MK07YzbIYY","Yw2oUReKEW","I7p2at59lR","n8pJ9AOgEe","FVMxouLtKs","UmaEv5IhmG","8RCUASWfou","dpe1vxXTI4","hE1QlVprf2","8cVD3guMb8",
+"Qworumz8gx","dQ586VerEA","D6rByGSQwj","hUTw7AIYUu","wiHrZxciqp","qUJMd5Drn0","FnPFBVLTy6","9y4lw29QAz","tuDySJ2mQi","X6PinY1mC0",
+"rz7Utfqypy","7ku1pZhwG1","VLTy6XyPZN","uZPqgeuZA5","9GXkXC2Irc","tlILtMezSW","bgJAzyofH3","0KyfsguMb8","fcJOyCIShG","Ss0ZuvOqCE",
+"xReecwDajX","d7vjMuoStw","W3VFHCdyBV","DG4sTY1mC0","lsQGoa00b5","J2mQimz8gx","KsjRKJXljW","yluBx6q6L9","NhXduIKxdL","bZLvSReKEW",
+"DcpWBiqv4k","kB5nPSjskQ","1v5hHlm0pD","FjHXRLDk6f","HlUbFJJs5m","hE1QluN6r3","Q6hMCZuDtD","Ul4a1F6PT2","VIlwPzqH0W","Dz1R3guMb8",
+"C2IrcSWfou","AOgEeatef2","ni2v15nmWv","MaJQssuY4x","Ta8f6CxVEf","OUYuFbZLvS","YjB9tVBjhz","KZamHJXljW","tuDySt98iW","W7cTsjeskS",
+"VBjhzDG4sT","djsrvzz4ZU","Vprf25ZaEz","i3pydSs0Zu","LDk6fuQIcz","ThjNnFFDui","v8yFNOxWIH","0MR5XlH1kt","he9IAmz8gx","SbRYyFxX9q",
+"yofH3jzUqR","sqVrfOHaBz","QnJ1S3otm6","IBe8k5ZaEz","qQxHPuAWyp","iwzGkWMiS3","6AFT0Ss0Zu","uoStwxciqp","2DREsVBjhz","0KyfssuY4x",
+"cQOnvZUnqt","7lUXZqaofN","5VZjSk85Ae","Mm8si4W0Tl","BbwgAeuZA5","oGu6xeuZA5","KZamH2Nslm","hSSvQSs0Zu","aez9yFGzgp","e6e4zL7cGc",
+"48cHLTwano","No0QbQworu","xciqpWDVWJ","uJScXTa8f6","BpYhVhSSvQ","zHF1qKZamH","HlUbFGSQwj","FwEJz6q6L9","SWfou24ARF","ThjNnblLA9",
+"TXQ0ZFGzgp","lm0pD7ku1p","Q6Lix5Mg9r","vkCHHWmadA","Mkgy8prNT6","9XyT9S77LH","5NammVjCZq","jSjS3RzaZA","vOqCE2ZHdk","v8yFNK20wK",
+"07n1cjeskS","ulk41bZLvS","hUTw7dmoS7","Zv7z0aez9y","ZuDtDdQ586","JIqXikB5nP","RkQkeuZPqg","WPmlxtjQxs","JXljWmz8gx","pWiOsn8pJ9",
+"xciqpNxx9V","48cHLRsQUq","ru4UGZJTXH","aez9yzbIYY","hE1Ql7ku1p","8cVD3s93Ml","pFrrlMezSW","ReKEWEdBKc","FVMxoBFkb8","QnJ1SCK5W7",
+"W7cTsBFkb8","e6e4zni2v1","QbxXcpmeCd","Gv3FqcL0aE","EdBKcokgRi","MojnP2hEEU","guMb8blLA9","8cVD3tl72W","BFkb8BGaQY","UlU3MFjHXR",
+"BGaQYLDk6f","FLsphjtn0X","G1RhS5nmWv","8cVD3CK5W7","NhXduLewvM","aDGtSuTacx","FhtglRBhp0","iB08luLtKs","lViBv8TxD7","VjCZqPOUYS",
+"lm0pD0Wr5y","FPfSE8cVD3","Waim6Uvlv4","In3NScShY2","YjB9tOxWIH","iwzGkCfgr3","ydG8UpiJSk","prNT6IBe8k","x3LDe5drc6","wDajXv1Hln",
+"xciqpqaofN","LbRTHNcICA","NcICAyofH3","MojnPpvgjS","kB5nPlViBv","ksJbyUl4a1","SWfouuvf7A","ZJTXHlsQGo","ogLgcSjskQ","jiVBPCdyBV",
+"v1HlnpiJSk","gdQsSbgJAz","tuDySy94nw","yToGWBbwgA","ECMvUguMb8","HfyNQokgRi","lweGyFFDui","dhSuHtAOsr","ThjNnFPfSE","FGzgpRpBQm",
+"FPfSEWreyP","nlaByiB08l","NhXduhUTw7","piJSkS2Dfu","M3zXLiqv4k","OUYuFM6qcG","vLsmS2Nslm","nnP8ovkCHH","LbRTH9XyT9","FcWrWnFqik",
+"sqVrfe6e4z","0BmCykB5nP","Gv3FqjfREu","BGaQY2Nslm","0YAGHB3qem","KZamHZhwG1","euZA5tAOsr","d85a9YOfrY","IRh48yvOMI","Z4I1vwiHrZ",
+"dQ586zFgtB","uN6r3VerEA","Zv7z0KZamH","9y4lw4W0Tl","Yw2oU0BmCy","U3yw5OUqFM","RmDcr5Drn0","CNHmvSjskQ","HlUbFmz8gx","ogLgcJRJQB",
+"5drc6djsrv","FnPFBMmsIo","vkCHHjzUqR","RzaZAZ4I1v","DQimpl83Ud","D6rBy5ZaEz","KsjRKxXTI4","OUqFM1j5L8","e6e4zRBhp0","zQt6Q5drc6",
+"zqH0Wiqv4k","FFDuiJIqXi","7lUXZAgJHQ","Dz1R3aDGtS","GWqqXwDajX","CNHmvjzUqR","o8Uyd7X3uy","dpe1vY1mC0","5Drn0uZPqg","QworumX2GE",
+"sx5GlfcwDa","0YAGHG1RhS","euZA5Ul4a1","zmLYDQ6hMC","xReecuvf7A","uN6r3Uvlv4","dmoS7hYBCK","tvdkDuLtKs","mz8gxL7cGc","vkCHHt98iW",
+"QnJ1SAkKTk","2hEEUChuy3","RkQkeQChxs","GSQwjAgJHQ","iwzGkh1zcH","Dz1R3CqqaD","29QAzqUJMd","lm0pD4dEz6","UlU3MMezSW","JIqXi7lUXZ",
+"SjskQS2Dfu","aez9y8hJdt","JKWYR2Yz7E","5IhmGpvgjS","hE1QlNxx9V","v1HlnuJScX","Yf2EcKr8ys","Cfgr3EoToP","pWiOsxciqp","O3iyQrKDLJ",
+"zbIYYZUnqt","gtCA5cQOnv","7ku1pKr8ys","dpe1vQChxs","MmsIoWPmlx","GrDg7RsQUq","J2mQiQ6Lix","4dEz6fmIK1","fcJOyPYBf4","HP433piJSk",
+"i3pyd7Ow5C","QYxC0aL6AJ","AmdQdEoToP","EdBKcwiHrZ","IjTwPSjskQ","dpe1vSmGzv","QChxstAOsr","ZUnqtMmKGJ","48cHLhYBCK","Pb1paFxX9q",
+"9rlg9s4786","Qworuv2eC3","Ul4a1lj07Q","W3VFHBFkb8","l83UdG1RhS","nFqikrz7Ut","JXljWMGlTF","TCgPpHP433","FFDuiYjB9t","oVQp6ulk41",
+"QworuuZPqg","e6e4z5iGN5","QClRL8U2nU","8cVD3FFDui","IRh48EoToP","QnJ1S8U2nU","QnJ1SOUqFM","AIYUuXflUq","3otm6SWfou","7hyVvuPX7G",
+"zFgtBwiHrZ","prNT69rlg9","QYxC0ciuWz","2NslmbgJAz","8FmFHVNCPd","0PktIVBjhz","Cfgr3uQIcz","uupzkn8pJ9","rKDLJKr8ys","fFDrJzz4ZU",
+"Yw2oUaFFss","Qworuru4UG","Cp3mZVIlwP","MaJQs5drc6","5ZaEzZhwG1","MojnPQnJ1S","9eoRcpAhR1","TCgPp5iGN5","QWxoTLewvM","5IhmGsoy9t",
+"ogLgc1j5L8","FjHXRGXdoH","5nmWvRsQUq","U3yw50BmCy","h1zcHMmKGJ","lkMUAfcwDa","5drc6oVQp6","pvgjSNcICA","BCxeCQClRL","jfREu24ARF",
+"ZJTXH5ZaEz","IRh48oGu6x","Kr8ysO3iyQ","s7MxkhUTw7","G1RhSFjHXR","HP433OHaBz","5nmWvZJTXH","Q6LixBpYhV","hi5X7Ul4a1","TXQ0ZVLTy6",
+"JKWYRtvdkD","NOHszQ6hMC","qUJMdRBhp0","bZLvSs93Ml","yvOMIQbxXc","aez9yDQimp","LbRTHprNT6","K4GS8MmKGJ","ZJTXHCK5W7","NhXduGXdoH",
+"Oz8yZlCMxy","CdyBVRkQke","hE1QlW7cTs","d85a9Waim6","Nxx9VYOfrY","X6PinSWfou","jSjS3ZJTXH","YjB9tYf2Ec","MaJQsKASQ8","zQt6QKASQ8",
+"cShY2FGzgp","oGu6xbrhlQ","GXdoHKsjRK","GXdoHtl72W","D6rByVNCPd","POUYSDG4sT","kB5nPdhSuH","lpF6WK4GS8","soy9tdhSuH","9iGoTuN6r3",
+"qUJMdhe9IA","HRxd87lUXZ","5NammD6rBy","uPX7GcQOnv","wDajXhi5X7","BbwgAd85a9","uN6r3HfyNQ","atef28U2nU","PYBf4FGzgp","EdBKcFjHXR",
+"yvOMIpAhR1","5nmWvYjB9t","RmDcrDLhzM","RsQUqRxrsm","n8pJ9lH1kt","uLtKsGv3Fq","xXTI4ZzJHW","1LB1LwiHrZ","29QAzpv0i7","Mm8silViBv",
+"QChxsBbwgA","Yf2EcRACuj","Nxx9VbZLvS","cQOnvL7cGc","uPX7GSWfou","LbRTHbgJAz","zHF1qpAhR1","5iGN5MK07Y","euZA5CIShG","2hEEUzqH0W",
+"cL0aEYOfrY","2TRI7pAhR1","Pb1pajS1aj","W3VFHSjskQ","uupzkTCgPp","lpF6WP6bcg","5nmWvhYBCK","kZANmgjUTu","sqVrfs93Ml","oGu6xo8Uyd",
+"i3pydX6Pin","OHaBzlj07Q","hUTw7MojnP","soy9t9iGoT","O3iyQW7cTs","QYxC0Fhtgl","tl72WzY1GY","07n1c7Ow5C","VLTy6jSjS3","48cHLfFDrJ",
+"wDajXI7p2a","Kr8ysIKxdL","WreyPQChxs","W3VFH48cHL","rhl0JFLsph","okgRi580YD","tuDySnlaBy","hE1QlpT8wu","TwanoDcpWB","AkKTklweGy",
+"jzUqRVBjhz","n1pmOyofH3","d85a9mX2GE","bgJAzFFDui","F6PT2ZUnqt","DQimpJ2mQi","45cIHO3iyQ","NhXdugdQsS","cmXIXFLsph","HfyNQVIlwP",
+"AgJHQUl4a1","dQ586Ta8f6","ReKEWZv7z0","aez9ysx5Gl","Zv7z0nnP8o","Y1mC0atef2","iqv4kAkKTk","K20wKCIShG","KASQ80BmCy","2DREswDajX",
+"LbRTHZzJHW","HzZT8lweGy","cL0aEFwEJz","nFqik45cIH","StlDJHzZT8","VLTy6VBjhz","v2eC38cVD3","0ao3lt98iW","uN6r3Q6Lix","atef2zmLYD",
+"guMb88TxD7","580YDaDGtS","2ZHdkvOqCE","14FLRlpF6W","5VZjSQworu","UlU3MCp3mZ","jzUqR14FLR","MmsIo3otm6","NcICAd7vjM","Oz8yZMK07Y",
+"14FLRlkMUA","45cIHix74r","SmGzvQssNC","tlILtRACuj","LbRTHjeskS","0Wr5y29QAz","FjHXR7Ow5C","atef2M6qcG","HRxd814FLR","v2eC3ciuWz",
+"1j5L8D6rBy","ThjNnL7cGc","5Drn09rlg9","8cVD3K4GS8","vOqCE9GXkX","prNT6lViBv","U3yw5vLsmS","JRJQBReKEW","oVQp6jS1aj","ulk41lsQGo",
+"FVMxoCdyBV","8FmFHpiJSk","SbRYyaez9y","ZUnqt7fKYU","WreyP5iGN5","pT8wuFVMxo","FxX9qS2Dfu","ydG8UnFqik","Mm8siDz1R3","zY1GYBFkb8",
+"HzZT8MojnP","ZhwG1atef2","7fsYMdpe1v","StlDJECMvU","QWxoT9iGoT","tuDyS9y4lw","qaofNgIYvE","djsrvn1pmO","P6bcgTXQ0Z","B3qemJ2mQi",
+"xciqpW3VFH","DLhzMjiVBP","K20wK16lHc","Pb1paChuy3","O3iyQeuZA5","FcWrW5ZaEz","JKWYRRBhp0","gjUTujfREu","soy9tlCMxy","gtCA5wiHrZ",
+"yofH3No0Qb","14FLR9XyT9","zY1GYprNT6","VNCPdWaim6","TXQ0ZXyPZN","LewvMksJby","8TxD7lViBv","MojnPqQxHP","HP4334W0Tl","aDGtSCNHmv",
+"Cfgr3QssNC","hYBCKn1pmO","L7cGccShY2","dpe1vBGaQY","tl72WuPX7G","0PktI1v5hH","Dz1R3In3NS","Vprf2azIWp","AOgEeuPX7G","zz4ZU8cVD3",
+"580YDcL0aE","lkMUAQssNC","NhXduW7cTs","xciqpMmsIo","VjCZq9XyT9","7lUXZ0Kyfs","zY1GY7fKYU","O3iyQqQxHP","v1Hlnmz8gx","yluBxCNHmv",
+"tjQxslH1kt","Oz8yZHlUbF","bZLvS5Drn0","K20wKK20wK","I7p2a4dEz6","5iGN5brhlQ","IBe8khYBCK","MGlTF7fsYM","uJScXuTacx","gdQsS2DREs",
+"Y1mC0JJs5m","8cVD3O3iyQ","5drc6jS1aj","bgJAzWDVWJ","DG4sTi7WMQ","8FmFHVLTy6","2ZHdklm0pD","fFDrJksJby","RzaZAOHaBz","4W0TlW3VFH",
+"Mm8siW7cTs","KASQ8OxWIH","lXFOBix74r","ciuWzVprf2","J2mQiNo0Qb","0BmCyxReec","MaJQsZhwG1","dpe1vEdBKc","6q6L9lweGy","QbxXcDG4sT",
+"EOE1oQYxC0","JJs5mqUJMd","QWxoTfaHir","0MR5X7X3uy","Pb1pafmIK1","OUYuFqQxHP","aL6AJWmadA","MmKGJnlaBy","Kr8ysprNT6","zbIYY0Kyfs",
+"TXQ0ZVjCZq","HRxd8iKqhr","DQimpix74r","EOE1oI7p2a","16lHcoQ87r","oVQp6tuDyS","vLsmSHzZT8","Nxx9VpmeCd","lpF6W8U2nU","AkKTk5ZaEz",
+"zbIYY6AFT0","RACujChuy3","dQ586XflUq","lXFOBUlU3M","atef2jtn0X","n8pJ9Ss0Zu","UmaEvJKWYR","lViBvM6qcG","uupzks7Mxk","Yw2oUVLTy6",
+"e6e4zDQimp","lViBv7lUXZ","taOXKb29RJ","tjQxs0h1b1","Ss0ZukZANm","lm0pDi7WMQ","pT8wuTXQ0Z","lkMUAWMiS3","fqypynlaBy","In3NShe9IA",
+"kZANmdjsrv","45cIHS2Dfu","UlU3MSs0Zu","AkKTkwDajX","4QMc9Cfgr3","t98iWQnJ1S","Mm8siQYxC0","9iGoTK20wK","wiHrZsx5Gl","0PktIpiJSk",
+"o8Uyds93Ml","gdQsSuPX7G","LbRTHnnP8o","0PktIZv7z0","XyPZN4QMc9","2Nslmn1pmO","9eoRc16lHc","7fsYMqaofN","UmaEvoGu6x","iB08lydG8U",
+"MK07YguMb8","guMb8BFkb8","oVQp6jSjS3","AmdQdbZLvS","hE1QlQClRL","tl72W7hyVv","h1zcHYOfrY","kB5nPSWfou","Cfgr3pvgjS","XflUqRxrsm",
+"soy9tnFqik","iKqhriB08l","G1RhSMkgy8","Ss0Zudpe1v","ni2v1he9IA","B3qem9iGoT","uZPqgtaOXK","NOHszVBjhz","dQ586Yw2oU","16lHcW7cTs",
+"k85Ae7fsYM","0ao3l0Wr5y","ulk41lm0pD","UlU3MzHF1q","FNYIM8TxD7","MK07YpiJSk","uQIczXyPZN","9rlg924ARF","uvf7AM6qcG","GXdoHFwEJz",
+"m4bxUuupzk","VLTy6Q6hMC","lweGydpe1v","h1zcHhUTw7","MmsIoJ2mQi","dQ586nFqik","jSjS3FGzgp","m4bxUM3zXL","jtn0X0MR5X","Dz1R3tAOsr",
+"No0Qbsoy9t","J2mQin1pmO","uTacx07n1c","BGaQYxciqp","8hJdtb29RJ","FLsphfmIK1","a00b5IBe8k","uPX7GuJScX","zz4ZUt59lR","fqypyAmdQd",
+"X6Pin16lHc","U3yw5d85a9","fFDrJzY1GY","tuDySRBhp0","ZuDtDZUnqt","StlDJ1j5L8","DQimp2Nslm","AkKTk07n1c","jtn0X7fKYU","nFqikgtCA5",
+"o8UydPOUYS","azIWpfLNg8","uQIczsqVrf","lpF6WXyPZN","kZANmpiJSk","rKDLJe6e4z","wiHrZJIqXi","HfyNQ8hJdt","FFDuiuN6r3","Kr8ysm4bxU",
+"4W0TlFLsph","2Yz7E7ku1p","07n1c8cVD3","W7cTscmXIX","wDajXrz7Ut","5ZaEzCIShG","JJs5mM3zXL","FjHXRh1zcH","YOfrYzz4ZU","2ZHdk580YD",
+"aez9yY1mC0","FVMxo0h1b1","29QAzn8pJ9","48cHLQssNC","Ss0ZuazIWp","gdQsSDz1R3","16lHcEdBKc","RmDcr580YD","xciqpuvf7A","ni2v1EdBKc",
+"piJSkNOHsz","ZJTXH618Di","xciqpHRxd8","i7WMQn1pmO","ECMvUmX2GE","s4786uN6r3","JIqXiLDk6f","X6PinIBe8k","JJs5mQClRL","K20wKnFqik",
+"O3iyQjzUqR","taOXKhYBCK","FnPFBy94nw","U3yw5W7cTs","QWxoTcL0aE","uAWypUlU3M","WPmlx0Wr5y","WMiS3tAOsr","RkQkeFGzgp","O3iyQNAFuw",
+"W3VFHsoy9t","9eoRcqaofN","uoStwvkCHH","Y1mC08cVD3","lweGyAgJHQ","ZUnqtQ6Lix","ydG8UYjB9t","2ZHdkv8yFN","TXQ0Z4QMc9","uAWypRmDcr",
+"AmdQd7fsYM","s93Mlgf8rI","3weIF24ARF","XflUqJXljW","ZhwG17fKYU","5drc65IhmG","gf8rIlXFOB","QworuJkzUn","Cfgr3DQimp","uvf7AIjTwP",
+"AmdQdKASQ8","9iGoTuupzk","nlaByvOqCE","Yh1hFokgRi","RpBQmt98iW","hYBCK5nmWv","m4bxUlCMxy","lCMxyS77LH","XyPZNzqH0W","uTacxlCMxy",
+"zmLYDWDVWJ","SmGzvJKWYR","3weIFv2eC3","v8yFNVprf2","IKxdLdQ586","yToGWQ6hMC","AkKTk1LB1L","SWfouMK07Y","L7cGcDG4sT","l83UdlH1kt",
+"NhXdu45cIH","rz7Ut1LB1L","In3NS14FLR","Oz8yZPb1pa","uAWyplH1kt","dmoS7IKxdL","guMb8OHaBz","aez9yoVQp6","zHF1qKASQ8","24ARFm4bxU",
+"HRxd8UlU3M","14FLRUl4a1","HRxd8GXdoH","lXFOBQworu","5drc6okgRi","AgJHQ0ao3l","mX2GEU3yw5","jSjS3Yh1hF","tjQxsVIlwP","suY4x6AFT0",
+"HzZT8tl72W","jtn0XWMiS3","6q6L9OUYuF","x3LDelCMxy","8cVD3D6rBy","Oz8yZl83Ud","QWxoTSjskQ","JXljW4W0Tl","7ku1pxReec","VjCZqFjHXR",
+"m4bxUv1Hln","qQxHPb29RJ","y94nwCK5W7","5iGN55nmWv","3weIFW3VFH","Cfgr3Q6hMC","Rxrsm45cIH","6q6L9QssNC","2TRI7nnP8o","OHaBzMmKGJ",
+"FxX9q5iGN5","v2eC3rz7Ut","Yw2oU55rfB","BCxeCPYBf4","5iGN5GXdoH","SmGzvdhSuH","d85a9EdBKc","MaJQsMmsIo","Ul4a1gtCA5","yToGW3otm6",
+"uPX7Glj07Q","L7cGc5drc6","IBe8kYjB9t","lweGyAXpwE","uAWypYw2oU","VIlwPiqv4k","Dz1R3ru4UG","faHirDz1R3","CNHmv1LB1L","zz4ZUyluBx",
+"CK5W7Y1mC0","v2eC3yluBx","29QAzDz1R3","zqH0WCqqaD","FFDuiNOHsz","Z4I1vtaOXK","RzaZAIjTwP","9eoRcsqVrf","nFqikzY1GY","iqv4kvOqCE",
+"Ss0ZuJ2mQi","tjQxsOz8yZ","RmDcrgdQsS","0Wr5yFLsph","AXpwEt98iW","x3LDefcwDa","Q6Lix07n1c","jtn0XGrDg7","0Kyfs9iGoT","C2IrcG1RhS",
+"kB5nPtvdkD","zY1GYS2Dfu","n1pmOtl72W","KZamHlCMxy","pvgjSgdQsS","POUYShi5X7","5nmWvSWfou","Q6Lix9eoRc","ni2v1Ss0Zu","O3iyQWmadA",
+"cL0aE9rlg9","2DREsjfREu","n1pmO9y4lw","1j5L8uoStw","ZuDtDnFqik","jfREuzmLYD","gIYvEOHaBz","s93MlXflUq","D6rByYOfrY","9eoRcpT8wu",
+"5Drn0Nxx9V","5drc6IKxdL","D6rByDG4sT","2hEEUQssNC","Ul4a1JXljW","iB08lBGaQY","Oz8yZEoToP","Nxx9VK20wK","ulk41RpBQm","1v5hHIRh48",
+"FVMxoatef2","VerEAU3yw5","VerEAC2Irc","F6PT2t98iW","JIqXiSbRYy","brhlQfcJOy","0MR5XsuY4x","BFkb8qaofN","TwanouN6r3","FnPFBfFDrJ",
+"xciqpRzaZA","VerEAjfREu","6AFT0MK07Y","0Wr5y0YAGH","zHF1qIBe8k","1LB1LvkCHH","KASQ84QMc9","tuDySfcwDa","t98iWeuZA5","OxWIHpiJSk",
+"WmadAEdBKc","0Wr5yDG4sT","ydG8U0YAGH","pT8wuCdyBV","Uvlv4fcJOy","RACujsqVrf","ReKEWuLtKs","ZuDtDcmXIX","QnJ1SOxWIH","y94nwHzZT8",
+"b29RJn1pmO","fqypyW3VFH","pvgjSUvlv4","fcwDaNcICA","MmKGJdmoS7","iB08lfLNg8","QChxsCdyBV","aL6AJW7cTs","Pb1padpe1v","h1zcHdmoS7",
+"gjUTuCxVEf","pv0i7iwzGk","lkMUAyofH3","8FmFHlViBv","BGaQYciuWz","vOqCE1j5L8","Waim6sx5Gl","jtn0XksJby","7hyVvfaHir","kB5nP9iGoT",
+"RACujDG4sT","4W0Tl9GXkX","qaofNFcWrW","GWqqXfmIK1","mz8gxBbwgA","M6qcGMkgy8","zHF1qtlILt","Kr8ysOz8yZ","TwanoOxWIH","BFkb8ZUnqt",
+"VIlwPWreyP","uLtKsZzJHW","VjCZquoStw","uTacxsoy9t","5Mg9r4W0Tl","7X3uymX2GE","dhSuHhYBCK","Q6hMCpiJSk","FwEJzdhSuH","lkMUACIShG",
+"ni2v1AOgEe","rKDLJNhXdu","0YAGHUvlv4","7fKYUaez9y","Cp3mZn8pJ9","LewvMDQimp","G1RhSAIYUu","WMiS3ix74r","KsjRK0BmCy","29QAzVerEA",
+"LbRTHatef2","wDajXZhwG1","QClRLt59lR","2NslmQWxoT","RzaZACxVEf","uLtKsBbwgA","GXdoHlj07Q","Y1mC0IKxdL","hYBCK9iGoT","1LB1LuAWyp",
+"1LB1LRxrsm","GrDg7piJSk","lViBvlpF6W","zHF1qiqv4k","YjB9td7vjM","CdyBV9GXkX","pFrrl0MR5X","qUJMdtl72W","tuDyStAOsr","U3yw507n1c",
+"Q6hMCvOqCE","7fKYUgdQsS","XflUqRsQUq","9XyT9Y1mC0","iwzGk2hEEU","pmeCdsuY4x","jtn0XtuDyS","Nxx9VFhtgl","uZPqg0BmCy","JKWYRAOgEe",
+"6q6L91j5L8","lm0pDFcWrW","i3pydjiVBP","yofH3ZzJHW","S2Dfu9iGoT","i3pydZUnqt","Yf2EcUl4a1","uJScXsuY4x","qaofN0YAGH","QnJ1SQ6Lix",
+"YjB9tJJs5m","Mm8sipAhR1","OUqFM29QAz","t59lR1LB1L","LewvMfcwDa","29QAzs7Mxk","W3VFHgjUTu","jzUqRQClRL","pT8wuqaofN","CxVEfNcICA",
+"hE1QlWaWsv","Cfgr3OUqFM","ZhwG1gjUTu","9GXkX5ZaEz","oVQp65nmWv","lCMxy5VZjS","gjUTuZJTXH","618DiOz8yZ","QWxoTSWfou","Z4I1vs93Ml",
+"RACujmz8gx","fLNg8PYBf4","gdQsSfmIK1","LewvMJRJQB","jSjS3Z4I1v","YjB9tW3VFH","pAhR1e6e4z","DLhzM2hEEU","W7cTslm0pD","JRJQB5Mg9r",
+"WreyPK4GS8","QnJ1S5VZjS","KASQ8xciqp","9iGoTVBjhz","Yf2Ecs93Ml","Yw2oUx3LDe","580YDuJScX","I7p2ayluBx","BFkb8FPfSE","lm0pDa00b5",
+"jtn0XmX2GE","BCxeCsqVrf","AXpwEfLNg8","FhtglQYxC0","LewvMOxWIH","cL0aEIjTwP","s7MxkoGu6x","hYBCKogLgc","blLA9In3NS","POUYSHzZT8",
+"pv0i7ZhwG1","J2mQiFxX9q","0ao3lt59lR","lj07QQYxC0","O3iyQX6Pin","5drc6gdQsS","s7MxkcQOnv","guMb855rfB","tAOsrChuy3","8cVD3DcpWB",
+"rhl0JJIqXi","X6PinpWiOs","G1RhSMK07Y","tjQxsFGzgp","VNCPdGSQwj","lCMxyFGzgp","Mkgy8MK07Y","vkCHH8hJdt","Uvlv4hSSvQ","azIWp5Mg9r",
+"HfyNQYjB9t","6q6L9v1Hln","OUYuFciuWz","pv0i77Ow5C","oVQp6IRh48","QWxoTgdQsS","UlU3M9y4lw","FxX9qFxX9q","Yf2EcyToGW","OHaBz8cVD3",
+"hi5X7Q6hMC","zFgtBk85Ae","iKqhrcShY2","In3NSWDVWJ","cmXIXS77LH","In3NSAXpwE","3otm6zmLYD","AkKTk9GXkX","F6PT2blLA9","zHF1qlj07Q",
+"StlDJfcwDa","lsQGot98iW","gdQsSJXljW","G1RhSlweGy","bgJAzGv3Fq","k85Aeiqv4k","5Drn0ogLgc","VIlwPzQt6Q","IBe8kv2eC3","AgJHQnFqik",
+"L7cGcFcWrW","AkKTktjQxs","OUYuFGWqqX","qQxHPfaHir","DQimpBbwgA","tjQxsuJScX","WaWsvsqVrf","zmLYDpAhR1","GWqqXWDVWJ","MmKGJbrhlQ",
+"AXpwEtvdkD","7hyVv1LB1L","VIlwPciuWz","oVQp6yEfy9","O3iyQMaJQs","TwanoNhXdu","RpBQmHRxd8","8U2nUCdyBV","brhlQiB08l","Cfgr3CdyBV",
+"lViBvNhXdu","JJs5m6q6L9","2ZHdkiqv4k","NhXdupFrrl","GrDg7oGu6x","FwEJzyToGW","WmadA580YD","Dz1R3ksJby","d7vjMoGu6x","ogLgcNcICA",
+"he9IAFwEJz","EdBKcvLsmS","FVMxouTacx","FcWrW0Wr5y","zqH0Wa00b5","YOfrYRxrsm","lsQGoPb1pa","D6rByMojnP","FNYIMWDVWJ","uLtKs2ZHdk",
+"0h1b1Uvlv4","EOE1oGv3Fq","cmXIXDLhzM","In3NS3weIF","3weIF4QMc9","JJs5mOxWIH","lViBvdmoS7","DcpWB8RCUA","VBjhzksJby","Oz8yZJKWYR",
+"BpYhVOxWIH","l83UdzmLYD","O3iyQFVMxo","dhSuH7hyVv","8RCUAl83Ud","fqypyP6bcg","3otm60ao3l","GrDg77lUXZ","7fKYUZJTXH","ciuWzG1RhS",
+"FnPFB9iGoT","tuDySlkMUA","suY4xPb1pa","bZLvSQYxC0","XflUqFjHXR","C2IrcGXdoH","taOXKzQt6Q","MezSWcL0aE","rKDLJ0YAGH","MojnP7X3uy",
+"CqqaD8RCUA","dhSuHDQimp","lsQGo5drc6","gf8rIkB5nP","5Drn0yluBx","sqVrfSWfou","G1RhSKsjRK","SmGzvCK5W7","4dEz6FNYIM","jfREui7WMQ",
+"GSQwjQbxXc","cQOnvuQIcz","WPmlxkB5nP","gdQsSOHaBz","AXpwEpFrrl","QbxXc24ARF","POUYSVerEA","jfREuRkQke","l83Udt98iW","fLNg8I7p2a",
+"RsQUq2ZHdk","LDk6flXFOB","pFrrlnlaBy","580YD9XyT9","Zv7z0tvdkD","AOgEeRmDcr","0Wr5yFwEJz","QWxoTaFFss","l83Ud8U2nU","8TxD7Nxx9V",
+"2NslmMmsIo","3weIF48cHL","o8UydHfyNQ","1j5L80ao3l","xReecOz8yZ","F6PT2wiHrZ","No0QbcShY2","uAWypeuZA5","FLsphGv3Fq","oQ87rjeskS",
+"9rlg9iKqhr","KsjRKi7WMQ","sx5GlrKDLJ","faHiraez9y","guMb8JRJQB","l83UdIn3NS","lm0pDMGlTF","qaofN8hJdt","5VZjSGXdoH","14FLRWMiS3",
+"7ku1p0PktI","Vprf2LbRTH","he9IA5IhmG","fqypyjzUqR","iKqhrMK07Y","POUYS2ZHdk","HP433ru4UG","ZhwG1W3VFH","zQt6QcL0aE","lsQGofcJOy",
+"l83UdAIYUu","Z4I1vsoy9t","fFDrJCIShG","5Mg9rlj07Q","CIShGuZPqg","VBjhzMmsIo","ZuDtDChuy3","blLA9AOgEe","fcwDaoQ87r","jiVBP5Namm",
+"wDajXtuDyS","O3iyQ2ZHdk","NcICAGv3Fq","KZamHSbRYy","F6PT2JkzUn","rKDLJh1zcH","VLTy6EdBKc","Chuy3h1zcH","suY4xLDk6f","nlaBy8FmFH",
+"UlU3MlpF6W","fcwDaAOgEe","HP433ogLgc","xXTI4guMb8","dhSuHOz8yZ","aL6AJ2DREs","gf8rIt98iW","2DREsJkzUn","d85a97ku1p","FLsph55rfB",
+"cL0aEM3zXL","Mkgy89GXkX","zbIYYChuy3","FVMxo0Kyfs","v2eC3U3yw5","tjQxsCfgr3","pvgjS14FLR","dpe1vjfREu","aL6AJlH1kt","aL6AJlCMxy",
+"y94nw0PktI","48cHLOHaBz","i7WMQ29QAz","NAFuwvOqCE","tl72WIKxdL","aDGtSNo0Qb","48cHLMezSW","48cHL6q6L9","HRxd8JIqXi","B3qemyluBx",
+"14FLRNOHsz","oVQp6a00b5","FFDuipAhR1","8cVD3ni2v1","Cfgr3oVQp6","aez9yuZPqg","IjTwPYf2Ec","kZANmNhXdu","AOgEeLDk6f","POUYScShY2",
+"In3NSUlU3M","7lUXZtAOsr","dmoS7lpF6W","29QAzQworu","CqqaDgf8rI","9XyT9pFrrl","QYxC0jS1aj","5Drn0fmIK1","kZANmaez9y","cQOnv9eoRc",
+"hSSvQjzUqR","RpBQmZUnqt","kB5nPwiHrZ","Q6hMCUlU3M","pmeCdjS1aj","MK07YSjskQ","0YAGHuQIcz","s93MlRpBQm","ogLgcTa8f6","K20wKD6rBy",
+"uupzkuQIcz","cShY2Ta8f6","fLNg8a00b5","ZuDtDfmIK1","uoStw9iGoT","pv0i7aFFss","KASQ8ReKEW","ciuWzfaHir","ZzJHWS2Dfu","mX2GEyEfy9",
+"m4bxUNxx9V","WDVWJWmadA","TwanoWDVWJ","cmXIXd85a9","FjHXRuvf7A","CNHmvrKDLJ","uupzkSjskQ","XflUqUvlv4","8cVD3XyPZN","5ZaEz9GXkX",
+"M3zXLpmeCd","tjQxsgf8rI","2DREslweGy","QWxoTYf2Ec","uvf7Apv0i7","TXQ0ZTa8f6","P6bcgyToGW","XyPZNBGaQY","EoToPzQt6Q","SjskQ7Ow5C",
+"5iGN5DG4sT","POUYSSmGzv","GrDg7jS1aj","tjQxsgjUTu","t59lRuLtKs","JKWYRyEfy9","9XyT9L7cGc","prNT6l83Ud","24ARFWreyP","HlUbFn8pJ9",
+"EoToPNhXdu","AkKTkQbxXc","ix74rcmXIX","Oz8yZX6Pin","SjskQ0MR5X","uN6r37fsYM","FGzgpOUYuF","M6qcGF6PT2","rhl0JGXdoH","HP433jiVBP",
+"HlUbFzbIYY","FLsphpFrrl","yluBxzmLYD","yvOMIi7WMQ","BGaQYQworu","D6rByRACuj","Vprf2FcWrW","Oz8yZGXdoH","zbIYYHlUbF","FhtglpWiOs",
+"AOgEeaL6AJ","vkCHHfFDrJ","Kr8ysi7WMQ","RBhp0QWxoT","VerEARmDcr","fLNg8MmKGJ","48cHLIn3NS","55rfBHRxd8","NOHszIjTwP","S77LHO3iyQ",
+"nnP8oGWqqX","jeskSogLgc","VNCPd0Wr5y","29QAzbgJAz","7ku1p7Ow5C","rhl0J8hJdt","W7cTs8xEKz","ZhwG1Ss0Zu","GWqqXLbRTH","uoStwo8Uyd",
+"rhl0JU3yw5","s7MxkJKWYR","0Wr5ygf8rI","DcpWBru4UG","uvf7ApmeCd","tjQxsU3yw5","Q6hMCXflUq","NAFuwUvlv4","ix74rJIqXi","lpF6Wi3pyd",
+"lsQGoJkzUn","n8pJ9Ul4a1","ZuDtDulk41","Kr8ysiKqhr","U3yw5StlDJ","HfyNQtvdkD","kZANmzqH0W","v8yFNhSSvQ","s93MlKsjRK","qUJMdJJs5m",
+"HzZT8lpF6W","6q6L9zHF1q","FLsphJXljW","CqqaD2DREs","vkCHHStlDJ","l83UdQ6Lix","bZLvSbgJAz","AXpwEOxWIH","zmLYDRpBQm","qQxHPaez9y",
+"y94nwAIYUu","PYBf4Cfgr3","ECMvUWreyP","FGzgp0ao3l","i3pydtuDyS","gf8rI0PktI","Chuy3dQ586","WreyP14FLR","FwEJzRkQke","DQimpFFDui",
+"1j5L8dpe1v","FcWrWxXTI4","RsQUqcL0aE","HP433D6rBy","djsrvO3iyQ","CNHmv9XyT9","tjQxsaez9y","8TxD7XflUq","iqv4kJ2mQi","HfyNQFNYIM",
+"zQt6QpvgjS","FGzgpjzUqR","uJScXuupzk","KZamHprNT6","QChxsiB08l","4W0TlSjskQ","7Ow5CzbIYY","8hJdtFxX9q","aL6AJtuDyS","fmIK1o8Uyd",
+"F6PT2uQIcz","hi5X7yEfy9","ZhwG1SjskQ","LDk6fRACuj","jS1ajbrhlQ","jtn0X5nmWv","SmGzvrKDLJ","5VZjSMmKGJ","uN6r37X3uy","Cfgr3RzaZA",
+"Waim69eoRc","QworuB3qem","8U2nUJKWYR","S77LHW7cTs","YjB9t7Ow5C","3otm6JKWYR","lweGyM3zXL","2Yz7EAIYUu","Cfgr3LDk6f","BCxeCL7cGc",
+"pv0i7L7cGc","BFkb8HlUbF","L7cGcrz7Ut","dpe1vMkgy8","qaofNMGlTF","Vprf2n8pJ9","WDVWJWaim6","QYxC08cVD3","ogLgcnFqik","4W0TlAIYUu",
+"8TxD7ZuDtD","24ARFzFgtB","1j5L8wiHrZ","GrDg70MR5X","vkCHHRmDcr","aez9yjeskS","bZLvSOUqFM","VNCPdhe9IA","RxrsmRpBQm","tjQxsECMvU",
+"mz8gxS77LH","Ul4a1POUYS","euZA5VerEA","s7Mxkix74r","s7MxkChuy3","Ul4a17ku1p","Chuy3kB5nP","S77LHVjCZq","Z4I1vfLNg8","hYBCKvLsmS",
+"7lUXZfaHir","YjB9t0MR5X","pAhR1Y1mC0","uPX7G0ao3l","gIYvEX6Pin","lpF6Wy94nw","RzaZAtAOsr","B3qemprNT6","No0QbKsjRK","n1pmOFGzgp",
+"JJs5mO3iyQ","b29RJb29RJ","WPmlxtAOsr","RsQUqs93Ml","fcwDani2v1","UlU3MQChxs","WaWsvTXQ0Z","pv0i7oGu6x","bgJAzNcICA","M6qcGMmKGJ",
+"Yh1hFb29RJ","S77LHCp3mZ","IRh48bgJAz","M3zXLguMb8","a00b5Ul4a1","55rfBF6PT2","0BmCyqQxHP","NcICAFcWrW","5nmWv580YD","rKDLJUmaEv",
+"kB5nPIRh48","Nxx9VuTacx","UmaEvRBhp0","KASQ8bZLvS","64s8NuQIcz","pFrrlZzJHW","RzaZAo8Uyd","CdyBVk85Ae","AOgEezY1GY","jSjS3yofH3",
+"JKWYREOE1o","TXQ0Z8hJdt","8RCUAuAWyp","tAOsrQnJ1S","618DiU3yw5","h1zcHP6bcg","lm0pDtjQxs","MezSWRsQUq","6AFT03weIF","hUTw7iwzGk",
+"RmDcrgIYvE","oGu6xvOqCE","2Yz7Ehe9IA","AOgEeZUnqt","8U2nU8RCUA","k85AeO3iyQ","x3LDee6e4z","Uvlv4C2Irc","I7p2acL0aE","UmaEvFLsph",
+"Pb1panlaBy","1v5hHi7WMQ","QClRLrKDLJ","nlaByaL6AJ","rz7UtAOgEe","pT8wu8TxD7","7X3uyzQt6Q","pvgjS2ZHdk","jeskSdpe1v","ix74rCfgr3",
+"FLsphFjHXR","lXFOBoGu6x","K20wKiB08l","jiVBPLbRTH","pmeCdIBe8k","QClRL0PktI","lweGyRACuj","M6qcGyofH3","ix74rX6Pin","zQt6QZzJHW",
+"JRJQBzQt6Q","4dEz6pWiOs","55rfBv1Hln","xciqpYh1hF","AkKTkJ2mQi","DQimpi7WMQ","h1zcHzz4ZU","gdQsSsx5Gl","CdyBVdhSuH","jtn0Xmz8gx",
+"4dEz62ZHdk","Mkgy8Gv3Fq","HfyNQsqVrf","fcwDaGWqqX","Kr8ysNcICA","HRxd8DG4sT","0BmCy5nmWv","zQt6QlH1kt","aDGtSaez9y","mz8gxCxVEf",
+"lweGySjskQ","7fsYMAXpwE","IBe8kvOqCE","ksJbyAkKTk","Q6LixFVMxo","lm0pDSs0Zu","rz7UtpvgjS","7lUXZ7fKYU","dpe1vru4UG","a00b5W3VFH",
+"fmIK1aL6AJ","CqqaDwDajX","2ZHdkksJby","2hEEUyluBx","JJs5muvf7A","zz4ZUwiHrZ","HP433MojnP","Q6LixZJTXH","9y4lwW3VFH","pFrrlfcJOy",
+"FnPFBFLsph","BCxeCdmoS7","2Yz7EuAWyp","dmoS7G1RhS","RmDcrQ6hMC","6AFT0pmeCd","Oz8yZ580YD","fFDrJaFFss","AgJHQkZANm","zbIYYRpBQm",
+"jzUqRThjNn","RzaZA8U2nU","FLsphHRxd8","QssNCJRJQB","55rfBFwEJz","taOXKTa8f6","1v5hHGSQwj","QChxsfqypy","aFFssWMiS3","4W0TljfREu",
+"0KyfsrKDLJ","zY1GYaL6AJ","Zv7z0AXpwE","KZamHHRxd8","U3yw5fLNg8","vLsmSFVMxo","euZA5y94nw","zY1GYLDk6f","Ul4a1ZhwG1","HRxd8ReKEW",
+"BbwgAnnP8o","mz8gxyofH3","QbxXcksJby","uTacxtAOsr","5Namm1LB1L","lm0pDMezSW","ix74r5drc6","CIShGzY1GY","fcJOyK20wK","BpYhVTXQ0Z",
+"IKxdLfFDrJ","KZamHWDVWJ","8U2nUEdBKc","brhlQpvgjS","SjskQgdQsS","POUYSuN6r3","EoToPsoy9t","8U2nUs7Mxk","d85a9TXQ0Z","JJs5mVjCZq",
+"MaJQsIjTwP","9eoRcgtCA5","8U2nUtAOsr","jSjS3BpYhV","oQ87r2TRI7","RBhp0k85Ae","7hyVvogLgc","guMb8MezSW","uoStwVprf2","iB08lGWqqX",
+"sqVrfbZLvS","kZANmpv0i7","WmadAjzUqR","VjCZq2Nslm","tvdkD5Drn0","mX2GEo8Uyd","fcwDaHRxd8","gIYvEHlUbF","i3pydBFkb8","d85a9aL6AJ",
+"fcJOy5Drn0","4W0TluJScX","Dz1R3NhXdu","OxWIH2hEEU","MmKGJ0YAGH","kB5nP29QAz","DLhzMqaofN","fcJOy8cVD3","he9IA5Drn0","0Wr5yx3LDe",
+"rKDLJ2TRI7","0h1b17lUXZ","vOqCEbZLvS","tl72WpmeCd","RmDcr5drc6","guMb8NhXdu","5iGN51j5L8","P6bcgoQ87r","WreyP0h1b1","VLTy6Yf2Ec",
+"0MR5XBbwgA","MGlTFoGu6x","aez9yuQIcz","a00b5uupzk","MGlTFyofH3","5nmWvkZANm","v8yFNuJScX","Twanos7Mxk","MmsIo0BmCy","WPmlxRsQUq",
+"K4GS88U2nU","SmGzv3otm6","Z4I1vLbRTH","s4786Vprf2","VLTy6tAOsr","FGzgptl72W","AXpwEn8pJ9","Gv3FquN6r3","7fsYMuQIcz","2Nslm16lHc",
+"Kr8ysjS1aj","07n1cm4bxU","uvf7AzbIYY","Waim6QYxC0","QWxoT4QMc9","JkzUnGv3Fq","G1RhSG1RhS","uAWyp8cVD3","lH1ktRxrsm","3weIFC2Irc",
+"6AFT0uZPqg","bZLvSzqH0W","pmeCdHP433","rz7Utni2v1","d7vjMydG8U","0KyfsazIWp","n8pJ9CNHmv","sx5GleuZA5","cQOnvmX2GE","atef2MGlTF",
+"tAOsr6AFT0","I7p2at98iW","gtCA58hJdt","euZA5VNCPd","pv0i7Qworu","t98iWru4UG","zFgtB24ARF","jS1aj7fsYM","kZANmrhl0J","h1zcHv2eC3",
+"0KyfsRACuj","FcWrWFPfSE","RsQUq7X3uy","VLTy6kB5nP","hYBCKCK5W7","uZPqgi3pyd","azIWpDQimp","mz8gxjeskS","Kr8ys8RCUA","0Kyfshe9IA",
+"vLsmSF6PT2","SmGzvB3qem","Twano4W0Tl","ThjNn0ao3l","ydG8Urz7Ut","faHiro8Uyd","ZzJHWlweGy","PYBf4gdQsS","QbxXcPOUYS","B3qemfFDrJ",
+"0ao3lVprf2","gjUTuQnJ1S","fFDrJaDGtS","l83UdEoToP","24ARFOUqFM","580YDRsQUq","t59lRFPfSE","yEfy9Nxx9V","VerEAhe9IA","FcWrWkZANm",
+"aL6AJvkCHH","yvOMIDcpWB","Zv7z0Mm8si","fFDrJkZANm","7ku1pyluBx","iB08lJKWYR","6AFT0gf8rI","GWqqXFjHXR","rz7UtlXFOB","GXdoHUvlv4",
+"oQ87rvLsmS","dmoS7DG4sT","VIlwP9rlg9","guMb80ao3l","0YAGHjzUqR","7fKYUoQ87r","HP433ZzJHW","ECMvUnnP8o","WDVWJ7Ow5C","Oz8yZCfgr3",
+"6q6L99XyT9","9y4lwguMb8","tuDySJIqXi","6AFT00BmCy","ni2v1zY1GY","In3NSzqH0W","WmadA1LB1L","iwzGkpvgjS","y94nw0YAGH","3weIFP6bcg",
+"WMiS3piJSk","Uvlv4h1zcH","No0QbciuWz","oVQp62Nslm","ksJbyqUJMd","t98iWECMvU","lweGyFhtgl","Mkgy82Nslm","uAWypMm8si","he9IAQnJ1S",
+"jzUqRWMiS3","Zv7z0O3iyQ","zHF1qVjCZq","VerEADQimp","iqv4kW3VFH","Ul4a1lsQGo","Mkgy8P6bcg","RzaZAiB08l","SjskQbgJAz","cL0aEiwzGk",
+"aL6AJOUqFM","NAFuwm4bxU","uZPqguAWyp","rhl0JTCgPp","5drc6LewvM","aFFssuupzk","6AFT0azIWp","Kr8ysLDk6f","NOHszCdyBV","EOE1ofqypy",
+"cmXIXYw2oU","fcwDaFjHXR","0h1b1HRxd8","NcICAprNT6","hi5X7dmoS7","s4786QnJ1S","0h1b1qUJMd","55rfBcmXIX","IKxdLJkzUn","VNCPdGXdoH",
+"kZANm7ku1p","K20wKSbRYy","3weIFlj07Q","YOfrYK4GS8","soy9t8hJdt","uupzkpWiOs","0h1b1Ul4a1","FPfSEkB5nP","Nxx9V9iGoT","FjHXR5Namm",
+"pAhR148cHL","qUJMdIjTwP","9GXkX5iGN5","jiVBPsx5Gl","VNCPdpAhR1","4QMc9BCxeC","Uvlv4zY1GY","TXQ0ZQChxs","2hEEUbZLvS","tjQxsTa8f6",
+"Oz8yZgjUTu","h1zcHRxrsm","he9IANhXdu","BbwgAhi5X7","24ARFC2Irc","oQ87rpFrrl","wDajXtvdkD","FhtglVBjhz","AXpwEZJTXH","8U2nUXyPZN",
+"QworuJRJQB","JkzUnW3VFH","5nmWvMmKGJ","jzUqRzz4ZU","SbRYyJIqXi","0MR5X2hEEU","uPX7Grz7Ut","d7vjMOUYuF","8cVD3P6bcg","sqVrf9GXkX",
+"mX2GEQClRL","uJScXMm8si","BFkb8I7p2a","No0QbYf2Ec","Yw2oU0ao3l","he9IAUl4a1","G1RhSTCgPp","WaWsvZuDtD","i3pydtlILt","8U2nUpFrrl",
+"GrDg7atef2","v1HlnCdyBV","55rfBpAhR1","In3NSRpBQm","iB08liwzGk","AXpwEL7cGc","8TxD7oVQp6","3weIFuAWyp","GrDg7lCMxy","cQOnvciuWz",
+"lH1ktNcICA","VIlwP7hyVv","oVQp6KASQ8","hE1Qlatef2","l83UdZuDtD","2Yz7EnFqik","aFFss7Ow5C","aDGtS1LB1L","xReecHzZT8","fcJOy8hJdt",
+"okgRi48cHL","Gv3FqBFkb8","CdyBVQWxoT","VNCPd6AFT0","QClRLi3pyd","NhXduVNCPd","7hyVvjeskS","cL0aE7X3uy","QWxoT2DREs","zmLYD8xEKz",
+"VerEAlCMxy","SWfousqVrf","gIYvEKr8ys","lj07QGrDg7","h1zcHReKEW","uQIcz48cHL","rz7UtfLNg8","pWiOsOHaBz","CIShGNxx9V","fcwDaMK07Y",
+"soy9tThjNn","VLTy6tuDyS","D6rBydpe1v","CIShGEOE1o","bgJAzThjNn","prNT6MaJQs","ZUnqtciuWz","fFDrJzbIYY","W7cTsPOUYS","1j5L8MezSW",
+"zFgtBm4bxU","cL0aEuLtKs","S77LHfcJOy","lH1ktx3LDe","9iGoTtuDyS","jSjS3NcICA","3otm6FNYIM","nlaByk85Ae","S77LHix74r","EOE1oJJs5m",
+"M6qcGxReec","jeskSZuDtD","zFgtBMmKGJ","6AFT00h1b1","zY1GYksJby","QWxoTuoStw","BCxeCdhSuH","uTacxKASQ8","CdyBVuupzk","LDk6fQ6Lix",
+"aez9ySmGzv","9y4lwtuDyS","2ZHdkd7vjM","MojnPEOE1o","TXQ0Z2hEEU","VerEA5nmWv","kZANm9rlg9","5nmWvVBjhz","dQ586FPfSE","0h1b1VNCPd",
+"I7p2a2DREs","ZzJHWo8Uyd","48cHLuLtKs","JRJQB2Nslm","hUTw7gdQsS","a00b5VBjhz","sx5GlMaJQs","b29RJ2DREs","EOE1oWMiS3","Chuy39rlg9",
+"IRh48In3NS","aDGtSl83Ud","KsjRKjS1aj","OHaBzuPX7G","SbRYyVerEA","IKxdLAXpwE","ulk41WaWsv","lkMUAh1zcH","ReKEWMezSW","6q6L9xXTI4",
+"B3qemlsQGo","CqqaD8cVD3","5IhmGW7cTs","3otm6EOE1o","KASQ8tlILt","07n1c2hEEU","yEfy9MGlTF","S2Dfuo8Uyd","VerEAUl4a1","Mm8sihE1Ql",
+"AXpwECfgr3","SWfouQ6hMC","bgJAz5Namm","Pb1paJkzUn","GrDg7dhSuH","AOgEelm0pD","uJScXStlDJ","HP433jSjS3","Zv7z0m4bxU","NhXdu5iGN5",
+"NOHszpWiOs","8TxD7Cp3mZ","bgJAzOUqFM","aL6AJ29QAz","Kr8ysZv7z0","Nxx9VLbRTH","VjCZq4QMc9","YOfrYuN6r3","AgJHQpFrrl","TCgPp2ZHdk",
+"jtn0Xo8Uyd","vLsmSjeskS","9rlg9uZPqg","7fKYU0Kyfs","16lHcGSQwj","ZUnqtMkgy8","QnJ1SKZamH","WmadAVerEA","sqVrf5Namm","uLtKsFwEJz",
+"GrDg7F6PT2","ThjNnkB5nP","FxX9qSWfou","Y1mC0VLTy6","WreyPHP433","SmGzvOxWIH","s93MluAWyp","ReKEW29QAz","lpF6WaDGtS","uN6r3OUYuF",
+"GXdoHb29RJ","UlU3MeuZA5","LewvMtaOXK","8U2nU64s8N","zY1GYhE1Ql","piJSklkMUA","bgJAzRBhp0","guMb8GXdoH","1LB1LFnPFB","StlDJjSjS3",
+"WmadAL7cGc","suY4xhE1Ql","8cVD3Ul4a1","ZuDtDW7cTs","tAOsrqUJMd","iKqhrzmLYD","v8yFNlm0pD","Mkgy8e6e4z","xReecGSQwj","iwzGk7X3uy",
+"0YAGHYw2oU","lm0pDcmXIX","uJScXuAWyp","SjskQmX2GE","8RCUAcL0aE","GrDg7n1pmO","Q6LixazIWp","m4bxUFwEJz","a00b507n1c","QbxXcd7vjM",
+"FPfSE5IhmG","8cVD3fcwDa","Zv7z0e6e4z","uAWypdhSuH","t98iW7Ow5C","e6e4zJ2mQi","tAOsrYf2Ec","AOgEepmeCd","1v5hHiKqhr","IKxdLRBhp0",
+"QChxsKr8ys","VIlwPThjNn","AkKTkQ6Lix","Kr8ys1v5hH","M3zXLJIqXi","uN6r3pT8wu","8hJdtaDGtS","RmDcrFNYIM","5Nammsoy9t","Y1mC04W0Tl",
+"zz4ZUNcICA","Mkgy8lCMxy","TCgPpfaHir","9eoRcO3iyQ","K20wKDcpWB","2ZHdkl83Ud","QbxXc4W0Tl","7Ow5CVNCPd","qUJMdv2eC3","16lHcB3qem",
+"RkQkekB5nP","VNCPdy94nw","i3pydIn3NS","ZUnqtEdBKc","oQ87rdpe1v","Uvlv4aDGtS","8xEKzTCgPp","gIYvEfLNg8","7lUXZoQ87r","iKqhreuZA5",
+"d85a9ulk41","8FmFHhe9IA","MmsIoIn3NS","8cVD3hSSvQ","EoToP5Namm","POUYSaDGtS","8TxD7Waim6","uZPqgMkgy8","lViBvFjHXR","mz8gxyEfy9",
+"t59lRbZLvS","5ZaEzmz8gx","Rxrsm5Namm","ZhwG1rKDLJ","xReecjeskS","gtCA55nmWv","YOfrYBCxeC","FcWrWxciqp","lpF6WFLsph","AOgEeMkgy8",
+"KsjRK5IhmG","55rfBLDk6f","gjUTuFxX9q","piJSk9eoRc","taOXKd7vjM","Mm8siF6PT2","7Ow5CkZANm","jfREujeskS","7ku1ptvdkD","uupzkni2v1",
+"faHir24ARF","fmIK1soy9t","uupzkQChxs","YjB9tDG4sT","FwEJz7Ow5C","zmLYD48cHL","9eoRcVprf2","5Mg9rtl72W","vLsmSBbwgA","zY1GYUlU3M",
+"nnP8o8TxD7","FNYIMt59lR","JIqXiYw2oU","uTacxRzaZA","IjTwPsoy9t","prNT6fFDrJ","5VZjS16lHc","h1zcHMkgy8","WMiS30YAGH","FLsphyEfy9",
+"Yw2oUGrDg7","cQOnv5Mg9r","Gv3Fqm4bxU","s93MlCIShG","RBhp0s4786","pFrrlYOfrY","aez9yWMiS3","GWqqXVIlwP","9GXkXwDajX","dhSuHn1pmO",
+"Chuy3ReKEW","55rfBhSSvQ","ECMvU8xEKz","yToGWAIYUu","pFrrlqaofN","vLsmSyToGW","WDVWJ9iGoT","he9IAW7cTs","Yf2Ec4W0Tl","BbwgAWMiS3",
+"6q6L9y94nw","KZamHb29RJ","NOHszMkgy8","ulk41EdBKc","Uvlv4LewvM","VLTy62DREs","ZuDtDlViBv","DQimppmeCd","1j5L8HzZT8","Q6LixJ2mQi",
+"ydG8UogLgc","IRh485Mg9r","v8yFNtaOXK","BGaQYazIWp","cQOnvrz7Ut","UlU3MlCMxy","v2eC3hSSvQ","ZUnqtsuY4x","xXTI49y4lw","azIWpuZPqg",
+"tAOsrxXTI4","v1HlnuLtKs","hUTw7CNHmv","IRh485VZjS","55rfBsqVrf","uN6r3xciqp","UmaEvtaOXK","45cIHuQIcz","5Drn0X6Pin","ZJTXHbrhlQ",
+"aFFssMGlTF","RsQUqblLA9","pWiOsdjsrv","CNHmvYw2oU","FxX9qWDVWJ","8hJdthi5X7","2Yz7E0ao3l","yluBxRpBQm","QChxs7ku1p","oGu6xuQIcz",
+"xciqpMm8si","euZA52TRI7","QnJ1S0MR5X","7ku1puAWyp","7X3uyhUTw7","NOHszi3pyd","uTacxHRxd8","he9IAx3LDe","mX2GEtuDyS","gjUTu2Nslm",
+"OHaBzi3pyd","AkKTkt59lR","NhXdutuDyS","2TRI7MmKGJ","07n1cAOgEe","QClRL2hEEU","zHF1qBCxeC","lH1ktydG8U","fLNg8s4786","MK07YuZPqg",
+"7ku1ppFrrl","45cIHrhl0J","uQIczFxX9q","nlaByBpYhV","14FLRmX2GE","pvgjS0h1b1","MojnPd85a9","lXFOBAmdQd","ni2v1Yw2oU","m4bxUaFFss",
+"azIWpSbRYy","zmLYDAOgEe","8TxD7AkKTk","1LB1LoVQp6","jzUqRUlU3M","HlUbF9XyT9","BbwgAtaOXK","jSjS37ku1p","Zv7z07fKYU","hYBCKfaHir",
+"d85a9GSQwj","FcWrWeuZA5","jfREuVNCPd","jtn0XAmdQd","MK07YzY1GY","DcpWBuAWyp","FnPFBpWiOs","t98iWZv7z0","d7vjMix74r","euZA59y4lw",
+"Zv7z0P6bcg","XflUqaL6AJ","cShY27fKYU","kZANmKr8ys","GXdoHEdBKc","CxVEfv8yFN","s93Ml4QMc9","5drc6MaJQs","DQimpEdBKc","lj07QNcICA",
+"YOfrY24ARF","jfREuh1zcH","uTacx7lUXZ","cQOnvWaim6","618Di1LB1L","RpBQmjzUqR","aDGtSYOfrY","Yh1hFjzUqR","ydG8UF6PT2","kZANmL7cGc",
+"VLTy6FcWrW","J2mQi9GXkX","tAOsrAkKTk","MezSWxXTI4","qaofNtAOsr","EdBKcJRJQB","ThjNnCNHmv","ZzJHWrz7Ut","No0QbCdyBV","uvf7ADG4sT",
+"Cp3mZfmIK1","8hJdt7fsYM","TCgPpAkKTk","RzaZAiwzGk","TXQ0ZqUJMd","tlILtDcpWB","qaofNcQOnv","VNCPd29QAz","v2eC3IBe8k","0KyfsaDGtS",
+"AXpwEGXdoH","CK5W7ni2v1","0KyfsMK07Y","ni2v107n1c","pAhR10h1b1","taOXKVjCZq","FxX9qZJTXH","Qworujtn0X","AgJHQM6qcG","wiHrZDLhzM",
+"brhlQzQt6Q","ogLgcMmKGJ","FcWrWblLA9","FhtglzY1GY","StlDJGSQwj","Yf2EcFNYIM","jSjS3G1RhS","lweGyNxx9V","WmadAVLTy6","DcpWB5iGN5",
+"XflUqGSQwj","mX2GEYjB9t","ReKEWGv3Fq","dpe1vCIShG","JKWYRIBe8k","m4bxUStlDJ","suY4xJ2mQi","yToGWHlUbF","4dEz64QMc9","hYBCKydG8U",
+"CIShGAkKTk","lXFOBFNYIM","taOXK64s8N","8U2nUI7p2a","Y1mC064s8N","16lHclViBv","9GXkXAXpwE","TCgPpix74r","P6bcgOHaBz","1j5L84QMc9",
+"SWfouFnPFB","s93MlEoToP","RpBQmprNT6","Yf2Ec5iGN5","fcJOygjUTu","5VZjSWDVWJ","cQOnviKqhr","dQ586JXljW","9iGoTd85a9","qQxHPulk41",
+"uZPqggtCA5","FLsphtaOXK","pAhR1Mm8si","uupzkbgJAz","64s8NlpF6W","Yh1hFIRh48","piJSkdpe1v","jiVBPfcwDa","0YAGH5drc6","RsQUqPb1pa",
+"xReecGXdoH","7lUXZe6e4z","07n1cZJTXH","t59lRaFFss","EOE1oJIqXi","zbIYYgdQsS","NAFuwChuy3","vkCHHCNHmv","dhSuH48cHL","Waim6rKDLJ",
+"5ZaEzQworu","5Mg9rIRh48","IBe8kFNYIM","Q6Lixzz4ZU","5Nammtl72W","ZUnqtDG4sT","Mm8siPYBf4","I7p2afcwDa","K4GS8n8pJ9","h1zcHkB5nP",
+"DLhzMS77LH","QChxssqVrf","QssNC64s8N","7lUXZgIYvE","9y4lw9rlg9","fLNg80Wr5y","RsQUqFPfSE","1v5hHGXdoH","TXQ0ZWaWsv","cQOnvTa8f6",
+"7fsYMVjCZq","vOqCELDk6f","SWfouVjCZq","Yf2Eco8Uyd","hi5X75drc6","FPfSEVerEA","taOXKm4bxU","Pb1paeuZA5","RBhp0uPX7G","WaWsv14FLR",
+"lkMUAVerEA","ZUnqt7Ow5C","2DREsS77LH","LbRTHKsjRK","uvf7A8TxD7","1j5L8gdQsS","o8UydjS1aj","7fKYUYh1hF","tlILtoQ87r","zQt6QfFDrJ",
+"ogLgcYh1hF","9GXkXRpBQm","fcJOyYOfrY","pAhR1uQIcz","9XyT9MezSW","fqypyQChxs","LbRTHzQt6Q","he9IAyofH3","GrDg7DQimp","xReecYw2oU",
+"d7vjMAOgEe","NAFuwaFFss","a00b5v8yFN","B3qemjfREu","8hJdt8hJdt","aez9yiB08l","WPmlxMK07Y","Z4I1vK4GS8","Cp3mZjtn0X","uQIczdmoS7",
+"qQxHP2ZHdk","QClRLfFDrJ","GWqqXqaofN","dmoS7gtCA5","MGlTFkB5nP","TXQ0ZQ6Lix","zHF1qHlUbF","faHirv1Hln","L7cGcZUnqt","J2mQibgJAz",
+"NcICAyEfy9","wDajXv8yFN","VerEAS77LH","VBjhziB08l","Gv3Fqulk41","Y1mC0Pb1pa","G1RhSrKDLJ","F6PT2ZhwG1","9rlg9zmLYD","uTacxMaJQs",
+"lCMxyVjCZq","AkKTkDcpWB","QYxC0t59lR","AgJHQgIYvE","IjTwPqQxHP","Kr8ysGXdoH","zmLYDW3VFH","CxVEfazIWp","F6PT29rlg9","W7cTsni2v1",
+"RkQkeBbwgA","2TRI7GrDg7","4dEz6WmadA","9XyT9vkCHH","14FLRIn3NS","FGzgpy94nw","mX2GENAFuw","yvOMIix74r","n8pJ95Drn0","Cp3mZEoToP",
+"uTacxVprf2","jS1ajgdQsS","0PktIs93Ml","EOE1ohE1Ql","Gv3FqFcWrW","jeskSUmaEv","4dEz6gf8rI","nFqikM3zXL","OUYuFhUTw7","XflUq0Kyfs",
+"ix74ri7WMQ","DcpWBzmLYD","JRJQBNOHsz","mz8gxzFgtB","ECMvUSs0Zu","suY4xYjB9t","HfyNQCIShG","b29RJ48cHL","WreyPFwEJz","lCMxyVNCPd",
+"uLtKsuvf7A","2Yz7EuLtKs","RkQkerKDLJ","7fKYUsx5Gl","zz4ZUDQimp","YjB9tBGaQY","Mkgy8d7vjM","gjUTuyofH3","Oz8yZReKEW","5IhmGpAhR1",
+"29QAzRxrsm","X6PinlsQGo","ydG8UHP433","iB08lC2Irc","Rxrsm9rlg9","qQxHP2Nslm","i3pydVNCPd","FxX9qulk41","RpBQmC2Irc","ZJTXHjfREu",
+"Zv7z0DcpWB","bZLvSfmIK1","VLTy6M6qcG","cShY2jSjS3","Uvlv4gIYvE","TwanoZv7z0","Ss0Zui7WMQ","CNHmvxciqp","In3NSNhXdu","No0QbWDVWJ",
+"FPfSEAmdQd","vOqCEx3LDe","ReKEWVBjhz","hSSvQAIYUu","x3LDeBFkb8","hE1QlUl4a1","MaJQs3weIF","v1HlnZv7z0","G1RhSyofH3","No0Qb3weIF",
+"Pb1paCK5W7","Twano55rfB","QClRL6q6L9","7fsYMJXljW","StlDJyofH3","D6rByQssNC","CIShGK4GS8","2hEEUm4bxU","VIlwPe6e4z","C2Ircl83Ud",
+"Cp3mZ5Drn0","dQ586FwEJz","OUYuFlm0pD","5VZjSnlaBy","guMb8lH1kt","StlDJ3otm6","gtCA58RCUA","vkCHHI7p2a","YjB9te6e4z","1v5hHd85a9",
+"OxWIHrz7Ut","WaWsvblLA9","cShY2t98iW","Uvlv4IRh48","1v5hHX6Pin","2hEEUs7Mxk","lCMxyDQimp","Ss0ZuoQ87r","rKDLJt98iW","AOgEeWMiS3",
+"ZUnqtlViBv","nlaByNxx9V","WPmlxFGzgp","EoToPUlU3M","RsQUq7fsYM","vkCHHPOUYS","d7vjM9GXkX","Nxx9VtlILt","v1Hlndpe1v","lj07Qtl72W",
+"hE1Qldjsrv","X6PinRACuj","blLA90MR5X","9y4lwVjCZq","0MR5XSs0Zu","JKWYR9XyT9","qaofNjSjS3","oQ87rSs0Zu","8TxD7JJs5m","L7cGc48cHL",
+"5Nammxciqp","uJScXl83Ud","0YAGHulk41","MmsIo45cIH","7lUXZuvf7A","tjQxstl72W","Dz1R3WPmlx","MaJQs8cVD3","Pb1pacQOnv","OUYuFBpYhV",
+"n1pmO2ZHdk","2ZHdkaDGtS","HlUbFuZPqg","AIYUuB3qem","5drc6rKDLJ","8RCUAulk41","XyPZNuLtKs","8xEKzzmLYD","xReecChuy3","AXpwEb29RJ",
+"QYxC0tjQxs","X6PinRsQUq","In3NSlCMxy","pmeCduPX7G","MmsIoKr8ys","Ta8f6I7p2a","580YDMmsIo","EoToPuLtKs","VNCPdyluBx","sx5GlB3qem",
+"qQxHPQbxXc","ECMvUSbRYy","FxX9qyEfy9","yofH3AXpwE","GWqqXmX2GE","d85a9dhSuH","J2mQiuQIcz","he9IAgtCA5","zmLYDyToGW","9y4lw8TxD7",
+"GXdoH0YAGH","QWxoTWMiS3","MmsIosx5Gl","9iGoTzqH0W","55rfBDLhzM","HzZT82Yz7E","SjskQU3yw5","dmoS7m4bxU","RACujBpYhV","uTacx14FLR",
+"SjskQAmdQd","AkKTkWreyP","QClRLIKxdL","Q6LixmX2GE","ulk415Namm","LDk6fFVMxo","hE1QluQIcz","vLsmSv8yFN","JRJQBZzJHW","GWqqX8RCUA",
+"Zv7z0G1RhS","s4786qaofN","uoStwQYxC0","uPX7G9XyT9","Oz8yZhi5X7","v2eC3d85a9","JJs5mQworu","rhl0JqaofN","ZhwG1AIYUu","VerEAuZPqg",
+"0MR5XvkCHH","Gv3FqGSQwj","cQOnvQ6hMC","ydG8UkZANm","FNYIM0ao3l","xciqpGXdoH","zqH0W1j5L8","WmadAzqH0W","16lHcyluBx","jS1ajOUYuF",
+"zFgtB9iGoT","Yh1hFRzaZA","lH1ktM3zXL","Mm8siECMvU","VerEAaL6AJ","TCgPpPb1pa","QworuAOgEe","t98iWciuWz","n1pmOm4bxU","pAhR1I7p2a",
+"7ku1pzY1GY","tuDySSWfou","JJs5mBFkb8","ydG8UFcWrW","5Mg9rQWxoT","fqypyZuDtD","gf8rItlILt","FGzgppAhR1","hYBCKcmXIX","FLsph16lHc",
+"M3zXL9iGoT","EoToPHzZT8","ZzJHWuoStw","FnPFBIRh48","Pb1paStlDJ","jtn0XbZLvS","he9IAZUnqt","tlILtM3zXL","QssNChi5X7","8RCUAFNYIM",
+"AOgEeuoStw","2ZHdkqaofN","zFgtBMmsIo","ksJbypvgjS","x3LDeMojnP","l83Ud1v5hH","ydG8USs0Zu","S2DfuRxrsm","5IhmGLDk6f","gdQsSWDVWJ",
+"tl72WRBhp0","VLTy6CNHmv","KASQ845cIH","7hyVv9rlg9","fcJOyXyPZN","Cp3mZd7vjM","NcICAh1zcH","HRxd80BmCy","nFqikOHaBz","o8UydAgJHQ",
+"In3NS2hEEU","dpe1vtjQxs","oVQp6s7Mxk","rKDLJzY1GY","RACujrKDLJ","qaofNh1zcH","ZzJHWdpe1v","5Drn0wDajX","IBe8kIn3NS","P6bcg618Di",
+"ogLgcYf2Ec","d7vjMI7p2a","fFDrJn1pmO","MK07YQworu","3otm6DcpWB","Waim6Ss0Zu","BbwgAiqv4k","uLtKsSjskQ","cQOnvBCxeC","BpYhVSs0Zu",
+"TCgPpUmaEv","IKxdLXflUq","lViBvJIqXi","2ZHdk07n1c","fcJOyrz7Ut","blLA9azIWp","Dz1R3IRh48","uJScXUvlv4","BCxeC5IhmG","8FmFHFGzgp",
+"Pb1paWPmlx","KZamHlkMUA","07n1cpT8wu","Zv7z0lpF6W","yluBxuQIcz","3weIFaDGtS","faHirOHaBz","iwzGkCK5W7","2DREs64s8N","l83UdaL6AJ",
+"SbRYylsQGo","RBhp0iKqhr","aez9yfcwDa","FjHXRFnPFB","v2eC3LbRTH","JKWYRxciqp","lsQGoAXpwE","mX2GEhSSvQ","pAhR15iGN5","tl72Wuupzk",
+"FFDui9y4lw","0KyfsQYxC0","CK5W7ulk41","ydG8UJ2mQi","fcJOyi3pyd","pT8wuIKxdL","s7MxkcmXIX","djsrv0Wr5y","SmGzvs4786","l83Ud3otm6",
+"djsrv45cIH","5iGN5OUqFM","SjskQMkgy8","ni2v13otm6","JkzUnAgJHQ","BFkb8OUqFM","NOHszM6qcG","lpF6W5ZaEz","VLTy6cQOnv","JRJQBDLhzM",
+"oGu6xFFDui","i3pyd9rlg9","XyPZNkB5nP","0YAGHpmeCd","MmKGJ0BmCy","zqH0WLbRTH","5VZjS29QAz","LbRTH16lHc","7fsYMLbRTH","X6PinBbwgA",
+"iKqhrWDVWJ","RBhp0zbIYY","FjHXRogLgc","EoToP7X3uy","WreyPJXljW","DLhzMh1zcH","jSjS3dQ586","7lUXZ45cIH","5VZjSUmaEv","rKDLJ7hyVv",
+"SbRYyzqH0W","5ZaEzzz4ZU","VerEAJJs5m","16lHc0Wr5y","ZuDtDjtn0X","brhlQZzJHW","BFkb8lViBv","tl72WQChxs","vkCHHwiHrZ","RzaZAUmaEv",
+"HzZT8QYxC0","8RCUAYf2Ec","WMiS3Dz1R3","Ta8f6FFDui","Y1mC0v8yFN","aFFsswDajX","sqVrflViBv","6q6L9Ss0Zu","0h1b1djsrv","64s8N8TxD7",
+"fqypyWmadA","MaJQs0PktI","jfREu3weIF","azIWp3weIF","JRJQBJ2mQi","pFrrlLbRTH","lkMUAhSSvQ","9eoRctAOsr","cShY2Qworu","LDk6flweGy",
+"RkQkeqQxHP","rz7UtBCxeC","K20wK9iGoT","14FLRcmXIX","Yh1hFXflUq","QssNCZhwG1","zmLYDhYBCK","Mkgy8VIlwP","Ul4a1JKWYR","zmLYDtvdkD",
+"5Mg9rsoy9t","8cVD3ksJby","d85a9fLNg8","ECMvUX6Pin","yEfy9No0Qb","WMiS38FmFH","8U2nUvOqCE","RkQkeZUnqt","NhXduMm8si","5Drn0h1zcH",
+"fFDrJFPfSE","Yh1hFEOE1o","vOqCEjfREu","dmoS7aFFss","vOqCEsx5Gl","ru4UGlCMxy","pT8wuHP433","9rlg9h1zcH","ZJTXHMezSW","xXTI4qQxHP",
+"gtCA5Cfgr3","JXljWFGzgp","ECMvUfLNg8","yvOMIzQt6Q","VIlwPPYBf4","pmeCd5VZjS","lCMxysoy9t","U3yw5U3yw5","tuDySpiJSk","VLTy6JJs5m",
+"DcpWBlCMxy","45cIHbgJAz","NOHszQYxC0","HRxd8dmoS7","lpF6WCK5W7","s4786prNT6","pAhR1Gv3Fq","rhl0JRpBQm","UmaEvciuWz","gtCA5fcwDa",
+"Z4I1vNcICA","9GXkX7ku1p","5Drn0RsQUq","zbIYYyluBx","W7cTs9XyT9","GrDg7prNT6","FPfSEtuDyS","wiHrZgdQsS","cShY2sqVrf","B3qemmz8gx",
+"ydG8UM3zXL","PYBf4tvdkD","jeskSK20wK","5Drn0x3LDe","TCgPp7X3uy","K20wK24ARF","SbRYyGv3Fq","I7p2aPYBf4","VerEAuoStw","gIYvE0MR5X",
+"lkMUAsuY4x","okgRilCMxy","WDVWJi7WMQ","ix74rfaHir","hUTw7fcJOy","Y1mC0hi5X7","aez9yJKWYR","OHaBzuN6r3","WPmlxzFgtB","lCMxypT8wu",
+"kZANmksJby","soy9tXflUq","WPmlxblLA9","pAhR1zHF1q","Q6hMCyluBx","euZA5JIqXi","NhXdubZLvS","Zv7z0WaWsv","n1pmOy94nw","WPmlxv2eC3",
+"WPmlxfaHir","5Drn0atef2","ZzJHWaez9y","lpF6WFhtgl","6q6L9NcICA","45cIHtvdkD","tjQxsAIYUu","yToGWwiHrZ","fFDrJFwEJz","Uvlv4nFqik",
+"yEfy9ZzJHW","WMiS3ydG8U","lm0pD8hJdt","lCMxyaDGtS","In3NSv1Hln","nlaBy2TRI7","vLsmSXflUq","M6qcG2ZHdk","vOqCEZhwG1","mz8gxJRJQB",
+"RxrsmlpF6W","8TxD7uLtKs","uJScXzbIYY","EOE1orz7Ut","Dz1R37hyVv","2Yz7EuPX7G","No0QbuQIcz","gtCA5aFFss","8cVD3vOqCE","lsQGoMGlTF",
+"O3iyQxReec","iqv4kpmeCd","tAOsrksJby","EoToPCK5W7","VNCPdWreyP","sqVrfgf8rI","Vprf2G1RhS","n1pmORzaZA","VLTy6aL6AJ","lsQGoZ4I1v",
+"Q6hMCFGzgp","WMiS3xXTI4","Oz8yZVLTy6","VIlwPb29RJ","i7WMQWPmlx","TCgPp0YAGH","lm0pD2ZHdk","lpF6WuAWyp","L7cGcFjHXR","zmLYDL7cGc",
+"0MR5Xjtn0X","s7MxkrKDLJ","hi5X7lpF6W","LbRTHfaHir","No0Qb0Kyfs","618DiFPfSE","Ta8f6qaofN","KZamHtl72W","2Yz7E0h1b1","07n1ctvdkD",
+"FLsphWaim6","NcICAfFDrJ","2NslmWDVWJ","AgJHQ9eoRc","Yf2EcK20wK","K20wKFhtgl","JRJQBAkKTk","yEfy9IjTwP","U3yw5SbRYy","QnJ1Sk85Ae",
+"D6rByvkCHH","UlU3MZJTXH","vLsmSZJTXH","BCxeCQ6hMC","tuDySStlDJ","4dEz6b29RJ","CK5W7ReKEW","CqqaDCK5W7","KsjRK4QMc9","8hJdtZ4I1v",
+"gtCA5Twano","PYBf4uN6r3","oGu6xgtCA5","MmsIoZuDtD","MaJQsgf8rI","DQimplm0pD","QnJ1Sdjsrv","euZA5Cfgr3","Oz8yZydG8U","Chuy3UlU3M",
+"2TRI748cHL","oGu6xlweGy","Waim6Cfgr3","HlUbFdQ586","n8pJ9SbRYy","hSSvQZv7z0","QChxsvkCHH","tl72WWDVWJ","azIWpRpBQm","RpBQmcL0aE",
+"nFqikVLTy6","h1zcH8cVD3","OHaBzblLA9","euZA5JKWYR","UmaEvnlaBy","o8UydpmeCd","5nmWv2DREs","pAhR1wiHrZ","v2eC3NOHsz","3otm6iwzGk",
+"RkQkeyofH3","48cHLHlUbF","7hyVvaFFss","t59lRfaHir","BbwgAguMb8","X6PinK20wK","FVMxoQChxs","nFqikjfREu","4QMc9CNHmv","rz7UtVprf2",
+"Ss0Zuv1Hln","1LB1Lk85Ae","Yf2Ecgf8rI","zY1GYhSSvQ","Uvlv4POUYS","YOfrY7Ow5C","fLNg8UmaEv","iKqhrjzUqR","5Mg9rGSQwj","lViBv0MR5X",
+"Dz1R37fsYM","2TRI7k85Ae","VIlwPSmGzv","LewvMTCgPp","VLTy6FwEJz","Z4I1vHP433","hUTw7Kr8ys","yluBxuJScX","pmeCdBGaQY","d7vjMyluBx",
+"suY4xyToGW","pT8wuMmKGJ","IRh48aFFss","JJs5mn1pmO","BpYhV4W0Tl","ECMvUMojnP","s93MlAkKTk","yofH3kZANm","cL0aE8cVD3","5ZaEz0PktI",
+"RBhp0qUJMd","xXTI44W0Tl","S77LHJJs5m","sx5GlJXljW","6q6L95Drn0","BpYhVgf8rI","2Yz7Et98iW","wiHrZNOHsz","FjHXR3otm6","J2mQifcwDa",
+"lH1ktBpYhV","XflUqBCxeC","NAFuw0PktI","Ss0ZuuTacx","VLTy6CK5W7","qUJMdMmsIo","s4786Ta8f6","0h1b1soy9t","SbRYyBpYhV","0Wr5yM3zXL",
+"U3yw555rfB","5Drn0DcpWB","9rlg9gIYvE","Waim67ku1p","FxX9qd7vjM","5Mg9rFFDui","NcICAFwEJz","jiVBPNo0Qb","7X3uylCMxy","MmsIo9GXkX",
+"5NammXyPZN","TCgPppmeCd","nnP8oRsQUq","uupzkChuy3","ZJTXHVBjhz","2DREslm0pD","ZJTXHsuY4x","1j5L82Yz7E","nFqik48cHL","HRxd8QbxXc",
+"ksJbyyofH3","yEfy9J2mQi","tuDySAXpwE","Q6LixQbxXc","580YDK20wK","uN6r3jSjS3","MmsIozqH0W","DcpWB9eoRc","zz4ZUcShY2","n1pmOpAhR1",
+"DLhzMqQxHP","CIShGMm8si","580YDJKWYR","dpe1v3weIF","bgJAzcL0aE","piJSkrz7Ut","OxWIHrhl0J","pT8wubrhlQ","blLA9fcwDa","taOXKSs0Zu",
+"In3NSChuy3","8xEKzlCMxy","iB08lzY1GY","TCgPpNhXdu","v2eC3Ss0Zu","Cfgr39XyT9","yofH3IjTwP","2DREsDz1R3","S77LHXyPZN","v2eC3FFDui",
+"Ta8f64W0Tl","0ao3lFLsph","9eoRcZUnqt","lH1ktk85Ae","14FLRk85Ae","9XyT9mX2GE","Yh1hFuAWyp","fmIK1RACuj","8TxD7kZANm","gf8rIrz7Ut",
+"vkCHHzmLYD","QWxoT29QAz","JRJQBWreyP","14FLRkZANm","AgJHQ3otm6","CIShGUvlv4","zQt6QJkzUn","ZuDtDfaHir","YOfrYC2Irc","WmadAi7WMQ",
+"CNHmvjeskS","9XyT9SjskQ","2Yz7EQChxs","QYxC0pvgjS","Uvlv42DREs","UmaEvfaHir","lj07QNhXdu","xciqpatef2","QnJ1SoGu6x","euZA5lXFOB",
+"Oz8yZcQOnv","uN6r3S77LH","RBhp0EoToP","Gv3Fqx3LDe","HRxd8iB08l","VBjhzQChxs","qQxHP4dEz6","LbRTHpiJSk","RsQUqNo0Qb","9rlg9Vprf2",
+"v1HlnWmadA","EdBKcogLgc","EOE1on8pJ9","Gv3FqyofH3","fLNg8WreyP","gf8rICdyBV","taOXKSbRYy","qUJMdHlUbF","fqypyqaofN","1j5L8lH1kt",
+"NOHszkB5nP","atef2ru4UG","0MR5XtvdkD","hE1QlXyPZN","uN6r3FNYIM","cL0aE4dEz6","MGlTFyToGW","SWfouiB08l","FjHXRMezSW","mz8gxFPfSE",
+"s4786K4GS8","cShY2s4786","ciuWzt59lR","y94nw8RCUA","uupzk4W0Tl","QChxsRpBQm","cmXIXPYBf4","3otm6x3LDe","4W0Tl618Di","24ARFcShY2",
+"B3qemuJScX","n1pmOd85a9","WPmlxRmDcr","i3pydFnPFB","FLsphTwano","0PktI0YAGH","8FmFHKZamH","24ARFn1pmO","uAWyptAOsr","l83Ud580YD",
+"fqypy1j5L8","24ARFwiHrZ","WDVWJXyPZN","blLA9okgRi","7ku1pKASQ8","G1RhS0Wr5y","s7MxkVerEA","uvf7ABbwgA","W7cTssqVrf","SbRYyhSSvQ",
+"AOgEeiKqhr","JKWYRQworu","XflUqZzJHW","uAWypG1RhS","tjQxsjiVBP","JkzUnvkCHH","B3qemRxrsm","mX2GEUlU3M","FLsphStlDJ","pAhR15Namm",
+"euZA5qQxHP","9eoRccShY2","s4786KZamH","kZANmRsQUq","AXpwE2ZHdk","G1RhSYh1hF","rKDLJAOgEe","QbxXczY1GY","1LB1LAXpwE","M3zXLB3qem",
+"v1HlnOUqFM","WMiS3x3LDe","lm0pDkZANm","OUqFMzY1GY","SWfouyEfy9","tAOsrWaWsv","J2mQisqVrf","VjCZq1j5L8","CdyBVuLtKs","uoStwYjB9t",
+"ogLgch1zcH","hYBCKRsQUq","OxWIHzmLYD","4dEz6Z4I1v","Gv3Fq0MR5X","pFrrlQ6hMC","lViBvzQt6Q","uoStwpT8wu","oGu6xPYBf4","HP433nnP8o",
+"taOXKEoToP","7X3uy618Di","FhtglWPmlx","iwzGkFVMxo","JXljW9rlg9","OxWIHsuY4x","2TRI7gtCA5","iB08lVBjhz","Ta8f6lViBv","lViBvW7cTs",
+"piJSkaFFss","5NammMaJQs","vkCHHix74r","s7MxkQbxXc","l83UdMezSW","AkKTkXyPZN","SmGzvtl72W","blLA93weIF","Mkgy8zQt6Q","KZamHuoStw",
+"2hEEUvOqCE","dhSuHYh1hF","U3yw5DQimp","WreyPyvOMI","pT8wu5VZjS","JkzUndpe1v","QssNCK20wK","soy9tKZamH","oQ87r6AFT0","Ss0Zusoy9t",
+"FhtglCp3mZ","i7WMQ8TxD7","ix74rcShY2","8RCUARBhp0","SjskQwDajX","azIWpNcICA","o8Uyd8FmFH","dpe1vWreyP","wiHrZQWxoT","2NslmoGu6x",
+"BCxeCHlUbF","SbRYyAmdQd","3weIFMaJQs","guMb8FcWrW","FhtglZv7z0","8RCUAgdQsS","MojnPmz8gx","cShY2FVMxo","FLsphPb1pa","VNCPdbZLvS",
+"QbxXcOUqFM","Ul4a1ru4UG","0ao3lyofH3","yluBxKsjRK","ECMvU3weIF","QnJ1SlpF6W","GrDg7jeskS","RzaZAAOgEe","uvf7AP6bcg","suY4xfmIK1",
+"0h1b1aFFss","5iGN5ThjNn","Q6LixeuZA5","P6bcgVprf2","7Ow5CD6rBy","o8UydCp3mZ","AmdQd8U2nU","o8UydWPmlx","prNT6nnP8o","zY1GYuLtKs",
+"OHaBzI7p2a","CdyBVlH1kt","I7p2aEoToP","s7Mxk5drc6","Kr8ys29QAz","QClRLVLTy6","v2eC37fKYU","NhXduZv7z0","CdyBVVjCZq","uJScXuvf7A",
+"QChxsgf8rI","Yw2oUTwano","zHF1qMaJQs","Yw2oURBhp0","1LB1LUlU3M","DG4sTn8pJ9","BFkb8v8yFN","yEfy9EdBKc","okgRiYOfrY","suY4xQ6hMC",
+"8U2nUFjHXR","ciuWzlm0pD","5ZaEziwzGk","iqv4kHzZT8","yluBx1v5hH","uAWyplkMUA","rhl0JIjTwP","0ao3lulk41","XyPZNBpYhV","NhXduBpYhV",
+"7X3uyqQxHP","Mkgy8S77LH","qUJMdxciqp","8hJdtoGu6x","2TRI7RACuj","ydG8UO3iyQ","atef2JKWYR","1v5hHnFqik","0PktI9XyT9","taOXKVerEA",
+"suY4xOUqFM","l83UdzY1GY","FNYIMl83Ud","5ZaEzMkgy8","QssNCXflUq","tl72W8TxD7","uQIczhUTw7","0MR5XwDajX","ThjNnnFqik","WreyPciuWz",
+"BbwgA8cVD3","n8pJ9WMiS3","MK07YOUYuF","CIShGSbRYy","Rxrsmo8Uyd","RzaZANAFuw","2TRI7lH1kt","5nmWvSmGzv","PYBf4kZANm","Q6Lix0h1b1",
+"tjQxsZhwG1","jfREuWaim6","s7Mxkrz7Ut","PYBf4suY4x","cQOnvkZANm","okgRi0PktI","9rlg9rz7Ut","lpF6WYf2Ec","lViBv8xEKz","1j5L8uJScX",
+"9y4lwYh1hF","tjQxsFFDui","cmXIXe6e4z","2NslmeuZA5","jSjS3aL6AJ","OUqFMjfREu","cQOnvLbRTH","AmdQd5Namm","5nmWvNhXdu","lj07Qv8yFN",
+"RsQUqzmLYD","2Nslmb29RJ","hi5X7suY4x","Mkgy8vkCHH","DQimpXyPZN","HP433uPX7G","faHirM6qcG","kZANm5drc6","gf8rIpWiOs","QworuK4GS8",
+"xReecYh1hF","FxX9qpvgjS","5drc62TRI7","0YAGHStlDJ","D6rBy4W0Tl","blLA9HfyNQ","v2eC3qaofN","d7vjM1LB1L","UmaEvtl72W","yvOMI0MR5X",
+"G1RhSOUqFM","Nxx9VgjUTu","MGlTFYOfrY","UmaEvzmLYD","pFrrlcmXIX","e6e4zMojnP","FnPFB9XyT9","GSQwjM3zXL","7lUXZmz8gx","ZzJHW7hyVv",
+"OHaBz0ao3l","sqVrfiKqhr","FhtglJ2mQi","G1RhSCIShG","x3LDeEOE1o","FxX9qlm0pD","aL6AJpmeCd","Dz1R3yToGW","qaofNMkgy8","TXQ0ZLewvM",
+"WaWsvYf2Ec","CIShG7X3uy","mz8gxoGu6x","J2mQiaL6AJ","lm0pDU3yw5","VLTy6tvdkD","WPmlxUl4a1","FVMxoOUqFM","k85AeazIWp","6q6L9M6qcG",
+"FcWrWAgJHQ","bZLvSJkzUn","e6e4zZhwG1","QbxXcBGaQY","EoToPvLsmS","v2eC3taOXK","he9IA5drc6","zY1GYtaOXK","TwanolpF6W","XyPZNksJby",
+"zFgtBqaofN","UlU3MtAOsr","QworuGXdoH","tjQxsSs0Zu","i3pydzz4ZU","oVQp6P6bcg","a00b5JXljW","S2DfuWMiS3","DcpWBY1mC0","jS1ajru4UG",
+"bZLvSkZANm","5IhmGUlU3M","dQ586yEfy9","y94nwyToGW","7hyVvpT8wu","FNYIM1LB1L","BbwgAyToGW","DLhzMK20wK","CdyBV8RCUA","Q6hMCzqH0W",
+"zbIYY0MR5X","S77LHQnJ1S","faHir5nmWv","VIlwPJRJQB","IRh48NhXdu","DcpWB55rfB","BbwgAokgRi","blLA9uupzk","kB5nPx3LDe","QYxC05ZaEz",
+"i3pydhe9IA","mX2GEWaWsv","HzZT8Rxrsm","ulk41ThjNn","oQ87rdjsrv","uZPqgcShY2","y94nwMojnP","SjskQsx5Gl","RzaZAtvdkD","xXTI4hE1Ql",
+"8TxD729QAz","RxrsmIn3NS","gf8rIlCMxy","OUYuFMmsIo","5nmWv5ZaEz","0Wr5yoVQp6","pWiOs2Yz7E","9eoRcKr8ys","EoToPd7vjM","2hEEUGSQwj",
+"QssNCyvOMI","9iGoTpiJSk","5nmWvVerEA","jfREu8hJdt","0MR5Xxciqp","8U2nUpvgjS","5nmWv7fKYU","QWxoThe9IA","Ta8f68U2nU","Mkgy80MR5X",
+"7fsYMMm8si","i7WMQSWfou","HzZT85IhmG","7fKYUtAOsr","L7cGc9rlg9","blLA9LDk6f","wDajX7lUXZ","LbRTHzbIYY","mX2GEyvOMI","MGlTFIn3NS",
+"4W0TlZ4I1v","NcICADG4sT","yvOMIiwzGk","t98iWbZLvS","brhlQ0BmCy","qUJMdJ2mQi","FnPFBW3VFH","VIlwPDcpWB","MmsIoDG4sT","VBjhzAIYUu",
+"C2IrcWmadA","Vprf2NOHsz","gjUTu7lUXZ","GXdoHDG4sT","Cp3mZ580YD","In3NSAkKTk","Ta8f6Gv3Fq","i7WMQM6qcG","IRh487fsYM","tjQxsP6bcg",
+"BbwgAHP433","JkzUnl83Ud","UlU3MYjB9t","uPX7GJKWYR","yofH3cShY2","pFrrlWDVWJ","FFDuiksJby","0PktIU3yw5","cmXIXd7vjM","S77LHazIWp",
+"EoToPzHF1q","x3LDeY1mC0","RBhp0I7p2a","5IhmG1v5hH","bZLvS5drc6","aez9yRkQke","iKqhruvf7A","qQxHP2DREs","GrDg76AFT0","45cIH2hEEU",
+"Kr8ysMGlTF","DG4sTWPmlx","7fsYMOHaBz","Vprf2FPfSE","v2eC34W0Tl","zz4ZUDcpWB","dpe1vTCgPp","QYxC0Twano","he9IAStlDJ","PYBf4IKxdL",
+"PYBf4JXljW","tvdkD48cHL","zFgtBciuWz","GSQwjTXQ0Z","fcwDaTXQ0Z","2ZHdkQworu","6q6L9iKqhr","tuDySQssNC","MmKGJXflUq","MmKGJuLtKs",
+"X6Pinb29RJ","v2eC3yvOMI","euZA5zHF1q","GWqqXaL6AJ","uvf7A45cIH","B3qemVLTy6","IBe8k9eoRc","VerEA0MR5X","FxX9qMGlTF","zHF1qpiJSk",
+"hE1QlGSQwj","ni2v18xEKz","8FmFHgIYvE","POUYSkB5nP","iB08lrz7Ut","okgRiNAFuw","OHaBzrKDLJ","P6bcgjeskS","uTacxFhtgl","gf8rIK4GS8",
+"7fKYUK4GS8","VerEAdmoS7","uJScXBCxeC","2DREsXyPZN","EOE1oHlUbF","B3qemWreyP","FjHXRaFFss","RACujJ2mQi","ogLgcCNHmv","3otm6RACuj",
+"uQIczoVQp6","FhtglokgRi","7lUXZ1j5L8","7fKYUF6PT2","euZA5Oz8yZ","zqH0WGSQwj","Cp3mZ8TxD7","yToGWcL0aE","h1zcHIjTwP","B3qemIBe8k",
+"vLsmSi7WMQ","Q6LixgjUTu","ru4UGgf8rI","C2Ircm4bxU","pv0i7Yw2oU","7fKYUhe9IA","9y4lwhE1Ql","D6rBydjsrv","StlDJQ6hMC","9eoRcCIShG",
+"YjB9tQbxXc","1j5L8Fhtgl","jSjS39y4lw","qaofNQWxoT","zQt6QGv3Fq","euZA5t98iW","soy9tOUYuF","6AFT01j5L8","iB08ljS1aj","qaofNSbRYy",
+"VLTy6AIYUu","J2mQiQnJ1S","hSSvQiwzGk","5iGN56q6L9","gf8rIGv3Fq","MmKGJ7fsYM","i3pydru4UG","iKqhrNo0Qb","5Drn0vkCHH","FhtglFGzgp",
+"faHirs4786","jeskSvOqCE","EdBKcB3qem","fFDrJlkMUA","Ul4a1MmKGJ","AOgEeWaWsv","IjTwPsuY4x","2hEEUydG8U","JJs5mpiJSk","GXdoHQworu",
+"DG4sTzz4ZU","GWqqXlXFOB","Yh1hFS2Dfu","bgJAzxciqp","Vprf2CxVEf","Ul4a1JJs5m","aDGtSsoy9t","lH1ktJKWYR","tAOsrulk41","DcpWBNxx9V",
+"KsjRKhE1Ql","VNCPdcmXIX","jfREuYf2Ec","9XyT9d85a9","iB08lHP433","RmDcrTCgPp","uN6r3pv0i7","QworuRkQke","8TxD72Yz7E","FcWrWHfyNQ",
+"soy9tVjCZq","zY1GYiB08l","JXljW5VZjS","M3zXL9y4lw","v1HlnTXQ0Z","8FmFHHfyNQ","okgRi9rlg9","hE1QlzFgtB","atef2RACuj","e6e4zJKWYR",
+"RBhp02Nslm","1LB1Lv2eC3","Y1mC0Fhtgl","FjHXRzqH0W","JIqXigdQsS","v8yFNF6PT2","JRJQBO3iyQ","7X3uypv0i7","pAhR19rlg9","XyPZNk85Ae",
+"ECMvUmz8gx","uZPqg9XyT9","IRh480ao3l","K20wKogLgc","VIlwPFGzgp","hYBCKfLNg8","Yh1hFAOgEe","2ZHdkb29RJ","0MR5XMojnP","6AFT0DG4sT",
+"pvgjSTXQ0Z","FhtglDz1R3","JXljWsoy9t","iB08lsx5Gl","jzUqRuvf7A","HlUbFAkKTk","uJScXzmLYD","y94nw8U2nU","lXFOBB3qem","J2mQiKsjRK",
+"0KyfscL0aE","rhl0JEOE1o","Ss0ZuPb1pa","jiVBP1j5L8","zz4ZUEoToP","jS1aj48cHL","uoStw9GXkX","QnJ1STa8f6","BbwgAdhSuH","hE1QlUmaEv",
+"lpF6WcL0aE","QClRLv1Hln","Uvlv4x3LDe","DG4sTgtCA5","MmsIooQ87r","QClRLBCxeC","a00b50h1b1","IjTwPJJs5m","atef2VjCZq","s7MxkOxWIH",
+"oVQp6RmDcr","brhlQ5drc6","okgRicShY2","zmLYDlpF6W","CNHmvFLsph","zbIYYblLA9","14FLRzmLYD","Nxx9V8TxD7","WaWsvt59lR","dQ586QWxoT",
+"bgJAzIjTwP","0MR5XOUqFM","QbxXcMaJQs","cmXIXhSSvQ","Vprf2ru4UG","Oz8yZqUJMd","tvdkDi3pyd","aFFssZ4I1v","BpYhV0BmCy","QnJ1SD6rBy",
+"zQt6QfLNg8","tAOsrCp3mZ","iqv4kaFFss","yEfy9Qworu","yluBx0BmCy","SmGzv580YD","zqH0WfmIK1","Q6hMCGWqqX","Q6Lix7hyVv","AOgEeNhXdu",
+"qUJMdi3pyd","Pb1pa5VZjS","Qworuh1zcH","pT8wuK20wK","ReKEWs93Ml","VIlwP48cHL","MojnPGv3Fq","i3pydQYxC0","2TRI71LB1L","FVMxodhSuH",
+"jiVBPtlILt","FNYIMi3pyd","NAFuwbZLvS","bgJAz2ZHdk","48cHLzFgtB","9GXkXLDk6f","wiHrZ2ZHdk","5VZjSC2Irc","bgJAzxXTI4","iwzGk24ARF",
+"1v5hHfaHir","TCgPpHRxd8","X6PinHlUbF","5Namm7Ow5C","BbwgARpBQm","taOXKuvf7A","J2mQiM6qcG","mz8gxVjCZq","WPmlxSjskQ","Chuy3Y1mC0",
+"3otm6vkCHH","v8yFNTCgPp","h1zcHzQt6Q","jeskSzQt6Q","tAOsrBCxeC","M6qcGIKxdL","No0QbHP433","VjCZqKASQ8","RzaZAogLgc","iB08lTwano",
+"4dEz6fcwDa","yofH3Yw2oU","cL0aE618Di","n8pJ9rz7Ut","IBe8kprNT6","QWxoTl83Ud","8RCUAhi5X7","wDajXNhXdu","WMiS3dpe1v","48cHLdpe1v",
+"NOHszxciqp","lm0pDhSSvQ","soy9toQ87r","AIYUucmXIX","hi5X7zbIYY","ReKEWAmdQd","FwEJzdjsrv","K20wKY1mC0","0MR5XECMvU","JJs5mtl72W",
+"bgJAzwDajX","48cHLI7p2a","2ZHdkuPX7G","wiHrZ0YAGH","i7WMQzmLYD","O3iyQI7p2a","OxWIHd7vjM","o8UydMaJQs","CdyBVgdQsS","tlILtWmadA",
+"d7vjMQnJ1S","ulk41K20wK","hi5X7wiHrZ","sqVrf2TRI7","Vprf2pFrrl","dQ5868TxD7","AOgEeYjB9t","MezSWCfgr3","AgJHQv1Hln","1LB1LrKDLJ",
+"Chuy3LDk6f","F6PT2EdBKc","QnJ1S9eoRc","lweGyECMvU","14FLR9iGoT","gIYvEe6e4z","Rxrsmpv0i7","29QAzKASQ8","HfyNQAXpwE","StlDJs4786",
+"StlDJ8FmFH","580YDazIWp","jeskSjtn0X","euZA5k85Ae","rKDLJlweGy","t98iWzFgtB","9GXkXm4bxU","I7p2aZUnqt","ru4UGfLNg8","7ku1pKZamH",
+"07n1c24ARF","tuDySReKEW","RkQkeOz8yZ","aez9yuJScX","RmDcrRpBQm","uoStwfFDrJ","UlU3MIn3NS","YjB9tsoy9t","YjB9tQworu","CxVEfWaWsv",
+"MezSWlweGy","pWiOsprNT6","GSQwjQ6hMC","QssNC2Nslm","NcICACfgr3","uoStwqQxHP","ZzJHWv8yFN","y94nwlpF6W","aez9yB3qem","Cfgr3uN6r3",
+"Waim6jzUqR","uLtKs8TxD7","k85AeZ4I1v","azIWp0Wr5y","SWfouru4UG","pmeCd7hyVv","nFqiki7WMQ","CdyBVUvlv4","FPfSEuAWyp","ogLgcZJTXH",
+"FGzgpzmLYD","a00b58U2nU","QChxsDcpWB","pmeCd9XyT9","HlUbFDQimp","fcJOyThjNn","0YAGHMkgy8","QnJ1SCNHmv","FjHXRlsQGo","piJSkyvOMI",
+"WPmlxs4786","AIYUu5IhmG","M3zXL0MR5X","FxX9quAWyp","CNHmvvOqCE","v1HlnRzaZA","WDVWJZ4I1v","lsQGon8pJ9","U3yw50MR5X","rz7UtLDk6f",
+"VIlwP0Wr5y","d85a9M3zXL","EOE1o29QAz","1LB1Laez9y","ulk41zFgtB","Oz8yZ5Namm","rz7Utk85Ae","uvf7AO3iyQ","lpF6Wtl72W","uupzkaFFss",
+"Vprf2soy9t","okgRiFGzgp","WDVWJPYBf4","MojnPqUJMd","qUJMdC2Irc","AkKTki3pyd","a00b5QnJ1S","CxVEfAmdQd","RBhp0uTacx","dpe1vAOgEe",
+"cShY24QMc9","bZLvSRACuj","BCxeClweGy","5IhmG6AFT0","ydG8UJkzUn","14FLRWaWsv","RsQUqDz1R3","WaWsvTa8f6","I7p2aVjCZq","QChxs580YD",
+"1v5hHuQIcz","yofH3RzaZA","FnPFBaDGtS","2Yz7Ehi5X7","x3LDeh1zcH","fcJOyfFDrJ","iwzGk8TxD7","tl72WQ6hMC","2NslmazIWp","qaofN8FmFH",
+"mz8gx2DREs","ni2v1ECMvU","lH1ktyofH3","LbRTHQbxXc","OUqFMOz8yZ","FLsphhUTw7","QbxXc4QMc9","y94nwC2Irc","RBhp0Waim6","RzaZAfcwDa",
+"dhSuHa00b5","ECMvU1v5hH","zQt6Q8RCUA","k85AeYf2Ec","ZhwG1oQ87r","W7cTs0MR5X","FwEJzIBe8k","lViBvAkKTk","hYBCKD6rBy","QssNClweGy",
+"jS1ajgf8rI","0YAGHLbRTH","gjUTu16lHc","lsQGoOHaBz","rhl0JTa8f6","TXQ0Zn8pJ9","zQt6QzQt6Q","XflUqRBhp0","AmdQdoGu6x","nFqik6AFT0",
+"Ss0Zu8FmFH","hSSvQHfyNQ","t59lRGrDg7","ogLgc2TRI7","3weIFM6qcG","XyPZNbgJAz","OHaBzQ6Lix","lViBvAXpwE","hi5X7DLhzM","S77LHRxrsm",
+"zmLYDqQxHP","ZhwG1Cp3mZ","fLNg8jzUqR","hYBCKWaim6","0PktIcL0aE","prNT64W0Tl","BCxeClkMUA","MezSW5iGN5","gIYvEMm8si","7hyVvDQimp",
+"RsQUqB3qem","zQt6QuAWyp","pAhR145cIH","cQOnvZhwG1","8FmFH2DREs","Q6Lixiqv4k","KASQ8Vprf2","XflUquZPqg","DcpWBX6Pin","CxVEfaL6AJ",
+"pFrrlqUJMd","29QAzlm0pD","yvOMIVprf2","jeskSSjskQ","ZuDtDCfgr3","zQt6QlCMxy","AOgEeGv3Fq","iqv4ktlILt","wDajXVerEA","In3NS55rfB",
+"uAWyp6q6L9","OUYuFQ6Lix","ksJbyJXljW","gIYvE5nmWv","bgJAzQbxXc","G1RhSAOgEe","Waim6VjCZq","GrDg7IjTwP","FxX9q24ARF","he9IATXQ0Z",
+"ydG8U7fsYM","Mm8sid7vjM","JkzUnLbRTH","WDVWJWDVWJ","xciqps4786","QClRLcmXIX","14FLRuPX7G","fcwDaFNYIM","iqv4kX6Pin","euZA55Namm",
+"VLTy6MojnP","wiHrZgf8rI","aez9yhUTw7","U3yw5NcICA","GrDg7o8Uyd","YOfrY8xEKz","FVMxopvgjS","pT8wu2DREs","hE1QlOHaBz","9XyT90h1b1",
+"Cp3mZjfREu","v1HlnpAhR1","0KyfsiB08l","jiVBPMaJQs","lweGy9eoRc","WmadA2Nslm","QssNCtlILt","dpe1vK4GS8","jiVBPd7vjM","YjB9tzz4ZU",
+"jzUqRjtn0X","Fhtgliqv4k","2ZHdkLbRTH","AmdQdyluBx","5Nammo8Uyd","QworukB5nP","2NslmRsQUq","KZamHFjHXR","X6Piniqv4k","GXdoHM3zXL",
+"Oz8yZP6bcg","UlU3Maez9y","iwzGkPYBf4","soy9thi5X7","EdBKcjiVBP","d7vjMWPmlx","CxVEf8xEKz","qaofN29QAz","DG4sTogLgc","lj07QiB08l",
+"OUqFMEoToP","55rfBU3yw5","2hEEUgf8rI","OxWIHlkMUA","lXFOBFPfSE","FwEJzFjHXR","lViBvbrhlQ","TXQ0Zx3LDe","JKWYRMGlTF","RsQUqyofH3",
+"gjUTuW3VFH","8RCUACqqaD","LDk6foGu6x","FjHXRd85a9","29QAzAOgEe","yvOMILDk6f","Ta8f6ThjNn","LewvMjfREu","5ZaEzDLhzM","yluBx0PktI",
+"uZPqgwDajX","AXpwERzaZA","ZhwG1KsjRK","d7vjMFwEJz","9XyT9MK07Y","dpe1vciuWz","9eoRcOUYuF","NAFuwiwzGk","yofH3nlaBy","jiVBPix74r",
+"F6PT2aDGtS","suY4xuoStw","YOfrYMK07Y","v8yFNoGu6x","Ss0Zu16lHc","prNT6iwzGk","QbxXcD6rBy","FVMxox3LDe","Mkgy8LewvM","7fsYMyToGW",
+"RACujguMb8","4dEz6Rxrsm","n8pJ9POUYS","pmeCdS77LH","dQ586gf8rI","JRJQB8RCUA","FFDuiGSQwj","Ul4a1s93Ml","Kr8ysv2eC3","JIqXi9XyT9",
+"9eoRcfqypy","MK07YReKEW","CdyBV8TxD7","BCxeC7lUXZ","kZANmRxrsm","JJs5mRpBQm","oGu6xC2Irc","s93MlJ2mQi","ZJTXHnnP8o","Q6LixWmadA",
+"JJs5moGu6x","StlDJzz4ZU","zbIYYpAhR1","2Yz7ED6rBy","4QMc9nFqik","uAWypjfREu","hE1Ql48cHL","4QMc90Kyfs","cShY22DREs","3otm6L7cGc",
+"16lHctjQxs","0Wr5yzmLYD","dpe1viwzGk","VjCZqmX2GE","OHaBzHfyNQ","euZA5prNT6","JIqXi5iGN5","ogLgcM3zXL","0BmCy4dEz6","euZA5BFkb8",
+"Nxx9VlweGy","fcwDaguMb8","n8pJ9nnP8o","OxWIHKr8ys","SbRYyaFFss","dhSuHlViBv","dQ5861LB1L","zY1GYStlDJ","6AFT0NAFuw","pv0i7xReec",
+"n1pmOhe9IA","ni2v148cHL","bZLvSuupzk","RzaZAOUYuF","pvgjSQ6Lix","29QAzxReec","t59lR9y4lw","pvgjSjiVBP","xReecdhSuH","ZhwG1xciqp",
+"guMb8s7Mxk","HzZT814FLR","xReecs93Ml","lj07Q16lHc","jS1ajGv3Fq","pFrrlHlUbF","Rxrsmlm0pD","bZLvS4W0Tl","VLTy6guMb8","uJScXRmDcr",
+"oQ87rMm8si","QClRLZzJHW","EOE1oS2Dfu","TCgPppT8wu","Gv3FqOz8yZ","fFDrJs4786","prNT65ZaEz","WPmlxtlILt","uLtKsZ4I1v","QClRLCK5W7",
+"bZLvS16lHc","vkCHHuJScX","fLNg8DLhzM","G1RhSlXFOB","0Kyfs0ao3l","8FmFHF6PT2","lXFOBD6rBy","zQt6QsuY4x","zHF1q9eoRc","WreyPd85a9",
+"cmXIXWDVWJ","iwzGkBCxeC","0KyfsX6Pin","618DiYw2oU","U3yw5IBe8k","LDk6fpvgjS","Kr8ysrz7Ut","7hyVviKqhr","WreyPZhwG1","9GXkXWPmlx",
+"5Drn0PYBf4","dQ586HP433","KZamH4dEz6","WmadAQ6Lix","ThjNnYf2Ec","tAOsrvOqCE","CK5W78RCUA","ulk41ogLgc","F6PT2gf8rI","zqH0WHzZT8",
+"ulk41brhlQ","WmadAsuY4x","55rfBRkQke","Waim6zY1GY","uJScXguMb8","dpe1vwiHrZ","0Kyfs0Wr5y","Z4I1vdpe1v","dpe1vCK5W7","jtn0Xd7vjM",
+"qaofNQworu","Uvlv445cIH","BGaQYaDGtS","Zv7z0xXTI4","Mm8sihUTw7","W7cTsaez9y","5iGN5nnP8o","RkQkeL7cGc","WPmlxpv0i7","h1zcHFNYIM",
+"SWfouRzaZA","AmdQdM6qcG","VjCZqXflUq","zQt6QYjB9t","0PktIi3pyd","qUJMd0Kyfs","k85AeKZamH","oQ87rSmGzv","5nmWvoQ87r","ThjNnYh1hF",
+"K20wKpT8wu","tl72WZzJHW","he9IARmDcr","9rlg9e6e4z","7Ow5C16lHc","0MR5XlCMxy","FxX9qyluBx","rz7Ut618Di","XyPZNcQOnv","O3iyQm4bxU",
+"P6bcgokgRi","vkCHHSWfou","XflUqHP433","5NammTXQ0Z","dpe1vcShY2","nnP8opT8wu","2ZHdkDLhzM","0ao3lvLsmS","J2mQitlILt","Q6hMCNo0Qb",
+"gIYvE64s8N","hUTw7AXpwE","5VZjSGrDg7","Z4I1vSjskQ","BpYhVnnP8o","TwanoZzJHW","5IhmGECMvU","fqypyRACuj","d7vjMVjCZq","y94nwXflUq",
+"4QMc9Vprf2","W7cTsThjNn","0Wr5yjS1aj","I7p2aiqv4k","vLsmSfLNg8","XflUqzbIYY","Z4I1vS2Dfu","8U2nUEOE1o","VIlwPatef2","0BmCyFnPFB",
+"kB5nPh1zcH","ZhwG1okgRi","BFkb8Ss0Zu","ydG8UzY1GY","0YAGHcShY2","lViBv1j5L8","pvgjS9eoRc","qQxHPMGlTF","SmGzvblLA9","WaWsvyofH3",
+"FxX9qFPfSE","pAhR17lUXZ","LbRTH24ARF","29QAzeuZA5","48cHLdQ586","FnPFB48cHL","29QAzY1mC0","PYBf4iKqhr","tuDySpv0i7","FhtglFNYIM",
+"cmXIXD6rBy","yofH3HP433","FnPFBMK07Y","W3VFHCxVEf","Mm8siFnPFB","JIqXijtn0X","QssNCaDGtS","5Mg9r0Wr5y","X6PinOUYuF","jfREuqaofN",
+"soy9tpWiOs","AmdQdiqv4k","KASQ8lm0pD","6AFT0oQ87r","lCMxyBpYhV","0YAGHCqqaD","CK5W7kZANm","kB5nPZJTXH","S77LHFhtgl","qUJMdBbwgA",
+"7Ow5C2Yz7E","pAhR16q6L9","No0Qb5IhmG","azIWpyToGW","DQimpFjHXR","Kr8ysW7cTs","MojnPbrhlQ","k85AepmeCd","fcJOyGWqqX","BbwgAi7WMQ",
+"zHF1qG1RhS","RBhp0GXdoH","Mm8siUl4a1","o8UydM6qcG","brhlQa00b5","pWiOszQt6Q","5NammrKDLJ","uJScXHfyNQ","ReKEW618Di","OxWIHzQt6Q",
+"kB5nP7hyVv","QClRLXyPZN","B3qemOz8yZ","rz7UtPb1pa","8hJdtSWfou","DQimpnnP8o","bgJAzFwEJz","he9IAK20wK","rhl0JMaJQs","45cIHYOfrY",
+"AXpwEuvf7A","0h1b15ZaEz","xReeczY1GY","KZamHxXTI4","piJSkKsjRK","HzZT8dpe1v","Yh1hFfqypy","nnP8oiKqhr","oGu6xK20wK","K4GS8BpYhV",
+"QssNChE1Ql","vkCHHwDajX","k85AeFGzgp","1LB1La00b5","faHirhSSvQ","FcWrWFLsph","W7cTsh1zcH","v2eC3lkMUA","l83UdlweGy","JkzUnt98iW",
+"pmeCdFwEJz","RkQkenlaBy","hYBCKChuy3","ZhwG15Namm","zHF1qgf8rI","Ss0ZujfREu","ZzJHWMezSW","n8pJ9ECMvU","F6PT2i3pyd","EoToPWPmlx",
+"gjUTu0ao3l","WmadAGv3Fq","rhl0Js93Ml","s4786uZPqg","48cHLGWqqX","VjCZq29QAz","2Yz7Efqypy","yvOMIt59lR","Q6hMCJXljW","7lUXZfcwDa",
+"VLTy60h1b1","XflUqCxVEf","No0Qb8FmFH","jiVBPogLgc","FVMxoIRh48","HRxd8Yw2oU","kB5nPbrhlQ","HRxd88cVD3","FPfSE7lUXZ","WreyPqUJMd",
+"vLsmSqQxHP","gIYvEdhSuH","S2DfuAXpwE","LbRTHCfgr3","JIqXiCqqaD","45cIHLewvM","iqv4kOUqFM","Ss0ZuM3zXL","0KyfsYOfrY","jiVBPUmaEv",
+"piJSkprNT6","blLA9M3zXL","cL0aEa00b5","BpYhVt98iW","2Yz7EVprf2","W7cTsW7cTs","2DREs9iGoT","IBe8kpv0i7","v2eC3n1pmO","W3VFHpAhR1",
+"piJSkuupzk","aFFssjzUqR","9y4lwReKEW","bZLvS3weIF","HlUbFBFkb8","No0Qb9iGoT","bgJAzCdyBV","zqH0W1v5hH","jiVBPSbRYy","1LB1LPb1pa",
+"AOgEe48cHL","aDGtS2TRI7","yEfy9Rxrsm","fmIK1FcWrW","HlUbFl83Ud","Kr8ys5ZaEz","pT8wuyToGW","uvf7AqQxHP","tuDySfmIK1","5nmWvMm8si",
+"jfREusoy9t","atef2lCMxy","AIYUuRsQUq","pvgjSMmsIo","rKDLJxXTI4","ZUnqt5iGN5","2DREsOUqFM","VjCZqFhtgl","kZANmJRJQB","mX2GElViBv",
+"lm0pDRACuj","okgRi64s8N","FnPFBtjQxs","O3iyQ7lUXZ","7fKYUgjUTu","v2eC3HP433","Cfgr3FPfSE","Fhtgl45cIH","Fhtglv2eC3","NOHszogLgc",
+"b29RJgtCA5","HzZT8jiVBP","tlILtKASQ8","zFgtBt59lR","HP433azIWp","yluBxgIYvE","1j5L8ydG8U","yToGWIjTwP","mz8gxQbxXc","RACujS2Dfu",
+"RzaZAGXdoH","5iGN5h1zcH","dmoS7WaWsv","9y4lwC2Irc","FcWrWVLTy6","FxX9quvf7A","yvOMIjtn0X","8xEKzazIWp","JRJQB0ao3l","cShY2RzaZA",
+"pT8wu1v5hH","8xEKz5iGN5","IKxdLrhl0J","LDk6fVprf2","VLTy6RkQke","0BmCy8hJdt","x3LDeKsjRK","MaJQs0MR5X","wDajXlm0pD","JKWYR0h1b1",
+"5Drn0a00b5","Mm8si8cVD3","BGaQYuN6r3","fFDrJ8U2nU","ZJTXHhYBCK","AXpwEazIWp","ydG8UuPX7G","guMb8iqv4k","dhSuHEoToP","tAOsrUlU3M",
+"KASQ8WmadA","pv0i7zqH0W","J2mQiEOE1o","ZzJHW5VZjS","jtn0XAIYUu","EoToPQ6Lix","cShY2U3yw5","CdyBVTCgPp","IKxdLk85Ae","Chuy3HfyNQ",
+"uZPqgJ2mQi","Zv7z00BmCy","XyPZNYh1hF","5ZaEzt98iW","LDk6fd7vjM","P6bcg5nmWv","9iGoTMm8si","16lHcCK5W7","TXQ0Zix74r","hSSvQQworu",
+"Oz8yZrz7Ut","ulk410h1b1","uAWypBCxeC","MGlTF45cIH","IKxdL9XyT9","FwEJzK20wK","dhSuHRkQke","zmLYDJRJQB","J2mQiHRxd8","IjTwP48cHL",
+"y94nwJJs5m","K4GS8Z4I1v","lpF6WU3yw5","G1RhSQ6Lix","tl72WEdBKc","lpF6WTa8f6","kB5nPFPfSE","UmaEvHzZT8","VerEA2DREs","7lUXZfqypy",
+"SbRYyuQIcz","S77LHlXFOB","v2eC3PYBf4","AkKTk8hJdt","t59lRQworu","0Wr5yXflUq","GSQwjdmoS7","TXQ0ZSmGzv","WPmlxWaim6","In3NS6q6L9",
+"MaJQsZzJHW","vLsmS07n1c","prNT6PYBf4","iKqhrDG4sT","Gv3Fq5Namm","7fKYUiKqhr","QbxXcX6Pin","FLsphMojnP","P6bcgKASQ8","9GXkX0MR5X",
+"Waim6azIWp","hi5X7s7Mxk","cShY2e6e4z","Vprf2EoToP","v8yFN0MR5X","EoToPMkgy8","7fKYUMm8si","oGu6xuPX7G","rKDLJnnP8o","ulk41GWqqX",
+"fcwDa2DREs","aL6AJzmLYD","SWfou64s8N","WaWsvdmoS7","QbxXcLbRTH","SWfouZuDtD","oQ87rEdBKc","2TRI7cShY2","k85Aerhl0J","4dEz6CdyBV",
+"IRh48v1Hln","VBjhzm4bxU","Yw2oUi7WMQ","cQOnv2hEEU","5drc6fcwDa","3weIF0BmCy","s7MxkYw2oU","CxVEfOxWIH","vkCHHFnPFB","euZA564s8N",
+"QssNCTwano","uPX7GD6rBy","QYxC014FLR","07n1cRkQke","zz4ZUnlaBy","Gv3Fq5drc6","wDajXOz8yZ","J2mQiGWqqX","tuDySWreyP","QChxsuoStw",
+"l83Ud5ZaEz","BCxeCLDk6f","zz4ZUblLA9","S77LHYw2oU","7hyVvPYBf4","l83Ud14FLR","No0QbhSSvQ","jzUqRQ6Lix","9iGoTSmGzv","pWiOshUTw7",
+"WaWsvyvOMI","L7cGcLewvM","ZzJHWTa8f6","GWqqXAOgEe","yEfy9hE1Ql","pmeCdcShY2","14FLRhe9IA","YOfrYMaJQs","iKqhrs93Ml","hYBCKWDVWJ",
+"Nxx9VdhSuH","sqVrfs7Mxk","HfyNQ4dEz6","24ARFksJby","Uvlv4FcWrW","FNYIM0YAGH","bZLvSciuWz","zqH0W4W0Tl","n8pJ9ZUnqt","I7p2ay94nw",
+"AmdQd0Wr5y","RACujzz4ZU","d7vjMe6e4z","7Ow5C1LB1L","hi5X7pFrrl","LDk6fF6PT2","bgJAztvdkD","zQt6QChuy3","yEfy9yEfy9","hSSvQ8U2nU",
+"vLsmSru4UG","nnP8ogjUTu","NcICAVerEA","G1RhSP6bcg","uLtKsnlaBy","NOHszvkCHH","64s8NgjUTu","RpBQmAgJHQ","3weIFxXTI4","8U2nUFFDui",
+"7fKYURxrsm","aL6AJ55rfB","7Ow5CQbxXc","ru4UGOUqFM","2Yz7EuTacx","3weIFQYxC0","KsjRK2Nslm","K4GS8tl72W","5VZjSyToGW","Mkgy8HfyNQ",
+"RBhp0ni2v1","YOfrY7hyVv","YOfrYVIlwP","5VZjSQWxoT","FGzgpyluBx","9iGoTJKWYR","piJSk0Wr5y","zz4ZUdQ586","7fsYMru4UG","7fsYM4QMc9",
+"5IhmGlH1kt","ydG8Udpe1v","iqv4ksx5Gl","Cp3mZzY1GY","NOHszECMvU","oGu6xxReec","cShY2lpF6W","0KyfsoGu6x","55rfBAIYUu","lweGyZ4I1v",
+"StlDJ0PktI","cL0aEGWqqX","sqVrfydG8U","jeskSiqv4k","tjQxsMm8si","lH1kti7WMQ","hUTw7XyPZN","AXpwERpBQm","VNCPduTacx","n1pmOyToGW",
+"1LB1LMGlTF","fmIK1suY4x","VerEAJRJQB","taOXKCK5W7","ZuDtDni2v1","16lHcQWxoT","dmoS79eoRc","FcWrWNAFuw","5iGN5tlILt","FcWrWix74r",
+"FNYIMcShY2","QbxXcEOE1o","zHF1qQClRL","lCMxy5Namm","SbRYy7X3uy","vkCHHFhtgl","Cfgr3F6PT2","ni2v13weIF","t59lR618Di","48cHLlXFOB",
+"14FLRFLsph","VerEAThjNn","aDGtSQnJ1S","blLA9xXTI4","uQIcztl72W","t59lR0MR5X","o8UydgjUTu","jzUqRBpYhV","mz8gxtl72W","JKWYRt59lR",
+"a00b5cShY2","MmKGJfcwDa","B3qemJKWYR","P6bcgDLhzM","MK07YtAOsr","I7p2alweGy","Yh1hFG1RhS","XflUqY1mC0","24ARFS2Dfu","kB5nPgIYvE",
+"s7MxkD6rBy","QssNCRACuj","AgJHQTCgPp","MaJQsZv7z0","LDk6f8TxD7","tuDySQ6Lix","D6rByJKWYR","jSjS3FLsph","Vprf2v8yFN","iwzGkGv3Fq",
+"K4GS8guMb8","ZJTXHMojnP","JJs5mhE1Ql","VjCZqbrhlQ","MmsIon8pJ9","5nmWvvOqCE","JKWYR5Drn0","F6PT2MmsIo","uupzk7hyVv","RxrsmCdyBV",
+"B3qemx3LDe","OUqFMtl72W","NAFuwMezSW","v2eC3Waim6","tl72WlXFOB","RkQkeksJby","pv0i7aL6AJ","hSSvQzqH0W","zHF1q48cHL","MezSWFVMxo",
+"lpF6WSbRYy","MGlTFHfyNQ","FwEJztvdkD","bZLvSWaWsv","9XyT9QssNC","guMb8i7WMQ","VBjhz2TRI7","lkMUAmz8gx","3otm66AFT0","Vprf2aL6AJ",
+"K20wKyluBx","9XyT9CK5W7","GWqqXQYxC0","7fsYMzFgtB","tjQxsQworu","ksJbyL7cGc","pWiOsReKEW","U3yw5lsQGo","IKxdLzHF1q","QworuhYBCK",
+"wDajXCxVEf","RpBQmJJs5m","BCxeCulk41","hSSvQNcICA","7hyVvSbRYy","zz4ZUFNYIM","0PktIMkgy8","dhSuHL7cGc","No0QbcL0aE","M3zXLfaHir",
+"K4GS8KASQ8","xciqpYf2Ec","yluBxlm0pD","0PktIzbIYY","iB08ldQ586","v1HlnCNHmv","5iGN57fKYU","zFgtBazIWp","HzZT8DcpWB","s7MxkkZANm",
+"45cIHECMvU","bZLvSl83Ud","blLA9G1RhS","n1pmOlpF6W","JIqXiYjB9t","9eoRc48cHL","tjQxshSSvQ","bgJAzSjskQ","prNT6gf8rI","aez9yMGlTF",
+"2TRI7Mkgy8","IRh48VIlwP","QbxXco8Uyd","WreyPFLsph","mz8gx9iGoT","0ao3lGXdoH","m4bxUAkKTk","FFDuivOqCE","M3zXLM3zXL","pmeCdL7cGc",
+"0YAGHlCMxy","cmXIX5Namm","W7cTsOHaBz","XflUqWmadA","ThjNn4dEz6","BCxeCCxVEf","Yh1hF0h1b1","TwanowDajX","U3yw5Q6hMC","SmGzv8RCUA",
+"HzZT8prNT6","Nxx9V2ZHdk","EoToPazIWp","CqqaDDz1R3","VNCPdpWiOs","JJs5mReKEW","lH1ktCdyBV","P6bcgS2Dfu","Yf2EcbgJAz","FFDuiVjCZq",
+"sqVrftl72W","euZA5K20wK","O3iyQLDk6f","FFDuizFgtB","pFrrljSjS3","FxX9qFjHXR","DQimpWaim6","zQt6Qtl72W","L7cGcy94nw","v2eC3x3LDe",
+"jzUqR8TxD7","MaJQsMm8si","lsQGoqaofN","Z4I1vHRxd8","RxrsmEoToP","FcWrWFjHXR","aDGtSAmdQd","FLsphuJScX","JIqXiVNCPd","QClRLZJTXH",
+"J2mQiIn3NS","AOgEebZLvS","Yw2oUFwEJz","Kr8ysjiVBP","U3yw5HlUbF","GXdoHMK07Y","jtn0XVIlwP","FxX9qJKWYR","W3VFHatef2","hYBCKUmaEv",
+"o8UydqUJMd","euZA5OHaBz","prNT6X6Pin","hSSvQ7fsYM","uN6r38RCUA","Q6LixYf2Ec","M6qcGYh1hF","HRxd8qUJMd","55rfBYOfrY","MezSWCxVEf",
+"29QAzt59lR","qUJMd4QMc9","OHaBzVerEA","cL0aEDQimp","jSjS39XyT9","QClRLvLsmS","0MR5X55rfB","3weIF618Di","YOfrYbZLvS","m4bxUVIlwP",
+"VjCZqnnP8o","1LB1LWMiS3","iwzGknnP8o","uTacxChuy3","zz4ZURzaZA","MGlTFIKxdL","taOXKpT8wu","Cfgr3guMb8","EdBKcRxrsm","5drc6yToGW",
+"0ao3lzbIYY","BpYhVEOE1o","uAWypSWfou","gjUTu580YD","hE1QlOxWIH","0ao3l3weIF","XflUq7fKYU","v1HlnIRh48","ogLgcY1mC0","Pb1pae6e4z",
+"QClRLOUqFM","MojnPyofH3","pv0i7mX2GE","uQIczaDGtS","o8UydYw2oU","ReKEWuPX7G","8TxD7HP433","NhXduuQIcz","24ARFkB5nP","Oz8yZjfREu",
+"WmadA7hyVv","Yh1hF7Ow5C","64s8NHfyNQ","B3qem48cHL","AXpwEgIYvE","JkzUnblLA9","hE1Qllj07Q","pFrrloVQp6","hSSvQzbIYY","SmGzvjeskS",
+"lpF6WWaWsv","gIYvEo8Uyd","pv0i7uLtKs","4QMc9DcpWB","v2eC38TxD7","0KyfsXflUq","lm0pDlH1kt","v8yFNdQ586","9GXkXKASQ8","pAhR1UlU3M",
+"0KyfsdhSuH","2DREsiwzGk","UmaEvGv3Fq","DLhzMlkMUA","xReecjiVBP","JXljWWDVWJ","HP433h1zcH","kB5nPpiJSk","MmKGJ9y4lw","CNHmvM3zXL",
+"xciqp9eoRc","FFDui3weIF","5Mg9rM6qcG","Pb1paS2Dfu","W7cTsUvlv4","yofH3FPfSE","GXdoH8RCUA","5iGN5jtn0X","uQIczhi5X7","580YDm4bxU",
+"VIlwPix74r","rKDLJqaofN","9GXkXydG8U","xciqpbZLvS","BGaQYRmDcr","Ss0ZujSjS3","zHF1q07n1c","MezSWa00b5","jeskSv2eC3","RsQUqbrhlQ",
+"QYxC0QYxC0","JXljWUmaEv","Mm8siMojnP","fLNg8Chuy3","M6qcG6AFT0","FhtglDcpWB","kZANmZzJHW","hUTw7oQ87r","AIYUuni2v1","RBhp0lkMUA",
+"HP4338TxD7","zQt6QzHF1q","DG4sTThjNn","NAFuwQworu","OHaBzAkKTk","WreyPxReec","s93MlgdQsS","ix74r16lHc","faHir3weIF","d7vjMUmaEv",
+"v2eC3CK5W7","IRh481j5L8","d7vjMuZPqg","FjHXRZJTXH","8hJdtv2eC3","ciuWzTXQ0Z","hSSvQoVQp6","ni2v1rKDLJ","Mm8siWPmlx","SbRYyjtn0X",
+"DG4sTDG4sT","DcpWBqaofN","ZUnqtyToGW","cmXIXnFqik","MK07YYw2oU","jzUqRvLsmS","vOqCEhUTw7","Kr8ysKASQ8","ydG8Ufqypy","Uvlv4X6Pin",
+"yEfy9gf8rI","6AFT0brhlQ","MaJQsTXQ0Z","5ZaEzs93Ml","YOfrYs4786","ksJbyPOUYS","uQIczSWfou","RsQUq5Mg9r","VLTy6AgJHQ","7fKYU5ZaEz",
+"kB5nPJJs5m","fLNg8POUYS","5nmWvuPX7G","0h1b1FLsph","Yf2Ec7Ow5C","xciqp24ARF","RBhp0RkQke","HP433wiHrZ","0Wr5yokgRi","RsQUqCIShG",
+"C2IrcVBjhz","8cVD3i7WMQ","WMiS3v2eC3","GXdoHGv3Fq","48cHLm4bxU","n1pmO0Kyfs","qUJMdYjB9t","fcwDaXyPZN","y94nwS77LH","4QMc9iB08l",
+"S2Dfut59lR","l83UdJIqXi","ciuWzn8pJ9","nFqikzHF1q","ZJTXHkB5nP","aez9yWPmlx","Nxx9VKASQ8","HfyNQLewvM","sx5GlAkKTk","nlaByI7p2a",
+"k85AexReec","AkKTk8xEKz","0Wr5yQ6Lix","b29RJ3otm6","WaWsvcQOnv","MaJQsqQxHP","0MR5XQbxXc","2ZHdki3pyd","ogLgcEdBKc","580YDOxWIH",
+"ECMvUSjskQ","WmadAcQOnv","ZuDtDUvlv4","MmKGJWaim6","Cp3mZ5nmWv","vLsmSfmIK1","Uvlv414FLR","VerEABpYhV","pWiOsRsQUq","t98iWIRh48",
+"S77LHRzaZA","QYxC0DQimp","Kr8ys7lUXZ","7fsYM0PktI","Oz8yZZv7z0","16lHcDz1R3","HzZT8NOHsz","07n1che9IA","2DREspWiOs","Z4I1v2DREs",
+"uAWyp9eoRc","Chuy3taOXK","4W0TlKsjRK","LewvM4dEz6","lm0pDlCMxy","Chuy3MK07Y","soy9tDG4sT","b29RJI7p2a","QClRLSs0Zu","JXljWYh1hF",
+"FPfSEyluBx","RzaZAtuDyS","v1Hln9XyT9","07n1c5iGN5","Cp3mZBbwgA","he9IAFhtgl","UlU3Mdpe1v","HP433FnPFB","64s8NDQimp","qQxHPF6PT2",
+"RxrsmGXdoH","M3zXL5IhmG","45cIHCNHmv","NOHszZhwG1","K20wKru4UG","azIWpy94nw","zbIYYM6qcG","2NslmO3iyQ","aez9yx3LDe","SmGzvK4GS8",
+"AIYUuOUqFM","IKxdLK4GS8","bZLvSxciqp","uLtKsfcwDa","W7cTsiKqhr","14FLRZhwG1","mX2GEs4786","pFrrldjsrv","MmsIojtn0X","VLTy6pFrrl",
+"QssNCAIYUu","uvf7AVIlwP","QYxC0m4bxU","UlU3Mru4UG","NOHszix74r","jS1ajZuDtD","pT8wuTwano","lpF6WnFqik","iKqhrfqypy","ZUnqtBCxeC",
+"nnP8oa00b5","HlUbFoQ87r","BpYhVsuY4x","P6bcgMGlTF","aDGtStaOXK","Zv7z08cVD3","ogLgc3otm6","9eoRcvkCHH","2DREsZv7z0","zY1GYHP433",
+"gdQsSuLtKs","QbxXcJXljW","uupzkFnPFB","2ZHdk5Drn0","SmGzvx3LDe","vLsmSeuZA5","Yf2Ec6AFT0","Uvlv4OHaBz","HfyNQRkQke","Ta8f6tuDyS",
+"X6PinECMvU","Cfgr3vLsmS","9eoRcOxWIH","oVQp6VIlwP","VjCZqEOE1o","IjTwP618Di","iwzGkyEfy9","vkCHH580YD","KASQ8ZJTXH","ulk41ru4UG",
+"SbRYy9XyT9","d7vjMYOfrY","RmDcrBCxeC","HP433dQ586","EOE1oQ6hMC","fqypyqUJMd","n8pJ9QYxC0","guMb8pvgjS","mX2GEa00b5","jzUqRTwano",
+"FhtgliB08l","Z4I1vCp3mZ","aL6AJaDGtS","W3VFH9iGoT","oGu6xni2v1","NcICADz1R3","8xEKzuPX7G","FjHXRYjB9t","I7p2aFNYIM","FxX9qqQxHP",
+"Cp3mZGXdoH","gf8rIzQt6Q","Pb1paCIShG","jS1ajpT8wu","aL6AJ5VZjS","Ul4a1tvdkD","mX2GEcShY2","t98iWdjsrv","OHaBzuupzk","yvOMIru4UG",
+"M6qcG0BmCy","zHF1qRkQke","dhSuH5drc6","i7WMQRzaZA","taOXK1LB1L","K20wKYOfrY","S2DfuSmGzv","Uvlv4zbIYY","iB08lCp3mZ","GrDg7pAhR1",
+"Ul4a1oVQp6","taOXKZv7z0","XflUqWaim6","FnPFBgf8rI","GSQwj1v5hH","FGzgpdhSuH","QClRLFGzgp","QYxC0n8pJ9","suY4xRBhp0","16lHcStlDJ",
+"RsQUqC2Irc","he9IAy94nw","zHF1q8xEKz","4W0TlUmaEv","EoToPTCgPp","Kr8ys0ao3l","2ZHdkYw2oU","FnPFBtaOXK","fFDrJguMb8","45cIHBGaQY",
+"iB08l0Wr5y","vLsmSBpYhV","EdBKcgIYvE","RxrsmC2Irc","Chuy355rfB","nnP8opWiOs","pWiOsW3VFH","CIShGRmDcr","S77LHzFgtB","v2eC355rfB",
+"Kr8ysYjB9t","FjHXR9iGoT","v2eC3EdBKc","gtCA57ku1p","uAWypn8pJ9","P6bcgMm8si","wiHrZM6qcG","AXpwEiKqhr","jfREuGrDg7","gf8rINOHsz",
+"M3zXLQChxs","7fsYMpFrrl","qQxHPKASQ8","RzaZA0Kyfs","Nxx9VHzZT8","9iGoTZ4I1v","1v5hHZhwG1","VjCZqjSjS3","8cVD3gjUTu","EdBKcM6qcG",
+"Nxx9VfmIK1","4dEz6JXljW","7X3uyatef2","uTacxJ2mQi","uPX7GS2Dfu","QWxoTazIWp","Kr8ysCp3mZ","ZzJHW1LB1L","Cfgr3NAFuw","LewvM24ARF",
+"MmKGJVIlwP","0Wr5yzbIYY","lweGy8cVD3","euZA5Uvlv4","8hJdtRmDcr","KZamHs4786","IKxdLjeskS","sx5Gl2Yz7E","k85Aet59lR","Cfgr3HfyNQ",
+"FFDuifaHir","mX2GEVLTy6","CK5W7POUYS","2hEEUcQOnv","QnJ1Sm4bxU","BGaQYWDVWJ","5IhmGAOgEe","5nmWvoVQp6","xReectuDyS","5VZjSuQIcz",
+"JKWYR8hJdt","5Drn0HRxd8","yofH3Ss0Zu","I7p2aHzZT8","9iGoTMmsIo","lweGyjeskS","hE1QlECMvU","3weIFdmoS7","lj07QgIYvE","48cHLlpF6W",
+"x3LDeCK5W7","W7cTso8Uyd","MmsIoQworu","K4GS82TRI7","RzaZAix74r","zHF1qpmeCd","VLTy6WPmlx","VerEAfcJOy","ReKEWNcICA","8FmFH8FmFH",
+"LbRTHQChxs","gIYvEPb1pa","8xEKzFxX9q","Yw2oUn1pmO","IRh48nFqik","CK5W7C2Irc","FFDuiIn3NS","5ZaEzL7cGc","HlUbFTwano","WmadAkB5nP",
+"POUYStlILt","W3VFHdmoS7","bZLvSNhXdu","5Drn0ni2v1","uQIczWDVWJ","Zv7z0CdyBV","Mm8siv8yFN","CxVEfCNHmv","hi5X70h1b1","MaJQsK4GS8",
+"t98iWtjQxs","cShY2Rxrsm","ciuWzNAFuw","WDVWJWaWsv","pWiOsQWxoT","taOXKSjskQ","tuDySEdBKc","SjskQMm8si","Zv7z024ARF","yEfy9rhl0J",
+"FVMxoFGzgp","GrDg7fFDrJ","gIYvEy94nw","RACuj29QAz","hUTw70ao3l","Uvlv4jiVBP","t98iW9XyT9","JKWYRlweGy","uoStwrhl0J","jzUqRxReec",
+"QYxC024ARF","HP433n1pmO","BFkb8LewvM","d85a9pvgjS","9iGoTkB5nP","618DiSbRYy","zbIYYdQ586","i3pydk85Ae","S77LHWaWsv","h1zcHwiHrZ",
+"8hJdtGSQwj","brhlQJ2mQi","gjUTu5IhmG","6AFT0EdBKc","0ao3l7fKYU","OUYuFfcJOy","LewvMaL6AJ","iwzGkuPX7G","lkMUAiqv4k","MGlTFzY1GY",
+"8RCUA5iGN5","AIYUuHP433","0Wr5yuZPqg","piJSkCdyBV","FhtglxXTI4","JXljWyluBx","AgJHQNcICA","ogLgc29QAz","y94nwfLNg8","DG4sTuTacx",
+"Pb1pauvf7A","MmsIopAhR1","ru4UGulk41","Ul4a1zbIYY","1v5hHa00b5","RsQUqhYBCK","dQ586GSQwj","WPmlxVprf2","JkzUnDLhzM","IBe8ktjQxs",
+"zbIYYhe9IA","LbRTHv1Hln","tvdkDtl72W","yToGWHzZT8","5nmWvQworu","ulk41uQIcz","gtCA58FmFH","kZANmNcICA","v1Hlnulk41","4W0TlWDVWJ",
+"2Yz7EMkgy8","SjskQBGaQY","9y4lwVBjhz","tAOsrOz8yZ","jSjS35IhmG","tl72WRmDcr","AXpwEAmdQd","FjHXRmX2GE","KZamHtAOsr","xXTI4i3pyd",
+"lViBvt59lR","GXdoHuLtKs","HlUbF0MR5X","lweGyuoStw","P6bcgZv7z0","7Ow5CTCgPp","IKxdLnlaBy","QssNCaFFss","64s8N9eoRc","fcwDak85Ae",
+"Ta8f6D6rBy","5IhmGhUTw7","EdBKcaL6AJ","HfyNQGXdoH","KASQ824ARF","azIWp16lHc","8U2nUaFFss","Ul4a1KZamH","JJs5miqv4k","FFDuiK4GS8",
+"CNHmvjfREu","RxrsmQ6hMC","VIlwPsqVrf","CNHmvfFDrJ","WDVWJlm0pD","M6qcG64s8N","W3VFHWaWsv","qUJMde6e4z","EdBKc0Kyfs","Ss0Zul83Ud",
+"yToGWNcICA","jSjS348cHL","QnJ1SyofH3","UlU3M580YD","fFDrJ2TRI7","M3zXLqQxHP","0Wr5yHP433","uJScXyEfy9","djsrvyofH3","ciuWzuoStw",
+"kZANm0Kyfs","FVMxoqaofN","64s8Nsoy9t","n1pmOuvf7A","hUTw7K4GS8","dpe1v9rlg9","LewvM7ku1p","16lHcTXQ0Z","nnP8onnP8o","14FLRaFFss",
+"JKWYRNxx9V","FPfSEK4GS8","5IhmGKASQ8","Vprf2n1pmO","sqVrftAOsr","Yf2EcLbRTH","zbIYYNxx9V","5IhmGuvf7A","FNYIMJRJQB","WmadAJJs5m",
+"dhSuHQ6hMC","0ao3lqaofN","6q6L9tuDyS","RpBQmtjQxs","pWiOs7X3uy","FGzgp5nmWv","5Drn0GXdoH","wDajXJkzUn","2Yz7E14FLR","piJSkM3zXL",
+"lweGyTa8f6","pT8wuPYBf4","lj07Q7fKYU","TXQ0ZWaim6","EdBKcRsQUq","y94nwksJby","Cp3mZDQimp","Mkgy8hUTw7","S2DfuFNYIM","cShY2ReKEW",
+"jzUqRSmGzv","QClRLiKqhr","MmKGJCp3mZ","MmKGJ0MR5X","M3zXLXyPZN","UmaEvB3qem","Y1mC0o8Uyd","Gv3FqF6PT2","BpYhVMaJQs","9iGoTtvdkD",
+"jiVBPzY1GY","FwEJzFNYIM","ulk418xEKz","M3zXLPYBf4","QbxXc5iGN5","pvgjS0MR5X","AIYUuYw2oU","6q6L9uQIcz","guMb8IBe8k","HRxd8zQt6Q",
+"4W0TlOHaBz","fcwDa7lUXZ","UlU3M29QAz","pvgjSyEfy9","HzZT8s4786","Dz1R35iGN5","14FLRZuDtD","UmaEvReKEW","SWfouVprf2","djsrvCdyBV",
+"OUqFMFFDui","SbRYySbRYy","SmGzvC2Irc","oVQp6AgJHQ","uoStwDLhzM","CqqaDv1Hln","AOgEeru4UG","lXFOBtAOsr","QYxC0Zv7z0","W3VFHvkCHH",
+"9eoRcBpYhV","i7WMQuN6r3","WmadAs93Ml","iKqhrt98iW","pT8wuSs0Zu","2NslmtvdkD","fmIK1xXTI4","hUTw70MR5X","NOHszuoStw","W3VFHPYBf4",
+"azIWpjfREu","nlaByVIlwP","MezSWFjHXR","QbxXc0YAGH","5ZaEzYjB9t","618Di55rfB","W7cTsjSjS3","7lUXZ7Ow5C","Waim6iwzGk","SjskQ64s8N",
+"ECMvUksJby","tjQxsxReec","Q6hMCbgJAz","OxWIH2ZHdk","G1RhSnnP8o","oQ87rzHF1q","TCgPpkB5nP","Q6hMC5Mg9r","jtn0X5Mg9r","uoStw5drc6",
+"NAFuwfFDrJ","e6e4z9GXkX","aL6AJNAFuw","8hJdtMmsIo","nlaByMezSW","v8yFNcL0aE","8xEKzcShY2","Y1mC0HRxd8","KsjRK0Kyfs","0MR5X2TRI7",
+"3otm62ZHdk","v2eC3L7cGc","jSjS3v8yFN","d7vjMBbwgA","BpYhVCfgr3","zmLYDRsQUq","jS1ajYOfrY","i7WMQvkCHH","VjCZquLtKs","RxrsmOUqFM",
+"uZPqguJScX","2DREsMm8si","0Kyfsjtn0X","NhXdupvgjS","UmaEvX6Pin","OUYuFIRh48","DLhzMSbRYy","7ku1pvOqCE","55rfBThjNn","ru4UGcQOnv",
+"CqqaDZhwG1","M6qcGgjUTu","faHirqaofN","pFrrlG1RhS","jiVBP4QMc9","tAOsrnFqik","uLtKs0h1b1","G1RhSdmoS7","M3zXLMezSW","ciuWz0h1b1",
+"7hyVvdjsrv","2Yz7EBFkb8","lH1ktyEfy9","fLNg8No0Qb","pWiOs7Ow5C","tAOsrDcpWB","hSSvQVerEA","AIYUuCp3mZ","W7cTsyluBx","dQ58629QAz",
+"FnPFBECMvU","K4GS8kZANm","b29RJnlaBy","kB5nPP6bcg","faHir7hyVv","m4bxUyEfy9","MmKGJK4GS8","tlILthUTw7","LewvMtuDyS","nFqikhYBCK",
+"LDk6fMm8si","qQxHPEOE1o","45cIHFFDui","In3NSfcJOy","fFDrJs93Ml","Q6Lix3weIF","y94nwzFgtB","POUYSVjCZq","8cVD34W0Tl","14FLRDLhzM",
+"zY1GYOUqFM","Z4I1vsx5Gl","iwzGk4dEz6","OUqFMHlUbF","d85a9BCxeC","JJs5mKr8ys","mX2GEfmIK1","uTacxGWqqX","pFrrl9XyT9","Ss0ZuAXpwE",
+"RBhp0gIYvE","n1pmOpWiOs","BGaQYSbRYy","JXljWnnP8o","uZPqgMm8si","uvf7AWDVWJ","lpF6WuLtKs","lweGyChuy3","lpF6W9iGoT","uupzkJIqXi",
+"ECMvUd7vjM","s93MlyofH3","WMiS3ThjNn","SmGzvdQ586","dQ586FjHXR","Cp3mZSmGzv","qQxHP9iGoT","sx5GlBpYhV","fcwDaprNT6","F6PT2AmdQd",
+"StlDJatef2","AmdQdJKWYR","FxX9qB3qem","0Wr5yuJScX","5Drn0Cfgr3","WmadAF6PT2","TXQ0Z9XyT9","GWqqXhE1Ql","QChxsAIYUu","2Yz7E9y4lw",
+"No0QbbrhlQ","EdBKc7lUXZ","AOgEekB5nP","BpYhV7lUXZ","8FmFHtjQxs","QClRLtaOXK","M6qcGSmGzv","m4bxUpT8wu","5Mg9riwzGk","MGlTF0MR5X",
+"1j5L8Yf2Ec","blLA9MezSW","ReKEWNOHsz","uLtKsuZPqg","FhtglJJs5m","MK07YUlU3M","t98iWFhtgl","a00b50BmCy","hYBCKReKEW","PYBf46AFT0",
+"jzUqRnlaBy","O3iyQpWiOs","s7MxklpF6W","brhlQlpF6W","mz8gx2hEEU","Pb1paDQimp","CNHmvMkgy8","Waim68xEKz","MK07YMkgy8","faHirsoy9t",
+"7X3uyB3qem","Z4I1vfqypy","7Ow5CtlILt","VerEAgf8rI","P6bcgStlDJ","Vprf2gf8rI","AmdQdyvOMI","B3qemSbRYy","suY4xWaWsv","JJs5mtaOXK",
+"soy9tFFDui","aL6AJKr8ys","0ao3lsx5Gl","CNHmvgtCA5","7fsYM8RCUA","Mm8siv2eC3","dQ586lm0pD","zFgtBjeskS","IKxdLulk41","4W0TlTXQ0Z",
+"sx5GlgjUTu","soy9t0ao3l","1LB1LM3zXL","QbxXcgIYvE","xciqp5nmWv","a00b5OUqFM","KASQ8zbIYY","uJScXNcICA","FGzgprz7Ut","bgJAzfcJOy",
+"24ARFCp3mZ","VLTy6Mm8si","hYBCKBCxeC","aez9yJJs5m","GrDg7LbRTH","9XyT9bgJAz","Waim6uvf7A","8hJdtQWxoT","dmoS7aez9y","5IhmG64s8N",
+"uvf7AhYBCK","fcwDaAmdQd","OHaBzhE1Ql","zqH0WHlUbF","soy9taez9y","8TxD7sqVrf","Y1mC02ZHdk","5IhmGPYBf4","sqVrfQssNC","jtn0XKr8ys",
+"guMb8QClRL","2hEEU45cIH","CxVEfh1zcH","n8pJ9EoToP","FcWrWBbwgA","Rxrsm4W0Tl","ni2v1FPfSE","QYxC0oGu6x","Y1mC0iB08l","G1RhSFPfSE",
+"gf8rIni2v1","NOHszDLhzM","uJScXaDGtS","YOfrY07n1c","mX2GEh1zcH","8FmFH5VZjS","b29RJFnPFB","G1RhS7X3uy","dQ586zHF1q","hi5X7l83Ud",
+"MK07YPOUYS","CdyBVIjTwP","Gv3FqyToGW","M3zXLblLA9","nnP8olXFOB","CqqaDNOHsz","5VZjSzbIYY","lweGyGv3Fq","yvOMI4dEz6","m4bxU1j5L8",
+"t98iWbgJAz","EoToPdmoS7","MaJQsdpe1v","cmXIXo8Uyd","azIWpBbwgA","RmDcrxReec","gdQsSi7WMQ","6AFT0s4786","YjB9twDajX","3otm6n1pmO",
+"Mkgy8jiVBP","fFDrJQbxXc","ThjNnHfyNQ","zFgtBJXljW","s93Ml45cIH","DG4sTguMb8","WPmlxiKqhr","Vprf216lHc","7lUXZfcJOy","2DREsQssNC",
+"cmXIX29QAz","Q6hMChUTw7","IBe8kXyPZN","QworulCMxy","HfyNQpWiOs","VIlwPIn3NS","Yf2EcVjCZq","nlaByW3VFH","0Wr5yAmdQd","WDVWJ0Kyfs",
+"lm0pDPYBf4","IBe8ksx5Gl","tuDySsuY4x","pAhR1Z4I1v","QbxXcBpYhV","zbIYYX6Pin","0YAGHMojnP","taOXKgtCA5","lsQGoQWxoT","UlU3MGWqqX",
+"HfyNQ1LB1L","XyPZNv1Hln","vOqCE07n1c","BpYhV9y4lw","7Ow5CgdQsS","QnJ1SzQt6Q","JXljWP6bcg","QChxsatef2","WDVWJG1RhS","y94nw7fsYM",
+"GrDg7e6e4z","Mm8siciuWz","bgJAzgjUTu","JIqXiQ6Lix","s4786ru4UG","yluBxvkCHH","FGzgpaez9y","s93MlZuDtD","29QAzaez9y","GrDg7uN6r3",
+"jiVBPQssNC","lj07QbrhlQ","yEfy9M6qcG","pAhR1CqqaD","QssNCM6qcG","Vprf22hEEU","ZhwG1qUJMd","FhtglO3iyQ","e6e4zuupzk","JkzUnVprf2",
+"rz7UthSSvQ","VLTy6KASQ8","UmaEv16lHc","9XyT9SmGzv","nnP8oFVMxo","Cp3mZVBjhz","FjHXR8hJdt","SmGzv7Ow5C","prNT6B3qem","VerEAVjCZq",
+"618Di7lUXZ","lpF6WWmadA","2NslmprNT6","OUqFMyluBx","bgJAzulk41","jfREuFwEJz","QssNCuTacx","HfyNQxReec","64s8NfcwDa","YOfrYQClRL",
+"OUqFMW7cTs","DQimpjS1aj","Mm8siNOHsz","gdQsSM3zXL","atef2FGzgp","yluBxD6rBy","VIlwP29QAz","d7vjM2Yz7E","NOHszm4bxU","9y4lw5drc6",
+"NOHsz580YD","ZuDtDAkKTk","fmIK1Q6hMC","ogLgcd85a9","IBe8k580YD","jfREuUvlv4","1j5L8ZJTXH","AmdQdpv0i7","0KyfsuQIcz","wiHrZyluBx",
+"5nmWvtuDyS","KsjRKxciqp","9iGoTydG8U","yvOMIWreyP","HlUbF29QAz","EoToPGWqqX","KASQ80ao3l","FVMxoRsQUq","zmLYD7Ow5C","RACujsuY4x",
+"s4786MaJQs","ECMvUuTacx","tl72WaDGtS","Q6hMCjzUqR","fcwDaTa8f6","t59lROUqFM","CK5W7CNHmv","AmdQdzQt6Q","CNHmvLDk6f","3weIFAXpwE",
+"FjHXRO3iyQ","he9IAGv3Fq","9XyT9EOE1o","t98iWNhXdu","kB5nPv2eC3","Yw2oUbZLvS","Yf2Ec3weIF","azIWpogLgc","Yf2EcZzJHW","ogLgcNxx9V",
+"b29RJnFqik","FjHXRyluBx","iKqhrMaJQs","ZzJHWuvf7A","djsrvtlILt","Twanov8yFN","QnJ1SZJTXH","ru4UGdmoS7","pvgjSuLtKs","jSjS3lViBv",
+"jSjS3v1Hln","Mm8si5Mg9r","MGlTFuQIcz","pT8wuGSQwj","k85AeFLsph","dmoS7ZhwG1","uLtKsPb1pa","W3VFHuN6r3","t98iWmz8gx","Waim6lCMxy",
+"v2eC35nmWv","jS1ajdjsrv","tlILtJRJQB","5IhmGhe9IA","qQxHPJXljW","lj07QrKDLJ","NAFuwGXdoH","8TxD7ZzJHW","vOqCElXFOB","gjUTuvLsmS",
+"SWfou5Namm","OUYuFG1RhS","ReKEWxciqp","Cp3mZWPmlx","GXdoHOz8yZ","LewvMUlU3M","dmoS7yofH3","s93Mlzz4ZU","MK07YVBjhz","BbwgA8TxD7",
+"48cHLJkzUn","Cp3mZ4W0Tl","oVQp6MaJQs","FNYIMWaWsv","brhlQ3otm6","pmeCd5iGN5","jSjS3b29RJ","zHF1q8cVD3","jiVBPtl72W","LbRTHMGlTF",
+"BpYhVxReec","8xEKzPb1pa","U3yw56q6L9","rKDLJjeskS","n1pmOWMiS3","n1pmOprNT6","OUYuFK4GS8","Oz8yZNxx9V","M3zXLhUTw7","WmadAFwEJz",
+"7hyVvksJby","Gv3Fq48cHL","Vprf2lH1kt","lpF6Wsx5Gl","BFkb8OUYuF","qUJMdfaHir","qaofNrhl0J","FFDuiRxrsm","9iGoTgdQsS","TCgPpsqVrf",
+"U3yw5IjTwP","uoStwFPfSE","HRxd8QnJ1S","oQ87rPOUYS","StlDJJ2mQi","DLhzMOUYuF","TXQ0ZChuy3","6q6L9DLhzM","s93Ml8TxD7","GSQwjzY1GY",
+"tuDySlj07Q","MaJQsG1RhS","Mkgy8HzZT8","v2eC3OxWIH","guMb8lpF6W","IjTwPM3zXL","2ZHdki7WMQ","0h1b1uPX7G","hUTw7SWfou","L7cGcvLsmS",
+"tvdkDguMb8","MezSWRBhp0","fLNg8uQIcz","4QMc9MmKGJ","gdQsS9eoRc","dQ586gjUTu","QWxoT2Yz7E","C2Irct59lR","fqypyhYBCK","uZPqgECMvU",
+"2hEEU5Mg9r","ZJTXHciuWz","SjskQY1mC0","O3iyQ9XyT9","zHF1qo8Uyd","QWxoTo8Uyd","faHirMmKGJ","jiVBPmz8gx","iKqhrzQt6Q","djsrvThjNn",
+"bgJAzD6rBy","48cHL5drc6","gjUTu7ku1p","YOfrYn8pJ9","S2Dfu9XyT9","iB08lnlaBy","FPfSERmDcr","euZA53otm6","W7cTsFLsph","ECMvUYf2Ec",
+"ksJbyEOE1o","jfREuVprf2","iwzGktvdkD","Ul4a1m4bxU","zHF1qI7p2a","uTacxhYBCK","0KyfsIRh48","JkzUnFcWrW","wDajXWDVWJ","LewvMI7p2a",
+"8U2nU9y4lw","Ul4a1lkMUA","FjHXRGSQwj","prNT6zHF1q","yEfy9iwzGk","8hJdtSmGzv","t59lRWmadA","n8pJ9Fhtgl","618DiRsQUq","zqH0WkZANm",
+"HlUbFKsjRK","cShY2S77LH","dQ586fFDrJ","7ku1p3weIF","e6e4zrz7Ut","yToGWJXljW","L7cGclH1kt","AgJHQ5ZaEz","W3VFH2Yz7E","FFDuiDLhzM",
+"5VZjSCp3mZ","ni2v1Mkgy8","fqypyECMvU","IKxdLlweGy","dhSuHMojnP","NAFuw7X3uy","Yh1hFW7cTs","d85a9lCMxy","Chuy3e6e4z","MmsIo0Wr5y",
+"IKxdLX6Pin","hE1QlZuDtD","M6qcGyvOMI","55rfB4dEz6","uQIczqUJMd","UmaEvxciqp","uQIczBpYhV","C2IrcJXljW","3otm6QYxC0","i7WMQprNT6",
+"4QMc9MK07Y","LDk6fpiJSk","aL6AJlXFOB","JIqXiqUJMd","s4786TCgPp","Mm8silpF6W","FFDuiLbRTH","QWxoTb29RJ","QChxsQClRL","RACujn1pmO",
+"IBe8k5Drn0","ZuDtD8TxD7","CdyBVQ6Lix","8xEKzW7cTs","t98iWzqH0W","Z4I1v5Drn0","FnPFB9eoRc","guMb8qaofN","Dz1R3Rxrsm","nnP8ox3LDe",
+"3otm6nlaBy","x3LDefqypy","U3yw5cShY2","brhlQOUqFM","zz4ZUmX2GE","OUYuFSs0Zu","LbRTHHfyNQ","BpYhVciuWz","JKWYRpmeCd","FwEJzTa8f6",
+"h1zcHvOqCE","Z4I1vAkKTk","qUJMdcQOnv","sx5GlfFDrJ","TwanoQ6Lix","5NammIBe8k","pv0i7aez9y","BbwgAWreyP","gf8rIBbwgA","IjTwPAkKTk",
+"fcJOyfaHir","5IhmG5IhmG","uLtKs45cIH","d85a9BFkb8","s93MlZUnqt","U3yw5ciuWz","G1RhSQ6hMC","a00b5lm0pD","MK07Yh1zcH","dpe1vVIlwP",
+"suY4xWmadA","VNCPdaFFss","0YAGH5Namm","e6e4zNOHsz","NAFuw5drc6","Y1mC0tuDyS","gf8rIWPmlx","14FLRrhl0J","0PktIMGlTF","NOHsz8RCUA",
+"FwEJz0MR5X","aL6AJzY1GY","uupzkwiHrZ","gjUTuKZamH","X6Pin9y4lw","xXTI4OUqFM","vOqCEbrhlQ","lm0pDqUJMd","9iGoTnnP8o","v1HlnDG4sT",
+"WreyPFnPFB","yToGWThjNn","FLsphCxVEf","FjHXRIBe8k","4dEz6DcpWB","d85a95IhmG","OHaBzMmsIo","0h1b1KASQ8","k85Ae7hyVv","B3qemW3VFH",
+"wiHrZKASQ8","dmoS79y4lw","s7MxkJRJQB","2Yz7EHfyNQ","ThjNnNcICA","2Yz7EFnPFB","vkCHHW7cTs","AgJHQFGzgp","NhXdupv0i7","d7vjMv1Hln",
+"jtn0XgjUTu","XflUquJScX","OUqFMmX2GE","YOfrYKsjRK","0Wr5ywDajX","CNHmvMGlTF","okgRi8xEKz","t59lRHzZT8","EOE1oh1zcH","pmeCdiB08l",
+"x3LDecQOnv","k85AeUvlv4","uN6r3nnP8o","gIYvEGSQwj","4QMc94W0Tl","ZzJHW9rlg9","ZhwG1ZuDtD","yToGW7Ow5C","Kr8yssx5Gl","Q6LixguMb8",
+"ulk41okgRi","cL0aEbgJAz","blLA98hJdt","RzaZAlXFOB","QbxXcChuy3","uPX7GNAFuw","NOHszIKxdL","DLhzMoQ87r","iqv4ki7WMQ","qaofNSmGzv",
+"Dz1R3nlaBy","QbxXc0BmCy","xReecKASQ8","aL6AJXflUq","bgJAzBGaQY","ru4UG9iGoT","VNCPd2Nslm","iqv4kThjNn","G1RhSCdyBV","xXTI4ZJTXH",
+"xReecStlDJ","1v5hHFhtgl","8TxD7AgJHQ","dpe1vx3LDe","POUYSSbRYy","KASQ8FNYIM","TwanoWaim6","DQimpQnJ1S","m4bxUlj07Q","5nmWvFhtgl",
+"FFDuiZUnqt","vkCHH16lHc","rhl0JFVMxo","lj07QiwzGk","BCxeC9iGoT","EdBKct98iW","CK5W7cmXIX","aDGtSgIYvE","FGzgpsoy9t","7fsYMAkKTk",
+"yEfy9BpYhV","MGlTF8U2nU","FPfSEuLtKs","OxWIHW3VFH","64s8NY1mC0","0ao3ln1pmO","UlU3MWPmlx","rKDLJuQIcz","uQIczS2Dfu","S2DfuM6qcG",
+"hE1QleuZA5","pFrrl8RCUA","SmGzvnFqik","7X3uyi7WMQ","Y1mC0CxVEf","5NammQWxoT","X6PinfcJOy","VLTy64QMc9","qUJMdAOgEe","JXljWB3qem",
+"14FLRPb1pa","1j5L89eoRc","QWxoTMaJQs","SWfouY1mC0","MezSWsx5Gl","iwzGkxciqp","xReec9rlg9","k85AevLsmS","i3pydyluBx","sqVrfHlUbF",
+"QYxC0azIWp","5NammuLtKs","0h1b1vOqCE","rz7UtyluBx","s7MxkxXTI4","0h1b1StlDJ","PYBf4mX2GE","FGzgphi5X7","5Drn0rhl0J","ni2v17X3uy",
+"xXTI4kZANm","d7vjMKsjRK","NAFuwHfyNQ","FjHXRCxVEf","pmeCd4QMc9","JkzUnKr8ys","lkMUASjskQ","FwEJz5Namm","Y1mC0dpe1v","Uvlv4FxX9q",
+"7Ow5CgIYvE","d85a9Q6hMC","IKxdL580YD","dhSuHZv7z0","6AFT0XyPZN","9iGoT580YD","AXpwEZ4I1v","QYxC0W7cTs","X6PinUmaEv","EoToP9eoRc",
+"wiHrZLewvM","Ul4a1QWxoT","AgJHQFwEJz","b29RJCfgr3","ZuDtDWaWsv","7X3uyLbRTH","0YAGHJJs5m","CdyBVjtn0X","lweGy7lUXZ","EoToPiKqhr",
+"580YDZUnqt","WreyPECMvU","QssNCfcwDa","s93Mluvf7A","FNYIMlsQGo","YjB9tQ6hMC","Yh1hF0Wr5y","Waim6RBhp0","tvdkDS77LH","8hJdtCdyBV",
+"e6e4zsqVrf","ogLgcsuY4x","ix74rS77LH","JKWYRSWfou","1LB1LWaim6","fFDrJlweGy","Rxrsm618Di","FFDuioGu6x","Cfgr3S77LH","s93MlFLsph",
+"aL6AJjSjS3","TCgPpoQ87r","EOE1ofaHir","zY1GY0ao3l","zHF1q5Mg9r","7Ow5CtjQxs","FLsphlCMxy","CIShGvkCHH","qUJMd9GXkX","KsjRKVprf2",
+"azIWpM6qcG","F6PT2YjB9t","taOXKgIYvE","lXFOBmz8gx","I7p2aDLhzM","M6qcGjS1aj","5VZjS0PktI","v8yFNFwEJz","O3iyQDLhzM","lpF6WHfyNQ",
+"VerEAK4GS8","9eoRclXFOB","Yw2oUsoy9t","0Wr5ydhSuH","BpYhVuPX7G","Chuy3Waim6","d85a9prNT6","wiHrZSbRYy","Pb1pajeskS","FGzgpF6PT2",
+"PYBf4FwEJz","t59lREdBKc","rKDLJ8U2nU","StlDJOUYuF","UlU3Mrhl0J","pAhR1t59lR","zqH0WsuY4x","Cfgr3zY1GY","5Drn0oGu6x","4dEz6zQt6Q",
+"LewvM8U2nU","CK5W70Kyfs","RmDcriB08l","2ZHdk1LB1L","U3yw5Ss0Zu","iqv4kv2eC3","kB5nPCIShG","dhSuHuvf7A","ulk41CK5W7","KsjRKThjNn",
+"RmDcrOHaBz","FPfSEKr8ys","MGlTFRzaZA","lCMxyW7cTs","AXpwEmX2GE","lpF6Wru4UG","U3yw5S2Dfu","fqypySWfou","BpYhVRBhp0","RmDcraDGtS",
+"RBhp0Mkgy8","VNCPdix74r","FhtglCqqaD","sqVrfKZamH","yvOMIv2eC3","2ZHdkEoToP","0BmCyL7cGc","lH1ktpv0i7","0h1b10Kyfs","L7cGcsuY4x",
+"oQ87rQnJ1S","faHirVprf2","yluBx7fsYM","JKWYR0BmCy","v1HlnfcJOy","sx5GlzqH0W","yToGWguMb8","gjUTuBbwgA","cQOnvG1RhS","oVQp6RACuj",
+"7ku1pMK07Y","64s8NFFDui","QClRLbZLvS","OUYuF580YD","ulk41MK07Y","MK07YFjHXR","2DREsnlaBy","jzUqRzY1GY","UmaEvRmDcr","azIWpfaHir",
+"wDajXhSSvQ","S77LHxciqp","gf8rIBpYhV","NAFuwrKDLJ","BGaQYM6qcG","l83UduTacx","zQt6Q2ZHdk","k85Aeh1zcH","v8yFNyEfy9","BGaQY7fsYM",
+"zY1GYUmaEv","blLA9ZUnqt","LDk6f0h1b1","MaJQsuN6r3","pvgjSYf2Ec","KZamHjSjS3","SbRYyyvOMI","jzUqRK20wK","5drc6jfREu","5Namm2Nslm",
+"atef2ulk41","bgJAz8TxD7","2hEEUlweGy","lm0pDuLtKs","7hyVvix74r","CIShGoVQp6","jzUqRRmDcr","Mkgy80YAGH","oVQp614FLR","PYBf4JIqXi",
+"CIShGTa8f6","yofH3yluBx","MmKGJtuDyS","2DREs618Di","5iGN5Yf2Ec","uQIczJKWYR","CNHmvMezSW","gdQsSh1zcH","2TRI76q6L9","OxWIHciuWz",
+"d7vjMCfgr3","RACuj5Namm","Kr8ysWreyP","VBjhzhe9IA","tlILtfFDrJ","FwEJz2DREs","EdBKcaFFss","WPmlx6AFT0","bZLvSYw2oU","FVMxo2Yz7E",
+"RpBQmzFgtB","fqypypvgjS","HfyNQguMb8","FPfSEgtCA5","jtn0XAkKTk","jeskSUl4a1","07n1clweGy","okgRi55rfB","RzaZAmz8gx","FLsphnFqik",
+"HlUbFgjUTu","tAOsr8cVD3","uoStwRACuj","ThjNnoQ87r","64s8NjfREu","fLNg82Yz7E","ksJbyBFkb8","LDk6f2hEEU","XyPZNiKqhr","aez9y2Yz7E",
+"WaWsvjzUqR","SmGzvfmIK1","Gv3FqiwzGk","ulk41JIqXi","hi5X7fcJOy","aez9yCfgr3","GSQwj9eoRc","07n1cAgJHQ","MojnPo8Uyd","iqv4kOxWIH",
+"PYBf4qUJMd","618DipAhR1","uZPqgMezSW","ni2v1RsQUq","Waim6hYBCK","CxVEfhi5X7","zQt6QPYBf4","hSSvQDLhzM","sqVrfcmXIX","Uvlv47fsYM",
+"dQ586hYBCK","fcJOypFrrl","Y1mC0XyPZN","ZzJHWCdyBV","0h1b1QChxs","ogLgcni2v1","CIShGfmIK1","QworuxReec","TCgPpiB08l","In3NSNOHsz",
+"StlDJcmXIX","dmoS7pv0i7","WaWsvcL0aE","8TxD7EoToP","b29RJBCxeC","Cp3mZTa8f6","Chuy3rz7Ut","ksJbyoVQp6","OUqFMxXTI4","bgJAzPb1pa",
+"yvOMIiB08l","5VZjSiKqhr","VBjhzWmadA","VjCZqgf8rI","DQimpQChxs","wDajXJIqXi","HzZT8ThjNn","QnJ1Ss7Mxk","oGu6xzY1GY","xXTI4M3zXL",
+"he9IAHzZT8","pFrrlv8yFN","I7p2a7X3uy","lweGynnP8o","GXdoHpiJSk","Gv3Fqv8yFN","WMiS3jS1aj","qQxHPvkCHH","v8yFNdjsrv","RmDcr9eoRc",
+"7Ow5Cn8pJ9","29QAzSmGzv","zz4ZUb29RJ","jfREuRsQUq","QssNCFGzgp","qQxHPfFDrJ","45cIHG1RhS","xciqpAmdQd","5Drn0VIlwP","uTacx0YAGH",
+"0h1b1zHF1q","Oz8yZ14FLR","7fsYM2Nslm","KZamH6q6L9","gtCA5fcJOy","MmKGJL7cGc","zFgtBOz8yZ","1v5hHblLA9","sx5Gl7lUXZ","9XyT9LDk6f",
+"POUYSuPX7G","RACuj8hJdt","ZzJHWhe9IA","Yw2oUeuZA5","9rlg9XflUq","piJSk29QAz","xReecVNCPd","iKqhrRkQke","DcpWB7fKYU","24ARFK4GS8",
+"cShY2pv0i7","qaofNG1RhS","2hEEU7ku1p","e6e4zSmGzv","yToGWRzaZA","jSjS3JIqXi","VjCZqaDGtS","UlU3MCNHmv","d85a9SjskQ","TXQ0Z3weIF",
+"48cHLpT8wu","F6PT2dQ586","POUYSksJby","Ta8f6FwEJz","iB08lLDk6f","uQIczfqypy","sx5Gl2ZHdk","8cVD3taOXK","b29RJy94nw","In3NSrKDLJ",
+"qUJMds4786","rhl0Jo8Uyd","cL0aEi7WMQ","Dz1R3lH1kt","JJs5mIRh48","RsQUqPYBf4","JkzUnPb1pa","piJSk6q6L9","bgJAzyluBx","SWfou0ao3l",
+"Kr8ysbgJAz","EdBKc07n1c","5VZjSAmdQd","JJs5mOHaBz","rz7UtBpYhV","ThjNn9iGoT","ThjNnAkKTk","uN6r37Ow5C","jfREuCxVEf","FGzgpRzaZA",
+"BbwgAsqVrf","nFqikLewvM","48cHLW7cTs","oGu6xuN6r3","lH1ktTXQ0Z","jfREuFxX9q","dhSuHUvlv4","MezSWFnPFB","QChxst59lR","0PktIcShY2",
+"i7WMQVBjhz","hUTw7ksJby","b29RJaDGtS","SWfouBCxeC","VNCPdiB08l","iqv4k16lHc","W3VFHW3VFH","WaWsvDcpWB","cmXIXmX2GE","fcwDabZLvS",
+"uPX7GtlILt","ECMvU5drc6","JJs5m8xEKz","zHF1qcShY2","pvgjS7hyVv","x3LDeW3VFH","5iGN5lkMUA","t59lRdpe1v","ix74rs4786","azIWpfFDrJ",
+"Gv3FqvOqCE","n8pJ9618Di","e6e4zFjHXR","e6e4zBCxeC","Zv7z0gdQsS","55rfBiKqhr","zFgtB7fKYU","WaWsvVIlwP","7Ow5Cix74r","iB08lZuDtD",
+"yEfy9FwEJz","taOXK8hJdt","Q6hMCVBjhz","v2eC3ydG8U","ydG8UKr8ys","taOXK7ku1p","Gv3Fqt59lR","gdQsSYf2Ec","ydG8UNhXdu","9rlg9GrDg7",
+"JJs5mThjNn","2Nslm48cHL","4W0Tly94nw","jSjS3GrDg7","K4GS8YjB9t","GWqqX7lUXZ","piJSkuPX7G","618DiKr8ys","ZzJHWRBhp0","QChxs07n1c",
+"brhlQ2Yz7E","AmdQdFjHXR","NOHszI7p2a","brhlQcShY2","Ss0ZuiwzGk","FGzgpdQ586","Cfgr3HP433","RpBQmuoStw","ZzJHWmX2GE","55rfBhYBCK",
+"tAOsroVQp6","pv0i7VBjhz","GXdoHAgJHQ","gf8rIB3qem","pWiOslpF6W","WaWsvgIYvE","lViBvzY1GY","ZUnqtY1mC0","k85AeFNYIM","Ss0ZufFDrJ",
+"DLhzMDz1R3","OxWIHyEfy9","ciuWzSmGzv","hi5X7MGlTF","NcICA48cHL","qUJMd580YD","0BmCyvOqCE","azIWp1j5L8","dmoS7JkzUn","hYBCKxciqp",
+"Ta8f6uN6r3","zHF1qD6rBy","guMb8tuDyS","XflUqlpF6W","uoStw7fsYM","Mkgy8pvgjS","J2mQiAOgEe","LewvMFcWrW","CK5W7uJScX","W7cTsuoStw",
+"CqqaDyofH3","64s8N8hJdt","DLhzMlViBv","jfREuTa8f6","lViBvBpYhV","W7cTs4QMc9","16lHcs7Mxk","5iGN5IjTwP","kZANmFVMxo","W7cTsFnPFB",
+"580YDfcwDa","LDk6ftjQxs","xciqpNOHsz","8RCUA2TRI7","VerEAzz4ZU","FnPFBK4GS8","dQ5865IhmG","MojnPUvlv4","XyPZNpWiOs","9y4lwDQimp",
+"4W0TlDLhzM","Ss0ZuAIYUu","guMb8aez9y","fLNg8hE1Ql","29QAzVNCPd","8cVD3VIlwP","Cfgr3D6rBy","oVQp60MR5X","mz8gx0BmCy","8U2nU7ku1p",
+"Fhtgl7Ow5C","tlILtv2eC3","qaofNTa8f6","gf8rIFnPFB","UmaEviwzGk","QYxC0K4GS8","D6rByhe9IA","kB5nPHzZT8","BbwgADcpWB","yToGWWPmlx",
+"FxX9qkZANm","lweGyKr8ys","lpF6Wv1Hln","zFgtBv1Hln","fmIK18U2nU","5VZjSHP433","v1HlnPYBf4","tuDySQYxC0","B3qemvOqCE","soy9t0Wr5y",
+"lViBvDQimp","hE1QlfFDrJ","S2DfuuLtKs","48cHL9iGoT","OUqFMd7vjM","uTacxcL0aE","P6bcg24ARF","7ku1pNOHsz","D6rByFhtgl","soy9tYh1hF",
+"Oz8yZjeskS","OUYuFLewvM","suY4x2ZHdk","Waim6oQ87r","pmeCddmoS7","DG4sTKASQ8","Q6Lixh1zcH","BFkb8gdQsS","taOXKHlUbF","WPmlxt98iW",
+"brhlQYf2Ec","FNYIMru4UG","XflUqECMvU","55rfBazIWp","KsjRKiKqhr","B3qemQnJ1S","pFrrlZhwG1","JJs5m7ku1p","qQxHPsuY4x","48cHLo8Uyd",
+"VLTy67fKYU","xReecCxVEf","MK07Y24ARF","zbIYYVBjhz","CdyBV8U2nU","ulk41In3NS","zbIYYuQIcz","0BmCyn1pmO","tuDyS580YD","Yw2oUsx5Gl",
+"s7MxkEOE1o","oGu6x6q6L9","kB5nPbZLvS","GXdoHhYBCK","J2mQi2TRI7","dQ586DLhzM","QssNCJXljW","VIlwPO3iyQ","7X3uysuY4x","D6rBylViBv",
+"KZamHtvdkD","Oz8yZMaJQs","16lHcVLTy6","JKWYRMezSW","aL6AJYOfrY","K4GS8gjUTu","tl72W2Yz7E","m4bxUFGzgp","ZJTXH8TxD7","5Nammlj07Q",
+"he9IAaez9y","BCxeCRsQUq","MK07Y5VZjS","jSjS364s8N","Kr8ysqQxHP","s7MxkCNHmv","kZANmCp3mZ","X6PinOxWIH","M6qcG4QMc9","fmIK1ZzJHW",
+"5drc6Pb1pa","JXljWZuDtD","WreyPrhl0J","Vprf2S77LH","ZuDtDCIShG","In3NS8U2nU","POUYSprNT6","JRJQBOxWIH","iKqhrMmKGJ","D6rByBFkb8",
+"ulk41zHF1q","NcICAe6e4z","n8pJ9vLsmS","Ss0ZuxReec","hYBCKiKqhr","RkQke5IhmG","QbxXcLewvM","fLNg8pWiOs","WPmlxuZPqg","RpBQm5Mg9r",
+"lCMxybrhlQ","a00b5KASQ8","RsQUq8xEKz","lj07Q6q6L9","8cVD3MmKGJ","RzaZAJ2mQi","MojnPStlDJ","6AFT0kB5nP","Gv3Fq0PktI","ydG8UwDajX",
+"djsrvJkzUn","euZA5O3iyQ","nlaBydhSuH","atef2618Di","oGu6xguMb8","kB5nPMmsIo","jfREutAOsr","lsQGo9GXkX","ReKEWeuZA5","HP433GrDg7",
+"2Yz7E2DREs","5nmWvBbwgA","24ARF55rfB","blLA9JJs5m","GrDg7k85Ae","FhtglDG4sT","7X3uyQssNC","uJScXBGaQY","RsQUqLbRTH","dhSuHAkKTk",
+"lXFOBBpYhV","7Ow5C4dEz6","DG4sT16lHc","UmaEv14FLR","azIWpDz1R3","xciqpMkgy8","uQIczgtCA5","fmIK1MezSW","P6bcgM3zXL","8RCUAM3zXL",
+"07n1cRsQUq","Nxx9Vn1pmO","i3pydMaJQs","t98iWQssNC","ix74raDGtS","fLNg8aFFss","RzaZAd7vjM","jeskSMezSW","8RCUAmX2GE","1j5L8AmdQd",
+"16lHc45cIH","lCMxyUl4a1","MK07YQ6Lix","brhlQHP433","MaJQsZuDtD","EoToPuvf7A","BpYhVkZANm","OUYuFcShY2","ydG8UuQIcz","ciuWzDcpWB",
+"uN6r3Gv3Fq","dhSuHGv3Fq","4QMc9JRJQB","0MR5X8FmFH","ECMvUqQxHP","3weIFbZLvS","FGzgpCp3mZ","6q6L9GrDg7","vLsmSSbRYy","X6Pin7ku1p",
+"brhlQaFFss","oQ87ri7WMQ","aez9y0MR5X","MojnPMm8si","CNHmvjtn0X","8TxD74W0Tl","l83Udgf8rI","Y1mC0xXTI4","Pb1paiKqhr","KZamHNxx9V",
+"45cIH16lHc","Yw2oUZuDtD","GWqqXOHaBz","KASQ8ru4UG","FnPFBeuZA5","EOE1oxciqp","jiVBPIn3NS","AIYUu24ARF","RkQkeJXljW","yofH3DLhzM",
+"TXQ0ZKZamH","2NslmCfgr3","uPX7GydG8U","taOXKuAWyp","2DREsgtCA5","G1RhSQnJ1S","a00b5v1Hln","9y4lwUlU3M","ReKEWMGlTF","aDGtSv8yFN",
+"J2mQiQssNC","DG4sTBpYhV","s7MxkO3iyQ","WPmlx9XyT9","StlDJni2v1","piJSk5Namm","S77LHEdBKc","WPmlxHRxd8","AkKTkFLsph","8xEKzaez9y",
+"2DREsYw2oU","lm0pDsx5Gl","ulk41VIlwP","AgJHQ24ARF","JKWYRe6e4z","ZzJHWQbxXc","hE1QlFFDui","4dEz6WaWsv","zHF1qoQ87r","GXdoHTCgPp",
+"lm0pDoQ87r","ogLgcMojnP","yToGWRpBQm","0YAGHksJby","7hyVvLDk6f","CxVEflCMxy","oGu6xgIYvE","qaofNJRJQB","JRJQBFPfSE","t98iW5iGN5",
+"uN6r3yluBx","POUYSy94nw","3otm69eoRc","5nmWv07n1c","FxX9qDLhzM","yToGWP6bcg","rz7UtFPfSE","ogLgcl83Ud","nnP8oVBjhz","ZJTXHnlaBy",
+"EdBKcWMiS3","WDVWJM3zXL","RpBQmciuWz","fFDrJdQ586","x3LDeL7cGc","zHF1qX6Pin","X6PintlILt","zHF1qWPmlx","ni2v1jSjS3","HzZT8ogLgc",
+"HfyNQpv0i7","QWxoT5VZjS","n8pJ9azIWp","Ss0ZusuY4x","PYBf4NOHsz","pT8wutlILt","0BmCy6AFT0","9iGoTRkQke","L7cGcFwEJz","dhSuHmX2GE",
+"WaWsv8xEKz","5Drn0In3NS","8FmFHAgJHQ","BpYhVDG4sT","zFgtBAkKTk","29QAz9XyT9","zFgtBs7Mxk","CIShGNAFuw","8xEKz1j5L8","AIYUuuTacx",
+"Oz8yZzbIYY","CK5W7soy9t","mX2GECdyBV","X6Pin4W0Tl","BpYhVKASQ8","prNT6fLNg8","nlaByUl4a1","DQimptjQxs","BpYhVi7WMQ","i7WMQYOfrY",
+"X6Pin2Nslm","MezSWLDk6f","blLA98U2nU","WPmlxjfREu","n1pmO7X3uy","pmeCdoQ87r","Mm8siChuy3","LewvM0h1b1","IRh48n1pmO","RBhp02DREs",
+"IRh484W0Tl","lpF6WFNYIM","AkKTkCp3mZ","VerEAmX2GE","F6PT2jS1aj","XyPZNfLNg8","cL0aE7fsYM","xXTI4RzaZA","HzZT80PktI","zqH0WhYBCK",
+"9rlg9O3iyQ","hSSvQhe9IA","9y4lwlXFOB","ZuDtDRBhp0","Y1mC0KsjRK","2ZHdkdhSuH","TCgPpBGaQY","AkKTk5nmWv","IRh48Y1mC0","zY1GYmX2GE",
+"In3NSlH1kt","SmGzvzY1GY","AmdQdJXljW","gdQsStjQxs","Ss0Zun8pJ9","580YDdpe1v","QworuNOHsz","ZhwG1yToGW","jtn0XtAOsr","oVQp6lpF6W",
+"8hJdt8U2nU","dQ586RzaZA","9XyT9pv0i7","JXljWFwEJz","AXpwEzY1GY","jS1ajSbRYy","2DREsgIYvE","0YAGHWDVWJ","WreyP8U2nU","5Mg9rjzUqR",
+"StlDJk85Ae","7lUXZSs0Zu","FVMxotvdkD","BCxeCS77LH","WaWsv9rlg9","a00b5ksJby","L7cGc580YD","nFqikKsjRK","VBjhzpFrrl","TwanoGWqqX",
+"lCMxyuupzk","guMb8Gv3Fq","1v5hHdjsrv","yEfy9JKWYR","CIShGRsQUq","S2DfuSbRYy","gIYvEZzJHW","W7cTsGrDg7","Yw2oUXyPZN","KZamH8RCUA",
+"v1HlnNhXdu","Q6hMCuLtKs","x3LDeHRxd8","0Kyfss7Mxk","I7p2a7lUXZ","CIShGbgJAz","s7MxkuJScX","Uvlv45IhmG","FxX9qtl72W","ru4UGVNCPd",
+"pT8wuNcICA","uPX7GZJTXH","prNT6FLsph","n8pJ924ARF","VjCZqGXdoH","48cHLzmLYD","AgJHQEdBKc","Cp3mZUmaEv","2TRI7LDk6f","iB08lQnJ1S",
+"LbRTHUmaEv","I7p2aSbRYy","WPmlxM3zXL","tvdkD0Kyfs","jiVBP8hJdt","4W0Tl48cHL","d7vjMpiJSk","xReecQ6hMC","cShY2jiVBP","55rfB0ao3l",
+"W3VFHiqv4k","Ta8f61j5L8","EoToP14FLR","RBhp0IKxdL","FnPFBQChxs","guMb8iB08l","WreyPyToGW","jzUqRuoStw","n1pmOuTacx","VLTy6W3VFH",
+"Oz8yZtlILt","8U2nUb29RJ","jiVBPyvOMI","hSSvQl83Ud","cL0aECK5W7","hE1QlF6PT2","In3NSOUqFM","lpF6Wh1zcH","POUYSWaWsv","StlDJ24ARF",
+"aDGtSnnP8o","xXTI4dpe1v","tjQxsXyPZN","IRh48lweGy","FGzgplXFOB","I7p2annP8o","7fKYUaDGtS","fqypyTXQ0Z","AXpwEv2eC3","iB08lMkgy8",
+"WPmlxWaWsv","t98iWWMiS3","zmLYDPYBf4","rhl0J0PktI","FjHXRaDGtS","5Mg9ruupzk","Ta8f6Cfgr3","sqVrfv1Hln","FjHXRlm0pD","djsrvfcwDa",
+"zY1GYMm8si","cmXIXTwano","dhSuHbrhlQ","mX2GECNHmv","tl72WbgJAz","Chuy30ao3l","fcwDasoy9t","zbIYYI7p2a","okgRiVLTy6","ulk41JkzUn",
+"rhl0JksJby","FxX9q3weIF","cShY27lUXZ","lj07QWPmlx","6AFT0POUYS","sqVrfZuDtD","CqqaDWDVWJ","0ao3lSs0Zu","4dEz6i3pyd","RsQUqYOfrY",
+"RxrsmblLA9","he9IAxXTI4","pvgjSK4GS8","3weIFpvgjS","m4bxUiB08l","dhSuH0YAGH","JXljWciuWz","9GXkXUvlv4","JkzUnhE1Ql","O3iyQKsjRK",
+"uJScXYf2Ec","dpe1vs7Mxk","CxVEfzHF1q","SbRYy5VZjS","0YAGHNhXdu","NcICAqQxHP","tl72WcL0aE","W7cTsAOgEe","vkCHHCK5W7","O3iyQdmoS7",
+"k85AeFcWrW","PYBf4WDVWJ","2ZHdksoy9t","y94nw1j5L8","yEfy9fFDrJ","2DREszFgtB","zmLYDAIYUu","zbIYYHRxd8","SmGzv7ku1p","AkKTkAIYUu",
+"FnPFBHfyNQ","CNHmvFnPFB","djsrvuPX7G","0BmCy5iGN5","Chuy3jzUqR","FGzgpn1pmO","fLNg8hi5X7","7fsYMKZamH","TXQ0ZEdBKc","aFFss0ao3l",
+"0KyfsVBjhz","t98iWZuDtD","taOXKDLhzM","7hyVvcQOnv","cL0aEwiHrZ","fFDrJRkQke","HlUbFm4bxU","Yh1hFVLTy6","pvgjSzY1GY","jfREulCMxy",
+"cShY2K4GS8","C2IrckZANm","45cIHxciqp","oGu6xulk41","9iGoTFcWrW","JkzUnAOgEe","AXpwEni2v1","hUTw7gtCA5","2hEEU8TxD7","PYBf49GXkX",
+"5nmWvlj07Q","yToGWuvf7A","yvOMIVNCPd","CxVEfQssNC","dmoS7hSSvQ","s7MxkJIqXi","ogLgcAgJHQ","EoToPVLTy6","24ARFiB08l","wiHrZKsjRK",
+"sx5Glulk41","cL0aEStlDJ","suY4xmz8gx","GXdoHWmadA","QClRLD6rBy","5VZjS07n1c","WPmlxzHF1q","nFqiklXFOB","gf8rIJJs5m","mz8gxQ6Lix",
+"580YDThjNn","Z4I1vGWqqX","QYxC0CxVEf","uZPqg8xEKz","RkQke4dEz6","n8pJ9WaWsv","jfREuI7p2a","jtn0XQssNC","Nxx9VGSQwj","cShY2FnPFB",
+"Oz8yZIKxdL","jeskSsx5Gl","zz4ZU5Namm","WreyPMkgy8","uvf7Asoy9t","VBjhzQbxXc","9XyT9vOqCE","tlILt9GXkX","0MR5Xt59lR","hSSvQDz1R3",
+"wiHrZnlaBy","5Drn08TxD7","WreyPv2eC3","VNCPdjfREu","fmIK1OUYuF","AmdQd55rfB","7X3uydmoS7","ni2v1SjskQ","14FLRfqypy","7X3uyGWqqX",
+"SmGzvZzJHW","RACujuJScX","Ul4a1s4786","UmaEvQWxoT","RmDcrUlU3M","b29RJhYBCK","NOHszGSQwj","Cp3mZFLsph","PYBf4uupzk","FNYIMEOE1o",
+"mX2GEMezSW","1j5L8LDk6f","k85Ae580YD","vOqCED6rBy","F6PT2jtn0X","EdBKcMmsIo","JRJQBvkCHH","5nmWvWmadA","lsQGoulk41","8TxD7RBhp0",
+"v1Hlnix74r","uLtKslm0pD","zFgtBTwano","CdyBVuTacx","JkzUn7lUXZ","7hyVv07n1c","OUqFMKASQ8","he9IAWaWsv","9eoRcQworu","Oz8yZK20wK",
+"EOE1ozmLYD","9XyT9zz4ZU","8cVD3Q6hMC","hi5X7cQOnv","K20wKS77LH","pWiOsNOHsz","pv0i7WPmlx","07n1cTwano","qaofNtlILt","FFDuiiqv4k",
+"lViBvsoy9t","tjQxsoVQp6","aDGtSVerEA","RBhp0CNHmv","lXFOBvLsmS","RmDcrFwEJz","jtn0X29QAz","7lUXZdjsrv","Rxrsmn1pmO","yluBxs7Mxk",
+"QClRLt98iW","zY1GYmz8gx","aL6AJWaWsv","xReecF6PT2","FjHXRXflUq","nFqikOxWIH","t98iWS77LH","6q6L9VerEA","5iGN5GSQwj","HfyNQ5Drn0",
+"RzaZAMaJQs","HlUbF8FmFH","xXTI4qUJMd","QClRLQssNC","nlaByF6PT2","ru4UGNcICA","F6PT27hyVv","nnP8oIKxdL","BbwgAuupzk","XyPZNHfyNQ",
+"pFrrl580YD","CK5W7wDajX","0PktICxVEf","8TxD7DLhzM","FnPFBb29RJ","mz8gxa00b5","e6e4zRACuj","tjQxsDG4sT","sqVrfZ4I1v","8RCUAFcWrW",
+"0YAGHQbxXc","NcICAJkzUn","P6bcg7hyVv","QssNC3otm6","0PktI8FmFH","VLTy6aDGtS","4QMc91j5L8","JJs5mFwEJz","pAhR1P6bcg","VBjhzjfREu",
+"FnPFBYOfrY","uAWypIKxdL","ReKEWpv0i7","LbRTHReKEW","IBe8kU3yw5","uN6r3lCMxy","ix74rNcICA","QYxC0BpYhV","tlILtDLhzM","9eoRcMezSW",
+"618Dil83Ud","9XyT90MR5X","a00b5o8Uyd","D6rByQ6hMC","07n1cv2eC3","cShY255rfB","t98iWhSSvQ","fmIK1LewvM","QssNCzbIYY","lsQGo5iGN5",
+"BpYhVwDajX","KZamHM6qcG","3otm6WDVWJ","ulk419rlg9","4W0TlpmeCd","LDk6fn1pmO","d85a9O3iyQ","tlILtoVQp6","EoToPgtCA5","Kr8ysVprf2",
+"G1RhSjS1aj","ni2v1JJs5m","rKDLJQbxXc","zqH0WW3VFH","sx5GlGrDg7","wDajXbZLvS","07n1cYf2Ec","RmDcrv1Hln","xciqphE1Ql","16lHcCNHmv",
+"HfyNQn8pJ9","DG4sTyluBx","h1zcH2DREs","GrDg7pFrrl","FjHXRDG4sT","KZamHFxX9q","F6PT2ThjNn","Z4I1vBpYhV","VIlwPlViBv","uPX7GazIWp",
+"hYBCKfFDrJ","a00b5brhlQ","tAOsr0Kyfs","wDajXyluBx","tuDySmz8gx","KsjRKAOgEe","AgJHQ5Mg9r","dpe1vlCMxy","gdQsSBbwgA","oVQp6W7cTs",
+"F6PT25iGN5","uN6r39y4lw","NhXduuPX7G","WMiS3MaJQs","euZA5M6qcG","gIYvEjzUqR","SWfou1v5hH","guMb8o8Uyd","yvOMI9XyT9","tlILtNo0Qb",
+"0h1b10ao3l","No0QbwiHrZ","CNHmvpT8wu","n8pJ9tvdkD","uvf7AFjHXR","Kr8ysfcwDa","2TRI7580YD","TwanoJKWYR","IKxdLksJby","n1pmOciuWz",
+"9XyT9qQxHP","B3qemi7WMQ","pvgjSDLhzM","FjHXRzmLYD","2ZHdkwiHrZ","QChxsuZPqg","iKqhrtjQxs","b29RJpFrrl","azIWpMGlTF","uvf7AJXljW",
+"h1zcHKsjRK","8RCUAAXpwE","8TxD7G1RhS","fqypy7hyVv","580YD9rlg9","9y4lwAXpwE","QworucmXIX","JKWYRS77LH","OUYuFTXQ0Z","8cVD307n1c",
+"tAOsrxciqp","s7MxkWreyP","gtCA5dmoS7","9y4lwsoy9t","Ul4a1yofH3","e6e4zGXdoH","JRJQBBFkb8","aFFssYf2Ec","jeskSM6qcG","1j5L8NhXdu",
+"2TRI7WMiS3","AXpwEUlU3M","ZUnqtThjNn","RACujl83Ud","GWqqXRmDcr","RpBQmUlU3M","i3pydnnP8o","qQxHPe6e4z","FVMxoyToGW","tjQxsYjB9t",
+"JkzUnPYBf4","azIWpdpe1v","Q6hMC5IhmG","GXdoHQYxC0","9GXkX9y4lw","suY4xUlU3M","WMiS3uJScX","7fKYUJKWYR","BGaQYfLNg8","HlUbF7ku1p",
+"d85a924ARF","okgRirKDLJ","zHF1qUvlv4","MGlTFd85a9","jS1aj2ZHdk","Z4I1vh1zcH","StlDJkZANm","lViBvKr8ys","n8pJ9VIlwP","5nmWv9GXkX",
+"8hJdtJ2mQi","k85Aeuvf7A","9rlg9Rxrsm","Z4I1vRBhp0","S2Dfu8xEKz","GrDg7mz8gx","dmoS7tAOsr","MezSWMm8si","CqqaD4QMc9","G1RhSzY1GY",
+"TwanoRzaZA","M3zXL1j5L8","uTacxCNHmv","yluBxZJTXH","Vprf23weIF","7hyVvyToGW","Yw2oUAgJHQ","djsrvgtCA5","EdBKcZhwG1","9iGoTgf8rI",
+"Pb1pajSjS3","C2IrcHP433","yvOMId85a9","OxWIHv2eC3","FcWrWQYxC0","rhl0J4QMc9","yvOMIFxX9q","Q6hMC7Ow5C","0MR5X0PktI","0ao3l5IhmG",
+"8FmFHaez9y","yvOMIUlU3M","lViBvgIYvE","oVQp6suY4x","GWqqXPb1pa","P6bcgBCxeC","8RCUAlH1kt","pFrrlFhtgl","0ao3lC2Irc","he9IAQ6Lix",
+"AkKTkzbIYY","taOXKBCxeC","jiVBP2DREs","PYBf4xciqp","4dEz6k85Ae","suY4xwiHrZ","QYxC0VerEA","5VZjSwDajX","BFkb82TRI7","ZuDtDS77LH",
+"rKDLJFNYIM","BCxeC8RCUA","oQ87rFhtgl","IBe8keuZA5","aL6AJYh1hF","v1Hln0h1b1","Kr8ysfmIK1","2hEEU0PktI","Cp3mZS2Dfu","Cfgr3h1zcH",
+"ydG8UpAhR1","Cp3mZAgJHQ","EoToP7ku1p","F6PT2k85Ae","DcpWBDcpWB","P6bcgPOUYS","5drc6DLhzM","dmoS7iwzGk","ksJbyWmadA","No0QbDG4sT",
+"MezSWhe9IA","8cVD3tAOsr","J2mQiCqqaD","9eoRc2DREs","JKWYRTa8f6","7fsYMP6bcg","QssNC9XyT9","ZUnqtPOUYS","2NslmyEfy9","0BmCyZJTXH",
+"Gv3FqHRxd8","atef2JkzUn","RsQUqiKqhr","soy9tG1RhS","MezSWdjsrv","ix74r7hyVv","2TRI7xXTI4","s7MxkZUnqt","8TxD7xciqp","G1RhS4dEz6",
+"yToGWCdyBV","StlDJFnPFB","iqv4kHfyNQ","EdBKcVprf2","DG4sTUvlv4","dhSuHCIShG","9eoRcVerEA","AXpwEe6e4z","ogLgcdjsrv","Chuy3618Di",
+"S2Dfu4QMc9","HzZT8aez9y","DQimpW7cTs","FnPFBFGzgp","QWxoTYh1hF","taOXK0ao3l","CxVEftjQxs","kZANmjSjS3","WMiS3aL6AJ","RzaZAzY1GY",
+"6q6L9lCMxy","cQOnvo8Uyd","EdBKcuPX7G","JkzUnCfgr3","YOfrY9y4lw","GXdoHbgJAz","YOfrY618Di","9rlg9jtn0X","GWqqXtAOsr","YOfrYAmdQd",
+"HfyNQa00b5","pAhR1gf8rI","EdBKcK4GS8","1v5hHt59lR","uTacxMGlTF","XyPZNSbRYy","Chuy3NAFuw","tlILt2DREs","07n1c0PktI","Chuy3he9IA",
+"GSQwjPb1pa","MezSWAmdQd","Gv3Fqb29RJ","6q6L9iB08l","b29RJVLTy6","14FLRpv0i7","Cp3mZFhtgl","y94nwtjQxs","618DiUvlv4","24ARFDLhzM",
+"2TRI70MR5X","cmXIXJ2mQi","JIqXi8hJdt","4dEz6FLsph","VNCPdUvlv4","2TRI7SmGzv","PYBf4QWxoT","lCMxyVprf2","s93Ml5nmWv","aFFssOHaBz",
+"ni2v1MezSW","QWxoTVLTy6","ZuDtDOHaBz","vOqCEjtn0X","0Wr5yuPX7G","4W0TlHlUbF","pvgjSx3LDe","SmGzvZUnqt","FwEJzhYBCK","h1zcH2TRI7",
+"LDk6fIRh48","45cIHBpYhV","GrDg7faHir","EdBKc6q6L9","xXTI4bgJAz","2TRI7lXFOB","LbRTHogLgc","Nxx9VFcWrW","Mkgy8VBjhz","0PktIL7cGc",
+"Zv7z0x3LDe","0ao3l2hEEU","soy9t4W0Tl","4dEz6lm0pD","6q6L9Yf2Ec","B3qemNAFuw","lj07Q9XyT9","WMiS3pvgjS","h1zcHHfyNQ","29QAzS77LH",
+"kZANmK4GS8","2ZHdkMmsIo","48cHLFxX9q","pv0i7M3zXL","K4GS8QssNC","JKWYRqaofN","hE1Ql55rfB","piJSkMezSW","cQOnvUlU3M","gf8rIBGaQY",
+"2Yz7EXflUq","hYBCKGXdoH","v8yFNMezSW","G1RhSPOUYS","jSjS3euZA5","5ZaEzprNT6","Uvlv4zHF1q","BFkb8yofH3","fFDrJru4UG","he9IASjskQ",
+"azIWpU3yw5","aL6AJtlILt","CdyBVrKDLJ","RzaZAuQIcz","RzaZAlm0pD","lj07QZzJHW","aFFss7fKYU","0KyfsHfyNQ","Ta8f6mX2GE","bgJAzWmadA",
+"EdBKcatef2","BCxeCpT8wu","8cVD3KsjRK","oQ87rYh1hF","b29RJTCgPp","zqH0WlH1kt","KsjRKiwzGk","BGaQYRACuj","9rlg9faHir","WmadApmeCd",
+"fqypyS2Dfu","yvOMIlCMxy","b29RJAXpwE","MmKGJ2DREs","pT8wu5Namm","Gv3FqQYxC0","9rlg91v5hH","kB5nPtl72W","kB5nPs7Mxk","DLhzMgjUTu",
+"StlDJS2Dfu","tvdkDVjCZq","Pb1paBpYhV","D6rBy8U2nU","8xEKzzFgtB","QYxC0i3pyd","rKDLJlsQGo","RACujCfgr3","zmLYDpv0i7","RkQkeaez9y",
+"NOHszazIWp","pmeCdCNHmv","16lHcKr8ys","uAWypYOfrY","8FmFHS2Dfu","5NammSjskQ","Nxx9VTCgPp","hUTw7nnP8o","45cIHY1mC0","lj07QfcwDa",
+"FGzgplpF6W","rz7UtRsQUq","5IhmGWaim6","9y4lwi7WMQ","IKxdLciuWz","0MR5XRsQUq","ydG8UQworu","nnP8oQssNC","JXljWZhwG1","gf8rIpiJSk",
+"ksJbytlILt","pFrrlSmGzv","CK5W7KsjRK","RmDcr2TRI7","FFDuiW3VFH","ulk418hJdt","PYBf48hJdt","5ZaEzRmDcr","XyPZNFFDui","hSSvQd7vjM",
+"2hEEUn1pmO","XyPZNIn3NS","WmadAK4GS8","Nxx9VIjTwP","RACujFFDui","07n1cQClRL","uJScXCp3mZ","iKqhrZv7z0","1v5hHWmadA","JIqXiLbRTH",
+"B3qem8FmFH","YOfrYVNCPd","5Drn04dEz6","NAFuwWaim6","2TRI7ogLgc","StlDJRzaZA","0YAGHiKqhr","MaJQsWPmlx","55rfBuTacx","v2eC3m4bxU",
+"s4786zqH0W","B3qemkZANm","Ta8f6QClRL","MezSWB3qem","7Ow5CTa8f6","6AFT0vkCHH","TXQ0Z14FLR","WmadANcICA","5Drn0618Di","h1zcHpT8wu",
+"suY4xDG4sT","JkzUnzFgtB","pAhR1O3iyQ","JJs5m9eoRc","yToGWn8pJ9","jeskSgdQsS","ZUnqt1j5L8","m4bxUUvlv4","Vprf2Ul4a1","QWxoTKsjRK",
+"FnPFBdQ586","y94nw16lHc","tuDySokgRi","JXljWuAWyp","i3pyd55rfB","wiHrZFxX9q","ni2v1Y1mC0","F6PT2FPfSE","d7vjMTwano","NhXdu8xEKz",
+"Ss0ZuYh1hF","y94nwuoStw","NcICAxciqp","CdyBVhSSvQ","mz8gxAgJHQ","JXljWKsjRK","n1pmOThjNn","8FmFHNhXdu","QYxC0tAOsr","tAOsrX6Pin",
+"XflUqOUYuF","ulk41gIYvE","RBhp00h1b1","QWxoTNOHsz","bZLvStuDyS","jtn0XdmoS7","8cVD3l83Ud","xXTI4IBe8k","JXljWFnPFB","ciuWzK20wK",
+"rhl0J7fsYM","Uvlv4RmDcr","s4786zmLYD","K20wK48cHL","lm0pDGv3Fq","VBjhzsuY4x","kB5nPUlU3M","aFFssYjB9t","QYxC0Chuy3","8U2nUJkzUn",
+"GSQwjsuY4x","9eoRcuZPqg","KsjRKru4UG","RkQkepWiOs","M6qcGaL6AJ","yvOMIQssNC","X6Pin3weIF","gjUTulH1kt","7fKYUhE1Ql","Ta8f6RkQke",
+"hUTw7ulk41","07n1c3otm6","64s8NUmaEv","0BmCyGrDg7","0YAGHs4786","5ZaEzCfgr3","RsQUqNAFuw","k85AeiwzGk","NOHszIBe8k","RpBQmZv7z0",
+"Rxrsm0h1b1","iwzGk5VZjS","XyPZNcmXIX","rz7UtDLhzM","FhtglogLgc","3weIFQWxoT","uPX7GjSjS3","RsQUqJIqXi","POUYSwDajX","cQOnvguMb8",
+"5drc6taOXK","5NammStlDJ","ZUnqtMezSW","EoToPEoToP","KsjRK5Drn0","oGu6x8xEKz","dhSuHP6bcg","Mkgy81LB1L","6q6L9zz4ZU","iB08lUl4a1",
+"64s8N45cIH","618DiIn3NS","JIqXiD6rBy","uQIczDcpWB","jeskSIRh48","64s8N9y4lw","ZUnqtVBjhz","nnP8o45cIH","gf8rIL7cGc","IKxdLMkgy8",
+"WDVWJydG8U","5nmWvfmIK1","uvf7ALewvM","lpF6WSmGzv","t59lR5iGN5","0ao3luTacx","aez9yTXQ0Z","3weIF5Mg9r","IBe8kzHF1q","7ku1pWaWsv",
+"MojnPpv0i7","Gv3FqblLA9","zFgtBBFkb8","FFDuiBCxeC","uJScXsoy9t","brhlQo8Uyd","aDGtSs93Ml","ogLgcUl4a1","lViBvS2Dfu","bZLvSHfyNQ",
+"piJSkd7vjM","618DioQ87r","5Drn0lCMxy","jtn0XoVQp6","9eoRc24ARF","Yf2EcECMvU","nnP8oqaofN","RpBQm0h1b1","euZA5jeskS","4QMc9FGzgp",
+"KASQ8vOqCE","ZhwG1Mm8si","IRh48uTacx","07n1cJRJQB","8hJdtlpF6W","fqypyQ6Lix","zmLYD2ZHdk","GrDg7U3yw5","X6PinCIShG","K20wK5Drn0",
+"ReKEWMmsIo","FxX9q8xEKz","e6e4zAkKTk","qUJMd0BmCy","nnP8o2Nslm","RkQkeRACuj","VjCZqQYxC0","uQIczlH1kt","8RCUAk85Ae","rhl0Jni2v1",
+"8xEKzwiHrZ","hUTw7KASQ8","Z4I1v7fKYU","yvOMI5VZjS","v2eC3MaJQs","gf8rIKsjRK","M3zXLGv3Fq","gdQsSMkgy8","v8yFNMmsIo","L7cGcQ6Lix",
+"dhSuHBpYhV","OUqFM5drc6","xReecKr8ys","Dz1R3RmDcr","AkKTkNcICA","uN6r3dQ586","lViBv4dEz6","d85a9SmGzv","fFDrJSmGzv","SmGzvZuDtD",
+"Ul4a124ARF","I7p2apWiOs","sqVrfru4UG","6AFT0BpYhV","2ZHdkZUnqt","GrDg7In3NS","fqypyCIShG","CIShGrz7Ut","zbIYY9iGoT","IKxdLSs0Zu",
+"45cIHIn3NS","BbwgAZJTXH","xReec2TRI7","faHirChuy3","Nxx9Vi3pyd","JXljWW3VFH","tlILtlH1kt","yluBxYh1hF","gtCA5gf8rI","VjCZqIn3NS",
+"6AFT0FjHXR","uLtKsyofH3","NcICAlXFOB","7ku1pAkKTk","SWfouGWqqX","OUqFMOxWIH","gtCA5IKxdL","AmdQddpe1v","OUqFMLDk6f","M6qcGTCgPp",
+"yofH3iKqhr","VLTy67hyVv","vLsmSTXQ0Z","QWxoTSbRYy","oGu6xKASQ8","D6rBy1j5L8","WMiS37X3uy","FjHXRt98iW","b29RJpmeCd","8RCUA0Kyfs",
+"Zv7z05drc6","euZA5W3VFH","B3qemCxVEf","h1zcHMK07Y","Kr8ysxXTI4","oQ87rogLgc","Uvlv4dpe1v","RmDcrNcICA","9GXkX4W0Tl","qaofNpAhR1",
+"2hEEUru4UG","XflUqlkMUA","P6bcgyofH3","zQt6QQnJ1S","Ss0Zuy94nw","VBjhz5VZjS","CK5W714FLR","MaJQsqaofN","IjTwPQClRL","lkMUAC2Irc",
+"AgJHQdjsrv","7fKYUBGaQY","lCMxyVIlwP","VIlwPMojnP","nFqik8U2nU","NhXdul83Ud","d85a94QMc9","6AFT0JRJQB","x3LDeFxX9q","s93MlWaim6",
+"DLhzMC2Irc","OHaBzHRxd8","uupzkJJs5m","S2DfuqUJMd","M3zXLydG8U","5ZaEzpmeCd","7Ow5CPYBf4","9y4lwJKWYR","JXljWgf8rI","U3yw5LewvM",
+"aDGtSRxrsm","atef2bZLvS","Yf2Ec580YD","cShY2dmoS7","QnJ1SGWqqX","pv0i7JkzUn","YOfrYfqypy","48cHL8xEKz","uTacxgdQsS","iB08l2Nslm",
+"Kr8ysG1RhS","djsrvX6Pin","D6rByaL6AJ","14FLRJJs5m","i3pydlm0pD","NAFuwjfREu","v8yFNnnP8o","cQOnvMmsIo","CxVEfHP433","aez9yM6qcG",
+"QworuO3iyQ","7hyVvbZLvS","6q6L9BbwgA","sqVrfzQt6Q","WMiS37Ow5C","bZLvSEoToP","DcpWBd85a9","Mkgy89eoRc","CxVEfAIYUu","NOHszOUqFM",
+"aL6AJmz8gx","n1pmOZ4I1v","4dEz6MGlTF","GXdoHSmGzv","RBhp0VBjhz","sqVrf2hEEU","NhXdu0Kyfs","Kr8ys9XyT9","cmXIXcShY2","5Mg9rRkQke",
+"4QMc9lpF6W","FhtglWaWsv","lweGyMaJQs","n8pJ9ZJTXH","fLNg8580YD","mz8gxFwEJz","xXTI4Cfgr3","5ZaEzM3zXL","EdBKcv2eC3","NhXduvkCHH",
+"Cp3mZx3LDe","fcJOyFFDui","FxX9q5ZaEz","s4786nnP8o","gdQsSStlDJ","d85a9MmsIo","LewvMulk41","0PktI24ARF","Mm8siNAFuw","aez9yChuy3",
+"Chuy3v1Hln","C2IrcgdQsS","3weIFyEfy9","UmaEvCNHmv","t59lRSWfou","GSQwjatef2","NAFuwcmXIX","iqv4k9GXkX","fcwDan8pJ9","S77LHUvlv4",
+"OUqFMfcwDa","5NammjfREu","zbIYYW3VFH","2hEEUUmaEv","WmadAFnPFB","blLA9cL0aE","45cIHh1zcH","lXFOBhSSvQ","lCMxypFrrl","oGu6x8FmFH",
+"xciqp0YAGH","24ARF48cHL","ydG8UaDGtS","QChxsuLtKs","Vprf2pmeCd","3otm6OUqFM","SbRYyoGu6x","VIlwPNhXdu","Qworuni2v1","CqqaDi7WMQ",
+"BpYhVCK5W7","guMb8lsQGo","jiVBPM6qcG","uZPqgMmsIo","KASQ89y4lw","soy9t5Namm","HRxd8jS1aj","9GXkX7fsYM","JKWYRG1RhS","hE1QlBFkb8",
+"RkQkelm0pD","ciuWznnP8o","2NslmGSQwj","KASQ8IjTwP","29QAzix74r","2NslmCxVEf","fLNg8IBe8k","Dz1R3CdyBV","FhtgltjQxs","7X3uyy94nw",
+"QWxoTRmDcr","LbRTHgtCA5","aFFsslj07Q","i7WMQVIlwP","7fKYUWmadA","0MR5XaL6AJ","uN6r3D6rBy","W7cTstAOsr","bgJAzydG8U","zmLYDLewvM",
+"qUJMdIKxdL","2hEEUpiJSk","QnJ1SpmeCd","nFqikuZPqg","dmoS7Waim6","okgRiHzZT8","Cfgr3Qworu","1j5L8Oz8yZ","0YAGHOz8yZ","8U2nUO3iyQ",
+"7hyVvwDajX","iqv4khi5X7","WmadA5VZjS","IBe8kIjTwP","AgJHQsx5Gl","8xEKzYh1hF","XflUqhYBCK","Ta8f6FxX9q","zbIYYt98iW","7fKYUuJScX",
+"aez9ypT8wu","jS1aj5drc6","NAFuwyEfy9","Cfgr35Mg9r","5Drn0Fhtgl","HfyNQUvlv4","zFgtBv8yFN","tvdkDokgRi","5VZjSTXQ0Z","5Mg9rpvgjS",
+"VjCZqFFDui","IRh48VjCZq","StlDJ618Di","uLtKsQWxoT","h1zcHtaOXK","prNT60MR5X","s4786YjB9t","JJs5m1v5hH","Cp3mZqUJMd","WaWsvmz8gx",
+"s93MlIBe8k","B3qemVNCPd","dpe1vcL0aE","FGzgpU3yw5","OUYuFOxWIH","OUqFMZ4I1v","1v5hH6q6L9","RzaZATCgPp","xXTI4TXQ0Z","jfREuvLsmS",
+"lH1kt7ku1p","X6PinJ2mQi","GrDg7FjHXR","J2mQiQWxoT","tjQxs3otm6","zz4ZUd7vjM","BCxeCU3yw5","uN6r3wDajX","FGzgpRxrsm","Pb1paprNT6",
+"BbwgAydG8U","FGzgpCIShG","yEfy9kZANm","2hEEUG1RhS","5IhmGZ4I1v","kB5nPCfgr3","ZUnqtix74r","Y1mC0JXljW","dmoS7DcpWB","Gv3FqIBe8k",
+"NAFuwMkgy8","zqH0WFPfSE","QClRLQClRL","KASQ8POUYS","d7vjMpAhR1","cmXIXRBhp0","bZLvShUTw7","MmKGJHP433","uvf7AuZPqg","9eoRcRsQUq",
+"G1RhSyvOMI","YjB9tlCMxy","uQIczMojnP","lkMUAzQt6Q","uLtKseuZA5","ksJbyo8Uyd","Z4I1vuN6r3","v8yFNJKWYR","brhlQThjNn","vkCHHRsQUq",
+"ix74rjS1aj","azIWpVIlwP","KASQ8lXFOB","Z4I1viqv4k","SjskQpmeCd","NcICAlsQGo","DG4sTpFrrl","AkKTkM3zXL","b29RJCNHmv","580YDHP433",
+"fcwDaDcpWB","8RCUA1j5L8","RBhp0ReKEW","VjCZqQChxs","WPmlx24ARF","rz7UtB3qem","6q6L9Kr8ys","ciuWzHlUbF","IBe8kcShY2","LewvMl83Ud",
+"S2DfuGWqqX","8cVD3IRh48","EdBKcYf2Ec","AkKTkzY1GY","guMb8D6rBy","0KyfsfmIK1","SbRYyFwEJz","JXljWlViBv","lsQGoS77LH","euZA5a00b5",
+"yluBxiKqhr","ydG8UrKDLJ","oVQp6vLsmS","blLA9ix74r","HRxd8AXpwE","J2mQi0PktI","IKxdLFjHXR","rhl0JzY1GY","sqVrfokgRi","fqypykZANm",
+"t59lRS2Dfu","CK5W7RmDcr","lH1ktXflUq","In3NSAIYUu","8RCUAdhSuH","ru4UGpAhR1","gIYvEbgJAz","s4786M3zXL","2Yz7EksJby","8RCUAfFDrJ",
+"fcwDaHP433","yToGW0YAGH","2Nslm0h1b1","Kr8ys3otm6","zHF1q5drc6","ni2v1m4bxU","5VZjSgdQsS","IRh48n8pJ9","RpBQmP6bcg","zY1GYQssNC",
+"uoStwxXTI4","2ZHdkIn3NS","7hyVvpmeCd","0h1b1S77LH","8FmFHbgJAz","RzaZAX6Pin","FPfSE4W0Tl","rKDLJFPfSE","bZLvSoQ87r","JIqXih1zcH",
+"cmXIX7fsYM","hE1QlbgJAz","Mkgy88RCUA","zFgtB5Mg9r","M3zXL8hJdt","CNHmv618Di","JkzUnMaJQs","AgJHQQClRL","iqv4kJXljW","uJScXbgJAz",
+"2hEEUQnJ1S","cmXIXs93Ml","BGaQYaez9y","6q6L9d85a9","tuDySsoy9t","blLA9KASQ8","ni2v19XyT9","CIShGHlUbF","7ku1pSjskQ","v2eC33otm6",
+"3weIFM3zXL","hUTw7tuDyS","lXFOBSjskQ","piJSkuZPqg","ix74r55rfB","hYBCKpFrrl","Nxx9VMezSW","5iGN5W3VFH","24ARFOHaBz","oGu6xdQ586",
+"BGaQYRBhp0","lsQGoqQxHP","Nxx9VYf2Ec","zz4ZUzFgtB","n8pJ9nFqik","pAhR1JRJQB","QworuHfyNQ","i3pydmX2GE","LDk6fgf8rI","zQt6Q5Mg9r",
+"StlDJgjUTu","C2IrcAmdQd","G1RhS2hEEU","FjHXRPb1pa","Q6hMCIKxdL","fFDrJwDajX","1j5L8hYBCK","JRJQBazIWp","hi5X7rKDLJ","In3NSgtCA5",
+"ni2v1Dz1R3","IBe8kO3iyQ","4QMc91v5hH","jeskSWreyP","tlILt5Drn0","CqqaDJRJQB","hSSvQ4W0Tl","0YAGH7Ow5C","OxWIHS77LH","U3yw5ogLgc",
+"NAFuwVIlwP","taOXKjtn0X","W7cTsNOHsz","blLA92DREs","W3VFHyvOMI","dhSuHaDGtS","Ss0ZutuDyS","8cVD3fLNg8","MojnPDz1R3","CxVEfMkgy8",
+"jSjS38FmFH","Yh1hFCfgr3","7Ow5CK20wK","HzZT8GXdoH","B3qemAIYUu","uLtKshE1Ql","EoToPkB5nP","6AFT0jtn0X","8U2nUlm0pD","48cHLNAFuw",
+"7lUXZReKEW","zqH0WFhtgl","HP433uN6r3","prNT67Ow5C","hSSvQlj07Q","zmLYDD6rBy","DG4sTTCgPp","wiHrZQssNC","8hJdteuZA5","Chuy3uupzk",
+"lCMxyblLA9","14FLRCIShG","VLTy6AkKTk","P6bcga00b5","gtCA5GWqqX","M3zXLVLTy6","Cfgr3kB5nP","ulk41VNCPd","5IhmGCIShG","ReKEWhE1Ql",
+"xciqp7X3uy","zHF1qn1pmO","xXTI4VerEA","AkKTkThjNn","bZLvSX6Pin","XflUq9eoRc","lsQGodhSuH","XyPZN7ku1p","HRxd8xReec","FhtglJkzUn",
+"v8yFNs4786","IBe8kazIWp","bgJAzUmaEv","ogLgcBbwgA","AIYUuTXQ0Z","5Mg9rgIYvE","FxX9q2Yz7E","BpYhVeuZA5","DQimpuAWyp","n8pJ99rlg9",
+"0PktIVLTy6","pv0i7mz8gx","5iGN5fLNg8","8cVD3Nxx9V","Waim6SWfou","580YD5iGN5","s7MxkvOqCE","618DiAgJHQ","soy9tJKWYR","9iGoTm4bxU",
+"uTacxIRh48","OUYuFuZPqg","qUJMdaL6AJ","3weIFfcwDa","3otm6Cfgr3","Zv7z0IKxdL","uQIczJXljW","AmdQd0YAGH","VIlwPJKWYR","cQOnvhYBCK",
+"oVQp6hSSvQ","FnPFBLbRTH","6q6L9faHir","zFgtBgjUTu","h1zcHWreyP","7hyVvYf2Ec","uJScXWmadA","h1zcHni2v1","piJSktl72W","tjQxs7fsYM",
+"l83UddQ586","djsrvVIlwP","ReKEWpT8wu","07n1cQYxC0","M3zXLgdQsS","XyPZNsoy9t","d85a9zY1GY","lXFOBMGlTF","atef25drc6","AOgEeFnPFB",
+"pT8wuqQxHP","hSSvQgjUTu","14FLRdjsrv","uJScXzQt6Q","SjskQfmIK1","kB5nPB3qem","P6bcgbrhlQ","xXTI4uvf7A","i3pydd7vjM","Mm8sia00b5",
+"lViBvtjQxs","v8yFN5Namm","guMb8Uvlv4","1LB1L2Nslm","S2DfuOxWIH","fcJOyKASQ8","yvOMIqQxHP","CNHmvWmadA","8cVD3GSQwj","aL6AJQbxXc",
+"5iGN5qaofN","5nmWvMkgy8","WaWsvgtCA5","nnP8ouAWyp","EoToPMm8si","oVQp64QMc9","TXQ0ZyvOMI","AXpwEwiHrZ","8cVD3fFDrJ","uoStwCIShG",
+"NhXduxXTI4","OxWIH55rfB","7fKYUW7cTs","ydG8UHfyNQ","suY4xQssNC","XyPZN2Yz7E","FwEJzl83Ud","lm0pDv8yFN","0PktIRACuj","o8UydwDajX",
+"uTacx48cHL","okgRiMm8si","W7cTskZANm","zmLYDNAFuw","lsQGopvgjS","AgJHQAmdQd","lH1ktPYBf4","FLsphFhtgl","C2IrcprNT6","aL6AJAgJHQ",
+"0MR5X64s8N","CxVEfK4GS8","mz8gxaL6AJ","hSSvQVNCPd","AmdQd5Drn0","iqv4kNo0Qb","azIWplweGy","WreyPWaim6","i3pydReKEW","tl72Wrhl0J",
+"RmDcrogLgc","IRh4816lHc","nFqikFjHXR","lpF6Wpv0i7","ni2v1hE1Ql","uPX7GZzJHW","KsjRKtuDyS","4W0TlOz8yZ","W7cTsnlaBy","lH1ktjzUqR",
+"IjTwPVIlwP","Waim61v5hH","MGlTFi7WMQ","2TRI714FLR","NcICAMmKGJ","QWxoTS77LH","uTacxUvlv4","QnJ1Sl83Ud","IBe8k8TxD7","CIShGhYBCK",
+"pv0i7BGaQY","nFqik24ARF","EoToPl83Ud","48cHLjfREu","Yf2EcuoStw","ciuWzYOfrY","uTacxWreyP","djsrvMGlTF","5drc6Y1mC0","WPmlxGWqqX",
+"yluBxZUnqt","vLsmSfcwDa","zY1GYrKDLJ","1LB1LCNHmv","qaofNciuWz","tuDySYOfrY","atef23weIF","XyPZNFxX9q","0BmCyHzZT8","he9IAxciqp",
+"9iGoTuPX7G","v8yFNzmLYD","618DiJRJQB","ni2v1AXpwE","G1RhS1j5L8","HP433VNCPd","S77LHAmdQd","BFkb88cVD3","1LB1Lix74r","Qworu9y4lw",
+"W3VFHI7p2a","blLA9J2mQi","taOXK7lUXZ","v2eC3KZamH","n8pJ9xReec","CxVEf8cVD3","W3VFHDQimp","EdBKc9iGoT","F6PT2tuDyS","Q6Lixjtn0X",
+"Waim6GWqqX","0PktI45cIH","5IhmGl83Ud","fqypy4W0Tl","0Wr5y7ku1p","FGzgpGWqqX","pFrrlYw2oU","WmadARBhp0","PYBf4AgJHQ","5ZaEzyvOMI",
+"uQIczIBe8k","DQimpFxX9q","FwEJzru4UG","CqqaD7fKYU","lkMUAxciqp","VNCPdM3zXL","tlILtzY1GY","FLsphb29RJ","vOqCEQClRL","v2eC3e6e4z",
+"LbRTHjtn0X","48cHLMK07Y","ru4UGPOUYS","7hyVvtjQxs","5ZaEzjtn0X","t98iWJIqXi","Yw2oUF6PT2","POUYSOxWIH","9iGoTzz4ZU","okgRifaHir",
+"HlUbFSWfou","JRJQBYjB9t","kB5nPtuDyS","StlDJQworu","29QAzCdyBV","s4786M6qcG","zY1GYRkQke","FwEJzCK5W7","BpYhVMGlTF","zHF1qRBhp0",
+"BFkb8hi5X7","WDVWJzbIYY","Yw2oUuZPqg","QnJ1ScmXIX","zz4ZU45cIH","Z4I1vblLA9","JJs5mGv3Fq","WPmlxzY1GY","CqqaDRkQke","ZJTXHSWfou",
+"No0QbzmLYD","OxWIHDLhzM","OHaBziKqhr","SmGzvQClRL","G1RhS8xEKz","ogLgcP6bcg","tl72W4QMc9","lm0pD5Namm","618Dihe9IA","Yh1hFFjHXR",
+"AkKTkW3VFH","MezSWydG8U","VBjhzpvgjS","HRxd8LDk6f","jtn0XGSQwj","6q6L9gdQsS","Q6Lix5Drn0","ZJTXHaez9y","mX2GEdpe1v","hYBCKnnP8o",
+"ZzJHWfFDrJ","MGlTFTwano","L7cGcMkgy8","jzUqRcmXIX","gtCA5VIlwP","DQimpY1mC0","o8UydB3qem","cL0aEWaim6","8U2nU4dEz6","lweGyy94nw",
+"tjQxs7fKYU","ciuWzGrDg7","MaJQsix74r","2ZHdkcShY2","5IhmGqQxHP","yofH3gIYvE","5iGN5pT8wu","24ARFuTacx","ogLgcFxX9q","gdQsSPOUYS",
+"8RCUARsQUq","9GXkXn1pmO","G1RhSuAWyp","fcJOyoVQp6","cL0aEOUYuF","pT8wuiKqhr","ogLgctvdkD","7lUXZG1RhS","RmDcrMmKGJ","aez9ymz8gx",
+"4QMc9RkQke","5IhmGuN6r3","618Dih1zcH","TXQ0ZXflUq","Twanozz4ZU","o8UydfFDrJ","VNCPdAOgEe","bZLvSS2Dfu","0Wr5y9iGoT","dpe1vjeskS",
+"vOqCE8cVD3","CxVEfNOHsz","IBe8kgtCA5","euZA5W7cTs","fcwDazbIYY","QbxXche9IA","hSSvQUlU3M","8RCUAQ6hMC","ru4UGOHaBz","45cIH07n1c",
+"BbwgAP6bcg","KASQ8brhlQ","KASQ85nmWv","WPmlxpWiOs","1v5hHY1mC0","2Yz7EJXljW","ZzJHWqUJMd","MK07YZzJHW","StlDJBCxeC","hUTw7Cp3mZ",
+"KASQ8xXTI4","mX2GEDcpWB","1j5L8blLA9","EoToP580YD","nFqikZhwG1","0YAGH55rfB","ulk412ZHdk","iB08lcL0aE","4W0TlsuY4x","StlDJuAWyp",
+"CK5W7QYxC0","IRh48WPmlx","yToGW8RCUA","J2mQiZUnqt","RBhp0lH1kt","BbwgAhUTw7","1v5hHzFgtB","xXTI46AFT0","W3VFHiwzGk","hSSvQWPmlx",
+"14FLR45cIH","KASQ8580YD","GrDg7yToGW","580YD6AFT0","2DREsKr8ys","HP433qQxHP","QworuUmaEv","cL0aE7ku1p","DG4sTFcWrW","azIWp7fsYM",
+"JRJQBzqH0W","IjTwP8xEKz","lXFOBZuDtD","JJs5mn8pJ9","FVMxotAOsr","0PktIIjTwP","Mkgy8uPX7G","1j5L8QnJ1S","G1RhSn8pJ9","lkMUAnnP8o",
+"0BmCyUl4a1","1j5L8hi5X7","O3iyQpmeCd","Dz1R3OUqFM","FcWrWjiVBP","5ZaEzJkzUn","WaWsvIKxdL","618Dilj07Q","cL0aEFFDui","FwEJzlpF6W",
+"FLsph7X3uy","uQIczcL0aE","0Wr5y07n1c","5nmWvs7Mxk","WDVWJlXFOB","hi5X7SjskQ","FVMxoiwzGk","SWfouP6bcg","Yf2EcRsQUq","QWxoTStlDJ",
+"CNHmvpAhR1","ZJTXHazIWp","uPX7GHzZT8","9rlg9s93Ml","64s8NiwzGk","TwanoMm8si","dpe1v9XyT9","yEfy9m4bxU","NhXduFNYIM","9eoRcKASQ8",
+"JRJQBWaim6","NAFuwJIqXi","zz4ZUiB08l","Waim6MmsIo","s4786BGaQY","TCgPpAOgEe","NAFuwK4GS8","Cfgr3nFqik","fqypyksJby","FNYIMThjNn",
+"MK07YI7p2a","SjskQVNCPd","Ta8f6UlU3M","HlUbFs7Mxk","pv0i7lXFOB","i7WMQ8hJdt","vOqCEUlU3M","Yf2EcFxX9q","vOqCENOHsz","aDGtSpWiOs",
+"FVMxosqVrf","iB08lt98iW","FjHXRix74r","Vprf2lweGy","iKqhr16lHc","29QAzpFrrl","WreyP5IhmG","Mm8siokgRi","JRJQBFLsph","jzUqRfqypy",
+"cShY2Yh1hF","NOHszBpYhV","DQimpQ6Lix","iqv4k8xEKz","aFFssKZamH","TwanoL7cGc","piJSklweGy","bZLvSv8yFN","blLA9pmeCd","QbxXcxXTI4",
+"y94nwlm0pD","5IhmGB3qem","FFDuiO3iyQ","vOqCEQChxs","W3VFHeuZA5","RpBQmzHF1q","ECMvUe6e4z","e6e4zxReec","x3LDe4dEz6","2ZHdkRmDcr",
+"oGu6xBbwgA","Waim6UmaEv","dhSuHO3iyQ","i7WMQHlUbF","QYxC05drc6","NAFuwzFgtB","s7MxkDz1R3","dmoS745cIH","J2mQiBCxeC","OHaBzTXQ0Z",
+"GXdoHzHF1q","QnJ1SdhSuH","RmDcrNOHsz","k85AeK4GS8","v2eC3BFkb8","6q6L9yEfy9","MaJQss4786","8FmFHOHaBz","B3qemjeskS","JKWYRECMvU",
+"i7WMQmz8gx","BFkb88hJdt","BpYhVSjskQ","ix74r2ZHdk","prNT6BpYhV","RsQUqlweGy","guMb8AIYUu","WDVWJP6bcg","0Wr5yRmDcr","oGu6xQChxs",
+"YOfrYgjUTu","fLNg8bZLvS","djsrv64s8N","7X3uy7hyVv","QWxoT9rlg9","yofH3rhl0J","iB08lJIqXi","ni2v1brhlQ","HRxd85IhmG","WPmlx1v5hH",
+"8hJdtCK5W7","uZPqga00b5","lsQGocL0aE","lsQGotaOXK","yluBxiB08l","VNCPdtl72W","pvgjSuPX7G","TwanohYBCK","vkCHHv8yFN","uJScXtaOXK",
+"JJs5m2TRI7","zbIYYlweGy","9iGoTlm0pD","S2DfuzbIYY","580YD0YAGH","uQIcz7fsYM","FNYIMSbRYy","djsrv0PktI","jSjS3hYBCK","DLhzMYw2oU",
+"UmaEvjeskS","tvdkDgIYvE","pmeCdQbxXc","OUqFMRmDcr","SbRYyTXQ0Z","brhlQiqv4k","a00b5aL6AJ","lsQGoIBe8k","uN6r3bgJAz","iKqhrs7Mxk",
+"S77LHJXljW","NhXduRACuj","WmadAB3qem","45cIHs4786","HlUbFIRh48","yToGWDLhzM","tvdkDMGlTF","WmadACqqaD","OUYuFGSQwj","FcWrWy94nw",
+"5IhmGOxWIH","YOfrYUl4a1","rhl0JFwEJz","Chuy3FFDui","5Mg9rs4786","LDk6fy94nw","F6PT2ni2v1","5NammBGaQY","0Wr5yDQimp","48cHLVjCZq",
+"IRh48JJs5m","O3iyQcQOnv","CqqaDQ6Lix","aL6AJRmDcr","WreyPUl4a1","iqv4kVLTy6","Pb1paJ2mQi","OxWIHJRJQB","taOXKlm0pD","Cp3mZ4QMc9",
+"hUTw7gf8rI","W3VFHdhSuH","brhlQUlU3M","tjQxsOHaBz","qaofNZuDtD","YjB9toVQp6","K20wKtvdkD","zFgtBRzaZA","VerEAsuY4x","U3yw53otm6",
+"zbIYYlCMxy","XflUqHRxd8","EoToPCfgr3","DG4sTiKqhr","YjB9tNo0Qb","y94nwvkCHH","EdBKcEdBKc","uN6r3okgRi","Twano5IhmG","zmLYDjzUqR",
+"hi5X7t59lR","BpYhVO3iyQ","Pb1paIjTwP","GSQwjpv0i7","ksJbyh1zcH","YOfrYjzUqR","3weIFogLgc","24ARFlCMxy","NAFuwZuDtD","BbwgAgdQsS",
+"1v5hHGrDg7","oVQp6piJSk","uvf7A2ZHdk","fqypyHfyNQ","O3iyQCxVEf","hE1Qlm4bxU","qaofNbrhlQ","piJSkx3LDe","TXQ0ZU3yw5","pWiOsdQ586",
+"s4786ni2v1","uLtKsG1RhS","RkQke8xEKz","lXFOBDG4sT","MaJQsnnP8o","jtn0XQ6Lix","0MR5XRkQke","1j5L8prNT6","MezSWVLTy6","hUTw7QssNC",
+"taOXKIRh48","tl72WIn3NS","qaofN4W0Tl","nFqikKr8ys","wiHrZMmsIo","dQ586ru4UG","Zv7z0cmXIX","KZamH9y4lw","BGaQY8TxD7","WmadANo0Qb",
+"9eoRcazIWp","DLhzMJIqXi","G1RhSK4GS8","2hEEU2hEEU","Q6hMCaDGtS","AIYUuW7cTs","qUJMdCNHmv","d7vjM618Di","EdBKcYw2oU","zz4ZUXflUq",
+"6AFT0ReKEW","EOE1ocL0aE","Kr8ysMojnP","nFqikSbRYy","BpYhVgjUTu","QbxXc48cHL","8cVD37Ow5C","Pb1paHfyNQ","uQIczChuy3","CxVEf64s8N",
+"14FLRatef2","HlUbF0h1b1","tvdkD5VZjS","lCMxyLbRTH","Z4I1vaFFss","5Drn0I7p2a","VBjhzUlU3M","rKDLJQ6Lix","nnP8otaOXK","9GXkXDLhzM",
+"vOqCE7X3uy","FVMxoAgJHQ","ZzJHWokgRi","MmsIouvf7A","v1HlnJXljW","2DREsuupzk","618Di0BmCy","TCgPpmz8gx","pFrrl2ZHdk","euZA5NAFuw",
+"QworuTwano","xReecZJTXH","NOHszRBhp0","CxVEfcL0aE","6q6L9lViBv","1LB1L1LB1L","MojnPP6bcg","5Drn0hUTw7","GXdoHQnJ1S","X6PinpAhR1",
+"lpF6WiKqhr","16lHcX6Pin","KsjRKv2eC3","DQimp48cHL","7hyVvs4786","y94nwDz1R3","JRJQBG1RhS","jeskSNhXdu","pvgjSlpF6W","suY4xlsQGo",
+"t98iW14FLR","1j5L85drc6","FPfSE0YAGH","s4786CK5W7","fqypytvdkD","QssNC29QAz","9iGoTP6bcg","zz4ZUMK07Y","0h1b1EdBKc","ru4UGThjNn",
+"t59lRRACuj","RkQkeBCxeC","pmeCdoGu6x","W7cTsgIYvE","CNHmvFhtgl","yvOMIX6Pin","GSQwjn1pmO","RACujEOE1o","Yh1hF5Mg9r","5IhmGFxX9q",
+"hSSvQVprf2","16lHcVprf2","hE1Ql24ARF","oVQp6lsQGo","W3VFHYOfrY","HRxd8wiHrZ","5iGN5ix74r","WreyPXflUq","d7vjMcmXIX","ogLgcqaofN",
+"16lHcGv3Fq","I7p2aMaJQs","Oz8yZ8TxD7","K20wKSWfou","FcWrWMmsIo","OHaBzv1Hln","yvOMIVLTy6","5Mg9rRpBQm","GSQwjNcICA","D6rBynlaBy",
+"In3NS7X3uy","sqVrfNo0Qb","K20wKGrDg7","NcICARsQUq","5iGN5SbRYy","QssNCkB5nP","FNYIMYf2Ec","DQimpIRh48","JJs5mbZLvS","aez9yBpYhV",
+"bZLvSFxX9q","Ul4a1uAWyp","FVMxoxReec","bgJAzFNYIM","XflUqFcWrW","cL0aEAXpwE","yToGWcShY2","U3yw59eoRc","JkzUnYOfrY","pT8wu3otm6",
+"RACujEoToP","9iGoTfcwDa","JKWYRFjHXR","M6qcGCfgr3","MK07YYOfrY","lH1ktSjskQ","jzUqR55rfB","4W0TlLewvM","DG4sT9eoRc","Dz1R3Yh1hF",
+"xXTI4m4bxU","iqv4kSs0Zu","lweGypvgjS","VNCPdjSjS3","ydG8U9rlg9","x3LDeWDVWJ","zbIYYl83Ud","hUTw7yofH3","FcWrW5Drn0","iwzGkdQ586",
+"oGu6xuAWyp","OUqFMyofH3","FFDuitAOsr","D6rBy8hJdt","YjB9tzqH0W","vOqCEeuZA5","CK5W7FxX9q","ydG8UqQxHP","Zv7z0CIShG","atef20Kyfs",
+"uupzkblLA9","iwzGkuTacx","aFFss4QMc9","9iGoTciuWz","9rlg9JIqXi","FGzgpIjTwP","uoStwPYBf4","WMiS3zmLYD","rKDLJsx5Gl","5IhmGtjQxs",
+"0h1b1YjB9t","5IhmGGrDg7","0ao3ls4786","aDGtSzz4ZU","yluBxuLtKs","0YAGH8hJdt","vLsmSWPmlx","618Didpe1v","taOXKFhtgl","WaWsvgdQsS",
+"EdBKcY1mC0","Yf2EckZANm","uvf7A8RCUA","hYBCKO3iyQ","HRxd855rfB","WPmlxlm0pD","oVQp65VZjS","e6e4zWaWsv","aez9yEdBKc","K20wKuoStw",
+"9iGoTWaim6","Dz1R3zz4ZU","580YDdQ586","ThjNnPOUYS","0h1b1yluBx","NOHszFFDui","s93Ml24ARF","s4786TXQ0Z","WMiS324ARF","d85a9SbRYy",
+"5Namm9XyT9","cL0aEYf2Ec","7Ow5CiB08l","pT8wuuvf7A","BCxeCK20wK","1LB1LS77LH","FFDuijtn0X","fmIK1oGu6x","9XyT9S2Dfu","ECMvUzHF1q",
+"Chuy32DREs","vOqCEvOqCE","Nxx9VjeskS","dmoS7NhXdu","vOqCEiqv4k","7hyVve6e4z","lCMxy0PktI","zz4ZU5iGN5","AXpwEJKWYR","dQ5869iGoT",
+"FGzgplCMxy","fLNg8UlU3M","AIYUuQ6hMC","BGaQY9XyT9","X6PinJXljW","P6bcg5ZaEz","XflUqJKWYR","8U2nUNo0Qb","No0Qb7fsYM","CdyBV5Mg9r",
+"Waim6wDajX","MezSWvLsmS","07n1cdmoS7","lj07QMkgy8","7fKYUXyPZN","SWfouuJScX","xReecTa8f6","VBjhzOUYuF","GXdoHQWxoT","HzZT8CNHmv",
+"MezSWNOHsz","MaJQsCqqaD","k85Ae0h1b1","Q6LixpAhR1","zqH0WzY1GY","8U2nUqaofN","KsjRKcmXIX","16lHcTwano","ni2v1n1pmO","WPmlxHfyNQ",
+"aL6AJOUYuF","5iGN55VZjS","qQxHP55rfB","pFrrlQChxs","gjUTuk85Ae","9iGoTtlILt","hi5X7fmIK1","tlILtpAhR1","IRh48ECMvU","fcwDaiKqhr",
+"fcJOywiHrZ","qUJMdVNCPd","gf8rI0ao3l","QWxoTJXljW","7fKYUW3VFH","FwEJzQworu","Kr8ysdhSuH","9eoRcVjCZq","uJScXjtn0X","tl72WnFqik",
+"nnP8ociuWz","k85AezFgtB","0MR5XciuWz","HlUbFzY1GY","Oz8yZLewvM","KASQ8jiVBP","mz8gxLDk6f","M6qcGBCxeC","JKWYRRmDcr","djsrv2TRI7",
+"Nxx9VpvgjS","RzaZAh1zcH","lViBvzmLYD","1LB1LFFDui","iwzGkJXljW","i7WMQuoStw","0Wr5yd85a9","J2mQi5drc6","618DiX6Pin","o8UydRBhp0",
+"zmLYDkZANm","mz8gxfaHir","AgJHQOxWIH","5Mg9rFLsph","hYBCK0ao3l","DG4sTVprf2","MGlTFQssNC","iB08lCIShG","SWfouKASQ8","HfyNQuJScX",
+"0YAGHdhSuH","tAOsrWaim6","SWfouv2eC3","nFqikkZANm","CdyBVJXljW","VIlwPCqqaD","4dEz6GWqqX","aFFss4dEz6","lsQGokB5nP","LbRTHiKqhr",
+"yofH3VerEA","JkzUn45cIH","pv0i7rhl0J","7X3uyVNCPd","D6rByNxx9V","FNYIMMmsIo","jiVBPW3VFH","soy9tjSjS3","pmeCdxReec","jfREuiKqhr",
+"POUYSM6qcG","oQ87rYjB9t","cmXIXlsQGo","o8Uyd24ARF","8RCUA7fsYM","CNHmvgjUTu","vkCHHZJTXH","RsQUqwDajX","7Ow5CHP433","ydG8U5nmWv",
+"580YDfcJOy","FnPFBGXdoH","aez9y5iGN5","uN6r35Namm","VBjhzTwano","U3yw5UmaEv","SmGzvIKxdL","VjCZqSWfou","FFDuiEdBKc","brhlQRxrsm",
+"BCxeCMGlTF","BFkb8QWxoT","CxVEfi7WMQ","pWiOsokgRi","VLTy6dpe1v","IRh48lViBv","3otm60PktI","cmXIXv8yFN","Uvlv4ZUnqt","FxX9q48cHL",
+"cQOnv2DREs","RpBQmmz8gx","hYBCKsuY4x","VBjhzl83Ud","JJs5mSmGzv","4W0Tl0YAGH","qQxHP0PktI","nFqikzz4ZU","hi5X7Pb1pa","Kr8ysDcpWB",
+"BFkb84dEz6","lCMxyhYBCK","3weIFCIShG","Yh1hFhYBCK","x3LDeRACuj","yluBx5IhmG","b29RJzqH0W","bgJAzpFrrl","2hEEU6q6L9","StlDJVLTy6",
+"Cp3mZix74r","2TRI73otm6","ZJTXHtaOXK","Y1mC08hJdt","Pb1pajtn0X","JJs5m9rlg9","nlaByReKEW","4W0TlX6Pin","5Mg9ratef2","FGzgpgtCA5",
+"zY1GYDLhzM","e6e4ztaOXK","9y4lw7hyVv","jeskSJJs5m","n1pmOix74r","pT8wuMmsIo","0MR5XuTacx","WMiS3MmsIo","tlILt7hyVv","24ARFvOqCE",
+"7ku1pFhtgl","Chuy3nFqik","RsQUqWaim6","he9IAhUTw7","2TRI7uoStw","JRJQBjzUqR","7hyVvFLsph","NOHsztl72W","piJSk0h1b1","tl72W2DREs",
+"K20wKyEfy9","fqypyBCxeC","TCgPp5Namm","euZA5GWqqX","LbRTHtAOsr","G1RhSzHF1q","tAOsrlm0pD","Dz1R3W3VFH","VBjhzhSSvQ","Mm8si580YD",
+"VIlwPGrDg7","guMb8v8yFN","RpBQmWmadA","29QAz0BmCy","FjHXRlj07Q","2DREs14FLR","DQimp8hJdt","Dz1R3U3yw5","Pb1paRzaZA","VNCPdazIWp",
+"Q6LixAXpwE","ReKEWuZPqg","s93Ml8cVD3","y94nwReKEW","Yw2oUFxX9q","QYxC0i7WMQ","S77LHhSSvQ","Qworu2Nslm","QYxC0FxX9q","QChxsrKDLJ",
+"i7WMQPOUYS","TwanoFwEJz","OUYuFHfyNQ","0h1b1VjCZq","rz7Utgf8rI","OHaBznFqik","Ul4a1qaofN","k85AelXFOB","suY4x0h1b1","Waim6cmXIX",
+"Kr8yspFrrl","d7vjMciuWz","7fsYMRACuj","yluBxFcWrW","Yw2oUFcWrW","hSSvQG1RhS","CNHmvGrDg7","i7WMQksJby","16lHcfaHir","J2mQiHP433",
+"NcICA29QAz","v8yFNcQOnv","t59lRO3iyQ","i3pydAmdQd","oQ87ruvf7A","QClRLsx5Gl","LewvMOHaBz","gtCA5he9IA","2DREshYBCK","7X3uycQOnv",
+"jeskShSSvQ","OHaBzhSSvQ","Kr8yslsQGo","EOE1ogtCA5","tvdkDkB5nP","aFFssCK5W7","tjQxsQ6Lix","GWqqXpvgjS","lViBvOUqFM","4W0TlO3iyQ",
+"zmLYD0h1b1","zmLYDuAWyp","rKDLJLbRTH","8cVD37X3uy","7hyVvL7cGc","I7p2aiKqhr","QbxXc8U2nU","zHF1q0MR5X","bgJAzNxx9V","RpBQmCfgr3",
+"RACujM3zXL","NcICAIKxdL","pFrrldpe1v","hSSvQk85Ae","LbRTHrz7Ut","s93Ml9rlg9","24ARF6q6L9","d85a9QssNC","o8UydF6PT2","In3NSaez9y",
+"HRxd807n1c","n1pmOCp3mZ","0ao3lQworu","gdQsSiKqhr","Fhtgl7fKYU","ksJbyfLNg8","CNHmv7hyVv","0YAGHJKWYR","ydG8UUlU3M","rKDLJZhwG1",
+"NOHszCIShG","tl72WiB08l","piJSkciuWz","RACujksJby","NhXduWaWsv","y94nwVBjhz","tjQxsiqv4k","kZANmnnP8o","jS1ajWPmlx","lCMxyECMvU",
+"uPX7GpvgjS","lm0pDnFqik","xXTI4qaofN","faHirwiHrZ","Qworudjsrv","29QAzOxWIH","i7WMQyEfy9","soy9t580YD","NOHszWreyP","JJs5mtvdkD",
+"d85a9aDGtS","iwzGk1v5hH","AkKTkvkCHH","M6qcG8cVD3","ECMvUfcwDa","RkQkecL0aE","JKWYRS2Dfu","lpF6WGv3Fq","uTacxuJScX","sqVrfmz8gx",
+"7fsYMSjskQ","WMiS3BFkb8","pT8wuuQIcz","hSSvQoGu6x","JIqXibgJAz","0MR5XMaJQs","WreyPMezSW","zqH0W8xEKz","i7WMQ7Ow5C","hE1Ql7fsYM",
+"yofH3cL0aE","yEfy9lH1kt","9XyT99rlg9","ulk41iqv4k","GWqqX24ARF","uJScXfLNg8","FhtglqUJMd","iqv4ktAOsr","l83UdnnP8o","S77LHU3yw5",
+"uN6r3vLsmS","K20wKFxX9q","6q6L92hEEU","e6e4zLbRTH","QWxoTpv0i7","FLsphgdQsS","Nxx9V6q6L9","brhlQ8hJdt","kB5nPb29RJ","zY1GYsx5Gl",
+"vkCHHuLtKs","VLTy624ARF","D6rByxReec","fqypyYjB9t","3otm6fFDrJ","Yh1hFgtCA5","a00b5ThjNn","lm0pDuupzk","IRh482ZHdk","AmdQdVerEA",
+"JkzUnAkKTk","Mm8siAIYUu","8FmFHmz8gx","Cp3mZTXQ0Z","iwzGkYh1hF","yofH34dEz6","YOfrYJRJQB","s7MxkGWqqX","D6rByvOqCE","dQ586ulk41",
+"lH1kt64s8N","YOfrY48cHL","OUYuFdpe1v","ECMvUlCMxy","jiVBPY1mC0","FPfSES77LH","tl72WJRJQB","LewvMzY1GY","QWxoTuPX7G","AgJHQzbIYY",
+"yluBxqUJMd","a00b57ku1p","Z4I1v29QAz","XyPZNiB08l","lkMUA9rlg9","sx5GljfREu","lH1ktCp3mZ","AkKTkZJTXH","FjHXRjfREu","Chuy3wDajX",
+"FVMxo3weIF","G1RhSMmsIo","hSSvQSbRYy","9eoRcTXQ0Z","DcpWBCxVEf","hUTw7Gv3Fq","uoStwzbIYY","lViBvNxx9V","HlUbFVjCZq","K4GS8Mkgy8",
+"yvOMIsx5Gl","GSQwjQworu","fcJOyzmLYD","45cIHni2v1","24ARFdmoS7","Nxx9VciuWz","yvOMILewvM","gf8rINo0Qb","KASQ8JKWYR","CdyBVuoStw",
+"Y1mC0nFqik","zbIYYtjQxs","dQ586OxWIH","XflUqQ6Lix","6q6L9CIShG","sx5GltlILt","Yh1hFlpF6W","pWiOshYBCK","k85Ae7lUXZ","DcpWBM6qcG",
+"BpYhVUmaEv","zHF1qF6PT2","FjHXRciuWz","YOfrYFcWrW","8cVD324ARF","NOHszqaofN","v1HlnSs0Zu","zmLYDlH1kt","IjTwP24ARF","s7Mxkhi5X7",
+"JKWYR9GXkX","ReKEWjzUqR","guMb8uZPqg","Z4I1vCqqaD","Kr8ysXyPZN","Cfgr3FnPFB","lm0pDhi5X7","ni2v1hi5X7","jiVBPJXljW","h1zcHDz1R3",
+"Y1mC0G1RhS","NcICAJ2mQi","sqVrf0YAGH","iqv4kYw2oU","prNT6VjCZq","RmDcrcQOnv","qaofNjS1aj","Gv3FqfLNg8","VNCPdRpBQm","5NammjS1aj",
+"cL0aEFnPFB","HlUbFi3pyd","29QAzcmXIX","5ZaEzxciqp","hYBCK9rlg9","LDk6fI7p2a","No0QbuTacx","FcWrWlXFOB","Y1mC0h1zcH","kZANmAXpwE",
+"POUYSdpe1v","ZUnqtStlDJ","L7cGc7hyVv","kZANmblLA9","ZzJHWjfREu","Chuy3uAWyp","F6PT2DcpWB","64s8NZuDtD","zqH0WFwEJz","cQOnvDz1R3",
+"2ZHdkhYBCK","VIlwPZUnqt","7Ow5CRmDcr","8cVD3FPfSE","uZPqgWreyP","AgJHQ8hJdt","VjCZqXyPZN","FhtglkB5nP","TXQ0Z0ao3l","l83Ud8xEKz",
+"BbwgAlCMxy","lm0pDNo0Qb","AmdQdazIWp","fFDrJJIqXi","GSQwj0MR5X","zz4ZUOz8yZ","VLTy6Kr8ys","2TRI7uN6r3","X6Pin0PktI","zqH0WRBhp0",
+"7lUXZulk41","WaWsv64s8N","QYxC0mX2GE","OUYuFQssNC","8RCUAMezSW","CqqaDiwzGk","v1HlnVLTy6","wDajXJRJQB","aFFssru4UG","dhSuHbgJAz",
+"Nxx9VL7cGc","SbRYy2Nslm","BpYhVqaofN","rhl0J7hyVv","FNYIMpWiOs","cL0aERsQUq","J2mQiyEfy9","jzUqRcL0aE","i7WMQzbIYY","OUYuFzz4ZU",
+"JRJQBlViBv","dQ586fqypy","IKxdL0h1b1","ThjNnxReec","8U2nUt98iW","mz8gxKZamH","M3zXLrhl0J","qaofNwiHrZ","TCgPp9eoRc","HzZT8gf8rI",
+"Q6hMCgdQsS","5nmWvzFgtB","45cIHguMb8","9eoRclj07Q","CdyBVYh1hF","StlDJcQOnv","CK5W7LewvM","5Drn0pvgjS","hUTw7ECMvU","tvdkDCfgr3",
+"QYxC0PYBf4","lCMxySmGzv","hE1QlCqqaD","JJs5mVerEA","XyPZNQChxs","yluBxTwano","jfREuxReec","hSSvQWmadA","Twano0BmCy","Mkgy8Ss0Zu",
+"EOE1oFPfSE","aDGtSSs0Zu","FnPFBoVQp6","okgRiuvf7A","BpYhVhE1Ql","7X3uypiJSk","AmdQd7Ow5C","QWxoT0BmCy","RzaZAfaHir","l83UdGWqqX",
+"1j5L8OUYuF","CK5W7QssNC","5VZjS5Drn0","M3zXLL7cGc","WreyPpT8wu","NhXdulkMUA","FVMxobrhlQ","S2DfuhYBCK","OUqFM1LB1L","VBjhz0ao3l",
+"FhtglsqVrf","7fsYMpv0i7","pAhR1AIYUu","45cIHSjskQ","0PktISs0Zu","I7p2acmXIX","JRJQBdpe1v","DcpWBSs0Zu","VerEAydG8U","hYBCKgIYvE",
+"MezSW8FmFH","lCMxyHRxd8","PYBf4U3yw5","48cHLGrDg7","kB5nP8hJdt","bZLvSn1pmO","IBe8kChuy3","pAhR1jeskS","7ku1pCNHmv","J2mQiguMb8",
+"vLsmS3otm6","64s8NnnP8o","Mm8siDG4sT","m4bxUfLNg8","ThjNnVerEA","wiHrZjeskS","JIqXi0Kyfs","v1Hlnrz7Ut","1LB1LM6qcG","2TRI7v1Hln",
+"0h1b1gjUTu","iKqhrjSjS3","7ku1p7ku1p","uPX7GFVMxo","Kr8ysFcWrW","5VZjSRkQke","Q6hMCJJs5m","h1zcHjSjS3","Rxrsm5drc6","fmIK1ciuWz",
+"P6bcgtvdkD","kZANmnlaBy","ZJTXH64s8N","4QMc9No0Qb","Yf2EcJJs5m","POUYSi7WMQ","QClRLokgRi","oQ87rIn3NS","ksJbykB5nP","pmeCdyluBx",
+"NhXduQbxXc","HfyNQaL6AJ","tAOsrix74r","Yf2EctAOsr","o8UydiB08l","TXQ0Z8RCUA","iwzGkzFgtB","WmadAlkMUA","8RCUAhE1Ql","iqv4kogLgc",
+"EOE1otuDyS","XyPZNuPX7G","oQ87rCp3mZ","lH1ktQssNC","tuDySMaJQs","7X3uyjfREu","NOHsz7ku1p","FnPFBpvgjS","7lUXZv2eC3","1LB1LhYBCK",
+"vOqCEVIlwP","P6bcgzFgtB","0Wr5ynFqik","Zv7z0ru4UG","zY1GYVLTy6","ydG8UIn3NS","bgJAzhE1Ql","atef2tjQxs","cmXIXaez9y","Y1mC0QssNC",
+"brhlQs93Ml","GSQwjfcwDa","FhtgljiVBP","7X3uyCfgr3","DcpWBgtCA5","tAOsrZUnqt","Cp3mZOxWIH","Uvlv4KZamH","M3zXLWreyP","Y1mC0MojnP",
+"YOfrY0PktI","IRh488TxD7","4W0Tlfqypy","pAhR1o8Uyd","F6PT2vkCHH","WMiS3StlDJ","cL0aEMojnP","gtCA5FFDui","DG4sTIjTwP","G1RhShUTw7",
+"NAFuwaL6AJ","jtn0XwiHrZ","lViBv8U2nU","sx5Gl3otm6","QnJ1S7lUXZ","2Yz7Es4786","KsjRKuJScX","AgJHQVBjhz","JKWYRguMb8","ogLgci3pyd",
+"yofH3IKxdL","iB08l5Mg9r","BCxeC7Ow5C","aez9y0Kyfs","In3NSgf8rI","ZUnqt9eoRc","ReKEWyEfy9","ThjNnYw2oU","JXljWuTacx","dQ586tuDyS",
+"FGzgpogLgc","5nmWvLewvM","faHirpAhR1","nFqikulk41","FGzgpSjskQ","HlUbF9GXkX","Ss0ZuZJTXH","AmdQdlViBv","8RCUArhl0J","aL6AJhUTw7",
+"KASQ8B3qem","618DiJXljW","MK07Yuvf7A","MGlTFjS1aj","BbwgA07n1c","ZUnqt14FLR","yEfy90Wr5y","QnJ1SuZPqg","tvdkDMmsIo","NOHszaez9y",
+"M3zXLTa8f6","xciqpyEfy9","s93MltaOXK","MGlTFFjHXR","CIShGHP433","suY4xLewvM","iqv4kWDVWJ","m4bxU0YAGH","hYBCKyofH3","BpYhVuJScX",
+"OUqFMWDVWJ","GrDg7pv0i7","0Wr5yBbwgA","RpBQmOUYuF","I7p2aReKEW","he9IAEOE1o","XflUqrz7Ut","3otm6a00b5","8hJdtOHaBz","NcICAF6PT2",
+"Ss0ZuF6PT2","RpBQmThjNn","Ta8f60YAGH","0YAGHtAOsr","oVQp6VNCPd","FnPFBJXljW","WDVWJrKDLJ","BGaQYe6e4z","uPX7GUlU3M","taOXKWaWsv",
+"EOE1oAgJHQ","lj07QJkzUn","RACujhi5X7","aFFsshE1Ql","Dz1R3FNYIM","mz8gxQ6hMC","fFDrJlsQGo","o8UydCIShG","Vprf2iqv4k","QWxoTrz7Ut",
+"FwEJzWaim6","uN6r3IBe8k","fqypySbRYy","5iGN52DREs","ZuDtDX6Pin","Q6hMC0Kyfs","blLA9o8Uyd","t98iWfaHir","MmsIouZPqg","nlaBygIYvE",
+"uTacxMmKGJ","5IhmGTXQ0Z","iqv4kVBjhz","8RCUAKsjRK","IRh48SWfou","uTacxpT8wu","aez9ye6e4z","ulk41d85a9","uLtKs5Namm","64s8NpmeCd",
+"TwanoAXpwE","YOfrYuQIcz","pAhR1jS1aj","Waim6ThjNn","kB5nPGWqqX","gf8rI5Namm","ogLgcThjNn","ReKEW2DREs","GrDg73otm6","FjHXR7ku1p",
+"faHirNAFuw","I7p2alCMxy","9eoRcZJTXH","i3pydxXTI4","jtn0XhUTw7","1v5hHxciqp","BFkb8yEfy9","MmsIopvgjS","9XyT9jzUqR","I7p2aEOE1o",
+"1v5hH5VZjS","4dEz6BbwgA","lCMxyxXTI4","Gv3FqaDGtS","qaofNqUJMd","v1HlnTwano","BbwgAfLNg8","kB5nP9y4lw","yToGWt98iW","yToGWOHaBz",
+"dhSuHRxrsm","MK07Ysx5Gl","CIShGStlDJ","55rfBm4bxU","ksJbyCIShG","CqqaD3otm6","oQ87rQbxXc","v2eC3RkQke","PYBf4CNHmv","QbxXcprNT6",
+"uPX7GNOHsz","ZzJHW7ku1p","yToGWTCgPp","BGaQYOHaBz","QnJ1SHRxd8","VBjhz8FmFH","LewvMNAFuw","ZUnqt9y4lw","ulk41MojnP","HlUbFEoToP",
+"djsrvaFFss","SjskQFnPFB","mz8gxOz8yZ","2TRI7aL6AJ","KZamHQbxXc","7hyVvtvdkD","a00b5B3qem","MGlTFiKqhr","I7p2a580YD","YjB9t2hEEU",
+"yvOMIO3iyQ","yToGW618Di","5VZjSnFqik","hSSvQe6e4z","dhSuHv8yFN","HzZT8CK5W7","s7MxkcL0aE","DLhzMCdyBV","HlUbFzmLYD","TCgPpIjTwP",
+"7Ow5CVprf2","K20wKJKWYR","VIlwPDLhzM","aez9y64s8N","vLsmSGWqqX","QYxC0Cp3mZ","8hJdtgtCA5","h1zcHAmdQd","uoStwlweGy","8cVD3IBe8k",
+"48cHLWaim6","2Yz7EtlILt","CdyBVNAFuw","EoToPgjUTu","jtn0XlkMUA","nnP8oPYBf4","uLtKsbrhlQ","fFDrJfcwDa","YOfrYbgJAz","NhXduECMvU",
+"ZzJHWMmKGJ","55rfBIBe8k","yEfy9FcWrW","okgRidpe1v","okgRiQbxXc","nFqikCxVEf","LDk6f9eoRc","h1zcHPb1pa","fcwDajeskS","2ZHdk5Mg9r",
+"GSQwjciuWz","LDk6ft98iW","d85a9tlILt","0BmCyBFkb8","DG4sTMK07Y","dQ5865Drn0","WPmlxni2v1","uTacxLbRTH","e6e4zgf8rI","oQ87rVBjhz",
+"J2mQiAXpwE","fFDrJMK07Y","aFFssbrhlQ","8cVD3yToGW","k85AeTCgPp","uLtKsYjB9t","SjskQIBe8k","RsQUqTXQ0Z","xXTI4lViBv","GSQwj2Nslm",
+"MaJQsAkKTk","StlDJ9XyT9","Yw2oUQChxs","ReKEWReKEW","v2eC35IhmG","2Nslmi3pyd","nnP8oguMb8","oQ87rlCMxy","G1RhSJ2mQi","pv0i78RCUA",
+"zz4ZUqUJMd","i3pydpiJSk","cShY2YOfrY","ZJTXHWDVWJ","rKDLJJIqXi","DcpWBtlILt","aL6AJOHaBz","uAWypiKqhr","0ao3ly94nw","FVMxoJIqXi",
+"2hEEUMojnP","vLsmSbrhlQ","1v5hHFcWrW","guMb8pAhR1","oGu6xIKxdL","618Din8pJ9","lCMxya00b5","Waim6s7Mxk","QbxXcO3iyQ","RACujqaofN",
+"fqypyFnPFB","yluBxEOE1o","FFDuiVBjhz","i7WMQJkzUn","0YAGH16lHc","RmDcr8FmFH","bZLvSuLtKs","gIYvEaDGtS","K20wKLbRTH","1j5L80YAGH",
+"kZANmhYBCK","CK5W7guMb8","DG4sTMaJQs","Ul4a1MK07Y","2Yz7ElweGy","iqv4kIRh48","JkzUnpFrrl","0Wr5yQbxXc","cQOnvIjTwP","2hEEUKASQ8",
+"ni2v1zbIYY","4W0TlM3zXL","GrDg7QssNC","FVMxolpF6W","O3iyQzqH0W","fcwDaLewvM","8RCUAMmsIo","No0QbnFqik","RBhp0G1RhS","NAFuwSs0Zu",
+"ydG8UqaofN","14FLR0PktI","n1pmO7fsYM","JkzUnJXljW","5nmWvGWqqX","uJScX9GXkX","cL0aEsuY4x","v2eC3FGzgp","iqv4kK4GS8","lm0pDwiHrZ",
+"ydG8U0Kyfs","7hyVvC2Irc","X6PinFFDui","B3qemOUYuF","FjHXRZhwG1","uTacxLewvM","X6PinYjB9t","8RCUAWaim6","TXQ0ZRxrsm","n1pmO1j5L8",
+"7ku1pQ6hMC","7hyVvo8Uyd","qUJMdFLsph","xReecxciqp","MaJQsrz7Ut","HP433lm0pD","C2Ircmz8gx","yofH39rlg9","X6Pin8cVD3","KZamHLDk6f",
+"5VZjS8RCUA","n8pJ9aFFss","jS1ajW3VFH","FxX9qfLNg8","FVMxoqQxHP","UmaEvgtCA5","dhSuH9iGoT","FcWrWGSQwj","RACujfcJOy","nnP8oCIShG",
+"Nxx9VCfgr3","8RCUApWiOs","t98iW24ARF","2hEEUaL6AJ","F6PT2SWfou","pT8wuHRxd8","OUqFMdmoS7","Pb1paWDVWJ","POUYSBbwgA","gIYvE4dEz6",
+"nnP8oazIWp","QWxoTix74r","d7vjMkB5nP","ReKEW0MR5X","FGzgpguMb8","8xEKzIjTwP","bZLvSJKWYR","sx5GlWreyP","tvdkDHRxd8","RBhp0tAOsr",
+"fcwDaSWfou","4dEz6BpYhV","FNYIMHP433","FnPFBSWfou","fcwDaoGu6x","FnPFBYh1hF","M6qcGjfREu","0MR5X5drc6","s7MxkTwano","GXdoHeuZA5",
+"0PktIhe9IA","WreyPpWiOs","IKxdLO3iyQ","yvOMIWDVWJ","lpF6WUlU3M","5ZaEzzqH0W","i3pydLewvM","4QMc9vkCHH","x3LDeVjCZq","lkMUAWaWsv",
+"ZzJHWUvlv4","wiHrZEOE1o","VerEAyToGW","zbIYYJRJQB","LDk6fZzJHW","piJSkVprf2","mz8gxfcwDa","i7WMQvLsmS","9GXkXP6bcg","VLTy6Twano",
+"DLhzMZJTXH","xciqpy94nw","lViBvrKDLJ","tjQxsdjsrv","oGu6xQbxXc","n1pmOi7WMQ","atef22DREs","55rfBzHF1q","JJs5mK20wK","2ZHdkHfyNQ",
+"RBhp0DQimp","d85a9StlDJ","qaofNNxx9V","dpe1vnnP8o","QssNCzY1GY","TwanobgJAz","HP433SmGzv","G1RhSgdQsS","tjQxsPb1pa","pT8wue6e4z",
+"5Mg9r7Ow5C","IjTwPMm8si","NOHsz8hJdt","d85a9zmLYD","m4bxUX6Pin","2Yz7EtuDyS","24ARFogLgc","zbIYYhi5X7","0MR5X9eoRc","QssNCiKqhr",
+"atef2rKDLJ","RACujix74r","azIWpuAWyp","UmaEvLDk6f","lH1kteuZA5","hSSvQLDk6f","Cfgr38FmFH","lweGyBpYhV","zz4ZUGv3Fq","X6PinnlaBy",
+"lCMxyWaWsv","POUYSStlDJ","No0Qb55rfB","pv0i79eoRc","9eoRcVBjhz","VerEArhl0J","rhl0J2ZHdk","nFqikIjTwP","07n1clpF6W","YjB9tDcpWB",
+"a00b5W7cTs","CxVEfOHaBz","NOHszNxx9V","9rlg95VZjS","faHirblLA9","ReKEW0BmCy","DG4sTW3VFH","FVMxo0Wr5y","WPmlxix74r","lpF6WVjCZq",
+"zqH0WvkCHH","JXljWTCgPp","nlaBy8xEKz","x3LDeJKWYR","29QAzCNHmv","5drc6FNYIM","aez9yuoStw","S2DfuSWfou","29QAzjtn0X","fqypypiJSk",
+"0Wr5yzz4ZU","yofH3KASQ8","MmsIoYh1hF","Ss0ZuzqH0W","t59lROxWIH","Mm8si8U2nU","JXljWKZamH","ulk416AFT0","a00b5YOfrY","IKxdLv1Hln",
+"2hEEUjtn0X","MaJQsy94nw","uZPqgfLNg8","0KyfsvOqCE","LewvMFVMxo","G1RhSQClRL","8hJdtVNCPd","m4bxUDLhzM","fmIK155rfB","YjB9t1j5L8",
+"v8yFNDcpWB","Yw2oURsQUq","AkKTkMK07Y","Vprf2atef2","zFgtB55rfB","7fKYU8xEKz","jzUqRl83Ud","jzUqROHaBz","ReKEWvLsmS","oQ87r5nmWv",
+"ZUnqt580YD","SjskQQ6Lix","J2mQiU3yw5","YjB9tgtCA5","tvdkDtjQxs","NAFuwpmeCd","djsrvcmXIX","ZuDtD7lUXZ","ThjNn0h1b1","ZUnqtuZPqg",
+"lweGyFPfSE","FjHXRdjsrv","VLTy65Drn0","fqypyRmDcr","he9IAAmdQd","ru4UGd85a9","G1RhSGv3Fq","uupzktaOXK","ciuWzv1Hln","yEfy95Namm",
+"ogLgcVprf2","XflUqVLTy6","fLNg80Kyfs","OUYuF5iGN5","tAOsrtlILt","8U2nUFwEJz","fFDrJPb1pa","P6bcgjS1aj","m4bxUni2v1","a00b5HfyNQ",
+"UlU3Mv8yFN","pWiOsvOqCE","yvOMIQ6Lix","fmIK1a00b5","EdBKcfaHir","bZLvStlILt","sqVrfAgJHQ","F6PT2nFqik","Oz8yZ3otm6","pAhR1i7WMQ",
+"ix74rdhSuH","mz8gxqUJMd","cL0aEix74r","MaJQsciuWz","Pb1pazqH0W","lH1kt8cVD3","RpBQmYjB9t","DQimpQYxC0","dpe1vzFgtB","nlaByQnJ1S",
+"7X3uy64s8N","zbIYYxciqp","ReKEWKr8ys","uPX7GtjQxs","Nxx9VsqVrf","gdQsSLDk6f","48cHLFjHXR","0PktIQClRL","DcpWB7hyVv","lXFOBCIShG",
+"dpe1vJJs5m","fcJOycL0aE","VLTy6QssNC","djsrv7hyVv","1v5hHpv0i7","Nxx9V7hyVv","d85a9lj07Q","IRh48580YD","BCxeCRmDcr","FLsph2DREs",
+"W3VFHwiHrZ","LewvMsuY4x","jfREuyToGW","NhXdu5IhmG","W7cTsRzaZA","xXTI47lUXZ","ZhwG1Q6Lix","Yw2oUfLNg8","ThjNn2ZHdk","QworufFDrJ",
+"xciqpsuY4x","fcwDadmoS7","ZhwG1VjCZq","1LB1Lmz8gx","hYBCK7ku1p","AkKTk0BmCy","1v5hHRxrsm","suY4xuAWyp","5IhmGRsQUq","EoToPZhwG1",
+"ZJTXHaFFss","16lHchUTw7","7fKYUGrDg7","JXljWlsQGo","WreyPtl72W","Q6LixsuY4x","5VZjScL0aE","MGlTFSmGzv","BbwgAQYxC0","CNHmvulk41",
+"dpe1vThjNn","W3VFHfmIK1","55rfBqUJMd","8hJdttuDyS","MGlTFiB08l","7lUXZEdBKc","RpBQmZJTXH","W3VFHfFDrJ","jiVBPfLNg8","8TxD7n1pmO",
+"7fKYUb29RJ","7fsYMZhwG1","W7cTsgdQsS","16lHcn1pmO","o8UydJRJQB","ReKEWRBhp0","C2IrckB5nP","i3pyda00b5","CIShGqQxHP","Fhtgln8pJ9",
+"vkCHHdjsrv","tlILtzHF1q","lH1ktKZamH","JRJQBb29RJ","FLsph7fsYM","VjCZqU3yw5","lpF6W8cVD3","RzaZAQworu","QYxC08U2nU","7fsYMO3iyQ",
+"vOqCENAFuw","SjskQgf8rI","IKxdLSmGzv","FFDuifqypy","qaofNjiVBP","9XyT95nmWv","RACujXyPZN","5iGN5NhXdu","HP433hSSvQ","lH1ktrKDLJ",
+"iKqhrB3qem","blLA9zz4ZU","blLA9oGu6x","ksJbyuLtKs","7ku1pjSjS3","jfREuHP433","VjCZqS2Dfu","7fKYU3weIF","WDVWJjzUqR","fqypy7fKYU",
+"2NslmSs0Zu","ni2v1lViBv","WDVWJX6Pin","aL6AJDQimp","nlaBy0MR5X","StlDJ7Ow5C","iwzGkFxX9q","RkQkelkMUA","FwEJzUlU3M","OUYuFFFDui",
+"s4786O3iyQ","FxX9qLDk6f","gf8rIi7WMQ","uAWypcShY2","oQ87rQ6hMC","JKWYRHRxd8","pFrrlHzZT8","pvgjSqUJMd","ksJby8RCUA","zHF1qQssNC",
+"J2mQiRzaZA","zY1GY14FLR","QssNCru4UG","S2Dfu2TRI7","C2Irc8TxD7","VerEAtuDyS","5Namma00b5","ksJbyjtn0X","vLsmSnlaBy","t59lR7fsYM",
+"bZLvS0Kyfs","Cfgr32DREs","UlU3MWaWsv","9GXkXuN6r3","Ss0Zuuupzk","UlU3MB3qem","tjQxshUTw7","VIlwP9iGoT","tuDyScQOnv","aDGtSpvgjS",
+"lkMUA7lUXZ","pvgjSFFDui","SjskQIjTwP","AXpwE45cIH","PYBf4Chuy3","QnJ1SI7p2a","55rfBnFqik","Mm8sibrhlQ","uAWypJJs5m","he9IArz7Ut",
+"YjB9tWDVWJ","djsrvn8pJ9","SjskQzbIYY","AIYUutjQxs","S2Dfuh1zcH","5Drn0brhlQ","e6e4zStlDJ","HRxd8F6PT2","HfyNQ6AFT0","U3yw5brhlQ",
+"uTacxJRJQB","EOE1oW3VFH","yToGWMkgy8","FNYIMsx5Gl","Pb1paJJs5m","BbwgAzY1GY","o8UydJIqXi","faHirCxVEf","cmXIXThjNn","WDVWJQChxs",
+"gtCA5uvf7A","0MR5XDQimp","lH1ktlCMxy","k85AekZANm","7hyVv5Drn0","XyPZNSjskQ","SjskQQClRL","QworunFqik","oQ87rXflUq","NOHszRpBQm",
+"okgRiBGaQY","uLtKszz4ZU","jiVBPKr8ys","tjQxszqH0W","P6bcg0ao3l","CqqaD0MR5X","dhSuHokgRi","prNT6uupzk","VerEAlXFOB","fFDrJEdBKc",
+"2DREsW7cTs","WPmlxo8Uyd","VerEAGXdoH","vOqCE9iGoT","uZPqgWPmlx","cShY2atef2","suY4xNOHsz","iB08lRBhp0","JJs5mKZamH","F6PT2VIlwP",
+"pmeCdnlaBy","GrDg7BpYhV","tjQxs8xEKz","WDVWJKr8ys","AkKTkK4GS8","BCxeCWaim6","brhlQrz7Ut","8U2nUTXQ0Z","G1RhSeuZA5","jSjS3FcWrW",
+"zqH0W2Yz7E","hYBCK45cIH","Gv3FqFnPFB","KZamHOHaBz","HRxd8pFrrl","fmIK1Kr8ys","FjHXR9eoRc","0BmCydjsrv","DG4sThi5X7","JKWYRJJs5m",
+"55rfBfcwDa","Gv3FqGWqqX","tlILtnFqik","ZhwG1CK5W7","iwzGkni2v1","AIYUuIRh48","v1Hlnjtn0X","lm0pDB3qem","oGu6x24ARF","8hJdts93Ml",
+"yToGWuTacx","JJs5mWmadA","uAWypMaJQs","7ku1pBpYhV","Q6hMCNcICA","Z4I1vCK5W7","atef25VZjS","JXljW5drc6","SWfouDz1R3","lH1ktyluBx",
+"YOfrY0YAGH","fcwDaFwEJz","MaJQs7ku1p","24ARFb29RJ","VerEARsQUq","lpF6WLewvM","580YDWreyP","uLtKsjiVBP","gtCA507n1c","nnP8ovLsmS",
+"U3yw57ku1p","Gv3FqNxx9V","0Wr5yCIShG","aFFssJIqXi","U3yw5VBjhz","ciuWzy94nw","ulk41rz7Ut","YjB9togLgc","OUYuFXflUq","QChxsWaim6",
+"No0Qbe6e4z","EoToPFPfSE","djsrvRsQUq","mz8gxWDVWJ","tvdkDCNHmv","VNCPdGv3Fq","J2mQi5VZjS","tlILtHP433","2ZHdk0MR5X","atef2No0Qb",
+"ThjNnFjHXR","F6PT2iwzGk","29QAzW7cTs","Yw2oU5ZaEz","uupzk7Ow5C","QWxoTYw2oU","NcICAt98iW","cQOnvyluBx","Q6LixMGlTF","TXQ0ZfcwDa",
+"IBe8kWDVWJ","NOHszJ2mQi","SbRYyru4UG","14FLRO3iyQ","1LB1Lxciqp","1j5L8wDajX","lpF6WWreyP","qQxHPMK07Y","jS1ajqQxHP","zz4ZUfFDrJ",
+"gdQsS618Di","uLtKsU3yw5","s93MlpmeCd","JXljWazIWp","W7cTszqH0W","NhXduNxx9V","JXljW5iGN5","AkKTkUvlv4","CK5W7gjUTu","L7cGct59lR",
+"KsjRKlH1kt","zqH0WNo0Qb","XyPZNxXTI4","FVMxo8FmFH","MGlTFcL0aE","hi5X77fKYU","lm0pDzbIYY","8TxD73weIF","RzaZAFcWrW","1LB1LD6rBy",
+"Yf2Ecdjsrv","CIShGlpF6W","iB08lVprf2","POUYSAIYUu","EdBKcEOE1o","pAhR1FPfSE","cL0aEdjsrv","IBe8kFnPFB","L7cGc16lHc","Uvlv4Cfgr3",
+"ZUnqtPYBf4","faHirWDVWJ","5drc6LbRTH","AkKTkRxrsm","dQ586HzZT8","D6rBytAOsr","uTacxi7WMQ","faHirMm8si","JRJQBKsjRK","9y4lwv8yFN",
+"7fsYMZuDtD","faHirGXdoH","k85AeNxx9V","uAWypRpBQm","5Drn0o8Uyd","Yw2oUIn3NS","CdyBVcL0aE","kZANmlCMxy","9rlg9vLsmS","rhl0JBpYhV",
+"J2mQizQt6Q","TCgPp3weIF","nlaByPb1pa","MmKGJ2hEEU","YOfrYTXQ0Z","okgRitAOsr","YOfrYEoToP","5ZaEzD6rBy","AOgEe0MR5X","CxVEfNxx9V",
+"0KyfsJRJQB","lj07QJKWYR","DQimp7ku1p","U3yw5BFkb8","uAWyp24ARF","GXdoHCK5W7","QworulXFOB","uTacxgIYvE","2TRI7iqv4k","JJs5mWaWsv",
+"Yf2EcuLtKs","dmoS7JJs5m","0MR5XChuy3","XyPZNRzaZA","uZPqgcQOnv","ZUnqtQYxC0","Q6hMCWDVWJ","L7cGczFgtB","faHircQOnv","SjskQfaHir",
+"WreyPuoStw","W7cTsfFDrJ","0BmCy64s8N","PYBf4uTacx","0MR5XAXpwE","fcwDaKASQ8","suY4x5nmWv","JkzUn5ZaEz","JkzUnKsjRK","ni2v1580YD",
+"tlILtuLtKs","gf8rIuAWyp","uN6r33otm6","tlILt1j5L8","LbRTHeuZA5","nFqikjtn0X","EOE1ozY1GY","WreyPYf2Ec","kB5nPGrDg7","tl72WOxWIH",
+"0KyfsGv3Fq","5Drn0IKxdL","tAOsrjiVBP","FPfSECIShG","uTacxhi5X7","faHirYOfrY","LbRTHdpe1v","OHaBzrz7Ut","No0QbyEfy9","DG4sThe9IA",
+"W3VFHtaOXK","9iGoThE1Ql","gdQsSHP433","J2mQifFDrJ","FGzgpe6e4z","NAFuwe6e4z","QYxC0djsrv","9iGoTC2Irc","Y1mC0b29RJ","CK5W7WDVWJ",
+"h1zcHbZLvS","hSSvQMK07Y","hE1QlKZamH","tAOsrQWxoT","AgJHQCK5W7","uPX7GF6PT2","QbxXcS77LH","LewvMmX2GE","Z4I1vhSSvQ","aL6AJgdQsS",
+"oQ87ra00b5","7lUXZni2v1","YOfrYNOHsz","qUJMdJXljW","brhlQOz8yZ","pv0i7dQ586","0h1b1tl72W","0Wr5yFcWrW","lm0pDEoToP","AkKTkv8yFN",
+"RkQkeOHaBz","5ZaEzRBhp0","m4bxUNAFuw","VNCPdMmsIo","JRJQBzFgtB","WreyP4dEz6","VIlwPFhtgl","CIShGfFDrJ","FPfSEqUJMd","48cHLPb1pa",
+"suY4x9GXkX","ECMvUWaim6","VBjhzmz8gx","jtn0XChuy3","0Wr5yQClRL","FVMxotaOXK","6q6L9VLTy6","uvf7Ahe9IA","zmLYDNxx9V","hSSvQHzZT8",
+"HfyNQMm8si","2ZHdkDz1R3","7fsYMWDVWJ","tAOsrpT8wu","o8UydJKWYR","FcWrWJ2mQi","tl72WRsQUq","lViBvMmKGJ","8hJdt0BmCy","8U2nUX6Pin",
+"zbIYYTCgPp","B3qemY1mC0","HzZT8G1RhS","VIlwP8cVD3","5NammpFrrl","QChxsWaWsv","ZzJHWWmadA","5Mg9rciuWz","ZJTXHd7vjM","aFFssjfREu",
+"LDk6f8xEKz","5Drn0pWiOs","7lUXZMmsIo","v1HlnSjskQ","RkQkeprNT6","Cp3mZwiHrZ","hUTw7RzaZA","Ul4a10MR5X","O3iyQOz8yZ","gjUTuLewvM",
+"s93MlOUYuF","lsQGoWaim6","tl72WguMb8","QssNCnFqik","WreyPsx5Gl","ECMvU4W0Tl","DQimpIKxdL","B3qembgJAz","zHF1qydG8U","WMiS3gtCA5",
+"QnJ1SjeskS","cL0aEVLTy6","lCMxyG1RhS","GrDg7NcICA","NcICAEoToP","zz4ZUuAWyp","rKDLJO3iyQ","7Ow5Cpv0i7","xReeccmXIX","gtCA5L7cGc",
+"Oz8yZ0ao3l","vkCHHtlILt","9eoRciB08l","lH1kt45cIH","a00b57X3uy","qaofNUmaEv","0ao3luAWyp","LbRTHzFgtB","Gv3FqydG8U","ZJTXHpv0i7",
+"OUqFM8TxD7","TwanoBCxeC","uAWypzFgtB","QClRLyofH3","7hyVvn1pmO","kB5nPyToGW","24ARFzmLYD","y94nwoVQp6","QssNCtuDyS","aez9yRBhp0",
+"uAWyp0h1b1","jSjS3ZuDtD","QWxoT8U2nU","hE1Ql2DREs","WMiS3zqH0W","hi5X7jiVBP","AIYUuChuy3","zY1GYOHaBz","aDGtSVjCZq","gdQsSVerEA",
+"Yh1hFhE1Ql","XyPZNWPmlx","W7cTsprNT6","RxrsmX6Pin","pFrrlUmaEv","HfyNQ9XyT9","X6PinGrDg7","v2eC3oQ87r","DLhzMogLgc","uoStwWaim6",
+"uAWypi3pyd","9rlg9DLhzM","29QAz5VZjS","AkKTkrhl0J","okgRiVBjhz","16lHcDcpWB","S2Dfum4bxU","jzUqRGv3Fq","i7WMQ9XyT9","WDVWJLewvM",
+"5drc6k85Ae","Uvlv4vkCHH","B3qemUmaEv","FwEJz7ku1p","RmDcrhE1Ql","kZANmv2eC3","MojnP0PktI","2hEEUuPX7G","aFFssoQ87r","StlDJMaJQs",
+"9rlg9zqH0W","iB08lru4UG","9iGoTI7p2a","n8pJ9cQOnv","JIqXiIjTwP","6q6L9VBjhz","0h1b1m4bxU","HlUbFaL6AJ","0YAGHCNHmv","nFqikMkgy8",
+"Y1mC0zY1GY","QnJ1S7Ow5C","yvOMI29QAz","bgJAzRACuj","pvgjSy94nw","rKDLJQ6hMC","0h1b1MojnP","5ZaEzHfyNQ","4dEz6Y1mC0","v8yFN9GXkX",
+"DcpWBbrhlQ","HfyNQazIWp","LewvMtvdkD","he9IAS2Dfu","suY4xFwEJz","ThjNnpv0i7","sqVrfVNCPd","StlDJEoToP","lViBvfFDrJ","6AFT0RkQke",
+"0MR5X1LB1L","pvgjSMK07Y","O3iyQAkKTk","aDGtSgjUTu","WPmlxguMb8","yToGWiwzGk","D6rByCp3mZ","v8yFNkB5nP","Rxrsm2DREs","uvf7ATCgPp",
+"b29RJFLsph","HlUbFuTacx","s7MxknlaBy","i7WMQZv7z0","S2Dfu7ku1p","2hEEUbgJAz","0PktIFPfSE","WmadAQClRL","y94nwCdyBV","n8pJ94W0Tl",
+"GXdoH8FmFH","Q6hMCe6e4z","lXFOBd85a9","TCgPpGXdoH","RzaZA8hJdt","OUYuFs93Ml","O3iyQnlaBy","nFqik5iGN5","uAWypkZANm","FLsphS2Dfu",
+"h1zcHwDajX","BbwgA4dEz6","hE1QlIBe8k","uupzk8RCUA","BbwgAJkzUn","Z4I1v8U2nU","bgJAzrz7Ut","fcJOyhYBCK","atef2vOqCE","hSSvQnnP8o",
+"POUYSl83Ud","OxWIHFcWrW","RkQkeP6bcg","8cVD3FnPFB","xciqpUvlv4","iB08lv1Hln","16lHc7fKYU","y94nw07n1c","pv0i716lHc","LDk6fKZamH",
+"mX2GEbrhlQ","29QAzG1RhS","8hJdt0YAGH","SjskQ2Nslm","JJs5muAWyp","NhXduHfyNQ","7ku1p9y4lw","LDk6fZhwG1","Ta8f66AFT0","Mm8siogLgc",
+"7Ow5CFcWrW","MezSWRACuj","K20wK5ZaEz","yluBxHzZT8","GSQwjyToGW","RpBQm2Nslm","Ta8f6WPmlx","QChxsfaHir","QnJ1ShUTw7","55rfB14FLR",
+"RACujydG8U","QworuRACuj","hi5X7MmsIo","lj07QcQOnv","UlU3MWmadA","HP433Rxrsm","G1RhSzz4ZU","7Ow5CLbRTH","NOHsz5Mg9r","kB5nPsx5Gl",
+"LewvMqUJMd","ru4UGs4786","1j5L8zHF1q","o8Uyd3otm6","ZzJHWJRJQB","XflUqStlDJ","dmoS77hyVv","ix74rlViBv","xciqpJRJQB","NOHszYf2Ec",
+"pT8wu7fKYU","iqv4ka00b5","8U2nUG1RhS","8hJdtYOfrY","pmeCdQYxC0","LbRTHWmadA","jzUqRrKDLJ","SbRYyFFDui","BpYhVECMvU","Yf2EcDLhzM",
+"5ZaEz6q6L9","K4GS8FGzgp","M6qcGru4UG","uoStwUvlv4","oGu6xMojnP","BCxeCXyPZN","uJScXlweGy","OUqFMQWxoT","VjCZqfaHir","9eoRcpv0i7",
+"QbxXcdhSuH","RACujThjNn","qaofNCdyBV","CK5W7MaJQs","gf8rIlkMUA","7lUXZECMvU","soy9tAgJHQ","Vprf2SbRYy","atef2FFDui","AIYUurKDLJ",
+"EOE1onFqik","IjTwP5iGN5","hUTw7NAFuw","d7vjMMmsIo","yvOMIkB5nP","bgJAzEdBKc","ogLgc2DREs","pmeCdK4GS8","YOfrY5Namm","lH1ktdpe1v",
+"zbIYYU3yw5","euZA5aez9y","dmoS7HfyNQ","MaJQsM6qcG","KZamHd7vjM","djsrvsoy9t","MK07YAXpwE","OxWIHRACuj","xciqpZ4I1v","SWfou5ZaEz",
+"GWqqXpAhR1","Ul4a1GXdoH","gf8rIuupzk","8cVD3LewvM","GrDg7EoToP","8xEKzfmIK1","07n1csx5Gl","8hJdt3otm6","8U2nUJ2mQi","GrDg7K20wK",
+"SjskQv1Hln","lCMxymX2GE","BCxeCtaOXK","Rxrsm0Wr5y","ZzJHWtuDyS","Dz1R3Y1mC0","ulk41Nxx9V","dmoS7JRJQB","pWiOsy94nw","lweGyUvlv4",
+"QnJ1SIn3NS","ReKEWXyPZN","ReKEWd7vjM","6AFT0DQimp","lj07QlXFOB","prNT6F6PT2","9eoRcYw2oU","618DiS77LH","AmdQdjeskS","jfREut98iW",
+"OUYuFYf2Ec","MezSWKr8ys","oQ87r45cIH","K4GS8ksJby","SbRYylCMxy","GXdoHIRh48","oQ87rBGaQY","0MR5XNOHsz","F6PT24W0Tl","ru4UGZUnqt",
+"Nxx9VuLtKs","OHaBzvkCHH","U3yw5HzZT8","UlU3MciuWz","gIYvEFxX9q","DQimpyluBx","ZhwG1G1RhS","0KyfsQworu","DcpWBKZamH","zQt6QBCxeC",
+"FnPFBC2Irc","YOfrYGSQwj","xciqphUTw7","gdQsSP6bcg","YOfrYydG8U","sqVrfn1pmO","gtCA5rhl0J","S2DfuuZPqg","6q6L9ru4UG","UmaEv0MR5X",
+"BpYhVG1RhS","dpe1vgIYvE","tAOsrMmsIo","7ku1pYf2Ec","s93MliwzGk","5Drn0AgJHQ","FnPFB8U2nU","0h1b1oGu6x","lH1ktksJby","n1pmOQYxC0",
+"HlUbFQbxXc","9rlg9HzZT8","8TxD7iKqhr","ciuWz1LB1L","ZuDtDZJTXH","In3NSLbRTH","SmGzvAXpwE","6q6L9pFrrl","4dEz6uZPqg","FGzgp3weIF",
+"Waim6HlUbF","dpe1vCNHmv","Z4I1vdhSuH","ciuWzHzZT8","XyPZNjzUqR","n8pJ9ciuWz","RxrsmuPX7G","JXljWsuY4x","1LB1LKsjRK","9rlg9QChxs",
+"mX2GEOHaBz","JkzUnMGlTF","bZLvSbZLvS","e6e4zfcwDa","QbxXcW3VFH","jS1ajZJTXH","o8UydHlUbF","KZamHpFrrl","7lUXZRmDcr","s4786atef2",
+"xReecqQxHP","fmIK12Nslm","i3pydjzUqR","gdQsS0Kyfs","No0Qbb29RJ","oGu6xSWfou","TwanoprNT6","okgRiPYBf4","uZPqggf8rI","guMb8d85a9",
+"2hEEUOxWIH","bZLvSlpF6W","aez9yFhtgl","uTacx5IhmG","dpe1v8FmFH","v8yFNUmaEv","fmIK1JJs5m","Zv7z0jzUqR","vOqCEy94nw","gdQsSvkCHH",
+"a00b52TRI7","lj07QuQIcz","QbxXc580YD","faHirRkQke","EOE1o5VZjS","Pb1pahSSvQ","9y4lw64s8N","Q6hMCcQOnv","618DihUTw7","9y4lw2ZHdk",
+"FjHXRRzaZA","ZuDtDQworu","KZamH7ku1p","i3pydhE1Ql","SjskQEOE1o","BbwgAMm8si","gjUTuhSSvQ","ZJTXHFxX9q","Q6LixPb1pa","WaWsvW7cTs",
+"FcWrWAIYUu","blLA9MmKGJ","POUYSRkQke","07n1cSmGzv","9XyT97fKYU","POUYStaOXK","1j5L8QClRL","v1Hlns4786","aFFssYOfrY","WreyPsuY4x",
+"RsQUq0MR5X","GrDg7okgRi","tjQxsLbRTH","soy9tSjskQ","FNYIMOUqFM","7Ow5CO3iyQ","h1zcHlsQGo","W7cTszFgtB","Gv3FqwiHrZ","VNCPds93Ml",
+"s7Mxk7ku1p","GXdoHC2Irc","2DREsfmIK1","JIqXiFwEJz","jzUqR5Mg9r","fcwDaWreyP","L7cGc0h1b1","iwzGkzz4ZU","16lHcKsjRK","qUJMdqUJMd",
+"CK5W7yvOMI","2NslmsuY4x","TXQ0ZpiJSk","BpYhVuTacx","bZLvSZJTXH","lpF6WVIlwP","lweGyuTacx","ZuDtD0Wr5y","TXQ0Z9y4lw","5Mg9rYOfrY",
+"l83UdtvdkD","KZamHVNCPd","s4786MGlTF","pvgjSPOUYS","9iGoTaez9y","45cIHgdQsS","RzaZAazIWp","vkCHHhi5X7","7hyVv9y4lw","ksJbyZJTXH",
+"Yf2Ec1LB1L","WreyPnlaBy","Yh1hFYf2Ec","djsrviB08l","2Yz7EM3zXL","azIWpBFkb8","Fhtgl2ZHdk","m4bxUQssNC","pv0i7HlUbF","5Mg9rVIlwP",
+"qaofNJXljW","x3LDerz7Ut","WmadAHlUbF","uvf7ACK5W7","DLhzMHRxd8","bgJAzLDk6f","5NammTwano","8cVD3HlUbF","pAhR1VNCPd","uJScX1j5L8",
+"cShY2xciqp","2NslmJ2mQi","9XyT90BmCy","5Mg9r0MR5X","5drc6WaWsv","suY4xqUJMd","Mm8sirz7Ut","BbwgARsQUq","fmIK1HzZT8","VBjhzpv0i7",
+"JXljWIn3NS","dhSuHatef2","ReKEWDLhzM","MojnPRxrsm","9XyT9JJs5m","C2IrcLDk6f","atef2W3VFH","JRJQBFcWrW","uupzkFPfSE","9GXkXCp3mZ",
+"QChxsI7p2a","dQ5862DREs","4QMc9M3zXL","J2mQiHlUbF","yvOMIHlUbF","5nmWvVprf2","qaofNfaHir","MmsIocShY2","nlaByKASQ8","Zv7z0J2mQi",
+"hE1Ql8hJdt","7Ow5C8cVD3","JKWYR5ZaEz","yToGWFVMxo","s93MlZhwG1","VIlwPiKqhr","d7vjMrKDLJ","s93MlBbwgA","piJSkdQ586","55rfBZhwG1",
+"ulk41gjUTu","QClRLFhtgl","TXQ0Z2Yz7E","0MR5XMGlTF","Y1mC0hE1Ql","vLsmSIRh48","aL6AJiwzGk","jtn0XvLsmS","tl72W1v5hH","dhSuHNcICA",
+"OUYuFCNHmv","Y1mC0qaofN","4dEz6S2Dfu","hE1QlP6bcg","45cIHaDGtS","MmKGJMK07Y","mz8gxAkKTk","Y1mC0xciqp","4dEz6AOgEe","CqqaDECMvU",
+"45cIHZuDtD","Fhtgl5IhmG","suY4xJIqXi","piJSkyToGW","0PktIKASQ8","CIShGWreyP","TCgPp0ao3l","fFDrJF6PT2","RBhp0FPfSE","S77LHs4786",
+"lj07QMojnP","8hJdtEdBKc","QYxC0JJs5m","VNCPdCNHmv","HzZT8DLhzM","ECMvUtlILt","5ZaEzxReec","QssNCtjQxs","hYBCKzQt6Q","DcpWBWPmlx",
+"lH1kt5ZaEz","b29RJhUTw7","sx5Gl2Nslm","BbwgAqaofN","0BmCyReKEW","tvdkDmX2GE","FxX9qVLTy6","DcpWB4dEz6","FxX9qFcWrW","8FmFHbZLvS",
+"JRJQBQssNC","oVQp6HlUbF","4W0Tl16lHc","5drc6zHF1q","TwanozbIYY","3weIFfcJOy","Qworu2DREs","wDajXMkgy8","WPmlxHzZT8","AgJHQDcpWB",
+"DLhzMo8Uyd","C2Irc5VZjS","5IhmGCxVEf","5drc6SbRYy","7hyVvVprf2","ZzJHWqaofN","tl72Wm4bxU","29QAzVjCZq","2TRI7pmeCd","guMb8FVMxo",
+"8xEKzSWfou","zmLYDMK07Y","PYBf4dpe1v","zmLYDSmGzv","Vprf2e6e4z","MmKGJtaOXK","he9IANOHsz","VNCPdqaofN","GWqqXSmGzv","RkQkeFFDui",
+"xReecHfyNQ","Yh1hFHP433","uoStwEoToP","a00b5mz8gx","J2mQiMmsIo","JIqXifmIK1","BGaQYlCMxy","9y4lwK20wK","CIShG8RCUA","yToGW16lHc",
+"azIWpOxWIH","8TxD7618Di","fLNg8lCMxy","Gv3FqSjskQ","uupzktuDyS","ru4UGAmdQd","OxWIH6AFT0","HRxd8No0Qb","7hyVvlViBv","OUqFMVerEA",
+"RpBQm4W0Tl","tvdkDW3VFH","ZuDtDAOgEe","TXQ0ZBFkb8","wiHrZ8xEKz","5NammyluBx","NcICAMm8si","ThjNnJ2mQi","CK5W7t98iW","2hEEUiB08l",
+"AXpwE4QMc9","pv0i7iqv4k","JJs5mYjB9t","fmIK1KZamH","K4GS8k85Ae","cL0aEF6PT2","vLsmSRkQke","MezSW2ZHdk","RmDcrgtCA5","CK5W79eoRc",
+"BpYhVmX2GE","HlUbFcShY2","atef20Wr5y","cmXIXuAWyp","yofH3XflUq","KsjRK5iGN5","5ZaEzjfREu","RkQkeHlUbF","WMiS3Mm8si","UlU3Mh1zcH",
+"QYxC0v1Hln","FxX9qM6qcG","8hJdtjeskS","5NammTa8f6","FjHXRNOHsz","5Mg9rBbwgA","TwanosuY4x","ThjNnni2v1","ZhwG1gf8rI","iKqhrydG8U",
+"m4bxUHP433","ZuDtDlweGy","zmLYDlweGy","580YD24ARF","NcICAcL0aE","RACujogLgc","7fKYUzz4ZU","0MR5XuQIcz","ksJbyI7p2a","pv0i7FNYIM",
+"24ARFciuWz","ThjNnC2Irc","piJSkn1pmO","uN6r37lUXZ","EOE1oFGzgp","Kr8ysgf8rI","oGu6xLewvM","v2eC35VZjS","lweGyDG4sT","7ku1pIn3NS",
+"MK07Ysoy9t","G1RhSatef2","nlaByoVQp6","Nxx9VQChxs","HlUbFyvOMI","9XyT9uZPqg","zz4ZUzqH0W","tl72WpFrrl","ThjNnh1zcH","FLsphdQ586",
+"hYBCKTCgPp","ru4UGSWfou","CdyBVAkKTk","7fsYMk85Ae","OxWIHv1Hln","7lUXZSWfou","ECMvUQChxs","ru4UGJJs5m","Y1mC0gtCA5","NAFuwD6rBy",
+"aFFssksJby","2DREsEOE1o","VjCZqy94nw","Mm8siix74r","Kr8ysfLNg8","rKDLJC2Irc","fqypyQ6hMC","W7cTsAXpwE","Oz8yZuLtKs","IjTwPBFkb8",
+"UmaEvix74r","0Wr5ymz8gx","cShY2X6Pin","uTacxIn3NS","7ku1p55rfB","VLTy60PktI","K20wKXyPZN","8cVD3hE1Ql","M3zXLa00b5","pFrrlKASQ8",
+"No0QbVprf2","uLtKs7ku1p","tlILt2TRI7","hi5X7mz8gx","yEfy9SWfou","uoStw48cHL","4W0Tl5nmWv","16lHc0YAGH","9rlg9vkCHH","ni2v1NcICA",
+"8FmFHQnJ1S","0Wr5yRsQUq","CIShGyofH3","8hJdtVIlwP","gf8rI4W0Tl","S77LHQ6hMC","DQimpZzJHW","FPfSE9GXkX","FxX9qJRJQB","BFkb80MR5X",
+"pmeCdBbwgA","9GXkXFLsph","qaofN0BmCy","jeskSCK5W7","IjTwPW3VFH","0h1b1VIlwP","tlILtGv3Fq","wiHrZCp3mZ","lH1ktPb1pa","ogLgcVNCPd",
+"NcICACNHmv","okgRiuZPqg","hYBCKpAhR1","7fsYMJIqXi","Yh1hF580YD","7fsYMgf8rI","2DREsdQ586","MmsIoEOE1o","B3qem2DREs","07n1cEdBKc",
+"i3pydMmKGJ","7fKYU9iGoT","NAFuwtl72W","XyPZNi7WMQ","xXTI4s7Mxk","Zv7z0t59lR","MaJQsOHaBz","YOfrY0Wr5y","ulk41DQimp","Q6Lix2hEEU",
+"WMiS3sx5Gl","FjHXRMGlTF","hUTw7zmLYD","sx5Gl0h1b1","OxWIHaDGtS","tjQxsi7WMQ","hYBCKAgJHQ","azIWp7X3uy","580YDYjB9t","M3zXLMGlTF",
+"5ZaEzix74r","StlDJv1Hln","fFDrJTCgPp","uQIczMaJQs","IRh48L7cGc","48cHLBFkb8","v2eC3RsQUq","JRJQBv8yFN","AmdQdIBe8k","djsrvWPmlx",
+"yvOMIrKDLJ","G1RhScQOnv","RACujhSSvQ","yluBxYOfrY","taOXKThjNn","rhl0JaFFss","618DiFxX9q","Ss0ZuStlDJ","CK5W7GXdoH","5drc6yluBx",
+"zFgtBIn3NS","JKWYRuLtKs","VLTy6UlU3M","CNHmvuupzk","QbxXcvOqCE","fqypyYOfrY","0MR5X2ZHdk","JkzUnQ6hMC","a00b5O3iyQ","CxVEf7ku1p",
+"okgRiTXQ0Z","GXdoHQ6hMC","FPfSENOHsz","Kr8yslCMxy","5ZaEzcShY2","8TxD7FcWrW","RxrsmQssNC","S2Dfu5drc6","t98iWfcwDa","FhtglJXljW",
+"P6bcgZuDtD","JIqXiJXljW","fcJOyJXljW","nlaBy3otm6","8TxD7suY4x","DcpWBydG8U","WaWsvb29RJ","OHaBzJJs5m","fFDrJfFDrJ","zQt6Q9rlg9",
+"ni2v1aez9y","RBhp029QAz","NcICARBhp0","Z4I1vuAWyp","SmGzvuN6r3","FcWrWd85a9","Cfgr3taOXK","QClRLa00b5","jzUqRIRh48","8cVD3MezSW",
+"n1pmOb29RJ","580YDFwEJz","jS1ajAgJHQ","2Nslm9rlg9","fcJOyzbIYY","yluBx9eoRc","8U2nUzFgtB","VBjhzMezSW","rKDLJIn3NS","guMb8oGu6x",
+"CIShGYOfrY","zQt6Qhe9IA","MojnPn8pJ9","fcwDaFxX9q","lViBvBbwgA","MmKGJyvOMI","blLA94W0Tl","NOHszpv0i7","0Wr5yX6Pin","h1zcHtl72W",
+"rz7UtfaHir","bZLvStAOsr","suY4x8cVD3","Q6hMClXFOB","atef2Ul4a1","tAOsrsqVrf","v2eC35Namm","7hyVvxXTI4","2DREsru4UG","VBjhz29QAz",
+"5Drn0BCxeC","xReec8hJdt","yofH3xReec","y94nwqUJMd","mX2GEFnPFB","WPmlxv8yFN","zQt6QrKDLJ","ThjNnQ6Lix","FNYIMZUnqt","pFrrl55rfB",
+"Yh1hFVprf2","aL6AJVjCZq","D6rByIRh48","FFDuifmIK1","BbwgAFPfSE","tAOsrd7vjM","9XyT9QbxXc","5ZaEzuJScX","CNHmvXyPZN","EOE1ocShY2",
+"dmoS7s7Mxk","AOgEeY1mC0","s7Mxk4W0Tl","Waim6soy9t","0Wr5yBFkb8","QbxXcPYBf4","cShY2M3zXL","SWfouSs0Zu","s7MxkBpYhV","WPmlxnlaBy",
+"JkzUnVBjhz","vLsmSSWfou","OUqFMNcICA","VerEAguMb8","5iGN5DLhzM","v8yFNZzJHW","JRJQB1j5L8","jfREuiqv4k","W3VFHjiVBP","9iGoTnFqik",
+"fcwDaAgJHQ","fcwDaK4GS8","WmadACxVEf","BCxeCAmdQd","ciuWzVBjhz","l83Uds4786","aL6AJ45cIH","9eoRc2hEEU","aez9y29QAz","GSQwjydG8U",
+"iB08l4dEz6","dpe1vJRJQB","HfyNQlsQGo","C2Ircrz7Ut","oVQp6azIWp","CNHmv64s8N","oQ87rNcICA","7fKYUyofH3","jS1ajnlaBy","QworuG1RhS",
+"AOgEeiB08l","MaJQs1v5hH","9XyT9rhl0J","brhlQ2Nslm","vkCHHqUJMd","sx5GlwiHrZ","ogLgcvOqCE","piJSkfmIK1","ZhwG1yvOMI","VNCPdHRxd8",
+"55rfBD6rBy","HzZT8Vprf2","jfREuNhXdu","zFgtBAIYUu","MezSWO3iyQ","HP433FVMxo","GWqqXtvdkD","brhlQMojnP","hYBCKpT8wu","MojnPhE1Ql",
+"7ku1pprNT6","jS1aj6q6L9","IjTwPGXdoH","Pb1pa8FmFH","WaWsv8U2nU","PYBf4FnPFB","5Drn0DQimp","KASQ8BCxeC","ru4UGFcWrW","8TxD7tl72W",
+"QworuIRh48","0KyfsWDVWJ","ZJTXHhi5X7","yvOMIfcJOy","d7vjMfLNg8","Gv3FqpAhR1","WMiS3hE1Ql","IBe8kyEfy9","atef2jS1aj","24ARFHlUbF",
+"JXljWpiJSk","aDGtS8U2nU","1j5L8lXFOB","VLTy6rKDLJ","NhXduZzJHW","WreyPRmDcr","0Wr5yStlDJ","brhlQgf8rI","BFkb8aL6AJ","HRxd8l83Ud",
+"fqypyWaim6","WaWsvuoStw","qQxHPWPmlx","RBhp0WDVWJ","uPX7GPOUYS","mz8gxZ4I1v","fmIK1JXljW","1j5L8HP433","pvgjSxXTI4","fcwDa9GXkX",
+"2DREsh1zcH","xReecbZLvS","XyPZNEoToP","HRxd8FNYIM","MojnPtjQxs","J2mQiO3iyQ","FcWrWdhSuH","oVQp6uoStw","FNYIMCK5W7","29QAz0Wr5y",
+"2hEEUrhl0J","HfyNQqaofN","n1pmOuQIcz","TXQ0ZblLA9","tl72WuZPqg","oVQp6UlU3M","VerEAZzJHW","BGaQYgf8rI","euZA5DG4sT","Chuy3Chuy3",
+"i7WMQqQxHP","ZhwG1cShY2","HzZT8FnPFB","CdyBVVNCPd","9iGoT7fKYU","yEfy964s8N","OxWIHHP433","KsjRKRpBQm","RzaZABbwgA","sqVrf29QAz",
+"BFkb8guMb8","aez9yt98iW","uAWypuupzk","GXdoH1v5hH","5drc6Vprf2","0PktINxx9V","nnP8oiB08l","YjB9tRzaZA","d85a9AIYUu","8FmFHW3VFH",
+"LbRTHWDVWJ","MK07YzmLYD","AIYUupAhR1","gIYvExXTI4","HP433CxVEf","pmeCdQ6hMC","UlU3MksJby","3otm6RBhp0","mz8gxaez9y","tlILtWaim6",
+"zz4ZUyofH3","VNCPdIRh48","y94nwChuy3","WDVWJzFgtB","QworuVBjhz","jtn0Xhi5X7","ulk415VZjS","GWqqXMaJQs","14FLRHfyNQ","FVMxoUmaEv",
+"IRh480YAGH","AgJHQBpYhV","b29RJUl4a1","BpYhVQWxoT","a00b5dhSuH","gtCA5d7vjM","FcWrW07n1c","uN6r3TCgPp","7fKYUnlaBy","5ZaEzJRJQB",
+"ciuWzydG8U","iKqhr5drc6","SjskQWmadA","1LB1LhSSvQ","7lUXZprNT6","aL6AJlsQGo","vOqCEtaOXK","Cfgr37X3uy","v1HlnLewvM","mz8gxO3iyQ",
+"WreyPNhXdu","fqypyMkgy8","2hEEUpv0i7","5Drn0lXFOB","M6qcGgIYvE","pWiOsBGaQY","FwEJztAOsr","CqqaDqQxHP","MmKGJF6PT2","i3pydix74r",
+"lj07QtjQxs","hSSvQTwano","ReKEWFjHXR","Waim69iGoT","MmKGJMkgy8","aL6AJBGaQY","UlU3MS2Dfu","7ku1p580YD","RkQkexReec","9GXkXPOUYS",
+"brhlQzmLYD","2ZHdkY1mC0","QworuBFkb8","Nxx9VoVQp6","xReec4W0Tl","8cVD3IKxdL","a00b5fLNg8","h1zcHFVMxo","t98iW8RCUA","uLtKsVerEA",
+"cQOnv8RCUA","Ss0Zu7X3uy","F6PT20YAGH","Gv3FqeuZA5","BCxeC55rfB","CK5W7PYBf4","4W0Tl5IhmG","Y1mC00h1b1","QClRLtjQxs","1LB1LoQ87r",
+"xciqp5drc6","ni2v1vkCHH","9y4lwMkgy8","yToGWDcpWB","0MR5XlXFOB","Nxx9V8hJdt","5ZaEzlkMUA","n1pmOUl4a1","O3iyQHlUbF","l83UdpWiOs",
+"9rlg9xXTI4","wiHrZLDk6f","s7MxkgIYvE","0YAGHhE1Ql","RkQkeJRJQB","3weIFh1zcH","UmaEvjfREu","LDk6fuLtKs","Mm8siY1mC0","gtCA5lXFOB",
+"YOfrYhE1Ql","ulk41S77LH","64s8NFxX9q","pmeCd8cVD3","NOHszFPfSE","FnPFBatef2","VerEA6AFT0","7Ow5CQChxs","0Kyfsi3pyd","lViBvMmsIo",
+"cShY28U2nU","2ZHdk2TRI7","W3VFHzQt6Q","M6qcGChuy3","P6bcghYBCK","Ta8f6mz8gx","64s8NzQt6Q","m4bxUOxWIH","48cHLUl4a1","ThjNn3otm6",
+"e6e4zx3LDe","yluBxpvgjS","RxrsmRmDcr","6AFT0pT8wu","VerEAF6PT2","soy9tgjUTu","m4bxUrKDLJ","VIlwPcQOnv","VerEAX6Pin","GSQwjQ6Lix",
+"EOE1ohYBCK","IRh48tuDyS","uoStwCp3mZ","4QMc9W7cTs","SWfouYOfrY","IBe8kQChxs","gf8rI1v5hH","pWiOsThjNn","iKqhri3pyd","v2eC3lsQGo",
+"8U2nUUl4a1","piJSk1j5L8","9GXkXZzJHW","lweGyU3yw5","pWiOssqVrf","Mm8siydG8U","h1zcHGXdoH","G1RhSdjsrv","S77LHNcICA","Kr8ysCdyBV",
+"piJSkzHF1q","prNT6GSQwj","4W0TlGv3Fq","64s8NEOE1o","lm0pD7Ow5C","Q6LixtlILt","PYBf4Waim6","suY4xQYxC0","YjB9tlpF6W","24ARFQClRL",
+"djsrvuvf7A","FjHXRFVMxo","W3VFHbZLvS","BbwgAQWxoT","CK5W7AmdQd","aDGtSThjNn","DLhzMwDajX","okgRiWreyP","HzZT8atef2","wiHrZmX2GE",
+"tjQxsblLA9","NAFuwlkMUA","CxVEfl83Ud","blLA9K20wK","CK5W75drc6","gIYvElViBv","Rxrsm8U2nU","dQ586RACuj","JIqXiGWqqX","yvOMIt98iW",
+"VerEAlweGy","iqv4kStlDJ","Pb1paEdBKc","ciuWzAgJHQ","bgJAzgIYvE","pv0i7cShY2","cShY2UmaEv","Pb1paRmDcr","YjB9tWreyP","aez9ypvgjS",
+"2Yz7EciuWz","ydG8UOUqFM","MezSWfqypy","2DREsFGzgp","Pb1pasx5Gl","jfREuRBhp0","DLhzMRACuj","MmKGJRzaZA","prNT65Namm","HzZT8jzUqR",
+"s93MlzQt6Q","VjCZqpvgjS","Chuy3b29RJ","prNT6M6qcG","NAFuwjeskS","PYBf4pvgjS","atef2In3NS","WDVWJcQOnv","dmoS7pmeCd","oVQp6Kr8ys",
+"Ss0ZujS1aj","d85a9Qworu","QClRLMK07Y","AgJHQWMiS3","DLhzMtAOsr","qaofNQbxXc","TwanoY1mC0","QworuBGaQY","hSSvQWMiS3","s7Mxk6AFT0",
+"Q6hMC4QMc9","QWxoT55rfB","AmdQdIKxdL","oGu6xDG4sT","Vprf2Rxrsm","S77LHZzJHW","WreyPuAWyp","jSjS3FVMxo","e6e4ziKqhr","VLTy6piJSk",
+"fcJOyuLtKs","fLNg80h1b1","ThjNnRmDcr","BpYhVMkgy8","9iGoTcmXIX","DcpWBIRh48","a00b5lCMxy","pFrrlGSQwj","Ul4a1yEfy9","Yf2EcQWxoT",
+"DQimpUvlv4","hi5X7WMiS3","SmGzvazIWp","Q6LixfcJOy","gIYvED6rBy","7lUXZzbIYY","AmdQdCIShG","RmDcrW7cTs","I7p2a1j5L8","bZLvSFLsph",
+"yToGW9GXkX","0Wr5y6AFT0","xXTI4uJScX","O3iyQdQ586","D6rBy0ao3l","suY4x8TxD7","B3qem7fKYU","7fKYUWPmlx","Yw2oURxrsm","W3VFH7X3uy",
+"zbIYYB3qem","1v5hHciuWz","SWfoupWiOs","8TxD7LewvM","BGaQYDz1R3","K20wKlkMUA","lCMxyLewvM","IKxdLzqH0W","cL0aEWDVWJ","x3LDe7fKYU",
+"UlU3M7ku1p","29QAzblLA9","RBhp0PYBf4","618DiFnPFB","JXljW9y4lw","5ZaEzsoy9t","n1pmO9eoRc","Z4I1vnnP8o","blLA9fcJOy","FwEJzFVMxo",
+"MaJQszqH0W","tuDySuTacx","t59lRoVQp6","oVQp6ZzJHW","bZLvSs4786","b29RJsoy9t","tl72WvOqCE","PYBf40PktI","JKWYRgjUTu","JkzUnJRJQB",
+"aFFssFwEJz","hUTw7yluBx","1v5hHzz4ZU","Ss0Zu2Nslm","5IhmG9iGoT","C2IrczHF1q","dQ586NOHsz","zz4ZUYf2Ec","0MR5XUmaEv","ZJTXHzY1GY",
+"AkKTkFFDui","Ss0ZuBFkb8","ogLgcYw2oU","JXljWuvf7A","BCxeCAIYUu","aFFssbZLvS","uLtKsMm8si","oVQp6VjCZq","jSjS345cIH","iqv4k0ao3l",
+"CdyBVCNHmv","3weIF8FmFH","4W0TlpT8wu","cShY2CxVEf","5Mg9rMGlTF","soy9tcQOnv","8TxD7Mm8si","U3yw5yofH3","PYBf4O3iyQ","uLtKsaL6AJ",
+"6q6L9vLsmS","cL0aEqUJMd","zY1GY5IhmG","Q6hMCAkKTk","2ZHdkG1RhS","VjCZquupzk","jzUqRlsQGo","UmaEvuAWyp","Ta8f6TXQ0Z","lH1kt8TxD7",
+"n1pmOBFkb8","vkCHHCp3mZ","jfREuksJby","VLTy6JXljW","1j5L8jiVBP","y94nwv1Hln","qUJMdRzaZA","7ku1pOUYuF","2DREsRmDcr","24ARF5Mg9r",
+"uN6r3JIqXi","zbIYYBGaQY","zz4ZUpmeCd","AXpwENcICA","QYxC0ZJTXH","ZhwG1tjQxs","hUTw7pv0i7","Mkgy8lXFOB","yluBxmz8gx","Chuy3K20wK",
+"55rfBgtCA5","0PktIt98iW","aDGtSpAhR1","tjQxsIn3NS","hE1QlkZANm","fmIK10MR5X","zQt6QMmKGJ","azIWpNAFuw","29QAzoQ87r","gtCA5RzaZA",
+"StlDJIRh48","soy9trhl0J","jS1ajLDk6f","MezSWQssNC","l83UdOUYuF","jeskSaez9y","tjQxstuDyS","uJScXtl72W","lCMxyQssNC","5Mg9rZJTXH",
+"Q6LixzFgtB","s93MllH1kt","I7p2aEdBKc","piJSkStlDJ","nlaBylj07Q","vLsmSNo0Qb","pFrrlDcpWB","O3iyQazIWp","WDVWJzz4ZU","K20wKWDVWJ",
+"jfREuNcICA","BCxeCMmsIo","HP433K20wK","AmdQdFhtgl","0ao3lAgJHQ","dmoS7uN6r3","HRxd8Vprf2","tAOsrdpe1v","FGzgpMezSW","5Namm2ZHdk",
+"7Ow5C5drc6","4QMc9cQOnv","HP433WaWsv","vOqCEsuY4x","JXljWt98iW","uAWypsqVrf","uZPqgBCxeC","IjTwP0ao3l","BGaQYzbIYY","7ku1pbgJAz",
+"DG4sTksJby","uoStwKr8ys","oVQp6FNYIM","tuDySQChxs","pT8wujzUqR","7fKYUuAWyp","07n1cokgRi","zqH0WAIYUu","Fhtgl5drc6","xReecpWiOs",
+"zFgtB0ao3l","iwzGke6e4z","hi5X7bgJAz","lj07QKASQ8","qQxHPGrDg7","8U2nULDk6f","y94nwjtn0X","pv0i7XflUq","FFDuirz7Ut","pmeCdFVMxo",
+"zFgtBlsQGo","Pb1paZhwG1","gIYvEciuWz","hUTw7HlUbF","ulk41nFqik","cShY2uvf7A","QWxoTRBhp0","SbRYy8xEKz","uAWypAmdQd","IKxdLRpBQm",
+"7fKYUZ4I1v","FFDuiuJScX","ru4UGOxWIH","2Yz7EfaHir","HlUbFpFrrl","FFDui5VZjS","kB5nPzFgtB","EdBKcMkgy8","Qworu0BmCy","DLhzMjS1aj",
+"lViBvJXljW","Vprf2GrDg7","gtCA5Zv7z0","Nxx9VHRxd8","Cfgr3Yf2Ec","MmKGJi3pyd","s4786ZhwG1","BFkb8mz8gx","4QMc9fqypy","2DREsQYxC0",
+"8xEKzrz7Ut","pv0i7ZJTXH","MezSWDLhzM","JkzUn7Ow5C","RsQUqBbwgA","Ss0ZuCdyBV","JXljWs4786","Zv7z0S77LH","zbIYYxReec","1LB1LazIWp",
+"sx5Gl9XyT9","fLNg8AIYUu","2Yz7E3weIF","pv0i70Wr5y","IKxdLDcpWB","9iGoT7hyVv","gjUTuFPfSE","tl72WYf2Ec","euZA55Mg9r","I7p2aOxWIH",
+"5Mg9rxciqp","Rxrsmd7vjM","e6e4zFNYIM","K4GS8I7p2a","s93MlvOqCE","RBhp0S77LH","LDk6fFhtgl","Ta8f6uoStw","FwEJzMm8si","kB5nPPYBf4",
+"0Wr5ylsQGo","Yh1hF2TRI7","HRxd8Rxrsm","okgRilpF6W","fLNg81j5L8","fcJOyECMvU","uAWypD6rBy","K4GS8Rxrsm","VNCPd0BmCy","C2IrcAIYUu",
+"OxWIHPYBf4","M6qcGcQOnv","euZA5lweGy","B3qemZ4I1v","kB5nPL7cGc","gIYvE1v5hH","jzUqRmz8gx","9XyT97lUXZ","DG4sTMmKGJ","ECMvUd85a9",
+"ECMvUEOE1o","aFFss3weIF","KsjRKzqH0W","fcwDaCfgr3","prNT6s7Mxk","QWxoT5iGN5","S77LHWDVWJ","W7cTseuZA5","tl72WJJs5m","zbIYYS2Dfu",
+"pFrrlzY1GY","jiVBP5nmWv","jSjS3JkzUn","lj07Qni2v1","fqypy9XyT9","OUYuFpT8wu","lweGyAOgEe","taOXKmX2GE","64s8NBFkb8","LDk6fMojnP",
+"9GXkXAOgEe","1j5L8ZuDtD","L7cGcF6PT2","B3qem0BmCy","3weIFLewvM","brhlQpFrrl","DQimp1v5hH","Mm8siVjCZq","ksJby7lUXZ","yluBxQbxXc",
+"M6qcGMaJQs","0BmCy8cVD3","JRJQB9y4lw","FFDuiaDGtS","qQxHPvLsmS","piJSklXFOB","BCxeCa00b5","RxrsmbZLvS","9rlg90MR5X","5nmWvFLsph",
+"uZPqg7hyVv","lsQGovOqCE","9y4lwAmdQd","vLsmSiqv4k","FcWrWvkCHH","8hJdtmz8gx","RzaZA8xEKz","NhXduQworu","VerEAM6qcG","W7cTsksJby",
+"zFgtBL7cGc","Zv7z0F6PT2","gjUTuD6rBy","2TRI7ni2v1","8hJdtpiJSk","5IhmGiqv4k","piJSkQworu","soy9tFnPFB","1LB1L7fKYU","BCxeCxciqp",
+"dpe1vuQIcz","aez9yBFkb8","o8UydlsQGo","jtn0X8xEKz","RACujFGzgp","rz7UtguMb8","FnPFBtAOsr","0ao3ltuDyS","W7cTsI7p2a","VjCZqni2v1",
+"5ZaEzTwano","m4bxUMojnP","Ul4a18FmFH","2Yz7E9eoRc","jS1ajvOqCE","FjHXRNAFuw","VNCPdblLA9","pT8wuCp3mZ","Yh1hFYw2oU","uQIczvLsmS",
+"IRh48MezSW","uN6r3h1zcH","2DREsJXljW","M6qcG8xEKz","zY1GYRsQUq","Cp3mZ9GXkX","nFqikd85a9","WreyPhi5X7","zHF1qChuy3","QYxC0QWxoT",
+"UlU3MCfgr3","NhXducShY2","cShY2Y1mC0","OUYuFjS1aj","aDGtSDLhzM","i3pydfmIK1","2DREsOz8yZ","Uvlv4zz4ZU","0Wr5yaL6AJ","0ao3lrz7Ut",
+"DcpWBFGzgp","hSSvQ0ao3l","Mm8sipiJSk","580YD64s8N","cL0aEokgRi","AmdQdaDGtS","D6rByBCxeC","o8UydAXpwE","0h1b1Zv7z0","8cVD3pv0i7",
+"lXFOBLewvM","NAFuwU3yw5","5nmWvMmsIo","DcpWBoGu6x","iKqhrEoToP","Kr8ysAkKTk","9iGoTECMvU","lCMxyHP433","k85Aey94nw","lH1ktBCxeC",
+"YjB9t9XyT9","FnPFB4QMc9","okgRizqH0W","QssNCs93Ml","UmaEvydG8U","yToGWFLsph","v1Hlnd85a9","he9IAtjQxs","tAOsr24ARF","rhl0JNOHsz",
+"gIYvESmGzv","DcpWB5VZjS","StlDJ7X3uy","rKDLJ8FmFH","16lHcThjNn","dhSuHW3VFH","55rfBpmeCd","JkzUn5iGN5","bZLvSm4bxU","C2Irc24ARF",
+"MaJQs6AFT0","NAFuwRACuj","1LB1LFxX9q","0MR5Xgf8rI","1LB1LaFFss","4QMc9Q6hMC","MmsIotjQxs","aDGtSgtCA5","7Ow5CEdBKc","NhXduogLgc",
+"zbIYYi3pyd","s7Mxk64s8N","M6qcGtuDyS","0BmCyHP433","6q6L9Twano","Ta8f6x3LDe","1v5hHazIWp","tvdkDCdyBV","XyPZNaDGtS","FxX9qGWqqX",
+"FLsphDG4sT","5iGN5TCgPp","mz8gxgIYvE","5IhmGY1mC0","iKqhrQChxs","kZANm5IhmG","jfREu16lHc","Yh1hFAIYUu","CxVEfQbxXc","xciqpNAFuw",
+"ksJbyKsjRK","0YAGHDG4sT","jeskSO3iyQ","uoStwAIYUu","64s8N5Namm","aL6AJ0Wr5y","MmsIo1v5hH","16lHcFcWrW","m4bxUGrDg7","9XyT9FnPFB",
+"9iGoT618Di","1LB1LcQOnv","zz4ZUy94nw","GWqqXuPX7G","DcpWBTCgPp","Oz8yZCqqaD","e6e4z9iGoT","okgRiRkQke","zqH0WAmdQd","8U2nUpWiOs",
+"ciuWzoGu6x","EdBKcQYxC0","wiHrZReKEW","oGu6xaDGtS","zbIYYi7WMQ","azIWplXFOB","6AFT0SWfou","gdQsSazIWp","FFDuiuTacx","lXFOBqQxHP",
+"CxVEfix74r","2TRI71v5hH","uJScX7lUXZ","AOgEe0Wr5y","16lHc2ZHdk","x3LDelkMUA","zY1GY45cIH","o8UydQYxC0","lkMUAPOUYS","v1HlnyluBx",
+"WaWsvL7cGc","7fKYUlsQGo","dpe1vFFDui","MGlTFIBe8k","2TRI7MmsIo","oVQp6Ss0Zu","TCgPpzHF1q","MmsIoBpYhV","RsQUqVjCZq","oQ87rPYBf4",
+"48cHLgtCA5","0ao3lhE1Ql","RxrsmHRxd8","ydG8UhUTw7","dQ586Mm8si","cmXIXvOqCE","ZUnqtiKqhr","ulk41Rxrsm","m4bxU2ZHdk","VIlwPHlUbF",
+"pT8wuFLsph","lpF6WyofH3","HlUbFWaWsv","fcJOyWaWsv","gdQsSNhXdu","MK07YxXTI4","2ZHdkStlDJ","cmXIXQ6hMC","In3NSZuDtD","v8yFN9y4lw",
+"M3zXLQ6Lix","0MR5XHP433","tlILt4dEz6","tlILtMojnP","zbIYYzbIYY","atef2fcwDa","LbRTHQClRL","mz8gxMaJQs","Q6hMCFcWrW","lweGyDLhzM",
+"580YDuvf7A","CdyBV5nmWv","vOqCEO3iyQ","1j5L8In3NS","GSQwj7Ow5C","FFDuiMmsIo","SbRYyOz8yZ","cQOnvSjskQ","lpF6WprNT6","okgRi8FmFH",
+"ix74rwiHrZ","AkKTk7X3uy","t98iW9iGoT","h1zcHU3yw5","i7WMQKZamH","tAOsrtuDyS","QClRLDLhzM","zz4ZURpBQm","t59lRDQimp","wDajXwDajX",
+"QnJ1SFVMxo","AgJHQv8yFN","guMb8SbRYy","cQOnvBbwgA","zz4ZUbrhlQ","uPX7GfFDrJ","lViBvdQ586","ru4UGMK07Y","jfREuFcWrW","pFrrlQYxC0",
+"K20wKkZANm","FGzgpBGaQY","14FLRSmGzv","8xEKz7lUXZ","S2Dfu7fKYU","Ta8f6Mkgy8","2hEEUFnPFB","2DREsDG4sT","rz7UtpAhR1","YjB9tQClRL",
+"cQOnvcShY2","FNYIMcL0aE","euZA5Cp3mZ","9rlg9gtCA5","2DREsYjB9t","ru4UG7Ow5C","MmKGJIBe8k","t98iWix74r","suY4xqaofN","jfREu29QAz",
+"6AFT0jzUqR","Chuy3WPmlx","In3NSl83Ud","y94nwRBhp0","S2Dfu7X3uy","tjQxssoy9t","DcpWBRkQke","tjQxsNcICA","FLsphTXQ0Z","x3LDeUlU3M",
+"VerEAlH1kt","s93MlFGzgp","VjCZqs4786","2DREsP6bcg","8hJdtblLA9","Pb1paiqv4k","blLA9Nxx9V","Q6hMCZ4I1v","I7p2aCxVEf","tlILtJkzUn",
+"rhl0JFFDui","FGzgp3otm6","C2Irc5Drn0","BGaQYrhl0J","580YDtjQxs","uLtKsHP433","Ss0ZuQ6Lix","tl72WKr8ys","rKDLJzbIYY","ZhwG1lkMUA",
+"nnP8oJIqXi","n1pmOi3pyd","d7vjMZhwG1","B3qemxReec","FNYIMSs0Zu","EdBKc0MR5X","fcJOyWMiS3","pv0i7jeskS","K4GS8Ul4a1","lm0pDVNCPd",
+"iwzGkWaWsv","Waim6W7cTs","gdQsShi5X7","9eoRchYBCK","KZamH5VZjS","Q6Lix0BmCy","VNCPd5nmWv","t59lRl83Ud","bgJAzni2v1","0YAGHjfREu",
+"VBjhztuDyS","s4786Oz8yZ","TXQ0ZAkKTk","tuDySBGaQY","uPX7GuN6r3","29QAzDQimp","aL6AJs7Mxk","QworuKZamH","FNYIMpT8wu","pmeCddjsrv",
+"8cVD38xEKz","MojnPatef2","U3yw5fFDrJ","x3LDeCfgr3","U3yw5iqv4k","gdQsS0Wr5y","yofH3aDGtS","M3zXLJRJQB","AXpwESWfou","MmKGJJJs5m",
+"v2eC3FjHXR","b29RJrhl0J","pWiOsgIYvE","HRxd8WDVWJ","uZPqgHlUbF","NAFuwMm8si","FFDuil83Ud","ZzJHWRsQUq","Ul4a1SWfou","soy9tCIShG",
+"0KyfsYw2oU","CIShG0Kyfs","WMiS3FFDui","suY4x7ku1p","o8UydciuWz","In3NSKr8ys","v1HlnK20wK","LewvMYh1hF","tuDySd7vjM","Nxx9VXflUq",
+"In3NSd7vjM","0YAGH5ZaEz","hE1QlsuY4x","qUJMdSWfou","MmKGJYjB9t","jiVBPv8yFN","hE1QlprNT6","aez9yQ6hMC","pFrrlkB5nP","7X3uye6e4z",
+"rz7UtpFrrl","QnJ1S9y4lw","TwanoRmDcr","Vprf2Uvlv4","lViBv0Wr5y","uoStwQWxoT","zmLYDIBe8k","bZLvSFFDui","wDajX5iGN5","ZzJHWnFqik",
+"B3qemhYBCK","GrDg7YjB9t","uPX7G9eoRc","JJs5mVLTy6","LbRTHOxWIH","blLA9e6e4z","S2DfuRmDcr","nlaBylViBv","ZhwG1C2Irc","0ao3lsuY4x",
+"FwEJz8TxD7","cmXIXhE1Ql","MK07YB3qem","kZANm5nmWv","W3VFHwDajX","uN6r3bZLvS","14FLRIBe8k","M6qcGK4GS8","lpF6WdQ586","uoStwMmsIo",
+"W3VFHsuY4x","QChxspvgjS","d7vjM5Drn0","RACujiKqhr","DLhzMzFgtB","iKqhrZJTXH","IBe8ktAOsr","pFrrl0PktI","o8Uydv2eC3","J2mQiQ6hMC",
+"blLA9zY1GY","55rfB4QMc9","taOXKguMb8","qaofNFxX9q","djsrviwzGk","IBe8k6AFT0","9rlg9VerEA","OHaBz24ARF","YjB9tYjB9t","ogLgc580YD",
+"Ss0ZuLewvM","SjskQnnP8o","OxWIHJIqXi","lH1ktyToGW","Kr8ysChuy3","7X3uyUmaEv","mX2GEB3qem","6q6L97Ow5C","Gv3FqFFDui","uN6r3gjUTu",
+"MK07Yy94nw","ciuWzMmsIo","WaWsvSs0Zu","s93Mlx3LDe","tvdkDECMvU","8FmFHBGaQY","yvOMIjS1aj","lsQGoZuDtD","qQxHP3otm6","VIlwPLbRTH",
+"7fsYMFhtgl","s93MluQIcz","sx5GlwDajX","fqypymz8gx","NcICAOxWIH","zHF1qcL0aE","yluBxkB5nP","djsrvrz7Ut","jS1ajs7Mxk","uN6r30PktI",
+"t98iWQWxoT","sx5Glfqypy","rz7Uto8Uyd","CK5W7suY4x","dQ586Z4I1v","JIqXijzUqR","45cIHTCgPp","FcWrW0MR5X","v2eC3hUTw7","pAhR1Yw2oU",
+"HRxd8QClRL","QChxslweGy","BFkb8MK07Y","o8UydsqVrf","55rfB2DREs","X6Pin8TxD7","JJs5mWreyP","48cHLIKxdL","RACujqQxHP","s93MlTa8f6",
+"FxX9qksJby","WmadAhSSvQ","fcwDadQ586","brhlQ07n1c","YOfrYtuDyS","SjskQl83Ud","lm0pD618Di","ksJbyDQimp","SWfouZUnqt","fmIK1ZUnqt",
+"hYBCKzHF1q","Chuy3pmeCd","hSSvQiqv4k","WaWsvmX2GE","4W0TlJIqXi","ZzJHWcQOnv","9GXkXWaim6","9iGoT1v5hH","Q6Lix3otm6","G1RhSDQimp",
+"7lUXZVIlwP","iB08lThjNn","VjCZq9iGoT","Cfgr3lViBv","MojnPv2eC3","SbRYyFGzgp","WreyP8cVD3","DQimpfcJOy","ZuDtDOUYuF","Fhtglxciqp",
+"pmeCdcmXIX","3otm6k85Ae","uAWypXflUq","2ZHdkyToGW","PYBf4sx5Gl","C2IrcTCgPp","nFqikydG8U","lsQGohi5X7","K4GS8JIqXi","In3NSuTacx",
+"7fKYUAgJHQ","lCMxyFPfSE","S2DfunnP8o","S77LHFNYIM","KASQ8WDVWJ","5drc6AgJHQ","JIqXipAhR1","CIShGjtn0X","0h1b1uN6r3","580YDrz7Ut",
+"45cIHsoy9t","14FLRRkQke","tvdkDGWqqX","16lHcM3zXL","VNCPdPYBf4","VBjhzFLsph","d85a9WmadA","2Nslm1j5L8","i3pydECMvU","prNT6KsjRK",
+"NAFuwFVMxo","HP433SjskQ","BFkb8euZA5","9rlg9ru4UG","9rlg9gjUTu","RkQken8pJ9","dpe1vSWfou","MmsIoy94nw","s93MlBCxeC","FNYIMDQimp",
+"ZUnqt3weIF","2hEEUlpF6W","QYxC0BCxeC","SmGzvDz1R3","F6PT2hi5X7","9y4lwTwano","64s8NNxx9V","3weIFpAhR1","RxrsmCqqaD","X6PinL7cGc",
+"4W0TlIn3NS","XyPZNrhl0J","0BmCypvgjS","14FLR5ZaEz","aL6AJpFrrl","blLA9uZPqg","FhtgloQ87r","bgJAzuupzk","S2DfuEoToP","yvOMIQWxoT",
+"hSSvQv8yFN","WaWsvv1Hln","NhXdu9y4lw","fFDrJXyPZN","Q6LixC2Irc","pWiOsdmoS7","ix74rFhtgl","DcpWBuJScX","lViBvVIlwP","b29RJIjTwP",
+"HRxd80h1b1","TCgPpuJScX","rhl0JHP433","JXljWQnJ1S","OxWIH45cIH","AOgEeLbRTH","lH1kttlILt","2Yz7EBCxeC","NhXdu07n1c","vOqCEyluBx",
+"azIWpECMvU","GrDg7X6Pin","d85a9uoStw","StlDJUlU3M","VIlwPMK07Y","24ARFpT8wu","5Mg9ryToGW","8RCUAVNCPd","JKWYR0YAGH","zY1GYkZANm",
+"QnJ1S7hyVv","VerEAksJby","QChxsIRh48","NhXduo8Uyd","RmDcrtuDyS","0h1b1FVMxo","FFDuidmoS7","Qworu8TxD7","jS1ajaez9y","mz8gxs4786",
+"4W0TluLtKs","n1pmOPb1pa","WMiS3SbRYy","GWqqXRsQUq","SWfoub29RJ","i3pydulk41","5drc65Namm","AIYUuzz4ZU","gIYvETa8f6","jiVBPCp3mZ",
+"G1RhSRBhp0","OHaBz2DREs","VIlwPdQ586","WMiS3tjQxs","5NammtAOsr","NcICAru4UG","QbxXcd85a9","tlILtRxrsm","iB08lsuY4x","1v5hHF6PT2",
+"RmDcrY1mC0","zz4ZUTa8f6","0PktIlj07Q","HP433HzZT8","yvOMI7lUXZ","EdBKcgjUTu","FLsphMGlTF","FNYIMC2Irc","h1zcHRzaZA","l83UdFVMxo",
+"t98iWiqv4k","pv0i7s7Mxk","0BmCyNhXdu","lj07QAOgEe","8xEKzCIShG","BGaQYjSjS3","G1RhS7Ow5C","5VZjSl83Ud","zHF1qNxx9V","AgJHQ0Kyfs",
+"GWqqXxXTI4","lXFOBNo0Qb","K4GS8i7WMQ","S2DfuOz8yZ","pvgjSk85Ae","uQIcz0BmCy","29QAzbZLvS","GSQwjOUYuF","FFDuiRkQke","ni2v1D6rBy",
+"OUYuFJkzUn","1j5L8ix74r","hE1QlMmsIo","QClRL9iGoT","hSSvQUl4a1","zmLYD2hEEU","vLsmSLbRTH","uN6r3aez9y","Fhtgllj07Q","IjTwPZzJHW",
+"wiHrZlViBv","JKWYRfaHir","S77LH5Mg9r","xXTI4gjUTu","tlILt4QMc9","DcpWBZUnqt","rhl0JpiJSk","AkKTkrKDLJ","brhlQfaHir","CxVEffqypy",
+"azIWph1zcH","I7p2aVLTy6","VLTy6v2eC3","SbRYyhe9IA","atef2NcICA","hUTw7ni2v1","h1zcHokgRi","SbRYyNo0Qb","cmXIX3weIF","DLhzM5Mg9r",
+"0Kyfss93Ml","07n1cxciqp","Cfgr3AIYUu","IjTwPTwano","AmdQdQWxoT","djsrvk85Ae","uLtKspWiOs","Q6Lix4dEz6","UmaEvMGlTF","lH1ktD6rBy",
+"HlUbFOHaBz","QYxC0faHir","5drc60Wr5y","o8UydqaofN","jiVBP0ao3l","580YDJkzUn","S2Dfu0YAGH","KsjRKsuY4x","BGaQYfaHir","JkzUn0ao3l",
+"NcICA9iGoT","JkzUnYh1hF","zFgtBlweGy","14FLRazIWp","FhtglI7p2a","nnP8oRACuj","SWfou0BmCy","AgJHQlsQGo","BpYhVd85a9","JkzUnOUqFM",
+"ydG8UzFgtB","QnJ1S4W0Tl","UlU3MgdQsS","oGu6xFPfSE","mX2GEIBe8k","JkzUnpv0i7","Uvlv4Y1mC0","BFkb8WMiS3","9eoRcWMiS3","5Mg9rsuY4x",
+"atef2IKxdL","EoToPDcpWB","AIYUuGXdoH","s93MlO3iyQ","HfyNQMkgy8","t98iW5nmWv","LewvMgIYvE","uPX7GVjCZq","Yh1hFU3yw5","nlaByOHaBz",
+"ix74r9XyT9","iB08ld7vjM","9GXkXzY1GY","s93MlyvOMI","RsQUqRpBQm","gIYvEGrDg7","nFqikNo0Qb","LbRTHYf2Ec","0ao3lUl4a1","CxVEfs4786",
+"8U2nUix74r","29QAzgdQsS","AmdQdkB5nP","5VZjSjtn0X","AOgEesoy9t","5nmWvlCMxy","fFDrJhSSvQ","Z4I1vmX2GE","TwanojS1aj","cShY2TCgPp",
+"ni2v1FnPFB","In3NSpmeCd","prNT6Q6Lix","16lHc48cHL","suY4xs4786","kZANmuN6r3","v8yFNksJby","TCgPp618Di","In3NSi3pyd","StlDJ2DREs",
+"2NslmBGaQY","ulk41vOqCE","jzUqRgdQsS","RBhp0XyPZN","OHaBz45cIH","jiVBP8RCUA","aDGtSx3LDe","07n1c5drc6","tl72Wzz4ZU","rz7UtsqVrf",
+"iB08lOz8yZ","7hyVv0BmCy","SWfou48cHL","vkCHHNo0Qb","FVMxoVBjhz","cmXIX16lHc","JXljWFPfSE","C2Ircy94nw","UmaEv8hJdt","pmeCdCqqaD",
+"2TRI78FmFH","Mm8siCfgr3","0ao3llm0pD","5VZjSzz4ZU","ix74rQ6hMC","l83UdqaofN","FFDuihSSvQ","9GXkXciuWz","tvdkDzbIYY","lsQGoFNYIM",
+"DLhzM5IhmG","dmoS7uLtKs","k85AeBbwgA","n8pJ9WDVWJ","lCMxyuPX7G","7X3uySjskQ","s7Mxk8U2nU","sx5Glgf8rI","fcwDaazIWp","1LB1LG1RhS",
+"lm0pDFnPFB","5Nammm4bxU","VIlwPbZLvS","2TRI7CIShG","5Namm16lHc","zz4ZU7Ow5C","fFDrJFxX9q","FFDuiECMvU","aDGtSI7p2a","3otm6VLTy6",
+"ThjNnChuy3","aL6AJ14FLR","lkMUApmeCd","uTacxvLsmS","Ul4a1DLhzM","0ao3lP6bcg","Ss0Zu55rfB","Q6hMC7fKYU","pT8wucShY2","n8pJ9StlDJ",
+"GXdoHyEfy9","0KyfsjSjS3","oVQp6YjB9t","xXTI4EOE1o","vkCHHuN6r3","uTacxkB5nP","s7MxkzmLYD","GWqqXS77LH","VNCPdECMvU","QnJ1SBCxeC",
+"9iGoTW7cTs","GSQwjs93Ml","iwzGkQ6hMC","RzaZAyvOMI","0Kyfse6e4z","DG4sTWmadA","uPX7GRkQke","FFDuiHRxd8","vLsmSiwzGk","vOqCEv8yFN",
+"nlaByQChxs","gtCA5Gv3Fq","vLsmSdQ586","VIlwPRxrsm","2NslmM6qcG","QssNCd7vjM","ZJTXHcQOnv","7ku1pQssNC","45cIHRBhp0","bZLvSJXljW",
+"JKWYRXyPZN","oVQp6FVMxo","FVMxoYh1hF","NAFuwECMvU","VerEAgdQsS","v1HlniB08l","BCxeCoVQp6","vkCHHv2eC3","cShY2VIlwP","RACuj8TxD7",
+"xXTI4XflUq","lCMxyvkCHH","EOE1oru4UG","tAOsr9y4lw","XyPZNru4UG","yToGWX6Pin","WMiS3yluBx","Uvlv4vOqCE","vLsmSix74r","AXpwEhe9IA",
+"7hyVv0Kyfs","IjTwPK4GS8","JIqXit59lR","In3NS4dEz6","WDVWJ5nmWv","lm0pDNxx9V","ix74rFFDui","iwzGktAOsr","0h1b1nFqik","LDk6fgdQsS",
+"Cfgr3prNT6","QWxoT0PktI","dQ5868xEKz","FnPFBWDVWJ","07n1cuoStw","JkzUnkZANm","2Yz7EvkCHH","WPmlxFhtgl","yofH3aez9y","iqv4kksJby",
+"AgJHQCNHmv","bZLvS9iGoT","gIYvEru4UG","IjTwPRzaZA","AIYUucL0aE","KsjRKCxVEf","JXljWY1mC0","BGaQYECMvU","0YAGH48cHL","nnP8ov8yFN",
+"WmadAlCMxy","D6rByUmaEv","OUqFMO3iyQ","MK07YDLhzM","WDVWJ8U2nU","WreyPUvlv4","Vprf2lpF6W","UmaEvBbwgA","gdQsSIjTwP","CNHmvyToGW",
+"s4786uvf7A","fmIK1d85a9","ydG8U0h1b1","F6PT2CxVEf","RkQkeCNHmv","ECMvUFnPFB","Nxx9Vxciqp","618DitaOXK","RkQkeaDGtS","4dEz6uN6r3",
+"0BmCyRpBQm","gjUTuuN6r3","i7WMQcShY2","J2mQiSjskQ","hYBCKJkzUn","lpF6WlXFOB","6AFT064s8N","Vprf2qQxHP","5Drn0VjCZq","16lHcCfgr3",
+"fmIK1iB08l","0PktIfcJOy","lXFOBuTacx","Pb1paOxWIH","d85a9cShY2","16lHcSs0Zu","DcpWBBFkb8","7X3uy3weIF","e6e4zM6qcG","jfREuaez9y",
+"DG4sTjSjS3","5Drn0EdBKc","9eoRcQ6Lix","ksJbyGSQwj","s93Ml07n1c","45cIH6AFT0","lXFOBMm8si","dhSuHRpBQm","rhl0JGrDg7","MGlTFn8pJ9",
+"8RCUA0ao3l","cShY23weIF","CdyBVFNYIM","FhtglYh1hF","lweGyydG8U","s93MlHzZT8","lkMUAs4786","M3zXLcmXIX","1j5L8U3yw5","piJSkWDVWJ",
+"K4GS8d7vjM","HzZT8mX2GE","G1RhSrz7Ut","zY1GYIRh48","FPfSERxrsm","S77LHK4GS8","AgJHQbrhlQ","7ku1pmX2GE","5ZaEzpT8wu","LbRTHhYBCK",
+"fLNg8ECMvU","FwEJzokgRi","MGlTFblLA9","Q6hMCnlaBy","ydG8UnnP8o","GXdoHn8pJ9","OHaBzMm8si","FPfSE7fsYM","pAhR1B3qem","d7vjMhSSvQ",
+"oVQp60YAGH","cL0aEgf8rI","VjCZqRpBQm","48cHLyToGW","Vprf2FGzgp","ni2v1WDVWJ","5Nammaez9y","AXpwECp3mZ","rKDLJdQ586","9rlg98xEKz",
+"FwEJzTwano","POUYS3weIF","MmKGJFPfSE","zbIYYFjHXR","MK07YtaOXK","suY4xS77LH","WPmlxkZANm","Ss0ZuRpBQm","JXljWX6Pin","ECMvU2DREs",
+"9XyT9s4786","gtCA5FNYIM","dmoS755rfB","yToGWCfgr3","QClRLThjNn","OHaBzlpF6W","NAFuwgtCA5","CK5W7iqv4k","QChxszmLYD","zFgtBtjQxs",
+"FVMxoAkKTk","M3zXLx3LDe","DLhzMyvOMI","uvf7AD6rBy","Uvlv4nlaBy","L7cGcuLtKs","rz7Uttl72W","ogLgcaFFss","WPmlxaez9y","cQOnv0MR5X",
+"NOHszoQ87r","ReKEWX6Pin","XyPZN1j5L8","n1pmOqQxHP","v2eC3gjUTu","7Ow5CBpYhV","24ARFQ6Lix","Gv3Fq8RCUA","zQt6QRBhp0","s7MxkgjUTu",
+"i3pyd7X3uy","16lHcsx5Gl","oGu6xbZLvS","uoStwMkgy8","BFkb8BpYhV","DG4sTBCxeC","8FmFHv8yFN","0Kyfsk85Ae","euZA5zFgtB","fLNg8uvf7A",
+"Q6LixlkMUA","RmDcrzHF1q","NAFuwqQxHP","n1pmOiqv4k","FjHXRReKEW","W7cTsyEfy9","NhXduXflUq","qUJMdcL0aE","nlaByGXdoH","rz7UtgtCA5",
+"d7vjMYw2oU","lpF6WhSSvQ","sx5GlRkQke","a00b5zbIYY","y94nwMm8si","v1HlnfLNg8","0YAGHW7cTs","ni2v1S77LH","taOXKuLtKs","I7p2aTXQ0Z",
+"UmaEvuZPqg","WDVWJlH1kt","aez9yNcICA","pAhR1HP433","fmIK1yluBx","Cp3mZvkCHH","S2DfuSjskQ","uLtKsNxx9V","lViBvCNHmv","hYBCK5Namm",
+"iwzGkSs0Zu","VBjhzyvOMI","X6PinSbRYy","v8yFNYh1hF","fcJOy5nmWv","BCxeCD6rBy","lCMxyrz7Ut","rhl0JdmoS7","b29RJlpF6W","29QAzXflUq",
+"TXQ0Z6AFT0","55rfBfmIK1","8cVD316lHc","In3NStl72W","s93Mls93Ml","MojnPcShY2","sx5Gl4QMc9","5IhmGWDVWJ","K20wKvLsmS","K4GS8n1pmO",
+"FGzgpVNCPd","oGu6xWmadA","lH1ktuLtKs","Y1mC05ZaEz","v8yFNCNHmv","YjB9tQnJ1S","2Nslm0Kyfs","uPX7GJJs5m","uTacxNAFuw","7Ow5CX6Pin",
+"xciqpnlaBy","AXpwEW3VFH","0Wr5yGSQwj","618Di5IhmG","gjUTue6e4z","29QAzQ6Lix","v2eC3RACuj","Dz1R3SbRYy","WmadAiB08l","45cIHt59lR",
+"2NslmBbwgA","dQ586zbIYY","e6e4zFPfSE","Mm8sidmoS7","FcWrWBpYhV","lweGys7Mxk","s4786hYBCK","45cIH9iGoT","a00b5VLTy6","YOfrYzFgtB",
+"5drc6sx5Gl","aez9y2hEEU","8U2nUOxWIH","KsjRKQChxs","580YDgtCA5","lXFOBCNHmv","Ul4a1zQt6Q","QChxsIKxdL","7lUXZi3pyd","oQ87rtAOsr",
+"v2eC36q6L9","yofH3Mkgy8","suY4x07n1c","OUqFMt59lR","3weIFSs0Zu","cQOnvQYxC0","0BmCytuDyS","D6rBytuDyS","uLtKsKsjRK","aDGtSYjB9t",
+"RkQkegdQsS","he9IA5ZaEz","RBhp0cQOnv","Pb1paNcICA","HfyNQHlUbF","v8yFNFGzgp","GWqqXgtCA5","8TxD7FPfSE","faHirzbIYY","0Wr5yiwzGk",
+"0h1b1PYBf4","07n1csqVrf","5iGN5t98iW","hE1Ql2ZHdk","2Yz7EZJTXH","FNYIMhi5X7","zFgtBksJby","QYxC0QssNC","2DREs7lUXZ","pT8wuYh1hF",
+"7ku1pd85a9","0MR5XyvOMI","IBe8k07n1c","580YDGXdoH","qQxHPY1mC0","FVMxoQ6hMC","blLA9Yw2oU","QChxsGWqqX","BGaQYnFqik","euZA5NcICA",
+"VerEAtAOsr","fqypyPYBf4","uupzkWMiS3","s93Ml9iGoT","brhlQhE1Ql","6AFT0LbRTH","pT8wu8xEKz","aez9ycL0aE","GrDg7iB08l","cQOnvRsQUq",
+"s4786NAFuw","fFDrJfaHir","8xEKzQssNC","GWqqXHzZT8","Pb1parz7Ut","WreyPRpBQm","MojnPi7WMQ","NcICAW7cTs","ksJbyOUqFM","h1zcHVLTy6",
+"StlDJ45cIH","cQOnvi3pyd","MezSWjzUqR","2DREsRsQUq","atef2G1RhS","DQimpLewvM","lweGyFjHXR","Cfgr3dmoS7","8RCUAQYxC0","gjUTuFnPFB",
+"WreyP9iGoT","lj07QTa8f6","VNCPdVprf2","DG4sTtvdkD","iqv4kni2v1","v2eC30h1b1","UlU3MuN6r3","BGaQY14FLR","tvdkD1v5hH","Qworu6q6L9",
+"BFkb8pWiOs","K4GS8gIYvE","KZamHiwzGk","tjQxsFLsph","wDajX7fKYU","euZA5QChxs","gIYvEAIYUu","y94nwjS1aj","JJs5mlm0pD","5IhmGFjHXR",
+"HRxd89XyT9","FLsphHzZT8","WaWsv9eoRc","ZJTXHFhtgl","GrDg7Ul4a1","S2DfuBpYhV","tjQxs618Di","prNT6fmIK1","euZA5zmLYD","MojnPdQ586",
+"MK07YKr8ys","MmsIopmeCd","OxWIHpvgjS","i3pydFFDui","I7p2aLDk6f","s93MlUl4a1","2hEEUkB5nP","DLhzM8cVD3","CNHmvuLtKs","EOE1oaDGtS",
+"faHirSs0Zu","jSjS3Q6Lix","OxWIHpT8wu","lkMUAUmaEv","UlU3MxReec","prNT6s4786","fLNg87fsYM","LDk6fdQ586","FVMxoXyPZN","i7WMQgjUTu",
+"FnPFBZ4I1v","0h1b1bgJAz","djsrvGWqqX","9eoRcoQ87r","Zv7z0X6Pin","RACujIRh48","Kr8ysAIYUu","uvf7A4dEz6","CxVEfsx5Gl","cShY2zHF1q",
+"BCxeCfcJOy","FjHXRFFDui","AXpwEPb1pa","Y1mC0ECMvU","W7cTshUTw7","StlDJ5Drn0","tvdkD5iGN5","kZANmuZPqg","TCgPpUvlv4","9GXkX48cHL",
+"0Kyfsulk41","NOHsz2Nslm","QworuMmKGJ","BbwgAAIYUu","ZzJHWMmsIo","7X3uylViBv","cQOnv64s8N","DG4sTd7vjM","b29RJOz8yZ","OUqFMIBe8k",
+"F6PT2WPmlx","s4786UmaEv","QClRLSmGzv","t59lRAkKTk","QssNCWaWsv","tlILtuTacx","LewvM3otm6","O3iyQx3LDe","dQ586O3iyQ","i7WMQsx5Gl",
+"0KyfsS77LH","FNYIMFNYIM","ZzJHWVprf2","pFrrlTwano","d7vjMpT8wu","uAWyps93Ml","uQIczlpF6W","ru4UGogLgc","Ta8f6xXTI4","i3pydtl72W",
+"lkMUABbwgA","MmKGJ8RCUA","rKDLJrz7Ut","NAFuwKZamH","No0QbblLA9","WDVWJru4UG","2hEEUIn3NS","fmIK1Zv7z0","StlDJBbwgA","pv0i7DQimp",
+"ZuDtDGWqqX","VerEAZUnqt","zmLYDNcICA","uupzkiKqhr","pAhR1UmaEv","RBhp0dmoS7","gf8rIVerEA","7Ow5CVBjhz","8RCUAoGu6x","Ss0Zuaez9y",
+"X6PinThjNn","WMiS31v5hH","7Ow5CFjHXR","M6qcG3otm6","NhXduGWqqX","FFDui2DREs","SWfouVLTy6","AOgEe14FLR","RzaZAMkgy8","No0QblkMUA",
+"atef2rz7Ut","W7cTs1j5L8","gf8rI2Yz7E","8TxD7VerEA","Dz1R3Ta8f6","3weIFzqH0W","DLhzMuupzk","dhSuHKZamH","AXpwEWaWsv","618DiSWfou",
+"0Wr5yMK07Y","29QAzrhl0J","Zv7z0uoStw","7Ow5CsqVrf","uAWyplsQGo","soy9tFVMxo","AgJHQtaOXK","okgRipv0i7","WMiS3X6Pin","IjTwPgf8rI",
+"oVQp6uAWyp","rhl0JpmeCd","9GXkXgjUTu","FLsphxReec","jeskSgtCA5","UlU3MFwEJz","ReKEWNxx9V","CIShG2TRI7","ulk41l83Ud","RACujlsQGo",
+"gf8rIS2Dfu","LDk6f9XyT9","i7WMQv2eC3","i3pydy94nw","M6qcGHfyNQ","Rxrsmgf8rI","TXQ0Zatef2","9y4lwiwzGk","48cHLuoStw","55rfBt98iW",
+"hi5X7YOfrY","9iGoTYjB9t","t98iWzz4ZU","nlaBye6e4z","xciqpHP433","EdBKcsx5Gl","9eoRc1LB1L","Q6hMCF6PT2","CxVEfZhwG1","QChxsChuy3",
+"iwzGkOz8yZ","OHaBzUvlv4","GWqqX5nmWv","JkzUnXyPZN","9XyT9FFDui","hUTw7Twano","wiHrZEoToP","618DiECMvU","0ao3lD6rBy","jtn0XGv3Fq",
+"t98iW9GXkX","HzZT8uAWyp","580YDZJTXH","fqypyiqv4k","Oz8yZsoy9t","yofH3t98iW","MGlTFpFrrl","5Namms4786","ksJbyuJScX","v2eC3lj07Q",
+"BCxeCUlU3M","KZamHfcJOy","SmGzvnnP8o","t98iW2Yz7E","uN6r3ni2v1","WMiS3W7cTs","7ku1p9iGoT","pmeCdECMvU","OHaBzMGlTF","29QAzcQOnv",
+"v2eC3jtn0X","ydG8U45cIH","d7vjMSmGzv","M6qcGydG8U","Kr8ys6q6L9","WMiS3lCMxy","ru4UG4dEz6","8FmFHQWxoT","POUYSlm0pD","Yh1hFQ6hMC",
+"x3LDeyofH3","P6bcgQssNC","3otm68cVD3","JRJQBdmoS7","45cIHZ4I1v","KZamH07n1c","5iGN59XyT9","ni2v1CqqaD","HlUbFTa8f6","n1pmOFnPFB",
+"Yh1hF0YAGH","AgJHQvkCHH","5iGN5gtCA5","B3qempvgjS","Zv7z0CK5W7","0MR5X4dEz6","fqypyFhtgl","xciqp8TxD7","WDVWJJXljW","v8yFNuN6r3",
+"AOgEeAmdQd","AkKTkiKqhr","s7MxkRBhp0","WmadABGaQY","TCgPpZJTXH","m4bxU8FmFH","azIWppAhR1","yluBxa00b5","lpF6WuZPqg","OUYuFHlUbF",
+"ECMvUFwEJz","uZPqggIYvE","Gv3FqK20wK","FjHXRZv7z0","6AFT0lkMUA","07n1c8hJdt","lXFOB4QMc9","djsrvHlUbF","atef2y94nw","FNYIM1v5hH",
+"O3iyQni2v1","9y4lwuPX7G","jtn0XRACuj","uTacxsqVrf","W3VFHcL0aE","l83UdVIlwP","y94nwBFkb8","lkMUAn1pmO","FLsphNAFuw","x3LDe0Wr5y",
+"hi5X7uTacx","y94nwt98iW","kB5nPt59lR","9eoRcdpe1v","jSjS3JRJQB","8U2nURzaZA","JJs5mRzaZA","lsQGoMmKGJ","2TRI7gIYvE","ZuDtDCNHmv",
+"0BmCyWaWsv","RBhp09rlg9","2DREs5nmWv","nFqikrhl0J","S2DfuciuWz","fqypyVNCPd","Ul4a1fcwDa","zHF1qzY1GY","ReKEWgdQsS","hUTw7S2Dfu",
+"G1RhSXflUq","14FLRlsQGo","atef2wiHrZ","MezSWjiVBP","euZA5o8Uyd","8RCUAAIYUu","7ku1pRACuj","VBjhz2DREs","lj07QX6Pin","dhSuH5Mg9r",
+"gf8rITXQ0Z","NcICAt59lR","dQ58616lHc","Gv3FqUmaEv","HzZT8pT8wu","Y1mC0sqVrf","hSSvQNhXdu","Mkgy8t59lR","sqVrfzz4ZU","1v5hH580YD",
+"gdQsS1j5L8","iKqhrhSSvQ","AXpwEP6bcg","2NslmWPmlx","piJSk0PktI","WaWsvAgJHQ","iKqhrO3iyQ","QYxC0ix74r","WDVWJ9y4lw","Zv7z0bgJAz",
+"Yw2oUlCMxy","9XyT9jSjS3","No0QbXyPZN","lCMxyhSSvQ","zY1GYIjTwP","prNT6he9IA","48cHLv2eC3","aez9yAXpwE","P6bcgDz1R3","FFDuimz8gx",
+"8cVD3F6PT2","AmdQdatef2","ZJTXHPYBf4","aL6AJpWiOs","QbxXcUvlv4","NOHszs4786","KsjRK8hJdt","0h1b18U2nU","HlUbFAOgEe","okgRiFhtgl",
+"t98iWHlUbF","SjskQaez9y","zbIYYpmeCd","JKWYR5Namm","faHirW3VFH","tlILtTCgPp","0YAGHhSSvQ","azIWpQ6hMC","o8UydaL6AJ","iB08ljfREu",
+"s93MlWmadA","FFDuiTXQ0Z","uupzkIRh48","2ZHdkYjB9t","64s8NQ6hMC","zHF1qSbRYy","14FLRKsjRK","B3qemF6PT2","NAFuw29QAz","POUYSPYBf4",
+"lXFOBlkMUA","Dz1R34W0Tl","RzaZAvkCHH","fFDrJyluBx","bZLvSIBe8k","HRxd85Mg9r","8U2nUlpF6W","suY4xl83Ud","CxVEfHlUbF","0KyfsAIYUu",
+"0PktIjeskS","0MR5XVerEA","o8UydfaHir","ulk41ni2v1","2NslmlViBv","Nxx9VpWiOs","16lHcGXdoH","Dz1R3e6e4z","lViBvaez9y","lkMUAuAWyp",
+"sqVrfMGlTF","k85Ae1v5hH","U3yw5Ta8f6","DG4sTJJs5m","In3NSzbIYY","pv0i7iB08l","LDk6fokgRi","IRh48RACuj","LbRTHlViBv","CIShGbrhlQ",
+"48cHL8hJdt","BbwgAQnJ1S","ix74rJJs5m","07n1ctAOsr","S77LHvkCHH","OHaBzBCxeC","M3zXLKZamH","ix74ruQIcz","ZhwG1BCxeC","QbxXcWDVWJ",
+"FxX9qAIYUu","Q6LixDG4sT","UlU3MNhXdu","nlaBy3weIF","LbRTH8cVD3","S77LHWPmlx","JXljWZzJHW","fcJOyuQIcz","uN6r3oQ87r","ZhwG1In3NS",
+"iqv4kS77LH","hYBCKtl72W","S77LHpWiOs","o8Uyd8hJdt","8xEKzblLA9","sqVrfhe9IA","uLtKss4786","yToGWdjsrv","rz7UtCp3mZ","zY1GY9y4lw",
+"MojnPpT8wu","I7p2agdQsS","IKxdLprNT6","7fKYU64s8N","zz4ZUtl72W","zbIYYnFqik","8FmFHChuy3","7fsYMv8yFN","gdQsSAOgEe","Mm8siIRh48",
+"5Mg9rCqqaD","MK07Y1LB1L","5iGN5BbwgA","IKxdLC2Irc","lH1ktNxx9V","JIqXiy94nw","B3qems93Ml","RACujQClRL","gIYvEQworu","o8Uyd0Wr5y",
+"Chuy32Yz7E","v8yFNBFkb8","uAWypFhtgl","JJs5mwiHrZ","8RCUAtuDyS","M6qcGBpYhV","k85Ae4W0Tl","8hJdtD6rBy","v2eC3Chuy3","ru4UGUlU3M",
+"HlUbFhUTw7","9GXkXRxrsm","fLNg8Yh1hF","VerEAlj07Q","GWqqXIKxdL","v1HlnFcWrW","Ta8f6Kr8ys","y94nw7fKYU","HP433lsQGo","Chuy39GXkX",
+"hUTw7TXQ0Z","euZA5cQOnv","soy9tZJTXH","lXFOBzqH0W","7hyVvpiJSk","D6rBy2ZHdk","oQ87rJIqXi","QClRLn8pJ9","aDGtSLDk6f","nnP8oDQimp",
+"HlUbFxciqp","VNCPdFwEJz","8hJdtFGzgp","zqH0Wzz4ZU","hi5X7EOE1o","he9IAgdQsS","qaofNPb1pa","Yw2oUfFDrJ","pv0i7uPX7G","Ss0ZuKASQ8",
+"Cp3mZb29RJ","VBjhzMojnP","MmsIoWaim6","0BmCyG1RhS","soy9tW7cTs","8FmFHNcICA","JXljWQClRL","FhtglaL6AJ","POUYS6q6L9","ZJTXHrKDLJ",
+"POUYSnFqik","IBe8kAgJHQ","W3VFHlm0pD","RkQkeWmadA","WPmlxCdyBV","KASQ8n1pmO","CdyBVXflUq","lj07QCK5W7","Cp3mZaez9y","7fsYMjiVBP",
+"ZuDtDRpBQm","14FLR3otm6","KZamH6AFT0","Mkgy8Mm8si","MmsIoGSQwj","Q6hMCv2eC3","LewvMQ6hMC","uQIcz2Nslm","fcJOyJJs5m","blLA9kB5nP",
+"piJSkv8yFN","tl72WQssNC","fqypyzY1GY","uvf7AAmdQd","NAFuwKr8ys","tvdkDrKDLJ","vkCHH14FLR","QworuFjHXR","lweGy29QAz","JJs5mCxVEf",
+"zFgtBb29RJ","TCgPppFrrl","uQIczX6Pin","QChxsAgJHQ","faHiruPX7G","WPmlxGrDg7","mX2GEcmXIX","2TRI7lweGy","FPfSEtvdkD","9XyT9VerEA",
+"jS1ajTXQ0Z","0ao3lVjCZq","faHira00b5","ZJTXHSjskQ","lH1ktnlaBy","MaJQs2DREs","OHaBzW7cTs","5drc6n8pJ9","JJs5mFVMxo","wiHrZRkQke",
+"XflUqJkzUn","9GXkXQbxXc","7fKYUcShY2","In3NShUTw7","Q6LixyvOMI","MezSWfLNg8","pT8wufmIK1","uJScXiqv4k","lH1ktQnJ1S","d85a9zqH0W",
+"aDGtSNcICA","fLNg8FwEJz","MojnPFLsph","5Drn0EoToP","FnPFB0MR5X","FNYIMK20wK","NhXduzY1GY","9rlg95nmWv","5IhmGvkCHH","uZPqgTCgPp",
+"618DiY1mC0","y94nwIn3NS","L7cGclpF6W","aL6AJ2hEEU","In3NSCp3mZ","2TRI7euZA5","M6qcGGSQwj","qQxHPP6bcg","OHaBzFjHXR","o8Uydtl72W",
+"BFkb8tuDyS","a00b5FNYIM","K20wKTwano","QbxXclH1kt","QChxsW7cTs","RmDcrFPfSE","MaJQspv0i7","jtn0Xlj07Q","MmsIoAkKTk","4W0TlCK5W7",
+"AIYUuRmDcr","RsQUqBGaQY","K4GS8uAWyp","Dz1R3pv0i7","QClRLLewvM","0Wr5yEdBKc","KZamH7X3uy","S2Dfu2DREs","xXTI4fLNg8","DLhzMNhXdu",
+"WreyPxXTI4","TCgPpv1Hln","Uvlv42ZHdk","yvOMIWmadA","ciuWzRmDcr","IKxdLU3yw5","FhtglNcICA","No0QbOHaBz","2TRI7uQIcz","djsrvJKWYR",
+"QssNCBCxeC","faHir7fKYU","d7vjMn1pmO","Oz8yZ2Nslm","7fKYUStlDJ","7ku1ppWiOs","i3pydvkCHH","ZJTXHCqqaD","2hEEU0BmCy","MezSWiwzGk",
+"AIYUu5iGN5","rhl0Jx3LDe","a00b5StlDJ","W7cTsnFqik","uupzk55rfB","t59lRuupzk","kB5nP48cHL","s93MlWDVWJ","0BmCy48cHL","djsrvhYBCK",
+"uZPqgdpe1v","NcICA5IhmG","gf8rIQssNC","QworuVjCZq","vOqCEZv7z0","iqv4kjiVBP","4dEz6Q6hMC","8hJdt1j5L8","rhl0JDG4sT","jzUqRdpe1v",
+"uoStw5VZjS","2hEEULDk6f","Z4I1v0h1b1","aL6AJReKEW","EOE1oeuZA5","BGaQYpWiOs","fcJOylCMxy","5NammgtCA5","AOgEeQChxs","o8UydlXFOB",
+"WreyPiwzGk","hYBCKS77LH","KASQ8rhl0J","aFFss9y4lw","14FLRjfREu","7hyVvVLTy6","gjUTulViBv","uTacxyEfy9","JJs5m64s8N","HfyNQEdBKc",
+"FxX9qx3LDe","Twano9rlg9","h1zcHaez9y","nFqikqQxHP","SWfouPb1pa","l83UdIjTwP","zqH0Wuvf7A","MaJQs45cIH","5Mg9rqUJMd","CIShGaL6AJ",
+"29QAzJRJQB","QYxC00MR5X","rKDLJ4dEz6","ni2v1Gv3Fq","SmGzvwiHrZ","Yh1hFM3zXL","2ZHdkuoStw","TCgPphE1Ql","lViBv9XyT9","ogLgcmX2GE",
+"QworuF6PT2","0PktIfLNg8","XflUqW3VFH","CIShG618Di","HP433EoToP","CK5W7d85a9","zmLYDQWxoT","tuDySEOE1o","QnJ1SlsQGo","zY1GY7ku1p",
+"lkMUAReKEW","FLsphfaHir","hi5X7fFDrJ","piJSkM6qcG","yEfy9NOHsz","n1pmOhUTw7","suY4xuJScX","Pb1paMK07Y","gdQsSzQt6Q","YjB9tdQ586",
+"7X3uygIYvE","5iGN5LDk6f","MezSW1j5L8","n8pJ9FnPFB","uvf7Azz4ZU","vOqCESbRYy","G1RhSSs0Zu","Z4I1vW7cTs","WDVWJqUJMd","XyPZNtlILt",
+"DQimpBCxeC","WPmlxfLNg8","qaofNJkzUn","t59lRjeskS","oQ87r8RCUA","IjTwP1v5hH","YjB9tTCgPp","Dz1R3prNT6","2TRI7azIWp","gdQsScQOnv",
+"0MR5XW7cTs","0Wr5yfaHir","OHaBzJ2mQi","Z4I1vEoToP","FxX9qFGzgp","hUTw7pT8wu","aFFssQ6Lix","wDajXKr8ys","brhlQJKWYR","JRJQBPYBf4",
+"gjUTuLbRTH","taOXKRmDcr","NOHszNcICA","9rlg9Ul4a1","FwEJzY1mC0","zFgtBi3pyd","l83Udtl72W","FhtglBCxeC","k85AeiKqhr","ydG8UVprf2",
+"5NammaDGtS","atef2SjskQ","2ZHdkQChxs","RkQkeReKEW","ZUnqtd85a9","xXTI4F6PT2","lCMxyaez9y","k85Ae5iGN5","QbxXczQt6Q","y94nwiB08l",
+"uupzkyEfy9","fcJOydhSuH","VBjhzWreyP","Ul4a1Pb1pa","BbwgAVerEA","FFDuihe9IA","0Wr5yQssNC","IKxdLQ6hMC","lViBvyToGW","y94nwKr8ys",
+"4QMc964s8N","Gv3Fq4dEz6","pAhR12Yz7E","BGaQYa00b5","55rfBIRh48","7X3uyAmdQd","lViBv5Drn0","tvdkD5ZaEz","fcwDaRsQUq","qaofNCNHmv",
+"uZPqglpF6W","X6PinSs0Zu","VLTy6KsjRK","LDk6fe6e4z","rz7Utl83Ud","9XyT90Kyfs","djsrvgIYvE","cShY2QbxXc","AIYUu16lHc","gIYvEFLsph",
+"jtn0XvOqCE","6AFT0iqv4k","fcJOygdQsS","aDGtSzY1GY","O3iyQBGaQY","uPX7GMkgy8","d85a9d85a9","x3LDeZv7z0","nlaByhUTw7","FhtgliwzGk",
+"1j5L8EoToP","2Yz7E2TRI7","UlU3MbZLvS","faHirG1RhS","vLsmSv1Hln","MK07Yhe9IA","gjUTupmeCd","ThjNnpvgjS","ThjNnMmKGJ","uTacx9eoRc",
+"QYxC0MaJQs","pvgjSpT8wu","ogLgcpWiOs","VLTy6VerEA","faHirI7p2a","prNT63weIF","wDajXCp3mZ","OUqFMGSQwj","YOfrYzHF1q","AXpwEyofH3",
+"fcJOyjfREu","5drc6hUTw7","IRh488hJdt","0KyfspvgjS","dmoS7RmDcr","ZhwG18RCUA","suY4xIn3NS","29QAzlj07Q","d85a96q6L9","h1zcHs93Ml",
+"BGaQYogLgc","xXTI4Y1mC0","LDk6fNAFuw","AgJHQGv3Fq","7fKYUtl72W","AIYUujiVBP","B3qemt98iW","gjUTuEoToP","pFrrlmz8gx","iKqhrBbwgA",
+"OHaBzkZANm","Ta8f6s4786","oQ87rjS1aj","aFFssLDk6f","OUqFMDcpWB","55rfBlweGy","AkKTkiqv4k","FcWrWciuWz","4W0TlNxx9V","tvdkDAkKTk",
+"hi5X7QClRL","W3VFHlpF6W","BCxeCuJScX","nFqikv8yFN","EOE1ozFgtB","Zv7z0IBe8k","zFgtBAmdQd","QYxC0ReKEW","o8UydWDVWJ","HzZT8ZzJHW",
+"0h1b1xXTI4","aFFssOxWIH","UlU3MyofH3","ZzJHWWPmlx","hSSvQ0PktI","jSjS3djsrv","G1RhS55rfB","4QMc9mX2GE","KZamHzz4ZU","tl72WaL6AJ",
+"x3LDe7Ow5C","29QAzYw2oU","s93Ml9y4lw","mz8gxyluBx","fLNg8MGlTF","EoToPvkCHH","MezSWUlU3M","6q6L95Mg9r","taOXKM6qcG","i7WMQ1v5hH",
+"Nxx9VtuDyS","AOgEeBpYhV","atef255rfB","2Nslmni2v1","xciqp1LB1L","9GXkXX6Pin","kZANmyToGW","lj07Qlj07Q","FxX9qMm8si","lj07QKr8ys",
+"d85a9FLsph","RsQUqChuy3","faHir45cIH","Yw2oULDk6f","MaJQsqUJMd","ix74rNxx9V","IjTwPFVMxo","jtn0XU3yw5","piJSkfLNg8","bgJAzAOgEe",
+"yvOMIzqH0W","MK07Ys4786","MmKGJ6q6L9","okgRigjUTu","lH1kt6q6L9","Cfgr3qQxHP","WaWsviwzGk","MGlTF8cVD3","xciqpcL0aE","blLA9tlILt",
+"MGlTFdpe1v","5ZaEzzbIYY","NOHsztjQxs","pT8wuiB08l","Dz1R3JkzUn","RmDcrYh1hF","dhSuH618Di","cmXIXzmLYD","hi5X7aFFss","BCxeCjtn0X",
+"0MR5XrKDLJ","hUTw7XflUq","CqqaDatef2","LbRTHQYxC0","K4GS8FjHXR","pvgjSQbxXc","jSjS3EOE1o","jSjS3ZzJHW","qUJMd1v5hH","zz4ZU1v5hH",
+"iwzGkU3yw5","pmeCd1j5L8","RpBQmFhtgl","lkMUAjiVBP","W3VFHVerEA","FNYIMsoy9t","SmGzvKr8ys","rz7Utm4bxU","CNHmvblLA9","JKWYROHaBz",
+"2Nslmlm0pD","l83Ud29QAz","AkKTkvOqCE","gf8rIyToGW","CdyBVNhXdu","ksJbyTXQ0Z","cShY2FwEJz","ydG8Uv8yFN","7hyVvt59lR","uoStwJkzUn",
+"s93MlsuY4x","gjUTuRACuj","K20wKaL6AJ","aez9yfcJOy","HlUbF7Ow5C","fmIK1v2eC3","QnJ1SFFDui","9iGoTGv3Fq","CdyBVNcICA","uupzktlILt",
+"Gv3FqPOUYS","tl72W9GXkX","0ao3lJkzUn","OUqFMs4786","i3pydqUJMd","KASQ855rfB","sqVrfRkQke","XflUqWaWsv","RACujMojnP","Q6hMCzY1GY",
+"uQIczzbIYY","djsrvWMiS3","P6bcghUTw7","pv0i7VLTy6","NOHszAIYUu","VNCPd0h1b1","Vprf2fcwDa","VBjhzzFgtB","W7cTsulk41","fcwDaaFFss",
+"AXpwEydG8U","XflUq6AFT0","oQ87rn1pmO","JKWYRXflUq","ydG8UoQ87r","1v5hHmX2GE","hYBCKfcJOy","QssNC9GXkX","L7cGcIKxdL","8hJdtZUnqt",
+"NOHszyofH3","Mm8sifcJOy","WreyPCxVEf","ciuWzoVQp6","YjB9tciuWz","No0QbL7cGc","faHir9GXkX","POUYSBpYhV","POUYSIjTwP","45cIHDcpWB",
+"aFFssciuWz","Kr8ys8TxD7","1v5hH2hEEU","zQt6QqaofN","rhl0JtuDyS","JKWYRGv3Fq","WMiS3I7p2a","4QMc9t59lR","UlU3MQClRL","SmGzvQ6Lix",
+"0h1b129QAz","faHirjfREu","aL6AJ7Ow5C","TXQ0ZCxVEf","xXTI4618Di","P6bcg2Yz7E","pFrrlb29RJ","Dz1R3Ul4a1","BCxeC8TxD7","NhXduK20wK",
+"uQIczGXdoH","ZhwG1OUqFM","PYBf4BFkb8","9GXkXt98iW","IjTwPprNT6","a00b57fKYU","qUJMdguMb8","RxrsmyvOMI","yofH3n8pJ9","Pb1paQ6Lix",
+"Yf2EcQ6hMC","14FLRQ6hMC","lkMUAEOE1o","KsjRKiqv4k","CxVEfThjNn","9XyT9M6qcG","suY4xRkQke","lViBvKZamH","RsQUqsx5Gl","fmIK1X6Pin",
+"a00b5djsrv","KsjRKOUYuF","uoStwlj07Q","a00b57fsYM","0PktI7ku1p","djsrv8FmFH","b29RJTa8f6","0ao3lwiHrZ","MGlTFYh1hF","d85a9o8Uyd",
+"nFqikt59lR","prNT6Cp3mZ","DLhzMMmsIo","FVMxoU3yw5","uN6r3oVQp6","RmDcrBbwgA","EoToP5Mg9r","piJSklj07Q","XyPZNdhSuH","zbIYY5VZjS",
+"NAFuw1LB1L","taOXK0YAGH","Ul4a1uQIcz","SjskQLDk6f","0ao3lkB5nP","NhXduPOUYS","HP4335IhmG","2TRI7uLtKs","Y1mC0580YD","WaWsvy94nw",
+"hSSvQ3weIF","zbIYYEoToP","ThjNnlm0pD","soy9tdQ586","Dz1R3RBhp0","brhlQyluBx","LDk6f2Nslm","YOfrYoVQp6","wDajXuPX7G","CdyBV29QAz",
+"5iGN5lweGy","gtCA5RpBQm","iwzGkX6Pin","PYBf4ThjNn","taOXKdjsrv","nnP8oru4UG","S2DfuCIShG","Ta8f6iqv4k","hi5X70PktI","7fsYMFjHXR",
+"14FLR1j5L8","VBjhz1j5L8","FwEJzDQimp","okgRiThjNn","AkKTk9rlg9","RmDcrBGaQY","i3pyd5Drn0","atef2Q6hMC","J2mQiRkQke","jSjS3CdyBV",
+"tjQxsprNT6","tjQxsJKWYR","8TxD7RACuj","B3qem45cIH","0h1b17hyVv","QssNCYw2oU","faHirqUJMd","l83UdbrhlQ","BFkb8zFgtB","DG4sTUmaEv",
+"hUTw7QChxs","ZuDtDhYBCK","pAhR1ReKEW","DcpWBt59lR","JIqXiL7cGc","9eoRc7fKYU","NOHszpmeCd","BGaQYGrDg7","RkQke1LB1L","jzUqRgf8rI",
+"24ARFFLsph","lj07Qe6e4z","RmDcrMmsIo","1v5hHWaWsv","aDGtSyofH3","HP433ydG8U","Yf2Ecrz7Ut","X6PinMkgy8","Chuy3iqv4k","gIYvEqUJMd",
+"WaWsvuPX7G","uJScXOz8yZ","y94nwQbxXc","5drc6K4GS8","7fsYMRzaZA","bZLvS4QMc9","Rxrsmix74r","X6PinU3yw5","NcICA5drc6","RsQUq5VZjS",
+"lH1kt29QAz","07n1cMmsIo","QWxoTXyPZN","FjHXRlkMUA","ZuDtDHzZT8","sx5GlThjNn","LDk6fazIWp","m4bxUx3LDe","QWxoTQworu","YjB9tGrDg7",
+"iwzGkOHaBz","HlUbFvkCHH","I7p2azFgtB","bZLvSgIYvE","Twanojtn0X","Gv3FqzbIYY","MmKGJuvf7A","5Mg9rWMiS3","aL6AJdQ586","VLTy6fcJOy",
+"7hyVv8RCUA","KsjRKJkzUn","BpYhV7fsYM","LbRTHXyPZN","8cVD3NcICA","gjUTupWiOs","qQxHPFcWrW","hE1QlBpYhV","LewvM0Wr5y","G1RhSFhtgl",
+"IBe8k9rlg9","zmLYDfqypy","IBe8kMm8si","45cIHWPmlx","HP433NcICA","xReecP6bcg","580YDZ4I1v","lweGyQssNC","i3pydtjQxs","J2mQiQYxC0",
+"MojnPwiHrZ","CxVEfuPX7G","UlU3MoVQp6","zmLYDYf2Ec","dpe1vlj07Q","HfyNQBCxeC","uLtKsfLNg8","LDk6foVQp6","NcICA580YD","aL6AJZUnqt",
+"l83Ud4W0Tl","jzUqRm4bxU","uTacxe6e4z","VIlwP7Ow5C","uPX7G14FLR","xReeczmLYD","8cVD3tvdkD","WaWsvni2v1","Q6Lixgf8rI","DcpWBlm0pD",
+"n1pmOpiJSk","pT8wuzqH0W","nlaByTwano","AOgEeyEfy9","zQt6Q29QAz","wDajX0ao3l","guMb8hSSvQ","pT8wu0Wr5y","yEfy9v1Hln","t98iWGWqqX",
+"zHF1quupzk","VerEAGWqqX","JRJQBKASQ8","GXdoHzmLYD","v1HlnuoStw","DG4sTuJScX","GWqqXydG8U","07n1ccmXIX","VerEAQworu","AgJHQuvf7A",
+"WDVWJK20wK","1LB1LHzZT8","IBe8kuoStw","Cp3mZDG4sT","FcWrWGXdoH","zFgtBl83Ud","5ZaEz16lHc","7fsYMJJs5m","5iGN5aez9y","ogLgcAmdQd",
+"7ku1plj07Q","9XyT9DQimp","JIqXi9eoRc","XyPZNyvOMI","RkQke7fKYU","hE1QlMkgy8","DcpWBIjTwP","m4bxUCfgr3","9XyT9m4bxU","HzZT8ulk41",
+"5ZaEzQ6Lix","uAWypjS1aj","jtn0XQClRL","pvgjSHP433","5nmWvAkKTk","MK07YFnPFB","YjB9tpvgjS","fcwDaiqv4k","Kr8ysUl4a1","aDGtSFnPFB",
+"VBjhzMm8si","blLA9uTacx","0BmCyW7cTs","ksJbyS2Dfu","0MR5XB3qem","I7p2amX2GE","9iGoT8cVD3","pAhR18hJdt","Vprf2J2mQi","djsrvQbxXc",
+"fmIK1s7Mxk","Zv7z02Yz7E","BbwgAVNCPd","W3VFHSWfou","2ZHdkOUYuF","m4bxULDk6f","d7vjMlweGy","Cfgr3YOfrY","9y4lwKr8ys","tjQxsuvf7A",
+"StlDJs93Ml","Cfgr307n1c","y94nwRzaZA","AXpwE2hEEU","LewvMRkQke","s4786pWiOs","Ul4a1FjHXR","M3zXLtaOXK","2ZHdkZ4I1v","1LB1LpWiOs",
+"9iGoTWPmlx","ReKEWi3pyd","Fhtgl2DREs","piJSkxReec","PYBf4NhXdu","i3pyd6q6L9","uTacxC2Irc","618Dii7WMQ","qQxHPZ4I1v","fmIK1ZJTXH",
+"0MR5XNxx9V","gIYvECqqaD","v8yFN4QMc9","soy9t8cVD3","JXljWxXTI4","QssNCuN6r3","2DREsIn3NS","lm0pDFwEJz","tAOsrMm8si","W7cTs5drc6",
+"X6PinlpF6W","yluBx48cHL","FcWrW6AFT0","suY4xqQxHP","gIYvEgf8rI","CxVEfSjskQ","MojnPvOqCE","Yf2EcZ4I1v","L7cGcX6Pin","k85Aetl72W",
+"SWfouaFFss","qQxHPeuZA5","uTacxVjCZq","7ku1pC2Irc","9GXkXx3LDe","fFDrJv1Hln","xReecWaWsv","5nmWvzHF1q","qaofNv2eC3","uJScXJkzUn",
+"mX2GERzaZA","0Wr5yDz1R3","hYBCK3otm6","5NammS77LH","S77LH7lUXZ","euZA5RACuj","Chuy3AkKTk","t59lRHlUbF","vkCHHhUTw7","l83UdMkgy8",
+"d7vjMuJScX","8FmFH2TRI7","FNYIMIjTwP","4dEz6EoToP","Oz8yZIRh48","xReecUl4a1","DLhzMCNHmv","lj07Q14FLR","yluBxuTacx","FVMxoogLgc",
+"uQIcz5Namm","a00b5faHir","48cHLWmadA","QnJ1SwiHrZ","8xEKzLewvM","pv0i7zbIYY","VIlwPn8pJ9","5drc65ZaEz","b29RJGv3Fq","0Wr5yG1RhS",
+"7X3uyrhl0J","5Mg9r7ku1p","VerEAVNCPd","KASQ80PktI","1j5L81j5L8","iB08lP6bcg","ECMvUlpF6W","NhXduBCxeC","CqqaDx3LDe","JJs5md85a9",
+"dQ586AgJHQ","StlDJKr8ys","yofH32Yz7E","5IhmGIn3NS","FNYIMLewvM","iKqhrOz8yZ","07n1cWaWsv","BbwgAn1pmO","F6PT20h1b1","soy9tcShY2",
+"SbRYyZv7z0","I7p2ae6e4z","d7vjM9iGoT","FcWrWHP433","618DieuZA5","uN6r3zQt6Q","M6qcGv2eC3","CNHmvMmKGJ","JXljWL7cGc","VLTy6Ul4a1",
+"VIlwP9y4lw","Mkgy8X6Pin","WmadAhUTw7","cShY2lCMxy","aez9yuvf7A","JIqXi1j5L8","a00b5ZJTXH","atef2NhXdu","yofH3X6Pin","gjUTu5nmWv",
+"W3VFHtl72W","jzUqRKASQ8","cmXIXciuWz","7X3uyBCxeC","d85a9NcICA","euZA5lkMUA","uJScXxXTI4","lkMUAxXTI4","EdBKccL0aE","JIqXiFGzgp",
+"pAhR1MezSW","QChxsfLNg8","tl72WuJScX","HP433Cp3mZ","uLtKsFLsph","guMb8m4bxU","AXpwEIRh48","taOXKCp3mZ","ZzJHWzY1GY","lXFOBzmLYD",
+"Nxx9VJIqXi","OUqFMCdyBV","wDajX5Namm","gdQsS7Ow5C","9rlg9qQxHP","WreyP8FmFH","D6rBypv0i7","JkzUnFxX9q","gIYvEsoy9t","s7MxkBbwgA",
+"n8pJ9JkzUn","Uvlv4Fhtgl","D6rByt59lR","2Yz7EZv7z0","5Mg9r5ZaEz","fqypypT8wu","5iGN5atef2","MK07Y0Kyfs","dmoS7nlaBy","Ss0ZuWaWsv",
+"Chuy3HzZT8","PYBf4Yh1hF","JIqXiIn3NS","U3yw5I7p2a","hi5X7djsrv","CK5W7lm0pD","k85AeIn3NS","iKqhrDQimp","DLhzMRmDcr","CIShGuvf7A",
+"lkMUAOHaBz","b29RJHP433","yvOMIQ6hMC","Pb1pa9eoRc","d85a9Z4I1v","zqH0WbZLvS","O3iyQhYBCK","ksJbyv1Hln","yEfy9i7WMQ","BpYhVQworu",
+"Yh1hFAmdQd","L7cGc5IhmG","d85a9tAOsr","oVQp6FwEJz","JIqXiWaim6","iwzGkix74r","pAhR1VjCZq","ksJbyM3zXL","45cIHydG8U","PYBf4FPfSE",
+"AmdQdGrDg7","55rfBAXpwE","b29RJRmDcr","OUYuFlpF6W","vkCHHgdQsS","AIYUuK20wK","fLNg88FmFH","tAOsrkB5nP","EdBKcK20wK","S77LHtl72W",
+"pmeCdCK5W7","jfREuAmdQd","5ZaEzlj07Q","pAhR1uPX7G","uvf7ApWiOs","S77LHuAWyp","xXTI4HRxd8","hSSvQFFDui","nlaByOxWIH","mX2GEF6PT2",
+"lViBvuJScX","CdyBVv1Hln","taOXKNxx9V","MojnPpAhR1","pvgjSMmKGJ","uupzkgf8rI","Mm8siO3iyQ","6AFT0O3iyQ","gf8rIjfREu","AOgEeMmKGJ",
+"1j5L8Mkgy8","UlU3MjzUqR","Twano8RCUA","yofH3l83Ud","WMiS35Namm","5iGN52Nslm","WreyPJKWYR","8U2nU0ao3l","3weIF0YAGH","UlU3MIjTwP",
+"UmaEvqQxHP","ydG8Ui3pyd","xXTI4kB5nP","HP433PYBf4","Dz1R3HlUbF","jtn0XcL0aE","NhXdu6AFT0","L7cGcogLgc","WmadA24ARF","fLNg8k85Ae",
+"WaWsvs7Mxk","Ul4a1lweGy","FPfSEFVMxo","1v5hHni2v1","7X3uybgJAz","yofH39y4lw","zY1GYgjUTu","iqv4kpiJSk","tAOsrSbRYy","IKxdLqaofN",
+"dpe1vpmeCd","zmLYDIjTwP","MaJQs9GXkX","3weIFQ6Lix","okgRioVQp6","Cfgr3uupzk","AkKTk9y4lw","pWiOsrz7Ut","lm0pDW7cTs","dhSuH7lUXZ",
+"ulk41piJSk","ZUnqtzz4ZU","blLA9L7cGc","7fKYUcQOnv","WDVWJ0h1b1","uPX7G55rfB","FLsph07n1c","FLsphqUJMd","AOgEeVNCPd","gf8rIpmeCd",
+"Cfgr3jiVBP","n8pJ9i7WMQ","ZJTXHI7p2a","5IhmGhE1Ql","6AFT0AgJHQ","oQ87rOz8yZ","pWiOsRpBQm","yluBxazIWp","YOfrYxXTI4","HzZT8BGaQY",
+"fqypy4dEz6","1LB1LSs0Zu","PYBf4W3VFH","n8pJ9uQIcz","OHaBzTCgPp","y94nwd7vjM","sx5GlFjHXR","CK5W77Ow5C","OUYuFAOgEe","KZamHThjNn",
+"JIqXihe9IA","qUJMdQWxoT","JIqXiAOgEe","ix74rguMb8","ni2v1GXdoH","GXdoHJRJQB","aez9ySbRYy","AXpwEcShY2","yToGWs93Ml","fLNg86q6L9",
+"GXdoHoQ87r","OxWIHix74r","he9IAlsQGo","QssNCguMb8","HfyNQS2Dfu","y94nwJXljW","DLhzMQYxC0","d7vjMbgJAz","tlILtbrhlQ","1j5L8v8yFN",
+"FjHXRQ6Lix","AkKTkL7cGc","M6qcGJJs5m","aL6AJ580YD","HP433JIqXi","dmoS7jfREu","GWqqXv2eC3","2hEEUiKqhr","v8yFNyvOMI","HzZT87Ow5C",
+"DG4sTQ6hMC","i3pydQ6Lix","Yf2EcW7cTs","I7p2ayofH3","Dz1R3TCgPp","XflUqOz8yZ","rz7UtkZANm","Yf2EcazIWp","ZuDtDydG8U","QYxC0nlaBy",
+"PYBf4vOqCE","GrDg7CqqaD","iqv4kP6bcg","faHirYjB9t","YjB9tpWiOs","BbwgACxVEf","oQ87rBFkb8","TCgPph1zcH","dpe1vi3pyd","x3LDeBGaQY",
+"CK5W7yluBx","oGu6xokgRi","ECMvUOz8yZ","NAFuwLDk6f","HzZT8WMiS3","45cIHVIlwP","m4bxU5Drn0","AXpwEm4bxU","tlILtFxX9q","Ss0Zu7lUXZ",
+"ogLgc5iGN5","hYBCKX6Pin","t98iWLewvM","JkzUnzY1GY","ydG8UECMvU","WMiS35ZaEz","lpF6WRkQke","1j5L8lCMxy","FGzgpn8pJ9","WPmlxEoToP",
+"mX2GEzQt6Q","xReecVjCZq","MaJQsSWfou","JJs5mXyPZN","FjHXRv1Hln","pT8wueuZA5","GSQwj7ku1p","zbIYYuTacx","HfyNQReKEW","Chuy3i3pyd",
+"ECMvUuupzk","jeskSx3LDe","aL6AJFcWrW","jzUqRYOfrY","pT8wuuPX7G","tvdkDDG4sT","aFFssEdBKc","9y4lwGXdoH","ix74rxXTI4","RzaZA2TRI7",
+"DcpWBdpe1v","2Yz7ESWfou","CK5W7x3LDe","lsQGo0ao3l","DG4sT8hJdt","zz4ZU9y4lw","hUTw7Cfgr3","5ZaEzCp3mZ","taOXKRBhp0","MmsIoAOgEe",
+"QssNCzz4ZU","jeskSoQ87r","vLsmSzFgtB","6AFT05ZaEz","okgRiReKEW","7X3uySWfou","hUTw7Q6hMC","DG4sTo8Uyd","1j5L8k85Ae","s93MlnnP8o",
+"MmKGJuQIcz","kB5nPFwEJz","v8yFNVerEA","fmIK1hUTw7","v8yFNZuDtD","fcwDauQIcz","RBhp0ThjNn","7fsYMNAFuw","MmsIogtCA5","v1HlnDQimp",
+"LbRTHrKDLJ","QWxoTaL6AJ","K20wKUl4a1","C2IrcDcpWB","JRJQBLbRTH","v2eC3BpYhV","1v5hH5Namm","0h1b1d7vjM","fqypyjfREu","aFFss0YAGH",
+"tl72WX6Pin","Ss0Zu2ZHdk","0MR5XydG8U","ulk41ECMvU","lCMxyZuDtD","8TxD7QWxoT","pmeCdAgJHQ","9iGoTNcICA","I7p2aMm8si","AOgEeB3qem",
+"BCxeCQYxC0","PYBf4I7p2a","P6bcg9XyT9","Zv7z02Nslm","No0QbzY1GY","lweGyaFFss","0ao3l8U2nU","xXTI4DQimp","cmXIXWMiS3","6AFT0t59lR",
+"MezSWM6qcG","DG4sTlXFOB","cmXIXgjUTu","VLTy6WaWsv","5IhmGOUqFM","sqVrffcwDa","MmKGJFFDui","WreyP5ZaEz","ru4UGd7vjM","AkKTkRACuj",
+"prNT6JIqXi","uZPqgh1zcH","RmDcrFhtgl","gjUTuECMvU","0MR5XAkKTk","14FLRiqv4k","oQ87rIjTwP","kB5nPd7vjM","W3VFHWmadA","GSQwjpFrrl",
+"RpBQm5IhmG","kZANmAgJHQ","L7cGcgIYvE","pmeCd55rfB","64s8NQChxs","uvf7AAOgEe","RBhp0hYBCK","QWxoTlpF6W","FNYIMEdBKc","n1pmOeuZA5",
+"WDVWJRkQke","zz4ZUfcwDa","n8pJ9jeskS","jtn0XJXljW","KASQ8zz4ZU","DG4sTn1pmO","tAOsrL7cGc","FVMxoZUnqt","x3LDeFFDui","JRJQBYOfrY",
+"8hJdtlsQGo","faHirs93Ml","StlDJK20wK","RsQUqFnPFB","SWfou2hEEU","9XyT9MGlTF","s93MlOHaBz","aez9yWaim6","CIShGRACuj","7hyVvZhwG1",
+"Pb1pazmLYD","WDVWJVBjhz","blLA9Kr8ys","QClRLvkCHH","hUTw7wiHrZ","zQt6Q8xEKz","jSjS3prNT6","y94nwWaWsv","zbIYYbgJAz","VBjhz9XyT9",
+"lj07QdhSuH","B3qemgtCA5","k85AeTXQ0Z","5nmWv3weIF","AXpwECdyBV","uZPqgx3LDe","Yw2oU5VZjS","MezSWpmeCd","k85AeAXpwE","0h1b1Y1mC0",
+"FVMxooVQp6","m4bxU618Di","Mkgy8Pb1pa","gtCA55Mg9r","M3zXLZv7z0","he9IAzHF1q","W3VFHQWxoT","ydG8UkB5nP","fcJOylH1kt","8xEKz3weIF",
+"cQOnvuoStw","1v5hHlkMUA","tAOsr4QMc9","qaofNFGzgp","iB08lxciqp","OxWIHP6bcg","0PktIAgJHQ","8U2nU5iGN5","BGaQYzHF1q","aez9yru4UG",
+"WaWsvvkCHH","Chuy3ZUnqt","6q6L9qaofN","gIYvEpiJSk","Pb1pa5Drn0","Mm8si0MR5X","dhSuH0Wr5y","VerEAEoToP","dmoS7v2eC3","2TRI72TRI7",
+"AmdQdGv3Fq","AgJHQoGu6x","IRh48OHaBz","WMiS3rz7Ut","lCMxys93Ml","7fsYMWaWsv","HfyNQpiJSk","lpF6WtvdkD","t98iWJXljW","bZLvS8xEKz",
+"ReKEW7lUXZ","yEfy9sx5Gl","Cfgr3WaWsv","0YAGHK4GS8","9XyT9IjTwP","QClRLSjskQ","zz4ZU4QMc9","lXFOBRkQke","pvgjSRzaZA","5IhmGgf8rI",
+"fLNg8J2mQi","lpF6WIKxdL","D6rByzz4ZU","7Ow5Cx3LDe","5IhmGAgJHQ","AOgEeEoToP","lkMUAUvlv4","RzaZAdpe1v","iqv4k48cHL","16lHc1LB1L",
+"lsQGozY1GY","m4bxUCK5W7","oVQp6d7vjM","U3yw5GXdoH","ni2v1MojnP","FwEJzZ4I1v","L7cGcIn3NS","lH1ktUmaEv","SmGzvAmdQd","aL6AJyofH3",
+"Oz8yZCIShG","24ARFRzaZA","FLsphFFDui","ReKEW8xEKz","fFDrJMmKGJ","s93Ml64s8N","d85a9VjCZq","pAhR1Twano","bgJAzbZLvS","atef21j5L8",
+"ix74rStlDJ","ogLgcvLsmS","lViBvAIYUu","2TRI7BbwgA","9eoRcpmeCd","OxWIHuAWyp","4dEz6cL0aE","gdQsSgjUTu","x3LDeNOHsz","HfyNQ5nmWv",
+"SbRYyVjCZq","HfyNQWaWsv","tAOsrhYBCK","Dz1R3okgRi","dmoS7zQt6Q","CK5W7GSQwj","14FLR8xEKz","jiVBPCK5W7","WreyP5nmWv","zmLYDyEfy9",
+"rz7Ut3weIF","yluBxKZamH","n1pmO7ku1p","zbIYYzmLYD","AOgEelH1kt","h1zcHVprf2","jiVBPZJTXH","YjB9tM6qcG","a00b5Y1mC0","uZPqgt59lR",
+"48cHLs93Ml","Yf2EceuZA5","LewvMpWiOs","8U2nU1LB1L","8cVD3QYxC0","3weIFxReec","vOqCEoGu6x","lCMxyKsjRK","v8yFNP6bcg","VIlwPFLsph",
+"3weIF4W0Tl","XyPZN5ZaEz","ZhwG1pv0i7","ThjNnGrDg7","VIlwPEOE1o","hE1Qlv1Hln","L7cGcNxx9V","CK5W7pvgjS","RACuje6e4z","8cVD3sqVrf",
+"DQimpSWfou","ZuDtDZuDtD","l83UdSWfou","DQimplCMxy","xciqpSmGzv","FLsphlkMUA","pFrrlNxx9V","nFqikkB5nP","Yw2oUGSQwj","IjTwPMkgy8",
+"yofH3djsrv","ThjNnlkMUA","OUqFMTCgPp","9XyT9rz7Ut","hYBCKQClRL","cL0aENAFuw","7hyVvKr8ys","aDGtScQOnv","2NslmjzUqR","n8pJ9QChxs",
+"9XyT9b29RJ","EOE1oIRh48","LDk6fStlDJ","ciuWzYjB9t","dmoS78TxD7","ZhwG1VIlwP","RACuj0Wr5y","fcwDaMmKGJ","lXFOB7fKYU","9XyT9XyPZN",
+"AmdQdMm8si","YjB9t618Di","5NammFnPFB","ni2v1azIWp","580YDRBhp0","hUTw7sx5Gl","QnJ1SfFDrJ","TXQ0ZpvgjS","580YDxReec","5drc6Yf2Ec",
+"nnP8oPOUYS","SWfouW7cTs","X6PinNxx9V","rz7UtWMiS3","yToGWyEfy9","jeskSFLsph","DQimpsx5Gl","v2eC3Fhtgl","RkQkeRpBQm","wDajXQworu",
+"lCMxyjeskS","5IhmGzQt6Q","Yf2EcAkKTk","CK5W7Cfgr3","Fhtgl7hyVv","jeskS0Kyfs","guMb87hyVv","IRh484QMc9","qUJMdMezSW","9GXkXtjQxs",
+"ReKEWzY1GY","7fKYUs4786","uZPqgFhtgl","O3iyQ9eoRc","ciuWzKr8ys","FnPFB9GXkX","dpe1vuJScX","2TRI7QYxC0","CdyBVOUYuF","lkMUA7hyVv",
+"AkKTkRsQUq","jS1ajWaWsv","1LB1L5nmWv","taOXKzqH0W","7Ow5CCxVEf","O3iyQYw2oU","618DiJkzUn","G1RhS7fsYM","7fKYUhYBCK","5Mg9r2Yz7E",
+"Vprf2In3NS","QbxXc3weIF","TwanoHP433","pv0i7lm0pD","iB08lrKDLJ","iqv4k24ARF","LDk6fjfREu","vkCHH64s8N","s93Mlk85Ae","ZUnqtuvf7A",
+"HRxd8VNCPd","No0QbFnPFB","0Wr5y8cVD3","BbwgAuN6r3","xReecVLTy6","gf8rI5Mg9r","9y4lw48cHL","tjQxs0BmCy","lsQGozbIYY","hUTw7tvdkD",
+"3weIF0PktI","rKDLJIjTwP","ogLgc7X3uy","ni2v1l83Ud","oQ87rpAhR1","0ao3ld85a9","zY1GYdpe1v","6q6L9brhlQ","5NammciuWz","tAOsrK4GS8",
+"Q6hMCMGlTF","JRJQBZuDtD","Mkgy88xEKz","yEfy9tlILt","ni2v17Ow5C","uN6r3i3pyd","uZPqgRzaZA","kZANmCqqaD","pmeCdCxVEf","jfREuNo0Qb",
+"uQIczZ4I1v","24ARFPb1pa","b29RJfLNg8","QnJ1SQWxoT","OxWIHjiVBP","S2Dfusoy9t","euZA5OxWIH","IBe8kSjskQ","FVMxoeuZA5","MojnP24ARF",
+"xXTI4x3LDe","iqv4ksoy9t","TCgPp9rlg9","0PktILewvM","2DREsiKqhr","yToGWGrDg7","No0Qb8RCUA","fqypyOz8yZ","MezSWlj07Q","kZANm16lHc",
+"lXFOBZUnqt","lCMxyX6Pin","OUYuF2ZHdk","LbRTHtaOXK","v8yFNpmeCd","4dEz64dEz6","ReKEWCfgr3","uN6r3iB08l","64s8N1v5hH","iB08lBCxeC",
+"Uvlv4UlU3M","6AFT0Oz8yZ","ix74rlsQGo","LbRTHlpF6W","yEfy9iB08l","4dEz6Uvlv4","IjTwPNo0Qb","Cfgr3RsQUq","uoStwDcpWB","v1HlnuTacx",
+"tjQxszFgtB","cmXIXUvlv4","618DiNhXdu","L7cGcGSQwj","l83UdaFFss","0ao3lZUnqt","ZhwG1uZPqg","AgJHQuPX7G","ydG8UCNHmv","aL6AJ2Yz7E",
+"v8yFNuQIcz","fmIK1euZA5","DQimp8TxD7","QChxs24ARF","t59lRFNYIM","xXTI4ksJby","Mm8siblLA9","HP4330Kyfs","VLTy6qQxHP","gtCA545cIH",
+"7X3uy9eoRc","CdyBV9y4lw","AOgEe5iGN5","Ss0ZuJJs5m","cShY2AgJHQ","prNT69XyT9","0KyfsFjHXR","n8pJ9iqv4k","xciqpFGzgp","CK5W7BbwgA",
+"aL6AJQ6Lix","iwzGkJIqXi","BbwgAlpF6W","yvOMIcmXIX","CdyBVHzZT8","FLsphFnPFB","he9IADLhzM","VBjhzYOfrY","oQ87rdhSuH","D6rBylkMUA",
+"FVMxokZANm","brhlQwDajX","blLA9soy9t","WMiS3BCxeC","RxrsmQbxXc","lCMxyyofH3","Oz8yZzQt6Q","wiHrZGXdoH","580YDIn3NS","tvdkDRmDcr",
+"uAWypv8yFN","JKWYRdjsrv","h1zcHDLhzM","tvdkDrhl0J","8RCUAIRh48","SjskQ8xEKz","5VZjS5IhmG","S77LHBFkb8","2hEEUuJScX","0Wr5yRxrsm",
+"U3yw5zFgtB","s7Mxk07n1c","VNCPduLtKs","In3NSazIWp","LbRTHYh1hF","AgJHQAXpwE","blLA9X6Pin","8U2nUni2v1","TXQ0ZmX2GE","y94nwMGlTF",
+"NhXdux3LDe","ZzJHWZ4I1v","cQOnvzHF1q","DcpWBCfgr3","ulk41uupzk","qaofNCK5W7","piJSkqaofN","jzUqRFVMxo","i7WMQNxx9V","CdyBVECMvU",
+"CxVEfGWqqX","piJSkHRxd8","n1pmOd7vjM","K20wKDG4sT","jtn0XnlaBy","ReKEWVNCPd","Z4I1vZzJHW","cQOnvQnJ1S","MojnPix74r","0PktItvdkD",
+"4QMc9ciuWz","CxVEf7fKYU","soy9twDajX","QChxsksJby","0MR5XjeskS","djsrvv1Hln","FGzgpNxx9V","k85AeEOE1o","Ul4a1QYxC0","uLtKsrhl0J",
+"i3pydUlU3M","U3yw5cQOnv","hE1QloQ87r","0BmCy0ao3l","C2IrcHRxd8","4QMc9ydG8U","yvOMIF6PT2","OUqFMDG4sT","Pb1paFcWrW","okgRi8TxD7",
+"jtn0X48cHL","AkKTkm4bxU","oQ87rpv0i7","FwEJzFFDui","lj07QZv7z0","Fhtglm4bxU","DLhzM8hJdt","W3VFHd85a9","ru4UGK20wK","FnPFB7lUXZ",
+"Fhtgl1LB1L","580YD7fKYU","RBhp0SmGzv","HRxd8nnP8o","9eoRc5VZjS","618DiFLsph","b29RJ2TRI7","lweGyv1Hln","0Wr5yIKxdL","M6qcGUlU3M",
+"7fKYUZuDtD","KsjRK9eoRc","ZhwG1RzaZA","9eoRcksJby","Q6Lix7fsYM","ZJTXHyEfy9","s7MxkC2Irc","zbIYY2Yz7E","hUTw77hyVv","tjQxs1j5L8",
+"MojnPIjTwP","cQOnvix74r","FcWrW2ZHdk","QnJ1SJkzUn","t59lRGSQwj","ni2v1pT8wu","QWxoT5ZaEz","lpF6WbrhlQ","uoStwjS1aj","S77LHyvOMI",
+"KZamHblLA9","oGu6xKZamH","aFFssMkgy8","pmeCdmz8gx","AOgEezmLYD","fLNg8AXpwE","8RCUAMK07Y","AmdQdsuY4x","XyPZNzbIYY","ZUnqtRACuj",
+"8RCUA16lHc","Gv3FqRpBQm","pmeCdJJs5m","6q6L9ulk41","sx5GlZhwG1","mz8gxv1Hln","xReecRzaZA","tjQxsx3LDe","WmadA9rlg9","lCMxykB5nP",
+"IKxdLvOqCE","EdBKc7Ow5C","Uvlv4Pb1pa","VerEAYjB9t","Nxx9VSs0Zu","K20wK5Namm","QWxoTZuDtD","m4bxUBbwgA","PYBf43weIF","7lUXZVprf2",
+"AOgEe0YAGH","pvgjSlViBv","uJScXM6qcG","fFDrJMGlTF","5iGN5lH1kt","tl72W16lHc","rhl0JCqqaD","U3yw5K20wK","xciqpYOfrY","ru4UGAXpwE",
+"4QMc9b29RJ","BFkb89eoRc","5VZjS0YAGH","YOfrYYOfrY","lXFOBzQt6Q","jiVBPy94nw","VerEAxReec","MGlTF5Namm","OHaBzGXdoH","7Ow5CpAhR1",
+"0Kyfsh1zcH","FxX9qtAOsr","lkMUAIRh48","5drc6RzaZA","5nmWvuZPqg","7hyVvfmIK1","fLNg8ydG8U","YOfrYiKqhr","dQ586AkKTk","cShY2brhlQ",
+"hSSvQS2Dfu","jzUqRCxVEf","Oz8yZlkMUA","jtn0XazIWp","sqVrfBCxeC","ix74rHlUbF","4dEz6NAFuw","FcWrW7fsYM","tAOsryEfy9","CIShGReKEW",
+"45cIHQYxC0","7lUXZWreyP","lkMUAQbxXc","FnPFBQnJ1S","AOgEedjsrv","MojnP6AFT0","MGlTFHlUbF","TwanotjQxs","ciuWz0BmCy","EOE1oBpYhV",
+"TwanoTXQ0Z","14FLRTwano","gjUTu0BmCy","EdBKcNAFuw","fcJOyxReec","8xEKz4dEz6","RzaZAFNYIM","prNT6fcJOy","DG4sTtjQxs","BFkb8Yw2oU",
+"WaWsvuJScX","xXTI45Mg9r","tl72WUvlv4","lViBvoQ87r","dmoS7LbRTH","sx5GlsuY4x","pmeCdYf2Ec","AIYUu5nmWv","oQ87rxciqp","xReecAkKTk",
+"s4786zHF1q","2Yz7EChuy3","uLtKsMK07Y","uupzkDG4sT","jSjS3sqVrf","iKqhrlj07Q","QYxC0iqv4k","RkQkeLbRTH","uTacxciuWz","ni2v1W3VFH",
+"fcJOyAgJHQ","s93MlMK07Y","zz4ZURACuj","lm0pDeuZA5","d7vjMfmIK1","fcJOyBCxeC","HP433ulk41","pvgjSvLsmS","uAWypWmadA","DG4sTsuY4x",
+"tuDySP6bcg","8xEKz5Namm","9y4lwpT8wu","BFkb8Qworu","t59lRKsjRK","NOHsz1v5hH","jtn0Xxciqp","qUJMd6AFT0","jeskSpT8wu","azIWp8TxD7",
+"24ARF7ku1p","sqVrfLbRTH","zY1GY24ARF","9XyT9rKDLJ","9y4lw9GXkX","gf8rIiqv4k","Yw2oUD6rBy","5Mg9rhi5X7","DcpWBMezSW","pv0i7Uvlv4",
+"i7WMQSbRYy","i7WMQIjTwP","aez9yGv3Fq","Ul4a1NOHsz","ogLgcWmadA","uAWypnFqik","i3pydDLhzM","uJScXFNYIM","kZANma00b5","M3zXLqaofN",
+"Ta8f6O3iyQ","M6qcGmX2GE","7hyVvpvgjS","Yf2EcZv7z0","faHirAkKTk","rKDLJuPX7G","9eoRcni2v1","qQxHPHzZT8","5VZjSTwano","zY1GYyEfy9",
+"ydG8UyvOMI","LDk6fv8yFN","GXdoHiKqhr","qUJMd618Di","zFgtBy94nw","NhXduiwzGk","29QAzdQ586","6q6L96q6L9","fFDrJMkgy8","5IhmGi7WMQ",
+"aez9yM3zXL","hSSvQlH1kt","ReKEWZJTXH","KZamHoGu6x","0KyfsIKxdL","0Wr5yCfgr3","5IhmGtaOXK","cQOnvNo0Qb","Ss0ZuTCgPp","G1RhSfmIK1",
+"yEfy9euZA5","wDajX0h1b1","l83Udxciqp","AOgEeOxWIH","qUJMdvLsmS","M3zXLvLsmS","n1pmOzqH0W","iqv4kPb1pa","hUTw7JKWYR","xXTI45nmWv",
+"RkQke7hyVv","AOgEeNOHsz","ZUnqtvLsmS","sx5Gl1v5hH","NcICAQ6Lix","zqH0WTXQ0Z","TCgPpW3VFH","ZJTXHdQ586","lViBvbZLvS","ZuDtD0h1b1",
+"7fKYUGSQwj","55rfBwiHrZ","tlILtMm8si","NcICAEOE1o","uvf7Ax3LDe","e6e4zv8yFN","vkCHH5VZjS","Cp3mZpv0i7","ZzJHWciuWz","MojnPaL6AJ",
+"lCMxy07n1c","CqqaDWreyP","45cIHoQ87r","lj07QHRxd8","PYBf42Nslm","HP43329QAz","vLsmS45cIH","ydG8URpBQm","0YAGHqQxHP","G1RhSm4bxU",
+"D6rBypmeCd","FFDuilViBv","wiHrZl83Ud","JRJQBpAhR1","45cIHC2Irc","FxX9qgf8rI","WPmlxtvdkD","GrDg764s8N","HRxd87hyVv","jSjS3oGu6x",
+"5iGN5x3LDe","BbwgANxx9V","9iGoTaL6AJ","gf8rICIShG","VNCPdAXpwE","FcWrWoGu6x","No0Qbrz7Ut","VerEAFhtgl","ulk41qaofN","jiVBPBFkb8",
+"VLTy6YOfrY","5Mg9r2TRI7","oGu6xdpe1v","I7p2adjsrv","pv0i7M6qcG","HP433xXTI4","KsjRKl83Ud","9rlg9618Di","IBe8kEdBKc","aDGtSFGzgp",
+"5NammlpF6W","LewvMy94nw","Q6hMCqQxHP","l83UdAmdQd","hi5X7b29RJ","Uvlv4cmXIX","uLtKsCxVEf","ECMvUcmXIX","S2Dfu0BmCy","FxX9q07n1c",
+"1j5L8YjB9t","i7WMQbrhlQ","s4786hUTw7","YjB9t2ZHdk","Uvlv4iqv4k","FxX9qqUJMd","uPX7GFNYIM","S2Dfu0Kyfs","tAOsrQworu","v2eC3lpF6W",
+"vLsmSZhwG1","dmoS7AXpwE","FnPFBhE1Ql","DG4sTJkzUn","0KyfsGXdoH","pT8wuMojnP","NAFuwuupzk","ix74rlj07Q","WPmlxazIWp","Q6LixNo0Qb",
+"VIlwPksJby","s93MlwDajX","NAFuwFFDui","guMb8ulk41","4QMc9tjQxs","ECMvUTa8f6","5VZjSmX2GE","jzUqRNo0Qb","jzUqRQ6hMC","OUYuF1v5hH",
+"29QAzCK5W7","xReecFGzgp","d7vjMVLTy6","euZA55drc6","JRJQB580YD","WreyPS2Dfu","LbRTHOUqFM","S77LHThjNn","faHirW7cTs","aFFsslH1kt",
+"jtn0XB3qem","FVMxoIBe8k","zz4ZU5VZjS","sqVrfaL6AJ","RpBQmk85Ae","m4bxU0h1b1","euZA5ru4UG","XyPZNFcWrW","hE1QlzHF1q","v2eC3vLsmS",
+"FxX9qpAhR1","Cfgr3Q6Lix","16lHcgIYvE","UlU3MjfREu","0YAGHix74r","BbwgACK5W7","uAWyp5VZjS","G1RhS580YD","ZJTXHbgJAz","NAFuw7ku1p",
+"fFDrJEoToP","L7cGcBCxeC","kZANmxXTI4","5Mg9rAgJHQ","WmadAfFDrJ","MK07YPb1pa","Waim6y94nw","618DitjQxs","8TxD7ReKEW","mX2GEk85Ae",
+"618DisqVrf","n8pJ9ThjNn","nFqikDG4sT","14FLRkB5nP","MaJQs0Wr5y","RsQUq0h1b1","RpBQm5Namm","fcwDauAWyp","8cVD3pmeCd","Cp3mZoGu6x",
+"WreyPpv0i7","DcpWBAIYUu","lkMUAuJScX","fFDrJl83Ud","HlUbFrz7Ut","Oz8yZKr8ys","GWqqXuTacx","VIlwPfqypy","HfyNQcmXIX","GrDg7MK07Y",
+"yluBxIn3NS","pFrrl8cVD3","JKWYRM3zXL","EOE1o6q6L9","OUYuF8cVD3","5NammCqqaD","uAWypVerEA","SbRYyix74r","kB5nPI7p2a","MezSWlm0pD",
+"rhl0JuTacx","AOgEe64s8N","M6qcG7hyVv","48cHLd85a9","uZPqgAIYUu","8RCUAlkMUA","TXQ0Zy94nw","QnJ1SrKDLJ","pv0i72hEEU","5Mg9rpFrrl",
+"Dz1R3Mkgy8","rz7UtogLgc","QworuAmdQd","AmdQdgtCA5","v2eC3bZLvS","hYBCKni2v1","ECMvUUvlv4","DG4sTG1RhS","ni2v1tuDyS","uPX7GjS1aj",
+"FPfSEuZPqg","tlILtazIWp","l83UdUmaEv","lH1kthSSvQ","jS1ajFjHXR","euZA5dpe1v","uPX7GW3VFH","FPfSEokgRi","n1pmOs7Mxk","n1pmOEdBKc",
+"No0QbtlILt","nlaByEoToP","rz7Uthe9IA","2DREsBGaQY","QChxsHRxd8","zmLYDMojnP","l83UdyluBx","AmdQdAOgEe","MK07YJIqXi","MaJQsdQ586",
+"QbxXcv8yFN","ThjNnMGlTF","FxX9qDQimp","CxVEfCfgr3","TCgPpNOHsz","uAWyp7X3uy","RBhp0Q6hMC","9eoRc7lUXZ","ciuWztl72W","ru4UGAgJHQ",
+"7fsYM2TRI7","jtn0Xn1pmO","WMiS30MR5X","n8pJ9v1Hln","ReKEWAXpwE","guMb8qQxHP","0BmCyKZamH","DG4sTRBhp0","0BmCy2Yz7E","HRxd8s4786",
+"uTacxU3yw5","gjUTuguMb8","HfyNQL7cGc","iwzGk0Kyfs","VLTy6uN6r3","CNHmvgf8rI","48cHL5IhmG","sx5Gly94nw","ZUnqtMojnP","CqqaD0Kyfs",
+"lH1ktxXTI4","GWqqX5VZjS","ReKEWOxWIH","Oz8yZZUnqt","ECMvUGrDg7","W3VFHNOHsz","oQ87rlweGy","zbIYYSmGzv","uZPqgFLsph","CNHmvk85Ae",
+"8xEKzgdQsS","07n1c45cIH","uJScX618Di","0ao3lDz1R3","TXQ0ZD6rBy","lpF6WzY1GY","mX2GE5drc6","2DREs2ZHdk","uJScXMaJQs","BGaQYuJScX",
+"ciuWzOxWIH","ECMvUHP433","Cp3mZk85Ae","TwanoyToGW","J2mQituDyS","uoStwlViBv","SbRYyM3zXL","aL6AJQWxoT","K4GS87lUXZ","d7vjM5IhmG",
+"Yf2EcQnJ1S","jtn0XRkQke","MK07YNOHsz","RmDcrKr8ys","pT8wuuoStw","NOHszbrhlQ","WMiS3ZuDtD","5iGN5qUJMd","No0QbtAOsr","2hEEUPYBf4",
+"d85a9FPfSE","e6e4zCqqaD","VLTy6lm0pD","JIqXi7X3uy","uAWyptlILt","D6rByX6Pin","GrDg7OHaBz","euZA5euZA5","d7vjMReKEW","No0Qbix74r",
+"ydG8UBCxeC","aL6AJaFFss","ZzJHWv1Hln","Oz8yZRzaZA","l83Ud2DREs","yvOMICdyBV","pvgjS7fsYM","lsQGouTacx","GSQwjfcJOy","qQxHPlXFOB",
+"WMiS38hJdt","FNYIMLbRTH","zmLYDVIlwP","IRh480BmCy","HRxd8RzaZA","3weIFs93Ml","WaWsvo8Uyd","I7p2ab29RJ","JJs5mrhl0J","qaofN5iGN5",
+"8hJdtlweGy","xciqphe9IA","618Di64s8N","t98iWcL0aE","aDGtSuQIcz","yvOMIDLhzM","MezSWOz8yZ","tjQxsGXdoH","tAOsrwiHrZ","ZzJHW0BmCy",
+"45cIH29QAz","ydG8U6q6L9","gtCA5BFkb8","rhl0Jv2eC3","k85Ae0PktI","5nmWvIn3NS","hi5X7d85a9","BpYhV0ao3l","HlUbFMK07Y","XyPZN0ao3l",
+"5Mg9r8TxD7","i3pydcmXIX","QChxsWreyP","xciqpyvOMI","lViBv4W0Tl","v8yFN7X3uy","qQxHPRxrsm","RmDcrb29RJ","zbIYYjiVBP","fcJOy29QAz",
+"lH1ktQYxC0","0MR5XGWqqX","djsrv2Nslm","VerEAn1pmO","KZamHIKxdL","XyPZNbZLvS","16lHcVIlwP","M6qcGStlDJ","MezSWuvf7A","J2mQiHzZT8",
+"ulk417hyVv","Waim60BmCy","Gv3FqGrDg7","CqqaDxXTI4","GXdoHW7cTs","Nxx9VC2Irc","RmDcrUl4a1","HzZT8FwEJz","W7cTsHRxd8","WPmlxdQ586",
+"cQOnvOxWIH","16lHcblLA9","qUJMdQClRL","EoToPtuDyS","618DiyofH3","BCxeClXFOB","GWqqXMmsIo","5drc6cQOnv","X6PinRBhp0","h1zcHCfgr3",
+"euZA5NOHsz","dpe1vAIYUu","5iGN5fFDrJ","JXljWy94nw","brhlQ9iGoT","pAhR116lHc","5IhmG8cVD3","45cIHuN6r3","SbRYydjsrv","Nxx9VVprf2",
+"aFFssD6rBy","FVMxoJRJQB","0MR5X8RCUA","yvOMISjskQ","uvf7ARBhp0","RzaZA2ZHdk","MmKGJWMiS3","qQxHPYjB9t","RzaZANxx9V","i7WMQ8RCUA",
+"zQt6QGXdoH","9iGoTaDGtS","X6Pin0h1b1","pAhR1OxWIH","3weIFFhtgl","pWiOs4dEz6","gdQsS2Nslm","lH1ktWMiS3","QnJ1SoVQp6","W3VFHfaHir",
+"1v5hH4dEz6","QYxC0MezSW","YOfrYzqH0W","MK07YFPfSE","zqH0W64s8N","prNT6ZUnqt","h1zcHiwzGk","lsQGoReKEW","aDGtSVNCPd","SmGzvRACuj",
+"6AFT0yofH3","RmDcrfFDrJ","zbIYYQ6Lix","7fKYUZUnqt","JRJQBRzaZA","CqqaDxReec","Y1mC0uZPqg","uoStwv8yFN","fFDrJsqVrf","580YDeuZA5",
+"3weIFlpF6W","WDVWJl83Ud","AIYUuiKqhr","FjHXR8U2nU","y94nwlsQGo","ZzJHWCNHmv","ZUnqtLbRTH","SbRYyO3iyQ","hSSvQJRJQB","RzaZAlViBv",
+"SjskQtlILt","2ZHdk1v5hH","2DREspvgjS","Yw2oUVerEA","jSjS3vkCHH","NAFuwKsjRK","WPmlxoQ87r","2ZHdkFhtgl","FGzgpni2v1","m4bxUFxX9q",
+"pFrrlydG8U","J2mQiJIqXi","6AFT0QYxC0","HfyNQkZANm","ZJTXHwiHrZ","0PktIzFgtB","7Ow5CMkgy8","GSQwjxciqp","QnJ1SyToGW","hE1QlPOUYS",
+"HlUbFnlaBy","SmGzvIn3NS","7fsYMtlILt","1LB1LpiJSk","gtCA5o8Uyd","jeskSksJby","JJs5m5IhmG","Z4I1vCxVEf","OUqFMRxrsm","K4GS85ZaEz",
+"hYBCKzFgtB","07n1cECMvU","9GXkXQ6hMC","FGzgpQYxC0","0MR5XZhwG1","faHirTCgPp","CK5W7Twano","AgJHQoQ87r","AkKTkNAFuw","Cp3mZxXTI4",
+"I7p2aCIShG","9eoRcEoToP","O3iyQpFrrl","ZhwG1WmadA","5ZaEzfFDrJ","t98iWDQimp","MmsIod7vjM","iB08lOUqFM","lpF6WFFDui","BCxeCSmGzv",
+"O3iyQAOgEe","TwanoQworu","UmaEvfcwDa","FnPFBa00b5","hYBCKeuZA5","rhl0Jy94nw","5drc6K20wK","cmXIXAOgEe","K4GS8ciuWz","zbIYYMkgy8",
+"ECMvUCfgr3","faHiraL6AJ","fFDrJHP433","EOE1oaL6AJ","Uvlv4s93Ml","Ta8f64QMc9","7X3uyVerEA","Waim65iGN5","MGlTF8xEKz","HfyNQ8TxD7",
+"uupzk8cVD3","hi5X7Oz8yZ","3weIFcShY2","xciqpcShY2","t59lRfqypy","8RCUAuLtKs","GrDg7zFgtB","FFDuiiwzGk","UlU3MjeskS","Ta8f6Qworu",
+"uTacxD6rBy","NhXduhYBCK","5Drn0FFDui","9y4lwvLsmS","AgJHQBGaQY","WMiS3PYBf4","yEfy9GWqqX","DQimpO3iyQ","EoToPThjNn","nnP8oOUqFM",
+"rz7Ut9eoRc","5VZjSNAFuw","0MR5XIBe8k","ru4UGTwano","zQt6QzbIYY","P6bcgAOgEe","FNYIMP6bcg","i7WMQe6e4z","MK07YNhXdu","J2mQiI7p2a",
+"gf8rI0Kyfs","mX2GENcICA","VjCZqtlILt","8U2nUWPmlx","uN6r38U2nU","VerEAbZLvS","rKDLJ55rfB","BCxeCQ6Lix","vkCHHfaHir","0KyfszY1GY",
+"CK5W7SbRYy","OxWIHCfgr3","aFFssjiVBP","Z4I1vtlILt","lXFOBcmXIX","JIqXidmoS7","fmIK17fKYU","WDVWJoVQp6","K4GS85Namm","Dz1R35nmWv",
+"J2mQii7WMQ","n1pmOzFgtB","sqVrft59lR","t59lRi3pyd","Oz8yZCp3mZ","5VZjSJJs5m","nFqik2Yz7E","xReeculk41","NcICAWmadA","d7vjMVBjhz",
+"dmoS7HzZT8","2Yz7EmX2GE","5nmWvsoy9t","5Drn0MmKGJ","uPX7GChuy3","MK07YlkMUA","5Drn0ReKEW","7ku1pZv7z0","RBhp0uQIcz","2Yz7ESbRYy",
+"DG4sTZzJHW","iKqhrDcpWB","yToGWlsQGo","KZamHcL0aE","EOE1ob29RJ","AgJHQAkKTk","s7MxkIBe8k","oQ87rECMvU","lpF6Wgf8rI","QChxs16lHc",
+"S2DfulViBv","uLtKs9GXkX","uvf7Asx5Gl","GSQwjBbwgA","jiVBPRpBQm","KZamHni2v1","0MR5XZuDtD","OUqFMaDGtS","AOgEeQnJ1S","gf8rIWaWsv",
+"uvf7A9GXkX","fqypyFxX9q","MmsIov8yFN","pmeCdxciqp","dQ586NAFuw","DLhzM8U2nU","5drc6azIWp","8FmFHAIYUu","ZUnqtpAhR1","ZzJHWIjTwP",
+"i7WMQUlU3M","m4bxUxciqp","HzZT8FLsph","3weIFS77LH","DG4sTcL0aE","0PktINo0Qb","9eoRc2Yz7E","RpBQmvOqCE","EOE1olCMxy","azIWpatef2",
+"8TxD70MR5X","he9IA7X3uy","RkQkezY1GY","mX2GEChuy3","64s8Nd85a9","NcICAOz8yZ","7ku1pfcwDa","Yw2oUcShY2","7hyVvX6Pin","Yh1hFni2v1",
+"AIYUuKASQ8","ulk41tAOsr","jzUqRMmsIo","O3iyQZJTXH","U3yw5YOfrY","aFFssBbwgA","VNCPdHzZT8","0h1b1UlU3M","8U2nU7fKYU","pAhR1AkKTk",
+"VjCZq5nmWv","fFDrJJKWYR","cQOnvhi5X7","lm0pDjeskS","jfREuXflUq","AmdQdCNHmv","ix74rIn3NS","soy9tBFkb8","zFgtBiqv4k","NOHszXflUq",
+"fcJOyKsjRK","5IhmGDG4sT","dmoS70MR5X","yToGWlm0pD","9XyT95VZjS","8xEKztuDyS","U3yw55ZaEz","nFqikvkCHH","pv0i79XyT9","cShY2fcJOy",
+"vLsmS6q6L9","7lUXZiB08l","QChxsjtn0X","AOgEeRBhp0","FFDuiQClRL","EdBKcXyPZN","3otm6Gv3Fq","dQ58648cHL","BGaQYRpBQm","WmadAY1mC0",
+"07n1cRpBQm","FLsphPYBf4","LbRTH2Yz7E","CdyBVzbIYY","OUqFM0ao3l","oQ87rVprf2","mz8gx0MR5X","7hyVvTa8f6","0YAGHzFgtB","8xEKzvOqCE",
+"KZamHhe9IA","RsQUqKsjRK","WreyPF6PT2","Z4I1vWaWsv","pT8wuM6qcG","uTacxTa8f6","uupzkaDGtS","Cfgr3QnJ1S","SWfouokgRi","WmadAuZPqg",
+"FNYIMjeskS","QChxsThjNn","cShY2NOHsz","uTacx8TxD7","WreyPBCxeC","QWxoTD6rBy","Qworu16lHc","XyPZNS77LH","0BmCyQssNC","FPfSEBGaQY",
+"ReKEW24ARF","9XyT9JRJQB","Rxrsm4dEz6","mz8gx9XyT9","9rlg9uoStw","v1HlnHzZT8","9iGoTazIWp","FnPFBzHF1q","sx5GlVprf2","fLNg8zz4ZU",
+"AIYUuJKWYR","UlU3MtjQxs","QnJ1SMm8si","JRJQBWPmlx","Dz1R3pAhR1","RACujLewvM","Q6Lixuupzk","SbRYyCdyBV","VerEARBhp0","iwzGk8xEKz",
+"QYxC0ni2v1","bZLvSSs0Zu","hUTw7DLhzM","i3pyd4W0Tl","v1HlnzqH0W","iwzGkRpBQm","5nmWv2Nslm","8U2nUwDajX","iKqhrWPmlx","lCMxy4QMc9",
+"K20wK4W0Tl","Ta8f6wDajX","WaWsvZJTXH","4dEz63otm6","i3pydvOqCE","i7WMQcmXIX","hUTw7hUTw7","C2IrcVIlwP","ZhwG1he9IA","sx5GlVjCZq",
+"BpYhVFGzgp","FLsphGXdoH","KsjRKNhXdu","EoToPaDGtS","IBe8kxXTI4","soy9tdjsrv","Mm8siFcWrW","zmLYD9eoRc","MezSWtlILt","C2IrclH1kt",
+"cmXIXCxVEf","SmGzvbrhlQ","WMiS3hUTw7","WPmlxs93Ml","OUYuFzHF1q","gjUTuuTacx","Ss0Zu7fsYM","9iGoTJJs5m","QbxXc8cVD3","xXTI4pvgjS",
+"CIShGQWxoT","iB08l5ZaEz","zQt6QTa8f6","Mkgy8mz8gx","FLsphU3yw5","X6Pinsx5Gl","Chuy3oGu6x","hUTw7yvOMI","prNT6K4GS8","yToGWni2v1",
+"xXTI42Nslm","wiHrZv1Hln","oVQp6LewvM","GSQwj0YAGH","0Wr5yHlUbF","ru4UG8xEKz","JRJQB618Di","tvdkDvkCHH","55rfBCK5W7","JXljWjiVBP",
+"HlUbFqUJMd","RACujAkKTk","ZUnqtzqH0W","QssNChSSvQ","dQ586Yf2Ec","NcICAMezSW","BpYhVokgRi","Mm8siJXljW","YjB9tGWqqX","VIlwP1j5L8",
+"aL6AJNcICA","nFqikChuy3","AgJHQBCxeC","I7p2a9iGoT","v2eC3IjTwP","gf8rIVNCPd","bgJAzfcwDa","Ss0ZuVNCPd","Gv3FqAIYUu","NhXduhE1Ql",
+"i7WMQGv3Fq","n1pmOYf2Ec","vkCHHcShY2","24ARFNcICA","S77LHMmsIo","QworuS2Dfu","6q6L9pmeCd","DLhzMcmXIX","guMb8AkKTk","KsjRK48cHL",
+"ulk41XyPZN","l83Ud9XyT9","5VZjSPb1pa","pv0i7RACuj","X6PinHP433","B3qemni2v1","rKDLJQWxoT","tAOsr5Namm","a00b5GWqqX","NAFuwlViBv",
+"tl72WKsjRK","i3pydd85a9","xciqpciuWz","oGu6x7ku1p","0h1b1ni2v1","azIWpzQt6Q","vLsmSMK07Y","ReKEWLbRTH","POUYS4W0Tl","dmoS78hJdt",
+"hSSvQxXTI4","oGu6xfFDrJ","fcJOyoGu6x","sqVrfnnP8o","Q6hMCn8pJ9","AkKTk7Ow5C","s4786lsQGo","5Mg9rHfyNQ","TXQ0Z618Di","qUJMdXflUq",
+"Ul4a1uupzk","FFDuiRACuj","uLtKstuDyS","FVMxohYBCK","5NammuN6r3","KsjRKYOfrY","uLtKsNcICA","WaWsvLbRTH","4dEz60BmCy","ogLgcdQ586",
+"hUTw7suY4x","pT8wuHfyNQ","ksJbys93Ml","zmLYDMm8si","VNCPd1v5hH","qaofN7lUXZ","zQt6Q1v5hH","SWfoubrhlQ","azIWpK20wK","djsrvjfREu",
+"fLNg8b29RJ","IRh48ix74r","MK07YDG4sT","xXTI4jSjS3","e6e4z7X3uy","9XyT9zQt6Q","J2mQiDz1R3","OUYuFjtn0X","5drc61LB1L","blLA9s93Ml",
+"16lHcM6qcG","FNYIMAmdQd","IRh48qaofN","pvgjSAgJHQ","tAOsrKr8ys","gjUTuNOHsz","aFFssHfyNQ","8xEKzDLhzM","AkKTkydG8U","8TxD7dhSuH",
+"lkMUARpBQm","v2eC3prNT6","ogLgcjS1aj","64s8N8FmFH","aDGtSG1RhS","AkKTkk85Ae","wDajXM3zXL","tAOsrxReec","Yh1hFZhwG1","KsjRK0Wr5y",
+"EoToP7fsYM","uPX7G4W0Tl","Gv3FqmX2GE","wDajXNOHsz","cQOnvhe9IA","SmGzvxReec","DQimpHlUbF","dmoS7RsQUq","ZhwG1QChxs","WDVWJ7hyVv",
+"yluBxYjB9t","rhl0Ja00b5","Oz8yZix74r","xXTI4Dz1R3","Pb1paoGu6x","ogLgcQChxs","7X3uyZzJHW","FwEJzW7cTs","uZPqghE1Ql","bgJAzMezSW",
+"Mm8si618Di","5iGN5tjQxs","MGlTFuPX7G","he9IAAkKTk","EOE1o2TRI7","IKxdL0BmCy","FjHXREoToP","Vprf22Yz7E","CNHmvDz1R3","yToGWsx5Gl",
+"WmadAFFDui","BbwgAKsjRK","l83UdogLgc","CqqaDRsQUq","IKxdLRmDcr","RBhp0vLsmS","6AFT0Mm8si","IjTwPChuy3","XyPZN14FLR","YOfrYTa8f6",
+"Cfgr3cL0aE","5ZaEzOHaBz","QbxXcZUnqt","K4GS8s4786","SmGzvS2Dfu","B3qemlj07Q","0PktIRBhp0","OUqFMv1Hln","rhl0JQWxoT","mz8gxb29RJ",
+"oGu6xzqH0W","uPX7G0Wr5y","C2IrchSSvQ","6AFT0aFFss","hSSvQFnPFB","OxWIHlj07Q","J2mQisx5Gl","ru4UG0MR5X","UlU3MqUJMd","uJScXsx5Gl",
+"K20wKvkCHH","8RCUAgtCA5","2DREsUvlv4","5Mg9rvLsmS","3otm6Chuy3","fcJOyt59lR","IBe8k3otm6","Chuy3pAhR1","xReecC2Irc","45cIHzqH0W",
+"HzZT816lHc","ksJbyuvf7A","JKWYRQssNC","jiVBPZhwG1","FVMxo9XyT9","fFDrJ64s8N","zqH0W0h1b1","zmLYDuQIcz","l83Ud9GXkX","lj07QpiJSk",
+"WaWsvTCgPp","prNT6b29RJ","0YAGH8U2nU","zqH0WdmoS7","SbRYy3otm6","cQOnvokgRi","HlUbFgIYvE","oGu6xuZPqg","pFrrlpiJSk","M6qcGUl4a1",
+"RmDcrK20wK","lkMUAwDajX","GXdoHJXljW","OxWIHnnP8o","JKWYRWMiS3","5nmWvvkCHH","bgJAzgdQsS","rhl0JThjNn","F6PT2F6PT2","h1zcH6AFT0",
+"yofH38U2nU","0Wr5yLbRTH","Mm8siuLtKs","AkKTkjeskS","CdyBVcShY2","oGu6xiKqhr","Chuy3fcJOy","AXpwEFnPFB","lm0pDatef2","0KyfsdQ586",
+"Yw2oUQ6hMC","IKxdLjzUqR","sqVrfHzZT8","zQt6QTCgPp","HP433Z4I1v","tvdkD618Di","5NammKASQ8","FwEJzO3iyQ","zz4ZUWreyP","tAOsrfFDrJ",
+"iqv4kEoToP","AkKTkEdBKc","5Mg9r07n1c","QworurKDLJ","VBjhzyToGW","9rlg9VLTy6","qUJMdSmGzv","KZamHZzJHW","8RCUAhUTw7","C2IrcuQIcz",
+"TwanoWaWsv","AIYUuzqH0W","WreyPMK07Y","IBe8kAXpwE","M6qcGfcwDa","NcICA45cIH","qQxHPCK5W7","ZzJHWuQIcz","ReKEW6AFT0","wDajXC2Irc",
+"5Mg9r0ao3l","8FmFHlXFOB","xXTI4EdBKc","QworuciuWz","1LB1LzbIYY","0PktIReKEW","yvOMIQnJ1S","ksJbySbRYy","uLtKs2TRI7","IjTwPtAOsr",
+"fFDrJyvOMI","9XyT9taOXK","Ta8f6IjTwP","kB5nPWMiS3","s7Mxkulk41","uAWypI7p2a","v8yFN0YAGH","ogLgcK20wK","CqqaD8xEKz","e6e4z5Drn0",
+"OUqFMGv3Fq","7fsYMlpF6W","JXljWuN6r3","VjCZqFNYIM","qUJMduTacx","OUYuFt98iW","ZzJHWCIShG","gtCA5lH1kt","jzUqRCNHmv","6q6L99GXkX",
+"i7WMQBFkb8","lXFOB5IhmG","580YDpFrrl","n1pmOlViBv","W3VFH9GXkX","pT8wuIRh48","QworuW7cTs","NOHszQbxXc","pFrrlHP433","kZANm7fKYU",
+"HfyNQYOfrY","K4GS8O3iyQ","dmoS7rz7Ut","24ARFzHF1q","cL0aEQYxC0","AIYUu2Nslm","W7cTsQWxoT","iwzGkjiVBP","zmLYDyvOMI","uZPqgUvlv4",
+"fFDrJUmaEv","xReecBGaQY","IjTwPrhl0J","kB5nPe6e4z","2Yz7EfmIK1","uTacxn8pJ9","DcpWBt98iW","AgJHQ4QMc9","gjUTuYjB9t","IRh48LewvM",
+"jS1ajLewvM","JIqXiJJs5m","OUYuFhSSvQ","pAhR1JJs5m","IRh48xXTI4","7hyVvQssNC","C2IrcpT8wu","9eoRcJRJQB","yluBxuPX7G","jfREuYjB9t",
+"M3zXL2hEEU","jeskSFxX9q","oVQp6prNT6","6AFT0zqH0W","S2DfuAmdQd","zz4ZUP6bcg","zbIYYdjsrv","iKqhrTXQ0Z","euZA5soy9t","jtn0XpiJSk",
+"LewvM1LB1L","uLtKsRBhp0","lsQGo3otm6","v8yFN29QAz","29QAzNxx9V","MojnPSjskQ","mz8gxJKWYR","MaJQsQYxC0","0PktIW7cTs","uLtKsGrDg7",
+"uAWyp5Mg9r","djsrvZzJHW","wDajXjtn0X","cL0aESs0Zu","xReecQWxoT","M3zXL8TxD7","iqv4k5iGN5","EdBKc8cVD3","07n1cIn3NS","DG4sTTXQ0Z",
+"v8yFNNo0Qb","JIqXiU3yw5","y94nwuupzk","yEfy9tuDyS","Mm8silCMxy","b29RJt98iW","B3qemO3iyQ","dpe1v5ZaEz","CdyBVprNT6","8cVD35iGN5",
+"aL6AJokgRi","0MR5XTa8f6","3weIFZzJHW","pvgjSe6e4z","AgJHQqQxHP","7hyVvpWiOs","HlUbFECMvU","TwanojiVBP","y94nw0h1b1","AXpwEO3iyQ",
+"2hEEUCNHmv","J2mQiJXljW","Yf2EcJ2mQi","jzUqRzQt6Q","mz8gxRsQUq","pv0i75drc6","MGlTFAmdQd","mX2GE5IhmG","qQxHPlH1kt","4QMc9QClRL",
+"9XyT9hi5X7","vkCHHSbRYy","FGzgpHP433","NOHszFjHXR","mX2GECqqaD","VerEAsoy9t","RBhp04W0Tl","POUYSZzJHW","WaWsvUlU3M","iKqhr8xEKz",
+"0h1b1ThjNn","Zv7z0tlILt","FxX9qzz4ZU","4QMc90Wr5y","X6Pinv1Hln","sqVrfBFkb8","OUqFMReKEW","7X3uyWMiS3","QChxs1v5hH","cQOnv1LB1L",
+"hUTw7uJScX","AkKTkn8pJ9","AgJHQGWqqX","ru4UGY1mC0","WreyPrKDLJ","SWfou9rlg9","iwzGkQClRL","WaWsvuTacx","ydG8UKZamH","1j5L8UmaEv",
+"iB08lhe9IA","HP4335Mg9r","RmDcr8xEKz","Ul4a1JkzUn","F6PT2WmadA","qaofNuTacx","lpF6WS77LH","d85a95drc6","1LB1LQ6hMC","d85a9KASQ8",
+"sx5GlHP433","AOgEeX6Pin","9iGoT0YAGH","pAhR1dpe1v","d85a9L7cGc","3weIFUl4a1","nlaByM3zXL","Dz1R35Namm","RmDcrkB5nP","bZLvSMezSW",
+"n8pJ9Pb1pa","2ZHdkMaJQs","16lHcFGzgp","BGaQYBGaQY","zY1GYazIWp","cmXIXix74r","ECMvUciuWz","IKxdLzY1GY","djsrvRzaZA","ZJTXHJkzUn",
+"7Ow5CIRh48","FLsphlXFOB","nnP8o3otm6","RzaZAksJby","9GXkXpmeCd","s7MxkQClRL","uLtKs07n1c","wDajXLDk6f","JXljWCK5W7","Cp3mZWDVWJ",
+"POUYSjiVBP","0h1b1aDGtS","MezSWIBe8k","FFDuiCp3mZ","EdBKc1j5L8","0PktIHfyNQ","mz8gx7fKYU","JIqXiUl4a1","4dEz6Chuy3","1v5hHn1pmO",
+"9rlg9ZuDtD","EdBKcbgJAz","Mm8si6AFT0","FGzgpazIWp","dQ586jS1aj","gdQsS2TRI7","8hJdt7X3uy","AXpwEPYBf4","yluBxNo0Qb","4dEz6kZANm",
+"tAOsrtl72W","oQ87rSWfou","pv0i7dmoS7","k85Ae3otm6","07n1c6AFT0","m4bxUlpF6W","d85a9HRxd8","ZuDtDzHF1q","0Wr5yh1zcH","Ss0ZuDQimp",
+"ReKEWBbwgA","POUYSThjNn","DcpWBWaWsv","ZUnqtfaHir","BbwgABbwgA","ksJbyatef2","MaJQsChuy3","okgRiMGlTF","GWqqXt59lR","F6PT2aez9y",
+"9rlg9NAFuw","xXTI4tAOsr","O3iyQuoStw","K4GS8prNT6","YOfrYZJTXH","In3NS7lUXZ","v2eC3n8pJ9","qaofN1j5L8","9GXkX7hyVv","suY4xSbRYy",
+"rhl0JOz8yZ","kZANm8xEKz","ksJbyRBhp0","ni2v11v5hH","MGlTF07n1c","n1pmOmX2GE","KASQ8Cp3mZ","5Mg9r45cIH","DLhzMGSQwj","2NslmFFDui",
+"2ZHdkt59lR","gtCA5CIShG","9rlg99rlg9","RpBQmdjsrv","uZPqg14FLR","gf8rI3otm6","fcJOyC2Irc","uoStwdmoS7","ThjNn2hEEU","x3LDejS1aj",
+"0h1b1J2mQi","IjTwPDcpWB","d85a9Cp3mZ","xReecXyPZN","SWfou8xEKz","WDVWJpv0i7","cL0aEAIYUu","zqH0Wi3pyd","W3VFHs7Mxk","QChxsjzUqR",
+"hSSvQP6bcg","JXljW9iGoT","FnPFBIBe8k","Mm8siUlU3M","CxVEfo8Uyd","ksJbyOUYuF","VerEAFPfSE","taOXKAOgEe","Pb1pak85Ae","M6qcGvkCHH",
+"ciuWzLbRTH","LDk6fJRJQB","No0QbJXljW","OUYuFbgJAz","8U2nUIRh48","uPX7GNcICA","xXTI4LDk6f","pFrrl5drc6","1j5L8RkQke","zz4ZUNAFuw",
+"pAhR1uTacx","QChxsOz8yZ","2ZHdkbrhlQ","v8yFNNAFuw","5iGN5Q6Lix","IjTwPpv0i7","64s8Ns93Ml","gIYvEM6qcG","QClRLpT8wu","n1pmOatef2",
+"S77LHZ4I1v","9iGoTlpF6W","7X3uyQChxs","AOgEevOqCE","B3qemaDGtS","iqv4kuQIcz","AkKTkl83Ud","0Wr5yydG8U","9eoRceuZA5","blLA9QClRL",
+"0Wr5yO3iyQ","IKxdL8TxD7","SjskQ1j5L8","MezSWzY1GY","AkKTkWPmlx","AOgEeydG8U","QbxXc2Nslm","9eoRcFLsph","kB5nP1LB1L","JXljWVprf2",
+"7fKYURsQUq","ru4UGRpBQm","0MR5XI7p2a","9rlg9ThjNn","gjUTuQ6hMC","e6e4zWPmlx","K20wKDQimp","t59lRPOUYS","AkKTk618Di","cShY2gtCA5",
+"BCxeCZuDtD","Vprf2blLA9","SmGzv8U2nU","7hyVvdpe1v","RpBQmlj07Q","lsQGoNhXdu","5nmWvlXFOB","uLtKs8U2nU","MezSWJkzUn","ZJTXHlCMxy",
+"2hEEUL7cGc","07n1czHF1q","FnPFBYjB9t","n8pJ9Q6Lix","NhXducL0aE","4W0TlFwEJz","FhtglazIWp","VBjhzs93Ml","Mm8siiB08l","pv0i7AgJHQ",
+"Z4I1vtuDyS","0ao3lgIYvE","IRh48bZLvS","5ZaEzFPfSE","EdBKcaDGtS","F6PT2ksJby","Vprf2M3zXL","tuDySVBjhz","5Drn0Pb1pa","IjTwPBbwgA",
+"blLA9h1zcH","jeskStAOsr","RsQUql83Ud","a00b5yofH3","1LB1LqUJMd","AmdQdMmKGJ","wiHrZdQ586","VjCZq5drc6","djsrvaL6AJ","Uvlv4gdQsS",
+"AXpwEuLtKs","lj07QMGlTF","64s8NbgJAz","9GXkXBpYhV","CK5W7oVQp6","prNT6i3pyd","Fhtgl7X3uy","a00b5EOE1o","BbwgAJIqXi","7lUXZAkKTk",
+"K4GS8yvOMI","0YAGHSmGzv","55rfBlXFOB","lXFOBW3VFH","hUTw7LewvM","Uvlv424ARF","lCMxyPOUYS","RmDcrrz7Ut","tlILtsqVrf","HlUbFNhXdu",
+"AOgEe16lHc","Ul4a15iGN5","Yh1hFO3iyQ","M3zXLK20wK","CdyBVS77LH","KASQ8aFFss","UlU3MOxWIH","zY1GYa00b5","KsjRKDLhzM","NAFuwNcICA",
+"FGzgpCfgr3","7X3uySbRYy","pFrrltjQxs","8cVD3SmGzv","FNYIMlweGy","3otm6WmadA","pv0i70h1b1","2ZHdk0ao3l","m4bxUaL6AJ","GrDg7CIShG",
+"RsQUqqaofN","7lUXZDQimp","NOHszjtn0X","b29RJ3weIF","uJScXQnJ1S","G1RhSPYBf4","8TxD7OxWIH","VerEAciuWz","lpF6WuPX7G","yToGWGSQwj",
+"FcWrWZ4I1v","gdQsSru4UG","W7cTs4dEz6","Ta8f6lweGy","v2eC3vOqCE","0MR5XZv7z0","TXQ0ZzQt6Q","OxWIHzqH0W","tjQxsn8pJ9","2NslmVIlwP",
+"Cp3mZRACuj","2DREszHF1q","14FLRRzaZA","m4bxUyvOMI","bZLvSTa8f6","In3NSCIShG","x3LDegdQsS","K4GS8RpBQm","0ao3ldpe1v","MojnPQssNC",
+"8xEKzLDk6f","KASQ8yluBx","oVQp67hyVv","07n1cnFqik","zbIYYZzJHW","he9IASWfou","CK5W7dpe1v","YOfrYZzJHW","dpe1vqaofN","DcpWBFcWrW",
+"piJSkjiVBP","x3LDevkCHH","lkMUAdmoS7","oGu6xcmXIX","BGaQYulk41","7hyVvokgRi","iKqhrgIYvE","ogLgcPOUYS","ni2v1IBe8k","1LB1L55rfB",
+"ni2v1GrDg7","iKqhrgdQsS","suY4xjS1aj","S2DfuWDVWJ","6q6L9jfREu","lsQGoF6PT2","xXTI4cmXIX","gIYvEsx5Gl","sx5GlCqqaD","v2eC3No0Qb",
+"SWfouIKxdL","FGzgpgjUTu","1v5hHP6bcg","Cfgr3a00b5","Ss0Zu48cHL","7lUXZjS1aj","tAOsrW3VFH","0h1b1ZJTXH","pT8wu7fsYM","VjCZqpWiOs",
+"uTacxuoStw","CqqaDKZamH","Ta8f69GXkX","qaofNWreyP","jfREuyofH3","gdQsSoQ87r","HzZT8Y1mC0","iwzGkFPfSE","b29RJbrhlQ","14FLRuJScX",
+"ciuWzfFDrJ","lpF6WZJTXH","RACujvkCHH","n1pmOVBjhz","zbIYYMm8si","ogLgcSmGzv","FxX9q7Ow5C","ZhwG1FcWrW","8TxD7zbIYY","RkQkeWaWsv",
+"lViBvlj07Q","7Ow5CQYxC0","RmDcr8hJdt","oQ87rFLsph","uvf7ATwano","580YDNxx9V","MmsIom4bxU","S77LHaDGtS","1LB1LiKqhr","FxX9qtaOXK",
+"QWxoT45cIH","Mm8siFFDui","WDVWJSWfou","vLsmSGrDg7","FcWrWDcpWB","uQIczJJs5m","HzZT8QChxs","suY4xjiVBP","IKxdLfaHir","2hEEUnnP8o",
+"580YDuPX7G","jzUqRUvlv4","h1zcHRACuj","dhSuHNo0Qb","YjB9tlkMUA","WmadAJ2mQi","KsjRK1LB1L","3weIFZJTXH","sx5GlYh1hF","9GXkX1j5L8",
+"aez9yzFgtB","lCMxyXflUq","SjskQ5Mg9r","16lHcatef2","zHF1qQnJ1S","atef2aL6AJ","OHaBzWPmlx","yluBxIBe8k","ksJbyFxX9q","DG4sT4dEz6",
+"lsQGoO3iyQ","lweGyMojnP","QworuM6qcG","BbwgARACuj","2NslmQYxC0","07n1cQ6hMC","uTacxM3zXL","Chuy3Mm8si","TXQ0ZsqVrf","QssNCxciqp",
+"Yf2Ec9iGoT","iqv4kyToGW","tlILta00b5","jS1ajl83Ud","nFqikNxx9V","ulk41wDajX","WreyPgdQsS","qQxHPaDGtS","IKxdLMaJQs","BpYhVkB5nP",
+"C2IrcqUJMd","fcwDa8cVD3","16lHcazIWp","9GXkXZv7z0","9XyT98TxD7","BpYhVtl72W","FwEJzsuY4x","L7cGcb29RJ","YOfrY2hEEU","S77LHlj07Q",
+"Q6LixGWqqX","RBhp0HzZT8","jeskSbZLvS","oGu6xZUnqt","IBe8kRACuj","ru4UGpT8wu","TCgPpcmXIX","GSQwjECMvU","n8pJ9KZamH","VIlwPCNHmv",
+"aez9yy94nw","xXTI43weIF","uZPqgzQt6Q","0BmCyNcICA","QClRLlpF6W","7ku1pUlU3M","I7p2a9eoRc","uupzktvdkD","uupzkG1RhS","yofH3sx5Gl",
+"SbRYyIjTwP","uJScXGSQwj","Yf2EcCqqaD","Waim6lXFOB","FnPFBSmGzv","ZJTXH6AFT0","VIlwPCdyBV","ZJTXHWmadA","b29RJcQOnv","F6PT2yEfy9",
+"B3qem5drc6","AIYUuZhwG1","MmsIo1j5L8","SjskQ07n1c","0Wr5yEOE1o","MmKGJsuY4x","fcwDaQworu","Vprf2hE1Ql","7Ow5CzqH0W","zmLYDIn3NS",
+"0BmCyjS1aj","0KyfsBFkb8","0Wr5yFnPFB","2ZHdkReKEW","YOfrY4QMc9","YOfrY9GXkX","cL0aEgjUTu","hi5X7MmKGJ","jiVBPe6e4z","ogLgcn8pJ9",
+"gtCA5HP433","m4bxUK20wK","FxX9qhe9IA","5iGN5t59lR","BGaQYWaWsv","GrDg7azIWp","7X3uyAOgEe","BCxeCuupzk","9iGoTn1pmO","FGzgp5VZjS",
+"1LB1LuQIcz","KsjRKQnJ1S","Qworuatef2","0ao3lPOUYS","jzUqR0h1b1","IKxdL1v5hH","GWqqXgjUTu","CK5W7tAOsr","zqH0Wn8pJ9","5iGN5suY4x",
+"BFkb8oGu6x","1j5L8uAWyp","TCgPpnlaBy","HzZT8DG4sT","iB08lqUJMd","OxWIH0BmCy","gtCA5JKWYR","tlILtHfyNQ","IKxdLi3pyd","qQxHPgjUTu",
+"qQxHP1v5hH","iKqhrSjskQ","m4bxU1v5hH","uLtKsiB08l","dQ586aFFss","QYxC0Kr8ys","FwEJz0PktI","8hJdt16lHc","RmDcrL7cGc","9rlg9RBhp0",
+"qaofNYjB9t","iqv4kNxx9V","FnPFBI7p2a","cmXIX5drc6","8FmFHVBjhz","QClRLaL6AJ","HP433t59lR","yToGWZuDtD","xXTI48U2nU","mz8gxIRh48",
+"a00b5atef2","OUYuFGXdoH","QChxspAhR1","GXdoHgdQsS","3otm6F6PT2","Ta8f6QssNC","v1HlnEdBKc","ulk41gf8rI","yofH3WDVWJ","9GXkXxciqp",
+"HP433LDk6f","wDajXMojnP","29QAzYjB9t","mz8gxuJScX","ZuDtDDG4sT","cL0aEvLsmS","hUTw7lj07Q","RsQUqFLsph","KASQ8MGlTF","9eoRcsuY4x",
+"uPX7GogLgc","cL0aExReec","MGlTF9y4lw","qUJMdRkQke","07n1cW3VFH","Chuy3tvdkD","8FmFHfaHir","6AFT0ZzJHW","oQ87re6e4z","bgJAzSWfou",
+"X6PintvdkD","UmaEvzY1GY","bZLvSjS1aj","24ARFI7p2a","SjskQVIlwP","8RCUApiJSk","MojnPAmdQd","Q6hMCMkgy8","L7cGc8U2nU","qUJMd3weIF",
+"qQxHPyvOMI","gdQsSKsjRK","5IhmGiKqhr","y94nwNAFuw","2DREsgdQsS","I7p2aZ4I1v","CK5W7xciqp","0KyfstAOsr","nnP8o64s8N","CxVEfYf2Ec",
+"tjQxsydG8U","vkCHH0PktI","he9IAWmadA","JJs5mCp3mZ","AmdQdhE1Ql","ZJTXHyofH3","CIShGo8Uyd","cShY2SjskQ","VBjhzMaJQs","guMb8QnJ1S",
+"jiVBPtuDyS","LDk6fjSjS3","yofH3t59lR","ciuWztjQxs","rhl0JzbIYY","IKxdLvLsmS","zFgtBsqVrf","tAOsrIBe8k","0Wr5y8xEKz","XyPZNuQIcz",
+"brhlQFwEJz","s7MxkDQimp","lweGyNo0Qb","aFFssvLsmS","5nmWv1LB1L","FNYIMGWqqX","gjUTuoVQp6","QChxsciuWz","zFgtBrKDLJ","gjUTutvdkD",
+"SWfouKsjRK","9iGoTsqVrf","oVQp6618Di","OHaBztuDyS","hUTw7lsQGo","5Drn0YjB9t","dpe1vQnJ1S","uupzkZhwG1","zqH0WoVQp6","Q6hMCQChxs",
+"B3qemTwano","5Drn0W3VFH","okgRivOqCE","nFqikKZamH","618DiPYBf4","s4786aL6AJ","C2IrcciuWz","6AFT0Rxrsm","PYBf4DQimp","U3yw5zbIYY",
+"a00b5JRJQB","QYxC07ku1p","LDk6f14FLR","jtn0XTCgPp","Chuy3BGaQY","pAhR1s7Mxk","CNHmv6q6L9","0ao3lydG8U","Gv3FqsuY4x","NAFuwSWfou",
+"rz7UtjeskS","EoToP2TRI7","tjQxsd7vjM","9XyT9lCMxy","pT8wu5nmWv","CIShGGXdoH","M3zXL5drc6","dQ586nnP8o","bgJAzpmeCd","Gv3FqI7p2a",
+"No0QblpF6W","ReKEWFcWrW","L7cGcHlUbF","MezSWJXljW","QYxC0d85a9","JJs5mpWiOs","kZANmsoy9t","Ss0ZuyluBx","JXljWC2Irc","1v5hHIBe8k",
+"lViBv9eoRc","Uvlv4sqVrf","lsQGod7vjM","hSSvQPb1pa","2TRI7pFrrl","7Ow5CQWxoT","9GXkXkZANm","UlU3MAgJHQ","7fsYM2DREs","EOE1oni2v1",
+"hSSvQFLsph","d85a95Drn0","5Drn0sx5Gl","PYBf4OxWIH","StlDJhSSvQ","x3LDeJ2mQi","suY4xJJs5m","jS1ajFxX9q","aDGtSWreyP","FxX9qoGu6x",
+"zHF1q9XyT9","suY4xzQt6Q","jS1ajxXTI4","Yw2oUjiVBP","G1RhS16lHc","Gv3Fqni2v1","yluBxzz4ZU","StlDJwDajX","DLhzMv2eC3","Vprf2RmDcr",
+"WMiS3djsrv","lj07Qgf8rI","JXljWFNYIM","ECMvUokgRi","dmoS7hE1Ql","G1RhS9rlg9","yofH3G1RhS","OHaBz5drc6","EoToP0h1b1","jiVBPuN6r3",
+"GXdoHlViBv","EdBKcru4UG","ciuWzogLgc","iKqhrVprf2","2TRI7zFgtB","Waim62TRI7","gjUTuHP433","5drc6Waim6","Gv3Fq8hJdt","9eoRcM6qcG",
+"POUYSgIYvE","cL0aE5Mg9r","cShY2blLA9","wiHrZCfgr3","brhlQsqVrf","dpe1vpvgjS","SWfou3otm6","lsQGodmoS7","Vprf2lViBv","JkzUnzqH0W",
+"yvOMIZ4I1v","Cfgr3Twano","0YAGHfqypy","t59lR0ao3l","7Ow5Cxciqp","jzUqRMmKGJ","hi5X7mX2GE","UlU3M5ZaEz","Yw2oUYf2Ec","Nxx9V2Nslm",
+"QbxXci3pyd","tvdkDfFDrJ","blLA9FGzgp","gtCA5W3VFH","dQ586CdyBV","lm0pDQWxoT","y94nwAgJHQ","b29RJRzaZA","lViBvfcwDa","07n1cx3LDe",
+"PYBf4B3qem","tvdkDLDk6f","Mkgy8zbIYY","prNT6IRh48","GSQwjDLhzM","zHF1qrhl0J","Chuy3Twano","SjskQ9XyT9","uQIcz5ZaEz","he9IA9iGoT",
+"2Yz7Erhl0J","xciqpsx5Gl","ZJTXHqaofN","CK5W7b29RJ","QWxoTm4bxU","oQ87rQworu","Pb1paM6qcG","QYxC09y4lw","zbIYYUvlv4","Pb1paK20wK",
+"MmKGJ7lUXZ","MezSWnFqik","S77LHKASQ8","2Yz7ERxrsm","Kr8ysLewvM","zQt6QKsjRK","HfyNQzbIYY","nnP8o55rfB","0ao3lYOfrY","pmeCdWDVWJ",
+"zqH0WWPmlx","Zv7z045cIH","0YAGHMaJQs","jSjS34dEz6","FjHXRDLhzM","GrDg7LDk6f","Yf2EcWMiS3","HlUbFpiJSk","5drc62ZHdk","CNHmvv2eC3",
+"SmGzvVNCPd","l83Ud7lUXZ","nlaBy45cIH","WPmlxpvgjS","0ao3lZ4I1v","GrDg7Cfgr3","MaJQsQ6hMC","ZzJHW5ZaEz","uN6r3MaJQs","zHF1qFLsph",
+"1LB1LGrDg7","5Mg9r9eoRc","yofH3Mm8si","K4GS8xXTI4","blLA9gf8rI","7ku1pMezSW","fFDrJM6qcG","ulk41rhl0J","pWiOs0YAGH","Yf2EcBFkb8",
+"CIShGdjsrv","2hEEUM3zXL","ogLgcWMiS3","xReecnFqik","Mm8siiwzGk","Mm8sixXTI4","5iGN5yofH3","B3qempT8wu","TCgPpvkCHH","iB08luvf7A",
+"pAhR1s4786","JkzUn1j5L8","iwzGkfqypy","AkKTkVNCPd","NOHszbgJAz","ydG8UUmaEv","HzZT8djsrv","9GXkXnnP8o","3otm6gIYvE","0ao3lY1mC0",
+"16lHcK4GS8","AmdQdlpF6W","hUTw7GXdoH","ni2v19eoRc","ZhwG1QssNC","EOE1oCqqaD","v8yFNWMiS3","618Di4QMc9","fFDrJuupzk","RpBQmfLNg8",
+"zqH0WNcICA","gIYvE1j5L8","jeskSjeskS","9rlg9Yw2oU","t59lRDG4sT","lm0pDix74r","AOgEegf8rI","2NslmtuDyS","pWiOsRACuj","lsQGo8xEKz",
+"pvgjS0BmCy","MmsIoLDk6f","G1RhS24ARF","D6rByuoStw","kZANmkZANm","v1Hlnlm0pD","POUYS24ARF","Vprf2U3yw5","n8pJ98xEKz","M3zXLiKqhr",
+"45cIHmz8gx","FVMxoFnPFB","fqypydjsrv","Ul4a1rhl0J","Yh1hFs4786","VjCZq2Yz7E","AOgEeReKEW","EoToPS77LH","yofH3I7p2a","fFDrJnnP8o",
+"aez9yD6rBy","cL0aEm4bxU","TXQ0ZjS1aj","Gv3FqM3zXL","BpYhVtaOXK","SbRYyzHF1q","MK07YDcpWB","v8yFNUvlv4","lkMUAZzJHW","cL0aEK4GS8",
+"0ao3lh1zcH","Oz8yZAOgEe","RACujatef2","0h1b1azIWp","oVQp6yToGW","8hJdt5drc6","YjB9tRpBQm","RmDcrRkQke","Q6hMC24ARF","ni2v1FcWrW",
+"s7MxkReKEW","aez9y8FmFH","F6PT28xEKz","Mkgy8WreyP","ksJbytaOXK","5VZjSlH1kt","lj07Q5Drn0","5Drn0lViBv","O3iyQYf2Ec","XflUqKZamH",
+"s4786zQt6Q","M3zXLStlDJ","Nxx9VBpYhV","okgRituDyS","v2eC3Z4I1v","fFDrJMmsIo","FjHXRqUJMd","YjB9tLbRTH","IKxdL7lUXZ","t59lRPb1pa",
+"IBe8kiwzGk","WaWsvWMiS3","xXTI4TCgPp","WreyPVprf2","BpYhVWaWsv","64s8Ni3pyd","zFgtB6AFT0","prNT6Yh1hF","Uvlv4AmdQd","prNT6SWfou",
+"ulk41AIYUu","l83UdCfgr3","cmXIXni2v1","1LB1LtjQxs","djsrvPOUYS","1j5L87lUXZ","MK07YnFqik","t59lRC2Irc","azIWp1v5hH","aez9yZJTXH",
+"JJs5mTa8f6","aDGtSJkzUn","FwEJz9rlg9","Chuy3M3zXL","RxrsmHzZT8","HP433lkMUA","6AFT0s7Mxk","MezSW7ku1p","Dz1R3v1Hln","yToGW5IhmG",
+"QWxoTiB08l","3weIF3otm6","aDGtS5Namm","AIYUuh1zcH","2NslmfmIK1","ciuWz5drc6","lXFOBFLsph","9eoRctlILt","fLNg855rfB","FLsphtl72W",
+"5VZjSb29RJ","07n1c5nmWv","RmDcr0YAGH","5iGN5RsQUq","FLsphOz8yZ","LewvMlkMUA","tl72WVNCPd","UmaEvLbRTH","xciqpuQIcz","5VZjSFnPFB",
+"oVQp6RkQke","lViBvhe9IA","o8UydI7p2a","AIYUuDG4sT","M6qcG9GXkX","OUYuFNo0Qb","hUTw7jiVBP","618DiD6rBy","K4GS8VerEA","NcICAdhSuH",
+"RkQke1v5hH","RxrsmzFgtB","ZzJHW0ao3l","48cHLHRxd8","aFFssJ2mQi","0YAGHYh1hF","s4786oVQp6","tlILtYh1hF","5Drn0pFrrl","QssNCuoStw",
+"e6e4z5Mg9r","0ao3l5nmWv","7fKYUeuZA5","HlUbFCNHmv","1j5L8ZzJHW","k85AeuN6r3","ru4UGjiVBP","I7p2ataOXK","1LB1LlViBv","cmXIXlm0pD",
+"guMb8jeskS","FnPFBokgRi","FNYIMiKqhr","Mkgy8aL6AJ","8TxD7AXpwE","pv0i7qUJMd","QbxXcblLA9","0MR5XM3zXL","0KyfsUmaEv","I7p2aFPfSE",
+"U3yw5FGzgp","SjskQ2Yz7E","QbxXcJ2mQi","TXQ0ZjeskS","3weIFChuy3","djsrvi7WMQ","ZzJHWJKWYR","yToGW8cVD3","2TRI7soy9t","uN6r3WmadA",
+"VIlwPGXdoH","ulk41sx5Gl","JKWYRaFFss","wDajX4W0Tl","rKDLJsoy9t","Pb1paxciqp","24ARFh1zcH","7lUXZM3zXL","M3zXLKr8ys","8U2nU8cVD3",
+"s4786OxWIH","LDk6f2TRI7","0YAGHv1Hln","lViBvYw2oU","9GXkXi7WMQ","ZzJHWVerEA","b29RJFcWrW","pvgjSTwano","qQxHP8FmFH","KsjRKb29RJ",
+"S77LHHP433","M6qcGdhSuH","Q6Lix5ZaEz","lXFOBNhXdu","euZA5iqv4k","lm0pDYOfrY","soy9ti7WMQ","Yw2oU1LB1L","5Drn0Z4I1v","QnJ1SBFkb8",
+"djsrvGSQwj","uPX7G9GXkX","Cfgr3JXljW","JRJQBIjTwP","FnPFBIjTwP","DcpWBMm8si","24ARFSmGzv","tjQxss4786","VjCZqMGlTF","29QAz48cHL",
+"FcWrWK4GS8","8U2nU5Mg9r","jiVBPDG4sT","uN6r3WMiS3","NOHszsoy9t","Waim66AFT0","ZUnqtUvlv4","0PktISjskQ","CNHmvIRh48","1j5L8Mm8si",
+"2ZHdk2ZHdk","jeskSPOUYS","tl72Wb29RJ","jeskSyluBx","U3yw5azIWp","K20wKX6Pin","cShY2guMb8","QssNCVprf2","xReecgf8rI","Pb1padQ586",
+"580YD4W0Tl","uLtKsrKDLJ","uoStwHfyNQ","sx5GlNAFuw","uupzkU3yw5","aFFssQChxs","hUTw7dQ586","djsrvzmLYD","Mkgy8v2eC3","oGu6x2Nslm",
+"dmoS7Vprf2","SjskQrz7Ut","DcpWB24ARF","t98iWNxx9V","ReKEWfcwDa","uoStwuupzk","4dEz60MR5X","ulk4107n1c","lH1kttAOsr","ReKEWiKqhr",
+"JIqXiuoStw","gIYvENOHsz","fcwDaC2Irc","Cfgr3MmKGJ","2Yz7EIBe8k","GrDg7FnPFB","VNCPdM6qcG","D6rBy2DREs","9rlg9JkzUn","4dEz6C2Irc",
+"h1zcHTCgPp","Yw2oUlsQGo","M3zXLni2v1","7fsYM5drc6","2DREsVjCZq","zFgtBPOUYS","oQ87raL6AJ","4W0TlNAFuw","1v5hHC2Irc","i3pydl83Ud",
+"e6e4zD6rBy","MojnPBCxeC","8FmFHFPfSE","RmDcrReKEW","vkCHH55rfB","jtn0XZzJHW","Twano8hJdt","t98iWMK07Y","RxrsmRsQUq","JRJQB7hyVv",
+"uvf7A4W0Tl","HP433vkCHH","pAhR17ku1p","MezSWBFkb8","uJScX8hJdt","s4786W7cTs","CqqaD8U2nU","zQt6QM3zXL","vkCHHoGu6x","Chuy3suY4x",
+"ix74r6AFT0","YOfrYzQt6Q","nlaBy48cHL","tlILtbgJAz","QWxoT9GXkX","azIWpo8Uyd","o8Uydk85Ae","MezSWiB08l","jS1ajdQ586","pFrrlguMb8",
+"B3qemxXTI4","pFrrlYh1hF","qUJMdrKDLJ","pvgjSZJTXH","618DitlILt","OxWIHwiHrZ","vLsmSiB08l","gtCA5LbRTH","48cHLzQt6Q","lCMxyEOE1o",
+"nlaBy5Namm","ulk41cQOnv","pT8wu64s8N","d7vjMaFFss","ydG8Uatef2","KZamH5iGN5","yToGWlViBv","uoStw3otm6","FhtglFxX9q","cQOnv07n1c",
+"8xEKzhYBCK","t59lRYf2Ec","JJs5mFLsph","sqVrfQChxs","oGu6x7fKYU","U3yw5OHaBz","v8yFNYjB9t","DQimpCNHmv","dhSuHm4bxU","h1zcHlViBv",
+"7lUXZzY1GY","MezSWuoStw","WMiS3gdQsS","k85Ae9y4lw","taOXKfmIK1","FnPFBNxx9V","JIqXiuAWyp","lj07QciuWz","gIYvEI7p2a","jeskSL7cGc",
+"oVQp6LbRTH","ZJTXHIn3NS","CNHmvZJTXH","24ARFIRh48","CdyBVLewvM","brhlQD6rBy","QClRLReKEW","FxX9qHRxd8","5ZaEznnP8o","GWqqXZuDtD",
+"qUJMdhi5X7","uvf7AFPfSE","FNYIMjtn0X","FnPFBxReec","NOHszVjCZq","8xEKzRsQUq","mz8gxi7WMQ","djsrvsuY4x","aL6AJK4GS8","aFFsshYBCK",
+"qUJMds7Mxk","hi5X7brhlQ","X6Pinm4bxU","e6e4zazIWp","zQt6Qlj07Q","y94nwU3yw5","aL6AJn1pmO","J2mQiZzJHW","Yh1hF8cVD3","9XyT90ao3l",
+"rz7UteuZA5","SWfouLDk6f","uQIczAkKTk","Qworu55rfB","hUTw7IKxdL","XflUqMojnP","aDGtScShY2","MGlTFMmKGJ","o8UydzFgtB","Ss0Zu6q6L9",
+"4W0TldQ586","FVMxoix74r","ix74rWreyP","x3LDejeskS","5nmWvpvgjS","Vprf2RsQUq","BCxeCgjUTu","TCgPp9XyT9","oGu6xazIWp","n1pmOv2eC3",
+"vLsmSQYxC0","QnJ1SW7cTs","nFqikVNCPd","prNT6aFFss","OHaBzix74r","RkQkeY1mC0","VNCPdOz8yZ","cL0aExXTI4","Nxx9V5ZaEz","aL6AJuQIcz",
+"QbxXcix74r","Pb1paSWfou","7Ow5Cdpe1v","wDajX8cVD3","uQIczuN6r3","cShY2RBhp0","JKWYR07n1c","OHaBz5Drn0","8hJdtpAhR1","7lUXZMGlTF",
+"8TxD7wDajX","blLA9Qworu","9y4lwWDVWJ","vkCHHXflUq","QChxsVIlwP","ydG8UfFDrJ","FPfSEOHaBz","AXpwESmGzv","h1zcHAOgEe","uoStwlXFOB",
+"FwEJz7hyVv","qUJMduQIcz","ZhwG1M3zXL","0PktIGWqqX","Yf2Ecmz8gx","7lUXZ4W0Tl","jzUqRlkMUA","AXpwEzbIYY","1v5hHMGlTF","lCMxy9rlg9",
+"ZzJHWgIYvE","Nxx9V1v5hH","MaJQsuvf7A","ni2v1lXFOB","8TxD7Y1mC0","QClRLQbxXc","hi5X7HzZT8","lj07QpWiOs","M6qcGUvlv4","7lUXZXflUq",
+"MmKGJd7vjM","WDVWJv1Hln","CK5W7zQt6Q","iB08l5nmWv","1j5L8hE1Ql","RxrsmYh1hF","he9IAn8pJ9","wDajXnlaBy","ulk41QssNC","uQIczuTacx",
+"tAOsrGv3Fq","Uvlv49eoRc","MojnPOUYuF","U3yw5tAOsr","nlaBy2ZHdk","t59lRK20wK","8TxD7B3qem","jtn0X0PktI","4dEz6IKxdL","v2eC3FwEJz",
+"djsrvFNYIM","1LB1LlXFOB","9y4lwX6Pin","piJSkZzJHW","D6rByXyPZN","bZLvSt98iW","QssNCP6bcg","AgJHQpvgjS","J2mQioGu6x","0BmCyO3iyQ",
+"Yh1hFfaHir","t59lRRkQke","9rlg9prNT6","xciqpjfREu","CdyBVlkMUA","3otm63otm6","7lUXZydG8U","QYxC0MK07Y","RmDcrQworu","1v5hHFPfSE",
+"cmXIXQssNC","pWiOsIn3NS","ZzJHW1v5hH","uLtKsStlDJ","he9IAFLsph","MmKGJXyPZN","n8pJ92ZHdk","piJSk0BmCy","618DiWaWsv","fcwDaKr8ys",
+"kZANmHfyNQ","3weIFzQt6Q","5IhmGzHF1q","yToGWjfREu","pvgjSmz8gx","LbRTHlkMUA","euZA5CqqaD","fcwDaZv7z0","8FmFHDG4sT","M3zXLFFDui",
+"pWiOsUlU3M","StlDJYjB9t","CxVEfzqH0W","jSjS3EdBKc","lweGyW7cTs","jfREu9GXkX","29QAzS2Dfu","XflUqFGzgp","d85a9MGlTF","ZuDtDVjCZq",
+"9rlg9RpBQm","UmaEvO3iyQ","0MR5Xs93Ml","5drc6Q6Lix","AIYUulsQGo","8FmFHHP433","1j5L8soy9t","SbRYye6e4z","v8yFNiKqhr","suY4xIjTwP",
+"tjQxs5iGN5","JKWYRVLTy6","fLNg8oGu6x","LbRTHgf8rI","o8UyduJScX","TCgPpNo0Qb","o8UydlViBv","Fhtgl9eoRc","s7Mxk2ZHdk","jfREuReKEW",
+"7hyVv9iGoT","Q6LixkZANm","YjB9tlm0pD","XyPZN5drc6","K4GS8i3pyd","l83UdMmsIo","yEfy9AOgEe","ciuWzS2Dfu","djsrvEOE1o","jSjS3CxVEf",
+"d85a98FmFH","K4GS8xReec","DG4sTsx5Gl","mz8gx9eoRc","3otm6gtCA5","kZANmoQ87r","9rlg9IjTwP","guMb80MR5X","JJs5mjSjS3","uTacxNxx9V",
+"QnJ1SMojnP","6AFT0ZhwG1","C2IrcEOE1o","nFqikuN6r3","ogLgcOHaBz","uJScX2ZHdk","fFDrJ8TxD7","n1pmOJ2mQi","7fKYUjSjS3","MmKGJQ6Lix",
+"zQt6QBbwgA","Ul4a1DQimp","Yw2oUIKxdL","lH1ktciuWz","a00b5pv0i7","X6Pin2DREs","MaJQsHP433","prNT6tlILt","lXFOBblLA9","Yh1hF7X3uy",
+"dmoS7rhl0J","Vprf20Kyfs","iqv4k5Mg9r","aez9ywiHrZ","AOgEeiqv4k","VNCPdgjUTu","RxrsmUlU3M","0BmCy3weIF","pv0i7Gv3Fq","CK5W7IRh48",
+"Vprf2cL0aE","2NslmQssNC","he9IAh1zcH","S2DfuOHaBz","JXljWMmsIo","VIlwPv8yFN","RzaZA7hyVv","7X3uy0MR5X","s4786ogLgc","5ZaEzcmXIX",
+"lweGyn8pJ9","3otm6S2Dfu","JkzUnnFqik","FPfSEt59lR","cL0aE0ao3l","618DiQbxXc","nnP8oOHaBz","ogLgcNAFuw","qaofNguMb8","0MR5XRpBQm",
+"0PktIOxWIH","xReecMGlTF","uAWyprz7Ut","qQxHPYh1hF","pFrrl7fKYU","G1RhS48cHL","WMiS3CNHmv","CdyBV55rfB","DLhzMP6bcg","No0Qbt98iW",
+"JJs5ml83Ud","AkKTkaDGtS","lweGyF6PT2","Ul4a1L7cGc","WaWsvtl72W","yvOMIZUnqt","y94nwlH1kt","zbIYYMezSW","UlU3MgjUTu","J2mQiNOHsz",
+"vLsmSCIShG","lViBvZhwG1","FGzgpqaofN","9y4lwTCgPp","aez9y4W0Tl","s4786CqqaD","NhXduQWxoT","Vprf25Drn0","AIYUufqypy","Ul4a1blLA9",
+"SmGzvUl4a1","9iGoTU3yw5","Ul4a1618Di","Dz1R3ogLgc","kB5nPQ6hMC","0PktILDk6f","hi5X7Dz1R3","1v5hHQssNC","RmDcrRzaZA","zmLYDcL0aE",
+"QWxoTJIqXi","jeskStl72W","lH1ktFxX9q","Chuy3hYBCK","oVQp6aDGtS","Zv7z0l83Ud","MGlTFAOgEe","mX2GE618Di","QssNCoGu6x","lH1ktK4GS8",
+"5VZjSsoy9t","DQimpNcICA","m4bxUSs0Zu","OUYuF2Nslm","atef28RCUA","3otm6QChxs","8cVD3RsQUq","WmadAHRxd8","EoToPQ6hMC","VIlwPJIqXi",
+"BGaQYYh1hF","wiHrZIRh48","IBe8kMGlTF","ThjNn5ZaEz","Yh1hFJJs5m","RACujUvlv4","Ta8f6kZANm","VjCZqTCgPp","MaJQsNo0Qb","BFkb83otm6",
+"x3LDeqaofN","xReecuZPqg","AgJHQTwano","CxVEfpiJSk","uQIczwDajX","rhl0J9eoRc","AmdQdBCxeC","ZzJHWlViBv","AIYUujtn0X","IBe8kPOUYS",
+"HP433e6e4z","QChxs6AFT0","BGaQYYOfrY","xReect59lR","XyPZNgtCA5","K4GS8uvf7A","7ku1pyToGW","yofH3NAFuw","Gv3FqpvgjS","0YAGHAIYUu",
+"9iGoT5ZaEz","Z4I1vNxx9V","2DREsNAFuw","RBhp0ZhwG1","F6PT25VZjS","LbRTHpvgjS","VLTy6RmDcr","5Mg9rvOqCE","D6rByzHF1q","ni2v1L7cGc",
+"BCxeCxXTI4","3weIFaFFss","ECMvUG1RhS","brhlQXflUq","pT8wuAXpwE","8xEKzaL6AJ","TwanoFcWrW","8U2nURsQUq","nnP8oQworu","HzZT8d85a9",
+"pFrrlJRJQB","uPX7Glm0pD","tuDySm4bxU","s4786CIShG","0Wr5y5nmWv","CIShGWmadA","0ao3lJRJQB","2ZHdk9iGoT","oGu6xNOHsz","2ZHdkpmeCd",
+"o8Uydpv0i7","5NammqUJMd","sx5Glsx5Gl","0YAGHRzaZA","cmXIXtvdkD","rz7UtyToGW","uLtKsCK5W7","AXpwEKr8ys","gjUTuY1mC0","Ss0ZuRBhp0",
+"7ku1p5ZaEz","WMiS3NAFuw","ksJbyMK07Y","QssNCv8yFN","Yf2EczFgtB","0KyfszFgtB","x3LDeM3zXL","yEfy9ni2v1","jeskSdhSuH","HP433iqv4k",
+"pvgjS24ARF","t59lRBGaQY","OHaBzIBe8k","FxX9qTCgPp","zmLYDbrhlQ","ksJbyLDk6f","RzaZAni2v1","jzUqRVLTy6","gdQsSblLA9","Yf2EcBCxeC",
+"7fKYUCdyBV","RxrsmGSQwj","zFgtBxReec","RACujY1mC0","SbRYyMK07Y","uJScX5Mg9r","x3LDeaez9y","tl72WGrDg7","suY4x0YAGH","fcJOyUmaEv",
+"TXQ0ZuPX7G","QChxsZzJHW","SWfouPYBf4","s7MxkxReec","iB08lMojnP","jzUqRyofH3","8RCUAFjHXR","S77LHt98iW","suY4xTXQ0Z","C2Irc8hJdt",
+"dpe1vFVMxo","QnJ1SZ4I1v","8U2nURxrsm","S77LHRkQke","5NammDG4sT","QworuyluBx","lkMUARzaZA","RzaZAW3VFH","Kr8ysX6Pin","Twanov2eC3",
+"0MR5XbgJAz","CdyBVaFFss","MaJQsMojnP","Oz8yZFcWrW","nlaByY1mC0","LbRTH5nmWv","StlDJfaHir","pT8wus93Ml","b29RJS77LH","s4786lkMUA",
+"EoToPcQOnv","nnP8otl72W","tl72Wsoy9t","U3yw5Dz1R3","D6rBy16lHc","4QMc9WmadA","8cVD30Kyfs","G1RhSCK5W7","vLsmSNOHsz","7Ow5CSs0Zu",
+"9GXkXUlU3M","HlUbFpv0i7","Kr8ysuoStw","0BmCy9GXkX","ZJTXHyvOMI","gjUTu8cVD3","pWiOsuZPqg","tl72Watef2","FjHXRuTacx","t98iWHzZT8",
+"I7p2asuY4x","48cHLnlaBy","prNT6zFgtB","HP433Waim6","JJs5mNo0Qb","FhtglStlDJ","7fKYUM3zXL","GSQwjk85Ae","Q6LixUmaEv","d7vjM07n1c",
+"ECMvUF6PT2","dhSuHTa8f6","29QAzAkKTk","RzaZAZJTXH","gf8rIiB08l","Yw2oU29QAz","FPfSEyofH3","YOfrYQbxXc","2Yz7E29QAz","Waim6Y1mC0",
+"bgJAz4QMc9","I7p2auoStw","ZhwG17ku1p","NOHsz24ARF","pWiOsXflUq","oQ87rlpF6W","qaofNX6Pin","UlU3MWDVWJ","k85AeWreyP","VIlwP16lHc",
+"JXljW7X3uy","TCgPppAhR1","tvdkDzHF1q","MojnPfLNg8","Chuy38TxD7","Vprf21v5hH","uupzkSWfou","8RCUALDk6f","4dEz61j5L8","Mkgy8K20wK",
+"iB08lhSSvQ","ZJTXHZJTXH","2TRI7OUYuF","ZzJHWGrDg7","xciqplCMxy","fcJOyv2eC3","WMiS3G1RhS","TXQ0ZS2Dfu","EOE1oogLgc","cShY2euZA5",
+"OHaBzuoStw","euZA5tuDyS","FcWrW8cVD3","lViBvFNYIM","fqypyt59lR","jSjS3zHF1q","2NslmVNCPd","bgJAzuN6r3","fcwDaaL6AJ","XyPZN07n1c",
+"OHaBzyvOMI","QworuSjskQ","vOqCEHP433","FNYIMuTacx","5NammFjHXR","ni2v1iB08l","SWfoui3pyd","nFqiksqVrf","v8yFNOUqFM","djsrv7X3uy",
+"yluBx2DREs","HP433zFgtB","FnPFB8hJdt","3otm6BbwgA","7fsYMjtn0X","Waim6yofH3","4W0TlGrDg7","yToGWStlDJ","BFkb8oQ87r","n8pJ99iGoT",
+"jS1ajC2Irc","RBhp0In3NS","DG4sTwiHrZ","pT8wu0Kyfs","vOqCEBpYhV","cmXIXaDGtS","nlaByJXljW","lkMUAMmKGJ","CIShGsqVrf","JXljWWreyP",
+"dpe1v7fsYM","fqypyJKWYR","cQOnvQ6Lix","LDk6fJXljW","brhlQaL6AJ","faHiruoStw","ZzJHWWMiS3","AmdQduAWyp","lCMxyD6rBy","0YAGH2TRI7",
+"ZJTXH2Yz7E","uPX7GgtCA5","lsQGoFFDui","d7vjMqUJMd","pAhR1W7cTs","0PktIkB5nP","KZamHOUYuF","n1pmOzY1GY","soy9tF6PT2","NAFuwydG8U",
+"ksJbyzQt6Q","FcWrWsuY4x","lCMxyZJTXH","VjCZq5Namm","XflUqU3yw5","QClRLpv0i7","zFgtBGrDg7","7X3uyHfyNQ","v8yFNsuY4x","hE1QlStlDJ",
+"EoToPC2Irc","OxWIHl83Ud","0Wr5ygjUTu","U3yw5DcpWB","mz8gxhUTw7","QbxXc6AFT0","Waim6fmIK1","45cIHa00b5","wDajXblLA9","yToGWksJby",
+"Ul4a1Gv3Fq","vOqCERpBQm","Yh1hFJ2mQi","VLTy6n1pmO","HzZT8FFDui","ksJbyaL6AJ","lViBvWreyP","s93MlzHF1q","dQ586Qworu","RkQkeaFFss",
+"XflUqfcJOy","Kr8yswDajX","uoStw7hyVv","zHF1qaDGtS","fFDrJNxx9V","RsQUqRzaZA","GWqqXs4786","t59lRuZPqg","azIWpaDGtS","8RCUAyofH3",
+"FcWrWHlUbF","uQIczCK5W7","uTacxPYBf4","zz4ZUs7Mxk","4QMc9dQ586","MezSWv1Hln","8hJdtzHF1q","StlDJfFDrJ","mX2GE16lHc","VIlwPxXTI4",
+"7hyVvv2eC3","IRh48cL0aE","iwzGkRACuj","WPmlxCfgr3","64s8Ndjsrv","9rlg9oVQp6","kB5nPEdBKc","RzaZAMojnP","oQ87r5Drn0","MojnPAIYUu",
+"iKqhr5nmWv","KsjRKCqqaD","Kr8ys9iGoT","FnPFB5nmWv","uvf7AYh1hF","HP4337fKYU","5ZaEzF6PT2","tjQxsulk41","rhl0JiKqhr","rz7UtuZPqg",
+"rKDLJyToGW","MmsIotl72W","RBhp0AOgEe","9XyT9fFDrJ","FcWrWogLgc","y94nwY1mC0","gjUTuAIYUu","uQIczm4bxU","QChxsJJs5m","KASQ8FFDui",
+"qaofNt59lR","UmaEvGWqqX","t98iWD6rBy","zHF1qqUJMd","7lUXZs4786","ECMvUBFkb8","t59lRvkCHH","ReKEWsx5Gl","vLsmSQClRL","0ao3lXflUq",
+"atef2a00b5","MmKGJG1RhS","oVQp6ksJby","VIlwPtl72W","Uvlv4SbRYy","Waim6ECMvU","I7p2ad85a9","lH1ktW7cTs","y94nwQnJ1S","uAWyprhl0J",
+"zQt6QciuWz","fLNg8FcWrW","Mkgy8jfREu","Fhtgl0YAGH","VIlwP4W0Tl","Ul4a1QChxs","7hyVvAkKTk","Mkgy8W3VFH","soy9tHlUbF","9y4lwOz8yZ",
+"pmeCduTacx","9GXkXJkzUn","RzaZAM6qcG","kZANmjzUqR","dmoS7hi5X7","O3iyQEoToP","MojnPjtn0X","zFgtBjSjS3","jiVBPsoy9t","VBjhznlaBy",
+"SWfoua00b5","lH1ktZUnqt","jiVBP9iGoT","X6PinzQt6Q","piJSkLewvM","L7cGcAXpwE","9iGoTMkgy8","pWiOscmXIX","ni2v1HfyNQ","No0QbjzUqR",
+"tjQxsbrhlQ","580YDlkMUA","RxrsmjS1aj","i3pydAIYUu","v8yFNblLA9","wDajXKASQ8","55rfBJkzUn","CK5W7AgJHQ","tl72WGSQwj","Mm8siFjHXR",
+"iwzGkQYxC0","7lUXZnFqik","n8pJ9hSSvQ","Cfgr3Ss0Zu","uTacxXyPZN","7X3uypWiOs","5Mg9rHlUbF","yofH39eoRc","0YAGHWPmlx","RBhp0AkKTk",
+"3weIFHzZT8","pFrrl9eoRc","xciqpQChxs","cShY25ZaEz","suY4xWaim6","RxrsmY1mC0","zHF1qNhXdu","ciuWzzmLYD","gjUTuEOE1o","Cfgr3xXTI4",
+"x3LDe8U2nU","TCgPpdpe1v","618Dixciqp","RxrsmgtCA5","Vprf24W0Tl","CxVEf618Di","uvf7A64s8N","JKWYRRzaZA","8cVD3v1Hln","aFFsstuDyS",
+"m4bxUgdQsS","gjUTuh1zcH","EOE1ozbIYY","FLsph2Yz7E","TCgPplH1kt","FFDuiX6Pin","GWqqX9y4lw","dmoS7RBhp0","TwanoGv3Fq","O3iyQsuY4x",
+"7Ow5C5ZaEz","S77LHM3zXL","l83Udb29RJ","EoToPUl4a1","h1zcHMojnP","azIWptjQxs","1j5L8NAFuw","jfREuyvOMI","qQxHPzHF1q","IBe8kkB5nP",
+"ZJTXHX6Pin","sqVrfatef2","pv0i7tuDyS","OHaBzprNT6","Z4I1vfaHir","i7WMQtuDyS","KsjRKmX2GE","Mm8siZUnqt","prNT6CNHmv","QYxC0fqypy",
+"UmaEvd7vjM","DQimpwiHrZ","POUYSfaHir","1v5hHMaJQs","yluBxM3zXL","pT8wuG1RhS","64s8NBpYhV","ZJTXH8FmFH","blLA99rlg9","NAFuwJkzUn",
+"brhlQ0ao3l","O3iyQGSQwj","AIYUu2ZHdk","xReecpFrrl","zbIYYYOfrY","pFrrlKZamH","9XyT9jfREu","JJs5mKsjRK","uTacxZv7z0","Ss0Zu0h1b1",
+"KZamHv1Hln","ydG8UlpF6W","hUTw7VBjhz","W7cTsBCxeC","In3NSC2Irc","Dz1R3xciqp","618DitvdkD","dQ586EdBKc","3weIFjeskS","9y4lw16lHc",
+"ZhwG1i7WMQ","ZJTXH5VZjS","MojnPU3yw5","5NammRzaZA","5nmWvAXpwE","BFkb8W7cTs","OHaBzs7Mxk","pWiOse6e4z","zbIYY5ZaEz","2hEEUdhSuH",
+"hSSvQuQIcz","8cVD3Qworu","4W0Tl64s8N","zFgtBIKxdL","Z4I1v5VZjS","QWxoTW7cTs","AgJHQNo0Qb","JXljWgjUTu","lXFOBfcJOy","07n1cFVMxo",
+"NAFuwWDVWJ","fqypyWaWsv","mz8gxuN6r3","IjTwPBGaQY","2TRI7VIlwP","4dEz6iwzGk","Oz8yZuAWyp","yvOMIJIqXi","d7vjMs7Mxk","QWxoThUTw7",
+"FVMxoBCxeC","gjUTui7WMQ","lXFOBMezSW","yvOMIZv7z0","rKDLJVLTy6","gIYvEMmKGJ","t59lR0h1b1","FLsphLbRTH","prNT6pT8wu","580YD4dEz6",
+"ru4UGsqVrf","IRh48kB5nP","KZamHDcpWB","VIlwPa00b5","DQimpJJs5m","FjHXRjS1aj","KASQ89eoRc","x3LDeIjTwP","BGaQYvkCHH","K20wKUlU3M",
+"FhtgloGu6x","Yw2oUuvf7A","580YDCp3mZ","FGzgpsuY4x","IKxdLD6rBy","Vprf2UlU3M","djsrvjeskS","BpYhVKr8ys","v1HlnW7cTs","tlILt7lUXZ",
+"taOXK6AFT0","yvOMIuN6r3","ZJTXH5drc6","pFrrlReKEW","IBe8k9XyT9","jfREuGSQwj","In3NSMK07Y","HzZT8uLtKs","DQimpgdQsS","faHirv8yFN",
+"OUqFMMK07Y","O3iyQd85a9","QClRLdjsrv","hUTw78xEKz","zY1GYVerEA","FGzgpZUnqt","djsrvCxVEf","8xEKzRxrsm","s93MlJIqXi","6AFT0FPfSE",
+"BFkb8XyPZN","xciqp45cIH","Waim6uupzk","BGaQYsx5Gl","pvgjStl72W","nnP8ojiVBP","yEfy9VLTy6","AgJHQtAOsr","DcpWBk85Ae","ThjNnRzaZA",
+"TwanofaHir","xReec1j5L8","CdyBVFhtgl","P6bcgpT8wu","618DisuY4x","iqv4ky94nw","Cp3mZ0YAGH","fmIK1S77LH","zbIYYsx5Gl","CqqaDAgJHQ",
+"RACujgf8rI","Pb1pagIYvE","OHaBzLbRTH","fFDrJ9XyT9","jSjS3M3zXL","QssNCK4GS8","fcwDaQbxXc","BpYhV0PktI","0ao3lhe9IA","KsjRKoGu6x",
+"QWxoTlj07Q","MojnP5ZaEz","0YAGHDQimp","16lHc07n1c","Nxx9VmX2GE","kB5nPHRxd8","LDk6f5Mg9r","WDVWJtjQxs","5IhmGGWqqX","JkzUnYjB9t",
+"n1pmOKr8ys","qUJMdYOfrY","RACuj4dEz6","POUYSKsjRK","Yw2oUjS1aj","euZA5NhXdu","Cfgr345cIH","aDGtSQ6Lix","4QMc9pWiOs","J2mQih1zcH",
+"9iGoTprNT6","yEfy9Ss0Zu","G1RhSI7p2a","8FmFH5IhmG","rhl0JfmIK1","uQIczF6PT2","faHirSmGzv","0BmCytlILt","MmKGJe6e4z","PYBf4No0Qb",
+"2Yz7EUvlv4","hSSvQs7Mxk","S77LHQClRL","HzZT8wDajX","48cHLrhl0J","fFDrJGv3Fq","dmoS72Yz7E","ciuWzZuDtD","piJSktjQxs","VjCZqdpe1v",
+"fcJOyFcWrW","ciuWzD6rBy","uAWypblLA9","cShY2i3pyd","Uvlv40BmCy","9iGoThe9IA","ZzJHWCfgr3","Oz8yZJkzUn","5iGN5CK5W7","VLTy6QbxXc",
+"XflUqI7p2a","QYxC0OHaBz","8U2nUfcwDa","taOXK24ARF","Dz1R3kZANm","yEfy9AgJHQ","aez9yWDVWJ","QbxXcFjHXR","iqv4kGv3Fq","fqypyxciqp",
+"dmoS7pWiOs","rz7UtPOUYS","CxVEfVerEA","XyPZNv8yFN","l83UdQworu","2Yz7EzFgtB","MGlTFO3iyQ","tjQxs0PktI","Dz1R3o8Uyd","2DREsQClRL",
+"9eoRcVNCPd","o8UydsuY4x","WDVWJuAWyp","tlILtwiHrZ","xXTI4vkCHH","VIlwPJ2mQi","RpBQmStlDJ","zHF1qs93Ml","zqH0WVerEA","1v5hHy94nw",
+"3weIFtlILt","Z4I1vcmXIX","S77LH8cVD3","TwanoKZamH","rhl0JKZamH","HfyNQwiHrZ","okgRiv2eC3","sqVrf3weIF","uoStwZuDtD","K4GS8C2Irc",
+"IBe8kZzJHW","AOgEezHF1q","2ZHdkcQOnv","AIYUuSs0Zu","uPX7G7X3uy","Yf2Ect59lR","zFgtBiKqhr","gf8rIJkzUn","FxX9qzHF1q","prNT60h1b1",
+"gjUTuaL6AJ","rz7UtTXQ0Z","uQIcziwzGk","QChxse6e4z","SjskQZv7z0","JIqXiEoToP","oVQp664s8N","S77LHx3LDe","C2Irc8FmFH","suY4xpv0i7",
+"vkCHHgIYvE","lViBvdjsrv","4dEz6FFDui","yofH3Cfgr3","fLNg8ru4UG","oQ87ruoStw","QbxXcSbRYy","yvOMIVIlwP","UmaEv1v5hH","OHaBzZ4I1v",
+"Oz8yZ8U2nU","LbRTHWPmlx","RmDcrfqypy","5nmWvGv3Fq","ThjNnOxWIH","SjskQZzJHW","yluBxQChxs","uJScXVprf2","IKxdLQssNC","8U2nUxciqp",
+"Oz8yZtAOsr","Oz8yZFxX9q","SbRYyB3qem","FxX9qcmXIX","MGlTFLewvM","SWfouUl4a1","tjQxs8cVD3","9y4lwe6e4z","AgJHQlpF6W","tl72W8FmFH",
+"FNYIM16lHc","jiVBPjSjS3","dQ586m4bxU","VNCPdW7cTs","OHaBzdmoS7","oQ87ryvOMI","TXQ0ZnnP8o","tAOsrAIYUu","fqypyguMb8","5IhmGThjNn",
+"lViBvatef2","faHirv2eC3","hUTw7OxWIH","gdQsS9iGoT","tlILto8Uyd","C2Irc7hyVv","4W0TlyToGW","pFrrlzz4ZU","G1RhSRsQUq","Z4I1vUlU3M",
+"suY4xtl72W","WmadAlXFOB","Kr8ysblLA9","GXdoHmX2GE","n1pmOMezSW","jtn0XBGaQY","Y1mC0nnP8o","POUYSqaofN","2hEEUKr8ys","Ss0ZuVIlwP",
+"t59lRpv0i7","CIShG8cVD3","No0Qbv8yFN","TCgPpYh1hF","aDGtS0Wr5y","Mm8siMmKGJ","WreyPLDk6f","x3LDeYjB9t","1LB1LJXljW","LDk6ffLNg8",
+"ReKEWIn3NS","Q6Lix2ZHdk","VIlwPqUJMd","StlDJWaim6","0MR5XWaim6","VerEAv8yFN","JJs5mMGlTF","WPmlx0PktI","VerEAG1RhS","FNYIMCNHmv",
+"CxVEf29QAz","4QMc9VNCPd","CNHmvatef2","5NammtuDyS","BpYhVv1Hln","JkzUn2Yz7E","RACujF6PT2","VIlwPGv3Fq","dQ586uvf7A","ECMvUxciqp",
+"QYxC04dEz6","J2mQi45cIH","TXQ0Zfqypy","OxWIHmz8gx","AOgEeVBjhz","CdyBVzz4ZU","uPX7Gaez9y","AXpwETCgPp","G1RhSzmLYD","2Yz7ESmGzv",
+"uQIczni2v1","iqv4kpv0i7","lm0pDRkQke","MK07YZJTXH","MezSWgf8rI","SmGzvkB5nP","kZANmpmeCd","yluBxFjHXR","kB5nPlm0pD","iqv4k5drc6",
+"8cVD3RpBQm","WaWsvjS1aj","fqypySmGzv","ZzJHWiqv4k","gtCA5n8pJ9","ReKEWJ2mQi","16lHciKqhr","GXdoH9y4lw","dhSuHBCxeC","Ss0Zu29QAz",
+"VLTy68xEKz","POUYSs7Mxk","lkMUA0ao3l","QnJ1SZuDtD","SmGzvFLsph","ix74rFGzgp","45cIHRxrsm","VerEAOHaBz","dhSuHFxX9q","ydG8UblLA9",
+"uAWypWPmlx","EdBKcfcwDa","ulk41lXFOB","fLNg8QYxC0","MGlTFM3zXL","ulk41HP433","lkMUAZ4I1v","HP433pvgjS","4dEz6QssNC","wiHrZ9iGoT",
+"ZUnqt0Wr5y","CqqaDZUnqt","7fKYUuTacx","ZzJHWW7cTs","lpF6W0Wr5y","0ao3lZhwG1","he9IAfcwDa","lpF6Wix74r","BGaQYuZPqg","mz8gxtvdkD",
+"Yf2EcjiVBP","3weIF55rfB","zbIYYQChxs","6AFT0StlDJ","QnJ1SIKxdL","Yw2oUFnPFB","cQOnvdjsrv","iqv4knnP8o","ogLgcsqVrf","0PktIuZPqg",
+"Cfgr3iqv4k","h1zcHWPmlx","48cHL580YD","Yh1hFDG4sT","uTacxWmadA","aDGtS9XyT9","NAFuwAIYUu","AIYUufmIK1","5nmWvCp3mZ","XyPZN7fsYM",
+"gtCA5zbIYY","RxrsmB3qem","ZzJHWmz8gx","NhXdufmIK1","x3LDeLewvM","NhXduuTacx","lViBvrhl0J","W7cTsFjHXR","tuDySl83Ud","2TRI7zz4ZU",
+"SjskQXflUq","cL0aEkZANm","zbIYYFcWrW","MojnPuTacx","YjB9tCdyBV","FGzgp7X3uy","zQt6Q0YAGH","SmGzvBbwgA","hYBCK16lHc","CK5W7yToGW",
+"Q6LixpiJSk","iKqhryluBx","JKWYRtAOsr","jfREuCqqaD","oVQp6XyPZN","BbwgA9rlg9","uupzkatef2","MezSWuJScX","4QMc9hE1Ql","jSjS3WaWsv",
+"MGlTF8RCUA","XflUqtAOsr","6AFT0HzZT8","8RCUAlViBv","Oz8yZKASQ8","24ARFFPfSE","xReectl72W","7lUXZWaim6","b29RJxXTI4","Y1mC0BpYhV",
+"8TxD75Mg9r","qQxHPSjskQ","lCMxyMmKGJ","QworuYh1hF","UlU3M7hyVv","JXljWWPmlx","S2Dfu55rfB","zFgtBFhtgl","OUqFMsoy9t","L7cGcP6bcg",
+"Yw2oUNhXdu","RkQkehi5X7","LbRTHI7p2a","M6qcG5VZjS","xReecHlUbF","M6qcGWaWsv","SWfou2Yz7E","LewvMwiHrZ","BFkb8Ta8f6","gf8rIMGlTF",
+"AgJHQMaJQs","guMb8aDGtS","gdQsSUl4a1","DLhzMGv3Fq","CdyBVM3zXL","EOE1oDz1R3","uN6r30BmCy","QClRLUvlv4","iwzGkTwano","dmoS7zmLYD",
+"uupzk2ZHdk","9rlg9FjHXR","v2eC3Vprf2","lj07Q7ku1p","s93MlIn3NS","QbxXcfmIK1","45cIHdQ586","pv0i7NAFuw","n1pmOMojnP","FFDuiLewvM",
+"y94nwCxVEf","gIYvEB3qem","MGlTFs93Ml","hE1Qlt59lR","VerEAhUTw7","fcJOyQ6hMC","OUYuFni2v1","BFkb8JRJQB","gjUTuGXdoH","8cVD3hUTw7",
+"0MR5XsqVrf","TwanociuWz","uJScXZJTXH","Vprf2guMb8","64s8Nxciqp","ydG8URzaZA","djsrvWDVWJ","BFkb8Dz1R3","lsQGoMK07Y","7Ow5CQ6Lix",
+"JIqXiRxrsm","8U2nUfaHir","tjQxsix74r","CxVEfuN6r3","UlU3MuoStw","P6bcg4QMc9","MK07YECMvU","SWfouzz4ZU","dhSuH9eoRc","guMb8zQt6Q",
+"s4786tl72W","ZuDtDLDk6f","RkQkePOUYS","euZA5aFFss","TCgPpMGlTF","vOqCEAXpwE","Yh1hFxReec","uQIczStlDJ","Nxx9VF6PT2","GSQwjNhXdu",
+"qUJMdI7p2a","ogLgcFcWrW","hSSvQQssNC","14FLR8RCUA","Nxx9VcmXIX","EdBKcOUYuF","NAFuwL7cGc","azIWp4QMc9","uQIczK20wK","ru4UGv8yFN",
+"ni2v129QAz","ksJbyuPX7G","9y4lwJJs5m","9iGoTdhSuH","GrDg7tuDyS","jS1ajZUnqt","EOE1oOUYuF","5nmWvgIYvE","9GXkXFwEJz","oVQp67fsYM",
+"oVQp6gtCA5","Oz8yZMmsIo","55rfBmz8gx","tlILtNAFuw","aDGtS14FLR","CIShGBCxeC","Zv7z0VIlwP","sx5GlqQxHP","Y1mC0t98iW","G1RhSru4UG",
+"FwEJzNAFuw","AgJHQ3weIF","gdQsS5VZjS","SWfouLewvM","ogLgc9GXkX","W3VFHaDGtS","1j5L80Wr5y","uTacxlweGy","2TRI7Fhtgl","0h1b1uAWyp",
+"fcwDaHfyNQ","7X3uyHRxd8","07n1ciqv4k","WreyPjeskS","8xEKzFhtgl","Z4I1vVprf2","9eoRcDz1R3","ZJTXH9eoRc","5NammVLTy6","VIlwPWaWsv",
+"ogLgcv1Hln","7fKYUQworu","ni2v12ZHdk","Pb1pafcJOy","9y4lw0YAGH","uN6r32ZHdk","I7p2aRpBQm","KASQ8Twano","LDk6fHRxd8","HP433lViBv",
+"zFgtBTa8f6","OUqFMy94nw","FFDuiMm8si","ZzJHWNhXdu","ZJTXHK4GS8","FGzgpMGlTF","b29RJuupzk","WDVWJd7vjM","zHF1qfcwDa","gjUTuuJScX",
+"C2IrcfLNg8","ZzJHWXflUq","Mkgy8m4bxU","yvOMIVerEA","xXTI40ao3l","jfREuIBe8k","3weIFnlaBy","cmXIXjS1aj","7ku1p8U2nU","ksJbyWreyP",
+"b29RJZuDtD","uPX7GBpYhV","ZUnqtSjskQ","MezSWlpF6W","QssNC1LB1L","Y1mC0B3qem","HfyNQiB08l","JXljWpWiOs","Cp3mZeuZA5","dhSuHzbIYY",
+"IBe8kAOgEe","qaofNBGaQY","prNT6vLsmS","DG4sT3otm6","DG4sTPOUYS","xReecKZamH","gf8rInlaBy","Waim6EoToP","iKqhr5Namm","GXdoHdhSuH",
+"F6PT2NhXdu","AIYUu5ZaEz","7lUXZMmKGJ","okgRimX2GE","XyPZNWmadA","jSjS3QChxs","iB08lUvlv4","Ta8f6fmIK1","P6bcg7fsYM","aFFssGXdoH",
+"L7cGcD6rBy","BpYhVjS1aj","t98iW0PktI","ReKEWprNT6","jfREu5Namm","FnPFBVNCPd","d85a9ix74r","9rlg9lkMUA","YjB9tyToGW","9y4lwNAFuw",
+"AkKTkvLsmS","nnP8oChuy3","qaofN6AFT0","0MR5XazIWp","RsQUqCNHmv","jtn0X5VZjS","sx5GlL7cGc","2NslmBFkb8","QssNCrz7Ut","FjHXRfaHir",
+"2ZHdks93Ml","4QMc9iqv4k","WPmlxEOE1o","ZzJHWM3zXL","SmGzvWaim6","SWfou7ku1p","O3iyQZv7z0","qQxHP0Wr5y","jzUqRBGaQY","DG4sTQYxC0",
+"BFkb8StlDJ","djsrvKZamH","lsQGopFrrl","i3pydzbIYY","euZA5Gv3Fq","gtCA5Yw2oU","aez9ysoy9t","5Mg9rpWiOs","zmLYDs93Ml","lj07QqUJMd",
+"uZPqgmz8gx","iB08l9iGoT","lH1ktJ2mQi","5IhmGBpYhV","AXpwEDcpWB","m4bxU8hJdt","4dEz6yluBx","IjTwPW7cTs","C2IrcjfREu","wDajX8TxD7",
+"64s8NNOHsz","0PktIjSjS3","zqH0WeuZA5","uPX7Gxciqp","uJScXi3pyd","bgJAzuQIcz","8FmFHZUnqt","fcJOynnP8o","S77LHZv7z0","ru4UGciuWz",
+"ZuDtD64s8N","Nxx9Vsoy9t","FPfSEjfREu","NcICAAmdQd","fcwDa7fKYU","L7cGcjtn0X","lweGyRmDcr","o8UydRmDcr","LewvM5ZaEz","fLNg8W3VFH",
+"NcICAuTacx","KZamHKZamH","TwanoEdBKc","VBjhzzQt6Q","M3zXLatef2","fqypylViBv","U3yw5b29RJ","euZA5Yf2Ec","jS1ajVNCPd","WMiS3atef2",
+"xciqpOUYuF","WreyPJRJQB","bZLvScmXIX","e6e4zprNT6","6AFT0Gv3Fq","TXQ0ZTXQ0Z","mz8gxFcWrW","ru4UGyofH3","uoStwt98iW","jS1aj55rfB",
+"jeskSWaWsv","jS1aj4W0Tl","POUYS1v5hH","ulk41Oz8yZ","sqVrfCxVEf","45cIHv8yFN","lm0pDwDajX","BCxeCGv3Fq","xXTI4RBhp0","Uvlv4jfREu",
+"8cVD3lH1kt","P6bcg1LB1L","pv0i7CNHmv","Ta8f6K4GS8","64s8NaFFss","tl72WMK07Y","JkzUn1LB1L","gIYvEGXdoH","AgJHQ618Di","AkKTk8FmFH",
+"OxWIHuJScX","07n1cs7Mxk","RACuj9y4lw","Yh1hFpvgjS","HP4339GXkX","FjHXRAgJHQ","cShY2Vprf2","Waim67Ow5C","MezSWX6Pin","uJScXJ2mQi",
+"aFFss55rfB","WreyPksJby","G1RhSzQt6Q","NhXduS77LH","n8pJ9s93Ml","8RCUApAhR1","5ZaEzVBjhz","KsjRKt98iW","Q6hMCy94nw","CNHmvVBjhz",
+"7ku1ps4786","bZLvSsqVrf","G1RhSNcICA","2ZHdkFGzgp","2NslmnnP8o","5iGN5JIqXi","dhSuHuAWyp","1j5L8Zv7z0","2DREslH1kt","nFqik2DREs",
+"pAhR1djsrv","TCgPp4W0Tl","soy9thUTw7","n8pJ90MR5X","mX2GElkMUA","CxVEfulk41","TCgPpZUnqt","VNCPdrhl0J","dmoS7oVQp6","QClRLqaofN",
+"K4GS8s7Mxk","VBjhzv1Hln","y94nwLbRTH","Cp3mZP6bcg","FcWrWC2Irc","h1zcHB3qem","RsQUqSmGzv","JIqXilCMxy","Nxx9VNhXdu","HP433POUYS",
+"qaofNLbRTH","J2mQiPOUYS","Kr8ysZhwG1","WaWsv2hEEU","taOXKJkzUn","1v5hHuZPqg","uvf7ANAFuw","SjskQ5drc6","FGzgps7Mxk","yluBxcmXIX",
+"X6PinAmdQd","K20wKMm8si","gf8rIzFgtB","bZLvSfLNg8","5drc6AkKTk","Kr8ys8xEKz","StlDJtjQxs","uJScX9rlg9","iB08leuZA5","uZPqg55rfB",
+"d7vjMeuZA5","hi5X7blLA9","nFqikzmLYD","KZamHlsQGo","7fsYMVprf2","ciuWzUmaEv","07n1ca00b5","QssNClkMUA","aL6AJuN6r3","hUTw7ix74r",
+"8U2nUx3LDe","rhl0JgdQsS","RmDcrzqH0W","M6qcG9XyT9","FjHXRCqqaD","MojnPgjUTu","Q6hMC9eoRc","qQxHPuZPqg","iKqhrFNYIM","1v5hHn8pJ9",
+"k85AeWaim6","GrDg7Yw2oU","uvf7AFLsph","k85Aesoy9t","VjCZqhe9IA","8hJdt8cVD3","FPfSEfLNg8","Zv7z0Ul4a1","uZPqgtvdkD","blLA90h1b1",
+"VerEAvLsmS","ru4UG8TxD7","FPfSEuPX7G","7fKYUzmLYD","In3NS2TRI7","ECMvUWmadA","FGzgplViBv","lH1ktUvlv4","vOqCEuJScX","Mm8simz8gx",
+"okgRiazIWp","Yh1hFNhXdu","zQt6QYOfrY","No0QbNo0Qb","WDVWJS2Dfu","i3pyd29QAz","MezSWgdQsS","2NslmpmeCd","vkCHHn8pJ9","faHirZJTXH",
+"M3zXLpFrrl","uLtKsWDVWJ","faHirxReec","Yh1hFv2eC3","2Yz7EQClRL","5IhmGkZANm","fcJOyfcJOy","SmGzvX6Pin","9rlg9QbxXc","RBhp0zQt6Q",
+"gjUTu9iGoT","cShY2G1RhS","vLsmSe6e4z","AgJHQlj07Q","wDajXAXpwE","dhSuHAmdQd","0ao3llH1kt","TCgPpSs0Zu","Dz1R3MojnP","o8UydokgRi",
+"DLhzMgtCA5","zz4ZUn8pJ9","QnJ1SoQ87r","vOqCEd7vjM","gjUTuVNCPd","Gv3FqSbRYy","uLtKscL0aE","5VZjScQOnv","lViBvxXTI4","0ao3l580YD",
+"Nxx9Vk85Ae","8U2nUMojnP","14FLRru4UG","iqv4koQ87r","Nxx9V1LB1L","s4786vOqCE","a00b50Kyfs","OUYuFRxrsm","07n1cuZPqg","0PktIrhl0J",
+"prNT6okgRi","gIYvEuupzk","CNHmvFcWrW","HlUbFUl4a1","hUTw7fcwDa","580YDcmXIX","YjB9tkZANm","prNT60ao3l","fLNg8CqqaD","Kr8ysUmaEv",
+"rz7Ut9GXkX","RpBQmzqH0W","lkMUAMojnP","xReecCK5W7","Dz1R3CIShG","xReecuN6r3","gdQsSHfyNQ","zbIYYO3iyQ","QClRLMaJQs","atef2oQ87r",
+"Yw2oUd85a9","8cVD3OUYuF","xReechi5X7","zmLYDBbwgA","OHaBzRBhp0","5Mg9rRBhp0","9iGoTzmLYD","7hyVvlpF6W","48cHLCIShG","VNCPdfLNg8",
+"5iGN5lViBv","ix74rkB5nP","o8UydoVQp6","DG4sTv2eC3","kZANmlkMUA","5Mg9rKZamH","y94nwbgJAz","zHF1qPOUYS","2DREse6e4z","7fKYUlViBv",
+"gjUTuyEfy9","IRh487Ow5C","uN6r3brhlQ","K20wKKsjRK","xciqpjzUqR","uupzkMojnP","2Yz7EblLA9","pT8wuRACuj","POUYSt98iW","29QAz45cIH",
+"ix74rVNCPd","v8yFNXyPZN","vkCHHQ6Lix","UmaEvogLgc","ZJTXHChuy3","pAhR1QnJ1S","DcpWBNOHsz","MojnP8xEKz","pT8wuFFDui","Rxrsmhe9IA",
+"1LB1LWDVWJ","azIWpni2v1","X6PinAkKTk","2DREsGWqqX","fFDrJ9y4lw","aez9ypv0i7","WDVWJdmoS7","OHaBz8FmFH","nlaBy29QAz","WreyPcL0aE",
+"QnJ1SFxX9q","9eoRc5iGN5","zbIYYVjCZq","64s8No8Uyd","uoStwyEfy9","CxVEfy94nw","KASQ8gtCA5","tl72WDz1R3","dQ586ni2v1","rhl0JKr8ys",
+"2hEEUJRJQB","e6e4zyEfy9","lXFOBUvlv4","K20wKVNCPd","9XyT9nnP8o","NhXduksJby","0MR5Xlm0pD","O3iyQ45cIH","lkMUA9iGoT","KZamHlXFOB",
+"jfREu1v5hH","Uvlv4StlDJ","soy9tgtCA5","GrDg78cVD3","WMiS3OxWIH","aFFssUl4a1","yEfy9DQimp","HP433zqH0W","lsQGolsQGo","RzaZAEOE1o",
+"VNCPdGrDg7","hi5X7Chuy3","fcwDaM3zXL","VNCPdbrhlQ","MGlTFe6e4z","VerEAIjTwP","cmXIXksJby","W3VFH2Nslm","7fKYUlweGy","jS1ajFnPFB",
+"HP433RBhp0","CqqaDNAFuw","8TxD7FFDui","7Ow5CyEfy9","WreyPhE1Ql","yEfy9VBjhz","GrDg7rz7Ut","zz4ZUbZLvS","GrDg7JKWYR","FNYIM5Drn0",
+"s4786WreyP","WaWsv29QAz","GSQwjMK07Y","Nxx9V2DREs","580YD580YD","ZhwG1xReec","jtn0XCdyBV","LewvMNcICA","2hEEURzaZA","2hEEUzFgtB",
+"FjHXReuZA5","3otm6uupzk","BFkb816lHc","x3LDeEoToP","Chuy3gdQsS","dQ586YjB9t","mz8gxCfgr3","mz8gxciuWz","i7WMQsoy9t","Yh1hFFcWrW",
+"xReecPb1pa","48cHLLewvM","atef2Ss0Zu","KZamHs93Ml","IRh4845cIH","rhl0JTXQ0Z","6AFT0WMiS3","pFrrlEdBKc","vkCHHWaim6","ksJbycmXIX",
+"tuDySY1mC0","TCgPpM6qcG","ECMvUyofH3","P6bcgulk41","CNHmvJKWYR","VjCZq5VZjS","OxWIH14FLR","7Ow5CqUJMd","LDk6fqQxHP","pAhR1VIlwP",
+"dpe1vAXpwE","0ao3lRmDcr","0h1b1IRh48","HfyNQGrDg7","fqypyKZamH","fcJOyI7p2a","KsjRKsx5Gl","OUYuFSbRYy","dpe1vHP433","AmdQdnlaBy",
+"JKWYRyvOMI","vOqCES2Dfu","QbxXclXFOB","bZLvSU3yw5","FFDuioVQp6","ZhwG124ARF","RxrsmFPfSE","IKxdL07n1c","hUTw7lH1kt","e6e4zW7cTs",
+"zbIYYlm0pD","ix74rnFqik","yluBxbgJAz","5iGN5IBe8k","suY4xo8Uyd","uupzkyofH3","POUYSECMvU","MaJQsuPX7G","aDGtShE1Ql","dhSuHOUYuF",
+"tl72WxXTI4","IjTwP0PktI","1v5hHksJby","tl72WiKqhr","9XyT9B3qem","MK07YydG8U","U3yw5gf8rI","bZLvSuvf7A","14FLRRxrsm","TXQ0ZFhtgl",
+"Yh1hFZzJHW","VNCPd7ku1p","1LB1LZv7z0","POUYSo8Uyd","0h1b1tvdkD","VNCPdfmIK1","K4GS8cQOnv","xciqptjQxs","RzaZAWMiS3","QWxoTtl72W",
+"JkzUnZ4I1v","VNCPdAmdQd","K4GS8a00b5","faHiruN6r3","lpF6WBpYhV","ZuDtD16lHc","FjHXRFGzgp","5Drn0KASQ8","EoToPgdQsS","zFgtBmz8gx",
+"5ZaEzDz1R3","ZUnqtRzaZA","PYBf4uZPqg","FwEJz9y4lw","pvgjS8xEKz","m4bxUFnPFB","xXTI48hJdt","In3NSzFgtB","VjCZqd85a9","8hJdtyofH3",
+"24ARFSs0Zu","ZzJHWKASQ8","6AFT0tuDyS","W3VFHNcICA","MGlTFMGlTF","580YDqQxHP","2Yz7EIRh48","AkKTkuN6r3","brhlQtaOXK","WaWsvCIShG",
+"n1pmOjS1aj","0Wr5yyluBx","1j5L8O3iyQ","HfyNQ7lUXZ","SWfougjUTu","JRJQBZJTXH","okgRiYjB9t","S77LHogLgc","9iGoTVerEA","t59lRQnJ1S",
+"6AFT05nmWv","ni2v1J2mQi","AgJHQcmXIX","cShY2tvdkD","TXQ0Zt98iW","7fKYUpvgjS","BFkb8mX2GE","Yf2Ec24ARF","EoToPbZLvS","yEfy945cIH",
+"UlU3MMkgy8","5iGN55drc6","M3zXL5Drn0","5VZjSru4UG","14FLRjS1aj","K4GS8WreyP","brhlQeuZA5","ni2v1M6qcG","soy9tk85Ae","gtCA5jSjS3",
+"s7MxkJ2mQi","ThjNntAOsr","cL0aEpAhR1","tl72WRkQke","v2eC3QClRL","P6bcglCMxy","QYxC0Q6Lix","djsrvIBe8k","TCgPp4QMc9","5Mg9riKqhr",
+"lH1ktgdQsS","FxX9q4QMc9","2Yz7E1v5hH","okgRis93Ml","lpF6W45cIH","5nmWvoGu6x","6q6L9Q6hMC","fLNg8nFqik","ZuDtD45cIH","k85AelH1kt",
+"P6bcgjtn0X","8U2nU7fsYM","tvdkD9GXkX","blLA9ksJby","vOqCE7hyVv","iwzGkogLgc","CqqaDd85a9","aDGtSblLA9","nFqikPOUYS","ThjNnBCxeC",
+"RACujvLsmS","9GXkXJRJQB","oVQp6iB08l","xReecI7p2a","qaofNs7Mxk","SbRYyGWqqX","Chuy3Vprf2","FwEJzdpe1v","soy9tpv0i7","BGaQY9GXkX",
+"ciuWzgtCA5","580YDdjsrv","dhSuHHRxd8","bgJAzzY1GY","FjHXR4dEz6","HRxd8AgJHQ","iwzGkhi5X7","VBjhzjeskS","OxWIHbgJAz","uZPqgzY1GY",
+"8cVD3YjB9t","pAhR15VZjS","gjUTuni2v1","zFgtBGWqqX","pAhR1s93Ml","BFkb8wDajX","kB5nP9XyT9","zFgtBFNYIM","NcICA1v5hH","LewvMUvlv4",
+"AOgEeNo0Qb","0PktINOHsz","prNT6taOXK","zbIYYlViBv","guMb8RzaZA","kZANm14FLR","9GXkX5VZjS","OHaBzGrDg7","EoToP0Wr5y","aL6AJdjsrv",
+"MojnPfaHir","Ss0Zux3LDe","cQOnvjSjS3","0ao3lCxVEf","fqypyfFDrJ","IRh48dQ586","8xEKzS77LH","dQ5862hEEU","dQ586lsQGo","4QMc9sx5Gl",
+"DcpWBzz4ZU","gjUTuIBe8k","SbRYypvgjS","uTacxgf8rI","lm0pDWPmlx","Oz8yZgf8rI","0ao3l9y4lw","XyPZNcL0aE","kZANmYOfrY","Yf2EcF6PT2",
+"No0QbokgRi","B3qems4786","blLA97lUXZ","MK07YOxWIH","0Wr5yd7vjM","5IhmGJRJQB","MmKGJ9XyT9","JkzUnW7cTs","pmeCdUlU3M","lCMxyulk41",
+"0KyfsXyPZN","VjCZqWaim6","Ta8f6tAOsr","64s8NSWfou","7Ow5Ctl72W","Cp3mZK4GS8","PYBf4WMiS3","VjCZqd7vjM","EOE1o0YAGH","rKDLJru4UG",
+"JXljWNcICA","aL6AJyvOMI","jfREue6e4z","TCgPpdjsrv","GrDg7aL6AJ","KZamHWMiS3","tjQxs8RCUA","5drc6oGu6x","64s8Njtn0X","D6rByLbRTH",
+"CdyBVJkzUn","lXFOB5Mg9r","LewvMoGu6x","zQt6QpmeCd","2NslmMmKGJ","JJs5mpFrrl","qaofN9GXkX","MaJQs1j5L8","CxVEf6q6L9","Kr8ysaDGtS",
+"Ul4a1t59lR","MaJQsksJby","VLTy6OUqFM","mX2GElpF6W","VjCZqBGaQY","Cp3mZ5IhmG","DLhzMVprf2","0MR5XpFrrl","JXljWVLTy6","uJScXThjNn",
+"BGaQYStlDJ","FnPFBRpBQm","fcwDaOUYuF","C2IrcQWxoT","iqv4kMojnP","uupzklXFOB","azIWpdQ586","MezSWF6PT2","MmKGJwiHrZ","GWqqXfqypy",
+"sx5GlJRJQB","0YAGHUmaEv","ru4UGX6Pin","ZUnqtXflUq","Chuy3FnPFB","dQ586jeskS","BFkb8JJs5m","cL0aEzz4ZU","7Ow5CMmsIo","QssNCkZANm",
+"618Div8yFN","pT8wuCqqaD","WmadAuoStw","O3iyQ5drc6","tl72W14FLR","45cIHNhXdu","wiHrZxXTI4","xciqptuDyS","45cIH8hJdt","FPfSElpF6W",
+"8xEKzmz8gx","FVMxoFVMxo","RkQkeCdyBV","8xEKzuTacx","tl72W3weIF","LbRTHDcpWB","qUJMdD6rBy","HP433IRh48","fcJOyFxX9q","KASQ8pAhR1",
+"oGu6xxciqp","U3yw5WDVWJ","SWfouHP433","YjB9ttl72W","y94nw2ZHdk","FjHXR4QMc9","Ul4a1qUJMd","ni2v1lpF6W","gdQsSYw2oU","piJSkatef2",
+"qUJMdydG8U","U3yw57lUXZ","I7p2aTCgPp","MojnPYjB9t","jfREutl72W","9eoRcCfgr3","vkCHHZ4I1v","M3zXLzmLYD","euZA5FxX9q","4W0Tlh1zcH",
+"55rfBZv7z0","QClRLlj07Q","hSSvQnlaBy","xReecmz8gx","euZA5BGaQY","7hyVvMojnP","he9IA7ku1p","14FLRU3yw5","v1Hln2Yz7E","QYxC0VLTy6",
+"ZzJHWGWqqX","5drc6pAhR1","yToGWd7vjM","zmLYD9rlg9","Yf2EcRkQke","KsjRKJKWYR","MGlTF1LB1L","GXdoHiwzGk","SjskQ8cVD3","OUYuF8U2nU",
+"uZPqg0ao3l","ydG8UuJScX","HRxd8RACuj","In3NSeuZA5","gjUTuoQ87r","ru4UGfcJOy","5nmWvMK07Y","2DREscShY2","he9IAaDGtS","t98iWlpF6W",
+"NOHsz2Yz7E","pT8wu9iGoT","Waim614FLR","v2eC3MmsIo","0Wr5yPb1pa","1v5hH5iGN5","DcpWBi7WMQ","sqVrfdjsrv","ECMvU29QAz","d7vjM7ku1p",
+"GrDg7d7vjM","SmGzvtaOXK","tl72WeuZA5","M6qcGokgRi","K4GS8v2eC3","jeskSUlU3M","hi5X7GXdoH","7ku1plkMUA","Uvlv4ThjNn","i3pyd0Kyfs",
+"16lHcY1mC0","pT8wuNOHsz","7fKYUXflUq","JKWYRRpBQm","JkzUncQOnv","618DiQssNC","KZamH0h1b1","QClRLzFgtB","tvdkDfaHir","cmXIXyofH3",
+"DG4sTfLNg8","hE1Qld85a9","FVMxoaFFss","mX2GE5Mg9r","tvdkDi7WMQ","uPX7GBFkb8","lXFOBuPX7G","4W0Tl9XyT9","Yf2EcfcJOy","dmoS7zFgtB",
+"WreyPoVQp6","G1RhSHlUbF","tvdkDEdBKc","rhl0JAgJHQ","MmsIoYOfrY","GrDg7yEfy9","nnP8oDLhzM","v1Hln7lUXZ","dmoS7Pb1pa","8hJdtKZamH",
+"ulk4164s8N","CK5W7tuDyS","he9IAI7p2a","1LB1LBGaQY","QworuVLTy6","XyPZN48cHL","GrDg7v1Hln","tAOsrsx5Gl","7Ow5C0MR5X","MGlTFlm0pD",
+"J2mQibrhlQ","FwEJzDz1R3","5iGN5faHir","ZuDtDuN6r3","0MR5Xru4UG","XyPZNe6e4z","cShY224ARF","4QMc9zmLYD","TCgPpNxx9V","tvdkDuoStw",
+"RzaZABGaQY","AkKTkOUqFM","fqypyVerEA","vLsmSCqqaD","VIlwPJXljW","FjHXRHRxd8","iKqhr2Yz7E","djsrvqaofN","8RCUA0Wr5y","jeskSs4786",
+"ECMvUFcWrW","uN6r3cL0aE","gtCA5X6Pin","NAFuwRpBQm","W7cTshSSvQ","0Wr5y7Ow5C","Kr8ysIn3NS","M3zXLogLgc","Yf2Ecd85a9","zY1GYHlUbF",
+"0YAGHyvOMI","WPmlxzqH0W","IKxdLpmeCd","hSSvQRBhp0","6q6L9Yh1hF","n8pJ9BFkb8","prNT62ZHdk","0BmCyOUYuF","48cHL618Di","d85a9rKDLJ",
+"l83UdY1mC0","uupzkbrhlQ","piJSkSs0Zu","djsrv5Drn0","KZamHF6PT2","iwzGkCIShG","WmadAaL6AJ","faHirEOE1o","5NammM3zXL","FVMxoP6bcg",
+"7fKYUS2Dfu","OUYuFUmaEv","5NammLDk6f","uLtKsOUYuF","2Yz7EQssNC","2Yz7EjfREu","4dEz6FwEJz","ReKEWZhwG1","5ZaEzeuZA5","euZA5vkCHH",
+"OxWIHksJby","9y4lwuvf7A","pv0i7okgRi","tAOsrfcwDa","taOXKWPmlx","5Drn0nnP8o","oGu6x8hJdt","uTacxiwzGk","v1Hlnzz4ZU","6q6L9yToGW",
+"hi5X7VIlwP","dQ586BCxeC","QChxsbgJAz","FLsphuQIcz","HzZT83otm6","29QAzWaim6","jiVBPGv3Fq","yToGW5Namm","Nxx9VIRh48","wDajX0Wr5y",
+"tvdkDgdQsS","tlILtJJs5m","n1pmOtvdkD","gf8rIDLhzM","KASQ8QbxXc","0h1b1MGlTF","BCxeC7hyVv","CIShGni2v1","2NslmZv7z0","bZLvSUlU3M",
+"ZUnqtgf8rI","WMiS3suY4x","LDk6fZv7z0","ThjNnzFgtB","LDk6fQClRL","bZLvS0h1b1","pT8wuMezSW","aez9yOHaBz","VIlwPuoStw","QbxXcZJTXH",
+"jfREuhE1Ql","yofH30Wr5y","gdQsSWaim6","BFkb8DG4sT","s7MxkpvgjS","Yw2oUOUqFM","SmGzvRxrsm","sqVrfhUTw7","WreyP07n1c","xXTI49eoRc",
+"FLsphzQt6Q","FhtglFhtgl","6AFT0QssNC","IjTwPFnPFB","iKqhruoStw","2hEEUNhXdu","55rfBUvlv4","RkQkeiwzGk","fFDrJIjTwP","pvgjSpvgjS",
+"8RCUAa00b5","LDk6fWmadA","MmsIoi3pyd","zY1GYKASQ8","F6PT2v2eC3","zY1GYb29RJ","vOqCECdyBV","d85a9HzZT8","cShY2FFDui","RkQkeb29RJ",
+"JXljW5Namm","piJSkFhtgl","s47869GXkX","CNHmv8cVD3","gIYvEDQimp","0PktIStlDJ","n8pJ9lXFOB","O3iyQYjB9t","SjskQjtn0X","tlILt8TxD7",
+"VerEAvOqCE","ru4UGWreyP","uAWypB3qem","618DiOUqFM","QssNCIKxdL","qQxHPi7WMQ","iqv4kuZPqg","oGu6x4W0Tl","JIqXiuZPqg","QssNCpAhR1",
+"rz7UtiKqhr","Q6LixWaWsv","oQ87rs4786","In3NSQ6hMC","RACujyToGW","M3zXLYOfrY","wiHrZuLtKs","FcWrW1j5L8","FcWrWTCgPp","LDk6fcShY2",
+"uPX7GWPmlx","FLsphKsjRK","he9IA64s8N","DLhzMHzZT8","FcWrWMGlTF","ru4UGni2v1","CdyBVTwano","580YDguMb8","t59lRCfgr3","piJSkni2v1",
+"OUYuFReKEW","5nmWv24ARF","cmXIXuZPqg","lkMUApAhR1","BGaQYL7cGc","ydG8UyEfy9","d7vjMXflUq","Nxx9Vhi5X7","ZzJHWXyPZN","1LB1LnFqik",
+"Ta8f6Oz8yZ","lH1ktpT8wu","Yf2EczQt6Q","64s8NqaofN","LewvM9rlg9","mX2GEn8pJ9","MojnPcQOnv","jeskSGv3Fq","8FmFHLDk6f","fLNg8CxVEf",
+"HP433FwEJz","64s8NfFDrJ","24ARFhSSvQ","nFqikdhSuH","2hEEUMkgy8","580YDJXljW","SbRYyEOE1o","v2eC3zFgtB","l83Udm4bxU","580YDCIShG",
+"FNYIMNcICA","0ao3lpWiOs","pv0i77fKYU","7X3uy5Namm","DcpWBFPfSE","DQimpYjB9t","gtCA58TxD7","QClRLEOE1o","RACujTwano","uN6r3JXljW",
+"o8UydRsQUq","OUqFMt98iW","fmIK1FVMxo","tlILtksJby","jzUqRHfyNQ","uAWyp9XyT9","L7cGcvOqCE","VBjhzZJTXH","uZPqghe9IA","9rlg9fmIK1",
+"zbIYY8TxD7","Ss0ZuQClRL","7ku1pVLTy6","FFDuiDz1R3","DcpWBCqqaD","CK5W7v2eC3","Ul4a1ECMvU","ru4UGMmKGJ","5VZjSuTacx","tAOsrS2Dfu",
+"GXdoHbrhlQ","cL0aEt59lR","5drc6HfyNQ","9XyT9YOfrY","djsrv8hJdt","tvdkDprNT6","Z4I1vlCMxy","S2DfuKr8ys","zz4ZUlXFOB","Yh1hFWDVWJ",
+"K4GS8okgRi","qaofNRkQke","qUJMdb29RJ","s93MlydG8U","v8yFNuTacx","CxVEfhUTw7","Q6LixdQ586","No0QbKr8ys","S2Dfuv2eC3","Oz8yZiB08l",
+"cmXIXtuDyS","TwanokB5nP","M6qcGlXFOB","AIYUuMGlTF","v1Hln0MR5X","KASQ8zqH0W","s7MxkCqqaD","6q6L9AmdQd","pT8wugf8rI","8hJdtlj07Q",
+"IRh48U3yw5","29QAzGrDg7","piJSk5nmWv","4W0TlLbRTH","lj07QF6PT2","0PktIlpF6W","t59lRuJScX","8TxD7WmadA","55rfBtAOsr","pT8wuzY1GY",
+"zQt6Q5VZjS","yToGWnFqik","wiHrZRmDcr","1j5L8AgJHQ","WDVWJO3iyQ","RzaZAJIqXi","gjUTun1pmO","14FLRqaofN","Uvlv4wiHrZ","lpF6W1LB1L",
+"7Ow5CLewvM","i3pydn8pJ9","JKWYR1v5hH","VNCPdQworu","P6bcgvOqCE","GXdoHo8Uyd","RmDcrsx5Gl","SWfoupvgjS","JXljWfcJOy","RBhp0suY4x",
+"JRJQBRpBQm","FPfSETCgPp","ogLgcAIYUu","VBjhzlj07Q","ix74rUmaEv","gf8rIwiHrZ","gf8rIUlU3M","2TRI7JKWYR","uAWypVIlwP","pFrrly94nw",
+"dmoS78U2nU","iB08l2ZHdk","he9IA5VZjS","h1zcH2Nslm","MaJQsxciqp","Yh1hF9rlg9","yToGWReKEW","LewvMEdBKc","x3LDeTXQ0Z","WDVWJU3yw5",
+"nlaByo8Uyd","i3pydsqVrf","pv0i7uvf7A","YjB9tuQIcz","618DiVjCZq","QChxsFNYIM","UlU3MQbxXc","d7vjMM3zXL","uAWypm4bxU","FxX9qzqH0W",
+"Zv7z0QYxC0","QChxsVprf2","piJSkReKEW","7Ow5CtAOsr","cQOnvaez9y","rKDLJ0ao3l","zFgtBbZLvS","XyPZNogLgc","RpBQmpv0i7","BFkb88TxD7",
+"2ZHdk64s8N","IjTwP5nmWv","lXFOBPYBf4","hSSvQqQxHP","AOgEen1pmO","Q6hMCD6rBy","yToGWGv3Fq","FwEJz5nmWv","Yw2oUAXpwE","pFrrljeskS",
+"fcJOyFjHXR","l83UdksJby","HlUbFwiHrZ","JJs5mMojnP","DQimpQ6hMC","5ZaEz9iGoT","Dz1R3QnJ1S","pvgjSl83Ud","m4bxUJXljW","Nxx9VhSSvQ",
+"WreyPkB5nP","S77LHd85a9","5VZjSQClRL","y94nwcmXIX","wDajXDG4sT","yvOMIMGlTF","vkCHHh1zcH","x3LDeydG8U","9GXkXTCgPp","lH1kttjQxs",
+"Yw2oU64s8N","d85a95iGN5","Gv3Fq45cIH","P6bcg29QAz","In3NSkB5nP","AIYUupiJSk","YOfrYUlU3M","uAWyp2DREs","UmaEv45cIH","v2eC3cmXIX",
+"jSjS3jzUqR","FPfSEC2Irc","gtCA59GXkX","M6qcGuN6r3","JKWYRVprf2","m4bxUpiJSk","zmLYDOz8yZ","cShY2ZUnqt","kB5nPDz1R3","lsQGoHP433",
+"m4bxURsQUq","v1HlnYOfrY","S2DfuVLTy6","azIWpdhSuH","O3iyQSbRYy","FNYIMksJby","No0QbFNYIM","lkMUACNHmv","cL0aEPYBf4","hi5X707n1c",
+"s93MlMm8si","JkzUn29QAz","CdyBVjzUqR","v2eC3dhSuH","jSjS3uoStw","fmIK1ThjNn","aL6AJEOE1o","1v5hHUl4a1","aez9yAgJHQ","m4bxUF6PT2",
+"tuDySuPX7G","8xEKz8cVD3","FGzgpFVMxo","taOXKRxrsm","Pb1pasqVrf","RmDcr4W0Tl","XyPZNNAFuw","0Kyfstl72W","9GXkXNcICA","BGaQYuPX7G",
+"5VZjSSs0Zu","DQimpxciqp","vOqCECIShG","lweGyb29RJ","gIYvEFPfSE","iwzGkyofH3","rKDLJv1Hln","zY1GYDQimp","dhSuHXyPZN","nnP8o0BmCy",
+"FPfSEMkgy8","Vprf2cQOnv","1v5hHBbwgA","Oz8yZ45cIH","BbwgAiKqhr","rKDLJjS1aj","6AFT0LDk6f","KsjRKMaJQs","5IhmGRzaZA","SWfoucQOnv",
+"WmadAtAOsr","pWiOsFcWrW","dhSuHK20wK","5iGN5VjCZq","iwzGkv8yFN","aez9yIn3NS","6q6L9fqypy","HP433lj07Q","jS1ajuJScX","1j5L8POUYS",
+"XflUqMaJQs","faHirzQt6Q","WPmlxmX2GE","wDajXpiJSk","MojnPOz8yZ","vkCHHnlaBy","PYBf4JRJQB","fFDrJU3yw5","uPX7GuLtKs","Ta8f6lH1kt",
+"lH1ktW3VFH","4QMc916lHc","jeskScL0aE","YOfrYkB5nP","zQt6QaL6AJ","C2Irc4W0Tl","5NammblLA9","gtCA5mX2GE","8xEKz8TxD7","a00b5hYBCK",
+"9XyT9FcWrW","nlaByDcpWB","MmsIo6AFT0","GWqqXk85Ae","LbRTHRzaZA","d85a9pFrrl","pAhR1mz8gx","rhl0JPb1pa","y94nwv2eC3","guMb87ku1p",
+"K20wKBbwgA","16lHcAIYUu","i7WMQ4QMc9","uoStw2DREs","Q6hMCVNCPd","gdQsSDG4sT","jS1ajSjskQ","HlUbFlm0pD","VjCZqjiVBP","7fsYMVLTy6",
+"IKxdLMmKGJ","k85Ae0MR5X","zFgtBni2v1","RBhp0QClRL","QChxssx5Gl","DG4sT6AFT0","zQt6Q0ao3l","ciuWzsx5Gl","FhtglL7cGc","1v5hH7fKYU",
+"pWiOstaOXK","gjUTu8xEKz","Ss0ZuJIqXi","TwanouZPqg","Mm8siuN6r3","7X3uyHP433","XflUqi7WMQ","Yw2oUuupzk","guMb8GrDg7","I7p2a0Kyfs",
+"1v5hHMojnP","FxX9qhUTw7","CNHmvZ4I1v","OUYuFQworu","FhtglF6PT2","tlILtP6bcg","Nxx9VzHF1q","pT8wulm0pD","EoToPs4786","lViBvJRJQB",
+"yEfy95nmWv","29QAz8U2nU","vkCHH0BmCy","Yh1hF2DREs","o8UydYOfrY","FPfSEIKxdL","gtCA5Mm8si","gdQsS5Drn0","cShY22Nslm","i3pydUl4a1",
+"48cHL4W0Tl","o8UydNo0Qb","fqypyd7vjM","jiVBPkZANm","B3qemnFqik","VIlwP8xEKz","WMiS3AgJHQ","No0QbVerEA","GSQwjdQ586","FnPFBMm8si",
+"2hEEUCqqaD","tvdkDm4bxU","e6e4zuLtKs","he9IAFVMxo","P6bcgksJby","NAFuwhE1Ql","fmIK1mz8gx","Z4I1vRmDcr","BbwgAlm0pD","0PktImz8gx",
+"5Drn0xciqp","VjCZqaez9y","O3iyQfFDrJ","prNT6zQt6Q","8TxD7KsjRK","GrDg7Waim6","Pb1pa48cHL","5Drn09XyT9","sqVrfJJs5m","iqv4kDG4sT",
+"jfREuuAWyp","gIYvElH1kt","atef2okgRi","W7cTslweGy","lpF6W0h1b1","hYBCKNcICA","fLNg8gIYvE","J2mQi1j5L8","Chuy3tjQxs","lpF6WCp3mZ",
+"xReecD6rBy","9XyT9UlU3M","RzaZAZzJHW","5drc6n1pmO","t59lRQClRL","8U2nUi7WMQ","e6e4zlsQGo","07n1cFPfSE","nFqikHzZT8","CK5W7zqH0W",
+"5Mg9rBpYhV","pFrrlgjUTu","RACujblLA9","fqypyi3pyd","taOXK7fsYM","fmIK1hi5X7","SbRYyZzJHW","QYxC0dhSuH","n1pmOlweGy","5ZaEz0Kyfs",
+"zHF1qKr8ys","ydG8U64s8N","fcwDa8RCUA","PYBf4VIlwP","WPmlxD6rBy","WPmlx5drc6","W7cTslXFOB","DQimpblLA9","Y1mC0uLtKs","JRJQBvLsmS",
+"lm0pDTXQ0Z","atef2uZPqg","JRJQBuupzk","jtn0XuLtKs","YOfrYqUJMd","oGu6xi7WMQ","MGlTFcmXIX","Z4I1v9eoRc","CNHmvDQimp","mX2GEt59lR",
+"oQ87rCIShG","9rlg9AOgEe","n8pJ9he9IA","yofH3pAhR1","48cHLAgJHQ","JRJQBWmadA","CK5W7dhSuH","1LB1L8TxD7","DcpWB1v5hH","JRJQBhi5X7",
+"he9IAGXdoH","brhlQogLgc","2ZHdkRACuj","8hJdtWaim6","taOXKtl72W","RACujBbwgA","Ta8f6pAhR1","QnJ1Sd85a9","StlDJ7ku1p","POUYS29QAz",
+"ZhwG1ix74r","ThjNn8hJdt","RpBQmnnP8o","RkQkeIjTwP","Yh1hFUl4a1","BpYhVzmLYD","djsrvwiHrZ","OUYuFVIlwP","8RCUAjSjS3","kB5nP0YAGH",
+"AOgEefqypy","yluBxIKxdL","LDk6faez9y","GSQwjNxx9V","MmKGJpiJSk","UlU3Msx5Gl","uQIcz4W0Tl","24ARFVjCZq","Mm8siW3VFH","RsQUqAmdQd",
+"xReecFVMxo","zHF1qwDajX","o8Uyde6e4z","mz8gxogLgc","8TxD78hJdt","IRh48oQ87r","MmKGJD6rBy","Zv7z0nlaBy","ReKEW0ao3l","FGzgpuvf7A",
+"2ZHdkdQ586","G1RhSi7WMQ","5VZjSGWqqX","1LB1L0PktI","jzUqR618Di","FNYIMfFDrJ","FGzgpM3zXL","S2DfutvdkD","fmIK1fqypy","aDGtS0Kyfs",
+"HRxd8dpe1v","Ta8f6ECMvU","zz4ZU0Wr5y","7hyVv16lHc","JKWYRdhSuH","yToGWzHF1q","0KyfsHP433","hUTw7Q6Lix","4QMc9hi5X7","iB08lQChxs",
+"7Ow5CtuDyS","L7cGcmz8gx","VerEAiB08l","uupzkguMb8","5Drn0Dz1R3","QbxXcuupzk","hSSvQLbRTH","X6Pinix74r","No0QbZv7z0","8FmFHSmGzv",
+"dpe1vuAWyp","618Di8RCUA","BpYhVHRxd8","zQt6Q7fKYU","W7cTs580YD","QWxoTCK5W7","WPmlxFPfSE","lpF6W64s8N","FwEJzAkKTk","M3zXLk85Ae",
+"07n1cCqqaD","lXFOBJXljW","7ku1pBFkb8","yofH3ZhwG1","FFDui2Yz7E","zmLYDMezSW","KZamHVIlwP","FwEJzG1RhS","14FLRLbRTH","8TxD7zY1GY",
+"FFDui2ZHdk","uN6r3ulk41","faHirFGzgp","0BmCyv1Hln","fFDrJSWfou","AgJHQjS1aj","XflUqlsQGo","JRJQBBGaQY","U3yw5In3NS","Dz1R3AkKTk",
+"8hJdtfFDrJ","45cIHUl4a1","yToGWHP433","ZUnqtni2v1","s93Ml3weIF","L7cGcSWfou","VIlwPgjUTu","1LB1LNcICA","5Drn0nlaBy","kZANmZUnqt",
+"ulk41kZANm","pvgjSIjTwP","8RCUAI7p2a","2DREssx5Gl","GSQwjuTacx","soy9tl83Ud","7lUXZCfgr3","ni2v1FjHXR","8FmFHIjTwP","OUYuFO3iyQ",
+"SmGzvQChxs","uTacxyofH3","zY1GYM3zXL","atef2Oz8yZ","ulk41MmsIo","ydG8U5Mg9r","WDVWJVprf2","5IhmG55rfB","WPmlx2TRI7","RmDcr5nmWv",
+"MmsIohe9IA","MmsIoLbRTH","gf8rIAXpwE","xXTI4AmdQd","FxX9qfmIK1","2TRI7h1zcH","b29RJUmaEv","KASQ80Wr5y","QworuFVMxo","RzaZAYf2Ec",
+"GSQwjVjCZq","EdBKcTwano","brhlQ1v5hH","RzaZA5nmWv","3otm6BCxeC","EdBKc6AFT0","cmXIXKsjRK","48cHLCK5W7","0MR5XblLA9","hi5X7gf8rI",
+"i7WMQgf8rI","In3NSHzZT8","QChxssoy9t","W7cTsJRJQB","Waim6d85a9","Q6hMCUvlv4","uTacxaez9y","pFrrlNcICA","14FLRP6bcg","MojnPxXTI4",
+"oQ87rZuDtD","d85a9PYBf4","M6qcGDcpWB","618DipiJSk","CK5W7nFqik","jzUqRsuY4x","he9IAKASQ8","tvdkD1j5L8","pmeCdFxX9q","SmGzvWreyP",
+"jeskSCxVEf","EdBKchSSvQ","7ku1pvLsmS","M3zXLHfyNQ","Ta8f6rz7Ut","iB08lIn3NS","FGzgpvLsmS","CdyBVC2Irc","uPX7Gdjsrv","6q6L9ZJTXH",
+"y94nw4W0Tl","VBjhzyluBx","cShY2uupzk","xciqph1zcH","gf8rIJKWYR","IRh48KsjRK","GWqqXogLgc","FjHXRnnP8o","FwEJzOz8yZ","iqv4kZuDtD",
+"uJScXeuZA5","zbIYYGWqqX","VNCPdK20wK","0ao3lAmdQd","qQxHP29QAz","9GXkXtuDyS","taOXKTCgPp","NhXdu4dEz6","t59lRKZamH","ThjNnnnP8o",
+"uvf7A7ku1p","7fKYUoGu6x","YOfrYyvOMI","AXpwEK20wK","Ss0Zue6e4z","5iGN5VIlwP","3weIFVprf2","dhSuHZhwG1","dhSuH5VZjS","jzUqRgjUTu",
+"ZhwG1hYBCK","okgRiS2Dfu","QWxoTulk41","guMb8UlU3M","gjUTujzUqR","SmGzvDLhzM","8cVD3EoToP","7fsYMzbIYY","HlUbFeuZA5","CxVEfIBe8k",
+"wDajXpAhR1","7fsYMo8Uyd","lsQGoJ2mQi","lH1ktHfyNQ","blLA9618Di","7fKYU618Di","oQ87rt98iW","tjQxsM6qcG","HRxd8FcWrW","QnJ1Sxciqp",
+"fcwDarhl0J","FcWrWMkgy8","WaWsvReKEW","tjQxspT8wu","ECMvUjzUqR","4dEz6v8yFN","dmoS7lViBv","MezSWMaJQs","5NammK20wK","AgJHQkB5nP",
+"0YAGHUlU3M","lj07QMm8si","9iGoTru4UG","CqqaDWMiS3","fmIK1Nxx9V","8TxD7ru4UG","Yf2Ec8U2nU","PYBf4gIYvE","QnJ1SEOE1o","soy9t6q6L9",
+"s93Ml2Yz7E","9GXkXBCxeC","L7cGc0ao3l","Qworub29RJ","jeskSlCMxy","okgRiCNHmv","nnP8oX6Pin","qUJMdgjUTu","JIqXiyvOMI","sx5GlWPmlx",
+"CdyBVs4786","M3zXLlweGy","gf8rIuLtKs","ThjNnAXpwE","dpe1vrhl0J","0BmCyFGzgp","JXljWW7cTs","1j5L8cmXIX","OUYuF1LB1L","jeskSguMb8",
+"ZUnqtlpF6W","FcWrWuLtKs","FLsphK4GS8","48cHLjiVBP","6q6L9QClRL","55rfBLewvM","VBjhzPOUYS","S77LHdhSuH","C2Irc8RCUA","FFDui1v5hH",
+"uAWypuvf7A","8cVD345cIH","h1zcHksJby","C2Irc9GXkX","I7p2aprNT6","mz8gx5VZjS","SWfouFNYIM","oVQp65drc6","PYBf4Twano","uPX7GRzaZA",
+"6q6L9618Di","sx5GlNhXdu","0PktIWDVWJ","K4GS8QYxC0","2ZHdkAmdQd","24ARFcQOnv","F6PT2s4786","lweGyWPmlx","Yw2oUiqv4k","k85AeKr8ys",
+"nnP8oJkzUn","WaWsvG1RhS","Zv7z02DREs","L7cGcWPmlx","2TRI76AFT0","lXFOB9y4lw","GWqqXxReec","oVQp6MmsIo","BCxeCmz8gx","brhlQdQ586",
+"POUYSTCgPp","tuDySzbIYY","lm0pDjzUqR","2hEEUZUnqt","CIShG9iGoT","pT8wujeskS","EoToPx3LDe","5nmWvVNCPd","okgRi5iGN5","CdyBVpFrrl",
+"uLtKs8hJdt","5NammzHF1q","UlU3MCdyBV","oQ87rlm0pD","BbwgA8hJdt","FPfSEYOfrY","pFrrlZJTXH","1j5L81LB1L","FNYIMyEfy9","x3LDetlILt",
+"gf8rI7hyVv","WMiS3GSQwj","7Ow5CDcpWB","IKxdLsoy9t","AmdQdtuDyS","Oz8yZMkgy8","TwanoM3zXL","XyPZNUlU3M","1LB1LMmsIo","RBhp0d7vjM",
+"Vprf2t98iW","Chuy38cVD3","lViBvBFkb8","qaofNpWiOs","Chuy3GrDg7","YOfrYyEfy9","2NslmWreyP","3weIFvkCHH","uJScXF6PT2","Q6hMCkZANm",
+"HRxd8U3yw5","ReKEW1j5L8","4QMc9SjskQ","5nmWvBCxeC","MmsIogf8rI","pWiOsAIYUu","ECMvUM6qcG","6AFT0MojnP","FnPFBAkKTk","rz7UtDQimp",
+"jSjS3HlUbF","i7WMQAkKTk","AOgEehi5X7","8U2nUyofH3","cmXIXkZANm","fqypyXyPZN","aFFssix74r","uvf7AbrhlQ","XflUqDLhzM","v2eC3uTacx",
+"wDajXzY1GY","dQ586EOE1o","618DilkMUA","NAFuwlXFOB","vOqCEpT8wu","FcWrWulk41","3weIFmz8gx","lViBveuZA5","0BmCyTXQ0Z","5drc6CxVEf",
+"kZANmK20wK","faHirRzaZA","5IhmGVIlwP","KZamHFnPFB","TXQ0Ztl72W","MK07YgjUTu","RmDcrAkKTk","HzZT8iwzGk","AXpwEksJby","lXFOBVNCPd",
+"QssNCqUJMd","d85a9uvf7A","GSQwj2TRI7","tl72WBbwgA","SWfoujiVBP","hE1Ql2TRI7","CNHmvbZLvS","2DREsmX2GE","aL6AJVLTy6","FGzgpRmDcr",
+"NhXduJIqXi","JJs5mCIShG","hi5X7X6Pin","he9IAPOUYS","JRJQBTXQ0Z","jeskS7X3uy","wiHrZ16lHc","cL0aEl83Ud","zY1GY2Nslm","O3iyQJJs5m",
+"Yf2Ece6e4z","sx5GlMK07Y","tvdkDW7cTs","Uvlv4y94nw","gIYvE8RCUA","AkKTkPOUYS","Ss0Zu5Namm","pWiOsBFkb8","djsrvDcpWB","EoToPru4UG",
+"pFrrldQ586","rKDLJSWfou","gjUTuPOUYS","M6qcGfFDrJ","ECMvUhe9IA","suY4x5drc6","zQt6Q6q6L9","Q6LixksJby","ZhwG1ThjNn","VjCZqHRxd8",
+"0PktI1j5L8","uJScXJIqXi","oGu6xCp3mZ","9GXkXHlUbF","NAFuwG1RhS","bgJAzi3pyd","FPfSEiB08l","jS1ajciuWz","y94nwiKqhr","tAOsruN6r3",
+"BGaQYFPfSE","M6qcGhe9IA","WaWsvU3yw5","uoStwQworu","v1HlnHfyNQ","hSSvQ9iGoT","MaJQsSmGzv","RkQkeMezSW","ZJTXHFVMxo","2ZHdkQnJ1S",
+"Pb1paWaim6","blLA9BpYhV","07n1ceuZA5","lpF6WpvgjS","fqypyQYxC0","JkzUnSbRYy","wiHrZ07n1c","DG4sT14FLR","hYBCK8cVD3","VBjhzThjNn",
+"taOXKuoStw","VerEAZhwG1","VIlwPmX2GE","zbIYY0Wr5y","oVQp64dEz6","s93MlzFgtB","M6qcGP6bcg","5Drn01j5L8","5Mg9rfLNg8","1LB1L6AFT0",
+"JRJQB6q6L9","xReecBCxeC","CxVEfjiVBP","FFDuizHF1q","b29RJlm0pD","MmsIoCIShG","NcICAMojnP","FNYIMfaHir","RkQkeVprf2","KsjRKNOHsz",
+"FLsphdhSuH","9iGoTl83Ud","Yh1hFReKEW","L7cGc2Yz7E","618DizQt6Q","2hEEUOUYuF","rKDLJ16lHc","rhl0J8TxD7","JRJQBguMb8","ReKEWQClRL",
+"8RCUA7X3uy","POUYSzz4ZU","8cVD3lkMUA","IjTwPNxx9V","fcJOysx5Gl","MmsIoK4GS8","45cIHjfREu","o8UydJJs5m","k85AeFPfSE","tvdkDNOHsz",
+"xciqp0PktI","xciqpSbRYy","6AFT0Nxx9V","M6qcGtlILt","G1RhSgjUTu","XyPZN8xEKz","iB08lWaim6","wiHrZVjCZq","X6PinGXdoH","BFkb8IRh48",
+"aL6AJm4bxU","s7MxkSs0Zu","0MR5XxXTI4","Nxx9VbrhlQ","Y1mC045cIH","aDGtSulk41","7hyVvIBe8k","lCMxyChuy3","d85a97Ow5C","ru4UGpmeCd",
+"ydG8UG1RhS","WPmlxMm8si","ciuWz55rfB","MezSWDQimp","AIYUunFqik","EdBKczHF1q","9GXkXQYxC0","D6rByt98iW","tl72Wa00b5","aez9yFNYIM",
+"AIYUuBbwgA","FFDuiiKqhr","4W0TllH1kt","o8UydFwEJz","UlU3M2Nslm","NcICADLhzM","JKWYRpT8wu","GSQwj2ZHdk","XflUq8FmFH","HzZT8WreyP",
+"k85AeD6rBy","AmdQdDz1R3","14FLRZv7z0","uJScXs7Mxk","2hEEUd85a9","a00b5P6bcg","4QMc90PktI","SmGzvXyPZN","fcwDae6e4z","lCMxyB3qem",
+"sx5GlksJby","jSjS3gf8rI","RBhp0B3qem","64s8N5Drn0","MGlTF2Nslm","8hJdt7ku1p","fFDrJi7WMQ","No0QbQnJ1S","oVQp6ydG8U","4W0Tl6AFT0",
+"FFDuipT8wu","QssNC8TxD7","SmGzvCNHmv","618DiDG4sT","FNYIMMezSW","14FLRIKxdL","CqqaDNxx9V","2hEEUHRxd8","FPfSEatef2","Z4I1vAgJHQ",
+"KASQ8CxVEf","l83UdQ6hMC","jtn0XJRJQB","2Yz7E4dEz6","DLhzMMm8si","cmXIXBGaQY","VBjhzfcJOy","sqVrfHfyNQ","uTacx618Di","d85a9ru4UG",
+"lCMxy55rfB","zbIYYgIYvE","oQ87rLewvM","pFrrlbrhlQ","SbRYyyEfy9","0KyfsCp3mZ","qQxHPJIqXi","SjskQDLhzM","Mm8sizbIYY","tuDySuLtKs",
+"tvdkD8TxD7","8FmFHyvOMI","lH1ktSs0Zu","pvgjSi7WMQ","FjHXRFwEJz","blLA9zmLYD","zFgtBUlU3M","SWfouIn3NS","W7cTsaDGtS","GXdoHWDVWJ",
+"vLsmSxXTI4","7fKYU45cIH","FLsphnnP8o","7X3uyLDk6f","9eoRcjtn0X","DLhzMatef2","L7cGczQt6Q","5IhmGSs0Zu","cShY2Zv7z0","Uvlv4AkKTk",
+"Mkgy8HlUbF","fLNg8Mkgy8","azIWpi7WMQ","9rlg9S2Dfu","ZuDtDiqv4k","F6PT20BmCy","ZJTXH5IhmG","KZamHn8pJ9","YjB9tJIqXi","KZamHcShY2",
+"lCMxye6e4z","tl72WmX2GE","uvf7AGv3Fq","NcICAs7Mxk","5ZaEzdjsrv","VLTy6NcICA","45cIHCdyBV","WMiS3d85a9","lCMxyAkKTk","oVQp6OxWIH",
+"tl72WOHaBz","C2Irc2TRI7","jSjS3pmeCd","MmKGJTXQ0Z","DQimpNhXdu","7fsYMnnP8o","mz8gxFFDui","WPmlxIn3NS","rz7Ut24ARF","zbIYYUlU3M",
+"bZLvSM6qcG","1j5L8iqv4k","uAWypHzZT8","jS1ajTa8f6","XyPZNmz8gx","618Di0h1b1","pv0i79iGoT","ydG8UjS1aj","d7vjM7lUXZ","s7Mxk14FLR",
+"RpBQmAXpwE","okgRiCxVEf","Ss0Zut59lR","StlDJoQ87r","8hJdtnFqik","mz8gxNOHsz","5nmWva00b5","Twano7hyVv","AgJHQJKWYR","azIWpyluBx",
+"WMiS3CdyBV","0MR5XAgJHQ","rz7UtqUJMd","zQt6QogLgc","LewvMWaWsv","mz8gxY1mC0","jzUqRsoy9t","CxVEf2hEEU","zY1GYjSjS3","8RCUAEdBKc",
+"s7MxkQ6Lix","StlDJCNHmv","o8UydGWqqX","uvf7AlpF6W","TCgPpS2Dfu","1LB1LyEfy9","suY4xgIYvE","prNT6Twano","MK07YoGu6x","pFrrlaL6AJ",
+"45cIHuPX7G","Dz1R3cShY2","14FLR2Yz7E","X6Pinx3LDe","5ZaEzlXFOB","0h1b1JRJQB","Mkgy8K4GS8","i7WMQTa8f6","dhSuHTwano","SWfou8FmFH",
+"Kr8ysfqypy","lViBvbgJAz","iwzGkNcICA","TCgPpOz8yZ","9iGoT7ku1p","QClRLWaim6","Yf2Ec9XyT9","GSQwj9GXkX","5drc6OUqFM","SWfou0Wr5y",
+"Gv3FqNOHsz","Yf2EczqH0W","TwanoSWfou","55rfB9rlg9","lViBvdpe1v","k85AeqQxHP","NcICABGaQY","GSQwjFGzgp","v2eC3euZA5","YjB9tfLNg8",
+"ix74rrhl0J","Mm8si16lHc","faHirReKEW","O3iyQhi5X7","kZANmFxX9q","JXljW8U2nU","pFrrlGXdoH","uAWyp3otm6","YjB9t8cVD3","8hJdt5Drn0",
+"GWqqXBbwgA","X6PinhYBCK","oGu6xJJs5m","dpe1vPYBf4","iB08l0ao3l","CK5W7i7WMQ","BFkb8e6e4z","cL0aEatef2","Ta8f6S2Dfu","nlaByTCgPp",
+"8xEKzFNYIM","FhtglfcJOy","Ta8f6QnJ1S","aez9yDG4sT","uPX7GwDajX","2NslmU3yw5","7X3uy2ZHdk","RpBQmVBjhz","F6PT2atef2","OUqFMMkgy8",
+"jzUqRgIYvE","oVQp6cShY2","BbwgA64s8N","fmIK1WDVWJ","14FLRTXQ0Z","K4GS8D6rBy","RmDcr8cVD3","HzZT8Ta8f6","Yf2EcNhXdu","lkMUA2TRI7",
+"ZzJHWEdBKc","FcWrWKsjRK","UlU3MI7p2a","fcwDamX2GE","i7WMQk85Ae","MmsIoQYxC0","9y4lwTXQ0Z","d85a9uN6r3","kZANmCdyBV","4dEz6M3zXL",
+"CK5W71v5hH","5ZaEzBCxeC","JIqXinFqik","zbIYYb29RJ","BbwgAUvlv4","gjUTuRBhp0","1LB1LBbwgA","KsjRKIjTwP","5iGN5hE1Ql","Yw2oUlweGy",
+"Cfgr32TRI7","bgJAzo8Uyd","C2IrcQ6hMC","XflUqyvOMI","uvf7AWaWsv","nFqikCNHmv","2DREsblLA9","9eoRcd85a9","pv0i7GWqqX","0ao3lGv3Fq",
+"QssNClpF6W","SWfouhYBCK","WDVWJNAFuw","soy9tAOgEe","RpBQmM3zXL","QworuAXpwE","EdBKcCK5W7","QYxC0d7vjM","580YDi3pyd","3weIFuoStw",
+"JJs5mjeskS","G1RhSIRh48","zqH0W9iGoT","oQ87rAgJHQ","2DREs0PktI","Cp3mZciuWz","okgRi7lUXZ","uAWypHP433","Cp3mZ2Nslm","5Nammn1pmO",
+"7ku1pn1pmO","s7MxkFhtgl","8TxD7DG4sT","2hEEUhE1Ql","S77LHtuDyS","hUTw73otm6","OHaBz0h1b1","hE1QlYw2oU","jS1ajyEfy9","CxVEfn1pmO",
+"QbxXcjiVBP","ogLgcBGaQY","WPmlxlpF6W","gjUTuRzaZA","Yh1hFjtn0X","l83UdokgRi","8xEKz0ao3l","S2DfuxReec","guMb80BmCy","Q6Lixuvf7A",
+"FnPFBPYBf4","RBhp0oQ87r","9eoRci7WMQ","5Drn0Uvlv4","cQOnvcmXIX","bgJAzrhl0J","WDVWJt98iW","Ss0Zu0MR5X","o8UydtaOXK","iB08lIBe8k",
+"lkMUA9y4lw","zbIYYFLsph","OUqFMG1RhS","hSSvQyofH3","JIqXiulk41","K20wK9GXkX","F6PT2U3yw5","blLA9YOfrY","YjB9tAIYUu","rhl0JJJs5m",
+"29QAzEOE1o","tl72WBGaQY","IKxdLnFqik","mX2GEuN6r3","zFgtBOUqFM","0PktI5Drn0","Yw2oU4QMc9","K20wK3otm6","MmsIoulk41","WmadAIKxdL",
+"RACujFcWrW","piJSkIjTwP","0PktIZuDtD","618DiKsjRK","618DiKASQ8","Ul4a1y94nw","tl72WlsQGo","ciuWzYh1hF","blLA9O3iyQ","lCMxyiwzGk",
+"vkCHHNhXdu","JXljW580YD","pFrrlJKWYR","MaJQse6e4z","d7vjMG1RhS","SjskQZ4I1v","7lUXZdQ586","JkzUnpvgjS","S77LHpiJSk","LDk6fOUYuF",
+"rz7UtlpF6W","5IhmGsuY4x","lm0pDaDGtS","5ZaEziKqhr","pT8wuCK5W7","HlUbFpAhR1","8TxD7pvgjS","sqVrfb29RJ","RsQUqMezSW","DG4sTt98iW",
+"FPfSEFFDui","7hyVvCfgr3","9GXkX5IhmG","S2Dfu9GXkX","lj07QuJScX","RsQUq4dEz6","7fsYM1v5hH","NAFuwUlU3M","QnJ1SBGaQY","5drc645cIH",
+"wiHrZo8Uyd","gtCA5FwEJz","v8yFNFjHXR","HRxd8n8pJ9","GWqqXzqH0W","gf8rIbZLvS","lXFOBydG8U","pWiOsHfyNQ","nFqikU3yw5","No0QbHlUbF",
+"uLtKshSSvQ","jeskSlkMUA","lpF6WRzaZA","DcpWBsx5Gl","LewvMMGlTF","Z4I1vLDk6f","xXTI4jeskS","FGzgpChuy3","lCMxyVLTy6","RmDcrpFrrl",
+"QbxXcXflUq","3weIF6q6L9","uPX7Ge6e4z","euZA5oGu6x","Z4I1vlXFOB","l83UdRzaZA","7lUXZzFgtB","55rfBaL6AJ","rhl0J9XyT9","8U2nUdQ586",
+"2TRI7cQOnv","ogLgcUvlv4","nlaBy2Yz7E","djsrvMkgy8","Mm8siWDVWJ","dQ586Chuy3","7hyVvJ2mQi","hYBCK8U2nU","KZamHydG8U","AIYUus4786",
+"Zv7z01j5L8","IBe8ky94nw","VLTy6lweGy","QYxC0HzZT8","y94nwuN6r3","WaWsvbrhlQ","aez9y5Namm","Yf2EcdhSuH","soy9tFhtgl","nFqikdQ586",
+"16lHcv1Hln","M6qcGZv7z0","45cIHHzZT8","lCMxy16lHc","CIShGcmXIX","FVMxoDcpWB","v8yFNSs0Zu","zFgtBzmLYD","pAhR1t98iW","tjQxs2TRI7",
+"48cHLHP433","8RCUAiB08l","ru4UGjtn0X","DG4sT7hyVv","0MR5XZJTXH","ThjNnQWxoT","5VZjSHzZT8","kB5nPyEfy9","BCxeChSSvQ","8cVD3lm0pD",
+"WaWsvKsjRK","0YAGHMK07Y","AgJHQECMvU","Uvlv4QnJ1S","POUYSlViBv","IBe8kaL6AJ","7Ow5ChSSvQ","xciqpRpBQm","mX2GE8xEKz","FLsphUmaEv",
+"9iGoTFwEJz","C2IrcNxx9V","3weIFWMiS3","FcWrWyEfy9","In3NSv2eC3","5Mg9rpiJSk","FGzgp24ARF","I7p2aNOHsz","Kr8ys7ku1p","29QAzVBjhz",
+"pT8wuoQ87r","iB08lAmdQd","suY4xNxx9V","Yw2oU8FmFH","FjHXRBCxeC","GrDg7uoStw","7hyVvWMiS3","24ARFlweGy","VLTy6gdQsS","kB5nP9rlg9",
+"EdBKcKZamH","GrDg7WPmlx","5drc6Chuy3","hi5X7FNYIM","ZuDtD8xEKz","RpBQmMojnP","Zv7z0Fhtgl","dpe1vvOqCE","KZamHoVQp6","uvf7AMojnP",
+"ulk41vkCHH","8cVD3soy9t","qUJMdulk41","1j5L8i7WMQ","LDk6fciuWz","M3zXLAIYUu","8hJdt4QMc9","Q6Lixlm0pD","lpF6WeuZA5","WaWsvC2Irc",
+"pFrrlU3yw5","xReecd7vjM","BFkb8VjCZq","QChxsIBe8k","RBhp0cShY2","x3LDejtn0X","WPmlxNxx9V","i7WMQs7Mxk","aFFssYh1hF","4W0TlQChxs",
+"0KyfsJJs5m","Yh1hF0Kyfs","Fhtgl3otm6","hYBCKoVQp6","hUTw7fFDrJ","iB08lMGlTF","xciqpyToGW","b29RJaL6AJ","I7p2aIKxdL","JXljWHRxd8",
+"WDVWJFPfSE","VerEA2ZHdk","P6bcg0MR5X","IKxdL5Mg9r","IRh48dhSuH","0YAGHHP433","45cIHReKEW","HRxd8K4GS8","HlUbFfLNg8","mX2GEoQ87r",
+"tl72WpvgjS","piJSkhUTw7","dpe1vdmoS7","4QMc9blLA9","bZLvSHP433","Cp3mZAXpwE","pvgjS8hJdt","G1RhSEoToP","guMb8J2mQi","NcICAS77LH",
+"1v5hH8cVD3","HRxd8RsQUq","DLhzMWmadA","uJScXRBhp0","QnJ1SWaWsv","x3LDeM6qcG","GXdoHtjQxs","AgJHQStlDJ","RpBQmtlILt","580YD7X3uy",
+"NcICAYf2Ec","2Yz7ERACuj","FcWrWhSSvQ","lweGyuJScX","HzZT8ydG8U","ogLgcDG4sT","F6PT2FNYIM","U3yw5FPfSE","0YAGHfcwDa","FPfSE64s8N",
+"hYBCKF6PT2","uPX7G9rlg9","QClRLZhwG1","dhSuHyEfy9","uN6r32TRI7","64s8NAmdQd","BCxeC6AFT0","YjB9tFPfSE","HP433FPfSE","uN6r3LDk6f",
+"In3NSVerEA","0PktIjS1aj","GSQwjuJScX","RsQUqbgJAz","C2IrcksJby","WreyPblLA9","lH1ktqQxHP","pv0i7K4GS8","CK5W7OHaBz","1LB1LfcJOy",
+"GSQwjv1Hln","VLTy6dmoS7","aDGtSwDajX","aez9yhYBCK","JRJQBBpYhV","ni2v1hYBCK","ni2v1djsrv","F6PT2yofH3","ZJTXHCxVEf","ksJbyNAFuw",
+"HP433MmKGJ","blLA9zFgtB","RmDcrv2eC3","DcpWBn1pmO","xReec24ARF","HlUbFdjsrv","9rlg9x3LDe","uTacxpAhR1","29QAzGXdoH","d7vjMGrDg7",
+"jS1aj07n1c","SWfou7lUXZ","XflUqQnJ1S","hUTw7jzUqR","cmXIXFFDui","3otm6Oz8yZ","uQIcz8xEKz","9y4lwjSjS3","2hEEUpT8wu","TwanoiwzGk",
+"piJSk8FmFH","mz8gxJXljW","jSjS3iB08l","rKDLJrhl0J","Ta8f6618Di","0BmCyGWqqX","J2mQihSSvQ","WDVWJHzZT8","Zv7z0suY4x","1LB1LVerEA",
+"fcJOyNOHsz","5VZjSyvOMI","QbxXct59lR","TwanouQIcz","Q6hMCChuy3","IBe8kKr8ys","pmeCdFGzgp","Qworu3otm6","dhSuH3weIF","uJScXDLhzM",
+"IjTwPzqH0W","euZA5fcwDa","d7vjMhUTw7","XyPZNOHaBz","WDVWJBFkb8","WreyPIjTwP","RzaZAJXljW","2DREs5Drn0","BGaQYVLTy6","l83UdFxX9q",
+"n1pmOe6e4z","AgJHQPOUYS","07n1c0BmCy","l83Ud55rfB","Gv3FqfmIK1","14FLREOE1o","zz4ZUhUTw7","RpBQmB3qem","qUJMdUl4a1","1v5hHs7Mxk",
+"AmdQd2Nslm","Chuy32ZHdk","RBhp0yToGW","ciuWzazIWp","ZhwG11v5hH","hUTw7tAOsr","GWqqXjSjS3","MezSW48cHL","o8UydRkQke","M3zXLFPfSE",
+"MojnPx3LDe","d7vjMMGlTF","SWfou9GXkX","StlDJulk41","BGaQY0ao3l","TXQ0ZMGlTF","soy9tDcpWB","FnPFBcShY2","14FLRs7Mxk","LewvMDcpWB",
+"DcpWBaDGtS","Dz1R3he9IA","M6qcGYf2Ec","EOE1oYf2Ec","b29RJm4bxU","pvgjSiB08l","kZANmReKEW","i7WMQEOE1o","In3NSuJScX","5NammprNT6",
+"rz7UtFGzgp","tvdkDrz7Ut","LbRTH8U2nU","4dEz6azIWp","ZUnqtTwano","yEfy9PYBf4","UlU3Mlj07Q","YOfrYiqv4k","cmXIXMkgy8","pAhR1MojnP",
+"YjB9tHfyNQ","Waim6v8yFN","cL0aEIn3NS","SjskQUlU3M","UlU3M6AFT0","0KyfslsQGo","v2eC3zmLYD","5nmWvbrhlQ","No0QbpFrrl","VerEAyofH3",
+"5IhmGo8Uyd","lViBv3otm6","5VZjSlkMUA","uPX7GRsQUq","lViBvFxX9q","2Nslm29QAz","m4bxUtjQxs","W7cTs5Drn0","GSQwjFhtgl","rKDLJv2eC3",
+"YOfrYlpF6W","n1pmO0ao3l","RsQUqguMb8","RBhp0M3zXL","Mm8sigdQsS","prNT6Oz8yZ","Mkgy8blLA9","OHaBz2hEEU","QssNC5nmWv","BCxeCfcwDa",
+"29QAzk85Ae","U3yw5EoToP","IjTwPjiVBP","ECMvU8TxD7","ZuDtDVerEA","AXpwEbgJAz","MezSW2Nslm","gjUTuFNYIM","Waim6QbxXc","9XyT9yofH3",
+"4W0TlFFDui","JkzUnokgRi","5iGN5v8yFN","xXTI4lj07Q","F6PT2POUYS","YOfrYdjsrv","FVMxoG1RhS","Y1mC0ydG8U","zz4ZU580YD","64s8NdhSuH",
+"HRxd8zbIYY","FxX9qCfgr3","brhlQtl72W","tuDySZzJHW","vOqCEW3VFH","uTacxHlUbF","lCMxyxReec","MezSWtuDyS","1v5hHHfyNQ","LewvM7fsYM",
+"zQt6Qix74r","FxX9qGXdoH","7ku1pJkzUn","YOfrYZ4I1v","AXpwENAFuw","zHF1q29QAz","6AFT0No0Qb","CdyBVs93Ml","ulk41FLsph","ydG8UMmKGJ",
+"xReecWPmlx","qUJMdFFDui","oGu6xgjUTu","RsQUqNxx9V","0BmCyVjCZq","FGzgpQClRL","Ta8f6zbIYY","FPfSE4QMc9","AOgEe618Di","FVMxocmXIX",
+"IRh48dmoS7","oVQp6UmaEv","hSSvQazIWp","lkMUAatef2","HfyNQdpe1v","AkKTkatef2","uTacxDcpWB","uTacx9GXkX","GSQwjC2Irc","ru4UGfmIK1",
+"8TxD7VLTy6","07n1coVQp6","DG4sTm4bxU","CNHmvNhXdu","pvgjSS2Dfu","RpBQmfaHir","Ta8f6lCMxy","QbxXcCIShG","Yh1hFZv7z0","IBe8kMmsIo",
+"guMb8d7vjM","Oz8yZTwano","uoStwECMvU","WMiS3uPX7G","5Drn0yofH3","TXQ0ZuZPqg","fFDrJBGaQY","SbRYyv1Hln","C2IrcBGaQY","2TRI7WreyP",
+"P6bcgdmoS7","sqVrfFVMxo","i7WMQUl4a1","a00b5AXpwE","DLhzMRsQUq","MmsIo9eoRc","jSjS3d7vjM","CqqaDi3pyd","iqv4kUvlv4","EdBKclViBv",
+"StlDJuPX7G","aL6AJpv0i7","WmadAMojnP","O3iyQiqv4k","MojnPiB08l","gdQsSlH1kt","WreyPaez9y","EdBKcO3iyQ","ZhwG1FwEJz","XflUqyofH3",
+"0PktIYf2Ec","M3zXLsoy9t","POUYSk85Ae","UlU3MDQimp","7fKYUMezSW","9iGoTS77LH","8TxD7ZJTXH","kZANm4QMc9","9iGoTfqypy","AOgEeoGu6x",
+"618DibZLvS","ThjNnpAhR1","U3yw5FLsph","yofH3lpF6W","8RCUATCgPp","tlILtB3qem","5ZaEz5IhmG","CqqaDni2v1","ogLgcMkgy8","rz7Ut5VZjS",
+"kB5nP4QMc9","atef2EoToP","AkKTk5drc6","pAhR15ZaEz","9iGoTiB08l","JRJQB9GXkX","BFkb8zqH0W","v8yFNtjQxs","Mkgy87Ow5C","jSjS314FLR",
+"oGu6xzQt6Q","CxVEfYh1hF","uvf7Ad7vjM","iB08lSmGzv","Q6hMCmz8gx","gjUTubgJAz","VerEAW7cTs","FLsph4dEz6","S2Dfuni2v1","lViBvOz8yZ",
+"QClRLFnPFB","lViBvd85a9","FwEJze6e4z","RsQUqBpYhV","CdyBVMmsIo","IBe8kdjsrv","5ZaEzPb1pa","FnPFB1LB1L","48cHL7hyVv","yToGWgtCA5",
+"JRJQBhUTw7","Dz1R3AXpwE","Pb1paWaWsv","WPmlx8U2nU","zz4ZUaFFss","MK07YcShY2","7Ow5CQnJ1S","UlU3MuAWyp","CxVEfsqVrf","SWfouVerEA",
+"okgRiuTacx","5ZaEzSjskQ","Cfgr38hJdt","4QMc9djsrv","RzaZAIRh48","6AFT0aL6AJ","48cHLB3qem","hSSvQsqVrf","xXTI4Twano","In3NSvLsmS",
+"dQ5862Yz7E","m4bxUuPX7G","jSjS3n8pJ9","zz4ZUJRJQB","Pb1paJRJQB","tlILtEOE1o","0ao3lguMb8","VNCPdzmLYD","taOXKYjB9t","9GXkX8cVD3",
+"lm0pDDz1R3","45cIH9eoRc","rz7UtiB08l","9eoRcsoy9t","07n1cOHaBz","okgRijS1aj","zY1GYJXljW","jiVBPReKEW","5drc614FLR","fLNg8ZJTXH",
+"zHF1qiB08l","RzaZAlsQGo","AXpwEMK07Y","v8yFN0h1b1","jzUqRQworu","tlILttlILt","uZPqgnlaBy","Zv7z0TCgPp","LbRTH0YAGH","FjHXRSbRYy",
+"ZzJHWUl4a1","pT8wuO3iyQ","pT8wuZv7z0","Ss0ZuIRh48","lj07Q4W0Tl","JkzUneuZA5","7ku1pS2Dfu","U3yw5cmXIX","24ARF5Namm","5Mg9rlweGy",
+"MojnPni2v1","O3iyQVjCZq","mz8gx8FmFH","TCgPpVprf2","16lHcQworu","pWiOs5ZaEz","4W0TlF6PT2","zY1GYO3iyQ","VerEA29QAz","s4786faHir",
+"YjB9tyluBx","yofH34W0Tl","JIqXiPb1pa","4dEz6VLTy6","ydG8Usx5Gl","MojnP2DREs","jeskSrKDLJ","ydG8U5IhmG","zbIYYTXQ0Z","blLA9QChxs",
+"lj07QTwano","nFqiktlILt","gIYvEKASQ8","s93Ml0MR5X","faHiryToGW","lweGyK4GS8","OHaBzIRh48","suY4xpvgjS","rKDLJK20wK","fFDrJKZamH",
+"o8UydDz1R3","AOgEeuQIcz","Ss0ZuUmaEv","bgJAziKqhr","jfREufFDrJ","IKxdLa00b5","K4GS8Fhtgl","8U2nUFcWrW","tvdkDGv3Fq","suY4xChuy3",
+"brhlQ9y4lw","7fKYUCNHmv","45cIH5Mg9r","618DiG1RhS","2TRI7n8pJ9","uupzkiqv4k","DQimpWMiS3","aDGtSyToGW","rKDLJ7ku1p","qaofNMmKGJ",
+"7X3uysoy9t","FNYIMdmoS7","hE1QlWreyP","hi5X7lj07Q","gIYvEgIYvE","RkQkeNo0Qb","0PktInFqik","jiVBPaFFss","ciuWzfmIK1","CIShGjfREu",
+"0PktIBFkb8","PYBf4ulk41","In3NSAgJHQ","7fsYMM3zXL","RpBQmKASQ8","xciqpAgJHQ","G1RhS45cIH","ReKEW9iGoT","fLNg85iGN5","lkMUAgjUTu",
+"zmLYDI7p2a","TwanoyluBx","azIWp0BmCy","t59lRyEfy9","nnP8oThjNn","In3NSFGzgp","nnP8o5VZjS","yEfy9Cp3mZ","x3LDePOUYS","RxrsmJJs5m",
+"HP433uQIcz","n1pmObZLvS","gIYvEOxWIH","jzUqRydG8U","brhlQEoToP","9iGoTAIYUu","7Ow5CbZLvS","JkzUndmoS7","ZuDtDP6bcg","ECMvUOUYuF",
+"0Wr5y45cIH","kZANmGSQwj","Ul4a12hEEU","djsrv07n1c","1v5hHDG4sT","jSjS3Yf2Ec","pmeCd64s8N","SWfouGv3Fq","ulk41IBe8k","OxWIHI7p2a",
+"fFDrJVLTy6","ydG8ULbRTH","AIYUudhSuH","NOHszhi5X7","MojnPDLhzM","d7vjMFxX9q","gIYvEmX2GE","ix74rFVMxo","b29RJQ6hMC","SbRYyK20wK",
+"S77LHs93Ml","VLTy6uJScX","yofH38cVD3","BGaQYChuy3","5IhmG8xEKz","7Ow5CGSQwj","0PktI55rfB","29QAzPYBf4","Kr8ys24ARF","aDGtSS77LH",
+"pv0i7BFkb8","Rxrsm2hEEU","Qworu4W0Tl","hi5X7gdQsS","uupzksoy9t","16lHcs4786","1j5L8FwEJz","lkMUALDk6f","he9IAZv7z0","Mm8si2TRI7",
+"U3yw5AXpwE","aL6AJKZamH","0ao3laDGtS","QnJ1SYf2Ec","SmGzvSmGzv","bgJAzFxX9q","PYBf4POUYS","uJScXG1RhS","Cfgr3FFDui","vLsmSQWxoT",
+"SjskQEoToP","Chuy3dhSuH","IKxdLQnJ1S","5IhmGmz8gx","i7WMQTwano","W7cTsYOfrY","VNCPduoStw","5iGN5X6Pin","uvf7A55rfB","azIWplj07Q",
+"MmsIopFrrl","Cp3mZReKEW","UmaEvbgJAz","7hyVvatef2","Gv3FqThjNn","UlU3MGSQwj","rz7UtCK5W7","RsQUq2hEEU","2ZHdkFVMxo","zY1GYZhwG1",
+"lpF6WY1mC0","vkCHHv1Hln","Gv3FqhE1Ql","5iGN5AkKTk","uvf7A6AFT0","HfyNQtl72W","uvf7AgjUTu","uAWypbZLvS","lH1ktsuY4x","v2eC3qUJMd",
+"gf8rIblLA9","Ss0Zud7vjM","piJSkfaHir","I7p2aMGlTF","djsrvuAWyp","ZuDtD2TRI7","NhXduChuy3","zQt6QI7p2a","gdQsSciuWz","Ss0ZuFGzgp",
+"X6PinJJs5m","ni2v19GXkX","WMiS3LewvM","nnP8oIn3NS","SWfouAXpwE","FcWrWcQOnv","bZLvScShY2","0YAGHzY1GY","24ARFx3LDe","iwzGkaL6AJ",
+"jtn0X07n1c","ZUnqtMm8si","9iGoT24ARF","618DiZJTXH","mX2GEuupzk","8cVD3Chuy3","Yw2oUe6e4z","ECMvUzqH0W","1LB1LiwzGk","0KyfsWaWsv",
+"piJSkjeskS","tuDySyofH3","8hJdtciuWz","ulk41S2Dfu","zY1GYtAOsr","C2IrcvLsmS","a00b5nnP8o","2hEEU24ARF","YjB9t45cIH","ZzJHWSmGzv",
+"WDVWJaDGtS","5VZjSdmoS7","t59lRcShY2","vLsmSSmGzv","lweGy4W0Tl","CIShGogLgc","yluBxS2Dfu","YjB9toGu6x","fcJOyGrDg7","4QMc9JXljW",
+"ru4UGix74r","YjB9tjS1aj","NcICAGrDg7","s93MlfLNg8","2Yz7EWMiS3","suY4xOHaBz","SWfouO3iyQ","yToGWCIShG","QChxskB5nP","U3yw5v2eC3",
+"J2mQiMojnP","9y4lwAkKTk","yofH3W7cTs","CxVEfEoToP","S2Dfu2hEEU","pmeCdF6PT2","gf8rIFcWrW","7fsYMNxx9V","W3VFHrhl0J","Chuy3o8Uyd",
+"FLsphydG8U","WaWsvuN6r3","v8yFNlpF6W","d7vjMuLtKs","9iGoTMmKGJ","azIWpnlaBy","X6Pinlj07Q","FnPFBfqypy","jeskS4dEz6","AgJHQSbRYy",
+"FnPFBlweGy","uAWyppFrrl","hUTw7BbwgA","Kr8ysbZLvS","cShY2zY1GY","LewvMZUnqt","POUYSatef2","48cHLzbIYY","prNT69GXkX","SWfouxXTI4",
+"0ao3lyvOMI","S2Dfurhl0J","4W0TlgtCA5","xXTI4Nxx9V","FwEJzQ6Lix","9rlg9NhXdu","TwanotaOXK","tlILtQWxoT","m4bxUjzUqR","HRxd86q6L9",
+"B3qem8TxD7","mz8gxJIqXi","BGaQYhe9IA","djsrv5nmWv","SjskQO3iyQ","uAWyppv0i7","Y1mC0No0Qb","TCgPp0PktI","S2DfuhUTw7","MGlTFSs0Zu",
+"FwEJz5VZjS","Uvlv45Drn0","5Mg9roVQp6","prNT6YOfrY","JJs5my94nw","AmdQdRkQke","o8UydWaWsv","JIqXidhSuH","8RCUAn8pJ9","ZJTXHqUJMd",
+"ZJTXHtjQxs","ReKEWfFDrJ","k85Ae16lHc","IBe8km4bxU","7ku1p4dEz6","L7cGclViBv","2TRI7fmIK1","hYBCKaDGtS","Mkgy8n1pmO","RBhp0Cfgr3",
+"o8Uydlm0pD","aFFssy94nw","7lUXZaDGtS","kZANmOUqFM","d7vjMxciqp","zFgtBFVMxo","Mkgy8ydG8U","n8pJ9GWqqX","BCxeCOUqFM","UmaEvIn3NS",
+"8cVD36AFT0","ZuDtDv2eC3","v8yFNIKxdL","Pb1paVNCPd","dmoS7lH1kt","lsQGoKZamH","Yf2EcD6rBy","QYxC0prNT6","i7WMQEdBKc","Ta8f65Mg9r",
+"piJSkzmLYD","aL6AJS77LH","pWiOsYf2Ec","6q6L9dpe1v","7fsYMbZLvS","lViBvYf2Ec","9XyT9G1RhS","zz4ZU7fKYU","FGzgpDLhzM","MmKGJRxrsm",
+"v1Hln24ARF","7hyVv48cHL","Chuy38FmFH","FPfSEAOgEe","HRxd8pAhR1","Dz1R32TRI7","hUTw7rKDLJ","pT8wuCxVEf","HfyNQwDajX","AmdQdQYxC0",
+"M3zXLy94nw","CK5W7FPfSE","JKWYRt98iW","QssNCVIlwP","dmoS7FxX9q","ZUnqtQChxs","uoStwNxx9V","bgJAzvkCHH","pmeCdD6rBy","CNHmv24ARF",
+"MaJQsyvOMI","VjCZqOHaBz","M6qcGkB5nP","P6bcgKsjRK","FFDuiQssNC","55rfBuN6r3","CqqaDC2Irc","I7p2ax3LDe","gIYvEMaJQs","vOqCEcShY2",
+"aFFssQYxC0","lj07Q4QMc9","ru4UGuN6r3","WmadAZhwG1","Zv7z0tjQxs","QssNCPYBf4","he9IAi7WMQ","Ul4a1wiHrZ","0PktIM3zXL","lH1ktuJScX",
+"FjHXRJkzUn","IKxdLt59lR","jeskSLDk6f","QnJ1SQYxC0","WDVWJ9XyT9","nlaBy0PktI","RxrsmtAOsr","pvgjSpWiOs","14FLRVNCPd","YjB9tS2Dfu",
+"FwEJzQClRL","48cHLuupzk","J2mQiBpYhV","5VZjSrz7Ut","Y1mC0iwzGk","WaWsvoQ87r","bZLvSFhtgl","n8pJ9M3zXL","x3LDe1LB1L","FjHXR5drc6",
+"bgJAzpAhR1","4dEz6VNCPd","4dEz6Cp3mZ","9iGoTfmIK1","yToGWo8Uyd","aL6AJAXpwE","O3iyQogLgc","EOE1oTwano","VBjhzuN6r3","ZzJHWHP433",
+"l83Ud5drc6","hi5X76AFT0","y94nwGXdoH","WreyPThjNn","pmeCd5ZaEz","B3qemPOUYS","tjQxsxciqp","ZUnqtAOgEe","ulk41yofH3","2ZHdkHRxd8",
+"s4786AmdQd","jiVBPJkzUn","JXljWReKEW","Ss0Zu7ku1p","2Yz7EL7cGc","ThjNnhe9IA","RmDcrQbxXc","D6rBySmGzv","AgJHQEOE1o","sx5GlhUTw7",
+"MmsIoZzJHW","SjskQ8RCUA","8hJdtLbRTH","Y1mC0lViBv","ZuDtDiB08l","MmKGJKASQ8","0MR5Xhi5X7","d7vjMRACuj","nlaByHP433","0MR5XMmsIo",
+"Y1mC0mz8gx","RkQkeI7p2a","0h1b1mX2GE","9y4lw7Ow5C","9rlg9M6qcG","uoStwjzUqR","JIqXiCIShG","OxWIHoVQp6","BbwgAgtCA5","cL0aE1v5hH",
+"Ta8f67fsYM","x3LDeciuWz","yEfy9Yf2Ec","7fsYMd7vjM","FjHXRHlUbF","aez9y14FLR","prNT6Q6hMC","jfREuYOfrY","tvdkDdmoS7","4QMc9EdBKc",
+"1LB1LtAOsr","YOfrYB3qem","nlaBy0YAGH","7ku1p8xEKz","9iGoTuLtKs","v1Hln64s8N","uoStwt59lR","UlU3MTwano","lViBv580YD","qQxHPatef2",
+"HfyNQKZamH","xciqpwiHrZ","0KyfsbZLvS","MmKGJiB08l","ix74ry94nw","4dEz6uTacx","tl72WRzaZA","618DiJIqXi","GXdoH9XyT9","1v5hHyofH3",
+"atef2soy9t","1v5hHpvgjS","XyPZNtuDyS","0h1b1WaWsv","JXljWaez9y","FNYIMBGaQY","FnPFBvLsmS","8U2nUt59lR","MaJQsThjNn","5Drn0iqv4k",
+"faHirM3zXL","FwEJz0BmCy","xXTI4YjB9t","MaJQslj07Q","uPX7G8TxD7","AmdQdZhwG1","48cHLvOqCE","zz4ZUYjB9t","DQimp5ZaEz","I7p2aSs0Zu",
+"aez9y1j5L8","BCxeCprNT6","9rlg98hJdt","iB08lzqH0W","Dz1R3ZhwG1","k85AeMkgy8","hE1QlqQxHP","2Yz7Eulk41","0MR5XoVQp6","uZPqg6q6L9",
+"PYBf45nmWv","IKxdLhe9IA","a00b59eoRc","0MR5X8xEKz","b29RJwDajX","t59lRChuy3","gjUTuIn3NS","cQOnvBGaQY","CqqaDl83Ud","RmDcrblLA9",
+"RsQUqECMvU","ZUnqtlj07Q","EoToPfLNg8","yluBxThjNn","hE1Qlh1zcH","Cp3mZNcICA","uTacxKsjRK","HzZT8DQimp","RBhp0YOfrY","aL6AJv8yFN",
+"Gv3Fq3weIF","cL0aEk85Ae","Y1mC0QClRL","zY1GYEdBKc","blLA9RsQUq","MmKGJ5Drn0","JKWYRdQ586","xciqp4dEz6","BFkb8Z4I1v","G1RhSVBjhz",
+"AkKTkRkQke","ix74ruoStw","9y4lwWmadA","gf8rILbRTH","ciuWzZ4I1v","0Wr5yyToGW","FxX9qXflUq","uZPqg5Mg9r","tlILtXflUq","piJSkFVMxo",
+"qUJMd1LB1L","CIShG9XyT9","VLTy6v1Hln","ulk41QbxXc","NcICAyToGW","LbRTH7Ow5C","uAWypX6Pin","NAFuwGSQwj","iB08lGrDg7","5Drn0K4GS8",
+"AOgEeBGaQY","Y1mC0iqv4k","n1pmOzz4ZU","h1zcHC2Irc","7lUXZuLtKs","fcwDa5IhmG","uLtKs580YD","0ao3l3otm6","FNYIMpv0i7","rz7UtMezSW",
+"jS1ajuQIcz","0YAGHxXTI4","lj07QJRJQB","FFDuiuZPqg","WmadA5Drn0","MK07YvOqCE","pvgjS2hEEU","cShY27X3uy","Y1mC0jzUqR","RsQUqpmeCd",
+"wDajXgf8rI","oGu6xReKEW","tAOsrgf8rI","FFDui5nmWv","lCMxydpe1v","QWxoT0YAGH","faHirP6bcg","8RCUACxVEf","NOHszpAhR1","x3LDeWaim6",
+"7fsYMK4GS8","8FmFHBCxeC","FNYIMlH1kt","0MR5X0BmCy","OxWIHbZLvS","NAFuwVNCPd","DG4sT8cVD3","Y1mC0CK5W7","1j5L8CxVEf","WDVWJBbwgA",
+"fFDrJBFkb8","CK5W7RkQke","HP433JKWYR","jtn0X0Kyfs","MezSWAIYUu","mX2GE0PktI","ECMvUzmLYD","SbRYylkMUA","PYBf4cL0aE","EoToP618Di",
+"55rfBlViBv","NAFuwVerEA","jiVBPQClRL","uJScXVerEA","GrDg70Kyfs","hi5X78TxD7","sqVrfuZPqg","fqypy5ZaEz","dhSuHuPX7G","rhl0J4dEz6",
+"Ul4a1CIShG","wiHrZni2v1","64s8N0PktI","7ku1pQChxs","tAOsr5VZjS","YOfrY1j5L8","aDGtSU3yw5","8RCUAzmLYD","bZLvSuAWyp","yluBxlViBv",
+"tvdkD9iGoT","M6qcGEdBKc","lkMUAUlU3M","Uvlv4yToGW","NcICAFjHXR","16lHcpmeCd","CdyBVAmdQd","jeskSMkgy8","cmXIX0Kyfs","fmIK1lm0pD",
+"ZuDtDGv3Fq","EoToPNcICA","euZA5aL6AJ","NcICA7fsYM","pv0i7GXdoH","2TRI7yluBx","euZA5pWiOs","Pb1pablLA9","MojnPK20wK","0ao3lfqypy",
+"a00b5zmLYD","Q6hMC0h1b1","K4GS8RzaZA","7hyVvOUYuF","FcWrWrKDLJ","Vprf2580YD","vLsmSlH1kt","CIShGC2Irc","prNT6pFrrl","tlILt9iGoT",
+"FnPFBZJTXH","HfyNQdmoS7","WmadAvkCHH","t59lRNcICA","Q6hMCRmDcr","NOHszL7cGc","dhSuH16lHc","Yf2EcydG8U","Pb1pajiVBP","zqH0WOHaBz",
+"CIShGv1Hln","MK07YWPmlx","6AFT0FGzgp","EoToPX6Pin","piJSkvkCHH","8TxD7DcpWB","jzUqR8hJdt","t98iWcQOnv","16lHcoVQp6","hi5X75nmWv",
+"pWiOsMezSW","2Yz7EaL6AJ","VLTy6G1RhS","GXdoHk85Ae","v1Hlnsx5Gl","ZJTXHsx5Gl","m4bxU64s8N","QnJ1SDQimp","OxWIHuTacx","QworuazIWp",
+"7Ow5CdhSuH","azIWpgdQsS","s93MltuDyS","pT8wuSmGzv","v2eC3Yh1hF","zmLYDThjNn","HlUbFtvdkD","v2eC3y94nw","iwzGka00b5","QClRLtl72W",
+"rz7UtZUnqt","zFgtBqQxHP","CIShG1j5L8","2ZHdkTXQ0Z","gIYvETwano","uPX7GyEfy9","SWfouv1Hln","atef2uLtKs","gdQsSlkMUA","l83UdFcWrW",
+"KZamH9eoRc","VNCPde6e4z","hYBCK1LB1L","QClRLe6e4z","7hyVv64s8N","ciuWz580YD","OUqFMUvlv4","yluBxKASQ8","tuDySLDk6f","VjCZq9GXkX",
+"VNCPdFnPFB","cmXIXSjskQ","9eoRcVIlwP","fcJOy8TxD7","BCxeCkZANm","y94nwlViBv","POUYSdjsrv","QWxoTFPfSE","lpF6WYOfrY","pmeCdZUnqt",
+"AkKTkHRxd8","TCgPpl83Ud","ix74rOxWIH","FhtglMkgy8","a00b5ix74r","L7cGc5VZjS","AmdQdPb1pa","jtn0XFnPFB","SWfou9eoRc","29QAz5IhmG",
+"v2eC3RmDcr","MaJQsbrhlQ","gf8rI0MR5X","uAWypECMvU","oVQp6d85a9","yvOMIBCxeC","9XyT9U3yw5","EdBKcX6Pin","No0QbSjskQ","U3yw5uJScX",
+"n8pJ9n8pJ9","9XyT98hJdt","ZhwG1lViBv","uZPqg1j5L8","BbwgA6q6L9","9y4lwsx5Gl","4W0TlaDGtS","2Nslm8xEKz","7Ow5CjSjS3","azIWpcL0aE",
+"AmdQdECMvU","0PktIyvOMI","MGlTFjeskS","ydG8UAgJHQ","FnPFBbgJAz","nFqikNOHsz","qUJMd8RCUA","xciqpksJby","FVMxoQYxC0","i7WMQ55rfB",
+"ksJbyuQIcz","uZPqgAgJHQ","8RCUANcICA","B3qemM6qcG","B3qemfcJOy","taOXKcShY2","FFDuiQ6hMC","2Yz7ElkMUA","lsQGoFwEJz","AmdQd7X3uy",
+"t59lRpT8wu","5iGN5MaJQs","ciuWzi3pyd","WaWsvt98iW","CIShGtAOsr","AmdQd8cVD3","nFqikHfyNQ","4dEz68xEKz","RmDcrOUYuF","KZamHtlILt",
+"O3iyQJXljW","djsrvt98iW","nnP8o5iGN5","NAFuwVLTy6","0MR5XRzaZA","oVQp6ogLgc","v8yFNpT8wu","3otm6Z4I1v","JRJQBVBjhz","UlU3MqQxHP",
+"QssNCuupzk","oVQp6XflUq","QClRL29QAz","jfREu7lUXZ","0PktIguMb8","LbRTHTa8f6","QClRLqQxHP","uN6r3pAhR1","sx5GlFNYIM","QClRL9y4lw",
+"jS1ajRzaZA","hYBCKTa8f6","vLsmS9eoRc","VIlwPHRxd8","jiVBPQworu","kB5nPHP433","QssNCReKEW","Pb1paXflUq","Mm8sifcwDa","FcWrWhe9IA",
+"soy9tChuy3","uAWypy94nw","8cVD3B3qem","o8UydMm8si","VLTy6QChxs","RsQUqHlUbF","fmIK15nmWv","OUqFMJIqXi","24ARFrz7Ut","Oz8yZpT8wu",
+"tvdkD0Wr5y","IKxdLFPfSE","2DREsjS1aj","pvgjS4QMc9","OUYuFwiHrZ","oQ87rLDk6f","GXdoHqQxHP","Ss0Zu8U2nU","TwanoFFDui","rhl0J5VZjS",
+"bgJAz9rlg9","okgRiVjCZq","2DREsuvf7A","QChxsjeskS","TwanovOqCE","14FLRblLA9","OHaBzmz8gx","6AFT0lj07Q","GrDg75IhmG","fmIK1dhSuH",
+"MK07YgtCA5","QbxXcJKWYR","5drc6lkMUA","FjHXRRBhp0","gjUTuJkzUn","AIYUu4dEz6","wDajXCK5W7","QbxXcLDk6f","s93MlUmaEv","uPX7GQworu",
+"pv0i75VZjS","JRJQB4W0Tl","lpF6W48cHL","NcICAFLsph","VerEAdjsrv","tvdkDiqv4k","Fhtgl8TxD7","FjHXRjtn0X","yvOMIPYBf4","WPmlxaFFss",
+"i3pydaL6AJ","BGaQYru4UG","aFFssIKxdL","vLsmS7fsYM","gIYvEFFDui","NcICAvLsmS","NOHszpiJSk","8hJdtydG8U","2Yz7Elm0pD","2DREsTa8f6",
+"cShY2MmsIo","3otm6Pb1pa","IjTwPWMiS3","tAOsrlpF6W","brhlQjSjS3","pmeCd9iGoT","oVQp6JKWYR","lXFOBS2Dfu","SWfoulCMxy","Waim6BCxeC",
+"Uvlv4YOfrY","Q6hMCThjNn","FcWrWyluBx","Ul4a1dhSuH","SmGzvRzaZA","O3iyQAIYUu","Zv7z0BpYhV","gf8rIW3VFH","uN6r3pFrrl","Y1mC0FNYIM",
+"uPX7GZUnqt","GXdoH6q6L9","uQIczKASQ8","DcpWBGXdoH","uN6r3Zv7z0","y94nwiqv4k","Chuy3OHaBz","hUTw7jeskS","CqqaDG1RhS","AgJHQlweGy",
+"RBhp0WaWsv","fqypyW7cTs","16lHcjiVBP","HRxd8ZuDtD","07n1cK4GS8","zz4ZUStlDJ","9rlg9AgJHQ","qQxHPEdBKc","5nmWv9eoRc","bgJAzLbRTH",
+"RmDcrYf2Ec","YjB9tJXljW","W3VFHhe9IA","tvdkD4W0Tl","HzZT8Ul4a1","9rlg9AmdQd","pAhR17fKYU","7ku1paFFss","gdQsS8RCUA","64s8NbrhlQ",
+"y94nwnnP8o","0Wr5ytjQxs","BCxeCzmLYD","JXljWo8Uyd","3otm65Drn0","soy9tRACuj","UmaEvP6bcg","D6rByL7cGc","s4786QWxoT","SmGzvi3pyd",
+"i3pydhi5X7","brhlQZJTXH","BbwgAbgJAz","mX2GE64s8N","yEfy9nlaBy","OUqFMWmadA","SjskQCqqaD","AIYUuUlU3M","29QAzBCxeC","BbwgAZUnqt",
+"EoToPKASQ8","Pb1paYw2oU","iKqhrcQOnv","64s8NzbIYY","tuDySgIYvE","y94nwHlUbF","W3VFH64s8N","zHF1qogLgc","WreyPGXdoH","5Drn0RBhp0",
+"JKWYRlsQGo","WreyPW3VFH","AgJHQ2TRI7","45cIHqUJMd","G1RhSXyPZN","ZhwG1W7cTs","WDVWJ1v5hH","bZLvSFGzgp","lkMUA07n1c","i3pydNo0Qb",
+"dhSuHrhl0J","gIYvEazIWp","FcWrWWDVWJ","S77LHIKxdL","o8UydRACuj","FNYIMGSQwj","rhl0JGSQwj","ReKEWnFqik","hE1Qlsx5Gl","KZamHHfyNQ",
+"1LB1LNAFuw","ThjNnPYBf4","AIYUuHlUbF","cL0aExciqp","HzZT89eoRc","QbxXcMmKGJ","iB08llkMUA","ix74rqQxHP","jeskS2Nslm","5IhmGyofH3",
+"S77LHNAFuw","MmKGJ5ZaEz","h1zcHx3LDe","4W0TlSbRYy","bgJAzMmsIo","taOXKk85Ae","QChxsJXljW","QChxs5iGN5","C2IrcMmsIo","lkMUAazIWp",
+"FNYIMwDajX","6AFT0yluBx","Kr8ysW3VFH","DG4sT29QAz","pT8wuhUTw7","GXdoHfqypy","GrDg7zY1GY","m4bxUW3VFH","suY4xiwzGk","dQ586tjQxs",
+"O3iyQDcpWB","QWxoTBbwgA","0YAGHpv0i7","EoToPlCMxy","AXpwE4dEz6","uLtKsgjUTu","y94nwEdBKc","lCMxy5Drn0","FNYIMVerEA","oVQp6FFDui",
+"SbRYyQ6hMC","Yw2oU7ku1p","nnP8oL7cGc","YOfrYuJScX","9iGoTUvlv4","ciuWzFnPFB","618DiuTacx","2Nslmpv0i7","nFqikQbxXc","QYxC08TxD7",
+"RpBQmru4UG","7hyVvMm8si","QChxszY1GY","zmLYDHzZT8","t59lRVprf2","lsQGo7Ow5C","8U2nUQWxoT","9rlg9IKxdL","Q6Lixpv0i7","ZJTXHy94nw",
+"pmeCdChuy3","atef2oVQp6","M3zXLn8pJ9","QChxsPOUYS","d85a9Chuy3","GSQwjsoy9t","FhtglgIYvE","uQIczfFDrJ","Chuy3LbRTH","s7MxkFVMxo",
+"BFkb8B3qem","7ku1pTwano","WPmlxbZLvS","WDVWJ2ZHdk","AkKTkdQ586","tl72W0BmCy","s93MlM3zXL","1v5hH9GXkX","qUJMdZhwG1","QworuxXTI4",
+"pvgjSSbRYy","fmIK10Kyfs","XflUqCp3mZ","WDVWJWPmlx","vOqCE5Mg9r","gIYvEaez9y","8cVD30BmCy","ZhwG12hEEU","QWxoTsoy9t","GrDg7ECMvU",
+"m4bxUjS1aj","4dEz6LDk6f","guMb8Mm8si","ZUnqtFGzgp","jeskSFNYIM","ni2v124ARF","mz8gxuZPqg","rKDLJWaWsv","hYBCKAmdQd","Waim6faHir",
+"a00b54dEz6","1j5L8VerEA","0ao3ljzUqR","y94nwOUqFM","kB5nP2Nslm","Nxx9VS2Dfu","ZuDtDBFkb8","nlaByZJTXH","guMb80Wr5y","SWfouWDVWJ",
+"CxVEfpvgjS","pAhR1M6qcG","fFDrJn8pJ9","lCMxyJRJQB","uupzk48cHL","zY1GYBbwgA","bgJAzJkzUn","8xEKzMK07Y","ZzJHWVLTy6","D6rBy6AFT0",
+"9rlg9zHF1q","lpF6WjzUqR","zQt6QK4GS8","Gv3FqZJTXH","gf8rINAFuw","v2eC3G1RhS","uvf7AlViBv","m4bxU9y4lw","2Nslmzz4ZU","HRxd8mX2GE",
+"W7cTsCK5W7","uLtKsulk41","OxWIHCqqaD","tvdkDRsQUq","djsrvyToGW","ciuWzEOE1o","sqVrfmX2GE","qUJMdm4bxU","tjQxsAgJHQ","nlaBydpe1v",
+"NhXduuLtKs","8cVD3uvf7A","hYBCK8TxD7","5IhmGlXFOB","9GXkX29QAz","Cfgr3JJs5m","oVQp6lkMUA","NcICAs4786","azIWpIKxdL","zqH0WxXTI4",
+"uZPqgDQimp","QnJ1SAIYUu","0Wr5yK20wK","45cIHJXljW","kZANmQChxs","suY4xtlILt","14FLR07n1c","5Drn0tl72W","AOgEeFFDui","jS1ajX6Pin",
+"KsjRKTXQ0Z","ZzJHWO3iyQ","gdQsSOz8yZ","tvdkD5IhmG","Mm8sizmLYD","TCgPpuPX7G","2Nslm7Ow5C","euZA5AOgEe","HzZT8FxX9q","6q6L9FjHXR",
+"StlDJNOHsz","Ul4a17fsYM","8cVD3n1pmO","GrDg7bZLvS","5Mg9rWaWsv","8TxD7CxVEf","VerEAk85Ae","oVQp6FGzgp","t98iWatef2","LewvMJ2mQi",
+"No0QbUl4a1","W3VFHEOE1o","wiHrZFLsph","6q6L9CqqaD","FFDuiHfyNQ","iwzGkAmdQd","29QAzguMb8","ZuDtDl83Ud","M6qcGNhXdu","cL0aERpBQm",
+"vkCHHS77LH","WmadA55rfB","MGlTFokgRi","XyPZNpAhR1","No0Qb6AFT0","suY4xXyPZN","Ul4a1uZPqg","2hEEUqQxHP","FjHXRCK5W7","9GXkXjiVBP",
+"ydG8UXflUq","Nxx9VFFDui","fLNg8ThjNn","pmeCdUvlv4","618DiEdBKc","xXTI4Mm8si","HRxd8lXFOB","9eoRcguMb8","29QAzIn3NS","48cHLW3VFH",
+"4dEz6SmGzv","FxX9q2ZHdk","Uvlv4tAOsr","POUYSpWiOs","1v5hHUlU3M","e6e4zfLNg8","a00b548cHL","14FLRxXTI4","0MR5Xi3pyd","piJSkbZLvS",
+"7lUXZ9iGoT","Y1mC05IhmG","lXFOB2TRI7","dmoS707n1c","StlDJAXpwE","tvdkDAXpwE","e6e4zK20wK","OUqFMUl4a1","9y4lwD6rBy","Y1mC0ZUnqt",
+"64s8N5VZjS","FwEJzVIlwP","Y1mC0KASQ8","Yf2EcokgRi","8cVD3BpYhV","x3LDepiJSk","8RCUA1v5hH","LDk6fUl4a1","oVQp6t59lR","4QMc9Z4I1v",
+"nnP8ouQIcz","rhl0JGWqqX","0BmCyhe9IA","oGu6xqQxHP","0ao3lB3qem","AXpwE55rfB","07n1c0YAGH","uZPqg5IhmG","618DiWDVWJ","2TRI7fqypy",
+"Yf2Ecaez9y","BCxeCuvf7A","M6qcGzQt6Q","yvOMICxVEf","4W0TlPOUYS","YjB9t2Nslm","Uvlv4v2eC3","SWfoun8pJ9","WreyPD6rBy","iKqhrjiVBP",
+"RBhp09eoRc","0YAGHTwano","nnP8oHfyNQ","5Drn0s7Mxk","hSSvQdjsrv","iB08ljiVBP","zbIYYulk41","P6bcgFnPFB","FnPFBYw2oU","BCxeC0h1b1",
+"NcICAuvf7A","ZUnqtFNYIM","zbIYYhE1Ql","8RCUAFLsph","xReecfaHir","MGlTFK20wK","29QAz1LB1L","MezSWh1zcH","gdQsSZJTXH","FjHXROUYuF",
+"618Di5Drn0","uZPqglm0pD","jSjS3HfyNQ","hUTw7bZLvS","lm0pDWaim6","AkKTkGXdoH","16lHcLbRTH","1j5L8lm0pD","l83UdSmGzv","n1pmOQClRL",
+"580YDt59lR","qUJMdmX2GE","HzZT8VerEA","y94nw9XyT9","dmoS7Mm8si","mX2GEcQOnv","fqypyZzJHW","ni2v1WPmlx","CIShG3weIF","hYBCKdjsrv",
+"D6rByEdBKc","HRxd8zHF1q","RsQUqS77LH","1j5L864s8N","blLA9pT8wu","8hJdtfLNg8","MmsIouN6r3","lH1ktAkKTk","lXFOBsqVrf","Vprf2yofH3",
+"9eoRcMGlTF","Nxx9VtvdkD","8TxD79rlg9","CqqaDRBhp0","tuDySlpF6W","YjB9tIRh48","uN6r3BFkb8","zFgtBKr8ys","hi5X7IRh48","zz4ZUzmLYD",
+"nFqikMaJQs","CxVEfDQimp","S77LHgjUTu","L7cGc0Wr5y","OHaBz5ZaEz","7hyVv4QMc9","Yh1hFGWqqX","nnP8o14FLR","Uvlv4W3VFH","n8pJ97X3uy",
+"FnPFBJKWYR","3weIFGrDg7","FFDuiFPfSE","yofH3F6PT2","SWfou0YAGH","BFkb8aDGtS","QChxsqUJMd","ZuDtDcL0aE","taOXKatef2","hi5X7CqqaD",
+"9y4lwCIShG","FjHXRPYBf4","Cp3mZNo0Qb","d7vjM24ARF","D6rByMm8si","X6Pinatef2","y94nws93Ml","qaofNuoStw","lViBv7hyVv","0h1b1RsQUq",
+"NOHszD6rBy","O3iyQChuy3","8RCUA6q6L9","X6PinMezSW","zHF1qRzaZA","FVMxoyofH3","FNYIMlj07Q","JRJQBt98iW","580YDjSjS3","618Di5VZjS",
+"6q6L99iGoT","suY4x9rlg9","3weIFAkKTk","JXljWQworu","jSjS3Dz1R3","i3pydWaWsv","DLhzMs4786","Dz1R3ZuDtD","FxX9q6AFT0","uoStwjtn0X",
+"k85Ae0BmCy","JXljWPb1pa","aFFss2TRI7","AkKTkYjB9t","pWiOsCK5W7","9XyT9oQ87r","O3iyQgdQsS","KsjRKC2Irc","m4bxUEOE1o","HfyNQAIYUu",
+"OUqFMEdBKc","0ao3lpiJSk","2hEEUWreyP","FwEJz3otm6","9XyT96q6L9","QYxC0KASQ8","Kr8yswiHrZ","8RCUAsoy9t","euZA57lUXZ","LDk6fQ6hMC",
+"XyPZNYw2oU","QChxsX6Pin","DG4sTKZamH","fqypy8cVD3","uQIczMm8si","29QAz5ZaEz","lsQGolH1kt","8cVD3Ss0Zu","M3zXLRzaZA","U3yw58cVD3",
+"gf8rIThjNn","aFFss5Mg9r","mX2GEaez9y","hE1QlM6qcG","jzUqRyEfy9","RxrsmMkgy8","Gv3FqGv3Fq","8RCUA6AFT0","wDajXsqVrf","Ul4a17hyVv",
+"zz4ZUcL0aE","DcpWBnlaBy","lweGyXflUq","O3iyQuN6r3","AmdQdgIYvE","Mkgy8tvdkD","lj07QuPX7G","BGaQYUl4a1","VNCPdguMb8","s4786xciqp",
+"2hEEUHP433","RzaZAAmdQd","WPmlxFwEJz","HP433pv0i7","BFkb8lsQGo","NOHszIRh48","C2IrcpmeCd","VNCPd4dEz6","DcpWBRzaZA","Kr8yspiJSk",
+"2ZHdkCNHmv","t98iWZhwG1","IjTwP7fKYU","JJs5mhUTw7","tl72WWPmlx","ThjNni3pyd","Y1mC0IBe8k","5iGN5uQIcz","KASQ87lUXZ","QChxsJkzUn",
+"i7WMQDG4sT","1v5hHRmDcr","wDajXJJs5m","TXQ0ZMaJQs","RkQkefcJOy","In3NSbrhlQ","8TxD72DREs","JXljWtl72W","07n1cFxX9q","b29RJpAhR1",
+"zHF1qIKxdL","W3VFHazIWp","faHirmz8gx","xciqpfcwDa","55rfB16lHc","JRJQBWDVWJ","MezSWlH1kt","gIYvE0Wr5y","LDk6fKr8ys","FLsphBGaQY",
+"7fsYMbrhlQ","ix74rokgRi","I7p2aWMiS3","hE1QlZUnqt","16lHczz4ZU","zqH0WBCxeC","4dEz6fcJOy","G1RhSuPX7G","x3LDetAOsr","L7cGcVprf2",
+"KASQ8sx5Gl","MmKGJ3weIF","In3NSYjB9t","M3zXLFNYIM","LbRTHFNYIM","vOqCE0YAGH","EdBKcdhSuH","Q6hMCAXpwE","FVMxo1LB1L","yEfy9WPmlx",
+"QworunnP8o","DQimptvdkD","FhtglEoToP","tl72W5Namm","Q6hMCFhtgl","BbwgA5IhmG","ulk414dEz6","8hJdtzqH0W","Gv3FqiKqhr","0Wr5ypT8wu",
+"VjCZqSmGzv","a00b5kZANm","24ARFtAOsr","2Yz7EVBjhz","JRJQBxReec","hYBCKy94nw","FcWrWAOgEe","UmaEvFVMxo","jfREuCNHmv","VerEAJXljW",
+"VNCPdPb1pa","FwEJzaez9y","o8UydS77LH","tl72WpiJSk","fqypyuQIcz","3weIFZUnqt","tl72WJXljW","KZamHCK5W7","JKWYR1LB1L","Ss0ZupAhR1",
+"lXFOBDQimp","i3pydEoToP","DLhzMJXljW","KZamHJKWYR","sqVrfVerEA","45cIH8TxD7","Zv7z0guMb8","ZzJHWoGu6x","Pb1paG1RhS","Kr8ys2Yz7E",
+"StlDJlH1kt","yEfy9uTacx","hYBCKUlU3M","ydG8Us7Mxk","AmdQdWmadA","CNHmvhe9IA","FVMxoGWqqX","Ul4a1VIlwP","RzaZAjtn0X","djsrvZhwG1",
+"5Drn0b29RJ","euZA5uQIcz","8U2nUtvdkD","x3LDe55rfB","Dz1R3gIYvE","64s8Nd7vjM","QssNCFxX9q","4QMc9t98iW","7hyVv6AFT0","tvdkDjiVBP",
+"n1pmOhSSvQ","64s8NStlDJ","tvdkD5drc6","K4GS8yluBx","LDk6fVNCPd","POUYSMm8si","9XyT92TRI7","n1pmOxReec","0YAGHMGlTF","BFkb8zmLYD",
+"k85AeksJby","lViBvZ4I1v","iB08lzHF1q","k85Aeix74r","KZamHzqH0W","1v5hH1v5hH","fcJOyFhtgl","O3iyQuJScX","6AFT0FwEJz","7ku1pDG4sT",
+"8FmFHVerEA","gtCA5gtCA5","lm0pDS2Dfu","aez9yVBjhz","AmdQd5nmWv","rKDLJazIWp","oQ87rLbRTH","iKqhrokgRi","zbIYYWMiS3","ECMvUiKqhr",
+"8xEKzs4786","ZJTXHyluBx","QChxsDz1R3","TXQ0ZFLsph","K20wK618Di","HlUbFhSSvQ","soy9ttvdkD","bZLvSVIlwP","MmsIooGu6x","LbRTHSmGzv",
+"lViBvB3qem","RzaZAx3LDe","Zv7z0i7WMQ","lpF6WHlUbF","d85a9brhlQ","Q6LixuQIcz","KASQ8lweGy","RsQUqZuDtD","lweGyfcwDa","D6rBy4dEz6",
+"HzZT85Namm","m4bxUBpYhV","2Nslm64s8N","NcICAguMb8","aez9ypFrrl","WmadAUlU3M","xReecQChxs","fFDrJThjNn","Oz8yZTa8f6","okgRigf8rI",
+"2NslmyofH3","Ss0ZuO3iyQ","s4786WDVWJ","FLsph0Wr5y","faHirVNCPd","uupzkZ4I1v","QssNCMezSW","jfREumz8gx","MmKGJiwzGk","yluBxXflUq",
+"s4786zbIYY","Cp3mZv1Hln","JKWYRlkMUA","rKDLJ7fsYM","NAFuwQYxC0","OUqFMiqv4k","6q6L9taOXK","D6rBy5nmWv","WmadAFGzgp","NhXduY1mC0",
+"IBe8k0Kyfs","0h1b1QbxXc","vLsmSWreyP","6q6L9nnP8o","6AFT0faHir","AmdQdiwzGk","v1Hln580YD","RmDcryluBx","uupzkaez9y","J2mQiZv7z0",
+"XyPZNHRxd8","qUJMdVBjhz","FhtglLDk6f","oQ87rpWiOs","SjskQAkKTk","bZLvSdhSuH","KsjRKGWqqX","okgRiStlDJ","ZUnqt4W0Tl","X6PinZzJHW",
+"StlDJaL6AJ","AOgEeJIqXi","45cIH2Yz7E","FhtgluoStw","LbRTH5Namm","FPfSEvkCHH","uAWypqaofN","MK07YjiVBP","cShY2RpBQm","BbwgAKr8ys",
+"BpYhVL7cGc","OUYuFQnJ1S","WMiS3uvf7A","blLA9HRxd8","YjB9tqUJMd","lpF6WazIWp","FGzgp07n1c","WPmlxSs0Zu","Ss0ZulXFOB","JKWYRzFgtB",
+"piJSk7Ow5C","ciuWzNxx9V","blLA9B3qem","3weIFi3pyd","Yh1hFF6PT2","Ss0ZuQWxoT","ReKEWcQOnv","JIqXiOz8yZ","lj07QyvOMI","n1pmOlXFOB",
+"lCMxyzqH0W","D6rByQbxXc","Cp3mZuAWyp","h1zcHJRJQB","suY4x2Yz7E","tlILtPOUYS","tlILtBFkb8","xXTI40BmCy","fFDrJ5VZjS","aL6AJhSSvQ",
+"i7WMQMmKGJ","OUqFMOUqFM","wDajX2DREs","F6PT2hE1Ql","cShY2BFkb8","TXQ0ZdQ586","Pb1pa16lHc","uvf7AprNT6","atef2MK07Y","2Nslm2ZHdk",
+"dmoS7BFkb8","aFFssBGaQY","rz7UtSbRYy","OxWIHNxx9V","uLtKsydG8U","2TRI7BpYhV","J2mQitjQxs","lm0pDCK5W7","8hJdtiwzGk","ksJbybgJAz",
+"yvOMIgIYvE","JkzUnTwano","zqH0W8RCUA","VjCZq7hyVv","v8yFNpvgjS","AIYUu07n1c","45cIHNOHsz","jeskSfcJOy","suY4xTa8f6","HP433bZLvS",
+"64s8NvLsmS","5NammSWfou","gtCA5OUYuF","RBhp0kZANm","ciuWzokgRi","RkQke9rlg9","lkMUAni2v1","RBhp0xXTI4","s93MlSjskQ","fcwDasx5Gl",
+"2TRI7atef2","ogLgc8xEKz","tAOsrzqH0W","yEfy9I7p2a","2Nslmd85a9","WDVWJYf2Ec","1v5hHWreyP","5iGN5F6PT2","o8Uyd2DREs","FFDui29QAz",
+"CIShGm4bxU","0YAGHgtCA5","8hJdt0h1b1","dhSuHxReec","C2IrclkMUA","okgRiNxx9V","yEfy9JRJQB","h1zcHQ6hMC","8U2nUbZLvS","2hEEUAkKTk",
+"Uvlv4GrDg7","lViBvGrDg7","he9IAvOqCE","brhlQFjHXR","faHirix74r","uN6r3S2Dfu","FVMxozY1GY","uAWypyToGW","5ZaEzAOgEe","gIYvEIjTwP",
+"Y1mC0suY4x","ulk41HlUbF","gIYvEJRJQB","F6PT29GXkX","yvOMIqaofN","DLhzMni2v1","QbxXc1LB1L","0MR5XPOUYS","suY4x1j5L8","tvdkDcL0aE",
+"Kr8ysQClRL","y94nwMmsIo","HRxd8UmaEv","FPfSEEOE1o","WDVWJqaofN","Oz8yZQnJ1S","P6bcglkMUA","pmeCd618Di","5Drn09iGoT","OUqFMUmaEv",
+"MK07Ydjsrv","s93Ml48cHL","U3yw5CxVEf","TwanopAhR1","GWqqXLDk6f","FFDui7fKYU","Ss0Zu9iGoT","mX2GEzqH0W","pWiOszHF1q","9GXkXQ6Lix",
+"SmGzvjfREu","qUJMdBFkb8","tvdkD6AFT0","X6PincmXIX","zqH0WIKxdL","pAhR1iB08l","9eoRcuN6r3","AgJHQ6AFT0","IRh48jzUqR","HfyNQSjskQ",
+"a00b5ydG8U","Kr8yspAhR1","guMb8yluBx","JXljWxciqp","pFrrlnFqik","lCMxyFnPFB","L7cGcFFDui","v8yFN2hEEU","QssNC2DREs","7lUXZhe9IA",
+"2TRI7jS1aj","0ao3lvOqCE","48cHLiB08l","VIlwPydG8U","GrDg7JIqXi","uAWyp5nmWv","Waim6FxX9q","TXQ0Zlj07Q","JkzUn2hEEU","euZA54W0Tl",
+"8cVD3d7vjM","8cVD37hyVv","djsrvlsQGo","vLsmSNcICA","uPX7GFGzgp","UlU3M2hEEU","nlaByIBe8k","piJSkpFrrl","SmGzvjzUqR","uJScXWaWsv",
+"lXFOBdQ586","xReecJIqXi","nnP8opAhR1","yluBx1LB1L","Yh1hFKZamH","nnP8oMmKGJ","618Dis93Ml","YOfrYuLtKs","n8pJ9jS1aj","uvf7AOxWIH",
+"dQ586ZUnqt","e6e4z9XyT9","pv0i7yEfy9","AOgEe29QAz","fLNg8G1RhS","AXpwEF6PT2","jeskSS77LH","0ao3lS77LH","blLA9lsQGo","h1zcHsx5Gl",
+"BCxeCfmIK1","aL6AJQYxC0","jzUqR9y4lw","iwzGkXflUq","8xEKz0MR5X","VjCZqLDk6f","rKDLJQYxC0","YOfrYmX2GE","iwzGklkMUA","FPfSE5iGN5",
+"Nxx9VfFDrJ","NAFuwfqypy","2NslmiwzGk","qQxHPQWxoT","a00b5IjTwP","azIWpKASQ8","kZANmVLTy6","DG4sT0PktI","x3LDeWaWsv","euZA5d7vjM",
+"W7cTsuLtKs","n8pJ91LB1L","uPX7GAXpwE","n8pJ9IKxdL","qQxHP5drc6","jSjS37hyVv","0KyfsF6PT2","uoStwVNCPd","5iGN5qQxHP","U3yw5hE1Ql",
+"Ss0ZueuZA5","iwzGk7fKYU","yEfy9KASQ8","RkQkeRsQUq","zbIYYru4UG","SmGzvZv7z0","K20wK7Ow5C","ogLgcNhXdu","No0QbSmGzv","nlaByDz1R3",
+"yvOMIOHaBz","gjUTuSs0Zu","14FLRuZPqg","soy9togLgc","gdQsSGWqqX","EoToPDQimp","0Kyfs4W0Tl","pAhR1l83Ud","EoToPbrhlQ","l83UdGXdoH",
+"0YAGHFLsph","lXFOBStlDJ","Vprf2MK07Y","hSSvQMaJQs","JKWYRzQt6Q","580YDjiVBP","lpF6WAXpwE","07n1cQnJ1S","s7Mxk8cVD3","xReecMmsIo",
+"QWxoTfcJOy","ksJby45cIH","EOE1omz8gx","4dEz6e6e4z","cQOnvC2Irc","Vprf2bZLvS","No0Qbsx5Gl","ZUnqtdhSuH","0ao3lRACuj","KsjRKtvdkD",
+"5VZjSEoToP","O3iyQzmLYD","kB5nPZuDtD","l83UdZhwG1","Dz1R3lm0pD","fqypy0BmCy","Gv3Fq5IhmG","jiVBPAmdQd","Mm8sipv0i7","VjCZqCfgr3",
+"29QAz7lUXZ","y94nwzbIYY","VNCPdoGu6x","pmeCdrKDLJ","MezSW9y4lw","yluBxMK07Y","G1RhSqQxHP","m4bxUPYBf4","b29RJKASQ8","azIWpkB5nP",
+"yEfy9aL6AJ","Gv3FqC2Irc","1v5hHO3iyQ","blLA90Wr5y","kB5nP0Kyfs","XyPZNJKWYR","AOgEeFxX9q","DQimp0Wr5y","QChxsCNHmv","MojnPCxVEf",
+"2NslmGrDg7","EOE1oCIShG","ZhwG1RBhp0","0Wr5y3weIF","tAOsrGSQwj","Ul4a14W0Tl","gdQsSlViBv","Oz8yZyofH3","gjUTuJXljW","YOfrYGv3Fq",
+"JIqXiQ6hMC","5nmWvY1mC0","tuDySfaHir","VBjhzgdQsS","jzUqRcQOnv","dpe1vNhXdu","zbIYY55rfB","QnJ1SuoStw","Nxx9VJkzUn","NcICAzQt6Q",
+"TCgPpM3zXL","5iGN5IRh48","iqv4kYf2Ec","FhtgldhSuH","0KyfsjS1aj","Waim6Vprf2","5VZjSPYBf4","8FmFHFnPFB","tAOsr5Drn0","atef25Mg9r",
+"xReecSjskQ","t98iW5IhmG","oQ87r1j5L8","Nxx9VqUJMd","QWxoT8cVD3","uvf7ACp3mZ","ix74rVLTy6","FjHXR9XyT9","d85a95Mg9r","8U2nUuLtKs",
+"i7WMQKsjRK","FVMxoHzZT8","CIShGguMb8","QworuzFgtB","xXTI4Oz8yZ","7fKYUyluBx","GSQwjQssNC","Yw2oUqUJMd","JIqXiBFkb8","rz7UtReKEW",
+"jeskSVBjhz","Ul4a12Yz7E","soy9tnlaBy","S2DfuAOgEe","XyPZNAIYUu","Ta8f6ydG8U","gjUTu5VZjS","d7vjMfcwDa","lpF6WVerEA","KZamHYh1hF",
+"2TRI707n1c","cQOnvPOUYS","cmXIXGWqqX","M6qcGrz7Ut","HRxd8o8Uyd","7lUXZCp3mZ","oGu6xFGzgp","SbRYyuPX7G","iKqhr6AFT0","2TRI7l83Ud",
+"FLsphiKqhr","DG4sTru4UG","9iGoTFPfSE","i3pydJXljW","zqH0WJXljW","pFrrlrz7Ut","aDGtSPOUYS","NOHszdpe1v","4dEz60Kyfs","I7p2aBbwgA",
+"8TxD7jeskS","lCMxyW3VFH","GrDg7djsrv","CqqaDKsjRK","Ul4a1vOqCE","FLsphQClRL","vkCHHZzJHW","o8UydnlaBy","WreyP1v5hH","JXljWuJScX",
+"5Mg9r2ZHdk","L7cGcCIShG","VBjhzd7vjM","GSQwjEdBKc","zY1GYtlILt","Ta8f6dQ586","SmGzvpiJSk","7lUXZWMiS3","RmDcrEoToP","s4786FcWrW",
+"oGu6xWPmlx","ydG8UFwEJz","gdQsSrKDLJ","9XyT99XyT9","RpBQmGSQwj","zFgtB5IhmG","X6PinWmadA","FLsphPOUYS","tuDySoQ87r","bZLvSIKxdL",
+"BbwgARxrsm","fFDrJhe9IA","uTacxdhSuH","fFDrJrhl0J","i3pydNxx9V","9y4lw5IhmG","BCxeCXflUq","lXFOBv2eC3","5Drn0Waim6","Ta8f6Rxrsm",
+"rz7UtblLA9","uvf7AhSSvQ","ix74ri3pyd","MmsIoKASQ8","lweGy2DREs","G1RhSReKEW","HP433oVQp6","uoStwF6PT2","dhSuHuQIcz","qUJMdtaOXK",
+"tlILtIn3NS","5VZjS580YD","AkKTkSjskQ","MK07YHRxd8","TXQ0Z07n1c","Mm8six3LDe","oVQp68U2nU","0Wr5yVBjhz","CdyBVdmoS7","618DiK4GS8",
+"M3zXLZUnqt","NhXdurhl0J","4dEz68TxD7","XflUq9XyT9","580YDYh1hF","FwEJzblLA9","AkKTk3weIF","tvdkDK4GS8","FNYIMaDGtS","d7vjM0h1b1",
+"fcJOy9XyT9","VBjhz2hEEU","7fsYMv2eC3","07n1cCIShG","RpBQmFjHXR","Vprf2GSQwj","tAOsrjS1aj","Cp3mZ55rfB","QChxsHzZT8","tjQxsFxX9q",
+"WMiS3VLTy6","MmsIoRBhp0","Nxx9VnnP8o","MK07YcQOnv","QnJ1SKr8ys","AIYUuMK07Y","uJScXFFDui","FwEJzQ6hMC","cL0aEJKWYR","14FLRNAFuw",
+"yvOMIlXFOB","LewvMJIqXi","MezSWJKWYR","JRJQBGv3Fq","RkQkeDcpWB","D6rByGrDg7","FwEJzhe9IA","lkMUAoVQp6","QworuDLhzM","vkCHHHP433",
+"ZUnqtWPmlx","YOfrY8FmFH","G1RhSGSQwj","8xEKzMm8si","FVMxojfREu","In3NSjfREu","7lUXZUmaEv","wiHrZFnPFB","L7cGcO3iyQ","2Yz7ECxVEf",
+"djsrv0BmCy","jzUqRFLsph","2NslmIn3NS","lm0pDdjsrv","XyPZNAgJHQ","tl72WVjCZq","FwEJz4dEz6","FcWrWyvOMI","IjTwP7hyVv","Chuy3580YD",
+"m4bxU5Mg9r","Pb1paLbRTH","ydG8UBGaQY","vkCHHs7Mxk","HzZT845cIH","fmIK1Dz1R3","NOHszgdQsS","VLTy6Dz1R3","GWqqXhSSvQ","VIlwPHzZT8",
+"7lUXZlXFOB","VjCZqNAFuw","uLtKsWPmlx","nnP8orhl0J","uLtKsWmadA","AgJHQlCMxy","AmdQduTacx","XflUqOUqFM","Q6LixoQ87r","JIqXivLsmS",
+"48cHLOUqFM","8cVD3suY4x","7fKYUnnP8o","ydG8UCfgr3","NOHsz5drc6","gIYvE48cHL","9y4lw3weIF","gtCA5faHir","cQOnvIRh48","VerEApFrrl",
+"8U2nU5Drn0","OUqFMo8Uyd","xReectvdkD","In3NSHRxd8","nFqiklsQGo","zmLYDYOfrY","ni2v1UlU3M","iwzGk0MR5X","5VZjSVprf2","hE1QlSs0Zu",
+"tvdkDIKxdL","QClRLJkzUn","QClRLrz7Ut","ZJTXHksJby","k85AekB5nP","v2eC3CxVEf","0PktIiwzGk","SbRYyulk41","n8pJ9CxVEf","6q6L9okgRi",
+"DG4sTix74r","aez9ylsQGo","L7cGc6q6L9","vOqCEk85Ae","580YDblLA9","i7WMQy94nw","zY1GYaDGtS","5VZjSaFFss","FnPFBsuY4x","tl72WcmXIX",
+"P6bcgcQOnv","iKqhr45cIH","5NammUl4a1","AIYUuMaJQs","QbxXcNOHsz","AkKTkpv0i7","FLsphQbxXc","zY1GYQClRL","FFDuiC2Irc","QnJ1SSbRYy",
+"uAWypiqv4k","fLNg8uJScX","UlU3MoGu6x","nnP8oQbxXc","Zv7z0xReec","0ao3lMGlTF","TXQ0Z8xEKz","8U2nUs4786","iB08lVIlwP","5IhmGO3iyQ",
+"HfyNQqUJMd","VBjhzFcWrW","jS1ajQClRL","tuDySVerEA","CIShGru4UG","t59lRs7Mxk","M3zXLTXQ0Z","JXljWzqH0W","lsQGo9rlg9","pT8wuv1Hln",
+"WMiS3IjTwP","Mm8siNhXdu","8FmFHWDVWJ","580YDnlaBy","Q6hMCuJScX","xciqpHzZT8","faHir55rfB","MGlTFNcICA","yvOMIFFDui","618DiI7p2a",
+"NAFuwQ6Lix","MojnP0BmCy","RpBQm8hJdt","dmoS7e6e4z","I7p2a3weIF","UmaEvCK5W7","taOXK1v5hH","t59lRRmDcr","FVMxowiHrZ","IRh48nlaBy",
+"s47868TxD7","nnP8ouvf7A","lm0pD7fKYU","t59lRguMb8","v8yFNe6e4z","5Drn0AOgEe","Ta8f6xReec","RACujt59lR","Dz1R3L7cGc","SjskQBFkb8",
+"VLTy6d7vjM","7fsYMAOgEe","jeskSSs0Zu","MezSWK4GS8","uvf7Av1Hln","cShY2lkMUA","FxX9qCdyBV","pFrrlSjskQ","SjskQzz4ZU","4QMc9C2Irc",
+"xReec16lHc","PYBf4Ta8f6","Q6hMCGv3Fq","pT8wuFwEJz","jSjS39GXkX","dmoS7n1pmO","5IhmGAIYUu","FVMxoThjNn","EdBKcksJby","6q6L9oQ87r",
+"NcICANcICA","7ku1pVIlwP","HP4339iGoT","o8UydVBjhz","LewvMQssNC","aDGtSBbwgA","ksJby0Wr5y","VBjhzprNT6","POUYSHP433","RBhp0yvOMI",
+"RxrsmNAFuw","mz8gxB3qem","djsrvvLsmS","GXdoH7ku1p","X6PinMm8si","JXljW0ao3l","7X3uy9y4lw","fcwDaUl4a1","9XyT9hSSvQ","Qworuxciqp",
+"vLsmSrhl0J","Ss0ZuqUJMd","lXFOB48cHL","uoStweuZA5","C2IrcFhtgl","zQt6Q9GXkX","4QMc9LbRTH","yEfy9QbxXc","rKDLJRpBQm","XflUqzHF1q",
+"5Mg9r9rlg9","jfREuFNYIM","5iGN5uJScX","Chuy3J2mQi","SmGzvJRJQB","OUYuFdjsrv","y94nwpT8wu","5NammFwEJz","5drc6piJSk","jtn0XuQIcz",
+"ThjNnLewvM","euZA51LB1L","RpBQmRpBQm","JXljWOHaBz","OUYuFlj07Q","BCxeCCNHmv","jzUqRLbRTH","RzaZA7Ow5C","F6PT2LDk6f","brhlQMmsIo",
+"Ul4a1Zv7z0","5iGN5ydG8U","HRxd8FwEJz","VNCPd2ZHdk","VIlwPB3qem","ZzJHWG1RhS","aFFssrz7Ut","uvf7AwiHrZ","mz8gxJJs5m","jeskSydG8U",
+"m4bxUSbRYy","Chuy3bgJAz","tuDyS5VZjS","Q6LixjfREu","CK5W7MmsIo","hi5X7AXpwE","5Drn0JkzUn","NcICAhSSvQ","55rfByToGW","jeskS8FmFH",
+"UmaEvzQt6Q","pvgjS1LB1L","7hyVvGWqqX","CNHmv0MR5X","0BmCyMK07Y","DQimpAgJHQ","MmsIoNhXdu","i7WMQoQ87r","2NslmwiHrZ","IjTwP580YD",
+"FjHXRZ4I1v","2ZHdk48cHL","iKqhrjeskS","hYBCKOHaBz","SWfouReKEW","m4bxUWreyP","07n1cY1mC0","zQt6QydG8U","Uvlv429QAz","aez9yCp3mZ",
+"WmadAv1Hln","DG4sTQworu","GSQwjgjUTu","fcwDa14FLR","Ul4a1Kr8ys","NhXduRxrsm","FcWrW0h1b1","C2Irc8cVD3","VjCZq8U2nU","VBjhzhYBCK",
+"ZhwG1h1zcH","tl72WThjNn","guMb85Namm","bgJAz29QAz","FnPFBi3pyd","oGu6xW3VFH","yEfy9RBhp0","07n1c9y4lw","NOHsz9iGoT","o8UydSWfou",
+"8FmFHhYBCK","SmGzvydG8U","rhl0JQClRL","o8UydChuy3","uupzkv2eC3","cShY2DG4sT","5drc6nnP8o","FNYIMFhtgl","5drc6WPmlx","KsjRK8RCUA",
+"iwzGkSbRYy","XflUqIKxdL","4dEz6gtCA5","l83UdlpF6W","fcwDaZ4I1v","zqH0WzqH0W","5Mg9rMK07Y","1j5L82TRI7","4W0TlMK07Y","7fsYMzz4ZU",
+"pvgjSHRxd8","5drc6lj07Q","lXFOBBGaQY","s7MxkwDajX","v1HlnyvOMI","NOHszydG8U","soy9tFGzgp","pAhR1S2Dfu","azIWpmz8gx","DLhzM618Di",
+"okgRiTa8f6","iKqhrAkKTk","oQ87rsuY4x","8xEKzQYxC0","D6rByAIYUu","cmXIX0BmCy","Gv3Fq55rfB","W7cTsuTacx","uN6r3tlILt","B3qemK4GS8",
+"mX2GEQssNC","uvf7AEoToP","AgJHQ2Yz7E","pT8wujtn0X","Waim6zbIYY","cL0aElCMxy","l83Uddjsrv","Gv3FqtlILt","K4GS8euZA5","s47869XyT9",
+"ulk41fLNg8","Cp3mZ8cVD3","8FmFHBFkb8","okgRiokgRi","2TRI7hE1Ql","n8pJ9lViBv","Ta8f62TRI7","5IhmGtl72W","djsrvKr8ys","RkQke07n1c",
+"uPX7GTXQ0Z","580YDRmDcr","ulk41Yh1hF","2DREsQworu","Nxx9VMmsIo","5Drn0oVQp6","FFDuiCK5W7","14FLRlH1kt","OUqFMjS1aj","cmXIXStlDJ",
+"lCMxycL0aE","wDajXulk41","NcICACxVEf","iB08lciuWz","v1HlnQClRL","9iGoTWMiS3","djsrvJRJQB","jtn0Xzz4ZU","uLtKsK20wK","fqypyCp3mZ",
+"ksJby48cHL","5NammVBjhz","QYxC0C2Irc","suY4xKr8ys","blLA9jtn0X","K20wKWPmlx","BFkb8IKxdL","6q6L9Oz8yZ","fmIK1ydG8U","EoToPPb1pa",
+"s7MxkWMiS3","m4bxUSjskQ","WaWsvWreyP","suY4xkZANm","d85a92Nslm","D6rBy9GXkX","5Nammulk41","P6bcgcL0aE","fqypy7fsYM","FcWrWwiHrZ",
+"7fsYMHfyNQ","zFgtBuAWyp","MezSWlXFOB","NcICA8hJdt","ix74rMmKGJ","JJs5m8cVD3","uZPqguN6r3","t59lRZ4I1v","FVMxoS77LH","tl72W9eoRc",
+"zHF1qn8pJ9","CK5W78TxD7","ZuDtD2Nslm","FFDuis7Mxk","pAhR1piJSk","yluBx0YAGH","x3LDelweGy","suY4xGSQwj","ThjNnZUnqt","Yw2oUCK5W7",
+"fcJOy5IhmG","ni2v1y94nw","W3VFHlsQGo","7Ow5CEoToP","MGlTF9GXkX","EoToPhUTw7","NhXdujzUqR","aDGtStl72W","fmIK1WMiS3","mX2GElm0pD",
+"zY1GYzbIYY","ru4UGZzJHW","48cHL7Ow5C","jfREuni2v1","ksJbyAmdQd","ni2v17lUXZ","WaWsvGXdoH","JRJQBlpF6W","SjskQNxx9V","BGaQYfcJOy",
+"64s8N8cVD3","VBjhzIRh48","lH1ktzbIYY","VLTy6gtCA5","GXdoHv2eC3","iqv4kQssNC","64s8NzFgtB","hSSvQ29QAz","9GXkXlweGy","kB5nPZv7z0",
+"ECMvU618Di","45cIHAIYUu","MmKGJeuZA5","MmKGJRACuj","WaWsvVerEA","zqH0W7fsYM","pAhR1xXTI4","iwzGkMojnP","FwEJzkZANm","fmIK1prNT6",
+"tvdkDIjTwP","GrDg7VerEA","JJs5mRxrsm","h1zcHbgJAz","KsjRKRACuj","jfREuCIShG","zFgtB45cIH","uAWypfmIK1","0Wr5yWDVWJ","QbxXcuJScX",
+"uoStwYh1hF","HRxd8RmDcr","0Kyfs0MR5X","TCgPpciuWz","UmaEvFNYIM","QbxXczz4ZU","WPmlxGXdoH","5iGN5Cfgr3","9XyT9RmDcr","0Wr5yGXdoH",
+"OUqFMZv7z0","uLtKsIn3NS","VNCPdt98iW","FcWrWt59lR","AIYUuVjCZq","KASQ86AFT0","14FLRMmsIo","C2IrcTXQ0Z","hUTw724ARF","vkCHHCdyBV",
+"zHF1qRmDcr","oQ87rCdyBV","5VZjSv2eC3","rKDLJD6rBy","aez9yZzJHW","IKxdLpFrrl","zz4ZU0BmCy","RzaZA0YAGH","2ZHdkHzZT8","t59lRk85Ae",
+"tjQxsVNCPd","HRxd8IBe8k","M3zXLTwano","ZUnqtRxrsm","DG4sT9GXkX","FNYIMQssNC","i3pyd3otm6","tjQxsEOE1o","pWiOsGWqqX","aDGtSlm0pD",
+"CxVEfCp3mZ","MojnPF6PT2","FFDuigjUTu","xciqpcQOnv","Qworu0PktI","iB08l6AFT0","uJScXAXpwE","RpBQm2TRI7","RpBQmhE1Ql","cmXIXcQOnv",
+"jiVBPStlDJ","NhXdu9rlg9","fqypyJIqXi","nnP8o6AFT0","qUJMdG1RhS","Zv7z0vkCHH","zbIYYsuY4x","GSQwjYjB9t","lj07Qulk41","QChxs8cVD3",
+"FFDuigIYvE","fFDrJ5iGN5","CqqaDlpF6W","ZzJHWDz1R3","gjUTuxReec","8hJdtsoy9t","pvgjSTCgPp","pFrrlSWfou","aDGtSJJs5m","xXTI42ZHdk",
+"l83Uds7Mxk","OUqFMn1pmO","TXQ0Z4W0Tl","zQt6QWmadA","0YAGHuAWyp","QClRLFxX9q","OUYuFo8Uyd","ZzJHWQChxs","07n1cuupzk","2TRI7gjUTu",
+"2TRI7djsrv","OxWIHtl72W","EdBKc9rlg9","VBjhzKASQ8","CqqaDYh1hF","MezSWFPfSE","C2Irc5iGN5","i7WMQU3yw5","bZLvSVerEA","I7p2aJIqXi",
+"0h1b14QMc9","5drc6AOgEe","ZJTXHuoStw","1j5L8fLNg8","yToGWWreyP","MojnP29QAz","ix74r4QMc9","RsQUqCfgr3","BbwgAIjTwP","ydG8Ul83Ud",
+"ECMvUx3LDe","7fKYU1v5hH","In3NSk85Ae","xciqpv2eC3","yvOMIkZANm","NhXdujS1aj","4W0TlKZamH","WaWsvh1zcH","dmoS7uZPqg","Q6LixWaim6",
+"fcwDajSjS3","No0QbxXTI4","jS1ajoVQp6","pvgjSyofH3","9rlg9OUYuF","KZamHBFkb8","piJSktvdkD","lweGyUmaEv","ZzJHWHfyNQ","RzaZAWaWsv",
+"pvgjSFGzgp","RpBQmqaofN","HzZT8S77LH","MezSW0Kyfs","3otm6HP433","IKxdLQChxs","yluBxjSjS3","uoStwzQt6Q","WPmlx2DREs","FjHXRpvgjS",
+"JJs5mUl4a1","Twanoa00b5","dhSuHJ2mQi","FjHXRzbIYY","HzZT8soy9t","SbRYytl72W","FxX9qXyPZN","FGzgpix74r","gf8rIksJby","QChxszz4ZU",
+"h1zcHUl4a1","gf8rIOz8yZ","b29RJzmLYD","d85a9QClRL","EoToPZv7z0","NcICAgjUTu","4QMc9dmoS7","ZhwG1iqv4k","Yh1hF9XyT9","zFgtBuZPqg",
+"UmaEvIKxdL","8cVD3Rxrsm","MojnPrz7Ut","1j5L88U2nU","piJSkydG8U","3weIFyluBx","xciqpfLNg8","EOE1oQChxs","9GXkXh1zcH","5NammiwzGk",
+"5IhmGJ2mQi","o8UydW7cTs","lH1kt3weIF","pv0i7BpYhV","HfyNQ2hEEU","Yf2EcPb1pa","WPmlxWmadA","AgJHQlH1kt","No0Qbhi5X7","J2mQidpe1v",
+"nFqikAmdQd","NAFuwhi5X7","MK07YEdBKc","VNCPdhYBCK","Nxx9VMm8si","WMiS3gIYvE","NcICAXflUq","FGzgpZzJHW","618DiciuWz","pFrrlpAhR1",
+"rz7UthE1Ql","DcpWBJ2mQi","2hEEUfLNg8","tAOsr8RCUA","W3VFHaFFss","ciuWzxXTI4","Y1mC02Nslm","zbIYYQClRL","euZA5ydG8U","Yh1hFs93Ml",
+"Yw2oUuN6r3","ZUnqt9XyT9","JXljWyToGW","fFDrJcL0aE","yluBx8U2nU","tvdkDb29RJ","D6rByl83Ud","QbxXcMezSW","0BmCySWfou","Mm8sihYBCK",
+"U3yw5x3LDe","ThjNnlweGy","5drc6FLsph","iKqhrBpYhV","QssNC5Namm","P6bcgCxVEf","5NammiKqhr","Z4I1vP6bcg","wDajXvkCHH","S2DfutaOXK",
+"UmaEv0YAGH","hYBCKprNT6","1v5hHZzJHW","ZUnqtI7p2a","uJScXDz1R3","DQimp5Mg9r","rKDLJW3VFH","5Mg9rgtCA5","mX2GEs7Mxk","CNHmvBpYhV",
+"RkQkeuPX7G","yluBx2TRI7","SjskQCIShG","zY1GYMaJQs","FNYIMoQ87r","AIYUunlaBy","9XyT9lweGy","qaofNWDVWJ","ru4UGKsjRK","EOE1oMkgy8",
+"FPfSECdyBV","e6e4zZUnqt","pFrrlnnP8o","ThjNnuTacx","45cIHxXTI4","dhSuHMaJQs","ydG8UVIlwP","vOqCEEoToP","2TRI7K20wK","dmoS75nmWv",
+"qaofNVprf2","5Drn0zY1GY","CxVEflj07Q","D6rBypWiOs","jS1aji7WMQ","WPmlxQworu","piJSkLbRTH","jtn0XIBe8k","dmoS7pFrrl","tuDySYh1hF",
+"guMb8MGlTF","jtn0XKsjRK","7X3uyfcwDa","uLtKszHF1q","WPmlx580YD","5drc6MezSW","hUTw7ZhwG1","oVQp6JRJQB","tlILttuDyS","JIqXiNhXdu",
+"TXQ0Zn1pmO","o8UydMK07Y","VBjhz8cVD3","iqv4kfLNg8","8RCUAOUYuF","WMiS3MK07Y","n8pJ90Wr5y","No0QbRsQUq","QnJ1SNhXdu","StlDJTa8f6",
+"LewvMuAWyp","QChxsZJTXH","RzaZAcmXIX","cShY2zFgtB","brhlQsoy9t","jS1ajfcJOy","5Mg9rfmIK1","bZLvSM3zXL","4W0TlTwano","1v5hHKr8ys",
+"CIShGpFrrl","dQ586FcWrW","WDVWJlpF6W","t59lR4W0Tl","FwEJzdmoS7","i3pydWMiS3","ogLgcHP433","zbIYYBCxeC","HzZT8QClRL","k85AeZJTXH",
+"RACuj16lHc","gjUTu9rlg9","uJScXulk41","qQxHPBCxeC","OxWIHs4786","fmIK18FmFH","QYxC0QnJ1S","uupzkt59lR","ciuWzMezSW","Waim6ni2v1",
+"aFFss48cHL","i3pydC2Irc","zFgtB7hyVv","yEfy9lsQGo","lH1ktguMb8","ciuWzsoy9t","fLNg8x3LDe","tlILtX6Pin","iB08luZPqg","CdyBVpT8wu",
+"BGaQY0Kyfs","DLhzMrhl0J","TXQ0Z7Ow5C","2Yz7EFGzgp","QssNCatef2","wiHrZciuWz","iKqhrzHF1q","h1zcH3weIF","jS1ajB3qem","k85Ae4dEz6",
+"U3yw5ZhwG1","45cIH45cIH","jS1ajCp3mZ","ZuDtDZzJHW","2NslmW3VFH","RzaZAru4UG","6q6L9hUTw7","JkzUn0YAGH","3weIFfmIK1","2DREsnnP8o",
+"uupzkdhSuH","atef2zz4ZU","7Ow5CGWqqX","JKWYRdpe1v","tvdkDYw2oU","Uvlv4CqqaD","qUJMdZv7z0","Oz8yZU3yw5","0Wr5y7X3uy","HfyNQfqypy",
+"SmGzvFVMxo","9eoRcAOgEe","BbwgAVLTy6","0Wr5ylj07Q","i3pydDz1R3","VNCPduvf7A","OHaBze6e4z","Ta8f6U3yw5","8TxD72TRI7","yofH37ku1p",
+"s93Mlfqypy","5IhmGKsjRK","No0Qbk85Ae","HP43324ARF","5nmWv6AFT0","cmXIXpvgjS","DLhzMvOqCE","prNT6tuDyS","ni2v1pWiOs","zz4ZUZv7z0",
+"Dz1R3ydG8U","HlUbFIjTwP","AmdQdHlUbF","xReecRmDcr","Q6hMCCp3mZ","9y4lw5Mg9r","AkKTkRpBQm","dQ586CNHmv","Waim6n1pmO","HRxd8tAOsr",
+"VBjhz0YAGH","NOHszgIYvE","7fsYMfmIK1","Yh1hFiB08l","iB08llweGy","16lHcJRJQB","TCgPp16lHc","0KyfsQ6Lix","zFgtBCp3mZ","FjHXRUmaEv",
+"sqVrfI7p2a","tlILtlkMUA","OHaBzMkgy8","2NslmZuDtD","uN6r3ru4UG","iwzGklpF6W","DLhzM9iGoT","zbIYY9y4lw","lH1ktuupzk","ZzJHW2ZHdk",
+"EdBKcGSQwj","2DREsWaim6","7fKYUydG8U","C2IrcJkzUn","jS1aj16lHc","9GXkXZ4I1v","0MR5X29QAz","8TxD7O3iyQ","Q6LixEoToP","Mm8siMmsIo",
+"faHirvkCHH","i7WMQdhSuH","Yf2EcvOqCE","JIqXiDz1R3","zY1GYHRxd8","pFrrl2DREs","LewvM8hJdt","Oz8yZHP433","o8UydM3zXL","RzaZABFkb8",
+"OUYuFNAFuw","o8UydgtCA5","8FmFHrhl0J","8RCUAatef2","C2IrcuAWyp","fcwDal83Ud","tjQxsMmsIo","lm0pDKZamH","VNCPdHlUbF","In3NSbgJAz",
+"kZANmlH1kt","2ZHdkn1pmO","Ta8f624ARF","uZPqgU3yw5","MGlTFjzUqR","BGaQYyofH3","8FmFH7X3uy","1j5L8MmKGJ","wiHrZC2Irc","GXdoHVerEA",
+"ogLgcStlDJ","W3VFHuTacx","MaJQszFgtB","MmKGJt98iW","ru4UGjeskS","ZUnqtHP433","VerEAv1Hln","HlUbFZ4I1v","NAFuwqUJMd","s7MxkNo0Qb",
+"ru4UGlViBv","taOXKulk41","EdBKcZzJHW","Ss0Zuhi5X7","FPfSE24ARF","UlU3M4QMc9","AOgEeS77LH","Mm8si45cIH","yluBxjeskS","v8yFNru4UG",
+"nnP8owiHrZ","Kr8ysix74r","WDVWJlCMxy","WDVWJfqypy","aDGtS3weIF","O3iyQLbRTH","l83Ud1j5L8","HfyNQhSSvQ","7fKYUm4bxU","uAWypFwEJz",
+"4W0TlcmXIX","uQIcznnP8o","v2eC3Oz8yZ","dQ5869XyT9","VerEAJkzUn","Ul4a11v5hH","MK07YU3yw5","xReecpT8wu","a00b5s93Ml","pFrrlFNYIM",
+"yToGWIRh48","I7p2aNxx9V","rz7UtCIShG","QworulH1kt","lH1ktFGzgp","FLsphY1mC0","ReKEWtlILt","Chuy33otm6","5Mg9rn8pJ9","Yh1hFyToGW",
+"8FmFH7fsYM","0h1b1FjHXR","XflUqZJTXH","AkKTk8TxD7","Mkgy8gIYvE","8RCUAIKxdL","0BmCylXFOB","KsjRKCp3mZ","Ss0ZulsQGo","7hyVvNhXdu",
+"uQIcz7X3uy","WMiS3Cp3mZ","OHaBzRzaZA","dhSuH7fKYU","jS1ajQYxC0","cQOnvzmLYD","LewvMCp3mZ","55rfBI7p2a","FhtglgtCA5","SbRYyQ6Lix",
+"QnJ1Slj07Q","GWqqXGWqqX","L7cGctvdkD","DQimpdhSuH","yofH3yvOMI","CK5W7v1Hln","0YAGHEdBKc","CdyBV5VZjS","cmXIXn8pJ9","iB08lfqypy",
+"CNHmv9eoRc","ni2v1cQOnv","vLsmSdmoS7","NhXduSs0Zu","LDk6fVjCZq","AkKTkxReec","JKWYRCIShG","J2mQiK20wK","YjB9tiKqhr","3otm66q6L9",
+"cShY2uTacx","618DivOqCE","Z4I1v2ZHdk","SjskQ0Wr5y","zQt6QsqVrf","FjHXRI7p2a","OUYuF16lHc","m4bxUThjNn","G1RhS8RCUA","K4GS8he9IA",
+"XflUq7X3uy","S2DfuoVQp6","CxVEfVBjhz","BbwgAi3pyd","0Wr5ySWfou","aFFssrhl0J","sqVrfEdBKc","WreyPSjskQ","F6PT2KASQ8","VjCZq8RCUA",
+"ciuWzuTacx","7lUXZcShY2","ThjNn5VZjS","Yw2oUmX2GE","FcWrW5Namm","n1pmOgIYvE","uQIcztvdkD","O3iyQS2Dfu","FPfSESjskQ","lkMUAQYxC0",
+"TXQ0ZcShY2","14FLRXflUq","HP433No0Qb","d85a9Gv3Fq","DLhzMsoy9t","ThjNnGSQwj","tl72Ws93Ml","QnJ1SgtCA5","AOgEeVerEA","HP433IjTwP",
+"XflUqkZANm","RpBQm7Ow5C","qUJMdhE1Ql","MmKGJZv7z0","dhSuHK4GS8","5drc6hSSvQ","mz8gxsx5Gl","uupzknFqik","G1RhSdpe1v","QssNCdjsrv",
+"2hEEUEoToP","Kr8ysIBe8k","jfREu5ZaEz","0h1b14dEz6","CIShGUl4a1","No0QbZUnqt","WMiS3oVQp6","QYxC0fcwDa","mz8gxuvf7A","hi5X7jtn0X",
+"s93MlblLA9","AOgEe8TxD7","Yf2EcgtCA5","45cIHtlILt","JIqXigIYvE","7fKYUpv0i7","XyPZNNcICA","yvOMIIBe8k","LDk6fHfyNQ","5Mg9riB08l",
+"Y1mC0Kr8ys","Qworus4786","Dz1R3bgJAz","pv0i7VerEA","ZUnqtJkzUn","Mm8silkMUA","atef2M3zXL","FGzgpi7WMQ","MojnPLDk6f","lm0pDnnP8o",
+"he9IAnFqik","oGu6xQworu","dQ586cL0aE","SmGzvP6bcg","lj07QUmaEv","suY4x3otm6","Q6hMCsoy9t","lXFOBhYBCK","nFqikaDGtS","CNHmvG1RhS",
+"CxVEfIn3NS","zmLYDZ4I1v","JRJQBcShY2","uPX7GVprf2","fLNg8RsQUq","guMb8zHF1q","Q6LixFcWrW","VLTy6oGu6x","No0QbsqVrf","ulk41Cp3mZ",
+"cQOnvEdBKc","ReKEWIRh48","BCxeCDz1R3","Nxx9VhYBCK","iwzGkBpYhV","GWqqXHfyNQ","WmadA0ao3l","yluBxChuy3","7lUXZl83Ud","Rxrsmfqypy",
+"gf8rIdjsrv","vOqCEs7Mxk","MezSW8U2nU","MaJQsni2v1","lm0pDtvdkD","qUJMdlpF6W","StlDJB3qem","9y4lwCqqaD","pWiOslCMxy","h1zcHAIYUu",
+"pAhR1TXQ0Z","djsrvCfgr3","uupzkJkzUn","K4GS8Gv3Fq","soy9tjtn0X","KsjRKe6e4z","WDVWJdhSuH","W3VFHGXdoH","qUJMd0Wr5y","e6e4zYjB9t",
+"1j5L8ogLgc","HzZT8tAOsr","55rfBZ4I1v","hi5X70Wr5y","cmXIXguMb8","ZuDtDBbwgA","JRJQB16lHc","YjB9t3weIF","5Drn0pT8wu","2hEEUxciqp",
+"FcWrWe6e4z","QssNCpmeCd","Waim6s93Ml","vLsmS5nmWv","lH1kt9eoRc","iqv4kK20wK","G1RhS9y4lw","GSQwjxXTI4","OHaBzFxX9q","fcJOy55rfB",
+"NhXduDLhzM","TwanoRkQke","hE1QlSbRYy","WreyP0Kyfs","29QAznnP8o","S77LHDQimp","Ta8f6kB5nP","Qworu580YD","O3iyQ4dEz6","BbwgAJJs5m",
+"FFDui2hEEU","t59lR1v5hH","MGlTFWDVWJ","0MR5Xv8yFN","G1RhSSjskQ","gjUTuS2Dfu","KASQ8jfREu","gjUTuRkQke","NAFuw7Ow5C","HlUbF5ZaEz",
+"dhSuHd85a9","7fKYUyToGW","MaJQslH1kt","K4GS8oGu6x","prNT6qaofN","zqH0Ws7Mxk","0Wr5yMkgy8","x3LDeAkKTk","ulk41GrDg7","lCMxyo8Uyd",
+"b29RJJXljW","FPfSE0BmCy","mX2GEnlaBy","0BmCyYw2oU","WDVWJBCxeC","d7vjMMmKGJ","LDk6fRpBQm","uQIcz0Kyfs","kZANmiwzGk","S77LHFwEJz",
+"jzUqRv2eC3","lH1ktyvOMI","XyPZNHP433","ZhwG1zQt6Q","uAWypDQimp","blLA9zbIYY","OUYuFKZamH","SmGzvtuDyS","m4bxUJkzUn","atef2vkCHH",
+"tlILtfLNg8","t98iWwDajX","VIlwPVprf2","he9IAjtn0X","CqqaDcShY2","ulk41zbIYY","YjB9tjiVBP","zHF1q8FmFH","4dEz6MK07Y","n8pJ9qUJMd",
+"GWqqXYh1hF","7fsYMSs0Zu","uoStwoGu6x","n8pJ9rKDLJ","Mm8siOHaBz","GWqqXfLNg8","D6rByFLsph","bgJAzhSSvQ","FnPFB8FmFH","DLhzMciuWz",
+"8TxD7zqH0W","rhl0JL7cGc","uAWyps7Mxk","EoToPRsQUq","y94nw5VZjS","m4bxUMkgy8","Yh1hFzqH0W","tuDySqaofN","ZUnqtZ4I1v","48cHLKZamH",
+"d7vjMStlDJ","VerEACK5W7","lj07QdQ586","KsjRKsoy9t","fcJOyTCgPp","RzaZAMGlTF","uupzkPYBf4","DLhzMazIWp","VNCPdMmKGJ","ReKEWfmIK1",
+"AOgEelsQGo","prNT6blLA9","jS1ajStlDJ","TCgPp1LB1L","tuDySHP433","HlUbFaFFss","bgJAzYOfrY","i3pydguMb8","hYBCKZv7z0","sqVrfFFDui",
+"lj07Qn8pJ9","mX2GEtlILt","oQ87rbgJAz","3weIFjiVBP","kZANmkB5nP","RxrsmvLsmS","k85AetvdkD","d7vjMQbxXc","azIWpOUqFM","WmadAgIYvE",
+"5ZaEzWaim6","Rxrsmi7WMQ","NhXdufFDrJ","prNT6Qworu","Vprf2QClRL","pT8wunFqik","ru4UGYjB9t","24ARF24ARF","Q6hMC2TRI7","jSjS3cL0aE",
+"Cfgr3s7Mxk","uN6r3uPX7G","TCgPpBpYhV","Waim6uZPqg","tuDySb29RJ","QClRLfcwDa","zQt6QM6qcG","zz4ZUGrDg7","zmLYDVNCPd","1LB1LGXdoH",
+"7fsYMtjQxs","zqH0WU3yw5","gjUTurKDLJ","pvgjSVLTy6","pFrrlL7cGc","0KyfsiKqhr","MezSWksJby","ZzJHWIBe8k","wiHrZfLNg8","QWxoTMK07Y",
+"pWiOsUvlv4","zbIYYVprf2","pFrrlRpBQm","JJs5m2ZHdk","8cVD3CdyBV","RpBQms7Mxk","UlU3M3otm6","0h1b1mz8gx","ogLgccL0aE","TXQ0ZuTacx",
+"ni2v1zqH0W","s4786e6e4z","45cIHOxWIH","5iGN58TxD7","OUqFMZuDtD","5NammlCMxy","ZJTXH5Namm","aez9yFcWrW","RBhp0uZPqg","ciuWzWreyP",
+"yToGWTa8f6","zQt6QSjskQ","pWiOstjQxs","QnJ1SVLTy6","Yh1hFCIShG","lXFOB29QAz","Y1mC0uoStw","8hJdtWDVWJ","FnPFBPb1pa","JIqXigf8rI",
+"4QMc9ZUnqt","OUqFMThjNn","QbxXcQnJ1S","G1RhSUl4a1","xReecOUYuF","W3VFHRACuj","Nxx9VPYBf4","In3NSnnP8o","AgJHQfcwDa","TXQ0ZkB5nP",
+"jeskSn8pJ9","FNYIMzqH0W","K4GS8In3NS","JkzUnY1mC0","yluBxprNT6","W7cTsm4bxU","LewvM0PktI","lj07QQWxoT","KZamHuLtKs","s4786XflUq",
+"MGlTFguMb8","Uvlv4BGaQY","8cVD3piJSk","zmLYDOHaBz","9GXkXFnPFB","prNT6S2Dfu","zY1GYQYxC0","FPfSE2DREs","7lUXZW3VFH","1j5L8lpF6W",
+"d85a9lH1kt","RzaZAhE1Ql","Q6Lix64s8N","Rxrsmdjsrv","tAOsrpFrrl","jzUqR0BmCy","guMb8NcICA","BGaQYHlUbF","uQIczOz8yZ","uJScXtjQxs",
+"FGzgpfaHir","vkCHHX6Pin","piJSk4dEz6","ZUnqt8cVD3","55rfBK4GS8","dhSuHiB08l","NcICAciuWz","YjB9tStlDJ","tAOsr3weIF","SbRYylXFOB",
+"ydG8UMGlTF","mz8gxlkMUA","SjskQjS1aj","gf8rImz8gx","s93MlFVMxo","No0QbCNHmv","QChxs5Drn0","2NslmWaim6","qQxHPM6qcG","8xEKzG1RhS",
+"K4GS8iKqhr","he9IA8U2nU","he9IA3weIF","2TRI7In3NS","cL0aE7lUXZ","0h1b1iqv4k","IBe8kQ6Lix","i3pydcQOnv","FPfSEcShY2","8U2nUMK07Y",
+"K4GS8fFDrJ","faHirVIlwP","he9IAtaOXK","3otm6HlUbF","lsQGoprNT6","cL0aEmX2GE","piJSks4786","QbxXcNhXdu","VjCZqaFFss","i3pydi7WMQ",
+"OxWIH9XyT9","bZLvScQOnv","FnPFBIKxdL","uPX7GzbIYY","m4bxUZhwG1","qQxHPMmKGJ","hSSvQ5IhmG","gtCA5uN6r3","Chuy3Gv3Fq","yToGWjS1aj",
+"OUqFMtuDyS","LbRTHBCxeC","gf8rIs93Ml","taOXKRACuj","DLhzMIn3NS","FxX9qQbxXc","BbwgAFGzgp","vkCHHQ6hMC","NOHszQWxoT","vOqCEzz4ZU",
+"Dz1R3LewvM","aDGtSd7vjM","QworuAkKTk","zY1GYv1Hln","iwzGkXyPZN","NOHsz0Kyfs","7hyVvS77LH","Gv3FquoStw","zY1GYVBjhz","zFgtBD6rBy",
+"pT8wuKr8ys","lweGyiqv4k","ZhwG1pmeCd","n8pJ9lkMUA","OxWIHJXljW","fcwDa9iGoT","ZhwG1P6bcg","s7MxkMkgy8","9y4lwMaJQs","rhl0JtvdkD",
+"Cfgr364s8N","2ZHdkzFgtB","8xEKzZJTXH","lXFOBGWqqX","7fsYMuJScX","WreyPgjUTu","Q6hMCCdyBV","s4786d7vjM","YOfrYrhl0J","G1RhSxXTI4",
+"vOqCEnnP8o","suY4x3weIF","Yw2oUS2Dfu","uPX7GReKEW","FnPFBPOUYS","a00b5OUYuF","0PktIRkQke","S77LHTa8f6","jiVBP48cHL","nnP8oPb1pa",
+"GXdoHBCxeC","AXpwEGv3Fq","7fsYMGWqqX","9GXkXOHaBz","suY4xoGu6x","uoStwaDGtS","RmDcrFGzgp","RkQkeFVMxo","aL6AJThjNn","suY4xD6rBy",
+"gdQsSix74r","xciqp9GXkX","xciqp0BmCy","FGzgpFPfSE","pv0i7suY4x","9iGoTCfgr3","YOfrYhSSvQ","oQ87rm4bxU","KASQ8x3LDe","lweGyyToGW",
+"HfyNQVBjhz","RxrsmlkMUA","7ku1pksJby","RACujaFFss","VBjhzhi5X7","618DiuQIcz","lm0pDgjUTu","Ta8f6iwzGk","4dEz6HfyNQ","yluBxm4bxU",
+"Kr8yshYBCK","SjskQChuy3","Gv3Fql83Ud","8TxD7k85Ae","QWxoTMezSW","JIqXiMojnP","qQxHPMaJQs","AgJHQRmDcr","Cp3mZUlU3M","Oz8yZwDajX",
+"OxWIHiB08l","FxX9qSmGzv","brhlQFFDui","GWqqXHRxd8","pWiOsJJs5m","zQt6QMaJQs","CxVEfiB08l","wiHrZ8RCUA","QnJ1ScL0aE","S2DfuCNHmv",
+"vLsmSxReec","VLTy6mX2GE","Qworu7X3uy","LbRTH6q6L9","QssNCfmIK1","UlU3MwiHrZ","RkQkeSjskQ","7X3uy8FmFH","FLsphoQ87r","W7cTsGv3Fq",
+"Mkgy88cVD3","jfREupT8wu","KZamHVjCZq","jeskSStlDJ","BFkb82DREs","Oz8yZtl72W","JJs5ms7Mxk","pmeCdkZANm","oQ87rgjUTu","jeskSOz8yZ",
+"8hJdtRkQke","aFFsshSSvQ","AgJHQulk41","P6bcgXflUq","QworuDG4sT","5ZaEzEOE1o","JKWYRmX2GE","azIWpPOUYS","pFrrlGWqqX","zmLYDoQ87r",
+"k85AeOxWIH","GrDg7ZzJHW","h1zcHEoToP","iB08lKASQ8","HRxd8v2eC3","JXljWvLsmS","WPmlx45cIH","uAWypMGlTF","uN6r3DLhzM","s93MlAXpwE",
+"n1pmOFjHXR","uN6r3FGzgp","QWxoTQChxs","fFDrJo8Uyd","yToGWCp3mZ","PYBf4QChxs","cShY2v8yFN","nFqik1LB1L","ZuDtDUmaEv","pvgjSVNCPd",
+"GSQwjKr8ys","zY1GYVjCZq","lViBvFGzgp","DG4sTS77LH","I7p2aNhXdu","0ao3ltAOsr","1j5L8Rxrsm","ru4UGs93Ml","B3qemfLNg8","sqVrf7X3uy",
+"i3pydRsQUq","wiHrZzQt6Q","2Yz7Ed85a9","J2mQibZLvS","dQ586CIShG","uJScXv8yFN","Chuy3Yf2Ec","5Drn0Ul4a1","iKqhrv1Hln","QworuHP433",
+"GrDg7iKqhr","cQOnvkB5nP","ulk41Mm8si","XflUqjS1aj","FhtglmX2GE","5ZaEzciuWz","5drc6vOqCE","he9IAuAWyp","ix74rjzUqR","KsjRKZhwG1",
+"KASQ8s93Ml","cmXIXdhSuH","dpe1v3otm6","7lUXZ29QAz","qaofNe6e4z","9rlg9BpYhV","pWiOshSSvQ","24ARFyToGW","Mm8sihSSvQ","jS1ajuAWyp",
+"5ZaEzfcJOy","cShY29GXkX","No0QbOxWIH","qQxHPDcpWB","hE1Ql9eoRc","5drc6Cp3mZ","uupzkuPX7G","8cVD3YOfrY","MaJQsx3LDe","OUqFMY1mC0",
+"rz7UtgdQsS","fcwDaDG4sT","tjQxsSmGzv","KZamHZ4I1v","VerEALbRTH","xReecVerEA","Y1mC0a00b5","e6e4zru4UG","14FLR8FmFH","5drc6HzZT8",
+"lXFOBuQIcz","zFgtBoQ87r","G1RhSAXpwE","v8yFNzQt6Q","9iGoT8hJdt","NcICACdyBV","Ss0Zuh1zcH","ix74rBGaQY","pWiOsJKWYR","FcWrW55rfB",
+"s4786CdyBV","C2IrcaL6AJ","jzUqRpAhR1","Yf2EcDz1R3","KsjRKk85Ae","tlILtOz8yZ","uJScX8U2nU","2TRI7FVMxo","G1RhSbrhlQ","ZUnqtMaJQs",
+"5NammVNCPd","5Drn0jiVBP","AOgEe6q6L9","9rlg97X3uy","fcJOyU3yw5","lkMUAix74r","QClRLTwano","uPX7GyluBx","2hEEUFcWrW","0MR5XjfREu",
+"pT8wuaL6AJ","FLsph7lUXZ","m4bxU7fsYM","ZuDtDSjskQ","RpBQmuAWyp","o8UydEdBKc","CIShGQssNC","In3NSCqqaD","BbwgAI7p2a","55rfBNcICA",
+"FnPFBFFDui","lViBvWDVWJ","AIYUuECMvU","J2mQizmLYD","7hyVvBpYhV","cQOnvtaOXK","iB08lM3zXL","NhXdupmeCd","FLsphm4bxU","W7cTsCNHmv",
+"DQimptaOXK","hi5X7fcwDa","ru4UGBGaQY","fmIK1NAFuw","lViBvQChxs","wiHrZRxrsm","l83Ud9eoRc","k85AeVBjhz","lH1ktTa8f6","VNCPdlCMxy",
+"uTacxReKEW","taOXKkB5nP","AkKTkguMb8","07n1cM6qcG","No0QbLDk6f","16lHcv2eC3","LbRTHs4786","nlaByNo0Qb","AIYUu9eoRc","8U2nUW3VFH",
+"LbRTHuLtKs","AgJHQ7lUXZ","n1pmOoGu6x","zbIYY5Namm","1LB1LDQimp","pFrrlhUTw7","14FLRhSSvQ","IBe8k1j5L8","6q6L9gjUTu","uPX7GjzUqR",
+"55rfBydG8U","soy9t2ZHdk","xciqpzQt6Q","0KyfsRpBQm","hSSvQUmaEv","5Namm0PktI","xXTI4UlU3M","GXdoHvLsmS","6AFT0VLTy6","IRh482DREs",
+"jtn0XjzUqR","7fKYU7fKYU","fcJOylViBv","gIYvEfqypy","TCgPpDLhzM","dQ586POUYS","ciuWzpiJSk","FGzgpYjB9t","FnPFBhYBCK","IRh48Dz1R3",
+"SjskQBCxeC","MmKGJ2ZHdk","iKqhrfLNg8","e6e4z618Di","OHaBzaez9y","kZANmAmdQd","soy9tksJby","jS1ajgIYvE","sqVrfAkKTk","aFFssVNCPd",
+"Gv3FqprNT6","yvOMI1LB1L","5IhmGZhwG1","8U2nUhe9IA","DcpWBJkzUn","Ss0ZuRmDcr","Dz1R3MK07Y","IKxdLjiVBP","brhlQ4W0Tl","J2mQiVjCZq",
+"lH1kt2DREs","aFFssazIWp","In3NSP6bcg","Q6hMCAgJHQ","QYxC0Cfgr3","0PktITCgPp","RkQke2ZHdk","pvgjSuoStw","5ZaEzguMb8","rz7UtVIlwP",
+"QClRL2TRI7","qQxHPL7cGc","lsQGo24ARF","fmIK1QClRL","Yw2oU5Mg9r","iwzGk9y4lw","3otm6brhlQ","0MR5XiB08l","piJSkMkgy8","aez9ylViBv",
+"HzZT8SmGzv","G1RhSWPmlx","Ss0ZuBCxeC","lXFOBmX2GE","14FLRVprf2","v8yFNmX2GE","Ul4a1pvgjS","taOXKpWiOs","5iGN5FVMxo","jiVBPVjCZq",
+"4dEz6ECMvU","VBjhzTCgPp","uJScXRpBQm","nlaByIKxdL","580YDuN6r3","7ku1pgIYvE","RxrsmQnJ1S","cL0aEIBe8k","GrDg72ZHdk","0MR5XP6bcg",
+"POUYSXflUq","XyPZNuJScX","t59lRZzJHW","uAWypM6qcG","FcWrWO3iyQ","aFFssni2v1","n1pmO8hJdt","D6rByNhXdu","nlaByWmadA","fqypyru4UG",
+"1LB1L580YD","AOgEe45cIH","MmKGJ1j5L8","Y1mC0BFkb8","OUqFM618Di","Z4I1v0PktI","kB5nPXyPZN","yofH3aL6AJ","sqVrfyToGW","7fKYUyEfy9",
+"MojnP5Namm","DQimp9XyT9","b29RJ5Namm","qaofNtuDyS","b29RJKr8ys","jeskScQOnv","rhl0JSs0Zu","Oz8yZPOUYS","8hJdtGrDg7","Zv7z0Gv3Fq",
+"EOE1ogdQsS","s4786mz8gx","CdyBVydG8U","7fsYMEOE1o","K20wKlCMxy","0PktIzY1GY","KASQ8fcJOy","FPfSEPb1pa","Cfgr3OxWIH","Mm8si4dEz6",
+"8FmFHru4UG","lViBvSbRYy","P6bcgfqypy","hE1Ql0PktI","0ao3lblLA9","TCgPpUl4a1","k85Aezz4ZU","a00b5tl72W","o8UydS2Dfu","7X3uyHlUbF",
+"CIShGgf8rI","HRxd8ECMvU","s7Mxkdjsrv","M3zXLs93Ml","dhSuHNxx9V","4QMc92TRI7","hYBCKulk41","5Namml83Ud","suY4x45cIH","jfREuY1mC0",
+"yEfy97fsYM","9eoRcFGzgp","zz4ZUMojnP","Nxx9VbgJAz","d7vjMJKWYR","1LB1LgdQsS","U3yw5AgJHQ","mX2GEK20wK","OUqFMlsQGo","DLhzMS2Dfu",
+"yluBxWDVWJ","QChxsMaJQs","dQ586D6rBy","faHirbZLvS","oGu6xtvdkD","wDajX5Mg9r","a00b5Chuy3","BFkb824ARF","jeskSHfyNQ","U3yw5Z4I1v",
+"JJs5mPb1pa","5iGN5Kr8ys","BFkb8s7Mxk","QYxC0YjB9t","0PktIciuWz","MmsIoRxrsm","Yh1hFlH1kt","OHaBzFVMxo","16lHc0h1b1","tAOsrjSjS3",
+"HfyNQzz4ZU","WaWsvxXTI4","wDajXThjNn","Fhtgl0ao3l","AkKTkFxX9q","AOgEeIjTwP","lViBvazIWp","RACujjeskS","GSQwjCNHmv","rhl0JS2Dfu",
+"FGzgpOxWIH","s4786S77LH","xReecQworu","hSSvQix74r","SWfoupAhR1","jeskS9iGoT","Ul4a1CqqaD","YjB9tt98iW","cQOnvSWfou","55rfBNOHsz",
+"cQOnvJRJQB","uAWypW7cTs","Oz8yZNcICA","jzUqRksJby","pAhR1zFgtB","9eoRcUlU3M","No0QbK4GS8","bZLvSix74r","dmoS7Twano","uvf7AGSQwj",
+"KsjRKRmDcr","kB5nP24ARF","x3LDe5iGN5","7Ow5CnFqik","JJs5mNOHsz","IKxdLZJTXH","K4GS8fcJOy","QbxXcfLNg8","he9IAGrDg7","prNT67ku1p",
+"4W0TlzmLYD","IKxdL2hEEU","F6PT2gtCA5","ZzJHWd7vjM","ReKEWsuY4x","2hEEUt59lR","uQIczi3pyd","qaofNtvdkD","zY1GYlsQGo","pvgjSuvf7A",
+"0h1b18cVD3","O3iyQuZPqg","LbRTHdjsrv","0Kyfsix74r","y94nwUvlv4","xReecguMb8","SbRYyjiVBP","zHF1q2DREs","cmXIXOz8yZ","jS1ajAOgEe",
+"M3zXLazIWp","P6bcgJJs5m","WDVWJpT8wu","PYBf4HzZT8","Q6LixDcpWB","Pb1paNxx9V","zz4ZUm4bxU","GrDg7MGlTF","tlILtuvf7A","RkQkeFjHXR",
+"vkCHHEOE1o","Zv7z0jiVBP","ReKEW5nmWv","QWxoTpFrrl","x3LDepv0i7","ru4UGJKWYR","fcJOyDcpWB","FPfSEGXdoH","UlU3Mt59lR","cmXIXZzJHW",
+"uQIczgIYvE","MmKGJjiVBP","GrDg7yvOMI","KASQ8aez9y","WaWsvzQt6Q","Dz1R3GWqqX","wiHrZFVMxo","MK07YWaWsv","JJs5mAXpwE","Cfgr35iGN5",
+"uupzkCfgr3","BGaQYb29RJ","ZUnqtMmsIo","W3VFHaL6AJ","fmIK18cVD3","VBjhzQnJ1S","C2IrcHfyNQ","M3zXLd7vjM","tAOsrQbxXc","JKWYRNOHsz",
+"fqypy0Kyfs","nlaBy2DREs","5ZaEzv8yFN","cmXIXokgRi","VLTy62hEEU","HfyNQJIqXi","n1pmOdmoS7","QnJ1SNcICA","K20wKy94nw","MojnPjS1aj",
+"7X3uyjzUqR","S2Dfupv0i7","0PktIUlU3M","7X3uyh1zcH","IKxdL2Yz7E","n1pmOtjQxs","NhXduprNT6","RkQke7X3uy","d85a9In3NS","M6qcGFxX9q",
+"LbRTHMojnP","BbwgAzFgtB","8U2nUatef2","ciuWz8xEKz","7fsYMjS1aj","TXQ0ZOz8yZ","Pb1pa8RCUA","9rlg97ku1p","rhl0JblLA9","l83UdAOgEe",
+"K4GS8dpe1v","CK5W7qaofN","07n1cJIqXi","5drc6ix74r","ix74rF6PT2","HfyNQpvgjS","t98iWWmadA","MK07YqQxHP","RzaZARkQke","Zv7z0uJScX",
+"pAhR1v2eC3","8hJdtl83Ud","YjB9tMkgy8","sx5GlJKWYR","HRxd8pv0i7","fmIK1U3yw5","jfREuFPfSE","QYxC01LB1L","4QMc9iKqhr","hE1QltaOXK",
+"vLsmSHlUbF","mX2GEbZLvS","yToGWuZPqg","55rfB64s8N","6q6L98hJdt","Fhtglhi5X7","lH1kttuDyS","VBjhzDz1R3","VLTy6SWfou","gjUTuWmadA",
+"9eoRcOHaBz","yvOMIRmDcr","D6rByHfyNQ","ksJbyFcWrW","0ao3l8TxD7","8U2nUsoy9t","5drc6ni2v1","zFgtBo8Uyd","tAOsr8TxD7","d85a9i7WMQ",
+"GXdoHMmsIo","8TxD78RCUA","BFkb8dhSuH","W7cTsGXdoH","brhlQCp3mZ","FxX9qk85Ae","TwanoZhwG1","ix74rNAFuw","U3yw5kZANm","okgRi1LB1L",
+"dQ586JIqXi","jeskSIKxdL","lpF6WW7cTs","gjUTuGWqqX","Oz8yZHfyNQ","lsQGoBbwgA","zQt6QIn3NS","ZuDtDtl72W","IjTwPwiHrZ","EOE1ovLsmS",
+"K20wKLDk6f","07n1cy94nw","jfREuFnPFB","gtCA5VBjhz","HRxd8SWfou","hYBCKv2eC3","cL0aEOHaBz","IjTwPRsQUq","lH1ktSWfou","n1pmOMkgy8",
+"QYxC0sqVrf","ECMvUQ6Lix","azIWpQworu","nFqikTwano","h1zcHcL0aE","Q6hMCWaim6","ix74rZ4I1v","kZANmIBe8k","BFkb83weIF","pmeCdYjB9t",
+"FcWrWQWxoT","pv0i7pmeCd","5nmWvQYxC0","O3iyQ1v5hH","7hyVva00b5","Yh1hFdpe1v","2Yz7EW3VFH","9GXkXCdyBV","C2IrcQnJ1S","uPX7GZ4I1v",
+"HRxd8XyPZN","yofH32Nslm","NhXduJRJQB","RpBQmxReec","5Mg9rzFgtB","9iGoTJRJQB","07n1cfcwDa","QworuFxX9q","B3qemk85Ae","5iGN5HRxd8",
+"m4bxUFjHXR","DG4sT5nmWv","t98iWFxX9q","wiHrZatef2","ZJTXHJRJQB","G1RhSl83Ud","8hJdtAOgEe","Cfgr329QAz","07n1cCp3mZ","hUTw7n8pJ9",
+"oGu6xfmIK1","pmeCdIKxdL","qQxHPsoy9t","SbRYy5nmWv","OUqFM3weIF","SjskQoQ87r","4dEz6XyPZN","VIlwPQChxs","8U2nUW7cTs","J2mQijzUqR",
+"rKDLJRACuj","VNCPdCK5W7","uPX7GBCxeC","5NammFLsph","QYxC0n1pmO","HRxd8AIYUu","QYxC029QAz","aDGtSiKqhr","lj07Qi7WMQ","C2IrcCfgr3",
+"jzUqRC2Irc","s93MlbZLvS","fFDrJAIYUu","7X3uyFFDui","d85a9FNYIM","oQ87rDG4sT","7hyVvyEfy9","FxX9qnnP8o","vkCHH8U2nU","FNYIMECMvU",
+"ZUnqtZuDtD","QnJ1S2DREs","m4bxUuvf7A","8hJdtSs0Zu","VLTy6PYBf4","t59lREoToP","atef2cL0aE","Dz1R3dQ586","lViBvjzUqR","Mm8siGXdoH",
+"ksJbyQ6hMC","sx5GlcShY2","ni2v18TxD7","s93Mlv2eC3","ReKEWlm0pD","NhXduBbwgA","lj07QwiHrZ","cL0aEZv7z0","MmsIo2DREs","rKDLJlj07Q",
+"rhl0JAIYUu","FhtglFLsph","guMb8RsQUq","Ss0ZuaFFss","NOHszCK5W7","NcICAGSQwj","b29RJCxVEf","ZJTXHGWqqX","FPfSEaez9y","v8yFNWreyP",
+"Pb1paKZamH","FLsphhYBCK","rKDLJuAWyp","BpYhViKqhr","5VZjSsuY4x","VLTy6F6PT2","KZamHuvf7A","prNT6CIShG","v2eC3dmoS7","9y4lwNhXdu",
+"5Mg9rjtn0X","AXpwEprNT6","uupzkQClRL","cmXIXk85Ae","zFgtBUl4a1","ru4UGwiHrZ","S77LHWmadA","OxWIHWaWsv","yToGWpT8wu","OUqFMVLTy6",
+"jfREuyluBx","taOXKfqypy","tjQxsFcWrW","FGzgpWmadA","qUJMd64s8N","NOHszThjNn","rz7UtZzJHW","2hEEUuvf7A","7lUXZ7hyVv","v2eC3GrDg7",
+"FGzgpksJby","hE1Ql5Mg9r","mX2GEP6bcg","BCxeCydG8U","ix74rGrDg7","9eoRc9GXkX","Z4I1vIKxdL","UlU3MSjskQ","k85Aeuupzk","0PktIgdQsS",
+"FPfSEhSSvQ","gjUTulpF6W","GXdoHuupzk","WreyPazIWp","y94nw48cHL","D6rByAgJHQ","bZLvSHRxd8","hSSvQni2v1","NOHszHzZT8","AkKTkBCxeC",
+"2DREsPb1pa","6q6L964s8N","IKxdL7X3uy","lH1ktn8pJ9","lXFOBTa8f6","ciuWzyEfy9","5IhmGMezSW","FPfSEJkzUn","CIShGjSjS3","BbwgAyvOMI",
+"zY1GYh1zcH","qaofNFPfSE","iKqhrgf8rI","lH1kt7Ow5C","taOXKSmGzv","O3iyQCfgr3","Y1mC09iGoT","MmsIopv0i7","gf8rIRACuj","aez9y2DREs",
+"jeskSGSQwj","F6PT2RkQke","azIWpW3VFH","nFqikYf2Ec","FFDui8hJdt","ReKEWQnJ1S","YjB9t9eoRc","5ZaEzVLTy6","AkKTkHlUbF","oQ87rzmLYD",
+"FVMxoReKEW","BFkb8dpe1v","8FmFH14FLR","WPmlxpiJSk","618DiJJs5m","WPmlxZ4I1v","v8yFNZJTXH","dhSuHMkgy8","Cp3mZa00b5","BbwgApvgjS",
+"8cVD3MaJQs","mX2GEW3VFH","DLhzMuQIcz","s93MlTXQ0Z","o8UydcShY2","W3VFHD6rBy","RzaZAlkMUA","pT8wuMkgy8","AIYUuF6PT2","IjTwPd7vjM",
+"4W0TlFPfSE","JJs5mDQimp","Zv7z0wDajX","UlU3MJ2mQi","taOXKChuy3","tvdkDd7vjM","RkQkeB3qem","ix74rl83Ud","RkQkeJIqXi","ZJTXHUvlv4",
+"JRJQBCp3mZ","CxVEf1j5L8","jSjS3jS1aj","GWqqX1j5L8","Q6LixWMiS3","d7vjMIKxdL","mz8gxDLhzM","i7WMQS2Dfu","FhtgllpF6W","7hyVvfcwDa",
+"VIlwPAgJHQ","BbwgAazIWp","s7MxkCIShG","jzUqRF6PT2","64s8NMm8si","uvf7AcQOnv","IRh48AkKTk","LewvM5nmWv","tuDySyToGW","HfyNQuAWyp",
+"Cp3mZtAOsr","jSjS3hE1Ql","RkQke0YAGH","dpe1vuN6r3","lsQGohUTw7","Q6LixuN6r3","v1HlnFnPFB","UmaEvlsQGo","8xEKzpFrrl","PYBf47fKYU",
+"64s8NlViBv","K20wKAmdQd","BpYhVI7p2a","dmoS77fsYM","SbRYy0Kyfs","JIqXiru4UG","MaJQsGXdoH","dhSuHqQxHP","I7p2aQ6hMC","uAWypCfgr3",
+"IBe8krz7Ut","5nmWvGSQwj","x3LDeYh1hF","ksJbyQWxoT","FGzgpYw2oU","Uvlv49rlg9","cShY2CqqaD","5iGN5Mkgy8","CNHmvMm8si","jzUqR3weIF",
+"JKWYRvkCHH","dhSuHuLtKs","RmDcrCNHmv","oVQp6AmdQd","FFDuiTCgPp","Chuy3U3yw5","AkKTkWaim6","gIYvEzY1GY","BGaQYv8yFN","1LB1Lsoy9t",
+"uvf7AAkKTk","K20wKlXFOB","fqypyn8pJ9","JRJQBMmsIo","ulk41hUTw7","jS1ajuTacx","5Drn0Mkgy8","1v5hHIjTwP","6q6L9X6Pin","iqv4kQWxoT",
+"prNT68U2nU","faHirfFDrJ","dhSuHHfyNQ","5IhmGLewvM","GSQwjNo0Qb","X6PinfaHir","XyPZNs4786","iwzGkJJs5m","CqqaDEdBKc","NAFuwdhSuH",
+"W3VFHVjCZq","D6rByCNHmv","cL0aEkB5nP","IBe8ktlILt","2Yz7EF6PT2","euZA5FFDui","MaJQstaOXK","MGlTFVprf2","zY1GY2Yz7E","IRh48d7vjM",
+"iKqhrdjsrv","FwEJzv8yFN","b29RJrKDLJ","uTacxAmdQd","XyPZNOUYuF","DLhzML7cGc","uupzkqUJMd","FwEJzS2Dfu","mX2GEqUJMd","FLsphxXTI4",
+"jzUqRfmIK1","Z4I1vaL6AJ","WMiS3WaWsv","DcpWBuupzk","uTacxFVMxo","POUYS8xEKz","AmdQd07n1c","HzZT8K4GS8","Q6hMCrKDLJ","5iGN5a00b5",
+"MaJQswDajX","W7cTstvdkD","5Mg9rIBe8k","uoStwlm0pD","fLNg8lm0pD","ydG8UaL6AJ","sx5GlvOqCE","zmLYD8TxD7","lH1ktatef2","oQ87razIWp",
+"b29RJFFDui","QssNCQYxC0","xXTI4OHaBz","16lHchE1Ql","TXQ0ZGWqqX","jeskSYh1hF","ksJbyhe9IA","64s8NhE1Ql","Kr8ysb29RJ","uupzkECMvU",
+"Q6hMCZv7z0","gjUTupT8wu","d7vjMFnPFB","Oz8yZCK5W7","2DREs4QMc9","Yh1hFAXpwE","RkQkeyluBx","gf8rIm4bxU","LDk6f7fsYM","QYxC08xEKz",
+"Y1mC0aDGtS","IjTwPdQ586","jzUqRDLhzM","VBjhz45cIH","AXpwECNHmv","Twano4dEz6","SWfoul83Ud","QbxXcECMvU","9XyT9gjUTu","5VZjSzY1GY",
+"QClRLhi5X7","AgJHQa00b5","BpYhVtAOsr","prNT6n1pmO","x3LDeulk41","VNCPdXyPZN","VBjhzReKEW","StlDJStlDJ","MezSWZJTXH","5NammOUYuF",
+"Ul4a10Kyfs","Nxx9VwDajX","uvf7Arz7Ut","JRJQBgf8rI","bgJAzCfgr3","618DiBGaQY","zHF1qXyPZN","lsQGorz7Ut","FVMxolCMxy","0PktIb29RJ",
+"jfREubgJAz","1j5L8GXdoH","zmLYDBFkb8","d7vjM16lHc","C2IrcmX2GE","sqVrfTa8f6","16lHc5ZaEz","Y1mC0vLsmS","zqH0WY1mC0","B3qemGSQwj",
+"TwanolXFOB","uAWypvOqCE","ydG8UuZPqg","WmadA8FmFH","7Ow5Clm0pD","5IhmGaez9y","CNHmv9iGoT","yluBxeuZA5","euZA5sx5Gl","C2IrcZJTXH",
+"blLA9TCgPp","ciuWzPOUYS","qQxHPRACuj","No0QbWreyP","0PktIKsjRK","QWxoTFhtgl","NAFuwW7cTs","iKqhrpiJSk","AgJHQzHF1q","taOXKMmKGJ",
+"pAhR1QYxC0","POUYS9GXkX","C2IrcRmDcr","MezSWuLtKs","MojnPJIqXi","e6e4zVerEA","n1pmOh1zcH","Waim6hUTw7","ThjNnFwEJz","X6PinhSSvQ",
+"yEfy9CK5W7","IjTwPIKxdL","Zv7z0OUYuF","FjHXRkB5nP","KASQ8lH1kt","fmIK1RzaZA","StlDJBpYhV","lweGyyofH3","5drc6uQIcz","RxrsmsuY4x",
+"xXTI45Namm","nlaBy7Ow5C","FnPFBUl4a1","BFkb8zY1GY","2TRI7MezSW","RACuji3pyd","n1pmOYw2oU","KASQ8tl72W","qaofN7fKYU","uQIczt59lR",
+"9rlg95drc6","GrDg7vLsmS","mX2GE3otm6","BFkb8ix74r","oVQp6VBjhz","P6bcgP6bcg","Yf2Ec4QMc9","OUYuFzbIYY","S2DfuC2Irc","pAhR1GXdoH",
+"rhl0JyluBx","Mkgy82TRI7","s93Mls7Mxk","MK07Y9eoRc","ni2v1AmdQd","iB08lgjUTu","RzaZAoQ87r","D6rByB3qem","ydG8U0MR5X","jfREuhSSvQ",
+"RBhp0v1Hln","BbwgAjS1aj","h1zcHOxWIH","uAWypWaWsv","FNYIMn8pJ9","GWqqXs93Ml","1LB1LzHF1q","9XyT94W0Tl","fmIK1vkCHH","SjskQVerEA",
+"fcwDaQClRL","DLhzMnnP8o","lCMxyPb1pa","6q6L9L7cGc","aez9yjS1aj","16lHcjtn0X","8hJdte6e4z","SmGzvuLtKs","m4bxUZJTXH","s7MxkYOfrY",
+"uTacxXflUq","K20wKSmGzv","O3iyQMmKGJ","0Wr5yMmsIo","VIlwPYjB9t","suY4xulk41","FjHXRAmdQd","yluBxFVMxo","HlUbFDcpWB","GSQwj4W0Tl",
+"uZPqgyEfy9","uvf7AfFDrJ","14FLRM6qcG","FcWrWx3LDe","CK5W729QAz","Mm8siQ6hMC","Oz8yZ4dEz6","lkMUAAXpwE","9XyT9Cp3mZ","5VZjSNOHsz",
+"gdQsSbZLvS","No0Qb7lUXZ","brhlQciuWz","Yf2EcdmoS7","taOXK48cHL","M6qcGtAOsr","ydG8UdQ586","F6PT2Twano","gdQsSzFgtB","bZLvSCIShG",
+"FxX9qS77LH","okgRitl72W","EdBKcMmKGJ","Q6hMCi7WMQ","XyPZNAkKTk","POUYSQbxXc","5nmWvi7WMQ","4W0TlqaofN","IKxdLRACuj","LDk6fLewvM",
+"S2Dfudpe1v","iqv4kVNCPd","6AFT0HRxd8","fLNg8ciuWz","gdQsShE1Ql","KZamHGv3Fq","7Ow5CG1RhS","618DiokgRi","YjB9tHP433","FjHXRoQ87r",
+"0BmCy07n1c","ThjNnfcJOy","KASQ8hYBCK","Ss0ZuJRJQB","oGu6x7lUXZ","QworuChuy3","X6PinTwano","BFkb8MojnP","pT8wudmoS7","O3iyQIjTwP",
+"qQxHPPb1pa","CqqaDWPmlx","AgJHQ7Ow5C","h1zcH7ku1p","618DicmXIX","lweGy8FmFH","ZzJHWzqH0W","lj07QDcpWB","guMb8Vprf2","BCxeC1v5hH",
+"v8yFNtlILt","jfREuru4UG","Mkgy8ZzJHW","lViBvblLA9","F6PT2dmoS7","No0QbAkKTk","5VZjSuoStw","Chuy3EdBKc","hSSvQlkMUA","i3pydCqqaD",
+"zz4ZUlCMxy","lViBvGSQwj","uLtKs2Nslm","6AFT0BGaQY","gjUTuRpBQm","fcwDaDQimp","lsQGoAmdQd","iKqhrx3LDe","hE1Ql0h1b1","qaofNulk41",
+"MezSWG1RhS","s7MxkQworu","vkCHHi3pyd","wiHrZQChxs","jeskS0BmCy","aDGtS9iGoT","P6bcgcShY2","qQxHPy94nw","pmeCdyToGW","SWfoueuZA5",
+"BCxeCOHaBz","qQxHPcmXIX","CK5W7GrDg7","7lUXZAOgEe","WaWsvaFFss","ix74rZJTXH","TCgPpy94nw","fFDrJK4GS8","4W0TlDG4sT","hE1QlfLNg8",
+"RkQkewDajX","okgRiyvOMI","CK5W72Yz7E","2NslmjiVBP","uAWyptvdkD","PYBf4S2Dfu","Ta8f6pWiOs","Twano0YAGH","Yh1hFFFDui","29QAzStlDJ",
+"8RCUAFwEJz","gjUTuHzZT8","RzaZAsoy9t","5VZjSCxVEf","cQOnv7fKYU","DcpWB8cVD3","blLA916lHc","C2IrcNcICA","YjB9tBFkb8","lpF6WfmIK1",
+"x3LDezqH0W","F6PT2zmLYD","hSSvQfqypy","14FLRWPmlx","tuDySWMiS3","9XyT96AFT0","AOgEeOUYuF","4W0TlSmGzv","MezSWhYBCK","o8UydKr8ys",
+"QClRL7fKYU","MojnPOxWIH","vkCHHZuDtD","s7Mxki7WMQ","AXpwETXQ0Z","fmIK1xciqp","5IhmGs4786","45cIHqaofN","5ZaEzBGaQY","45cIH5ZaEz",
+"l83UdyToGW","Ul4a1W7cTs","580YDJ2mQi","Yf2Ecix74r","0KyfsUl4a1","OHaBzDz1R3","ogLgclCMxy","VNCPd0Kyfs","JKWYRMK07Y","IBe8kIRh48",
+"Yh1hFY1mC0","2TRI7dQ586","KsjRKZv7z0","oQ87rQClRL","8cVD3uQIcz","jtn0X45cIH","5nmWvlweGy","S2DfuYh1hF","EOE1oZ4I1v","zQt6QBFkb8",
+"WmadAFcWrW","m4bxU0Kyfs","zqH0W9GXkX","zFgtB0h1b1","iqv4kIn3NS","1LB1L9rlg9","jSjS3MojnP","QWxoTBCxeC","14FLR0Kyfs","wDajX5drc6",
+"HfyNQru4UG","cShY20MR5X","IRh48pT8wu","atef2Q6Lix","n1pmOO3iyQ","gtCA5FLsph","x3LDelpF6W","jS1ajKZamH","hSSvQFPfSE","P6bcgHP433",
+"k85Ae5Drn0","pAhR1brhlQ","pWiOslweGy","14FLRfaHir","EoToPaFFss","IRh48dpe1v","GXdoH0Wr5y","G1RhSy94nw","NOHszDcpWB","7fKYU8hJdt",
+"8FmFHfmIK1","0ao3llj07Q","07n1cfaHir","qaofNsuY4x","FLsph0MR5X","prNT6djsrv","WreyP2ZHdk","FPfSERsQUq","cL0aE45cIH","kB5nPF6PT2",
+"HP433WreyP","SbRYyZhwG1","fFDrJa00b5","GXdoHd85a9","ECMvUpWiOs","9iGoTCqqaD","RBhp0C2Irc","aFFssK4GS8","tlILtRzaZA","3otm6FLsph",
+"ZUnqtpiJSk","NOHszCNHmv","VjCZqbZLvS","zqH0WMmsIo","SbRYy0YAGH","AXpwEW7cTs","29QAzsqVrf","9GXkXuupzk","n1pmOSmGzv","ciuWzdhSuH",
+"yEfy9W3VFH","tAOsrVjCZq","S2DfuogLgc","uoStwcL0aE","3otm6WMiS3","2Nslm0MR5X","7Ow5CfmIK1","t98iWHP433","UmaEvOHaBz","16lHcWMiS3",
+"jS1aj5nmWv","xciqpdQ586","NOHszcL0aE","8cVD3I7p2a","uPX7GgjUTu","9eoRcG1RhS","7X3uyfcJOy","n8pJ9v8yFN","taOXKxciqp","rKDLJZUnqt",
+"0YAGHpiJSk","VLTy6FnPFB","1LB1Ls7Mxk","e6e4zjSjS3","VjCZqBbwgA","SWfouuupzk","GSQwjZJTXH","1j5L8DcpWB","guMb8gtCA5","SmGzvG1RhS",
+"VIlwPyvOMI","prNT6RkQke","PYBf47lUXZ","SjskQprNT6","cmXIXJkzUn","yToGW4dEz6","uZPqgZzJHW","FLsphkZANm","s4786oGu6x","580YDxciqp",
+"ni2v1JIqXi","580YDzFgtB","CK5W7ZhwG1","ix74rAXpwE","suY4xzz4ZU","lj07QJ2mQi","x3LDeyluBx","Zv7z0djsrv","2Yz7E7fsYM","gf8rIUl4a1",
+"Twano2hEEU","StlDJtl72W","9y4lwFcWrW","TwanooQ87r","FGzgpJRJQB","HzZT8hE1Ql","OxWIHRsQUq","uJScX6q6L9","QbxXc5Mg9r","brhlQ2ZHdk",
+"8U2nUnlaBy","Yf2EcUmaEv","kZANmW7cTs","OUYuFQWxoT","QssNCFcWrW","b29RJmz8gx","JkzUnlj07Q","0PktIJIqXi","F6PT2piJSk","5drc616lHc",
+"oQ87rsx5Gl","IBe8kLDk6f","taOXKjeskS","StlDJMezSW","Cp3mZWaim6","5iGN5cQOnv","IKxdLblLA9","aFFssyluBx","RACujyofH3","SbRYyAIYUu",
+"7ku1pcQOnv","RkQke4QMc9","8TxD7uupzk","7fsYM4W0Tl","lkMUAGrDg7","QClRLDcpWB","FGzgpTCgPp","yEfy9EOE1o","Uvlv4Waim6","CdyBVNOHsz",
+"45cIH8xEKz","uQIczfmIK1","JIqXiFNYIM","KsjRKNxx9V","DLhzMDLhzM","1v5hHKASQ8","0PktIlsQGo","LDk6fiwzGk","D6rByhE1Ql","MK07YjSjS3",
+"OUqFMuZPqg","K4GS8AkKTk","s7MxkpFrrl","RpBQmdpe1v","lweGyYOfrY","VLTy6euZA5","JXljWhe9IA","0PktIprNT6","uJScXUl4a1","blLA9mX2GE",
+"RBhp0IBe8k","aL6AJyluBx","FxX9qRACuj","wiHrZzqH0W","NhXduGSQwj","FnPFBoGu6x","pFrrlW7cTs","NAFuwfcJOy","zbIYYGv3Fq","Cp3mZzmLYD",
+"qUJMdpT8wu","tuDySyvOMI","pT8wuhSSvQ","aDGtSrKDLJ","B3qem2Nslm","UmaEvZzJHW","I7p2aGv3Fq","jeskSnlaBy","2TRI7DLhzM","atef2jSjS3",
+"t59lRVIlwP","7lUXZpT8wu","okgRi5drc6","VNCPddQ586","F6PT2lj07Q","G1RhSs93Ml","jfREupv0i7","y94nwPOUYS","AOgEenlaBy","2hEEUMK07Y",
+"UlU3M1LB1L","dQ586vkCHH","Cfgr39rlg9","BFkb8t59lR","zY1GYn1pmO","v1HlnVBjhz","TXQ0ZlCMxy","0YAGHFxX9q","QnJ1SJRJQB","7lUXZHfyNQ",
+"Yh1hFvkCHH","bgJAzWaim6","i3pyddpe1v","uupzkJKWYR","hE1QlzbIYY","piJSkNhXdu","0ao3lkZANm","Yw2oUFGzgp","JKWYR29QAz","bZLvSBpYhV",
+"5IhmGjiVBP","5ZaEzuQIcz","5Mg9rFwEJz","dmoS7KASQ8","Cp3mZ0Wr5y","W3VFH45cIH","AIYUuzFgtB","2TRI7CK5W7","prNT6JkzUn","5ZaEzpvgjS",
+"uLtKshUTw7","Zv7z05Namm","Pb1paTCgPp","FPfSES2Dfu","zmLYDOxWIH","atef2mz8gx","BbwgAVIlwP","guMb8CIShG","FcWrWfFDrJ","tAOsrgdQsS",
+"aez9yTCgPp","azIWps7Mxk","PYBf4lm0pD","gjUTuiKqhr","9eoRcDG4sT","QClRLEdBKc","5Namm3weIF","blLA9ReKEW","ogLgcaL6AJ","gIYvEPOUYS",
+"0BmCy4QMc9","oVQp6VLTy6","uoStwNcICA","gf8rIzHF1q","Q6LixQClRL","S77LH5Namm","cShY2VerEA","lCMxyIKxdL","G1RhSSmGzv","1v5hHFwEJz",
+"b29RJECMvU","UlU3MlXFOB","v2eC3h1zcH","mz8gxpmeCd","QssNCeuZA5","uZPqgYh1hF","ni2v1kB5nP","a00b5pvgjS","Pb1paF6PT2","HlUbFxXTI4",
+"Ss0ZulViBv","ECMvUGv3Fq","HlUbF5Mg9r","fqypyoQ87r","a00b5h1zcH","5ZaEz1v5hH","MaJQsb29RJ","jS1ajlweGy","QYxC0oQ87r","fLNg8Q6hMC",
+"S2DfuvkCHH","jeskSe6e4z","24ARFPYBf4","i7WMQZuDtD","6AFT0VBjhz","Gv3FqokgRi","GrDg7uTacx","FLsphmz8gx","Waim6m4bxU","GXdoHyluBx",
+"OHaBzqaofN","h1zcHYh1hF","jS1ajKsjRK","Oz8yZkZANm","PYBf4NcICA","5IhmGF6PT2","ogLgcjSjS3","9rlg9GWqqX","ix74rMmsIo","RsQUqDcpWB",
+"Mm8siQbxXc","VerEAMK07Y","8hJdti7WMQ","b29RJsuY4x","TXQ0Zdpe1v","QYxC0UmaEv","uZPqgvOqCE","No0QbwDajX","AIYUueuZA5","Y1mC00PktI",
+"7Ow5Ch1zcH","uAWypGrDg7","7X3uyoQ87r","CqqaD5Drn0","XflUqTCgPp","lViBv9iGoT","7ku1p5VZjS","hE1QliwzGk","ECMvUiB08l","Cfgr3zqH0W",
+"RzaZAECMvU","MGlTFmX2GE","VerEAy94nw","Cfgr3IKxdL","2Yz7EJRJQB","gf8rIguMb8","X6PinQ6hMC","KsjRKDG4sT","24ARFfLNg8","FcWrWCNHmv",
+"WDVWJciuWz","bZLvSF6PT2","0KyfsLbRTH","FGzgpLDk6f","pT8wuWaWsv","lweGyWaWsv","3weIFuZPqg","ZhwG1k85Ae","uTacxY1mC0","GrDg7cmXIX",
+"1v5hHrhl0J","3otm6nFqik","okgRiQworu","oVQp6WaWsv","Dz1R3n8pJ9","WmadAd85a9","JIqXiAkKTk","GWqqXMK07Y","7fKYUEdBKc","24ARFMkgy8",
+"aez9yn8pJ9","ru4UGStlDJ","BCxeCy94nw","FxX9qjfREu","dhSuH29QAz","t98iWm4bxU","7lUXZuZPqg","Uvlv4o8Uyd","v1Hln2ZHdk","NAFuwfmIK1",
+"VerEAMezSW","6q6L9NOHsz","d85a9i3pyd","pv0i7AkKTk","wiHrZ6AFT0","48cHLG1RhS","LbRTHKASQ8","07n1cfLNg8","fLNg82hEEU","ru4UGQClRL",
+"CNHmvBbwgA","brhlQ1LB1L","fcJOyDG4sT","7X3uylpF6W","hYBCKW7cTs","tuDySBCxeC","9GXkXgIYvE","zFgtB48cHL","zFgtBprNT6","RACujVerEA",
+"aDGtSzQt6Q","FhtglbgJAz","EdBKclsQGo","n1pmOU3yw5","45cIHTXQ0Z","wDajXdmoS7","n8pJ9uLtKs","l83Udsx5Gl","M6qcGK20wK","zFgtBM6qcG",
+"WmadAJRJQB","yvOMIfqypy","mz8gxhYBCK","mX2GEzHF1q","VNCPdSWfou","9rlg9MezSW","RxrsmpT8wu","tuDyShi5X7","ksJbyPb1pa","5nmWvh1zcH",
+"Mm8siIBe8k","SWfounnP8o","DcpWBOz8yZ","ksJbyFLsph","2DREsydG8U","kB5nPFVMxo","soy9tSs0Zu","i3pyde6e4z","16lHcdpe1v","J2mQiiB08l",
+"LbRTHAmdQd","k85AeAIYUu","VerEAOz8yZ","okgRiJRJQB","lXFOB7ku1p","ECMvUm4bxU","l83UdciuWz","2DREsF6PT2","1v5hH07n1c","xciqpQssNC",
+"oVQp6K4GS8","QClRLiqv4k","Yf2Ec2ZHdk","o8UydGv3Fq","YjB9tIKxdL","cL0aEtvdkD","iqv4kUl4a1","h1zcHNcICA","atef2AgJHQ","lViBvguMb8",
+"S2DfubgJAz","cL0aEI7p2a","aDGtSsqVrf","Gv3Fq7fsYM","he9IAU3yw5","Yw2oUEdBKc","NOHsz0YAGH","ydG8Uzz4ZU","8RCUA48cHL","t98iWTCgPp",
+"Ul4a1M3zXL","RmDcrMojnP","tlILtJ2mQi","tuDySIjTwP","cQOnvlH1kt","uN6r37ku1p","ZzJHWl83Ud","lViBv7ku1p","Q6LixHRxd8","Mkgy8ni2v1",
+"Vprf2t59lR","l83UdWreyP","RxrsmBGaQY","48cHLHfyNQ","iwzGk5Mg9r","rKDLJVjCZq","l83Udv1Hln","mX2GEhE1Ql","faHirUvlv4","EoToPlViBv",
+"GXdoHni2v1","I7p2a5VZjS","v8yFNCdyBV","sx5GlMmsIo","ix74rO3iyQ","sqVrfuupzk","hi5X7OUYuF","s7MxkdmoS7","RsQUqkB5nP","ThjNntlILt",
+"qUJMd4dEz6","lViBvs7Mxk","EoToPn8pJ9","29QAztAOsr","9GXkXBGaQY","zqH0WStlDJ","lCMxyCdyBV","zY1GYQbxXc","tuDySgtCA5","7hyVvciuWz",
+"1j5L8Z4I1v","FGzgpzbIYY","8hJdtNcICA","gtCA5QnJ1S","NcICAAOgEe","dpe1vUmaEv","oQ87rv1Hln","3weIFjfREu","4QMc9jSjS3","StlDJru4UG",
+"LbRTHt59lR","ZuDtDx3LDe","FcWrWzFgtB","QbxXcnnP8o","dhSuHGWqqX","zHF1qi3pyd","lXFOBYOfrY","7hyVvCqqaD","ECMvUni2v1","yToGW8hJdt",
+"CNHmvvLsmS","4W0TlCp3mZ","yToGWKr8ys","azIWpcShY2","QnJ1SydG8U","RkQkeuoStw","uLtKsFPfSE","wDajXEdBKc","64s8NuN6r3","ulk41TCgPp",
+"t98iWFPfSE","CNHmvaL6AJ","v8yFNdpe1v","cShY2m4bxU","Y1mC0bZLvS","jtn0XhYBCK","7hyVvoVQp6","Uvlv4uPX7G","VNCPdFNYIM","Z4I1v9rlg9",
+"UmaEvv2eC3","atef2zQt6Q","RzaZApmeCd","rz7UtGWqqX","K4GS8ECMvU","aFFssPOUYS","zY1GYWaWsv","yluBxpWiOs","9GXkXAkKTk","5VZjSvOqCE",
+"X6PinQChxs","X6PinF6PT2","FLsphM3zXL","s7Mxk9y4lw","ksJby8xEKz","tvdkD7hyVv","prNT6WMiS3","qUJMdAmdQd","uPX7Gi7WMQ","uTacxfcJOy",
+"x3LDefmIK1","fmIK12ZHdk","IjTwPPYBf4","ogLgcQ6hMC","Waim6K4GS8","TwanotuDyS","tuDySgdQsS","7hyVvdQ586","In3NSRACuj","MezSWI7p2a",
+"gtCA514FLR","580YDP6bcg","gdQsSmX2GE","8RCUA618Di","In3NSvOqCE","0KyfspmeCd","KASQ8wiHrZ","7lUXZqUJMd","580YDVprf2","tlILtAgJHQ",
+"oQ87rprNT6","14FLRMkgy8","POUYSI7p2a","HfyNQh1zcH","JXljWVNCPd","CqqaD2Nslm","ZzJHWuupzk","iB08lB3qem","ru4UGVLTy6","K4GS8OHaBz",
+"9XyT9HRxd8","dpe1vfcJOy","yEfy9s93Ml","CxVEfQWxoT","MmsIoHlUbF","M3zXLCp3mZ","gf8rIRBhp0","iKqhro8Uyd","n8pJ9v2eC3","ZJTXHni2v1",
+"pvgjSaez9y","Q6hMCBpYhV","XflUqLDk6f","aez9yVjCZq","3weIFydG8U","QssNCW3VFH","0PktIHzZT8","AmdQd0BmCy","nFqik9eoRc","2Yz7EHzZT8",
+"RmDcrlweGy","0MR5XprNT6","Twano6q6L9","FLsph5Drn0","FxX9qaL6AJ","7Ow5CXflUq","fcwDaOxWIH","qaofNZv7z0","aez9yhSSvQ","WreyP9rlg9",
+"FnPFBNhXdu","iB08l2DREs","AOgEeC2Irc","ThjNnJRJQB","FLsphzFgtB","fqypym4bxU","v8yFNbrhlQ","DG4sTulk41","8U2nUpAhR1","wDajXY1mC0",
+"tAOsrMmKGJ","oGu6xGXdoH","a00b5LbRTH","lCMxyNAFuw","GXdoH580YD","NhXduJ2mQi","ZzJHWkZANm","gf8rIjSjS3","C2IrcDLhzM","WmadAulk41",
+"mz8gxOUYuF","CNHmv16lHc","Yw2oUbgJAz","guMb8hUTw7","16lHcgtCA5","b29RJjfREu","mz8gxUmaEv","lweGyStlDJ","cL0aEiB08l","KZamH0BmCy",
+"07n1cL7cGc","QssNCHRxd8","9eoRcNOHsz","xXTI4AXpwE","xXTI4IjTwP","rKDLJ1j5L8","2hEEU8U2nU","hSSvQrhl0J","xXTI4IKxdL","SbRYyFPfSE",
+"UlU3MJJs5m","iKqhr7fsYM","RsQUqRmDcr","FcWrWpiJSk","48cHLfcJOy","16lHcpWiOs","Z4I1vpWiOs","QWxoTFcWrW","9y4lws4786","v1HlnnlaBy",
+"hYBCKi7WMQ","ksJbyCxVEf","ydG8UFnPFB","rKDLJv8yFN","GXdoHXyPZN","lkMUA0h1b1","FNYIMX6Pin","FwEJzWreyP","o8Uyd7Ow5C","atef2gf8rI",
+"x3LDeG1RhS","iKqhrNcICA","Kr8ys55rfB","CxVEf5IhmG","2Yz7ERsQUq","QChxslXFOB","cShY2Kr8ys","Z4I1v5ZaEz","S77LHzmLYD","zqH0Wt98iW",
+"uZPqgiKqhr","guMb8MK07Y","9y4lw1v5hH","aez9yEOE1o","O3iyQYOfrY","zz4ZUaL6AJ","RACujPb1pa","iKqhrCdyBV","iB08ltlILt","QworuqQxHP",
+"M6qcG5iGN5","Pb1paDz1R3","W7cTsRBhp0","yToGWSjskQ","QssNCogLgc","aL6AJyToGW","HzZT8fcwDa","atef2qaofN","oQ87rWMiS3","POUYS7fKYU",
+"uN6r3GXdoH","FGzgphSSvQ","2hEEUI7p2a","JKWYRCqqaD","zz4ZUeuZA5","yvOMIFPfSE","K4GS8SbRYy","FcWrWh1zcH","pWiOsAkKTk","uTacxOz8yZ",
+"hi5X7WDVWJ","FwEJz8RCUA","cShY2PYBf4","9XyT9i7WMQ","5nmWvRxrsm","XflUqvLsmS","580YDRACuj","Gv3FqlXFOB","pT8wuVIlwP","CIShG5drc6",
+"LDk6fru4UG","cmXIX0ao3l","7fKYU7Ow5C","n8pJ9FFDui","uQIczru4UG","FGzgpC2Irc","Y1mC0WDVWJ","JIqXi1v5hH","29QAz7fsYM","I7p2as4786",
+"G1RhStjQxs","KsjRKguMb8","D6rByWreyP","vOqCEVerEA","1v5hHjS1aj","d7vjMCqqaD","2ZHdkoQ87r","VNCPdjzUqR","NOHszuLtKs","GrDg7Oz8yZ",
+"9GXkX9eoRc","t59lR55rfB","2Yz7ElH1kt","O3iyQVprf2","uZPqgHRxd8","W3VFHo8Uyd","blLA9lCMxy","tjQxsSbRYy","MmsIomX2GE","o8UydQ6hMC",
+"BbwgATwano","brhlQQYxC0","5IhmG0PktI","pv0i7OxWIH","ni2v1uupzk","gf8rIzmLYD","8TxD70Wr5y","dmoS7B3qem","aez9yAOgEe","M3zXLcL0aE",
+"9GXkXd7vjM","8xEKz9y4lw","I7p2aIBe8k","WaWsvi7WMQ","HP433AXpwE","he9IAhE1Ql","o8UydSs0Zu","O3iyQRzaZA","hi5X7zz4ZU","nnP8oo8Uyd",
+"ZJTXHlXFOB","RACujjiVBP","AmdQdwiHrZ","guMb8Ul4a1","o8Uyd8cVD3","euZA514FLR","Ss0Zu5ZaEz","s47869iGoT","4dEz6rhl0J","8cVD3Yf2Ec",
+"dmoS7X6Pin","IjTwPSWfou","JJs5mpv0i7","zqH0WPYBf4","Fhtglrhl0J","QChxsnFqik","Z4I1vMojnP","vOqCE0h1b1","Q6hMCfqypy","i3pydprNT6",
+"uupzkW3VFH","0ao3llViBv","xciqpfqypy","hYBCK5Drn0","IjTwPlXFOB","0PktIHlUbF","3otm6guMb8","euZA5ix74r","rKDLJpWiOs","s93Mlhe9IA",
+"ru4UGRxrsm","nnP8ouoStw","0MR5XZzJHW","zqH0WDQimp","bgJAzl83Ud","SWfouECMvU","P6bcgnFqik","7X3uyogLgc","0ao3lTwano","No0QbPYBf4",
+"2TRI7RBhp0","8xEKz9eoRc","oGu6x55rfB","M6qcGlH1kt","Cp3mZPYBf4","tuDyStjQxs","k85AeYw2oU","hSSvQaez9y","7fsYMWPmlx","yluBxy94nw",
+"Mm8si0h1b1","0ao3ltl72W","Oz8yZ2Yz7E","pFrrlru4UG","GWqqXuLtKs","Uvlv44W0Tl","IKxdLzbIYY","Nxx9VRpBQm","yvOMI4QMc9","azIWp0PktI",
+"Cp3mZHfyNQ","KZamHHP433","ciuWzcmXIX","MGlTF14FLR","aL6AJd85a9","d85a916lHc","lpF6WPYBf4","zQt6QxXTI4","DG4sTStlDJ","L7cGcRxrsm",
+"K4GS8VjCZq","he9IANAFuw","fmIK1FjHXR","6q6L90ao3l","vkCHHzHF1q","CNHmvBFkb8","7hyVvnlaBy","Gv3Fq5iGN5","618DiCp3mZ","F6PT2QChxs",
+"yToGW9rlg9","tlILtv1Hln","uLtKsMGlTF","nlaByKr8ys","kB5nPkZANm","SWfoulweGy","8FmFHzQt6Q","jiVBPCIShG","prNT6oQ87r","FPfSE9y4lw",
+"GSQwjvOqCE","d85a9POUYS","ciuWzSjskQ","NAFuwQssNC","Yf2EcYh1hF","8xEKzWaWsv","ReKEWjSjS3","BbwgA618Di","ogLgctaOXK","7ku1p0ao3l",
+"EoToPpAhR1","cShY2uAWyp","OHaBzVLTy6","tlILtUvlv4","n1pmO7hyVv","SmGzvfLNg8","NcICAhE1Ql","jeskSkB5nP","7lUXZfmIK1","JKWYRStlDJ",
+"bgJAzuLtKs","KsjRKXflUq","rhl0JFcWrW","pmeCdt98iW","tjQxssx5Gl","piJSkZJTXH","dhSuHTCgPp","4W0TlUvlv4","pmeCdgIYvE","SbRYyt98iW",
+"QChxs45cIH","RsQUqru4UG","tjQxs580YD","d7vjMpWiOs","gf8rIWMiS3","CqqaDPYBf4","sx5GlpT8wu","gjUTuatef2","cmXIX5ZaEz","WDVWJblLA9",
+"ciuWz8U2nU","O3iyQMK07Y","n8pJ9MojnP","D6rByZuDtD","FhtglciuWz","7X3uyv8yFN","t98iWfcJOy","OUqFMNOHsz","2DREsatef2","2DREstvdkD",
+"L7cGcHP433","jSjS3tjQxs","iKqhrFxX9q","9GXkXY1mC0","2TRI7i7WMQ","uvf7AEdBKc","5nmWvGrDg7","HlUbFFnPFB","45cIHzz4ZU","okgRiMmsIo",
+"zY1GY7lUXZ","0PktIuvf7A","ulk41Cfgr3","uQIczQnJ1S","WPmlxn1pmO","DG4sTlweGy","sx5GlzFgtB","dhSuHsqVrf","CK5W7uZPqg","k85AeFwEJz",
+"n1pmOWreyP","yluBxatef2","Z4I1vDcpWB","8TxD73otm6","pT8wuAkKTk","FhtglK4GS8","vLsmSWDVWJ","tvdkDFPfSE","kZANmCIShG","hi5X7ogLgc",
+"IKxdLRkQke","hE1QlGWqqX","mX2GERACuj","K4GS8HfyNQ","zz4ZUS2Dfu","5NammHfyNQ","Ul4a1v2eC3","Y1mC07fKYU","ZUnqtGv3Fq","16lHcFNYIM",
+"v8yFN0PktI","Oz8yZNo0Qb","qaofN5ZaEz","BFkb8W3VFH","MaJQsfLNg8","Cfgr3ZhwG1","aDGtSlweGy","HRxd8jtn0X","45cIHOz8yZ","zbIYYY1mC0",
+"4dEz6wiHrZ","AmdQddQ586","tAOsrWPmlx","i3pydiKqhr","Ta8f6iB08l","WPmlxfcJOy","IKxdL9rlg9","jSjS3AgJHQ","M6qcGuLtKs","v8yFNJXljW",
+"aez9yCIShG","AkKTkCdyBV","M3zXLgf8rI","pmeCdFnPFB","rz7UtlViBv","7hyVvOUqFM","FPfSEK20wK","QworuiB08l","ru4UGMGlTF","DLhzM0BmCy",
+"LewvMs7Mxk","DG4sT8TxD7","Chuy3sx5Gl","8cVD3jzUqR","prNT664s8N","OUqFMjeskS","jSjS3U3yw5","F6PT2MmKGJ","s93Ml5drc6","24ARFfaHir",
+"TCgPpQ6hMC","24ARF9rlg9","s7MxkyvOMI","QnJ1SbgJAz","jtn0XNxx9V","yvOMIB3qem","AIYUuS2Dfu","gdQsSU3yw5","sqVrfazIWp","7ku1pTXQ0Z",
+"okgRiIjTwP","F6PT2zqH0W","jSjS3fqypy","yluBxJJs5m","d85a9K4GS8","v2eC3jfREu","8TxD7aez9y","jeskSFFDui","Gv3Fq8U2nU","C2IrczqH0W",
+"Yf2EcAXpwE","0KyfslViBv","BpYhVydG8U","8RCUAMkgy8","X6PinUvlv4","8U2nUKZamH","QssNCAOgEe","lH1ktd7vjM","s7MxkIRh48","ZuDtDFxX9q",
+"aFFssyEfy9","2DREsHzZT8","In3NSjzUqR","FPfSEAkKTk","aez9yCdyBV","aFFssEoToP","DLhzMB3qem","qQxHPQ6hMC","yofH3lH1kt","WmadAcmXIX",
+"JJs5mbrhlQ","EOE1olm0pD","RsQUqWPmlx","uZPqg2TRI7","7fsYMpvgjS","tuDySyluBx","F6PT2Ss0Zu","blLA9yEfy9","LDk6fKsjRK","5iGN5GrDg7",
+"gjUTu07n1c","Yw2oUy94nw","ZuDtDWPmlx","ciuWzvkCHH","24ARFHP433","Nxx9VRmDcr","gIYvEhSSvQ","QssNCFPfSE","dhSuHNOHsz","lj07QsqVrf",
+"uJScXBFkb8","xReec5Mg9r","QClRLDQimp","nnP8oBbwgA","ru4UGlkMUA","0YAGHwiHrZ","m4bxUb29RJ","gtCA57X3uy","KASQ8Ul4a1","MmKGJ14FLR",
+"blLA9Rxrsm","uPX7G5nmWv","vOqCEIBe8k","dmoS7Y1mC0","MmKGJfFDrJ","uupzkZv7z0","RkQkeMaJQs","uZPqgaDGtS","0ao3lnnP8o","5Mg9rkZANm",
+"TCgPpRkQke","3weIFJXljW","CqqaDfcwDa","vLsmSRzaZA","aL6AJlj07Q","EoToP9GXkX","Cfgr37lUXZ","KASQ848cHL","lpF6W2ZHdk","SWfouVBjhz",
+"CK5W7h1zcH","zz4ZU9XyT9","nlaBy8U2nU","aFFsslpF6W","rKDLJFcWrW","b29RJzQt6Q","oVQp6G1RhS","VerEA2TRI7","IRh48MmsIo","Fhtglatef2",
+"VjCZqiB08l","uZPqgRpBQm","ReKEWmX2GE","euZA5CdyBV","t59lROHaBz","BFkb8ydG8U","ulk417fKYU","MK07YQClRL","XyPZNW7cTs","Y1mC0MmsIo",
+"I7p2a8cVD3","7hyVvRpBQm","taOXKlH1kt","kB5nPJRJQB","GWqqXeuZA5","AmdQdd7vjM","S77LHuoStw","NOHszCp3mZ","TXQ0ZaDGtS","5drc69iGoT",
+"7Ow5CuQIcz","AgJHQCdyBV","o8Uydb29RJ","FwEJzHlUbF","7Ow5Cuvf7A","Fhtglgf8rI","uPX7Gatef2","GWqqX4QMc9","RsQUqAIYUu","I7p2ani2v1",
+"zmLYDRkQke","ZzJHWhE1Ql","hE1QlM3zXL","lsQGol83Ud","6AFT055rfB","nFqiklj07Q","pFrrl24ARF","Vprf2AkKTk","FjHXRUlU3M","P6bcgNhXdu",
+"QssNCcQOnv","8TxD7oQ87r","Fhtglmz8gx","ciuWzWDVWJ","DQimp5Namm","Z4I1v9XyT9","U3yw5MaJQs","ECMvUJkzUn","hSSvQFwEJz","sqVrfGv3Fq",
+"5ZaEzv1Hln","y94nwydG8U","RkQkeix74r","5Mg9r5nmWv","HfyNQFwEJz","Cp3mZpAhR1","ru4UGl83Ud","7Ow5CzHF1q","Pb1pafaHir","vLsmSVBjhz",
+"aFFssQworu","lweGyJ2mQi","euZA5AkKTk","wDajX9XyT9","qQxHP6q6L9","piJSkTa8f6","aL6AJaL6AJ","9rlg9hSSvQ","piJSk5Mg9r","P6bcgTwano",
+"9y4lwMGlTF","ECMvUUl4a1","oVQp6he9IA","G1RhSO3iyQ","cL0aEBpYhV","x3LDePb1pa","djsrvVBjhz","ZuDtD9y4lw","ZuDtDAgJHQ","soy9tlm0pD",
+"KZamHTa8f6","jfREuOUqFM","ksJby1v5hH","8cVD3xciqp","CK5W7pv0i7","lkMUAuLtKs","okgRi5Namm","QnJ1SlViBv","5VZjSOUYuF","CqqaDVprf2",
+"lViBvtvdkD","DLhzMiB08l","uTacxxXTI4","HzZT8cmXIX","lsQGoCNHmv","cQOnvYw2oU","y94nwzz4ZU","fqypyCqqaD","RsQUqMK07Y","EoToP7hyVv",
+"OHaBzyofH3","pvgjSGWqqX","DcpWBNhXdu","L7cGcjSjS3","07n1cydG8U","U3yw5i3pyd","VBjhzsoy9t","SmGzvS77LH","gdQsSMojnP","DLhzMmX2GE",
+"nFqik8RCUA","IKxdLFhtgl","07n1cGWqqX","OUYuFL7cGc","TCgPpn8pJ9","5IhmGe6e4z","iqv4kt59lR","ReKEWJIqXi","uupzkt98iW","3otm60MR5X",
+"64s8Nmz8gx","RmDcroQ87r","fmIK1v1Hln","yToGWi3pyd","iKqhrpWiOs","JIqXi6q6L9","he9IAMGlTF","v8yFNtAOsr","QbxXcwiHrZ","uoStwVIlwP",
+"lj07QqQxHP","aL6AJtl72W","nnP8oMkgy8","o8Uyd1v5hH","t98iWpmeCd","tjQxsfaHir","suY4xdmoS7","iwzGkCNHmv","QYxC0IKxdL","uZPqgOxWIH",
+"jiVBPUvlv4","9rlg9oQ87r","Dz1R3gf8rI","lj07QEoToP","TwanoVprf2","ZzJHW2hEEU","M3zXLb29RJ","NOHszciuWz","iKqhr5IhmG","In3NSni2v1",
+"dpe1vBCxeC","v2eC3oGu6x","uPX7Gv8yFN","GSQwjGv3Fq","WPmlxYjB9t","P6bcgOUqFM","ZhwG1Kr8ys","pv0i724ARF","VLTy6nlaBy","lpF6Wt98iW",
+"euZA5FGzgp","7fKYUsoy9t","aDGtSsuY4x","580YDlweGy","GXdoHfcJOy","blLA9Cp3mZ","RsQUqcQOnv","lj07QYw2oU","BpYhVx3LDe","9y4lwcQOnv",
+"4dEz6s7Mxk","FFDuilweGy","7ku1pD6rBy","MK07YNAFuw","QssNCSWfou","O3iyQECMvU","RzaZAQClRL","BCxeCIBe8k","ZhwG1Cfgr3","Ul4a1HzZT8",
+"YjB9t55rfB","tAOsr7lUXZ","7hyVvCIShG","In3NSQssNC","Z4I1vzz4ZU","YOfrYQ6hMC","jiVBPazIWp","e6e4zQnJ1S","9eoRcwiHrZ","jeskSBFkb8",
+"wiHrZtlILt","pFrrl45cIH","mz8gxC2Irc","CxVEfbrhlQ","aL6AJRxrsm","Yh1hFmz8gx","4dEz6xciqp","GSQwjAOgEe","a00b5n8pJ9","bZLvSpAhR1",
+"5ZaEzpWiOs","GrDg7jfREu","HlUbFNo0Qb","0BmCyEoToP","fcJOyoQ87r","JJs5mM6qcG","KASQ8euZA5","RzaZAVBjhz","MmsIozz4ZU","16lHctl72W",
+"4W0TlHfyNQ","Z4I1vfcJOy","yvOMIuQIcz","QYxC0tl72W","y94nweuZA5","MK07YqUJMd","ZJTXHC2Irc","GrDg7h1zcH","GSQwj5Drn0","tuDySGXdoH",
+"h1zcHlH1kt","5VZjS9y4lw","2Nslm5iGN5","B3qemOUqFM","TCgPpjeskS","ix74rh1zcH","Pb1paFhtgl","azIWpHRxd8","ogLgchi5X7","JJs5mOz8yZ",
+"KZamHBpYhV","Ul4a1CNHmv","ZUnqtjSjS3","aFFssU3yw5","29QAzAXpwE","6q6L9fFDrJ","s7Mxkt98iW","FPfSE9eoRc","5nmWvs4786","uZPqgv1Hln",
+"0KyfsKASQ8","zY1GYMmKGJ","i3pyd2DREs","sx5Glxciqp","K20wK1j5L8","uJScXnlaBy","LewvMjS1aj","ulk417Ow5C","nlaByJRJQB","jS1ajlCMxy",
+"NOHszs93Ml","fcJOyOHaBz","ulk41Z4I1v","dmoS79XyT9","S2Dfub29RJ","jiVBPuZPqg","VLTy6jeskS","Q6hMCdQ586","Chuy3qUJMd","J2mQiru4UG",
+"tuDySWaWsv","CIShGFwEJz","tuDyS1v5hH","BCxeCuZPqg","OUYuFK20wK","0BmCyguMb8","ReKEWTwano","Ta8f6dmoS7","CIShGSs0Zu","yvOMIFwEJz",
+"NAFuwNOHsz","S77LHUlU3M","MK07Ydpe1v","CK5W78cVD3","OUqFMuupzk","7X3uyU3yw5","Yh1hFaFFss","5NammksJby","8hJdtuN6r3","Cfgr3Gv3Fq",
+"2ZHdk2Yz7E","EdBKcrKDLJ","FnPFBjS1aj","yluBxF6PT2","cQOnvTXQ0Z","7lUXZF6PT2","fcwDaAXpwE","VNCPdaL6AJ","gdQsSvOqCE","pv0i7sqVrf",
+"MaJQsfqypy","iB08lOxWIH","suY4xRsQUq","i7WMQRBhp0","jeskSAOgEe","suY4xVerEA","Gv3FqzmLYD","0BmCyiwzGk","oQ87rRBhp0","bgJAzuZPqg",
+"3weIFhSSvQ","Gv3Fq5Drn0","FjHXRtvdkD","qQxHPZv7z0","dpe1vt59lR","ix74rW7cTs","5VZjSP6bcg","8U2nUdpe1v","yofH35IhmG","FLspht98iW",
+"he9IA9GXkX","Zv7z0Ta8f6","No0Qb618Di","RzaZAgjUTu","zY1GYTa8f6","Y1mC00ao3l","dpe1vuupzk","Ss0ZuUvlv4","JKWYRk85Ae","ni2v1ciuWz",
+"7lUXZJRJQB","5Mg9rZzJHW","uTacxRpBQm","AOgEeVIlwP","ZzJHWeuZA5","GWqqXpmeCd","Q6Lix0ao3l","ZhwG1Z4I1v","0YAGHReKEW","NhXduv1Hln",
+"yvOMIPOUYS","AXpwErKDLJ","atef2SWfou","0h1b1FxX9q","aez9yAIYUu","9XyT9StlDJ","zbIYYDcpWB","M3zXLxciqp","he9IAni2v1","W7cTsCqqaD",
+"jtn0XuoStw","ThjNnFLsph","AXpwEiB08l","m4bxUJJs5m","Q6LixB3qem","oQ87roGu6x","hE1QlAmdQd","1LB1Ldpe1v","WreyPCNHmv","Waim6t98iW",
+"gjUTurz7Ut","HzZT82Nslm","GXdoHVLTy6","uLtKsuLtKs","2ZHdk8FmFH","s93MlFFDui","soy9tuupzk","pT8wuXflUq","WmadAtuDyS","M3zXL5nmWv",
+"OHaBzBpYhV","OUqFMs93Ml","YOfrYPYBf4","4QMc95Mg9r","pWiOsKr8ys","K4GS8GSQwj","VNCPdfqypy","tvdkDlkMUA","8FmFHYh1hF","AIYUu9GXkX",
+"jtn0XOUYuF","9eoRczQt6Q","JRJQBJRJQB","5NammJJs5m","fcwDatuDyS","jzUqROUYuF","lViBv8FmFH","djsrvJXljW","Twano8xEKz","Mm8siBpYhV",
+"soy9ttlILt","gf8rIjeskS","AXpwE5ZaEz","XflUqOHaBz","oGu6xZJTXH","RkQkeIKxdL","9y4lwAgJHQ","GSQwjpAhR1","QworuLbRTH","k85AeWmadA",
+"5Mg9rtvdkD","7ku1pRxrsm","sqVrfn8pJ9","qaofNoVQp6","guMb8Yf2Ec","14FLRuupzk","lweGyl83Ud","LewvMlm0pD","uTacxP6bcg","lkMUAgf8rI",
+"zY1GYP6bcg","AmdQdC2Irc","cQOnvQClRL","m4bxUhi5X7","Ta8f6sqVrf","Nxx9VjiVBP","L7cGcJJs5m","RkQke0Wr5y","L7cGcydG8U","64s8NpvgjS",
+"Oz8yZcShY2","QssNC0Wr5y","9GXkXlsQGo","ogLgcTCgPp","JkzUnoVQp6","JIqXicL0aE","LbRTHJJs5m","FFDuiMmKGJ","tjQxszY1GY","BbwgAn8pJ9",
+"s93Ml0Wr5y","uupzkvLsmS","6q6L9K20wK","9XyT9IBe8k","4dEz6KZamH","AOgEeEOE1o","L7cGciKqhr","RBhp0yEfy9","Nxx9VUmaEv","IjTwPcShY2",
+"hYBCKDz1R3","gf8rINcICA","SWfouHzZT8","GrDg7suY4x","IjTwPiKqhr","a00b5uJScX","K20wKjeskS","EoToPRpBQm","5NammZuDtD","ZUnqt0MR5X",
+"Y1mC0v2eC3","S2DfuFGzgp","d85a9CIShG","hE1Ql0Kyfs","kZANmUl4a1","7X3uy2Yz7E","5drc6vkCHH","L7cGcblLA9","5VZjS7fsYM","cShY2No0Qb",
+"5nmWvM3zXL","yToGWfcJOy","Ss0ZuOUYuF","mz8gxMmKGJ","qQxHP2Yz7E","WDVWJMmKGJ","cL0aEQworu","K20wKn1pmO","Q6Lixdjsrv","BbwgAlsQGo",
+"ECMvUrhl0J","cShY20YAGH","rhl0JM3zXL","CK5W7FGzgp","K4GS87Ow5C","1v5hHgf8rI","FGzgpYh1hF","8RCUAQnJ1S","IRh48iB08l","FcWrWMezSW",
+"7lUXZ5IhmG","7fKYUYOfrY","prNT6Yw2oU","8cVD3k85Ae","07n1ciwzGk","55rfBZJTXH","64s8NVNCPd","0h1b1tuDyS","aFFssRzaZA","m4bxUru4UG",
+"FhtglSmGzv","hUTw7v8yFN","gf8rILewvM","RkQkeAgJHQ","NcICA1j5L8","uJScXuQIcz","faHirLewvM","ni2v1CNHmv","m4bxUFNYIM","9GXkXguMb8",
+"uZPqgVIlwP","uoStw5nmWv","d85a9CNHmv","jiVBPaDGtS","ThjNngIYvE","dpe1vS2Dfu","SjskQPYBf4","TCgPptaOXK","2ZHdk45cIH","Kr8yshSSvQ",
+"iKqhrlH1kt","dhSuH1j5L8","s4786Uvlv4","9XyT9uupzk","Yf2EczHF1q","M6qcG1v5hH","Gv3FqzqH0W","AmdQdLewvM","FjHXRdQ586","uvf7ANo0Qb",
+"8TxD78cVD3","RBhp0Pb1pa","qQxHPuoStw","QClRLgf8rI","RmDcrBpYhV","IRh48uAWyp","oGu6xOxWIH","dhSuHaez9y","rz7UtMkgy8","IKxdLBGaQY",
+"OxWIHyluBx","kB5nPLewvM","5nmWv45cIH","lViBvyluBx","i3pydgtCA5","0ao3lCNHmv","OHaBzHzZT8","uTacxpv0i7","ciuWzuLtKs","EoToPnnP8o",
+"EOE1opiJSk","GXdoHGrDg7","QClRLjS1aj","ydG8UIBe8k","WMiS3WreyP","he9IAHRxd8","t98iWGrDg7","7fsYMXyPZN","lViBvHzZT8","QWxoTHP433",
+"9rlg9cShY2","7lUXZxReec","d85a9CxVEf","Chuy3v8yFN","s7Mxky94nw","v1HlnkZANm","UlU3Mb29RJ","QWxoTI7p2a","XflUqNOHsz","aDGtSuoStw",
+"55rfBsx5Gl","tAOsrXyPZN","VjCZqcShY2","iB08lJRJQB","rhl0JlkMUA","LewvMi7WMQ","U3yw5pFrrl","gtCA5zFgtB","fqypydpe1v","AmdQdd85a9",
+"h1zcHciuWz","TwanoQClRL","W3VFHRsQUq","LbRTHciuWz","dpe1vfcwDa","Gv3Fqi3pyd","5iGN55ZaEz","580YDWPmlx","O3iyQAXpwE","o8Uydn1pmO",
+"vkCHH9y4lw","580YDAkKTk","X6PingjUTu","8xEKzqQxHP","HzZT88FmFH","jtn0XS2Dfu","EOE1o3otm6","jfREuuoStw","uvf7AjiVBP","ZhwG1F6PT2",
+"t59lRCIShG","m4bxUdpe1v","QYxC0ru4UG","S77LHW3VFH","Gv3FqFPfSE","GWqqXh1zcH","d85a9hUTw7","5Mg9rF6PT2","0ao3luQIcz","7Ow5CUlU3M",
+"jS1ajfmIK1","xXTI4SjskQ","yvOMIhE1Ql","vOqCEwDajX","DLhzMgf8rI","14FLRbgJAz","yvOMI0h1b1","hSSvQtl72W","hYBCKOUYuF","BbwgA2Nslm",
+"0h1b17ku1p","EoToPuN6r3","GSQwjs4786","2DREsL7cGc","mX2GExReec","RACuj48cHL","In3NSb29RJ","pvgjSJ2mQi","In3NSFFDui","7fKYU7hyVv",
+"NhXduyvOMI","0KyfstuDyS","XyPZNRkQke","QWxoT5Mg9r","zFgtBIRh48","ciuWzGv3Fq","ulk41n1pmO","dmoS7AgJHQ","lXFOBLDk6f","KsjRK9iGoT",
+"O3iyQRkQke","VjCZq9rlg9","guMb8OUqFM","gjUTuQChxs","JIqXiBpYhV","d85a9GWqqX","YjB9tU3yw5","gtCA5AIYUu","DLhzMJKWYR","HP433VBjhz",
+"MezSWk85Ae","OUYuF9y4lw","OUqFM2ZHdk","QClRL24ARF","0Wr5yoGu6x","KZamHZuDtD","gf8rI8TxD7","ThjNnzz4ZU","MezSWOUqFM","MmsIo0ao3l",
+"dhSuH8cVD3","In3NSCxVEf","oVQp6JIqXi","WPmlx2Nslm","7X3uyZhwG1","5Drn0zbIYY","jeskSAmdQd","sqVrfCqqaD","OUqFMSs0Zu","Ta8f6AXpwE",
+"5iGN5fcJOy","RsQUqZJTXH","0Wr5yciuWz","uZPqgFPfSE","rz7UtbZLvS","ru4UGoGu6x","TCgPpfqypy","pvgjS5Namm","BbwgAoGu6x","qaofNuZPqg",
+"FjHXRzz4ZU","fmIK1KsjRK","7fsYMx3LDe","CxVEfYjB9t","tl72WPYBf4","v1HlnAmdQd","yToGWvLsmS","dmoS70BmCy","I7p2awiHrZ","x3LDea00b5",
+"0PktIdmoS7","WDVWJJJs5m","9iGoTGrDg7","9eoRcatef2","wiHrZ5iGN5","pFrrl7ku1p","dmoS7dQ586","JIqXi29QAz","Pb1paiwzGk","wDajXjeskS",
+"DcpWBYw2oU","55rfBYf2Ec","EoToPZUnqt","oVQp6Z4I1v","Pb1paQnJ1S","G1RhSsuY4x","5VZjSAkKTk","BbwgAHlUbF","lCMxyOHaBz","ydG8UTa8f6",
+"FjHXRvOqCE","BbwgAs4786","BbwgAY1mC0","tAOsrKZamH","Z4I1vuupzk","TXQ0ZlpF6W","WPmlx618Di","SjskQMK07Y","CqqaDZ4I1v","HRxd8lCMxy",
+"QssNCWmadA","0Kyfsfqypy","KZamHAkKTk","iKqhrNxx9V","8TxD7lpF6W","Waim6WMiS3","BCxeCRpBQm","cShY2HP433","gdQsSuupzk","Zv7z03weIF",
+"nnP8olweGy","0ao3lVLTy6","kZANmLDk6f","WDVWJKsjRK","2hEEUMmKGJ","zmLYDGXdoH","KASQ8F6PT2","GXdoHzFgtB","OxWIHhSSvQ","8FmFHJIqXi",
+"iwzGk5drc6","a00b5bZLvS","FxX9q8U2nU","WDVWJXflUq","uN6r3FwEJz","d7vjMBCxeC","okgRiix74r","SmGzvqUJMd","5nmWvFNYIM","5Drn0v1Hln",
+"cQOnv2ZHdk","UmaEvlH1kt","RkQkeBFkb8","WPmlxIKxdL","Mm8sibgJAz","zY1GYFwEJz","gdQsS9GXkX","UlU3M0PktI","gdQsSECMvU","lj07QzHF1q",
+"dhSuHLbRTH","mz8gxqQxHP","ZzJHWFGzgp","s4786618Di","t59lRvOqCE","7lUXZDLhzM","jtn0XPYBf4","5IhmGjSjS3","5nmWvulk41","uN6r30YAGH",
+"lm0pDUmaEv","2Yz7ETXQ0Z","tvdkDG1RhS","zbIYYjtn0X","JRJQB8xEKz","uN6r3StlDJ","MmKGJpWiOs","5Drn04QMc9","AIYUuFGzgp","gf8rIh1zcH",
+"pFrrlQbxXc","FNYIMFjHXR","Ta8f6X6Pin","JXljWk85Ae","8hJdt29QAz","fLNg8ix74r","24ARF5ZaEz","1v5hHs4786","DG4sTCK5W7","LewvMU3yw5",
+"CK5W7KZamH","QworuJIqXi","Ss0ZuC2Irc","uJScXprNT6","brhlQLDk6f","lXFOBRzaZA","Qworu8U2nU","ru4UGfcwDa","L7cGcKASQ8","Chuy3pFrrl",
+"FVMxo5VZjS","piJSk55rfB","zFgtB5Namm","In3NSK20wK","Zv7z0VNCPd","POUYS8cVD3","zbIYYoVQp6","uAWypOHaBz","lsQGocmXIX","tjQxsgIYvE",
+"4QMc9P6bcg","sqVrfCp3mZ","jzUqR64s8N","3weIF9y4lw","uQIczJ2mQi","SWfouU3yw5","GrDg7yluBx","pT8wuLbRTH","gIYvE618Di","oQ87rGSQwj",
+"faHirs7Mxk","FwEJzciuWz","BCxeC7X3uy","AmdQdPOUYS","HfyNQgjUTu","uoStw1v5hH","uJScXgf8rI","JIqXirhl0J","qUJMdn8pJ9","rz7UtciuWz",
+"dmoS7qUJMd","WreyPbrhlQ","VNCPdW3VFH","yofH30MR5X","No0QbdhSuH","lpF6WZv7z0","Yh1hFi7WMQ","sqVrfqUJMd","CIShG5nmWv","LDk6fsqVrf",
+"IRh48MK07Y","kB5nPi3pyd","zFgtBYf2Ec","2Yz7ElXFOB","BbwgAlXFOB","s7MxksqVrf","WreyPRkQke","hYBCKFNYIM","gf8rIJIqXi","Cp3mZiwzGk",
+"Q6Lixrz7Ut","HP433tvdkD","djsrv5VZjS","zQt6Qi3pyd","vLsmSlj07Q","yToGWtvdkD","k85Ae9GXkX","rz7UtdhSuH","hUTw7aL6AJ","Zv7z0KsjRK",
+"7X3uy2TRI7","BpYhVFjHXR","DQimp14FLR","ulk41pWiOs","euZA5Vprf2","pmeCdQssNC","uN6r3OUqFM","vkCHH1j5L8","zz4ZUDG4sT","uN6r3jfREu",
+"MK07Y7Ow5C","LbRTHgjUTu","5VZjSx3LDe","Yf2Ec618Di","uTacxHfyNQ","lViBvfqypy","brhlQGXdoH","rhl0JIKxdL","gIYvEZhwG1","QWxoTpmeCd",
+"GrDg7TCgPp","LDk6fZ4I1v","14FLRBFkb8","AXpwEDLhzM","Twano8TxD7","taOXKCNHmv","BFkb8zHF1q","t98iW7X3uy","UmaEvTCgPp","d7vjMWDVWJ",
+"lViBv5Namm","he9IAi3pyd","2Yz7EHRxd8","aez9y3otm6","O3iyQ0h1b1","gIYvEsqVrf","JKWYRWDVWJ","rhl0JhUTw7","dpe1v5Drn0","618DiyluBx",
+"LbRTH14FLR","jzUqR0MR5X","gIYvE6q6L9","Fhtgl8hJdt","DQimpOz8yZ","lpF6WOz8yZ","XyPZN1v5hH","y94nwW3VFH","vOqCE6AFT0","64s8N2TRI7",
+"yofH3GSQwj","0YAGHdpe1v","MGlTFrhl0J","8xEKzuZPqg","uTacxhUTw7","cShY29y4lw","RsQUq9GXkX","Dz1R37ku1p","HlUbFVerEA","vOqCEsqVrf",
+"jiVBPC2Irc","55rfB7hyVv","BFkb8Cp3mZ","9iGoTSWfou","JXljWK4GS8","Mkgy8gtCA5","AIYUu0YAGH","W7cTsRkQke","MmsIoHRxd8","a00b5yvOMI",
+"G1RhS5Mg9r","tjQxs24ARF","vLsmS0YAGH","djsrvsx5Gl","v8yFNKsjRK","x3LDenlaBy","Dz1R3uZPqg","i7WMQBGaQY","k85AeVprf2","pFrrlogLgc",
+"1v5hH0YAGH","JkzUnFLsph","e6e4zXyPZN","FGzgpFjHXR","vLsmS9rlg9","djsrvatef2","QnJ1S0YAGH","WaWsv1v5hH","AIYUuIn3NS","LewvMAXpwE",
+"PYBf4DLhzM","GXdoHnlaBy","zFgtBuupzk","a00b5suY4x","jtn0XVBjhz","KASQ8HzZT8","9iGoTVIlwP","ydG8UEOE1o","C2Ircix74r","DLhzMHP433",
+"PYBf4EOE1o","s93MlStlDJ","h1zcHpvgjS","gIYvECK5W7","4W0TlblLA9","64s8NjiVBP","OUqFM0YAGH","Mkgy8XyPZN","b29RJ6AFT0","RkQkeHzZT8",
+"Zv7z0a00b5","RpBQmKZamH","euZA5vLsmS","OUqFMP6bcg","LewvMZJTXH","SbRYyMm8si","TXQ0ZzFgtB","zbIYYJXljW","MojnPGrDg7","oGu6xru4UG",
+"fqypy8FmFH","ni2v1Ta8f6","618DijS1aj","7hyVvJJs5m","OUYuFSWfou","vkCHH1LB1L","gIYvECp3mZ","hSSvQzFgtB","CNHmvhYBCK","mz8gxChuy3",
+"RkQkeWMiS3","jiVBPdhSuH","ZJTXHM6qcG","9rlg9ReKEW","GrDg7AkKTk","4W0TlOxWIH","e6e4zO3iyQ","Oz8yZksJby","3weIF9eoRc","BbwgAhe9IA",
+"K4GS8FFDui","yluBx7ku1p","CK5W7Yw2oU","EdBKcuJScX","Twano2Yz7E","ix74rAmdQd","8U2nU2Nslm","QbxXcVIlwP","580YD2Nslm","XyPZNcShY2",
+"nnP8oEoToP","C2Irc2Yz7E","9eoRcWreyP","qQxHP14FLR","lViBvRsQUq","VerEACdyBV","0MR5XcmXIX","uPX7Gs93Ml","Mm8siGSQwj","Y1mC0ru4UG",
+"GSQwjW7cTs","Zv7z09eoRc","55rfB0PktI","BFkb807n1c","UlU3MblLA9","Fhtglulk41","1LB1LjiVBP","7hyVvMaJQs","CdyBVWmadA","ydG8Ud85a9",
+"tAOsrlkMUA","RkQketAOsr","JXljWFhtgl","tuDySUlU3M","UlU3MG1RhS","AmdQd4QMc9","AkKTkQ6hMC","0ao3lHlUbF","y94nwfmIK1","zY1GYulk41",
+"MojnPTXQ0Z","xReechE1Ql","AmdQd0Kyfs","SmGzvJ2mQi","ThjNnK4GS8","gtCA5ZzJHW","uvf7AfmIK1","HP433zbIYY","8FmFH29QAz","DQimps7Mxk",
+"WreyPQnJ1S","5drc6qUJMd","DG4sTMojnP","8xEKzpWiOs","he9IAFFDui","lweGyrKDLJ","SbRYyUlU3M","cmXIXmz8gx","5NammXflUq","wDajXOxWIH",
+"h1zcH1j5L8","JkzUnCNHmv","tuDySsqVrf","tl72WW3VFH","5VZjSNxx9V","Ta8f6jS1aj","FPfSEMGlTF","WDVWJfLNg8","8RCUAru4UG","618Dik85Ae",
+"MojnPhe9IA","t98iWMkgy8","QnJ1SRpBQm","No0QbJRJQB","XflUqMezSW","Kr8ysyluBx","pv0i7ksJby","W3VFH7fKYU","t98iWiKqhr","iB08li7WMQ",
+"nFqikJkzUn","X6PinZ4I1v","VIlwPazIWp","IBe8kyofH3","0KyfsKZamH","4dEz6OUqFM","sqVrf7Ow5C","zqH0WKZamH","soy9teuZA5","NhXduWaim6",
+"WaWsvGrDg7","AgJHQRACuj","pT8wuZhwG1","pWiOsuN6r3","hYBCKhi5X7","ThjNniwzGk","uoStw8hJdt","ZuDtDRsQUq","7X3uy7ku1p","cmXIXEdBKc",
+"EoToPwiHrZ","uoStwBpYhV","Y1mC0guMb8","VerEA8FmFH","v2eC37ku1p","KsjRKBCxeC","In3NSGWqqX","ksJbyBbwgA","Uvlv4MmKGJ","tAOsruJScX",
+"iB08luQIcz","45cIHFNYIM","kZANmciuWz","aez9yIKxdL","bZLvSyluBx","0KyfsZuDtD","mX2GEYOfrY","qUJMd9iGoT","lpF6WVLTy6","kB5nP64s8N",
+"GWqqXzQt6Q","a00b5zHF1q","D6rBy7Ow5C","FnPFBWmadA","lweGylsQGo","07n1c9iGoT","Yh1hFjSjS3","55rfBhi5X7","ZzJHW14FLR","gtCA5S77LH",
+"vkCHHMojnP","5ZaEzhUTw7","FjHXRHzZT8","iKqhrYOfrY","FGzgpL7cGc","gdQsS16lHc","euZA5GrDg7","1LB1LzY1GY","3otm6lH1kt","OUYuFiB08l",
+"hi5X7FjHXR","OUYuF7fsYM","48cHLlj07Q","FGzgpFFDui","qQxHPx3LDe","7Ow5CwiHrZ","xXTI4uupzk","Cfgr3FNYIM","P6bcgzQt6Q","jzUqR9iGoT",
+"taOXKWmadA","iKqhrQworu","zz4ZUZzJHW","l83UdHlUbF","GSQwj07n1c","pvgjSrKDLJ","VjCZqyvOMI","JXljWPYBf4","uJScXyofH3","FGzgpo8Uyd",
+"2TRI7jzUqR","v8yFNCxVEf","lH1kt2ZHdk","iB08lDLhzM","rhl0JEdBKc","dmoS7WMiS3","Q6hMCIjTwP","jSjS3AkKTk","OHaBz580YD","d7vjMOHaBz",
+"Yf2Ecv1Hln","JKWYRQYxC0","l83UdDQimp","pvgjSDQimp","jiVBP618Di","azIWpWreyP","Zv7z0LewvM","uPX7GhSSvQ","JRJQBGXdoH","M6qcGMGlTF",
+"6AFT0pvgjS","VLTy6U3yw5","TCgPpKZamH","Cp3mZ1LB1L","yofH3RkQke","0Wr5yTCgPp","Mkgy8atef2","jtn0X8FmFH","EdBKcReKEW","ZUnqtZhwG1",
+"rKDLJDQimp","uZPqgD6rBy","3otm6tjQxs","QworuJ2mQi","wDajXSbRYy","blLA9v8yFN","lj07QRBhp0","lm0pDl83Ud","I7p2a5Mg9r","7fKYUguMb8",
+"DcpWBQ6Lix","OUYuFThjNn","8TxD7M6qcG","ZJTXHQ6hMC","WaWsv5Namm","1v5hH4QMc9","mX2GEhe9IA","dmoS7taOXK","Vprf2FxX9q","hSSvQO3iyQ",
+"CK5W76AFT0","FNYIM0MR5X","oVQp6uvf7A","Yw2oUI7p2a","FNYIMFFDui","45cIHTwano","ECMvUhYBCK","d85a9mz8gx","8FmFHjfREu","mX2GEuAWyp",
+"b29RJU3yw5","ogLgcQbxXc","i7WMQQ6Lix","Ta8f6BbwgA","FNYIMRpBQm","dmoS7azIWp","W7cTsSWfou","2NslmtAOsr","24ARFv8yFN","Q6hMCFNYIM",
+"SWfouhUTw7","0KyfsuN6r3","IRh48v2eC3","FFDuiUl4a1","Dz1R3Chuy3","WmadAwDajX","oGu6x8U2nU","sx5Gl5Mg9r","piJSk24ARF","tjQxsQWxoT",
+"EdBKco8Uyd","2Yz7EqQxHP","RzaZA7fsYM","lj07QBCxeC","VIlwPs7Mxk","07n1cUvlv4","dmoS7prNT6","yofH3OUYuF","qaofNKsjRK","NcICA2ZHdk",
+"KASQ89GXkX","jSjS35iGN5","aFFssTCgPp","fmIK1piJSk","W7cTsfmIK1","8RCUA3otm6","JJs5mjS1aj","iqv4khe9IA","CNHmv5nmWv","lH1ktXyPZN",
+"jfREuoQ87r","CqqaDRmDcr","8cVD3ZhwG1","SjskQUmaEv","zQt6QblLA9","uAWypKsjRK","JKWYR45cIH","BpYhVNo0Qb","pT8wukZANm","hSSvQ1v5hH",
+"xciqpYw2oU","WaWsv55rfB","5iGN5s7Mxk","5IhmG0h1b1","In3NSMaJQs","suY4xMmKGJ","yofH3Qworu","Oz8yZ55rfB","9y4lwCNHmv","Ss0Zu64s8N",
+"kB5nP5IhmG","lViBv7Ow5C","pv0i7v8yFN","Gv3FqYOfrY","jeskSkZANm","8U2nUyToGW","0BmCyY1mC0","0PktIFNYIM","BbwgANcICA","ni2v1xXTI4",
+"x3LDesuY4x","zHF1qFGzgp","HfyNQG1RhS","NAFuw2TRI7","IjTwPBpYhV","2DREsY1mC0","FwEJznlaBy","qaofNni2v1","5iGN5rhl0J","faHir2hEEU",
+"oQ87rtjQxs","oVQp68xEKz","tAOsrokgRi","lweGym4bxU","ydG8Uk85Ae","yluBxbrhlQ","MK07Ygf8rI","n1pmOulk41","4dEz6Q6Lix","8RCUADz1R3",
+"LDk6f580YD","2TRI7NcICA","uZPqgyToGW","Q6LixLewvM","v8yFNNhXdu","G1RhSChuy3","lj07QfaHir","RsQUqAgJHQ","a00b50Wr5y","LbRTH1LB1L",
+"uN6r3Ul4a1","Q6LixW3VFH","Dz1R3EoToP","5ZaEzsqVrf","FPfSEciuWz","FwEJzM3zXL","P6bcgvLsmS","StlDJEOE1o","Uvlv4ZuDtD","uN6r3M3zXL",
+"4W0TlAmdQd","G1RhSuN6r3","lweGyFLsph","GSQwjFLsph","aDGtSBFkb8","lsQGoFGzgp","POUYSnlaBy","5nmWvwiHrZ","JIqXioQ87r","WPmlxxReec",
+"pv0i7lH1kt","pAhR1lH1kt","QbxXcwDajX","sx5Gliqv4k","5Namm9eoRc","QbxXcJIqXi","fLNg8TCgPp","KsjRK2Yz7E","lpF6W3weIF","tAOsrfqypy",
+"n1pmOAkKTk","2DREs8U2nU","dhSuH07n1c","CqqaD0YAGH","KsjRKv1Hln","OxWIHhe9IA","EOE1oJ2mQi","Y1mC0JkzUn","lweGy1j5L8","POUYSpmeCd",
+"qaofNKr8ys","RsQUqVIlwP","Mkgy8Vprf2","kB5nPgdQsS","CdyBVy94nw","cmXIX2ZHdk","gf8rInnP8o","yofH3okgRi","ydG8UcQOnv","iB08lZzJHW",
+"NhXduHlUbF","n8pJ9Mm8si","I7p2aFhtgl","XflUq2ZHdk","Cp3mZYf2Ec","MmKGJIjTwP","MGlTFy94nw","QworuLewvM","soy9t0h1b1","FxX9qI7p2a",
+"uTacxd85a9","8RCUAb29RJ","iKqhrKr8ys","VjCZqNcICA","U3yw5BbwgA","O3iyQyToGW","d85a9fFDrJ","5Mg9rQ6Lix","kB5nPwDajX","U3yw5S77LH",
+"lXFOBQClRL","ulk41KsjRK","oQ87r07n1c","hi5X7D6rBy","dpe1vW7cTs","he9IACIShG","yluBxhUTw7","5IhmGJIqXi","s4786dhSuH","0h1b1XyPZN",
+"cL0aEjfREu","ZuDtDW3VFH","iB08l7fKYU","zFgtBYw2oU","8TxD7faHir","pT8wutaOXK","RxrsmHlUbF","7fKYUAXpwE","GrDg7GrDg7","9GXkXdQ586",
+"Q6LixCfgr3","NOHszVLTy6","hi5X75Mg9r","ciuWzk85Ae","Ss0ZuFLsph","KZamHtjQxs","HlUbFkZANm","s7Mxkaez9y","580YDiB08l","HfyNQlj07Q",
+"7hyVvuupzk","jiVBPhE1Ql","0PktIJKWYR","XflUqThjNn","0PktIdhSuH","lkMUAo8Uyd","AgJHQCp3mZ","QnJ1SB3qem","ZzJHWZzJHW","l83UdPYBf4",
+"i7WMQ9rlg9","NOHszwiHrZ","uN6r3EOE1o","lm0pD5ZaEz","WaWsvF6PT2","HfyNQsx5Gl","i3pydbgJAz","uN6r3s7Mxk","Yw2oU9XyT9","h1zcH0ao3l",
+"ulk41aL6AJ","soy9t55rfB","55rfBdhSuH","fcJOyb29RJ","NhXduEoToP","8RCUAMaJQs","uZPqgRkQke","pvgjSDz1R3","lH1kttl72W","5iGN5CdyBV",
+"t59lRX6Pin","9iGoTQ6Lix","8RCUAfLNg8","kZANm1v5hH","zqH0WydG8U","VBjhzXflUq","cQOnvblLA9","VBjhzFnPFB","RpBQmiB08l","xciqpHfyNQ",
+"nnP8ozFgtB","Vprf2OUqFM","oGu6xsqVrf","2TRI7xReec","7Ow5CpmeCd","3otm6yvOMI","EdBKcmz8gx","Waim6MGlTF","29QAzuJScX","BpYhVXflUq",
+"atef2CK5W7","F6PT2HRxd8","v2eC3P6bcg","8U2nUSbRYy","pv0i7fcwDa","lm0pD5drc6","3weIF29QAz","DcpWB2Yz7E","bZLvSYjB9t","dQ586fLNg8",
+"BGaQYQnJ1S","2NslmdmoS7","yvOMI9y4lw","brhlQWaim6","FcWrWzHF1q","4QMc93otm6","zY1GYuPX7G","RBhp0i3pyd","VjCZqlj07Q","14FLRhUTw7",
+"FjHXRQChxs","sx5GlHzZT8","VerEAVerEA","zQt6QjfREu","IjTwPECMvU","CK5W72Nslm","uN6r3MojnP","tlILtCK5W7","580YDG1RhS","vLsmSWMiS3",
+"fcwDaEdBKc","brhlQk85Ae","B3qemdpe1v","Y1mC0Zv7z0","1v5hHNo0Qb","StlDJo8Uyd","8FmFHRBhp0","MmsIot59lR","5drc6Mm8si","oVQp6zY1GY",
+"SbRYyNAFuw","xReecOUqFM","FnPFBVerEA","Oz8yZ9eoRc","uLtKsvLsmS","MojnP1LB1L","PYBf4uvf7A","5VZjSS2Dfu","QClRLRmDcr","SWfouWreyP",
+"AIYUu7fKYU","vOqCEfaHir","X6Pinhi5X7","FVMxo5drc6","WPmlxhE1Ql","OUqFMlXFOB","BGaQYatef2","S77LHFFDui","5Drn0fFDrJ","JJs5m9y4lw",
+"faHirWreyP","9rlg9QssNC","pWiOsAgJHQ","VIlwPd85a9","FLsphgIYvE","I7p2ahE1Ql","Yw2oUmz8gx","MezSWru4UG","HzZT8Zv7z0","M6qcGlweGy",
+"jfREu0Wr5y","WMiS3C2Irc","fcJOyG1RhS","jeskS0YAGH","uJScXVLTy6","cShY28TxD7","sqVrfReKEW","8RCUAYh1hF","FwEJzOxWIH","EoToPjzUqR",
+"Cfgr3DcpWB","k85AegtCA5","y94nw14FLR","D6rByyluBx","HRxd8gtCA5","Waim6s4786","WreyPyEfy9","64s8N5drc6","Cfgr3lkMUA","NcICAk85Ae",
+"Qworux3LDe","9GXkXRzaZA","x3LDeKZamH","PYBf4OUYuF","4QMc9NcICA","FxX9qzFgtB","dQ586tvdkD","ReKEW8RCUA","jzUqRFcWrW","i3pydBbwgA",
+"yToGWLewvM","Vprf2CIShG","JRJQBHlUbF","OUYuFSmGzv","AIYUuUl4a1","VjCZqv1Hln","5Drn0RzaZA","prNT6M3zXL","IjTwPfmIK1","6q6L9Gv3Fq",
+"9XyT9a00b5","cL0aEblLA9","HP433m4bxU","KZamHNAFuw","PYBf4lkMUA","0KyfsCfgr3","9XyT9faHir","lsQGoiqv4k","WMiS35Drn0","FhtglsuY4x",
+"S77LHWMiS3","tl72W5Mg9r","WaWsvru4UG","M3zXLcShY2","uJScXhi5X7","prNT6GXdoH","uupzkGXdoH","Mkgy8BGaQY","FLsphulk41","FFDuidQ586",
+"QworuuTacx","0YAGHSWfou","uPX7G2DREs","QClRLZv7z0","v2eC35iGN5","VBjhziKqhr","TXQ0ZZv7z0","h1zcHUvlv4","QClRLfcJOy","0PktI0Wr5y",
+"MGlTF7lUXZ","DLhzMCp3mZ","aL6AJJRJQB","45cIH5Drn0","jfREuix74r","9iGoTStlDJ","jS1ajzFgtB","ciuWzO3iyQ","55rfB7Ow5C","5drc6Twano",
+"fmIK1vOqCE","lpF6WVBjhz","AXpwEs4786","Y1mC0hSSvQ","RACuj4QMc9","oGu6x6AFT0","MojnPRsQUq","pAhR1mX2GE","cL0aEuJScX","Waim6guMb8",
+"RkQkei3pyd","Y1mC0uvf7A","fLNg89iGoT","QClRLRACuj","pAhR1SWfou","Ul4a1pmeCd","HRxd8lH1kt","gjUTuprNT6","5drc6atef2","MojnPeuZA5",
+"Ss0ZucL0aE","24ARFxXTI4","UlU3Md7vjM","RkQkeZJTXH","MojnPRmDcr","PYBf4QnJ1S","WMiS3Y1mC0","aFFssuPX7G","d7vjMHRxd8","8xEKzx3LDe",
+"hYBCKRACuj","K20wKyvOMI","0BmCyydG8U","Oz8yZ4W0Tl","S77LHDz1R3","cL0aEVerEA","QbxXcgdQsS","8U2nU9rlg9","Q6LixU3yw5","h1zcHuJScX",
+"gjUTukZANm","Q6Lix2TRI7","QWxoTaDGtS","hSSvQatef2","uJScX16lHc","0YAGHRkQke","CqqaDJIqXi","iwzGkGXdoH","DcpWBAOgEe","WmadANhXdu",
+"fmIK1gtCA5","VBjhzZuDtD","o8UydMkgy8","5drc6faHir","P6bcgY1mC0","CIShGcShY2","AgJHQrz7Ut","Yh1hFWaim6","t59lR5nmWv","NAFuw5iGN5",
+"SWfou5iGN5","K20wKG1RhS","iKqhr3otm6","BpYhVJkzUn","6q6L9i7WMQ","ThjNnsoy9t","RACujlweGy","5VZjSFPfSE","brhlQlXFOB","ZUnqtVNCPd",
+"Cp3mZ1j5L8","v2eC39y4lw","okgRiVNCPd","yEfy9Ul4a1","IRh48CK5W7","ksJbytuDyS","lkMUAm4bxU","VLTy6FLsph","DLhzMEdBKc","pFrrl6AFT0",
+"S2Dfu14FLR","uupzklj07Q","AIYUuksJby","lXFOBRBhp0","ZJTXHOUqFM","5drc6QYxC0","x3LDeOUYuF","v1Hlnsoy9t","EoToP5nmWv","wDajXBFkb8",
+"lH1ktIjTwP","zmLYDvOqCE","55rfBWaWsv","jeskSTwano","jzUqR9eoRc","5IhmGPb1pa","aDGtSOHaBz","tAOsrMGlTF","cQOnv4QMc9","8FmFHl83Ud",
+"faHir9y4lw","1LB1L3weIF","iwzGkI7p2a","uTacxJIqXi","jiVBPChuy3","ZUnqtfqypy","Qworu0MR5X","dpe1vZJTXH","0Kyfsaez9y","wDajX9eoRc",
+"zFgtBaDGtS","LewvMXyPZN","d85a9lweGy","ThjNnMkgy8","k85Aefqypy","EOE1oCxVEf","0BmCyFLsph","OHaBzGSQwj","FLsphSmGzv","VIlwPjtn0X",
+"0ao3lsoy9t","sqVrfy94nw","DQimpKsjRK","piJSksuY4x","jSjS3SjskQ","yluBxpv0i7","O3iyQReKEW","fcJOyy94nw","SjskQJkzUn","JIqXitaOXK",
+"uJScX0YAGH","djsrv7fKYU","bZLvSMaJQs","PYBf4soy9t","jiVBPNcICA","5Mg9rQbxXc","fcwDaMezSW","SWfoulj07Q","uvf7AuAWyp","5nmWv9y4lw",
+"FhtglbrhlQ","I7p2awDajX","hi5X7618Di","i7WMQMGlTF","AmdQd5Mg9r","HzZT8lXFOB","HlUbFrhl0J","CNHmvFxX9q","zz4ZUAOgEe","8TxD7OUYuF",
+"J2mQi24ARF","CIShGdpe1v","jtn0XMkgy8","ix74rK4GS8","pFrrl2Yz7E","16lHcBbwgA","iKqhrPOUYS","lkMUARkQke","ix74rlweGy","v8yFNkZANm",
+"LbRTHzY1GY","BbwgAX6Pin","brhlQuPX7G","ni2v1uTacx","TCgPpxciqp","rhl0JJ2mQi","IjTwPMmKGJ","Yf2EcblLA9","JkzUnUlU3M","JIqXio8Uyd",
+"Q6Lix8RCUA","mX2GE2Nslm","zQt6Q0MR5X","RxrsmTa8f6","B3qemYf2Ec","iqv4kRsQUq","i3pydyEfy9","J2mQiEdBKc","1v5hHwDajX","RkQkedjsrv",
+"MK07YgIYvE","jtn0Xuvf7A","M3zXL7ku1p","OxWIHK20wK","MezSWbrhlQ","pAhR1qUJMd","faHirRpBQm","JXljWvOqCE","D6rByCK5W7","TCgPpJXljW",
+"vkCHHHRxd8","XflUqVBjhz","kB5nPEoToP","Nxx9Vh1zcH","Gv3FqCqqaD","guMb8In3NS","Y1mC0VIlwP","POUYSKZamH","i7WMQiwzGk","W7cTsNo0Qb",
+"uZPqglweGy","D6rByQWxoT","fcwDauupzk","djsrvHfyNQ","fFDrJlj07Q","wDajXRzaZA","pvgjSdjsrv","AkKTkfmIK1","Gv3Fqpv0i7","mz8gxguMb8",
+"GWqqXjeskS","OUqFMpv0i7","qaofNxciqp","0ao3lFjHXR","okgRi7hyVv","B3qemVjCZq","wiHrZeuZA5","BGaQYIBe8k","NOHszMezSW","OxWIHaFFss",
+"xReeckB5nP","LbRTHydG8U","B3qemzQt6Q","580YDyvOMI","FPfSE2ZHdk","U3yw5QbxXc","kB5nPqQxHP","Uvlv47Ow5C","x3LDev2eC3","lViBvQnJ1S",
+"BpYhV9eoRc","RzaZA9XyT9","vOqCEuAWyp","lj07Q8FmFH","GSQwjuPX7G","JKWYRfLNg8","mz8gxt59lR","HfyNQ7ku1p","M3zXLmX2GE","s4786k85Ae",
+"1j5L824ARF","lm0pDQYxC0","lCMxyt98iW","iB08lO3iyQ","uAWypStlDJ","UlU3M2TRI7","lm0pDOHaBz","lweGypmeCd","580YDix74r","5Mg9rjeskS",
+"QClRLzQt6Q","gf8rI5ZaEz","zz4ZU5drc6","qUJMdjeskS","0h1b1lCMxy","DLhzMFwEJz","bZLvSblLA9","O3iyQWreyP","WmadAZzJHW","lsQGogIYvE",
+"ThjNn9rlg9","kZANmNAFuw","Cp3mZQClRL","MGlTF1j5L8","DQimpiKqhr","Gv3FqRxrsm","UlU3MMaJQs","yvOMIuPX7G","vkCHHvOqCE","pWiOszmLYD",
+"JIqXil83Ud","jiVBPi3pyd","DLhzMPYBf4","14FLRtAOsr","FLsph9rlg9","XyPZNmX2GE","okgRi9iGoT","X6PinRpBQm","POUYS7X3uy","DcpWBNAFuw",
+"hUTw72Nslm","VBjhzpAhR1","EoToP7lUXZ","ZzJHWYf2Ec","RBhp0Nxx9V","VjCZqcQOnv","RmDcrGv3Fq","9GXkXCfgr3","iwzGkpWiOs","9eoRc14FLR",
+"HRxd8bZLvS","Ta8f6S77LH","t59lRo8Uyd","5VZjSQ6hMC","8TxD7BCxeC","45cIH7ku1p","9GXkX9XyT9","Ta8f6d85a9","FPfSEMm8si","No0QbQYxC0",
+"FNYIMguMb8","YjB9tMaJQs","s7MxkkB5nP","XyPZNuTacx","lm0pDlsQGo","jtn0XSbRYy","AgJHQyvOMI","CNHmvB3qem","nFqikuPX7G","5VZjS1v5hH",
+"WmadAfcJOy","Y1mC0l83Ud","uLtKsSs0Zu","5Mg9r8RCUA","fFDrJgdQsS","IjTwPDQimp","SmGzvcmXIX","29QAzIjTwP","ECMvUVLTy6","uTacxFGzgp",
+"580YDXflUq","faHirlj07Q","ZuDtD4W0Tl","S77LHfFDrJ","MGlTFv8yFN","DcpWBTXQ0Z","5drc69rlg9","C2IrcJRJQB","lXFOBksJby","M3zXLNOHsz",
+"9GXkXIKxdL","ix74rjSjS3","soy9thYBCK","K20wKgjUTu","BpYhVDz1R3","ZJTXHzbIYY","LbRTHZUnqt","uoStwK4GS8","FPfSE0PktI","zQt6QHRxd8",
+"AgJHQix74r","SmGzv8hJdt","okgRiHlUbF","kZANmbrhlQ","iqv4kCIShG","Fhtglsx5Gl","QnJ1SKsjRK","SmGzviKqhr","FVMxoZ4I1v","VNCPdKASQ8",
+"pFrrlO3iyQ","29QAzK4GS8","DcpWBlj07Q","Chuy3x3LDe","gdQsSTCgPp","AXpwESbRYy","0YAGHbZLvS","Yh1hF8xEKz","lsQGoYf2Ec","OxWIHwDajX",
+"D6rByoGu6x","WaWsvIBe8k","h1zcHHlUbF","UmaEvlXFOB","QbxXcyluBx","ZhwG1Uvlv4","TCgPpEdBKc","aFFss580YD","DQimpcQOnv","lH1kt5IhmG",
+"4dEz6SjskQ","55rfBYw2oU","v8yFN2Yz7E","W3VFHRzaZA","xXTI4lkMUA","BpYhVqQxHP","kZANmzY1GY","P6bcgJkzUn","TXQ0ZRACuj","S2DfuoQ87r",
+"5VZjSUvlv4","5ZaEzuLtKs","zbIYYMojnP","RxrsmW3VFH","O3iyQWPmlx","vLsmSlm0pD","8hJdtjSjS3","WDVWJiB08l","IBe8kHlUbF","ru4UGIKxdL",
+"vkCHHL7cGc","6AFT0KASQ8","DG4sT2DREs","2NslmCIShG","lkMUA4dEz6","i3pyd0PktI","ZhwG1bgJAz","CNHmv14FLR","SmGzv0Wr5y","x3LDe9GXkX",
+"DLhzM1LB1L","In3NSMmKGJ","GXdoH8TxD7","JRJQBZ4I1v","EoToPJKWYR","pvgjSxciqp","ix74rcQOnv","QYxC0JIqXi","n1pmOcL0aE","K20wKWmadA",
+"M6qcGCIShG","piJSkQbxXc","9XyT9EdBKc","WreyPuTacx","Ss0ZufaHir","CK5W71j5L8","wiHrZ2Yz7E","Zv7z0ZzJHW","pvgjSZuDtD","azIWpNxx9V",
+"GWqqXLewvM","BFkb8JkzUn","WPmlx5Drn0","BpYhVo8Uyd","lsQGoYw2oU","1j5L848cHL","7fsYMHP433","pmeCdd85a9","JXljWn8pJ9","KASQ8PYBf4",
+"dmoS7Q6hMC","64s8NK4GS8","suY4xfaHir","16lHcEoToP","lj07QkZANm","9iGoTksJby","8hJdt6q6L9","ksJbyDG4sT","qQxHPCfgr3","SWfouS77LH",
+"QnJ1SHP433","ru4UGL7cGc","yToGWNAFuw","d7vjM7fsYM","QClRLFFDui","d85a92DREs","8TxD7F6PT2","EOE1opWiOs","J2mQil83Ud","WreyPL7cGc",
+"lpF6W0ao3l","OUqFMYf2Ec","uoStws4786","NcICAOUqFM","PYBf4jS1aj","WaWsvlpF6W","OHaBzIKxdL","lH1kt2Nslm","RACujPOUYS","WmadAvOqCE",
+"wiHrZD6rBy","vLsmS0PktI","ECMvUBpYhV","i7WMQTXQ0Z","GXdoHIn3NS","5ZaEz5Mg9r","jiVBPlXFOB","FFDuidjsrv","FxX9qblLA9","Dz1R3VjCZq",
+"8FmFHPOUYS","HzZT8iqv4k","DLhzMM3zXL","uN6r3fLNg8","NOHszulk41","JIqXifFDrJ","48cHLFhtgl","zmLYDFNYIM","7fKYUOz8yZ","AOgEeogLgc",
+"piJSkh1zcH","WreyPDcpWB","L7cGcZv7z0","JJs5mxReec","6AFT0Z4I1v","s478629QAz","zFgtBn1pmO","nFqikru4UG","8FmFHsqVrf","Uvlv4Dz1R3",
+"NhXduuJScX","uvf7As93Ml","Mm8siPb1pa","bgJAz8U2nU","zz4ZUZUnqt","SmGzv5IhmG","pWiOslkMUA","nlaByi7WMQ","HfyNQZv7z0","v1HlnYf2Ec",
+"CIShGW7cTs","45cIHMK07Y","xciqpPOUYS","zbIYYReKEW","tlILtfcwDa","GrDg7Cp3mZ","RmDcrpWiOs","WreyPlH1kt","nFqikfmIK1","U3yw5lkMUA",
+"FnPFBpAhR1","J2mQiMaJQs","fcJOyjeskS","CNHmvzQt6Q","yEfy9sqVrf","No0QbaFFss","S2Dfu5nmWv","MGlTFJRJQB","s93MlNOHsz","ulk41LewvM",
+"sx5GlO3iyQ","yluBxAXpwE","O3iyQzHF1q","KASQ88TxD7","uTacxxReec","uJScXo8Uyd","Q6LixuTacx","v1Hln9y4lw","fLNg85IhmG","pAhR1d85a9",
+"t98iWl83Ud","ZJTXHtlILt","DLhzMGXdoH","jiVBP3weIF","45cIHDQimp","618DiWaim6","2DREsAXpwE","ni2v1b29RJ","VBjhzLbRTH","kB5nPtAOsr",
+"TwanoDLhzM","IKxdLHP433","nFqikcQOnv","7hyVvECMvU","JXljWzz4ZU","X6PinIRh48","hSSvQOUYuF","45cIHfmIK1","lsQGob29RJ","C2Ircru4UG",
+"jtn0Xjtn0X","qQxHPzmLYD","M6qcGhi5X7","Dz1R355rfB","QChxsoQ87r","OHaBzRpBQm","ZUnqtU3yw5","fFDrJ4W0Tl","BCxeC5nmWv","WPmlxJRJQB",
+"dQ586W7cTs","HP433Yh1hF","07n1ci3pyd","ru4UGCK5W7","lm0pDvLsmS","0PktINhXdu","Qworuaez9y","Zv7z05nmWv","hi5X7MaJQs","vkCHH4QMc9",
+"X6PinLDk6f","RkQkeFPfSE","9XyT95Mg9r","9eoRcpiJSk","9eoRc0MR5X","ZUnqtprNT6","5Namm2TRI7","Ta8f6yEfy9","Ul4a1AXpwE","W3VFH580YD",
+"5ZaEzwiHrZ","uoStwbrhlQ","iqv4kRBhp0","t98iWulk41","vOqCEtvdkD","zqH0WBFkb8","Gv3Fqjtn0X","LDk6fS2Dfu","OUqFMCNHmv","CqqaDU3yw5",
+"In3NSuupzk","okgRiLewvM","soy9tQnJ1S","lsQGoy94nw","8hJdtdmoS7","BCxeChi5X7","fmIK1oVQp6","IjTwPyToGW","FGzgpMmKGJ","ydG8UfcJOy",
+"zz4ZUF6PT2","F6PT2QssNC","taOXK9XyT9","lsQGo4W0Tl","rKDLJhe9IA","ZzJHWOUqFM","HlUbF1v5hH","djsrvfqypy","uQIcz7fKYU","7hyVvFwEJz",
+"SjskQ6q6L9","RBhp04dEz6","Mm8siMGlTF","NOHszzHF1q","mz8gxQClRL","BCxeCPb1pa","YOfrYni2v1","LbRTHNo0Qb","8cVD3rhl0J","B3qemdmoS7",
+"gtCA5P6bcg","2Yz7EydG8U","s4786uPX7G","0ao3lWMiS3","jS1ajWreyP","S77LHPOUYS","k85AeIjTwP","AkKTkHzZT8","jSjS3Nxx9V","tl72WFGzgp",
+"qUJMd7hyVv","HzZT8VBjhz","brhlQGrDg7","iB08ln1pmO","W7cTss93Ml","NcICAnFqik","1LB1LJkzUn","4dEz6BCxeC","pT8wud7vjM","wiHrZHlUbF",
+"pFrrll83Ud","JIqXiAIYUu","F6PT2FxX9q","ulk4124ARF","sx5GluZPqg","Y1mC0dQ586","lCMxyatef2","VerEARxrsm","Nxx9VAXpwE","yofH3QWxoT",
+"yluBxcL0aE","qUJMdB3qem","suY4xTCgPp","7ku1ppAhR1","No0QbKASQ8","Ta8f6lpF6W","7hyVvmX2GE","Mkgy8ksJby","yofH3zmLYD","55rfBMmKGJ",
+"pFrrlJJs5m","CqqaD14FLR","UmaEvRsQUq","07n1cjzUqR","K4GS8OxWIH","0Wr5yTXQ0Z","5Mg9rydG8U","IjTwPuPX7G","zz4ZUFVMxo","SWfouhSSvQ",
+"VLTy6uQIcz","U3yw54W0Tl","8FmFHvOqCE","AIYUu5Drn0","gjUTuMmsIo","Dz1R3dpe1v","lCMxyFFDui","mz8gxn8pJ9","QChxstlILt","8U2nUTa8f6",
+"zHF1qjSjS3","ThjNngjUTu","jiVBPDLhzM","QYxC064s8N","9GXkXeuZA5","RxrsmMmsIo","iB08l7X3uy","Kr8ysDz1R3","SWfouKr8ys","1LB1LIRh48",
+"pv0i7WDVWJ","OUYuFRmDcr","pT8wusoy9t","uZPqgiB08l","AXpwEFxX9q","AOgEe9y4lw","dpe1vUvlv4","WPmlxLewvM","48cHLX6Pin","2Yz7EdQ586",
+"gf8rIReKEW","0MR5XThjNn","zHF1qru4UG","rKDLJBGaQY","Mkgy816lHc","0Kyfs6AFT0","3otm6mX2GE","64s8NuoStw","gIYvEkB5nP","xciqpFxX9q",
+"EoToPW3VFH","suY4xpmeCd","ZuDtDaez9y","FjHXRFcWrW","9y4lwo8Uyd","n1pmOwDajX","n8pJ9AmdQd","qQxHP5nmWv","KZamHk85Ae","EdBKci3pyd",
+"yToGWRBhp0","YOfrYt98iW","jS1ajuN6r3","vOqCEzY1GY","lViBvHlUbF","aDGtSBpYhV","CqqaDfFDrJ","UmaEviqv4k","CqqaDJKWYR","pFrrluupzk",
+"GSQwjv2eC3","RzaZAL7cGc","O3iyQmz8gx","JJs5mgtCA5","MmsIoblLA9","VerEA8TxD7","FVMxoJJs5m","CIShGHzZT8","5Drn0FnPFB","MK07YJJs5m",
+"atef2sqVrf","ECMvUcShY2","sqVrfG1RhS","7X3uyWaWsv","VNCPd7Ow5C","Nxx9V4dEz6","Y1mC0FFDui","TwanobZLvS","LbRTHgdQsS","guMb8GSQwj",
+"WMiS3K20wK","mz8gxRACuj","J2mQiQClRL","sx5GlLbRTH","8cVD3VNCPd","zz4ZUpvgjS","h1zcHZUnqt","2hEEUDLhzM","uN6r3lj07Q","Q6Lixv1Hln",
+"i7WMQfaHir","BFkb8F6PT2","Zv7z0EoToP","cL0aEpFrrl","8TxD70YAGH","BCxeC5drc6","uJScXJRJQB","MGlTFYjB9t","uvf7AQssNC","IBe8kciuWz",
+"ksJbyAXpwE","s4786ZuDtD","y94nwzmLYD","8hJdtuAWyp","SjskQ55rfB","yEfy9gjUTu","y94nwGWqqX","CdyBVFLsph","xXTI4HzZT8","0ao3lRkQke",
+"AgJHQ0PktI","VNCPdGWqqX","pv0i75Drn0","0ao3l29QAz","JIqXigjUTu","iKqhrOUYuF","YjB9t5Mg9r","7ku1pChuy3","5drc6jeskS","jtn0XXyPZN",
+"ogLgcBFkb8","xReecX6Pin","guMb88U2nU","zQt6QCp3mZ","yofH3DcpWB","bZLvSydG8U","8xEKzlm0pD","Oz8yZeuZA5","ThjNnpFrrl","MaJQsvLsmS",
+"b29RJLDk6f","oGu6xJIqXi","ksJbytvdkD","No0Qbni2v1","hSSvQPOUYS","Waim6AmdQd","JXljWlXFOB","ydG8UCdyBV","RBhp0J2mQi","zY1GY5drc6",
+"YOfrYjfREu","zHF1qdhSuH","Waim6SbRYy","1j5L80Kyfs","0Wr5yn8pJ9","FVMxonlaBy","lkMUAuQIcz","HP433LbRTH","VLTy67fsYM","VIlwPvOqCE",
+"618DiAOgEe","fcJOy45cIH","Y1mC0Cfgr3","C2IrcAXpwE","2TRI7JXljW","0KyfsNhXdu","ydG8UzbIYY","JRJQBU3yw5","BCxeCNxx9V","StlDJUmaEv",
+"QClRLlm0pD","lsQGo0MR5X","s93MlpAhR1","LewvMBbwgA","t98iWi3pyd","5Drn0QnJ1S","Chuy314FLR","ZhwG1WDVWJ","uvf7AVprf2","cShY20Kyfs",
+"pmeCdUmaEv","AkKTk0Kyfs","oGu6xZzJHW","xXTI40PktI","F6PT2Z4I1v","zFgtBBCxeC","uAWypzY1GY","RpBQm1LB1L","jS1ajFVMxo","tjQxsSWfou",
+"B3qemt59lR","Oz8yZUmaEv","8U2nUlXFOB","CIShGqaofN","hYBCKxReec","9iGoTxciqp","IBe8kVIlwP","Ul4a17Ow5C","5IhmG2Yz7E","F6PT2OHaBz",
+"ReKEWe6e4z","fcwDad7vjM","M3zXLOHaBz","1v5hHatef2","VerEAru4UG","uLtKsdQ586","iqv4km4bxU","dhSuHbZLvS","ciuWzXflUq","FGzgp8U2nU",
+"YjB9tCIShG","Dz1R39XyT9","zmLYDv1Hln","Yw2oUgIYvE","uAWypiB08l","blLA99GXkX","7fsYMmz8gx","5NammNhXdu","KASQ8cShY2","AkKTkNxx9V",
+"BpYhV5ZaEz","s4786iqv4k","Mkgy8PYBf4","B3qemfqypy","Q6hMCFwEJz","zz4ZUHP433","NhXduFxX9q","rz7Ut7hyVv","WmadAQbxXc","uAWypatef2",
+"55rfBpWiOs","ZUnqtCxVEf","fcJOyZJTXH","jfREu2DREs","JIqXibrhlQ","o8Uyd5VZjS","pT8wuhYBCK","618DiGWqqX","8xEKz9GXkX","L7cGcChuy3",
+"zz4ZUlViBv","Chuy3P6bcg","FPfSEZUnqt","k85Ae55rfB","HlUbFlsQGo","MGlTFPb1pa","FjHXRsuY4x","TCgPpFNYIM","OHaBzOUYuF","lH1kts7Mxk",
+"EoToP2Nslm","45cIHgtCA5","cShY245cIH","6q6L9WreyP","EOE1oo8Uyd","cmXIXn1pmO","ECMvUjfREu","d85a9qQxHP","S2DfupT8wu","WmadALewvM",
+"9eoRc0YAGH","29QAz5drc6","kB5nPpmeCd","dmoS7F6PT2","Mkgy8FGzgp","Q6LixyToGW","7fKYUv1Hln","6q6L9SbRYy","fmIK1ksJby","rz7UtNOHsz",
+"9y4lwHzZT8","HlUbFdhSuH","wiHrZblLA9","5NammEdBKc","mX2GENhXdu","n8pJ9uAWyp","LDk6f5Namm","ni2v1prNT6","M3zXLtl72W","ni2v1QWxoT",
+"5IhmGXyPZN","dmoS7VerEA","hi5X7HP433","0BmCyThjNn","QYxC0QbxXc","AOgEe5IhmG","MK07YCdyBV","FcWrWtuDyS","s7MxkHzZT8","O3iyQ4QMc9",
+"55rfBe6e4z","X6Pin6q6L9","DG4sTkZANm","bgJAztlILt","i3pydBpYhV","G1RhSrhl0J","a00b5AkKTk","MezSWHP433","RACuj45cIH","i7WMQWmadA",
+"BGaQYiKqhr","soy9tMGlTF","FwEJzOUYuF","FwEJzuQIcz","MGlTFReKEW","5Drn0ZzJHW","tl72WZ4I1v","gIYvE0h1b1","Y1mC09rlg9","ZuDtDIKxdL",
+"618Diix74r","RmDcrtlILt","9rlg9LewvM","JIqXi7hyVv","JIqXifcwDa","Z4I1va00b5","AXpwE7fsYM","jS1ajmz8gx","6AFT03otm6","e6e4zRxrsm",
+"soy9tt98iW","RsQUqNOHsz","t59lRiB08l","0h1b19XyT9","iwzGkHRxd8","s4786G1RhS","IKxdLIjTwP","t59lRjfREu","iKqhr1v5hH","qQxHPAgJHQ",
+"POUYSwiHrZ","7fsYMJRJQB","SmGzvQbxXc","4dEz6MmKGJ","fmIK11j5L8","MaJQspmeCd","k85AeuQIcz","kZANmNOHsz","J2mQim4bxU","48cHLiKqhr",
+"WmadARkQke","k85Aen8pJ9","i3pydQbxXc","0MR5XIKxdL","zY1GYVprf2","faHirHzZT8","JXljWlweGy","KASQ8SmGzv","1j5L8AkKTk","G1RhSDcpWB",
+"0Wr5yiKqhr","Gv3Fq0YAGH","ZhwG13weIF","8xEKza00b5","48cHLZUnqt","0KyfsZJTXH","zFgtBZhwG1","5nmWvrhl0J","16lHcXflUq","iKqhrFLsph",
+"zz4ZUTCgPp","8TxD7iwzGk","DQimpRACuj","Nxx9Vjtn0X","Y1mC0Ta8f6","YOfrYUmaEv","0BmCyulk41","yvOMIS2Dfu","tAOsrVIlwP","gIYvEHP433",
+"VerEAnFqik","gf8rIKZamH","brhlQQClRL","s4786tuDyS","2Nslm2DREs","8U2nUhE1Ql","8xEKzsx5Gl","AXpwEUl4a1","5ZaEzYw2oU","dhSuH2Nslm",
+"QWxoTAXpwE","0MR5XMezSW","pT8wuJKWYR","2hEEU55rfB","MK07YVprf2","NcICAjS1aj","ReKEWDz1R3","RzaZAyluBx","FNYIMfLNg8","v1Hln9rlg9",
+"HfyNQbrhlQ","uPX7Gd7vjM","7fsYMgdQsS","n1pmOdjsrv","29QAzi3pyd","JkzUnCp3mZ","suY4xQChxs","lH1ktLbRTH","faHirJkzUn","lViBvTCgPp",
+"pvgjStuDyS","4QMc9iwzGk","J2mQikZANm","2TRI7FPfSE","4W0TllsQGo","dmoS7fcJOy","tAOsrGXdoH","lCMxyd7vjM","AXpwESs0Zu","J2mQilCMxy",
+"Yh1hFtvdkD","dpe1vQ6Lix","GXdoHjSjS3","okgRiqUJMd","wDajX5VZjS","yToGWqUJMd","HzZT8WmadA","GXdoHh1zcH","UmaEvAkKTk","RzaZANo0Qb",
+"x3LDepWiOs","5IhmGQworu","fFDrJpFrrl","d7vjM29QAz","8TxD7L7cGc","blLA97X3uy","QssNCl83Ud","AIYUuStlDJ","zQt6QdhSuH","NhXduCK5W7",
+"NOHszb29RJ","4dEz6Oz8yZ","oGu6xVLTy6","okgRiAmdQd","FjHXRWreyP","uupzk8hJdt","Q6LixFPfSE","pWiOsksJby","CdyBV2Nslm","HRxd8hSSvQ",
+"yluBxru4UG","fFDrJjtn0X","Ta8f6BCxeC","Dz1R3YjB9t","J2mQiVNCPd","lweGyJKWYR","gf8rIZhwG1","LDk6fuJScX","b29RJvLsmS","wiHrZPYBf4",
+"8U2nU2hEEU","b29RJVIlwP","K4GS8Vprf2","QYxC0uJScX","VNCPdhi5X7","aL6AJAmdQd","2Yz7Ea00b5","618Dis4786","07n1cMaJQs","ZUnqt7lUXZ",
+"FFDuiVerEA","nnP8oCdyBV","Nxx9VZ4I1v","0Wr5yi3pyd","29QAzHRxd8","1LB1LjSjS3","5VZjSZuDtD","jS1ajxReec","5VZjSm4bxU","FnPFBFwEJz",
+"v1HlnvLsmS","IKxdLcShY2","GWqqXdmoS7","y94nwfaHir","cQOnvfcwDa","Cfgr3ni2v1","O3iyQfLNg8","pmeCdSjskQ","RsQUquPX7G","Cp3mZFNYIM",
+"Q6hMCYjB9t","Mm8siQssNC","M6qcGVIlwP","v1HlnciuWz","Nxx9Vix74r","lCMxyzz4ZU","5nmWvfFDrJ","0ao3lS2Dfu","pWiOsOUYuF","QworuaDGtS",
+"0PktIh1zcH","wiHrZDQimp","JRJQB0YAGH","GrDg7gdQsS","BCxeCX6Pin","BbwgAxXTI4","Mm8siuZPqg","FcWrWWmadA","0h1b1hE1Ql","IKxdLCdyBV",
+"Yf2EcReKEW","0BmCygIYvE","RkQkeDLhzM","55rfBprNT6","lweGypWiOs","Twano5nmWv","1LB1L9eoRc","7fsYMIKxdL","RpBQmxXTI4","HfyNQIjTwP",
+"618Di3weIF","jfREuFhtgl","F6PT2zz4ZU","xciqpSjskQ","fcwDaCqqaD","fLNg8F6PT2","Zv7z0QbxXc","Kr8ysBGaQY","8cVD3vLsmS","YOfrYnFqik",
+"8hJdtjfREu","ECMvUVNCPd","FPfSE14FLR","0BmCyuLtKs","GSQwj0ao3l","cQOnvs7Mxk","uN6r3MmsIo","Pb1paFNYIM","b29RJKZamH","n1pmOk85Ae",
+"Pb1paM3zXL","CqqaDzY1GY","lXFOBTCgPp","9y4lwazIWp","LewvMjiVBP","s7Mxk55rfB","8TxD7FVMxo","brhlQAkKTk","S2Dfurz7Ut","o8UydWmadA",
+"8RCUAy94nw","Mm8siWMiS3","hi5X7I7p2a","n8pJ9mz8gx","mX2GEn1pmO","wiHrZprNT6","B3qemReKEW","s4786Fhtgl","pWiOs07n1c","JXljW9eoRc",
+"In3NSFjHXR","jzUqRhSSvQ","2Yz7ENAFuw","iKqhrYjB9t","FVMxoMK07Y","AXpwE5iGN5","NcICACp3mZ","n1pmO4dEz6","Fhtglni2v1","OHaBzqQxHP",
+"pmeCdprNT6","NhXdu4QMc9","iB08lt59lR","nlaByBFkb8","kZANmOxWIH","9XyT9QWxoT","MmKGJJIqXi","sx5Gli7WMQ","NcICA7lUXZ","YOfrYcQOnv",
+"tlILtdpe1v","Mm8silj07Q","UmaEvEoToP","DcpWB0ao3l","16lHc9GXkX","fFDrJAOgEe","azIWpTa8f6","atef2MezSW","Waim6FLsph","FGzgptAOsr",
+"64s8NtlILt","Oz8yZIjTwP","iB08luupzk","YjB9tzHF1q","wDajX7ku1p","B3qem2ZHdk","rhl0J29QAz","55rfBtlILt","guMb8O3iyQ","tjQxsRsQUq",
+"9y4lwQbxXc","S77LHQ6Lix","FnPFBTa8f6","L7cGc0YAGH","WmadAd7vjM","RBhp0iqv4k","MK07YCp3mZ","sqVrfJIqXi","oQ87rjfREu","2TRI7piJSk",
+"0Wr5yyvOMI","pWiOsFNYIM","FPfSEv2eC3","jtn0XNAFuw","MojnPkB5nP","Q6LixTCgPp","bgJAzRpBQm","SWfouwiHrZ","CNHmv7X3uy","LDk6fReKEW",
+"dmoS75ZaEz","prNT6JJs5m","fLNg8Fhtgl","bZLvSo8Uyd","OUqFMfmIK1","s93MlQWxoT","5ZaEztvdkD","DQimpfFDrJ","QWxoTJRJQB","XflUqgf8rI",
+"8FmFHguMb8","lH1kt48cHL","5Mg9rhSSvQ","5Mg9rd85a9","VNCPdFjHXR","8xEKzhSSvQ","ZJTXHpiJSk","WDVWJgIYvE","uQIczuvf7A","Q6hMCDz1R3",
+"No0Qb9eoRc","ru4UGECMvU","uvf7AAXpwE","SWfouvLsmS","BbwgAGWqqX","uTacxCfgr3","AXpwEjS1aj","atef25IhmG","lkMUAnFqik","x3LDeiwzGk",
+"cQOnvMkgy8","s93Mlt98iW","29QAzGv3Fq","ThjNnMK07Y","JkzUnOxWIH","fLNg8Kr8ys","guMb8zFgtB","5iGN57fsYM","s4786JJs5m","OHaBzn8pJ9",
+"9iGoThYBCK","ZhwG1d7vjM","uN6r35ZaEz","Ss0ZuZ4I1v","v1HlnThjNn","tjQxspmeCd","l83Ud0PktI","AgJHQOHaBz","MaJQsZJTXH","iwzGkRmDcr",
+"pAhR11LB1L","HP433Mm8si","tlILt1v5hH","QssNCBGaQY","e6e4z7Ow5C","DG4sT4QMc9","29QAzCxVEf","BFkb8SmGzv","TCgPpyofH3","IBe8kRsQUq",
+"ru4UGjzUqR","s4786JkzUn","MezSWHRxd8","OxWIHWreyP","e6e4zLDk6f","tuDySIBe8k","JIqXiJRJQB","euZA5FnPFB","Ss0Zut98iW","FLsphYw2oU",
+"yvOMIl83Ud","ru4UGm4bxU","HlUbFru4UG","ydG8UtvdkD","0BmCyFhtgl","2TRI75VZjS","uAWypPb1pa","tjQxsguMb8","uQIczAXpwE","TCgPp0BmCy",
+"i3pyd07n1c","F6PT25Namm","5drc6XflUq","xXTI4s4786","o8UydCfgr3","2Nslmx3LDe","MmsIoGrDg7","soy9tRxrsm","tvdkDNhXdu","d85a90BmCy",
+"zz4ZUdhSuH","QChxsSbRYy","bgJAzt98iW","hUTw70Kyfs","TCgPpvOqCE","ThjNn2Yz7E","uZPqgpv0i7","AmdQd0h1b1","YjB9tCK5W7","SjskQhi5X7",
+"AgJHQxciqp","S2DfublLA9","fqypy29QAz","zz4ZU9eoRc","x3LDeOHaBz","Vprf2QnJ1S","JkzUn5Drn0","JRJQBhSSvQ","pFrrluoStw","StlDJpAhR1",
+"oQ87r0MR5X","BGaQY45cIH","WreyPuZPqg","uN6r3FVMxo","NcICA5Namm","9XyT9x3LDe","aL6AJh1zcH","5VZjS2hEEU","soy9tVBjhz","0BmCyStlDJ",
+"y94nw64s8N","Dz1R3taOXK","IBe8k8cVD3","aez9yfLNg8","tlILt5Mg9r","oGu6xMkgy8","6AFT0B3qem","64s8NJJs5m","kZANm0h1b1","GXdoHaFFss",
+"s7MxkHlUbF","BGaQYFwEJz","tvdkDy94nw","JJs5mlCMxy","he9IAZ4I1v","hYBCKLbRTH","1v5hHgdQsS","fqypyFjHXR","2TRI7Z4I1v","NcICAl83Ud",
+"cmXIXydG8U","v8yFNMGlTF","FxX9qv8yFN","RzaZAzqH0W","hUTw7GrDg7","M3zXLiB08l","SbRYyzFgtB","uAWyp8U2nU","3otm616lHc","FFDuiOxWIH",
+"soy9tSWfou","5NammtjQxs","RzaZA9eoRc","FPfSEStlDJ","YjB9tfqypy","ReKEWOHaBz","64s8NGXdoH","atef2zbIYY","DcpWBRxrsm","vOqCEv2eC3",
+"DcpWBd7vjM","618DilCMxy","QworuQChxs","9GXkXIn3NS","FVMxoCfgr3","HP4331LB1L","v1HlnM3zXL","UmaEvpAhR1","VNCPd55rfB","No0Qbd7vjM",
+"6q6L9Q6Lix","tvdkDaez9y","sqVrf4dEz6","t98iWQChxs","zY1GYOxWIH","euZA5atef2","P6bcg5drc6","0KyfsDcpWB","tjQxsuQIcz","tjQxsrz7Ut",
+"dmoS7YjB9t","Q6Lixfqypy","b29RJMaJQs","MK07YbrhlQ","QChxs5Namm","5iGN5No0Qb","7lUXZ07n1c","FFDuiAkKTk","VLTy6VNCPd","RBhp07hyVv",
+"4W0TlW7cTs","pvgjS1v5hH","ZJTXHKr8ys","IKxdL5Namm","AOgEes4786","WaWsvCdyBV","Q6Lix8U2nU","fFDrJ9GXkX","prNT6Gv3Fq","5nmWvdjsrv",
+"IRh48Gv3Fq","SbRYyLDk6f","5drc6CdyBV","WMiS3IKxdL","uTacxO3iyQ","QnJ1SJXljW","brhlQUvlv4","4dEz6X6Pin","WreyPuN6r3","uJScXNAFuw",
+"6AFT0SjskQ","lH1ktfLNg8","BFkb8S2Dfu","0PktI7fsYM","9y4lwRkQke","9y4lwFPfSE","JIqXi8U2nU","FNYIMQYxC0","VjCZqjtn0X","2DREs8xEKz",
+"HlUbF0PktI","gjUTu5Drn0","GWqqXv1Hln","vOqCEjS1aj","pv0i7djsrv","h1zcHZv7z0","24ARFoGu6x","ZJTXHMmsIo","5Drn0No0Qb","0YAGHRmDcr",
+"wDajXZuDtD","7lUXZ5drc6","RzaZAuZPqg","SWfouSjskQ","RBhp0aez9y","0KyfsCNHmv","CK5W7DQimp","zbIYY0YAGH","gjUTuBFkb8","dQ586taOXK",
+"StlDJ9iGoT","Yf2EcFFDui","guMb8guMb8","rz7UtfcJOy","EoToPFnPFB","Vprf2ReKEW","K20wKDLhzM","gf8rIDG4sT","9eoRcmX2GE","8xEKzkZANm",
+"qQxHPVIlwP","d85a9YjB9t","aez9y5VZjS","wiHrZLbRTH","fLNg8kB5nP","Zv7z0uQIcz","FNYIM64s8N","AOgEebrhlQ","l83UdO3iyQ","qUJMdMmKGJ",
+"MGlTFCfgr3","Dz1R3gdQsS","GXdoHCp3mZ","0Wr5yFFDui","4W0Tl8RCUA","y94nw8TxD7","EOE1ox3LDe","lj07QbZLvS","G1RhSzbIYY","rz7UtYf2Ec",
+"yluBxQssNC","AOgEexReec","FcWrWtaOXK","WmadAZv7z0","Mm8siNxx9V","zmLYDy94nw","JkzUnCxVEf","gIYvE8hJdt","CqqaDZJTXH","FjHXRgtCA5",
+"Cfgr35nmWv","n1pmOn1pmO","RkQkeJkzUn","GSQwji3pyd","MmKGJn1pmO","he9IAulk41","Y1mC0ThjNn","nnP8ojS1aj","8hJdtM3zXL","FxX9qvOqCE",
+"cShY2azIWp","ru4UGJXljW","2NslmzbIYY","8xEKznFqik","v2eC3FVMxo","pv0i7HRxd8","uTacxfLNg8","L7cGc5Drn0","JJs5mt98iW","AmdQdOz8yZ",
+"OxWIHydG8U","4QMc9euZA5","uvf7AnlaBy","VIlwPblLA9","tAOsrfmIK1","gtCA5djsrv","MGlTFKsjRK","wiHrZUlU3M","yvOMIKASQ8","ru4UG618Di",
+"cShY2zmLYD","SjskQi3pyd","BCxeC6q6L9","gdQsSC2Irc","FnPFBjtn0X","O3iyQVNCPd","OxWIHeuZA5","Mkgy85Drn0","1j5L8KASQ8","RBhp0cmXIX",
+"4dEz6jzUqR","5IhmGNo0Qb","0ao3ldhSuH","M6qcG2Yz7E","rKDLJIKxdL","FPfSE5Drn0","M3zXLzqH0W","jzUqRjS1aj","Zv7z0zqH0W","Rxrsm6q6L9",
+"F6PT2hYBCK","EOE1oWDVWJ","fcJOyJIqXi","2DREsy94nw","BFkb8hUTw7","Cfgr3AkKTk","hE1QllpF6W","iKqhrQbxXc","8xEKzJIqXi","TCgPp1j5L8",
+"RpBQmrKDLJ","brhlQIKxdL","LewvMFPfSE","0KyfsqUJMd","wiHrZDz1R3","CxVEfRACuj","KZamHt98iW","AgJHQeuZA5","CdyBVAXpwE","X6PinFjHXR",
+"VLTy67ku1p","v2eC3DLhzM","QbxXcVjCZq","pvgjSydG8U","FPfSEpv0i7","HfyNQfaHir","HRxd8blLA9","hSSvQJ2mQi","RkQkeOUqFM","JRJQBhe9IA",
+"UmaEv9rlg9","2DREsl83Ud","qQxHPD6rBy","MaJQsOz8yZ","QYxC0h1zcH","ZJTXHThjNn","ZUnqtPb1pa","ix74rKZamH","suY4x2TRI7","jtn0XWmadA",
+"SWfouyvOMI","Uvlv43weIF","FcWrW8FmFH","bgJAzStlDJ","HP433dmoS7","5ZaEzqaofN","2TRI7cmXIX","DG4sTh1zcH","Cfgr3iwzGk","iKqhrIKxdL",
+"lsQGofqypy","7fsYMn8pJ9","d85a9jfREu","n1pmOPYBf4","KZamH7lUXZ","7fKYUe6e4z","QYxC05Mg9r","7Ow5CYjB9t","uZPqgL7cGc","nnP8oLDk6f",
+"0MR5XDz1R3","DG4sTlH1kt","0ao3l8xEKz","wiHrZRsQUq","QYxC0wDajX","ThjNn2TRI7","64s8NVIlwP","fLNg8jfREu","HfyNQ6q6L9","9GXkXjeskS",
+"zFgtBZJTXH","hUTw7ogLgc","lViBvGv3Fq","a00b5y94nw","X6PinqQxHP","b29RJi3pyd","zFgtBzz4ZU","lsQGoRkQke","5IhmGQWxoT","MaJQsFLsph",
+"o8Uyd6AFT0","jtn0XBCxeC","ZhwG1B3qem","BFkb8CdyBV","FFDuiRpBQm","VBjhzaL6AJ","SmGzvWmadA","uvf7AWMiS3","Cfgr3ReKEW","0PktI0ao3l",
+"8hJdtatef2","d7vjMHlUbF","FwEJzCp3mZ","nlaByL7cGc","AOgEeBCxeC","QClRLG1RhS","s47862Yz7E","d85a9Dz1R3","B3qemyEfy9","64s8Nzz4ZU",
+"M6qcGMojnP","a00b5CIShG","24ARFUvlv4","Nxx9VRsQUq","qaofNiwzGk","gIYvEQssNC","5drc6aez9y","Dz1R3GXdoH","jS1ajFwEJz","BCxeCFPfSE",
+"okgRiCK5W7","In3NSQClRL","2NslmDz1R3","e6e4z24ARF","nnP8opv0i7","dhSuHD6rBy","Z4I1v5drc6","fcJOyuJScX","1j5L8qQxHP","aez9yS77LH",
+"wiHrZuZPqg","OUqFM4QMc9","ZJTXHFNYIM","cL0aEYh1hF","lkMUA8RCUA","VerEAb29RJ","2NslmmX2GE","HP433Yw2oU","14FLRulk41","IKxdLpiJSk",
+"14FLRC2Irc","fFDrJxciqp","DG4sTvLsmS","b29RJDcpWB","ZuDtDprNT6","SbRYyQworu","pv0i7NcICA","lH1ktxReec","VLTy6yofH3","AgJHQRBhp0",
+"s4786C2Irc","0YAGHuoStw","07n1czmLYD","aL6AJ5Drn0","lCMxyYjB9t","UmaEvpmeCd","QChxsWmadA","0Wr5yFNYIM","LDk6fQworu","CIShGQnJ1S",
+"jS1ajJKWYR","7fsYMRkQke","MmKGJVNCPd","VerEA9eoRc","8xEKzBGaQY","Uvlv4yEfy9","EdBKcpFrrl","K4GS8AgJHQ","d7vjMHzZT8","TCgPpiwzGk",
+"Pb1paQWxoT","U3yw5vOqCE","mX2GEKsjRK","8FmFHcQOnv","aFFssK20wK","6q6L9i3pyd","uLtKsLewvM","07n1cOz8yZ","tAOsrjzUqR","QChxspFrrl",
+"aez9ya00b5","xReecRxrsm","Yw2oUpiJSk","StlDJpv0i7","TwanoBpYhV","KsjRKs7Mxk","pWiOsNhXdu","24ARFMmsIo","s7MxkPOUYS","atef2GXdoH",
+"cQOnvVprf2","tl72WDQimp","lpF6WBGaQY","9XyT9KZamH","ZhwG1MmsIo","LbRTHJKWYR","Cp3mZl83Ud","45cIHCfgr3","t98iWYh1hF","Cp3mZX6Pin",
+"WaWsvk85Ae","xReecqaofN","MK07YHlUbF","KsjRKQYxC0","HRxd8nFqik","ZuDtDnnP8o","uAWypDG4sT","dhSuHpiJSk","K20wKCxVEf","v8yFNqUJMd",
+"wiHrZe6e4z","cQOnvVNCPd","FxX9qpmeCd","FNYIMY1mC0","J2mQiGXdoH","MaJQsUmaEv","QWxoTNAFuw","QYxC0hYBCK","SjskQHRxd8","7fKYUM6qcG",
+"2hEEUoGu6x","QssNCOHaBz","bZLvSFjHXR","1v5hHtjQxs","aDGtSb29RJ","D6rByk85Ae","gIYvEMezSW","X6PinAXpwE","24ARFRkQke","SbRYyNOHsz",
+"CIShGzHF1q","VBjhzWDVWJ","xReec14FLR","CIShGJIqXi","JIqXiTa8f6","ZuDtDjzUqR","cShY2DQimp","l83UdQYxC0","HP433KASQ8","Mm8siB3qem",
+"5Mg9razIWp","ZuDtDJXljW","7Ow5CjfREu","TXQ0ZZhwG1","QssNCW7cTs","TwanooGu6x","djsrvTCgPp","DcpWB7fsYM","Gv3FqSmGzv","0h1b1okgRi",
+"cL0aEX6Pin","gdQsSFLsph","RACujyluBx","4QMc9ZzJHW","VNCPdyvOMI","0BmCyECMvU","Gv3FqO3iyQ","nlaByNcICA","QChxsn8pJ9","Yh1hFzz4ZU",
+"P6bcgC2Irc","x3LDe29QAz","Cfgr35drc6","Q6LixblLA9","xXTI47ku1p","d85a9P6bcg","CqqaDdmoS7","Chuy30PktI","t98iWVerEA","8cVD364s8N",
+"pFrrlRACuj","1LB1LAOgEe","hi5X7S77LH","uoStwFVMxo","fLNg81v5hH","JRJQBX6Pin","RACujB3qem","MaJQsYOfrY","RmDcrKsjRK","JXljWwDajX",
+"hYBCK580YD","gjUTulXFOB","MK07Y45cIH","7fKYUn8pJ9","zqH0Wjtn0X","pv0i7Zv7z0","cShY20PktI","Yf2EcP6bcg","HlUbF1LB1L","b29RJ9y4lw",
+"pAhR1Yf2Ec","gjUTujeskS","EoToPk85Ae","qaofNTCgPp","Ta8f6Dz1R3","6q6L95VZjS","oVQp6yluBx","GXdoHhSSvQ","2hEEUCp3mZ","YjB9tBbwgA",
+"0KyfsAkKTk","7lUXZdhSuH","7hyVvJRJQB","zQt6Qt59lR","8cVD3aez9y","bgJAzCNHmv","v2eC38hJdt","CIShGAXpwE","IBe8kokgRi","h1zcHeuZA5",
+"tvdkDEoToP","GrDg7Z4I1v","7hyVvm4bxU","zQt6Qs7Mxk","yvOMIdmoS7","AXpwEoGu6x","OxWIHStlDJ","BpYhVhUTw7","blLA9mz8gx","8U2nUbgJAz",
+"9y4lwFVMxo","hE1QlKr8ys","L7cGcAgJHQ","MmKGJs7Mxk","nlaByatef2","6AFT0cL0aE","cQOnvuAWyp","FwEJzrKDLJ","RmDcrazIWp","D6rBy45cIH",
+"jS1ajHzZT8","4dEz6IjTwP","24ARFYw2oU","VLTy6hYBCK","OUYuF9eoRc","uJScXqQxHP","hYBCKRpBQm","WaWsvWaWsv","ix74rSjskQ","MGlTFatef2",
+"yToGWZhwG1","CNHmvCIShG","l83UdCK5W7","0KyfsWaim6","oQ87rlsQGo","FwEJzzz4ZU","FnPFBS2Dfu","gdQsSjiVBP","IjTwPdpe1v","d7vjMh1zcH",
+"2DREspAhR1","uN6r3GrDg7","dQ586a00b5","VBjhz3otm6","CIShGOxWIH","euZA5WaWsv","1j5L814FLR","7X3uyJKWYR","LbRTHuoStw","0MR5Xmz8gx",
+"QnJ1SCfgr3","qQxHPguMb8","OxWIHlpF6W","gIYvEWPmlx","nnP8o7X3uy","RACujIBe8k","4QMc9POUYS","v1HlnpvgjS","Mm8siXyPZN","okgRiv8yFN",
+"LewvMKr8ys","POUYSmz8gx","lXFOBQWxoT","DLhzM7ku1p","ReKEW55rfB","5ZaEzgtCA5","XflUq24ARF","aFFsss93Ml","FVMxoIn3NS","qaofNfmIK1",
+"NhXduAmdQd","sx5Gllm0pD","VjCZqKZamH","dhSuHFcWrW","ZUnqtb29RJ","14FLRBbwgA","07n1cfcJOy","pv0i7h1zcH","piJSkOUYuF","BpYhVVjCZq",
+"tvdkDlViBv","Pb1pacL0aE","s7MxkZ4I1v","7hyVvzY1GY","RsQUqStlDJ","jiVBPokgRi","AIYUuhe9IA","ZUnqtpvgjS","BFkb8ZJTXH","LewvMzHF1q",
+"QssNCLewvM","QChxs55rfB","bZLvSfqypy","i3pydsoy9t","pWiOsSbRYy","48cHL07n1c","dQ586oVQp6","VBjhzF6PT2","GSQwjguMb8","lpF6WPb1pa",
+"dmoS7k85Ae","h1zcHd85a9","FnPFBKr8ys","Yw2oUKZamH","n8pJ9soy9t","Q6hMCv1Hln","zbIYYgtCA5","d7vjMGXdoH","ECMvUO3iyQ","zbIYYKASQ8",
+"9iGoTy94nw","48cHLMojnP","fLNg8zqH0W","zHF1qMGlTF","d85a9nnP8o","M6qcGQnJ1S","xciqpNcICA","Kr8ysKr8ys","8hJdtMojnP","OUYuF7hyVv",
+"sqVrfjfREu","cQOnvcQOnv","rKDLJEoToP","14FLRvLsmS","uZPqgxReec","ogLgcrz7Ut","16lHclpF6W","2TRI7wiHrZ","uQIczb29RJ","8TxD7FNYIM",
+"Ss0ZulpF6W","tuDySfqypy","nlaByh1zcH","1LB1L8cVD3","QChxsMK07Y","tAOsrYh1hF","VNCPdMGlTF","In3NSIBe8k","D6rByNOHsz","DLhzMdQ586",
+"55rfBZUnqt","8hJdtAkKTk","yvOMIAmdQd","azIWpIBe8k","Yf2EcJXljW","dhSuHCNHmv","lweGylH1kt","azIWp2ZHdk","wDajXokgRi","POUYSulk41",
+"UlU3MBCxeC","ulk41JKWYR","tAOsro8Uyd","CIShGUlU3M","aFFss24ARF","24ARFguMb8","MezSWTXQ0Z","xReech1zcH","1LB1LFwEJz","b29RJWPmlx",
+"7X3uyPYBf4","GWqqXkZANm","NAFuw8RCUA","GWqqXAgJHQ","iB08lK4GS8","UmaEvTa8f6","GWqqXAXpwE","ulk418FmFH","7ku1prz7Ut","jfREuazIWp",
+"S77LHCdyBV","gjUTuwiHrZ","O3iyQVIlwP","tjQxsvOqCE","lCMxyAgJHQ","3otm69XyT9","ZhwG1t59lR","lsQGoVerEA","fcwDaGXdoH","NOHsz29QAz",
+"taOXKJ2mQi","lm0pDdpe1v","djsrv9eoRc","t59lRQYxC0","gtCA5Oz8yZ","jzUqRtaOXK","zQt6QlViBv","S77LH64s8N","MaJQsLDk6f","ECMvUMmsIo",
+"BCxeC9XyT9","64s8NKr8ys","S2DfuazIWp","NhXduDcpWB","t98iW6q6L9","lkMUASbRYy","QChxsVerEA","UlU3M9XyT9","8TxD7i3pyd","L7cGcHRxd8",
+"prNT6uvf7A","d85a9nlaBy","FhtglGv3Fq","D6rByFxX9q","vLsmSFwEJz","uTacxBGaQY","K20wKt59lR","24ARFWMiS3","gIYvE5IhmG","CIShGFNYIM",
+"lsQGoChuy3","e6e4zAIYUu","2Nslms93Ml","azIWpIRh48","2TRI7dmoS7","F6PT2FwEJz","djsrvUmaEv","3weIFIRh48","FxX9qqaofN","EOE1oFNYIM",
+"6q6L9AXpwE","HzZT8JKWYR","0ao3lokgRi","QYxC0nnP8o","rhl0JYh1hF","zmLYDC2Irc","piJSk14FLR","DcpWBW7cTs","ZuDtDIBe8k","VNCPduAWyp",
+"gtCA50BmCy","y94nw3weIF","CxVEfZ4I1v","EdBKc4W0Tl","xciqpXyPZN","dpe1vKASQ8","DQimpGWqqX","WreyP64s8N","RkQkezz4ZU","uvf7AQWxoT",
+"qUJMd0MR5X","CqqaDRxrsm","zHF1qPYBf4","0PktIhE1Ql","XflUqiqv4k","lpF6WReKEW","pmeCd0BmCy","b29RJDQimp","2DREsv1Hln","OUqFMJkzUn",
+"POUYS8TxD7","QYxC0FLsph","fqypy3otm6","faHirpWiOs","StlDJBGaQY","XyPZNfcwDa","nnP8ob29RJ","gdQsS5Namm","vOqCEvkCHH","t98iWnlaBy",
+"uLtKsEoToP","ThjNnZ4I1v","JRJQBFGzgp","7X3uyOHaBz","AkKTkYw2oU","RkQke9eoRc","pFrrlBCxeC","BpYhVni2v1","55rfBRACuj","blLA9brhlQ",
+"WmadA5Namm","d85a9BpYhV","GXdoHhE1Ql","VLTy6Waim6","C2IrcuN6r3","uupzkksJby","UmaEvx3LDe","QbxXcGv3Fq","HRxd8yToGW","M3zXL2TRI7",
+"IBe8k0BmCy","euZA5YOfrY","0h1b1l83Ud","Dz1R3jiVBP","IjTwPlj07Q","v1Hlnv2eC3","zqH0WqaofN","Mm8si8TxD7","tvdkDqUJMd","1LB1Lpv0i7",
+"lXFOBs7Mxk","s4786FwEJz","4W0TlkZANm","7Ow5CFPfSE","wiHrZlm0pD","IjTwPHlUbF","qQxHPjtn0X","hi5X7ThjNn","RpBQmjfREu","hUTw7Z4I1v",
+"hi5X7uQIcz","s47860h1b1","8FmFHWmadA","uQIczCp3mZ","ru4UG5ZaEz","RmDcrix74r","uTacxGv3Fq","lXFOBWaim6","45cIHHRxd8","gtCA5ydG8U",
+"VIlwPoQ87r","TCgPpguMb8","mX2GEDLhzM","B3qemCK5W7","Oz8yZChuy3","a00b5SmGzv","ZuDtD1LB1L","Ul4a1MmsIo","Ta8f6Ss0Zu","Mkgy8JRJQB",
+"ReKEWChuy3","fmIK1C2Irc","uZPqgUmaEv","QChxsAOgEe","D6rByIn3NS","Rxrsm2Yz7E","B3qemblLA9","K20wKGXdoH","7fsYM9iGoT","djsrvyEfy9",
+"9eoRc0h1b1","EdBKcd85a9","SWfouBGaQY","ReKEWzqH0W","mX2GEzz4ZU","h1zcH9GXkX","uPX7GQ6Lix","uQIczs93Ml","WDVWJTXQ0Z","48cHLjS1aj",
+"ulk41uZPqg","HRxd816lHc","i3pydrz7Ut","7lUXZcQOnv","uoStwMK07Y","CK5W76q6L9","t59lRksJby","VBjhzcL0aE","pmeCdOxWIH","zFgtBiwzGk",
+"FnPFBd7vjM","tAOsr6q6L9","2ZHdkOUqFM","8xEKzQWxoT","MGlTF6AFT0","8hJdtMm8si","YOfrYOxWIH","9iGoT0MR5X","dpe1vzQt6Q","tvdkD7fKYU",
+"MaJQsfaHir","tvdkDfqypy","uJScXxciqp","a00b5x3LDe","t98iWuvf7A","k85Aes4786","RmDcrjSjS3","7fsYMUlU3M","0BmCyaez9y","Yh1hFdmoS7",
+"Mkgy8iqv4k","JJs5mEoToP","zQt6QW7cTs","taOXKFNYIM","vLsmSQ6Lix","8RCUAv2eC3","WmadApFrrl","YjB9tFVMxo","azIWpGv3Fq","m4bxUm4bxU",
+"EoToP8RCUA","ReKEW45cIH","OUqFMWMiS3","WreyPTCgPp","8cVD35Namm","ulk41J2mQi","JkzUnhYBCK","uLtKsHzZT8","t98iWVIlwP","gjUTuaFFss",
+"e6e4zoQ87r","7fsYMAmdQd","AIYUupmeCd","nnP8oNAFuw","5NammhUTw7","7fKYU2Yz7E","taOXK2Nslm","14FLRWDVWJ","aDGtSJXljW","9rlg99GXkX",
+"GXdoHMojnP","oGu6xzFgtB","lkMUA3otm6","lViBviKqhr","Cp3mZfLNg8","L7cGc8hJdt","HP433VjCZq","fqypycShY2","Mkgy8IBe8k","KsjRKWaim6",
+"nnP8oUlU3M","uPX7GCdyBV","cmXIXG1RhS","UlU3Mpv0i7","NOHszJXljW","b29RJqaofN","xXTI4Ul4a1","dQ586t59lR","2ZHdkcL0aE","aez9yS2Dfu",
+"jiVBPCqqaD","0YAGH9iGoT","y94nwStlDJ","F6PT2gjUTu","2ZHdkyEfy9","gdQsSiqv4k","pFrrlS2Dfu","SbRYyuupzk","l83UdNo0Qb","n8pJ9VNCPd",
+"wiHrZ0PktI","t98iWd7vjM","7fKYUJ2mQi","BFkb85ZaEz","gdQsShUTw7","D6rByyEfy9","jiVBPOUqFM","Vprf25iGN5","iB08lYw2oU","FGzgpVBjhz",
+"fcJOyAOgEe","0PktIv8yFN","NcICAjeskS","xciqpKr8ys","tjQxsJJs5m","v8yFNfmIK1","8hJdtVBjhz","GXdoHCIShG","MojnPblLA9","OUqFMWaim6",
+"Cp3mZ2hEEU","EOE1o5ZaEz","h1zcHL7cGc","gf8rI9y4lw","5Drn0WDVWJ","lCMxyl83Ud","zz4ZUChuy3","14FLRDG4sT","X6PinprNT6","8cVD3uupzk",
+"WmadAx3LDe","zQt6QZuDtD","ZhwG1CIShG","VerEAFFDui","8RCUA0h1b1","ZhwG1DLhzM","9y4lw4dEz6","atef2Yw2oU","WMiS3v8yFN","suY4xY1mC0",
+"EoToPfcwDa","v8yFNgf8rI","kZANmM3zXL","QChxs7fsYM","uQIczi7WMQ","blLA9hSSvQ","3weIFtl72W","n1pmOuupzk","GXdoHFNYIM","AOgEeqaofN",
+"0h1b1uLtKs","Vprf2SmGzv","vLsmSYOfrY","MojnPHP433","7lUXZRkQke","4W0TlAkKTk","Cfgr30Wr5y","lViBvAgJHQ","In3NSRxrsm","yluBxVNCPd",
+"KASQ8HlUbF","QssNC7ku1p","6AFT0n1pmO","Ta8f60BmCy","jSjS3zY1GY","HzZT8YOfrY","dpe1vJXljW","BbwgAFhtgl","iqv4kWaWsv","fcwDa5Namm",
+"NAFuwOUqFM","9XyT9gtCA5","SmGzvt98iW","ZhwG1hE1Ql","ulk41hi5X7","ZUnqt0Kyfs","tjQxstlILt","RkQkelViBv","S77LHLDk6f","Dz1R38xEKz",
+"tlILtni2v1","jS1aj6AFT0","JkzUntlILt","fFDrJlpF6W","Uvlv4CxVEf","dmoS7tjQxs","zFgtBfcwDa","CqqaDjeskS","djsrvCp3mZ","AgJHQdhSuH",
+"2hEEUK4GS8","8FmFHG1RhS","CdyBVni2v1","zqH0Wlm0pD","M6qcGyEfy9","KASQ8GWqqX","pFrrlvOqCE","QbxXcfFDrJ","7fsYMMaJQs","cShY2DcpWB",
+"DLhzMZuDtD","MmsIocQOnv","d85a914FLR","hE1QlvOqCE","NAFuw9y4lw","QChxs8FmFH","MmsIo7hyVv","oGu6xQ6hMC","I7p2aJXljW","uQIczMezSW",
+"HzZT8XyPZN","QWxoTs7Mxk","5Drn0QClRL","djsrvzFgtB","OUqFM9y4lw","zz4ZUfaHir","StlDJuvf7A","GSQwj14FLR","SWfouTa8f6","gf8rIfmIK1",
+"FFDuijeskS","zz4ZUCdyBV","m4bxUuQIcz","FcWrW9GXkX","0h1b1FcWrW","G1RhSMezSW","lm0pDulk41","QClRLOHaBz","jeskSDcpWB","Cp3mZZv7z0",
+"FwEJzt98iW","Ul4a1wDajX","0h1b1pFrrl","Y1mC0lpF6W","C2Ircv1Hln","cL0aEZuDtD","YOfrYBGaQY","MK07YTa8f6","dpe1viKqhr","hYBCKPYBf4",
+"S77LHOz8yZ","iKqhrL7cGc","RmDcrfmIK1","SbRYyMojnP","t98iWhi5X7","5Namm0MR5X","580YDPYBf4","0Wr5yiB08l","zFgtBQbxXc","7fKYUfFDrJ",
+"Q6LixRxrsm","v8yFNHP433","WaWsvCp3mZ","MmKGJ5VZjS","4dEz6Ul4a1","HfyNQGv3Fq","VerEABbwgA","vLsmS7lUXZ","l83Uduupzk","zqH0WHP433",
+"16lHc2hEEU","s4786kB5nP","v1Hlnn1pmO","Cfgr30ao3l","16lHcYh1hF","5nmWvwDajX","POUYSuAWyp","aDGtS5iGN5","yEfy90Kyfs","LewvMlViBv",
+"atef2zY1GY","QYxC02hEEU","i7WMQB3qem","uTacxTCgPp","4W0TlBbwgA","L7cGcuZPqg","KsjRKEoToP","Yh1hFNxx9V","nlaByU3yw5","qUJMdQnJ1S",
+"vOqCEhi5X7","14FLRFcWrW","LewvMNo0Qb","AgJHQRpBQm","rhl0JuN6r3","ix74r7fKYU","uZPqgatef2","D6rByciuWz","S77LHOUqFM","PYBf4CIShG",
+"9iGoT5Mg9r","zbIYYiwzGk","5IhmGZJTXH","KsjRKZuDtD","pWiOsTXQ0Z","lj07QFjHXR","uTacx0Wr5y","Yf2EcpWiOs","WMiS3jfREu","hUTw7WaWsv",
+"9XyT9DLhzM","aL6AJd7vjM","Oz8yZGWqqX","djsrvy94nw","ksJbysuY4x","FNYIMBFkb8","W7cTsZJTXH","IKxdL8hJdt","AgJHQ7hyVv","MaJQstlILt",
+"FxX9q8TxD7","SbRYys4786","v1Hlnk85Ae","K20wKYh1hF","QClRLEoToP","vLsmS8U2nU","jiVBPRmDcr","lpF6WaL6AJ","fcJOy7Ow5C","FxX9qguMb8",
+"O3iyQmX2GE","tuDySatef2","MGlTFNxx9V","4W0TlChuy3","aL6AJNOHsz","bgJAzECMvU","rhl0JpAhR1","HRxd88hJdt","k85AeRmDcr","HzZT8S2Dfu",
+"HfyNQBFkb8","CqqaDpAhR1","QChxsxXTI4","7ku1pSs0Zu","GSQwj7fKYU","FLsphsoy9t","i7WMQ5nmWv","cShY2QChxs","lCMxypv0i7","pWiOsX6Pin",
+"iwzGk5iGN5","D6rBy0BmCy","sx5GlOHaBz","MezSWVerEA","ZzJHWCp3mZ","sqVrfd85a9","Kr8ys2hEEU","3otm61LB1L","WDVWJjiVBP","qUJMdZuDtD",
+"cShY2uZPqg","7Ow5C1v5hH","6q6L9l83Ud","uN6r3GSQwj","cmXIX9GXkX","VjCZqDLhzM","RsQUq07n1c","DcpWBi3pyd","9GXkXVprf2","iwzGkZuDtD",
+"l83Ud0Kyfs","taOXKuupzk","zmLYDM6qcG","tAOsr0YAGH","8cVD3fcJOy","No0QbjS1aj","ulk41ZUnqt","zmLYDhE1Ql","Uvlv4iKqhr","RmDcrCK5W7",
+"aFFssFhtgl","AkKTkdjsrv","RxrsmS2Dfu","PYBf45drc6","yEfy9G1RhS","55rfBciuWz","ksJbyQClRL","faHir0PktI","WDVWJUvlv4","BFkb8fcwDa",
+"dQ586vLsmS","29QAzjeskS","JRJQB7lUXZ","RkQke5VZjS","7lUXZuAWyp","4QMc9gIYvE","JJs5muLtKs","BGaQYx3LDe","pmeCdpFrrl","DcpWB7X3uy",
+"Cp3mZMmKGJ","ThjNnb29RJ","0h1b17Ow5C","lpF6WokgRi","t59lRFwEJz","Pb1pauPX7G","Cp3mZUl4a1","ZhwG1BbwgA","RACuj0BmCy","uAWyp0BmCy",
+"Cp3mZDz1R3","brhlQXyPZN","ZuDtDsx5Gl","TXQ0ZCNHmv","v1HlnRsQUq","0ao3lqQxHP","Ta8f6ciuWz","i3pydo8Uyd","pWiOsrKDLJ","ulk41B3qem",
+"rKDLJzFgtB","7fsYMI7p2a","piJSk2ZHdk","RkQkeFLsph","uAWypzmLYD","EOE1o9iGoT","HfyNQyofH3","WreyPTa8f6","UmaEvuoStw","dhSuHCK5W7",
+"4dEz6prNT6","2Yz7EStlDJ","6AFT0fqypy","DcpWBFNYIM","SjskQi7WMQ","qQxHPkZANm","DcpWBHRxd8","pFrrlmX2GE","JRJQBpvgjS","BGaQYOUYuF",
+"QWxoT0Kyfs","y94nwciuWz","DcpWBAmdQd","W3VFHY1mC0","DQimpOUYuF","X6PinlweGy","RsQUq5nmWv","HRxd8ni2v1","qUJMdZUnqt","dQ586DcpWB",
+"prNT6StlDJ","OUYuFCp3mZ","ZuDtDkZANm","GrDg7FGzgp","WmadAjtn0X","5ZaEz7Ow5C","vkCHHGSQwj","djsrvsqVrf","ZhwG1UlU3M","JRJQBHfyNQ",
+"pv0i7Kr8ys","LbRTHpmeCd","W3VFHxciqp","Y1mC09y4lw","2hEEUNAFuw","RxrsmL7cGc","J2mQiCIShG","LbRTHs7Mxk","IBe8kiKqhr","9GXkX24ARF",
+"uupzkVjCZq","uTacx0MR5X","i7WMQzqH0W","yToGWCNHmv","G1RhSNxx9V","CdyBVDQimp","SjskQUvlv4","Yh1hFfcJOy","B3qemU3yw5","EOE1oMaJQs",
+"AmdQdUmaEv","FjHXRvLsmS","ZUnqt8hJdt","tAOsrKASQ8","jfREuUlU3M","0MR5Xiqv4k","uoStwY1mC0","fmIK1J2mQi","mX2GEQWxoT","atef2pAhR1",
+"ni2v1QnJ1S","8TxD7lj07Q","CK5W7nlaBy","AmdQdLbRTH","brhlQni2v1","7X3uyni2v1","RpBQmjS1aj","ZUnqtKZamH","DG4sT0Kyfs","4QMc9okgRi",
+"dQ5864dEz6","wDajXuupzk","lj07QGWqqX","jeskSOHaBz","b29RJSWfou","YjB9tlj07Q","Mm8sipmeCd","uAWypprNT6","9eoRcSs0Zu","i7WMQDQimp",
+"VIlwPpWiOs","6q6L9aL6AJ","VLTy6yvOMI","TCgPp9iGoT","WaWsvs4786","AkKTkpFrrl","LDk6fs93Ml","7hyVvuJScX","HzZT8Q6Lix","Cfgr3pAhR1",
+"gdQsSLbRTH","P6bcg8FmFH","0YAGHRsQUq","uTacxv2eC3","B3qemMojnP","KZamHdQ586","jSjS3yEfy9","jzUqRfLNg8","5ZaEzGWqqX","qQxHPgf8rI",
+"HfyNQ8FmFH","Pb1paHP433","2NslmuN6r3","m4bxUMK07Y","atef2yEfy9","2DREsNcICA","JIqXiUmaEv","45cIHdjsrv","aDGtSVLTy6","G1RhSuoStw",
+"iwzGkRzaZA","G1RhSEOE1o","24ARFpmeCd","hYBCKo8Uyd","iB08lpWiOs","XflUq5ZaEz","EdBKcVjCZq","NAFuwuLtKs","b29RJhSSvQ","D6rByhi5X7",
+"ThjNnLDk6f","BCxeCuLtKs","KsjRK9y4lw","NhXdu1v5hH","29QAzhE1Ql","JRJQBAXpwE","FjHXRKr8ys","3otm6dhSuH","pT8wuVjCZq","jtn0XWreyP",
+"SbRYy4dEz6","MmsIoaDGtS","8hJdtFVMxo","HRxd8Waim6","ni2v18hJdt","CxVEfGXdoH","Cfgr3QChxs","SbRYyiB08l","OxWIHQssNC","S77LHUl4a1",
+"zmLYDHfyNQ","FnPFBni2v1","5IhmGD6rBy","48cHLTXQ0Z","yToGWYOfrY","FVMxomz8gx","fFDrJ24ARF","Mm8sifLNg8","nnP8o9eoRc","aDGtSK4GS8",
+"nFqik7Ow5C","x3LDeQworu","618DiStlDJ","HRxd864s8N","lpF6WguMb8","5Mg9rK20wK","RkQkeVLTy6","s7MxkCxVEf","U3yw5QYxC0","9rlg9pFrrl",
+"CdyBVQClRL","KsjRKcShY2","xciqpd85a9","zHF1qGrDg7","ogLgctjQxs","v8yFNFxX9q","NhXduAkKTk","MK07YSs0Zu","GWqqXfFDrJ","BbwgAIn3NS",
+"yToGWb29RJ","ZuDtDOUqFM","Q6hMCpWiOs","RmDcrprNT6","SbRYycmXIX","xXTI4NcICA","RBhp07lUXZ","5Mg9rnFqik","0PktIuQIcz","0h1b1ulk41",
+"JXljWt59lR","G1RhSYw2oU","CxVEftAOsr","n8pJ9yvOMI","Ta8f6Ta8f6","OUYuFNOHsz","QClRLKZamH","S77LHeuZA5","WmadAKZamH","SjskQ618Di",
+"5ZaEztAOsr","MaJQsQworu","zHF1qjfREu","14FLRsx5Gl","TwanoNAFuw","uTacxyluBx","zmLYDS77LH","brhlQNo0Qb","U3yw5prNT6","5Mg9rSbRYy",
+"24ARF5IhmG","RBhp0qaofN","uTacxni2v1","jfREulweGy","EOE1o14FLR","aDGtS7lUXZ","d7vjMlpF6W","tvdkDGrDg7","s4786lH1kt","QWxoTGXdoH",
+"zHF1qh1zcH","ksJbyHP433","FcWrWwDajX","faHirRBhp0","JIqXi8RCUA","lViBvQ6hMC","gIYvEQChxs","o8UydLDk6f","tAOsri3pyd","qUJMdOxWIH",
+"MaJQsNAFuw","v8yFNhYBCK","DQimplsQGo","jiVBPGSQwj","XflUqzFgtB","QChxs5nmWv","SWfou4W0Tl","RpBQmiKqhr","SjskQ7lUXZ","7X3uyM3zXL",
+"n8pJ9CdyBV","BCxeC1j5L8","tuDyS64s8N","uLtKst98iW","BCxeCUl4a1","iB08lfFDrJ","BbwgAKZamH","hSSvQuTacx","VBjhzoQ87r","kB5nPdQ586",
+"BbwgAChuy3","SmGzvlH1kt","CxVEfFjHXR","FcWrWrhl0J","0PktIPb1pa","4W0TltlILt","uupzkL7cGc","0Wr5yulk41","ZJTXHZ4I1v","NAFuwTwano",
+"DQimptuDyS","RsQUq5iGN5","LDk6fzqH0W","0YAGHLewvM","0KyfsLewvM","OxWIHoQ87r","O3iyQ5Namm","tAOsrIjTwP","yofH3hi5X7","Chuy3ni2v1",
+"qQxHPIjTwP","ZJTXHWreyP","qQxHP8RCUA","Uvlv4WPmlx","5nmWvBpYhV","ix74r9iGoT","QnJ1SQworu","5NammIRh48","EoToP0ao3l","JRJQB1v5hH",
+"soy9tZuDtD","UlU3MpFrrl","jSjS3QbxXc","ksJbyWPmlx","14FLR0YAGH","FxX9q7fKYU","JIqXi14FLR","uAWypbgJAz","jzUqRyToGW","RsQUqogLgc",
+"lsQGoAgJHQ","QbxXcaDGtS","AXpwEpv0i7","1v5hHcQOnv","RBhp0vkCHH","t59lReuZA5","ThjNnKsjRK","NAFuw3otm6","QbxXcFLsph","Chuy3NOHsz",
+"suY4xeuZA5","ni2v1XflUq","RACuj1v5hH","B3qem7X3uy","bgJAzQssNC","07n1cdjsrv","CK5W7ciuWz","WDVWJQworu","hE1QlEdBKc","1LB1LgjUTu",
+"bgJAzaL6AJ","ReKEWx3LDe","SbRYyDcpWB","In3NSyluBx","zFgtBdmoS7","euZA5x3LDe","7lUXZs7Mxk","ZuDtD7X3uy","i3pyd0h1b1","CqqaDoVQp6",
+"ZUnqtqQxHP","9rlg9yofH3","W3VFHoGu6x","jSjS3y94nw","W3VFHt98iW","MezSWvkCHH","Gv3FqGXdoH","e6e4zpiJSk","B3qemK20wK","QbxXccQOnv",
+"lkMUArhl0J","wiHrZ2DREs","4QMc9xReec","cL0aEzqH0W","VLTy6suY4x","Vprf2SWfou","SmGzv8xEKz","9y4lws7Mxk","lj07QCqqaD","BGaQYCdyBV",
+"yluBxFLsph","U3yw5AkKTk","Pb1pa0YAGH","sqVrf618Di","zHF1quJScX","rKDLJPb1pa","8hJdt9GXkX","6q6L9wDajX","AgJHQDQimp","MezSWprNT6",
+"POUYSUlU3M","BpYhVsx5Gl","cmXIXCIShG","sx5Gl4dEz6","B3qem7lUXZ","G1RhSOUYuF","oQ87rni2v1","FFDuiyvOMI","IjTwP5Namm","JkzUnaL6AJ",
+"ulk41iB08l","7fKYUFxX9q","hSSvQlCMxy","7ku1py94nw","WmadAvLsmS","tl72WokgRi","GWqqXru4UG","YjB9tYw2oU","Mkgy8nFqik","RACujzbIYY",
+"qUJMdpv0i7","5Namm9rlg9","v8yFNs7Mxk","uPX7GLDk6f","yToGWVerEA","pmeCdsoy9t","qUJMdIRh48","pvgjS2DREs","MK07Yk85Ae","pAhR1Yh1hF",
+"5Drn0hSSvQ","5VZjSM6qcG","7fKYUCqqaD","Gv3Fquupzk","bZLvS8cVD3","WmadATa8f6","taOXKe6e4z","a00b5oVQp6","AIYUu618Di","4dEz6QWxoT",
+"ZuDtDFNYIM","9eoRcGWqqX","brhlQvLsmS","0Wr5yQWxoT","2Yz7Eo8Uyd","nlaByM6qcG","lweGyAIYUu","XyPZNlCMxy","7ku1pe6e4z","XyPZNKr8ys",
+"2TRI7AmdQd","JkzUn07n1c","5NammvLsmS","1LB1LYjB9t","Zv7z0ReKEW","ulk41rKDLJ","1v5hH9rlg9","NAFuwbgJAz","AkKTkHfyNQ","fmIK1Qworu",
+"7hyVvYOfrY","Cfgr3WDVWJ","8RCUAtlILt","F6PT24QMc9","jtn0X7Ow5C","JJs5mqaofN","9rlg9guMb8","Gv3Fq9rlg9","gIYvE7fKYU","0PktIMm8si",
+"rz7UtuQIcz","RzaZA5Namm","Mkgy8EOE1o","RACujaez9y","tvdkDydG8U","jS1ajOUqFM","9rlg9zQt6Q","RxrsmjSjS3","0BmCyxXTI4","0MR5X5nmWv",
+"zHF1qpFrrl","gIYvEBGaQY","3otm6EoToP","CxVEfoQ87r","Yw2oUC2Irc","8FmFHrKDLJ","RsQUqxciqp","5Drn0gtCA5","iqv4kn1pmO","QClRLguMb8",
+"7lUXZ2Yz7E","gf8rIQ6hMC","7fKYURzaZA","8FmFHCIShG","8FmFH07n1c","FnPFBCfgr3","KASQ8ZhwG1","ksJbysx5Gl","pAhR1YjB9t","VBjhz0h1b1",
+"h1zcHrKDLJ","07n1cDcpWB","TXQ0ZQnJ1S","StlDJFVMxo","zqH0WSs0Zu","nFqikZv7z0","AgJHQHRxd8","KZamHTCgPp","DcpWBfqypy","HRxd8jzUqR",
+"48cHLAIYUu","d7vjMrhl0J","n1pmOguMb8","GWqqXCdyBV","Uvlv4TCgPp","Yw2oUVIlwP","MmsIojiVBP","wDajXpvgjS","pAhR1Zv7z0","O3iyQokgRi",
+"W3VFHO3iyQ","ThjNnEOE1o","OUqFMtvdkD","4W0TlgdQsS","DcpWBgf8rI","ZuDtD5iGN5","9rlg9U3yw5","Kr8ysnFqik","0YAGH14FLR","0BmCyRxrsm",
+"BGaQYYf2Ec","n8pJ9bZLvS","ni2v1Kr8ys","Waim6jiVBP","h1zcHMmsIo","ZUnqtNhXdu","v2eC3YOfrY","cL0aECNHmv","WreyPBFkb8","iB08l9XyT9",
+"2DREssqVrf","I7p2aRzaZA","guMb8vLsmS","uAWypYjB9t","h1zcH7fsYM","BCxeCZ4I1v","i7WMQL7cGc","euZA516lHc","9y4lwpmeCd","brhlQGWqqX",
+"FLsphx3LDe","nnP8ocShY2","55rfBMaJQs","WreyPJ2mQi","1LB1LQYxC0","ZUnqt2Yz7E","gf8rIHlUbF","29QAziqv4k","ZhwG1EdBKc","lm0pDAOgEe",
+"M6qcGlkMUA","qaofN8U2nU","zbIYYWDVWJ","iKqhrWMiS3","WMiS3gjUTu","ReKEWDG4sT","G1RhS2Yz7E","Zv7z0qQxHP","29QAzBGaQY","n8pJ9BpYhV",
+"S77LHYjB9t","OUqFMRzaZA","dhSuHGrDg7","GXdoHZv7z0","AgJHQv2eC3","vOqCE0BmCy","hSSvQoQ87r","Z4I1viB08l","o8UydKASQ8","7ku1pl83Ud",
+"0ao3lM3zXL","HRxd8GrDg7","aFFssAOgEe","WPmlx3otm6","29QAzMezSW","hUTw79eoRc","ru4UG7ku1p","BGaQYBFkb8","B3qem29QAz","FLsphcQOnv",
+"rhl0JIRh48","JKWYRazIWp","oGu6xrhl0J","fqypyAIYUu","Mm8siDcpWB","tuDySwDajX","rKDLJRBhp0","WMiS30PktI","tlILt2Nslm","No0Qb0PktI",
+"IBe8kIKxdL","uvf7ANOHsz","OxWIHZzJHW","zbIYYaez9y","pAhR1a00b5","xReecgIYvE","fLNg8FLsph","2TRI7Pb1pa","i3pyd8hJdt","zz4ZUXyPZN",
+"J2mQiix74r","RBhp0OUYuF","0Wr5y7fsYM","uQIczDG4sT","tlILtdjsrv","OUYuFy94nw","SbRYyFNYIM","HRxd8QChxs","iB08lD6rBy","FnPFBSjskQ",
+"RBhp0bZLvS","0Wr5ypmeCd","VBjhzuupzk","SWfouRpBQm","ZhwG1kZANm","JXljWlH1kt","suY4xAOgEe","VNCPd2DREs","RBhp0vOqCE","OUqFMVIlwP",
+"bgJAz5IhmG","ECMvU0MR5X","IjTwPhUTw7","uZPqgDz1R3","iwzGkAkKTk","1j5L8tvdkD","2ZHdkgIYvE","HlUbFbrhlQ","tjQxs9rlg9","W7cTsazIWp",
+"uoStwnlaBy","DcpWBoQ87r","e6e4zi7WMQ","LbRTHVIlwP","iB08lokgRi","Vprf2Dz1R3","HP433FjHXR","gtCA5QYxC0","BGaQYIjTwP","5Mg9rSs0Zu",
+"Pb1patAOsr","FLsphSjskQ","azIWpTwano","7lUXZpFrrl","x3LDe9iGoT","ulk41iwzGk","uupzkuZPqg","7fKYU9GXkX","16lHcZ4I1v","7fsYM5IhmG",
+"h1zcHa00b5","k85AezmLYD","zbIYYHzZT8","i3pydMm8si","Ta8f6a00b5","yluBxHRxd8","qUJMdDG4sT","zQt6QtAOsr","8xEKzOHaBz","64s8NFnPFB",
+"djsrvMmKGJ","sqVrfJKWYR","K4GS8pAhR1","14FLRaDGtS","ulk41VerEA","lm0pDVLTy6","Yw2oUZUnqt","XflUq5IhmG","D6rBy29QAz","SbRYymX2GE",
+"UlU3MFnPFB","sx5Gl5nmWv","CNHmvKsjRK","29QAzRBhp0","IRh48MojnP","VLTy6ix74r","RsQUqmX2GE","5NammWreyP","1j5L89iGoT","JRJQBSmGzv",
+"NOHszsqVrf","Nxx9VFGzgp","Pb1pa9GXkX","FVMxofLNg8","lj07QgjUTu","0MR5XOxWIH","Oz8yZBpYhV","4QMc9Ss0Zu","Chuy3dmoS7","b29RJChuy3",
+"uupzk3otm6","S77LHQssNC","nlaByxReec","taOXK9GXkX","NOHsziqv4k","tvdkDLewvM","AIYUulm0pD","0BmCy0PktI","y94nw7X3uy","M3zXLOz8yZ",
+"8FmFHFFDui","uZPqg0YAGH","vkCHH5nmWv","BFkb8lj07Q","dhSuHoGu6x","FnPFBHRxd8","4W0TlOUYuF","BCxeC9GXkX","MmsIoyToGW","jSjS3OUYuF",
+"zz4ZUFjHXR","NcICAQworu","0PktIfFDrJ","2TRI7FwEJz","dhSuH9rlg9","MmsIoRmDcr","TXQ0ZlH1kt","D6rByn8pJ9","uJScXYh1hF","zHF1qhE1Ql",
+"JIqXiokgRi","HlUbFuQIcz","ulk415Mg9r","FjHXRmz8gx","lpF6WzbIYY","wDajXyofH3","AIYUuRACuj","cL0aEFcWrW","OHaBzEOE1o","6q6L9cmXIX",
+"9XyT9HlUbF","tvdkDbgJAz","O3iyQAmdQd","3otm6n8pJ9","DQimprz7Ut","Uvlv46AFT0","8TxD7uN6r3","JJs5matef2","MK07YIjTwP","brhlQcmXIX",
+"AXpwEAXpwE","64s8NHP433","v2eC3AXpwE","KsjRKUmaEv","zbIYYQssNC","1LB1LVLTy6","29QAzrz7Ut","rhl0JvkCHH","xciqpaDGtS","0Wr5ydpe1v",
+"2hEEUIjTwP","uupzkzQt6Q","Waim6RpBQm","RxrsmcQOnv","W3VFH5VZjS","uoStwFcWrW","HP433uAWyp","WDVWJBpYhV","Gv3Fq7hyVv","618DiSmGzv",
+"taOXKC2Irc","W7cTsiqv4k","rz7Ut7fsYM","xXTI4pWiOs","FGzgpzFgtB","StlDJ29QAz","LewvMQChxs","ksJbyVNCPd","FVMxouN6r3","yToGW4QMc9",
+"P6bcgNcICA","dhSuHBFkb8","ydG8UQbxXc","7ku1pdmoS7","7fsYMjfREu","Chuy3QssNC","uupzkQ6hMC","S2DfuReKEW","AOgEe7lUXZ","JIqXiSs0Zu",
+"Vprf2QssNC","mz8gx5ZaEz","tAOsrRACuj","GSQwj7hyVv","BGaQYlweGy","DQimprKDLJ","nnP8oJ2mQi","Uvlv4bZLvS","dmoS7O3iyQ","Ul4a1Fhtgl",
+"AOgEeUl4a1","2hEEUlH1kt","lViBvpAhR1","Vprf2jSjS3","BCxeCAOgEe","FVMxoTwano","1LB1LTCgPp","L7cGcdpe1v","xXTI4SWfou","zmLYDzmLYD",
+"Waim6Waim6","8FmFHhSSvQ","Ss0ZuK20wK","OUYuFl83Ud","zmLYDlm0pD","AXpwE9iGoT","FLsphHlUbF","dpe1vpWiOs","Vprf2ix74r","Ul4a1CdyBV",
+"WmadAeuZA5","qaofNRpBQm","qQxHPRkQke","s93MlKASQ8","RACuj5VZjS","xciqpuJScX","FFDui0PktI","SmGzv5Mg9r","Kr8ys7X3uy","y94nwJIqXi",
+"5Mg9rThjNn","9GXkXGrDg7","AkKTkyofH3","Waim6SmGzv","8TxD7dpe1v","O3iyQ7fKYU","NcICA8TxD7","DLhzMmz8gx","tl72WVerEA","kZANm7lUXZ",
+"XyPZNRsQUq","sqVrfX6Pin","d85a9AkKTk","lkMUA1LB1L","ydG8Usoy9t","LewvM48cHL","TCgPpzY1GY","JJs5myvOMI","fqypyMezSW","SjskQyvOMI",
+"MmKGJaDGtS","oGu6xSjskQ","nnP8ouLtKs","W7cTs55rfB","Dz1R3SmGzv","8hJdthe9IA","RmDcrNAFuw","VLTy69XyT9","0BmCyfmIK1","vkCHHtl72W",
+"pFrrlblLA9","jiVBPn1pmO","VIlwPx3LDe","Yw2oU0MR5X","oVQp66q6L9","QnJ1SMaJQs","xXTI464s8N","CxVEf0BmCy","lsQGoyofH3","KZamH8hJdt",
+"rKDLJFVMxo","a00b5UlU3M","NOHsz5iGN5","RxrsmiwzGk","XflUqhUTw7","prNT6Rxrsm","F6PT2lViBv","xXTI4KZamH","0ao3lQnJ1S","16lHcbZLvS",
+"D6rByjfREu","NAFuw24ARF","AkKTkLewvM","ogLgcQWxoT","5drc65VZjS","7fKYUhUTw7","NhXduFcWrW","oGu6xCxVEf","zqH0WwiHrZ","FFDuifLNg8",
+"zFgtBBbwgA","BbwgAdpe1v","uPX7G3weIF","CdyBVRBhp0","Mm8siFLsph","HP433iB08l","ydG8UX6Pin","azIWpxReec","1LB1LRACuj","DcpWBBbwgA",
+"nFqikuTacx","K20wKThjNn","AXpwEAkKTk","tlILts4786","F6PT2lweGy","2Yz7Ev2eC3","BFkb8uQIcz","QssNCuJScX","3otm6G1RhS","3otm64W0Tl",
+"WMiS3YjB9t","Kr8ysWDVWJ","8cVD3jtn0X","2Yz7E5ZaEz","cmXIXRmDcr","W7cTsjfREu","AmdQdZJTXH","fmIK15VZjS","G1RhSEdBKc","gjUTu0Kyfs",
+"WmadAI7p2a","zFgtBVjCZq","QClRLuAWyp","yofH3Chuy3","AkKTkcQOnv","AmdQdLDk6f","iwzGkb29RJ","zqH0WpT8wu","EdBKcyEfy9","pWiOsJ2mQi",
+"BpYhVlsQGo","0YAGHZJTXH","n1pmO7lUXZ","SmGzv0Kyfs","lm0pDiwzGk","uLtKsAmdQd","iqv4kbgJAz","hi5X7m4bxU","gf8rIaL6AJ","D6rByjiVBP",
+"QClRL4W0Tl","8FmFH8RCUA","MmKGJd85a9","0YAGHuN6r3","QWxoTG1RhS","taOXKkZANm","lpF6Ws7Mxk","nFqikd7vjM","64s8NYOfrY","XyPZNzQt6Q",
+"Pb1padjsrv","gf8rI1LB1L","pT8wu1LB1L","aL6AJwDajX","0PktIEoToP","55rfBtvdkD","Yf2EcZuDtD","OUYuFyluBx","NcICARxrsm","RxrsmFLsph",
+"FjHXRlXFOB","Q6hMC1LB1L","FLsphguMb8","aez9yUvlv4","Yf2EcEOE1o","ZuDtDNcICA","uJScXjeskS","2hEEUgtCA5","4QMc9XflUq","5drc6lH1kt",
+"1LB1Lv1Hln","brhlQ0Kyfs","Y1mC0W7cTs","EoToPuupzk","QworuksJby","s7MxkMK07Y","NcICAv2eC3","WreyP2Nslm","iKqhr0MR5X","IBe8kEOE1o",
+"VjCZqjeskS","2DREsHP433","FwEJzjiVBP","nFqikMezSW","1LB1LJRJQB","ZuDtDd7vjM","TCgPpMK07Y","gjUTu4W0Tl","CdyBViqv4k","atef2WPmlx",
+"OHaBzCfgr3","IRh487fKYU","fFDrJuTacx","s93MlGSQwj","4W0TluAWyp","Yw2oU8xEKz","8U2nUrz7Ut","BCxeCKASQ8","64s8NFGzgp","O3iyQuAWyp",
+"xciqpydG8U","TCgPpsoy9t","JXljWMojnP","pmeCdMmKGJ","jSjS3xciqp","K4GS8azIWp","4dEz61v5hH","lkMUAZJTXH","CK5W75Mg9r","DLhzMQWxoT",
+"OUqFMuAWyp","CNHmv7fKYU","9rlg9K20wK","qUJMdAXpwE","qQxHPix74r","5iGN5Uvlv4","Pb1paLDk6f","fmIK1y94nw","oVQp6JJs5m","ZuDtD3otm6",
+"suY4xHP433","euZA52Nslm","Q6Lixrhl0J","MmKGJ7X3uy","ZzJHWlsQGo","zbIYYjeskS","n8pJ97Ow5C","blLA9pv0i7","SWfou0PktI","lweGyXyPZN",
+"KASQ87Ow5C","2TRI7EOE1o","9XyT9y94nw","uLtKsO3iyQ","fcJOyuoStw","HRxd8Chuy3","l83UdXyPZN","rz7Utiqv4k","uTacxZJTXH","faHirMGlTF",
+"gdQsSxXTI4","6AFT0YjB9t","lweGylweGy","cL0aE8U2nU","HfyNQdhSuH","U3yw5lweGy","DLhzM14FLR","jtn0XQChxs","Yf2EcX6Pin","2NslmVLTy6",
+"nlaBycShY2","VjCZqZhwG1","FxX9qAXpwE","4W0TlQnJ1S","Dz1R3yofH3","ciuWzBGaQY","MaJQsyToGW","cQOnvNAFuw","1LB1Ld7vjM","fFDrJlH1kt",
+"lXFOBQssNC","iqv4ktuDyS","48cHLZ4I1v","DG4sTuPX7G","zqH0WRmDcr","Z4I1vJJs5m","Yh1hFZuDtD","FPfSEyvOMI","45cIHiwzGk","cL0aEQChxs",
+"ZhwG19XyT9","sqVrfAIYUu","Kr8yslXFOB","4dEz6lweGy","fcJOy3weIF","CdyBVIn3NS","VjCZqRzaZA","MGlTF48cHL","0PktIGv3Fq","s478614FLR",
+"6q6L9MaJQs","lsQGo0BmCy","gIYvEpvgjS","1v5hHTwano","StlDJokgRi","vkCHH2Yz7E","P6bcgyvOMI","Mkgy8vLsmS","BCxeCMmKGJ","ru4UGhi5X7",
+"pFrrlsoy9t","zz4ZUix74r","HfyNQUmaEv","dmoS7tlILt","HRxd8jSjS3","KsjRKCNHmv","JXljWNhXdu","suY4xEdBKc","jfREuYw2oU","5nmWvrz7Ut",
+"MmsIoU3yw5","n8pJ9ulk41","WmadAt59lR","qaofN9XyT9","OHaBzBFkb8","cL0aEO3iyQ","OUYuFJJs5m","zz4ZUdjsrv","qUJMd45cIH","POUYS64s8N",
+"jiVBPSs0Zu","6q6L9lpF6W","zY1GYEoToP","Yh1hFcmXIX","lpF6WzqH0W","iwzGkoQ87r","1v5hHguMb8","C2IrcbgJAz","azIWpYOfrY","5drc6guMb8",
+"IBe8k618Di","jiVBPlm0pD","tAOsrFFDui","xReecsoy9t","P6bcgW7cTs","d7vjMTa8f6","AXpwElweGy","VBjhzlXFOB","Mm8siMaJQs","v2eC3l83Ud",
+"Nxx9VDQimp","uJScX0ao3l","zz4ZU0YAGH","LDk6fzHF1q","WMiS3prNT6","i7WMQ2DREs","FPfSEZhwG1","G1RhS9XyT9","t98iW9y4lw","m4bxUn8pJ9",
+"dpe1vv2eC3","uPX7GDLhzM","oQ87rZzJHW","lkMUAYOfrY","SmGzvZhwG1","XflUq5Mg9r","uvf7AY1mC0","9GXkX8hJdt","2TRI7GXdoH","uN6r3BbwgA",
+"4dEz6aez9y","lCMxyQWxoT","7X3uylXFOB","BbwgAcL0aE","J2mQioVQp6","piJSkDLhzM","YOfrYOHaBz","IRh48lj07Q","IjTwPMaJQs","8RCUA8hJdt",
+"o8UydVIlwP","piJSkP6bcg","IBe8kdmoS7","MezSWt98iW","WDVWJGv3Fq","AIYUuNOHsz","nnP8oydG8U","pmeCdcL0aE","hYBCKNo0Qb","n1pmO4QMc9",
+"okgRit59lR","l83UdrKDLJ","16lHcL7cGc","m4bxUjfREu","5IhmGHRxd8","cL0aE4QMc9","WDVWJsoy9t","TXQ0Z0PktI","IBe8kHzZT8","bZLvSPb1pa",
+"9GXkXNOHsz","yToGWD6rBy","x3LDeuZPqg","14FLRiwzGk","GWqqXNcICA","8xEKzs7Mxk","xXTI41v5hH","Zv7z08xEKz","ix74r5iGN5","lXFOBFGzgp",
+"gjUTuWPmlx","48cHLqQxHP","blLA9vOqCE","tlILty94nw","fqypyChuy3","s4786W3VFH","gf8rIaDGtS","J2mQiWDVWJ","OUYuFHRxd8","Q6LixVBjhz",
+"K20wKLewvM","b29RJHlUbF","8U2nU5VZjS","HRxd8i7WMQ","fmIK13otm6","0YAGHWaim6","8FmFHvkCHH","In3NSF6PT2","xReeclXFOB","iqv4k2ZHdk",
+"14FLRWmadA","MojnPNxx9V","k85AeWaWsv","rz7UtFhtgl","CqqaDjtn0X","ThjNn0BmCy","Uvlv4BpYhV","oVQp6aL6AJ","WMiS3uoStw","dQ586DG4sT",
+"0h1b1rKDLJ","k85AeGWqqX","9y4lwhSSvQ","618DiHP433","iqv4kcQOnv","LewvMpT8wu","GrDg7fcwDa","5drc6x3LDe","FwEJzs4786","zQt6QWDVWJ",
+"GWqqXn1pmO","NhXdusx5Gl","h1zcHYjB9t","DG4sTNcICA","uQIczs4786","MezSW5Drn0","kB5nPQnJ1S","s7Mxke6e4z","5ZaEzKr8ys","yofH3yToGW",
+"W3VFH3otm6","v1HlnoVQp6","hSSvQGSQwj","oGu6x2Yz7E","Waim6Ul4a1","pAhR1sqVrf","fLNg8ogLgc","2NslmFcWrW","uvf7AU3yw5","5IhmGuTacx",
+"tvdkDMezSW","sqVrf8cVD3","uAWypnlaBy","hE1Ql2Yz7E","IjTwPOUYuF","t59lRm4bxU","mX2GE9XyT9","Q6Lixk85Ae","4QMc9uoStw","zmLYDYw2oU",
+"IRh48zQt6Q","6AFT06q6L9","dQ586KsjRK","dpe1vaez9y","TwanomX2GE","lXFOBMojnP","NhXduzbIYY","6AFT0Q6Lix","pAhR1Vprf2","Z4I1vIn3NS",
+"okgRiuoStw","24ARFcmXIX","zY1GY3weIF","suY4xrKDLJ","lm0pDRsQUq","nlaByjSjS3","0BmCyJRJQB","djsrvEoToP","24ARFhi5X7","5VZjSfLNg8",
+"55rfBHP433","aFFssHRxd8","d85a9ZJTXH","7ku1paDGtS","rKDLJk85Ae","dhSuH7X3uy","v2eC3ReKEW","VBjhzzHF1q","QYxC0WaWsv","8TxD7blLA9",
+"gtCA5pT8wu","W7cTsv2eC3","7ku1pX6Pin","BGaQYi7WMQ","IKxdL7ku1p","2TRI7hUTw7","64s8Nx3LDe","5Drn0pmeCd","16lHcWreyP","F6PT27lUXZ",
+"pmeCdSbRYy","L7cGcpvgjS","ECMvUsoy9t","TCgPpn1pmO","FVMxoKsjRK","5IhmGMaJQs","8TxD75VZjS","ZzJHWyToGW","FLsph24ARF","iwzGkx3LDe",
+"JKWYRxReec","FjHXR5VZjS","l83UdeuZA5","MojnPhi5X7","4dEz6l83Ud","SjskQMaJQs","ZuDtDzY1GY","7Ow5CMezSW","RBhp0a00b5","vLsmSWaWsv",
+"b29RJrz7Ut","prNT61v5hH","djsrvuTacx","HlUbFBCxeC","3otm6uZPqg","8U2nU580YD","gjUTucQOnv","GrDg76q6L9","lj07QCp3mZ","hUTw7MmKGJ",
+"Yh1hFYh1hF","DG4sTWMiS3","9GXkXhYBCK","Cfgr3VNCPd","lpF6WnlaBy","TXQ0ZuQIcz","lCMxyBbwgA","6AFT024ARF","UmaEvhSSvQ","pT8wu29QAz",
+"QworulpF6W","EOE1ouN6r3","B3qemcShY2","tAOsr48cHL","bgJAzsqVrf","hi5X7HlUbF","iB08la00b5","lXFOBo8Uyd","I7p2aU3yw5","EoToPMmKGJ",
+"jfREuZJTXH","In3NSGrDg7","RBhp0MojnP","rKDLJX6Pin","azIWpGrDg7","uvf7AgdQsS","NcICASbRYy","K20wKjtn0X","9XyT9TXQ0Z","JXljWNo0Qb",
+"J2mQiuJScX","jfREu618Di","nlaByguMb8","RsQUq8hJdt","Chuy345cIH","suY4xhUTw7","Nxx9VOUqFM","kB5nPW7cTs","sx5Gl0Kyfs","ECMvUZUnqt",
+"Zv7z0ZJTXH","BFkb8tl72W","uTacxOxWIH","9eoRcqUJMd","7ku1p14FLR","FNYIMBCxeC","0ao3luLtKs","XflUq6q6L9","QChxsaFFss","jS1ajUlU3M",
+"0h1b1y94nw","5IhmGQssNC","tuDySvLsmS","RzaZAzz4ZU","NcICAzHF1q","GrDg7No0Qb","jtn0XF6PT2","BpYhV0Kyfs","zqH0Wsx5Gl","brhlQokgRi",
+"KsjRKfcwDa","s4786yluBx","ZzJHW5nmWv","DG4sTOz8yZ","WMiS3dhSuH","FwEJzUl4a1","uoStwNo0Qb","9rlg94dEz6","vkCHHVprf2","b29RJjiVBP",
+"Uvlv4yofH3","QbxXcWmadA","LbRTHuN6r3","Oz8yZ8hJdt","zHF1qNcICA","I7p2a1v5hH","0PktIWaWsv","jS1ajtvdkD","MGlTFpvgjS","GXdoH2hEEU",
+"JJs5m9iGoT","piJSkguMb8","FVMxoB3qem","64s8NtjQxs","ydG8U8TxD7","VLTy6m4bxU","UlU3M3weIF","yluBx5ZaEz","aFFsszmLYD","Gv3FqDG4sT",
+"G1RhSjtn0X","RACuj7X3uy","BFkb8piJSk","XflUqReKEW","cQOnvAgJHQ","Yw2oUzmLYD","WMiS3faHir","lj07Q0Wr5y","aez9y9iGoT","0MR5XvOqCE",
+"iKqhrHRxd8","64s8N5IhmG","FnPFB64s8N","MK07YAIYUu","bgJAzm4bxU","gdQsSJ2mQi","HzZT8CxVEf","8U2nUMm8si","uoStwD6rBy","lkMUA7Ow5C",
+"lm0pDjSjS3","8RCUAChuy3","lsQGoHfyNQ","MaJQslsQGo","piJSkK4GS8","G1RhSWDVWJ","uoStwtl72W","580YDHlUbF","8cVD35VZjS","fcwDapAhR1",
+"BbwgA5Mg9r","e6e4zaL6AJ","MaJQsi3pyd","MK07Y4W0Tl","IKxdL4dEz6","gtCA5h1zcH","y94nwb29RJ","lH1ktpAhR1","OxWIHs7Mxk","y94nwqaofN",
+"aFFssuvf7A","In3NSs7Mxk","EoToPlm0pD","t98iWBpYhV","DQimpGv3Fq","AOgEeWDVWJ","oQ87rxXTI4","fLNg8K20wK","rz7UttaOXK","he9IAdjsrv",
+"MmsIoyEfy9","5IhmGM6qcG","MaJQspFrrl","POUYSJIqXi","F6PT2GSQwj","n1pmORkQke","VerEAFjHXR","YOfrYMmsIo","rKDLJguMb8","wDajXiKqhr",
+"QssNC5VZjS","GSQwjYw2oU","PYBf42TRI7","yofH39iGoT","faHir8U2nU","xXTI4dmoS7","0YAGH0BmCy","v1HlnjSjS3","P6bcgQClRL","PYBf4vLsmS",
+"0PktIqQxHP","7lUXZcL0aE","JkzUn7fKYU","AkKTkSbRYy","55rfBQYxC0","1v5hHmz8gx","ksJbyqQxHP","fcwDan1pmO","Vprf2YjB9t","RzaZANhXdu",
+"9GXkXvOqCE","YjB9tFGzgp","8TxD7SWfou","brhlQK4GS8","JkzUnS77LH","tjQxsyvOMI","JkzUn5Namm","k85Ae6AFT0","8FmFHgjUTu","FnPFB5Mg9r",
+"guMb8rhl0J","vOqCE0Kyfs","FVMxoFPfSE","9GXkXAIYUu","YOfrY9eoRc","uLtKsBCxeC","i3pydK4GS8","RzaZADz1R3","Vprf2Twano","jS1ajhi5X7",
+"a00b5BCxeC","K20wKhUTw7","sqVrfpmeCd","1LB1LtaOXK","K20wKn8pJ9","Cp3mZKsjRK","dpe1vQ6hMC","SmGzvO3iyQ","he9IA8TxD7","gf8rIfLNg8",
+"8RCUA2Yz7E","FLsph580YD","zFgtBaez9y","aFFssTa8f6","HlUbFMGlTF","Ul4a1lCMxy","WaWsv0h1b1","BbwgAwDajX","ZJTXHFnPFB","aFFssOUYuF",
+"aFFssuTacx","k85Ae2Yz7E","3weIFZv7z0","pmeCdSWfou","suY4xrz7Ut","gjUTu8TxD7","zY1GY1LB1L","Nxx9V48cHL","sx5Gl8RCUA","OUYuFLbRTH",
+"TwanoAOgEe","45cIHStlDJ","aDGtSIjTwP","hUTw7POUYS","CxVEfRzaZA","Q6hMCs4786","vOqCECp3mZ","9rlg9Ss0Zu","2ZHdkRxrsm","9rlg9RsQUq",
+"cmXIXI7p2a","lpF6Wsoy9t","pFrrltlILt","ZuDtDMGlTF","0BmCy7Ow5C","Pb1paMezSW","Gv3FqYjB9t","GrDg7Ss0Zu","hi5X7QnJ1S","HzZT80Kyfs",
+"qaofNzmLYD","lm0pDZ4I1v","CK5W7qUJMd","2ZHdkuN6r3","lkMUARmDcr","EoToPNAFuw","Ta8f6JKWYR","K4GS85VZjS","BCxeCVBjhz","gtCA5aDGtS",
+"7Ow5C8hJdt","x3LDe7ku1p","EdBKchi5X7","rz7UtQ6hMC","Pb1pa0Wr5y","tvdkDdQ586","7Ow5CNxx9V","zmLYDG1RhS","hi5X77X3uy","7hyVvyofH3",
+"lkMUAMGlTF","7fKYUBFkb8","uoStwmz8gx","pT8wuF6PT2","iB08l0h1b1","5drc6JIqXi","vOqCE0MR5X","fqypybrhlQ","ogLgc07n1c","WDVWJuJScX",
+"hUTw7lkMUA","t98iWogLgc","7fKYUd85a9","5VZjSh1zcH","suY4xMezSW","uQIczWPmlx","uQIcziB08l","6q6L9JJs5m","uQIczfcJOy","7lUXZZUnqt",
+"8TxD7jiVBP","hi5X7UlU3M","Q6hMCQ6Lix","IjTwPX6Pin","k85AeVNCPd","HRxd8OUqFM","In3NSJRJQB","HfyNQFcWrW","JIqXik85Ae","Ta8f6t59lR",
+"gjUTuAgJHQ","faHirjeskS","Zv7z05Mg9r","2hEEUBGaQY","0ao3laFFss","o8UydCNHmv","DG4sTIBe8k","kZANmuLtKs","xciqppvgjS","M6qcG9rlg9",
+"HRxd8soy9t","2hEEUbrhlQ","he9IAQChxs","16lHc3otm6","bZLvSSbRYy","Yf2EcAIYUu","e6e4zdQ586","BCxeCJIqXi","QChxscQOnv","6q6L9vkCHH",
+"9iGoTZv7z0","O3iyQRsQUq","6q6L98cVD3","BpYhVdhSuH","jeskS1j5L8","yToGWRmDcr","piJSkRxrsm","IBe8k5nmWv","AmdQdHzZT8","O3iyQJKWYR",
+"ECMvUv1Hln","y94nw5Mg9r","Pb1pa24ARF","7fsYMoGu6x","IRh48uZPqg","CK5W7DLhzM","7hyVvRsQUq","ZhwG1VerEA","J2mQi618Di","uLtKsQClRL",
+"7fKYUhSSvQ","yvOMIYOfrY","lpF6W0Kyfs","taOXKyvOMI","MmsIovOqCE","9iGoTpAhR1","rKDLJJJs5m","soy9tWaim6","OHaBzCIShG","JkzUnpT8wu",
+"qaofNSs0Zu","wDajXQChxs","I7p2aZuDtD","Chuy3Qworu","lweGytuDyS","5nmWvPOUYS","5NammkB5nP","07n1cRmDcr","JRJQBK20wK","ix74rQbxXc",
+"C2IrcF6PT2","qUJMdyofH3","azIWpqQxHP","FFDuitvdkD","yEfy9WreyP","fFDrJSbRYy","HfyNQStlDJ","BFkb8tlILt","ulk41Twano","MGlTFk85Ae",
+"Pb1paBGaQY","AgJHQVLTy6","qQxHPFjHXR","EOE1ofmIK1","RxrsmNOHsz","qQxHPLbRTH","cL0aEs93Ml","pWiOslXFOB","m4bxURzaZA","NhXduhi5X7",
+"CNHmvNo0Qb","lpF6WSjskQ","Oz8yZpFrrl","hi5X7VNCPd","yofH3M6qcG","0BmCyogLgc","fcJOyhe9IA","lXFOBlm0pD","29QAzVIlwP","Chuy3M6qcG",
+"5drc6ydG8U","64s8N0Wr5y","WreyPeuZA5","QWxoTn1pmO","8U2nUOHaBz","9GXkXcQOnv","mz8gxkZANm","0BmCyciuWz","YOfrYS2Dfu","Waim66q6L9",
+"2ZHdkoGu6x","ZJTXHRkQke","n1pmOY1mC0","GWqqXiB08l","HP433i3pyd","hi5X79iGoT","jeskSNAFuw","ulk41a00b5","5IhmGn1pmO","7lUXZBCxeC",
+"JJs5m5Drn0","jiVBPlj07Q","atef27X3uy","0MR5XKr8ys","lkMUAkZANm","W3VFHx3LDe","IRh48NOHsz","atef20BmCy","FhtglvkCHH","oVQp6ZhwG1",
+"lm0pD14FLR","uTacx6AFT0","HP433FcWrW","9GXkX2hEEU","ulk41Ul4a1","5Drn0FLsph","MmKGJQWxoT","nFqikuoStw","uoStwsqVrf","MK07YIRh48",
+"lCMxyjiVBP","uQIczbgJAz","8cVD3ulk41","Waim6In3NS","SjskQHfyNQ","nnP8oYjB9t","zQt6QCqqaD","jzUqRlpF6W","l83Ud4QMc9","64s8N7X3uy",
+"lm0pDVprf2","OUqFMAkKTk","AgJHQydG8U","RmDcrvOqCE","gjUTuMm8si","aDGtSYh1hF","dpe1vGrDg7","MojnP1j5L8","BCxeCv2eC3","ulk415Drn0",
+"pmeCdlm0pD","UmaEvZ4I1v","7Ow5Csoy9t","jfREudpe1v","lXFOBAOgEe","jfREu3otm6","brhlQOHaBz","TwanoP6bcg","TCgPpNAFuw","aL6AJdmoS7",
+"XyPZNi3pyd","AOgEeyofH3","FcWrW0BmCy","ThjNnOHaBz","NhXduLDk6f","8hJdtLDk6f","0PktIoQ87r","ZhwG1nlaBy","yEfy9jtn0X","tvdkD2TRI7",
+"m4bxUJIqXi","uQIcz6AFT0","ZuDtDNo0Qb","NcICA0YAGH","D6rByUvlv4","HP433aez9y","VerEAWmadA","lViBvn8pJ9","7ku1p0YAGH","9GXkXfcJOy",
+"FVMxo14FLR","K20wKblLA9","iwzGkRBhp0","rKDLJhYBCK","DQimpjfREu","7X3uy7X3uy","AIYUuuQIcz","Q6Lix6AFT0","ZJTXHXyPZN","qQxHPtlILt",
+"TXQ0Zh1zcH","gtCA5sx5Gl","FwEJz9XyT9","M3zXLBbwgA","0Kyfs55rfB","9y4lwI7p2a","VerEARACuj","5iGN5QnJ1S","ZJTXHKsjRK","OUqFMzqH0W",
+"dhSuHFPfSE","pAhR1No0Qb","FFDuiyToGW","5iGN5nFqik","y94nwOz8yZ","ZuDtDuAWyp","FVMxofqypy","K4GS8taOXK","FjHXRfcJOy","ksJbyNcICA",
+"RACujfcwDa","POUYStjQxs","dhSuHmz8gx","HRxd88TxD7","AXpwEuQIcz","tvdkDpFrrl","DLhzMFcWrW","Kr8ysatef2","qQxHPd7vjM","zHF1qJ2mQi",
+"dhSuH5iGN5","lm0pDAIYUu","AXpwEmz8gx","GXdoHdmoS7","v2eC3Ta8f6","blLA9yluBx","jtn0XpvgjS","t59lRIjTwP","O3iyQtuDyS","uJScX48cHL",
+"XyPZNdmoS7","gf8rISjskQ","fcwDaNAFuw","pFrrlJkzUn","vOqCEC2Irc","MezSWChuy3","9iGoTVprf2","1j5L8t98iW","9rlg9ulk41","tjQxsuPX7G",
+"BFkb8cL0aE","fFDrJQssNC","ZJTXHIRh48","QWxoTUl4a1","LbRTHMkgy8","F6PT2WaWsv","SmGzvUmaEv","NcICAzFgtB","ksJbyS77LH","AkKTkdpe1v",
+"XyPZNzFgtB","7ku1puTacx","DLhzMOz8yZ","ix74r8xEKz","lViBvs4786","Yw2oUaL6AJ","iqv4kRkQke","2Nslm5IhmG","n8pJ9fcwDa","WPmlxFjHXR",
+"Gv3FqHzZT8","U3yw5uAWyp","FwEJzcQOnv","CxVEf7X3uy","xXTI4RkQke","fqypy2hEEU","vkCHHaez9y","YjB9tK4GS8","yofH3lweGy","uupzkgjUTu",
+"yluBxtuDyS","2Yz7EAOgEe","EdBKcxXTI4","LbRTHChuy3","OxWIH1j5L8","m4bxUdmoS7","zQt6Q2hEEU","EOE1ohUTw7","WaWsvFnPFB","RzaZAC2Irc",
+"24ARFBFkb8","yluBxQClRL","SmGzv4W0Tl","ni2v19y4lw","580YDhYBCK","29QAzvkCHH","kZANmP6bcg","5VZjSFLsph","cmXIX7X3uy","RzaZAO3iyQ",
+"d7vjMbZLvS","W3VFHM3zXL","NhXduydG8U","lH1ktHzZT8","24ARFRsQUq","HzZT8uJScX","HzZT8AkKTk","ydG8USjskQ","DLhzMQnJ1S","HzZT8dmoS7",
+"OxWIHFGzgp","9eoRc2ZHdk","Yf2EcTwano","zmLYDxciqp","JKWYRfmIK1","TwanoECMvU","n1pmOhi5X7","pAhR1JXljW","uZPqgpT8wu","Chuy3B3qem",
+"Cfgr3l83Ud","fLNg89GXkX","cQOnva00b5","hi5X7kB5nP","Chuy3Nxx9V","RACujpFrrl","aez9yWreyP","zqH0WZhwG1","uQIcz24ARF","oGu6xcShY2",
+"Mkgy8FjHXR","7hyVvDLhzM","o8UydJkzUn","FjHXRzQt6Q","QworuBpYhV","jiVBPdmoS7","lj07QWmadA","pT8wut98iW","dhSuH0PktI","55rfBtl72W",
+"4dEz6I7p2a","7X3uy1j5L8","uAWypNxx9V","Gv3Fqa00b5","RxrsmK20wK","EoToPQChxs","CIShGxciqp","oVQp624ARF","lkMUA1v5hH","SbRYylpF6W",
+"8FmFHlkMUA","LbRTHCqqaD","lm0pDSmGzv","NhXduWPmlx","nnP8oAgJHQ","xReecWMiS3","VerEAEOE1o","aez9ytl72W","gdQsS55rfB","mX2GE7fKYU",
+"Ul4a1Waim6","IjTwPyofH3","5nmWvcQOnv","7lUXZBFkb8","IKxdLfcwDa","4dEz6B3qem","i7WMQThjNn","cQOnviwzGk","BbwgAOxWIH","d85a9s7Mxk",
+"BbwgAG1RhS","d7vjMMm8si","Ul4a164s8N","FhtglFFDui","Mm8sin1pmO","580YD16lHc","BCxeCiKqhr","WaWsv2DREs","2DREsChuy3","uAWypcL0aE",
+"QClRLDG4sT","qaofNhSSvQ","nFqikYjB9t","Zv7z0gjUTu","AIYUupT8wu","yToGWLDk6f","ix74rhi5X7","RBhp09XyT9","uupzkn1pmO","64s8NAIYUu",
+"euZA55VZjS","RmDcrMezSW","16lHcs93Ml","GWqqXJRJQB","Yf2Eculk41","Yh1hFbZLvS","2hEEUNo0Qb","MK07YcmXIX","8RCUAC2Irc","oQ87rru4UG",
+"Yh1hFdjsrv","0BmCyksJby","AXpwEcQOnv","CxVEfblLA9","jiVBPQ6Lix","1LB1LZhwG1","CK5W7pAhR1","iB08lQ6Lix","sqVrfB3qem","n8pJ90Kyfs",
+"o8UydhSSvQ","JRJQBiqv4k","ZUnqts4786","lpF6WNxx9V","8TxD7GWqqX","VerEAqUJMd","JkzUnnnP8o","fmIK1HP433","AOgEelj07Q","IjTwPxReec",
+"55rfBLbRTH","QssNCtvdkD","RkQkejtn0X","I7p2aFjHXR","nlaBygjUTu","KZamHWaWsv","tl72WHfyNQ","lViBvCdyBV","hYBCKMojnP","vOqCEfFDrJ",
+"48cHL4dEz6","M6qcGpWiOs","AXpwEdQ586","HlUbFFFDui","WDVWJYh1hF","NcICA8xEKz","uupzkJXljW","2TRI7ru4UG","14FLRBCxeC","Oz8yZMojnP",
+"FGzgpS2Dfu","ydG8UUl4a1","Mkgy8zY1GY","0Wr5yYw2oU","ZzJHWNOHsz","TCgPpuQIcz","DG4sTTwano","fmIK1VLTy6","n8pJ98U2nU","uTacxuvf7A",
+"CqqaDzmLYD","piJSk5ZaEz","n8pJ9VjCZq","RmDcr0PktI","Ul4a1lpF6W","gjUTulCMxy","MmKGJ07n1c","uJScXtuDyS","hi5X7uLtKs","FwEJz16lHc",
+"UmaEvrz7Ut","gjUTuQWxoT","pmeCdZuDtD","Mkgy8ZUnqt","v8yFNQYxC0","zbIYYIjTwP","7fKYU5IhmG","ThjNn9y4lw","7fsYMQnJ1S","Uvlv4pAhR1",
+"JkzUnru4UG","07n1cSWfou","zFgtBMK07Y","5iGN5QClRL","JkzUnLewvM","fmIK1MojnP","618DipWiOs","SbRYynlaBy","MmsIozmLYD","KASQ8Ta8f6",
+"5drc60h1b1","FNYIMrz7Ut","Waim6CqqaD","FVMxolViBv","azIWp0MR5X","NAFuwJRJQB","jS1ajuoStw","euZA5nnP8o","xciqp4W0Tl","jtn0XlweGy",
+"djsrvlm0pD","mz8gxzbIYY","jeskSQ6hMC","jfREuTwano","0YAGHSs0Zu","lm0pDhE1Ql","dQ586Cp3mZ","UmaEvOUYuF","SbRYyksJby","29QAzkB5nP",
+"yluBx7Ow5C","Chuy3cShY2","zY1GYydG8U","kZANmzmLYD","ZUnqt0YAGH","B3qem5Mg9r","ZhwG1s7Mxk","5nmWv5VZjS","X6PinIjTwP","Cfgr3MaJQs",
+"W3VFHQ6Lix","16lHcdQ586","9y4lwHRxd8","h1zcH48cHL","Kr8ysP6bcg","v1Hln29QAz","ZJTXHiwzGk","G1RhScShY2","lsQGouoStw","vLsmSjtn0X",
+"CNHmviKqhr","hYBCKXyPZN","WmadAqaofN","pvgjSAOgEe","hSSvQmz8gx","xXTI4yToGW","zFgtBFxX9q","CxVEfzY1GY","NOHsz0PktI","J2mQiFLsph",
+"2Yz7EyvOMI","VIlwPQworu","ThjNn14FLR","5drc60MR5X","BGaQYlsQGo","Ul4a1mX2GE","55rfBuZPqg","oGu6xdhSuH","vkCHHU3yw5","cQOnvk85Ae",
+"IBe8klkMUA","0h1b1Chuy3","8RCUAzbIYY","4W0Tlsoy9t","IjTwP2DREs","ogLgcWDVWJ","nnP8oh1zcH","pT8wuzmLYD","cShY2HlUbF","QYxC0WmadA",
+"7ku1pzz4ZU","fmIK1guMb8","5Drn0lweGy","S77LHSmGzv","m4bxU29QAz","zbIYYiB08l","14FLRpT8wu","UlU3M55rfB","8cVD3e6e4z","FLsphzqH0W",
+"7fKYUDG4sT","uZPqgZJTXH","FxX9qRxrsm","EoToP1LB1L","618DiTXQ0Z","prNT6JXljW","EdBKccmXIX","580YDpAhR1","vLsmSpWiOs","GSQwjlViBv",
+"5drc6soy9t","FGzgpVerEA","0PktIogLgc","s7Mxk0MR5X","CK5W7aFFss","uZPqgyofH3","55rfBpT8wu","s93MlRzaZA","LDk6fMmsIo","i7WMQ8FmFH",
+"YjB9tazIWp","AgJHQMmKGJ","dpe1vydG8U","cShY2jtn0X","ru4UG1v5hH","pWiOs4W0Tl","IjTwP29QAz","QnJ1SSmGzv","RsQUqi7WMQ","jeskSI7p2a",
+"EoToPRmDcr","lkMUAfLNg8","dhSuHzz4ZU","iqv4kJkzUn","JkzUnqQxHP","HzZT8M6qcG","uZPqggdQsS","vkCHHzFgtB","IBe8kKASQ8","pT8wugIYvE",
+"zHF1qbgJAz","0ao3lJ2mQi","AkKTkCK5W7","gIYvEYjB9t","AmdQdn1pmO","KZamH45cIH","v2eC32ZHdk","zY1GYpmeCd","jzUqRfaHir","v8yFNi7WMQ",
+"QworublLA9","lweGya00b5","07n1cCdyBV","ZJTXHIBe8k","ulk41RsQUq","POUYSaez9y","HfyNQPb1pa","W3VFHIBe8k","2TRI7ulk41","OUqFMlweGy",
+"rz7UtlsQGo","QWxoTRkQke","Q6hMCuoStw","0ao3lU3yw5","y94nwuvf7A","7lUXZblLA9","atef2IjTwP","bZLvSS77LH","OxWIHPOUYS","S77LHrKDLJ",
+"IRh48qQxHP","WmadAWmadA","gdQsSY1mC0","8FmFHCqqaD","ksJbyKASQ8","uZPqgtlILt","Uvlv4jS1aj","xReectaOXK","atef29y4lw","14FLRqQxHP",
+"TCgPpwiHrZ","HRxd8M6qcG","s4786EdBKc","W7cTsa00b5","VerEAL7cGc","NAFuw618Di","TCgPpni2v1","EdBKcFnPFB","Vprf28FmFH","uAWypgtCA5",
+"s7MxkfFDrJ","lCMxy64s8N","Chuy3zQt6Q","uoStwIKxdL","KsjRKYjB9t","MojnPEoToP","MK07YpWiOs","4QMc9zFgtB","IBe8kFFDui","n8pJ9U3yw5",
+"euZA5uN6r3","In3NSciuWz","jfREuwiHrZ","zQt6QLewvM","kB5nPMmKGJ","zHF1qfLNg8","MezSWoVQp6","EOE1ojSjS3","GrDg7POUYS","M3zXLhi5X7",
+"aDGtSIn3NS","nFqikhE1Ql","lpF6WMezSW","8FmFHzqH0W","lViBvpv0i7","TXQ0ZbrhlQ","24ARFKZamH","Oz8yZt98iW","CIShG0PktI","okgRigIYvE",
+"14FLRGWqqX","FPfSECqqaD","ciuWzVLTy6","5Mg9rzHF1q","0h1b14W0Tl","pAhR1lj07Q","QbxXcMmsIo","VIlwPjSjS3","euZA5QssNC","a00b5NhXdu",
+"FFDuiokgRi","GSQwjY1mC0","k85Aesx5Gl","5drc6lweGy","bZLvSZzJHW","uupzkF6PT2","RACuj618Di","mX2GEIRh48","MaJQsfcwDa","RpBQmQ6hMC",
+"pvgjSm4bxU","gtCA5Waim6","BGaQY24ARF","ZuDtDReKEW","LbRTHlm0pD","b29RJYf2Ec","Y1mC0rKDLJ","hYBCK7fsYM","lkMUAAmdQd","Q6LixuoStw",
+"fFDrJAkKTk","FFDuisqVrf","8TxD7NhXdu","n1pmOaL6AJ","CNHmvO3iyQ","s93Mlsoy9t","kB5nP2Yz7E","qaofNn1pmO","55rfBdQ586","Waim6IRh48",
+"8hJdtZhwG1","brhlQ7X3uy","iKqhrhYBCK","suY4xb29RJ","gtCA5s7Mxk","14FLRzqH0W","x3LDe9XyT9","FLsphP6bcg","Kr8ysokgRi","M6qcG7Ow5C",
+"618Disx5Gl","ZhwG1EoToP","JXljWZv7z0","U3yw5uPX7G","IjTwPEoToP","fLNg8l83Ud","sx5GlRBhp0","Yh1hFOUqFM","580YD9eoRc","ogLgc5Mg9r",
+"1j5L8QYxC0","LDk6fDQimp","uoStwGWqqX","5nmWvWPmlx","t59lRpmeCd","jSjS3AmdQd","uLtKslXFOB","24ARFt59lR","y94nwGrDg7","ciuWze6e4z",
+"TXQ0ZtAOsr","aL6AJ3weIF","lXFOBfcwDa","h1zcHPOUYS","o8UyduoStw","NOHszv2eC3","8xEKzJKWYR","KZamH7Ow5C","s4786LewvM","FLsphpiJSk",
+"FxX9qtvdkD","zmLYDJIqXi","lXFOBzHF1q","qQxHPtaOXK","ulk41ZJTXH","pWiOsK4GS8","JKWYRKsjRK","B3qemsx5Gl","uvf7AHP433","i7WMQhi5X7",
+"QYxC05VZjS","FLsphFwEJz","a00b5QYxC0","uN6r35IhmG","ZhwG1HzZT8","0YAGHjS1aj","9y4lwY1mC0","Y1mC0zz4ZU","aDGtS1j5L8","AOgEeuupzk",
+"Pb1paXyPZN","SbRYyVNCPd","fcwDaSbRYy","0YAGHIRh48","v2eC3nFqik","gIYvE1LB1L","C2Ircpv0i7","0YAGHaez9y","3weIF5Namm","Q6LixwDajX",
+"RBhp07fsYM","S77LHDcpWB","1LB1LZJTXH","DLhzM5nmWv","5nmWvzQt6Q","aFFsszFgtB","Gv3FqFjHXR","Ul4a1hSSvQ","iwzGk8RCUA","Z4I1vjSjS3",
+"y94nwokgRi","JkzUnTa8f6","YOfrY7fsYM","MmKGJrKDLJ","1j5L8VIlwP","jzUqRU3yw5","Kr8yszbIYY","G1RhSOz8yZ","KZamHx3LDe","nlaByIRh48",
+"YjB9tZzJHW","RpBQmiwzGk","45cIH5drc6","8xEKzvkCHH","zz4ZUSWfou","Yf2EcCIShG","ciuWzDG4sT","5Mg9rt59lR","CxVEfMm8si","1LB1L4QMc9",
+"Ta8f664s8N","CdyBVZ4I1v","pT8wuMGlTF","QChxsuTacx","CK5W7JJs5m","MezSWsqVrf","M6qcGRsQUq","tlILt55rfB","ZUnqtxXTI4","Vprf2BpYhV",
+"he9IAoQ87r","yluBxhYBCK","aDGtStAOsr","0PktID6rBy","fmIK1v8yFN","xciqpW7cTs","yofH3FjHXR","WaWsvrKDLJ","vkCHHLDk6f","KZamHKsjRK",
+"Yw2oUrz7Ut","o8UydPb1pa","he9IARpBQm","8RCUAJkzUn","VIlwP24ARF","pT8wuDz1R3","DcpWBReKEW","SbRYy7ku1p","lCMxy14FLR","uTacxK20wK",
+"QworuMezSW","m4bxU7Ow5C","qUJMdF6PT2","aDGtSpFrrl","55rfBxciqp","45cIHv2eC3","ReKEW6q6L9","mz8gxbgJAz","bZLvS55rfB","GSQwjxReec",
+"gjUTuIjTwP","uoStwNAFuw","VIlwPhe9IA","hYBCKQ6hMC","uoStwblLA9","WDVWJQYxC0","jtn0XMezSW","cQOnvaL6AJ","RxrsmVLTy6","8cVD38U2nU",
+"uQIczlj07Q","SWfoublLA9","Q6LixIRh48","zmLYD5VZjS","iwzGkeuZA5","cQOnvEOE1o","2hEEUFLsph","cL0aEGXdoH","YjB9tRsQUq","W7cTsVprf2",
+"VerEA0ao3l","M6qcG5Namm","aL6AJuJScX","K20wKzFgtB","UmaEvlCMxy","JJs5mEdBKc","SWfouQClRL","AgJHQvOqCE","45cIHKZamH","gIYvEOz8yZ",
+"FcWrWQ6hMC","WaWsvCNHmv","55rfBPYBf4","faHirgf8rI","MmKGJdQ586","FjHXREOE1o","zQt6QIBe8k","sx5GlnlaBy","hYBCKBbwgA","lpF6WMaJQs",
+"5ZaEzQChxs","k85AeDcpWB","Yf2EcFVMxo","4QMc9uN6r3","9rlg9M3zXL","dQ586Zv7z0","FxX9qcQOnv","iB08lhE1Ql","Nxx9VDG4sT","Twanoi3pyd",
+"TXQ0Z580YD","2ZHdke6e4z","0YAGHGWqqX","k85AeZuDtD","2DREs0Kyfs","hSSvQFVMxo","CNHmvhSSvQ","SjskQrKDLJ","CIShGDcpWB","HlUbFcQOnv",
+"DQimpVprf2","FNYIMKZamH","K4GS8sqVrf","DG4sTKr8ys","iwzGkB3qem","tAOsrNOHsz","9XyT9gf8rI","gtCA5qQxHP","lkMUAY1mC0","WDVWJFjHXR",
+"FNYIMtjQxs","NhXduqUJMd","s7MxkfLNg8","vOqCEMaJQs","4dEz62TRI7","ZUnqtlCMxy","8xEKz2TRI7","FjHXRi7WMQ","yluBx8hJdt","GWqqXVprf2",
+"dQ586ZuDtD","4dEz6xReec","nlaByjzUqR","aFFssJJs5m","55rfBQworu","aDGtSUvlv4","QChxs7fKYU","guMb8nFqik","aDGtSFNYIM","UlU3MqaofN",
+"fLNg8SWfou","vLsmSpv0i7","pWiOs7ku1p","fcwDaJXljW","RsQUq8FmFH","oQ87rQYxC0","GXdoHCqqaD","l83UdsqVrf","KZamH2hEEU","Q6hMCHzZT8",
+"AmdQdFVMxo","CIShGLewvM","zqH0WlViBv","2Yz7EuN6r3","Yf2EcFhtgl","RBhp0FjHXR","UlU3MKr8ys","nlaBy0BmCy","i7WMQWaim6","bgJAzYf2Ec",
+"lj07QlweGy","BGaQYbZLvS","SmGzvl83Ud","h1zcHrhl0J","guMb8tAOsr","k85Aemz8gx","RBhp08cVD3","S77LH0BmCy","iKqhr14FLR","ECMvUkB5nP",
+"RkQke2TRI7","FcWrWtAOsr","fFDrJY1mC0","fcwDa0Kyfs","W7cTsZv7z0","dmoS7U3yw5","jfREuvOqCE","dhSuH8FmFH","Yf2Ecy94nw","AmdQdEdBKc",
+"OUqFMnnP8o","HRxd8OxWIH","Pb1paRpBQm","dmoS7ThjNn","FxX9q2hEEU","ciuWzIn3NS","24ARFQbxXc","TCgPpRzaZA","RACujVjCZq","RkQkecQOnv",
+"uupzkfmIK1","Pb1paOHaBz","dhSuHLewvM","2Yz7EzQt6Q","lkMUAeuZA5","ksJbyMkgy8","TwanoW7cTs","ulk412Yz7E","dQ5862Nslm","fcJOyNAFuw",
+"DG4sTqQxHP","GrDg7FVMxo","EoToPMGlTF","B3qem7fsYM","BCxeCQWxoT","Chuy38U2nU","O3iyQdjsrv","VIlwPzbIYY","HlUbF64s8N","580YDwDajX",
+"SjskQNcICA","dhSuHd7vjM","Yf2Eclm0pD","e6e4z0MR5X","lsQGoYjB9t","v1Hln2TRI7","BpYhVNOHsz","fFDrJm4bxU","FVMxoRpBQm","LDk6fl83Ud",
+"W3VFH8FmFH","v8yFNCqqaD","7Ow5COxWIH","POUYSlkMUA","5VZjSFVMxo","yToGWv2eC3","oVQp62DREs","FjHXRGWqqX","Yw2oUEoToP","7hyVv5VZjS",
+"xReechSSvQ","RzaZAs7Mxk","DG4sTk85Ae","euZA5jfREu","VLTy6soy9t","brhlQVjCZq","a00b5AIYUu","5Drn0Twano","FjHXRv2eC3","hSSvQQClRL",
+"xciqp7fsYM","suY4xru4UG","9y4lwokgRi","rKDLJMmsIo","DQimpmX2GE","KZamHTXQ0Z","yEfy9QChxs","lkMUAbrhlQ","DQimphE1Ql","TCgPpo8Uyd",
+"EOE1oIjTwP","VNCPd2hEEU","v1Hlnl83Ud","UlU3MyluBx","0KyfsFwEJz","CIShG2ZHdk","SWfoulsQGo","QnJ1SFwEJz","YjB9tgjUTu","9GXkXqaofN",
+"9y4lwlj07Q","ciuWzcL0aE","FnPFBzz4ZU","nnP8oAkKTk","ZJTXHFwEJz","BpYhVQssNC","Mm8sicQOnv","rKDLJ7lUXZ","JJs5mblLA9","lXFOBHzZT8",
+"Kr8ysSbRYy","soy9t4dEz6","nnP8ok85Ae","JkzUnS2Dfu","guMb8jiVBP","FwEJzfqypy","BpYhVMezSW","KsjRKx3LDe","tl72WSbRYy","jfREublLA9",
+"1LB1L5ZaEz","GWqqXy94nw","L7cGcdmoS7","gjUTuhYBCK","VjCZq1v5hH","24ARF2DREs","5VZjS1LB1L","EoToPuAWyp","M3zXLjtn0X","hi5X7tl72W",
+"W7cTssx5Gl","nnP8oxciqp","2Yz7EazIWp","G1RhS7hyVv","atef29iGoT","PYBf4azIWp","JkzUnogLgc","WMiS3KsjRK","5iGN5VBjhz","nnP8ohUTw7",
+"guMb8uoStw","pvgjSReKEW","uoStwuJScX","Mkgy8Rxrsm","jtn0Xiqv4k","m4bxUTa8f6","RpBQmAmdQd","Mm8si9y4lw","bZLvS8FmFH","RBhp02Yz7E",
+"jzUqR0Kyfs","8cVD31j5L8","CK5W7o8Uyd","MmsIoguMb8","zbIYY8U2nU","SjskQStlDJ","6AFT09iGoT","VerEAQ6Lix","24ARFNxx9V","RBhp0XflUq",
+"K4GS83weIF","0MR5XQYxC0","1v5hHAOgEe","dQ586QbxXc","BFkb8NOHsz","MezSWJIqXi","hE1QlPYBf4","VNCPds4786","suY4xtjQxs","MezSWTwano",
+"24ARFsuY4x","ZJTXHwDajX","GrDg79rlg9","BbwgAJ2mQi","s47869eoRc","FjHXRG1RhS","Mkgy8ulk41","yofH3GWqqX","ru4UGK4GS8","JKWYRRsQUq",
+"EoToP0Kyfs","gtCA59eoRc","fcJOyvkCHH","SjskQ4dEz6","n1pmOjzUqR","F6PT2zHF1q","gtCA5SjskQ","gtCA59rlg9","fqypywDajX","MaJQsDLhzM",
+"1LB1LJKWYR","lweGy5VZjS","tl72W4dEz6","d85a90ao3l","No0QbMezSW","oQ87rReKEW","Y1mC0DQimp","9GXkXGXdoH","5VZjSjiVBP","O3iyQ7hyVv",
+"FwEJzgIYvE","ix74rogLgc","RkQket59lR","TCgPpQbxXc","MGlTFOUYuF","lpF6WcShY2","e6e4zaez9y","Yw2oUxReec","qaofNEoToP","OUqFMlpF6W",
+"KZamH5IhmG","In3NS0YAGH","QYxC0CNHmv","GXdoHokgRi","tlILtG1RhS","xXTI4dQ586","fLNg8oVQp6","SmGzvlj07Q","d7vjMgtCA5","ThjNnRBhp0",
+"aez9yJ2mQi","VBjhzHRxd8","qQxHP0h1b1","Mm8si1j5L8","lH1ktIBe8k","0h1b1pv0i7","dQ586KZamH","IKxdLLewvM","29QAzpAhR1","VLTy6RzaZA",
+"zQt6QfmIK1","AkKTkAXpwE","MGlTFMm8si","h1zcHPYBf4","Yh1hFEoToP","5VZjSK4GS8","ru4UG0BmCy","4QMc9JkzUn","FLsphaDGtS","NOHszSjskQ",
+"i7WMQW7cTs","VNCPd0YAGH","MaJQsoGu6x","GSQwjSmGzv","brhlQe6e4z","9rlg9lXFOB","xXTI4OUYuF","pvgjSBCxeC","ni2v17fKYU","guMb8brhlQ",
+"EoToP6q6L9","NOHszpvgjS","SbRYyqUJMd","FwEJzfaHir","v1Hln9iGoT","CNHmvnnP8o","Ul4a1LDk6f","ReKEWUmaEv","MK07Ys93Ml","QworuM3zXL",
+"RsQUqdmoS7","Pb1paRsQUq","sx5GluLtKs","zFgtBGXdoH","uLtKslH1kt","ZuDtDKr8ys","nFqikbgJAz","vkCHHJJs5m","yvOMIRkQke","MezSWxciqp",
+"7ku1p0BmCy","xXTI4WaWsv","zmLYDDLhzM","sqVrfbrhlQ","rz7Utru4UG","i7WMQ48cHL","wDajXzQt6Q","5iGN5EdBKc","8TxD7d7vjM","EOE1obZLvS",
+"UmaEvECMvU","Waim6JKWYR","uPX7G2Yz7E","uoStw1j5L8","AmdQdt98iW","VBjhzO3iyQ","lm0pD9rlg9","618Di9XyT9","LbRTHzHF1q","d85a9FGzgp",
+"jeskSDG4sT","IjTwPa00b5","RBhp0WmadA","GWqqXNOHsz","pT8wuZzJHW","Cp3mZlkMUA","qQxHP8U2nU","pWiOsNxx9V","zmLYDFFDui","8TxD7xReec",
+"dQ586FNYIM","fLNg8NcICA","Zv7z0D6rBy","ZJTXHiB08l","HP433nFqik","618Di8cVD3","QYxC0atef2","pmeCdThjNn","POUYSni2v1","4dEz6ksJby",
+"uupzkBFkb8","o8UydAmdQd","DQimpzbIYY","rKDLJThjNn","5VZjShe9IA","lsQGo8FmFH","wDajXvOqCE","F6PT2Yf2Ec","s7MxknnP8o","lm0pDYh1hF",
+"EoToPix74r","CdyBVtl72W","8RCUAdmoS7","5ZaEzNOHsz","FnPFBs93Ml","FcWrWhi5X7","lkMUA24ARF","CqqaDuoStw","lweGycQOnv","1v5hHlViBv",
+"FhtglS2Dfu","JkzUnlCMxy","xXTI4aL6AJ","JXljW1j5L8","hSSvQIBe8k","4W0TlJJs5m","45cIHksJby","7fsYMtAOsr","iqv4kd85a9","dQ5869GXkX",
+"t59lRuoStw","Yf2EczY1GY","P6bcgsx5Gl","ZuDtDfcJOy","ZhwG1ciuWz","ciuWzoQ87r","d85a99rlg9","zmLYDrz7Ut","IjTwPMGlTF","1j5L86q6L9",
+"l83UdMm8si","9iGoT2ZHdk","8cVD329QAz","zQt6Q2TRI7","v2eC3GWqqX","Kr8ysQYxC0","yofH3OHaBz","4W0TlP6bcg","Ul4a1suY4x","DcpWBn8pJ9",
+"fLNg8BbwgA","xciqpRmDcr","SbRYyRzaZA","hUTw7vOqCE","WmadAChuy3","K20wKsqVrf","M6qcGSWfou","DLhzMBpYhV","B3qem5VZjS","EoToP4dEz6",
+"IRh48Zv7z0","6AFT0MGlTF","AgJHQQbxXc","HzZT8OHaBz","AmdQdCK5W7","JXljWiKqhr","Pb1paCNHmv","mX2GEFVMxo","Mkgy8QYxC0","i3pyd8cVD3",
+"580YDTwano","WmadAn1pmO","uPX7GuQIcz","RzaZAD6rBy","cShY2oGu6x","DQimp7fKYU","jzUqRTXQ0Z","gdQsS8hJdt","Nxx9V64s8N","lH1ktEoToP",
+"RsQUqAkKTk","sqVrfCfgr3","RmDcrvkCHH","pmeCdguMb8","K20wKQbxXc","2Yz7EdhSuH","QworuydG8U","ix74rQssNC","7X3uylm0pD","zmLYD1LB1L",
+"AIYUu5Mg9r","o8Uyd7fKYU","0PktI5nmWv","RsQUqe6e4z","5nmWvvLsmS","DQimphUTw7","StlDJPYBf4","xXTI4MGlTF","fcJOyHRxd8","yEfy9YOfrY",
+"64s8NaL6AJ","tl72Wo8Uyd","Vprf2Mm8si","fLNg8he9IA","2hEEU9eoRc","C2IrcSbRYy","brhlQulk41","blLA9OUqFM","ix74rW3VFH","IjTwPI7p2a",
+"fFDrJO3iyQ","ydG8Uy94nw","2hEEUeuZA5","pAhR1tAOsr","iKqhryEfy9","7fsYMZJTXH","5Mg9rhe9IA","t59lRaez9y","v2eC3v2eC3","Vprf2djsrv",
+"pmeCduoStw","SWfouHfyNQ","0YAGHFPfSE","jiVBPgdQsS","HzZT8lj07Q","tAOsrJkzUn","s93MluN6r3","atef2v8yFN","5Drn0prNT6","ZJTXHmz8gx",
+"8cVD3KASQ8","5iGN59GXkX","WaWsvkZANm","yToGWQnJ1S","JJs5mNxx9V","FFDuiQWxoT","5VZjSqaofN","5Mg9rDG4sT","ECMvU0Wr5y","YjB9t7X3uy",
+"TXQ0ZSbRYy","xciqplweGy","Waim6dhSuH","fLNg8GXdoH","In3NS2Nslm","IRh48xReec","JRJQBVLTy6","lXFOBVjCZq","MmKGJdpe1v","JRJQBFVMxo",
+"JRJQBmz8gx","K20wKFnPFB","v8yFNOHaBz","K4GS8WPmlx","3weIFoGu6x","YOfrYfFDrJ","Uvlv4sx5Gl","SjskQMmsIo","TXQ0ZNOHsz","AOgEerz7Ut",
+"hYBCKbgJAz","zHF1qyToGW","uupzkpT8wu","gtCA5hUTw7","8hJdtnlaBy","hUTw7pvgjS","XyPZNCIShG","QChxssuY4x","Pb1pavkCHH","FPfSEQworu",
+"rz7UtVBjhz","djsrvFxX9q","cQOnvP6bcg","FPfSE0ao3l","0PktIe6e4z","NhXdu9GXkX","lkMUAqUJMd","ZUnqtyluBx","tlILtciuWz","BFkb8faHir",
+"RxrsmiB08l","pv0i70BmCy","Q6LixVLTy6","7hyVvBGaQY","5nmWv618Di","29QAzb29RJ","dhSuHvOqCE","J2mQiGv3Fq","VjCZqlCMxy","Oz8yZSs0Zu",
+"rKDLJgdQsS","J2mQifmIK1","h1zcHMaJQs","he9IANcICA","tlILtcQOnv","5IhmGRmDcr","zbIYYWmadA","S77LHZuDtD","OHaBzIjTwP","s7MxkKr8ys",
+"fLNg8qaofN","tl72WfLNg8","RsQUqokgRi","CK5W7HfyNQ","GSQwjOz8yZ","QYxC02TRI7","2TRI7IKxdL","Mkgy8rKDLJ","BpYhVQClRL","jtn0XHzZT8",
+"HfyNQuZPqg","hUTw7kZANm","ZhwG1n8pJ9","zmLYDFVMxo","zQt6QyvOMI","UlU3MvkCHH","QnJ1StAOsr","16lHcQ6Lix","uZPqgTa8f6","fmIK1Cp3mZ",
+"tl72W07n1c","WaWsvDLhzM","16lHce6e4z","VLTy6hSSvQ","RkQkeFcWrW","Mkgy8JKWYR","ix74r0PktI","b29RJlViBv","8RCUAZzJHW","JKWYRsx5Gl",
+"t98iWQworu","YjB9ts4786","2Yz7E7hyVv","W7cTsvkCHH","3weIFStlDJ","uoStwReKEW","HzZT8cL0aE","l83UdprNT6","pT8wutuDyS","fFDrJAmdQd",
+"ni2v1s4786","jfREuv2eC3","8U2nUYjB9t","i7WMQJIqXi","ZuDtDh1zcH","taOXKh1zcH","MGlTFDcpWB","t98iWgtCA5","5IhmGcL0aE","FnPFB16lHc",
+"JJs5mNhXdu","YjB9t7fsYM","okgRisoy9t","AmdQduZPqg","5ZaEzgjUTu","yluBxIRh48","vkCHHjS1aj","Q6LixBFkb8","FwEJzThjNn","VBjhzFGzgp",
+"vLsmSKr8ys","KASQ8RzaZA","VLTy69iGoT","I7p2aiB08l","oQ87r9eoRc","JRJQBtl72W","s93Mli7WMQ","QClRLpmeCd","24ARFv1Hln","ksJbytAOsr",
+"gtCA5S2Dfu","Ul4a1cL0aE","FVMxoVprf2","45cIHGXdoH","zY1GYSWfou","WMiS316lHc","tuDySeuZA5","Vprf2YOfrY","MaJQs14FLR","x3LDeRpBQm",
+"RACujNhXdu","lkMUAB3qem","EoToPOUYuF","2DREsrKDLJ","OUYuF2DREs","l83UduJScX","dpe1vDz1R3","S2DfuTwano","pv0i7iKqhr","AkKTkYOfrY",
+"pmeCdzmLYD","1LB1LQWxoT","DG4sTFnPFB","QYxC09GXkX","Ss0ZuMaJQs","5IhmGTa8f6","5nmWvAIYUu","MGlTFQChxs","hYBCKyvOMI","n1pmOWaim6",
+"3otm6aDGtS","DLhzMfqypy","WreyPvLsmS","MezSWYh1hF","MK07YtjQxs","BpYhVGXdoH","Waim6k85Ae","RsQUqyvOMI","JIqXijS1aj","cL0aEprNT6",
+"MGlTFazIWp","K20wKRBhp0","gdQsSBCxeC","lsQGoxciqp","xXTI4BbwgA","BbwgApiJSk","5nmWvVIlwP","wiHrZS77LH","RpBQmcQOnv","580YDciuWz",
+"kB5nPTa8f6","S77LHG1RhS","gtCA56AFT0","WaWsvKZamH","uTacxDz1R3","Yf2Ectl72W","24ARFJXljW","MezSW14FLR","FLsphWmadA","pT8wuFGzgp",
+"pT8wuJkzUn","BpYhVyEfy9","Mkgy8fcwDa","prNT6UmaEv","GSQwj45cIH","zQt6Q8TxD7","d7vjM2hEEU","VNCPd5Drn0","LDk6fNxx9V","cmXIXOUqFM",
+"lj07QThjNn","yluBxlweGy","MGlTFNOHsz","45cIHQbxXc","hE1Ql1j5L8","0h1b1hYBCK","S77LHYf2Ec","gdQsSO3iyQ","Q6hMC14FLR","FLsphWaWsv",
+"tuDySEoToP","ECMvUKASQ8","5IhmGSjskQ","DG4sT24ARF","y94nwCp3mZ","Ss0ZuHlUbF","5Mg9rhE1Ql","5Drn0D6rBy","QYxC05Namm","CqqaDdpe1v",
+"uAWypcmXIX","0PktIS2Dfu","aez9yHRxd8","HzZT8ksJby","Q6LixfFDrJ","faHirFhtgl","FjHXRWaWsv","No0QbprNT6","IjTwPru4UG","k85AeQbxXc",
+"RzaZA5ZaEz","KsjRKJRJQB","rz7UtThjNn","2hEEUuQIcz","5NammFxX9q","bZLvSRpBQm","ogLgcQworu","FLsphMmKGJ","tlILtn8pJ9","ThjNnfFDrJ",
+"7ku1plpF6W","Rxrsmrz7Ut","HRxd8HRxd8","M3zXLVNCPd","lViBvjfREu","DcpWBStlDJ","D6rByK4GS8","jfREu14FLR","yluBx0Wr5y","FwEJza00b5",
+"jSjS3a00b5","C2IrcrKDLJ","jiVBPjS1aj","Ta8f62hEEU","QWxoTaez9y","WPmlx5ZaEz","jzUqRYw2oU","qaofNblLA9","ZzJHW8FmFH","7fKYUWaWsv",
+"KZamHFPfSE","uJScXL7cGc","vkCHHNOHsz","9eoRcJ2mQi","StlDJ1v5hH","ThjNnlpF6W","guMb8L7cGc","jzUqRzbIYY","tjQxsh1zcH","ZJTXHn8pJ9",
+"OxWIHcShY2","MmKGJU3yw5","CIShG29QAz","gf8rIogLgc","8TxD7zmLYD","ix74raez9y","taOXKs93Ml","QChxsS2Dfu","oGu6xnlaBy","WDVWJjeskS",
+"ciuWz2Nslm","d7vjMHfyNQ","0h1b1vkCHH","cShY2HRxd8","Vprf2lCMxy","FGzgpKASQ8","Z4I1vn8pJ9","sqVrfoQ87r","NAFuwRBhp0","xciqpVerEA",
+"fqypy5drc6","IBe8kjSjS3","Cfgr3gIYvE","tjQxsHRxd8","suY4x4QMc9","4QMc9KASQ8","Yf2EcoVQp6","CK5W7ZuDtD","1v5hH8TxD7","0h1b1IKxdL",
+"BGaQYdjsrv","lj07QAXpwE","s4786OHaBz","hi5X7iwzGk","euZA5fcJOy","Z4I1vk85Ae","7hyVvrz7Ut","45cIHBCxeC","FxX9q9XyT9","7fKYUThjNn",
+"X6Pingf8rI","45cIHZJTXH","5VZjSogLgc","Ss0ZufmIK1","6AFT0QnJ1S","1j5L8DQimp","S77LHaFFss","s93Ml7ku1p","HlUbFFjHXR","HfyNQQClRL",
+"cShY2WaWsv","aFFsscShY2","5NammQClRL","MK07Y14FLR","CNHmvhi5X7","55rfBru4UG","K20wKMK07Y","FwEJzb29RJ","LbRTHdmoS7","HP433fqypy",
+"oVQp6iKqhr","VIlwPuTacx","S2DfufaHir","0Wr5yZuDtD","5ZaEzaez9y","WPmlxzmLYD","VNCPdC2Irc","tlILtaez9y","zbIYYzFgtB","55rfBCqqaD",
+"s4786uupzk","1LB1LuTacx","9XyT95ZaEz","zqH0W580YD","NcICAHzZT8","ZJTXHQnJ1S","Cfgr3FxX9q","K4GS8SmGzv","lCMxyPYBf4","580YDWDVWJ",
+"8xEKz8RCUA","RsQUqAXpwE","ZUnqtS77LH","zz4ZU0MR5X","vLsmSM6qcG","WPmlxnnP8o","Ss0Zujtn0X","fcJOyS77LH","2TRI7RpBQm","SjskQiKqhr",
+"0YAGHMmsIo","okgRiVIlwP","3otm6d7vjM","tjQxsPOUYS","ix74riKqhr","ZUnqtECMvU","5ZaEzHzZT8","45cIHZhwG1","FLsphcL0aE","tuDySDQimp",
+"BCxeCguMb8","fqypyaez9y","iKqhrsuY4x","VerEAZJTXH","IjTwP1j5L8","uLtKsy94nw","JJs5mi3pyd","X6PinmX2GE","HlUbFe6e4z","lkMUA7fsYM",
+"yToGWxReec","IKxdLxReec","ru4UG7X3uy","MezSWfcJOy","Q6hMClH1kt","iqv4kKASQ8","yEfy90BmCy","fcJOyokgRi","XyPZNI7p2a","Kr8ysuZPqg",
+"8xEKzjzUqR","uvf7ARkQke","wiHrZAOgEe","cL0aEWaWsv","M6qcGprNT6","rKDLJksJby","WPmlxXflUq","k85AefcwDa","bgJAzzz4ZU","Q6hMCRACuj",
+"aDGtSBCxeC","s7MxkjSjS3","cmXIXMm8si","BbwgAnlaBy","8hJdtUl4a1","4QMc9WPmlx","jiVBPm4bxU","SWfouoGu6x","AXpwE5VZjS","L7cGcCK5W7",
+"55rfBSmGzv","atef2kZANm","vOqCEGrDg7","4W0TlQbxXc","ogLgcgtCA5","1v5hHhSSvQ","24ARFaFFss","ThjNnjiVBP","hYBCKlweGy","Waim6ulk41",
+"jfREu2Nslm","BGaQYhUTw7","lkMUAOUqFM","FxX9qsqVrf","sqVrfDLhzM","GWqqXlpF6W","5ZaEz5drc6","W3VFHGrDg7","7ku1pvkCHH","ru4UGyluBx",
+"mX2GEBpYhV","tl72WsqVrf","h1zcHfcwDa","0YAGHk85Ae","v2eC3uQIcz","Vprf2HRxd8","lViBvvkCHH","AIYUuFPfSE","taOXKQWxoT","v8yFNCK5W7",
+"Cp3mZ64s8N","nnP8o5nmWv","HP433fcwDa","fcJOyBGaQY","JIqXiFhtgl","gtCA52DREs","fLNg8jeskS","hi5X7RpBQm","64s8NZhwG1","FFDuilsQGo",
+"ksJbya00b5","MaJQs2Nslm","ydG8UQClRL","lm0pDMK07Y","iKqhrhe9IA","5VZjS0MR5X","fFDrJ3otm6","FFDuiMGlTF","CdyBVUmaEv","iKqhrQYxC0",
+"uLtKssuY4x","v1Hln3otm6","fmIK1Rxrsm","UmaEvni2v1","FjHXRIjTwP","48cHL0Wr5y","O3iyQK20wK","RzaZA8FmFH","DLhzMlj07Q","Z4I1vTa8f6",
+"ksJbyulk41","2Yz7EfLNg8","i3pydJ2mQi","L7cGcTwano","0MR5XtjQxs","CxVEf9XyT9","7Ow5C0PktI","FLsphIRh48","nnP8oZuDtD","1j5L8t59lR",
+"7ku1pgtCA5","Nxx9Vl83Ud","KZamHQ6hMC","8U2nULewvM","h1zcHuTacx","EdBKc7fKYU","FVMxoJKWYR","pT8wu14FLR","B3qemRzaZA","J2mQiv8yFN",
+"Zv7z0W3VFH","07n1cs4786","YjB9tdjsrv","KsjRKJIqXi","pAhR1yToGW","k85AepAhR1","Nxx9V7fsYM","jzUqRWPmlx","azIWpb29RJ","uZPqgt98iW",
+"0MR5XZ4I1v","RxrsmRBhp0","618DicL0aE","dmoS7cShY2","dmoS7zz4ZU","Q6hMC9XyT9","lsQGoC2Irc","vkCHHJKWYR","QbxXczbIYY","yofH3lkMUA",
+"uupzkD6rBy","pFrrlAkKTk","xciqpQWxoT","0PktIWreyP","2hEEUSWfou","2hEEUSjskQ","MojnP0YAGH","wiHrZ3weIF","MojnPFxX9q","djsrv7ku1p",
+"uLtKspAhR1","nFqikAIYUu","ZuDtDtjQxs","guMb8tjQxs","t59lRbrhlQ","ulk41O3iyQ","v1HlnuZPqg","ZzJHWB3qem","UmaEvZJTXH","zz4ZUUl4a1",
+"taOXKW7cTs","nFqikL7cGc","ZuDtDzqH0W","aez9yoGu6x","nFqikhUTw7","Vprf2zHF1q","CIShGsx5Gl","mX2GEQ6hMC","WPmlxYf2Ec","AOgEesuY4x",
+"S2Dfu6AFT0","Q6hMC8cVD3","l83UdOxWIH","fqypyGWqqX","GWqqXZzJHW","UlU3MDLhzM","55rfBAkKTk","5drc67X3uy","Yh1hFzFgtB","0PktIdpe1v",
+"cQOnv1v5hH","AIYUu3weIF","GWqqXW7cTs","Ul4a1uTacx","dpe1vYOfrY","VLTy6ZUnqt","Waim6x3LDe","0PktIVjCZq","DQimpYh1hF","29QAza00b5",
+"IBe8k2Yz7E","618DiuoStw","uupzkNo0Qb","8TxD7JXljW","5iGN5hi5X7","EdBKc16lHc","W3VFHMaJQs","2Yz7Eb29RJ","S2DfuzQt6Q","DLhzMwiHrZ",
+"Ss0ZuQChxs","EOE1ooQ87r","zFgtBhUTw7","55rfBUl4a1","WMiS36q6L9","UlU3MnnP8o","07n1cguMb8","jiVBPuJScX","OUYuFYw2oU","lsQGo8hJdt",
+"a00b5uN6r3","NhXdu8TxD7","azIWpRzaZA","fLNg80MR5X","Mkgy8Ta8f6","lpF6WaFFss","QWxoTlViBv","oVQp6WmadA","5iGN5prNT6","fcJOySbRYy",
+"8FmFHHzZT8","Pb1paFFDui","Waim6QChxs","Q6hMCwDajX","iKqhrCNHmv","LewvMTa8f6","WaWsv0ao3l","OUqFMAmdQd","pT8wuVerEA","tjQxse6e4z",
+"5Mg9rZv7z0","cmXIXs4786","ECMvU9rlg9","Yw2oUMaJQs","x3LDeiB08l","Mkgy8dhSuH","ix74rM3zXL","1j5L8WPmlx","sx5GlcQOnv","8U2nUCp3mZ",
+"WDVWJOHaBz","nnP8oVLTy6","jtn0XW7cTs","rhl0JlXFOB","TCgPpTa8f6","fFDrJtl72W","soy9t9GXkX","ECMvUS2Dfu","NAFuwd7vjM","BGaQYCNHmv",
+"n8pJ9Yw2oU","WaWsvzz4ZU","iKqhrjS1aj","lCMxyVBjhz","qaofNyluBx","hSSvQzz4ZU","3weIFguMb8","zqH0W7Ow5C","9eoRcix74r","pAhR1AmdQd",
+"DcpWBni2v1","6q6L9ZUnqt","cShY2CK5W7","AIYUuiqv4k","uoStwuPX7G","m4bxUpmeCd","PYBf4nlaBy","bgJAzEoToP","RmDcrtAOsr","pv0i75iGN5",
+"ni2v1tl72W","okgRiFNYIM","BFkb8CIShG","580YDaL6AJ","yToGW1LB1L","gjUTuVIlwP","fLNg8pAhR1","zFgtBfmIK1","FxX9qlH1kt","Ta8f6zHF1q",
+"wDajXcShY2","x3LDetl72W","MaJQsRACuj","ydG8UZzJHW","F6PT2JKWYR","WDVWJAOgEe","LewvMpvgjS","oQ87rv8yFN","OUqFMgjUTu","lj07Qdjsrv",
+"jS1ajy94nw","AgJHQOz8yZ","piJSk9GXkX","8xEKzfqypy","Qworulj07Q","4W0TldhSuH","VNCPd1LB1L","IRh48O3iyQ","JKWYRIjTwP","B3qemgf8rI",
+"7ku1phSSvQ","zHF1qlCMxy","FcWrWWaWsv","FnPFBv8yFN","Qworuiqv4k","VjCZqHlUbF","Oz8yZuoStw","yluBx1j5L8","lm0pDjfREu","In3NSWPmlx",
+"YjB9t6q6L9","DLhzMYjB9t","zY1GYPYBf4","0YAGHHlUbF","TXQ0ZgdQsS","C2Irc5ZaEz","m4bxUaez9y","FhtglAIYUu","5iGN5hYBCK","X6PinfFDrJ",
+"pv0i71v5hH","0YAGHFNYIM","Q6Lixsx5Gl","GWqqX2hEEU","dmoS7VBjhz","YOfrY2DREs","m4bxUReKEW","S77LHAgJHQ","RACuj2hEEU","WmadAWaim6",
+"dhSuHMGlTF","fmIK11v5hH","s4786Dz1R3","MmsIoRpBQm","618DiMkgy8","5iGN5n8pJ9","euZA5MaJQs","VIlwPUlU3M","2DREsFPfSE","BGaQYKr8ys",
+"O3iyQRBhp0","ksJbylj07Q","07n1cI7p2a","AkKTkGrDg7","pmeCdjfREu","0PktII7p2a","IjTwPFjHXR","aL6AJJXljW","HfyNQZuDtD","kB5nPVIlwP",
+"qaofNQ6Lix","0MR5XNo0Qb","45cIH0h1b1","IKxdLpT8wu","0YAGHAOgEe","vOqCE0PktI","RmDcryToGW","prNT6Chuy3","n1pmO5Drn0","gtCA5G1RhS",
+"yToGWYjB9t","5IhmGazIWp","pT8wubgJAz","EoToPIKxdL","Cp3mZRzaZA","jSjS3HRxd8","n8pJ9M6qcG","OHaBzP6bcg","kZANmEOE1o","2Yz7EMmsIo",
+"fmIK1t59lR","t98iW8TxD7","lj07QDG4sT","piJSkvLsmS","n8pJ9jzUqR","5IhmGYjB9t","7hyVv5Mg9r","9eoRc3weIF","M6qcGQClRL","ix74rUl4a1",
+"uTacxjSjS3","CxVEf14FLR","8xEKzuoStw","v8yFNuAWyp","fmIK114FLR","ZhwG1euZA5","AOgEeaDGtS","atef20PktI","K20wKhE1Ql","C2IrcBbwgA",
+"AIYUuuZPqg","Nxx9VZJTXH","JKWYRni2v1","P6bcgZJTXH","rKDLJB3qem","In3NSxXTI4","L7cGcMGlTF","K4GS8dhSuH","Mm8si7lUXZ","Yw2oUOHaBz",
+"atef2lkMUA","618Di1v5hH","lpF6WrKDLJ","yEfy9zQt6Q","xReecFcWrW","s93MlECMvU","oGu6xpvgjS","618DidhSuH","Y1mC0pFrrl","5iGN5POUYS",
+"VjCZqP6bcg","OxWIHMGlTF","b29RJfcJOy","MezSW8xEKz","jfREuhi5X7","s93MlK20wK","Nxx9VFVMxo","jtn0X7X3uy","prNT6mX2GE","BCxeC8xEKz",
+"Zv7z016lHc","suY4xv2eC3","FNYIM7X3uy","FnPFBiKqhr","brhlQSWfou","kZANmYf2Ec","5drc6aFFss","0PktIgjUTu","9GXkXtvdkD","gtCA5gdQsS",
+"nlaByOUYuF","gtCA5M6qcG","FPfSEWaim6","e6e4zn8pJ9","7fsYMIRh48","jzUqRiqv4k","pWiOsZhwG1","IRh48AmdQd","2ZHdkBFkb8","48cHLsuY4x",
+"2hEEUfcwDa","1LB1LCfgr3","TwanonnP8o","Gv3FqlsQGo","BpYhVHP433","VLTy6iqv4k","a00b555rfB","580YDAOgEe","0YAGHYf2Ec","RpBQmIjTwP",
+"fqypylXFOB","piJSkCIShG","WaWsvAIYUu","9XyT9fLNg8","5NammWaWsv","8xEKzv8yFN","SWfoudjsrv","Yw2oUDcpWB","ix74rHRxd8","8TxD7In3NS",
+"Vprf2l83Ud","S77LHgIYvE","4dEz6Qworu","xXTI4X6Pin","zHF1qAkKTk","IBe8kWreyP","9eoRcDQimp","P6bcglXFOB","Pb1paYOfrY","t59lRSjskQ",
+"ZhwG1VNCPd","S2DfuJkzUn","KASQ8oQ87r","AkKTkS77LH","JRJQBzbIYY","y94nwi7WMQ","FhtglVerEA","07n1cYjB9t","KZamHnFqik","7lUXZBGaQY",
+"piJSkkB5nP","KsjRKlViBv","8xEKzAkKTk","2DREsdmoS7","VBjhz0PktI","8xEKzEOE1o","MezSWJJs5m","FxX9q0ao3l","xXTI4jiVBP","iqv4klm0pD",
+"AXpwENxx9V","StlDJKASQ8","lXFOBlpF6W","B3qem55rfB","9XyT97Ow5C","5NammyToGW","cL0aElpF6W","Pb1pa64s8N","aDGtSeuZA5","D6rBydmoS7",
+"FVMxodQ586","uQIcz618Di","okgRiJXljW","ZuDtDeuZA5","EoToPAIYUu","euZA5jSjS3","D6rBys7Mxk","HlUbFNOHsz","pmeCdTa8f6","uQIczRsQUq",
+"RpBQmzz4ZU","16lHcMaJQs","55rfBiwzGk","D6rByECMvU","uTacxeuZA5","OUYuFJRJQB","hYBCKK4GS8","NcICA2hEEU","YOfrYjeskS","qUJMduZPqg",
+"aez9yuTacx","Ul4a1ZJTXH","aFFsstvdkD","2ZHdk8hJdt","XyPZNm4bxU","guMb8SWfou","brhlQCdyBV","kZANmmz8gx","hUTw7I7p2a","gdQsSfaHir",
+"uZPqgK20wK","VIlwPIjTwP","tvdkD5Namm","pmeCd07n1c","uJScXRxrsm","t98iWXyPZN","uTacxv1Hln","blLA9ydG8U","4dEz6soy9t","7fKYUk85Ae",
+"XflUqk85Ae","a00b5vLsmS","MojnPVNCPd","Yw2oUzHF1q","9eoRc7X3uy","h1zcH5iGN5","YOfrYuZPqg","xReecNcICA","zmLYD4dEz6","azIWpBpYhV",
+"Gv3FqCxVEf","d7vjM4W0Tl","VerEAOUqFM","faHirQYxC0","t59lRRzaZA","mz8gxNAFuw","jSjS3Oz8yZ","KZamHKASQ8","atef2DLhzM","BCxeCdjsrv",
+"64s8NHlUbF","9XyT9bZLvS","HlUbF4dEz6","nnP8o9y4lw","jSjS3azIWp","AOgEeIn3NS","ni2v1Cfgr3","kB5nPRxrsm","k85AeOz8yZ","ksJbyhE1Ql",
+"iqv4k4dEz6","y94nwhSSvQ","EOE1oSjskQ","RpBQmL7cGc","M3zXLaDGtS","W3VFHrz7Ut","MojnPFVMxo","Q6LixIBe8k","suY4xBFkb8","TCgPpRxrsm",
+"gf8rICp3mZ","AOgEe0ao3l","brhlQJJs5m","Zv7z08U2nU","a00b55ZaEz","dQ586TCgPp","2Yz7ElpF6W","SmGzvmz8gx","tl72WkB5nP","8TxD7AIYUu",
+"jfREuF6PT2","6AFT0he9IA","7X3uyUlU3M","nlaByn1pmO","MGlTFOxWIH","uLtKsjeskS","iB08loQ87r","iqv4kFxX9q","uQIczRxrsm","mz8gxzqH0W",
+"JIqXiiwzGk","1LB1LIn3NS","64s8NhUTw7","XyPZNpvgjS","KZamHyluBx","v8yFNCIShG","lweGyNAFuw","MmKGJAkKTk","euZA50MR5X","580YDQYxC0",
+"8FmFHnlaBy","lCMxy8hJdt","StlDJUl4a1","OUqFMBCxeC","SbRYyhE1Ql","uN6r3lkMUA","aL6AJBCxeC","JRJQBRmDcr","6AFT0ECMvU","SbRYyt59lR",
+"AIYUusoy9t","RzaZAaez9y","ksJby618Di","8TxD7K20wK","uQIczFnPFB","LewvMECMvU","uLtKsi3pyd","cShY2tl72W","FNYIM5IhmG","VLTy6rz7Ut",
+"SjskQWaim6","FnPFBpiJSk","FhtglGrDg7","zz4ZU8U2nU","HP433faHir","zqH0WRpBQm","oQ87rFxX9q","HRxd8brhlQ","wiHrZnnP8o","d7vjMMojnP",
+"CdyBV4QMc9","No0Qb1LB1L","okgRiFwEJz","0Wr5yKASQ8","NcICAJJs5m","jzUqRSWfou","uAWypzz4ZU","FnPFBfcJOy","yToGWhSSvQ","WreyPt98iW",
+"HfyNQOz8yZ","zY1GYDcpWB","jzUqREoToP","h1zcHrz7Ut","yToGWxciqp","yToGW2hEEU","WmadAW3VFH","i3pydzHF1q","SjskQDz1R3","No0Qb0Wr5y",
+"QnJ1SDcpWB","jS1ajhE1Ql","2Nslmh1zcH","tl72W9rlg9","8U2nUlsQGo","1v5hHQnJ1S","4W0TlDcpWB","vOqCEIRh48","Mm8siZv7z0","zY1GYtjQxs",
+"lm0pDCqqaD","yEfy9QWxoT","bZLvSx3LDe","iqv4krz7Ut","QChxsdhSuH","FPfSEs7Mxk","lXFOBjS1aj","hi5X7kZANm","ZUnqtZv7z0","tAOsr5Mg9r",
+"LewvMGSQwj","v8yFNM6qcG","s93Mlv1Hln","Ta8f6zQt6Q","SjskQzqH0W","9eoRcStlDJ","Uvlv47hyVv","OxWIH8xEKz","CqqaDVerEA","Waim69GXkX",
+"fqypyni2v1","DG4sTlsQGo","7X3uyYf2Ec","8U2nUCIShG","pT8wuAIYUu","Nxx9VuQIcz","EOE1oaFFss","qQxHPDQimp","M3zXL5iGN5","MojnPRACuj",
+"tjQxshi5X7","BFkb8iB08l","Pb1pa5drc6","EOE1oyofH3","NhXdusoy9t","G1RhS0MR5X","aL6AJECMvU","GSQwj8xEKz","t98iW1v5hH","d7vjMtvdkD",
+"8RCUAZhwG1","qQxHPJ2mQi","580YDGv3Fq","CdyBVLbRTH","RsQUq8RCUA","gIYvEQbxXc","Chuy3vkCHH","NhXduPb1pa","16lHcuTacx","yEfy9Vprf2",
+"vLsmSjfREu","VLTy6tlILt","YjB9tMmKGJ","RpBQmjeskS","gtCA5ZuDtD","lm0pDk85Ae","SjskQFNYIM","IKxdLn8pJ9","0YAGHZhwG1","FxX9q7ku1p",
+"pmeCdoVQp6","14FLRxciqp","Y1mC0OUYuF","5nmWvzY1GY","0h1b1v1Hln","Rxrsmulk41","nnP8oNhXdu","yofH3jS1aj","FjHXRx3LDe","rz7UtU3yw5",
+"3weIFgdQsS","zY1GYcL0aE","mX2GEtvdkD","jeskSP6bcg","YOfrYLbRTH","uupzkzFgtB","7Ow5CHRxd8","XflUqpWiOs","jfREuS2Dfu","OHaBzs4786",
+"aDGtSfcJOy","rKDLJ5nmWv","yvOMIfaHir","tAOsrDQimp","brhlQKr8ys","D6rByRxrsm","uvf7AbgJAz","s7Mxklm0pD","AOgEeTXQ0Z","aL6AJuPX7G",
+"hYBCKHRxd8","tlILtzqH0W","uJScXzFgtB","ydG8U7ku1p","lH1ktJkzUn","WMiS3M3zXL","v1HlnzHF1q","ThjNnrhl0J","AOgEeL7cGc","8RCUAdjsrv",
+"FNYIMGv3Fq","zHF1qlweGy","FnPFBAgJHQ","2hEEUsoy9t","JRJQBa00b5","d7vjMRmDcr","pT8wuxReec","uvf7ARzaZA","Yf2Ecxciqp","48cHL9y4lw",
+"uQIczVprf2","HP433BCxeC","64s8NBbwgA","CdyBVK20wK","JkzUnF6PT2","cmXIXb29RJ","ZJTXHlkMUA","5nmWvtAOsr","0BmCyM6qcG","K20wKgf8rI",
+"9GXkX0Wr5y","Kr8ysFNYIM","qUJMdP6bcg","MGlTFIjTwP","xReec5drc6","JkzUnm4bxU","BpYhVK20wK","t59lRCNHmv","fcwDazY1GY","ciuWzEdBKc",
+"55rfBY1mC0","LbRTHx3LDe","HP4338hJdt","yofH3BpYhV","7lUXZ3weIF","gf8rIoVQp6","s93MlS77LH","PYBf4dQ586","VIlwPgdQsS","14FLRMaJQs",
+"MmKGJpAhR1","s4786OUYuF","rz7UtRkQke","iwzGkv2eC3","v1HlnpFrrl","7Ow5C48cHL","JXljWQYxC0","W3VFHciuWz","hSSvQfFDrJ","Twano24ARF",
+"fFDrJQYxC0","uPX7GfLNg8","ru4UGtAOsr","FLsphDcpWB","HRxd8e6e4z","Cp3mZrz7Ut","580YDEOE1o","pmeCdStlDJ","rhl0Jt98iW","hUTw7d7vjM",
+"h1zcH0MR5X","1j5L8VjCZq","7ku1pJ2mQi","v8yFN5nmWv","AmdQdMkgy8","oQ87rHP433","tuDyStvdkD","FPfSEEdBKc","aDGtSjeskS","lCMxyQnJ1S",
+"oGu6xyEfy9","euZA5TXQ0Z","8TxD7POUYS","jtn0XuN6r3","24ARFWaWsv","Dz1R3tvdkD","uZPqgKr8ys","WmadAHzZT8","yEfy9RACuj","WPmlxQWxoT",
+"pAhR1fFDrJ","MmsIoReKEW","8RCUAo8Uyd","pmeCdQ6Lix","KZamH0Wr5y","ZzJHWX6Pin","zFgtB5drc6","uupzk7ku1p","qQxHP7ku1p","hUTw748cHL",
+"Pb1paSs0Zu","lsQGouZPqg","D6rByFnPFB","55rfBaez9y","x3LDeKASQ8","QnJ1SjzUqR","Q6LixfLNg8","SWfoun1pmO","mz8gxwDajX","RpBQmbrhlQ",
+"5drc6fcJOy","QChxsVjCZq","hSSvQ45cIH","OUqFMxReec","jS1ajUl4a1","uAWyp9rlg9","K4GS81v5hH","DLhzMuTacx","0KyfscQOnv","i3pydKr8ys",
+"2hEEUHlUbF","d85a9oGu6x","BCxeCVprf2","vLsmSAOgEe","In3NS7ku1p","24ARFRmDcr","soy9txReec","qQxHPFFDui","qaofNoGu6x","SWfou580YD",
+"pv0i7DG4sT","nlaByix74r","Yw2oUgdQsS","U3yw5AOgEe","sx5GlZzJHW","WMiS3In3NS","Dz1R3G1RhS","d7vjMEOE1o","WPmlxAkKTk","kB5nPYOfrY",
+"2Nslmi7WMQ","ThjNnuupzk","07n1c5IhmG","9y4lwy94nw","RsQUq45cIH","55rfB07n1c","BpYhV4QMc9","IRh48HzZT8","a00b5SbRYy","JKWYRKr8ys",
+"Mm8si0YAGH","RpBQmQssNC","dpe1vGXdoH","v1HlnYh1hF","JRJQBAmdQd","i7WMQY1mC0","qQxHP4W0Tl","pv0i7gf8rI","s93MljSjS3","UmaEvs93Ml",
+"uupzkpFrrl","uLtKsDcpWB","aFFssv2eC3","P6bcgLbRTH","aL6AJiqv4k","WMiS3Q6hMC","n8pJ9QbxXc","BbwgAlj07Q","jS1ajNxx9V","mz8gxG1RhS",
+"jzUqRAkKTk","5VZjSSWfou","b29RJ6q6L9","uAWypHfyNQ","DcpWB16lHc","Pb1paQworu","RpBQm64s8N","FPfSEksJby","VerEAJKWYR","9rlg9n1pmO",
+"BFkb8ZhwG1","LbRTH5drc6","CK5W7pWiOs","v1HlnMaJQs","Gv3FqVLTy6","Q6hMCkB5nP","fLNg8NAFuw","CxVEfGrDg7","d85a9RACuj","DG4sTNhXdu",
+"K4GS8pWiOs","sx5GluoStw","In3NSi7WMQ","aFFssfcJOy","KASQ8suY4x","y94nwFnPFB","AIYUuciuWz","qQxHPPYBf4","8TxD7l83Ud","jS1aj9iGoT",
+"QChxsFxX9q","ZJTXHuLtKs","uvf7A48cHL","5ZaEzZuDtD","580YDs4786","dpe1vEOE1o","tl72WkZANm","oGu6xUl4a1","64s8Nn8pJ9","jiVBPRzaZA",
+"o8Uyd8TxD7","HfyNQv1Hln","8xEKzuLtKs","4W0Tl4W0Tl","cmXIXnnP8o","ksJbyNo0Qb","uoStwBFkb8","Yf2EcOxWIH","MezSWjeskS","bZLvS8hJdt",
+"9GXkXk85Ae","5Drn048cHL","TXQ0ZgtCA5","fcJOy9y4lw","7lUXZD6rBy","yEfy9KsjRK","5nmWvFVMxo","FwEJzK4GS8","DLhzMVNCPd","zmLYDXyPZN",
+"FnPFBkB5nP","pvgjSs7Mxk","Mkgy85ZaEz","dhSuHYOfrY","bZLvStl72W","zQt6Qb29RJ","he9IACfgr3","aDGtSRzaZA","lweGyTwano","aL6AJprNT6",
+"MaJQsFwEJz","W7cTstlILt","mz8gxqaofN","a00b5KZamH","2Yz7EQbxXc","MaJQs6q6L9","CIShGoGu6x","9eoRcQnJ1S","RkQkem4bxU","Uvlv4ni2v1",
+"Gv3FqbgJAz","lH1ktBbwgA","RsQUq7Ow5C","LbRTHwiHrZ","sqVrfJXljW","Ss0ZulkMUA","y94nw2Yz7E","uupzkyToGW","MGlTFUlU3M","Cp3mZkZANm",
+"fLNg8rKDLJ","No0QbM3zXL","kB5nPSbRYy","uJScXFxX9q","L7cGcqaofN","s7MxkprNT6","BpYhV1LB1L","tjQxsRmDcr","9GXkXWMiS3","AXpwE1v5hH",
+"2TRI7uJScX","oQ87rAkKTk","uPX7GDcpWB","CdyBVlpF6W","xciqpP6bcg","8hJdtPYBf4","EoToPHRxd8","1j5L8OxWIH","580YDHfyNQ","K20wKv1Hln",
+"pvgjSRmDcr","0ao3lzz4ZU","DQimpfLNg8","RxrsmpmeCd","yluBxBbwgA","MaJQsW7cTs","uTacxtuDyS","hE1QlDcpWB","iqv4k07n1c","O3iyQydG8U",
+"Cfgr3rz7Ut","HlUbF8cVD3","IKxdLWreyP","618Diulk41","lViBvKsjRK","B3qemRACuj","P6bcgRmDcr","tl72W64s8N","cL0aEBCxeC","zmLYDZhwG1",
+"CqqaDFVMxo","JKWYR7hyVv","0ao3luupzk","xciqpuZPqg","jfREuxXTI4","ksJbysoy9t","Waim6gdQsS","07n1cksJby","9XyT9Pb1pa","VerEA2hEEU",
+"rKDLJIRh48","0Wr5ys7Mxk","9iGoTbrhlQ","0KyfsIn3NS","FnPFBBGaQY","HP433iwzGk","CqqaDBFkb8","IBe8k0MR5X","Nxx9VJJs5m","FFDui9iGoT",
+"7Ow5CdmoS7","BbwgAfcJOy","FGzgpbrhlQ","Y1mC0NhXdu","PYBf4yvOMI","CdyBVlj07Q","xciqp6AFT0","prNT6VLTy6","wDajXtjQxs","GSQwjOxWIH",
+"lpF6WRACuj","3otm6RmDcr","Ta8f6fcJOy","soy9tRmDcr","QssNCY1mC0","FLsphjfREu","0ao3ltaOXK","mz8gxIjTwP","WreyPzY1GY","okgRiC2Irc",
+"aFFss8FmFH","CxVEfWmadA","gjUTu8RCUA","Z4I1vOHaBz","aFFssQnJ1S","NcICARmDcr","K20wKcShY2","uJScXciuWz","s4786lpF6W","BbwgAOz8yZ",
+"azIWpzbIYY","Zv7z0QnJ1S","ulk41pAhR1","uPX7GbrhlQ","ZUnqttuDyS","rKDLJpT8wu","48cHLVprf2","Chuy3mX2GE","6AFT0uLtKs","LewvMIBe8k",
+"9iGoTZuDtD","14FLR16lHc","pT8wut59lR","uJScXgtCA5","RmDcrTwano","gIYvEgtCA5","atef2LDk6f","VBjhzWaWsv","0Wr5yhe9IA","YjB9tgf8rI",
+"aL6AJQClRL","FxX9quoStw","uAWyphE1Ql","ZuDtDgjUTu","ECMvUNAFuw","2NslmUmaEv","0MR5XnFqik","zQt6QlXFOB","ni2v12TRI7","Cfgr3NOHsz",
+"8RCUAh1zcH","07n1c2DREs","gf8rIiwzGk","pFrrlokgRi","Fhtgl9GXkX","AXpwETa8f6","d85a9v1Hln","8cVD35nmWv","SjskQs4786","AmdQdrKDLJ",
+"sx5GlAOgEe","iKqhrdpe1v","uLtKsfcJOy","zz4ZU0PktI","M6qcGnFqik","4dEz6YjB9t","JKWYR580YD","Z4I1vqQxHP","7fKYUPYBf4","NcICAuN6r3",
+"AOgEetjQxs","ksJbyW3VFH","5iGN5BpYhV","l83UdJ2mQi","cmXIXzFgtB","rKDLJSmGzv","JIqXioVQp6","dpe1v8U2nU","Waim6xciqp","Gv3Fqiqv4k",
+"580YDhUTw7","F6PT28hJdt","brhlQDLhzM","5iGN52Yz7E","xReecIKxdL","gIYvEbrhlQ","rKDLJ2hEEU","ksJby5VZjS","WaWsv7fKYU","VBjhzZ4I1v",
+"uupzkv8yFN","Ta8f6suY4x","e6e4ziqv4k","uAWypBbwgA","D6rByM6qcG","WreyPh1zcH","k85Ae5drc6","0MR5X7lUXZ","uPX7GpT8wu","D6rByuQIcz",
+"QChxsMGlTF","lweGyZhwG1","5VZjSpFrrl","LbRTHmz8gx","OUqFMZJTXH","uoStwDQimp","5NammjeskS","tuDySM3zXL","WaWsvatef2","s7Mxkrhl0J",
+"aFFss0PktI","07n1ce6e4z","RpBQmDcpWB","DcpWBlViBv","U3yw59XyT9","oGu6xhE1Ql","aL6AJCIShG","hYBCKKZamH","MaJQstl72W","VNCPduJScX",
+"RBhp08hJdt","MGlTFi3pyd","0MR5XCqqaD","FFDui0MR5X","SmGzvvOqCE","Ul4a1qQxHP","2DREsBbwgA","guMb8WPmlx","FFDuiY1mC0","ix74rGv3Fq",
+"5IhmGCfgr3","atef2brhlQ","8FmFHNxx9V","CdyBVfFDrJ","StlDJOz8yZ","L7cGc2hEEU","prNT6QWxoT","KsjRK5Namm","BGaQY3otm6","taOXK4dEz6",
+"iB08l618Di","QnJ1SlkMUA","RACujfLNg8","QnJ1SnnP8o","2NslmjeskS","G1RhSgIYvE","Oz8yZOUqFM","lkMUAJKWYR","0MR5XHzZT8","tvdkDZ4I1v",
+"4dEz6Nxx9V","VLTy6y94nw","JJs5mpmeCd","55rfB5Mg9r","lH1kthUTw7","29QAzqaofN","bgJAz2TRI7","tuDySPYBf4","Mkgy855rfB","gtCA52ZHdk",
+"0BmCyQworu","he9IAkB5nP","suY4xZzJHW","SbRYy7lUXZ","m4bxUMmsIo","i7WMQtl72W","xciqpTwano","ZUnqt7ku1p","he9IA2ZHdk","xReeclj07Q",
+"fcJOy0YAGH","lj07QtuDyS","M6qcGcL0aE","ECMvU2TRI7","24ARFi7WMQ","wDajXuZPqg","AXpwEQ6Lix","jzUqRWaWsv","ni2v1CK5W7","WPmlx8xEKz",
+"CNHmvM6qcG","lH1ktMaJQs","24ARFjtn0X","ZUnqtCp3mZ","9y4lwIBe8k","wiHrZYf2Ec","vLsmS0Wr5y","3otm6K4GS8","7fsYM8hJdt","bgJAz64s8N",
+"24ARFpvgjS","NOHszAkKTk","1v5hH0MR5X","5VZjSSmGzv","OxWIHqQxHP","7hyVvI7p2a","euZA58cVD3","v1HlnCIShG","MmKGJpvgjS","s4786dpe1v",
+"SmGzv5iGN5","JXljWdQ586","WDVWJs93Ml","jSjS3NhXdu","fcJOy0PktI","yvOMIrz7Ut","K20wK2TRI7","jSjS3618Di","FLsphpAhR1","hi5X7a00b5",
+"U3yw5uupzk","iqv4kgtCA5","DcpWBhYBCK","uvf7AeuZA5","Y1mC0lkMUA","BGaQY8FmFH","0BmCyDG4sT","QWxoTMmKGJ","2NslmJXljW","yToGWsoy9t",
+"FPfSEVIlwP","8U2nUCK5W7","fLNg848cHL","Q6hMChi5X7","9eoRcRmDcr","NAFuwzY1GY","pvgjSUmaEv","gdQsSOUYuF","tjQxsuTacx","3otm6VIlwP",
+"Cp3mZtl72W","ZhwG1RpBQm","0BmCyHlUbF","BpYhVJRJQB","m4bxU16lHc","fLNg82TRI7","JJs5mJIqXi","Y1mC0Qworu","gdQsSo8Uyd","Kr8ysVjCZq",
+"lViBvpvgjS","Zv7z05VZjS","nlaByECMvU","ZuDtD7fKYU","FPfSE5nmWv","1LB1LpFrrl","aDGtSe6e4z","d7vjM8xEKz","JRJQBokgRi","MmKGJBFkb8",
+"yvOMI0PktI","ksJby5Drn0","wiHrZcShY2","LewvMChuy3","wDajXuAWyp","Cp3mZOUYuF","6AFT0k85Ae","mX2GEECMvU","zHF1qOUYuF","EdBKcHzZT8",
+"fmIK1azIWp","dmoS7fqypy","gdQsSt98iW","dQ586AmdQd","0PktIfaHir","gtCA5OxWIH","7hyVvuvf7A","VBjhzlweGy","HP433uvf7A","29QAzMojnP",
+"Yw2oUCqqaD","rKDLJXyPZN","FGzgp9XyT9","WreyPYjB9t","5iGN5mz8gx","In3NSsuY4x","rhl0JF6PT2","n1pmO5IhmG","zz4ZUSs0Zu","tjQxs5nmWv",
+"taOXK9rlg9","IKxdL1j5L8","MojnPECMvU","PYBf4K4GS8","K20wK0BmCy","jSjS3Y1mC0","580YDlm0pD","cmXIX8cVD3","CNHmvaez9y","29QAzyToGW",
+"zHF1qvOqCE","OHaBzyEfy9","Yf2EcFLsph","oQ87r9y4lw","1LB1LqQxHP","wiHrZm4bxU","OxWIHOxWIH","LbRTHVLTy6","hSSvQI7p2a","618DiSs0Zu",
+"oGu6xdjsrv","0BmCyKsjRK","wDajXl83Ud","3weIFfqypy","SbRYy1v5hH","S2Dfud7vjM","gdQsSprNT6","MGlTFB3qem","CIShGkB5nP","lXFOBqaofN",
+"d7vjMYjB9t","2NslmJIqXi","48cHLgf8rI","fcwDaxXTI4","EOE1oQworu","3otm6IKxdL","IKxdLAgJHQ","FxX9qbZLvS","2ZHdk3weIF","fqypyjiVBP",
+"zY1GY5VZjS","ThjNnHP433","uZPqg1LB1L","jtn0XGXdoH","7Ow5CfaHir","BpYhVVLTy6","YjB9tgdQsS","64s8NLDk6f","YjB9tP6bcg","ThjNnRkQke",
+"2Yz7EReKEW","gtCA5fmIK1","UmaEvIBe8k","lj07QBFkb8","MmKGJMojnP","fLNg8LewvM","ix74r3otm6","YOfrYNxx9V","pAhR1vOqCE","RxrsmNcICA",
+"jzUqRVIlwP","0h1b1Z4I1v","gf8rIyvOMI","xciqphYBCK","CdyBVgf8rI","iB08lRxrsm","BbwgAJRJQB","7hyVvIRh48","8U2nUDLhzM","pAhR1AXpwE",
+"29QAzIRh48","2hEEUMmsIo","jSjS3zbIYY","QworuuN6r3","RkQkeCp3mZ","oVQp6HP433","QbxXcuvf7A","B3qem2hEEU","fqypyqQxHP","HRxd80Wr5y",
+"0ao3lcL0aE","atef2C2Irc","fqypyHRxd8","FVMxoQnJ1S","DcpWBnFqik","SbRYyLewvM","ni2v1QYxC0","hUTw7uAWyp","14FLRX6Pin","bZLvSDLhzM",
+"NAFuwTXQ0Z","U3yw5KZamH","FNYIMtlILt","SjskQKZamH","rKDLJt59lR","uTacxtl72W","ni2v1uoStw","ciuWzv2eC3","Q6hMChe9IA","Uvlv4QYxC0",
+"U3yw5uZPqg","QYxC0OxWIH","VIlwPOUqFM","Mm8sinnP8o","DcpWBVIlwP","ni2v1BpYhV","YjB9tNAFuw","rKDLJPOUYS","k85AeW7cTs","Ta8f6JRJQB",
+"vOqCEFcWrW","XyPZNQnJ1S","0Wr5yRACuj","cmXIXFGzgp","lCMxyWmadA","SmGzvksJby","ZUnqtbgJAz","ZuDtD1j5L8","8hJdtFFDui","tl72Wtl72W",
+"rKDLJxReec","9iGoTKsjRK","Gv3FqMm8si","WreyPM3zXL","Zv7z0pT8wu","lXFOByEfy9","BFkb8gjUTu","uJScX0Kyfs","KsjRKtl72W","nFqikEOE1o",
+"8U2nUK4GS8","gIYvEt98iW","hE1QlRxrsm","Uvlv4NcICA","Oz8yZo8Uyd","rz7UtiwzGk","mz8gx5IhmG","s7MxkZJTXH","UmaEvPOUYS","CK5W70Wr5y",
+"FcWrWs4786","7Ow5CAkKTk","cL0aEdQ586","wiHrZ3otm6","J2mQin8pJ9","lm0pDNAFuw","U3yw5WPmlx","4W0TliKqhr","Cp3mZ0Kyfs","ZzJHWulk41",
+"GrDg72hEEU","SbRYyPOUYS","GSQwjlCMxy","FPfSEt98iW","F6PT2No0Qb","G1RhSFVMxo","brhlQtjQxs","wiHrZbgJAz","JKWYRtaOXK","QssNCCIShG",
+"5Drn0aFFss","FxX9qIjTwP","zQt6QK20wK","W3VFHqUJMd","d7vjMTXQ0Z","lsQGoYOfrY","brhlQ5iGN5","aFFsspAhR1","rKDLJl83Ud","5NammCIShG",
+"Vprf2RpBQm","TCgPpZhwG1","TXQ0ZwiHrZ","RpBQm9XyT9","yofH3BFkb8","m4bxUXflUq","WDVWJKASQ8","M6qcGk85Ae","AgJHQ14FLR","5NammNcICA",
+"lm0pDWMiS3","GrDg7Kr8ys","5iGN57X3uy","ZUnqtWDVWJ","RACujeuZA5","CK5W7CdyBV","pvgjS64s8N","IBe8kJRJQB","7fKYUHzZT8","gtCA5iwzGk",
+"GSQwjVerEA","fLNg8dmoS7","0MR5XUlU3M","L7cGcQWxoT","WreyPulk41","gjUTuhE1Ql","jSjS3fcJOy","0ao3l0h1b1","ZuDtDYf2Ec","8TxD7uJScX",
+"Ul4a1Chuy3","WreyPNcICA","BFkb8OHaBz","No0QbNhXdu","P6bcgydG8U","5drc6dhSuH","CK5W7OUqFM","DQimpnFqik","5ZaEzHP433","ZzJHWP6bcg",
+"FhtglZhwG1","FjHXRJRJQB","J2mQihYBCK","ZhwG1NhXdu","4dEz6s93Ml","POUYS5nmWv","b29RJlj07Q","GXdoHCfgr3","pWiOscL0aE","ru4UGrz7Ut",
+"CK5W7RpBQm","24ARFmX2GE","oQ87rAmdQd","fLNg8lsQGo","L7cGcyofH3","azIWpWPmlx","xReecFNYIM","LDk6fWDVWJ","pvgjSCxVEf","tAOsrs4786",
+"gtCA5oGu6x","t98iWJ2mQi","NOHszHRxd8","55rfBuvf7A","MezSWb29RJ","lsQGojeskS","NhXduFwEJz","SmGzvTa8f6","lkMUAqQxHP","ogLgcAXpwE",
+"rKDLJgf8rI","gf8rIdpe1v","cQOnvM3zXL","0MR5XNhXdu","hSSvQ8RCUA","cL0aEqQxHP","Y1mC05Namm","x3LDeru4UG","Z4I1vlj07Q","14FLRQWxoT",
+"FxX9q5drc6","x3LDeuN6r3","Z4I1vKZamH","dhSuHsoy9t","uJScX2TRI7","DLhzMkZANm","IjTwP3weIF","a00b55Drn0","Waim6KASQ8","uN6r3fcJOy",
+"HfyNQlkMUA","VIlwPokgRi","he9IAfcJOy","LDk6f8cVD3","yEfy9aDGtS","jtn0X1j5L8","MK07YIn3NS","lH1ktgtCA5","Ul4a1XflUq","ni2v1WreyP",
+"jiVBP2TRI7","Y1mC0tl72W","GXdoHFFDui","iB08lKr8ys","W3VFH0MR5X","F6PT2zbIYY","zQt6Q7fsYM","fqypyFLsph","XyPZNvkCHH","euZA5QClRL",
+"QWxoTTwano","e6e4zDcpWB","HP433Ss0Zu","CIShGs7Mxk","GWqqXSbRYy","55rfB5VZjS","uAWypFVMxo","vLsmShE1Ql","CK5W75nmWv","jfREuAOgEe",
+"tlILtZJTXH","pAhR1dhSuH","4dEz6DLhzM","L7cGcRACuj","zQt6QG1RhS","i3pydPYBf4","FLsphbZLvS","zFgtBxciqp","jtn0XQWxoT","jzUqRdQ586",
+"7ku1p5Drn0","gf8rIatef2","XyPZN29QAz","FhtglG1RhS","IRh48ZuDtD","FjHXRXyPZN","bZLvSe6e4z","QWxoTFnPFB","kB5nPuQIcz","zY1GYo8Uyd",
+"lkMUAcQOnv","m4bxU4QMc9","uZPqgcmXIX","9iGoT2Yz7E","ZzJHWRkQke","fLNg8EdBKc","ni2v1In3NS","Waim6uPX7G","lweGyjS1aj","7lUXZjtn0X",
+"7X3uyru4UG","djsrvRmDcr","k85AeBpYhV","x3LDeCxVEf","gjUTuJIqXi","JIqXi16lHc","oVQp6StlDJ","pWiOsF6PT2","HRxd8Nxx9V","uTacxSbRYy",
+"prNT6lpF6W","uoStw580YD","LewvMxXTI4","5IhmGfaHir","prNT6RACuj","JRJQBC2Irc","uTacxUmaEv","RBhp0K4GS8","DcpWB2TRI7","nFqikxReec",
+"nnP8oDz1R3","Ss0Zun1pmO","jfREuDz1R3","5IhmGvOqCE","zmLYDRACuj","mX2GE5nmWv","t59lR14FLR","GXdoHNAFuw","tuDyShSSvQ","uQIczFGzgp",
+"9y4lwlpF6W","BCxeCuAWyp","7hyVv2Yz7E","dhSuHuZPqg","RsQUqatef2","RsQUqjtn0X","AOgEehE1Ql","zbIYYfFDrJ","FFDuiXflUq","t59lRYjB9t",
+"RsQUq2Nslm","HfyNQW7cTs","POUYSSs0Zu","uJScXksJby","Gv3FqKr8ys","0BmCyzHF1q","NOHszRxrsm","v8yFNwDajX","Mm8siSs0Zu","AmdQdsoy9t",
+"IjTwPIBe8k","uZPqglXFOB","pT8wukB5nP","cmXIXZuDtD","brhlQNxx9V","vOqCE8FmFH","6AFT0XflUq","5VZjSulk41","lXFOBtjQxs","jiVBPhi5X7",
+"AIYUuUvlv4","BFkb8POUYS","CK5W7oQ87r","MmKGJzHF1q","zbIYYNAFuw","uTacx7X3uy","n1pmOKsjRK","24ARFaDGtS","SjskQhE1Ql","Cp3mZd85a9",
+"K4GS8lm0pD","P6bcgUvlv4","h1zcHiB08l","SmGzv9rlg9","b29RJ7ku1p","b29RJzHF1q","HlUbFF6PT2","t59lRd7vjM","cL0aEjzUqR","k85Ae3weIF",
+"UlU3MAOgEe","F6PT2yluBx","FnPFBprNT6","PYBf4618Di","YjB9taDGtS","TXQ0Z5Namm","dmoS7TXQ0Z","BpYhVBCxeC","5ZaEzdhSuH","fcJOyQssNC",
+"0Wr5yOz8yZ","v2eC3lViBv","e6e4zTXQ0Z","D6rByQChxs","vLsmS8FmFH","Waim6ZzJHW","FxX9qZhwG1","uPX7GWreyP","nlaByyToGW","16lHczqH0W",
+"t59lRjSjS3","In3NStvdkD","MezSWTCgPp","RmDcrLbRTH","4W0TlQ6Lix","Waim6FjHXR","k85AewiHrZ","lweGyJIqXi","tuDySWmadA","hSSvQ0BmCy",
+"bgJAzRsQUq","0ao3lReKEW","7Ow5CReKEW","Zv7z064s8N","Mm8siAmdQd","G1RhSoQ87r","fFDrJdjsrv","S77LHVLTy6","TwanoIn3NS","55rfBXflUq",
+"0KyfsNxx9V","cQOnvAXpwE","zqH0W0BmCy","I7p2aB3qem","uAWypv1Hln","48cHLrz7Ut","ZuDtDuJScX","taOXKVNCPd","3otm6VNCPd","14FLRaez9y",
+"tjQxsGv3Fq","NAFuwgdQsS","kZANmVNCPd","8U2nUIjTwP","7lUXZU3yw5","hYBCK8hJdt","RACujJXljW","FNYIMJKWYR","BCxeCGSQwj","HP433MezSW",
+"14FLRogLgc","YOfrYwDajX","nlaBysqVrf","0BmCyrz7Ut","tuDySWaim6","POUYSiKqhr","14FLRIjTwP","pFrrlY1mC0","Ss0ZuTwano","QChxsdQ586",
+"P6bcgPb1pa","FGzgpuQIcz","CxVEfFcWrW","55rfB5nmWv","Waim63otm6","AgJHQM3zXL","CqqaDHP433","48cHL9rlg9","AgJHQIn3NS","v8yFN1j5L8",
+"QClRLBpYhV","2Yz7EzbIYY","dmoS7zqH0W","fFDrJpWiOs","VBjhzgtCA5","e6e4zv1Hln","hE1QlAOgEe","FcWrWFGzgp","lpF6W9y4lw","uvf7A9XyT9",
+"s7MxkNcICA","Uvlv4Ta8f6","5ZaEzrz7Ut","gf8rImX2GE","yluBx7lUXZ","SWfoujeskS","IjTwP4dEz6","4QMc9pv0i7","kZANmm4bxU","fcJOyZv7z0",
+"pvgjSksJby","s93Ml1LB1L","zY1GYlweGy","G1RhSdQ586","2ZHdklXFOB","29QAzOz8yZ","Ss0ZucmXIX","qUJMdjtn0X","gtCA5StlDJ","yvOMIokgRi",
+"yvOMIa00b5","hE1Ql0Wr5y","prNT6Ss0Zu","C2IrcyluBx","2TRI72hEEU","LDk6ftlILt","RsQUqSWfou","zz4ZU3otm6","FLsphRACuj","CIShG2hEEU",
+"PYBf47hyVv","aFFssOz8yZ","LewvMfqypy","AmdQdSjskQ","6AFT0lViBv","s93MlLbRTH","0BmCyZUnqt","ydG8UQWxoT","uLtKsL7cGc","ReKEWI7p2a",
+"JIqXiRsQUq","suY4xFVMxo","07n1cuAWyp","RzaZAbrhlQ","e6e4zMmKGJ","ru4UGdhSuH","VjCZqi7WMQ","SmGzvokgRi","MK07YuQIcz","AkKTkGv3Fq",
+"pWiOspv0i7","Kr8ysJRJQB","d85a9zQt6Q","i3pyd1v5hH","dmoS7CdyBV","EoToPGrDg7","FNYIMyToGW","MmKGJ9iGoT","FjHXRRpBQm","JRJQBi7WMQ",
+"DLhzM5drc6","QChxsFhtgl","uoStwNOHsz","TXQ0ZiB08l","pvgjSQYxC0","oQ87ratef2","RACujKZamH","2ZHdkVIlwP","blLA9jeskS","7lUXZjfREu",
+"zbIYYcQOnv","qUJMd16lHc","RBhp0SjskQ","0h1b1Yh1hF","Z4I1v1v5hH","1LB1LChuy3","CxVEfG1RhS","rz7Utmz8gx","K20wKxciqp","y94nwyEfy9",
+"tvdkDWMiS3","gdQsSSbRYy","FLsph7Ow5C","ogLgcazIWp","ciuWzKASQ8","7ku1pGSQwj","Oz8yZQWxoT","suY4xZ4I1v","4W0TlxReec","RxrsmBCxeC",
+"9XyT95Namm","I7p2avLsmS","jiVBPDQimp","jfREuIn3NS","2ZHdkIjTwP","aDGtSL7cGc","dmoS72DREs","DG4sT0MR5X","uLtKs9y4lw","jeskSThjNn",
+"6AFT0OUYuF","cQOnvStlDJ","bZLvSChuy3","3otm60Kyfs","8RCUAiKqhr","dmoS7jS1aj","s4786jeskS","MojnPPOUYS","nnP8o29QAz","5iGN5ZUnqt",
+"guMb82ZHdk","suY4xHfyNQ","uQIczTCgPp","MaJQsWDVWJ","64s8NFwEJz","RkQkeWPmlx","h1zcHMm8si","BbwgA1LB1L","AkKTkRBhp0","pAhR1uZPqg",
+"uJScXFPfSE","8TxD7aFFss","Vprf2oQ87r","wDajXFFDui","ThjNnNOHsz","Q6hMCO3iyQ","tuDyS5ZaEz","iKqhrWaim6","XyPZNWDVWJ","mX2GEuoStw",
+"ThjNnyEfy9","Oz8yZJJs5m","euZA5hE1Ql","ogLgcDQimp","taOXKaDGtS","QworuLDk6f","X6Pin0ao3l","Mm8si0PktI","v1HlnS2Dfu","0h1b1RzaZA",
+"uQIczRpBQm","VIlwPzFgtB","uupzkoVQp6","iwzGkP6bcg","W7cTshYBCK","Cfgr3dhSuH","vOqCEfcJOy","yvOMIblLA9","L7cGcix74r","Q6LixHzZT8",
+"tlILtt98iW","Ul4a1StlDJ","taOXKIKxdL","5NammZJTXH","8xEKzZv7z0","Cp3mZPOUYS","IBe8kiqv4k","2ZHdkzz4ZU","AgJHQLDk6f","BFkb8VNCPd",
+"BGaQYNOHsz","RBhp0iB08l","In3NSKASQ8","zmLYDoGu6x","LDk6fuvf7A","aL6AJFFDui","FjHXRhYBCK","9rlg916lHc","yvOMID6rBy","suY4xjzUqR",
+"dpe1vP6bcg","F6PT2HP433","cmXIXlCMxy","9iGoTlweGy","atef2S77LH","lViBvECMvU","PYBf45VZjS","CK5W7mX2GE","VLTy64dEz6","zHF1qguMb8",
+"FNYIMOxWIH","Q6hMChE1Ql","yluBx8cVD3","2NslmfFDrJ","LbRTHGXdoH","hYBCKfqypy","ZuDtDMojnP","qUJMd0PktI","MmKGJ3otm6","0ao3lX6Pin",
+"9y4lwzFgtB","sx5Gl45cIH","xReecW7cTs","d85a9C2Irc","Cfgr3lXFOB","Pb1pajfREu","QnJ1SYjB9t","QYxC0O3iyQ","uQIczuPX7G","hUTw7e6e4z",
+"FwEJzWPmlx","cL0aEHlUbF","4QMc9zY1GY","kZANm7hyVv","MmKGJv8yFN","cL0aEKsjRK","618Diatef2","lm0pDs93Ml","DLhzMBFkb8","mX2GEaFFss",
+"Yf2Ecatef2","1v5hHHlUbF","zFgtB8cVD3","CNHmvwDajX","pFrrltvdkD","LewvMydG8U","ZzJHWYOfrY","pAhR1cShY2","AXpwEl83Ud","0Kyfs64s8N",
+"lj07Q8RCUA","uJScXpT8wu","pWiOsbgJAz","uupzkOxWIH","fqypy0PktI","tvdkD4QMc9","pvgjStAOsr","9iGoTSjskQ","faHirksJby","zQt6QoQ87r",
+"fFDrJni2v1","G1RhSgf8rI","mz8gxnnP8o","Oz8yZCNHmv","zY1GYYw2oU","QChxsCp3mZ","AmdQd7ku1p","tuDySv2eC3","pWiOsDG4sT","zmLYDAmdQd",
+"iB08lUmaEv","HzZT89rlg9","TXQ0Zm4bxU","Q6Lixdpe1v","FNYIMpvgjS","MmKGJxXTI4","oVQp6jfREu","C2Irc0Wr5y","6q6L9Cfgr3","fqypyIn3NS",
+"UlU3MogLgc","MmKGJ64s8N","lkMUAK4GS8","0MR5XMkgy8","HP433Cfgr3","Q6hMCTCgPp","zFgtBW7cTs","kB5nPru4UG","lViBv9GXkX","BGaQYd85a9",
+"yluBxQnJ1S","NOHszPb1pa","d85a9OHaBz","zmLYD2TRI7","8RCUAXyPZN","QChxseuZA5","0PktICNHmv","FwEJzNcICA","l83Ud0BmCy","fcJOyUl4a1",
+"lCMxyprNT6","2ZHdkMGlTF","tAOsr7Ow5C","AOgEeoQ87r","RsQUqQWxoT","GSQwjChuy3","CNHmvVprf2","l83UdK20wK","RzaZAqaofN","QnJ1SS2Dfu",
+"9iGoTjiVBP","iqv4kVIlwP","zFgtBSbRYy","Pb1pahUTw7","G1RhSpAhR1","pT8wuFnPFB","6AFT00ao3l","dpe1v5nmWv","In3NSiKqhr","uPX7GOUYuF",
+"rKDLJwiHrZ","U3yw5K4GS8","8cVD3okgRi","kZANmMGlTF","NcICApvgjS","zQt6QgjUTu","Yw2oUpFrrl","Mkgy8Mkgy8","ni2v1Mm8si","s93MlvLsmS",
+"TwanoQYxC0","LewvMyluBx","64s8NMezSW","QbxXcfcJOy","qaofNdpe1v","Yw2oUuJScX","Uvlv4qaofN","fqypyb29RJ","Ul4a15Drn0","ciuWzx3LDe",
+"ZJTXHIKxdL","DcpWBMmsIo","M6qcGRBhp0","Mkgy8QssNC","RsQUqFhtgl","2Yz7E9XyT9","uLtKsDQimp","Uvlv4lkMUA","NhXduMGlTF","5NammG1RhS",
+"Nxx9VzbIYY","6AFT00YAGH","I7p2ah1zcH","64s8NOHaBz","6q6L99y4lw","a00b54QMc9","vkCHH9XyT9","0BmCyW3VFH","FxX9qrz7Ut","lsQGosuY4x",
+"PYBf4gtCA5","I7p2aLbRTH","7X3uyfmIK1","yEfy92TRI7","QssNCyToGW","v2eC3NAFuw","K20wK9rlg9","4QMc9RBhp0","0YAGHZzJHW","WMiS3ulk41",
+"mX2GEYh1hF","4dEz6POUYS","S2Dfu8cVD3","EOE1oThjNn","7Ow5Cv8yFN","EdBKcQnJ1S","QworuXyPZN","StlDJYf2Ec","ECMvUgtCA5","S2DfuuN6r3",
+"fmIK1FwEJz","vLsmSDQimp","cQOnvRzaZA","lXFOBnnP8o","OUqFMDLhzM","qQxHPv2eC3","jzUqRVjCZq","7fKYUHfyNQ","vLsmS48cHL","iqv4k0MR5X",
+"pvgjS9y4lw","JKWYRd85a9","aL6AJHRxd8","XflUq8TxD7","CNHmvs93Ml","RkQkeTCgPp","hYBCKsx5Gl","ix74rvOqCE","Vprf2DG4sT","P6bcgRkQke",
+"n1pmOCIShG","FnPFBuQIcz","D6rByfcJOy","ulk41QClRL","FVMxoFhtgl","pWiOstlILt","Cp3mZdjsrv","oVQp6v2eC3","zz4ZUo8Uyd","RpBQmYf2Ec",
+"BFkb8618Di","3weIF14FLR","C2Irciqv4k","uupzkjzUqR","y94nwrz7Ut","vOqCEZJTXH","29QAzUmaEv","AXpwECIShG","6AFT0M3zXL","RACujNAFuw",
+"vLsmS9iGoT","v8yFNNOHsz","dmoS7MaJQs","gf8rIFPfSE","MmKGJFxX9q","O3iyQSWfou","FGzgptvdkD","CdyBVpWiOs","EdBKcpiJSk","5VZjSW7cTs",
+"MaJQs7X3uy","fcJOy0ao3l","kB5nPsoy9t","CIShGv8yFN","WMiS3hYBCK","0BmCys4786","euZA5Q6hMC","AXpwEd85a9","IBe8ki3pyd","8xEKzJkzUn",
+"Zv7z0uZPqg","WPmlx9eoRc","hUTw7yEfy9","CqqaD9GXkX","7lUXZ9XyT9","y94nwlkMUA","8TxD7vOqCE","yofH3KsjRK","7Ow5Caez9y","cQOnv5Drn0",
+"taOXKLewvM","djsrvAIYUu","2ZHdkqQxHP","O3iyQGv3Fq","xXTI4K20wK","45cIH4QMc9","1v5hHlj07Q","BbwgAD6rBy","4QMc9oVQp6","QClRL5Mg9r",
+"blLA9m4bxU","QClRLydG8U","RBhp0L7cGc","jSjS33otm6","KASQ8rz7Ut","5drc6prNT6","EOE1ozHF1q","wDajXnFqik","lm0pDlXFOB","K4GS8iB08l",
+"TCgPpPOUYS","WaWsvXflUq","4QMc9pvgjS","QworuwDajX","gtCA5DG4sT","48cHLAOgEe","uN6r3hYBCK","4dEz6zFgtB","wDajXuTacx","Nxx9VCdyBV",
+"ix74r8TxD7","jSjS3lCMxy","uvf7AJ2mQi","n1pmOXyPZN","okgRidjsrv","24ARFpiJSk","FwEJzLewvM","Vprf2okgRi","qaofNNcICA","4QMc9ZuDtD",
+"0MR5X6AFT0","pAhR1GrDg7","dmoS7RkQke","FNYIM2TRI7","rz7UtCNHmv","MmsIofcJOy","M3zXLCqqaD","SbRYyXyPZN","jzUqRnnP8o","S77LHIRh48",
+"iqv4kEdBKc","iqv4kNAFuw","d7vjM8cVD3","SWfou16lHc","9eoRcBGaQY","WreyPFhtgl","W7cTsM6qcG","zHF1qGv3Fq","v8yFNCfgr3","8cVD3QClRL",
+"pFrrl7fsYM","9eoRc5Mg9r","CIShGBpYhV","0MR5XcQOnv","2TRI7VBjhz","MmsIok85Ae","ulk41tl72W","lweGykB5nP","rhl0JvLsmS","fLNg8wDajX",
+"9y4lw4QMc9","fLNg8lweGy","0Kyfsuupzk","aFFsssuY4x","EOE1o3weIF","FGzgpThjNn","8U2nUKASQ8","S2Dfuuvf7A","7fKYUZv7z0","IjTwPuupzk",
+"o8UydMojnP","KASQ8KsjRK","lsQGotvdkD","i7WMQXyPZN","TwanoPYBf4","G1RhSkZANm","0Kyfs24ARF","Q6hMC8RCUA","Rxrsmsoy9t","xReecv1Hln",
+"5ZaEz7lUXZ","UlU3MIRh48","uAWypwiHrZ","2DREslXFOB","FcWrW9rlg9","DcpWBMaJQs","Gv3FqJIqXi","MK07YfmIK1","brhlQoVQp6","ThjNnEoToP",
+"RkQkeMojnP","s7Mxk9GXkX","24ARF9XyT9","mz8gxyToGW","CdyBVuZPqg","5VZjSVerEA","7hyVvzqH0W","7fsYMb29RJ","6q6L90PktI","dmoS7h1zcH",
+"yofH3VBjhz","0YAGHIjTwP","uPX7GI7p2a","a00b529QAz","O3iyQM3zXL","LewvMFNYIM","blLA9jfREu","vLsmSPb1pa","CIShGjiVBP","a00b5MaJQs",
+"yofH3rKDLJ","zFgtBhi5X7","lViBvOUYuF","ReKEW5Mg9r","AgJHQ45cIH","nnP8o9iGoT","Oz8yZZuDtD","M3zXLciuWz","5iGN5d7vjM","IjTwPF6PT2",
+"fLNg8HfyNQ","2ZHdk2DREs","lm0pDyluBx","lXFOBZv7z0","taOXKnFqik","zFgtBWPmlx","jtn0XIKxdL","M6qcGzz4ZU","iB08l9rlg9","hUTw7RsQUq",
+"IKxdLlm0pD","GWqqX7X3uy","aez9yVNCPd","pFrrlQWxoT","7lUXZMK07Y","cShY2gf8rI","Y1mC04dEz6","RkQkeMK07Y","C2IrcuoStw","6q6L924ARF",
+"7lUXZZv7z0","taOXKlweGy","yToGWhe9IA","x3LDehUTw7","sqVrfP6bcg","C2Ircatef2","8TxD7s7Mxk","zbIYYGSQwj","J2mQihi5X7","VBjhz8hJdt",
+"Twanorz7Ut","2DREsRkQke","LewvMs93Ml","1LB1LB3qem","HlUbF8hJdt","FjHXR24ARF","8RCUA8U2nU","VNCPd14FLR","rz7Ut9iGoT","qQxHP7hyVv",
+"2ZHdkrKDLJ","gjUTujtn0X","FcWrW4W0Tl","IRh48RmDcr","yluBxGXdoH","m4bxUzqH0W","pFrrlOUYuF","AkKTkmz8gx","yvOMIjSjS3","s4786pmeCd",
+"JKWYRzY1GY","CxVEfIjTwP","ix74rEoToP","MmsIoNcICA","AXpwEdmoS7","AXpwEC2Irc","pT8wu7Ow5C","x3LDeI7p2a","NAFuwOxWIH","J2mQi0Kyfs",
+"fqypygjUTu","uJScX64s8N","gIYvE5ZaEz","NOHszGrDg7","uJScXAIYUu","jSjS3LbRTH","b29RJLbRTH","rz7Utdpe1v","DG4sTQssNC","WaWsv2Yz7E",
+"16lHciB08l","OUqFMzbIYY","45cIH14FLR","fLNg89y4lw","piJSkcmXIX","LDk6f1v5hH","7fKYUh1zcH","kB5nP45cIH","WMiS38xEKz","aFFssMmsIo",
+"uTacx9rlg9","guMb8mz8gx","pmeCdQWxoT","fmIK1uQIcz","3otm69y4lw","P6bcgtaOXK","HRxd8VjCZq","7ku1pReKEW","pmeCds7Mxk","CdyBVGv3Fq",
+"ZhwG1l83Ud","Yf2Ec8xEKz","AkKTkD6rBy","i7WMQmX2GE","4W0TlXflUq","QssNCfaHir","KASQ8RkQke","iB08ltjQxs","rKDLJNcICA","qUJMdEdBKc",
+"I7p2aNcICA","P6bcguN6r3","7hyVvKZamH","YjB9ti7WMQ","MojnPyvOMI","5Drn0FwEJz","ZhwG15VZjS","B3qem8RCUA","9GXkXlXFOB","3weIF0h1b1",
+"FnPFBblLA9","tuDySFnPFB","QChxsi3pyd","iqv4ke6e4z","sqVrfFxX9q","FcWrWjSjS3","iB08lsoy9t","iKqhry94nw","yluBxAkKTk","i7WMQ16lHc",
+"BFkb8OxWIH","hE1QluAWyp","v1HlnyofH3","DQimp8RCUA","okgRiBpYhV","SmGzvsx5Gl","BFkb8VerEA","MezSWazIWp","FnPFBVjCZq","ix74rydG8U",
+"BFkb8pv0i7","pAhR1vLsmS","BbwgAzz4ZU","pFrrlRBhp0","NAFuwCxVEf","lsQGot59lR","wDajXa00b5","lCMxyuJScX","CK5W7XflUq","t59lRxciqp",
+"wiHrZjSjS3","UmaEv4dEz6","fmIK1aez9y","yluBx8TxD7","cQOnvgjUTu","0ao3lW7cTs","lsQGo7fsYM","hUTw7Ss0Zu","t98iWuLtKs","tl72W9iGoT",
+"fcwDazqH0W","WPmlxJXljW","8TxD745cIH","xXTI4fFDrJ","hSSvQ5drc6","MK07YlweGy","Z4I1vpFrrl","h1zcHi7WMQ","7fKYUQssNC","aL6AJB3qem",
+"VjCZqt98iW","JKWYRHzZT8","nnP8oECMvU","zQt6QTXQ0Z","TXQ0ZcmXIX","pmeCds4786","KZamHyToGW","gdQsS6AFT0","piJSkiKqhr","KsjRKAmdQd",
+"BpYhVOHaBz","5iGN5RmDcr","WDVWJkZANm","aez9yRsQUq","FcWrWAmdQd","QYxC0piJSk","POUYSrhl0J","BGaQYCp3mZ","0KyfsHzZT8","JJs5mMK07Y",
+"9iGoT16lHc","7Ow5CzY1GY","9y4lwhUTw7","AOgEeGWqqX","NAFuwJKWYR","pv0i70MR5X","xXTI4Kr8ys","v8yFNlsQGo","uZPqgNxx9V","1j5L85Namm",
+"IKxdLUmaEv","d7vjMEdBKc","2Yz7ESs0Zu","Kr8ysjSjS3","MmsIo7lUXZ","7fsYM55rfB","4QMc9i7WMQ","KsjRKvkCHH","RmDcrWaim6","hSSvQNAFuw",
+"RACujs4786","FVMxob29RJ","PYBf47X3uy","F6PT2OUYuF","O3iyQy94nw","VjCZqVBjhz","CK5W7FjHXR","GSQwj9rlg9","wiHrZRpBQm","FPfSEuoStw",
+"OHaBzRsQUq","FLsphhi5X7","CqqaDyluBx","EdBKccQOnv","0MR5Xuvf7A","tAOsrZzJHW","Chuy3Ul4a1","0KyfspFrrl","gIYvEiB08l","soy9tfFDrJ",
+"MojnPjzUqR","MezSWNhXdu","nnP8oulk41","JkzUn9XyT9","VerEA24ARF","ZzJHWxXTI4","UmaEvdmoS7","8TxD7vLsmS","mz8gxAIYUu","fFDrJiwzGk",
+"Mkgy8lm0pD","S77LHAOgEe","BbwgASWfou","euZA5pT8wu","pT8wuS2Dfu","nlaByRkQke","EdBKcBbwgA","hSSvQXflUq","v2eC3a00b5","Zv7z0jeskS",
+"Yh1hFStlDJ","OHaBzv2eC3","aDGtSmX2GE","kB5nPMGlTF","RsQUqReKEW","XflUqwDajX","hYBCKjtn0X","JXljWcShY2","aDGtSuPX7G","Uvlv41LB1L",
+"MK07YlCMxy","i7WMQ0Kyfs","v8yFNKZamH","nFqik7X3uy","YjB9tSWfou","aDGtS7Ow5C","Pb1pa2DREs","b29RJo8Uyd","NOHszNhXdu","YOfrY5iGN5",
+"h1zcHVjCZq","nlaByBbwgA","yofH3guMb8","9rlg9Waim6","Uvlv4d7vjM","KZamHWreyP","5NammZzJHW","iqv4kaL6AJ","rhl0JpT8wu","nlaBy64s8N",
+"1LB1LDcpWB","WreyPWDVWJ","OUYuFjiVBP","IjTwPdhSuH","AmdQd2ZHdk","LDk6fn8pJ9","uQIczuoStw","yvOMIogLgc","lXFOBv8yFN","FPfSEHRxd8",
+"uJScXEoToP","CNHmv7fsYM","VBjhzh1zcH","QYxC0U3yw5","Uvlv4piJSk","wDajXSs0Zu","0BmCyQChxs","NcICApiJSk","kB5nPjtn0X","soy9tTXQ0Z",
+"qQxHPOz8yZ","QYxC0HP433","Z4I1vQ6Lix","5Namm45cIH","580YDMGlTF","FcWrW8hJdt","NAFuwEOE1o","IBe8kSWfou","5VZjSv8yFN","LewvMWmadA",
+"ZzJHWReKEW","Cfgr3Ta8f6","qaofNCqqaD","JRJQBzz4ZU","ciuWzCK5W7","0PktIZJTXH","tuDyS5IhmG","BFkb8FnPFB","8cVD3RzaZA","taOXKdhSuH",
+"S77LHjtn0X","sx5GlYjB9t","tvdkD16lHc","ix74rzFgtB","tAOsrs7Mxk","FFDuiBbwgA","I7p2aOUqFM","n1pmOlsQGo","Uvlv4580YD","5VZjS0h1b1",
+"9GXkXbrhlQ","ZzJHWy94nw","3otm6pWiOs","Cfgr3vOqCE","mX2GEFGzgp","NAFuwFGzgp","mz8gxblLA9","L7cGcsqVrf","GSQwjI7p2a","BGaQYFNYIM",
+"AmdQdrhl0J","8FmFHciuWz","DcpWBuZPqg","iKqhrfmIK1","WMiS3FNYIM","MmKGJMmsIo","JIqXizz4ZU","29QAzEoToP","kZANmqUJMd","Gv3FqtjQxs",
+"QbxXcVBjhz","qaofNMojnP","55rfBS77LH","2Yz7ECdyBV","MezSWogLgc","HfyNQzQt6Q","CdyBVtvdkD","CdyBVKASQ8","LewvMdjsrv","5ZaEz24ARF",
+"t98iWWPmlx","JKWYRWaim6","QClRL5nmWv","2TRI7gdQsS","7hyVvCdyBV","jSjS3KZamH","8hJdtCIShG","Z4I1vrz7Ut","JRJQB7fKYU","JRJQBqaofN",
+"sqVrfhYBCK","piJSk8cVD3","WPmlxJJs5m","cQOnvhSSvQ","Gv3Fq580YD","RsQUqzqH0W","QChxsjSjS3","RsQUqTCgPp","ZzJHWQ6Lix","KZamHChuy3",
+"lCMxyzbIYY","2DREsdhSuH","7fsYM2Yz7E","6AFT0JkzUn","7Ow5CTXQ0Z","yToGWWmadA","MmsIoNAFuw","n8pJ9HP433","I7p2aJJs5m","v2eC3s93Ml",
+"dQ586dpe1v","n8pJ9tlILt","F6PT29XyT9","EoToPyvOMI","CxVEfLbRTH","ZJTXH8hJdt","L7cGcSjskQ","AmdQdEOE1o","Z4I1vjtn0X","lCMxyuN6r3",
+"kB5nPUl4a1","ZUnqtlsQGo","RBhp0fFDrJ","FwEJzRzaZA","Zv7z0blLA9","WMiS3J2mQi","RsQUqjS1aj","lweGyZUnqt","9XyT9MaJQs","VNCPdiKqhr",
+"qQxHPU3yw5","iKqhr7X3uy","xReecS77LH","s93MlQ6hMC","ru4UGC2Irc","lkMUAv2eC3","VjCZqRACuj","VLTy6Yh1hF","BbwgAzHF1q","qQxHPokgRi",
+"2DREs7hyVv","CK5W7VLTy6","48cHL1v5hH","QssNCFwEJz","GrDg755rfB","tlILt2ZHdk","dhSuHzqH0W","taOXKVLTy6","ru4UGeuZA5","64s8NYf2Ec",
+"faHirMezSW","1j5L8fmIK1","QbxXck85Ae","SjskQFFDui","GWqqXRzaZA","s93MlrKDLJ","tjQxslViBv","pAhR1PYBf4","7X3uygtCA5","29QAzSjskQ",
+"prNT6JKWYR","TXQ0ZThjNn","atef2QYxC0","aFFsspmeCd","VerEAZ4I1v","rz7Ut9rlg9","M6qcG5Mg9r","7Ow5C29QAz","8RCUARxrsm","RkQkev2eC3",
+"FFDui0ao3l","No0Qbm4bxU","fFDrJVprf2","Ss0Zu2TRI7","aez9y4dEz6","9eoRcOUqFM","BpYhVogLgc","qUJMd24ARF","euZA5EOE1o","0BmCyaDGtS",
+"ru4UGxXTI4","RmDcroGu6x","gIYvEQnJ1S","gjUTujSjS3","qaofN9iGoT","l83UdJKWYR","HfyNQpAhR1","64s8Nhi5X7","pWiOsKsjRK","ix74rtAOsr",
+"lViBvWMiS3","VLTy6wiHrZ","lpF6WQClRL","hi5X7NAFuw","29QAzv1Hln","kZANmDQimp","6q6L9BCxeC","pWiOs6q6L9","Cp3mZtaOXK","s7MxkUl4a1",
+"FxX9qMK07Y","Waim6VLTy6","Q6LixX6Pin","JIqXiUvlv4","2hEEUMGlTF","bgJAzHRxd8","y94nwfFDrJ","3otm63weIF","PYBf4taOXK","gIYvEW7cTs",
+"t59lRWMiS3","lH1ktZ4I1v","pv0i7hSSvQ","NAFuw0Wr5y","fcJOyhSSvQ","Uvlv4fcwDa","aez9y9GXkX","GrDg7uvf7A","SmGzvhi5X7","WaWsvKr8ys",
+"taOXKRpBQm","zz4ZUrhl0J","K4GS8uN6r3","soy9tmX2GE","hSSvQzmLYD","Cfgr3POUYS","n8pJ9WPmlx","x3LDennP8o","yvOMIydG8U","fmIK1UmaEv",
+"FLsphWMiS3","s7Mxkd85a9","5VZjSlweGy","uN6r3rhl0J","CNHmvpmeCd","ZzJHWni2v1","yluBxhe9IA","QworuWreyP","RmDcrJXljW","M6qcGD6rBy",
+"QbxXcDz1R3","PYBf4wDajX","Dz1R3PYBf4","azIWphi5X7","prNT6Mkgy8","yofH35Mg9r","zqH0W55rfB","d7vjMLDk6f","1LB1LKASQ8","uZPqgTXQ0Z",
+"FPfSEbgJAz","aFFsszHF1q","JkzUns4786","nlaByzY1GY","5Mg9rReKEW","Kr8ysuAWyp","IRh48MGlTF","piJSkJ2mQi","vOqCEazIWp","lH1ktMojnP",
+"LDk6fdhSuH","ix74riqv4k","4QMc9mz8gx","uupzkKr8ys","lCMxyuZPqg","tlILtLewvM","gf8rIeuZA5","pWiOsFPfSE","d85a9e6e4z","tjQxsTwano",
+"7ku1pgjUTu","aL6AJsx5Gl","aez9yJXljW","8U2nU2TRI7","QworuP6bcg","MmsIoni2v1","oGu6xTa8f6","zY1GYi3pyd","s4786iwzGk","uPX7Gdpe1v",
+"cL0aEWmadA","GWqqXQ6Lix","J2mQiaez9y","S77LHIn3NS","QnJ1SuTacx","BCxeCM6qcG","2NslmYOfrY","8FmFH24ARF","3otm6aFFss","RmDcrSWfou",
+"24ARFlXFOB","zmLYD5IhmG","RpBQmlViBv","WMiS3RBhp0","RmDcrWDVWJ","zHF1qcmXIX","sx5GlfmIK1","KZamH8U2nU","9GXkXM3zXL","TwanopmeCd",
+"k85AeSbRYy","FVMxoHlUbF","CqqaD5drc6","8FmFHTa8f6","FNYIMQWxoT","CdyBVQ6hMC","7lUXZ5nmWv","Z4I1vHzZT8","CxVEfECMvU","dmoS7ru4UG",
+"5Drn0JIqXi","B3qemNo0Qb","OUYuFQYxC0","WPmlxUlU3M","AmdQdprNT6","suY4xwDajX","AOgEeFVMxo","FjHXRVNCPd","CxVEfpT8wu","XyPZNL7cGc",
+"MK07Y55rfB","ru4UGuPX7G","HP4330Wr5y","okgRiRBhp0","s7MxkXyPZN","8FmFHOUqFM","Z4I1vFwEJz","MmKGJCIShG","tvdkDNcICA","EdBKcIn3NS",
+"MK07YQWxoT","FcWrWFFDui","d7vjMVerEA","In3NShE1Ql","taOXKG1RhS","zFgtBMezSW","SbRYy8RCUA","uLtKslpF6W","9iGoTRmDcr","QYxC0vOqCE",
+"DG4sTjfREu","dhSuHdpe1v","uTacxFnPFB","5iGN5uAWyp","JXljWO3iyQ","WMiS3AOgEe","tvdkDyToGW","8cVD3pT8wu","2DREscL0aE","okgRiRxrsm",
+"Gv3FqVprf2","9GXkXlViBv","fcJOyiB08l","cmXIXMmKGJ","MGlTFJIqXi","No0QbK20wK","fFDrJuN6r3","WMiS38RCUA","16lHclkMUA","2ZHdkkZANm",
+"VBjhzIn3NS","o8UydksJby","2hEEUQ6Lix","8hJdt14FLR","4dEz6uAWyp","3weIFLDk6f","6q6L9GXdoH","rz7Ut4QMc9","S77LHbgJAz","7hyVvXflUq",
+"ECMvUAmdQd","lweGyi7WMQ","S2DfuRsQUq","VjCZq5ZaEz","rhl0Jsoy9t","S2DfujS1aj","IKxdLVprf2","L7cGckB5nP","2Yz7EjS1aj","Yw2oUVBjhz",
+"9rlg9S77LH","s47865IhmG","X6PindmoS7","BGaQYjeskS","Twanogf8rI","nFqikfFDrJ","sx5Gl2DREs","X6PinXflUq","uTacxGXdoH","ZJTXHzHF1q",
+"64s8NF6PT2","ix74ruZPqg","jS1ajpmeCd","ulk41m4bxU","fcJOyzQt6Q","Q6hMCi3pyd","ulk41bgJAz","ni2v14dEz6","LbRTHa00b5","5Drn029QAz",
+"8U2nUs93Ml","7fsYMsx5Gl","uQIczHfyNQ","CxVEfqUJMd","9rlg9J2mQi","uZPqgjS1aj","5IhmG5nmWv","M6qcGcShY2","LbRTHsqVrf","ix74r5Namm",
+"gIYvECNHmv","fFDrJQworu","taOXKI7p2a","W7cTsfcJOy","VIlwPuLtKs","F6PT264s8N","Yw2oUyofH3","uoStw2TRI7","0Kyfssoy9t","2NslmOHaBz",
+"gIYvEaFFss","ReKEWCK5W7","WMiS3lweGy","IRh48HfyNQ","sx5Gli3pyd","Rxrsmdpe1v","tvdkDRxrsm","2ZHdkTCgPp","tl72WQ6Lix","Cfgr3blLA9",
+"QnJ1She9IA","ni2v1yluBx","x3LDe2Nslm","OxWIHi7WMQ","XflUqtuDyS","FPfSEwDajX","blLA9WreyP","WaWsvI7p2a","3weIFB3qem","0PktIjfREu",
+"ZuDtDFcWrW","RkQke2Nslm","HP43307n1c","lj07Qv2eC3","7fsYMix74r","AXpwERsQUq","hUTw7HzZT8","yofH3L7cGc","ksJbyRpBQm","64s8NgIYvE",
+"L7cGcfmIK1","MaJQsWmadA","lpF6Wiqv4k","ZUnqtfmIK1","zY1GYCdyBV","8xEKzBpYhV","OxWIH6q6L9","ECMvUEdBKc","VjCZqgdQsS","45cIHPYBf4",
+"2TRI7KsjRK","FcWrWzqH0W","ydG8UUvlv4","fcJOyd85a9","ZUnqt2hEEU","VNCPdOUYuF","5Mg9rG1RhS","7X3uyMkgy8","zY1GYpAhR1","piJSkIBe8k",
+"QWxoTciuWz","5nmWv3otm6","Ss0ZuXflUq","RsQUq4QMc9","PYBf416lHc","uTacxnnP8o","d7vjMJ2mQi","5ZaEzzmLYD","SWfouprNT6","7Ow5C7hyVv",
+"i3pydbZLvS","U3yw5Ul4a1","YOfrYIn3NS","a00b5X6Pin","t59lRRsQUq","lXFOBJKWYR","QbxXcIKxdL","HlUbFs4786","LewvMatef2","pFrrlgtCA5",
+"n8pJ9MmsIo","0MR5XqUJMd","RpBQmNOHsz","GWqqXpFrrl","9iGoTjzUqR","brhlQhSSvQ","OHaBzZhwG1","zQt6Qo8Uyd","gIYvEprNT6","blLA9QssNC",
+"azIWpLewvM","FjHXRyToGW","Nxx9V7fKYU","7fsYM6q6L9","bZLvSFwEJz","JkzUnd7vjM","hi5X7W7cTs","euZA5fLNg8","lpF6WKsjRK","Pb1paIKxdL",
+"hi5X7NhXdu","aDGtSRmDcr","d85a9FFDui","uAWypEdBKc","jtn0XZ4I1v","Uvlv4hUTw7","YOfrYuvf7A","16lHc618Di","AOgEe3otm6","s4786lXFOB",
+"9y4lwRzaZA","29QAzZhwG1","RsQUqzHF1q","3otm6tAOsr","fLNg8QChxs","MojnPZUnqt","UlU3MLbRTH","m4bxUAOgEe","soy9t64s8N","blLA9FnPFB",
+"jzUqRoVQp6","DQimp45cIH","FVMxoRzaZA","0ao3ljfREu","v2eC3zQt6Q","gdQsSogLgc","zbIYYXyPZN","5VZjSUl4a1","P6bcgYjB9t","24ARFoQ87r",
+"HP433yToGW","XyPZNatef2","8hJdtgjUTu","JXljWtjQxs","zqH0WMezSW","oGu6xVBjhz","In3NS5ZaEz","gjUTu8hJdt","tjQxstAOsr","s7MxkokgRi",
+"lH1kts4786","mX2GEs93Ml","7Ow5Che9IA","5drc6gf8rI","0KyfsWPmlx","h1zcH9eoRc","8cVD3JJs5m","WmadAS77LH","d7vjMDcpWB","uoStwh1zcH",
+"prNT6RsQUq","AOgEeLewvM","2hEEU4QMc9","4W0TlQYxC0","WDVWJ2DREs","RBhp0MaJQs","Dz1R3zFgtB","x3LDelj07Q","9eoRcFcWrW","uoStw1LB1L",
+"K20wKECMvU","2TRI7Cp3mZ","jiVBPFnPFB","ZuDtDYjB9t","suY4xIKxdL","3weIFoVQp6","Waim6prNT6","hSSvQCNHmv","aez9ypWiOs","5IhmGUvlv4",
+"n1pmOCNHmv","14FLRFnPFB","tAOsrXflUq","hSSvQfcwDa","okgRifmIK1","qUJMdSjskQ","zmLYDaDGtS","SmGzvcQOnv","lj07Qru4UG","h1zcHmX2GE",
+"lXFOBm4bxU","5Mg9rRxrsm","VerEAzY1GY","IBe8kh1zcH","t98iWRACuj","G1RhS6q6L9","24ARF5nmWv","hE1QlFGzgp","Oz8yZlViBv","tAOsriKqhr",
+"iwzGkiKqhr","5drc6dmoS7","WPmlxLDk6f","jeskSRkQke","0YAGHCxVEf","pFrrlhi5X7","atef2yluBx","lm0pDSWfou","hE1Ql07n1c","s7MxkGrDg7",
+"kZANmx3LDe","lj07QBpYhV","VerEAOxWIH","kZANmJIqXi","0Wr5yFPfSE","QChxsdpe1v","pWiOsPOUYS","atef2jiVBP","S77LHuZPqg","Ss0ZuK4GS8",
+"d7vjM3otm6","DG4sTuQIcz","5nmWv5Namm","FNYIMKsjRK","MmKGJ9eoRc","ksJbygIYvE","m4bxULbRTH","TXQ0ZvkCHH","t59lRWDVWJ","Waim6xReec",
+"lXFOB0ao3l","9iGoTNo0Qb","l83UdWPmlx","BCxeC9eoRc","MK07YUmaEv","8RCUAgIYvE","M3zXLPb1pa","jS1ajx3LDe","FFDuiGrDg7","1j5L8ciuWz",
+"OUYuFFcWrW","TCgPptl72W","ksJbylH1kt","HfyNQBpYhV","VIlwPtuDyS","FnPFBOUqFM","ciuWzW3VFH","HRxd8ydG8U","9y4lwuJScX","Y1mC0W3VFH",
+"7X3uyDcpWB","qUJMdFVMxo","Gv3FqIRh48","POUYS0BmCy","qQxHP7fsYM","vOqCE5nmWv","fcwDaoVQp6","qQxHPgdQsS","Pb1paMkgy8","I7p2atuDyS",
+"Zv7z0lj07Q","5nmWvJXljW","FjHXRpiJSk","WreyP6q6L9","kB5nPStlDJ","RsQUq5ZaEz","9iGoTRxrsm","o8Uyd0YAGH","iKqhr0YAGH","Cp3mZQWxoT",
+"tjQxsIjTwP","vkCHHYw2oU","6q6L9t98iW","Nxx9V0Kyfs","rKDLJbrhlQ","2DREsVerEA","vLsmSulk41","5iGN5OUYuF","zHF1qjtn0X","CIShGAIYUu",
+"KASQ8zHF1q","7ku1puvf7A","zHF1qd85a9","14FLR5Namm","RsQUqaL6AJ","FFDuiru4UG","StlDJWreyP","NcICA3otm6","uZPqgWmadA","yEfy9n1pmO",
+"pmeCdksJby","2Yz7Ed7vjM","lCMxyfcwDa","l83UdpT8wu","sx5GltAOsr","LewvMEoToP","4W0TlbgJAz","BbwgA8U2nU","s4786zz4ZU","BpYhVBFkb8",
+"vOqCEHzZT8","7fsYMeuZA5","0BmCyazIWp","6AFT02ZHdk","OxWIH8cVD3","pAhR1kZANm","xciqppv0i7","RsQUqCp3mZ","CNHmvCdyBV","GWqqX5Mg9r",
+"Cp3mZJ2mQi","v1Hln14FLR","HP433xciqp","Y1mC0SbRYy","rz7UttvdkD","lj07Q7fsYM","k85AeMK07Y","sx5Glh1zcH","5NammX6Pin","CK5W7RsQUq",
+"0h1b1jzUqR","wiHrZDG4sT","FnPFB7Ow5C","HRxd8k85Ae","JkzUnP6bcg","pmeCdzY1GY","lkMUA48cHL","aL6AJLewvM","7X3uyYjB9t","uN6r36q6L9",
+"dpe1vni2v1","Uvlv4jSjS3","07n1cTXQ0Z","jS1aj5Drn0","KsjRKQssNC","ix74rK20wK","GXdoH5nmWv","tjQxs0Wr5y","iqv4klViBv","TXQ0ZPYBf4",
+"s4786aez9y","v8yFNDLhzM","SbRYyfaHir","i3pyd580YD","taOXKWaim6","Ul4a1yluBx","JIqXiaL6AJ","jtn0XCIShG","W7cTshE1Ql","xReeclsQGo",
+"XyPZNtjQxs","XflUqyluBx","YjB9t0ao3l","uvf7Alj07Q","07n1c7X3uy","XflUq5VZjS","WPmlxXyPZN","8U2nUQ6hMC","Mkgy8Yf2Ec","zbIYYuLtKs",
+"jSjS3K4GS8","lCMxyguMb8","JRJQBQbxXc","suY4xrhl0J","VLTy6hi5X7","qaofNaL6AJ","P6bcgEoToP","55rfBzbIYY","tlILtMaJQs","ogLgcx3LDe",
+"CxVEf9iGoT","7fsYM9eoRc","5ZaEzWMiS3","9XyT9618Di","WreyP24ARF","hi5X7fqypy","64s8NiB08l","BGaQYaFFss","Gv3FqIn3NS","9iGoTjtn0X",
+"iwzGkjfREu","hUTw7zY1GY","FhtglydG8U","ECMvUNcICA","KZamHlpF6W","vOqCEoQ87r","AkKTky94nw","MmsIoFGzgp","BCxeC16lHc","Cp3mZAIYUu",
+"G1RhShe9IA","SWfouRmDcr","QssNCEoToP","IBe8kI7p2a","iKqhrRmDcr","pWiOsWPmlx","suY4xogLgc","lpF6Wulk41","jS1ajrKDLJ","uoStwksJby",
+"okgRipFrrl","7ku1piKqhr","cmXIX48cHL","Cp3mZW3VFH","9XyT9Ta8f6","m4bxUrhl0J","Vprf2QWxoT","JRJQBCNHmv","uPX7GXflUq","2hEEUdmoS7",
+"he9IAnlaBy","BpYhVUvlv4","WMiS3fFDrJ","s4786POUYS","ru4UGpWiOs","S77LHnnP8o","XflUqhi5X7","QClRL5IhmG","DQimpulk41","29QAzFhtgl",
+"CNHmvzmLYD","ciuWzGSQwj","POUYSF6PT2","5iGN5QYxC0","djsrvZv7z0","cShY2s7Mxk","2Yz7Esx5Gl","8xEKzPOUYS","oQ87rWmadA","NAFuwQClRL",
+"lCMxytaOXK","5VZjSfqypy","FwEJzs7Mxk","JXljWoVQp6","y94nwsuY4x","yofH3MojnP","uAWypmX2GE","BbwgAuQIcz","9y4lwkZANm","prNT6GrDg7",
+"guMb8kB5nP","Z4I1vRxrsm","07n1csoy9t","1j5L8qUJMd","EdBKcJkzUn","tlILtAkKTk","JkzUnWaWsv","he9IAhYBCK","3otm6h1zcH","lCMxyWreyP",
+"0Wr5ywiHrZ","i3pydKZamH","SmGzvHzZT8","vLsmSkB5nP","Mkgy8uZPqg","GSQwjsx5Gl","8xEKz9XyT9","29QAzJIqXi","0ao3lfcJOy","TwanoblLA9",
+"BFkb8lm0pD","SmGzvrz7Ut","zmLYDWMiS3","vLsmSokgRi","07n1cNcICA","fcwDacQOnv","Mkgy8W7cTs","s4786FGzgp","KZamH2Yz7E","IjTwPOUqFM",
+"tvdkDzqH0W","WaWsvBbwgA","soy9tAIYUu","FVMxohUTw7","gjUTuSWfou","1j5L8TCgPp","rKDLJcmXIX","RxrsmMezSW","1v5hHoQ87r","okgRiiKqhr",
+"pmeCdfcJOy","0YAGHJ2mQi","NOHszqQxHP","7fKYUpFrrl","ulk41Ss0Zu","QChxs2Yz7E","14FLRF6PT2","Nxx9Vuvf7A","Pb1patvdkD","RpBQmlXFOB",
+"RBhp0GWqqX","Yh1hFguMb8","lXFOBMkgy8","guMb8lXFOB","tlILtRBhp0","zY1GY0Kyfs","4W0TllViBv","k85Ae7X3uy","soy9tgf8rI","Q6hMCqUJMd",
+"Kr8ysoGu6x","i3pyd5VZjS","b29RJFjHXR","iwzGkBbwgA","HlUbFMezSW","BGaQYn1pmO","n1pmOVprf2","uZPqgX6Pin","AmdQdgjUTu","QssNCfcJOy",
+"5nmWvpFrrl","uAWypsoy9t","ogLgcJXljW","dpe1vNxx9V","hUTw7ydG8U","9XyT98RCUA","4W0TlJ2mQi","pv0i70YAGH","cQOnvru4UG","vkCHHHzZT8",
+"9rlg9BGaQY","M6qcGfqypy","ZuDtD2ZHdk","2DREsAgJHQ","Mkgy8zFgtB","QnJ1Suupzk","cShY2tlILt","9GXkX0PktI","RBhp0b29RJ","jeskS24ARF",
+"3otm6Cp3mZ","rKDLJ8hJdt","GSQwjfmIK1","6AFT0pv0i7","JkzUnoQ87r","KsjRKgjUTu","MGlTFK4GS8","s93MlLewvM","5VZjS7ku1p","v1HlndQ586",
+"MezSWL7cGc","5NammOHaBz","s4786MezSW","StlDJRBhp0","LDk6f5nmWv","14FLRYjB9t","zHF1qyluBx","EoToPTwano","K4GS8lH1kt","i3pyd0BmCy",
+"jtn0X24ARF","4dEz6Ss0Zu","s4786VIlwP","YOfrYZUnqt","LbRTHRxrsm","FhtglrKDLJ","t59lRZJTXH","RACuj5Drn0","FnPFB9rlg9","vOqCErz7Ut",
+"qQxHPAmdQd","VIlwP3weIF","ix74rjfREu","zFgtBTXQ0Z","BCxeCzFgtB","Y1mC0MezSW","VBjhzciuWz","W3VFHCqqaD","cShY2NAFuw","ZhwG1Waim6",
+"lweGydmoS7","dQ586LewvM","YOfrYgdQsS","0KyfsCK5W7","Dz1R3HP433","SmGzvTCgPp","oQ87reuZA5","LewvMHRxd8","GXdoHMm8si","piJSkF6PT2",
+"kB5nPfmIK1","XflUqx3LDe","lCMxyzFgtB","Yw2oU618Di","EdBKc5ZaEz","Y1mC0piJSk","fmIK1tvdkD","QbxXc5VZjS","pT8wuHlUbF","LewvMFjHXR",
+"KsjRKY1mC0","FFDuipvgjS","uN6r3yToGW","nFqikjS1aj","FVMxojS1aj","RACuj4W0Tl","In3NSMm8si","Dz1R3uJScX","SmGzvzFgtB","b29RJ1v5hH",
+"aFFssIRh48","FxX9qPOUYS","8RCUAiwzGk","jzUqR5ZaEz","VjCZqFwEJz","HP4330MR5X","FPfSEsqVrf","4dEz6y94nw","HfyNQdjsrv","QssNCKr8ys",
+"SWfou7hyVv","uTacxnlaBy","BFkb8SbRYy","HzZT8HlUbF","rKDLJP6bcg","fFDrJW3VFH","LbRTH9iGoT","5iGN50PktI","yvOMI45cIH","SWfouxReec",
+"uN6r3n1pmO","M6qcGIjTwP","oVQp6t98iW","Mkgy8guMb8","X6PincQOnv","JKWYRrKDLJ","U3yw5zqH0W","uTacx580YD","uTacxpFrrl","LewvMYw2oU",
+"DG4sTVIlwP","fqypyJ2mQi","yEfy914FLR","0YAGHlsQGo","No0QbOUqFM","KZamHhSSvQ","WaWsvFNYIM","tAOsr16lHc","t98iW8hJdt","24ARFHzZT8",
+"cmXIXjeskS","PYBf42Yz7E","soy9tbrhlQ","Mm8sizHF1q","No0QbiwzGk","fLNg8Ss0Zu","0YAGHxciqp","Chuy3MaJQs","14FLRJXljW","2hEEUlkMUA",
+"zFgtBZv7z0","4dEz65IhmG","DG4sTjeskS","nnP8ofqypy","ThjNnD6rBy","SjskQWDVWJ","Twano5iGN5","4dEz69XyT9","7ku1p5Mg9r","5ZaEzY1mC0",
+"IjTwPUlU3M","2NslmSbRYy","9rlg9azIWp","lCMxyXyPZN","aez9yOxWIH","KsjRKYh1hF","DLhzMzqH0W","l83Ud5VZjS","ZJTXHfqypy","fmIK1AOgEe",
+"SjskQP6bcg","K20wK9XyT9","t98iWB3qem","4QMc9bZLvS","8xEKzjfREu","tl72WtaOXK","MmKGJjS1aj","PYBf4WPmlx","aDGtSWDVWJ","WPmlxcL0aE",
+"CK5W7No0Qb","d7vjMyEfy9","yluBxM6qcG","tjQxsThjNn","MGlTF1v5hH","0KyfsChuy3","VerEACqqaD","s4786VerEA","uAWypNcICA","FVMxoHRxd8",
+"JKWYRFxX9q","o8Uydlj07Q","JkzUnsoy9t","D6rBydhSuH","QWxoTgIYvE","faHirRxrsm","TCgPpJJs5m","lm0pDBCxeC","I7p2a14FLR","BpYhVDLhzM",
+"iB08ltvdkD","IKxdL24ARF","RACujlXFOB","NcICAL7cGc","WaWsvokgRi","5nmWvChuy3","W3VFHX6Pin","8U2nUv1Hln","ni2v1i7WMQ","VNCPdsx5Gl",
+"uupzkRBhp0","he9IAYh1hF","RBhp0OUqFM","ZuDtDSs0Zu","oGu6xQYxC0","1LB1Ltl72W","dmoS78FmFH","tl72WyluBx","8FmFH55rfB","JRJQBCqqaD",
+"Gv3FqQssNC","lH1kt2TRI7","TXQ0Zk85Ae","ZzJHW2DREs","blLA929QAz","sqVrfyvOMI","zFgtB3otm6","n8pJ9iKqhr","aFFssVjCZq","9eoRcVLTy6",
+"SbRYym4bxU","k85AelkMUA","5Drn024ARF","WPmlxEdBKc","HlUbFfcwDa","VjCZq48cHL","zFgtBIjTwP","0PktI14FLR","jSjS3YjB9t","RxrsmP6bcg",
+"JkzUnqUJMd","TCgPpokgRi","2hEEU8hJdt","yEfy9GSQwj","RpBQms93Ml","fFDrJ2DREs","AIYUutuDyS","Cfgr3HlUbF","ZJTXHQssNC","e6e4zRkQke",
+"MmKGJ6AFT0","o8UydgdQsS","guMb85Drn0","8hJdtOxWIH","G1RhSlkMUA","mX2GEoVQp6","7fKYUvkCHH","2TRI7aez9y","zHF1qK20wK","W3VFHCNHmv",
+"Q6hMCzz4ZU","0YAGHPYBf4","hi5X7JkzUn","kB5nPlpF6W","QYxC08RCUA","e6e4zUvlv4","Vprf2EOE1o","nnP8o8FmFH","vOqCEKZamH","SWfouYjB9t",
+"I7p2agjUTu","9XyT9wDajX","Twanoxciqp","gjUTuFwEJz","OUYuFpiJSk","RxrsmsqVrf","RpBQmLewvM","MK07YhSSvQ","0BmCy5Mg9r","Vprf245cIH",
+"5VZjSiqv4k","uPX7Gmz8gx","zFgtBqUJMd","d7vjMQWxoT","nnP8oD6rBy","LewvMxReec","XyPZNWaWsv","618Di2TRI7","hYBCKJIqXi","yEfy9Q6Lix",
+"zqH0WZv7z0","FhtglGWqqX","5IhmGQnJ1S","WPmlxzz4ZU","lCMxyxciqp","l83UdguMb8","GXdoHK4GS8","a00b5lXFOB","HzZT8jfREu","Cp3mZYh1hF",
+"LbRTHIn3NS","VBjhzOz8yZ","t98iWiB08l","No0QbCfgr3","x3LDe7hyVv","4dEz6DG4sT","VjCZqFxX9q","Gv3Fqo8Uyd","CK5W7e6e4z","CNHmvP6bcg",
+"55rfBjtn0X","aFFsslweGy","rz7UtYOfrY","nFqikAkKTk","TCgPpY1mC0","brhlQS2Dfu","DcpWBKASQ8","v8yFNTa8f6","uvf7Adjsrv","W7cTsOUqFM",
+"OUYuF0ao3l","LDk6flj07Q","YOfrYVerEA","7lUXZsuY4x","hSSvQuAWyp","lm0pDVerEA","In3NSyToGW","azIWpFPfSE","ogLgcGXdoH","Dz1R3Cp3mZ",
+"pWiOstAOsr","GXdoHrz7Ut","blLA9Gv3Fq","F6PT207n1c","jeskSd85a9","Cp3mZ7fsYM","VNCPdYOfrY","Zv7z0rKDLJ","55rfBb29RJ","M6qcG8RCUA",
+"5Drn0blLA9","CK5W7wiHrZ","Yw2oUSs0Zu","IRh48X6Pin","7ku1pQ6Lix","mz8gxHP433","zQt6QDG4sT","MGlTFd7vjM","ydG8UxXTI4","64s8NzHF1q",
+"jSjS39rlg9","lweGy2Yz7E","v1HlntvdkD","OUqFMdjsrv","zmLYD2DREs","CK5W7rhl0J","TCgPptlILt","VLTy6yEfy9","POUYSuQIcz","Yh1hF9y4lw",
+"WMiS34dEz6","9y4lwbrhlQ","Mkgy8VNCPd","GWqqX1LB1L","D6rByjS1aj","fcwDa2TRI7","8U2nUVBjhz","euZA5uTacx","azIWpSs0Zu","lXFOBBFkb8",
+"618Di2Nslm","v2eC3CIShG","guMb82Yz7E","7hyVv2DREs","azIWpJXljW","Ul4a10BmCy","Cp3mZe6e4z","HzZT8AmdQd","t59lR5Namm","y94nwcShY2",
+"XyPZNuAWyp","5drc6qaofN","tjQxsJ2mQi","KASQ816lHc","Q6hMCRkQke","GXdoHMGlTF","FwEJzRACuj","vLsmSBCxeC","suY4xlH1kt","ZJTXH9rlg9",
+"MaJQsn8pJ9","cL0aE8RCUA","55rfBbrhlQ","4QMc9NOHsz","lCMxyM6qcG","WDVWJMm8si","iB08lAIYUu","9iGoTCK5W7","djsrvVprf2","0ao3l0MR5X",
+"618DiPb1pa","piJSkzQt6Q","QChxsCfgr3","CK5W7sx5Gl","DQimpL7cGc","YjB9tF6PT2","uQIczM3zXL","n8pJ9oVQp6","9XyT9WmadA","OUYuFfqypy",
+"5ZaEzOUYuF","dhSuHNAFuw","djsrvHP433","AgJHQ9y4lw","9rlg9bgJAz","45cIHRACuj","EoToP8U2nU","OUqFMPOUYS","KASQ8LewvM","hE1Ql9XyT9",
+"gtCA5vOqCE","iwzGkoGu6x","RmDcrgf8rI","4W0TlFhtgl","7fKYUGv3Fq","OxWIHsx5Gl","AgJHQhUTw7","IRh48vOqCE","aez9yDz1R3","IBe8khUTw7",
+"BCxeCThjNn","NOHszVprf2","uJScXk85Ae","DLhzMReKEW","1LB1L2DREs","vOqCEQYxC0","EdBKcvOqCE","DcpWBPb1pa","sx5Gl4W0Tl","sx5GlNOHsz",
+"WMiS3zY1GY","yvOMI7fKYU","7X3uyNo0Qb","uN6r3BGaQY","aez9yBCxeC","uvf7AIKxdL","JKWYRrz7Ut","TwanoVBjhz","Gv3FqtAOsr","djsrvuupzk",
+"5drc6MmsIo","3weIFMm8si","5IhmGatef2","NAFuwBGaQY","HRxd8HP433","0KyfssqVrf","CNHmvKr8ys","9rlg9euZA5","o8UyduN6r3","OUqFMVBjhz",
+"8FmFHGv3Fq","29QAzzbIYY","WmadADQimp","rz7UtHfyNQ","Q6hMC29QAz","9GXkXK20wK","Waim6Yw2oU","FwEJzTXQ0Z","dQ58607n1c","FjHXRv8yFN",
+"ECMvUsuY4x","TwanotAOsr","guMb82TRI7","sx5Gl5iGN5","pAhR1cL0aE","CdyBVZUnqt","FhtgluTacx","d85a91LB1L","RkQke5Drn0","pAhR1tjQxs",
+"StlDJe6e4z","5ZaEzEdBKc","zY1GYs93Ml","64s8NoQ87r","G1RhSpT8wu","ksJby5Namm","FPfSElweGy","jiVBPFwEJz","FhtglTa8f6","uPX7GEOE1o",
+"580YDFLsph","5NammOUqFM","StlDJQClRL","IBe8kcQOnv","qUJMdCIShG","KASQ8Pb1pa","lH1ktRsQUq","W3VFHMGlTF","0KyfsRmDcr","iKqhrD6rBy",
+"vkCHHtaOXK","cmXIXzbIYY","L7cGcjzUqR","fcwDaStlDJ","2ZHdkHP433","Yh1hFh1zcH","SbRYyGSQwj","OxWIHuN6r3","prNT64QMc9","MGlTFiwzGk",
+"hE1QldmoS7","xciqp3weIF","ru4UGFVMxo","GSQwjHRxd8","2ZHdk8RCUA","ECMvUCNHmv","MK07YwiHrZ","CdyBVqUJMd","RsQUq29QAz","pmeCdBpYhV",
+"soy9tv2eC3","CNHmvRsQUq","pvgjS618Di","sx5Gll83Ud","GrDg7QbxXc","fLNg8rz7Ut","9iGoT5Namm","1v5hH2Yz7E","uJScXS77LH","NhXdu2hEEU",
+"LewvMix74r","s7MxkQ6hMC","L7cGcRkQke","Yf2Ec8cVD3","JIqXiNo0Qb","7hyVvlH1kt","4dEz6Mkgy8","EoToPHP433","7X3uyguMb8","IRh48S2Dfu",
+"Zv7z0JkzUn","pv0i7vkCHH","X6Pinru4UG","SbRYyReKEW","NcICAI7p2a","NhXdulXFOB","aDGtS55rfB","0YAGHRBhp0","Z4I1vFhtgl","guMb8QssNC",
+"jfREul83Ud","IRh48iqv4k","RzaZAv2eC3","hUTw79iGoT","kZANmRmDcr","QnJ1S2ZHdk","tuDySnnP8o","jSjS3kZANm","pvgjSG1RhS","fLNg88RCUA",
+"yluBxXyPZN","5iGN58RCUA","jzUqREOE1o","5NammYf2Ec","yToGWFnPFB","QWxoTa00b5","cL0aEh1zcH","pv0i7pFrrl","O3iyQn8pJ9","16lHcix74r",
+"zmLYDW7cTs","5VZjSOHaBz","dpe1v8TxD7","MmsIoJXljW","FVMxojeskS","tlILtZUnqt","fLNg85Mg9r","IBe8kWMiS3","WDVWJWreyP","RBhp0SbRYy",
+"qaofNOUYuF","KZamHyvOMI","uAWypGv3Fq","2ZHdkjS1aj","Yh1hFHRxd8","ix74rix74r","pWiOsiB08l","tlILtIRh48","prNT6gtCA5","In3NSbZLvS",
+"WreyPOz8yZ","VIlwPkB5nP","i7WMQlkMUA","LDk6fRkQke","CNHmvnlaBy","7ku1pwDajX","VjCZq3weIF","ZJTXHMK07Y","9rlg9ogLgc","gtCA5QChxs",
+"fmIK15IhmG","8RCUAjeskS","1LB1LcShY2","POUYSVLTy6","RzaZARpBQm","SmGzvReKEW","soy9ts4786","WreyPqaofN","WaWsvxReec","WMiS3WDVWJ",
+"s4786Yw2oU","i3pydF6PT2","YOfrYulk41","gtCA5jfREu","yToGWQClRL","dhSuH6q6L9","Q6hMCStlDJ","64s8NCdyBV","pFrrlCqqaD","lj07QC2Irc",
+"AOgEeDz1R3","uJScXAmdQd","b29RJyvOMI","cmXIXrKDLJ","Z4I1vCIShG","tl72WFcWrW","n8pJ9Qworu","QssNC0PktI","lViBv3weIF","YjB9tlsQGo",
+"RmDcrSjskQ","uvf7AThjNn","v2eC3ix74r","lH1kt4dEz6","CdyBVP6bcg","HlUbFfmIK1","GrDg75drc6","mX2GEbgJAz","oGu6xtAOsr","BpYhVn8pJ9",
+"HzZT8euZA5","Ss0ZupT8wu","lsQGo8TxD7","iB08lFVMxo","4W0TleuZA5","SjskQhSSvQ","0PktIDz1R3","lkMUAtAOsr","AkKTks93Ml","2TRI7W3VFH",
+"M6qcGiKqhr","G1RhSlsQGo","SbRYyNxx9V","uvf7AvLsmS","SWfouQnJ1S","xXTI4WMiS3","i7WMQGSQwj","hi5X7azIWp","8TxD7QssNC","aFFsslCMxy",
+"FnPFBrKDLJ","2hEEUJIqXi","P6bcgAkKTk","zz4ZUFPfSE","Zv7z0NcICA","fqypyiKqhr","I7p2adhSuH","lsQGoNcICA","o8Uydhi5X7","GrDg73weIF",
+"MezSWOUYuF","rz7Ut1v5hH","JXljWmX2GE","WaWsvW3VFH","fcwDad85a9","6AFT0BCxeC","zFgtBpiJSk","Gv3FqBGaQY","guMb8OxWIH","JIqXipv0i7",
+"BGaQYZ4I1v","FGzgpJKWYR","DLhzMzY1GY","QChxs3weIF","9iGoTvkCHH","8FmFHcShY2","DLhzM48cHL","6AFT0mz8gx","aez9yGWqqX","FVMxoOHaBz",
+"S77LHHRxd8","WPmlxbgJAz","9GXkXgdQsS","WmadACfgr3","AIYUuEdBKc","DLhzMY1mC0","EdBKcMezSW","suY4xzY1GY","gdQsS3weIF","EdBKcTCgPp",
+"U3yw5BCxeC","HfyNQAOgEe","GWqqX4dEz6","iwzGkYjB9t","6q6L9RBhp0","hUTw77ku1p","QworuRBhp0","zHF1q6q6L9","pv0i7Nxx9V","s4786IjTwP",
+"BbwgAulk41","Uvlv45drc6","DcpWBhE1Ql","pFrrl5ZaEz","POUYSbZLvS","DQimpOxWIH","No0QbZhwG1","AOgEeYw2oU","EoToPpWiOs","XyPZNlViBv",
+"OHaBzUmaEv","AIYUu0h1b1","RpBQmvLsmS","mX2GEVNCPd","HlUbFv8yFN","LDk6fWMiS3","AmdQdJkzUn","WDVWJVNCPd","OHaBzpiJSk","6AFT0VIlwP",
+"n1pmO5drc6","GSQwjvkCHH","WPmlxvLsmS","2DREsQ6hMC","FPfSEIjTwP","CNHmvpiJSk","ZUnqtjtn0X","2DREsk85Ae","TXQ0Z7fKYU","14FLRCdyBV",
+"IRh48VBjhz","Chuy3VjCZq","kZANmIn3NS","0ao3lG1RhS","45cIHMmsIo","WPmlxP6bcg","kZANmTXQ0Z","9y4lwWaWsv","FLsphDLhzM","PYBf4YjB9t",
+"yluBxP6bcg","JJs5mVprf2","ThjNnGXdoH","P6bcg8U2nU","X6PinIn3NS","fqypyt98iW","lpF6WlsQGo","TXQ0Z2DREs","BbwgAhSSvQ","ydG8U4dEz6",
+"QnJ1SQbxXc","o8Uydru4UG","P6bcgogLgc","ulk41SjskQ","7X3uyIRh48","suY4xMkgy8","a00b5uvf7A","0YAGHCK5W7","rKDLJpAhR1","fcwDaydG8U",
+"24ARFM3zXL","9iGoTatef2","P6bcgaFFss","lkMUA5Namm","ydG8Um4bxU","VNCPdHP433","lCMxySbRYy","e6e4zQssNC","n8pJ9tuDyS","FVMxov1Hln",
+"fcwDafLNg8","IRh48POUYS","DQimpfaHir","jeskSGWqqX","Uvlv4HP433","BpYhVEdBKc","AmdQdCdyBV","yofH3KZamH","8TxD7FnPFB","Dz1R3aL6AJ",
+"iB08lAOgEe","RpBQmWaWsv","yToGWfqypy","C2Irci3pyd","oGu6xMK07Y","M6qcGs7Mxk","uPX7Gv1Hln","pAhR1D6rBy","XyPZNjtn0X","IKxdLKZamH",
+"pFrrlThjNn","Gv3FqYf2Ec","JRJQBaez9y","wDajXSjskQ","KsjRKy94nw","2TRI79eoRc","7Ow5C55rfB","lkMUANo0Qb","UmaEvbZLvS","EOE1oS77LH",
+"cShY2In3NS","zbIYYogLgc","TCgPpDz1R3","ciuWzNo0Qb","ZhwG1e6e4z","F6PT2Pb1pa","HlUbF7fsYM","8RCUALbRTH","9iGoTQWxoT","y94nwHP433",
+"wDajX6q6L9","AkKTk7ku1p","t59lRG1RhS","7X3uyFnPFB","5Nammn8pJ9","2TRI7HlUbF","QworuY1mC0","FcWrWThjNn","BGaQYRxrsm","M3zXLFLsph",
+"POUYSe6e4z","TXQ0ZjiVBP","jS1ajNcICA","WmadABbwgA","Yh1hFrz7Ut","tAOsrMojnP","S77LHuJScX","pmeCdnnP8o","CdyBVVIlwP","8xEKzAIYUu",
+"Qworu0Wr5y","QssNCDQimp","PYBf4k85Ae","VNCPdwiHrZ","Q6LixBCxeC","d85a9n1pmO","MmsIofqypy","yToGWQbxXc","55rfBYh1hF","pv0i707n1c",
+"ni2v1MK07Y","suY4xuTacx","wiHrZlpF6W","VjCZqbgJAz","0BmCyMmKGJ","FVMxorhl0J","jS1ajtuDyS","JKWYRlj07Q","y94nwy94nw","BCxeCvLsmS",
+"Zv7z0nFqik","hE1QlFnPFB","UmaEvfcJOy","v8yFNyluBx","9XyT9lpF6W","HP433M3zXL","lweGyFVMxo","JIqXiMezSW","y94nwzqH0W","cShY2Twano",
+"v8yFNHlUbF","QWxoTWDVWJ","ydG8UP6bcg","NAFuwgjUTu","HP433CdyBV","FPfSE55rfB","TCgPpFhtgl","atef2UmaEv","o8UydD6rBy","jS1ajBFkb8",
+"MmKGJoQ87r","uZPqgm4bxU","FGzgpvOqCE","vOqCEEOE1o","iwzGk2ZHdk","Z4I1vSs0Zu","lH1ktWPmlx","suY4xi7WMQ","7X3uyHzZT8","G1RhSpvgjS",
+"yEfy9FLsph","RBhp0NOHsz","ThjNnprNT6","bgJAzWMiS3","euZA5WreyP","Gv3FqjeskS","7X3uydhSuH","Pb1papvgjS","uN6r39eoRc","Nxx9VQbxXc",
+"KZamHjzUqR","GWqqXYw2oU","qQxHPo8Uyd","9GXkXHfyNQ","cQOnvAIYUu","jtn0XiB08l","mX2GEx3LDe","ix74rMGlTF","Oz8yZzz4ZU","Yf2EcguMb8",
+"lpF6WG1RhS","1LB1Lm4bxU","AOgEeiwzGk","brhlQs4786","M6qcGDQimp","CdyBVAgJHQ","e6e4zVNCPd","hSSvQ2Yz7E","0MR5XCxVEf","suY4xCfgr3",
+"4QMc97fsYM","NhXduFVMxo","UmaEvWaim6","OHaBzSs0Zu","kZANm0ao3l","4W0TlThjNn","Vprf2m4bxU","d7vjMokgRi","dmoS75Drn0","aDGtSS2Dfu",
+"ru4UGmz8gx","jS1ajiKqhr","K4GS8bgJAz","Y1mC0SmGzv","i7WMQt59lR","OxWIHTa8f6","m4bxU3weIF","LbRTH7hyVv","0KyfsMojnP","qQxHP5iGN5",
+"5nmWvCdyBV","BbwgAni2v1","FnPFB1v5hH","HP433Dz1R3","oVQp6guMb8","FGzgp8FmFH","IjTwPKsjRK","lXFOBFwEJz","QbxXcTwano","oVQp61j5L8",
+"QClRLB3qem","yluBxfqypy","y94nwUl4a1","gdQsS1LB1L","0Kyfs8TxD7","5Mg9rXflUq","m4bxUtl72W","oGu6xBpYhV","7Ow5CfFDrJ","FhtglFVMxo",
+"BbwgA29QAz","ZhwG1FPfSE","Z4I1vAXpwE","Vprf22ZHdk","l83UdfaHir","qQxHPzY1GY","EdBKcQ6hMC","TwanoJRJQB","RsQUqy94nw","RzaZAMezSW",
+"lCMxyfLNg8","faHirFNYIM","C2IrcKZamH","soy9tcL0aE","wDajXaL6AJ","X6PinjeskS","a00b5yEfy9","X6Pindjsrv","brhlQQWxoT","pT8wuv2eC3",
+"s4786mX2GE","QworuSmGzv","OUYuFUlU3M","0MR5XIRh48","1j5L8lj07Q","hYBCKv1Hln","xReecbgJAz","zY1GYyluBx","IBe8kn1pmO","i3pydaFFss",
+"gf8rIjiVBP","hi5X7hYBCK","kZANmWaim6","U3yw5QnJ1S","yvOMINcICA","m4bxUNhXdu","lCMxyZ4I1v","24ARFDG4sT","NhXduK4GS8","cmXIXFhtgl",
+"lpF6Wo8Uyd","0PktIAmdQd","zqH0WZuDtD","StlDJfLNg8","l83Uds93Ml","5drc6Rxrsm","LewvMSbRYy","okgRi3otm6","UmaEvRxrsm","M3zXLXflUq",
+"2hEEU0ao3l","3weIFQworu","QnJ1SzFgtB","YOfrYMojnP","AgJHQiB08l","VBjhzY1mC0","y94nwlj07Q","uN6r39XyT9","7lUXZqQxHP","lkMUAQ6hMC",
+"ru4UGzFgtB","tl72WyEfy9","uAWypReKEW","5Drn055rfB","FFDuiix74r","Y1mC05Drn0","oGu6xHlUbF","uPX7Gn8pJ9","MezSW0Wr5y","nFqikyluBx",
+"MmKGJNAFuw","yEfy9soy9t","jtn0XVNCPd","7X3uyzz4ZU","Waim65Namm","kB5nPkB5nP","BGaQY5iGN5","GrDg7M6qcG","xciqpDcpWB","pAhR1Dz1R3",
+"uZPqgBpYhV","nnP8owDajX","s47860PktI","GrDg77fsYM","FcWrWB3qem","HP433Y1mC0","he9IA8FmFH","Vprf2zmLYD","pWiOszY1GY","FcWrWEoToP",
+"0KyfsCxVEf","TXQ0Zi3pyd","pFrrlMojnP","GrDg7ThjNn","Z4I1v7ku1p","SjskQZJTXH","EoToPSs0Zu","soy9tYOfrY","MGlTFSWfou","s93MljfREu",
+"FjHXRlViBv","aFFssi3pyd","jtn0XaDGtS","QChxstl72W","5ZaEzRACuj","XflUqAXpwE","9rlg9pT8wu","GSQwjqaofN","b29RJAgJHQ","bgJAzjS1aj",
+"0PktI0MR5X","MGlTFFwEJz","Chuy3VBjhz","xReecQClRL","zY1GYlViBv","Cfgr3okgRi","ru4UGIRh48","WPmlxNOHsz","WMiS3Gv3Fq","NOHszjeskS",
+"bgJAzfLNg8","s7MxkjiVBP","EdBKc48cHL","dhSuH2ZHdk","pAhR1uvf7A","blLA9hYBCK","oGu6x0Kyfs","okgRiZUnqt","RkQkelj07Q","RpBQmZzJHW",
+"W7cTsuvf7A","W3VFHt59lR","K20wKZuDtD","gf8rIFjHXR","D6rBylm0pD","8TxD7RzaZA","IRh48ReKEW","euZA5Ta8f6","Chuy34QMc9","KsjRKPb1pa",
+"pmeCd0YAGH","0Wr5yS77LH","2NslmuZPqg","TCgPpFVMxo","HfyNQIRh48","yluBxNAFuw","FnPFBs4786","Ss0ZuOUqFM","aFFssuLtKs","XyPZNlpF6W",
+"fFDrJCNHmv","fcwDa8U2nU","tvdkDZUnqt","aFFssd85a9","M3zXL7fsYM","cL0aEEoToP","7ku1pLewvM","DG4sTLbRTH","MmKGJWreyP","U3yw5o8Uyd",
+"Yw2oU7hyVv","AgJHQ580YD","AOgEe6AFT0","5Mg9rEoToP","t98iWjSjS3","48cHLs7Mxk","FxX9qh1zcH","EOE1ol83Ud","Uvlv4tjQxs","Ss0Zu0BmCy",
+"yvOMIuLtKs","K4GS8gf8rI","IRh48okgRi","0Kyfs2Yz7E","8xEKzprNT6","kZANmWmadA","okgRiSbRYy","lCMxy0BmCy","AOgEenFqik","2Yz7EYOfrY",
+"24ARFlH1kt","IjTwPHP433","pv0i7Mkgy8","VerEASjskQ","e6e4zVBjhz","Oz8yZRxrsm","Cfgr3WmadA","GSQwjJ2mQi","OHaBza00b5","M3zXLBpYhV",
+"QChxsLDk6f","pmeCdDLhzM","aDGtSv1Hln","FnPFBUlU3M","jS1ajtlILt","bgJAzpv0i7","ksJbylweGy","J2mQi8U2nU","kB5nPaDGtS","gtCA5U3yw5",
+"MojnP0Wr5y","d7vjM8TxD7","Yw2oUv8yFN","tAOsrPYBf4","iqv4kydG8U","Q6LixYOfrY","K20wKRkQke","azIWpe6e4z","l83UdFhtgl","BFkb8HzZT8",
+"WMiS3yofH3","Q6Lixxciqp","x3LDepvgjS","0BmCyAmdQd","Yh1hFFPfSE","9eoRcxXTI4","aDGtSRkQke","6AFT0oVQp6","iKqhrSs0Zu","Pb1paCqqaD",
+"pvgjSFxX9q","JXljWuQIcz","qaofNF6PT2","suY4xlweGy","OxWIHjfREu","pWiOsEdBKc","2NslmNo0Qb","xReechYBCK","ix74rUlU3M","zHF1qGWqqX",
+"G1RhSVprf2","55rfB9y4lw","LbRTHUl4a1","9iGoTix74r","XyPZNY1mC0","lViBvpmeCd","DcpWBwiHrZ","ReKEW5ZaEz","8cVD3AOgEe","No0QbiB08l",
+"FxX9q9iGoT","rKDLJ5IhmG","QYxC0xReec","xXTI4EoToP","NOHszUmaEv","t98iWfLNg8","U3yw5NOHsz","uvf7AydG8U","pAhR1Mkgy8","RzaZACIShG",
+"m4bxUpFrrl","RzaZAKZamH","Ul4a1mz8gx","Q6hMCWmadA","WMiS3ECMvU","rhl0Julk41","MmKGJYOfrY","HRxd8D6rBy","lViBvFPfSE","oQ87rQWxoT",
+"a00b5dpe1v","hSSvQAXpwE","KsjRKdmoS7","hUTw7HRxd8","zFgtBNOHsz","uZPqgBFkb8","FwEJzmX2GE","zqH0WRsQUq","9GXkXVjCZq","FGzgp64s8N",
+"Waim6G1RhS","zHF1qtaOXK","5iGN5zFgtB","yToGWh1zcH","8TxD7bgJAz","mz8gx8cVD3","AmdQd2TRI7","JJs5msx5Gl","kZANmbgJAz","9eoRcW7cTs",
+"F6PT2MK07Y","yofH3MezSW","aDGtSxReec","JJs5mnlaBy","vLsmShYBCK","0KyfsZUnqt","8FmFH16lHc","jtn0XVjCZq","FxX9q9GXkX","5iGN5dQ586",
+"s93MlqUJMd","EoToP55rfB","2DREsEoToP","4QMc9U3yw5","CqqaDHlUbF","lH1ktVBjhz","FPfSEChuy3","zFgtBQYxC0","Zv7z0MojnP","4dEz6hi5X7",
+"J2mQisuY4x","7fsYMFnPFB","3weIFWaWsv","JKWYRUlU3M","9iGoTZzJHW","9iGoTM6qcG","uvf7ALbRTH","Uvlv49iGoT","cL0aE7fKYU","QChxs1LB1L",
+"tuDySZuDtD","iwzGkuN6r3","5NammUlU3M","5Mg9r618Di","prNT624ARF","BFkb80PktI","s7MxkfmIK1","RBhp0KZamH","WDVWJlsQGo","m4bxUECMvU",
+"Ul4a1pv0i7","azIWp7Ow5C","0PktIOHaBz","TXQ0ZtjQxs","JRJQByluBx","wDajXs93Ml","JkzUnyvOMI","a00b5qQxHP","QClRLkZANm","LDk6fGv3Fq",
+"hUTw7TCgPp","FGzgpGv3Fq","HRxd87fKYU","djsrv4W0Tl","ydG8U7Ow5C","TXQ0ZtaOXK","ZUnqtVjCZq","MK07YuN6r3","s93Mlsx5Gl","ni2v1Pb1pa",
+"UmaEv8RCUA","Pb1paRkQke","TCgPpHfyNQ","NAFuwuAWyp","dQ5865ZaEz","RpBQmTa8f6","pAhR1EOE1o","EdBKcVIlwP","s93MlUvlv4","55rfBB3qem",
+"i3pyd5Mg9r","dpe1vzY1GY","QClRL5VZjS","G1RhSmX2GE","UmaEvvOqCE","s93MleuZA5","Dz1R3nnP8o","2DREsAIYUu","SWfouo8Uyd","iB08lbZLvS",
+"0ao3l0ao3l","ydG8UZv7z0","NOHsztAOsr","POUYSxciqp","RzaZA07n1c","7lUXZBbwgA","yvOMIv1Hln","ZuDtDyvOMI","LDk6fIjTwP","W3VFH5iGN5",
+"kZANmpAhR1","lpF6W7X3uy","RxrsmFVMxo","QnJ1SjiVBP","JkzUnU3yw5","7X3uyzqH0W","MGlTFDG4sT","IBe8kRmDcr","FwEJzVNCPd","IjTwPxciqp",
+"fcwDaNxx9V","CdyBVWMiS3","0h1b12hEEU","9iGoT7X3uy","G1RhSMGlTF","5Mg9r5iGN5","No0Qb5VZjS","618DipvgjS","EOE1o9XyT9","RzaZAJJs5m",
+"9y4lwyEfy9","i3pydpWiOs","B3qemiwzGk","qaofNVLTy6","AgJHQprNT6","580YDQbxXc","aez9yjzUqR","Ss0ZuVerEA","yofH3HlUbF","hUTw7xXTI4",
+"SWfouC2Irc","zFgtBBpYhV","Y1mC09GXkX","iqv4klsQGo","AmdQdbgJAz","tl72WWmadA","FjHXRa00b5","48cHLZzJHW","AgJHQHlUbF","F6PT2d7vjM",
+"4dEz6aDGtS","K4GS8jeskS","9eoRcHP433","45cIHYf2Ec","IBe8kUvlv4","lViBvgtCA5","8RCUARmDcr","jiVBPpAhR1","X6PinjzUqR","tjQxspv0i7",
+"IjTwPkB5nP","4QMc9pFrrl","dmoS7Yh1hF","rhl0Jd85a9","K20wKcL0aE","S2DfuM3zXL","lViBv618Di","WMiS37ku1p","RACujfaHir","JKWYRcmXIX",
+"HlUbF7hyVv","9y4lwulk41","0PktIECMvU","1j5L8W7cTs","ZuDtDECMvU","FLsphRzaZA","K4GS8AmdQd","BFkb8Ul4a1","S77LHb29RJ","Cp3mZs4786",
+"FjHXRxciqp","BbwgAWDVWJ","cShY21j5L8","RBhp0pT8wu","sqVrfRBhp0","Vprf2uQIcz","xReecQssNC","07n1cRACuj","7fKYU0ao3l","In3NSEOE1o",
+"pT8wuo8Uyd","hUTw7YjB9t","UlU3McShY2","CK5W7djsrv","Dz1R3BpYhV","n8pJ948cHL","QworuSbRYy","AOgEeQworu","suY4x5VZjS","GSQwjhUTw7",
+"guMb8VLTy6","BbwgA4W0Tl","OUqFMFxX9q","sx5GlbgJAz","4dEz6kB5nP","ix74rtuDyS","dQ5862ZHdk","tl72WgIYvE","IBe8kAIYUu","ni2v1YjB9t",
+"zz4ZUECMvU","OHaBzjfREu","blLA9SbRYy","Mkgy8GSQwj","oVQp6uLtKs","vLsmSaFFss","Z4I1v7Ow5C","uAWyp7hyVv","yofH3FnPFB","2NslmRkQke",
+"Ss0ZuChuy3","07n1cYw2oU","L7cGcFnPFB","Z4I1vWaim6","StlDJtAOsr","5iGN5WreyP","DQimp9GXkX","JKWYRMaJQs","t59lRkB5nP","aL6AJMezSW",
+"ru4UGNOHsz","hSSvQt59lR","WMiS3uZPqg","ogLgclpF6W","W3VFHyToGW","U3yw5gjUTu","DLhzMSWfou","aDGtS7ku1p","SjskQMGlTF","IBe8kzz4ZU",
+"jtn0Xsoy9t","2Nslm7ku1p","RxrsmVNCPd","29QAzMmKGJ","zHF1qwiHrZ","IRh48t59lR","OHaBzgjUTu","suY4xFFDui","NOHszv1Hln","djsrvqQxHP",
+"gf8rIMmsIo","v2eC37X3uy","v2eC3jS1aj","Rxrsm8RCUA","gIYvERBhp0","s7Mxk5Mg9r","pAhR1hSSvQ","HP4338xEKz","07n1c7fsYM","cQOnvbrhlQ",
+"piJSkBCxeC","uupzkFjHXR","oGu6xOz8yZ","lsQGohE1Ql","9XyT9jiVBP","5IhmGIRh48","FGzgpuN6r3","NAFuwQnJ1S","MojnP64s8N","oQ87rmz8gx",
+"OHaBzOxWIH","lsQGoFPfSE","DG4sTt59lR","JIqXihSSvQ","0YAGHZv7z0","lj07QQ6Lix","zHF1qhUTw7","9rlg92hEEU","ZhwG17fsYM","djsrvnnP8o",
+"uPX7GyToGW","OHaBzqUJMd","uQIczprNT6","pmeCdjSjS3","yluBx7X3uy","sx5GlMkgy8","LDk6fydG8U","YOfrYNo0Qb","FxX9qC2Irc","FcWrWFVMxo",
+"Nxx9VaL6AJ","k85AeSWfou","2ZHdkjfREu","AIYUupWiOs","pv0i77fsYM","C2Irc2Nslm","FcWrWMaJQs","K20wKtAOsr","In3NSn8pJ9","OUYuFyToGW",
+"5drc67lUXZ","Ss0Zu8RCUA","soy9tHRxd8","brhlQvkCHH","FFDuis93Ml","yEfy9iKqhr","atef2fcJOy","CxVEf5drc6","FcWrWRsQUq","5ZaEzfLNg8",
+"he9IAa00b5","m4bxUWMiS3","ECMvUAXpwE","azIWpJ2mQi","AXpwEjeskS","ThjNnmz8gx","5Mg9rC2Irc","5Mg9rgjUTu","5IhmGQ6Lix","hSSvQRACuj",
+"8U2nUvLsmS","azIWpCIShG","8RCUAyluBx","1j5L8Dz1R3","ksJbyKZamH","DQimpRpBQm","OxWIHVIlwP","fcwDaCdyBV","RsQUqx3LDe","uJScXfcJOy",
+"xReec9iGoT","AgJHQjzUqR","Yh1hF5Drn0","K4GS8uupzk","aL6AJlpF6W","fmIK17Ow5C","Gv3FqBCxeC","oGu6xMezSW","atef2I7p2a","yofH3brhlQ",
+"lH1ktLDk6f","EoToPM3zXL","rKDLJ0Wr5y","BpYhVS77LH","JKWYRNcICA","blLA9K4GS8","dQ586S77LH","5NammL7cGc","prNT6xciqp","CxVEf4dEz6",
+"DG4sT0h1b1","ZzJHWfaHir","nlaBylH1kt","yluBx9y4lw","v2eC3WmadA","tvdkDYf2Ec","B3qemrz7Ut","JkzUnFFDui","ix74r3weIF","RsQUqMm8si",
+"jtn0XMojnP","1v5hHeuZA5","fLNg8y94nw","jS1ajNOHsz","4dEz6K20wK","8U2nUY1mC0","TCgPpRACuj","yEfy9dhSuH","WreyPZzJHW","zHF1qM6qcG",
+"rKDLJ6AFT0","x3LDegf8rI","tuDyS618Di","S77LHMkgy8","kB5nPksJby","VjCZqhSSvQ","xciqpdjsrv","In3NSpWiOs","16lHcQYxC0","29QAzMm8si",
+"t98iWtAOsr","yluBxMaJQs","5drc6StlDJ","7Ow5CFVMxo","IBe8kpvgjS","GSQwjtl72W","cShY2IjTwP","FVMxoPYBf4","POUYSQworu","RpBQmuvf7A",
+"iB08lvkCHH","tl72WtuDyS","QssNCMkgy8","uJScXNxx9V","fmIK1m4bxU","cL0aENxx9V","IjTwPVjCZq","sqVrfRsQUq","hE1Qli7WMQ","FwEJz24ARF",
+"UlU3MUmaEv","8U2nUdjsrv","No0QbCqqaD","dpe1v0Wr5y","PYBf4Q6Lix","7fsYMguMb8","0BmCyZv7z0","s7MxkVLTy6","Ul4a1QClRL","7lUXZm4bxU",
+"ZhwG1b29RJ","8hJdtzbIYY","gtCA58cVD3","MmsIov2eC3","16lHca00b5","Q6LixCNHmv","WaWsvPYBf4","zFgtBtlILt","ogLgcCxVEf","K4GS83otm6",
+"uAWypCp3mZ","brhlQrKDLJ","jSjS3tlILt","FcWrWCK5W7","soy9tix74r","gf8rIzqH0W","qUJMdyluBx","JJs5mJKWYR","pAhR19y4lw","MezSWuAWyp",
+"5NammThjNn","FGzgpQnJ1S","9y4lwQssNC","AIYUuUmaEv","ix74rgdQsS","XflUqDG4sT","n1pmO2TRI7","s4786ThjNn","pAhR15drc6","gtCA50Wr5y",
+"FjHXRcL0aE","oQ87r4dEz6","hi5X7d7vjM","s93MlbrhlQ","rz7UtzQt6Q","BpYhVPYBf4","ni2v1DQimp","JXljWyofH3","uupzkfqypy","t59lRZuDtD",
+"VLTy6ZhwG1","wDajX618Di","pv0i7LewvM","aFFssJkzUn","WDVWJYw2oU","lweGy580YD","Chuy3WDVWJ","wDajXUmaEv","SmGzvGSQwj","Gv3FqkZANm",
+"Ta8f6Yw2oU","XflUqqQxHP","uPX7G0MR5X","29QAz9rlg9","U3yw5Yf2Ec","FGzgpt98iW","CqqaDuPX7G","6q6L9lkMUA","prNT68xEKz","7ku1pEOE1o",
+"fLNg8K4GS8","J2mQiCp3mZ","xciqpi3pyd","7fKYURACuj","DG4sTSbRYy","tuDySlH1kt","lsQGoWreyP","16lHcprNT6","618DiguMb8","lpF6We6e4z",
+"2TRI7suY4x","SmGzvaDGtS","piJSkJXljW","8TxD7QChxs","5iGN54W0Tl","zbIYYvOqCE","P6bcgoGu6x","pv0i7qaofN","RACujOUYuF","8FmFHlH1kt",
+"Yw2oUjfREu","zmLYDRBhp0","9GXkXtlILt","uQIczuJScX","HzZT8jeskS","J2mQiLDk6f","ciuWzOz8yZ","bZLvSTCgPp","QWxoTpvgjS","8cVD3nnP8o",
+"XflUqrKDLJ","B3qempmeCd","7lUXZjiVBP","blLA9lXFOB","3otm68xEKz","tAOsrciuWz","Mm8si8xEKz","JJs5m5iGN5","i7WMQJJs5m","PYBf4AkKTk",
+"Fhtgls93Ml","tAOsreuZA5","oGu6xqUJMd","5VZjSnnP8o","uupzkcQOnv","2hEEUl83Ud","euZA5WDVWJ","4W0TlL7cGc","HP433hi5X7","jeskSNcICA",
+"t98iWAmdQd","0ao3l7Ow5C","Cp3mZSbRYy","jfREui3pyd","MmsIoMmsIo","BCxeClpF6W","blLA98xEKz","JkzUn6AFT0","uPX7GCqqaD","RACujW7cTs",
+"vLsmSW3VFH","dQ586l83Ud","FVMxokB5nP","XyPZNZhwG1","brhlQcL0aE","RzaZAs93Ml","jeskS45cIH","Yf2EcaFFss","nnP8oe6e4z","F6PT2pAhR1",
+"Pb1pakZANm","WmadAuupzk","DLhzMv8yFN","aFFsssoy9t","s7Mxk2Nslm","AmdQdYh1hF","CdyBVd7vjM","i3pydGSQwj","aDGtSkZANm","6AFT0W3VFH",
+"9XyT98xEKz","XflUq4dEz6","BFkb8uvf7A","QWxoTIKxdL","EdBKcQbxXc","x3LDeAIYUu","hi5X7FVMxo","WMiS3he9IA","Mkgy8wDajX","lXFOBReKEW",
+"L7cGclweGy","C2IrcRxrsm","7X3uyThjNn","No0QbIn3NS","lpF6Waez9y","s4786v2eC3","MGlTFpv0i7","BGaQYTXQ0Z","tlILtS2Dfu","mX2GEQ6Lix",
+"hSSvQpmeCd","FLsphbgJAz","aL6AJfqypy","jtn0Xx3LDe","5Mg9r1LB1L","tlILt3otm6","t98iWn8pJ9","Oz8yZS2Dfu","hYBCK29QAz","YjB9tm4bxU",
+"lweGyuupzk","EoToPuPX7G","VIlwPTwano","6q6L9uZPqg","zFgtBRpBQm","5Mg9rW7cTs","RzaZAAgJHQ","AgJHQGSQwj","qUJMdoVQp6","lkMUAlViBv",
+"RBhp0HRxd8","FGzgpSs0Zu","djsrvix74r","wiHrZdjsrv","aez9y1LB1L","2NslmxXTI4","M6qcGvOqCE","Z4I1vNAFuw","lm0pDMojnP","xXTI41LB1L",
+"Oz8yZd85a9","5IhmGEdBKc","QbxXcFPfSE","5NammLbRTH","v1HlnGWqqX","2TRI7lj07Q","v1HlnVprf2","1LB1L9GXkX","8U2nU9eoRc","KZamHJIqXi",
+"iwzGk8cVD3","qUJMdIBe8k","dpe1vbZLvS","6q6L9Qworu","QWxoT7ku1p","pv0i7atef2","taOXK0BmCy","ZzJHW29QAz","taOXKaez9y","hYBCKJXljW",
+"xciqpWaWsv","JKWYR9iGoT","v2eC3AgJHQ","FVMxolm0pD","iwzGkVIlwP","AgJHQsoy9t","DQimpkZANm","YjB9tn1pmO","LewvMvOqCE","LbRTHk85Ae",
+"FxX9qG1RhS","KsjRKfmIK1","5VZjS7hyVv","ciuWzlsQGo","jfREum4bxU","KZamH14FLR","jzUqR2hEEU","RmDcrFFDui","zqH0WZUnqt","VNCPdJKWYR",
+"HfyNQ5drc6","DQimpAOgEe","v2eC3OUqFM","B3qemJIqXi","uLtKsiqv4k","NcICAi7WMQ","M3zXL7hyVv","m4bxUuZPqg","vOqCElsQGo","48cHLiqv4k",
+"fFDrJNcICA","vOqCEJ2mQi","s7MxkPb1pa","In3NSFLsph","fFDrJmz8gx","fmIK1jS1aj","lkMUAGSQwj","wDajXRkQke","zz4ZUazIWp","MGlTFQworu",
+"SjskQd7vjM","DcpWBBpYhV","azIWpmX2GE","MGlTFnnP8o","FGzgpK4GS8","uvf7ANcICA","O3iyQ9GXkX","7hyVvd85a9","J2mQi2hEEU","MojnPKASQ8",
+"4QMc90YAGH","Cfgr36AFT0","jS1ajQWxoT","O3iyQqUJMd","aez9yWaWsv","lsQGoRsQUq","ru4UGFnPFB","ThjNnMojnP","cmXIXAXpwE","lweGy2Nslm",
+"JKWYRjiVBP","jiVBPnlaBy","FFDuiwiHrZ","FVMxoFNYIM","PYBf4GXdoH","UmaEv48cHL","HzZT8Dz1R3","hYBCKWaWsv","h1zcHcQOnv","QnJ1SJKWYR",
+"aL6AJt59lR","DG4sTWDVWJ","soy9tHzZT8","IjTwP5Drn0","faHirIn3NS","QChxsd85a9","5Mg9rcShY2","LDk6fRBhp0","F6PT23otm6","m4bxUQworu",
+"WDVWJAXpwE","jeskSBCxeC","bZLvSRkQke","WDVWJmz8gx","QYxC07lUXZ","M3zXLG1RhS","IKxdLG1RhS","pWiOsW7cTs","bgJAzksJby","Yf2Ec6q6L9",
+"7Ow5CKsjRK","m4bxU9XyT9","hSSvQ6AFT0","4dEz6StlDJ","pT8wuRpBQm","Yf2EcPYBf4","ZzJHWqQxHP","RBhp0ZUnqt","2ZHdkCK5W7","qUJMdaez9y",
+"5NammcL0aE","No0QbfcJOy","618DitAOsr","4QMc98cVD3","s4786sx5Gl","Gv3FqReKEW","sx5GlaL6AJ","uLtKsTwano","zY1GYYh1hF","blLA9gdQsS",
+"Ta8f6MmKGJ","Z4I1v7hyVv","xReeckZANm","Q6LixZzJHW","pv0i7yvOMI","5nmWvhSSvQ","v1HlnkB5nP","QYxC0VBjhz","Dz1R3Yf2Ec","FxX9qUl4a1",
+"JIqXi55rfB","lweGy1LB1L","U3yw5lpF6W","XflUqZ4I1v","tl72WMaJQs","uPX7G5Drn0","24ARFs93Ml","ogLgc7fKYU","guMb8DQimp","EoToPogLgc",
+"C2IrcRBhp0","ogLgcFwEJz","G1RhSUlU3M","cmXIXEoToP","IKxdLv2eC3","MGlTFfmIK1","AgJHQhYBCK","uAWypZzJHW","aL6AJFjHXR","Kr8ysOUYuF",
+"MezSWokgRi","vkCHHbrhlQ","3otm6cQOnv","Yw2oUwiHrZ","RzaZAzmLYD","aFFssQbxXc","dmoS748cHL","fLNg8TXQ0Z","RpBQmoGu6x","QworugtCA5",
+"No0Qbhe9IA","yvOMI7Ow5C","Yw2oUydG8U","EOE1o7X3uy","l83UduQIcz","RzaZAl83Ud","zFgtB2ZHdk","FhtgllH1kt","zqH0WXflUq","In3NSjSjS3",
+"d85a9Y1mC0","5NammGv3Fq","cQOnvLDk6f","2NslmogLgc","tjQxsqUJMd","3otm68FmFH","vOqCEWaim6","4QMc92Yz7E","5Drn00BmCy","5iGN5EOE1o",
+"zbIYY4dEz6","bZLvSUvlv4","D6rByv8yFN","cL0aE0h1b1","G1RhStvdkD","NAFuwdjsrv","uTacxbgJAz","uZPqgdmoS7","d85a9WMiS3","5iGN5UlU3M",
+"iqv4kTa8f6","OUqFMulk41","5nmWvEdBKc","BGaQYs7Mxk","pv0i7m4bxU","gtCA5lkMUA","hSSvQ8TxD7","MmsIoZv7z0","TCgPpB3qem","aL6AJF6PT2",
+"jeskSuTacx","soy9tU3yw5","MK07YkB5nP","In3NS7fsYM","Ul4a1Ta8f6","taOXKZzJHW","BbwgAMK07Y","okgRizY1GY","FLsphZuDtD","0Kyfsa00b5",
+"1v5hHlCMxy","brhlQ0Wr5y","MmKGJ8cVD3","GWqqXdjsrv","fFDrJFjHXR","qUJMdReKEW","fqypy0YAGH","d85a9BGaQY","Pb1palkMUA","C2IrcQworu",
+"i7WMQW3VFH","tvdkDogLgc","8RCUAvkCHH","MK07YgdQsS","zY1GYQ6Lix","QssNCGSQwj","t98iWDG4sT","Cfgr3n8pJ9","1LB1LGv3Fq","i7WMQpvgjS",
+"hYBCK7fKYU","SmGzvd85a9","IjTwPBCxeC","wiHrZBpYhV","0Wr5ylm0pD","he9IAXyPZN","pAhR18U2nU","QnJ1S1j5L8","oVQp6YOfrY","FFDui4QMc9",
+"Mkgy87fKYU","iKqhr7hyVv","XyPZNpFrrl","EOE1o2hEEU","b29RJ8RCUA","QworuMm8si","No0QbXflUq","RmDcrYOfrY","CIShGRzaZA","gtCA5tvdkD",
+"n1pmOQ6Lix","uLtKs24ARF","nlaByzQt6Q","1v5hHaDGtS","FjHXR8FmFH","2hEEU8RCUA","ReKEWpFrrl","WDVWJ48cHL","5VZjSQbxXc","jS1ajCIShG",
+"guMb8GWqqX","rKDLJ2Yz7E","t59lRzqH0W","jfREucQOnv","FGzgps4786","WMiS3HfyNQ","yluBxguMb8","6AFT029QAz","CK5W7ru4UG","55rfBC2Irc",
+"k85Aegf8rI","VLTy6zQt6Q","LewvMaez9y","FPfSEzqH0W","GrDg7aez9y","t98iWh1zcH","VjCZqtuDyS","hi5X7LewvM","uQIczvkCHH","yluBxqaofN",
+"4dEz6RACuj","lViBvStlDJ","2Yz7ECIShG","5drc6jzUqR","M3zXLlViBv","m4bxUI7p2a","uZPqgQYxC0","BpYhVDcpWB","EoToP5VZjS","dhSuHAXpwE",
+"UmaEvguMb8","ogLgc8RCUA","FLsphpT8wu","5drc69eoRc","POUYS5drc6","uTacxt59lR","ZUnqtm4bxU","t98iWyofH3","zQt6Qm4bxU","guMb8CqqaD",
+"jfREu5iGN5","i3pydpT8wu","S77LH9iGoT","BbwgAJKWYR","C2IrctjQxs","nlaByQ6hMC","xciqpwDajX","uvf7A6q6L9","zbIYYv2eC3","VerEAFxX9q",
+"lpF6WBbwgA","M6qcGCxVEf","sx5GlCNHmv","lsQGoazIWp","5IhmGzFgtB","lsQGojtn0X","qQxHPZUnqt","pFrrlh1zcH","Y1mC0ZuDtD","tAOsrNcICA",
+"gdQsSXyPZN","O3iyQpAhR1","gf8rI618Di","RBhp0iwzGk","euZA50ao3l","MmsIo0YAGH","jzUqRtuDyS","SmGzvZJTXH","lXFOB9eoRc","yluBxjfREu",
+"Q6Lix5Namm","MmsIoxciqp","tvdkDuZPqg","RBhp0yluBx","l83Ud2ZHdk","8RCUAWMiS3","k85AeJkzUn","FxX9qCK5W7","MmKGJYw2oU","SbRYyM6qcG",
+"FxX9qOUqFM","DcpWB1LB1L","K20wKuZPqg","a00b5Ta8f6","guMb8uLtKs","fFDrJaL6AJ","VLTy6lXFOB","ReKEWb29RJ","Chuy3VNCPd","dhSuHyToGW",
+"U3yw5lXFOB","JkzUntaOXK","7fsYM0h1b1","taOXKpmeCd","uvf7A2hEEU","ZJTXHbZLvS","J2mQimX2GE","HP433Kr8ys","gIYvEMojnP","fmIK1wDajX",
+"MmKGJStlDJ","K4GS8LDk6f","zz4ZUMmsIo","45cIHJRJQB","pWiOs3weIF","TwanoJ2mQi","07n1cMezSW","CdyBVn8pJ9","8RCUA7ku1p","zY1GYlkMUA",
+"hE1QllkMUA","CdyBV580YD","zmLYDCNHmv","tlILt5nmWv","AkKTkFjHXR","hE1QlDG4sT","RxrsmWaWsv","2hEEUCfgr3","WPmlxyToGW","mz8gxIn3NS",
+"I7p2aWmadA","oVQp6uTacx","NOHsztlILt","tlILtRmDcr","BbwgAoQ87r","POUYScL0aE","ix74r9eoRc","U3yw5pAhR1","aDGtSix74r","suY4xDcpWB",
+"EoToPciuWz","yEfy9l83Ud","64s8NyvOMI","Nxx9VGXdoH","yToGWhYBCK","W7cTsoGu6x","fqypyQWxoT","U3yw5aDGtS","7ku1puLtKs","QChxss93Ml",
+"pmeCdfqypy","Yw2oUFVMxo","ydG8UuTacx","8xEKzm4bxU","DcpWBm4bxU","QssNCZzJHW","djsrvpv0i7","l83Ud4dEz6","he9IAiB08l","Zv7z0FwEJz",
+"1LB1L0MR5X","nlaBy7X3uy","SbRYyFjHXR","ix74rs93Ml","C2IrcEdBKc","VIlwPZv7z0","GrDg7tlILt","SWfouuN6r3","9iGoTpWiOs","LDk6feuZA5",
+"BbwgA24ARF","okgRiWaim6","2ZHdkBGaQY","VerEABFkb8","FLsphZhwG1","2Yz7EWPmlx","gdQsSJkzUn","ogLgcIn3NS","2hEEU6AFT0","uoStwpvgjS",
+"oGu6xsoy9t","lsQGoIjTwP","jS1ajaDGtS","vkCHHWaWsv","29QAzpiJSk","tAOsruAWyp","In3NSFxX9q","d85a9AOgEe","Q6LixwiHrZ","2hEEUD6rBy",
+"No0QbGWqqX","okgRiB3qem","Vprf2y94nw","fqypyCxVEf","JkzUnMezSW","NcICAiqv4k","lsQGolweGy","MojnP7ku1p","QYxC00PktI","7fsYMDLhzM",
+"JIqXi580YD","45cIHyEfy9","aL6AJBFkb8","U3yw5EdBKc","dpe1v9y4lw","fcwDay94nw","ZJTXHLbRTH","zQt6QAOgEe","ZhwG1ECMvU","D6rByMmKGJ",
+"NAFuwM3zXL","hE1Ql1v5hH","K4GS8tjQxs","tAOsrWDVWJ","Uvlv4Rxrsm","tvdkDOxWIH","OUqFMokgRi","guMb88xEKz","atef2EdBKc","aL6AJTa8f6",
+"t59lRJkzUn","pv0i76AFT0","2Yz7EpFrrl","MmKGJhi5X7","FcWrWaL6AJ","fFDrJ2hEEU","o8UydIjTwP","FNYIMjfREu","AgJHQS2Dfu","G1RhSYjB9t",
+"djsrvUlU3M","uN6r3AkKTk","oGu6x29QAz","zmLYDsoy9t","uAWyppvgjS","SbRYyh1zcH","uQIczhe9IA","In3NSuZPqg","29QAz7ku1p","guMb86q6L9",
+"iqv4kaDGtS","UmaEvGXdoH","0h1b1NhXdu","BpYhV7Ow5C","b29RJQworu","ZUnqtiwzGk","piJSkhe9IA","BCxeCRkQke","sx5GlRxrsm","Yf2EcVNCPd",
+"rKDLJfFDrJ","P6bcguJScX","lweGyjiVBP","IKxdLmX2GE","BCxeCh1zcH","5drc6pWiOs","t98iW2DREs","aL6AJ5Mg9r","xReecuQIcz","wiHrZlH1kt",
+"NOHszJJs5m","lH1ktOUYuF","5drc6tvdkD","b29RJG1RhS","SjskQOUYuF","JJs5mGWqqX","K4GS8RsQUq","5VZjSBGaQY","KsjRKm4bxU","ogLgcPb1pa",
+"G1RhSjiVBP","29QAzsoy9t","8xEKz6q6L9","KZamHGXdoH","l83UdFFDui","FFDuilj07Q","KsjRKaFFss","XflUqZUnqt","mX2GEb29RJ","ReKEWuoStw",
+"DcpWBAXpwE","WaWsvOUYuF","nlaByaFFss","lViBvsqVrf","Yw2oUgf8rI","lViBvjSjS3","KsjRKS2Dfu","QssNCFVMxo","mX2GEfFDrJ","MK07Y16lHc",
+"aFFssVIlwP","iB08lAkKTk","iKqhrGXdoH","jiVBP7Ow5C","pT8wuMaJQs","tvdkDx3LDe","m4bxUuTacx","NAFuwuZPqg","EOE1oF6PT2","prNT6dhSuH",
+"nFqikWMiS3","hSSvQAkKTk","Nxx9V7lUXZ","vLsmSM3zXL","HlUbFxReec","Yf2EcFnPFB","7hyVvvOqCE","l83UduoStw","C2IrciKqhr","l83Ud8FmFH",
+"9XyT9t59lR","F6PT2qUJMd","tjQxso8Uyd","C2IrcChuy3","OxWIHDz1R3","h1zcHpmeCd","8FmFH5Drn0","tAOsraDGtS","bZLvSMGlTF","VLTy6DQimp",
+"StlDJ8xEKz","C2Irculk41","0MR5X7hyVv","4dEz6ZUnqt","soy9t7X3uy","d7vjMlXFOB","1v5hH4W0Tl","zFgtBuLtKs","jzUqR5Drn0","fFDrJRBhp0",
+"yluBx29QAz","0YAGHXflUq","8FmFHlm0pD","Chuy3iKqhr","HRxd8BGaQY","uQIczlViBv","lm0pDmX2GE","SjskQGv3Fq","RzaZAP6bcg","M3zXL16lHc",
+"ulk417ku1p","TXQ0ZQWxoT","8RCUAS77LH","HzZT8azIWp","8TxD71j5L8","Vprf2x3LDe","7fsYMCqqaD","ogLgcRxrsm","AXpwEk85Ae","S77LHQYxC0",
+"cL0aEazIWp","QworuzbIYY","wiHrZaL6AJ","he9IAlCMxy","yToGW1v5hH","Yh1hFVNCPd","FhtgluZPqg","k85AeGSQwj","aFFssZUnqt","7fsYMuN6r3",
+"uLtKs7Ow5C","QworuRpBQm","FNYIMDcpWB","MGlTFkZANm","tjQxszHF1q","d85a9Ul4a1","kB5nPpv0i7","P6bcgWPmlx","ru4UGDG4sT","tlILtmz8gx",
+"OUYuFpvgjS","blLA9S77LH","zY1GYAkKTk","Vprf2yEfy9","pmeCdM3zXL","oQ87rbrhlQ","wiHrZ64s8N","jiVBPQnJ1S","cQOnvJkzUn","KsjRKHP433",
+"AgJHQFxX9q","XyPZN9GXkX","6q6L92DREs","jiVBPOUYuF","I7p2aC2Irc","CxVEf2TRI7","JKWYRSbRYy","t59lRJXljW","NOHszfcJOy","3weIFyToGW",
+"7Ow5CuLtKs","m4bxUZ4I1v","ksJbynnP8o","SjskQGWqqX","PYBf4iqv4k","9eoRcv1Hln","JJs5m5Mg9r","uJScXkB5nP","5IhmG16lHc","P6bcgmX2GE",
+"2hEEU0Wr5y","b29RJuTacx","POUYSGSQwj","uupzkQnJ1S","i3pydgjUTu","tlILt0BmCy","lsQGoMkgy8","OxWIH5IhmG","ciuWzYf2Ec","zz4ZUNhXdu",
+"Ul4a19eoRc","ZUnqtEoToP","ZUnqt8U2nU","9y4lwuupzk","StlDJCIShG","bgJAzlpF6W","2NslmM3zXL","y94nwLewvM","WreyPSs0Zu","RBhp0aDGtS",
+"d7vjMl83Ud","9y4lwiB08l","xciqpuupzk","ru4UGWMiS3","gjUTu9y4lw","zY1GYBGaQY","9y4lwLbRTH","NAFuw1j5L8","S77LH3weIF","aDGtSiqv4k",
+"b29RJlCMxy","AgJHQt59lR","Chuy3fFDrJ","29QAzPOUYS","uQIczC2Irc","qQxHPiB08l","MGlTF8FmFH","WreyPe6e4z","uTacxru4UG","aL6AJYjB9t",
+"bZLvSWaim6","KsjRKM3zXL","W7cTsMm8si","GXdoHt98iW","5Drn02ZHdk","MezSWIjTwP","IjTwPiwzGk","jS1ajKr8ys","IBe8kSbRYy","KsjRKBpYhV",
+"ZhwG12ZHdk","EOE1o7fKYU","1v5hHbZLvS","FhtglVjCZq","7lUXZUl4a1","o8UydK20wK","kB5nPK20wK","SmGzvbZLvS","dQ586SjskQ","SmGzvVBjhz",
+"ZhwG17lUXZ","sx5GluTacx","d7vjMFVMxo","sx5Gluvf7A","CK5W7jzUqR","tAOsrzY1GY","FNYIMs4786","8hJdtogLgc","W3VFHJIqXi","v8yFN9XyT9",
+"7Ow5CM3zXL","qQxHPwiHrZ","RBhp0BCxeC","FGzgpIn3NS","BbwgAlweGy","sx5GlguMb8","SjskQuAWyp","W7cTssuY4x","L7cGcJXljW","JXljWSbRYy",
+"a00b55iGN5","OHaBzX6Pin","BpYhViB08l","RmDcrqQxHP","WDVWJbZLvS","5VZjSHRxd8","KZamHEdBKc","zbIYYFxX9q","ru4UG6q6L9","yToGWI7p2a",
+"MaJQsQWxoT","K4GS89rlg9","IRh48GWqqX","FGzgpiB08l","QClRLcL0aE","hUTw7MmsIo","RmDcrJKWYR","HfyNQhYBCK","tl72W0h1b1","uN6r3HzZT8",
+"WPmlxNcICA","0Wr5yxXTI4","8hJdtFwEJz","U3yw58U2nU","jeskSIBe8k","uAWyppAhR1","2hEEU0MR5X","cShY2yEfy9","pv0i7Ss0Zu","pAhR1oGu6x",
+"QYxC0BFkb8","UmaEvQYxC0","ZzJHW4W0Tl","580YDAIYUu","2DREsKsjRK","0h1b1wDajX","FcWrWfLNg8","7lUXZKASQ8","AkKTkFhtgl","t98iWPOUYS",
+"7X3uycmXIX","HfyNQ0YAGH","MaJQsiB08l","uJScXVIlwP","azIWpzFgtB","PYBf4pFrrl","qUJMd5nmWv","XflUqgjUTu","QYxC0y94nw","uAWypkB5nP",
+"7X3uyFjHXR","NAFuw6q6L9","8FmFHuoStw","ogLgctAOsr","07n1c07n1c","qUJMdChuy3","vLsmSHfyNQ","pmeCdFLsph","uJScXVNCPd","VNCPduPX7G",
+"ciuWzBpYhV","TwanofLNg8","HRxd8BpYhV","uJScXm4bxU","e6e4zIKxdL","5Drn0y94nw","lpF6WRsQUq","cShY2ZJTXH","AmdQdnFqik","L7cGczqH0W",
+"ru4UGbZLvS","580YDDcpWB","Cp3mZgf8rI","FxX9qIKxdL","cL0aE9GXkX","dpe1vHzZT8","0PktIuN6r3","29QAz5Namm","Ul4a1pAhR1","0BmCy7ku1p",
+"tl72WzFgtB","fqypyC2Irc","VIlwPd7vjM","M3zXLKsjRK","8TxD7ix74r","jtn0XCxVEf","yEfy9lpF6W","tjQxs0ao3l","WDVWJ4dEz6","SmGzvzQt6Q",
+"6AFT0hE1Ql","fcwDagf8rI","F6PT2Mm8si","i7WMQqaofN","fcwDa5nmWv","tlILt9XyT9","FGzgp6AFT0","6q6L9HP433","16lHcZuDtD","MK07Y2TRI7",
+"GSQwjyvOMI","kB5nPjfREu","JJs5mVBjhz","lXFOBG1RhS","nlaByni2v1","xciqpJKWYR","5Drn0LbRTH","MezSWwDajX","wiHrZWaim6","lj07QMmKGJ",
+"GSQwjAkKTk","ZJTXHQClRL","zbIYYMmsIo","Cfgr35Drn0","ru4UGOUYuF","8cVD3cShY2","uPX7GhUTw7","IjTwPNAFuw","n8pJ9d7vjM","NOHszjSjS3",
+"14FLRNcICA","dhSuHGXdoH","RkQkePb1pa","rKDLJjfREu","M6qcGpiJSk","AkKTkuQIcz","pAhR1fqypy","dhSuHnFqik","L7cGcbgJAz","Dz1R3Cfgr3",
+"Ta8f6uvf7A","uPX7GciuWz","ulk41uoStw","sx5GlFGzgp","8xEKzv2eC3","azIWpZJTXH","ThjNnuZPqg","iKqhrStlDJ","5IhmG7fsYM","iKqhrblLA9",
+"0ao3lBFkb8","s47860YAGH","uPX7GVBjhz","e6e4zwDajX","OHaBzDG4sT","tjQxsNOHsz","lm0pD2Yz7E","In3NSS2Dfu","AkKTkLDk6f","0h1b1iB08l",
+"IKxdLYh1hF","NOHszCfgr3","29QAzSbRYy","i7WMQ9GXkX","HRxd8KASQ8","prNT6SjskQ","0PktItaOXK","QssNCB3qem","9y4lwKsjRK","bZLvS8U2nU",
+"Z4I1vix74r","vkCHHJ2mQi","tvdkDMaJQs","ZuDtDL7cGc","vLsmSyofH3","Yf2Ec0h1b1","AgJHQQYxC0","W3VFHgdQsS","ECMvU1LB1L","prNT6euZA5",
+"qQxHP9eoRc","WDVWJsqVrf","8hJdtNOHsz","5iGN5Ss0Zu","5drc6BFkb8","FjHXRjeskS","QWxoTChuy3","5Drn0i7WMQ","L7cGcksJby","5Mg9rguMb8",
+"JKWYRzqH0W","yToGWSbRYy","FNYIMS77LH","1v5hHYjB9t","PYBf464s8N","i7WMQChuy3","lweGyWreyP","POUYS2TRI7","AgJHQSWfou","AXpwEsoy9t",
+"U3yw5Uvlv4","TCgPpbgJAz","xXTI49XyT9","mX2GE8RCUA","X6PinWreyP","MGlTFJ2mQi","gjUTuNo0Qb","lH1ktDG4sT","8U2nUReKEW","VerEAuPX7G",
+"W7cTsK4GS8","iKqhrVBjhz","cmXIXMK07Y","gjUTub29RJ","DcpWBPYBf4","X6PinjfREu","jeskSjiVBP","QworutvdkD","WaWsv580YD","VNCPdAgJHQ",
+"jzUqRn8pJ9","9eoRcSWfou","VjCZqjzUqR","kB5nPzHF1q","5Mg9r8hJdt","45cIHXyPZN","zz4ZUY1mC0","FNYIMRACuj","EOE1ohi5X7","BCxeCKsjRK",
+"64s8N0ao3l","3otm6CxVEf","FNYIMaFFss","9y4lwPOUYS","uJScX2hEEU","uoStwS2Dfu","3weIFuPX7G","guMb8AmdQd","Chuy3jiVBP","0h1b1QYxC0",
+"QYxC0MmKGJ","FjHXRECMvU","Kr8ysVBjhz","lpF6WzmLYD","ulk41NcICA","lj07Qn1pmO","e6e4zJRJQB","AmdQdlH1kt","hYBCKFnPFB","mX2GEQnJ1S",
+"a00b5PYBf4","n1pmOdpe1v","CIShGMkgy8","1v5hHkZANm","v2eC3Qworu","dpe1vChuy3","QbxXcyvOMI","8FmFHe6e4z","Kr8ysFhtgl","RACuj0PktI",
+"P6bcgCp3mZ","uLtKs8xEKz","dhSuHMK07Y","PYBf4guMb8","9y4lwF6PT2","9GXkXpAhR1","XyPZNoGu6x","HlUbFix74r","gf8rIIKxdL","CxVEfF6PT2",
+"zbIYY2TRI7","IBe8kpAhR1","fcJOyfqypy","Dz1R3i3pyd","XyPZNfaHir","fFDrJv8yFN","580YDCK5W7","Kr8ysMK07Y","Q6hMC9GXkX","lH1ktcL0aE",
+"AIYUuEoToP","CIShGokgRi","h1zcHoQ87r","GWqqXhe9IA","5IhmGKr8ys","FFDui9eoRc","64s8NZv7z0","rhl0JAOgEe","jfREuQssNC","pWiOsSjskQ",
+"y94nwIBe8k","2ZHdkW3VFH","AOgEeYOfrY","XflUqEoToP","t59lR64s8N","4W0TlsqVrf","5ZaEzpiJSk","MezSWpv0i7","YOfrY9rlg9","IBe8ksqVrf",
+"RsQUq4W0Tl","JRJQBpT8wu","X6Pindpe1v","DcpWBcL0aE","RBhp0guMb8","IjTwPn8pJ9","5iGN5I7p2a","wiHrZdhSuH","Chuy3yEfy9","8U2nU29QAz",
+"o8Uyd7fsYM","NhXdutjQxs","MmsIolj07Q","7Ow5CJkzUn","djsrvFLsph","WPmlxAOgEe","hi5X7qQxHP","Dz1R35Mg9r","s7MxkGXdoH","lweGyCNHmv",
+"AmdQdZuDtD","RpBQmpvgjS","ZzJHWWaWsv","5drc6Cfgr3","Mm8siBCxeC","0h1b1XflUq","FxX9qNo0Qb","FwEJzjzUqR","2Yz7EGSQwj","sx5GlRpBQm",
+"jS1ajdmoS7","lkMUAOUYuF","faHirO3iyQ","QssNCdpe1v","nlaBy5Mg9r","VerEAzbIYY","FPfSEuvf7A","OUqFM7lUXZ","ru4UGx3LDe","bgJAzs7Mxk",
+"WDVWJlkMUA","07n1cSs0Zu","vkCHH7ku1p","5Drn0he9IA","64s8NI7p2a","n8pJ9Zv7z0","NhXduLbRTH","jfREu2Yz7E","QWxoTuJScX","pvgjSni2v1",
+"nnP8oMaJQs","k85AeFVMxo","CxVEfZJTXH","ulk41UlU3M","jtn0XDcpWB","gjUTuBCxeC","VIlwPsx5Gl","0PktIhYBCK","s7MxkTXQ0Z","BpYhV9GXkX",
+"NhXduYf2Ec","cQOnv1j5L8","pWiOsU3yw5","P6bcguAWyp","NOHszDQimp","5VZjS8U2nU","DG4sTtlILt","i7WMQQbxXc","24ARFfcwDa","ulk417X3uy",
+"aez9yfqypy","n8pJ9OxWIH","cShY2GWqqX","5ZaEzt59lR","48cHLFFDui","RsQUqZ4I1v","Ss0ZuZzJHW","BCxeCjfREu","yToGWoVQp6","5NammoGu6x",
+"No0QbSs0Zu","MezSWD6rBy","e6e4zlH1kt","NhXduSWfou","M3zXLWDVWJ","azIWpn8pJ9","8TxD7gIYvE","SbRYyCIShG","FVMxoW7cTs","gIYvEhUTw7",
+"MmKGJuN6r3","Qworuulk41","QworuoGu6x","29QAzUvlv4","4QMc9Mkgy8","G1RhSazIWp","m4bxUgIYvE","pT8wuIBe8k","HRxd8L7cGc","EOE1oNAFuw",
+"S2DfuzmLYD","Oz8yZsx5Gl","uupzkHzZT8","LewvMY1mC0","Kr8ystl72W","5ZaEzqQxHP","azIWp580YD","F6PT2O3iyQ","zqH0WB3qem","h1zcH45cIH",
+"IRh48FPfSE","5Drn0iwzGk","Y1mC0Yw2oU","fqypyWreyP","qUJMd8TxD7","EoToPjeskS","4W0Tl5iGN5","Qworu5Mg9r","Q6hMC6AFT0","lweGy0BmCy",
+"QnJ1SyvOMI","kB5nPJ2mQi","HlUbFHzZT8","nlaByUvlv4","piJSkuN6r3","BbwgA48cHL","O3iyQiwzGk","J2mQi8cVD3","uPX7GCK5W7","O3iyQP6bcg",
+"pT8wuUvlv4","Q6hMCHRxd8","v2eC3okgRi","0YAGH5VZjS","suY4xAgJHQ","0BmCyuJScX","qaofN2DREs","1LB1LFVMxo","MojnP2Yz7E","QworutlILt",
+"CIShGYw2oU","GWqqXQ6hMC","RpBQmG1RhS","IjTwP5VZjS","Ta8f6nFqik","W7cTs24ARF","pmeCdMmsIo","HRxd8QWxoT","BbwgAECMvU","rhl0J2hEEU",
+"ulk41Pb1pa","24ARFAmdQd","SWfou9iGoT","FGzgp0BmCy","VIlwPRmDcr","MmKGJCqqaD","yToGWvkCHH","i7WMQaDGtS","lpF6WuoStw","oGu6x5Drn0",
+"5nmWvHfyNQ","QworuVerEA","mX2GEpAhR1","lm0pDReKEW","rz7UtTCgPp","16lHcJJs5m","NAFuw55rfB","fcwDaMGlTF","VjCZqVprf2","xciqpWPmlx",
+"lj07QaDGtS","XyPZNRmDcr","OUYuFzY1GY","x3LDeHP433","QYxC0HRxd8","nlaBypmeCd","bgJAzdjsrv","4dEz6FxX9q","xReecJKWYR","G1RhSCNHmv",
+"9iGoTYf2Ec","Gv3Fq6AFT0","oGu6xuLtKs","FNYIMxciqp","rz7UtFnPFB","RxrsmhSSvQ","8RCUA580YD","IjTwP6q6L9","9iGoTlsQGo","v2eC31v5hH",
+"gf8rIHP433","WPmlxOz8yZ","mz8gx64s8N","2Nslm4W0Tl","VBjhzHzZT8","AXpwEVerEA","ciuWzThjNn","QssNCCdyBV","uTacxDLhzM","oQ87r24ARF",
+"7X3uyFwEJz","SmGzvSWfou","2hEEU9GXkX","MmsIoFhtgl","fmIK1yofH3","cmXIXfLNg8","pFrrlGv3Fq","4W0TlCIShG","tAOsrWMiS3","x3LDeDz1R3",
+"FNYIM8FmFH","Z4I1vSbRYy","K4GS824ARF","soy9tKsjRK","SbRYyRmDcr","1j5L89GXkX","gf8rIQ6Lix","rz7UtChuy3","e6e4znlaBy","P6bcgeuZA5",
+"fqypyk85Ae","ksJby8hJdt","PYBf4jeskS","tvdkDUvlv4","uvf7AguMb8","0BmCyuN6r3","K20wK4dEz6","tvdkDuAWyp","CxVEfaDGtS","No0QbhYBCK",
+"oGu6xn8pJ9","K20wKHfyNQ","hi5X7MojnP","580YDlpF6W","hYBCKAXpwE","SWfoukZANm","lCMxygIYvE","iqv4klXFOB","16lHcd7vjM","mz8gxGv3Fq",
+"fFDrJQ6Lix","VIlwPFwEJz","2hEEU9rlg9","kB5nP55rfB","pT8wuK4GS8","vOqCEWmadA","gjUTuzmLYD","QChxsprNT6","1j5L8JJs5m","MK07YUvlv4",
+"ECMvURxrsm","45cIHoVQp6","i3pydzY1GY","K4GS807n1c","uPX7G5drc6","ru4UGgjUTu","5iGN5cL0aE","Ss0Zu0YAGH","qQxHPQ6Lix","7fKYUU3yw5",
+"mX2GEnFqik","0KyfsgdQsS","hUTw7Nxx9V","iqv4kZv7z0","jSjS3GWqqX","faHirk85Ae","oVQp6gjUTu","618DidQ586","oGu6x7hyVv","6q6L9fmIK1",
+"GSQwjNAFuw","SjskQtl72W","lkMUAFnPFB","jiVBPzQt6Q","9rlg9ni2v1","Q6hMCmX2GE","atef2FVMxo","7fKYU6AFT0","0KyfsokgRi","RACujzQt6Q",
+"Mkgy8gdQsS","BGaQYO3iyQ","YjB9tuPX7G","ZhwG148cHL","7hyVvZzJHW","ogLgczmLYD","wDajXQ6Lix","NOHszWDVWJ","G1RhSMm8si","oGu6x1v5hH",
+"9GXkXyvOMI","dhSuHQYxC0","YjB9thi5X7","dpe1vNAFuw","OHaBzlsQGo","dQ586HfyNQ","5Mg9rJKWYR","s93MljzUqR","lweGyciuWz","9GXkXOxWIH",
+"e6e4z0BmCy","Ul4a17fKYU","14FLRCNHmv","DLhzMt98iW","8RCUAJKWYR","CqqaD2Yz7E","AOgEecQOnv","LewvMCIShG","D6rByIBe8k","zQt6QRzaZA",
+"d7vjMTCgPp","TCgPpfLNg8","yluBxdjsrv","AgJHQjeskS","PYBf4d85a9","CqqaD580YD","FcWrW64s8N","M3zXLQYxC0","jS1ajS2Dfu","kB5nPIKxdL",
+"07n1cZhwG1","s7Mxk2Yz7E","Yh1hFuoStw","U3yw5580YD","FLsphQChxs","O3iyQLewvM","D6rByQ6Lix","Uvlv4jeskS","Ta8f6Zv7z0","tuDySfcJOy",
+"POUYSS77LH","uPX7GiwzGk","KZamHQnJ1S","tl72WhYBCK","RmDcrZuDtD","FGzgpReKEW","QworupWiOs","fqypyY1mC0","0YAGH3weIF","djsrvIn3NS",
+"QChxsiKqhr","azIWpfqypy","K20wK580YD","nnP8oUl4a1","ciuWzzQt6Q","GrDg7bgJAz","0h1b1zmLYD","qaofNyofH3","QYxC0lCMxy","9eoRcaFFss",
+"0Wr5y9GXkX","pvgjSdmoS7","gtCA56q6L9","iqv4kkZANm","7Ow5CbrhlQ","Oz8yZ5drc6","qaofNnFqik","MGlTFS2Dfu","7fsYMEdBKc","tjQxsuAWyp",
+"29QAzHlUbF","vLsmSJkzUn","rhl0JVprf2","OxWIHSs0Zu","pWiOsQbxXc","NAFuw0BmCy","lXFOBZ4I1v","RBhp07Ow5C","UlU3Mxciqp","W3VFHmX2GE",
+"pWiOsP6bcg","2Yz7EhE1Ql","VIlwPfaHir","8U2nUtl72W","GWqqXuQIcz","rz7Ut64s8N","v8yFNYOfrY","iKqhr4QMc9","pAhR1VBjhz","YOfrYlweGy",
+"iqv4kJIqXi","1j5L8JKWYR","8RCUAoVQp6","atef2v2eC3","B3qemMm8si","P6bcguoStw","guMb8hYBCK","WaWsvAkKTk","Mkgy8jtn0X","Cp3mZVerEA",
+"FPfSEZuDtD","FGzgpZuDtD","zz4ZUAXpwE","Pb1paOUYuF","n1pmOgf8rI","1LB1LCK5W7","lkMUACxVEf","29QAzfFDrJ","0BmCyLDk6f","dhSuHZzJHW",
+"Waim6MK07Y","zHF1qlViBv","6q6L9tAOsr","WPmlxhe9IA","WreyPzmLYD","Dz1R3sx5Gl","AkKTkqUJMd","Oz8yZ7hyVv","JIqXiatef2","Yw2oUCdyBV",
+"pvgjSCIShG","FxX9qMaJQs","cL0aELDk6f","vOqCEKr8ys","Gv3FqTwano","v1HlniwzGk","fcJOyXflUq","he9IAdhSuH","BFkb8h1zcH","9rlg9v2eC3",
+"uQIcz0PktI","tlILtTXQ0Z","nlaByFNYIM","CqqaD07n1c","FjHXRuQIcz","uQIczBCxeC","8TxD7S2Dfu","AIYUua00b5","W7cTsY1mC0","LDk6fnlaBy",
+"RmDcrn1pmO","SWfouK4GS8","K20wKiwzGk","Yf2EcHlUbF","sqVrfW7cTs","pT8wumz8gx","F6PT2BFkb8","aL6AJIBe8k","bZLvSpv0i7","v1HlnQbxXc",
+"FGzgpuAWyp","YOfrYtaOXK","14FLRuoStw","qUJMdtlILt","1LB1LVjCZq","prNT67fKYU","5IhmGVNCPd","pFrrlMGlTF","kZANmPOUYS","MojnPUlU3M",
+"StlDJ5iGN5","pvgjSfcwDa","Gv3FqWDVWJ","SWfougIYvE","dQ586uupzk","soy9tCfgr3","BbwgAhYBCK","rz7Ut0YAGH","ulk415drc6","CNHmvFwEJz",
+"45cIHFnPFB","ulk41BGaQY","guMb8X6Pin","v8yFNFVMxo","v1HlnZuDtD","RACujpT8wu","SWfouYh1hF","D6rByWDVWJ","FFDuihUTw7","jzUqR8FmFH",
+"SjskQQ6hMC","x3LDexXTI4","e6e4z1j5L8","Chuy37X3uy","yvOMIiqv4k","ni2v1NAFuw","GrDg7UlU3M","KASQ82Yz7E","RpBQm9rlg9","lViBvSs0Zu",
+"Ta8f6h1zcH","ksJby2Nslm","mz8gxRBhp0","MmKGJaL6AJ","gjUTuqQxHP","uTacx2ZHdk","pv0i71j5L8","euZA5Ss0Zu","Dz1R3TXQ0Z","OxWIHtvdkD",
+"QssNCpvgjS","jS1ajMkgy8","VIlwPdmoS7","jeskSgIYvE","0h1b1taOXK","Mm8si9rlg9","IKxdL4QMc9","cmXIXUmaEv","kZANmUlU3M","pFrrl07n1c",
+"OUYuFgf8rI","jiVBPpFrrl","5iGN50h1b1","0PktI8hJdt","t98iW16lHc","lpF6WpFrrl","taOXKNo0Qb","xciqp5Namm","Yh1hF2hEEU","Q6hMCzbIYY",
+"uTacxBCxeC","pFrrlUvlv4","VLTy6vLsmS","9eoRciwzGk","qUJMduPX7G","5drc69GXkX","zY1GYsuY4x","BFkb8Pb1pa","rhl0JQnJ1S","5iGN5JRJQB",
+"fqypyRxrsm","VNCPd24ARF","CdyBVYOfrY","FGzgpsx5Gl","pAhR1JIqXi","0ao3lCIShG","WreyPlXFOB","2DREsv8yFN","U3yw5mX2GE","WmadAxXTI4",
+"VNCPdEdBKc","oVQp6Uvlv4","5nmWvxReec","C2Irck85Ae","Waim6yluBx","vOqCEMkgy8","rz7UtBFkb8","hYBCKblLA9","RBhp0SWfou","uupzkAXpwE",
+"0Wr5y64s8N","5drc64W0Tl","kZANm24ARF","FxX9qdQ586","5Mg9ra00b5","t98iW618Di","QbxXcjS1aj","s4786tvdkD","UlU3MzQt6Q","oVQp6fmIK1",
+"GrDg7uLtKs","iqv4kFNYIM","2ZHdkTa8f6","sqVrfYOfrY","8U2nUU3yw5","sx5GlIn3NS","s7MxkUmaEv","bgJAzhYBCK","oQ87rKr8ys","CqqaD7lUXZ",
+"BGaQYguMb8","Mkgy8LbRTH","v2eC3CdyBV","tjQxsi3pyd","jtn0XtjQxs","5Namm64s8N","aL6AJGv3Fq","ciuWzAOgEe","2Nslms7Mxk","WreyPdmoS7",
+"HP433S2Dfu","3otm6uAWyp","618Disoy9t","FVMxoS2Dfu","CK5W77hyVv","m4bxUNOHsz","P6bcgS77LH","Gv3FqStlDJ","mX2GE3weIF","pWiOsEoToP",
+"zqH0Wgf8rI","vkCHHdQ586","i7WMQpWiOs","YjB9t580YD","lpF6W3otm6","QWxoTuAWyp","NAFuwwiHrZ","jiVBPrKDLJ","Uvlv4AgJHQ","v1HlnGrDg7",
+"ZhwG1jfREu","tAOsrStlDJ","fFDrJatef2","zY1GYlm0pD","BFkb8lCMxy","8xEKzQ6Lix","SWfoutvdkD","RxrsmuQIcz","Waim6uN6r3","QChxsW3VFH",
+"9eoRcYjB9t","brhlQ4dEz6","AOgEeyvOMI","WaWsvMaJQs","B3qemDcpWB","QbxXcqaofN","yToGWkZANm","NhXdud85a9","Ta8f69iGoT","9XyT9o8Uyd",
+"I7p2alkMUA","SbRYy2hEEU","7ku1pI7p2a","pT8wuY1mC0","MezSWMmKGJ","xciqpAOgEe","YjB9tM3zXL","i3pydWDVWJ","7Ow5CDz1R3","ru4UGRBhp0",
+"2TRI7tl72W","Yf2Ecfqypy","24ARFdhSuH","lpF6WTwano","U3yw5oQ87r","zbIYYK20wK","LDk6fAgJHQ","prNT6RBhp0","G1RhSuupzk","5drc6OUYuF",
+"Ss0ZuECMvU","DLhzMcL0aE","5drc6Dz1R3","VBjhzJXljW","B3qemKZamH","piJSkhYBCK","29QAzZuDtD","RkQkedpe1v","55rfB0MR5X","DcpWBlkMUA",
+"jSjS3dhSuH","gIYvEuZPqg","7X3uyRBhp0","x3LDeAXpwE","48cHLRzaZA","s93MlprNT6","FjHXR16lHc","tAOsrM3zXL","AmdQdyToGW","hSSvQrKDLJ",
+"2Yz7E2Yz7E","1LB1LjS1aj","uLtKsKr8ys","uN6r3FxX9q","VjCZq8cVD3","gjUTuulk41","I7p2aCdyBV","fmIK1brhlQ","NcICAsuY4x","jfREutaOXK",
+"iKqhrlCMxy","CqqaDOUYuF","5ZaEzX6Pin","FVMxoChuy3","8FmFHP6bcg","pvgjSCqqaD","ydG8Udjsrv","CqqaDzqH0W","yEfy9a00b5","Kr8ys5Drn0",
+"RBhp0ksJby","jSjS3okgRi","MezSWUmaEv","lViBvIRh48","AIYUu8RCUA","UlU3MAmdQd","NcICAZzJHW","U3yw5FNYIM","64s8NVerEA","iwzGkEdBKc",
+"Ss0Zuru4UG","FLsphCdyBV","JIqXiQnJ1S","EOE1ofLNg8","3weIF0MR5X","gdQsSpv0i7","Mkgy8FcWrW","hYBCKFVMxo","MGlTF5IhmG","t59lRgf8rI",
+"VBjhzuZPqg","Waim607n1c","yEfy9uJScX","lm0pDydG8U","wDajXEoToP","e6e4zXflUq","faHirazIWp","qaofNpvgjS","VjCZq7lUXZ","SjskQ8U2nU",
+"v8yFNv8yFN","qaofN8xEKz","WPmlxiwzGk","OUYuF5nmWv","LDk6fv1Hln","uN6r3RzaZA","AkKTkC2Irc","55rfBzY1GY","RmDcrnFqik","M3zXLbrhlQ",
+"jzUqR2ZHdk","9XyT9CqqaD","lkMUAzqH0W","t98iWG1RhS","lViBvuPX7G","cQOnvbgJAz","5iGN5iqv4k","aFFssFcWrW","zFgtByEfy9","9rlg9hUTw7",
+"pAhR1Rxrsm","Dz1R3sqVrf","RzaZAFFDui","EOE1oQbxXc","aDGtSVBjhz","pFrrlfFDrJ","NhXduIBe8k","P6bcgdjsrv","2hEEU4W0Tl","pT8wupiJSk",
+"Uvlv4xXTI4","IRh48CIShG","WMiS3FLsph","iB08lbgJAz","KsjRKOUqFM","CK5W7ZUnqt","AXpwEWMiS3","Cp3mZhUTw7","fLNg8cmXIX","vOqCEru4UG",
+"gjUTufFDrJ","n1pmOQbxXc","5IhmGzqH0W","uN6r3PYBf4","nlaByuPX7G","AgJHQVjCZq","FNYIMIKxdL","hUTw7LDk6f","ReKEWix74r","s93MlHlUbF",
+"ZJTXH7Ow5C","G1RhS5VZjS","fcwDaNo0Qb","okgRit98iW","7fKYUTwano","jiVBPTwano","0PktIQ6hMC","FnPFBZUnqt","618Di9y4lw","0Wr5yRpBQm",
+"2DREszmLYD","cL0aElXFOB","DQimp2Yz7E","RsQUqlH1kt","xciqpgtCA5","RzaZAK4GS8","W3VFHEdBKc","2DREs2hEEU","o8UydtAOsr","29QAzuTacx",
+"QssNCaez9y","1v5hHQWxoT","sqVrfblLA9","fmIK1JkzUn","ksJby5ZaEz","BGaQYQssNC","JXljWfqypy","0ao3l6q6L9","4dEz6FcWrW","brhlQ7fsYM",
+"CIShGZJTXH","ix74rOHaBz","tl72Wx3LDe","5Mg9r9iGoT","pT8wuxciqp","O3iyQ07n1c","BFkb8lweGy","lweGyqaofN","ZhwG1Y1mC0","FFDuiPb1pa",
+"0ao3lLbRTH","v2eC33weIF","h1zcH29QAz","C2IrcFjHXR","5iGN5zY1GY","AXpwEsuY4x","brhlQBbwgA","VNCPdgIYvE","HRxd8b29RJ","5iGN55Namm",
+"NOHsziwzGk","jfREun1pmO","S77LH7fKYU","gf8rI7X3uy","zz4ZUHlUbF","5Drn0cL0aE","cL0aEdmoS7","oVQp6xXTI4","MmKGJjtn0X","y94nwlweGy",
+"xReecRkQke","8TxD7Twano","W7cTsxXTI4","HRxd8StlDJ","5IhmGprNT6","0BmCyCfgr3","WmadAprNT6","jiVBPFVMxo","StlDJChuy3","AkKTkIKxdL",
+"uLtKsAIYUu","iB08lni2v1","xXTI4CIShG","O3iyQBFkb8","v1Hln8cVD3","zQt6Qs93Ml","NcICA0h1b1","v8yFNjSjS3","7hyVvFVMxo","8hJdt580YD",
+"n1pmOIRh48","tlILtmX2GE","IBe8kNAFuw","xXTI4uQIcz","AXpwEChuy3","9rlg9nFqik","lsQGo9eoRc","FjHXRFxX9q","vOqCEh1zcH","2Nslmiqv4k",
+"GXdoH9rlg9","b29RJCIShG","MmsIoo8Uyd","StlDJi7WMQ","LDk6fTa8f6","FNYIM14FLR","piJSkdjsrv","gIYvEUlU3M","29QAzyvOMI","1LB1Lh1zcH",
+"ksJbyru4UG","t59lRUmaEv","SbRYypiJSk","2Nslm580YD","29QAz580YD","iqv4kfqypy","ciuWzuPX7G","24ARFTa8f6","tAOsrLbRTH","b29RJjtn0X",
+"OHaBz9GXkX","uQIczK4GS8","DQimpP6bcg","AmdQdVprf2","ciuWzlj07Q","Mm8si9eoRc","v2eC3NcICA","pmeCdPOUYS","uZPqgrKDLJ","14FLR7hyVv",
+"cShY2suY4x","0h1b1jeskS","lpF6WM6qcG","wDajXx3LDe","ix74rHzZT8","lXFOBv1Hln","ix74rOUYuF","AIYUu1LB1L","Ta8f6Cp3mZ","Q6LixtAOsr",
+"G1RhS1LB1L","QbxXcM6qcG","zqH0WBGaQY","VBjhzcQOnv","AIYUuQssNC","5drc6GXdoH","K4GS8Qworu","zFgtBVIlwP","WPmlxru4UG","fcwDa3weIF",
+"kZANm9y4lw","S77LHlpF6W","SbRYykZANm","iKqhroVQp6","tjQxsvLsmS","Ta8f6WMiS3","aDGtSfmIK1","VIlwPFVMxo","5VZjSFNYIM","suY4xs7Mxk",
+"lpF6W618Di","2DREsuZPqg","8hJdtm4bxU","lweGy0MR5X","OUYuFzFgtB","s7MxkuoStw","5Drn05VZjS","n1pmOM3zXL","gjUTuZzJHW","qUJMdlm0pD",
+"WMiS30BmCy","Y1mC007n1c","DLhzM55rfB","lsQGo5Drn0","MmKGJlweGy","SjskQFxX9q","HlUbFWPmlx","WaWsvFPfSE","gf8rIF6PT2","cL0aEydG8U",
+"Pb1pa618Di","lm0pDxciqp","8TxD7aL6AJ","0YAGHYOfrY","blLA9Ul4a1","PYBf4fcJOy","OxWIHYw2oU","ZJTXHFcWrW","DLhzMhe9IA","WPmlxJKWYR",
+"Chuy3qQxHP","lpF6WCxVEf","uJScXFcWrW","48cHLoVQp6","K4GS8FcWrW","16lHcnnP8o","DG4sT1LB1L","uN6r3zqH0W","AOgEeuTacx","fcJOyWPmlx",
+"lweGyn1pmO","Yw2oUU3yw5","KsjRKVNCPd","uN6r3hE1Ql","FxX9qciuWz","v1HlnNAFuw","ReKEWogLgc","J2mQiWPmlx","SmGzvfcwDa","4W0TlyluBx",
+"lViBvBCxeC","mz8gxFVMxo","55rfBtaOXK","RACujMkgy8","gdQsSWPmlx","4W0TlguMb8","IjTwPsqVrf","azIWpYjB9t","Q6hMCblLA9","HfyNQ2TRI7",
+"RsQUqBFkb8","JIqXiNcICA","fmIK1FNYIM","euZA5IKxdL","wDajXXyPZN","jSjS3RACuj","7X3uyd85a9","CqqaDFNYIM","Q6LixtaOXK","MojnPBFkb8",
+"24ARFQnJ1S","MmsIosqVrf","Z4I1vJ2mQi","n8pJ9O3iyQ","JkzUnlkMUA","euZA56q6L9","580YDZhwG1","uAWypdjsrv","lm0pDaL6AJ","9GXkXRBhp0",
+"aez9y55rfB","WMiS3pFrrl","QbxXc9GXkX","qaofNFFDui","LewvMuvf7A","azIWpY1mC0","jiVBPGXdoH","SmGzv0h1b1","xReecXflUq","yluBx07n1c",
+"gIYvEv2eC3","2ZHdkFjHXR","qaofNlsQGo","M3zXLkB5nP","uupzkTwano","hUTw7jfREu","zQt6QbgJAz","0BmCylm0pD","jSjS3aDGtS","MK07YAOgEe",
+"taOXKGv3Fq","JRJQBVNCPd","M3zXLvkCHH","EoToPGv3Fq","OUYuFMK07Y","hSSvQM6qcG","i7WMQQnJ1S","AOgEet59lR","v1Hln4dEz6","jSjS355rfB",
+"QWxoTv2eC3","lsQGouAWyp","FPfSEv8yFN","No0QbPOUYS","NAFuwIn3NS","n1pmOjeskS","tlILtuPX7G","MK07Y618Di","d85a9K20wK","lXFOBChuy3",
+"P6bcgAmdQd","0h1b1GXdoH","JRJQBjtn0X","No0QbzQt6Q","Yw2oU5Drn0","k85AeyvOMI","FGzgprKDLJ","tvdkDC2Irc","hi5X7QWxoT","RpBQmOz8yZ",
+"dmoS7K4GS8","hE1Qly94nw","qQxHPwDajX","64s8NThjNn","ZUnqtDcpWB","OUYuFIBe8k","gdQsS8xEKz","tAOsrAgJHQ","uPX7G5Mg9r","kZANmQnJ1S",
+"GWqqXo8Uyd","U3yw5TCgPp","ReKEWVerEA","okgRiNo0Qb","FNYIMaez9y","cmXIXDz1R3","XyPZNaL6AJ","RkQkeCqqaD","TXQ0ZDQimp","Nxx9V6AFT0",
+"AmdQd4dEz6","FPfSEPOUYS","Mm8si14FLR","FFDuiAOgEe","zQt6QNOHsz","Nxx9VAOgEe","azIWpWmadA","uTacxMkgy8","uvf7AyofH3","xReecZ4I1v",
+"OUYuF5VZjS","Q6LixVNCPd","lm0pDgdQsS","iKqhrEdBKc","IBe8khSSvQ","2NslmTCgPp","brhlQnnP8o","aDGtS8cVD3","7hyVvFxX9q","e6e4zWmadA",
+"lkMUAJRJQB","7fKYUfmIK1","jtn0XLDk6f","guMb8Nxx9V","FNYIMCfgr3","wiHrZ5ZaEz","1j5L8pFrrl","HlUbFGrDg7","QbxXc2Yz7E","fcwDalm0pD",
+"DQimpZuDtD","rz7UtJJs5m","piJSkv2eC3","okgRiGWqqX","qQxHPi3pyd","v2eC3618Di","gf8rI9iGoT","QWxoTMmsIo","AIYUucShY2","jfREu9rlg9",
+"OUqFMhSSvQ","UlU3M9GXkX","zQt6Q1LB1L","jeskSgf8rI","lH1kt2hEEU","uPX7GaL6AJ","yluBx55rfB","hE1QliB08l","2ZHdkGXdoH","SbRYy8hJdt",
+"VjCZqzHF1q","2ZHdkM6qcG","TwanorKDLJ","OUYuFBGaQY","CNHmv0Kyfs","oGu6xyluBx","AmdQdBFkb8","KASQ8mz8gx","Chuy3HlUbF","IRh48NAFuw",
+"8U2nUuQIcz","7hyVvt98iW","Q6Lixd85a9","oVQp6RsQUq","AgJHQcL0aE","pAhR10Kyfs","JJs5mQ6Lix","WDVWJW7cTs","tuDyS7X3uy","5drc6ulk41",
+"s4786rKDLJ","64s8NsqVrf","TwanoU3yw5","Ss0ZuZUnqt","S77LHOHaBz","uZPqgCp3mZ","CNHmvZUnqt","7fKYU5nmWv","dmoS7K20wK","pmeCd2DREs",
+"5nmWvMGlTF","fFDrJ7ku1p","EoToPUmaEv","C2IrcuPX7G","tjQxsWmadA","lweGy7fKYU","gtCA5nFqik","55rfBuQIcz","RpBQmM6qcG","gtCA5atef2",
+"5Drn08RCUA","SmGzv9y4lw","3weIFZ4I1v","1LB1Lsx5Gl","ZUnqtOUYuF","No0Qb7hyVv","2NslmNhXdu","Chuy3lsQGo","MK07YlsQGo","wiHrZU3yw5",
+"euZA5bgJAz","4dEz6WDVWJ","AkKTknlaBy","tjQxsfcJOy","CdyBVsuY4x","PYBf4jfREu","hi5X7POUYS","xReecEdBKc","vLsmSuAWyp","soy9taL6AJ",
+"gtCA5rz7Ut","FhtglMm8si","brhlQO3iyQ","rKDLJ618Di","qUJMdVIlwP","ZUnqtRkQke","IjTwPWPmlx","brhlQyvOMI","FFDuiuAWyp","K20wKReKEW",
+"FFDui5Drn0","Yh1hF7fKYU","XflUqzmLYD","CNHmvoVQp6","FnPFBNcICA","qaofN6q6L9","VLTy6MaJQs","tjQxslCMxy","TXQ0ZqQxHP","VBjhzEdBKc",
+"mz8gxix74r","TwanovLsmS","sqVrfS77LH","DQimpCK5W7","oGu6xHfyNQ","GWqqXOxWIH","In3NSVLTy6","x3LDePYBf4","FGzgpM6qcG","AOgEeTCgPp",
+"fqypyM6qcG","gIYvEuPX7G","bZLvSsuY4x","AkKTkoVQp6","5drc66q6L9","cmXIXFcWrW","uAWypZuDtD","MmsIoMmKGJ","v8yFNxXTI4","45cIHazIWp",
+"7lUXZSmGzv","zbIYYOUqFM","2ZHdkzQt6Q","l83UduN6r3","G1RhSHRxd8","VNCPdi7WMQ","jS1ajMojnP","a00b5Qworu","jzUqRNhXdu","blLA94QMc9",
+"Cfgr3Ul4a1","atef2hYBCK","lViBvMaJQs","jS1ajcQOnv","OUYuF9iGoT","DLhzMsqVrf","tjQxs8hJdt","I7p2a7ku1p","ksJbyRsQUq","2DREsTXQ0Z",
+"M3zXLCNHmv","POUYSFwEJz","m4bxUIn3NS","soy9tVerEA","s47862Nslm","FLsphdjsrv","IRh48FLsph","ZJTXHuvf7A","ni2v164s8N","vOqCE7ku1p",
+"fqypyS77LH","YOfrYKZamH","b29RJM6qcG","RACujuTacx","RBhp0Mm8si","TXQ0Z9rlg9","GrDg7IBe8k","IKxdLMGlTF","LewvMWPmlx","prNT6n8pJ9",
+"BCxeC45cIH","soy9tY1mC0","SmGzvBGaQY","ZJTXH6q6L9","0YAGHFFDui","n1pmOGSQwj","FVMxotlILt","nnP8oKr8ys","gdQsSs93Ml","EdBKcjzUqR",
+"atef2KZamH","brhlQMkgy8","fcwDauvf7A","yvOMIW7cTs","prNT6FFDui","piJSkoQ87r","5VZjSWreyP","Oz8yZhUTw7","580YDSjskQ","QssNCCp3mZ",
+"ECMvUZuDtD","0YAGHX6Pin","o8UydJXljW","5IhmG8U2nU","uQIcze6e4z","MaJQsaDGtS","CdyBVBpYhV","5Drn0XyPZN","CIShGjzUqR","W3VFHOHaBz",
+"okgRiQWxoT","Y1mC0kZANm","jeskSatef2","NhXdulViBv","ksJbyQ6Lix","QssNCpFrrl","JKWYRO3iyQ","lViBvnlaBy","WDVWJMaJQs","5drc6FnPFB",
+"Chuy3LewvM","pvgjSQssNC","aL6AJ5iGN5","AIYUuSjskQ","S2Dfua00b5","s7MxkOz8yZ","FcWrWfcJOy","dmoS7Q6Lix","Yw2oU3otm6","XyPZNpT8wu",
+"6q6L9ogLgc","RACujBFkb8","faHirFPfSE","No0QbRmDcr","8TxD7TCgPp","tvdkDSmGzv","5nmWvWaim6","2DREsNo0Qb","Gv3Fq5ZaEz","5IhmGL7cGc",
+"NhXduYjB9t","5iGN5rz7Ut","NhXduni2v1","Mm8siRxrsm","K20wKguMb8","5Nammhi5X7","he9IAWMiS3","aDGtS2Yz7E","CdyBVNxx9V","7hyVvSs0Zu",
+"KASQ8t98iW","BCxeCF6PT2","kB5nPazIWp","pFrrltaOXK","BbwgAFnPFB","RsQUqNhXdu","oQ87r8FmFH","8FmFHix74r","yEfy9jzUqR","W3VFHXyPZN",
+"tl72Wmz8gx","48cHLNxx9V","Y1mC0tvdkD","WaWsv45cIH","MmKGJqQxHP","s7MxkjeskS","QworuQYxC0","WDVWJzQt6Q","dQ586s93Ml","5drc6a00b5",
+"KZamHSmGzv","uTacxaDGtS","d7vjMLbRTH","jzUqRNOHsz","TwanoUvlv4","Ul4a1Y1mC0","guMb8n8pJ9","xXTI4rz7Ut","aDGtSAXpwE","pv0i72TRI7",
+"0h1b114FLR","UmaEvaFFss","bgJAzvOqCE","hE1QlXflUq","soy9tatef2","S2DfuZv7z0","5iGN54QMc9","QnJ1SJJs5m","zmLYDNOHsz","29QAzB3qem",
+"QworuhSSvQ","v1HlnmX2GE","ReKEWsqVrf","qaofNmX2GE","FcWrWReKEW","yToGWG1RhS","CIShGuoStw","XyPZN5Namm","aL6AJCfgr3","uupzkeuZA5",
+"o8Uyd9eoRc","YOfrYzY1GY","lViBvyvOMI","HzZT8s93Ml","zbIYYlj07Q","gtCA5NcICA","GrDg7gIYvE","FGzgpGrDg7","9y4lwoQ87r","4dEz6RsQUq",
+"vkCHHRACuj","jeskSlj07Q","pvgjSBbwgA","brhlQfcwDa","1v5hH55rfB","9XyT9blLA9","6q6L9ThjNn","W7cTscL0aE","aFFssqQxHP","uAWypFLsph",
+"Cp3mZJIqXi","mz8gx3otm6","HP433L7cGc","Yh1hFuN6r3","FPfSEd85a9","HfyNQ48cHL","Yh1hFBbwgA","fcwDajfREu","yofH3fcJOy","DQimpfqypy",
+"i3pydU3yw5","kZANmWreyP","0PktIuTacx","AOgEeFGzgp","5VZjSRzaZA","mz8gxuPX7G","Yw2oUM3zXL","a00b5euZA5","pv0i7uTacx","euZA5yvOMI",
+"WmadADcpWB","FGzgpk85Ae","QClRLkB5nP","K4GS8jtn0X","Oz8yZQ6Lix","cmXIXSWfou","ZhwG1uPX7G","fLNg8pFrrl","5NammW7cTs","0MR5XPb1pa",
+"nFqikjSjS3","suY4xyluBx","QbxXcCK5W7","lkMUAcL0aE","okgRipT8wu","P6bcgLDk6f","d85a9sx5Gl","FnPFBiqv4k","AOgEegdQsS","uPX7G3otm6",
+"k85Aeatef2","JJs5mrz7Ut","2Yz7ECp3mZ","tl72WM3zXL","djsrvni2v1","Waim6o8Uyd","hi5X7lViBv","JRJQBIRh48","9eoRccQOnv","OUqFMWaWsv",
+"hi5X75ZaEz","C2IrcsuY4x","nlaBycQOnv","azIWpNOHsz","Oz8yZgIYvE","a00b5Uvlv4","zbIYYlkMUA","aFFssoGu6x","uN6r34W0Tl","bZLvS1LB1L",
+"soy9tydG8U","W3VFHMmsIo","WDVWJFFDui","t59lR3weIF","GSQwjdpe1v","JKWYRRxrsm","DLhzMpWiOs","zQt6Q4W0Tl","VjCZqFVMxo","7ku1pNAFuw",
+"AXpwEMkgy8","ru4UGtjQxs","fLNg8yofH3","I7p2auJScX","HlUbFulk41","rKDLJMaJQs","3otm6s7Mxk","jS1ajJkzUn","45cIHzHF1q","HfyNQ07n1c",
+"RACujMaJQs","BFkb8vLsmS","MmKGJ48cHL","soy9tCxVEf","JIqXiYOfrY","cQOnvuPX7G","Yf2Ecn8pJ9","dhSuHWaWsv","rz7UtWPmlx","nlaByMK07Y",
+"jfREuDLhzM","Vprf22Nslm","oQ87rAIYUu","Y1mC0Twano","IjTwPQYxC0","zY1GY0BmCy","FLsphrhl0J","tvdkDnnP8o","MojnPRBhp0","ZzJHW7Ow5C",
+"lm0pD07n1c","guMb8vOqCE","Q6hMCOHaBz","14FLRl83Ud","Zv7z0SbRYy","2DREs16lHc","uQIczL7cGc","5nmWvpv0i7","NcICAYjB9t","64s8NYw2oU",
+"JIqXihUTw7","55rfBHzZT8","8xEKz0Kyfs","ix74rpv0i7","0PktI6AFT0","uAWypoVQp6","vLsmSHP433","NOHszuupzk","qQxHPuTacx","RBhp0zqH0W",
+"ECMvUpmeCd","fcJOys4786","K20wKOxWIH","ECMvUtaOXK","l83UdwDajX","uPX7GGSQwj","ix74rbgJAz","0BmCyjtn0X","F6PT2HlUbF","Qworu6AFT0",
+"U3yw5MojnP","Mkgy8gf8rI","uQIczIKxdL","Twanomz8gx","Mm8silXFOB","atef2GrDg7","In3NSVprf2","d7vjMm4bxU","UlU3MIBe8k","gIYvEfaHir",
+"5NammPOUYS","FNYIMzHF1q","jzUqRs7Mxk","NhXduxciqp","yluBxFwEJz","brhlQlm0pD","StlDJVIlwP","64s8NblLA9","5ZaEzP6bcg","dhSuHIRh48",
+"tjQxsSjskQ","CqqaDNhXdu","Y1mC0zQt6Q","RACujhe9IA","s93MlEdBKc","Uvlv4MaJQs","IKxdLl83Ud","AgJHQvLsmS","U3yw5iwzGk","pv0i7QYxC0",
+"7Ow5CWmadA","tAOsrDG4sT","5NammJRJQB","QWxoT5nmWv","1LB1LhUTw7","GXdoHNOHsz","ydG8UMaJQs","CdyBVatef2","5iGN555rfB","YOfrYRsQUq",
+"FVMxo9rlg9","1v5hH5ZaEz","dpe1vyofH3","5drc62Nslm","IKxdLQWxoT","uPX7GNhXdu","fmIK17hyVv","UlU3MVerEA","5nmWvMaJQs","fLNg8tAOsr",
+"I7p2afmIK1","ogLgc5Namm","SmGzvVerEA","8xEKzWreyP","pAhR1BbwgA","MGlTF2TRI7","EOE1ov1Hln","zQt6Qk85Ae","NcICAUvlv4","1LB1LyvOMI",
+"t98iWFcWrW","rhl0JRACuj","pWiOsFVMxo","07n1cKASQ8","RpBQmJXljW","QnJ1SjS1aj","9eoRcUl4a1","WDVWJoGu6x","8U2nUQChxs","X6PinnnP8o",
+"OHaBzQssNC","zY1GYAIYUu","GWqqXUmaEv","rz7UtUlU3M","tuDySjiVBP","bZLvSZUnqt","mz8gxxXTI4","wDajXiB08l","qaofNAIYUu","JJs5mZuDtD",
+"Mm8siaDGtS","okgRiOUYuF","Dz1R3HzZT8","QssNCix74r","gdQsS0BmCy","i7WMQAgJHQ","piJSkb29RJ","mz8gxZhwG1","gf8rIhYBCK","0ao3ll83Ud",
+"1j5L8HlUbF","ThjNnFNYIM","xXTI4zbIYY","hSSvQKr8ys","EOE1ouvf7A","CNHmvokgRi","vLsmSZUnqt","i3pydmz8gx","pmeCd29QAz","cQOnvZuDtD",
+"0BmCyOHaBz","pv0i7prNT6","LbRTHvOqCE","n8pJ9Dz1R3","Zv7z0FcWrW","QnJ1S29QAz","zHF1qdpe1v","fcwDaJJs5m","7ku1piqv4k","uoStw64s8N",
+"FFDuijSjS3","3weIFd85a9","ydG8UGWqqX","zmLYDVprf2","24ARFkZANm","2hEEUuLtKs","pWiOsfcJOy","No0QbMkgy8","fmIK1VNCPd","FjHXRtuDyS",
+"ksJby9eoRc","gjUTu7Ow5C","KZamHRmDcr","No0Qbx3LDe","zqH0Wrz7Ut","Nxx9VZv7z0","JkzUnSmGzv","JRJQBi3pyd","QnJ1SdQ586","n1pmOdhSuH",
+"AmdQds4786","618DiQChxs","Kr8ysa00b5","v1Hln4W0Tl","14FLR8U2nU","BGaQYk85Ae","s4786gIYvE","OxWIHt98iW","djsrvguMb8","AkKTkuvf7A",
+"OxWIHuZPqg","BpYhVaDGtS","cShY2W3VFH","6q6L9MmKGJ","OxWIHMmsIo","FVMxoCK5W7","S2DfufcwDa","sqVrfsqVrf","Vprf2tlILt","pvgjSoGu6x",
+"wDajXVNCPd","5Drn0uPX7G","iqv4k2Yz7E","tAOsrOUYuF","zz4ZUzz4ZU","Mkgy8FPfSE","5VZjS5Namm","ECMvUcL0aE","HzZT8uupzk","dhSuHjiVBP",
+"W3VFHsqVrf","FjHXRY1mC0","s7MxkRkQke","QYxC0lpF6W","DLhzMI7p2a","zz4ZUVBjhz","oVQp6uupzk","RBhp02hEEU","fqypyzz4ZU","tl72W8RCUA",
+"JXljWvkCHH","PYBf47fsYM","jfREu5IhmG","ZuDtDYh1hF","OUYuFlH1kt","9iGoT2TRI7","7fsYMhe9IA","Dz1R3Kr8ys","s4786VNCPd","i7WMQAmdQd",
+"dQ586i7WMQ","7hyVv9XyT9","5VZjSRmDcr","0BmCy9XyT9","oVQp6xciqp","ZzJHWNxx9V","yEfy9AIYUu","yvOMIYf2Ec","K4GS8rz7Ut","ECMvU16lHc",
+"Cp3mZ8xEKz","Q6hMCW7cTs","I7p2aQYxC0","3weIFFcWrW","DQimpk85Ae","S77LHBbwgA","iB08ljeskS","blLA9rz7Ut","RACujIn3NS","uZPqgNOHsz",
+"0BmCy14FLR","dQ586gdQsS","NOHszzbIYY","BpYhVBGaQY","9GXkXYjB9t","5IhmGFNYIM","RzaZALDk6f","ydG8Ua00b5","OUYuF0Kyfs","Yh1hFtaOXK",
+"lH1kt0Kyfs","tAOsrUvlv4","zz4ZUni2v1","IRh480PktI","9rlg93weIF","NAFuwpv0i7","uupzkZzJHW","zqH0W07n1c","zFgtBOHaBz","ciuWzpAhR1",
+"Pb1pacmXIX","dhSuHt98iW","4dEz67hyVv","sqVrfC2Irc","7hyVvHP433","lH1ktQChxs","8cVD3WreyP","DQimpECMvU","OHaBzzFgtB","Yf2EccQOnv",
+"MaJQsNxx9V","JXljWSjskQ","aez9yP6bcg","l83Ud6q6L9","lViBvqaofN","CNHmvNcICA","ZzJHWAXpwE","Dz1R38hJdt","RmDcrP6bcg","QWxoTnnP8o",
+"s7MxkyluBx","piJSkHzZT8","jtn0XiKqhr","RkQkeru4UG","gIYvE9XyT9","fqypyfqypy","CNHmv45cIH","ogLgcSWfou","jiVBPsqVrf","RpBQmuTacx",
+"7fsYMFLsph","K20wKWMiS3","QChxsuAWyp","zbIYYOxWIH","ksJbykZANm","MK07YuLtKs","jtn0XoQ87r","WreyP7X3uy","LDk6fS77LH","StlDJDz1R3",
+"Gv3FqgtCA5","M6qcGG1RhS","lViBv14FLR","14FLRt59lR","lpF6WKASQ8","Mkgy8oQ87r","wiHrZCK5W7","aL6AJnlaBy","J2mQiUl4a1","618Dis7Mxk",
+"fFDrJ55rfB","5iGN5HlUbF","Y1mC0nlaBy","rKDLJlpF6W","GWqqXni2v1","NAFuw9iGoT","hUTw7v1Hln","oQ87rqQxHP","6q6L9Yw2oU","QWxoTCxVEf",
+"GWqqXyvOMI","hE1QllViBv","k85AeVerEA","QYxC0gf8rI","RkQkemX2GE","K4GS8lCMxy","6q6L9kB5nP","IKxdLAOgEe","CK5W7lViBv","o8UydOHaBz",
+"faHirrz7Ut","pvgjSzz4ZU","FwEJzUmaEv","pmeCdzbIYY","4dEz6hE1Ql","zmLYDatef2","v1HlnBpYhV","lpF6W0YAGH","AOgEe5Namm","lCMxy9iGoT",
+"kB5nPpAhR1","ru4UGqQxHP","KASQ8uupzk","No0QbuoStw","B3qemyofH3","7lUXZTCgPp","bZLvSeuZA5","LbRTHFFDui","ksJbyfaHir","gjUTuI7p2a",
+"5iGN5YOfrY","xciqpZzJHW","yluBxFPfSE","WmadAM6qcG","BpYhVmz8gx","JkzUnD6rBy","JRJQBECMvU","No0QbSbRYy","QnJ1Ssoy9t","DG4sT7fKYU",
+"djsrv8U2nU","sx5GlRACuj","TCgPpuvf7A","29QAzQChxs","WmadAzHF1q","UlU3MDcpWB","FcWrWStlDJ","NOHszMGlTF","nlaByWPmlx","cShY2soy9t",
+"uJScXqaofN","4dEz6tuDyS","pv0i7JJs5m","S77LHyToGW","lm0pDK20wK","xciqpAkKTk","2Yz7EMmKGJ","fcJOytjQxs","7X3uyn1pmO","lsQGomX2GE",
+"MGlTFCxVEf","No0QbYh1hF","CxVEfVNCPd","cL0aEXflUq","7hyVvEoToP","nlaByVjCZq","b29RJt59lR","Mkgy8pT8wu","DQimpLbRTH","In3NSfaHir",
+"hUTw7k85Ae","M3zXLMojnP","JXljWFxX9q","5drc6JKWYR","tlILtFFDui","AIYUuyToGW","MGlTFZJTXH","iqv4kpWiOs","zHF1q5Drn0","oVQp6pWiOs",
+"b29RJlXFOB","LbRTHuJScX","Q6hMCjfREu","GrDg7wiHrZ","BFkb8NAFuw","580YDC2Irc","lm0pDQChxs","Waim6mz8gx","aFFss6AFT0","Mkgy8L7cGc",
+"FwEJz2TRI7","t59lRFhtgl","Q6hMCReKEW","Zv7z0C2Irc","d7vjMv8yFN","yEfy9LbRTH","nnP8o6q6L9","4W0Tl45cIH","WMiS3t98iW","9rlg9XyPZN",
+"5nmWv64s8N","CqqaD5iGN5","6AFT0ZUnqt","9eoRcpFrrl","FnPFBCqqaD","2Yz7EkB5nP","oGu6xWreyP","OHaBzbZLvS","gdQsSVprf2","VIlwPi7WMQ",
+"7X3uyblLA9","S2DfudmoS7","lkMUA7ku1p","BbwgAblLA9","i3pydxciqp","l83UdgdQsS","fcJOy8U2nU","AIYUuy94nw","2DREsZUnqt","IKxdLKsjRK",
+"jfREunlaBy","07n1cThjNn","BFkb8aez9y","suY4xyofH3","8FmFHxReec","NOHszjzUqR","ix74rL7cGc","CdyBVSmGzv","55rfBksJby","gdQsSFVMxo",
+"1j5L8pmeCd","RkQkeIn3NS","MezSWTa8f6","lXFOBRxrsm","Chuy3Rxrsm","yEfy9nnP8o","jSjS30MR5X","5NammIn3NS","jtn0Xv1Hln","5VZjSNo0Qb",
+"lj07Qv1Hln","uLtKsogLgc","s7Mxkatef2","FFDuilm0pD","bZLvSRsQUq","2ZHdkuvf7A","KsjRKwiHrZ","WMiS3MojnP","oVQp60h1b1","a00b59XyT9",
+"AIYUuRxrsm","S2DfuMmsIo","0h1b1lpF6W","8U2nUStlDJ","okgRi5Mg9r","Uvlv4AIYUu","hSSvQFGzgp","5Drn0s93Ml","faHiryluBx","Mm8siFNYIM",
+"CxVEfuZPqg","aDGtSVprf2","QnJ1SVIlwP","5iGN5kB5nP","pv0i7FwEJz","pmeCdC2Irc","uJScX4dEz6","MK07YdmoS7","Uvlv4M3zXL","VLTy6Cp3mZ",
+"cmXIXSs0Zu","faHirfcwDa","zQt6QdQ586","yToGWgdQsS","B3qeml83Ud","DcpWBfLNg8","3otm6tlILt","1v5hHS77LH","ZJTXHrhl0J","yToGWlCMxy",
+"JIqXiguMb8","8RCUA8cVD3","qQxHPn1pmO","jfREufcJOy","FFDuiKZamH","1LB1LNo0Qb","fqypyIBe8k","9iGoTt98iW","aL6AJI7p2a","FnPFBydG8U",
+"n1pmOAOgEe","8FmFHx3LDe","fFDrJVerEA","FjHXRDQimp","pv0i7StlDJ","ZJTXHZv7z0","FxX9qgtCA5","UmaEvWreyP","KASQ88cVD3","K4GS82DREs",
+"blLA95drc6","vkCHHiB08l","5nmWvReKEW","Oz8yZZzJHW","WMiS3iqv4k","iwzGkF6PT2","QnJ1SuJScX","ksJbydpe1v","wiHrZTwano","oVQp65IhmG",
+"FNYIMYOfrY","y94nwhUTw7","jzUqRVerEA","29QAzAIYUu","uZPqgCK5W7","pmeCdGXdoH","rKDLJlViBv","JkzUnn1pmO","DLhzMW3VFH","o8UydfcJOy",
+"16lHcFwEJz","uQIczyvOMI","VLTy6MmKGJ","JKWYRs93Ml","MezSWqQxHP","pAhR1jtn0X","5VZjS0ao3l","Ta8f629QAz","0YAGHY1mC0","LbRTHBFkb8",
+"DG4sTqaofN","BCxeCFhtgl","GWqqXQssNC","DG4sT7lUXZ","IBe8kFPfSE","NOHszpFrrl","uLtKs0YAGH","y94nwBCxeC","s93MlyluBx","rz7UtzqH0W",
+"P6bcgQnJ1S","v8yFNeuZA5","uPX7GSmGzv","RzaZAy94nw","EoToPNo0Qb","Ul4a18TxD7","i3pydblLA9","XflUq5iGN5","M3zXLzQt6Q","Cp3mZIn3NS",
+"0h1b1AgJHQ","FLsphVerEA","vLsmSFcWrW","zqH0Ws4786","lViBvaL6AJ","64s8NZzJHW","WMiS3Chuy3","4W0Tl580YD","M3zXLReKEW","5NammsuY4x",
+"piJSk1v5hH","GrDg7BGaQY","ReKEWG1RhS","uJScXCxVEf","6q6L9wiHrZ","oGu6xcL0aE","YjB9tuAWyp","Mm8siCIShG","FjHXRSjskQ","pvgjSa00b5",
+"RACujVBjhz","jS1ajU3yw5","jfREuulk41","Y1mC0fLNg8","ulk41StlDJ","b29RJv2eC3","yEfy9HlUbF","Dz1R3jSjS3","t59lRYOfrY","a00b5lViBv",
+"jSjS3WPmlx","ZJTXH9GXkX","zHF1qv1Hln","DLhzM64s8N","FnPFBtl72W","G1RhSfqypy","ulk41K4GS8","7Ow5CIjTwP","Cp3mZD6rBy","DcpWBGWqqX",
+"nFqik8xEKz","JJs5mazIWp","CqqaD7Ow5C","64s8NCqqaD","tlILtokgRi","In3NS9y4lw","Nxx9VWMiS3","5nmWvjzUqR","8FmFHGrDg7","vOqCE45cIH",
+"XflUq8cVD3","6AFT0I7p2a","Cp3mZuPX7G","Rxrsmni2v1","ix74ryEfy9","hi5X7BbwgA","Z4I1vpAhR1","Z4I1vIjTwP","8cVD3lViBv","U3yw5m4bxU",
+"9GXkXNo0Qb","HRxd8fmIK1","iB08lNo0Qb","gtCA5ulk41","bgJAzjzUqR","ZuDtDoVQp6","qUJMdCfgr3","I7p2a9GXkX","Cp3mZ9eoRc","ksJby4dEz6",
+"taOXK2ZHdk","HzZT87X3uy","VIlwPlkMUA","SjskQCp3mZ","1LB1LRkQke","GWqqXFxX9q","W7cTsFxX9q","Waim6jfREu","OUqFMlkMUA","uN6r3SmGzv",
+"5nmWvKsjRK","hi5X7Yw2oU","fmIK17lUXZ","OUYuFoQ87r","fFDrJiB08l","fqypytlILt","0Kyfs2ZHdk","ciuWzRsQUq","5VZjSHfyNQ","NcICAQbxXc",
+"dpe1vlweGy","FnPFBaFFss","zbIYYn1pmO","CqqaDmz8gx","EoToPM6qcG","SmGzvogLgc","8TxD7yvOMI","QChxsfFDrJ","ECMvUYjB9t","Oz8yZOxWIH",
+"NhXduyEfy9","QssNCWaim6","9GXkXjtn0X","X6PinjiVBP","uPX7GuTacx","s93MlxReec","xXTI4FVMxo","C2IrcyofH3","t59lRokgRi","euZA5QYxC0",
+"pT8wuEOE1o","5VZjSaL6AJ","1j5L8pT8wu","In3NSNAFuw","wDajXG1RhS","lXFOB580YD","zQt6Qaez9y","CNHmvhE1Ql","ru4UGlm0pD","Pb1pafFDrJ",
+"ix74rbZLvS","LbRTHSbRYy","hYBCKSs0Zu","o8Uyddjsrv","UmaEvs4786","JkzUn7X3uy","2TRI7MaJQs","ogLgcoVQp6","FxX9q0PktI","FcWrWQbxXc",
+"CNHmvQClRL","7X3uyydG8U","oGu6xksJby","JJs5mkB5nP","lm0pD7X3uy","yluBxh1zcH","7ku1pRmDcr","5VZjSWMiS3","fLNg8M3zXL","zz4ZUG1RhS",
+"ZUnqtd7vjM","9y4lwQYxC0","Waim6GXdoH","uupzkFwEJz","W7cTss7Mxk","NAFuwzz4ZU","SbRYysqVrf","2TRI7fcwDa","BCxeCatef2","ogLgc9iGoT",
+"tAOsr2ZHdk","mX2GEO3iyQ","iqv4kECMvU","QworutaOXK","pAhR1uJScX","5drc6pvgjS","2Yz7EM6qcG","FVMxogIYvE","QbxXcAXpwE","qUJMdNcICA",
+"euZA5qaofN","VjCZqrKDLJ","vOqCEMojnP","IjTwPpiJSk","azIWpGWqqX","hYBCKi3pyd","ECMvUK4GS8","HP433QbxXc","SbRYyyofH3","Pb1paZUnqt",
+"8RCUAZJTXH","JKWYRlpF6W","ZUnqtpFrrl","QYxC0BbwgA","4dEz6he9IA","e6e4zvLsmS","QClRL7Ow5C","azIWp7ku1p","ogLgcdhSuH","guMb8G1RhS",
+"BGaQYix74r","RzaZA8cVD3","nlaBydQ586","0ao3llXFOB","s93Ml0ao3l","NcICAlCMxy","P6bcg64s8N","MojnPh1zcH","7X3uyRmDcr","Waim6LbRTH",
+"vLsmSAmdQd","KsjRKpmeCd","BCxeCOxWIH","fqypyVBjhz","XflUq45cIH","LewvMk85Ae","WmadA8xEKz","Vprf28xEKz","hYBCKJRJQB","tAOsrdjsrv",
+"MK07Y7ku1p","lViBvWaim6","CxVEfsuY4x","he9IAiKqhr","RkQkezQt6Q","EdBKcIBe8k","MK07YjzUqR","RBhp0hi5X7","s47868FmFH","ciuWz6q6L9",
+"xciqpt59lR","gjUTuGrDg7","8U2nUaDGtS","64s8NfaHir","uTacxksJby","lpF6W0MR5X","tl72WtjQxs","RkQketvdkD","zY1GYCIShG","WDVWJ9eoRc",
+"S2Dfulm0pD","3otm6okgRi","LbRTH8RCUA","jiVBP9XyT9","v1HlnMK07Y","HRxd83weIF","yToGWMK07Y","aFFssdmoS7","uQIczaFFss","7hyVvFnPFB",
+"2TRI7M3zXL","QssNCQ6Lix","faHir9XyT9","WMiS3GrDg7","pAhR1okgRi","Cp3mZnnP8o","lm0pD8RCUA","AIYUuAmdQd","xXTI4fcwDa","2hEEUHfyNQ",
+"7fsYM2ZHdk","HfyNQdQ586","CxVEfe6e4z","EoToPprNT6","HlUbFMojnP","fFDrJgjUTu","AkKTkDLhzM","BGaQYuTacx","lsQGoHzZT8","W7cTsQbxXc",
+"64s8NWMiS3","fLNg8KsjRK","JJs5mJ2mQi","OUYuFqUJMd","a00b53weIF","Waim6618Di","BbwgArz7Ut","Yf2EcMmKGJ","jS1ajtAOsr","8hJdt64s8N",
+"Nxx9V8cVD3","uupzkMm8si","HP433vLsmS","s4786Mm8si","16lHcWaWsv","NhXdu7ku1p","ZUnqt6AFT0","iKqhrSmGzv","RACuj7ku1p","0Kyfs8RCUA",
+"soy9tn1pmO","ZuDtDMkgy8","n1pmOJJs5m","tjQxsjtn0X","ZUnqtazIWp","CIShGWPmlx","i3pydRmDcr","Dz1R3K20wK","Yw2oUyToGW","7hyVvMkgy8",
+"ReKEWWPmlx","I7p2atlILt","WreyPSmGzv","Yh1hFIn3NS","JXljW7lUXZ","UlU3MEoToP","VNCPdYf2Ec","PYBf4Pb1pa","J2mQi4dEz6","aFFssn8pJ9",
+"IKxdLfLNg8","8hJdtmX2GE","lCMxyaFFss","jiVBPWreyP","8U2nUQbxXc","Z4I1vGv3Fq","taOXKHzZT8","5Mg9raFFss","XflUqLewvM","7lUXZEoToP",
+"ZUnqtgIYvE","hE1QlLewvM","pAhR1JKWYR","sx5Gl580YD","s4786MojnP","Qworu7hyVv","S77LHVBjhz","Oz8yZ5iGN5","2ZHdk5IhmG","WaWsvGSQwj",
+"HRxd86AFT0","uLtKsXflUq","ZzJHWOHaBz","Ss0ZuDG4sT","jzUqRTa8f6","sqVrfuoStw","IRh48FnPFB","Y1mC0vkCHH","s93MlI7p2a","WMiS3cShY2",
+"he9IAksJby","faHir16lHc","StlDJ5VZjS","blLA9ZuDtD","POUYS3otm6","iwzGkQworu","jtn0XKZamH","0BmCyBCxeC","v1Hlns7Mxk","4W0TltuDyS",
+"8cVD33otm6","uvf7AjSjS3","xciqp618Di","JIqXiStlDJ","1v5hHFGzgp","EoToPbgJAz","GrDg716lHc","pvgjSsqVrf","ZJTXH29QAz","pmeCdqQxHP",
+"YOfrYP6bcg","GWqqXjS1aj","KsjRKBbwgA","ciuWzRpBQm","StlDJMkgy8","tvdkD55rfB","WMiS3uupzk","VBjhz7fKYU","JRJQBo8Uyd","taOXKStlDJ",
+"aL6AJFNYIM","29QAzX6Pin","x3LDeIn3NS","MmsIo4W0Tl","9eoRcChuy3","blLA9OHaBz","o8Uyds4786","t59lRgIYvE","W3VFHFNYIM","oQ87rlXFOB",
+"k85AeAmdQd","FPfSE7ku1p","JRJQBVIlwP","Gv3FqlH1kt","vkCHH618Di","OxWIH8TxD7","UmaEvDLhzM","MK07YogLgc","2Yz7EOHaBz","5nmWvUmaEv",
+"b29RJMK07Y","ni2v1Z4I1v","lkMUA8TxD7","7fsYMd85a9","guMb8cShY2","aez9yXflUq","cmXIXX6Pin","3otm6IBe8k","0Wr5ypv0i7","hYBCKazIWp",
+"0PktICfgr3","UmaEvjS1aj","ydG8Us4786","Vprf2XflUq","Y1mC0pvgjS","oQ87riB08l","0BmCyAIYUu","ogLgcru4UG","9XyT9RsQUq","NcICAuQIcz",
+"CK5W7iB08l","ogLgc2Nslm","TXQ0ZzbIYY","64s8NKZamH","pv0i7nnP8o","7Ow5Cd85a9","KsjRKuAWyp","C2IrcKr8ys","yvOMIxciqp","fqypyFGzgp",
+"cL0aEP6bcg","WMiS3n8pJ9","3otm6v8yFN","HlUbFReKEW","IKxdLxciqp","yvOMI5ZaEz","gIYvEvLsmS","2DREsXflUq","aDGtSpv0i7","5NammBCxeC",
+"djsrv2ZHdk","faHirkZANm","FVMxo7hyVv","vkCHHMK07Y","M3zXLWaWsv","dQ586JJs5m","HzZT8hi5X7","Dz1R3pFrrl","6q6L9mX2GE","HP433DLhzM",
+"ZuDtDgIYvE","Mkgy8FwEJz","k85AelCMxy","WDVWJMGlTF","FxX9qJXljW","JIqXiiKqhr","bgJAz7hyVv","M3zXLGSQwj","Nxx9VogLgc","CdyBVuJScX",
+"FGzgp48cHL","kZANmTCgPp","gIYvE07n1c","kZANmsx5Gl","xciqplH1kt","azIWpqUJMd","jiVBPuvf7A","CNHmvjS1aj","MezSWZUnqt","16lHc1j5L8",
+"9GXkXWmadA","uQIcz8hJdt","AgJHQ2DREs","J2mQipAhR1","nlaByXflUq","X6PinI7p2a","8hJdtuupzk","d7vjMVprf2","pAhR124ARF","dpe1vyEfy9",
+"2Yz7E5IhmG","hUTw74QMc9","GSQwj4QMc9","fFDrJkB5nP","BpYhVY1mC0","ReKEWzz4ZU","yToGWYf2Ec","8TxD7MezSW","zz4ZUZuDtD","9iGoTjeskS",
+"pT8wuazIWp","KZamHfcwDa","MGlTFhYBCK","dQ586MaJQs","uN6r3AgJHQ","tAOsrcL0aE","WaWsv07n1c","wDajX48cHL","hUTw7Uvlv4","rKDLJCK5W7",
+"8U2nU14FLR","YjB9tSjskQ","9XyT9CIShG","xXTI4ThjNn","WmadAPYBf4","7Ow5CyluBx","XflUqxXTI4","t59lRVBjhz","JRJQBlCMxy","okgRiL7cGc",
+"POUYS9iGoT","ZJTXHF6PT2","5NammSmGzv","djsrvIKxdL","pWiOsiqv4k","YjB9tNxx9V","iqv4k1j5L8","a00b5jfREu","4dEz6FnPFB","8cVD32DREs",
+"2hEEUVerEA","pvgjSfFDrJ","jfREuiwzGk","cL0aEThjNn","K4GS8KsjRK","pv0i7XyPZN","GSQwjRsQUq","XyPZNt98iW","HfyNQaez9y","pmeCda00b5",
+"DG4sT5drc6","Q6hMCpT8wu","iB08lX6Pin","AXpwEtaOXK","X6PinuAWyp","Cp3mZIBe8k","AIYUuzY1GY","ZhwG1IjTwP","JkzUnRzaZA","aFFssJXljW",
+"5ZaEzRpBQm","JRJQByvOMI","ksJbySjskQ","blLA98TxD7","DcpWBaez9y","MezSW2Yz7E","WmadA2hEEU","JXljW2Nslm","he9IAWDVWJ","iwzGkZv7z0",
+"wiHrZCNHmv","Pb1paReKEW","azIWp48cHL","ni2v1soy9t","ru4UGkZANm","JRJQBpmeCd","jtn0XTa8f6","TXQ0Zs7Mxk","sx5Gla00b5","HzZT8JkzUn",
+"pmeCdOUqFM","yvOMIvLsmS","JKWYR0Kyfs","vOqCEI7p2a","fcJOy580YD","JXljWpv0i7","ReKEW2Nslm","atef2lViBv","rhl0Jiqv4k","OUqFMDQimp",
+"aez9ysqVrf","uJScXxReec","14FLR0MR5X","VerEAB3qem","OxWIHm4bxU","07n1cRBhp0","S2Dfu5iGN5","UlU3MFLsph","Nxx9Vuupzk","dhSuHPYBf4",
+"NcICAsoy9t","KASQ8SjskQ","EoToPU3yw5","lXFOBAkKTk","DQimpuQIcz","8cVD3CxVEf","lweGylCMxy","FPfSEoGu6x","lCMxyIRh48","faHiratef2",
+"lXFOBfqypy","uLtKsS77LH","zHF1qQChxs","Ul4a1e6e4z","gIYvEs7Mxk","FLsphIn3NS","jfREuGWqqX","i7WMQxReec","h1zcH7fKYU","CdyBV7hyVv",
+"rKDLJ64s8N","F6PT2CIShG","0Wr5yhSSvQ","yToGWEdBKc","Mkgy8AOgEe","24ARFuupzk","wDajXTCgPp","1LB1LDz1R3","9eoRc5Namm","QnJ1Saez9y",
+"8xEKzL7cGc","XflUqcL0aE","Mkgy8rhl0J","5drc6hi5X7","29QAzru4UG","NAFuwWreyP","Yh1hFKr8ys","WMiS3QClRL","djsrvxReec","uZPqg8hJdt",
+"s7MxkhSSvQ","GSQwj48cHL","xciqpIRh48","HlUbFWMiS3","lkMUACqqaD","b29RJSmGzv","pAhR1K20wK","8xEKzI7p2a","kZANmfFDrJ","soy9tMaJQs",
+"tlILtlpF6W","tAOsrogLgc","zqH0Waez9y","sqVrflkMUA","Waim6W3VFH","yEfy93otm6","fmIK1uN6r3","5drc6CqqaD","O3iyQrz7Ut","45cIHCp3mZ",
+"ThjNnogLgc","5IhmGQYxC0","VerEALDk6f","NOHszzz4ZU","uZPqgpWiOs","IBe8k8U2nU","wDajXIn3NS","CqqaDTCgPp","hSSvQ0h1b1","EoToPmX2GE",
+"i3pyd64s8N","vOqCEgjUTu","5nmWvRpBQm","CqqaDyvOMI","hSSvQCK5W7","pWiOs14FLR","azIWpv2eC3","zmLYDZUnqt","QYxC0GWqqX","gf8rI55rfB",
+"ECMvU8FmFH","k85Ae14FLR","v1Hlny94nw","TXQ0ZGSQwj","faHirFxX9q","aDGtSt59lR","M6qcG45cIH","2hEEUvkCHH","0Wr5yFhtgl","zY1GYnFqik",
+"taOXKNAFuw","dmoS7ni2v1","7fKYUMGlTF","5Mg9rFVMxo","hi5X7e6e4z","Uvlv4VBjhz","TCgPpVNCPd","rhl0JVBjhz","2ZHdk7hyVv","SbRYyQbxXc",
+"Ul4a1uLtKs","LbRTHCK5W7","b29RJRxrsm","Dz1R3XflUq","yofH3580YD","lCMxyRsQUq","5VZjSoQ87r","6AFT09y4lw","yofH3jeskS","ogLgc14FLR",
+"lsQGoqUJMd","CIShG8TxD7","fcwDaTCgPp","ReKEWJRJQB","W7cTsix74r","0BmCysuY4x","zHF1qB3qem","dmoS7FLsph","Waim6Zv7z0","1v5hHx3LDe",
+"lkMUAMmsIo","fqypylj07Q","7hyVvxReec","jS1ajQssNC","Z4I1v9y4lw","BFkb88U2nU","LDk6fm4bxU","Zv7z0BCxeC","sqVrfDz1R3","nnP8oMGlTF",
+"ogLgc2ZHdk","45cIHPOUYS","StlDJFLsph","RACujPYBf4","lH1kt0MR5X","euZA5HP433","mX2GEPb1pa","pT8wulpF6W","uPX7GtAOsr","W7cTsO3iyQ",
+"CqqaDCNHmv","M3zXLFwEJz","L7cGcFVMxo","zY1GYlj07Q","Pb1padmoS7","DQimppiJSk","gtCA5pAhR1","5Namm7ku1p","AgJHQ0h1b1","D6rBy55rfB",
+"VLTy6ThjNn","Pb1paJXljW","uLtKs5iGN5","AkKTkEoToP","hSSvQkZANm","DQimpjtn0X","8RCUAW3VFH","hi5X72TRI7","VjCZqZv7z0","64s8NMaJQs",
+"Vprf25drc6","tuDySazIWp","JRJQBmX2GE","uZPqgJXljW","lj07QprNT6","I7p2aVNCPd","29QAzfqypy","MaJQspT8wu","ZuDtD5IhmG","CNHmvuAWyp",
+"wiHrZFNYIM","M6qcG5IhmG","W3VFHFFDui","FNYIMSjskQ","zz4ZUxciqp","0ao3lFPfSE","DG4sTZv7z0","QYxC0iB08l","iKqhr4dEz6","guMb8fqypy",
+"DQimp5nmWv","VLTy6BFkb8","Ta8f6SWfou","dmoS7pT8wu","0PktI2ZHdk","4QMc92ZHdk","QssNC24ARF","TCgPpMojnP","8RCUAKZamH","GrDg7d85a9",
+"2TRI79GXkX","2Yz7Eru4UG","suY4xblLA9","No0Qb2Nslm","C2Irc9iGoT","1LB1LLewvM","vOqCEDG4sT","0ao3l7fsYM","wiHrZjiVBP","CxVEfVLTy6",
+"VjCZqsuY4x","K20wKXflUq","7hyVvjiVBP","8U2nUM6qcG","Chuy3iB08l","OHaBztl72W","CxVEfuoStw","nlaByhe9IA","pvgjSThjNn","jS1ajQworu",
+"zY1GY8xEKz","SWfouuTacx","lm0pDChuy3","IjTwPydG8U","DQimp8cVD3","uN6r3NhXdu","uvf7AuLtKs","4dEz6aL6AJ","ix74rU3yw5","ZhwG1Nxx9V",
+"k85AeZhwG1","vLsmSuoStw","JXljWuPX7G","pAhR1FVMxo","qQxHPZJTXH","IjTwPDG4sT","xciqpWmadA","6q6L9Ta8f6","DG4sTGSQwj","IKxdLZzJHW",
+"NOHszFcWrW","fcJOyZzJHW","UlU3MO3iyQ","FwEJzCdyBV","JXljWWaim6","uTacxqaofN","GrDg77Ow5C","ogLgcix74r","Nxx9VnFqik","8cVD3Kr8ys",
+"CK5W7uoStw","zqH0WUl4a1","1j5L8xXTI4","ThjNnvkCHH","ThjNntl72W","9GXkXa00b5","Yf2EcGWqqX","FcWrWvLsmS","ReKEW64s8N","GXdoHI7p2a",
+"RBhp0bgJAz","o8Uydgf8rI","1LB1Lo8Uyd","3otm6HzZT8","48cHLjzUqR","Ul4a1gjUTu","OxWIHdhSuH","0ao3lIn3NS","6q6L9s4786","WmadA9iGoT",
+"CdyBVJIqXi","y94nwFGzgp","GXdoHL7cGc","QYxC07hyVv","KsjRKvLsmS","cShY2ksJby","Nxx9VdmoS7","1j5L8d85a9","1v5hH64s8N","L7cGcQnJ1S",
+"8U2nUjSjS3","VIlwPpT8wu","BpYhVNcICA","8xEKz5Drn0","gjUTu9XyT9","o8UydazIWp","vLsmSoGu6x","vLsmSY1mC0","ciuWzDz1R3","AkKTkAgJHQ",
+"RzaZASmGzv","yEfy9hUTw7","Ta8f67fKYU","uJScXBbwgA","l83UdLDk6f","BpYhVSbRYy","16lHcQnJ1S","GXdoHGSQwj","lkMUAlweGy","djsrvkB5nP",
+"hSSvQZ4I1v","RsQUqGSQwj","Q6Lix1j5L8","4dEz6JIqXi","uJScX5iGN5","mz8gxPOUYS","SWfouIjTwP","s93MlpWiOs","yluBxzQt6Q","HfyNQaFFss",
+"hSSvQi3pyd","pvgjSciuWz","0BmCyD6rBy","ciuWz07n1c","CIShG5Mg9r","zQt6QMmsIo","FVMxo5Namm","MmsIoF6PT2","LDk6fEoToP","brhlQsuY4x",
+"uN6r3zmLYD","cShY20Wr5y","K4GS8h1zcH","1v5hHPOUYS","8FmFHqaofN","0BmCySs0Zu","QClRL0Kyfs","t59lRzFgtB","yEfy9RkQke","HfyNQn1pmO",
+"IRh48vLsmS","x3LDeXyPZN","IRh48HlUbF","AIYUuL7cGc","WaWsv618Di","k85AelViBv","RzaZA0Wr5y","JKWYRoQ87r","7fsYM48cHL","Pb1pa5iGN5",
+"guMb8pv0i7","45cIHgjUTu","8RCUAt59lR","No0QbWaWsv","9iGoTzFgtB","Mkgy8YjB9t","ciuWzI7p2a","mz8gxdhSuH","5drc6uTacx","lj07QjzUqR",
+"QYxC0GXdoH","TCgPpjfREu","PYBf4Rxrsm","5NammguMb8","8hJdtNo0Qb","FnPFBgdQsS","lweGyFwEJz","580YDEdBKc","taOXKQClRL","gIYvEIBe8k",
+"HRxd8JXljW","FcWrWuN6r3","Yh1hF2ZHdk","uJScX8cVD3","3weIFy94nw","0YAGHcL0aE","FcWrW24ARF","Uvlv4MK07Y","fLNg8gtCA5","iB08lU3yw5",
+"fqypy16lHc","TwanoMmKGJ","bgJAz0PktI","IBe8koQ87r","MojnPfqypy","FjHXRJ2mQi","SbRYyOxWIH","QClRLjiVBP","NOHszmX2GE","xXTI4HlUbF",
+"ZuDtDTXQ0Z","G1RhS0h1b1","pT8wutAOsr","CNHmvdpe1v","U3yw57fKYU","taOXKciuWz","Z4I1vI7p2a","WPmlxfqypy","d85a9EoToP","5iGN55Mg9r",
+"ni2v1tlILt","M6qcGRkQke","qUJMdn1pmO","FwEJzTCgPp","0BmCyHRxd8","WmadAPOUYS","UmaEvZhwG1","CqqaDnnP8o","8cVD3UmaEv","pvgjSNOHsz",
+"gIYvEblLA9","fFDrJzFgtB","uTacxuZPqg","jeskSCIShG","uPX7GYf2Ec","618DiM6qcG","suY4xpWiOs","vOqCEJkzUn","zQt6QazIWp","RmDcrcShY2",
+"5IhmGuQIcz","QWxoTjSjS3","FcWrWIRh48","GrDg7Qworu","NcICAatef2","K20wKjiVBP","4dEz6dpe1v","1v5hHuTacx","ThjNndpe1v","G1RhSv2eC3",
+"d85a9dmoS7","nlaByGSQwj","SWfouoVQp6","7hyVvMK07Y","K20wKVBjhz","WaWsvQbxXc","FLsphW7cTs","lpF6WOUqFM","ogLgcuN6r3","5ZaEz14FLR",
+"WreyPpvgjS","WPmlxsuY4x","IRh48atef2","8xEKzIn3NS","uvf7AfcwDa","pmeCdaL6AJ","yluBxMojnP","euZA5hYBCK","iB08ld85a9","RmDcr0BmCy",
+"KZamHlViBv","In3NSmX2GE","QworujfREu","ix74rsuY4x","pWiOss7Mxk","Uvlv4GWqqX","0ao3lgf8rI","07n1cb29RJ","45cIHy94nw","FGzgpVprf2",
+"nFqikhSSvQ","F6PT214FLR","VIlwPQnJ1S","k85Ae8TxD7","gf8rIGSQwj","d7vjMJXljW","vLsmSuN6r3","MK07Ylm0pD","VjCZqfcwDa","MmsIo2TRI7",
+"tlILtYw2oU","faHirRmDcr","yvOMIoQ87r","Zv7z0EOE1o","ydG8UQssNC","guMb8W3VFH","0PktIWMiS3","LDk6fIKxdL","dmoS7nFqik","VjCZqNo0Qb",
+"C2IrcZv7z0","2TRI7sqVrf","16lHcVNCPd","rKDLJCfgr3","580YDoQ87r","iKqhrX6Pin","lm0pDlkMUA","J2mQilH1kt","fcJOyeuZA5","0PktIXflUq",
+"lweGyiwzGk","WPmlx9GXkX","580YDni2v1","CxVEffmIK1","atef2atef2","OUYuFsoy9t","VerEAfqypy","LbRTHxReec","Chuy3xXTI4","RzaZAjSjS3",
+"GrDg7lm0pD","IRh48Fhtgl","gIYvEYOfrY","EOE1oO3iyQ","48cHLEdBKc","yEfy9Z4I1v","MezSWWreyP","7fsYMuTacx","bgJAzPOUYS","rz7Ut2ZHdk",
+"kB5nPzqH0W","DcpWBM3zXL","ulk411v5hH","SbRYyvLsmS","QbxXcFwEJz","Vprf2WmadA","pmeCdzFgtB","CqqaDd7vjM","oGu6xZv7z0","zmLYDWaim6",
+"AgJHQsuY4x","NOHsziB08l","OUYuFTa8f6","xReeche9IA","WDVWJJRJQB","W3VFHiKqhr","zbIYY2hEEU","EoToPIRh48","lH1ktdjsrv","7fKYUmz8gx",
+"s93MlpvgjS","2Yz7EjiVBP","J2mQitl72W","ksJbyMGlTF","m4bxUIKxdL","Pb1paCxVEf","0Kyfs9rlg9","dmoS764s8N","k85AejS1aj","aL6AJnFqik",
+"MmsIo55rfB","SjskQYOfrY","JRJQBbgJAz","jzUqRvkCHH","55rfB2ZHdk","O3iyQwiHrZ","hYBCKI7p2a","QworuzQt6Q","AgJHQwDajX","C2IrcMojnP",
+"4QMc9fLNg8","i7WMQIn3NS","7Ow5CMm8si","fFDrJtjQxs","OxWIH9eoRc","NAFuwYjB9t","aFFsszQt6Q","lsQGo5IhmG","QssNCNhXdu","fcJOyS2Dfu",
+"FxX9q3otm6","soy9tX6Pin","14FLRHlUbF","MojnPlXFOB","s7MxkHP433","zQt6Q618Di","b29RJvOqCE","jeskSQChxs","FFDuitjQxs","xReec0PktI",
+"L7cGcJ2mQi","FxX9qlkMUA","cShY2ix74r","5NammlXFOB","vLsmSMm8si","iKqhrMmsIo","EOE1oNOHsz","45cIH55rfB","QnJ1Se6e4z","U3yw5fmIK1",
+"NOHszChuy3","pmeCddpe1v","WPmlxoGu6x","lpF6W9eoRc","Fhtgl2Yz7E","Yh1hF7ku1p","HlUbFYw2oU","oVQp6S2Dfu","bZLvS7fsYM","lm0pD5Drn0",
+"L7cGc7fsYM","dpe1vEoToP","hSSvQQYxC0","lj07QRACuj","IRh48AOgEe","ThjNnBbwgA","x3LDeVBjhz","FnPFBCxVEf","fmIK1IBe8k","fLNg814FLR",
+"HzZT8yluBx","AgJHQpAhR1","7Ow5CazIWp","yofH3m4bxU","tjQxs9eoRc","aDGtS618Di","KZamHO3iyQ","MojnPgtCA5","s93Mlt59lR","ReKEWoVQp6",
+"7X3uyFVMxo","GWqqXRpBQm","9y4lwblLA9","POUYSfcJOy","FGzgpuPX7G","VNCPdTXQ0Z","tl72W6AFT0","dhSuHlj07Q","uAWypv2eC3","6q6L90h1b1",
+"45cIHTa8f6","2hEEUS2Dfu","piJSkzbIYY","ciuWzhE1Ql","48cHLuZPqg","KsjRKzmLYD","AXpwEM3zXL","PYBf4KsjRK","WmadAAkKTk","KsjRKYf2Ec",
+"hSSvQtvdkD","HlUbFIBe8k","Vprf2BFkb8","M6qcGm4bxU","zY1GYNcICA","MojnPpiJSk","hE1QlWMiS3","i7WMQ5drc6","zmLYDdpe1v","e6e4zuJScX",
+"kZANmHP433","n8pJ9EdBKc","5Drn0jSjS3","faHirrhl0J","0PktI07n1c","8cVD3pWiOs","zHF1quvf7A","BbwgAbZLvS","OHaBz9eoRc","JXljWiB08l",
+"s47867hyVv","cL0aEdhSuH","M3zXLprNT6","Uvlv4prNT6","9iGoTuJScX","5VZjSzqH0W","ogLgcjtn0X","prNT62Nslm","DQimpdQ586","0ao3llkMUA",
+"0ao3l7lUXZ","yofH3LewvM","JkzUnpWiOs","uZPqgMmKGJ","cShY2FPfSE","KsjRKv8yFN","2Nslm0Wr5y","D6rBylj07Q","45cIHjzUqR","fcJOyn8pJ9",
+"zQt6Qv8yFN","Cp3mZ5drc6","fcwDaxReec","gIYvE0PktI","8FmFHqUJMd","ZJTXHiKqhr","zz4ZUNxx9V","ReKEWTCgPp","FnPFBxciqp","vLsmSB3qem",
+"OUqFMjSjS3","FGzgpsqVrf","3weIFSjskQ","gjUTulweGy","zz4ZUThjNn","jS1aj0Kyfs","uLtKsQnJ1S","VLTy63otm6","FFDuieuZA5","guMb8s4786",
+"gjUTu618Di","euZA5DLhzM","2Yz7EO3iyQ","fqypytl72W","vOqCE2TRI7","prNT6iKqhr","DcpWBrKDLJ","lH1ktfFDrJ","0PktIfqypy","F6PT2pT8wu",
+"tlILtvOqCE","QChxsjiVBP","VBjhzogLgc","prNT6CqqaD","lj07QG1RhS","dQ586GXdoH","gtCA5e6e4z","GXdoHoGu6x","uLtKse6e4z","mX2GEBFkb8",
+"4dEz6tvdkD","5ZaEzksJby","tAOsrzz4ZU","d85a9DLhzM","Mkgy8CxVEf","QYxC0fLNg8","SjskQLewvM","s7MxkCdyBV","gf8rIcL0aE","9iGoTkZANm",
+"FjHXRK4GS8","bZLvSQnJ1S","AmdQdFFDui","RzaZAGWqqX","CxVEfBpYhV","5NammAIYUu","7lUXZ0PktI","Zv7z0FNYIM","pmeCdOUYuF","8FmFHM3zXL",
+"mX2GEl83Ud","OHaBz0YAGH","tl72WDLhzM","uoStwHzZT8","RACujLDk6f","POUYSFFDui","blLA90BmCy","tlILtVprf2","P6bcgjSjS3","P6bcgsqVrf",
+"24ARFVIlwP","fFDrJFhtgl","IRh48aL6AJ","WreyPfLNg8","X6PinpT8wu","vOqCE3weIF","1j5L83weIF","MmKGJOz8yZ","jSjS3tAOsr","XyPZNydG8U",
+"oQ87rWPmlx","C2IrcKASQ8","mz8gxzY1GY","55rfBqaofN","tlILttaOXK","Vprf2hSSvQ","tjQxsru4UG","uQIcztuDyS","Mm8si48cHL","FcWrWBFkb8",
+"1j5L8K20wK","ogLgcuoStw","ZUnqtfLNg8","l83UdJXljW","bZLvSfFDrJ","cShY2ydG8U","QbxXc29QAz","zbIYYpFrrl","FNYIMVLTy6","QClRLuvf7A",
+"No0QbFxX9q","O3iyQo8Uyd","rhl0JuAWyp","tvdkDoGu6x","CNHmvru4UG","GWqqXlViBv","CxVEfyofH3","64s8NGrDg7","DQimpvLsmS","OxWIHOHaBz",
+"P6bcgzHF1q","fLNg8ZUnqt","Q6hMCG1RhS","U3yw5L7cGc","1LB1LKZamH","F6PT2o8Uyd","QbxXcG1RhS","uoStwyluBx","v8yFNiqv4k","1j5L855rfB",
+"YOfrYO3iyQ","WaWsvvLsmS","SmGzvPOUYS","BbwgAPb1pa","UlU3MXyPZN","Y1mC0LbRTH","DLhzMFxX9q","v8yFNIjTwP","16lHcFxX9q","Twano580YD",
+"oVQp6FjHXR","atef23otm6","d85a9t59lR","JKWYRi7WMQ","VerEApiJSk","kZANmix74r","ni2v1oVQp6","ciuWzulk41","CNHmvv1Hln","nFqiknnP8o",
+"jiVBPzz4ZU","uLtKstAOsr","2TRI7t59lR","fcwDa7fsYM","9eoRc45cIH","jSjS3RkQke","S2Dfu7hyVv","pmeCdGv3Fq","No0QbqUJMd","jfREuogLgc",
+"0Kyfs8xEKz","zz4ZUtvdkD","s4786F6PT2","AXpwEJkzUn","YOfrY14FLR","SmGzvIjTwP","iKqhrW7cTs","XflUqLbRTH","0PktIgIYvE","Nxx9Vlj07Q",
+"dpe1vZUnqt","m4bxUVerEA","v8yFNgIYvE","vkCHHulk41","tuDyS55rfB","pWiOsMaJQs","x3LDehYBCK","C2Irc48cHL","FNYIM0h1b1","2DREsrhl0J",
+"VjCZqFPfSE","Ss0ZuMmKGJ","ru4UGGXdoH","M3zXLCxVEf","2DREsYOfrY","CdyBVgIYvE","hE1QlRzaZA","ZUnqtLewvM","ydG8U9eoRc","LbRTHy94nw",
+"J2mQitvdkD","hE1QlGv3Fq","qaofNVjCZq","gtCA5SWfou","16lHcQClRL","euZA5bZLvS","J2mQiNxx9V","VjCZqMK07Y","WDVWJ8FmFH","Vprf2cmXIX",
+"Ss0Zu5Mg9r","B3qem9rlg9","d85a9NOHsz","StlDJm4bxU","WMiS32ZHdk","07n1cyofH3","2ZHdk9GXkX","8TxD7s93Ml","v8yFN9rlg9","ThjNnDQimp",
+"BpYhVX6Pin","2TRI7ZUnqt","LewvMSs0Zu","kZANmlsQGo","Cfgr3zz4ZU","0MR5XXflUq","AkKTkxciqp","Y1mC0fcJOy","GSQwjMm8si","Cp3mZ7hyVv",
+"uZPqgM6qcG","jiVBPVprf2","e6e4zQWxoT","QClRLuupzk","L7cGcYf2Ec","pWiOslH1kt","o8UydyvOMI","TXQ0ZFnPFB","W3VFHTa8f6","ulk41pFrrl",
+"gIYvEIRh48","BFkb8QYxC0","WreyPuQIcz","DLhzMb29RJ","580YDJJs5m","C2IrcQssNC","cmXIXCdyBV","S77LHs7Mxk","MojnPFNYIM","ZuDtDdjsrv",
+"a00b5ECMvU","CNHmvCp3mZ","24ARFGv3Fq","vLsmSjzUqR","lViBvkB5nP","fLNg816lHc","QssNC3weIF","TCgPpOHaBz","2Yz7EQ6Lix","8RCUAxReec",
+"zQt6QVLTy6","M3zXL9GXkX","tjQxsReKEW","0PktI7lUXZ","Mkgy8n8pJ9","2hEEU7fsYM","taOXKiKqhr","4dEz6KASQ8","lkMUAPb1pa","FGzgpIRh48",
+"euZA5JJs5m","uAWyp48cHL","SjskQWaWsv","a00b5Z4I1v","brhlQtvdkD","AOgEeuLtKs","rKDLJkB5nP","8RCUA2ZHdk","L7cGcHzZT8","580YD45cIH",
+"UlU3MzmLYD","cShY2XflUq","cShY2pmeCd","lH1kts93Ml","9XyT95drc6","4dEz6wDajX","cL0aESmGzv","QClRLRpBQm","POUYS0h1b1","fLNg8Rxrsm",
+"8xEKzHRxd8","tl72WWreyP","lj07QQnJ1S","P6bcgrhl0J","3weIFEoToP","hE1QljSjS3","xXTI4StlDJ","lXFOBI7p2a","Cp3mZiKqhr","aez9yhi5X7",
+"Yw2oUQnJ1S","AIYUulpF6W","cmXIXGSQwj","EdBKcpvgjS","jSjS3K20wK","QClRLIRh48","tvdkD2Nslm","9y4lwUvlv4","uJScX45cIH","4W0Tl3weIF",
+"VjCZquTacx","FGzgpX6Pin","WaWsvS2Dfu","FNYIMjzUqR","7Ow5CzFgtB","Kr8ysdmoS7","zz4ZU2Nslm","XflUqPOUYS","S77LH5iGN5","NOHsz9rlg9",
+"Fhtgl5Namm","QChxsru4UG","0MR5XCdyBV","1j5L8JkzUn","atef2wDajX","0KyfslpF6W","nFqikOz8yZ","0KyfsvkCHH","SjskQ9rlg9","VjCZqnlaBy",
+"lH1ktsoy9t","J2mQigf8rI","45cIHs7Mxk","lCMxy8xEKz","aDGtSjSjS3","uPX7GEoToP","iB08lW7cTs","GWqqXFFDui","RmDcrMkgy8","RzaZAsqVrf",
+"F6PT2VBjhz","SWfousuY4x","m4bxU8xEKz","uJScXW3VFH","0PktIYw2oU","GrDg77fKYU","24ARFuJScX","7X3uy5Drn0","3otm65Namm","gdQsSQ6Lix",
+"YOfrYIBe8k","DQimpZJTXH","2DREsZzJHW","RxrsmjfREu","uTacxjS1aj","CdyBVguMb8","3otm6uJScX","0PktISmGzv","Ta8f6M6qcG","tuDySx3LDe",
+"FxX9qMkgy8","MaJQsNhXdu","dhSuHciuWz","sqVrflpF6W","he9IAwiHrZ","AOgEeZzJHW","7ku1pTa8f6","RACujmX2GE","0MR5XxReec","5VZjSZzJHW",
+"C2Ircuvf7A","cL0aEUl4a1","tjQxs5ZaEz","VIlwPhi5X7","SWfouaez9y","zbIYYuvf7A","vOqCEK20wK","soy9ttuDyS","jzUqRWreyP","AkKTk3otm6",
+"EOE1oTa8f6","WmadAOz8yZ","PYBf4MmsIo","k85AesqVrf","guMb8wiHrZ","Yh1hFK4GS8","gdQsSgIYvE","pFrrlQnJ1S","jtn0XNhXdu","0ao3lQ6hMC",
+"d7vjMfcJOy","kB5nPQWxoT","W7cTspFrrl","d7vjMfaHir","WreyPdhSuH","ciuWz2Yz7E","Y1mC0faHir","BFkb8azIWp","Q6LixlpF6W","9XyT9s7Mxk",
+"LewvMMm8si","iB08luPX7G","ZhwG1o8Uyd","qQxHPCNHmv","oQ87r48cHL","he9IA45cIH","CNHmvVNCPd","tvdkDSWfou","l83Udzz4ZU","L7cGc5Namm",
+"m4bxUAXpwE","Q6hMCjSjS3","yToGWtAOsr","JKWYRvOqCE","aDGtSuJScX","OxWIHU3yw5","JXljWgtCA5","QworuCxVEf","CK5W7tjQxs","QChxsiqv4k",
+"n8pJ9C2Irc","8cVD3ReKEW","lweGyCp3mZ","0Wr5yblLA9","MK07YRACuj","29QAzU3yw5","6q6L9EOE1o","BbwgAMojnP","zmLYD6q6L9","lsQGoQssNC",
+"ZUnqtksJby","t98iWlCMxy","NOHsz2hEEU","No0Qb7fKYU","HP433sqVrf","1j5L8l83Ud","jeskSiB08l","QbxXc9eoRc","sqVrfFjHXR","6AFT0n8pJ9",
+"2Yz7EcQOnv","2hEEUciuWz","uvf7ANxx9V","VjCZqEdBKc","JIqXi3otm6","jiVBPZzJHW","jS1ajIBe8k","mz8gxCqqaD","CNHmv0YAGH","kB5nPi7WMQ",
+"48cHLNOHsz","i3pydpAhR1","POUYSjSjS3","9eoRcTCgPp","VjCZqFnPFB","cmXIXsuY4x","rKDLJni2v1","hE1QlbZLvS","taOXKvOqCE","pWiOsHlUbF",
+"Pb1paazIWp","Uvlv4n8pJ9","faHirPYBf4","dhSuHgjUTu","IRh48G1RhS","iKqhrrz7Ut","S77LHydG8U","K20wKgIYvE","nFqikzQt6Q","7X3uyyluBx",
+"2hEEUjzUqR","d85a9QWxoT","24ARFUl4a1","SWfou5nmWv","Q6LixlCMxy","s93MlAIYUu","2DREs7X3uy","ZzJHWIKxdL","dpe1vIRh48","ydG8U9XyT9",
+"QWxoTHRxd8","S77LHsx5Gl","ydG8ULewvM","FPfSELewvM","16lHcBpYhV","8cVD3580YD","uN6r329QAz","rhl0J48cHL","7X3uyjtn0X","Ta8f6ru4UG",
+"MezSWCK5W7","0PktIC2Irc","29QAzHfyNQ","WreyPjfREu","5NammHlUbF","IBe8kjS1aj","yofH3tlILt","JXljWVjCZq","QChxs14FLR","zqH0WFNYIM",
+"3weIFhe9IA","vOqCEbgJAz","WMiS3qQxHP","y94nwlXFOB","CIShGIjTwP","HlUbFOz8yZ","W7cTsBGaQY","GSQwj1LB1L","8FmFHtlILt","ni2v1OUYuF",
+"faHir5iGN5","jzUqRS2Dfu","HzZT8suY4x","TCgPpFxX9q","MGlTFs4786","PYBf4ZUnqt","QworuVIlwP","tlILtjS1aj","BFkb8QnJ1S","BbwgAjfREu",
+"0KyfsThjNn","6AFT0M6qcG","7hyVvwiHrZ","WmadA0Kyfs","0YAGHyToGW","n1pmOL7cGc","RpBQmIKxdL","okgRi5nmWv","h1zcHKr8ys","YOfrYiwzGk",
+"jfREuaDGtS","JIqXixciqp","9XyT9nlaBy","8xEKzjtn0X","iwzGkUvlv4","jSjS3P6bcg","wiHrZ1LB1L","tAOsr5ZaEz","BpYhVzFgtB","45cIHs93Ml",
+"guMb8okgRi","aDGtSTwano","lkMUAjtn0X","X6Pinsoy9t","ThjNnbZLvS","F6PT2S2Dfu","HfyNQblLA9","gdQsSEOE1o","NcICAbgJAz","tl72WuQIcz",
+"Vprf20Wr5y","nnP8oUmaEv","kZANmrz7Ut","KASQ8RmDcr","tjQxs8U2nU","3otm6oQ87r","X6Pind7vjM","OHaBzHlUbF","UlU3MfaHir","ZhwG1vLsmS",
+"lsQGoDcpWB","h1zcHWaWsv","Q6hMCogLgc","0MR5X8U2nU","lpF6WYjB9t","uvf7AtaOXK","yofH3RpBQm","d85a97fKYU","FcWrWFhtgl","IKxdLDLhzM",
+"ZhwG1QClRL","AkKTklH1kt","piJSkgtCA5","8xEKzKr8ys","In3NSUl4a1","8RCUAm4bxU","5drc67ku1p","POUYS2DREs","kZANmk85Ae","3weIFv1Hln",
+"fcwDaFLsph","ThjNnHlUbF","ogLgcd7vjM","WreyPSWfou","8cVD3W3VFH","FnPFBgjUTu","yluBxokgRi","MaJQsyofH3","5nmWvjS1aj","2DREs8FmFH",
+"iwzGkK20wK","DLhzMuZPqg","OUqFMJXljW","GSQwjRxrsm","kB5nPv1Hln","piJSk4W0Tl","xciqpFFDui","v8yFNqaofN","ydG8UpT8wu","B3qem580YD",
+"POUYSMmKGJ","SmGzvyvOMI","5drc6brhlQ","v8yFNm4bxU","tlILti3pyd","zY1GYlXFOB","jeskStaOXK","QssNC5Mg9r","t98iWQClRL","5Drn0HzZT8",
+"8RCUAQWxoT","v8yFNwiHrZ","618DiMaJQs","16lHcyofH3","CxVEf4W0Tl","hE1QlChuy3","VBjhzatef2","AkKTkd85a9","YjB9tSs0Zu","uoStwuoStw",
+"cL0aEXyPZN","s4786S2Dfu","WMiS3M6qcG","cL0aEsoy9t","iqv4kCqqaD","d7vjMPb1pa","6q6L9BFkb8","5iGN5FwEJz","tl72W5IhmG","v8yFNY1mC0",
+"07n1cdhSuH","ZhwG1aFFss","JXljWS2Dfu","ReKEWpiJSk","nFqikJ2mQi","atef21v5hH","2hEEUVIlwP","HlUbF5Namm","mX2GEZzJHW","7fsYMcmXIX",
+"8xEKz7fKYU","ni2v1HP433","LDk6fYf2Ec","Waim6aFFss","t59lRoQ87r","i3pyd7fsYM","16lHcogLgc","tjQxsd85a9","16lHc55rfB","dQ586WPmlx",
+"kZANm29QAz","Yh1hFfcwDa","7fsYMNhXdu","Zv7z0IRh48","LbRTHDG4sT","FjHXR3weIF","Zv7z0QssNC","pWiOsjSjS3","gjUTuydG8U","45cIHxReec",
+"BFkb8XflUq","k85AeBFkb8","lkMUAfFDrJ","hUTw7GSQwj","Zv7z06AFT0","QnJ1SFLsph","TCgPp7hyVv","7fKYUJXljW","SjskQksJby","VerEAvkCHH",
+"AIYUu9iGoT","SjskQpT8wu","VjCZqvkCHH","L7cGcCNHmv","b29RJNOHsz","blLA9nFqik","TXQ0ZO3iyQ","yToGWCK5W7","GWqqX5drc6","0h1b15Namm",
+"5IhmG7Ow5C","FNYIMzY1GY","xciqpHlUbF","blLA964s8N","SWfoud85a9","hE1QldQ586","fFDrJLewvM","atef2RmDcr","OHaBztjQxs","d7vjMi7WMQ",
+"IKxdLKr8ys","iKqhrv2eC3","0YAGH5iGN5","jtn0X580YD","9GXkXpWiOs","lj07Q55rfB","zFgtB5Drn0","HRxd8S2Dfu","IBe8kZ4I1v","wiHrZfmIK1",
+"gdQsStuDyS","ReKEW3weIF","2Nslm0ao3l","0ao3lv1Hln","wDajX0PktI","VBjhzRmDcr","fLNg8RACuj","s7MxkzHF1q","Chuy3CdyBV","Mm8sidpe1v",
+"OxWIHECMvU","5drc6uJScX","fFDrJ5ZaEz","J2mQinFqik","0BmCyZuDtD","lCMxyCp3mZ","brhlQWMiS3","BbwgAYf2Ec","v8yFNi3pyd","OxWIH9y4lw",
+"ThjNnfmIK1","48cHLhE1Ql","pv0i7RkQke","tl72WogLgc","8TxD7pWiOs","BbwgAYOfrY","tjQxsNAFuw","M6qcGMK07Y","HP433blLA9","XflUqIRh48",
+"ix74r618Di","QWxoTAgJHQ","JXljWSWfou","Nxx9VFLsph","lCMxy0ao3l","v1HlnNcICA","QbxXcUl4a1","JKWYR8FmFH","QClRLo8Uyd","ZuDtDAIYUu",
+"uupzkTa8f6","6q6L9IjTwP","b29RJVprf2","gf8rIZ4I1v","qQxHPKsjRK","hi5X7KZamH","64s8NpWiOs","jiVBP5Mg9r","0MR5XuoStw","tjQxsBGaQY",
+"LbRTHK20wK","8xEKzHzZT8","0ao3lCK5W7","WDVWJAmdQd","7hyVvFPfSE","FLsphzmLYD","ZJTXHv2eC3","O3iyQfaHir","YOfrYVprf2","yToGWbrhlQ",
+"CdyBVCp3mZ","pFrrllsQGo","wDajXfmIK1","aez9yFFDui","qUJMd8U2nU","a00b5tjQxs","M6qcGSbRYy","mz8gxuupzk","2ZHdkWreyP","ECMvU7ku1p",
+"K4GS8bZLvS","7hyVvuZPqg","0KyfsmX2GE","cL0aEtl72W","soy9tdpe1v","pWiOsDcpWB","k85AeCdyBV","8RCUA3weIF","BFkb8k85Ae","Gv3FqZ4I1v",
+"fFDrJ9iGoT","7fsYMbgJAz","gIYvEJ2mQi","faHir7fsYM","X6Pin1j5L8","MezSWQ6Lix","dmoS7HlUbF","VjCZqECMvU","jSjS3zqH0W","azIWpAmdQd",
+"FLsphRxrsm","uoStwCNHmv","faHirHP433","lm0pDTa8f6","ZUnqtUl4a1","4dEz6zz4ZU","SbRYyHlUbF","AOgEegjUTu","nlaBy4W0Tl","gtCA5tuDyS",
+"yEfy9FNYIM","POUYSyToGW","CNHmvcmXIX","jSjS3zz4ZU","s93MlksJby","F6PT2B3qem","29QAz8TxD7","QWxoTFjHXR","FhtglPYBf4","aFFssqaofN",
+"pFrrl5Drn0","fcwDaOHaBz","TCgPpydG8U","fcJOyVprf2","fmIK1vLsmS","CNHmvdmoS7","jS1ajYw2oU","AmdQdBGaQY","Dz1R39y4lw","djsrvydG8U",
+"16lHct59lR","8U2nUm4bxU","QWxoTuupzk","jSjS3t59lR","jeskSjS1aj","FGzgp9iGoT","FjHXRfFDrJ","Vprf207n1c","b29RJSs0Zu","SWfouRBhp0",
+"he9IAv8yFN","MK07YAgJHQ","ydG8UhE1Ql","2Yz7E7fKYU","s4786s4786","LDk6f2ZHdk","uAWyp4QMc9","8hJdt618Di","KsjRKFVMxo","Yw2oUBFkb8",
+"lXFOBY1mC0","CxVEfguMb8","5Drn0xXTI4","TXQ0ZfFDrJ","ZJTXHWaWsv","uoStwbgJAz","0KyfshE1Ql","tl72Wh1zcH","iwzGkMmKGJ","pFrrl5IhmG",
+"7X3uyNxx9V","zqH0WW7cTs","MK07YMmKGJ","VIlwPSjskQ","KZamHStlDJ","y94nwzY1GY","OxWIHpv0i7","VNCPdcShY2","0PktIQWxoT","ogLgccmXIX",
+"Vprf27Ow5C","Yf2EclCMxy","ydG8UY1mC0","45cIHlj07Q","DG4sTHRxd8","QnJ1Sdpe1v","LbRTHFPfSE","zz4ZUO3iyQ","fcwDauN6r3","2ZHdkPOUYS",
+"dQ586iwzGk","prNT67lUXZ","uupzk5iGN5","JKWYRxXTI4","hSSvQXyPZN","uQIczQClRL","S2DfukZANm","JRJQBwDajX","piJSknnP8o","cL0aE0Kyfs",
+"yToGWFjHXR","RzaZA1v5hH","s4786s7Mxk","t59lRlXFOB","5Drn0OxWIH","guMb8Cp3mZ","Yw2oUlpF6W","618DiIKxdL","Chuy3hE1Ql","Pb1papmeCd",
+"iwzGkwiHrZ","n1pmO7fKYU","6q6L9gIYvE","M6qcG8U2nU","QClRLChuy3","fLNg8fFDrJ","GWqqXFwEJz","zqH0W0Wr5y","ZJTXH0YAGH","FwEJzCNHmv",
+"7lUXZNAFuw","ix74roQ87r","EdBKcIKxdL","oQ87rAOgEe","4QMc955rfB","Yw2oUChuy3","7lUXZRxrsm","5Drn0ZhwG1","MGlTFRACuj","aDGtSNhXdu",
+"lpF6WQssNC","OUqFMFLsph","pv0i7n8pJ9","Dz1R3DLhzM","W7cTsoVQp6","Gv3Fqrz7Ut","lkMUAFGzgp","9rlg9Gv3Fq","n1pmOaDGtS","OxWIHMaJQs",
+"DLhzMcQOnv","MojnPiwzGk","kZANmJ2mQi","soy9te6e4z","vOqCEThjNn","MezSWVNCPd","618DiAmdQd","24ARFS77LH","G1RhSOHaBz","FFDui5Namm",
+"CIShG580YD","lkMUAEdBKc","GWqqXDQimp","blLA9NhXdu","S77LHJ2mQi","24ARFQChxs","7hyVvQYxC0","ksJby2TRI7","0Wr5yOxWIH","BGaQYblLA9",
+"guMb8VNCPd","FLsphdmoS7","2ZHdkn8pJ9","5NammMojnP","0Wr5ydjsrv","ZhwG1wDajX","Gv3FqjS1aj","soy9tFjHXR","0KyfszbIYY","Uvlv45ZaEz",
+"FwEJzzmLYD","fLNg8t59lR","qUJMdxXTI4","QYxC0rhl0J","gjUTuU3yw5","OHaBzoQ87r","2NslmpAhR1","9y4lwFjHXR","QChxsGXdoH","tjQxsStlDJ",
+"ulk41AkKTk","WDVWJSbRYy","In3NSjtn0X","5Drn0Q6Lix","fcJOy24ARF","dQ586tlILt","SbRYyuN6r3","7ku1p1LB1L","2ZHdkUvlv4","soy9tDLhzM",
+"Qworurz7Ut","XyPZNStlDJ","I7p2aVIlwP","FcWrWdjsrv","Q6LixjeskS","i7WMQlweGy","v8yFN2Nslm","qQxHPuQIcz","Y1mC0ZhwG1","QworufmIK1",
+"9XyT9K4GS8","5ZaEzThjNn","fFDrJcShY2","5nmWvnnP8o","blLA9RBhp0","DcpWBS2Dfu","wDajXuQIcz","cShY25drc6","lCMxy5iGN5","Pb1paZzJHW",
+"Pb1parhl0J","s4786ZJTXH","mX2GEM6qcG","uoStwatef2","7lUXZvOqCE","m4bxUdjsrv","GWqqXCxVEf","ZUnqtWmadA","faHirCp3mZ","yofH3xciqp",
+"pvgjS29QAz","iwzGk1j5L8","ogLgcfcwDa","QWxoTi7WMQ","7hyVvl83Ud","ksJby8U2nU","K4GS8BbwgA","IjTwPJKWYR","BpYhVhe9IA","7ku1pOUqFM",
+"WreyPzQt6Q","tvdkDd85a9","5nmWvM6qcG","gtCA5Chuy3","Yw2oUyEfy9","euZA5U3yw5","vOqCEtAOsr","IKxdL55rfB","ReKEWSmGzv","OUYuF0h1b1",
+"i3pydlweGy","8U2nUy94nw","6q6L9JXljW","uAWypJIqXi","LewvMNOHsz","2ZHdkfLNg8","gjUTupv0i7","cShY2IRh48","TCgPpuAWyp","atef2ciuWz",
+"hUTw7wDajX","8TxD79y4lw","cShY2b29RJ","nFqik0ao3l","xXTI4KsjRK","MK07YjS1aj","5NammY1mC0","IKxdLhSSvQ","FPfSEBFkb8","pvgjSS77LH",
+"lViBvSjskQ","VerEAmz8gx","JIqXiBCxeC","lViBvW3VFH","ZuDtDMmKGJ","cL0aEksJby","v1Hln5drc6","RzaZAB3qem","Z4I1vmz8gx","DLhzMMmKGJ",
+"L7cGciB08l","hSSvQ9XyT9","WreyPIRh48","ix74rCK5W7","gjUTugdQsS","azIWpWaWsv","i3pyd0YAGH","ydG8UChuy3","xXTI4M6qcG","nlaByAgJHQ",
+"ksJbyi7WMQ","Mm8sipvgjS","2ZHdkEdBKc","jtn0XL7cGc","n1pmOG1RhS","pv0i7he9IA","yvOMIulk41","NAFuwnlaBy","WPmlx7hyVv","S77LHzqH0W",
+"aDGtSzbIYY","jeskSRsQUq","AgJHQKsjRK","5drc62hEEU","QbxXcVerEA","7X3uyDLhzM","WreyPnnP8o","0BmCyk85Ae","8RCUAjzUqR","0Wr5yYh1hF",
+"2DREsNhXdu","HRxd8uTacx","M6qcGBbwgA","IjTwPYh1hF","L7cGc4dEz6","64s8NazIWp","MmKGJ8hJdt","AIYUunnP8o","v1Hln7fsYM","tjQxsuZPqg",
+"k85AehUTw7","WMiS3IRh48","tAOsrG1RhS","gdQsSCp3mZ","atef2WDVWJ","ECMvUWMiS3","8xEKzK4GS8","ZuDtDlj07Q","lkMUAFLsph","FnPFBpmeCd",
+"WreyPZ4I1v","2ZHdkOHaBz","2Yz7EDz1R3","QnJ1SpAhR1","hE1QlwiHrZ","P6bcgaDGtS","ksJbyUlU3M","7hyVvCNHmv","0Kyfs6q6L9","s4786xXTI4",
+"0KyfsM3zXL","uupzksqVrf","HlUbFAmdQd","FGzgpWMiS3","ReKEWlpF6W","d7vjMd7vjM","zz4ZUCp3mZ","4QMc9S2Dfu","fFDrJJkzUn","rhl0JWDVWJ",
+"oVQp6Fhtgl","fFDrJfcJOy","v8yFNW3VFH","5IhmGqUJMd","y94nw0MR5X","16lHcqaofN","iB08lxReec","cmXIX618Di","FjHXREdBKc","M3zXL2Nslm",
+"pmeCde6e4z","uJScX7hyVv","EdBKcZUnqt","pv0i7FjHXR","In3NSTXQ0Z","tAOsrhSSvQ","gdQsS580YD","M3zXL24ARF","9y4lwfmIK1","DcpWBDz1R3",
+"wDajXHzZT8","Ul4a1B3qem","Kr8ysx3LDe","3weIFYh1hF","7ku1pcmXIX","s93MlcmXIX","7hyVvqUJMd","Dz1R39eoRc","jiVBPThjNn","h1zcHFLsph",
+"gIYvEIKxdL","P6bcgWMiS3","vkCHHzz4ZU","RsQUqvkCHH","lsQGoi7WMQ","gIYvEnFqik","fmIK19rlg9","FFDui7hyVv","rhl0JOHaBz","I7p2alH1kt",
+"SbRYy9rlg9","UlU3MuLtKs","guMb8uAWyp","S2DfujfREu","mX2GEIjTwP","AXpwEatef2","JIqXitl72W","vOqCE2DREs","ThjNnGWqqX","vOqCEY1mC0",
+"guMb8bgJAz","e6e4z7hyVv","CIShG5ZaEz","JJs5mFjHXR","Cp3mZzFgtB","VerEANOHsz","fcJOy4W0Tl","EOE1oP6bcg","HP433U3yw5","Q6LixtjQxs",
+"XflUqiwzGk","pAhR1pv0i7","OxWIHn8pJ9","hYBCK24ARF","oGu6xIBe8k","JIqXilpF6W","hE1QlhUTw7","SjskQ0ao3l","pFrrlpv0i7","jS1ajEdBKc",
+"7fKYU2hEEU","HRxd8CqqaD","d7vjMJIqXi","9iGoTBCxeC","MK07Y8xEKz","bZLvS2DREs","lH1ktChuy3","WMiS3lkMUA","VIlwPMezSW","Kr8ysh1zcH",
+"CK5W70PktI","45cIH9y4lw","wDajXqQxHP","L7cGc8xEKz","VIlwPEoToP","JXljWThjNn","Vprf2iwzGk","8TxD78xEKz","HP433cL0aE","FnPFBzmLYD",
+"QnJ1Sv8yFN","zmLYDn1pmO","FPfSE8RCUA","yvOMIStlDJ","7fKYUazIWp","lm0pDZUnqt","WreyPbgJAz","Zv7z0k85Ae","RmDcr8U2nU","aFFssmz8gx",
+"tl72WtAOsr","RACuj7Ow5C","d7vjMdmoS7","W7cTssoy9t","jtn0XY1mC0","2ZHdk5Namm","iwzGksqVrf","X6Pin4dEz6","zqH0WtaOXK","iwzGkYOfrY",
+"dpe1v45cIH","gf8rIy94nw","2hEEUQ6hMC","Uvlv4BFkb8","lj07QBbwgA","atef2FcWrW","hSSvQ8cVD3","lViBvuZPqg","ciuWzOUYuF","bZLvSazIWp",
+"oVQp6dQ586","fFDrJ580YD","pWiOslm0pD","GWqqXKZamH","jSjS3ydG8U","zHF1qzqH0W","t59lRKr8ys","HfyNQQworu","8TxD7yToGW","QnJ1SuQIcz",
+"jSjS3OUqFM","5nmWvlm0pD","ni2v1x3LDe","s7Mxk8hJdt","CxVEflm0pD","CqqaD16lHc","9eoRclCMxy","pv0i7tAOsr","ECMvUsx5Gl","45cIHvOqCE",
+"NhXdu0PktI","nlaByWDVWJ","BGaQYGWqqX","brhlQ8xEKz","SbRYysuY4x","mX2GElXFOB","xXTI4GSQwj","8U2nUYOfrY","ZuDtDXyPZN","WreyP7ku1p",
+"QClRLSWfou","bgJAz5iGN5","QWxoTJkzUn","CxVEfQnJ1S","rKDLJBpYhV","cmXIXuJScX","IjTwPUvlv4","AgJHQyluBx","n8pJ9NhXdu","29QAzChuy3",
+"rz7Ut580YD","KZamHQYxC0","yEfy9tjQxs","Q6hMCulk41","580YDWMiS3","TXQ0ZbgJAz","vOqCE9eoRc","Mkgy8WPmlx","lm0pDzz4ZU","zqH0WWaWsv",
+"IKxdLzmLYD","G1RhSqUJMd","n8pJ9a00b5","IKxdLdpe1v","618DiNcICA","pWiOsix74r","hSSvQjS1aj","2Yz7Exciqp","I7p2akZANm","MezSW7lUXZ",
+"0MR5XJRJQB","zqH0WrKDLJ","K4GS8lsQGo","JRJQBaDGtS","FxX9qhE1Ql","Yw2oUtl72W","AmdQdNAFuw","FxX9qnFqik","1LB1LOz8yZ","SmGzvWDVWJ",
+"lXFOB2hEEU","SjskQeuZA5","SjskQlH1kt","VLTy629QAz","BpYhVAIYUu","M3zXL580YD","atef2jzUqR","J2mQiVerEA","Nxx9VazIWp","uJScXCK5W7",
+"FGzgpfLNg8","oVQp6tjQxs","lpF6Ws4786","AgJHQThjNn","7fKYUFnPFB","TCgPp8FmFH","8cVD35IhmG","ZUnqtG1RhS","sx5GlReKEW","nnP8ohSSvQ",
+"7Ow5CAXpwE","LewvMKASQ8","fLNg8e6e4z","FVMxopAhR1","1j5L8UlU3M","Y1mC0tjQxs","FnPFBQssNC","Q6hMC9rlg9","L7cGcfqypy","zFgtB1LB1L",
+"yEfy9SmGzv","gtCA5IjTwP","CxVEfuQIcz","0YAGHlm0pD","VBjhz4dEz6","J2mQiqUJMd","guMb8JkzUn","In3NSKZamH","fmIK1n8pJ9","lXFOBAIYUu",
+"W7cTs0Kyfs","Uvlv407n1c","2ZHdktaOXK","AgJHQciuWz","29QAzMmsIo","oQ87rzz4ZU","FGzgpuJScX","xciqp1v5hH","bgJAzCp3mZ","45cIHlXFOB",
+"gIYvE9rlg9","MK07YGWqqX","ECMvUSWfou","9iGoTHzZT8","QChxsCIShG","yvOMIAOgEe","C2IrcFwEJz","0Wr5yWmadA","GXdoHVNCPd","lweGytaOXK",
+"3otm6J2mQi","5drc6uZPqg","8U2nUuZPqg","LewvMKZamH","euZA50Wr5y","nFqikdmoS7","sqVrf55rfB","piJSk8hJdt","Uvlv49XyT9","LewvMuZPqg",
+"QssNC0BmCy","BpYhVAmdQd","djsrvNcICA","C2Irc8U2nU","Chuy3fLNg8","CqqaDpWiOs","QChxsTwano","TXQ0Zgf8rI","atef25iGN5","BpYhVRsQUq",
+"wDajXGv3Fq","5drc6mX2GE","2TRI79XyT9","1LB1LIBe8k","k85AeIKxdL","MmKGJpmeCd","POUYS618Di","FVMxojSjS3","Yh1hFuPX7G","2Yz7EMm8si",
+"Kr8ystvdkD","NcICAQChxs","0BmCyJIqXi","uZPqg9y4lw","pT8wux3LDe","zbIYYtAOsr","WaWsvUmaEv","gjUTuuupzk","MaJQs4QMc9","IKxdLyluBx",
+"BpYhVs93Ml","ciuWzcQOnv","14FLRguMb8","lCMxyTa8f6","hSSvQsx5Gl","7fKYUfcJOy","HzZT8h1zcH","Y1mC07X3uy","NhXduKZamH","MojnPDG4sT",
+"Z4I1vU3yw5","fFDrJKsjRK","ReKEWLewvM","QYxC0CK5W7","ciuWz9eoRc","e6e4z5IhmG","GrDg7J2mQi","DLhzMaDGtS","IBe8kRBhp0","LbRTHC2Irc",
+"7X3uy8U2nU","lweGy0h1b1","xReecGWqqX","NAFuwt59lR","BGaQYnlaBy","k85AeHlUbF","BFkb8L7cGc","Gv3Fq9eoRc","FnPFB5Namm","DcpWB4QMc9",
+"SbRYy9eoRc","tAOsre6e4z","lweGyZzJHW","VerEAAIYUu","jfREuOz8yZ","618DizmLYD","BFkb8WreyP","DG4sTECMvU","2TRI7Y1mC0","jtn0XECMvU",
+"Chuy35IhmG","FwEJzuvf7A","i3pydksJby","RzaZA580YD","prNT60YAGH","wiHrZ9GXkX","y94nwTXQ0Z","okgRi4W0Tl","i3pydMojnP","jtn0Xl83Ud",
+"BCxeCzz4ZU","FhtglBbwgA","QworubgJAz","xReecVIlwP","uPX7GfmIK1","Chuy3SmGzv","MojnPHlUbF","CNHmvPYBf4","CIShGU3yw5","RACujuLtKs",
+"Mkgy8Fhtgl","TwanoguMb8","VBjhzFwEJz","tvdkDB3qem","ZUnqtpT8wu","9y4lwSmGzv","o8UydDQimp","GrDg71j5L8","guMb8xReec","h1zcHFGzgp",
+"k85AeCK5W7","BGaQYzmLYD","zHF1qoGu6x","gjUTuSmGzv","ZuDtDHP433","lViBv24ARF","vkCHHlXFOB","QworuDz1R3","v2eC3Nxx9V","v8yFNpiJSk",
+"580YDB3qem","mX2GE0h1b1","tAOsraez9y","FFDuixciqp","CK5W7UlU3M","hSSvQ5Namm","5VZjSCqqaD","soy9tYjB9t","FVMxoRkQke","8U2nU0PktI",
+"HfyNQZJTXH","F6PT2lCMxy","x3LDe8FmFH","ZUnqtcmXIX","jSjS3x3LDe","5IhmGU3yw5","djsrvAgJHQ","1v5hHqaofN","kB5nP5Namm","KZamHksJby",
+"oGu6x2DREs","MmsIo5Namm","HRxd89iGoT","uoStwaez9y","LbRTHFnPFB","FcWrWJJs5m","5Mg9rGv3Fq","cQOnve6e4z","uN6r3aFFss","fqypyKASQ8",
+"CdyBVYw2oU","jtn0XqaofN","CIShGaDGtS","OUYuFCqqaD","SWfouix74r","uoStwe6e4z","lH1kta00b5","i7WMQReKEW","JRJQBTa8f6","ulk419iGoT",
+"fFDrJUvlv4","0MR5X3weIF","MojnP7Ow5C","yluBxjS1aj","SmGzv2DREs","1LB1LzFgtB","SjskQ8TxD7","0Kyfsx3LDe","GWqqX3otm6","YOfrYWreyP",
+"euZA5d85a9","aFFssWmadA","vOqCEGXdoH","Zv7z0yvOMI","C2IrcOUqFM","rhl0J5Mg9r","t98iW0Kyfs","aL6AJo8Uyd","BFkb8uAWyp","fFDrJ7lUXZ",
+"9y4lwM3zXL","soy9tYf2Ec","yofH3RmDcr","ThjNndmoS7","CK5W7sqVrf","0KyfsFGzgp","14FLRjSjS3","QYxC0bgJAz","y94nwFwEJz","uAWypdmoS7",
+"oQ87rHRxd8","v8yFNQChxs","7ku1p16lHc","ZzJHWx3LDe","ksJbyCNHmv","IRh48fcJOy","7fsYMC2Irc","gIYvE0Kyfs","guMb8ru4UG","VerEAgtCA5",
+"uoStw0MR5X","0Wr5yqaofN","PYBf4MaJQs","uN6r3nlaBy","7fsYML7cGc","k85Aeo8Uyd","gIYvEwiHrZ","fqypyRzaZA","ThjNnVLTy6","HP433FGzgp",
+"blLA9pAhR1","djsrvm4bxU","0KyfsJKWYR","AkKTkdmoS7","jS1ajOxWIH","vLsmSatef2","lm0pDzQt6Q","9iGoTBpYhV","5iGN5azIWp","FnPFBJRJQB",
+"DLhzMZhwG1","1v5hHtvdkD","uupzkKsjRK","0Wr5yxReec","S2DfuVjCZq","m4bxU4W0Tl","t98iWpAhR1","lXFOBTwano","OUqFMHRxd8","MmsIo5nmWv",
+"pT8wu5drc6","W7cTsRxrsm","7Ow5Cb29RJ","Mm8siXflUq","uPX7G2Nslm","Twano1LB1L","t98iWlweGy","uN6r3BpYhV","tjQxsYw2oU","WaWsvdpe1v",
+"1LB1L64s8N","GXdoHSbRYy","Ta8f6jSjS3","RkQkeuAWyp","m4bxUChuy3","In3NSFVMxo","soy9thE1Ql","tl72W8xEKz","I7p2auLtKs","suY4xpT8wu",
+"brhlQbgJAz","x3LDeAmdQd","bZLvSulk41","pFrrldmoS7","5ZaEzsx5Gl","gdQsSQssNC","sx5GlIBe8k","VBjhzVjCZq","xXTI4JkzUn","Kr8ysECMvU",
+"sx5GlpWiOs","7X3uyStlDJ","AXpwEK4GS8","FjHXRo8Uyd","QYxC07Ow5C","2ZHdkjeskS","7fKYUWDVWJ","MaJQslViBv","iqv4kWaim6","pv0i7kB5nP",
+"v1Hln5nmWv","8U2nUbrhlQ","jS1ajuupzk","x3LDek85Ae","9GXkXQssNC","tuDySRxrsm","FVMxouvf7A","ni2v1xciqp","FxX9qmz8gx","cL0aEs7Mxk",
+"0MR5XkB5nP","e6e4zUl4a1","Pb1pas7Mxk","4dEz6n8pJ9","CIShG0ao3l","3otm6lm0pD","GXdoHS77LH","VLTy6aFFss","0h1b1nnP8o","uZPqg8U2nU",
+"jfREuNxx9V","FnPFB2TRI7","hUTw7Yh1hF","7fsYMsuY4x","fcJOygtCA5","nlaByMm8si","MmsIoi7WMQ","n1pmO8xEKz","tvdkD3otm6","iwzGko8Uyd",
+"KASQ8uZPqg","pWiOsJXljW","B3qemXyPZN","RACujkB5nP","zbIYY5drc6","rz7UtzHF1q","WreyP8RCUA","fqypyEdBKc","WDVWJazIWp","NhXduAXpwE",
+"Nxx9VNAFuw","QWxoTRpBQm","VLTy6ru4UG","pmeCdReKEW","ZhwG1gtCA5","he9IAJkzUn","ksJbyRzaZA","yofH3NcICA","nlaByjS1aj","k85AeUmaEv",
+"No0Qb7ku1p","FFDuiK20wK","7lUXZ5ZaEz","NOHszaL6AJ","pv0i7KASQ8","YjB9tHzZT8","MojnPOUqFM","LDk6fuupzk","QWxoT8hJdt","EOE1o55rfB",
+"ulk41qQxHP","lkMUAuTacx","zbIYYRkQke","fFDrJqaofN","fFDrJ16lHc","cmXIXEOE1o","QssNCprNT6","faHir7ku1p","kZANmJJs5m","Chuy3CNHmv",
+"fcwDapiJSk","m4bxUKASQ8","uLtKstaOXK","24ARFCfgr3","BpYhVOUYuF","mX2GE7fsYM","AmdQdVjCZq","zY1GY07n1c","uAWypJRJQB","pvgjSkZANm",
+"suY4xtAOsr","gjUTu9GXkX","9rlg9bZLvS","OUYuFiqv4k","pvgjSW7cTs","SjskQfLNg8","dmoS7BbwgA","Mm8siK4GS8","2Nslm55rfB","RmDcrlj07Q",
+"7Ow5C7Ow5C","J2mQi9eoRc","DcpWB5IhmG","AgJHQi7WMQ","pAhR1n8pJ9","IjTwPKASQ8","e6e4zW3VFH","lm0pDDQimp","ECMvU0Kyfs","x3LDeSbRYy",
+"LDk6fcL0aE","pmeCdUl4a1","KASQ80Kyfs","FjHXRBbwgA","3weIFm4bxU","wiHrZMojnP","Zv7z0oVQp6","uoStwuN6r3","y94nwNOHsz","jS1ajCxVEf",
+"P6bcg7X3uy","FwEJz618Di","LDk6fQssNC","55rfBMezSW","5drc6QChxs","Yh1hFRBhp0","gIYvElsQGo","ZUnqtydG8U","uQIczulk41","Oz8yZW7cTs",
+"faHirCqqaD","K20wKFFDui","s4786t98iW","RzaZAzbIYY","7Ow5CFNYIM","NOHszFnPFB","9XyT9v1Hln","J2mQifLNg8","IjTwPJkzUn","IKxdLuN6r3",
+"lsQGoatef2","kZANmcL0aE","FcWrWuZPqg","7fsYMxXTI4","BFkb8FLsph","EdBKcGWqqX","580YD9GXkX","yofH3FLsph","Vprf2FVMxo","M6qcG7ku1p",
+"dQ586he9IA","2DREsIKxdL","zz4ZUQ6Lix","MojnPuupzk","IKxdLQClRL","LewvMuN6r3","0h1b1W3VFH","jeskSjSjS3","FFDuiNhXdu","prNT6lkMUA",
+"FhtglNAFuw","Q6Lixb29RJ","Yw2oU07n1c","G1RhSRzaZA","Q6LixzQt6Q","1v5hHaez9y","m4bxUHfyNQ","7hyVvQWxoT","aFFsslViBv","RzaZAKr8ys",
+"xReec0ao3l","FnPFBJkzUn","AkKTkqaofN","Waim6KZamH","IRh48QYxC0","X6Pin2TRI7","uTacxkZANm","HfyNQD6rBy","hE1QlcQOnv","ru4UGM6qcG",
+"1LB1LfaHir","45cIHpmeCd","F6PT2pmeCd","CqqaD4dEz6","RxrsmFhtgl","UlU3MOHaBz","RBhp00MR5X","Yw2oUQworu","lH1ktEdBKc","GXdoHPb1pa",
+"e6e4zmz8gx","FxX9q1v5hH","Mkgy8y94nw","fmIK17ku1p","LbRTHlCMxy","aez9yMm8si","GWqqXtlILt","jeskSuQIcz","suY4xbZLvS","2ZHdkgjUTu",
+"Oz8yZ1v5hH","Ul4a1KsjRK","Vprf2FwEJz","QworuiwzGk","nnP8onFqik","l83UdtuDyS","BbwgA9eoRc","m4bxUfcwDa","2TRI7WmadA","2NslmnFqik",
+"VLTy6B3qem","jeskSlsQGo","5ZaEzjSjS3","IKxdLguMb8","Cp3mZFGzgp","Cfgr3Fhtgl","gjUTuFLsph","618DimX2GE","prNT6Kr8ys","DQimp7X3uy",
+"v8yFN2TRI7","l83UdoQ87r","suY4xFGzgp","LewvMMezSW","7fKYUcL0aE","jfREux3LDe","M3zXLfFDrJ","4dEz6Mm8si","pv0i7RpBQm","YOfrYFLsph",
+"MojnPWreyP","VBjhz1v5hH","lj07QSmGzv","Y1mC0QbxXc","he9IAblLA9","hSSvQOz8yZ","CNHmvTwano","RBhp0Kr8ys","580YDDQimp","LDk6flkMUA",
+"kZANmW3VFH","Rxrsmx3LDe","xciqp2ZHdk","jSjS3lH1kt","s7MxkS2Dfu","CdyBVjSjS3","yluBxJ2mQi","uZPqgAOgEe","4dEz67fKYU","tl72WAkKTk",
+"I7p2aK20wK","VIlwPpvgjS","GWqqX7ku1p","kZANm4W0Tl","tl72WgdQsS","JJs5mBGaQY","iB08l0PktI","uLtKs5nmWv","rhl0JK20wK","ReKEWOUYuF",
+"5VZjSyofH3","qUJMd29QAz","cShY24dEz6","QWxoTtjQxs","0MR5Xn1pmO","W7cTsfLNg8","7lUXZiwzGk","3weIFDz1R3","BFkb8DLhzM","e6e4z14FLR",
+"D6rByuZPqg","SmGzvuupzk","uTacxQYxC0","qUJMdTXQ0Z","o8UydWMiS3","Y1mC0uTacx","ECMvURBhp0","Vprf2FNYIM","WPmlxQnJ1S","tuDySoVQp6",
+"5drc6xXTI4","Qworu9GXkX","suY4x8RCUA","lsQGo2hEEU","0MR5X0MR5X","ydG8Utl72W","M6qcGZJTXH","9GXkXaDGtS","TXQ0ZRpBQm","mz8gxBCxeC",
+"d85a9fcJOy","QnJ1SwDajX","bZLvSpmeCd","Ta8f6IRh48","2hEEUv2eC3","zqH0WAOgEe","EdBKcHRxd8","xReec5Drn0","9rlg9v1Hln","ReKEWLDk6f",
+"MGlTFrz7Ut","dhSuHYf2Ec","W3VFHQChxs","KASQ8EoToP","55rfBeuZA5","hSSvQ2ZHdk","3weIFBGaQY","MaJQssqVrf","ulk41DcpWB","1LB1L5Mg9r",
+"pFrrlpmeCd","JXljW5Drn0","BGaQYFGzgp","wDajXni2v1","RpBQmBFkb8","lCMxy7fsYM","FcWrWatef2","LbRTHv2eC3","d85a9AXpwE","Vprf2No0Qb",
+"CNHmv1v5hH","Ss0Zufqypy","M3zXL1v5hH","Chuy3k85Ae","TXQ0ZB3qem","M6qcGYjB9t","ciuWzuQIcz","14FLRI7p2a","kZANmvLsmS","uoStwv2eC3",
+"O3iyQ5IhmG","0h1b1qQxHP","zz4ZUKsjRK","ksJbylViBv","xReecZuDtD","GSQwj9iGoT","1j5L8FNYIM","JXljWni2v1","FGzgpJ2mQi","oGu6x5nmWv",
+"JIqXiEdBKc","pmeCdQClRL","F6PT2yToGW","No0QbEOE1o","0YAGHnlaBy","8FmFHlsQGo","ru4UG9GXkX","WPmlxNo0Qb","Y1mC0yToGW","MmKGJ9GXkX",
+"euZA5n1pmO","KASQ8X6Pin","tjQxsMojnP","SbRYy24ARF","cShY2QWxoT","djsrvDLhzM","4dEz6t98iW","9XyT93otm6","WreyPtuDyS","TXQ0ZZzJHW",
+"n8pJ9FPfSE","C2IrcRsQUq","qQxHPYf2Ec","2NslmpiJSk","v1HlnlkMUA","TwanoQChxs","7Ow5CFhtgl","Ul4a1AgJHQ","B3qem4W0Tl","blLA9WaWsv",
+"Pb1pa0MR5X","UmaEvAgJHQ","TXQ0ZzqH0W","AgJHQHfyNQ","ZhwG18FmFH","DLhzMMK07Y","WaWsvjeskS","wDajXqaofN","3weIFUlU3M","Zv7z0xciqp",
+"JkzUnfLNg8","580YD2ZHdk","nnP8oMmsIo","Cfgr30Kyfs","Q6LixyofH3","piJSkRzaZA","zQt6QVNCPd","Kr8ysJXljW","CxVEfQ6hMC","7X3uyv2eC3",
+"I7p2aOz8yZ","ru4UGgtCA5","2NslmQ6hMC","M3zXLMK07Y","l83Ud3weIF","1j5L8WreyP","Vprf2X6Pin","FhtglFwEJz","NOHszjfREu","hSSvQGrDg7",
+"WPmlxlCMxy","4W0TlRsQUq","UlU3MjS1aj","Q6Lixa00b5","48cHLVIlwP","B3qemVprf2","QClRL7X3uy","lm0pDh1zcH","7ku1pZUnqt","I7p2axXTI4",
+"ZhwG10MR5X","No0QbEdBKc","EOE1ocmXIX","JXljWDG4sT","lj07QAkKTk","yEfy9Chuy3","Waim6uJScX","CdyBVlweGy","0ao3l55rfB","faHirsqVrf",
+"JkzUnAmdQd","guMb8Yh1hF","JkzUnB3qem","uJScXI7p2a","nlaByzbIYY","yEfy9iqv4k","pAhR1RBhp0","Oz8yZh1zcH","2hEEUJkzUn","4dEz6WreyP",
+"29QAzM3zXL","VLTy6mz8gx","7hyVvhUTw7","5VZjSRBhp0","No0Qb5Mg9r","RsQUqMaJQs","h1zcHhSSvQ","jeskS3otm6","5IhmGKZamH","M6qcGsuY4x",
+"faHirSWfou","WmadApiJSk","e6e4zlXFOB","sx5Glt98iW","lweGyBbwgA","Oz8yZuvf7A","oVQp69y4lw","dpe1vdhSuH","uLtKs5IhmG","ZzJHWatef2",
+"nFqikZUnqt","aFFssJKWYR","hSSvQSWfou","POUYSS2Dfu","VerEANcICA","cmXIXBFkb8","7lUXZtjQxs","1j5L80PktI","t59lRv8yFN","8xEKzdjsrv",
+"7lUXZtlILt","guMb8lCMxy","MojnPFcWrW","JRJQBjiVBP","ZhwG1piJSk","qaofNK4GS8","v8yFNhi5X7","fmIK1nlaBy","faHirtAOsr","AgJHQTXQ0Z",
+"KZamHokgRi","fLNg8uAWyp","1v5hHnnP8o","5IhmGBbwgA","mX2GEjS1aj","S2Dfuuupzk","ni2v1JXljW","zFgtB5ZaEz","0Wr5yzY1GY","tvdkD0PktI",
+"RkQkeQnJ1S","e6e4zeuZA5","Yf2EclkMUA","9XyT98U2nU","lViBv0PktI","fLNg8vLsmS","24ARFatef2","lH1ktF6PT2","In3NSjeskS","CqqaD2ZHdk",
+"uTacxJkzUn","8hJdtAgJHQ","618Di7hyVv","WDVWJ1j5L8","dQ586t98iW","KsjRKIRh48","hSSvQpFrrl","FLsphVIlwP","I7p2aix74r","NhXdunnP8o",
+"2TRI7jSjS3","pWiOsQworu","RkQkennP8o","JKWYR8cVD3","CIShGFVMxo","7ku1pQWxoT","7hyVvoGu6x","ciuWzlweGy","fFDrJnlaBy","rhl0JAXpwE",
+"HfyNQRACuj","W3VFHLDk6f","VBjhzCK5W7","Q6hMCBCxeC","zqH0WfFDrJ","QChxs5Mg9r","rhl0Je6e4z","DLhzMfLNg8","Q6LixQnJ1S","BFkb8tjQxs",
+"BpYhVlViBv","oQ87r29QAz","7fKYUFNYIM","F6PT2QClRL","lXFOBX6Pin","d85a9a00b5","tlILtZhwG1","GSQwjjzUqR","ulk41nlaBy","8TxD7dmoS7",
+"lCMxydmoS7","AmdQd2Yz7E","RACujJkzUn","0Wr5y0PktI","FhtglcL0aE","M3zXL7X3uy","okgRiogLgc","zY1GY0Wr5y","hSSvQFhtgl","NhXdu0h1b1",
+"ru4UGMaJQs","fFDrJpv0i7","Rxrsmzz4ZU","dmoS7IjTwP","ZUnqt0PktI","VBjhz2ZHdk","L7cGcqUJMd","Yw2oUBpYhV","CdyBVaez9y","aDGtStvdkD",
+"1j5L8WDVWJ","DcpWBQChxs","pT8wun1pmO","No0QbAOgEe","hUTw7VNCPd","iB08ldpe1v","Mm8sifmIK1","gjUTugIYvE","P6bcgrKDLJ","yvOMInFqik",
+"2Yz7E3otm6","POUYSs93Ml","o8UydO3iyQ","QssNCjeskS","8FmFHCxVEf","5iGN5yToGW","JXljWtaOXK","AOgEeDG4sT","lm0pDFPfSE","mz8gxMGlTF",
+"zqH0WpAhR1","rKDLJtuDyS","suY4xPOUYS","BbwgAStlDJ","0ao3lGrDg7","QChxsKsjRK","hUTw7uN6r3","v2eC3QWxoT","5ZaEzsuY4x","DQimpbZLvS",
+"EOE1oReKEW","vkCHHLewvM","atef2h1zcH","y94nwMmKGJ","RmDcrd85a9","ix74rM6qcG","JIqXiblLA9","n8pJ9cShY2","VjCZqeuZA5","5drc6MojnP",
+"mX2GEJJs5m","MojnPdmoS7","h1zcHIRh48","uLtKsJIqXi","VerEAwiHrZ","v8yFNlj07Q","Mkgy8tl72W","FFDuiDcpWB","ix74rxReec","d85a97fsYM",
+"BbwgA2TRI7","2ZHdkpT8wu","8TxD7s4786","Pb1paFLsph","uLtKsuPX7G","RpBQmUmaEv","WmadAG1RhS","8RCUAyEfy9","3weIF5IhmG","GXdoHfaHir",
+"W3VFHlH1kt","StlDJL7cGc","zY1GYdhSuH","CqqaDy94nw","Vprf2JKWYR","hi5X7vOqCE","euZA5Nxx9V","Y1mC00YAGH","cmXIXaFFss","3weIFt59lR",
+"ZJTXHAOgEe","ru4UGBpYhV","6q6L9k85Ae","hYBCKhUTw7","8U2nUOz8yZ","gIYvEChuy3","2TRI7QWxoT","JKWYRfqypy","pWiOs0PktI","yEfy9IKxdL",
+"WDVWJyEfy9","rKDLJBFkb8","6AFT0EOE1o","AmdQd7fKYU","dhSuH5nmWv","48cHLyvOMI","0MR5XfFDrJ","3weIFRBhp0","okgRitvdkD","lj07QS2Dfu",
+"29QAzogLgc","0Wr5yoQ87r","GSQwjix74r","7Ow5CPb1pa","RpBQmQClRL","zHF1qx3LDe","tuDySDz1R3","G1RhSYf2Ec","hYBCKkB5nP","FNYIMiwzGk",
+"K4GS8brhlQ","3otm6ReKEW","ix74r8FmFH","O3iyQpvgjS","Qworuix74r","618Di5Namm","pvgjSyToGW","ni2v1EoToP","DcpWBs7Mxk","v2eC3ZUnqt",
+"uQIczXflUq","suY4xzbIYY","P6bcgjiVBP","uupzkjfREu","Gv3FqZuDtD","yluBxWmadA","Q6hMCvLsmS","dQ586PYBf4","MmsIojfREu","e6e4z5VZjS",
+"i3pydx3LDe","ThjNniKqhr","0Wr5yksJby","3otm6t98iW","bZLvSlm0pD","2TRI7oGu6x","sx5GlkZANm","ThjNnd85a9","9iGoTW3VFH","yofH3AmdQd",
+"No0QbgjUTu","0BmCy0MR5X","0YAGHlj07Q","lViBv0Kyfs","C2IrcVLTy6","D6rByn1pmO","FFDuiG1RhS","qaofNOz8yZ","iKqhr64s8N","Cfgr30h1b1",
+"qUJMdQssNC","dmoS7MmKGJ","WaWsvFGzgp","FPfSEhYBCK","ydG8UQnJ1S","zY1GY8cVD3","xReecHP433","rKDLJECMvU","o8UydFcWrW","vLsmSguMb8",
+"Vprf2aFFss","AXpwEjzUqR","SWfouni2v1","CK5W7CxVEf","RkQkehSSvQ","sx5GlRzaZA","ZUnqtEOE1o","9y4lwogLgc","mz8gxlj07Q","UmaEv4QMc9",
+"ZuDtDzFgtB","tl72WDG4sT","hYBCKhSSvQ","KASQ8ogLgc","7fsYMIBe8k","4QMc9jiVBP","FcWrWtlILt","0KyfsRBhp0","O3iyQJ2mQi","48cHLQWxoT",
+"POUYS2Yz7E","Mkgy829QAz","5ZaEzCdyBV","0MR5Xs7Mxk","NOHszYh1hF","8U2nUjeskS","Oz8yZlH1kt","a00b5uTacx","48cHLxciqp","Mm8siKZamH",
+"oVQp6zQt6Q","m4bxUzz4ZU","ogLgczQt6Q","gtCA5580YD","5ZaEzjS1aj","jtn0XyluBx","y94nwni2v1","5iGN5Q6hMC","Q6hMCZzJHW","iB08lStlDJ",
+"KASQ8No0Qb","yToGWRACuj","jtn0Xlm0pD","nFqikC2Irc","s93MlHRxd8","k85AefaHir","9eoRcv2eC3","QworuokgRi","Z4I1v580YD","In3NSfFDrJ",
+"FLsphWPmlx","he9IACdyBV","x3LDeogLgc","d85a9KZamH","QnJ1Sn1pmO","Cfgr3580YD","618Dii3pyd","h1zcH0YAGH","t59lRVjCZq","zFgtBd7vjM",
+"uZPqgb29RJ","t98iWNAFuw","5Mg9r4dEz6","U3yw5oGu6x","kZANmRACuj","Ul4a1nFqik","d85a9ydG8U","5nmWvKr8ys","iwzGk580YD","CdyBVNo0Qb",
+"0h1b12Yz7E","5IhmGMmsIo","9GXkXQWxoT","K20wKl83Ud","dhSuHY1mC0","yofH3M3zXL","xciqpK4GS8","pAhR1MmsIo","m4bxU9eoRc","EoToPlXFOB",
+"AIYUuuoStw","WmadASs0Zu","FFDuii3pyd","QssNCECMvU","Oz8yZs4786","lsQGopT8wu","RzaZA9iGoT","s7MxkRACuj","GSQwjd85a9","v1Hlnaez9y",
+"yvOMIU3yw5","pv0i7QChxs","suY4xFxX9q","RkQkeVIlwP","CdyBVxXTI4","ydG8U55rfB","v8yFNHRxd8","Cp3mZWmadA","hSSvQIjTwP","StlDJ4W0Tl",
+"iwzGk29QAz","e6e4zQbxXc","vkCHHQnJ1S","24ARF4QMc9","tjQxsMkgy8","s7MxkQChxs","8xEKz5Mg9r","8TxD7ulk41","FLsph5VZjS","zz4ZU9GXkX",
+"VIlwPWaim6","JKWYRsoy9t","BbwgAMkgy8","blLA9tl72W","Z4I1vazIWp","J2mQiuLtKs","JkzUnv1Hln","5Nammpv0i7","C2IrcbrhlQ","JJs5mcL0aE",
+"he9IAtvdkD","UmaEvhYBCK","5IhmGVprf2","taOXKPYBf4","MojnPYh1hF","xReecK4GS8","brhlQYh1hF","rz7UtuoStw","ru4UGFGzgp","HRxd8FxX9q",
+"7lUXZOUqFM","qUJMdCp3mZ","5nmWvjeskS","16lHcChuy3","uQIczix74r","ksJby7ku1p","RsQUqni2v1","JKWYRB3qem","qaofNhUTw7","QClRL14FLR",
+"IKxdLtaOXK","uoStw5IhmG","aL6AJCp3mZ","5Mg9rFPfSE","TwanoGXdoH","5drc65Drn0","wiHrZd7vjM","nFqikDz1R3","BpYhVJJs5m","BGaQYs93Ml",
+"CK5W7t59lR","xciqps7Mxk","CqqaDb29RJ","Chuy3Pb1pa","RsQUqBCxeC","WMiS3tuDyS","RsQUqlj07Q","9GXkXzbIYY","5iGN5Yh1hF","KZamHaL6AJ",
+"ECMvUaez9y","guMb8gjUTu","Cp3mZaL6AJ","7fsYMiqv4k","HP433CIShG","2Yz7EQworu","s93MlRsQUq","Pb1pa2hEEU","v2eC3C2Irc","BpYhVsoy9t",
+"a00b5pFrrl","ru4UGFxX9q","BpYhV9XyT9","gf8rIiKqhr","7lUXZGSQwj","fcwDaYh1hF","ni2v10MR5X","pmeCdfcwDa","ksJbyTa8f6","5VZjSgf8rI",
+"CNHmvksJby","BpYhVZv7z0","Cp3mZogLgc","Ul4a1MGlTF","O3iyQStlDJ","ix74rtjQxs","jSjS3Pb1pa","lViBva00b5","D6rBy2Nslm","ulk41ZuDtD",
+"vLsmSK20wK","uupzksx5Gl","zmLYDlj07Q","9eoRcNo0Qb","FnPFB7fKYU","Waim6Fhtgl","taOXKlViBv","qaofNEdBKc","SjskQIn3NS","iqv4kBFkb8",
+"s4786wDajX","pAhR1n1pmO","azIWpMmsIo","C2IrcS2Dfu","hUTw7Pb1pa","t98iWRpBQm","Yw2oUzQt6Q","uQIcz2Yz7E","0PktIF6PT2","dhSuH45cIH",
+"9eoRcrhl0J","h1zcHnlaBy","8U2nUWaim6","FLsphOHaBz","QssNCQnJ1S","n8pJ9D6rBy","faHirsx5Gl","5ZaEzMmKGJ","2TRI7HP433","Ul4a1vLsmS",
+"rz7UtzFgtB","prNT6o8Uyd","lweGybrhlQ","Waim6M6qcG","MmsIoM3zXL","AmdQdUlU3M","CK5W70BmCy","Gv3FqyvOMI","uQIczogLgc","RpBQmOHaBz",
+"taOXKn8pJ9","ThjNnCIShG","AOgEeWreyP","FcWrWZzJHW","8FmFHdhSuH","m4bxUmz8gx","S2DfuZuDtD","iKqhrCqqaD","UmaEvC2Irc","3weIFYOfrY",
+"DG4sTpWiOs","Cp3mZjSjS3","MGlTF0Kyfs","jiVBPd85a9","IBe8kRpBQm","dhSuHVjCZq","yvOMIC2Irc","SjskQ5iGN5","4dEz6ix74r","K4GS8qaofN",
+"fmIK1RpBQm","uJScXZv7z0","0BmCyAOgEe","JRJQBni2v1","CxVEfiKqhr","rKDLJMezSW","GWqqXRxrsm","JIqXiM6qcG","Yw2oUuPX7G","gtCA50h1b1",
+"qaofNM3zXL","t98iWSbRYy","LbRTHTwano","nFqikYOfrY","Ss0ZupmeCd","jtn0Xy94nw","NhXduZ4I1v","aDGtSOxWIH","DG4sTFxX9q","jeskSC2Irc",
+"ZUnqtdpe1v","8U2nUYw2oU","6q6L92Yz7E","oGu6xcQOnv","3weIFokgRi","XflUq2DREs","BGaQYrz7Ut","4QMc9gdQsS","9y4lwlm0pD","G1RhSTa8f6",
+"gtCA5EOE1o","HlUbFuPX7G","OUYuFxReec","14FLRQYxC0","oQ87r0PktI","x3LDeCqqaD","pvgjSjtn0X","JkzUn9iGoT","dpe1vlpF6W","X6PinChuy3",
+"Dz1R3Dz1R3","0Kyfst59lR","vkCHHiKqhr","I7p2aJkzUn","yEfy98TxD7","CqqaDyEfy9","Yf2Ec48cHL","mX2GEi3pyd","B3qemdQ586","bZLvS6AFT0",
+"a00b5yluBx","2hEEUWDVWJ","StlDJ6q6L9","VNCPdjtn0X","i7WMQFnPFB","SjskQOz8yZ","okgRiFcWrW","IRh48tvdkD","OUqFM0Wr5y","uAWyplViBv",
+"RACuj7lUXZ","Cfgr3uLtKs","XflUqNxx9V","brhlQAOgEe","NAFuwyToGW","ix74rpT8wu","7fKYUdhSuH","8cVD3uLtKs","faHirOUYuF","ni2v1o8Uyd",
+"Q6LixOUqFM","rKDLJatef2","MGlTFMaJQs","Chuy3oQ87r","ThjNnCqqaD","mX2GEpFrrl","JKWYRIKxdL","8TxD7Yh1hF","AXpwElCMxy","29QAzs4786",
+"xciqpI7p2a","fcwDaI7p2a","uupzkYjB9t","uPX7GGWqqX","8U2nUKsjRK","IRh48JKWYR","5IhmGStlDJ","fcJOy7fsYM","vLsmSyluBx","16lHcNo0Qb",
+"FVMxoECMvU","gf8rIDQimp","RACujb29RJ","lpF6WCqqaD","wDajXVBjhz","O3iyQgjUTu","SbRYyJ2mQi","NAFuwuPX7G","DG4sTpvgjS","uLtKsksJby",
+"9rlg9VjCZq","J2mQiNcICA","yluBxiqv4k","uZPqg2hEEU","9rlg9VBjhz","Pb1paEoToP","VNCPd8FmFH","UmaEvVNCPd","yEfy9hYBCK","4dEz6n1pmO",
+"8U2nU16lHc","IKxdLQbxXc","kB5nPOUqFM","fcJOyWmadA","kZANmb29RJ","Yh1hFPb1pa","hUTw7HfyNQ","StlDJ16lHc","lXFOBU3yw5","RACujnFqik",
+"XflUqWPmlx","FVMxojtn0X","0Wr5yuvf7A","JKWYR8xEKz","VNCPdo8Uyd","cL0aEoGu6x","pFrrlD6rBy","VIlwPG1RhS","dhSuHC2Irc","jeskSMK07Y",
+"AIYUu45cIH","3otm6X6Pin","BGaQY9iGoT","cQOnvvkCHH","4QMc9Chuy3","lCMxysx5Gl","Nxx9V2Yz7E","AIYUuqUJMd","fcwDaVIlwP","45cIHmX2GE",
+"ni2v1Oz8yZ","guMb8ksJby","iqv4kkB5nP","piJSkEoToP","CdyBVK4GS8","QChxsrhl0J","JRJQBS2Dfu","Uvlv47ku1p","Uvlv4WDVWJ","piJSkWaWsv",
+"bgJAzKr8ys","zbIYYuN6r3","POUYSuupzk","RsQUqMojnP","AXpwEMmsIo","SWfouGXdoH","FwEJzyEfy9","8hJdtqUJMd","ciuWzIBe8k","7fsYMBFkb8",
+"blLA9VerEA","nlaByQWxoT","yToGWWaim6","e6e4znnP8o","4dEz6MmsIo","5VZjSBCxeC","hYBCKMmKGJ","ciuWz0Wr5y","uvf7AkB5nP","xReec1LB1L",
+"IKxdLgjUTu","lm0pDI7p2a","WMiS314FLR","uoStwTXQ0Z","JkzUn3otm6","Ta8f6WreyP","EOE1olH1kt","tuDySxciqp","RACujGSQwj","48cHL9XyT9",
+"FhtglQnJ1S","qQxHPFPfSE","x3LDeMkgy8","pT8wu8RCUA","Yh1hFd7vjM","OUqFM0PktI","2hEEURkQke","OUqFM14FLR","AmdQdSWfou","yToGWrz7Ut",
+"RkQkeuvf7A","wDajXWreyP","bZLvSNo0Qb","x3LDelsQGo","Oz8yZY1mC0","WPmlxdmoS7","xciqpQbxXc","lweGyEdBKc","wDajXs7Mxk","s7Mxk2TRI7",
+"vLsmSDz1R3","zqH0WBpYhV","zQt6QJJs5m","pAhR1ulk41","gdQsSBpYhV","Y1mC0blLA9","hUTw7JIqXi","7Ow5CvLsmS","cShY22Yz7E","MmsIoVIlwP",
+"ni2v1a00b5","S77LHcShY2","rKDLJzHF1q","xXTI4WPmlx","brhlQ580YD","qaofNHzZT8","RBhp0RpBQm","5drc6lViBv","tlILtD6rBy","9eoRca00b5",
+"sqVrfECMvU","RzaZAuN6r3","JXljWzHF1q","BbwgA7ku1p","gjUTuCqqaD","hYBCK2hEEU","BbwgAhE1Ql","W3VFHTCgPp","hi5X7lweGy","8FmFHIRh48",
+"Dz1R3hi5X7","k85AejeskS","lkMUAKr8ys","0PktIjtn0X","7X3uyfLNg8","jS1ajv2eC3","i7WMQRxrsm","9iGoTTCgPp","qUJMdbgJAz","7ku1pFPfSE",
+"mz8gx4W0Tl","dhSuHni2v1","NhXdulH1kt","K4GS8tuDyS","FcWrWEOE1o","uAWypsx5Gl","kB5nPk85Ae","h1zcHQClRL","tjQxsMezSW","zqH0WnlaBy",
+"d7vjMdhSuH","45cIHCIShG","uQIcz14FLR","wDajXFLsph","AIYUuSmGzv","7lUXZyofH3","Ta8f6Mm8si","lViBvC2Irc","ydG8UTXQ0Z","mX2GE5Namm",
+"YjB9tEdBKc","Gv3FqyluBx","JJs5mtuDyS","O3iyQkZANm","64s8NQYxC0","BGaQYcShY2","uQIczWMiS3","Mkgy8LDk6f","pAhR1pmeCd","BpYhVlweGy",
+"5VZjSZJTXH","h1zcHLDk6f","FNYIMuLtKs","s7MxkSbRYy","uJScXuoStw","pmeCdRACuj","55rfBgIYvE","WPmlxVLTy6","brhlQQChxs","Mkgy8Yw2oU",
+"F6PT2L7cGc","tuDyS2DREs","Ta8f6nnP8o","JJs5mX6Pin","2NslmjS1aj","qaofN4dEz6","yofH3b29RJ","v2eC3Cp3mZ","m4bxUhE1Ql","atef2K20wK",
+"7hyVvQbxXc","uJScXFjHXR","OUqFMCqqaD","oGu6xnnP8o","8U2nUFhtgl","7ku1pzFgtB","QbxXcVLTy6","2Nslmm4bxU","iwzGkO3iyQ","Ss0Zu0Wr5y",
+"gIYvElpF6W","Cp3mZQssNC","QnJ1SVBjhz","wiHrZzz4ZU","Mkgy8cShY2","FFDuiQ6Lix","Waim6S77LH","5IhmGSbRYy","2Yz7Eix74r","Yw2oUfqypy",
+"qaofNhi5X7","RmDcrpmeCd","3otm6pFrrl","AOgEejtn0X","7hyVv0YAGH","lsQGoni2v1","24ARFLbRTH","8U2nU0Wr5y","nnP8ozHF1q","lj07Q5iGN5",
+"GWqqXGv3Fq","SWfouCNHmv","NhXduqaofN","jeskSzFgtB","Kr8ys8hJdt","0ao3lfcwDa","rKDLJokgRi","n8pJ9W7cTs","yofH3iqv4k","Q6LixRBhp0",
+"hi5X7ZhwG1","zz4ZUhSSvQ","lpF6WOHaBz","lj07Q29QAz","gjUTu0Wr5y","580YDChuy3","aL6AJv2eC3","iwzGkzHF1q","t98iW64s8N","iB08llViBv",
+"HzZT8HzZT8","0ao3l48cHL","Mm8si9GXkX","VLTy67X3uy","PYBf4EoToP","RBhp0WPmlx","XyPZN8U2nU","d7vjMZzJHW","5drc6jSjS3","Ta8f6rhl0J",
+"8xEKzd85a9","pv0i7F6PT2","uAWypJ2mQi","K4GS8uTacx","FjHXRZzJHW","kB5nPjzUqR","y94nwuQIcz","jtn0XlXFOB","rKDLJHfyNQ","VerEAyvOMI",
+"soy9tM3zXL","HfyNQQChxs","M3zXL4W0Tl","LDk6f2DREs","SjskQfFDrJ","0KyfsKsjRK","v1Hln8xEKz","45cIHWaim6","RzaZAfcJOy","ogLgceuZA5",
+"vkCHH07n1c","KASQ8uAWyp","S77LHgtCA5","zmLYDv8yFN","fcwDaeuZA5","VBjhzzbIYY","hUTw7WMiS3","FhtglCK5W7","Vprf29rlg9","tuDySvkCHH",
+"Yw2oUX6Pin","POUYSY1mC0","n1pmONcICA","Cp3mZ8U2nU","48cHLd7vjM","8TxD7Mkgy8","dQ586HRxd8","tvdkDX6Pin","x3LDegtCA5","Mm8siiKqhr",
+"WDVWJThjNn","ReKEWC2Irc","9y4lwv1Hln","ReKEWdpe1v","POUYSIRh48","DQimpUl4a1","guMb8piJSk","GXdoHqUJMd","cL0aEtuDyS","24ARFlsQGo",
+"prNT6QChxs","JIqXi7fKYU","Vprf2ksJby","v2eC3ogLgc","L7cGc24ARF","fmIK1BbwgA","8RCUA1LB1L","YOfrYfmIK1","uvf7A7fsYM","2hEEUe6e4z",
+"Kr8ysv1Hln","MmsIoSjskQ","t98iWVprf2","cL0aEMGlTF","AmdQdQbxXc","Q6LixGv3Fq","fcwDa7hyVv","fcwDahSSvQ","J2mQiCfgr3","0PktI4W0Tl",
+"NhXduTa8f6","MmKGJAOgEe","VLTy6M3zXL","lCMxym4bxU","VNCPdP6bcg","hSSvQgdQsS","0ao3lDQimp","wiHrZ8hJdt","JIqXiqQxHP","Cfgr3GrDg7",
+"580YDBFkb8","ksJbyReKEW","C2Irczz4ZU","9rlg9dpe1v","9iGoTPYBf4","s7Mxkv1Hln","jeskSEOE1o","14FLRpAhR1","hE1QlYjB9t","UmaEvMmKGJ",
+"8FmFH9eoRc","FVMxoguMb8","euZA5t59lR","tl72W24ARF","he9IAjfREu","8xEKzGWqqX","EdBKck85Ae","tAOsrQ6Lix","O3iyQnnP8o","SjskQBbwgA",
+"lViBvMojnP","uvf7AzQt6Q","IRh48hSSvQ","AmdQdBbwgA","Uvlv48FmFH","RBhp0zHF1q","jtn0XzY1GY","BFkb8IBe8k","gtCA5WMiS3","VLTy6he9IA",
+"SjskQxReec","5drc6uPX7G","HlUbFQClRL","NAFuwI7p2a","8xEKztaOXK","zqH0WzFgtB","0ao3l24ARF","BFkb8Q6Lix","BFkb8RBhp0","jtn0XCqqaD",
+"RBhp0RmDcr","uPX7GnnP8o","SmGzv7fsYM","i3pydI7p2a","yluBxhSSvQ","o8UydC2Irc","5ZaEzBFkb8","aFFssWreyP","lXFOBk85Ae","0PktISWfou",
+"NAFuwnFqik","zQt6Qni2v1","CK5W7xReec","GWqqX45cIH","JRJQBYw2oU","Chuy3MmKGJ","fFDrJhUTw7","9y4lwFwEJz","taOXKzz4ZU","DQimpNAFuw",
+"brhlQAXpwE","JIqXi48cHL","6q6L9Z4I1v","RzaZA16lHc","HP433QYxC0","uQIcz4QMc9","QbxXcU3yw5","lpF6W2DREs","OUYuFJXljW","Ss0ZusqVrf",
+"29QAzprNT6","s93MlcShY2","CIShGB3qem","d7vjMUlU3M","NAFuwx3LDe","16lHcfcJOy","CK5W7xXTI4","BpYhVatef2","MK07Y580YD","FNYIMVprf2",
+"QClRLYf2Ec","8TxD7o8Uyd","5Mg9r55rfB","yEfy9xReec","ogLgcQnJ1S","atef2xciqp","cmXIXsoy9t","n8pJ9AIYUu","FwEJztaOXK","64s8N55rfB",
+"VLTy6faHir","7Ow5CHfyNQ","xReecfcwDa","o8UydfmIK1","zbIYY7ku1p","yEfy9mz8gx","dmoS7GWqqX","RpBQm9GXkX","MmsIodpe1v","G1RhSuQIcz",
+"h1zcHKASQ8","IBe8kSmGzv","jtn0XLewvM","CqqaDQYxC0","FVMxoqUJMd","U3yw5HRxd8","W7cTsydG8U","YjB9tThjNn","n1pmOOUYuF","oQ87rNAFuw",
+"L7cGc1LB1L","FwEJz1j5L8","SbRYyzz4ZU","oQ87rGXdoH","d85a9v2eC3","7lUXZh1zcH","FwEJzlCMxy","Yw2oUguMb8","QssNCiqv4k","QssNCOUYuF",
+"2hEEUqUJMd","EoToPtAOsr","55rfB29QAz","uZPqgDG4sT","FFDuiv8yFN","cmXIXIn3NS","0KyfsI7p2a","D6rByStlDJ","ZhwG1RmDcr","7X3uy48cHL",
+"4W0TlRmDcr","uupzkvOqCE","gtCA5GrDg7","FxX9qFwEJz","K20wKoVQp6","7fKYUNxx9V","Cfgr3DG4sT","TwanogIYvE","vOqCEcL0aE","IjTwPgIYvE",
+"AmdQdOxWIH","l83Ud8cVD3","d85a9zFgtB","fmIK1dpe1v","BCxeCTCgPp","0KyfsJ2mQi","uPX7G4dEz6","ni2v1KsjRK","ZUnqtmz8gx","C2IrcBCxeC",
+"6AFT048cHL","tlILtjSjS3","qaofNLewvM","5IhmGokgRi","0BmCyQ6Lix","HRxd8Y1mC0","QWxoTM3zXL","tvdkDru4UG","Zv7z07hyVv","KZamHWPmlx",
+"jS1ajDz1R3","FxX9q8RCUA","4dEz6atef2","cQOnvD6rBy","CxVEfuAWyp","JKWYR5nmWv","tuDySMmsIo","No0Qb07n1c","yEfy9OUqFM","CdyBVtuDyS",
+"uupzkUvlv4","2Nslmru4UG","okgRiaez9y","Uvlv4e6e4z","HzZT8M3zXL","OHaBzaL6AJ","gtCA5uLtKs","DcpWB2Nslm","5ZaEzUl4a1","Y1mC05iGN5",
+"zQt6QS2Dfu","FnPFBSs0Zu","NOHszKASQ8","9eoRcsx5Gl","Ul4a1J2mQi","3otm6vOqCE","yToGWdhSuH","zmLYDlsQGo","dmoS7QWxoT","K4GS8zFgtB",
+"yEfy9taOXK","iKqhrM6qcG","5Mg9rPb1pa","qUJMd4W0Tl","POUYSqUJMd","lm0pD16lHc","jtn0XOxWIH","24ARFQworu","9GXkX5Drn0","s47868hJdt",
+"HRxd8tlILt","UmaEv0BmCy","2ZHdkNxx9V","DQimpjiVBP","2Nslm5nmWv","jfREu0h1b1","No0Qbl83Ud","lweGyokgRi","pv0i7FPfSE","QworuuJScX",
+"S77LH7ku1p","dmoS7ciuWz","ZuDtDQYxC0","vLsmSJIqXi","hE1Qlo8Uyd","BCxeCQbxXc","QChxs2ZHdk","fqypyXflUq","Yh1hFCqqaD","FcWrWJXljW",
+"vOqCEFPfSE","CNHmvW7cTs","FGzgp580YD","TXQ0ZzHF1q","Mm8sim4bxU","EOE1oSbRYy","azIWpK4GS8","VerEAlsQGo","DQimpazIWp","0Wr5yzQt6Q",
+"Waim6uoStw","oVQp6WDVWJ","MmKGJFwEJz","v1HlnHlUbF","QworuFcWrW","P6bcg55rfB","HRxd8O3iyQ","uoStw2Yz7E","X6PinGWqqX","zqH0WqUJMd",
+"0Kyfsb29RJ","OHaBzazIWp","8FmFHFwEJz","gdQsS7lUXZ","X6PinyvOMI","07n1cUl4a1","NAFuwX6Pin","MGlTFtl72W","HfyNQZzJHW","mz8gxyvOMI",
+"yofH36AFT0","taOXKY1mC0","faHirFFDui","ydG8UvOqCE","XflUquLtKs","QChxsAkKTk","suY4xguMb8","hUTw745cIH","0Wr5yMezSW","QYxC0NhXdu",
+"jSjS3d85a9","ZJTXH14FLR","OxWIHdmoS7","2NslmrKDLJ","K4GS8Pb1pa","UlU3Mzz4ZU","BpYhVjiVBP","wDajXF6PT2","tAOsrfLNg8","9y4lwpvgjS",
+"brhlQCNHmv","zY1GYi7WMQ","5ZaEzMezSW","0YAGH2ZHdk","yvOMIk85Ae","QssNCzFgtB","HRxd8JKWYR","IKxdLoGu6x","tvdkD580YD","FFDuiBGaQY",
+"wiHrZs4786","GrDg7WreyP","48cHLRxrsm","xXTI4taOXK","lweGynlaBy","gdQsS3otm6","F6PT2faHir","YjB9tUmaEv","fcJOyVIlwP","J2mQi0YAGH",
+"piJSkDQimp","xciqpgjUTu","YjB9tBpYhV","EoToPAOgEe","9rlg9cQOnv","VBjhz5IhmG","AkKTk2hEEU","SWfoufqypy","x3LDebrhlQ","J2mQi5iGN5",
+"AkKTk9eoRc","0YAGHvLsmS","lpF6WAkKTk","l83UdZJTXH","pFrrl16lHc","BFkb8LbRTH","8TxD7JIqXi","64s8NpT8wu","IRh48ZUnqt","pWiOsCIShG",
+"D6rByTwano","zHF1q7hyVv","SWfouStlDJ","P6bcgqQxHP","wDajXogLgc","VerEAcQOnv","HP433TCgPp","WPmlxOHaBz","7Ow5CStlDJ","No0QbbgJAz",
+"pAhR1Pb1pa","CqqaDjzUqR","rhl0Jpv0i7","cmXIXRxrsm","uvf7As4786","zQt6QzqH0W","WmadAZ4I1v","FLsphrKDLJ","AkKTkgtCA5","CK5W755rfB",
+"LDk6fNhXdu","n1pmOB3qem","IjTwPkZANm","ZzJHW8cVD3","zFgtBFjHXR","jeskSa00b5","L7cGcSbRYy","NcICA3weIF","pT8wuRBhp0","xciqpGWqqX",
+"oGu6xjS1aj","5iGN524ARF","TCgPpVIlwP","DLhzMk85Ae","uN6r3t98iW","XflUqYjB9t","piJSkWreyP","FNYIMNo0Qb","3otm6Zv7z0","W3VFHl83Ud",
+"4QMc9EoToP","qQxHPX6Pin","jiVBPBGaQY","zqH0WI7p2a","UmaEvm4bxU","9rlg9qUJMd","3weIFKr8ys","l83UdcmXIX","i7WMQcL0aE","9iGoTcQOnv",
+"CxVEfTCgPp","cShY2rKDLJ","JXljWBCxeC","VjCZq4dEz6","POUYSJRJQB","OxWIHQ6hMC","pvgjSEoToP","EdBKcZuDtD","LbRTHn1pmO","GSQwjaL6AJ",
+"djsrv8RCUA","ZzJHWZv7z0","k85Ae48cHL","07n1cFnPFB","v1HlnbgJAz","16lHcb29RJ","9y4lwoGu6x","yEfy9jfREu","4dEz6uoStw","7hyVvs93Ml",
+"FLsphbrhlQ","xReect98iW","6q6L9RsQUq","Twanos93Ml","8TxD7IjTwP","MmsIopT8wu","XflUqPYBf4","jeskSnnP8o","wiHrZMezSW","jS1ajfLNg8",
+"6AFT02Nslm","4QMc9l83Ud","kZANmiqv4k","HfyNQ7hyVv","C2IrcO3iyQ","3otm6i3pyd","FNYIMciuWz","mX2GECp3mZ","fLNg8prNT6","ni2v1Nxx9V",
+"TCgPpzmLYD","2TRI7Ta8f6","QClRLjfREu","aL6AJkZANm","zHF1qciuWz","5drc6nFqik","yEfy9HRxd8","s4786i3pyd","LewvMThjNn","ZuDtDv1Hln",
+"QYxC0pWiOs","zHF1qQ6Lix","lkMUAzHF1q","uupzk580YD","uoStwMGlTF","QYxC0JXljW","pWiOs3otm6","1LB1Lrz7Ut","5iGN5BCxeC","0KyfsyEfy9",
+"0KyfsBbwgA","AmdQduJScX","B3qemZhwG1","580YDOHaBz","yluBxDQimp","cQOnvOHaBz","IjTwPlCMxy","KASQ8SWfou","aez9yRmDcr","OUYuFOUYuF",
+"NcICADcpWB","tuDySv1Hln","zHF1qFcWrW","5nmWvQWxoT","atef2qUJMd","JJs5m9GXkX","CIShGWaWsv","C2Ircn1pmO","WreyP618Di","9eoRche9IA",
+"wiHrZvLsmS","2hEEU7lUXZ","suY4xDLhzM","vOqCE7fKYU","qaofNiB08l","jS1ajblLA9","ReKEWKZamH","SmGzvMmsIo","vkCHHRkQke","JIqXiIKxdL",
+"LewvMuJScX","n8pJ9RBhp0","9iGoTAXpwE","POUYSW3VFH","s7Mxksx5Gl","6q6L9bZLvS","64s8Nru4UG","uQIczfaHir","fcJOyZuDtD","atef2Dz1R3",
+"dhSuHwiHrZ","Oz8yZWDVWJ","0YAGHlweGy","Yf2EchYBCK","CxVEfFFDui","k85AeI7p2a","8hJdtHzZT8","Ul4a1NhXdu","atef2AkKTk","aez9yqQxHP",
+"Dz1R3ZUnqt","4dEz6G1RhS","SbRYyiwzGk","1j5L8tlILt","9eoRcFhtgl","2hEEUTa8f6","ulk41HzZT8","zz4ZUX6Pin","ZzJHWsuY4x","5nmWv0MR5X",
+"GXdoHs93Ml","JRJQBhE1Ql","FwEJzFwEJz","AgJHQ29QAz","Gv3FqWaWsv","aL6AJMojnP","fLNg8Cfgr3","JIqXiFPfSE","uoStwrKDLJ","0MR5XIjTwP",
+"0MR5XzHF1q","W3VFHFLsph","s7MxkaDGtS","pFrrlni2v1","o8UydZhwG1","GXdoHLbRTH","fLNg8JkzUn","i3pydCdyBV","5NammcmXIX","FGzgpDcpWB",
+"MaJQsJXljW","uvf7AK4GS8","8TxD7OUqFM","jSjS3ulk41","FnPFBpFrrl","7X3uyMmKGJ","C2IrclweGy","WMiS3kB5nP","soy9tS2Dfu","gf8rIVLTy6",
+"jSjS3i3pyd","blLA9SWfou","rz7UtMojnP","HlUbF45cIH","Dz1R3QWxoT","yvOMIzY1GY","lpF6WAOgEe","mX2GEsoy9t","JJs5mHfyNQ","uTacxlH1kt",
+"GSQwjlH1kt","QbxXcHRxd8","2DREs2Yz7E","uAWypNo0Qb","VerEA0PktI","No0Qb8hJdt","HRxd8Qworu","Y1mC0zmLYD","MmKGJvOqCE","AXpwEECMvU",
+"ni2v1BGaQY","7Ow5CY1mC0","MaJQsVNCPd","1j5L8iB08l","5VZjSRxrsm","RkQketaOXK","hYBCKP6bcg","NcICATa8f6","FxX9qt98iW","lsQGoUlU3M",
+"AOgEePYBf4","2Yz7Elj07Q","7Ow5CJJs5m","9rlg90Kyfs","l83UdhE1Ql","n1pmO8RCUA","0Wr5yIBe8k","Q6hMC0Wr5y","24ARFZJTXH","U3yw5XflUq",
+"QssNCOUqFM","S2DfucQOnv","1j5L807n1c","KsjRK0PktI","lweGy5IhmG","n1pmO9GXkX","M3zXLdhSuH","5ZaEzECMvU","0MR5XtAOsr","S2Dfu8FmFH",
+"K4GS8fqypy","lm0pDsqVrf","OxWIHKZamH","RzaZANcICA","BpYhVlCMxy","Uvlv4xReec","SWfouFhtgl","FcWrWBCxeC","zbIYYpWiOs","lsQGoOxWIH",
+"W3VFHqaofN","CxVEftaOXK","EOE1ooGu6x","BGaQY9y4lw","jfREuEdBKc","uLtKsuupzk","ECMvUTXQ0Z","tl72WYh1hF","OUYuF9XyT9","xReec9y4lw",
+"Yf2EcNcICA","48cHLJKWYR","SbRYys93Ml","iB08lS77LH","FVMxo64s8N","aez9yQworu","580YDOz8yZ","d85a9iqv4k","CIShGQ6Lix","RpBQm8cVD3",
+"hSSvQ5Mg9r","Fhtgllm0pD","fcJOy7hyVv","nFqik7fsYM","CqqaDjfREu","sx5GllXFOB","s7MxkFNYIM","4QMc9KZamH","M3zXLP6bcg","cQOnvfcJOy",
+"ksJbyGXdoH","Q6LixhSSvQ","M6qcGlCMxy","FjHXRAOgEe","7ku1pRzaZA","gtCA5prNT6","pT8wulViBv","nlaByb29RJ","uN6r3mz8gx","24ARF580YD",
+"WMiS33weIF","1LB1LQbxXc","ECMvULbRTH","SWfouVNCPd","DQimpOUqFM","JRJQBpFrrl","hSSvQfcJOy","t59lRwDajX","ECMvU5nmWv","dmoS7cQOnv",
+"3otm6cShY2","vkCHHjiVBP","WaWsvuZPqg","9iGoTguMb8","5Mg9ri7WMQ","BFkb80Kyfs","prNT6ZhwG1","n1pmOAXpwE","qQxHPDz1R3","ZUnqtGrDg7",
+"fLNg8yToGW","ydG8UGSQwj","XflUq7lUXZ","UlU3MdhSuH","MK07YBCxeC","pmeCd14FLR","ix74rAIYUu","RBhp06AFT0","0YAGHP6bcg","KASQ8cmXIX",
+"5VZjSuJScX","0Kyfsrhl0J","2TRI77lUXZ","BpYhVy94nw","RACujAIYUu","uN6r3xXTI4","9y4lw2DREs","iwzGks7Mxk","IBe8kt59lR","EOE1oK4GS8",
+"9eoRcy94nw","lCMxyeuZA5","tvdkDLbRTH","uZPqgJkzUn","MezSWUvlv4","WreyPTXQ0Z","KASQ8KZamH","7lUXZ8xEKz","5IhmGwiHrZ","uLtKs6AFT0",
+"a00b58TxD7","IRh48AIYUu","vLsmS24ARF","jfREudQ586","ThjNnv8yFN","ThjNnwDajX","uZPqg6AFT0","qUJMdzQt6Q","WaWsvlViBv","faHirNhXdu",
+"rhl0JciuWz","TCgPp3otm6","BCxeCC2Irc","hYBCK2DREs","hUTw7djsrv","aL6AJmX2GE","hE1QlzqH0W","tvdkDS2Dfu","0ao3lciuWz","mX2GEZv7z0",
+"m4bxUGv3Fq","EoToPCdyBV","euZA58hJdt","hSSvQX6Pin","uvf7A5nmWv","atef2he9IA","zbIYYqUJMd","TwanodQ586","Dz1R3Vprf2","pAhR19XyT9",
+"bZLvSt59lR","MmsIo8xEKz","qUJMdatef2","yofH3AOgEe","QssNC7X3uy","sqVrfSmGzv","KsjRKatef2","ReKEWW3VFH","IjTwPoVQp6","UmaEvNAFuw",
+"D6rBy0PktI","taOXK5drc6","9y4lwt59lR","hUTw7BGaQY","yEfy90PktI","UlU3MNcICA","7fKYUIjTwP","DG4sTjzUqR","lXFOBL7cGc","NAFuwC2Irc",
+"F6PT25drc6","aL6AJGrDg7","s7Mxksoy9t","Yh1hFuZPqg","0h1b1gIYvE","uJScXWaim6","AOgEeChuy3","soy9ty94nw","iKqhrzY1GY","cShY2UlU3M",
+"suY4xzHF1q","MojnPVjCZq","NcICAMGlTF","fmIK1blLA9","UlU3MEOE1o","bgJAzOUYuF","JIqXiRmDcr","0MR5XFjHXR","LewvMrz7Ut","JKWYRlViBv",
+"t98iW3weIF","tuDyS7fsYM","h1zcHo8Uyd","ni2v1aDGtS","Gv3FqoGu6x","aDGtSRpBQm","blLA9qaofN","9XyT9oGu6x","Pb1pa0PktI","k85AezY1GY",
+"blLA9taOXK","G1RhSsoy9t","yluBxs4786","LbRTHM6qcG","NcICAP6bcg","QssNCCqqaD","VBjhzuoStw","IjTwPWDVWJ","O3iyQXyPZN","tjQxsbgJAz",
+"FPfSEM6qcG","JJs5m2Nslm","Oz8yZv1Hln","580YDv1Hln","uJScX8FmFH","8hJdtyToGW","rz7UtVNCPd","S2Dfu3weIF","IKxdLdjsrv","EdBKc5IhmG",
+"hYBCK07n1c","NcICAx3LDe","IBe8k7hyVv","ydG8UTwano","zY1GYYjB9t","uvf7AnFqik","5Nammd85a9","5ZaEzTXQ0Z","RBhp0ZuDtD","0KyfsiwzGk",
+"DQimp8U2nU","SWfoujSjS3","vkCHH29QAz","QChxsfcwDa","JkzUnFjHXR","S2DfuY1mC0","YOfrYMezSW","ZhwG15IhmG","J2mQiOUYuF","P6bcgCIShG",
+"Q6hMCZJTXH","ix74rjeskS","2ZHdkAkKTk","AOgEed7vjM","TCgPpyluBx","KZamHfFDrJ","iKqhrv8yFN","UlU3MydG8U","Yh1hFhUTw7","VLTy6jzUqR",
+"W7cTsDz1R3","dpe1vjiVBP","Ta8f6RpBQm","Cp3mZ0MR5X","16lHcWmadA","Uvlv4Twano","tl72WCp3mZ","ogLgcbZLvS","suY4x29QAz","0h1b1GWqqX",
+"Mm8siRACuj","W3VFHFwEJz","QssNCni2v1","FPfSE618Di","7hyVvzbIYY","sqVrfdpe1v","tuDySzQt6Q","B3qem6AFT0","14FLRFPfSE","DLhzMJkzUn",
+"okgRiwiHrZ","pWiOsRmDcr","7lUXZzmLYD","IKxdLvkCHH","7hyVvx3LDe","wDajXpWiOs","GXdoH0ao3l","No0QbGXdoH","In3NSKsjRK","t59lRU3yw5",
+"FwEJzzFgtB","pT8wu4QMc9","euZA5jS1aj","cQOnvQbxXc","2NslmCqqaD","dQ586ksJby","8FmFH7ku1p","OUqFMsuY4x","mX2GEThjNn","BpYhVS2Dfu",
+"GXdoH16lHc","GSQwjfaHir","wDajXn1pmO","e6e4zaFFss","guMb8Mkgy8","2TRI7POUYS","yluBxnFqik","vLsmSpAhR1","TXQ0Z0MR5X","CNHmvFPfSE",
+"nnP8o7Ow5C","oVQp6aFFss","vLsmSBGaQY","taOXK2hEEU","CdyBVBbwgA","45cIH6q6L9","IRh48tAOsr","AIYUuSbRYy","nnP8ofcwDa","ni2v1Qworu",
+"DLhzMMaJQs","RsQUqK4GS8","TwanogdQsS","HP433Uvlv4","0BmCyB3qem","8TxD7fmIK1","s93MllXFOB","StlDJM3zXL","Ta8f6hUTw7","CIShGMezSW",
+"0Wr5yW7cTs","lCMxyWPmlx","8cVD3RkQke","0h1b19rlg9","IjTwPv8yFN","sx5GluQIcz","MmsIojzUqR","tAOsrrKDLJ","MK07YuPX7G","xciqpsqVrf",
+"NcICA24ARF","uTacxyToGW","v1HlnZhwG1","OUqFMuN6r3","618DiWreyP","Dz1R35IhmG","CdyBVU3yw5","07n1cs93Ml","a00b5NcICA","fcwDazFgtB",
+"ZzJHWWaim6","5Mg9rWreyP","8TxD7pFrrl","tuDySWPmlx","nnP8onlaBy","CNHmvtuDyS","uPX7GX6Pin","qUJMd8hJdt","Uvlv4tlILt","64s8Nuvf7A",
+"tlILtK4GS8","y94nwtuDyS","DLhzMWreyP","FLsphru4UG","FxX9qvLsmS","SbRYyJkzUn","FjHXRIn3NS","3weIFsuY4x","zbIYYWreyP","5ZaEzTa8f6",
+"bZLvS9eoRc","Q6hMCAmdQd","uvf7AHlUbF","AgJHQNhXdu","ZJTXHdmoS7","9eoRcgdQsS","HRxd8I7p2a","uN6r3CK5W7","rz7Ut8RCUA","1LB1LaL6AJ",
+"bZLvSxXTI4","JRJQBqQxHP","rz7Ut48cHL","CNHmvni2v1","9XyT9AkKTk","OUqFMPYBf4","cmXIXeuZA5","uN6r3Waim6","5Drn007n1c","lXFOBEoToP",
+"lCMxyzmLYD","FhtglP6bcg","qQxHPMkgy8","ZJTXHEoToP","TXQ0ZjzUqR","okgRinFqik","TXQ0ZxXTI4","RxrsmRzaZA","dhSuHIBe8k","rKDLJy94nw",
+"e6e4z8TxD7","fcwDauJScX","ZuDtDFnPFB","xXTI4uoStw","4W0Tlt98iW","MmsIosoy9t","AkKTkMGlTF","cmXIXDcpWB","lkMUAP6bcg","FcWrWni2v1",
+"07n1ciB08l","OUqFMjiVBP","hSSvQokgRi","cmXIXZhwG1","580YDdhSuH","5Drn02hEEU","yluBxydG8U","QWxoTfqypy","blLA9Oz8yZ","OHaBz5Namm",
+"BbwgAjiVBP","Zv7z0zQt6Q","QWxoTlXFOB","Cfgr3tlILt","RpBQmoQ87r","Twano5Namm","uupzkLDk6f","SbRYyJXljW","8cVD3aL6AJ","WMiS3DQimp",
+"mz8gxzz4ZU","lsQGoJJs5m","VNCPdJRJQB","dmoS7W3VFH","mX2GETa8f6","618DiqUJMd","Cp3mZStlDJ","7lUXZyToGW","uTacxcmXIX","s47862TRI7",
+"0BmCyFVMxo","FwEJzRmDcr","RsQUqIn3NS","uJScXZ4I1v","DcpWB0Wr5y","ZzJHWKsjRK","VIlwPKr8ys","WmadACNHmv","QworuAIYUu","i7WMQbgJAz",
+"7fsYMStlDJ","SmGzvWPmlx","W7cTs9iGoT","Y1mC0gjUTu","QnJ1STCgPp","he9IAjiVBP","Waim6lViBv","tAOsr2Yz7E","K20wKCdyBV","Yh1hFx3LDe",
+"0ao3lpT8wu","2hEEUNxx9V","8cVD3TCgPp","FPfSEmX2GE","hUTw70BmCy","O3iyQCqqaD","d85a9uAWyp","aFFssQClRL","v1HlnCK5W7","h1zcHS2Dfu",
+"jfREuChuy3","jiVBP24ARF","VNCPd0MR5X","Zv7z0WmadA","uPX7GZv7z0","QWxoT8RCUA","gIYvEpFrrl","uQIcz5IhmG","y94nwMaJQs","JIqXi2TRI7",
+"U3yw5VerEA","wiHrZZzJHW","FxX9qSs0Zu","K20wK0PktI","FxX9qAkKTk","nlaBybgJAz","qaofNvkCHH","aL6AJStlDJ","RzaZAQ6hMC","3weIFHlUbF",
+"hE1Ql8cVD3","o8Uydaez9y","55rfBl83Ud","cL0aEDG4sT","zmLYDUvlv4","0h1b1zFgtB","t59lR5VZjS","Kr8ysWmadA","48cHL1j5L8","Mm8sirKDLJ",
+"blLA97fKYU","rz7UtSmGzv","tl72WO3iyQ","Mm8si7fsYM","rz7Ut2TRI7","o8UydIn3NS","sx5GlpmeCd","fmIK19eoRc","WDVWJRACuj","ulk41Dz1R3",
+"lweGyaL6AJ","pT8wuksJby","uoStwgjUTu","DcpWBvLsmS","DQimpC2Irc","VLTy6D6rBy","uQIczPYBf4","CqqaDF6PT2","v2eC3lm0pD","t59lR2Nslm",
+"atef2dQ586","xReecYf2Ec","WPmlxZv7z0","hUTw7n1pmO","lH1ktZhwG1","U3yw55Namm","64s8NCxVEf","n1pmO0h1b1","Nxx9Vhe9IA","5Drn07hyVv",
+"9y4lwUmaEv","WMiS3Q6Lix","Q6hMCaez9y","2ZHdk0Wr5y","FcWrW2DREs","24ARFoVQp6","TXQ0ZbZLvS","5VZjSJ2mQi","FjHXRQWxoT","9XyT924ARF",
+"VjCZqFLsph","7Ow5CfLNg8","rz7UtMK07Y","lweGySWfou","zQt6QnFqik","k85Ae9iGoT","atef2zHF1q","9XyT91v5hH","RsQUqaez9y","x3LDejSjS3",
+"9iGoTHP433","FjHXRzY1GY","CxVEfRBhp0","1LB1LMojnP","fFDrJpiJSk","piJSkMaJQs","lpF6WC2Irc","Dz1R3bZLvS","uZPqg2DREs","IRh48cShY2",
+"2Yz7EBpYhV","16lHcNAFuw","ix74ro8Uyd","zFgtBfcJOy","LbRTHAkKTk","Y1mC0i7WMQ","VjCZqKr8ys","FFDui7X3uy","lsQGohYBCK","GrDg75nmWv",
+"Cp3mZLDk6f","kZANmPYBf4","AgJHQk85Ae","pv0i7fqypy","HfyNQ0PktI","8xEKz2DREs","UlU3MhUTw7","brhlQUmaEv","oVQp6QssNC","X6PinQnJ1S",
+"Dz1R3Nxx9V","qQxHP3weIF","s47860Kyfs","bZLvS5nmWv","y94nw6q6L9","FjHXRMojnP","Vprf2WPmlx","oGu6xn1pmO","6q6L95Namm","45cIHdpe1v",
+"a00b5AgJHQ","dmoS79rlg9","RzaZALbRTH","gdQsShSSvQ","Uvlv4MmsIo","HfyNQ2Yz7E","5Mg9rIKxdL","IjTwPJ2mQi","24ARFiqv4k","WaWsvStlDJ",
+"4QMc95drc6","lsQGopmeCd","AgJHQCfgr3","wiHrZ0h1b1","jS1ajIKxdL","tlILttvdkD","cL0aELewvM","gIYvEQYxC0","euZA5SWfou","pFrrlRmDcr",
+"mX2GERxrsm","rz7UtMm8si","uPX7GRpBQm","J2mQi2DREs","7ku1pAIYUu","WDVWJhSSvQ","HRxd8zFgtB","Cp3mZMmsIo","piJSktaOXK","JRJQBZv7z0",
+"16lHc8xEKz","OUqFMgdQsS","dmoS77X3uy","U3yw5zQt6Q","0Kyfs7hyVv","o8UydTwano","RkQke6q6L9","yEfy94QMc9","CxVEfru4UG","Cp3mZtuDyS",
+"sx5Glhe9IA","nlaByGWqqX","Cp3mZsx5Gl","lH1ktnFqik","7ku1pfFDrJ","ZuDtDsqVrf","No0Qblj07Q","8xEKz618Di","BCxeC5ZaEz","DcpWBFnPFB",
+"fcJOyvLsmS","HRxd845cIH","guMb8RACuj","GXdoHCNHmv","xciqpmz8gx","MK07YoQ87r","ZJTXHKASQ8","3otm6NAFuw","FwEJz1LB1L","fLNg8JXljW",
+"TwanoaL6AJ","4QMc9a00b5","bZLvSNxx9V","JRJQBru4UG","n8pJ9Waim6","uLtKsEOE1o","OxWIHlweGy","ciuWzF6PT2","jSjS3s4786","MojnP7fsYM",
+"jfREuuZPqg","hi5X73otm6","uPX7Gy94nw","5ZaEzl83Ud","WaWsvQssNC","FFDui7fsYM","RmDcr7hyVv","FwEJzWaWsv","7Ow5CAIYUu","Cp3mZ9rlg9",
+"No0Qb29QAz","dQ586hSSvQ","hUTw7No0Qb","yvOMI0ao3l","lj07QFPfSE","3otm6FxX9q","7fsYMQChxs","fmIK1pT8wu","5Drn0G1RhS","WDVWJ8RCUA",
+"bgJAzFGzgp","VBjhzjiVBP","pv0i7I7p2a","UlU3MJKWYR","gdQsSwDajX","7hyVvUl4a1","J2mQiqQxHP","fcJOyNcICA","QnJ1SWaim6","0Kyfs7fsYM",
+"lpF6WvOqCE","S77LHcL0aE","OxWIH2TRI7","dpe1vGv3Fq","PYBf4bgJAz","faHirzFgtB","RACujHP433","Ul4a1K20wK","0YAGHL7cGc","Q6hMCCNHmv",
+"Pb1paWreyP","jiVBPzmLYD","8hJdtvOqCE","yofH3zY1GY","a00b5M6qcG","x3LDet98iW","In3NSZ4I1v","sqVrfksJby","Y1mC05nmWv","GWqqXK20wK",
+"16lHctvdkD","7lUXZZzJHW","tAOsrhUTw7","5NammCfgr3","rKDLJ9iGoT","0Wr5yTwano","Dz1R3RsQUq","5iGN5BGaQY","uupzklCMxy","zbIYYZuDtD",
+"hSSvQTCgPp","HP433QssNC","vLsmSP6bcg","RxrsmtlILt","RpBQmhYBCK","xReeczbIYY","IBe8kfaHir","MaJQszY1GY","zbIYYSbRYy","TXQ0Zulk41",
+"WaWsvlCMxy","tl72Wn8pJ9","QYxC0SWfou","piJSk8RCUA","29QAzdpe1v","tuDyS07n1c","hUTw7lViBv","JKWYRjzUqR","prNT6OUqFM","Gv3FqZv7z0",
+"9rlg9Dz1R3","iqv4klCMxy","4dEz6rKDLJ","WDVWJHP433","9y4lw2Nslm","zQt6QzY1GY","DG4sTnnP8o","RsQUqD6rBy","RpBQmXyPZN","zY1GY3otm6",
+"tl72WyvOMI","IKxdLt98iW","2NslmLewvM","gdQsSK20wK","nFqikfqypy","yEfy955rfB","EoToPlH1kt","ulk41MGlTF","uJScX2Nslm","zQt6QdmoS7",
+"xciqpeuZA5","B3qemru4UG","oGu6xCqqaD","24ARFokgRi","5ZaEzO3iyQ","RmDcrlXFOB","pT8wuuZPqg","0BmCyEOE1o","ZuDtDrhl0J","TCgPp7fsYM",
+"rz7Ut07n1c","J2mQitaOXK","yofH3pWiOs","VLTy6RsQUq","qQxHPpFrrl","4dEz67lUXZ","W7cTsWDVWJ","VjCZqdmoS7","5IhmG3otm6","K20wKIKxdL",
+"0KyfsjiVBP","L7cGcUvlv4","7hyVvSmGzv","fcwDagjUTu","m4bxU5drc6","ZuDtDSWfou","No0QbyToGW","d85a9WaWsv","ECMvUgdQsS","b29RJdpe1v",
+"16lHcFhtgl","RACuj2Nslm","vkCHHvLsmS","pvgjSru4UG","2NslmRmDcr","AOgEetlILt","I7p2aRkQke","5VZjSAOgEe","MK07YpFrrl","VerEA2Nslm",
+"lpF6WhE1Ql","lj07QazIWp","5Namm1v5hH","wDajXrKDLJ","5ZaEzLbRTH","m4bxU7fKYU","2TRI7lCMxy","uQIczDQimp","48cHLpmeCd","55rfBhUTw7",
+"5nmWvZ4I1v","tl72WC2Irc","14FLR4W0Tl","OUqFMksJby","IRh48jiVBP","YjB9tru4UG","QbxXctvdkD","IBe8kWmadA","FjHXRVerEA","rhl0JrKDLJ",
+"yofH3tuDyS","DLhzM6AFT0","i3pydogLgc","yofH3zHF1q","5nmWvcShY2","9GXkXSmGzv","tAOsrThjNn","rz7UtFVMxo","HfyNQprNT6","ThjNniqv4k",
+"0KyfsRkQke","RsQUq1v5hH","YjB9thUTw7","GWqqXK4GS8","2hEEUFNYIM","BCxeCiwzGk","tAOsrqQxHP","BCxeCyvOMI","zY1GYnlaBy","MGlTFFnPFB",
+"b29RJ7lUXZ","7lUXZazIWp","UlU3M0BmCy","KsjRKvOqCE","UlU3MUlU3M","2hEEUlj07Q","F6PT2fFDrJ","Ta8f67X3uy","RxrsmFnPFB","POUYSfmIK1",
+"yluBxxReec","AgJHQBFkb8","JkzUnatef2","uN6r3ksJby","2ZHdkx3LDe","gIYvELewvM","i3pydjS1aj","gIYvEMmsIo","VBjhzFxX9q","lViBv29QAz",
+"Yh1hFiwzGk","ciuWzaL6AJ","M3zXLAkKTk","kB5nPRACuj","x3LDehE1Ql","s4786aFFss","0YAGHlViBv","AgJHQi3pyd","XyPZNQYxC0","9iGoTGWqqX",
+"y94nws7Mxk","5drc6WMiS3","QnJ1Sh1zcH","uPX7GFwEJz","5Mg9rxXTI4","GSQwjpWiOs","taOXK3weIF","FVMxoF6PT2","7Ow5CKASQ8","s4786Twano",
+"S2DfuBbwgA","CxVEfdQ586","ZJTXHGXdoH","XyPZN2DREs","EOE1o5Namm","xReechUTw7","s7MxkNAFuw","7X3uy45cIH","TXQ0ZFjHXR","gIYvEuvf7A",
+"S2Dfuulk41","djsrvbrhlQ","d7vjMn8pJ9","8U2nUn8pJ9","Zv7z0zY1GY","0PktIO3iyQ","hi5X7faHir","ni2v1ydG8U","UlU3Mix74r","Ss0ZubgJAz",
+"piJSksx5Gl","zqH0WPOUYS","qQxHP24ARF","uZPqgaFFss","Zv7z0fFDrJ","VjCZqgjUTu","EoToPAkKTk","AXpwEaez9y","WMiS3s7Mxk","BpYhV8TxD7",
+"2DREsoQ87r","7fsYM5Mg9r","lXFOB2ZHdk","BCxeCIjTwP","M3zXL5Mg9r","GXdoHWreyP","s93MlWMiS3","vkCHHyofH3","Yw2oUTa8f6","TXQ0Zuupzk",
+"jfREufqypy","CIShGwDajX","oVQp6i3pyd","Dz1R3mz8gx","L7cGckZANm","Oz8yZyluBx","t98iWDcpWB","azIWpGSQwj","ZzJHWpAhR1","mz8gx6AFT0",
+"QChxsZhwG1","tlILtU3yw5","In3NSmz8gx","wDajXWaim6","MmKGJfcJOy","faHirOz8yZ","Yw2oUVjCZq","JKWYRjfREu","hE1QlMGlTF","5Drn0uupzk",
+"FPfSEY1mC0","5nmWvZhwG1","pT8wuXyPZN","e6e4zPb1pa","zHF1q6AFT0","Vprf2zbIYY","L7cGc29QAz","S2DfupmeCd","IRh48sx5Gl","fcJOyatef2",
+"iqv4kjtn0X","jSjS316lHc","tvdkDRBhp0","Oz8yZlj07Q","0h1b1W7cTs","zY1GY7X3uy","tlILtru4UG","d85a9cL0aE","0PktIpvgjS","NcICA8U2nU",
+"s7MxkVNCPd","U3yw5oVQp6","uQIcz5drc6","M3zXLWPmlx","DLhzMECMvU","RmDcrzz4ZU","nnP8o9XyT9","dQ5863otm6","8FmFHMK07Y","VBjhzguMb8",
+"BGaQYCK5W7","NcICAokgRi","tvdkD5nmWv","ru4UGlH1kt","dmoS78RCUA","07n1cReKEW","qUJMd48cHL","gdQsSulk41","t98iW4W0Tl","he9IA0Wr5y",
+"x3LDejfREu","RmDcr2Nslm","tjQxspvgjS","n1pmOpT8wu","aDGtSjfREu","WMiS3L7cGc","1LB1LFjHXR","JXljWWMiS3","B3qemMK07Y","WmadAbgJAz",
+"cmXIXru4UG","jfREujSjS3","OxWIHv8yFN","TwanoEoToP","IKxdLuQIcz","JXljWS77LH","3otm6sqVrf","S2Dfu8TxD7","Cfgr3FjHXR","2ZHdkSs0Zu",
+"fqypy2TRI7","RsQUqd85a9","1v5hHtAOsr","nFqik5nmWv","mz8gx7fsYM","OHaBzuZPqg","Q6LixXflUq","AOgEeSbRYy","bgJAzFjHXR","J2mQiDG4sT",
+"pFrrl14FLR","taOXKjiVBP","xXTI4gIYvE","CNHmvwiHrZ","QworuWmadA","FjHXRNo0Qb","zqH0WVprf2","uLtKsCp3mZ","CIShGLbRTH","uoStwSWfou",
+"uJScXJJs5m","J2mQiBFkb8","xReec7Ow5C","RsQUqJkzUn","4W0TlWPmlx","uZPqgW3VFH","JkzUnNOHsz","Mkgy8J2mQi","48cHLvkCHH","NcICAhYBCK",
+"ni2v1DcpWB","hE1QlVBjhz","UmaEvbrhlQ","gIYvEx3LDe","3otm6M6qcG","4dEz624ARF","S2Dfun8pJ9","580YDdmoS7","y94nwZzJHW","2ZHdk618Di",
+"dhSuHnnP8o","ZzJHWfcJOy","nFqik0Wr5y","i7WMQMK07Y","7ku1p2hEEU","IjTwPMmsIo","gjUTuDG4sT","sx5GlUl4a1","0h1b1YOfrY","RzaZAulk41",
+"QbxXcv2eC3","v2eC3Cfgr3","sx5GlHRxd8","M6qcGRpBQm","cShY2W7cTs","8RCUAx3LDe","soy9tmz8gx","MGlTF64s8N","AIYUulweGy","FnPFBB3qem",
+"cmXIXuupzk","IjTwPIjTwP","dQ586fcJOy","L7cGcPb1pa","S2DfuaFFss","gIYvEWMiS3","he9IAFGzgp","ZJTXH2DREs","16lHcokgRi","zmLYDYh1hF",
+"Yw2oUnlaBy","gjUTuaez9y","uJScXaFFss","Q6LixYh1hF","YjB9tpiJSk","RsQUqnFqik","prNT6qQxHP","aez9ymX2GE","t59lRt59lR","AmdQdlCMxy",
+"ReKEWYf2Ec","aez9yNo0Qb","uLtKsh1zcH","StlDJaFFss","Kr8ys0h1b1","TwanohUTw7","v8yFNQworu","HRxd8RpBQm","v8yFNK4GS8","RACujZuDtD",
+"euZA5v8yFN","s4786rhl0J","7ku1pRBhp0","QClRLGSQwj","8RCUAuPX7G","8TxD7b29RJ","S77LHv8yFN","k85AetAOsr","RACujAgJHQ","kZANmQYxC0",
+"fcJOyL7cGc","aL6AJS2Dfu","ReKEW580YD","1LB1LeuZA5","ThjNn1j5L8","2hEEU8cVD3","MmsIoDcpWB","i3pydzFgtB","DQimptlILt","jzUqRDQimp",
+"5Mg9r8U2nU","zbIYYs4786","KASQ82DREs","zbIYYs7Mxk","VLTy6ciuWz","YjB9thE1Ql","7ku1pblLA9","QssNCPb1pa","POUYSFnPFB","fcJOyJRJQB",
+"ZJTXHCdyBV","RzaZArKDLJ","pAhR1guMb8","MGlTF580YD","2ZHdkAXpwE","DG4sTSmGzv","EdBKctuDyS","45cIHzQt6Q","1j5L86AFT0","dmoS70YAGH",
+"bgJAzZJTXH","U3yw514FLR","sx5GlVNCPd","BCxeCtlILt","ksJbyuN6r3","jtn0X5Namm","jSjS3Mm8si","x3LDeQ6Lix","VNCPdtuDyS","aez9yPYBf4",
+"P6bcg2TRI7","S77LH9rlg9","dQ586djsrv","rz7UtcQOnv","uPX7GuZPqg","9XyT9hYBCK","wDajXkB5nP","fFDrJyEfy9","8hJdtMezSW","Yw2oUlj07Q",
+"lViBvy94nw","HzZT8zFgtB","n8pJ95drc6","uLtKsfqypy","HzZT8RpBQm","uJScXQworu","gIYvEHRxd8","EdBKcYjB9t","DcpWBiwzGk","2ZHdkhe9IA",
+"HzZT89GXkX","cmXIXzqH0W","2ZHdkCqqaD","ZJTXHfaHir","ECMvUYh1hF","bZLvSprNT6","W3VFHRmDcr","Mkgy80PktI","2NslmQClRL","8cVD3pvgjS",
+"7hyVvuoStw","1v5hHFnPFB","x3LDeWMiS3","aDGtSQssNC","7lUXZFLsph","yofH3sqVrf","aFFssB3qem","UmaEv5ZaEz","v8yFNAkKTk","bgJAzQWxoT",
+"7fKYU0MR5X","tuDySo8Uyd","8hJdtFjHXR","RmDcrl83Ud","MK07YX6Pin","RkQkezbIYY","y94nw5drc6","x3LDe64s8N","QnJ1SMK07Y","zFgtBGSQwj",
+"7fKYU24ARF","iqv4k55rfB","NhXdubgJAz","zY1GYeuZA5","AgJHQiqv4k","B3qemHRxd8","RmDcrW3VFH","tAOsrlweGy","O3iyQoVQp6","Dz1R30BmCy",
+"tvdkDDLhzM","nFqikWaWsv","piJSknlaBy","Cp3mZjeskS","iB08lOUYuF","FPfSEQChxs","Nxx9Vt98iW","DcpWBKr8ys","o8UydFPfSE","pmeCdBFkb8",
+"mz8gxsuY4x","zqH0WVLTy6","KASQ8uLtKs","Ss0Zu4W0Tl","aL6AJxReec","aez9yni2v1","Vprf2gtCA5","0BmCy5IhmG","GrDg7cShY2","F6PT2dpe1v",
+"618DiVLTy6","5iGN5LewvM","UlU3MZuDtD","soy9tFxX9q","64s8NdmoS7","Pb1paIBe8k","tl72W3otm6","YOfrYSbRYy","24ARFaez9y","HzZT8OxWIH",
+"45cIHJJs5m","VLTy6lj07Q","lweGy9GXkX","2hEEUGrDg7","Ul4a15drc6","VBjhztlILt","FVMxoNcICA","azIWp5Drn0","8hJdtcShY2","48cHLfqypy",
+"8xEKz8FmFH","uupzk0Wr5y","o8UydZzJHW","2ZHdkW7cTs","9y4lwdjsrv","pWiOss93Ml","4W0Tll83Ud","cQOnvuvf7A","nFqikThjNn","zqH0WWDVWJ",
+"lweGyGSQwj","G1RhSYOfrY","Zv7z0yofH3","48cHLS2Dfu","GXdoHAmdQd","LDk6f0MR5X","iKqhr8U2nU","MezSWNo0Qb","MGlTFCqqaD","mX2GE0MR5X",
+"AkKTkCqqaD","JkzUnzHF1q","YOfrYru4UG","LbRTHRmDcr","U3yw5Kr8ys","GrDg7cQOnv","DcpWBh1zcH","7hyVvZUnqt","ydG8UNxx9V","v8yFNEdBKc",
+"gtCA5v8yFN","t59lRuN6r3","Yh1hFP6bcg","KsjRKFLsph","O3iyQ8xEKz","KZamH9rlg9","lCMxyHfyNQ","brhlQn8pJ9","SmGzv7lUXZ","OxWIHSjskQ",
+"iqv4kHlUbF","RkQkeMkgy8","8hJdtB3qem","jfREudjsrv","yEfy9M3zXL","ECMvU9y4lw","Cfgr34W0Tl","HfyNQuQIcz","aDGtSCxVEf","pvgjStaOXK",
+"uAWyplm0pD","jS1ajFhtgl","zqH0WUlU3M","kZANmWPmlx","WDVWJv2eC3","brhlQ8U2nU","cShY25iGN5","MmKGJNhXdu","MaJQsjSjS3","9eoRcIjTwP",
+"Nxx9VVNCPd","aFFssMm8si","yofH3VLTy6","iwzGkjeskS","7fKYUTa8f6","JIqXiNAFuw","IKxdLhi5X7","14FLRvOqCE","AOgEeqQxHP","MaJQsgIYvE",
+"yvOMIvkCHH","X6PinJRJQB","SbRYy6q6L9","AOgEeMGlTF","lkMUAD6rBy","HfyNQi3pyd","4QMc9MojnP","BbwgAFLsph","jS1aj0BmCy","aDGtSzqH0W",
+"blLA9gtCA5","LewvMDLhzM","jS1ajwiHrZ","TXQ0Ziqv4k","atef2NOHsz","brhlQVBjhz","XflUqFnPFB","lH1ktMmKGJ","KsjRKzFgtB","faHir5ZaEz",
+"ru4UG5Drn0","gtCA5JJs5m","JXljWprNT6","fcJOyM3zXL","azIWp8U2nU","xXTI4Q6Lix","7lUXZ0ao3l","zz4ZUOHaBz","aL6AJa00b5","Cfgr3uJScX",
+"dmoS7ZJTXH","ZuDtDThjNn","qUJMdv8yFN","ciuWz1v5hH","ulk410MR5X","TwanoVNCPd","In3NS5VZjS","cL0aEuTacx","6AFT0jS1aj","W3VFHFjHXR",
+"atef2dhSuH","yToGWBFkb8","7ku1pjiVBP","jSjS35Drn0","fFDrJciuWz","DLhzMFFDui","uAWyphUTw7","WPmlx55rfB","mz8gxxciqp","pvgjSOUYuF",
+"yvOMIwiHrZ","5Drn0jeskS","QWxoTe6e4z","jiVBPpWiOs","EOE1oGSQwj","pWiOsqUJMd","5NammReKEW","MGlTFVNCPd","VNCPdI7p2a","ECMvUgjUTu",
+"FjHXRWaim6","vLsmSaDGtS","Cp3mZGWqqX","Chuy38RCUA","sx5GlblLA9","jfREuHlUbF","rKDLJCxVEf","WMiS3lsQGo","XflUqGv3Fq","AIYUuKr8ys",
+"tAOsrJIqXi","l83Udsoy9t","D6rBy7fKYU","7fKYU9rlg9","2Yz7EVLTy6","FFDuinlaBy","In3NS3otm6","Ul4a15VZjS","8TxD7t59lR","RkQkelCMxy",
+"StlDJZuDtD","fLNg8lViBv","hE1QlhSSvQ","ECMvU2Yz7E","8xEKzuQIcz","brhlQMK07Y","Cfgr3k85Ae","Uvlv4d85a9","dQ58664s8N","n8pJ9mX2GE",
+"GrDg7gjUTu","G1RhSjeskS","QClRLix74r","ru4UGvLsmS","CIShGXflUq","IBe8kSs0Zu","oQ87r8hJdt","0h1b1hi5X7","s7MxkuAWyp","piJSkCK5W7",
+"xReecQbxXc","uZPqguTacx","Chuy3DQimp","OUYuFTwano","lm0pDmz8gx","NhXduJJs5m","3weIFiqv4k","16lHcMkgy8","GrDg729QAz","Vprf2MojnP",
+"aDGtSFhtgl","Uvlv4lj07Q","8RCUAYjB9t","0Wr5ycmXIX","2NslmRxrsm","dhSuHru4UG","Zv7z0mz8gx","x3LDe1j5L8","jfREuNOHsz","fcwDa4W0Tl",
+"uPX7GMezSW","IjTwPazIWp","LbRTHZ4I1v","fLNg8VNCPd","P6bcgGv3Fq","LDk6fjtn0X","W7cTs16lHc","nFqiksoy9t","lkMUAguMb8","ru4UGMmsIo",
+"v1HlnFFDui","8xEKzRBhp0","P6bcgVerEA","Oz8yZ5ZaEz","CNHmvyEfy9","lj07QjSjS3","QworuSWfou","WmadA9eoRc","pWiOsKASQ8","9rlg9P6bcg",
+"aDGtSbrhlQ","lsQGoCIShG","7fsYMIn3NS","No0Qb2TRI7","fqypyJRJQB","aL6AJNhXdu","HP433MaJQs","azIWpeuZA5","aL6AJEoToP","m4bxUguMb8",
+"cQOnvlCMxy","9rlg94W0Tl","O3iyQsqVrf","NAFuwYh1hF","DG4sT6q6L9","L7cGcBFkb8","VLTy6Mkgy8","X6Pin6AFT0","soy9tfcwDa","VjCZqIBe8k",
+"FcWrWKASQ8","uPX7GOxWIH","oQ87rkB5nP","Qworu8hJdt","VLTy6S2Dfu","QssNCk85Ae","8RCUAZv7z0","RBhp0Dz1R3","nFqikni2v1","WPmlxBFkb8",
+"OUqFM580YD","JXljWb29RJ","Ss0ZutAOsr","fcJOyVBjhz","FVMxov8yFN","lweGyFxX9q","FVMxoZJTXH","e6e4zt59lR","KsjRKix74r","BpYhVoGu6x",
+"yToGW7fKYU","b29RJ5nmWv","WDVWJzY1GY","vLsmSUlU3M","55rfBNo0Qb","sqVrfo8Uyd","i7WMQlH1kt","zHF1qjeskS","618DiFVMxo","QWxoTfmIK1",
+"Dz1R3Uvlv4","RkQkevkCHH","dhSuHVNCPd","h1zcHazIWp","TXQ0ZlsQGo","nlaByIjTwP","DcpWB8FmFH","RxrsmQWxoT","ZhwG1AkKTk","W3VFHS2Dfu",
+"zbIYYix74r","yofH35Drn0","a00b5K4GS8","EdBKcOUqFM","24ARF7fsYM","ZUnqt9rlg9","cmXIXJKWYR","rKDLJDcpWB","faHirFwEJz","QnJ1SRzaZA",
+"9y4lw0PktI","ZJTXHm4bxU","cShY2VLTy6","LDk6fX6Pin","gjUTujS1aj","aFFssNAFuw","nnP8oNOHsz","CIShGMojnP","Chuy3OUqFM","3otm62TRI7",
+"b29RJh1zcH","uAWypFjHXR","JkzUn64s8N","FGzgpkB5nP","v2eC3hi5X7","F6PT2cL0aE","VNCPdHfyNQ","4W0TlYOfrY","CIShGKr8ys","SbRYyguMb8",
+"brhlQDG4sT","yvOMIbgJAz","HzZT8CqqaD","KsjRKQWxoT","oQ87rYw2oU","S77LHm4bxU","lm0pDOUqFM","v2eC35drc6","W3VFHZuDtD","piJSktuDyS",
+"5ZaEzhE1Ql","ThjNn4QMc9","gIYvETXQ0Z","W7cTs5IhmG","CxVEfdmoS7","hSSvQaFFss","uPX7GIRh48","TCgPplweGy","DG4sTwDajX","lsQGoY1mC0",
+"pFrrlm4bxU","Uvlv42TRI7","4W0TlokgRi","Cp3mZMaJQs","zHF1qlkMUA","Chuy3ydG8U","FjHXR0BmCy","0BmCyhi5X7","zqH0WtAOsr","uupzkzbIYY",
+"QChxs9eoRc","zz4ZU8FmFH","rz7UtAgJHQ","hSSvQy94nw","iB08lwDajX","ix74rlkMUA","2Yz7EFhtgl","hE1QlMK07Y","KASQ8vkCHH","ECMvUC2Irc",
+"2DREsW3VFH","tlILtqUJMd","pmeCduLtKs","IjTwP9y4lw","qUJMdEOE1o","7fsYMCNHmv","ogLgcs93Ml","lH1kt7fKYU","FcWrWDz1R3","FNYIMv1Hln",
+"ReKEWuTacx","2TRI7YjB9t","VIlwPI7p2a","bgJAzyToGW","Nxx9VkB5nP","nFqikDQimp","dQ586xXTI4","AIYUu5Namm","brhlQC2Irc","XyPZNpv0i7",
+"fcwDaxciqp","JRJQBW7cTs","i3pydMK07Y","Waim6vkCHH","HRxd8J2mQi","a00b5VIlwP","7Ow5Chi5X7","lkMUA5ZaEz","dhSuHtlILt","0YAGHZuDtD",
+"BGaQYUlU3M","2Yz7E48cHL","7fsYM9GXkX","VjCZql83Ud","OHaBzJIqXi","QbxXcQ6Lix","8xEKzFFDui","5drc6wDajX","uPX7G5iGN5","2ZHdkThjNn",
+"lj07Q8xEKz","JJs5msqVrf","0PktIYh1hF","7fsYMiB08l","5NammQYxC0","JKWYRVNCPd","HzZT8gdQsS","faHir0YAGH","16lHccShY2","5nmWvJJs5m",
+"cQOnvtl72W","W3VFHNo0Qb","zFgtBZ4I1v","OUYuFlCMxy","BCxeCix74r","dhSuHnlaBy","Cfgr3hE1Ql","9eoRcnFqik","RkQkegjUTu","uJScXECMvU",
+"QChxshUTw7","7fsYMi3pyd","SjskQ2ZHdk","ru4UGt59lR","TXQ0ZMmsIo","64s8NIBe8k","mX2GE2hEEU","nlaBy9y4lw","Y1mC0hUTw7","FwEJzQYxC0",
+"LbRTH4QMc9","uQIczNxx9V","F6PT2Vprf2","dmoS7Chuy3","hUTw7i3pyd","HzZT8bgJAz","NhXduQChxs","I7p2ajtn0X","0h1b1iwzGk","ReKEWFhtgl",
+"h1zcH8U2nU","MmsIoThjNn","1j5L8nlaBy","HP433BbwgA","ReKEWWDVWJ","618DiBpYhV","zFgtBpFrrl","POUYSru4UG","NOHszHlUbF","Q6hMC3otm6",
+"Ta8f6Q6hMC","iwzGkYf2Ec","y94nwCNHmv","jzUqRCK5W7","W7cTsuupzk","OxWIH1LB1L","euZA5LewvM","U3yw5s93Ml","nlaByC2Irc","S77LHfmIK1",
+"CK5W7piJSk","2NslmcShY2","JKWYR14FLR","Uvlv4cL0aE","Mkgy8h1zcH","4W0TlaL6AJ","YjB9tfFDrJ","Chuy3QChxs","AmdQdzHF1q","GXdoHMezSW",
+"IjTwPeuZA5","Mm8sih1zcH","8hJdtix74r","lXFOBfmIK1","IBe8kwiHrZ","07n1cqaofN","LbRTHzqH0W","gdQsSuQIcz","Vprf29iGoT","bZLvSHzZT8",
+"GSQwjNOHsz","x3LDeFwEJz","v2eC3Dz1R3","JkzUnZJTXH","WPmlxRACuj","Twanoni2v1","K20wKlj07Q","lsQGoZhwG1","MaJQs0BmCy","KASQ8AXpwE",
+"cQOnvdhSuH","QChxsTCgPp","jS1ajGrDg7","B3qemuPX7G","nnP8obrhlQ","pWiOs2ZHdk","55rfByEfy9","tuDySZJTXH","M3zXLs7Mxk","S77LHCNHmv",
+"lViBvRzaZA","2hEEULbRTH","qQxHPKr8ys","zQt6QlpF6W","0YAGHjSjS3","FcWrWgf8rI","BpYhV5VZjS","EOE1odpe1v","kB5nPeuZA5","PYBf4HRxd8",
+"hi5X7Rxrsm","M3zXL0BmCy","hYBCKMGlTF","jeskSbgJAz","uoStwfLNg8","gtCA5HlUbF","OUqFML7cGc","s4786FjHXR","qQxHPThjNn","bgJAzoVQp6",
+"SbRYy2ZHdk","OUqFMBGaQY","24ARFs7Mxk","i7WMQOz8yZ","LbRTHhSSvQ","ciuWzAIYUu","CK5W716lHc","pmeCdYh1hF","24ARF5Drn0","dQ586S2Dfu",
+"ZzJHW55rfB","cQOnv4W0Tl","45cIHKASQ8","guMb87lUXZ","4QMc9DLhzM","cmXIXfaHir","Mkgy8fcJOy","vOqCECxVEf","gdQsSsuY4x","prNT61j5L8",
+"o8UydjeskS","DQimp0BmCy","LbRTHfcJOy","l83Ud16lHc","t98iWguMb8","n8pJ9suY4x","5NammWaim6","2TRI7C2Irc","tjQxstaOXK","W7cTs0h1b1",
+"FxX9qyofH3","yofH3tjQxs","ulk41FnPFB","ZhwG1FVMxo","dmoS7pvgjS","DQimpQssNC","2ZHdktAOsr","ciuWzMmKGJ","SbRYy7fKYU","WDVWJMezSW",
+"NAFuwAmdQd","hi5X7QbxXc","0YAGHuvf7A","2ZHdkIKxdL","uLtKsRmDcr","Mkgy8Cp3mZ","guMb8Dz1R3","MojnPBbwgA","RkQkeRmDcr","AXpwEYw2oU",
+"lpF6WEdBKc","guMb8QbxXc","zY1GY8TxD7","YOfrYSjskQ","QnJ1STwano","fmIK1lViBv","x3LDeuoStw","ThjNn0PktI","B3qemZzJHW","cShY2JJs5m",
+"JRJQBwiHrZ","Waim6YOfrY","JXljWd7vjM","8hJdt0Kyfs","MojnPNo0Qb","BCxeCogLgc","VBjhzAOgEe","fmIK1pWiOs","DLhzMbrhlQ","bZLvSiqv4k",
+"MGlTFFLsph","lj07QuZPqg","9iGoTIKxdL","ciuWzZUnqt","AgJHQP6bcg","5nmWvQbxXc","24ARFRpBQm","yEfy9Dz1R3","QssNCSbRYy","xciqpEOE1o",
+"uvf7AcL0aE","MGlTFeuZA5","5VZjSW3VFH","hi5X7M3zXL","IRh48tjQxs","lkMUAJkzUn","hSSvQ2DREs","dmoS7OUYuF","HzZT8RkQke","CqqaDblLA9",
+"lweGytjQxs","LDk6fZUnqt","580YDCdyBV","FjHXRbrhlQ","DLhzM2Yz7E","2hEEUgIYvE","RmDcrZzJHW","RkQkeNcICA","FLsphl83Ud","HlUbFjS1aj",
+"Cfgr3rhl0J","s4786580YD","FVMxoTa8f6","hi5X7o8Uyd","07n1c48cHL","mz8gxXyPZN","MmsIolkMUA","jS1aj2Yz7E","MGlTFZuDtD","soy9tpiJSk",
+"aez9yzY1GY","7X3uyKASQ8","QYxC0s93Ml","16lHcZv7z0","nnP8oYh1hF","WmadAru4UG","2DREsdpe1v","iB08lkB5nP","8cVD3t98iW","i3pydsx5Gl",
+"yToGWFPfSE","fcwDa9eoRc","cmXIXdmoS7","pAhR1yvOMI","yofH3FcWrW","kZANmatef2","LewvMv1Hln","5IhmG4W0Tl","vOqCEciuWz","VIlwP9XyT9",
+"SWfouydG8U","G1RhSBFkb8","RBhp0FnPFB","v8yFN3otm6","Fhtglfqypy","zz4ZUYh1hF","9iGoTTwano","mX2GEjiVBP","9XyT9oVQp6","D6rByMezSW",
+"pAhR1iqv4k","hYBCKru4UG","mz8gxlXFOB","9rlg9WMiS3","2DREspiJSk","RkQkefFDrJ","JRJQBe6e4z","0Wr5yWaim6","KsjRKQbxXc","VjCZqlXFOB",
+"6q6L9ECMvU","Ul4a10YAGH","64s8N7ku1p","Z4I1vO3iyQ","uTacxaFFss","piJSkGWqqX","ru4UGhYBCK","mz8gxvOqCE","7fKYUqQxHP","yToGW5Drn0",
+"cL0aEQ6Lix","yofH3ECMvU","DcpWB0BmCy","uupzkNOHsz","iKqhrS77LH","WaWsvRBhp0","SmGzvM6qcG","uLtKsYw2oU","5Drn0J2mQi","uupzkix74r",
+"KsjRK0ao3l","6q6L9n1pmO","v1HlnyToGW","bZLvSMkgy8","MK07YZ4I1v","lm0pD45cIH","FwEJz7X3uy","tuDyS0Wr5y","5NammFFDui","S2Dfu8U2nU",
+"lsQGo7X3uy","oGu6xe6e4z","JKWYRtlILt","4dEz6QbxXc","azIWp8xEKz","ZuDtDG1RhS","JJs5mD6rBy","GWqqXi3pyd","tuDySuoStw","s4786ulk41",
+"0BmCyOUqFM","ReKEWQssNC","v2eC3OHaBz","gjUTuJ2mQi","TCgPp55rfB","Vprf2VLTy6","e6e4zuZPqg","zqH0WuQIcz","zY1GYfcwDa","MGlTFxXTI4",
+"wiHrZn8pJ9","2NslmFLsph","djsrvlViBv","MojnPCqqaD","QYxC0qQxHP","M3zXLOUYuF","jSjS3tl72W","ZUnqtaez9y","Yw2oUogLgc","lm0pDCp3mZ",
+"uupzkLbRTH","W3VFHqQxHP","FwEJzMojnP","2ZHdkNOHsz","jeskSMGlTF","O3iyQ2DREs","TCgPpatef2","YOfrY4W0Tl","8hJdtAIYUu","MK07YW7cTs",
+"yToGWaL6AJ","Ta8f66q6L9","okgRiKsjRK","m4bxUP6bcg","7X3uyEoToP","MojnPjSjS3","jS1ajlm0pD","okgRijfREu","FFDui8U2nU","8xEKzaDGtS",
+"xReecuupzk","n8pJ95Namm","618Dirz7Ut","lH1ktReKEW","MmsIoI7p2a","UlU3Mv2eC3","oQ87rfqypy","tuDySUmaEv","hYBCKM6qcG","Chuy3d85a9",
+"FjHXRrhl0J","cQOnvfLNg8","lH1ktX6Pin","ciuWz4QMc9","CxVEfCxVEf","GSQwjVIlwP","xXTI40Kyfs","hUTw7AOgEe","EOE1oGrDg7","Yw2oUFNYIM",
+"lpF6WQworu","VNCPd5Namm","Zv7z0AgJHQ","hSSvQmX2GE","7fKYUSjskQ","M3zXL4QMc9","FxX9q618Di","FVMxozz4ZU","7fsYM8xEKz","fLNg8BpYhV",
+"RpBQmTXQ0Z","zFgtBKASQ8","48cHLYOfrY","2Yz7ERmDcr","IRh48SjskQ","TCgPpCNHmv","OxWIHWaim6","2hEEUt98iW","v1Hlntl72W","nFqikFLsph",
+"IRh48cQOnv","rKDLJ2ZHdk","QbxXc7ku1p","tlILt9eoRc","Qworu8RCUA","CK5W7ECMvU","uupzkDcpWB","KASQ8NhXdu","MaJQsuJScX","uQIczpvgjS",
+"9iGoTQnJ1S","FNYIMbrhlQ","faHirAXpwE","4QMc97Ow5C","Ss0Zu0ao3l","POUYSW7cTs","wDajX1v5hH","xciqpCNHmv","y94nwTCgPp","0h1b18RCUA",
+"ZhwG1JRJQB","AOgEeCfgr3","TwanoC2Irc","iB08l14FLR","3weIFrz7Ut","QnJ1S8FmFH","bZLvSW7cTs","FFDuiNxx9V","3otm6D6rBy","cQOnvJ2mQi",
+"o8Uydm4bxU","FhtgljeskS","XyPZNFhtgl","OHaBzzbIYY","yvOMIprNT6","55rfBECMvU","NcICAUlU3M","pT8wuUlU3M","pAhR1WPmlx","dpe1vMaJQs",
+"uLtKsFjHXR","QChxsStlDJ","FNYIMMaJQs","7hyVvAmdQd","GWqqXZUnqt","4QMc9MGlTF","NOHsz64s8N","BpYhVyofH3","RsQUqX6Pin","JkzUnkB5nP",
+"l83UdC2Irc","ECMvUFNYIM","faHir8hJdt","pAhR1Cfgr3","9iGoTrKDLJ","Vprf2zz4ZU","ni2v1okgRi","fcJOyIBe8k","NOHsz4dEz6","kB5nPoVQp6",
+"8cVD3Oz8yZ","jfREukB5nP","StlDJjfREu","atef2ZzJHW","v8yFNvLsmS","rKDLJDz1R3","s93MldhSuH","Cfgr34dEz6","5ZaEznFqik","CNHmvyvOMI",
+"8RCUA55rfB","EdBKcYOfrY","7fsYMYw2oU","n1pmORmDcr","hYBCK7lUXZ","yluBxe6e4z","ix74rtvdkD","GSQwjvLsmS","oVQp6DcpWB","ix74rhSSvQ",
+"C2IrcCqqaD","JkzUnPOUYS","ulk414W0Tl","L7cGcguMb8","JKWYR9eoRc","FFDuiJ2mQi","7X3uy5iGN5","VNCPdNhXdu","FhtglpvgjS","Uvlv4atef2",
+"FxX9qtlILt","8U2nUFxX9q","8FmFHXflUq","aL6AJFLsph","FFDuiW7cTs","lweGyMmsIo","b29RJv1Hln","7hyVv0h1b1","djsrv4QMc9","QChxsuvf7A",
+"v2eC32Nslm","9iGoT48cHL","2TRI74QMc9","ksJbyzmLYD","5IhmGWaWsv","L7cGcNcICA","M3zXLjeskS","8hJdtwiHrZ","gf8rIru4UG","OUqFMChuy3",
+"dQ586QChxs","GXdoHIKxdL","rKDLJNAFuw","J2mQiDQimp","hUTw7atef2","pAhR1gtCA5","brhlQxReec","FNYIMe6e4z","OHaBzaFFss","i7WMQbZLvS",
+"s7MxkXflUq","CxVEfAOgEe","soy9t5Drn0","zQt6QNo0Qb","K20wKFGzgp","CqqaD9eoRc","QssNCLbRTH","CNHmvzz4ZU","b29RJ8cVD3","zHF1qYOfrY",
+"e6e4zQChxs","JJs5mRsQUq","mz8gx5Namm","lkMUAwiHrZ","4QMc9WreyP","dhSuHQClRL","5Mg9rcmXIX","n8pJ95iGN5","s93MlMezSW","zFgtBXyPZN",
+"aL6AJjtn0X","64s8N7fKYU","uAWypCIShG","xXTI4Rxrsm","ix74rgIYvE","XyPZNblLA9","QnJ1SMezSW","d7vjMjS1aj","8TxD77lUXZ","zz4ZUDz1R3",
+"2DREszbIYY","K4GS8CK5W7","4dEz6CIShG","prNT65iGN5","tlILt5IhmG","ZUnqtiqv4k","ru4UGCp3mZ","lpF6W9XyT9","0YAGHblLA9","zY1GYHfyNQ",
+"F6PT23weIF","l83UdF6PT2","lkMUAuvf7A","G1RhSECMvU","yluBxSjskQ","Ul4a1cQOnv","v2eC3wDajX","s93MltAOsr","TwanoFnPFB","FFDuiZv7z0",
+"AgJHQhe9IA","9y4lwDcpWB","y94nw1v5hH","NOHsz8cVD3","JKWYRZhwG1","DLhzMVIlwP","RsQUq0ao3l","5IhmGGv3Fq","W3VFHQClRL","pAhR1Oz8yZ",
+"W7cTs618Di","tlILtBGaQY","HRxd89eoRc","oGu6xlCMxy","i3pydaDGtS","HRxd8LbRTH","azIWpW7cTs","C2IrcvOqCE","0ao3lpvgjS","0YAGHBpYhV",
+"O3iyQ618Di","OUqFMFjHXR","LewvMIjTwP","t98iWxciqp","fcwDa0BmCy","IKxdLYOfrY","guMb8NOHsz","RpBQmuPX7G","s7MxkWDVWJ","t59lR0YAGH",
+"FVMxoDLhzM","SWfouWPmlx","tjQxsKr8ys","a00b50MR5X","uAWypZv7z0","AkKTktuDyS","6q6L9CxVEf","n1pmOAIYUu","s4786BFkb8","VLTy64W0Tl",
+"aFFsslXFOB","No0Qbatef2","AOgEes93Ml","fcwDaJkzUn","W3VFHWreyP","POUYSLbRTH","dmoS7In3NS","6AFT0Dz1R3","WreyPs4786","EoToPY1mC0",
+"F6PT2WDVWJ","QWxoTcQOnv","RBhp0DG4sT","1LB1LTwano","n8pJ9qQxHP","0Wr5ynnP8o","PYBf4jiVBP","9rlg9W7cTs","StlDJUvlv4","PYBf4K20wK",
+"lsQGoZJTXH","7fKYUVBjhz","7fsYM0Kyfs","qUJMdJkzUn","In3NSX6Pin","tvdkDRpBQm","hi5X7x3LDe","guMb88cVD3","fFDrJb29RJ","B3qem2TRI7",
+"RmDcrqaofN","Ta8f6ZJTXH","euZA5KZamH","JKWYRFhtgl","gdQsSeuZA5","ulk41lH1kt","FjHXROHaBz","8U2nU8hJdt","Yf2Ec0BmCy","kZANmyvOMI",
+"bZLvSrhl0J","WreyPa00b5","fqypyuLtKs","n8pJ98hJdt","kB5nPhi5X7","gf8rIydG8U","atef2BFkb8","4QMc9m4bxU","gIYvElj07Q","F6PT2gdQsS",
+"jeskSRzaZA","RzaZAnFqik","pT8wuzFgtB","AOgEecmXIX","GrDg7iqv4k","lsQGofmIK1","d7vjMjzUqR","lpF6W6q6L9","GXdoHIjTwP","4W0TlPYBf4",
+"ciuWzzqH0W","IKxdLlj07Q","QWxoTIn3NS","D6rByIKxdL","qQxHPBGaQY","M6qcGs4786","uN6r3Rxrsm","tuDySgjUTu","fLNg8HzZT8","t59lRhi5X7",
+"aL6AJG1RhS","55rfBv2eC3","QssNCO3iyQ","KZamHFVMxo","Zv7z0HP433","6q6L9zqH0W","LbRTHjS1aj","MezSWIn3NS","4W0Tl7fsYM","zz4ZUmz8gx",
+"6q6L9EdBKc","EdBKcjS1aj","FLsphiB08l","JRJQBl83Ud","OHaBzWaWsv","TwanocmXIX","4QMc9lj07Q","L7cGcNAFuw","oGu6xJ2mQi","StlDJzQt6Q",
+"MmKGJHlUbF","WmadAokgRi","VBjhzYjB9t","DcpWBHfyNQ","TCgPplj07Q","618Dirhl0J","FjHXR9rlg9","iKqhrzz4ZU","uoStwBbwgA","XyPZN8FmFH",
+"gjUTux3LDe","dQ5867ku1p","ru4UGuAWyp","pvgjS7ku1p","zqH0WtvdkD","Pb1paHRxd8","x3LDebZLvS","5iGN5WmadA","SjskQW3VFH","jzUqR5nmWv",
+"pvgjSJRJQB","gIYvEhi5X7","ZJTXH48cHL","jeskSQ6Lix","kZANmTa8f6","M3zXL8U2nU","i7WMQqUJMd","hYBCKZhwG1","2Yz7Edjsrv","jeskSWDVWJ",
+"FVMxoRmDcr","14FLR618Di","7lUXZVerEA","7lUXZDz1R3","RsQUqEdBKc","lCMxyNcICA","zHF1qRxrsm","Vprf25IhmG","uPX7G1v5hH","FhtglWMiS3",
+"0YAGHuupzk","M6qcGW7cTs","DQimpYOfrY","rhl0JfcJOy","4QMc99XyT9","pFrrl29QAz","lXFOBqUJMd","cQOnvxXTI4","uN6r3F6PT2","Gv3FqlkMUA",
+"RACujYh1hF","GSQwjy94nw","yluBxStlDJ","MGlTFlH1kt","qaofN9rlg9","iwzGk618Di","Gv3Fqfqypy","ru4UGBCxeC","yToGWprNT6","LDk6flsQGo",
+"9eoRcS77LH","okgRiO3iyQ","CqqaD6AFT0","YjB9t14FLR","d7vjMCdyBV","brhlQprNT6","uAWypMmsIo","2Yz7EpmeCd","IKxdLmz8gx","ECMvUBGaQY",
+"3weIF9rlg9","d85a9jiVBP","7X3uyK20wK","HzZT8618Di","fcJOyOz8yZ","ix74r8cVD3","zbIYYrKDLJ","FjHXRkZANm","SWfouB3qem","KZamHpmeCd",
+"LbRTHNOHsz","uTacxCIShG","uZPqgWDVWJ","LDk6fhUTw7","WPmlxW7cTs","uAWypjeskS","yvOMIi3pyd","zmLYDQClRL","JXljWQWxoT","cQOnvjiVBP",
+"NOHsz6q6L9","FGzgptaOXK","0BmCydQ586","Yw2oUOz8yZ","t59lRBFkb8","RxrsmKASQ8","HP433MGlTF","IKxdLQworu","FNYIMx3LDe","pvgjSOHaBz",
+"NAFuwuTacx","I7p2aPb1pa","AmdQdGXdoH","0h1b15nmWv","TCgPpWMiS3","lj07Q9y4lw","5VZjSMezSW","h1zcH2hEEU","FnPFBwDajX","dpe1vzbIYY",
+"K20wKGWqqX","DLhzMJJs5m","lm0pDC2Irc","fFDrJOxWIH","cShY2CdyBV","atef2QbxXc","DQimpFVMxo","0BmCye6e4z","GSQwjFnPFB","uJScXyToGW",
+"FxX9qO3iyQ","9rlg9FVMxo","oVQp6jtn0X","mX2GEWmadA","gdQsSrhl0J","Q6hMCSs0Zu","oGu6xECMvU","he9IAcmXIX","1LB1Liqv4k","EoToPlsQGo",
+"4QMc9ZJTXH","QssNCqaofN","5IhmGBFkb8","gdQsSdjsrv","POUYSMGlTF","Rxrsmuvf7A","HlUbFd85a9","7fKYUTCgPp","dmoS7SmGzv","mX2GEAgJHQ",
+"okgRis7Mxk","y94nwTwano","OUqFMwDajX","16lHciwzGk","3otm68RCUA","s93MlWaWsv","k85Ae4QMc9","yToGWMojnP","6AFT05VZjS","dpe1vQWxoT",
+"lViBvM3zXL","W7cTsWreyP","taOXKFcWrW","CxVEfhE1Ql","ni2v1IRh48","M3zXLIn3NS","0YAGHmX2GE","5IhmGCNHmv","Q6Lixulk41","vkCHHQWxoT",
+"yvOMIJkzUn","5drc6JRJQB","a00b5tAOsr","FNYIMJkzUn","nnP8o16lHc","WDVWJIRh48","5VZjSni2v1","4dEz6lkMUA","3weIFksJby","vkCHHpvgjS",
+"guMb8taOXK","FcWrWOxWIH","cQOnv6AFT0","YOfrYyToGW","9XyT9Chuy3","LewvMo8Uyd","M3zXL8xEKz","CK5W7IjTwP","ni2v1QClRL","Cp3mZ2ZHdk",
+"Uvlv45nmWv","No0QbvkCHH","FFDuipWiOs","FxX9q29QAz","OxWIHcQOnv","m4bxUlweGy","aL6AJMkgy8","iwzGkGSQwj","W3VFHOUYuF","AmdQdMGlTF",
+"7X3uyDz1R3","5iGN5FPfSE","0BmCyFcWrW","dpe1voVQp6","SWfouHlUbF","QssNCEdBKc","7ku1prKDLJ","yToGWoGu6x","ZuDtDJJs5m","Z4I1vCfgr3",
+"n8pJ9aez9y","UmaEv07n1c","aDGtScL0aE","CIShGWMiS3","7ku1pd7vjM","FwEJzoVQp6","ZzJHWTXQ0Z","GrDg7sqVrf","9iGoTGSQwj","yvOMIpmeCd",
+"d7vjMNo0Qb","48cHL0Kyfs","HlUbFMaJQs","AkKTkVLTy6","tjQxszz4ZU","xciqptAOsr","CNHmvJ2mQi","FPfSEhe9IA","azIWpCqqaD","QnJ1SS77LH",
+"cQOnvRxrsm","Kr8ysTXQ0Z","5Mg9r8xEKz","45cIHru4UG","Vprf22TRI7","4QMc9cShY2","fcJOyfcwDa","EOE1olsQGo","8FmFHMkgy8","CK5W71LB1L",
+"mX2GE0BmCy","fcwDaiB08l","Yf2Ec0MR5X","Uvlv4hi5X7","FPfSEQbxXc","YOfrYFFDui","0Wr5yU3yw5","uN6r3YOfrY","fcwDa0Wr5y","FLsphuZPqg",
+"POUYSFVMxo","hi5X7J2mQi","S2DfuhSSvQ","GXdoHbZLvS","5IhmGOHaBz","yluBxRACuj","jS1aj0YAGH","aDGtSMkgy8","uZPqgK4GS8","SWfou5VZjS",
+"h1zcH7Ow5C","aez9ylpF6W","24ARFyvOMI","zY1GYhe9IA","FPfSEprNT6","FjHXRQworu","NOHszdQ586","Cfgr3JIqXi","s4786Yf2Ec","NOHszXyPZN",
+"zbIYYhUTw7","LbRTHU3yw5","iwzGkciuWz","hYBCK5ZaEz","07n1cFjHXR","4W0Tl0PktI","4W0TlRxrsm","StlDJrz7Ut","KASQ8k85Ae","0ao3lBpYhV",
+"vkCHHFVMxo","pWiOsRBhp0","d7vjMv2eC3","DLhzMyofH3","MojnPRpBQm","jiVBPTa8f6","5IhmGv2eC3","5Drn00Wr5y","StlDJxReec","iqv4kiB08l",
+"jeskSHzZT8","fLNg8VerEA","VBjhzvkCHH","zz4ZUpFrrl","suY4x48cHL","jfREus7Mxk","lkMUAJJs5m","07n1cMK07Y","cmXIX9iGoT","l83UdlXFOB",
+"dhSuHi7WMQ","7hyVv9GXkX","lkMUAOz8yZ","HRxd8jiVBP","Mm8siHzZT8","7X3uyEdBKc","hYBCKEoToP","Waim6pFrrl","No0QbThjNn","LDk6f24ARF",
+"9GXkXqUJMd","Waim6zQt6Q","QClRLVNCPd","1v5hHK4GS8","5VZjStvdkD","HRxd87X3uy","hi5X72hEEU","suY4xVprf2","AIYUuWMiS3","fmIK1QWxoT",
+"b29RJQWxoT","uPX7Gsoy9t","VerEAt98iW","WaWsvkB5nP","8TxD7aDGtS","CIShGOHaBz","YOfrYRmDcr","v2eC31j5L8","MmKGJnFqik","4dEz6IBe8k",
+"jeskSWPmlx","vLsmSOUqFM","Ta8f6K20wK","9eoRczY1GY","NcICAlViBv","lViBv16lHc","fcwDaulk41","Cfgr3BbwgA","5VZjSDQimp","K20wKdmoS7",
+"tlILtIKxdL","AmdQdS2Dfu","CIShGx3LDe","VerEAwDajX","No0Qbdjsrv","piJSk7fKYU","7X3uyyofH3","iB08ldhSuH","1LB1LO3iyQ","vkCHHG1RhS",
+"WPmlxoVQp6","5Mg9r0BmCy","IjTwPEOE1o","2TRI7b29RJ","yEfy9Uvlv4","y94nwmX2GE","fqypy55rfB","ciuWzAmdQd","HRxd8MK07Y","fmIK1FPfSE",
+"2NslmpWiOs","jiVBPRsQUq","aez9yVIlwP","uTacxFPfSE","IjTwPhi5X7","Waim6gf8rI","v2eC3tvdkD","CIShGVprf2","2Nslmv8yFN","vkCHHxciqp",
+"Uvlv4okgRi","aez9yX6Pin","JJs5m2Yz7E","uAWypYf2Ec","s7Mxk0ao3l","5Mg9rvkCHH","ZUnqtcQOnv","RsQUq9XyT9","zz4ZUEdBKc","580YDRkQke",
+"Yh1hFuupzk","gjUTuOxWIH","No0QbFcWrW","JKWYRZv7z0","POUYSYOfrY","TwanojzUqR","FLsphEOE1o","kZANmuQIcz","5drc60YAGH","AmdQdl83Ud",
+"TCgPp2Yz7E","hE1QlzQt6Q","lsQGoKsjRK","hi5X7OxWIH","MezSWpT8wu","aDGtSn1pmO","tlILtuAWyp","EOE1oQ6Lix","rz7UtYjB9t","8xEKztl72W",
+"s93MlkB5nP","zY1GYFPfSE","SWfougf8rI","LewvMLDk6f","Nxx9VTa8f6","W3VFHG1RhS","rhl0JHzZT8","lViBvGWqqX","IBe8kK20wK","8RCUAkZANm",
+"fcJOyZhwG1","s7Mxk9eoRc","hUTw7L7cGc","GSQwjPOUYS","O3iyQcL0aE","IjTwP5Mg9r","t59lR24ARF","uvf7AdQ586","zY1GYKsjRK","AIYUu7fsYM",
+"1j5L8jfREu","2Yz7EpWiOs","FPfSETwano","618DiCNHmv","DQimpSjskQ","TXQ0ZhSSvQ","OUYuF3otm6","AOgEeK20wK","LewvMbZLvS","lj07QjeskS",
+"ix74rYf2Ec","s4786FPfSE","I7p2apAhR1","Yf2EcLDk6f","6q6L9ciuWz","KZamHSWfou","Z4I1vQClRL","9rlg9Mkgy8","WaWsvVjCZq","RkQkeuQIcz",
+"lpF6W5Namm","RsQUqJRJQB","QClRLIBe8k","sx5GlWaWsv","iB08ldmoS7","9iGoTWmadA","ReKEWuJScX","i3pydUmaEv","5iGN5XflUq","1j5L8brhlQ",
+"LewvMX6Pin","uupzkjS1aj","2TRI72DREs","vkCHHiwzGk","tjQxsbZLvS","FGzgpRBhp0","tAOsrRzaZA","oVQp6okgRi","hSSvQ07n1c","cL0aEtaOXK",
+"5IhmGMK07Y","jfREudmoS7","In3NS8cVD3","ZuDtDcQOnv","lsQGodpe1v","6AFT0MaJQs","UlU3M0YAGH","Q6hMCl83Ud","lkMUAU3yw5","4W0TloGu6x",
+"Cfgr35VZjS","5Mg9rpmeCd","1LB1LguMb8","IBe8kDG4sT","pFrrlksJby","ZzJHW0h1b1","blLA9suY4x","CK5W7RACuj","gIYvEpv0i7","e6e4zLewvM",
+"suY4xAkKTk","FVMxowDajX","C2IrcJIqXi","TCgPpXyPZN","AXpwES2Dfu","i7WMQFPfSE","rz7Utb29RJ","HP433jzUqR","dpe1vulk41","0ao3lVNCPd",
+"QworuMmsIo","lXFOB7fsYM","fcJOyJ2mQi","gf8rIuoStw","vLsmSuTacx","Ta8f6OUYuF","TCgPp5ZaEz","jzUqRmX2GE","Q6hMCJRJQB","xciqpAXpwE",
+"ni2v1618Di","l83UdRACuj","gdQsSRsQUq","pFrrlLewvM","9eoRcThjNn","55rfBIKxdL","FPfSEyEfy9","aez9ys93Ml","DG4sTiwzGk","Qworudpe1v",
+"ru4UGIn3NS","yEfy97hyVv","M6qcGt59lR","MGlTFWMiS3","Yw2oUazIWp","K4GS8Q6hMC","IRh480h1b1","lm0pDWreyP","IjTwPZv7z0","07n1cxXTI4",
+"e6e4zdhSuH","2TRI78RCUA","guMb80YAGH","atef25Namm","uoStwni2v1","tuDySCNHmv","YjB9ta00b5","QChxsSmGzv","TCgPpblLA9","RpBQmNxx9V",
+"ix74rRsQUq","faHiruZPqg","euZA55Drn0","uQIczdhSuH","5Mg9rZUnqt","lH1ktTwano","ReKEWfcJOy","jeskSW7cTs","Mkgy8lkMUA","CxVEfJ2mQi",
+"GXdoH5Drn0","zmLYDzY1GY","W7cTsjzUqR","W7cTsrhl0J","bZLvS64s8N","hi5X7jeskS","B3qeme6e4z","UmaEvDG4sT","uQIczpT8wu","aFFssdhSuH",
+"FPfSEaFFss","5iGN5ReKEW","dmoS7Oz8yZ","yEfy90h1b1","DG4sT7Ow5C","JRJQBKr8ys","14FLRgdQsS","In3NSPOUYS","fcJOyni2v1","gf8rISbRYy",
+"fcJOyo8Uyd","CNHmvlsQGo","gIYvEjtn0X","hYBCKRmDcr","lkMUAIn3NS","wDajXjiVBP","tAOsruLtKs","POUYSrz7Ut","FNYIMVNCPd","U3yw5RBhp0",
+"uTacxpiJSk","jiVBPbrhlQ","GWqqXRACuj","fmIK1s93Ml","xReecFjHXR","yvOMISs0Zu","yEfy916lHc","lm0pD24ARF","gf8rItvdkD","ix74rQnJ1S",
+"zY1GYuAWyp","hi5X7Qworu","7fsYMt59lR","OUYuFcmXIX","SjskQNAFuw","e6e4zMK07Y","wDajXDcpWB","fqypyBGaQY","qUJMdEoToP","VerEA8RCUA",
+"S2DfuuAWyp","I7p2aF6PT2","CxVEf8TxD7","SmGzv45cIH","tAOsr0ao3l","Dz1R3RkQke","xReecZUnqt","Yw2oU0Wr5y","jeskS2ZHdk","29QAzGSQwj",
+"lm0pDSbRYy","29QAzyofH3","2NslmMaJQs","1LB1LUmaEv","Ul4a1soy9t","UmaEvpvgjS","cShY2uLtKs","C2Ircd7vjM","yvOMIgf8rI","0BmCyC2Irc",
+"uPX7GfcJOy","2Yz7ElsQGo","gdQsSyofH3","LewvMguMb8","EoToPVprf2","e6e4zlViBv","QssNCQChxs","I7p2aUmaEv","POUYSNo0Qb","FjHXRjzUqR",
+"HRxd8MezSW","mz8gxRzaZA","jS1ajs4786","Ul4a1AIYUu","vkCHHqaofN","1v5hHFjHXR","HRxd82Yz7E","LbRTH7fKYU","S2DfuYf2Ec","0YAGHFGzgp",
+"zFgtBFLsph","hE1QlY1mC0","zbIYYF6PT2","GrDg7SmGzv","tuDyShUTw7","jtn0XO3iyQ","uLtKsVBjhz","8FmFHFhtgl","QWxoTAOgEe","ni2v1ogLgc",
+"oQ87r5VZjS","suY4x7fsYM","i7WMQpAhR1","yToGWHfyNQ","CIShGKZamH","0h1b1jS1aj","7fsYMfqypy","Rxrsm0ao3l","uTacxjeskS","SmGzvpT8wu",
+"8RCUAtvdkD","a00b5okgRi","5nmWvECMvU","atef2ni2v1","euZA5pv0i7","M3zXLFVMxo","MmKGJB3qem","lm0pDoGu6x","atef2JRJQB","cShY2WDVWJ",
+"0KyfstjQxs","gf8rIWDVWJ","gIYvEzQt6Q","bgJAzsoy9t","Yw2oU8U2nU","55rfB0Wr5y","hE1QlksJby","5NammCK5W7","UlU3MkB5nP","OxWIHG1RhS",
+"RkQkejS1aj","WaWsvjiVBP","4W0TlNo0Qb","IBe8kNxx9V","JXljWCNHmv","ru4UGlweGy","ogLgcMm8si","DcpWBMojnP","nlaBy4QMc9","MaJQsFPfSE",
+"hE1Qltl72W","CxVEfAkKTk","o8Uyd2TRI7","prNT6P6bcg","RBhp0Ta8f6","7X3uyJRJQB","XflUqSbRYy","xXTI4LewvM","NhXduQ6hMC","lweGyOUYuF",
+"lm0pD0BmCy","0BmCyKr8ys","5Mg9rWmadA","mz8gx8hJdt","0BmCy0YAGH","9GXkX14FLR","VerEA7hyVv","v1HlnAXpwE","lm0pDTCgPp","9GXkXS77LH",
+"MK07Y5ZaEz","VerEAkB5nP","Ss0Zu5Drn0","lsQGofFDrJ","fcJOyuvf7A","6AFT0cShY2","QWxoTRsQUq","FjHXR9GXkX","prNT6AgJHQ","5Mg9rHP433",
+"tvdkDhe9IA","s4786MK07Y","dhSuHiKqhr","iqv4kMkgy8","RkQke0ao3l","55rfBWMiS3","lweGy16lHc","VBjhzfmIK1","Mkgy8bgJAz","bgJAze6e4z",
+"I7p2aKr8ys","n1pmORACuj","FhtglUlU3M","hi5X7euZA5","GrDg7UmaEv","gf8rI2Nslm","uupzks4786","7ku1p0Wr5y","FPfSEydG8U","aFFssCp3mZ",
+"jfREuQ6hMC","uQIcziKqhr","3weIFazIWp","aDGtSW7cTs","VBjhz9GXkX","FPfSEhi5X7","suY4xyvOMI","D6rByfqypy","VLTy6s4786","CK5W7cQOnv",
+"mX2GEi7WMQ","0Kyfs29QAz","618DinlaBy","ZJTXHSmGzv","CNHmvcShY2","RBhp0hUTw7","MK07Yt98iW","RBhp0MezSW","Mkgy8FxX9q","IRh48i7WMQ",
+"0BmCy5ZaEz","xXTI4fmIK1","P6bcghE1Ql","Mkgy8zmLYD","GXdoHQbxXc","7fsYMjzUqR","LewvM29QAz","Ss0Zugf8rI","s7Mxki3pyd","jS1ajEoToP",
+"s93MlgtCA5","i3pydSjskQ","Ul4a1ksJby","RzaZAwiHrZ","m4bxUtaOXK","t59lRb29RJ","x3LDeJkzUn","0PktI7hyVv","JkzUnJKWYR","gdQsSxciqp",
+"VNCPdfFDrJ","he9IAEdBKc","tl72W580YD","okgRikZANm","ECMvUTCgPp","brhlQ16lHc","2TRI7GSQwj","BGaQYJXljW","JJs5mBCxeC","vLsmSuZPqg",
+"uJScXYw2oU","5ZaEz8xEKz","fFDrJqUJMd","bZLvS4dEz6","h1zcHWDVWJ","OUYuFrz7Ut","0KyfsFLsph","XflUqQbxXc","5Mg9rJXljW","VNCPdDLhzM",
+"5VZjSKZamH","ru4UGHP433","gIYvEuN6r3","GWqqXpWiOs","CNHmvuQIcz","tlILttl72W","F6PT2RpBQm","yofH39XyT9","sqVrfVBjhz","Nxx9VvLsmS",
+"CK5W7In3NS","pFrrlYjB9t","dhSuH7Ow5C","QChxsUl4a1","azIWpGXdoH","uN6r3P6bcg","uPX7GWmadA","S2Dfuzz4ZU","rz7Ut2Nslm","4W0TlCfgr3",
+"n1pmO0PktI","YjB9tJKWYR","QYxC05iGN5","8cVD3AgJHQ","zY1GYs7Mxk","8RCUAi3pyd","hi5X7Ss0Zu","9GXkXWreyP","AmdQdD6rBy","oGu6x48cHL",
+"JKWYRgtCA5","7Ow5CNhXdu","CIShGQChxs","G1RhSjSjS3","JJs5m4QMc9","hSSvQjeskS","0ao3lRpBQm","CNHmvC2Irc","ZJTXHzFgtB","fmIK1StlDJ",
+"lweGymz8gx","FPfSEKsjRK","JRJQBQYxC0","Pb1paQClRL","wiHrZVprf2","CxVEfa00b5","iB08l8FmFH","HfyNQ5ZaEz","o8UydlkMUA","rz7UtyofH3",
+"5nmWvQssNC","VLTy6Ss0Zu","prNT6xReec","Yw2oUoVQp6","4QMc9uLtKs","v2eC345cIH","CNHmvzY1GY","VLTy6zqH0W","MojnPmX2GE","jSjS34W0Tl",
+"4W0Tl2Nslm","lweGy8xEKz","RmDcrdQ586","UlU3M5iGN5","Ss0Zu24ARF","7Ow5CZJTXH","Ss0ZuIn3NS","6q6L9cShY2","MezSWyluBx","v2eC3EOE1o",
+"0BmCyBbwgA","5iGN57ku1p","CdyBV9rlg9","3weIFtuDyS","hSSvQ2hEEU","CxVEfpv0i7","MGlTFm4bxU","8xEKzCxVEf","45cIHI7p2a","QClRLlH1kt",
+"MGlTFzz4ZU","MGlTFMojnP","8cVD3aFFss","NhXducQOnv","7ku1pxXTI4","hYBCKFwEJz","FNYIMaL6AJ","JKWYRgdQsS","BCxeCyluBx","NcICApT8wu",
+"CIShGuLtKs","yvOMIpiJSk","ThjNnuPX7G","0BmCy618Di","gjUTuK4GS8","fcJOyEOE1o","No0Qb7Ow5C","yofH3y94nw","nFqik9GXkX","v1HlnY1mC0",
+"8xEKzokgRi","0BmCysoy9t","s7MxkZv7z0","uAWypuAWyp","iKqhrlweGy","CNHmvSWfou","ReKEWMkgy8","Mm8si8RCUA","Mkgy864s8N","lsQGonnP8o",
+"euZA5jzUqR","LbRTHNhXdu","XflUqRpBQm","5Drn0cQOnv","M3zXLJXljW","MmKGJUvlv4","WreyP7fKYU","FnPFBRsQUq","Dz1R36AFT0","D6rBy7X3uy",
+"5Nammt98iW","HP433J2mQi","618DiiwzGk","wDajXguMb8","pT8wugtCA5","cL0aELbRTH","lsQGoDz1R3","O3iyQNhXdu","oQ87rokgRi","v2eC3lXFOB",
+"0Wr5yNhXdu","NAFuw5nmWv","pAhR1aFFss","XyPZNokgRi","UlU3MC2Irc","soy9t1v5hH","5drc6YjB9t","BpYhVfqypy","QbxXciB08l","VBjhzpT8wu",
+"580YDgjUTu","qUJMdWreyP","5Mg9rMezSW","Cfgr3he9IA","FGzgp0Wr5y","NOHszUvlv4","BGaQYoQ87r","Mkgy8HP433","gIYvE8xEKz","W7cTsuZPqg",
+"VLTy6RACuj","Zv7z0hE1Ql","KZamH9iGoT","RkQke48cHL","64s8NlweGy","LbRTH0MR5X","MaJQsZ4I1v","mX2GE2TRI7","cmXIXrz7Ut","16lHc8RCUA",
+"taOXKi7WMQ","pvgjSiqv4k","Cp3mZpWiOs","QbxXcS2Dfu","wDajXFGzgp","Fhtgl8RCUA","Nxx9V5IhmG","lH1ktYf2Ec","1v5hHLDk6f","VIlwPRpBQm",
+"GWqqXmz8gx","HlUbFyluBx","OUYuFYh1hF","5VZjSJKWYR","LewvMjzUqR","14FLR1LB1L","rhl0JAkKTk","0h1b1jtn0X","vOqCERxrsm","GSQwjYOfrY",
+"lkMUAWPmlx","ECMvUW3VFH","s4786HRxd8","WMiS3QWxoT","HfyNQOUYuF","QClRLNxx9V","wiHrZKZamH","QClRLHfyNQ","dQ586lH1kt","qaofNGv3Fq",
+"Yf2EctuDyS","64s8NgdQsS","0Wr5ylweGy","GrDg78TxD7","JIqXin1pmO","gIYvEpAhR1","aDGtSkB5nP","UmaEvlm0pD","fqypyThjNn","Yw2oU5drc6",
+"SjskQBpYhV","Mkgy8nnP8o","gjUTuXflUq","fmIK1RsQUq","Ta8f6hSSvQ","D6rBySs0Zu","WaWsv4W0Tl","jSjS3XflUq","Y1mC0AmdQd","7fKYUUmaEv",
+"ni2v1uvf7A","oVQp6JkzUn","lH1kt8RCUA","5iGN5oQ87r","QbxXcokgRi","Zv7z0MGlTF","BpYhVZ4I1v","ECMvUn8pJ9","3weIFFxX9q","NhXduCdyBV",
+"jSjS3Mkgy8","lpF6WFnPFB","nlaByQssNC","8hJdtBCxeC","7fsYM0YAGH","Nxx9VyEfy9","hi5X7C2Irc","W3VFHfcwDa","OUYuFOUqFM","5ZaEzdpe1v",
+"ZhwG18TxD7","7ku1puupzk","8RCUA9iGoT","UlU3MlkMUA","kB5nPix74r","AgJHQJIqXi","AkKTkFNYIM","MGlTFStlDJ","SWfouOUYuF","Yf2Ecdpe1v",
+"jeskSRpBQm","KsjRKzbIYY","gjUTuF6PT2","lsQGoFjHXR","Yw2oUxXTI4","0YAGHcmXIX","lH1ktQ6hMC","OxWIH0MR5X","dhSuHdQ586","e6e4z4dEz6",
+"6q6L9e6e4z","gf8rIzbIYY","hUTw7CK5W7","dmoS7xciqp","uLtKsbZLvS","Fhtgl16lHc","faHirqQxHP","5Mg9r5IhmG","7lUXZaez9y","iB08lEoToP",
+"DcpWBTwano","jzUqRVNCPd","9eoRc6q6L9","NhXduThjNn","uZPqgAmdQd","t98iW580YD","DQimpMmsIo","M6qcG7fsYM","J2mQiG1RhS","lsQGoD6rBy",
+"IRh48J2mQi","k85AedhSuH","IBe8kyToGW","5IhmGuZPqg","Vprf2cShY2","pAhR1yofH3","VerEApvgjS","NhXduUvlv4","ZzJHW5Drn0","XyPZNni2v1",
+"S2DfuQClRL","ZUnqtBFkb8","BpYhVYh1hF","Yf2EctaOXK","S77LHpmeCd","TCgPpuZPqg","StlDJjzUqR","piJSkwiHrZ","fcwDaa00b5","gIYvEZuDtD",
+"QssNC9eoRc","Nxx9VAgJHQ","HzZT8PYBf4","lj07QRmDcr","zqH0WAkKTk","zHF1q16lHc","xciqpazIWp","0Wr5ycQOnv","pFrrlprNT6","IBe8kjfREu",
+"64s8NS77LH","CNHmvPOUYS","BFkb8FxX9q","gf8rIs4786","rz7UtCfgr3","rKDLJcShY2","WPmlxStlDJ","9eoRcogLgc","Mm8sifqypy","zY1GYlpF6W",
+"RkQke0h1b1","8hJdtdjsrv","2hEEU1LB1L","QworuOHaBz","JIqXiMm8si","y94nwSjskQ","tuDySVIlwP","dQ586dQ586","Ta8f6KsjRK","JIqXisoy9t",
+"ZuDtD55rfB","4QMc9SmGzv","h1zcHcShY2","HP4335nmWv","EOE1oCNHmv","Ta8f6s93Ml","MGlTFzQt6Q","9y4lwiKqhr","7fsYMdmoS7","D6rBysuY4x",
+"KZamH2ZHdk","ThjNncL0aE","lj07QuTacx","oVQp6QbxXc","t59lRlsQGo","9eoRcHzZT8","blLA9uQIcz","5Mg9rMmsIo","AOgEeMojnP","tlILt5VZjS",
+"MmKGJni2v1","48cHL0BmCy","aDGtSVIlwP","hi5X7ECMvU","prNT62Yz7E","lm0pDHlUbF","vLsmS5VZjS","XyPZNKZamH","C2Ircs93Ml","Vprf2Y1mC0",
+"7fsYMm4bxU","QnJ1SK4GS8","FNYIMuQIcz","7ku1pDcpWB","xReeccL0aE","NcICA2Yz7E","EdBKc0YAGH","Ta8f6KASQ8","FPfSEsoy9t","v2eC30Wr5y",
+"Q6hMCpAhR1","VBjhz8xEKz","5Drn0faHir","xReecFhtgl","ogLgclj07Q","xReecVBjhz","Yf2Ec8hJdt","iwzGkpiJSk","lkMUAdjsrv","ZUnqttl72W",
+"Y1mC0xReec","8hJdtprNT6","faHirlViBv","lm0pDLDk6f","uQIczqQxHP","s93Ml8hJdt","oQ87rhYBCK","prNT6tvdkD","nnP8o24ARF","1v5hHgIYvE",
+"VNCPdciuWz","lViBvGXdoH","OUYuFFxX9q","FVMxo7fsYM","FwEJzX6Pin","aez9yfaHir","jtn0Xa00b5","ulk41Qworu","Uvlv41j5L8","FjHXRIKxdL",
+"BbwgAC2Irc","Gv3Fq618Di","2Yz7EMK07Y","tjQxsIKxdL","Waim6BGaQY","48cHLWaWsv","d7vjMPYBf4","Dz1R307n1c","8xEKzYjB9t","PYBf4KASQ8",
+"Kr8ysv8yFN","hi5X7BpYhV","s93Mln8pJ9","CK5W7DG4sT","oGu6xRzaZA","2DREsMezSW","d7vjMOxWIH","GrDg75iGN5","ZhwG1Yh1hF","QClRLY1mC0",
+"ulk41F6PT2","2TRI7BFkb8","AIYUu8TxD7","azIWpjeskS","xXTI4fcJOy","Rxrsm5Mg9r","iB08l580YD","tjQxs1v5hH","Z4I1vMGlTF","ciuWziKqhr",
+"StlDJuoStw","BGaQYGSQwj","KZamHmX2GE","euZA555rfB","0BmCyzQt6Q","SjskQHzZT8","HP433zmLYD","fqypytAOsr","yofH3ksJby","ECMvUKsjRK",
+"QChxsuJScX","d85a9UmaEv","t98iWAXpwE","prNT60PktI","L7cGc1v5hH","3weIFuvf7A","D6rByuLtKs","G1RhSVLTy6","bgJAzMojnP","HP4337X3uy",
+"jfREuSs0Zu","t59lRK4GS8","mX2GESmGzv","qUJMdyEfy9","Kr8yslH1kt","azIWpuoStw","zFgtBFPfSE","AkKTkbrhlQ","pWiOs5IhmG","Y1mC07lUXZ",
+"tvdkDKZamH","zQt6QTwano","hi5X7bZLvS","okgRiWmadA","gtCA5Y1mC0","8TxD7HfyNQ","WreyP0ao3l","Ss0Zu5nmWv","7X3uylweGy","POUYSlpF6W",
+"JKWYRaL6AJ","tvdkDM3zXL","W3VFHyEfy9","h1zcHY1mC0","nFqikTXQ0Z","2hEEUmz8gx","9iGoToGu6x","OUYuFs7Mxk","e6e4zjiVBP","B3qemFFDui",
+"SjskQzFgtB","RpBQmfcwDa","MezSWzQt6Q","IRh480Kyfs","pvgjS8TxD7","Z4I1vv8yFN","KsjRKlkMUA","uvf7AtvdkD","brhlQpiJSk","4W0TlVprf2",
+"lsQGo5ZaEz","MmKGJRpBQm","0YAGHAmdQd","gIYvERmDcr","uN6r3iKqhr","7ku1pP6bcg","zFgtB7ku1p","fqypy8xEKz","atef2FxX9q","0BmCy6q6L9",
+"yofH3MaJQs","J2mQiZJTXH","FxX9qAmdQd","y94nwprNT6","jtn0XFLsph","3weIFTa8f6","bgJAzGSQwj","8U2nUgIYvE","ZUnqt2ZHdk","2hEEU7X3uy",
+"RsQUqOxWIH","2ZHdk4dEz6","bgJAzK4GS8","Uvlv48RCUA","9GXkXdmoS7","0BmCymz8gx","AOgEepiJSk","dpe1vlXFOB","MGlTFuJScX","Oz8yZDz1R3",
+"P6bcgd7vjM","48cHLn1pmO","NAFuwP6bcg","AkKTkblLA9","64s8NCfgr3","lpF6WYw2oU","QworuEOE1o","S77LHtaOXK","FGzgp45cIH","7X3uyZJTXH",
+"wDajXPOUYS","m4bxUgjUTu","QnJ1SFjHXR","zFgtB2Yz7E","OUYuF0BmCy","VLTy6DLhzM","pv0i7ThjNn","UlU3Mrz7Ut","CNHmv48cHL","8U2nUVerEA",
+"8U2nUMaJQs","14FLRMojnP","Ul4a1Q6hMC","Kr8ysgtCA5","djsrvjS1aj","1j5L85VZjS","oGu6xQnJ1S","uAWyphi5X7","BCxeCZzJHW","xXTI4WDVWJ",
+"P6bcgFxX9q","hSSvQpAhR1","JXljWHlUbF","No0QbzFgtB","ix74rQChxs","0Wr5yv8yFN","KZamHFGzgp","pAhR1EdBKc","zz4ZU5Mg9r","zbIYY48cHL",
+"2Yz7EHlUbF","07n1c1v5hH","HlUbFuJScX","VIlwPnFqik","X6Pinn1pmO","d85a9ZhwG1","1v5hHJIqXi","2Yz7Eatef2","9rlg9dhSuH","i7WMQrhl0J",
+"l83UdUvlv4","QbxXcNxx9V","5drc6suY4x","fqypyDz1R3","v8yFNBGaQY","4W0TlnlaBy","QWxoTsqVrf","pT8wuUl4a1","RBhp0YjB9t","1j5L8RACuj",
+"CxVEfSmGzv","rKDLJyluBx","uAWyp4W0Tl","ni2v1ThjNn","ydG8UCxVEf","zY1GY9eoRc","PYBf4uQIcz","FVMxouJScX","kZANmzbIYY","RBhp0VNCPd",
+"B3qem5Drn0","AOgEedmoS7","2ZHdklViBv","lweGyTCgPp","UmaEvNo0Qb","vOqCEgIYvE","BCxeCM3zXL","s4786qQxHP","8FmFHMm8si","CNHmvnFqik",
+"x3LDeMGlTF","Dz1R3JXljW","dpe1vFPfSE","pv0i7zmLYD","FFDuixXTI4","Nxx9VcShY2","lXFOBtvdkD","fFDrJYw2oU","YOfrYoGu6x","SbRYyTwano",
+"hYBCKhe9IA","7ku1pVprf2","POUYSAkKTk","GXdoHwDajX","iwzGkVerEA","0ao3lAkKTk","djsrvFwEJz","pFrrl7hyVv","suY4x9XyT9","soy9t48cHL",
+"1LB1LYh1hF","0PktIRsQUq","QClRLazIWp","EoToPECMvU","0ao3lFwEJz","yluBxaFFss","M3zXLFGzgp","iwzGk8FmFH","Nxx9VlpF6W","4dEz6QClRL",
+"U3yw5M6qcG","ECMvURmDcr","0MR5X5Drn0","soy9tlsQGo","n1pmOQ6hMC","24ARFjS1aj","fqypydhSuH","hE1QlIRh48","FLsphCqqaD","9GXkXjS1aj",
+"yEfy9ciuWz","RmDcr48cHL","ciuWzyvOMI","0BmCyJXljW","n8pJ92Yz7E","PYBf42hEEU","sx5GljzUqR","Dz1R3qaofN","lsQGoRzaZA","DLhzMQ6hMC",
+"AXpwEhE1Ql","Yh1hFe6e4z","AkKTk14FLR","NhXdu2DREs","XyPZN8RCUA","uoStwVerEA","yvOMIZJTXH","CK5W78hJdt","dhSuHChuy3","v2eC3i3pyd",
+"tvdkDlH1kt","uAWypZhwG1","lweGyzz4ZU","DG4sTuvf7A","OUqFMzHF1q","UlU3M5nmWv","I7p2auAWyp","n1pmOYjB9t","lCMxylkMUA","pv0i7QClRL",
+"iwzGkjzUqR","s7MxktuDyS","yToGW9eoRc","0h1b1GSQwj","CNHmvLewvM","M6qcGb29RJ","dpe1vTwano","YOfrYsqVrf","MezSW8TxD7","ciuWzM3zXL",
+"uoStwJXljW","4W0TlpAhR1","n1pmO64s8N","EoToPpv0i7","5NammwDajX","gf8rIfaHir","blLA9zHF1q","7ku1piB08l","pWiOsMm8si","euZA5uZPqg",
+"45cIH2ZHdk","BFkb8EOE1o","xXTI4IRh48","sqVrfQ6Lix","M6qcGOUYuF","2Yz7EX6Pin","h1zcHpv0i7","vOqCENo0Qb","oQ87raez9y","kB5nP0h1b1",
+"ZzJHWTwano","DLhzMRpBQm","kB5nPnFqik","kZANmQssNC","9GXkXTwano","iwzGkcShY2","aL6AJP6bcg","GWqqXDLhzM","t98iWOUYuF","0KyfsL7cGc",
+"lsQGozQt6Q","DLhzMtlILt","t98iW8U2nU","Mkgy8YOfrY","B3qemYjB9t","9eoRccmXIX","vOqCEo8Uyd","kB5nP6AFT0","xReecs7Mxk","lm0pDzqH0W",
+"9GXkXQnJ1S","QWxoTBGaQY","ZzJHWzbIYY","oQ87rjiVBP","wiHrZqUJMd","NOHszFGzgp","MGlTFtvdkD","X6PinM6qcG","l83UdBFkb8","uZPqgZUnqt",
+"KASQ8v1Hln","b29RJ0h1b1","DQimpCdyBV","zqH0W5ZaEz","gtCA5gIYvE","lm0pDpiJSk","AkKTkAOgEe","GXdoH0h1b1","CqqaDAmdQd","ciuWzjSjS3",
+"J2mQiYh1hF","y94nwO3iyQ","5VZjSZ4I1v","zqH0WtuDyS","7Ow5CWaWsv","t98iWjtn0X","FhtglYw2oU","8FmFH0MR5X","hYBCKs7Mxk","KsjRKKr8ys",
+"hUTw70YAGH","8cVD3Mkgy8","aez9y4QMc9","pT8wuThjNn","d7vjMuvf7A","hi5X7aL6AJ","aDGtSSWfou","pT8wuNhXdu","Nxx9V16lHc","uvf7A5ZaEz",
+"45cIHkZANm","LewvMyEfy9","zbIYYSjskQ","ix74rFnPFB","e6e4z07n1c","jtn0XC2Irc","2DREsZJTXH","gdQsSWaWsv","UlU3My94nw","aez9yQnJ1S",
+"iKqhrxXTI4","M6qcGOz8yZ","n1pmOLDk6f","29QAz8hJdt","zmLYDFGzgp","i3pydnlaBy","JkzUnuvf7A","Q6LixVerEA","KASQ8BpYhV","FNYIMXyPZN",
+"ZJTXHZuDtD","BCxeCAkKTk","PYBf4rKDLJ","Uvlv4J2mQi","FnPFBmz8gx","dpe1vFxX9q","Vprf2jfREu","zHF1qNOHsz","gjUTuUlU3M","uN6r3Ta8f6",
+"rz7UtStlDJ","ulk41jS1aj","ix74rPYBf4","S77LHoVQp6","zbIYYEdBKc","uZPqgCIShG","y94nwn1pmO","lkMUAX6Pin","F6PT28RCUA","lweGyP6bcg",
+"DG4sTAIYUu","i3pydFPfSE","lpF6WMojnP","fqypyHlUbF","CdyBVDz1R3","NhXdus93Ml","zY1GY1j5L8","jiVBPLewvM","l83UddmoS7","Vprf2Vprf2",
+"8TxD7Gv3Fq","IRh48JXljW","yofH3mX2GE","FxX9qYf2Ec","0BmCyuAWyp","7fKYUY1mC0","45cIHoGu6x","t59lR07n1c","AgJHQFLsph","KASQ81v5hH",
+"JIqXi7fsYM","hE1QlMojnP","kB5nPRpBQm","xciqpfcJOy","2ZHdkiKqhr","Y1mC0lXFOB","ZhwG1suY4x","U3yw5tuDyS","qUJMddQ586","HP4332Yz7E",
+"gf8rIM6qcG","RmDcrCdyBV","b29RJtl72W","l83UdvLsmS","EdBKche9IA","FcWrWydG8U","C2IrcZhwG1","Cfgr3cShY2","K20wKEoToP","ZzJHWS77LH",
+"tuDySkB5nP","i3pydFhtgl","Q6hMCQnJ1S","BGaQYIKxdL","uAWypt98iW","t59lRx3LDe","HlUbF0ao3l","k85AeaDGtS","RpBQm14FLR","Qworus7Mxk",
+"he9IAsx5Gl","IKxdLWDVWJ","yToGWtuDyS","lm0pDCNHmv","AXpwE8U2nU","dmoS7QClRL","v2eC3O3iyQ","Ul4a1C2Irc","v8yFNjS1aj","x3LDe580YD",
+"uQIczAgJHQ","7ku1pYOfrY","tlILt7Ow5C","gjUTuo8Uyd","vLsmSuPX7G","uTacxv8yFN","WaWsvtjQxs","TCgPpsuY4x","VBjhzfqypy","29QAzUl4a1",
+"mz8gxuAWyp","yofH364s8N","2ZHdk0PktI","5NammQnJ1S","FwEJzuJScX","pvgjScL0aE","6q6L9IRh48","n1pmOkZANm","CdyBVuPX7G","MezSW3weIF",
+"pv0i7Yh1hF","zY1GYqUJMd","0h1b1oVQp6","pv0i7bZLvS","In3NSru4UG","Yh1hFMaJQs","5Drn0SbRYy","MaJQshe9IA","OUYuFtvdkD","QClRLKr8ys",
+"F6PT2NOHsz","O3iyQUvlv4","Cp3mZQ6hMC","CdyBV64s8N","cShY2zQt6Q","nnP8o7lUXZ","gf8rId7vjM","5VZjSjzUqR","M3zXLO3iyQ","yvOMIjfREu",
+"ZUnqtiB08l","Oz8yZsqVrf","KsjRKlsQGo","nlaByjeskS","jzUqR9GXkX","P6bcgVIlwP","2Nslmaez9y","Gv3FqWmadA","t59lR0BmCy","fqypyAXpwE",
+"n8pJ94QMc9","XyPZNAXpwE","Cp3mZ3weIF","ZzJHWAOgEe","GSQwjpvgjS","l83UdfFDrJ","ZhwG1FxX9q","taOXKO3iyQ","yEfy9azIWp","pv0i7lViBv",
+"24ARFsqVrf","FnPFB24ARF","zFgtByToGW","9eoRcAkKTk","v1Hlnrhl0J","OHaBzStlDJ","sx5Gl6AFT0","rhl0JZJTXH","AIYUugtCA5","GXdoHaL6AJ",
+"uvf7A07n1c","jeskS5drc6","LewvMuTacx","EOE1oWPmlx","sqVrfVjCZq","EdBKcDG4sT","Oz8yZAXpwE","VLTy6GrDg7","mX2GE4dEz6","LbRTHHzZT8",
+"8U2nUPYBf4","P6bcgjfREu","m4bxUzQt6Q","iwzGkVBjhz","StlDJRkQke","GXdoHpWiOs","brhlQtlILt","xciqpM6qcG","rKDLJMojnP","No0Qbn8pJ9",
+"mz8gxTXQ0Z","5nmWvEOE1o","hYBCKMaJQs","4dEz63weIF","J2mQiyluBx","sqVrfDQimp","t59lRni2v1","L7cGc7X3uy","9y4lwDG4sT","pFrrlCIShG",
+"0YAGHfcJOy","P6bcgQbxXc","S2DfukB5nP","brhlQuTacx","8xEKz4QMc9","lm0pDCIShG","vLsmSbgJAz","n8pJ9jtn0X","AkKTks4786","QnJ1Spv0i7",
+"hE1Qls7Mxk","gf8rI16lHc","zmLYD0Kyfs","JkzUn5nmWv","yToGWciuWz","bgJAzuvf7A","oGu6xrz7Ut","v1HlnuAWyp","ydG8U9y4lw","blLA91j5L8",
+"zQt6Q2Nslm","Dz1R3ThjNn","7fsYMpT8wu","IjTwPjS1aj","iwzGkhUTw7","uAWypVBjhz","FhtgllCMxy","8RCUA4W0Tl","ReKEWvOqCE","BCxeCVerEA",
+"Q6Lixn1pmO","8hJdt9y4lw","oVQp60Wr5y","sx5Gl7fKYU","soy9tBGaQY","gIYvE6AFT0","faHirhi5X7","EOE1obrhlQ","hE1Ql6AFT0","gf8rIuZPqg",
+"vOqCEQWxoT","Z4I1vvLsmS","nnP8oBGaQY","POUYS9y4lw","FNYIM6AFT0","ZzJHWWreyP","0BmCyIjTwP","PYBf4fFDrJ","hE1Ql4W0Tl","StlDJWaWsv",
+"K20wKPOUYS","oQ87rpiJSk","nlaByMkgy8","RzaZA0BmCy","gf8rIStlDJ","8U2nUpmeCd","uN6r3zFgtB","6q6L9dmoS7","WmadAy94nw","HRxd8ru4UG",
+"xXTI45VZjS","iKqhrKZamH","uPX7Gsx5Gl","uN6r3qQxHP","GWqqXciuWz","guMb8HfyNQ","2TRI7yofH3","nFqikMmsIo","VerEAaFFss","cQOnvlkMUA",
+"yluBxCdyBV","mX2GEqaofN","RACujGv3Fq","h1zcHvkCHH","zqH0WsqVrf","okgRiY1mC0","Cp3mZRxrsm","XflUqGWqqX","lH1ktn1pmO","kZANm07n1c",
+"8xEKziB08l","TCgPpFnPFB","RBhp0uN6r3","tAOsruvf7A","n8pJ9RkQke","QnJ1SpiJSk","AgJHQMm8si","guMb8cL0aE","TCgPp0Kyfs","Y1mC0qUJMd",
+"cQOnvFwEJz","s7Mxks7Mxk","s93MlPOUYS","618DiRxrsm","HfyNQSbRYy","k85AeoQ87r","RACujuoStw","v1HlnzFgtB","y94nwCfgr3","K4GS8JXljW",
+"DcpWBW3VFH","fqypyGrDg7","RxrsmjeskS","8xEKzk85Ae","pv0i72DREs","VjCZqEoToP","RzaZAWmadA","StlDJAmdQd","dmoS7v8yFN","iB08luTacx",
+"ReKEWhe9IA","Cfgr3Cfgr3","ReKEWM6qcG","5VZjSv1Hln","yEfy929QAz","qQxHPRsQUq","Oz8yZv8yFN","Nxx9VDcpWB","ZJTXHFjHXR","uTacxQChxs",
+"n8pJ9NOHsz","uvf7ADQimp","0ao3lWmadA","djsrvFhtgl","lCMxykZANm","XflUq5nmWv","W7cTs6AFT0","n8pJ9CqqaD","VLTy6o8Uyd","NhXduQnJ1S",
+"0h1b1IjTwP","FwEJzIRh48","zHF1qiKqhr","jeskSK4GS8","9eoRckB5nP","AXpwE1j5L8","dpe1vCdyBV","0h1b1JJs5m","jfREuIKxdL","48cHLVLTy6",
+"yofH3ciuWz","lH1ktBGaQY","Kr8ysJJs5m","W3VFHCfgr3","i3pydrhl0J","MmKGJlj07Q","Nxx9VWaWsv","hSSvQvLsmS","9eoRc9XyT9","VLTy6No0Qb",
+"Pb1pan1pmO","uQIczOUYuF","tlILtuZPqg","lpF6WMm8si","pv0i78U2nU","jfREuiB08l","soy9tguMb8","piJSkRsQUq","yofH3rz7Ut","FnPFB0h1b1",
+"pFrrlrhl0J","xReecKsjRK","WDVWJgjUTu","zQt6QOxWIH","5VZjSXyPZN","DG4sTlCMxy","VBjhzpiJSk","aez9yGXdoH","uZPqgni2v1","QssNClm0pD",
+"dmoS7WreyP","8FmFHqQxHP","FGzgpuoStw","2Yz7EMGlTF","jS1ajjeskS","CqqaDtvdkD","FnPFBF6PT2","MK07YFcWrW","8U2nU9XyT9","pFrrlIBe8k",
+"QYxC0HfyNQ","FxX9qoQ87r","HP433tAOsr","s7Mxk7Ow5C","Cp3mZt59lR","MK07Ylj07Q","x3LDedjsrv","pv0i7W7cTs","MK07YRBhp0","hSSvQKASQ8",
+"B3qemAXpwE","QssNCQ6hMC","9GXkXv8yFN","VjCZqStlDJ","9iGoTAkKTk","OxWIH7X3uy","wDajX0BmCy","2ZHdkNhXdu","6AFT08hJdt","aFFsscL0aE",
+"jtn0Xt59lR","s4786PYBf4","FxX9qECMvU","uQIcz8FmFH","fLNg8v2eC3","cShY25VZjS","ru4UGprNT6","8U2nUSmGzv","GWqqXsuY4x","7fsYMyEfy9",
+"cmXIXTCgPp","aDGtSjzUqR","NcICAReKEW","AXpwESjskQ","qQxHPkB5nP","ThjNnFGzgp","iB08lQbxXc","sqVrfZzJHW","KZamHMGlTF","K4GS8ydG8U",
+"bZLvSNAFuw","cmXIXpv0i7","zbIYYgf8rI","Yh1hFi3pyd","FNYIMnlaBy","yluBx8RCUA","8cVD3uoStw","ZhwG1Yw2oU","FFDuii7WMQ","faHirFLsph",
+"euZA5lsQGo","WaWsvzqH0W","Yw2oU1j5L8","fLNg8cQOnv","gIYvEix74r","U3yw5MmsIo","HRxd8WPmlx","J2mQiuAWyp","YjB9tulk41","RmDcrwiHrZ",
+"NAFuwQ6hMC","hUTw7M6qcG","FVMxot98iW","lXFOBJkzUn","5drc6fmIK1","tl72WWaim6","pmeCdlkMUA","9GXkXdjsrv","soy9ti3pyd","DcpWB48cHL",
+"ZUnqtRsQUq","gtCA5lweGy","8cVD3Uvlv4","GXdoHHfyNQ","GWqqXMm8si","VerEAUmaEv","CdyBVOz8yZ","Cp3mZAOgEe","fmIK1t98iW","Q6hMCFVMxo",
+"7hyVv7Ow5C","K4GS86q6L9","dhSuHDz1R3","QnJ1SzHF1q","aez9yVerEA","0ao3l6AFT0","WaWsvQWxoT","O3iyQt59lR","LbRTH2DREs","FnPFBjeskS",
+"uQIcza00b5","NAFuwCfgr3","UmaEvMezSW","W3VFHVIlwP","580YDBGaQY","tuDyS5iGN5","OxWIHX6Pin","aFFssS77LH","jzUqRMezSW","uJScXQYxC0",
+"QnJ1SO3iyQ","HRxd8fFDrJ","uAWypAXpwE","Waim6LDk6f","ydG8UvLsmS","PYBf4XyPZN","aFFss2Nslm","n8pJ9nlaBy","sqVrfjSjS3","5Mg9r14FLR",
+"ZUnqtk85Ae","Y1mC0VNCPd","ReKEWlsQGo","S77LHQChxs","RkQkeGrDg7","piJSkOUqFM","O3iyQQ6Lix","KZamHL7cGc","CdyBVh1zcH","zbIYY4QMc9",
+"D6rByogLgc","SmGzv9XyT9","IjTwPHzZT8","SWfouyofH3","5nmWvOz8yZ","fFDrJDG4sT","jeskSv1Hln","QbxXcMK07Y","jS1ajZv7z0","CqqaD3weIF",
+"sqVrf3otm6","4QMc9B3qem","9XyT9Nxx9V","FcWrWb29RJ","lXFOBSs0Zu","zmLYDWmadA","AIYUuuJScX","MGlTFF6PT2","iKqhrBCxeC","8TxD7nlaBy",
+"prNT6TCgPp","pAhR1hi5X7","XyPZNJXljW","DcpWBBGaQY","618DidmoS7","t98iWuTacx","VLTy6xciqp","xXTI4piJSk","nnP8os93Ml","qQxHPIKxdL",
+"Oz8yZfLNg8","i7WMQgdQsS","zQt6QpWiOs","ni2v1h1zcH","DcpWB45cIH","azIWpfcwDa","iKqhruQIcz","Cp3mZGSQwj","uTacxNcICA","vLsmSTwano",
+"v2eC3azIWp","OxWIHQbxXc","ZUnqtSbRYy","zFgtBjzUqR","BbwgA9GXkX","jzUqRZ4I1v","HzZT8AgJHQ","MmKGJK20wK","7fsYMQYxC0","cmXIXXyPZN",
+"yEfy9fcJOy","uTacxd7vjM","IRh487ku1p","8FmFHtl72W","AOgEe5VZjS","faHir0ao3l","Kr8ysuTacx","nFqiklViBv","vLsmSqaofN","SjskQ7fKYU",
+"9y4lwvOqCE","CdyBV0PktI","MmsIoogLgc","LewvMlXFOB","bgJAzSbRYy","ThjNn5iGN5","WDVWJtvdkD","No0Qbjtn0X","1v5hH3weIF","lweGyazIWp",
+"AgJHQbZLvS","zqH0WJRJQB","VNCPdS77LH","45cIHpvgjS","5iGN5uTacx","ni2v1X6Pin","Mkgy8FLsph","SjskQAIYUu","7X3uy6q6L9","kB5nPCxVEf",
+"BpYhVuvf7A","7ku1pQYxC0","iwzGkrKDLJ","v8yFNoQ87r","Cfgr3yofH3","NOHszSbRYy","wiHrZRBhp0","5nmWvZv7z0","xXTI4uLtKs","NcICAdpe1v",
+"uAWypRACuj","HlUbF0BmCy","k85AeQClRL","L7cGcdjsrv","Cp3mZxReec","AOgEejiVBP","xXTI4tl72W","bZLvSy94nw","QworutuDyS","fmIK1bgJAz",
+"IjTwPJRJQB","uPX7GIn3NS","Ss0Zu9GXkX","TCgPpkZANm","t59lRDz1R3","brhlQgdQsS","HzZT8ReKEW","xciqpbgJAz","faHirgdQsS","ECMvUblLA9",
+"MaJQsTwano","rz7Uth1zcH","Ta8f6HP433","55rfBKsjRK","Z4I1vfFDrJ","DG4sTvkCHH","e6e4zOz8yZ","vkCHH3weIF","FLsphyluBx","lCMxyCNHmv",
+"7X3uygjUTu","WmadAazIWp","uLtKsHRxd8","RBhp0JIqXi","mX2GEgtCA5","a00b5taOXK","K20wKKASQ8","AgJHQd85a9","gtCA5Vprf2","HP433JkzUn",
+"ciuWzS77LH","M6qcGVjCZq","2TRI7Q6Lix","FFDuiNAFuw","mz8gxpT8wu","48cHL14FLR","jeskS64s8N","sqVrfkB5nP","OUqFMMojnP","kB5nPO3iyQ",
+"OHaBzReKEW","BbwgAEOE1o","he9IAqUJMd","8U2nURpBQm","WMiS3HlUbF","i3pydQworu","9GXkXRACuj","BbwgASs0Zu","fcJOyl83Ud","VNCPdk85Ae",
+"C2IrcjzUqR","azIWpEOE1o","uupzkI7p2a","WmadAMmsIo","djsrvLbRTH","XflUqfqypy","prNT6tAOsr","iwzGkrz7Ut","KZamHQ6Lix","W7cTsP6bcg",
+"t59lRblLA9","dpe1vkZANm","QssNCvkCHH","POUYSiqv4k","euZA5MezSW","2hEEU1v5hH","ZzJHWMK07Y","azIWpuJScX","W7cTsHP433","uAWypGWqqX",
+"CIShGfLNg8","KZamHPb1pa","0Wr5ySmGzv","Kr8ysSs0Zu","JJs5m1j5L8","uZPqg8FmFH","ZzJHWpWiOs","VBjhzU3yw5","yEfy9D6rBy","CqqaDSs0Zu",
+"8FmFHs7Mxk","mz8gx8xEKz","kB5nPM6qcG","zFgtBdjsrv","9XyT9ECMvU","GrDg7QnJ1S","nnP8oK4GS8","FLsphpvgjS","brhlQdhSuH","rz7UtuJScX",
+"Mm8sis4786","PYBf49rlg9","MaJQsGv3Fq","lweGyDz1R3","Kr8ysRBhp0","OUqFMFhtgl","ReKEWHfyNQ","oGu6xTwano","xReecn8pJ9","uupzkP6bcg",
+"5ZaEz8FmFH","tl72WuAWyp","7X3uyuTacx","M3zXLRACuj","fmIK1uAWyp","QworuECMvU","rhl0JFPfSE","ix74ruTacx","v1HlnuPX7G","QYxC00YAGH",
+"fcwDauPX7G","IjTwPFwEJz","rz7UtgjUTu","lpF6WgjUTu","C2IrcqQxHP","MezSWWaWsv","U3yw59y4lw","zY1GYfLNg8","BbwgAaez9y","7ku1pguMb8",
+"lpF6WtaOXK","AgJHQbgJAz","Mm8sioGu6x","nlaByRBhp0","S77LHNhXdu","QnJ1SHzZT8","2ZHdkBbwgA","AgJHQ8FmFH","0PktIy94nw","lweGyOz8yZ",
+"e6e4zJkzUn","AXpwELewvM","gf8rIqQxHP","suY4xksJby","lm0pDpv0i7","zQt6QRpBQm","WmadANAFuw","BpYhVQ6hMC","Zv7z0QChxs","lweGyhE1Ql",
+"TXQ0ZnlaBy","JIqXid7vjM","VjCZqaL6AJ","FVMxodjsrv","Ss0ZutvdkD","TCgPp2DREs","Ul4a1kZANm","uQIczZzJHW","7X3uyM6qcG","t59lRjzUqR",
+"mX2GEfLNg8","Chuy3d7vjM","azIWpv1Hln","lj07QW3VFH","v1Hlnb29RJ","CxVEf5iGN5","IRh48XflUq","RpBQmtAOsr","1v5hHNcICA","7ku1pHP433",
+"FwEJzpvgjS","XyPZNIBe8k","O3iyQQssNC","jS1ajRsQUq","OHaBzd7vjM","VNCPd7X3uy","NcICApFrrl","qUJMdIn3NS","2Yz7EQnJ1S","TCgPpFGzgp",
+"rhl0J14FLR","0ao3lJIqXi","FNYIMlkMUA","M6qcGiB08l","RsQUqIRh48","QworuoQ87r","s93Ml0BmCy","CdyBVWreyP","wDajXFxX9q","HlUbFrKDLJ",
+"EOE1oHRxd8","gIYvEEOE1o","lj07QEOE1o","nlaByFhtgl","pv0i7jzUqR","prNT6Fhtgl","uupzkK20wK","VerEAtlILt","taOXK618Di","QWxoT0MR5X",
+"6AFT0AIYUu","0YAGHGrDg7","zQt6Q14FLR","KASQ8Q6Lix","wiHrZIBe8k","rhl0Jv8yFN","AkKTk7lUXZ","lH1ktIRh48","cShY2pWiOs","jzUqRulk41",
+"ZUnqt8FmFH","WmadA45cIH","48cHLZv7z0","faHirZuDtD","uAWypSjskQ","HRxd8NhXdu","oQ87r0Wr5y","kB5nPAkKTk","qaofNlViBv","pFrrlCNHmv",
+"RACujjS1aj","GrDg7QChxs","5nmWvlH1kt","nFqikeuZA5","Uvlv4ru4UG","uTacxDG4sT","jtn0X4W0Tl","RpBQmvkCHH","BFkb8GXdoH","7lUXZSjskQ",
+"d85a9JRJQB","JkzUnuN6r3","5VZjSTa8f6","RmDcr5ZaEz","wDajXBGaQY","9eoRcRzaZA","Cfgr3lj07Q","0Wr5yk85Ae","1LB1LZzJHW","rhl0JChuy3",
+"HP433O3iyQ","TCgPpW7cTs","HzZT8TCgPp","NhXdukZANm","DcpWBfcJOy","SbRYyC2Irc","taOXKKr8ys","cmXIXiqv4k","QChxsQworu","DG4sTOUqFM",
+"soy9tyToGW","8hJdtMK07Y","Kr8ysS2Dfu","lXFOBpWiOs","CqqaDUvlv4","y94nwo8Uyd","M6qcG1j5L8","RkQkei7WMQ","hSSvQCxVEf","Chuy3uZPqg",
+"1v5hH24ARF","lpF6WEoToP","gdQsSB3qem","lweGyDcpWB","xXTI429QAz","5IhmGG1RhS","M6qcGIRh48","WDVWJGWqqX","qQxHPGWqqX","JJs5mPOUYS",
+"k85Aeulk41","lH1ktP6bcg","cQOnvSs0Zu","U3yw5FnPFB","RzaZAhUTw7","uZPqgLDk6f","O3iyQe6e4z","JJs5m7X3uy","jeskS0Wr5y","gjUTu7fsYM",
+"nlaBy8hJdt","ydG8UGrDg7","Cfgr3v2eC3","wiHrZMm8si","07n1cBFkb8","he9IAIBe8k","Zv7z0I7p2a","kB5nPatef2","7ku1pzmLYD","2DREsFLsph",
+"AIYUum4bxU","yluBx7fKYU","e6e4zVLTy6","2TRI7s93Ml","8RCUApT8wu","NcICAsx5Gl","BpYhVd7vjM","wiHrZk85Ae","0h1b1euZA5","jiVBPIRh48",
+"VerEADLhzM","NcICAJRJQB","0h1b1WmadA","azIWppT8wu","ksJbypT8wu","pvgjS0PktI","TCgPp8cVD3","RpBQmJRJQB","ix74rFxX9q","bgJAzxReec",
+"yEfy92Yz7E","Q6Lix9y4lw","FNYIMd85a9","SbRYy580YD","QbxXcdQ586","48cHLVBjhz","0MR5XEOE1o","I7p2aBFkb8","uvf7ApiJSk","jtn0XFNYIM",
+"prNT6ru4UG","nFqikZJTXH","24ARFUmaEv","45cIHjSjS3","6q6L9s93Ml","WaWsvX6Pin","gjUTusuY4x","QssNCZuDtD","ogLgcrKDLJ","VLTy6Yw2oU",
+"G1RhSwiHrZ","ZJTXHxciqp","pv0i74QMc9","v8yFNjzUqR","uN6r314FLR","6AFT0ciuWz","ydG8UTCgPp","4W0TlcQOnv","pT8wui7WMQ","14FLR9y4lw",
+"2NslmJRJQB","lXFOBDcpWB","zFgtBRmDcr","sqVrflsQGo","cShY2Gv3Fq","AOgEeMm8si","MojnPuJScX","P6bcgprNT6","ThjNnX6Pin","5NammGSQwj",
+"DQimpBGaQY","a00b5J2mQi","ReKEWdjsrv","5ZaEz2TRI7","fcJOyW7cTs","KsjRK55rfB","d7vjMcL0aE","FPfSEAIYUu","VIlwPh1zcH","Cp3mZcQOnv",
+"qQxHPVBjhz","RzaZA5Drn0","ni2v1SbRYy","Y1mC08xEKz","U3yw5xReec","Pb1pa0ao3l","LDk6fxXTI4","Cp3mZFcWrW","pFrrlv1Hln","qQxHPIBe8k",
+"AXpwEMezSW","cL0aEuPX7G","FVMxoAOgEe","zqH0Whe9IA","24ARFMm8si","IKxdLIRh48","M3zXLYf2Ec","dpe1vpv0i7","d85a9bgJAz","In3NSBGaQY",
+"RmDcruAWyp","qQxHPFxX9q","tjQxsCIShG","4QMc914FLR","1v5hH5IhmG","zqH0WReKEW","ogLgcVjCZq","Mm8siOUYuF","s93MlCNHmv","v8yFNGWqqX",
+"L7cGc7Ow5C","AXpwEs93Ml","gtCA5FGzgp","uTacxRBhp0","gdQsSOxWIH","TCgPpC2Irc","brhlQQ6hMC","xXTI4FxX9q","lXFOBrz7Ut","nFqikHRxd8",
+"Pb1pavOqCE","cmXIXuN6r3","hUTw7BCxeC","BCxeC2Yz7E","cQOnvZJTXH","XflUqCqqaD","W7cTsEdBKc","KsjRKokgRi","faHirGWqqX","OUYuF29QAz",
+"HP4332ZHdk","Gv3Fq7fKYU","Ta8f6atef2","2Yz7EAkKTk","fLNg8aL6AJ","FcWrWMK07Y","4dEz6uupzk","i7WMQWaWsv","WPmlx9iGoT","14FLR2hEEU",
+"MezSWhE1Ql","ydG8UXyPZN","KASQ8CK5W7","45cIHlCMxy","taOXKaFFss","FjHXRBGaQY","o8UydQnJ1S","HfyNQuupzk","lj07QksJby","ReKEWGXdoH",
+"vOqCErhl0J","5VZjSBbwgA","t59lRuQIcz","oVQp6HfyNQ","xReecdjsrv","5IhmG48cHL","uTacxWDVWJ","jtn0XjiVBP","2hEEUaez9y","NOHszyluBx",
+"RxrsmCfgr3","aez9yoQ87r","lViBvsuY4x","Cp3mZ07n1c","aL6AJy94nw","UlU3MFcWrW","i7WMQRsQUq","UlU3Mni2v1","BFkb80Wr5y","XyPZNd85a9",
+"AkKTksuY4x","NOHszdhSuH","tjQxseuZA5","NOHszNOHsz","Z4I1vOxWIH","lH1kt9XyT9","Chuy35Mg9r","POUYSCIShG","uJScXM3zXL","CK5W7gIYvE",
+"BGaQYzQt6Q","jeskScShY2","BGaQYiB08l","uN6r3lweGy","SbRYyBCxeC","4dEz60ao3l","NOHszMK07Y","uTacxZUnqt","S77LHY1mC0","0Kyfs7fKYU",
+"QClRLNAFuw","1j5L8bgJAz","7lUXZpWiOs","RsQUqDLhzM","sx5Glm4bxU","RACujQ6Lix","cQOnvjeskS","B3qemogLgc","Vprf2zqH0W","o8UydoQ87r",
+"5drc6FGzgp","gf8rIP6bcg","iwzGkQbxXc","0ao3lVerEA","DQimpguMb8","piJSkOHaBz","iKqhrbrhlQ","NcICApAhR1","IBe8kFwEJz","MmsIohE1Ql",
+"X6PinuLtKs","tjQxsAXpwE","dhSuHJKWYR","s7MxkFwEJz","h1zcHMGlTF","FnPFBThjNn","MGlTFNAFuw","MezSWgjUTu","2DREsSWfou","dhSuHgIYvE",
+"5ZaEzuupzk","VjCZq6AFT0","HzZT8ZhwG1","EOE1o8xEKz","prNT6a00b5","ReKEWlkMUA","cQOnvy94nw","Yh1hFgf8rI","L7cGc5nmWv","7ku1pkB5nP",
+"FxX9q6q6L9","ZUnqtZJTXH","HzZT8lkMUA","Uvlv4lViBv","i7WMQJ2mQi","HzZT8yToGW","G1RhSvkCHH","Ul4a19rlg9","I7p2aQClRL","mX2GEMmKGJ",
+"LbRTHStlDJ","y94nwAOgEe","GrDg7Mm8si","xXTI4vOqCE","5Drn0Gv3Fq","lj07QuAWyp","8cVD3gIYvE","l83UdP6bcg","6AFT0gtCA5","Oz8yZjS1aj",
+"jSjS31LB1L","lkMUA9eoRc","n1pmOt98iW","LbRTHKr8ys","KASQ8nFqik","jSjS3VLTy6","OUYuFxXTI4","MmKGJtjQxs","OUYuFwDajX","NAFuwyvOMI",
+"s7Mxk1LB1L","ix74r5nmWv","3weIFgIYvE","6q6L9m4bxU","oQ87rVIlwP","tlILtNxx9V","OHaBziwzGk","a00b5ReKEW","HzZT8Cp3mZ","FxX9qazIWp",
+"Mm8siKASQ8","fFDrJS2Dfu","FnPFB2hEEU","YjB9t8FmFH","SmGzvHlUbF","d85a9QChxs","cL0aEIKxdL","5IhmGWmadA","kB5nPJXljW","aL6AJY1mC0",
+"HRxd8cQOnv","tl72WfFDrJ","Pb1paguMb8","tvdkDuN6r3","QClRLuLtKs","PYBf4StlDJ","lCMxyNOHsz","AmdQdoQ87r","16lHcn8pJ9","6AFT0ru4UG",
+"tvdkDyEfy9","zY1GY7hyVv","LbRTHd7vjM","gjUTuWreyP","AOgEeW3VFH","aez9yzqH0W","TwanobrhlQ","Mm8siNcICA","0BmCyTwano","ix74r0ao3l",
+"mz8gxM6qcG","t59lR5ZaEz","5nmWvogLgc","HP433CqqaD","qaofN2ZHdk","ThjNnMmsIo","VIlwP4QMc9","zHF1qLDk6f","QssNCIn3NS","vkCHH2DREs",
+"Fhtgl5Drn0","WaWsvhE1Ql","azIWpAgJHQ","Z4I1v6AFT0","ZUnqtAXpwE","v8yFNLewvM","zmLYDkB5nP","uPX7GPYBf4","EoToPHfyNQ","hYBCKMmsIo",
+"jS1ajReKEW","K20wKAkKTk","VBjhzNhXdu","tvdkDaDGtS","ZhwG1AOgEe","9eoRcbrhlQ","ZUnqt9iGoT","Uvlv4FjHXR","mX2GEazIWp","Z4I1vqaofN",
+"TCgPpoGu6x","zHF1q0PktI","a00b5rKDLJ","vkCHH0Kyfs","7ku1pulk41","NOHsz9GXkX","uJScXUmaEv","SbRYyAXpwE","1j5L8cShY2","lweGyru4UG",
+"PYBf4s93Ml","JRJQBgIYvE","F6PT2PYBf4","Mkgy8fFDrJ","guMb8JKWYR","hYBCKs93Ml","aez9yL7cGc","45cIHlViBv","ciuWzQworu","pvgjSOz8yZ",
+"HlUbFGv3Fq","VLTy6ZzJHW","qQxHPjfREu","7lUXZStlDJ","hE1Ql7lUXZ","AOgEeRACuj","B3qem0Wr5y","AOgEefcwDa","6AFT02DREs","o8UydoGu6x",
+"3otm6CIShG","MK07YZUnqt","fcwDaU3yw5","guMb8zmLYD","Uvlv4HfyNQ","Mm8siatef2","UmaEvOxWIH","wiHrZtl72W","x3LDeZUnqt","8TxD7piJSk",
+"AmdQdZv7z0","5VZjSdjsrv","K20wKdhSuH","1v5hHhYBCK","o8Uyd9XyT9","sx5GlzmLYD","Gv3FqMK07Y","VNCPdSs0Zu","zmLYDCdyBV","Yh1hFsuY4x",
+"ThjNnEdBKc","0Wr5yWaWsv","9XyT94QMc9","v8yFNU3yw5","t98iWFLsph","5Mg9rZ4I1v","MmsIozHF1q","EoToPsx5Gl","5ZaEzhi5X7","M6qcGlsQGo",
+"UlU3Mdjsrv","S77LHMK07Y","xciqpuN6r3","CIShGvOqCE","taOXKl83Ud","Y1mC0jfREu","AgJHQQ6Lix","zz4ZU14FLR","F6PT2DG4sT","K20wKlsQGo",
+"FcWrWiKqhr","i7WMQjiVBP","sx5GlTXQ0Z","AgJHQGrDg7","Ss0Zu2Yz7E","aez9yuupzk","MK07YMGlTF","mz8gxi3pyd","NOHszyvOMI","EOE1oFVMxo",
+"zY1GYv8yFN","tvdkDkZANm","S77LHbrhlQ","Q6LixJRJQB","FLsphQWxoT","QbxXch1zcH","WmadA9XyT9","VLTy6Rxrsm","LDk6f8FmFH","K4GS8ThjNn",
+"uJScXXflUq","t59lRfcwDa","OUYuFk85Ae","XyPZNB3qem","rKDLJuupzk","Twanoi7WMQ","ECMvU5Mg9r","atef2m4bxU","YOfrYjtn0X","cmXIXGv3Fq",
+"5NammS2Dfu","BCxeCfqypy","GrDg7NOHsz","v1HlnNo0Qb","wiHrZZ4I1v","QnJ1SzqH0W","uupzkJRJQB","aez9yyluBx","uLtKsMaJQs","Yf2EcUvlv4",
+"uQIczpiJSk","IKxdLMojnP","LDk6fjeskS","cQOnvlXFOB","BbwgAtuDyS","07n1cLDk6f","580YDjeskS","djsrvY1mC0","SjskQFPfSE","oVQp6uN6r3",
+"jtn0XFwEJz","dpe1vVNCPd","KsjRKn1pmO","M6qcGAmdQd","azIWpVjCZq","yToGW9XyT9","cmXIXt98iW","0BmCy8RCUA","07n1c580YD","ydG8Uo8Uyd",
+"2TRI7tuDyS","M6qcGyToGW","taOXKogLgc","dQ586Twano","aL6AJbrhlQ","FwEJzNxx9V","HP43355rfB","0Wr5yfcJOy","qQxHPQworu","GSQwjCK5W7",
+"s4786l83Ud","cQOnv16lHc","sqVrfx3LDe","64s8NDG4sT","h1zcHLbRTH","m4bxUdhSuH","HzZT8IBe8k","WaWsvaez9y","No0QbJ2mQi","pFrrlxciqp",
+"Z4I1vy94nw","lweGyksJby","DQimpQbxXc","vLsmSx3LDe","ZJTXHfFDrJ","KZamH48cHL","zbIYYLewvM","AgJHQdQ586","4W0Tlzz4ZU","HRxd8ogLgc",
+"d7vjMAgJHQ","tAOsrO3iyQ","cL0aEvOqCE","Ta8f6dpe1v","IRh48djsrv","vOqCEYjB9t","cmXIXUl4a1","rKDLJTwano","hE1QlIKxdL","JKWYRhE1Ql",
+"wDajXm4bxU","qQxHPFGzgp","cmXIXoQ87r","S2Dfu5VZjS","SbRYyCqqaD","nlaByBGaQY","IBe8kDQimp","UlU3MuQIcz","v8yFNaDGtS","lpF6WdmoS7",
+"Dz1R3JJs5m","9iGoTtl72W","s7MxkjzUqR","tlILtfmIK1","UlU3MKZamH","guMb8yofH3","yEfy9TCgPp","lsQGoWaWsv","JIqXiyEfy9","iKqhrS2Dfu",
+"ciuWz2TRI7","HRxd8S77LH","K4GS8U3yw5","FLsphhE1Ql","0Kyfs48cHL","0MR5Xfqypy","MmKGJ5IhmG","FGzgpciuWz","8RCUAn1pmO","aFFss8U2nU",
+"9XyT92hEEU","taOXKhi5X7","TXQ0Z48cHL","tlILtiKqhr","tlILtcmXIX","pmeCdG1RhS","Vprf2qUJMd","4QMc9MmsIo","0MR5X0Kyfs","zz4ZUoVQp6",
+"QClRLRBhp0","iqv4kcL0aE","WDVWJUl4a1","Kr8ys5iGN5","MojnPG1RhS","Q6hMC55rfB","blLA9AmdQd","LDk6fbrhlQ","Ss0ZuCIShG","tjQxsB3qem",
+"MGlTFECMvU","cmXIX9y4lw","Cfgr3hYBCK","uLtKsJJs5m","uJScXhYBCK","rKDLJYh1hF","FNYIMI7p2a","DQimp4W0Tl","WaWsvaL6AJ","nFqikGWqqX",
+"Uvlv4Yw2oU","WaWsvsx5Gl","QWxoTiKqhr","s4786U3yw5","IRh485Namm","tvdkD0MR5X","2DREsRBhp0","I7p2aIjTwP","J2mQiRsQUq","cShY2IBe8k",
+"48cHLDz1R3","uPX7Gx3LDe","7fsYMkB5nP","Mkgy8s4786","ZJTXH24ARF","VBjhzTa8f6","sx5GlZuDtD","fcJOyTa8f6","zbIYYFGzgp","y94nw0Kyfs",
+"Zv7z0QWxoT","Y1mC0HlUbF","WDVWJvkCHH","MmKGJUmaEv","zY1GYcmXIX","uQIczhE1Ql","vLsmSEOE1o","Nxx9VWreyP","BbwgA0YAGH","lj07QpT8wu",
+"WDVWJcShY2","7ku1pO3iyQ","5Drn0Yf2Ec","Zv7z0DQimp","faHirogLgc","QssNCe6e4z","e6e4zl83Ud","QClRLOUYuF","C2IrcJJs5m","QClRLyvOMI",
+"yofH3AIYUu","3otm6Mkgy8","uLtKsaez9y","cQOnvHzZT8","AkKTkOHaBz","WreyPuLtKs","3weIFFFDui","dmoS7l83Ud","Ul4a1oGu6x","LDk6fAXpwE",
+"b29RJ9XyT9","NAFuwMGlTF","IjTwPnnP8o","5Drn0wiHrZ","aez9yFnPFB","I7p2alXFOB","TXQ0ZYjB9t","WmadAQnJ1S","9y4lwMmsIo","soy9tFwEJz",
+"prNT6ciuWz","9eoRculk41","gf8rIb29RJ","8U2nUBpYhV","uN6r3o8Uyd","uvf7AWreyP","CIShGM6qcG","hUTw7Fhtgl","uupzkpv0i7","ydG8UFFDui",
+"tl72WSWfou","W3VFHydG8U","lCMxyyEfy9","BFkb8RsQUq","GXdoHydG8U","5NammDcpWB","Uvlv49y4lw","o8UydTCgPp","jzUqRRpBQm","ksJbyv8yFN",
+"ZzJHWfqypy","WaWsvB3qem","5drc6GrDg7","jSjS3DQimp","NAFuwM6qcG","uN6r3In3NS","GWqqXMojnP","9rlg9F6PT2","DG4sTaFFss","sqVrfyofH3",
+"J2mQi0Wr5y","YjB9tiwzGk","MmsIos4786","ReKEWXflUq","9y4lwCfgr3","lkMUAzz4ZU","55rfB9eoRc","pmeCdZzJHW","VerEAPb1pa","5nmWvaL6AJ",
+"W3VFHi7WMQ","XyPZNC2Irc","IKxdLJKWYR","aL6AJ0h1b1","e6e4zjeskS","SbRYyCK5W7","XyPZNrKDLJ","ulk41JRJQB","atef2Z4I1v","OxWIH5Mg9r",
+"16lHcIBe8k","blLA9x3LDe","5nmWvWreyP","F6PT2zY1GY","aFFssFLsph","0h1b1Ss0Zu","wiHrZWPmlx","oQ87rYf2Ec","DLhzMfcwDa","FPfSE0Wr5y",
+"vkCHHPb1pa","dhSuHS2Dfu","fFDrJzHF1q","dmoS7iqv4k","DQimpFwEJz","Ta8f6WaWsv","lm0pDtl72W","RACujsoy9t","Kr8ysVerEA","RsQUqEoToP",
+"1LB1LYOfrY","o8Uydjtn0X","tuDySi7WMQ","jzUqRsx5Gl","xReecM6qcG","lm0pD0PktI","x3LDe5nmWv","aez9yl83Ud","Q6LixnlaBy","lpF6WFPfSE",
+"Uvlv4qUJMd","FNYIMPYBf4","oGu6xzmLYD","Mm8siP6bcg","NOHsz5IhmG","F6PT2K20wK","WmadAJIqXi","FPfSEogLgc","uvf7AHzZT8","yEfy9RsQUq",
+"Vprf2Ss0Zu","GSQwjsqVrf","v2eC3dpe1v","Ss0ZucShY2","ulk41CIShG","SWfous7Mxk","AXpwERkQke","qQxHPXflUq","dQ586yluBx","fcJOyDz1R3",
+"YOfrYGXdoH","lH1kt1LB1L","cL0aEpvgjS","YjB9tCp3mZ","v8yFNChuy3","No0QblH1kt","ECMvURpBQm","gIYvEFVMxo","MmsIoTa8f6","TCgPp45cIH",
+"ThjNnyluBx","jzUqRcShY2","t98iWCp3mZ","lH1ktFhtgl","IjTwP0h1b1","4W0TlbZLvS","wiHrZ5nmWv","Nxx9V0PktI","VjCZq2hEEU","L7cGcMK07Y",
+"MaJQsOxWIH","lViBvWPmlx","JIqXiFVMxo","FwEJzJXljW","a00b5Q6Lix","55rfB7fsYM","VLTy6atef2","K4GS8QnJ1S","zz4ZU0ao3l","AIYUu3otm6",
+"l83Udk85Ae","FwEJzlj07Q","IKxdLydG8U","euZA5uJScX","CqqaDzz4ZU","Yh1hFazIWp","TCgPpGrDg7","h1zcHHP433","XyPZNCK5W7","Cfgr3SbRYy",
+"lm0pDS77LH","DLhzM8RCUA","5ZaEzPOUYS","Ul4a1Mm8si","8RCUACIShG","t59lRQssNC","nlaByzFgtB","tAOsrmX2GE","AXpwElkMUA","vOqCEuZPqg",
+"AIYUuAXpwE","e6e4zBGaQY","ni2v1Chuy3","gf8rISs0Zu","e6e4z0h1b1","K20wKjzUqR","VBjhzGSQwj","DG4sTMezSW","Cfgr3n1pmO","VNCPdksJby",
+"lCMxyU3yw5","uoStw7ku1p","fLNg84dEz6","qUJMdFPfSE","VerEA5Drn0","NAFuwgIYvE","aDGtS7hyVv","CdyBVhe9IA","IjTwPvOqCE","oQ87rpT8wu",
+"gtCA5B3qem","5NammDz1R3","QChxslpF6W","zQt6Qd7vjM","atef29eoRc","aez9yNAFuw","NOHszYOfrY","5drc6iKqhr","0KyfspiJSk","Q6LixQssNC",
+"WPmlx5iGN5","XflUqHzZT8","JRJQBiB08l","cShY2HfyNQ","tl72Wrz7Ut","5VZjSuupzk","Vprf20MR5X","8RCUANOHsz","F6PT2JXljW","55rfBOUqFM",
+"PYBf4FcWrW","Dz1R3ix74r","jiVBPJIqXi","ksJbyIKxdL","uTacx2Nslm","SmGzvgIYvE","fFDrJ9eoRc","jeskSRBhp0","PYBf4C2Irc","Pb1pa7lUXZ",
+"gtCA5k85Ae","JXljWFVMxo","ydG8U07n1c","8xEKzoGu6x","K4GS8xciqp","zz4ZUBCxeC","MmKGJMm8si","0PktIbgJAz","EdBKcPYBf4","s93MlQClRL",
+"uTacxo8Uyd","StlDJgf8rI","t98iWxXTI4","FcWrWgjUTu","xXTI4580YD","zmLYDFnPFB","IRh48Q6Lix","iB08lBFkb8","8xEKzRzaZA","5drc6uN6r3",
+"Cfgr3ru4UG","HlUbFtlILt","BGaQYmz8gx","SWfouSmGzv","uvf7AksJby","ulk41AgJHQ","y94nwpFrrl","l83Uduvf7A","FxX9qKASQ8","gf8rIuPX7G",
+"YOfrYpv0i7","8U2nUlH1kt","uAWypazIWp","jeskSd7vjM","VNCPd5IhmG","StlDJFxX9q","POUYS55rfB","6AFT0FxX9q","VIlwP0h1b1","lm0pDVIlwP",
+"BpYhVM6qcG","vOqCEIjTwP","JJs5mTwano","vLsmS16lHc","DG4sTRpBQm","a00b5Fhtgl","YjB9tGSQwj","rKDLJm4bxU","BbwgAvOqCE","aez9ySWfou",
+"2DREsZ4I1v","lH1ktYjB9t","zz4ZUhi5X7","7Ow5CS77LH","WreyPC2Irc","EOE1olweGy","G1RhSxciqp","2NslmCdyBV","FPfSEMmKGJ","qUJMdnlaBy",
+"jzUqRuN6r3","BFkb8ZuDtD","dmoS7BGaQY","FcWrWiB08l","C2Irc1LB1L","BGaQYS77LH","IRh48W7cTs","0PktIAXpwE","hYBCKoQ87r","0KyfsEOE1o",
+"NcICAzY1GY","L7cGchUTw7","In3NSO3iyQ","9y4lwzmLYD","kB5nPqaofN","ZhwG14dEz6","piJSkCxVEf","QClRLrhl0J","Ta8f6uupzk","dhSuH4QMc9",
+"t98iWFwEJz","WPmlxi3pyd","rKDLJAmdQd","Ss0Zu5IhmG","KASQ8b29RJ","fLNg8fmIK1","yluBxlkMUA","vkCHHOUqFM","OUYuFMojnP","NAFuw4dEz6",
+"rhl0JB3qem","tlILtQ6hMC","GSQwjjtn0X","ReKEW4dEz6","LbRTHFwEJz","JkzUnhi5X7","BFkb8uJScX","Chuy3djsrv","mz8gxHRxd8","WPmlxpFrrl",
+"iqv4kFjHXR","1j5L8CK5W7","Mm8si55rfB","jzUqRt59lR","a00b5uZPqg","9y4lwqUJMd","5VZjSRsQUq","5Mg9rSmGzv","djsrv1v5hH","BbwgADQimp",
+"8xEKzCfgr3","VjCZqD6rBy","jzUqRxXTI4","5ZaEzs7Mxk","zQt6Qi7WMQ","JkzUnWMiS3","ni2v1s93Ml","RzaZAjeskS","lViBvoGu6x","uoStwWPmlx",
+"9rlg9ciuWz","ZUnqtDQimp","7Ow5C4QMc9","AIYUujSjS3","qaofNO3iyQ","7X3uy1v5hH","dmoS75Namm","Y1mC0RmDcr","SmGzv5ZaEz","uPX7GNo0Qb",
+"0ao3lUvlv4","BFkb8580YD","JRJQBQClRL","5Drn0hYBCK","lj07QY1mC0","guMb8CK5W7","aDGtSNAFuw","JKWYRWreyP","Zv7z0RpBQm","sqVrfBGaQY",
+"Mm8sijiVBP","JkzUncShY2","rKDLJM3zXL","5drc67fsYM","5iGN5s4786","WmadAYOfrY","Cp3mZ7X3uy","Ta8f6gjUTu","S77LHKsjRK","pvgjSSjskQ",
+"RpBQmIn3NS","QYxC0FcWrW","Q6hMCzFgtB","3weIFCK5W7","uoStwBGaQY","xXTI4lH1kt","blLA9uoStw","Ss0ZuuZPqg","DcpWBhi5X7","zFgtBpWiOs",
+"CNHmvo8Uyd","8RCUACNHmv","SWfouhi5X7","pFrrlFcWrW","8TxD77X3uy","0PktIni2v1","aDGtSOUqFM","mz8gxGrDg7","9GXkXiwzGk","LDk6fiKqhr",
+"AgJHQatef2","uLtKsjtn0X","5Namm0Kyfs","OxWIH2DREs","v1HlnFjHXR","hi5X7jfREu","Rxrsm5Drn0","zqH0WlCMxy","Yh1hFPYBf4","2DREsjtn0X",
+"a00b5FPfSE","RmDcrCIShG","K4GS8v8yFN","U3yw5D6rBy","0ao3lEdBKc","W3VFHHlUbF","ogLgcRBhp0","2ZHdkxciqp","C2Ircs4786","0MR5XKZamH",
+"K4GS8uJScX","2TRI7lsQGo","piJSkTCgPp","xXTI4jzUqR","fqypyQbxXc","CdyBV16lHc","zbIYY07n1c","AkKTk16lHc","uLtKsIRh48","DQimpPOUYS",
+"S77LHQbxXc","FnPFBulk41","Chuy3Mkgy8","VIlwP618Di","HP433y94nw","2ZHdk4W0Tl","vkCHHtuDyS","XflUqaFFss","In3NSzQt6Q","taOXK0Kyfs",
+"v2eC3Q6hMC","o8UydbZLvS","VjCZqdhSuH","VIlwPPOUYS","JXljW8cVD3","29QAzfaHir","mX2GEdjsrv","y94nw8cVD3","Gv3FqG1RhS","0KyfscmXIX",
+"fmIK1P6bcg","HP433ReKEW","vOqCE4dEz6","tAOsrTwano","RpBQmi7WMQ","WaWsvSjskQ","AmdQdmX2GE","IBe8kFcWrW","8hJdtoQ87r","Waim6n8pJ9",
+"jtn0XXflUq","QbxXcStlDJ","JJs5mzQt6Q","XyPZNlkMUA","DG4sTEdBKc","9GXkXYOfrY","ulk41yEfy9","4W0Tls4786","MmKGJsoy9t","iwzGk0YAGH",
+"jS1ajVprf2","J2mQiRpBQm","GXdoH5ZaEz","fqypy8U2nU","FwEJzulk41","yToGWMGlTF","EdBKcQssNC","5iGN5yEfy9","okgRi3weIF","blLA9dQ586",
+"0MR5XeuZA5","nFqik1j5L8","0MR5XlweGy","Pb1paTXQ0Z","lm0pDYw2oU","jiVBPB3qem","xXTI4v1Hln","BbwgAv8yFN","PYBf4PYBf4","9iGoTFhtgl",
+"ulk41t59lR","WPmlxTa8f6","ogLgcuQIcz","S77LHlweGy","YOfrYUvlv4","AmdQdP6bcg","5IhmG0MR5X","7Ow5ClH1kt","JkzUn8RCUA","J2mQinlaBy",
+"aL6AJUlU3M","2ZHdkIBe8k","7X3uyCK5W7","zmLYDjeskS","618DiNxx9V","b29RJhE1Ql","lj07QpmeCd","ZuDtDjfREu","iKqhrlXFOB","tjQxshe9IA",
+"Cfgr31v5hH","HlUbFQYxC0","guMb8LewvM","pmeCd5Namm","DcpWByvOMI","2hEEUAOgEe","VerEAM3zXL","FVMxoCqqaD","AmdQdmz8gx","7fKYUgtCA5",
+"lXFOBHlUbF","ydG8UMmsIo","wDajXfcwDa","brhlQv1Hln","4W0TlzbIYY","sqVrffmIK1","he9IApv0i7","FxX9qChuy3","J2mQilpF6W","64s8NUlU3M",
+"P6bcg45cIH","mz8gxnFqik","7fsYMCdyBV","M6qcGNxx9V","ydG8UuoStw","45cIHuupzk","NhXduFPfSE","lH1ktjfREu","PYBf47Ow5C","tl72W0ao3l",
+"VjCZqO3iyQ","JKWYRzHF1q","580YDk85Ae","uZPqg8TxD7","9rlg94QMc9","rhl0JM6qcG","BFkb8UmaEv","gIYvEogLgc","FcWrWLbRTH","s478624ARF",
+"M3zXLIBe8k","M6qcGlViBv","dmoS7WDVWJ","FVMxoUl4a1","pWiOsi3pyd","Zv7z0Kr8ys","LewvMhSSvQ","pFrrlgf8rI","Pb1paJIqXi","D6rByBpYhV",
+"L7cGcdQ586","VLTy6oVQp6","0Wr5yChuy3","brhlQfmIK1","zHF1qgIYvE","RBhp09iGoT","0MR5XBpYhV","OUYuFogLgc","Nxx9VeuZA5","JKWYRHfyNQ",
+"MezSWzqH0W","n1pmOIn3NS","Kr8ysjfREu","yEfy9Ta8f6","OHaBz4dEz6","0ao3llweGy","wiHrZQ6Lix","RACujgdQsS","16lHcguMb8","O3iyQZzJHW",
+"lCMxyOUYuF","FcWrWPYBf4","ZJTXHzqH0W","S77LHuupzk","Waim6POUYS","KZamH5Namm","4dEz6hUTw7","8hJdtqaofN","ni2v1gtCA5","BpYhVs4786",
+"45cIHK20wK","MojnPCIShG","wiHrZ580YD","i7WMQC2Irc","Yf2EcDcpWB","lpF6Wd7vjM","pWiOsSmGzv","2NslmI7p2a","Ss0Zus7Mxk","zmLYDgf8rI",
+"yluBxNhXdu","24ARFDcpWB","5IhmGciuWz","vOqCEzQt6Q","aez9yDcpWB","ulk41uTacx","EOE1oNhXdu","iKqhr7Ow5C","euZA5IRh48","0BmCy5Namm",
+"JkzUnzz4ZU","ru4UGFjHXR","rhl0J7X3uy","D6rBy7ku1p","IRh48k85Ae","29QAzs93Ml","v1Hlnt98iW","djsrvQ6Lix","FnPFBTCgPp","RxrsmksJby",
+"v8yFNOz8yZ","16lHcYw2oU","cShY2rz7Ut","No0QblweGy","AIYUuKZamH","5VZjSi3pyd","6AFT0Twano","BFkb88FmFH","VjCZqJRJQB","W7cTs5ZaEz",
+"Yf2EchE1Ql","4dEz6Twano","GXdoHNhXdu","HzZT86AFT0","5ZaEzlsQGo","BGaQYVprf2","uZPqgqQxHP","7Ow5Ciqv4k","VNCPd45cIH","JKWYRHlUbF",
+"ciuWzWmadA","580YDydG8U","JRJQBulk41","RpBQmRBhp0","TXQ0ZDG4sT","OxWIHnFqik","aL6AJ7fKYU","nnP8oLewvM","KASQ8hE1Ql","GWqqXNhXdu",
+"NcICAFhtgl","cL0aEuN6r3","VLTy6Nxx9V","d85a9yofH3","ZJTXH580YD","wDajXUlU3M","StlDJlm0pD","gjUTuCIShG","lViBvChuy3","Q6hMCVLTy6",
+"uLtKs16lHc","EOE1oD6rBy","tl72WReKEW","euZA5C2Irc","xReec0h1b1","AmdQdYf2Ec","M6qcGhYBCK","O3iyQFcWrW","FLsphs4786","lpF6WuTacx",
+"hUTw7Ul4a1","jeskS4QMc9","zmLYDCK5W7","xciqpCxVEf","qaofNzFgtB","tvdkDnFqik","a00b5t98iW","Dz1R3i7WMQ","t59lRh1zcH","VerEAhE1Ql",
+"tlILtJKWYR","l83UdlCMxy","mz8gx16lHc","v2eC3JRJQB","yofH3Uvlv4","J2mQi4QMc9","UmaEvhUTw7","K20wKyofH3","FhtglQClRL","DQimpcL0aE",
+"Cfgr3v1Hln","CIShGYh1hF","5drc6ECMvU","Yh1hF16lHc","Uvlv4dmoS7","VIlwPCK5W7","oVQp6AOgEe","rz7UtoVQp6","t59lRpvgjS","5nmWvHP433",
+"Chuy3RpBQm","Kr8ysRsQUq","WmadAblLA9","uQIczdjsrv","kZANmSmGzv","JIqXim4bxU","7X3uycL0aE","5Drn0VLTy6","C2IrcSjskQ","2hEEU3otm6",
+"0h1b1o8Uyd","ZzJHWPYBf4","uvf7AIRh48","7ku1pPYBf4","J2mQiKZamH","JIqXiMkgy8","GWqqXDcpWB","t59lRyvOMI","HfyNQFnPFB","h1zcHXflUq",
+"3otm6ZJTXH","VerEAQClRL","uQIcz29QAz","0Wr5yb29RJ","MaJQssoy9t","hE1Ql7hyVv","KZamHNhXdu","618Dim4bxU","EoToPAXpwE","MojnPWDVWJ",
+"ciuWzMm8si","qQxHP48cHL","e6e4zqUJMd","ru4UGfqypy","o8Uyd64s8N","ulk41xciqp","oVQp6F6PT2","uLtKsOHaBz","9XyT9LbRTH","EdBKcCxVEf",
+"Yf2EcStlDJ","14FLRQnJ1S","s7MxkpWiOs","bgJAzlH1kt","ZUnqtlweGy","MmKGJChuy3","FPfSEjS1aj","Pb1pa9rlg9","FnPFBuoStw","GWqqXVLTy6",
+"FhtglbZLvS","uvf7ASjskQ","C2IrchYBCK","v1HlnVjCZq","bgJAzFnPFB","hUTw7cmXIX","brhlQQ6Lix","UmaEvpv0i7","QbxXcYOfrY","d85a9lsQGo",
+"jeskS5ZaEz","FVMxoFFDui","L7cGcWreyP","P6bcgcmXIX","Zv7z07ku1p","KASQ8DLhzM","MojnP2TRI7","ydG8Uaez9y","Oz8yZMezSW","LbRTHJIqXi",
+"uPX7G0h1b1","gtCA50Kyfs","blLA9GWqqX","9y4lwOUqFM","l83UdfcJOy","zY1GYNOHsz","TXQ0ZDz1R3","CdyBVSs0Zu","QClRLfmIK1","uZPqglsQGo",
+"PYBf41v5hH","5iGN5ZhwG1","7X3uyMGlTF","SmGzvgf8rI","jeskSWmadA","gtCA5t59lR","gdQsSbrhlQ","lH1ktStlDJ","rKDLJRsQUq","bgJAzJIqXi",
+"IjTwPZ4I1v","MojnPS77LH","J2mQiUvlv4","bgJAzUvlv4","zY1GYbrhlQ","2DREsOxWIH","DLhzMpFrrl","cShY2v2eC3","JKWYRAmdQd","vkCHHl83Ud",
+"QworuTCgPp","KASQ8aDGtS","ZJTXHBGaQY","5drc6cShY2","Ss0ZuydG8U","FwEJzzbIYY","pmeCdlpF6W","GWqqX0h1b1","tjQxsdpe1v","wDajX29QAz",
+"OxWIHFhtgl","KASQ8HRxd8","1LB1Ljtn0X","RkQkes93Ml","lweGyGrDg7","Twanom4bxU","WDVWJB3qem","uvf7AwDajX","sx5GlFPfSE","5Drn0qQxHP",
+"hSSvQuPX7G","pvgjSgjUTu","lH1ktY1mC0","6q6L97fKYU","pvgjSgtCA5","azIWplm0pD","0BmCySbRYy","v2eC3SWfou","aez9yrKDLJ","KZamHzFgtB",
+"EoToPh1zcH","uPX7GaFFss","1LB1LQClRL","n8pJ9bgJAz","LbRTHrhl0J","RxrsmwDajX","uPX7GjfREu","lH1ktWreyP","mX2GE29QAz","NhXduQYxC0",
+"3weIF8xEKz","v8yFNaez9y","cL0aEKASQ8","9eoRcSbRYy","OHaBzeuZA5","8FmFHSbRYy","pmeCdl83Ud","SWfouJRJQB","i7WMQnFqik","VNCPdEoToP",
+"zHF1qfqypy","K4GS8JkzUn","8xEKzxReec","oVQp6zbIYY","qaofNlXFOB","zbIYYZJTXH","ReKEWnnP8o","24ARF1j5L8","ZuDtDxXTI4","IRh48d85a9",
+"DG4sThSSvQ","OHaBzguMb8","uupzkrhl0J","aDGtS5VZjS","J2mQiL7cGc","MojnP5Drn0","B3qem5iGN5","F6PT2uZPqg","CIShGk85Ae","5nmWvBGaQY",
+"5IhmGxciqp","FhtgltvdkD","Chuy30h1b1","xXTI4Vprf2","2hEEUaFFss","lm0pDGXdoH","C2IrcPOUYS","ksJby2hEEU","QWxoTHfyNQ","ReKEWjfREu",
+"FhtglYjB9t","EoToP5IhmG","UmaEvMkgy8","9iGoToVQp6","RkQkelpF6W","P6bcgKZamH","LewvMa00b5","sqVrfO3iyQ","FnPFBNOHsz","YOfrYCdyBV",
+"rhl0JRmDcr","UlU3MuJScX","qaofNrKDLJ","jS1ajhUTw7","14FLRiKqhr","aez9yCNHmv","rz7UtBbwgA","7Ow5CJ2mQi","tuDySJJs5m","Ss0ZuHP433",
+"uvf7AyvOMI","uPX7GRBhp0","Pb1paAkKTk","pFrrllweGy","GXdoH4W0Tl","3otm6Q6Lix","7fsYMYjB9t","lkMUAn8pJ9","BCxeCvOqCE","FVMxopmeCd",
+"JRJQBzHF1q","AgJHQksJby","JRJQBiKqhr","GXdoHJJs5m","0BmCybgJAz","sx5GldmoS7","jS1aj7ku1p","24ARF7hyVv","lm0pDpmeCd","48cHLIBe8k",
+"MmKGJs93Ml","BpYhVuZPqg","aFFsstAOsr","AOgEeKZamH","l83UdydG8U","YjB9tAXpwE","Cp3mZRpBQm","GSQwjtuDyS","oGu6xUlU3M","Cp3mZdpe1v",
+"QbxXcP6bcg","oGu6xVIlwP","jiVBPMmsIo","S77LHIBe8k","xReeciB08l","okgRi0Wr5y","S77LHoGu6x","hYBCKKsjRK","BFkb8ni2v1","8TxD7PYBf4",
+"aFFss0h1b1","O3iyQksJby","QClRLTXQ0Z","8TxD7IKxdL","VjCZqxXTI4","GXdoHi3pyd","9rlg9lViBv","StlDJVBjhz","rKDLJnlaBy","blLA9QnJ1S",
+"C2IrcAgJHQ","QworuYw2oU","JkzUnKZamH","iB08l5VZjS","djsrvdpe1v","M6qcG7fKYU","hUTw7y94nw","pvgjSL7cGc","WaWsvEoToP","LbRTHd85a9",
+"lkMUApWiOs","ZUnqtUmaEv","YjB9td85a9","RxrsmDcpWB","BpYhV5drc6","uZPqgwiHrZ","HRxd8hYBCK","VjCZqGSQwj","1LB1L7fsYM","2DREsPYBf4",
+"WmadAk85Ae","9XyT9BbwgA","AOgEeblLA9","7fsYMs7Mxk","5VZjSNcICA","fcwDa8hJdt","ZzJHWksJby","pWiOs8cVD3","QYxC0uPX7G","8U2nU0h1b1",
+"iwzGkvLsmS","5Drn0d85a9","euZA5MmKGJ","sx5GluAWyp","MmKGJPb1pa","TCgPp2Nslm","dhSuHNhXdu","zz4ZUIRh48","ulk41k85Ae","Kr8ysuQIcz",
+"CIShGS2Dfu","5drc6OHaBz","HP433mz8gx","SbRYyjS1aj","WDVWJFxX9q","ulk416q6L9","BpYhVJXljW","Kr8ysJKWYR","FFDui5iGN5","9rlg9UmaEv",
+"64s8Natef2","Yw2oUOxWIH","ulk4129QAz","B3qemOxWIH","FhtglQChxs","NOHsz7hyVv","7ku1psx5Gl","SjskQzY1GY","cShY2Ul4a1","Mkgy8ZhwG1",
+"vkCHHrhl0J","ThjNnRpBQm","5VZjSMmsIo","24ARFyluBx","2ZHdkPYBf4","Z4I1v0YAGH","5Namm2hEEU","9GXkX6q6L9","2hEEUokgRi","zqH0W9eoRc",
+"fLNg88U2nU","4dEz6i7WMQ","Oz8yZ5Mg9r","4W0TlcShY2","W7cTsZhwG1","1j5L8mz8gx","K20wKnlaBy","9XyT9CNHmv","WMiS3FVMxo","aFFss7lUXZ",
+"Dz1R3Gv3Fq","lweGyt98iW","l83UdJRJQB","J2mQijSjS3","GXdoHOHaBz","okgRia00b5","ru4UGVjCZq","kZANmv8yFN","uPX7G5Namm","YjB9tFcWrW",
+"0MR5XfmIK1","okgRi1j5L8","pT8wuFPfSE","MezSWl83Ud","nlaByuupzk","fcwDanFqik","JKWYRThjNn","0Wr5yQ6hMC","lViBvQClRL","jiVBPiwzGk",
+"8hJdtn1pmO","BGaQYcmXIX","Zv7z0iB08l","I7p2aDG4sT","618Dilm0pD","fFDrJWMiS3","BpYhV1v5hH","9XyT9yEfy9","yvOMIfcwDa","Y1mC0FxX9q",
+"6q6L9fcwDa","uZPqg9iGoT","k85AeQworu","In3NS16lHc","suY4xQ6Lix","ciuWz5iGN5","ZhwG1i3pyd","Cp3mZ24ARF","UlU3MSWfou","jfREuAXpwE",
+"WPmlxjzUqR","zHF1qZ4I1v","WDVWJpFrrl","2TRI74dEz6","Q6LixSjskQ","zFgtBt98iW","pWiOsFhtgl","GWqqXCqqaD","QWxoTWPmlx","EdBKcRzaZA",
+"DG4sTU3yw5","8TxD75nmWv","7X3uy9XyT9","NcICAZUnqt","prNT65IhmG","aL6AJwiHrZ","X6PinP6bcg","In3NSWaim6","CNHmvF6PT2","Mkgy8vOqCE",
+"FVMxopiJSk","Ul4a19iGoT","BCxeCRBhp0","cShY22hEEU","yToGWyofH3","48cHL5VZjS","x3LDeDLhzM","euZA548cHL","uQIczEoToP","AXpwEuoStw",
+"ZhwG1bZLvS","xciqp2TRI7","0MR5XhE1Ql","2TRI7yvOMI","jfREuO3iyQ","tAOsr2TRI7","JRJQBOHaBz","M6qcGVLTy6","uPX7GP6bcg","KZamHhi5X7",
+"DQimpyToGW","M3zXLCIShG","FhtglTwano","ni2v1HlUbF","6q6L9GSQwj","s47866q6L9","dpe1vksJby","HzZT8OUYuF","RxrsmUl4a1","jS1ajHlUbF",
+"Zv7z0OxWIH","uoStwDz1R3","GSQwjDcpWB","GSQwjo8Uyd","OHaBzCdyBV","WMiS3jeskS","xXTI4VIlwP","ThjNnzqH0W","zY1GYW3VFH","No0QbC2Irc",
+"MGlTFiqv4k","hE1QllXFOB","2Yz7EVerEA","3otm68hJdt","ZhwG1m4bxU","5nmWvOUqFM","oVQp6v8yFN","m4bxUQ6hMC","U3yw51LB1L","taOXKFGzgp",
+"FGzgpYf2Ec","pWiOsDQimp","QworuuLtKs","IKxdLNo0Qb","2hEEUZ4I1v","yluBxdmoS7","HlUbFW7cTs","OUYuF4dEz6","7Ow5CRBhp0","dpe1vG1RhS",
+"29QAzuPX7G","gjUTufaHir","Cfgr39GXkX","NcICAY1mC0","JIqXixXTI4","16lHc5VZjS","iB08lWaWsv","HP433zQt6Q","VerEAhYBCK","jiVBP2Yz7E",
+"QbxXcThjNn","MezSWSs0Zu","v8yFN0ao3l","Dz1R3JRJQB","iwzGkCqqaD","aDGtSAkKTk","FhtglUl4a1","pT8wu9GXkX","RACujFLsph","xciqpzmLYD",
+"FjHXRiwzGk","zHF1qZhwG1","bgJAzHP433","fmIK1Fhtgl","t59lRLbRTH","FnPFB9y4lw","gIYvE2hEEU","MK07YF6PT2","Nxx9V14FLR","P6bcgL7cGc",
+"he9IAThjNn","8U2nUVprf2","M3zXLSjskQ","GrDg7ZUnqt","6q6L9kZANm","NOHszt98iW","7fsYMRsQUq","9XyT9AIYUu","618DiVerEA","FLsphKZamH",
+"Yw2oUhYBCK","0PktIlXFOB","SbRYyy94nw","VLTy6Q6Lix","JKWYRuN6r3","iKqhrmz8gx","9eoRcRxrsm","h1zcHFjHXR","blLA9bZLvS","FjHXR4W0Tl",
+"fmIK1OHaBz","AOgEeYf2Ec","S77LHlm0pD","AIYUu55rfB","Dz1R3d7vjM","Nxx9VM3zXL","uTacxlm0pD","FVMxoxXTI4","SjskQ580YD","tlILt8U2nU",
+"9XyT9D6rBy","CNHmvNOHsz","G1RhSyToGW","i7WMQDz1R3","Oz8yZDG4sT","uvf7AChuy3","ulk41FGzgp","8xEKzUl4a1","In3NSTa8f6","s7MxkF6PT2",
+"ZJTXHpFrrl","uPX7GzHF1q","FGzgppmeCd","WmadABFkb8","J2mQiBGaQY","jzUqRJkzUn","Q6hMCuupzk","9GXkXgtCA5","FPfSEfqypy","Chuy3Yw2oU",
+"07n1cix74r","NcICATCgPp","TwanoPb1pa","45cIHKsjRK","1v5hHhE1Ql","uAWypEOE1o","i3pydDG4sT","07n1cM3zXL","MmKGJJRJQB","IKxdL48cHL",
+"Ss0ZudQ586","brhlQqUJMd","RzaZAdhSuH","dpe1vKZamH","618DiRzaZA","O3iyQVLTy6","K20wKlweGy","lm0pDDLhzM","GrDg7JkzUn","jtn0XHP433",
+"xReecNAFuw","hYBCKzbIYY","zY1GYuQIcz","lsQGoRBhp0","ECMvUChuy3","MezSWyofH3","0Wr5yWPmlx","uAWypNhXdu","fcwDaSs0Zu","tuDySRACuj",
+"oQ87raFFss","WDVWJFhtgl","4W0Tlgf8rI","QbxXcRBhp0","YjB9tWmadA","16lHc8hJdt","ReKEWrKDLJ","FwEJzBFkb8","3otm6hE1Ql","I7p2aFFDui",
+"MmsIoRACuj","AmdQdMK07Y","vOqCEX6Pin","VjCZquAWyp","W7cTspv0i7","QClRLx3LDe","WaWsvpWiOs","jtn0XFFDui","GWqqXYf2Ec","CNHmv8hJdt",
+"yofH3Cp3mZ","EOE1oB3qem","ydG8UpWiOs","vLsmSy94nw","WreyPdQ586","cmXIXqUJMd","8RCUA64s8N","5VZjSFhtgl","t98iWqaofN","5ZaEzNhXdu",
+"8TxD7Cfgr3","4W0TlVLTy6","n8pJ9MezSW","YOfrY3otm6","45cIHMGlTF","lCMxy2DREs","fcJOyqUJMd","2ZHdkhUTw7","NhXduAgJHQ","MojnPC2Irc",
+"wDajXciuWz","yofH3n1pmO","7hyVvxciqp","JKWYRvLsmS","U3yw5djsrv","lweGy2ZHdk","jfREu9y4lw","HRxd8wDajX","QChxsBGaQY","HfyNQbgJAz",
+"FLsphAIYUu","9GXkXVNCPd","jiVBP9y4lw","8xEKz0YAGH","v1Hln8U2nU","K4GS80MR5X","i3pydzqH0W","StlDJQYxC0","kB5nPiB08l","gtCA5Kr8ys",
+"pv0i7YOfrY","aez9yqUJMd","7ku1pFcWrW","fcJOy618Di","8RCUAU3yw5","tl72W0MR5X","hUTw71j5L8","JkzUnFNYIM","a00b5Yh1hF","v8yFNjiVBP",
+"X6PinqaofN","WmadA1j5L8","AgJHQNxx9V","FnPFBM3zXL","QYxC0Ul4a1","sx5GluN6r3","nFqik5Namm","QYxC0J2mQi","NcICArKDLJ","ksJbyJRJQB",
+"B3qemX6Pin","cmXIXVerEA","QWxoTfcwDa","Cp3mZCxVEf","AgJHQFVMxo","QChxszFgtB","2hEEUYf2Ec","oVQp6W3VFH","5ZaEzhYBCK","8hJdtulk41",
+"Uvlv4LDk6f","i7WMQOxWIH","FxX9q4dEz6","XflUqCdyBV","7ku1p6AFT0","4dEz6jeskS","7fKYUDcpWB","bgJAzW3VFH","l83UdBCxeC","zQt6QAXpwE",
+"rKDLJHzZT8","Kr8yszHF1q","L7cGcStlDJ","uTacxzY1GY","TCgPpVerEA","Z4I1vtl72W","ix74rTa8f6","soy9t07n1c","9eoRcKsjRK","vkCHHyluBx",
+"7fKYUvOqCE","hE1Qli3pyd","EdBKcEoToP","MK07YCIShG","x3LDeQChxs","CK5W7n1pmO","8RCUAUlU3M","fcwDaUlU3M","dhSuHn8pJ9","iqv4kh1zcH",
+"MezSWAOgEe","hE1QlWmadA","CK5W72TRI7","lweGyZv7z0","fLNg8RkQke","0Wr5ySjskQ","lm0pDGrDg7","BFkb8C2Irc","cShY25Mg9r","0YAGHFcWrW",
+"zmLYD8FmFH","VerEADz1R3","lpF6WOUYuF","iKqhrCfgr3","Y1mC0Vprf2","ksJbyfcwDa","fmIK1k85Ae","7ku1plCMxy","BGaQYQbxXc","tvdkDfmIK1",
+"Zv7z0Cp3mZ","0h1b1gf8rI","FwEJzjeskS","CIShGi3pyd","SbRYy0BmCy","pWiOsQChxs","lj07QpAhR1","gf8rI0YAGH","5Drn0BFkb8","M3zXL1LB1L",
+"HzZT8blLA9","Dz1R30PktI","BpYhVuN6r3","7fKYUX6Pin","zbIYYyEfy9","RzaZAlH1kt","BCxeCKZamH","NcICAgtCA5","7X3uyix74r","K4GS8AXpwE",
+"ReKEWFwEJz","uAWypMkgy8","FVMxovkCHH","Q6hMCDG4sT","i7WMQwDajX","6q6L9DG4sT","NAFuwNxx9V","aL6AJZJTXH","6q6L9lsQGo","pFrrl4W0Tl",
+"MK07Yjtn0X","Zv7z0VerEA","FNYIMCp3mZ","d85a9HP433","F6PT2Y1mC0","uTacxx3LDe","Dz1R3s7Mxk","7hyVvJIqXi","Yw2oUxciqp","X6PinSmGzv",
+"HRxd8tuDyS","RkQkeVBjhz","5NammydG8U","guMb8Twano","I7p2aHlUbF","dQ586tAOsr","FxX9qTa8f6","M3zXLru4UG","dmoS7ulk41","lsQGoSWfou",
+"s4786No0Qb","TCgPp9y4lw","MGlTFlj07Q","n1pmOCdyBV","QChxsoGu6x","5Mg9rMm8si","yvOMIs93Ml","hSSvQ2TRI7","UlU3MYOfrY","atef2BbwgA",
+"CdyBVoGu6x","b29RJGXdoH","HzZT8zmLYD","lH1ktaDGtS","dpe1vZuDtD","3weIFSbRYy","48cHLbgJAz","RzaZAzHF1q","kZANmhi5X7","t59lRs93Ml",
+"MmsIoqQxHP","rz7Utaez9y","tvdkDMmKGJ","ogLgcjeskS","t59lRxXTI4","y94nwQYxC0","7fKYUmX2GE","KZamH1LB1L","JXljWlkMUA","AmdQdAgJHQ",
+"xXTI4euZA5","t59lR7Ow5C","ogLgcuTacx","yluBxCfgr3","SbRYyJJs5m","pv0i7OHaBz","ZUnqtqUJMd","lpF6WydG8U","DcpWBJIqXi","fqypyv2eC3",
+"dmoS7GrDg7","NcICAxReec","GrDg7OxWIH","tl72WFPfSE","BGaQYcL0aE","d7vjMxXTI4","SjskQK4GS8","jzUqRMaJQs","48cHLECMvU","piJSkRBhp0",
+"GSQwjhYBCK","KZamHqaofN","ECMvUdQ586","pAhR11j5L8","jS1ajMezSW","BFkb8QbxXc","wDajXsoy9t","07n1c8FmFH","FjHXRtjQxs","pFrrlaez9y",
+"kZANmMaJQs","uN6r3Kr8ys","IjTwPoGu6x","gdQsSTXQ0Z","uupzkHRxd8","nlaByokgRi","FNYIMv8yFN","EdBKcDQimp","0h1b1cQOnv","JXljWSs0Zu",
+"29QAzQbxXc","Cp3mZQnJ1S","EOE1oQssNC","Vprf2Gv3Fq","lpF6WqaofN","cmXIXMaJQs","MezSWdpe1v","ix74r24ARF","cmXIXzQt6Q","NAFuwcQOnv",
+"OxWIHfqypy","nlaBysuY4x","BGaQYzz4ZU","Vprf2vOqCE","8U2nUUmaEv","QWxoTQssNC","jS1ajVerEA","TwanoZUnqt","n1pmOTwano","he9IA4QMc9",
+"WaWsv8cVD3","XflUqeuZA5","Waim6Kr8ys","nnP8o48cHL","B3qemMaJQs","Chuy3Q6hMC","WreyPCp3mZ","5NammxReec","MaJQs8TxD7","2Yz7EvOqCE",
+"Vprf2OHaBz","CNHmvKZamH","RACujQworu","uTacxy94nw","29QAzJJs5m","ydG8UtjQxs","aFFsss4786","Yw2oUTCgPp","rKDLJd7vjM","cQOnv5ZaEz",
+"14FLRzY1GY","W3VFHprNT6","uLtKs5ZaEz","TwanoydG8U","EdBKcOxWIH","pFrrlCfgr3","TwanocShY2","0Wr5ytaOXK","tuDySU3yw5","Q6hMCHfyNQ",
+"brhlQ618Di","he9IA8cVD3","3otm6XflUq","nlaBy1LB1L","ix74roVQp6","2Yz7EJ2mQi","WMiS3s93Ml","yvOMIW3VFH","16lHc5iGN5","5ZaEzVNCPd",
+"Cfgr3lweGy","K4GS88FmFH","NOHsz5Namm","JIqXiI7p2a","SWfoulViBv","Q6hMCJ2mQi","K4GS8o8Uyd","zqH0WJ2mQi","HP433kZANm","2DREsDLhzM",
+"ru4UGRmDcr","prNT69iGoT","MojnPD6rBy","DQimppWiOs","WMiS3JKWYR","dhSuHEdBKc","soy9t29QAz","8U2nU8U2nU","Dz1R3uoStw","LewvM0ao3l",
+"L7cGcEOE1o","zqH0WyToGW","nlaByuAWyp","5iGN5pvgjS","MojnPQbxXc","Nxx9V9rlg9","4QMc9FFDui","IKxdLW7cTs","MmKGJ2Nslm","Ta8f6euZA5",
+"m4bxUDcpWB","WmadAVNCPd","prNT6AOgEe","IRh48NcICA","djsrvYOfrY","GSQwjOHaBz","HzZT8Gv3Fq","DLhzMm4bxU","QClRLksJby","gIYvElkMUA",
+"7fKYUCK5W7","S77LH2Yz7E","7fKYUsqVrf","BCxeC9y4lw","kZANm2DREs","MK07YdhSuH","7X3uyK4GS8","BGaQYQChxs","JJs5mv1Hln","vOqCEWDVWJ",
+"TCgPpStlDJ","8hJdtF6PT2","uupzkxciqp","QssNCFNYIM","D6rByG1RhS","uQIczhSSvQ","5Drn0Ss0Zu","VjCZquQIcz","NAFuwnnP8o","GWqqXcQOnv",
+"GSQwjIKxdL","GrDg75Namm","CdyBVkB5nP","djsrvFjHXR","HRxd8GSQwj","oGu6xs7Mxk","Yf2EcCp3mZ","mX2GExciqp","iwzGk5IhmG","RzaZAtlILt",
+"FGzgp5Mg9r","CdyBVv8yFN","FhtglFcWrW","KsjRKaDGtS","1j5L8uTacx","dmoS7JKWYR","C2IrcCxVEf","lkMUAt59lR","t59lR5Mg9r","Oz8yZ48cHL",
+"cL0aEEdBKc","uupzkzmLYD","uAWypogLgc","IBe8ko8Uyd","45cIH9XyT9","lCMxytuDyS","uvf7A5VZjS","CqqaDix74r","gdQsSJJs5m","vLsmS0Kyfs",
+"CK5W7VerEA","QnJ1SK20wK","FxX9qQssNC","ciuWzciuWz","YjB9tVIlwP","Zv7z0RmDcr","AIYUui7WMQ","n8pJ9zqH0W","NcICAuupzk","AkKTkd7vjM",
+"8cVD3zHF1q","WPmlxKr8ys","NOHsz48cHL","nnP8oFGzgp","t59lRJ2mQi","StlDJYOfrY","AmdQdBpYhV","o8UydHzZT8","zHF1qFVMxo","24ARFVNCPd",
+"POUYSMojnP","h1zcHG1RhS","iB08l7Ow5C","Ul4a1sx5Gl","CxVEfMezSW","0ao3lIRh48","45cIH0YAGH","RzaZAsx5Gl","EdBKc0PktI","m4bxUQClRL",
+"pmeCdyvOMI","oVQp6lXFOB","tl72WGXdoH","MmsIoxXTI4","Oz8yZoQ87r","64s8N3weIF","QClRLtuDyS","okgRifFDrJ","K20wKm4bxU","WPmlx3weIF",
+"BGaQYYw2oU","QnJ1SFGzgp","Ta8f6FLsph","TXQ0ZpAhR1","kZANm6AFT0","lCMxyC2Irc","FLsphogLgc","6AFT0hUTw7","MaJQszQt6Q","SbRYy2TRI7",
+"Mm8siVLTy6","Z4I1vnlaBy","5ZaEz0YAGH","POUYSFjHXR","MmsIo9XyT9","L7cGcs7Mxk","d7vjMoVQp6","rz7UtGSQwj","0YAGHNAFuw","8cVD3dhSuH",
+"i3pyd6AFT0","v8yFNNcICA","v1Hln6AFT0","he9IAZhwG1","xciqp64s8N","Ul4a1ZzJHW","taOXK9y4lw","LDk6fBpYhV","5nmWvfLNg8","Ss0ZuMGlTF",
+"cmXIXdQ586","48cHLMmsIo","8cVD3gdQsS","8xEKz9rlg9","t98iWHfyNQ","UlU3MRmDcr","AkKTk8cVD3","1v5hHlpF6W","RACujCqqaD","Kr8ysMaJQs",
+"W3VFH0Wr5y","hUTw77fsYM","jS1ajYh1hF","tAOsrBGaQY","LbRTHAIYUu","XyPZNjiVBP","QnJ1SvOqCE","JIqXiciuWz","DG4sTrz7Ut","pvgjSWPmlx",
+"Oz8yZkB5nP","jeskSMojnP","B3qem9y4lw","8RCUABCxeC","IRh48HP433","VjCZqlH1kt","t98iWa00b5","In3NSSmGzv","TwanoCfgr3","Q6LixIn3NS",
+"x3LDeSmGzv","AOgEeFcWrW","a00b5G1RhS","FxX9q0MR5X","bgJAzFcWrW","G1RhSiKqhr","vLsmSVerEA","0h1b1In3NS","uPX7G8cVD3","QbxXcrhl0J",
+"QbxXctaOXK","gtCA5M3zXL","EoToPb29RJ","uQIczGrDg7","QWxoTfFDrJ","7lUXZ9y4lw","SWfou7Ow5C","atef245cIH","HlUbFt98iW","7lUXZzHF1q",
+"HP4331v5hH","aL6AJuvf7A","WPmlxJ2mQi","FwEJzsoy9t","48cHLjtn0X","Kr8ysY1mC0","vOqCEECMvU","lsQGomz8gx","jeskSJ2mQi","14FLRlXFOB",
+"lkMUAb29RJ","JJs5m16lHc","lkMUAciuWz","IRh48uJScX","FLsphSs0Zu","JRJQBTCgPp","dQ586iqv4k","a00b5XyPZN","guMb8IKxdL","vLsmSQworu",
+"JRJQBUvlv4","rKDLJuJScX","8U2nUMezSW","AkKTknFqik","xXTI4SmGzv","yEfy9lViBv","16lHc24ARF","sqVrfWMiS3","vOqCENxx9V","hE1QlQChxs",
+"WaWsvbgJAz","QnJ1SReKEW","faHirVerEA","hYBCKdhSuH","pWiOsuoStw","FGzgp7hyVv","Ul4a1RkQke","TwanoLewvM","C2IrcWMiS3","Mm8sivkCHH",
+"HP433brhlQ","KsjRKdpe1v","WreyPFFDui","sx5GllsQGo","uN6r38FmFH","5VZjS5drc6","BGaQYJ2mQi","0BmCy8xEKz","QssNCrhl0J","yvOMI8U2nU",
+"Kr8ysGrDg7","dQ586uN6r3","IRh48ZJTXH","WmadAlH1kt","s93MlReKEW","POUYSFPfSE","tlILtuJScX","POUYSzQt6Q","KsjRKDQimp","Yf2Ecs4786",
+"AOgEeWPmlx","ZhwG1sx5Gl","In3NSLewvM","VjCZqMkgy8","F6PT2DLhzM","fcJOynlaBy","tvdkDJkzUn","t59lRFjHXR","0MR5XWmadA","Cfgr39iGoT",
+"Kr8ys2TRI7","MK07Y0Wr5y","WmadAgf8rI","fmIK19y4lw","FwEJzuZPqg","n8pJ9NAFuw","WPmlx64s8N","lH1ktUlU3M","DQimpzz4ZU","X6PindQ586",
+"J2mQidmoS7","VLTy645cIH","WaWsvNcICA","zHF1qCK5W7","RBhp00BmCy","h1zcHUmaEv","atef24QMc9","VLTy6a00b5","cShY2B3qem","qUJMdeuZA5",
+"Chuy3i7WMQ","VjCZqpAhR1","pT8wuRmDcr","v2eC3fcwDa","NAFuwRmDcr","0PktIhUTw7","P6bcgb29RJ","JkzUniqv4k","ZUnqt8RCUA","2hEEUuAWyp",
+"s4786GSQwj","X6Pin7fKYU","zqH0WlweGy","kB5nP618Di","HP433uoStw","BFkb8SWfou","WPmlxt59lR","s93Ml618Di","KZamHFNYIM","y94nwxciqp",
+"AkKTkTCgPp","h1zcHfLNg8","JIqXifcJOy","l83UdblLA9","16lHcUvlv4","ZUnqtfcJOy","okgRi45cIH","MmsIorhl0J","qUJMdVjCZq","MaJQshSSvQ",
+"tuDySBFkb8","LDk6fFPfSE","Y1mC0MGlTF","gdQsSd7vjM","sqVrf5IhmG","JJs5mFFDui","uN6r3rKDLJ","uTacxaL6AJ","Waim6WreyP","FFDuisx5Gl",
+"8cVD3QWxoT","tjQxsJkzUn","AIYUuAOgEe","Kr8ysyofH3","cmXIXMmsIo","0h1b1UmaEv","Cfgr3RpBQm","lXFOBXflUq","Zv7z0Twano","JXljWiwzGk",
+"EoToPrz7Ut","AOgEemX2GE","FhtglfLNg8","RpBQmHfyNQ","NhXdu8hJdt","lXFOBgtCA5","ZJTXHL7cGc","FcWrW7X3uy","SbRYyzY1GY","FVMxo4W0Tl",
+"QbxXcQWxoT","ni2v1ZUnqt","Ul4a1jeskS","jiVBPni2v1","SWfouuLtKs","B3qemSs0Zu","3otm6zz4ZU","lkMUAKASQ8","Yh1hFYOfrY","fqypyGXdoH",
+"Vprf2Qworu","WDVWJ2TRI7","azIWp2Nslm","Nxx9Vfqypy","No0QbbZLvS","8U2nUK20wK","O3iyQHRxd8","Yf2EcIKxdL","IBe8k14FLR","VjCZq0BmCy",
+"wiHrZyToGW","8xEKzcL0aE","soy9tiB08l","ZzJHWlkMUA","POUYSlsQGo","ix74rRpBQm","Uvlv4pFrrl","Mm8siM6qcG","jS1aja00b5","dhSuHSjskQ",
+"yluBx45cIH","RzaZAn1pmO","HfyNQpT8wu","RpBQm8U2nU","cL0aEZJTXH","n1pmOMGlTF","s4786NcICA","BCxeCFVMxo","fFDrJIRh48","FhtglBGaQY",
+"QClRLtlILt","zFgtBMojnP","xciqpa00b5","VLTy6dQ586","mX2GEFPfSE","oGu6xsx5Gl","lm0pDsuY4x","RsQUqFVMxo","0KyfsFPfSE","RzaZAiKqhr",
+"7lUXZNcICA","QChxsOHaBz","Cp3mZydG8U","oVQp6l83Ud","tlILt9rlg9","nnP8o1v5hH","y94nwVNCPd","1j5L8vkCHH","VBjhzYh1hF","DQimpzQt6Q",
+"t98iWoGu6x","pAhR1NAFuw","MezSWCdyBV","taOXKGWqqX","AgJHQpmeCd","MK07YpmeCd","gjUTuqUJMd","BpYhVyluBx","WaWsvd7vjM","rhl0JaDGtS",
+"2hEEUulk41","lkMUA0Wr5y","MK07YRmDcr","8RCUAuTacx","9XyT97fsYM","fmIK1gjUTu","1LB1LWaWsv","QssNC2ZHdk","HzZT82hEEU","WPmlxaL6AJ",
+"VIlwPBpYhV","xXTI4fqypy","Dz1R3oVQp6","RsQUq5drc6","Waim6P6bcg","pWiOsfLNg8","zbIYYfaHir","K4GS8DcpWB","tjQxsjSjS3","i3pydXflUq",
+"FwEJzECMvU","8hJdtuoStw","EoToPWmadA","5IhmGcQOnv","7lUXZ1LB1L","wDajXt98iW","3otm6Ul4a1","FFDui48cHL","NAFuwazIWp","WreyPfFDrJ",
+"W3VFHZzJHW","fcwDaWmadA","7lUXZlpF6W","2NslmK4GS8","DcpWBRBhp0","B3qemQbxXc","jtn0XSWfou","iqv4kO3iyQ","TwanoVjCZq","4dEz6EdBKc",
+"uQIczHzZT8","tl72WZuDtD","W3VFHbrhlQ","Z4I1vrKDLJ","euZA5X6Pin","TXQ0ZNhXdu","Zv7z0qaofN","Uvlv4uQIcz","ZUnqtZUnqt","uN6r3QChxs",
+"tAOsr0h1b1","b29RJkB5nP","9iGoTmz8gx","NOHszuPX7G","lViBvuN6r3","uAWypgjUTu","8RCUAydG8U","OUYuF7X3uy","1v5hHYf2Ec","rKDLJG1RhS",
+"zY1GYm4bxU","lCMxy6q6L9","ydG8U5Drn0","yofH3cQOnv","IKxdLFNYIM","QworuvLsmS","aez9ydjsrv","h1zcHdhSuH","Q6hMCd7vjM","rhl0JqUJMd",
+"i3pyd0ao3l","AXpwEBFkb8","Ss0ZuhE1Ql","Q6LixBbwgA","29QAzuN6r3","ZuDtD5Mg9r","No0QbDz1R3","oGu6xpiJSk","HRxd8suY4x","StlDJ0MR5X",
+"FVMxocShY2","oVQp6QnJ1S","dmoS71LB1L","iqv4k4W0Tl","4QMc9OxWIH","xReec7lUXZ","uZPqg5ZaEz","SbRYyl83Ud","AmdQdQnJ1S","2ZHdk5drc6",
+"i3pydFwEJz","kB5nPMm8si","fmIK1kB5nP","BFkb8brhlQ","FGzgppWiOs","P6bcgIn3NS","9XyT9xReec","AXpwENhXdu","NhXdu6q6L9","5drc63weIF",
+"kZANmCNHmv","pmeCd0MR5X","yofH3uLtKs","uJScXlm0pD","NAFuw580YD","yToGWvOqCE","48cHL6AFT0","TXQ0ZW7cTs","5VZjSM3zXL","QbxXcuLtKs",
+"45cIHpAhR1","45cIHt98iW","taOXKbrhlQ","0Wr5yyofH3","ECMvUP6bcg","QssNCBpYhV","9y4lwbZLvS","Vprf2zQt6Q","RACujQnJ1S","FjHXRSmGzv",
+"rz7UtZ4I1v","Twano48cHL","GSQwja00b5","8FmFHVjCZq","i3pydrKDLJ","uJScXGWqqX","prNT6v8yFN","l83Ud6AFT0","ZhwG18hJdt","Vprf2iB08l",
+"Cp3mZs7Mxk","yluBxJXljW","VjCZq580YD","F6PT2AIYUu","3otm6P6bcg","BGaQY7hyVv","5VZjS6AFT0","Pb1paqQxHP","Oz8yZStlDJ","5drc6FVMxo",
+"Y1mC0pmeCd","jzUqRGXdoH","blLA9yofH3","lj07QDz1R3","AOgEe2Yz7E","Vprf22DREs","D6rByni2v1","WmadAFPfSE","tlILtAIYUu","IBe8k7Ow5C",
+"IjTwPOz8yZ","7lUXZAmdQd","YOfrYiB08l","HlUbFsx5Gl","jfREuStlDJ","hYBCK9eoRc","lweGyjSjS3","sx5GlPOUYS","VIlwPZhwG1","Kr8ys5Mg9r",
+"h1zcHe6e4z","StlDJDQimp","iKqhrVjCZq","tuDySM6qcG","SbRYygdQsS","qaofNfFDrJ","jfREuMojnP","WDVWJtl72W","azIWpvLsmS","DLhzMhSSvQ",
+"lViBv6AFT0","0Kyfsgf8rI","AgJHQZJTXH","ru4UGjSjS3","suY4x0Wr5y","gIYvEDz1R3","lXFOBFVMxo","0MR5XzFgtB","lXFOBzz4ZU","MezSW5drc6",
+"5Mg9rfqypy","wiHrZlXFOB","hUTw7VjCZq","d7vjMoQ87r","7hyVvlkMUA","wiHrZOz8yZ","kB5nPuPX7G","F6PT29iGoT","sqVrfGXdoH","rz7Utuupzk",
+"ECMvUZhwG1","M6qcGn1pmO","sqVrf7hyVv","5Mg9rfFDrJ","nlaByDQimp","SbRYyLbRTH","Zv7z0POUYS","MojnPZv7z0","xReecJ2mQi","pv0i75nmWv",
+"QssNCVBjhz","POUYSsx5Gl","Ss0ZuuoStw","cQOnvHP433","Q6hMCL7cGc","9iGoTpFrrl","h1zcHMezSW","CIShGzqH0W","618Di2Yz7E","n1pmOZhwG1",
+"F6PT2Rxrsm","1v5hHZuDtD","07n1cIKxdL","ulk41Q6Lix","WDVWJK4GS8","M3zXLRkQke","hi5X7ksJby","24ARF0MR5X","POUYSQWxoT","dpe1vJIqXi",
+"5drc6uoStw","OUYuFrhl0J","GWqqX5Drn0","d85a90Kyfs","tl72WSjskQ","zmLYD2Nslm","CqqaDJ2mQi","QYxC0Dz1R3","9XyT9ZUnqt","FjHXRn8pJ9",
+"2Yz7EK4GS8","NOHszWaWsv","zz4ZUQ6hMC","8FmFHm4bxU","Oz8yZbZLvS","dQ586LDk6f","gdQsSuZPqg","QssNC6AFT0","QnJ1S0BmCy","Mkgy8Twano",
+"v2eC3FcWrW","ksJby4W0Tl","uoStwfcJOy","8TxD7NOHsz","1LB1L24ARF","aez9yMK07Y","K4GS8v1Hln","JJs5m8RCUA","oQ87rVLTy6","LewvMG1RhS",
+"9iGoTjfREu","b29RJFNYIM","DQimp0MR5X","fmIK1CxVEf","8xEKzcQOnv","uAWypyofH3","nFqikwDajX","n1pmOVNCPd","FFDui0Wr5y","0MR5XS77LH",
+"ogLgcOUYuF","pFrrlaDGtS","ni2v1wiHrZ","ni2v1HRxd8","7fsYMOUYuF","XflUqK4GS8","iB08lcmXIX","nFqikpAhR1","XyPZNFGzgp","d85a99iGoT",
+"5Drn0dQ586","XyPZN0h1b1","t59lRJJs5m","9iGoTmX2GE","1j5L8XflUq","BGaQYuQIcz","M6qcGhUTw7","bgJAzMaJQs","7Ow5C5Drn0","BFkb8GrDg7",
+"xciqpMGlTF","BFkb8Kr8ys","LDk6fSs0Zu","GXdoHi7WMQ","5Drn0zqH0W","iKqhrG1RhS","16lHcaL6AJ","G1RhSThjNn","7fKYUuZPqg","zQt6QEoToP",
+"BGaQYHfyNQ","tlILtFcWrW","HfyNQrz7Ut","FwEJzt59lR","Q6hMCpFrrl","Ul4a1euZA5","h1zcHVBjhz","uoStwVjCZq","5iGN56AFT0","RmDcrtaOXK",
+"S77LH8U2nU","hYBCKuvf7A","Kr8yss93Ml","9XyT9AmdQd","Z4I1v4dEz6","QClRLk85Ae","Mkgy8zz4ZU","64s8N2Nslm","6AFT0lsQGo","soy9tCp3mZ",
+"atef2WMiS3","tlILtcShY2","0h1b13otm6","wiHrZJkzUn","vkCHHlViBv","4W0TlFNYIM","lsQGouQIcz","MGlTFni2v1","KASQ8UmaEv","FPfSEFcWrW",
+"618DizFgtB","euZA5xXTI4","07n1cGSQwj","HRxd8C2Irc","FcWrW7hyVv","7fsYMZzJHW","P6bcguQIcz","uTacx5nmWv","8xEKzjSjS3","l83Ud24ARF",
+"U3yw5W3VFH","tjQxsQYxC0","NhXdu5drc6","5IhmGyToGW","xReecaDGtS","AkKTkWMiS3","ciuWzuAWyp","GSQwjcQOnv","AXpwEyvOMI","ogLgcyofH3",
+"2ZHdkZJTXH","gdQsSZ4I1v","fqypyhi5X7","iqv4kQnJ1S","K4GS8JKWYR","2Yz7EFxX9q","ni2v1uPX7G","v2eC3JkzUn","jS1ajRpBQm","CdyBVFnPFB",
+"cShY2zz4ZU","TCgPpgtCA5","mX2GEtl72W","DG4sTsoy9t","AXpwE8FmFH","Mm8sigjUTu","P6bcgHzZT8","SWfou5Drn0","FVMxoxciqp","StlDJ9y4lw",
+"ydG8UgdQsS","ThjNnciuWz","RpBQmI7p2a","UlU3MPYBf4","OUYuFBbwgA","rz7UtKsjRK","7ku1p1v5hH","xReecyluBx","AkKTkSs0Zu","I7p2aOUYuF",
+"24ARFlj07Q","hYBCKSmGzv","tAOsrVLTy6","JJs5mMkgy8","C2IrcReKEW","MK07YiB08l","DQimpCIShG","lXFOBNxx9V","HfyNQFVMxo","k85AecQOnv",
+"lm0pDIjTwP","aez9y16lHc","EOE1oiB08l","y94nwS2Dfu","vkCHHB3qem","pWiOsWaim6","55rfBFxX9q","5Mg9rpv0i7","Z4I1vuPX7G","ZhwG1pT8wu",
+"9XyT97hyVv","okgRiGXdoH","gjUTuuAWyp","24ARFnnP8o","djsrvU3yw5","DLhzMd85a9","HzZT8he9IA","5nmWvCfgr3","i7WMQfqypy","aFFssEOE1o",
+"fFDrJVBjhz","3weIFIKxdL","t98iWVNCPd","BbwgASmGzv","EdBKcFcWrW","uupzkGv3Fq","RpBQmMmKGJ","Q6hMCoGu6x","piJSkDG4sT","GWqqXzY1GY",
+"JkzUnuQIcz","X6Pinulk41","ydG8U7fKYU","9GXkXRkQke","uoStwVLTy6","ru4UGru4UG","2TRI7prNT6","pmeCdh1zcH","Qworu8xEKz","FVMxol83Ud",
+"uZPqgIKxdL","uQIczxXTI4","8hJdtiqv4k","5IhmGNOHsz","FwEJzSjskQ","lm0pDjtn0X","7fKYUzHF1q","yEfy9v2eC3","2TRI7fFDrJ","BFkb8LDk6f",
+"7lUXZd85a9","CNHmvoGu6x","WDVWJzqH0W","lm0pDFhtgl","QssNCh1zcH","bZLvS48cHL","lCMxynFqik","Nxx9V8RCUA","lH1ktGWqqX","uN6r3Qworu",
+"mz8gxydG8U","K20wKCfgr3","C2IrcIBe8k","uoStwgdQsS","RACujtvdkD","4QMc9tuDyS","i3pydRzaZA","CK5W7QClRL","FwEJzydG8U","16lHcZJTXH",
+"yluBxGrDg7","iKqhr2Nslm","QssNCv2eC3","cShY2pT8wu","QClRLzbIYY","yofH3S77LH","zz4ZUgdQsS","zmLYDBGaQY","W3VFHfqypy","gtCA5WDVWJ",
+"GXdoHYw2oU","euZA5s7Mxk","NAFuwzqH0W","mX2GECK5W7","bZLvSrKDLJ","Rxrsmhi5X7","Q6hMCuN6r3","b29RJZv7z0","uvf7ATXQ0Z","SjskQxciqp",
+"O3iyQDG4sT","QssNC14FLR","nFqikFwEJz","M3zXLlH1kt","5ZaEzy94nw","ni2v1aL6AJ","LDk6fNcICA","hE1QlgtCA5","RpBQmYh1hF","3otm6qQxHP",
+"ZuDtD9GXkX","tAOsr55rfB","7Ow5Ci3pyd","8xEKzv1Hln","618DijSjS3","lweGyRpBQm","5IhmGP6bcg","7fsYM3otm6","AmdQd6AFT0","DcpWBXflUq",
+"pvgjSZzJHW","D6rByd7vjM","qaofNPYBf4","uQIczEdBKc","OUqFMogLgc","AOgEe0PktI","tAOsrFVMxo","14FLRi7WMQ","lm0pDhYBCK","fmIK1aFFss",
+"7fsYMprNT6","07n1cYh1hF","BFkb8JIqXi","iqv4kwDajX","pFrrl3otm6","SbRYyPb1pa","t59lRJKWYR","rhl0JbrhlQ","e6e4z16lHc","tl72WsuY4x",
+"zY1GYyvOMI","48cHLGSQwj","Yh1hFIKxdL","xXTI4rKDLJ","DLhzMF6PT2","WmadAiqv4k","L7cGcuoStw","CdyBVIBe8k","TXQ0Z0Wr5y","KASQ8Dz1R3",
+"LbRTHlweGy","VNCPd618Di","HRxd8ZhwG1","NhXduyToGW","U3yw55nmWv","Cp3mZlXFOB","jtn0XStlDJ","CdyBVQbxXc","y94nwpWiOs","kB5nPprNT6",
+"M6qcGatef2","EOE1oatef2","v2eC32Yz7E","uAWyp9y4lw","2Nslm8TxD7","lweGyd7vjM","WmadARzaZA","BFkb8TCgPp","Ta8f6VIlwP","9rlg9t98iW",
+"HlUbFNcICA","Vprf2618Di","CIShGciuWz","JXljWxReec","okgRiwDajX","F6PT2lH1kt","fcJOyYh1hF","uQIczLewvM","CNHmvCqqaD","uN6r3s93Ml",
+"rhl0J55rfB","GWqqXJkzUn","y94nw7hyVv","7Ow5CIn3NS","VIlwPVjCZq","SbRYyD6rBy","hUTw7t59lR","iqv4kTwano","BpYhVzHF1q","bZLvSO3iyQ",
+"SmGzvt59lR","uAWyplj07Q","WmadAAIYUu","a00b5jeskS","Mkgy8GXdoH","oVQp6sqVrf","AIYUutvdkD","SbRYy8TxD7","9GXkX3otm6","ni2v1HzZT8",
+"lkMUASs0Zu","CK5W78FmFH","QClRLxciqp","hYBCKpiJSk","QClRLuJScX","FxX9qJJs5m","OUYuFpWiOs","0BmCy580YD","JXljWLewvM","RmDcrPb1pa",
+"fFDrJazIWp","XyPZNLbRTH","FwEJzZuDtD","uTacxhE1Ql","HP433cmXIX","JkzUnJkzUn","tvdkD1LB1L","FNYIMblLA9","a00b51v5hH","VBjhzbZLvS",
+"ZhwG1K20wK","piJSkJIqXi","atef2iwzGk","xciqp4QMc9","MezSWWPmlx","tAOsr2DREs","8RCUAuoStw","djsrvtl72W","zz4ZUFxX9q","KsjRKfFDrJ",
+"mz8gxZJTXH","8xEKzfcwDa","fcwDaBGaQY","TXQ0ZUlU3M","zY1GYuJScX","fqypygf8rI","8xEKz14FLR","d7vjMiwzGk","DLhzMMGlTF","lXFOBsoy9t",
+"7Ow5CqQxHP","F6PT26q6L9","e6e4zo8Uyd","yEfy99eoRc","uN6r3QClRL","v1HlndmoS7","iqv4kJRJQB","Cp3mZWreyP","rz7Ut1j5L8","MaJQs64s8N",
+"uupzkZUnqt","ydG8U2Nslm","lXFOBNAFuw","TXQ0ZRsQUq","jS1ajnFqik","9eoRcyToGW","vLsmS8TxD7","07n1cqUJMd","9y4lwWaim6","29QAz5Mg9r",
+"Yw2oUJRJQB","oQ87rVjCZq","tuDyS8RCUA","xciqpo8Uyd","XyPZNVNCPd","ZzJHWMojnP","ZUnqtUlU3M","CIShG6q6L9","pFrrld85a9","a00b5jSjS3",
+"9GXkXrhl0J","wiHrZfFDrJ","5Drn0IBe8k","he9IAVIlwP","AkKTkMm8si","VIlwPBbwgA","S2Dfu9eoRc","aL6AJuLtKs","uTacxFNYIM","x3LDeni2v1",
+"Vprf2Ta8f6","UmaEvL7cGc","QChxsyluBx","hSSvQdmoS7","8hJdtt98iW","S77LHOUYuF","JRJQB0BmCy","MGlTFVLTy6","MmKGJDLhzM","d85a9gjUTu",
+"5Drn0P6bcg","sx5Glmz8gx","6q6L9zmLYD","Kr8ysOUqFM","FFDuiFFDui","uoStwVBjhz","LDk6fix74r","2Nslm14FLR","zqH0Wx3LDe","VjCZqfmIK1",
+"MaJQsSs0Zu","CNHmvix74r","Ta8f6RzaZA","BbwgA8xEKz","jtn0XuZPqg","NhXdufqypy","IKxdLaDGtS","5drc6GSQwj","OxWIHuupzk","Cp3mZhYBCK",
+"0KyfsWreyP","ZzJHWuZPqg","pv0i7xciqp","Q6LixtvdkD","Ul4a1x3LDe","uAWyp9GXkX","fqypyUmaEv","LDk6fwDajX","D6rBy618Di","RzaZACp3mZ",
+"IRh48OxWIH","wiHrZiKqhr","euZA52Yz7E","5ZaEzQnJ1S","cL0aE7hyVv","aL6AJRACuj","taOXKDcpWB","2hEEUZzJHW","aFFssM3zXL","VBjhz580YD",
+"pFrrlyToGW","J2mQiuupzk","pT8wuAgJHQ","uoStwhe9IA","EoToPguMb8","CqqaDpvgjS","VjCZqulk41","CNHmvfmIK1","AXpwEfaHir","ZzJHWOz8yZ",
+"BCxeC3weIF","sx5Gl9GXkX","Vprf2TXQ0Z","FwEJztlILt","Q6hMCSjskQ","VLTy6BpYhV","9rlg9BbwgA","PYBf4zz4ZU","zHF1q2Yz7E","kZANmuPX7G",
+"xciqpix74r","y94nwPYBf4","7lUXZLewvM","bgJAz45cIH","s7MxkhYBCK","jS1ajgjUTu","oGu6xNcICA","vLsmSpiJSk","lViBvCfgr3","blLA91LB1L",
+"yToGWgf8rI","CIShGhE1Ql","GSQwjCxVEf","0h1b1OxWIH","bZLvSTXQ0Z","ThjNn7ku1p","AOgEe3weIF","v8yFN8TxD7","QssNCRkQke","tvdkDuupzk",
+"yofH3TXQ0Z","vkCHH0ao3l","lsQGoBCxeC","AmdQdTwano","jSjS3W3VFH","OxWIHY1mC0","7fsYMfaHir","jfREuv1Hln","SjskQPOUYS","jtn0XyEfy9",
+"RpBQmBGaQY","uupzk5drc6","ReKEWhYBCK","RpBQmGWqqX","prNT6sqVrf","D6rBy8TxD7","tuDySTXQ0Z","0PktIaDGtS","4W0TljS1aj","lCMxytlILt",
+"55rfBWDVWJ","pAhR1XyPZN","2Yz7ErKDLJ","BGaQY4dEz6","OUqFMaFFss","ReKEWCNHmv","8xEKz16lHc","tlILtGWqqX","bZLvS7hyVv","UmaEvFGzgp",
+"EdBKciqv4k","l83Udd7vjM","CqqaDydG8U","0PktIQbxXc","W7cTs0ao3l","StlDJtvdkD","WaWsv0Kyfs","C2IrcIjTwP","hUTw7Ta8f6","MmsIolXFOB",
+"XyPZNDcpWB","2Yz7EtAOsr","7X3uysx5Gl","RACujO3iyQ","hYBCK6AFT0","m4bxUlm0pD","RxrsmnlaBy","jSjS3MaJQs","v8yFNHzZT8","J2mQiVLTy6",
+"BbwgAZuDtD","IjTwPpAhR1","Chuy3v2eC3","ZJTXHOHaBz","fLNg8tl72W","5ZaEzQbxXc","JIqXiWPmlx","gdQsSpAhR1","Uvlv4W7cTs","NAFuwtAOsr",
+"QWxoTPOUYS","uQIczDz1R3","DLhzMIjTwP","taOXKQworu","fcwDapv0i7","uupzkhi5X7","NOHszrKDLJ","RACujFnPFB","rKDLJAXpwE","hSSvQYjB9t",
+"azIWpSjskQ","ulk41AXpwE","soy9t0BmCy","Yf2EcZJTXH","ReKEWP6bcg","JXljW5IhmG","GrDg7t59lR","fLNg8zQt6Q","0BmCynlaBy","SWfouFVMxo",
+"IRh48zFgtB","VerEAuAWyp","vLsmSK4GS8","J2mQirz7Ut","fLNg8ZzJHW","Yw2oULbRTH","OUYuFNhXdu","NhXduBGaQY","zmLYDtAOsr","uQIczlCMxy",
+"0BmCyNxx9V","1j5L8tjQxs","lsQGoAIYUu","pWiOsGrDg7","FFDuiGXdoH","UmaEvzFgtB","OHaBzLewvM","ReKEWgf8rI","Ul4a1IjTwP","5ZaEzfaHir",
+"O3iyQ3otm6","i3pyd5Namm","45cIHCK5W7","kZANm5iGN5","ZJTXHvOqCE","pWiOsI7p2a","2ZHdkfqypy","ReKEW8U2nU","X6PiniB08l","QYxC0QChxs",
+"rz7Utv8yFN","uAWypCxVEf","fmIK1lCMxy","iKqhr9y4lw","uvf7A0YAGH","zqH0WyofH3","KZamHU3yw5","KsjRKtAOsr","M6qcGHzZT8","hUTw7UmaEv",
+"CxVEfv1Hln","AOgEeS2Dfu","v8yFN7fsYM","580YDFVMxo","hi5X7ciuWz","nlaByJKWYR","Pb1paAOgEe","pWiOsjiVBP","ciuWz24ARF","lViBvRxrsm",
+"ZuDtDGrDg7","dmoS76AFT0","BbwgAjSjS3","qUJMdqQxHP","48cHLa00b5","pvgjSMGlTF","OHaBzb29RJ","SWfou0MR5X","XyPZN6q6L9","prNT6Ul4a1",
+"Dz1R3BCxeC","MK07YhE1Ql","Mkgy8RBhp0","Z4I1vpv0i7","8cVD3n8pJ9","DcpWB5Mg9r","EoToPQYxC0","tlILt64s8N","nFqikX6Pin","AOgEepvgjS",
+"7lUXZAIYUu","No0QbBCxeC","ThjNn29QAz","IjTwP6AFT0","aDGtSdQ586","FjHXRuZPqg","BGaQYhE1Ql","Yw2oUZJTXH","8cVD3i3pyd","uQIczB3qem",
+"Chuy3FNYIM","uoStwjeskS","FNYIMVBjhz","uN6r3gtCA5","soy9t0Kyfs","QWxoTReKEW","dpe1vtuDyS","zmLYDfLNg8","rhl0JWaWsv","NhXduVprf2",
+"3weIFMK07Y","Yf2Ecl83Ud","JkzUnRBhp0","VNCPdLDk6f","Mm8siPOUYS","oVQp65Namm","s47867fKYU","ECMvUa00b5","zHF1q24ARF","iqv4kYjB9t",
+"s478645cIH","Kr8ysUlU3M","JRJQBgjUTu","BFkb85Drn0","faHirtjQxs","zz4ZUVprf2","pFrrl2Nslm","Twanolm0pD","d7vjMU3yw5","HzZT8l83Ud",
+"yofH3LDk6f","MmsIoDz1R3","C2IrcpvgjS","VBjhzuAWyp","piJSkFnPFB","pT8wu7lUXZ","UlU3MRsQUq","cL0aE2DREs","QnJ1Srhl0J","Yh1hFL7cGc",
+"L7cGcWDVWJ","5Namm9iGoT","tAOsrn8pJ9","AgJHQ8cVD3","ni2v1Yf2Ec","blLA9gjUTu","BbwgA8FmFH","Cfgr3cmXIX","JkzUnuoStw","rhl0Js7Mxk",
+"55rfBnlaBy","hE1Ql8FmFH","iqv4kuAWyp","5drc6s4786","CxVEfNhXdu","zHF1qt98iW","hE1Qlrhl0J","lweGyM6qcG","tlILtKsjRK","lm0pD5iGN5",
+"v2eC3KASQ8","VNCPdoQ87r","O3iyQ580YD","OUqFMi3pyd","s4786cmXIX","U3yw5MezSW","pmeCdatef2","580YDokgRi","S77LHBpYhV","1LB1LvLsmS",
+"FjHXRcShY2","gjUTuuPX7G","xciqpJ2mQi","tAOsrFPfSE","Nxx9VChuy3","In3NSDG4sT","OUqFMD6rBy","5Drn07lUXZ","NOHszdjsrv","prNT6uAWyp",
+"qaofNdjsrv","5VZjSFxX9q","F6PT28U2nU","t59lRd85a9","FjHXR45cIH","tl72W8U2nU","dpe1vRmDcr","tlILtWDVWJ","brhlQtAOsr","Yh1hFCdyBV",
+"jeskSNxx9V","M6qcGKASQ8","5iGN5Y1mC0","o8Uyd8xEKz","XflUquTacx","BpYhVa00b5","0KyfsuJScX","hi5X7XflUq","ECMvUUlU3M","I7p2aFLsph",
+"Y1mC0QYxC0","kZANmlm0pD","RmDcrZJTXH","CxVEfb29RJ","RBhp0pmeCd","2hEEUxXTI4","he9IAuJScX","Qworus93Ml","CK5W7lsQGo","0MR5XiwzGk",
+"wiHrZNxx9V","t98iWRkQke","dQ586k85Ae","RACujRBhp0","uupzk6AFT0","HzZT807n1c","yvOMIWaWsv","s7MxkZzJHW","RACujdmoS7","AOgEeRsQUq",
+"POUYSoVQp6","07n1cS2Dfu","lpF6WhUTw7","Cfgr3VBjhz","OHaBzJkzUn","t98iWNcICA","64s8NtvdkD","0h1b18TxD7","X6PinuTacx","BbwgAfaHir",
+"Chuy3aL6AJ","HlUbFCK5W7","JkzUnCK5W7","Q6Lix0Wr5y","oVQp6FnPFB","ydG8UDz1R3","sqVrfjS1aj","VBjhzokgRi","dpe1v8hJdt","No0QbRkQke",
+"tuDyS2hEEU","RACujjtn0X","m4bxUulk41","jzUqRjzUqR","ZuDtDpvgjS","YOfrYCp3mZ","xReecFFDui","ogLgcaDGtS","W3VFHUlU3M","HRxd8oGu6x",
+"TwanoIjTwP","oGu6xRpBQm","yofH3Yf2Ec","U3yw5ru4UG","5IhmG580YD","Yh1hFcShY2","v2eC3aFFss","ksJby0MR5X","gf8rIGXdoH","ogLgcxReec",
+"euZA5FwEJz","lsQGoFnPFB","VIlwPWmadA","ReKEW7fKYU","BFkb8a00b5","6q6L9nlaBy","RsQUqlm0pD","ksJbyP6bcg","StlDJdhSuH","7fsYMhUTw7",
+"euZA5AmdQd","VjCZq618Di","gjUTulm0pD","ydG8UVNCPd","gjUTuPb1pa","BCxeCkB5nP","EOE1oyToGW","4W0TlWreyP","5Mg9rRACuj","0YAGHWaWsv",
+"EOE1oCp3mZ","1LB1LtuDyS","9rlg9qaofN","RsQUq618Di","zY1GYJRJQB","t59lRQWxoT","RsQUqRkQke","Ss0ZuCfgr3","AIYUuBpYhV","2hEEUJJs5m",
+"xciqpzbIYY","MmsIoJkzUn","RpBQmeuZA5","Yh1hFyluBx","YOfrYatef2","X6PinRzaZA","NAFuwTCgPp","fLNg85nmWv","GSQwjRkQke","7ku1pyvOMI",
+"14FLRJIqXi","4dEz6FPfSE","GWqqXVjCZq","Z4I1vTwano","Chuy3ZzJHW","AIYUu8cVD3","tjQxscmXIX","gjUTuWMiS3","StlDJNhXdu","iwzGkjtn0X",
+"Yh1hFThjNn","TCgPp580YD","SmGzvQ6hMC","JJs5mOUqFM","TCgPpKASQ8","FnPFB580YD","Mkgy8580YD","lH1kttaOXK","FLsphC2Irc","7ku1pNxx9V",
+"ulk412TRI7","jzUqRpvgjS","WmadAciuWz","fmIK1HlUbF","NhXdu9XyT9","MojnP0h1b1","QClRL0Wr5y","Y1mC05VZjS","ECMvUix74r","B3qemFhtgl",
+"oVQp6fFDrJ","RACujuvf7A","jtn0XaFFss","x3LDeFGzgp","wDajXZ4I1v","tuDySDG4sT","GSQwjQYxC0","AIYUus7Mxk","gjUTuFGzgp","No0QbYOfrY",
+"8FmFHK20wK","uQIczYf2Ec","7fsYMWmadA","rhl0J5ZaEz","RACujRsQUq","ksJbyzY1GY","KASQ8pT8wu","lkMUA55rfB","iqv4k9eoRc","sx5Gl6q6L9",
+"MK07Yxciqp","P6bcgFhtgl","uPX7GiB08l","G1RhSguMb8","MmKGJuJScX","9y4lwk85Ae","zHF1qM3zXL","45cIHd85a9","zqH0WFFDui","24ARFD6rBy",
+"DLhzMrz7Ut","jzUqRX6Pin","ZuDtDMmsIo","VIlwPFPfSE","Q6hMCP6bcg","sqVrfWPmlx","lkMUAdpe1v","IjTwPiqv4k","m4bxUcShY2","AmdQd9XyT9",
+"Cfgr3M3zXL","tvdkDNAFuw","8FmFHBbwgA","QnJ1Sn8pJ9","Mkgy8uupzk","24ARFfcJOy","DLhzMD6rBy","FFDuim4bxU","DG4sTQbxXc","UlU3MGv3Fq",
+"TCgPpnnP8o","Q6Lix9iGoT","taOXKNOHsz","d85a9yvOMI","HlUbFJRJQB","s4786Q6Lix","SjskQMojnP","ulk41BFkb8","QbxXclCMxy","CK5W7EOE1o",
+"lXFOBvkCHH","NAFuwsx5Gl","tjQxs1LB1L","IjTwPThjNn","nlaByl83Ud","X6PinJKWYR","JXljWIBe8k","rKDLJU3yw5","yToGWa00b5","5VZjSs7Mxk",
+"i3pyduTacx","Kr8ysMmKGJ","0Kyfshi5X7","07n1c8U2nU","piJSklpF6W","djsrv5drc6","iKqhrqUJMd","WDVWJJkzUn","t59lRfFDrJ","s47865Drn0",
+"cL0aEReKEW","jSjS3lpF6W","IBe8kVprf2","2TRI7StlDJ","FwEJzDLhzM","618DiyvOMI","rz7Uti7WMQ","Q6Lixru4UG","IKxdLCfgr3","yvOMIDG4sT",
+"VerEAIRh48","DG4sTDLhzM","vLsmSzqH0W","BpYhV6AFT0","4dEz6WMiS3","k85AeKsjRK","fqypyyEfy9","Nxx9VprNT6","JKWYR7fsYM","JXljWrhl0J",
+"zFgtBzqH0W","uLtKsOUqFM","FjHXRguMb8","8cVD3Q6Lix","ogLgcVIlwP","P6bcgReKEW","Dz1R3wDajX","MezSWaDGtS","16lHcmz8gx","ogLgcKZamH",
+"HP433yofH3","B3qem5IhmG","0KyfsVNCPd","CxVEf8RCUA","bZLvSBbwgA","sqVrf5nmWv","ni2v10PktI","AgJHQD6rBy","okgRiuupzk","mX2GEqQxHP",
+"t59lRtAOsr","lsQGoDG4sT","CdyBVTXQ0Z","lViBvm4bxU","I7p2agIYvE","lj07Qhi5X7","ECMvUvOqCE","lm0pDt98iW","XyPZNa00b5","zz4ZUuJScX",
+"aez9yRzaZA","M6qcGFhtgl","wiHrZJXljW","WmadAuJScX","x3LDeFhtgl","ZzJHWk85Ae","yEfy9faHir","UlU3MS77LH","2Yz7EUmaEv","o8UydyofH3",
+"GrDg7soy9t","5drc6UlU3M","WaWsvQClRL","Gv3FqChuy3","YOfrY2Yz7E","ru4UGCxVEf","lkMUA5Drn0","HzZT8Nxx9V","gIYvERpBQm","taOXKhe9IA",
+"y94nw7Ow5C","aez9ypmeCd","gjUTuhUTw7","NhXduDG4sT","Yw2oUzqH0W","No0QbpiJSk","S2DfuyToGW","jeskS9y4lw","pWiOs6AFT0","s7Mxk4dEz6",
+"Ss0ZubZLvS","FxX9qSjskQ","48cHLFcWrW","zQt6QiB08l","QYxC0lH1kt","wDajXD6rBy","55rfBxXTI4","qUJMduoStw","7X3uys4786","tuDySrhl0J",
+"e6e4zlCMxy","RBhp0QbxXc","pv0i7pT8wu","aL6AJ5Namm","dpe1vO3iyQ","AmdQdDcpWB","LewvMn1pmO","vLsmSYjB9t","fcJOyCfgr3","faHirpT8wu",
+"n8pJ9W3VFH","y94nwNxx9V","7fKYUix74r","BFkb88RCUA","vkCHHECMvU","euZA5DcpWB","Chuy3sqVrf","CdyBVVBjhz","24ARFtuDyS","soy9tL7cGc",
+"uJScXEdBKc","9eoRcHRxd8","bZLvSd85a9","0YAGHvkCHH","tl72WM6qcG","RkQkeEOE1o","ZhwG1PYBf4","RBhp0Qworu","FhtglhUTw7","WmadA5ZaEz",
+"vLsmSSjskQ","lsQGo45cIH","v8yFNrKDLJ","QClRL5Drn0","YjB9tb29RJ","bgJAzUl4a1","ZuDtDIjTwP","QClRLfLNg8","mz8gxMkgy8","MmsIoAgJHQ",
+"LDk6fs4786","gIYvE5drc6","CxVEfQ6Lix","SjskQCdyBV","zmLYDeuZA5","ReKEWM3zXL","tuDySydG8U","Ul4a1i7WMQ","cQOnv7X3uy","zY1GYRmDcr",
+"ydG8UHzZT8","Mm8siTXQ0Z","atef2tl72W","VerEAFcWrW","v8yFNJJs5m","iwzGkyvOMI","NAFuwtlILt","0Kyfsni2v1","Y1mC08U2nU","lCMxylj07Q",
+"Cfgr324ARF","7Ow5Cm4bxU","cmXIX5nmWv","XyPZNTCgPp","5VZjSfcwDa","iwzGkfFDrJ","3otm6MmsIo","rhl0Jb29RJ","2Nslm8FmFH","hi5X7Yh1hF",
+"1v5hHydG8U","CxVEfbgJAz","LDk6fpv0i7","ciuWzprNT6","FxX9qFhtgl","QWxoTLDk6f","FhtglnlaBy","Ul4a1Mkgy8","O3iyQyEfy9","Yh1hFJXljW",
+"U3yw5fcwDa","0MR5XSbRYy","FLsphGrDg7","zFgtBRxrsm","5ZaEzLDk6f","7lUXZMkgy8","MGlTFzHF1q","L7cGcfLNg8","qQxHPMmsIo","tjQxs55rfB",
+"MojnPZJTXH","VLTy655rfB","bZLvSDz1R3","FcWrWMm8si","EdBKcVNCPd","HlUbFPOUYS","SjskQLbRTH","zQt6QDcpWB","UmaEvdhSuH","t98iWuQIcz",
+"0h1b1SbRYy","he9IA1j5L8","G1RhSHzZT8","wDajXzmLYD","WDVWJ7ku1p","16lHcdmoS7","U3yw5rhl0J","AIYUuK4GS8","7ku1pECMvU","ThjNnix74r",
+"MaJQsWaWsv","FFDuizz4ZU","FwEJzMaJQs","iqv4kS2Dfu","IjTwPSmGzv","taOXK8RCUA","D6rByU3yw5","2ZHdkQssNC","iqv4k3weIF","Ul4a13weIF",
+"M6qcGzqH0W","hYBCKlm0pD","5nmWvy94nw","Mm8siOxWIH","55rfBoVQp6","DcpWBYf2Ec","VNCPd0PktI","Ta8f68RCUA","PYBf445cIH","guMb8dpe1v",
+"v1HlnGSQwj","580YD8TxD7","lkMUAiB08l","YjB9tx3LDe","KZamHGSQwj","dQ586FFDui","QYxC0FVMxo","i7WMQlpF6W","lH1ktRkQke","aFFssSs0Zu",
+"qaofN5Drn0","EoToP29QAz","tuDySHfyNQ","GWqqXbZLvS","4QMc9VerEA","29QAzBpYhV","gf8rIlpF6W","DQimpsuY4x","1v5hHCNHmv","9XyT9Yh1hF",
+"RBhp0MGlTF","fqypyCfgr3","djsrv7fsYM","7hyVvDz1R3","yofH3MmKGJ","Mm8siIKxdL","UmaEveuZA5","2ZHdkMmKGJ","MaJQsMGlTF","Yf2EcL7cGc",
+"bgJAzS77LH","jfREugf8rI","LewvMVLTy6","FnPFBv2eC3","Mkgy8VLTy6","ciuWzWPmlx","WMiS3ru4UG","I7p2aWaim6","D6rBylpF6W","ogLgcZ4I1v",
+"Vprf2mX2GE","jS1ajlXFOB","o8UydQClRL","2hEEUsuY4x","cmXIXuvf7A","iwzGkFLsph","LDk6fOxWIH","lweGyh1zcH","RsQUq6q6L9","a00b5s7Mxk",
+"NhXduCIShG","TCgPpXflUq","uN6r3XflUq","MojnPDQimp","blLA9lH1kt","JJs5mfqypy","VLTy6BGaQY","ECMvUgf8rI","RkQkeZv7z0","hSSvQtuDyS",
+"ni2v1nlaBy","FhtglhSSvQ","guMb8pT8wu","ogLgcL7cGc","D6rByx3LDe","m4bxUB3qem","9iGoTuQIcz","vkCHHF6PT2","QnJ1SECMvU","7Ow5C8RCUA",
+"k85AeL7cGc","gf8rIl83Ud","gdQsSfFDrJ","8RCUAgjUTu","55rfB1LB1L","SjskQnFqik","1LB1LW7cTs","uZPqgkZANm","CdyBV45cIH","2TRI7i3pyd",
+"GrDg7RBhp0","tuDySdpe1v","NAFuwlCMxy","ydG8UzqH0W","zbIYYIBe8k","brhlQzbIYY","tuDyS29QAz","uPX7GqUJMd","16lHcMmsIo","8hJdtOz8yZ",
+"fcJOyJKWYR","K4GS8J2mQi","3weIFuN6r3","n8pJ9guMb8","TCgPpqQxHP","dhSuHBbwgA","VerEAe6e4z","WreyP9GXkX","FhtglRzaZA","RzaZAIKxdL",
+"I7p2a9XyT9","MojnPFwEJz","s7Mxkru4UG","gf8rIU3yw5","pvgjSIRh48","O3iyQguMb8","ZUnqtVLTy6","WPmlx2ZHdk","uAWypRsQUq","I7p2aAIYUu",
+"lm0pDKASQ8","GWqqX618Di","v1Hlno8Uyd","MGlTFjiVBP","lViBvaDGtS","ciuWz6AFT0","MaJQsatef2","24ARFSWfou","d7vjM5iGN5","Pb1pa14FLR",
+"gtCA5jS1aj","RACujZv7z0","rz7UtjS1aj","tjQxsiB08l","i7WMQguMb8","gdQsSCIShG","aL6AJAOgEe","5drc6e6e4z","0KyfsTwano","Yh1hFOz8yZ",
+"lj07Q0YAGH","hUTw7cQOnv","Waim67fsYM","ydG8UYh1hF","16lHczY1GY","rhl0J5IhmG","Chuy3IRh48","s7MxkVjCZq","qaofNZUnqt","Cp3mZlm0pD",
+"MojnPGWqqX","GSQwjdhSuH","guMb8FnPFB","QChxsOUqFM","B3qemuTacx","dQ586xciqp","OHaBzZJTXH","LDk6fUvlv4","sqVrf2DREs","fLNg85Namm",
+"qUJMdlCMxy","yofH3QClRL","SbRYy1j5L8","aL6AJ2ZHdk","uPX7GFjHXR","Y1mC0OUqFM","Q6Lix55rfB","hE1QltAOsr","TXQ0ZYw2oU","5IhmGwDajX",
+"dhSuHogLgc","VBjhz14FLR","IjTwPGrDg7","U3yw5nlaBy","9XyT9azIWp","8TxD7KASQ8","5nmWvNcICA","tuDySaFFss","8hJdtWMiS3","J2mQigtCA5",
+"TCgPp7fKYU","zqH0Wv1Hln","uZPqgzbIYY","aDGtSFPfSE","atef2yofH3","QWxoTK4GS8","CqqaD7X3uy","AXpwEgtCA5","cmXIXpiJSk","Waim6580YD",
+"0BmCytvdkD","JKWYRDz1R3","OxWIHjeskS","7ku1pMojnP","0h1b1AXpwE","FxX9qhSSvQ","cQOnvHRxd8","MaJQsB3qem","bgJAzYjB9t","NhXdulsQGo",
+"RzaZADcpWB","KZamHJkzUn","dpe1vXyPZN","CxVEflH1kt","Cp3mZTCgPp","taOXKsqVrf","55rfBHlUbF","iwzGkMK07Y","ZuDtD5Drn0","5iGN5k85Ae",
+"X6Pin5nmWv","FxX9qHzZT8","1v5hHSbRYy","C2Irc4QMc9","aDGtS6q6L9","9iGoTt59lR","rz7UtX6Pin","ru4UGWPmlx","3otm6NOHsz","guMb8dhSuH",
+"iKqhruTacx","BpYhVNxx9V","2DREsgjUTu","uQIczzHF1q","48cHLazIWp","MGlTF24ARF","prNT61LB1L","JXljWQChxs","BbwgA0Kyfs","nlaByUlU3M",
+"faHirQChxs","aFFssFnPFB","9iGoTD6rBy","Nxx9VjfREu","s7MxklCMxy","brhlQYOfrY","AIYUuJRJQB","CdyBVFVMxo","8FmFH0PktI","7Ow5CrKDLJ",
+"QClRLuQIcz","FxX9qRkQke","5drc6zbIYY","RpBQmFwEJz","CxVEftuDyS","tjQxsrhl0J","GrDg7SWfou","tuDySL7cGc","s7MxkqaofN","5drc6tuDyS",
+"8xEKzt59lR","TCgPpQ6Lix","s4786rz7Ut","0Wr5yjtn0X","JJs5moVQp6","iwzGkd7vjM","MmsIoTCgPp","0PktIVerEA","EOE1oStlDJ","zY1GYfmIK1",
+"5iGN5mX2GE","aL6AJ1j5L8","7Ow5C5VZjS","BbwgA3otm6","JRJQB9rlg9","rz7Ut5Mg9r","qUJMdLDk6f","JRJQB8hJdt","In3NSMGlTF","RsQUqlpF6W",
+"9rlg9JRJQB","0MR5XU3yw5","FhtgluQIcz","FVMxoVNCPd","7fKYURkQke","YOfrYdpe1v","FwEJzcL0aE","5Mg9rCfgr3","nlaByO3iyQ","v1HlnIjTwP",
+"jSjS3MGlTF","uLtKstlILt","2TRI7kZANm","i3pyd2Yz7E","iqv4kAmdQd","IjTwPatef2","ZzJHWDLhzM","oQ87r8U2nU","b29RJUvlv4","P6bcglweGy",
+"M6qcGt98iW","lsQGowiHrZ","lm0pDni2v1","FLsphGSQwj","J2mQicL0aE","RxrsmcShY2","NcICAK20wK","SjskQECMvU","BCxeCpAhR1","uAWypSbRYy",
+"W3VFH0ao3l","dpe1vhE1Ql","RxrsmjzUqR","djsrvBFkb8","RACuj0h1b1","CxVEfJkzUn","pWiOsIjTwP","ydG8UpvgjS","LewvMQWxoT","G1RhSpv0i7",
+"JKWYRd7vjM","tlILtQ6Lix","Ul4a1ulk41","zz4ZURxrsm","AkKTk7fsYM","qUJMd0h1b1","RACujMGlTF","pWiOsni2v1","S2DfuU3yw5","Oz8yZBFkb8",
+"X6PinMK07Y","jzUqRFhtgl","lXFOB8FmFH","FhtglzFgtB","y94nwuLtKs","bgJAzoQ87r","v1Hln07n1c","0Wr5yfcwDa","soy9tFcWrW","FFDuiVLTy6",
+"uupzk9iGoT","zz4ZUtlILt","rz7UtQbxXc","J2mQicQOnv","EoToPWaim6","v2eC3QnJ1S","hYBCKAOgEe","QYxC0nFqik","qaofNS2Dfu","5NammjiVBP",
+"M3zXLLewvM","piJSkjzUqR","EoToPBpYhV","M6qcGgdQsS","cQOnvaFFss","FnPFBQClRL","NcICAvOqCE","Cfgr3uoStw","S2DfuGrDg7","5ZaEzOxWIH",
+"i3pydpFrrl","8FmFHEdBKc","cmXIXOUYuF","dpe1vVjCZq","EoToP0BmCy","b29RJuLtKs","M6qcGbgJAz","fcwDaJKWYR","tAOsrTCgPp","JXljWdjsrv",
+"piJSkWmadA","fcJOyiwzGk","BpYhVxciqp","P6bcgh1zcH","aDGtSqaofN","l83UdcQOnv","yEfy98cVD3","iwzGk5Drn0","piJSkGXdoH","Dz1R3t59lR",
+"iqv4kSmGzv","prNT6XyPZN","KASQ8YOfrY","nFqikt98iW","AIYUuguMb8","QClRLv8yFN","BFkb82hEEU","piJSkVNCPd","M6qcGxciqp","jeskStuDyS",
+"9y4lw5ZaEz","WMiS3B3qem","0KyfsYjB9t","yvOMIRzaZA","Rxrsm1LB1L","0PktIsx5Gl","Pb1pad85a9","uJScXRkQke","FhtglNhXdu","cL0aEG1RhS",
+"fcwDa1v5hH","UmaEvCp3mZ","jS1ajzQt6Q","t59lR7hyVv","s93Mlrhl0J","FFDuiaFFss","he9IAB3qem","aFFsspiJSk","i7WMQdQ586","16lHcBCxeC",
+"SbRYyvkCHH","AIYUun1pmO","yluBxFhtgl","uupzk9GXkX","VLTy6I7p2a","OUqFMMGlTF","BFkb8EoToP","YOfrYfLNg8","QWxoT14FLR","d7vjM45cIH",
+"Yf2EcuN6r3","D6rByMkgy8","AOgEeFNYIM","1LB1L8FmFH","16lHcSWfou","uPX7GnFqik","JkzUnAIYUu","Vprf2GXdoH","9y4lwMojnP","y94nwQworu",
+"ZhwG1K4GS8","ZUnqtaL6AJ","zFgtBQ6hMC","Pb1paK4GS8","rz7UtoGu6x","jiVBPoQ87r","EdBKcVLTy6","GrDg748cHL","UmaEvUl4a1","WPmlxQChxs",
+"7X3uyoVQp6","vkCHH7fKYU","jiVBPPb1pa","k85AeMGlTF","2TRI7tjQxs","M3zXLulk41","FnPFBi7WMQ","CxVEf16lHc","4QMc90MR5X","KZamHQChxs",
+"8RCUAe6e4z","WreyPAOgEe","In3NSzY1GY","NcICAy94nw","7X3uyXyPZN","jeskSHP433","BpYhVpT8wu","KASQ8i3pyd","pmeCdVNCPd","1j5L8GSQwj",
+"IBe8kguMb8","VIlwPzmLYD","9y4lwyluBx","YOfrYQWxoT","VIlwPAkKTk","QbxXcOxWIH","CqqaDzHF1q","qUJMdazIWp","XflUq1v5hH","U3yw5LDk6f",
+"YjB9tVerEA","bZLvSAIYUu","hYBCKlkMUA","h1zcHYw2oU","Q6hMCNOHsz","fcwDas4786","2Nslm5VZjS","7ku1pFxX9q","h1zcHWMiS3","jeskSsqVrf",
+"hi5X7WPmlx","ZhwG1NAFuw","8xEKzM3zXL","WMiS3ZUnqt","7ku1pYjB9t","B3qem3weIF","VerEArKDLJ","bgJAzlm0pD","euZA5dhSuH","xciqpv8yFN",
+"a00b5hUTw7","5drc6W7cTs","ThjNnOUqFM","gdQsSNOHsz","ciuWzFxX9q","2DREs29QAz","RmDcrqUJMd","RxrsmEdBKc","tAOsrpmeCd","29QAzYh1hF",
+"OUqFM8xEKz","8cVD3xXTI4","ZUnqtzbIYY","oGu6xhUTw7","M6qcGSs0Zu","uN6r3No0Qb","In3NSG1RhS","IBe8kvLsmS","RBhp0EdBKc","5VZjSAXpwE",
+"gdQsSsoy9t","ThjNnWaWsv","hi5X7IBe8k","djsrviKqhr","RmDcruoStw","24ARF5VZjS","suY4xNo0Qb","sx5GlCp3mZ","yEfy9BbwgA","RmDcraL6AJ",
+"JIqXiReKEW","uPX7GXyPZN","Ss0Zui3pyd","jSjS32TRI7","MmKGJzbIYY","aDGtSzFgtB","DQimp9rlg9","NOHsza00b5","Oz8yZ0Kyfs","0h1b1QClRL",
+"a00b5DQimp","rKDLJdjsrv","CxVEfrhl0J","cQOnvtjQxs","X6PinQClRL","FPfSEdpe1v","X6Pin7hyVv","D6rBy0Kyfs","MezSWoQ87r","YjB9tzbIYY",
+"CNHmvRxrsm","y94nwUmaEv","cmXIXy94nw","tl72W2TRI7","lj07QIKxdL","ReKEWUlU3M","SmGzvMGlTF","zFgtBStlDJ","Nxx9VBCxeC","v2eC39iGoT",
+"xciqp8U2nU","uJScX1LB1L","FxX9qWreyP","JKWYRGrDg7","pFrrl64s8N","Uvlv4MezSW","mX2GEKr8ys","K4GS88hJdt","uAWyp0MR5X","TCgPpuLtKs",
+"Waim6VNCPd","uoStwFLsph","rhl0JcmXIX","yluBx4dEz6","ECMvUBCxeC","4QMc9prNT6","lH1kthi5X7","WaWsvOxWIH","ru4UG2hEEU","tAOsr9iGoT",
+"Pb1paW7cTs","55rfBuLtKs","S77LH8TxD7","7Ow5C9y4lw","7lUXZhi5X7","vkCHHM3zXL","DG4sTPYBf4","uAWypfFDrJ","Cp3mZNOHsz","Dz1R3lpF6W",
+"Q6hMC2Yz7E","HRxd8FjHXR","9rlg9YjB9t","2Yz7EYjB9t","I7p2aYf2Ec","kZANmcQOnv","QnJ1SnlaBy","v8yFNAIYUu","mz8gxzQt6Q","RkQkeKASQ8",
+"KASQ8kB5nP","CqqaDlweGy","MK07YWmadA","1j5L8SjskQ","QYxC048cHL","cQOnvChuy3","yofH3HfyNQ","0BmCy0Kyfs","D6rBybZLvS","aL6AJ2Nslm",
+"VNCPdDG4sT","2DREsuQIcz","aez9yHzZT8","BFkb8WDVWJ","ydG8UgIYvE","TXQ0Z6q6L9","SbRYy0PktI","Ss0ZuFwEJz","kB5nPdjsrv","nlaBym4bxU",
+"CxVEfQChxs","45cIHuoStw","QYxC0jeskS","zz4ZUjS1aj","bgJAzlweGy","gdQsSMmKGJ","14FLRjzUqR","580YDzqH0W","2DREsaDGtS","tl72WB3qem",
+"HzZT8EdBKc","ulk41OUYuF","AXpwEuupzk","X6PinYh1hF","QbxXcIn3NS","pWiOsv1Hln","CxVEfyToGW","lj07QWMiS3","BpYhVJKWYR","ZUnqtNAFuw",
+"RzaZAGrDg7","8FmFHpvgjS","AkKTke6e4z","lsQGouupzk","s93Ml9GXkX","HzZT8F6PT2","Cfgr38TxD7","uLtKswiHrZ","FjHXRaez9y","NhXduHP433",
+"vOqCECqqaD","faHiruTacx","zbIYYQnJ1S","MezSWfcwDa","9eoRctjQxs","yvOMIK4GS8","MGlTFpT8wu","gIYvEzbIYY","I7p2aS77LH","5iGN5pFrrl",
+"TCgPpgf8rI","0ao3lPYBf4","Vprf21j5L8","BbwgAQssNC","OxWIHQWxoT","jtn0Xsx5Gl","StlDJhE1Ql","iB08lpvgjS","t59lRhYBCK","7fKYUSmGzv",
+"HRxd8dQ586","zQt6QbrhlQ","ZhwG1MGlTF","MmsIouPX7G","zY1GYVIlwP","AOgEeVLTy6","v1HlnprNT6","Vprf2AXpwE","iB08lAgJHQ","t98iWStlDJ",
+"QnJ1S8TxD7","GXdoHpFrrl","euZA5lCMxy","qaofNxReec","ydG8Ue6e4z","SjskQDQimp","6q6L9uPX7G","YOfrYWMiS3","IjTwPcQOnv","AmdQdaL6AJ",
+"CxVEf5nmWv","mX2GE0Wr5y","0Wr5ydmoS7","ThjNn7Ow5C","2hEEUGv3Fq","VerEA16lHc","kB5nPBCxeC","CxVEfVIlwP","8FmFHhi5X7","M6qcGpFrrl",
+"Cp3mZCK5W7","ogLgcFhtgl","Ta8f6gdQsS","uLtKsUvlv4","ydG8UIRh48","ulk41OHaBz","W7cTslsQGo","TXQ0ZpmeCd","MojnPNcICA","9eoRclViBv",
+"t98iW8xEKz","MojnPMezSW","QClRLMezSW","fcwDalweGy","48cHLCp3mZ","618Di07n1c","6q6L9hSSvQ","Oz8yZAmdQd","W3VFH4dEz6","YOfrYNcICA",
+"48cHLYw2oU","oVQp6Gv3Fq","Q6LixAmdQd","BFkb848cHL","NAFuwbrhlQ","l83UdzQt6Q","k85Aed85a9","jtn0XK4GS8","ulk41MmKGJ","J2mQiIKxdL",
+"v8yFNReKEW","MK07Y2DREs","5Nammhe9IA","GSQwjaDGtS","1v5hH16lHc","oGu6xMm8si","lCMxy0Wr5y","rz7UtS77LH","14FLRVIlwP","IKxdLTXQ0Z",
+"dpe1vWMiS3","lXFOBoVQp6","cL0aE0BmCy","VBjhzVerEA","nnP8ozQt6Q","CxVEfnFqik","Yw2oUcmXIX","zFgtBaL6AJ","WaWsvzmLYD","ogLgcBpYhV",
+"wDajXRBhp0","wiHrZ7fsYM","KsjRKqUJMd","WreyPUmaEv","brhlQOUYuF","EoToPF6PT2","6AFT0yEfy9","cL0aEuZPqg","TXQ0Z2ZHdk","55rfBjfREu",
+"IBe8k9GXkX","J2mQiUmaEv","HRxd8XflUq","IKxdLlsQGo","I7p2a48cHL","atef2lXFOB","uoStwgtCA5","a00b5uAWyp","0BmCys7Mxk","uTacxLDk6f",
+"UlU3MTa8f6","GXdoHRmDcr","2hEEU2DREs","ix74r2DREs","zz4ZU7hyVv","jtn0X618Di","dhSuHLDk6f","oQ87rFjHXR","lj07QkB5nP","S77LHyEfy9",
+"azIWp45cIH","iwzGkatef2","x3LDeqQxHP","VerEA3otm6","kZANm0MR5X","suY4xZUnqt","Q6LixfaHir","M6qcGyluBx","hUTw7pFrrl","v8yFNFnPFB",
+"ZUnqt5ZaEz","TXQ0ZC2Irc","BGaQYs4786","mX2GELDk6f","t98iW1LB1L","Qworuy94nw","ReKEWY1mC0","jSjS3NOHsz","aFFsstl72W","TwanoHlUbF",
+"Y1mC0S2Dfu","qUJMdl83Ud","X6PinksJby","uvf7AQbxXc","6AFT0JXljW","pAhR10BmCy","29QAzFGzgp","yvOMISbRYy","RACuj7fKYU","mz8gxrhl0J",
+"CIShGlkMUA","FhtglvOqCE","0h1b1C2Irc","618Dia00b5","CqqaD0h1b1","rz7UtyEfy9","nlaByNAFuw","PYBf4blLA9","xReecmX2GE","VLTy6i7WMQ",
+"nnP8ov1Hln","XflUqjeskS","ZuDtD2Yz7E","Q6LixJkzUn","MGlTF0Wr5y","45cIH24ARF","prNT6AXpwE","yluBxdhSuH","suY4xjeskS","ThjNngdQsS",
+"45cIHVBjhz","Ul4a1IBe8k","oQ87rM3zXL","Mm8sipWiOs","lH1ktjSjS3","FwEJzpAhR1","0ao3lCp3mZ","FnPFBQworu","uZPqgZ4I1v","2Yz7EFVMxo",
+"faHirhUTw7","Oz8yZQClRL","SjskQzmLYD","kB5nPSmGzv","uQIczxReec","U3yw5CdyBV","zmLYD24ARF","ix74rEdBKc","IjTwPC2Irc","i7WMQVerEA",
+"kZANmJXljW","azIWp1LB1L","FjHXRulk41","8hJdto8Uyd","QnJ1SMGlTF","ZhwG1pvgjS","Cfgr3d7vjM","fLNg8OxWIH","n8pJ9XflUq","EdBKcCIShG",
+"CNHmv5drc6","VBjhz8U2nU","2DREs8cVD3","VIlwPBCxeC","lm0pDvkCHH","jtn0Xaez9y","M3zXL0Wr5y","IRh48m4bxU","suY4xBGaQY","3otm6lpF6W",
+"LbRTHiqv4k","0KyfsfcwDa","n8pJ9OUqFM","CqqaDO3iyQ","jS1aj0Wr5y","Yw2oUYh1hF","gjUTulj07Q","580YDIKxdL","FPfSEQ6hMC","djsrv618Di",
+"iKqhraDGtS","lj07QO3iyQ","In3NSlkMUA","CdyBVx3LDe","lpF6WfLNg8","4QMc9kZANm","KZamHSs0Zu","MGlTFtjQxs","K20wKzHF1q","ZzJHW16lHc",
+"M3zXL0ao3l","G1RhSn1pmO","tl72WhSSvQ","lH1kt5iGN5","jtn0XUvlv4","K20wKOz8yZ","l83UdSbRYy","24ARFIn3NS","zz4ZUydG8U","jzUqRDz1R3",
+"hYBCK5VZjS","LbRTHqUJMd","6q6L9QnJ1S","dmoS7jzUqR","7Ow5C5Mg9r","Mm8siwiHrZ","pAhR1Waim6","M6qcGsoy9t","Yf2EcTCgPp","wiHrZlkMUA",
+"FhtgluN6r3","s7MxkTa8f6","8hJdtRzaZA","ZhwG1FjHXR","oGu6x0h1b1","piJSkVIlwP","RBhp0m4bxU","dpe1v0YAGH","07n1cUmaEv","pAhR1Q6Lix",
+"jtn0Xv8yFN","x3LDeVprf2","TCgPps4786","W3VFHtAOsr","S77LHF6PT2","0PktIJXljW","qUJMdRmDcr","uvf7AlsQGo","618DiKZamH","Y1mC0ogLgc",
+"fLNg8guMb8","48cHLbZLvS","azIWpVNCPd","aL6AJix74r","uTacxb29RJ","0PktIRpBQm","YOfrYdmoS7","rhl0JuLtKs","v2eC3gf8rI","e6e4zWMiS3",
+"WDVWJOUqFM","VNCPd48cHL","W7cTsdjsrv","iKqhrXyPZN","hE1Qlhi5X7","WmadAEoToP","Ss0ZuSjskQ","IRh48rKDLJ","d7vjMQssNC","B3qemWPmlx",
+"uZPqgrz7Ut","JJs5mGXdoH","piJSkuvf7A","zbIYYcL0aE","NOHszEoToP","7fsYMydG8U","DLhzMi7WMQ","BpYhVgtCA5","7X3uyulk41","OxWIHo8Uyd",
+"GSQwjGXdoH","QChxstvdkD","MmsIoChuy3","J2mQie6e4z","7ku1pUmaEv","BFkb8PYBf4","zmLYDd7vjM","XflUqDcpWB","yvOMIdjsrv","Q6LixZv7z0",
+"Nxx9VzQt6Q","OxWIH5ZaEz","nFqik5VZjS","Uvlv4FFDui","oQ87rkZANm","gdQsSuvf7A","d85a9kZANm","pFrrlC2Irc","5nmWv5Mg9r","RpBQmrhl0J",
+"t59lRAmdQd","D6rBySjskQ","AmdQdcShY2","CK5W7618Di","uQIczG1RhS","Z4I1vuZPqg","5iGN5FNYIM","JKWYRh1zcH","AOgEeSmGzv","fLNg8X6Pin",
+"I7p2auTacx","HfyNQCqqaD","WDVWJ8hJdt","lXFOBTXQ0Z","5drc6KZamH","29QAzv2eC3","BbwgAXflUq","Waim68TxD7","U3yw5piJSk","48cHLdhSuH",
+"pmeCdZ4I1v","uJScXSmGzv","2TRI7Gv3Fq","WaWsvaDGtS","o8UydNxx9V","lViBvpT8wu","ECMvUFhtgl","MmsIodQ586","ksJbyiKqhr","24ARFk85Ae",
+"zz4ZUU3yw5","b29RJHzZT8","G1RhSoVQp6","EoToPVBjhz","Gv3FqFGzgp","FjHXRQClRL","ydG8Uulk41","0KyfsU3yw5","nnP8oWDVWJ","OUqFMNo0Qb",
+"CK5W7580YD","pvgjS07n1c","piJSkoGu6x","fFDrJWaim6","aez9yxReec","XyPZN16lHc","0YAGHHzZT8","lCMxyk85Ae","JkzUnGSQwj","VerEALewvM",
+"lViBvTa8f6","lweGyAmdQd","t59lRuvf7A","UmaEvEdBKc","S77LH1LB1L","5ZaEzvLsmS","POUYS5Drn0","7Ow5Crhl0J","Oz8yZaez9y","0YAGHVIlwP",
+"ciuWzblLA9","gdQsS9y4lw","M6qcGhE1Ql","QYxC0JkzUn","EdBKcuLtKs","F6PT2s93Ml","d7vjMlCMxy","FxX9qAOgEe","xciqppT8wu","16lHcJ2mQi",
+"4W0TlPb1pa","16lHc6q6L9","Nxx9V8U2nU","Yf2Ec2Yz7E","aL6AJMm8si","QnJ1SlCMxy","GXdoHReKEW","pFrrl5nmWv","3otm6ix74r","9XyT9uLtKs",
+"jtn0XAgJHQ","Pb1pa7X3uy","prNT6jzUqR","GWqqXTCgPp","HlUbFWmadA","sx5GlgdQsS","48cHLKr8ys","soy9tZv7z0","IKxdLuLtKs","FGzgpAgJHQ",
+"JIqXiNxx9V","Ul4a1MaJQs","faHirbrhlQ","SjskQTCgPp","ZuDtD8FmFH","ulk41FjHXR","XyPZNFnPFB","ydG8Ux3LDe","OxWIHhYBCK","LbRTHi7WMQ",
+"ru4UGo8Uyd","vOqCEyofH3","uLtKsFcWrW","tlILtVLTy6","7lUXZy94nw","W7cTs2Yz7E","d7vjM6AFT0","IKxdLyToGW","5IhmGguMb8","5Drn0WaWsv",
+"JIqXiW3VFH","i7WMQS77LH","hi5X7JJs5m","VLTy6QWxoT","hYBCKvkCHH","uPX7GmX2GE","zqH0WFGzgp","1LB1LQssNC","QClRLFcWrW","aL6AJ8cVD3",
+"AOgEem4bxU","Oz8yZcmXIX","9GXkX9GXkX","Ul4a1FGzgp","7Ow5CFwEJz","Cfgr32Nslm","NcICA0Wr5y","vkCHHK20wK","dQ586OHaBz","9y4lwmX2GE",
+"gIYvEWaim6","vOqCEzqH0W","iB08lyluBx","2NslmRzaZA","xciqp6q6L9","ZzJHWIRh48","StlDJQbxXc","zFgtBFwEJz","tvdkDEOE1o","yofH3dpe1v",
+"7fsYMksJby","5Nammrhl0J","fqypyJXljW","kB5nPvOqCE","lViBvogLgc","hUTw707n1c","SbRYyKsjRK","VNCPdChuy3","k85Aehi5X7","jSjS3h1zcH",
+"zY1GYx3LDe","9iGoT2DREs","TwanoB3qem","SbRYyd7vjM","qQxHPCxVEf","5Namm2DREs","RACujzY1GY","x3LDe2ZHdk","o8Uydv1Hln","lpF6WPOUYS",
+"vOqCEqUJMd","Yh1hFQssNC","cL0aEQbxXc","BbwgAuAWyp","D6rBylH1kt","rKDLJlXFOB","S2DfulCMxy","CK5W7TCgPp","EoToPSmGzv","8xEKziwzGk",
+"9eoRcCNHmv","POUYSlXFOB","ru4UGuTacx","AOgEefLNg8","WPmlxyluBx","5ZaEzZ4I1v","ThjNn1LB1L","fFDrJRzaZA","h1zcHJKWYR","i3pydZ4I1v",
+"brhlQ6q6L9","taOXK7fKYU","tlILt2Yz7E","lsQGo3weIF","JXljW24ARF","zY1GYKr8ys","ksJbyvLsmS","FVMxo0BmCy","uoStw0h1b1","jiVBPt98iW",
+"J2mQiFwEJz","hi5X7K20wK","prNT68RCUA","l83UdyofH3","aL6AJM3zXL","FnPFBBbwgA","QnJ1SFnPFB","FLsphsqVrf","lkMUAtaOXK","S2DfucL0aE",
+"jS1ajn1pmO","ydG8UHRxd8","7hyVvpFrrl","DcpWB3weIF","ksJbyAOgEe","HP433580YD","ciuWzMaJQs","EOE1o9eoRc","0ao3lMmsIo","yofH3v1Hln",
+"64s8NiKqhr","iqv4kpAhR1","WmadA0MR5X","5ZaEzaL6AJ","TXQ0ZAmdQd","hE1QlFhtgl","zz4ZUHRxd8","cmXIXlkMUA","IBe8kJkzUn","BGaQYFnPFB",
+"QbxXc9rlg9","jeskSCdyBV","CxVEfhSSvQ","nnP8oaFFss","lpF6WjS1aj","5ZaEz8TxD7","mX2GEvkCHH","fLNg864s8N","uJScXd85a9","7fKYUNAFuw",
+"F6PT21v5hH","l83UdW7cTs","oVQp6CIShG","WMiS3qUJMd","RzaZAvOqCE","zz4ZUD6rBy","Yh1hFlkMUA","djsrvrhl0J","D6rBy5Namm","cShY2IKxdL",
+"cL0aE8xEKz","4W0TlnFqik","FPfSEI7p2a","d85a9UlU3M","EdBKcIjTwP","Oz8yZGSQwj","QChxsFPfSE","5Drn0QWxoT","QssNC16lHc","WmadAFLsph",
+"ThjNnW3VFH","EoToPoGu6x","OUqFMFwEJz","lj07QjS1aj","vLsmSJJs5m","lH1ktuZPqg","x3LDe1v5hH","1LB1LpAhR1","wDajX07n1c","1j5L80MR5X",
+"F6PT2D6rBy","0BmCyGXdoH","64s8NQClRL","1LB1LCxVEf","W3VFH2ZHdk","KZamHIRh48","K4GS8lViBv","2hEEUNOHsz","CIShGThjNn","Q6LixvLsmS",
+"1LB1LFPfSE","QYxC0AIYUu","5ZaEzWPmlx","prNT6Ta8f6","Yf2EcnlaBy","BFkb8Nxx9V","2NslmydG8U","IKxdLn1pmO","yToGWOxWIH","jfREuKr8ys",
+"0YAGHgIYvE","9GXkXmz8gx","ECMvUwDajX","pFrrlAIYUu","HP433d7vjM","W3VFHRBhp0","VNCPdvkCHH","xXTI45drc6","RpBQmFLsph","CNHmvK4GS8",
+"Y1mC0soy9t","tuDySNcICA","Yw2oUtjQxs","x3LDes7Mxk","zY1GYJIqXi","lweGy8U2nU","5nmWvqaofN","5drc6hYBCK","ulk41MaJQs","ksJby8FmFH",
+"HzZT8xXTI4","Waim60ao3l","8FmFH9XyT9","X6PinfcwDa","U3yw5pWiOs","0MR5Xpv0i7","kB5nPuAWyp","4W0TlRzaZA","UmaEvQChxs","ogLgcJ2mQi",
+"nFqik2TRI7","EdBKcl83Ud","iwzGkIBe8k","14FLRRBhp0","Vprf2tAOsr","jfREuGv3Fq","6AFT0rz7Ut","O3iyQCdyBV","d85a9d7vjM","dpe1vaL6AJ",
+"sx5GljeskS","2hEEUUl4a1","gtCA5azIWp","X6PinZUnqt","QClRLRsQUq","ReKEW5IhmG","IBe8kRkQke","sx5GlZv7z0","WPmlxwiHrZ","vLsmStuDyS",
+"aL6AJNo0Qb","hYBCKLDk6f","uJScXmz8gx","uvf7AoQ87r","K20wKS2Dfu","cShY2NhXdu","SmGzvW3VFH","07n1c4dEz6","8U2nUC2Irc","MmKGJWDVWJ",
+"Cp3mZuoStw","zqH0WRxrsm","ru4UG9eoRc","7fKYUatef2","fLNg8jtn0X","JRJQB5iGN5","dhSuHiqv4k","s47868xEKz","7hyVv7ku1p","O3iyQ5nmWv",
+"uLtKslweGy","hYBCKjSjS3","rz7UtK20wK","ECMvULDk6f","gtCA5brhlQ","a00b54W0Tl","0PktIVIlwP","HzZT82ZHdk","3otm6UlU3M","2Nslm7fKYU",
+"blLA9Pb1pa","ZhwG1tAOsr","pFrrlM3zXL","5Nammdjsrv","9GXkXSs0Zu","vkCHHGv3Fq","8RCUAVLTy6","lsQGoo8Uyd","NcICAtjQxs","IKxdLGSQwj",
+"O3iyQWaim6","jiVBPdpe1v","MaJQs07n1c","QWxoTni2v1","WmadApT8wu","he9IACqqaD","HRxd88U2nU","m4bxUs7Mxk","jeskSDLhzM","0YAGH0YAGH",
+"GXdoHTa8f6","FnPFB1j5L8","YjB9t64s8N","YjB9tLDk6f","h1zcHfqypy","JRJQBHzZT8","BFkb8gtCA5","KZamHBGaQY","vLsmSFGzgp","UmaEvPb1pa",
+"iKqhrF6PT2","0ao3lMezSW","s47865drc6","618DiHRxd8","X6PinMojnP","IKxdLQ6Lix","U3yw5yluBx","Mm8si29QAz","5VZjS618Di","Zv7z0K20wK",
+"Dz1R37X3uy","ZJTXHDQimp","JkzUnqaofN","jtn0X2hEEU","LDk6flm0pD","h1zcHuQIcz","RmDcrjfREu","iB08luN6r3","l83UdqUJMd","ReKEWguMb8",
+"Waim6hi5X7","3otm6tvdkD","wDajX4dEz6","JkzUnBGaQY","MaJQsUl4a1","pvgjSzmLYD","Dz1R3zqH0W","GXdoH64s8N","VNCPdBpYhV","MK07Ymz8gx",
+"55rfBJRJQB","ogLgc0MR5X","zQt6QvOqCE","t59lR8cVD3","gtCA5LDk6f","xciqpRACuj","zmLYD0Wr5y","yEfy9uvf7A","NAFuwprNT6","aFFssGv3Fq",
+"JKWYRnFqik","PYBf4HP433","ksJbygdQsS","P6bcgNxx9V","hSSvQzHF1q","gdQsSv2eC3","KASQ88U2nU","MK07YQChxs","4W0TlS2Dfu","ThjNnrKDLJ",
+"7Ow5CQClRL","okgRibrhlQ","MezSWzHF1q","5VZjS5iGN5","L7cGcuQIcz","24ARFM6qcG","okgRi2DREs","6AFT0MmKGJ","CxVEffcJOy","zY1GYzQt6Q",
+"Oz8yZO3iyQ","aL6AJMK07Y","yEfy9lCMxy","WaWsvZUnqt","MaJQs9eoRc","JJs5m7Ow5C","NhXduZhwG1","BpYhVFnPFB","RACujZJTXH","rz7Ut0Kyfs",
+"ZzJHWsqVrf","uZPqg0Wr5y","RpBQm0BmCy","KsjRKRxrsm","tjQxs4dEz6","FPfSERpBQm","QChxsy94nw","Qworu07n1c","Qworuuupzk","F6PT2wDajX",
+"LbRTHGWqqX","JXljWCIShG","uTacx5ZaEz","WPmlxECMvU","prNT6uJScX","RsQUqhSSvQ","2TRI7lkMUA","yvOMI618Di","pWiOsQYxC0","XyPZN64s8N",
+"M3zXLQnJ1S","jtn0XP6bcg","5IhmG2Nslm","vkCHH0YAGH","45cIHWmadA","cQOnvQWxoT","mX2GECIShG","iB08l7lUXZ","t59lRKASQ8","48cHLfmIK1",
+"m4bxUsuY4x","blLA9BFkb8","ZJTXHdjsrv","uQIczRACuj","5VZjSpiJSk","oVQp6oQ87r","RpBQmn1pmO","kB5nP8RCUA","kB5nPpFrrl","uupzkru4UG",
+"kZANmprNT6","NOHszEdBKc","tuDyS2ZHdk","vOqCEblLA9","h1zcHNo0Qb","7lUXZK20wK","ni2v1dhSuH","G1RhS5Namm","8hJdtuZPqg","qQxHPqaofN",
+"Mkgy8O3iyQ","i3pydStlDJ","RBhp0ogLgc","5nmWvS2Dfu","cQOnvFLsph","a00b5QWxoT","uTacxuAWyp","Dz1R3x3LDe","0BmCyjeskS","Oz8yZOHaBz",
+"cL0aEQssNC","sx5Glb29RJ","ru4UGuLtKs","5NammJKWYR","zQt6Qa00b5","yofH3uPX7G","uvf7AAgJHQ","U3yw5SWfou","Ss0ZuMezSW","gjUTuTa8f6",
+"Gv3FqjzUqR","M3zXLOUqFM","TXQ0ZYh1hF","IRh48Pb1pa","HzZT8MGlTF","4dEz648cHL","IBe8kBGaQY","AgJHQMkgy8","djsrvuZPqg","VNCPdStlDJ",
+"CdyBVS2Dfu","UlU3MOUqFM","s7MxkWmadA","ZzJHWgtCA5","jSjS3pFrrl","gf8rIhE1Ql","Ss0ZukB5nP","v2eC3qQxHP","jSjS3uN6r3","hUTw7h1zcH",
+"FNYIMW7cTs","0h1b19eoRc","pv0i78hJdt","uZPqgnFqik","OxWIHdQ586","hi5X7v1Hln","NhXduIn3NS","WmadAIRh48","hSSvQ7Ow5C","Ul4a1FVMxo",
+"J2mQis7Mxk","m4bxUQbxXc","JKWYRv8yFN","580YDK4GS8","OxWIHChuy3","Pb1pauZPqg","yvOMIBpYhV","RmDcr2ZHdk","HzZT8v8yFN","LbRTHkB5nP",
+"euZA5Z4I1v","Ss0ZuyToGW","FGzgpzQt6Q","WDVWJ24ARF","CqqaDbZLvS","aL6AJoVQp6","ciuWzHP433","kZANmVerEA","vLsmSzHF1q","v1HlnrKDLJ",
+"zHF1qrKDLJ","IjTwP5IhmG","ogLgcEoToP","Y1mC0F6PT2","0BmCyhE1Ql","SmGzvMmKGJ","5Drn0U3yw5","v2eC30ao3l","uTacxAIYUu","JkzUn0MR5X",
+"KZamHqQxHP","OUYuFdmoS7","6AFT0ni2v1","ciuWzuupzk","ni2v1lkMUA","jeskSqaofN","uupzkYh1hF","8xEKz29QAz","yEfy9uPX7G","yEfy9QClRL",
+"RsQUq14FLR","1j5L8s93Ml","ZzJHWJXljW","14FLRL7cGc","oGu6xGSQwj","AmdQdFwEJz","4QMc9vLsmS","XflUq2TRI7","RxrsmbrhlQ","D6rByMaJQs",
+"rz7Ut5iGN5","FPfSEkZANm","ru4UGpv0i7","Ss0ZuEOE1o","lweGyhi5X7","zbIYYNcICA","aDGtSo8Uyd","DG4sTCdyBV","0KyfsvLsmS","Yf2EcYOfrY",
+"PYBf4YOfrY","v8yFN14FLR","mX2GEatef2","oGu6xjfREu","s93Mlxciqp","MojnPVIlwP","blLA9CNHmv","FPfSEIn3NS","hYBCKlXFOB","tl72WOUqFM",
+"NcICAWaWsv","5drc6RACuj","5iGN5Gv3Fq","s7MxkzqH0W","BCxeCWPmlx","8cVD348cHL","8hJdtpvgjS","IRh48KASQ8","9rlg9FcWrW","prNT64dEz6",
+"QClRLWMiS3","7fKYUS77LH","l83UdMGlTF","0ao3ljtn0X","DLhzMfaHir","tvdkDJXljW","zmLYDuvf7A","W3VFHlXFOB","dhSuHRACuj","64s8NoGu6x",
+"Yf2EcUlU3M","RsQUqpWiOs","dhSuHuJScX","14FLRAgJHQ","bgJAzzbIYY","yToGWiKqhr","16lHcdhSuH","IBe8kdpe1v","mz8gxVerEA","d7vjMM6qcG",
+"xReec6q6L9","oGu6xCfgr3","CIShGs93Ml","AOgEeCNHmv","AOgEeSjskQ","jzUqR7Ow5C","6q6L9WaWsv","uupzk0ao3l","Waim67lUXZ","S2DfuDz1R3",
+"e6e4zQworu","JXljWMm8si","EdBKc24ARF","ix74rSmGzv","guMb8fcJOy","U3yw59iGoT","9rlg9Y1mC0","6AFT0h1zcH","jzUqRCIShG","FNYIM8cVD3",
+"8hJdttAOsr","jS1aj7X3uy","jiVBPWmadA","gjUTus4786","D6rByhYBCK","dpe1vs93Ml","Twano7fsYM","o8UydFFDui","EoToPzz4ZU","XflUqfaHir",
+"7fKYUD6rBy","ix74ruvf7A","n1pmONAFuw","t98iWP6bcg","K20wKHlUbF","D6rBysx5Gl","FPfSElCMxy","QssNC8FmFH","uJScX0Wr5y","uJScXNOHsz",
+"lpF6W14FLR","he9IAYOfrY","lViBvJ2mQi","jSjS3VerEA","n1pmO0BmCy","ogLgcReKEW","uQIczFhtgl","8hJdtZuDtD","C2IrcQClRL","6q6L9uJScX",
+"HP4332Nslm","pT8wuZJTXH","9XyT90YAGH","hSSvQwDajX","3weIFmX2GE","ulk41prNT6","uoStwI7p2a","Ul4a18U2nU","7ku1pzQt6Q","n1pmODQimp",
+"In3NSDQimp","CxVEfJKWYR","zqH0W7ku1p","0KyfsB3qem","pvgjSQnJ1S","MaJQsd85a9","5NammCxVEf","G1RhS3weIF","CxVEfKZamH","JJs5mJkzUn",
+"zHF1qazIWp","SmGzvRpBQm","xciqpn8pJ9","QbxXc0h1b1","lkMUA3weIF","EdBKcFwEJz","bgJAzuPX7G","m4bxUh1zcH","MezSWQnJ1S","Ss0Zu8cVD3",
+"6q6L9tvdkD","h1zcHmz8gx","x3LDecL0aE","hE1QlMaJQs","kZANmXflUq","cShY2ThjNn","C2IrctlILt","Cp3mZMGlTF","qaofNFjHXR","nnP8o3weIF",
+"y94nw24ARF","Waim6Ta8f6","CK5W7pmeCd","9iGoTiqv4k","yEfy9b29RJ","tjQxsNo0Qb","vOqCEjeskS","No0QbogLgc","D6rByzFgtB","FxX9qgIYvE",
+"24ARFfFDrJ","hYBCKYw2oU","ThjNn7lUXZ","DLhzMQbxXc","MmKGJIRh48","brhlQQbxXc","SWfouEOE1o","OHaBz5VZjS","nnP8oNxx9V","piJSkSjskQ",
+"Ul4a14dEz6","prNT6fcwDa","pAhR1suY4x","NcICAYw2oU","FGzgpQChxs","zmLYDzz4ZU","BCxeCWmadA","0MR5Xdpe1v","i7WMQI7p2a","OxWIHoGu6x",
+"Fhtgl9rlg9","2ZHdkFcWrW","CIShGlm0pD","ECMvUQ6hMC","NOHszblLA9","bgJAzIBe8k","GrDg7hUTw7","07n1c2Yz7E","qQxHPIn3NS","xXTI4PYBf4",
+"NAFuwjtn0X","dpe1vOHaBz","FnPFBOHaBz","wDajXpv0i7","gtCA5F6PT2","hE1Qljtn0X","x3LDeKr8ys","7Ow5CtvdkD","tjQxsWaim6","In3NSQbxXc",
+"yofH3tl72W","1v5hHyToGW","lXFOB64s8N","RACujIjTwP","ThjNnUmaEv","0BmCya00b5","5Mg9rtAOsr","Yh1hF2Nslm","uvf7An8pJ9","2TRI7WDVWJ",
+"RmDcriqv4k","QChxsRxrsm","IKxdLOxWIH","In3NS6AFT0","k85Ae9rlg9","LbRTHoGu6x","Nxx9VYh1hF","JXljWru4UG","BCxeCdQ586","Z4I1vPOUYS",
+"CqqaDuN6r3","Zv7z09y4lw","ksJbyuupzk","9y4lwnnP8o","d7vjMZuDtD","Dz1R3OHaBz","mz8gxSbRYy","2NslmECMvU","OHaBz64s8N","55rfB5Namm",
+"7Ow5CLDk6f","CdyBV618Di","Zv7z04dEz6","MGlTFuoStw","G1RhSprNT6","1j5L8IKxdL","16lHcAXpwE","NcICAO3iyQ","LDk6fi3pyd","fcwDaL7cGc",
+"qaofNW7cTs","lsQGobZLvS","SbRYyEoToP","0Wr5ys4786","tuDyS7fKYU","24ARFZuDtD","FNYIM618Di","AXpwEsqVrf","ReKEWciuWz","VIlwPs4786",
+"SmGzvjSjS3","a00b5BFkb8","CqqaDIKxdL","FnPFBDz1R3","hi5X729QAz","8cVD3cL0aE","RACujpWiOs","ciuWz0MR5X","vkCHHSjskQ","Kr8ysRACuj",
+"5nmWvk85Ae","16lHcZhwG1","7X3uyGXdoH","ogLgcLDk6f","nFqikiB08l","8RCUAsx5Gl","ZzJHWQnJ1S","Mkgy85Namm","QworutAOsr","I7p2aZzJHW",
+"s47868U2nU","iwzGkaDGtS","tjQxsdhSuH","blLA948cHL","QssNCHfyNQ","1v5hHogLgc","8RCUADG4sT","ThjNnK20wK","8RCUA4dEz6","VNCPdTwano",
+"VNCPd9iGoT","hE1Ql5ZaEz","IjTwPXyPZN","Cfgr3soy9t","RBhp0W3VFH","cL0aEMkgy8","9iGoTFGzgp","MmKGJNo0Qb","a00b5L7cGc","s4786Ul4a1",
+"jzUqRMK07Y","lCMxyMaJQs","oQ87ruZPqg","Waim6qaofN","IKxdL2TRI7","fqypyzHF1q","ksJbyy94nw","KZamHFwEJz","zHF1qMK07Y","AXpwEfcwDa",
+"lsQGos4786","ZUnqtbrhlQ","D6rByKZamH","QClRLStlDJ","taOXKQbxXc","9iGoTFnPFB","jiVBPpT8wu","NcICAyvOMI","cL0aEAgJHQ","DLhzMdmoS7",
+"uTacxAgJHQ","Kr8ys8U2nU","vOqCEPb1pa","soy9t7hyVv","cL0aEbrhlQ","t98iWk85Ae","blLA9KsjRK","7lUXZWDVWJ","QssNCtAOsr","RmDcrnnP8o",
+"s93MlOUqFM","9XyT9X6Pin","ZhwG1EOE1o","uN6r3v8yFN","prNT62hEEU","pvgjSSs0Zu","Y1mC0rhl0J","hYBCKlViBv","jtn0XZv7z0","LDk6fAkKTk",
+"Waim6v1Hln","h1zcHOUYuF","POUYSsqVrf","jiVBPQ6hMC","pmeCdFjHXR","soy9tvOqCE","FxX9q9rlg9","8hJdt9iGoT","rhl0JQChxs","EdBKc5Drn0",
+"Waim6zHF1q","cQOnvJXljW","FPfSEqaofN","OUqFMQClRL","RxrsmzY1GY","XyPZNS2Dfu","Yw2oUni2v1","Gv3FqLbRTH","SWfouDcpWB","jS1ajkZANm",
+"EOE1otlILt","Ul4a1i3pyd","pT8wu55rfB","DcpWB0YAGH","iKqhrfcwDa","fmIK1HRxd8","QnJ1SMmsIo","Nxx9VokgRi","zY1GYJkzUn","zz4ZUUvlv4",
+"XflUq2Yz7E","FjHXRM3zXL","FhtglzqH0W","t98iWjeskS","jfREuciuWz","ru4UGQnJ1S","F6PT2WMiS3","zHF1qkB5nP","HzZT8iKqhr","faHirm4bxU",
+"uoStwyvOMI","RxrsmfcJOy","lkMUAuoStw","No0QbjeskS","x3LDevLsmS","mz8gxhe9IA","VjCZquZPqg","AmdQdK20wK","pWiOscShY2","hSSvQIRh48",
+"29QAzIBe8k","LbRTHL7cGc","K4GS8AIYUu","ZhwG10ao3l","Pb1paFVMxo","Zv7z02hEEU","x3LDe4QMc9","In3NSo8Uyd","POUYSWPmlx","kZANmvkCHH",
+"rhl0J5iGN5","s4786v1Hln","KsjRKOz8yZ","Yf2Ec5nmWv","yvOMIfFDrJ","MGlTFwDajX","AOgEey94nw","0h1b12ZHdk","7lUXZbZLvS","TwanofcwDa",
+"Z4I1vECMvU","QbxXcNAFuw","Dz1R3ECMvU","48cHL2hEEU","GrDg7Yf2Ec","fcJOyrhl0J","8U2nUd7vjM","WmadAThjNn","Waim6CK5W7","xXTI4k85Ae",
+"o8Uyd0PktI","lkMUAuN6r3","5Drn08hJdt","K20wKU3yw5","taOXK0MR5X","RACujpmeCd","TwanopWiOs","aez9yHP433","OUYuFokgRi","Cp3mZU3yw5",
+"RsQUq9rlg9","2NslmuPX7G","qQxHPlj07Q","ogLgcKASQ8","yluBxtjQxs","wiHrZMGlTF","AOgEeM3zXL","cShY2C2Irc","Ul4a1Uvlv4","CdyBV3otm6",
+"CxVEfXflUq","9XyT945cIH","QnJ1SNOHsz","JRJQBt59lR","dpe1v2hEEU","a00b5DG4sT","1LB1LWreyP","OxWIHi3pyd","WreyPOxWIH","cQOnv55rfB",
+"jeskSlweGy","piJSkIn3NS","okgRiEOE1o","n8pJ9I7p2a","h1zcHuupzk","lj07QVLTy6","vOqCEjSjS3","s7MxkazIWp","vkCHHUmaEv","GXdoHHP433",
+"ZuDtDbrhlQ","tuDySPOUYS","Z4I1v07n1c","3otm6SjskQ","djsrvUl4a1","7Ow5CVIlwP","VNCPdokgRi","7ku1p8RCUA","2DREsQbxXc","BbwgAaFFss",
+"2Yz7EKZamH","QWxoTZhwG1","cShY2QYxC0","EOE1oWaWsv","IRh48PYBf4","hE1QlpAhR1","mz8gx0Wr5y","0BmCy16lHc","he9IAGWqqX","Y1mC0wiHrZ",
+"rhl0J8xEKz","he9IABFkb8","djsrvdmoS7","hi5X7580YD","4W0Tl0BmCy","9GXkXfFDrJ","SjskQgjUTu","v1HlnQ6hMC","EOE1oJKWYR","zz4ZUHzZT8",
+"PYBf4piJSk","QssNCTa8f6","K20wKtlILt","ECMvUazIWp","BFkb8ru4UG","GWqqXblLA9","h1zcH0h1b1","pT8wurhl0J","suY4xSWfou","G1RhSCxVEf",
+"MK07YMojnP","v8yFNxciqp","AgJHQn8pJ9","8hJdts7Mxk","nFqikgjUTu","uQIcz5nmWv","8xEKzVBjhz","In3NSm4bxU","gf8rIEdBKc","GWqqX16lHc",
+"C2IrcVprf2","tuDySVprf2","wiHrZQnJ1S","hE1QlYf2Ec","okgRiyToGW","64s8N2DREs","nlaBylpF6W","ogLgclViBv","k85Aed7vjM","yofH3jfREu",
+"PYBf4wiHrZ","brhlQ0PktI","jfREuzz4ZU","dpe1vatef2","ru4UGW7cTs","AXpwEXyPZN","n1pmOOHaBz","ZUnqtlXFOB","jzUqR29QAz","VLTy6Qworu",
+"VerEAjiVBP","MaJQsBCxeC","24ARF618Di","GrDg7ZJTXH","aez9yMaJQs","zqH0W5Drn0","9GXkXuQIcz","dpe1v7Ow5C","CNHmvCNHmv","iqv4kfcwDa",
+"n1pmOxciqp","vLsmSpmeCd","qQxHPrhl0J","I7p2alm0pD","3weIFdQ586","sqVrfWreyP","rhl0JQbxXc","5VZjSKASQ8","UmaEvChuy3","WMiS3CxVEf",
+"lCMxylsQGo","618Di0MR5X","aFFsst98iW","yToGWJ2mQi","5VZjSX6Pin","kB5nPlsQGo","xXTI414FLR","uAWypuN6r3","mX2GEzbIYY","8hJdtFnPFB",
+"M3zXL14FLR","JJs5mDcpWB","16lHcCp3mZ","2hEEURBhp0","zY1GYBCxeC","VBjhzuQIcz","48cHLIRh48","he9IApiJSk","kB5nPAIYUu","gtCA55ZaEz",
+"ix74r580YD","7lUXZPb1pa","nnP8o618Di","dmoS75iGN5","dmoS7Gv3Fq","StlDJpvgjS","BGaQYuoStw","uupzk29QAz","6q6L948cHL","5Drn0GSQwj",
+"ciuWziwzGk","7lUXZn8pJ9","vOqCEdjsrv","djsrvqUJMd","JkzUn0BmCy","e6e4zFGzgp","0YAGHDcpWB","L7cGc1j5L8","618DiwiHrZ","HRxd8uLtKs",
+"Yf2EcpT8wu","lkMUA8hJdt","BGaQYWaim6","EoToPSWfou","tvdkDgjUTu","gIYvE29QAz","HzZT8VjCZq","xReeczqH0W","piJSkBFkb8","QworuZuDtD",
+"faHirQnJ1S","IKxdLlpF6W","48cHLZuDtD","piJSk9XyT9","P6bcgQWxoT","EoToPcL0aE","tl72WNAFuw","pWiOs5Namm","t98iWzQt6Q","aez9ygtCA5",
+"jS1ajaFFss","XyPZNUvlv4","DG4sTcQOnv","yluBx5Drn0","Z4I1vFPfSE","No0Qb7X3uy","ReKEWbZLvS","ReKEWh1zcH","QClRLMGlTF","Ul4a1d7vjM",
+"6q6L95ZaEz","7X3uyGrDg7","7fKYUru4UG","jeskSYjB9t","ciuWzrhl0J","5iGN5zqH0W","tlILtguMb8","9XyT9Vprf2","IBe8kC2Irc","iB08ltl72W",
+"vLsmSPYBf4","4QMc9lm0pD","TXQ0ZY1mC0","y94nwRACuj","fcJOyUvlv4","zHF1qlpF6W","pWiOsO3iyQ","piJSkOxWIH","0h1b1dpe1v","zHF1qZJTXH",
+"UlU3MVNCPd","QClRLM3zXL","tvdkDjeskS","n1pmOFcWrW","24ARFCdyBV","MGlTFSjskQ","ECMvUdjsrv","pvgjSaFFss","ulk41he9IA","vkCHHjtn0X",
+"sx5Gl7hyVv","kZANmzQt6Q","uZPqgguMb8","k85AehYBCK","VBjhzVNCPd","L7cGcOHaBz","LbRTHQ6Lix","ydG8UU3yw5","L7cGch1zcH","7fsYMFxX9q",
+"jSjS3aez9y","VIlwPYf2Ec","wDajXFcWrW","Kr8ys580YD","uQIczUl4a1","RkQkeAOgEe","zQt6QuTacx","580YD2Yz7E","Yf2Ecn1pmO","AXpwELDk6f",
+"blLA9faHir","48cHLSbRYy","yToGWlkMUA","9eoRcCK5W7","Ul4a1G1RhS","aez9yeuZA5","KASQ8IBe8k","AOgEeKsjRK","lm0pDJIqXi","s93MlMGlTF",
+"cL0aE3weIF","RpBQmQnJ1S","lpF6WDG4sT","MK07Yv8yFN","fqypyiwzGk","xReecWreyP","Y1mC07Ow5C","CK5W7gdQsS","5IhmGulk41","JRJQBWaWsv",
+"4QMc9QbxXc","HfyNQ1j5L8","s4786cL0aE","0MR5XGXdoH","fqypyblLA9","he9IAZuDtD","pvgjSn1pmO","Mm8sigf8rI","Cp3mZvLsmS","Cfgr31j5L8",
+"taOXKMojnP","2DREsK4GS8","SWfoupv0i7","ix74rRBhp0","fFDrJgf8rI","tlILtuupzk","e6e4z0PktI","2Yz7EbZLvS","Cp3mZZJTXH","hSSvQprNT6",
+"JJs5mFGzgp","48cHL9GXkX","MK07YQssNC","8RCUAMm8si","tAOsr8hJdt","AkKTkjS1aj","OHaBz618Di","zY1GYFcWrW","bZLvSbrhlQ","lkMUAfqypy",
+"ThjNnFnPFB","SjskQB3qem","C2Ircaez9y","QnJ1SpT8wu","azIWpCdyBV","uTacxiB08l","CqqaDo8Uyd","MmKGJn8pJ9","QbxXcUmaEv","QssNC8U2nU",
+"tuDySVjCZq","QworuFhtgl","RsQUqpAhR1","AmdQd1j5L8","xciqpUmaEv","8RCUAbZLvS","8RCUADLhzM","fLNg81LB1L","SmGzvzbIYY","B3qemRmDcr",
+"CdyBV8hJdt","rhl0JUl4a1","lCMxyhUTw7","zHF1qb29RJ","S2Dfu2Yz7E","kZANmdmoS7","14FLRDz1R3","lH1ktazIWp","UmaEvQ6hMC","IKxdLCNHmv",
+"tuDySpvgjS","8RCUAhYBCK","UlU3MkZANm","0h1b1fqypy","RmDcrWaWsv","lm0pDUlU3M","JRJQBsuY4x","SbRYy0h1b1","D6rByblLA9","VBjhzuJScX",
+"SbRYysoy9t","MGlTFW3VFH","kB5nPsqVrf","RkQkea00b5","4W0TlFVMxo","rhl0J16lHc","VBjhzPb1pa","VIlwPTa8f6","Pb1pagtCA5","euZA5kB5nP",
+"pmeCdNxx9V","bgJAzblLA9","bZLvSCfgr3","QbxXccL0aE","faHir5drc6","MezSW4dEz6","TwanotlILt","8U2nUVIlwP","aez9y7X3uy","QnJ1Smz8gx",
+"16lHciqv4k","2TRI7aDGtS","XyPZN1LB1L","wDajX0YAGH","In3NSkZANm","In3NSCNHmv","piJSkjfREu","8xEKztvdkD","hSSvQsoy9t","4W0Tl0Kyfs",
+"X6PinrKDLJ","BCxeCBCxeC","xReecv2eC3","Ul4a1d85a9","7ku1pxciqp","DLhzMJRJQB","4dEz6suY4x","aez9y7hyVv","blLA9l83Ud","lXFOB8cVD3",
+"v1HlnVIlwP","BbwgAk85Ae","v8yFNX6Pin","M3zXLl83Ud","OUYuFCdyBV","OHaBzuTacx","YjB9tpT8wu","pmeCdxXTI4","B3qem16lHc","hUTw7IjTwP",
+"m4bxUCxVEf","StlDJMGlTF","pAhR1Uvlv4","yluBx5iGN5","8U2nU7X3uy","AmdQdtjQxs","TCgPpd85a9","QYxC0l83Ud","JKWYRtl72W","RBhp0t59lR",
+"rhl0JEoToP","48cHLM3zXL","guMb8S77LH","lCMxys7Mxk","4QMc9WMiS3","ThjNnSs0Zu","7ku1p5nmWv","IjTwPTa8f6","ZJTXHjeskS","0Kyfsuvf7A",
+"Yf2EcS2Dfu","9eoRcAIYUu","0KyfsnlaBy","blLA97fsYM","NhXduDQimp","DQimpaez9y","uvf7AM3zXL","6AFT0tvdkD","JkzUnuLtKs","fLNg8tlILt",
+"StlDJZUnqt","cQOnvCNHmv","MaJQsv1Hln","FFDuipFrrl","KASQ8ksJby","0h1b1Gv3Fq","8hJdtHRxd8","xXTI4Z4I1v","tlILtbZLvS","rz7UtaDGtS",
+"VjCZqdQ586","AmdQdzbIYY","mz8gxl83Ud","AIYUuqQxHP","faHirTXQ0Z","v8yFNl83Ud","tvdkDReKEW","Mm8siTCgPp","HP433d85a9","LewvMsoy9t",
+"faHiruupzk","rz7UtFxX9q","kZANmLbRTH","45cIHn8pJ9","RkQkes7Mxk","m4bxUfaHir","hi5X7aez9y","zQt6QO3iyQ","piJSkKASQ8","oVQp6pFrrl",
+"GWqqXQnJ1S","48cHLP6bcg","d85a9IKxdL","bgJAzyvOMI","xXTI448cHL","HRxd8VerEA","v1HlnOUYuF","AXpwEQssNC","fcJOyFGzgp","AmdQdFLsph",
+"RACuj0MR5X","sx5GlLDk6f","EdBKczY1GY","5drc6zqH0W","FLsphCp3mZ","tvdkDQbxXc","5IhmGFLsph","MK07YJ2mQi","aL6AJ8U2nU","Gv3FqpiJSk",
+"yEfy9ulk41","KASQ8U3yw5","3otm6AgJHQ","M6qcGZhwG1","xciqpQYxC0","YOfrYZv7z0","fmIK1tl72W","fLNg8i3pyd","aDGtS580YD","vOqCEm4bxU",
+"hYBCKciuWz","7lUXZwiHrZ","UmaEvtAOsr","Cfgr3ix74r","VBjhzECMvU","n1pmOQWxoT","IjTwPVNCPd","K4GS8FPfSE","FFDuipiJSk","uTacxAXpwE",
+"RpBQmS77LH","BGaQYSs0Zu","Vprf2AmdQd","a00b5MmsIo","5VZjSt98iW","0Wr5y8FmFH","ogLgcyvOMI","5drc6zY1GY","Vprf2ZUnqt","5IhmG7ku1p",
+"sqVrfStlDJ","taOXKrhl0J","WPmlxO3iyQ","VIlwP8FmFH","faHir9eoRc","v8yFNt98iW","7fsYMThjNn","29QAz2Nslm","EoToPni2v1","hE1QliKqhr",
+"jzUqRLewvM","MmsIoSs0Zu","o8UydW3VFH","Gv3FqS77LH","fcwDahYBCK","16lHcOz8yZ","HP433Pb1pa","8cVD3JIqXi","NhXduS2Dfu","7hyVvsuY4x",
+"azIWpzqH0W","pWiOsTa8f6","RsQUqFjHXR","2DREsiB08l","fFDrJQ6hMC","4W0Tlx3LDe","h1zcHZzJHW","v1HlnJJs5m","aL6AJciuWz","W7cTsQssNC",
+"8hJdt8FmFH","Yh1hFvLsmS","VBjhzLDk6f","uN6r3sqVrf","jSjS3FPfSE","NAFuwK20wK","okgRiPb1pa","RkQkepFrrl","jtn0X2DREs","faHirfcJOy",
+"qUJMda00b5","GSQwjzbIYY","CIShG1v5hH","RpBQmsuY4x","AXpwE0MR5X","uZPqgAkKTk","P6bcgFjHXR","B3qematef2","DLhzMNAFuw","mX2GEv1Hln",
+"CqqaDRzaZA","uoStw7Ow5C","pAhR1SmGzv","48cHLydG8U","MaJQsW3VFH","bZLvSiwzGk","ru4UGcShY2","uJScXblLA9","29QAzLbRTH","fcwDafFDrJ",
+"vOqCEQssNC","P6bcgRACuj","aL6AJFxX9q","cShY2OUYuF","fLNg8Vprf2","Ul4a129QAz","IBe8k2Nslm","blLA97Ow5C","HlUbFpvgjS","0h1b1MmKGJ",
+"7X3uyG1RhS","Oz8yZGrDg7","7X3uy5VZjS","tl72WuN6r3","9iGoTokgRi","U3yw5h1zcH","n8pJ9QClRL","WMiS3Waim6","qUJMdgtCA5","64s8NHzZT8",
+"pAhR17Ow5C","RsQUqOHaBz","8U2nUguMb8","P6bcgpv0i7","2DREs6AFT0","tvdkDY1mC0","64s8NUl4a1","i3pyd14FLR","faHirRACuj","AgJHQs7Mxk",
+"yvOMI2Nslm","zmLYDt59lR","rKDLJ45cIH","zbIYYlpF6W","cL0aES77LH","WDVWJFcWrW","cL0aEFNYIM","qaofNcShY2","MaJQs5Drn0","PYBf4zqH0W",
+"Yf2EcW3VFH","xXTI46q6L9","TCgPpP6bcg","pT8wufcJOy","TXQ0ZtuDyS","Pb1pa9y4lw","FNYIMbZLvS","fcJOyW3VFH","a00b5YjB9t","uLtKst59lR",
+"CK5W75ZaEz","qQxHPZzJHW","5IhmGFPfSE","GWqqXazIWp","Cfgr3gjUTu","48cHLRpBQm","NhXduUlU3M","guMb8jtn0X","hE1QlFPfSE","16lHcReKEW",
+"uLtKsTCgPp","pmeCdVBjhz","pAhR1Chuy3","UlU3M5Namm","TwanoThjNn","2ZHdkQWxoT","DQimpe6e4z","iKqhrQnJ1S","yluBxLewvM","HRxd87Ow5C",
+"QWxoTGSQwj","n8pJ9RACuj","v1HlnaDGtS","azIWp5drc6","BFkb8okgRi","jeskSKZamH","0PktIQ6Lix","EoToPBFkb8","pmeCdW7cTs","hSSvQuN6r3",
+"I7p2aCfgr3","TXQ0ZGrDg7","sx5Gl16lHc","Z4I1v5nmWv","xReecFwEJz","uPX7GPb1pa","v1HlnOHaBz","dQ586sqVrf","8xEKzn8pJ9","MaJQsVjCZq",
+"KsjRKdhSuH","OHaBzSbRYy","M6qcGHP433","vOqCEhe9IA","F6PT2Q6Lix","P6bcg0YAGH","lXFOBYh1hF","brhlQWmadA","uAWypLewvM","jSjS3BCxeC",
+"rz7Utsoy9t","uoStwtlILt","euZA5gdQsS","RzaZAdQ586","oQ87roQ87r","mz8gxWreyP","FxX9qDz1R3","pAhR11v5hH","5VZjSzHF1q","Ul4a12TRI7",
+"zHF1qe6e4z","y94nwQClRL","ZUnqtB3qem","qUJMdAgJHQ","XyPZNyEfy9","2hEEUUvlv4","okgRinnP8o","iwzGkS77LH","StlDJdmoS7","GXdoH55rfB",
+"HP4330YAGH","4QMc9Zv7z0","okgRiJJs5m","VLTy6JKWYR","FGzgpeuZA5","RzaZA48cHL","3otm6WaWsv","piJSkIRh48","WMiS3pAhR1","WDVWJF6PT2",
+"EdBKcOHaBz","xReeclweGy","5Mg9rS77LH","cmXIXFjHXR","zQt6Qfqypy","XflUqNcICA","FVMxoK20wK","tuDySFNYIM","14FLRyofH3","AgJHQY1mC0",
+"29QAzpT8wu","QWxoTF6PT2","tuDyS8TxD7","yToGWWMiS3","IjTwPReKEW","kZANmFPfSE","d7vjMaDGtS","ogLgchSSvQ","MK07YYf2Ec","HfyNQMK07Y",
+"EOE1otjQxs","VjCZqYw2oU","brhlQAmdQd","Ul4a1ZUnqt","45cIH5Namm","n1pmOS2Dfu","FxX9qU3yw5","P6bcgCqqaD","faHirhe9IA","1v5hH7X3uy",
+"W7cTs2ZHdk","VBjhz0MR5X","X6PinWDVWJ","uN6r348cHL","DG4sTReKEW","OUYuFM3zXL","HRxd8mz8gx","VerEA5iGN5","MmKGJLewvM","YjB9tlViBv",
+"SbRYycL0aE","AIYUuFhtgl","TwanoKr8ys","QChxsTXQ0Z","TCgPpIn3NS","7ku1pZ4I1v","5iGN5FcWrW","lCMxyn1pmO","XflUqtjQxs","DcpWBy94nw",
+"SbRYyjeskS","IjTwPuAWyp","DcpWBaFFss","2Yz7E8FmFH","uJScXChuy3","yToGWS2Dfu","9rlg9ZhwG1","5drc6fLNg8","RsQUqGXdoH","ZUnqtru4UG",
+"Uvlv4G1RhS","zqH0W2ZHdk","bgJAzKsjRK","S77LHcmXIX","6AFT0xXTI4","3otm6s93Ml","9GXkXDcpWB","FwEJzy94nw","Yh1hFMGlTF","wiHrZXyPZN",
+"lXFOBO3iyQ","RACuj07n1c","Dz1R3QClRL","jSjS3lj07Q","BFkb8y94nw","2TRI7blLA9","uJScXbrhlQ","iqv4kvkCHH","Y1mC024ARF","jS1ajPOUYS",
+"7lUXZPOUYS","9rlg98RCUA","zY1GYFFDui","FwEJzksJby","t59lRciuWz","ECMvUCK5W7","tuDySYw2oU","6q6L955rfB","zmLYDMaJQs","okgRiFnPFB",
+"0h1b1prNT6","uupzkS2Dfu","brhlQAgJHQ","oVQp6kB5nP","HzZT8JXljW","OUYuFFjHXR","s4786JXljW","K4GS8ni2v1","yToGWix74r","hSSvQ5Drn0",
+"16lHcTCgPp","wiHrZpFrrl","FNYIMuZPqg","mz8gxo8Uyd","piJSk6AFT0","kB5nPRmDcr","dpe1v5iGN5","VIlwPReKEW","5Drn0rKDLJ","0Wr5y2Nslm",
+"aL6AJfaHir","PYBf4UlU3M","IjTwPs4786","6q6L9SmGzv","6AFT0X6Pin","Ta8f67Ow5C","FPfSEOUqFM","SjskQQYxC0","0KyfsMkgy8","OHaBzyluBx",
+"HP433Ta8f6","lViBvSmGzv","FhtglaFFss","POUYSoGu6x","FwEJzU3yw5","qQxHPK20wK","8xEKztlILt","ogLgcdpe1v","lH1ktWaWsv","In3NS7fKYU",
+"pT8wu2Yz7E","Q6hMCksJby","he9IA6AFT0","vkCHHs4786","gIYvEGWqqX","AXpwED6rBy","RsQUqgdQsS","yofH3prNT6","vLsmSoVQp6","Waim6KsjRK",
+"YjB9t5IhmG","LbRTHSs0Zu","Y1mC0yvOMI","jzUqR1j5L8","yvOMI8cVD3","HfyNQt98iW","5VZjSoGu6x","vkCHHciuWz","gf8rIHzZT8","QnJ1SOz8yZ",
+"CdyBVzHF1q","piJSk0YAGH","kZANmKZamH","lCMxyfcJOy","s4786wiHrZ","No0QbpvgjS","8FmFHYjB9t","55rfBjzUqR","8hJdt5Namm","lCMxygf8rI",
+"Ul4a1ogLgc","oQ87rs7Mxk","HfyNQ580YD","VBjhze6e4z","NcICARACuj","yluBxx3LDe","BCxeCQChxs","5NammgIYvE","jiVBPWaim6","cQOnvoGu6x",
+"GrDg7m4bxU","RACujFwEJz","fLNg8d85a9","Vprf2tvdkD","UlU3MdmoS7","AXpwEKsjRK","KZamHI7p2a","Yh1hFUmaEv","RzaZAEdBKc","JJs5mYOfrY",
+"5nmWv2TRI7","Cfgr3lm0pD","MmsIozY1GY","8cVD36q6L9","ksJbyxXTI4","No0QbIKxdL","hE1QlOz8yZ","IRh48hi5X7","Mkgy89rlg9","hSSvQeuZA5",
+"t59lRNxx9V","NOHszC2Irc","x3LDeCp3mZ","8xEKzt98iW","BCxeCblLA9","hYBCKx3LDe","NhXdupAhR1","HzZT8fcJOy","uoStw9y4lw","piJSkX6Pin",
+"bgJAza00b5","AgJHQRsQUq","VLTy6O3iyQ","SmGzvtvdkD","5Drn0RkQke","BbwgAzQt6Q","xXTI4oVQp6","uvf7ACfgr3","Kr8ysNxx9V","gf8rIAkKTk",
+"IKxdLVjCZq","jiVBPDcpWB","yEfy9BGaQY","hUTw7uLtKs","lj07QXyPZN","8xEKzpAhR1","2ZHdkazIWp","5NammxXTI4","BpYhV2ZHdk","7ku1pFnPFB",
+"oGu6xX6Pin","MmsIo8hJdt","jfREu0MR5X","k85AeJIqXi","brhlQjS1aj","KASQ8Zv7z0","JXljWRpBQm","3otm6zQt6Q","7lUXZRpBQm","cmXIXSmGzv",
+"MaJQsGSQwj","pFrrlSbRYy","NOHsz7Ow5C","dQ586FGzgp","29QAz2DREs","Yw2oU9GXkX","vkCHHpWiOs","NOHszLbRTH","b29RJ5Drn0","tvdkDQWxoT",
+"rz7UtIRh48","Q6LixyEfy9","AXpwEHP433","aFFsstjQxs","dmoS7VIlwP","8RCUA5drc6","kB5nPydG8U","zFgtBv2eC3","OUYuF8RCUA","QssNCNOHsz",
+"07n1cuN6r3","QYxC0v8yFN","Yf2EcGv3Fq","guMb8t59lR","8cVD3Yh1hF","lweGyI7p2a","k85AeK20wK","Yh1hFuLtKs","sqVrfWDVWJ","P6bcg9eoRc",
+"ZhwG1HlUbF","yvOMINhXdu","BCxeCK4GS8","8xEKzoVQp6","prNT6bgJAz","7lUXZCdyBV","yofH3hYBCK","JRJQB2ZHdk","5nmWvJIqXi","ru4UGv2eC3",
+"7fsYM580YD","gdQsSQWxoT","pWiOspvgjS","IKxdLjtn0X","x3LDe9rlg9","W7cTsv1Hln","uN6r3l83Ud","Dz1R3d85a9","ulk41FxX9q","8cVD3FVMxo",
+"kB5nP8U2nU","jeskS5nmWv","lpF6W07n1c","BbwgAQ6Lix","D6rBy0MR5X","CdyBVmX2GE","4dEz6pv0i7","h1zcHt59lR","Cfgr3XflUq","Gv3FqRBhp0",
+"J2mQi8FmFH","07n1cIBe8k","NcICAVIlwP","K4GS8oQ87r","tl72WTCgPp","lH1ktZzJHW","ciuWz48cHL","ZhwG1Mkgy8","uupzkQ6Lix","CIShGrhl0J",
+"5iGN5v2eC3","rhl0JKASQ8","Oz8yZK4GS8","qUJMdOHaBz","faHirlXFOB","7fKYUKsjRK","BFkb84W0Tl","zz4ZU7ku1p","dhSuHzQt6Q","DcpWBix74r",
+"5iGN5580YD","B3qemYh1hF","HlUbF9iGoT","GWqqX2ZHdk","Dz1R30ao3l","Gv3FqtaOXK","0YAGHuZPqg","5iGN5uupzk","DcpWBUl4a1","atef2Ta8f6",
+"yEfy9ydG8U","Cp3mZWaWsv","RsQUqzY1GY","Pb1pa1LB1L","tvdkD0BmCy","0Wr5y4W0Tl","UmaEvlweGy","FxX9q8cVD3","cShY2QnJ1S","ReKEWIBe8k",
+"ciuWz3otm6","rKDLJZzJHW","5nmWvNxx9V","Yf2EcM3zXL","bZLvSOxWIH","xXTI48TxD7","S2DfuUmaEv","sqVrfJRJQB","GrDg7OUYuF","8U2nUzY1GY",
+"LDk6fyofH3","WreyPY1mC0","uvf7AFhtgl","lH1ktiwzGk","7hyVvsqVrf","VIlwPXflUq","TCgPpTwano","uupzkQWxoT","MmsIoVprf2","s47865VZjS",
+"lkMUA7fKYU","okgRizFgtB","HP43316lHc","YOfrYMm8si","atef2HfyNQ","6q6L9OUqFM","SjskQlXFOB","zFgtBfLNg8","CdyBVOxWIH","sqVrfIBe8k",
+"Kr8ysWaim6","e6e4zFLsph","CqqaDpT8wu","MmKGJLbRTH","0ao3l7X3uy","d85a9FxX9q","PYBf4RmDcr","rhl0Jxciqp","taOXKQChxs","gf8rIyluBx",
+"Vprf2JIqXi","uupzkPb1pa","FnPFBW7cTs","RsQUqCdyBV","S77LH7Ow5C","Qworu7Ow5C","zbIYY2DREs","0BmCy8U2nU","ulk41lViBv","C2IrcguMb8",
+"CK5W7SmGzv","i3pydFGzgp","G1RhSv1Hln","45cIHIKxdL","uupzktl72W","QChxsPYBf4","pT8wu0MR5X","djsrvOUYuF","hi5X7hE1Ql","B3qemCp3mZ",
+"AmdQd8RCUA","5iGN52hEEU","DG4sTuZPqg","oVQp6ix74r","brhlQWDVWJ","kB5nPDG4sT","yluBxBFkb8","Gv3FqCfgr3","d85a9okgRi","3weIFbgJAz",
+"RzaZAQbxXc","jfREufLNg8","uTacxTwano","VBjhzHfyNQ","Z4I1vAOgEe","kZANmogLgc","IjTwPix74r","v2eC3xXTI4","cQOnvCIShG","ydG8UoGu6x",
+"lCMxyIBe8k","BGaQYJKWYR","tuDySFjHXR","RpBQmSbRYy","CIShGlXFOB","d85a9JkzUn","SWfou5Mg9r","8FmFH0BmCy","fcJOyDQimp","VIlwP5Mg9r",
+"faHirdjsrv","aFFssJRJQB","oVQp62ZHdk","ZuDtDaDGtS","v1Hln0YAGH","iqv4kBbwgA","lViBvhi5X7","NhXduaL6AJ","Zv7z0atef2","RACujL7cGc",
+"dpe1vQssNC","WaWsva00b5","ZUnqt5drc6","jfREuhe9IA","gtCA5x3LDe","piJSkGrDg7","wiHrZHRxd8","pAhR18RCUA","DG4sTgf8rI","uQIczKsjRK",
+"brhlQB3qem","8hJdtBGaQY","SmGzvhSSvQ","RsQUqQYxC0","WDVWJ3weIF","LDk6fJIqXi","fcwDaIBe8k","CxVEf580YD","jtn0XMm8si","atef2GWqqX",
+"NOHszOz8yZ","PYBf448cHL","JJs5mi7WMQ","djsrvCNHmv","sqVrfuvf7A","SbRYy07n1c","s93MllsQGo","XyPZNThjNn","2Yz7EFPfSE","iwzGkCxVEf",
+"UmaEvYf2Ec","0MR5XBCxeC","14FLR7ku1p","C2IrcuTacx","HfyNQZ4I1v","5iGN5C2Irc","Q6hMCDcpWB","d7vjMFPfSE","dmoS7tvdkD","Ul4a1uJScX",
+"iB08l5drc6","FLsphEoToP","bZLvSGv3Fq","rKDLJUlU3M","In3NSdhSuH","m4bxUtAOsr","48cHLt98iW","gdQsSW7cTs","dQ586fmIK1","GWqqXfaHir",
+"ZzJHWzFgtB","S77LH9eoRc","HfyNQs7Mxk","zY1GYU3yw5","tvdkDpvgjS","vkCHHuPX7G","ksJbyECMvU","TwanouAWyp","s7MxkIn3NS","lm0pDHRxd8",
+"zFgtBDcpWB","2ZHdkuAWyp","5nmWvt59lR","i7WMQydG8U","HlUbFCxVEf","DQimpv2eC3","uAWypWreyP","VjCZqhYBCK","soy9tGWqqX","G1RhSNOHsz",
+"9iGoTIRh48","YjB9tYh1hF","IjTwPWreyP","jiVBPiKqhr","wiHrZvkCHH","ZzJHWFxX9q","zqH0WSmGzv","faHiraDGtS","9GXkXuAWyp","PYBf4SbRYy",
+"BbwgAHzZT8","uQIcz07n1c","Yh1hFMK07Y","ni2v1atef2","sqVrf9iGoT","QWxoTxXTI4","yvOMI2hEEU","gdQsSgf8rI","BpYhV5IhmG","aFFsst59lR",
+"BFkb8zbIYY","s93MlzY1GY","ru4UGHRxd8","TXQ0ZX6Pin","uAWyp1LB1L","lCMxylm0pD","Yf2EchUTw7","8cVD35ZaEz","9XyT9VBjhz","G1RhSBCxeC",
+"DLhzMtl72W","IKxdLNhXdu","kB5nP1v5hH","gtCA5vkCHH","7lUXZhUTw7","xReecuLtKs","FxX9qcShY2","Kr8yst59lR","okgRi6q6L9","HP433AmdQd",
+"uLtKsfFDrJ","YjB9tjSjS3","tl72W0PktI","DG4sTGv3Fq","9eoRc8FmFH","CdyBVt98iW","ECMvUhE1Ql","SjskQqQxHP","cmXIXdpe1v","oQ87rwiHrZ",
+"yEfy9uZPqg","Mkgy80Kyfs","uPX7G16lHc","45cIHMm8si","9iGoT9rlg9","ciuWz0Kyfs","S77LHrz7Ut","8xEKzpmeCd","QbxXcMojnP","QnJ1SVjCZq",
+"ulk410ao3l","9XyT98cVD3","zz4ZUFnPFB","cL0aETCgPp","zFgtBcQOnv","RpBQmLbRTH","JJs5mXflUq","WmadAzmLYD","yvOMIDz1R3","ni2v1QbxXc",
+"Oz8yZ24ARF","55rfBpvgjS","t59lRGXdoH","2ZHdkciuWz","qQxHPzFgtB","qUJMdxReec","UlU3MlH1kt","580YDfqypy","pmeCdDz1R3","lj07QaFFss",
+"5nmWvDG4sT","i3pydKsjRK","FwEJzHfyNQ","n8pJ9OHaBz","MezSWzbIYY","9GXkXoQ87r","blLA9prNT6","AIYUuZUnqt","nnP8oZ4I1v","YOfrYTCgPp",
+"he9IApWiOs","gdQsSQYxC0","sqVrfM6qcG","W3VFHzY1GY","CIShG45cIH","yEfy9ZJTXH","Q6LixQYxC0","zmLYDa00b5","uPX7GRmDcr","KZamHEOE1o",
+"qaofNsqVrf","pAhR1zbIYY","Ul4a1K4GS8","k85Aes7Mxk","5nmWvW3VFH","hE1QlG1RhS","QnJ1SeuZA5","y94nwhi5X7","RxrsmCNHmv","AXpwEQClRL",
+"QClRLS77LH","GSQwji7WMQ","TXQ0ZQbxXc","VerEAStlDJ","tl72W4W0Tl","ThjNnAIYUu","pAhR107n1c","Fhtglv1Hln","GWqqXpT8wu","GSQwjlpF6W",
+"WmadA7Ow5C","8TxD7UlU3M","guMb8k85Ae","iKqhrtaOXK","B3qemRsQUq","8TxD7m4bxU","Q6hMCHP433","guMb8VBjhz","OUYuFFwEJz","aez9yd7vjM",
+"DLhzM9GXkX","EOE1olXFOB","dpe1vt98iW","Yh1hF4W0Tl","1v5hHv1Hln","mX2GE2DREs","VBjhzQClRL","t98iWKASQ8","FnPFBNo0Qb","uAWypPOUYS",
+"Yf2EcrKDLJ","CxVEf3otm6","O3iyQ5VZjS","pvgjSzqH0W","1v5hHU3yw5","F6PT2FcWrW","zFgtBtl72W","Cfgr3tvdkD","29QAzzFgtB","U3yw57fsYM",
+"OHaBzNOHsz","KsjRKW7cTs","rz7Ut8TxD7","Oz8yZ6q6L9","L7cGchE1Ql","lCMxyJXljW","JKWYRCNHmv","MGlTFQnJ1S","UmaEvsqVrf","gdQsSaFFss",
+"dhSuHHP433","0Wr5yMmKGJ","ogLgcZUnqt","SbRYyhi5X7","29QAz16lHc","2ZHdkQClRL","J2mQiOHaBz","FPfSErKDLJ","v2eC3tl72W","pT8wuyluBx",
+"aez9y5Drn0","jeskS5iGN5","nlaByfcJOy","zY1GYzHF1q","CdyBVwiHrZ","iB08lRmDcr","uN6r3prNT6","Z4I1vn1pmO","8hJdtuTacx","aL6AJHfyNQ",
+"nlaBywiHrZ","zqH0W5IhmG","Dz1R3xXTI4","DG4sTVBjhz","ogLgcFLsph","Chuy3guMb8","9XyT99GXkX","P6bcgxReec","3otm6uPX7G","OxWIHaez9y",
+"dhSuHfqypy","hYBCKIBe8k","blLA9WmadA","zmLYDlCMxy","nlaByMGlTF","HP433HRxd8","4dEz6bZLvS","S2Dfui3pyd","8xEKzCqqaD","Kr8ysBbwgA",
+"O3iyQUlU3M","uLtKsb29RJ","Chuy3zmLYD","8U2nUBGaQY","9iGoTY1mC0","tjQxsxXTI4","taOXKOxWIH","VjCZqUlU3M","hYBCKTwano","W3VFHPb1pa",
+"BGaQYAIYUu","ECMvU64s8N","cL0aElj07Q","Chuy3QbxXc","iwzGk6q6L9","jS1ajzqH0W","mX2GE4W0Tl","nFqikvLsmS","VNCPdFxX9q","QWxoTprNT6",
+"FhtglECMvU","s93Ml0Kyfs","v8yFND6rBy","NhXdu9eoRc","lpF6WnnP8o","PYBf4d7vjM","M6qcGPOUYS","24ARFyEfy9","NcICAXyPZN","2ZHdkIRh48",
+"Vprf2LewvM","GXdoHgIYvE","qQxHPcL0aE","ydG8UqUJMd","uQIczUmaEv","AkKTkru4UG","QClRLhE1Ql","fcJOyBFkb8","uupzkdpe1v","CIShGCIShG",
+"IBe8krKDLJ","JkzUn7fsYM","uZPqg0MR5X","lm0pDaFFss","AIYUuVerEA","5drc6BCxeC","fFDrJuvf7A","NAFuwlweGy","QYxC0yvOMI","pmeCdWmadA",
+"uZPqgVBjhz","SmGzvqaofN","y94nwgjUTu","i7WMQWMiS3","prNT6NOHsz","Mm8sidQ586","9XyT9RzaZA","wiHrZBFkb8","Ss0ZuCNHmv","CK5W7IBe8k",
+"7ku1pFGzgp","RmDcrM3zXL","uupzkEOE1o","K4GS8Nxx9V","M6qcGOUqFM","M6qcGFwEJz","fqypy7lUXZ","uPX7GFLsph","AmdQd5ZaEz","gf8rIazIWp",
+"h1zcHtAOsr","ru4UGwDajX","StlDJuupzk","yluBxjiVBP","P6bcgQworu","2hEEUQChxs","fmIK1uupzk","GrDg7l83Ud","cmXIXlViBv","LewvM5drc6",
+"iB08lfcJOy","2ZHdkJkzUn","CIShGRpBQm","MK07YRkQke","pv0i7Vprf2","iqv4kPOUYS","OUqFMnFqik","ZhwG1sqVrf","djsrvs93Ml","2Nslm07n1c",
+"cQOnvazIWp","aFFsszz4ZU","HP433IBe8k","BpYhVtvdkD","lCMxyMojnP","xXTI4U3yw5","3weIFn1pmO","9iGoTpT8wu","k85Ae29QAz","IKxdLJRJQB",
+"MGlTFwiHrZ","DLhzMhYBCK","7X3uyFGzgp","FwEJzEoToP","vLsmS6AFT0","7Ow5CF6PT2","zHF1qtvdkD","1j5L8QChxs","0Wr5yvLsmS","QClRLVBjhz",
+"x3LDedpe1v","W7cTsOz8yZ","Pb1paSmGzv","hSSvQNOHsz","29QAz9iGoT","QnJ1S5drc6","16lHche9IA","qUJMdbrhlQ","iwzGk2Yz7E","FLsphAOgEe",
+"XflUqNhXdu","s4786cShY2","HlUbFHRxd8","7fKYUMmKGJ","0Wr5yaez9y","4QMc94QMc9","dmoS7FPfSE","Waim6pT8wu","FFDuix3LDe","Mkgy8BpYhV",
+"WmadAfaHir","yToGWCxVEf","nnP8oAXpwE","mz8gxRpBQm","BpYhVt59lR","xciqpVIlwP","lj07Q2Yz7E","dpe1v8xEKz","fmIK1Vprf2","rhl0JfaHir",
+"7fsYMsqVrf","aDGtS0h1b1","BCxeCyToGW","JIqXijfREu","W3VFHC2Irc","55rfBvkCHH","6q6L9cL0aE","0PktIulk41","atef2lH1kt","zz4ZUDLhzM",
+"DG4sTGWqqX","7hyVvlweGy","ZUnqtSs0Zu","S77LHiqv4k","Nxx9VZhwG1","MGlTFPOUYS","C2Irc1j5L8","MmKGJatef2","RsQUqn8pJ9","qUJMdmz8gx",
+"ni2v1kZANm","Z4I1vatef2","fmIK1nFqik","zFgtBJJs5m","HzZT8SWfou","IjTwPLDk6f","mz8gxdQ586","x3LDe5VZjS","mz8gxxReec","uQIcziqv4k",
+"yvOMIs7Mxk","AgJHQMK07Y","tuDySNhXdu","hi5X7QChxs","cQOnvprNT6","lViBvYOfrY","LDk6fOUqFM","6AFT08cVD3","cmXIXMojnP","TCgPpdmoS7",
+"07n1cuLtKs","gjUTu2ZHdk","TXQ0ZAgJHQ","9rlg9EdBKc","FcWrW6q6L9","zQt6Qh1zcH","vkCHHWDVWJ","uvf7AzqH0W","2ZHdky94nw","8U2nUBFkb8",
+"e6e4zCp3mZ","ydG8UNAFuw","QnJ1SNAFuw","ksJby9y4lw","RBhp0OHaBz","YjB9taez9y","7fsYMdQ586","jtn0XfcJOy","s4786taOXK","tuDyScL0aE",
+"RkQke8RCUA","5iGN5VLTy6","rhl0JcShY2","dhSuHCp3mZ","rKDLJ07n1c","0h1b1vLsmS","QChxs5drc6","LbRTHuAWyp","QbxXckZANm","cQOnvuupzk",
+"y94nwulk41","hSSvQWreyP","FGzgpfmIK1","5iGN5iKqhr","nnP8o0PktI","ksJbyzbIYY","faHirKsjRK","jeskSfqypy","n8pJ9dmoS7","No0Qbgf8rI",
+"KsjRKSbRYy","6q6L9pAhR1","TCgPpMmsIo","8FmFHdpe1v","ReKEWJJs5m","RxrsmG1RhS","X6Pinxciqp","Mm8siuAWyp","rhl0J2DREs","piJSkpWiOs",
+"lj07QokgRi","cmXIXuPX7G","4dEz6AXpwE","4W0TlCNHmv","yvOMIaL6AJ","2NslmpFrrl","ru4UGFNYIM","8xEKzZUnqt","QworupvgjS","7fsYMyluBx",
+"07n1cJkzUn","KASQ8I7p2a","VjCZqs93Ml","s93MlaDGtS","wiHrZ0MR5X","rKDLJfLNg8","K20wK0MR5X","NAFuwk85Ae","lViBvDG4sT","prNT6nFqik",
+"suY4xCK5W7","0h1b1Q6Lix","EdBKcM3zXL","ZUnqtmX2GE","VNCPdlXFOB","aL6AJSmGzv","lXFOBgIYvE","OxWIHuLtKs","MK07Y0ao3l","1LB1LCp3mZ",
+"iwzGkVjCZq","CIShGt59lR","WreyPGWqqX","nlaByazIWp","5iGN5pv0i7","a00b545cIH","M3zXLv2eC3","5Drn0FGzgp","BFkb89XyT9","n8pJ9IBe8k",
+"3otm6RsQUq","G1RhSNAFuw","xciqpQ6hMC","djsrvSs0Zu","P6bcgs7Mxk","DG4sTfaHir","Fhtgl6q6L9","v2eC3piJSk","i3pyds7Mxk","lweGylkMUA",
+"ni2v1zQt6Q","0KyfsBGaQY","JXljWqaofN","aDGtSnlaBy","bZLvS07n1c","BGaQYAmdQd","DcpWBl83Ud","4QMc9lkMUA","QssNClsQGo","1v5hHfcJOy",
+"AOgEennP8o","SmGzv0PktI","5NammlkMUA","WDVWJaL6AJ","IRh48cmXIX","oGu6xtuDyS","RxrsmMK07Y","MGlTF5drc6","fLNg8CdyBV","QssNCM3zXL",
+"zHF1qnlaBy","OxWIHCK5W7","KZamHCNHmv","MezSW2TRI7","FLsphXflUq","9XyT9cShY2","9iGoTv2eC3","ulk41W7cTs","gjUTu1LB1L","sqVrf0Wr5y",
+"nFqikYw2oU","QClRLVjCZq","1j5L8hUTw7","xXTI4FnPFB","3otm6JJs5m","W3VFHhi5X7","HP433gdQsS","16lHcLDk6f","ReKEWQbxXc","yToGW2TRI7",
+"Chuy364s8N","BGaQYXyPZN","QClRLhYBCK","xciqpMmKGJ","UlU3M1j5L8","S77LHnFqik","GXdoH1LB1L","0Wr5y7lUXZ","sx5GliwzGk","uTacxBFkb8",
+"DQimpjSjS3","CdyBVKZamH","gf8rI8xEKz","6AFT016lHc","pWiOsgjUTu","Vprf2suY4x","djsrv2Yz7E","s7MxkpiJSk","0ao3lHRxd8","MmKGJuPX7G",
+"DcpWBFVMxo","FPfSEdQ586","gdQsSFcWrW","07n1cQssNC","HlUbF8RCUA","Mkgy8WmadA","K20wKfaHir","0KyfszmLYD","yluBxvLsmS","VLTy6YjB9t",
+"Mkgy8EdBKc","VjCZq07n1c","QYxC02ZHdk","Dz1R3580YD","Gv3Fq4W0Tl","4W0TllCMxy","VIlwPSs0Zu","8hJdtuvf7A","48cHLPOUYS","cShY2Yw2oU",
+"HlUbFk85Ae","ru4UGiqv4k","v2eC3B3qem","Q6LixcQOnv","uTacxiqv4k","ReKEWQ6Lix","VNCPdWmadA","fLNg8SjskQ","aDGtSMm8si","ZzJHWHRxd8",
+"vOqCE5IhmG","VLTy6Fhtgl","zY1GYFGzgp","ZhwG1CdyBV","Ss0ZuOxWIH","s93MlMkgy8","Vprf21LB1L","YOfrYuPX7G","QnJ1SDz1R3","55rfBo8Uyd",
+"iqv4kciuWz","FxX9qCp3mZ","XflUq9rlg9","14FLRRACuj","HfyNQDG4sT","JJs5mnFqik","DLhzMRkQke","GSQwjlj07Q","Cfgr3CqqaD","aez9ynnP8o",
+"Zv7z08RCUA","kZANm7X3uy","9iGoTCxVEf","5ZaEzBbwgA","okgRiyluBx","SWfou6AFT0","pvgjSD6rBy","zHF1q14FLR","No0QbAgJHQ","RACujciuWz",
+"uAWypmz8gx","16lHcl83Ud","l83UdGSQwj","Mkgy8QbxXc","D6rByDLhzM","dmoS7EdBKc","suY4xpAhR1","K4GS81j5L8","6q6L9KASQ8","FFDuiuupzk",
+"jiVBPGrDg7","Yh1hFFVMxo","lkMUAjS1aj","7Ow5Cni2v1","VNCPdm4bxU","In3NS0ao3l","64s8NFcWrW","uJScXfFDrJ","1LB1L5iGN5","RzaZAAXpwE",
+"48cHLO3iyQ","FFDuiDG4sT","RBhp08U2nU","VLTy6HRxd8","lj07Qo8Uyd","x3LDeK20wK","yvOMI7fsYM","piJSk2DREs","AmdQd9iGoT","RmDcrlH1kt",
+"ReKEWwDajX","AgJHQC2Irc","blLA9KZamH","ulk41ZzJHW","FwEJziqv4k","5iGN53weIF","iqv4kdmoS7","FhtglMK07Y","aL6AJZv7z0","ThjNnzbIYY",
+"VjCZqAXpwE","L7cGc5Mg9r","i3pyduAWyp","i3pydQWxoT","OHaBzKZamH","S77LHJkzUn","QChxsUmaEv","B3qemDLhzM","64s8NMK07Y","5iGN5pWiOs",
+"djsrv3otm6","45cIHhUTw7","ReKEWFGzgp","VLTy65Namm","yToGWYh1hF","iwzGkiB08l","ru4UGQbxXc","Ul4a1PYBf4","24ARFEdBKc","Twanod7vjM",
+"zz4ZUi7WMQ","NcICACqqaD","atef2Mm8si","pWiOsC2Irc","lsQGo8cVD3","JRJQBY1mC0","lpF6WTCgPp","YOfrYL7cGc","lCMxyoQ87r","FjHXRRACuj",
+"Y1mC0iKqhr","lCMxy5IhmG","Cp3mZzHF1q","1v5hH6AFT0","gjUTu1v5hH","VBjhzfLNg8","MezSWYf2Ec","zqH0WzHF1q","Ta8f6qQxHP","HP433tlILt",
+"xciqp7fKYU","ZUnqt16lHc","07n1c6q6L9","5Mg9rLewvM","ZhwG1KASQ8","zFgtBAgJHQ","nFqikvOqCE","B3qem9GXkX","7ku1pgf8rI","zQt6Q1j5L8",
+"XyPZNrz7Ut","LDk6fsx5Gl","Uvlv4uTacx","WmadABpYhV","8hJdtuPX7G","RkQkeQworu","s7MxkcShY2","MezSWZv7z0","LDk6fa00b5","ZUnqtAgJHQ",
+"0BmCy5VZjS","zqH0WGWqqX","pT8wuX6Pin","Waim6CdyBV","ZuDtD2hEEU","No0Qb8cVD3","0h1b1CIShG","4W0Tlrhl0J","0BmCyK20wK","e6e4z5ZaEz",
+"D6rByJJs5m","K20wK8xEKz","AmdQdRsQUq","hYBCKdmoS7","3weIF7hyVv","guMb8y94nw","pvgjSpv0i7","BCxeC7fKYU","5Drn0qUJMd","9eoRclH1kt",
+"8cVD3lCMxy","EOE1oX6Pin","FPfSEWMiS3","0BmCyvLsmS","tlILtn1pmO","ksJby9XyT9","prNT6OxWIH","B3qemFPfSE","y94nwSbRYy","0Wr5y5IhmG",
+"M6qcGh1zcH","lH1ktDQimp","uLtKso8Uyd","VIlwPiwzGk","qaofN7hyVv","vLsmSLDk6f","W7cTs3weIF","wiHrZiwzGk","taOXKuN6r3","TXQ0ZHzZT8",
+"MK07YFLsph","JIqXi5drc6","16lHcfmIK1","RxrsmZhwG1","tAOsrZJTXH","CK5W7Ul4a1","5IhmG8hJdt","sx5Gls7Mxk","t98iWKZamH","9y4lwEoToP",
+"nFqikciuWz","OHaBzQWxoT","AkKTkpvgjS","sqVrfuPX7G","AgJHQ2ZHdk","o8UydQWxoT","x3LDev1Hln","t59lRGWqqX","nFqiknFqik","e6e4zkZANm",
+"ciuWzlH1kt","JXljWkB5nP","0YAGHguMb8","FLsphFLsph","K4GS8WDVWJ","Yh1hFOHaBz","7fKYU7X3uy","lsQGouLtKs","07n1c14FLR","o8UydjSjS3",
+"FPfSEnFqik","tuDyS48cHL","lH1ktPOUYS","QnJ1SQ6hMC","Oz8yZzY1GY","ECMvUQbxXc","pFrrlF6PT2","lweGyPb1pa","9XyT9nFqik","WPmlxGv3Fq",
+"Yf2EcKASQ8","GXdoH0PktI","h1zcHlpF6W","ulk41guMb8","zbIYYydG8U","VerEATwano","JRJQBNhXdu","xciqpoQ87r","lH1ktuTacx","7fKYUciuWz",
+"G1RhSVNCPd","ZhwG1BpYhV","zqH0WgIYvE","QnJ1SxReec","S2DfunlaBy","MaJQsRmDcr","DG4sT2TRI7","iKqhrGv3Fq","oQ87rzbIYY","0Wr5yFVMxo",
+"uJScXhE1Ql","s4786jS1aj","yofH3DG4sT","pmeCdKr8ys","taOXKdQ586","vLsmSUvlv4","prNT6gdQsS","O3iyQtjQxs","zQt6QWaWsv","JkzUnfFDrJ",
+"S77LHVprf2","WaWsvIjTwP","zY1GYsqVrf","L7cGcWaWsv","dQ586qQxHP","QnJ1S48cHL","brhlQFxX9q","HlUbFWreyP","9iGoThi5X7","rz7Utv2eC3",
+"nFqikpvgjS","Waim6UlU3M","zbIYYzHF1q","FcWrWbrhlQ","8TxD7Kr8ys","djsrv6q6L9","64s8NFNYIM","5iGN5S2Dfu","HzZT8VNCPd","1j5L8sx5Gl",
+"HRxd84QMc9","9GXkXhUTw7","Vprf2RACuj","yluBxv1Hln","OUqFM0Kyfs","2Yz7E5iGN5","hi5X7P6bcg","y94nwgtCA5","B3qemFLsph","AkKTkuLtKs",
+"uJScXRACuj","ECMvUDcpWB","oGu6xMGlTF","Z4I1vtvdkD","0YAGHgjUTu","a00b5Yw2oU","CqqaDOHaBz","14FLRWaim6","pv0i7jiVBP","tl72WVBjhz",
+"5IhmGDLhzM","sx5Gl7ku1p","l83UdyvOMI","MmsIoprNT6","prNT6Cfgr3","29QAzjiVBP","OHaBzfmIK1","jtn0X3otm6","wDajXmX2GE","HfyNQrhl0J",
+"W3VFHFcWrW","L7cGcGrDg7","jSjS3Chuy3","MmKGJhe9IA","AOgEetl72W","v2eC3uZPqg","xXTI4ECMvU","9rlg9Uvlv4","ZuDtDVIlwP","pvgjS7Ow5C",
+"8xEKz64s8N","LewvMcmXIX","NhXdujeskS","pWiOsVprf2","MojnPVBjhz","6q6L9vOqCE","lXFOBQ6Lix","AXpwEjfREu","lm0pD580YD","uLtKsRzaZA",
+"Kr8ysMmsIo","VBjhz5Namm","k85AeuPX7G","JkzUnCqqaD","7lUXZUvlv4","xXTI4tvdkD","AXpwE0PktI","fLNg8Yf2Ec","d85a9djsrv","W7cTszz4ZU",
+"b29RJEoToP","9iGoT2hEEU","2ZHdkh1zcH","vkCHH7fsYM","jfREuprNT6","Uvlv416lHc","ZJTXH1j5L8","QbxXcoVQp6","m4bxUVjCZq","MaJQsFGzgp",
+"B3qemzFgtB","RBhp0VIlwP","EOE1oiKqhr","JJs5mfaHir","POUYS7ku1p","rKDLJFLsph","NAFuw5Mg9r","AXpwEJ2mQi","OUqFMDz1R3","iB08lVjCZq",
+"lpF6W0PktI","zz4ZUReKEW","gtCA57hyVv","HP433HlUbF","0Wr5y1LB1L","55rfBGrDg7","CK5W7jiVBP","FhtglAXpwE","zqH0WCIShG","bZLvSVBjhz",
+"AIYUuU3yw5","2DREsStlDJ","F6PT2ciuWz","AgJHQcQOnv","jSjS3ksJby","yluBxTCgPp","yofH3ni2v1","wiHrZ5Namm","9y4lwM6qcG","DcpWBIKxdL",
+"wDajX1LB1L","zbIYYVLTy6","1j5L87fKYU","JJs5mkZANm","xReecNOHsz","OHaBzjeskS","MK07YyluBx","i3pydhSSvQ","StlDJQnJ1S","WDVWJAgJHQ",
+"he9IAaL6AJ","NAFuwVjCZq","jiVBPhe9IA","Mm8siUvlv4","IjTwP9iGoT","CqqaDQssNC","RsQUqDG4sT","EOE1oyvOMI","nnP8oTCgPp","s4786tlILt",
+"taOXKLbRTH","ZJTXH1v5hH","NhXdubrhlQ","atef2cQOnv","ksJbyiB08l","ulk41d7vjM","9rlg948cHL","i3pydEOE1o","BCxeCNo0Qb","M6qcGx3LDe",
+"S2DfuFwEJz","rKDLJvkCHH","fLNg83otm6","zbIYYyToGW","S2DfuTCgPp","6AFT0x3LDe","bZLvSiKqhr","4QMc9o8Uyd","nFqiks93Ml","rKDLJXflUq",
+"xciqpC2Irc","yluBxyvOMI","zHF1qFPfSE","l83UdQssNC","jiVBPMm8si","iwzGkmz8gx","uTacx2Yz7E","2ZHdkaez9y","kZANmQWxoT","Q6hMCPYBf4",
+"1LB1LI7p2a","AkKTkbZLvS","ZJTXHPOUYS","MGlTF2hEEU","BFkb82Yz7E","qQxHPdjsrv","U3yw5CK5W7","yEfy99GXkX","7Ow5CwDajX","Ss0ZuKsjRK",
+"I7p2aS2Dfu","WmadANOHsz","MK07Yiqv4k","9rlg9lpF6W","KASQ8GXdoH","4QMc9jfREu","Q6LixTXQ0Z","GXdoHiB08l","Q6hMC8FmFH","DcpWBdjsrv",
+"RACujW3VFH","AmdQdO3iyQ","UlU3MFxX9q","jS1ajs93Ml","B3qemJRJQB","MaJQsydG8U","uoStwJRJQB","uvf7AjzUqR","aDGtSBGaQY","CNHmvfLNg8",
+"Z4I1vZhwG1","iB08lqaofN","VIlwP5Namm","MezSWtAOsr","SjskQZuDtD","J2mQijiVBP","FGzgprhl0J","2NslmfLNg8","2TRI7D6rBy","AkKTkFPfSE",
+"sx5Gl9eoRc","9XyT9WPmlx","ulk41RBhp0","yToGWfmIK1","brhlQ9eoRc","dQ586b29RJ","iKqhruN6r3","6AFT0o8Uyd","WPmlx9y4lw","b29RJzFgtB",
+"WDVWJaez9y","lXFOBLbRTH","L7cGceuZA5","I7p2aK4GS8","uZPqgHfyNQ","Chuy3s93Ml","9XyT9JXljW","dQ5860Wr5y","ni2v1VLTy6","14FLRbZLvS",
+"HfyNQtlILt","CNHmvEoToP","P6bcgIKxdL","Yw2oUQssNC","dmoS7L7cGc","FVMxoAmdQd","pAhR1yEfy9","gjUTuVerEA","RmDcraez9y","dQ586Kr8ys",
+"zz4ZURBhp0","n1pmOuoStw","ZhwG1lXFOB","sx5GlGv3Fq","WreyPQWxoT","DcpWBblLA9","KZamHbgJAz","tjQxsFPfSE","9y4lwDz1R3","ciuWziB08l",
+"xciqpFNYIM","h1zcH4W0Tl","zQt6QEOE1o","FxX9qtuDyS","d85a98TxD7","he9IAgjUTu","DcpWBprNT6","U3yw5WMiS3","Mkgy8oVQp6","OHaBzlH1kt",
+"zHF1qTCgPp","kB5nPoQ87r","m4bxUFcWrW","fLNg8azIWp","4QMc9Gv3Fq","uN6r3FPfSE","FnPFBjiVBP","lH1ktrhl0J","b29RJ64s8N","n1pmOzQt6Q",
+"dQ586G1RhS","cmXIX8U2nU","uvf7AjS1aj","k85AehE1Ql","HzZT8aFFss","b29RJD6rBy","FPfSE1LB1L","UmaEv9XyT9","QnJ1SWMiS3","64s8NTCgPp",
+"MojnPFPfSE","4dEz66q6L9","cShY2d7vjM","yvOMIMezSW","guMb8ReKEW","x3LDeuJScX","pT8wuzHF1q","2DREsb29RJ","oQ87rFPfSE","suY4xh1zcH",
+"3otm6In3NS","24ARFRACuj","Q6hMCMK07Y","BCxeCsx5Gl","8TxD7yluBx","MK07Yl83Ud","2hEEUOz8yZ","ZJTXHMaJQs","Nxx9VVLTy6","Mm8siJIqXi",
+"JXljW0h1b1","Mm8siWmadA","sqVrfpFrrl","nnP8ozY1GY","RpBQmcShY2","xciqp7ku1p","Mm8siYOfrY","FFDuibZLvS","uJScXv2eC3","0YAGHAXpwE",
+"gf8rIlweGy","Cp3mZi7WMQ","cL0aEUvlv4","580YDOUqFM","oVQp68hJdt","ix74rWaWsv","2DREsxXTI4","BGaQYlkMUA","HlUbFRkQke","he9IAjzUqR",
+"NhXduVBjhz","uPX7GpAhR1","Ss0ZuYOfrY","FxX9qzbIYY","Kr8ysydG8U","5nmWvZzJHW","MojnPd7vjM","HzZT8MK07Y","euZA5he9IA","FcWrWVNCPd",
+"RxrsmiKqhr","uTacxwDajX","W3VFHIRh48","lweGyYw2oU","v2eC3GSQwj","uvf7AxXTI4","pv0i7piJSk","hi5X7StlDJ","fcwDaQ6Lix","7fsYMTwano",
+"DcpWBO3iyQ","Gv3FqIKxdL","e6e4zNxx9V","zqH0W7lUXZ","OUqFMNhXdu","FnPFBQWxoT","nnP8oIjTwP","GSQwjK20wK","QbxXcKZamH","jS1ajWmadA",
+"48cHLMmKGJ","1LB1Lrhl0J","brhlQn1pmO","J2mQiuTacx","5VZjS7Ow5C","L7cGcFhtgl","suY4xYOfrY","bgJAzbgJAz","HlUbFpmeCd","2NslmlCMxy",
+"Ss0ZuyvOMI","qQxHPPOUYS","ThjNnqQxHP","Kr8ysEoToP","bgJAzDz1R3","pAhR1qQxHP","Fhtgl9XyT9","7fsYM7Ow5C","BCxeC29QAz","oQ87rCfgr3",
+"No0QbQChxs","lXFOBFxX9q","GrDg7BFkb8","qQxHPv8yFN","8cVD3dQ586","zqH0W0Kyfs","W3VFHMmKGJ","XyPZNdjsrv","qaofNQClRL","SjskQoVQp6",
+"lXFOBogLgc","lCMxyogLgc","cQOnvOz8yZ","fmIK1QChxs","VNCPdzbIYY","VLTy6WMiS3","soy9tjzUqR","zqH0WnFqik","FVMxoRBhp0","JRJQBJJs5m",
+"F6PT2s7Mxk","uJScXCdyBV","P6bcg2hEEU","nnP8os7Mxk","Oz8yZa00b5","LDk6fyToGW","7Ow5CCqqaD","IKxdLlH1kt","Chuy35iGN5","rhl0Jgf8rI",
+"ZUnqtReKEW","euZA51j5L8","aL6AJvOqCE","t98iWMmsIo","HzZT8okgRi","8RCUAHfyNQ","CIShGatef2","2NslmReKEW","0MR5XaDGtS","uupzkUl4a1",
+"ThjNnVIlwP","VBjhzwiHrZ","OUYuFiKqhr","QbxXcjSjS3","CqqaDyToGW","EOE1oRpBQm","s4786Cp3mZ","1v5hHv2eC3","zqH0WprNT6","5Drn0Qworu",
+"azIWpuLtKs","FwEJzMmsIo","Chuy3yvOMI","lm0pD6q6L9","PYBf4fqypy","EoToPfaHir","45cIHRkQke","Vprf24dEz6","OxWIH4QMc9","UmaEvK20wK",
+"i7WMQm4bxU","faHiry94nw","i3pydBCxeC","yToGWQWxoT","NAFuwCdyBV","ZUnqtW3VFH","Yh1hFGrDg7","No0QbfmIK1","8FmFHulk41","FVMxoCxVEf",
+"t98iWx3LDe","L7cGcCdyBV","t59lRjS1aj","jzUqRFNYIM","o8UydBFkb8","9eoRcGSQwj","sx5Gl8hJdt","Cp3mZYOfrY","AmdQdKr8ys","G1RhSix74r",
+"aDGtShSSvQ","S2DfuyofH3","Q6hMCsx5Gl","4W0Tlxciqp","0Wr5y7hyVv","FjHXRMmKGJ","O3iyQHfyNQ","Pb1payofH3","Q6hMC45cIH","Yh1hFpWiOs",
+"n8pJ9tAOsr","FnPFBm4bxU","lpF6WIn3NS","yluBxZzJHW","nFqikCp3mZ","0PktINAFuw","zqH0WNhXdu","AOgEeMezSW","Waim62hEEU","In3NS9rlg9",
+"Fhtglhe9IA","y94nwsqVrf","fcwDaM6qcG","qUJMdzFgtB","7hyVvF6PT2","C2IrcblLA9","Zv7z0hYBCK","MojnPFFDui","5Mg9rOUYuF","aez9ypiJSk",
+"ZUnqtdmoS7","i3pyduQIcz","uQIcz9XyT9","gf8rIix74r","hUTw7HP433","qaofNtaOXK","rKDLJpvgjS","fFDrJ1v5hH","yEfy9oQ87r","5drc6ogLgc",
+"JIqXi8cVD3","fqypy0MR5X","S2DfuFFDui","ciuWzpvgjS","1v5hHBGaQY","S77LHxXTI4","uAWypFPfSE","9y4lwXyPZN","euZA5uoStw","gtCA5O3iyQ",
+"gdQsS5Mg9r","rhl0Jv1Hln","v8yFNXflUq","aL6AJjfREu","3weIFPYBf4","Zv7z0Y1mC0","QWxoTydG8U","WPmlxpAhR1","0YAGHIKxdL","pT8wu0PktI",
+"ix74rVjCZq","n8pJ9zQt6Q","CNHmvaFFss","Ul4a1jzUqR","Y1mC029QAz","HfyNQJ2mQi","uQIczguMb8","JXljWlm0pD","tvdkDcShY2","JkzUnfaHir",
+"9rlg9wiHrZ","taOXKWreyP","7fKYUEOE1o","Vprf2FFDui","djsrvlkMUA","Yw2oU2Yz7E","BFkb829QAz","BGaQYZJTXH","RmDcrSs0Zu","2Nslmulk41",
+"5VZjSJIqXi","KZamHv8yFN","IjTwPG1RhS","x3LDeVIlwP","S2Dfu0h1b1","IRh48aez9y","RACujd7vjM","qQxHPmX2GE","B3qemuoStw","GSQwjTwano",
+"580YDpiJSk","cL0aEn8pJ9","D6rByPYBf4","7fsYMY1mC0","uLtKsazIWp","k85AeQWxoT","GXdoHhi5X7","TCgPppiJSk","Uvlv4FGzgp","FPfSEFwEJz",
+"16lHcS2Dfu","guMb816lHc","GXdoHOUqFM","jtn0X14FLR","VerEACp3mZ","TCgPps7Mxk","EdBKch1zcH","s4786WmadA","BCxeCn8pJ9","SmGzv8FmFH",
+"9rlg9MK07Y","zFgtB6q6L9","iKqhrsoy9t","soy9t4QMc9","e6e4zWDVWJ","D6rByGXdoH","9eoRcFxX9q","lXFOB0BmCy","Ss0ZuBbwgA","XflUqydG8U",
+"hE1QljeskS","2DREsWaWsv","VIlwPRBhp0","v1HlnlpF6W","tjQxsUlU3M","taOXKo8Uyd","Z4I1vQworu","hSSvQAmdQd","FGzgpjSjS3","iB08lBpYhV",
+"7X3uyFhtgl","rz7UtGrDg7","Q6hMCVjCZq","AkKTkO3iyQ","U3yw5ZuDtD","aL6AJzbIYY","rz7UtXflUq","ReKEW9y4lw","zQt6QMezSW","2DREsFnPFB",
+"DcpWBdQ586","ix74rAgJHQ","Q6Lix5IhmG","d85a9Yw2oU","k85Ae8FmFH","BGaQYbrhlQ","Y1mC0jS1aj","uvf7A618Di","zqH0WblLA9","oQ87rHzZT8",
+"MmKGJzmLYD","azIWps93Ml","MGlTFsuY4x","KZamHiKqhr","VjCZqIRh48","Yw2oUO3iyQ","5Mg9rVLTy6","DQimp0YAGH","FNYIMM3zXL","5drc6QbxXc",
+"AgJHQfFDrJ","fLNg8DG4sT","SmGzvuTacx","vOqCE4QMc9","StlDJyluBx","YjB9tjzUqR","S77LHzbIYY","7ku1pfqypy","pFrrlciuWz","IBe8kDLhzM",
+"Zv7z0Ss0Zu","J2mQiOxWIH","suY4xFcWrW","FVMxoZv7z0","SmGzvNxx9V","jSjS3VjCZq","yvOMICp3mZ","suY4xFhtgl","v1HlnFNYIM","48cHLFwEJz",
+"GSQwjgdQsS","lkMUAZUnqt","ydG8UlkMUA","zQt6QVIlwP","VLTy6SmGzv","aDGtSCdyBV","pWiOsDLhzM","9rlg9CqqaD","fLNg8C2Irc","fcJOyaL6AJ",
+"Waim6HP433","prNT6Uvlv4","jSjS3n1pmO","fFDrJJJs5m","Waim6t59lR","jSjS3dpe1v","FPfSEzz4ZU","0ao3lmX2GE","OUqFMGWqqX","dpe1vzHF1q",
+"GSQwj6AFT0","gIYvEd85a9","ZUnqtNxx9V","No0QbWMiS3","AXpwEhSSvQ","kB5nP7lUXZ","lCMxyF6PT2","DG4sTjiVBP","KsjRKbgJAz","AXpwEjSjS3",
+"9y4lwprNT6","BFkb8gIYvE","RpBQmksJby","qQxHPWmadA","8U2nUyluBx","zHF1qEOE1o","CIShGuN6r3","O3iyQS77LH","FnPFBpT8wu","kB5nP0MR5X",
+"6AFT0uTacx","Z4I1vciuWz","JKWYRKZamH","8cVD3ECMvU","OUYuFksJby","i7WMQNhXdu","D6rByatef2","ksJby5Mg9r","Uvlv4Z4I1v","lXFOBl83Ud",
+"JXljWcQOnv","9y4lwBpYhV","zz4ZU0Kyfs","n1pmODz1R3","JIqXi45cIH","6q6L9uAWyp","zHF1qVIlwP","Mkgy8hSSvQ","8xEKzTXQ0Z","64s8NnlaBy",
+"aez9yjfREu","cQOnvJIqXi","2Nslmfqypy","mX2GEGv3Fq","Oz8yZUlU3M","M3zXLUmaEv","QbxXc0PktI","uAWypFFDui","AOgEePb1pa","1v5hHNhXdu",
+"RzaZAi7WMQ","2ZHdkI7p2a","55rfBs7Mxk","1j5L8yEfy9","XyPZNYOfrY","WaWsvlj07Q","wiHrZDcpWB","ydG8U4QMc9","JKWYRWmadA","Kr8ysC2Irc",
+"DLhzMyToGW","1j5L8QbxXc","ciuWzs93Ml","yEfy9fmIK1","wiHrZrz7Ut","PYBf4HfyNQ","rz7Uti3pyd","0BmCyzbIYY","StlDJwiHrZ","5IhmGfqypy",
+"VIlwPYw2oU","s93MlokgRi","cmXIXCfgr3","n8pJ9ZuDtD","iwzGkaez9y","pAhR1bZLvS","uTacxjzUqR","aFFssrKDLJ","zz4ZUi3pyd","uZPqgYOfrY",
+"Yw2oU0YAGH","TwanoWPmlx","OHaBzYf2Ec","9iGoTuoStw","JRJQBn8pJ9","KZamHMm8si","rKDLJuZPqg","t59lRuPX7G","8FmFHO3iyQ","ix74rWPmlx",
+"SmGzvFwEJz","pWiOspiJSk","pT8wuoGu6x","Cp3mZM3zXL","aDGtSRBhp0","dmoS7HRxd8","gf8rIRkQke","AOgEe8U2nU","Mkgy8Chuy3","vLsmS5Mg9r",
+"d85a9D6rBy","zmLYDtl72W","aL6AJsuY4x","0ao3lksJby","45cIHJkzUn","BFkb80h1b1","lkMUAoQ87r","b29RJF6PT2","guMb8pmeCd","qUJMdWDVWJ",
+"ogLgc1LB1L","Q6Lixt59lR","fcJOy9rlg9","Ta8f6AgJHQ","Waim664s8N","yToGWdmoS7","jzUqRuQIcz","MK07YsqVrf","jfREujfREu","7fsYMy94nw",
+"FFDuiAmdQd","Ta8f6FVMxo","FjHXRtlILt","FjHXRKZamH","W3VFHU3yw5","he9IAOUqFM","AmdQdydG8U","zz4ZUQWxoT","BpYhVuLtKs","zqH0WHfyNQ",
+"Waim6SjskQ","jeskSIn3NS","NcICAuoStw","a00b56q6L9","jiVBPv2eC3","NhXduRBhp0","jzUqRv8yFN","0KyfsIjTwP","GSQwj8RCUA","Oz8yZEdBKc",
+"guMb8gf8rI","DLhzMcShY2","No0Qbtl72W","uvf7ACqqaD","6q6L9Waim6","atef2pmeCd","CdyBV5Namm","CdyBVsx5Gl","uN6r3WPmlx","7hyVvcmXIX",
+"uZPqgsqVrf","FNYIMAOgEe","FNYIM2Nslm","0YAGHzHF1q","FjHXR6AFT0","Cfgr37ku1p","MmKGJuupzk","vOqCEWreyP","cL0aE0PktI","5Drn0BbwgA",
+"8RCUAguMb8","WMiS3UlU3M","v1HlnMm8si","ulk410Wr5y","mz8gxy94nw","55rfBgf8rI","U3yw545cIH","8FmFH1j5L8","NcICA07n1c","4dEz65nmWv",
+"7fKYULewvM","Yh1hF9eoRc","AkKTk9iGoT","FcWrWK20wK","Mkgy8sqVrf","nnP8o8hJdt","S77LHFjHXR","lCMxyFxX9q","kZANmJKWYR","jzUqRNAFuw",
+"IBe8k7fsYM","RpBQmnFqik","dmoS716lHc","aDGtSJRJQB","TwanoK4GS8","0YAGHsoy9t","Kr8ysnnP8o","Dz1R38FmFH","5nmWvv2eC3","ReKEWuN6r3",
+"bZLvSDG4sT","jeskS4W0Tl","SWfouAIYUu","NcICAcmXIX","aDGtSfaHir","JKWYRYh1hF","AmdQdRBhp0","NAFuwkB5nP","O3iyQ0ao3l","IRh48gf8rI",
+"In3NSpvgjS","NcICAGWqqX","nFqikZzJHW","lViBvQWxoT","QYxC0pmeCd","LewvMIn3NS","taOXKDQimp","Ta8f68cVD3","OxWIHk85Ae","9rlg9OxWIH",
+"lj07Qs93Ml","9y4lw618Di","jzUqR6AFT0","RBhp0tuDyS","jSjS3Ss0Zu","zFgtByluBx","Kr8ysCxVEf","gIYvEoGu6x","Yw2oUtaOXK","uLtKsxReec",
+"HzZT8t59lR","xXTI40YAGH","iwzGkbgJAz","7hyVvpAhR1","uJScX7Ow5C","0h1b1M6qcG","YOfrYnlaBy","RmDcr0Wr5y","uAWypS2Dfu","iqv4k0Kyfs",
+"gjUTuyToGW","DLhzM2DREs","lkMUA6AFT0","vkCHH5IhmG","Zv7z0ulk41","8FmFH7hyVv","gtCA5D6rBy","0Kyfspv0i7","PYBf4e6e4z","FjHXRVprf2",
+"1v5hHMmKGJ","d85a9pmeCd","rhl0J2Nslm","AkKTkxXTI4","TXQ0ZW3VFH","pmeCdFhtgl","QYxC0FFDui","VjCZqOUqFM","24ARFqQxHP","BCxeCVLTy6",
+"sqVrf2ZHdk","K4GS8jfREu","soy9tNOHsz","IjTwPlH1kt","9XyT9piJSk","yluBxFNYIM","Cp3mZBFkb8","blLA9aDGtS","5IhmG3weIF","Kr8yso8Uyd",
+"JkzUnx3LDe","Kr8ysfcJOy","fcwDa0MR5X","0YAGH618Di","BpYhV48cHL","NcICAfLNg8","7hyVv5Namm","y94nw9rlg9","2hEEUrKDLJ","o8Uydatef2",
+"Mkgy8qQxHP","8xEKzCK5W7","xXTI4QYxC0","v1Hln618Di","VNCPdydG8U","Uvlv40Kyfs","i7WMQYw2oU","0BmCyFxX9q","4W0TlHRxd8","AkKTkGSQwj",
+"zY1GY16lHc","x3LDeb29RJ","2ZHdk2Nslm","zY1GYDz1R3","EOE1ojfREu","qaofN9y4lw","ogLgcFGzgp","SjskQZhwG1","Nxx9V5Drn0","d7vjMru4UG",
+"o8Uydt98iW","tjQxsGSQwj","7Ow5CogLgc","jzUqRRsQUq","IKxdLYw2oU","AIYUuoQ87r","BpYhVVNCPd","gdQsS8TxD7","UlU3MY1mC0","45cIHi3pyd",
+"fcwDayEfy9","rKDLJ0PktI","D6rByOUYuF","FnPFBlCMxy","ix74r14FLR","brhlQVerEA","Ta8f6XyPZN","zQt6QBpYhV","dQ586FxX9q","DcpWBP6bcg",
+"TwanoBbwgA","QYxC0b29RJ","Qworut98iW","8TxD70PktI","zY1GY8U2nU","2Yz7EWaWsv","lXFOByofH3","tAOsrJ2mQi","JXljW5ZaEz","BbwgANOHsz",
+"jeskSb29RJ","9XyT9In3NS","0BmCyru4UG","okgRiI7p2a","YOfrYAgJHQ","ulk41TXQ0Z","5nmWvNAFuw","G1RhSFNYIM","MojnPhSSvQ","1j5L8cQOnv",
+"cQOnv24ARF","TXQ0ZKsjRK","24ARFFNYIM","atef2ECMvU","WMiS3pmeCd","JkzUnSWfou","yEfy9dQ586","3weIFlCMxy","BCxeCDLhzM","mX2GEzY1GY",
+"6AFT0GWqqX","vOqCEOxWIH","9rlg9OUqFM","8U2nUcQOnv","1j5L8X6Pin","SWfouQWxoT","Cp3mZW7cTs","zqH0WNOHsz","Rxrsm8cVD3","45cIHDLhzM",
+"AXpwEQbxXc","iwzGkzmLYD","atef29XyT9","CdyBVlsQGo","IBe8kNo0Qb","vLsmSQChxs","ZUnqtCIShG","uZPqgd7vjM","ru4UGoVQp6","t98iWZzJHW",
+"lCMxy6AFT0","MaJQs5iGN5","tl72WI7p2a","qaofNlkMUA","W7cTs2TRI7","pvgjSokgRi","MGlTFhe9IA","POUYSNhXdu","UlU3MTCgPp","KZamHsoy9t",
+"8cVD3S2Dfu","xReecpv0i7","v8yFNLbRTH","HlUbFHlUbF","7X3uyJXljW","3otm6oVQp6","xReecd85a9","W3VFHVNCPd","Oz8yZ5nmWv","a00b5lj07Q",
+"Vprf2B3qem","BFkb8FcWrW","qQxHP0ao3l","ogLgcOz8yZ","BGaQYJkzUn","IBe8kwDajX","HRxd8K20wK","YOfrYlsQGo","kB5nPa00b5","Q6hMC8U2nU",
+"TCgPpazIWp","rz7Ut5nmWv","Uvlv4CdyBV","2DREsuJScX","2Yz7ECK5W7","OxWIHEdBKc","vkCHHdmoS7","Kr8ysFLsph","EOE1oAkKTk","Pb1paMojnP",
+"tvdkDRACuj","Oz8yZsuY4x","pAhR1bgJAz","kZANm9GXkX","pvgjSVprf2","yofH3C2Irc","ksJbyZzJHW","QClRLpiJSk","cmXIX580YD","uoStwIBe8k",
+"Rxrsmxciqp","SmGzvDQimp","qaofNv1Hln","9eoRchi5X7","JJs5maDGtS","Y1mC0FnPFB","tAOsrlsQGo","580YD0PktI","hYBCK8xEKz","1j5L8M6qcG",
+"9iGoTQworu","KASQ8bgJAz","Q6hMCNxx9V","9rlg9mX2GE","Gv3Fq0h1b1","9iGoToQ87r","HzZT8LDk6f","EoToPVjCZq","QWxoT07n1c","Z4I1v5Mg9r",
+"a00b58xEKz","Vprf2hYBCK","FGzgpTXQ0Z","aL6AJ8TxD7","Waim6FnPFB","YOfrY8U2nU","DG4sT8U2nU","VLTy6Z4I1v","3otm65IhmG","qQxHPUvlv4",
+"Yh1hFprNT6","wDajXYjB9t","pT8wumX2GE","24ARFcL0aE","ThjNn1v5hH","16lHcNhXdu","y94nwZhwG1","8hJdtS77LH","tvdkDI7p2a","oVQp6xReec",
+"5Mg9rLDk6f","8cVD3iqv4k","2ZHdkSmGzv","FNYIMvkCHH","zQt6Q5iGN5","GXdoHnnP8o","guMb8vkCHH","suY4xmX2GE","NhXduQClRL","MmsIouoStw",
+"16lHcOUqFM","JXljWG1RhS","AkKTkQnJ1S","pvgjSbrhlQ","P6bcgfFDrJ","Cfgr3Vprf2","Ta8f6UmaEv","zqH0WEOE1o","JJs5mYf2Ec","n1pmOSbRYy",
+"2hEEUWPmlx","pWiOsRzaZA","U3yw5jeskS","JJs5mZhwG1","rKDLJ9eoRc","POUYSlj07Q","FxX9q0h1b1","CIShGY1mC0","tvdkD29QAz","FjHXRMmsIo",
+"8TxD7ni2v1","14FLRW7cTs","d7vjMUl4a1","mz8gxksJby","45cIHgf8rI","MaJQszHF1q","S2Dfu5ZaEz","uQIczBGaQY","sx5Gl9rlg9","5Mg9rUvlv4",
+"9y4lwNxx9V","qQxHPLDk6f","WMiS3F6PT2","Q6hMCuvf7A","FLsphYOfrY","tjQxscShY2","KsjRKZ4I1v","lpF6WsqVrf","pFrrlFLsph","0h1b1AOgEe",
+"hSSvQUvlv4","WreyP55rfB","azIWpyvOMI","iB08lvLsmS","VBjhzJRJQB","hE1QlaDGtS","fqypyK4GS8","gtCA5J2mQi","QWxoTpiJSk","dhSuHulk41",
+"BCxeCaDGtS","OUYuFOHaBz","QnJ1S8RCUA","O3iyQpiJSk","OUYuFX6Pin","VerEAYh1hF","O3iyQlCMxy","iB08lZUnqt","NcICAK4GS8","GXdoHru4UG",
+"WaWsvzbIYY","Zv7z0FGzgp","TXQ0ZOxWIH","kB5nPCp3mZ","pAhR1J2mQi","sx5Gl14FLR","gjUTuKsjRK","WDVWJNOHsz","RACujHfyNQ","Mkgy8dQ586",
+"QYxC0tuDyS","dhSuHDLhzM","GWqqXcmXIX","NcICA7fKYU","7Ow5C6AFT0","KASQ8LbRTH","RxrsmThjNn","9rlg964s8N","S2Dfu7lUXZ","8FmFHoVQp6",
+"jSjS3QnJ1S","lCMxyMkgy8","L7cGcOUYuF","WPmlx7X3uy","WreyPbZLvS","5iGN5GWqqX","JkzUnGrDg7","FFDuiGv3Fq","nnP8oxXTI4","yvOMIMmsIo",
+"prNT6MGlTF","sx5GlZUnqt","M6qcGQChxs","JJs5ma00b5","ZuDtD0Kyfs","rz7Ut2Yz7E","GSQwjLewvM","lsQGotuDyS","kZANm4dEz6","7hyVvbrhlQ",
+"tuDyS6q6L9","CxVEfhe9IA","8RCUAOHaBz","YOfrY29QAz","MezSWMGlTF","tl72WS77LH","RACujQ6hMC","MmKGJ1v5hH","jtn0X7hyVv","D6rBytaOXK",
+"48cHL8cVD3","Cfgr3X6Pin","Oz8yZF6PT2","ni2v1K20wK","Y1mC0JKWYR","Mkgy8l83Ud","cL0aETwano","MmKGJvLsmS","nFqiklm0pD","oVQp6Yw2oU",
+"hi5X7RkQke","DG4sTaDGtS","AgJHQXyPZN","zmLYDxReec","d85a9atef2","fFDrJ0BmCy","l83Udiqv4k","2DREsi7WMQ","n8pJ9NcICA","RmDcrFVMxo",
+"In3NScQOnv","AgJHQuoStw","AXpwEG1RhS","brhlQTXQ0Z","tuDySKr8ys","WDVWJpWiOs","uupzkgtCA5","yEfy9hi5X7","qaofNChuy3","QnJ1SpWiOs",
+"6q6L9mz8gx","piJSkUvlv4","SbRYySs0Zu","zz4ZUuTacx","IKxdL8FmFH","K20wK7fsYM","W3VFHhSSvQ","B3qemksJby","BpYhVh1zcH","x3LDel83Ud",
+"CdyBVZJTXH","9iGoT5nmWv","nFqikAXpwE","FGzgpa00b5","I7p2apv0i7","2NslmzqH0W","MmKGJRsQUq","AIYUurz7Ut","s93MlazIWp","Y1mC0C2Irc",
+"ZJTXHpvgjS","AXpwEuPX7G","RxrsmWmadA","7lUXZnnP8o","0KyfsuPX7G","6AFT0FcWrW","7X3uyFcWrW","7fKYUNcICA","qUJMdDLhzM","FNYIMni2v1",
+"dmoS7M6qcG","7fsYMQssNC","zqH0WMkgy8","C2IrcPYBf4","7Ow5CBGaQY","Qworu0h1b1","KASQ8tAOsr","fcwDaSmGzv","AIYUut59lR","AkKTk5VZjS",
+"pvgjSmX2GE","cmXIXL7cGc","LbRTHCIShG","KsjRKjtn0X","taOXKK4GS8","NAFuwhSSvQ","lXFOBhe9IA","OHaBzXflUq","Vprf2rKDLJ","I7p2aMmsIo",
+"Gv3Fqtl72W","Kr8ysHfyNQ","FhtgllkMUA","okgRin8pJ9","JRJQBIn3NS","LbRTHbrhlQ","dQ586lCMxy","SjskQh1zcH","I7p2aJRJQB","AIYUuOHaBz",
+"RkQkedQ586","tl72WCIShG","lViBvNo0Qb","lpF6WThjNn","uAWypaDGtS","uN6r3ogLgc","EdBKczFgtB","KASQ8qQxHP","QClRLjSjS3","Dz1R3O3iyQ",
+"IRh48Yf2Ec","nnP8ohe9IA","9iGoTuZPqg","vOqCEFxX9q","7X3uyZv7z0","QWxoT9y4lw","OUqFMEOE1o","dmoS7uJScX","tAOsrAOgEe","lkMUAKZamH",
+"uJScXy94nw","VjCZqCp3mZ","lH1ktYh1hF","Gv3FqX6Pin","S2DfuMGlTF","lXFOBjeskS","7fsYMpmeCd","S77LH4dEz6","TXQ0Z9eoRc","hE1QlrKDLJ",
+"RkQkehUTw7","MojnPTwano","uupzkCNHmv","dpe1vZv7z0","lCMxyiB08l","uPX7GzmLYD","nFqikxciqp","QssNC5drc6","iB08lcQOnv","uQIcz1j5L8",
+"pv0i7i7WMQ","FVMxoGrDg7","FNYIM0Kyfs","taOXKjfREu","P6bcg0h1b1","n8pJ9Kr8ys","SmGzv16lHc","M3zXLvOqCE","5iGN548cHL","QYxC0tlILt",
+"lweGyFNYIM","RBhp0JRJQB","dQ586suY4x","gtCA548cHL","BCxeCPOUYS","aDGtSPYBf4","uvf7Ao8Uyd","cL0aEyvOMI","48cHLRACuj","dhSuHThjNn",
+"vOqCEaFFss","M3zXLK4GS8","AOgEezQt6Q","8TxD7Zv7z0","8xEKzlH1kt","d7vjMhe9IA","prNT6AmdQd","IKxdLxXTI4","7fsYMRxrsm","mX2GECfgr3",
+"HzZT8GSQwj","5drc6wiHrZ","blLA9aL6AJ","HlUbFL7cGc","gf8rIOHaBz","Waim6yEfy9","MmsIoIBe8k","14FLRnFqik","XyPZNO3iyQ","v8yFNDG4sT",
+"uvf7Ah1zcH","b29RJ29QAz","I7p2aQ6Lix","5IhmG5Namm","a00b5yToGW","he9IAfaHir","WaWsvm4bxU","uQIczQssNC","FFDuiBpYhV","Q6hMCiwzGk",
+"uN6r34QMc9","gjUTuWaim6","xciqprz7Ut","fmIK1lsQGo","azIWpd85a9","4W0TltjQxs","aDGtS8hJdt","16lHcVerEA","dhSuHZJTXH","uQIcz45cIH",
+"n1pmONOHsz","djsrvi3pyd","UmaEvfLNg8","GXdoHB3qem","vkCHHprNT6","xXTI4zFgtB","MGlTFnlaBy","8cVD3FwEJz","0BmCyYh1hF","NAFuwrz7Ut",
+"piJSkyofH3","AkKTkJKWYR","pFrrljfREu","8FmFHOz8yZ","Ul4a1Cfgr3","2NslmKASQ8","JkzUn9GXkX","5IhmGyluBx","QWxoTCfgr3","OHaBzC2Irc",
+"LewvMFxX9q","OxWIHBGaQY","a00b5oQ87r","gtCA5Mkgy8","iKqhrFnPFB","QWxoTQYxC0","FVMxo4dEz6","RBhp0pAhR1","e6e4zZv7z0","kB5nPulk41",
+"JIqXiJkzUn","NOHszJIqXi","FwEJzlH1kt","ZhwG1s4786","3otm6wDajX","DcpWBAkKTk","VerEAYw2oU","tvdkDStlDJ","TCgPpKsjRK","qQxHPfcwDa",
+"AIYUujeskS","tl72W29QAz","jiVBPprNT6","Ss0ZuOHaBz","7fsYMVBjhz","Uvlv4m4bxU","0PktIaez9y","FFDuid85a9","LDk6fAmdQd","cQOnvCdyBV",
+"yofH3fFDrJ","yofH3Yh1hF","XflUqmX2GE","WMiS3LbRTH","WreyPuvf7A","AOgEeQ6hMC","FcWrWd7vjM","9XyT9ReKEW","YjB9tuvf7A","wiHrZS2Dfu",
+"fLNg8blLA9","8TxD755rfB","nlaByprNT6","RzaZApiJSk","45cIHv1Hln","t59lRtlILt","s4786fcwDa","StlDJlkMUA","AOgEeU3yw5","wiHrZazIWp",
+"EOE1o5Mg9r","0YAGHM6qcG","WreyPkZANm","QChxs0ao3l","AXpwEIjTwP","n8pJ9OUYuF","5NammQworu","FxX9qUvlv4","Yf2EcfcwDa","prNT6SbRYy",
+"UmaEvSmGzv","ThjNn24ARF","0ao3lni2v1","iwzGkIjTwP","Ul4a1a00b5","C2IrcFcWrW","9XyT9UmaEv","lXFOBKASQ8","RmDcr45cIH","GXdoHS2Dfu",
+"jS1ajIRh48","EOE1om4bxU","wiHrZTCgPp","s93MlDQimp","8cVD3AmdQd","cQOnvwDajX","jzUqRa00b5","hSSvQIn3NS","Mm8sisx5Gl","FPfSEWmadA",
+"rKDLJ14FLR","lsQGoX6Pin","azIWpt59lR","Cp3mZpiJSk","W7cTs7fKYU","14FLRDcpWB","XflUqX6Pin","2hEEUJXljW","AgJHQPYBf4","5IhmGkB5nP",
+"K20wKlpF6W","8hJdtjiVBP","0ao3lZzJHW","SWfouYf2Ec","FnPFBmX2GE","WDVWJ5drc6","QworuyvOMI","8RCUA5Namm","Yh1hF5Namm","WMiS3WMiS3",
+"QnJ1StvdkD","7Ow5CKr8ys","WPmlxDz1R3","K20wK4QMc9","EOE1oazIWp","45cIH7X3uy","hUTw7xReec","RmDcrS2Dfu","AIYUu0BmCy","lXFOB8U2nU",
+"CqqaDulk41","t98iWhE1Ql","IKxdL7Ow5C","W7cTsCdyBV","HP4334QMc9","7Ow5CSmGzv","EoToP2DREs","Chuy3ulk41","prNT6dQ586","FnPFBZhwG1",
+"tvdkDQssNC","zz4ZUFGzgp","2TRI7QssNC","HP433lCMxy","IRh48pmeCd","Pb1paqaofN","618DibgJAz","FFDuiWreyP","iwzGk7fsYM","EOE1ouAWyp",
+"pT8wudpe1v","uJScXt98iW","Twano0ao3l","0ao3l2DREs","FVMxo9eoRc","KZamHgIYvE","nnP8o9GXkX","POUYSgdQsS","Pb1pazFgtB","QnJ1SZzJHW",
+"i3pydDQimp","IKxdLpAhR1","Q6hMC1v5hH","5nmWvnFqik","LewvMd7vjM","5iGN5VerEA","MaJQsiKqhr","lViBvru4UG","Pb1paokgRi","7ku1pFjHXR",
+"GrDg7CNHmv","uQIczUvlv4","n8pJ9JKWYR","8RCUAlpF6W","0Wr5yJKWYR","7hyVv4W0Tl","Y1mC00Kyfs","QWxoTX6Pin","euZA5ZUnqt","RzaZAsuY4x",
+"gf8rI1j5L8","jeskSPb1pa","nnP8ov2eC3","MmsIopWiOs","9iGoTs4786","tAOsrlCMxy","9rlg9Z4I1v","9rlg9jS1aj","Vprf2WDVWJ","5ZaEzMm8si",
+"X6Pin45cIH","uPX7GVLTy6","ZuDtDuvf7A","djsrvprNT6","nlaByJIqXi","wiHrZHzZT8","lViBvUvlv4","Oz8yZZJTXH","hi5X75IhmG","B3qemKASQ8",
+"4QMc9pmeCd","d85a9oQ87r","dpe1vU3yw5","POUYS5IhmG","x3LDetaOXK","pFrrl5VZjS","WMiS3k85Ae","8RCUAYOfrY","pWiOsZJTXH","VLTy6fFDrJ",
+"VjCZqsqVrf","Kr8ysksJby","okgRiQ6hMC","uZPqgFVMxo","U3yw52DREs","Chuy3uQIcz","zqH0W24ARF","VerEAxXTI4","M3zXLSWfou","7Ow5CChuy3",
+"D6rByKASQ8","QssNCFjHXR","9rlg9Kr8ys","euZA5suY4x","D6rByW3VFH","5drc6Q6hMC","nlaBydmoS7","C2IrcRkQke","lXFOBx3LDe","qUJMdS77LH",
+"S2DfuxXTI4","taOXKReKEW","VBjhz7fsYM","KASQ8Qworu","tAOsrFxX9q","i7WMQzQt6Q","ogLgcGrDg7","C2IrcUvlv4","UlU3M24ARF","MK07Yni2v1",
+"9eoRc0Kyfs","BbwgA4QMc9","FwEJzPYBf4","okgRiD6rBy","uupzkS77LH","fFDrJUl4a1","BGaQYMm8si","0ao3luN6r3","nFqikoVQp6","oGu6x1LB1L",
+"2hEEUBpYhV","0Kyfsn1pmO","Q6hMCiB08l","8xEKzM6qcG","Ss0ZuGWqqX","BGaQYD6rBy","Mm8siqUJMd","GXdoHix74r","cmXIX1v5hH","prNT6CdyBV",
+"5Drn0Yh1hF","NOHszPYBf4","dpe1vuLtKs","WPmlxWreyP","VerEApv0i7","6AFT0Pb1pa","zbIYYJ2mQi","HRxd8FPfSE","C2IrcI7p2a","ZhwG1d85a9",
+"zqH0WuN6r3","Gv3FqDLhzM","HlUbFBpYhV","tAOsr45cIH","48cHLTa8f6","3otm6azIWp","FxX9qQChxs","sqVrfFwEJz","U3yw52TRI7","t98iWhe9IA",
+"CxVEfuLtKs","aL6AJgtCA5","CK5W745cIH","2ZHdkgf8rI","b29RJuZPqg","s7MxkKZamH","rKDLJ5drc6","VBjhzQWxoT","mz8gx9GXkX","brhlQSbRYy",
+"s4786IRh48","DG4sTI7p2a","i3pydxReec","nlaBygdQsS","OUYuFgtCA5","iB08lzFgtB","yofH3lj07Q","uJScXaL6AJ","OUqFM5nmWv","ZUnqtF6PT2",
+"brhlQFGzgp","ReKEWJXljW","suY4xG1RhS","piJSkfcwDa","3weIFv8yFN","MK07YTXQ0Z","8FmFHRACuj","mX2GExXTI4","FcWrWPb1pa","YOfrY5IhmG",
+"24ARFLDk6f","uJScXlCMxy","zFgtBKsjRK","K20wKBFkb8","Z4I1vb29RJ","FwEJzQnJ1S","FcWrWru4UG","3otm6KsjRK","MGlTFZhwG1","9y4lwaez9y",
+"xciqpm4bxU","JIqXiix74r","aFFssRpBQm","djsrvjzUqR","faHirt98iW","oQ87rrKDLJ","RsQUqM6qcG","OUYuFAkKTk","Waim6Mm8si","hi5X7nnP8o",
+"YjB9tD6rBy","Dz1R3ciuWz","FLsph0ao3l","uupzkReKEW","QworulsQGo","9y4lwjS1aj","POUYSUvlv4","oVQp655rfB","QnJ1S5Mg9r","J2mQiHfyNQ",
+"7fKYUa00b5","16lHci7WMQ","7hyVvTCgPp","0Wr5ya00b5","RkQkek85Ae","9iGoTSs0Zu","8TxD7uZPqg","Pb1pa8U2nU","Yh1hFWmadA","P6bcgIBe8k",
+"GWqqXMezSW","TCgPpReKEW","7Ow5Cdjsrv","CxVEfqQxHP","ZJTXHRzaZA","iqv4k7ku1p","OUqFMRkQke","FVMxoMm8si","tvdkDIBe8k","4W0TlRpBQm",
+"GXdoHuTacx","zmLYD4W0Tl","d7vjM8FmFH","RkQke5iGN5","qUJMdQbxXc","iqv4kRACuj","gIYvEY1mC0","FLsphpv0i7","ulk41SbRYy","U3yw5lCMxy",
+"gtCA5KsjRK","uupzkM6qcG","d85a9gf8rI","8U2nUPb1pa","9rlg9lj07Q","he9IAuvf7A","MmsIoQ6Lix","m4bxUo8Uyd","HlUbFoVQp6","QChxsYh1hF",
+"ni2v1F6PT2","guMb8he9IA","QbxXcxciqp","yEfy9GXdoH","MaJQst59lR","YOfrYyluBx","Z4I1vYOfrY","FnPFBzFgtB","MGlTFRmDcr","4dEz6jS1aj",
+"AgJHQS77LH","oVQp68RCUA","ReKEWMaJQs","sqVrfTwano","SWfouiKqhr","HfyNQMaJQs","soy9t9eoRc","G1RhSU3yw5","DcpWBx3LDe","Yf2EcSjskQ",
+"FGzgpaFFss","v8yFNd85a9","J2mQiWreyP","In3NSqQxHP","mz8gxQWxoT","mX2GEgdQsS","UmaEvMK07Y","jtn0XEOE1o","Mkgy8i3pyd","vkCHHdhSuH",
+"bZLvSJ2mQi","v1HlnWaWsv","ulk41AOgEe","UmaEve6e4z","tl72WG1RhS","Yw2oUk85Ae","Mm8siqQxHP","n8pJ9YjB9t","iB08l45cIH","FjHXRP6bcg",
+"2TRI74W0Tl","uvf7A5drc6","sx5Gl7X3uy","I7p2aSWfou","hUTw7VIlwP","yvOMIIKxdL","7X3uyECMvU","In3NSs93Ml","uTacxZzJHW","VIlwPNcICA",
+"Mkgy8HRxd8","In3NSprNT6","uPX7G580YD","Twano0Kyfs","DQimp5drc6","uQIczTwano","xXTI4LbRTH","QChxs0PktI","QbxXcdmoS7","RBhp0Cp3mZ",
+"14FLRn1pmO","hYBCKMkgy8","i7WMQ6AFT0","FPfSEHfyNQ","zmLYDuoStw","zqH0Wt59lR","o8UydTXQ0Z","OxWIHh1zcH","uoStwSbRYy","tl72WY1mC0",
+"55rfBnnP8o","TCgPpBFkb8","e6e4zBbwgA","pFrrlkZANm","azIWp9rlg9","Yw2oUnnP8o","Kr8yspWiOs","0YAGHfaHir","djsrvMezSW","9rlg9YOfrY",
+"FPfSE7fKYU","JKWYR6q6L9","Ul4a1nlaBy","fqypyTCgPp","16lHcBFkb8","gtCA5NOHsz","jtn0XprNT6","aez9yv1Hln","618DipT8wu","64s8NnFqik",
+"5nmWvSs0Zu","VBjhzFjHXR","djsrvYjB9t","pmeCdGWqqX","Twanofqypy","k85AelpF6W","BGaQY5Namm","cShY2Q6hMC","jSjS3jeskS","ZUnqt64s8N",
+"faHirWMiS3","O3iyQMGlTF","uN6r3faHir","yEfy9NAFuw","iwzGkxXTI4","64s8NGWqqX","AgJHQWreyP","Yh1hF618Di","L7cGcGv3Fq","MaJQsRzaZA",
+"4dEz6lsQGo","GXdoHWaim6","9iGoTIn3NS","QbxXcyEfy9","BFkb85drc6","djsrvgf8rI","WmadAVIlwP","FwEJzoQ87r","3weIFNcICA","8FmFHCdyBV",
+"F6PT2t59lR","5NammNo0Qb","0BmCyuPX7G","9eoRcQ6hMC","uvf7AZhwG1","OUYuFHP433","6AFT0tAOsr","Mkgy8TXQ0Z","NOHsz0MR5X","ZUnqtCNHmv",
+"5Mg9rVjCZq","ni2v1fcwDa","dhSuHoVQp6","qUJMdVerEA","uLtKsjzUqR","LbRTHThjNn","JkzUnMmKGJ","NAFuwaDGtS","pmeCdWPmlx","uPX7GJkzUn",
+"blLA9cmXIX","MojnP0Kyfs","JXljW7fKYU","48cHLfLNg8","Chuy3uN6r3","y94nwYw2oU","7fsYMJ2mQi","ECMvUfaHir","lViBvFwEJz","hi5X7y94nw",
+"xXTI4iwzGk","8cVD3t59lR","64s8NqUJMd","vOqCElH1kt","lXFOBFnPFB","Oz8yZ7lUXZ","0KyfsLDk6f","1v5hHMm8si","ZzJHWdmoS7","2DREsMaJQs",
+"UlU3Ms93Ml","Kr8ys6AFT0","U3yw5AmdQd","5nmWvRBhp0","zY1GY4dEz6","jS1ajVIlwP","CxVEfnnP8o","Uvlv4ulk41","tAOsrtAOsr","ReKEWAkKTk",
+"lH1ktlm0pD","8RCUArKDLJ","a00b57hyVv","3otm6zHF1q","lweGyTXQ0Z","k85AeTwano","Kr8ysSWfou","29QAzP6bcg","JKWYRiqv4k","hi5X7AkKTk",
+"JJs5mhSSvQ","s7MxklH1kt","tlILtReKEW","mX2GEJIqXi","9GXkXK4GS8","brhlQ9GXkX","7hyVvMmKGJ","JJs5mCfgr3","Waim6pv0i7","ydG8UZJTXH",
+"atef2JXljW","VNCPd8RCUA","K4GS8NhXdu","gIYvEyToGW","0ao3l4W0Tl","jiVBPcShY2","dhSuHcQOnv","YOfrYVLTy6","he9IA14FLR","rhl0J580YD",
+"8RCUAWmadA","L7cGcv8yFN","BpYhVTCgPp","MmsIo5VZjS","HfyNQNcICA","AIYUuNxx9V","pFrrlTCgPp","e6e4zTCgPp","QClRLeuZA5","CdyBVX6Pin",
+"pWiOswDajX","RsQUqVerEA","b29RJSjskQ","uN6r3RsQUq","VNCPdXflUq","gIYvEUmaEv","VNCPdfcwDa","nFqik07n1c","5IhmGBGaQY","BCxeCYOfrY",
+"dmoS7DQimp","Mm8sipT8wu","zQt6Q8hJdt","7fKYUDz1R3","TCgPp8TxD7","S2DfuF6PT2","0KyfshSSvQ","0YAGHtjQxs","aDGtSguMb8","oGu6xiwzGk",
+"AmdQdDLhzM","Y1mC01v5hH","vkCHHzY1GY","lXFOBThjNn","ZzJHWgf8rI","cQOnvFGzgp","FVMxodmoS7","DLhzMOHaBz","k85AefmIK1","ZuDtDQ6Lix",
+"zqH0WNAFuw","JIqXi0PktI","s7Mxkuvf7A","0KyfsjeskS","CqqaDWaWsv","iKqhrC2Irc","yEfy9Q6hMC","cQOnvksJby","Ss0Zu618Di","1j5L8b29RJ",
+"MaJQsEdBKc","29QAzydG8U","DLhzMSs0Zu","IKxdLlViBv","AgJHQxReec","fcwDaAkKTk","P6bcgGSQwj","uZPqgMaJQs","9y4lwZzJHW","nlaBypv0i7",
+"nlaByx3LDe","gtCA564s8N","No0QbP6bcg","NhXduGv3Fq","EoToPtjQxs","CqqaDQWxoT","CIShGNo0Qb","s7MxkWaWsv","pv0i7ix74r","uvf7Ad85a9",
+"pAhR1lCMxy","K4GS8cShY2","CqqaDaFFss","6AFT0RzaZA","Cfgr38U2nU","okgRi2Yz7E","6AFT0lXFOB","gIYvErz7Ut","QWxoTuQIcz","pT8wuStlDJ",
+"Pb1paKsjRK","DQimpUlU3M","EoToPB3qem","Pb1paMGlTF","lj07QfmIK1","jzUqRrhl0J","BCxeCokgRi","0YAGHCdyBV","No0QbBbwgA","b29RJhi5X7",
+"suY4xCIShG","OHaBzMojnP","S77LHCK5W7","K4GS8GrDg7","VjCZqkB5nP","vOqCEJRJQB","9iGoTgtCA5","OHaBzW3VFH","lsQGoBFkb8","2TRI77fsYM",
+"RpBQmIBe8k","RxrsmFcWrW","fqypyEoToP","DQimpZUnqt","UlU3Mn8pJ9","8hJdtx3LDe","I7p2as7Mxk","tl72WjeskS","BCxeCJXljW","MGlTFZUnqt",
+"jeskS2hEEU","jeskSGrDg7","jeskSVerEA","Cp3mZ0BmCy","In3NSs4786","RzaZApv0i7","OxWIHgf8rI","yvOMIcL0aE","L7cGcv1Hln","PYBf4KZamH",
+"MezSWpAhR1","qUJMdLbRTH","uAWyp580YD","hSSvQ6q6L9","gtCA5WmadA","6AFT0uQIcz","KZamHa00b5","dmoS7nnP8o","AmdQdkZANm","O3iyQlweGy",
+"QnJ1Six74r","ydG8Uv2eC3","FPfSEFnPFB","RmDcrEOE1o","VNCPd9rlg9","v1HlnUvlv4","GWqqXTXQ0Z","J2mQiLbRTH","Mkgy8XflUq","2TRI7pv0i7",
+"qUJMdNo0Qb","lkMUAGWqqX","VerEAO3iyQ","9GXkXVIlwP","gf8rIrhl0J","QssNCdmoS7","5drc6WmadA","VerEAMaJQs","azIWpix74r","BCxeCMojnP",
+"Ss0ZupFrrl","Uvlv4Q6Lix","gf8rIHfyNQ","WMiS3DG4sT","CxVEfhYBCK","guMb8nnP8o","6q6L9FxX9q","HzZT8SbRYy","gdQsSa00b5","QChxsyEfy9",
+"JIqXijSjS3","7ku1pjtn0X","WMiS3NcICA","QClRLru4UG","m4bxUAgJHQ","wiHrZXflUq","hE1Qls4786","rKDLJL7cGc","brhlQiKqhr","kZANm9XyT9",
+"s7MxkBFkb8","JkzUntl72W","n8pJ9uZPqg","zbIYY29QAz","AOgEefFDrJ","hUTw7sqVrf","HlUbFdmoS7","9rlg9yToGW","8RCUAfaHir","WaWsv7lUXZ",
+"djsrvCqqaD","nFqikXyPZN","YjB9t5drc6","55rfBTXQ0Z","MmKGJFGzgp","mX2GEMkgy8","pT8wuQbxXc","lj07QyofH3","djsrv5Mg9r","3otm6I7p2a",
+"Dz1R3FLsph","CdyBVJ2mQi","9GXkXdhSuH","tAOsr4dEz6","Kr8ysMkgy8","BGaQYNxx9V","rhl0Jd7vjM","rKDLJ4QMc9","Y1mC0YOfrY","RmDcrRACuj",
+"uAWyp14FLR","EOE1oSmGzv","WaWsve6e4z","zQt6QFPfSE","RACujJRJQB","AkKTkF6PT2","Y1mC0cmXIX","7ku1p9XyT9","CdyBVmz8gx","nFqikWmadA",
+"9y4lwFnPFB","soy9tiKqhr","aez9ylkMUA","lweGyEoToP","o8Uyd5Mg9r","DcpWBZ4I1v","SWfouogLgc","B3qemYw2oU","s7MxkbgJAz","HP433F6PT2",
+"ZhwG1lj07Q","gtCA5ReKEW","blLA9atef2","aFFssM6qcG","yEfy9HfyNQ","fcJOyFLsph","JXljWyvOMI","mX2GEgjUTu","xReecCdyBV","6AFT0qaofN",
+"BCxeCbZLvS","yEfy97ku1p","ni2v1v8yFN","oVQp6580YD","Zv7z0jSjS3","XflUqAIYUu","rKDLJhi5X7","C2IrcjS1aj","B3qemGWqqX","QWxoT7fsYM",
+"FVMxozHF1q","64s8NBGaQY","k85AeS77LH","fFDrJ0PktI","3otm6y94nw","yluBxlXFOB","5Mg9rjiVBP","piJSk7X3uy","XyPZNgjUTu","Rxrsm07n1c",
+"ogLgcK4GS8","AXpwEGSQwj","MGlTF5VZjS","jfREuJkzUn","MK07YMK07Y","v2eC3kB5nP","QYxC0brhlQ","VNCPdDz1R3","24ARFAkKTk","he9IAyEfy9",
+"ReKEWxReec","y94nw2hEEU","zHF1qkZANm","xReecDLhzM","xciqpyofH3","IKxdLPb1pa","7hyVvfcJOy","xReecvLsmS","YOfrYhi5X7","QClRLMkgy8",
+"Pb1pa1v5hH","ogLgcFnPFB","sqVrfMmsIo","7Ow5CSWfou","WDVWJEoToP","Y1mC0CNHmv","rz7UtjzUqR","BGaQYNcICA","4W0TlZUnqt","gjUTutaOXK",
+"WmadAnFqik","D6rByTXQ0Z","CdyBVhUTw7","SWfoutjQxs","uQIczv8yFN","0Wr5y7fKYU","RpBQmtaOXK","LewvMZv7z0","W7cTs7X3uy","P6bcgbZLvS",
+"Z4I1vGrDg7","KZamHqUJMd","iqv4kfcJOy","Nxx9VblLA9","taOXK5Drn0","UmaEvGrDg7","7fsYMXflUq","t59lR9rlg9","JKWYR2ZHdk","VerEASs0Zu",
+"Chuy3D6rBy","tvdkDh1zcH","BpYhVs7Mxk","DLhzMnlaBy","M6qcGWDVWJ","m4bxU55rfB","uQIczYjB9t","KZamH7hyVv","2DREs07n1c","6q6L98xEKz",
+"FLsphCK5W7","QnJ1SkB5nP","ogLgc7hyVv","zFgtB8hJdt","pWiOsatef2","AkKTk48cHL","dQ586qUJMd","DLhzMfmIK1","QnJ1Sv2eC3","ogLgcGSQwj",
+"7hyVvHzZT8","Ss0Zu4dEz6","IjTwPQssNC","AkKTkYf2Ec","mz8gxNo0Qb","qaofNHfyNQ","StlDJ9rlg9","ix74rVprf2","2DREs8hJdt","m4bxUd85a9",
+"rKDLJFwEJz","14FLRAkKTk","IKxdLSWfou","PYBf4t98iW","VerEA55rfB","5ZaEzk85Ae","tvdkDSjskQ","iKqhr55rfB","8hJdtUvlv4","TCgPpL7cGc",
+"xciqpkZANm","nlaByiqv4k","CIShGHRxd8","GSQwjfqypy","kB5nPFFDui","LDk6fFnPFB","HfyNQ0Kyfs","QWxoT5Namm","GrDg7VBjhz","8TxD78U2nU",
+"J2mQi5nmWv","uvf7AUl4a1","07n1cVBjhz","piJSkm4bxU","FNYIMCqqaD","CK5W7taOXK","FwEJzXyPZN","AXpwEEdBKc","MGlTFXflUq","HfyNQChuy3",
+"CNHmvd7vjM","hUTw7FxX9q","AIYUu5VZjS","he9IAuPX7G","WDVWJQWxoT","55rfBSWfou","Q6LixpFrrl","KsjRKNAFuw","lm0pD1v5hH","aFFssoVQp6",
+"HzZT8vOqCE","ciuWz618Di","AXpwElH1kt","Cfgr3CNHmv","iwzGkDQimp","XflUqRkQke","sqVrfFLsph","4dEz6qQxHP","k85AeciuWz","Cfgr3uTacx",
+"DQimp8FmFH","EoToPQClRL","rhl0Jjtn0X","h1zcHNxx9V","SmGzvNhXdu","y94nwru4UG","EOE1oUl4a1","5Mg9rbgJAz","gjUTukB5nP","29QAzZzJHW",
+"9GXkXlH1kt","yEfy9qUJMd","FFDuiKASQ8","dhSuH0MR5X","iKqhrFjHXR","CxVEfMmKGJ","FGzgpHlUbF","bZLvS7ku1p","GrDg78U2nU","gjUTus93Ml",
+"8FmFH3weIF","6q6L9HfyNQ","i7WMQ5iGN5","Mkgy8SjskQ","uupzkoGu6x","wDajXL7cGc","2TRI78TxD7","Ta8f6BFkb8","NhXduiqv4k","In3NStAOsr",
+"0Wr5yrz7Ut","FnPFBiwzGk","qUJMdFNYIM","jSjS3piJSk","v1HlnYjB9t","8FmFHfFDrJ","I7p2atAOsr","BGaQYlpF6W","zY1GYZzJHW","1v5hHDcpWB",
+"RACujtAOsr","F6PT2cmXIX","bZLvSFnPFB","2ZHdk7X3uy","LbRTHO3iyQ","d7vjMnnP8o","yluBxLDk6f","CqqaDQnJ1S","xReecMkgy8","zz4ZUl83Ud",
+"v8yFNRxrsm","AmdQdSs0Zu","ydG8U1LB1L","4dEz6sqVrf","VIlwPsuY4x","iKqhrLbRTH","QnJ1S5Drn0","5VZjSpvgjS","JkzUnmz8gx","5Drn0vLsmS",
+"yToGWQ6Lix","lCMxySs0Zu","G1RhSlViBv","e6e4zIjTwP","uAWyp29QAz","2Yz7Epv0i7","QssNCMmKGJ","VIlwPvLsmS","Oz8yZFPfSE","jiVBPuoStw",
+"ni2v1fqypy","0YAGH580YD","7X3uyWmadA","YjB9tlXFOB","lCMxyRkQke","MezSWd85a9","cQOnvUvlv4","vkCHHatef2","Y1mC0ksJby","v8yFN5IhmG",
+"suY4xCp3mZ","tAOsrNo0Qb","AmdQdRpBQm","CdyBVzY1GY","8cVD3TXQ0Z","8TxD7hE1Ql","CK5W7W3VFH","YjB9ts7Mxk","Q6Lixs7Mxk","lj07QwDajX",
+"HP433JRJQB","yToGWfLNg8","t98iWrhl0J","7X3uypFrrl","guMb83weIF","64s8NvkCHH","BpYhVoVQp6","0MR5XgdQsS","uTacx55rfB","t98iWdhSuH",
+"lH1kt2Yz7E","jeskS7Ow5C","M6qcGRmDcr","No0Qb5ZaEz","l83UdW3VFH","HfyNQix74r","M3zXLCdyBV","4W0Tliqv4k","uZPqgPb1pa","zQt6QRACuj",
+"POUYSjzUqR","d7vjMZUnqt","FFDuiyofH3","jeskSNo0Qb","L7cGcgtCA5","YjB9tJ2mQi","Vprf2MmsIo","0MR5XzY1GY","taOXKpAhR1","6q6L9FFDui",
+"pFrrlOxWIH","5Drn0uN6r3","mX2GEulk41","HP433hUTw7","dpe1viqv4k","FLsphNhXdu","POUYSv1Hln","55rfBguMb8","O3iyQGrDg7","2Yz7EJIqXi",
+"ksJbyuoStw","tl72WUmaEv","9y4lwFFDui","zFgtBaFFss","GXdoHAIYUu","nlaByWreyP","7fKYUuLtKs","uTacx8FmFH","mX2GEFFDui","djsrvpFrrl",
+"fmIK15ZaEz","atef2580YD","uPX7G1LB1L","zz4ZUHfyNQ","jiVBPyToGW","iqv4kVerEA","kZANmoVQp6","TCgPpk85Ae","tvdkDVNCPd","yluBx580YD",
+"euZA5OUqFM","lm0pDpvgjS","e6e4zkB5nP","0BmCyi3pyd","VBjhzFNYIM","7Ow5CyToGW","Oz8yZmX2GE","hUTw7CqqaD","FNYIM7fsYM","B3qem5ZaEz",
+"Cp3mZcL0aE","VBjhz4QMc9","MK07YQ6hMC","UlU3MiKqhr","UlU3MRzaZA","lweGyuPX7G","JIqXizqH0W","9eoRcL7cGc","0KyfswiHrZ","QworuOxWIH",
+"pvgjSsuY4x","y94nwuZPqg","oVQp6lViBv","JKWYRK20wK","JJs5mGrDg7","y94nwnlaBy","zqH0W6AFT0","FxX9qs7Mxk","Ul4a1tl72W","KASQ8MezSW",
+"Ss0ZuhSSvQ","6AFT0SmGzv","BGaQYOz8yZ","uTacxGrDg7","gf8rIYOfrY","RACujOz8yZ","In3NSiwzGk","Y1mC0n8pJ9","L7cGczY1GY","2DREslj07Q",
+"MmKGJokgRi","n8pJ9JRJQB","jfREuFVMxo","bgJAz0YAGH","LDk6f5ZaEz","618DiK20wK","MmsIoOxWIH","5VZjSpWiOs","lH1ktMGlTF","W3VFHWMiS3",
+"azIWpuPX7G","0MR5XWMiS3","FGzgpSbRYy","v2eC37lUXZ","6AFT0jiVBP","HP4335Namm","lweGypv0i7","WPmlxiqv4k","zFgtB2hEEU","CIShG2Nslm",
+"oVQp6vkCHH","KsjRKciuWz","8cVD3GWqqX","HlUbFjtn0X","dpe1v9eoRc","RsQUqCK5W7","FFDui8FmFH","zbIYYFFDui","F6PT2RBhp0","Mm8sigtCA5",
+"GXdoHDcpWB","14FLR5Mg9r","uN6r3tl72W","64s8NzmLYD","suY4xStlDJ","SWfouvOqCE","5iGN59y4lw","1j5L8G1RhS","PYBf4Cp3mZ","ZuDtDjeskS",
+"piJSk8TxD7","4dEz6Yh1hF","BCxeCY1mC0","FjHXRFLsph","cShY2pvgjS","iB08lxXTI4","SmGzvxXTI4","uZPqgOHaBz","24ARFJKWYR","NhXduix74r",
+"LbRTHYOfrY","lsQGoyToGW","5nmWvpAhR1","JkzUnM6qcG","0YAGHPOUYS","2hEEUazIWp","vOqCETCgPp","lsQGoVBjhz","CNHmvjSjS3","lsQGoQbxXc",
+"MmKGJxReec","S77LHZJTXH","8TxD7X6Pin","0MR5XLewvM","6AFT0qQxHP","X6PinhE1Ql","Dz1R32DREs","Vprf2lj07Q","aDGtSa00b5","jzUqRlCMxy",
+"hE1QlUlU3M","4W0Tlrz7Ut","gtCA5aL6AJ","45cIHP6bcg","M6qcGThjNn","l83Udt59lR","oQ87rPb1pa","ZUnqtBpYhV","aFFssMezSW","oVQp6yvOMI",
+"VerEAl83Ud","HzZT8t98iW","jtn0Xdjsrv","mX2GElH1kt","OHaBzLDk6f","s93Ml2DREs","fmIK1GXdoH","KASQ8cQOnv","0YAGH8TxD7","nnP8oCfgr3",
+"9iGoTxReec","SmGzv55rfB","kB5nPuupzk","5ZaEzOz8yZ","7hyVvCp3mZ","zz4ZUJIqXi","HzZT8yofH3","he9IA3otm6","brhlQjfREu","zFgtBQClRL",
+"ZzJHWsoy9t","UmaEvs7Mxk","mz8gxDcpWB","hE1Ql5iGN5","5iGN5CqqaD","WmadADz1R3","yToGWKZamH","VjCZq0YAGH","cmXIXIBe8k","nnP8ogtCA5",
+"ciuWzWMiS3","5ZaEziB08l","fcJOyjS1aj","uN6r3t59lR","JkzUnUmaEv","5VZjSB3qem","pv0i7hE1Ql","UlU3MazIWp","B3qemmX2GE","QbxXcuZPqg",
+"8xEKzWaim6","W3VFHix74r","CIShGChuy3","vOqCEZuDtD","mX2GE8TxD7","8xEKzVprf2","lsQGocShY2","1j5L8zFgtB","SmGzvWMiS3","rz7Ut0Wr5y",
+"Ss0ZuqaofN","dmoS76q6L9","ZzJHW7fKYU","KsjRKi3pyd","qaofNtjQxs","QbxXcFxX9q","CIShGiqv4k","JIqXiSmGzv","MmKGJlCMxy","soy9tulk41",
+"9iGoTKZamH","0YAGHrhl0J","MmsIooVQp6","s7MxktAOsr","CqqaDQbxXc","0YAGHM3zXL","DQimpyEfy9","NcICAcShY2","v8yFNa00b5","PYBf4pT8wu",
+"fcJOyjSjS3","lCMxyTwano","ECMvUxXTI4","sqVrfix74r","ZzJHWNo0Qb","9GXkXfmIK1","IjTwPuoStw","yToGWNhXdu","lweGyThjNn","AmdQdguMb8",
+"ni2v1S2Dfu","cL0aEtlILt","v1Hlns93Ml","FcWrWgdQsS","zFgtBM3zXL","MmKGJh1zcH","AXpwEMojnP","djsrvQssNC","lsQGoMaJQs","QssNCDz1R3",
+"ogLgc0ao3l","9y4lwdhSuH","BFkb8Zv7z0","3otm6OHaBz","5ZaEzzQt6Q","zY1GYjeskS","9XyT9GSQwj","MK07YzHF1q","brhlQ29QAz","uupzkXflUq",
+"jtn0XpWiOs","Mm8siHfyNQ","pAhR17X3uy","14FLRNo0Qb","K20wKFPfSE","oQ87rSjskQ","iqv4kMK07Y","pmeCd3weIF","ru4UGn8pJ9","RsQUqMGlTF",
+"gIYvEBCxeC","K20wKeuZA5","P6bcgtjQxs","RpBQmWDVWJ","i3pydni2v1","SjskQM3zXL","WaWsvfcwDa","ru4UGGv3Fq","pT8wuWaim6","uPX7GqQxHP",
+"yluBxbZLvS","BbwgApv0i7","0h1b1v2eC3","jSjS3M6qcG","s7MxkpmeCd","WMiS3pWiOs","GWqqXoVQp6","VNCPdLewvM","EdBKcblLA9","F6PT2gIYvE",
+"lweGyaDGtS","QbxXcuAWyp","aDGtS0MR5X","s93Mljtn0X","zmLYDEOE1o","bZLvSMm8si","jSjS3JKWYR","lpF6WZuDtD","0h1b1OUqFM","guMb8lkMUA",
+"uupzk0Kyfs","1LB1Lru4UG","Yh1hFsoy9t","X6PinVLTy6","8U2nUcShY2","LbRTHSjskQ","9eoRcECMvU","618DiWmadA","suY4x4W0Tl","Waim6F6PT2",
+"Kr8ysZJTXH","7Ow5CjS1aj","0PktIl83Ud","lj07QYOfrY","taOXK5VZjS","P6bcgDG4sT","tvdkD8FmFH","faHirZUnqt","ZzJHWxReec","P6bcgpFrrl",
+"Oz8yZ1j5L8","Dz1R3AgJHQ","F6PT2QWxoT","blLA9JkzUn","azIWpMojnP","n1pmO5iGN5","07n1cF6PT2","RxrsmeuZA5","GWqqXSs0Zu","CqqaDprNT6",
+"vkCHH0MR5X","RmDcr0Kyfs","euZA5oQ87r","jfREuv8yFN","7fsYMcL0aE","jfREuLewvM","iqv4k7fsYM","MmKGJUlU3M","vOqCEni2v1","pvgjSFPfSE",
+"oQ87rtl72W","Mm8sijS1aj","SbRYyni2v1","EoToPJRJQB","FPfSEe6e4z","MmKGJOHaBz","tvdkDatef2","0PktIX6Pin","ReKEWzHF1q","fcwDaMojnP",
+"CdyBV5iGN5","lpF6W5Drn0","X6PinLbRTH","UlU3MpiJSk","WreyPjzUqR","zY1GYdmoS7","OUqFMOHaBz","qQxHP64s8N","d7vjMAXpwE","SmGzvYf2Ec",
+"azIWpFFDui","gdQsSReKEW","CNHmvuTacx","cL0aEQ6hMC","O3iyQlj07Q","JkzUnlsQGo","brhlQGv3Fq","ZhwG114FLR","uvf7Amz8gx","NhXduRsQUq",
+"zmLYDtaOXK","Dz1R3MaJQs","v1HlnG1RhS","okgRiIBe8k","FnPFBFVMxo","XflUq9iGoT","Uvlv4K4GS8","QYxC0SbRYy","qQxHPOUYuF","8U2nUIn3NS",
+"tuDySJXljW","rz7UtKZamH","FFDuikZANm","CIShGGWqqX","tvdkDsoy9t","M6qcG0YAGH","pT8wuJRJQB","F6PT2euZA5","QChxsiwzGk","3weIFx3LDe",
+"BCxeCpiJSk","rKDLJZuDtD","fcwDaaez9y","ksJbylpF6W","ThjNnTa8f6","Uvlv4Gv3Fq","AXpwE7ku1p","FwEJzfcJOy","wiHrZO3iyQ","azIWprKDLJ",
+"pv0i729QAz","suY4xEoToP","MezSWbZLvS","Ta8f6W7cTs","piJSk16lHc","dpe1v0Kyfs","fFDrJGXdoH","Mkgy8SWfou","rhl0J9GXkX","Dz1R30Wr5y",
+"a00b5d7vjM","QYxC0ZuDtD","CdyBVdQ586","s7MxkI7p2a","yToGWuQIcz","0ao3lVIlwP","14FLR9GXkX","ulk41hYBCK","Pb1paciuWz","ksJbym4bxU",
+"5Mg9rECMvU","AOgEezFgtB","lj07QI7p2a","ZuDtDRxrsm","QnJ1SLewvM","oQ87rgIYvE","JXljW7hyVv","5Drn0OHaBz","lCMxyoGu6x","RsQUqYjB9t",
+"3weIFk85Ae","24ARFUlU3M","07n1coQ87r","4W0TloVQp6","zbIYYZhwG1","t98iWWreyP","07n1cjS1aj","uJScXKASQ8","S2DfuJ2mQi","Uvlv4QChxs",
+"t59lR7fKYU","AXpwEZUnqt","ciuWzB3qem","jtn0XJJs5m","Cp3mZuvf7A","t98iWrKDLJ","1v5hHuJScX","Y1mC0Yf2Ec","VBjhzfFDrJ","JRJQBVjCZq",
+"FjHXRSWfou","IRh48hE1Ql","jfREuVerEA","7ku1pStlDJ","QClRL5iGN5","he9IA5Namm","7lUXZru4UG","tjQxsPYBf4","ZuDtDtAOsr","TXQ0ZJKWYR",
+"OHaBzv8yFN","TXQ0ZfLNg8","RACujrhl0J","hi5X748cHL","Rxrsm9eoRc","blLA96AFT0","uJScX1v5hH","0Kyfs3otm6","e6e4z5drc6","16lHccL0aE",
+"yEfy9L7cGc","StlDJMmKGJ","MmKGJguMb8","xciqpDz1R3","MojnP14FLR","b29RJbgJAz","hSSvQBpYhV","FwEJz1v5hH","ZUnqtuJScX","Gv3Fq4QMc9",
+"DQimp07n1c","DLhzM4dEz6","VNCPdatef2","h1zcHsoy9t","vkCHHxReec","8FmFHbrhlQ","hUTw7Mkgy8","LbRTHpT8wu","Uvlv4JKWYR","No0QblViBv",
+"8hJdtzQt6Q","GrDg7tvdkD","Mm8sifaHir","WaWsvEOE1o","S2DfujiVBP","lm0pDECMvU","kZANms7Mxk","X6PinMmsIo","Uvlv4EoToP","J2mQiTwano",
+"BCxeCCK5W7","Zv7z0W7cTs","yvOMIS77LH","kZANmuupzk","2TRI7Waim6","GSQwj0BmCy","CqqaDFwEJz","CIShGprNT6","fqypyMK07Y","No0QbMm8si",
+"FPfSEFGzgp","L7cGcMm8si","fmIK1qaofN","HlUbF24ARF","ulk41n8pJ9","5iGN5Yw2oU","GWqqXaFFss","Yh1hFgIYvE","lXFOBIKxdL","RACujSs0Zu",
+"8xEKzJJs5m","lCMxy8U2nU","OUqFM3otm6","aDGtSRACuj","I7p2aX6Pin","5iGN5FjHXR","Vprf2s7Mxk","taOXKZhwG1","IKxdL7fKYU","0MR5XFPfSE",
+"Mm8silH1kt","DLhzMKZamH","ni2v1NOHsz","hUTw7FcWrW","5Mg9ri3pyd","tl72W0Wr5y","DG4sToQ87r","BbwgAtl72W","BGaQYYjB9t","CxVEfEOE1o",
+"nnP8ozmLYD","9iGoTThjNn","jeskSh1zcH","lCMxyFVMxo","5NammQbxXc","9XyT914FLR","16lHcx3LDe","vOqCEWMiS3","brhlQzqH0W","GSQwjFFDui",
+"9y4lwB3qem","taOXKPb1pa","CxVEfUlU3M","1LB1L6q6L9","HP433ZJTXH","5VZjSuvf7A","oQ87r5drc6","QChxsXyPZN","D6rByK20wK","PYBf49XyT9",
+"X6Pin29QAz","aFFss2ZHdk","n1pmORsQUq","64s8Nrhl0J","lm0pDbrhlQ","lkMUAZv7z0","Uvlv49GXkX","t98iWBGaQY","14FLRfcJOy","0BmCycmXIX",
+"Yf2EctjQxs","LDk6fprNT6","VerEArz7Ut","bgJAziB08l","ciuWzgdQsS","bZLvSBFkb8","lsQGoVNCPd","YjB9t4dEz6","0PktIFhtgl","2NslmuJScX",
+"RmDcrQYxC0","SbRYy8U2nU","0BmCyCdyBV","Yf2EcIjTwP","F6PT2580YD","KsjRKlj07Q","jS1ajDQimp","uJScXAkKTk","nnP8oWmadA","nlaBy2hEEU",
+"atef2MmsIo","hYBCKFFDui","SWfouFLsph","pv0i7AXpwE","nnP8okZANm","uLtKsWreyP","7hyVvRACuj","VNCPdOxWIH","jS1ajpvgjS","HzZT8W7cTs",
+"iqv4knlaBy","StlDJI7p2a","7lUXZIBe8k","fmIK1pv0i7","JRJQBK4GS8","O3iyQiB08l","ZuDtD7fsYM","7lUXZpvgjS","VIlwPyToGW","9XyT9brhlQ",
+"ydG8USbRYy","MezSWx3LDe","4W0TlksJby","W3VFH9y4lw","i7WMQQ6hMC","ThjNnOUYuF","xXTI4zqH0W","ReKEWCIShG","0MR5XTXQ0Z","8hJdtMkgy8",
+"ru4UGsuY4x","SmGzvhE1Ql","yvOMI2DREs","JkzUnKASQ8","cShY2taOXK","2DREsuN6r3","O3iyQyvOMI","t98iWoVQp6","zqH0WjS1aj","2DREsC2Irc",
+"DQimp2DREs","fLNg8ksJby","vLsmSMmKGJ","KsjRKSmGzv","0BmCyoVQp6","AXpwEn1pmO","IBe8ks7Mxk","h1zcH618Di","aDGtSpT8wu","aFFssOUqFM",
+"KsjRKjiVBP","qUJMdt59lR","uLtKsguMb8","QbxXcOz8yZ","S2DfuNxx9V","x3LDe4W0Tl","dhSuH9y4lw","B3qem0ao3l","5ZaEztjQxs","lH1kt4W0Tl",
+"lXFOBMK07Y","16lHc4QMc9","5iGN564s8N","Dz1R3fqypy","fcJOyEoToP","7lUXZv8yFN","bgJAzK20wK","MmKGJNOHsz","nnP8oOUYuF","vkCHHD6rBy",
+"i3pydVIlwP","Yw2oUStlDJ","EOE1ohSSvQ","l83Ud5nmWv","euZA5CNHmv","dhSuHSmGzv","ZuDtDU3yw5","580YDFFDui","mz8gx4dEz6","aez9yKASQ8",
+"tvdkDpiJSk","CxVEfFPfSE","1j5L8K4GS8","9GXkXCqqaD","mz8gxStlDJ","CxVEfkB5nP","5Drn0QbxXc","AIYUuQClRL","iB08lhi5X7","7hyVvAOgEe",
+"HlUbFRsQUq","VerEAMojnP","XflUqQWxoT","0h1b124ARF","tAOsrRxrsm","Nxx9V618Di","QssNC8cVD3","HRxd8tl72W","yvOMIFLsph","POUYS8U2nU",
+"8cVD3djsrv","a00b5cmXIX","soy9tfaHir","iqv4kMm8si","tl72WCK5W7","QWxoTVjCZq","fcJOyhi5X7","oGu6xqaofN","2Yz7E2Nslm","Zv7z0rhl0J",
+"BbwgAix74r","8RCUApvgjS","sx5Gl8cVD3","FGzgp5iGN5","nlaByCNHmv","5NammQ6hMC","uvf7AJJs5m","FGzgpAkKTk","618Di5Mg9r","oVQp64W0Tl",
+"gjUTupFrrl","6q6L9oGu6x","LewvMkZANm","JIqXiXflUq","DLhzMVBjhz","Ta8f62Yz7E","dpe1vpFrrl","5VZjSMK07Y","580YDIRh48","d85a9RkQke",
+"8TxD70BmCy","s7MxkS77LH","HlUbFzQt6Q","CdyBVJJs5m","Yf2Ec07n1c","blLA9GSQwj","MmKGJThjNn","blLA9DLhzM","NAFuwoGu6x","RzaZAF6PT2",
+"lpF6WWaim6","Cfgr3HzZT8","QClRLZ4I1v","RpBQmlpF6W","8RCUAJIqXi","5nmWvO3iyQ","vLsmSgjUTu","d85a92Yz7E","CIShG7lUXZ","dhSuHWMiS3",
+"ni2v1bgJAz","JkzUn5IhmG","5Mg9r9GXkX","RmDcrhi5X7","DLhzM5iGN5","ReKEW0Kyfs","lH1kt5Mg9r","oQ87r0h1b1","StlDJSWfou","580YDNhXdu",
+"No0QbtvdkD","QbxXcKsjRK","OHaBztaOXK","CK5W7Q6Lix","pT8wus4786","FjHXR5ZaEz","AgJHQ0BmCy","FFDuihE1Ql","jtn0X0BmCy","QbxXcyofH3",
+"pFrrlMK07Y","aez9ykB5nP","45cIHW7cTs","GrDg7Rxrsm","UmaEviKqhr","AOgEeP6bcg","8xEKzQChxs","Pb1pa4QMc9","JRJQBzmLYD","FcWrWW3VFH",
+"XflUq0ao3l","0YAGHMmKGJ","zHF1q9GXkX","aez9y9rlg9","No0QbHzZT8","DG4sTzY1GY","BpYhVvkCHH","lj07QReKEW","iB08lJXljW","AOgEeHRxd8",
+"hE1Qlb29RJ","Yw2oUFFDui","Oz8yZvOqCE","QYxC0zz4ZU","d85a9W7cTs","IjTwPlweGy","HP4330h1b1","mX2GEJRJQB","HlUbFlj07Q","AgJHQQ6hMC",
+"9iGoTd7vjM","qaofNlweGy","t59lRnlaBy","Nxx9V07n1c","6AFT01LB1L","VLTy6IRh48","ReKEWRmDcr","FPfSElkMUA","aFFssS2Dfu","EOE1oK20wK",
+"ZJTXHWaim6","14FLRuN6r3","kB5nPaez9y","CNHmvCfgr3","7ku1pG1RhS","XyPZNgdQsS","dpe1vRxrsm","16lHcqQxHP","ni2v10ao3l","ydG8UIjTwP",
+"MGlTFv2eC3","Kr8ysJkzUn","9GXkXxXTI4","fqypyQnJ1S","zmLYDU3yw5","hSSvQyToGW","Z4I1vru4UG","rKDLJtAOsr","OxWIH5drc6","MezSW4W0Tl",
+"o8Uyd5nmWv","uN6r3fmIK1","5Drn0uTacx","OUYuFBFkb8","CIShGZzJHW","uPX7GGrDg7","MmsIofFDrJ","0MR5XzqH0W","tl72Wxciqp","0Kyfs8cVD3",
+"CxVEfmX2GE","bgJAzNOHsz","fFDrJ4dEz6","cmXIXQWxoT","VBjhzD6rBy","fcJOyt98iW","jiVBPQbxXc","h1zcHWmadA","9iGoTTa8f6","guMb8WreyP",
+"S77LHAXpwE","0BmCycQOnv","rhl0JWPmlx","UlU3MaFFss","FcWrWF6PT2","9GXkXKZamH","jiVBP0MR5X","NOHsz45cIH","zbIYYbrhlQ","ksJbyFhtgl",
+"dpe1vuZPqg","oGu6xatef2","lj07QQbxXc","dpe1vLDk6f","lH1kt5nmWv","qUJMdLewvM","djsrvfcJOy","yluBxNxx9V","fcJOyd7vjM","M6qcGNo0Qb",
+"tuDySlweGy","QYxC0qaofN","QChxsTa8f6","fcJOy1j5L8","faHirdpe1v","DLhzMQClRL","Zv7z0aFFss","JXljWHfyNQ","y94nwRxrsm","fFDrJ1LB1L",
+"dmoS75VZjS","oVQp6zHF1q","ydG8UyofH3","5VZjSNhXdu","oGu6xFhtgl","No0QbtuDyS","zQt6QAgJHQ","GWqqXgf8rI","8RCUAVBjhz","jS1ajqaofN",
+"0YAGH9y4lw","gjUTulsQGo","y94nwZUnqt","14FLRlViBv","RBhp0Fhtgl","Chuy3KsjRK","GSQwj5Mg9r","ECMvUIBe8k","v8yFNZUnqt","VNCPdL7cGc",
+"8RCUAcShY2","W7cTsd85a9","BCxeC4dEz6","8TxD7FjHXR","Mm8si2ZHdk","Yf2Ec5Namm","Pb1pa7Ow5C","uupzkBbwgA","5drc6EdBKc","a00b5n1pmO",
+"zqH0W7X3uy","ksJbyW7cTs","FwEJzRpBQm","HP433SWfou","IBe8ka00b5","nlaByAmdQd","CNHmvcL0aE","SbRYyzbIYY","48cHLL7cGc","FNYIMdQ586",
+"Yh1hFgjUTu","xciqp07n1c","JXljW07n1c","DG4sT2Yz7E","AIYUuZ4I1v","Uvlv4No0Qb","FnPFBMGlTF","Yf2EczmLYD","GWqqXlsQGo","8xEKzdpe1v",
+"ECMvUB3qem","gtCA5BCxeC","4QMc9GXdoH","AgJHQfmIK1","3otm6m4bxU","uZPqggjUTu","2DREszQt6Q","IKxdLNcICA","ix74r5ZaEz","5ZaEzjeskS",
+"fcJOytl72W","MezSWwiHrZ","hUTw7AgJHQ","kB5nPguMb8","5Drn0zz4ZU","9eoRcjeskS","n1pmOrhl0J","UmaEvkB5nP","SWfous4786","7lUXZn1pmO",
+"GWqqXtaOXK","HlUbFXflUq","6AFT0t98iW","jSjS3OxWIH","aFFss9GXkX","lsQGofLNg8","WreyPI7p2a","RzaZAyofH3","SbRYyqQxHP","euZA5pAhR1",
+"0h1b1JXljW","SbRYypv0i7","WmadAcL0aE","LDk6fhi5X7","tuDyS8hJdt","M6qcGBGaQY","QChxsMkgy8","Gv3Fqk85Ae","m4bxUBFkb8","U3yw5y94nw",
+"0BmCyuupzk","vLsmSDG4sT","xciqpOHaBz","FnPFBnFqik","1LB1LZUnqt","5iGN5yvOMI","7Ow5Cs7Mxk","aez9yRpBQm","pAhR1WDVWJ","CdyBV48cHL",
+"mz8gxpv0i7","ru4UGdpe1v","oQ87rO3iyQ","VLTy60YAGH","618DiPOUYS","Q6hMC4dEz6","jzUqRYh1hF","29QAzlkMUA","VLTy6pv0i7","CIShGS77LH",
+"5iGN5K4GS8","IKxdLiqv4k","tvdkDFxX9q","EoToPcmXIX","tAOsrkZANm","m4bxUiKqhr","IRh48C2Irc","SWfou8RCUA","WmadAIjTwP","uN6r38TxD7",
+"qUJMd8cVD3","mX2GEXyPZN","CNHmvjiVBP","RxrsmrKDLJ","GXdoHBpYhV","jSjS3LewvM","ZJTXHKZamH","U3yw5FFDui","FjHXR1LB1L","fFDrJUlU3M",
+"AkKTkBbwgA","jtn0Xk85Ae","lsQGoGv3Fq","8U2nUn1pmO","CIShGlj07Q","In3NSyEfy9","QssNCzHF1q","64s8NokgRi","SmGzvD6rBy","fFDrJpAhR1",
+"mz8gxm4bxU","2Yz7ELewvM","QssNCJJs5m","Z4I1vMaJQs","lm0pDfFDrJ","2ZHdkPb1pa","JKWYRAXpwE","6AFT0OUqFM","lpF6WTXQ0Z","hE1QlCdyBV",
+"NAFuwlpF6W","0PktI5IhmG","ni2v1RACuj","tAOsrPOUYS","pv0i7cQOnv","qQxHPJJs5m","8hJdtDcpWB","FFDuiQnJ1S","bgJAz7ku1p","QnJ1SZUnqt",
+"W7cTslViBv","uPX7GKsjRK","7lUXZY1mC0","CqqaDMGlTF","jzUqRFFDui","lsQGoiwzGk","ZhwG1pWiOs","5Mg9rHRxd8","K20wKwDajX","tuDySOHaBz",
+"7fKYUJJs5m","WMiS3Twano","Ss0ZuksJby","UmaEv0h1b1","cmXIXyEfy9","Q6hMC3weIF","0ao3lxXTI4","nnP8oFnPFB","bgJAzciuWz","wiHrZuN6r3",
+"uJScXuN6r3","AXpwEgf8rI","IjTwP5drc6","fcwDaECMvU","8hJdtLewvM","djsrvs7Mxk","uN6r3HRxd8","4W0TlyEfy9","NcICAxXTI4","x3LDe5Drn0",
+"okgRi4dEz6","9eoRc3otm6","1LB1LUl4a1","guMb8BbwgA","a00b5WDVWJ","VjCZqAOgEe","AgJHQYh1hF","uTacxYh1hF","Uvlv4ciuWz","ZzJHWlj07Q",
+"ogLgc9XyT9","DQimp7hyVv","suY4xReKEW","GrDg7qUJMd","HP433rKDLJ","jSjS3zFgtB","P6bcgguMb8","hSSvQiKqhr","FwEJzJKWYR","4dEz6lCMxy",
+"lH1ktuQIcz","nlaByhYBCK","Q6hMCJkzUn","l83UdAgJHQ","4dEz6IRh48","zY1GYgIYvE","ThjNn0Wr5y","Chuy3EoToP","HfyNQnlaBy","7hyVvDcpWB",
+"Ul4a1lXFOB","QbxXclpF6W","iwzGkHP433","okgRiIn3NS","BpYhVUlU3M","0PktIhSSvQ","GWqqXqUJMd","Q6Lixv8yFN","5VZjSGSQwj","oQ87rFGzgp",
+"d85a9MmKGJ","Oz8yZxciqp","k85AeSs0Zu","wiHrZ2TRI7","KZamHzY1GY","FPfSEoQ87r","GSQwjhSSvQ","d85a9t98iW","Q6hMCtAOsr","k85Aerz7Ut",
+"WPmlxhYBCK","RpBQm0YAGH","MK07Yi3pyd","EoToPWMiS3","MmKGJa00b5","DcpWBuvf7A","K4GS8fmIK1","mz8gx2TRI7","SWfoud7vjM","RkQkerz7Ut",
+"9rlg95IhmG","cShY2GXdoH","RxrsmzbIYY","5Mg9riqv4k","DQimpDG4sT","o8UydZuDtD","n8pJ9TXQ0Z","Q6LixIjTwP","yluBxC2Irc","S77LHP6bcg",
+"jeskSWaim6","RACujazIWp","KASQ8he9IA","7fsYM7fKYU","55rfBni2v1","4dEz6rz7Ut","1LB1LpmeCd","uupzkGrDg7","QYxC0hSSvQ","suY4xgf8rI",
+"ZUnqtsqVrf","iKqhr5iGN5","WDVWJCfgr3","uoStwuAWyp","Kr8ysYf2Ec","iqv4kJJs5m","y94nwYjB9t","he9IAiqv4k","FNYIM9XyT9","KsjRKStlDJ",
+"atef2yvOMI","Ul4a1VjCZq","IKxdLFLsph","jfREuAgJHQ","QbxXciwzGk","3weIFPb1pa","2ZHdkOxWIH","Gv3Fqzz4ZU","prNT6NcICA","hUTw7QnJ1S",
+"t98iWuZPqg","JkzUn14FLR","GrDg7GSQwj","gtCA5pmeCd","uZPqgRmDcr","5ZaEzYh1hF","Z4I1vUmaEv","X6Pin0YAGH","soy9tNxx9V","Ul4a1QnJ1S",
+"MojnP2ZHdk","cmXIXHRxd8","9rlg9Ta8f6","t98iWtaOXK","CNHmvDG4sT","EdBKcUl4a1","O3iyQJIqXi","soy9tzY1GY","5nmWvKASQ8","ZuDtD9eoRc",
+"IKxdLaFFss","qQxHPQnJ1S","55rfBx3LDe","dpe1v9iGoT","2ZHdktuDyS","L7cGcrhl0J","atef2djsrv","JRJQBRACuj","MojnPLbRTH","uJScXyluBx",
+"FjHXRxReec","FhtglgjUTu","iwzGkpFrrl","5VZjSiwzGk","ECMvUVBjhz","s4786ksJby","iqv4kHP433","TXQ0ZWreyP","24ARF4dEz6","suY4xazIWp",
+"6AFT0Waim6","ydG8U8U2nU","0Kyfs0PktI","D6rBy5Mg9r","uN6r3Q6hMC","TXQ0ZgjUTu","FwEJzh1zcH","U3yw5QChxs","brhlQBpYhV","NhXdujtn0X",
+"djsrvfmIK1","RkQkeCxVEf","jzUqR4dEz6","XflUqd7vjM","AgJHQpiJSk","VBjhzM3zXL","v1Hln7X3uy","7ku1pFFDui","x3LDeksJby","jzUqRqQxHP",
+"1v5hHhe9IA","8U2nULbRTH","O3iyQGXdoH","lpF6Wrhl0J","RmDcrLewvM","yofH3ReKEW","YOfrY5ZaEz","lH1ktSmGzv","tAOsr1LB1L","P6bcgiKqhr",
+"dQ586RpBQm","zz4ZUYOfrY","kZANm5Mg9r","v1Hln7ku1p","5IhmGRxrsm","nnP8ozqH0W","ECMvU7hyVv","oGu6xmz8gx","vLsmSAIYUu","t59lRt98iW",
+"HP433RmDcr","29QAziB08l","s7Mxkn1pmO","YjB9tMGlTF","Mm8sinFqik","JRJQBCfgr3","tuDyScmXIX","Twano5Mg9r","RzaZAv8yFN","fLNg8KASQ8",
+"YjB9tDQimp","t59lRfLNg8","o8UydiKqhr","JIqXiCp3mZ","oGu6xpv0i7","HfyNQ5Mg9r","GSQwj2DREs","POUYSZ4I1v","qUJMdMGlTF","sx5GlW3VFH",
+"zY1GY6AFT0","uQIczmX2GE","aez9yFjHXR","2ZHdk8U2nU","RzaZAatef2","lH1kt580YD","lweGyt59lR","MGlTFQWxoT","SjskQMmKGJ","NAFuwVprf2",
+"POUYSRpBQm","yluBxt98iW","3weIFhi5X7","aez9yXyPZN","nFqikIKxdL","WDVWJuLtKs","ZJTXHuAWyp","M3zXLAOgEe","dhSuHs93Ml","6q6L9euZA5",
+"YjB9tRkQke","mz8gxru4UG","fcwDaQ6hMC","xXTI4AkKTk","nlaByRzaZA","HzZT8Yf2Ec","QbxXcpT8wu","bZLvSnFqik","55rfBM6qcG","4W0TluoStw",
+"9eoRcP6bcg","G1RhShi5X7","EOE1oLbRTH","7hyVvlXFOB","9XyT99eoRc","ix74rEOE1o","sqVrffaHir","7Ow5CFGzgp","O3iyQ7ku1p","nlaBy55rfB",
+"uAWyp8TxD7","yvOMIZhwG1","soy9tzFgtB","07n1ck85Ae","7ku1pAgJHQ","AmdQd16lHc","8cVD3azIWp","MGlTFa00b5","hUTw7FVMxo","8U2nUQworu",
+"piJSkbgJAz","8FmFHRzaZA","uZPqgazIWp","pv0i7ZUnqt","iqv4kuPX7G","FwEJziB08l","e6e4z8RCUA","L7cGctlILt","MGlTFZv7z0","4W0Tls93Ml",
+"JJs5m0ao3l","2NslmTa8f6","WmadAdjsrv","0Wr5yI7p2a","FNYIMzbIYY","djsrvP6bcg","5VZjSkZANm","GWqqXStlDJ","Nxx9VyvOMI","AOgEezqH0W",
+"0ao3liKqhr","lViBvEOE1o","S77LHPYBf4","9iGoTHRxd8","9GXkXFjHXR","9XyT9VLTy6","VIlwPbrhlQ","0ao3lrKDLJ","tuDySPb1pa","lweGyzFgtB",
+"MK07YM6qcG","Uvlv4lpF6W","blLA96q6L9","kB5nPgf8rI","yEfy9In3NS","dmoS7ogLgc","hUTw71v5hH","AmdQdxXTI4","mz8gxUl4a1","J2mQi48cHL",
+"WaWsvAOgEe","UmaEvQ6Lix","XflUqbrhlQ","yvOMIFhtgl","NAFuw9XyT9","SbRYymz8gx","aFFssQWxoT","FhtglRkQke","7ku1ptl72W","VIlwPuJScX",
+"0Wr5ycShY2","VjCZqo8Uyd","W7cTsnnP8o","pv0i7IRh48","faHirUlU3M","x3LDeIRh48","CNHmvyofH3","BGaQYFLsph","X6PinRkQke","Cfgr3Kr8ys",
+"29QAzdmoS7","7ku1pru4UG","M6qcGLewvM","QssNCZUnqt","8U2nUyEfy9","s4786BbwgA","8cVD3QbxXc","ECMvUvkCHH","NhXduguMb8","VIlwPQ6Lix",
+"7hyVvWmadA","0ao3loGu6x","M6qcG5ZaEz","BCxeCxReec","64s8NguMb8","soy9tv1Hln","BbwgAEdBKc","RzaZAQWxoT","MojnPS2Dfu","n1pmO16lHc",
+"gjUTufcwDa","RBhp0jfREu","ReKEWRACuj","MmKGJ24ARF","In3NS8RCUA","9iGoTcL0aE","In3NSIjTwP","7fsYMSWfou","VIlwPoVQp6","CNHmvlXFOB",
+"rhl0Jdpe1v","iwzGkRxrsm","v8yFNfaHir","VjCZqHP433","Kr8ysgdQsS","jzUqR5drc6","fFDrJ6AFT0","lpF6WHRxd8","No0Qb8U2nU","zbIYYIRh48",
+"5Drn0MezSW","RkQkeaL6AJ","BCxeCaFFss","PYBf48FmFH","F6PT20Wr5y","IKxdLzQt6Q","7ku1psoy9t","fcwDaRBhp0","WreyPKsjRK","lCMxyQworu",
+"9y4lwzbIYY","UmaEvNxx9V","VerEA9GXkX","guMb8P6bcg","lsQGoFVMxo","RkQkeeuZA5","aFFss0Wr5y","K20wKFLsph","zQt6Qs4786","MmKGJix74r",
+"24ARFStlDJ","1LB1Ln1pmO","K20wK14FLR","0MR5XGSQwj","M6qcGWMiS3","ZhwG19GXkX","Yf2EcuPX7G","ru4UGs7Mxk","DcpWBlsQGo","FFDuiAIYUu",
+"No0QbuLtKs","WmadAyToGW","FjHXRm4bxU","Q6LixSWfou","MGlTFFGzgp","dQ586L7cGc","XflUqpFrrl","zHF1q8U2nU","azIWpyofH3","lpF6WGSQwj",
+"s93Ml16lHc","tjQxs2DREs","6q6L9h1zcH","oQ87r8xEKz","VNCPdX6Pin","7X3uyCNHmv","sqVrfRACuj","VLTy6DG4sT","QssNCJkzUn","kB5nPrhl0J",
+"MojnPQworu","lXFOBAgJHQ","4W0TlprNT6","IBe8klViBv","hi5X77hyVv","KZamHYjB9t","HlUbFmX2GE","fcwDa2Nslm","MaJQsulk41","W3VFHm4bxU",
+"2Yz7Ek85Ae","i7WMQ9eoRc","7fKYURmDcr","VLTy6HzZT8","h1zcHru4UG","JRJQBdjsrv","FcWrWdpe1v","soy9tGrDg7","0ao3ljiVBP","pvgjS7X3uy",
+"UlU3Mgf8rI","tAOsrHfyNQ","tjQxsKASQ8","d7vjMQ6Lix","wiHrZSmGzv","KASQ8rKDLJ","EOE1oRBhp0","he9IApAhR1","SmGzvGv3Fq","FPfSESmGzv",
+"lH1ktdmoS7","0YAGH24ARF","StlDJHfyNQ","cQOnvtAOsr","UlU3MVIlwP","uvf7A0Kyfs","uvf7AuQIcz","a00b53otm6","Waim6RACuj","VBjhz7hyVv",
+"ZUnqt5VZjS","CqqaDuZPqg","AIYUuJIqXi","l83UduPX7G","pvgjS9GXkX","ZzJHWzz4ZU","gjUTuuvf7A","QnJ1Sjtn0X","fcwDa5ZaEz","GWqqXs7Mxk",
+"QChxslkMUA","6q6L90BmCy","14FLRVLTy6","Oz8yZ9GXkX","ZhwG10BmCy","8FmFHzHF1q","JkzUnIBe8k","lpF6WjeskS","S77LHfcwDa","JKWYRyToGW",
+"0MR5XOz8yZ","iKqhrni2v1","azIWpxciqp","QClRLC2Irc","K4GS8M3zXL","AkKTkhe9IA","Mkgy8NOHsz","uZPqgQWxoT","W3VFHMojnP","zHF1q7ku1p",
+"9XyT9pWiOs","Vprf2oGu6x","v8yFNuZPqg","suY4xHlUbF","t59lRRxrsm","lH1ktYw2oU","Uvlv4zmLYD","CIShGFGzgp","07n1cZUnqt","sqVrfUl4a1",
+"t59lRAOgEe","DcpWBv1Hln","jiVBPiqv4k","SjskQF6PT2","QChxsK20wK","JIqXiKASQ8","RmDcrgjUTu","rhl0JZzJHW","guMb8prNT6","W7cTsQChxs",
+"Pb1pabZLvS","J2mQiwiHrZ","hSSvQC2Irc","ix74rFwEJz","FcWrW14FLR","IRh48zqH0W","2TRI7qaofN","RsQUqtlILt","64s8NzY1GY","GSQwjHzZT8",
+"Y1mC0pWiOs","oQ87rZv7z0","rhl0Jix74r","nlaByZ4I1v","SjskQJRJQB","8hJdtS2Dfu","QworuSs0Zu","Pb1paOz8yZ","JKWYRsqVrf","2Yz7Eaez9y",
+"bZLvSvkCHH","n1pmO9iGoT","No0QbgIYvE","Twanotl72W","cShY2ni2v1","yluBx9XyT9","ZzJHWFNYIM","ciuWzhYBCK","Vprf2KZamH","FGzgphYBCK",
+"GWqqXMmKGJ","Y1mC0WreyP","cL0aEpT8wu","DcpWBCIShG","CK5W74QMc9","7fKYUlXFOB","KASQ8Q6hMC","SjskQAOgEe","FcWrW5iGN5","yvOMINo0Qb",
+"5IhmGrKDLJ","7fsYMsoy9t","LewvMM6qcG","GSQwjXyPZN","M6qcGkZANm","fcJOywDajX","GWqqXsx5Gl","5NammZv7z0","QssNCUvlv4","zqH0WbgJAz",
+"ulk41FPfSE","xXTI4O3iyQ","Kr8ys4dEz6","uTacxyvOMI","Dz1R30h1b1","jSjS35drc6","VNCPdpT8wu","HlUbFQWxoT","Gv3FqpmeCd","aFFssC2Irc",
+"7fKYUHlUbF","DQimpyvOMI","AgJHQuLtKs","XyPZNuoStw","FGzgptuDyS","IBe8kBFkb8","QYxC0uoStw","VjCZqI7p2a","HzZT8BpYhV","lViBv45cIH",
+"v1HlnAkKTk","tAOsr9XyT9","Yw2oUGXdoH","5Mg9rTCgPp","pT8wuxXTI4","okgRipmeCd","b29RJQChxs","CIShGGv3Fq","0PktIix74r","Kr8ysvkCHH",
+"07n1cOUYuF","RzaZABpYhV","RxrsmzqH0W","LbRTHJkzUn","7hyVviqv4k","tAOsrM6qcG","ru4UGDQimp","jzUqRBbwgA","h1zcHzHF1q","RzaZAfFDrJ",
+"BpYhV5Drn0","9rlg96AFT0","rhl0JhYBCK","zY1GYFxX9q","ReKEWZ4I1v","v2eC3TXQ0Z","JkzUnhSSvQ","YOfrY45cIH","lm0pDIRh48","fFDrJprNT6",
+"Mm8siQChxs","OUqFMsx5Gl","TXQ0Z5VZjS","rhl0JzFgtB","kZANm580YD","vLsmSFhtgl","Dz1R3mX2GE","QssNC55rfB","DQimp5iGN5","DcpWBbZLvS",
+"L7cGciwzGk","BGaQYBpYhV","s93MlKr8ys","fmIK1AIYUu","sqVrf5iGN5","hYBCKMK07Y","NOHszaFFss","lH1ktDcpWB","VBjhzcmXIX","nnP8osx5Gl",
+"qQxHPfmIK1","pWiOsblLA9","FNYIM7ku1p","yluBxJkzUn","aL6AJPYBf4","yofH3TCgPp","Nxx9ViB08l","JIqXiWmadA","7fKYUFVMxo","ni2v1zFgtB",
+"MGlTFSbRYy","MmsIouupzk","hE1QlHlUbF","4QMc99GXkX","UmaEvDcpWB","GWqqXFPfSE","iKqhrfaHir","FLsph0h1b1","CdyBVtjQxs","pT8wuv8yFN",
+"8hJdtPb1pa","QssNC7hyVv","NcICAStlDJ","TwanozHF1q","WPmlx48cHL","jtn0XAOgEe","580YDfLNg8","pmeCdblLA9","WPmlxmz8gx","QnJ1SJIqXi",
+"tAOsrazIWp","KASQ85Drn0","qQxHPfqypy","t59lRn8pJ9","zz4ZUUlU3M","7Ow5C6q6L9","a00b5GrDg7","FwEJzChuy3","W3VFHdjsrv","TwanopFrrl",
+"fcwDadhSuH","Uvlv4AXpwE","HfyNQ8xEKz","HRxd8WaWsv","45cIHSbRYy","dmoS7CxVEf","FhtglMojnP","aDGtSECMvU","POUYSVprf2","ciuWzFwEJz",
+"atef2Zv7z0","rz7UtZv7z0","3otm6uQIcz","UmaEvrhl0J","MmKGJ7ku1p","gjUTu1j5L8","fqypyuupzk","BGaQYbgJAz","v1HlnDcpWB","uQIcz9rlg9",
+"rKDLJKsjRK","FhtglzQt6Q","s7Mxkdpe1v","EOE1oFFDui","VjCZqlweGy","yluBxd85a9","h1zcHl83Ud","djsrvv2eC3","BCxeCRACuj","iwzGky94nw",
+"RBhp05iGN5","cQOnvCfgr3","618DiDcpWB","dQ586lkMUA","5VZjSYOfrY","SWfouNxx9V","UlU3MFFDui","AIYUu0ao3l","JIqXiRACuj","aL6AJyEfy9",
+"rhl0J5Drn0","jzUqR0Wr5y","jiVBPQWxoT","pvgjSv8yFN","FnPFBlj07Q","WaWsvtuDyS","dhSuHgtCA5","zbIYYlH1kt","dQ5867Ow5C","24ARF9eoRc",
+"StlDJsoy9t","rz7UtRBhp0","nlaByoQ87r","yofH3oVQp6","Oz8yZFVMxo","cShY2nnP8o","mz8gxPb1pa","ciuWzjfREu","VjCZquN6r3","KsjRKNcICA",
+"nFqiklpF6W","Y1mC0lsQGo","fcJOyCxVEf","5ZaEzhe9IA","F6PT25ZaEz","0h1b1618Di","zqH0W8U2nU","FnPFB14FLR","hi5X7FFDui","djsrvXyPZN",
+"MmKGJ16lHc","MmKGJtvdkD","oVQp6RzaZA","SbRYyF6PT2","taOXKsx5Gl","29QAzCp3mZ","2ZHdk5ZaEz","Chuy3yluBx","M6qcGhSSvQ","FLsphIBe8k",
+"FxX9qEdBKc","HlUbFsuY4x","QssNCHzZT8","lsQGov8yFN","pmeCdX6Pin","cQOnvMezSW","VerEAsqVrf","4dEz6NOHsz","FFDuifcwDa","Oz8yZNAFuw",
+"nnP8omX2GE","NcICAsqVrf","Oz8yZM6qcG","GrDg7WDVWJ","TCgPpiqv4k","TCgPpaL6AJ","lweGycShY2","Nxx9VaDGtS","0PktIpv0i7","vLsmSThjNn",
+"14FLRZzJHW","yluBxVLTy6","Zv7z0lm0pD","NcICARpBQm","fLNg8yvOMI","KsjRKSs0Zu","nFqik6q6L9","fFDrJ618Di","WPmlxRkQke","Mkgy8NhXdu",
+"WMiS3S77LH","WreyPS77LH","hSSvQ0Wr5y","EoToP48cHL","K20wKFNYIM","JRJQBOUqFM","ciuWz14FLR","NOHsz0h1b1","FVMxo5nmWv","s4786vkCHH",
+"0MR5XRACuj","y94nwFVMxo","x3LDeFnPFB","GSQwj5drc6","ReKEWs7Mxk","S77LH0YAGH","HRxd8TCgPp","jzUqRCp3mZ","Cp3mZfFDrJ","StlDJt98iW",
+"EdBKcKASQ8","8U2nUuPX7G","7fKYUv2eC3","rKDLJK4GS8","4dEz6Dz1R3","xReecl83Ud","F6PT28FmFH","J2mQilj07Q","kB5nPReKEW","yluBxMm8si",
+"VBjhzJIqXi","7Ow5CcQOnv","bgJAzgf8rI","Mm8siVIlwP","0Kyfsdjsrv","B3qemFxX9q","v8yFNlkMUA","fqypyx3LDe","FnPFBFxX9q","hi5X7NOHsz",
+"5drc6oQ87r","KZamH5nmWv","JRJQBoVQp6","0PktI7Ow5C","SbRYyJKWYR","KASQ80YAGH","6q6L9RmDcr","ni2v15IhmG","7X3uyF6PT2","8TxD7EdBKc",
+"RBhp0uupzk","gf8rIcmXIX","48cHLh1zcH","JKWYRBpYhV","fcJOy8RCUA","Dz1R3KsjRK","dpe1v0MR5X","Kr8ysaL6AJ","HlUbFB3qem","5Mg9r7X3uy",
+"2ZHdkVerEA","t98iWGv3Fq","gIYvEfFDrJ","Uvlv4EdBKc","QnJ1SfaHir","SWfouxciqp","tAOsrbrhlQ","45cIHvLsmS","1v5hHWDVWJ","TCgPpGv3Fq",
+"IRh485ZaEz","DLhzM2ZHdk","Ta8f64dEz6","aFFssgf8rI","uN6r3uLtKs","64s8Nrz7Ut","5iGN5AgJHQ","UlU3Mulk41","uQIczQWxoT","FFDuimX2GE",
+"45cIHo8Uyd","TwanolkMUA","AIYUuxXTI4","v2eC3ZhwG1","hi5X78cVD3","tuDySzHF1q","3otm6FnPFB","lweGyWaim6","D6rByYw2oU","fmIK1yToGW",
+"No0Qbv1Hln","vLsmSPOUYS","5nmWvFwEJz","RzaZA9rlg9","Cp3mZ5iGN5","dQ58624ARF","MezSWZzJHW","Chuy3mz8gx","1j5L8azIWp","8RCUAlXFOB",
+"8cVD3gtCA5","hi5X7Q6Lix","FwEJz8cVD3","F6PT2aFFss","Vprf2ZJTXH","LewvM0Kyfs","B3qemy94nw","Ss0ZuTa8f6","MmKGJ9rlg9","zHF1q5VZjS",
+"EOE1ouZPqg","IKxdLs7Mxk","jfREu0YAGH","atef2TCgPp","BbwgAAXpwE","pmeCdEdBKc","ydG8UWMiS3","7hyVvsoy9t","ogLgcyEfy9","M3zXLpv0i7",
+"uoStwkB5nP","Vprf2LDk6f","t59lR9eoRc","ZzJHWI7p2a","YOfrYFxX9q","FnPFBStlDJ","MGlTFJKWYR","aez9ys7Mxk","X6Pin2ZHdk","D6rBy3weIF",
+"Cfgr3BpYhV","suY4xatef2","D6rByS77LH","ZUnqtSmGzv","nFqiktjQxs","qQxHPHfyNQ","Nxx9VhUTw7","WreyPCqqaD","sx5Gl0BmCy","4dEz6PYBf4",
+"TCgPpK4GS8","48cHLUmaEv","K4GS8Mm8si","RkQkeStlDJ","CxVEfNo0Qb","JkzUnQworu","RmDcr7lUXZ","Dz1R3qQxHP","55rfBReKEW","zz4ZUMGlTF",
+"s93MlXyPZN","55rfBuupzk","bgJAz7lUXZ","Yh1hFVerEA","RsQUqpvgjS","wDajXoGu6x","I7p2aQChxs","gIYvEBFkb8","5IhmGYh1hF","JkzUn0PktI",
+"CNHmvDLhzM","POUYSFLsph","5ZaEzFFDui","7lUXZW7cTs","5drc6tlILt","rhl0JMmsIo","RmDcr6AFT0","AIYUusuY4x","CxVEfvOqCE","ciuWzhe9IA",
+"JKWYRwDajX","taOXKtAOsr","tAOsrPb1pa","dQ586prNT6","IRh48FwEJz","LDk6faDGtS","8FmFHRxrsm","5nmWvOHaBz","tuDySRzaZA","FPfSEGv3Fq",
+"jzUqRjiVBP","uPX7G07n1c","aez9yiKqhr","OUqFMUlU3M","zFgtBxXTI4","FVMxobZLvS","AmdQdjzUqR","gIYvEfmIK1","No0QbhUTw7","J2mQiyofH3",
+"7lUXZDG4sT","tuDySDLhzM","8cVD3gf8rI","s47865Namm","QClRLAmdQd","blLA9MaJQs","lsQGoECMvU","uPX7GhE1Ql","MojnPQYxC0","7X3uyGSQwj",
+"jiVBPciuWz","oQ87rn8pJ9","pmeCdDG4sT","XflUquAWyp","xXTI4Uvlv4","KsjRKpWiOs","zmLYDEdBKc","piJSkFwEJz","ZUnqtfFDrJ","YOfrY6AFT0",
+"WMiS307n1c","i3pydlsQGo","brhlQuJScX","64s8N5nmWv","iB08l1LB1L","jtn0Xn8pJ9","W3VFH1v5hH","WPmlxhUTw7","07n1cGXdoH","AkKTk7hyVv",
+"o8UydUmaEv","qQxHPAOgEe","tjQxsuN6r3","29QAzrKDLJ","9eoRcZv7z0","TwanoCK5W7","0KyfsQnJ1S","s47861j5L8","IBe8k55rfB","AmdQdNOHsz",
+"Chuy3BCxeC","U3yw5aL6AJ","lkMUA2ZHdk","0YAGHb29RJ","5VZjSzFgtB","iB08lb29RJ","MaJQsdjsrv","SjskQulk41","ZhwG16q6L9","lViBvtl72W",
+"WmadAAOgEe","hSSvQFxX9q","AXpwEh1zcH","brhlQuAWyp","8FmFHFNYIM","zY1GYgtCA5","nnP8opiJSk","0ao3lSWfou","HlUbFjzUqR","aFFssfaHir",
+"zz4ZUNo0Qb","CxVEfZzJHW","xciqpEoToP","K20wKi3pyd","YjB9tZJTXH","uTacxS2Dfu","i3pyd2TRI7","lXFOBcQOnv","VIlwP1LB1L","pvgjSWaWsv",
+"0h1b1yToGW","fLNg8Qworu","yofH3MmsIo","fcwDaNhXdu","IjTwPogLgc","3weIFxciqp","NOHszZUnqt","WreyP3otm6","l83Udaez9y","4QMc9QWxoT",
+"14FLRjeskS","SbRYyECMvU","i7WMQaFFss","Yf2EcWmadA","Q6hMCa00b5","i3pydZJTXH","OHaBz7ku1p","FPfSEzQt6Q","uLtKsAOgEe","IjTwPyluBx",
+"P6bcgRBhp0","yvOMIXyPZN","RzaZAs4786","nFqikLDk6f","QWxoT0Wr5y","pAhR1zz4ZU","ThjNnx3LDe","VLTy62Yz7E","yEfy9aFFss","Ta8f6he9IA",
+"CIShGnlaBy","0BmCyrhl0J","n1pmOK4GS8","fcwDaMmsIo","fqypyAOgEe","VjCZqWMiS3","suY4xVLTy6","LbRTHqQxHP","l83Uddpe1v","F6PT2aL6AJ",
+"OUqFMWPmlx","hYBCKBFkb8","gIYvEBpYhV","jSjS3Qworu","Ta8f6hE1Ql","ix74rY1mC0","FNYIMNOHsz","DcpWBNcICA","vOqCEatef2","ZuDtDIRh48",
+"QChxsKZamH","s7MxkW7cTs","cmXIXuTacx","HfyNQJKWYR","n8pJ9Oz8yZ","Ul4a1FNYIM","oQ87rSbRYy","OHaBzfLNg8","pv0i7RsQUq","faHirzz4ZU",
+"VNCPdQWxoT","5ZaEz3weIF","Ul4a1zqH0W","HP433DQimp","AOgEe9XyT9","hSSvQRxrsm","gIYvEFcWrW","FhtglIn3NS","CdyBVGSQwj","0PktI580YD",
+"ThjNnFcWrW","uAWyplpF6W","618DiGXdoH","HRxd8jfREu","yluBxni2v1","hUTw7azIWp","2ZHdkYf2Ec","zz4ZUKZamH","5NammM6qcG","Oz8yZYOfrY",
+"WMiS3ZhwG1","I7p2aFcWrW","Fhtglrz7Ut","iqv4k9iGoT","qaofNReKEW","7fKYUCfgr3","LDk6fEdBKc","MezSWhUTw7","P6bcgpmeCd","7fKYUUl4a1",
+"Yw2oUatef2","0KyfsGSQwj","FxX9qgdQsS","JIqXinnP8o","iqv4kvLsmS","Mm8sitl72W","5VZjSpmeCd","hYBCKdpe1v","prNT6prNT6","IBe8kQssNC",
+"RACujiwzGk","4QMc9uupzk","OxWIHe6e4z","KZamHpiJSk","FxX9qb29RJ","mX2GEEdBKc","RBhp02TRI7","CIShGzmLYD","fmIK1gf8rI","MaJQsDz1R3",
+"kZANmi3pyd","dhSuHlweGy","QnJ1SPOUYS","SmGzvFhtgl","5VZjS48cHL","rKDLJEOE1o","yvOMIHP433","IKxdLVIlwP","CK5W7uN6r3","FNYIMtuDyS",
+"zQt6QFcWrW","9rlg9Chuy3","0Wr5yK4GS8","VNCPd0ao3l","VjCZq7fKYU","tlILtuN6r3","1v5hH8RCUA","QClRLgdQsS","lweGyrhl0J","HlUbFStlDJ",
+"LewvMOz8yZ","UlU3MtaOXK","JIqXirKDLJ","ydG8UlCMxy","ydG8U2ZHdk","i7WMQyofH3","O3iyQ5Drn0","IRh485iGN5","sqVrfUlU3M","GXdoHVBjhz",
+"WreyPKr8ys","vOqCE9y4lw","AgJHQ7fKYU","8TxD7Oz8yZ","5drc6AXpwE","2NslmYjB9t","Uvlv4a00b5","hYBCKkZANm","5drc6uvf7A","lj07QNxx9V",
+"ogLgcIjTwP","In3NS5Mg9r","yofH3ru4UG","SmGzvgdQsS","VBjhzK4GS8","yEfy9zmLYD","F6PT21LB1L","BCxeCpWiOs","MK07YDQimp","rz7UtUmaEv",
+"QYxC0SmGzv","iKqhrguMb8","FnPFBAIYUu","8RCUAcQOnv","KsjRKlCMxy","NOHszKsjRK","5VZjSU3yw5","JKWYRlXFOB","cQOnvcL0aE","ReKEW5Namm",
+"FVMxovLsmS","FnPFB8RCUA","KsjRKLbRTH","AmdQd7hyVv","HRxd89rlg9","aL6AJcShY2","QssNCUlU3M","EoToPiwzGk","4dEz6ZhwG1","wDajXFhtgl",
+"gdQsSK4GS8","gdQsSVjCZq","fLNg8v1Hln","nlaByPOUYS","DQimpksJby","UmaEvzqH0W","MezSWdhSuH","Vprf27X3uy","D6rBy5iGN5","48cHLBbwgA",
+"lXFOBMaJQs","atef2hi5X7","YOfrY7X3uy","GrDg79eoRc","lXFOBIn3NS","s4786ReKEW","lCMxy9XyT9","0h1b1fLNg8","4dEz6ReKEW","29QAzlXFOB",
+"2Yz7EIn3NS","14FLRuvf7A","FnPFBO3iyQ","JIqXiPOUYS","MaJQsLewvM","lViBvgf8rI","NAFuwXyPZN","zmLYDCIShG","kZANmLewvM","In3NSblLA9",
+"jSjS3e6e4z","YjB9tReKEW","C2Irc0BmCy","0PktIQChxs","QssNCQClRL","yToGWWaWsv","dpe1v16lHc","VNCPdMaJQs","GWqqXGSQwj","KZamHXflUq",
+"n8pJ9DG4sT","GrDg70PktI","sqVrfKsjRK","FxX9qMmKGJ","RsQUqCxVEf","AOgEeAgJHQ","iqv4kuoStw","Pb1paBFkb8","cL0aEMaJQs","sx5Gl618Di",
+"0h1b10PktI","No0QbB3qem","S77LHgf8rI","m4bxU48cHL","jS1ajtl72W","MK07YVNCPd","hUTw7m4bxU","iKqhrdmoS7","4W0Tl5ZaEz","7Ow5CgjUTu",
+"JIqXifLNg8","RACujv1Hln","HfyNQCfgr3","uLtKscShY2","AgJHQIBe8k","48cHL2ZHdk","VBjhzqaofN","lpF6WCIShG","prNT6jSjS3","IRh48ogLgc",
+"AgJHQZzJHW","Q6hMCdjsrv","n1pmOlH1kt","DcpWBFhtgl","b29RJazIWp","Cp3mZSjskQ","7X3uyCp3mZ","8hJdtoVQp6","lweGyQ6Lix","1v5hHe6e4z",
+"hYBCKNhXdu","sx5GlYf2Ec","K4GS8ogLgc","oVQp6v1Hln","zY1GYFVMxo","t59lRqQxHP","0MR5XpT8wu","AkKTkU3yw5","wiHrZpv0i7","dpe1vHfyNQ",
+"aL6AJfmIK1","M6qcGMezSW","wDajXO3iyQ","fcJOyLbRTH","TwanoSs0Zu","zHF1qiwzGk","iwzGk9GXkX","9eoRcv8yFN","v8yFNzFgtB","hE1QlzY1GY",
+"Q6LixCxVEf","2NslmZhwG1","GSQwj3otm6","BCxeCgdQsS","StlDJ580YD","cQOnvDG4sT","4W0TlD6rBy","0BmCy0Wr5y","jSjS3rKDLJ","Uvlv4wDajX",
+"Pb1paQssNC","KsjRKRBhp0","FVMxoPOUYS","U3yw5Chuy3","dpe1vW3VFH","s7MxkRpBQm","WDVWJDQimp","i3pydLDk6f","GWqqXvOqCE","6AFT0blLA9",
+"ulk4155rfB","5drc6ReKEW","hSSvQQ6hMC","6AFT0d85a9","EdBKc45cIH","iKqhr0Kyfs","cL0aEK20wK","Ul4a1Dz1R3","rz7UtzbIYY","P6bcgSWfou",
+"iB08lFFDui","K20wKGv3Fq","pv0i7Chuy3","OHaBzVjCZq","M3zXLqUJMd","2ZHdkCIShG","tjQxs2hEEU","hSSvQn1pmO","uZPqgix74r","Kr8ysQWxoT",
+"ciuWzjeskS","Q6hMCzQt6Q","ix74rgjUTu","wDajX0Kyfs","lm0pDAXpwE","HzZT87fsYM","MmsIoMGlTF","vkCHHRxrsm","dQ5865drc6","sx5GljiVBP",
+"F6PT2CK5W7","IKxdL9eoRc","hUTw7WreyP","o8UydpiJSk","fLNg8GWqqX","OUqFMprNT6","h1zcHgjUTu","RpBQmDz1R3","RkQkefqypy","POUYS0PktI",
+"ZJTXHlm0pD","SmGzvEoToP","2TRI7FjHXR","TwanoWMiS3","sqVrfyluBx","yToGWQYxC0","lkMUAmX2GE","xXTI4RpBQm","faHirAOgEe","MmsIoB3qem",
+"GXdoHOxWIH","ulk413otm6","618Dit59lR","XyPZNDQimp","Q6hMCyofH3","gIYvECxVEf","Waim6pAhR1","a00b5uoStw","zFgtBWDVWJ","IKxdL9GXkX",
+"wDajXoVQp6","i7WMQ8xEKz","29QAzYf2Ec","EdBKcOz8yZ","16lHckB5nP","9y4lwThjNn","JIqXiK20wK","HfyNQlH1kt","hSSvQ0YAGH","Qworud85a9",
+"9eoRcWmadA","9XyT9sx5Gl","oVQp6n8pJ9","aFFssuAWyp","5NammMezSW","0YAGHuJScX","IjTwPh1zcH","9iGoTzQt6Q","K4GS8hYBCK","QChxslCMxy",
+"aFFss5nmWv","pAhR1RkQke","GrDg7JXljW","ciuWzSWfou","tjQxssqVrf","KASQ8t59lR","F6PT2618Di","SmGzvfaHir","uJScXFhtgl","lpF6WvkCHH",
+"WMiS3aFFss","8xEKzAmdQd","gtCA5hE1Ql","uN6r3Yf2Ec","FVMxoy94nw","vLsmS9XyT9","qUJMd1j5L8","tvdkD0ao3l","QbxXcQYxC0","oQ87rxReec",
+"zz4ZUFhtgl","FxX9qRpBQm","No0Qb4W0Tl","GSQwj16lHc","suY4xiB08l","lj07QM6qcG","hUTw7D6rBy","aez9ynFqik","qUJMdHfyNQ","lXFOBCfgr3",
+"LbRTHuQIcz","Uvlv4rKDLJ","4QMc9brhlQ","iKqhra00b5","iwzGknFqik","ZhwG1jeskS","1LB1Lx3LDe","nFqikQYxC0","HfyNQHP433","uAWypZUnqt",
+"uJScXlj07Q","RACujS77LH","2NslmlweGy","xciqplkMUA","oVQp61LB1L","0YAGHiqv4k","aL6AJ4W0Tl","2NslmlpF6W","8FmFHTXQ0Z","zY1GYzY1GY",
+"CIShGlH1kt","QChxszHF1q","aFFss0Kyfs","BpYhV4dEz6","uPX7Ggf8rI","pAhR1RsQUq","pT8wuy94nw","ThjNnyvOMI","tAOsr8xEKz","Y1mC0K20wK",
+"FnPFBCIShG","7X3uyPb1pa","8FmFHStlDJ","9iGoTRACuj","1v5hHiqv4k","JkzUnFwEJz","O3iyQKASQ8","piJSkBbwgA","uTacxOUYuF","SjskQuZPqg",
+"DLhzMPOUYS","uupzk64s8N","Ss0ZuWaim6","07n1cVLTy6","Q6hMCwiHrZ","uoStwaFFss","55rfBQChxs","zbIYYW7cTs","jeskS7lUXZ","RsQUqCqqaD",
+"48cHLYh1hF","gdQsSuoStw","No0QbpmeCd","Gv3FqW7cTs","0PktIFFDui","8hJdtfmIK1","2TRI7FxX9q","yluBxJIqXi","vLsmStAOsr","brhlQt98iW",
+"VIlwPzHF1q","rKDLJnFqik","yEfy9dpe1v","O3iyQ0MR5X","zbIYYS77LH","iwzGkY1mC0","Cfgr3VerEA","8RCUAWaWsv","CNHmvChuy3","QworuQbxXc",
+"OHaBz9iGoT","lm0pDAkKTk","yEfy97lUXZ","W3VFHRpBQm","8xEKzUvlv4","euZA5Rxrsm","MezSWM3zXL","1v5hHIn3NS","tjQxsnFqik","zY1GYNhXdu",
+"ZuDtDt98iW","pT8wuOUYuF","uTacxoVQp6","AIYUud85a9","RBhp0QYxC0","Chuy3FjHXR","GrDg7yofH3","aFFss5drc6","lH1ktfaHir","WPmlxYOfrY",
+"CqqaDZuDtD","fcJOyjzUqR","8TxD7nnP8o","S2DfuIn3NS","d7vjMX6Pin","prNT6piJSk","guMb8POUYS","mX2GEJ2mQi","wiHrZ14FLR","07n1ckB5nP",
+"JJs5mx3LDe","lweGyjtn0X","IBe8kGrDg7","0KyfsjfREu","ru4UGnlaBy","KASQ8StlDJ","uZPqglH1kt","WMiS348cHL","XflUqJJs5m","uAWypQbxXc",
+"29QAzFFDui","pmeCdCp3mZ","HlUbFY1mC0","9XyT9n8pJ9","he9IAd7vjM","0Wr5yJ2mQi","Mkgy8I7p2a","soy9tciuWz","MaJQsVprf2","Yw2oUd7vjM",
+"QnJ1SRxrsm","0KyfskB5nP","i3pydFxX9q","tvdkDSs0Zu","LewvM14FLR","RBhp0FFDui","WaWsv8TxD7","AXpwE7lUXZ","d7vjMFjHXR","8cVD3Vprf2",
+"CK5W7ogLgc","0BmCyiqv4k","uupzkVNCPd","Dz1R3GrDg7","1j5L8MmsIo","m4bxUHzZT8","CK5W7CIShG","hE1QlQworu","rz7UtbgJAz","nlaBy0h1b1",
+"WDVWJ5Drn0","ReKEWi7WMQ","BGaQYdQ586","pvgjSGXdoH","DcpWBuQIcz","G1RhSZ4I1v","FhtglKr8ys","OUYuFv1Hln","kB5nPChuy3","s7MxkTCgPp",
+"MojnPZzJHW","FLsphoVQp6","7lUXZokgRi","kZANmD6rBy","WreyPpiJSk","JIqXiWreyP","MezSWcShY2","xciqp2Nslm","JKWYRwiHrZ","xXTI455rfB",
+"TXQ0ZS77LH","b29RJciuWz","WMiS3euZA5","S2Dfu0ao3l","uQIczTa8f6","2TRI7S77LH","Y1mC0Nxx9V","7hyVvM6qcG","oGu6xZhwG1","MezSWSmGzv",
+"sqVrfEoToP","LbRTHbZLvS","NhXduCxVEf","L7cGcyEfy9","LewvM2Yz7E","8FmFHcL0aE","t59lRzz4ZU","BpYhV6q6L9","jeskS7ku1p","nlaBy9XyT9",
+"MGlTFQbxXc","blLA9EOE1o","JIqXitlILt","L7cGculk41","FVMxoWDVWJ","vOqCEM6qcG","NAFuwAOgEe","dmoS7SjskQ","HfyNQfcJOy","jfREu55rfB",
+"2DREs0YAGH","EdBKc64s8N","IRh48IKxdL","1LB1LOHaBz","fmIK1FxX9q","v2eC3zY1GY","qQxHP9GXkX","7lUXZlm0pD","pvgjSVjCZq","v1HlnTCgPp",
+"lweGyPOUYS","K20wKRmDcr","bgJAzpiJSk","Oz8yZMmKGJ","uQIczrKDLJ","aez9yW3VFH","CK5W7QChxs","6q6L9MojnP","F6PT2ydG8U","WPmlxlkMUA",
+"29QAzlsQGo","WaWsvDQimp","Cp3mZyEfy9","2DREs5VZjS","NAFuwFjHXR","D6rBy7lUXZ","16lHcjSjS3","7Ow5C64s8N","BbwgA5drc6","Kr8ysCK5W7",
+"fcwDadpe1v","nlaBykZANm","0h1b1L7cGc","iKqhrk85Ae","uAWyp0YAGH","NOHszRmDcr","kZANmuvf7A","yToGWuAWyp","64s8NYjB9t","F6PT2sqVrf",
+"xReec5iGN5","Yh1hFydG8U","tjQxsDLhzM","o8UydzbIYY","M6qcGWmadA","uZPqg8cVD3","7ku1pm4bxU","bgJAz9eoRc","uAWypL7cGc","KZamHAOgEe",
+"MojnPnnP8o","0BmCy55rfB","VerEAUlU3M","7fsYMLDk6f","a00b5MmKGJ","1LB1LSjskQ","IKxdLUlU3M","ydG8Uh1zcH","5Drn0uJScX","4dEz6uJScX",
+"v1HlnyEfy9","rz7Ut14FLR","AOgEe4W0Tl","2Nslmmz8gx","tlILtm4bxU","K4GS8G1RhS","jzUqRru4UG","gIYvE9eoRc","9XyT9uN6r3","zFgtBChuy3",
+"wiHrZ0Kyfs","2ZHdkaFFss","9iGoTjS1aj","CdyBVo8Uyd","NAFuw0ao3l","pv0i7S2Dfu","Waim6mX2GE","QbxXcCqqaD","OUqFMU3yw5","WPmlxWMiS3",
+"tlILtJIqXi","he9IA0h1b1","JRJQBQChxs","QClRLtvdkD","tvdkDQworu","atef2fmIK1","jiVBPHRxd8","rhl0JFjHXR","WMiS3dmoS7","Q6hMCLewvM",
+"VIlwP5Drn0","OxWIHqaofN","VerEAix74r","BCxeCuoStw","Fhtgla00b5","s7Mxks4786","55rfB2Yz7E","tl72WHP433","Ul4a1okgRi","sqVrfPb1pa",
+"FPfSEZJTXH","FLsphMaJQs","nFqikD6rBy","wDajXNAFuw","lpF6WfcwDa","pv0i77lUXZ","0ao3lK4GS8","faHirDLhzM","yluBxZv7z0","2Nslmn8pJ9",
+"WPmlxuLtKs","xciqpuAWyp","pAhR1WmadA","MojnPYf2Ec","piJSkThjNn","0PktIFwEJz","5VZjSuAWyp","J2mQi7ku1p","YOfrYCK5W7","pv0i7zY1GY",
+"In3NSM3zXL","GrDg7Vprf2","8TxD7Q6Lix","IKxdL14FLR","NcICA7hyVv","JRJQBlm0pD","vOqCERACuj","VLTy6VLTy6","NAFuwSbRYy","uoStwmX2GE",
+"5ZaEz2DREs","iKqhr07n1c","kZANmYh1hF","B3qemqQxHP","lCMxyDLhzM","d7vjMbrhlQ","gdQsSqUJMd","d7vjMqQxHP","OxWIHjtn0X","K20wKF6PT2",
+"EOE1ogf8rI","7ku1pCdyBV","yToGW7X3uy","zbIYYni2v1","FGzgp2ZHdk","MmKGJlpF6W","bgJAzB3qem","9y4lw9iGoT","LbRTHGv3Fq","brhlQMmKGJ",
+"5VZjStjQxs","lsQGoLDk6f","uQIczrhl0J","zQt6QoVQp6","lm0pDcShY2","0Kyfs0BmCy","AIYUuyluBx","FwEJzOUqFM","M6qcG7X3uy","xciqpVLTy6",
+"fcwDaDLhzM","dhSuHsuY4x","7X3uyyEfy9","DcpWBaL6AJ","oVQp6SWfou","uN6r3WaWsv","QYxC0FPfSE","48cHLpAhR1","lpF6WzFgtB","AmdQdpAhR1",
+"nnP8oC2Irc","7Ow5C7ku1p","D6rByTa8f6","pT8wu0ao3l","faHir1j5L8","0Wr5ygdQsS","RBhp0Z4I1v","Z4I1vVerEA","HzZT8580YD","n8pJ9GXdoH",
+"lH1ktuPX7G","ix74rzQt6Q","pmeCdNOHsz","GSQwjFxX9q","2ZHdk7fsYM","GSQwjEoToP","2hEEUYjB9t","HRxd8DcpWB","prNT6618Di","t98iWNOHsz",
+"ECMvUzY1GY","FFDuiReKEW","GXdoHThjNn","QbxXc7fsYM","MojnPhYBCK","cL0aEuvf7A","yToGWd85a9","ix74rJkzUn","VNCPdhSSvQ","AgJHQRxrsm",
+"RzaZAuoStw","JJs5mFPfSE","LewvMCK5W7","qUJMdwDajX","zHF1qYh1hF","s4786WMiS3","jtn0X2Nslm","WmadAX6Pin","ZzJHWru4UG","dmoS7tuDyS",
+"soy9tUmaEv","1v5hHfmIK1","kZANmv1Hln","suY4xsoy9t","lweGy7Ow5C","vkCHH2ZHdk","Vprf2BGaQY","pFrrluTacx","Zv7z0tuDyS","SjskQcQOnv",
+"kB5nPU3yw5","tlILtrKDLJ","tl72WqUJMd","mX2GEVBjhz","PYBf4Kr8ys","ru4UGW3VFH","BpYhVIjTwP","b29RJulk41","VerEAVIlwP","8TxD7jzUqR",
+"7X3uyQYxC0","14FLRYOfrY","gIYvETCgPp","RkQkegtCA5","5ZaEzlCMxy","PYBf4lCMxy","h1zcHTwano","FNYIMYw2oU","IRh4829QAz","G1RhSzFgtB",
+"RACujFNYIM","Ss0Zu2DREs","14FLR7fsYM","ZzJHWYw2oU","4QMc9hSSvQ","FxX9qYjB9t","O3iyQn1pmO","qQxHPuN6r3","D6rByv2eC3","8cVD3MGlTF",
+"G1RhScmXIX","jzUqR4W0Tl","W7cTs7hyVv","MmsIoiqv4k","pWiOsfmIK1","ydG8U29QAz","FPfSEJIqXi","RBhp0tl72W","DLhzMvLsmS","MaJQsX6Pin",
+"BbwgAVBjhz","guMb8mX2GE","7fKYUzQt6Q","ogLgc8FmFH","uAWyptaOXK","t59lRmX2GE","s4786vLsmS","CqqaDhUTw7","Uvlv4GSQwj","iqv4kyofH3",
+"GrDg7jzUqR","PYBf4AmdQd","zqH0W45cIH","14FLR2TRI7","DcpWBqQxHP","s47867lUXZ","pWiOsbZLvS","uQIczQChxs","QssNC45cIH","lH1kt0ao3l",
+"ru4UGMm8si","i7WMQPb1pa","lH1ktFLsph","AgJHQ5nmWv","ZzJHWaDGtS","2TRI7PYBf4","fcwDafaHir","pv0i745cIH","MezSW29QAz","HP433B3qem",
+"uTacxYf2Ec","BCxeCoGu6x","gf8rIIRh48","NhXduvLsmS","RBhp0RACuj","Yh1hFQnJ1S","pAhR1gjUTu","JXljWVBjhz","uoStwFGzgp","FNYIMIn3NS",
+"vOqCEiwzGk","AIYUuKsjRK","P6bcgRxrsm","yEfy9ReKEW","AIYUuYOfrY","gjUTutAOsr","s4786Zv7z0","MK07Y9y4lw","AmdQdNxx9V","X6PinoVQp6",
+"aFFss3otm6","uAWypRBhp0","IBe8k0h1b1","suY4xuPX7G","lj07QlsQGo","FGzgpMK07Y","5drc6Uvlv4","ulk41tuDyS","Mkgy8Waim6","CK5W7lweGy",
+"RsQUqhe9IA","jzUqRaL6AJ","lweGyCxVEf","8xEKzpvgjS","kZANml83Ud","VIlwPCp3mZ","0Wr5yJkzUn","LDk6fZuDtD","JKWYRaDGtS","SjskQFjHXR",
+"ZUnqtoQ87r","i3pydfqypy","AgJHQ55rfB","6q6L96AFT0","ogLgclm0pD","Yw2oUcL0aE","VerEAjS1aj","d7vjM0PktI","wiHrZ48cHL","okgRicmXIX",
+"JXljWVIlwP","FVMxoMezSW","No0QbKZamH","Ta8f6OHaBz","Vprf2fmIK1","2hEEUoQ87r","zbIYY3weIF","IjTwP7ku1p","yofH3s7Mxk","YOfrYRpBQm",
+"0YAGHvOqCE","uvf7AtAOsr","AIYUuaez9y","W7cTsXflUq","gf8rI29QAz","o8UydogLgc","lweGyd85a9","WDVWJOUYuF","GSQwj55rfB","aez9yFPfSE",
+"Yf2EcMmsIo","VIlwP14FLR","gf8rIa00b5","tvdkDksJby","Waim6qQxHP","JkzUnni2v1","vkCHH2TRI7","OUqFMBpYhV","prNT6dpe1v","MojnPiKqhr",
+"64s8Nl83Ud","RkQkeogLgc","fFDrJoGu6x","KASQ8ciuWz","DG4sTni2v1","gdQsS7ku1p","Q6LixKr8ys","yToGWzQt6Q","ulk41jfREu","i3pydv2eC3",
+"WaWsvDz1R3","yvOMIP6bcg","No0QbguMb8","fmIK1xReec","dhSuHMmKGJ","CdyBVSbRYy","sx5GlIRh48","tlILtOUYuF","atef2FLsph","CxVEfCIShG",
+"oQ87r7fsYM","VNCPdiwzGk","Oz8yZ7fsYM","9eoRcdjsrv","2DREsJIqXi","CNHmv5ZaEz","8hJdtgdQsS","Mkgy88TxD7","DQimplweGy","7Ow5C45cIH",
+"2NslmciuWz","yToGWPYBf4","aez9y8U2nU","TwanolViBv","KZamHsx5Gl","Q6hMCYf2Ec","0Kyfs45cIH","CxVEfn8pJ9","1LB1Luvf7A","45cIHuAWyp",
+"0KyfsOUYuF","TXQ0ZVBjhz","HzZT8RACuj","Gv3FqOUqFM","QnJ1SX6Pin","DcpWBUvlv4","Dz1R3v2eC3","CNHmveuZA5","ru4UGO3iyQ","Yw2oUa00b5",
+"Nxx9VyToGW","07n1cjiVBP","CIShGuTacx","jzUqRo8Uyd","MojnPRkQke","okgRiguMb8","JRJQBgtCA5","48cHL8TxD7","iwzGkhYBCK","RsQUqtaOXK",
+"gIYvEL7cGc","euZA52DREs","d7vjMmz8gx","vOqCEMK07Y","Oz8yZ9rlg9","vOqCEVBjhz","yvOMISmGzv","hYBCKW3VFH","AgJHQFjHXR","BFkb8AIYUu",
+"FGzgp0PktI","W3VFHhYBCK","0YAGHlpF6W","U3yw5SjskQ","v2eC3MK07Y","pFrrlo8Uyd","B3qem0MR5X","LDk6fFGzgp","U3yw5WmadA","5Mg9rlpF6W",
+"TCgPpeuZA5","BCxeCzHF1q","ZUnqt3otm6","64s8NLbRTH","3weIFYjB9t","0h1b1pmeCd","X6PindhSuH","zmLYD8hJdt","ni2v1sx5Gl","dpe1vdpe1v",
+"5drc6t98iW","ni2v1U3yw5","RsQUqfmIK1","C2IrctvdkD","Oz8yZm4bxU","uQIczJRJQB","DcpWB2hEEU","o8UydSjskQ","Zv7z0gIYvE","HRxd8euZA5",
+"HlUbFpT8wu","cShY2WreyP","7hyVvoQ87r","yEfy94dEz6","9XyT9kB5nP","uZPqgB3qem","BpYhVSWfou","qUJMdqaofN","CNHmvyluBx","yvOMIyEfy9",
+"QbxXc9XyT9","iB08lCK5W7","C2IrclXFOB","tl72WP6bcg","CIShGgtCA5","e6e4z55rfB","FGzgpMojnP","Yf2Ec64s8N","FnPFBTXQ0Z","CxVEfPYBf4",
+"blLA9bgJAz","580YD5IhmG","9GXkXIRh48","zbIYYKZamH","ThjNnaFFss","5NammGrDg7","uQIczKZamH","B3qem0YAGH","M6qcGFNYIM","BGaQYzFgtB",
+"WDVWJECMvU","07n1cJXljW","CqqaDRACuj","FFDuitl72W","cmXIX0YAGH","7X3uydpe1v","8cVD3lj07Q","ulk41UmaEv","MGlTFChuy3","rKDLJJkzUn",
+"0YAGHyEfy9","v1HlnKsjRK","gdQsSVLTy6","ciuWzzHF1q","azIWp2TRI7","24ARFVBjhz","7lUXZMm8si","FcWrWprNT6","zqH0WLDk6f","580YDX6Pin",
+"fFDrJjS1aj","29QAztjQxs","i3pyd45cIH","kZANmcShY2","9iGoTFFDui","x3LDeMezSW","hUTw70PktI","iwzGkkB5nP","hYBCKIjTwP","he9IAuupzk",
+"9y4lwJIqXi","5NammRBhp0","lkMUAQnJ1S","nnP8oHRxd8","sqVrfFcWrW","7fKYUbZLvS","0h1b1NAFuw","uQIcz7ku1p","fqypyjtn0X","RkQkeCIShG",
+"ZhwG1v2eC3","fLNg8brhlQ","y94nwdmoS7","guMb8Qworu","RBhp0AgJHQ","ZuDtD9rlg9","ZUnqtFhtgl","RmDcrpvgjS","0PktIUmaEv","DG4sTzbIYY",
+"FLsph4QMc9","ksJbyBGaQY","dmoS7Ss0Zu","ReKEWAIYUu","sqVrftjQxs","S2DfuyvOMI","NcICAb29RJ","WmadAC2Irc","h1zcHn8pJ9","QbxXcpvgjS",
+"gdQsS2ZHdk","2ZHdk3otm6","MK07Ym4bxU","Nxx9V5VZjS","FcWrWCfgr3","JRJQByofH3","6q6L92Nslm","dpe1vZhwG1","dmoS7Yw2oU","RmDcryEfy9",
+"JRJQBNxx9V","sx5GlazIWp","UmaEvfqypy","i3pydNOHsz","vOqCE55rfB","ksJbyOxWIH","8FmFH4W0Tl","M3zXLQWxoT","k85AeNOHsz","OUYuFv8yFN",
+"uQIczjS1aj","vkCHHd7vjM","Oz8yZjzUqR","iKqhrprNT6","iKqhrzbIYY","DcpWBFFDui","v1Hln7Ow5C","v2eC3Rxrsm","o8UydYf2Ec","RzaZAmX2GE",
+"fLNg8YOfrY","jtn0XciuWz","OHaBzQbxXc","7hyVvFcWrW","HzZT87lUXZ","B3qemLewvM","AgJHQ8RCUA","GXdoHazIWp","HlUbFksJby","8cVD3ZzJHW",
+"oGu6xM6qcG","QChxsIjTwP","gIYvEpWiOs","ydG8UyluBx","BpYhVsqVrf","uLtKsOxWIH","5Drn0ZuDtD","yvOMIx3LDe","M6qcGJ2mQi","7fKYUMojnP",
+"ZzJHWpvgjS","d85a9OUqFM","DQimpStlDJ","FnPFBogLgc","CxVEfReKEW","lm0pD0Kyfs","ECMvUJ2mQi","ydG8UsuY4x","yvOMIv8yFN","QClRLNo0Qb",
+"zmLYD5Namm","Q6hMCYOfrY","RzaZA8RCUA","uLtKsMmKGJ","BFkb8i7WMQ","JkzUnfmIK1","iwzGkkZANm","B3qem7ku1p","lweGyVjCZq","n1pmObrhlQ",
+"ogLgc7ku1p","45cIHpT8wu","n8pJ9kB5nP","RmDcrFnPFB","7X3uyMojnP","gf8rIxciqp","he9IA9rlg9","d7vjMJRJQB","zFgtB4dEz6","lweGyHlUbF",
+"JRJQByToGW","lweGyhSSvQ","djsrvTXQ0Z","hUTw78FmFH","SWfounFqik","sx5Gl8U2nU","FPfSENcICA","0ao3l5iGN5","618DiB3qem","ni2v1cmXIX",
+"cShY2SbRYy","GWqqXNAFuw","Kr8ysyEfy9","NhXdupWiOs","AkKTkuAWyp","blLA90Kyfs","CK5W7QWxoT","WreyPQbxXc","uZPqgMojnP","M3zXLhE1Ql",
+"CK5W7O3iyQ","k85AeIRh48","uTacxpmeCd","he9IAAOgEe","yToGWpAhR1","Yw2oUFPfSE","uZPqgThjNn","hE1QlKsjRK","ZJTXHvkCHH","tlILtdmoS7",
+"dQ586zmLYD","AmdQdMaJQs","xReecuTacx","EOE1o1v5hH","dQ586faHir","JJs5mPYBf4","ciuWzBCxeC","BGaQYMmKGJ","IjTwP1LB1L","P6bcgDQimp",
+"ZhwG15iGN5","NAFuw5VZjS","J2mQi2Nslm","s93MloQ87r","RsQUqS2Dfu","wDajX580YD","a00b5fFDrJ","uvf7AVBjhz","JkzUnuPX7G","BpYhVYOfrY",
+"PYBf407n1c","HlUbFGXdoH","lViBvBGaQY","FFDuiulk41","HzZT88RCUA","CK5W7vkCHH","uvf7AS77LH","zbIYYtuDyS","n1pmOoVQp6","aFFssGrDg7",
+"ulk410BmCy","JXljWa00b5","BbwgABFkb8","fqypymX2GE","24ARFFwEJz","t98iWzY1GY","55rfBGSQwj","x3LDewDajX","y94nwX6Pin","Yh1hFWPmlx",
+"8RCUAPOUYS","UmaEv7Ow5C","KsjRK2TRI7","2TRI7tAOsr","taOXKaL6AJ","ix74rzqH0W","tvdkDDQimp","ECMvUjSjS3","uoStwrz7Ut","2Yz7EzmLYD",
+"No0QbjiVBP","FhtglCNHmv","pAhR1cmXIX","pAhR1WMiS3","6AFT0Yw2oU","h1zcHjS1aj","uPX7GS77LH","EdBKcLbRTH","QnJ1SOUYuF","b29RJPb1pa",
+"rhl0Jn8pJ9","07n1c7fKYU","cQOnvuJScX","pT8wuokgRi","FFDuiQYxC0","suY4xi3pyd","NOHszMmKGJ","0YAGHDLhzM","gIYvEulk41","1v5hHB3qem",
+"pmeCdSmGzv","ZuDtDsuY4x","JKWYR6AFT0","tlILtGrDg7","7ku1p5drc6","lXFOBlsQGo","Ss0Zuulk41","AIYUuuLtKs","F6PT2Zv7z0","14FLRoVQp6",
+"MK07YvkCHH","he9IAY1mC0","Ul4a1WMiS3","2Yz7Es7Mxk","ZUnqtzFgtB","FNYIMKr8ys","FcWrWXflUq","Z4I1vJRJQB","Yf2EcQssNC","0BmCyd7vjM",
+"s93Ml6AFT0","yofH3K20wK","iwzGkIn3NS","RACujM6qcG","CIShGzz4ZU","brhlQ6AFT0","cL0aE8TxD7","XyPZNRpBQm","BCxeClj07Q","JkzUn16lHc",
+"W7cTsNcICA","pAhR1uAWyp","vkCHHQChxs","xReeccQOnv","kB5nPokgRi","5drc6QssNC","CqqaD618Di","oVQp6bZLvS","piJSkMmKGJ","XflUqe6e4z",
+"atef2s93Ml","sx5GlprNT6","7fsYMjeskS","8RCUApv0i7","S2Dfu9y4lw","wiHrZX6Pin","uN6r3kB5nP","okgRi8cVD3","Mkgy84dEz6","1LB1LHRxd8",
+"pv0i7pvgjS","OUYuFStlDJ","FxX9qPb1pa","nlaByulk41","EdBKc8hJdt","HP433v8yFN","zHF1qtl72W","RxrsmXyPZN","QWxoTd7vjM","tl72W0YAGH",
+"FFDuihi5X7","CK5W7bZLvS","jeskSt98iW","1v5hHh1zcH","euZA54QMc9","1v5hHHP433","LDk6fFxX9q","atef25Drn0","OUqFMLbRTH","FFDuiTa8f6",
+"zz4ZUulk41","GrDg7WaWsv","ciuWzDQimp","1j5L8pAhR1","iwzGkG1RhS","M6qcGgf8rI","WPmlxTXQ0Z","HP433pWiOs","5Drn0SmGzv","W7cTs1v5hH",
+"v8yFN0Wr5y","Chuy3atef2","HzZT8POUYS","POUYSZhwG1","guMb8PYBf4","y94nwxXTI4","zQt6QDQimp","gIYvEC2Irc","n1pmO24ARF","CK5W7JkzUn",
+"he9IADz1R3","xXTI4Q6hMC","fLNg8Z4I1v","rhl0JCp3mZ","e6e4zHzZT8","QClRLAIYUu","8RCUAHRxd8","kB5nPnlaBy","n8pJ9blLA9","Yf2EcXflUq",
+"24ARF29QAz","Q6Lixlj07Q","cShY2aFFss","SWfouBpYhV","JIqXifqypy","sx5GlXyPZN","aDGtSuupzk","dmoS7y94nw","fmIK1wiHrZ","7fKYU1j5L8",
+"WreyPNAFuw","lj07QDQimp","RpBQmni2v1","4dEz6zbIYY","uLtKsZuDtD","oVQp6ciuWz","v2eC3QssNC","F6PT2FFDui","RACujtlILt","pAhR1AOgEe",
+"yvOMIRBhp0","iqv4kzY1GY","nlaByyEfy9","jiVBPMkgy8","TwanoMGlTF","L7cGcL7cGc","d7vjMuAWyp","Mkgy8RACuj","P6bcgCdyBV","NOHszlViBv",
+"EOE1osqVrf","CqqaD55rfB","QssNCFFDui","cQOnvpAhR1","Dz1R3pvgjS","cmXIXHlUbF","lkMUACp3mZ","vkCHHpv0i7","9GXkXJKWYR","BFkb8EdBKc",
+"CK5W7KASQ8","t98iWL7cGc","16lHcOxWIH","0ao3lZv7z0","QbxXc4dEz6","suY4xhe9IA","Ta8f65IhmG","I7p2a3otm6","rz7UtlH1kt","faHircmXIX",
+"EoToP1j5L8","s93Mllm0pD","No0QbgtCA5","IRh48lpF6W","2Yz7EMezSW","JXljWQbxXc","FjHXRIRh48","lkMUAlj07Q","3otm6atef2","7lUXZFjHXR",
+"ru4UG7fKYU","x3LDesqVrf","s4786Y1mC0","FVMxozqH0W","Zv7z0okgRi","lweGyblLA9","3otm6jzUqR","e6e4zHP433","DG4sTK20wK","mX2GEYf2Ec",
+"k85AeoGu6x","iwzGk14FLR","pT8wuKsjRK","RsQUqv1Hln","dmoS7KsjRK","GSQwjaez9y","NcICAD6rBy","Ta8f6n1pmO","BFkb8Gv3Fq","ksJbyk85Ae",
+"bgJAz16lHc","Z4I1viKqhr","NAFuwXflUq","IjTwP8U2nU","WaWsvzHF1q","SWfoupFrrl","PYBf4brhlQ","AmdQdDQimp","IBe8k1LB1L","ciuWzNhXdu",
+"AkKTkyToGW","zFgtBtuDyS","S77LH14FLR","OHaBznnP8o","RzaZA5iGN5","EdBKcFLsph","Mm8siAgJHQ","sx5GlQClRL","mX2GEK4GS8","FcWrWNxx9V",
+"lH1ktOz8yZ","AgJHQpv0i7","prNT6RzaZA","b29RJblLA9","rKDLJQChxs","iqv4kd7vjM","Oz8yZZ4I1v","6q6L9bgJAz","WMiS3uAWyp","M6qcGjtn0X",
+"LewvMZ4I1v","taOXKIn3NS","9iGoT4W0Tl","uPX7Gulk41","MK07YZv7z0","piJSkU3yw5","LewvMuoStw","9rlg9FNYIM","580YDWaWsv","ydG8UDG4sT",
+"ZuDtDuQIcz","lkMUAFNYIM","kZANmSs0Zu","X6Pini3pyd","0BmCy45cIH","brhlQRmDcr","In3NS2Yz7E","s7MxkIjTwP","ECMvUlsQGo","48cHL7fsYM",
+"yluBxzHF1q","Waim6zFgtB","cShY2wiHrZ","mz8gxt98iW","K20wKO3iyQ","YOfrY1LB1L","RsQUq9eoRc","24ARF1LB1L","WaWsvtlILt","yluBxciuWz",
+"5ZaEzQYxC0","uQIczuLtKs","8cVD30PktI","M3zXLjzUqR","iqv4ktvdkD","8hJdtkZANm","2TRI7ThjNn","dhSuHfFDrJ","fLNg8LDk6f","5iGN5vOqCE",
+"k85AeOHaBz","6AFT0FnPFB","0YAGHtuDyS","VBjhzuTacx","LDk6fRzaZA","QChxsHP433","he9IA0MR5X","zQt6Q0PktI","hi5X7uPX7G","P6bcg4W0Tl",
+"Q6hMCK4GS8","Pb1paDG4sT","0MR5X2DREs","tvdkDL7cGc","M3zXLmz8gx","uLtKsrz7Ut","JKWYRRACuj","oGu6xzHF1q","Waim63weIF","HP433XyPZN",
+"HfyNQzY1GY","0BmCys93Ml","tjQxsIBe8k","LewvMlweGy","dpe1vJ2mQi","tl72WzmLYD","GrDg7y94nw","uTacx0ao3l","QbxXce6e4z","zY1GYCp3mZ",
+"atef2O3iyQ","CdyBVTa8f6","U3yw5sqVrf","GXdoHOUYuF","prNT6KASQ8","NOHszF6PT2","xXTI4VLTy6","s7MxknFqik","NhXduEOE1o","8cVD3rz7Ut",
+"In3NS0Wr5y","Ta8f6pT8wu","8xEKzKsjRK","uTacxRkQke","e6e4ze6e4z","m4bxUwiHrZ","Gv3Fq2DREs","EOE1oe6e4z","prNT6Vprf2","2Yz7E5Namm",
+"gjUTuJRJQB","8U2nUuN6r3","VLTy6UmaEv","yToGWzY1GY","euZA5ciuWz","AOgEee6e4z","zqH0W4dEz6","LbRTH7lUXZ","soy9tEoToP","BpYhVvOqCE",
+"S77LHMezSW","ZzJHWfLNg8","2NslmHzZT8","MojnPMaJQs","yofH3kB5nP","7Ow5CYh1hF","EoToPiqv4k","4dEz6zHF1q","HRxd8GWqqX","Q6LixnnP8o",
+"dmoS75Mg9r","PYBf4i3pyd","4W0Tl9eoRc","fcJOyuPX7G","FjHXR5IhmG","AIYUuQWxoT","9iGoTfFDrJ","lweGyAkKTk","9GXkXW7cTs","1j5L8Gv3Fq",
+"uvf7ADLhzM","AOgEe7hyVv","FjHXRyofH3","Q6hMCOUqFM","WmadAS2Dfu","HfyNQkB5nP","9eoRcUmaEv","t59lRUl4a1","Vprf2rz7Ut","ulk41mX2GE",
+"QClRLprNT6","0BmCyS2Dfu","lH1ktpvgjS","2Yz7EZ4I1v","ydG8UiB08l","iqv4kCK5W7","7X3uybrhlQ","K20wKfcJOy","aDGtSChuy3","ni2v1RzaZA",
+"MaJQs0ao3l","IBe8kJKWYR","QworuBCxeC","IKxdLy94nw","s93MlP6bcg","MK07YjeskS","S77LHgdQsS","EoToPQWxoT","ReKEWiwzGk","SjskQbZLvS",
+"jSjS324ARF","lpF6WoVQp6","8hJdtkB5nP","U3yw5JIqXi","i7WMQStlDJ","MaJQsDG4sT","O3iyQzz4ZU","1j5L8BGaQY","No0QbMmsIo","HfyNQHRxd8",
+"SmGzv7fKYU","Y1mC0IjTwP","WDVWJiKqhr","bgJAzvLsmS","HfyNQuLtKs","WDVWJzHF1q","guMb8ogLgc","ECMvUOxWIH","v2eC3VBjhz","WMiS3pT8wu",
+"07n1ccQOnv","pmeCdazIWp","yvOMIlkMUA","BbwgAGrDg7","uPX7GBGaQY","580YDuZPqg","yofH3YOfrY","GWqqXgdQsS","45cIHe6e4z","5drc6O3iyQ",
+"qQxHPW7cTs","OUqFMBbwgA","hYBCKrz7Ut","Q6hMCQworu","PYBf4WreyP","QClRLLbRTH","0MR5Xsoy9t","UmaEvBpYhV","zz4ZUiqv4k","VNCPdzQt6Q",
+"s93MliB08l","uN6r3he9IA","TwanoAmdQd","YOfrYCIShG","GXdoHZJTXH","DLhzMtvdkD","nFqiknlaBy","wiHrZwiHrZ","Kr8ysYOfrY","tlILtqaofN",
+"qQxHP618Di","wiHrZKr8ys","Mm8siFxX9q","29QAzHzZT8","guMb8cQOnv","s93MlY1mC0","M6qcGNAFuw","iB08lBbwgA","0PktIjiVBP","7hyVvdhSuH",
+"dQ586P6bcg","RsQUqlsQGo","5VZjSJRJQB","WPmlxciuWz","iB08lDz1R3","2ZHdkhi5X7","5IhmGYw2oU","t59lRW7cTs","d7vjMMezSW","0MR5XCNHmv",
+"fqypypFrrl","jzUqRbgJAz","x3LDepFrrl","x3LDeuTacx","SmGzvMaJQs","FFDuizbIYY","QssNCFLsph","azIWp8FmFH","Nxx9Vaez9y","ksJbymX2GE",
+"rz7UtFNYIM","EoToPcShY2","0BmCyChuy3","0KyfsOUqFM","Ta8f6CK5W7","t98iWW3VFH","RkQkeHP433","RpBQmW7cTs","iqv4kfmIK1","azIWpwiHrZ",
+"s93Ml8xEKz","0MR5XVprf2","2ZHdkBpYhV","b29RJ8xEKz","gdQsSrz7Ut","Yh1hFIBe8k","M3zXL8RCUA","tuDyStl72W","16lHcsoy9t","55rfBUmaEv",
+"IRh48Yh1hF","SjskQ6AFT0","qaofN45cIH","DG4sTX6Pin","TCgPppWiOs","uPX7Gjtn0X","NAFuwTa8f6","uJScXdjsrv","gIYvE4QMc9","aFFssBCxeC",
+"e6e4zpAhR1","BbwgAFFDui","FwEJzC2Irc","Q6hMCx3LDe","yvOMIpv0i7","iqv4kzz4ZU","0KyfsaFFss","suY4xWPmlx","8RCUA14FLR","GXdoHcQOnv",
+"o8UydxXTI4","tvdkDCIShG","wDajXtAOsr","h1zcHuZPqg","Z4I1vxciqp","NcICAtaOXK","jeskS16lHc","zqH0WJIqXi","cShY2bZLvS","8U2nUFNYIM",
+"gtCA57lUXZ","n1pmOECMvU","5drc6fqypy","UlU3MnFqik","IRh48aDGtS","ReKEWYjB9t","MmKGJ7Ow5C","KZamH0YAGH","9y4lwcShY2","mX2GERkQke",
+"Kr8ysHRxd8","CIShGy94nw","W3VFHUmaEv","DLhzMEoToP","Yh1hFSs0Zu","he9IAO3iyQ","CdyBVrz7Ut","TwanowiHrZ","29QAzoGu6x","FjHXRZuDtD",
+"MaJQsn1pmO","uLtKslkMUA","FGzgpd85a9","CK5W7NhXdu","0Kyfsiqv4k","0Wr5yl83Ud","S2Dfu6q6L9","jzUqRprNT6","5VZjSCdyBV","QClRLogLgc",
+"S77LH580YD","BbwgAjzUqR","yluBx8FmFH","0KyfsCIShG","MmKGJkZANm","JKWYRjeskS","8RCUA7lUXZ","ZhwG18cVD3","uTacxsuY4x","TCgPptjQxs",
+"Yf2EcHP433","QClRLAOgEe","bZLvSpiJSk","faHirL7cGc","FPfSE9iGoT","K4GS8UlU3M","tjQxsC2Irc","GXdoHU3yw5","NcICAqaofN","oGu6xiB08l",
+"BpYhVUl4a1","JkzUni3pyd","1LB1LIKxdL","2DREsfFDrJ","BCxeC8U2nU","OHaBzG1RhS","tjQxslkMUA","nnP8oFNYIM","jiVBP0Wr5y","FGzgpPb1pa",
+"jiVBPNhXdu","M6qcGWPmlx","nlaByZUnqt","HRxd8IKxdL","kZANmlpF6W","dpe1vM6qcG","CIShGKsjRK","Kr8yskB5nP","SmGzvPb1pa","ZUnqt07n1c",
+"4W0TlNcICA","SmGzvZ4I1v","OUqFMnlaBy","MGlTFtAOsr","pv0i7cL0aE","hYBCKStlDJ","uoStwcShY2","FPfSELbRTH","6q6L9DQimp","64s8N6AFT0",
+"ZhwG1FGzgp","3weIFIn3NS","Oz8yZazIWp","qQxHPUmaEv","5NammuZPqg","FcWrW29QAz","7fKYUuQIcz","s4786ciuWz","SjskQSjskQ","prNT68hJdt",
+"oVQp6bgJAz","8TxD7RsQUq","t59lRdmoS7","JJs5mDLhzM","Waim6FFDui","In3NSQ6Lix","FFDuiZJTXH","9eoRc0Wr5y","cmXIXuoStw","GXdoHlsQGo",
+"FwEJzM6qcG","jeskS5IhmG","0PktIcQOnv","1LB1LlweGy","Qworu1j5L8","pvgjSWaim6","cShY2hi5X7","ECMvU6AFT0","8FmFHmX2GE","BGaQYGv3Fq",
+"jzUqRJ2mQi","8TxD79iGoT","618Di48cHL","RzaZAgIYvE","rKDLJhUTw7","0h1b15VZjS","v2eC3iKqhr","Yf2Ecs7Mxk","6q6L9tjQxs","cmXIXPb1pa",
+"pvgjSQClRL","1LB1L1v5hH","zbIYYdmoS7","9eoRcjiVBP","6AFT0CxVEf","9XyT9MmKGJ","No0QbCxVEf","GrDg7uupzk","RpBQmix74r","Oz8yZ0PktI",
+"d7vjMvkCHH","YOfrYQnJ1S","rKDLJzqH0W","uZPqgQnJ1S","soy9tPb1pa","jS1aje6e4z","JIqXiHfyNQ","pvgjSyvOMI","CxVEfOUYuF","UmaEvBFkb8",
+"LbRTHMK07Y","t98iWxReec","nnP8ojfREu","8RCUAtaOXK","qUJMdlH1kt","RACujJIqXi","uvf7AJKWYR","gIYvEZ4I1v","s7Mxkb29RJ","K4GS8pT8wu",
+"t98iW29QAz","Yf2EclweGy","S77LHVIlwP","I7p2ai7WMQ","atef2J2mQi","1j5L88FmFH","BpYhVuQIcz","Vprf29y4lw","l83UdvkCHH","L7cGc9y4lw",
+"WaWsvBCxeC","BpYhVksJby","XyPZN9rlg9","ZUnqtnlaBy","8TxD7v8yFN","MmsIoZhwG1","CK5W7EdBKc","SbRYyBFkb8","AkKTkZUnqt","kZANmQbxXc",
+"uN6r3dpe1v","nlaByTXQ0Z","7ku1pVNCPd","Z4I1vMmKGJ","CqqaDJkzUn","gtCA5BpYhV","uupzkm4bxU","DQimppFrrl","RACujCK5W7","gjUTuB3qem",
+"IKxdLyofH3","suY4xHRxd8","LDk6fQWxoT","uN6r3Y1mC0","3otm6RpBQm","gtCA53otm6","jfREuP6bcg","Mm8siSWfou","45cIHQ6hMC","IBe8kM6qcG",
+"DG4sT2ZHdk","8U2nUv2eC3","AIYUuReKEW","pAhR1HzZT8","uZPqgsx5Gl","MaJQsEoToP","DG4sTAXpwE","h1zcH1v5hH","0h1b1ZuDtD","HP433KZamH",
+"ZJTXHEdBKc","nnP8oUvlv4","3weIFuQIcz","kB5nPQYxC0","bgJAzDLhzM","xReec5Namm","Gv3FqVerEA","uoStwU3yw5","Cfgr31LB1L","sqVrfYh1hF",
+"1LB1L8xEKz","Nxx9V9GXkX","vOqCEXflUq","EOE1oWreyP","TCgPpGWqqX","2Yz7Eh1zcH","VerEAh1zcH","ksJbyfcJOy","h1zcHgtCA5","CdyBVokgRi",
+"tjQxsRkQke","POUYS7Ow5C","a00b5Cfgr3","9eoRcOz8yZ","GSQwjMmKGJ","8cVD3qaofN","QworujzUqR","7ku1ppmeCd","Nxx9VWaim6","6q6L9ZzJHW",
+"aDGtS5Mg9r","I7p2aWreyP","bZLvSStlDJ","aL6AJ9XyT9","7lUXZuN6r3","2NslmPYBf4","PYBf4oVQp6","580YDMojnP","8FmFHzmLYD","a00b5DcpWB",
+"AkKTkuZPqg","t98iWhYBCK","pFrrl5Namm","GWqqXbrhlQ","7Ow5CVerEA","AXpwE2TRI7","FjHXR07n1c","StlDJ9GXkX","6AFT0tlILt","D6rByuJScX",
+"jS1ajMmsIo","YjB9taFFss","BGaQYvLsmS","Yw2oUZ4I1v","7fKYU48cHL","zmLYDi7WMQ","FnPFBOxWIH","lj07QJXljW","QbxXccmXIX","d7vjMAIYUu",
+"uQIczZUnqt","Z4I1voQ87r","v2eC3RzaZA","NcICAtuDyS","tuDySZUnqt","LewvMaDGtS","8TxD7Z4I1v","MK07YlpF6W","zqH0WhSSvQ","faHirPOUYS",
+"7lUXZMojnP","LbRTH0h1b1","pAhR1RmDcr","OxWIHGXdoH","DLhzMTwano","FcWrWOUYuF","okgRiS77LH","3weIFMkgy8","tjQxs45cIH","iB08lWPmlx",
+"Vprf2NAFuw","lCMxy5drc6","x3LDeLbRTH","MezSWKsjRK","HRxd8iqv4k","8xEKzLbRTH","suY4xoQ87r","Gv3FqS2Dfu","zQt6QWMiS3","he9IAdpe1v",
+"KsjRKuupzk","RxrsmdmoS7","BFkb8MaJQs","8hJdt2ZHdk","Oz8yZlm0pD","fcJOypT8wu","iqv4khYBCK","sqVrf2Nslm","9GXkXQworu","24ARF5iGN5",
+"Yh1hFcL0aE","CNHmvh1zcH","CIShG4W0Tl","AIYUuO3iyQ","fcJOybrhlQ","qaofNyToGW","RzaZA6q6L9","CqqaDpiJSk","CNHmvRpBQm","RsQUqOUqFM",
+"0PktIFnPFB","HlUbF2ZHdk","OUqFMpWiOs","NhXdu8RCUA","euZA5MojnP","Pb1pa5Namm","QYxC0S2Dfu","kB5nPyluBx","16lHczQt6Q","fFDrJzqH0W",
+"l83UdEOE1o","RsQUqHP433","DQimpJIqXi","RxrsmzmLYD","CqqaDIBe8k","TXQ0Z5nmWv","FLsphRpBQm","580YDjzUqR","0MR5XkZANm","MmKGJYf2Ec",
+"uoStwQChxs","9iGoTCp3mZ","cL0aEL7cGc","5Drn0bZLvS","LewvMCxVEf","Chuy3F6PT2","uN6r3tvdkD","F6PT27fKYU","2ZHdkNcICA","xciqpU3yw5",
+"gf8rIIn3NS","55rfB5iGN5","jiVBP16lHc","O3iyQKr8ys","3weIFfLNg8","9y4lwMm8si","s7Mxkhe9IA","gf8rIMojnP","WaWsv5Mg9r","qaofNDG4sT",
+"W3VFHIKxdL","D6rByv1Hln","FcWrWgtCA5","5ZaEzDQimp","hUTw7OHaBz","NOHszlH1kt","5VZjSIKxdL","n8pJ9FLsph","JIqXidjsrv","fcJOyD6rBy",
+"fmIK1Mm8si","8FmFHhUTw7","iKqhrJJs5m","Ta8f6cShY2","tjQxsW7cTs","8xEKzfcJOy","No0QbuN6r3","bZLvSI7p2a","GWqqXSWfou","taOXKZ4I1v",
+"5ZaEzuZPqg","CK5W7s93Ml","WMiS3No0Qb","tlILtCfgr3","MmKGJQChxs","lH1kt7X3uy","FnPFB2ZHdk","MojnPpWiOs","PYBf4zQt6Q","M3zXLWaim6",
+"WreyPQClRL","lkMUAfmIK1","64s8NWaWsv","Z4I1vvkCHH","5IhmGuupzk","LDk6fUlU3M","zbIYY9GXkX","ulk41KZamH","YjB9tZ4I1v","piJSkiwzGk",
+"0BmCyWMiS3","5nmWvcmXIX","7fKYUMaJQs","7ku1pThjNn","lpF6W1j5L8","yvOMIXflUq","Cp3mZFwEJz","s4786Ss0Zu","2hEEUTwano","24ARFJ2mQi",
+"HlUbFOUYuF","M6qcGsx5Gl","nFqiki3pyd","fqypy618Di","Chuy3lXFOB","cShY2580YD","yEfy9s4786","3otm6xciqp","AmdQdWreyP","ZJTXH1LB1L",
+"DG4sTaL6AJ","S2DfuQworu","7Ow5CUmaEv","t59lRydG8U","FGzgpB3qem","IKxdLCxVEf","fqypyh1zcH","BbwgAU3yw5","ZUnqtVIlwP","ulk41gtCA5",
+"uQIczNhXdu","XyPZNFjHXR","oQ87roVQp6","DQimpi3pyd","blLA98FmFH","3otm6AmdQd","JJs5mlj07Q","CdyBVCdyBV","9eoRcblLA9","FVMxoGXdoH",
+"ZuDtDiKqhr","Chuy3AIYUu","Oz8yZJIqXi","07n1cn1pmO","S2DfuuQIcz","QssNCv1Hln","pmeCdQChxs","fcJOyaFFss","Ta8f6Chuy3","4W0TlaFFss",
+"SbRYyv8yFN","zmLYDh1zcH","n8pJ9fFDrJ","rhl0JP6bcg","0Wr5yjzUqR","pAhR1euZA5","cShY2zbIYY","mz8gx0YAGH","o8Uyd0MR5X","Yf2Eck85Ae",
+"9XyT9xciqp","Cp3mZy94nw","K20wKM6qcG","pT8wutjQxs","m4bxU45cIH","v1HlnBbwgA","Mkgy80BmCy","v2eC3o8Uyd","RmDcrFxX9q","xciqp7hyVv",
+"i3pydW3VFH","WreyP29QAz","MmKGJPYBf4","zz4ZUCxVEf","StlDJRmDcr","zFgtBYh1hF","FFDuiCfgr3","FVMxoQworu","OUqFMiwzGk","3otm6JXljW",
+"suY4xZuDtD","y94nwgdQsS","IRh485drc6","dmoS7QYxC0","vkCHHuoStw","KZamHNOHsz","IKxdL8xEKz","I7p2aGXdoH","KZamHIn3NS","QChxslH1kt",
+"KZamHJJs5m","16lHcMK07Y","y94nwJkzUn","F6PT2W3VFH","he9IAfqypy","uN6r3cQOnv","FcWrWjzUqR","CdyBVi7WMQ","jiVBPvkCHH","5NammuPX7G",
+"6q6L9Fhtgl","JIqXiuLtKs","d85a9b29RJ","1j5L8S2Dfu","jtn0XM6qcG","QChxsMmsIo","uZPqgs4786","LbRTHm4bxU","BpYhVzY1GY","KASQ8wDajX",
+"5ZaEzazIWp","uupzkx3LDe","xciqpBpYhV","AkKTkPYBf4","uJScX3otm6","8xEKzFPfSE","pT8wu8cVD3","WmadASWfou","brhlQ5VZjS","4dEz6tl72W",
+"QClRLCNHmv","qQxHPjeskS","Cp3mZ48cHL","AXpwEiwzGk","LDk6fSjskQ","FGzgp5drc6","NAFuw2Yz7E","lm0pDZv7z0","pv0i7d85a9","Ta8f6lm0pD",
+"DG4sThYBCK","O3iyQ1j5L8","5Namm55rfB","TCgPp8RCUA","WreyPtlILt","xciqp5ZaEz","AgJHQh1zcH","UmaEv7X3uy","t98iW45cIH","4dEz6UlU3M",
+"zY1GYhi5X7","gtCA5UmaEv","nlaByZuDtD","lsQGok85Ae","kB5nP3otm6","GXdoHcL0aE","Vprf2WaWsv","AkKTkKr8ys","PYBf4kB5nP","ru4UGNAFuw",
+"AIYUuzmLYD","jSjS3DLhzM","xciqpReKEW","TXQ0ZFcWrW","ZuDtDOxWIH","lCMxy8FmFH","dmoS7No0Qb","J2mQi7Ow5C","iKqhrbgJAz","zqH0WTCgPp",
+"kB5nPhYBCK","Cfgr3Pb1pa","e6e4zC2Irc","Waim6BFkb8","n8pJ9faHir","he9IAHfyNQ","SWfouFxX9q","2Yz7EB3qem","tvdkDxciqp","WDVWJuZPqg",
+"Rxrsmt98iW","FxX9qiwzGk","8hJdthE1Ql","Twanouupzk","Cfgr3t98iW","8hJdtpWiOs","HfyNQIBe8k","FVMxo07n1c","suY4xlCMxy","W3VFHAgJHQ",
+"jeskSxXTI4","fcJOyiKqhr","SbRYyHRxd8","2hEEUQbxXc","ogLgcYOfrY","euZA5QnJ1S","xciqpblLA9","LbRTHYjB9t","dmoS7gdQsS","LbRTHcL0aE",
+"S2DfubrhlQ","Chuy36q6L9","pT8wuBbwgA","KZamH8xEKz","2DREsulk41","aFFss8xEKz","s4786CNHmv","vkCHHcL0aE","EoToPLbRTH","ix74rIRh48",
+"S2DfulweGy","guMb89rlg9","n1pmOHRxd8","2ZHdkQbxXc","WmadAOxWIH","64s8NlXFOB","S2DfuChuy3","2NslmtaOXK","aFFss5Namm","h1zcHy94nw",
+"FGzgpWDVWJ","dQ586jzUqR","tjQxsVerEA","FnPFBgIYvE","qaofN24ARF","lCMxyNo0Qb","MGlTFb29RJ","n8pJ99XyT9","FGzgpbgJAz","pWiOsnnP8o",
+"CdyBV0h1b1","pmeCdAmdQd","IBe8kZJTXH","5ZaEzRzaZA","0YAGHfFDrJ","RBhp0s7Mxk","qUJMdo8Uyd","5nmWvksJby","6q6L9x3LDe","fmIK1pvgjS",
+"hSSvQi7WMQ","fmIK1IKxdL","lXFOBkZANm","Z4I1v9iGoT","cL0aEaDGtS","HP433VLTy6","iKqhraFFss","Ss0ZupiJSk","tAOsrReKEW","sqVrfMK07Y",
+"KsjRK2hEEU","zz4ZUlH1kt","iB08liKqhr","No0QbhE1Ql","n8pJ9ru4UG","7Ow5CoQ87r","dpe1vPOUYS","k85AebrhlQ","fFDrJBpYhV","sqVrflH1kt",
+"lsQGoK4GS8","vLsmSECMvU","MezSWQworu","zmLYDKr8ys","LbRTHksJby","RmDcrWPmlx","0YAGHkB5nP","d7vjMGSQwj","FNYIMRBhp0","RxrsmQ6Lix",
+"MmsIoSbRYy","tl72WSmGzv","rz7UtD6rBy","MaJQs24ARF","0Wr5yogLgc","SjskQ0Kyfs","No0QbTwano","Mm8siCK5W7","0MR5XJ2mQi","4dEz65drc6",
+"iqv4kjS1aj","0h1b1ReKEW","X6PinnFqik","n1pmOZuDtD","l83UdFwEJz","RzaZA55rfB","OxWIHBFkb8","lweGyfLNg8","YOfrYlm0pD","J2mQihUTw7",
+"Oz8yZyToGW","uN6r3L7cGc","5VZjS0Kyfs","FxX9qNOHsz","FPfSE7hyVv","No0Qb3otm6","ksJbymz8gx","yToGWuLtKs","5Drn0F6PT2","2ZHdkFxX9q",
+"mX2GEAmdQd","2Yz7EFwEJz","Cfgr3UlU3M","k85AeZzJHW","HlUbFn1pmO","BpYhVn1pmO","0MR5XtaOXK","QWxoT6q6L9","faHiryEfy9","blLA9CdyBV",
+"8xEKzMezSW","0MR5XFGzgp","Q6hMClViBv","tl72WU3yw5","MGlTFVerEA","0PktIIBe8k","Cfgr3W7cTs","45cIHiKqhr","pvgjSatef2","16lHcDG4sT",
+"xciqpqQxHP","BFkb8blLA9","DcpWByEfy9","pFrrluPX7G","x3LDeU3yw5","29QAzjSjS3","lpF6WMmKGJ","VNCPdSmGzv","8RCUA2DREs","DcpWBRpBQm",
+"5ZaEzXyPZN","ksJbygtCA5","xXTI4prNT6","JKWYRZzJHW","6AFT0WaWsv","OUYuFe6e4z","QssNCIBe8k","Ta8f6n8pJ9","J2mQiJKWYR","GSQwjs7Mxk",
+"KASQ8MojnP","s7MxkeuZA5","RsQUqjfREu","4W0Tl1LB1L","Qworu5Drn0","L7cGcnnP8o","YOfrYx3LDe","BFkb8s93Ml","m4bxUnnP8o","cShY2kZANm",
+"lpF6WEOE1o","lj07QOz8yZ","ReKEWt59lR","JXljWgdQsS","zFgtByvOMI","9rlg9UlU3M","v2eC3Mkgy8","CdyBVMGlTF","Zv7z0AOgEe","iwzGkgIYvE",
+"RACujaL6AJ","OxWIHOz8yZ","NOHszWmadA","iB08lgf8rI","pmeCdlViBv","CNHmvlkMUA","s93MlWPmlx","yofH3NhXdu","vLsmSZzJHW","x3LDerKDLJ",
+"fLNg8mz8gx","i7WMQlXFOB","rKDLJSjskQ","Dz1R3jzUqR","AkKTkIBe8k","fcwDavkCHH","5NammbgJAz","euZA5i3pyd","s7MxkhE1Ql","MojnPZuDtD",
+"YjB9tpv0i7","fcwDafqypy","azIWp6q6L9","pAhR1tvdkD","WaWsvRxrsm","RxrsmMGlTF","gjUTupAhR1","prNT6ZzJHW","Mkgy8aez9y","NcICAKZamH",
+"YjB9tC2Irc","VBjhzRsQUq","uPX7GKASQ8","pT8wuYf2Ec","AkKTkJkzUn","fFDrJjiVBP","HRxd8cL0aE","a00b5FFDui","cShY2h1zcH","xXTI47hyVv",
+"VLTy6QClRL","brhlQblLA9","s4786KASQ8","PYBf4zmLYD","5Namm0ao3l","iKqhrcmXIX","m4bxUblLA9","y94nw8hJdt","guMb8oQ87r","3weIFqaofN",
+"kB5nPY1mC0","cL0aEn1pmO","9GXkXAmdQd","hE1Ql3weIF","hUTw75VZjS","o8UydTa8f6","hUTw7he9IA","Q6hMCguMb8","2TRI7QnJ1S","8TxD7ydG8U",
+"zqH0W9y4lw","Z4I1vRkQke","MaJQs9iGoT","S2DfuwDajX","Nxx9Vv2eC3","Cp3mZI7p2a","atef20YAGH","gIYvE5Namm","8FmFH580YD","tjQxsK4GS8",
+"dQ586v2eC3","cL0aEy94nw","wiHrZOxWIH","OUYuFfaHir","rhl0JuQIcz","IKxdLK20wK","1v5hH2ZHdk","i3pydY1mC0","HzZT8JJs5m","S2Dfuv8yFN",
+"48cHLQYxC0","xXTI4zz4ZU","5ZaEzi3pyd","Y1mC02TRI7","C2IrcJKWYR","bZLvSzQt6Q","Yh1hFWaWsv","WmadAAXpwE","v8yFNM3zXL","5iGN5oGu6x",
+"WreyPIKxdL","azIWpChuy3","WaWsv24ARF","t59lRatef2","FwEJzguMb8","NOHszBGaQY","8hJdtXflUq","FVMxoYOfrY","D6rByuN6r3","ksJbydjsrv",
+"mX2GEBCxeC","jS1ajsx5Gl","jeskSjfREu","DcpWB4W0Tl","zFgtB9eoRc","EdBKcnnP8o","tvdkDqaofN","Q6hMCBbwgA","hSSvQMGlTF","mX2GEGXdoH",
+"L7cGca00b5","VBjhzpWiOs","RACujYOfrY","nFqike6e4z","lViBv2ZHdk","ZuDtDFLsph","atef2MmKGJ","8U2nUAOgEe","IRh48fcwDa","s93MlHfyNQ",
+"lH1ktcmXIX","2Yz7E6q6L9","jzUqR48cHL","s7Mxk0PktI","RzaZAPYBf4","rhl0JjiVBP","U3yw5jzUqR","X6PinMmKGJ","1v5hHulk41","Mkgy88U2nU",
+"dpe1vD6rBy","ciuWzqUJMd","VerEAlkMUA","guMb8580YD","jtn0XqUJMd","Chuy35ZaEz","fcJOyazIWp","uJScXS2Dfu","L7cGc2Nslm","jSjS3uJScX",
+"TCgPpLbRTH","sqVrfZhwG1","zmLYDjSjS3","GrDg7v8yFN","Ul4a1o8Uyd","Nxx9VRACuj","gIYvE7X3uy","s93MlYw2oU","7fKYUx3LDe","qaofNnlaBy",
+"IjTwPk85Ae","FxX9qZ4I1v","0PktIaL6AJ","SbRYyKASQ8","JXljWguMb8","WPmlxMmKGJ","ZUnqtRmDcr","FNYIMyofH3","hE1QlnnP8o","ZJTXHxXTI4",
+"In3NS64s8N","ru4UGYh1hF","NOHszuAWyp","lkMUAXflUq","uoStwsx5Gl","45cIHl83Ud","uLtKss7Mxk","L7cGcfFDrJ","Kr8ysqUJMd","EoToPd85a9",
+"580YDVBjhz","EoToPMezSW","29QAz6q6L9","QWxoTeuZA5","v8yFNzY1GY","tlILtjzUqR","dpe1vfaHir","uN6r3QssNC","HlUbFvOqCE","QClRLFPfSE",
+"FFDuiVIlwP","HRxd8IRh48","lXFOBOxWIH","uupzkcmXIX","Uvlv4tl72W","guMb8C2Irc","4W0Tlk85Ae","e6e4zxciqp","Yw2oUKr8ys","gIYvE7Ow5C",
+"guMb8WMiS3","pAhR1pT8wu","3otm6fLNg8","TCgPpHzZT8","sqVrfPOUYS","lXFOBsx5Gl","FxX9q5Drn0","RpBQmgjUTu","EoToPTXQ0Z","aez9y48cHL",
+"RmDcrdpe1v","B3qemaL6AJ","pmeCdWaim6","nlaByuvf7A","7fsYMblLA9","XflUqYw2oU","lCMxyZv7z0","7fKYUgf8rI","lViBvkZANm","fqypy64s8N",
+"3otm6MezSW","ru4UGdjsrv","07n1cNo0Qb","Z4I1vM6qcG","OUYuFx3LDe","C2IrcX6Pin","P6bcgECMvU","ReKEWOUqFM","bgJAz580YD","7fKYUFFDui",
+"UmaEvY1mC0","Y1mC0he9IA","Qworurhl0J","IjTwPNcICA","azIWpMmKGJ","k85AeyluBx","KASQ85IhmG","U3yw5dmoS7","ix74rtlILt","4QMc9JKWYR",
+"RkQkedmoS7","MaJQsiwzGk","FnPFBhUTw7","MojnPwDajX","gdQsSBGaQY","Uvlv4JIqXi","Q6LixFnPFB","0h1b11v5hH","HP43345cIH","kZANm8RCUA",
+"fmIK1Waim6","PYBf4vkCHH","HRxd8sqVrf","he9IAguMb8","Gv3FquTacx","Waim6MezSW","EdBKciB08l","MmKGJCxVEf","ECMvUpAhR1","pFrrlIn3NS",
+"zHF1qMmsIo","zHF1qAIYUu","16lHcuJScX","L7cGcPYBf4","RmDcrwDajX","5ZaEznlaBy","NhXduYh1hF","CK5W7WPmlx","KASQ8Yh1hF","FnPFBReKEW",
+"WDVWJfmIK1","4dEz6ulk41","piJSktlILt","CIShGd85a9","No0Qb0YAGH","gdQsSM6qcG","taOXKGXdoH","FjHXRNhXdu","Ss0Zud85a9","jzUqRi3pyd",
+"8hJdtKsjRK","QYxC0GSQwj","aL6AJhe9IA","2hEEUCIShG","Q6hMCRpBQm","KsjRKnnP8o","YOfrYvLsmS","uLtKs0ao3l","LewvMVjCZq","5iGN5XyPZN",
+"soy9t7Ow5C","he9IAFNYIM","QssNCRmDcr","QssNCWreyP","v8yFNIBe8k","i7WMQuTacx","FhtglW7cTs","ydG8UAOgEe","S77LH2Nslm","7fKYUsuY4x",
+"D6rByAkKTk","jeskS8RCUA","v1Hln0BmCy","uJScXOxWIH","OxWIH5VZjS","MmKGJTa8f6","HlUbF9eoRc","KASQ8Ss0Zu","7Ow5Clj07Q","brhlQyEfy9",
+"qaofNuvf7A","HzZT8d7vjM","tlILtgdQsS","FGzgpVIlwP","MGlTFix74r","m4bxUjeskS","m4bxUWaim6","pv0i7zz4ZU","SjskQzHF1q","WreyPlsQGo",
+"MezSW0h1b1","14FLRQworu","C2IrcQChxs","nFqikm4bxU","IKxdLFFDui","HP4335VZjS","C2IrclViBv","Cp3mZ9XyT9","hE1QlCIShG","VNCPdlsQGo",
+"1LB1LxReec","8xEKzRpBQm","580YDJIqXi","Waim6EOE1o","qUJMdi7WMQ","RkQkeDQimp","Uvlv4EOE1o","GrDg7EOE1o","piJSkGv3Fq","Cp3mZKr8ys",
+"Cfgr3tjQxs","yToGWKASQ8","TXQ0ZCIShG","W3VFHBCxeC","BpYhV8FmFH","Cp3mZtlILt","Mkgy8G1RhS","NOHszMaJQs","2TRI7VerEA","6q6L97ku1p",
+"yofH3Vprf2","WMiS3SmGzv","2DREsVNCPd","zz4ZUWaWsv","VBjhzSbRYy","hSSvQksJby","uN6r3uTacx","1j5L8LewvM","Rxrsm9XyT9","QWxoTTa8f6",
+"BGaQYfcwDa","lm0pD55rfB","RxrsmCp3mZ","zmLYD580YD","Uvlv4BCxeC","LbRTHe6e4z","8U2nUzz4ZU","5ZaEz45cIH","9rlg92DREs","CdyBV0Kyfs",
+"Ul4a1oQ87r","RzaZAVjCZq","MojnPGXdoH","e6e4z8hJdt","No0QbJKWYR","2NslmNAFuw","rKDLJn1pmO","EoToPGXdoH","s7Mxk16lHc","a00b5lkMUA",
+"StlDJfcJOy","5ZaEzo8Uyd","zz4ZUSbRYy","IjTwPWmadA","o8UydOUYuF","ydG8U5VZjS","4QMc98TxD7","QClRL7lUXZ","RzaZAdjsrv","KsjRK0MR5X",
+"NAFuw8xEKz","QYxC0pv0i7","X6PinWaim6","kB5nPn8pJ9","POUYSOHaBz","zFgtBCxVEf","IjTwPaDGtS","IRh48Cp3mZ","jzUqRLDk6f","ogLgcFFDui",
+"2DREssuY4x","FPfSElj07Q","lCMxy7X3uy","Z4I1vnFqik","2DREsuPX7G","NhXdutlILt","suY4x7fKYU","MGlTF16lHc","1v5hHMezSW","iKqhrCK5W7",
+"0Wr5yJJs5m","LewvMYf2Ec","GWqqXEOE1o","Uvlv4lsQGo","VBjhzhUTw7","Kr8ysCNHmv","8cVD3mX2GE","YOfrYuoStw","sqVrfi7WMQ","lXFOBuJScX",
+"FPfSECp3mZ","QWxoTs4786","8hJdtgIYvE","7hyVvk85Ae","7hyVv3weIF","iB08lgIYvE","BbwgAt98iW","nlaByTa8f6","QbxXc2DREs","S2DfuXflUq",
+"9y4lwCdyBV","GXdoHM6qcG","Yf2EcG1RhS","m4bxU580YD","0ao3lHP433","v8yFNVBjhz","FxX9q7fsYM","pmeCdtvdkD","7fKYU2ZHdk","lj07QcmXIX",
+"2TRI75drc6","zqH0WMojnP","n8pJ9K4GS8","h1zcHAkKTk","HRxd88FmFH","Ul4a1YOfrY","uvf7AqaofN","S2Dful83Ud","i3pydZhwG1","BbwgAdjsrv",
+"29QAz0ao3l","brhlQDcpWB","hSSvQGv3Fq","suY4xyEfy9","lsQGoStlDJ","ulk41zqH0W","Pb1pabrhlQ","s93MlbgJAz","AIYUu0MR5X","n8pJ9oQ87r",
+"CNHmvYh1hF","e6e4zjfREu","7fKYUs93Ml","HlUbFAIYUu","v1Hln5Namm","Rxrsmy94nw","zQt6QZhwG1","rhl0JjSjS3","64s8NSs0Zu","580YDM6qcG",
+"RpBQmlm0pD","ksJbyWaWsv","7Ow5C9GXkX","xReecPYBf4","618DilH1kt","uAWypBpYhV","FFDuiMezSW","G1RhSMmKGJ","vLsmSa00b5","FLsph8FmFH",
+"OUYuFQbxXc","atef2Uvlv4","VBjhzAgJHQ","t98iWoQ87r","FwEJz0Wr5y","ydG8UcShY2","gdQsS4dEz6","55rfBzQt6Q","atef224ARF","U3yw54QMc9",
+"FLsphtlILt","ix74rCxVEf","ZhwG1I7p2a","tl72WTwano","lsQGoEoToP","D6rByqaofN","J2mQi9y4lw","iwzGkksJby","zz4ZU2ZHdk","Q6hMCuTacx",
+"brhlQfFDrJ","0BmCyF6PT2","soy9tnnP8o","tvdkDCqqaD","sx5GlOUqFM","ThjNnAgJHQ","HP4332DREs","KZamHRzaZA","2ZHdkuQIcz","euZA5PYBf4",
+"VBjhz48cHL","WreyPFjHXR","lsQGoe6e4z","AXpwECxVEf","D6rBykZANm","yvOMIUl4a1","pFrrlfqypy","ni2v1RkQke","n1pmOQworu","uAWypgf8rI",
+"Pb1paYjB9t","7fsYMHlUbF","RkQkeKZamH","suY4x2DREs","UlU3MZ4I1v","k85AetaOXK","he9IARxrsm","s7Mxkiqv4k","FPfSEaDGtS","In3NSuAWyp",
+"HP433EOE1o","yluBxtAOsr","XyPZNsx5Gl","CNHmvYf2Ec","TXQ0Zhi5X7","KZamHaez9y","M3zXL8FmFH","SmGzvru4UG","uPX7GzY1GY","euZA5ogLgc",
+"ThjNnThjNn","pFrrl8FmFH","5NammHRxd8","nFqik4dEz6","8FmFHpT8wu","G1RhSokgRi","euZA5nlaBy","jiVBPhUTw7","s7MxkzQt6Q","MmsIoGv3Fq",
+"lkMUAJIqXi","FcWrWdmoS7","RzaZAOxWIH","CIShGcL0aE","Uvlv4QWxoT","ni2v1guMb8","VerEASmGzv","d7vjMSWfou","HfyNQSmGzv","hUTw72DREs",
+"zY1GYGrDg7","zQt6Q7X3uy","vkCHHru4UG","RzaZAUlU3M","aDGtSWaim6","LDk6f4dEz6","tl72WTa8f6","i7WMQSjskQ","5iGN5cShY2","64s8NuTacx",
+"FGzgpS77LH","ru4UGJRJQB","O3iyQuupzk","ECMvUiqv4k","5IhmGfLNg8","iKqhr48cHL","8hJdtQbxXc","RmDcrFcWrW","W3VFH8cVD3","NAFuwjiVBP",
+"Q6hMCPOUYS","7ku1pMm8si","ogLgcXflUq","sqVrfv8yFN","TXQ0ZM6qcG","HlUbFLDk6f","2hEEUKsjRK","618Di0Wr5y","aFFsse6e4z","7lUXZI7p2a",
+"jiVBPNAFuw","ulk41WreyP","lXFOBaez9y","sx5Gl5ZaEz","DLhzM45cIH","3weIF2DREs","okgRiDz1R3","jzUqRPOUYS","B3qemNOHsz","sqVrfEOE1o",
+"ZuDtDru4UG","Cp3mZZhwG1","BGaQY0YAGH","xReecxReec","ZuDtDo8Uyd","Q6hMCokgRi","F6PT2X6Pin","tl72WQworu","StlDJ2TRI7","dmoS7lXFOB",
+"StlDJcShY2","Yh1hFQYxC0","RmDcrDcpWB","9y4lwChuy3","LDk6fAOgEe","QChxsNcICA","Z4I1vMK07Y","jS1ajrz7Ut","lCMxytl72W","CNHmvW3VFH",
+"7Ow5CgtCA5","k85AeGrDg7","OxWIHJkzUn","4QMc9Rxrsm","Y1mC0lm0pD","fmIK1IRh48","b29RJ5IhmG","tjQxsfqypy","7hyVvHlUbF","FwEJzVjCZq",
+"pT8wujiVBP","JkzUnlH1kt","fcwDaRACuj","SbRYyDG4sT","y94nwFPfSE","IBe8kyvOMI","xXTI4soy9t","LbRTHYw2oU","JkzUnSs0Zu","uvf7AQ6hMC",
+"2DREs0MR5X","Pb1pa8xEKz","CK5W7JRJQB","29QAz0MR5X","EoToPO3iyQ","U3yw524ARF","fFDrJG1RhS","ogLgcuPX7G","lXFOBprNT6","FxX9qogLgc",
+"EoToPFjHXR","iqv4kLewvM","Q6LixlweGy","K4GS8IRh48","XyPZNVBjhz","5VZjSi7WMQ","6AFT0QClRL","NhXduVerEA","QbxXcM3zXL","s4786aDGtS",
+"lH1ktKASQ8","FLsphBbwgA","ECMvURsQUq","dQ586zY1GY","uN6r3C2Irc","jeskSJkzUn","pAhR13otm6","Gv3FqjSjS3","6q6L9v2eC3","oQ87rKASQ8",
+"RzaZAokgRi","WDVWJIn3NS","rKDLJjSjS3","QbxXcZzJHW","mz8gx29QAz","d7vjMyvOMI","qUJMddmoS7","SbRYy4QMc9","zY1GYQChxs","aez9ygdQsS",
+"hUTw7zz4ZU","VBjhzs4786","aFFssaL6AJ","MGlTF5Mg9r","cmXIXMGlTF","6AFT0580YD","fFDrJfmIK1","24ARFdpe1v","Uvlv4uZPqg","Yh1hFs7Mxk",
+"xciqplm0pD","AgJHQnnP8o","5VZjSThjNn","Ta8f6CqqaD","b29RJoVQp6","uAWypFNYIM","9GXkXStlDJ","JIqXiFLsph","3otm6DG4sT","VLTy6v8yFN",
+"NAFuwuQIcz","EoToPWaWsv","fLNg8D6rBy","LbRTHOz8yZ","BbwgAlViBv","d85a9lpF6W","Pb1palsQGo","4W0Tlt59lR","VLTy60Wr5y","KASQ8DcpWB",
+"aL6AJeuZA5","0BmCyaFFss","5nmWvMojnP","y94nw0ao3l","M3zXL3weIF","jfREucShY2","Zv7z0BbwgA","JKWYRulk41","W7cTsuJScX","hi5X70ao3l",
+"tl72WQWxoT","ThjNnoGu6x","5IhmGi3pyd","pmeCdVprf2","t59lRuTacx","zY1GYqQxHP","l83UdZv7z0","WDVWJIKxdL","cQOnv9rlg9","OUqFMm4bxU",
+"4dEz66AFT0","HRxd85Namm","h1zcH55rfB","fmIK1fcJOy","jS1aj5Namm","KZamHv2eC3","iqv4kb29RJ","CNHmvBGaQY","SbRYySWfou","zbIYYD6rBy",
+"0KyfsW3VFH","K20wKMGlTF","JKWYR64s8N","DQimpwDajX","qUJMdgIYvE","Ul4a1IRh48","lH1ktFFDui","aL6AJdpe1v","M3zXLUlU3M","tAOsruupzk",
+"9iGoTaFFss","HzZT8lH1kt","KASQ8lViBv","5IhmGJkzUn","s93Ml2ZHdk","1v5hH9y4lw","EoToPfmIK1","16lHcRACuj","cShY2nFqik","Rxrsm1j5L8",
+"i7WMQ6q6L9","djsrvWaWsv","M3zXL8cVD3","RmDcrlsQGo","IjTwPlm0pD","zHF1qs7Mxk","sqVrfTCgPp","0Wr5yAgJHQ","KASQ8ix74r","ydG8U618Di",
+"CIShGa00b5","FNYIMmX2GE","m4bxUIBe8k","Gv3FqFhtgl","HfyNQyEfy9","J2mQi580YD","tvdkDpWiOs","NOHszzFgtB","ni2v1BbwgA","Pb1paO3iyQ",
+"n8pJ9FwEJz","OxWIHUlU3M","PYBf4ZzJHW","ni2v1JKWYR","MezSW5ZaEz","1v5hHtuDyS","StlDJyToGW","uN6r3jtn0X","Q6LixqUJMd","zqH0WCfgr3",
+"t59lRlj07Q","Q6hMC8xEKz","dhSuHhUTw7","nnP8ojeskS","t98iWEoToP","O3iyQpT8wu","pAhR1gIYvE","64s8NPOUYS","JXljWCfgr3","In3NSguMb8",
+"suY4xWMiS3","MGlTF6q6L9","hi5X7uvf7A","Yw2oUWPmlx","Z4I1vCdyBV","0MR5XNAFuw","KASQ8yvOMI","KZamH4W0Tl","16lHcuupzk","FGzgpLewvM",
+"pWiOshe9IA","dhSuHx3LDe","U3yw5rKDLJ","pmeCdMGlTF","Oz8yZLbRTH","Ta8f68hJdt","MGlTFYf2Ec","uTacxQbxXc","faHir9rlg9","brhlQPYBf4",
+"9rlg9soy9t","zFgtBjtn0X","FhtglWaim6","JKWYRVIlwP","tvdkD3weIF","wiHrZ5VZjS","dhSuHjS1aj","lH1ktlpF6W","Chuy3BpYhV","soy9tpAhR1",
+"9XyT9MmsIo","kB5nPOHaBz","VjCZqZ4I1v","uupzkAgJHQ","jtn0X9eoRc","rKDLJpFrrl","Ss0ZuP6bcg","RBhp0NAFuw","hUTw7FGzgp","0BmCylweGy",
+"i3pydgIYvE","PYBf4xReec","IjTwPmX2GE","wiHrZAIYUu","x3LDeSWfou","v8yFNFcWrW","Chuy3blLA9","TXQ0ZNxx9V","BCxeCHP433","Mm8si07n1c",
+"IBe8kfmIK1","CxVEfzmLYD","Q6Lixs93Ml","ydG8UcL0aE","AgJHQOUqFM","CNHmvkZANm","7fsYMt98iW","QnJ1SgdQsS","lj07QZuDtD","JKWYRv1Hln",
+"uQIczP6bcg","yofH3blLA9","TwanozqH0W","ciuWzAXpwE","oGu6x3weIF","AXpwErz7Ut","RpBQmjiVBP","9eoRctl72W","sx5GlYOfrY","suY4xsqVrf",
+"oQ87rJ2mQi","Ss0ZuM6qcG","5IhmGQClRL","prNT6hi5X7","JXljWFjHXR","Mm8sijSjS3","I7p2atvdkD","pWiOsyofH3","blLA90PktI","RzaZADLhzM",
+"JJs5mzmLYD","BFkb8CK5W7","DcpWBFjHXR","jeskSqQxHP","xXTI4CdyBV","NAFuwtjQxs","yvOMITwano","OUqFMeuZA5","618DibrhlQ","QChxsQbxXc",
+"kZANmYjB9t","CdyBVgtCA5","CqqaD5Namm","jiVBPZ4I1v","5VZjS9iGoT","OUqFMpvgjS","YjB9tnlaBy","aFFssjS1aj","ZuDtDrKDLJ","QChxsSs0Zu",
+"WaWsvD6rBy","VNCPdt59lR","ThjNnJIqXi","RACujv2eC3","NhXdurKDLJ","yToGWl83Ud","yToGWWDVWJ","3weIF1j5L8","zz4ZU7X3uy","IRh48taOXK",
+"Z4I1v8TxD7","Yf2EcCK5W7","0h1b1ciuWz","EoToPReKEW","5VZjSQChxs","WPmlx8cVD3","45cIH8cVD3","OUYuF0PktI","tAOsrYw2oU","8RCUAnnP8o",
+"7hyVvjtn0X","pFrrlBFkb8","5Drn0bgJAz","Ta8f6pvgjS","U3yw50Wr5y","Z4I1vo8Uyd","8hJdtzFgtB","8hJdtTwano","xciqpChuy3","FxX9q9eoRc",
+"S77LH8FmFH","fmIK1lkMUA","3otm6uvf7A","yluBxuupzk","LDk6fmX2GE","lsQGoWPmlx","K4GS8lweGy","AXpwEpmeCd","uLtKsMmsIo","tuDySQbxXc",
+"CIShG3otm6","QworupmeCd","5IhmG0ao3l","d7vjM5drc6","fqypyOUYuF","ZuDtDbgJAz","Waim6cQOnv","QChxsRBhp0","RpBQmqQxHP","WaWsvfcJOy",
+"UlU3MKsjRK","euZA5FjHXR","8RCUAO3iyQ","1LB1LuZPqg","s93Ml7hyVv","LDk6fHlUbF","pmeCdMaJQs","JIqXieuZA5","CNHmvSs0Zu","qUJMdYf2Ec",
+"RsQUqO3iyQ","pFrrlcShY2","okgRifcwDa","ulk41BpYhV","lpF6Wi7WMQ","lm0pDuN6r3","nlaByKZamH","5NammKZamH","I7p2auQIcz","lpF6WjSjS3",
+"2NslmMojnP","bgJAzZhwG1","yvOMIThjNn","FcWrWv1Hln","XflUqv8yFN","Waim6M3zXL","aL6AJFhtgl","2TRI7VjCZq","cmXIXVNCPd","BpYhVv8yFN",
+"rhl0Ji7WMQ","HzZT8JRJQB","FPfSECK5W7","PYBf4WaWsv","b29RJCdyBV","brhlQM6qcG","DcpWBGSQwj","s7Mxk3weIF","FVMxoJ2mQi","mX2GESjskQ",
+"pmeCd8U2nU","uLtKsiKqhr","Q6hMC7lUXZ","Nxx9V5nmWv","Yh1hFru4UG","a00b5oGu6x","DcpWBDG4sT","7hyVvYw2oU","FcWrWJkzUn","hSSvQ2Nslm",
+"JJs5mK4GS8","ydG8UlH1kt","tAOsrCK5W7","W3VFHuQIcz","rz7UtnnP8o","16lHcMGlTF","ECMvUJIqXi","2hEEUlViBv","hYBCKRBhp0","prNT607n1c",
+"Z4I1vTXQ0Z","dmoS7FVMxo","soy9tdmoS7","SWfouAmdQd","1j5L8FVMxo","uTacxguMb8","Mkgy8AmdQd","K4GS80ao3l","WDVWJxReec","4W0TlYf2Ec",
+"gdQsSs4786","hE1QlqaofN","jeskSNOHsz","vOqCEXyPZN","TCgPpAIYUu","QClRLh1zcH","uAWypO3iyQ","WmadAQChxs","GWqqXoGu6x","lsQGo7fKYU",
+"MojnPcmXIX","TXQ0Zi7WMQ","4dEz6LbRTH","ThjNnZuDtD","NOHszTXQ0Z","lsQGoVLTy6","IRh48IRh48","MK07YaFFss","azIWpJIqXi","DcpWB3otm6",
+"Chuy3qaofN","i7WMQ580YD","atef2X6Pin","soy9tC2Irc","7ku1pAOgEe","gtCA5Q6Lix","W3VFH4W0Tl","1LB1LRmDcr","v1HlnjeskS","1LB1LgtCA5",
+"taOXKxXTI4","y94nwDLhzM","7hyVvPOUYS","ZzJHWjSjS3","hUTw7VerEA","HP433ZhwG1","WDVWJ8TxD7","Cp3mZ29QAz","uN6r3v2eC3","zQt6QFVMxo",
+"OHaBzZv7z0","WmadANxx9V","S2DfuI7p2a","QbxXc7fKYU","uLtKs5Mg9r","XflUqd85a9","Cp3mZCdyBV","DLhzM2TRI7","Gv3FqWreyP","he9IAv2eC3",
+"xXTI4cQOnv","aDGtSP6bcg","VIlwP7X3uy","EOE1oVprf2","Y1mC0k85Ae","5IhmGuJScX","gjUTuNAFuw","Oz8yZVerEA","7ku1pHlUbF","fLNg8CIShG",
+"ciuWzBFkb8","guMb8yvOMI","DcpWBQbxXc","lj07QW7cTs","GWqqXx3LDe","uLtKsPOUYS","Uvlv4YjB9t","Q6Lix580YD","NAFuwcShY2","pFrrl5Mg9r",
+"BGaQYWMiS3","pWiOsJRJQB","Zv7z0580YD","XflUqVIlwP","MojnP9GXkX","b29RJJ2mQi","zmLYDQssNC","cL0aED6rBy","QWxoTDG4sT","LewvMfcJOy",
+"M3zXLFcWrW","OUqFM6AFT0","FwEJzd7vjM","5iGN5he9IA","wDajXjS1aj","6AFT0d7vjM","SbRYy3weIF","8cVD3ZUnqt","C2IrcRpBQm","2TRI7GWqqX",
+"pvgjSLDk6f","nnP8otAOsr","CNHmvIn3NS","s7MxkyEfy9","d85a96AFT0","5nmWvaDGtS","QYxC0x3LDe","VBjhzlm0pD","RkQkeU3yw5","prNT6lH1kt",
+"MK07YFxX9q","07n1caFFss","O3iyQB3qem","dpe1vSs0Zu","iKqhri7WMQ","0ao3lTCgPp","K4GS8TCgPp","UmaEvgIYvE","O3iyQ7Ow5C","vkCHHDQimp",
+"ru4UGEoToP","blLA9Yf2Ec","pAhR1WaWsv","0h1b1kZANm","XyPZNgf8rI","QworufcwDa","7X3uyXflUq","hE1QlMezSW","0MR5XqaofN","lCMxyydG8U",
+"vkCHHm4bxU","lkMUAQ6Lix","D6rByi3pyd","1v5hHEoToP","GSQwjpiJSk","YjB9txciqp","nFqikYh1hF","Ta8f6cL0aE","HfyNQaDGtS","HRxd85ZaEz",
+"Vprf2i3pyd","tvdkDVIlwP","Cp3mZuTacx","LDk6fRsQUq","OxWIHhi5X7","hYBCKtvdkD","ogLgcYjB9t","lViBvlweGy","JIqXizHF1q","lViBvlViBv",
+"RmDcrSmGzv","jtn0XJKWYR","OUYuFAIYUu","FNYIMHzZT8","SjskQSs0Zu","ciuWzjtn0X","fLNg8sx5Gl","J2mQi9iGoT","FwEJzpWiOs","zmLYD0YAGH",
+"lsQGo5Namm","MezSWReKEW","ZhwG1TCgPp","ni2v114FLR","gf8rIs7Mxk","3weIFFVMxo","KZamHatef2","gjUTuOz8yZ","5ZaEzrhl0J","okgRisqVrf",
+"o8UydX6Pin","atef2W7cTs","Cp3mZRkQke","XflUqSWfou","5NammU3yw5","HfyNQWaim6","iqv4koVQp6","07n1crhl0J","pv0i7QWxoT","ZzJHWAIYUu",
+"hE1QlGXdoH","gjUTuUl4a1","MmsIoM6qcG","POUYSnnP8o","h1zcHzqH0W","t98iWEOE1o","QYxC0s4786","GSQwjoQ87r","yvOMIWPmlx","uQIczpWiOs",
+"RmDcr4QMc9","zbIYYciuWz","suY4xVIlwP","HfyNQOHaBz","In3NSoGu6x","0ao3lfaHir","MojnPuvf7A","JXljWMmKGJ","pvgjSNo0Qb","EoToP8FmFH",
+"UmaEva00b5","CK5W7a00b5","2NslmFVMxo","S2DfuLewvM","48cHLk85Ae","SmGzviwzGk","7ku1pZJTXH","jiVBPTXQ0Z","L7cGcRpBQm","CqqaDe6e4z",
+"Vprf2DLhzM","v8yFN2DREs","tlILtFPfSE","uoStwThjNn","uupzkjiVBP","i3pydDcpWB","0MR5XG1RhS","lpF6WogLgc","OUqFMJRJQB","gIYvE8FmFH",
+"qaofNHP433","GSQwj7fsYM","ksJby9iGoT","lm0pDPOUYS","HlUbFQnJ1S","brhlQJkzUn","GSQwjTa8f6","uJScXCqqaD","07n1cJKWYR","ciuWzPb1pa",
+"5VZjSuPX7G","5ZaEzMmsIo","BbwgALbRTH","gjUTuTXQ0Z","xXTI4QChxs","7X3uytjQxs","aDGtSKsjRK","C2Irc7lUXZ","580YDVNCPd","Yw2oU5nmWv",
+"RsQUq580YD","VjCZqiKqhr","sqVrfwDajX","580YDlsQGo","1j5L8ulk41","IBe8kP6bcg","oQ87rt59lR","SjskQni2v1","7fKYUOxWIH","7X3uyNcICA",
+"euZA59iGoT","AOgEefaHir","LDk6fCqqaD","QWxoTzmLYD","n1pmOgjUTu","tl72WEoToP","FNYIMFGzgp","yvOMIgdQsS","RmDcr1LB1L","ni2v15drc6",
+"prNT648cHL","SmGzv1v5hH","jS1aj2DREs","S77LHpvgjS","RpBQmReKEW","v8yFNlweGy","gjUTuQbxXc","Uvlv4VLTy6","P6bcgpiJSk","v8yFNuvf7A",
+"uZPqgS77LH","ReKEWtl72W","hE1QlRBhp0","lCMxylH1kt","uAWypHRxd8","Zv7z0b29RJ","nFqiktvdkD","5Mg9rKASQ8","Yf2EcQClRL","No0QbVBjhz",
+"GWqqXrKDLJ","nnP8oIBe8k","Ss0Zu5iGN5","l83UdRxrsm","2DREs9y4lw","KsjRKDz1R3","uLtKsqaofN","yofH3d85a9","RzaZA0h1b1","x3LDeW7cTs",
+"14FLR0h1b1","BCxeCHRxd8","lXFOBuN6r3","piJSkFPfSE","MaJQslpF6W","ni2v1TCgPp","RpBQmDG4sT","WmadA0h1b1","QbxXc5drc6","Y1mC0POUYS",
+"StlDJ3weIF","ThjNncmXIX","5ZaEzyluBx","vOqCEIn3NS","h1zcHiKqhr","Gv3FqAgJHQ","s47860ao3l","hE1Ql6q6L9","LewvMru4UG","uupzklm0pD",
+"tlILtgjUTu","G1RhSM6qcG","FFDuijzUqR","8hJdtuQIcz","PYBf4SjskQ","aez9yprNT6","dmoS7GSQwj","JIqXirz7Ut","lweGy5iGN5","CqqaDv8yFN",
+"cShY2Q6Lix","Yw2oUZhwG1","jSjS3VNCPd","pAhR1jSjS3","C2Irc9XyT9","ThjNnDLhzM","QWxoTAIYUu","sqVrfdmoS7","64s8NSjskQ","e6e4ztvdkD",
+"fLNg8OUYuF","dmoS78xEKz","MaJQsuoStw","Fhtgl9iGoT","y94nwuJScX","WaWsvDG4sT","jzUqRMm8si","NcICAJXljW","CxVEf2Nslm","qUJMd2DREs",
+"Zv7z0NhXdu","wDajXuoStw","hE1QlSWfou","i7WMQdjsrv","QYxC0e6e4z","VIlwPRzaZA","FPfSEazIWp","MojnP3otm6","iB08lXyPZN","Gv3FqQworu",
+"kB5nPVBjhz","MK07YGv3Fq","sqVrfQ6hMC","cShY2n1pmO","4QMc9qUJMd","tuDySB3qem","BpYhVJIqXi","Mkgy845cIH","uJScX0BmCy","suY4xk85Ae",
+"iKqhrpT8wu","WmadArKDLJ","X6PinStlDJ","0PktImX2GE","jfREu8TxD7","wiHrZ4QMc9","VerEAatef2","I7p2auZPqg","jS1ajtjQxs","DLhzMn1pmO",
+"RACujECMvU","HfyNQFLsph","bgJAzDcpWB","m4bxU8U2nU","HfyNQK4GS8","Mkgy848cHL","9eoRc9iGoT","l83UdDz1R3","aFFssx3LDe","9GXkXyluBx",
+"BpYhVaFFss","FjHXRvkCHH","lweGykZANm","Ul4a17lUXZ","Ta8f6Yf2Ec","xciqppmeCd","Waim6cL0aE","xciqppWiOs","4QMc9cL0aE","iKqhrlpF6W",
+"ECMvUOHaBz","BbwgAL7cGc","ZzJHWblLA9","euZA5XyPZN","FLsphJKWYR","8FmFHQssNC","fLNg8Mm8si","WMiS3h1zcH","5Mg9rW3VFH","WPmlx6q6L9",
+"MGlTFXyPZN","blLA9VBjhz","ZJTXHuPX7G","TwanoX6Pin","8TxD7ECMvU","prNT6cQOnv","blLA9XflUq","M3zXLn1pmO","B3qemQYxC0","t59lR1j5L8",
+"Uvlv40YAGH","uoStwiB08l","ksJbyv2eC3","4QMc95nmWv","x3LDeRkQke","2TRI7BGaQY","LewvM9XyT9","1LB1LMkgy8","oGu6x0BmCy","QnJ1SqQxHP",
+"64s8NNAFuw","nFqik7lUXZ","KZamHxReec","45cIHdhSuH","tjQxsoQ87r","JIqXioGu6x","kZANm7Ow5C","StlDJKZamH","uQIczCfgr3","FxX9qF6PT2",
+"M3zXLRmDcr","hE1QlX6Pin","POUYSQChxs","C2IrcLbRTH","CqqaDAIYUu","wiHrZNcICA","VjCZqZJTXH","hSSvQlsQGo","pvgjSzFgtB","5Namm1j5L8",
+"QssNCo8Uyd","ZuDtDuPX7G","Cp3mZ0PktI","EoToPxReec","9GXkXd85a9","blLA95iGN5","5nmWv7X3uy","hUTw72hEEU","vkCHHQYxC0","8hJdtiKqhr",
+"MmsIoix74r","LDk6fTCgPp","bZLvSzz4ZU","CIShGVLTy6","Ta8f6OxWIH","F6PT2vLsmS","he9IAD6rBy","0PktIyEfy9","BpYhVnFqik","suY4xM6qcG",
+"IRh48lXFOB","yEfy99iGoT","fqypyv8yFN","AXpwE5nmWv","d85a9RsQUq","lm0pD0YAGH","AmdQdfLNg8","ru4UG24ARF","uLtKspT8wu","45cIHcShY2",
+"HRxd8NOHsz","0PktIfmIK1","J2mQi7fsYM","VIlwPvkCHH","b29RJdhSuH","64s8Nn1pmO","qUJMdhYBCK","v1HlnvOqCE","TXQ0ZMK07Y","24ARFzY1GY",
+"yToGWJKWYR","BFkb8prNT6","jiVBPrz7Ut","lpF6WMGlTF","HzZT8tlILt","s93MlD6rBy","ulk41OUqFM","s47869rlg9","K20wKkB5nP","5Drn0VNCPd",
+"1j5L8v1Hln","i7WMQ07n1c","QYxC0Yw2oU","0KyfsMGlTF","I7p2a0ao3l","i3pydbrhlQ","wDajXECMvU","n1pmOJKWYR","VIlwPQClRL","FVMxoFxX9q",
+"zY1GYGSQwj","RkQke2Yz7E","X6PinzmLYD","U3yw59rlg9","VNCPdKZamH","3weIFNxx9V","uAWyp16lHc","5NammBbwgA","taOXKMaJQs","64s8Nsx5Gl",
+"pAhR1ECMvU","n1pmO4W0Tl","M6qcGmz8gx","ECMvUlkMUA","ogLgciwzGk","5Drn0WreyP","lkMUAydG8U","pFrrlVIlwP","ru4UG5VZjS","JXljW1LB1L",
+"Chuy3OUYuF","2TRI7Twano","L7cGcpiJSk","AgJHQlXFOB","JXljW2hEEU","MmKGJuZPqg","lj07Qdpe1v","ZJTXHTa8f6","wDajXMaJQs","xReec0BmCy",
+"rKDLJWmadA","3weIFK4GS8","QWxoTx3LDe","m4bxUzHF1q","uTacx2hEEU","zY1GYciuWz","5ZaEz9rlg9","RACujk85Ae","MmKGJ7hyVv","RmDcrtvdkD",
+"tAOsrHlUbF","9iGoT3otm6","yToGWuPX7G","tAOsrDLhzM","Zv7z0bZLvS","d85a9yEfy9","JkzUnciuWz","mX2GE1v5hH","7lUXZ8TxD7","uoStwLbRTH",
+"AmdQd7lUXZ","dmoS7yvOMI","dmoS7OHaBz","uLtKsaFFss","t59lRS77LH","xReecogLgc","he9IAChuy3","fmIK1tlILt","tuDySZ4I1v","2DREsuoStw",
+"AIYUuHzZT8","fLNg8iB08l","CNHmvQnJ1S","0h1b1a00b5","XflUq3otm6","QbxXcSjskQ","1LB1Ly94nw","atef2QWxoT","jtn0X5IhmG","EdBKcTXQ0Z",
+"gIYvELDk6f","DG4sTVLTy6","GWqqXiqv4k","s7Mxks93Ml","pWiOsydG8U","atef2euZA5","sqVrf9rlg9","ulk41yToGW","2Yz7E0Kyfs","14FLRLewvM",
+"8FmFHsoy9t","5Drn0GWqqX","MK07Yn1pmO","djsrvazIWp","ksJbyMezSW","zbIYYpT8wu","vOqCEaDGtS","K20wKHP433","VerEATXQ0Z","qaofNHlUbF",
+"0PktIFVMxo","3otm61j5L8","CIShGAOgEe","VIlwPv1Hln","bZLvSyofH3","CqqaDksJby","zqH0WiKqhr","7fsYMSbRYy","qaofNAmdQd","n8pJ9zbIYY",
+"yToGWs7Mxk","v2eC307n1c","JJs5maL6AJ","2ZHdkwDajX","ZUnqtt59lR","lj07Q0PktI","Q6LixjS1aj","lCMxyUvlv4","jSjS3UmaEv","9GXkXy94nw",
+"BCxeCZUnqt","7lUXZrz7Ut","fcwDauoStw","Kr8ysTCgPp","sqVrfpT8wu","NAFuwNAFuw","ZzJHW0PktI","48cHLnnP8o","xReecsuY4x","lj07QRpBQm",
+"atef2ZUnqt","jzUqRHP433","x3LDebgJAz","RmDcr64s8N","No0QbRzaZA","ksJbyX6Pin","vLsmS2hEEU","Uvlv4gjUTu","iB08lLbRTH","gtCA5KZamH",
+"d85a9vOqCE","sx5GlvkCHH","OxWIHtAOsr","rhl0J7fKYU","WMiS3Cfgr3","M6qcGuoStw","S2Dfu7fsYM","CxVEfi3pyd","zY1GYGv3Fq","POUYSFxX9q",
+"SbRYys7Mxk","7fKYU3otm6","uZPqgksJby","Ta8f6b29RJ","2Yz7ETwano","8U2nUtaOXK","qaofNs4786","FFDuizqH0W","TXQ0Ze6e4z","JRJQBuJScX",
+"PYBf4faHir","Uvlv4vLsmS","suY4xIRh48","JJs5mcQOnv","RBhp0he9IA","oVQp69XyT9","piJSkB3qem","ThjNnbrhlQ","kB5nPsuY4x","nlaByRsQUq",
+"14FLRt98iW","0YAGH4dEz6","LbRTHD6rBy","D6rByVBjhz","tjQxsfmIK1","gtCA5W7cTs","W7cTsLewvM","sqVrfzFgtB","fLNg8faHir","sx5Gls93Ml",
+"yluBxvOqCE","s93MlF6PT2","RkQke3weIF","gIYvEtuDyS","AkKTklm0pD","VLTy6uPX7G","FjHXRgdQsS","24ARFzQt6Q","W7cTs8U2nU","3weIFsoy9t",
+"HzZT8tuDyS","AkKTk580YD","ydG8UuLtKs","F6PT2Fhtgl","MGlTFY1mC0","dpe1vlH1kt","Cp3mZiqv4k","okgRiOHaBz","0PktIUl4a1","SbRYyUvlv4",
+"7lUXZrhl0J","0KyfsyluBx","8xEKz5ZaEz","7fKYUVprf2","YjB9tzFgtB","Mm8sik85Ae","VIlwPM6qcG","oVQp6Nxx9V","NOHszZJTXH","0PktIJ2mQi",
+"n8pJ9Mkgy8","Q6hMCprNT6","h1zcHk85Ae","M6qcGL7cGc","uZPqguQIcz","LewvMciuWz","v2eC3S77LH","0ao3lOHaBz","uPX7GWDVWJ","K4GS8uQIcz",
+"aL6AJFnPFB","NOHszKr8ys","dmoS7CqqaD","Mkgy8Zv7z0","s4786o8Uyd","Q6hMC7X3uy","uvf7ABCxeC","8RCUAtAOsr","RmDcriKqhr","lpF6WgIYvE",
+"8hJdttaOXK","QYxC0618Di","CxVEfgtCA5","atef2uPX7G","ThjNnksJby","7lUXZJ2mQi","DLhzMi3pyd","L7cGcDz1R3","uLtKsm4bxU","FFDuilCMxy",
+"s7Mxk9XyT9","ThjNnRsQUq","HzZT87fKYU","JRJQB5Namm","Z4I1vG1RhS","yToGW580YD","07n1cLbRTH","8xEKz0Wr5y","kB5nP5drc6","0h1b1uZPqg",
+"SmGzvLDk6f","ru4UGtaOXK","uJScX24ARF","b29RJyToGW","M6qcGo8Uyd","AOgEeWaim6","uLtKs55rfB","uJScXiwzGk","hSSvQh1zcH","M6qcGulk41",
+"bZLvSQChxs","jiVBPQYxC0","xReec0Kyfs","suY4xNcICA","JIqXiMmKGJ","OHaBz1j5L8","8TxD75drc6","k85AeRxrsm","7ku1pTCgPp","yToGWBGaQY",
+"QChxslViBv","aL6AJ4dEz6","HP433Qworu","ThjNnjSjS3","CdyBVpv0i7","xReecFxX9q","AgJHQ7fsYM","KASQ8FPfSE","RkQked7vjM","MaJQsfFDrJ",
+"soy9tMmKGJ","jtn0XDLhzM","QssNCUmaEv","tjQxsa00b5","rKDLJfaHir","FwEJzjfREu","I7p2afaHir","JXljWzbIYY","I7p2a8FmFH","POUYSOUqFM",
+"MmsIoBbwgA","oGu6xHzZT8","MGlTFxReec","WMiS3AXpwE","piJSksqVrf","7fsYMqUJMd","2ZHdkVLTy6","pFrrljS1aj","mz8gxlweGy","QnJ1Srz7Ut",
+"UmaEvVprf2","OxWIHSWfou","5drc60ao3l","JJs5m3weIF","pT8wujfREu","qaofNuupzk","hi5X77fsYM","8xEKztjQxs","guMb8Y1mC0","zFgtB0BmCy",
+"pFrrli7WMQ","yluBxcQOnv","hi5X7CdyBV","5ZaEzoVQp6","2Yz7Emz8gx","P6bcgiB08l","FcWrWHzZT8","SWfouulk41","aDGtSM6qcG","faHir7X3uy",
+"Dz1R314FLR","2ZHdkjSjS3","Nxx9VMK07Y","UlU3MNxx9V","qUJMdHRxd8","QChxsIn3NS","FVMxo7X3uy","OUqFMb29RJ","EoToP5drc6","CdyBVRzaZA",
+"4W0TlyvOMI","jSjS3OHaBz","C2IrcCp3mZ","n8pJ9yToGW","aFFssThjNn","dhSuH4dEz6","Ss0Zuhe9IA","pWiOsY1mC0","In3NS5nmWv","DcpWBzQt6Q",
+"ulk41Fhtgl","ZhwG1BGaQY","MK07YWDVWJ","blLA9QYxC0","uoStw29QAz","7ku1pFVMxo","Kr8yscQOnv","4dEz6MojnP","48cHL2Yz7E","nnP8ogf8rI",
+"0PktIFjHXR","FnPFB4dEz6","faHirZhwG1","JKWYR2TRI7","GWqqXJKWYR","yvOMItAOsr","AIYUuMmsIo","bZLvS7fKYU","0KyfsVprf2","lCMxyi7WMQ",
+"dQ586pFrrl","dpe1vQYxC0","CqqaDYf2Ec","2Yz7EECMvU","MojnPk85Ae","RzaZA14FLR","7hyVvBbwgA","Ta8f6ogLgc","pv0i7P6bcg","dpe1va00b5",
+"EdBKcuZPqg","8xEKzBFkb8","D6rByzbIYY","FhtglOUqFM","KsjRKuTacx","JkzUnsqVrf","Yw2oUm4bxU","ksJbyqaofN","vkCHHlpF6W","JkzUnxXTI4",
+"t98iWK20wK","VIlwP5ZaEz","5ZaEzgf8rI","nlaByuZPqg","uTacxuupzk","EoToPYOfrY","CqqaDJXljW","a00b59rlg9","y94nwgf8rI","v8yFNSjskQ",
+"1LB1LKr8ys","WDVWJFnPFB","AOgEepT8wu","RACujoVQp6","0ao3l8FmFH","5Mg9ruoStw","lViBvQ6Lix","mz8gxMmsIo","uLtKsFnPFB","IKxdLL7cGc",
+"lm0pDRxrsm","7fKYUPb1pa","uLtKsni2v1","jeskSlH1kt","Y1mC0WmadA","piJSki3pyd","zmLYD5drc6","RsQUqeuZA5","AOgEeKr8ys","WaWsvQYxC0",
+"XflUqy94nw","fLNg8zmLYD","Zv7z0he9IA","8TxD7WaWsv","Q6hMCuZPqg","aFFssiKqhr","8FmFHW7cTs","9XyT9fcJOy","Rxrsml83Ud","PYBf44QMc9",
+"24ARFlpF6W","Cp3mZjS1aj","6AFT0HP433","uZPqgNo0Qb","9GXkXRsQUq","fcwDaVLTy6","cL0aENOHsz","GrDg74W0Tl","QClRL07n1c","TCgPpQworu",
+"MK07YDz1R3","vkCHHlj07Q","aez9ygjUTu","Uvlv4faHir","suY4x5ZaEz","nlaByi3pyd","Cfgr3Zv7z0","oVQp6Oz8yZ","6AFT0EoToP","7Ow5CZuDtD",
+"rKDLJS77LH","CqqaDoGu6x","RpBQmyToGW","K20wK5iGN5","iKqhr2hEEU","azIWpprNT6","hUTw7KZamH","0BmCy7X3uy","k85Ae1LB1L","ni2v1QChxs",
+"8xEKzxXTI4","WmadAlViBv","9rlg9tAOsr","WMiS3uLtKs","16lHcaez9y","zFgtBRACuj","2NslmgjUTu","uZPqgiqv4k","IjTwPM6qcG","uoStwiqv4k",
+"s4786NhXdu","DcpWBfmIK1","HlUbFJXljW","M3zXLpT8wu","rhl0JprNT6","HzZT89y4lw","5Drn0ydG8U","lpF6WRpBQm","618DiFhtgl","zz4ZU2TRI7",
+"fcJOy48cHL","JKWYRCfgr3","QnJ1SUlU3M","FjHXR0PktI","StlDJcL0aE","CNHmvy94nw","NcICAlm0pD","In3NSlweGy","45cIHL7cGc","XflUqprNT6",
+"RkQketjQxs","gdQsSzY1GY","Q6hMCcShY2","BpYhVlpF6W","lkMUA618Di","v8yFNAgJHQ","yvOMI5IhmG","LbRTHRBhp0","nlaByStlDJ","yToGWuN6r3",
+"StlDJpmeCd","uZPqguZPqg","FFDuiMojnP","S2DfuiKqhr","Rxrsm7X3uy","jfREubZLvS","MojnPVprf2","wDajXHP433","Ss0ZuThjNn","kZANmCxVEf",
+"pT8wuRzaZA","ZuDtDhE1Ql","Z4I1v5IhmG","yToGWFNYIM","LewvMprNT6","64s8NrKDLJ","Cfgr3xciqp","hYBCK14FLR","6q6L9Uvlv4","CdyBVBFkb8",
+"IjTwP7X3uy","cL0aEuQIcz","S77LH48cHL","C2IrcazIWp","rKDLJYw2oU","uJScXZuDtD","EOE1oM6qcG","MojnP5VZjS","4W0TldmoS7","WMiS3CqqaD",
+"gdQsSRpBQm","9GXkXlm0pD","yvOMIxXTI4","5iGN5P6bcg","RpBQmY1mC0","FhtglFjHXR","5Drn0pAhR1","CK5W7lXFOB","VLTy6iwzGk","ZJTXHHP433",
+"9rlg9pv0i7","8RCUAJXljW","VIlwPOz8yZ","Cp3mZni2v1","5ZaEzm4bxU","nFqiks4786","2NslmQ6Lix","NhXduB3qem","yofH3zz4ZU","NAFuw45cIH",
+"CxVEfFnPFB","0YAGH29QAz","i3pydWPmlx","HlUbFlCMxy","64s8N3otm6","FGzgph1zcH","Z4I1vUl4a1","14FLRfmIK1","Dz1R329QAz","KASQ8WPmlx",
+"uZPqgdQ586","lm0pDP6bcg","MmKGJCK5W7","k85Ae8hJdt","W7cTsVjCZq","LewvMB3qem","lpF6WuN6r3","nnP8opmeCd","lpF6Wdjsrv","mX2GENo0Qb",
+"taOXK7hyVv","NAFuwVBjhz","Zv7z0WPmlx","qUJMdWaim6","y94nwLDk6f","VIlwPxReec","SjskQm4bxU","rhl0JhE1Ql","OUYuFZuDtD","Mkgy8JXljW",
+"16lHcrhl0J","DQimpgtCA5","IjTwPaL6AJ","Vprf2euZA5","zHF1qFhtgl","zHF1qQ6hMC","LbRTHpFrrl","FcWrWECMvU","lm0pDtaOXK","hE1Ql8RCUA",
+"iwzGkSmGzv","dhSuHlXFOB","I7p2aWPmlx","lkMUAO3iyQ","HP433tjQxs","fcwDacL0aE","kZANmlweGy","WDVWJ7fKYU","6q6L9lH1kt","kZANms93Ml",
+"IBe8kkZANm","EdBKctlILt","M3zXLC2Irc","n8pJ92hEEU","tl72Wulk41","zbIYYyvOMI","bgJAzBFkb8","Vprf2CK5W7","5VZjSEOE1o","5nmWv4W0Tl",
+"jSjS3i7WMQ","dQ586mz8gx","atef28TxD7","vLsmSaL6AJ","o8UydvLsmS","SbRYyDz1R3","uTacxWMiS3","ZzJHWMkgy8","LbRTHfqypy","yEfy9jiVBP",
+"jeskSPYBf4","5Mg9rlkMUA","uvf7A5Drn0","BGaQYFjHXR","iKqhrrKDLJ","jSjS3Gv3Fq","JIqXiHP433","WaWsv6q6L9","zFgtBuPX7G","HzZT8XflUq",
+"2DREsHlUbF","s93MljeskS","mz8gxkB5nP","Waim6HzZT8","7fKYUoVQp6","4QMc9S77LH","FcWrWW7cTs","3otm6BFkb8","NhXduaFFss","hYBCK9GXkX",
+"0BmCyMGlTF","OUqFMoGu6x","RBhp07ku1p","1LB1Latef2","nlaByS2Dfu","I7p2aXflUq","IjTwPv1Hln","okgRiWaWsv","0h1b1wiHrZ","ECMvUAIYUu",
+"POUYSDQimp","2TRI7Kr8ys","gdQsSk85Ae","pv0i7b29RJ","55rfBoQ87r","zY1GYReKEW","hi5X7GrDg7","KZamHMmsIo","oGu6xEOE1o","lViBvZuDtD",
+"h1zcH5Namm","7ku1pHzZT8","QWxoTguMb8","jSjS3uPX7G","Ss0ZuxXTI4","Yw2oUMm8si","wDajXeuZA5","tvdkDbZLvS","IjTwPpvgjS","i7WMQWDVWJ",
+"HzZT8HP433","qQxHPhE1Ql","5ZaEzReKEW","BFkb8RkQke","jtn0XBFkb8","b29RJyofH3","0BmCydmoS7","gf8rIIjTwP","bgJAzIKxdL","uZPqgS2Dfu",
+"6AFT0sqVrf","hE1QlRsQUq","dhSuHzHF1q","FjHXRBpYhV","oGu6xvLsmS","hSSvQdQ586","zY1GYK4GS8","Ss0Zuxciqp","FFDuiVprf2","uJScXs93Ml",
+"No0QbjfREu","8cVD3Pb1pa","oVQp6rhl0J","5Drn0AXpwE","AXpwElsQGo","FPfSEW7cTs","Kr8ysI7p2a","5nmWv7Ow5C","TCgPp5drc6","EoToPjtn0X",
+"zmLYDK4GS8","3weIFKsjRK","Ss0ZuguMb8","pmeCdRBhp0","AmdQdHRxd8","VIlwPzY1GY","FwEJzuLtKs","lpF6WS2Dfu","GWqqXKASQ8","prNT6FcWrW",
+"5iGN5d85a9","7hyVvQChxs","Cp3mZazIWp","uTacxCK5W7","Cfgr3fLNg8","nFqik5IhmG","Uvlv4soy9t","dmoS7ReKEW","HlUbFoGu6x","9eoRcuJScX",
+"IRh48ksJby","QnJ1S5ZaEz","lViBv2hEEU","3otm6C2Irc","ZzJHW5IhmG","iqv4kl83Ud","KZamHECMvU","5drc6xciqp","lH1ktb29RJ","qaofND6rBy",
+"ZUnqtHlUbF","oVQp6gIYvE","O3iyQPb1pa","9iGoTKr8ys","sx5Gl0YAGH","CK5W7AkKTk","XyPZNDz1R3","SmGzv14FLR","jS1ajVLTy6","djsrvAXpwE",
+"Cp3mZAmdQd","KsjRKVerEA","zFgtBd85a9","uPX7GlkMUA","lXFOBtlILt","9GXkXrz7Ut","SjskQRmDcr","IRh480MR5X","DG4sTTa8f6","Pb1paa00b5",
+"SjskQZUnqt","CK5W7i3pyd","mz8gxP6bcg","VjCZqCK5W7","zz4ZUvkCHH","uPX7G8FmFH","nFqikWreyP","i7WMQ14FLR","7X3uygdQsS","lsQGo4dEz6",
+"vkCHHLbRTH","mX2GEdQ586","fcJOybZLvS","RpBQmuLtKs","OUqFMzQt6Q","GWqqX8TxD7","SbRYyxReec","x3LDeP6bcg","taOXKHfyNQ","SjskQFVMxo",
+"vkCHHgjUTu","LewvMOUqFM","MezSWStlDJ","BbwgAWmadA","iwzGk9rlg9","CNHmvpWiOs","nlaBy7ku1p","Cfgr3K20wK","Ul4a1ZuDtD","x3LDeuLtKs",
+"pWiOsjeskS","SWfouJIqXi","RsQUqiB08l","Gv3FqAXpwE","hYBCKQssNC","WMiS3wDajX","NhXdut98iW","0Wr5yzHF1q","YjB9to8Uyd","MaJQsIRh48",
+"W7cTsbZLvS","t98iWRsQUq","2DREsHRxd8","iKqhrulk41","okgRijeskS","OUqFMoQ87r","L7cGcYh1hF","9XyT9HP433","FPfSEGrDg7","YOfrYYw2oU",
+"POUYSZuDtD","o8UydtvdkD","FGzgpNhXdu","VjCZqksJby","s47868RCUA","ZhwG19eoRc","okgRiPOUYS","Q6hMCTXQ0Z","gtCA5tAOsr","1v5hHwiHrZ",
+"uoStwix74r","ksJbyjS1aj","gdQsSJRJQB","cShY207n1c","QChxsM3zXL","QnJ1S0Kyfs","e6e4zpvgjS","B3qemP6bcg","IKxdL5iGN5","K4GS8QWxoT",
+"jfREuFGzgp","B3qem1v5hH","kB5nPDcpWB","ydG8U0ao3l","AgJHQVerEA","o8Uyd7lUXZ","CK5W7ZJTXH","lkMUAMkgy8","FcWrWUvlv4","uvf7AGXdoH",
+"7ku1pXyPZN","SmGzvOz8yZ","3weIFiB08l","aDGtSMmKGJ","blLA9he9IA","lpF6W5drc6","QYxC0DLhzM","iwzGkyluBx","okgRihi5X7","NOHszDG4sT",
+"RxrsmWaim6","uN6r3NcICA","jeskSZ4I1v","JkzUnxReec","Vprf2SjskQ","suY4xCNHmv","EdBKcoGu6x","WDVWJyluBx","C2Irc1v5hH","4QMc9BFkb8",
+"RkQkeMGlTF","9XyT9ydG8U","v2eC3Ul4a1","AkKTk5Namm","AkKTkReKEW","t98iW7ku1p","ksJbylkMUA","JXljWiqv4k","uoStw7fKYU","AIYUuCfgr3",
+"45cIHJIqXi","cL0aEiqv4k","Z4I1vfmIK1","9GXkXFcWrW","TwanoHfyNQ","RACujG1RhS","RACujRxrsm","i7WMQjeskS","o8Uyd5Namm","Z4I1vMm8si",
+"atef2Cp3mZ","uJScXlXFOB","1j5L8IRh48","PYBf4Ul4a1","Waim6tvdkD","x3LDeRmDcr","djsrvAmdQd","yEfy96AFT0","KZamH3weIF","Uvlv4CIShG",
+"Yw2oUhUTw7","Z4I1vUvlv4","hYBCKRkQke","k85AezqH0W","M6qcGvLsmS","JRJQBJKWYR","xReecLDk6f","CdyBVZv7z0","hYBCK55rfB","8cVD3K20wK",
+"KsjRK3weIF","bZLvSoVQp6","HzZT8zz4ZU","OUqFMHfyNQ","8FmFHdjsrv","zQt6Q9y4lw","RBhp0EOE1o","0Wr5yy94nw","NcICA9GXkX","XyPZNReKEW",
+"rKDLJ5Namm","9y4lwFNYIM","Chuy3cL0aE","ZUnqtlkMUA","OUqFMxciqp","lH1ktAgJHQ","JJs5mFnPFB","lCMxynnP8o","0BmCyi7WMQ","iqv4khE1Ql",
+"OUqFM7fsYM","M3zXLS77LH","t59lRiqv4k","gtCA5cmXIX","Ta8f60MR5X","v1HlngjUTu","AgJHQKr8ys","7X3uy4dEz6","HlUbFCqqaD","MmsIoyofH3",
+"n8pJ98FmFH","PYBf4JKWYR","uvf7AQClRL","1v5hH0PktI","lj07QNo0Qb","HRxd8WmadA","MezSWpiJSk","RxrsmAXpwE","MaJQsoVQp6","oQ87ro8Uyd",
+"AmdQdFnPFB","fcwDapvgjS","DcpWBKsjRK","lweGyHzZT8","ZuDtDyofH3","ThjNnNhXdu","oQ87ryEfy9","ix74rciuWz","Waim64QMc9","StlDJuJScX",
+"Q6hMCoVQp6","8FmFHh1zcH","J2mQiaFFss","gf8rIMmKGJ","9eoRcQWxoT","5nmWv16lHc","LbRTHOHaBz","o8UydFLsph","d7vjMCK5W7","i7WMQix74r",
+"NhXduulk41","29QAzjfREu","pAhR1BCxeC","NAFuwfcwDa","rhl0J1LB1L","6AFT0zHF1q","kZANmXyPZN","580YDd7vjM","5ZaEzd85a9","Q6LixRmDcr",
+"v1Hln45cIH","cQOnvydG8U","TXQ0ZMojnP","guMb85IhmG","5drc6DcpWB","uN6r3LewvM","8U2nUokgRi","JJs5mgjUTu","HP433Nxx9V","lkMUAYjB9t",
+"ulk41uJScX","2DREsEdBKc","euZA5YjB9t","uZPqgkB5nP","HlUbFv1Hln","blLA9hi5X7","uoStwQbxXc","5nmWvRACuj","k85AeYh1hF","AOgEeHzZT8",
+"7lUXZa00b5","AgJHQOUYuF","yEfy90YAGH","kB5nPVjCZq","MmsIo8TxD7","Yh1hFVBjhz","Yw2oUQWxoT","lsQGo2DREs","TCgPpWreyP","i3pydJJs5m",
+"UmaEvGSQwj","Yf2Ec9eoRc","zQt6Qlm0pD","WreyPBbwgA","CqqaDY1mC0","ni2v12Yz7E","J2mQiDLhzM","fcwDa7ku1p","WmadAMmKGJ","QYxC07X3uy",
+"lsQGoZzJHW","uTacxtlILt","dhSuHZUnqt","9XyT97X3uy","zqH0WMm8si","pFrrlhe9IA","WmadApvgjS","ZzJHWaFFss","suY4xYh1hF","RsQUqi3pyd",
+"ECMvUdpe1v","cmXIX2TRI7","m4bxUsqVrf","5Nammv8yFN","Mm8sie6e4z","Yh1hFMkgy8","StlDJlXFOB","zqH0WSjskQ","JJs5mogLgc","MmsIoPb1pa",
+"zz4ZUrKDLJ","lj07QIn3NS","d7vjMiqv4k","fLNg86AFT0","Ul4a1cmXIX","2hEEUuupzk","FGzgpZJTXH","8cVD3dpe1v","4W0TluZPqg","atef27ku1p",
+"xciqpJkzUn","X6PinyToGW","Gv3FqazIWp","L7cGcLbRTH","IRh48iwzGk","JkzUnTXQ0Z","zqH0Wm4bxU","WPmlxCK5W7","HP433k85Ae","oQ87rpmeCd",
+"CK5W7lj07Q","0ao3lprNT6","iKqhrThjNn","0PktIK4GS8","IjTwPvkCHH","hYBCKtlILt","pvgjSGSQwj","AIYUuQworu","5ZaEztl72W","Ss0ZuUlU3M",
+"Pb1payToGW","pT8wutl72W","pFrrlpWiOs","3weIF7ku1p","No0QbkB5nP","Mm8sikB5nP","SbRYylweGy","vLsmSzz4ZU","QClRLWmadA","ni2v1P6bcg",
+"ECMvUhi5X7","dhSuHF6PT2","C2IrcW7cTs","k85Aelj07Q","RzaZA1LB1L","YjB9t16lHc","dpe1vtl72W","Yw2oURkQke","cQOnvwiHrZ","ZuDtDDLhzM",
+"ThjNn7fKYU","FjHXRRxrsm","0ao3lzY1GY","CK5W7VNCPd","CdyBVMK07Y","KZamH16lHc","zQt6Ql83Ud","DLhzMWDVWJ","zz4ZUS77LH","WreyPaL6AJ",
+"Q6hMCbrhlQ","jfREuQ6Lix","5nmWviKqhr","Ta8f6WmadA","D6rBy0YAGH","5Mg9rQYxC0","nlaByFjHXR","bZLvS5Mg9r","zY1GYpWiOs","s7MxkP6bcg",
+"StlDJ8U2nU","suY4xdhSuH","FcWrWzQt6Q","MmKGJ7fKYU","xReecuPX7G","guMb8uJScX","RzaZAt98iW","faHirVjCZq","BpYhVNAFuw","Yh1hFdhSuH",
+"HzZT8uPX7G","Q6LixXyPZN","h1zcH8TxD7","2TRI745cIH","ReKEWhi5X7","s47868cVD3","b29RJ5ZaEz","QYxC09eoRc","HlUbFZzJHW","ksJbylXFOB",
+"AXpwEfmIK1","hYBCKWreyP","atef27fKYU","hYBCKCfgr3","uoStw14FLR","qQxHPqUJMd","rhl0J0MR5X","7ku1pQworu","1j5L8dQ586","CIShGi7WMQ",
+"5IhmGd7vjM","lXFOBjtn0X","StlDJgIYvE","gIYvEzmLYD","HzZT8GWqqX","IKxdLF6PT2","jSjS30Wr5y","D6rByRpBQm","pAhR1aL6AJ","hYBCKb29RJ",
+"MmKGJJkzUn","WMiS3FjHXR","FVMxogdQsS","jSjS3IjTwP","HlUbF16lHc","AIYUuaL6AJ","taOXKHRxd8","580YDPOUYS","5Mg9rzz4ZU","D6rByW7cTs",
+"DLhzM24ARF","580YDtl72W","pv0i7EOE1o","0ao3lo8Uyd","ZUnqtogLgc","uZPqgJRJQB","bgJAzFVMxo","jS1ajAIYUu","fqypy3weIF","JJs5mY1mC0",
+"ix74rMezSW","JIqXie6e4z","WDVWJlViBv","fcwDaQssNC","GSQwjulk41","qaofNWMiS3","VBjhzZUnqt","Uvlv4Uvlv4","9XyT9Oz8yZ","24ARFIKxdL",
+"55rfBQnJ1S","zqH0WK4GS8","pT8wuprNT6","oQ87rl83Ud","tl72WSs0Zu","VerEAAgJHQ","zFgtBzY1GY","zmLYDyofH3","FcWrW0YAGH","3weIFK20wK",
+"HzZT8uZPqg","FxX9qVjCZq","0ao3lAXpwE","zQt6QFwEJz","kZANmUmaEv","FNYIMJ2mQi","sqVrfm4bxU","vkCHHTCgPp","s93MllViBv","vOqCEwiHrZ",
+"Waim6v2eC3","5Mg9rKr8ys","FcWrWksJby","jeskSzbIYY","uoStwJIqXi","7fsYM29QAz","euZA5RmDcr","LbRTH3weIF","nlaByhi5X7","TXQ0ZMkgy8",
+"Yh1hF8U2nU","JJs5mS77LH","U3yw5n8pJ9","HRxd8580YD","POUYSWaim6","FNYIMgjUTu","0PktIa00b5","TCgPp5VZjS","JRJQBeuZA5","v1HlnoQ87r",
+"EoToPoQ87r","aL6AJQChxs","0Kyfsv1Hln","RmDcrv8yFN","FcWrWqQxHP","aez9yIRh48","24ARFuZPqg","SbRYyVIlwP","QYxC0he9IA","W7cTsWmadA",
+"29QAzn1pmO","ksJbyFVMxo","JkzUnOUYuF","lH1ktjeskS","uQIcz1LB1L","fLNg8VjCZq","iKqhrOHaBz","zqH0W0PktI","3otm6U3yw5","7X3uylkMUA",
+"55rfBQClRL","7hyVvQ6hMC","dpe1vpT8wu","okgRiSWfou","vLsmSLewvM","tuDySFxX9q","prNT6ThjNn","VjCZqRmDcr","WDVWJuvf7A","LewvM1j5L8",
+"8cVD3Cp3mZ","5nmWv0YAGH","QClRLCp3mZ","WmadAUvlv4","aFFssjSjS3","IBe8kS2Dfu","x3LDeQ6hMC","FPfSE580YD","bZLvSAkKTk","kB5nPCdyBV",
+"lkMUAThjNn","5Namm7X3uy","14FLR5VZjS","hE1QlDQimp","FnPFBuTacx","Yh1hFWMiS3","vLsmSVprf2","5VZjSjeskS","AmdQdQChxs","CdyBVWPmlx",
+"qQxHPGSQwj","atef2bgJAz","5VZjSvkCHH","Vprf2dmoS7","Yh1hFOxWIH","IBe8k2DREs","s4786Qworu","CqqaDNo0Qb","Mkgy8zHF1q","yEfy9WDVWJ",
+"lpF6W29QAz","7Ow5CWMiS3","9iGoTtaOXK","48cHLMGlTF","wiHrZUmaEv","O3iyQuQIcz","Cp3mZaDGtS","tlILtQClRL","RxrsmWMiS3","S77LHRpBQm",
+"RkQkeTa8f6","lpF6WSs0Zu","StlDJCdyBV","EoToPFVMxo","1LB1L0ao3l","POUYSb29RJ","YOfrYDcpWB","k85Ae0Wr5y","AIYUuRkQke","euZA57fKYU",
+"0PktItjQxs","5nmWvIBe8k","Oz8yZSmGzv","8FmFHi7WMQ","QworuCK5W7","HlUbFyEfy9","9y4lwd7vjM","zQt6Q07n1c","s4786jzUqR","brhlQPOUYS",
+"CK5W7VBjhz","atef2xReec","ZzJHWKr8ys","zbIYYVIlwP","QWxoTZ4I1v","QChxsLbRTH","In3NSjS1aj","bgJAzv8yFN","QWxoTBFkb8","yToGWcQOnv",
+"VIlwPn1pmO","hSSvQBCxeC","iB08l0BmCy","Cp3mZMK07Y","RmDcrguMb8","jfREuLDk6f","tAOsrjeskS","Z4I1vWMiS3","M6qcG0Wr5y","9rlg9o8Uyd",
+"9XyT9AXpwE","soy9tRzaZA","FhtglD6rBy","CIShGFxX9q","SmGzvPYBf4","lkMUAcShY2","16lHcyEfy9","soy9tWDVWJ","Mkgy8a00b5","suY4x0PktI",
+"HfyNQm4bxU","DG4sToGu6x","cShY2tuDyS","XyPZNMmsIo","wiHrZ4W0Tl","bgJAzKASQ8","cQOnvNcICA","9iGoT9iGoT","2TRI78hJdt","618DiGSQwj",
+"RzaZAlweGy","qUJMdgdQsS","zY1GYgdQsS","AIYUuhE1Ql","kZANm5ZaEz","AIYUu8xEKz","uJScXx3LDe","ni2v1qUJMd","SmGzvjtn0X","ZJTXH5iGN5",
+"ix74rxciqp","55rfBFGzgp","9rlg9IBe8k","2NslmKZamH","KZamHVerEA","s7Mxk5Namm","BbwgAdQ586","IKxdLFcWrW","v1HlnMkgy8","K20wK2Yz7E",
+"gdQsSxReec","OUqFM7hyVv","wDajX55rfB","ulk418U2nU","ydG8UAIYUu","uPX7G29QAz","580YDjS1aj","7fKYUIRh48","Cp3mZgjUTu","AIYUuYf2Ec",
+"NAFuwMK07Y","gdQsSdhSuH","0PktIlkMUA","580YDh1zcH","Cfgr3EdBKc","7X3uyUvlv4","618DizqH0W","LDk6f5iGN5","C2Ircb29RJ","lkMUA2Nslm",
+"0ao3lQbxXc","EdBKcqaofN","d85a92ZHdk","prNT6dmoS7","FxX9qzY1GY","CqqaDa00b5","zbIYYCdyBV","ReKEWZuDtD","QChxs9rlg9","i7WMQnlaBy",
+"MmsIoZ4I1v","2NslmKr8ys","W7cTsru4UG","hYBCKCqqaD","pvgjS8FmFH","blLA9fFDrJ","JJs5m3otm6","VLTy60Kyfs","jS1ajcShY2","SbRYy16lHc",
+"jS1ajvkCHH","uAWypBGaQY","lpF6WJIqXi","Vprf2b29RJ","XyPZNBbwgA","2DREsFNYIM","1j5L8F6PT2","UmaEvCdyBV","C2IrcC2Irc","Y1mC0NOHsz",
+"uN6r3tjQxs","AgJHQYf2Ec","ZJTXHFPfSE","nlaByuN6r3","KsjRKgtCA5","Ss0ZuSmGzv","wiHrZB3qem","Yf2EcFjHXR","zz4ZU9iGoT","Y1mC0AkKTk",
+"bZLvSYOfrY","pFrrlqQxHP","NhXduzHF1q","dhSuH24ARF","Yf2EcI7p2a","Yw2oU6AFT0","RzaZARxrsm","ix74rQ6Lix","piJSks7Mxk","sx5Gle6e4z",
+"Nxx9VJ2mQi","MmsIohUTw7","VBjhzaez9y","QssNCxReec","l83UdWaWsv","k85AeZUnqt","i7WMQoGu6x","fmIK1jSjS3","Yf2EcCdyBV","hYBCKMezSW",
+"i7WMQdmoS7","5IhmGv8yFN","CNHmvStlDJ","580YDFNYIM","EdBKcMojnP","pvgjSaDGtS","SjskQdhSuH","HzZT87hyVv","prNT6lm0pD","U3yw5s7Mxk",
+"HlUbFcL0aE","faHir14FLR","uLtKsn1pmO","EdBKcs7Mxk","AOgEe7fKYU","CxVEfRmDcr","Z4I1viwzGk","zHF1qxXTI4","xReecL7cGc","lkMUABGaQY",
+"SWfouGrDg7","DQimpOHaBz","QssNCL7cGc","NcICAbrhlQ","uN6r3yvOMI","faHirJRJQB","hSSvQjiVBP","XflUqF6PT2","BpYhVGrDg7","7X3uyx3LDe",
+"i3pydlkMUA","EOE1oNxx9V","8U2nUaez9y","8xEKz2Nslm","Oz8yZni2v1","0BmCynnP8o","zHF1qksJby","dmoS724ARF","aez9yKsjRK","nFqikBGaQY",
+"9eoRcTwano","0MR5XyToGW","4W0TlzqH0W","tAOsrUmaEv","pWiOs0Wr5y","hYBCKnFqik","k85Ae5nmWv","ix74r48cHL","faHirlkMUA","a00b5SWfou",
+"64s8Ndpe1v","l83UdQClRL","v8yFNC2Irc","Y1mC055rfB","Pb1pas93Ml","O3iyQOUYuF","hYBCKB3qem","MaJQsa00b5","ksJbyXflUq","v1HlnblLA9",
+"i7WMQ5IhmG","Ul4a1I7p2a","ru4UGgdQsS","D6rBymX2GE","oGu6xlH1kt","FGzgpFGzgp","Kr8ysWaWsv","Cfgr3jfREu","mX2GEEoToP","JJs5m4W0Tl",
+"rhl0JC2Irc","WreyPRACuj","WaWsv5nmWv","hSSvQd85a9","16lHcDLhzM","SjskQ48cHL","Ss0ZuLDk6f","5drc6DQimp","hE1Qluvf7A","CK5W79GXkX",
+"07n1cpFrrl","3otm6hi5X7","8U2nUEoToP","Chuy3uJScX","XflUqjtn0X","zFgtB16lHc","1j5L85ZaEz","14FLRAmdQd","5NammYjB9t","MmsIoCK5W7",
+"TCgPpFFDui","lH1ktDLhzM","Waim6JkzUn","blLA9IRh48","ru4UG3otm6","Ta8f6uAWyp","RzaZA9y4lw","CxVEfvLsmS","QWxoTTCgPp","IKxdLStlDJ",
+"8FmFHaL6AJ","nFqikBCxeC","Dz1R32Nslm","MGlTFfLNg8","Uvlv4hE1Ql","StlDJWPmlx","zHF1qDcpWB","M3zXLv8yFN","5drc68RCUA","RsQUqXyPZN",
+"hSSvQMojnP","yEfy9oVQp6","iwzGktuDyS","uQIcztAOsr","s4786Q6hMC","No0Qb8xEKz","yEfy9wiHrZ","JkzUnRsQUq","uPX7Gk85Ae","8hJdt55rfB",
+"jiVBPUlU3M","ru4UGSjskQ","O3iyQWMiS3","Ta8f6WDVWJ","07n1cogLgc","uLtKswDajX","lCMxyP6bcg","0h1b1EOE1o","nnP8oKZamH","CNHmvWMiS3",
+"DG4sTdpe1v","580YDW7cTs","gdQsSSWfou","0ao3lgjUTu","cQOnvRBhp0","0BmCyqUJMd","W3VFHBGaQY","1v5hHlH1kt","qQxHPbZLvS","lpF6Wv2eC3",
+"8U2nUtjQxs","zY1GYvkCHH","07n1cSbRYy","cShY2CNHmv","5iGN5Oz8yZ","W7cTsM3zXL","ksJbyzFgtB","DQimpuJScX","lj07QPOUYS","5Mg9rb29RJ",
+"Ta8f6Nxx9V","h1zcH5ZaEz","uN6r3Vprf2","29QAz8cVD3","WaWsvjSjS3","0h1b1ydG8U","jzUqRZUnqt","Z4I1vQ6hMC","Oz8yZwiHrZ","e6e4zjS1aj",
+"0ao3ldQ586","ulk41euZA5","VjCZqQnJ1S","GWqqXpv0i7","VerEAdpe1v","jfREuWmadA","I7p2aRxrsm","RBhp0lj07Q","K4GS8fLNg8","CdyBVl83Ud",
+"gIYvE14FLR","v8yFNcmXIX","5Drn0v8yFN","8U2nU618Di","55rfBVerEA","xXTI4FcWrW","StlDJ1LB1L","07n1cgf8rI","guMb8rz7Ut","8RCUAThjNn",
+"jiVBP7X3uy","Gv3FqWMiS3","lkMUAlCMxy","7X3uyoGu6x","580YDKr8ys","O3iyQulk41","5NammEoToP","FxX9qX6Pin","KsjRK3otm6","1j5L8SWfou",
+"Mm8si2hEEU","5IhmGt98iW","cL0aElweGy","QworuFwEJz","gtCA52hEEU","In3NSJkzUn","yvOMIEdBKc","2ZHdkprNT6","5iGN5NcICA","5Drn0nFqik",
+"tjQxsm4bxU","MezSWyToGW","6AFT0zz4ZU","7lUXZHzZT8","v2eC3YjB9t","tl72WAXpwE","VLTy6IBe8k","v1Hlnd7vjM","YOfrYQ6Lix","CqqaDFjHXR",
+"ru4UGkB5nP","ix74rt59lR","djsrvhE1Ql","vOqCEReKEW","0PktInnP8o","M3zXLjfREu","a00b5BpYhV","8RCUANhXdu","tl72WdhSuH","9y4lwVIlwP",
+"4dEz6pmeCd","1v5hH7Ow5C","qUJMdOUYuF","6q6L9SjskQ","TwanozmLYD","ECMvU7fKYU","euZA50YAGH","Yw2oUOUYuF","FxX9qwiHrZ","k85AenlaBy",
+"FGzgpWaWsv","pv0i7Oz8yZ","CqqaDVIlwP","XyPZNhi5X7","7Ow5CuTacx","kB5nPLbRTH","2DREsciuWz","YOfrYlCMxy","MojnPM6qcG","4W0Tlni2v1",
+"B3qem5Namm","n8pJ9atef2","dpe1vsx5Gl","iB08lWMiS3","MGlTF3otm6","fcwDaYf2Ec","ZJTXHECMvU","ru4UGNhXdu","cQOnvjfREu","5drc6Ul4a1",
+"d7vjMdjsrv","D6rByfmIK1","Y1mC0yofH3","FjHXRCNHmv","MmsIoSWfou","ulk41Mkgy8","jzUqRWDVWJ","zY1GYiwzGk","soy9tprNT6","GXdoHxReec",
+"cmXIX07n1c","In3NSksJby","Nxx9VThjNn","cShY2cmXIX","ciuWzZhwG1","64s8NfLNg8","FxX9qsoy9t","ydG8UFVMxo","tl72WPb1pa","D6rBym4bxU",
+"QYxC007n1c","Q6Lix2Yz7E","LbRTHAgJHQ","TwanoGrDg7","Chuy33weIF","gf8rIJXljW","Zv7z0aDGtS","wiHrZUvlv4","8cVD3FjHXR","BFkb8K20wK",
+"Mm8siQWxoT","Mm8sijzUqR","WaWsvTwano","zFgtBYOfrY","45cIH5IhmG","RkQkejSjS3","iKqhrZhwG1","J2mQizz4ZU","J2mQixXTI4","Yf2Ec2Nslm",
+"qUJMd8xEKz","24ARFpv0i7","14FLR5drc6","hi5X7DQimp","fcwDaEOE1o","AgJHQaez9y","dpe1vokgRi","4W0TlfaHir","wiHrZK4GS8","mz8gxWaWsv",
+"QbxXcru4UG","lweGydhSuH","oVQp62TRI7","DLhzM7Ow5C","QnJ1S9iGoT","Nxx9V0h1b1","jSjS3RsQUq","SWfou55rfB","y94nwoQ87r","ZJTXHBFkb8",
+"hi5X7EdBKc","RsQUqK20wK","d7vjMtl72W","iB08liqv4k","xciqprKDLJ","GSQwjSjskQ","DG4sT4W0Tl","gIYvESs0Zu","O3iyQzY1GY","ZJTXHLDk6f",
+"Q6hMCn1pmO","Mm8siThjNn","iKqhrXflUq","lCMxyYh1hF","O3iyQ3weIF","Kr8ysdjsrv","PYBf4Q6hMC","ix74rJXljW","tvdkDYOfrY","nlaBynFqik",
+"FVMxoNOHsz","Yw2oUjzUqR","pAhR15Mg9r","iqv4kaez9y","Ss0ZuBpYhV","b29RJpiJSk","fcwDa48cHL","mX2GEni2v1","gtCA5yluBx","gf8rIIBe8k",
+"MaJQs8RCUA","ru4UGydG8U","Z4I1vFFDui","5Drn0UlU3M","NAFuwzmLYD","CxVEfgjUTu","FVMxoFLsph","45cIHX6Pin","JIqXi8FmFH","zQt6QpAhR1",
+"taOXK9eoRc","uupzki7WMQ","Mm8siYf2Ec","SmGzvm4bxU","WPmlxFVMxo","ZuDtDCqqaD","kZANmQ6hMC","l83Ud618Di","Ss0ZuNo0Qb","MmKGJs4786",
+"t98iWpFrrl","qUJMd2ZHdk","Waim6NOHsz","Mm8siG1RhS","uTacxAkKTk","tAOsr9eoRc","zmLYDTCgPp","0MR5X5VZjS","pmeCdVerEA","wDajXK20wK",
+"ogLgcWaWsv","he9IAlkMUA","vLsmSm4bxU","RxrsmKZamH","gIYvEWreyP","1j5L80h1b1","lj07QTXQ0Z","5Namm8RCUA","s93MlMaJQs","AIYUuvkCHH",
+"lm0pDGWqqX","IjTwPZuDtD","0Kyfs1j5L8","n8pJ914FLR","DG4sTokgRi","CqqaDFLsph","bgJAzBCxeC","HP433VIlwP","8U2nUnnP8o","fmIK1Ta8f6",
+"GXdoH7fKYU","In3NSlsQGo","fLNg829QAz","45cIHMkgy8","cL0aERzaZA","P6bcg0PktI","Oz8yZXyPZN","07n1ctuDyS","HfyNQGSQwj","JkzUn9eoRc",
+"qUJMdU3yw5","n1pmOs4786","h1zcH580YD","In3NSsx5Gl","K4GS8QClRL","RmDcrZv7z0","nnP8olViBv","ZUnqtoGu6x","uN6r39rlg9","M3zXLiwzGk",
+"0Wr5ym4bxU","JXljWI7p2a","RACujAmdQd","rKDLJVprf2","AmdQd29QAz","W3VFHLewvM","yluBxl83Ud","5Drn05Drn0","In3NSulk41","zz4ZUtuDyS",
+"Ta8f6k85Ae","SjskQ2TRI7","uQIczy94nw","uLtKstvdkD","JKWYRnlaBy","Kr8ys5nmWv","DcpWB8hJdt","lXFOBeuZA5","NAFuwW3VFH","9GXkXksJby",
+"x3LDeB3qem","9GXkXCNHmv","pT8wu5ZaEz","OUqFMECMvU","ksJbye6e4z","0ao3l45cIH","K20wKFwEJz","zFgtB0MR5X","1LB1L2Yz7E","sx5GlaDGtS",
+"v2eC3gdQsS","wDajXW3VFH","uN6r3uZPqg","Gv3Fq16lHc","JRJQBfcwDa","pv0i7a00b5","2TRI7VNCPd","VerEAi7WMQ","piJSk618Di","fFDrJNo0Qb",
+"14FLRzQt6Q","Z4I1vJKWYR","Ss0ZudmoS7","WreyPoQ87r","Ss0Zutl72W","NcICAG1RhS","uJScXMezSW","h1zcHyluBx","MojnPnlaBy","48cHLQbxXc",
+"lweGyCK5W7","WmadA0BmCy","NAFuwru4UG","lH1ktMK07Y","uAWyp5Namm","vkCHHqQxHP","FnPFBJIqXi","Oz8yZiwzGk","RsQUq9iGoT","RxrsmcmXIX",
+"Ss0ZuQbxXc","s4786NOHsz","7X3uyS77LH","lsQGoK20wK","VIlwPfLNg8","X6PinOHaBz","jiVBPuLtKs","HP433okgRi","KZamHhE1Ql","aez9yZUnqt",
+"FxX9quPX7G","pvgjSpFrrl","tAOsrt59lR","NhXdunlaBy","tlILt0Kyfs","24ARFDz1R3","GWqqXCNHmv","RxrsmRACuj","AOgEeAIYUu","MK07YazIWp",
+"9iGoTPOUYS","xXTI4P6bcg","5NammNOHsz","jeskS0h1b1","yvOMIlm0pD","hSSvQCIShG","IRh48DG4sT","BGaQY5nmWv","uAWypuZPqg","gdQsSNAFuw",
+"2hEEUReKEW","JJs5mRBhp0","tvdkD64s8N","MK07YRsQUq","azIWpUmaEv","jeskSVIlwP","F6PT25Mg9r","XflUqsx5Gl","NhXdud7vjM","Z4I1vgdQsS",
+"gdQsSIn3NS","3weIF8hJdt","Y1mC0CdyBV","zbIYYLbRTH","5Drn0piJSk","sqVrfjeskS","hUTw729QAz","1LB1Lv8yFN","cQOnviB08l","Mkgy8uoStw",
+"ZJTXH7hyVv","9XyT9pT8wu","hi5X7lH1kt","OxWIHS2Dfu","HlUbFhe9IA","QChxsn1pmO","aL6AJPb1pa","o8UydYh1hF","4W0Tlmz8gx","BCxeC5iGN5",
+"7fKYU4W0Tl","piJSkVjCZq","XyPZNb29RJ","FVMxo3otm6","RACujzHF1q","tl72WZv7z0","7hyVvhYBCK","GrDg7uQIcz","3otm6CdyBV","nFqikJRJQB",
+"UlU3MStlDJ","zFgtBUvlv4","5drc6JJs5m","K20wKJRJQB","U3yw5e6e4z","uLtKsCNHmv","fqypysx5Gl","TXQ0ZHP433","0Wr5yOUYuF","EoToPy94nw",
+"RpBQm9eoRc","Mkgy8EoToP","5IhmGaDGtS","n8pJ9zmLYD","gjUTuRxrsm","RsQUqzQt6Q","fqypyIKxdL","1v5hHQworu","5drc648cHL","ZuDtDRACuj",
+"9rlg9yEfy9","yluBxUmaEv","ni2v1i3pyd","Uvlv4ksJby","DQimpcmXIX","zqH0Whi5X7","ZJTXH55rfB","QbxXcqUJMd","Cp3mZlsQGo","Cp3mZsuY4x",
+"KZamHBCxeC","zQt6QHP433","Mm8siQworu","Ta8f6soy9t","faHirdmoS7","fcJOyVNCPd","ydG8UjSjS3","vLsmSAXpwE","Chuy32hEEU","B3qemRkQke",
+"BpYhVnlaBy","jiVBPNOHsz","blLA9Yh1hF","OHaBz3weIF","0Wr5y5VZjS","bgJAzsuY4x","7X3uyQ6Lix","cShY2WPmlx","In3NSzHF1q","tlILtdhSuH",
+"a00b5hi5X7","7fsYMlkMUA","iwzGkEoToP","rKDLJhSSvQ","dhSuHQssNC","sx5GlyToGW","MezSW9iGoT","s93MlW7cTs","fqypyzqH0W","RmDcrdmoS7",
+"U3yw5ydG8U","Yh1hF3otm6","FNYIMOz8yZ","uQIczzFgtB","rKDLJyvOMI","yEfy9lm0pD","lH1kttvdkD","B3qemlkMUA","StlDJfmIK1","bZLvSECMvU",
+"9XyT9ni2v1","KsjRKkB5nP","d7vjMksJby","KsjRKRkQke","FwEJzIjTwP","2DREsB3qem","MGlTFWaWsv","QWxoTQnJ1S","s7Mxk1j5L8","Pb1pa5Mg9r",
+"rhl0J0BmCy","KZamHMkgy8","rz7Ut4dEz6","7ku1pJIqXi","pT8wuguMb8","M3zXLlm0pD","qQxHP5IhmG","hi5X7gjUTu","v8yFNQ6Lix","Kr8ysHP433",
+"LbRTHHP433","bZLvSuN6r3","x3LDeoQ87r","jiVBP5VZjS","lXFOBECMvU","MezSWAXpwE","wDajXaez9y","5Drn08FmFH","QworuHRxd8","RACujZzJHW",
+"e6e4zSjskQ","Yf2EcTXQ0Z","dQ586IKxdL","FnPFBksJby","d7vjMQChxs","AXpwE14FLR","K20wKt98iW","OUqFM45cIH","Dz1R3MmsIo","zqH0WGXdoH",
+"vOqCEAmdQd","cShY2qQxHP","vkCHHOxWIH","ECMvUKZamH","wiHrZhi5X7","9rlg9lCMxy","k85Ae618Di","kB5nPuZPqg","uQIczpv0i7","lCMxyKASQ8",
+"lH1ktHRxd8","WMiS3AkKTk","vkCHHiqv4k","x3LDeBpYhV","WDVWJdQ586","IBe8kxciqp","ydG8UC2Irc","XyPZNzY1GY","QnJ1SZv7z0","MaJQsY1mC0",
+"iKqhrfcJOy","kZANmaL6AJ","CNHmvIBe8k","fqypyatef2","hUTw72ZHdk","M3zXLEoToP","FVMxoGSQwj","7ku1pbZLvS","hi5X7RsQUq","ECMvUQworu",
+"sqVrffFDrJ","pT8wu1j5L8","M3zXLfqypy","zQt6QyofH3","8FmFHUlU3M","9rlg9IRh48","iqv4k64s8N","uLtKs2Yz7E","zQt6QfcJOy","hUTw7EOE1o",
+"FPfSEIRh48","RACuj7hyVv","4QMc9Ta8f6","JKWYRatef2","hE1QlEoToP","xReecwiHrZ","HfyNQcQOnv","zqH0WFjHXR","fLNg8Ta8f6","GWqqX8U2nU",
+"7fsYMVerEA","v8yFN7hyVv","aL6AJ24ARF","xReecdQ586","55rfBTCgPp","kB5nPdpe1v","oGu6x9XyT9","5Mg9rzqH0W","v1HlnPb1pa","CIShGSWfou",
+"EoToPt98iW","EoToPsuY4x","Cp3mZqaofN","AkKTkoQ87r","TwanoRxrsm","ECMvU7lUXZ","azIWpDLhzM","Ss0ZubrhlQ","DLhzMtaOXK","fcwDaZuDtD",
+"Q6hMCOxWIH","dhSuHpAhR1","J2mQiWMiS3","0YAGH4QMc9","AkKTkVIlwP","wDajXRpBQm","lViBvNOHsz","t59lR6q6L9","FGzgpFNYIM","29QAz1j5L8",
+"qQxHP5ZaEz","G1RhSaL6AJ","AOgEev1Hln","W7cTsvLsmS","Oz8yZatef2","b29RJQssNC","0ao3l1LB1L","QChxsuPX7G","55rfBi3pyd","bZLvSiB08l",
+"tvdkDKASQ8","BFkb8b29RJ","azIWppWiOs","i7WMQKr8ys","IRh48EdBKc","FGzgpBpYhV","0MR5X618Di","brhlQEdBKc","U3yw5Gv3Fq","Oz8yZWMiS3",
+"ECMvUCp3mZ","blLA9Ta8f6","VIlwPyluBx","DQimplXFOB","ZhwG1nnP8o","7X3uy7fKYU","B3qem8cVD3","KASQ8P6bcg","atef2ZhwG1","JIqXiTwano",
+"h1zcHNOHsz","Zv7z0FLsph","brhlQCqqaD","yofH3FxX9q","jiVBPU3yw5","W7cTs5nmWv","FhtgljSjS3","XyPZNBCxeC","0MR5XY1mC0","QClRLyEfy9",
+"In3NSVNCPd","8cVD3RmDcr","G1RhSfFDrJ","I7p2aMmKGJ","WMiS3zz4ZU","5Drn0dmoS7","5Drn0StlDJ","W3VFHnlaBy","2ZHdkcmXIX","yvOMIRsQUq",
+"Yw2oU9rlg9","RsQUqJKWYR","yvOMI0YAGH","ZuDtDCK5W7","XyPZN7lUXZ","iwzGkMkgy8","iwzGkAgJHQ","9XyT9tuDyS","Pb1pas4786","Ta8f6RBhp0",
+"qQxHPAkKTk","9rlg9WaWsv","IjTwPd85a9","fcJOyGv3Fq","6AFT09eoRc","QssNCGrDg7","0PktIzHF1q","3otm65iGN5","hE1Qln8pJ9","48cHLpv0i7",
+"Y1mC0FjHXR","JJs5mlkMUA","0BmCyCxVEf","UlU3Matef2","EoToP1v5hH","OUqFMuoStw","QWxoTzqH0W","AXpwEuTacx","Ul4a1hi5X7","WPmlxX6Pin",
+"DQimpvOqCE","iqv4kazIWp","0ao3lChuy3","zHF1qVNCPd","fcwDaqUJMd","24ARFfmIK1","Mm8siuPX7G","W7cTsdmoS7","nFqikyToGW","soy9t5iGN5",
+"nnP8oEOE1o","m4bxUYw2oU","taOXKoVQp6","oVQp6oVQp6","IBe8kx3LDe","J2mQiMK07Y","0BmCy2Nslm","RzaZAuJScX","k85AepvgjS","dQ586RsQUq",
+"Y1mC0oQ87r","zFgtB2DREs","lH1ktHP433","RsQUqEOE1o","FwEJzDG4sT","iKqhrCIShG","16lHcSbRYy","wDajXsuY4x","fmIK1Mkgy8","DG4sToVQp6",
+"J2mQi7hyVv","CqqaDS2Dfu","ydG8U1v5hH","jfREu5nmWv","rz7UtDz1R3","JJs5m0h1b1","dpe1vIBe8k","QChxsWPmlx","4dEz6HzZT8","jzUqRni2v1",
+"lkMUA0MR5X","SWfou4QMc9","jiVBPMmKGJ","l83UdWDVWJ","DG4sT7fsYM","aez9yI7p2a","ni2v1v2eC3","Yh1hFiKqhr","WreyPMmsIo","OUYuFWPmlx",
+"i3pydAXpwE","BGaQY48cHL","GSQwjt98iW","NOHszO3iyQ","jiVBPlViBv","QssNC0YAGH","GrDg7aFFss","cL0aEcmXIX","uPX7GY1mC0","lsQGoB3qem",
+"8FmFHfLNg8","618DiJKWYR","cmXIXgtCA5","uJScXjfREu","GWqqXn8pJ9","ru4UG1LB1L","JKWYRCp3mZ","zHF1q2Nslm","9GXkXMojnP","WMiS39y4lw",
+"tuDySQworu","VIlwPiB08l","rKDLJHP433","tjQxsciuWz","uAWyptl72W","9XyT9WMiS3","ZuDtDcShY2","KsjRKW3VFH","Q6Lixix74r","Pb1pazz4ZU",
+"8U2nUMGlTF","euZA5piJSk","J2mQiksJby","2TRI7QClRL","DLhzMFPfSE","AXpwE9eoRc","UlU3MsqVrf","FxX9qMmsIo","faHirx3LDe","29QAzpmeCd",
+"6AFT0C2Irc","o8Uydrz7Ut","0h1b1ix74r","ZUnqtAIYUu","TCgPpcQOnv","9GXkXZJTXH","8cVD3WPmlx","dQ586hi5X7","he9IAciuWz","6q6L9rz7Ut",
+"mX2GE9iGoT","9eoRcWPmlx","blLA9wDajX","2hEEUGWqqX","ulk41atef2","ZJTXHs93Ml","aez9yZv7z0","uAWyp3weIF","7X3uytlILt","9XyT9lViBv",
+"FGzgplH1kt","O3iyQTwano","yToGWulk41","pT8wuRkQke","OxWIHiwzGk","XflUqaDGtS","HRxd8uZPqg","i3pydyToGW","9eoRcXflUq","VIlwPD6rBy",
+"v2eC3F6PT2","7Ow5C2DREs","7hyVv45cIH","SbRYyeuZA5","HlUbFa00b5","NAFuwrhl0J","Z4I1vbgJAz","5IhmGOUYuF","vkCHHIRh48","JRJQB2Yz7E",
+"9XyT9ogLgc","uupzk16lHc","lpF6Wmz8gx","pWiOsCxVEf","WmadApAhR1","fcJOyO3iyQ","CdyBVFcWrW","IRh48s93Ml","nnP8oRxrsm","pFrrlVerEA",
+"vOqCEOz8yZ","7Ow5Ct59lR","6q6L90Wr5y","QChxsD6rBy","DLhzMMkgy8","pv0i7YjB9t","MmKGJyluBx","4W0TlEOE1o","Dz1R3NcICA","uZPqgXyPZN",
+"W3VFHjSjS3","gjUTusx5Gl","WmadASjskQ","WmadAaDGtS","FNYIMQChxs","uPX7GtaOXK","HzZT8WDVWJ","OxWIHlCMxy","bgJAzdpe1v","5nmWvYf2Ec",
+"pT8wu2ZHdk","x3LDeeuZA5","7lUXZQssNC","AIYUuVprf2","QClRL4QMc9","GWqqXTa8f6","tl72WIBe8k","gjUTuhi5X7","piJSkCqqaD","KASQ82TRI7",
+"JXljWatef2","CdyBVlXFOB","oVQp6hE1Ql","v1HlnWPmlx","pT8wuiwzGk","suY4x9y4lw","LewvMZzJHW","taOXKWMiS3","Ta8f6aDGtS","RBhp0Yw2oU",
+"ulk41DLhzM","9XyT9lH1kt","dpe1vhi5X7","Q6LixaL6AJ","ZzJHWRxrsm","jtn0Xulk41","55rfBVprf2","5nmWvKZamH","CNHmvdjsrv","W7cTsEoToP",
+"hYBCKlCMxy","J2mQit59lR","GSQwjHfyNQ","uTacxEOE1o","HRxd8IjTwP","Zv7z0uPX7G","euZA5fmIK1","uZPqgtuDyS","fcwDa0h1b1","Ul4a1hUTw7",
+"B3qemlXFOB","CIShG7ku1p","BCxeCChuy3","rKDLJuvf7A","NhXdu5Namm","Uvlv4PYBf4","kB5nPWaWsv","CK5W7OUYuF","1j5L8zY1GY","7lUXZzQt6Q",
+"vkCHHVerEA","Oz8yZSbRYy","RxrsmYw2oU","tjQxs4W0Tl","taOXKcL0aE","WreyP7fsYM","guMb8x3LDe","brhlQkB5nP","8xEKz1v5hH","s7MxkyofH3",
+"0YAGHHfyNQ","Yh1hF64s8N","RsQUqdQ586","BpYhVW3VFH","oGu6xhi5X7","LbRTHBGaQY","WmadAZJTXH","BbwgAfFDrJ","JIqXid85a9","QClRLZUnqt",
+"8hJdtFLsph","9GXkX0ao3l","FNYIM3weIF","WmadAoGu6x","jtn0XRsQUq","mz8gxlViBv","oGu6xNo0Qb","LDk6fCK5W7","2hEEUBFkb8","hi5X7SbRYy",
+"fLNg82ZHdk","hUTw7hi5X7","CqqaDgtCA5","M3zXLFxX9q","zY1GYxReec","faHirK20wK","FjHXRdmoS7","n1pmOKASQ8","2ZHdkJRJQB","8U2nUfmIK1",
+"HP4339XyT9","DLhzM7fsYM","9GXkXNAFuw","MmKGJyEfy9","1v5hHpT8wu","D6rBySbRYy","X6PinTXQ0Z","KASQ8QssNC","uoStwsuY4x","zz4ZUFLsph",
+"fmIK1QbxXc","kB5nPjiVBP","VIlwPlpF6W","Chuy3JKWYR","qQxHP16lHc","0BmCyPb1pa","9rlg9tvdkD","2Yz7E07n1c","LDk6fECMvU","AmdQdpFrrl",
+"pFrrlTXQ0Z","lj07QYf2Ec","8cVD3VLTy6","Vprf2KASQ8","cShY2iqv4k","uvf7Aatef2","gjUTu4dEz6","vLsmSOz8yZ","5ZaEz5nmWv","FFDuiIRh48",
+"lkMUAhi5X7","vOqCEpWiOs","0KyfsoVQp6","i3pydOUqFM","d7vjMnlaBy","gtCA5pFrrl","Waim6AOgEe","guMb8JIqXi","cShY2nlaBy","MojnPv8yFN",
+"HRxd8zY1GY","k85AeHfyNQ","iqv4kxReec","YOfrYogLgc","gIYvEsuY4x","dhSuHFNYIM","W7cTscShY2","dQ586uoStw","bZLvSQClRL","M6qcGVerEA",
+"okgRiYh1hF","X6PinyluBx","LbRTHv8yFN","Q6Lix7fKYU","Y1mC0aFFss","Cp3mZdhSuH","lweGyHfyNQ","QChxsi7WMQ","uN6r3ZuDtD","XyPZNXyPZN",
+"bZLvSCdyBV","KZamHxciqp","2hEEU5ZaEz","xciqpLbRTH","Yh1hFuQIcz","iB08lFwEJz","0BmCyWmadA","2DREsLbRTH","0BmCyRkQke","ru4UG9y4lw",
+"8hJdtpmeCd","lCMxycmXIX","euZA5oVQp6","cL0aE1j5L8","VerEAni2v1","CNHmvQ6hMC","lkMUAQWxoT","gf8rITwano","WDVWJSjskQ","C2IrcFNYIM",
+"lweGy3weIF","m4bxUPOUYS","BbwgA45cIH","TCgPp8U2nU","zbIYYPYBf4","POUYSuTacx","Chuy3Kr8ys","Q6hMCh1zcH","0BmCyTa8f6","OUqFMuTacx",
+"aez9y5Mg9r","v1HlnfaHir","Vprf2nnP8o","Nxx9VRBhp0","KASQ8JXljW","qaofNDQimp","3otm6YjB9t","F6PT2tvdkD","sx5Glo8Uyd","FPfSEHzZT8",
+"nlaByYf2Ec","tl72WCfgr3","qQxHPRBhp0","Mkgy8NcICA","lm0pDiB08l","d7vjMlm0pD","blLA9AgJHQ","hUTw7FLsph","yToGWTwano","UmaEvFcWrW",
+"RpBQmMm8si","nlaBylkMUA","Nxx9VRxrsm","DG4sTCxVEf","AIYUudpe1v","5ZaEzS2Dfu","K20wKVjCZq","d85a9ciuWz","Q6LixUl4a1","2TRI7cL0aE",
+"FhtglRxrsm","gtCA5b29RJ","QClRLxReec","FPfSE4dEz6","CxVEf8hJdt","fFDrJS77LH","hSSvQhi5X7","QworutjQxs","8RCUA45cIH","0YAGHJIqXi",
+"IKxdLgIYvE","5ZaEzFcWrW","LbRTHyToGW","cL0aEVjCZq","qQxHPFVMxo","JJs5mbgJAz","okgRisx5Gl","Mm8sizQt6Q","CK5W7FnPFB","zbIYYOz8yZ",
+"YjB9tTwano","NhXduxReec","24ARFgdQsS","YOfrYSmGzv","CqqaDkB5nP","TXQ0Z2TRI7","QChxsuQIcz","zY1GYGXdoH","ix74ruJScX","lsQGo14FLR",
+"VBjhzW3VFH","oQ87rGv3Fq","s7Mxkuupzk","CxVEfW3VFH","7hyVvy94nw","ReKEWDQimp","AXpwENo0Qb","t59lRMmKGJ","QClRL5drc6","azIWpWaim6",
+"zFgtBi7WMQ","KsjRK7ku1p","Mm8si24ARF","BpYhVMmsIo","atef2XyPZN","Ta8f6NcICA","MojnPrhl0J","8TxD7VjCZq","CNHmvQssNC","NOHszlm0pD",
+"sqVrfFNYIM","5VZjSK20wK","uQIcz0ao3l","CK5W7QnJ1S","64s8N8RCUA","NOHszMojnP","e6e4zYh1hF","kZANmFLsph","tvdkDPb1pa","Zv7z0uupzk",
+"Mm8siLDk6f","qUJMduJScX","uN6r3zY1GY","ru4UGQChxs","BFkb8bZLvS","AgJHQUmaEv","taOXKgjUTu","NOHszLDk6f","uZPqg618Di","W3VFH0Kyfs",
+"JKWYRoVQp6","aFFssnFqik","SmGzvlsQGo","aez9yv2eC3","lj07QJJs5m","sx5GlHfyNQ","ZUnqt5IhmG","RzaZAtaOXK","AkKTkIjTwP","55rfBblLA9",
+"M3zXLlXFOB","OUYuFRpBQm","wiHrZjS1aj","WDVWJrz7Ut","zHF1qSWfou","okgRiMojnP","fLNg8WaWsv","55rfB8FmFH","FNYIMazIWp","he9IAVprf2",
+"JIqXicQOnv","b29RJnnP8o","3weIF2TRI7","ECMvUqUJMd","EoToPrhl0J","DLhzMhE1Ql","618DiMezSW","FGzgpwiHrZ","5Drn0KZamH","WMiS355rfB",
+"pFrrlhYBCK","prNT6qUJMd","2hEEUiwzGk","64s8NpFrrl","kZANmpvgjS","Waim6RsQUq","VIlwPnlaBy","vLsmSTCgPp","bgJAzJKWYR","IKxdLFxX9q",
+"Mm8siuoStw","KZamHpAhR1","X6PinKZamH","580YD0BmCy","nnP8okB5nP","y94nwaDGtS","ReKEWPYBf4","uQIcz8RCUA","cShY2RkQke","n1pmOQnJ1S",
+"Mm8sikZANm","i3pydqaofN","5NammWDVWJ","ni2v1G1RhS","FhtglMmsIo","AOgEeRxrsm","5nmWvm4bxU","Mm8siWreyP","zHF1qIjTwP","Q6hMCYw2oU",
+"he9IAAXpwE","yofH35ZaEz","6q6L9DcpWB","uN6r36AFT0","uN6r3uN6r3","FGzgpGXdoH","xciqpFhtgl","Z4I1v48cHL","zQt6Qjtn0X","Pb1paxReec",
+"5Mg9rnlaBy","ix74rsoy9t","d7vjM4dEz6","Cfgr3OHaBz","pFrrlzqH0W","DQimpd85a9","0Kyfs9eoRc","kB5nPLDk6f","MojnPM3zXL","suY4xB3qem",
+"M6qcGjzUqR","Cp3mZnlaBy","WDVWJjtn0X","jtn0XMmKGJ","14FLRxReec","VjCZqzmLYD","FLsphLDk6f","OUYuFrKDLJ","KZamHZUnqt","IBe8kTCgPp",
+"K20wKMezSW","0YAGHLDk6f","Chuy3POUYS","yvOMIuupzk","8FmFHNOHsz","ogLgcQssNC","CqqaDvOqCE","0ao3lnlaBy","GSQwjhi5X7","X6PinMGlTF",
+"K4GS8CIShG","mX2GEHzZT8","Q6Lix0Kyfs","0PktIDG4sT","580YDaFFss","zz4ZU24ARF","t98iWtlILt","yofH30BmCy","9eoRcW3VFH","hYBCKlpF6W",
+"kZANm2hEEU","brhlQxXTI4","5VZjSlj07Q","dmoS7ZzJHW","RACujEdBKc","29QAzsuY4x","MojnPxciqp","ru4UGi3pyd","2Yz7EZzJHW","Z4I1vbrhlQ",
+"jtn0Xi7WMQ","FcWrW8xEKz","pWiOsi7WMQ","gf8rItl72W","29QAz55rfB","GXdoHWMiS3","tvdkDfLNg8","MezSWQWxoT","LewvMQworu","guMb8gdQsS",
+"GXdoHStlDJ","ECMvUHlUbF","2DREsJ2mQi","VIlwPF6PT2","oVQp6TXQ0Z","LewvM618Di","Q6hMCNhXdu","vLsmSvOqCE","t59lRI7p2a","lsQGoTCgPp",
+"Dz1R3EOE1o","jiVBPhSSvQ","MGlTFFxX9q","wiHrZ7lUXZ","G1RhSGXdoH","RzaZAPb1pa","ZuDtDCp3mZ","d7vjMsqVrf","uvf7AoGu6x","uJScXoGu6x",
+"FnPFBHP433","VBjhzDQimp","hi5X7VjCZq","2TRI716lHc","tuDyS8U2nU","m4bxUa00b5","MGlTFP6bcg","JkzUniKqhr","0BmCyVerEA","wDajXtl72W",
+"Cp3mZlViBv","qUJMdogLgc","a00b52hEEU","tlILtS77LH","5ZaEzTCgPp","lViBvYjB9t","iqv4kWmadA","fmIK1GSQwj","LbRTH45cIH","a00b5jS1aj",
+"580YDGSQwj","x3LDedhSuH","MK07Y1j5L8","NhXduzqH0W","jzUqROz8yZ","S77LHcQOnv","lkMUAtjQxs","pT8wu2TRI7","v1HlnydG8U","7hyVvn8pJ9",
+"okgRiXyPZN","mz8gxLbRTH","8FmFHKsjRK","nlaByzHF1q","ciuWzCp3mZ","DQimpqQxHP","uJScXhSSvQ","taOXKUvlv4","9eoRciqv4k","M6qcGblLA9",
+"cmXIXhi5X7","RxrsmqaofN","FFDuid7vjM","DG4sTtuDyS","5VZjSrhl0J","XflUqiB08l","zFgtBnlaBy","uN6r3jiVBP","Cfgr35Namm","8TxD7sx5Gl",
+"lsQGogjUTu","GrDg7FLsph","kB5nP4W0Tl","CqqaDqUJMd","m4bxUpv0i7","29QAzuAWyp","ECMvUyluBx","IRh48WreyP","cShY2aDGtS","FwEJzQbxXc",
+"FhtglVNCPd","2Yz7ElViBv","StlDJzqH0W","pv0i7PYBf4","okgRisuY4x","UlU3MW3VFH","ZUnqtv1Hln","7ku1p2DREs","Y1mC0azIWp","cQOnvK4GS8",
+"jS1ajAmdQd","ulk41NhXdu","Ul4a1EdBKc","jSjS3iwzGk","Gv3FqQ6hMC","WDVWJwiHrZ","1j5L8uN6r3","8FmFHcmXIX","MmsIot98iW","Mkgy8B3qem",
+"Z4I1vpvgjS","tAOsrUl4a1","EOE1opv0i7","IKxdLLbRTH","9XyT9Waim6","zz4ZUIBe8k","DG4sT07n1c","jS1ajsuY4x","gtCA5zz4ZU","Gv3FqFLsph",
+"uLtKsjfREu","FVMxoiqv4k","ydG8Uuupzk","SmGzvW7cTs","HRxd8zqH0W","uupzk4QMc9","CIShGn8pJ9","zbIYYUmaEv","soy9tQworu","ECMvUoQ87r",
+"UmaEv9GXkX","jS1ajCNHmv","D6rByru4UG","ru4UGRsQUq","fLNg8hUTw7","prNT6t98iW","StlDJK4GS8","m4bxUyToGW","AkKTk2Yz7E","8RCUAwDajX",
+"ydG8UOz8yZ","48cHL4QMc9","MaJQsIKxdL","C2IrcdhSuH","jeskSTa8f6","VIlwPjzUqR","5drc6NcICA","hE1QlpvgjS","TXQ0Z7ku1p","Vprf2O3iyQ",
+"29QAz4dEz6","45cIH2Nslm","Q6hMCgjUTu","aFFss7ku1p","lsQGoeuZA5","atef2dmoS7","jSjS3S77LH","cL0aEnlaBy","fLNg8jS1aj","WmadAMaJQs",
+"oQ87rvOqCE","ZhwG1zbIYY","jeskSuLtKs","Yh1hFJkzUn","gIYvEm4bxU","Zv7z02ZHdk","oVQp6iwzGk","O3iyQ8RCUA","MojnPnFqik","vkCHH3otm6",
+"0MR5XdhSuH","FLsphfLNg8","IjTwPY1mC0","BpYhViqv4k","9GXkXiqv4k","xXTI4BpYhV","ECMvUogLgc","tl72WDcpWB","FGzgp4W0Tl","VBjhzJKWYR",
+"0h1b13weIF","FhtglZ4I1v","FLsphL7cGc","d85a9JIqXi","4QMc93weIF","XyPZNfmIK1","hi5X7W3VFH","piJSk64s8N","IjTwPD6rBy","fqypyGv3Fq",
+"tl72W2Nslm","WMiS3BGaQY","qaofNd7vjM","pAhR1Ss0Zu","euZA5RzaZA","Fhtgl8cVD3","pAhR1qaofN","ECMvUQClRL","aDGtSYw2oU","5ZaEzpFrrl",
+"uoStwMaJQs","9XyT9AgJHQ","7X3uyaFFss","soy9tD6rBy","lViBvcmXIX","CdyBVtlILt","2TRI7MGlTF","faHirLbRTH","RsQUq7fKYU","S77LHKZamH",
+"pv0i7tlILt","ulk41MezSW","zz4ZUTwano","6AFT0vLsmS","JkzUndhSuH","zmLYDnlaBy","MaJQs2ZHdk","o8UydUvlv4","l83Ud7Ow5C","EoToPxXTI4",
+"sx5GlIjTwP","lj07Qs7Mxk","9XyT9GrDg7","U3yw5JJs5m","VBjhzix74r","jtn0XcmXIX","tlILtNhXdu","VLTy6d85a9","hYBCKGSQwj","prNT6FxX9q",
+"CdyBVcQOnv","uPX7G0BmCy","9iGoTK4GS8","Cp3mZQYxC0","ThjNnJkzUn","yluBxTXQ0Z","sqVrfAOgEe","gtCA57Ow5C","2ZHdknnP8o","BFkb8jSjS3",
+"yluBx0ao3l","cQOnvdpe1v","MojnP618Di","64s8NOUYuF","ThjNnIKxdL","NhXduZJTXH","tlILtY1mC0","IBe8kUl4a1","jSjS3lweGy","IjTwPn1pmO",
+"MaJQsdmoS7","wDajXWmadA","vLsmS0BmCy","16lHcWPmlx","MaJQsjeskS","t98iW2ZHdk","uoStwUmaEv","TCgPpWaim6","JXljWOz8yZ","tl72WVprf2",
+"ThjNna00b5","sqVrfzqH0W","HRxd8aez9y","HP433SbRYy","rKDLJ5Drn0","No0QbD6rBy","4dEz614FLR","SjskQIRh48","fcwDapFrrl","suY4xt59lR",
+"B3qemuN6r3","mX2GEGWqqX","YOfrYoQ87r","oGu6xy94nw","ydG8UprNT6","Cp3mZ5ZaEz","jiVBP4W0Tl","uTacxmz8gx","aL6AJVprf2","2TRI7QbxXc",
+"0YAGH6q6L9","KsjRKhUTw7","Q6LixuJScX","b29RJni2v1","xciqpBGaQY","B3qemFGzgp","OUYuF5Drn0","MmKGJTCgPp","QworuWPmlx","3weIFXyPZN",
+"gf8rIRzaZA","sqVrfMm8si","B3qemo8Uyd","taOXKJRJQB","v1HlnogLgc","FwEJz8FmFH","t59lRSbRYy","hi5X7FGzgp","Yw2oUYjB9t","hE1QljzUqR",
+"cmXIXzz4ZU","jfREutlILt","GWqqX5IhmG","1v5hHiwzGk","BFkb8FVMxo","MojnPlkMUA","QClRLPb1pa","O3iyQrhl0J","aez9y07n1c","uupzkuAWyp",
+"Dz1R37Ow5C","uPX7GYw2oU","9XyT9cmXIX","o8UydCxVEf","BFkb8Cfgr3","Kr8ysaez9y","RsQUqQ6hMC","4W0Tl8TxD7","RsQUqgtCA5","aL6AJMmKGJ",
+"dQ586MGlTF","nnP8o07n1c","bgJAzqQxHP","0Wr5yqQxHP","a00b5aDGtS","jtn0XW3VFH","lkMUAMm8si","yEfy9WaWsv","P6bcgYh1hF","uvf7AnnP8o",
+"CIShG14FLR","FhtglzHF1q","NcICAzbIYY","lm0pDrz7Ut","MezSWBGaQY","K20wKpWiOs","5nmWvyToGW","fFDrJB3qem","4QMc9oQ87r","a00b5s4786",
+"MezSWni2v1","5nmWvuAWyp","t59lRtuDyS","5iGN5CxVEf","7Ow5CK4GS8","0h1b1sqVrf","FGzgp16lHc","GSQwjOUqFM","MmsIocL0aE","2TRI7n1pmO",
+"M3zXLRBhp0","0Kyfsd7vjM","s7Mxkm4bxU","cQOnviqv4k","0h1b1WreyP","4QMc9ogLgc","WaWsv5IhmG","OUYuFChuy3","fqypypAhR1","ksJby5iGN5",
+"djsrvHRxd8","FnPFBCNHmv","EdBKclweGy","4QMc9FPfSE","v8yFNiB08l","BFkb8uoStw","DcpWB5Namm","Yh1hFOUYuF","X6Pin5drc6","7fsYMaez9y",
+"48cHLIjTwP","dhSuHjzUqR","EoToPLewvM","fqypyfaHir","16lHc9rlg9","Gv3FqSs0Zu","HRxd8yEfy9","P6bcgiwzGk","nlaByUmaEv","pmeCdP6bcg",
+"JkzUnG1RhS","s7MxkOUqFM","cmXIX4W0Tl","YOfrYJXljW","8TxD7VBjhz","HzZT8ECMvU","MmsIo2Yz7E","VjCZqMm8si","jfREuIRh48","lViBvX6Pin",
+"lkMUA8xEKz","Mkgy82ZHdk","BbwgA5Drn0","9GXkXOUqFM","v1Hlnpv0i7","S2DfuS2Dfu","Q6LixMkgy8","faHiryofH3","TXQ0ZaL6AJ","9eoRcpvgjS",
+"tuDySs4786","7lUXZaL6AJ","oVQp67fKYU","fcwDa9XyT9","IKxdL0ao3l","oQ87rRxrsm","XflUqQYxC0","G1RhSDz1R3","bZLvSvLsmS","SjskQOxWIH",
+"CqqaDgIYvE","rKDLJRzaZA","tuDySMK07Y","zFgtBmX2GE","faHir8FmFH","5IhmGHfyNQ","jzUqREdBKc","YjB9tiB08l","07n1cXflUq","ix74rC2Irc",
+"OUqFMzmLYD","5ZaEzIn3NS","tuDySoGu6x","faHirDG4sT","CdyBVxReec","C2Irc14FLR","M6qcG2hEEU","AmdQdjtn0X","n8pJ9uvf7A","0YAGHn8pJ9",
+"v1Hlnlj07Q","5VZjS2TRI7","JRJQBSs0Zu","zFgtB7lUXZ","5Drn0VerEA","2ZHdkCfgr3","1LB1L7lUXZ","s47861v5hH","5VZjSrKDLJ","s93Ml7Ow5C",
+"DLhzMpAhR1","VIlwPlCMxy","FVMxoOz8yZ","0MR5XjS1aj","aFFssxXTI4","yluBxNcICA","iB08lk85Ae","3weIFAmdQd","IRh48AXpwE","o8UydRxrsm",
+"mz8gxmz8gx","4dEz6O3iyQ","kB5nPS2Dfu","ni2v1CIShG","2hEEUblLA9","5VZjSMGlTF","PYBf45ZaEz","pWiOsd85a9","M3zXLCK5W7","Pb1paC2Irc",
+"n8pJ95Mg9r","JXljW4dEz6","s7Mxkgf8rI","wiHrZYw2oU","YjB9t8RCUA","FGzgpNcICA","jzUqRStlDJ","7fsYMOUqFM","gdQsSIBe8k","FjHXRs7Mxk",
+"64s8NEoToP","a00b5zY1GY","HzZT8IKxdL","0YAGHpFrrl","0ao3lIjTwP","POUYSyofH3","3otm6lsQGo","iqv4kuvf7A","tAOsr618Di","e6e4zlkMUA",
+"vLsmSblLA9","b29RJBGaQY","aFFssFjHXR","9eoRc4dEz6","M3zXLuQIcz","64s8Niqv4k","24ARF5drc6","FxX9qWMiS3","piJSkhi5X7","VBjhzM6qcG",
+"lpF6WCfgr3","B3qemdhSuH","ulk41faHir","HzZT88U2nU","GSQwjiwzGk","AmdQdIn3NS","QbxXcyToGW","FLsphNcICA","C2Irchi5X7","MGlTFRBhp0",
+"uupzkulk41","MmsIoBFkb8","pWiOsrhl0J","pvgjSIKxdL","euZA5sqVrf","VBjhzSmGzv","ksJbyd85a9","uPX7Guvf7A","WmadAlj07Q","QClRLfqypy",
+"EoToPxciqp","K20wKs7Mxk","xciqpStlDJ","OUqFMCp3mZ","J2mQiAmdQd","lm0pDqQxHP","I7p2aCK5W7","Gv3FqfaHir","s93MlFxX9q","zY1GY5Namm",
+"2ZHdkAIYUu","kZANmydG8U","FcWrWSjskQ","GSQwjF6PT2","7lUXZsqVrf","OUYuFZv7z0","cQOnvpvgjS","vOqCElweGy","fFDrJNhXdu","Pb1paYh1hF",
+"oGu6x5IhmG","TwanoTa8f6","gtCA5Nxx9V","AgJHQhi5X7","Chuy3s7Mxk","zHF1q7lUXZ","L7cGc9iGoT","Cfgr37fKYU","9GXkX07n1c","5Drn0Zv7z0",
+"Mm8siiqv4k","gIYvEuoStw","rhl0JRzaZA","6AFT0zbIYY","l83Udulk41","RzaZAzFgtB","KZamHZJTXH","UlU3M0MR5X","uAWypVjCZq","0ao3lvkCHH",
+"rz7UtQworu","WDVWJZUnqt","9XyT9SbRYy","QYxC0FNYIM","gjUTus7Mxk","OxWIHsoy9t","5VZjS0Wr5y","ix74rMaJQs","gtCA5kB5nP","QssNClH1kt",
+"tAOsrLewvM","ZuDtDO3iyQ","TwanouTacx","VLTy69rlg9","IBe8k0PktI","DcpWBlXFOB","MaJQstuDyS","EoToPXyPZN","Twano5VZjS","Oz8yZRsQUq",
+"9rlg9nlaBy","HRxd8Uvlv4","2NslmqQxHP","zmLYDzFgtB","EoToPFwEJz","oQ87rIKxdL","Yh1hFzQt6Q","LDk6fEOE1o","MmsIoSmGzv","NcICAnlaBy",
+"he9IAPYBf4","AkKTk2Nslm","Q6hMCjiVBP","CdyBV8cVD3","gIYvEt59lR","dpe1vM3zXL","fmIK1CIShG","ru4UGCIShG","LDk6fpmeCd","8cVD3Twano",
+"ru4UGxReec","pWiOs9GXkX","lH1ktv2eC3","zqH0WaFFss","ulk41QWxoT","piJSk45cIH","prNT6JRJQB","zmLYD8U2nU","RsQUqd7vjM","QChxsRzaZA",
+"WaWsv9XyT9","6AFT0s93Ml","8RCUAX6Pin","WDVWJNcICA","uPX7GFhtgl","0PktIv1Hln","a00b5Pb1pa","uZPqgtjQxs","ZJTXHzz4ZU","hSSvQ4dEz6",
+"pv0i7oVQp6","QnJ1S4QMc9","3weIFFnPFB","P6bcghi5X7","QClRLzY1GY","GXdoHSjskQ","SjskQ9eoRc","uZPqgP6bcg","FjHXRAXpwE","LewvMhE1Ql",
+"45cIHcQOnv","v1HlnRACuj","k85AeBGaQY","rhl0JNhXdu","azIWp0h1b1","iKqhrZzJHW","RACujzqH0W","0PktI2Nslm","vkCHHk85Ae","gIYvEOUYuF",
+"i3pydn1pmO","hE1Qlmz8gx","W7cTszHF1q","KASQ8CNHmv","WDVWJgdQsS","24ARFjeskS","LewvMNhXdu","KsjRKFFDui","LewvMni2v1","9iGoTs93Ml",
+"iwzGkvkCHH","LbRTHni2v1","ru4UGzqH0W","Pb1paSjskQ","sqVrfMmKGJ","OHaBzECMvU","lj07QMmsIo","6AFT0gdQsS","rKDLJcL0aE","618DiNOHsz",
+"FcWrWTXQ0Z","AmdQdaez9y","B3qemZv7z0","wiHrZIjTwP","bZLvS14FLR","hYBCKzmLYD","CK5W7Ss0Zu","he9IAZzJHW","0KyfsM6qcG","Ta8f63otm6",
+"yluBxrKDLJ","Ul4a1dmoS7","M3zXLix74r","brhlQ45cIH","7lUXZOz8yZ","HRxd8zz4ZU","Vprf2o8Uyd","kZANm618Di","14FLROUqFM","jtn0XFGzgp",
+"yToGWAkKTk","5nmWvFPfSE","No0QbOz8yZ","uJScXOUqFM","zFgtBJKWYR","DLhzMVerEA","tuDySqUJMd","5NammuQIcz","1LB1L29QAz","jeskSLewvM",
+"1LB1LogLgc","xReectlILt","M3zXLdQ586","kZANmhSSvQ","mz8gxlH1kt","07n1cvLsmS","FVMxoQWxoT","WDVWJFVMxo","tAOsrSjskQ","pFrrlsuY4x",
+"d7vjMS77LH","P6bcgYw2oU","pT8wuWDVWJ","FPfSExciqp","U3yw5tjQxs","wiHrZCxVEf","Q6hMCtl72W","YjB9tlH1kt","fmIK1sqVrf","t59lRVLTy6",
+"2hEEUtuDyS","soy9tsuY4x","wDajXBpYhV","VIlwPVerEA","6q6L9o8Uyd","55rfB0Kyfs","Ta8f6XflUq","cQOnvW7cTs","ReKEWRzaZA","wDajXi7WMQ",
+"tjQxspFrrl","RACuj2Yz7E","prNT6v2eC3","K4GS8QbxXc","BGaQYgjUTu","I7p2a5nmWv","Q6LixDz1R3","TCgPpogLgc","FcWrWl83Ud","16lHcKASQ8",
+"JkzUnNAFuw","yluBxi3pyd","uN6r3lXFOB","bgJAzI7p2a","OUYuFpv0i7","Gv3FqhUTw7","xciqp16lHc","MezSWfFDrJ","IBe8khe9IA","OHaBzKASQ8",
+"5Drn0RACuj","JXljWFFDui","hi5X7RACuj","VIlwP9GXkX","1j5L8tl72W","4W0TlfcwDa","yToGWC2Irc","s93MlVBjhz","jS1ajcL0aE","iB08lJJs5m",
+"zFgtBKZamH","2Yz7Ei7WMQ","faHirMaJQs","cShY25Drn0","ydG8UcmXIX","zqH0WmX2GE","0MR5XMm8si","iKqhryvOMI","KZamHUvlv4","HRxd8lweGy",
+"5VZjSBpYhV","HRxd8Yf2Ec","ni2v1WMiS3","jiVBP5ZaEz","RACuj580YD","gf8rIBCxeC","16lHcuvf7A","TCgPplViBv","CqqaDStlDJ","NAFuwksJby",
+"FPfSED6rBy","5iGN58xEKz","4W0TlazIWp","MK07YqaofN","v2eC3AmdQd","vOqCEFLsph","CqqaDThjNn","MK07YL7cGc","sx5GlQ6hMC","NAFuwMojnP",
+"ZhwG12Yz7E","oGu6xd85a9","aFFssCdyBV","Ta8f6cmXIX","ix74rZUnqt","wDajXdjsrv","CxVEf9y4lw","prNT6RmDcr","5Drn0jzUqR","Q6hMCru4UG",
+"GWqqXjfREu","ydG8UvkCHH","lH1kt5Drn0","l83UdYh1hF","Chuy3KASQ8","5ZaEzlH1kt","G1RhSbZLvS","a00b5ru4UG","KsjRKTCgPp","D6rByY1mC0",
+"WmadA5nmWv","SjskQjSjS3","ZJTXHGrDg7","KZamHMmKGJ","9rlg9In3NS","ni2v1uZPqg","0Wr5yPOUYS","9XyT9RpBQm","RACuj8RCUA","LewvMaFFss",
+"yToGW2Nslm","IBe8kZUnqt","soy9tiwzGk","n8pJ9pv0i7","v2eC3WaWsv","xXTI49GXkX","ru4UGqUJMd","uupzk9rlg9","8cVD3qQxHP","e6e4zRmDcr",
+"x3LDe48cHL","iwzGk45cIH","QChxscL0aE","C2Irc8xEKz","48cHLwDajX","Yw2oUWaim6","oQ87r55rfB","jSjS3Uvlv4","No0QbqaofN","oGu6xpFrrl",
+"Cp3mZh1zcH","TXQ0ZFPfSE","5VZjSQ6Lix","v2eC3HfyNQ","h1zcHQ6Lix","tlILtSs0Zu","k85AedQ586","7ku1ptaOXK","X6Pin7lUXZ","VBjhzvLsmS",
+"fcwDaO3iyQ","gtCA5FnPFB","OUqFMK4GS8","0ao3lECMvU","QnJ1SDG4sT","VjCZqru4UG","SbRYyfmIK1","0Wr5ytuDyS","DcpWBfFDrJ","2TRI7OxWIH",
+"ZJTXH8U2nU","fFDrJCqqaD","hYBCKzY1GY","xReeclm0pD","VerEAiqv4k","ogLgcChuy3","nlaByYw2oU","vkCHHDLhzM","uZPqgfmIK1","aL6AJfFDrJ",
+"8FmFHAkKTk","Z4I1vuLtKs","NhXdujfREu","Pb1paY1mC0","Oz8yZIBe8k","aFFssGWqqX","WPmlxRpBQm","qQxHPJKWYR","KASQ8BGaQY","8cVD37fsYM",
+"Rxrsms93Ml","ZhwG1gdQsS","Cp3mZ5Namm","Kr8ysrhl0J","lm0pDG1RhS","SmGzvfcJOy","G1RhSlCMxy","1v5hHuvf7A","7X3uyWreyP","HzZT85VZjS",
+"VIlwP3otm6","8TxD7AOgEe","v8yFNzqH0W","FwEJzprNT6","CIShGt98iW","7Ow5C0h1b1","lpF6W16lHc","9y4lwQnJ1S","xReecTXQ0Z","djsrvKASQ8",
+"cL0aEtjQxs","GSQwjDG4sT","YOfrYIRh48","Oz8yZKsjRK","tlILtMmsIo","0YAGHOUYuF","8TxD7lXFOB","JRJQBRBhp0","SjskQlpF6W","ciuWzxciqp",
+"dQ586ReKEW","9XyT9FNYIM","BbwgAiB08l","DcpWB6q6L9","SbRYyMaJQs","DQimpzFgtB","HfyNQd85a9","TCgPpUlU3M","I7p2aP6bcg","sqVrftvdkD",
+"nFqikmX2GE","bgJAzuoStw","5NammoQ87r","n1pmOOUqFM","CqqaD0PktI","guMb8KASQ8","C2IrctaOXK","yEfy9CqqaD","8TxD7FLsph","YjB9tIjTwP",
+"MojnPzbIYY","wiHrZRACuj","9eoRci3pyd","FnPFBsqVrf","guMb8e6e4z","lCMxyJ2mQi","Gv3Fq3otm6","AIYUuFcWrW","24ARFW7cTs","MojnP4dEz6",
+"cQOnvGXdoH","7X3uyYw2oU","uTacxYjB9t","YOfrYnnP8o","lkMUAaDGtS","n8pJ9VerEA","0KyfsOz8yZ","iB08l8hJdt","NAFuwRzaZA","F6PT2ZJTXH",
+"8FmFH0Wr5y","KZamHulk41","7ku1p24ARF","ZuDtDYw2oU","gjUTuiqv4k","VerEAHP433","mX2GEkB5nP","LewvMFFDui","l83UdhSSvQ","jeskSfmIK1",
+"LewvMJXljW","l83UdMmKGJ","lweGyxXTI4","0KyfstlILt","VBjhzv8yFN","NcICAYOfrY","KASQ82hEEU","BpYhVRkQke","4dEz6cmXIX","WDVWJ16lHc",
+"J2mQiprNT6","NAFuwlH1kt","okgRizmLYD","TwanoyEfy9","wiHrZSWfou","euZA57ku1p","Pb1paL7cGc","6q6L9rhl0J","CK5W7vOqCE","lXFOBuoStw",
+"yvOMIyvOMI","zbIYYYw2oU","MK07Y3otm6","RACujbrhlQ","618DiuLtKs","8cVD38TxD7","6AFT0MmsIo","P6bcgRsQUq","Dz1R3WDVWJ","ciuWzsqVrf",
+"lm0pDVjCZq","55rfBtuDyS","7lUXZtuDyS","2hEEUfmIK1","a00b5soy9t","lkMUAiwzGk","hE1QlogLgc","CIShGQbxXc","KASQ8gjUTu","FcWrWa00b5",
+"VerEAWMiS3","Gv3FqRkQke","HRxd80MR5X","5ZaEzLewvM","uJScXrz7Ut","1v5hHsqVrf","v8yFN0Kyfs","AXpwEFGzgp","aL6AJRkQke","9rlg9KASQ8",
+"FhtglnnP8o","hSSvQNo0Qb","QYxC0LbRTH","hYBCKd7vjM","QChxsXflUq","WMiS3soy9t","X6PinfmIK1","qaofNOUqFM","uupzk9y4lw","ciuWzzbIYY",
+"4W0Tlv1Hln","kB5nPhSSvQ","pvgjSwDajX","RkQkeAXpwE","d7vjMtjQxs","O3iyQjS1aj","X6PinFLsph","GrDg7jtn0X","48cHLx3LDe","IBe8kStlDJ",
+"tl72WFVMxo","JXljWaFFss","OxWIHLDk6f","RsQUqlXFOB","XflUqsoy9t","gjUTuPYBf4","iwzGk7ku1p","jiVBP29QAz","0h1b1bZLvS","C2IrcK20wK",
+"WMiS3JRJQB","aL6AJbZLvS","jS1ajiB08l","Yw2oUCxVEf","tvdkDjtn0X","n1pmOK20wK","o8UydnFqik","aFFssMmKGJ","XyPZNLDk6f","dQ586In3NS",
+"SmGzvtAOsr","MGlTFqaofN","lH1kt8FmFH","ru4UGQssNC","S77LHhi5X7","fFDrJSs0Zu","7Ow5C2ZHdk","WaWsvOHaBz","7lUXZi7WMQ","S2DfuVBjhz",
+"a00b5iqv4k","dhSuHStlDJ","RsQUq64s8N","VIlwPi3pyd","zqH0WDz1R3","dQ586M6qcG","UlU3Msoy9t","cShY2xReec","pWiOsWaWsv","jtn0XGWqqX",
+"dpe1vv8yFN","Mkgy8hE1Ql","n1pmOLbRTH","VerEAgIYvE","rhl0JzQt6Q","ydG8UYOfrY","e6e4zFhtgl","MmKGJ2TRI7","Waim6ogLgc","WPmlx07n1c",
+"yEfy95ZaEz","piJSkRACuj","uTacxjfREu","uZPqglkMUA","cL0aEciuWz","blLA95ZaEz","s93Mlru4UG","Z4I1v16lHc","okgRiCfgr3","7lUXZRACuj",
+"zmLYDciuWz","ThjNnG1RhS","0ao3lIBe8k","LbRTHQnJ1S","OxWIHPb1pa","VerEAQbxXc","mz8gxMm8si","jS1ajM3zXL","sqVrfsx5Gl","OxWIHhUTw7",
+"5drc6l83Ud","SWfouguMb8","ZJTXHQbxXc","ZhwG1FLsph","dpe1v2TRI7","NAFuws93Ml","JKWYRbgJAz","uQIczdQ586","wDajXDQimp","fcwDa9rlg9",
+"zQt6QOHaBz","AOgEeAXpwE","sqVrfeuZA5","HfyNQOUqFM","EOE1oYOfrY","pvgjShi5X7","Waim655rfB","YOfrYa00b5","Zv7z0gf8rI","HRxd8vOqCE",
+"C2Irc9rlg9","K20wKoQ87r","RsQUqjeskS","7fsYMv1Hln","m4bxU4dEz6","tuDyS2Yz7E","uupzkWPmlx","ReKEWZUnqt","tlILt24ARF","7Ow5CNcICA",
+"Rxrsmrhl0J","DQimpK4GS8","K4GS8mX2GE","G1RhS5iGN5","iB08lfmIK1","K20wKs4786","h1zcHuN6r3","07n1cNOHsz","QssNCJKWYR","uN6r3i7WMQ",
+"oGu6xuoStw","RsQUqhi5X7","Ss0Zu0Kyfs","oVQp6ru4UG","W7cTsaL6AJ","iKqhr580YD","yvOMIuAWyp","BbwgA0PktI","O3iyQBpYhV","VNCPdh1zcH",
+"brhlQI7p2a","Gv3FqQ6Lix","RACuj8FmFH","7X3uyrKDLJ","3otm6nnP8o","5ZaEzUvlv4","yEfy9uupzk","pWiOsCdyBV","rKDLJbZLvS","VIlwPFNYIM",
+"NOHszhSSvQ","QClRL9rlg9","kZANmIKxdL","vLsmSlkMUA","cQOnvNOHsz","RsQUq24ARF","JRJQBjfREu","W7cTsb29RJ","8RCUA0BmCy","pvgjSEOE1o",
+"jeskS9XyT9","s93Ml55rfB","vLsmSVIlwP","t59lRpFrrl","pT8wuBFkb8","cmXIXWmadA","0h1b1RBhp0","fLNg8lkMUA","Kr8ysCqqaD","IBe8k4dEz6",
+"C2IrcWDVWJ","Q6hMCSbRYy","J2mQiRACuj","8RCUAs7Mxk","P6bcghe9IA","0PktIrKDLJ","9XyT92ZHdk","gf8rIDz1R3","Pb1pav1Hln","4W0TlZuDtD",
+"K4GS8IBe8k","5IhmGblLA9","JRJQBMm8si","pvgjSB3qem","7fKYUrz7Ut","pFrrlChuy3","qQxHPmz8gx","NcICAfqypy","5VZjS8cVD3","JkzUnbgJAz",
+"580YDMm8si","pT8wu7X3uy","ThjNnpiJSk","OUYuFm4bxU","29QAzSs0Zu","7Ow5CtaOXK","rKDLJEdBKc","WPmlxvOqCE","FhtglReKEW","SmGzvAOgEe",
+"B3qemtAOsr","zz4ZUcQOnv","t59lRUvlv4","FhtglGXdoH","Chuy3Ta8f6","O3iyQVerEA","jfREuD6rBy","XflUq8hJdt","euZA5FcWrW","zFgtBK20wK",
+"Waim69rlg9","AXpwERACuj","rKDLJuLtKs","pFrrluQIcz","K20wKuLtKs","0YAGH1j5L8","NhXduokgRi","MaJQs0YAGH","QbxXcaez9y","Gv3FqSWfou",
+"VBjhzyofH3","QnJ1S2hEEU","taOXKOUqFM","BGaQY8cVD3","5NammYw2oU","fLNg85ZaEz","yToGWDz1R3","m4bxUIjTwP","gIYvEni2v1","IKxdLlCMxy",
+"POUYSNcICA","zQt6Qhi5X7","SWfouaL6AJ","guMb8MmsIo","qUJMd55rfB","cShY2yvOMI","AOgEeSs0Zu","d85a9hSSvQ","aez9yfmIK1","DQimpa00b5",
+"Q6hMCqaofN","P6bcgNAFuw","WDVWJ7lUXZ","NhXduwDajX","JXljWU3yw5","ni2v15Mg9r","Mm8siuJScX","Ta8f6nlaBy","GSQwj0h1b1","gf8rIfcJOy",
+"FxX9qNAFuw","WDVWJ2hEEU","oVQp6m4bxU","618DiFwEJz","ReKEW1LB1L","2hEEUAXpwE","Chuy329QAz","yofH3QYxC0","n1pmOfcwDa","CqqaDhYBCK",
+"K4GS85iGN5","d85a9sqVrf","29QAzhe9IA","ogLgcoGu6x","HfyNQ1v5hH","yvOMIFGzgp","uJScXFwEJz","0YAGHWmadA","2TRI7HzZT8","aez9yUl4a1",
+"l83UdpAhR1","MmKGJQworu","wDajXHfyNQ","MK07YMmsIo","NAFuwiqv4k","uAWypx3LDe","lH1kt5VZjS","xReecThjNn","b29RJk85Ae","TCgPpF6PT2",
+"4dEz6m4bxU","yvOMIzFgtB","5Mg9r5Mg9r","MezSWuN6r3","dpe1vTXQ0Z","TwanoDQimp","F6PT2uJScX","zbIYYFnPFB","pvgjSQworu","16lHclm0pD",
+"SmGzvkZANm","3otm6qUJMd","b29RJpWiOs","Yf2EcRBhp0","DG4sTM3zXL","pvgjS9XyT9","7Ow5C7fsYM","aDGtSQ6hMC","2ZHdkD6rBy","lXFOBxReec",
+"K20wKsuY4x","IKxdLWaWsv","n1pmO1v5hH","x3LDeRxrsm","8hJdtIjTwP","OHaBzVBjhz","fcJOyFVMxo","OUqFMlH1kt","POUYSIBe8k","atef216lHc",
+"YjB9tbrhlQ","LDk6f9rlg9","uJScXpmeCd","FGzgpNOHsz","jfREucL0aE","9y4lw5nmWv","JkzUnzmLYD","xciqpTCgPp","Waim6qUJMd","24ARFO3iyQ",
+"580YDFjHXR","zmLYD4QMc9","lj07Q9iGoT","lweGyIKxdL","8hJdtG1RhS","lj07QQClRL","cmXIXIjTwP","FVMxod7vjM","oGu6xaez9y","2ZHdkCdyBV",
+"fcJOylj07Q","VLTy6618Di","v1HlnQ6Lix","RsQUqt59lR","iB08lSs0Zu","NAFuwaez9y","FhtglaDGtS","NhXduM3zXL","yEfy9OxWIH","pmeCdEOE1o",
+"EdBKcGv3Fq","XyPZN7fKYU","tjQxsOUqFM","IKxdLuupzk","QnJ1Sv1Hln","5nmWvblLA9","QnJ1SiKqhr","VIlwPZJTXH","aFFssCNHmv","16lHcIjTwP",
+"29QAzi7WMQ","i7WMQdpe1v","lj07QvLsmS","D6rBycmXIX","prNT6C2Irc","2ZHdkWaWsv","guMb8QWxoT","VIlwPlm0pD","k85AeMojnP","zbIYYuupzk",
+"RpBQmCdyBV","S77LHAkKTk","Y1mC0OHaBz","brhlQWreyP","bgJAztl72W","WDVWJtuDyS","l83UdK4GS8","jiVBPpvgjS","8TxD7BbwgA","FPfSEzY1GY",
+"2DREshe9IA","v1HlnJIqXi","Q6hMCtjQxs","ThjNnSbRYy","KsjRKgf8rI","m4bxUMezSW","QClRLMojnP","AOgEeQbxXc","HRxd8xXTI4","FwEJzDcpWB",
+"F6PT2YOfrY","dmoS7SWfou","FjHXRTa8f6","wDajXfcJOy","FVMxoBpYhV","Cp3mZCIShG","5VZjSHlUbF","Yw2oUrhl0J","i3pyd8RCUA","iKqhrDz1R3",
+"aDGtSoVQp6","vLsmSMkgy8","2NslmOxWIH","KASQ8FxX9q","k85Ae9eoRc","qQxHPpT8wu","8xEKzWDVWJ","fFDrJd85a9","hE1QlLDk6f","d7vjMYf2Ec",
+"tvdkDFGzgp","9rlg9ZzJHW","fmIK1SWfou","dpe1vguMb8","8cVD3uJScX","AkKTkMojnP","wiHrZBCxeC","HlUbFQ6hMC","uoStwx3LDe","uJScXlH1kt",
+"pFrrlJ2mQi","7Ow5Cl83Ud","OUYuF45cIH","YOfrYHRxd8","hSSvQRkQke","W7cTsn8pJ9","wDajXgIYvE","FVMxofmIK1","1j5L8PYBf4","pv0i7soy9t",
+"RsQUqU3yw5","45cIH0Kyfs","ogLgcjfREu","jzUqR5VZjS","ni2v1tAOsr","S2DfuZUnqt","RACujy94nw","jfREuUl4a1","cL0aEoVQp6","t59lRJIqXi",
+"8TxD7yEfy9","VLTy6HP433","5iGN5wDajX","zmLYDpiJSk","pmeCdMK07Y","ZzJHWtjQxs","ogLgcCK5W7","9XyT9tjQxs","DcpWBIn3NS","rhl0JSjskQ",
+"v2eC3oVQp6","9GXkXLbRTH","Cfgr316lHc","faHirnFqik","jfREuHzZT8","cmXIXXflUq","hSSvQuZPqg","5drc6CNHmv","LDk6ffaHir","gf8rI7Ow5C",
+"GXdoHXflUq","sqVrf5drc6","jSjS34QMc9","618DiIBe8k","s4786HlUbF","7fsYMlXFOB","s7MxkCfgr3","xciqpZUnqt","DLhzMe6e4z","pAhR19iGoT",
+"8FmFH9rlg9","Ta8f6guMb8","a00b5pWiOs","2DREsWPmlx","zQt6Q8FmFH","guMb87fKYU","9XyT9lj07Q","64s8NkB5nP","0h1b1yEfy9","jfREurz7Ut",
+"BpYhVtlILt","lViBvzFgtB","hYBCKtAOsr","IKxdLDG4sT","OUYuFlViBv","wDajX7hyVv","Ul4a1CxVEf","WDVWJOxWIH","ru4UGaFFss","QClRL2Nslm",
+"5drc6VLTy6","UlU3MRxrsm","VIlwPlsQGo","EOE1oDLhzM","hE1QlDz1R3","tl72Wiqv4k","Mkgy8rz7Ut","OxWIHgjUTu","KZamHlm0pD","oVQp6zz4ZU",
+"lweGyJRJQB","y94nwCIShG","9GXkX9iGoT","LDk6f3otm6","QnJ1SGSQwj","Ul4a1aDGtS","5Drn0RmDcr","jeskSdmoS7","QnJ1SEoToP","TCgPp0h1b1",
+"OUqFMcmXIX","pFrrlyluBx","gtCA5RACuj","X6Pintl72W","uoStwpFrrl","MGlTFl83Ud","kB5nPDLhzM","0YAGHRACuj","fmIK1hSSvQ","5Nammdpe1v",
+"VBjhzk85Ae","nlaBypAhR1","n1pmOuLtKs","YOfrYe6e4z","nlaByzz4ZU","jfREuuQIcz","29QAzzz4ZU","uQIczzY1GY","Zv7z0yluBx","2NslmbZLvS",
+"9y4lwS77LH","hi5X7iB08l","MezSWPYBf4","KZamHMojnP","FwEJzGWqqX","lkMUAVjCZq","7hyVvAgJHQ","jiVBPiB08l","dQ586FVMxo","KsjRK5Mg9r",
+"zmLYD7ku1p","HfyNQ4W0Tl","zqH0WcShY2","Q6hMC2Nslm","ciuWzjS1aj","4W0TlVBjhz","ogLgc64s8N","RzaZAWreyP","EOE1oiqv4k","uZPqgCNHmv",
+"WreyPKZamH","8hJdtQYxC0","SbRYyaDGtS","RkQke8FmFH","TCgPpYOfrY","fcwDacmXIX","fcJOyRpBQm","CdyBVW7cTs","nnP8oVerEA","fmIK1W3VFH",
+"I7p2aaez9y","jfREupmeCd","Qworui7WMQ","gIYvERsQUq","prNT6lXFOB","Kr8ys9rlg9","SbRYyblLA9","WmadAwiHrZ","No0QbvOqCE","3otm6GXdoH",
+"6q6L9qUJMd","W3VFHsx5Gl","qaofN5IhmG","YjB9tUl4a1","pT8wuLDk6f","lXFOBnFqik","fcwDa580YD","9eoRcaL6AJ","0h1b1zbIYY","FjHXR7fKYU",
+"G1RhSni2v1","QssNCpiJSk","7X3uymz8gx","brhlQdpe1v","2hEEUhUTw7","4dEz6KsjRK","7fKYU5Mg9r","8RCUA2Nslm","No0QbiKqhr","JIqXi5ZaEz",
+"9GXkXMmKGJ","64s8Nk85Ae","MmKGJzQt6Q","prNT6ReKEW","dpe1vBpYhV","jzUqRUmaEv","vkCHH6q6L9","K4GS8XflUq","7fKYU0YAGH","C2Ircv2eC3",
+"WmadAK20wK","45cIHuLtKs","MojnPuZPqg","zY1GYxciqp","wDajXsx5Gl","dpe1vv1Hln","G1RhSjzUqR","5Drn09eoRc","pWiOsjzUqR","KZamH618Di",
+"29QAzksJby","64s8NJRJQB","Ul4a1gdQsS","8cVD3qUJMd","v2eC3fLNg8","7fsYM64s8N","xReecW3VFH","ZuDtDnlaBy","W3VFHAIYUu","7lUXZjeskS",
+"MaJQsQssNC","lH1kt7fsYM","ciuWz7hyVv","pv0i7HzZT8","HfyNQVerEA","G1RhSUvlv4","9GXkXs93Ml","DQimpVBjhz","EOE1opFrrl","d85a9RpBQm",
+"taOXKpFrrl","7ku1pogLgc","l83Ud2TRI7","y94nwv8yFN","rhl0JStlDJ","hE1QlZ4I1v","WaWsvv2eC3","5IhmGhYBCK","0BmCy2TRI7","pT8wufaHir",
+"CIShGCK5W7","MK07YLDk6f","xciqp8RCUA","TCgPpdhSuH","FnPFBP6bcg","y94nwBbwgA","OUqFMrz7Ut","QChxsYw2oU","AmdQdo8Uyd","brhlQStlDJ",
+"EOE1o7fsYM","LbRTHcQOnv","TwanoGSQwj","BpYhVRmDcr","DcpWBcShY2","ZuDtDNOHsz","WMiS3cQOnv","ZzJHW8RCUA","RACujlpF6W","ZuDtD5Namm",
+"W7cTsNAFuw","BpYhVFwEJz","WDVWJCdyBV","ni2v1suY4x","jiVBPcL0aE","48cHLxReec","zqH0WDLhzM","ciuWz0PktI","tjQxsDQimp","QChxsAXpwE",
+"mX2GE8hJdt","EdBKcAgJHQ","FFDuiWPmlx","rhl0JguMb8","qQxHPQssNC","BbwgA0Wr5y","bZLvS9y4lw","uupzkOz8yZ","cShY2YjB9t","taOXKpiJSk",
+"pvgjSCdyBV","K20wKWaim6","uTacx4QMc9","4W0Tl29QAz","v1Hln8TxD7","hUTw7fqypy","lweGyix74r","KsjRKKsjRK","v2eC3BGaQY","xReecydG8U",
+"rz7UtmX2GE","FVMxosx5Gl","hUTw71LB1L","0Wr5y2TRI7","uQIczjtn0X","O3iyQ2Yz7E","pFrrloQ87r","l83UdiB08l","atef2Kr8ys","WMiS3oQ87r",
+"guMb8fcwDa","IBe8kVNCPd","cShY2kB5nP","b29RJdQ586","mz8gx3weIF","xReeczQt6Q","uJScXpvgjS","48cHLvLsmS","wDajX16lHc","NAFuwYOfrY",
+"HP4338RCUA","s93MlDLhzM","uupzkNcICA","RmDcrulk41","i7WMQQssNC","soy9ttaOXK","OxWIH618Di","MmKGJLDk6f","AkKTkDz1R3","bZLvSuJScX",
+"Z4I1v64s8N","EoToPpvgjS","WaWsvY1mC0","wiHrZ9eoRc","4W0TlSWfou","aDGtSMaJQs","d7vjM64s8N","RpBQmHzZT8","Chuy39XyT9","Pb1patl72W",
+"7ku1p5IhmG","JKWYRFPfSE","6AFT0iB08l","VNCPdVLTy6","2hEEU5nmWv","RmDcrokgRi","Z4I1vXyPZN","W7cTsUlU3M","cQOnvXyPZN","yofH3qUJMd",
+"uoStw8U2nU","zz4ZUtjQxs","gtCA5JkzUn","Oz8yZy94nw","RsQUqKASQ8","gf8rIcShY2","uupzkCIShG","JJs5mfLNg8","FwEJzI7p2a","rhl0JpvgjS",
+"NAFuwuoStw","s7Mxk2DREs","DcpWBZJTXH","hUTw7FnPFB","RpBQm8RCUA","CxVEfoGu6x","uLtKsK4GS8","JXljWnlaBy","7fsYMfcwDa","uoStw2Nslm",
+"8cVD3uZPqg","vLsmSRxrsm","8hJdt8RCUA","I7p2aAXpwE","k85AeECMvU","DQimpbgJAz","qUJMdru4UG","CNHmvReKEW","AgJHQuZPqg","HP4330ao3l",
+"iKqhrFVMxo","sx5GlvLsmS","faHirpvgjS","M6qcGEOE1o","dpe1vCxVEf","kB5nP5Drn0","NAFuwBpYhV","RsQUqVNCPd","2NslmFwEJz","zz4ZUksJby",
+"5NammMK07Y","WmadAjiVBP","lpF6W5VZjS","LDk6fDLhzM","FGzgpMaJQs","k85AeydG8U","W3VFHHzZT8","YjB9tuJScX","ciuWzjiVBP","MaJQsVerEA",
+"BbwgAKASQ8","G1RhSRpBQm","Mm8si5drc6","ni2v1RpBQm","P6bcgU3yw5","TwanokZANm","Chuy3G1RhS","Mkgy8fmIK1","4dEz6DQimp","gtCA5MmsIo",
+"4W0Tl7X3uy","suY4xCqqaD","RxrsmLbRTH","JRJQBn1pmO","hi5X7SWfou","v2eC3VjCZq","uvf7AVNCPd","qUJMdECMvU","i7WMQpT8wu","a00b5gdQsS",
+"zbIYYokgRi","BGaQYVerEA","RsQUq0Wr5y","3weIFRmDcr","7Ow5CAOgEe","Waim6NAFuw","7lUXZguMb8","SjskQYjB9t","wDajXbrhlQ","lpF6WFxX9q",
+"2NslmVerEA","tlILtQYxC0","2hEEUcL0aE","uQIczv1Hln","xXTI4K4GS8","Gv3Fq1LB1L","hi5X70BmCy","8FmFHrz7Ut","tjQxszmLYD","GSQwjcmXIX",
+"k85Aea00b5","ydG8UmX2GE","VerEAP6bcg","MmsIo64s8N","0Wr5yaFFss","zbIYYJkzUn","rKDLJZJTXH","GXdoHFPfSE","8U2nUuJScX","SbRYyHfyNQ",
+"fLNg8xReec","WMiS3FPfSE","0h1b1cL0aE","YjB9tiqv4k","VjCZqC2Irc","n8pJ9In3NS","pFrrlDQimp","SmGzvpAhR1","Cfgr32Yz7E","taOXK8cVD3",
+"EoToPnlaBy","WDVWJQbxXc","BFkb89rlg9","Dz1R3QbxXc","IBe8kGXdoH","QnJ1Sulk41","45cIHF6PT2","K20wKbZLvS","wDajXIRh48","IBe8kVjCZq",
+"jfREuuN6r3","BCxeCRxrsm","guMb8StlDJ","lViBvnnP8o","t98iWBFkb8","M6qcG2TRI7","0MR5XpvgjS","1LB1LzmLYD","gdQsSFwEJz","lm0pDM3zXL",
+"gtCA50MR5X","jS1ajyluBx","MK07YQnJ1S","FcWrWCp3mZ","hE1QlbrhlQ","lweGyJJs5m","FFDuiWDVWJ","CxVEfRxrsm","tvdkD7fsYM","tuDySVNCPd",
+"TXQ0ZpWiOs","Gv3FqMkgy8","VIlwPQssNC","EOE1oix74r","pFrrl48cHL","qaofNQYxC0","ReKEWBFkb8","ZUnqt5nmWv","UmaEvMmsIo","8RCUAIBe8k",
+"ix74rGSQwj","n1pmOgdQsS","DLhzMAOgEe","MmsIo9iGoT","he9IAoGu6x","uTacxfcwDa","X6PinJkzUn","8TxD7CK5W7","8FmFHlpF6W","ZJTXH9y4lw",
+"0Kyfslm0pD","pmeCdDQimp","m4bxUoVQp6","Kr8ys8cVD3","S2DfuJJs5m","o8UydIBe8k","cQOnvIn3NS","uZPqgdhSuH","Fhtglt59lR","sqVrfNAFuw",
+"sx5GlC2Irc","nFqikAOgEe","StlDJjtn0X","AmdQdSmGzv","nlaByWMiS3","5nmWvCIShG","oGu6xfqypy","AIYUuprNT6","7Ow5Cv1Hln","uvf7AsqVrf",
+"9rlg9Q6Lix","FnPFBtlILt","vOqCEQ6hMC","8xEKzEdBKc","oGu6xIRh48","24ARFtlILt","3otm6kB5nP","e6e4z2DREs","ECMvU45cIH","x3LDeHfyNQ",
+"hUTw75drc6","OxWIHM3zXL","JkzUnIn3NS","9XyT99iGoT","prNT6s93Ml","uQIczZv7z0","d85a9suY4x","uAWyppWiOs","GrDg745cIH","StlDJlsQGo",
+"QssNC4QMc9","3otm6jiVBP","s4786yofH3","QssNChe9IA","fcJOyFPfSE","lweGylpF6W","okgRiTwano","vkCHHVBjhz","dQ586uJScX","uLtKsQYxC0",
+"M6qcGJKWYR","C2Irch1zcH","i7WMQXflUq","2Yz7E5drc6","GXdoHLDk6f","PYBf4pv0i7","uvf7AyEfy9","ZUnqttAOsr","GSQwjWmadA","ZhwG1M6qcG",
+"yluBxYw2oU","2ZHdklCMxy","B3qemgIYvE","In3NSSjskQ","2Yz7Eni2v1","xXTI4rhl0J","W3VFH5Drn0","NhXduMmsIo","2hEEUdjsrv","9XyT9Rxrsm",
+"RBhp07X3uy","OUYuFaDGtS","OUYuFWMiS3","qUJMddpe1v","aL6AJqaofN","n8pJ964s8N","ix74rOz8yZ","xReecoGu6x","QnJ1SAgJHQ","dQ586BpYhV",
+"jeskSB3qem","AIYUuFFDui","2Yz7EgdQsS","s47867Ow5C","BCxeCfaHir","HfyNQSWfou","Q6hMCQClRL","9iGoTvOqCE","MmsIowiHrZ","2TRI7he9IA",
+"brhlQv8yFN","ix74rd85a9","M6qcGqUJMd","uupzkLewvM","45cIHprNT6","P6bcg6AFT0","C2IrcqaofN","hSSvQFNYIM","POUYSkZANm","DLhzM0ao3l",
+"Kr8ysqaofN","5IhmGM3zXL","uLtKsRACuj","StlDJQ6Lix","Kr8ysS77LH","OHaBz0Wr5y","pvgjSZv7z0","zFgtBVNCPd","WPmlxyEfy9","pvgjSUlU3M",
+"JXljWDz1R3","FnPFBazIWp","uTacxrKDLJ","Pb1paoVQp6","YOfrYh1zcH","Chuy3HP433","DLhzMjzUqR","NcICA2Nslm","i3pyd1j5L8","i7WMQF6PT2",
+"MGlTFtaOXK","KASQ8zQt6Q","fmIK1lXFOB","TXQ0Zuvf7A","F6PT224ARF","FNYIMhUTw7","EdBKcpWiOs","tl72WHzZT8","POUYSguMb8","8FmFH9y4lw",
+"rhl0JazIWp","gIYvEhe9IA","rhl0JI7p2a","2hEEUuZPqg","uN6r33weIF","i3pydQnJ1S","5VZjShYBCK","5Drn0CxVEf","bZLvSVLTy6","oQ87rFcWrW",
+"QClRLi7WMQ","e6e4zguMb8","BGaQYPYBf4","7Ow5C14FLR","soy9tuJScX","5ZaEzW7cTs","qUJMdoQ87r","e6e4zEOE1o","9y4lw0MR5X","1j5L8KZamH",
+"2hEEUyEfy9","6AFT0HlUbF","lViBvlCMxy","nlaByFLsph","gdQsSFNYIM","07n1cB3qem","ZUnqt24ARF","FGzgpQ6hMC","Yh1hFmX2GE","MGlTFGXdoH",
+"U3yw5Pb1pa","LewvMWMiS3","v2eC3ru4UG","aez9yiqv4k","jS1ajbgJAz","4QMc9soy9t","HP433MK07Y","2hEEUxReec","uLtKsDG4sT","sx5Glk85Ae",
+"B3qemix74r","HRxd8nlaBy","t98iWuPX7G","0h1b1FPfSE","pWiOs5drc6","IBe8k5Mg9r","i3pyd2Nslm","7hyVv6q6L9","O3iyQ6q6L9","NhXduQssNC",
+"brhlQaDGtS","suY4xgdQsS","azIWp0ao3l","UlU3MfFDrJ","4dEz6SWfou","QWxoTZv7z0","ZuDtDDQimp","rz7UtAmdQd","hYBCKtjQxs","8FmFHFcWrW",
+"euZA5L7cGc","RpBQmi3pyd","tvdkDPYBf4","yToGW5iGN5","M3zXLgjUTu","MojnP2Nslm","RACuj55rfB","F6PT2prNT6","JkzUnIjTwP","vLsmS1j5L8",
+"HzZT8lCMxy","gjUTuvOqCE","lkMUAAkKTk","guMb8W7cTs","FNYIMsuY4x","EOE1oLewvM","580YD14FLR","pmeCdvOqCE","uvf7AMkgy8","piJSkd85a9",
+"Cp3mZOz8yZ","9eoRcBFkb8","LDk6fdjsrv","CqqaD7fsYM","LewvMVIlwP","K20wKOUYuF","8hJdtnnP8o","gf8rIX6Pin","ulk41XflUq","No0QbnlaBy",
+"F6PT2AgJHQ","uJScX55rfB","6q6L9yluBx","tl72WRpBQm","MK07Y2Yz7E","l83Ud8hJdt","Yf2EcuQIcz","SbRYytvdkD","0KyfsUlU3M","zFgtB580YD",
+"wDajXvLsmS","qUJMdy94nw","n8pJ9hE1Ql","aL6AJRBhp0","d7vjMRBhp0","Uvlv4Zv7z0","dhSuHPb1pa","W7cTspmeCd","pvgjS5ZaEz","Z4I1v0Wr5y",
+"CNHmvY1mC0","2Nslme6e4z","qQxHP5VZjS","gf8rIuTacx","sqVrf45cIH","kZANmOUYuF","AgJHQW7cTs","2Yz7E1LB1L","Chuy3VIlwP","tjQxsDz1R3",
+"2Yz7E7X3uy","OUYuFB3qem","atef2IRh48","kB5nPzz4ZU","oGu6xuupzk","s4786s93Ml","0MR5X3otm6","ydG8UAmdQd","cL0aEpv0i7","cShY2OHaBz",
+"7fsYMatef2","mz8gxgjUTu","suY4xZJTXH","BpYhVdpe1v","FLsphjSjS3","XflUq07n1c","ZzJHWn1pmO","MK07Y64s8N","gtCA5nlaBy","yofH3Oz8yZ",
+"TwanouLtKs","8TxD7Chuy3","s4786nlaBy","lViBv48cHL","0YAGH7ku1p","5IhmG7lUXZ","s7MxkMojnP","J2mQiAgJHQ","MmsIoh1zcH","Vprf2ThjNn",
+"jtn0XRzaZA","L7cGcYjB9t","zQt6QYh1hF","8hJdtThjNn","5ZaEzCK5W7","JXljWOxWIH","jzUqRqUJMd","uZPqg0Kyfs","EoToP8hJdt","Nxx9VMmKGJ",
+"YOfrYFVMxo","W7cTsUmaEv","Kr8ysFwEJz","jzUqR7fKYU","FwEJzhi5X7","yToGWpiJSk","soy9tjfREu","iqv4kAXpwE","2DREsNOHsz","WMiS3zHF1q",
+"KsjRKGXdoH","L7cGcEoToP","SmGzv2Nslm","0YAGH7fsYM","KZamHCIShG","45cIHlweGy","zQt6Qrz7Ut","uvf7ANhXdu","rz7Ut5Drn0","zqH0Wd7vjM",
+"2DREsWreyP","JIqXipWiOs","MmKGJO3iyQ","8RCUAQssNC","FVMxoCNHmv","8FmFHFjHXR","Ss0ZuaL6AJ","s93MlCfgr3","AkKTkb29RJ","aez9yPb1pa",
+"cShY2S2Dfu","C2Irc2DREs","wDajXTwano","ZUnqtGWqqX","RsQUqYw2oU","suY4xS2Dfu","x3LDeYOfrY","8xEKzKZamH","LewvMWreyP","Y1mC0rz7Ut",
+"WPmlxs7Mxk","e6e4zZzJHW","QworuyofH3","AIYUubZLvS","7fsYMcShY2","RzaZAFhtgl","djsrv9y4lw","suY4xcmXIX","taOXKnnP8o","1LB1LksJby",
+"uJScXjiVBP","s7MxkVprf2","W7cTsXyPZN","a00b5lpF6W","pT8wu0h1b1","Yw2oURzaZA","1v5hHJ2mQi","2DREslsQGo","kZANmfaHir","tlILt0YAGH",
+"uTacxvkCHH","Z4I1vZJTXH","ZzJHWbrhlQ","1LB1LK4GS8","ECMvU2hEEU","9rlg9fcwDa","atef2k85Ae","7hyVvs7Mxk","rz7UthUTw7","580YDb29RJ",
+"BbwgA1j5L8","lweGy5Mg9r","jiVBPcmXIX","RsQUqMmsIo","8cVD3zY1GY","OUYuFC2Irc","SjskQy94nw","v8yFNguMb8","3otm6PYBf4","IKxdLHRxd8",
+"x3LDeLDk6f","soy9tVIlwP","yofH3soy9t","I7p2aRmDcr","taOXK29QAz","WDVWJ64s8N","ZuDtDKsjRK","uoStwIjTwP","aez9yuLtKs","8cVD31v5hH",
+"x3LDeUmaEv","ciuWz9XyT9","8FmFHzz4ZU","FnPFBRACuj","WaWsvBFkb8","ydG8UwiHrZ","Zv7z0hi5X7","G1RhSVerEA","GSQwjfLNg8","MezSWEdBKc",
+"BbwgAwiHrZ","QChxsZ4I1v","W3VFH618Di","zQt6QaDGtS","ThjNnqUJMd","suY4xhSSvQ","IKxdLtAOsr","Ss0ZuPOUYS","he9IA0Kyfs","piJSkjSjS3",
+"tvdkD8xEKz","4W0Tl8cVD3","lpF6W2Nslm","HfyNQCdyBV","RsQUq1j5L8","zmLYD3weIF","3otm6ulk41","v2eC3AOgEe","6q6L9ZhwG1","MmKGJ5Mg9r",
+"ECMvU4QMc9","azIWp5ZaEz","dQ586IjTwP","0KyfsBpYhV","Cp3mZokgRi","jS1ajpAhR1","faHirlweGy","64s8NtuDyS","Dz1R3s4786","YOfrYhe9IA",
+"dpe1vrKDLJ","RxrsmyofH3","sx5GlaFFss","In3NSZhwG1","9XyT9Dz1R3","8hJdtDz1R3","hSSvQWDVWJ","4dEz6v2eC3","5drc6qQxHP","2Yz7EAgJHQ",
+"ZuDtD29QAz","s7MxkblLA9","RzaZA8TxD7","CxVEfgf8rI","uPX7GqaofN","v1HlnFhtgl","okgRiblLA9","5NammsqVrf","IKxdL0Kyfs","cL0aEpiJSk",
+"JJs5mzz4ZU","XyPZNFPfSE","7hyVvvLsmS","yEfy9FnPFB","Zv7z0fqypy","jeskSQbxXc","RxrsmlCMxy","he9IACp3mZ","W3VFHpWiOs","Kr8ys4QMc9",
+"MK07YtuDyS","uoStw9eoRc","QChxstjQxs","e6e4zb29RJ","WMiS3LDk6f","pmeCd8FmFH","pv0i7Fhtgl","CxVEfK20wK","9GXkXaFFss","Q6hMCCK5W7",
+"MojnPB3qem","uZPqgl83Ud","zFgtBblLA9","YjB9tZuDtD","IBe8kgdQsS","8TxD7MojnP","0ao3lzmLYD","5nmWvNo0Qb","JkzUnChuy3","tjQxsuupzk",
+"YjB9twiHrZ","fcJOyzz4ZU","b29RJzY1GY","2NslmOUYuF","y94nwNhXdu","Nxx9VgtCA5","bZLvS7X3uy","7X3uyt59lR","fLNg82DREs","rKDLJ9y4lw",
+"QnJ1StlILt","rhl0JMkgy8","7ku1pK20wK","8FmFHt98iW","lViBv5iGN5","Dz1R3jfREu","JIqXitjQxs","pv0i7MK07Y","FnPFBt59lR","blLA9FxX9q",
+"C2IrcMGlTF","8cVD39rlg9","pv0i7ogLgc","nnP8odmoS7","FFDuidpe1v","o8Uyd9rlg9","wiHrZydG8U","uN6r3MGlTF","CNHmvFFDui","oQ87rpvgjS",
+"OxWIH2Nslm","Z4I1vQnJ1S","O3iyQjSjS3","tl72Waez9y","uTacxM6qcG","euZA507n1c","SmGzv0YAGH","uZPqgyluBx","QnJ1ScShY2","9GXkX2TRI7",
+"MojnPQChxs","L7cGcGXdoH","e6e4zRpBQm","QssNCGWqqX","EoToPBGaQY","oQ87r9rlg9","fmIK1K20wK","P6bcgtlILt","i7WMQ7X3uy","LbRTHyEfy9",
+"K4GS8hE1Ql","RACujMK07Y","xciqpIjTwP","ZJTXHOz8yZ","pAhR1he9IA","FGzgpWaim6","oVQp6x3LDe","pWiOszbIYY","jfREu0PktI","pvgjSAmdQd",
+"wDajXZv7z0","zY1GY1v5hH","5drc6BpYhV","2ZHdkDcpWB","NOHsz7X3uy","dpe1vFcWrW","RmDcrzFgtB","AOgEe0Kyfs","yToGW8U2nU","x3LDemX2GE",
+"SmGzvKZamH","5ZaEzFVMxo","pWiOs24ARF","7fsYMMK07Y","HP433NOHsz","vOqCECK5W7","D6rByQYxC0","aFFssRsQUq","y94nwfcwDa","6AFT0SbRYy",
+"ulk41SmGzv","JRJQBCK5W7","l83Ude6e4z","Dz1R3Pb1pa","ksJbyx3LDe","3otm6CqqaD","2ZHdkUl4a1","QbxXcQssNC","9y4lwfqypy","S2DfuZzJHW",
+"yToGWZv7z0","EoToPqQxHP","KZamHmz8gx","8TxD7fcJOy","gf8rI5nmWv","5VZjSAIYUu","9rlg98TxD7","RkQke9iGoT","ZzJHW4QMc9","ReKEWFLsph",
+"nlaBypvgjS","Yh1hFl83Ud","GrDg7JJs5m","Gv3FqbZLvS","o8Uydx3LDe","B3qemQWxoT","7fKYUdpe1v","ReKEWVLTy6","i3pydFLsph","k85AeLbRTH",
+"hi5X7zY1GY","fFDrJCp3mZ","jS1ajxciqp","blLA9ThjNn","HzZT8pWiOs","h1zcHK4GS8","a00b5QbxXc","pFrrliB08l","kB5nP580YD","gdQsS9rlg9",
+"JkzUnyEfy9","ZUnqt1LB1L","8FmFHvLsmS","pWiOsLewvM","OxWIHRkQke","RsQUquN6r3","9GXkXJ2mQi","6AFT0e6e4z","AIYUuazIWp","yluBxrhl0J",
+"64s8NFPfSE","MmsIoQChxs","jfREuatef2","K4GS8dQ586","oVQp6TCgPp","StlDJGrDg7","IKxdLM6qcG","Gv3FqlCMxy","JXljWi3pyd","jSjS3JXljW",
+"Z4I1vBGaQY","ix74rIjTwP","AgJHQSmGzv","Cp3mZB3qem","TXQ0ZazIWp","7fsYM7X3uy","7lUXZ580YD","GSQwjrhl0J","0BmCyiB08l","5VZjSqUJMd",
+"5Drn0dhSuH","euZA5JRJQB","RmDcr0MR5X","RACujv8yFN","lpF6W7Ow5C","8xEKze6e4z","StlDJuLtKs","jzUqRZJTXH","07n1c29QAz","AXpwE9GXkX",
+"8hJdtyluBx","B3qemtaOXK","k85Aehe9IA","TXQ0ZP6bcg","FNYIMsqVrf","9y4lwzHF1q","DcpWBWmadA","rhl0JlweGy","G1RhSCfgr3","SbRYyfFDrJ",
+"iqv4kDLhzM","HlUbF2Yz7E","0MR5XaFFss","8xEKzcmXIX","WreyP6AFT0","QYxC0RACuj","48cHLOUYuF","he9IA2DREs","pAhR1CNHmv","MojnPZ4I1v",
+"vkCHHPYBf4","Ta8f6VerEA","MojnPMGlTF","fcJOyxciqp","Ta8f61v5hH","ZuDtDwDajX","NOHszJRJQB","dhSuH580YD","2Yz7EVNCPd","Dz1R3W7cTs",
+"IBe8kmX2GE","piJSk1LB1L","Q6LixReKEW","pT8wuTCgPp","tvdkDJ2mQi","VerEA0BmCy","HP433Yf2Ec","KASQ8WMiS3","5Drn0NcICA","Zv7z02TRI7",
+"x3LDeVLTy6","rhl0JWaim6","s4786hSSvQ","lm0pDHP433","0ao3lBbwgA","zqH0WCdyBV","bgJAz1j5L8","cmXIXVjCZq","QnJ1SAmdQd","HfyNQ5Namm",
+"3otm60Wr5y","tlILt5iGN5","6q6L9fcJOy","lCMxy2Nslm","580YDulk41","TXQ0Zl83Ud","dpe1vQworu","7X3uyk85Ae","bgJAz8hJdt","QbxXcjfREu",
+"zmLYDzbIYY","2TRI7UmaEv","WmadA3weIF","LDk6fsoy9t","CxVEfZUnqt","5nmWvK20wK","9iGoTNhXdu","HP433Fhtgl","VLTy6pT8wu","d7vjMZv7z0",
+"pT8wulH1kt","hYBCKdQ586","9XyT9guMb8","EdBKcuN6r3","LewvM8xEKz","tAOsryofH3","m4bxUk85Ae","sx5GlyluBx","ix74rfcwDa","IBe8kCK5W7",
+"UlU3M5Drn0","pvgjSRxrsm","yofH3nnP8o","y94nwpAhR1","aL6AJEdBKc","sx5GlFxX9q","RACuj14FLR","DcpWBpvgjS","bZLvSOHaBz","YOfrYwiHrZ",
+"iwzGkLDk6f","Kr8ysazIWp","BbwgAuZPqg","XflUqaez9y","fFDrJOUYuF","lj07QL7cGc","14FLR4QMc9","HfyNQUl4a1","HRxd8SmGzv","MK07Yrz7Ut",
+"d85a9No0Qb","zQt6Q4QMc9","pFrrlFnPFB","9XyT9iB08l","BFkb8S77LH","UlU3MF6PT2","7lUXZksJby","IRh48e6e4z","9XyT9Twano","StlDJTCgPp",
+"lsQGoWDVWJ","X6PinHzZT8","FcWrWVIlwP","8FmFHU3yw5","VLTy69GXkX","ECMvUuJScX","b29RJru4UG","hUTw7X6Pin","oQ87ruupzk","hi5X7wDajX",
+"EOE1osx5Gl","fqypyyvOMI","uTacxSs0Zu","nFqikIn3NS","NAFuw1v5hH","VjCZq5IhmG","S2DfuRACuj","blLA9BbwgA","2Yz7EnnP8o","tlILtpiJSk",
+"5ZaEzQ6hMC","TCgPpxXTI4","yToGWMmsIo","8TxD7K4GS8","ZzJHWvLsmS","MK07Y2Nslm","7fsYM4dEz6","SjskQSWfou","Dz1R3n1pmO","okgRiDLhzM",
+"MojnP8U2nU","fFDrJZJTXH","v2eC3XyPZN","1v5hHvkCHH","QYxC0IBe8k","JIqXiWaWsv","UmaEvpiJSk","5VZjSe6e4z","tvdkDP6bcg","0BmCyokgRi",
+"aL6AJDLhzM","QWxoTXflUq","2hEEUksJby","QworulViBv","Cp3mZPb1pa","MojnP1v5hH","BCxeCqaofN","24ARFJkzUn","I7p2aKsjRK","FjHXRTCgPp",
+"QnJ1SjSjS3","RmDcrsuY4x","OHaBz0MR5X","5IhmG9XyT9","S2DfuRBhp0","d7vjMFFDui","5Mg9rhYBCK","tlILtKr8ys","16lHcHRxd8","8xEKzCp3mZ",
+"vOqCEogLgc","DLhzMrKDLJ","qUJMdThjNn","5VZjSy94nw","atef2SbRYy","9y4lwYjB9t","Yh1hFGSQwj","ZzJHWLbRTH","tvdkDazIWp","OUYuF6AFT0",
+"8RCUA8xEKz","VNCPdRBhp0","K4GS8suY4x","L7cGcjeskS","nlaBy9GXkX","S77LHt59lR","v2eC3yEfy9","EOE1oAmdQd","618DiZhwG1","Chuy3fqypy",
+"NOHszgf8rI","uPX7GAgJHQ","VjCZqJIqXi","K4GS845cIH","DG4sTRkQke","0ao3lm4bxU","o8Uydi7WMQ","kZANmZv7z0","y94nw5IhmG","7fKYUReKEW",
+"S77LHTCgPp","HRxd8yluBx","J2mQiXflUq","BCxeC14FLR","2ZHdkpiJSk","suY4xJXljW","YjB9tnFqik","b29RJK20wK","t59lRQ6Lix","ni2v1rhl0J",
+"qaofNjfREu","Cfgr3uvf7A","9rlg9he9IA","MmsIoRkQke","64s8N2hEEU","SbRYyW7cTs","0Wr5ybZLvS","SmGzvs93Ml","uLtKsnnP8o","VIlwPFnPFB",
+"DLhzM580YD","uLtKsa00b5","JJs5mfcJOy","HzZT8J2mQi","cmXIX7fKYU","IBe8kYf2Ec","Yh1hFYjB9t","C2IrcLewvM","MaJQsd7vjM","9XyT9k85Ae",
+"S2Dfu1LB1L","n1pmOLewvM","580YDJRJQB","4dEz60h1b1","fcJOyNhXdu","0BmCyUmaEv","e6e4zS77LH","RpBQmblLA9","5iGN5ciuWz","cShY2MK07Y",
+"0PktIHRxd8","jiVBP5drc6","FwEJzgjUTu","DG4sTCp3mZ","5drc6zQt6Q","Ta8f648cHL","618DiQ6Lix","ZuDtDtaOXK","ZUnqtMGlTF","iqv4kcmXIX",
+"IKxdLazIWp","OxWIHnlaBy","TXQ0ZciuWz","VIlwPprNT6","StlDJQssNC","MmKGJsx5Gl","MmsIo4QMc9","3otm6xXTI4","7fsYMPOUYS","ZuDtDjS1aj",
+"BpYhVCNHmv","MojnPy94nw","i7WMQ1LB1L","AgJHQwiHrZ","D6rByjeskS","2Nslm7X3uy","EOE1os4786","ksJbyHzZT8","d85a9Mkgy8","FcWrWKr8ys",
+"jS1ajVBjhz","7fsYMCfgr3","P6bcgzqH0W","n1pmO5Namm","VerEAtvdkD","GSQwjRmDcr","EoToPjfREu","RzaZAnlaBy","uTacx3otm6","zFgtBpT8wu",
+"fqypykB5nP","MmKGJC2Irc","FGzgp7fKYU","PYBf4RACuj","RACujzmLYD","b29RJoGu6x","In3NS0Kyfs","16lHcyvOMI","Pb1paQbxXc","W7cTsZzJHW",
+"brhlQQssNC","guMb8QChxs","hE1QlQssNC","i3pydiB08l","uAWypuoStw","FVMxoulk41","U3yw5faHir","yToGWUmaEv","7fsYMazIWp","JXljWLDk6f",
+"HlUbFjfREu","gf8rIAmdQd","zqH0WcL0aE","RBhp0Q6Lix","IRh48ZhwG1","fLNg8hYBCK","nlaBytAOsr","HP4337fsYM","OUqFMvOqCE","CdyBVWaim6",
+"brhlQv2eC3","HfyNQv2eC3","9rlg9uvf7A","jzUqRQYxC0","FwEJz14FLR","MmsIoHfyNQ","yofH3BGaQY","nFqikOUqFM","MmKGJAXpwE","m4bxUOz8yZ",
+"fFDrJ5Namm","yluBxi7WMQ","lXFOByvOMI","QYxC0EdBKc","9GXkXSbRYy","tvdkD45cIH","hYBCK0PktI","SmGzvyEfy9","DcpWBFwEJz","Zv7z0uN6r3",
+"2TRI7zmLYD","StlDJ8hJdt","2hEEU48cHL","QbxXc618Di","Fhtgl8xEKz","o8UydtjQxs","5NammzFgtB","dmoS7KZamH","m4bxUGSQwj","guMb8xciqp",
+"5IhmGzY1GY","Rxrsmh1zcH","jzUqRBFkb8","iqv4kmX2GE","ZuDtDyToGW","UmaEv29QAz","fcJOyDLhzM","zmLYDulk41","hSSvQyluBx","QClRLd7vjM",
+"Waim65drc6","I7p2ajzUqR","VerEACxVEf","rKDLJFnPFB","zQt6QL7cGc","FwEJzgtCA5","M6qcGS2Dfu","TXQ0ZQssNC","AmdQd14FLR","hUTw7JkzUn",
+"jtn0Xrz7Ut","n1pmOBGaQY","prNT6cL0aE","jSjS3BGaQY","5nmWvFcWrW","pvgjSWmadA","WmadAP6bcg","ni2v1XyPZN","5nmWvaFFss","J2mQiRBhp0",
+"MmKGJlm0pD","RxrsmBpYhV","a00b5rhl0J","VjCZq7X3uy","I7p2afcJOy","48cHLEoToP","Cp3mZksJby","v1HlnzmLYD","JIqXizFgtB","brhlQzY1GY",
+"RsQUqGv3Fq","LewvMHfyNQ","QWxoTiwzGk","In3NSMmsIo","jfREuGXdoH","8RCUAfcwDa","v8yFN8RCUA","9iGoT9XyT9","JKWYR4dEz6","9rlg9xciqp",
+"lkMUAM3zXL","4dEz664s8N","zHF1qaFFss","CNHmv2DREs","POUYSFcWrW","9y4lwpiJSk","gIYvEnnP8o","Mm8siFhtgl","sqVrfuQIcz","0ao3llCMxy",
+"OUqFMMaJQs","0YAGH7X3uy","TXQ0ZgIYvE","NAFuwMmsIo","WaWsvulk41","iwzGkOxWIH","FPfSE0Kyfs","AkKTki7WMQ","JXljWBpYhV","mz8gxjSjS3",
+"RxrsmlViBv","oVQp62hEEU","Vprf2MGlTF","Dz1R3B3qem","QClRL64s8N","zz4ZUaez9y","K4GS8S77LH","Ss0ZuI7p2a","uupzkiwzGk","zFgtBnnP8o",
+"iqv4kLbRTH","WPmlxThjNn","FhtglpiJSk","RmDcruJScX","xXTI4mz8gx","0Wr5yFxX9q","fcJOyzY1GY","XflUqhSSvQ","GXdoHhe9IA","fLNg8h1zcH",
+"VIlwPHfyNQ","iB08lKsjRK","P6bcgt59lR","tlILtVBjhz","gdQsSKZamH","pT8wugjUTu","oQ87rM6qcG","lH1ktC2Irc","MGlTFBFkb8","taOXKcmXIX",
+"ru4UGsoy9t","hUTw7tlILt","e6e4zCdyBV","lm0pDv2eC3","FVMxon1pmO","nFqikbrhlQ","ciuWzhSSvQ","MaJQsMezSW","JIqXiYh1hF","FGzgpyEfy9",
+"MK07YG1RhS","B3qemtuDyS","7lUXZyvOMI","b29RJbZLvS","DcpWBVprf2","CxVEfMmsIo","Mkgy8uTacx","lH1ktK20wK","lm0pDKsjRK","Dz1R32Yz7E",
+"BpYhVAkKTk","2hEEUTCgPp","G1RhSTXQ0Z","zY1GYY1mC0","MK07YCfgr3","AIYUublLA9","lXFOBCp3mZ","uPX7GHRxd8","i3pydFjHXR","5iGN5DcpWB",
+"BbwgAzbIYY","XflUqRACuj","0MR5Xhe9IA","Chuy3GSQwj","S77LHlsQGo","CxVEfHRxd8","tl72WFFDui","IjTwPy94nw","Uvlv4QClRL","MojnPuQIcz",
+"a00b5Mm8si","FnPFBDLhzM","rhl0JCNHmv","Waim6AgJHQ","azIWp0YAGH","gIYvE5iGN5","X6PinkB5nP","IRh481LB1L","lweGyBFkb8","CqqaDrKDLJ",
+"y94nws4786","NAFuwDQimp","RmDcrSbRYy","CIShGOUqFM","lXFOBpv0i7","RxrsmOz8yZ","5IhmGC2Irc","VerEA07n1c","GXdoHuAWyp","k85AennP8o",
+"ru4UGb29RJ","QYxC0cL0aE","JJs5mzHF1q","5drc6M3zXL","HzZT8VIlwP","uLtKs6q6L9","Pb1paFwEJz","I7p2aokgRi","QYxC0Waim6","FjHXRxXTI4",
+"X6PinEdBKc","16lHc29QAz","580YDbgJAz","okgRi29QAz","MGlTFlweGy","DQimpKASQ8","Pb1paNo0Qb","MmsIoDLhzM","tuDySQnJ1S","fqypyhe9IA",
+"lCMxyQ6Lix","CxVEfLewvM","Waim6cShY2","JXljWoQ87r","Dz1R3yvOMI","VBjhzRzaZA","U3yw5dhSuH","EoToPoVQp6","CqqaD5IhmG","he9IAe6e4z",
+"KASQ8uvf7A","rz7Utrz7Ut","FxX9qrKDLJ","s93Mlrz7Ut","7ku1p7hyVv","WDVWJHRxd8","7Ow5CBbwgA","W7cTsdQ586","NcICAChuy3","NAFuwGrDg7",
+"CxVEf0ao3l","ZJTXH0PktI","yEfy9Twano","yToGW5Mg9r","jtn0Xh1zcH","lm0pD48cHL","4dEz6guMb8","pWiOsKZamH","K4GS8RmDcr","FVMxo580YD",
+"NhXduzmLYD","FLsph7fKYU","AkKTklkMUA","5Namm8cVD3","5drc6aDGtS","cL0aEJRJQB","AgJHQl83Ud","Ss0ZunFqik","Cp3mZ5Mg9r","Yh1hFpmeCd",
+"hYBCKaFFss","dhSuH9XyT9","K20wKazIWp","3weIFMojnP","mX2GES2Dfu","ni2v1Uvlv4","yToGWpFrrl","zmLYDdhSuH","Mkgy8xciqp","nFqik0Kyfs",
+"uvf7ApFrrl","hYBCKk85Ae","GSQwjXflUq","Cfgr3MezSW","KASQ8Nxx9V","F6PT2xciqp","qUJMd9XyT9","OxWIHuQIcz","gIYvEEoToP","nFqikv1Hln",
+"Zv7z00PktI","uLtKsoGu6x","k85AePYBf4","bgJAzlCMxy","sqVrfogLgc","EoToPfqypy","In3NSFhtgl","s7MxkIKxdL","jtn0X2TRI7","hi5X7prNT6",
+"zmLYDbZLvS","fFDrJZuDtD","qaofNGXdoH","ix74rWmadA","nFqiktl72W","ru4UGReKEW","rz7UtJ2mQi","0h1b1IBe8k","lsQGoZv7z0","BGaQY0BmCy",
+"Yh1hFI7p2a","DQimpRmDcr","e6e4zfcJOy","GWqqXlj07Q","lweGyzQt6Q","IRh48WDVWJ","nlaByZhwG1","rz7UtNcICA","RBhp0euZA5","yEfy9d7vjM",
+"No0QbaDGtS","Fhtgl2Nslm","0BmCyyluBx","FwEJzfLNg8","5Mg9rlH1kt","14FLRv1Hln","pvgjSYjB9t","2ZHdkHlUbF","8U2nUCfgr3","Yf2EclsQGo",
+"EdBKclH1kt","9rlg9gdQsS","Yh1hFFGzgp","Chuy3ZuDtD","FcWrWi7WMQ","Waim6kZANm","aDGtSuZPqg","CdyBV2hEEU","lkMUAAOgEe","DcpWB8xEKz",
+"n8pJ9Q6hMC","BFkb8MmKGJ","FFDui8RCUA","qQxHPtuDyS","8RCUAECMvU","o8UydFNYIM","JIqXivOqCE","HP433pFrrl","1j5L8RpBQm","64s8NJKWYR",
+"SmGzvdmoS7","xciqpBbwgA","5ZaEzSmGzv","5VZjS0BmCy","NAFuwDcpWB","8TxD77hyVv","zqH0WpiJSk","UmaEvSbRYy","lm0pDOz8yZ","WmadA8U2nU",
+"KZamHGrDg7","jS1ajm4bxU","FxX9qbrhlQ","uN6r31v5hH","16lHcrKDLJ","4W0TlZzJHW","JXljWbZLvS","rhl0JDcpWB","azIWpaL6AJ","YjB9t5VZjS",
+"SjskQuLtKs","jS1ajiwzGk","gf8rIBFkb8","0MR5XFNYIM","Y1mC09eoRc","DLhzMXyPZN","tjQxsEoToP","CdyBVRxrsm","nFqikNAFuw","JkzUnd85a9",
+"jzUqRhYBCK","WMiS3m4bxU","FxX9qxciqp","HzZT8VLTy6","s7Mxk8FmFH","ZzJHWGSQwj","0BmCyWPmlx","Ss0ZuzbIYY","t98iWO3iyQ","FjHXRX6Pin",
+"y94nwrhl0J","8cVD3HfyNQ","oQ87rguMb8","IBe8kG1RhS","pFrrlP6bcg","9rlg9FLsph","lpF6WVprf2","No0QbkZANm","dpe1vb29RJ","ru4UGGSQwj",
+"qUJMdiKqhr","RsQUqtjQxs","DcpWBazIWp","ni2v1tjQxs","4W0TlkB5nP","zqH0WX6Pin","UlU3MRkQke","C2IrcfcwDa","HzZT8zHF1q","7fsYM7fsYM",
+"jiVBPzbIYY","2TRI7kB5nP","uQIczHRxd8","2Yz7E5Drn0","WPmlx8RCUA","4QMc9tAOsr","v8yFNsx5Gl","2TRI7JIqXi","uoStwbZLvS","FPfSEfFDrJ",
+"NOHszi7WMQ","tAOsrcQOnv","NAFuwciuWz","i3pydCNHmv","cmXIX4dEz6","lweGyKZamH","v2eC3tjQxs","uoStwAOgEe","uZPqg4dEz6","5IhmG9GXkX",
+"29QAzgjUTu","n8pJ9HzZT8","5IhmGcmXIX","8xEKzYw2oU","Kr8ysK4GS8","oVQp6C2Irc","MaJQslkMUA","ZhwG1zmLYD","lXFOB0PktI","7fKYUogLgc",
+"JIqXiDQimp","0BmCyM3zXL","X6Pina00b5","zbIYYnnP8o","0BmCypWiOs","HlUbFlH1kt","lsQGoxReec","wiHrZAgJHQ","ZUnqtFcWrW","0ao3luvf7A",
+"BGaQYzqH0W","QnJ1SlXFOB","CqqaD24ARF","DG4sTC2Irc","aFFsslkMUA","lj07Q8U2nU","OxWIHWmadA","No0QbIRh48","0YAGH2hEEU","vkCHHpT8wu",
+"Ss0Zu4QMc9","RkQke29QAz","ReKEW0h1b1","azIWpzz4ZU","SjskQv8yFN","jzUqRK4GS8","iqv4kQChxs","W3VFH16lHc","yToGWzFgtB","U3yw5SmGzv",
+"uLtKsBFkb8","sx5Glru4UG","SjskQRzaZA","Q6LixfmIK1","yEfy98RCUA","FjHXRblLA9","yofH3WMiS3","ix74rSs0Zu","hE1QlgjUTu","NhXduRpBQm",
+"0Wr5y5Namm","m4bxURBhp0","GrDg7ni2v1","RsQUqdhSuH","iKqhrgjUTu","fcwDaNOHsz","BpYhVMojnP","vLsmS8xEKz","Vprf2lkMUA","gdQsShe9IA",
+"uvf7AMmKGJ","RmDcrGrDg7","8U2nUWmadA","6AFT0piJSk","O3iyQlkMUA","hUTw7taOXK","ReKEWl83Ud","i3pydFcWrW","vOqCE8U2nU","U3yw5lj07Q",
+"uZPqgn1pmO","OHaBzokgRi","0Wr5yZUnqt","FjHXRsoy9t","vkCHHb29RJ","2hEEUtAOsr","b29RJFxX9q","iB08lfaHir","zz4ZUdpe1v","zFgtBcmXIX",
+"JKWYRrhl0J","2ZHdkCxVEf","8cVD3X6Pin","DQimpAmdQd","aL6AJVNCPd","e6e4zDz1R3","5nmWvPYBf4","SjskQHlUbF","nFqikPb1pa","zqH0W3otm6",
+"Y1mC0wDajX","FVMxoWMiS3","8xEKzqUJMd","OUqFMhi5X7","euZA545cIH","brhlQSjskQ","55rfBOHaBz","FcWrWVBjhz","DG4sTBbwgA","WreyPuPX7G",
+"YjB9tqaofN","C2IrcwiHrZ","fLNg87ku1p","JKWYRUl4a1","JRJQB2DREs","WaWsvxciqp","QbxXc2ZHdk","zFgtBJkzUn","rhl0JWMiS3","2NslmJKWYR",
+"aFFssZJTXH","yToGWe6e4z","tvdkDPOUYS","tuDyS0h1b1","8U2nUDQimp","pT8wuYjB9t","rhl0J2Yz7E","dmoS7StlDJ","Ta8f6lsQGo","oVQp6Q6Lix",
+"S77LHWaim6","9eoRcxciqp","jS1ajoGu6x","uJScXZUnqt","xciqpS2Dfu","L7cGc6AFT0","WPmlxd85a9","t98iWnFqik","lH1kt4QMc9","8U2nUB3qem",
+"8RCUA7Ow5C","SmGzvJkzUn","lweGyL7cGc","W7cTsiwzGk","fFDrJWreyP","F6PT2d85a9","dmoS7SbRYy","mz8gx0Kyfs","JXljWkZANm","YjB9tVLTy6",
+"piJSkfFDrJ","G1RhSStlDJ","29QAznlaBy","ZzJHW5Namm","mz8gxXflUq","9iGoTbgJAz","0Wr5yvkCHH","fmIK1SjskQ","hi5X7sqVrf","xciqpK20wK",
+"K4GS87X3uy","AmdQdAmdQd","G1RhSVIlwP","uJScXIjTwP","HlUbFuLtKs","8cVD3Ta8f6","BGaQYAkKTk","W3VFHguMb8","Yw2oUNo0Qb","Q6hMC2hEEU",
+"ZzJHWUmaEv","2TRI7TCgPp","cL0aE14FLR","OUqFMVNCPd","dhSuHblLA9","In3NSpAhR1","ulk41RkQke","b29RJFwEJz","IjTwPuJScX","2Yz7EK20wK",
+"DLhzM9eoRc","9y4lwBCxeC","45cIHfaHir","v8yFNlH1kt","oVQp6Ta8f6","QClRL9XyT9","Nxx9VRkQke","IjTwPOHaBz","VLTy6ECMvU","RmDcrZ4I1v",
+"qQxHPru4UG","ReKEWsoy9t","s4786pvgjS","6q6L92TRI7","BCxeCBpYhV","fmIK1rhl0J","fmIK1rz7Ut","sx5GlWDVWJ","QChxsOxWIH","s7MxkFxX9q",
+"jS1ajzmLYD","dQ586hUTw7","pmeCdKsjRK","jtn0Xs4786","618DiZuDtD","iqv4kzqH0W","NhXduCqqaD","t98iWlj07Q","dhSuHWaim6","VNCPdmz8gx",
+"rhl0JnFqik","Chuy3t59lR","MaJQsaez9y","8TxD7soy9t","JKWYR0PktI","n1pmOuAWyp","prNT6v1Hln","5drc6X6Pin","hSSvQ24ARF","FnPFB6q6L9",
+"G1RhSoGu6x","FNYIMmz8gx","7hyVv7lUXZ","QClRLgjUTu","Ta8f60h1b1","O3iyQi7WMQ","uPX7GOHaBz","wiHrZtaOXK","jtn0XD6rBy","0KyfsZv7z0",
+"euZA5uLtKs","JIqXiuJScX","KASQ8guMb8","he9IAMmsIo","OUqFMtjQxs","Yw2oUtuDyS","TXQ0ZRkQke","M3zXLoGu6x","uupzkFGzgp","hUTw7b29RJ",
+"OxWIH48cHL","GWqqXIn3NS","FGzgpBCxeC","sqVrf48cHL","fmIK1cmXIX","fLNg80ao3l","fmIK1lweGy","gf8rIxXTI4","9rlg9aDGtS","uAWypThjNn",
+"SWfouatef2","NcICASmGzv","QnJ1SRACuj","VerEAK20wK","vLsmSMojnP","HP4339rlg9","MaJQsS77LH","MGlTFuupzk","5drc6Zv7z0","0PktIY1mC0",
+"zHF1qsoy9t","EdBKcG1RhS","uN6r3JKWYR","lCMxyaL6AJ","WreyPCfgr3","vkCHHhSSvQ","jfREuEOE1o","v1HlnQworu","ZzJHWkB5nP","QYxC0FnPFB",
+"hi5X7VBjhz","CK5W77ku1p","h1zcHJkzUn","EoToP45cIH","soy9tLewvM","IKxdLtjQxs","ECMvUpT8wu","2ZHdkm4bxU","RBhp0v8yFN","k85Aek85Ae",
+"VBjhzSs0Zu","uTacxs7Mxk","ThjNnHzZT8","BGaQY2ZHdk","iKqhrvLsmS","FPfSEnnP8o","lj07QFLsph","HzZT8yEfy9","gjUTuoGu6x","euZA52hEEU",
+"9XyT9FPfSE","dpe1vOz8yZ","GSQwjDz1R3","uTacxulk41","zbIYYazIWp","Yf2Ec1v5hH","kB5nP7fKYU","NhXdu14FLR","CIShGgdQsS","uTacxJKWYR",
+"pAhR1gdQsS","2DREsOUYuF","FLsphWreyP","2Yz7EcmXIX","uPX7GcL0aE","n1pmO48cHL","uTacxMK07Y","xXTI4hYBCK","CIShGulk41","iB08ltAOsr",
+"JJs5mQssNC","Y1mC0U3yw5","2hEEU8xEKz","DQimpv1Hln","faHiriqv4k","JXljWe6e4z","a00b5DLhzM","No0QbFGzgp","pmeCdY1mC0","i3pydv1Hln",
+"prNT6cmXIX","v2eC3iqv4k","jtn0XZhwG1","Mkgy8djsrv","HlUbFy94nw","iwzGkKsjRK","JJs5mG1RhS","5VZjSdpe1v","fcwDajtn0X","8RCUAAmdQd",
+"ZuDtDPOUYS","FPfSEFhtgl","5Mg9rm4bxU","OUqFM24ARF","lj07QlViBv","5NammnFqik","zY1GYRACuj","0BmCyNAFuw","EOE1oMojnP","cmXIX0Wr5y",
+"S77LH1v5hH","OUYuFjeskS","JXljWD6rBy","lweGyIBe8k","RBhp0h1zcH","16lHcydG8U","sx5GlK20wK","RBhp0GrDg7","aDGtSJIqXi","CqqaDGrDg7",
+"VLTy6hUTw7","FnPFBuZPqg","O3iyQhUTw7","CxVEfx3LDe","s7MxkuPX7G","dhSuHpT8wu","ru4UGYw2oU","JJs5mW3VFH","s7MxkMmKGJ","lH1ktJIqXi",
+"Dz1R3J2mQi","9XyT9yvOMI","y94nwn8pJ9","i3pydEdBKc","tAOsr7hyVv","RmDcre6e4z","gf8rIfFDrJ","Y1mC0cShY2","FjHXRtaOXK","dmoS7WPmlx",
+"LDk6fZJTXH","VBjhz0Wr5y","ru4UGYOfrY","S77LHuLtKs","NOHszfmIK1","UmaEvCxVEf","EOE1oVIlwP","OxWIHEOE1o","xReecOHaBz","tuDySksJby",
+"XflUqjfREu","Y1mC08TxD7","GXdoHAOgEe","vLsmShe9IA","OUYuFVLTy6","nnP8oWMiS3","jS1ajGSQwj","ZhwG1IKxdL","WaWsvix74r","3otm6FcWrW",
+"o8UydFGzgp","taOXKXyPZN","Q6LixQWxoT","3weIFCp3mZ","ZuDtD5nmWv","FNYIMfcJOy","J2mQi1v5hH","Twano2DREs","64s8NVprf2","dmoS7lsQGo",
+"Dz1R3lweGy","JXljWRxrsm","jSjS3SmGzv","SmGzvlkMUA","0KyfsPOUYS","8TxD7NcICA","rKDLJYf2Ec","LewvMmz8gx","GrDg7G1RhS","WaWsvM3zXL",
+"hUTw7gjUTu","55rfBtjQxs","S77LHGWqqX","SbRYy1LB1L","hUTw7mz8gx","cQOnvLewvM","PYBf43otm6","yEfy9fqypy","JKWYRuQIcz","BCxeCS2Dfu",
+"wiHrZpiJSk","ZzJHW8hJdt","YOfrYn1pmO","7X3uySs0Zu","ogLgcZhwG1","0h1b1lXFOB","5VZjSciuWz","fcJOyKZamH","QChxsEoToP","I7p2aVprf2",
+"lsQGoW3VFH","pT8wucL0aE","gdQsSRxrsm","7ku1pQbxXc","BGaQY0MR5X","pFrrlwDajX","2hEEUWmadA","JkzUn2DREs","0PktI9y4lw","5IhmGiwzGk",
+"h1zcHBGaQY","8FmFH618Di","DG4sTZJTXH","HzZT8HRxd8","7ku1plH1kt","2DREszqH0W","k85Aeb29RJ","9rlg9zz4ZU","5iGN5JXljW","FVMxoEdBKc",
+"ZUnqtBGaQY","RBhp0MK07Y","OxWIHDQimp","HP433C2Irc","4W0TlFGzgp","RxrsmzHF1q","1v5hHEdBKc","jzUqRZv7z0","9iGoT5VZjS","l83UdHfyNQ",
+"KASQ8iB08l","55rfBQssNC","brhlQFNYIM","Ul4a15IhmG","cL0aEFxX9q","Fhtgli7WMQ","ECMvUNxx9V","QClRLbrhlQ","0Wr5ymX2GE","VIlwPOUYuF",
+"rKDLJW7cTs","euZA5JXljW","cShY2pFrrl","BCxeC5Drn0","8RCUACK5W7","5drc6rhl0J","piJSkblLA9","5nmWvZuDtD","4W0TloQ87r","jtn0X6q6L9",
+"pmeCdb29RJ","n1pmOMmsIo","pvgjS7fKYU","dmoS7lm0pD","BpYhVOz8yZ","ZJTXHYOfrY","x3LDeOxWIH","DcpWBMGlTF","W7cTsi7WMQ","zbIYY5IhmG",
+"kZANmuAWyp","7lUXZ2hEEU","lXFOBdpe1v","CIShGhe9IA","kZANmRBhp0","Ul4a1piJSk","0ao3lQssNC","y94nwlCMxy","X6PinDG4sT","RpBQmQworu",
+"iKqhrJkzUn","Yh1hFksJby","zQt6QhSSvQ","EoToPGSQwj","blLA9QbxXc","4QMc9dhSuH","FLsphlpF6W","AmdQdpT8wu","RxrsmoQ87r","azIWpKsjRK",
+"QYxC0HlUbF","5ZaEzHlUbF","kB5nPM3zXL","2DREsdjsrv","NhXduk85Ae","RkQkeChuy3","BFkb8HP433","fqypy5nmWv","soy9tDQimp","GrDg70YAGH",
+"okgRi0BmCy","RxrsmqUJMd","5NammzbIYY","580YDsoy9t","FVMxopv0i7","CxVEfX6Pin","o8UydGSQwj","hYBCKYjB9t","MK07YIKxdL","MmKGJBCxeC",
+"iwzGkCdyBV","yToGWzmLYD","JKWYRzz4ZU","jS1aj5iGN5","xReecYOfrY","Yf2EctlILt","lViBv1LB1L","faHirxXTI4","uAWyp2ZHdk","JRJQBlH1kt",
+"mX2GERpBQm","AmdQdQ6Lix","oGu6xXflUq","y94nwSmGzv","nnP8ouupzk","7fsYMlH1kt","TwanoQbxXc","16lHcaFFss","S2DfuMojnP","y94nwwDajX",
+"QWxoTFwEJz","pFrrlMmsIo","MezSWCIShG","ulk41iKqhr","suY4xlViBv","iwzGkl83Ud","fcJOy2Nslm","2ZHdkF6PT2","l83UdQbxXc","kZANm8hJdt",
+"L7cGcx3LDe","fcJOyTwano","tjQxsMK07Y","Ss0Zuix74r","v1Hln5Mg9r","7ku1pSbRYy","G1RhS0ao3l","KASQ8xReec","VNCPdpmeCd","B3qemzY1GY",
+"HRxd8RBhp0","AXpwE0Wr5y","uupzk8xEKz","hSSvQ7hyVv","MmsIoRsQUq","zqH0W5nmWv","Kr8ysyToGW","FnPFBGrDg7","ni2v1FwEJz","5ZaEzVIlwP",
+"he9IAdmoS7","d85a9Yf2Ec","hE1Ql1LB1L","brhlQvOqCE","GrDg7fmIK1","pmeCdNcICA","55rfBRBhp0","G1RhSlpF6W","HlUbFi7WMQ","Qworu24ARF",
+"UmaEvsuY4x","tjQxs9XyT9","qaofNSWfou","zmLYD1j5L8","RzaZAblLA9","yluBxKr8ys","EOE1oWmadA","blLA9s4786","JJs5mF6PT2","48cHLt59lR",
+"7lUXZix74r","i3pydHP433","2DREsi3pyd","qUJMdQworu","W3VFHNhXdu","WMiS3VerEA","ZUnqti7WMQ","0BmCyyvOMI","MaJQsfmIK1","yofH3CIShG",
+"i7WMQfLNg8","euZA5yluBx","7ku1p5Namm","Chuy3uTacx","7hyVv8U2nU","8U2nU48cHL","nlaBypWiOs","DLhzMs7Mxk","BGaQYxXTI4","KASQ8ZuDtD",
+"S2Dfusx5Gl","ReKEW5drc6","e6e4zDG4sT","55rfBaDGtS","8xEKzVIlwP","pFrrl7Ow5C","Dz1R3CNHmv","lkMUAdQ586","5drc6o8Uyd","yToGWFxX9q",
+"EdBKcHfyNQ","HlUbFU3yw5","QClRLW7cTs","uQIczECMvU","HRxd8M3zXL","jeskSprNT6","bgJAzQworu","vOqCE48cHL","tl72W5ZaEz","07n1cVerEA",
+"LDk6frKDLJ","DcpWBChuy3","VIlwPTCgPp","v1Hlnx3LDe","lm0pDMkgy8","i7WMQuAWyp","dhSuHxciqp","AOgEejfREu","qaofNpFrrl","WDVWJ7X3uy",
+"4W0TlKASQ8","Chuy3lj07Q","ZuDtDXflUq","n1pmOKZamH","5NammdQ586","WmadAQ6hMC","lm0pD8FmFH","VerEAKASQ8","guMb8AgJHQ","RzaZAcL0aE",
+"rz7UtDG4sT","W7cTsguMb8","HlUbFDLhzM","zHF1qtAOsr","oVQp6DG4sT","aFFss8cVD3","MojnPIn3NS","s7MxkJkzUn","Z4I1vhUTw7","Z4I1vDQimp",
+"ciuWz9y4lw","OUYuFS77LH","d85a907n1c","BbwgApFrrl","ZzJHWlH1kt","xXTI4ZhwG1","lCMxypWiOs","okgRiSjskQ","uLtKsqQxHP","lweGyX6Pin",
+"JXljW5Mg9r","gtCA5CxVEf","zz4ZUSjskQ","2hEEUF6PT2","iKqhrCxVEf","dpe1vOxWIH","fmIK1NhXdu","jiVBPFNYIM","dhSuHfcJOy","Nxx9Vni2v1",
+"VerEARpBQm","Chuy3FxX9q","qQxHPRmDcr","Chuy3No0Qb","uoStwFFDui","8RCUAlCMxy","JRJQB7X3uy","WMiS3DLhzM","DG4sTMm8si","RACujYw2oU",
+"vkCHHlweGy","2NslmFnPFB","Q6LixVIlwP","WmadAMGlTF","qaofNIjTwP","jzUqRtjQxs","qaofNcmXIX","VBjhzAkKTk","n1pmOJkzUn","K4GS80PktI",
+"7lUXZDcpWB","t59lRQChxs","8cVD3hYBCK","FcWrWpvgjS","Ss0ZuD6rBy","3otm6JRJQB","rhl0JeuZA5","n8pJ91j5L8","zbIYYtl72W","AgJHQZv7z0",
+"P6bcgGrDg7","TXQ0ZjSjS3","QYxC0L7cGc","MaJQs5Mg9r","pvgjSNhXdu","7fsYMCp3mZ","AXpwEtl72W","Dz1R3ni2v1","HP433i7WMQ","QnJ1SbrhlQ",
+"B3qemRBhp0","16lHcuQIcz","Z4I1vK20wK","iKqhrVerEA","nFqikcShY2","VerEAfcwDa","nlaByVprf2","sx5Gl48cHL","wiHrZQbxXc","tuDySbrhlQ",
+"lpF6WBFkb8","WPmlxHlUbF","No0QbZuDtD","5ZaEzNo0Qb","qaofNFVMxo","HfyNQSs0Zu","HfyNQyluBx","taOXKZUnqt","9GXkX2DREs","UmaEvjiVBP",
+"MezSWm4bxU","618DiMmKGJ","CqqaDWaim6","Nxx9VVIlwP","5ZaEzAkKTk","IKxdL8cVD3","hE1QljfREu","fcwDagtCA5","jfREuS77LH","8hJdtsx5Gl",
+"sqVrf0MR5X","he9IA16lHc","6q6L9suY4x","prNT6O3iyQ","0ao3lSmGzv","iwzGktaOXK","B3qemtl72W","No0QbcQOnv","16lHc9eoRc","QbxXcRkQke",
+"OHaBz8hJdt","FNYIMQ6hMC","uoStwhi5X7","ni2v1tvdkD","xReecjzUqR","W7cTsl83Ud","0PktIiqv4k","0PktIQssNC","guMb8fLNg8","1v5hH29QAz",
+"Dz1R3RzaZA","b29RJcL0aE","7Ow5CcL0aE","lXFOBSWfou","yToGWEOE1o","YOfrYzbIYY","W3VFHhUTw7","HP433DcpWB","taOXKLDk6f","cL0aERkQke",
+"zz4ZULDk6f","OHaBzM3zXL","GWqqXJIqXi","tAOsr5nmWv","taOXKhE1Ql","FNYIMd7vjM","AkKTkfqypy","CdyBVhYBCK","fcJOys93Ml","FGzgpoVQp6",
+"oQ87rzqH0W","7Ow5CfcwDa","uPX7G7Ow5C","cL0aEru4UG","FnPFBbZLvS","s4786b29RJ","Yw2oUWMiS3","ZhwG1ksJby","d7vjMogLgc","dQ586HlUbF",
+"8FmFH5drc6","NAFuwiKqhr","zqH0WQ6hMC","uupzklViBv","LDk6ftaOXK","CIShGMK07Y","MojnPsoy9t","StlDJqUJMd","Q6LixKZamH","QClRLuTacx",
+"s93MlQworu","xciqpCqqaD","bZLvSlweGy","W7cTsy94nw","vLsmSzmLYD","Mkgy8CNHmv","zqH0WwDajX","Oz8yZOz8yZ","i7WMQulk41","pWiOsAOgEe",
+"JJs5mHlUbF","DQimpIBe8k","MojnPn1pmO","uTacxtvdkD","0BmCyyEfy9","Yf2EcMGlTF","AmdQdFGzgp","oGu6xoVQp6","9y4lwK4GS8","rz7Utuvf7A",
+"Chuy3Oz8yZ","RkQke8cVD3","Waim6X6Pin","azIWpqaofN","mX2GEtAOsr","qaofNlCMxy","FNYIMvOqCE","Yf2Ec16lHc","MmKGJv2eC3","JKWYRJ2mQi",
+"NOHszzY1GY","IKxdLCK5W7","ix74ryluBx","GWqqX6AFT0","jfREuguMb8","FGzgpv2eC3","VLTy6JRJQB","zmLYDStlDJ","64s8ND6rBy","G1RhS9GXkX",
+"9XyT9mz8gx","wiHrZiB08l","LDk6fMezSW","L7cGcUl4a1","kB5nPFLsph","GXdoH7hyVv","0PktIvLsmS","pFrrltl72W","Pb1pal83Ud","Nxx9VI7p2a",
+"FVMxorz7Ut","LbRTHEOE1o","yEfy9pT8wu","tjQxsMGlTF","Cp3mZblLA9","Cfgr3DLhzM","jSjS30YAGH","TCgPpzQt6Q","AXpwEMmKGJ","wiHrZwDajX",
+"JkzUn3weIF","2ZHdk0Kyfs","EOE1oKASQ8","7fKYUFcWrW","8TxD76AFT0","Q6Lixs4786","iB08lWDVWJ","zmLYDjiVBP","BCxeCIn3NS","Twano29QAz",
+"No0Qbzz4ZU","tuDySQ6hMC","t98iWpT8wu","MGlTFjfREu","tlILtpWiOs","lpF6W4QMc9","AmdQd9GXkX","HP433GSQwj","No0Qb2DREs","6AFT04dEz6",
+"xReecCfgr3","y94nwgIYvE","GrDg7W3VFH","BpYhVe6e4z","8U2nU5drc6","M3zXLVprf2","RxrsmlXFOB","MmKGJMGlTF","G1RhS5drc6","VLTy6taOXK",
+"7fsYM16lHc","8hJdtfqypy","5IhmGd85a9","QbxXcni2v1","XyPZNvLsmS","HzZT80BmCy","JkzUnXflUq","4W0TlUlU3M","FhtglQWxoT","4QMc99iGoT",
+"rhl0JcL0aE","5Nammt59lR","oGu6xThjNn","Chuy3vLsmS","bgJAzt59lR","fmIK1MmKGJ","4W0TlQClRL","GWqqXzFgtB","QWxoTHlUbF","uPX7G2ZHdk",
+"GSQwjWPmlx","FPfSEReKEW","0MR5XuPX7G","8hJdtbgJAz","IjTwPFGzgp","uLtKsGWqqX","prNT6tl72W","Yh1hFoVQp6","aez9yFwEJz","rhl0JJRJQB",
+"Vprf2Q6hMC","I7p2a07n1c","jeskSoVQp6","fcwDaWaWsv","MojnPTCgPp","16lHcCqqaD","dmoS7RzaZA","JRJQBjeskS","h1zcHRpBQm","QYxC0CIShG",
+"wDajXU3yw5","hSSvQAOgEe","MmKGJVprf2","MGlTFbrhlQ","CxVEfd7vjM","ZzJHW0MR5X","L7cGcaez9y","bZLvSQssNC","F6PT2VerEA","MmsIo2hEEU",
+"2hEEU14FLR","Waim648cHL","aL6AJgIYvE","Yf2Ecsoy9t","RACujMezSW","MmKGJiKqhr","WaWsvJXljW","WDVWJsuY4x","JKWYRfcJOy","sqVrfhi5X7",
+"W7cTs14FLR","lweGyYf2Ec","BbwgA5nmWv","tlILtzmLYD","EoToPOHaBz","CIShGZv7z0","fcJOySmGzv","TCgPpgjUTu","nnP8oKsjRK","DLhzMuoStw",
+"StlDJrKDLJ","Mkgy8ogLgc","oGu6xFNYIM","1v5hHpiJSk","WaWsv5ZaEz","pmeCdLbRTH","4W0Tl0h1b1","5Drn0ZJTXH","zmLYDsuY4x","lpF6WciuWz",
+"45cIHuJScX","VNCPdjS1aj","jzUqRiKqhr","AgJHQmX2GE","wDajXuN6r3","Q6hMCgIYvE","WDVWJPb1pa","lj07Quvf7A","6AFT0y94nw","pmeCdfmIK1",
+"In3NS2DREs","s7MxkQYxC0","IjTwPKZamH","YOfrYyofH3","8cVD3QssNC","DG4sTjS1aj","gIYvEcShY2","UmaEvJIqXi","MK07Yulk41","jSjS38xEKz",
+"fmIK1618Di","azIWpFhtgl","uoStwkZANm","guMb8BpYhV","RzaZAUl4a1","EOE1ozqH0W","fcwDa2Yz7E","FnPFBMmKGJ","bgJAzLewvM","HzZT8ZJTXH",
+"aL6AJChuy3","FPfSEtjQxs","yToGWUlU3M","FGzgpQbxXc","ReKEWAgJHQ","6AFT0W7cTs","zHF1q0Wr5y","M3zXLuvf7A","qaofNKASQ8","S2DfuRzaZA",
+"lm0pDxXTI4","atef21LB1L","zHF1qKsjRK","S2DfuO3iyQ","W3VFHuAWyp","uZPqgjeskS","uupzkoQ87r","zY1GYfqypy","pv0i7Pb1pa","vkCHH2Nslm",
+"xReec3weIF","Ul4a107n1c","mX2GEuZPqg","uJScXQChxs","VLTy6pmeCd","FwEJzWDVWJ","4QMc9HfyNQ","s4786oQ87r","OxWIHQ6Lix","zFgtBUmaEv",
+"pmeCd8RCUA","5NammlViBv","ZzJHWyEfy9","Zv7z0hUTw7","qUJMdCxVEf","VIlwPW7cTs","CdyBVbZLvS","guMb89GXkX","AgJHQDG4sT","8hJdtcmXIX",
+"h1zcHCIShG","qaofNaFFss","ZUnqtpv0i7","pvgjSGv3Fq","580YDQ6Lix","s93MlkZANm","W3VFHDLhzM","KZamHgtCA5","Nxx9VFnPFB","SbRYy2Yz7E",
+"1v5hHd7vjM","pv0i7CK5W7","AIYUuWDVWJ","16lHczbIYY","ogLgcLbRTH","580YDZuDtD","FwEJzEOE1o","pFrrl6q6L9","WreyP9eoRc","fLNg8QbxXc",
+"SjskQFhtgl","AIYUuatef2","QYxC0F6PT2","aFFsswiHrZ","K4GS8piJSk","45cIHMojnP","AXpwEWPmlx","BpYhVfcwDa","LDk6fzQt6Q","ciuWzpFrrl",
+"5Mg9ruQIcz","ZhwG1taOXK","5NammdhSuH","2TRI7t98iW","EdBKclm0pD","F6PT2zQt6Q","jeskSOUYuF","Q6Lix8cVD3","8TxD7jfREu","K4GS88RCUA",
+"BCxeCni2v1","oQ87rOHaBz","2Yz7EWaim6","d85a9qaofN","qUJMdJIqXi","4dEz69GXkX","CIShGIBe8k","2TRI7e6e4z","m4bxUG1RhS","kB5nPMK07Y",
+"7Ow5COUYuF","OxWIHQYxC0","POUYSRsQUq","jiVBP14FLR","gtCA5QssNC","Q6LixOHaBz","uZPqguLtKs","M3zXLeuZA5","piJSkXyPZN","U3yw5tvdkD",
+"JIqXibZLvS","cmXIXRkQke","FLsphQssNC","ZhwG1BFkb8","d85a9m4bxU","rhl0J0Wr5y","i3pydazIWp","n8pJ9dhSuH","ECMvUVerEA","Ta8f62ZHdk",
+"azIWpJKWYR","ThjNnlXFOB","zqH0W5VZjS","uPX7GwiHrZ","9eoRcd7vjM","DG4sTl83Ud","5NammSbRYy","WPmlxReKEW","zY1GY9iGoT","kB5nPhe9IA",
+"ciuWz5Mg9r","o8Uyd9iGoT","hi5X76q6L9","2Yz7Eiqv4k","qQxHP45cIH","uAWypY1mC0","M3zXLYh1hF","RzaZADG4sT","6AFT0K20wK","fFDrJI7p2a",
+"ru4UGdQ586","FPfSEQnJ1S","kZANm5Namm","l83UdHRxd8","qUJMdt98iW","ru4UGlXFOB","DcpWBoVQp6","gIYvE580YD","FwEJzAIYUu","7ku1pIjTwP",
+"n1pmOt59lR","Waim6ReKEW","6AFT0NhXdu","M6qcGi7WMQ","1j5L8fFDrJ","CdyBVtaOXK","BGaQYVBjhz","jSjS3Kr8ys","LDk6fhE1Ql","G1RhSUmaEv",
+"CIShGBbwgA","cL0aElViBv","b29RJtlILt","7hyVvYjB9t","yluBxgjUTu","zbIYYStlDJ","580YDgIYvE","ix74rs7Mxk","MK07YCqqaD","O3iyQK4GS8",
+"14FLRReKEW","Ul4a1FLsph","7hyVvaez9y","uQIcz5VZjS","QWxoTblLA9","FnPFByofH3","FFDuiZ4I1v","IKxdLIBe8k","7lUXZ16lHc","AkKTkaez9y",
+"7ku1pqQxHP","uZPqgFwEJz","I7p2ajeskS","K20wK8RCUA","oGu6xRBhp0","pvgjSguMb8","1j5L8MojnP","bgJAzzHF1q","0KyfsC2Irc","gtCA5uPX7G",
+"oGu6xSmGzv","okgRiXflUq","b29RJGrDg7","POUYSjfREu","VBjhz6q6L9","9y4lwbgJAz","piJSkl83Ud","pT8wu4dEz6","3otm6gf8rI","W3VFHuLtKs",
+"DQimpWmadA","bZLvSGWqqX","Pb1pauQIcz","CNHmvWPmlx","SjskQG1RhS","CxVEf5VZjS","Chuy3StlDJ","hSSvQReKEW","EOE1oZzJHW","zHF1qi7WMQ",
+"I7p2aW3VFH","yofH3IRh48","zbIYY2Nslm","suY4xfqypy","y94nwFcWrW","VBjhzS77LH","dhSuHhSSvQ","8cVD39iGoT","W3VFH6q6L9","8cVD3uTacx",
+"Twano0PktI","taOXKJIqXi","Waim6dmoS7","618Di2DREs","uoStwFxX9q","2TRI7oVQp6","dQ5860PktI","ru4UGiB08l","8TxD7XyPZN","0KyfsTXQ0Z",
+"JKWYRSs0Zu","NAFuwokgRi","hUTw7RpBQm","xciqplsQGo","XflUqUmaEv","qaofNNOHsz","fFDrJdhSuH","uLtKsC2Irc","0ao3ldmoS7","Y1mC0uJScX",
+"euZA5VLTy6","aFFss7fsYM","OxWIHFNYIM","GrDg7C2Irc","No0Qb16lHc","uAWypqQxHP","suY4xTwano","ciuWznFqik","Zv7z0NAFuw","9XyT9dpe1v",
+"CIShGTXQ0Z","taOXKRkQke","lH1ktZuDtD","ZUnqtokgRi","CdyBVStlDJ","UmaEv0PktI","CxVEfWaim6","ix74rrz7Ut","9GXkXkB5nP","5VZjSn1pmO",
+"i7WMQlsQGo","GXdoHBGaQY","F6PT2x3LDe","L7cGc45cIH","7hyVvi3pyd","FPfSE7X3uy","8FmFH7Ow5C","euZA59rlg9","POUYSKASQ8","uTacxdjsrv",
+"lkMUAEoToP","FcWrWGrDg7","nlaByEOE1o","mX2GEvLsmS","8U2nUogLgc","64s8NM6qcG","9XyT9cL0aE","FnPFBMaJQs","7hyVvjSjS3","O3iyQaez9y",
+"Rxrsmiqv4k","Ul4a1EoToP","KsjRKwDajX","VerEAzmLYD","2DREsd85a9","14FLRy94nw","HP433sx5Gl","B3qempiJSk","l83Udn8pJ9","CNHmvAIYUu",
+"faHirWaWsv","WDVWJ1LB1L","dpe1vazIWp","fcJOyydG8U","xXTI4tuDyS","jiVBPIjTwP","7ku1pMmKGJ","UlU3MQworu","BbwgAkZANm","Chuy3cQOnv",
+"Q6LixzqH0W","lkMUAVNCPd","JIqXiUlU3M","POUYSblLA9","5IhmGjtn0X","AmdQduN6r3","rhl0JYOfrY","5Drn0ZUnqt","FFDuiWMiS3","rhl0J5nmWv",
+"MK07Y3weIF","uQIczDLhzM","ECMvUStlDJ","SjskQs93Ml","d85a9ThjNn","hYBCKKr8ys","CIShGCdyBV","QWxoTlkMUA","8TxD7Ta8f6","DLhzMGrDg7",
+"5iGN52ZHdk","vOqCE2Nslm","M6qcG9eoRc","ECMvUReKEW","UmaEvFnPFB","faHirb29RJ","CIShG4QMc9","RmDcr5Namm","qQxHPdQ586","L7cGce6e4z",
+"AXpwE0ao3l","2Yz7EGv3Fq","uZPqgvLsmS","DQimpCxVEf","DLhzMCK5W7","Y1mC0K4GS8","SmGzvMK07Y","FhtglEdBKc","5nmWvdQ586","suY4xOUYuF",
+"FxX9q2TRI7","ZzJHW2TRI7","Dz1R3oQ87r","1v5hHTCgPp","ix74rBbwgA","16lHcuZPqg","1j5L89XyT9","hYBCKBpYhV","QworuaL6AJ","1LB1LQworu",
+"WreyPCK5W7","rhl0JW7cTs","OxWIHSmGzv","5Namm0YAGH","580YD55rfB","pv0i78FmFH","euZA5DQimp","S77LH7hyVv","IRh48lCMxy","hi5X7Mm8si",
+"he9IAJKWYR","ru4UGHzZT8","zQt6Q2DREs","pWiOsaFFss","n8pJ9iB08l","Dz1R3nFqik","3weIFkZANm","FNYIMQbxXc","KASQ8S77LH","MmKGJSs0Zu",
+"9y4lwcL0aE","lH1ktVjCZq","pFrrliKqhr","fmIK1fcwDa","t59lRyluBx","gf8rIlj07Q","SmGzvIRh48","GXdoHyofH3","FcWrWaFFss","VIlwPPb1pa",
+"sqVrffqypy","Dz1R3IKxdL","BCxeCfFDrJ","rhl0JjfREu","K20wKgdQsS","qaofNdmoS7","UlU3Mfqypy","kZANmFhtgl","jeskShe9IA","oQ87rGrDg7",
+"WDVWJDcpWB","aez9ylH1kt","y94nw580YD","Waim64W0Tl","LewvMrhl0J","PYBf4QYxC0","Zv7z0v2eC3","JKWYRuoStw","aL6AJL7cGc","i7WMQ5Drn0",
+"fFDrJy94nw","fFDrJjeskS","suY4xRmDcr","XflUqAmdQd","RACujIKxdL","hUTw7C2Irc","SWfouS2Dfu","lm0pD9GXkX","cShY2prNT6","Cfgr3jtn0X",
+"8RCUAblLA9","Zv7z0CxVEf","OUYuFoGu6x","W7cTsyvOMI","6AFT0Qworu","zbIYYfLNg8","zY1GYlCMxy","lpF6WO3iyQ","zQt6QReKEW","Cfgr3ECMvU",
+"K20wKgtCA5","fcJOyuN6r3","VerEA1j5L8","1j5L8GrDg7","DLhzMWaim6","RmDcryvOMI","uQIczWaim6","EdBKcn1pmO","TwanoAkKTk","QYxC0blLA9",
+"NhXduOz8yZ","8U2nUNcICA","gIYvEcmXIX","JKWYRTCgPp","n8pJ9KsjRK","hSSvQEdBKc","nnP8o7ku1p","Mm8sit98iW","Gv3FqAkKTk","AmdQd0PktI",
+"W3VFHFhtgl","RmDcrbrhlQ","Ta8f6gf8rI","v2eC3M6qcG","pv0i7lpF6W","MaJQsm4bxU","vOqCEZ4I1v","ReKEWuAWyp","fmIK1jeskS","oGu6x5drc6",
+"3weIFPOUYS","s4786tjQxs","ECMvUJXljW","Mkgy8mX2GE","Y1mC0i3pyd","gjUTuiB08l","RACujTa8f6","aDGtSvkCHH","s7MxkDG4sT","qQxHPdhSuH",
+"WDVWJuoStw","oGu6xrKDLJ","SmGzvjS1aj","d85a9Rxrsm","QworuL7cGc","GXdoHzz4ZU","lViBvI7p2a","tjQxs07n1c","K4GS88cVD3","hYBCKCxVEf",
+"RpBQmFNYIM","F6PT2Nxx9V","Mkgy8DG4sT","JKWYRy94nw","h1zcHXyPZN","MezSW1LB1L","QssNCjzUqR","Mm8siyEfy9","x3LDeqUJMd","7ku1pHfyNQ",
+"WaWsvMojnP","iqv4kFFDui","t98iWOz8yZ","uAWypi7WMQ","lCMxyOz8yZ","guMb85nmWv","FPfSEDz1R3","48cHLv8yFN","FhtglBpYhV","JIqXiv8yFN",
+"IBe8kXflUq","8U2nUVNCPd","uvf7Aru4UG","Waim6FGzgp","07n1ctjQxs","RmDcrAgJHQ","jSjS3FwEJz","8U2nUSjskQ","lViBvhUTw7","EoToPD6rBy",
+"WPmlxv1Hln","Vprf2dQ586","sqVrf0BmCy","24ARFECMvU","9rlg9rhl0J","ulk419XyT9","ksJbyYh1hF","oQ87rD6rBy","QworupT8wu","ni2v1CdyBV",
+"fFDrJ5IhmG","NhXdu64s8N","HRxd8kB5nP","ZUnqt48cHL","JXljW2DREs","TwanoazIWp","hYBCKFxX9q","uJScXSjskQ","RmDcrLDk6f","5IhmGCqqaD",
+"9y4lwtlILt","jfREuoGu6x","POUYSmX2GE","djsrvuQIcz","bgJAzaFFss","ZUnqt618Di","zY1GYRxrsm","pAhR1ZJTXH","vLsmShUTw7","v8yFN3weIF",
+"16lHcPYBf4","gdQsSdQ586","xReecs4786","OHaBzSjskQ","uQIczydG8U","BGaQYn8pJ9","he9IAzz4ZU","Z4I1vkB5nP","nlaBySs0Zu","s93MllweGy",
+"WmadAs7Mxk","6q6L9JIqXi","07n1cPb1pa","oQ87r618Di","ZJTXHx3LDe","FFDuiuQIcz","yEfy9IBe8k","EOE1oMezSW","9y4lwVprf2","RBhp0lm0pD",
+"lViBvhSSvQ","pWiOsHP433","Waim6Gv3Fq","Ta8f6ReKEW","GXdoHCdyBV","ciuWz8RCUA","uQIczx3LDe","JXljWzQt6Q","4W0Tlulk41","AkKTkokgRi",
+"brhlQWPmlx","XflUqYf2Ec","GXdoHHlUbF","0Wr5yLDk6f","iB08lx3LDe","aL6AJIKxdL","MGlTFCK5W7","8xEKz5nmWv","GSQwj7lUXZ","RACujvOqCE",
+"gIYvE3otm6","1j5L8Ta8f6","Gv3FqRsQUq","ix74rAOgEe","P6bcgYOfrY","0MR5XbZLvS","W3VFHIn3NS","2hEEU5Drn0","RxrsmaDGtS","7fsYMMmsIo",
+"0YAGHEOE1o","d85a9FjHXR","Rxrsmv1Hln","CqqaDOxWIH","2DREsx3LDe","prNT63otm6","M3zXLoVQp6","0MR5XFxX9q","AXpwEU3yw5","brhlQaez9y",
+"iqv4k618Di","HlUbFQworu","JXljWZ4I1v","fLNg8NOHsz","zbIYYPb1pa","lpF6WCNHmv","5IhmGZuDtD","zFgtBydG8U","2Nslmsx5Gl","S2DfuGXdoH",
+"lm0pDnlaBy","CK5W7I7p2a","uQIczCNHmv","hi5X7RBhp0","vLsmSs7Mxk","CK5W7RBhp0","UlU3Ma00b5","DG4sTJXljW","n1pmOjSjS3","yvOMIlH1kt",
+"euZA5i7WMQ","2DREszY1GY","Oz8yZYh1hF","8cVD3HP433","QClRLgtCA5","n1pmO2hEEU","Ta8f6blLA9","QbxXclm0pD","SmGzv4QMc9","IBe8kQbxXc",
+"o8UydqQxHP","he9IA8hJdt","iKqhrIBe8k","0MR5XVBjhz","l83Udix74r","yofH3ogLgc","3weIFzbIYY","fmIK1G1RhS","zqH0WYjB9t","7ku1pyofH3",
+"C2Irci7WMQ","MezSWECMvU","DLhzMVjCZq","kZANmVprf2","gjUTuIKxdL","S2Dfugf8rI","HzZT8hYBCK","sqVrflj07Q","faHirlm0pD","8RCUAW7cTs",
+"07n1cW7cTs","pT8wuMm8si","euZA5ZuDtD","lsQGoM3zXL","RkQkeKsjRK","XyPZNZuDtD","ni2v1ReKEW","AmdQdY1mC0","yEfy9GrDg7","iwzGkpv0i7",
+"ogLgczFgtB","KASQ8cL0aE","9eoRc618Di","cL0aEVBjhz","soy9tzmLYD","8RCUAKASQ8","PYBf4rhl0J","qaofNAOgEe","WmadAyEfy9","MGlTF618Di",
+"cL0aECfgr3","dmoS7D6rBy","2ZHdkRBhp0","7fKYUkZANm","6AFT0wDajX","Zv7z0GXdoH","CIShGzQt6Q","9eoRczbIYY","BFkb87ku1p","2DREsRxrsm",
+"48cHL0YAGH","J2mQi0BmCy","Dz1R3yluBx","azIWp7lUXZ","cShY2LDk6f","3weIFwDajX","K20wKe6e4z","HfyNQM3zXL","pmeCduN6r3","8U2nUnFqik",
+"zmLYDwDajX","FnPFBXyPZN","WaWsvNxx9V","v1HlnhUTw7","7fsYM7ku1p","StlDJqaofN","y94nwatef2","d7vjMNOHsz","YOfrYMmKGJ","BFkb8iwzGk",
+"NOHszGWqqX","WmadAnlaBy","pv0i7WmadA","ogLgc8hJdt","9GXkXqQxHP","nFqikQClRL","d85a9ReKEW","8xEKzJ2mQi","tlILtfcJOy","FNYIM45cIH",
+"CdyBVBCxeC","Twanoo8Uyd","lH1ktbZLvS","FcWrWi3pyd","pFrrlaFFss","FnPFB6AFT0","RACujjzUqR","Mkgy8tjQxs","NAFuwv2eC3","L7cGc2DREs",
+"FwEJzfcwDa","ECMvUt59lR","WMiS3U3yw5","tlILtFLsph","Q6hMC5ZaEz","0ao3lO3iyQ","Q6Lixaez9y","iKqhrVNCPd","zHF1qbZLvS","FcWrWsx5Gl",
+"KsjRKFGzgp","guMb88hJdt","K20wKzbIYY","ZUnqtWaim6","nFqikwiHrZ","nnP8oGv3Fq","y94nwtAOsr","64s8NAXpwE","14FLRWreyP","tuDySQClRL",
+"0YAGHsqVrf","tlILtNcICA","gtCA5I7p2a","8xEKz4W0Tl","MmsIojeskS","jeskSDz1R3","AgJHQm4bxU","29QAzFjHXR","2Nslm2TRI7","LDk6fQYxC0",
+"tAOsrMaJQs","S77LHK20wK","Nxx9Vrz7Ut","RkQkeNxx9V","lweGyWDVWJ","TwanodhSuH","WDVWJfcwDa","blLA9IBe8k","xReecDQimp","Ta8f6Waim6",
+"7fKYUgIYvE","FPfSEsuY4x","16lHcCIShG","euZA5uupzk","K20wKQssNC","pmeCdHRxd8","5IhmGru4UG","ru4UGzQt6Q","uPX7GLewvM","5IhmGFnPFB",
+"zHF1qL7cGc","uvf7AblLA9","qQxHPEoToP","7X3uyIBe8k","UlU3MHfyNQ","Q6LixuAWyp","fcJOyvOqCE","16lHcuoStw","CK5W7pT8wu","QClRLlsQGo",
+"QYxC0mz8gx","Oz8yZlXFOB","djsrvgjUTu","HRxd8piJSk","45cIHlkMUA","Yh1hFRpBQm","jtn0XzmLYD","hUTw7DG4sT","uQIczI7p2a","dmoS7lweGy",
+"n8pJ9d85a9","Ss0Zuv2eC3","faHirni2v1","Nxx9VrKDLJ","QnJ1SzbIYY","qaofNS77LH","hYBCKZJTXH","hYBCK7X3uy","Uvlv4xciqp","3weIFNAFuw",
+"1v5hHJkzUn","JKWYR1j5L8","t59lRCqqaD","TwanooVQp6","fqypySs0Zu","lpF6WBCxeC","pAhR1MGlTF","6AFT0PYBf4","AOgEesx5Gl","ulk41ciuWz",
+"aDGtSC2Irc","Yf2EcHfyNQ","euZA59XyT9","dQ5862TRI7","M3zXLQClRL","7X3uyRkQke","aL6AJuAWyp","HP433GWqqX","cmXIXOHaBz","9eoRcJkzUn",
+"n1pmOn8pJ9","6AFT08RCUA","Yh1hFMmsIo","LDk6fFcWrW","ru4UGVBjhz","ulk41Yw2oU","tlILtAOgEe","brhlQhYBCK","zqH0WQssNC","jS1ajoQ87r",
+"uoStwHRxd8","tjQxs7ku1p","UlU3MHRxd8","JIqXi5nmWv","iwzGkWaim6","gf8rIJ2mQi","DLhzMpv0i7","ni2v1AgJHQ","48cHLMkgy8","iB08lpT8wu",
+"0YAGHuLtKs","oGu6xUmaEv","UmaEv2hEEU","ciuWzatef2","YjB9tMm8si","9GXkXFxX9q","HlUbFhYBCK","Y1mC0vOqCE","2TRI7pvgjS","5iGN5pmeCd",
+"rhl0JUmaEv","P6bcgdpe1v","fLNg8QssNC","5iGN5jeskS","45cIHnlaBy","VBjhz55rfB","Oz8yZFnPFB","faHiriB08l","0KyfsOHaBz","zqH0WlsQGo",
+"vLsmSd85a9","Nxx9VjS1aj","tlILtCNHmv","IRh48brhlQ","QClRLGrDg7","b29RJ8TxD7","djsrvmX2GE","tAOsr7fsYM","7X3uy3otm6","t98iWi7WMQ",
+"gIYvEDG4sT","bgJAz55rfB","Cfgr3QWxoT","16lHccmXIX","6q6L9hYBCK","Y1mC0FwEJz","dQ586C2Irc","9eoRce6e4z","gjUTuCp3mZ","AmdQdIRh48",
+"Ta8f6GXdoH","AXpwEuZPqg","tjQxszQt6Q","bZLvSdQ586","zQt6QlkMUA","djsrvnlaBy","fqypyi7WMQ","lViBvFLsph","lkMUA1j5L8","nnP8o8RCUA",
+"580YDI7p2a","WmadASbRYy","Ta8f6t98iW","X6PinKr8ys","HlUbFVLTy6","Q6LixkB5nP","rz7Ut9y4lw","iqv4kVprf2","tlILtulk41","SWfouUlU3M",
+"pFrrlFVMxo","uLtKsyvOMI","aL6AJVIlwP","VjCZqqaofN","aez9yKZamH","cL0aEfLNg8","0KyfsaL6AJ","7X3uyVLTy6","jSjS3WmadA","1LB1LHlUbF",
+"5Drn0t59lR","Ss0ZuHfyNQ","pv0i7Dz1R3","3otm6K20wK","5Drn0C2Irc","brhlQjzUqR","8cVD3AkKTk","ZUnqthi5X7","y94nwqQxHP","GSQwjHP433",
+"pv0i7ZuDtD","LDk6fYjB9t","djsrvZuDtD","IBe8k2ZHdk","oVQp67ku1p","SjskQ9GXkX","HzZT8UmaEv","0PktIHP433","sx5GlRmDcr","prNT6lj07Q",
+"tjQxsQnJ1S","FNYIMQ6Lix","zqH0Wru4UG","hSSvQ9eoRc","oQ87rNo0Qb","uoStwjSjS3","mz8gxIBe8k","5IhmG5Drn0","jS1aj14FLR","Cp3mZF6PT2",
+"24ARFGSQwj","0PktIMmKGJ","kZANmIRh48","VNCPdSbRYy","ni2v1ZuDtD","qaofNAXpwE","Oz8yZ9XyT9","v8yFNKASQ8","soy9tOUqFM","zY1GYfcJOy",
+"v1HlnWaim6","a00b5gf8rI","FhtglDLhzM","QClRLS2Dfu","iKqhr0h1b1","618Di2ZHdk","0KyfsD6rBy","uupzkjSjS3","aFFssPb1pa","vOqCEb29RJ",
+"FwEJzxReec","9GXkXpT8wu","6AFT0fmIK1","rz7UtcL0aE","HfyNQ9eoRc","v1Hln0Kyfs","dmoS7s4786","e6e4zM3zXL","vLsmShSSvQ","Yw2oUIjTwP",
+"uLtKsprNT6","8U2nUWaWsv","JXljWsqVrf","brhlQYw2oU","mX2GEHfyNQ","mz8gxWPmlx","b29RJfqypy","QbxXc7lUXZ","fcJOyiqv4k","0MR5Xv2eC3",
+"uN6r3POUYS","v8yFNMojnP","s47865ZaEz","lkMUA64s8N","hUTw78cVD3","X6Pin618Di","HfyNQs4786","prNT6t59lR","0YAGHU3yw5","4QMc9k85Ae",
+"v2eC3LDk6f","YOfrYeuZA5","2hEEUvLsmS","LewvMS2Dfu","J2mQi1LB1L","iqv4ks4786","BCxeC7ku1p","iKqhrpAhR1","NOHszd85a9","YOfrYQChxs",
+"NhXduRmDcr","kB5nPWmadA","K20wKcmXIX","FVMxoWPmlx","sx5GldhSuH","zHF1qMm8si","I7p2a55rfB","sqVrfpv0i7","Mkgy87hyVv","CxVEf0YAGH",
+"FnPFBh1zcH","8hJdtfaHir","ydG8UDcpWB","nlaBySmGzv","kZANmI7p2a","s4786lViBv","tAOsryvOMI","FNYIMCxVEf","gf8rIQChxs","IBe8klH1kt",
+"lsQGogdQsS","Dz1R3KZamH","29QAzTa8f6","BbwgAS2Dfu","Yf2Ec8RCUA","QbxXcsqVrf","HP433aFFss","FGzgpi3pyd","piJSkZUnqt","AIYUuHfyNQ",
+"TXQ0ZrKDLJ","jSjS3qQxHP","s93Ml580YD","OxWIH8hJdt","9y4lwwDajX","MojnPCNHmv","tjQxsjS1aj","OUYuFsqVrf","YjB9tMezSW","tuDySn8pJ9",
+"pv0i7HfyNQ","okgRijzUqR","BpYhVpFrrl","TXQ0Z1j5L8","Z4I1vChuy3","uoStwRsQUq","SmGzv3weIF","Kr8ysulk41","QYxC0QClRL","hSSvQVBjhz",
+"HfyNQtaOXK","fLNg8qUJMd","14FLRvkCHH","pWiOsK20wK","jfREudhSuH","14FLRJkzUn","fmIK1i3pyd","ru4UGgIYvE","2DREslpF6W","7hyVvrKDLJ",
+"TwanouJScX","zmLYDTXQ0Z","dpe1vyToGW","WmadA7X3uy","dmoS7jiVBP","Waim6h1zcH","fFDrJC2Irc","P6bcgtAOsr","XyPZNVIlwP","5VZjS3weIF",
+"tvdkDs4786","IBe8ksuY4x","hYBCK3weIF","pAhR12hEEU","pFrrliqv4k","FxX9q0Kyfs","W3VFHKsjRK","0KyfsqaofN","i7WMQM3zXL","4W0TlgIYvE",
+"dpe1vWaWsv","QClRLECMvU","yEfy9RzaZA","tlILtSmGzv","Yf2EcVprf2","lH1kt1j5L8","WPmlxKsjRK","L7cGcTCgPp","oGu6xVjCZq","ZUnqtFLsph",
+"ciuWzFNYIM","ZuDtDvkCHH","t98iWCK5W7","aDGtS7fsYM","BbwgAl83Ud","xXTI4W3VFH","Vprf2JXljW","VIlwPrKDLJ","OHaBzAIYUu","aFFssZv7z0",
+"rhl0Juvf7A","DQimpvkCHH","C2IrcoVQp6","iKqhriKqhr","VBjhzqQxHP","k85AeyToGW","0Wr5y3otm6","uupzklkMUA","zY1GY5Mg9r","sx5Glatef2",
+"cShY2qaofN","8FmFH2Nslm","xXTI4WreyP","OUYuFWaim6","Ul4a1uoStw","OHaBzFwEJz","S2Dfuxciqp","3otm6OUYuF","UlU3MyvOMI","VLTy65iGN5",
+"gdQsSmz8gx","14FLRZJTXH","zqH0Wn1pmO","QssNC9iGoT","AOgEejzUqR","bgJAzKZamH","Chuy3RzaZA","I7p2a7fsYM","QYxC0ECMvU","x3LDeuQIcz",
+"0Kyfsm4bxU","WMiS3ZzJHW","CqqaDs4786","LewvMHzZT8","n8pJ9MK07Y","5NammChuy3","n1pmOMmKGJ","C2IrcuZPqg","v2eC3MmKGJ","wDajXiwzGk",
+"AmdQdtaOXK","7X3uyKsjRK","GSQwjJRJQB","lXFOBlViBv","KZamH2TRI7","FGzgpNo0Qb","AkKTkbgJAz","aDGtSlH1kt","cShY2StlDJ","QYxC0yToGW",
+"RkQkeFhtgl","QssNCWPmlx","VNCPdkZANm","StlDJdjsrv","uZPqg5iGN5","zmLYDMkgy8","5IhmGNcICA","7ku1pNhXdu","MGlTFDQimp","cL0aEbZLvS",
+"AIYUuZzJHW","s93MlIKxdL","G1RhS9eoRc","pv0i7RzaZA","48cHLcQOnv","ThjNn8U2nU","7ku1pL7cGc","K4GS8tAOsr","GrDg7MmKGJ","4QMc9ksJby",
+"zqH0Wsoy9t","OUYuFECMvU","ydG8UMezSW","Ta8f6RmDcr","B3qemAkKTk","7Ow5CRpBQm","uoStw0YAGH","DLhzMDQimp","KsjRKMojnP","VNCPdru4UG",
+"0PktIThjNn","iKqhrPYBf4","jSjS39iGoT","6q6L9ix74r","FjHXRoGu6x","FGzgpCNHmv","atef2OUqFM","yToGWFwEJz","55rfBiB08l","Y1mC0JRJQB",
+"vLsmSZ4I1v","wDajXcL0aE","X6PinpiJSk","vOqCE14FLR","FjHXRhE1Ql","9eoRc8U2nU","ksJbyFwEJz","618DiyToGW","cL0aEzQt6Q","Vprf2xReec",
+"7hyVvZv7z0","EoToPEOE1o","FjHXR1v5hH","a00b5jzUqR","0YAGHNOHsz","FxX9qStlDJ","9rlg9FxX9q","AIYUuMezSW","TXQ0ZFFDui","G1RhSPb1pa",
+"pFrrl9iGoT","Mkgy8M3zXL","pvgjScmXIX","RpBQmXflUq","QworuQnJ1S","Waim6aL6AJ","FPfSElH1kt","SjskQC2Irc","uJScXNhXdu","2ZHdkyluBx",
+"i3pydKASQ8","zbIYYmX2GE","zY1GYyToGW","h1zcHFxX9q","AgJHQaL6AJ","k85AeRACuj","x3LDeX6Pin","WMiS3Kr8ys","Ss0ZuQssNC","AmdQdgdQsS",
+"45cIHsuY4x","X6Pinaez9y","soy9tUl4a1","IKxdLRxrsm","9rlg98FmFH","HRxd82ZHdk","NhXduVIlwP","pFrrlDG4sT","9GXkX580YD","zQt6QU3yw5",
+"Q6hMCxXTI4","Q6LixAgJHQ","MmsIoKZamH","7fKYUpT8wu","cQOnvZzJHW","64s8NRpBQm","0h1b1uupzk","djsrvHzZT8","1v5hHXyPZN","iqv4k5nmWv",
+"WPmlxFcWrW","AIYUuulk41","SjskQPb1pa","jeskS3weIF","pmeCdzHF1q","5IhmGn8pJ9","blLA9tjQxs","pT8wu5IhmG","ciuWzUl4a1","3otm69iGoT",
+"zz4ZUk85Ae","rKDLJbgJAz","KZamHRBhp0","hE1QlHRxd8","v8yFNJRJQB","zz4ZUQYxC0","i7WMQZ4I1v","7fKYUiqv4k","0YAGHy94nw","fcwDas7Mxk",
+"mX2GE8FmFH","yToGWuoStw","tAOsrlViBv","k85AecL0aE","xciqpOz8yZ","aez9yokgRi","yluBxfmIK1","HlUbFd7vjM","RBhp064s8N","HfyNQQ6hMC",
+"nFqik8TxD7","atef2CNHmv","lViBvS77LH","NAFuw4W0Tl","7X3uyhYBCK","t59lRv1Hln","KASQ8m4bxU","VIlwPDG4sT","he9IAUmaEv","gf8rIYf2Ec",
+"uAWypQYxC0","S77LHRmDcr","7ku1pYw2oU","RACujNo0Qb","IBe8klCMxy","UlU3MtlILt","qQxHPnlaBy","OUqFMQbxXc","AgJHQ48cHL","GWqqXfcwDa",
+"5nmWvFjHXR","ZhwG164s8N","wDajXSWfou","5nmWvd85a9","bZLvSSmGzv","suY4x2hEEU","CqqaDM3zXL","Nxx9Vsx5Gl","ni2v1LDk6f","I7p2aChuy3",
+"fcJOyRACuj","QssNCI7p2a","yofH30YAGH","v8yFNWDVWJ","fmIK1nnP8o","zY1GYzFgtB","zz4ZU2hEEU","prNT6QbxXc","Cfgr3nlaBy","0h1b1d85a9",
+"lViBvLbRTH","lXFOBZhwG1","lpF6WCdyBV","SmGzvXflUq","iqv4kReKEW","Chuy3aFFss","WaWsvuupzk","tjQxs2Nslm","o8UyduLtKs","IBe8kQWxoT",
+"B3qemciuWz","7fsYMuLtKs","dhSuHSWfou","7ku1pXflUq","AmdQdfmIK1","CxVEf0Wr5y","UlU3MJkzUn","uoStwwiHrZ","lViBvDz1R3","UlU3MD6rBy",
+"ksJbyIBe8k","2hEEUpWiOs","lj07QRzaZA","xReecgjUTu","ni2v1iwzGk","YjB9tkB5nP","RpBQm8FmFH","8cVD3Cfgr3","8cVD34dEz6","SmGzvRmDcr",
+"mX2GE6q6L9","Q6Lix45cIH","djsrvMaJQs","UmaEvOUqFM","0PktIcmXIX","fmIK1POUYS","yToGW0Kyfs","pmeCdTXQ0Z","Mkgy8IRh48","soy9tPOUYS",
+"Yh1hFBpYhV","xXTI424ARF","SjskQzQt6Q","POUYSMmsIo","ZuDtDCdyBV","xciqpRBhp0","6AFT05Drn0","3otm6yofH3","FPfSEfmIK1","D6rBymz8gx",
+"dmoS7cL0aE","QnJ1SJ2mQi","2Yz7EyEfy9","MmKGJuoStw","618DilXFOB","Gv3Fq1j5L8","FFDuini2v1","NOHszGXdoH","oVQp69iGoT","qQxHPtl72W",
+"Zv7z0HlUbF","DcpWBRACuj","qUJMd07n1c","MojnP07n1c","hi5X7JRJQB","uN6r3SbRYy","uAWypgIYvE","l83Ud2Nslm","uQIczAOgEe","yvOMIjzUqR",
+"lpF6W1v5hH","faHirpFrrl","CqqaD9y4lw","O3iyQHzZT8","zmLYD9iGoT","OHaBzWaim6","D6rByOz8yZ","v2eC3K20wK","jSjS37Ow5C","BbwgAZhwG1",
+"S77LHiB08l","ksJbyF6PT2","cL0aETa8f6","zmLYDguMb8","JJs5mjiVBP","LDk6f55rfB","BGaQYRsQUq","HP433In3NS","WDVWJRzaZA","0h1b1sx5Gl",
+"8xEKzU3yw5","y94nwAmdQd","0YAGHTCgPp","XyPZNP6bcg","XyPZNLewvM","piJSk7fsYM","AmdQdzqH0W","IKxdLQYxC0","ru4UGyvOMI","YOfrY64s8N",
+"7fKYUFGzgp","lsQGo9XyT9","cQOnvDLhzM","uZPqg7Ow5C","HP433I7p2a","Z4I1v0ao3l","Q6LixD6rBy","hSSvQxciqp","uPX7G7fsYM","tvdkDhE1Ql",
+"BFkb87X3uy","FLsphgjUTu","hi5X7Twano","uupzkIKxdL","jeskSmX2GE","n8pJ9CK5W7","4W0TlCxVEf","FFDuihYBCK","dpe1vYf2Ec","M3zXLIKxdL",
+"WMiS3hi5X7","iqv4kJKWYR","LDk6f3weIF","16lHcEOE1o","LDk6fzz4ZU","0BmCynFqik","64s8Nhe9IA","kZANmjtn0X","RACuj64s8N","Vprf2F6PT2",
+"jiVBP7lUXZ","pv0i7G1RhS","jS1ajlViBv","FnPFBaez9y","9eoRctvdkD","MGlTFlpF6W","dhSuHazIWp","NcICAOUYuF","JIqXipmeCd","9GXkXGWqqX",
+"jtn0X4QMc9","qUJMdksJby","s7MxkpT8wu","MmKGJ8xEKz","1v5hHrKDLJ","OUqFMv2eC3","uupzkyvOMI","s7Mxkk85Ae","FnPFBbrhlQ","Mkgy8M6qcG",
+"AXpwEjtn0X","MojnPNOHsz","fcJOyKr8ys","uPX7G24ARF","fFDrJdmoS7","POUYSKr8ys","5Drn0Kr8ys","Kr8ysRpBQm","FFDuiKr8ys","djsrvoQ87r",
+"CIShGZ4I1v","NAFuw0h1b1","QssNCS77LH","QWxoTkZANm","e6e4zbrhlQ","cmXIX8TxD7","uZPqg24ARF","Yf2EcQ6Lix","Vprf264s8N","RBhp0RBhp0",
+"vOqCEfmIK1","nnP8oWPmlx","RzaZAxciqp","29QAztuDyS","cQOnvv8yFN","F6PT2tAOsr","azIWplCMxy","8TxD7WreyP","n1pmOMaJQs","lH1kth1zcH",
+"Yw2oUZzJHW","d7vjM9y4lw","yofH3gdQsS","azIWpsx5Gl","yofH38FmFH","0YAGHDz1R3","iwzGkn1pmO","nFqikjeskS","HfyNQJJs5m","blLA9WMiS3",
+"OHaBzjSjS3","Oz8yZnlaBy","yvOMIwDajX","MmKGJrz7Ut","UlU3MZv7z0","F6PT2uoStw","OxWIHblLA9","cQOnvYf2Ec","fFDrJzmLYD","29QAz29QAz",
+"lj07QOUYuF","MmsIoBGaQY","b29RJqQxHP","48cHLAkKTk","ECMvUCIShG","tuDySMGlTF","6AFT0ydG8U","DQimpFnPFB","LDk6fcQOnv","YOfrYFPfSE",
+"KsjRKdQ586","5IhmG4dEz6","sqVrfcShY2","RsQUqyEfy9","pFrrlvLsmS","IKxdLBFkb8","h1zcHF6PT2","v1HlnJKWYR","RpBQmy94nw","hi5X7uAWyp",
+"AgJHQqaofN","s7Mxk1v5hH","ECMvURkQke","zz4ZUAkKTk","K20wKIRh48","2Yz7E1j5L8","lkMUADQimp","lViBv4QMc9","mz8gxd85a9","zHF1q7fsYM",
+"9rlg9tjQxs","azIWp2DREs","RkQkejeskS","B3qemqaofN","VLTy6Oz8yZ","EoToPa00b5","iB08lpmeCd","KsjRKlweGy","yEfy9Kr8ys","b29RJMm8si",
+"AgJHQpWiOs","5Mg9rPOUYS","LDk6fTwano","NhXdu0Wr5y","YOfrYb29RJ","RmDcreuZA5","qUJMdDcpWB","5nmWvQ6Lix","MmKGJNxx9V","aDGtSStlDJ",
+"C2IrcIn3NS","5Mg9rVNCPd","KASQ8LDk6f","zmLYDfmIK1","ciuWzFVMxo","uLtKsx3LDe","IjTwPWaim6","0ao3liqv4k","RBhp0CxVEf","lkMUAlm0pD",
+"6q6L9JKWYR","YOfrYcmXIX","QChxsM6qcG","cShY21LB1L","NcICA55rfB","SWfoue6e4z","L7cGcyToGW","piJSkZv7z0","t59lRzbIYY","JIqXiGrDg7",
+"FPfSETa8f6","l83UdEdBKc","QClRLhe9IA","yluBx64s8N","DG4sTOxWIH","he9IAyvOMI","Ss0ZutlILt","MezSWuPX7G","0Wr5yt59lR","tlILteuZA5",
+"5Drn0i3pyd","xReecFLsph","FxX9qPYBf4","DQimpWDVWJ","iB08lL7cGc","vLsmStjQxs","7ku1pOxWIH","Kr8ysLbRTH","VerEAcShY2","CIShGCfgr3",
+"AOgEeK4GS8","B3qemsoy9t","d85a9jtn0X","s93Mldjsrv","v2eC3SjskQ","9iGoTyToGW","NOHsz8U2nU","C2IrcZUnqt","jS1ajfcwDa","8hJdtKASQ8",
+"0h1b10YAGH","i3pydvLsmS","B3qemhe9IA","D6rByVerEA","JKWYREoToP","DLhzMy94nw","qaofNI7p2a","VjCZqHzZT8","RkQkeVjCZq","SmGzvStlDJ",
+"9XyT9OHaBz","guMb85VZjS","dmoS7DLhzM","UlU3MWMiS3","brhlQuLtKs","zQt6QpiJSk","uJScXwDajX","0ao3lCqqaD","zY1GYlH1kt","oVQp6qQxHP",
+"5Mg9rtlILt","ZUnqti3pyd","5iGN5dpe1v","0BmCyb29RJ","yofH3ZJTXH","fFDrJZUnqt","1v5hHEOE1o","xciqplpF6W","FxX9qFNYIM","atef20ao3l",
+"ECMvU9XyT9","FxX9q1j5L8","AmdQdFPfSE","Chuy3lm0pD","DQimpEOE1o","LbRTHhE1Ql","64s8NWreyP","uTacxrhl0J","hSSvQ5nmWv","ciuWz64s8N",
+"Z4I1vVIlwP","hYBCKU3yw5","Mm8sizqH0W","zmLYDiKqhr","yluBx4W0Tl","Waim6okgRi","oVQp6KZamH","qQxHPB3qem","zmLYDAkKTk","zmLYD2Yz7E",
+"gjUTudQ586","VIlwPAmdQd","pmeCd24ARF","uPX7GIjTwP","suY4xd85a9","TCgPp9GXkX","FGzgppFrrl","a00b5FnPFB","gjUTuuZPqg","NcICA8cVD3",
+"QbxXcGSQwj","2hEEUThjNn","Nxx9V5drc6","L7cGcfaHir","FGzgps93Ml","lpF6WkZANm","nFqikFcWrW","W3VFHaez9y","taOXKa00b5","lpF6WECMvU",
+"K20wKaDGtS","Z4I1v8cVD3","BpYhVZzJHW","IjTwPs7Mxk","29QAzRmDcr","S2Dfulj07Q","2Nslm4QMc9","8FmFHWaim6","9y4lwEOE1o","7lUXZxXTI4",
+"gf8rI0BmCy","HzZT8i7WMQ","suY4x64s8N","MGlTFnFqik","WMiS3tvdkD","1v5hHW3VFH","RxrsmZUnqt","9y4lw9y4lw","atef2uJScX","kB5nPOUYuF",
+"pAhR1lsQGo","fFDrJEOE1o","AIYUu7ku1p","D6rBycL0aE","faHirB3qem","nnP8oiqv4k","8hJdtaez9y","Twanoru4UG","blLA95Namm","8TxD7JRJQB",
+"lm0pDOxWIH","zmLYDm4bxU","YOfrY2Nslm","8hJdtjS1aj","D6rByqUJMd","QbxXctAOsr","7ku1pQnJ1S","qUJMdRACuj","8U2nUCxVEf","ni2v1pvgjS",
+"cmXIXcmXIX","NAFuwvkCHH","kB5nP8FmFH","gtCA5uZPqg","QbxXcJkzUn","iwzGk4W0Tl","3weIF5ZaEz","Mkgy84QMc9","TCgPpVLTy6","AXpwEX6Pin",
+"wDajX8hJdt","618DiW3VFH","Yf2Ecrhl0J","G1RhS2ZHdk","8FmFHydG8U","i3pydOxWIH","Yf2EcVLTy6","FhtglM3zXL","vLsmS5drc6","pT8wuk85Ae",
+"POUYSyEfy9","3otm6RzaZA","S77LHkZANm","RkQkeblLA9","JIqXiQYxC0","jzUqRKsjRK","2DREs5drc6","gjUTuYh1hF","LDk6fvOqCE","UlU3M64s8N",
+"MGlTFU3yw5","piJSkpmeCd","U3yw5iKqhr","fLNg8OHaBz","DG4sTydG8U","FGzgp1j5L8","FcWrWZJTXH","8RCUAK4GS8","SjskQuN6r3","S77LHdQ586",
+"ydG8UFjHXR","VjCZqzY1GY","QssNC618Di","J2mQieuZA5","NAFuwiB08l","In3NSDcpWB","zHF1q1LB1L","i3pydfcJOy","07n1clH1kt","pvgjSC2Irc",
+"aFFss16lHc","pmeCdyofH3","5drc6GWqqX","NcICAtvdkD","ydG8UnlaBy","jSjS3brhlQ","lsQGo5VZjS","lH1ktCK5W7","zbIYY4W0Tl","n8pJ9WmadA",
+"atef2Fhtgl","vkCHHJXljW","lViBvnFqik","iKqhrwDajX","580YDe6e4z","okgRiK4GS8","v1HlnFGzgp","hUTw7ZUnqt","CIShGxReec","SWfouoQ87r",
+"aFFssSjskQ","jiVBPWDVWJ","nFqik9y4lw","CK5W7X6Pin","Zv7z0oQ87r","LDk6fUmaEv","HRxd8lj07Q","IBe8kzFgtB","o8UydQbxXc","07n1ctlILt",
+"lweGyS77LH","RsQUqSbRYy","7lUXZ2DREs","lj07Qlm0pD","qQxHP4QMc9","b29RJgIYvE","guMb80h1b1","cShY216lHc","MK07YVerEA","O3iyQ7X3uy",
+"hYBCKs4786","3weIFS2Dfu","ZJTXHgtCA5","6q6L91LB1L","zHF1qLewvM","LewvM3weIF","qQxHPpWiOs","Vprf2Waim6","8cVD3atef2","WDVWJ0Wr5y",
+"jeskS2Yz7E","Ss0Zu3otm6","fcJOydQ586","BFkb8tvdkD","iKqhrHfyNQ","lsQGo0h1b1","SmGzvGrDg7","d85a9x3LDe","Nxx9V24ARF","14FLRRsQUq",
+"qUJMdciuWz","BFkb8VLTy6","F6PT2RzaZA","s93MlZv7z0","GXdoHJ2mQi","gdQsSFxX9q","lsQGoQClRL","QbxXchSSvQ","dpe1v5Mg9r","QbxXcgf8rI",
+"7fKYU7fsYM","lH1kto8Uyd","7hyVvLbRTH","In3NSpiJSk","MezSW5IhmG","Z4I1vcShY2","8xEKzhi5X7","Mm8sioQ87r","7fsYMs4786","JJs5mzY1GY",
+"gIYvEs93Ml","e6e4zQ6hMC","pAhR1k85Ae","MGlTF5nmWv","ZzJHWVjCZq","QYxC0uvf7A","G1RhSWreyP","h1zcHZhwG1","GWqqXNo0Qb","cmXIXYjB9t",
+"5ZaEzlpF6W","d85a9uJScX","i7WMQ0Wr5y","wiHrZrKDLJ","XflUqUlU3M","FwEJzVerEA","RzaZA0PktI","ZuDtDmX2GE","wDajXe6e4z","J2mQiv1Hln",
+"oQ87rCNHmv","MaJQsF6PT2","JKWYRFwEJz","kZANmFnPFB","xciqpQworu","GSQwj24ARF","8cVD3FNYIM","D6rByJXljW","jfREuhUTw7","n1pmOmz8gx",
+"G1RhSWmadA","RpBQmK20wK","0Wr5yVjCZq","IBe8kpT8wu","K20wKCNHmv","MmsIoyvOMI","iwzGkJ2mQi","pv0i75Mg9r","tjQxslm0pD","JXljWulk41",
+"dQ586h1zcH","pvgjS2TRI7","2NslmfcwDa","WPmlx0Kyfs","Uvlv4cQOnv","QClRLQnJ1S","I7p2av1Hln","jtn0XBpYhV","B3qemAOgEe","prNT67hyVv",
+"JIqXiVerEA","jtn0XVerEA","tvdkDiB08l","uQIczyofH3","7ku1pv8yFN","blLA9Q6hMC","tuDySBpYhV","xciqpxciqp","uoStwIRh48","OUqFM2hEEU",
+"Waim6WDVWJ","WDVWJs7Mxk","jfREu2hEEU","C2IrcZuDtD","U3yw5ThjNn","s93MloVQp6","AmdQdStlDJ","dmoS7M3zXL","uLtKs8FmFH","KsjRKGv3Fq",
+"aFFssdjsrv","ZuDtDlsQGo","nFqikhi5X7","gdQsSF6PT2","zqH0WCxVEf","Uvlv4suY4x","5IhmGnlaBy","ydG8UpFrrl","POUYSx3LDe","tuDySIKxdL",
+"BbwgAB3qem","ulk41YjB9t","Cp3mZECMvU","RsQUquQIcz","WMiS3CIShG","WPmlxTwano","jfREuNAFuw","8RCUAtjQxs","aL6AJ8hJdt","J2mQiZ4I1v",
+"FGzgpTa8f6","vLsmSKZamH","HlUbFWaim6","HRxd8bgJAz","fFDrJqQxHP","soy9tGXdoH","l83UdtAOsr","WPmlxb29RJ","JKWYR3weIF","rz7Utn1pmO",
+"In3NSIKxdL","lViBvReKEW","guMb8n1pmO","UlU3MuPX7G","jSjS3pvgjS","sx5Gldjsrv","GWqqXIBe8k","uoStwb29RJ","e6e4z7fKYU","M6qcGtaOXK",
+"9rlg9WreyP","lCMxygdQsS","taOXK3otm6","he9IAl83Ud","Pb1pam4bxU","Gv3FqcQOnv","ZJTXHYw2oU","Ul4a13otm6","GSQwjRpBQm","SmGzvMezSW",
+"FhtglQssNC","7fsYMNcICA","FcWrWuQIcz","0BmCyl83Ud","9iGoTCdyBV","fcwDaix74r","lH1kt07n1c","s7Mxk2hEEU","Ss0ZuX6Pin","FwEJzKr8ys",
+"tlILtSbRYy","fqypy5IhmG","i7WMQ7lUXZ","2Yz7EguMb8","1LB1Lhi5X7","KsjRK4W0Tl","16lHcJIqXi","zHF1qlH1kt","0Wr5yCqqaD","uupzkpAhR1",
+"W3VFHChuy3","fqypyLewvM","yofH3QChxs","7fKYUfLNg8","8cVD3DG4sT","JKWYR48cHL","WDVWJTwano","7fKYUpAhR1","MaJQs0h1b1","7lUXZKr8ys",
+"GWqqXlkMUA","5drc6F6PT2","prNT60Wr5y","hE1QlzmLYD","IRh48hUTw7","0h1b1Mkgy8","S2DfuThjNn","Ta8f6wiHrZ","lCMxyWMiS3","hSSvQFjHXR",
+"lXFOBi3pyd","dQ5865Namm","zbIYY45cIH","zHF1qyEfy9","Dz1R3CxVEf","piJSkTwano","LbRTHwDajX","9iGoTWDVWJ","QworuZJTXH","hYBCKtaOXK",
+"uPX7GdhSuH","yToGWGXdoH","BpYhVpv0i7","LewvMe6e4z","v2eC39GXkX","i7WMQx3LDe","NcICA14FLR","h1zcHI7p2a","s93MlIjTwP","uPX7Grhl0J",
+"zQt6QjeskS","0h1b1MK07Y","5IhmGIBe8k","QWxoTVBjhz","MmsIoFFDui","2Nslm8RCUA","4W0TlIKxdL","lXFOBhUTw7","VerEAVprf2","ksJbyjfREu",
+"J2mQiWaWsv","BCxeCJKWYR","tAOsrdhSuH","jfREuL7cGc","4QMc907n1c","WPmlxBCxeC","2DREsFVMxo","LDk6flCMxy","G1RhS8U2nU","gjUTuX6Pin",
+"Cfgr3SWfou","piJSkLDk6f","lkMUAWreyP","piJSk5iGN5","hUTw7zHF1q","zmLYDv2eC3","pvgjSM3zXL","uJScXDG4sT","P6bcg9iGoT","0BmCywDajX",
+"DG4sTYjB9t","a00b5pmeCd","5Drn0HfyNQ","Waim65VZjS","8TxD75Drn0","X6PinCK5W7","jfREuDQimp","IjTwP9GXkX","lm0pDW3VFH","9y4lwlH1kt",
+"DG4sTWreyP","L7cGcFNYIM","Oz8yZdhSuH","hYBCKpvgjS","Zv7z0YOfrY","CIShGsoy9t","NcICAa00b5","OUqFMMmsIo","JKWYRLewvM","Ul4a1hE1Ql",
+"EOE1onnP8o","Yw2oUlm0pD","S77LHSjskQ","M3zXLlpF6W","X6PinokgRi","618Di5nmWv","tlILtcL0aE","Cfgr3C2Irc","MGlTFuN6r3","CxVEfGSQwj",
+"5Mg9rJkzUn","MezSWVjCZq","jfREuJ2mQi","tvdkDyluBx","t59lRCp3mZ","zz4ZUjeskS","TwanoFjHXR","VIlwPBFkb8","hSSvQRpBQm","YjB9txReec",
+"0Wr5yEoToP","SWfouwDajX","uoStwMm8si","MezSWlCMxy","RzaZA2Nslm","CdyBVReKEW","2hEEUpmeCd","fcJOyhUTw7","sqVrfJkzUn","zqH0WhUTw7",
+"5VZjSIRh48","ECMvUI7p2a","S77LH9GXkX","3otm6l83Ud","dQ586oGu6x","oVQp6pT8wu","oGu6xb29RJ","KASQ8VerEA","dQ586Ss0Zu","QYxC0IjTwP",
+"Yw2oU4dEz6","Yw2oUv1Hln","5NammRxrsm","WaWsvwDajX","FFDuiS77LH","kZANmlXFOB","hi5X7yluBx","Pb1paogLgc","CK5W7aDGtS","LDk6fnFqik",
+"NAFuwYf2Ec","O3iyQ5iGN5","lpF6WZhwG1","cShY2hUTw7","zbIYYIKxdL","OxWIHn1pmO","Fhtglk85Ae","M6qcGuPX7G","0ao3l64s8N","lj07QMaJQs",
+"4W0TlwDajX","Cfgr3ZUnqt","JKWYRpv0i7","C2IrcwDajX","l83UdAkKTk","4W0TlbrhlQ","nFqikK4GS8","faHirZzJHW","AXpwEVjCZq","kB5nPEOE1o",
+"wDajXQWxoT","guMb8b29RJ","Q6LixS77LH","AOgEeaez9y","2Nslmgf8rI","14FLRdhSuH","1j5L8zQt6Q","lj07QHfyNQ","ulk41618Di","QworuuoStw",
+"lj07QzQt6Q","brhlQ2hEEU","YjB9tmz8gx","ECMvU7X3uy","kB5nPdmoS7","BFkb8BbwgA","sqVrfOz8yZ","1v5hHpFrrl","K4GS848cHL","LbRTH7ku1p",
+"LewvMlH1kt","FcWrW4dEz6","DQimpSbRYy","QClRL2ZHdk","16lHc5nmWv","MGlTFgf8rI","Mkgy8DQimp","WmadA8hJdt","BFkb8d85a9","LbRTHMezSW",
+"NhXdujiVBP","FnPFBru4UG","Q6Lix5drc6","v2eC3ECMvU","vOqCE5Namm","dmoS7iB08l","zHF1qlm0pD","cL0aEM6qcG","CIShGblLA9","xXTI4Waim6",
+"IjTwP9XyT9","7hyVvS2Dfu","cShY21v5hH","5Drn09GXkX","L7cGcHfyNQ","yluBxReKEW","5IhmGtvdkD","FPfSEa00b5","RkQkeX6Pin","TCgPpqUJMd",
+"BCxeCEOE1o","tlILtzbIYY","rKDLJ24ARF","QnJ1S4dEz6","MmsIofmIK1","07n1cPYBf4","tuDySuN6r3","x3LDeSs0Zu","a00b5guMb8","vLsmSgdQsS",
+"b29RJUlU3M","RpBQmyofH3","uLtKs0Kyfs","PYBf4AXpwE","SbRYyGrDg7","FLsph6q6L9","No0Qb8TxD7","aFFssXflUq","XyPZNQbxXc","ulk41GSQwj",
+"fqypy9y4lw","Mkgy8Nxx9V","dQ586U3yw5","tAOsrhe9IA","lViBvi7WMQ","he9IAfFDrJ","gf8rID6rBy","yToGWk85Ae","16lHc0Kyfs","SWfouZhwG1",
+"ZUnqtQbxXc","vkCHHguMb8","8xEKzYOfrY","jSjS37X3uy","RzaZA7X3uy","GrDg7TXQ0Z","HP433soy9t","yluBxcShY2","ZuDtDi7WMQ","Kr8ys64s8N",
+"uN6r3zHF1q","FwEJzJRJQB","d85a9M6qcG","wDajXfFDrJ","blLA9JIqXi","lH1kt8U2nU","Q6Lixsoy9t","k85AeuJScX","dhSuH6AFT0","NcICAM6qcG",
+"StlDJix74r","Fhtgldpe1v","n1pmOlCMxy","pFrrlS77LH","Yf2Ec9GXkX","t59lRFGzgp","WaWsv2Nslm","WreyPW7cTs","Mm8sib29RJ","qaofNsx5Gl",
+"h1zcHLewvM","ZzJHWwDajX","RpBQmQWxoT","7fKYUQChxs","7Ow5ClpF6W","hi5X7v2eC3","FjHXRfqypy","VLTy6X6Pin","MojnPlCMxy","I7p2ahi5X7",
+"QYxC0I7p2a","ydG8Ugf8rI","JKWYR3otm6","nlaByuQIcz","8xEKzsuY4x","i7WMQnnP8o","Rxrsm9iGoT","x3LDeazIWp","s7MxkRxrsm","uoStwuZPqg",
+"fcJOyQ6Lix","VerEAYOfrY","fFDrJ7fsYM","AOgEerhl0J","uQIczSbRYy","Yh1hFyofH3","W3VFHZUnqt","W7cTsuPX7G","UmaEvMm8si","zY1GYZUnqt",
+"gf8rIQworu","Yw2oUvOqCE","taOXKFPfSE","zY1GYXyPZN","xXTI4pFrrl","IRh48DcpWB","guMb8uPX7G","uvf7Alm0pD","tuDyS45cIH","EOE1o7lUXZ",
+"GrDg7OUqFM","16lHcFVMxo","LewvMokgRi","RpBQmlH1kt","TwanoJkzUn","uPX7GVIlwP","i7WMQ9y4lw","yvOMIgtCA5","uoStwi7WMQ","BGaQYdmoS7",
+"zHF1q4dEz6","dhSuHW7cTs","2TRI7F6PT2","n1pmOZv7z0","SmGzvaez9y","HlUbFHfyNQ","blLA9a00b5","gdQsSiB08l","BpYhVfmIK1","blLA99iGoT",
+"yEfy9IRh48","GXdoHHRxd8","xXTI4G1RhS","suY4x14FLR","9iGoTQChxs","Yf2Ec2TRI7","GWqqXuvf7A","CIShGdhSuH","HfyNQBbwgA","14FLRtlILt",
+"NAFuwv1Hln","P6bcgVNCPd","yluBx5nmWv","KZamHs7Mxk","WaWsv7ku1p","b29RJxciqp","lXFOB9iGoT","UlU3M0h1b1","QworuaFFss","1v5hHAkKTk",
+"8RCUA2hEEU","tjQxskZANm","LDk6fuPX7G","8xEKzFcWrW","ZhwG1Chuy3","FhtglhYBCK","gIYvEoVQp6","07n1cWmadA","0ao3lWaim6","bgJAz2DREs",
+"Pb1paVerEA","xXTI4sx5Gl","Yh1hFgdQsS","7fsYMogLgc","8RCUAGv3Fq","cmXIXQnJ1S","okgRiLbRTH","faHirzmLYD","S77LHX6Pin","piJSkqQxHP",
+"Z4I1vgtCA5","h1zcHThjNn","sqVrfdhSuH","EdBKcqUJMd","ReKEWs4786","ni2v1IKxdL","ciuWzmz8gx","Q6LixNcICA","M6qcGIBe8k","ix74raFFss",
+"s93Ml0h1b1","BbwgASbRYy","CK5W7VjCZq","4W0TlqUJMd","taOXKD6rBy","S2Dfu45cIH","ZuDtDuLtKs","tjQxsiKqhr","Waim6Twano","K4GS8hi5X7",
+"MGlTFEoToP","RACujCdyBV","1LB1LCqqaD","uJScXzz4ZU","In3NSoQ87r","MGlTFFVMxo","MojnPEdBKc","DQimpKZamH","zFgtBGv3Fq","I7p2aaFFss",
+"FxX9qn8pJ9","gjUTu5drc6","m4bxU9GXkX","WMiS30Kyfs","sx5GlSs0Zu","uLtKs5Drn0","dhSuHaFFss","nlaBymz8gx","WMiS3uTacx","MaJQslweGy",
+"jzUqRFnPFB","RmDcrD6rBy","wDajXlCMxy","S77LHiKqhr","AgJHQgtCA5","QClRLW3VFH","ksJbyChuy3","FnPFBG1RhS","2hEEUJKWYR","580YDGWqqX",
+"2ZHdkzqH0W","bgJAzBpYhV","AkKTk45cIH","brhlQatef2","MGlTFZ4I1v","iKqhr9rlg9","yToGWrhl0J","lCMxyUmaEv","rhl0JFGzgp","okgRirhl0J",
+"o8UydbgJAz","VjCZqTwano","rhl0J8FmFH","Rxrsmtl72W","fFDrJuLtKs","OUYuF7Ow5C","QworuFNYIM","JRJQBogLgc","1v5hHHRxd8","580YDzbIYY",
+"AXpwE5Drn0","Nxx9VlXFOB","8xEKzl83Ud","8TxD7HlUbF","MK07Yfqypy","C2IrcOUYuF","dpe1vAgJHQ","ZJTXHHlUbF","zFgtBFcWrW","RxrsmO3iyQ",
+"qQxHP7fKYU","DLhzM8xEKz","ECMvUNo0Qb","cQOnv0Wr5y","Dz1R39rlg9","5Drn0oQ87r","24ARFTwano","ZuDtDJIqXi","aL6AJCxVEf","2Yz7E6AFT0",
+"NOHszBbwgA","VIlwP1v5hH","jtn0XwDajX","W7cTsaFFss","NhXdum4bxU","0YAGHC2Irc","lsQGoUmaEv","2hEEUSs0Zu","aDGtSs7Mxk","J2mQiKr8ys",
+"M6qcGKZamH","3otm6djsrv","7fsYMMGlTF","WDVWJM6qcG","8FmFHJXljW","yToGWlpF6W","07n1cC2Irc","NcICASjskQ","2TRI7uAWyp","xciqpCIShG",
+"dpe1vX6Pin","faHirguMb8","QssNCKsjRK","tlILtUl4a1","zmLYDMmsIo","FjHXRFPfSE","J2mQi5IhmG","Ul4a1SmGzv","aez9yyofH3","W3VFH1j5L8",
+"GrDg7B3qem","Chuy32TRI7","Zv7z0pAhR1","EdBKcJ2mQi","FVMxoBGaQY","y94nw2Nslm","IKxdLm4bxU","2NslmHRxd8","ZzJHW7lUXZ","K20wKaFFss",
+"5drc68FmFH","NhXduW3VFH","CxVEflViBv","e6e4zqaofN","XflUqnnP8o","7lUXZt59lR","QnJ1SjfREu","C2Irc2ZHdk","rKDLJgjUTu","ru4UGatef2",
+"CIShGydG8U","BFkb8xXTI4","v2eC3SmGzv","tlILtfaHir","M3zXLzY1GY","iwzGkDLhzM","Y1mC02DREs","pAhR1ogLgc","AmdQddjsrv","OHaBzWDVWJ",
+"6q6L9U3yw5","piJSkcQOnv","i7WMQDLhzM","aDGtSdmoS7","0BmCyv8yFN","nlaBylm0pD","9XyT9IKxdL","P6bcgvkCHH","ksJby5nmWv","jS1ajfFDrJ",
+"lweGyv2eC3","tl72WUl4a1","pFrrlFxX9q","iqv4kzHF1q","xReecWDVWJ","In3NSy94nw","Mm8siGrDg7","pvgjSU3yw5","ksJbyHRxd8","xXTI4cShY2",
+"LbRTHguMb8","UlU3MgtCA5","FFDuiuvf7A","P6bcgpWiOs","KASQ8G1RhS","FnPFBn8pJ9","1j5L88RCUA","9GXkXO3iyQ","RsQUqzz4ZU","vkCHHdpe1v",
+"tl72WJKWYR","Cp3mZ3otm6","ZJTXHgf8rI","suY4xP6bcg","VjCZqrhl0J","BFkb8i3pyd","D6rByNo0Qb","BCxeCFFDui","AgJHQtlILt","ru4UGBbwgA",
+"4dEz6RBhp0","pWiOsoGu6x","5IhmGjS1aj","cQOnv8xEKz","7hyVv7fKYU","I7p2alj07Q","Pb1paUvlv4","hUTw75Drn0","9iGoTVLTy6","tAOsrru4UG",
+"lm0pDD6rBy","ZuDtDGXdoH","hSSvQYw2oU","hE1QlW3VFH","NcICAX6Pin","uQIcz3otm6","MojnP8RCUA","SmGzvHRxd8","5VZjSVNCPd","L7cGcY1mC0",
+"IKxdLs93Ml","mX2GEZJTXH","DQimpoQ87r","Yf2Ecm4bxU","BFkb8x3LDe","vLsmSbZLvS","JKWYRbrhlQ","uoStwd85a9","yToGWMm8si","K20wKQworu",
+"okgRiKZamH","gIYvEfcwDa","CK5W7WmadA","taOXKEdBKc","jzUqRReKEW","piJSkK20wK","VerEApT8wu","JXljWGv3Fq","Y1mC014FLR","Mkgy86AFT0",
+"CdyBVW3VFH","RACujRACuj","K4GS87fKYU","In3NSnlaBy","RpBQm45cIH","LbRTH5IhmG","jiVBPgjUTu","Zv7z0ThjNn","uoStwM6qcG","9GXkXsuY4x",
+"1j5L8gjUTu","TCgPpyvOMI","zHF1qsx5Gl","5Mg9rrhl0J","vLsmS0h1b1","7Ow5CRxrsm","dhSuHkZANm","RkQkeYf2Ec","ogLgcciuWz","BbwgAfcwDa",
+"djsrvW3VFH","7Ow5CFFDui","VerEA580YD","jzUqRW3VFH","QYxC0lXFOB","YOfrYqaofN","kZANmlj07Q","lm0pDIBe8k","jeskSxciqp","MGlTFrKDLJ",
+"pmeCdVjCZq","DLhzMO3iyQ","pmeCdJIqXi","y94nwB3qem","uLtKszbIYY","9XyT9dmoS7","RzaZAYh1hF","brhlQQnJ1S","SjskQt59lR","1LB1LfcwDa",
+"FcWrWk85Ae","NhXduMojnP","d85a9ZzJHW","uTacx8xEKz","dQ586AOgEe","pWiOstl72W","vkCHH9rlg9","2DREscmXIX","RmDcrNhXdu","EdBKc2Yz7E",
+"jiVBPlweGy","QClRLK20wK","9GXkXuJScX","s4786bZLvS","CdyBV6AFT0","TXQ0ZFVMxo","8FmFHkZANm","dmoS75IhmG","uoStwAkKTk","n8pJ9qaofN",
+"24ARFi3pyd","9GXkXv1Hln","iB08lKZamH","7hyVvXyPZN","y94nwjiVBP","zbIYYC2Irc","Z4I1vzFgtB","WreyPlpF6W","QnJ1SfcJOy","qaofNDz1R3",
+"0Kyfs9y4lw","i3pydO3iyQ","O3iyQtvdkD","2hEEUx3LDe","VerEA5IhmG","LbRTHpWiOs","QWxoTSs0Zu","9XyT9fmIK1","G1RhSt59lR","lm0pDTwano",
+"9y4lwNOHsz","4W0TlZhwG1","1j5L8Qworu","OUqFM8cVD3","cQOnvVjCZq","0h1b1cShY2","gtCA59iGoT","gjUTuZUnqt","bZLvSTwano","KASQ81LB1L",
+"JIqXiVBjhz","VLTy6tl72W","oGu6xhYBCK","580YDprNT6","5NammfaHir","fmIK1EdBKc","OxWIHt59lR","VIlwPjiVBP","55rfBM3zXL","yEfy9Mm8si",
+"DQimp7fsYM","5NammW3VFH","U3yw5ReKEW","0MR5X0ao3l","bgJAzMmKGJ","RsQUqo8Uyd","2ZHdkk85Ae","RsQUqrKDLJ","JkzUnuAWyp","h1zcHGSQwj",
+"hSSvQ5iGN5","dQ586VBjhz","K20wKFcWrW","Mm8siUmaEv","6q6L9MGlTF","QssNCi7WMQ","tvdkDs7Mxk","djsrv55rfB","vOqCEOHaBz","FNYIMRzaZA",
+"8cVD3uAWyp","o8Uyd9y4lw","rz7UtsuY4x","Dz1R3lj07Q","BbwgAW3VFH","CNHmvEdBKc","ix74rLewvM","d85a9zbIYY","EOE1oxXTI4","Vprf2BCxeC",
+"uJScXatef2","BCxeCpv0i7","vkCHHTXQ0Z","vLsmSEoToP","pv0i7v2eC3","uPX7GZuDtD","4QMc9SWfou","QnJ1SYh1hF","cShY2ZhwG1","d7vjMUvlv4",
+"BGaQYni2v1","iwzGkqQxHP","QYxC0tvdkD","pAhR1ydG8U","rhl0JyvOMI","xciqpOUqFM","uJScX7fKYU","dQ586No0Qb","hUTw7ru4UG","580YDVjCZq",
+"FnPFB5Drn0","zmLYDS2Dfu","NAFuwIjTwP","lweGylj07Q","mz8gxazIWp","618DiAXpwE","CxVEfuupzk","QWxoTdhSuH","FLsphJIqXi","uoStwM3zXL",
+"gjUTuAOgEe","8xEKzzQt6Q","yEfy9580YD","ni2v1jeskS","NOHszhYBCK","dpe1vWPmlx","In3NS48cHL","t59lRa00b5","soy9tKASQ8","8U2nU45cIH",
+"CxVEfcShY2","MGlTFzmLYD","TwanookgRi","yEfy9yofH3","MaJQsSbRYy","3otm6lXFOB","pv0i7IBe8k","Ul4a12ZHdk","dmoS77fKYU","C2IrcFnPFB",
+"lXFOBF6PT2","prNT69eoRc","W7cTsjtn0X","uAWypxXTI4","uvf7A7hyVv","StlDJs7Mxk","yToGWVIlwP","tlILtWreyP","FVMxo45cIH","WreyPn1pmO",
+"Yf2EcprNT6","LDk6f7Ow5C","pAhR1F6PT2","WMiS3OUqFM","6AFT0dpe1v","zqH0W0ao3l","OUYuFgIYvE","hi5X7aDGtS","WreyP4W0Tl","MezSW618Di",
+"fcwDa618Di","jfREuuJScX","JKWYROUYuF","NcICALDk6f","U3yw5Yh1hF","gIYvEkZANm","FPfSEJXljW","guMb8XyPZN","FFDui2TRI7","ZzJHW8xEKz",
+"zHF1q0h1b1","RxrsmAgJHQ","LbRTH9eoRc","ydG8Ujtn0X","L7cGcokgRi","x3LDetuDyS","xXTI4S2Dfu","bZLvSi7WMQ","KZamHrKDLJ","dhSuHX6Pin",
+"JIqXiCNHmv","3weIFVLTy6","ZUnqtFnPFB","dQ586zz4ZU","StlDJt59lR","prNT6brhlQ","O3iyQlsQGo","5Drn0tuDyS","Nxx9VFNYIM","Rxrsm2TRI7",
+"OUYuFTCgPp","zY1GY4QMc9","pAhR1WreyP","uupzk8FmFH","ThjNnyofH3","WaWsvRsQUq","G1RhSuTacx","IRh48IjTwP","Yw2oU2hEEU","djsrvReKEW",
+"7Ow5C5IhmG","X6Pinv2eC3","bgJAzQnJ1S","ksJbyIn3NS","HlUbFYf2Ec","pmeCdpmeCd","oVQp6zFgtB","sx5GlVBjhz","3weIFtaOXK","I7p2ahYBCK",
+"45cIHlpF6W","I7p2aoVQp6","azIWp0Kyfs","KASQ8yofH3","ciuWzCfgr3","wiHrZ6q6L9","64s8NxReec","tl72WjS1aj","FnPFBQYxC0","fLNg8MojnP",
+"ni2v1W7cTs","Zv7z05Drn0","uZPqg7lUXZ","nnP8oLbRTH","DQimpn8pJ9","14FLR7X3uy","16lHcLewvM","D6rByZzJHW","7fsYM7lUXZ","gIYvEZUnqt",
+"FGzgpv8yFN","fmIK1TXQ0Z","kB5nPHfyNQ","x3LDeiqv4k","y94nw5iGN5","XflUq8U2nU","7lUXZKZamH","s93MlGXdoH","F6PT2pv0i7","AOgEeWmadA",
+"AgJHQyofH3","NOHszTCgPp","YjB9tguMb8","LDk6fgjUTu","soy9tsx5Gl","HlUbFfaHir","Ul4a19y4lw","piJSkIKxdL","VLTy68RCUA","FFDuiGWqqX",
+"Ss0ZuWreyP","v1HlndhSuH","StlDJ7hyVv","ksJbytl72W","he9IAGSQwj","0Wr5y48cHL","XflUqBpYhV","EOE1oKZamH","vOqCEJKWYR","zbIYYOHaBz",
+"CqqaDMmKGJ","o8UydWreyP","GWqqXuJScX","pAhR1JkzUn","OHaBzS77LH","C2IrczY1GY","PYBf49y4lw","jSjS32ZHdk","fqypy7ku1p","7lUXZCK5W7",
+"djsrv0h1b1","5Mg9rX6Pin","RzaZABCxeC","wiHrZHP433","GSQwjCp3mZ","580YD7lUXZ","dhSuHksJby","AOgEeFjHXR","BGaQYPOUYS","v8yFNprNT6",
+"IRh48M3zXL","tAOsrVNCPd","S2Dfu16lHc","MaJQsgtCA5","HP433uupzk","7Ow5CGv3Fq","jiVBP2Nslm","FFDuiprNT6","7X3uyokgRi","6q6L9blLA9",
+"YjB9tL7cGc","pmeCdlCMxy","VerEAYf2Ec","D6rBy580YD","Y1mC0oGu6x","zQt6QZv7z0","0h1b1F6PT2","lCMxy9GXkX","IBe8kQnJ1S","VjCZqb29RJ",
+"0YAGHVprf2","ydG8UjfREu","BCxeCpvgjS","TXQ0Zaez9y","lm0pDThjNn","AOgEetaOXK","yEfy9ru4UG","NcICA7Ow5C","W7cTsRpBQm","FcWrWM6qcG",
+"YjB9tokgRi","9y4lwn8pJ9","vkCHHlsQGo","QClRLiB08l","yofH30Kyfs","vkCHHKr8ys","VBjhzdQ586","cmXIXFxX9q","kB5nPRBhp0","cmXIXAmdQd",
+"WDVWJuQIcz","pWiOsStlDJ","Ul4a1NAFuw","e6e4zmX2GE","t98iWbrhlQ","i7WMQCqqaD","uZPqgDLhzM","pvgjSnlaBy","piJSk8xEKz","BpYhVru4UG",
+"dhSuHUlU3M","OHaBztvdkD","YjB9tSmGzv","qQxHPrKDLJ","OHaBzfqypy","rz7UtNhXdu","JkzUn8FmFH","t98iWksJby","8TxD7D6rBy","i7WMQs4786",
+"2hEEUwiHrZ","RsQUqOz8yZ","X6Pins93Ml","1v5hH48cHL","Ta8f60Kyfs","QClRLwDajX","9y4lwAIYUu","lweGyKsjRK","bgJAzjiVBP","pWiOsuTacx",
+"gIYvEO3iyQ","QWxoTgtCA5","azIWpnFqik","M3zXLoQ87r","bZLvSwDajX","d7vjMIjTwP","iB08l5Namm","4W0TlG1RhS","HzZT824ARF","rhl0JydG8U",
+"cL0aEJJs5m","taOXK8U2nU","RzaZAKASQ8","5Mg9rEOE1o","8xEKzUmaEv","WreyPQworu","uupzkFxX9q","bgJAzeuZA5","FLsphyofH3","pT8wuogLgc",
+"BGaQYHP433","POUYS9XyT9","iqv4ktjQxs","0Wr5yYjB9t","45cIHOUqFM","uupzkBCxeC","ydG8UgtCA5","4dEz6CNHmv","a00b5I7p2a","d7vjMpFrrl",
+"yEfy948cHL","jtn0XEoToP","0YAGHBFkb8","0Wr5yNcICA","zmLYDcShY2","qaofNv8yFN","0YAGHF6PT2","pAhR1aez9y","W3VFHQYxC0","zbIYYGrDg7",
+"14FLRVBjhz","ulk41jiVBP","IjTwPMojnP","3otm6zFgtB","Gv3Fqxciqp","1v5hHCqqaD","nFqikRkQke","ydG8UKASQ8","vkCHHQbxXc","In3NSvkCHH",
+"QChxs48cHL","tl72WQYxC0","AXpwExReec","9GXkXnlaBy","0YAGHs93Ml","jzUqRgtCA5","IKxdLzz4ZU","t59lR2hEEU","D6rByQworu","yToGWlXFOB",
+"zbIYYCfgr3","ZzJHWAmdQd","FhtglIKxdL","aL6AJSs0Zu","2Nslm9iGoT","S2DfuFjHXR","BpYhVMmKGJ","HlUbFhE1Ql","AkKTk2TRI7","0YAGHt59lR",
+"lkMUAfcJOy","bgJAzpWiOs","JKWYR7lUXZ","tuDySThjNn","DLhzMl83Ud","FjHXRLbRTH","rKDLJ0Kyfs","RsQUqQnJ1S","3otm62hEEU","AkKTkv2eC3",
+"DcpWBs93Ml","2ZHdkZhwG1","Ss0ZuIKxdL","RBhp0AIYUu","QWxoTDz1R3","aez9yYjB9t","5ZaEz7fKYU","CqqaDlj07Q","FLsphjeskS","1LB1LFhtgl",
+"CxVEfAgJHQ","JKWYRiKqhr","i3pydciuWz","SbRYyFnPFB","taOXKBFkb8","Waim6IBe8k","ZuDtDa00b5","14FLRmz8gx","yofH3uQIcz","C2Irc7fsYM",
+"2hEEUlsQGo","O3iyQFPfSE","U3yw5soy9t","Qworu4QMc9","SjskQVBjhz","Q6LixHfyNQ","29QAzuQIcz","Yw2oUhSSvQ","gIYvEjeskS","Yf2EcEdBKc",
+"5Drn0B3qem","07n1c618Di","tjQxsrKDLJ","SmGzvYh1hF","K20wKrKDLJ","VerEATCgPp","HRxd8lkMUA","s7MxkYjB9t","UmaEv9iGoT","djsrvjSjS3",
+"5iGN5uLtKs","7hyVvi7WMQ","GWqqXrhl0J","m4bxUpWiOs","fLNg88xEKz","5nmWvuJScX","AkKTk29QAz","JIqXiWDVWJ","lm0pDK4GS8","VNCPd1j5L8",
+"m4bxUJ2mQi","0YAGHx3LDe","Chuy35Drn0","OUYuFmX2GE","JKWYRLDk6f","yluBxOUYuF","QnJ1S45cIH","Y1mC0RpBQm","rz7UtpiJSk","16lHcWDVWJ",
+"JkzUn2TRI7","fcwDatlILt","CK5W7JXljW","zHF1qP6bcg","YjB9t29QAz","9XyT9M3zXL","7X3uyJ2mQi","FnPFBOUYuF","s4786piJSk","7Ow5CiKqhr",
+"7hyVvSjskQ","KsjRK5ZaEz","uoStw0ao3l","Q6hMCCfgr3","Dz1R3Zv7z0","faHiriwzGk","WDVWJgtCA5","MaJQsPOUYS","pFrrlpvgjS","vkCHHlm0pD",
+"v2eC3WPmlx","9GXkXOz8yZ","7Ow5CDG4sT","yluBxBpYhV","Uvlv4JkzUn","In3NS07n1c","FGzgp7lUXZ","xXTI4WmadA","K20wKSs0Zu","uupzkZJTXH",
+"nFqikUl4a1","guMb8FjHXR","a00b5LewvM","bgJAzazIWp","yofH3euZA5","Yf2EcQworu","GSQwjjeskS","DQimpeuZA5","Waim62DREs","pFrrlAgJHQ",
+"0BmCyQYxC0","FhtglNo0Qb","Z4I1vFLsph","fcJOyZ4I1v","d85a9KsjRK","CK5W75IhmG","JRJQBFNYIM","jzUqRhE1Ql","Chuy3BbwgA","tuDySKsjRK",
+"pT8wu8FmFH","nnP8oG1RhS","ZhwG1xXTI4","F6PT2S77LH","v2eC30MR5X","NcICAU3yw5","jzUqRFGzgp","64s8NRkQke","fFDrJ2ZHdk","Gv3FqPb1pa",
+"e6e4zlj07Q","AOgEeD6rBy","v8yFNiwzGk","dQ586uTacx","ZJTXH8xEKz","M3zXLJ2mQi","8TxD7fcwDa","J2mQi3weIF","NOHszbZLvS","uvf7AgIYvE",
+"dQ586s4786","a00b5xciqp","LewvMzFgtB","uQIcz2ZHdk","ZhwG1Dz1R3","WPmlxDG4sT","F6PT2bZLvS","GSQwjtAOsr","Waim6e6e4z","tuDySS77LH",
+"soy9tWMiS3","iqv4k6q6L9","qQxHPl83Ud","618DiZzJHW","taOXK8xEKz","JKWYRTXQ0Z","7X3uyBFkb8","JXljWKr8ys","5Mg9rP6bcg","Nxx9VGWqqX",
+"v1Hln5Drn0","uN6r32Nslm","oGu6xjtn0X","WmadA4QMc9","Mm8sidjsrv","BFkb8dQ586","pv0i7FVMxo","Ss0ZuogLgc","HzZT8bZLvS","OUqFMZhwG1",
+"x3LDeQWxoT","VerEApWiOs","lViBvUlU3M","TCgPpGSQwj","lj07QPYBf4","8hJdtEOE1o","mX2GEOUYuF","ZUnqtvOqCE","vkCHHYf2Ec","oVQp6Yf2Ec",
+"G1RhSogLgc","wDajXlpF6W","i7WMQZJTXH","CdyBV7X3uy","5IhmGh1zcH","5Mg9rlCMxy","2NslmdhSuH","L7cGcuN6r3","9y4lw6AFT0","CqqaDdjsrv",
+"nFqikaFFss","ReKEW7Ow5C","5Mg9rYjB9t","tlILtAXpwE","In3NSTwano","Oz8yZnFqik","uvf7AVerEA","JRJQB9XyT9","45cIHaFFss","y94nwOHaBz",
+"WreyP2hEEU","CIShGtvdkD","QClRL0YAGH","atef2n1pmO","n8pJ955rfB","pv0i7FGzgp","JkzUnyToGW","9eoRcpWiOs","Yh1hFjeskS","ksJby9GXkX",
+"ulk41oGu6x","pvgjSlXFOB","7ku1pEdBKc","mX2GE7lUXZ","Q6LixtuDyS","uPX7GFxX9q","B3qemFjHXR","MojnPSs0Zu","0KyfsP6bcg","zY1GYpiJSk",
+"e6e4zy94nw","yvOMIIn3NS","W3VFHTwano","1LB1LbgJAz","lpF6WblLA9","2hEEUTXQ0Z","jSjS3L7cGc","Vprf2GWqqX","fcJOyWreyP","Mkgy8v8yFN",
+"lpF6WgdQsS","AXpwEKZamH","D6rByMK07Y","ReKEWMm8si","mX2GE55rfB","pAhR15Drn0","SjskQogLgc","gtCA5soy9t","7hyVveuZA5","2TRI7IRh48",
+"HP433Twano","Zv7z0JRJQB","l83UdRkQke","hi5X71j5L8","TCgPpWaWsv","qaofNBbwgA","W3VFH3weIF","uvf7A8cVD3","RsQUqZzJHW","zbIYYzQt6Q",
+"FLsphQnJ1S","14FLRlCMxy","nFqikLbRTH","MaJQsRBhp0","OUqFMtAOsr","U3yw5v1Hln","v1Hlnh1zcH","piJSkBpYhV","jtn0XcShY2","euZA5WMiS3",
+"F6PT248cHL","guMb8LbRTH","HRxd8y94nw","I7p2aKZamH","prNT6POUYS","pmeCdi3pyd","Mm8siI7p2a","pmeCdPb1pa","e6e4z9y4lw","lweGyeuZA5",
+"XyPZNX6Pin","i7WMQ2Yz7E","lm0pDuPX7G","xciqpsoy9t","5Nammd7vjM","CdyBVksJby","mX2GEjeskS","RkQkeJJs5m","14FLR9rlg9","WMiS3QssNC",
+"CdyBV9eoRc","lCMxylCMxy","J2mQijS1aj","29QAzuvf7A","zz4ZUkZANm","nlaByv8yFN","AmdQdlweGy","XflUqv2eC3","zQt6Qgf8rI","m4bxUy94nw",
+"Zv7z0OUqFM","G1RhSiB08l","X6PinciuWz","nnP8olH1kt","Nxx9VFxX9q","UlU3M8FmFH","fmIK124ARF","S77LHS77LH","ECMvUlj07Q","QssNCcmXIX",
+"P6bcgHfyNQ","b29RJFPfSE","5iGN5wiHrZ","iqv4kB3qem","8hJdtVjCZq","zHF1qhe9IA","jS1ajWMiS3","QnJ1SvkCHH","i7WMQCK5W7","8cVD3Dz1R3",
+"1LB1L7Ow5C","B3qemTa8f6","soy9tSmGzv","bgJAz5drc6","oVQp60ao3l","ECMvU2ZHdk","8cVD30MR5X","9rlg9uJScX","uPX7G7ku1p","0KyfseuZA5",
+"rKDLJ48cHL","wiHrZzHF1q","d85a9xReec","Mm8sizY1GY","NAFuwOUYuF","Q6Lix8TxD7","Yf2EctvdkD","MmKGJcL0aE","qUJMdGrDg7","kZANmuTacx",
+"AgJHQJXljW","MezSWQClRL","Nxx9VPb1pa","QChxsGrDg7","9XyT95IhmG","Mkgy8yluBx","8cVD3he9IA","JJs5mxciqp","oVQp6zqH0W","StlDJgtCA5",
+"L7cGczmLYD","AmdQdqaofN","UmaEvSjskQ","prNT6L7cGc","s4786dmoS7","SbRYyuJScX","BCxeCEdBKc","8cVD3a00b5","JKWYRhUTw7","29QAzFLsph",
+"pvgjS6q6L9","euZA57Ow5C","jzUqRBCxeC","EOE1ofcwDa","uJScX9y4lw","Ul4a18RCUA","FnPFBrhl0J","mz8gx0h1b1","suY4x5IhmG","nFqikaL6AJ",
+"14FLRuTacx","3weIFZuDtD","0YAGHFwEJz","lH1kt8hJdt","JJs5mTCgPp","CIShGAgJHQ","2hEEUn8pJ9","a00b524ARF","WDVWJRpBQm","G1RhS29QAz",
+"azIWpFnPFB","jeskS8xEKz","IRh48Qworu","1LB1Li3pyd","RACujjfREu","GXdoHsuY4x","M3zXLtlILt","azIWppiJSk","HzZT8W3VFH","MmsIoXyPZN",
+"a00b5XflUq","CK5W7lpF6W","LbRTHfFDrJ","yofH3v8yFN","dhSuH8U2nU","ThjNn7hyVv","9GXkXYw2oU","ReKEWa00b5","oGu6xciuWz","x3LDe07n1c",
+"DLhzMCIShG","HlUbF5VZjS","okgRiKr8ys","Mm8sifFDrJ","Cfgr3e6e4z","faHirlsQGo","RxrsmUvlv4","8TxD7Yf2Ec","7lUXZSbRYy","tjQxscQOnv",
+"Uvlv4Vprf2","NOHsz2DREs","FPfSE1j5L8","QChxsLewvM","KASQ8QClRL","dmoS7yEfy9","nFqikVerEA","IBe8kbgJAz","l83UdpmeCd","07n1cFLsph",
+"uN6r3O3iyQ","W3VFHZJTXH","VjCZqpiJSk","FcWrWqUJMd","CxVEf8FmFH","lViBv5Mg9r","5ZaEzRkQke","iKqhr1j5L8","gtCA5zY1GY","7fKYULbRTH",
+"IjTwPRBhp0","9rlg9mz8gx","uTacxX6Pin","6q6L94dEz6","NhXdufaHir","8FmFHAXpwE","he9IAIjTwP","DQimpDcpWB","oVQp6MezSW","JIqXib29RJ",
+"QYxC0uLtKs","t98iWgf8rI","RACujNOHsz","iwzGkFNYIM","aDGtSSmGzv","JXljW0Wr5y","RACujaDGtS","n8pJ9Chuy3","ksJbys7Mxk","yEfy9AmdQd",
+"lweGyFcWrW","W3VFHNxx9V","hUTw7tjQxs","faHirbgJAz","D6rByCfgr3","lCMxy7hyVv","v8yFNLDk6f","hYBCKAIYUu","sx5GlS2Dfu","0MR5XYjB9t",
+"CIShG7fKYU","hYBCKzqH0W","tAOsrVBjhz","FnPFBcL0aE","WMiS3FcWrW","EdBKczmLYD","oVQp6fLNg8","dhSuH5ZaEz","StlDJJKWYR","CK5W79rlg9",
+"BFkb8jS1aj","KsjRKnlaBy","Oz8yZS77LH","07n1cFFDui","POUYSQYxC0","WmadARpBQm","W7cTs9eoRc","cShY25Namm","FPfSEXyPZN","yToGWjzUqR",
+"cShY2aez9y","0MR5XMK07Y","GrDg7IRh48","dmoS7IRh48","LDk6f6q6L9","64s8NFjHXR","v8yFNv1Hln","ydG8UThjNn","8cVD3StlDJ","Pb1pauTacx",
+"CK5W7dmoS7","OHaBzPOUYS","X6Pinni2v1","MK07YblLA9","QClRLpWiOs","MGlTFo8Uyd","blLA9kZANm","64s8N29QAz","vOqCEdQ586","lkMUApFrrl",
+"vOqCEU3yw5","I7p2a5drc6","oVQp6QYxC0","4W0TlCdyBV","48cHL7X3uy","uQIczEOE1o","FPfSEMojnP","IKxdLFwEJz","QWxoTCIShG","QYxC0RzaZA",
+"BCxeCgtCA5","uoStwFNYIM","JIqXiO3iyQ","6q6L9CK5W7","D6rByHRxd8","hi5X7KASQ8","ReKEWEOE1o","tvdkD8U2nU","AOgEemz8gx","07n1cbgJAz",
+"fFDrJGSQwj","zmLYD8cVD3","PYBf4XflUq","EOE1ohe9IA","k85AeJXljW","PYBf4AOgEe","HlUbFJKWYR","Vprf2VerEA","lCMxy5nmWv","EoToPWDVWJ",
+"gtCA5rKDLJ","CNHmvVLTy6","Pb1paCp3mZ","4W0TljiVBP","Q6LixbgJAz","faHirfmIK1","0Wr5yt98iW","Dz1R3UlU3M","VjCZqrz7Ut","yvOMIdpe1v",
+"NOHszFNYIM","8xEKzbgJAz","hi5X7FPfSE","hUTw7SjskQ","zHF1qzFgtB","9y4lwQworu","2Yz7EVIlwP","jtn0XG1RhS","bgJAzbrhlQ","SWfou2ZHdk",
+"IRh48soy9t","fLNg8StlDJ","No0Qb64s8N","Nxx9VCp3mZ","AIYUuogLgc","BbwgA16lHc","aL6AJFwEJz","8TxD7RkQke","7fKYUuPX7G","n8pJ9jSjS3",
+"FVMxoRxrsm","Gv3Fq9GXkX","RkQkelsQGo","RzaZA0MR5X","VerEA7fKYU","5ZaEzvOqCE","yluBxWreyP","4W0Tl7fKYU","djsrvmz8gx","gdQsSfcwDa",
+"LbRTHtl72W","SmGzvulk41","ZhwG1lH1kt","CIShGZuDtD","OUYuFMaJQs","CNHmvRkQke","rKDLJ5Mg9r","uLtKssx5Gl","zmLYDDz1R3","16lHczmLYD",
+"618DiLewvM","5NammhYBCK","QworubZLvS","FFDui8cVD3","nnP8o7hyVv","D6rBy8cVD3","U3yw5HfyNQ","9rlg9fFDrJ","9eoRc8xEKz","GSQwjX6Pin",
+"gIYvEdjsrv","Z4I1v14FLR","CIShGazIWp","O3iyQFFDui","a00b52Nslm","fqypyPOUYS","okgRiEdBKc","e6e4zyToGW","hi5X7U3yw5","djsrvhSSvQ",
+"Q6hMCuAWyp","fcJOyHfyNQ","1j5L8uvf7A","FNYIMAXpwE","zmLYDrKDLJ","9GXkXprNT6","piJSkNAFuw","uAWypa00b5","iwzGkuJScX","rKDLJTCgPp",
+"GrDg7Q6hMC","a00b5S2Dfu","fqypygIYvE","aDGtSt98iW","45cIHyluBx","6AFT0NOHsz","0Wr5y0h1b1","07n1c8RCUA","LDk6f8hJdt","3otm60YAGH",
+"Mkgy8aDGtS","FFDuiEoToP","5drc6KsjRK","I7p2a6AFT0","DQimpS77LH","Ta8f6s7Mxk","AIYUu8U2nU","StlDJC2Irc","ksJbyXyPZN","2NslmZUnqt",
+"BGaQYFVMxo","SbRYyMGlTF","D6rByDz1R3","FVMxoMaJQs","Y1mC0lH1kt","FPfSEpmeCd","Mm8siuQIcz","3otm6lj07Q","lH1ktOHaBz","EOE1oZUnqt",
+"pAhR1zqH0W","jtn0Xs7Mxk","YOfrYblLA9","gtCA5DLhzM","2TRI7rhl0J","GSQwjUmaEv","HRxd81j5L8","qUJMd5Namm","rz7UtUvlv4","UlU3Mhi5X7",
+"3weIFsqVrf","yvOMIn1pmO","Yw2oUhE1Ql","HRxd8pmeCd","gdQsSb29RJ","45cIHGrDg7","SjskQQssNC","16lHcpiJSk","Z4I1vStlDJ","SbRYytuDyS",
+"FcWrWfqypy","7hyVvDG4sT","P6bcgBFkb8","MezSWSbRYy","45cIHSs0Zu","taOXK45cIH","7ku1pDQimp","2hEEU5iGN5","29QAzulk41","vkCHHazIWp",
+"VNCPd580YD","m4bxUTXQ0Z","vOqCEksJby","VerEAKZamH","5Mg9ruJScX","MmsIoOz8yZ","8cVD3s4786","QClRLs4786","K20wK45cIH","4dEz6Kr8ys",
+"4W0TlRBhp0","X6PinUl4a1","8RCUAjS1aj","FxX9qyvOMI","lH1ktI7p2a","P6bcgBGaQY","oVQp6In3NS","v8yFN5Drn0","MmsIorz7Ut","XflUqEdBKc",
+"TwanoxReec","OUYuFuLtKs","qaofNlpF6W","Ta8f6tvdkD","QssNChYBCK","KsjRKKZamH","Yf2EciKqhr","In3NSlj07Q","aFFssl83Ud","Oz8yZFGzgp",
+"gjUTuDLhzM","6AFT0tl72W","h1zcHpiJSk","gdQsSSs0Zu","zbIYY8hJdt","uJScXU3yw5","n8pJ97ku1p","RzaZAHzZT8","GSQwjzmLYD","GXdoHUl4a1",
+"AgJHQmz8gx","jSjS3cmXIX","IjTwPTCgPp","cL0aEhe9IA","ulk41OxWIH","zmLYDSbRYy","he9IADcpWB","wiHrZhe9IA","MojnPciuWz","uPX7GoVQp6",
+"iwzGkWmadA","NOHszvOqCE","AXpwEI7p2a","zY1GY618Di","dpe1vgtCA5","8cVD31LB1L","2TRI70YAGH","gjUTutjQxs","RpBQmd85a9","EdBKcNo0Qb",
+"ZuDtDKASQ8","Cfgr3ulk41","JXljWCqqaD","aez9yStlDJ","X6PinogLgc","lXFOBJ2mQi","lj07QB3qem","yofH3OxWIH","RpBQmCNHmv","24ARFt98iW",
+"xXTI4MmsIo","BCxeCCqqaD","45cIHM6qcG","uLtKs9eoRc","CqqaD1j5L8","9rlg9jzUqR","9iGoTe6e4z","pWiOsVerEA","5IhmGWMiS3","SWfoumX2GE",
+"RACujAOgEe","DcpWBv8yFN","ksJbyZv7z0","mz8gxK20wK","oGu6xs4786","LewvM2TRI7","CqqaDJJs5m","K4GS8CqqaD","MezSW7Ow5C","uAWypNOHsz",
+"5IhmGUl4a1","pvgjSHzZT8","lsQGoS2Dfu","F6PT2he9IA","HRxd8POUYS","OUqFMW3VFH","hi5X764s8N","W7cTsuAWyp","F6PT29eoRc","OUYuFFhtgl",
+"EOE1osoy9t","SjskQsqVrf","Cp3mZguMb8","JIqXiQChxs","2hEEUjeskS","lViBvOHaBz","RBhp0S2Dfu","vOqCE2Yz7E","55rfBDcpWB","EdBKciKqhr",
+"TXQ0Zjtn0X","zHF1qC2Irc","TXQ0ZOUYuF","yEfy9cmXIX","MaJQsk85Ae","Zv7z0uTacx","ZUnqtHRxd8","zbIYYd85a9","hUTw714FLR","8U2nUS2Dfu",
+"uN6r3FFDui","lViBvVjCZq","HRxd8DLhzM","JkzUna00b5","d85a9GXdoH","v1HlnPOUYS","6AFT0WreyP","e6e4zMezSW","gIYvEh1zcH","RkQkeAmdQd",
+"gtCA5v2eC3","Kr8ysKsjRK","OUqFMl83Ud","2DREsJJs5m","n8pJ96q6L9","WmadAM3zXL","Pb1paMm8si","2NslmC2Irc","QbxXc55rfB","5nmWvsx5Gl",
+"hE1QlHP433","ni2v1dQ586","nnP8ozbIYY","M6qcGaDGtS","aFFssuN6r3","lViBvFcWrW","CdyBVHP433","W3VFHzbIYY","s93MlCdyBV","Uvlv4lweGy",
+"oGu6x2TRI7","Oz8yZuJScX","v8yFN2ZHdk","EoToPJIqXi","jfREuVjCZq","mX2GESWfou","pv0i73weIF","hi5X7vLsmS","uvf7Ani2v1","oQ87rX6Pin",
+"TXQ0ZAXpwE","ix74rMK07Y","0Kyfs0h1b1","6q6L9J2mQi","uN6r3gIYvE","suY4x0BmCy","5Mg9r64s8N","Kr8ysFFDui","RBhp0fmIK1","prNT6ZJTXH",
+"L7cGcIjTwP","jtn0XqQxHP","d85a9S2Dfu","vkCHHAgJHQ","BGaQYC2Irc","Fhtgl4W0Tl","hE1QluLtKs","OHaBzYOfrY","ksJbyaFFss","fmIK1JRJQB",
+"QbxXcHzZT8","07n1cuJScX","Q6hMCKr8ys","AOgEeb29RJ","vLsmSv2eC3","EdBKcy94nw","NcICAeuZA5","aDGtShi5X7","BCxeC0BmCy","Gv3FqVIlwP",
+"Yf2Ec5IhmG","KsjRKPYBf4","iqv4k9y4lw","hi5X7Cfgr3","NcICA0PktI","Waim6hE1Ql","Waim6RmDcr","NcICAWreyP","LewvMSWfou","Yh1hFpAhR1",
+"uQIczoQ87r","qQxHPhYBCK","EOE1oCK5W7","SjskQEdBKc","BpYhV24ARF","prNT6suY4x","1LB1L0Kyfs","CxVEf5Mg9r","OUqFMlm0pD","1j5L8gtCA5",
+"MGlTFRsQUq","s7Mxkt59lR","v1HlnQnJ1S","HRxd8m4bxU","1v5hHjfREu","WmadALDk6f","ZzJHWaL6AJ","7hyVv7X3uy","s93MldmoS7","RACuja00b5",
+"lH1ktCNHmv","i3pydWaim6","2Yz7E618Di","CqqaD64s8N","TCgPpmX2GE","W3VFHK20wK","RACuj5drc6","t98iWqUJMd","yToGWVBjhz","Ta8f6v1Hln",
+"uupzkiB08l","iqv4kzQt6Q","7X3uy5nmWv","29QAzECMvU","cmXIXyluBx","uvf7ASmGzv","3weIFpT8wu","KASQ8s4786","5Mg9r3otm6","8hJdti3pyd",
+"he9IASmGzv","xXTI45Drn0","VNCPdG1RhS","sx5GloVQp6","hSSvQvkCHH","CdyBVQYxC0","DG4sThE1Ql","S77LHFLsph","gjUTuMK07Y","1LB1L07n1c",
+"qaofNRmDcr","W3VFH8RCUA","brhlQCxVEf","rz7UtwDajX","AkKTkNOHsz","h1zcHuoStw","7hyVvv1Hln","HP433aDGtS","EdBKc29QAz","VLTy6GSQwj",
+"FVMxoMGlTF","JRJQB8cVD3","cQOnv9y4lw","hE1QlNAFuw","1v5hHRpBQm","jeskSv8yFN","5NammgjUTu","RsQUqVLTy6","EOE1odhSuH","lpF6WcQOnv",
+"ydG8U16lHc","uPX7GK20wK","tlILtWMiS3","Kr8ysogLgc","Ta8f6LbRTH","XyPZNiqv4k","Cfgr30PktI","oQ87r9GXkX","FNYIMMojnP","dmoS7zY1GY",
+"HRxd8Q6Lix","Yf2EcMezSW","soy9tNcICA","X6Pin0MR5X","NcICAoQ87r","tl72WOUYuF","FwEJzSWfou","jSjS3rz7Ut","piJSkCfgr3","MezSWyEfy9",
+"JKWYR0Wr5y","X6Pinuvf7A","ECMvU0h1b1","nnP8oVIlwP","GrDg7EdBKc","Q6hMCC2Irc","7hyVvNo0Qb","Y1mC0ix74r","WmadAoQ87r","7lUXZuupzk",
+"AmdQd3weIF","IBe8kuZPqg","ksJbyrhl0J","azIWpZ4I1v","yToGWM3zXL","In3NS5Drn0","fqypys4786","ciuWzaez9y","CxVEf1v5hH","5drc6lpF6W",
+"HlUbFvLsmS","guMb89y4lw","OHaBz0PktI","48cHLReKEW","L7cGczHF1q","8U2nUzHF1q","rhl0JuZPqg","CxVEfKASQ8","NOHsz16lHc","azIWpblLA9",
+"PYBf4F6PT2","BpYhVD6rBy","zz4ZU2Yz7E","FFDuipv0i7","gjUTugtCA5","9eoRcJJs5m","aDGtS8RCUA","lViBvTwano","SbRYydQ586","yofH3qaofN",
+"lCMxy1j5L8","IKxdLMm8si","HzZT8HfyNQ","pAhR1uLtKs","K4GS8IjTwP","oQ87r1v5hH","2NslmChuy3","jS1ajmX2GE","pT8wubZLvS","8hJdtW7cTs",
+"Q6Lixtl72W","0KyfszHF1q","8xEKzfaHir","uAWyp7lUXZ","uPX7GWMiS3","7ku1pPb1pa","zQt6QoGu6x","EdBKcjfREu","JRJQB0h1b1","FcWrWRpBQm",
+"QssNCMm8si","7X3uytaOXK","hUTw7P6bcg","LbRTHB3qem","2ZHdklH1kt","RpBQmRmDcr","7fKYUfqypy","ksJby16lHc","hYBCKIRh48","oVQp6GSQwj",
+"jiVBP0YAGH","2NslmMezSW","OUYuFru4UG","QChxsKASQ8","8hJdty94nw","LDk6f0ao3l","s93MlVNCPd","zqH0Wmz8gx","uZPqgRACuj","OUqFMX6Pin",
+"v8yFNtuDyS","ksJbydmoS7","QbxXcTCgPp","45cIHk85Ae","MmKGJFNYIM","dQ586WMiS3","soy9tLDk6f","faHirQClRL","FcWrWCxVEf","dpe1vRACuj",
+"LbRTHQssNC","qUJMdnnP8o","Vprf2EdBKc","0PktIqaofN","5drc60BmCy","0PktILbRTH","FjHXRprNT6","rz7UtFFDui","7Ow5CeuZA5","m4bxUlXFOB",
+"Yh1hFuTacx","RACujCIShG","hi5X714FLR","L7cGcVIlwP","ni2v14W0Tl","M3zXLJkzUn","JRJQB64s8N","ix74r4dEz6","HRxd8Z4I1v","i7WMQfcwDa",
+"QYxC0RmDcr","FcWrWpv0i7","48cHLCdyBV","fLNg8FNYIM","QbxXcbZLvS","9y4lw07n1c","S77LHJKWYR","GSQwjjSjS3","YOfrYs7Mxk","RxrsmTwano",
+"GSQwjP6bcg","rhl0JgtCA5","8FmFHyEfy9","prNT68FmFH","UmaEvStlDJ","9XyT9tl72W","Q6LixpmeCd","24ARFBCxeC","ThjNnQClRL","JKWYRgf8rI",
+"XflUqa00b5","zY1GYtvdkD","8FmFHNo0Qb","kB5nPKr8ys","M3zXLZzJHW","pmeCdydG8U","VNCPdF6PT2","s7MxkVIlwP","jeskSYOfrY","pmeCdMm8si",
+"uZPqgUlU3M","MmsIoQWxoT","bZLvS6q6L9","HlUbF2TRI7","NcICAm4bxU","rz7UtRpBQm","uQIczBFkb8","WDVWJuupzk","jS1ajlpF6W","YOfrY55rfB",
+"9iGoTlCMxy","2Yz7EZuDtD","vkCHHnnP8o","StlDJFNYIM","RmDcrM6qcG","IjTwPzbIYY","e6e4z8cVD3","2ZHdkoVQp6","No0QbM6qcG","ydG8UCIShG",
+"2NslmVBjhz","07n1cprNT6","9eoRcQbxXc","GWqqXFVMxo","9GXkXfqypy","FxX9qHfyNQ","JkzUnsuY4x","fFDrJhYBCK","zmLYDnFqik","0Wr5yFjHXR",
+"mz8gxFjHXR","CNHmvx3LDe","9iGoTDG4sT","ZhwG1Gv3Fq","MojnP8TxD7","EdBKcjeskS","0MR5XXyPZN","KZamHHzZT8","KsjRKMK07Y","atef27hyVv",
+"O3iyQW3VFH","5iGN5Twano","JRJQBoQ87r","d85a99XyT9","fcJOy4dEz6","BGaQYY1mC0","29QAzdhSuH","7lUXZFcWrW","FnPFBzQt6Q","FGzgpRsQUq",
+"DcpWByofH3","DQimpQworu","YjB9tvkCHH","yluBxuN6r3","piJSkW7cTs","W3VFHRkQke","5VZjSt59lR","Zv7z0SjskQ","55rfBMm8si","uTacxYw2oU",
+"8xEKzSjskQ","No0Qb2ZHdk","FGzgpXyPZN","4QMc9he9IA","v8yFNs93Ml","tuDySGrDg7","JIqXiY1mC0","e6e4zhSSvQ","lweGyS2Dfu","wDajX2Yz7E",
+"d7vjMsuY4x","jS1ajCqqaD","cQOnvt59lR","WmadA14FLR","zY1GYWMiS3","qQxHPUlU3M","e6e4zQYxC0","OHaBzzmLYD","faHirzqH0W","jzUqRk85Ae",
+"fqypyLDk6f","JRJQBgdQsS","HfyNQjfREu","HRxd8s7Mxk","AmdQd9rlg9","5iGN5ogLgc","LbRTHIKxdL","yEfy9suY4x","U3yw5G1RhS","pWiOs0Kyfs",
+"fmIK16AFT0","nFqikDLhzM","guMb8Ss0Zu","mX2GEguMb8","JkzUnHlUbF","Rxrsm0Kyfs","uLtKspvgjS","FLsphtvdkD","JJs5mAmdQd","2hEEUWaWsv",
+"Oz8yZWPmlx","pT8wuydG8U","RxrsmXflUq","zQt6QWaim6","4QMc9lCMxy","WaWsvK4GS8","piJSk2TRI7","LDk6fgtCA5","rz7UtvkCHH","QnJ1Ss93Ml",
+"Ta8f6SmGzv","QWxoTvLsmS","tlILtpvgjS","2DREsJRJQB","Zv7z0MK07Y","FNYIMyvOMI","FPfSEs93Ml","lpF6WJkzUn","rhl0JOUqFM","X6PinPb1pa",
+"2hEEUP6bcg","EdBKcJJs5m","1v5hH2TRI7","WmadAdpe1v","5ZaEzGv3Fq","0Kyfsru4UG","0Wr5yHzZT8","vkCHHTwano","lj07Q0Kyfs","Uvlv4zqH0W",
+"jiVBPVIlwP","HzZT8Pb1pa","NAFuwjSjS3","14FLRM3zXL","SmGzviB08l","jS1ajlsQGo","7fsYMVNCPd","cQOnvY1mC0","580YDn8pJ9","tvdkDciuWz",
+"EdBKchUTw7","MmKGJKZamH","dmoS70h1b1","WreyPs93Ml","aez9yvLsmS","OUYuFFPfSE","ZUnqt2DREs","JXljWHP433","d7vjMK4GS8","7hyVvSWfou",
+"t59lR8FmFH","hi5X7CIShG","BCxeCBGaQY","HRxd8atef2","Zv7z0lViBv","1j5L8pvgjS","uZPqg1v5hH","Uvlv4IBe8k","zFgtBdpe1v","tl72WNxx9V",
+"lsQGodjsrv","Chuy3GWqqX","KsjRKHfyNQ","JKWYRcQOnv","zqH0WBbwgA","rz7UtqaofN","JRJQBrhl0J","Qworu29QAz","SjskQCNHmv","U3yw5v8yFN",
+"8TxD7BGaQY","CxVEfC2Irc","4dEz6blLA9","mz8gxTa8f6","azIWpVLTy6","8xEKzuvf7A","0h1b1gtCA5","uPX7GTa8f6","Fhtgl64s8N","SbRYyCxVEf",
+"9eoRcCxVEf","VerEAaDGtS","CxVEfWPmlx","K4GS8Uvlv4","tuDyStlILt","Nxx9VlsQGo","XyPZN7hyVv","SmGzvCdyBV","5Drn0WPmlx","0Wr5y8RCUA",
+"QnJ1SF6PT2","aL6AJru4UG","dhSuHM6qcG","cmXIXblLA9","piJSkiB08l","IRh48Q6hMC","kB5nPMojnP","qaofNSjskQ","tl72WydG8U","oGu6x5ZaEz",
+"HP433aL6AJ","aDGtSpiJSk","aFFssY1mC0","NcICAix74r","ulk41hE1Ql","dhSuHZ4I1v","pT8wujSjS3","xXTI4W7cTs","ThjNnVBjhz","oVQp60BmCy",
+"5NammvOqCE","guMb8LDk6f","JIqXiQWxoT","0Wr5yatef2","tvdkDvLsmS","wDajX7Ow5C","okgRigdQsS","MmKGJ45cIH","D6rByprNT6","DQimpgjUTu",
+"pWiOsbrhlQ","i7WMQP6bcg","M6qcGC2Irc","tl72Wi7WMQ","aez9ytaOXK","2Yz7EkZANm","JIqXiK4GS8","yToGWi7WMQ","GWqqXD6rBy","Q6LixNOHsz",
+"BpYhVP6bcg","zY1GYwiHrZ","2hEEUVjCZq","yEfy9Waim6","ECMvU0BmCy","djsrvtuDyS","GSQwjn8pJ9","lXFOBHP433","Chuy3rKDLJ","NcICA8FmFH",
+"azIWpF6PT2","5Drn0NOHsz","24ARF0Wr5y","KsjRKuPX7G","faHirDQimp","b29RJjSjS3","8TxD7KZamH","0YAGHW3VFH","TCgPpFcWrW","fcwDannP8o",
+"Yf2EcZhwG1","pmeCdIjTwP","3otm6VjCZq","QnJ1SpFrrl","brhlQK20wK","FwEJzS77LH","X6Pin7Ow5C","tuDySRpBQm","MK07YThjNn","LDk6fPb1pa",
+"5Drn05nmWv","CNHmvguMb8","VIlwPSWfou","ThjNnBpYhV","cQOnvWPmlx","i7WMQjtn0X","P6bcgEdBKc","okgRilm0pD","DQimpCfgr3","aez9yVLTy6",
+"RsQUqgIYvE","yofH3ZuDtD","FwEJzFhtgl","rhl0JiwzGk","hUTw7l83Ud","16lHc4dEz6","I7p2as93Ml","5Mg9rY1mC0","2Nslmt98iW","KsjRKblLA9",
+"FcWrW2TRI7","K4GS85drc6","fqypyhUTw7","KZamHuAWyp","Y1mC0kB5nP","6AFT0JKWYR","FwEJzdQ586","J2mQipFrrl","DQimpPb1pa","guMb8FPfSE",
+"Rxrsmmz8gx","0MR5X1v5hH","pvgjScShY2","MmKGJru4UG","0BmCyAXpwE","brhlQpmeCd","lXFOBNOHsz","GXdoHlm0pD","fcJOylm0pD","0h1b1rhl0J",
+"64s8NTa8f6","yvOMIuvf7A","i3pydRkQke","fmIK10YAGH","SWfouTXQ0Z","BGaQY64s8N","iqv4k0BmCy","5nmWvuQIcz","W3VFHL7cGc","uTacxS77LH",
+"F6PT2JJs5m","he9IAIn3NS","cL0aEiKqhr","v1HlnNxx9V","WPmlxAmdQd","yEfy9SbRYy","xciqpAIYUu","lH1ktWmadA","Ta8f6AOgEe","AIYUuVIlwP",
+"Ta8f6QbxXc","Ss0ZuUl4a1","WmadA9y4lw","WreyPVjCZq","5nmWvtlILt","3weIF5Drn0","cmXIX0h1b1","fFDrJ0ao3l","RmDcrhSSvQ","X6PinNo0Qb",
+"taOXKS2Dfu","Q6hMCyEfy9","SWfouUmaEv","Q6hMCtlILt","WaWsv3otm6","aDGtSAIYUu","XflUq5Drn0","8xEKz0BmCy","64s8NlH1kt","7hyVvni2v1",
+"9y4lw7fKYU","suY4xXflUq","uoStwTwano","16lHcpvgjS","SbRYyDLhzM","5Mg9rAXpwE","iwzGk5ZaEz","yToGWB3qem","0BmCyoQ87r","lweGygIYvE",
+"d7vjMjtn0X","TCgPpiKqhr","B3qemzmLYD","5iGN514FLR","7fKYUaL6AJ","kB5nP5Mg9r","EoToPVerEA","CK5W7zFgtB","PYBf4S77LH","AIYUut98iW",
+"0BmCyVLTy6","k85Aeni2v1","jiVBPulk41","D6rBy5drc6","CqqaDBbwgA","No0QbfFDrJ","Cfgr3Y1mC0","uLtKskZANm","fqypytaOXK","S2DfuDLhzM",
+"CK5W72ZHdk","QWxoTjS1aj","RxrsmjiVBP","8RCUA7hyVv","he9IAtAOsr","Waim645cIH","IRh48fmIK1","No0QbpWiOs","CqqaDguMb8","uN6r3ThjNn",
+"taOXKgf8rI","fFDrJ8hJdt","h1zcHsuY4x","gdQsSVBjhz","0ao3lix74r","YOfrYlXFOB","euZA5BpYhV","9GXkX8TxD7","CqqaDGXdoH","tuDyS9GXkX",
+"a00b514FLR","Qworun1pmO","pv0i75IhmG","nlaByru4UG","blLA9CqqaD","xciqpCK5W7","WPmlx1LB1L","UmaEvvLsmS","WreyPVIlwP","gf8rIRsQUq",
+"0PktIgtCA5","48cHLAmdQd","AkKTkS2Dfu","KASQ8ZUnqt","6AFT09GXkX","hUTw7t98iW","guMb82DREs","LDk6fCxVEf","sqVrfUmaEv","LbRTHru4UG",
+"WDVWJGXdoH","WaWsvRmDcr","WMiS3hSSvQ","Uvlv4oQ87r","iB08lGSQwj","Q6LixlH1kt","dmoS7jtn0X","y94nwECMvU","zHF1quTacx","29QAzlpF6W",
+"618DiFjHXR","5Drn0CdyBV","MmKGJAgJHQ","MmsIox3LDe","BFkb8TXQ0Z","7ku1pCIShG","jzUqR7lUXZ","ix74rPOUYS","cShY2FxX9q","48cHLl83Ud",
+"s7MxkbZLvS","F6PT2bgJAz","5drc607n1c","FwEJzzY1GY","Pb1pa7hyVv","07n1cOxWIH","b29RJfFDrJ","P6bcgX6Pin","MojnPlH1kt","W7cTsVBjhz",
+"RxrsmDz1R3","Nxx9VfaHir","HfyNQcShY2","ECMvUVprf2","lsQGobrhlQ","pvgjSdhSuH","fcJOyuZPqg","Z4I1vsuY4x","pT8wuUmaEv","djsrvo8Uyd",
+"Y1mC0Mkgy8","AkKTkFwEJz","ZUnqtVerEA","WreyPAIYUu","5Drn0L7cGc","B3qemfaHir","qQxHPC2Irc","JKWYRlCMxy","9iGoTEdBKc","mz8gxHzZT8",
+"taOXKMezSW","XflUqVjCZq","fcwDaBbwgA","dmoS7a00b5","faHir2Nslm","mX2GEW7cTs","NAFuwO3iyQ","hYBCKRzaZA","lsQGookgRi","ZhwG1GSQwj",
+"X6Pin24ARF","I7p2aPOUYS","RzaZAI7p2a","FVMxohE1Ql","Z4I1vYh1hF","iB08lkZANm","POUYS7hyVv","sqVrfcL0aE","HzZT80h1b1","jtn0XRBhp0",
+"yluBxVjCZq","wiHrZVIlwP","JKWYRY1mC0","No0QbJkzUn","fqypyU3yw5","v2eC38FmFH","zY1GYrz7Ut","okgRid85a9","DLhzMpmeCd","GWqqXoQ87r",
+"ThjNnyToGW","uvf7AxReec","Chuy3FVMxo","StlDJv8yFN","euZA5S77LH","gdQsSNxx9V","WreyPOUYuF","zbIYY2ZHdk","Ul4a1GWqqX","pmeCd48cHL",
+"VNCPdogLgc","aez9yEoToP","5iGN5Vprf2","5ZaEzuN6r3","aDGtSyvOMI","OHaBzUlU3M","FGzgpW3VFH","fcwDaiwzGk","i7WMQAOgEe","i7WMQGrDg7",
+"d7vjMRkQke","9rlg99iGoT","v8yFN4dEz6","Rxrsm9GXkX","uZPqg4W0Tl","CdyBVqQxHP","AkKTkfcJOy","1LB1LPYBf4","dQ586e6e4z","yToGWS77LH",
+"4dEz60Wr5y","pT8wu8U2nU","MojnPs7Mxk","9iGoT5IhmG","Twanopv0i7","IjTwPCqqaD","FjHXRpWiOs","9GXkXCK5W7","AOgEeuJScX","QssNCNo0Qb",
+"fcwDaCp3mZ","ydG8UyToGW","fcwDaCxVEf","VIlwPNo0Qb","SWfouTCgPp","RzaZAdmoS7","1LB1LjeskS","sx5GlBGaQY","zHF1q7Ow5C","yofH345cIH",
+"ogLgci7WMQ","ECMvU9eoRc","QWxoT2Nslm","AXpwELbRTH","AkKTklCMxy","WMiS3nlaBy","vOqCEpv0i7","8hJdtVerEA","lXFOBpFrrl","G1RhSlm0pD",
+"DQimpTwano","i3pyd8FmFH","IBe8kuupzk","mz8gxQnJ1S","hYBCKuTacx","vkCHHydG8U","8TxD72hEEU","s4786QssNC","Yf2Ecru4UG","AkKTkzmLYD",
+"SjskQCK5W7","DQimpzmLYD","Ul4a1tjQxs","RsQUqVBjhz","WaWsvMkgy8","0BmCylpF6W","atef27lUXZ","WMiS3FnPFB","GXdoHjeskS","WMiS3yToGW",
+"VjCZq0ao3l","4W0Tl5drc6","2TRI7M6qcG","hUTw7Waim6","RsQUqLewvM","YjB9tQssNC","JJs5m7fKYU","TCgPpMkgy8","X6Pin5Namm","XflUqru4UG",
+"zFgtBW3VFH","yluBxdpe1v","MezSWgIYvE","48cHLeuZA5","CK5W7uupzk","cQOnvs4786","Gv3FqHlUbF","tlILtIBe8k","QssNCHP433","dmoS7gIYvE",
+"MojnP9rlg9","HzZT8Mkgy8","Yf2EcwiHrZ","cQOnvCK5W7","tAOsrWreyP","In3NSqUJMd","ciuWzzFgtB","tlILtL7cGc","vOqCEfcwDa","In3NSJXljW",
+"LDk6f0Wr5y","mX2GEd7vjM","5IhmGAXpwE","5Mg9r8cVD3","m4bxUix74r","TwanoaFFss","FVMxos7Mxk","dpe1v0ao3l","MojnPgdQsS","jiVBPDz1R3",
+"NcICACK5W7","mX2GE07n1c","8RCUAdQ586","IRh48s4786","5drc6DG4sT","nnP8ozz4ZU","FGzgpWreyP","jeskSpmeCd","mX2GEX6Pin","bZLvSCK5W7",
+"xReecni2v1","s93MlPb1pa","29QAzOUYuF","MmsIonlaBy","Fhtgl5nmWv","lViBvU3yw5","KsjRKbZLvS","iqv4kxciqp","uupzkdQ586","SjskQpFrrl",
+"BCxeC07n1c","zqH0W8hJdt","LbRTH618Di","qaofNIRh48","s47864W0Tl","azIWpHP433","x3LDem4bxU","BGaQY16lHc","7hyVvFNYIM","uAWypUvlv4",
+"BCxeCt59lR","ciuWzyofH3","fLNg8soy9t","ReKEWaL6AJ","zqH0WQworu","uN6r3d85a9","lweGy9iGoT","xReecUlU3M","JXljWjfREu","zbIYYHfyNQ",
+"dhSuHkB5nP","QworuStlDJ","fcwDawDajX","b29RJoQ87r","kB5nPHlUbF","hSSvQcL0aE","Pb1pagf8rI","7fKYUlH1kt","n8pJ9P6bcg","SjskQaFFss",
+"MezSWFxX9q","wDajX8U2nU","QnJ1StjQxs","hUTw7iB08l","CqqaDM6qcG","XflUqbgJAz","zbIYYUl4a1","IKxdLrKDLJ","KsjRKYw2oU","HzZT8Uvlv4",
+"tl72WBCxeC","Fhtgl8U2nU","64s8NL7cGc","TwanouoStw","gdQsSokgRi","8FmFHZhwG1","8hJdt8TxD7","zQt6QxReec","FjHXRVBjhz","OUYuFyEfy9",
+"AIYUu7hyVv","KASQ8zFgtB","HfyNQb29RJ","ZhwG1yofH3","4W0Tl5Drn0","azIWps4786","FFDui6q6L9","MmsIo14FLR","hi5X7jS1aj","jS1aj8U2nU",
+"m4bxUprNT6","d85a9JXljW","Cfgr3wiHrZ","CIShGFnPFB","45cIHRmDcr","IRh486AFT0","zbIYYAXpwE","64s8NwDajX","ZuDtDuZPqg","i3pyd4dEz6",
+"6AFT0ZuDtD","s4786VBjhz","0BmCy0BmCy","uoStwiKqhr","AOgEeCdyBV","dmoS7zHF1q","t98iWpvgjS","aFFsstaOXK","EdBKcBGaQY","Q6Lix1v5hH",
+"5iGN5soy9t","LbRTHcmXIX","7lUXZ7lUXZ","uvf7AAIYUu","Dz1R3hYBCK","cL0aE6AFT0","ksJbyTCgPp","UmaEvxXTI4","AXpwEokgRi","dQ586DQimp",
+"RBhp0HP433","piJSkMGlTF","Uvlv4SWfou","MmKGJVBjhz","guMb824ARF","0KyfsxReec","KASQ8oVQp6","8hJdtfcwDa","euZA5FNYIM","JRJQBPOUYS",
+"29QAzZUnqt","lkMUAi7WMQ","JJs5mjfREu","tuDySG1RhS","gjUTuMaJQs","FwEJz9iGoT","1LB1LbZLvS","Dz1R3GSQwj","sx5GlStlDJ","W7cTsChuy3",
+"CqqaDjS1aj","OxWIHAOgEe","n8pJ9hi5X7","WreyPs7Mxk","blLA9JRJQB","l83UdVerEA","zHF1qVBjhz","Zv7z0vLsmS","XyPZNKASQ8","Cp3mZJkzUn",
+"jzUqRXyPZN","pAhR1jzUqR","uQIczzqH0W","Qworu64s8N","KZamHDQimp","ReKEWFNYIM","VerEAzqH0W","7Ow5CZ4I1v","FVMxoW3VFH","CNHmvDcpWB",
+"v1HlngdQsS","Ul4a1fLNg8","azIWpMkgy8","xXTI48xEKz","ZJTXHJKWYR","v1HlnLDk6f","U3yw5DLhzM","WmadAWPmlx","lViBvFFDui","fqypyDQimp",
+"OHaBzcQOnv","8xEKzMojnP","EoToPhSSvQ","07n1cRzaZA","iB08lyvOMI","FGzgpKZamH","45cIHwiHrZ","9iGoTZJTXH","3otm6QssNC","D6rBypiJSk",
+"TCgPp2TRI7","gdQsS64s8N","hSSvQSjskQ","d7vjMKr8ys","Ta8f6P6bcg","JkzUnaFFss","zHF1qCdyBV","gIYvEGv3Fq","piJSkL7cGc","ZuDtDlXFOB",
+"GrDg7zHF1q","3weIFWmadA","MmKGJqUJMd","CqqaD6q6L9","pWiOsgf8rI","SjskQb29RJ","Z4I1vL7cGc","64s8NRxrsm","AkKTkEOE1o","FcWrWNo0Qb",
+"LDk6f48cHL","okgRidmoS7","FxX9q2DREs","5Drn0OUYuF","a00b5FwEJz","S2DfupWiOs","In3NSY1mC0","M3zXLrz7Ut","pFrrlB3qem","NAFuw2DREs",
+"sx5Gl9y4lw","yToGW7ku1p","RACujHlUbF","QClRL9GXkX","QYxC0XflUq","vLsmSS77LH","S2Dfu1v5hH","brhlQnFqik","Dz1R33weIF","zmLYDtuDyS",
+"yvOMI5Namm","blLA9y94nw","AIYUuxReec","BFkb8AmdQd","9y4lwSbRYy","0PktIUvlv4","qUJMdd85a9","tl72W7lUXZ","0PktIOUYuF","45cIHhE1Ql",
+"fFDrJL7cGc","3weIFoQ87r","zY1GYtl72W","ThjNn45cIH","kZANm3weIF","3weIFwiHrZ","RACujRzaZA","WmadAYh1hF","MmKGJM3zXL","HzZT8RzaZA",
+"ZzJHW07n1c","n8pJ9yluBx","GWqqXPOUYS","mz8gxdjsrv","nlaBynlaBy","RpBQmbZLvS","Waim6MmKGJ","K20wKQ6Lix","2ZHdkJIqXi","8RCUAHP433",
+"HlUbFgf8rI","Ul4a1nnP8o","EOE1oPOUYS","gIYvEPYBf4","uJScXpWiOs","NhXdueuZA5","pFrrlHRxd8","nlaBy4dEz6","FnPFB2DREs","v8yFNix74r",
+"rz7UtMmKGJ","5iGN5RkQke","k85AeF6PT2","v8yFNd7vjM","wiHrZL7cGc","zbIYYiqv4k","zQt6QpFrrl","8RCUAprNT6","cmXIX6AFT0","pv0i7jSjS3",
+"AgJHQaDGtS","NAFuw0YAGH","zQt6Qsx5Gl","Yh1hFRsQUq","piJSk4QMc9","DLhzMzHF1q","atef2GSQwj","B3qemjzUqR","2DREsLDk6f","U3yw5lm0pD",
+"NcICAMkgy8","prNT6QnJ1S","OUqFMM6qcG","C2Ircgf8rI","OUqFMFNYIM","dhSuHWDVWJ","5drc6dQ586","nlaByaez9y","blLA9aFFss","QbxXc9iGoT",
+"y94nwNcICA","RpBQmJKWYR","CIShG07n1c","2TRI7s7Mxk","2TRI7EoToP","kZANmHzZT8","UmaEvWPmlx","vLsmSS2Dfu","W3VFHQworu","5Mg9ryEfy9",
+"9eoRczz4ZU","MK07YJXljW","5IhmGRpBQm","aFFssDLhzM","qaofNCxVEf","2ZHdkblLA9","7fsYMMkgy8","oGu6xIjTwP","blLA9HP433","MojnPa00b5",
+"pWiOsvkCHH","0KyfsFFDui","lViBvRkQke","618DifcwDa","xXTI4ciuWz","WDVWJSmGzv","VNCPdpiJSk","L7cGc9GXkX","Q6hMCHlUbF","0MR5XBGaQY",
+"ulk41dpe1v","HlUbFRzaZA","JkzUnlm0pD","tuDySLewvM","Pb1patlILt","hUTw7rhl0J","b29RJZJTXH","ECMvUCqqaD","lCMxyrhl0J","FnPFBhSSvQ",
+"JXljWtlILt","8TxD7MmKGJ","lXFOB5VZjS","RzaZAAkKTk","PYBf4J2mQi","9y4lwa00b5","mX2GEgIYvE","djsrvRxrsm","RmDcrEdBKc","Chuy3L7cGc",
+"6q6L9S77LH","SWfouK20wK","HlUbFtuDyS","CIShGuJScX","fqypysoy9t","dQ586SWfou","yluBxSbRYy","Q6Lixhi5X7","5NammFhtgl","uTacxWPmlx",
+"W3VFHIjTwP","UlU3MFNYIM","2hEEUkZANm","AOgEeyluBx","IKxdLuPX7G","t59lROz8yZ","JRJQBcQOnv","FVMxogf8rI","bgJAz5nmWv","zbIYYYjB9t",
+"GXdoH24ARF","7X3uyOxWIH","Q6hMCbZLvS","CK5W7s7Mxk","0YAGHFVMxo","KASQ8d7vjM","1LB1LuLtKs","MaJQs5nmWv","Z4I1v0BmCy","FGzgpdmoS7",
+"zbIYYm4bxU","HP4337hyVv","BCxeCWaWsv","EdBKcRBhp0","M3zXLrKDLJ","EdBKcd7vjM","M6qcGB3qem","Z4I1v55rfB","CxVEfDG4sT","suY4x1LB1L",
+"l83Ud48cHL","azIWpjSjS3","guMb8i3pyd","2hEEUCxVEf","dhSuHhe9IA","HlUbFO3iyQ","qQxHP8TxD7","lXFOBzFgtB","G1RhSFFDui","tAOsrh1zcH",
+"2hEEUs4786","WMiS3rhl0J","VLTy68TxD7","vOqCEVjCZq","GWqqXFGzgp","soy9tAXpwE","qaofNtl72W","lj07Qd85a9","x3LDes4786","ZUnqtNcICA",
+"0YAGHjiVBP","tuDySUl4a1","5Mg9rAIYUu","DQimp8xEKz","i3pydh1zcH","fFDrJAXpwE","h1zcHdjsrv","5Drn0uoStw","jtn0XZUnqt","iB08l0YAGH",
+"S2DfuPOUYS","tjQxsiwzGk","guMb8uQIcz","cmXIXazIWp","sqVrfi3pyd","NOHszx3LDe","hUTw7W3VFH","QClRLHP433","t98iWIn3NS","CNHmvJIqXi",
+"VLTy6uupzk","MojnPUl4a1","HzZT8fFDrJ","yluBxgdQsS","EdBKcuvf7A","QChxsyToGW","NOHsz0Wr5y","yluBxQYxC0","I7p2aZJTXH","0YAGHFnPFB",
+"zHF1qSs0Zu","pFrrl0ao3l","YjB9tCqqaD","D6rBye6e4z","CIShGpvgjS","cmXIXVBjhz","580YDrhl0J","d85a9FVMxo","ReKEWk85Ae","RxrsmfcwDa",
+"RmDcrWMiS3","cmXIX2Yz7E","fqypyuAWyp","MojnPfcJOy","FwEJzMGlTF","aez9yatef2","SjskQL7cGc","QYxC0bZLvS","taOXKazIWp","5Mg9rTa8f6",
+"e6e4zYOfrY","kZANmFGzgp","ydG8URsQUq","lH1ktiB08l","lCMxyuAWyp","soy9t3otm6","7Ow5CblLA9","soy9t2hEEU","1v5hHQChxs","gf8rIkZANm",
+"gf8rI7fsYM","F6PT2JIqXi","2Nslmhe9IA","ix74rKsjRK","jeskSk85Ae","Q6hMCtvdkD","FxX9qtjQxs","QChxsQssNC","TXQ0ZTwano","pv0i7NOHsz",
+"tvdkDZzJHW","azIWpxXTI4","CxVEfBCxeC","yEfy9RpBQm","b29RJjzUqR","brhlQpWiOs","pAhR15nmWv","8cVD3EOE1o","G1RhSWaWsv","uupzkMmKGJ",
+"VLTy6BbwgA","24ARFPOUYS","IKxdLtlILt","QWxoT7lUXZ","ix74rVBjhz","FFDuie6e4z","ReKEWD6rBy","2hEEUPb1pa","StlDJNAFuw","WMiS3zFgtB",
+"ru4UGmX2GE","CNHmvlpF6W","FwEJzuupzk","cmXIXNcICA","RxrsmFxX9q","WMiS3vkCHH","JIqXilkMUA","xXTI4okgRi","nFqikgIYvE","0Wr5yfFDrJ",
+"8xEKzChuy3","BbwgAsoy9t","s7MxkK20wK","9XyT9ZhwG1","AkKTkQWxoT","9GXkX5Namm","RACuj6q6L9","NAFuwMaJQs","ReKEWMmKGJ","2TRI7O3iyQ",
+"5iGN5RzaZA","No0QbdmoS7","BbwgA0h1b1","yofH3yEfy9","07n1czqH0W","64s8NRzaZA","iwzGkguMb8","IBe8kKZamH","gdQsSQnJ1S","3otm6ZhwG1",
+"7fKYUVerEA","QbxXcaFFss","QWxoTEoToP","d7vjMC2Irc","Yf2EcksJby","YOfrYJkzUn","uupzk0PktI","MojnPBGaQY","kB5nPUmaEv","1v5hHbgJAz",
+"5nmWvnlaBy","lweGy0Wr5y","ReKEWS2Dfu","zqH0WhE1Ql","5drc6MK07Y","ZJTXHn1pmO","v1Hlnuupzk","mz8gxQYxC0","AgJHQ9GXkX","fLNg8aez9y",
+"kB5nPqUJMd","dmoS7Fhtgl","vkCHHAIYUu","Waim6RkQke","2DREsM6qcG","G1RhSAgJHQ","dpe1vuTacx","FVMxosoy9t","ogLgc8cVD3","Twano2Nslm",
+"fmIK1I7p2a","5Mg9rkB5nP","In3NS7Ow5C","CdyBVyvOMI","soy9tHP433","U3yw5l83Ud","v8yFN64s8N","0Wr5yIjTwP","48cHLuPX7G","OHaBzZuDtD",
+"NOHszmz8gx","brhlQ8FmFH","W3VFHdpe1v","KsjRK4dEz6","yluBxyluBx","ZJTXHokgRi","DcpWB2DREs","mz8gxgf8rI","Yf2EcJkzUn","mX2GEt98iW",
+"b29RJJkzUn","t98iW0YAGH","2TRI7LewvM","8U2nUv8yFN","48cHLcShY2","JXljWLbRTH","d85a98cVD3","K4GS89GXkX","OxWIHgdQsS","dhSuHECMvU",
+"8U2nUMmsIo","cL0aEuupzk","Dz1R3vkCHH","7X3uyW7cTs","8FmFHXyPZN","jS1aji3pyd","64s8NCK5W7","9y4lwzqH0W","zmLYD7fsYM","AOgEeJkzUn",
+"iKqhrJKWYR","EoToPs7Mxk","QYxC0kZANm","JRJQBGSQwj","GSQwjkZANm","qUJMduvf7A","GrDg72Yz7E","yluBxblLA9","pFrrlUl4a1","FwEJzd85a9",
+"WMiS3kZANm","SbRYyJRJQB","taOXKqQxHP","7hyVv8cVD3","9iGoTwiHrZ","GXdoHlXFOB","jSjS3jfREu","piJSkyluBx","kZANmO3iyQ","GrDg7CK5W7",
+"cmXIXoGu6x","DLhzMHlUbF","CIShG48cHL","W3VFHy94nw","zmLYDaL6AJ","ZUnqtaDGtS","W3VFHQbxXc","YjB9tXyPZN","o8UydReKEW","gjUTuuoStw",
+"K20wK6AFT0","2ZHdkJKWYR","5nmWvfqypy","d7vjM5VZjS","Oz8yZpWiOs","fcJOymz8gx","aFFsspFrrl","MmKGJjfREu","lweGytvdkD","WaWsvdQ586",
+"AIYUu9XyT9","dQ586tl72W","qUJMdjSjS3","QYxC0fFDrJ","taOXKQssNC","dmoS7BpYhV","6AFT0v8yFN","oGu6xChuy3","YOfrYDQimp","ciuWzlXFOB",
+"BGaQYt98iW","uupzkStlDJ","IRh48y94nw","ulk41ksJby","B3qemSmGzv","07n1cru4UG","n8pJ9HfyNQ","J2mQi8RCUA","hYBCKWmadA","9rlg9dmoS7",
+"Yw2oUMmsIo","OUqFMzz4ZU","9GXkXbgJAz","atef2d7vjM","J2mQiD6rBy","uupzkBpYhV","suY4xlpF6W","ZuDtDUlU3M","uN6r3CxVEf","RBhp0kB5nP",
+"yEfy9HP433","rz7Utzz4ZU","VBjhzdmoS7","VNCPdCdyBV","aL6AJC2Irc","XyPZNs7Mxk","GSQwjFNYIM","VNCPdaDGtS","SjskQ7fsYM","MmsIomz8gx",
+"pvgjSv2eC3","2hEEUzbIYY","dpe1vbgJAz","uvf7Aaez9y","n1pmO9XyT9","AIYUu7Ow5C","t59lRFFDui","OHaBzgdQsS","fcwDapT8wu","FwEJztl72W",
+"s93MlAmdQd","a00b5VNCPd","7X3uyQworu","FjHXRlweGy","XyPZNOz8yZ","uJScXni2v1","4dEz6ThjNn","MmsIo0h1b1","t98iWnnP8o","d85a9Uvlv4",
+"Mm8siyluBx","6q6L9MK07Y","45cIH0PktI","ThjNn64s8N","v8yFN7ku1p","BpYhV9rlg9","qaofNm4bxU","ZzJHWGv3Fq","QYxC0B3qem","zqH0W7fKYU",
+"wiHrZzbIYY","ZUnqtK4GS8","Yh1hFt59lR","VNCPd16lHc","2TRI7jeskS","Nxx9V0YAGH","TwanoMojnP","ThjNnhUTw7","GWqqXC2Irc","uAWyp2Yz7E",
+"RzaZATa8f6","0PktIsoy9t","he9IAP6bcg","hUTw7JJs5m","AOgEeUvlv4","LDk6fiqv4k","zmLYDDQimp","fFDrJLbRTH","MGlTFThjNn","ZuDtDuupzk",
+"yofH36q6L9","jiVBPFcWrW","L7cGcuupzk","QWxoTs93Ml","pvgjSJKWYR","JRJQB8U2nU","hE1QlCxVEf","t98iWLDk6f","Dz1R35ZaEz","Cp3mZru4UG",
+"hUTw7lpF6W","uQIczPb1pa","pvgjSsx5Gl","e6e4zjtn0X","kB5nPYw2oU","X6Pin9XyT9","1j5L8Pb1pa","iwzGki3pyd","OUYuFjfREu","d85a9Yh1hF",
+"yEfy94W0Tl","faHirn8pJ9","9eoRcIBe8k","hYBCKFcWrW","ZUnqt9GXkX","tl72WoQ87r","8TxD7kB5nP","D6rByLDk6f","VjCZqMezSW","Uvlv4S77LH",
+"MaJQsQbxXc","MezSWlkMUA","JIqXiZ4I1v","lViBv0BmCy","8FmFH4QMc9","Ul4a1lViBv","KASQ88hJdt","X6Pin1v5hH","RzaZAQYxC0","qUJMdFGzgp",
+"2TRI7mX2GE","FNYIMzQt6Q","mX2GEG1RhS","wDajXCIShG","VIlwPogLgc","uTacx29QAz","0YAGHTXQ0Z","0KyfsHRxd8","VerEAEdBKc","ydG8UFGzgp",
+"BCxeCnlaBy","uN6r3hSSvQ","pvgjSdpe1v","TXQ0ZJXljW","L7cGcuJScX","pmeCd8hJdt","XyPZNqaofN","7Ow5Co8Uyd","1LB1LhE1Ql","cShY2ZuDtD",
+"fqypyUl4a1","aez9yPOUYS","prNT6zz4ZU","7hyVvPb1pa","X6PinkZANm","POUYSZv7z0","QssNCydG8U","ciuWzbgJAz","DLhzMpiJSk","gf8rIWaim6",
+"l83UdUlU3M","9GXkXYh1hF","LbRTHtlILt","QbxXcoQ87r","RkQke9GXkX","KsjRKMezSW","5IhmGTwano","zz4ZUqQxHP","blLA9vLsmS","0PktIWPmlx",
+"zmLYDnnP8o","RzaZAAIYUu","IKxdLdhSuH","QssNCAgJHQ","fqypyRsQUq","s7MxkAgJHQ","CK5W7yEfy9","MmKGJbgJAz","aFFssNo0Qb","zHF1qBbwgA",
+"aFFssYw2oU","Mm8si5IhmG","o8UydguMb8","hYBCKZ4I1v","zY1GY4W0Tl","dmoS7S2Dfu","PYBf42DREs","euZA5580YD","OxWIHGWqqX","ciuWzpmeCd",
+"aL6AJW3VFH","LbRTH6AFT0","8hJdth1zcH","dpe1vlm0pD","yofH3hSSvQ","xXTI4Cp3mZ","uLtKsPYBf4","zQt6QCIShG","tl72WuTacx","MaJQsprNT6",
+"5drc6In3NS","9y4lw5Drn0","3otm6MmKGJ","SjskQjeskS","oQ87rlkMUA","guMb8RBhp0","QClRLUmaEv","tl72WECMvU","hUTw7x3LDe","s4786iB08l",
+"SWfou9XyT9","wDajXKZamH","CqqaDUlU3M","pFrrl8xEKz","gtCA5Rxrsm","kZANmeuZA5","qUJMdBCxeC","ni2v1cShY2","prNT65nmWv","DQimp9iGoT",
+"UlU3MxXTI4","WaWsvNOHsz","UmaEv9y4lw","5nmWvbgJAz","QYxC07fKYU","5drc6ZhwG1","2Yz7EG1RhS","3otm6TXQ0Z","QChxscShY2","W7cTsd7vjM",
+"euZA5TCgPp","faHirNOHsz","SWfouqaofN","RzaZA6AFT0","lm0pD5VZjS","oGu6xHP433","cL0aEKr8ys","RACujni2v1","zQt6QP6bcg","ciuWzQbxXc",
+"CxVEfJJs5m","lViBvPb1pa","rhl0JWreyP","8FmFH6AFT0","QssNCi3pyd","RkQkebrhlQ","StlDJnnP8o","Oz8yZuN6r3","5nmWvYh1hF","s47864dEz6",
+"F6PT2Yw2oU","MGlTFfFDrJ","G1RhSkB5nP","AmdQduQIcz","dmoS7he9IA","uQIczbrhlQ","QClRLuPX7G","GXdoH6AFT0","VBjhzo8Uyd","JKWYRQClRL",
+"Mkgy8ciuWz","d7vjMazIWp","L7cGcQworu","ZhwG10YAGH","FcWrWJIqXi","TCgPpzz4ZU","9XyT9v2eC3","okgRi2Nslm","iqv4kSjskQ","Nxx9VHlUbF",
+"jfREuC2Irc","WmadAv8yFN","hi5X7FcWrW","aL6AJ5IhmG","fmIK1JKWYR","NOHszQworu","RACuj0ao3l","nlaByjiVBP","suY4xU3yw5","ksJbycQOnv",
+"cmXIXQYxC0","5iGN5OxWIH","WmadApWiOs","WaWsvThjNn","LbRTHaL6AJ","2hEEUhe9IA","3otm6yEfy9","5IhmGlsQGo","5NammOz8yZ","vkCHHaFFss",
+"ni2v1Q6hMC","CNHmvXflUq","Yh1hFfLNg8","Pb1paVjCZq","zHF1qTXQ0Z","X6PinQ6Lix","S2DfuaL6AJ","Kr8ysVIlwP","wDajX7X3uy","yvOMI9iGoT",
+"RkQkeJKWYR","xXTI4jtn0X","Yw2oUpT8wu","5nmWvl83Ud","HfyNQYf2Ec","FFDuijfREu","Y1mC0P6bcg","zqH0WQ6Lix","MmsIobZLvS","i3pyduvf7A",
+"zFgtBjS1aj","yvOMIvOqCE","0YAGHogLgc","OxWIH5Namm","t98iWo8Uyd","IBe8kCxVEf","ogLgcO3iyQ","ZhwG1jiVBP","ydG8Ub29RJ","b29RJzz4ZU",
+"MaJQsAOgEe","Rxrsmk85Ae","MmsIoYjB9t","9eoRcGv3Fq","RpBQmSjskQ","DG4sTb29RJ","BFkb8pFrrl","0MR5XDLhzM","O3iyQ0Kyfs","W3VFHReKEW",
+"gjUTuGv3Fq","BbwgAnFqik","Mm8siL7cGc","hSSvQMkgy8","7fKYUfcwDa","Q6LixMaJQs","ZzJHWcL0aE","SWfouuoStw","2hEEU2TRI7","9rlg9RzaZA",
+"dmoS7oGu6x","OxWIHgtCA5","lH1ktJRJQB","pAhR1ksJby","8U2nUMkgy8","ix74r07n1c","fqypyrhl0J","l83UdM6qcG","OUqFMXflUq","S2Dfu0PktI",
+"VjCZqJJs5m","Twano7ku1p","CIShGBGaQY","YjB9tSbRYy","VIlwPtAOsr","RsQUqtAOsr","FFDuiM3zXL","v8yFNSmGzv","3weIFVerEA","7fKYUBCxeC",
+"0MR5XO3iyQ","B3qemQChxs","Kr8ysYh1hF","dpe1vWaim6","sqVrfxciqp","ThjNnBGaQY","cShY2uQIcz","v2eC3uJScX","fcwDaFnPFB","AOgEex3LDe",
+"Waim61LB1L","y94nwRpBQm","y94nwAXpwE","WaWsvlsQGo","Gv3FqJkzUn","8U2nUlViBv","fFDrJWDVWJ","iKqhrRxrsm","hE1QlNhXdu","IKxdLiwzGk",
+"ZhwG1VLTy6","brhlQIBe8k","RzaZAThjNn","tjQxs5drc6","ni2v1ksJby","gtCA5MezSW","kB5nPBpYhV","yvOMIn8pJ9","8FmFHjeskS","7fKYUy94nw",
+"IBe8kuAWyp","yluBxiwzGk","taOXK14FLR","aFFssChuy3","5VZjSVjCZq","euZA5In3NS","QssNCKASQ8","6AFT0LewvM","jSjS3StlDJ","NhXduSbRYy",
+"lCMxy3otm6","cShY23otm6","ECMvUU3yw5","Ta8f6Z4I1v","9rlg9ksJby","16lHcru4UG","uoStwzmLYD","uTacx5drc6","nFqiko8Uyd","6AFT0nFqik",
+"LewvMTwano","guMb8oVQp6","CqqaD2hEEU","14FLRnnP8o","ZzJHWMGlTF","oQ87rMmsIo","gtCA5Yh1hF","FVMxoKr8ys","cQOnv5IhmG","xReecRpBQm",
+"jS1aj2hEEU","FwEJzogLgc","WaWsv5iGN5","FcWrW5VZjS","VBjhzt98iW","WreyPzz4ZU","S77LH7X3uy","mz8gxWaim6","Mkgy8yofH3","lH1ktzqH0W",
+"VNCPdaez9y","vLsmSMGlTF","14FLRzHF1q","SjskQ8hJdt","CdyBVfqypy","wiHrZgtCA5","xXTI4oGu6x","3weIFTCgPp","W7cTsoQ87r","jiVBPsuY4x",
+"AOgEeHlUbF","IBe8khi5X7","TXQ0ZzmLYD","7X3uyRpBQm","sqVrfiqv4k","zHF1qWreyP","kZANm0Wr5y","gf8rIwDajX","RmDcrK4GS8","gdQsSWmadA",
+"HzZT8zQt6Q","YjB9t8U2nU","OUqFMuJScX","X6Pin9GXkX","0Wr5yUlU3M","8hJdtSbRYy","QWxoTFVMxo","yluBx3otm6","tlILthE1Ql","RpBQm7fsYM",
+"VerEA0Kyfs","bgJAzAXpwE","jeskSVNCPd","wiHrZ7X3uy","In3NSQChxs","2DREsFcWrW","t59lRMezSW","VNCPdi3pyd","1v5hHQYxC0","yluBxRzaZA",
+"Yf2Ec0Kyfs","vkCHHNxx9V","yvOMI16lHc","Q6hMCFxX9q","bZLvSRmDcr","2DREs2TRI7","U3yw5he9IA","atef2lm0pD","MmKGJ0Wr5y","3weIFpv0i7",
+"CIShGQYxC0","s4786HzZT8","6AFT02TRI7","QnJ1SuPX7G","EdBKc5nmWv","pT8wublLA9","v2eC3BCxeC","OxWIHulk41","EdBKcAOgEe","gjUTulkMUA",
+"IRh48vkCHH","ZzJHWi7WMQ","B3qemRpBQm","7lUXZBpYhV","s7Mxk0h1b1","5VZjShi5X7","l83UdWaim6","v2eC3HRxd8","DcpWBgdQsS","Q6LixgIYvE",
+"7ku1psqVrf","6AFT0FFDui","jS1ajulk41","CdyBVpmeCd","uAWypo8Uyd","fLNg8zHF1q","4QMc9HRxd8","CK5W7VIlwP","7fsYMgIYvE","7hyVv0MR5X",
+"K20wKRACuj","fqypyNcICA","BCxeCFcWrW","KASQ8dpe1v","EdBKcx3LDe","618DicShY2","7lUXZQbxXc","yvOMIuoStw","2TRI7NhXdu","gIYvEQClRL",
+"618Di618Di","YOfrYDLhzM","5nmWvi3pyd","s93MlNhXdu","2DREsGXdoH","5VZjShSSvQ","5ZaEzkZANm","qQxHPogLgc","SWfouiqv4k","nFqik9iGoT",
+"QbxXcY1mC0","ni2v1Cp3mZ","BCxeC5Mg9r","MaJQsP6bcg","pT8wuL7cGc","4dEz6iqv4k","9eoRcuLtKs","RmDcrU3yw5","CqqaDiKqhr","aFFssFFDui",
+"pv0i7ECMvU","BCxeCRzaZA","DG4sTatef2","64s8N24ARF","FnPFBvkCHH","gdQsSlsQGo","DLhzMW7cTs","zFgtBnFqik","4W0TlFnPFB","OHaBz5IhmG",
+"tuDySh1zcH","VjCZq7fsYM","t98iWlsQGo","brhlQ14FLR","JJs5mFxX9q","FjHXRhSSvQ","pvgjSYw2oU","45cIH580YD","hi5X7dhSuH","1v5hHAgJHQ",
+"NcICAM3zXL","uPX7GQ6hMC","fcJOykZANm","6AFT0Fhtgl","ZJTXHDLhzM","8hJdtVprf2","W7cTsatef2","AOgEekZANm","jS1aj8TxD7","MezSWHzZT8",
+"G1RhS8cVD3","PYBf4tAOsr","suY4xUmaEv","kB5nPrKDLJ","CNHmvZzJHW","ru4UGaez9y","qQxHPsx5Gl","lXFOBGrDg7","soy9tzQt6Q","4W0Tltl72W",
+"FxX9qY1mC0","WaWsv3weIF","8RCUAzHF1q","BpYhVQbxXc","QWxoT7Ow5C","aFFssUvlv4","ciuWz8TxD7","CNHmvfqypy","pv0i75ZaEz","ECMvUlm0pD",
+"zHF1qCfgr3","64s8NOxWIH","Waim6C2Irc","piJSkdmoS7","AmdQdTCgPp","TwanoyvOMI","nlaByCqqaD","WDVWJC2Irc","2TRI7iB08l","FhtglpAhR1",
+"RBhp05Namm","ulk41IRh48","CdyBVDcpWB","uTacxoQ87r","Oz8yZrKDLJ","0MR5X8cVD3","0PktIM6qcG","l83UdQChxs","hE1Ql5VZjS","cmXIX6q6L9",
+"he9IAhSSvQ","ni2v1DG4sT","AgJHQQworu","1j5L8RBhp0","K4GS89y4lw","GWqqX2DREs","ni2v1SWfou","aDGtSZv7z0","3otm6oGu6x","uJScXSbRYy",
+"IjTwP0Wr5y","MmsIokZANm","Cfgr3aez9y","DcpWBtvdkD","bZLvSK20wK","brhlQFVMxo","HfyNQlCMxy","oVQp6jeskS","MaJQspiJSk","TCgPp0MR5X",
+"BbwgAVprf2","mX2GEWDVWJ","lXFOBWreyP","JXljWRsQUq","tvdkDwDajX","EdBKc9y4lw","i3pydYw2oU","v1Hln8RCUA","xReecjfREu","5ZaEzkB5nP",
+"Gv3FqlViBv","lsQGoQ6hMC","0PktIo8Uyd","XflUqJ2mQi","ulk41dQ586","XflUqgdQsS","o8UydaDGtS","L7cGcW7cTs","618DiF6PT2","faHir0Wr5y",
+"7fsYMrKDLJ","W3VFH5ZaEz","I7p2abgJAz","MojnPO3iyQ","3otm6ksJby","JIqXini2v1","45cIHAgJHQ","VNCPdn8pJ9","5drc6SjskQ","9eoRcqQxHP",
+"SjskQsoy9t","SmGzv9GXkX","pAhR1uupzk","TCgPpFwEJz","xXTI4ogLgc","soy9tlpF6W","HRxd8iwzGk","W3VFHjtn0X","Dz1R3FFDui","Ss0ZuVLTy6",
+"WPmlxvkCHH","okgRiZzJHW","BCxeCIRh48","jtn0XQYxC0","7lUXZlkMUA","580YDCfgr3","gjUTuzqH0W","JXljWx3LDe","8TxD7mz8gx","ZhwG10Wr5y",
+"fLNg8RmDcr","x3LDeYf2Ec","OxWIHRpBQm","ZzJHW9eoRc","ZJTXHYf2Ec","8U2nUjS1aj","FVMxoiKqhr","Z4I1vFNYIM","EOE1obgJAz","mz8gxVBjhz",
+"ZJTXHi3pyd","OUqFMi7WMQ","tAOsrIRh48","dpe1vFGzgp","64s8NQWxoT","VNCPd3weIF","zHF1qFwEJz","Dz1R3fFDrJ","euZA5MK07Y","rz7UtaFFss",
+"jtn0Xdpe1v","UlU3MMK07Y","3weIFTXQ0Z","JRJQB5ZaEz","OUqFMuLtKs","xXTI4FLsph","AmdQdOUYuF","bZLvSogLgc","yofH3JRJQB","ReKEWlXFOB",
+"AgJHQx3LDe","m4bxURpBQm","QWxoT618Di","QChxsyofH3","jeskSfaHir","uTacxRsQUq","n1pmOsuY4x","OHaBzuvf7A","SbRYyP6bcg","qaofNZJTXH",
+"Gv3FqJKWYR","7lUXZUlU3M","JkzUnWaim6","580YDOUYuF","ZUnqtDz1R3","v1HlnRpBQm","ReKEWIKxdL","S2DfuMezSW","UlU3MpvgjS","cQOnvdQ586",
+"14FLRNxx9V","SWfoufFDrJ","618Di0ao3l","RBhp0blLA9","oQ87rWaim6","wDajXBbwgA","uQIcztjQxs","OxWIHvkCHH","8RCUAuvf7A","FLsphXyPZN",
+"07n1cKr8ys","QWxoT64s8N","CxVEflweGy","djsrvlCMxy","0BmCy4W0Tl","7hyVvhE1Ql","yToGWru4UG","aL6AJ3otm6","NhXdu5nmWv","EdBKcmX2GE",
+"fcJOyuupzk","Q6hMCxciqp","oQ87rTwano","ThjNnv2eC3","UmaEvAIYUu","Pb1paIRh48","FFDuiTwano","W3VFH14FLR","JXljWn1pmO","xciqp2DREs",
+"fcwDa0PktI","v2eC3pvgjS","tuDySS2Dfu","LDk6f6AFT0","dQ586Fhtgl","sqVrfVprf2","aFFssP6bcg","JRJQB5drc6","DG4sTNo0Qb","rKDLJiKqhr",
+"Pb1paaFFss","Q6LixCqqaD","pvgjSVerEA","gIYvEWDVWJ","EOE1oCfgr3","WDVWJ8xEKz","Nxx9VMaJQs","Q6LixJKWYR","yofH3bgJAz","okgRiJ2mQi",
+"0MR5XcL0aE","y94nwcQOnv","uN6r3VjCZq","wDajXMK07Y","ReKEWo8Uyd","J2mQiiqv4k","sx5Gllj07Q","soy9tfmIK1","Oz8yZMGlTF","QWxoTKZamH",
+"QYxC0Ta8f6","sqVrfCIShG","POUYSt59lR","uQIczVBjhz","CqqaDNcICA","Waim6DQimp","ZhwG1soy9t","WDVWJt59lR","gIYvEdQ586","jzUqR9XyT9",
+"VLTy6blLA9","FVMxoyluBx","pv0i7Y1mC0","sx5GlCIShG","ru4UGk85Ae","BbwgAGv3Fq","aDGtSru4UG","wDajXNo0Qb","8cVD35Mg9r","24ARFnFqik",
+"he9IAs4786","lweGyWMiS3","wiHrZqQxHP","7ku1phe9IA","Z4I1vzmLYD","ThjNnlViBv","ix74rTwano","9GXkXIBe8k","OUYuF3weIF","KsjRKazIWp",
+"QYxC0uZPqg","EoToPDG4sT","GSQwjLbRTH","9y4lwOUYuF","5Mg9raDGtS","iKqhrTa8f6","guMb8S2Dfu","jzUqRI7p2a","Nxx9VY1mC0","KsjRKqQxHP",
+"9iGoTOUYuF","d85a9blLA9","mz8gxK4GS8","b29RJn8pJ9","FGzgpoGu6x","9iGoTuAWyp","uLtKsFFDui","iwzGk64s8N","UmaEvWMiS3","azIWpS77LH",
+"J2mQi5Mg9r","lm0pDYjB9t","TCgPp2hEEU","OHaBzkB5nP","lm0pDX6Pin","aL6AJguMb8","FPfSEJJs5m","2ZHdkpv0i7","EoToPFNYIM","uZPqgHP433",
+"FLsph8U2nU","mX2GEy94nw","piJSkcL0aE","C2IrcuJScX","1v5hHVprf2","J2mQit98iW","24ARFhE1Ql","WMiS3fLNg8","gf8rIpvgjS","tAOsr64s8N",
+"QChxswiHrZ","iB08lRzaZA","DcpWBpv0i7","W3VFHW7cTs","BGaQYNAFuw","9GXkXix74r","WDVWJhE1Ql","GXdoHHzZT8","64s8N1LB1L","i3pydQChxs",
+"ni2v1lm0pD","BFkb8AgJHQ","vOqCECNHmv","7Ow5CjiVBP","e6e4zMaJQs","7Ow5CFnPFB","gf8rIWreyP","uLtKsFNYIM","QbxXcCp3mZ","aFFssZuDtD",
+"lCMxyVerEA","7X3uyjeskS","0PktIksJby","euZA5pmeCd","VjCZqQssNC","tAOsrHzZT8","ZUnqtIKxdL","TXQ0Z64s8N","d85a9dQ586","DcpWBQssNC",
+"tlILt2hEEU","KsjRKjfREu","SbRYyStlDJ","zHF1qFxX9q","qUJMdXyPZN","pFrrliwzGk","o8Uyd55rfB","3weIF5VZjS","JXljW5nmWv","i7WMQQYxC0",
+"Waim6Z4I1v","RACujGXdoH","k85AezQt6Q","SjskQvOqCE","D6rByNAFuw","HlUbFt59lR","RACuj8cVD3","9iGoT0ao3l","x3LDepAhR1","pmeCd0Wr5y",
+"2hEEU7Ow5C","gtCA5MaJQs","5ZaEzgIYvE","AkKTknnP8o","CxVEfYOfrY","pvgjSqQxHP","v1HlnRxrsm","UlU3Miqv4k","5ZaEzuPX7G","iB08lFGzgp",
+"he9IAvkCHH","oQ87rs93Ml","lkMUAs93Ml","k85AeNo0Qb","Mkgy8he9IA","t98iWBbwgA","pmeCdAOgEe","ix74rI7p2a","Oz8yZpv0i7","iqv4kgdQsS",
+"0BmCy7fKYU","OUqFMTa8f6","RxrsmHfyNQ","LbRTH64s8N","JkzUnNxx9V","VBjhzfaHir","GrDg7KASQ8","pAhR1rKDLJ","QbxXcRsQUq","KsjRKO3iyQ",
+"HzZT8UlU3M","Y1mC0yluBx","Z4I1vDLhzM","JRJQB0MR5X","oGu6xRkQke","uLtKsl83Ud","fqypyPb1pa","WDVWJMK07Y","Ss0ZuRzaZA","5IhmGuoStw",
+"4W0TlpvgjS","lpF6WHzZT8","yofH3iwzGk","s7MxkSmGzv","zz4ZUVjCZq","EoToPwDajX","POUYStuDyS","5VZjSksJby","EoToP8cVD3","Gv3FqMaJQs",
+"RmDcrNo0Qb","aez9yh1zcH","azIWphe9IA","CqqaDFFDui","FNYIM9rlg9","yEfy9fLNg8","tjQxs7Ow5C","soy9tqQxHP","EdBKcbrhlQ","FNYIMOUYuF",
+"55rfBdpe1v","RpBQm0Wr5y","UlU3MFhtgl","FhtglDQimp","GrDg7RkQke","DQimp4QMc9","0MR5XmX2GE","C2Irc7ku1p","BFkb8ciuWz","D6rByi7WMQ",
+"UlU3MVLTy6","n1pmOgtCA5","atef2zFgtB","3weIFlsQGo","gdQsSpFrrl","WaWsvfqypy","MGlTFgIYvE","WPmlxwDajX","tvdkDcQOnv","8FmFHPYBf4",
+"HP433zHF1q","RmDcrQ6Lix","K4GS8EOE1o","QChxsb29RJ","TCgPpFjHXR","he9IABCxeC","zqH0Watef2","9y4lw0ao3l","S2DfuK20wK","MezSWAkKTk",
+"pv0i7AmdQd","UmaEvYh1hF","Y1mC0dmoS7","gdQsS1v5hH","qaofNpT8wu","CxVEfSs0Zu","EoToPJ2mQi","e6e4zIn3NS","uN6r3mX2GE","Nxx9Vgf8rI",
+"9iGoT5iGN5","4W0TlJKWYR","Ta8f6zqH0W","aDGtSXflUq","uQIczjiVBP","StlDJDcpWB","QChxsCqqaD","Cfgr37Ow5C","mz8gx8TxD7","5Mg9rNhXdu",
+"0PktI2Yz7E","euZA5cShY2","KASQ8oGu6x","AkKTkKASQ8","rz7UtvOqCE","QworuZv7z0","WaWsvQ6Lix","GWqqXCfgr3","07n1cFGzgp","n8pJ9fqypy",
+"tvdkDzz4ZU","e6e4zhe9IA","aDGtS07n1c","zFgtBh1zcH","yToGWW3VFH","C2Irca00b5","AOgEeJ2mQi","ZJTXHWPmlx","WMiS3fqypy","hSSvQwiHrZ",
+"AgJHQrhl0J","ECMvUW7cTs","l83UdtjQxs","D6rBygdQsS","cQOnvQworu","Zv7z0ni2v1","Gv3FqwDajX","ydG8U5ZaEz","618DiydG8U","MaJQszmLYD",
+"7X3uyAgJHQ","Z4I1vokgRi","KsjRKAIYUu","l83UdkB5nP","9eoRcReKEW","fcwDa7X3uy","EdBKcuAWyp","FwEJzCxVEf","dQ586n1pmO","GXdoHs7Mxk",
+"JKWYRZuDtD","aez9ybZLvS","BpYhVVIlwP","faHir1v5hH","rz7UtOUqFM","aez9yReKEW","0YAGHm4bxU","QWxoTrKDLJ","FGzgpVLTy6","MojnPfmIK1",
+"FGzgpAmdQd","lsQGoPOUYS","TCgPphYBCK","I7p2aRACuj","WreyPogLgc","s4786DG4sT","lj07QOxWIH","he9IATCgPp","lweGy8hJdt","Ul4a1zFgtB",
+"ZhwG1x3LDe","ni2v1yofH3","ZUnqtxReec","IRh48gjUTu","gtCA55drc6","aDGtSFwEJz","8U2nUFGzgp","fcJOyi7WMQ","LbRTHjfREu","W7cTsMmsIo",
+"ulk41P6bcg","QbxXc6q6L9","AmdQdSbRYy","uPX7Gt98iW","07n1cuTacx","TwanoJXljW","d7vjMWreyP","djsrvxciqp","M3zXLZhwG1","3weIFgjUTu",
+"8TxD7QClRL","WDVWJQssNC","CK5W79y4lw","2Yz7Ey94nw","Vprf2RBhp0","taOXKokgRi","mz8gxHfyNQ","IBe8koGu6x","14FLRv8yFN","7lUXZQYxC0",
+"zFgtBB3qem","QYxC01j5L8","5drc6PYBf4","JRJQB2TRI7","7fsYMWaim6","Mkgy8d85a9","618DiRACuj","8cVD3mz8gx","lCMxy48cHL","fcwDamz8gx",
+"VerEAcmXIX","d85a9zHF1q","rhl0JVIlwP","S77LH8xEKz","CNHmv5Drn0","9XyT9Zv7z0","JRJQBblLA9","Dz1R3JKWYR","9y4lwPYBf4","yvOMIAgJHQ",
+"5Mg9rogLgc","lCMxyWDVWJ","JIqXiECMvU","taOXKB3qem","xciqpzqH0W","FjHXRpv0i7","mX2GEY1mC0","9iGoTbZLvS","wDajXkZANm","RpBQm3weIF",
+"5ZaEzulk41","FcWrWfaHir","JRJQBQ6Lix","faHirtvdkD","M3zXLLDk6f","JkzUn24ARF","rz7Utrhl0J","ThjNncShY2","Ta8f6ulk41","cL0aEZhwG1",
+"X6Pin5Drn0","suY4xpFrrl","dhSuHl83Ud","yluBxt59lR","7lUXZCxVEf","RxrsmPb1pa","dQ5861v5hH","IBe8kVBjhz","16lHcRpBQm","l83UdJJs5m",
+"cQOnvZ4I1v","1j5L8yToGW","ZuDtDF6PT2","PYBf4RkQke","gjUTuZuDtD","P6bcgix74r","D6rBy5Drn0","ix74rYOfrY","NcICA8RCUA","atef2VLTy6",
+"BpYhVuoStw","dpe1vyvOMI","Waim6piJSk","FxX9qJkzUn","mz8gxZUnqt","LbRTHlsQGo","ZuDtDy94nw","xXTI47fsYM","5drc6Fhtgl","x3LDelXFOB",
+"cL0aEYjB9t","HzZT8AXpwE","MojnPqaofN","1j5L8yofH3","atef2pvgjS","OHaBzjS1aj","BpYhVcQOnv","ZuDtDrz7Ut","LewvMJkzUn","uN6r3iwzGk",
+"YjB9tY1mC0","IjTwP8TxD7","FPfSEM3zXL","L7cGcAmdQd","soy9t8xEKz","ZuDtDMK07Y","UlU3McmXIX","S77LHuvf7A","piJSkoVQp6","IjTwPfFDrJ",
+"lH1ktFVMxo","ZhwG1a00b5","WMiS3D6rBy","24ARF14FLR","uupzkv1Hln","iqv4kD6rBy","L7cGc8cVD3","dmoS7piJSk","i3pydYjB9t","AgJHQ9rlg9",
+"ZhwG1lpF6W","Nxx9VKZamH","prNT6oVQp6","HzZT8AOgEe","9y4lwRpBQm","atef22hEEU","580YDRzaZA","VLTy6lCMxy","Ta8f61LB1L","9XyT9aDGtS",
+"Mkgy8nlaBy","AXpwEtAOsr","pT8wuZuDtD","cL0aE0YAGH","zmLYDFxX9q","ReKEWtjQxs","aDGtSuAWyp","TXQ0Z7fsYM","CxVEfv2eC3","24ARFaL6AJ",
+"d7vjMY1mC0","uZPqgs7Mxk","5Drn045cIH","a00b5iKqhr","uvf7At59lR","FwEJzni2v1","0MR5X9y4lw","FPfSEpvgjS","WaWsvOz8yZ","uZPqgmX2GE",
+"zFgtBCfgr3","pmeCdsqVrf","aez9yQChxs","atef2dpe1v","aL6AJ7hyVv","aDGtSUmaEv","CdyBVuN6r3","WMiS3e6e4z","2ZHdkv2eC3","O3iyQfqypy",
+"aDGtSHzZT8","rKDLJdpe1v","qaofNkB5nP","NhXduJkzUn","uQIczRzaZA","HP433jtn0X","Yh1hFtAOsr","Zv7z0Nxx9V","JKWYR618Di","NhXduRzaZA",
+"NcICA64s8N","MojnPIRh48","CxVEfDz1R3","HP433StlDJ","WaWsvuAWyp","8FmFHMmKGJ","EOE1oU3yw5","NAFuwHzZT8","AmdQdChuy3","7lUXZO3iyQ",
+"2NslmDcpWB","y94nwVLTy6","cL0aECqqaD","fqypyZv7z0","fcJOyMojnP","nFqikqUJMd","tvdkDtaOXK","lj07Q618Di","X6Piny94nw","s4786JRJQB",
+"3otm6QnJ1S","fmIK1HfyNQ","hSSvQtAOsr","0h1b1FwEJz","v1HlnNOHsz","SjskQFGzgp","RkQke5Namm","F6PT2suY4x","gdQsSfLNg8","WMiS3bZLvS",
+"AXpwEEOE1o","5Drn0gf8rI","ZzJHWLDk6f","0MR5XCK5W7","WaWsvciuWz","faHirSjskQ","CIShG5VZjS","fqypy5Namm","yvOMIYjB9t","fqypytjQxs",
+"0YAGHJXljW","zbIYY9rlg9","pWiOsYh1hF","ydG8Us93Ml","2DREsnFqik","AgJHQjfREu","Oz8yZ0h1b1","64s8NIRh48","hE1QlBGaQY","Waim6FPfSE",
+"Mm8siU3yw5","gIYvEjfREu","nnP8ouTacx","FLsphQYxC0","hSSvQRzaZA","t59lRWaWsv","ciuWzFhtgl","Nxx9VoGu6x","fFDrJVjCZq","F6PT2v1Hln",
+"jfREutuDyS","5Drn0QYxC0","n1pmOFLsph","8U2nUi3pyd","0PktIP6bcg","CK5W75VZjS","i7WMQokgRi","tl72WjfREu","8U2nUZuDtD","uLtKsQChxs",
+"29QAzt98iW","mX2GE0Kyfs","nnP8olj07Q","zHF1qyvOMI","dhSuHyluBx","G1RhSLewvM","uPX7GksJby","QYxC0yEfy9","n8pJ9EOE1o","tl72WpWiOs",
+"In3NSyvOMI","No0QbrKDLJ","2Yz7EhYBCK","EdBKc618Di","MaJQsjiVBP","VLTy65IhmG","cmXIXYOfrY","0YAGHOUqFM","ix74rv8yFN","d7vjMAkKTk",
+"ZhwG116lHc","ru4UGa00b5","tjQxsaL6AJ","zmLYD7fKYU","lkMUA6q6L9","5VZjSazIWp","M3zXLCfgr3","pmeCdaDGtS","5iGN5MGlTF","Cp3mZaFFss",
+"HRxd85iGN5","M6qcGiwzGk","uN6r3euZA5","AgJHQDLhzM","Dz1R3Mm8si","h1zcHSbRYy","uTacxpvgjS","soy9tM6qcG","618Di7X3uy","WreyPEOE1o",
+"FLsph48cHL","uoStwB3qem","QworuCdyBV","ni2v1FVMxo","OUqFM7fKYU","GWqqXChuy3","tlILte6e4z","Ta8f6FPfSE","mz8gx5Mg9r","EOE1o0Wr5y",
+"Cp3mZ0h1b1","JKWYRKASQ8","7fsYMUl4a1","JIqXi5Namm","fcJOypiJSk","l83UdfLNg8","9GXkXWaWsv","7fKYUkB5nP","No0QbMK07Y","24ARFhe9IA",
+"y94nwpv0i7","EOE1o0PktI","hUTw78U2nU","EoToPRzaZA","KsjRKOxWIH","No0Qbt59lR","v8yFNS77LH","hE1QlguMb8","tuDySv8yFN","PYBf4QClRL",
+"RpBQmOUqFM","aL6AJIjTwP","hE1QltlILt","48cHLmz8gx","7hyVvTXQ0Z","zbIYYRxrsm","xciqpVNCPd","jtn0X64s8N","MaJQscShY2","FFDuilpF6W",
+"KsjRKUvlv4","48cHLaez9y","y94nwWreyP","4QMc9ReKEW","CIShGPOUYS","C2IrcJ2mQi","zHF1qtuDyS","Zv7z0vOqCE","s7MxkAIYUu","lXFOBDLhzM",
+"iKqhrFcWrW","Oz8yZL7cGc","RsQUqThjNn","Z4I1vPb1pa","RpBQmEOE1o","3weIF7fKYU","n8pJ9WreyP","BpYhV5Mg9r","rz7UtHRxd8","W3VFHZ4I1v",
+"tlILtxReec","2NslmNxx9V","zHF1qStlDJ","ZUnqtt98iW","lpF6WW3VFH","29QAzW3VFH","brhlQLbRTH","lweGyyluBx","5Drn02Nslm","pFrrlsqVrf",
+"yEfy9n8pJ9","jS1ajdhSuH","IRh48i3pyd","M3zXLuoStw","Cfgr3AgJHQ","29QAzMaJQs","DG4sTEOE1o","lweGy3otm6","8U2nUCqqaD","jSjS3ogLgc",
+"Dz1R3ulk41","pmeCdyEfy9","VjCZquvf7A","rhl0J3otm6","gtCA5jiVBP","MezSWYw2oU","W7cTsdpe1v","qUJMdfLNg8","9rlg9nnP8o","FxX9quJScX",
+"DG4sTFGzgp","zqH0Wulk41","K4GS8WMiS3","RkQkeydG8U","LewvMdmoS7","PYBf4tlILt","GrDg7VjCZq","WPmlxZhwG1","Vprf2uPX7G","ix74r9GXkX",
+"MaJQsKZamH","JkzUnuZPqg","W3VFHkB5nP","6AFT0RmDcr","Q6Lix5VZjS","Yh1hFWreyP","7ku1pQClRL","vOqCE6q6L9","8RCUA5IhmG","tAOsrD6rBy",
+"zz4ZU1LB1L","WDVWJ3otm6","ksJbyGrDg7","2ZHdkru4UG","WaWsvfmIK1","FxX9qQ6hMC","7X3uyDG4sT","ZJTXHtvdkD","gf8rIZzJHW","yluBxK4GS8",
+"ulk41tvdkD","QworuC2Irc","QWxoTyofH3","fqypyRpBQm","WPmlxBpYhV","zY1GYguMb8","7lUXZ9rlg9","euZA5pFrrl","gf8rIOUYuF","2Yz7EtvdkD",
+"45cIH0ao3l","EdBKcWDVWJ","0KyfsOxWIH","F6PT2iB08l","FGzgpY1mC0","2hEEUKZamH","FFDuin8pJ9","Rxrsm5ZaEz","soy9t8RCUA","gtCA58U2nU",
+"pWiOsZv7z0","YOfrYIjTwP","mz8gxdmoS7","BGaQYsoy9t","tAOsrEdBKc","gdQsSlXFOB","he9IAqaofN","3otm6kZANm","Oz8yZDLhzM","FcWrWoQ87r",
+"pmeCdM6qcG","J2mQiQworu","CqqaDn8pJ9","lpF6WKr8ys","EdBKcZ4I1v","ogLgcnnP8o","FjHXRpFrrl","0ao3lNAFuw","uQIczO3iyQ","0Wr5yC2Irc",
+"dmoS7bZLvS","W3VFHtlILt","e6e4zydG8U","QnJ1SEdBKc","wiHrZvOqCE","7hyVv5nmWv","okgRioQ87r","Nxx9VYw2oU","AIYUuPb1pa","QWxoT0ao3l",
+"pvgjSFcWrW","HlUbFGWqqX","hi5X7h1zcH","ZhwG1cmXIX","WDVWJ5Namm","MK07Yd7vjM","aDGtS8FmFH","9eoRc7ku1p","hi5X79GXkX","n8pJ9J2mQi",
+"ix74rkZANm","RzaZAMmKGJ","5iGN5FLsph","Z4I1vx3LDe","fLNg87fKYU","1j5L85nmWv","RBhp0djsrv","HlUbFQ6Lix","2NslmK20wK","FwEJzqaofN",
+"0h1b1zqH0W","DG4sTyEfy9","ZhwG1prNT6","FcWrWNhXdu","GXdoHfFDrJ","ksJbyQYxC0","zHF1qYw2oU","5iGN5e6e4z","brhlQRzaZA","FcWrWqaofN",
+"5Namm24ARF","oGu6xi3pyd","5Mg9rjfREu","djsrvVNCPd","fmIK1GrDg7","SjskQfcwDa","BGaQY55rfB","y94nwwiHrZ","0h1b1tlILt","tjQxsCxVEf",
+"RsQUqWaWsv","azIWptvdkD","h1zcHkZANm","4W0TlAXpwE","FcWrWyToGW","uPX7GKZamH","xXTI4l83Ud","JJs5mokgRi","BCxeCFjHXR","d85a9VerEA",
+"gtCA5Ss0Zu","LDk6fh1zcH","wiHrZFcWrW","QWxoTSmGzv","azIWpJkzUn","W3VFH7ku1p","FFDuigdQsS","lViBvjiVBP","NAFuwOz8yZ","lj07QDLhzM",
+"cL0aErhl0J","zqH0WfaHir","LbRTHLewvM","jzUqRn1pmO","KZamHyEfy9","hSSvQQ6Lix","CdyBVZuDtD","ZhwG1zz4ZU","lkMUA4W0Tl","SWfoutaOXK",
+"1v5hHaL6AJ","AgJHQYw2oU","okgRiOUqFM","SjskQWMiS3","Cp3mZQbxXc","9rlg9uAWyp","LbRTHFcWrW","hE1QlJ2mQi","5VZjSVBjhz","l83Udx3LDe",
+"AIYUuzQt6Q","Z4I1vVBjhz","POUYSzmLYD","JRJQBs93Ml","JRJQBEOE1o","W7cTsEOE1o","SmGzv5drc6","VNCPdU3yw5","hi5X7G1RhS","SWfouWaim6",
+"W7cTs5VZjS","MojnPJkzUn","gdQsSt59lR","gdQsSJIqXi","euZA5Q6Lix","xReecSWfou","m4bxURmDcr","MojnPazIWp","nnP8ouPX7G","HP433OUqFM",
+"Q6hMCciuWz","7fsYMl83Ud","FxX9qlj07Q","guMb8FGzgp","tlILt0MR5X","lj07QFVMxo","9eoRco8Uyd","qQxHP1j5L8","ZhwG1uoStw","tAOsrcmXIX",
+"VerEAChuy3","wiHrZoGu6x","2hEEUlCMxy","D6rByaDGtS","suY4xVjCZq","fLNg8uoStw","KZamHB3qem","4W0TlS77LH","M3zXLzFgtB","qUJMdrhl0J",
+"oGu6xgf8rI","1v5hHL7cGc","8FmFHEOE1o","GrDg7Q6Lix","mX2GEMmsIo","9iGoT3weIF","mz8gxnlaBy","ECMvUuAWyp","FNYIM8RCUA","rz7UtJIqXi",
+"2ZHdkEOE1o","FwEJz6AFT0","BGaQY9rlg9","uTacxjiVBP","Chuy3O3iyQ","LbRTHFGzgp","pAhR1FLsph","9y4lwhe9IA","5Drn0CIShG","ZzJHWoQ87r",
+"ZzJHWjtn0X","ni2v1vLsmS","0MR5X48cHL","4W0Tlatef2","lCMxyJJs5m","Yw2oUBGaQY","lj07QECMvU","zmLYDAXpwE","5Mg9r1v5hH","v8yFNjfREu",
+"bgJAzOz8yZ","5nmWvn8pJ9","5NammjSjS3","L7cGcnFqik","zHF1qaez9y","0h1b1JKWYR","1LB1LK20wK","wDajXHlUbF","CdyBVKr8ys","FxX9qMezSW",
+"nnP8oY1mC0","ZzJHWAgJHQ","ogLgcy94nw","TXQ0ZVprf2","jeskSzHF1q","5drc6IRh48","gdQsSpvgjS","uupzkaL6AJ","5IhmG9y4lw","0YAGH5Mg9r",
+"K20wKiqv4k","3weIFQnJ1S","WaWsviB08l","SjskQiB08l","0BmCyprNT6","1LB1LNhXdu","S2DfubZLvS","jSjS3pv0i7","hi5X7jzUqR","2Yz7Es93Ml",
+"SbRYyjzUqR","QChxsazIWp","MK07YOHaBz","RkQkev8yFN","7hyVvd7vjM","WaWsvVNCPd","6AFT0guMb8","y94nwnFqik","rKDLJY1mC0","M3zXLNxx9V",
+"OHaBz7hyVv","Uvlv455rfB","7fKYUKZamH","jS1ajJXljW","MezSW45cIH","3weIF3weIF","RzaZAfLNg8","tvdkDtlILt","618Di5iGN5","S77LHhe9IA",
+"S2DfuIKxdL","djsrvvkCHH","WmadAogLgc","zqH0Wpv0i7","B3qemW7cTs","Zv7z0Yw2oU","3otm6pAhR1","hE1QlMmKGJ","hYBCKksJby","5NammpAhR1",
+"QChxsaDGtS","4QMc9CqqaD","BCxeCZv7z0","LewvM2ZHdk","atef2pv0i7","zFgtBfFDrJ","l83UdDLhzM","FcWrWxReec","UlU3M2DREs","9y4lwRxrsm",
+"ni2v1B3qem","hUTw7euZA5","ix74rb29RJ","gIYvE24ARF","FwEJzjSjS3","gjUTui3pyd","2DREsbZLvS","3weIFCNHmv","QworuVprf2","CdyBVCqqaD",
+"t98iW5drc6","rz7UtC2Irc","Oz8yZlpF6W","Qworu2ZHdk","24ARFSbRYy","xciqp9rlg9","0BmCySjskQ","dpe1v5IhmG","v1HlnvkCHH","lm0pDe6e4z",
+"TXQ0ZcL0aE","UlU3MDG4sT","RBhp0l83Ud","m4bxUvkCHH","StlDJTwano","TCgPpaDGtS","pT8wuyofH3","JRJQBStlDJ","v2eC3IRh48","2Yz7Edpe1v",
+"In3NSoVQp6","UmaEv8cVD3","aDGtSLbRTH","DQimpHzZT8","MaJQsQnJ1S","QbxXcazIWp","FxX9qOxWIH","iqv4ktaOXK","LDk6fuAWyp","lCMxyx3LDe",
+"9GXkXEoToP","fcwDafcwDa","WDVWJa00b5","zz4ZU29QAz","bgJAz5Drn0","VBjhzBCxeC","5iGN5K20wK","lm0pDDG4sT","F6PT22hEEU","i3pydJIqXi",
+"GXdoHRsQUq","Fhtgl0h1b1","jSjS3yvOMI","hUTw7QClRL","gtCA5IBe8k","4W0TlXyPZN","tAOsrblLA9","3weIFXflUq","v8yFNRpBQm","zz4ZUWMiS3",
+"2hEEUVLTy6","azIWpMm8si","jSjS3cQOnv","ru4UGaDGtS","BFkb8YjB9t","FnPFB55rfB","O3iyQKZamH","8hJdtYw2oU","lj07QqaofN","Gv3FqCIShG",
+"n8pJ9MmKGJ","2DREslkMUA","lsQGoogLgc","8U2nU2DREs","zFgtB0Kyfs","iwzGkzbIYY","uN6r35drc6","ciuWz7Ow5C","pvgjS2Nslm","aez9yOUYuF",
+"Dz1R3vLsmS","FFDuiqQxHP","GWqqXGXdoH","qUJMdtAOsr","atef2uN6r3","t59lREOE1o","piJSkQWxoT","5NammQChxs","8xEKz1LB1L","QClRLM6qcG",
+"Q6LixJIqXi","ksJby2ZHdk","JRJQBqUJMd","UlU3MnlaBy","DLhzMGWqqX","qUJMd0YAGH","LbRTHMmsIo","5IhmG24ARF","zHF1qU3yw5","QbxXcMm8si",
+"m4bxU7hyVv","Q6Lix16lHc","7X3uy5Mg9r","CqqaDFPfSE","aFFssSmGzv","ru4UGJ2mQi","HfyNQhi5X7","JXljWRACuj","2DREsCxVEf","WDVWJatef2",
+"LewvMjSjS3","aL6AJXyPZN","9GXkX0Kyfs","M6qcG48cHL","qaofNyEfy9","DG4sTlj07Q","tlILtatef2","vLsmSlsQGo","SjskQSbRYy","PYBf4BpYhV",
+"FPfSEhE1Ql","9iGoTgjUTu","ogLgcD6rBy","1LB1LLDk6f","0h1b1Vprf2","jzUqRJIqXi","7X3uys93Ml","FLsphFNYIM","IjTwPDLhzM","U3yw5Nxx9V",
+"DcpWB580YD","PYBf4uPX7G","wiHrZ5drc6","lH1ktuAWyp","hE1Ql7fKYU","mX2GEzmLYD","StlDJ8TxD7","gjUTu29QAz","uoStwC2Irc","AIYUu6q6L9",
+"VerEAblLA9","dQ586i3pyd","xciqp14FLR","In3NSpv0i7","uZPqgqaofN","WPmlxZuDtD","QClRL48cHL","W7cTspiJSk","9XyT9QClRL","yToGWwDajX",
+"MmKGJgf8rI","pFrrlVjCZq","4QMc9gf8rI","lH1ktHlUbF","lweGyG1RhS","d7vjMBGaQY","nFqikaez9y","Cp3mZVjCZq","aDGtSDz1R3","YOfrYfaHir",
+"JJs5mdmoS7","v8yFNMmKGJ","DG4sT5VZjS","FVMxolXFOB","t59lRHfyNQ","DQimpRxrsm","GrDg7Gv3Fq","yvOMIs4786","v2eC3MGlTF","zmLYDaez9y",
+"ThjNn7X3uy","2hEEUd7vjM","VLTy616lHc","MojnPyEfy9","IjTwPo8Uyd","Qworugf8rI","GXdoHZuDtD","5VZjSd7vjM","rz7Utlm0pD","CqqaDFhtgl",
+"8hJdt7hyVv","VBjhz9eoRc","okgRimz8gx","Nxx9VM6qcG","QClRLd85a9","pmeCd5IhmG","lsQGo0Wr5y","YjB9t5ZaEz","FNYIMFcWrW","FjHXROz8yZ",
+"zQt6QLDk6f","o8UydHRxd8","TXQ0Z5Mg9r","GWqqXQClRL","ReKEW4QMc9","WreyPfcwDa","VerEAHRxd8","rz7Ut8cVD3","5drc6RsQUq","vOqCEMm8si",
+"5drc6h1zcH","VLTy6IKxdL","ReKEWGSQwj","cL0aESbRYy","dhSuHYjB9t","rz7UtcmXIX","I7p2aAmdQd","GWqqXlCMxy","L7cGcgf8rI","AXpwEhUTw7",
+"IRh48KZamH","pAhR15IhmG","XyPZNhSSvQ","atef2tAOsr","pWiOsVBjhz","wDajXix74r","S77LH16lHc","FnPFBM6qcG","2TRI7oQ87r","aL6AJcQOnv",
+"VerEA5VZjS","8hJdt5ZaEz","e6e4zzqH0W","Q6hMCGrDg7","uN6r3aL6AJ","t98iWjiVBP","tuDySQWxoT","jzUqRyvOMI","NAFuwfLNg8","fqypyaDGtS",
+"SbRYyoQ87r","jtn0X7ku1p","a00b5NAFuw","6q6L9QWxoT","9rlg955rfB","JRJQBMmKGJ","3weIFlXFOB","Ss0ZuNxx9V","FcWrWoVQp6","gdQsSnlaBy",
+"he9IAbgJAz","piJSko8Uyd","lpF6WOxWIH","fcwDayvOMI","0BmCyTCgPp","Yh1hFAkKTk","m4bxULewvM","SjskQe6e4z","Cfgr3qaofN","MaJQsFxX9q",
+"Kr8yshi5X7","dhSuHKr8ys","nnP8oMK07Y","d85a9azIWp","x3LDeWreyP","CK5W7LbRTH","Y1mC0zqH0W","MGlTFlsQGo","5nmWv29QAz","gIYvEFGzgp",
+"ciuWzuJScX","rKDLJNxx9V","dhSuH9GXkX","KASQ8pmeCd","L7cGcWMiS3","QbxXczHF1q","5Drn0DLhzM","1v5hHJXljW","cL0aErz7Ut","BCxeCAgJHQ",
+"7fsYMUvlv4","RmDcr2DREs","atef2HP433","7X3uySmGzv","0Kyfss4786","iwzGkiqv4k","WDVWJnFqik","ulk41uAWyp","k85AeogLgc","ksJbyDLhzM",
+"brhlQi3pyd","M6qcGQ6hMC","8TxD7ogLgc","fcwDaCNHmv","PYBf4D6rBy","TCgPpQssNC","MojnPFhtgl","he9IAIRh48","oGu6x9iGoT","bZLvSPOUYS",
+"4W0TlUl4a1","pT8wu9y4lw","TCgPphi5X7","atef2oGu6x","6q6L929QAz","9y4lwqaofN","Zv7z0iKqhr","yEfy99XyT9","Cp3mZyToGW","2TRI7uZPqg",
+"fFDrJVIlwP","pAhR1nnP8o","e6e4zwiHrZ","EdBKcFxX9q","rz7UtlCMxy","rhl0J7ku1p","FLsph5ZaEz","t59lR8U2nU","9rlg9QYxC0","lpF6WjiVBP",
+"WreyP9y4lw","okgRifLNg8","OUYuFAmdQd","DQimppv0i7","hSSvQ7ku1p","ulk41v2eC3","0h1b1No0Qb","618DiaL6AJ","FcWrWHRxd8","pFrrlPOUYS",
+"brhlQNcICA","1j5L8QssNC","VIlwPfmIK1","16lHcD6rBy","atef25ZaEz","FPfSEKZamH","BCxeC5VZjS","pT8wua00b5","fFDrJM3zXL","3otm6FGzgp",
+"RmDcr07n1c","lj07QFxX9q","DcpWBtuDyS","uupzk9XyT9","tlILtlCMxy","W7cTsTa8f6","WreyPStlDJ","s93MlzqH0W","hSSvQRsQUq","RkQkemz8gx",
+"1v5hHjtn0X","lj07QUlU3M","zQt6Q4dEz6","ThjNn9GXkX","9GXkXFFDui","cShY2Z4I1v","iwzGkRkQke","gdQsScmXIX","TCgPpa00b5","IBe8k16lHc",
+"YOfrYHlUbF","Nxx9VWPmlx","ZzJHWa00b5","HP4338FmFH","x3LDeDQimp","i7WMQtlILt","Q6hMCNAFuw","UmaEvLewvM","AXpwEZv7z0","TXQ0ZCfgr3",
+"dmoS7yluBx","n1pmOuPX7G","xciqpn1pmO","uvf7AjfREu","i3pydHlUbF","sqVrflXFOB","Uvlv40PktI","AIYUuCNHmv","zHF1qbrhlQ","NhXduFhtgl",
+"MK07YCK5W7","GrDg7Uvlv4","dpe1vvLsmS","k85AebZLvS","2TRI7qQxHP","FLsphVjCZq","bgJAzfmIK1","HfyNQlXFOB","8FmFHDLhzM","8hJdtru4UG",
+"ksJbyJkzUn","QWxoTYOfrY","POUYS1j5L8","G1RhSiwzGk","0Wr5yQworu","fmIK1yvOMI","WreyPIn3NS","o8UydQ6Lix","0ao3lMkgy8","nFqikmz8gx",
+"XflUquPX7G","BGaQYdhSuH","EOE1oC2Irc","n1pmOVjCZq","EOE1oi3pyd","2TRI77Ow5C","uN6r3v1Hln","OHaBzWMiS3","MmsIoPOUYS","Cp3mZfqypy",
+"Dz1R3Z4I1v","tjQxsksJby","5IhmGlj07Q","n8pJ97hyVv","s93MlCqqaD","MmsIonFqik","KZamHCxVEf","hE1QlyluBx","K4GS8ZhwG1","Uvlv4RpBQm",
+"gf8rI4QMc9","ogLgcFPfSE","kB5nPYh1hF","FnPFBK20wK","C2IrcWPmlx","M3zXLdmoS7","5ZaEziqv4k","jfREuAIYUu","lCMxy0Kyfs","1v5hHS2Dfu",
+"BFkb8xReec","ZzJHWSWfou","48cHL24ARF","J2mQiY1mC0","OHaBzfcJOy","mz8gxs7Mxk","iqv4kWPmlx","i3pyddhSuH","ix74rCIShG","jeskSuAWyp",
+"CdyBV2Yz7E","v8yFN4W0Tl","GXdoHprNT6","Pb1pafcwDa","e6e4zuAWyp","0MR5Xuupzk","b29RJiwzGk","24ARFBpYhV","ZUnqtgdQsS","S2DfulH1kt",
+"hUTw7JRJQB","nlaBys7Mxk","DQimpxXTI4","CK5W7Chuy3","e6e4z7fsYM","UlU3Me6e4z","FjHXRThjNn","BpYhVWreyP","KsjRKlXFOB","9XyT9Fhtgl",
+"Cfgr3piJSk","5Mg9rQssNC","Q6LixZ4I1v","7ku1phUTw7","9XyT9aez9y","S77LHYOfrY","2hEEUSmGzv","0YAGHFhtgl","29QAzlViBv","qUJMdaDGtS",
+"uQIczD6rBy","GrDg70Wr5y","Uvlv4pWiOs","lj07QOUqFM","faHir8RCUA","tuDySOUYuF","4W0Tlru4UG","uvf7AKr8ys","Zv7z0y94nw","b29RJDLhzM",
+"JRJQB7fsYM","5IhmG6q6L9","AXpwEPOUYS","e6e4zpT8wu","RkQkezHF1q","ciuWzEoToP","8xEKzni2v1","lweGy7hyVv","M6qcGFjHXR","Vprf2MaJQs",
+"uupzkd7vjM","oQ87rG1RhS","vkCHH4dEz6","aL6AJJ2mQi","S77LHmX2GE","G1RhSC2Irc","SmGzvKsjRK","pFrrl0BmCy","ReKEWv2eC3","VIlwPAOgEe",
+"dpe1v6q6L9","yluBxG1RhS","wDajXRsQUq","mX2GENxx9V","VerEA8xEKz","ni2v1t98iW","In3NSQnJ1S","yEfy9FGzgp","SmGzvRsQUq","Mkgy8dpe1v",
+"jSjS3gjUTu","lpF6WX6Pin","SbRYyMmKGJ","HfyNQy94nw","aFFssTwano","t59lRIRh48","Oz8yZVjCZq","jzUqRuTacx","VNCPd2TRI7","7ku1puQIcz",
+"4QMc9KsjRK","OUYuFtaOXK","VBjhzIjTwP","tl72WtvdkD","DLhzM5VZjS","U3yw5bZLvS","SjskQdpe1v","3otm6RkQke","0h1b1xReec","FPfSEd7vjM",
+"v2eC364s8N","VBjhzbrhlQ","RxrsmTXQ0Z","AgJHQAIYUu","WDVWJiqv4k","soy9tEdBKc","14FLRpFrrl","Cp3mZv8yFN","wDajXlsQGo","hE1QlFVMxo",
+"WaWsvNAFuw","ix74rv2eC3","azIWp5IhmG","uJScXWDVWJ","JkzUnjS1aj","jeskS8cVD3","zqH0WUmaEv","J2mQiFhtgl","HRxd8W3VFH","vLsmSRBhp0",
+"hE1QlyEfy9","MK07YK20wK","NcICASs0Zu","KsjRK6AFT0","JIqXiaFFss","L7cGcMmsIo","5Mg9r2Nslm","VjCZqfFDrJ","FLsphuupzk","EdBKcnlaBy",
+"vkCHHKZamH","HzZT8mz8gx","uPX7GQYxC0","ZhwG1FFDui","CdyBV4W0Tl","TXQ0ZcQOnv","uN6r3AIYUu","FnPFBuLtKs","YjB9tdmoS7","suY4xaFFss",
+"0ao3lCfgr3","1j5L8WmadA","4dEz6v1Hln","4QMc9F6PT2","MGlTF4QMc9","n1pmODcpWB","45cIH3otm6","618DiQWxoT","S77LHM6qcG","qaofNhe9IA",
+"NcICASWfou","ydG8U2DREs","CdyBVyofH3","0BmCyjfREu","WPmlx7lUXZ","uQIczY1mC0","WPmlxFxX9q","5Drn0BGaQY","mX2GEjfREu","VBjhzzY1GY",
+"8U2nUtlILt","b29RJGWqqX","In3NSHfyNQ","K20wK5Mg9r","GWqqXcShY2","SbRYyFLsph","euZA5tjQxs","aFFssGSQwj","K20wKW3VFH","JXljWM6qcG",
+"UmaEvYw2oU","DLhzMKsjRK","M6qcGFLsph","jS1ajBCxeC","lsQGo6AFT0","pFrrlDz1R3","WDVWJjSjS3","MezSWvOqCE","ZJTXHix74r","hSSvQrz7Ut",
+"KASQ8Fhtgl","taOXKhSSvQ","D6rBy2TRI7","DcpWBgjUTu","fqypycQOnv","FGzgpKsjRK","uupzk5Drn0","v1Hln16lHc","kB5nP7fsYM","7Ow5ClsQGo",
+"tl72WdmoS7","3otm6ZuDtD","14FLRHP433","zbIYYRmDcr","uLtKspiJSk","aez9y8TxD7","qQxHP2TRI7","prNT6BbwgA","uupzkfFDrJ","O3iyQ14FLR",
+"WreyPy94nw","uJScXt59lR","jtn0XkZANm","ciuWzY1mC0","GSQwjM6qcG","L7cGcKZamH","WaWsvMm8si","pT8wupFrrl","iKqhrqaofN","RkQkehE1Ql",
+"lkMUAUl4a1","S77LHa00b5","nFqikSs0Zu","9GXkXuvf7A","t59lRqUJMd","Yw2oUUvlv4","0MR5XDcpWB","SWfou5IhmG","QbxXclj07Q","uLtKs7fKYU",
+"bZLvS24ARF","DcpWB7lUXZ","zHF1qRpBQm","MezSWRpBQm","cmXIXv1Hln","b29RJAIYUu","OUYuFFNYIM","LDk6fvLsmS","XflUqblLA9","Yw2oUK20wK",
+"dpe1vK20wK","FhtglxReec","JkzUnEdBKc","2DREs5Mg9r","yluBxsoy9t","7ku1prhl0J","AXpwEvLsmS","2TRI7wDajX","FjHXR7hyVv","yofH3wiHrZ",
+"7fKYUblLA9","oVQp6lj07Q","4QMc9Waim6","uPX7G618Di","2hEEUOUqFM","hSSvQbgJAz","uupzkQssNC","piJSkaL6AJ","uupzkBGaQY","618Di45cIH",
+"OxWIH0Wr5y","he9IAYjB9t","EoToP3otm6","0MR5Xrhl0J","fmIK1tjQxs","t98iWVBjhz","L7cGc55rfB","uQIczwiHrZ","SWfouIRh48","HlUbFqaofN",
+"G1RhSB3qem","YOfrYgf8rI","RACujcmXIX","cQOnv8U2nU","uvf7A5Mg9r","VerEA4QMc9","ksJbyzz4ZU","zHF1qWmadA","a00b5gtCA5","euZA5HRxd8",
+"zHF1qO3iyQ","jeskS55rfB","pv0i72ZHdk","d85a9Zv7z0","9eoRczHF1q","7fsYM5nmWv","MmsIoZJTXH","aFFssqUJMd","3weIFBpYhV","lpF6WzQt6Q",
+"S77LHwiHrZ","iB08lulk41","l83Ud0h1b1","GXdoHZhwG1","dhSuHuupzk","QWxoTd85a9","sqVrfuAWyp","JkzUnBbwgA","Ta8f6W3VFH","qQxHPGXdoH",
+"v8yFNAOgEe","0MR5X6q6L9","RkQkeDz1R3","IBe8kEoToP","2Yz7EOz8yZ","OxWIHIBe8k","SjskQ45cIH","RxrsmWDVWJ","Yf2EchSSvQ","o8UydlpF6W",
+"cmXIXNxx9V","uoStwguMb8","ni2v18FmFH","OUYuFiwzGk","uupzklH1kt","ZzJHWChuy3","7hyVvG1RhS","Gv3Fq9XyT9","ciuWzXyPZN","AOgEeciuWz",
+"gtCA5ru4UG","aFFssHzZT8","0YAGHlXFOB","pvgjSs93Ml","8xEKzpT8wu","lweGyMK07Y","wDajXJKWYR","6q6L9djsrv","MK07Yrhl0J","xXTI4VNCPd",
+"aL6AJogLgc","jeskSEdBKc","fcwDa1LB1L","VIlwPuN6r3","m4bxUMaJQs","O3iyQlViBv","xXTI4xReec","4W0TlpFrrl","Q6LixEOE1o","RACujWMiS3",
+"LDk6ftuDyS","QClRLRzaZA","hi5X7ZuDtD","Yw2oUL7cGc","ciuWzBbwgA","SjskQFwEJz","0Kyfssx5Gl","0h1b17fsYM","yofH3tvdkD","FVMxoQClRL",
+"5Drn0uvf7A","AkKTkChuy3","CqqaDKASQ8","yvOMImz8gx","hYBCKZUnqt","QClRLUl4a1","tuDyS7hyVv","SWfouYw2oU","vOqCEGSQwj","DLhzMSjskQ",
+"QChxsQnJ1S","s93MlMmsIo","uAWypQ6Lix","OUYuFQClRL","bZLvSSjskQ","tAOsr2Nslm","taOXKqaofN","Twano7Ow5C","HlUbFVIlwP","Ul4a1jtn0X",
+"MezSWVprf2","xciqpNhXdu","QClRLQworu","9iGoTnlaBy","RmDcrGWqqX","lH1ktzz4ZU","ThjNnwiHrZ","gf8rI6q6L9","jfREu0Kyfs","MmKGJ5drc6",
+"Cp3mZfaHir","WreyPQYxC0","e6e4z0YAGH","Nxx9VSjskQ","C2Irctl72W","kZANm64s8N","Y1mC0ZzJHW","tuDySYjB9t","Yw2oUHP433","jfREuBFkb8",
+"o8UydMmKGJ","6q6L95nmWv","bgJAzP6bcg","gtCA5TXQ0Z","a00b5Twano","POUYSJKWYR","gtCA5oQ87r","0ao3lhUTw7","Chuy3C2Irc","14FLRECMvU",
+"FLsph0PktI","he9IAOz8yZ","3weIFjSjS3","Kr8ysBpYhV","fcwDajiVBP","uvf7Ai7WMQ","pWiOsOz8yZ","hi5X7pAhR1","P6bcgzY1GY","FFDuigtCA5",
+"P6bcgJKWYR","FNYIMrhl0J","14FLR48cHL","taOXKVprf2","gjUTu5Namm","hE1QlFjHXR","sqVrfZJTXH","0h1b1FNYIM","zFgtBatef2","2DREs55rfB",
+"fcwDaIn3NS","CdyBV0MR5X","W7cTsDcpWB","DQimpHP433","EoToPuJScX","GXdoHQChxs","ydG8UuN6r3","POUYSReKEW","fqypyCdyBV","7ku1ppT8wu",
+"Yw2oUSWfou","b29RJjS1aj","0PktIlm0pD","TwanoZ4I1v","LDk6fJ2mQi","MezSWMK07Y","v8yFNpWiOs","G1RhSMojnP","zHF1qk85Ae","5ZaEzfcwDa",
+"cL0aEY1mC0","t59lRUlU3M","29QAzy94nw","uTacxWaWsv","GrDg7FxX9q","vOqCEn1pmO","7fsYMfLNg8","uPX7GhYBCK","hYBCKuoStw","AmdQdru4UG",
+"s93MlyEfy9","zz4ZUYw2oU","9eoRcuoStw","euZA5cL0aE","4QMc9VIlwP","d85a99GXkX","5nmWvCxVEf","tuDyS2Nslm","euZA5IjTwP","RsQUqfqypy",
+"ThjNnulk41","7X3uyFLsph","2DREsix74r","KZamHIBe8k","OUqFMKZamH","zHF1q2hEEU","TXQ0ZdmoS7","POUYSK4GS8","0h1b1rz7Ut","blLA9D6rBy",
+"NhXdu48cHL","wDajXQYxC0","AOgEeHP433","618DiNAFuw","4W0TlBGaQY","8TxD7oGu6x","Oz8yZVNCPd","lViBvP6bcg","gIYvEMkgy8","FjHXRQYxC0",
+"djsrvDQimp","ZuDtDpT8wu","7fKYUtuDyS","tl72WD6rBy","l83UdThjNn","SbRYyuvf7A","7fsYMtvdkD","AmdQd6q6L9","14FLRtuDyS","Twano9XyT9",
+"0YAGH0Wr5y","3weIFatef2","I7p2aHP433","JXljWblLA9","vkCHHMm8si","J2mQi16lHc","Rxrsm5iGN5","VNCPdmX2GE","uLtKsJXljW","9iGoTBbwgA",
+"ZJTXHU3yw5","Mkgy8suY4x","9rlg9suY4x","vLsmS4dEz6","In3NSt59lR","POUYSxXTI4","fcwDaX6Pin","JIqXiQbxXc","HP433NhXdu","OxWIHjSjS3",
+"QYxC0EOE1o","55rfBNhXdu","7ku1pni2v1","fFDrJCxVEf","iKqhrCp3mZ","BpYhVMK07Y","uPX7GLbRTH","G1RhSHP433","oGu6xuJScX","RACujyEfy9",
+"KASQ85VZjS","jtn0XnnP8o","GWqqX580YD","9y4lw1LB1L","OHaBz14FLR","VjCZqYh1hF","jS1ajt59lR","F6PT2SbRYy","rz7UtYh1hF","TwanogjUTu",
+"CdyBVa00b5","RsQUqP6bcg","JJs5mSs0Zu","YjB9tOz8yZ","MK07Y9GXkX","JIqXia00b5","m4bxUK4GS8","F6PT2brhlQ","iB08lW3VFH","0KyfsDQimp",
+"gtCA5Qworu","SmGzvU3yw5","JXljWnFqik","QssNCt59lR","5IhmGx3LDe","iKqhrFwEJz","8TxD7MaJQs","taOXKgdQsS","GXdoHmz8gx","PYBf4aDGtS",
+"07n1clCMxy","VIlwPaFFss","rhl0JQ6Lix","GSQwjKZamH","bZLvSkB5nP","NhXdue6e4z","5Mg9ryvOMI","55rfBSjskQ","hi5X7uJScX","aFFssdpe1v",
+"NcICAjSjS3","MK07Yix74r","IBe8kcL0aE","yofH3suY4x","rhl0JCdyBV","EdBKc1LB1L","sqVrfChuy3","P6bcgRpBQm","5nmWvuN6r3","1j5L85iGN5",
+"AOgEeGrDg7","iKqhrZUnqt","jfREuLbRTH","WDVWJ7fsYM","Twanox3LDe","cmXIXQbxXc","ZhwG1QbxXc","In3NS9GXkX","cQOnvv1Hln","v1HlnjfREu",
+"uQIczjeskS","FNYIMZhwG1","HlUbFBbwgA","okgRiZv7z0","dQ586s7Mxk","uLtKsX6Pin","7lUXZxciqp","Z4I1vs4786","WPmlxlViBv","MK07YEOE1o",
+"0MR5XnlaBy","IKxdLfqypy","lViBv8cVD3","iB08lblLA9","FGzgpDz1R3","UlU3Mtl72W","gdQsStaOXK","cmXIXRzaZA","TwanotvdkD","BpYhVfFDrJ",
+"FxX9qpFrrl","uoStw2hEEU","G1RhSIn3NS","QssNCMojnP","guMb8lViBv","Yh1hFo8Uyd","pWiOsG1RhS","IRh48prNT6","NOHszBFkb8","RpBQmpWiOs",
+"16lHcuPX7G","J2mQinnP8o","lj07QzqH0W","NOHszxReec","a00b5ni2v1","pvgjSKsjRK","GSQwjBpYhV","uAWypiwzGk","POUYS14FLR","VerEA14FLR",
+"jS1aj0PktI","xXTI4GXdoH","MaJQs4dEz6","FPfSE9rlg9","DQimplkMUA","WreyP5drc6","RACujU3yw5","cmXIXt59lR","hYBCKVjCZq","9eoRckZANm",
+"yluBxulk41","vOqCE9XyT9","t98iWMojnP","lXFOBQ6hMC","P6bcgHRxd8","64s8NcShY2","FVMxoM6qcG","Oz8yZru4UG","lViBvcShY2","4QMc9uvf7A",
+"ZJTXH9XyT9","yEfy9VerEA","cL0aEDcpWB","0Wr5yBGaQY","KsjRKo8Uyd","9XyT9yToGW","Mm8sis7Mxk","55rfB8xEKz","oGu6xRmDcr","hi5X7xXTI4",
+"J2mQiEoToP","zmLYDIRh48","Mkgy8yToGW","HlUbFCp3mZ","dhSuH5Namm","GSQwjv8yFN","Ul4a1Ss0Zu","BFkb8CNHmv","pv0i7JIqXi","MaJQslXFOB",
+"tAOsrpWiOs","d7vjMCp3mZ","bgJAzmX2GE","NhXdufcJOy","uJScXQ6Lix","zqH0W8TxD7","9XyT9BGaQY","K4GS80YAGH","l83Udlm0pD","hUTw7Zv7z0",
+"JkzUn0h1b1","LewvMUmaEv","fmIK116lHc","zmLYDlXFOB","nlaByWaim6","5NammAgJHQ","yToGWpv0i7","zHF1qdQ586","GSQwjO3iyQ","MGlTFGSQwj",
+"M6qcGMm8si","gjUTuNcICA","t59lRzY1GY","uTacx6q6L9","uAWyphe9IA","FwEJzQChxs","P6bcg4dEz6","QWxoTPYBf4","2DREsjzUqR","BGaQYiwzGk",
+"OUYuFtuDyS","No0Qb14FLR","x3LDeZuDtD","PYBf48TxD7","8RCUAkB5nP","fLNg8iqv4k","atef2lj07Q","AXpwENOHsz","pWiOsPYBf4","9GXkXoVQp6",
+"NAFuwJ2mQi","FwEJzP6bcg","uupzkhUTw7","jS1ajJ2mQi","7lUXZ0MR5X","jiVBPCxVEf","I7p2a5Namm","vkCHHIBe8k","dhSuHTXQ0Z","uJScXEOE1o",
+"Pb1pa07n1c","zQt6QpT8wu","Uvlv4RACuj","fqypyVIlwP","Ta8f6FnPFB","HzZT8pv0i7","s93Ml8RCUA","POUYSn1pmO","i7WMQFFDui","ZJTXHt59lR",
+"cL0aEUmaEv","tuDySt59lR","QbxXcxReec","VNCPdNcICA","7Ow5CZhwG1","ciuWzwDajX","2DREseuZA5","jzUqRIKxdL","StlDJOxWIH","S77LHzHF1q",
+"UlU3MPb1pa","DQimpQClRL","h1zcHtlILt","ciuWzCNHmv","yToGWoQ87r","Y1mC0x3LDe","suY4x7lUXZ","7hyVvVBjhz","QYxC0NOHsz","tjQxsni2v1",
+"ZJTXHpmeCd","HlUbFuoStw","QClRLKASQ8","3weIFWreyP","nFqikyofH3","NOHszVIlwP","NAFuwxReec","ksJby2Yz7E","ix74rv1Hln","HzZT8s7Mxk",
+"v1HlnCxVEf","No0Qbpv0i7","pWiOs8xEKz","5nmWvWMiS3","m4bxUWmadA","uoStwaL6AJ","C2Irc07n1c","mz8gxiKqhr","FVMxohe9IA","8cVD3JXljW",
+"s93MlfaHir","CxVEfs93Ml","GWqqXlweGy","RzaZAJkzUn","sx5GljSjS3","W7cTsQ6hMC","gtCA5s93Ml","8U2nUAIYUu","nlaBy0ao3l","Mkgy8okgRi",
+"C2IrcZzJHW","WMiS3WmadA","cmXIXfcwDa","fLNg8Twano","NhXdufLNg8","StlDJjS1aj","IKxdL7fsYM","J2mQiFPfSE","blLA9IjTwP","kZANmX6Pin",
+"guMb8sx5Gl","Yh1hFpT8wu","WmadAjSjS3","xReecyvOMI","cShY2KsjRK","VjCZq5Drn0","Pb1paECMvU","cShY248cHL","jfREuEoToP","lkMUA16lHc",
+"Ss0Zu0PktI","LDk6fLDk6f","cShY22ZHdk","48cHLlCMxy","JXljWYf2Ec","16lHcqUJMd","VNCPdS2Dfu","i3pydWreyP","VLTy6W7cTs","MK07YYh1hF",
+"9GXkX3weIF","tvdkD2DREs","mX2GEBbwgA","zmLYDIKxdL","zqH0WWMiS3","Cfgr39eoRc","pT8wuW7cTs","7fKYUQbxXc","tuDySd85a9","OxWIHAmdQd",
+"vOqCEuupzk","EOE1ouLtKs","W7cTsWaWsv","Pb1patjQxs","dhSuHCfgr3","5Drn0M6qcG","bZLvSQbxXc","X6PinBpYhV","rz7UtCxVEf","euZA58RCUA",
+"qaofNBFkb8","In3NSOxWIH","QbxXc14FLR","FxX9qaez9y","8xEKznlaBy","ciuWz45cIH","lCMxynlaBy","MmsIofcwDa","0Wr5yBpYhV","pWiOsOUqFM",
+"VLTy6MGlTF","AmdQdPYBf4","gIYvE8U2nU","dpe1vmz8gx","0BmCypFrrl","BbwgARBhp0","9GXkXJIqXi","fmIK1zmLYD","gIYvE5VZjS","n8pJ9b29RJ",
+"Cp3mZRBhp0","VjCZq1LB1L","CK5W7tvdkD","FLsphciuWz","qUJMdlsQGo","D6rByJIqXi","lsQGoKASQ8","iwzGkfaHir","6q6L9W3VFH","aez9y7lUXZ",
+"okgRiZJTXH","0h1b10MR5X","lweGyuN6r3","VjCZqBpYhV","7Ow5ChE1Ql","DQimpv8yFN","FjHXRuAWyp","K20wKuN6r3","4QMc9X6Pin","Mkgy807n1c",
+"fFDrJChuy3","ydG8UhYBCK","BGaQYGXdoH","ThjNn580YD","Zv7z0zHF1q","FxX9qD6rBy","HzZT8K20wK","ydG8URxrsm","iKqhrs4786","IKxdLEdBKc",
+"AIYUu0Wr5y","nFqik0BmCy","ThjNnWaim6","KsjRKMmKGJ","No0QbQ6Lix","t59lRAXpwE","d85a9AgJHQ","pmeCdwiHrZ","3weIFCqqaD","G1RhSTwano",
+"C2IrcK4GS8","Cp3mZHlUbF","pv0i7Ul4a1","In3NSJKWYR","HfyNQe6e4z","azIWpPYBf4","i7WMQhUTw7","UmaEvCfgr3","MezSWFNYIM","zqH0W5Mg9r",
+"14FLRAIYUu","YOfrYqQxHP","lj07QHP433","gIYvEP6bcg","ZhwG1qQxHP","NAFuwlj07Q","fcwDa5Mg9r","gtCA5RkQke","ni2v16AFT0","W7cTsogLgc",
+"uupzkAOgEe","FwEJzaDGtS","CIShGhSSvQ","SmGzvK20wK","tl72Wy94nw","okgRiNhXdu","MmsIoX6Pin","1v5hHhUTw7","x3LDeFjHXR","iqv4kGrDg7",
+"v1HlnAgJHQ","5nmWvbZLvS","AgJHQFcWrW","zmLYDFhtgl","YOfrYd85a9","VIlwPQbxXc","QWxoTtuDyS","IKxdLtl72W","RpBQmgIYvE","lsQGod85a9",
+"guMb83otm6","QbxXcMGlTF","HRxd8WMiS3","hE1QlSmGzv","U3yw5guMb8","nFqik4W0Tl","sx5GlGSQwj","yEfy9BFkb8","jSjS3NAFuw","tAOsrFcWrW",
+"tAOsrZv7z0","7Ow5Ci7WMQ","XflUqni2v1","FPfSE6q6L9","LewvMRxrsm","ZhwG14W0Tl","07n1cEoToP","iKqhrhUTw7","Yh1hFNAFuw","AOgEet98iW",
+"aL6AJuTacx","guMb8s93Ml","WmadAuvf7A","4dEz6AmdQd","S77LHD6rBy","vkCHHsoy9t","RpBQm3otm6","hi5X7Fhtgl","rz7UtWmadA","jiVBPOHaBz",
+"faHirYh1hF","5VZjSgjUTu","FxX9qni2v1","n1pmO29QAz","nnP8oHzZT8","iB08lNcICA","ZzJHWSjskQ","nnP8os4786","1LB1LpT8wu","D6rBypFrrl",
+"7fsYMe6e4z","xReecuAWyp","yEfy9mX2GE","nnP8oP6bcg","Yh1hFk85Ae","lm0pDuvf7A","WaWsv6AFT0","FFDuiuoStw","t59lRF6PT2","ZuDtDFwEJz",
+"lCMxyh1zcH","fqypyJJs5m","vOqCEjiVBP","Fhtgltl72W","pWiOsWMiS3","IBe8kBpYhV","qaofNZ4I1v","KZamHOz8yZ","JRJQBJkzUn","Chuy3zFgtB",
+"UmaEvFxX9q","Pb1paBbwgA","djsrvFFDui","gdQsSyEfy9","5IhmGZzJHW","FFDuipmeCd","MK07Yd85a9","Chuy3ZhwG1","uN6r3MezSW","AmdQdni2v1",
+"kB5nPjS1aj","0MR5XFFDui","5NammMkgy8","wDajXDz1R3","9GXkXMmsIo","16lHcXyPZN","RACujFjHXR","uLtKsgIYvE","jzUqRAXpwE","FPfSEru4UG",
+"sqVrfzmLYD","qQxHPO3iyQ","gf8rI9XyT9","FNYIMFPfSE","Mm8siHP433","sx5GlfLNg8","fFDrJCK5W7","BpYhV2Yz7E","4QMc9G1RhS","qQxHPMezSW",
+"FGzgpokgRi","U3yw5AIYUu","BCxeCJkzUn","DG4sTcShY2","zFgtB0YAGH","AmdQdx3LDe","DQimpFPfSE","x3LDeMK07Y","CNHmvmX2GE","uTacxTXQ0Z",
+"azIWpRkQke","FPfSEqQxHP","KZamHW3VFH","cShY2ogLgc","MojnP9eoRc","zFgtBDG4sT","dQ5865VZjS","8hJdtbZLvS","zbIYYHP433","LDk6fzmLYD",
+"HRxd8zmLYD","VjCZqF6PT2","RzaZA2DREs","zz4ZUv2eC3","Q6hMC64s8N","CqqaDbrhlQ","DcpWBtAOsr","Ss0Zumz8gx","FPfSEjtn0X","L7cGc2TRI7",
+"Dz1R3atef2","RkQkeSbRYy","Dz1R3DcpWB","IKxdLeuZA5","CNHmve6e4z","MmKGJGXdoH","yEfy9hSSvQ","azIWpuN6r3","yEfy9VIlwP","3weIF16lHc",
+"GSQwj9y4lw","EOE1od85a9","BbwgAuJScX","Mm8siGWqqX","Q6hMCcmXIX","Zv7z0pFrrl","yToGW9y4lw","t98iWrz7Ut","uZPqgQ6Lix","16lHctlILt",
+"POUYSBFkb8","uoStwBCxeC","8TxD7MmsIo","EoToPBbwgA","5nmWvI7p2a","XflUqRmDcr","4QMc9WDVWJ","fcwDaQChxs","rKDLJtvdkD","LbRTHuvf7A",
+"lH1ktvkCHH","U3yw55VZjS","5VZjS9eoRc","he9IAtlILt","ZhwG10PktI","he9IA7fsYM","9y4lw8FmFH","uupzkhYBCK","okgRib29RJ","m4bxUydG8U",
+"n8pJ9piJSk","5drc6UmaEv","uN6r3Ss0Zu","rKDLJb29RJ","lXFOB1j5L8","UmaEv2Yz7E","bgJAz3otm6","iwzGkK4GS8","VBjhz618Di","e6e4zzmLYD",
+"8FmFHuPX7G","X6PinTCgPp","xReecTCgPp","OUqFMAIYUu","6q6L9v8yFN","vLsmSVjCZq","S2DfuJKWYR","fmIK1uoStw","b29RJlkMUA","rz7Utpv0i7",
+"8FmFH5nmWv","MezSW7hyVv","NOHszjS1aj","oVQp6lweGy","OHaBzHP433","5drc6SWfou","cQOnv7fsYM","7ku1ppvgjS","ru4UGPYBf4","0MR5XAIYUu",
+"bZLvSAXpwE","MmKGJ0Kyfs","pAhR1LDk6f","24ARFEOE1o","MaJQsuAWyp","k85AeuAWyp","QssNCvLsmS","tl72WYjB9t","OxWIHlm0pD","pv0i7zFgtB",
+"uN6r3Z4I1v","atef2WmadA","VNCPd5iGN5","xciqpni2v1","IKxdLtvdkD","Chuy3QWxoT","JKWYRK4GS8","uAWypyEfy9","XflUq4W0Tl","8RCUAt98iW",
+"SWfou8TxD7","ZUnqtKASQ8","WPmlxlsQGo","ZuDtDn1pmO","UlU3MP6bcg","4QMc9x3LDe","lCMxy0h1b1","JRJQBkZANm","I7p2aGSQwj","fFDrJ5Drn0",
+"VIlwPuAWyp","OxWIHOUqFM","AOgEed85a9","UmaEvI7p2a","K20wKL7cGc","uLtKs0MR5X","29QAziwzGk","07n1cVIlwP","7fsYMBCxeC","7hyVv2ZHdk",
+"I7p2aNAFuw","DG4sTYh1hF","Vprf2zY1GY","Y1mC0d85a9","ciuWzU3yw5","iB08lRsQUq","gtCA51j5L8","2TRI77hyVv","uoStwnnP8o","0PktIMmsIo",
+"vLsmSCfgr3","WMiS3NhXdu","SbRYyuAWyp","dmoS7qQxHP","Waim6zmLYD","pAhR1nFqik","No0Qb0MR5X","SWfouEdBKc","IjTwPCp3mZ","ksJby580YD",
+"OxWIHDG4sT","FxX9qjtn0X","GXdoH618Di","1LB1LSmGzv","Yw2oUfcwDa","9y4lwjfREu","8FmFHLbRTH","8hJdtJRJQB","J2mQiVprf2","JXljWQ6Lix",
+"AmdQdi7WMQ","JkzUnydG8U","uvf7AokgRi","S77LH29QAz","pvgjSGrDg7","rz7UtOHaBz","jS1aj4QMc9","uZPqgReKEW","MezSWaL6AJ","Dz1R3Ss0Zu",
+"Yw2oUfmIK1","HfyNQ618Di","HlUbFprNT6","Ss0ZuHzZT8","NAFuwHlUbF","FwEJzD6rBy","MmKGJy94nw","d85a9LDk6f","M3zXL2DREs","pFrrl1v5hH",
+"Cp3mZuN6r3","0MR5XSWfou","vkCHH4W0Tl","rKDLJVBjhz","HP433s7Mxk","BGaQYIRh48","L7cGcv2eC3","gf8rIgdQsS","CNHmvAgJHQ","QbxXcCdyBV",
+"bgJAzSmGzv","nlaByrhl0J","cL0aEfFDrJ","PYBf4TCgPp","rKDLJi3pyd","0KyfsNcICA","8xEKzPYBf4","soy9t2Yz7E","vLsmSn8pJ9","RACujm4bxU",
+"JJs5mguMb8","4W0TlQworu","HzZT82TRI7","n8pJ9Gv3Fq","U3yw5gIYvE","lpF6WlweGy","o8Uyd8U2nU","lpF6Wn1pmO","oQ87rJXljW","PYBf45Mg9r",
+"zQt6Q5nmWv","pT8wuaFFss","ni2v1mX2GE","9rlg9BFkb8","v8yFNuPX7G","QnJ1SVerEA","K20wKzqH0W","QWxoTqUJMd","618Di8U2nU","ThjNnGv3Fq",
+"MGlTFUl4a1","PYBf4oQ87r","l83UdPb1pa","iB08lIjTwP","K4GS8DQimp","taOXKsuY4x","MK07YZhwG1","xReecSbRYy","GXdoHs4786","tuDySlm0pD",
+"48cHLY1mC0","7hyVvNcICA","5iGN5JJs5m","uN6r3FLsph","5Drn06q6L9","fqypypmeCd","BFkb8lH1kt","8RCUAgf8rI","4W0TlDz1R3","9iGoTni2v1",
+"D6rByfLNg8","W7cTsYjB9t","RACujokgRi","tvdkDXflUq","Mkgy8Uvlv4","MK07Ya00b5","zY1GYzqH0W","jSjS3bgJAz","29QAzVprf2","jtn0XYjB9t",
+"gtCA5WPmlx","5IhmG5VZjS","lpF6WUl4a1","tl72WzqH0W","FnPFBDG4sT","RkQkejfREu","FLsphCfgr3","tvdkDlCMxy","bgJAz8RCUA","Yf2EciwzGk",
+"GrDg7ReKEW","cShY2POUYS","ReKEWGWqqX","8FmFH7fKYU","fLNg8HlUbF","Y1mC0Waim6","DLhzMFjHXR","aFFss07n1c","dhSuHFVMxo","S2DfuCp3mZ",
+"oVQp6O3iyQ","wiHrZJKWYR","iqv4kFnPFB","VLTy6zbIYY","FLsphqQxHP","HRxd824ARF","In3NSlpF6W","uZPqg07n1c","uAWypWMiS3","C2IrcdQ586",
+"sx5GlXflUq","55rfBAmdQd","d7vjMcShY2","lXFOB8TxD7","0KyfsfcJOy","CK5W7HzZT8","D6rByVIlwP","9GXkX8xEKz","brhlQFLsph","5nmWv8TxD7",
+"618DiuPX7G","prNT60BmCy","tuDySe6e4z","gtCA55Namm","S77LHDG4sT","5drc6RkQke","djsrv7Ow5C","QWxoTuTacx","0YAGHciuWz","GWqqXM6qcG",
+"FNYIMHfyNQ","lkMUAAIYUu","4QMc9StlDJ","AgJHQzQt6Q","nFqik7fKYU","WreyPwiHrZ","8U2nUzqH0W","FjHXRs93Ml","ru4UGFhtgl","2TRI7hi5X7",
+"QnJ1S07n1c","bgJAzDQimp","JIqXiogLgc","Cp3mZXflUq","RpBQm5iGN5","gjUTu9eoRc","W3VFHzHF1q","8U2nU7Ow5C","0PktIn1pmO","RpBQmNo0Qb",
+"BGaQYo8Uyd","0Wr5yOHaBz","uoStw5iGN5","5Namm7fKYU","gjUTumX2GE","L7cGcBGaQY","ciuWzzY1GY","J2mQiFnPFB","Fhtgl5ZaEz","KZamHSjskQ",
+"uAWyp5Drn0","fcwDaPOUYS","mX2GELbRTH","tvdkDUmaEv","RxrsmDQimp","7X3uyuupzk","5IhmGMmKGJ","XflUqlViBv","7fKYUjeskS","ciuWzJJs5m",
+"kZANmF6PT2","4QMc90ao3l","ru4UGVerEA","Gv3FqCdyBV","4dEz6hSSvQ","v8yFNZ4I1v","pvgjSMaJQs","2NslmS77LH","8xEKziKqhr","ZuDtDFPfSE",
+"okgRiCp3mZ","C2IrcCNHmv","gjUTuBGaQY","d7vjMFGzgp","n8pJ9JIqXi","9iGoTBGaQY","CqqaDv2eC3","Kr8ys48cHL","HP4336q6L9","RBhp00YAGH",
+"uoStwS77LH","1v5hHdpe1v","oVQp60Kyfs","3otm6rz7Ut","QClRL7ku1p","HzZT8tjQxs","tjQxs7lUXZ","fqypy5VZjS","BCxeCcmXIX","AXpwEjiVBP",
+"D6rBybgJAz","NOHsz8TxD7","Dz1R3UmaEv","OUqFMFnPFB","C2IrcYf2Ec","MGlTFVjCZq","lsQGorKDLJ","RpBQmS2Dfu","LbRTHGSQwj","ThjNnTXQ0Z",
+"I7p2aciuWz","TXQ0ZFNYIM","4QMc9faHir","NcICAgf8rI","F6PT2jeskS","he9IAbZLvS","POUYSU3yw5","YjB9teuZA5","F6PT2lXFOB","48cHLzz4ZU",
+"hSSvQCp3mZ","fcJOyNxx9V","AIYUuWreyP","mX2GEWaim6","AXpwEo8Uyd","HP433P6bcg","24ARFs4786","hYBCKGrDg7","Uvlv48xEKz","48cHLzqH0W",
+"EOE1odmoS7","RsQUq7lUXZ","jzUqR0PktI","RBhp0sqVrf","14FLREdBKc","t59lRpWiOs","48cHLWreyP","zqH0Wlj07Q","6AFT0vOqCE","wDajXpT8wu",
+"lkMUAFcWrW","guMb8ZzJHW","uN6r3ZUnqt","blLA9euZA5","zFgtBOUYuF","K4GS89eoRc","UmaEvPYBf4","FhtglfaHir","n1pmOCqqaD","2TRI7iwzGk",
+"Q6LixLbRTH","suY4x0Kyfs","zqH0Wi7WMQ","45cIH7lUXZ","zQt6QRxrsm","P6bcgk85Ae","MmKGJrhl0J","zFgtBECMvU","yvOMIuTacx","Vprf2OUYuF",
+"LDk6fThjNn","Cp3mZM6qcG","7hyVvOHaBz","uupzkpmeCd","55rfBBGaQY","mX2GEogLgc","WMiS3zbIYY","BCxeCVNCPd","OHaBzJRJQB","gdQsStvdkD",
+"MmKGJgjUTu","Oz8yZtaOXK","Zv7z0piJSk","2NslmThjNn","YOfrYl83Ud","NOHszM3zXL","gtCA5uupzk","rz7Ut0MR5X","Nxx9VUvlv4","ZzJHWfmIK1",
+"prNT6sx5Gl","o8UydprNT6","VIlwPUvlv4","580YDZv7z0","fqypyFNYIM","RpBQmTwano","uoStwCK5W7","vkCHHMkgy8","ni2v145cIH","WreyPoGu6x",
+"PYBf4P6bcg","m4bxUPb1pa","7Ow5CjzUqR","8cVD3GXdoH","xReecDz1R3","5NammnnP8o","TXQ0ZReKEW","5Mg9rCIShG","MGlTFru4UG","AIYUujfREu",
+"5ZaEzS77LH","MojnPlj07Q","KZamHLewvM","HlUbFFNYIM","RsQUqbZLvS","hi5X7NcICA","OxWIHtuDyS","aFFssogLgc","cL0aEOz8yZ","RsQUqb29RJ",
+"Pb1pai3pyd","jfREuXyPZN","s7Mxkn8pJ9","lweGy14FLR","taOXKKZamH","6AFT0atef2","CxVEfLDk6f","CdyBVD6rBy","POUYS8hJdt","azIWpUlU3M",
+"zz4ZUWDVWJ","EoToPVNCPd","S77LHGXdoH","1LB1LRzaZA","djsrv8xEKz","WreyPcmXIX","8cVD3oVQp6","h1zcHSmGzv","9GXkXlkMUA","UmaEvuN6r3",
+"uoStwP6bcg","jtn0XlsQGo","In3NS4QMc9","EOE1oY1mC0","FjHXRdpe1v","zQt6Qn1pmO","EoToPRACuj","t98iWe6e4z","fcJOyzqH0W","NhXdut59lR",
+"tuDySjeskS","pT8wuFNYIM","IKxdLni2v1","RxrsmYOfrY","MaJQsD6rBy","dpe1v6AFT0","EOE1o1j5L8","GWqqXECMvU","RBhp0P6bcg","VIlwP07n1c",
+"zHF1qCqqaD","y94nwYf2Ec","lm0pDLewvM","16lHcpT8wu","0h1b1TXQ0Z","pT8wusqVrf","VBjhzRkQke","aez9y2Nslm","b29RJOxWIH","zQt6Qx3LDe",
+"fcwDaBpYhV","LDk6fJkzUn","fcwDaY1mC0","Mm8siD6rBy","zqH0WxReec","qaofNMK07Y","Vprf2Chuy3","618DiRpBQm","ThjNnKASQ8","VIlwPhE1Ql",
+"GrDg7euZA5","ZUnqtQWxoT","S77LHS2Dfu","CIShGn1pmO","GSQwjlkMUA","Q6hMC5iGN5","Kr8ysoQ87r","7lUXZCIShG","oGu6xv2eC3","Uvlv48cVD3",
+"nnP8ofcJOy","JRJQB0PktI","FVMxociuWz","FhtglKASQ8","dmoS7lCMxy","FnPFBuJScX","6q6L9a00b5","5iGN5MezSW","TXQ0ZoVQp6","a00b5zz4ZU",
+"J2mQifaHir","yofH38xEKz","wDajXOUYuF","AkKTkulk41","dpe1vXflUq","D6rBy9XyT9","ZJTXHOxWIH","tjQxsWreyP","VBjhzjtn0X","zbIYYAgJHQ",
+"tl72WIRh48","BbwgAMaJQs","VjCZqoVQp6","s4786QClRL","K20wKmX2GE","gf8rIY1mC0","FPfSEZ4I1v","WmadA29QAz","Dz1R3kB5nP","atef2gjUTu",
+"DG4sT7X3uy","3weIFuTacx","5drc6U3yw5","2Yz7EBbwgA","nlaByVNCPd","uJScXW7cTs","uJScXUlU3M","UlU3M8xEKz","zmLYDksJby","5Drn0FcWrW",
+"lH1ktpmeCd","wiHrZlj07Q","Yw2oUFhtgl","WPmlxd7vjM","nnP8o5IhmG","nnP8oFwEJz","o8UydDcpWB","uTacxm4bxU","S2Dfu0Wr5y","JJs5mlpF6W",
+"d85a9ogLgc","CqqaDtl72W","ZzJHWEOE1o","WreyPXyPZN","ix74rru4UG","lpF6WqQxHP","Cfgr3AOgEe","7lUXZQworu","0ao3lXyPZN","dhSuHaL6AJ",
+"VjCZqguMb8","kZANmiB08l","tlILtDG4sT","IRh48fqypy","uQIczW7cTs","zY1GYe6e4z","s7MxkL7cGc","atef22Nslm","EOE1o8RCUA","Vprf2PYBf4",
+"lm0pDQ6hMC","yEfy9MK07Y","BbwgAuvf7A","BpYhVl83Ud","FPfSEKASQ8","bgJAzFLsph","tAOsrqaofN","24ARFX6Pin","zQt6QfaHir","rz7UtprNT6",
+"FwEJzgdQsS","i7WMQhSSvQ","CK5W7Nxx9V","L7cGcNOHsz","lj07Q0BmCy","jtn0XeuZA5","zqH0WSbRYy","7fKYUWaim6","7lUXZ7fsYM","yofH3s93Ml",
+"MezSWThjNn","Q6LixPOUYS","s4786lj07Q","OUqFMqaofN","lCMxydQ586","gdQsSDcpWB","QnJ1SFNYIM","tlILtOxWIH","aFFssDQimp","pAhR1faHir",
+"Nxx9Vtl72W","K4GS8No0Qb","fcwDaAIYUu","n1pmOFPfSE","bZLvSsx5Gl","dQ58645cIH","lj07Qrz7Ut","dhSuH7ku1p","0MR5Xni2v1","TXQ0ZWMiS3",
+"7fsYM1j5L8","jSjS3Zv7z0","lj07QIBe8k","J2mQipmeCd","kB5nPs93Ml","YOfrYtvdkD","oVQp6QWxoT","xReec618Di","EOE1oKr8ys","WPmlxUmaEv",
+"hi5X7KsjRK","h1zcHvLsmS","CdyBVFPfSE","KZamHuQIcz","l83UdQnJ1S","n1pmOVerEA","S2DfuTa8f6","FFDuiuPX7G","29QAzm4bxU","jiVBPtaOXK",
+"7ku1pjzUqR","Kr8yse6e4z","Yh1hFaL6AJ","OHaBzdhSuH","gjUTuMmKGJ","580YDLbRTH","MGlTFWPmlx","OHaBzVIlwP","aFFssk85Ae","3otm6aez9y",
+"QWxoT5drc6","Nxx9VOHaBz","h1zcHTa8f6","8U2nUGWqqX","lXFOBs93Ml","ni2v1mz8gx","rKDLJ5VZjS","LewvMBFkb8","vkCHHReKEW","sx5GlVIlwP",
+"Uvlv4L7cGc","yvOMI14FLR","WreyPNxx9V","sx5GlpFrrl","0PktITXQ0Z","AXpwEuN6r3","VLTy61LB1L","guMb85Mg9r","yEfy9t59lR","IBe8kCfgr3",
+"piJSk48cHL","gjUTuVjCZq","580YDsuY4x","oQ87rCqqaD","ru4UG45cIH","pmeCdpv0i7","xciqpgIYvE","rhl0JokgRi","14FLRFNYIM","Chuy3ru4UG",
+"aFFssFVMxo","Q6hMCWreyP","29QAzzY1GY","HP433gtCA5","7lUXZgtCA5","fLNg8FxX9q","OHaBzM6qcG","RsQUqKZamH","SjskQQWxoT","ru4UG0Kyfs",
+"RBhp05VZjS","dmoS7fcwDa","SjskQlCMxy","yToGWGWqqX","YjB9tk85Ae","EoToPtl72W","QbxXcuTacx","sqVrf5Mg9r","faHirGrDg7","uN6r3RkQke",
+"jS1ajksJby","WMiS3NOHsz","hE1QlRkQke","lpF6WNhXdu","48cHL0PktI","kB5nPFhtgl","AIYUuBGaQY","W7cTslH1kt","zmLYDQnJ1S","7X3uyRxrsm",
+"1j5L8NOHsz","8cVD3IjTwP","0YAGHECMvU","Oz8yZYw2oU","B3qemd85a9","16lHcAOgEe","1LB1LlkMUA","pvgjSpiJSk","pAhR17fsYM","GWqqXFnPFB",
+"9y4lwi3pyd","9iGoTG1RhS","FnPFB29QAz","Gv3FqqaofN","X6PinSjskQ","v2eC3lweGy","F6PT2MezSW","FwEJz48cHL","gIYvERxrsm","SjskQjfREu",
+"SbRYyU3yw5","UmaEvXyPZN","VNCPdRsQUq","VerEASWfou","hi5X7PYBf4","mX2GErKDLJ","qQxHPYw2oU","s93MlQ6Lix","X6PinKsjRK","3otm6hUTw7",
+"LDk6f0YAGH","RmDcr4dEz6","m4bxU1LB1L","UlU3MuTacx","b29RJpT8wu","uoStwdhSuH","AgJHQLbRTH","7ku1paez9y","uvf7ARACuj","64s8NLewvM",
+"jzUqReuZA5","NcICANOHsz","kB5nPDQimp","x3LDeChuy3","ZhwG1uupzk","BFkb8o8Uyd","h1zcH4dEz6","aL6AJhi5X7","4QMc9CIShG","Cp3mZwDajX",
+"MK07YyofH3","fqypy4QMc9","fcwDalpF6W","W7cTsWPmlx","uAWyp0PktI","v2eC3Y1mC0","5ZaEz07n1c","taOXKlj07Q","CK5W7hSSvQ","uN6r3uAWyp",
+"jiVBPL7cGc","ZJTXHRACuj","pAhR1Ta8f6","GrDg7XyPZN","OHaBzFhtgl","DcpWB6AFT0","iwzGk07n1c","MK07YlXFOB","F6PT2In3NS","RACujDQimp",
+"X6PinEoToP","AXpwEdhSuH","24ARFFhtgl","VIlwP2hEEU","bgJAzTCgPp","zqH0Wtl72W","K20wKQnJ1S","MK07YlViBv","Pb1pazHF1q","0BmCy29QAz",
+"tvdkDuJScX","ix74rRkQke","SjskQcL0aE","CNHmvsuY4x","CqqaDVBjhz","ZuDtDFVMxo","JJs5m0YAGH","In3NS9iGoT","BpYhVWmadA","m4bxUS77LH",
+"i3pydiqv4k","CqqaDW7cTs","l83Udfqypy","0ao3ljeskS","uvf7Av8yFN","iwzGkJKWYR","mX2GENOHsz","Mkgy8hYBCK","ThjNnsx5Gl","NhXdudmoS7",
+"uvf7Ak85Ae","KsjRK29QAz","5Namm7fsYM","SWfouhE1Ql","QYxC0hUTw7","GXdoHpAhR1","uJScXFnPFB","brhlQ55rfB","h1zcHm4bxU","dhSuHCdyBV",
+"FcWrW3weIF","QssNCyofH3","GSQwjVprf2","Y1mC05Mg9r","n1pmO618Di","v2eC3uPX7G","WaWsvSmGzv","4W0Tl24ARF","lH1ktbrhlQ","h1zcHOz8yZ",
+"NhXdui3pyd","SjskQ5VZjS","zmLYDdjsrv","soy9tyvOMI","rKDLJ7fKYU","Chuy3oVQp6","ni2v1aFFss","Pb1pa2Nslm","618DivLsmS","taOXK8FmFH",
+"brhlQhUTw7","8U2nUNAFuw","Ss0ZuDcpWB","QbxXcB3qem","QnJ1S3weIF","qaofNjzUqR","BbwgACqqaD","BbwgAfmIK1","BbwgAQClRL","W7cTsgtCA5",
+"iqv4kuupzk","uPX7G8U2nU","VerEAFwEJz","QClRLMm8si","v1HlnlCMxy","taOXKFnPFB","CNHmv0ao3l","VNCPdsoy9t","5Mg9ruvf7A","lkMUAokgRi",
+"S2DfuFnPFB","hSSvQAgJHQ","5drc6bgJAz","he9IA1v5hH","ydG8U24ARF","lH1ktgIYvE","QChxsgdQsS","Nxx9VD6rBy","F6PT2Yh1hF","W7cTsF6PT2",
+"64s8NQssNC","BGaQYtlILt","pv0i7BCxeC","QworuCqqaD","BpYhVzqH0W","5Mg9rVBjhz","zqH0WfLNg8","JJs5mzqH0W","wDajXX6Pin","FGzgpoQ87r",
+"CK5W7StlDJ","WDVWJD6rBy","CK5W7hUTw7","55rfB7X3uy","jiVBP8FmFH","7lUXZLbRTH","dpe1vkB5nP","EdBKcLewvM","lm0pDHzZT8","lH1ktm4bxU",
+"iwzGkHfyNQ","uQIczfLNg8","2DREsECMvU","uAWypaez9y","HP433W3VFH","O3iyQFhtgl","lCMxypiJSk","FVMxoFcWrW","hSSvQguMb8","2ZHdkUlU3M",
+"8TxD75ZaEz","zmLYDHlUbF","VjCZqhE1Ql","MmKGJmX2GE","i3pyd0Wr5y","NhXduDz1R3","uPX7GoGu6x","0Wr5y24ARF","W3VFHv1Hln","VLTy6qaofN",
+"U3yw5NAFuw","M6qcGX6Pin","JIqXiRzaZA","HfyNQatef2","zHF1q9rlg9","8U2nUIKxdL","qaofN7X3uy","5Mg9rRzaZA","9eoRc7Ow5C","Chuy3W7cTs",
+"b29RJlsQGo","uLtKsQ6hMC","48cHLD6rBy","Chuy3W3VFH","lm0pDgtCA5","ciuWzmX2GE","9rlg9EoToP","v2eC314FLR","jS1ajQnJ1S","JJs5mCNHmv",
+"2DREsCqqaD","uN6r3VNCPd","l83Udd85a9","zHF1qzz4ZU","FFDuiuLtKs","2DREs48cHL","5NammAkKTk","tl72WXflUq","RkQkeMm8si","IRh488RCUA",
+"WPmlxokgRi","L7cGc0BmCy","yluBx9iGoT","Twano07n1c","KASQ8RBhp0","SWfouQYxC0","6AFT0UmaEv","lj07Q64s8N","CqqaDjiVBP","Q6Lix4W0Tl",
+"JXljWdpe1v","h1zcHFPfSE","xXTI4ulk41","gtCA5cL0aE","P6bcgG1RhS","d85a9jzUqR","48cHLM6qcG","PYBf4v8yFN","55rfBaFFss","S77LH5Drn0",
+"gtCA5RsQUq","IKxdLyvOMI","KASQ81j5L8","HlUbFgdQsS","QClRLQWxoT","NcICAuAWyp","QbxXc0Kyfs","ECMvUDz1R3","1v5hHlXFOB","HfyNQ2Nslm",
+"vOqCEuQIcz","MK07YyvOMI","45cIHpFrrl","Qworu5IhmG","tl72WdQ586","BFkb8ZzJHW","zFgtB0PktI","RzaZAkB5nP","NOHszKZamH","v1HlnRmDcr",
+"mX2GE7X3uy","nlaByKsjRK","ksJbyhSSvQ","0MR5Xb29RJ","Q6LixPYBf4","tvdkDlm0pD","9iGoTFNYIM","EOE1oRxrsm","hi5X7nFqik","POUYS9rlg9",
+"Zv7z0euZA5","UmaEvAOgEe","lViBvoVQp6","jfREuaFFss","5iGN5zbIYY","kZANmNxx9V","Vprf27fKYU","fFDrJvkCHH","iqv4k8RCUA","JXljWEdBKc",
+"fcJOypAhR1","QWxoT4W0Tl","tuDySRkQke","k85AeRzaZA","fLNg8tjQxs","HRxd81LB1L","tl72WAmdQd","AgJHQ0YAGH","pvgjSIn3NS","zz4ZUPb1pa",
+"WreyPWreyP","wiHrZlCMxy","zbIYY7fsYM","tAOsry94nw","16lHcAkKTk","n1pmOCfgr3","0MR5X5ZaEz","pAhR1b29RJ","VBjhzjS1aj","U3yw5GWqqX",
+"14FLRFFDui","ni2v1NhXdu","IjTwP0MR5X","yEfy907n1c","bgJAzWaWsv","d85a92hEEU","0KyfsyToGW","8cVD30ao3l","9GXkX7fKYU","MGlTFsqVrf",
+"Kr8ys5Namm","k85Aee6e4z","rKDLJLDk6f","CIShGVerEA","F6PT2AOgEe","2DREsyToGW","dpe1ve6e4z","kZANmWMiS3","xXTI48cVD3","bgJAzFhtgl",
+"Yf2EclpF6W","C2Irc0h1b1","ReKEWFFDui","64s8NGv3Fq","bZLvS0BmCy","iB08lTXQ0Z","G1RhSFwEJz","Uvlv4FVMxo","WmadAe6e4z","Yh1hFTCgPp",
+"lH1ktokgRi","uJScXPYBf4","s93MlWreyP","RpBQmRzaZA","ydG8Un1pmO","55rfBWPmlx","ulk41L7cGc","uPX7G0YAGH","jtn0X7fsYM","EdBKcWPmlx",
+"GrDg7AOgEe","Ta8f6ZzJHW","piJSki7WMQ","rhl0JxReec","CqqaDPb1pa","S2DfuHfyNQ","s93MlJkzUn","pvgjS5IhmG","5VZjSuLtKs","ydG8Ut59lR",
+"xXTI4GrDg7","XyPZN9eoRc","24ARFy94nw","qUJMdprNT6","GXdoH8hJdt","GrDg75Drn0","IRh48UlU3M","0BmCyYf2Ec","0KyfsY1mC0","JKWYRs7Mxk",
+"RpBQmMK07Y","o8UydCqqaD","s7MxkfcJOy","ciuWzgjUTu","pT8wuvkCHH","07n1c5ZaEz","48cHL5Mg9r","lH1ktJJs5m","okgRiRpBQm","aFFssBpYhV",
+"jS1ajyofH3","uAWyp6AFT0","KsjRKmz8gx","qQxHPFwEJz","prNT6ZuDtD","iKqhrK4GS8","KsjRKECMvU","5Drn0rz7Ut","nnP8oK20wK","lViBv7fKYU",
+"pv0i7K20wK","0BmCyQ6hMC","SbRYyuTacx","Yf2EcHRxd8","t59lRs4786","AXpwES77LH","e6e4zRzaZA","8cVD3iB08l","U3yw516lHc","ru4UGCqqaD",
+"prNT6VIlwP","Mm8sid85a9","i7WMQxciqp","k85AeC2Irc","ReKEWzFgtB","dpe1vJkzUn","ulk41NOHsz","B3qemdjsrv","AOgEe5Mg9r","ZzJHWPOUYS",
+"FwEJziwzGk","RzaZAStlDJ","29QAzaDGtS","uZPqgzmLYD","5Drn0580YD","t59lRlViBv","yToGWLbRTH","5drc6HlUbF","QbxXcjtn0X","uPX7GHlUbF",
+"Mkgy80h1b1","FLsphzY1GY","8hJdtt59lR","lj07QvOqCE","cL0aEzHF1q","ulk41IKxdL","7ku1pWMiS3","CdyBVAIYUu","QChxsFwEJz","YjB9tydG8U",
+"tAOsrIn3NS","2Nslm3weIF","8FmFHzbIYY","t59lR8RCUA","RzaZAHP433","X6PinuPX7G","DG4sTPb1pa","uN6r37hyVv","s93Ml8FmFH","zmLYDMmKGJ",
+"djsrvOz8yZ","In3NSsoy9t","9iGoTB3qem","55rfBjSjS3","CNHmvmz8gx","NAFuwCNHmv","QssNCpT8wu","RBhp0O3iyQ","IRh489eoRc","gjUTufmIK1",
+"8U2nUTwano","5nmWv8hJdt","FnPFBfcwDa","lweGyOHaBz","s93MlcQOnv","i7WMQsuY4x","HzZT8e6e4z","m4bxUCqqaD","8RCUAzqH0W","RpBQm7X3uy",
+"MK07YpAhR1","uvf7AoVQp6","NAFuwWMiS3","oGu6x16lHc","oQ87r2ZHdk","lsQGonlaBy","cQOnvdmoS7","o8UydAkKTk","fmIK18hJdt","brhlQQworu",
+"WreyPt59lR","7hyVvHRxd8","P6bcgsoy9t","M6qcGPb1pa","3weIFQbxXc","8FmFHnFqik","aDGtSCqqaD","16lHc9iGoT","FnPFB7X3uy","CIShGRBhp0",
+"9GXkXo8Uyd","pmeCd9rlg9","RmDcrru4UG","RsQUq8U2nU","okgRiiqv4k","QnJ1SUvlv4","lViBvfmIK1","lpF6W55rfB","OHaBzsx5Gl","QWxoTS2Dfu",
+"qaofNs93Ml","mz8gx2Yz7E","IRh485nmWv","POUYSvLsmS","xXTI4HP433","OUqFMcL0aE","lXFOBfFDrJ","fqypyulk41","h1zcHyToGW","580YDtaOXK",
+"ZzJHWJIqXi","BpYhVK4GS8","ECMvUjeskS","pAhR1MaJQs","iwzGkLewvM","FxX9q16lHc","ZuDtDLewvM","5IhmGVLTy6","dhSuHFLsph","s7MxkuN6r3",
+"guMb8Q6hMC","7fKYU5Drn0","IjTwPtvdkD","4dEz6In3NS","i7WMQFhtgl","fcwDaogLgc","GrDg7tAOsr","BCxeCLbRTH","1LB1LkZANm","618DiRBhp0",
+"Cp3mZlCMxy","GWqqX3weIF","yvOMIHzZT8","FcWrWAkKTk","pWiOslViBv","8cVD3brhlQ","yluBxoGu6x","2ZHdkqUJMd","h1zcHZJTXH","5Mg9rdpe1v",
+"JJs5mLbRTH","9XyT9ciuWz","HzZT8MezSW","6AFT0RACuj","0MR5XCp3mZ","VLTy6FFDui","WPmlxDcpWB","soy9ttjQxs","jS1ajlkMUA","HRxd81v5hH",
+"K20wKMmsIo","9iGoTNxx9V","0MR5XFVMxo","HP433Q6hMC","atef2blLA9","DcpWBCNHmv","9rlg9DQimp","lpF6WhYBCK","Waim6B3qem","l83Ud7X3uy",
+"MmsIohYBCK","8FmFHL7cGc","MK07YGrDg7","kZANmVjCZq","0PktIZUnqt","6AFT0jfREu","FVMxookgRi","aL6AJWreyP","zz4ZUv1Hln","In3NSFnPFB",
+"MezSWRzaZA","pvgjSlj07Q","lXFOBiKqhr","0MR5XqQxHP","BFkb8M3zXL","he9IAn1pmO","v2eC3atef2","1LB1LXyPZN","Zv7z0rz7Ut","CqqaDBpYhV",
+"O3iyQDz1R3","nnP8oCp3mZ","ECMvUn1pmO","Yh1hFnnP8o","uvf7AlkMUA","Cfgr3ZzJHW","ksJbyYOfrY","YjB9tAkKTk","Q6hMCjS1aj","pv0i7JKWYR",
+"nlaByhE1Ql","FGzgpCK5W7","HfyNQFPfSE","QssNC0ao3l","fcJOygIYvE","tuDySsx5Gl","NcICAQssNC","mX2GE9GXkX","5drc6i3pyd","S2DfuFVMxo",
+"Ta8f6faHir","rz7Uthi5X7","ciuWzVerEA","6q6L9uupzk","uupzki3pyd","HzZT8sqVrf","55rfB8TxD7","o8UyduTacx","n1pmOa00b5","MojnPlm0pD",
+"QChxsFcWrW","I7p2a5IhmG","LDk6fIn3NS","lH1ktMm8si","Cfgr3aFFss","9XyT9NcICA","BFkb8WaWsv","CIShG0h1b1","wDajXnnP8o","0h1b1uoStw",
+"W7cTsU3yw5","gdQsS4QMc9","JIqXilsQGo","wiHrZyEfy9","HfyNQ2ZHdk","NcICAs93Ml","K20wKs93Ml","m4bxUuoStw","uQIcz6q6L9","HfyNQ3weIF",
+"gIYvEJKWYR","zbIYYuJScX","VerEAfFDrJ","azIWpYf2Ec","POUYSEdBKc","WmadA16lHc","rKDLJKASQ8","0ao3ltvdkD","MezSWSWfou","jiVBPqUJMd",
+"ksJbyiqv4k","AXpwEpWiOs","iB08ll83Ud","fmIK1dmoS7","BGaQYDQimp","Ss0ZuL7cGc","Ul4a1LewvM","Yw2oU7Ow5C","gdQsSQChxs","RkQkeQ6hMC",
+"SbRYyIKxdL","Nxx9V9y4lw","U3yw5P6bcg","tAOsrVprf2","WaWsvqaofN","6q6L9lj07Q","Uvlv4lXFOB","rhl0JdQ586","Oz8yZUl4a1","HlUbFFhtgl",
+"5Mg9rFjHXR","YjB9tZhwG1","4QMc9uJScX","jfREuvkCHH","RmDcrO3iyQ","In3NSrhl0J","cQOnvb29RJ","D6rBy14FLR","ogLgc6AFT0","MaJQsEOE1o",
+"OUYuFcL0aE","faHir7lUXZ","IRh48K20wK","7X3uyKZamH","0PktI2hEEU","GXdoHYf2Ec","lCMxysqVrf","jfREuSmGzv","uTacxCqqaD","NAFuwQChxs",
+"lkMUAMK07Y","O3iyQJkzUn","WreyPdjsrv","9XyT9VjCZq","0KyfsWMiS3","t59lRgtCA5","C2IrcpFrrl","FLsphpmeCd","IBe8kd7vjM","MaJQspAhR1",
+"zqH0WThjNn","HRxd8CxVEf","K20wK7fKYU","fqypyOUqFM","RBhp0FGzgp","guMb8azIWp","v8yFNn8pJ9","pvgjSKASQ8","Uvlv4JRJQB","QClRLCqqaD",
+"gf8rItaOXK","MezSW1v5hH","n8pJ98RCUA","8hJdtReKEW","Mkgy8618Di","d7vjMqaofN","rKDLJ1v5hH","7Ow5CoGu6x","9rlg9AkKTk","YjB9tuLtKs",
+"zY1GY29QAz","iwzGk5Namm","48cHLwiHrZ","VBjhzt59lR","XyPZNPOUYS","MmsIo29QAz","s4786yvOMI","F6PT2Q6hMC","2DREsxReec","m4bxUuLtKs",
+"bZLvSW3VFH","nnP8orz7Ut","QYxC0NcICA","ECMvUKr8ys","AkKTkuPX7G","LbRTHs93Ml","soy9tPYBf4","GWqqXzHF1q","3weIFjS1aj","t98iWvOqCE",
+"KASQ8uN6r3","KsjRKcL0aE","dpe1vI7p2a","i7WMQaL6AJ","X6Pin9iGoT","lkMUApvgjS","4W0Tln1pmO","HfyNQjSjS3","pAhR1C2Irc","8hJdtAXpwE",
+"AXpwEY1mC0","uPX7GlH1kt","WmadAdQ586","J2mQiIBe8k","KsjRKpvgjS","gtCA5yEfy9","jeskSxReec","7fKYUMkgy8","Pb1papAhR1","xciqpZuDtD",
+"yEfy9CdyBV","WMiS3uQIcz","ThjNnOz8yZ","MmsIoeuZA5","No0QbuZPqg","yvOMI8RCUA","O3iyQRxrsm","HP433rhl0J","sx5GlHlUbF","7X3uysqVrf",
+"iqv4k8hJdt","yEfy9EoToP","MojnPKr8ys","i7WMQ7fKYU","uZPqgzHF1q","UlU3MDz1R3","Yw2oUpvgjS","lXFOBwDajX","v1Hlnni2v1","2DREsWMiS3",
+"FwEJzRxrsm","Z4I1vThjNn","7X3uyksJby","fLNg8XyPZN","tvdkDJKWYR","he9IA48cHL","ksJbyOz8yZ","16lHc7X3uy","lweGy1v5hH","5VZjSblLA9",
+"ZhwG15Drn0","FxX9qEOE1o","0h1b1KZamH","48cHLpvgjS","CxVEf07n1c","bgJAzQ6hMC","vOqCEtlILt","FjHXRru4UG","ThjNnokgRi","2ZHdkS77LH",
+"SjskQhYBCK","DQimp5Drn0","No0QbdQ586","FjHXRfmIK1","C2IrcfFDrJ","WreyPlweGy","zY1GYiKqhr","FNYIMOHaBz","1j5L8uLtKs","uN6r31LB1L",
+"G1RhSQYxC0","pv0i7Z4I1v","1j5L8uZPqg","3otm6Q6hMC","t98iWWaim6","3otm6fmIK1","v8yFNk85Ae","uZPqgMK07Y","lkMUAyEfy9","2ZHdkgdQsS",
+"DcpWBmX2GE","mz8gxgdQsS","BbwgAe6e4z","lm0pDM6qcG","d85a9FwEJz","bZLvSZhwG1","pAhR14W0Tl","4dEz6uPX7G","dQ586IRh48","QClRLBFkb8",
+"lj07QhYBCK","zFgtB1v5hH","x3LDeStlDJ","tl72WAOgEe","ZuDtDciuWz","iKqhrjtn0X","XflUqqaofN","8cVD3UlU3M","SjskQRBhp0","VNCPduQIcz",
+"ydG8U7X3uy","Yw2oUHRxd8","MK07YzqH0W","kB5nP8xEKz","W3VFHYh1hF","CxVEfqaofN","xReeck85Ae","uJScXTCgPp","uAWypJkzUn","zqH0WXyPZN",
+"v2eC3pWiOs","D6rByuPX7G","n8pJ9TCgPp","uZPqgFFDui","dmoS7580YD","55rfBP6bcg","lpF6W2Yz7E","FhtglZJTXH","5VZjSBFkb8","Q6hMCpvgjS",
+"RBhp0TXQ0Z","suY4x6q6L9","yluBxv2eC3","euZA5BCxeC","mz8gxX6Pin","uoStwWaWsv","5drc6rz7Ut","9iGoT07n1c","NAFuwBCxeC","DcpWBHlUbF",
+"AkKTkx3LDe","SjskQYw2oU","uQIcz7lUXZ","i7WMQHP433","8RCUAGrDg7","dhSuHt59lR","HRxd85nmWv","cmXIX8xEKz","gIYvE9GXkX","HP4338cVD3",
+"pAhR1azIWp","EoToP3weIF","HlUbFh1zcH","lCMxy2ZHdk","7ku1pfcJOy","M6qcGuJScX","zY1GY2DREs","fFDrJDz1R3","prNT6oGu6x","hYBCKDLhzM",
+"l83UdZUnqt","No0QbFjHXR","s93MlM6qcG","rhl0JlViBv","W7cTs7ku1p","SmGzvv1Hln","Chuy3bZLvS","o8Uyd4QMc9","aFFssX6Pin","O3iyQs93Ml",
+"KASQ8piJSk","9GXkXzqH0W","JIqXi2DREs","BpYhV8RCUA","y94nwblLA9","JXljW7ku1p","7fsYM5iGN5","pFrrlfLNg8","AmdQdJRJQB","CIShGMmsIo",
+"e6e4zOUYuF","iKqhroGu6x","tlILtjiVBP","ksJby64s8N","1v5hHAXpwE","Uvlv4mz8gx","WreyP0Wr5y","RBhp0tvdkD","vOqCEM3zXL","KASQ87ku1p",
+"hE1Ql8TxD7","zY1GYSs0Zu","CxVEfGv3Fq","580YD07n1c","K20wK8U2nU","Cfgr3gdQsS","pWiOsYjB9t","EdBKcJXljW","CNHmv0h1b1","8FmFHjS1aj",
+"2Yz7ES77LH","mz8gxVNCPd","OUqFM9XyT9","RmDcrFjHXR","nFqikazIWp","pAhR1hE1Ql","t98iWuAWyp","pv0i7OUYuF","pWiOszqH0W","45cIHAkKTk",
+"Zv7z0MmKGJ","euZA5Dz1R3","EoToPeuZA5","YjB9t0YAGH","OxWIHXyPZN","Kr8ysF6PT2","hYBCKaez9y","9GXkXzFgtB","tjQxsjfREu","pmeCdNAFuw",
+"nnP8otuDyS","uTacx4dEz6","KASQ8dmoS7","7fsYMFVMxo","FwEJzsqVrf","aFFssiqv4k","MaJQso8Uyd","IBe8katef2","CxVEfciuWz","Yh1hF14FLR",
+"I7p2apvgjS","rKDLJvLsmS","FFDui6AFT0","sqVrfulk41","POUYSJ2mQi","No0QbNcICA","ThjNndQ586","d7vjMuQIcz","W3VFHKZamH","5Drn0LewvM",
+"IKxdLoVQp6","KsjRKAXpwE","9GXkXuLtKs","VjCZqfqypy","VjCZqK4GS8","B3qem3otm6","7fsYMpiJSk","zmLYDZuDtD","x3LDeCNHmv","CNHmv8TxD7",
+"YOfrYaDGtS","OHaBzNAFuw","fqypytuDyS","5IhmGpFrrl","gjUTu2Yz7E","gjUTu0h1b1","dpe1vFLsph","Ul4a1FPfSE","AXpwERBhp0","OUYuFuTacx",
+"v1HlnXyPZN","8hJdtzY1GY","VerEApAhR1","piJSk580YD","s4786B3qem","MojnPSmGzv","QWxoTy94nw","iB08logLgc","5ZaEzbrhlQ","brhlQHRxd8",
+"48cHLZhwG1","Mkgy8NAFuw","FFDuiJXljW","jiVBPjiVBP","Y1mC0fmIK1","piJSkQChxs","29QAz9y4lw","fcwDaqQxHP","h1zcHgf8rI","hE1Qlv8yFN",
+"Ul4a14QMc9","SmGzvy94nw","uN6r35nmWv","CIShGbZLvS","WreyPPYBf4","iB08lFnPFB","QYxC0cmXIX","x3LDeZJTXH","SWfouzHF1q","Gv3FqKASQ8",
+"StlDJZ4I1v","Waim6atef2","rz7Ut2hEEU","IBe8kJ2mQi","x3LDesx5Gl","qQxHPM3zXL","lH1ktO3iyQ","Zv7z0NOHsz","8FmFHiB08l","CxVEfpmeCd",
+"IjTwPPb1pa","ZhwG1No0Qb","KsjRK7lUXZ","AIYUumz8gx","lj07Q2DREs","RpBQmUvlv4","IKxdLkB5nP","AmdQdfFDrJ","VjCZqRkQke","QChxsYOfrY",
+"soy9tECMvU","4QMc9IRh48","fcJOyRmDcr","DLhzMiwzGk","s7MxkMaJQs","0YAGHBCxeC","gIYvEjiVBP","Q6hMCfmIK1","JXljWTXQ0Z","Q6LixOz8yZ",
+"5nmWv2Yz7E","e6e4zDLhzM","nlaByAkKTk","hSSvQuvf7A","hSSvQ8xEKz","Yh1hFiqv4k","VLTy6k85Ae","SmGzvv8yFN","8U2nUmX2GE","FFDuizQt6Q",
+"VNCPdZ4I1v","pT8wuulk41","FNYIM6q6L9","M3zXLNcICA","9eoRcRpBQm","UlU3Mk85Ae","VjCZqyofH3","jzUqR0ao3l","e6e4zGrDg7","KASQ8QnJ1S",
+"KASQ8VBjhz","rKDLJZv7z0","M3zXLMmsIo","VLTy6SbRYy","2Yz7E64s8N","pWiOsQ6hMC","oVQp6gdQsS","UlU3MHP433","bZLvSwiHrZ","JkzUnSjskQ",
+"Uvlv4fLNg8","oGu6xtlILt","uZPqgRxrsm","iKqhrvOqCE","wDajXzHF1q","oQ87r2Nslm","XyPZNXflUq","2DREspv0i7","oQ87r0YAGH","qaofNfcJOy",
+"AkKTksx5Gl","CxVEf3weIF","uoStwTCgPp","aL6AJzQt6Q","aDGtSlsQGo","OUYuFPb1pa","brhlQ4QMc9","lpF6Wb29RJ","DQimpRkQke","uN6r3EoToP",
+"wDajXCNHmv","qQxHPXyPZN","jzUqRzHF1q","zY1GYgf8rI","QChxstaOXK","Z4I1vSWfou","QbxXc1v5hH","YjB9tUvlv4","FLsphBFkb8","NhXduP6bcg",
+"TwanoRsQUq","9XyT9JIqXi","45cIHJKWYR","0Kyfs0YAGH","GXdoH07n1c","Cfgr3jeskS","8U2nUd85a9","8cVD3S77LH","In3NSJJs5m","K20wKJkzUn",
+"gtCA5NAFuw","Yw2oUMezSW","zmLYDuPX7G","0PktIZzJHW","7lUXZWPmlx","kB5nP0Wr5y","1LB1LAmdQd","5IhmGlViBv","uLtKsv1Hln","qUJMd2TRI7",
+"I7p2a6q6L9","QClRLjzUqR","AkKTkzHF1q","CxVEf6AFT0","CNHmvcQOnv","x3LDeJIqXi","yofH3MGlTF","Yw2oUQYxC0","S2DfuZ4I1v","cmXIXHzZT8",
+"zqH0WlpF6W","55rfB6q6L9","8RCUAAOgEe","AIYUuY1mC0","x3LDei3pyd","uJScXFLsph","NcICABCxeC","ZJTXHQworu","FwEJzaL6AJ","0BmCyS77LH",
+"Q6hMC580YD","1v5hHv8yFN","tlILtxXTI4","8FmFHEoToP","Ta8f62Nslm","vOqCEt98iW","prNT6BCxeC","0Kyfs5IhmG","0ao3lOUqFM","VNCPd5VZjS",
+"SWfouMojnP","ZzJHWjiVBP","gIYvEn8pJ9","gIYvEDLhzM","D6rByaFFss","HRxd8fcJOy","0MR5XzQt6Q","5ZaEzdmoS7","Oz8yZWreyP","FnPFBD6rBy",
+"qQxHPm4bxU","yEfy9FPfSE","nFqikprNT6","x3LDeUvlv4","MGlTFyvOMI","dhSuHe6e4z","W7cTsTCgPp","4dEz6t59lR","IjTwPblLA9","XflUqbZLvS",
+"uQIczKr8ys","a00b5ZhwG1","4W0Tle6e4z","JJs5mgIYvE","gIYvEiKqhr","8cVD3uPX7G","WaWsv1j5L8","GWqqXuupzk","MezSWv2eC3","JkzUne6e4z",
+"zHF1qMmKGJ","QbxXcmz8gx","zQt6QjS1aj","bZLvSGSQwj","BCxeCnnP8o","gtCA5HzZT8","fFDrJ07n1c","hSSvQ7lUXZ","29QAz3otm6","Y1mC0uupzk",
+"QChxshE1Ql","zQt6QNAFuw","B3qemCdyBV","24ARFB3qem","atef2iqv4k","v8yFNDz1R3","Cfgr3In3NS","Vprf2pT8wu","i3pydRACuj","fLNg8uZPqg",
+"Twano8FmFH","ru4UGuvf7A","gf8rIHRxd8","yToGWKsjRK","BFkb8uLtKs","Ta8f6LDk6f","No0QbksJby","k85Ae0ao3l","t59lRIKxdL","14FLRFhtgl",
+"FjHXRFNYIM","G1RhShE1Ql","WaWsvl83Ud","BCxeCk85Ae","M6qcGdjsrv","ogLgcCdyBV","oGu6x7X3uy","X6PinRxrsm","FVMxojiVBP","JKWYRFnPFB",
+"fmIK19GXkX","lm0pDhe9IA","uN6r3ydG8U","Cfgr3oGu6x","AXpwEWreyP","CIShGSmGzv","aL6AJuupzk","iB08lo8Uyd","9y4lw5VZjS","NcICARzaZA",
+"Vprf2M6qcG","MmsIoaez9y","GSQwjogLgc","uoStwulk41","kZANmAIYUu","0PktICdyBV","xReec8U2nU","IRh48lm0pD","VNCPdBFkb8","IjTwPlkMUA",
+"yToGW55rfB","i7WMQh1zcH","mX2GEjtn0X","OUYuF0Wr5y","fqypyTa8f6","WMiS3OHaBz","o8Uydl83Ud","prNT6hUTw7","FPfSE8FmFH","dmoS7FNYIM",
+"WDVWJhe9IA","Vprf2jS1aj","SWfouFGzgp","atef2ydG8U","GXdoHfmIK1","lweGypT8wu","guMb82Nslm","y94nw2DREs","4dEz67ku1p","FNYIMzmLYD",
+"s4786Cfgr3","uN6r3MK07Y","BCxeCO3iyQ","MK07Yv1Hln","9eoRcHfyNQ","m4bxUEdBKc","vOqCEzHF1q","jSjS33weIF","RkQkeUlU3M","GWqqXCK5W7",
+"Q6hMCrhl0J","faHirLDk6f","2DREsgf8rI","zmLYDpWiOs","NOHszGv3Fq","Q6hMCrz7Ut","FcWrWVjCZq","BGaQYSWfou","yofH3NOHsz","QnJ1SokgRi",
+"hi5X7pT8wu","QYxC07fsYM","mz8gxhi5X7","M3zXLMm8si","SmGzvfqypy","Q6LixbrhlQ","kB5nPciuWz","5drc6JkzUn","5IhmGHP433","RBhp03otm6",
+"cShY20ao3l","J2mQiReKEW","UlU3Mo8Uyd","ZhwG11LB1L","tvdkDFVMxo","i7WMQ0ao3l","Cp3mZoQ87r","soy9tlH1kt","e6e4zAmdQd","IRh4855rfB",
+"yofH39GXkX","Pb1paB3qem","1j5L8hSSvQ","7ku1pS77LH","FGzgpJkzUn","RzaZAYw2oU","K4GS8Ta8f6","ix74rQClRL","XflUqs4786","M3zXLfmIK1",
+"29QAz0Kyfs","XflUq0PktI","AgJHQRzaZA","ogLgczz4ZU","EdBKcPOUYS","StlDJlViBv","S2DfuOUYuF","Ul4a1JIqXi","VIlwPNxx9V","XflUqcmXIX",
+"45cIHChuy3","VNCPdyToGW","fmIK1OxWIH","KsjRKzHF1q","BpYhVpiJSk","qQxHPKZamH","No0QbQssNC","dQ586IBe8k","5nmWv9XyT9","CdyBVfcwDa",
+"XflUqb29RJ","yofH37Ow5C","8cVD3Yw2oU","GSQwjazIWp","jzUqRGrDg7","24ARFReKEW","uoStwStlDJ","OHaBzB3qem","lViBvMezSW","y94nwcL0aE",
+"zY1GYTwano","dQ586aL6AJ","m4bxU2TRI7","X6Pin5VZjS","5nmWvAgJHQ","L7cGcVjCZq","QbxXciKqhr","fcJOye6e4z","b29RJd85a9","IKxdLwiHrZ",
+"QbxXcYh1hF","RzaZAaFFss","ThjNn3weIF","jSjS3ni2v1","UmaEv2TRI7","faHirCK5W7","rz7Ut0PktI","Yf2EcVBjhz","soy9tTa8f6","tjQxssuY4x",
+"No0QbAmdQd","bZLvSni2v1","CK5W7dQ586","MaJQs16lHc","jfREuk85Ae","nFqikRmDcr","6q6L98U2nU","RACujyvOMI","4dEz6W3VFH","Gv3FqCK5W7",
+"LewvMv2eC3","TXQ0ZEOE1o","MojnPaFFss","55rfB8cVD3","VBjhztjQxs","W3VFHnFqik","YjB9t5iGN5","1j5L816lHc","OxWIHs93Ml","jS1ajSWfou",
+"rz7UtGv3Fq","VNCPdtAOsr","jS1ajRxrsm","Oz8yZW3VFH","v2eC3WreyP","FhtgluPX7G","n1pmOvLsmS","8xEKzyofH3","QClRLFNYIM","lkMUAvOqCE",
+"gf8rIn8pJ9","BpYhVWDVWJ","RACujhYBCK","IjTwPFPfSE","VIlwPIBe8k","jS1aj1v5hH","zHF1qsqVrf","AmdQd2DREs","ECMvUCxVEf","LewvMFGzgp",
+"AIYUuFLsph","CdyBVbgJAz","taOXKBpYhV","MaJQsCp3mZ","9y4lwG1RhS","ni2v1sqVrf","5iGN5jSjS3","X6Pinjtn0X","7fsYMX6Pin","hUTw7qQxHP",
+"VLTy6TXQ0Z","jeskSsoy9t","pWiOsCfgr3","9GXkX8RCUA","zbIYY5Mg9r","TCgPptvdkD","48cHLkB5nP","guMb8AOgEe","QWxoT1v5hH","nnP8osoy9t",
+"lm0pD8xEKz","MGlTF9rlg9","VNCPdyofH3","v2eC3wiHrZ","0BmCym4bxU","M3zXL4dEz6","7ku1pFwEJz","G1RhSS2Dfu","jfREuW3VFH","vOqCEYw2oU",
+"FcWrW5IhmG","IKxdLBpYhV","soy9t618Di","FGzgpru4UG","k85AeGXdoH","bZLvSzY1GY","cShY2xXTI4","AXpwEB3qem","BpYhVk85Ae","tAOsrEoToP",
+"t98iWkZANm","XflUqgtCA5","FjHXRnFqik","iKqhruLtKs","RzaZAhSSvQ","okgRii3pyd","wiHrZWDVWJ","RmDcrlCMxy","faHir8TxD7","Kr8ystuDyS",
+"CdyBVogLgc","MmsIoUvlv4","MK07Y8RCUA","ReKEWazIWp","5drc655rfB","J2mQirhl0J","1LB1LRpBQm","6AFT0ThjNn","POUYSzY1GY","atef2OHaBz",
+"cShY2P6bcg","zHF1q0Kyfs","Mkgy8lweGy","ZhwG17Ow5C","J2mQi7X3uy","FxX9qCxVEf","QWxoTDcpWB","hE1QlC2Irc","he9IAzqH0W","v8yFNlCMxy",
+"IRh48rz7Ut","iB08lwiHrZ","Z4I1vfcwDa","Q6hMCCqqaD","FxX9qhYBCK","WaWsvgjUTu","QssNCulk41","rhl0J6q6L9","FVMxouupzk","jeskSzmLYD",
+"FPfSEgdQsS","cShY2GrDg7","W7cTsVIlwP","JkzUndjsrv","DQimpaL6AJ","FwEJzYOfrY","iB08lQClRL","5Drn0v2eC3","HRxd8BCxeC","SbRYywDajX",
+"b29RJXyPZN","cmXIXrhl0J","nnP8oogLgc","580YDQnJ1S","FLsphlweGy","F6PT2b29RJ","nlaByFFDui","hE1Ql4QMc9","dmoS7J2mQi","Dz1R3uQIcz",
+"d85a9ksJby","0MR5X1j5L8","pvgjSWDVWJ","MK07YiKqhr","NcICAuLtKs","XflUqlj07Q","fcwDaQYxC0","FVMxocQOnv","FVMxoYjB9t","lCMxyyluBx",
+"ZJTXHMmKGJ","ksJbyCqqaD","5drc6D6rBy","ciuWzfcJOy","zFgtBvOqCE","fcJOylpF6W","fmIK1WaWsv","FxX9quLtKs","618DicQOnv","9y4lwRmDcr",
+"9y4lwgjUTu","LewvMzbIYY","Yf2Ec3otm6","MGlTFv1Hln","RpBQmWreyP","nlaBylCMxy","FNYIMUlU3M","nlaByiwzGk","dQ586fcwDa","s4786Yh1hF",
+"MezSWrz7Ut","TwanoWmadA","5Mg9rs7Mxk","zQt6Q9iGoT","QssNCsqVrf","nFqikfcJOy","PYBf4JkzUn","atef2FjHXR","LDk6fgIYvE","OUYuFKsjRK",
+"OUYuFEOE1o","d85a9s93Ml","QYxC0fmIK1","vLsmSOxWIH","7lUXZQ6Lix","jfREu0ao3l","RpBQmZhwG1","ThjNnazIWp","dQ586LbRTH","4QMc97lUXZ",
+"Dz1R3pmeCd","i3pydVprf2","2DREsrz7Ut","uoStws7Mxk","Twanot59lR","rKDLJRkQke","jS1ajFFDui","gf8rI7lUXZ","wDajX1j5L8","l83UdyEfy9",
+"2ZHdkrz7Ut","14FLRXyPZN","gjUTu0MR5X","55rfBDz1R3","FNYIMHlUbF","Kr8ysGWqqX","9XyT9PYBf4","zbIYYk85Ae","D6rByeuZA5","9iGoTWreyP",
+"0YAGHAgJHQ","s47867X3uy","7hyVvRxrsm","JkzUnX6Pin","ZuDtDVNCPd","WDVWJCK5W7","0YAGHBGaQY","TCgPpDG4sT","CIShGpv0i7","jzUqR8U2nU",
+"CNHmvNAFuw","Pb1pa7ku1p","zFgtBzQt6Q","faHirsuY4x","zQt6QUmaEv","nFqikMK07Y","zmLYDUl4a1","lViBvrz7Ut","5Mg9r5Namm","HRxd8G1RhS",
+"QYxC02DREs","pFrrl1j5L8","7fsYMuPX7G","uLtKsWaim6","Mkgy8RkQke","QssNCbZLvS","FNYIMRxrsm","FjHXRWmadA","hSSvQlXFOB","HlUbFlXFOB",
+"5VZjSStlDJ","uvf7AYOfrY","55rfBJ2mQi","jzUqRRACuj","S2DfuDG4sT","7Ow5CSbRYy","5ZaEzmX2GE","dmoS714FLR","7fsYMtl72W","aFFssReKEW",
+"uAWypyluBx","piJSklsQGo","zbIYY5Drn0","uPX7Gb29RJ","FNYIMWreyP","UlU3M9rlg9","jfREupWiOs","dmoS7FjHXR","fmIK10BmCy","CxVEf0Kyfs",
+"2DREsM3zXL","uvf7AiKqhr","uvf7A7fKYU","ZUnqtnnP8o","Cp3mZ7lUXZ","4dEz6RpBQm","nlaByXyPZN","O3iyQU3yw5","soy9tZzJHW","t98iW5Mg9r",
+"l83Ud5Namm","Cp3mZuJScX","tvdkDJRJQB","atef2hUTw7","FGzgp29QAz","iqv4kdhSuH","EOE1o0MR5X","SbRYyprNT6","5VZjSSbRYy","I7p2aiwzGk",
+"hUTw7aFFss","jzUqRIn3NS","1j5L8uupzk","vOqCEqQxHP","uLtKsd7vjM","zqH0WJKWYR","cQOnv0PktI","ZJTXHlpF6W","IjTwPO3iyQ","ECMvUjtn0X",
+"7lUXZK4GS8","Mm8si5VZjS","7fKYUzqH0W","SbRYyS77LH","QbxXcuN6r3","5IhmGtAOsr","14FLRix74r","yofH3AgJHQ","O3iyQMmsIo","tvdkDQChxs",
+"RmDcrCqqaD","FhtglZUnqt","HRxd8YjB9t","7X3uyciuWz","aez9yBGaQY","Ul4a1guMb8","fcwDaS77LH","2Yz7EvLsmS","azIWpzmLYD","dpe1v7ku1p",
+"jtn0XoGu6x","h1zcHhYBCK","uoStwqaofN","In3NS0BmCy","dmoS7JIqXi","TXQ0Zrz7Ut","hUTw7MaJQs","KsjRKHRxd8","8RCUAzz4ZU","tlILtsoy9t",
+"64s8NWPmlx","618DifcJOy","HfyNQCNHmv","XflUqGXdoH","iKqhrhE1Ql","Nxx9VBbwgA","HRxd8guMb8","Yw2oUt98iW","a00b5S77LH","yluBxHfyNQ",
+"C2IrcgtCA5","IBe8kLewvM","NOHszTa8f6","P6bcgHlUbF","JKWYRW3VFH","VNCPdvLsmS","QworuNxx9V","NhXduQ6Lix","dhSuHJXljW","SmGzv0MR5X",
+"7fsYMTa8f6","WDVWJNxx9V","HfyNQS77LH","gjUTuStlDJ","TCgPpTCgPp","580YDuTacx","8RCUA5Mg9r","7Ow5CBFkb8","Gv3FqzY1GY","P6bcgatef2",
+"fcJOyfmIK1","1LB1LOUqFM","DLhzMFVMxo","DG4sTAmdQd","e6e4zJJs5m","wiHrZJJs5m","d7vjMZ4I1v","NcICA7ku1p","Q6hMCoQ87r","Cp3mZzz4ZU",
+"0ao3ljS1aj","AgJHQlm0pD","iKqhrtuDyS","JkzUnReKEW","8FmFHS77LH","hE1QlVerEA","LewvMFLsph","NcICAQ6hMC","cL0aEnnP8o","8FmFHoQ87r",
+"zQt6QuPX7G","TwanodmoS7","Cfgr3I7p2a","FwEJzReKEW","HzZT8kB5nP","5iGN5JKWYR","qaofNpv0i7","OUqFMfLNg8","MezSWYOfrY","OxWIHQnJ1S",
+"9GXkXFPfSE","zqH0WZJTXH","Q6LixlsQGo","AIYUupvgjS","Zv7z0LbRTH","lH1kt0YAGH","a00b5i7WMQ","BFkb8ThjNn","Yh1hFqaofN","NcICARkQke",
+"45cIHeuZA5","VNCPdxReec","Cp3mZWMiS3","tvdkDqQxHP","gIYvEM3zXL","HfyNQCxVEf","QworuhUTw7","LDk6fkZANm","BbwgAZ4I1v","GSQwjnnP8o",
+"VNCPdVNCPd","oGu6xKr8ys","QClRLF6PT2","5ZaEzjiVBP","lm0pDy94nw","0h1b18hJdt","StlDJn8pJ9","JKWYR5iGN5","YOfrY16lHc","IjTwPfLNg8",
+"ni2v1Fhtgl","NOHszYw2oU","vOqCEt59lR","RACujI7p2a","ulk415nmWv","MmKGJhSSvQ","GWqqXRkQke","yofH3lsQGo","2Yz7E0MR5X","s7MxkAXpwE",
+"F6PT2WreyP","0MR5XQnJ1S","v8yFNn1pmO","IRh489GXkX","J2mQizHF1q","AXpwEGrDg7","G1RhSpWiOs","rKDLJDLhzM","v1HlnMojnP","0PktIpWiOs",
+"YjB9tX6Pin","djsrvYh1hF","RBhp0POUYS","JKWYRtjQxs","MojnPs4786","Cfgr3StlDJ","gIYvElCMxy","OxWIHWMiS3","FFDuiwDajX","WMiS3mz8gx",
+"Uvlv4Ss0Zu","xReec7hyVv","QnJ1Slm0pD","nnP8o2DREs","CxVEfPOUYS","n8pJ9UmaEv","oGu6xoGu6x","6q6L9IBe8k","FnPFBlViBv","ksJbylm0pD",
+"WMiS39GXkX","24ARFSjskQ","zmLYDQYxC0","5IhmGGSQwj","hUTw77fKYU","1LB1LW3VFH","CdyBVi3pyd","pmeCdSs0Zu","B3qempv0i7","vOqCEAgJHQ",
+"WaWsvRkQke","POUYSJkzUn","zz4ZUVNCPd","PYBf4CdyBV","9eoRcs93Ml","k85AefcJOy","M3zXL5Namm","QWxoTQ6Lix","hYBCKDG4sT","uQIczv2eC3",
+"s4786I7p2a","8hJdtUlU3M","7lUXZdmoS7","JJs5m7hyVv","ZzJHWZhwG1","UlU3MVBjhz","8FmFHv1Hln","i3pydK20wK","Ta8f6Uvlv4","xXTI4vLsmS",
+"WmadADG4sT","5nmWvTXQ0Z","FcWrW45cIH","aDGtSIKxdL","Twanon1pmO","0Wr5ynlaBy","aFFssyofH3","OxWIHatef2","azIWpbrhlQ","XyPZNCqqaD",
+"48cHLWMiS3","Waim6PYBf4","GrDg7GXdoH","pWiOsQ6Lix","RACujdQ586","xciqpb29RJ","Z4I1vyofH3","k85AeQChxs","VjCZqvOqCE","FVMxoY1mC0",
+"rhl0JPOUYS","BCxeCVIlwP","qUJMd7Ow5C","QClRL5ZaEz","6q6L9FwEJz","ciuWza00b5","Mm8siFwEJz","QssNCSs0Zu","NAFuwSjskQ","0MR5XSmGzv",
+"RzaZAciuWz","QnJ1S2Nslm","FnPFBOz8yZ","soy9t5nmWv","prNT6atef2","SmGzv5VZjS","7X3uycShY2","QworujeskS","B3qemlH1kt","tjQxslXFOB",
+"qaofNTXQ0Z","t98iWYw2oU","zz4ZUIjTwP","uJScXHzZT8","Fhtgl8FmFH","SjskQn8pJ9","0YAGHhi5X7","FjHXRfLNg8","WPmlxjiVBP","ZuDtD7hyVv",
+"uN6r3jS1aj","uvf7ACNHmv","DG4sTlpF6W","JXljW2Yz7E","RkQkebgJAz","pAhR1oQ87r","Ta8f6oGu6x","o8UydiwzGk","qQxHPtvdkD","a00b5CdyBV",
+"fcwDagIYvE","ix74r7fsYM","aFFss2Yz7E","zqH0WaL6AJ","Zv7z0FVMxo","QChxs0YAGH","hE1QlZhwG1","pFrrltuDyS","ciuWzFLsph","hSSvQK4GS8",
+"9XyT9MojnP","QbxXcmX2GE","d85a9he9IA","wDajXlXFOB","uAWypfcJOy","IBe8kMaJQs","LewvMW7cTs","RkQke580YD","iKqhrRACuj","Ul4a1OHaBz",
+"uTacx24ARF","5Nammi3pyd","GrDg7RmDcr","CxVEfSbRYy","IjTwPQ6Lix","5drc6d85a9","qaofNOxWIH","OxWIHJKWYR","7ku1p1j5L8","zHF1qoVQp6",
+"nnP8oB3qem","b29RJQbxXc","HP4338U2nU","pWiOsogLgc","uJScXcQOnv","Ul4a1S77LH","uvf7Am4bxU","QworuoVQp6","AXpwEHfyNQ","suY4xGWqqX",
+"8xEKzlj07Q","sx5GlpAhR1","hUTw7uTacx","n1pmOkB5nP","9rlg9ZUnqt","9iGoTdjsrv","AkKTktAOsr","ZUnqtzHF1q","Mkgy81j5L8","brhlQKsjRK",
+"FhtglMaJQs","FLsphi3pyd","QChxsni2v1","7hyVvIjTwP","RkQkeIBe8k","Ul4a1RBhp0","lweGygtCA5","SmGzvLewvM","LewvMAmdQd","9y4lwyvOMI",
+"okgRipAhR1","zQt6Q6AFT0","CNHmv8RCUA","tjQxsdQ586","l83UdTXQ0Z","W3VFHSs0Zu","64s8NFLsph","CNHmvJJs5m","QChxsCxVEf","pAhR1CIShG",
+"Pb1paQChxs","v2eC3Mm8si","HRxd8VLTy6","J2mQiGrDg7","O3iyQZuDtD","n1pmOokgRi","RmDcr7ku1p","yofH3aFFss","e6e4zHfyNQ","jSjS3fFDrJ",
+"KASQ8SbRYy","9GXkXWDVWJ","faHird85a9","RxrsmSWfou","djsrve6e4z","mz8gxFGzgp","OHaBzPYBf4","iKqhrKsjRK","YOfrYuAWyp","jzUqRCfgr3",
+"AmdQdv2eC3","24ARFBGaQY","uPX7GYOfrY","2DREslCMxy","C2IrcY1mC0","L7cGcS77LH","WreyPSbRYy","JRJQBs7Mxk","XflUqdmoS7","Ul4a1X6Pin",
+"HzZT8v1Hln","MmsIolViBv","guMb8pWiOs","AgJHQPb1pa","lm0pDlj07Q","9rlg9hYBCK","QWxoTGv3Fq","Yw2oUJkzUn","HRxd8kZANm","azIWpHlUbF",
+"64s8NzqH0W","RzaZAJKWYR","Ta8f6i3pyd","vkCHHOz8yZ","2NslmUl4a1","M6qcGDz1R3","soy9tTCgPp","fLNg8fLNg8","QClRLPYBf4","XflUqsuY4x",
+"QssNCsx5Gl","i7WMQd85a9","StlDJFGzgp","FVMxoSbRYy","9rlg9jSjS3","Mm8sii3pyd","7ku1p0Kyfs","ciuWzJkzUn","s93MlMmKGJ","atef2Vprf2",
+"uvf7AZJTXH","0Wr5y6q6L9","FNYIMIRh48","I7p2aaL6AJ","HRxd8taOXK","lViBvv8yFN","Cfgr35ZaEz","faHir5Mg9r","No0QbfcwDa","WDVWJ4W0Tl",
+"yToGW29QAz","RBhp00Kyfs","uoStws93Ml","mz8gxZzJHW","GXdoHulk41","QChxsuN6r3","jS1ajAkKTk","CdyBVThjNn","55rfBHfyNQ","9rlg9lweGy",
+"jeskSAgJHQ","1v5hHOz8yZ","0Wr5yJXljW","TwanoaDGtS","DcpWB7ku1p","pmeCdnFqik","580YD5ZaEz","3weIFFjHXR","M3zXLyofH3","2TRI7QChxs",
+"MojnPSWfou","48cHLEOE1o","cL0aERxrsm","nlaByFnPFB","dQ586UlU3M","ciuWz9rlg9","v8yFNv2eC3","d7vjMfFDrJ","NcICAVjCZq","aDGtSaDGtS",
+"K20wK5drc6","cL0aEHP433","HP433hYBCK","yEfy9K4GS8","29QAzni2v1","aez9yAmdQd","618Di0PktI","StlDJd7vjM","yEfy9guMb8","48cHLmX2GE",
+"8FmFH8U2nU","S2DfudhSuH","618DixReec","KZamHFFDui","W7cTsqaofN","vOqCETa8f6","2DREsWDVWJ","VIlwPCfgr3","RmDcrAXpwE","gf8rIAIYUu",
+"IBe8kjiVBP","ThjNnoVQp6","kZANmC2Irc","VjCZqGrDg7","djsrvCIShG","CdyBVdjsrv","GWqqXThjNn","JJs5m24ARF","5Mg9rbrhlQ","TwanopvgjS",
+"Mkgy8jeskS","xXTI4ni2v1","Vprf2Yf2Ec","BbwgAPOUYS","hSSvQhSSvQ","ZhwG1djsrv","UlU3Mt98iW","BpYhVyvOMI","dpe1vvkCHH","K20wKAgJHQ",
+"GrDg78FmFH","pAhR1VLTy6","lweGy0Kyfs","SWfouFwEJz","azIWpQbxXc","QWxoTxReec","jeskSY1mC0","fqypy1v5hH","cShY2d85a9","U3yw564s8N",
+"bZLvS7Ow5C","uQIczSjskQ","i7WMQRkQke","VLTy6K20wK","wiHrZG1RhS","h1zcH0Kyfs","AgJHQsqVrf","x3LDejiVBP","zFgtBMGlTF","Gv3Fqru4UG",
+"D6rByaez9y","zFgtBRBhp0","QClRLmz8gx","In3NSYf2Ec","lCMxyMGlTF","Pb1paGWqqX","hi5X7cmXIX","Zv7z0BGaQY","xciqpTXQ0Z","7ku1pZuDtD",
+"qaofNatef2","HRxd8Kr8ys","iB08lix74r","cQOnvRmDcr","tjQxsJXljW","tl72WCNHmv","IBe8kd85a9","taOXKsoy9t","pWiOsIRh48","4dEz6faHir",
+"kZANmSjskQ","cL0aEHfyNQ","uoStwYw2oU","AIYUulXFOB","W7cTsFhtgl","lViBvO3iyQ","ReKEW9eoRc","jfREuzqH0W","8hJdtJKWYR","5Drn0IRh48",
+"tlILtUmaEv","2ZHdkSjskQ","hUTw7OUqFM","Z4I1vhi5X7","9XyT9ZzJHW","5iGN51LB1L","Ul4a1lm0pD","nFqikMm8si","Mm8siZJTXH","pmeCdlweGy",
+"zmLYDOUqFM","7fsYMgtCA5","LDk6fx3LDe","LewvMhYBCK","ZUnqtwiHrZ","zz4ZUOUYuF","FhtglB3qem","oQ87r3weIF","ciuWzMojnP","3weIFs7Mxk",
+"RBhp0RzaZA","dQ586W3VFH","GrDg7KsjRK","5Mg9rn1pmO","uAWyp45cIH","IBe8kNOHsz","QworuTa8f6","hE1QlNo0Qb","7fKYU4dEz6","C2IrcHlUbF",
+"pT8wuVNCPd","vLsmStaOXK","0Wr5yNOHsz","pvgjStvdkD","qQxHPs93Ml","In3NSiB08l","Kr8ysAXpwE","v8yFNhe9IA","ECMvUS77LH","uZPqgGrDg7",
+"qQxHPNAFuw","14FLRaL6AJ","WDVWJHlUbF","ni2v1uN6r3","m4bxUAmdQd","zqH0WG1RhS","EdBKcn8pJ9","618Di14FLR","9y4lwydG8U","Cp3mZ7ku1p",
+"MmKGJP6bcg","W7cTs8cVD3","GXdoHdQ586","AkKTksoy9t","iqv4ki3pyd","P6bcgDcpWB","Yf2EcCfgr3","hE1QlFwEJz","Mm8siZ4I1v","AIYUuThjNn",
+"vOqCEW7cTs","zmLYDM3zXL","gdQsS4W0Tl","taOXKlpF6W","VBjhzOUqFM","b29RJZ4I1v","CqqaDI7p2a","1LB1Ld85a9","0KyfsoQ87r","9iGoTrhl0J",
+"WmadAzY1GY","s93MljiVBP","dQ586CxVEf","CxVEfcQOnv","9GXkXwiHrZ","1LB1L9XyT9","OHaBzRACuj","gdQsSJKWYR","RxrsmVprf2","7ku1pgdQsS",
+"ZuDtDHRxd8","aDGtSKr8ys","4W0TlK4GS8","4dEz6dhSuH","MGlTFGv3Fq","RsQUqtl72W","ru4UGy94nw","jS1aj64s8N","vLsmS618Di","W3VFHh1zcH",
+"NOHszl83Ud","cL0aES2Dfu","5nmWvyEfy9","RACujDz1R3","YjB9tnnP8o","5Mg9rokgRi","blLA9djsrv","tvdkDDcpWB","fqypyFVMxo","JKWYRMkgy8",
+"cL0aENo0Qb","uLtKsoQ87r","mX2GEZuDtD","fmIK1YjB9t","618DiDz1R3","t98iWjzUqR","sx5GlBbwgA","JkzUni7WMQ","RBhp0CK5W7","7hyVv8xEKz",
+"HRxd8B3qem","45cIHFcWrW","WmadARmDcr","rKDLJOUYuF","dpe1vKsjRK","YjB9tQ6Lix","ydG8UWPmlx","48cHLuQIcz","SbRYyOHaBz","vOqCEMGlTF",
+"9rlg95Namm","v8yFNQ6hMC","FjHXR7lUXZ","okgRihUTw7","ru4UGZuDtD","pFrrlQ6Lix","CNHmvSmGzv","UlU3MM3zXL","ni2v1gdQsS","Yw2oUfcJOy",
+"NOHszdmoS7","Ul4a1ReKEW","iwzGk9XyT9","gtCA5vLsmS","8hJdtrz7Ut","XflUqvOqCE","W3VFHZhwG1","hUTw7i7WMQ","Fhtgl7ku1p","qaofNOHaBz",
+"0PktI9iGoT","MezSWdQ586","0YAGHWMiS3","b29RJCK5W7","F6PT2ReKEW","fcJOyyluBx","aFFssFNYIM","ni2v1Vprf2","s4786RsQUq","o8UydP6bcg",
+"zQt6QuN6r3","580YD7hyVv","k85AeStlDJ","YOfrYMkgy8","P6bcgM6qcG","DG4sT5iGN5","QYxC0uTacx","zz4ZUQworu","uPX7Gd85a9","ReKEWhUTw7",
+"hSSvQ16lHc","soy9t2TRI7","9rlg9lm0pD","lH1ktsx5Gl","AkKTkcShY2","d85a9ECMvU","blLA9GXdoH","iB08lRACuj","qQxHPBpYhV","blLA97ku1p",
+"Mkgy8pFrrl","0Wr5y0ao3l","Zv7z0SWfou","EdBKcHP433","lkMUAStlDJ","9y4lwd85a9","sx5Gl5Namm","QChxswDajX","5VZjSZhwG1","vOqCEhE1Ql",
+"JKWYR4QMc9","s4786Waim6","n8pJ9aL6AJ","Y1mC0ReKEW","1LB1LgIYvE","BbwgA7Ow5C","iB08laDGtS","oGu6x4dEz6","uoStwuLtKs","jSjS3o8Uyd",
+"tjQxskB5nP","k85AeAkKTk","d7vjMECMvU","ZzJHWSbRYy","FcWrWQ6Lix","kB5nPtlILt","sx5GlAXpwE","HzZT8nlaBy","MK07YKsjRK","fmIK1lH1kt",
+"0ao3lJJs5m","jeskS7hyVv","lViBvFnPFB","t98iWdQ586","tvdkDZJTXH","HfyNQ8cVD3","yEfy9AXpwE","i7WMQQWxoT","kB5nPjeskS","tuDySciuWz",
+"fcwDaYjB9t","Vprf2KsjRK","FGzgpx3LDe","IBe8kNhXdu","WPmlxCxVEf","5Namm0BmCy","pv0i7CIShG","07n1cpiJSk","DLhzMlweGy","pFrrlX6Pin",
+"IBe8kOUYuF","Uvlv4fFDrJ","xXTI4S77LH","atef2jfREu","d85a9MezSW","VBjhzEOE1o","k85Ae64s8N","Chuy3tlILt","d85a95ZaEz","DG4sT8xEKz",
+"uAWypDcpWB","dpe1vMezSW","s93Mltl72W","2NslmStlDJ","JRJQB2hEEU","QworuzY1GY","FLsphK20wK","7fsYMHRxd8","AkKTksqVrf","OUYuFYjB9t",
+"7lUXZFwEJz","prNT6kB5nP","jfREu7hyVv","QChxsydG8U","Dz1R3JIqXi","F6PT2XflUq","4QMc9n1pmO","Vprf2QChxs","UmaEvi7WMQ","zHF1qGXdoH",
+"WaWsvK20wK","Nxx9VJXljW","x3LDeuupzk","ix74rmX2GE","lsQGo07n1c","3otm6WPmlx","jeskSAXpwE","FLsphEdBKc","9rlg9HfyNQ","MK07YK4GS8",
+"BGaQYTwano","ciuWzAkKTk","HRxd8lViBv","mz8gxRkQke","ix74rThjNn","HlUbFThjNn","vOqCE1v5hH","gjUTuazIWp","In3NSd85a9","fcwDaBCxeC",
+"QssNCCNHmv","Oz8yZGv3Fq","AIYUuuvf7A","FFDuiQChxs","QWxoTKASQ8","ThjNnuvf7A","QChxsaL6AJ","RACujHRxd8","l83UdQWxoT","9XyT9LewvM",
+"0ao3l5Mg9r","EOE1ojiVBP","8TxD7v2eC3","zQt6QjSjS3","S2Dfui7WMQ","iqv4kgf8rI","VBjhzgjUTu","3weIFJ2mQi","In3NStuDyS","KsjRK5nmWv",
+"8RCUAQworu","8cVD3jSjS3","vOqCEyEfy9","zbIYYbZLvS","2NslmJkzUn","vOqCEDcpWB","9eoRcyluBx","hUTw7VLTy6","0PktIKr8ys","zHF1q0ao3l",
+"GrDg7zbIYY","2NslmAXpwE","Dz1R3v8yFN","NOHszk85Ae","MmKGJFjHXR","WmadAPb1pa","cShY2iKqhr","HRxd829QAz","kZANmRkQke","8cVD3PYBf4",
+"Nxx9VlkMUA","yEfy92DREs","Mkgy85IhmG","O3iyQoQ87r","iB08l55rfB","P6bcg5VZjS","5Drn0FVMxo","i7WMQni2v1","t59lRcQOnv","h1zcHiqv4k",
+"DLhzM5ZaEz","QworuIBe8k","IRh48o8Uyd","Mm8si7fKYU","8U2nUjiVBP","uoStwoVQp6","d85a9BbwgA","SbRYyHP433","9iGoTfaHir","L7cGcpWiOs",
+"Mm8siCdyBV","Q6hMCQWxoT","No0QbS77LH","JkzUnK4GS8","BFkb8P6bcg","yluBx0MR5X","2ZHdkL7cGc","MmsIoFnPFB","uoStwhUTw7","AkKTkzFgtB",
+"yluBxlj07Q","55rfBVLTy6","14FLRzbIYY","9GXkXfLNg8","Yw2oUUl4a1","ZzJHWQClRL","tlILt14FLR","uupzknnP8o","VerEADG4sT","t98iW8FmFH",
+"AmdQdFxX9q","P6bcgfaHir","CNHmvfcJOy","Mkgy88hJdt","xciqp8cVD3","d7vjMiB08l","ksJby0Kyfs","qaofNWaim6","oGu6xLbRTH","PYBf4OHaBz",
+"cL0aEDLhzM","QssNCrKDLJ","lsQGoksJby","HfyNQDQimp","AOgEeEdBKc","6q6L9jS1aj","No0QbzqH0W","pmeCdAkKTk","hYBCKWPmlx","0PktIru4UG",
+"RzaZANOHsz","6AFT0BFkb8","euZA5xciqp","P6bcgfcJOy","9eoRcs4786","16lHccQOnv","zbIYYv1Hln","8hJdtCNHmv","sx5GlYw2oU","cQOnvxReec",
+"ECMvUtjQxs","cShY2Dz1R3","cShY2hE1Ql","O3iyQzFgtB","Yw2oUW7cTs","b29RJL7cGc","Waim6Q6Lix","9y4lwciuWz","mX2GE8cVD3","blLA9CxVEf",
+"VBjhzFVMxo","zqH0Wix74r","aDGtS9eoRc","IjTwPDz1R3","ogLgciKqhr","n8pJ92Nslm","29QAzuupzk","rKDLJmz8gx","uoStw5Namm","tl72WyofH3",
+"tl72WciuWz","lpF6WWDVWJ","v8yFNGSQwj","jtn0XfmIK1","0BmCyDLhzM","ix74rYh1hF","7hyVvbgJAz","RpBQmYw2oU","vOqCEjzUqR","OHaBzpFrrl",
+"v8yFN5VZjS","e6e4zhE1Ql","WreyPiB08l","OxWIH1v5hH","AXpwERxrsm","rKDLJfcwDa","b29RJWMiS3","Z4I1vVjCZq","s93MluJScX","IBe8kAkKTk",
+"4dEz6iKqhr","fFDrJKASQ8","uQIczfcwDa","i7WMQMkgy8","zQt6QzFgtB","2DREsCdyBV","GSQwjoVQp6","KASQ8JkzUn","n1pmOSjskQ","dpe1vo8Uyd",
+"SbRYyfqypy","NhXdu7X3uy","dQ586XyPZN","8hJdtzz4ZU","1LB1LJIqXi","FwEJzk85Ae","BCxeCiB08l","EOE1oPb1pa","8TxD7Uvlv4","WmadAXflUq",
+"pFrrllViBv","WMiS3l83Ud","QbxXc8TxD7","uPX7GUl4a1","CdyBVKsjRK","s4786J2mQi","pT8wupT8wu","5Mg9rAOgEe","Yw2oUCp3mZ","VjCZqVIlwP",
+"QssNCIRh48","lweGyHRxd8","kZANmuoStw","6q6L9GWqqX","ix74rD6rBy","SbRYytaOXK","zqH0W9rlg9","5Mg9rOUqFM","VNCPdjeskS","fcJOyaDGtS",
+"W3VFHokgRi","fqypyDcpWB","uJScX5Drn0","IBe8kb29RJ","pvgjS1j5L8","L7cGcuTacx","ZUnqtxciqp","U3yw55iGN5","0ao3lcmXIX","tuDyS1j5L8",
+"ix74rzHF1q","RBhp0y94nw","JKWYRRkQke","Ta8f6CIShG","CIShGd7vjM","P6bcgBpYhV","DcpWBjS1aj","AkKTkCNHmv","zY1GYyofH3","2Yz7ELbRTH",
+"UmaEv5nmWv","AkKTkQworu","pAhR1QChxs","EdBKcguMb8","3weIF2ZHdk","ksJbyMm8si","FjHXRQnJ1S","jeskSulk41","jiVBPfaHir","aFFssIBe8k",
+"CK5W7IKxdL","fcwDalkMUA","h1zcHyEfy9","uvf7Aiqv4k","7Ow5CGXdoH","JKWYRYOfrY","lpF6WKZamH","FPfSEiqv4k","GXdoH0Kyfs","s4786Nxx9V",
+"uPX7GfaHir","BpYhVdQ586","JIqXiv1Hln","WreyPLewvM","3otm6Rxrsm","7fsYMDz1R3","Gv3FqpT8wu","h1zcH1LB1L","IBe8kv8yFN","uZPqgQClRL",
+"9GXkXb29RJ","0MR5X8TxD7","vOqCE4W0Tl","faHir64s8N","AIYUudjsrv","FFDuiCNHmv","t98iWQYxC0","1j5L8580YD","AIYUuPOUYS","oGu6xnFqik",
+"euZA5P6bcg","SjskQ5nmWv","ZhwG1LbRTH","DG4sTNOHsz","Gv3Fqhi5X7","faHirF6PT2","djsrv2hEEU","FPfSE5ZaEz","zQt6QZ4I1v","zbIYYMmKGJ",
+"x3LDeMaJQs","RkQke8U2nU","Oz8yZRBhp0","EOE1oyEfy9","nFqikSmGzv","OUqFM0MR5X","i3pydAgJHQ","azIWpiwzGk","YOfrYFjHXR","Yf2EcfLNg8",
+"oVQp6Pb1pa","580YDmz8gx","HP433CK5W7","MmKGJgtCA5","X6PinS77LH","fmIK1AgJHQ","IjTwPqUJMd","i7WMQMmsIo","zQt6Q0Kyfs","zFgtBF6PT2",
+"VNCPdzFgtB","iKqhrNhXdu","Mm8simX2GE","yEfy9t98iW","RACujdjsrv","ru4UGOz8yZ","P6bcgSjskQ","HRxd8aL6AJ","vOqCEChuy3","VjCZqIKxdL",
+"NcICA5Mg9r","VjCZqprNT6","14FLRgtCA5","O3iyQCK5W7","yofH3JkzUn","uPX7GJXljW","B3qemIjTwP","0ao3lJKWYR","hi5X79eoRc","BGaQYG1RhS",
+"RzaZAUvlv4","9y4lwW7cTs","jtn0XHRxd8","JRJQBChuy3","2ZHdkfcwDa","hE1QlBbwgA","Ss0Zus93Ml","QYxC00ao3l","RxrsmwiHrZ","Q6hMCEoToP",
+"ru4UG0PktI","6q6L9prNT6","Q6Lix6q6L9","9GXkXUl4a1","Chuy3Cp3mZ","gtCA5nnP8o","AmdQdeuZA5","FGzgpblLA9","2hEEU5drc6","WreyPIBe8k",
+"SjskQxXTI4","4QMc9K20wK","prNT6vOqCE","brhlQ9rlg9","UmaEvd85a9","JkzUnVNCPd","4QMc9AOgEe","blLA9cQOnv","dhSuHydG8U","jiVBPYOfrY",
+"bgJAzhe9IA","e6e4zSbRYy","580YDzY1GY","gdQsSjfREu","zz4ZUuN6r3","Ss0ZuMkgy8","IBe8kuPX7G","U3yw5suY4x","8hJdtRACuj","FNYIM48cHL",
+"WreyPZuDtD","D6rByCxVEf","tvdkDSbRYy","n8pJ9s7Mxk","iwzGkSWfou","UmaEv580YD","NOHszNo0Qb","VBjhzWaim6","ix74rsqVrf","WDVWJx3LDe",
+"4dEz69y4lw","ZzJHWCK5W7","prNT6jeskS","Vprf2s4786","B3qemI7p2a","3otm6jeskS","ksJbylsQGo","AIYUuhSSvQ","No0QbMojnP","lXFOBHfyNQ",
+"QssNCVjCZq","BCxeCx3LDe","FjHXRGrDg7","EdBKc7hyVv","K4GS8ZUnqt","taOXKYOfrY","ZJTXH0Wr5y","FFDuik85Ae","3otm62Nslm","wDajXt59lR",
+"iqv4kjfREu","zHF1qmz8gx","7Ow5ClXFOB","PYBf4b29RJ","MK07Yhi5X7","jSjS35nmWv","JXljWpAhR1","OxWIHvOqCE","soy9trz7Ut","K4GS8XyPZN",
+"Cfgr3hSSvQ","5VZjSvLsmS","LbRTHF6PT2","4QMc9Q6Lix","GrDg7uJScX","NhXduKsjRK","FhtglCdyBV","GrDg7oVQp6","QnJ1Sx3LDe","hE1QljiVBP",
+"uQIczIjTwP","Dz1R3BFkb8","FxX9qMojnP","a00b5hE1Ql","RxrsmBbwgA","NAFuwGv3Fq","ciuWzStlDJ","5NammRpBQm","lsQGoru4UG","dpe1v0PktI",
+"0MR5XdmoS7","4W0Tlv8yFN","iwzGkdhSuH","5NammBpYhV","UlU3M7fsYM","uAWypKr8ys","WmadAGSQwj","fcJOyBbwgA","vOqCEVNCPd","JIqXii3pyd",
+"CIShGO3iyQ","Q6LixHlUbF","zQt6QbZLvS","JKWYR7Ow5C","fmIK1Ul4a1","QworuIKxdL","QYxC0dQ586","n1pmOWDVWJ","vOqCENhXdu","lweGyLDk6f",
+"o8UydfLNg8","zQt6QNcICA","bgJAz0h1b1","qQxHPcQOnv","KsjRKd85a9","vkCHHYjB9t","07n1cpv0i7","PYBf4gjUTu","FwEJznFqik","SbRYyRsQUq",
+"uJScXd7vjM","UmaEvFjHXR","0PktIBGaQY","Vprf2HfyNQ","lsQGoBpYhV","FPfSE5drc6","Cp3mZCNHmv","xciqplViBv","07n1cmX2GE","D6rByKsjRK",
+"ru4UGi7WMQ","CxVEfXyPZN","KASQ8GSQwj","Q6Lixi3pyd","5iGN5U3yw5","StlDJtuDyS","9GXkXpiJSk","QWxoT8FmFH","s4786EoToP","lViBvuoStw",
+"h1zcHhe9IA","OHaBzzY1GY","vkCHHSmGzv","mz8gxEdBKc","FNYIMxReec","n1pmOjfREu","Cfgr3fmIK1","RkQke7fsYM","Ss0ZuWmadA","AXpwEi3pyd",
+"2TRI7bgJAz","bgJAzDG4sT","JIqXi9GXkX","GrDg7kZANm","0YAGHv8yFN","ix74rReKEW","QClRLUlU3M","MaJQsMK07Y","VerEABCxeC","h1zcH8xEKz",
+"oGu6xIn3NS","YjB9tO3iyQ","9XyT9W7cTs","7Ow5CJXljW","6AFT0pWiOs","QssNCsuY4x","zQt6QYf2Ec","1LB1LStlDJ","pFrrlulk41","xXTI4Ta8f6",
+"hUTw7aez9y","2TRI78xEKz","L7cGcPOUYS","Dz1R3oGu6x","24ARFKsjRK","uTacxF6PT2","WmadAbrhlQ","x3LDeblLA9","FnPFBFNYIM","sx5GlJ2mQi",
+"CNHmvn8pJ9","MmKGJ1LB1L","ZJTXHNxx9V","Vprf2pWiOs","AOgEe5drc6","ZuDtDHfyNQ","K4GS8StlDJ","FxX9q0BmCy","In3NSReKEW","dQ586Cfgr3",
+"ksJbyb29RJ","YOfrYtAOsr","JJs5mfcwDa","i7WMQ9iGoT","lH1kt14FLR","ZzJHW0YAGH","rhl0JYjB9t","dhSuH2Yz7E","tvdkDzmLYD","1v5hHChuy3",
+"Chuy3RsQUq","9eoRcuPX7G","prNT614FLR","NAFuwpiJSk","dmoS7P6bcg","aDGtSydG8U","9XyT91j5L8","x3LDe0h1b1","55rfB7fKYU","FwEJz0YAGH",
+"VNCPdCfgr3","OHaBz7X3uy","KASQ8jSjS3","HRxd8uPX7G","HzZT88xEKz","S77LHYh1hF","zHF1qNAFuw","taOXKTwano","tvdkDwiHrZ","KASQ8WaWsv",
+"hE1QlwDajX","uJScXQ6hMC","S2DfuMm8si","GSQwjKsjRK","VNCPdl83Ud","lXFOBC2Irc","4QMc9QnJ1S","Ss0ZujeskS","dmoS7okgRi","hi5X71LB1L",
+"gIYvErhl0J","64s8NMmKGJ","RxrsmDLhzM","ZJTXHlViBv","8U2nU2Yz7E","Dz1R3FxX9q","Yf2EcfmIK1","BGaQYv1Hln","5VZjSFGzgp","x3LDen1pmO",
+"Z4I1vdQ586","CqqaDCqqaD","wiHrZlsQGo","l83Ud0ao3l","7ku1pmz8gx","AIYUu0PktI","jSjS3TXQ0Z","FGzgpGSQwj","iB08l2TRI7","gIYvERzaZA",
+"KZamHOxWIH","rz7Ut0ao3l","580YDUlU3M","lweGyk85Ae","0PktIBbwgA","kZANm55rfB","uN6r3djsrv","Zv7z0taOXK","oVQp6BGaQY","lH1ktFjHXR",
+"NOHszEOE1o","Uvlv4OUYuF","UmaEvgdQsS","hUTw7s7Mxk","soy9tlkMUA","lCMxyzQt6Q","qQxHPjiVBP","tjQxsWPmlx","fLNg8YjB9t","7Ow5CaL6AJ",
+"Ss0ZunlaBy","aFFssZzJHW","fmIK1WPmlx","uTacxlsQGo","FxX9qHlUbF","3otm6ogLgc","Ss0ZuFhtgl","BpYhVaez9y","IjTwPzFgtB","VjCZqPb1pa",
+"ReKEWulk41","uPX7GStlDJ","dmoS7Kr8ys","64s8Ni7WMQ","aez9yHlUbF","cmXIXoVQp6","uZPqgGXdoH","fcJOypv0i7","9y4lwlViBv","tAOsr14FLR",
+"AIYUu14FLR","aez9yIjTwP","OHaBzciuWz","x3LDezQt6Q","uvf7AfaHir","Uvlv4WmadA","BFkb8rz7Ut","SmGzvtjQxs","QworuUlU3M","PYBf40ao3l",
+"o8Uyd45cIH","fcwDaQWxoT","CIShGJJs5m","QnJ1SStlDJ","OHaBzulk41","BCxeClm0pD","NAFuwQWxoT","HRxd8ulk41","6q6L9t59lR","hSSvQqaofN",
+"lm0pDbZLvS","Waim62ZHdk","Oz8yZlsQGo","atef2b29RJ","5Mg9rYh1hF","QnJ1SzmLYD","BGaQYpAhR1","prNT6IKxdL","lkMUA0YAGH","JIqXiZUnqt",
+"AmdQdMojnP","aFFssKr8ys","uAWypjSjS3","RBhp0lpF6W","d85a9uupzk","RpBQmMezSW","lweGyjfREu","5VZjShE1Ql","uAWypMK07Y","IKxdLW3VFH",
+"n1pmOlm0pD","XflUqfcwDa","7lUXZLDk6f","rhl0Jk85Ae","fqypyMaJQs","QYxC0X6Pin","VLTy6kZANm","bgJAz7X3uy","0h1b1SjskQ","RzaZAoVQp6",
+"hYBCK48cHL","IjTwPYjB9t","FVMxoUlU3M","t98iWC2Irc","zFgtB8RCUA","HP433EdBKc","64s8NZUnqt","8TxD7tuDyS","MezSWYjB9t","VjCZqyToGW",
+"MojnP8FmFH","Ta8f6FjHXR","7lUXZeuZA5","F6PT2oVQp6","ksJbypmeCd","7fKYUlpF6W","8xEKzguMb8","0Wr5yhE1Ql","P6bcggIYvE","s93Mlulk41",
+"o8UydCdyBV","zFgtB5VZjS","7fKYUn1pmO","hUTw7iqv4k","16lHcgf8rI","Mkgy8MmsIo","uQIcz2DREs","OHaBzfFDrJ","Fhtgl5VZjS","i7WMQzFgtB",
+"k85AeM6qcG","AOgEetuDyS","AXpwEpT8wu","nnP8o7fKYU","he9IArKDLJ","WDVWJgf8rI","0h1b1x3LDe","Y1mC0jeskS","a00b5KsjRK","TwanoSjskQ",
+"WaWsvpFrrl","wDajXyToGW","ogLgcSs0Zu","8xEKzbrhlQ","qQxHPt59lR","5nmWvjiVBP","jtn0XLbRTH","55rfBVIlwP","BCxeCFNYIM","618DihSSvQ",
+"RzaZA45cIH","0KyfsdmoS7","jiVBPgIYvE","TwanoCqqaD","VBjhz8RCUA","MezSW9eoRc","xXTI4Yf2Ec","29QAz8FmFH","h1zcHt98iW","ru4UGpFrrl",
+"AgJHQfcJOy","pT8wutvdkD","ksJby29QAz","D6rByksJby","wDajXhUTw7","GrDg70BmCy","KASQ85Namm","taOXKK20wK","cShY2RACuj","vkCHHx3LDe",
+"D6rBysoy9t","zmLYDJkzUn","uQIczvOqCE","FFDuiQbxXc","GSQwjbgJAz","mz8gx24ARF","aFFssCfgr3","yToGWjtn0X","i7WMQNAFuw","wiHrZ45cIH",
+"0PktIEdBKc","3weIF7Ow5C","qaofNQssNC","ZJTXHTCgPp","iKqhr5Mg9r","O3iyQdpe1v","YjB9tGXdoH","9rlg9KsjRK","pAhR1lpF6W","ECMvUyToGW",
+"BbwgARkQke","NhXduX6Pin","FLsphfcwDa","CxVEfjfREu","UlU3Mmz8gx","yEfy9uQIcz","ZzJHWECMvU","VNCPdRkQke","Q6hMCaL6AJ","t98iWReKEW",
+"iwzGk7hyVv","XflUqL7cGc","WDVWJJIqXi","jiVBPIBe8k","y94nwOxWIH","m4bxUKZamH","fqypywiHrZ","prNT65Drn0","b29RJP6bcg","1j5L8Chuy3",
+"AXpwEFjHXR","Gv3FqQWxoT","S2DfuK4GS8","pmeCdB3qem","BFkb8pmeCd","ZzJHWL7cGc","0ao3lk85Ae","64s8NDLhzM","tl72WFwEJz","ksJbycL0aE",
+"16lHcQChxs","pmeCdbgJAz","uZPqgPYBf4","Mkgy8QnJ1S","29QAztlILt","JkzUnJIqXi","WaWsv8FmFH","VIlwPaDGtS","HlUbF4W0Tl","VjCZqoGu6x",
+"tl72Wd85a9","QChxsnnP8o","oVQp6Dz1R3","Nxx9VqQxHP","7hyVvmz8gx","16lHc8TxD7","AIYUuuPX7G","lkMUAWmadA","HRxd8KsjRK","8RCUAix74r",
+"nFqikv2eC3","yEfy9B3qem","yvOMIhi5X7","v1HlnsqVrf","0Wr5yix74r","MaJQsAIYUu","fmIK10ao3l","ZzJHWgdQsS","9rlg9QClRL","0PktI4QMc9",
+"HfyNQd7vjM","lXFOBh1zcH","djsrvdjsrv","29QAzEdBKc","lkMUARBhp0","VNCPdPOUYS","zQt6QCdyBV","7fsYMvLsmS","Cfgr3CIShG","Ta8f6GSQwj",
+"W7cTsdhSuH","uvf7A0PktI","JIqXiyToGW","gdQsStAOsr","ru4UG0Wr5y","KsjRKHlUbF","pv0i77hyVv","iqv4kiqv4k","OHaBzaDGtS","WMiS3mX2GE",
+"M6qcGfmIK1","nnP8oi7WMQ","8RCUArz7Ut","t98iWlkMUA","pFrrlyEfy9","i7WMQMm8si","hE1QlpFrrl","6AFT0aez9y","suY4x1v5hH","DG4sTAkKTk",
+"xciqp5Drn0","7lUXZ8FmFH","MojnPjfREu","BbwgApAhR1","FnPFBGSQwj","djsrv3weIF","zFgtBWmadA","bgJAz7fKYU","d7vjM0YAGH","MojnPKZamH",
+"BGaQY1j5L8","JJs5mcShY2","Z4I1vDG4sT","Vprf2CdyBV","0BmCyU3yw5","HlUbFFVMxo","IKxdLbgJAz","lXFOBrhl0J","i7WMQjzUqR","MK07YGSQwj",
+"5Nammsx5Gl","7lUXZThjNn","HfyNQFGzgp","mz8gxKr8ys","BpYhVjzUqR","tl72WMezSW","GWqqXzz4ZU","YjB9tpFrrl","dQ586MmsIo","aFFssfmIK1",
+"zmLYD7X3uy","D6rByD6rBy","6AFT0hi5X7","Q6hMCU3yw5","uZPqg5Drn0","cQOnvMaJQs","uN6r3IjTwP","POUYSAgJHQ","dhSuHpWiOs","MezSW24ARF",
+"PYBf4VjCZq","RxrsmPYBf4","8U2nUFnPFB","4dEz6OxWIH","uZPqgQChxs","0PktICqqaD","3otm614FLR","gjUTuvkCHH","uLtKs4QMc9","cL0aEjtn0X",
+"8FmFHs93Ml","S2DfuSs0Zu","bZLvS8TxD7","iB08l29QAz","jiVBPAXpwE","ydG8U9GXkX","e6e4zblLA9","NhXduh1zcH","G1RhS6AFT0","yvOMIpT8wu",
+"5nmWv1j5L8","Ta8f6lkMUA","taOXKKsjRK","atef2uQIcz","VBjhzd85a9","n8pJ9FNYIM","VBjhzNo0Qb","MojnPtlILt","RmDcrRBhp0","xXTI4e6e4z",
+"GSQwjVLTy6","ReKEWxXTI4","zbIYYSs0Zu","Gv3FqFNYIM","oGu6xK4GS8","cShY2JIqXi","mz8gxhE1Ql","aDGtSSjskQ","POUYS7fsYM","CK5W7S77LH",
+"dQ586NhXdu","oGu6xB3qem","D6rByVprf2","Vprf2nFqik","gf8rIdQ586","uvf7A580YD","taOXKOHaBz","bgJAzMm8si","CNHmvtlILt","8U2nU0YAGH",
+"djsrvOHaBz","Zv7z0Waim6","0PktItl72W","BFkb8bgJAz","OUYuFQ6hMC","gIYvEYh1hF","dQ586lViBv","7X3uy7Ow5C","t98iW5VZjS","azIWpgf8rI",
+"618DiBCxeC","iB08lY1mC0","QChxsMm8si","GWqqXnnP8o","uoStwOz8yZ","EdBKcVerEA","y94nwMezSW","mX2GEpWiOs","ReKEWRkQke","ix74rn1pmO",
+"MGlTFQ6hMC","CK5W7Yh1hF","euZA5s4786","K4GS8b29RJ","TCgPpYjB9t","bgJAzVLTy6","QClRL8cVD3","gdQsSsqVrf","dpe1vjSjS3","vOqCEL7cGc",
+"6AFT0i7WMQ","yluBxQ6hMC","StlDJuN6r3","6AFT08FmFH","24ARFuAWyp","HzZT8KASQ8","Ss0ZuFPfSE","9y4lw1j5L8","ksJbyYf2Ec","M6qcGTXQ0Z",
+"faHirKZamH","X6PinzqH0W","KsjRKQ6Lix","FGzgp7Ow5C","oGu6xkB5nP","0YAGHd85a9","VNCPdhE1Ql","b29RJOUqFM","okgRii7WMQ","ThjNnYjB9t",
+"lweGyBCxeC","o8Uyd07n1c","29QAzWreyP","Y1mC0VBjhz","RmDcrQWxoT","HfyNQksJby","QbxXcQworu","VNCPdO3iyQ","faHirJ2mQi","XyPZNuvf7A",
+"RpBQmFnPFB","Y1mC0v1Hln","AgJHQdpe1v","DcpWBQnJ1S","2NslmfcJOy","k85AehSSvQ","jiVBPFPfSE","yvOMIbZLvS","QYxC0Vprf2","d7vjM2Nslm",
+"14FLRh1zcH","No0QbzbIYY","SbRYyhYBCK","WMiS3RzaZA","PYBf40MR5X","BFkb8pT8wu","dhSuHyvOMI","jS1ajJRJQB","8hJdtOUqFM","MmsIoiKqhr",
+"jzUqRPYBf4","VerEAfLNg8","EoToPYjB9t","DcpWBEdBKc","zHF1qjzUqR","cQOnvFFDui","Y1mC0tlILt","LewvMzQt6Q","8TxD70h1b1","4W0TlzY1GY",
+"d85a9pT8wu","XyPZNHzZT8","ThjNnJXljW","FxX9qsx5Gl","guMb8KZamH","uupzkPOUYS","0KyfsZ4I1v","nFqiktuDyS","AOgEe1v5hH","ydG8U8FmFH",
+"ZuDtDJ2mQi","HzZT89iGoT","ZzJHWVIlwP","piJSkUl4a1","CqqaDGWqqX","ulk41qUJMd","tuDySAmdQd","AmdQdksJby","JkzUnWmadA","guMb8CdyBV",
+"e6e4z2TRI7","dmoS7Ul4a1","14FLRQClRL","RxrsmZ4I1v","CxVEfS77LH","VerEA7X3uy","mz8gxPYBf4","ulk41Ta8f6","8hJdtdQ586","KsjRKFjHXR",
+"lsQGoUl4a1","2Yz7EDQimp","DLhzMblLA9","NOHszOxWIH","h1zcHprNT6","fLNg8cShY2","hUTw75nmWv","VerEAuTacx","VLTy6IjTwP","pFrrluLtKs",
+"5nmWvUl4a1","MGlTFhE1Ql","Zv7z0pvgjS","xciqpzFgtB","he9IAQWxoT","W3VFHoVQp6","uJScXReKEW","Oz8yZ2DREs","Q6LixCdyBV","8hJdtZv7z0",
+"Zv7z0OHaBz","NAFuwMmKGJ","pvgjSAXpwE","faHirAgJHQ","Waim6iKqhr","jS1ajnnP8o","0MR5Xatef2","dpe1vnFqik","MmsIoFNYIM","NhXduNAFuw",
+"qUJMdRxrsm","v2eC32hEEU","taOXKbZLvS","vLsmSMaJQs","Uvlv4WreyP","XyPZNjSjS3","JRJQBW3VFH","x3LDeaL6AJ","yvOMIksJby","2DREsReKEW",
+"B3qemrhl0J","KZamH0ao3l","1v5hHYOfrY","piJSkzz4ZU","0h1b1P6bcg","Pb1paPOUYS","FjHXRNxx9V","oVQp6BFkb8","jfREu580YD","StlDJOHaBz",
+"3otm6FFDui","IjTwPi7WMQ","d85a9JJs5m","8RCUAlj07Q","VBjhzFFDui","0PktI8cVD3","o8UydnnP8o","SjskQtuDyS","zz4ZURkQke","K4GS8MK07Y",
+"G1RhSlH1kt","O3iyQtAOsr","16lHcS77LH","BFkb80BmCy","tvdkDhYBCK","CdyBVMmKGJ","ru4UG7lUXZ","wDajXCqqaD","tlILtiwzGk","lH1ktoQ87r",
+"IjTwPbgJAz","2TRI7XflUq","Waim6lH1kt","RACuj9GXkX","jiVBPHP433","suY4xm4bxU","24ARF0Kyfs","Pb1palXFOB","5nmWvJkzUn","rKDLJpv0i7",
+"2NslmSmGzv","B3qempAhR1","mX2GEsuY4x","Z4I1vwDajX","v1Hln1v5hH","mz8gxUlU3M","zqH0Wuupzk","RzaZARzaZA","Dz1R3rz7Ut","JXljWuoStw",
+"qUJMdDz1R3","HfyNQVLTy6","Zv7z0RBhp0","B3qem24ARF","DLhzM1j5L8","QClRLU3yw5","Ul4a1jiVBP","tjQxsHlUbF","FhtglOxWIH","Mm8si7X3uy",
+"IKxdLB3qem","StlDJpFrrl","jeskSWMiS3","JKWYRGSQwj","RpBQm5Drn0","gIYvE9iGoT","n1pmOGrDg7","P6bcg580YD","VjCZqVNCPd","IjTwPUl4a1",
+"jS1ajFGzgp","uN6r3KASQ8","CK5W7uvf7A","FjHXRMm8si","1j5L82DREs","cmXIXKASQ8","6AFT0xReec","NOHsziKqhr","bgJAzMkgy8","CdyBVRACuj",
+"Nxx9VlH1kt","qaofNJKWYR","CdyBV2ZHdk","NcICAKsjRK","QnJ1S7X3uy","Ss0ZuuQIcz","14FLRgIYvE","uQIczNOHsz","Ta8f6v2eC3","8hJdtlm0pD",
+"3otm6ydG8U","euZA5ZJTXH","24ARFuvf7A","oVQp6Y1mC0","Gv3FqRACuj","Yf2EcpmeCd","P6bcgiqv4k","M3zXLJKWYR","NcICAMK07Y","B3qemWaWsv",
+"Kr8ysOHaBz","24ARFNOHsz","GWqqXbgJAz","JIqXiGXdoH","e6e4zK4GS8","1j5L88hJdt","VjCZqn8pJ9","k85AeeuZA5","5nmWvcL0aE","JkzUnaDGtS",
+"JRJQBtjQxs","4dEz6OUYuF","yvOMIVjCZq","0PktIK20wK","kB5nPfLNg8","s93Ml4dEz6","J2mQiydG8U","fcJOynFqik","4dEz6RmDcr","e6e4zCxVEf",
+"EOE1oUlU3M","y94nwi3pyd","5IhmGEoToP","Dz1R37lUXZ","7X3uykB5nP","OxWIHIKxdL","suY4xDQimp","K4GS8hSSvQ","8cVD3lXFOB","zmLYDB3qem",
+"yluBxGSQwj","jtn0XI7p2a","yluBxsx5Gl","K20wKnnP8o","xXTI4oQ87r","RzaZAVprf2","QWxoTlCMxy","YOfrYBpYhV","5IhmGoQ87r","pmeCdO3iyQ",
+"VNCPdZzJHW","n1pmOtlILt","Qworu9eoRc","faHirIKxdL","FVMxoHP433","16lHcFLsph","d85a9cQOnv","zmLYDhSSvQ","jfREuK4GS8","gIYvE45cIH",
+"POUYShe9IA","s7MxklXFOB","Cfgr3zQt6Q","QbxXcrKDLJ","Waim6XyPZN","7fsYM2hEEU","Vprf29eoRc","7lUXZJJs5m","fqypylH1kt","QbxXcn8pJ9",
+"5Drn0K20wK","sqVrfv2eC3","atef2cShY2","AIYUuAgJHQ","48cHL2TRI7","jzUqRzmLYD","QssNCzqH0W","Cfgr3RkQke","MaJQsRsQUq","K4GS8vLsmS",
+"cShY2618Di","FhtglThjNn","I7p2ayToGW","RzaZASs0Zu","CxVEf0h1b1","HfyNQC2Irc","uLtKsyluBx","iwzGkNOHsz","rz7UtxXTI4","4dEz6Ta8f6",
+"NcICAUl4a1","lXFOB7Ow5C","euZA5jiVBP","kZANmwDajX","ZhwG1vkCHH","GrDg7DcpWB","45cIHHlUbF","NAFuw9eoRc","VjCZqx3LDe","dhSuHFGzgp",
+"1LB1LwDajX","PYBf4MK07Y","Yh1hFK20wK","ZzJHWs93Ml","KZamH3otm6","cmXIX0MR5X","S2DfuS77LH","jtn0XgdQsS","atef2K4GS8","HRxd8i3pyd",
+"4dEz6ZzJHW","RzaZApT8wu","9XyT95iGN5","8TxD7zQt6Q","2hEEUEOE1o","9XyT9jeskS","zFgtB618Di","GWqqX9rlg9","ZzJHWlpF6W","Zv7z0SmGzv",
+"MmKGJCfgr3","MmsIoStlDJ","QChxsuupzk","fcJOydpe1v","guMb8Zv7z0","hi5X7lkMUA","0h1b1dmoS7","dpe1vi7WMQ","oQ87rDz1R3","ogLgcFjHXR",
+"0BmCyNo0Qb","yluBxGv3Fq","cmXIXYh1hF","CdyBVWDVWJ","AIYUuk85Ae","VjCZqM6qcG","uAWyp07n1c","XyPZNyToGW","In3NSJIqXi","yvOMInnP8o",
+"ZuDtDlH1kt","OxWIHUmaEv","5IhmG2hEEU","WaWsv5drc6","uTacxIjTwP","YOfrYQworu","prNT66q6L9","FcWrWnnP8o","G1RhSZuDtD","t59lRn1pmO",
+"v8yFNDQimp","Fhtglsoy9t","DG4sTyvOMI","6AFT0UlU3M","48cHLThjNn","J2mQiOz8yZ","QClRL7hyVv","8TxD7ThjNn","VjCZq64s8N","vLsmS29QAz",
+"tlILtWaWsv","580YDAXpwE","hUTw7PYBf4","K4GS8VBjhz","jzUqRfFDrJ","mz8gxulk41","4dEz65Namm","lsQGon1pmO","yluBx2Yz7E","GXdoHv8yFN",
+"he9IA7lUXZ","lj07Q2TRI7","gIYvEcL0aE","Z4I1vKr8ys","fFDrJk85Ae","MGlTFGWqqX","LDk6fTXQ0Z","9rlg93otm6","qQxHPgtCA5","B3qemtlILt",
+"NcICAVprf2","vkCHHC2Irc","yofH3he9IA","FxX9qxXTI4","8U2nUhUTw7","9rlg9RkQke","soy9th1zcH","FxX9qYw2oU","FNYIM5iGN5","QbxXckB5nP",
+"CdyBVnlaBy","IBe8kAmdQd","brhlQ1j5L8","prNT6NAFuw","8RCUAwiHrZ","aez9yYh1hF","8TxD7xXTI4","X6PinFNYIM","iwzGkfcwDa","C2IrcXflUq",
+"uTacxzz4ZU","FjHXRCdyBV","BbwgAs93Ml","9y4lwuN6r3","9y4lwzz4ZU","CIShG1LB1L","AkKTkFGzgp","Yw2oU7fKYU","kZANmQ6Lix","v8yFN8FmFH",
+"MmsIoUl4a1","uQIczReKEW","4QMc9kB5nP","JIqXiX6Pin","ni2v1fcJOy","yvOMIGrDg7","EdBKcNxx9V","lj07QjiVBP","HzZT8qaofN","FcWrWI7p2a",
+"K20wKprNT6","lj07Q2hEEU","dpe1vYw2oU","ZzJHWSs0Zu","UlU3MLewvM","AOgEeprNT6","MmsIoTXQ0Z","v2eC3he9IA","s47862hEEU","fmIK1MmsIo",
+"JIqXiydG8U","e6e4zVprf2","5Mg9rzbIYY","618DiUmaEv","gdQsSzHF1q","9iGoTzbIYY","atef2yToGW","ydG8U8xEKz","KASQ8FnPFB","618DiYf2Ec",
+"djsrvDz1R3","yluBxpFrrl","mz8gx5iGN5","NhXdun8pJ9","uZPqg9GXkX","AOgEeIKxdL","Nxx9VhE1Ql","0BmCyrKDLJ","Waim6Nxx9V","VNCPdQbxXc",
+"tuDySTCgPp","5ZaEzKASQ8","n1pmOFVMxo","TCgPpNcICA","24ARFJJs5m","tAOsrFNYIM","uLtKsRkQke","Ss0ZufcJOy","QWxoThE1Ql","gf8rIKr8ys",
+"cShY2iB08l","Yh1hFt98iW","v2eC3W3VFH","Yf2EcBGaQY","MK07YHzZT8","Waim6fcJOy","uJScXWPmlx","iqv4kzbIYY","uPX7Gn1pmO","Chuy3Zv7z0",
+"jfREuKZamH","m4bxUTCgPp","lj07QQssNC","gdQsSQ6hMC","7Ow5CvOqCE","RxrsmFGzgp","SbRYyjfREu","vkCHHQworu","jSjS3IKxdL","FjHXR0MR5X",
+"AXpwEeuZA5","atef2zqH0W","RpBQm8TxD7","BCxeCnFqik","oVQp6cmXIX","KASQ8lkMUA","UlU3MlsQGo","2Yz7ExReec","jeskSiKqhr","FjHXRtl72W",
+"Vprf2vLsmS","vOqCExReec","UmaEvHlUbF","618DiMGlTF","v8yFNsoy9t","bZLvSgdQsS","Ss0ZuIjTwP","FjHXRqaofN","Mm8sini2v1","uLtKs7fsYM",
+"29QAzWmadA","RACujd85a9","WaWsv4dEz6","uPX7GUmaEv","OHaBztAOsr","FcWrWjeskS","lViBvRACuj","WreyPZUnqt","Twanoulk41","tuDyShe9IA",
+"5iGN5M6qcG","3weIFvOqCE","t59lRY1mC0","v1Hlnt59lR","618Did7vjM","lm0pDBFkb8","s47860Wr5y","s93MlMojnP","9iGoTDcpWB","zHF1qDLhzM",
+"No0Qbdpe1v","8FmFHOUYuF","J2mQidQ586","ix74r7Ow5C","prNT6rKDLJ","jSjS3uLtKs","s4786GWqqX","aFFsspWiOs","GWqqXNxx9V","D6rByFVMxo",
+"Ss0ZuoGu6x","uPX7Gtl72W","HlUbFyofH3","y94nwuPX7G","ksJby1j5L8","HP433UlU3M","t59lRrhl0J","580YDqaofN","ogLgcnlaBy","CdyBV2TRI7",
+"ydG8Ulj07Q","ZJTXHAIYUu","v1HlnKASQ8","SbRYypFrrl","OHaBzNo0Qb","djsrvlpF6W","lm0pDogLgc","lsQGoCxVEf","he9IAlH1kt","RxrsmMm8si",
+"TCgPpMm8si","AOgEedpe1v","i3pyd8xEKz","TXQ0Zv2eC3","MmsIodmoS7","wDajXuJScX","Zv7z0No0Qb","NOHsz9XyT9","AkKTklpF6W","iB08lhYBCK",
+"7hyVvlj07Q","gIYvEhE1Ql","K4GS8pFrrl","zQt6QQWxoT","soy9tgdQsS","CqqaDmX2GE","0Wr5ypFrrl","zmLYD07n1c","s4786ydG8U","jSjS3jSjS3",
+"Z4I1vLewvM","8TxD7TXQ0Z","0ao3lFGzgp","AXpwEdjsrv","WMiS3O3iyQ","B3qemh1zcH","tvdkDsuY4x","qUJMdTa8f6","1j5L8QWxoT","taOXKv1Hln",
+"uupzk6q6L9","0BmCyuQIcz","ksJby5IhmG","gtCA5GSQwj","8cVD3oQ87r","a00b5Oz8yZ","9XyT9FwEJz","DG4sT618Di","hE1Qlxciqp","m4bxUJKWYR",
+"LbRTHlXFOB","K4GS8HRxd8","azIWpJRJQB","fmIK1djsrv","brhlQgtCA5","Z4I1vDz1R3","OxWIHAkKTk","0h1b1B3qem","KZamHJRJQB","FcWrWjtn0X",
+"Ss0ZuzmLYD","jS1ajO3iyQ","jfREuaL6AJ","Zv7z0pv0i7","9XyT9K20wK","YOfrYksJby","zz4ZUuLtKs","M3zXL48cHL","k85AeLDk6f","C2IrcWaim6",
+"WDVWJHfyNQ","ECMvUuLtKs","x3LDeyEfy9","Q6hMCKsjRK","zFgtBK4GS8","Vprf2uJScX","2ZHdkGSQwj","OUqFMgf8rI","Oz8yZdpe1v","WmadA5Mg9r",
+"yEfy9oGu6x","FwEJzBbwgA","s4786pT8wu","e6e4zMkgy8","s7MxkJJs5m","OUYuF5IhmG","SjskQlj07Q","In3NSx3LDe","ciuWzWaWsv","tjQxsMaJQs",
+"XflUqxReec","ThjNn2Nslm","guMb845cIH","ZUnqtMK07Y","UmaEvnnP8o","hSSvQciuWz","LbRTHfcwDa","hUTw7hE1Ql","9eoRcQClRL","7lUXZ7X3uy",
+"t59lRGv3Fq","5NammjzUqR","qQxHP0BmCy","pAhR1oVQp6","JXljWh1zcH","DcpWBbgJAz","Q6hMCpmeCd","16lHc8U2nU","8FmFH5ZaEz","CK5W7aL6AJ",
+"0ao3lSjskQ","Cp3mZBGaQY","0MR5X4W0Tl","M3zXLQ6hMC","atef2gdQsS","fFDrJdpe1v","jfREugIYvE","n8pJ9pT8wu","4W0TlogLgc","0MR5XuAWyp",
+"fcJOypmeCd","ix74rzY1GY","tuDySJkzUn","Chuy3gf8rI","lm0pDJJs5m","pmeCdIn3NS","5iGN5kZANm","e6e4zgIYvE","VIlwP55rfB","EoToPatef2",
+"qUJMd3otm6","aez9yt59lR","9XyT9GXdoH","iwzGkNAFuw","d7vjMWaim6","e6e4z8FmFH","ru4UG48cHL","ReKEW5VZjS","I7p2auvf7A","FjHXRVLTy6",
+"uAWyp0Wr5y","mz8gxDG4sT","AOgEetAOsr","KsjRKgIYvE","PYBf4LDk6f","o8UydRpBQm","pmeCdDcpWB","2Yz7E7Ow5C","zY1GYTCgPp","RkQke7ku1p",
+"zY1GYkB5nP","iKqhrUvlv4","RmDcr29QAz","BGaQYRzaZA","64s8NlkMUA","QnJ1ScQOnv","zqH0W8cVD3","9y4lwm4bxU","pFrrlQClRL","xciqpdmoS7",
+"W7cTsSjskQ","5IhmG0YAGH","0h1b1jSjS3","JXljWHzZT8","nlaByn8pJ9","ru4UG4W0Tl","L7cGcpFrrl","K4GS80BmCy","jS1ajBbwgA","QssNC7lUXZ",
+"ksJbyjeskS","qaofNVBjhz","XflUqFLsph","Gv3FqoVQp6","NAFuwpWiOs","UmaEvQworu","lpF6WpmeCd","AIYUuDQimp","C2Ircni2v1","CIShGF6PT2",
+"RBhp0Gv3Fq","RBhp0QnJ1S","5ZaEz5iGN5","QChxsoVQp6","x3LDeNo0Qb","ru4UGblLA9","D6rByHP433","FPfSEk85Ae","dhSuHKASQ8","n1pmO2Nslm",
+"4QMc9Cp3mZ","kZANmi7WMQ","e6e4zKr8ys","i3pyduupzk","FLsphmX2GE","CK5W7WreyP","FLsphy94nw","5iGN5dmoS7","Yf2EcuJScX","IRh48gIYvE",
+"ZuDtD0ao3l","Oz8yZFhtgl","FGzgplkMUA","0Wr5yhi5X7","7ku1p618Di","rz7Utsx5Gl","lCMxy7lUXZ","MmKGJFLsph","UmaEvnFqik","RxrsmJkzUn",
+"rz7UtQChxs","ulk41M3zXL","tlILtpv0i7","tvdkDv1Hln","3weIFciuWz","ix74rlCMxy","uoStwhYBCK","RkQke7Ow5C","4QMc9GrDg7","WreyP5Drn0",
+"P6bcggdQsS","EdBKcUvlv4","Q6hMC5drc6","1j5L8WaWsv","iKqhruPX7G","Zv7z0lCMxy","rKDLJM6qcG","ZUnqtuQIcz","iB08llCMxy","U3yw58RCUA",
+"JJs5mlsQGo","iKqhrMm8si","jS1ajMaJQs","x3LDeyvOMI","5Namm618Di","5VZjS4QMc9","XyPZNU3yw5","uN6r3y94nw","ZhwG1MaJQs","NAFuwZv7z0",
+"BpYhVcmXIX","ogLgcOxWIH","RxrsmyEfy9","IjTwPFxX9q","qQxHPCqqaD","vLsmSFjHXR","CNHmvrhl0J","7fsYMS77LH","h1zcHv1Hln","iwzGkFFDui",
+"Nxx9V9eoRc","yEfy9jSjS3","dQ586Q6Lix","yEfy98xEKz","Waim6kB5nP","Kr8yszmLYD","hE1QlThjNn","9iGoTDQimp","5Drn0iB08l","Ul4a1yToGW",
+"UmaEvNOHsz","fmIK1cShY2","Cfgr3fFDrJ","cmXIXyvOMI","U3yw5lH1kt","Mm8siWaim6","48cHLcmXIX","QssNCCfgr3","jS1ajyvOMI","qQxHPDG4sT",
+"azIWp9eoRc","ni2v1lCMxy","CNHmv2TRI7","x3LDe7lUXZ","0h1b1KsjRK","4W0TlWaWsv","StlDJ2ZHdk","prNT6BGaQY","dpe1vzz4ZU","U3yw5ulk41",
+"ECMvU8hJdt","8hJdt0PktI","KsjRK2DREs","aDGtSzmLYD","SjskQ4W0Tl","VjCZqRsQUq","4dEz6lViBv","Qworu14FLR","618DigdQsS","RBhp0M6qcG",
+"cL0aECp3mZ","Yf2EcgIYvE","pT8wuPb1pa","Z4I1vC2Irc","U3yw5fcJOy","blLA9tvdkD","oVQp6MK07Y","dQ586d85a9","yEfy90MR5X","BGaQYpv0i7",
+"aFFssVerEA","YjB9ttjQxs","7lUXZgf8rI","fLNg8SbRYy","tlILtvkCHH","nFqikFFDui","JXljWTwano","9XyT9v8yFN","QClRLuN6r3","MK07YBGaQY",
+"RxrsmpAhR1","QWxoTzY1GY","pFrrlxReec","NhXdu1LB1L","9rlg9CIShG","2ZHdkVNCPd","Uvlv4IKxdL","v2eC3Gv3Fq","v8yFNfcwDa","jfREu48cHL",
+"pvgjSjSjS3","pWiOslsQGo","i7WMQkB5nP","uupzkYOfrY","fcJOydjsrv","Cp3mZ4dEz6","U3yw55IhmG","FnPFBLewvM","5nmWvhe9IA","yluBxlsQGo",
+"h1zcH8FmFH","RmDcrtl72W","kB5nPlkMUA","RkQked85a9","RkQkeZhwG1","MGlTF29QAz","uAWypTa8f6","XyPZN8cVD3","XyPZNRACuj","FFDuiDQimp",
+"DG4sTVerEA","QworuYf2Ec","HzZT8kZANm","9GXkXuTacx","xXTI4J2mQi","DG4sTtaOXK","gIYvES77LH","lH1ktKr8ys","SjskQ2hEEU","16lHc5IhmG",
+"Gv3FqEoToP","oVQp65Mg9r","5VZjSjfREu","9XyT9QChxs","XyPZNkZANm","aFFsssqVrf","618DirKDLJ","hUTw7WmadA","ThjNnO3iyQ","wDajX0MR5X",
+"MmsIoJKWYR","ECMvUaL6AJ","SjskQ9y4lw","3otm6t59lR","VNCPdUmaEv","SjskQM6qcG","DQimpD6rBy","vLsmSEdBKc","5VZjSd85a9","lkMUA9XyT9",
+"yEfy9LewvM","9rlg97fKYU","Vprf2brhlQ","n1pmOWPmlx","Yw2oUMmKGJ","2hEEURmDcr","AkKTkW7cTs","hE1QlNOHsz","0h1b1fcJOy","aL6AJDG4sT",
+"nFqiktaOXK","WDVWJlweGy","FFDuiRBhp0","iB08lQYxC0","v8yFN7fKYU","x3LDeOUqFM","l83UdDG4sT","DcpWBb29RJ","2Yz7EgtCA5","suY4xdQ586",
+"7hyVvFFDui","iKqhrksJby","Waim6ZJTXH","5ZaEz1LB1L","Zv7z0fLNg8","D6rByhUTw7","FLsph5drc6","GrDg7S77LH","8hJdtv8yFN","M3zXLNo0Qb",
+"dQ586StlDJ","pmeCdNo0Qb","0h1b1ru4UG","k85AelweGy","zqH0WQClRL","zqH0WRkQke","K20wKFVMxo","uvf7AlweGy","oGu6xUvlv4","6AFT0lpF6W",
+"aL6AJ0BmCy","uJScXlpF6W","0Wr5ylkMUA","uJScXtAOsr","WMiS3Rxrsm","Mm8siCxVEf","M6qcGzFgtB","s93MlFnPFB","nnP8oRBhp0","ZhwG1J2mQi",
+"fmIK1AkKTk","0h1b1VBjhz","fqypy2Nslm","24ARFdQ586","RpBQmMmsIo","lsQGovkCHH","OUYuFJKWYR","uAWypUl4a1","9XyT9I7p2a","xReec8RCUA",
+"1LB1LUvlv4","e6e4zMmsIo","kB5nP2hEEU","fcwDaVjCZq","VerEAHfyNQ","piJSkbrhlQ","VNCPdY1mC0","sqVrfKr8ys","cQOnv5Namm","CdyBVWaWsv",
+"W7cTsxciqp","2ZHdkGWqqX","VerEAGrDg7","oGu6xW7cTs","64s8NuJScX","iwzGkYw2oU","O3iyQaL6AJ","1LB1LBpYhV","4dEz6UmaEv","Q6LixO3iyQ",
+"SWfoumz8gx","piJSkru4UG","StlDJbrhlQ","pv0i7zQt6Q","GXdoHtvdkD","M3zXLbZLvS","djsrvQChxs","GWqqXpiJSk","RxrsmHP433","TXQ0ZJ2mQi",
+"Ss0ZuSWfou","9iGoT9eoRc","POUYSAXpwE","618DiZUnqt","xReec0Wr5y","yEfy92ZHdk","suY4xQnJ1S","xReecUmaEv","tl72Wdpe1v","LbRTH0ao3l",
+"SWfoufcJOy","Y1mC05drc6","ciuWzqQxHP","1j5L8gIYvE","IBe8kPYBf4","VjCZqQbxXc","FjHXR64s8N","IRh48mz8gx","vkCHHaDGtS","n1pmOFxX9q",
+"uN6r3hi5X7","jS1aj580YD","oGu6xm4bxU","jeskSX6Pin","kZANmhUTw7","gf8rIfqypy","mX2GEJXljW","29QAzTwano","djsrvLDk6f","jSjS3IBe8k",
+"uQIczSs0Zu","lCMxy9eoRc","8xEKzd7vjM","djsrvSbRYy","tjQxsI7p2a","gdQsS0YAGH","uoStwEdBKc","BGaQY0PktI","Z4I1vlkMUA","MojnPNAFuw",
+"5iGN59iGoT","fFDrJtlILt","0h1b1lViBv","IKxdLVBjhz","yofH3SbRYy","TXQ0ZECMvU","Ss0Zua00b5","lm0pDguMb8","Y1mC0lj07Q","Uvlv4azIWp",
+"NOHsz9eoRc","gdQsS2Yz7E","zY1GY64s8N","uvf7AyToGW","M3zXLuTacx","ni2v17ku1p","kB5nPcL0aE","Nxx9VuN6r3","zY1GYjtn0X","vkCHHsqVrf",
+"ulk41RzaZA","Ta8f65Namm","Yf2Ecni2v1","8TxD7iqv4k","0YAGH2DREs","n1pmOStlDJ","nnP8oprNT6","v2eC3Zv7z0","gf8rIokgRi","8U2nUOUqFM",
+"FVMxo8cVD3","ulk41tjQxs","lH1kt7lUXZ","D6rByC2Irc","CdyBVHlUbF","tuDySpmeCd","O3iyQcShY2","KASQ8Yw2oU","k85Ae5Namm","sqVrfGrDg7",
+"F6PT2jiVBP","wDajXo8Uyd","4QMc9ix74r","8hJdtSjskQ","OxWIHpWiOs","9eoRcCdyBV","v8yFNhUTw7","SWfouRACuj","tlILtFNYIM","OxWIH2Yz7E",
+"7ku1plweGy","0PktIoGu6x","LDk6fFFDui","xXTI4n1pmO","b29RJ4dEz6","d85a9QnJ1S","XflUqNo0Qb","0Wr5y5ZaEz","y94nwa00b5","9iGoT8U2nU",
+"16lHcHP433","5NammtaOXK","GSQwje6e4z","ZJTXHQ6Lix","t98iWprNT6","nFqikQssNC","7fKYUYw2oU","MezSWFFDui","KsjRKFNYIM","wiHrZoQ87r",
+"ogLgcLewvM","zHF1qni2v1","rz7Ut8FmFH","uPX7Gm4bxU","QWxoTQbxXc","BbwgApmeCd","QClRLVprf2","FwEJzMkgy8","Ss0ZugtCA5","LbRTH0Wr5y",
+"O3iyQEOE1o","Yf2EcSmGzv","4QMc9lH1kt","VjCZqk85Ae","1j5L8sqVrf","MK07YCNHmv","tuDySSs0Zu","iKqhrIjTwP","NcICAiwzGk","X6Pind85a9",
+"v8yFNpv0i7","QnJ1SSs0Zu","FjHXRuoStw","nlaByQ6Lix","uN6r3gdQsS","ksJbyyluBx","7ku1pFLsph","L7cGcoQ87r","fqypydQ586","Dz1R3EdBKc",
+"5ZaEz4W0Tl","lViBv0ao3l","ZhwG1ReKEW","lpF6WbgJAz","hi5X7dpe1v","lj07QnFqik","lj07Q9rlg9","uvf7AYw2oU","BCxeCv8yFN","xReecy94nw",
+"uLtKsdpe1v","WPmlxCqqaD","RzaZA4W0Tl","CxVEfdhSuH","48cHLKASQ8","KsjRK8FmFH","X6PinhUTw7","azIWpAIYUu","pFrrlXyPZN","e6e4z3otm6",
+"DG4sTa00b5","QssNCfLNg8","F6PT22TRI7","Oz8yZVIlwP","IBe8kHfyNQ","hE1QlFNYIM","MK07YMm8si","8TxD7Rxrsm","brhlQ7lUXZ","KsjRKQClRL",
+"tvdkDn1pmO","OUYuFuPX7G","9GXkXIjTwP","KsjRKiB08l","l83UdBpYhV","zHF1q0BmCy","FjHXRnlaBy","KZamHe6e4z","EdBKcMK07Y","MojnPFjHXR",
+"HP433RACuj","8FmFHgtCA5","lH1ktQ6Lix","DcpWBU3yw5","v1HlnzY1GY","M6qcGFVMxo","cmXIXprNT6","aez9yDLhzM","sqVrflweGy","29QAzJ2mQi",
+"nlaByAOgEe","taOXKWDVWJ","XflUqciuWz","TwanocQOnv","fcwDahi5X7","QClRLVerEA","CNHmv55rfB","XflUqogLgc","0Wr5y0Wr5y","uPX7GOz8yZ",
+"v2eC3RpBQm","CIShGb29RJ","jS1aj5Mg9r","hi5X70YAGH","tjQxsIRh48","uN6r3W3VFH","618DifmIK1","NcICAFFDui","4dEz6Yw2oU","FxX9q5VZjS",
+"fqypy8TxD7","48cHLCNHmv","POUYSogLgc","Yf2EczbIYY","hSSvQpv0i7","MojnPWMiS3","he9IARzaZA","LDk6fuoStw","uvf7AogLgc","qaofN580YD",
+"9GXkXnFqik","jtn0XfcwDa","m4bxUl83Ud","HfyNQW3VFH","okgRi0h1b1","AgJHQJ2mQi","jiVBPVNCPd","iwzGklH1kt","B3qemwiHrZ","QnJ1Sy94nw",
+"s4786Rxrsm","MojnPe6e4z","lsQGoDQimp","hi5X7Uvlv4","piJSkS77LH","8U2nUDG4sT","RACujSWfou","mz8gxYOfrY","wDajX2TRI7","5ZaEzatef2",
+"CxVEf8U2nU","pvgjSRsQUq","fcwDabgJAz","uPX7G8xEKz","DQimpRsQUq","JJs5mmz8gx","s93Mle6e4z","JJs5mo8Uyd","Oz8yZJXljW","M6qcGv8yFN",
+"RsQUquJScX","uTacxMm8si","SWfoulkMUA","FGzgp8xEKz","dpe1v24ARF","n1pmOW3VFH","dpe1vCfgr3","i3pyduPX7G","G1RhSDLhzM","DcpWBGrDg7",
+"oVQp616lHc","iKqhrd7vjM","SjskQWPmlx","7fsYMpAhR1","iKqhrtAOsr","uLtKsVprf2","h1zcHh1zcH","AkKTk8U2nU","lsQGoHlUbF","QbxXcuoStw",
+"AIYUu1v5hH","JRJQBGWqqX","CqqaDLbRTH","BCxeCd85a9","m4bxUrz7Ut","dQ586yToGW","3weIFhYBCK","xReeczHF1q","lXFOBWMiS3","zFgtBZzJHW",
+"dmoS7v1Hln","JkzUnguMb8","CdyBVZzJHW","FPfSEL7cGc","4QMc9ECMvU","Pb1pauJScX","L7cGclCMxy","okgRil83Ud","ksJbyC2Irc","a00b5rz7Ut",
+"kB5nPlCMxy","zQt6Q5Namm","SbRYyZUnqt","W3VFHK4GS8","AkKTkt98iW","iB08lmz8gx","ZuDtD8hJdt","9iGoTEOE1o","ogLgcRkQke","NhXduTCgPp",
+"vLsmSlViBv","VjCZqi3pyd","LDk6faFFss","ECMvUaFFss","580YDVIlwP","gjUTuDz1R3","OxWIHVprf2","cmXIXMezSW","5IhmGa00b5","0h1b1t98iW",
+"ECMvUoGu6x","QWxoTRACuj","FnPFBBpYhV","qUJMduLtKs","iwzGkprNT6","FPfSEThjNn","HRxd8pvgjS","lpF6W5iGN5","lm0pDHfyNQ","jzUqRSs0Zu",
+"qQxHPgIYvE","ZzJHWM6qcG","RzaZAYjB9t","I7p2aL7cGc","kZANmY1mC0","HfyNQMGlTF","LbRTHW3VFH","zbIYYQWxoT","Yw2oUb29RJ","CIShGLDk6f",
+"7Ow5CMK07Y","HzZT8rhl0J","OUqFM7ku1p","L7cGcfcJOy","jiVBP0Kyfs","7lUXZlj07Q","CqqaDsx5Gl","CK5W7Ta8f6","5Drn0AIYUu","618Di29QAz",
+"taOXKt59lR","AOgEe8xEKz","NhXduNhXdu","x3LDesoy9t","pv0i7jS1aj","XyPZNciuWz","blLA9SmGzv","W7cTsVNCPd","2TRI7hYBCK","5NammkZANm",
+"uvf7AB3qem","uN6r3K20wK","YOfrYU3yw5","faHirpiJSk","QnJ1SAXpwE","RxrsmQworu","Cfgr3IRh48","xXTI4NhXdu","0YAGHOHaBz","WMiS3brhlQ",
+"S2DfuP6bcg","8RCUAQChxs","gdQsSdmoS7","TwanoNcICA","FjHXRi3pyd","XyPZNGSQwj","8hJdtTCgPp","mX2GEUmaEv","Kr8yslweGy","I7p2alpF6W",
+"K20wKb29RJ","M6qcGiqv4k","14FLRBpYhV","yEfy9O3iyQ","IKxdLhE1Ql","Uvlv4FnPFB","fmIK1S2Dfu","16lHcHfyNQ","YOfrYWmadA","QWxoTuZPqg",
+"5Namm5ZaEz","CIShG7Ow5C","5Drn0zQt6Q","xXTI4aFFss","8xEKzn1pmO","hYBCKJKWYR","pT8wuni2v1","SbRYy5Mg9r","ogLgcZv7z0","jfREuVIlwP",
+"BGaQYd7vjM","S2DfuuTacx","iwzGkBGaQY","TXQ0ZhYBCK","7fsYMoQ87r","64s8Nv2eC3","Mkgy83weIF","rKDLJi7WMQ","dmoS7PYBf4","IBe8kOHaBz",
+"FPfSEMaJQs","qaofNkZANm","AgJHQzz4ZU","vOqCEd85a9","YOfrY8TxD7","WmadAksJby","8RCUAEOE1o","HP43314FLR","G1RhSblLA9","qaofN2hEEU",
+"5nmWvFGzgp","FNYIM8hJdt","9GXkXMm8si","s7MxkM6qcG","24ARFnlaBy","oVQp6taOXK","48cHL3weIF","W3VFHBpYhV","uupzkW7cTs","Pb1palH1kt",
+"okgRiQClRL","nFqikdpe1v","vOqCE8RCUA","0YAGHThjNn","fcwDa0ao3l","LbRTHi3pyd","jiVBPFFDui","lsQGoh1zcH","ThjNnQworu","QbxXcpAhR1",
+"zFgtBO3iyQ","BbwgAAmdQd","azIWpZUnqt","0h1b1dQ586","Chuy37hyVv","FwEJzix74r","P6bcg7ku1p","WMiS30ao3l","LDk6fMK07Y","CK5W7M6qcG",
+"Pb1pab29RJ","0PktI8U2nU","NOHszQssNC","nnP8oBCxeC","jzUqRIjTwP","POUYSDcpWB","J2mQiuN6r3","JJs5mtAOsr","BGaQY9eoRc","AOgEehUTw7",
+"tlILt6AFT0","Cfgr3Nxx9V","tvdkDU3yw5","EdBKcBFkb8","M6qcGLbRTH","l83UdVBjhz","v1HlnU3yw5","QChxszbIYY","S2DfufLNg8","8U2nUiKqhr",
+"F6PT2BCxeC","3weIFVBjhz","GSQwjksJby","6q6L9FGzgp","fcwDakZANm","GrDg7YOfrY","lsQGoguMb8","55rfBsuY4x","FcWrWLewvM","ulk41VLTy6",
+"VNCPdOHaBz","aDGtSatef2","5IhmGWPmlx","MGlTFAXpwE","S77LHCxVEf","pv0i7KZamH","o8Uyds7Mxk","aFFssNOHsz","7lUXZ24ARF","taOXK2DREs",
+"X6PinFxX9q","GrDg7tjQxs","NOHszpT8wu","v1HlnOz8yZ","ciuWzqaofN","UlU3M8U2nU","SjskQaL6AJ","KZamHdpe1v","HRxd8WreyP","4W0TlyofH3",
+"2Yz7EgIYvE","FjHXR14FLR","9iGoTCIShG","S77LH5nmWv","uTacxtjQxs","48cHL1LB1L","lViBvqUJMd","fqypylsQGo","tjQxsVBjhz","Waim6ciuWz",
+"xReecn1pmO","v8yFNYf2Ec","07n1ccShY2","dhSuHguMb8","AXpwEzFgtB","lj07Q1j5L8","Ta8f6aFFss","hYBCKl83Ud","6AFT0gIYvE","b29RJBpYhV",
+"VLTy6VIlwP","KsjRKd7vjM","dpe1vMm8si","h1zcHUlU3M","07n1cWPmlx","fqypyuN6r3","1LB1Lni2v1","xXTI4v2eC3","64s8N618Di","iqv4kgIYvE",
+"VNCPdwDajX","uZPqglViBv","NhXduZUnqt","No0Qb1j5L8","Z4I1vaDGtS","24ARFqaofN","7ku1pcL0aE","yvOMIAIYUu","7ku1pCK5W7","WaWsvQ6hMC",
+"RACujpv0i7","Yw2oUAIYUu","0Wr5yYOfrY","F6PT2HzZT8","G1RhS8hJdt","9GXkXCIShG","M3zXLpAhR1","XyPZNKsjRK","9eoRcFNYIM","o8Uydd85a9",
+"CK5W7K4GS8","yEfy95drc6","bgJAzOHaBz","4dEz6Fhtgl","CxVEfKr8ys","Fhtgl4QMc9","QWxoTIRh48","yToGW24ARF","uN6r3d7vjM","o8Uyd5iGN5",
+"lweGyIRh48","M6qcG14FLR","rhl0JlH1kt","oQ87rRsQUq","VLTy6jiVBP","JRJQBcL0aE","618DiO3iyQ","Pb1paIn3NS","55rfBVjCZq","blLA9guMb8",
+"1LB1LlH1kt","BpYhVQYxC0","U3yw5FxX9q","aFFssBFkb8","fmIK1IjTwP","2DREsCIShG","pAhR1Q6hMC","VNCPdIjTwP","nlaByW7cTs","1j5L85Mg9r",
+"0MR5Xtl72W","VNCPdZhwG1","KZamHazIWp","DcpWBZv7z0","pmeCduupzk","MezSWXflUq","brhlQNhXdu","h1zcH5nmWv","BFkb814FLR","b29RJXflUq",
+"8U2nUxReec","4W0Tl0Wr5y","5drc6t59lR","m4bxUv2eC3","CK5W7jtn0X","zqH0WFnPFB","Yw2oUDLhzM","fqypyHzZT8","qUJMdFhtgl","lpF6WF6PT2",
+"BFkb8D6rBy","QChxs8RCUA","FLsph5nmWv","RpBQmydG8U","JIqXiJKWYR","lsQGojiVBP","8cVD3WDVWJ","ZJTXH9iGoT","5iGN5HzZT8","Zv7z0dpe1v",
+"iB08l5IhmG","29QAzfmIK1","5Drn0MojnP","AkKTk55rfB","d85a9oVQp6","BpYhV7ku1p","AIYUufcwDa","qaofNW3VFH","pmeCdZv7z0","zbIYYhYBCK",
+"XflUqdjsrv","5VZjS8FmFH","Yh1hFFhtgl","EoToPDz1R3","vLsmSKASQ8","Cp3mZ8FmFH","NAFuwatef2","yvOMIm4bxU","lm0pDZuDtD","YjB9tVjCZq",
+"FcWrWRBhp0","lm0pDMmKGJ","mX2GEFwEJz","uLtKszqH0W","Vprf2CNHmv","wiHrZY1mC0","Yf2EcqaofN","hE1QlaFFss","zHF1qt59lR","zFgtBEoToP",
+"lm0pDd7vjM","K4GS8JJs5m","JJs5mNAFuw","EoToPChuy3","580YDatef2","o8UydQssNC","JKWYRsuY4x","zFgtBLDk6f","CNHmvQ6Lix","m4bxU2hEEU",
+"rKDLJgtCA5","he9IAFcWrW","2hEEU2Nslm","Zv7z0t98iW","ksJbyWaim6","t98iWMaJQs","jiVBPlH1kt","2TRI7lm0pD","mX2GEyofH3","OUqFMRpBQm",
+"5VZjSI7p2a","uJScXIRh48","vLsmSfqypy","O3iyQqaofN","7X3uyhe9IA","FLsphUl4a1","SmGzvNo0Qb","lViBvh1zcH","iwzGkfmIK1","piJSkXflUq",
+"GrDg7lpF6W","FVMxo1v5hH","55rfB5ZaEz","RBhp0xciqp","NOHszt59lR","QssNCNAFuw","JIqXiAmdQd","8TxD7zz4ZU","GWqqXJJs5m","XyPZNzz4ZU",
+"24ARF7lUXZ","8U2nU6q6L9","FcWrWfcwDa","16lHchYBCK","FNYIMF6PT2","GrDg7RpBQm","fcwDaciuWz","8FmFHZ4I1v","MK07Y6AFT0","2TRI7tlILt",
+"7ku1puoStw","RzaZAWaim6","d85a9euZA5","CNHmv2Yz7E","14FLROUYuF","LewvMiqv4k","WPmlxFFDui","hSSvQVLTy6","tvdkD9y4lw","Dz1R3FGzgp",
+"YOfrY5drc6","tvdkDmz8gx","tlILtM6qcG","ogLgcDz1R3","4QMc9Uvlv4","Cfgr3O3iyQ","BFkb8VIlwP","ZhwG1IBe8k","M6qcGe6e4z","5Drn0WmadA",
+"IBe8k4QMc9","cL0aEHzZT8","t59lRIn3NS","k85AemX2GE","5nmWvDcpWB","lm0pDs4786","ogLgcguMb8","he9IA9y4lw","uPX7GlsQGo","sx5GlW7cTs",
+"8cVD3s7Mxk","guMb8K4GS8","64s8Nuupzk","W7cTszQt6Q","Chuy3hi5X7","580YD5VZjS","WmadACIShG","5drc6lsQGo","ogLgcyluBx","d7vjMtAOsr",
+"vkCHHfLNg8","DLhzMdhSuH","tjQxst98iW","wDajXfLNg8","uJScXWreyP","EOE1opAhR1","5Mg9r8FmFH","BCxeC2TRI7","uoStwGXdoH","x3LDeVNCPd",
+"YOfrY6q6L9","1j5L87X3uy","Uvlv4AOgEe","hE1QlTXQ0Z","O3iyQPYBf4","Zv7z0Vprf2","jSjS3xReec","yEfy97Ow5C","ydG8Umz8gx","QWxoTtaOXK",
+"faHirWaim6","VNCPdZuDtD","Ta8f6bgJAz","yEfy9tAOsr","lweGySmGzv","gjUTuMojnP","OxWIHRxrsm","C2IrcWaWsv","kZANmStlDJ","FwEJzpFrrl",
+"OxWIHyofH3","VBjhzgf8rI","Chuy3iwzGk","64s8NksJby","2ZHdkkB5nP","SWfou14FLR","EdBKcAXpwE","pT8wuuLtKs","07n1cFNYIM","yToGWxXTI4",
+"n8pJ9uJScX","aFFsszqH0W","oGu6xAXpwE","5IhmGuAWyp","BbwgAv2eC3","PYBf4fcwDa","WPmlxl83Ud","RpBQmHlUbF","9y4lwjzUqR","Cfgr3t59lR",
+"djsrvtAOsr","e6e4zulk41","uN6r3B3qem","GrDg7b29RJ","580YDM3zXL","n8pJ9xciqp","8RCUAfqypy","OUYuFCK5W7","x3LDeMm8si","8xEKzzbIYY",
+"e6e4zcShY2","lXFOB9GXkX","L7cGchYBCK","hUTw7QWxoT","RxrsmfFDrJ","9eoRcSjskQ","9eoRc2Nslm","CqqaDtjQxs","24ARFDQimp","zqH0WDG4sT",
+"O3iyQsx5Gl","kB5nPbgJAz","jzUqRrz7Ut","s7MxksuY4x","gdQsS24ARF","XyPZN4W0Tl","oQ87r2DREs","cQOnvtuDyS","guMb8lweGy","n1pmOHlUbF",
+"WaWsvd85a9","RkQkexXTI4","QworucShY2","KZamHRkQke","tl72WnlaBy","MaJQstvdkD","EOE1oGXdoH","bZLvSzFgtB","ix74r8hJdt","No0QbQ6hMC",
+"CK5W7YjB9t","YjB9tv1Hln","S77LHI7p2a","bgJAzAkKTk","QChxsZUnqt","CdyBVL7cGc","lXFOBuZPqg","oQ87ruLtKs","JXljW48cHL","fcJOyx3LDe",
+"8U2nUgjUTu","lViBvix74r","atef2MaJQs","FjHXR9y4lw","uQIczU3yw5","M3zXLSmGzv","uupzkuoStw","AXpwE29QAz","tuDySn1pmO","hYBCKwiHrZ",
+"8hJdtWaWsv","brhlQ3weIF","RsQUqiqv4k","uTacxuPX7G","aDGtS5ZaEz","piJSkFjHXR","CxVEfpFrrl","B3qem4QMc9","8hJdtCqqaD","GSQwjiqv4k",
+"lViBvUl4a1","hSSvQgtCA5","WPmlx29QAz","M3zXLt59lR","9rlg9t59lR","lCMxylpF6W","nFqik8hJdt","yToGWJRJQB","ZUnqttaOXK","lCMxy0MR5X",
+"F6PT2Mkgy8","nnP8oReKEW","BbwgA0MR5X","Ss0ZuQworu","5ZaEza00b5","U3yw56AFT0","gjUTu5iGN5","X6PinsqVrf","64s8NtaOXK","2Yz7EJKWYR",
+"ciuWzwiHrZ","cL0aEUlU3M","9y4lw8cVD3","VNCPdgf8rI","SjskQblLA9","okgRiuJScX","zY1GYMezSW","pvgjSix74r","BbwgAPYBf4","GSQwjIn3NS",
+"2hEEUzY1GY","4QMc9lXFOB","aL6AJoQ87r","VjCZq2TRI7","ZhwG1X6Pin","b29RJ2Nslm","pT8wuyvOMI","VIlwPlXFOB","fFDrJWPmlx","RkQkeiqv4k",
+"pT8wuFcWrW","nnP8oRzaZA","blLA9oQ87r","KsjRKRzaZA","8U2nUAgJHQ","ZzJHW24ARF","9iGoTRpBQm","NOHsztaOXK","KASQ8yEfy9","Vprf2AgJHQ",
+"wiHrZCdyBV","W7cTsuQIcz","BCxeCZhwG1","9rlg945cIH","ru4UGQ6Lix","9XyT9Z4I1v","JkzUnMkgy8","euZA59GXkX","NhXdumX2GE","jzUqRciuWz",
+"RzaZAY1mC0","pmeCdLewvM","qUJMdW3VFH","tAOsraL6AJ","0KyfspWiOs","FnPFBRBhp0","piJSkzFgtB","JIqXiDcpWB","P6bcgCK5W7","uLtKslsQGo",
+"tlILtMmKGJ","iwzGk2Nslm","Fhtgl0PktI","VNCPdMK07Y","uAWypciuWz","hYBCKFPfSE","FwEJzVBjhz","s4786okgRi","xXTI4i7WMQ","Oz8yZ7Ow5C",
+"4QMc9nnP8o","fLNg8QClRL","CIShGX6Pin","tvdkDAOgEe","UlU3MFGzgp","MmsIoG1RhS","YjB9tix74r","QnJ1S1v5hH","HP433rz7Ut","Y1mC0RACuj",
+"2ZHdklkMUA","jS1aj5ZaEz","ulk41YOfrY","7X3uyTwano","BpYhVZhwG1","d7vjMEoToP","oVQp6NhXdu","zY1GYoVQp6","QnJ1ShE1Ql","jzUqRZhwG1",
+"7ku1pGWqqX","suY4xBbwgA","StlDJReKEW","QYxC0Pb1pa","zz4ZUMkgy8","QbxXcMkgy8","TwanozQt6Q","hi5X7B3qem","xciqpIBe8k","9rlg9FwEJz",
+"oVQp6No0Qb","tvdkDuvf7A","pmeCdKASQ8","0h1b1dhSuH","atef2FwEJz","ni2v1piJSk","prNT6ogLgc","lweGyuZPqg","No0QbVIlwP","h1zcHcmXIX",
+"JIqXis4786","euZA5gf8rI","zQt6QFxX9q","Mkgy8SbRYy","5ZaEztlILt","SWfouMezSW","Cp3mZL7cGc","y94nwtl72W","mz8gxx3LDe","OUqFM5Namm",
+"LewvMDG4sT","pFrrlPb1pa","S2Dfus4786","vLsmSCK5W7","uZPqgDcpWB","zY1GYzz4ZU","s4786AOgEe","zqH0WMK07Y","IKxdLRzaZA","ZhwG1guMb8",
+"MojnPgf8rI","blLA94dEz6","Mkgy8OHaBz","J2mQi29QAz","uTacxVNCPd","iB08l07n1c","n1pmOyluBx","LbRTH48cHL","X6PinaFFss","OxWIHFLsph",
+"aez9yxXTI4","3weIFdjsrv","7X3uyOUYuF","EOE1oDcpWB","BCxeCMm8si","suY4xSjskQ","RsQUqgf8rI","2DREsSjskQ","CK5W7XyPZN","Q6hMCm4bxU",
+"uTacxzQt6Q","9eoRcokgRi","ciuWzhi5X7","piJSkFGzgp","okgRijtn0X","mX2GEOxWIH","suY4xHzZT8","Mkgy8k85Ae","HP433G1RhS","JkzUnVLTy6",
+"3otm6ECMvU","55rfBIjTwP","jiVBPxReec","FGzgpt59lR","uJScXcL0aE","HlUbFjSjS3","LDk6fVLTy6","YjB9tbgJAz","S2DfuBFkb8","yluBxFxX9q",
+"Uvlv4s4786","FLsphAkKTk","24ARF8hJdt","FxX9qvkCHH","GWqqXG1RhS","lweGyuvf7A","XyPZNfcJOy","dmoS7Uvlv4","JkzUniwzGk","vLsmSt59lR",
+"wDajXGSQwj","hE1QlCp3mZ","suY4xJkzUn","bZLvSuTacx","L7cGci3pyd","tlILtgf8rI","CIShGP6bcg","RxrsmIKxdL","v8yFNfcJOy","hE1QlsqVrf",
+"ThjNnbgJAz","ksJbyY1mC0","zQt6Q64s8N","lH1ktulk41","soy9ts7Mxk","WaWsv5Drn0","7X3uyvOqCE","6AFT0GXdoH","yofH37fsYM","aL6AJJKWYR",
+"0Wr5yNxx9V","QYxC0v2eC3","sqVrfzY1GY","ix74rJRJQB","DLhzMuvf7A","pWiOsgtCA5","qaofNgf8rI","guMb8ZhwG1","8TxD7vkCHH","16lHcjzUqR",
+"uupzka00b5","WMiS3pv0i7","8RCUAfcJOy","RkQkeulk41","zQt6Q7ku1p","G1RhSyEfy9","BGaQY5IhmG","qaofN1v5hH","Waim6QClRL","pFrrlBGaQY",
+"MmsIoFjHXR","i3pydVBjhz","S77LHZhwG1","No0QbFVMxo","rKDLJ9GXkX","tvdkD7X3uy","F6PT2m4bxU","ZUnqtn1pmO","tAOsrQYxC0","vkCHHnFqik",
+"FNYIMnnP8o","8U2nUfcJOy","LewvM2Nslm","K20wKQChxs","0Wr5ylCMxy","0BmCyix74r","t59lRNhXdu","C2Ircfqypy","mX2GEMGlTF","d85a9wiHrZ",
+"pAhR19eoRc","uZPqgnnP8o","QnJ1SCdyBV","KZamH5drc6","9y4lwZuDtD","2TRI79rlg9","2DREsFwEJz","sx5GlbZLvS","bgJAz4W0Tl","JkzUnNcICA",
+"DG4sTrhl0J","QssNCX6Pin","2TRI77fKYU","JXljWpFrrl","XflUqYOfrY","aFFssXyPZN","atef28hJdt","In3NSh1zcH","k85AeAOgEe","zz4ZUiKqhr",
+"0ao3la00b5","8U2nUcL0aE","nFqikFhtgl","xXTI4FFDui","4W0TlQssNC","Mkgy83otm6","FGzgpStlDJ","TwanoIRh48","ix74ruAWyp","OUqFM9eoRc",
+"gtCA5AgJHQ","B3qemrKDLJ","45cIH1LB1L","ydG8UtAOsr","t98iWWDVWJ","0YAGHpAhR1","Yw2oUTXQ0Z","bgJAzHfyNQ","NcICAUmaEv","RxrsmSmGzv",
+"9iGoTQssNC","uvf7APb1pa","9eoRcYOfrY","LbRTHhi5X7","he9IAsoy9t","lViBvb29RJ","VNCPdx3LDe","d7vjMDQimp","Fhtglru4UG","bgJAzwiHrZ",
+"RsQUqxReec","POUYSC2Irc","nFqikRACuj","rKDLJS2Dfu","CNHmvzqH0W","L7cGcFGzgp","2NslmSjskQ","hYBCKgjUTu","qUJMdbZLvS","tl72WpT8wu",
+"8TxD7fFDrJ","pFrrlWreyP","brhlQVIlwP","WaWsvfaHir","aez9y6AFT0","5ZaEzFLsph","cL0aEgtCA5","D6rByZhwG1","GWqqXguMb8","lsQGoU3yw5",
+"Oz8yZ3weIF","In3NSBbwgA","7lUXZIn3NS","jtn0XIn3NS","MmsIookgRi","JJs5mCdyBV","dhSuHcL0aE","pmeCdcQOnv","WaWsvFFDui","bZLvSv1Hln",
+"45cIHx3LDe","UlU3MSmGzv","dQ586CqqaD","0Wr5yAXpwE","ThjNndhSuH","ix74rVIlwP","uvf7ARmDcr","pvgjSsoy9t","J2mQidhSuH","fLNg8vOqCE",
+"xReecAgJHQ","IKxdLDQimp","WDVWJbrhlQ","M6qcGSjskQ","yofH3o8Uyd","ZuDtDRkQke","ZhwG16AFT0","Nxx9VW7cTs","sx5GlQworu","NOHszAmdQd",
+"Oz8yZaFFss","FGzgpnFqik","AmdQdhSSvQ","suY4xBpYhV","SmGzv07n1c","TCgPpDcpWB","lViBvQYxC0","uJScXIKxdL","vLsmSvkCHH","djsrvC2Irc",
+"ZzJHWOxWIH","BFkb845cIH","9eoRcdhSuH","ZuDtDAXpwE","7ku1pa00b5","ECMvUbgJAz","lweGyQYxC0","RxrsmReKEW","HP433JXljW","Ss0ZuNhXdu",
+"vkCHHMmsIo","jS1ajQbxXc","h1zcHFcWrW","lpF6WwiHrZ","LewvMFhtgl","rKDLJfqypy","fLNg8oQ87r","ulk41yluBx","QbxXci7WMQ","48cHLQworu",
+"fcJOy3otm6","GWqqXprNT6","hi5X7zqH0W","AOgEel83Ud","BGaQYpmeCd","FGzgpcL0aE","Uvlv47X3uy","IRh48jS1aj","5drc6VjCZq","JKWYR5IhmG",
+"BGaQYtAOsr","IKxdLVerEA","tl72WksJby","Vprf2IBe8k","QssNCZ4I1v","gdQsSZhwG1","bgJAzuTacx","lsQGoThjNn","4QMc9tvdkD","S77LHPb1pa",
+"POUYSvkCHH","UlU3M4dEz6","djsrvBbwgA","Uvlv4GXdoH","Uvlv4uvf7A","pv0i764s8N","vkCHHlkMUA","rhl0JFhtgl","OHaBzzqH0W","vkCHHQssNC",
+"lj07QYjB9t","wiHrZZuDtD","FxX9qFFDui","y94nwYh1hF","qaofNeuZA5","tAOsrfaHir","ix74rChuy3","1LB1L7X3uy","CxVEft59lR","CNHmvEOE1o",
+"FcWrWMmKGJ","KsjRKtaOXK","ksJbyVerEA","I7p2ai3pyd","NcICA0MR5X","Oz8yZQbxXc","pv0i7MezSW","zbIYYzY1GY","zFgtBBGaQY","CxVEf1LB1L",
+"RkQkeOUYuF","5Mg9r0YAGH","QworufcJOy","Uvlv4pmeCd","ZJTXHP6bcg","h1zcHRkQke","9rlg9Mm8si","a00b5AOgEe","7hyVvsx5Gl","hi5X7vkCHH",
+"M3zXLYw2oU","29QAz8xEKz","FPfSEFNYIM","xReecx3LDe","uupzkfLNg8","blLA9pWiOs","brhlQfLNg8","vLsmSNAFuw","Oz8yZjiVBP","D6rBy7fsYM",
+"yvOMIe6e4z","dQ586zqH0W","Mkgy8fqypy","GrDg7cL0aE","7hyVvlsQGo","uN6r3GWqqX","aez9ypAhR1","WDVWJix74r","aez9yblLA9","tlILtZuDtD",
+"YjB9tPOUYS","KsjRKVBjhz","pT8wul83Ud","I7p2aThjNn","Kr8yslViBv","AmdQdcmXIX","sqVrfd7vjM","t59lR4dEz6","HfyNQBGaQY","SWfouIBe8k",
+"ciuWzjzUqR","5VZjSbrhlQ","RkQkesuY4x","Cp3mZFFDui","AmdQd9y4lw","Yh1hFJKWYR","TXQ0ZJRJQB","lCMxyJIqXi","ogLgccShY2","yofH3IBe8k",
+"8xEKzIRh48","1j5L8WMiS3","HRxd8Gv3Fq","RpBQmBCxeC","HP433AOgEe","tAOsrFLsph","nnP8osuY4x","ydG8U5iGN5","J2mQii3pyd","t98iWLbRTH",
+"LewvMpiJSk","fqypyCNHmv","AkKTkciuWz","v1HlnP6bcg","pmeCdbZLvS","0MR5XpWiOs","7fKYUrhl0J","29QAz9eoRc","NcICAzqH0W","AXpwEkZANm",
+"MK07YRzaZA","xReec5VZjS","lsQGoNo0Qb","FcWrWP6bcg","MmsIouTacx","d85a9y94nw","29QAzmX2GE","7X3uyAXpwE","yvOMItvdkD","fcwDas93Ml",
+"jiVBPbZLvS","7ku1pciuWz","7hyVvD6rBy","WaWsvJIqXi","OxWIHzbIYY","DcpWBYh1hF","pvgjSCp3mZ","JkzUnM3zXL","yofH32TRI7","M6qcGM3zXL",
+"nlaByGrDg7","Z4I1vFcWrW","HP433jeskS","7lUXZjSjS3","FGzgpUvlv4","n8pJ9wDajX","AIYUuQChxs","pT8wuSWfou","OHaBzni2v1","EOE1ozQt6Q",
+"kB5nPOxWIH","2Yz7Et59lR","tAOsrBpYhV","ru4UG14FLR","AkKTkQChxs","gjUTuzz4ZU","RpBQmpiJSk","lsQGo29QAz","oVQp6atef2","yofH3BbwgA",
+"5Mg9ro8Uyd","BCxeCQssNC","uQIczMmKGJ","gdQsSFjHXR","ciuWzRkQke","he9IAJJs5m","FVMxozbIYY","0YAGHCfgr3","LDk6f9y4lw","AOgEe2Nslm",
+"NhXdu0ao3l","wiHrZaez9y","QbxXcYjB9t","s7MxkWaim6","X6PinRmDcr","bgJAztuDyS","atef24W0Tl","LewvMGv3Fq","CxVEf7hyVv","yofH3fcwDa",
+"I7p2a5Drn0","LewvMcShY2","s93MlNxx9V","uN6r3IKxdL","LDk6fuTacx","pmeCd2TRI7","BpYhVMm8si","fcJOy5iGN5","zbIYYdpe1v","uLtKsBpYhV",
+"dhSuHWmadA","S2DfuD6rBy","VLTy6FVMxo","atef248cHL","EdBKctAOsr","l83Udatef2","ciuWzni2v1","0BmCyYOfrY","l83UdSs0Zu","7hyVvqQxHP",
+"8hJdtYjB9t","uupzk24ARF","oQ87r7hyVv","mz8gx14FLR","2NslmzFgtB","tjQxsQ6hMC","v8yFN5ZaEz","EOE1olj07Q","5ZaEzfmIK1","14FLR4dEz6",
+"K4GS8VNCPd","Kr8ysM6qcG","RBhp0HlUbF","hUTw716lHc","oGu6xOUqFM","aez9yvOqCE","C2IrcVNCPd","No0Qb0h1b1","uJScXJKWYR","MGlTFEdBKc",
+"64s8NFVMxo","uTacxxciqp","5IhmGFFDui","VNCPd4QMc9","lm0pDlweGy","wDajXQbxXc","v2eC3yToGW","W7cTsfqypy","Cfgr3xReec","QnJ1S2Yz7E",
+"zz4ZUogLgc","wiHrZiqv4k","fmIK1DQimp","CqqaDFnPFB","Yf2EcU3yw5","gtCA5VerEA","14FLRhYBCK","QYxC0lj07Q","tvdkDGSQwj","VerEAeuZA5",
+"XyPZN0Kyfs","5Drn0Ta8f6","OHaBzRmDcr","xciqpJXljW","nnP8od7vjM","pAhR1VerEA","AOgEe7X3uy","5NammfLNg8","BGaQYhi5X7","FwEJzYf2Ec",
+"J2mQiCNHmv","ReKEWjeskS","s7MxkksJby","VjCZqUvlv4","mX2GEJkzUn","bZLvS9rlg9","uAWypSmGzv","brhlQ5Namm","NOHsz3weIF","CqqaDDLhzM",
+"wDajXYOfrY","azIWpP6bcg","FcWrWt98iW","prNT69y4lw","azIWpRxrsm","zmLYDPb1pa","tAOsrTa8f6","9XyT9h1zcH","0ao3lFxX9q","55rfBh1zcH",
+"guMb88FmFH","XflUqCNHmv","hUTw7Mm8si","8RCUATXQ0Z","v8yFNy94nw","CqqaD1LB1L","xXTI4MezSW","SbRYypT8wu","QWxoTOHaBz","n8pJ95ZaEz",
+"faHirhE1Ql","B3qem0PktI","CdyBVCIShG","S77LHuQIcz","S77LH5drc6","n1pmOTCgPp","64s8NVBjhz","JJs5m4dEz6","dpe1v1j5L8","XflUqMm8si",
+"h1zcHSjskQ","gf8rItuDyS","9GXkXuZPqg","OUqFMdpe1v","7fKYUtvdkD","pAhR1lkMUA","i7WMQZzJHW","CqqaD0ao3l","lXFOBpmeCd","EoToPPYBf4",
+"ThjNnt98iW","VBjhzoVQp6","FLsphjS1aj","IKxdL2Nslm","d7vjMCNHmv","WmadACdyBV","yToGWY1mC0","5Drn09y4lw","gtCA5t98iW","ru4UGhE1Ql",
+"jzUqRY1mC0","64s8NC2Irc","C2IrcyToGW","cL0aEBGaQY","S77LHWreyP","8U2nUjtn0X","k85AeWPmlx","HRxd85VZjS","FLsphZUnqt","Zv7z0VjCZq",
+"9rlg9xReec","iKqhrqQxHP","o8UydYjB9t","okgRijiVBP","rz7UtNAFuw","1LB1LSWfou","XflUq9y4lw","pvgjSStlDJ","D6rBy0Wr5y","mX2GEtjQxs",
+"QChxsh1zcH","YjB9tFjHXR","7ku1pokgRi","wiHrZ0ao3l","NcICAS2Dfu","7Ow5CsuY4x","TXQ0Z4dEz6","L7cGcdhSuH","XflUqmz8gx","0Wr5yprNT6",
+"07n1cChuy3","WMiS38U2nU","JIqXiyluBx","RpBQmhUTw7","he9IAmX2GE","FPfSEvOqCE","DG4sTOHaBz","3weIFqUJMd","55rfBuPX7G","2Yz7EoVQp6",
+"aDGtScmXIX","bgJAzhi5X7","Ul4a1FxX9q","uQIczBbwgA","xReecDG4sT","dQ586pmeCd","zQt6QokgRi","HfyNQuoStw","rKDLJaez9y","YjB9tprNT6",
+"ciuWzxReec","0PktI2TRI7","zHF1qnnP8o","fqypyvLsmS","FFDui4W0Tl","UmaEv618Di","EdBKc5VZjS","qUJMdyToGW","IKxdLJJs5m","e6e4zTwano",
+"hUTw78TxD7","ix74rBFkb8","bZLvSk85Ae","dpe1vwDajX","2ZHdkO3iyQ","IKxdLXyPZN","618Difqypy","29QAz2Yz7E","55rfBlH1kt","48cHLru4UG",
+"FxX9qZuDtD","ZzJHWiwzGk","P6bcgI7p2a","pWiOs48cHL","n1pmO07n1c","VjCZqvLsmS","8U2nUeuZA5","JJs5ms93Ml","2Nslm5ZaEz","tlILtblLA9",
+"8U2nU07n1c","GWqqXyToGW","cmXIXwiHrZ","fLNg85VZjS","AkKTkPb1pa","ZhwG1ydG8U","Ss0ZuNOHsz","0ao3luJScX","dmoS7blLA9","Yh1hFTwano",
+"zQt6QFhtgl","atef2F6PT2","AIYUuvLsmS","sqVrf8U2nU","07n1clkMUA","jS1ajSs0Zu","3otm6s4786","lkMUA4QMc9","S77LHvOqCE","NhXdu8U2nU",
+"atef2NAFuw","jfREuZ4I1v","zqH0WtjQxs","TXQ0ZVIlwP","6AFT0Vprf2","XflUqChuy3","LewvMoVQp6","Ul4a1W3VFH","UlU3MQYxC0","9eoRcciuWz",
+"hSSvQU3yw5","uQIczOHaBz","fcwDa24ARF","WreyPtvdkD","6AFT0Chuy3","55rfBpFrrl","ZhwG1StlDJ","S77LHhUTw7","8U2nUdmoS7","d7vjMRpBQm",
+"hUTw7WDVWJ","9rlg9QnJ1S","zz4ZUxReec","RzaZAyEfy9","l83UdYw2oU","Rxrsm0YAGH","fcwDabrhlQ","K4GS82hEEU","0PktIDcpWB","2Nslm0YAGH",
+"vLsmSJRJQB","jtn0XgIYvE","nnP8o5Namm","0h1b15drc6","5nmWvFxX9q","CxVEfZv7z0","hSSvQYh1hF","okgRiZ4I1v","gjUTuVprf2","d85a9vkCHH",
+"lH1ktni2v1","7X3uyvLsmS","BCxeCqQxHP","aDGtSfFDrJ","cL0aEMmsIo","lweGyfaHir","xciqppiJSk","hYBCKatef2","pFrrlvkCHH","BFkb86q6L9",
+"xciqpUlU3M","45cIH5VZjS","MojnPoGu6x","ZUnqts7Mxk","JRJQBBbwgA","dhSuHlH1kt","nnP8o0MR5X","tl72WvLsmS","QChxsdjsrv","NAFuwAgJHQ",
+"9XyT9EoToP","WaWsvXyPZN","2DREstlILt","55rfBCNHmv","gdQsSSmGzv","QWxoTwiHrZ","WaWsvpmeCd","jzUqR2Yz7E","14FLRKZamH","v2eC39XyT9",
+"VjCZqlm0pD","fFDrJLDk6f","StlDJnFqik","wiHrZ9XyT9","0MR5XwiHrZ","TCgPpAmdQd","YjB9tTXQ0Z","In3NSJ2mQi","mz8gxQworu","Kr8ysbrhlQ",
+"GXdoHx3LDe","Pb1pad7vjM","prNT6CxVEf","FxX9qm4bxU","RxrsmOUYuF","VLTy60ao3l","bgJAz2Nslm","wiHrZ0BmCy","lm0pDFjHXR","W3VFH2TRI7",
+"d85a9U3yw5","a00b5aez9y","S77LHOxWIH","RxrsmaFFss","hSSvQFcWrW","i7WMQuupzk","uTacx7ku1p","BpYhVjSjS3","m4bxU6q6L9","lH1ktQbxXc",
+"3weIFMezSW","4QMc9Ul4a1","uPX7GsuY4x","lm0pD9iGoT","nlaBy5nmWv","CdyBVMm8si","lCMxyDG4sT","cL0aE48cHL","1j5L8Vprf2","2ZHdk16lHc",
+"5Drn0aL6AJ","qQxHPSs0Zu","tl72WfcJOy","C2IrcgIYvE","nnP8o4W0Tl","XyPZNQssNC","xReecU3yw5","Kr8ysn1pmO","lsQGoSs0Zu","Yf2EcyluBx",
+"PYBf4s4786","uvf7AJkzUn","atef2tlILt","MGlTFFPfSE","rz7Utx3LDe","IRh48l83Ud","WaWsvWPmlx","CxVEfrKDLJ","s7MxkFLsph","FhtglQ6Lix",
+"hSSvQQnJ1S","gtCA5bgJAz","AOgEeStlDJ","Waim6brhlQ","MK07YBFkb8","FPfSEtaOXK","cShY2ru4UG","wDajXhe9IA","Dz1R3LDk6f","Pb1paiB08l",
+"YOfrYRBhp0","EoToP7fKYU","cShY2bgJAz","ydG8UMm8si","OUYuFd7vjM","LbRTHZJTXH","5drc6pT8wu","POUYSMezSW","pFrrlHfyNQ","SbRYyEdBKc",
+"lViBvmX2GE","4QMc9tlILt","jtn0XjfREu","xciqpZhwG1","P6bcgv1Hln","7Ow5Ct98iW","OUqFMNAFuw","atef264s8N","qaofNuQIcz","hSSvQECMvU",
+"VjCZqCxVEf","hYBCKCdyBV","XyPZNIjTwP","vLsmSX6Pin","K4GS82ZHdk","0PktIWmadA","lm0pDazIWp","yToGWQworu","JXljWzmLYD","nFqikQ6Lix",
+"2ZHdkFNYIM","jfREuG1RhS","e6e4zd85a9","uoStwWreyP","ZuDtDlCMxy","iKqhrzqH0W","FGzgpd7vjM","Ta8f6azIWp","ni2v1BFkb8","ZhwG1jSjS3",
+"TwanoiB08l","DQimpru4UG","oGu6xNAFuw","DG4sTe6e4z","t59lRqaofN","SWfouFcWrW","nlaByIn3NS","aL6AJtAOsr","uN6r3zbIYY","nnP8olCMxy",
+"zY1GY2hEEU","QworuWaim6","AgJHQuN6r3","GSQwjrz7Ut","pT8wuiqv4k","t98iWCdyBV","EoToPJXljW","sx5Gl64s8N","45cIHhi5X7","zz4ZUuZPqg",
+"sqVrfQbxXc","jzUqRRBhp0","KASQ8gIYvE","v2eC3JIqXi","vLsmSiKqhr","Cp3mZThjNn","K4GS8BFkb8","5VZjSChuy3","OUqFMhe9IA","uoStwcmXIX",
+"WmadAuTacx","9rlg9ydG8U","HRxd8OUYuF","mX2GEfcwDa","O3iyQAgJHQ","64s8Nv8yFN","XflUqBFkb8","zqH0WMaJQs","F6PT2M3zXL","W7cTs8FmFH",
+"KZamHzmLYD","oGu6xlj07Q","MaJQsvOqCE","618Di7ku1p","GWqqX07n1c","DLhzMU3yw5","gtCA5euZA5","jiVBPZv7z0","07n1ckZANm","StlDJxXTI4",
+"2Yz7EW7cTs","jiVBPuupzk","7fsYMU3yw5","atef2ReKEW","SWfoutuDyS","WmadARACuj","Kr8ysYw2oU","DLhzMuPX7G","l83UdECMvU","zY1GYni2v1",
+"ogLgcwDajX","pT8wuyEfy9","F6PT2fLNg8","XflUqFVMxo","Waim6Cp3mZ","0MR5XReKEW","uJScXkZANm","Waim6pvgjS","guMb8ZUnqt","zmLYDGv3Fq",
+"Z4I1v8xEKz","IBe8k0Wr5y","brhlQy94nw","5NammwiHrZ","vOqCELbRTH","4dEz6mX2GE","tAOsrFnPFB","lm0pD1j5L8","QChxsJ2mQi","K4GS8zY1GY",
+"JIqXixReec","PYBf4okgRi","U3yw5zz4ZU","NcICAIBe8k","HP433TXQ0Z","gtCA555rfB","RkQkenFqik","In3NSFwEJz","lXFOB0MR5X","MK07Y0BmCy",
+"qUJMdiB08l","AOgEefcJOy","oVQp69GXkX","VNCPdrz7Ut","n1pmO6AFT0","jzUqR45cIH","HzZT86q6L9","MGlTFWreyP","qQxHPJkzUn","1v5hHCdyBV",
+"FGzgpYOfrY","QworuuAWyp","Chuy3wiHrZ","W3VFH0PktI","K20wKUvlv4","pv0i7OUqFM","NAFuwGWqqX","1j5L8M3zXL","K4GS8W7cTs","0YAGHQWxoT",
+"nlaByMojnP","h1zcHlXFOB","WmadA4dEz6","zqH0WYw2oU","618DiMmsIo","ThjNnVjCZq","7fsYMBbwgA","gIYvE4W0Tl","AIYUufcJOy","ciuWznlaBy",
+"GXdoH4QMc9","QssNCMK07Y","POUYS16lHc","ru4UG2TRI7","PYBf4zY1GY","WPmlxVerEA","iKqhrHP433","No0Qb9rlg9","kZANmThjNn","lXFOB24ARF",
+"uLtKsHlUbF","XyPZN2ZHdk","iwzGkfcJOy","RmDcrKZamH","fLNg8dQ586","MGlTFAgJHQ","RACujOUqFM","I7p2aZhwG1","StlDJAgJHQ","sx5GlS77LH",
+"k85Aen1pmO","O3iyQFwEJz","MGlTF7Ow5C","HlUbFaDGtS","7hyVvkZANm","okgRiiwzGk","Z4I1vkZANm","YjB9tn8pJ9","DcpWBDLhzM","nFqikfaHir",
+"Dz1R3hE1Ql","b29RJyEfy9","VjCZqWreyP","i7WMQuPX7G","2hEEUVBjhz","Ta8f6EdBKc","SjskQn1pmO","K4GS816lHc","djsrvZUnqt","5Mg9rD6rBy",
+"MmKGJt59lR","fFDrJMaJQs","DLhzMzQt6Q","MezSWnnP8o","sx5Glaez9y","UmaEvo8Uyd","YjB9tGv3Fq","HfyNQ24ARF","nnP8ojtn0X","yEfy9pAhR1",
+"zHF1qUlU3M","zHF1qs4786","K20wKfcwDa","07n1cgIYvE","S2Dfu618Di","RzaZAGSQwj","QbxXclweGy","580YDMezSW","P6bcg7fKYU","JXljWpT8wu",
+"6q6L9Chuy3","2ZHdkGv3Fq","RmDcrHzZT8","QssNCD6rBy","t59lR29QAz","M6qcGlm0pD","fFDrJhE1Ql","gtCA5DQimp","MojnPbgJAz","DQimpFNYIM",
+"L7cGcMezSW","gdQsSFFDui","9XyT9C2Irc","07n1cyToGW","SbRYyv2eC3","WaWsvCK5W7","48cHLJ2mQi","TCgPpSmGzv","l83UdfcwDa","oQ87r7fKYU",
+"CdyBVMezSW","jeskSU3yw5","s7MxkDcpWB","fcJOy0Wr5y","x3LDe8TxD7","O3iyQTXQ0Z","xReecJRJQB","pWiOs8FmFH","MezSWMkgy8","gtCA5RmDcr",
+"JkzUncmXIX","lCMxyqUJMd","IKxdL6AFT0","QClRLPOUYS","24ARFqUJMd","rKDLJfmIK1","v2eC3IKxdL","jfREu7fsYM","B3qemlViBv","prNT6G1RhS",
+"Gv3FqDQimp","uPX7GpiJSk","d7vjMFNYIM","VNCPd9eoRc","QnJ1Sgf8rI","zz4ZUs93Ml","Yh1hFbgJAz","uJScX0PktI","RBhp0sx5Gl","uN6r3TXQ0Z",
+"dQ586Q6hMC","Yf2Echi5X7","cQOnvoVQp6","POUYSFGzgp","kB5nPNAFuw","pv0i714FLR","RACujK4GS8","djsrvulk41","zmLYDCqqaD","IKxdLZv7z0",
+"RpBQmGv3Fq","LDk6fmz8gx","bZLvSqQxHP","xReecJkzUn","W7cTshe9IA","UmaEvFPfSE","WMiS3Mkgy8","SjskQCfgr3","AgJHQ5VZjS","0Wr5ybgJAz",
+"0Kyfsxciqp","RpBQmuZPqg","24ARFlViBv","5iGN5bgJAz","wDajXFnPFB","uZPqg5nmWv","iKqhrMojnP","FGzgpQworu","J2mQi5ZaEz","J2mQi6AFT0",
+"zQt6QwiHrZ","LewvMqaofN","AIYUuP6bcg","BpYhVVBjhz","d85a9EOE1o","8cVD3faHir","NAFuwFPfSE","vOqCEOUqFM","JXljWcmXIX","JXljWjeskS",
+"9XyT9W3VFH","hE1Qllm0pD","0MR5XuN6r3","TCgPpEOE1o","QssNCblLA9","zY1GYhYBCK","ZuDtDTwano","cmXIXB3qem","m4bxUt59lR","DLhzMIKxdL",
+"14FLR8cVD3","x3LDeQYxC0","WPmlxLbRTH","64s8Ny94nw","QYxC08hJdt","OUYuFS2Dfu","FcWrWS2Dfu","IBe8kix74r","soy9ttAOsr","IjTwPZhwG1",
+"djsrvzqH0W","jfREu5drc6","mz8gxThjNn","zmLYDVjCZq","TXQ0Z8TxD7","yEfy9pWiOs","IRh48MmKGJ","580YDYOfrY","QWxoTThjNn","S2Dfu5IhmG",
+"sqVrfdQ586","JRJQBDz1R3","8cVD3wDajX","5nmWvhi5X7","UmaEvazIWp","Yh1hFnFqik","ZJTXHHfyNQ","RBhp0prNT6","prNT6m4bxU","jS1ajvLsmS",
+"8hJdtHfyNQ","NhXduNcICA","yEfy98FmFH","v1Hln5VZjS","hUTw7tl72W","16lHcOHaBz","mX2GEEOE1o","tjQxsTCgPp","5VZjSdQ586","jiVBP8cVD3",
+"dpe1v2ZHdk","AXpwEqaofN","RsQUqUlU3M","uAWypix74r","zQt6QlsQGo","8TxD7WDVWJ","CxVEfYw2oU","QClRLzqH0W","07n1cBpYhV","VerEAVLTy6",
+"kZANm2TRI7","IjTwPFhtgl","WreyP7hyVv","VjCZqY1mC0","o8UydHP433","7X3uyReKEW","k85AeokgRi","QssNChUTw7","CqqaDCp3mZ","9rlg98cVD3",
+"vOqCEUmaEv","0Wr5yKr8ys","0PktI3weIF","bgJAzGWqqX","AmdQduoStw","lXFOBFFDui","Z4I1vlsQGo","zQt6Q3weIF","DcpWB0PktI","BGaQYyToGW",
+"pFrrlZuDtD","lm0pD3otm6","M6qcG8hJdt","MK07YmX2GE","dpe1vIjTwP","blLA9tAOsr","5Mg9rUl4a1","uZPqgC2Irc","VNCPdhUTw7","TCgPp5Drn0",
+"tAOsrMkgy8","iqv4kiwzGk","9GXkXdpe1v","HfyNQCp3mZ","3weIFpFrrl","OxWIHzz4ZU","G1RhSSWfou","zbIYYoQ87r","ZhwG1HRxd8","uupzkFhtgl",
+"DcpWBLDk6f","rz7UtwiHrZ","BFkb8yvOMI","Ul4a1U3yw5","U3yw5sx5Gl","GrDg74QMc9","jeskSJKWYR","KsjRK14FLR","AXpwEXflUq","580YDi7WMQ",
+"C2Ircsx5Gl","jiVBPG1RhS","LewvMIRh48","CdyBVFxX9q","OUYuFjzUqR","Ta8f6QYxC0","MezSWyvOMI","tuDySNxx9V","6AFT04W0Tl","45cIHJ2mQi",
+"2TRI7yToGW","tuDySprNT6","WPmlxVjCZq","1j5L8pWiOs","W7cTs2Nslm","5NammIjTwP","o8UydpWiOs","Z4I1v45cIH","StlDJhYBCK","9iGoTMK07Y",
+"djsrvzbIYY","5NammlH1kt","a00b59iGoT","cL0aEzFgtB","VjCZqmz8gx","ni2v17fsYM","HRxd85Drn0","FxX9qNhXdu","tl72WJIqXi","zFgtBQChxs",
+"Mkgy8pWiOs","dmoS7ksJby","7X3uyBbwgA","fcwDaWPmlx","M6qcGCdyBV","CdyBVAOgEe","oQ87rzQt6Q","Y1mC0Rxrsm","i3pydQClRL","OUYuFs4786",
+"I7p2adpe1v","5NammK4GS8","Z4I1vQWxoT","kB5nPWaim6","07n1cWMiS3","JIqXiZzJHW","DcpWBXyPZN","fcwDaFhtgl","nFqikn1pmO","29QAzcShY2",
+"Oz8yZb29RJ","bgJAz5VZjS","atef29GXkX","pmeCdRkQke","xXTI4nFqik","5IhmGI7p2a","oVQp6FxX9q","RxrsmuZPqg","YOfrYPOUYS","s93MlS2Dfu",
+"wiHrZuQIcz","0YAGHru4UG","55rfBqQxHP","djsrvh1zcH","1v5hHWPmlx","ix74r7lUXZ","7ku1pBCxeC","azIWpWDVWJ","HP433qaofN","l83Ud7fsYM",
+"hE1QlZzJHW","ThjNnZv7z0","nFqik0YAGH","fmIK1b29RJ","qaofNMaJQs","GXdoHyToGW","ZUnqtIBe8k","ReKEWjtn0X","VLTy6sqVrf","2Yz7EjSjS3",
+"9iGoTDLhzM","zHF1qK4GS8","soy9tv8yFN","uLtKs2hEEU","D6rBy2hEEU","LbRTHHRxd8","o8UydThjNn","cQOnvWDVWJ","xXTI4mX2GE","lCMxyFNYIM",
+"i3pydOz8yZ","W3VFH07n1c","rz7UtydG8U","8U2nUQssNC","DLhzM29QAz","Yf2EcsuY4x","EOE1o0h1b1","tvdkDNo0Qb","QnJ1SQChxs","yofH3hE1Ql",
+"Vprf28hJdt","BpYhV55rfB","ZuDtDfqypy","s93MlSWfou","IKxdLZ4I1v","RkQkeGSQwj","0ao3lfLNg8","cQOnvd85a9","soy9tyEfy9","tjQxsZUnqt",
+"WPmlx16lHc","gjUTuM3zXL","K4GS85Drn0","tlILtiqv4k","jS1ajOz8yZ","KsjRKCK5W7","M3zXLdjsrv","rKDLJWreyP","BGaQYmX2GE","CdyBVHRxd8",
+"9eoRcYf2Ec","s93MlSbRYy","W3VFHjzUqR","uTacxlj07Q","KASQ8ThjNn","yofH3pv0i7","45cIHIRh48","In3NSSs0Zu","RxrsmuoStw","gdQsSwiHrZ",
+"euZA5s93Ml","fcwDaZJTXH","fLNg8Yw2oU","IRh48uvf7A","d85a9LbRTH","Cfgr3Mm8si","d7vjMDG4sT","RmDcratef2","Vprf2NcICA","QbxXcsoy9t",
+"8TxD7Pb1pa","ECMvUIjTwP","lpF6WpWiOs","xciqpFVMxo","uvf7A16lHc","WreyPAkKTk","yToGWmX2GE","0Wr5yjiVBP","VjCZqkZANm","pFrrluAWyp",
+"uQIcz4dEz6","4W0Tl4dEz6","5nmWvIRh48","xciqp3otm6","3otm6XyPZN","BpYhVXyPZN","4W0TlYjB9t","bgJAz9y4lw","JRJQBThjNn","NhXduFLsph",
+"soy9tvkCHH","lj07QCIShG","F6PT2P6bcg","ZUnqt0BmCy","29QAz7X3uy","lH1ktQClRL","LbRTH29QAz","Q6LixYw2oU","pWiOs5Drn0","2DREsCfgr3",
+"07n1c9XyT9","QnJ1S8cVD3","3weIFECMvU","QssNCbgJAz","ZzJHWe6e4z","v2eC3brhlQ","KZamH580YD","SjskQ1v5hH","S77LHn1pmO","JJs5mix74r",
+"4QMc9n8pJ9","v8yFNhE1Ql","MaJQsU3yw5","CNHmvSbRYy","GXdoHuJScX","ru4UGiwzGk","k85AeaFFss","ydG8UciuWz","qQxHPxciqp","Chuy3dpe1v",
+"IBe8kn8pJ9","tvdkDdpe1v","gjUTudjsrv","0BmCyFNYIM","gIYvEStlDJ","BCxeCb29RJ","B3qemnnP8o","No0Qba00b5","vOqCEpAhR1","atef29rlg9",
+"oGu6xydG8U","OUYuFVNCPd","29QAzJXljW","TXQ0Z7X3uy","8FmFHECMvU","ZuDtDQssNC","RkQkeoVQp6","zFgtBHzZT8","MmsIoVNCPd","jiVBP6AFT0",
+"9rlg9MmsIo","wiHrZIn3NS","Yf2Ecuvf7A","a00b5tuDyS","zmLYD64s8N","Pb1papv0i7","2ZHdkMm8si","zQt6QNhXdu","9eoRcRkQke","taOXK7Ow5C",
+"SWfouOz8yZ","cL0aEPb1pa","t59lRpiJSk","C2IrcGWqqX","lweGyEOE1o","Cp3mZtjQxs","Twanodjsrv","8U2nUGrDg7","IBe8kL7cGc","6AFT0In3NS",
+"RBhp0dhSuH","hYBCKt59lR","QworuRmDcr","IjTwPuvf7A","VNCPdsuY4x","3otm6pmeCd","RzaZA5VZjS","lj07QSjskQ","W7cTsZUnqt","v8yFNS2Dfu",
+"Yw2oUCIShG","GXdoH8xEKz","QbxXcOUYuF","JRJQBuLtKs","0ao3lYjB9t","jSjS3s7Mxk","x3LDeRBhp0","Zv7z0LDk6f","W7cTsAgJHQ","iwzGkZhwG1",
+"Pb1panFqik","uvf7AVLTy6","pmeCdm4bxU","brhlQTCgPp","sx5GlJkzUn","SWfouqQxHP","WPmlxuN6r3","14FLRqUJMd","EdBKcnFqik","gf8rIFLsph",
+"LewvMhUTw7","YOfrYEdBKc","nFqikStlDJ","ThjNngtCA5","lCMxyvLsmS","U3yw5618Di","64s8N0Kyfs","cQOnvHlUbF","CK5W7zbIYY","In3NSRkQke",
+"blLA9LewvM","Mm8siuupzk","hSSvQpWiOs","MojnPJXljW","X6PinDz1R3","IRh48zz4ZU","CqqaDB3qem","tuDySNo0Qb","2hEEUZhwG1","7X3uyQClRL",
+"ciuWz7fsYM","s93MlChuy3","Cp3mZDcpWB","FLsphF6PT2","SjskQdQ586","yofH3dhSuH","AmdQdcQOnv","zbIYY0h1b1","BFkb8G1RhS","VLTy6OUYuF",
+"jeskSFGzgp","ksJbyMojnP","RmDcrBFkb8","taOXKMm8si","S2DfuKASQ8","Chuy3hSSvQ","soy9tCqqaD","2NslmIKxdL","7hyVvP6bcg","BCxeCSbRYy",
+"7X3uyfaHir","EoToP2ZHdk","lCMxyIn3NS","C2Ircn8pJ9","0ao3lRzaZA","rhl0JoQ87r","J2mQi14FLR","IRh48FNYIM","jSjS35Namm","YOfrYKr8ys",
+"pmeCdzz4ZU","D6rByZUnqt","Cp3mZ16lHc","e6e4zokgRi","JIqXi9y4lw","S77LHn8pJ9","uZPqge6e4z","D6rByCdyBV","SmGzvMkgy8","fLNg8S77LH",
+"8cVD3BbwgA","uAWypMezSW","cmXIXYf2Ec","cQOnvI7p2a","0PktI0PktI","AXpwE8xEKz","5drc6tAOsr","lweGy6AFT0","QbxXcTa8f6","AgJHQ8xEKz",
+"9XyT9Qworu","Dz1R3lsQGo","DQimpSmGzv","8xEKzi3pyd","HlUbFzz4ZU","h1zcHDG4sT","x3LDei7WMQ","MaJQsSjskQ","djsrvXflUq","soy9thSSvQ",
+"Q6LixjiVBP","VIlwPfcJOy","vkCHHWreyP","Twano0MR5X","ZJTXHhSSvQ","DG4sTmz8gx","2Yz7ENhXdu","QYxC0FjHXR","BFkb8pvgjS","6AFT0gjUTu",
+"0BmCyfFDrJ","atef20MR5X","VBjhzOHaBz","zHF1qcQOnv","M3zXLaL6AJ","vkCHHhe9IA","Y1mC0aL6AJ","0YAGHaDGtS","aFFss7hyVv","jfREuZv7z0",
+"0ao3lFcWrW","RxrsmtvdkD","nlaBy618Di","0Wr5yCxVEf","MmsIo7X3uy","uvf7ASWfou","Y1mC0L7cGc","ulk41taOXK","sqVrfXflUq","cQOnvqQxHP",
+"pT8wu48cHL","Kr8ysQ6Lix","ECMvUlweGy","VNCPdCqqaD","1LB1LCIShG","FVMxoNo0Qb","StlDJRpBQm","pAhR1QClRL","2NslmlXFOB","QworuQClRL",
+"jS1ajDcpWB","SbRYygtCA5","07n1ctaOXK","faHirulk41","W7cTsFGzgp","NAFuwuvf7A","mz8gxrKDLJ","16lHcYf2Ec","HfyNQydG8U","x3LDeCIShG",
+"14FLRUmaEv","zFgtBFnPFB","y94nw9y4lw","FLsphD6rBy","0BmCyGSQwj","KsjRKt59lR","OHaBzJKWYR","8xEKzmX2GE","IRh48M6qcG","Oz8yZprNT6",
+"580YDxXTI4","MK07YfcJOy","IKxdLNAFuw","uN6r345cIH","DLhzMWPmlx","FFDui5IhmG","ZUnqtOHaBz","3weIFlm0pD","Twano0h1b1","yToGWpmeCd",
+"OUqFMAXpwE","RACujhE1Ql","14FLRS2Dfu","LewvMVNCPd","BGaQYtuDyS","0YAGHdjsrv","d85a9gdQsS","ogLgcfLNg8","5Mg9r4QMc9","pWiOs2hEEU",
+"ZJTXHB3qem","WPmlxk85Ae","l83UdS77LH","5Mg9rv1Hln","F6PT2mX2GE","Pb1pa6q6L9","zbIYYAOgEe","G1RhSaFFss","F6PT2MGlTF","TXQ0ZSjskQ",
+"qUJMdjfREu","AgJHQnlaBy","brhlQM3zXL","F6PT2lm0pD","8U2nUL7cGc","EoToPyToGW","JIqXiZJTXH","EdBKcyvOMI","t59lRCK5W7","lXFOBBCxeC",
+"lViBvzHF1q","48cHLCqqaD","Cp3mZFVMxo","1j5L8ReKEW","VBjhzBpYhV","NOHszZv7z0","IRh487lUXZ","fcJOysqVrf","qQxHPRpBQm","ZzJHWpmeCd",
+"guMb8WmadA","OHaBzNcICA","I7p2azQt6Q","CdyBVVLTy6","Q6LixAOgEe","EOE1oTCgPp","Oz8yZxReec","mX2GEJKWYR","QbxXcZv7z0","XyPZNoQ87r",
+"zY1GYMkgy8","jzUqR8cVD3","suY4xni2v1","JIqXilViBv","yToGWiqv4k","zY1GYTXQ0Z","wiHrZP6bcg","t98iWvLsmS","oQ87rhi5X7","9rlg9iwzGk",
+"fmIK1ix74r","zQt6QhUTw7","gf8rIGrDg7","8TxD7ksJby","LDk6f8RCUA","VerEAs4786","MaJQsVLTy6","7X3uypmeCd","ReKEW8cVD3","jtn0XCfgr3",
+"FNYIM9iGoT","lXFOBlXFOB","5VZjSFjHXR","JKWYRyofH3","cmXIXHP433","SmGzvFxX9q","64s8N8U2nU","SWfouzbIYY","rKDLJOxWIH","4W0Tljtn0X",
+"FcWrWn1pmO","uTacxAOgEe","WaWsvlm0pD","5iGN5xciqp","KZamHS2Dfu","7fKYUuvf7A","07n1cAIYUu","v2eC316lHc","TCgPpVjCZq","Kr8ysl83Ud",
+"zqH0WoQ87r","okgRiAgJHQ","pmeCdkB5nP","d7vjMDLhzM","d7vjMPOUYS","XflUqW7cTs","nlaBylsQGo","a00b5k85Ae","WDVWJZzJHW","Y1mC0gdQsS",
+"XyPZN3weIF","uQIczFcWrW","wiHrZStlDJ","DG4sTjtn0X","4dEz6MaJQs","sx5GlGWqqX","VjCZqThjNn","vLsmS3weIF","bgJAzzQt6Q","S2DfuYOfrY",
+"M3zXLS2Dfu","Gv3FqzQt6Q","HRxd8AOgEe","NhXduUmaEv","h1zcH5IhmG","8U2nU4W0Tl","48cHL2DREs","lj07QfFDrJ","qQxHPdpe1v","RACuj24ARF",
+"RmDcrlpF6W","8cVD3yluBx","pFrrlMm8si","16lHcbrhlQ","FNYIMuupzk","sqVrfDcpWB","MaJQsjtn0X","zz4ZUru4UG","nnP8ocL0aE","5drc68xEKz",
+"EdBKcuupzk","CqqaDHzZT8","MojnPNhXdu","sqVrftuDyS","ECMvUFxX9q","JRJQB1LB1L","hi5X7jSjS3","14FLRMmKGJ","Kr8yssqVrf","ru4UGYf2Ec",
+"16lHclsQGo","QWxoT0h1b1","EdBKcvkCHH","mX2GE0ao3l","lViBvx3LDe","lj07QUl4a1","uLtKsW3VFH","GrDg71LB1L","dQ5867X3uy","CxVEfM3zXL",
+"fcwDaChuy3","IjTwPgtCA5","Kr8ysQbxXc","Cp3mZnFqik","dpe1v5drc6","DLhzM4QMc9","fcwDarz7Ut","pv0i7ru4UG","uvf7AmX2GE","8TxD75Namm",
+"W3VFHd7vjM","BpYhVQ6Lix","lsQGo580YD","Twanoatef2","Mkgy8s93Ml","KASQ8MK07Y","taOXKv8yFN","FcWrWG1RhS","K4GS87fsYM","7Ow5CB3qem",
+"FhtglcmXIX","CK5W79iGoT","AIYUuFxX9q","0KyfsUvlv4","s4786yToGW","d85a9IjTwP","iB08ln8pJ9","XflUqFxX9q","tl72WZJTXH","WDVWJo8Uyd",
+"FPfSEDLhzM","prNT6580YD","Z4I1vqUJMd","FFDuisoy9t","JKWYRQ6hMC","fcJOyksJby","hi5X78xEKz","P6bcgs93Ml","K20wKlm0pD","5nmWvNOHsz",
+"5VZjSDcpWB","dmoS7rKDLJ","GXdoH2Nslm","MaJQss93Ml","Mkgy8IKxdL","VBjhzX6Pin","45cIHvkCHH","0h1b15iGN5","ECMvUMkgy8","pAhR1FnPFB",
+"M3zXLnlaBy","ogLgcRzaZA","HlUbFRBhp0","9rlg9PYBf4","Q6hMC6q6L9","0h1b1hSSvQ","QnJ1Siqv4k","8TxD7VIlwP","rhl0J0YAGH","lpF6WFVMxo",
+"bgJAzSs0Zu","zz4ZUZJTXH","55rfB8U2nU","okgRiCdyBV","jSjS3qaofN","ThjNnzY1GY","tvdkD0h1b1","gdQsS0h1b1","uQIczpFrrl","zQt6QyEfy9",
+"qQxHPSmGzv","VIlwPP6bcg","WPmlxn8pJ9","7ku1pIRh48","FGzgpaDGtS","RmDcrlkMUA","IjTwP8hJdt","nFqikGrDg7","580YDYw2oU","MmsIobgJAz",
+"uZPqgcL0aE","Kr8ysFnPFB","FcWrWL7cGc","aL6AJnnP8o","sqVrfOUqFM","s4786FLsph","QWxoThi5X7","NAFuwogLgc","MojnPMmKGJ","cShY2cL0aE",
+"FcWrWbZLvS","aez9yi7WMQ","M6qcGAXpwE","n1pmOFFDui","3weIFNo0Qb","M3zXLYjB9t","QbxXcGWqqX","MojnPokgRi","dpe1v9GXkX","SWfoutlILt",
+"5Drn0YOfrY","CxVEf5Namm","9y4lwDLhzM","POUYS5iGN5","tlILtRpBQm","QbxXchUTw7","WmadAOUYuF","7hyVvtuDyS","MaJQsHRxd8","fFDrJNAFuw",
+"ZuDtDEoToP","gtCA5JIqXi","8hJdtL7cGc","ogLgcIRh48","gtCA5Ul4a1","t59lR7lUXZ","5IhmGjzUqR","MezSWi3pyd","e6e4zvOqCE","K4GS8l83Ud",
+"JkzUnuTacx","iqv4kRmDcr","0ao3lbrhlQ","J2mQiFGzgp","ZhwG1tl72W","ni2v1yToGW","b29RJ8hJdt","G1RhSGrDg7","yEfy9zbIYY","W7cTsMK07Y",
+"m4bxUZzJHW","9XyT94dEz6","6AFT0hSSvQ","DQimp55rfB","e6e4zPYBf4","pWiOsD6rBy","9GXkXsqVrf","GWqqX29QAz","rz7UtRzaZA","soy9tIRh48",
+"Dz1R3F6PT2","lsQGozz4ZU","FNYIMiqv4k","uQIczlm0pD","6AFT0AOgEe","618Dio8Uyd","zmLYD45cIH","CK5W7BCxeC","SmGzv8cVD3","5iGN5ni2v1",
+"0ao3l1j5L8","Q6hMCyvOMI","POUYSBGaQY","YOfrYCfgr3","LewvMvLsmS","CIShG5Drn0","S77LH2TRI7","JIqXi618Di","16lHcYjB9t","G1RhSuZPqg",
+"RsQUqfFDrJ","EOE1o24ARF","ECMvU1j5L8","vkCHHGWqqX","9eoRclweGy","fLNg8tvdkD","XflUqMmsIo","dQ586azIWp","JIqXiyofH3","oQ87rd7vjM",
+"OxWIHlXFOB","FjHXRRsQUq","UmaEvfmIK1","Zv7z0WMiS3","VBjhz07n1c","EOE1ot98iW","FwEJzJ2mQi","GSQwjl83Ud","CK5W70h1b1","e6e4zpmeCd",
+"LbRTH4W0Tl","vkCHHCxVEf","Oz8yZtvdkD","Uvlv4RBhp0","Mkgy8FFDui","uAWypfcwDa","Yf2EcGrDg7","uAWypqUJMd","WPmlx0YAGH","azIWplpF6W",
+"KsjRK1j5L8","FFDuiRsQUq","BbwgAUlU3M","gdQsSAkKTk","FjHXR48cHL","OUqFMcQOnv","OxWIHzY1GY","s4786RACuj","7lUXZ2Nslm","RzaZAhYBCK",
+"ZhwG1UmaEv","9XyT9NAFuw","FjHXRDcpWB","L7cGcru4UG","Dz1R3VBjhz","nlaByv2eC3","tl72Whe9IA","zHF1qfcJOy","s93MlnFqik","8FmFH4dEz6",
+"iqv4kbrhlQ","RzaZARsQUq","n8pJ9VLTy6","gIYvEa00b5","6q6L9iqv4k","OxWIH3weIF","hYBCKHlUbF","gIYvENhXdu","OxWIHvLsmS","pmeCdMojnP",
+"RmDcrAIYUu","qaofN4QMc9","s7MxkHRxd8","a00b5MK07Y","PYBf4ogLgc","rhl0JSbRYy","5IhmG5Mg9r","Waim6OxWIH","fcJOyv1Hln","QWxoTtAOsr",
+"SjskQvLsmS","rKDLJKZamH","AXpwEFPfSE","8cVD3618Di","5iGN5fmIK1","t59lRFLsph","m4bxUpAhR1","Vprf2I7p2a","BCxeC0Kyfs","AgJHQfqypy",
+"d85a9FnPFB","QYxC08FmFH","yofH3UmaEv","x3LDe16lHc","s93Ml7fsYM","0BmCy9iGoT","9iGoTMGlTF","Twano1v5hH","fcJOytuDyS","XyPZNxReec",
+"uQIczzQt6Q","1j5L8iKqhr","BpYhVrKDLJ","x3LDeoGu6x","Q6hMCnFqik","OxWIHfmIK1","qaofN7fsYM","wDajXPb1pa","CqqaD0BmCy","Kr8ysBCxeC",
+"Y1mC0Y1mC0","uupzkxReec","b29RJatef2","RkQkeiKqhr","hYBCKCp3mZ","brhlQdmoS7","48cHL16lHc","aFFsspvgjS","soy9t5drc6","6AFT00Kyfs",
+"Mkgy8ru4UG","618DiXyPZN","MGlTFzqH0W","TXQ0ZwDajX","5drc6XyPZN","cShY2hSSvQ","B3qemoQ87r","uoStwru4UG","xciqpMojnP","EOE1oHfyNQ",
+"cmXIXlj07Q","piJSkmz8gx","ciuWzNOHsz","HzZT8zbIYY","fqypyB3qem","24ARFuoStw","iKqhrU3yw5","uAWypCdyBV","SbRYykB5nP","FPfSEMezSW",
+"NcICAZJTXH","sqVrfiwzGk","blLA9S2Dfu","5drc6CIShG","jfREuOHaBz","yvOMIcQOnv","0ao3lxciqp","blLA9JKWYR","Dz1R348cHL","ZzJHWRpBQm",
+"WPmlxaDGtS","24ARFIBe8k","W7cTsFPfSE","OHaBzZUnqt","HfyNQKr8ys","Yw2oUuoStw","m4bxU2DREs","aDGtSCK5W7","8U2nUDcpWB","8FmFH1v5hH",
+"Ta8f6jtn0X","Chuy3ciuWz","fcwDaBFkb8","Uvlv4b29RJ","YOfrYDz1R3","ZhwG1CNHmv","FhtglOHaBz","1v5hHZUnqt","FLsphVNCPd","FGzgpkZANm",
+"WMiS3dQ586","Waim6jSjS3","Vprf2pAhR1","WDVWJSs0Zu","9GXkXGv3Fq","FxX9quupzk","ciuWzQ6hMC","UlU3Mm4bxU","W7cTsKASQ8","lXFOBAXpwE",
+"KZamHoQ87r","U3yw5RACuj","euZA55IhmG","JKWYRbZLvS","CNHmv2Nslm","xciqpzY1GY","6q6L9oVQp6","5VZjSlViBv","P6bcgVBjhz","jSjS3k85Ae",
+"WreyPzbIYY","4dEz65Mg9r","5ZaEz9y4lw","tlILtrz7Ut","jfREuMaJQs","qaofNmz8gx","Ss0ZuLbRTH","NAFuwzHF1q","0YAGHl83Ud","SjskQYh1hF",
+"MmKGJIKxdL","WMiS3OUYuF","Oz8yZCxVEf","S77LHi7WMQ","zQt6QCxVEf","jfREuJXljW","16lHcG1RhS","bZLvSJIqXi","M6qcG7lUXZ","l83UdzqH0W",
+"4dEz6S77LH","8RCUA5nmWv","hE1Qlsoy9t","RxrsmOHaBz","FPfSEn1pmO","0YAGHlkMUA","ogLgcIBe8k","XyPZNvOqCE","LbRTH8TxD7","mz8gx2Nslm",
+"TXQ0ZkZANm","yofH3BCxeC","BGaQYdpe1v","AkKTkeuZA5","EOE1o8TxD7","BbwgAMGlTF","guMb8AXpwE","UlU3MXflUq","2TRI7FnPFB","jtn0XVLTy6",
+"U3yw529QAz","e6e4ziwzGk","ZzJHWgjUTu","45cIHRpBQm","No0Qb5Drn0","JIqXiCdyBV","QChxs29QAz","mz8gxBFkb8","AkKTkAkKTk","fcJOyVjCZq",
+"K4GS8zHF1q","VerEAECMvU","HfyNQ5IhmG","1j5L82hEEU","AmdQdv8yFN","aez9yyEfy9","bgJAzYw2oU","GrDg75VZjS","azIWpQnJ1S","QChxslm0pD",
+"POUYSyvOMI","QnJ1SkZANm","WreyPQssNC","M3zXLokgRi","5IhmGfmIK1","rKDLJulk41","lXFOBuAWyp","0BmCy2ZHdk","tAOsrgtCA5","Cfgr3jS1aj",
+"lj07QSbRYy","FnPFB5IhmG","VNCPduupzk","8TxD7hi5X7","uAWypKASQ8","lkMUAd85a9","dQ5867fKYU","HzZT8FGzgp","RBhp01LB1L","S2DfuVprf2",
+"4dEz6SbRYy","LbRTH8hJdt","uoStwPb1pa","cmXIXvkCHH","HRxd8CIShG","EdBKcyofH3","J2mQiPb1pa","yluBxsuY4x","24ARFMGlTF","ThjNnpT8wu",
+"DcpWBVBjhz","580YDs7Mxk","29QAzRkQke","RpBQmdQ586","MmKGJi7WMQ","JXljWZJTXH","tvdkDxXTI4","uPX7GQWxoT","SmGzv1LB1L","lCMxyAIYUu",
+"ogLgcbgJAz","29QAzZ4I1v","0ao3lv2eC3","xXTI42hEEU","9rlg9dQ586","RkQkeFwEJz","14FLRsoy9t","1v5hHhi5X7","JJs5mECMvU","55rfBAgJHQ",
+"wiHrZOHaBz","WMiS3618Di","aL6AJAIYUu","s7Mxk7X3uy","m4bxUgf8rI","bZLvSFPfSE","8xEKzDQimp","U3yw5hSSvQ","sqVrfwiHrZ","mz8gxW7cTs",
+"i7WMQyToGW","S77LH5VZjS","rKDLJSbRYy","zqH0WOUYuF","TXQ0ZQYxC0","fcwDalCMxy","zbIYYnlaBy","RpBQmfqypy","M3zXL0YAGH","OUYuFDG4sT",
+"ZzJHWpT8wu","ThjNnF6PT2","XflUqyToGW","DcpWBdmoS7","FPfSEJ2mQi","5ZaEzDG4sT","5ZaEzSs0Zu","s7MxkFnPFB","WreyPVBjhz","S2Dfu9rlg9",
+"EoToPBCxeC","hUTw7RkQke","jiVBPs93Ml","JJs5mdjsrv","ZJTXHTXQ0Z","StlDJPb1pa","qUJMdUlU3M","mX2GE0YAGH","Yw2oUdhSuH","lm0pDKr8ys",
+"4W0TlHzZT8","0ao3lSbRYy","ru4UGrKDLJ","1LB1LU3yw5","EOE1oqQxHP","mX2GElj07Q","JXljWrz7Ut","zQt6QD6rBy","No0QbydG8U","s7MxkzbIYY",
+"QssNCDLhzM","gdQsSksJby","618DiCqqaD","5drc6I7p2a","2DREsMkgy8","JXljWZUnqt","NAFuwRxrsm","GSQwjiB08l","rz7UtZhwG1","d7vjMgdQsS",
+"Z4I1vzY1GY","GrDg7lj07Q","nnP8oNcICA","CNHmvS2Dfu","fmIK1WreyP","07n1cv8yFN","MmsIol83Ud","jSjS3QYxC0","qaofN0Kyfs","s7MxktjQxs",
+"4dEz6JKWYR","n1pmOAgJHQ","zY1GYjS1aj","s7Mxka00b5","Cp3mZG1RhS","7ku1pJJs5m","nnP8oZzJHW","DLhzMprNT6","oQ87rh1zcH","RACujFhtgl",
+"iqv4kv1Hln","Q6Lixt98iW","618DiCdyBV","CNHmvOUYuF","YjB9tMK07Y","yEfy9MmKGJ","1v5hHFNYIM","OUYuFZJTXH","uLtKs1j5L8","Q6LixZUnqt",
+"lpF6WMmsIo","fcJOy2DREs","nlaBySjskQ","0KyfspAhR1","dhSuHo8Uyd","zHF1qgdQsS","uAWypOUYuF","P6bcgmz8gx","jzUqRJRJQB","Yw2oUulk41",
+"sx5GltvdkD","5Drn0WMiS3","AXpwEblLA9","zFgtBZUnqt","ru4UGyToGW","pT8wuM3zXL","n1pmOAmdQd","MmsIos7Mxk","yofH3WmadA","Yh1hFzY1GY",
+"OxWIHBpYhV","OUYuFIjTwP","POUYSGWqqX","gtCA5HfyNQ","dmoS7uvf7A","h1zcHlm0pD","24ARFbZLvS","a00b5Kr8ys","BbwgAOHaBz","lj07QKZamH",
+"5IhmGDQimp","lViBv5ZaEz","Uvlv4yvOMI","HzZT85ZaEz","zbIYYqQxHP","7Ow5CM6qcG","lH1kt0h1b1","faHirU3yw5","QYxC04W0Tl","y94nw6AFT0",
+"IBe8kFLsph","zz4ZUsx5Gl","oGu6xgdQsS","zFgtBVBjhz","lkMUAFVMxo","ReKEWBGaQY","3weIFEOE1o","4dEz6jiVBP","ZzJHWEoToP","Twanob29RJ",
+"yluBxCIShG","IRh48b29RJ","GWqqXdpe1v","Z4I1vuTacx","Pb1paWMiS3","ZJTXH45cIH","1LB1LfFDrJ","piJSkYOfrY","jeskSwiHrZ","pFrrlCK5W7",
+"yluBxhi5X7","jfREuJJs5m","29QAzx3LDe","2hEEUcmXIX","brhlQ8RCUA","pAhR1h1zcH","RkQkeVerEA","aDGtSNOHsz","0YAGHFjHXR","wDajXyEfy9",
+"yEfy97fKYU","n8pJ9lm0pD","aFFss618Di","GSQwjQClRL","aDGtSjS1aj","5iGN5nlaBy","ECMvUeuZA5","oVQp6HzZT8","Pb1paKASQ8","NhXduv8yFN",
+"ZUnqta00b5","zY1GYBpYhV","uAWypZ4I1v","MezSWy94nw","wiHrZdpe1v","e6e4zNhXdu","VjCZqlkMUA","GrDg7RzaZA","F6PT2fmIK1","LDk6fk85Ae",
+"wiHrZFPfSE","kB5nP5ZaEz","faHirgjUTu","iB08lksJby","vkCHHd85a9","Kr8ysiqv4k","B3qemuAWyp","2Yz7EWmadA","W7cTsqUJMd","AIYUuG1RhS",
+"L7cGcTXQ0Z","RBhp0BbwgA","KsjRKgdQsS","8cVD3MojnP","HzZT80ao3l","MmKGJxciqp","ZzJHW2Yz7E","OUqFMQ6Lix","i7WMQQChxs","FjHXRCIShG",
+"BGaQYFFDui","zHF1qprNT6","uJScXGXdoH","VjCZqjS1aj","djsrvQClRL","aDGtSxciqp","Q6hMCuPX7G","KZamHTwano","VLTy6JkzUn","Waim6lj07Q",
+"hE1Qlix74r","ZJTXHrz7Ut","ZzJHWU3yw5","ulk41D6rBy","FxX9qJ2mQi","zmLYDSs0Zu","ZuDtDv8yFN","OxWIHLbRTH","OxWIHL7cGc","nFqik618Di",
+"DQimpKr8ys","jSjS3FjHXR","ZJTXHVjCZq","dQ5860MR5X","B3qemXflUq","guMb8EdBKc","GSQwjWaim6","RmDcrJIqXi","oGu6xCK5W7","uoStwpmeCd",
+"StlDJydG8U","dQ586OUYuF","QClRLHzZT8","2hEEUyToGW","8hJdt5VZjS","Yh1hFECMvU","ix74rWDVWJ","cL0aEnFqik","CxVEfuJScX","MojnPGSQwj",
+"RACujwDajX","9rlg9wDajX","h1zcH0BmCy","SjskQwiHrZ","vLsmSkZANm","O3iyQQnJ1S","fLNg8JIqXi","2Yz7EprNT6","yofH3EOE1o","pWiOsB3qem",
+"lCMxy7Ow5C","zY1GYIn3NS","pvgjSuAWyp","azIWpZuDtD","tjQxstjQxs","8FmFHOxWIH","0MR5X8hJdt","24ARFThjNn","tlILtOUqFM","taOXKZJTXH",
+"hi5X7HfyNQ","jiVBPjfREu","uoStwokgRi","QYxC0a00b5","ZzJHWguMb8","8U2nUjfREu","QnJ1S9rlg9","uupzkuTacx","UmaEvaez9y","ogLgcAkKTk",
+"BpYhVSmGzv","9eoRc7hyVv","Mkgy8AgJHQ","djsrvIjTwP","MmKGJprNT6","Z4I1voGu6x","2ZHdkQYxC0","uvf7AZ4I1v","ksJby0PktI","No0QbRACuj",
+"iB08lFxX9q","QWxoT16lHc","JKWYR2DREs","FGzgpjS1aj","cmXIXIRh48","JKWYRgIYvE","5ZaEzoGu6x","7fKYU0BmCy","UlU3MiB08l","QWxoTLbRTH",
+"TCgPpWmadA","AkKTkazIWp","faHirtl72W","uLtKsjSjS3","W3VFHjfREu","yluBxoQ87r","CdyBVrhl0J","ECMvUfFDrJ","lpF6WoQ87r","LewvMRpBQm",
+"2DREsqQxHP","JXljWv2eC3","ZzJHW9y4lw","Cp3mZJJs5m","l83UdaDGtS","0Wr5y5Drn0","xXTI4CK5W7","2Nslmxciqp","S77LH45cIH","4QMc9EOE1o",
+"a00b5RBhp0","F6PT2fcwDa","djsrv5ZaEz","M3zXLHzZT8","QClRLMmsIo","cL0aEVNCPd","ciuWzo8Uyd","uAWyp1j5L8","6AFT0m4bxU","zz4ZUBpYhV",
+"WaWsv4QMc9","tjQxsFhtgl","azIWp7fKYU","Q6LixiB08l","ThjNnSWfou","Z4I1vRACuj","EOE1oa00b5","7Ow5Cs93Ml","v2eC3rhl0J","VBjhzPYBf4",
+"2Nslm6q6L9","nlaByX6Pin","WMiS34W0Tl","Kr8ysCfgr3","StlDJVjCZq","5ZaEz0BmCy","qUJMdKZamH","MojnPKsjRK","Chuy38xEKz","t98iWv2eC3",
+"lm0pDsoy9t","2Nslml83Ud","Cfgr3jSjS3","i7WMQO3iyQ","3weIFJkzUn","F6PT24dEz6","2TRI79iGoT","7fsYMnFqik","24ARF2Yz7E","gf8rIsqVrf",
+"55rfBOz8yZ","Ul4a1BFkb8","POUYS0YAGH","QClRLn1pmO","Cfgr3tAOsr","2hEEU580YD","dmoS7EoToP","SbRYyciuWz","ni2v1JkzUn","FhtgljS1aj",
+"fqypynnP8o","AgJHQb29RJ","a00b5GXdoH","UlU3MfmIK1","TXQ0ZI7p2a","6q6L9uTacx","IBe8kPb1pa","rKDLJBCxeC","2Yz7En1pmO","d7vjMP6bcg",
+"NAFuwFnPFB","FwEJzpmeCd","U3yw5IRh48","OUqFMfaHir","8TxD78TxD7","NAFuwIKxdL","rhl0JG1RhS","4dEz6x3LDe","pmeCdiwzGk","JJs5mgdQsS",
+"pvgjSlH1kt","SWfouDLhzM","MezSWiqv4k","piJSkgjUTu","s93MlYjB9t","taOXKFVMxo","0BmCy7hyVv","NOHszY1mC0","ogLgcGWqqX","v8yFNRkQke",
+"tjQxsFwEJz","xXTI43otm6","0h1b1LDk6f","ZUnqtBbwgA","vkCHHBbwgA","lViBvlH1kt","hSSvQDcpWB","e6e4zzQt6Q","Kr8ysZUnqt","tl72WFjHXR",
+"55rfBS2Dfu","JXljWzFgtB","Ss0ZuYjB9t","uvf7AReKEW","zqH0WjSjS3","jiVBP9GXkX","1LB1Lhe9IA","K4GS8SWfou","lsQGo2Nslm","2ZHdkXyPZN",
+"zQt6QcmXIX","vLsmSYh1hF","yvOMIqUJMd","8TxD7Yw2oU","EoToPtaOXK","rhl0JBFkb8","8TxD7pv0i7","pmeCdRpBQm","azIWpBGaQY","Pb1payluBx",
+"wDajXiqv4k","NhXdu16lHc","L7cGci7WMQ","cQOnvgIYvE","UlU3M4W0Tl","NcICABbwgA","zqH0WZ4I1v","v8yFNTwano","fmIK1Uvlv4","s4786jiVBP",
+"SmGzvguMb8","FNYIMgtCA5","FGzgpHzZT8","8RCUARACuj","Z4I1vhe9IA","pvgjSIBe8k","5ZaEzlViBv","DG4sTnlaBy","okgRiUlU3M","iB08lnFqik",
+"POUYSuZPqg","uN6r30ao3l","k85AeUlU3M","nnP8oVNCPd","hE1Ql5Drn0","uupzkhe9IA","jS1aj5IhmG","lkMUAd7vjM","zY1GYWaim6","X6Pins4786",
+"a00b5CqqaD","gdQsSPb1pa","lkMUAtlILt","NhXduiKqhr","AmdQd45cIH","D6rByrKDLJ","piJSkuoStw","djsrv5IhmG","SmGzvpv0i7","In3NSFNYIM",
+"dmoS7MojnP","F6PT2Gv3Fq","9y4lwLDk6f","n1pmOQChxs","zz4ZUfqypy","JJs5mxXTI4","5iGN5WaWsv","DcpWBmz8gx","GWqqXdhSuH","VBjhzXyPZN",
+"gtCA5XyPZN","MezSWd7vjM","AIYUub29RJ","K20wKokgRi","nFqikReKEW","48cHLLbRTH","EoToPKsjRK","jtn0XhE1Ql","ZzJHWt98iW","DQimp2TRI7",
+"tlILtHlUbF","iwzGksuY4x","RBhp0tlILt","FLsphsx5Gl","64s8N5ZaEz","JRJQB45cIH","rKDLJiwzGk","M3zXLsuY4x","64s8Nt98iW","0KyfsO3iyQ",
+"O3iyQIKxdL","5nmWvqQxHP","l83UdNOHsz","0BmCyX6Pin","faHirHlUbF","ThjNnXflUq","HzZT8FNYIM","0KyfsSWfou","AOgEeix74r","JRJQBfFDrJ",
+"1j5L8faHir","x3LDeHlUbF","i7WMQzHF1q","QYxC0Mkgy8","OUqFMJKWYR","hUTw7faHir","RxrsmVjCZq","uTacx7fsYM","IBe8kQYxC0","hYBCKgdQsS",
+"cQOnvjtn0X","16lHcUl4a1","QbxXcEdBKc","StlDJRxrsm","pv0i7dhSuH","F6PT2XyPZN","KASQ83otm6","kZANmjeskS","SmGzvtlILt","xXTI4uN6r3",
+"pmeCd0h1b1","xXTI4SbRYy","S77LH8hJdt","Kr8ys4W0Tl","YjB9tZv7z0","oGu6x580YD","d85a9iwzGk","OUqFM2DREs","No0QbYw2oU","DG4sTnFqik",
+"YOfrYjiVBP","VNCPdlweGy","1j5L8VBjhz","RpBQmYOfrY","Z4I1vD6rBy","ECMvUzbIYY","CNHmvOxWIH","Yf2EcPOUYS","kB5nPFjHXR","aDGtS24ARF",
+"8cVD3yvOMI","qaofN618Di","ZzJHW48cHL","pFrrla00b5","QYxC0jiVBP","aL6AJjS1aj","fLNg8Gv3Fq","WreyPuJScX","fmIK1O3iyQ","BCxeChUTw7",
+"JJs5mhe9IA","ydG8UJKWYR","Uvlv47fKYU","dQ5860BmCy","xciqp48cHL","XyPZNdpe1v","BGaQYQWxoT","pWiOsyluBx","tlILtW7cTs","mz8gxfFDrJ",
+"CxVEfjtn0X","TXQ0ZBCxeC","No0QbAIYUu","hSSvQRmDcr","AgJHQo8Uyd","aez9yCqqaD","W7cTsCp3mZ","ZuDtDjiVBP","ru4UGaL6AJ","tl72WBpYhV",
+"gtCA5RBhp0","1LB1L7ku1p","faHirS77LH","RpBQmVIlwP","VBjhzCdyBV","0PktIOz8yZ","jfREuRxrsm","uLtKsn8pJ9","45cIHYw2oU","hUTw75ZaEz",
+"aDGtSFjHXR","3weIF7lUXZ","oVQp6lm0pD","5Drn02DREs","BGaQYTCgPp","y94nwRkQke","hYBCKY1mC0","Yh1hF4dEz6","B3qemGXdoH","uAWypcQOnv",
+"gf8rICxVEf","S77LHSs0Zu","CIShGKASQ8","GXdoHuPX7G","jSjS3m4bxU","OUYuF6q6L9","9GXkXYf2Ec","oGu6xCdyBV","yEfy9MaJQs","RzaZAK20wK",
+"24ARFgIYvE","0h1b1Cp3mZ","OHaBzKsjRK","wDajXEOE1o","o8Uyd3weIF","Nxx9VIKxdL","ZUnqttlILt","lkMUAWaim6","GWqqXYOfrY","s7MxkRmDcr",
+"D6rBycQOnv","WPmlxlj07Q","zY1GYsoy9t","uQIcz0MR5X","cShY28FmFH","M6qcGtjQxs","uvf7AQworu","zbIYYjfREu","5ZaEz1j5L8","euZA5hSSvQ",
+"zqH0Wxciqp","uupzkVLTy6","MGlTFt98iW","djsrv6AFT0","8xEKzAXpwE","lpF6WiB08l","7X3uypvgjS","hE1QlEOE1o","3weIFCfgr3","taOXKXflUq",
+"WaWsvP6bcg","M6qcGVprf2","CK5W7Yf2Ec","n8pJ9uPX7G","6AFT0DLhzM","GWqqXtuDyS","lm0pD29QAz","d7vjML7cGc","dhSuHI7p2a","QChxsyvOMI",
+"No0Qb45cIH","W3VFHyluBx","pAhR1jfREu","EoToPCp3mZ","1v5hHJKWYR","FFDuivLsmS","IRh48JIqXi","QClRLNOHsz","zFgtBuTacx","pvgjSXyPZN",
+"pWiOsh1zcH","K4GS8faHir","1v5hHpmeCd","DQimp6q6L9","FVMxoLDk6f","piJSk0Kyfs","i7WMQCxVEf","azIWpaez9y","JIqXiVjCZq","cL0aEjeskS",
+"yToGWqaofN","I7p2aW7cTs","7ku1pPOUYS","uupzkfcwDa","UmaEvzz4ZU","jSjS3fmIK1","lsQGonFqik","hSSvQfLNg8","uupzkDLhzM","AXpwElpF6W",
+"soy9tQChxs","zHF1qv2eC3","ZhwG1D6rBy","oGu6xFnPFB","iB08llm0pD","v8yFN5Mg9r","oVQp629QAz","FNYIMFxX9q","s7MxkAkKTk","tjQxshE1Ql",
+"HzZT8b29RJ","zz4ZUMezSW","hUTw7gIYvE","L7cGcMmKGJ","uvf7A0h1b1","Yf2EcRmDcr","s93Mla00b5","tuDySuAWyp","cmXIXKr8ys","ksJbyuAWyp",
+"CxVEfatef2","QChxsgtCA5","lH1ktdhSuH","cShY2Pb1pa","nFqikFPfSE","8RCUAhe9IA","s93MlCp3mZ","1LB1L0YAGH","FGzgpAOgEe","64s8NsuY4x",
+"zFgtBU3yw5","Q6hMCb29RJ","6AFT0b29RJ","IKxdLTwano","uAWypokgRi","yvOMI7X3uy","HP433jS1aj","4QMc9nlaBy","hi5X7L7cGc","yvOMIAkKTk",
+"uLtKssqVrf","sx5GlkB5nP","9y4lwXflUq","RACujSmGzv","4W0TlBpYhV","o8UydzHF1q","RsQUqa00b5","580YDhSSvQ","FcWrWbgJAz","5VZjSprNT6",
+"qUJMdvkCHH","Dz1R3brhlQ","fFDrJlXFOB","CIShGQClRL","fFDrJokgRi","NcICAgIYvE","5nmWvkB5nP","5ZaEzSWfou","LewvMlj07Q","gIYvEXyPZN",
+"VBjhzJ2mQi","F6PT2cShY2","fcJOySs0Zu","qQxHPSbRYy","QbxXchi5X7","64s8N1j5L8","ECMvUuN6r3","J2mQi0h1b1","8RCUA4QMc9","SWfouJ2mQi",
+"Yh1hFFLsph","gjUTutuDyS","AmdQdvkCHH","55rfB5drc6","MojnPWaWsv","pAhR1fcwDa","55rfB1j5L8","BCxeCjSjS3","MezSWdmoS7","WaWsv0MR5X",
+"8RCUA7fKYU","OxWIHCxVEf","tlILtYjB9t","MGlTFbZLvS","2DREsv2eC3","WDVWJy94nw","ksJby9rlg9","07n1c64s8N","WmadAhYBCK","Nxx9VCNHmv",
+"QYxC0FGzgp","tlILt7X3uy","prNT6AIYUu","3weIFOUqFM","0KyfsBCxeC","pT8wulCMxy","0MR5Xa00b5","3weIF07n1c","580YDAmdQd","yvOMIazIWp",
+"16lHcAgJHQ","M6qcGZ4I1v","GWqqXFNYIM","xReec48cHL","xReec64s8N","14FLRjiVBP","FPfSEB3qem","FcWrW16lHc","OxWIHxXTI4","YjB9tRBhp0",
+"lH1ktaL6AJ","v2eC3POUYS","vkCHHjfREu","2Nslmrz7Ut","LbRTHIRh48","ZUnqto8Uyd","WaWsvguMb8","tjQxsfFDrJ","1v5hHuoStw","Qworuk85Ae",
+"WPmlxY1mC0","lViBvQssNC","1j5L8oGu6x","uPX7GvkCHH","45cIHGSQwj","d85a97X3uy","m4bxU07n1c","fFDrJX6Pin","CNHmvprNT6","AOgEeSWfou",
+"M3zXLjSjS3","k85AeU3yw5","AIYUuFnPFB","atef2t98iW","IBe8k64s8N","iwzGkFGzgp","9GXkXcmXIX","Gv3Fqix74r","1LB1LzqH0W","iwzGkxReec",
+"uTacxmX2GE","ogLgcTXQ0Z","MGlTFpiJSk","MmsIoMK07Y","lj07QXflUq","0h1b1Twano","EdBKczbIYY","7fsYMvOqCE","QClRLuZPqg","oVQp6Cfgr3",
+"hi5X7Z4I1v","QssNCYOfrY","L7cGcni2v1","EOE1olkMUA","JKWYRydG8U","lsQGolpF6W","qUJMdS2Dfu","QYxC0Uvlv4","xXTI42Yz7E","aL6AJuoStw",
+"QYxC01v5hH","IRh48VLTy6","i3pyd7lUXZ","a00b5Gv3Fq","zY1GYIKxdL","580YDCNHmv","iB08ls93Ml","nnP8ooVQp6","ThjNnkZANm","SWfouazIWp",
+"ogLgc5nmWv","rKDLJBbwgA","Ta8f6YjB9t","pvgjSbgJAz","prNT6FPfSE","fcJOyv8yFN","0BmCyd85a9","WPmlxS77LH","8cVD3VjCZq","NAFuwZhwG1",
+"IBe8kfcJOy","DcpWB9XyT9","QYxC0t98iW","X6PinAIYUu","KZamHcmXIX","In3NSuLtKs","aDGtSpmeCd","EoToPzY1GY","h1zcHuLtKs","Twano7fKYU",
+"JkzUnjSjS3","okgRiqQxHP","GrDg7Zv7z0","Oz8yZBbwgA","okgRiyofH3","QworuyToGW","nFqikMGlTF","uAWyp7fsYM","1v5hH8U2nU","SbRYyQYxC0",
+"yvOMIUmaEv","yEfy9NcICA","SbRYyOUqFM","uPX7GoQ87r","ZJTXHtAOsr","vLsmSCdyBV","No0QbMaJQs","QYxC0RsQUq","lViBvjtn0X","FwEJzsx5Gl",
+"EdBKc2Nslm","cShY2VNCPd","0Kyfs2DREs","D6rBy7hyVv","faHirJIqXi","9y4lwSWfou","zqH0WWaim6","9GXkX2Nslm","lH1ktlH1kt","guMb8Ta8f6",
+"GSQwjBCxeC","580YD9y4lw","kZANmFFDui","FhtglMezSW","QssNCVLTy6","KASQ8HfyNQ","ECMvUt98iW","ru4UGUvlv4","t98iWdpe1v","9iGoTMojnP",
+"fLNg8QWxoT","dpe1vUl4a1","MmKGJoVQp6","580YDY1mC0","RmDcrI7p2a","fcJOyhE1Ql","fqypyrKDLJ","Z4I1vOUYuF","RmDcr7X3uy","pv0i7GSQwj",
+"ksJbyuZPqg","1j5L8JRJQB","DLhzM5Namm","e6e4zECMvU","BGaQYXflUq","2Yz7EiKqhr","EOE1orhl0J","fcwDaVNCPd","zbIYYguMb8","8cVD3h1zcH",
+"BpYhVb29RJ","tAOsriqv4k","k85AeJ2mQi","ZzJHW8U2nU","JkzUngdQsS","K4GS8aL6AJ","OxWIHF6PT2","07n1cd7vjM","pAhR129QAz","EdBKc8xEKz",
+"CNHmvQworu","VjCZq2ZHdk","hSSvQ1j5L8","FGzgpFcWrW","M3zXLMmKGJ","Ss0ZuKZamH","CK5W7hYBCK","gf8rI0Wr5y","d7vjMQClRL","Oz8yZ7ku1p",
+"0MR5XgIYvE","b29RJFVMxo","rhl0JSWfou","7lUXZQClRL","VIlwPpv0i7","dpe1vcQOnv","hE1QlfmIK1","GXdoHt59lR","HlUbFcmXIX","BbwgAJXljW",
+"jfREupAhR1","pmeCdpWiOs","kB5nPVerEA","Dz1R3uvf7A","8cVD3fmIK1","iB08lQ6hMC","lH1ktqUJMd","o8UydhUTw7","i7WMQi3pyd","suY4xnnP8o",
+"RBhp0jeskS","pWiOseuZA5","qUJMdCdyBV","o8Uyduvf7A","aez9yOz8yZ","MojnP7hyVv","fLNg8xXTI4","FcWrWRxrsm","iwzGk2DREs","fcwDakB5nP",
+"cmXIXkB5nP","zz4ZUCqqaD","XyPZN0PktI","cShY2faHir","tlILtBpYhV","pmeCdW3VFH","n1pmOnFqik","AXpwEhYBCK","y94nwHfyNQ","gIYvEksJby",
+"HlUbFS2Dfu","yluBxOHaBz","2DREs9GXkX","IKxdLh1zcH","bgJAzlViBv","FVMxoLbRTH","nnP8oFhtgl","7fKYUlj07Q","fqypyjS1aj","CxVEfjSjS3",
+"uLtKsUlU3M","8FmFHpWiOs","ZJTXHjS1aj","Yh1hFqQxHP","AgJHQokgRi","lXFOBuupzk","jS1aj0ao3l","0Wr5ypAhR1","RBhp0ru4UG","XflUqokgRi",
+"n1pmOD6rBy","HzZT8y94nw","fLNg8EoToP","CqqaDAkKTk","Uvlv4OxWIH","zHF1q4W0Tl","lsQGo8RCUA","iB08l9eoRc","G1RhSS77LH","lsQGoOUYuF",
+"BbwgAcShY2","3weIFi7WMQ","yofH3vOqCE","n8pJ9AXpwE","KASQ8EdBKc","MmsIoMm8si","uJScXqUJMd","48cHL55rfB","HRxd8FGzgp","uZPqgI7p2a",
+"mz8gxatef2","2DREsbgJAz","guMb848cHL","IBe8kJIqXi","i3pyd9iGoT","FPfSECxVEf","kZANmMezSW","Mkgy8Y1mC0","sx5GlF6PT2","jfREuo8Uyd",
+"s4786ZzJHW","cShY2k85Ae","fLNg85Drn0","BpYhV618Di","n8pJ9AkKTk","zHF1qJkzUn","pmeCdRmDcr","mz8gxlsQGo","jiVBPKASQ8","VNCPdulk41",
+"lXFOBFcWrW","XyPZNo8Uyd","gtCA5K4GS8","L7cGc8FmFH","y94nwEoToP","GrDg79GXkX","Mm8siy94nw","KASQ8NOHsz","AOgEeVprf2","MmsIoLewvM",
+"ECMvUFGzgp","1v5hHGv3Fq","k85AeIBe8k","K20wKpAhR1","jSjS3guMb8","L7cGchi5X7","KZamHfqypy","LewvMStlDJ","G1RhS9iGoT","azIWp9y4lw",
+"d7vjMaez9y","gjUTut59lR","0MR5XyEfy9","ZuDtDC2Irc","5Drn05IhmG","tl72W7Ow5C","O3iyQwDajX","WPmlx2hEEU","djsrvQnJ1S","dhSuHqUJMd",
+"iKqhrQssNC","rhl0JXflUq","fqypyprNT6","azIWp24ARF","lXFOB7lUXZ","iqv4kAgJHQ","7ku1pk85Ae","AXpwEqUJMd","gjUTu14FLR","zHF1qlsQGo",
+"fLNg8yEfy9","i3pydt98iW","zz4ZUEOE1o","zbIYYNhXdu","OHaBzgf8rI","vLsmSXyPZN","7X3uypAhR1","n1pmOChuy3","atef2D6rBy","jeskSdjsrv",
+"zY1GYQworu","QssNCuQIcz","RzaZAIBe8k","azIWpiB08l","MGlTF9eoRc","taOXKQYxC0","5drc624ARF","YjB9tv2eC3","blLA9W3VFH","MmsIotAOsr",
+"pmeCdaFFss","8xEKzjiVBP","EoToPZJTXH","AmdQdB3qem","gdQsSAIYUu","Chuy37ku1p","euZA5F6PT2","m4bxUsoy9t","618DiaDGtS","FnPFBGv3Fq",
+"KASQ8soy9t","ECMvUXyPZN","Ss0ZuTXQ0Z","hE1QlRmDcr","1v5hHtl72W","Y1mC0CIShG","MmsIovLsmS","ReKEWdQ586","No0Qb1v5hH","jiVBPVBjhz",
+"DLhzMQ6Lix","WaWsvhi5X7","OUYuFGv3Fq","MmsIopiJSk","ru4UGbgJAz","zFgtBG1RhS","D6rBy5IhmG","WaWsvtvdkD","7fsYMaDGtS","PYBf4FVMxo",
+"i7WMQLbRTH","uupzkRmDcr","3otm68TxD7","NcICAkB5nP","FVMxoSjskQ","IKxdLFnPFB","07n1cBGaQY","pvgjSgIYvE","JXljWKASQ8","IjTwPKr8ys",
+"16lHcxciqp","zFgtB4QMc9","gjUTuVLTy6","sx5Gl07n1c","EOE1oOz8yZ","rhl0JNcICA","ydG8UZuDtD","JkzUnQWxoT","7Ow5ClCMxy","fqypyokgRi",
+"Mkgy8GWqqX","uZPqgSjskQ","J2mQicmXIX","ZUnqtOz8yZ","5IhmGFGzgp","yToGW5drc6","uvf7A3weIF","Oz8yZiqv4k","C2IrcpWiOs","GrDg7iwzGk",
+"ZJTXH4QMc9","Gv3FqOUYuF","ydG8UMojnP","9rlg9a00b5","Vprf2xciqp","8TxD7FGzgp","zHF1qAOgEe","euZA5cmXIX","Ul4a1MojnP","oGu6xxXTI4",
+"zHF1q8hJdt","pT8wuEdBKc","cQOnv48cHL","uAWypjtn0X","h1zcHWaim6","0Wr5yUvlv4","0MR5XQClRL","hE1Qlv2eC3","suY4xcQOnv","F6PT2pvgjS",
+"t98iWIjTwP","IjTwPGv3Fq","FNYIMWMiS3","JkzUnoGu6x","i3pydNcICA","WMiS3uN6r3","s7MxktvdkD","EOE1opmeCd","BbwgAFxX9q","s4786BpYhV",
+"2DREsPOUYS","QbxXcK20wK","EOE1oPYBf4","ogLgcKsjRK","MK07YTwano","FxX9qjzUqR","580YDzz4ZU","e6e4zs4786","DQimpQWxoT","580YD5Namm",
+"CqqaDQChxs","0ao3lQYxC0","k85Aelm0pD","tAOsrDz1R3","Ss0ZuGrDg7","jiVBP580YD","K20wKdQ586","lsQGotlILt","lCMxyHzZT8","aFFssd7vjM",
+"xReec2Nslm","sqVrfUvlv4","JXljWStlDJ","580YDVerEA","l83UdMK07Y","gf8rIaFFss","euZA52ZHdk","v2eC3WMiS3","RsQUqYf2Ec","LDk6ffcwDa",
+"ZhwG1MezSW","W3VFHs93Ml","4QMc9d85a9","WreyPmz8gx","ThjNn9eoRc","FFDuiydG8U","QWxoTmX2GE","1v5hHECMvU","QYxC0jtn0X","5ZaEz3otm6",
+"IRh48RkQke","FnPFB0PktI","QnJ1SG1RhS","mz8gxcL0aE","4QMc9FVMxo","BbwgALDk6f","Yh1hFjfREu","euZA5XflUq","JkzUngf8rI","pFrrluJScX",
+"48cHLprNT6","5Drn01v5hH","bgJAzZUnqt","MaJQsCxVEf","CdyBVlViBv","e6e4zNAFuw","tAOsrCNHmv","QssNCMaJQs","VerEANAFuw","5Drn0hi5X7",
+"lweGy0ao3l","uLtKs64s8N","MezSWzz4ZU","WaWsvFwEJz","1LB1LTXQ0Z","Y1mC08RCUA","TXQ0ZtlILt","cmXIXuLtKs","yluBxVIlwP","9iGoTLewvM",
+"Dz1R345cIH","AXpwEQ6hMC","ECMvUtAOsr","jSjS3AIYUu","gjUTuAmdQd","WreyPMojnP","CdyBVGWqqX","Nxx9VWDVWJ","S2Dfu8RCUA","2DREsU3yw5",
+"WreyPDQimp","dpe1v7hyVv","he9IAoVQp6","55rfBbgJAz","Uvlv4ZzJHW","iB08lnnP8o","DG4sTs7Mxk","gdQsSUvlv4","MmKGJRmDcr","uLtKsYOfrY",
+"tjQxs48cHL","fqypyyluBx","GWqqXKr8ys","9XyT9suY4x","9rlg9VNCPd","aDGtS9GXkX","7Ow5Cs4786","RkQkeECMvU","v1HlnjiVBP","HP433b29RJ",
+"BGaQYlj07Q","pv0i77X3uy","gtCA5MGlTF","AgJHQJRJQB","HfyNQQbxXc","P6bcgVjCZq","FwEJzfFDrJ","euZA5hUTw7","MmsIo7Ow5C","rKDLJOz8yZ",
+"9rlg9uTacx","soy9tzHF1q","uTacxfFDrJ","NcICAfcwDa","jzUqRiwzGk","ZUnqtYh1hF","QWxoTnFqik","IRh48lsQGo","kB5nPvLsmS","qQxHP6AFT0",
+"RACujXflUq","6q6L9PYBf4","jfREuU3yw5","AmdQdtAOsr","suY4xfFDrJ","WreyPpFrrl","Cfgr30YAGH","2Nslm8U2nU","WreyP8xEKz","UmaEvD6rBy",
+"gf8rIMaJQs","MK07YAkKTk","okgRifcJOy","9rlg9piJSk","qaofNiKqhr","9iGoTPb1pa","t98iWXflUq","nlaByFwEJz","sqVrf4W0Tl","lsQGoblLA9",
+"MmKGJjeskS","14FLRY1mC0","HlUbFMmsIo","e6e4zJXljW","FPfSEtAOsr","fqypyMmsIo","kB5nPUvlv4","pvgjSNxx9V","BGaQYReKEW","SWfoutl72W",
+"RpBQmoVQp6","zqH0WogLgc","lpF6W7lUXZ","45cIH2TRI7","ulk41fcJOy","djsrvM6qcG","FNYIMhe9IA","sx5GlQChxs","IBe8kBCxeC","n8pJ9ksJby",
+"HfyNQMmKGJ","t59lR7X3uy","6q6L9KZamH","wDajXydG8U","lViBviB08l","EOE1oZuDtD","dhSuHJIqXi","m4bxUYjB9t","uZPqgQssNC","Ta8f6jeskS",
+"oGu6xlsQGo","618Did85a9","Vprf2P6bcg","TwanoyofH3","piJSkGSQwj","1LB1LuJScX","ogLgcJJs5m","48cHLBGaQY","EdBKcdjsrv","a00b5tvdkD",
+"pWiOsHRxd8","zY1GYX6Pin","Ss0ZuwiHrZ","m4bxUhe9IA","VBjhz5iGN5","lkMUADz1R3","zQt6QksJby","KASQ8CIShG","GWqqXQworu","Z4I1vRsQUq",
+"MmKGJ0ao3l","IKxdLHlUbF","dpe1v580YD","9XyT9ZJTXH","pWiOsMmKGJ","zQt6QtuDyS","cQOnvFhtgl","BpYhVIKxdL","Ta8f6MmsIo","jSjS3POUYS",
+"BCxeCFLsph","K20wKuupzk","vOqCEdpe1v","yofH3U3yw5","Vprf2fLNg8","h1zcHRsQUq","0BmCyDcpWB","NcICAHfyNQ","I7p2a0h1b1","F6PT2SmGzv",
+"5NammokgRi","fLNg8RBhp0","5drc6WDVWJ","618Di8xEKz","YjB9tyEfy9","GWqqXhi5X7","24ARFKr8ys","euZA5ThjNn","lH1ktJXljW","x3LDe7fsYM",
+"JIqXiCK5W7","SbRYyX6Pin","pAhR16AFT0","hSSvQYOfrY","jtn0XNcICA","HzZT8faHir","qQxHPtAOsr","5iGN5tuDyS","ix74rzz4ZU","AkKTkhi5X7",
+"sx5GlUmaEv","8xEKzFGzgp","OHaBzcShY2","QnJ1SIBe8k","zHF1quN6r3","8xEKzlsQGo","pWiOsmX2GE","RkQkeoQ87r","W7cTsAIYUu","Yw2oUh1zcH",
+"FnPFB0Wr5y","Ta8f6oQ87r","BCxeCtl72W","0Wr5y2ZHdk","fFDrJMezSW","lsQGoEOE1o","BbwgAZv7z0","0Kyfslj07Q","EoToPgf8rI","YOfrYlj07Q",
+"DQimpJKWYR","tAOsrfcJOy","v2eC30YAGH","RxrsmBFkb8","AgJHQ5IhmG","KsjRKUlU3M","7hyVvuTacx","B3qemoGu6x","FNYIM7lUXZ","h1zcHguMb8",
+"pFrrluZPqg","v8yFNzbIYY","YOfrYkZANm","gIYvEZJTXH","HlUbFatef2","2Yz7EsuY4x","jfREusx5Gl","ciuWzKsjRK","i7WMQciuWz","K4GS8uLtKs",
+"mX2GEwDajX","0YAGHSjskQ","pv0i75Namm","5drc6Ss0Zu","IjTwPNOHsz","lweGyIn3NS","7hyVv5iGN5","OHaBzGWqqX","ECMvUdhSuH","HfyNQ55rfB",
+"aFFssprNT6","VjCZqGWqqX","hUTw7Y1mC0","NcICAPYBf4","UlU3MhYBCK","5Namm14FLR","x3LDefLNg8","zqH0W1LB1L","mz8gxprNT6","CqqaDReKEW",
+"KZamHcQOnv","zmLYDtjQxs","SmGzvgjUTu","K4GS8VIlwP","D6rByfaHir","OUYuFZ4I1v","9y4lw8hJdt","8FmFHHRxd8","WreyPatef2","fFDrJECMvU",
+"ydG8UokgRi","t98iWQbxXc","WPmlxU3yw5","e6e4zVIlwP","CxVEfogLgc","Dz1R3t98iW","0BmCyvkCHH","4W0TlMmsIo","HzZT8n8pJ9","vkCHHtAOsr",
+"FwEJz5ZaEz","XflUqfmIK1","gtCA50YAGH","0h1b12Nslm","lCMxyfmIK1","64s8N64s8N","d7vjMt98iW","ThjNnn1pmO","4dEz6lH1kt","FPfSECNHmv",
+"S2Dfu1j5L8","FhtglHlUbF","t98iW5Drn0","bZLvS5IhmG","b29RJMmKGJ","EdBKcfqypy","MK07YWreyP","bZLvSlCMxy","07n1cBCxeC","14FLRcQOnv",
+"NOHszReKEW","NhXduru4UG","h1zcHEOE1o","iKqhr4W0Tl","7hyVvW3VFH","RzaZARACuj","0h1b1zz4ZU","azIWplkMUA","iB08lNhXdu","Uvlv4XflUq",
+"OUqFMIjTwP","atef2uTacx","dpe1vfLNg8","zY1GYpv0i7","LbRTH0Kyfs","FhtglguMb8","TXQ0Z3otm6","7hyVvNAFuw","t98iW48cHL","blLA9ru4UG",
+"ThjNnQ6hMC","tuDySFVMxo","Z4I1vvOqCE","piJSk3otm6","QnJ1SM3zXL","sqVrfFnPFB","PYBf4sqVrf","8xEKzHfyNQ","d7vjMni2v1","wiHrZWreyP",
+"YOfrYpFrrl","Mkgy8FVMxo","JRJQBMezSW","BGaQYi3pyd","xXTI48RCUA","IKxdLCp3mZ","zY1GYW7cTs","uLtKsuQIcz","brhlQuZPqg","7fKYUGWqqX",
+"t59lRjiVBP","618DiRkQke","TCgPpKr8ys","tlILt0PktI","Kr8ysru4UG","pvgjSRBhp0","WDVWJ5VZjS","Yh1hFBCxeC","9GXkXmX2GE","qUJMdkZANm",
+"B3qemECMvU","wiHrZsoy9t","GrDg7lXFOB","v1HlntAOsr","C2Irc64s8N","5Namm8hJdt","WDVWJkB5nP","uoStwazIWp","IBe8kdhSuH","EOE1oQWxoT",
+"xReecyofH3","AOgEecL0aE","tAOsrsuY4x","wiHrZfcwDa","zFgtB9rlg9","OHaBz3otm6","s93Ml5iGN5","FhtglTXQ0Z","v2eC3JXljW","iwzGkThjNn",
+"W3VFHCIShG","No0Qb0BmCy","5Drn00Kyfs","NAFuwmX2GE","vkCHHBFkb8","yofH30h1b1","xXTI445cIH","Pb1paLewvM","OUqFMs7Mxk","SbRYynFqik",
+"Yf2EcJRJQB","9XyT9uTacx","9y4lwdQ586","Ss0ZuBGaQY","sqVrf4QMc9","zmLYDCp3mZ","WmadAs4786","Ta8f6DQimp","8hJdt5iGN5","dmoS74dEz6",
+"aL6AJ9GXkX","1j5L8ThjNn","Zv7z0CqqaD","pv0i7uQIcz","pvgjSd85a9","Zv7z0ZhwG1","sx5GlNo0Qb","gIYvEWmadA","S2DfuoGu6x","AkKTkOUYuF",
+"iwzGkPOUYS","4W0TlhYBCK","TwanoMezSW","v8yFNuLtKs","yToGWfaHir","5iGN55Drn0","uupzkMaJQs","lViBvAOgEe","i3pyd2hEEU","AOgEeDQimp",
+"yEfy9gdQsS","GrDg7Fhtgl","Y1mC0OxWIH","7X3uyzmLYD","1LB1LdQ586","8TxD7lCMxy","Q6LixEdBKc","55rfBjS1aj","Y1mC0DLhzM","5NammFGzgp",
+"Uvlv4ogLgc","BpYhVtuDyS","OUYuFtAOsr","OUYuFkZANm","ulk41FNYIM","B3qemS2Dfu","iKqhrsx5Gl","lkMUAKsjRK","4W0TlJRJQB","hSSvQ48cHL",
+"KsjRK8cVD3","QnJ1SOHaBz","GXdoH5IhmG","b29RJuN6r3","oVQp6qUJMd","SbRYyYw2oU","JJs5m8U2nU","n8pJ9YOfrY","RzaZAfmIK1","16lHcksJby",
+"pT8wus7Mxk","suY4xRACuj","OUqFMVjCZq","Z4I1vFGzgp","RBhp0lweGy","NAFuwsuY4x","zz4ZUQssNC","tl72Wv8yFN","wiHrZMaJQs","tuDySCp3mZ",
+"XyPZNd7vjM","cL0aEIRh48","IjTwPni2v1","AgJHQNAFuw","1v5hH9XyT9","lCMxyJKWYR","b29RJIKxdL","Cp3mZCp3mZ","Mm8siuvf7A","gjUTunnP8o",
+"Waim60h1b1","EdBKcJIqXi","oGu6xkZANm","9GXkX1v5hH","D6rBytjQxs","JJs5muZPqg","zqH0WFLsph","45cIHM3zXL","Vprf2zFgtB","5ZaEzK4GS8",
+"zz4ZUiwzGk","24ARF45cIH","s93MlzbIYY","StlDJsuY4x","brhlQ0YAGH","FwEJz0h1b1","uLtKsZJTXH","S2DfuLDk6f","djsrv14FLR","okgRi9eoRc",
+"1j5L8fcwDa","zmLYDGrDg7","KZamH5Drn0","W7cTsFNYIM","zFgtB7X3uy","rKDLJRmDcr","VIlwPl83Ud","hSSvQsuY4x","rhl0JMm8si","VIlwPGSQwj",
+"he9IAuTacx","h1zcHZ4I1v","fcwDalsQGo","M3zXL6AFT0","kB5nPCK5W7","nFqik1v5hH","5iGN5MmsIo","2hEEURpBQm","WPmlxyvOMI","fqypyogLgc",
+"8hJdthYBCK","JRJQB4QMc9","In3NSOHaBz","zmLYD29QAz","Ss0ZuzY1GY","GrDg7IKxdL","LbRTHsoy9t","sqVrfRmDcr","azIWpAXpwE","QChxslsQGo",
+"zHF1qOUqFM","JKWYRQChxs","WaWsvOUqFM","jiVBPx3LDe","jtn0XiwzGk","fcJOy1LB1L","uvf7AtuDyS","uLtKsd85a9","ydG8UReKEW","vLsmS4W0Tl",
+"Q6hMCKZamH","vkCHHjeskS","DLhzMBGaQY","ReKEWjiVBP","NhXduyluBx","oVQp6CqqaD","RBhp06q6L9","AgJHQ4dEz6","piJSkQnJ1S","RkQkefmIK1",
+"Q6hMCQbxXc","FNYIM5Namm","FnPFBqQxHP","lH1ktG1RhS","ThjNn8FmFH","s4786RzaZA","NhXduuZPqg","Q6hMCk85Ae","CdyBVLDk6f","5Drn0QssNC",
+"vOqCEHRxd8","MezSW9rlg9","Kr8ysFxX9q","bgJAzprNT6","hYBCKzz4ZU","1LB1LpvgjS","uJScXe6e4z","QworuEoToP","gIYvES2Dfu","7fsYMM6qcG",
+"wDajXd7vjM","8xEKzsqVrf","ni2v1uJScX","v1HlnO3iyQ","48cHLS77LH","Mkgy8BCxeC","0YAGHXyPZN","5NammVIlwP","Nxx9V9XyT9","pWiOs7fsYM",
+"iwzGkgtCA5","8RCUAFnPFB","LewvMMK07Y","8TxD76q6L9","fqypyyofH3","oGu6xpmeCd","In3NS24ARF","LDk6fWPmlx","aez9yKr8ys","MmKGJM6qcG",
+"zbIYYksJby","fcwDaPYBf4","U3yw5tlILt","Ss0Zu6AFT0","FwEJzJkzUn","7X3uyuLtKs","lpF6W24ARF","JJs5myEfy9","pFrrl0h1b1","ZzJHWD6rBy",
+"d85a9lkMUA","QworuPb1pa","TCgPpTXQ0Z","9XyT91LB1L","uQIczPOUYS","Yw2oUAOgEe","zFgtBHlUbF","FjHXRVIlwP","pWiOsBCxeC","Zv7z048cHL",
+"WreyPpAhR1","dmoS7xReec","8cVD3d85a9","GSQwjwiHrZ","atef2pWiOs","WMiS3CK5W7","Q6hMCSWfou","v8yFNbgJAz","Mkgy8tAOsr","AOgEe8RCUA",
+"gf8rIXflUq","aDGtSDG4sT","suY4xM3zXL","HzZT8ZUnqt","Ta8f6MGlTF","fFDrJIKxdL","Oz8yZBCxeC","pAhR1L7cGc","CNHmviB08l","4W0TltvdkD",
+"oVQp6CxVEf","WPmlxuQIcz","NcICA2DREs","G1RhSZzJHW","aez9yZ4I1v","lkMUA45cIH","CK5W7uLtKs","8cVD3tuDyS","x3LDe0Kyfs","NOHsz2ZHdk",
+"2DREsQnJ1S","zHF1qYjB9t","WMiS3POUYS","pAhR1OHaBz","xciqpguMb8","ReKEW2ZHdk","7hyVvhi5X7","uvf7AcShY2","atef2Cfgr3","2ZHdkUmaEv",
+"Yh1hF45cIH","LewvMiB08l","14FLRni2v1","Nxx9VG1RhS","o8Uyd618Di","Q6hMCMmsIo","VNCPdZUnqt","AXpwEFLsph","0BmCypAhR1","wiHrZlweGy",
+"D6rByYjB9t","YOfrYprNT6","tl72WTXQ0Z","lViBvG1RhS","yEfy9XyPZN","RmDcruLtKs","lCMxyZzJHW","sx5GlFhtgl","Vprf2Mkgy8","5NammVprf2",
+"WMiS3vOqCE","blLA9lm0pD","Zv7z0WDVWJ","NcICAaez9y","gdQsSi3pyd","y94nwDQimp","ZJTXHfLNg8","29QAz6AFT0","djsrv4dEz6","GrDg7QWxoT",
+"blLA9yvOMI","J2mQiVBjhz","iKqhrix74r","Chuy3ix74r","RBhp0hSSvQ","618DiUlU3M","C2IrcNOHsz","vOqCE24ARF","1j5L81v5hH","pv0i7s93Ml",
+"5nmWvB3qem","HRxd8Mm8si","qQxHPksJby","7ku1pdpe1v","DcpWBFLsph","oGu6xpWiOs","JkzUnxciqp","taOXKyToGW","0YAGH0MR5X","yToGWNxx9V",
+"M3zXLnFqik","bZLvSuPX7G","zz4ZU7lUXZ","WPmlxOUqFM","7Ow5CDQimp","64s8N5iGN5","ix74rRACuj","WaWsvv8yFN","OUYuFmz8gx","gtCA5PYBf4",
+"rz7UtlkMUA","JRJQBIKxdL","0Wr5y8TxD7","Kr8ystAOsr","LDk6f0BmCy","VBjhzVLTy6","mz8gxjtn0X","bgJAzfaHir","48cHLuAWyp","fcJOyMezSW",
+"lpF6WtlILt","8xEKzatef2","W7cTsDQimp","QnJ1SWmadA","FVMxonnP8o","uLtKsKZamH","ciuWzksJby","SbRYyyToGW","sqVrfzHF1q","zmLYDt98iW",
+"45cIHzbIYY","uvf7AWmadA","jfREuM6qcG","5IhmGfcwDa","JIqXihE1Ql","QworucQOnv","KASQ8OUYuF","okgRiBbwgA","Ul4a1fmIK1","jzUqRAOgEe",
+"v2eC3J2mQi","IKxdLSbRYy","618DipFrrl","AIYUuWaim6","dhSuHvkCHH","lXFOBdjsrv","CIShGvLsmS","TXQ0ZyluBx","DQimpiB08l","Gv3FqaFFss",
+"wiHrZv2eC3","8FmFHJJs5m","JIqXiQworu","oVQp6mz8gx","gf8rIo8Uyd","uN6r32Yz7E","t98iWFjHXR","Uvlv4dhSuH","pvgjSlm0pD","1j5L8djsrv",
+"rKDLJxciqp","KASQ85drc6","ogLgcM6qcG","iwzGk0h1b1","4dEz6okgRi","zQt6QEdBKc","sx5Gl8FmFH","QWxoTOz8yZ","tlILt8cVD3","LbRTHfLNg8",
+"XflUqP6bcg","x3LDeAgJHQ","O3iyQXflUq","iKqhrpmeCd","rKDLJWMiS3","CK5W7rz7Ut","uJScXZzJHW","pWiOsGSQwj","x3LDezFgtB","QYxC0zbIYY",
+"8xEKzfLNg8","F6PT2MojnP","GWqqXAkKTk","7Ow5CmX2GE","dpe1vdjsrv","0PktIEOE1o","FNYIMNhXdu","s4786XyPZN","8hJdt7fKYU","DQimp24ARF",
+"POUYSGrDg7","POUYSzHF1q","prNT6k85Ae","lViBvWmadA","9iGoTFLsph","RACujpiJSk","v2eC31LB1L","yluBxQ6Lix","zFgtBS77LH","16lHcK20wK",
+"CIShGFLsph","oGu6xU3yw5","lCMxyfFDrJ","fmIK1PYBf4","Fhtgl7fsYM","TXQ0Zlm0pD","Rxrsm5nmWv","faHir4dEz6","P6bcgMaJQs","azIWp7hyVv",
+"kZANmjS1aj","BFkb8KZamH","lj07QAgJHQ","hE1QlYOfrY","RmDcr5Mg9r","7ku1phE1Ql","Y1mC0s4786","yofH3hUTw7","0BmCyhYBCK","kZANmFjHXR",
+"hi5X7Ta8f6","Dz1R3WmadA","s93MlThjNn","DcpWBSbRYy","cQOnv9iGoT","8RCUAZuDtD","JIqXiGSQwj","9eoRcgjUTu","qUJMdSbRYy","07n1c0ao3l",
+"fLNg88hJdt","dhSuH1LB1L","3weIF7fsYM","Nxx9VCqqaD","DG4sTVNCPd","tl72WoGu6x","YOfrYQssNC","OHaBz9y4lw","5Mg9rBGaQY","blLA9jiVBP",
+"5IhmGbrhlQ","Ul4a1atef2","cL0aEKZamH","5VZjSOUqFM","uupzkOUqFM","yEfy90ao3l","IjTwPStlDJ","MezSWZhwG1","BFkb8ogLgc","FGzgpfcJOy",
+"No0Qbs7Mxk","L7cGcS2Dfu","mz8gxOUqFM","KZamHIjTwP","uN6r3cmXIX","NAFuwcL0aE","t59lRprNT6","Nxx9VgIYvE","h1zcH14FLR","5IhmGpv0i7",
+"9eoRch1zcH","euZA529QAz","EoToP5ZaEz","AkKTkzQt6Q","QYxC00Wr5y","oVQp6BCxeC","POUYSlweGy","BbwgARmDcr","O3iyQQbxXc","0YAGHUl4a1",
+"fcJOyTXQ0Z","zqH0WF6PT2","FPfSEb29RJ","K4GS8Yw2oU","yofH324ARF","dmoS7uupzk","zY1GYB3qem","t98iWPYBf4","uN6r355rfB","SjskQciuWz",
+"Waim6FVMxo","SjskQtAOsr","64s8NCNHmv","pWiOsFwEJz","RsQUqMmKGJ","ix74rvLsmS","Nxx9VpiJSk","CxVEfI7p2a","IBe8kk85Ae","RsQUqW7cTs",
+"rKDLJWaim6","J2mQiuPX7G","HfyNQ3otm6","djsrvJIqXi","cShY2jS1aj","FPfSE8U2nU","Uvlv4oVQp6","W7cTsZ4I1v","45cIH8RCUA","KASQ8pv0i7",
+"48cHL0h1b1","yofH3DQimp","24ARFMezSW","Nxx9VVerEA","euZA5uPX7G","fFDrJrz7Ut","QYxC09iGoT","XyPZNlXFOB","LDk6f5drc6","ru4UGzHF1q",
+"k85AefFDrJ","yToGWhE1Ql","l83Ud7hyVv","lH1ktL7cGc","Kr8ysMezSW","DLhzMnFqik","yluBxSs0Zu","KASQ8DG4sT","0Wr5yUl4a1","Mm8si0Wr5y",
+"FjHXRChuy3","ECMvUxReec","ThjNnY1mC0","Ss0ZuyofH3","Cp3mZ8RCUA","hE1QlHzZT8","BbwgABGaQY","zqH0WJJs5m","AkKTkgdQsS","xReecvkCHH",
+"5Mg9rBFkb8","MaJQs9XyT9","JXljWXyPZN","OUYuFNcICA","SmGzvlm0pD","POUYSUl4a1","lm0pDRBhp0","QssNCx3LDe","AgJHQHzZT8","FxX9qLbRTH",
+"uZPqgYf2Ec","Kr8ysXflUq","P6bcgAXpwE","VerEAZv7z0","aFFssm4bxU","8U2nUZv7z0","gjUTudhSuH","fFDrJ2Yz7E","pvgjSVIlwP","JXljWBGaQY",
+"VIlwPuZPqg","gjUTuG1RhS","FGzgpZv7z0","VjCZq0Wr5y","FcWrWvOqCE","Kr8ysZ4I1v","lpF6WlCMxy","aL6AJiKqhr","bZLvSWDVWJ","faHir5Namm",
+"ni2v18cVD3","6AFT0CIShG","FnPFBVIlwP","lCMxyjS1aj","vkCHHhE1Ql","SbRYygjUTu","5ZaEzcQOnv","yofH3Gv3Fq","CxVEf7fsYM","pAhR1NcICA",
+"U3yw5jiVBP","48cHLpFrrl","suY4x9iGoT","uupzkk85Ae","7lUXZb29RJ","7X3uy580YD","MmKGJIn3NS","dpe1vYjB9t","FcWrWDQimp","FcWrWNcICA",
+"FNYIMvLsmS","5Mg9rh1zcH","xReecaL6AJ","SmGzvAIYUu","zmLYDmX2GE","djsrvx3LDe","lH1ktVIlwP","lsQGoMezSW","2TRI729QAz","SWfougtCA5",
+"CIShGGrDg7","v1HlnFVMxo","pFrrlhSSvQ","mz8gx618Di","MGlTFs7Mxk","6q6L9CNHmv","G1RhSJRJQB","WDVWJs4786","55rfBMojnP","NAFuwWaWsv",
+"uoStw8cVD3","prNT6wiHrZ","lsQGotl72W","Cp3mZqQxHP","0h1b16q6L9","i7WMQKASQ8","EdBKc0ao3l","5Namm580YD","RsQUquLtKs","ogLgcmz8gx",
+"VNCPdQClRL","d7vjMmX2GE","MezSWZ4I1v","kB5nPPb1pa","pv0i7i3pyd","7fKYUtlILt","WreyPU3yw5","fLNg8Dz1R3","5drc6JXljW","8hJdtMGlTF",
+"lXFOBIRh48","QYxC0M3zXL","yToGWrKDLJ","9y4lw5iGN5","Q6LixpT8wu","SjskQjzUqR","HlUbF7fKYU","5NammJkzUn","55rfBOUYuF","YOfrYWPmlx",
+"SWfouk85Ae","Dz1R316lHc","UlU3MlViBv","2NslmQworu","lweGy9rlg9","0ao3lfmIK1","Cp3mZbZLvS","x3LDefFDrJ","AmdQdlj07Q","uZPqgfqypy",
+"8hJdtCxVEf","uZPqgSmGzv","MmsIoVBjhz","45cIH2DREs","MK07Y7fsYM","s7Mxkd7vjM","uPX7GCxVEf","SWfou2TRI7","PYBf4he9IA","DLhzMNo0Qb",
+"WmadAix74r","s7Mxk0Wr5y","CK5W7prNT6","lweGytAOsr","lCMxypmeCd","lCMxyTCgPp","aFFssIn3NS","WreyPiqv4k","wDajXGWqqX","aL6AJ7fsYM",
+"ydG8Uxciqp","RmDcrYjB9t","7fKYU2DREs","EOE1ookgRi","55rfBO3iyQ","DLhzMX6Pin","cmXIXDG4sT","2NslmXflUq","kZANmYw2oU","0h1b1yvOMI",
+"5Namm5VZjS","h1zcHW3VFH","lXFOB4W0Tl","CIShGyEfy9","Z4I1v7lUXZ","Z4I1vJXljW","DG4sTyofH3","hSSvQo8Uyd","QWxoTkB5nP","o8Uydo8Uyd",
+"Nxx9Vs7Mxk","hi5X7FLsph","y94nwyvOMI","GSQwjJIqXi","guMb8lj07Q","7ku1pLbRTH","oQ87rTXQ0Z","FVMxo2ZHdk","gIYvEThjNn","xReecO3iyQ",
+"BbwgATa8f6","2ZHdkWmadA","5ZaEzaFFss","0KyfsyvOMI","S2DfuIjTwP","LewvM0YAGH","ThjNnuJScX","IKxdLyEfy9","EdBKcWaim6","8TxD7nFqik",
+"cmXIXAkKTk","xXTI48FmFH","FcWrW580YD","QbxXcsuY4x","yEfy9ksJby","NhXdu4W0Tl","lpF6WUvlv4","s4786zFgtB","5VZjSlCMxy","8hJdt7Ow5C",
+"FwEJzYjB9t","Rxrsmv8yFN","IKxdLReKEW","dhSuHOUqFM","ulk41BbwgA","jfREua00b5","XyPZNAOgEe","ZzJHWHzZT8","s4786OUqFM","P6bcgdhSuH",
+"4QMc9qaofN","KsjRKBGaQY","MGlTFtuDyS","CK5W7MojnP","uN6r35iGN5","I7p2aUl4a1","gdQsSG1RhS","QWxoTOUYuF","VBjhz6AFT0","Dz1R3ReKEW",
+"7fKYU2Nslm","zmLYDKZamH","VjCZqUmaEv","2NslmbrhlQ","azIWpZzJHW","S2DfuCfgr3","0h1b1CK5W7","5IhmG1LB1L","pWiOsazIWp","2DREsZuDtD",
+"GWqqXm4bxU","Waim6QssNC","jiVBP0h1b1","LbRTHPOUYS","hi5X7pmeCd","P6bcgUlU3M","fqypyzbIYY","lH1kt7hyVv","l83UdjSjS3","qUJMdM6qcG",
+"ReKEWt98iW","OUYuFi7WMQ","ZzJHWOUYuF","CdyBV24ARF","JJs5miKqhr","aL6AJpvgjS","64s8NEdBKc","OHaBz7fKYU","brhlQMGlTF","gIYvElweGy",
+"QWxoTpT8wu","Yf2Ecpv0i7","8RCUAJ2mQi","GrDg7hi5X7","BpYhVOUqFM","CNHmv8FmFH","RpBQmD6rBy","AOgEe55rfB","WreyPfqypy","BGaQYB3qem",
+"lkMUASWfou","HzZT8JIqXi","S77LHpv0i7","WreyPlm0pD","OUqFMuQIcz","bZLvS9XyT9","d7vjMOUqFM","gjUTugf8rI","lH1ktMezSW","FnPFB8TxD7",
+"C2IrcQYxC0","ReKEWUvlv4","VLTy6RpBQm","XyPZNzmLYD","GXdoHGXdoH","RsQUqzbIYY","EOE1o16lHc","7lUXZzz4ZU","d7vjMlH1kt","Waim62Nslm",
+"o8Uydrhl0J","8xEKzHP433","jS1ajIjTwP","8xEKzFVMxo","hi5X7O3iyQ","MmsIoIjTwP","uQIczokgRi","FLsphni2v1","XyPZNCxVEf","djsrvBpYhV",
+"WmadAhE1Ql","xciqpQ6Lix","1LB1Lzz4ZU","HP4337lUXZ","FVMxovOqCE","pAhR1G1RhS","gtCA5FxX9q","pWiOs29QAz","lXFOBgdQsS","k85AepWiOs",
+"zz4ZUsoy9t","Yh1hF1j5L8","lsQGouvf7A","uZPqgrhl0J","Yf2EcpvgjS","GSQwjwDajX","C2IrctAOsr","VBjhzmX2GE","IKxdLKASQ8","dmoS7MGlTF",
+"5IhmGFwEJz","AmdQdlm0pD","qaofNGSQwj","HP433he9IA","NAFuwQbxXc","DQimpkB5nP","lsQGoGrDg7","azIWpokgRi","5VZjS6q6L9","ZJTXHSbRYy",
+"okgRiUl4a1","piJSkzY1GY","In3NSW7cTs","i7WMQs93Ml","djsrvwDajX","LDk6fCfgr3","EOE1oFjHXR","5IhmGS2Dfu","KZamHn1pmO","b29RJW3VFH",
+"Ul4a1VBjhz","K20wKSjskQ","m4bxUHlUbF","TCgPpJRJQB","ru4UG5iGN5","uPX7GlweGy","prNT6MK07Y","vLsmSuJScX","OHaBzCqqaD","2Yz7EJJs5m",
+"9XyT9gdQsS","24ARFo8Uyd","ECMvU6q6L9","i7WMQ618Di","cQOnvU3yw5","lweGy07n1c","24ARFYOfrY","OxWIHYOfrY","KsjRKAgJHQ","7lUXZTwano",
+"KZamHiqv4k","CIShGFjHXR","kB5nPrz7Ut","HP433Ul4a1","lkMUAhUTw7","sx5Glv2eC3","tuDySC2Irc","FVMxoAXpwE","okgRiydG8U","Oz8yZvkCHH",
+"Dz1R3aFFss","RxrsmkB5nP","OHaBzCp3mZ","a00b5AmdQd","gtCA5uAWyp","Gv3Fq7lUXZ","8FmFHLewvM","n1pmOMK07Y","1v5hHBCxeC","d7vjMW3VFH",
+"9eoRcfLNg8","lXFOBRpBQm","0YAGHzQt6Q","tl72Wv2eC3","Dz1R3HfyNQ","lViBvk85Ae","IBe8kB3qem","ciuWz3weIF","FxX9qThjNn","x3LDeC2Irc",
+"fFDrJVNCPd","guMb84dEz6","m4bxUlViBv","qUJMdd7vjM","uLtKsAXpwE","X6PinlCMxy","ru4UGnnP8o","9rlg9Twano","Yf2EcSbRYy","vLsmSdjsrv",
+"IBe8k8xEKz","FnPFBo8Uyd","uTacxfaHir","m4bxUi3pyd","Gv3FqIjTwP","e6e4zuPX7G","kZANmyEfy9","L7cGcpmeCd","BFkb8lkMUA","atef2RBhp0",
+"jzUqRjeskS","lCMxyyvOMI","nnP8oS77LH","X6PinWPmlx","uTacxhSSvQ","lH1ktwDajX","FLsphDz1R3","No0Qb0ao3l","JKWYRBGaQY","14FLRcL0aE",
+"Dz1R3Q6Lix","bgJAzAIYUu","jfREuYh1hF","LewvMQ6Lix","mX2GEZ4I1v","1j5L8Twano","5Mg9rQChxs","L7cGcW3VFH","CqqaDaez9y","v2eC3SbRYy",
+"MK07YokgRi","VIlwPFFDui","BCxeCP6bcg","Gv3FqksJby","29QAzNOHsz","QClRLOz8yZ","uJScXgdQsS","tlILtiB08l","RACujlCMxy","IRh4848cHL",
+"EoToPQbxXc","StlDJtaOXK","lkMUA8FmFH","IBe8k0YAGH","atef2AOgEe","piJSkgIYvE","pmeCd5drc6","PYBf4y94nw","piJSknFqik","NhXdugIYvE",
+"8U2nUqUJMd","jeskSzz4ZU","GWqqX5iGN5","Mm8siMezSW","EOE1oOHaBz","pAhR1EoToP","RkQkeVNCPd","aDGtSazIWp","RmDcrzQt6Q","WmadA3otm6",
+"lViBv5nmWv","Oz8yZAkKTk","Y1mC0DcpWB","ulk41hSSvQ","ni2v15Namm","1LB1LP6bcg","0MR5X5Namm","ZzJHWzHF1q","xXTI4gtCA5","zY1GYjiVBP",
+"fqypyNo0Qb","uJScXn8pJ9","LDk6f7fKYU","5Mg9rK4GS8","yluBxWaWsv","C2IrcDG4sT","M3zXLNAFuw","LbRTHuZPqg","uupzkokgRi","NAFuwWmadA",
+"uPX7GQbxXc","S77LH4W0Tl","7Ow5CcmXIX","KASQ8uJScX","uupzk45cIH","aL6AJfLNg8","0Wr5yMm8si","OUYuFRsQUq","ZuDtDFFDui","ydG8UJIqXi",
+"QworuCfgr3","hUTw7vLsmS","5Mg9rFhtgl","UmaEvQClRL","2Yz7EbrhlQ","pv0i7RBhp0","yEfy9ogLgc","IjTwPhE1Ql","pmeCdlXFOB","lj07QVjCZq",
+"CK5W7oGu6x","K4GS8Cp3mZ","24ARFix74r","K4GS8Zv7z0","JKWYR5Mg9r","fLNg8Q6Lix","WreyP45cIH","1v5hHzbIYY","QworuuQIcz","zbIYYpv0i7",
+"RzaZAbgJAz","TCgPpzFgtB","zz4ZUSmGzv","nnP8ookgRi","SjskQD6rBy","0Kyfsv8yFN","iwzGkgdQsS","aDGtShYBCK","CqqaDuLtKs","GSQwjbZLvS",
+"uAWyp0Kyfs","djsrv7lUXZ","K20wKmz8gx","v8yFNgtCA5","vOqCEJJs5m","o8UydzY1GY","5iGN5tvdkD","9iGoTv8yFN","ogLgcHlUbF","9eoRcEOE1o",
+"8hJdtIBe8k","lsQGo7ku1p","7hyVv7fsYM","K20wKsx5Gl","ru4UGBFkb8","qUJMdNxx9V","ru4UGDz1R3","K4GS8CNHmv","LewvMGrDg7","5Drn08cVD3",
+"gdQsSMm8si","tuDySDcpWB","i3pyduJScX","piJSkUlU3M","t59lRDLhzM","jS1ajix74r","kB5nPiqv4k","bZLvSru4UG","n8pJ9s4786","9XyT9OUqFM",
+"iwzGkStlDJ","pFrrlNo0Qb","CdyBVyluBx","hE1Ql5nmWv","JXljW3otm6","lViBvYh1hF","VBjhzeuZA5","a00b5HzZT8","AkKTkDG4sT","soy9tjeskS",
+"zFgtBNcICA","Mm8sieuZA5","JRJQB5nmWv","lXFOB6AFT0","JXljWydG8U","fcJOy6AFT0","sqVrfNxx9V","55rfBYjB9t","BbwgAa00b5","HfyNQ9iGoT",
+"tvdkDFFDui","qUJMdni2v1","HzZT85iGN5","RxrsmciuWz","L7cGcMojnP","xReec7X3uy","RzaZAHfyNQ","HP433zz4ZU","3otm6QClRL","n8pJ97fKYU",
+"5nmWv8RCUA","45cIHuZPqg","ogLgcblLA9","uupzkbZLvS","7fKYUvLsmS","ZhwG1fLNg8","zqH0WyvOMI","Dz1R3uN6r3","No0QbTa8f6","Twanouvf7A",
+"he9IAQbxXc","Kr8ysTa8f6","Waim6TCgPp","CIShG7fsYM","mz8gxNhXdu","cQOnvFcWrW","GSQwjJJs5m","Rxrsmt59lR","8FmFHoGu6x","DG4sTK4GS8",
+"9eoRcYh1hF","iqv4kBGaQY","MojnP5IhmG","wDajXpmeCd","Yf2EcyEfy9","Kr8ysmz8gx","vkCHHogLgc","djsrvb29RJ","GWqqXMkgy8","5nmWvpiJSk",
+"RzaZAXflUq","K4GS8EdBKc","xciqp1j5L8","ThjNnQssNC","zmLYDoVQp6","fLNg8pmeCd","yvOMI0Wr5y","OUqFMF6PT2","P6bcg0BmCy","x3LDeuvf7A",
+"lj07Qi3pyd","faHirEdBKc","W7cTsokgRi","Ta8f6brhlQ","5ZaEzuTacx","L7cGc64s8N","24ARFQ6hMC","BGaQYDG4sT","BpYhV0MR5X","CIShGUmaEv",
+"1j5L8FLsph","pT8wuPOUYS","wiHrZ7Ow5C","oGu6x07n1c","MK07Y7hyVv","JKWYRW7cTs","CNHmv7lUXZ","CK5W78U2nU","brhlQJRJQB","WMiS3jSjS3",
+"XyPZNQWxoT","guMb81j5L8","zQt6QOz8yZ","WMiS3Z4I1v","bZLvSZv7z0","b29RJokgRi","Ss0Zuatef2","nnP8oKASQ8","HlUbFChuy3","Yh1hFFwEJz",
+"2hEEU7hyVv","9rlg9cL0aE","M3zXLZuDtD","bgJAz07n1c","uoStwGSQwj","uoStwUlU3M","NcICApmeCd","ix74rhe9IA","Nxx9VoQ87r","FjHXRLewvM",
+"W7cTsMmKGJ","ogLgcpFrrl","zHF1qHRxd8","618DivkCHH","7fKYU7ku1p","VjCZqK20wK","DG4sTChuy3","jeskSM3zXL","StlDJAOgEe","MojnPCK5W7",
+"GWqqX5ZaEz","DQimpo8Uyd","FnPFBv1Hln","rz7UtP6bcg","pFrrleuZA5","s4786kZANm","L7cGche9IA","yEfy9618Di","uLtKsyToGW","BbwgA580YD",
+"iB08lbrhlQ","sx5Glv8yFN","PYBf4GrDg7","hi5X7JKWYR","cQOnvzQt6Q","7Ow5CpvgjS","KsjRKhYBCK","BpYhVHlUbF","Chuy3FLsph","07n1ctl72W",
+"jSjS3lsQGo","JJs5mFhtgl","MmsIoGWqqX","2DREsJKWYR","AmdQdaFFss","Mkgy8kZANm","he9IAsqVrf","8U2nUGSQwj","QworulweGy","IBe8kuTacx",
+"JRJQBB3qem","BGaQYhSSvQ","azIWpyEfy9","uvf7AzHF1q","2NslmyToGW","yToGWblLA9","n1pmOJRJQB","lsQGo2Yz7E","Pb1paRxrsm","jtn0XMaJQs",
+"TXQ0ZYf2Ec","dpe1vRkQke","ulk41QYxC0","WaWsvYw2oU","S2DfuguMb8","NOHszoVQp6","K4GS8lj07Q","jeskSrhl0J","9rlg9W3VFH","ogLgche9IA",
+"i7WMQpiJSk","NcICAzmLYD","Nxx9VnlaBy","SbRYy618Di","fcJOyix74r","OHaBzatef2","o8Uyd580YD","Pb1pavLsmS","Mkgy8hi5X7","7ku1pjeskS",
+"2Nslm1v5hH","QnJ1StuDyS","WreyPDz1R3","5ZaEzAgJHQ","sqVrfW3VFH","WmadAcShY2","gf8rIzz4ZU","mX2GEksJby","jS1ajRACuj","J2mQigjUTu",
+"fFDrJaez9y","mX2GEjzUqR","dQ586OUqFM","J2mQijtn0X","2TRI70h1b1","Vprf2bgJAz","SmGzvlCMxy","dmoS7wDajX","2Yz7EcL0aE","okgRiEoToP",
+"iKqhrRzaZA","LbRTHVNCPd","uZPqgSbRYy","IBe8kOUqFM","ciuWzQClRL","NcICAYh1hF","FVMxo5Drn0","VLTy6uAWyp","y94nwZ4I1v","4W0TlmX2GE",
+"FFDuiRzaZA","zmLYDRzaZA","VBjhzdhSuH","2hEEU2ZHdk","UmaEvVLTy6","Yh1hFQworu","ZzJHWQWxoT","2DREs0h1b1","uZPqgNhXdu","uLtKssoy9t",
+"qaofNdhSuH","gIYvE2Yz7E","VLTy6t59lR","ydG8UJJs5m","2Yz7E9iGoT","LbRTHW7cTs","G1RhS07n1c","No0QbWmadA","9rlg9aez9y","ZUnqtWMiS3",
+"vkCHHFxX9q","FNYIMrKDLJ","Yw2oUhe9IA","HRxd8OHaBz","iKqhrgtCA5","Cfgr3JKWYR","0h1b1K20wK","1v5hHZ4I1v","hSSvQkB5nP","IBe8k7ku1p",
+"5ZaEzJKWYR","jSjS3fcwDa","rKDLJGXdoH","cQOnvOUqFM","oVQp6EdBKc","soy9tx3LDe","lweGy7X3uy","DQimpx3LDe","ogLgctl72W","nFqikpmeCd",
+"Uvlv43otm6","xciqp2hEEU","VNCPdn1pmO","fqypyNOHsz","5Mg9rtaOXK","48cHLaDGtS","rKDLJ3otm6","8FmFHSWfou","tl72WlH1kt","BFkb8FwEJz",
+"POUYSCNHmv","lViBvni2v1","k85AeGv3Fq","EdBKcThjNn","gjUTuHlUbF","qQxHPAIYUu","k85AeCp3mZ","lpF6WtuDyS","tvdkDWaim6","24ARFZUnqt",
+"SbRYyQChxs","tuDySbgJAz","K4GS8BCxeC","ThjNnsqVrf","8U2nUrKDLJ","Q6LixS2Dfu","aL6AJzHF1q","uPX7GcShY2","hYBCKRxrsm","mz8gxSs0Zu",
+"tvdkDIn3NS","RACujuZPqg","HfyNQRmDcr","azIWp4W0Tl","0BmCyyofH3","YOfrY5Mg9r","CxVEfwDajX","IKxdLwDajX","fqypyix74r","WmadAGWqqX",
+"he9IAjeskS","DcpWBTa8f6","WreyPxciqp","0BmCyIBe8k","5Drn05Mg9r","JIqXiAXpwE","F6PT2ogLgc","v2eC3ZuDtD","aez9y3weIF","oVQp6brhlQ",
+"ZzJHWtvdkD","16lHc1v5hH","HfyNQ5VZjS","Y1mC0J2mQi","zqH0WuPX7G","OUYuFn8pJ9","FFDui9XyT9","X6Pin64s8N","uZPqgCfgr3","CNHmvUlU3M",
+"uvf7APYBf4","fmIK1tuDyS","jeskSfLNg8","VBjhzStlDJ","8xEKzNAFuw","uN6r32hEEU","J2mQixReec","sx5Gltl72W","JXljWhUTw7","4dEz65iGN5",
+"Twanos4786","TXQ0ZSs0Zu","jS1ajni2v1","LbRTHblLA9","IBe8knFqik","QClRLcQOnv","s7Mxk0Kyfs","x3LDeGv3Fq","aFFssDG4sT","AOgEe580YD",
+"v8yFNGrDg7","he9IAt98iW","L7cGco8Uyd","Dz1R3euZA5","v8yFN7Ow5C","0PktI618Di","4W0TlhSSvQ","vkCHHAmdQd","fcwDaF6PT2","580YD8xEKz",
+"1v5hHNAFuw","VLTy6JIqXi","aL6AJn8pJ9","4W0TlCqqaD","he9IApvgjS","iqv4kqaofN","580YDNAFuw","gjUTu2TRI7","uJScXoVQp6","oQ87rvkCHH",
+"8xEKzaFFss","hE1QlVLTy6","StlDJOUqFM","ksJby24ARF","VjCZqMmsIo","7X3uylj07Q","ulk4116lHc","zz4ZUaDGtS","lpF6WIBe8k","pvgjSZhwG1",
+"mz8gxcShY2","XyPZNqUJMd","2hEEUuoStw","RxrsmCK5W7","AkKTk0ao3l","CNHmv2ZHdk","TXQ0ZKASQ8","dpe1vIKxdL","CxVEfkZANm","UmaEvM6qcG",
+"fLNg8pvgjS","jSjS3cShY2","d85a9MaJQs","ogLgcuvf7A","hi5X74QMc9","v1HlntjQxs","jfREujiVBP","W3VFHa00b5","BpYhVCdyBV","lH1ktZJTXH",
+"9XyT9Mkgy8","zY1GYpFrrl","cShY2mz8gx","yEfy9CxVEf","U3yw5FjHXR","xReecbrhlQ","QWxoTO3iyQ","RsQUqvLsmS","iB08lzmLYD","K4GS8NOHsz",
+"3otm6MojnP","ksJbyQssNC","bZLvSLbRTH","Cfgr3euZA5","0ao3lMK07Y","VLTy65nmWv","9eoRcl83Ud","MezSW64s8N","VBjhzwDajX","FcWrWlH1kt",
+"2ZHdkmX2GE","CqqaDLDk6f","CxVEfFLsph","Fhtgl0MR5X","HP433Chuy3","azIWpI7p2a","1j5L88TxD7","Oz8yZfaHir","AkKTkOz8yZ","Q6LixprNT6",
+"BGaQYyluBx","uTacx7fKYU","y94nwIjTwP","07n1cdpe1v","DLhzMxReec","jtn0XsuY4x","AOgEe8FmFH","lj07Ql83Ud","IjTwPQnJ1S","pT8wuJIqXi",
+"Waim6VerEA","9iGoTk85Ae","hUTw7uoStw","zz4ZUrz7Ut","KsjRKF6PT2","jeskSSbRYy","QYxC04QMc9","t59lRIBe8k","gdQsSjtn0X","X6PinD6rBy",
+"v2eC3cQOnv","Pb1papFrrl","bgJAz9GXkX","M6qcGdQ586","vLsmSBFkb8","fcJOy0MR5X","aez9yxciqp","LDk6fFNYIM","BpYhVlkMUA","45cIHZzJHW",
+"5Mg9rulk41","OxWIHC2Irc","sx5GlU3yw5","7Ow5CfcJOy","GSQwjFPfSE","EdBKc2DREs","lXFOBUl4a1","8cVD3zz4ZU","YOfrYDG4sT","MmsIozQt6Q",
+"uZPqg29QAz","jS1ajY1mC0","RpBQm24ARF","7Ow5ChYBCK","pv0i7tvdkD","5iGN5sqVrf","VerEA1LB1L","pFrrl9y4lw","JKWYRCdyBV","n8pJ9gtCA5",
+"uTacxlXFOB","D6rBys4786","piJSkRkQke","TwanoYf2Ec","B3qemKsjRK","YOfrYLDk6f","U3yw5qaofN","CNHmvgdQsS","7lUXZNo0Qb","9iGoTyEfy9",
+"Kr8ysgjUTu","aL6AJMaJQs","9XyT9hUTw7","5NammZUnqt","8TxD78FmFH","jfREu7ku1p","aL6AJZhwG1","MmKGJ0h1b1","jS1ajUmaEv","ciuWzRxrsm",
+"fFDrJoQ87r","FwEJzv1Hln","MezSWFLsph","ix74r0BmCy","BCxeCYf2Ec","WMiS32hEEU","gdQsSfcJOy","i7WMQPYBf4","S2DfuG1RhS","K20wK0Kyfs",
+"cQOnv0h1b1","L7cGczz4ZU","o8UydOxWIH","GWqqXTwano","aDGtSlj07Q","uLtKsJRJQB","lsQGodQ586","1j5L8FjHXR","hE1QlVjCZq","AmdQdAIYUu",
+"GXdoHFhtgl","d7vjMSs0Zu","2hEEUjiVBP","9XyT9d7vjM","0YAGH0ao3l","PYBf4ciuWz","gjUTudmoS7","Ul4a1Oz8yZ","OUqFMYh1hF","v2eC3jiVBP",
+"HRxd8uJScX","qQxHPpv0i7","VjCZqNOHsz","NcICAhUTw7","29QAztaOXK","zQt6QCK5W7","GXdoHsqVrf","jSjS3VBjhz","t98iWyluBx","0h1b1HzZT8",
+"a00b58cVD3","mX2GEblLA9","5NammWMiS3","4QMc9lsQGo","BGaQYLewvM","mz8gxvLsmS","jiVBPru4UG","VLTy69eoRc","hYBCKEOE1o","580YDECMvU",
+"4QMc9aDGtS","jiVBPSmGzv","7fKYUDLhzM","uvf7AMmsIo","AXpwEYf2Ec","s7MxkECMvU","guMb8UmaEv","5NammDQimp","ZJTXHJXljW","aFFss2DREs",
+"djsrvCK5W7","Yw2oUNcICA","24ARFpFrrl","U3yw5MK07Y","blLA9SjskQ","Fhtgldjsrv","cQOnvAOgEe","AXpwElXFOB","lH1ktWDVWJ","OxWIHFwEJz",
+"14FLRG1RhS","hYBCKLewvM","qQxHPrz7Ut","fLNg8Zv7z0","7X3uyYh1hF","gjUTuRsQUq","gtCA516lHc","DcpWBJJs5m","VNCPdQChxs","a00b5U3yw5",
+"euZA5lpF6W","No0QbI7p2a","3otm6FwEJz","Nxx9VxXTI4","VLTy67Ow5C","uJScXQClRL","3weIF8U2nU","rKDLJHlUbF","lweGycmXIX","blLA9XyPZN",
+"tuDyS3weIF","5VZjS24ARF","uupzk1LB1L","lm0pDVBjhz","d85a9Ss0Zu","U3yw548cHL","i3pyd5drc6","ZuDtDs7Mxk","W7cTsKsjRK","kZANmguMb8",
+"FNYIMs7Mxk","AOgEeThjNn","azIWpiqv4k","ECMvUwiHrZ","fFDrJFLsph","WmadAFVMxo","GWqqXS2Dfu","HlUbFb29RJ","ThjNnjfREu","iwzGkRsQUq",
+"dpe1vs4786","24ARF9y4lw","Nxx9VuZPqg","HfyNQulk41","HlUbFaez9y","lweGyprNT6","SjskQyofH3","8TxD7lkMUA","zqH0WzQt6Q","B3qemlpF6W",
+"S77LHwDajX","GXdoH7Ow5C","yofH35Namm","qaofNWPmlx","IjTwPx3LDe","5NammcQOnv","VIlwPni2v1","HzZT8cShY2","8cVD3RBhp0","5Drn0fLNg8",
+"Q6LixCIShG","v2eC30BmCy","9XyT929QAz","OUqFMcShY2","2DREsni2v1","k85AeRsQUq","qaofNAgJHQ","1LB1LJ2mQi","yToGWatef2","AOgEeeuZA5",
+"faHirPb1pa","2ZHdkXflUq","JIqXiuQIcz","lCMxyqaofN","NcICANo0Qb","0KyfsJIqXi","O3iyQEdBKc","Yw2oUHfyNQ","AgJHQuJScX","gtCA5suY4x",
+"yToGWsqVrf","qUJMd14FLR","4QMc9wiHrZ","C2IrcFxX9q","lm0pD9y4lw","hUTw7d85a9","tvdkDK20wK","pv0i7DcpWB","kZANmMkgy8","WmadAFjHXR",
+"lkMUAksJby","fcJOyChuy3","dmoS70PktI","Q6LixVprf2","tlILtaL6AJ","iqv4klj07Q","oQ87rhe9IA","M6qcG5Drn0","mX2GEGSQwj","NAFuwNo0Qb",
+"CdyBVn1pmO","e6e4zKZamH","AOgEeJJs5m","MK07YY1mC0","nnP8oGXdoH","NcICAlweGy","JXljWfaHir","aez9yQ6Lix","hi5X78RCUA","dQ586aez9y",
+"e6e4zFxX9q","NhXduAIYUu","WreyPYh1hF","gtCA5uJScX","rz7UtQssNC","Cp3mZLbRTH","rKDLJs7Mxk","7fsYMFcWrW","L7cGcUmaEv","5IhmGs7Mxk",
+"suY4xGv3Fq","uJScXXyPZN","n8pJ90ao3l","JJs5mFNYIM","JJs5mb29RJ","XyPZN2Nslm","0KyfsZzJHW","i7WMQblLA9","FLsph4W0Tl","CdyBVHfyNQ",
+"0h1b17fKYU","aDGtSSbRYy","wDajXRmDcr","AgJHQyToGW","Yw2oUWaWsv","AIYUuwDajX","s4786a00b5","POUYSNxx9V","Uvlv4lH1kt","soy9t5VZjS",
+"SjskQkZANm","Q6LixnFqik","CIShGMmKGJ","IBe8ki7WMQ","BGaQYZv7z0","2NslmpT8wu","TwanoFNYIM","NhXdusuY4x","uJScXdpe1v","Chuy3gjUTu",
+"2DREsyluBx","GWqqXGrDg7","24ARFHRxd8","tlILtlViBv","IKxdLWaim6","dpe1vNOHsz","L7cGcMaJQs","lViBv64s8N","SWfouMGlTF","uN6r34dEz6",
+"W7cTsSmGzv","Kr8yshUTw7","Vprf2ni2v1","ogLgce6e4z","gf8rIEoToP","lXFOBBbwgA","nlaBylXFOB","AmdQdblLA9","CNHmvzbIYY","8FmFHQbxXc",
+"NOHszhUTw7","cL0aEuoStw","lsQGom4bxU","nlaByFPfSE","uN6r3fqypy","I7p2an8pJ9","pmeCdv1Hln","zmLYDni2v1","LDk6foQ87r","FjHXRMkgy8",
+"In3NS1LB1L","BCxeCIKxdL","Ta8f6tl72W","yToGWTXQ0Z","IRh48RzaZA","gIYvEQ6hMC","tl72WLbRTH","SbRYyiKqhr","S77LHi3pyd","uupzkCdyBV",
+"jS1ajThjNn","s4786AIYUu","FLsphMkgy8","0PktIQnJ1S","L7cGcOz8yZ","MezSWW3VFH","jeskSlXFOB","2DREsGv3Fq","uLtKsi7WMQ","MezSWpvgjS",
+"XflUqQ6hMC","G1RhS7fKYU","VBjhz7lUXZ","BCxeCNcICA","vLsmSSs0Zu","vkCHHpAhR1","rz7UtzmLYD","jeskS0ao3l","CdyBVsqVrf","taOXKJXljW",
+"2DREsKZamH","RsQUqZv7z0","Yf2EcvkCHH","4QMc9HlUbF","qUJMdk85Ae","7Ow5CIKxdL","fFDrJOz8yZ","faHirGSQwj","Y1mC0ZJTXH","WDVWJtAOsr",
+"DLhzMNOHsz","zmLYDYjB9t","IKxdLbrhlQ","uoStwlCMxy","RBhp0ZJTXH","In3NS2ZHdk","tAOsr1j5L8","lViBvciuWz","WMiS3Vprf2","CqqaD1v5hH",
+"t98iWGXdoH","W7cTsMaJQs","2ZHdkatef2","D6rByRsQUq","CxVEfiwzGk","8xEKz45cIH","HRxd8aFFss","MmsIon1pmO","RxrsmEOE1o","ZJTXHAXpwE",
+"ydG8U0BmCy","GWqqXuZPqg","zFgtBlj07Q","faHirtlILt","m4bxUtuDyS","618Diy94nw","IBe8klXFOB","vkCHHO3iyQ","Chuy3azIWp","AIYUu2DREs",
+"07n1c7hyVv","nFqikfLNg8","FwEJzAOgEe","wiHrZBbwgA","8cVD3bZLvS","CqqaDCxVEf","uupzkuvf7A","hUTw7FPfSE","Y1mC0WPmlx","lj07Qb29RJ",
+"aez9yU3yw5","hYBCKUl4a1","FjHXRn1pmO","pT8wuNAFuw","JKWYRYf2Ec","uTacxuN6r3","o8UydY1mC0","9rlg9lH1kt","9rlg90Wr5y","xReecBpYhV",
+"55rfBuAWyp","mX2GERBhp0","Zv7z09iGoT","StlDJ0Kyfs","tlILtx3LDe","Yh1hFaDGtS","WmadAo8Uyd","tlILtVNCPd","lweGyO3iyQ","Cfgr3EOE1o",
+"0YAGHoVQp6","2DREsn1pmO","qUJMdsuY4x","Ss0Zusx5Gl","8U2nUzmLYD","ZzJHWdjsrv","xReecjtn0X","AXpwEIKxdL","o8UydStlDJ","pT8wuaDGtS",
+"7X3uyaDGtS","WmadAdhSuH","pFrrl4dEz6","uTacxMmsIo","WmadA8RCUA","okgRi07n1c","HlUbFDz1R3","i3pyduZPqg","hYBCK2TRI7","Vprf2XyPZN",
+"zqH0WAgJHQ","YjB9tqQxHP","9GXkXpFrrl","POUYSuLtKs","L7cGcGWqqX","7lUXZhE1Ql","zmLYDzqH0W","jzUqRMkgy8","S2DfuOUqFM","WMiS3d7vjM",
+"SmGzveuZA5","nFqikEoToP","hSSvQW7cTs","ix74rSbRYy","lViBvfaHir","QChxsa00b5","8FmFH2ZHdk","BbwgAaDGtS","HfyNQ0Wr5y","YOfrY0ao3l",
+"M3zXL0PktI","IKxdLIKxdL","7ku1puZPqg","9eoRcC2Irc","K20wKVIlwP","RpBQmQ6Lix","LDk6fo8Uyd","AIYUuydG8U","lweGyhYBCK","B3qemn1pmO",
+"dQ586UmaEv","Ta8f6ksJby","MK07YRxrsm","FNYIMZv7z0","d85a9TCgPp","ZUnqt5Namm","yvOMIGWqqX","QworuW3VFH","Chuy31LB1L","WaWsvFjHXR",
+"2hEEU16lHc","kB5nPBbwgA","xXTI4iB08l","mX2GErz7Ut","yvOMI5Drn0","B3qemQ6hMC","9eoRctuDyS","BbwgAMezSW","Mm8siFPfSE","FNYIM9y4lw",
+"FhtglgdQsS","jeskSQworu","VjCZqG1RhS","Gv3FqVjCZq","guMb8BGaQY","YjB9t4W0Tl","vOqCE64s8N","5NammECMvU","Mm8sizz4ZU","1v5hHiB08l",
+"M6qcGbZLvS","ZhwG1O3iyQ","uvf7AcmXIX","ECMvUuZPqg","gtCA5FcWrW","k85AezbIYY","uPX7Gs7Mxk","hE1QlQYxC0","BGaQYh1zcH","CIShGnnP8o",
+"In3NS9eoRc","YjB9tG1RhS","MaJQsFcWrW","RACujHzZT8","IRh48OUqFM","KASQ8NcICA","9GXkXcL0aE","i3pydVerEA","9iGoTQ6hMC","nlaByYjB9t",
+"RkQke0MR5X","lCMxyK4GS8","07n1cnlaBy","iwzGkW3VFH","WaWsvUl4a1","cQOnvrKDLJ","lViBvK20wK","okgRi5VZjS","okgRiKASQ8","FwEJzlViBv",
+"Cp3mZoVQp6","FwEJzrhl0J","Dz1R3djsrv","DcpWBQworu","jS1ajXflUq","lm0pDQ6Lix","5nmWvUvlv4","FhtglSWfou","zz4ZUokgRi","lViBv2DREs",
+"5iGN5D6rBy","Vprf2FLsph","0Wr5ylpF6W","5VZjSlpF6W","5iGN5QWxoT","rhl0JQ6hMC","8TxD7n8pJ9","B3qemydG8U","PYBf4VLTy6","ru4UG5IhmG",
+"YOfrY0MR5X","rz7UtY1mC0","FxX9qOz8yZ","FNYIMoGu6x","tlILtzFgtB","0MR5XguMb8","mz8gxpAhR1","7Ow5CRsQUq","QbxXciqv4k","WMiS32TRI7",
+"DLhzMlCMxy","a00b5xXTI4","y94nwXyPZN","brhlQW3VFH","8cVD3CNHmv","7Ow5CAgJHQ","QssNCmz8gx","bZLvSguMb8","zQt6QFNYIM","cShY2Nxx9V",
+"qaofN48cHL","aFFsstlILt","MmKGJQYxC0","FGzgpl83Ud","BCxeCSs0Zu","XflUqlXFOB","BbwgAuTacx","D6rBy1v5hH","Fhtgl24ARF","tuDySi3pyd",
+"pFrrlrKDLJ","F6PT22Nslm","SmGzv0ao3l","MezSW6AFT0","qUJMdWaWsv","oGu6x0Wr5y","h1zcHFnPFB","s93MlGv3Fq","s7MxkuLtKs","5VZjSxXTI4",
+"2hEEUjSjS3","t59lRrKDLJ","LewvMjeskS","BpYhVzz4ZU","1v5hHfFDrJ","OxWIHzFgtB","16lHcVBjhz","FxX9qBCxeC","55rfBlsQGo","24ARFMmKGJ",
+"48cHLF6PT2","W3VFHEoToP","atef2JJs5m","7fsYMW3VFH","QWxoTk85Ae","yofH3Q6hMC","6AFT0Uvlv4","ZhwG1pFrrl","s7Mxk9iGoT","okgRiOz8yZ",
+"BCxeCzbIYY","O3iyQ9y4lw","qQxHPpAhR1","0YAGHprNT6","W3VFHBbwgA","Q6LixaDGtS","OUYuFydG8U","aL6AJ8RCUA","J2mQijeskS","G1RhSpiJSk",
+"580YDUmaEv","2TRI75Namm","ru4UG4QMc9","lm0pDpAhR1","BpYhVPOUYS","QssNCcShY2","xReeczFgtB","yToGWcmXIX","2TRI7NAFuw","RzaZARmDcr",
+"J2mQiFNYIM","8hJdtNxx9V","aL6AJgf8rI","HfyNQI7p2a","NcICAblLA9","l83UdtlILt","pFrrllm0pD","Y1mC0hYBCK","lkMUANxx9V","VBjhz7X3uy",
+"zmLYDHRxd8","xciqpru4UG","IRh48Mkgy8","7X3uynnP8o","CqqaDs7Mxk","Yw2oUSmGzv","rz7UtpmeCd","lkMUAIjTwP","tl72W5nmWv","lCMxyIjTwP",
+"zQt6QYw2oU","jSjS3QClRL","IRh482Nslm","IKxdLogLgc","MK07YQbxXc","7fsYMkZANm","0MR5XFnPFB","zY1GYZ4I1v","5ZaEzRxrsm","prNT6iqv4k",
+"o8UydVjCZq","POUYSgjUTu","DLhzMTXQ0Z","ksJbyZuDtD","uvf7Afqypy","1j5L8qaofN","VLTy6VjCZq","POUYSIKxdL","Z4I1vX6Pin","zQt6QuZPqg",
+"IBe8kWaim6","TCgPp29QAz","guMb8CxVEf","8hJdtNAFuw","uupzkuJScX","JJs5mydG8U","Mkgy8lH1kt","CqqaDGv3Fq","uAWyp55rfB","oQ87rfcwDa",
+"FxX9qaFFss","WreyPYOfrY","d85a9fcwDa","i7WMQ3otm6","FVMxo8xEKz","rz7Ut5drc6","HRxd8okgRi","zmLYDx3LDe","lweGywiHrZ","ix74rfmIK1",
+"hE1QlHfyNQ","24ARFNAFuw","hYBCKHfyNQ","brhlQ7Ow5C","gdQsS7fsYM","ogLgcKr8ys","nnP8ovOqCE","xReecBbwgA","WmadAl83Ud","Twano6AFT0",
+"wDajXB3qem","uoStwGrDg7","14FLRSWfou","hSSvQJKWYR","hUTw7mX2GE","CxVEffcwDa","VLTy6K4GS8","S2Dfuk85Ae","Mkgy8CqqaD","lCMxyZhwG1",
+"StlDJEdBKc","2Nslm9GXkX","Kr8ys3weIF","hUTw77Ow5C","2NslmLDk6f","ZUnqttjQxs","45cIHBbwgA","aDGtSPb1pa","HlUbFYh1hF","M3zXL9rlg9",
+"yEfy9POUYS","4QMc9LDk6f","Cp3mZulk41","8hJdtMmKGJ","aDGtSksJby","JRJQBiwzGk","zFgtBLewvM","StlDJaez9y","ECMvUNhXdu","nFqikpT8wu",
+"5NammfmIK1","gf8rI8U2nU","Ta8f6uTacx","sx5GlyvOMI","FVMxoKZamH","oVQp6I7p2a","DLhzMLDk6f","SWfouUvlv4","l83UdLewvM","CIShGM3zXL",
+"ZhwG1RACuj","9iGoTOz8yZ","55rfBX6Pin","8xEKzAOgEe","Twano9GXkX","atef2BCxeC","Rxrsm5VZjS","5IhmGMojnP","VLTy6sx5Gl","L7cGcK4GS8",
+"EOE1on1pmO","4dEz6djsrv","iKqhrUmaEv","dpe1vogLgc","AkKTkfaHir","45cIHSWfou","5ZaEzW3VFH","ZhwG1vOqCE","RsQUqh1zcH","lpF6WZ4I1v",
+"yEfy9NhXdu","ksJby7fKYU","Y1mC0jSjS3","pFrrlfmIK1","DG4sT64s8N","QWxoTGWqqX","0MR5XjiVBP","2Yz7EFjHXR","9rlg9L7cGc","gdQsSVIlwP",
+"sx5Gl5drc6","CxVEfIRh48","lj07Qrhl0J","rKDLJmX2GE","IjTwPRpBQm","UmaEvK4GS8","iKqhr0Wr5y","FLsphX6Pin","uZPqgLewvM","zQt6QUvlv4",
+"kZANms4786","XyPZNQworu","9rlg9WDVWJ","Gv3Fq2hEEU","d85a9WDVWJ","Yw2oUMGlTF","azIWpFxX9q","VIlwP6AFT0","mz8gxMK07Y","i7WMQVNCPd",
+"ZJTXHeuZA5","GWqqXUvlv4","tlILtwDajX","uoStw5Mg9r","lpF6WDLhzM","ix74rZhwG1","29QAzaL6AJ","BpYhVv2eC3","aDGtSRsQUq","RACujkZANm",
+"hUTw7ZJTXH","xXTI4NAFuw","Cp3mZKASQ8","JXljW1v5hH","8TxD7jSjS3","VBjhzQ6hMC","wiHrZyvOMI","L7cGcm4bxU","1LB1LXflUq","Dz1R39GXkX",
+"5Mg9rWaim6","Mm8siQ6Lix","5Mg9rQClRL","Oz8yZgtCA5","JKWYRa00b5","2ZHdkVprf2","1j5L8Waim6","2Yz7EI7p2a","t98iWpv0i7","DcpWBThjNn",
+"2TRI7DG4sT","lpF6WpAhR1","2Yz7E8U2nU","euZA5POUYS","s7Mxk8RCUA","7fKYUjiVBP","zFgtBjfREu","WreyPWmadA","taOXKNcICA","9rlg9aFFss",
+"jtn0XJkzUn","9y4lwn1pmO","kZANmtl72W","dQ586okgRi","Chuy3pv0i7","LDk6f9GXkX","8FmFHFLsph","WaWsvnnP8o","ydG8U0Wr5y","jeskSAkKTk",
+"VerEAWreyP","CxVEfMK07Y","n8pJ9t98iW","jzUqRNcICA","Chuy3soy9t","n8pJ9QnJ1S","AgJHQRkQke","16lHcwiHrZ","QYxC0o8Uyd","cQOnvbZLvS",
+"MK07YOUqFM","aez9ylweGy","x3LDe5Namm","lweGyzHF1q","pT8wuOz8yZ","ulk415ZaEz","Dz1R3tuDyS","lj07QFnPFB","tl72Wfqypy","fmIK1cL0aE",
+"FGzgp5Drn0","9eoRcGXdoH","SbRYy5IhmG","zHF1qhi5X7","G1RhSJkzUn","HzZT8iB08l","8RCUAlweGy","I7p2aVerEA","W3VFH2hEEU","YjB9tOUYuF",
+"W7cTsqQxHP","1j5L8SmGzv","lj07QWDVWJ","Z4I1vMezSW","BFkb89GXkX","v1HlnhE1Ql","DLhzMLewvM","FwEJzfmIK1","1LB1LqaofN","0h1b1lj07Q",
+"dmoS7UmaEv","7fsYMpWiOs","CK5W7uTacx","RkQkezmLYD","cmXIXZUnqt","jzUqRwDajX","s4786uLtKs","k85AetuDyS","VNCPdJ2mQi","VjCZqJKWYR",
+"YOfrYX6Pin","618DikB5nP","cShY2WmadA","9y4lwpv0i7","brhlQazIWp","KASQ8J2mQi","VjCZq3otm6","QYxC0WreyP","jiVBPdQ586","ydG8UzmLYD",
+"WaWsvQnJ1S","RBhp0cL0aE","NOHsz7fKYU","gdQsS0MR5X","NAFuws7Mxk","d85a929QAz","hE1QlAXpwE","7fKYUwDajX","y94nwazIWp","zbIYYCqqaD",
+"YjB9t8hJdt","suY4xDz1R3","FwEJz7fKYU","5drc6VBjhz","Yh1hF2Yz7E","9rlg929QAz","kB5nPTwano","lpF6Wni2v1","iqv4kZzJHW","pFrrl8TxD7",
+"lj07QiKqhr","ZzJHWMaJQs","Oz8yZlweGy","2ZHdkxXTI4","uTacxogLgc","Cfgr3uAWyp","i7WMQ0h1b1","cL0aE2Nslm","6AFT0prNT6","xXTI4a00b5",
+"Kr8ysFVMxo","In3NSNxx9V","o8Uyd9GXkX","qUJMdZJTXH","cL0aE7Ow5C","b29RJOUYuF","PYBf4v2eC3","jfREuAkKTk","5IhmGlpF6W","07n1c8TxD7",
+"BCxeCtjQxs","NcICA0BmCy","gtCA57fKYU","8TxD7okgRi","zY1GYYOfrY","FNYIMNAFuw","faHirSbRYy","MmsIowDajX","2DREsn8pJ9","LDk6f8U2nU",
+"Mkgy8zqH0W","ECMvUuPX7G","OxWIHtjQxs","WDVWJ4QMc9","FVMxo7fKYU","lXFOBVBjhz","WaWsvHRxd8","gjUTuBpYhV","9GXkX0BmCy","Ul4a1iKqhr",
+"NhXdublLA9","Pb1pabgJAz","LbRTHFLsph","lm0pDFVMxo","t59lRtl72W","Dz1R3vOqCE","ksJbyix74r","s93Ml7X3uy","uN6r3QYxC0","64s8NCIShG",
+"WreyPB3qem","JkzUnnlaBy","Mm8si8hJdt","BGaQYAgJHQ","WreyPX6Pin","SjskQhUTw7","Oz8yZAgJHQ","LbRTHfmIK1","2Yz7EUlU3M","cmXIXvLsmS",
+"LDk6fCdyBV","uN6r3VBjhz","WreyP7lUXZ","xciqpVprf2","x3LDeD6rBy","i7WMQhE1Ql","Cfgr3VLTy6","tvdkDiKqhr","jzUqRRzaZA","C2IrcaFFss",
+"lCMxyjSjS3","oGu6xWDVWJ","K20wK9eoRc","zbIYYuPX7G","t59lRix74r","nnP8oDcpWB","FxX9qbgJAz","1j5L8OUqFM","OHaBzbrhlQ","FFDuijiVBP",
+"cmXIXFwEJz","wiHrZru4UG","soy9tGv3Fq","taOXKs4786","CxVEfeuZA5","zz4ZUQChxs","yEfy9x3LDe","PYBf40h1b1","tjQxsUvlv4","pT8wuChuy3",
+"0PktI0h1b1","B3qemfcwDa","2Nslm5drc6","9eoRcXyPZN","dhSuHQworu","b29RJtAOsr","QClRLblLA9","vkCHHCIShG","VerEAnlaBy","zFgtB7Ow5C",
+"K20wK1LB1L","SbRYyiqv4k","wDajXPYBf4","mX2GETwano","bgJAzk85Ae","jiVBPtjQxs","FVMxoC2Irc","Ss0ZuCp3mZ","sx5GlVLTy6","Qworutl72W",
+"k85AeQ6Lix","5Drn0Cp3mZ","0h1b1DQimp","uTacxpWiOs","X6PinguMb8","qQxHPuLtKs","FjHXRNcICA","0h1b1v8yFN","7lUXZcmXIX","O3iyQ9rlg9",
+"6q6L9UlU3M","OUqFMbrhlQ","k85AeXyPZN","cShY2uJScX","DcpWBokgRi","SmGzvYOfrY","sx5GlyofH3","aDGtSsx5Gl","guMb864s8N","DcpWBvOqCE",
+"uN6r3QbxXc","4dEz6euZA5","KZamHFhtgl","n1pmOpv0i7","Nxx9V8xEKz","lCMxyBFkb8","KZamHYOfrY","P6bcgMkgy8","AgJHQZuDtD","dpe1v8RCUA",
+"GXdoHFcWrW","nFqikUlU3M","8U2nUiB08l","prNT6i7WMQ","MmKGJSbRYy","HlUbF6q6L9","S77LHJIqXi","618Dini2v1","2ZHdkQ6hMC","zHF1qCxVEf",
+"uAWypChuy3","tAOsrdmoS7","o8UydmX2GE","iqv4k5VZjS","QYxC0vkCHH","MojnPt59lR","64s8N0h1b1","ZzJHWtaOXK","MojnPHzZT8","oVQp6FLsph",
+"GWqqXZv7z0","jiVBPCNHmv","WreyPQ6hMC","ZzJHW4dEz6","prNT68TxD7","SmGzvBCxeC","8hJdtv1Hln","BCxeCMaJQs","jeskSlpF6W","2TRI7sx5Gl",
+"Fhtgl0BmCy","fmIK1BCxeC","fcwDaJRJQB","suY4xnFqik","vkCHHFGzgp","Gv3Fqs93Ml","BFkb87fKYU","ciuWz8hJdt","3otm6EdBKc","b29RJvkCHH",
+"piJSklCMxy","hSSvQlweGy","hE1QlAgJHQ","Mkgy8cL0aE","MmKGJGrDg7","t98iWdmoS7","NcICAkZANm","RpBQml83Ud","hUTw7FjHXR","VLTy6CxVEf",
+"FhtgltAOsr","nlaBy7lUXZ","RpBQmWMiS3","FPfSElsQGo","qaofNU3yw5","PYBf4CxVEf","JkzUn5drc6","DG4sTZ4I1v","8xEKzeuZA5","Z4I1v4QMc9",
+"S77LH2DREs","jSjS3C2Irc","KASQ8Uvlv4","iwzGkW7cTs","07n1cgtCA5","ThjNnVNCPd","Mkgy8RzaZA","FwEJzWMiS3","2Nslm4dEz6","GWqqXksJby",
+"ZUnqtTXQ0Z","FGzgp1LB1L","iB08l64s8N","Yf2EcJIqXi","jS1ajguMb8","tlILtO3iyQ","zz4ZUsuY4x","2TRI7KZamH","dhSuH0Kyfs","4QMc9Yw2oU",
+"S77LHMm8si","EoToPCIShG","FLsphuTacx","pT8wuQ6hMC","t98iWni2v1","kB5nPt98iW","oVQp6Qworu","MmsIoiwzGk","GrDg7HfyNQ","he9IArhl0J",
+"EdBKcAmdQd","tuDySxXTI4","n1pmOaez9y","i3pydGWqqX","prNT6FwEJz","lXFOBoQ87r","JKWYR55rfB","pT8wuCNHmv","xciqp0MR5X","9GXkX4dEz6",
+"zQt6QBGaQY","WPmlxrhl0J","zz4ZUMaJQs","ThjNnydG8U","bgJAzUlU3M","yluBxSWfou","TwanoD6rBy","POUYSqQxHP","jSjS3gIYvE","7ku1pCp3mZ",
+"9GXkXFVMxo","lCMxyFwEJz","fFDrJDLhzM","k85Ae5IhmG","euZA50h1b1","fqypyazIWp","vkCHHVjCZq","07n1c4W0Tl","cmXIXl83Ud","gtCA5POUYS",
+"uoStw0BmCy","P6bcgFcWrW","0BmCyIKxdL","t98iWv1Hln","JkzUnGXdoH","jS1aj2Nslm","2hEEUW3VFH","hYBCKiwzGk","HfyNQZhwG1","UmaEv5Namm",
+"soy9tjiVBP","uAWypjzUqR","Yf2EcDQimp","M3zXLIRh48","MK07Y9iGoT","AIYUuAIYUu","rhl0J6AFT0","lH1ktFwEJz","i3pydP6bcg","iB08l8U2nU",
+"ZuDtD6AFT0","Cp3mZVprf2","QClRLJJs5m","MmsIonnP8o","MmKGJiqv4k","Yw2oUJJs5m","24ARF2hEEU","F6PT2IRh48","cmXIX5VZjS","LDk6fJJs5m",
+"LewvM7X3uy","cL0aElH1kt","55rfBRxrsm","Zv7z08FmFH","IRh48v8yFN","ksJby7fsYM","9y4lwfcJOy","pFrrlatef2","0Wr5ysuY4x","FFDuinnP8o",
+"JJs5mAkKTk","OUqFM5ZaEz","ogLgcs7Mxk","qQxHPydG8U","BFkb8s4786","rz7UtHP433","n1pmOFNYIM","7Ow5CJIqXi","gf8rIjS1aj","9GXkXru4UG",
+"VNCPddhSuH","yluBxBGaQY","GXdoH0BmCy","9rlg9CNHmv","pFrrls4786","ix74rFLsph","lweGyo8Uyd","MmKGJKr8ys","zHF1qZzJHW","0h1b1BbwgA",
+"pWiOsRkQke","J2mQiciuWz","5VZjSfFDrJ","JIqXiQssNC","a00b5fcJOy","Mkgy8Kr8ys","QClRLWDVWJ","W7cTsS77LH","Pb1pat59lR","MGlTFQYxC0",
+"soy9tMK07Y","suY4xOxWIH","nFqikiwzGk","CdyBVzQt6Q","PYBf4IBe8k","7X3uyt98iW","7X3uyKr8ys","i3pydfFDrJ","NhXduYw2oU","MezSWWDVWJ",
+"YjB9tNcICA","5Drn0e6e4z","0Wr5yxciqp","cmXIX9rlg9","uAWypk85Ae","QssNCFhtgl","pvgjS48cHL","1v5hHI7p2a","StlDJLewvM","zHF1qrz7Ut",
+"ciuWzkB5nP","5IhmGgdQsS","8hJdtni2v1","KZamHDz1R3","azIWppFrrl","YOfrYNhXdu","3otm6d85a9","GXdoHZUnqt","M3zXLZJTXH","ReKEWbgJAz",
+"EoToPqUJMd","MGlTFzbIYY","QWxoTIBe8k","FjHXR2hEEU","VNCPd4W0Tl","WreyPGrDg7","MmKGJMmKGJ","K4GS8yofH3","ksJby3weIF","y94nwogLgc",
+"IBe8kZuDtD","soy9tFNYIM","ZzJHWBbwgA","ThjNn8RCUA","vkCHH7Ow5C","uoStwZJTXH","QssNCRzaZA","fmIK15drc6","QnJ1Si3pyd","tjQxsqQxHP",
+"W3VFHGSQwj","vLsmSyvOMI","VIlwP2ZHdk","FcWrWIn3NS","Cfgr3Uvlv4","Yf2EcYf2Ec","gIYvEs4786","brhlQlj07Q","MaJQsAgJHQ","a00b5HRxd8",
+"4QMc9MaJQs","v1HlnFwEJz","64s8NVjCZq","ThjNnlj07Q","taOXKjS1aj","suY4xjtn0X","D6rByQnJ1S","CK5W77X3uy","QbxXcFVMxo","jzUqR5Namm",
+"VIlwPFcWrW","5Mg9rs93Ml","uvf7A2Nslm","QYxC0uQIcz","ZhwG1Ul4a1","k85AeWMiS3","n8pJ90h1b1","AIYUuo8Uyd","8xEKzuAWyp","zbIYYQbxXc",
+"aDGtSCIShG","GXdoHxciqp","dQ586vOqCE","hSSvQ580YD","RACuj5ZaEz","4QMc9ZhwG1","55rfBogLgc","Zv7z0uAWyp","U3yw5Yw2oU","uPX7GJIqXi",
+"zHF1qd7vjM","FxX9qjS1aj","M6qcGTa8f6","mX2GEiwzGk","ZUnqtRpBQm","he9IA580YD","s4786VLTy6","uoStwRBhp0","okgRiJIqXi","1v5hHgtCA5",
+"VLTy6uvf7A","Y1mC0UmaEv","prNT6Y1mC0","ru4UGB3qem","AXpwE7X3uy","8U2nUD6rBy","WMiS3JkzUn","b29RJl83Ud","KZamHpT8wu","AIYUuokgRi",
+"48cHLXflUq","BGaQYBCxeC","QYxC0Q6hMC","nFqikG1RhS","tjQxsn1pmO","8U2nUKr8ys","cQOnv7lUXZ","d85a9VNCPd","okgRilkMUA","b29RJd7vjM",
+"M6qcGOHaBz","uoStwtaOXK","NcICAMaJQs","hi5X7lm0pD","NAFuwDG4sT","pFrrlK20wK","K20wK5nmWv","Ul4a1UlU3M","7X3uy9rlg9","M6qcG4dEz6",
+"NhXduFjHXR","AIYUuJJs5m","uoStwJ2mQi","zHF1qHzZT8","MaJQsuupzk","blLA9NcICA","pAhR1M3zXL","DG4sT0BmCy","S77LHGv3Fq","WDVWJ5iGN5",
+"QnJ1SgIYvE","hi5X7CNHmv","Kr8ysiwzGk","55rfBpv0i7","rhl0JpFrrl","zqH0Wl83Ud","Dz1R3VIlwP","MezSWWMiS3","uoStwv1Hln","I7p2a8U2nU",
+"F6PT2pWiOs","fqypyL7cGc","580YDuAWyp","Yw2oUl83Ud","k85Ae2hEEU","iB08ltaOXK","fFDrJiqv4k","n8pJ9KASQ8","lm0pDs7Mxk","pFrrlzFgtB",
+"IjTwPVprf2","16lHcgjUTu","In3NSfqypy","bgJAzfqypy","ZuDtDpFrrl","DLhzMs93Ml","580YD3weIF","WMiS3oGu6x","EdBKclXFOB","FNYIM2hEEU",
+"GWqqX9iGoT","NcICAdQ586","jfREupvgjS","WDVWJQ6Lix","ZzJHWNcICA","oGu6xZ4I1v","WPmlxbrhlQ","C2IrcjiVBP","s4786lm0pD","PYBf4RpBQm",
+"KZamHdhSuH","In3NS8hJdt","sqVrfMezSW","Rxrsm0BmCy","uTacxVLTy6","nlaByaDGtS","9iGoTtjQxs","P6bcgyluBx","gf8rI7fKYU","0YAGH8RCUA",
+"ECMvUs7Mxk","EdBKcLDk6f","Waim6l83Ud","SmGzvQworu","CIShGiKqhr","0Wr5ysx5Gl","UlU3MCqqaD","x3LDeFcWrW","jiVBP5Drn0","SbRYyxciqp",
+"QbxXcpv0i7","lweGyaez9y","VIlwPjS1aj","WaWsvSbRYy","yofH3FVMxo","JJs5mjtn0X","RxrsmZJTXH","UmaEvS2Dfu","mz8gxYf2Ec","9GXkXpvgjS",
+"blLA9qUJMd","Fhtgl3weIF","0Kyfs7ku1p","cShY27fsYM","RBhp0BpYhV","1j5L8m4bxU","HfyNQ7fKYU","B3qemzqH0W","fFDrJGrDg7","zQt6QUlU3M",
+"45cIHQChxs","hE1QlpWiOs","cmXIX7hyVv","Cfgr3SmGzv","2Yz7EP6bcg","wDajXn8pJ9","bgJAz14FLR","v1Hlnm4bxU","M6qcG0h1b1","Mkgy8lpF6W",
+"AIYUutl72W","5iGN5W7cTs","fLNg8Pb1pa","pvgjSbZLvS","LbRTHTXQ0Z","dpe1vMGlTF","rKDLJVIlwP","s7MxkfcwDa","gf8rIdmoS7","bZLvSOz8yZ",
+"U3yw5VNCPd","lXFOBJRJQB","HfyNQjS1aj","DG4sTB3qem","y94nwx3LDe","uJScXHlUbF","uAWypsuY4x","QYxC0ZUnqt","QworuZ4I1v","2ZHdkLewvM",
+"Cfgr3J2mQi","GXdoHpT8wu","hYBCK9XyT9","JRJQB9iGoT","hE1QlK4GS8","NOHsze6e4z","48cHLDLhzM","Mkgy8uJScX","l83Ud5Mg9r","7ku1pFNYIM",
+"hUTw7xciqp","WmadArhl0J","QssNCAmdQd","D6rBypvgjS","ksJby4QMc9","zbIYYLDk6f","aDGtSMK07Y","wDajXaFFss","he9IANxx9V","0PktItuDyS",
+"Ss0ZuReKEW","gjUTuyvOMI","StlDJIn3NS","K4GS829QAz","ciuWzrKDLJ","uQIczQworu","DG4sTd85a9","pT8wuGWqqX","5NammC2Irc","Waim6I7p2a",
+"s7Mxk5Drn0","zFgtBuvf7A","Yf2Eczz4ZU","StlDJsx5Gl","0YAGH07n1c","fqypycL0aE","RmDcr16lHc","9eoRcvLsmS","mz8gxiqv4k","JJs5m5ZaEz",
+"I7p2aMezSW","zHF1qlXFOB","DG4sTCqqaD","t98iWZUnqt","9eoRcRACuj","vLsmSAgJHQ","BGaQYFhtgl","he9IAAIYUu","gIYvENxx9V","lXFOBdmoS7",
+"SjskQTXQ0Z","TwanoChuy3","BCxeCHzZT8","pmeCdulk41","yvOMITCgPp","FVMxoYf2Ec","VjCZqblLA9","dQ586pvgjS","Yf2EcIBe8k","gf8rIVIlwP",
+"No0Qb4QMc9","tuDySuvf7A","s93MltvdkD","v2eC3aez9y","CdyBVpvgjS","8FmFHwiHrZ","CIShG8hJdt","8FmFHM6qcG","FFDuiYOfrY","O3iyQgIYvE",
+"ZhwG1uN6r3","MmKGJZ4I1v","dmoS7W7cTs","Y1mC0Uvlv4","hi5X7No0Qb","taOXKuJScX","JXljWlj07Q","7lUXZvkCHH","aFFssWaim6","HlUbFUvlv4",
+"lCMxyuoStw","bZLvSD6rBy","pv0i7cmXIX","GXdoHMaJQs","mX2GEwiHrZ","BbwgA0BmCy","J2mQi07n1c","07n1cFwEJz","nlaByBCxeC","5Drn0AmdQd",
+"WreyPUlU3M","I7p2a8TxD7","QClRLRxrsm","pFrrl5iGN5","J2mQiiwzGk","iB08lVerEA","MmKGJEdBKc","JKWYRDQimp","CxVEfbZLvS","mz8gxzHF1q",
+"FNYIMyluBx","AmdQdxciqp","oQ87rYOfrY","7fKYUQnJ1S","HRxd8HlUbF","uZPqgoVQp6","gf8rIZUnqt","Ul4a1he9IA","5Namm4QMc9","pAhR1RzaZA",
+"M6qcGGv3Fq","Gv3FqMojnP","tAOsrNAFuw","CIShGWaim6","07n1cZ4I1v","Z4I1vZUnqt","0MR5XlkMUA","hE1QluJScX","AmdQdAXpwE","HzZT855rfB",
+"K20wK7lUXZ","QWxoTjfREu","8FmFHRkQke","aFFsskB5nP","In3NStjQxs","IBe8kaez9y","jzUqRGWqqX","HfyNQk85Ae","M6qcGLDk6f","FxX9qRmDcr",
+"VerEAcL0aE","ydG8UOxWIH","4W0TllpF6W","CqqaDfLNg8","dhSuHcmXIX","7hyVvRkQke","kB5nPAXpwE","qUJMdCqqaD","v8yFNvOqCE","azIWpCfgr3",
+"sx5GloQ87r","QnJ1S14FLR","jzUqRogLgc","aL6AJGSQwj","vLsmSReKEW","pmeCdgf8rI","wiHrZOUYuF","euZA5GSQwj","OUYuFUl4a1","XyPZNK4GS8",
+"uTacxHP433","gf8rIfcwDa","FNYIM0PktI","AXpwEM6qcG","pv0i7fLNg8","fLNg8kZANm","ZJTXH7fKYU","uJScXRzaZA","RmDcri3pyd","guMb81v5hH",
+"Zv7z0iqv4k","lXFOByluBx","lkMUAZhwG1","uPX7GAmdQd","IRh48K4GS8","he9IAgf8rI","v8yFNWPmlx","jeskSs93Ml","n8pJ9brhlQ","2hEEUFGzgp",
+"L7cGcCfgr3","9y4lwhi5X7","GrDg7zQt6Q","HfyNQPYBf4","4QMc9TXQ0Z","t59lRbgJAz","I7p2aSmGzv","3weIFFGzgp","618DiM3zXL","lpF6WLbRTH",
+"jtn0Xtl72W","0ao3lStlDJ","6q6L9xReec","7X3uypT8wu","pvgjS8RCUA","SmGzvJJs5m","8U2nUciuWz","uupzkhE1Ql","5iGN5o8Uyd","JKWYRQbxXc",
+"0ao3lRsQUq","SWfouNAFuw","fcwDa6q6L9","Y1mC0n1pmO","TCgPpi7WMQ","FjHXR2DREs","jtn0XdhSuH","07n1cpvgjS","guMb8TXQ0Z","fcwDaMkgy8",
+"FwEJz8xEKz","POUYSi3pyd","s93MlhSSvQ","GXdoHblLA9","xciqp5VZjS","s7MxkydG8U","yvOMI7ku1p","gf8rIQnJ1S","45cIHQnJ1S","n8pJ9No0Qb",
+"P6bcg1j5L8","BFkb8Mkgy8","CNHmvHfyNQ","EdBKcSWfou","lCMxyhe9IA","5nmWvyluBx","Q6LixiKqhr","FhtglAgJHQ","qUJMdYw2oU","KASQ8FLsph",
+"HRxd8xciqp","SWfouWaWsv","lCMxylweGy","zY1GYhUTw7","580YD0ao3l","tAOsrv2eC3","he9IA2Yz7E","WPmlxCIShG","NcICAd85a9","OUqFM9iGoT",
+"7Ow5CuJScX","0PktIRxrsm","pWiOsIKxdL","BCxeCwiHrZ","F6PT2soy9t","Uvlv4Chuy3","29QAze6e4z","GSQwj64s8N","2Yz7EMojnP","0Wr5yru4UG",
+"FVMxoFjHXR","blLA9wiHrZ","GrDg7Dz1R3","jzUqRdhSuH","K20wKjfREu","tuDyS2TRI7","L7cGclXFOB","vOqCEAOgEe","tl72Wt59lR","kB5nPQChxs",
+"YOfrYaFFss","5Namm2Yz7E","SmGzvFGzgp","ECMvUYOfrY","uQIczkB5nP","dpe1vDcpWB","lCMxyb29RJ","AIYUu9rlg9","tvdkDeuZA5","8U2nUsuY4x",
+"MojnP16lHc","JRJQBzY1GY","kB5nPxReec","b29RJ0MR5X","GWqqX8cVD3","QnJ1SWPmlx","tvdkDzQt6Q","zbIYYsqVrf","faHiraFFss","8FmFHokgRi",
+"6q6L9sx5Gl","QssNCChuy3","s7Mxkv8yFN","iqv4kI7p2a","Cfgr3FGzgp","yToGW45cIH","1LB1LciuWz","gtCA59y4lw","C2IrcBFkb8","IBe8kF6PT2",
+"BbwgAv1Hln","CNHmvLbRTH","EdBKc580YD","zQt6Q0h1b1","pv0i72Yz7E","sx5GlydG8U","vLsmS4QMc9","Chuy34W0Tl","kZANmCfgr3","ogLgcpiJSk",
+"5IhmGlweGy","hE1QljS1aj","yluBxRsQUq","DcpWBhe9IA","5NammpT8wu","s93MlCxVEf","DG4sTF6PT2","XflUqXyPZN","azIWpCNHmv","7X3uyVjCZq",
+"atef2YOfrY","FjHXRbZLvS","JXljWNxx9V","5Drn0HP433","Oz8yZ2ZHdk","BCxeCFGzgp","8TxD7fLNg8","pAhR1y94nw","jeskSi7WMQ","FxX9qfaHir",
+"Chuy3m4bxU","cL0aEJ2mQi","s7MxkuTacx","sx5GlDQimp","fcJOy7lUXZ","O3iyQru4UG","8xEKzSs0Zu","Gv3FqnnP8o","Vprf27hyVv","hSSvQa00b5",
+"ThjNnxXTI4","M6qcGXflUq","gdQsSuJScX","v1HlnS77LH","Yh1hFDz1R3","8U2nUoVQp6","hi5X7K4GS8","WMiS3GXdoH","TXQ0Z0Kyfs","9y4lwgtCA5",
+"9y4lwtvdkD","7lUXZX6Pin","NOHszsx5Gl","soy9tJIqXi","7ku1pyEfy9","TXQ0Z9GXkX","S77LHQworu","v2eC37hyVv","XflUqt59lR","GrDg7QYxC0",
+"4W0Tli7WMQ","P6bcgni2v1","dQ58655rfB","16lHcUmaEv","v2eC3RBhp0","NcICArz7Ut","b29RJVNCPd","5Nammrz7Ut","vLsmSlCMxy","uLtKshi5X7",
+"FxX9qTwano","sx5Glni2v1","580YD1LB1L","StlDJVerEA","0PktI1LB1L","5nmWvF6PT2","gIYvERkQke","VNCPdCxVEf","AIYUuMmKGJ","0YAGHnnP8o",
+"ydG8UsqVrf","QssNC8RCUA","WmadABCxeC","SbRYyuLtKs","uTacxuLtKs","ZuDtDyEfy9","taOXKVBjhz","hi5X7dQ586","uZPqgKASQ8","RzaZArhl0J",
+"yvOMII7p2a","sqVrfaez9y","ogLgcEOE1o","Chuy3YOfrY","B3qemsuY4x","Twano0Wr5y","MojnPzY1GY","ix74rfqypy","a00b5kB5nP","OHaBzs93Ml",
+"IRh48IBe8k","s93MlB3qem","uoStwciuWz","0KyfstaOXK","s93MlIRh48","jtn0XpT8wu","5ZaEzIBe8k","5VZjSlsQGo","Mkgy8iB08l","d7vjM3weIF",
+"CNHmvoQ87r","tjQxsoGu6x","fcJOy6q6L9","d85a9iB08l","MezSWGSQwj","OHaBzGv3Fq","qUJMdjS1aj","dpe1vnlaBy","lpF6WFwEJz","In3NSNo0Qb",
+"ydG8UOUYuF","uN6r3NOHsz","n8pJ9RzaZA","SbRYyo8Uyd","DQimps93Ml","KsjRKIn3NS","hUTw77X3uy","brhlQqaofN","ThjNntvdkD","vOqCEJIqXi",
+"MK07Yn8pJ9","QbxXcQChxs","ZhwG1WreyP","Cfgr3hUTw7","2hEEUzmLYD","9y4lwjeskS","ZzJHWTCgPp","POUYSXyPZN","5iGN5FGzgp","DcpWBB3qem",
+"JRJQByEfy9","lViBvRBhp0","atef2QClRL","Kr8ysuvf7A","jeskSJXljW","Z4I1vhE1Ql","RkQkeDG4sT","Chuy3ThjNn","FGzgp9rlg9","he9IAMm8si",
+"618DiuAWyp","yofH3FwEJz","24ARFxReec","sqVrfRxrsm","Waim6ZuDtD","5VZjSFFDui","nlaBytl72W","LDk6fguMb8","LDk6f4QMc9","jfREuDG4sT",
+"JkzUnhe9IA","5nmWvv8yFN","soy9tfLNg8","MmsIoFcWrW","Gv3FqKZamH","5nmWvSjskQ","zY1GYMojnP","iwzGkMezSW","2Nslm5Drn0","UmaEvdQ586",
+"14FLRTa8f6","ru4UGTa8f6","FcWrWEdBKc","gjUTuAkKTk","cL0aEW3VFH","8hJdtlkMUA","J2mQiJkzUn","KZamH4QMc9","Mkgy8ix74r","2Yz7En8pJ9",
+"aez9yQbxXc","VIlwPDQimp","iwzGkMGlTF","YjB9t5Drn0","580YDHRxd8","GWqqXfcJOy","55rfBlm0pD","6q6L9In3NS","S2Dfuatef2","y94nwWPmlx",
+"8xEKzOUqFM","OHaBzt98iW","WMiS39eoRc","IRh48WaWsv","ydG8UZ4I1v","3otm6TCgPp","RBhp0e6e4z","KASQ87hyVv","RxrsmECMvU","Oz8yZn1pmO",
+"XyPZNJRJQB","5IhmGmX2GE","2NslmgtCA5","2ZHdkokgRi","Chuy3NhXdu","0Wr5yAOgEe","ru4UGguMb8","CqqaDdhSuH","RzaZAFGzgp","dhSuHhi5X7",
+"W3VFHLbRTH","ogLgcsoy9t","pWiOs9rlg9","IRh4824ARF","a00b5fqypy","b29RJzbIYY","lsQGocQOnv","zbIYYwDajX","JRJQBMGlTF","IjTwP5ZaEz",
+"soy9tRpBQm","FxX9qZv7z0","W7cTsQYxC0","pFrrlpT8wu","RpBQm2hEEU","2TRI7ReKEW","i7WMQtjQxs","Gv3Fqlj07Q","Ss0ZuciuWz","5iGN5uoStw",
+"7fsYMMezSW","euZA5ni2v1","2NslmtjQxs","0MR5XS2Dfu","AmdQduLtKs","FVMxoAIYUu","EoToPuQIcz","x3LDezz4ZU","jfREuMGlTF","fmIK10Wr5y",
+"dhSuHtjQxs","HfyNQFFDui","64s8NWmadA","ni2v1nnP8o","cShY2Uvlv4","Oz8yZQChxs","B3qemxciqp","7X3uy0h1b1","07n1crz7Ut","a00b5JKWYR",
+"zFgtBFFDui","9XyT9WaWsv","RBhp0FVMxo","atef2B3qem","RzaZAjS1aj","RpBQmiqv4k","S2DfuqaofN","tl72Wk85Ae","euZA5VIlwP","LewvMjtn0X",
+"RxrsmdQ586","0KyfsgjUTu","ogLgcQ6Lix","M3zXLECMvU","5Drn0MK07Y","x3LDe3otm6","C2IrcCdyBV","wDajXIBe8k","d7vjMFLsph","hE1Qlni2v1",
+"rz7UtuAWyp","OUYuFgdQsS","IBe8kl83Ud","580YDQ6hMC","Zv7z0ogLgc","uvf7A8U2nU","QClRL55rfB","cShY2rhl0J","Vprf2iKqhr","HfyNQ9GXkX",
+"5nmWvrKDLJ","suY4xGrDg7","VNCPdv2eC3","5drc6b29RJ","UlU3M14FLR","7fsYMG1RhS","8FmFHni2v1","Kr8ysgIYvE","vOqCESWfou","EoToPRBhp0",
+"gIYvEi7WMQ","9GXkXXyPZN","lweGyRzaZA","Q6Lix7lUXZ","C2IrcGSQwj","Twano5ZaEz","1LB1LSbRYy","VNCPdQ6Lix","dpe1vjzUqR","wDajXlkMUA",
+"FFDui1j5L8","6AFT0a00b5","DcpWB9rlg9","CK5W7NcICA","gjUTuIRh48","Z4I1vjS1aj","gIYvEVBjhz","djsrv9GXkX","zHF1qaL6AJ","5Mg9r5VZjS",
+"lm0pDYf2Ec","RACujlj07Q","CqqaDogLgc","e6e4zbgJAz","WMiS3Ta8f6","HRxd8Cfgr3","W7cTsHlUbF","RzaZAvLsmS","fmIK10h1b1","7hyVvcShY2",
+"bZLvSIjTwP","jiVBPblLA9","EoToPzmLYD","5drc6M6qcG","jzUqRfcJOy","ru4UG6AFT0","AOgEeOHaBz","Oz8yZ2TRI7","8FmFH6q6L9","Waim616lHc",
+"JIqXiTCgPp","e6e4zFFDui","QWxoTOxWIH","m4bxUlsQGo","UmaEvNhXdu","24ARFGXdoH","bZLvSMmKGJ","ThjNns93Ml","AmdQduupzk","64s8NMmsIo",
+"9y4lwWMiS3","ksJby0ao3l","Y1mC016lHc","Yh1hFTXQ0Z","8RCUAaFFss","07n1cCNHmv","fLNg8WmadA","CK5W7qQxHP","yvOMI1j5L8","yofH3XyPZN",
+"XflUqxciqp","NAFuwJJs5m","t98iWgdQsS","W3VFH8U2nU","4W0TlB3qem","TXQ0ZUl4a1","Yw2oUix74r","pFrrlWaWsv","yluBxzY1GY","VNCPdxXTI4",
+"ix74rIKxdL","FLsphfqypy","2hEEU0Kyfs","blLA9OUYuF","s7MxkB3qem","QbxXcZuDtD","2hEEUtvdkD","hSSvQOHaBz","zbIYYatef2","7hyVvzHF1q",
+"RzaZAjiVBP","29QAzCqqaD","RBhp0FcWrW","9eoRcI7p2a","lXFOBciuWz","lsQGolViBv","tvdkD24ARF","Q6LixaFFss","atef2aez9y","7ku1phYBCK",
+"vOqCEnlaBy","cL0aEECMvU","BGaQYtl72W","zHF1qVprf2","5Mg9rMkgy8","jSjS3KASQ8","uupzkSmGzv","FGzgp55rfB","In3NSfLNg8","QClRLVIlwP",
+"tl72WJ2mQi","aDGtS0BmCy","WaWsvUvlv4","faHir5VZjS","Cfgr3MGlTF","JIqXihi5X7","Ta8f6iKqhr","AOgEe8hJdt","Zv7z0hSSvQ","tlILtF6PT2",
+"HlUbFVNCPd","lpF6WL7cGc","8FmFHsuY4x","pT8wub29RJ","sx5GlcmXIX","i7WMQhe9IA","FVMxoWmadA","fmIK1s4786","QYxC0euZA5","QChxsk85Ae",
+"CK5W7k85Ae","hE1Ql9iGoT","hSSvQEoToP","oVQp6NOHsz","zFgtBlXFOB","pAhR1RACuj","RsQUqJ2mQi","aDGtS64s8N","7hyVvvkCHH","ThjNnlCMxy",
+"ECMvUGXdoH","QnJ1SlH1kt","lH1ktrz7Ut","CIShGfqypy","tvdkDHP433","Yh1hFLewvM","uupzkFLsph","5Mg9rNo0Qb","sx5GllkMUA","Cfgr3CxVEf",
+"Z4I1ve6e4z","MojnPzmLYD","DG4sTuAWyp","7hyVvYh1hF","Yh1hFPOUYS","jzUqRChuy3","MmsIoQClRL","lm0pDdQ586","cmXIXNo0Qb","Q6hMCMmKGJ",
+"NhXdujSjS3","vLsmSogLgc","iwzGkZzJHW","pWiOsIBe8k","zQt6QhE1Ql","hi5X7uoStw","MezSWMojnP","qQxHPzQt6Q","uoStwydG8U","HP433pAhR1",
+"CK5W7ydG8U","9XyT9Kr8ys","fFDrJ8cVD3","VBjhzNAFuw","SmGzv2hEEU","zFgtBCIShG","BpYhVcL0aE","lpF6WQYxC0","8xEKz7hyVv","Z4I1vpmeCd",
+"pWiOsyvOMI","QYxC0Yf2Ec","pWiOst98iW","48cHLaL6AJ","lH1ktfqypy","0h1b1jiVBP","atef2jeskS","OxWIHuPX7G","tvdkDThjNn","gf8rI5Drn0",
+"YOfrYK20wK","EdBKcSs0Zu","M6qcGW3VFH","Nxx9Vy94nw","YOfrYTwano","nFqikcmXIX","rhl0J7lUXZ","cShY2F6PT2","9GXkXZhwG1","ydG8U48cHL",
+"MGlTFcQOnv","P6bcgQChxs","JRJQBd7vjM","29QAzRACuj","xciqpRxrsm","oGu6x0PktI","CIShGv2eC3","faHirJXljW","07n1cJJs5m","BFkb8AkKTk",
+"ciuWzVIlwP","AkKTkZv7z0","6AFT05drc6","14FLRokgRi","jSjS3KsjRK","okgRi7fsYM","FNYIMpAhR1","QnJ1SUmaEv","n8pJ9S2Dfu","dQ5864W0Tl",
+"nlaByvkCHH","Kr8ysDG4sT","Pb1pa8TxD7","ECMvUK20wK","QnJ1SGXdoH","BFkb8l83Ud","CqqaDDG4sT","48cHLulk41","hi5X78U2nU","DQimp5VZjS",
+"cmXIXBbwgA","a00b5FxX9q","m4bxUDz1R3","Uvlv4LbRTH","aez9yFLsph","8TxD7hSSvQ","GXdoHfcwDa","jtn0XVprf2","RxrsmFjHXR","lkMUAtl72W",
+"uTacxMezSW","vOqCENcICA","FjHXRgf8rI","P6bcgTa8f6","1j5L8C2Irc","Q6LixK20wK","14FLRdpe1v","ulk41CNHmv","SmGzvn1pmO","IKxdLCqqaD",
+"BGaQYPb1pa","W7cTsyofH3","aez9yogLgc","G1RhSfcwDa","zFgtBn8pJ9","ECMvU9iGoT","TXQ0ZMezSW","8xEKzIBe8k","4dEz6NhXdu","uQIczsx5Gl",
+"PYBf4ydG8U","Cfgr3bZLvS","he9IAECMvU","tl72WuoStw","AgJHQYOfrY","vOqCEJXljW","IjTwPzHF1q","pAhR1jiVBP","vOqCErKDLJ","No0QbeuZA5",
+"I7p2aQbxXc","AmdQd24ARF","qQxHPxXTI4","aDGtSKASQ8","okgRi7Ow5C","atef2WreyP","45cIHGWqqX","LDk6flpF6W","CqqaDFGzgp","FjHXRcmXIX",
+"hSSvQ1LB1L","RsQUqzFgtB","zY1GYK20wK","MmsIoMojnP","rhl0J3weIF","zbIYYMK07Y","uLtKsciuWz","uupzkrKDLJ","BGaQYokgRi","RBhp05nmWv",
+"5iGN5zmLYD","0Wr5yZv7z0","xciqpprNT6","Yh1hF07n1c","d85a9hYBCK","GrDg75ZaEz","MmKGJvkCHH","YOfrY9XyT9","HP433618Di","7fsYMwDajX",
+"sqVrf1j5L8","o8Uydi3pyd","blLA9U3yw5","8U2nUzQt6Q","55rfB4W0Tl","m4bxUfqypy","jS1ajuZPqg","rhl0JoVQp6","WmadAaFFss","EoToPYw2oU",
+"AOgEeDLhzM","6AFT0iwzGk","FcWrWv8yFN","faHirKASQ8","4dEz6FGzgp","RsQUqIKxdL","pmeCdTwano","RzaZAi3pyd","3otm6Kr8ys","v8yFNokgRi",
+"POUYSZUnqt","FVMxoZuDtD","48cHLRmDcr","uTacxs4786","AOgEe7Ow5C","n1pmO14FLR","24ARFn8pJ9","hE1Ql5Namm","3otm6Fhtgl","gjUTusoy9t",
+"HP433YOfrY","uvf7A8hJdt","cmXIXxReec","4QMc9Pb1pa","pFrrlWPmlx","5Namms93Ml","cShY2piJSk","MojnPK4GS8","SmGzvuAWyp","Yf2EcnnP8o",
+"tlILtaDGtS","fFDrJ7hyVv","JkzUnZUnqt","sx5Gl2hEEU","VerEAIKxdL","EOE1oXflUq","48cHLlm0pD","tAOsrx3LDe","5drc6HRxd8","jS1aj8hJdt",
+"9y4lwRACuj","Ta8f6OUqFM","O3iyQMm8si","RkQkeBpYhV","IKxdLuJScX","7hyVvOz8yZ","gjUTuzbIYY","8U2nUoQ87r","Yw2oUuAWyp","U3yw5pT8wu",
+"i3pydjeskS","No0Qb4dEz6","ix74rDcpWB","KASQ8ZzJHW","8U2nUo8Uyd","ix74raL6AJ","WDVWJFGzgp","lViBvmz8gx","0h1b1zY1GY","jSjS3vLsmS",
+"uJScXCNHmv","2DREsUlU3M","2TRI7zHF1q","ydG8Un8pJ9","Ss0Zu7Ow5C","5ZaEzJIqXi","580YD8FmFH","n1pmOo8Uyd","DcpWBdhSuH","HfyNQjzUqR",
+"0BmCyuvf7A","QWxoT580YD","lXFOB6q6L9","9XyT9Gv3Fq","5VZjScmXIX","lsQGoTa8f6","pmeCd9GXkX","XyPZN8hJdt","wiHrZpAhR1","7fsYMWreyP",
+"OxWIHkZANm","lj07QHlUbF","jSjS3hUTw7","aez9yK20wK","9eoRcdQ586","KASQ8fmIK1","8xEKzVLTy6","2TRI7RkQke","yToGWfcwDa","jfREuQnJ1S",
+"Zv7z0RzaZA","7X3uyIKxdL","3otm6dpe1v","HlUbFVBjhz","FPfSEzmLYD","DG4sTQWxoT","djsrvkZANm","CxVEffaHir","In3NSix74r","uJScXLewvM",
+"SmGzv29QAz","IjTwP0YAGH","TCgPpm4bxU","RpBQmuupzk","Zv7z00Kyfs","5Drn0FPfSE","m4bxUoQ87r","lpF6Wlj07Q","7Ow5CzQt6Q","FVMxoK4GS8",
+"uvf7Axciqp","mz8gxEOE1o","vkCHH9eoRc","9GXkXHzZT8","8FmFHxciqp","jiVBPjtn0X","WPmlxjtn0X","dQ586y94nw","djsrvW7cTs","YOfrYpiJSk",
+"zHF1q9y4lw","BCxeCWMiS3","0h1b1BCxeC","Ss0Zurhl0J","aL6AJDz1R3","8FmFHSs0Zu","No0QbqQxHP","Yh1hFv8yFN","HRxd8x3LDe","OUqFMBFkb8",
+"xciqpaL6AJ","NhXdulCMxy","ZUnqtwDajX","m4bxUQ6Lix","7hyVv0PktI","ZhwG1RkQke","lkMUAuPX7G","4W0Tl7lUXZ","lweGyBGaQY","0KyfsnFqik",
+"6q6L9yofH3","HlUbF55rfB","brhlQ48cHL","8hJdtdhSuH","bgJAz6q6L9","sqVrfzbIYY","Ta8f6YOfrY","oQ87riKqhr","9rlg9pmeCd","8RCUA5VZjS",
+"6AFT0lweGy","fqypyI7p2a","tvdkDHzZT8","l83UdzFgtB","48cHLpiJSk","RzaZApAhR1","jeskSYf2Ec","lweGy5nmWv","a00b5WMiS3","uAWypLbRTH",
+"hSSvQlm0pD","Vprf2QYxC0","ZhwG1uvf7A","zbIYY1LB1L","djsrvrKDLJ","fmIK1ru4UG","wDajX2Nslm","RzaZAQ6Lix","4QMc9pAhR1","t59lR9XyT9",
+"zqH0Wdjsrv","O3iyQv2eC3","d7vjMzQt6Q","he9IAvLsmS","nFqikSjskQ","iwzGkWreyP","VBjhzrKDLJ","cmXIXgdQsS","gdQsSyvOMI","7lUXZatef2",
+"0ao3l0Kyfs","l83Udjtn0X","Kr8yslm0pD","5ZaEzyToGW","TCgPpFLsph","2Nslms4786","v8yFNJIqXi","BGaQYxReec","uPX7G0PktI","P6bcg14FLR",
+"WreyPydG8U","BFkb84QMc9","m4bxUSWfou","OxWIHcL0aE","WaWsv0BmCy","FjHXR580YD","M6qcG2DREs","rKDLJtl72W","jzUqRP6bcg","xReecIRh48",
+"dmoS7UlU3M","wiHrZ55rfB","cL0aEvkCHH","guMb8Yw2oU","guMb8ZJTXH","3otm6Twano","SmGzvlViBv","blLA9fLNg8","he9IAJRJQB","JJs5m29QAz",
+"K4GS8RACuj","NhXdu7hyVv","fLNg8aDGtS","Twanov1Hln","5Drn0NAFuw","9y4lwFLsph","MaJQsJKWYR","nlaByMmsIo","DcpWBI7p2a","0Kyfs8FmFH",
+"1j5L8ZUnqt","24ARFni2v1","Y1mC0ni2v1","aFFssDcpWB","0ao3lBCxeC","QbxXcWMiS3","8U2nUhi5X7","2hEEU5VZjS","bgJAz7Ow5C","IjTwPiB08l",
+"1j5L8gf8rI","qUJMdv1Hln","WreyPYw2oU","xXTI4jfREu","48cHLdmoS7","55rfBn1pmO","LDk6fWreyP","TCgPpprNT6","uAWypU3yw5","MGlTFBbwgA",
+"7ku1p8cVD3","JKWYRM6qcG","ThjNn8TxD7","0YAGHzz4ZU","nlaBy5drc6","VLTy6nnP8o","zQt6Qy94nw","POUYSQ6hMC","HRxd8oVQp6","lsQGoFxX9q",
+"Q6LixOxWIH","W7cTslpF6W","LewvMsqVrf","0BmCyUvlv4","fmIK1h1zcH","CNHmvThjNn","Z4I1vtAOsr","NOHszs7Mxk","5drc6Mkgy8","oGu6xRsQUq",
+"M3zXL55rfB","v1Hln2DREs","lViBv7X3uy","ogLgc7Ow5C","xReecYjB9t","v2eC3pT8wu","G1RhSsqVrf","MaJQs8xEKz","bZLvSpFrrl","VerEA5Mg9r",
+"AkKTkYh1hF","0h1b1CqqaD","W3VFHyofH3","yofH38TxD7","EdBKcIRh48","jSjS3oVQp6","rKDLJlkMUA","0PktIMojnP","gtCA5qUJMd","OUqFMCxVEf",
+"rhl0JtAOsr","FPfSEpT8wu","s4786FxX9q","AkKTkXflUq","SmGzvBpYhV","29QAzKZamH","a00b5fmIK1","mz8gxv8yFN","atef27Ow5C","AkKTkgIYvE",
+"tjQxsYOfrY","XyPZNPb1pa","b29RJiqv4k","JJs5mI7p2a","IjTwPgjUTu","GWqqXXyPZN","FNYIMUvlv4","WreyPaFFss","VjCZqa00b5","RxrsmSjskQ",
+"16lHclCMxy","nFqikW3VFH","uTacx45cIH","2hEEUyvOMI","OHaBzNhXdu","Fhtgl5Mg9r","pWiOsyToGW","fcJOyY1mC0","DQimpqaofN","QYxC0rz7Ut",
+"C2IrcBpYhV","2DREsvkCHH","dmoS7EOE1o","FhtglSs0Zu","ThjNnqaofN","OHaBzfaHir","No0QbGv3Fq","zFgtBgf8rI","n8pJ9zz4ZU","TwanolH1kt",
+"lkMUAbZLvS","OUYuF14FLR","oGu6x4QMc9","xXTI4BGaQY","8hJdtvkCHH","DcpWBK4GS8","618Di8FmFH","IKxdLpv0i7","6AFT0djsrv","jfREugjUTu",
+"prNT6WreyP","s7MxkLDk6f","FwEJzmz8gx","EOE1oi7WMQ","5iGN5OHaBz","2ZHdk5iGN5","7fsYMReKEW","29QAzFwEJz","1j5L8DG4sT","KsjRKXyPZN",
+"VNCPdUlU3M","QworuXflUq","8hJdtpT8wu","ciuWzTCgPp","D6rByDcpWB","0PktI0BmCy","e6e4zyofH3","cL0aEaFFss","uAWypCqqaD","tAOsrjfREu",
+"lViBvPYBf4","gf8rI2ZHdk","v1HlneuZA5","M6qcGrKDLJ","ReKEWlCMxy","TCgPpgIYvE","lCMxyS2Dfu","l83UdjeskS","kB5nPaFFss","Yw2oUzbIYY",
+"8FmFHTwano","3otm6pvgjS","8FmFHIn3NS","ZhwG1SmGzv","JXljW7Ow5C","uQIczVerEA","FFDuiWmadA","IRh48HRxd8","GWqqXjtn0X","O3iyQNOHsz",
+"7fsYM0MR5X","5ZaEzYOfrY","hSSvQjtn0X","v8yFNgjUTu","MK07Y6q6L9","hE1QlTa8f6","JKWYR2hEEU","07n1cU3yw5","suY4xQClRL","StlDJHlUbF",
+"jS1ajTCgPp","uZPqgRsQUq","Y1mC0Chuy3","y94nwdhSuH","jS1ajOHaBz","s93MlAOgEe","VBjhzNOHsz","VNCPdTa8f6","W7cTs9GXkX","07n1cRxrsm",
+"RsQUqLDk6f","zFgtBOxWIH","d7vjM8RCUA","0ao3lFNYIM","JRJQBlj07Q","8RCUACp3mZ","oGu6x0MR5X","taOXK0Wr5y","5drc6NhXdu","l83Udru4UG",
+"SmGzv5Namm","qaofNZzJHW","iB08lzbIYY","lpF6Wl83Ud","lsQGoix74r","tvdkDWaWsv","zHF1qOz8yZ","dpe1vHlUbF","16lHc2Nslm","xciqpF6PT2",
+"v1HlncL0aE","lXFOBguMb8","7fsYMB3qem","qUJMdzY1GY","uvf7AkZANm","lkMUAzFgtB","JRJQBy94nw","BpYhVRpBQm","FhtglM6qcG","okgRizz4ZU",
+"cL0aE9iGoT","ix74rGWqqX","FwEJzCqqaD","uupzklpF6W","yEfy9pv0i7","07n1cuQIcz","zQt6QMK07Y","fFDrJxXTI4","uJScX7X3uy","2NslmhSSvQ",
+"h1zcHX6Pin","fmIK1MaJQs","xReecWaim6","qUJMdBpYhV","m4bxUHRxd8","fFDrJlViBv","djsrvvOqCE","J2mQiRxrsm","2hEEUZuDtD","G1RhSZUnqt",
+"1LB1LdhSuH","Ss0ZuZuDtD","ZUnqtulk41","CdyBVXyPZN","S2Dfu580YD","uN6r3I7p2a","U3yw5WaWsv","2ZHdkRkQke","LewvMnlaBy","FVMxoJkzUn",
+"AmdQduvf7A","okgRiRzaZA","6q6L9YOfrY","bgJAzogLgc","VerEA9y4lw","fcJOy8FmFH","n1pmOs93Ml","aL6AJvLsmS","QbxXcn1pmO","cShY2aL6AJ",
+"ZzJHW64s8N","iqv4kFLsph","zbIYYt59lR","aez9yAkKTk","1LB1Llm0pD","Chuy3pvgjS","iwzGklm0pD","hSSvQcShY2","Vprf2ZzJHW","VNCPdJkzUn",
+"Mkgy87fsYM","FjHXR55rfB","RpBQmaez9y","prNT6ulk41","lkMUAQClRL","9rlg9SjskQ","RkQkesqVrf","EoToPJkzUn","Q6hMCZUnqt","taOXK4W0Tl",
+"I7p2aD6rBy","5ZaEzokgRi","wiHrZAXpwE","OUYuF5Mg9r","Dz1R3Qworu","4dEz6FVMxo","xciqphSSvQ","lj07QVNCPd","2TRI7No0Qb","K4GS8yEfy9",
+"h1zcHQnJ1S","qUJMdwiHrZ","i3pydZuDtD","wDajXBCxeC","i7WMQBbwgA","SbRYy4W0Tl","JKWYR8RCUA","HlUbFtaOXK","sqVrflm0pD","iB08lsqVrf",
+"tlILt16lHc","cmXIXVLTy6","YOfrYLewvM","cmXIXbrhlQ","a00b5l83Ud","FFDuiyEfy9","Q6hMCB3qem","tl72WjSjS3","0KyfsECMvU","0h1b1oQ87r",
+"zQt6Q7lUXZ","Fhtglv8yFN","jtn0XdQ586","1LB1LQChxs","Uvlv4Qworu","LDk6fCp3mZ","AgJHQFNYIM","0BmCyDz1R3","pFrrllpF6W","ZhwG1JkzUn",
+"QbxXcrz7Ut","JkzUnk85Ae","4QMc95ZaEz","b29RJ14FLR","6AFT0bgJAz","vLsmSJ2mQi","iqv4kRzaZA","9eoRcnnP8o","uupzkqQxHP","vkCHHfcJOy",
+"Chuy3y94nw","7lUXZ3otm6","yToGWm4bxU","VBjhzZzJHW","dhSuHuoStw","L7cGcBpYhV","aFFssFPfSE","FxX9q55rfB","LDk6fi7WMQ","9eoRc580YD",
+"v2eC35Drn0","FVMxozmLYD","jiVBPvLsmS","y94nwjfREu","zQt6QQworu","YOfrYW3VFH","gf8rI6AFT0","WaWsvtAOsr","cShY2lH1kt","s93MlciuWz",
+"S77LHBGaQY","cmXIXhYBCK","5iGN5bZLvS","S77LHiwzGk","1v5hH7hyVv","cmXIX2Nslm","pFrrlI7p2a","uupzkMK07Y","TXQ0ZKr8ys","Dz1R3soy9t",
+"fmIK1uPX7G","uN6r3lm0pD","VLTy6gjUTu","WmadAQworu","1LB1LxXTI4","yluBxJKWYR","AIYUuJkzUn","gdQsSEoToP","WMiS3K4GS8","4W0TlIBe8k",
+"9rlg9brhlQ","Ss0Zuzz4ZU","48cHL2Nslm","iqv4kYOfrY","Vprf2Oz8yZ","0PktIQYxC0","45cIHjiVBP","pFrrl8U2nU","uTacx5Drn0","Waim6JRJQB",
+"piJSkYjB9t","FNYIMzFgtB","s93MlG1RhS","IKxdL5Drn0","HlUbFlViBv","14FLRRmDcr","POUYSfFDrJ","hi5X70MR5X","JXljWCdyBV","W3VFHuZPqg",
+"L7cGcJKWYR","I7p2apFrrl","k85AeMmsIo","VBjhzlViBv","ZUnqtatef2","SbRYylj07Q","KASQ8QWxoT","mX2GEQbxXc","e6e4zhYBCK","4W0TlGSQwj",
+"G1RhSulk41","C2IrcGrDg7","faHirZv7z0","fcJOylXFOB","faHir29QAz","IjTwPOxWIH","jfREuuvf7A","iwzGk55rfB","jSjS3MezSW","KsjRKaez9y",
+"yToGWVprf2","cQOnvvLsmS","0h1b1LbRTH","5Drn0QChxs","xReecfcJOy","WaWsvksJby","h1zcHK20wK","hE1Ql9rlg9","bgJAzHzZT8","1v5hH0h1b1",
+"vLsmSQssNC","Waim6ix74r","n1pmOIKxdL","v1HlnMezSW","1v5hHjSjS3","jeskSZv7z0","9iGoTYh1hF","5Mg9ruPX7G","fcwDaCIShG","QnJ1SzY1GY",
+"PYBf4uoStw","ZUnqtsoy9t","8TxD7W7cTs","wiHrZGv3Fq","jzUqRguMb8","O3iyQatef2","M3zXLt98iW","blLA9No0Qb","JJs5mUlU3M","GSQwjgf8rI",
+"8hJdtWPmlx","OUYuFFnPFB","Waim6AkKTk","vkCHHeuZA5","2TRI7DQimp","AkKTkOxWIH","K4GS82Nslm","rhl0Ji3pyd","48cHLQnJ1S","s7MxkciuWz",
+"ZhwG1ZhwG1","CqqaDbgJAz","Cfgr3WPmlx","jeskSix74r","7lUXZbrhlQ","C2Irc3otm6","HfyNQUlU3M","pvgjSlsQGo","DG4sTZuDtD","8hJdtQ6Lix",
+"IKxdLOUYuF","rKDLJGSQwj","dhSuH64s8N","5VZjSDLhzM","4dEz6fFDrJ","MojnPHfyNQ","JkzUnfcwDa","EdBKc0h1b1","yToGW0h1b1","xciqptlILt",
+"P6bcg5Mg9r","GSQwjReKEW","Qworu0YAGH","oVQp6IBe8k","2NslmDG4sT","uupzkFVMxo","2Yz7EPOUYS","NOHszB3qem","v2eC3Q6Lix","lsQGouN6r3",
+"jS1ajSmGzv","djsrvFcWrW","7lUXZs93Ml","K4GS8djsrv","55rfBMK07Y","sx5GlEOE1o","lViBvSWfou","ZhwG1HfyNQ","I7p2a618Di","hSSvQJXljW",
+"7fKYUNOHsz","FFDuiIjTwP","lXFOBVerEA","ZzJHWtlILt","5drc6zmLYD","L7cGcgjUTu","PYBf4HlUbF","580YDjtn0X","MK07YjfREu","ogLgcS2Dfu",
+"FxX9qVIlwP","CdyBVVprf2","FNYIMSWfou","pAhR1tuDyS","W7cTsRmDcr","SjskQqUJMd","brhlQ9XyT9","soy9tBbwgA","lViBvJkzUn","Z4I1vWPmlx",
+"zY1GYRBhp0","cmXIXsqVrf","45cIHBFkb8","9y4lw7lUXZ","iqv4kTCgPp","7fKYUksJby","0h1b1D6rBy","nnP8oyToGW","Chuy3QYxC0","v1HlnBGaQY",
+"3weIFUvlv4","55rfB9iGoT","1j5L8jtn0X","RkQkeXyPZN","7hyVvFjHXR","45cIH64s8N","IKxdLDz1R3","PYBf4EdBKc","pT8wuFjHXR","jfREuBCxeC",
+"VerEAsx5Gl","gjUTubrhlQ","0PktIuAWyp","29QAzjzUqR","fFDrJbrhlQ","okgRi9XyT9","ulk412hEEU","yofH3gf8rI","JKWYRAkKTk","9y4lwZUnqt",
+"uoStw0PktI","xciqpWMiS3","x3LDexReec","wDajXHRxd8","nnP8oJJs5m","JJs5mEOE1o","X6PingtCA5","Waim60YAGH","uN6r3OxWIH","VBjhz5nmWv",
+"cL0aEFVMxo","pWiOsPb1pa","GWqqXuAWyp","LewvMiKqhr","Mm8siCp3mZ","Cp3mZOUqFM","mz8gxD6rBy","ogLgc0BmCy","No0Qbru4UG","Ss0ZuMm8si",
+"7lUXZgdQsS","AkKTkIRh48","BbwgAOUYuF","BbwgAyluBx","dpe1vNo0Qb","xReecZhwG1","BCxeCNAFuw","AIYUu8hJdt","C2IrcNAFuw","gf8rICNHmv",
+"RxrsmSbRYy","RzaZAcShY2","X6Pinrhl0J","64s8NJXljW","DLhzMLbRTH","2DREsjeskS","tuDyS9XyT9","MaJQsGWqqX","v2eC3FnPFB","mz8gx9y4lw",
+"pmeCdtl72W","rz7UtLbRTH","jiVBPS2Dfu","9y4lwYOfrY","0ao3lYf2Ec","9rlg9Cp3mZ","o8UydNcICA","BCxeCru4UG","ydG8UiKqhr","MGlTFKASQ8",
+"blLA9POUYS","HlUbFD6rBy","580YDQssNC","t59lRVerEA","7fKYUzY1GY","faHirEoToP","0BmCylsQGo","5Mg9rFnPFB","KZamHC2Irc","Ul4a1xciqp",
+"rKDLJQnJ1S","ZzJHWDcpWB","zmLYDl83Ud","zbIYYhSSvQ","tAOsrJXljW","yEfy9i3pyd","NhXduNOHsz","o8Uyd4W0Tl","taOXKTXQ0Z","HlUbFKr8ys",
+"Mkgy8ReKEW","MK07YXflUq","t98iWQ6hMC","LewvM8FmFH","djsrvM3zXL","uvf7A29QAz","Dz1R3zbIYY","zz4ZUFFDui","FnPFBMojnP","uvf7AIn3NS",
+"ogLgcJKWYR","pT8wun8pJ9","6AFT05iGN5","2hEEUh1zcH","guMb8Pb1pa","jeskSKsjRK","sqVrf1LB1L","pv0i7Mm8si","5Drn0OUqFM","U3yw5OxWIH",
+"DcpWBfcwDa","FGzgpWPmlx","0BmCypiJSk","fcwDa8TxD7","0BmCyJkzUn","oVQp6AIYUu","Y1mC0StlDJ","nnP8o4dEz6","hUTw7soy9t","7ku1p7fsYM",
+"VIlwP2TRI7","8hJdtFNYIM","vOqCEcmXIX","nnP8oMm8si","BpYhVbZLvS","RmDcruQIcz","ZhwG1lweGy","24ARF2Nslm","JKWYROz8yZ","vOqCEFnPFB",
+"oVQp6qaofN","F6PT2qaofN","K20wKhSSvQ","v1HlnFLsph","vLsmSjSjS3","rhl0Jn1pmO","D6rByCqqaD","faHirGv3Fq","55rfBkB5nP","S77LHNo0Qb",
+"5ZaEzwDajX","7fKYUOUYuF","RkQkekZANm","Zv7z0JJs5m","B3qemzz4ZU","Gv3Fqgf8rI","yofH3WPmlx","0ao3lMojnP","pWiOsQnJ1S","vLsmSi3pyd",
+"KsjRKs93Ml","7hyVv2hEEU","ZuDtDaL6AJ","dhSuHgdQsS","m4bxUW7cTs","hYBCKxXTI4","YOfrY0h1b1","atef2Qworu","tlILtjtn0X","Nxx9VQworu",
+"QWxoT1j5L8","lkMUA5VZjS","QWxoTjzUqR","taOXKJKWYR","TwanoZuDtD","5NammRkQke","dpe1vjtn0X","0BmCyPYBf4","jfREuQChxs","6AFT0mX2GE",
+"RkQkeFNYIM","sx5Gl5Drn0","NOHsz14FLR","h1zcHdQ586","ZzJHWvkCHH","XyPZNCNHmv","QChxslj07Q","soy9tXyPZN","FxX9qCNHmv","BbwgAUl4a1",
+"AmdQdZ4I1v","ciuWzs7Mxk","Pb1paFPfSE","S2DfuCdyBV","RBhp08TxD7","9eoRchE1Ql","WmadAIBe8k","NcICAQnJ1S","EdBKcVBjhz","TCgPpQChxs",
+"StlDJ07n1c","7Ow5CNAFuw","GrDg79iGoT","s93MlcL0aE","5IhmGRACuj","BGaQY5ZaEz","xciqp5Mg9r","he9IAix74r","okgRiYw2oU","uAWypQClRL",
+"3otm6dmoS7","1j5L8ru4UG","0BmCyt98iW","FnPFBVBjhz","Z4I1vrhl0J","uvf7AMaJQs","Kr8ysGv3Fq","GSQwjFjHXR","t98iWW7cTs","RzaZAxXTI4",
+"KASQ89XyT9","aL6AJBbwgA","he9IAUvlv4","lm0pDokgRi","Dz1R34QMc9","OHaBzEdBKc","618DiBbwgA","oGu6xP6bcg","WmadAFhtgl","O3iyQG1RhS",
+"tAOsrRmDcr","OUYuFeuZA5","v8yFNIn3NS","vkCHH8xEKz","gf8rIXyPZN","6q6L9pv0i7","pAhR1RpBQm","RmDcrpiJSk","1LB1LVBjhz","48cHLOxWIH",
+"Vprf2DcpWB","FNYIMWPmlx","uTacxQClRL","9y4lwgdQsS","Q6Lix48cHL","oVQp6s4786","ciuWzdjsrv","fcwDasqVrf","zmLYDs7Mxk","lH1ktl83Ud",
+"QClRLKsjRK","4QMc9BbwgA","lpF6WVNCPd","AgJHQblLA9","sqVrf24ARF","tlILtpmeCd","AgJHQ16lHc","SbRYy5Drn0","y94nw45cIH","16lHc7ku1p",
+"Qworu5ZaEz","v8yFN1v5hH","azIWp5iGN5","0h1b1fFDrJ","No0QbyluBx","QbxXcHlUbF","5drc6IBe8k","07n1cpmeCd","JXljWs7Mxk","7lUXZNOHsz",
+"MGlTFD6rBy","IjTwPCfgr3","VerEAzQt6Q","BCxeCgIYvE","JKWYRBCxeC","dmoS7mz8gx","IRh48Ss0Zu","jSjS3oQ87r","QbxXcsx5Gl","Pb1paMmsIo",
+"FjHXRtAOsr","aDGtS0ao3l","SjskQX6Pin","tl72WQbxXc","AmdQdHfyNQ","cQOnv5nmWv","atef2uAWyp","rhl0J8cVD3","4dEz69eoRc","i3pydIBe8k",
+"uPX7GfcwDa","3otm6hYBCK","cL0aE8FmFH","CxVEfQworu","nnP8ofmIK1","yEfy9gIYvE","fcJOytvdkD","UmaEv2Nslm","5IhmGfcJOy","lpF6WiwzGk",
+"zmLYDJXljW","FFDui618Di","M3zXLm4bxU","gIYvEokgRi","NOHszkZANm","5drc6kZANm","SWfouTwano","8cVD3zFgtB","tuDySAOgEe","2NslmNcICA",
+"QYxC0Nxx9V","14FLRm4bxU","P6bcgv8yFN","XyPZNs93Ml","oQ87rQChxs","gdQsS8cVD3","vkCHHKsjRK","tl72WzQt6Q","QssNC7fsYM","5ZaEz0ao3l",
+"dpe1vUlU3M","QChxsOUYuF","ZzJHWn8pJ9","cL0aEwDajX","bgJAzpvgjS","QssNCxXTI4","QnJ1SfLNg8","tjQxst59lR","AXpwExXTI4","taOXKHP433",
+"ydG8U9iGoT","dmoS7Qworu","pT8wugdQsS","ECMvUbZLvS","brhlQnlaBy","Gv3FqLewvM","i7WMQ2hEEU","X6PinblLA9","aL6AJYf2Ec","aez9yW7cTs",
+"kB5nP8cVD3","9rlg9Pb1pa","dhSuHgf8rI","QClRLuoStw","D6rByGWqqX","jtn0XPb1pa","lweGyRkQke","pFrrlNhXdu","faHireuZA5","D6rBy4QMc9",
+"RzaZADQimp","gf8rIOxWIH","fFDrJPOUYS","Gv3Fqi7WMQ","TCgPpRmDcr","0YAGHgdQsS","rKDLJa00b5","4dEz60PktI","d85a9tuDyS","gtCA5zQt6Q",
+"P6bcg3weIF","IKxdLZUnqt","pFrrlQworu","8U2nUJJs5m","W3VFHZv7z0","0BmCy24ARF","JJs5mSWfou","soy9tO3iyQ","RkQkeQssNC","uvf7AvkCHH",
+"580YDyofH3","No0QbFhtgl","G1RhSa00b5","VLTy6FGzgp","U3yw5kB5nP","d7vjMtaOXK","XflUqSs0Zu","Ul4a1djsrv","prNT6BFkb8","FLsphFxX9q",
+"jtn0X2ZHdk","OHaBzi7WMQ","JJs5m0PktI","ZJTXHMGlTF","5iGN50YAGH","yluBxBCxeC","pFrrl3weIF","CqqaDHRxd8","580YDLDk6f","yvOMI07n1c",
+"bgJAzXflUq","Kr8ys45cIH","IRh48I7p2a","5Mg9rPYBf4","lkMUAtuDyS","AIYUul83Ud","IBe8knlaBy","pvgjSfqypy","DLhzM2Nslm","n1pmOFhtgl",
+"TwanoNxx9V","9GXkXl83Ud","Kr8ys0MR5X","W7cTsn1pmO","pv0i7blLA9","suY4xMm8si","FFDuiIKxdL","nlaByVerEA","qUJMds93Ml","2Yz7EzHF1q",
+"VBjhzGrDg7","I7p2aksJby","n1pmOsqVrf","8hJdtRsQUq","FwEJzJJs5m","s7Mxkzz4ZU","VNCPdkB5nP","14FLRdQ586","k85AevkCHH","ydG8UlViBv",
+"J2mQis4786","d7vjMF6PT2","NcICAAkKTk","SWfoufcwDa","Cfgr3uPX7G","ni2v1ZzJHW","EoToPNxx9V","StlDJh1zcH","UmaEvlkMUA","tvdkDni2v1",
+"cL0aESjskQ","cL0aECIShG","uoStwdjsrv","Vprf20h1b1","vLsmSFFDui","2Yz7EEdBKc","pvgjSgf8rI","K4GS8iwzGk","suY4xuN6r3","14FLRQbxXc",
+"yofH3fmIK1","hUTw7QYxC0","Chuy3MojnP","ru4UGMojnP","oVQp6iqv4k","DcpWBkZANm","t59lRe6e4z","MK07YMezSW","aDGtSdjsrv","y94nwuAWyp",
+"J2mQiMmKGJ","JkzUn55rfB","JRJQBrz7Ut","6AFT0TCgPp","OUqFMjtn0X","ni2v1Ul4a1","LewvMLbRTH","QClRLdpe1v","VLTy6Uvlv4","6AFT0sx5Gl",
+"UlU3MsuY4x","0KyfsEoToP","MezSW8RCUA","GXdoHkZANm","580YDyToGW","lsQGoTwano","atef2n8pJ9","aez9yJkzUn","Z4I1v8FmFH","K4GS8ZzJHW",
+"euZA5yToGW","Yh1hF1v5hH","OxWIHNOHsz","jtn0XYw2oU","I7p2aTa8f6","rKDLJ8RCUA","ECMvUD6rBy","64s8NX6Pin","Z4I1vBbwgA","BbwgA5ZaEz",
+"jSjS3wDajX","lweGyNhXdu","ReKEW5Drn0","NcICAKr8ys","4QMc9zqH0W","pv0i7SWfou","s4786xReec","D6rByRkQke","mX2GEdhSuH","W3VFHmz8gx",
+"FxX9qYOfrY","8hJdttjQxs","9GXkXEdBKc","3weIFgtCA5","Vprf2jtn0X","8TxD7FxX9q","7Ow5C9iGoT","ZzJHWZJTXH","WPmlx5VZjS","yEfy9zY1GY",
+"U3yw5ZJTXH","UlU3M5IhmG","wiHrZjfREu","DLhzMyEfy9","uoStwWmadA","gdQsSlj07Q","pAhR114FLR","HP433ksJby","iB08l7fsYM","U3yw5CqqaD",
+"EdBKc8U2nU","tlILtydG8U","pmeCdjiVBP","HzZT8xciqp","Nxx9V5Mg9r","5drc60Kyfs","M3zXL0h1b1","tlILtOHaBz","zQt6QQ6Lix","EdBKc7X3uy",
+"QClRL0BmCy","QWxoTt98iW","8RCUA07n1c","YOfrYQYxC0","RsQUqWmadA","ksJbyQbxXc","GrDg7jSjS3","ydG8UQ6hMC","iqv4kn8pJ9","DcpWBBCxeC",
+"tAOsrrhl0J","J2mQid7vjM","CIShGzbIYY","M6qcGVNCPd","qaofNVerEA","MGlTF5iGN5","UmaEvuvf7A","zqH0WCp3mZ","Q6Lix8hJdt","MmKGJFhtgl",
+"soy9tIBe8k","X6PintaOXK","DQimpoVQp6","Y1mC0fFDrJ","3otm6MaJQs","CNHmvd85a9","aez9yJIqXi","StlDJvLsmS","PYBf4ni2v1","GSQwjaFFss",
+"DG4sT0YAGH","FcWrWUlU3M","0BmCyJ2mQi","RpBQmPOUYS","sqVrf0PktI","1LB1L0BmCy","i3pydlj07Q","FNYIM55rfB","0ao3li3pyd","ZuDtDStlDJ",
+"GSQwjQWxoT","8xEKzuupzk","618DiQnJ1S","iwzGkS2Dfu","fcJOyOUqFM","2DREsFjHXR","ZuDtDPYBf4","CqqaDlm0pD","JJs5ms4786","PYBf4yToGW",
+"fmIK1VBjhz","Qworuuvf7A","SmGzvrhl0J","WDVWJwDajX","s93MlFNYIM","djsrvjiVBP","i7WMQRmDcr","24ARFLewvM","5iGN5lj07Q","mX2GELewvM",
+"I7p2a64s8N","nFqik5ZaEz","8xEKzECMvU","2TRI7okgRi","pT8wu7ku1p","hE1QluoStw","Twanoe6e4z","48cHLQ6Lix","sx5GlMojnP","Q6hMCRzaZA",
+"ZzJHWBpYhV","HfyNQnFqik","b29RJx3LDe","kB5nPhE1Ql","5iGN5fqypy","O3iyQs4786","IBe8kbrhlQ","nFqikWPmlx","UmaEvl83Ud","dpe1vtaOXK",
+"I7p2aCp3mZ","MmKGJGSQwj","NAFuwWPmlx","Gv3FqNAFuw","azIWpydG8U","VjCZqpv0i7","FxX9qoVQp6","DQimpTCgPp","rhl0JnnP8o","Dz1R34dEz6",
+"NcICA618Di","brhlQNAFuw","IBe8kUmaEv","nFqikCfgr3","4dEz6zY1GY","FxX9qRsQUq","EOE1ouTacx","fFDrJRACuj","In3NSlm0pD","OHaBzlkMUA",
+"rKDLJoGu6x","ZuDtDS2Dfu","fmIK1uvf7A","QChxsgjUTu","WPmlxL7cGc","OUqFMk85Ae","4W0TlStlDJ","fmIK1Z4I1v","jeskSaL6AJ","s93MlsqVrf",
+"rz7UtMGlTF","AmdQdpmeCd","wiHrZI7p2a","uLtKsdhSuH","Mkgy87ku1p","QClRLQ6hMC","K20wK7hyVv","5iGN5jS1aj","uZPqgJKWYR","YjB9tsqVrf",
+"24ARFd85a9","CNHmvbgJAz","gdQsSn1pmO","WmadAXyPZN","ni2v1LewvM","48cHLRBhp0","6AFT0Q6hMC","0ao3l9GXkX","IKxdL29QAz","vLsmScL0aE",
+"vkCHHTa8f6","NcICAIjTwP","MmKGJfLNg8","cShY2okgRi","Dz1R3No0Qb","W3VFHQ6hMC","LbRTHo8Uyd","OHaBzAOgEe","x3LDe9y4lw","BGaQYKsjRK",
+"zmLYD5ZaEz","nnP8ogdQsS","PYBf4ix74r","7ku1pt98iW","XflUqKASQ8","pmeCd9y4lw","VBjhzMGlTF","wiHrZzmLYD","i7WMQIBe8k","hSSvQIKxdL",
+"JKWYRC2Irc","KsjRKCfgr3","pmeCdGrDg7","24ARFCNHmv","0MR5XlViBv","8U2nUZ4I1v","Y1mC06AFT0","0MR5XHRxd8","iwzGkoVQp6","16lHckZANm",
+"yToGWnlaBy","BFkb81j5L8","KASQ8GrDg7","rhl0JkZANm","WaWsv9y4lw","yEfy98U2nU","W3VFHMK07Y","AXpwEru4UG","XyPZNh1zcH","pvgjSMm8si",
+"pvgjSLbRTH","QChxs8U2nU","1v5hHCIShG","FcWrWRzaZA","FxX9qwDajX","OUqFM0h1b1","WaWsvoVQp6","YjB9tgIYvE","6AFT0618Di","QbxXcl83Ud",
+"IjTwPNhXdu","B3qemWMiS3","dQ5868cVD3","prNT6yluBx","v8yFNTXQ0Z","t98iWt59lR","1j5L87Ow5C","fqypyIjTwP","3weIFaez9y","BbwgAYjB9t",
+"EoToPjiVBP","BCxeCTwano","0YAGHjtn0X","xXTI4o8Uyd","RxrsmaL6AJ","KASQ8QYxC0","uupzkIjTwP","5NammNAFuw","Cfgr3Waim6","QssNCQworu",
+"Twano9eoRc","tl72WblLA9","KASQ8ydG8U","Ta8f6tlILt","azIWpFwEJz","tjQxscL0aE","UlU3MNOHsz","5Nammy94nw","a00b5Zv7z0","RkQkeGXdoH",
+"kZANmGv3Fq","LbRTHuPX7G","Uvlv4n1pmO","YjB9tuN6r3","tlILtuQIcz","tAOsrsoy9t","S77LHtvdkD","8FmFHZv7z0","mz8gx1j5L8","JIqXi64s8N",
+"8xEKz55rfB","aFFssVprf2","nnP8ogIYvE","0BmCyMaJQs","ZuDtDazIWp","Yh1hFtjQxs","7fsYMa00b5","o8Uyd0Kyfs","29QAzZv7z0","fqypydmoS7",
+"CK5W7fLNg8","5iGN5aFFss","ReKEWTa8f6","SmGzvCxVEf","n8pJ9pmeCd","TwanoHRxd8","jiVBPn8pJ9","OUYuFP6bcg","guMb8jzUqR","pv0i79GXkX",
+"oQ87rW7cTs","y94nwdQ586","XyPZNRBhp0","ZJTXH3otm6","d7vjMdpe1v","he9IAqQxHP","rKDLJaDGtS","lH1ktvOqCE","k85AeMezSW","Vprf20ao3l",
+"CK5W7atef2","QChxsMojnP","S2Dfuy94nw","QChxsDG4sT","Cfgr3XyPZN","ni2v1MGlTF","qUJMduupzk","mX2GEVprf2","OUYuFtl72W","FLsphd7vjM",
+"FwEJzAXpwE","8hJdtlCMxy","FNYIM2DREs","9GXkX45cIH","VNCPdIBe8k","ThjNny94nw","FhtglZzJHW","F6PT2taOXK","zHF1qpv0i7","14FLRJKWYR",
+"FnPFBsx5Gl","5ZaEzVjCZq","wDajXQClRL","oQ87r4W0Tl","2NslmoVQp6","SWfouRkQke","aL6AJiB08l","xXTI4nlaBy","h1zcHW7cTs","Chuy3JXljW",
+"RBhp0UmaEv","cL0aEgdQsS","zY1GY7fsYM","fFDrJDcpWB","QWxoTuvf7A","8hJdt4dEz6","QssNCy94nw","qUJMdPb1pa","Yf2EcNo0Qb","HlUbFEOE1o",
+"RxrsmFwEJz","mz8gxQssNC","HlUbFP6bcg","PYBf4nFqik","SjskQKr8ys","cQOnvS77LH","3otm6Yf2Ec","ZhwG1zY1GY","Q6LixciuWz","WMiS3MGlTF",
+"RkQkev1Hln","ni2v1KZamH","atef2HRxd8","taOXKUl4a1","mX2GEm4bxU","ZUnqtzY1GY","dQ586Uvlv4","lXFOB9XyT9","atef2uupzk","0KyfsK20wK",
+"CIShGuQIcz","iwzGkJkzUn","Yh1hFix74r","CK5W7Uvlv4","FLsphyvOMI","jfREu9eoRc","jSjS3zmLYD","nnP8omz8gx","0h1b1tjQxs","i7WMQwiHrZ",
+"7fKYU2TRI7","0MR5Xh1zcH","8cVD35drc6","jfREuRACuj","n1pmOYh1hF","M3zXLFhtgl","7ku1pVBjhz","7ku1pMGlTF","AIYUu2Yz7E","K20wKzQt6Q",
+"Ul4a1taOXK","nnP8oBpYhV","zHF1qECMvU","HRxd8Ta8f6","F6PT2J2mQi","YOfrYOUqFM","2NslmRACuj","FcWrWyofH3","IjTwPUmaEv","FGzgpUlU3M",
+"SjskQs7Mxk","HfyNQ8U2nU","0PktIyofH3","8U2nUmz8gx","i7WMQ5Mg9r","yluBxW3VFH","14FLR9eoRc","5iGN5uZPqg","Ul4a1rKDLJ","v1HlnnFqik",
+"5drc6zz4ZU","DG4sTRmDcr","n8pJ9MaJQs","yofH3nFqik","nlaBySbRYy","tAOsrSWfou","0PktIjzUqR","QbxXc0MR5X","VBjhzWPmlx","IBe8khE1Ql",
+"MojnPFGzgp","TXQ0Z16lHc","WDVWJLDk6f","aDGtStjQxs","FnPFBEdBKc","BFkb8X6Pin","a00b57Ow5C","5Drn0pv0i7","WPmlxQssNC","FhtglU3yw5",
+"VIlwPWPmlx","5VZjStuDyS","NcICAHP433","lweGytlILt","FVMxoyEfy9","RzaZAJRJQB","YjB9tChuy3","djsrvAOgEe","WMiS3JIqXi","Nxx9VQYxC0",
+"Yh1hFUlU3M","gIYvEtaOXK","tl72W7X3uy","OUYuFY1mC0","TCgPpoVQp6","ZzJHWhi5X7","SbRYy9y4lw","3weIFDQimp","JIqXiM3zXL","n1pmOOxWIH",
+"BpYhVCxVEf","VjCZqyEfy9","WmadAFxX9q","FjHXRoVQp6","HP433fFDrJ","s4786v8yFN","Ul4a11LB1L","W7cTsJKWYR","FjHXRgjUTu","2TRI7uvf7A",
+"UlU3MKASQ8","W3VFHThjNn","VjCZqOz8yZ","zFgtB8xEKz","GrDg7ciuWz","dhSuHpFrrl","TwanoLbRTH","e6e4zlweGy","RmDcrQClRL","i7WMQJXljW",
+"uZPqgF6PT2","8FmFHMojnP","NAFuwvLsmS","ogLgc0Kyfs","Nxx9VDLhzM","y94nwQWxoT","k85Ae2TRI7","LDk6fMkgy8","BCxeCZJTXH","CxVEfCK5W7",
+"e6e4ztjQxs","Oz8yZjSjS3","FcWrWZhwG1","7Ow5CMGlTF","580YDoVQp6","HzZT8CdyBV","iB08lpAhR1","qUJMdWmadA","J2mQi6q6L9","MmsIoCxVEf",
+"aL6AJgjUTu","lViBv5drc6","cShY2v1Hln","Kr8ysguMb8","zqH0WECMvU","Q6hMChSSvQ","EdBKcs4786","dhSuHpmeCd","5ZaEzNcICA","B3qemM3zXL",
+"ulk41oQ87r","uoStwsoy9t","7fKYU1LB1L","HlUbFdpe1v","b29RJ4QMc9","DLhzMDG4sT","C2IrcSs0Zu","WaWsv7hyVv","wDajXlj07Q","M6qcGHRxd8",
+"gf8rIFFDui","uupzkxXTI4","1j5L8xciqp","qUJMdMkgy8","4QMc9HzZT8","lm0pD2hEEU","WMiS3QbxXc","VerEAMGlTF","jiVBPzFgtB","piJSkt59lR",
+"prNT6ECMvU","jeskSFwEJz","v1Hlniqv4k","Nxx9V0MR5X","l83UdtaOXK","QworuKsjRK","64s8Ns4786","FVMxo8TxD7","2Nslm618Di","yluBxlCMxy",
+"cL0aE24ARF","KsjRKDcpWB","RxrsmQYxC0","2TRI7ydG8U","oQ87rZUnqt","2Yz7E4W0Tl","Yh1hFoQ87r","SmGzvuQIcz","5ZaEzuAWyp","ZJTXHcL0aE",
+"0h1b1HlUbF","4QMc9JIqXi","D6rByyofH3","AXpwE3otm6","48cHLMm8si","5Drn0CqqaD","t59lRLDk6f","DQimpdjsrv","ThjNnDz1R3","fmIK1LbRTH",
+"faHirn1pmO","ydG8Upv0i7","CqqaDDcpWB","QChxs618Di","9eoRcLewvM","xXTI4uTacx","ZJTXHpAhR1","Zv7z0IjTwP","RpBQmyvOMI","VLTy6iB08l",
+"pT8wuEoToP","Rxrsm29QAz","aFFssUmaEv","sx5GllViBv","MGlTFhUTw7","k85Ae2Nslm","VBjhz9y4lw","SmGzvlweGy","RpBQmAIYUu","jzUqRD6rBy",
+"pvgjShe9IA","tl72WRxrsm","pWiOsYw2oU","zmLYDMGlTF","xXTI4lm0pD","0ao3lOz8yZ","EOE1oNcICA","b29RJtaOXK","16lHci3pyd","VLTy6oQ87r",
+"1j5L8Q6hMC","kB5nPlweGy","AIYUuRzaZA","D6rByazIWp","EOE1oFcWrW","uLtKsmz8gx","StlDJlweGy","JkzUnb29RJ","uPX7Gv2eC3","rhl0JNAFuw",
+"vLsmSlweGy","No0QbMmKGJ","ReKEWQ6hMC","aFFss8hJdt","cQOnvVBjhz","2TRI7ECMvU","LDk6f2Yz7E","vLsmSfFDrJ","StlDJSmGzv","yluBxU3yw5",
+"ThjNnCp3mZ","UlU3MSbRYy","HzZT8yvOMI","1LB1LGSQwj","yToGWlweGy","4W0TlQ6hMC","EOE1oEOE1o","W3VFH7fsYM","QYxC0xXTI4","RpBQmzY1GY",
+"0BmCyRzaZA","xXTI4I7p2a","IBe8kMmKGJ","EoToPv8yFN","Yf2EccL0aE","yluBxFFDui","v2eC3gIYvE","RACujNxx9V","WDVWJhUTw7","0MR5XPYBf4",
+"tlILtgtCA5","ZhwG1uJScX","QClRLiwzGk","CIShG9GXkX","580YDpT8wu","rhl0Js4786","FwEJzNo0Qb","DLhzM8FmFH","2NslmqaofN","EOE1o48cHL",
+"7X3uyCIShG","IKxdLMmsIo","fqypyO3iyQ","EoToPOz8yZ","yofH3azIWp","EoToPPOUYS","DQimpMm8si","GXdoH5iGN5","uupzkXyPZN","djsrvECMvU",
+"jzUqRpFrrl","rhl0JIBe8k","dmoS77lUXZ","0Wr5ys93Ml","DcpWBMkgy8","9iGoTAmdQd","8xEKz0PktI","djsrvhe9IA","uTacxKZamH","HRxd8uN6r3",
+"0MR5XM6qcG","gf8rIyEfy9","piJSkEdBKc","IBe8kZv7z0","BCxeCTa8f6","QYxC0iwzGk","k85AeCfgr3","blLA9WDVWJ","Uvlv4nnP8o","1j5L8Uvlv4",
+"Uvlv448cHL","JIqXidQ586","1v5hHHzZT8","X6PinIKxdL","aFFss5IhmG","UlU3MFPfSE","atef2RzaZA","Zv7z0zbIYY","jS1ajTwano","LDk6fhYBCK",
+"zQt6Q5ZaEz","o8UydzmLYD","29QAzl83Ud","BpYhVpAhR1","W3VFHHRxd8","jtn0X8cVD3","GWqqXP6bcg","48cHL3otm6","J2mQiBbwgA","L7cGcQClRL",
+"GrDg7zz4ZU","9y4lwJ2mQi","cQOnvWMiS3","tuDySdQ586","0MR5Xs4786","1j5L8a00b5","ogLgcCqqaD","lH1kt16lHc","IKxdL618Di","QYxC0s7Mxk",
+"HfyNQQnJ1S","RmDcr8RCUA","KZamHrz7Ut","tvdkDMK07Y","prNT6rhl0J","5IhmG4QMc9","O3iyQ8U2nU","yEfy9C2Irc","8RCUA9XyT9","9GXkXI7p2a",
+"wDajXAgJHQ","No0QboQ87r","sqVrfIn3NS","e6e4zqQxHP","8RCUAzQt6Q","v1HlnDLhzM","lkMUAru4UG","VIlwPYh1hF","OUYuFIKxdL","cmXIX8RCUA",
+"StlDJBFkb8","RpBQmpFrrl","mz8gxsoy9t","a00b5m4bxU","ZzJHWFhtgl","OUqFM5iGN5","FVMxoGv3Fq","o8Uydt59lR","sqVrfQworu","pFrrlUlU3M",
+"cL0aEAOgEe","pv0i7dpe1v","7X3uyBpYhV","WPmlx0ao3l","uTacxFjHXR","uN6r3KZamH","gtCA5CK5W7","HfyNQNhXdu","t98iWFGzgp","Cfgr3yluBx",
+"wiHrZuoStw","ciuWzVNCPd","ThjNnmX2GE","h1zcHhi5X7","GSQwjSbRYy","14FLRpWiOs","uvf7AjeskS","aFFssuoStw","ciuWzQChxs","BGaQYWreyP",
+"t59lR4QMc9","lweGyjzUqR","HlUbFVprf2","ulk41aDGtS","2TRI7rz7Ut","7lUXZOHaBz","8RCUAsuY4x","HfyNQDz1R3","xciqpaFFss","ZhwG145cIH",
+"2NslmZJTXH","s4786MmsIo","ZhwG1cL0aE","L7cGcpv0i7","qaofNzY1GY","7lUXZhYBCK","No0QbnnP8o","prNT6hSSvQ","FPfSErz7Ut","RBhp0wiHrZ",
+"BbwgAs7Mxk","HlUbFuupzk","1v5hHdmoS7","jtn0Xatef2","Yf2EcRzaZA","I7p2a9y4lw","sqVrfFhtgl","lCMxyYOfrY","Pb1pamz8gx","5nmWv5Drn0",
+"6q6L9xciqp","ZuDtDZv7z0","zmLYDP6bcg","lkMUA9GXkX","wiHrZyofH3","CqqaDQworu","YOfrYxciqp","7fsYMZ4I1v","pT8wu6q6L9","P6bcglH1kt",
+"KsjRKfqypy","yluBxWaim6","MGlTF2DREs","0YAGH0Kyfs","fFDrJgIYvE","gjUTuM6qcG","HzZT8hSSvQ","uTacxn1pmO","KZamHbZLvS","guMb8xXTI4",
+"WMiS3guMb8","oGu6xEdBKc","lkMUANcICA","Mkgy8bZLvS","6AFT00PktI","S2DfuKsjRK","24ARFjzUqR","FjHXRl83Ud","faHirFVMxo","KsjRKOHaBz",
+"ogLgcprNT6","XyPZN4dEz6","fqypysqVrf","0ao3logLgc","3weIFYw2oU","ydG8UW3VFH","ix74rdmoS7","8xEKzMkgy8","i3pyd7hyVv","ReKEWlViBv",
+"J2mQiYf2Ec","euZA5Y1mC0","ix74rpiJSk","2Yz7EfcwDa","No0QboVQp6","s93MlAgJHQ","ru4UG9XyT9","UlU3M7lUXZ","Rxrsm48cHL","RsQUqFwEJz",
+"VLTy66q6L9","aez9yFxX9q","55rfBuJScX","PYBf4zbIYY","fcJOyAmdQd","Waim624ARF","tuDySvOqCE","48cHLtvdkD","l83Uda00b5","W7cTsDG4sT",
+"4W0TlfFDrJ","xXTI4QnJ1S","Q6hMCTwano","LewvMkB5nP","TwanoAIYUu","vOqCEdhSuH","jiVBP8TxD7","rKDLJFhtgl","In3NStlILt","QbxXcIRh48",
+"618Di9rlg9","TXQ0ZyofH3","TXQ0Z8U2nU","RzaZAOz8yZ","No0QbuPX7G","0BmCyCp3mZ","pv0i7TXQ0Z","bZLvSMojnP","MojnPsx5Gl","Nxx9Vv8yFN",
+"1j5L8CqqaD","WMiS364s8N","VBjhzC2Irc","VerEAD6rBy","s7Mxkx3LDe","brhlQFcWrW","aez9yLbRTH","W7cTsrKDLJ","mX2GESbRYy","WDVWJVjCZq",
+"B3qemLbRTH","iKqhrru4UG","QYxC0lsQGo","8TxD7IRh48","ReKEWtuDyS","0BmCy0h1b1","tl72W48cHL","GWqqXhYBCK","MmsIo7fsYM","vkCHHFLsph",
+"64s8NtAOsr","djsrvFVMxo","y94nwK20wK","ReKEWyvOMI","FwEJzCfgr3","UmaEvsx5Gl","d7vjMzz4ZU","GSQwjL7cGc","jtn0X9rlg9","Cfgr3fcJOy",
+"x3LDeFNYIM","uoStwzFgtB","DcpWBtaOXK","suY4xYw2oU","Ta8f6d7vjM","1v5hHZJTXH","d85a9OUYuF","VjCZqMaJQs","X6PinBGaQY","UlU3MbrhlQ",
+"5IhmGEOE1o","tuDyS0ao3l","hUTw7Oz8yZ","POUYSpiJSk","ZJTXHoQ87r","vOqCEQbxXc","S77LHtjQxs","OUqFMjzUqR","fqypy2DREs","6q6L9Ul4a1",
+"sx5GlQYxC0","ydG8U5Namm","8RCUAYw2oU","8RCUAPb1pa","55rfBKr8ys","7X3uyo8Uyd","W3VFHKr8ys","Mm8sigIYvE","Cfgr3rKDLJ","y94nw5ZaEz",
+"pT8wuru4UG","TCgPpO3iyQ","0h1b1VLTy6","kZANmOz8yZ","TCgPpU3yw5","8U2nUsqVrf","SbRYy0MR5X","Rxrsm8xEKz","nFqikRpBQm","8U2nUVjCZq",
+"8FmFHQYxC0","s93MluoStw","9GXkXVLTy6","BCxeCtAOsr","jtn0XCNHmv","J2mQijfREu","4W0TlMaJQs","BCxeC8cVD3","mX2GEiqv4k","aFFssfqypy",
+"brhlQuoStw","lpF6WtAOsr","ECMvU5Drn0","tjQxsokgRi","K4GS8JRJQB","uN6r3lpF6W","fFDrJCdyBV","OHaBzzz4ZU","t98iWCfgr3","0BmCyLbRTH",
+"lH1ktzQt6Q","AgJHQFFDui","pmeCd7fsYM","4dEz6ydG8U","pAhR1atef2","TXQ0ZhUTw7","zqH0Wv8yFN","MGlTFlCMxy","VNCPdprNT6","cQOnvgdQsS",
+"m4bxU7X3uy","jS1ajqUJMd","rz7UtEdBKc","RzaZAgf8rI","BCxeCjeskS","FxX9qpT8wu","s7Mxk4QMc9","16lHchi5X7","okgRiAIYUu","o8Uydn8pJ9",
+"guMb8faHir","QClRLzz4ZU","0PktIzmLYD","JkzUnwiHrZ","AmdQdF6PT2","nlaByuJScX","uTacxiKqhr","s7MxkEdBKc","sx5GlDcpWB","WreyPCdyBV",
+"AOgEerKDLJ","ix74rlH1kt","IKxdLEOE1o","ThjNn0YAGH","tAOsrQssNC","RsQUq1LB1L","lkMUAPYBf4","YOfrYzmLYD","uLtKsQ6Lix","Chuy3lpF6W",
+"RACujh1zcH","W3VFHlj07Q","Pb1paSbRYy","oGu6xjiVBP","QssNCQWxoT","ogLgcwiHrZ","aDGtSUl4a1","AkKTkix74r","7lUXZrKDLJ","WPmlxVBjhz",
+"Y1mC06q6L9","S77LHlViBv","lCMxytvdkD","2hEEU3weIF","iKqhrNAFuw","ZUnqt5Drn0","jiVBPXflUq","ciuWzbZLvS","GrDg7hE1Ql","StlDJpiJSk",
+"4QMc9CdyBV","piJSkHP433","MaJQsFhtgl","zFgtBix74r","Ta8f60Wr5y","WmadA7fsYM","UlU3M0ao3l","GXdoHzqH0W","ZuDtDQbxXc","FVMxoWaWsv",
+"aL6AJTXQ0Z","OxWIH9iGoT","8RCUAoQ87r","tlILtnnP8o","nFqikHP433","cShY2XyPZN","J2mQiMkgy8","6AFT0soy9t","he9IAK4GS8","JIqXi24ARF",
+"VIlwPkZANm","SjskQkB5nP","NOHszMm8si","UmaEvaL6AJ","9eoRcJXljW","hSSvQ618Di","FGzgpG1RhS","d85a9soy9t","S2DfuMaJQs","okgRiZhwG1",
+"Vprf2StlDJ","ciuWzdpe1v","FPfSEtlILt","P6bcgoVQp6","fmIK1Y1mC0","lH1ktv8yFN","lkMUAhYBCK","v2eC3NhXdu","GSQwjcL0aE","OUqFMStlDJ",
+"fFDrJe6e4z","yofH3x3LDe","yToGWlH1kt","CK5W7brhlQ","2hEEUFFDui","QChxsBCxeC","Ss0Zu07n1c","uupzk7X3uy","uTacxThjNn","W3VFHMezSW",
+"hE1QloGu6x","blLA9DcpWB","hSSvQ5ZaEz","okgRiyEfy9","CxVEfQYxC0","SjskQgIYvE","pv0i7jtn0X","jiVBPF6PT2","Q6hMCK20wK","yToGWnnP8o",
+"8hJdtguMb8","zQt6Q24ARF","Yf2EcCNHmv","aDGtSMojnP","07n1cMkgy8","2ZHdkECMvU","nFqikWaim6","soy9taFFss","JKWYRi3pyd","wiHrZfcJOy",
+"kB5nPGSQwj","fcJOyxXTI4","5drc6AmdQd","ZuDtDKZamH","QbxXcAmdQd","lkMUALbRTH","Q6Lix24ARF","Chuy3uvf7A","uTacx0h1b1","Ul4a1SjskQ",
+"4QMc9FNYIM","JJs5mBbwgA","RACuj8U2nU","cQOnvyToGW","t59lRThjNn","iqv4kKsjRK","KASQ8lsQGo","CIShGDQimp","tl72WGWqqX","No0Qbo8Uyd",
+"618DijzUqR","4dEz607n1c","2hEEUDG4sT","Oz8yZguMb8","7lUXZZJTXH","BGaQYtaOXK","euZA5SjskQ","Pb1pa5nmWv","POUYSlH1kt","5nmWviwzGk",
+"HRxd8NAFuw","1LB1Lb29RJ","kZANm0PktI","NOHsztvdkD","ZJTXHyToGW","Yf2Ec8TxD7","5NammJIqXi","b29RJCp3mZ","IjTwPzz4ZU","UlU3MyToGW",
+"ReKEWzbIYY","kB5nP5VZjS","ZhwG1jS1aj","t98iWpWiOs","UlU3M8cVD3","a00b5Dz1R3","QWxoTFFDui","8U2nUHRxd8","NAFuweuZA5","Waim67X3uy",
+"6q6L9Mkgy8","JKWYRSmGzv","uvf7Ai3pyd","CIShGxXTI4","8U2nUP6bcg","5Drn0lm0pD","b29RJydG8U","ZUnqtTCgPp","Mm8sivOqCE","Yw2oUVprf2",
+"FxX9qd85a9","RzaZAydG8U","8xEKzQ6hMC","FnPFBWaim6","JRJQB0Wr5y","JKWYR2Nslm","1j5L8CNHmv","azIWpNo0Qb","Q6hMC5VZjS","IBe8kOz8yZ",
+"FPfSEn8pJ9","29QAz5Drn0","VBjhzaDGtS","4W0TliB08l","jfREuB3qem","VNCPdYh1hF","0PktIlweGy","XflUqMGlTF","kB5nPGv3Fq","l83UdoGu6x",
+"AgJHQoVQp6","rz7UtjfREu","l83UdFjHXR","5VZjS4W0Tl","XflUquvf7A","QChxs1j5L8","oGu6xjSjS3","qQxHPRzaZA","zQt6QuoStw","Oz8yZRkQke",
+"vLsmSxciqp","HRxd80Kyfs","MK07Y2ZHdk","HfyNQVprf2","Waim69y4lw","piJSkCNHmv","ECMvUaDGtS","cQOnvnnP8o","JIqXiS2Dfu","JkzUnv2eC3",
+"8TxD7StlDJ","guMb8SjskQ","dQ5861j5L8","5IhmGDz1R3","POUYSCfgr3","dmoS7ix74r","zHF1qpvgjS","9iGoTX6Pin","hSSvQbrhlQ","Yw2oUW3VFH",
+"EdBKcECMvU","lkMUAx3LDe","Fhtgll83Ud","14FLR64s8N","qQxHP9y4lw","uQIczhYBCK","fmIK1DG4sT","HRxd8MojnP","CqqaDokgRi","WPmlx5Mg9r",
+"s93MlwiHrZ","LDk6fyvOMI","QClRL8hJdt","Yf2Ec5VZjS","piJSkNo0Qb","YOfrYo8Uyd","bZLvSZuDtD","Ta8f6VLTy6","0ao3lbgJAz","45cIHVjCZq",
+"fqypyRkQke","0h1b16AFT0","soy9toGu6x","hSSvQnFqik","hE1QlQ6hMC","AOgEeuZPqg","sqVrfZUnqt","gdQsSuTacx","7ku1pAXpwE","n8pJ9y94nw",
+"5ZaEzyofH3","SjskQNo0Qb","StlDJ64s8N","0ao3lFFDui","JRJQBd85a9","HzZT8ni2v1","Ss0ZuwDajX","guMb8a00b5","GXdoHEOE1o","4dEz6tjQxs",
+"BCxeCFwEJz","Pb1pao8Uyd","e6e4zd7vjM","GSQwj2Yz7E","QbxXcPb1pa","DLhzM8TxD7","prNT6EoToP","DQimpAXpwE","VIlwPoGu6x","WaWsv9iGoT",
+"BbwgADG4sT","TCgPps93Ml","uoStwXyPZN","MGlTF0PktI","zqH0WS2Dfu","BCxeClCMxy","ni2v1qQxHP","K4GS8vkCHH","Gv3Fqhe9IA","dhSuHfmIK1",
+"pvgjSjeskS","7lUXZFVMxo","Pb1pa7fKYU","tuDySdjsrv","zbIYY64s8N","ru4UG7hyVv","OUYuF5Namm","P6bcgGWqqX","Mkgy8QChxs","wDajXtlILt",
+"uAWypQworu","mX2GEM3zXL","C2IrcogLgc","K20wKAIYUu","rz7UtKr8ys","qUJMdpvgjS","yofH3k85Ae","zmLYDn8pJ9","JXljWM3zXL","AgJHQpT8wu",
+"6AFT0D6rBy","SbRYyBGaQY","0MR5XfaHir","pFrrlIRh48","s4786StlDJ","WmadA7lUXZ","uQIczQYxC0","WreyPRsQUq","e6e4zGv3Fq","pvgjSulk41",
+"vLsmSYf2Ec","faHiruJScX","X6PingIYvE","gtCA5FPfSE","soy9tuZPqg","lCMxypAhR1","pmeCd7X3uy","5IhmGy94nw","fLNg8MaJQs","fLNg8rhl0J",
+"QssNCn1pmO","zmLYD9XyT9","ReKEWJkzUn","L7cGcThjNn","Q6LixydG8U","e6e4zhUTw7","lj07QRkQke","euZA5tlILt","2Yz7E0YAGH","9GXkXn8pJ9",
+"ix74rP6bcg","iB08lDQimp","rz7UtnlaBy","Qworut59lR","yvOMIJRJQB","jiVBPatef2","aL6AJksJby","yluBx2hEEU","Kr8ysJ2mQi","UlU3MMmKGJ",
+"KASQ8y94nw","d85a91j5L8","WDVWJpmeCd","0Wr5yF6PT2","S77LHFnPFB","BbwgA2hEEU","uoStwtuDyS","BbwgAdmoS7","Ta8f6BpYhV","ni2v1No0Qb",
+"hi5X7Yf2Ec","fmIK1FGzgp","LewvM580YD","lkMUA580YD","jS1ajZ4I1v","vkCHHuZPqg","VLTy6zY1GY","GrDg7L7cGc","yvOMIhSSvQ","FxX9qKsjRK",
+"Waim65nmWv","IKxdLdmoS7","Q6Lix14FLR","Ul4a1Twano","cL0aEFhtgl","FGzgpOHaBz","S2DfupFrrl","oQ87rFVMxo","16lHcsuY4x","mz8gxGSQwj",
+"FwEJzkB5nP","EOE1orKDLJ","jSjS3nFqik","sqVrfMojnP","0ao3lDG4sT","fcwDaW3VFH","KASQ8FjHXR","zHF1qnFqik","ciuWzGWqqX","8TxD7C2Irc",
+"i3pydfLNg8","FhtglKZamH","8cVD30Wr5y","djsrviqv4k","vLsmS8hJdt","8cVD3tjQxs","GSQwjjiVBP","B3qemZuDtD","soy9tJXljW","pT8wuCIShG",
+"hE1QlU3yw5","pvgjSI7p2a","AmdQdZUnqt","jSjS3nnP8o","9eoRcprNT6","m4bxU5IhmG","ZhwG1S77LH","EoToPFGzgp","FPfSEOxWIH","zY1GYvLsmS",
+"x3LDeNhXdu","xReecMm8si","qQxHPuPX7G","GrDg7ZuDtD","AOgEeBbwgA","Rxrsm16lHc","y94nwGSQwj","LDk6frz7Ut","brhlQKASQ8","gf8rIAOgEe",
+"lkMUAsx5Gl","F6PT2TXQ0Z","iwzGk0PktI","8RCUAFVMxo","MaJQsMkgy8","2DREsuTacx","JJs5mjzUqR","9XyT9KsjRK","QworuqaofN","vOqCES77LH",
+"KsjRK9GXkX","AkKTkMmsIo","4W0TlQWxoT","48cHLtAOsr","1j5L8Kr8ys","prNT6IjTwP","TCgPplsQGo","7X3uyEOE1o","ECMvUSmGzv","07n1c1j5L8",
+"4dEz6TCgPp","Yw2oU8hJdt","TCgPplm0pD","kZANmsqVrf","lj07Q9GXkX","NOHszh1zcH","F6PT2BbwgA","Cp3mZ14FLR","1v5hHM3zXL","v2eC3nlaBy",
+"4QMc9AIYUu","dmoS7gf8rI","Pb1pa2Yz7E","8U2nUqQxHP","uupzktjQxs","HlUbF0YAGH","Q6Lix2Nslm","C2IrcEoToP","CIShG24ARF","oGu6xRACuj",
+"nlaByfaHir","aL6AJPOUYS","jS1ajtaOXK","oGu6xyvOMI","FxX9qCIShG","tlILt618Di","5nmWvpT8wu","dQ586M3zXL","IjTwP4QMc9","zbIYYuoStw",
+"Cfgr3UmaEv","HlUbF2Nslm","Q6Lixhe9IA","bZLvSoGu6x","SbRYydpe1v","StlDJMojnP","OUYuFuAWyp","QnJ1S16lHc","Dz1R3MmKGJ","8xEKzZhwG1",
+"VerEAo8Uyd","9GXkXBbwgA","QssNCLDk6f","FGzgphUTw7","fcJOy64s8N","Oz8yZWaWsv","pT8wuRxrsm","lsQGozmLYD","mz8gxKASQ8","fqypy580YD",
+"8FmFHJRJQB","AXpwEEoToP","dQ586FLsph","8U2nUAXpwE","MGlTFFhtgl","iB08lprNT6","YOfrYI7p2a","MK07YwDajX","dpe1vAmdQd","sqVrf7ku1p",
+"a00b55nmWv","Chuy3JRJQB","lkMUAIKxdL","Kr8ysSmGzv","pv0i7lj07Q","zY1GYnnP8o","3weIFDG4sT","vLsmSk85Ae","uoStwFjHXR","24ARFgf8rI",
+"3otm6Yw2oU","prNT6WPmlx","aFFssPYBf4","jtn0XMmsIo","ECMvUtuDyS","Chuy3VLTy6","G1RhS0PktI","ru4UGzbIYY","oVQp6CdyBV","JIqXipFrrl",
+"uAWypRzaZA","ru4UGQWxoT","s7MxkYf2Ec","Oz8yZQssNC","faHirIBe8k","DLhzM0PktI","hE1Ql4dEz6","TwanoPOUYS","9rlg9DG4sT","uvf7AuJScX",
+"FcWrWhYBCK","MaJQsbgJAz","8FmFHJkzUn","tvdkDiwzGk","0BmCyh1zcH","iqv4kNhXdu","lXFOBWaWsv","zFgtBzFgtB","Q6LixgtCA5","Nxx9VjSjS3",
+"ZuDtD14FLR","ZUnqtjS1aj","KZamH5Mg9r","djsrv0YAGH","0PktIpmeCd","0Wr5yuupzk","lkMUATXQ0Z","tl72Wru4UG","piJSkqUJMd","lj07Qzz4ZU",
+"Cp3mZhi5X7","3weIFRkQke","RsQUq5Namm","brhlQMezSW","uupzkd85a9","AOgEe5ZaEz","VjCZqCIShG","tuDySNOHsz","uQIczZuDtD","n1pmOS77LH",
+"uvf7A0Wr5y","6AFT07hyVv","Zv7z0o8Uyd","2DREsoVQp6","uQIczMK07Y","NcICAn1pmO","GrDg7i3pyd","ni2v1jS1aj","8U2nUZzJHW","Chuy30BmCy",
+"cL0aEuAWyp","5Drn0TCgPp","ydG8U8hJdt","WreyPTwano","he9IADQimp","gjUTuMezSW","LewvM0MR5X","7hyVvydG8U","t59lRulk41","No0QbQbxXc",
+"CK5W7l83Ud","QChxs7X3uy","gf8rIUvlv4","QnJ1SWreyP","SjskQyToGW","pmeCdn8pJ9","ZzJHWFPfSE","14FLRsqVrf","0PktI64s8N","HP433BFkb8",
+"RBhp0aL6AJ","AmdQdv1Hln","55rfBxReec","gtCA5v1Hln","0ao3lI7p2a","pAhR1x3LDe","6AFT0lCMxy","RzaZASjskQ","oGu6xprNT6","WDVWJAIYUu",
+"OUqFMS2Dfu","gIYvEzz4ZU","a00b5EoToP","uLtKsmX2GE","gf8rI9GXkX","BCxeC2hEEU","ZUnqt0ao3l","yluBxs93Ml","KsjRK7fsYM","MK07Y7X3uy",
+"RBhp007n1c","JXljWWmadA","oVQp6D6rBy","LDk6fP6bcg","kB5nPGXdoH","O3iyQsoy9t","FjHXRksJby","s93MlVjCZq","L7cGcprNT6","4QMc9zHF1q",
+"hYBCKaL6AJ","faHirIRh48","U3yw5jfREu","UlU3MK4GS8","LewvMt98iW","W7cTsYh1hF","4QMc95VZjS","RpBQmm4bxU","hSSvQpT8wu","n8pJ9wiHrZ",
+"nFqikiKqhr","Cfgr3v8yFN","FxX9ql83Ud","W7cTsCfgr3","MGlTFcShY2","55rfBfcJOy","QChxsblLA9","MezSWcQOnv","GrDg7FwEJz","mz8gxZuDtD",
+"5drc6xReec","kZANmtuDyS","MojnPAkKTk","kB5nPv8yFN","HzZT848cHL","fqypyFPfSE","ZhwG1tlILt","Pb1paZv7z0","ZJTXHtuDyS","gtCA5Ta8f6",
+"In3NSfmIK1","h1zcHVIlwP","JRJQBm4bxU","h1zcH8RCUA","GSQwjUvlv4","uPX7GCNHmv","45cIHulk41","bgJAzv2eC3","zHF1qS2Dfu","QworuMaJQs",
+"S77LH07n1c","dQ586uLtKs","NhXduWDVWJ","9iGoTo8Uyd","Oz8yZWaim6","uAWypaL6AJ","Vprf2piJSk","pWiOs5VZjS","dQ586JRJQB","FFDuiaez9y",
+"AIYUu580YD","Vprf2fqypy","ru4UGVIlwP","BCxeCn1pmO","b29RJ0ao3l","hE1Ql29QAz","S2DfuNo0Qb","uZPqgru4UG","StlDJzbIYY","P6bcgJIqXi",
+"rhl0J618Di","WPmlxe6e4z","lm0pDjS1aj","hUTw7hSSvQ","QworugIYvE","v2eC3tuDyS","8hJdtQworu","EoToPFxX9q","7X3uyCxVEf","n8pJ9Y1mC0",
+"NhXdudpe1v","zbIYYZv7z0","uvf7A5IhmG","8hJdtaL6AJ","n8pJ9prNT6","K4GS8ix74r","hSSvQ55rfB","OUqFMRACuj","TXQ0ZfmIK1","YOfrYYh1hF",
+"hE1QluPX7G","CdyBVuAWyp","pv0i7pv0i7","29QAzd85a9","VNCPdDQimp","l83Ud0MR5X","9GXkXKr8ys","o8UydzQt6Q","MmKGJHfyNQ","oQ87rAXpwE",
+"0PktIzz4ZU","AkKTkgf8rI","5iGN5vkCHH","0Wr5yWreyP","nFqikUvlv4","ulk41lweGy","In3NSBCxeC","YjB9tOHaBz","pT8wupAhR1","fcwDajzUqR",
+"FhtglMGlTF","B3qemjS1aj","zmLYD5iGN5","GXdoHpvgjS","LewvM5Namm","iwzGkQWxoT","VerEAs93Ml","hSSvQaL6AJ","vOqCEpvgjS","7X3uyYOfrY",
+"nnP8ofaHir","Yh1hFhe9IA","fcJOyjtn0X","iB08l2Yz7E","cShY2Chuy3","5VZjStAOsr","lViBvulk41","xReecRBhp0","wDajXJ2mQi","sx5Glix74r",
+"OHaBz8xEKz","IRh48Twano","nnP8o8xEKz","OUYuFoVQp6","4QMc9fcwDa","i7WMQZhwG1","Y1mC0NAFuw","SWfouFFDui","pv0i7uN6r3","b29RJBFkb8",
+"lsQGobgJAz","5drc6ZUnqt","KASQ8FGzgp","FjHXRlH1kt","hSSvQQbxXc","uQIczlXFOB","MmsIoOUqFM","tlILtgIYvE","b29RJpv0i7","dQ5863weIF",
+"5iGN53otm6","EdBKcNcICA","iB08luJScX","9GXkX1LB1L","7fsYMrz7Ut","pvgjSrz7Ut","0h1b1RmDcr","Ss0ZufLNg8","W7cTslj07Q","sx5GlM6qcG",
+"CxVEfTwano","Q6LixvkCHH","BCxeCs7Mxk","WDVWJiwzGk","h1zcHNhXdu","nFqikblLA9","s93MlhYBCK","n8pJ9dQ586","XyPZNJIqXi","07n1c0Kyfs",
+"aez9yJRJQB","v8yFN48cHL","i3pydyofH3","TXQ0ZyToGW","vOqCEVLTy6","FVMxopFrrl","guMb8lm0pD","MojnP8cVD3","WDVWJaFFss","ksJbyuTacx",
+"aez9yaez9y","VLTy6C2Irc","FnPFBMkgy8","9rlg9SbRYy","5Mg9rnnP8o","U3yw5VjCZq","euZA5yofH3","pvgjSs4786","7fKYUxReec","618DiQClRL",
+"9eoRc64s8N","qUJMdpWiOs","Dz1R3cmXIX","StlDJWMiS3","JIqXi5Drn0","0MR5XogLgc","lCMxyAXpwE","zmLYDuZPqg","uZPqgCdyBV","okgRiGrDg7",
+"iB08lZv7z0","cShY2i7WMQ","29QAz1v5hH","ogLgcuLtKs","M3zXLlkMUA","AgJHQqUJMd","SbRYy8cVD3","FLsphAmdQd","lsQGoxXTI4","VNCPdVerEA",
+"zQt6Qdpe1v","4W0TljzUqR","DQimpzqH0W","HP433qUJMd","lweGyQWxoT","LDk6f0Kyfs","07n1cTCgPp","5NammpWiOs","9GXkXCxVEf","s7MxklkMUA",
+"9iGoT5drc6","atef2guMb8","faHir4W0Tl","Cfgr3i3pyd","xciqpiqv4k","e6e4zI7p2a","ECMvUDQimp","580YDWmadA","jS1aj2TRI7","J2mQiatef2",
+"he9IAMmKGJ","CxVEfVprf2","POUYSokgRi","d7vjMlj07Q","xciqpgdQsS","s4786cQOnv","U3yw5bgJAz","pv0i7vOqCE","B3qembrhlQ","JXljWix74r",
+"ni2v1zmLYD","ZhwG1ZzJHW","MGlTFxciqp","8U2nUZUnqt","QWxoTzz4ZU","dQ586nlaBy","B3qemEOE1o","LewvMAkKTk","Uvlv4SjskQ","WaWsvx3LDe",
+"9GXkXZuDtD","6AFT00MR5X","jS1ajK20wK","7fKYUcmXIX","lj07QWreyP","PYBf4yEfy9","SmGzvFPfSE","oVQp6PYBf4","ReKEWK4GS8","8xEKzyvOMI",
+"ZzJHWDQimp","OHaBz2ZHdk","C2IrcNhXdu","YOfrYt59lR","MaJQsrKDLJ","QnJ1SWDVWJ","KASQ8ECMvU","6q6L9lXFOB","jiVBPyofH3","B3qemC2Irc",
+"StlDJIBe8k","qaofNNo0Qb","h1zcHQChxs","gdQsSKASQ8","QworuZhwG1","FjHXRB3qem","AgJHQhSSvQ","QChxspmeCd","M6qcGAkKTk","fLNg8AkKTk",
+"okgRiMaJQs","ZJTXHuQIcz","DQimpUmaEv","8FmFHaDGtS","QnJ1SRsQUq","1j5L8zbIYY","QChxsSjskQ","QClRL0MR5X","Mkgy8tuDyS","UmaEvgf8rI",
+"ogLgcv2eC3","0ao3li7WMQ","0BmCyfcwDa","hYBCKt98iW","rz7UtJXljW","O3iyQIBe8k","1v5hHlweGy","XyPZNaez9y","ReKEWm4bxU","Fhtgls7Mxk",
+"6AFT0nnP8o","In3NSatef2","v8yFNWmadA","DLhzMZv7z0","RACujRmDcr","faHirfqypy","k85AejSjS3","Mm8si2Nslm","7hyVvZ4I1v","gtCA5ksJby",
+"P6bcgnnP8o","8U2nU8xEKz","2TRI7UlU3M","F6PT29y4lw","mX2GEv8yFN","ulk41pT8wu","bZLvSsoy9t","ZUnqtYf2Ec","zbIYY8xEKz","tAOsrZhwG1",
+"gtCA5taOXK","piJSkulk41","Waim6zz4ZU","OUYuF8hJdt","dhSuHXflUq","lCMxyfaHir","WreyPd7vjM","6AFT0GSQwj","3weIFulk41","fcwDaJ2mQi",
+"2ZHdkt98iW","1LB1L7hyVv","3weIFt98iW","brhlQdjsrv","MezSWGXdoH","lpF6WuQIcz","pvgjS5nmWv","DG4sTZUnqt","ksJbyIRh48","UmaEvjSjS3",
+"BCxeCrz7Ut","GWqqX55rfB","HP433W7cTs","MaJQsxXTI4","Cp3mZ9iGoT","CIShG64s8N","d7vjMRxrsm","KsjRKWPmlx","W7cTsYw2oU","ydG8UdmoS7",
+"L7cGcDLhzM","8U2nUThjNn","wDajXzz4ZU","ulk415iGN5","5iGN5UmaEv","8TxD7JkzUn","7X3uybZLvS","Mm8sit59lR","FcWrWOHaBz","ZUnqth1zcH",
+"WMiS3GWqqX","jSjS3hi5X7","MojnPjiVBP","8xEKzuN6r3","K4GS8tlILt","pAhR1uN6r3","RxrsmGrDg7","WmadAyofH3","ZzJHW5iGN5","v1HlnzQt6Q",
+"9XyT9dQ586","k85Ae07n1c","RkQkezFgtB","jfREu0BmCy","v1HlntlILt","7X3uyMaJQs","QworuRzaZA","MK07YaDGtS","9eoRcWDVWJ","gIYvEMK07Y",
+"5IhmGNhXdu","ZzJHWBGaQY","ReKEWAOgEe","55rfBQ6Lix","M6qcGix74r","aez9y5ZaEz","07n1csuY4x","5ZaEzaDGtS","2ZHdkjzUqR","0PktIIKxdL",
+"d7vjMWmadA","fcwDa5Drn0","k85AeXflUq","GSQwjFVMxo","Yw2oUNOHsz","IjTwPRxrsm","tjQxs7hyVv","GrDg7lkMUA","FPfSE2Nslm","uQIczGSQwj",
+"x3LDerhl0J","O3iyQ0Wr5y","QssNCyluBx","rhl0JyToGW","7fsYMW7cTs","CK5W7blLA9","StlDJiB08l","azIWp14FLR","jSjS35ZaEz","brhlQt59lR",
+"RmDcrMaJQs","QYxC0oVQp6","6q6L9StlDJ","2hEEUXyPZN","HfyNQlpF6W","WmadAfqypy","5nmWv8U2nU","OHaBzksJby","VIlwPK20wK","uLtKsaDGtS",
+"blLA9b29RJ","Cfgr3Yh1hF","FLsph2TRI7","tl72Wsx5Gl","jS1ajbZLvS","RpBQmzbIYY","oVQp6cQOnv","G1RhSfcJOy","P6bcgWaWsv","DLhzMZzJHW",
+"zFgtBlpF6W","xReecazIWp","1v5hHCK5W7","mz8gxFnPFB","Oz8yZfFDrJ","9XyT9Cfgr3","FxX9qUmaEv","IjTwPL7cGc","Zv7z00MR5X","JJs5mzFgtB",
+"580YDFxX9q","azIWpaFFss","Nxx9VQ6hMC","FcWrWo8Uyd","FwEJzuTacx","v2eC3d7vjM","PYBf4WmadA","k85AetlILt","RsQUq2DREs","aDGtSTCgPp",
+"jiVBPpv0i7","8U2nUwiHrZ","qaofNDLhzM","mz8gxtlILt","he9IAcShY2","MmsIoEdBKc","gdQsSRmDcr","mX2GE9y4lw","MK07YFVMxo","zqH0WRzaZA",
+"lj07QP6bcg","uZPqgQ6hMC","WreyPokgRi","S2DfutAOsr","7X3uyNhXdu","GrDg7KZamH","W3VFHcmXIX","QClRLnlaBy","HlUbFS77LH","lViBvIBe8k",
+"S77LHBCxeC","RmDcrChuy3","hi5X7XyPZN","RpBQm0PktI","Yh1hFRkQke","D6rBygf8rI","lCMxy7fKYU","uJScXi7WMQ","k85AebgJAz","sqVrfuLtKs",
+"qQxHPHP433","KASQ8pvgjS","ni2v1pmeCd","Q6hMCEOE1o","gjUTuP6bcg","Yw2oUS77LH","ZzJHWhUTw7","O3iyQOHaBz","AgJHQKASQ8","lViBvWaWsv",
+"StlDJlj07Q","8TxD70Kyfs","DG4sTuLtKs","L7cGcAkKTk","C2Irce6e4z","BGaQYM3zXL","MmKGJtAOsr","lj07QBGaQY","hYBCKuAWyp","GXdoHK20wK",
+"QssNClViBv","YOfrY0BmCy","qaofNECMvU","5IhmGdpe1v","LewvMQbxXc","Ss0ZuXyPZN","HzZT8BbwgA","Mkgy8StlDJ","jzUqRHlUbF","ReKEWCdyBV",
+"9iGoTlViBv","2hEEUCK5W7","Mm8siCNHmv","JkzUntuDyS","fcJOyRBhp0","Vprf2kB5nP","euZA5QWxoT","ydG8UYf2Ec","0h1b1RACuj","uZPqgjiVBP",
+"uTacxlkMUA","KZamHPYBf4","FLsphVBjhz","Mkgy8azIWp","LewvM6AFT0","SmGzvcShY2","5Drn0suY4x","JRJQBpiJSk","oQ87r2hEEU","QbxXcL7cGc",
+"CNHmvTa8f6","OHaBzuJScX","SjskQpAhR1","IKxdLS2Dfu","M6qcGGrDg7","14FLR7lUXZ","d85a9yToGW","CK5W7Kr8ys","i3pydtvdkD","iKqhrQClRL",
+"8RCUAF6PT2","tjQxsS2Dfu","cmXIXZJTXH","No0QbGrDg7","mz8gxJ2mQi","Ss0Zudjsrv","zFgtBSmGzv","JIqXiOxWIH","TCgPpCxVEf","Mkgy8JIqXi",
+"aFFss6q6L9","cShY2zqH0W","jzUqRB3qem","qUJMdiwzGk","sx5GlgIYvE","Cfgr3pT8wu","7ku1pfmIK1","pAhR1ZUnqt","lkMUAogLgc","HP433RzaZA",
+"kB5nPTCgPp","djsrvNxx9V","8hJdtBFkb8","pT8wuRsQUq","QworuHzZT8","MK07Yt59lR","x3LDeUl4a1","1LB1L2TRI7","CdyBVt59lR","CNHmv4W0Tl",
+"G1RhShYBCK","5ZaEzWreyP","Gv3Fqt98iW","WreyPjiVBP","prNT6Zv7z0","euZA5CxVEf","Kr8ysQ6hMC","LewvMzz4ZU","W3VFHzz4ZU","Vprf2uupzk",
+"RACuj5Mg9r","okgRi0ao3l","rhl0Jmz8gx","prNT6HP433","FcWrWuvf7A","CqqaDlXFOB","v1HlnbrhlQ","NOHszfqypy","oVQp6SjskQ","W7cTskB5nP",
+"lweGys93Ml","Ta8f6IBe8k","bgJAzaez9y","OUqFMK20wK","FNYIMChuy3","MmsIoMezSW","atef2P6bcg","yToGWECMvU","0Wr5y0MR5X","Z4I1vzqH0W",
+"JKWYRF6PT2","cQOnvfmIK1","LDk6fzY1GY","FcWrWDG4sT","h1zcHfaHir","yluBxfcwDa","EoToPMmsIo","9iGoTUlU3M","kB5nPgjUTu","48cHLiwzGk",
+"UlU3MBpYhV","CK5W7JKWYR","4dEz60YAGH","9eoRc0PktI","KASQ8qaofN","faHirFcWrW","618DihYBCK","7fsYMQ6hMC","ZuDtDY1mC0","sqVrfpiJSk",
+"MojnPFnPFB","S2DfuvOqCE","ru4UGt98iW","guMb8fFDrJ","AkKTkUlU3M","P6bcgChuy3","0BmCyFPfSE","lweGyMGlTF","618DiYh1hF","VLTy6gIYvE",
+"Yh1hFZ4I1v","NhXdulweGy","rz7UtCdyBV","lm0pDqaofN","pT8wuhi5X7","RACujUmaEv","dhSuHB3qem","TwanoUmaEv","zz4ZUM3zXL","WmadAHfyNQ",
+"Cp3mZbrhlQ","Chuy3RBhp0","tjQxs29QAz","No0QbNOHsz","7fKYUqaofN","RpBQmBbwgA","sqVrfaFFss","LDk6fWaim6","Pb1pa7fsYM","lsQGooQ87r",
+"nFqikZ4I1v","B3qemEdBKc","NOHsz3otm6","a00b58FmFH","rhl0JlCMxy","GrDg7P6bcg","29QAzzQt6Q","QssNCwDajX","jS1ajlH1kt","v8yFNvkCHH",
+"v2eC3W7cTs","D6rByO3iyQ","G1RhSCqqaD","euZA59eoRc","pFrrlPYBf4","IRh48jfREu","uQIczVjCZq","aDGtSnFqik","JXljWeuZA5","nlaBycL0aE",
+"xXTI4GWqqX","Q6LixWreyP","2Yz7El83Ud","okgRizbIYY","sqVrfvLsmS","MmsIolpF6W","QworueuZA5","3weIFcQOnv","d7vjMs93Ml","Twanol83Ud",
+"14FLRKASQ8","DQimpuoStw","0YAGHO3iyQ","QClRLO3iyQ","s7MxkoQ87r","HzZT8WPmlx","9eoRcCp3mZ","ciuWzKZamH","OxWIHGrDg7","Oz8yZ618Di",
+"IKxdLY1mC0","K4GS8MGlTF","fFDrJZ4I1v","l83UdOUqFM","HP433yEfy9","Qworu5iGN5","cQOnvnlaBy","Waim6uQIcz","29QAzDLhzM","FwEJzi7WMQ",
+"Nxx9VyofH3","cShY29iGoT","2NslmFNYIM","TCgPpnFqik","soy9t24ARF","07n1cG1RhS","U3yw5xciqp","yluBxlpF6W","Oz8yZJ2mQi","GrDg7W7cTs",
+"iqv4kVjCZq","7ku1pfLNg8","o8UydBpYhV","1j5L8atef2","TXQ0ZRzaZA","M6qcGdmoS7","8TxD7yofH3","pFrrlwiHrZ","CNHmvqUJMd","1LB1L2ZHdk",
+"RBhp0lsQGo","Mkgy8lj07Q","1v5hHoVQp6","FhtglUvlv4","SWfouqUJMd","07n1clsQGo","ogLgcuupzk","6q6L98FmFH","U3yw5RkQke","v8yFNFPfSE",
+"0h1b164s8N","6AFT0S2Dfu","UmaEv7lUXZ","x3LDeZzJHW","9XyT9QYxC0","VjCZqlsQGo","JIqXiOUqFM","lj07QHzZT8","AmdQdsx5Gl","J2mQilkMUA",
+"XflUqFPfSE","jtn0XxXTI4","VjCZqciuWz","dQ5865Mg9r","l83Udi7WMQ","wiHrZdmoS7","W3VFHb29RJ","tuDySFGzgp","07n1cyEfy9","D6rBy0h1b1",
+"prNT6bZLvS","9GXkXjSjS3","atef2Twano","7hyVvThjNn","JRJQBMaJQs","ru4UG8U2nU","vLsmSuQIcz","gdQsSAmdQd","MmKGJQbxXc","uoStwxReec",
+"MGlTFdmoS7","v8yFNuupzk","Vprf2Kr8ys","8TxD7jS1aj","gdQsSQworu","2TRI7Qworu","Mkgy8OxWIH","XyPZNHlUbF","0BmCyGv3Fq","QssNCBFkb8",
+"J2mQiNAFuw","AOgEeRkQke","JXljWsx5Gl","m4bxUIRh48","MmKGJdhSuH","x3LDeMmsIo","C2IrcFPfSE","NcICA2TRI7","lsQGo5nmWv","WPmlxzQt6Q",
+"jSjS3BFkb8","zqH0W2DREs","RkQkeYjB9t","M6qcG2Nslm","8RCUAaL6AJ","s4786K20wK","FjHXRdhSuH","24ARFgjUTu","Nxx9VNcICA","M6qcG07n1c",
+"MaJQsPYBf4","ZzJHWdhSuH","W3VFHDcpWB","taOXKtlILt","GWqqXF6PT2","TXQ0Zzz4ZU","Ta8f6LewvM","s7MxkLewvM","SWfous93Ml","dhSuHDcpWB",
+"rz7UtM6qcG","I7p2aqQxHP","uJScXoQ87r","e6e4zB3qem","taOXKuZPqg","ogLgcMaJQs","djsrvIRh48","Yw2oUn8pJ9","48cHL8RCUA","Vprf2tjQxs",
+"No0QbYjB9t","taOXKx3LDe","dpe1vsuY4x","soy9td85a9","ZuDtDMezSW","LbRTH2Nslm","IKxdLRsQUq","kB5nPOz8yZ","jeskSFPfSE","pAhR1vkCHH",
+"48cHL5nmWv","v1HlnxXTI4","RsQUqcmXIX","5ZaEzJJs5m","14FLRDQimp","0BmCyQnJ1S","ksJbyaez9y","RsQUqv2eC3","M3zXLpiJSk","16lHc0ao3l",
+"JIqXi5IhmG","Nxx9V0BmCy","CdyBVUl4a1","jS1ajJIqXi","LDk6fBFkb8","5IhmGnFqik","HfyNQlweGy","JJs5mt59lR","sqVrf5VZjS","XflUqM6qcG",
+"lH1ktt59lR","45cIHblLA9","jS1ajpWiOs","1j5L8ECMvU","uoStwiwzGk","GSQwjmz8gx","Uvlv4gtCA5","rKDLJCp3mZ","gtCA5jzUqR","G1RhSD6rBy",
+"fcJOySWfou","9eoRcMaJQs","Gv3FqxReec","7lUXZ4dEz6","iB08latef2","uTacxs93Ml","JRJQBpv0i7","rhl0JZ4I1v","2DREs5IhmG","07n1coGu6x",
+"Ss0ZuEdBKc","OxWIHpFrrl","MaJQspWiOs","RkQkeTXQ0Z","pvgjSFjHXR","hYBCKThjNn","uJScXPb1pa","ZJTXHSs0Zu","v2eC3DG4sT","FGzgpjtn0X",
+"MaJQsi7WMQ","0KyfsAmdQd","JkzUn9rlg9","dmoS7FwEJz","jfREucmXIX","h1zcHpFrrl","3otm6NcICA","ZuDtD5drc6","jzUqRatef2","QssNCtl72W",
+"RmDcrbZLvS","QYxC0XyPZN","tl72WHRxd8","AgJHQfaHir","zbIYYMaJQs","ZUnqtVprf2","RmDcrCp3mZ","SjskQv2eC3","RzaZACqqaD","jeskSQWxoT",
+"QworuJXljW","qQxHPSWfou","lm0pDJXljW","tl72W2hEEU","jzUqRhe9IA","taOXKuQIcz","sx5GlNcICA","FjHXRuN6r3","yToGW0MR5X","HzZT8Qworu",
+"uN6r3M6qcG","618DiLbRTH","CNHmvAmdQd","6q6L9VjCZq","7hyVvTwano","iB08llsQGo","8RCUABFkb8","DG4sTRACuj","gf8rIGWqqX","Zv7z06q6L9",
+"U3yw54dEz6","jeskSyofH3","IKxdLBCxeC","xXTI4CNHmv","CdyBVpAhR1","ReKEWOz8yZ","e6e4zuoStw","azIWpgtCA5","dmoS7aDGtS","GSQwjkB5nP",
+"EdBKcCNHmv","24ARFblLA9","45cIHciuWz","lj07Q0ao3l","pv0i7VjCZq","6AFT0cmXIX","oQ87r1LB1L","FwEJzZzJHW","55rfBa00b5","IjTwPP6bcg",
+"CK5W7CK5W7","ZhwG1dQ586","i3pyd16lHc","zY1GYMK07Y","QbxXcOHaBz","WDVWJZv7z0","uN6r3ZzJHW","m4bxUcQOnv","fcJOy9GXkX","VNCPdQ6hMC",
+"PYBf4zFgtB","i3pydb29RJ","FnPFBBCxeC","5IhmGdjsrv","GXdoHsx5Gl","blLA9IKxdL","mz8gxbZLvS","0KyfsQClRL","jS1aj7Ow5C","a00b5MGlTF",
+"Zv7z0lsQGo","9y4lwl83Ud","MezSWMezSW","ReKEWn1pmO","uTacx8U2nU","2Nslm1LB1L","uPX7GC2Irc","OxWIH8U2nU","VBjhztAOsr","fqypyMm8si",
+"aDGtSJKWYR","QworuNhXdu","k85AesuY4x","uQIczyluBx","MezSWgtCA5","bZLvSQworu","CxVEfO3iyQ","GSQwjzz4ZU","aFFssWaWsv","FPfSEF6PT2",
+"JkzUnjiVBP","WDVWJzmLYD","FhtglLbRTH","RmDcrjtn0X","1j5L8No0Qb","8xEKzGv3Fq","IBe8kFhtgl","6AFT0CK5W7","5nmWv0PktI","bZLvStjQxs",
+"48cHLMaJQs","VNCPdSjskQ","M6qcGa00b5","VLTy6OxWIH","guMb8ix74r","KsjRKX6Pin","4dEz6VIlwP","sqVrfxXTI4","S2DfuKZamH","jtn0X5Drn0",
+"48cHLhe9IA","wDajX8FmFH","RzaZAbZLvS","qUJMdh1zcH","QChxsY1mC0","yToGWgjUTu","LbRTHBbwgA","b29RJLewvM","dpe1vhUTw7","RBhp0FwEJz",
+"WPmlxdhSuH","ulk41KASQ8","UmaEvEOE1o","v1HlnqaofN","iKqhr9eoRc","2NslmzY1GY","QworuGv3Fq","Ul4a1v1Hln","EOE1oOxWIH","RmDcrIn3NS",
+"i7WMQ8cVD3","0Wr5yjSjS3","0Wr5y9rlg9","a00b5M3zXL","ru4UGM3zXL","POUYSCdyBV","5Drn0lj07Q","i3pydyvOMI","JKWYR16lHc","9XyT99y4lw",
+"VIlwPMm8si","lm0pDo8Uyd","Q6LixQ6Lix","a00b5iwzGk","Vprf2jzUqR","pWiOsfcwDa","t59lRMK07Y","tl72WuLtKs","9rlg9iB08l","HfyNQciuWz",
+"9XyT9qaofN","gtCA5JXljW","48cHLpWiOs","Q6LixqaofN","RxrsmnnP8o","yofH3Ta8f6","uPX7GSjskQ","ydG8Ui7WMQ","lViBvK4GS8","Waim6tl72W",
+"Twano8U2nU","zmLYDiB08l","0KyfsRzaZA","UlU3MU3yw5","3otm69rlg9","VjCZqzqH0W","IBe8kcmXIX","brhlQoQ87r","Mm8siAXpwE","MmsIo3weIF",
+"kZANmFwEJz","8TxD7QYxC0","PYBf4VerEA","zQt6QOUYuF","ulk41fmIK1","0Wr5yQnJ1S","jeskS580YD","lH1ktQWxoT","0ao3lyEfy9","14FLREoToP",
+"yofH3RACuj","fFDrJxReec","8U2nUZJTXH","i3pydoQ87r","RkQkegIYvE","LewvM7fKYU","IKxdL3otm6","s4786RmDcr","uN6r3Dz1R3","VBjhzdpe1v",
+"gjUTuS77LH","MK07Y48cHL","Waim6tjQxs","aez9yNxx9V","suY4xK20wK","FGzgpUl4a1","2DREss7Mxk","lXFOBKr8ys","0PktIAOgEe","NOHszRzaZA",
+"3weIFWaim6","pv0i7lkMUA","tuDySMm8si","M6qcGwDajX","Cp3mZzqH0W","45cIHQ6Lix","aez9yTa8f6","FFDuizmLYD","piJSkOz8yZ","AgJHQlViBv",
+"ogLgcU3yw5","RmDcrJkzUn","EdBKcQWxoT","oGu6xfcJOy","Z4I1vjiVBP","KZamHhUTw7","8TxD7HRxd8","4QMc9CxVEf","tlILt8hJdt","gf8rIC2Irc",
+"tjQxs6q6L9","gdQsSjS1aj","RBhp0Y1mC0","1LB1LnnP8o","ReKEWn8pJ9","xReecMojnP","MmsIoEoToP","bgJAz2Yz7E","POUYSCK5W7","EdBKcwDajX",
+"yluBxxciqp","HzZT88cVD3","lH1ktlj07Q","ZJTXHd85a9","RBhp00ao3l","d85a93otm6","prNT6zbIYY","6q6L9ni2v1","pFrrlDLhzM","3otm6soy9t",
+"tAOsrzFgtB","5VZjS5ZaEz","jSjS3MK07Y","14FLRTCgPp","1v5hHK20wK","0KyfsAgJHQ","9y4lwpFrrl","Ta8f645cIH","mz8gxhSSvQ","rz7UtSs0Zu",
+"FwEJzLbRTH","HfyNQU3yw5","prNT645cIH","fmIK164s8N","lj07Q3otm6","xciqpDG4sT","AmdQdK4GS8","ogLgcVerEA","ZJTXH2ZHdk","9iGoTHfyNQ",
+"QClRLcShY2","MK07Yzz4ZU","m4bxUC2Irc","CqqaDAXpwE","lm0pD8cVD3","wDajXoQ87r","BGaQYThjNn","JIqXiW7cTs","WMiS31LB1L","n1pmO5VZjS",
+"1LB1LL7cGc","okgRixciqp","FPfSE6AFT0","CK5W7EoToP","pmeCdpvgjS","ciuWzHfyNQ","PYBf4xXTI4","9iGoT7lUXZ","n1pmO8cVD3","2DREsThjNn",
+"RBhp0Uvlv4","MmsIoL7cGc","zFgtBkZANm","FnPFBCp3mZ","2TRI75ZaEz","xciqpgf8rI","HfyNQO3iyQ","xXTI4zmLYD","ZzJHWuPX7G","mz8gxYh1hF",
+"cL0aEjSjS3","QbxXc2TRI7","hi5X7ydG8U","gtCA5yofH3","WaWsvpv0i7","kB5nPMaJQs","zFgtBlkMUA","uJScXFGzgp","AOgEeZ4I1v","16lHcxXTI4",
+"zFgtBFGzgp","zQt6Q45cIH","EdBKcYh1hF","W3VFHQnJ1S","uQIcz9eoRc","fcwDaReKEW","S77LHHlUbF","W7cTsCIShG","7fsYMUmaEv","K4GS8nFqik",
+"B3qemcmXIX","sx5GlNxx9V","LbRTHIBe8k","sx5GlQbxXc","cmXIXGrDg7","jSjS3GXdoH","SmGzvBFkb8","gIYvE9y4lw","pAhR1uoStw","cShY2cShY2",
+"JkzUnHfyNQ","2Nslmjtn0X","Zv7z0ksJby","tjQxsLDk6f","piJSk7hyVv","16lHcFjHXR","Q6LixQChxs","VBjhzRACuj","5IhmGChuy3","5Mg9rNOHsz",
+"QChxsMezSW","nlaBypFrrl","jiVBPnnP8o","gdQsSs7Mxk","sqVrfD6rBy","Yf2Ecd7vjM","5Mg9ruAWyp","bgJAzs93Ml","rKDLJsqVrf","Mkgy8VerEA",
+"DQimpogLgc","lpF6WRxrsm","I7p2a24ARF","YOfrYHzZT8","16lHcaDGtS","i7WMQNo0Qb","F6PT2K4GS8","0BmCyQClRL","hSSvQb29RJ","yEfy92Nslm",
+"CdyBV5IhmG","ogLgcpAhR1","nFqikn8pJ9","m4bxUyofH3","4dEz67fsYM","qQxHPs4786","OxWIHM6qcG","OUYuFW3VFH","29QAzpvgjS","aDGtS2Nslm",
+"pFrrlcQOnv","QWxoTDLhzM","iB08lHlUbF","8FmFHuQIcz","lCMxyLDk6f","Rxrsmi3pyd","TXQ0ZVerEA","hSSvQhYBCK","WDVWJDG4sT","MmKGJQnJ1S",
+"guMb8h1zcH","azIWp9GXkX","cShY2x3LDe","jzUqRlj07Q","aL6AJUl4a1","0h1b1LewvM","M3zXLv1Hln","xXTI4Mkgy8","64s8NoVQp6","MezSWsoy9t",
+"45cIHsqVrf","1LB1LHfyNQ","pAhR1GSQwj","ZhwG1qaofN","uoStwZUnqt","RzaZA64s8N","G1RhSe6e4z","5Drn0gIYvE","0KyfsVjCZq","prNT6LewvM",
+"Yf2Ec0YAGH","0BmCy1j5L8","BbwgAO3iyQ","Yw2oU3weIF","WmadAsoy9t","RkQketl72W","EOE1o4QMc9","MmsIoIRh48","NcICAuPX7G","pvgjS0ao3l",
+"IRh48Kr8ys","JRJQBJIqXi","RxrsmMojnP","RzaZA9GXkX","45cIHjeskS","8FmFH64s8N","qUJMdblLA9","POUYSJXljW","PYBf4fLNg8","tvdkDtvdkD",
+"iqv4kXflUq","tjQxs5VZjS","9iGoT8RCUA","KsjRKpFrrl","lweGyfFDrJ","KASQ8XyPZN","bZLvS2TRI7","BpYhVCIShG","DG4sTLDk6f","C2Irc5Namm",
+"JIqXimX2GE","s93MllCMxy","lsQGojzUqR","xReecAXpwE","n8pJ9lj07Q","tAOsruZPqg","fLNg8ZhwG1","OxWIHxReec","Mm8sis93Ml","ZUnqtjiVBP",
+"iB08laFFss","dQ58614FLR","K20wK07n1c","VIlwPbgJAz","580YD8RCUA","I7p2anFqik","dQ5865iGN5","TXQ0ZzY1GY","taOXKYh1hF","JKWYRx3LDe",
+"QClRL9eoRc","ksJbyB3qem","0ao3ld7vjM","DcpWBjiVBP","jS1ajlj07Q","prNT6DLhzM","AgJHQguMb8","oVQp6fcJOy","D6rBydQ586","oGu6xVNCPd",
+"7fsYMZUnqt","4QMc9W3VFH","Kr8ys1LB1L","580YDuupzk","pT8wuNo0Qb","Y1mC0BbwgA","QWxoT7hyVv","djsrvv8yFN","RBhp045cIH","TwanolCMxy",
+"QYxC0MmsIo","I7p2avkCHH","Q6Lixl83Ud","4dEz655rfB","tlILtXyPZN","POUYSdQ586","IjTwPulk41","CNHmvCxVEf","1j5L8mX2GE","3otm6AIYUu",
+"lm0pDXyPZN","BGaQYyEfy9","0BmCySmGzv","nFqikfcwDa","he9IA2TRI7","jtn0X9GXkX","TwanoqUJMd","DG4sTtl72W","DcpWBS77LH","lViBvzqH0W",
+"vOqCEDLhzM","LDk6fXyPZN","MaJQsOUYuF","x3LDezmLYD","9rlg9uQIcz","YjB9tDLhzM","MojnP9iGoT","lweGyRsQUq","0PktIxReec","StlDJHRxd8",
+"FLsphBpYhV","e6e4z2hEEU","I7p2ayEfy9","lXFOBi7WMQ","UlU3MReKEW","HRxd8ThjNn","guMb8HzZT8","Oz8yZk85Ae","HRxd87ku1p","W7cTsWMiS3",
+"PYBf44dEz6","JKWYRBFkb8","FLsphix74r","ydG8UFhtgl","yofH3jiVBP","KsjRKReKEW","e6e4zogLgc","qUJMdsqVrf","48cHLFnPFB","RkQkefLNg8",
+"lsQGolj07Q","8U2nUiqv4k","OxWIHK4GS8","S2DfuCK5W7","VLTy6HlUbF","JkzUngjUTu","0KyfscShY2","HP433xReec","FNYIMa00b5","VLTy6lsQGo",
+"lj07QQChxs","yToGWCqqaD","iwzGk9eoRc","hYBCKcShY2","WaWsvvOqCE","RxrsmGv3Fq","HfyNQvkCHH","cL0aEB3qem","Dz1R3Q6hMC","gf8rII7p2a",
+"d85a9yluBx","Yf2Eciqv4k","8TxD7lH1kt","MK07YaL6AJ","3otm67hyVv","QnJ1SVprf2","dpe1vWmadA","dpe1vTa8f6","lm0pD5nmWv","LDk6ffcJOy",
+"ZuDtD1v5hH","uZPqguvf7A","ZuDtDzbIYY","JIqXijeskS","WreyPZv7z0","WaWsv16lHc","QssNCRBhp0","8cVD3yofH3","oQ87rnnP8o","VjCZqh1zcH",
+"uPX7GyofH3","CqqaDcmXIX","mX2GEpv0i7","yofH3lViBv","tlILtSjskQ","QbxXcs93Ml","X6Pin5Mg9r","K20wKCp3mZ","Waim6O3iyQ","RsQUqwiHrZ",
+"lViBvD6rBy","QChxshi5X7","MK07YzFgtB","gjUTuwDajX","NhXdu7fsYM","kZANmqaofN","uLtKsAgJHQ","FwEJzIKxdL","qaofN0h1b1","nFqikS2Dfu",
+"S77LHqaofN","sx5Gl8xEKz","fLNg87hyVv","x3LDeEdBKc","HzZT8Kr8ys","KsjRKLDk6f","FwEJzMK07Y","uZPqgjtn0X","9eoRct59lR","xReecK20wK",
+"VIlwPOxWIH","FNYIMuN6r3","NOHszwDajX","aFFssLewvM","7ku1pGv3Fq","M6qcGZuDtD","FLsphOUqFM","8FmFHi3pyd","soy9tWPmlx","fmIK1SmGzv",
+"Q6LixL7cGc","Zv7z0pWiOs","M6qcGGWqqX","hUTw79rlg9","t98iWgjUTu","JIqXi8TxD7","SWfou1LB1L","In3NSYw2oU","gdQsSVNCPd","QWxoTNo0Qb",
+"aFFsssx5Gl","uJScXYjB9t","hYBCKIKxdL","i3pyd4QMc9","ciuWzFjHXR","CNHmvfaHir","Yw2oUdpe1v","KASQ8nlaBy","guMb8dmoS7","AOgEebgJAz",
+"EOE1o1LB1L","07n1cTa8f6","DcpWBcmXIX","CdyBVMojnP","9GXkXXflUq","FnPFByvOMI","faHirQbxXc","07n1c8xEKz","5VZjSMojnP","ciuWz29QAz",
+"GSQwjMGlTF","tl72W7fKYU","1j5L8Ss0Zu","hUTw7K20wK","JRJQBbZLvS","aDGtSK20wK","8xEKzix74r","Fhtgli3pyd","6AFT0F6PT2","yToGWt59lR",
+"a00b5CK5W7","1j5L8AOgEe","VBjhzrhl0J","C2IrcoQ87r","blLA9t98iW","BGaQY6q6L9","2Yz7EaFFss","guMb8RkQke","4QMc98RCUA","StlDJRsQUq",
+"NOHsz07n1c","VerEAogLgc","7fKYUHRxd8","tuDySiwzGk","cQOnvsx5Gl","FGzgpFxX9q","nnP8oAmdQd","oQ87riwzGk","iwzGk9iGoT","hE1Ql618Di",
+"0KyfsfFDrJ","CqqaDpmeCd","lsQGoydG8U","uPX7GzFgtB","e6e4z1LB1L","gjUTud85a9","i3pydwDajX","TXQ0ZHlUbF","LbRTH5ZaEz","Kr8ysuPX7G",
+"5ZaEz48cHL","IjTwPtuDyS","VIlwPW3VFH","t98iWU3yw5","dQ5868U2nU","jtn0XUlU3M","JKWYRIn3NS","uN6r3LbRTH","DcpWBguMb8","k85AePOUYS",
+"5IhmG0Kyfs","3otm6W3VFH","aL6AJIn3NS","9rlg9MGlTF","bgJAzZzJHW","lkMUAGv3Fq","brhlQNOHsz","JkzUnBFkb8","RpBQmVjCZq","CxVEf9rlg9",
+"TXQ0ZJIqXi","oVQp6M6qcG","wDajX5ZaEz","CdyBVM6qcG","s93MlBGaQY","NAFuwn8pJ9","BGaQYEdBKc","Ss0Zu7hyVv","EoToP5iGN5","aez9ycShY2",
+"MojnPoQ87r","i7WMQNcICA","tuDySgf8rI","aez9yNOHsz","uvf7AzmLYD","PYBf4jtn0X","Mm8si8FmFH","cShY2lXFOB","uPX7Gi3pyd","tl72WZhwG1",
+"JJs5mWDVWJ","FxX9qDG4sT","bZLvSjzUqR","lkMUAtvdkD","sx5GlWaim6","AkKTktlILt","b29RJAmdQd","jzUqRtAOsr","RpBQmnlaBy","bgJAzx3LDe",
+"VerEAAXpwE","hYBCKuJScX","jiVBPFLsph","fFDrJHfyNQ","WreyP0YAGH","tl72WStlDJ","jtn0XjeskS","HP433taOXK","s93Mlv8yFN","ru4UGCfgr3",
+"3otm6faHir","WPmlxm4bxU","ZJTXHHRxd8","0Wr5yuLtKs","lCMxyBGaQY","Vprf2d7vjM","pWiOsChuy3","EdBKc2TRI7","9XyT9QnJ1S","i7WMQMojnP",
+"atef2t59lR","aDGtSZzJHW","cShY2iwzGk","m4bxUzbIYY","POUYSpT8wu","M3zXL29QAz","Pb1pa0h1b1","F6PT2nlaBy","jS1ajZzJHW","aL6AJkB5nP",
+"07n1cciuWz","tuDySrKDLJ","DQimpCqqaD","LbRTHdQ586","Cp3mZMm8si","0YAGHKr8ys","VjCZqn1pmO","CqqaDru4UG","Ul4a1AmdQd","7fsYMwiHrZ",
+"y94nwZJTXH","zFgtBMm8si","8U2nUUlU3M","QChxsQYxC0","9eoRcKZamH","ksJbyRkQke","Q6LixoVQp6","VLTy6StlDJ","07n1co8Uyd","oGu6xAIYUu",
+"5IhmG8FmFH","YjB9tcQOnv","580YDPb1pa","9GXkXtaOXK","MojnPzz4ZU","uJScXiB08l","WaWsvhYBCK","GSQwjDQimp","djsrv2DREs","Mkgy8jzUqR",
+"2Yz7EsqVrf","CqqaD9rlg9","OHaBzsqVrf","jfREuJIqXi","uoStwRmDcr","kB5nPTXQ0Z","Vprf20YAGH","7lUXZyluBx","LbRTH0BmCy","14FLRd85a9",
+"FjHXRhe9IA","4W0TlfmIK1","kB5nPG1RhS","X6PinXyPZN","4dEz6NcICA","W7cTsGWqqX","5Mg9r2DREs","MaJQsuLtKs","uQIczS77LH","CdyBVru4UG",
+"pmeCdv2eC3","WPmlxqUJMd","CdyBVhi5X7","AIYUuvOqCE","LDk6fC2Irc","4W0Tln8pJ9","AkKTka00b5","5Mg9rIn3NS","d85a9uLtKs","ZuDtDpmeCd",
+"Twano1j5L8","uAWyp8xEKz","8U2nUaL6AJ","WaWsvHfyNQ","MaJQsL7cGc","Waim6lm0pD","AXpwEwDajX","BGaQYUmaEv","yofH3RBhp0","FnPFBoQ87r",
+"ydG8UFxX9q","W7cTs4W0Tl","IKxdLaez9y","h1zcHqaofN","AIYUukB5nP","HfyNQvLsmS","5drc6MmKGJ","FNYIM0Wr5y","pvgjSXflUq","8TxD7Ul4a1",
+"WmadAjeskS","0KyfsbrhlQ","n1pmOiwzGk","3otm6KASQ8","v1Hln55rfB","sx5Gl55rfB","VNCPdtlILt","Pb1paNhXdu","MK07YfFDrJ","n1pmOBpYhV",
+"0h1b1I7p2a","FPfSEDG4sT","S77LHMGlTF","M3zXLDLhzM","hE1QltjQxs","ulk41zQt6Q","7lUXZNxx9V","Zv7z0TXQ0Z","QChxsAmdQd","pAhR1hYBCK",
+"fLNg8iwzGk","l83Ud9rlg9","jS1aj9y4lw","XflUql83Ud","WDVWJpvgjS","RsQUqrhl0J","2ZHdk9eoRc","G1RhS3otm6","azIWpQChxs","CNHmvhUTw7",
+"RxrsmDG4sT","8FmFHQChxs","i7WMQ24ARF","Uvlv40ao3l","K4GS8aFFss","guMb8qUJMd","uTacxOHaBz","QworuI7p2a","MmKGJyToGW","qQxHP9XyT9",
+"QnJ1SazIWp","LDk6f7X3uy","5VZjS2Nslm","GrDg7a00b5","d85a9J2mQi","ZhwG1L7cGc","uTacxWaim6","vLsmSGSQwj","Y1mC04QMc9","lCMxyQ6hMC",
+"pAhR1pWiOs","FxX9qru4UG","GWqqXVBjhz","MmsIoW7cTs","2NslmHfyNQ","Ta8f6e6e4z","Ul4a1gf8rI","XyPZNZ4I1v","blLA955rfB","NAFuw8FmFH",
+"D6rBypAhR1","vOqCEGWqqX","uoStwTa8f6","HfyNQi7WMQ","5nmWvBFkb8","JJs5msuY4x","QworunlaBy","Cfgr3TCgPp","aL6AJZuDtD","07n1crKDLJ",
+"FwEJzYw2oU","guMb8618Di","GrDg7hSSvQ","fcJOyQnJ1S","S77LHjfREu","FnPFBn1pmO","d7vjMRzaZA","Mkgy8x3LDe","BCxeCWreyP","fmIK1QnJ1S",
+"G1RhSFcWrW","tuDySVLTy6","cQOnvd7vjM","uPX7GuoStw","UmaEvHP433","Vprf2C2Irc","lH1ktCfgr3","lXFOBOUYuF","jeskSlViBv","gtCA5MK07Y",
+"pvgjSi3pyd","uZPqgWMiS3","OUYuF7fKYU","OUYuFEoToP","BpYhVWMiS3","14FLRfcwDa","pAhR1fcJOy","he9IACNHmv","ECMvUjS1aj","IRh48mX2GE",
+"HRxd8qaofN","dpe1vzmLYD","h1zcHTXQ0Z","yEfy9xXTI4","ZUnqtjfREu","7hyVvKASQ8","GSQwj7X3uy","0ao3l8hJdt","JXljWXflUq","U3yw5fqypy",
+"ciuWz8FmFH","lj07QStlDJ","5ZaEz5ZaEz","i7WMQIRh48","9eoRczqH0W","NcICAAIYUu","gIYvExReec","7lUXZ2TRI7","HzZT8RsQUq","HlUbF7X3uy",
+"nnP8oOxWIH","iwzGkhSSvQ","8FmFHjSjS3","o8UydBCxeC","LewvMXflUq","7Ow5CpiJSk","D6rByFNYIM","FwEJzo8Uyd","9rlg91j5L8","xReecoVQp6",
+"sqVrf9eoRc","9eoRc0BmCy","HlUbFJ2mQi","t59lRhUTw7","atef2qQxHP","ix74rECMvU","B3qemjtn0X","bZLvSB3qem","x3LDekZANm","iB08l7hyVv",
+"MmsIoFPfSE","BCxeCyofH3","HlUbFJkzUn","uZPqgo8Uyd","DG4sTxXTI4","NAFuw9GXkX","ogLgcX6Pin","ulk41VjCZq","lXFOBPOUYS","Yh1hFCK5W7",
+"jzUqRG1RhS","mz8gx580YD","FVMxoVIlwP","NOHszDz1R3","XyPZNGv3Fq","QYxC0P6bcg","uZPqg5VZjS","5iGN5pAhR1","QClRLJ2mQi","uQIczZJTXH",
+"BFkb8yluBx","Cp3mZHP433","zFgtBhE1Ql","AgJHQReKEW","Ul4a1Vprf2","16lHclH1kt","tuDySFhtgl","In3NSWaWsv","QworuU3yw5","lj07Qy94nw",
+"4W0TlGXdoH","v2eC30Kyfs","guMb8TCgPp","5drc64dEz6","KZamHpv0i7","WMiS3VjCZq","jfREulViBv","3otm6No0Qb","SWfouksJby","ReKEWBpYhV",
+"9rlg9OHaBz","WPmlxBGaQY","M6qcGlpF6W","29QAzh1zcH","iwzGkdmoS7","v2eC3UlU3M","jfREuZzJHW","NAFuwBbwgA","suY4x55rfB","bZLvSmX2GE",
+"SjskQru4UG","e6e4zRsQUq","GrDg7MaJQs","7fKYUChuy3","Ss0ZuprNT6","WPmlxcmXIX","ciuWzYw2oU","ReKEWfaHir","rz7Ut5ZaEz","a00b5gIYvE",
+"JIqXicmXIX","CNHmvGSQwj","0h1b1JkzUn","IKxdLru4UG","sqVrfbgJAz","RxrsmkZANm","Gv3Fq7ku1p","JXljWOUqFM","Yw2oU580YD","faHirJJs5m",
+"FFDuiLDk6f","7fKYUjtn0X","fcJOyMK07Y","0BmCyNOHsz","4QMc9YOfrY","oQ87rRkQke","Zv7z0lH1kt","tuDyS8FmFH","0Wr5ypWiOs","ReKEW7fsYM",
+"iKqhrWmadA","Ul4a1TCgPp","qQxHPnnP8o","t98iWMezSW","xReeclCMxy","uoStwOHaBz","X6PinGSQwj","uJScXBpYhV","rhl0JqQxHP","D6rByzqH0W",
+"xciqp7Ow5C","iKqhrlViBv","hE1QlFLsph","hi5X78hJdt","Mm8siuTacx","zz4ZUQnJ1S","IjTwPpFrrl","Ss0ZuokgRi","b29RJeuZA5","pWiOssuY4x",
+"X6PinVIlwP","QYxC05IhmG","fFDrJD6rBy","RmDcrt59lR","UmaEv64s8N","MmKGJ5nmWv","b29RJ0BmCy","d7vjM7hyVv","Pb1pawiHrZ","euZA5jtn0X",
+"rz7UtNo0Qb","fLNg8IKxdL","NAFuwReKEW","cShY2WMiS3","zFgtBfqypy","HRxd8rz7Ut","3weIFnnP8o","nFqik0PktI","64s8N2ZHdk","Zv7z0zz4ZU",
+"VLTy62ZHdk","lsQGoJKWYR","QWxoTQ6hMC","hSSvQNxx9V","7lUXZwDajX","FGzgpaL6AJ","IjTwPTXQ0Z","lsQGozHF1q","Oz8yZaL6AJ","VNCPdMkgy8",
+"CK5W7F6PT2","ydG8Uiqv4k","RxrsmSs0Zu","7fsYMPb1pa","WmadAgtCA5","2hEEUv8yFN","jeskSFhtgl","sx5GlSjskQ","KsjRKHzZT8","618DiL7cGc",
+"CIShGpT8wu","uAWypHlUbF","PYBf4tuDyS","14FLR5IhmG","GSQwjbrhlQ","ciuWzReKEW","14FLRwDajX","WPmlxgtCA5","O3iyQZhwG1","7Ow5CuoStw",
+"RkQke0BmCy","dQ586KASQ8","ZUnqtX6Pin","OxWIHMmKGJ","IjTwPQWxoT","sqVrfcQOnv","4dEz6zmLYD","fmIK1BGaQY","aFFssNhXdu","pmeCdFNYIM",
+"zz4ZUwDajX","zbIYY7Ow5C","WaWsvyluBx","lCMxyjtn0X","VerEACIShG","dpe1vn8pJ9","oVQp607n1c","pv0i7SbRYy","oGu6xWaWsv","Z4I1vjfREu",
+"RpBQm9y4lw","ZhwG1y94nw","sx5Glzz4ZU","VNCPdLbRTH","AmdQdwDajX","OHaBzIn3NS","l83UdcShY2","VBjhzlH1kt","WMiS3TCgPp","yvOMI6AFT0",
+"t59lRYw2oU","9GXkXReKEW","okgRihE1Ql","FNYIMcQOnv","MojnPBpYhV","ciuWzdQ586","zQt6QZJTXH","zqH0WqQxHP","AXpwE48cHL","he9IAYf2Ec",
+"9eoRcyvOMI","AIYUuaFFss","y94nwtvdkD","HP433BpYhV","pWiOsRxrsm","FVMxo5ZaEz","AmdQd5iGN5","S2DfutlILt","Ul4a1DcpWB","Q6LixSs0Zu",
+"9y4lwU3yw5","oVQp6nFqik","W3VFHMm8si","JIqXiHlUbF","zQt6QXflUq","QWxoTru4UG","In3NSfcwDa","nFqik9XyT9","QbxXcvLsmS","QssNCRsQUq",
+"ksJbyjSjS3","gtCA5yToGW","ciuWz7X3uy","Yh1hFM6qcG","lweGyMezSW","dQ586QYxC0","Gv3FqgIYvE","FnPFBYf2Ec","xXTI4pv0i7","MmKGJQClRL",
+"lCMxyCfgr3","NhXduatef2","AIYUuOxWIH","BGaQYm4bxU","mX2GES77LH","RsQUquoStw","JkzUnvLsmS","blLA9MGlTF","MmKGJOxWIH","zFgtBAOgEe",
+"euZA5yEfy9","cmXIXpWiOs","S77LHMaJQs","qUJMdJRJQB","oQ87rfaHir","0h1b1uvf7A","GSQwj5nmWv","0MR5XTCgPp","t98iWMGlTF","WPmlxsx5Gl",
+"kZANm1LB1L","IjTwP0Kyfs","rz7UtfcwDa","ulk41wiHrZ","Cfgr3ThjNn","qQxHPFLsph","B3qemhE1Ql","tlILtlj07Q","DQimp2hEEU","TCgPpRpBQm",
+"07n1czbIYY","QWxoTJKWYR","NcICAiKqhr","8TxD74dEz6","tuDySiB08l","VBjhz8TxD7","pT8wu2Nslm","SjskQuPX7G","TwanoUl4a1","5drc6fFDrJ",
+"lXFOBwiHrZ","qaofNIBe8k","uN6r3k85Ae","CqqaD9iGoT","8hJdtlH1kt","fmIK16q6L9","xciqpS77LH","WMiS3fcJOy","7ku1plXFOB","m4bxUZuDtD",
+"ZzJHW6AFT0","sqVrfRzaZA","aFFssjtn0X","Pb1paNOHsz","kB5nPFnPFB","DQimppAhR1","7ku1piwzGk","jSjS3AOgEe","b29RJRkQke","CxVEfzQt6Q",
+"aDGtSokgRi","I7p2aQworu","7X3uyfFDrJ","gjUTuqaofN","WMiS3W3VFH","bgJAzIn3NS","14FLRoQ87r","XyPZNNOHsz","CIShGhi5X7","IKxdLMezSW",
+"5VZjSOz8yZ","qQxHP0Kyfs","bZLvSXflUq","0h1b1CNHmv","AXpwEFhtgl","oQ87rDQimp","DcpWBOxWIH","pAhR1Fhtgl","QbxXcfcwDa","hYBCKbZLvS",
+"fLNg8AgJHQ","GWqqX0PktI","K20wKsoy9t","PYBf429QAz","FwEJzGSQwj","4W0TlWMiS3","Oz8yZe6e4z","iqv4kW7cTs","QChxspT8wu","64s8NAkKTk",
+"ZuDtDYOfrY","QworucL0aE","RBhp0nFqik","3weIFjtn0X","CIShGDLhzM","9iGoT29QAz","M6qcGQYxC0","MaJQsjS1aj","tuDySOz8yZ","t98iWuoStw",
+"cL0aEWPmlx","djsrvtvdkD","CdyBVaL6AJ","8RCUAG1RhS","JkzUn8hJdt","UlU3M6q6L9","jfREulH1kt","sx5Gl0MR5X","9eoRcoGu6x","JRJQBRxrsm",
+"FLsph5IhmG","fcwDaP6bcg","aFFsso8Uyd","blLA9Mkgy8","0MR5XuJScX","2hEEURsQUq","kZANm0YAGH","zFgtBoVQp6","AkKTkCfgr3","ix74r5Mg9r",
+"Yw2oUM6qcG","AXpwExciqp","Ul4a1FFDui","5Mg9rUmaEv","AkKTkWaWsv","LewvMSmGzv","faHirVLTy6","ZhwG1uLtKs","0PktIBCxeC","Oz8yZzHF1q",
+"oVQp6S77LH","NAFuwRsQUq","brhlQChuy3","W3VFHDG4sT","v2eC3JKWYR","uupzkkB5nP","VLTy6pWiOs","WMiS37fsYM","rhl0J0h1b1","FLsphiwzGk",
+"9rlg9B3qem","M3zXLlsQGo","djsrvYw2oU","vLsmSC2Irc","TCgPplCMxy","oGu6xDcpWB","Kr8ysuLtKs","zz4ZUL7cGc","CdyBV7fKYU","FGzgp0h1b1",
+"6AFT0kZANm","WPmlxeuZA5","9XyT9Ss0Zu","YOfrYokgRi","Y1mC0gf8rI","gtCA5gjUTu","pmeCdrhl0J","o8UydEOE1o","uZPqgOUqFM","7X3uygf8rI",
+"9iGoTjSjS3","sqVrfThjNn","ZJTXHqQxHP","zQt6QPb1pa","Yw2oUJ2mQi","WmadAQssNC","Uvlv4VjCZq","uAWypyvOMI","WmadAlweGy","RzaZAFnPFB",
+"hYBCKrhl0J","Qworuv8yFN","ciuWzIjTwP","Waim6rz7Ut","HzZT8I7p2a","uN6r3QnJ1S","SbRYycShY2","v2eC3uupzk","8TxD7BpYhV","jSjS3l83Ud",
+"QChxsDLhzM","djsrvuN6r3","kZANmBpYhV","MojnPrKDLJ","iqv4k14FLR","WaWsv1LB1L","uvf7AbZLvS","QChxsqQxHP","CqqaDqaofN","WmadA6AFT0",
+"NOHszoGu6x","n8pJ9RmDcr","9iGoT14FLR","S77LHHfyNQ","yvOMIKr8ys","kZANm1j5L8","FnPFBuupzk","FxX9qIRh48","24ARFXyPZN","rKDLJrKDLJ",
+"LbRTHmX2GE","ZzJHW8TxD7","tjQxsRzaZA","pFrrl9GXkX","YOfrYciuWz","dQ586QClRL","Mm8siBGaQY","OUqFMRBhp0","TCgPpOxWIH","5NammWmadA",
+"soy9tMmsIo","wDajX5IhmG","FhtglZuDtD","EdBKcix74r","iB08lYh1hF","EoToPyluBx","ksJby7Ow5C","tl72WNcICA","JRJQBtAOsr","AmdQd580YD",
+"ogLgc7fsYM","kB5nPPOUYS","HzZT8gIYvE","1LB1LQnJ1S","VNCPdoVQp6","5iGN5SmGzv","2Nslm0PktI","he9IAOxWIH","lm0pDtAOsr","lpF6WIRh48",
+"qaofNlm0pD","2ZHdka00b5","QClRLNcICA","ix74rqUJMd","LewvMhe9IA","b29RJiB08l","zHF1qjS1aj","oGu6xG1RhS","8cVD3vkCHH","Nxx9VJRJQB",
+"e6e4zVjCZq","cQOnv9GXkX","yEfy9Cfgr3","m4bxUhSSvQ","Cfgr3ydG8U","IKxdLhUTw7","Q6hMCVIlwP","OUqFM6q6L9","fqypye6e4z","t59lRB3qem",
+"M3zXLIjTwP","zY1GYG1RhS","Yw2oUzFgtB","9GXkXDz1R3","iwzGkwDajX","VLTy6cmXIX","Ta8f6B3qem","Waim6euZA5","gdQsSW3VFH","yluBx5Namm",
+"2Yz7EPYBf4","F6PT2azIWp","jeskSlm0pD","Mm8siTwano","DQimphi5X7","OxWIHZ4I1v","FwEJz9eoRc","FGzgpEoToP","KASQ8hSSvQ","piJSkkZANm",
+"UlU3MAkKTk","FxX9qNcICA","atef26AFT0","Cp3mZNhXdu","Yf2EcciuWz","X6PinlH1kt","W3VFH5Namm","Chuy3s4786","uoStw618Di","guMb8Waim6",
+"Z4I1vWDVWJ","uoStwUl4a1","Cfgr35IhmG","MaJQsJIqXi","jSjS37fKYU","Nxx9VReKEW","ix74rt98iW","6q6L9FNYIM","tAOsrECMvU","ZzJHWJkzUn",
+"0MR5X24ARF","WmadAWaWsv","FhtglK20wK","Yf2EcWaWsv","StlDJoGu6x","EOE1oWaim6","In3NSI7p2a","uQIcz0Wr5y","UmaEvcmXIX","oGu6xZuDtD",
+"l83UdKsjRK","55rfBCdyBV","hUTw7MezSW","P6bcgFFDui","8TxD7prNT6","5iGN58cVD3","uPX7GYh1hF","iB08lDcpWB","rz7UtQ6Lix","piJSk7ku1p",
+"o8UyddQ586","uoStwpWiOs","wDajXAOgEe","hE1QlciuWz","K4GS8uPX7G","BFkb8RzaZA","Uvlv464s8N","AmdQdZzJHW","StlDJzHF1q","DLhzMAgJHQ",
+"VIlwPFjHXR","qQxHPiKqhr","pv0i7ulk41","sx5GlPYBf4","P6bcgo8Uyd","ix74r2Yz7E","lj07QAmdQd","WPmlxAIYUu","ZhwG1hi5X7","ZuDtDDz1R3",
+"O3iyQuPX7G","ZuDtDMaJQs","4dEz65Drn0","jeskS48cHL","SbRYyn8pJ9","uupzkK4GS8","he9IA8RCUA","AOgEes7Mxk","DcpWBLewvM","lpF6WNAFuw",
+"XflUqtl72W","pFrrlRkQke","3otm6GrDg7","s7MxkRsQUq","1v5hH45cIH","Y1mC0fqypy","ix74rAkKTk","CK5W7HP433","lsQGoFcWrW","vLsmSjiVBP",
+"45cIHfqypy","euZA5uAWyp","9rlg99XyT9","Vprf28U2nU","qUJMdHP433","RmDcr8TxD7","0YAGHsx5Gl","IBe8kyluBx","JkzUnjzUqR","MmKGJksJby",
+"DcpWB9iGoT","ZhwG1VBjhz","jeskSG1RhS","qaofN0ao3l","aDGtSn8pJ9","cQOnvZv7z0","cQOnvhUTw7","0Kyfs5Namm","aez9yjSjS3","GXdoHYh1hF",
+"48cHLhSSvQ","Y1mC0FVMxo","Q6hMCtuDyS","8xEKzwDajX","fmIK1580YD","nlaBywDajX","yvOMINAFuw","oGu6xAgJHQ","i3pydCp3mZ","uvf7AZv7z0",
+"0MR5XZUnqt","n8pJ9lweGy","pWiOs0BmCy","48cHL7lUXZ","3otm6i7WMQ","8xEKzNo0Qb","TXQ0Z8cVD3","fcwDaQnJ1S","HP433ciuWz","jS1ajRmDcr",
+"euZA5taOXK","580YDNcICA","K20wKa00b5","IKxdLGXdoH","HlUbFjeskS","jeskSBbwgA","i7WMQyluBx","QClRLTCgPp","yvOMIFcWrW","uLtKs0PktI",
+"7ku1pb29RJ","K4GS8QChxs","SjskQcmXIX","P6bcgi3pyd","wiHrZtjQxs","t59lRsx5Gl","48cHL7ku1p","618DijeskS","14FLRgf8rI","CxVEfCqqaD",
+"BpYhVKsjRK","lj07Q2Nslm","ZzJHWwiHrZ","aL6AJjiVBP","Kr8ysDLhzM","Nxx9VQWxoT","hE1QlVNCPd","cShY2MaJQs","Q6LixChuy3","nlaByVLTy6",
+"l83UdnlaBy","FNYIMjS1aj","MK07YS77LH","6AFT0aDGtS","7X3uy6AFT0","WDVWJTCgPp","RpBQmBpYhV","yEfy9zz4ZU","3weIFOUYuF","2hEEUFhtgl",
+"uupzk3weIF","WMiS3Nxx9V","BpYhVprNT6","vLsmSzbIYY","gf8rIRpBQm","0h1b1i3pyd","1v5hHyvOMI","AmdQduPX7G","soy9the9IA","dQ586J2mQi",
+"24ARFJIqXi","azIWpThjNn","azIWpQYxC0","t59lRFcWrW","aDGtShe9IA","jtn0XgtCA5","lj07Qix74r","aDGtSciuWz","taOXKZuDtD","d85a9Nxx9V",
+"taOXKMK07Y","8cVD355rfB","wiHrZW7cTs","Kr8ysNhXdu","iqv4k8U2nU","7X3uyzbIYY","IjTwP7fsYM","OxWIHdjsrv","8hJdthUTw7","DG4sT1v5hH",
+"jSjS3QWxoT","In3NSaFFss","Ul4a1iqv4k","aL6AJ1LB1L","S77LHDLhzM","4dEz69rlg9","FGzgpQssNC","Q6hMCXyPZN","qUJMdlj07Q","Twano5drc6",
+"Q6LixNxx9V","XyPZNuupzk","t98iWzmLYD","AgJHQO3iyQ","hUTw7JXljW","vLsmS55rfB","vLsmSrKDLJ","pWiOsUmaEv","G1RhSs7Mxk","ZuDtDsoy9t",
+"rhl0JnlaBy","jS1ajzY1GY","8TxD7y94nw","Oz8yZ5Drn0","faHiroGu6x","Q6LixWDVWJ","cmXIX64s8N","uLtKsXyPZN","h1zcHtjQxs","2TRI7jtn0X",
+"Cfgr3WreyP","y94nwbZLvS","oGu6xSs0Zu","VerEAtl72W","ZhwG19iGoT","atef2fFDrJ","lkMUAvkCHH","brhlQW7cTs","IjTwPi3pyd","0YAGHpWiOs",
+"XyPZN0YAGH","uLtKsyEfy9","TCgPpAgJHQ","Qworuzz4ZU","bZLvSWmadA","yofH3mz8gx","1j5L8BbwgA","uZPqgBbwgA","mz8gxUvlv4","lXFOBzY1GY",
+"HlUbFQChxs","lm0pDUvlv4","RmDcrk85Ae","CqqaDiqv4k","GWqqXUlU3M","aez9yjtn0X","uoStw7lUXZ","FLsphZJTXH","gf8rIOUqFM","blLA9v1Hln",
+"azIWpCK5W7","QbxXcI7p2a","DQimp9eoRc","MezSW5VZjS","IRh48Ul4a1","0ao3liB08l","vkCHHVNCPd","n8pJ9ydG8U","GrDg79XyT9","DcpWBvkCHH",
+"JkzUnyluBx","Qworusx5Gl","WaWsvVLTy6","WaWsv2ZHdk","lsQGov2eC3","UmaEv24ARF","6AFT0uAWyp","tAOsrCIShG","rhl0JvOqCE","WDVWJDLhzM",
+"SbRYyNhXdu","gf8rIEOE1o","t59lRMm8si","dhSuHlm0pD","14FLRQ6Lix","iwzGkAXpwE","bZLvS1j5L8","cL0aEPOUYS","7ku1p9rlg9","BFkb8MGlTF",
+"gf8rI9eoRc","cShY2jeskS","mz8gxGWqqX","zqH0WlXFOB","ReKEWVjCZq","gdQsSUlU3M","2hEEUsqVrf","MmKGJRkQke","LbRTHMmKGJ","pAhR19GXkX",
+"AkKTkNo0Qb","FcWrW7fKYU","FcWrWfmIK1","fcJOyIKxdL","JKWYRokgRi","2NslmBpYhV","jzUqRJKWYR","8TxD7Q6hMC","yluBxMmsIo","zQt6QuLtKs",
+"zqH0WMmKGJ","NhXdugf8rI","x3LDeGSQwj","LDk6fB3qem","vkCHHS2Dfu","SbRYywiHrZ","8hJdt2hEEU","K20wK3weIF","rhl0JWmadA","580YDQChxs",
+"618DiJ2mQi","hUTw7fmIK1","yofH3zFgtB","AkKTktaOXK","suY4xaez9y","oVQp6MGlTF","JIqXiKsjRK","lH1kt8xEKz","a00b5CxVEf","KZamHvkCHH",
+"MmsIoKsjRK","qaofNpmeCd","KASQ8v2eC3","piJSkSmGzv","gf8rIe6e4z","7X3uyFxX9q","vOqCEuTacx","v1HlnKr8ys","VIlwPXyPZN","aFFssHlUbF",
+"Gv3FqZUnqt","BFkb8QChxs","7X3uyVBjhz","KZamHtaOXK","ReKEWWMiS3","X6PinazIWp","zbIYY580YD","Cfgr3o8Uyd","1v5hHYh1hF","PYBf4CK5W7",
+"9eoRcFPfSE","uN6r3lViBv","tjQxsyofH3","Yf2EcMkgy8","Dz1R3VerEA","EoToPZuDtD","CK5W78xEKz","piJSkNcICA","WDVWJ0PktI","FVMxoTCgPp",
+"djsrv0Kyfs","lH1kthE1Ql","rKDLJdhSuH","MmsIoS77LH","v2eC39rlg9","vOqCE5drc6","jzUqRd85a9","HlUbF8TxD7","LDk6fni2v1","jS1ajhYBCK",
+"SmGzvix74r","fcwDa2ZHdk","8FmFHGXdoH","DcpWBxReec","GrDg7Y1mC0","7fsYMqQxHP","jSjS3DcpWB","Uvlv4FwEJz","8cVD32Yz7E","zHF1q5iGN5",
+"ReKEWSs0Zu","7fKYUTXQ0Z","LewvMcL0aE","RpBQmx3LDe","uAWyphSSvQ","Gv3FqtvdkD","gjUTuaDGtS","2hEEURACuj","zY1GYuvf7A","JJs5mv2eC3",
+"Q6LixSbRYy","M3zXLWMiS3","lXFOBlCMxy","HP433dpe1v","jiVBPWMiS3","FwEJz2Nslm","0YAGHKASQ8","ZzJHW5drc6","yEfy95Drn0","uvf7AQ6Lix",
+"bgJAzGrDg7","sx5GlSbRYy","CqqaDhe9IA","FcWrWcShY2","lkMUAaFFss","Oz8yZEOE1o","Kr8ysAmdQd","RzaZAZUnqt","DcpWB14FLR","AkKTkZ4I1v",
+"24ARF9iGoT","5nmWvuTacx","wiHrZrhl0J","K20wKQYxC0","W3VFHMkgy8","1v5hHIKxdL","In3NSxReec","gf8rIpFrrl","fFDrJFNYIM","uPX7G9iGoT",
+"sqVrfxReec","suY4x7Ow5C","JJs5mL7cGc","jeskSD6rBy","nnP8od85a9","x3LDenFqik","M6qcGU3yw5","4dEz6vkCHH","soy9tni2v1","zz4ZUVIlwP",
+"hYBCKYh1hF","LbRTHlj07Q","HRxd8jeskS","fLNg8FjHXR","kB5nPfaHir","gtCA5BbwgA","n1pmOydG8U","s4786In3NS","t59lR3otm6","8hJdtuJScX",
+"a00b5dQ586","pAhR1SjskQ","iqv4klH1kt","QbxXcjzUqR","xciqpyluBx","fLNg8B3qem","ZhwG12DREs","EdBKclCMxy","dmoS7POUYS","lH1ktFPfSE",
+"3otm6yluBx","OUYuFF6PT2","WDVWJNhXdu","GSQwjLDk6f","FjHXRwiHrZ","7Ow5C618Di","3weIFFPfSE","DQimp29QAz","CK5W748cHL","suY4xzFgtB",
+"MaJQsbZLvS","1v5hHCxVEf","WDVWJDz1R3","he9IAcQOnv","SbRYyTa8f6","uJScX8TxD7","FcWrWFcWrW","BFkb8Q6hMC","djsrvksJby","LewvMO3iyQ",
+"lkMUAcmXIX","prNT6K20wK","LDk6fpAhR1","qQxHP8cVD3","9y4lwWPmlx","iwzGkL7cGc","tl72WOz8yZ","uPX7GMm8si","KsjRKFhtgl","2Yz7E8TxD7",
+"jS1ajXyPZN","zFgtBvLsmS","RpBQmNcICA","rz7UtO3iyQ","xXTI4XyPZN","lCMxyCK5W7","BpYhVIRh48","pWiOs8U2nU","QworuFPfSE","S2DfuB3qem",
+"fqypyv1Hln","FcWrW4QMc9","hYBCKSjskQ","fqypyX6Pin","tuDySGv3Fq","aFFss9XyT9","JXljWMaJQs","ulk41uvf7A","uZPqgTwano","BbwgAqQxHP",
+"okgRiVprf2","StlDJ8cVD3","fFDrJsoy9t","oVQp6pmeCd","Ta8f6EoToP","nFqikDcpWB","45cIHsx5Gl","AOgEeYh1hF","Ta8f6SbRYy","lweGydQ586",
+"zmLYDprNT6","QClRLni2v1","WPmlxRBhp0","JKWYRDcpWB","RpBQmKsjRK","lkMUAhe9IA","yEfy9y94nw","iKqhrQ6Lix","k85Ae5VZjS","B3qemCIShG",
+"uQIczjSjS3","djsrvJ2mQi","qUJMdaFFss","AkKTkpmeCd","FVMxo0YAGH","YOfrYsx5Gl","ydG8UazIWp","atef2mX2GE","mX2GEfcJOy","ulk41CqqaD",
+"5IhmG9eoRc","WMiS3XflUq","K20wKd85a9","jeskS8TxD7","UlU3MaL6AJ","0KyfshYBCK","CdyBVd85a9","guMb8QYxC0","ZzJHWBCxeC","zmLYDfaHir",
+"tuDySK4GS8","64s8Nb29RJ","48cHLi7WMQ","FNYIM5Mg9r","U3yw5tl72W","NAFuwIRh48","d7vjMhi5X7","5IhmGaFFss","i3pyd8TxD7","cQOnvO3iyQ",
+"EOE1o2Yz7E","pvgjSzHF1q","guMb8ECMvU","Q6LixTwano","4W0TlMm8si","s93Mldpe1v","blLA9blLA9","bZLvSAOgEe","gtCA5ogLgc","LDk6fatef2",
+"EOE1ouoStw","I7p2azbIYY","prNT6kZANm","K20wKfqypy","OUYuF1j5L8","HP433DG4sT","ulk41EoToP","UlU3MUl4a1","CqqaDvkCHH","tvdkDe6e4z",
+"8TxD7wiHrZ","lXFOBQChxs","Mm8siNo0Qb","cQOnvRACuj","nlaByJJs5m","djsrvKsjRK","dQ5867lUXZ","pAhR1fmIK1","Ul4a1pWiOs","5Mg9rSWfou",
+"yEfy9uLtKs","G1RhSciuWz","lViBvFVMxo","KZamHrhl0J","1j5L8EdBKc","uJScXLbRTH","618DinFqik","BGaQY8hJdt","GSQwjTCgPp","3otm6lkMUA",
+"2hEEUgdQsS","djsrvgdQsS","I7p2aQnJ1S","BCxeC9rlg9","X6Pint98iW","0Kyfs5VZjS","uPX7GSbRYy","t59lRfmIK1","RpBQme6e4z","vOqCEi7WMQ",
+"uAWypCK5W7","Zv7z0MaJQs","uvf7AK20wK","rKDLJ0MR5X","QnJ1St98iW","8cVD3HzZT8","64s8NQworu","LDk6fSmGzv","n8pJ9LewvM","pWiOs9XyT9",
+"0BmCy2hEEU","WMiS3lXFOB","WaWsvVBjhz","uLtKs8RCUA","L7cGcuAWyp","jiVBPECMvU","euZA5QbxXc","CNHmvKASQ8","HzZT8n1pmO","P6bcgazIWp",
+"DcpWBtjQxs","RBhp0gdQsS","pmeCdgjUTu","zFgtBjiVBP","7hyVv9eoRc","a00b5qUJMd","618DiS2Dfu","1v5hHBpYhV","580YDpv0i7","oVQp6Ul4a1",
+"8TxD764s8N","Nxx9VpT8wu","OUYuFdhSuH","0MR5XMmKGJ","d7vjMThjNn","14FLRD6rBy","yofH30ao3l","Pb1paoQ87r","AmdQdXyPZN","oVQp6aez9y",
+"14FLRyToGW","5Mg9rMmKGJ","OHaBz07n1c","k85Ae8U2nU","1j5L8aDGtS","ZuDtDCxVEf","No0QbDQimp","KASQ8Chuy3","NcICAoGu6x","pFrrlZUnqt",
+"FjHXRpT8wu","8cVD3ix74r","OUYuFcQOnv","FwEJz0ao3l","nlaByHfyNQ","EOE1ozz4ZU","XyPZNhe9IA","QbxXcm4bxU","lCMxyfqypy","gjUTufcJOy",
+"Waim6MaJQs","K4GS8yToGW","7ku1p48cHL","uAWypEoToP","8xEKzdQ586","xReecOxWIH","sqVrf0ao3l","ECMvUWaWsv","YOfrYvOqCE","WreyPlViBv",
+"sx5GlP6bcg","uAWyp5drc6","DG4sTgIYvE","5VZjSECMvU","brhlQlkMUA","OUYuFMkgy8","Ta8f6jzUqR","8U2nUZhwG1","qaofNaez9y","5iGN5aDGtS",
+"Chuy3OxWIH","BFkb8iqv4k","Gv3Fqd85a9","2hEEUyofH3","7lUXZ6q6L9","DcpWBJRJQB","v8yFN8U2nU","VLTy6i3pyd","GrDg7lViBv","3otm65drc6",
+"SWfou618Di","Vprf27fsYM","aDGtSHP433","vLsmSJKWYR","0h1b1Cfgr3","16lHcNcICA","B3qem64s8N","gdQsSlCMxy","CNHmvTCgPp","b29RJO3iyQ",
+"ZhwG1fqypy","Waim6Yh1hF","X6PinHRxd8","2DREsS2Dfu","xciqpO3iyQ","O3iyQfcJOy","iB08lCdyBV","o8Uyd0h1b1","yofH35iGN5","QssNCgf8rI",
+"BbwgAFVMxo","ZJTXHNOHsz","ydG8UbZLvS","WMiS345cIH","UmaEv5iGN5","aez9yMmKGJ","brhlQyToGW","pv0i7WaWsv","QworuqUJMd","vkCHHgtCA5",
+"lpF6W6AFT0","0BmCysx5Gl","CIShGyluBx","iB08llH1kt","J2mQiyToGW","IBe8k1v5hH","0KyfsQChxs","yvOMIKZamH","14FLRciuWz","uupzkWaim6",
+"NOHszQClRL","nnP8oNo0Qb","Q6LixRkQke","lViBvzz4ZU","Yf2EcSWfou","MGlTFdQ586","ZhwG11j5L8","ogLgcBCxeC","ZuDtDhe9IA","8RCUAM6qcG",
+"4W0Tlo8Uyd","yToGWIKxdL","FFDui45cIH","sx5GlfcJOy","yvOMIOz8yZ","JkzUnHP433","BbwgAogLgc","ZUnqt8xEKz","ulk41ix74r","pWiOsjtn0X",
+"d85a9VLTy6","zQt6QMm8si","8TxD7zFgtB","64s8NZ4I1v","okgRiMkgy8","ksJbyfmIK1","8hJdtk85Ae","aez9yNhXdu","SmGzvM3zXL","uN6r3SWfou",
+"ni2v1C2Irc","PYBf40Wr5y","0MR5XKASQ8","6q6L9ZuDtD","SmGzvCfgr3","CqqaDuTacx","ZuDtDUl4a1","zHF1q55rfB","yvOMIGv3Fq","ni2v1WmadA",
+"O3iyQQWxoT","In3NSYOfrY","v2eC3MezSW","0MR5X0Wr5y","6AFT05Mg9r","lj07QtaOXK","U3yw53weIF","s93MlDG4sT","s93MlyToGW","Ss0ZuWPmlx",
+"AmdQdHP433","NcICAmz8gx","DQimpWaWsv","GSQwjWaWsv","HRxd8uAWyp","GWqqX8FmFH","DcpWB2ZHdk","Qworu2hEEU","d7vjMguMb8","lH1ktlsQGo",
+"nFqikGSQwj","oQ87rfmIK1","taOXKlXFOB","jSjS3HP433","AXpwE0h1b1","ksJby2DREs","StlDJ0ao3l","he9IA2hEEU","24ARF3weIF","WDVWJuPX7G",
+"uZPqgdjsrv","YOfrYRACuj","0BmCy5drc6","P6bcgSmGzv","kZANmtvdkD","qaofNgtCA5","LewvMRmDcr","IRh48a00b5","OUYuFn1pmO","hE1Qlaez9y",
+"QworusuY4x","K4GS85IhmG","2TRI7OHaBz","Q6hMCIn3NS","2ZHdksuY4x","pAhR1pFrrl","9eoRc7fsYM","MezSWaFFss","Chuy30Wr5y","4QMc9OUqFM",
+"TCgPpuN6r3","C2Irc45cIH","fcJOyWDVWJ","ECMvUydG8U","7ku1p7X3uy","RkQke6AFT0","yToGWtlILt","lm0pDSjskQ","taOXKnlaBy","cQOnv7Ow5C",
+"yofH3oGu6x","pAhR1iwzGk","Vprf2lsQGo","QClRLlkMUA","1LB1LFcWrW","CxVEfWDVWJ","i3pydfaHir","M6qcGsqVrf","iqv4kRpBQm","yvOMILbRTH",
+"AXpwEHlUbF","G1RhSGWqqX","9eoRc1v5hH","ix74rCqqaD","Nxx9VSmGzv","EoToPW7cTs","gtCA52Yz7E","vOqCEPYBf4","5ZaEzuoStw","2TRI7618Di",
+"uZPqgjzUqR","yToGWazIWp","0BmCygf8rI","B3qemDG4sT","t98iW7fKYU","Pb1pa29QAz","ZzJHWxciqp","RsQUq3weIF","he9IAKZamH","cL0aENhXdu",
+"1j5L8CdyBV","8cVD39eoRc","7fsYMQworu","TCgPpyToGW","WmadAtl72W","JJs5mwDajX","RkQke3otm6","1v5hHSWfou","mz8gxh1zcH","FVMxo7ku1p",
+"8xEKzo8Uyd","uZPqghUTw7","BbwgAgf8rI","lViBvd7vjM","vkCHH8cVD3","Ss0ZuG1RhS","brhlQzFgtB","DcpWBjzUqR","8RCUAuQIcz","QChxskZANm",
+"45cIHQClRL","he9IAJIqXi","Ul4a1aL6AJ","piJSkMmsIo","B3qemUvlv4","kB5nPJIqXi","W3VFHP6bcg","uQIczTXQ0Z","P6bcgblLA9","CxVEfksJby",
+"1j5L8S77LH","fcwDav2eC3","dmoS7d85a9","pWiOsuJScX","lj07QLDk6f","uvf7AOUYuF","S2DfuhE1Ql","Cp3mZpvgjS","QbxXcbgJAz","8cVD3iwzGk",
+"No0QbX6Pin","UmaEvDz1R3","lsQGotAOsr","ru4UGKZamH","tuDySUvlv4","O3iyQ0BmCy","qQxHPhSSvQ","KASQ87X3uy","EOE1oFhtgl","wiHrZ618Di",
+"aDGtSWaWsv","v1HlngtCA5","blLA95VZjS","7fKYUaFFss","lsQGoRpBQm","VjCZqqQxHP","B3qem0h1b1","In3NSVBjhz","Ul4a1RACuj","IBe8kru4UG",
+"ksJby5drc6","F6PT2uupzk","wDajXcmXIX","W7cTs6q6L9","v2eC3xciqp","EoToPZ4I1v","LDk6fsuY4x","K20wKW7cTs","o8Uydsx5Gl","F6PT2uvf7A",
+"Gv3FqfcJOy","0Wr5yTa8f6","d7vjMWMiS3","DcpWBsuY4x","Nxx9VZUnqt","In3NSXflUq","K20wKiKqhr","4QMc9FxX9q","VBjhzCxVEf","v8yFNxReec",
+"ru4UGlpF6W","In3NSOz8yZ","pvgjSVBjhz","yofH3i3pyd","Vprf2uLtKs","BbwgA1v5hH","uLtKsYf2Ec","BCxeCksJby","S2Dfut98iW","faHirgtCA5",
+"n1pmO5ZaEz","DG4sTxciqp","lm0pD9XyT9","LewvMtjQxs","euZA5UlU3M","iKqhrK20wK","0PktIv2eC3","nnP8oqQxHP","Cfgr3x3LDe","8xEKzOz8yZ",
+"JkzUnHRxd8","lpF6Whe9IA","3otm6o8Uyd","29QAz14FLR","QYxC0D6rBy","lm0pDfqypy","DG4sTGXdoH","blLA95Drn0","2ZHdkeuZA5","ZzJHWfcwDa",
+"0h1b1suY4x","0MR5XFhtgl","wDajXMm8si","8hJdtK20wK","VerEAWaWsv","gtCA5EdBKc","VerEAFLsph","aL6AJ0YAGH","suY4xMaJQs","CdyBVFjHXR",
+"Z4I1vzHF1q","taOXKCdyBV","wDajXAkKTk","WMiS3KZamH","rhl0JxXTI4","QWxoT1LB1L","d7vjMYh1hF","xXTI4UmaEv","ni2v1t59lR","piJSkn8pJ9",
+"blLA9hUTw7","X6PinDQimp","FVMxoWaim6","nnP8oyluBx","IBe8k4W0Tl","hE1QlWaim6","oVQp6SmGzv","QnJ1SKASQ8","2NslmNOHsz","lsQGoGXdoH",
+"AIYUufFDrJ","618DikZANm","n8pJ9LDk6f","yvOMIfLNg8","NcICAv8yFN","Ss0ZuYw2oU","zmLYDokgRi","8xEKzyEfy9","jtn0X5drc6","b29RJuAWyp",
+"UmaEvWDVWJ","In3NSrz7Ut","SjskQuJScX","GWqqX7fKYU","qQxHPlweGy","m4bxUWaWsv","RmDcrni2v1","0KyfsNAFuw","JXljWAkKTk","Mm8sii7WMQ",
+"cmXIXZv7z0","No0QbEoToP","LewvM8TxD7","QWxoTgjUTu","Q6hMCQssNC","Ta8f6StlDJ","HRxd8CdyBV","W7cTsTwano","HRxd8tjQxs","uQIcz9GXkX",
+"blLA9HzZT8","MojnPYOfrY","StlDJ7fsYM","OUYuF0MR5X","lm0pDJ2mQi","8TxD7MGlTF","iqv4kDcpWB","lpF6WgtCA5","euZA5gtCA5","VjCZq8hJdt",
+"bgJAzMGlTF","5VZjSLewvM","dhSuHQbxXc","dmoS729QAz","iqv4kF6PT2","Yf2EcjS1aj","lXFOBRsQUq","Pb1paAXpwE","o8Uyd48cHL","IKxdLsx5Gl",
+"CK5W74W0Tl","GWqqXM3zXL","2DREsyofH3","FNYIMuJScX","aDGtSqQxHP","lkMUAv8yFN","HP433dhSuH","AXpwEix74r","zY1GY580YD","DG4sTIn3NS",
+"IBe8k9y4lw","he9IASbRYy","EOE1oulk41","fmIK14QMc9","rKDLJpmeCd","he9IANo0Qb","RBhp0wDajX","djsrvFPfSE","0BmCyJKWYR","b29RJQYxC0",
+"aez9ygf8rI","CK5W7JIqXi","VjCZqFGzgp","WDVWJtaOXK","2TRI7K4GS8","e6e4zOUqFM","Yw2oUrKDLJ","nFqikzbIYY","jSjS3ciuWz","2Nslm5Mg9r",
+"Cp3mZm4bxU","5iGN5Cp3mZ","M3zXLbgJAz","lj07Qatef2","4QMc9IKxdL","guMb8wDajX","lH1ktaFFss","YOfrY0Kyfs","xciqpuPX7G","Mkgy8brhlQ",
+"FcWrWm4bxU","gjUTuv1Hln","ZzJHWbZLvS","pFrrlZ4I1v","atef2lpF6W","KASQ8Waim6","v8yFNEOE1o","lXFOBWmadA","ZhwG1FNYIM","4W0TluTacx",
+"9XyT9WreyP","8RCUASbRYy","CxVEfHfyNQ","FGzgp2Yz7E","aL6AJulk41","fcJOylweGy","Ss0ZulH1kt","JIqXiFcWrW","i3pydS77LH","Mm8si5nmWv",
+"5VZjSpT8wu","OxWIHGv3Fq","FFDui5ZaEz","5IhmGjfREu","3weIF0ao3l","RpBQmtuDyS","OUYuFCfgr3","24ARFWmadA","EdBKcAkKTk","dmoS7ZuDtD",
+"0BmCypv0i7","ksJby6AFT0","soy9tt59lR","WreyPAgJHQ","FFDuiYh1hF","9XyT9djsrv","mX2GEUl4a1","2ZHdkiB08l","M6qcGFPfSE","RkQkeM3zXL",
+"wDajXKsjRK","AXpwEFcWrW","QbxXcqQxHP","No0QbAXpwE","9XyT9uJScX","QnJ1S6q6L9","ciuWz0YAGH","UlU3MBbwgA","2Yz7EU3yw5","5ZaEzMojnP",
+"ECMvU5ZaEz","TwanoEOE1o","2hEEUQworu","DQimphe9IA","JJs5m8TxD7","EoToP2Yz7E","s4786hE1Ql","JJs5mIKxdL","cL0aE4W0Tl","FGzgpm4bxU",
+"vOqCEMmKGJ","QbxXcFcWrW","BbwgACfgr3","vkCHHQClRL","taOXK2Yz7E","ZuDtD4QMc9","9y4lwrz7Ut","Waim65Mg9r","xciqpGSQwj","OxWIHx3LDe",
+"1j5L8FxX9q","okgRiv1Hln","FNYIMo8Uyd","QssNCVNCPd","5Mg9rqQxHP","m4bxUDG4sT","55rfBn8pJ9","XflUqM3zXL","O3iyQL7cGc","S2DfuprNT6",
+"cShY2uN6r3","uupzkZuDtD","MGlTF0h1b1","0PktITwano","8U2nUHlUbF","jtn0XsqVrf","G1RhSOxWIH","S2Dfuhi5X7","iB08lQWxoT","0BmCyjiVBP",
+"JJs5m5Namm","4W0Tlaez9y","yofH3HRxd8","hi5X7k85Ae","zmLYDWreyP","JXljWCxVEf","8xEKzF6PT2","2hEEUMaJQs","X6PinoQ87r","iwzGkNxx9V",
+"zQt6QJKWYR","wiHrZ0Wr5y","FNYIMGrDg7","QssNCWMiS3","C2IrcOHaBz","rKDLJ8cVD3","i3pydeuZA5","nnP8oaDGtS","AgJHQlkMUA","lXFOBhi5X7",
+"fmIK1ZhwG1","ZuDtDvOqCE","CqqaD5Mg9r","xXTI4t98iW","fFDrJYf2Ec","xciqpbrhlQ","iKqhrtvdkD","azIWp4dEz6","ZzJHW3otm6","24ARFVprf2",
+"0KyfsprNT6","pAhR1FxX9q","aez9yQYxC0","y94nw9eoRc","Cp3mZChuy3","jeskSMmsIo","LDk6fL7cGc","NcICAuZPqg","jiVBPKsjRK","QWxoTlsQGo",
+"zbIYYRACuj","L7cGcn1pmO","lXFOBGSQwj","UlU3MZhwG1","UmaEv3otm6","9XyT9fcwDa","L7cGcl83Ud","azIWpd7vjM","3weIFJKWYR","JIqXiv2eC3",
+"Q6hMCdhSuH","5Drn0FxX9q","cQOnvlViBv","pWiOs1j5L8","HzZT8jSjS3","AOgEeQYxC0","FPfSEPYBf4","iKqhryofH3","ydG8UWreyP","blLA9QWxoT",
+"FhtglVIlwP","bZLvS580YD","MmKGJcmXIX","uN6r3b29RJ","5iGN57lUXZ","8hJdt8xEKz","bgJAzzmLYD","K20wK2hEEU","MmKGJFnPFB","iqv4kulk41",
+"48cHL0MR5X","C2IrcUl4a1","pT8wuZ4I1v","1j5L8oVQp6","GXdoHVjCZq","FFDuiKsjRK","he9IAo8Uyd","HP433IKxdL","Dz1R3tlILt","IBe8kYh1hF",
+"TwanoNo0Qb","DQimpU3yw5","tAOsr0MR5X","d7vjM2ZHdk","GXdoHYOfrY","CIShGVBjhz","Uvlv4aez9y","NOHszaDGtS","s4786x3LDe","G1RhSZhwG1",
+"NcICAjiVBP","1v5hHQbxXc","EOE1o0BmCy","FnPFByluBx","TwanoeuZA5","FFDui9GXkX","2NslmxReec","QbxXc1j5L8","oVQp6OUqFM","t98iWlm0pD",
+"Yh1hFpiJSk","zY1GY9rlg9","8hJdtXyPZN","5Drn0s4786","kZANm3otm6","TCgPpv8yFN","5VZjSVLTy6","euZA5MmsIo","QworuvkCHH","BbwgA9y4lw",
+"EOE1oFnPFB","LewvMDz1R3","B3qemb29RJ","fFDrJWaWsv","7Ow5Cuupzk","AmdQddhSuH","pv0i7v1Hln","2TRI7MK07Y","J2mQiy94nw","Twanoiqv4k",
+"8U2nU1j5L8","ksJbyU3yw5","O3iyQ6AFT0","blLA93otm6","BbwgA0ao3l","y94nwVjCZq","tvdkDMm8si","FjHXRyEfy9","rz7UtHlUbF","hYBCKgf8rI",
+"tvdkDNxx9V","oVQp65Drn0","prNT62DREs","nnP8oU3yw5","IjTwP7Ow5C","C2Irct98iW","Vprf2D6rBy","FwEJz5IhmG","FGzgp5ZaEz","t98iWM6qcG",
+"h1zcHAXpwE","C2IrcVjCZq","zHF1q3weIF","SWfouOUqFM","QbxXcFNYIM","d85a99y4lw","vLsmSWmadA","uJScXlViBv","yofH3lXFOB","6q6L9M3zXL",
+"VjCZq9y4lw","UmaEvW3VFH","9iGoTulk41","piJSkECMvU","zbIYYkZANm","HlUbF9y4lw","K4GS82Yz7E","uZPqghi5X7","hUTw7guMb8","J2mQizbIYY",
+"U3yw5d7vjM","3weIFL7cGc","JIqXiwiHrZ","ulk41lCMxy","FPfSEaL6AJ","48cHLU3yw5","580YDd85a9","5Mg9rCp3mZ","ThjNnMaJQs","oQ87rDLhzM",
+"qQxHPWaWsv","29QAzwDajX","QYxC0KsjRK","S2Dfus93Ml","L7cGc618Di","NAFuwHRxd8","0KyfstvdkD","8U2nUlCMxy","yvOMI1v5hH","QClRLCdyBV",
+"I7p2acShY2","AXpwEaDGtS","8cVD3FcWrW","RzaZAVerEA","HRxd8FVMxo","Q6hMCpv0i7","XflUqix74r","pv0i7k85Ae","oQ87rL7cGc","Cfgr3mX2GE",
+"xciqpZJTXH","vLsmSzY1GY","Qworufqypy","MezSWQ6hMC","0h1b1CxVEf","TCgPpLewvM","P6bcgSbRYy","BbwgAzmLYD","zz4ZUgjUTu","ksJbylCMxy",
+"ZuDtDDcpWB","jS1aj3weIF","Q6LixFLsph","t98iWTa8f6","16lHcRmDcr","euZA5LbRTH","hE1QlkB5nP","TwanoVIlwP","HzZT8Ss0Zu","RACujZUnqt",
+"DLhzMqUJMd","gjUTuZ4I1v","jeskSpvgjS","K20wKqaofN","VLTy6cL0aE","sqVrf07n1c","k85AefLNg8","ZzJHWuAWyp","8hJdtZJTXH","ThjNnrz7Ut",
+"TXQ0Zv8yFN","Dz1R3XyPZN","8hJdtZzJHW","pv0i7lweGy","AgJHQTa8f6","uN6r30h1b1","QChxsBFkb8","xReecRACuj","VLTy6QYxC0","OUqFM07n1c",
+"JJs5mni2v1","iKqhrGSQwj","AXpwEv8yFN","B3qemguMb8","Dz1R3BbwgA","RkQke16lHc","IKxdLgdQsS","SWfou7X3uy","MezSWjS1aj","QClRLciuWz",
+"ZJTXHdhSuH","HzZT8qQxHP","8hJdtY1mC0","WmadAYf2Ec","hi5X7M6qcG","HlUbFkB5nP","suY4xoVQp6","JXljWRzaZA","5VZjSOxWIH","ZJTXHtl72W",
+"580YDFGzgp","he9IAKsjRK","vLsmSChuy3","ZJTXH4W0Tl","lCMxyMezSW","8U2nUTCgPp","iKqhrrhl0J","OxWIHNhXdu","K20wKB3qem","pmeCd7lUXZ",
+"hE1QlxXTI4","uQIczZhwG1","Mm8sitaOXK","iqv4kfFDrJ","0Wr5y1j5L8","QChxsjS1aj","AkKTkVBjhz","QbxXc64s8N","e6e4zF6PT2","8RCUAuZPqg",
+"yluBxEdBKc","soy9tHfyNQ","uvf7ApvgjS","iB08l9GXkX","djsrvdQ586","lj07QQworu","4dEz65VZjS","29QAz7fKYU","JKWYR8TxD7","IRh48uLtKs",
+"euZA5EdBKc","dhSuHEOE1o","ogLgc1v5hH","48cHLuN6r3","RBhp0o8Uyd","FVMxotuDyS","8cVD3W7cTs","cmXIXFVMxo","qQxHPCIShG","Q6hMClsQGo",
+"2hEEUiqv4k","zbIYY24ARF","uupzkDz1R3","jeskSMaJQs","hSSvQcQOnv","ogLgcb29RJ","azIWpjzUqR","JIqXiRpBQm","RmDcrfcJOy","lpF6WlkMUA",
+"n8pJ945cIH","vLsmSIBe8k","VBjhz0BmCy","rhl0JRsQUq","uupzkCxVEf","QworuCNHmv","k85AeMmKGJ","SWfouJKWYR","Y1mC0AIYUu","lViBvLDk6f",
+"7Ow5CjeskS","5iGN5xReec","7ku1pdjsrv","aL6AJCK5W7","AmdQd8xEKz","2ZHdkNo0Qb","fcwDataOXK","qUJMdOz8yZ","fmIK1zbIYY","zFgtB2Nslm",
+"5ZaEzB3qem","WMiS3QYxC0","RpBQm0ao3l","Yw2oUru4UG","uvf7AazIWp","FcWrWlsQGo","1v5hH2DREs","n1pmOpmeCd","vOqCEFjHXR","RmDcrQChxs",
+"RpBQmatef2","JXljWIRh48","x3LDe8RCUA","yluBxfcJOy","zbIYYcShY2","WmadAiKqhr","7hyVvRmDcr","Oz8yZt59lR","kB5nPQ6Lix","mz8gx55rfB",
+"ydG8UEdBKc","lViBvpWiOs","lj07Qaez9y","tuDySO3iyQ","16lHc3weIF","Q6Lixm4bxU","jzUqRokgRi","pvgjSPYBf4","oQ87rMK07Y","gf8rI4dEz6",
+"m4bxUYh1hF","RBhp0fcJOy","8TxD7h1zcH","RmDcruZPqg","1LB1L1j5L8","jzUqRHRxd8","d7vjMi3pyd","DG4sTAOgEe","LewvMC2Irc","uLtKspv0i7",
+"Zv7z0fmIK1","M3zXLh1zcH","6q6L9WmadA","uTacxFwEJz","jzUqR7hyVv","FhtgluLtKs","3weIF2Nslm","nFqikRsQUq","QssNCt98iW","nnP8ojzUqR",
+"QnJ1S7fsYM","CqqaDuQIcz","suY4xciuWz","nlaByCK5W7","29QAzxciqp","l83UdRmDcr","UmaEvBCxeC","mz8gxCNHmv","cmXIXpFrrl","HzZT8pvgjS",
+"jiVBP5iGN5","gjUTuogLgc","AgJHQAOgEe","SbRYyPYBf4","pWiOszz4ZU","8xEKzQClRL","RACujtjQxs","x3LDeatef2","wDajXCdyBV","HRxd87fsYM",
+"Ss0ZuGv3Fq","MGlTFQ6Lix","zQt6QAIYUu","xciqpuLtKs","In3NS8TxD7","e6e4zFwEJz","Z4I1vt98iW","EoToPsqVrf","n1pmOUmaEv","0KyfsPYBf4",
+"FPfSEni2v1","GXdoHv1Hln","ksJby3otm6","XyPZNQ6hMC","7fKYUv8yFN","dmoS7sx5Gl","X6PineuZA5","U3yw5Q6Lix","FGzgp1v5hH","0Kyfs8hJdt",
+"W7cTsNxx9V","he9IAuoStw","Gv3Fq2ZHdk","ReKEWcL0aE","gf8rIgIYvE","uoStwLDk6f","NOHsz0ao3l","ZJTXHogLgc","Nxx9VLDk6f","lCMxydjsrv",
+"BCxeCfLNg8","ogLgcvkCHH","4QMc9wDajX","fLNg8djsrv","dpe1vSjskQ","ECMvUIKxdL","tvdkDlweGy","GXdoH2ZHdk","WPmlxy94nw","9iGoTcShY2",
+"LewvM07n1c","LbRTHhe9IA","1v5hHD6rBy","zbIYYaL6AJ","Chuy3XyPZN","nFqikJJs5m","gf8rIlViBv","uZPqghSSvQ","d85a95nmWv","WMiS3blLA9",
+"ECMvUl83Ud","BGaQYK4GS8","0YAGHrKDLJ","FLsphRsQUq","7Ow5CnnP8o","nlaBygf8rI","Dz1R3pWiOs","VjCZqVLTy6","9GXkXG1RhS","RBhp0Oz8yZ",
+"uoStwKASQ8","IKxdLzFgtB","piJSkrKDLJ","ZJTXHjSjS3","v1HlnCp3mZ","KASQ8AIYUu","FLsphMmsIo","guMb8uTacx","bgJAzX6Pin","ZJTXHzQt6Q",
+"uLtKsCIShG","Yw2oUUlU3M","tlILtd85a9","zz4ZUlm0pD","aez9ykZANm","cmXIXRACuj","Kr8yspvgjS","hE1QlJKWYR","pT8wuBCxeC","F6PT2ulk41",
+"lj07Qjtn0X","WmadA2TRI7","he9IAXflUq","0Wr5y0Kyfs","5Namm6AFT0","jtn0XyToGW","m4bxUe6e4z","Rxrsm7hyVv","i7WMQUvlv4","EoToPUvlv4",
+"4dEz6GSQwj","CxVEf7Ow5C","dmoS7soy9t","DcpWBpiJSk","lH1ktt98iW","Q6hMCDQimp","55rfBQWxoT","brhlQcQOnv","s4786DQimp","o8UydIRh48",
+"MmsIoQnJ1S","W7cTsFcWrW","pWiOshi5X7","LbRTHEoToP","B3qemnlaBy","8xEKz5VZjS","KASQ8n8pJ9","OHaBzChuy3","DQimpdmoS7","CdyBVIKxdL",
+"TXQ0ZlViBv","iqv4kChuy3","FhtgluAWyp","Yf2EcuZPqg","t59lRHRxd8","cL0aEe6e4z","P6bcgFNYIM","tjQxsWMiS3","lkMUA0Kyfs","Mkgy8Z4I1v",
+"tjQxs2ZHdk","7hyVvfqypy","64s8NMojnP","55rfBzFgtB","k85Ae0Kyfs","l83UdLbRTH","Pb1paPYBf4","Chuy3UmaEv","2Yz7EgjUTu","2Nslmv2eC3",
+"i7WMQa00b5","aL6AJHlUbF","MojnPWaim6","Fhtgluupzk","S77LHni2v1","9rlg98U2nU","cL0aEsqVrf","ZhwG1zFgtB","lm0pDFLsph","uN6r3618Di",
+"CxVEfzFgtB","EOE1o8FmFH","aL6AJhE1Ql","ni2v1Twano","Y1mC0bgJAz","SWfou2DREs","Yw2oUtlILt","iqv4k2TRI7","pmeCdt59lR","WaWsvKASQ8",
+"pFrrln8pJ9","StlDJThjNn","JkzUnprNT6","3weIFaL6AJ","bZLvSMmsIo","hSSvQbZLvS","K4GS8fcwDa","RmDcrJ2mQi","7X3uy07n1c","WreyP5Namm",
+"cmXIXgf8rI","Yf2EcWPmlx","dhSuHvLsmS","2NslmkB5nP","FjHXR2Yz7E","FGzgphE1Ql","5VZjSkB5nP","mX2GEQYxC0","OxWIHJ2mQi","9iGoTO3iyQ",
+"Mm8sil83Ud","MaJQsCdyBV","ZzJHW0Wr5y","2Yz7EY1mC0","TwanoFGzgp","iB08l7ku1p","tAOsrCdyBV","FFDuiFjHXR","Q6LixUlU3M","bgJAz0Kyfs",
+"WreyPlkMUA","uvf7AL7cGc","2hEEUHzZT8","KZamHReKEW","1j5L8uQIcz","Uvlv4Yh1hF","AmdQdJIqXi","gdQsSUmaEv","Nxx9V8FmFH","7hyVv24ARF",
+"9XyT9Yw2oU","atef2sx5Gl","8cVD3BCxeC","RACujJKWYR","prNT6pvgjS","0MR5XDG4sT","k85AeQ6hMC","2TRI7G1RhS","m4bxUUl4a1","iwzGkcmXIX",
+"O3iyQfcwDa","pAhR1Cp3mZ","hUTw7dhSuH","zbIYYcmXIX","iwzGkUmaEv","piJSkuQIcz","uLtKsLDk6f","EOE1oYh1hF","fLNg8gjUTu","zbIYYKr8ys",
+"lm0pD2Nslm","RsQUqZUnqt","8TxD72Nslm","aFFsszbIYY","W3VFHpT8wu","faHirThjNn","wiHrZGSQwj","1j5L8aL6AJ","gdQsSWMiS3","cL0aEoQ87r",
+"qQxHPWMiS3","VLTy6n8pJ9","QClRL7fsYM","BGaQYJJs5m","tl72WVLTy6","lH1ktbgJAz","EdBKcRmDcr","YjB9the9IA","QWxoTh1zcH","SjskQ1LB1L",
+"prNT6h1zcH","4dEz6pT8wu","djsrvpWiOs","zqH0W14FLR","hi5X7i3pyd","mX2GE2ZHdk","CdyBViB08l","8TxD7Qworu","jSjS3faHir","QChxsG1RhS",
+"AmdQdAkKTk","8TxD7tjQxs","XyPZN45cIH","lj07Qa00b5","CIShG5iGN5","qQxHPyluBx","5VZjS7X3uy","v2eC3580YD","QYxC0uN6r3","bgJAz8FmFH",
+"QworuPYBf4","uZPqgCqqaD","Pb1pahi5X7","yluBx24ARF","iqv4kQYxC0","K20wKtjQxs","t59lRXflUq","Dz1R3zHF1q","0PktIPOUYS","FcWrWRmDcr",
+"0YAGHydG8U","zFgtBtAOsr","WMiS3RsQUq","AgJHQZUnqt","8FmFHCNHmv","JXljWUvlv4","hYBCKZzJHW","AOgEeazIWp","l83UdbgJAz","rKDLJ1LB1L",
+"aFFssG1RhS","0KyfsVerEA","45cIHMmKGJ","OxWIH4dEz6","suY4xVBjhz","IKxdLix74r","suY4xsuY4x","JJs5m9XyT9","oQ87rBbwgA","SWfounlaBy",
+"yvOMIBGaQY","qaofNFNYIM","nlaByD6rBy","5iGN5Qworu","zmLYDqaofN","OUYuFuJScX","i3pydPb1pa","7Ow5C3weIF","iB08ldjsrv","suY4xKZamH",
+"Oz8yZ7fKYU","gf8rI5drc6","d7vjMJJs5m","UmaEvzbIYY","NcICAWDVWJ","2Nslm8cVD3","QworuD6rBy","MaJQsK20wK","0YAGHzmLYD","6q6L9CdyBV",
+"lXFOBe6e4z","0h1b1580YD","9rlg9yvOMI","5Mg9rxReec","xXTI4hi5X7","YOfrYFNYIM","iwzGkn8pJ9","uN6r3K4GS8","uN6r3G1RhS","tAOsr3otm6",
+"8U2nUSs0Zu","zY1GY9XyT9","F6PT2Ta8f6","VerEAlViBv","aL6AJzz4ZU","IRh48Vprf2","uZPqgn8pJ9","9iGoTlH1kt","ZuDtDVprf2","K20wKP6bcg",
+"Ta8f6uQIcz","FLsphSWfou","iwzGkydG8U","HP4335ZaEz","1v5hHVBjhz","suY4x8hJdt","TCgPpjiVBP","6AFT0Yh1hF","kB5nPpvgjS","DQimpn1pmO",
+"SmGzvoGu6x","rhl0JMmKGJ","ZJTXHru4UG","ulk41zY1GY","dhSuHjtn0X","Ta8f6AmdQd","GWqqXEoToP","x3LDe0ao3l","FxX9q64s8N","5nmWv0Wr5y",
+"2DREsfcwDa","O3iyQHP433","VLTy6ZuDtD","Q6hMCgf8rI","Yf2Ecx3LDe","gtCA5KASQ8","14FLRlj07Q","Y1mC0MK07Y","jfREuWDVWJ","i7WMQAXpwE",
+"uAWypuJScX","kZANmh1zcH","NOHszS77LH","Ul4a1JRJQB","Vprf29GXkX","pFrrlRxrsm","FcWrWTa8f6","y94nwpiJSk","gdQsSKr8ys","M6qcGpv0i7",
+"cQOnvogLgc","RACujWaim6","t59lRNo0Qb","SmGzvyofH3","lpF6WtjQxs","zmLYDsqVrf","2TRI7uPX7G","YjB9tVprf2","9rlg9X6Pin","POUYSM3zXL",
+"sx5Glhi5X7","oQ87rTa8f6","gdQsSYh1hF","lXFOBlH1kt","W3VFHFVMxo","8TxD7Fhtgl","Mm8siJKWYR","uN6r3DG4sT","OUqFM5VZjS","pmeCd5Drn0",
+"Yh1hFlj07Q","bgJAz9iGoT","QworuJJs5m","brhlQhi5X7","FnPFBqaofN","1j5L8he9IA","okgRidhSuH","FLsph45cIH","JRJQBjS1aj","zY1GY0h1b1",
+"s7MxkaL6AJ","v1HlnpT8wu","fcJOyRxrsm","14FLRK4GS8","FPfSEdjsrv","jiVBP8xEKz","yluBxZuDtD","5drc629QAz","jfREuFjHXR","WreyP2Yz7E",
+"2Yz7EOUYuF","DcpWBhUTw7","FLsphblLA9","taOXKv2eC3","Cfgr3ciuWz","iB08lI7p2a","5nmWvCNHmv","Uvlv4tvdkD","iB08lyEfy9","7hyVvW7cTs",
+"4W0TltaOXK","pv0i7e6e4z","Yf2EcQYxC0","SmGzvk85Ae","uvf7ABpYhV","GXdoHBbwgA","5IhmGWreyP","uLtKs0Wr5y","jS1ajdpe1v","Q6hMCydG8U",
+"uZPqgUl4a1","iKqhrMGlTF","k85Ae6q6L9","prNT6Waim6","CxVEfFwEJz","DQimpPYBf4","WPmlxfmIK1","RzaZAFjHXR","jSjS3ThjNn","GSQwjCqqaD",
+"TwanoO3iyQ","hYBCK4dEz6","RACujtaOXK","rhl0JDz1R3","VBjhzvOqCE","NcICAjtn0X","soy9toVQp6","L7cGcIBe8k","atef2WaWsv","vkCHHpFrrl",
+"ZhwG1WMiS3","s7Mxk5iGN5","JIqXiVIlwP","ksJbyFnPFB","45cIHWMiS3","RBhp0jtn0X","okgRitjQxs","FcWrWuAWyp","AmdQdh1zcH","7X3uyS2Dfu",
+"fFDrJiKqhr","iqv4k5IhmG","iwzGk0BmCy","U3yw5hi5X7","JRJQB9eoRc","tlILtd7vjM","Cp3mZ2TRI7","jzUqR6q6L9","dQ586x3LDe","uupzkfcJOy",
+"pWiOs0ao3l","VLTy6LewvM","W3VFH0YAGH","BGaQYt59lR","TCgPplXFOB","kZANmtaOXK","tuDySD6rBy","y94nwThjNn","8hJdtQClRL","zHF1q9iGoT",
+"8xEKz6AFT0","fFDrJMm8si","QbxXcatef2","D6rByoQ87r","cmXIXi3pyd","cShY2dpe1v","uoStwvOqCE","iB08ljtn0X","PYBf4AIYUu","FPfSEdmoS7",
+"GXdoHfLNg8","ZuDtDFhtgl","JIqXiuTacx","MK07YvLsmS","atef2iKqhr","kZANmSWfou","1v5hHDz1R3","SmGzv48cHL","2TRI7x3LDe","oVQp6uZPqg",
+"aDGtSZ4I1v","uN6r3YjB9t","MaJQstjQxs","5Drn07fKYU","ciuWzRBhp0","ZhwG1YOfrY","4W0TlGWqqX","atef2QnJ1S","hSSvQ3otm6","l83UdsuY4x",
+"RzaZAS2Dfu","VLTy63weIF","b29RJX6Pin","gjUTu2DREs","FVMxomX2GE","oQ87rHlUbF","8hJdt6AFT0","NOHszy94nw","0h1b1lm0pD","y94nwTa8f6",
+"RsQUqNcICA","Vprf2W3VFH","YOfrYtjQxs","ZhwG1GXdoH","JJs5mVIlwP","5VZjSL7cGc","fFDrJTwano","SmGzv0BmCy","uupzkNhXdu","ZUnqtcL0aE",
+"xciqpKASQ8","QChxsv1Hln","lj07QeuZA5","lViBv2TRI7","JIqXiC2Irc","ix74rk85Ae","6q6L9HlUbF","2NslmaL6AJ","2hEEUzz4ZU","Waim6RzaZA",
+"WaWsvsoy9t","EdBKcfcJOy","W7cTsrz7Ut","JkzUnRmDcr","ReKEWqaofN","Zv7z0KASQ8","euZA5okgRi","9iGoTJIqXi","n8pJ9XyPZN","FGzgp5IhmG",
+"FPfSERzaZA","uupzkVprf2","zQt6QprNT6","JKWYRMm8si","nnP8oxReec","55rfB2Nslm","pv0i70Kyfs","RpBQmn8pJ9","lm0pDprNT6","48cHLfcwDa",
+"StlDJO3iyQ","FFDuiSs0Zu","KZamHRsQUq","NhXduNo0Qb","FPfSELDk6f","ThjNn618Di","tlILt7ku1p","FnPFBcmXIX","Zv7z0zmLYD","jiVBPlpF6W",
+"bZLvSFVMxo","I7p2ablLA9","lpF6WAgJHQ","2hEEU618Di","ZhwG18U2nU","jiVBPAIYUu","qaofN7Ow5C","nFqik0MR5X","lweGyoGu6x","lViBvgdQsS",
+"8xEKzWmadA","UmaEvmX2GE","MK07Y0PktI","i3pydL7cGc","b29RJWmadA","fcJOycShY2","5Mg9rjSjS3","KsjRKs4786","i3pydUvlv4","pvgjSQChxs",
+"64s8N4W0Tl","MK07YGXdoH","FxX9qFLsph","ReKEWiB08l","uZPqg580YD","fcJOyn1pmO","Zv7z0dhSuH","yEfy9e6e4z","zmLYDZJTXH","fcJOyk85Ae",
+"RxrsmfmIK1","cShY2HzZT8","QworuDcpWB","LewvMRBhp0","lCMxybZLvS","uvf7AiwzGk","lm0pDuoStw","blLA99y4lw","HfyNQv8yFN","v2eC3FNYIM",
+"WMiS3JJs5m","qaofN8RCUA","DLhzMAXpwE","e6e4zUlU3M","atef2aFFss","iqv4kZUnqt","jzUqRb29RJ","IBe8kzqH0W","ZuDtDTa8f6","RkQkeThjNn",
+"jSjS32hEEU","HlUbFFwEJz","i3pydTXQ0Z","IjTwPbrhlQ","uZPqgHzZT8","yToGWFFDui","lm0pDMm8si","2DREsiqv4k","F6PT27X3uy","i3pyd48cHL",
+"0MR5Xt98iW","IKxdL5IhmG","vkCHHvkCHH","AIYUuXyPZN","pAhR1YOfrY","0ao3lfFDrJ","Q6LixAkKTk","OHaBz6q6L9","lH1ktnnP8o","he9IA0PktI",
+"XyPZNOxWIH","aFFssO3iyQ","C2Irc0Kyfs","8hJdtazIWp","OxWIHMkgy8","14FLRtjQxs","Cp3mZfcJOy","iB08lFNYIM","BCxeCjzUqR","sx5GlBFkb8",
+"5IhmGt59lR","9XyT9Q6hMC","Uvlv4M6qcG","yvOMIJXljW","2NslmFhtgl","uZPqgiwzGk","AkKTkJIqXi","b29RJgjUTu","b29RJGSQwj","OxWIHZv7z0",
+"RsQUqciuWz","i7WMQYf2Ec","uPX7GyvOMI","QWxoTTXQ0Z","ThjNnKr8ys","MaJQsaL6AJ","jiVBPFxX9q","jzUqRqaofN","lweGywDajX","ogLgcatef2",
+"CK5W7cL0aE","4W0Tl07n1c","MojnPtvdkD","GrDg7nnP8o","b29RJ0PktI","WreyPhYBCK","9eoRcjzUqR","atef2U3yw5","J2mQiuZPqg","ThjNnUlU3M",
+"48cHLNo0Qb","DQimpJXljW","lsQGoXyPZN","ogLgcIKxdL","CxVEffLNg8","HzZT8AIYUu","uJScXMojnP","U3yw5F6PT2","PYBf4ru4UG","dQ586dhSuH",
+"ulk41i3pyd","VerEA3weIF","ZJTXHJJs5m","8RCUAStlDJ","Y1mC0FLsph","9eoRcFFDui","WaWsvFcWrW","VIlwPcL0aE","SmGzvWaWsv","UmaEvokgRi",
+"QbxXcy94nw","VjCZqtAOsr","wiHrZogLgc","CIShGQ6hMC","JXljWtuDyS","hi5X7xReec","580YDXyPZN","CxVEfdjsrv","DcpWBCK5W7","580YDSs0Zu",
+"LewvM9y4lw","jSjS3FFDui","FNYIM7Ow5C","i3pydoVQp6","Vprf2dpe1v","vLsmSRsQUq","uoStwoQ87r","9iGoT64s8N","K20wKuAWyp","tuDySpWiOs",
+"yofH37hyVv","HfyNQ4QMc9","WreyPMaJQs","NOHszrhl0J","Z4I1vl83Ud","CxVEf2DREs","Ss0ZuFFDui","nnP8oZJTXH","580YDtvdkD","16lHc7fsYM",
+"wiHrZGrDg7","wDajX3otm6","tl72WL7cGc","8RCUAVjCZq","jeskShi5X7","pmeCd2Yz7E","jeskS9GXkX","Dz1R3azIWp","Waim6YjB9t","a00b56AFT0",
+"DLhzMlsQGo","3weIFOxWIH","GSQwjMaJQs","QWxoTcmXIX","ZuDtDJRJQB","KASQ8nnP8o","MGlTF7ku1p","4W0TlAgJHQ","IjTwPuLtKs","cmXIXQ6Lix",
+"VjCZqCdyBV","suY4x5iGN5","WreyPyluBx","RBhp05Mg9r","lkMUAHP433","C2IrcW3VFH","AXpwElj07Q","FFDui0h1b1","vOqCEGv3Fq","e6e4zdmoS7",
+"BCxeCW3VFH","lweGyfcJOy","HlUbFNxx9V","FxX9qfqypy","zY1GYt59lR","HlUbFZJTXH","uvf7AOUqFM","djsrvcQOnv","rKDLJ0h1b1","hUTw7U3yw5",
+"0ao3lCdyBV","n1pmOCK5W7","ru4UGpvgjS","JXljWd85a9","7X3uy2hEEU","n8pJ9zY1GY","rz7UtazIWp","JRJQBWMiS3","DLhzMYh1hF","zQt6Qd85a9",
+"sx5GlsqVrf","CqqaDaDGtS","gIYvEIn3NS","lXFOBn1pmO","ulk41jSjS3","VerEAgjUTu","wDajXd85a9","RkQkeUvlv4","J2mQiYw2oU","euZA5iKqhr",
+"Kr8ysIRh48","zz4ZU0h1b1","7Ow5CDLhzM","pAhR1IKxdL","MojnP7lUXZ","Gv3FqUl4a1","IjTwPVBjhz","EOE1ogIYvE","ECMvUsqVrf","gtCA5wDajX",
+"oQ87rJJs5m","2ZHdk8TxD7","zz4ZUatef2","X6PinPOUYS","DLhzMa00b5","UmaEvn8pJ9","S2Dfuv1Hln","fmIK1faHir","C2IrcfmIK1","TCgPpfFDrJ",
+"fmIK1e6e4z","9XyT9zHF1q","9iGoTTXQ0Z","azIWphUTw7","djsrvaez9y","vkCHHGXdoH","v1HlnBCxeC","0ao3lHzZT8","NhXdu0MR5X","iqv4kMaJQs",
+"qQxHPLewvM","Q6LixWPmlx","FnPFBNAFuw","M6qcGd7vjM","cQOnv3weIF","IRh48uPX7G","nFqikZuDtD","VBjhzulk41","JkzUnzbIYY","jzUqRwiHrZ",
+"MojnPuoStw","8FmFHHlUbF","M3zXL9eoRc","No0QbaL6AJ","jS1ajFcWrW","RkQkeQClRL","ksJbywDajX","o8UydjfREu","FNYIMHRxd8","W3VFHru4UG",
+"aFFssMojnP","FGzgpMm8si","WDVWJRmDcr","9eoRcMojnP","KASQ8OUqFM","fFDrJydG8U","ix74riwzGk","No0QbSWfou","L7cGcI7p2a","0PktIGXdoH",
+"uAWypMojnP","oGu6xVerEA","X6PinZuDtD","aL6AJQssNC","tjQxsLewvM","FnPFBwiHrZ","9y4lwZJTXH","hSSvQF6PT2","64s8NgtCA5","Q6hMCnnP8o",
+"K4GS8kB5nP","0YAGH7fKYU","1v5hH14FLR","k85Aeru4UG","64s8N16lHc","4QMc9bgJAz","8FmFHZuDtD","618Dit98iW","3otm6JIqXi","QChxsL7cGc",
+"fmIK1zz4ZU","mX2GEAXpwE","M3zXLChuy3","J2mQi2Yz7E","VNCPdB3qem","Mm8siHlUbF","zmLYDCfgr3","7Ow5CuN6r3","2hEEUU3yw5","tlILtRsQUq",
+"uJScX14FLR","euZA5vOqCE","IKxdLZhwG1","uPX7GBbwgA","hSSvQZUnqt","Waim6NhXdu","5nmWvmX2GE","No0QbJIqXi","ECMvUgIYvE","CdyBVRmDcr",
+"FLsphRBhp0","NhXduMmKGJ","B3qemFwEJz","FjHXR0YAGH","RmDcrVNCPd","zmLYDazIWp","5drc6ThjNn","MaJQsGrDg7","0YAGHd7vjM","uPX7GKr8ys",
+"Ul4a15Namm","tl72W5iGN5","2DREsksJby","WMiS3FwEJz","jzUqRkB5nP","xReecB3qem","ZzJHWs7Mxk","CNHmv07n1c","29QAzhYBCK","iwzGkblLA9",
+"dQ586Y1mC0","5IhmGyEfy9","WaWsvChuy3","CqqaDTwano","Yh1hF7hyVv","s7MxkjfREu","RzaZAWDVWJ","NhXduO3iyQ","NcICA0ao3l","oGu6xuTacx",
+"0h1b10Wr5y","WDVWJyofH3","x3LDeQssNC","vOqCEv1Hln","yToGW0Wr5y","2NslmjfREu","9iGoTgIYvE","AIYUuuAWyp","ksJbyfqypy","iB08l3weIF",
+"RxrsmvOqCE","2NslmvOqCE","7fKYUokgRi","wDajXb29RJ","0Wr5yeuZA5","EOE1odjsrv","OHaBzru4UG","yEfy9qQxHP","ulk41fcwDa","pAhR1AgJHQ",
+"QworufLNg8","0h1b1EoToP","FFDuiatef2","m4bxUwDajX","fmIK1SbRYy","WmadATwano","yofH3JIqXi","SWfou45cIH","djsrvs4786","0KyfsW7cTs",
+"RmDcruupzk","7lUXZFFDui","OxWIHqUJMd","RkQket98iW","KZamHVprf2","SbRYyUl4a1","FwEJz0Kyfs","mz8gxCIShG","W3VFHVLTy6","6AFT0JIqXi",
+"DcpWBpFrrl","ECMvUXflUq","faHirZ4I1v","BCxeC618Di","RsQUq48cHL","RkQkesx5Gl","uoStw8TxD7","NOHsznFqik","U3yw5NhXdu","uQIczLDk6f",
+"WmadAtjQxs","lpF6WFcWrW","b29RJStlDJ","7X3uyqUJMd","HRxd8Oz8yZ","9iGoTdpe1v","UmaEvFhtgl","hE1Qlt98iW","brhlQOxWIH","uTacxk85Ae",
+"4dEz6uvf7A","EOE1otl72W","8FmFHI7p2a","QChxsNxx9V","MaJQs7Ow5C","AgJHQVNCPd","07n1cX6Pin","Zv7z0UmaEv","cQOnv7ku1p","2ZHdkuupzk",
+"HlUbFfFDrJ","VIlwPM3zXL","h1zcHHRxd8","Mkgy8t98iW","ZUnqtQnJ1S","Gv3FqU3yw5","QWxoTFxX9q","ThjNnsuY4x","mX2GE9rlg9","4QMc9DG4sT",
+"4W0TluN6r3","fmIK1iKqhr","ksJbypFrrl","Uvlv4blLA9","a00b5No0Qb","xReecpiJSk","IjTwPfaHir","s7MxkdQ586","J2mQipvgjS","W7cTsKr8ys",
+"tvdkDyofH3","QYxC0AkKTk","d85a9Cfgr3","yToGWFGzgp","B3qemAgJHQ","a00b5e6e4z","hYBCKGWqqX","0YAGHcQOnv","jS1ajatef2","2NslmCNHmv",
+"W3VFHFPfSE","DLhzMAmdQd","d7vjMMkgy8","7ku1pB3qem","ksJby7hyVv","Vprf2fFDrJ","he9IAW3VFH","OUYuFEdBKc","WPmlx0BmCy","QworuzmLYD",
+"tuDySHRxd8","2ZHdkogLgc","d7vjMVIlwP","blLA9uN6r3","S2Dfue6e4z","QYxC0pFrrl","aez9ylj07Q","uLtKs14FLR","t98iWgIYvE","Ul4a19XyT9",
+"jtn0Xrhl0J","CIShGJKWYR","jfREuQworu","pAhR1K4GS8","uJScXpAhR1","Gv3FqYh1hF","lsQGohe9IA","s7MxkM3zXL","0YAGHOxWIH","MmsIotvdkD",
+"aDGtSuvf7A","ECMvUpiJSk","FFDuiBFkb8","YjB9t24ARF","euZA50PktI","1LB1LX6Pin","0PktIvOqCE","QnJ1S0PktI","Chuy3cmXIX","5nmWvRkQke",
+"oQ87r8TxD7","QssNCuPX7G","1v5hH9iGoT","pFrrlyofH3","RmDcrDQimp","BGaQYMaJQs","euZA5wiHrZ","RxrsmYf2Ec","U3yw5s4786","X6PinoGu6x",
+"BbwgAFNYIM","1j5L8YOfrY","MGlTFTCgPp","VNCPdEOE1o","VBjhzAmdQd","S2DfujeskS","n8pJ9MGlTF","pWiOskZANm","BCxeCtvdkD","SjskQUl4a1",
+"Cp3mZrKDLJ","azIWpEoToP","fmIK1NcICA","0BmCylkMUA","jzUqRIBe8k","GSQwjFcWrW","7fsYMS2Dfu","RmDcrVjCZq","pvgjSjS1aj","Cfgr3NhXdu",
+"AkKTkiwzGk","GrDg7618Di","azIWpDG4sT","ydG8UydG8U","CK5W7U3yw5","I7p2afLNg8","sx5GlfaHir","Yw2oU45cIH","Z4I1vdmoS7","LbRTH2hEEU",
+"pT8wuwDajX","lCMxyuTacx","wDajXcQOnv","D6rByAXpwE","uLtKsatef2","RxrsmFFDui","uupzkHfyNQ","uJScX5nmWv","DLhzMuN6r3","EoToPhE1Ql",
+"n8pJ9uN6r3","In3NSdjsrv","n8pJ9djsrv","kB5nP2TRI7","yofH3uN6r3","YOfrYFnPFB","FNYIMWaim6","v2eC3suY4x","qUJMdWMiS3","MGlTFFNYIM",
+"GSQwjprNT6","OUqFMMm8si","zY1GYQnJ1S","gjUTuix74r","In3NSRzaZA","pmeCd2ZHdk","mz8gxaDGtS","OxWIHlViBv","l83Udo8Uyd","2TRI7guMb8",
+"XflUq2hEEU","2TRI72ZHdk","9rlg9okgRi","3weIFZhwG1","CdyBVcmXIX","euZA5No0Qb","RkQkeqUJMd","OHaBzvOqCE","qUJMdgf8rI","JRJQBHP433",
+"OxWIHtaOXK","FNYIM1j5L8","RzaZAIn3NS","tl72WhE1Ql","pmeCdpT8wu","YjB9tzmLYD","aDGtS29QAz","24ARF7X3uy","NhXduwiHrZ","hSSvQDG4sT",
+"uPX7GaDGtS","Oz8yZhE1Ql","CqqaDuJScX","zY1GY48cHL","580YDKASQ8","NOHszQ6Lix","d7vjMDz1R3","LewvMqQxHP","mz8gxM3zXL","5NammFNYIM",
+"Waim6Yf2Ec","HRxd8fcwDa","HzZT8o8Uyd","yEfy9UlU3M","uN6r3tAOsr","WPmlxuPX7G","ru4UGIBe8k","soy9tFPfSE","UmaEvKASQ8","GrDg7LewvM",
+"MK07Y4dEz6","S2DfuMmKGJ","AkKTk4W0Tl","oQ87rJkzUn","y94nwiwzGk","JJs5mP6bcg","vLsmSQnJ1S","9rlg9WPmlx","AkKTk9XyT9","pv0i7POUYS",
+"Vprf2hi5X7","3otm6gjUTu","VIlwPMmsIo","8FmFHMmsIo","d85a9Ta8f6","v1HlnaL6AJ","W3VFHjS1aj","WDVWJEdBKc","uAWypuLtKs","NhXdu2Yz7E",
+"YjB9tDz1R3","MmsIoY1mC0","ksJbyRACuj","taOXKblLA9","fmIK1dQ586","QWxoTWaWsv","n1pmOcmXIX","xReeciKqhr","Zv7z01LB1L","BFkb8Chuy3",
+"i7WMQFjHXR","5ZaEzvkCHH","oGu6xYjB9t","Waim6JJs5m","RBhp05Drn0","pFrrlBpYhV","faHirlpF6W","ru4UGh1zcH","6AFT07ku1p","VerEA45cIH",
+"Y1mC0Ss0Zu","FGzgpOz8yZ","POUYSRzaZA","ZUnqtuLtKs","SjskQd85a9","9rlg9jeskS","0ao3lLDk6f","ksJbyni2v1","Zv7z0MmsIo","ulk41POUYS",
+"Vprf2MezSW","Ul4a1v8yFN","rKDLJNOHsz","MK07YCxVEf","cQOnvReKEW","lkMUA5IhmG","YjB9tQYxC0","d85a9fmIK1","atef2XflUq","L7cGczbIYY",
+"gtCA5yvOMI","aFFsspv0i7","soy9t3weIF","JRJQB5IhmG","oQ87r5IhmG","uQIczaL6AJ","sqVrftaOXK","KsjRKGSQwj","NAFuwDLhzM","ReKEWWreyP",
+"FGzgplsQGo","Yh1hF0MR5X","yToGWOUqFM","EOE1o6AFT0","nnP8oksJby","CIShG2Yz7E","5nmWvgf8rI","ReKEWni2v1","azIWpjiVBP","jS1ajQChxs",
+"SbRYy0ao3l","NOHszqUJMd","fFDrJ0h1b1","5Drn0ThjNn","OUqFMIKxdL","pT8wu7hyVv","2DREsIjTwP","djsrvzY1GY","uZPqgFnPFB","1j5L8x3LDe",
+"Q6LixogLgc","GSQwjyEfy9","y94nwI7p2a","8cVD3QChxs","45cIHDG4sT","tjQxsvkCHH","Ta8f6FcWrW","6q6L9POUYS","I7p2aFGzgp","i7WMQHfyNQ",
+"MmKGJVerEA","b29RJOHaBz","fmIK1Twano","GrDg7vOqCE","qQxHPjzUqR","fcJOyulk41","PYBf4Yf2Ec","hUTw7S77LH","5ZaEzQClRL","0ao3l07n1c",
+"fcwDa2hEEU","d7vjMGv3Fq","MGlTFuLtKs","3otm6CNHmv","vkCHHmX2GE","VLTy6zFgtB","NOHszcQOnv","fmIK1iwzGk","jeskSQClRL","zQt6QgtCA5",
+"Ul4a1tlILt","xciqpX6Pin","9eoRcUvlv4","BGaQYiqv4k","X6PinlkMUA","azIWpvOqCE","t98iWOHaBz","v1HlnQWxoT","8xEKzK20wK","CIShGK20wK",
+"55rfBJXljW","Uvlv4ydG8U","BFkb8fFDrJ","kB5nPMezSW","uJScXzHF1q","5ZaEzSbRYy","FjHXRjiVBP","fcJOyLewvM","EoToPuZPqg","QYxC0ydG8U",
+"EOE1oKsjRK","TXQ0Zsoy9t","gdQsSkB5nP","gjUTugjUTu","9GXkXiKqhr","v8yFNb29RJ","16lHcZzJHW","BFkb85Namm","5ZaEzoQ87r","W7cTsMGlTF",
+"cL0aEhSSvQ","0YAGHQClRL","bgJAz5Mg9r","jSjS3S2Dfu","IRh48QChxs","lXFOBOHaBz","taOXKwiHrZ","iB08lHfyNQ","4QMc9aFFss","StlDJXyPZN",
+"oGu6xF6PT2","2hEEUdQ586","FFDuiciuWz","YOfrYbrhlQ","pvgjSOxWIH","OUYuFDz1R3","LewvMReKEW","J2mQiLewvM","lpF6Wv8yFN","prNT6jtn0X",
+"W3VFHVprf2","BCxeCOUYuF","QChxs9XyT9","FLsph14FLR","lj07QD6rBy","OHaBzPb1pa","Yf2Ec0PktI","CdyBV8xEKz","qUJMdlweGy","OUqFMrKDLJ",
+"9GXkX5Mg9r","2TRI7AOgEe","B3qemIKxdL","L7cGcazIWp","MezSW07n1c","azIWpHfyNQ","4dEz6jSjS3","9XyT9POUYS","tuDySaDGtS","qaofNazIWp",
+"C2Irc29QAz","zqH0WAXpwE","tAOsrS77LH","FGzgp2Nslm","VerEAbrhlQ","zbIYYtlILt","PYBf4G1RhS","uZPqgtl72W","o8Uydmz8gx","uN6r3xReec",
+"AgJHQazIWp","JRJQBVerEA","I7p2admoS7","RACujuupzk","iB08llXFOB","Ta8f6C2Irc","yEfy9gtCA5","Q6hMCaFFss","qUJMdpAhR1","ogLgcydG8U",
+"jSjS35Mg9r","SbRYyFVMxo","MK07YFwEJz","LewvMblLA9","iwzGkNhXdu","h1zcHFFDui","45cIH9rlg9","RkQkeWreyP","FjHXR5Mg9r","jfREuzQt6Q",
+"2hEEUQClRL","VLTy65ZaEz","QbxXcFnPFB","n8pJ99eoRc","MezSWDG4sT","AgJHQ07n1c","o8Uydzz4ZU","Mm8siOUqFM","RmDcrzmLYD","580YDUvlv4",
+"UlU3MQ6Lix","pWiOstvdkD","ogLgc6q6L9","P6bcgJRJQB","GXdoHDQimp","5Mg9rpAhR1","24ARFQYxC0","hSSvQhUTw7","rz7UtuLtKs","RpBQmW3VFH",
+"gdQsSMGlTF","ZhwG1ZUnqt","m4bxUkB5nP","XyPZNnnP8o","zFgtBsoy9t","C2IrcThjNn","Q6hMCfcwDa","0Wr5yJIqXi","VNCPdAkKTk","NAFuwlsQGo",
+"pWiOsBpYhV","16lHcECMvU","BCxeCoQ87r","zQt6QGrDg7","pvgjS8U2nU","prNT6CK5W7","M3zXLxXTI4","zqH0WuoStw","fcwDayluBx","ReKEWblLA9",
+"ZhwG1zqH0W","Yf2EcChuy3","X6PinFcWrW","4QMc9LewvM","qQxHPuupzk","hUTw7YOfrY","aFFssfFDrJ","Y1mC0FPfSE","X6Pin7X3uy","4W0TlSs0Zu",
+"bZLvSuQIcz","rKDLJZ4I1v","BpYhVW7cTs","HzZT8Yh1hF","DLhzM7fKYU","IRh48RpBQm","hSSvQBGaQY","Pb1paWmadA","IRh48blLA9","M6qcGJIqXi",
+"vOqCE5ZaEz","PYBf4Ss0Zu","BFkb8jzUqR","XyPZNwDajX","GXdoHRBhp0","bZLvSKZamH","aFFssaez9y","taOXKF6PT2","7ku1pnFqik","EOE1oVBjhz",
+"xXTI4dhSuH","3weIFBCxeC","2TRI7RsQUq","RxrsmOxWIH","K4GS8HlUbF","MojnPuN6r3","8FmFHpAhR1","HzZT8vLsmS","kZANmzFgtB","5drc6B3qem",
+"vkCHH24ARF","MmsIoyluBx","n8pJ9CIShG","tuDyS5Drn0","BCxeCo8Uyd","dQ586WDVWJ","QnJ1SM6qcG","dhSuHfaHir","14FLR29QAz","5drc6Gv3Fq",
+"0PktIdjsrv","TCgPplpF6W","Gv3FqM6qcG","3weIFHRxd8","1v5hHPYBf4","oQ87rCxVEf","uQIczk85Ae","RzaZAeuZA5","7hyVvHfyNQ","ThjNnQYxC0",
+"uTacxVerEA","gIYvE7hyVv","qaofNC2Irc","mX2GEMaJQs","iB08lNOHsz","OHaBzDcpWB","FcWrWWMiS3","DG4sTSWfou","yluBxjtn0X","QnJ1SpvgjS",
+"blLA92Yz7E","2ZHdklpF6W","k85AeSjskQ","Ta8f67ku1p","FhtglRmDcr","2ZHdkRzaZA","uJScXlsQGo","l83UdKZamH","SmGzv1j5L8","HzZT8gjUTu",
+"xReecgtCA5","d85a9piJSk","M6qcGFnPFB","X6Pin9eoRc","64s8NWaim6","dQ586uZPqg","L7cGcLDk6f","POUYSRBhp0","lpF6Watef2","6q6L9Rxrsm",
+"HlUbFjiVBP","2hEEU4dEz6","Qworu5nmWv","s4786fLNg8","YjB9tmX2GE","CxVEflpF6W","5drc6VIlwP","7hyVvMezSW","SjskQbrhlQ","5drc6kB5nP",
+"uupzkAkKTk","uTacx3weIF","b29RJDG4sT","Yh1hFulk41","QWxoTWaim6","YOfrYtlILt","5ZaEzZv7z0","VerEAyluBx","tAOsrMK07Y","ksJby0YAGH",
+"jiVBPvOqCE","uTacxECMvU","0Wr5yFGzgp","jfREu6q6L9","S2DfuX6Pin","FNYIMDG4sT","55rfBMGlTF","RpBQm4dEz6","QworuWMiS3","KsjRK07n1c",
+"zFgtBNxx9V","HfyNQK20wK","hSSvQqUJMd","yofH3pvgjS","lkMUABFkb8","ThjNnuQIcz","a00b5v2eC3","1j5L8Ul4a1","5VZjSWaWsv","JJs5m0MR5X",
+"atef2Nxx9V","5Mg9r3weIF","MGlTFuAWyp","5iGN5BFkb8","lCMxyEoToP","bZLvSWPmlx","07n1cDLhzM","CNHmv3weIF","Z4I1vksJby","HRxd8KZamH",
+"Ta8f6MK07Y","No0QbIjTwP","AgJHQIRh48","zFgtBP6bcg","Vprf2VjCZq","mX2GEv2eC3","AkKTk6q6L9","64s8NcQOnv","uJScXFVMxo","fqypy24ARF",
+"RkQkeMmKGJ","55rfB24ARF","hSSvQ8hJdt","uN6r3Pb1pa","wiHrZbZLvS","zHF1qy94nw","0PktIZhwG1","5VZjSWaim6","cShY2I7p2a","qUJMdFwEJz",
+"2ZHdkCp3mZ","QYxC0ThjNn","RzaZAwDajX","yToGWSWfou","o8UydcL0aE","pFrrld7vjM","POUYSsoy9t","lH1ktWaim6","QClRLyToGW","uQIczlkMUA",
+"FcWrWCIShG","iwzGkAIYUu","JKWYRhi5X7","W7cTsS2Dfu","BGaQYW3VFH","uZPqgGSQwj","tuDySW7cTs","JKWYRnnP8o","2NslmRBhp0","4dEz6HRxd8",
+"0BmCyBGaQY","jiVBPguMb8","GrDg7FcWrW","Zv7z0WreyP","618Di9iGoT","Nxx9VTwano","SbRYygIYvE","SWfouzFgtB","In3NSgIYvE","pFrrlxXTI4",
+"CNHmvuvf7A","YOfrYjS1aj","mX2GEReKEW","I7p2aKASQ8","TXQ0ZBbwgA","blLA9TXQ0Z","YjB9tzQt6Q","5drc6EoToP","QbxXcBbwgA","QYxC0IRh48",
+"h1zcHoGu6x","dhSuHv2eC3","vkCHH45cIH","nFqikdjsrv","9eoRcY1mC0","G1RhS4W0Tl","9rlg907n1c","MmsIoCp3mZ","2Yz7EeuZA5","MaJQsYf2Ec",
+"FLsphNOHsz","uupzkRkQke","yofH3gtCA5","KZamHQssNC","UlU3MHlUbF","MK07YFhtgl","ThjNnhYBCK","Zv7z0oGu6x","BpYhVtjQxs","9GXkXhe9IA",
+"K20wK0YAGH","lViBviwzGk","IBe8kKsjRK","QChxs0MR5X","ZuDtDpAhR1","blLA9PYBf4","ru4UG16lHc","aDGtS16lHc","ksJbyydG8U","RpBQmpAhR1",
+"prNT6ydG8U","29QAzJkzUn","aDGtShUTw7","7hyVvZuDtD","LDk6fFwEJz","IjTwPtjQxs","4W0TlNOHsz","Pb1pafqypy","n1pmOHP433","s4786DcpWB",
+"ni2v1ix74r","QClRLlCMxy","LbRTHZv7z0","nnP8oI7p2a","oGu6xpT8wu","tvdkDcmXIX","HRxd8sx5Gl","3weIF6AFT0","nFqikF6PT2","0PktIlH1kt",
+"yluBxaDGtS","NcICAFPfSE","xciqpOxWIH","0YAGHGv3Fq","P6bcgJ2mQi","MaJQs8U2nU","JIqXiFxX9q","8xEKzFwEJz","5nmWvciuWz","Ta8f6Y1mC0",
+"7Ow5CWPmlx","lkMUACdyBV","7ku1pWPmlx","1v5hHpWiOs","dmoS7MezSW","ksJbyRmDcr","vOqCEkZANm","QworuWaWsv","euZA5nFqik","tjQxsGrDg7",
+"U3yw5gdQsS","ZUnqt29QAz","nlaBy9iGoT","QnJ1SXyPZN","iKqhrt59lR","yToGWjeskS","v1Hlnv8yFN","lm0pDRpBQm","zQt6QCfgr3","t59lRfcJOy",
+"CIShG0MR5X","uTacxUlU3M","3weIFfaHir","MmsIoCNHmv","cShY2OUqFM","guMb8YOfrY","8cVD37lUXZ","Zv7z0yEfy9","1v5hHDQimp","iwzGklCMxy",
+"3otm6UmaEv","jiVBPIKxdL","QbxXc07n1c","Q6LixRzaZA","gf8rIM3zXL","rhl0JDLhzM","8FmFHGSQwj","EOE1oRACuj","Gv3Fqdpe1v","Ta8f65iGN5",
+"MojnPVLTy6","Cfgr33weIF","3otm6prNT6","29QAzOHaBz","sx5GlFcWrW","I7p2aTwano","fFDrJZv7z0","C2Irc6q6L9","brhlQ0MR5X","DQimpVIlwP",
+"djsrvpAhR1","5Drn0KsjRK","atef2Waim6","HRxd8Ul4a1","LDk6fOz8yZ","jS1ajIn3NS","Oz8yZxXTI4","L7cGcRmDcr","i7WMQfmIK1","sqVrfNhXdu",
+"JRJQBS77LH","9y4lwYf2Ec","8TxD7gtCA5","zbIYYlsQGo","TXQ0ZCdyBV","ydG8UguMb8","KZamHgdQsS","kZANmHlUbF","K4GS8Chuy3","ZJTXHuupzk",
+"MojnP5iGN5","tvdkDRkQke","piJSkPOUYS","n8pJ99y4lw","P6bcg8xEKz","uupzkgIYvE","wDajXVLTy6","YOfrYv8yFN","K4GS8soy9t","rKDLJzQt6Q",
+"14FLRuQIcz","nlaByRACuj","FLsphcmXIX","zFgtBuQIcz","JKWYR9y4lw","Mkgy8QClRL","Kr8ysNAFuw","VerEANhXdu","B3qemNcICA","5ZaEzCNHmv",
+"JKWYRhYBCK","POUYSNAFuw","Chuy3MezSW","Cfgr314FLR","FjHXRStlDJ","tuDySMezSW","nFqikM6qcG","he9IARkQke","7lUXZYOfrY","Vprf2jeskS",
+"JRJQBMkgy8","NOHszlsQGo","IRh482hEEU","QWxoTWreyP","ECMvUnFqik","mX2GEBGaQY","OUqFMkZANm","zY1GY7Ow5C","P6bcgO3iyQ","jzUqRQbxXc",
+"iKqhrAmdQd","cL0aE0Wr5y","In3NSQWxoT","oGu6xlpF6W","No0QbUlU3M","IRh487X3uy","sx5GlAgJHQ","QnJ1SuN6r3","AXpwE618Di","GWqqX0MR5X",
+"QnJ1SHfyNQ","mz8gxpFrrl","tjQxsX6Pin","NcICAjfREu","lViBvHfyNQ","EoToPMojnP","cL0aElkMUA","7X3uyX6Pin","yToGWjiVBP","i7WMQoVQp6",
+"ZhwG1WPmlx","qaofNxXTI4","dmoS7Nxx9V","vkCHHIjTwP","GrDg7M3zXL","cShY2fFDrJ","v2eC3jSjS3","KsjRKaL6AJ","rz7UtSjskQ","2ZHdkJ2mQi",
+"t98iWOxWIH","S77LHbZLvS","EoToPZzJHW","tuDySXflUq","ix74rlXFOB","tjQxsYh1hF","y94nwPb1pa","TXQ0ZG1RhS","he9IAfLNg8","48cHLi3pyd",
+"MaJQsiqv4k","580YD5Drn0","wDajXTXQ0Z","tlILtogLgc","9eoRcjfREu","rhl0Jlj07Q","7hyVvWaim6","CK5W7ksJby","Kr8ysFjHXR","hE1QlfcwDa",
+"W7cTsReKEW","VNCPdxciqp","Chuy3xciqp","ThjNnSjskQ","JRJQBJXljW","uN6r3guMb8","JXljWQssNC","LbRTH0PktI","o8Uydni2v1","fLNg8qQxHP",
+"xciqp5IhmG","tuDySbZLvS","s7Mxk5VZjS","ZzJHWlCMxy","MojnPDcpWB","VNCPd8hJdt","sx5GlSWfou","Dz1R3WreyP","faHir2TRI7","7Ow5C0BmCy",
+"wiHrZFwEJz","wiHrZIKxdL","No0Qby94nw","8U2nUHP433","gjUTuThjNn","qUJMdGSQwj","rKDLJVNCPd","0ao3lMmKGJ","0Wr5y5drc6","I7p2aBpYhV",
+"CqqaDEoToP","pAhR1yluBx","RpBQm0MR5X","GXdoHcmXIX","5IhmGSWfou","lCMxyv8yFN","CdyBV7ku1p","AkKTk1j5L8","jSjS36q6L9","6q6L97fsYM",
+"HlUbFYOfrY","RkQken1pmO","VIlwPcmXIX","uN6r3Mm8si","BpYhVHfyNQ","lXFOB1v5hH","BpYhVfcJOy","qaofNoQ87r","rz7Ut8xEKz","t98iWDLhzM",
+"UmaEvt98iW","JRJQBnnP8o","In3NSpT8wu","S77LHsoy9t","WPmlxM6qcG","xciqpmX2GE","suY4xMGlTF","2NslmjSjS3","Gv3Fq2Yz7E","aFFssokgRi",
+"yluBxW7cTs","8cVD3sx5Gl","pT8wuHzZT8","euZA5hi5X7","OUqFM2TRI7","WMiS3Oz8yZ","0ao3lQWxoT","b29RJSbRYy","1j5L8FGzgp","MGlTFgjUTu",
+"Yh1hF5drc6","bZLvSlViBv","618Di8hJdt","2Yz7EQ6hMC","v2eC3i7WMQ","prNT65VZjS","OHaBzDLhzM","Yh1hFlsQGo","4W0TlvOqCE","Chuy3prNT6",
+"RkQke4W0Tl","pv0i7O3iyQ","7hyVvcL0aE","7fKYUSWfou","uupzkRsQUq","FxX9q9y4lw","nlaByqQxHP","VBjhzRxrsm","FFDuizY1GY","LbRTHaDGtS",
+"vkCHH5iGN5","lweGysqVrf","QssNCjtn0X","VBjhzL7cGc","qQxHPOHaBz","IKxdLkZANm","5IhmGYOfrY","0Wr5yCNHmv","TXQ0ZxReec","G1RhS4QMc9",
+"b29RJMkgy8","VLTy6aez9y","lH1ktBFkb8","lweGySs0Zu","oGu6xYh1hF","uJScXtlILt","Zv7z04QMc9","yluBxtvdkD","618DiZ4I1v","NAFuw2ZHdk",
+"BGaQYAXpwE","oGu6xsuY4x","Z4I1v2hEEU","pFrrlVNCPd","TXQ0Zo8Uyd","HP433GXdoH","EdBKceuZA5","FNYIMv2eC3","ZhwG1LewvM","VerEAFNYIM",
+"kB5nPtaOXK","POUYSYw2oU","MezSWmz8gx","45cIHFhtgl","MezSWtl72W","QWxoTMm8si","jiVBPs4786","Yf2Ec2hEEU","YjB9tS77LH","i7WMQFLsph",
+"5nmWvxciqp","uupzkyluBx","hi5X7rhl0J","aFFssTXQ0Z","Y1mC0EoToP","zbIYY6q6L9","S2DfuIRh48","gf8rI14FLR","ydG8U2TRI7","JKWYRciuWz",
+"QssNCIjTwP","Chuy37lUXZ","ZhwG1AXpwE","uvf7AhE1Ql","07n1cwDajX","GrDg7hYBCK","v1HlnECMvU","Q6hMC5Namm","kB5nP5iGN5","16lHc580YD",
+"RmDcrMGlTF","YOfrYgIYvE","4dEz6fLNg8","dhSuHYw2oU","9iGoT45cIH","FcWrWSWfou","v1HlnVNCPd","SmGzvOHaBz","vOqCETXQ0Z","lpF6Wuupzk",
+"M3zXL7lUXZ","m4bxUYOfrY","CxVEfcmXIX","0PktIXyPZN","7lUXZbgJAz","blLA9pvgjS","W7cTs64s8N","hUTw78hJdt","Qworu2Yz7E","lm0pD1LB1L",
+"n1pmOSs0Zu","K4GS8qQxHP","In3NS618Di","he9IAQClRL","Vprf2K20wK","Yh1hFlXFOB","64s8Npv0i7","dpe1vqUJMd","JKWYRksJby","kB5nPXflUq",
+"Chuy3uPX7G","jS1ajjfREu","0Wr5yqUJMd","No0QbQWxoT","e6e4zQ6Lix","QYxC0W3VFH","nnP8oW3VFH","EOE1ovOqCE","5VZjSLbRTH","KASQ8VIlwP",
+"MK07Y8hJdt","F6PT2guMb8","piJSkFcWrW","16lHcCdyBV","hE1Qlzz4ZU","Chuy37fsYM","Gv3FqWPmlx","h1zcHStlDJ","QYxC0Y1mC0","Cp3mZgtCA5",
+"suY4xuvf7A","5Drn0n1pmO","uN6r37fKYU","uTacxI7p2a","3otm6CK5W7","Zv7z0h1zcH","xXTI4JRJQB","WPmlxMmsIo","cShY214FLR","hSSvQv1Hln",
+"qUJMdFcWrW","Yh1hFC2Irc","yofH3uZPqg","RACujOHaBz","kB5nPlXFOB","W7cTsW3VFH","L7cGcFxX9q","BGaQYAOgEe","KASQ84dEz6","Oz8yZ7X3uy",
+"brhlQl83Ud","QChxsFVMxo","1LB1L8RCUA","n1pmOcShY2","VjCZq55rfB","pWiOsJkzUn","Yw2oUtAOsr","QworudmoS7","7X3uywDajX","Twanolj07Q",
+"Cp3mZLewvM","PYBf4tjQxs","FnPFBAmdQd","24ARFIjTwP","iqv4kPYBf4","tlILtEoToP","D6rByJ2mQi","EdBKcydG8U","UlU3MGXdoH","JIqXiP6bcg",
+"lViBvtAOsr","FhtglQ6hMC","cmXIXdjsrv","Zv7z0kB5nP","FPfSEEoToP","CqqaDuAWyp","Zv7z0v8yFN","MmsIofaHir","DcpWB07n1c","ulk41CdyBV",
+"DQimp16lHc","JRJQBUl4a1","QnJ1SprNT6","NAFuwAXpwE","l83UdCdyBV","Dz1R3xReec","kZANmM6qcG","StlDJSjskQ","nnP8oYf2Ec","mX2GEI7p2a",
+"gtCA5Fhtgl","Cfgr3KsjRK","2DREsCK5W7","EoToPYh1hF","0MR5XfcwDa","pvgjS3weIF","2TRI75Drn0","YOfrYk85Ae","jeskS14FLR","oVQp63weIF",
+"8RCUAeuZA5","JRJQBVprf2","jzUqRGSQwj","s7MxkUvlv4","ReKEWBCxeC","B3qemGv3Fq","uupzkzY1GY","14FLRFwEJz","lweGyB3qem","pAhR1ZzJHW",
+"m4bxUNo0Qb","uupzkUlU3M","VjCZqsx5Gl","AmdQdW3VFH","qQxHPlCMxy","7Ow5Crz7Ut","hSSvQiB08l","cL0aEFjHXR","dQ586GWqqX","fmIK1No0Qb",
+"Q6LixrKDLJ","2hEEUDcpWB","EoToPCNHmv","2ZHdkuTacx","6q6L9iwzGk","NcICAVNCPd","Nxx9Vmz8gx","ix74rQYxC0","0ao3l5drc6","Nxx9VEdBKc",
+"Yh1hF8hJdt","1j5L8pv0i7","1j5L8taOXK","7fKYUSs0Zu","t98iWF6PT2","Y1mC0gIYvE","SjskQ0YAGH","ZuDtD0YAGH","45cIHqQxHP","yvOMIChuy3",
+"uvf7Ab29RJ","tlILtyToGW","dhSuHs7Mxk","d7vjM7fKYU","9rlg9SmGzv","uZPqgVerEA","tl72Wi3pyd","fmIK1pmeCd","v8yFN5iGN5","Kr8ysRzaZA",
+"FnPFB2Nslm","IBe8k0ao3l","16lHcUlU3M","9XyT9aFFss","zz4ZUzQt6Q","IjTwP8FmFH","uTacxRmDcr","BCxeCzY1GY","8xEKzs93Ml","GXdoHRACuj",
+"k85AeZv7z0","GWqqXuoStw","MGlTFMmsIo","7lUXZGrDg7","lViBvMK07Y","FwEJzqQxHP","K20wKoGu6x","14FLRS77LH","Q6Lix7ku1p","9y4lwP6bcg",
+"Uvlv4qQxHP","he9IAs93Ml","G1RhSbgJAz","yvOMIMojnP","AmdQd8hJdt","QYxC0AgJHQ","d7vjMCIShG","7fKYUJIqXi","K20wKKr8ys","jeskSbrhlQ",
+"SWfoudhSuH","W3VFHQssNC","9GXkXiB08l","Waim6sqVrf","FFDuiEOE1o","HlUbFSjskQ","J2mQiyvOMI","fqypyDG4sT","K4GS89XyT9","K20wK0Wr5y",
+"OxWIHru4UG","lXFOB16lHc","faHirCNHmv","WDVWJrhl0J","L7cGcWaim6","uQIczWreyP","5nmWvJRJQB","48cHLb29RJ","lViBvVBjhz","Zv7z0StlDJ",
+"C2IrcTwano","t98iWY1mC0","SWfoulm0pD","8TxD7CIShG","HRxd8lm0pD","FjHXR1j5L8","JIqXi9rlg9","BGaQYHzZT8","d85a9Mm8si","Uvlv4Kr8ys",
+"gf8rIlm0pD","YOfrYgtCA5","JJs5mHzZT8","tvdkDRzaZA","SbRYyvOqCE","tuDyS5drc6","2hEEUBbwgA","VLTy6rhl0J","xXTI4lsQGo","pvgjSb29RJ",
+"5nmWv7fsYM","v8yFNciuWz","8RCUAvOqCE","aFFssxciqp","fqypyF6PT2","7hyVvZJTXH","45cIHWDVWJ","FNYIMD6rBy","tuDySSjskQ","fcJOy7ku1p",
+"DG4sTsqVrf","piJSkVLTy6","dpe1vhYBCK","ZUnqtIn3NS","h1zcHyofH3","VLTy6Y1mC0","n1pmOogLgc","sx5GlCfgr3","QnJ1SGv3Fq","he9IAxReec",
+"sx5Gl9iGoT","FnPFBe6e4z","ZzJHW2Nslm","7X3uy0PktI","VNCPdjiVBP","tuDySuQIcz","5NammiB08l","GWqqXHP433","hYBCK4QMc9","fLNg8hSSvQ",
+"Pb1paaDGtS","ni2v12hEEU","X6PinjS1aj","24ARFxciqp","2Yz7Euupzk","P6bcgF6PT2","MmsIoYf2Ec","BpYhVYjB9t","9eoRcuQIcz","7ku1pK4GS8",
+"1v5hHuAWyp","k85AeOUYuF","iKqhrNOHsz","ydG8UOHaBz","ogLgcHzZT8","WreyPix74r","zbIYYfcJOy","MGlTFRpBQm","L7cGcyvOMI","GrDg70h1b1",
+"Dz1R3OxWIH","JRJQB3weIF","L7cGcRzaZA","iwzGkcQOnv","5VZjSsqVrf","n1pmORxrsm","Yw2oUSbRYy","FNYIMW3VFH","Uvlv4MojnP","3weIFs4786",
+"gtCA5pvgjS","8U2nUru4UG","jSjS3O3iyQ","iqv4k580YD","MK07YprNT6","45cIHuvf7A","lm0pDBGaQY","djsrvG1RhS","7fsYMYh1hF","FjHXRYw2oU",
+"9GXkXKsjRK","wDajXZUnqt","UlU3Ms4786","MezSWS77LH","yToGWgIYvE","BCxeClsQGo","azIWpKr8ys","lCMxyGSQwj","5iGN54dEz6","i7WMQuLtKs",
+"WMiS38TxD7","ZzJHWJ2mQi","No0Qb2Yz7E","bgJAzyEfy9","m4bxUmX2GE","kB5nP5nmWv","FnPFBrz7Ut","RzaZASbRYy","VjCZqHfyNQ","W7cTsuN6r3",
+"KsjRKjeskS","lsQGo8U2nU","OUYuFb29RJ","lCMxyqQxHP","JkzUnWPmlx","tvdkDjSjS3","U3yw5euZA5","VerEATa8f6","mz8gxuTacx","K4GS8FxX9q",
+"uvf7Ay94nw","6q6L9Y1mC0","5Drn0yEfy9","h1zcHjfREu","ydG8UMkgy8","atef2CxVEf","Zv7z0ydG8U","MaJQs55rfB","hi5X7RzaZA","djsrvSjskQ",
+"FLsphtjQxs","RACujrz7Ut","d85a9nFqik","Yh1hFoGu6x","jSjS3ZhwG1","YjB9t9iGoT","GrDg7lsQGo","JXljWAIYUu","dpe1v1v5hH","ZzJHWY1mC0",
+"IRh48s7Mxk","I7p2aZv7z0","i7WMQsqVrf","zqH0WKr8ys","8RCUAY1mC0","hUTw7RACuj","RkQketuDyS","G1RhSIKxdL","EdBKcBCxeC","ReKEWThjNn",
+"4W0TlEoToP","0BmCygtCA5","9rlg9uPX7G","RmDcrbgJAz","OHaBzCxVEf","TXQ0ZQworu","QbxXcgtCA5","vkCHHpmeCd","WreyPPb1pa","hi5X7hi5X7",
+"tlILtkB5nP","MezSWQYxC0","qUJMdK20wK","h1zcHatef2","CK5W7NOHsz","OUqFMciuWz","X6PinNOHsz","7Ow5ChUTw7","pAhR1ciuWz","K4GS8uoStw",
+"0BmCygdQsS","O3iyQ24ARF","RzaZARBhp0","zQt6QkB5nP","NcICAIRh48","CIShGW3VFH","JRJQBL7cGc","4dEz6oVQp6","XflUqNAFuw","W7cTsmX2GE",
+"7fKYU9y4lw","atef2o8Uyd","FxX9qWPmlx","5IhmGlkMUA","lweGyrz7Ut","7Ow5Cfqypy","RACujgtCA5","45cIHQssNC","zFgtBNo0Qb","jfREut59lR",
+"JRJQB4dEz6","xXTI4D6rBy","Z4I1vRpBQm","Mkgy8xXTI4","64s8N9GXkX","4QMc9jtn0X","0PktICp3mZ","9eoRcEdBKc","lViBvn1pmO","zmLYDNhXdu",
+"sx5GlD6rBy","4QMc9RpBQm","2ZHdkSbRYy","QChxspv0i7","TwanozFgtB","0PktIRmDcr","MaJQsaFFss","POUYSpvgjS","AIYUupFrrl","In3NSUmaEv",
+"jSjS3RBhp0","FcWrWs7Mxk","bZLvShSSvQ","7Ow5CcShY2","5IhmGFVMxo","s4786gdQsS","IjTwPFNYIM","pWiOsuLtKs","S77LHtlILt","2ZHdkWPmlx",
+"aez9y8xEKz","lH1ktzY1GY","OxWIHHRxd8","FLsphgf8rI","lweGy4dEz6","4dEz6pAhR1","uTacxQssNC","KsjRKRsQUq","GWqqXzbIYY","JKWYRuPX7G",
+"yofH3s4786","Q6LixG1RhS","GSQwjtlILt","ix74r2Nslm","tvdkDMojnP","tvdkDix74r","tvdkDKsjRK","FnPFBL7cGc","QnJ1SyluBx","AIYUugf8rI",
+"hSSvQOUqFM","Mkgy81v5hH","RsQUqix74r","FcWrW5Mg9r","5Nammfqypy","4QMc9BpYhV","dQ586F6PT2","nnP8odpe1v","zQt6QRkQke","tAOsrVerEA",
+"aDGtSFFDui","0BmCyatef2","oVQp6ZUnqt","WaWsvi3pyd","pT8wuqUJMd","piJSkJKWYR","SbRYyi3pyd","hSSvQPYBf4","yluBxCxVEf","ThjNnuN6r3",
+"0h1b1MmsIo","O3iyQlH1kt","FPfSEv1Hln","ReKEW8TxD7","wiHrZYh1hF","v2eC3Uvlv4","Uvlv4QssNC","tAOsrSs0Zu","FxX9qJIqXi","9eoRcNhXdu",
+"JRJQBsqVrf","5drc6uupzk","JkzUnsx5Gl","RmDcrnlaBy","FGzgptlILt","WDVWJL7cGc","i7WMQlViBv","O3iyQaDGtS","MGlTF4W0Tl","jS1ajWDVWJ",
+"piJSkAOgEe","5Mg9r580YD","5iGN5FnPFB","prNT6yEfy9","dmoS7aL6AJ","FLsphRkQke","cL0aEBbwgA","2TRI7zY1GY","ZJTXHQChxs","1v5hH1j5L8",
+"JRJQB8FmFH","bZLvSyvOMI","guMb8FLsph","POUYS07n1c","cL0aEhYBCK","7Ow5CMmKGJ","0ao3l4QMc9","i7WMQpv0i7","cShY2EoToP","45cIHwDajX",
+"FcWrWlCMxy","Waim6IKxdL","TXQ0ZuAWyp","RkQkeAIYUu","kB5nPiKqhr","FVMxohi5X7","fcJOyM6qcG","dmoS7ECMvU","n1pmOwiHrZ","ZUnqtkZANm",
+"CxVEfFGzgp","Chuy3okgRi","W3VFH1LB1L","VIlwPrz7Ut","0h1b1blLA9","Mkgy8MGlTF","1j5L8bZLvS","bZLvS45cIH","618DiIjTwP","ksJbyjzUqR",
+"FPfSElm0pD","IKxdL0Wr5y","pT8wu5Drn0","Dz1R3zQt6Q","NAFuwmz8gx","FFDuiMK07Y","WaWsvYjB9t","8hJdtGXdoH","cShY2mX2GE","he9IAuQIcz",
+"oVQp6tlILt","G1RhS1v5hH","kZANmni2v1","9GXkXuPX7G","suY4xx3LDe","x3LDe45cIH","tjQxs9iGoT","UlU3MChuy3","zz4ZU07n1c","S2DfuTXQ0Z",
+"4dEz6gIYvE","M6qcGnlaBy","2NslmIBe8k","nnP8oQ6hMC","ulk41cmXIX","RBhp0Yf2Ec","iKqhrDLhzM","sx5Gln8pJ9","zHF1quoStw","IBe8kCqqaD",
+"IjTwPGSQwj","OUqFMbZLvS","SmGzvsoy9t","qQxHPdmoS7","S2DfuFcWrW","QWxoTW3VFH","45cIHaez9y","0Wr5yNo0Qb","uZPqgbrhlQ","B3qemazIWp",
+"pAhR1HRxd8","I7p2a8xEKz","MGlTFGrDg7","ZUnqtJRJQB","hi5X75Namm","FjHXRQbxXc","dmoS7brhlQ","hE1QloVQp6","azIWpa00b5","WPmlxBbwgA",
+"zqH0WGv3Fq","Mkgy89XyT9","ru4UGJIqXi","yToGW1j5L8","ThjNn07n1c","x3LDeaDGtS","AIYUuyEfy9","G1RhStlILt","FLsph6AFT0","SmGzvyluBx",
+"s4786GXdoH","n1pmOtuDyS","pv0i7s4786","bgJAzCqqaD","Uvlv4KsjRK","ix74ryvOMI","MmsIo5IhmG","MmKGJsqVrf","i7WMQyvOMI","b29RJ1LB1L",
+"24ARFAgJHQ","YjB9tcShY2","OUqFMQYxC0","Ul4a1VNCPd","14FLRBGaQY","BbwgADz1R3","DcpWBlH1kt","suY4xe6e4z","gf8rIulk41","FPfSEuN6r3",
+"VBjhz16lHc","07n1cXyPZN","0ao3l0YAGH","s47867fsYM","7lUXZv1Hln","prNT67X3uy","uupzkMkgy8","JXljWUlU3M","Z4I1vyluBx","AIYUuWaWsv",
+"Yh1hF7lUXZ","nlaByyvOMI","Q6hMCvkCHH","KsjRKulk41","zbIYYCNHmv","LbRTH7X3uy","QChxsHlUbF","07n1chYBCK","qQxHPyofH3","lkMUAzbIYY",
+"JXljW0BmCy","5Mg9r7fsYM","xciqpVBjhz","DcpWBOHaBz","fmIK1CK5W7","7fKYUlkMUA","SmGzvciuWz","cQOnvAmdQd","Ul4a1rz7Ut","fcwDagdQsS",
+"cmXIXjfREu","HfyNQ9y4lw","QnJ1SC2Irc","hYBCKFLsph","BpYhVChuy3","UmaEvlViBv","5nmWvydG8U","hYBCKuQIcz","atef2RsQUq","MojnP55rfB",
+"yEfy9pFrrl","VjCZqcL0aE","LewvMVerEA","blLA9aez9y","lm0pDfmIK1","1v5hHVjCZq","AgJHQK20wK","lViBvF6PT2","P6bcggf8rI","Dz1R3KASQ8",
+"n1pmOzmLYD","hUTw7Rxrsm","Ta8f6v8yFN","dhSuHMezSW","vkCHHAkKTk","M6qcGFFDui","Oz8yZvLsmS","yofH3SmGzv","1LB1LlCMxy","7Ow5C8U2nU",
+"rz7UtjSjS3","TXQ0Z5ZaEz","IBe8k29QAz","AgJHQUvlv4","dQ586MK07Y","MmsIo7ku1p","W7cTsECMvU","O3iyQVBjhz","VjCZqfLNg8","FVMxodpe1v",
+"rhl0JFNYIM","FxX9qQWxoT","ydG8UCqqaD","HP433UmaEv","2ZHdk9XyT9","IjTwPAgJHQ","2DREs5ZaEz","zQt6QiwzGk","blLA9ZhwG1","IBe8kydG8U",
+"JRJQBuN6r3","RACujfmIK1","zqH0Wdpe1v","5Mg9rMaJQs","TwanoBGaQY","jzUqRtlILt","mz8gxF6PT2","k85AeEdBKc","Mkgy8o8Uyd","WmadAtvdkD",
+"a00b5uQIcz","IRh48faHir","m4bxUCp3mZ","djsrvNOHsz","faHirDcpWB","fmIK1zFgtB","GXdoHRxrsm","mz8gxv2eC3","v1HlnqQxHP","t98iW0h1b1",
+"brhlQh1zcH","8U2nURkQke","48cHLFNYIM","MojnPtaOXK","5NammWPmlx","7fKYU4QMc9","xXTI4Chuy3","jzUqRhUTw7","xXTI4RACuj","ogLgcm4bxU",
+"6q6L9aDGtS","Waim68hJdt","QWxoTBpYhV","cQOnvsuY4x","ThjNnDG4sT","ZzJHWcmXIX","lpF6WGXdoH","FwEJzKASQ8","he9IAVjCZq","zz4ZUd85a9",
+"dmoS7x3LDe","ReKEWHRxd8","CNHmvYjB9t","DLhzMKr8ys","S2Dfuix74r","ciuWz2ZHdk","ksJbyNOHsz","9rlg9Q6hMC","jfREuwDajX","9y4lwGrDg7",
+"RxrsmxReec","sx5GlWmadA","0ao3lx3LDe","lXFOBjfREu","KZamHD6rBy","RkQkeEdBKc","Chuy3JkzUn","ZUnqtCqqaD","SWfouaDGtS","SWfouMkgy8",
+"qaofNksJby","UlU3MFVMxo","h1zcHfmIK1","B3qemSWfou","0MR5Xulk41","lH1ktdQ586","B3qemuZPqg","8TxD7Vprf2","4QMc9UlU3M","faHirjzUqR",
+"i3pyd9eoRc","tlILtvLsmS","lsQGooGu6x","ECMvU5IhmG","BCxeCI7p2a","b29RJprNT6","1j5L8euZA5","M3zXLzbIYY","MmsIokB5nP","tuDySxReec",
+"CqqaD5nmWv","FLsphk85Ae","NAFuwni2v1","zY1GYv2eC3","DcpWB5drc6","VLTy6xXTI4","ECMvUY1mC0","fcwDa5VZjS","LbRTH4dEz6","FLsphUlU3M",
+"Gv3FqUlU3M","atef2AmdQd","piJSkChuy3","EOE1od7vjM","lm0pDuTacx","KsjRKjzUqR","Cp3mZYjB9t","PYBf45iGN5","yEfy9blLA9","zqH0W0MR5X",
+"2TRI7pWiOs","5iGN5zHF1q","QClRLaDGtS","MmsIozFgtB","CqqaD48cHL","RsQUqJJs5m","9XyT9Uvlv4","aDGtSZuDtD","DcpWBuLtKs","L7cGc9XyT9",
+"jtn0Xb29RJ","ni2v1qaofN","yluBxJRJQB","JRJQBRsQUq","StlDJl83Ud","Vprf2a00b5","atef2KASQ8","7Ow5CS2Dfu","AOgEeF6PT2","aez9y6q6L9",
+"ulk41uLtKs","5Drn0aDGtS","0MR5XnnP8o","Z4I1vFnPFB","ZhwG1QWxoT","1v5hHQ6Lix","64s8NuAWyp","JkzUnlViBv","JkzUnRkQke","cL0aEguMb8",
+"NAFuwqaofN","U3yw52Yz7E","RBhp0JkzUn","K4GS8d85a9","JIqXiWMiS3","0h1b19GXkX","MaJQs1LB1L","OUYuF7lUXZ","UlU3M16lHc","29QAz0h1b1",
+"ZuDtDhUTw7","P6bcgK20wK","S77LHlkMUA","1j5L8jS1aj","55rfBEOE1o","0Wr5yuAWyp","fqypyQssNC","In3NSZzJHW","DG4sTlViBv","NOHszAOgEe",
+"6AFT0K4GS8","Q6hMCdpe1v","tuDySfLNg8","9iGoTVNCPd","vkCHHxXTI4","h1zcHblLA9","s93Ml5Drn0","QWxoTlH1kt","QYxC0hi5X7","JkzUnECMvU",
+"hE1QlaL6AJ","mz8gxfcJOy","5drc69y4lw","D6rByOUqFM","1v5hHlsQGo","uvf7AYjB9t","Dz1R3AOgEe","P6bcglm0pD","lXFOBWDVWJ","7fsYMuupzk",
+"lpF6W580YD","pmeCd6q6L9","lkMUAM6qcG","uAWypGXdoH","lj07Q48cHL","bZLvS5Namm","uAWypzHF1q","e6e4z0ao3l","BFkb855rfB","4dEz6YOfrY",
+"NOHszuTacx","ReKEWZzJHW","mX2GEAIYUu","k85Aei3pyd","pv0i7ni2v1","VBjhzgIYvE","HRxd89y4lw","ulk410YAGH","jtn0X1LB1L","tvdkDKr8ys",
+"WaWsvhUTw7","rhl0J07n1c","dmoS7faHir","X6Pin5iGN5","ulk415IhmG","uoStwfqypy","h1zcHFwEJz","6q6L9Zv7z0","gdQsS07n1c","yToGWjSjS3",
+"Vprf248cHL","S77LHRsQUq","GrDg7QClRL","K20wKNAFuw","vkCHH8TxD7","StlDJDLhzM","07n1cpAhR1","FNYIMVjCZq","CxVEfS2Dfu","9iGoTyvOMI",
+"ciuWzhUTw7","9XyT9uvf7A","dmoS7suY4x","7hyVvaDGtS","RpBQmgtCA5","hYBCK5drc6","BbwgAuPX7G","OUYuFnnP8o","5Drn0kB5nP","5IhmGlCMxy",
+"vOqCEi3pyd","lCMxysuY4x","No0QbU3yw5","ogLgclXFOB","i3pydSmGzv","vOqCElpF6W","IKxdL5ZaEz","TXQ0ZvOqCE","iqv4kDz1R3","5iGN55iGN5",
+"ZuDtDOz8yZ","3weIFVjCZq","Yw2oUEOE1o","iwzGkJRJQB","fFDrJuJScX","oGu6xI7p2a","CNHmvQbxXc","ksJbyMmKGJ","VBjhzJJs5m","9iGoTOHaBz",
+"sx5GlFnPFB","fcJOyNo0Qb","hYBCKgtCA5","gdQsSTa8f6","FxX9qGSQwj","jfREuJRJQB","tl72Wuvf7A","pv0i7MaJQs","Q6hMC8hJdt","EdBKcxReec",
+"nlaBytuDyS","7hyVvIn3NS","MmKGJblLA9","wiHrZn1pmO","2hEEUlm0pD","jS1aj1LB1L","FVMxooGu6x","mz8gxdpe1v","JkzUnMm8si","W7cTsyToGW",
+"4QMc9jS1aj","d85a9tvdkD","s93MlJRJQB","9GXkXlCMxy","gjUTu8U2nU","ZUnqt4QMc9","fLNg8ZuDtD","zmLYDJ2mQi","7ku1ptuDyS","X6PinNhXdu",
+"jiVBP64s8N","fLNg8DQimp","L7cGcyluBx","jfREu4QMc9","fLNg8tuDyS","dmoS7FcWrW","Oz8yZdjsrv","FnPFBfLNg8","9iGoTMaJQs","iwzGk4QMc9",
+"mX2GEPOUYS","b29RJgdQsS","piJSkpiJSk","uAWypOz8yZ","WreyP7Ow5C","NhXduoVQp6","YOfrYStlDJ","wiHrZNo0Qb","2Yz7EtjQxs","9rlg9EOE1o",
+"AIYUuCIShG","YjB9tAOgEe","6q6L9BGaQY","EdBKcWaWsv","2ZHdkBCxeC","Z4I1vogLgc","SWfouM6qcG","Kr8ysHzZT8","uZPqgRBhp0","YjB9t2Yz7E",
+"MezSWbgJAz","uZPqguPX7G","hYBCKJJs5m","jSjS3pAhR1","0YAGHVerEA","zHF1qW3VFH","4QMc9jeskS","fcJOy14FLR","v2eC329QAz","7ku1paL6AJ",
+"jfREuuupzk","5nmWvlpF6W","YOfrYWaWsv","pAhR1DLhzM","mX2GEpmeCd","7hyVvqaofN","Q6Lixatef2","9rlg9I7p2a","Uvlv4WaWsv","MGlTFzFgtB",
+"qQxHPWreyP","AkKTkhE1Ql","16lHclj07Q","7X3uy9GXkX","EoToP7Ow5C","vLsmSGXdoH","MK07YYjB9t","B3qemvLsmS","DQimpgf8rI","ZuDtDQnJ1S",
+"ReKEWoQ87r","Twano45cIH","uQIczzmLYD","Z4I1v8hJdt","hi5X70Kyfs","Ss0ZulCMxy","ydG8USmGzv","tvdkDQYxC0","fFDrJFGzgp","FwEJzlsQGo",
+"Yw2oUWmadA","uN6r3dhSuH","Dz1R3suY4x","HP433KsjRK","BbwgAtvdkD","taOXKAgJHQ","Yw2oUSjskQ","taOXKy94nw","MmKGJhE1Ql","0BmCyRmDcr",
+"zHF1qSmGzv","ThjNnm4bxU","v8yFN580YD","FwEJzatef2","9XyT9iKqhr","jfREuX6Pin","HlUbFUmaEv","0PktIvkCHH","uvf7AEOE1o","HfyNQjtn0X",
+"EOE1o7hyVv","KZamHpvgjS","Pb1paJKWYR","yluBxzFgtB","MGlTFRxrsm","BGaQY5drc6","ZuDtDoGu6x","hYBCKQYxC0","d7vjMjfREu","S77LHpT8wu",
+"Yh1hFfmIK1","hE1Ql0MR5X","1v5hHfcwDa","ulk41Waim6","Z4I1vFVMxo","FGzgpFLsph","WmadA0YAGH","d85a9ni2v1","RzaZAaDGtS","QChxspiJSk",
+"FxX9qHP433","iKqhr7lUXZ","s93MlNo0Qb","GSQwjuQIcz","vLsmS14FLR","2TRI7qUJMd","VjCZqL7cGc","8xEKzBbwgA","Rxrsm2ZHdk","M3zXLHlUbF",
+"9XyT9e6e4z","FxX9qP6bcg","taOXKRzaZA","Zv7z00ao3l","Y1mC0ulk41","0Wr5yVprf2","Q6hMC0BmCy","vLsmShi5X7","5nmWvuLtKs","pFrrluN6r3",
+"kZANmEoToP","2ZHdkzY1GY","Zv7z0XyPZN","S2DfuwiHrZ","FxX9qaDGtS","QssNC0MR5X","7lUXZ8RCUA","618Diuvf7A","oVQp6uQIcz","lXFOBQYxC0",
+"kB5nPYf2Ec","SWfouZ4I1v","Vprf2lXFOB","lm0pDcQOnv","F6PT2RmDcr","O3iyQ2hEEU","ru4UGuupzk","WPmlxtuDyS","RpBQm2DREs","9XyT9tAOsr",
+"FFDuiv1Hln","5Mg9rDLhzM","Ta8f6DG4sT","NhXduKASQ8","VIlwPeuZA5","I7p2aM3zXL","QssNCXyPZN","pWiOs0h1b1","1LB1LEoToP","oVQp6POUYS",
+"5Namm5Drn0","okgRirz7Ut","F6PT2QnJ1S","dQ586Waim6","29QAzlH1kt","ogLgcsx5Gl","lweGyni2v1","pAhR18FmFH","B3qemd7vjM","DLhzM3weIF",
+"rKDLJcQOnv","QbxXcpFrrl","NhXdunFqik","KsjRKyvOMI","CdyBVF6PT2","ZUnqtrz7Ut","S2DfuWaim6","BpYhVRzaZA","1j5L8nFqik","KZamHDG4sT",
+"iwzGkGWqqX","NhXdugtCA5","ZUnqtYOfrY","hUTw7618Di","IBe8kaDGtS","Yf2EcVIlwP","lCMxyBCxeC","X6PinbgJAz","OxWIHQworu","WMiS3QChxs",
+"0BmCyMkgy8","ECMvUlH1kt","dhSuH14FLR","ogLgcWreyP","16lHc0PktI","NOHszWPmlx","UmaEv7fsYM","8TxD79GXkX","580YDSbRYy","CIShG7hyVv",
+"C2IrcaDGtS","fmIK1D6rBy","XyPZNyluBx","azIWplsQGo","pAhR1kB5nP","FPfSEHlUbF","hi5X7i7WMQ","VBjhzGXdoH","Dz1R3IjTwP","wDajX2ZHdk",
+"QYxC0zY1GY","WPmlx5nmWv","soy9tIjTwP","Waim6vLsmS","zQt6QOUqFM","hYBCKuLtKs","sx5Gld85a9","MaJQsBGaQY","fcJOyOxWIH","vLsmSIn3NS",
+"RBhp0zz4ZU","wiHrZVBjhz","KZamHK20wK","Yh1hFHfyNQ","pmeCdWaWsv","RmDcrdjsrv","6AFT0AXpwE","ix74rpWiOs","CIShGpWiOs","dmoS7HP433",
+"bgJAznlaBy","h1zcHzFgtB","EdBKcuoStw","zz4ZUuupzk","Yh1hFaez9y","W3VFH6AFT0","EdBKcFVMxo","8TxD70ao3l","Yf2Ecb29RJ","Gv3FqvkCHH",
+"TXQ0Z0YAGH","4dEz6Vprf2","rz7UtM3zXL","NhXdupT8wu","64s8NjzUqR","fcwDat98iW","0MR5XoGu6x","mz8gxZv7z0","iqv4kFVMxo","Q6Lixe6e4z",
+"48cHLuTacx","uupzkVIlwP","CK5W7rKDLJ","ru4UGGrDg7","zbIYYa00b5","VjCZq6q6L9","AmdQd9eoRc","29QAzQWxoT","In3NSqaofN","OUYuFdQ586",
+"WreyP0BmCy","OHaBzWmadA","FNYIMKASQ8","618DiC2Irc","Vprf25VZjS","d85a9taOXK","Fhtgl7lUXZ","nFqikpWiOs","lkMUAhE1Ql","FLsph9y4lw",
+"WPmlxZUnqt","zQt6QFjHXR","CIShGe6e4z","DG4sTrKDLJ","AmdQdbrhlQ","JKWYRpWiOs","xciqpB3qem","KsjRKJ2mQi","azIWpgjUTu","ZhwG1AmdQd",
+"l83Udpv0i7","NAFuw14FLR","uN6r3HP433","a00b5RkQke","EoToPhe9IA","45cIHVerEA","fFDrJjzUqR","7hyVvIKxdL","DQimpIn3NS","8FmFHReKEW",
+"VIlwPv2eC3","Yw2oUAkKTk","TXQ0ZNAFuw","6AFT0uoStw","AmdQdtlILt","HzZT87ku1p","b29RJWaim6","CNHmvsqVrf","uQIcz16lHc","0BmCyBpYhV",
+"MK07YlH1kt","LbRTHokgRi","IRh48jtn0X","GSQwjVBjhz","DQimpJRJQB","rz7UtZJTXH","hSSvQblLA9","L7cGcjfREu","8FmFHdQ586","GSQwjU3yw5",
+"Cp3mZv2eC3","5iGN5ZJTXH","Yw2oUv2eC3","atef2nnP8o","cmXIX5Mg9r","MojnPxReec","MaJQsQChxs","RBhp0VLTy6","soy9tNo0Qb","ReKEWpAhR1",
+"9y4lwfLNg8","0MR5X0h1b1","Cp3mZuZPqg","he9IA0YAGH","m4bxUGXdoH","i7WMQd7vjM","cShY2Mm8si","he9IAzbIYY","VNCPdNAFuw","oGu6xlm0pD",
+"WaWsvQChxs","FwEJzRBhp0","QClRLJRJQB","J2mQifqypy","s7MxkogLgc","No0QbZ4I1v","yluBxOUqFM","7fKYUAmdQd","FPfSE2Yz7E","t98iWKsjRK",
+"9XyT9tlILt","8hJdt9XyT9","aez9yd85a9","BGaQYX6Pin","nlaByB3qem","uQIczjfREu","zz4ZUpT8wu","v8yFN6q6L9","pv0i7KsjRK","guMb8t98iW",
+"CxVEf2ZHdk","EdBKcXflUq","qUJMdfcwDa","B3qemQssNC","iwzGktl72W","yvOMIBbwgA","SWfouCqqaD","y94nwdjsrv","2DREsaL6AJ","tvdkD2Yz7E",
+"HlUbFRxrsm","KZamHMaJQs","J2mQipv0i7","7hyVvtAOsr","YjB9t0BmCy","0BmCyWaim6","Nxx9V0ao3l","QbxXcnlaBy","zFgtBlCMxy","zQt6QKZamH",
+"0Wr5yi7WMQ","aez9yv8yFN","EdBKca00b5","VIlwP2Nslm","vkCHHIKxdL","mX2GEzFgtB","QssNCyEfy9","FLsphFPfSE","rKDLJYOfrY","5IhmGm4bxU",
+"9GXkXblLA9","fmIK1QssNC","Gv3Fq0Wr5y","CNHmvFNYIM","dQ586xReec","tAOsrHRxd8","dpe1vPb1pa","Chuy3QClRL","Ta8f6L7cGc","yvOMICqqaD",
+"14FLR2Nslm","xciqptaOXK","SbRYysx5Gl","TwanopiJSk","oVQp6k85Ae","5Drn0ru4UG","sqVrfSs0Zu","jS1ajHRxd8","vOqCEgf8rI","3otm6ZUnqt",
+"ZhwG15ZaEz","FLsphi7WMQ","fcJOyyEfy9","s7MxkQWxoT","prNT6mz8gx","7X3uydQ586","ru4UGLewvM","uJScXzqH0W","Pb1paU3yw5","W3VFHlweGy",
+"lweGyQClRL","NAFuwEdBKc","vOqCEsoy9t","ru4UGXflUq","Cp3mZOHaBz","iKqhr0PktI","KZamHCdyBV","SjskQ24ARF","pWiOsMmsIo","ReKEWQYxC0",
+"K4GS8rhl0J","tuDyS8cVD3","JkzUnUvlv4","l83UdIBe8k","D6rBybrhlQ","0MR5XF6PT2","6AFT0CqqaD","uupzkCqqaD","pWiOsZUnqt","2DREst59lR",
+"m4bxUsx5Gl","0Wr5y16lHc","i7WMQ5ZaEz","fLNg87lUXZ","gtCA54dEz6","RxrsmCxVEf","ThjNn5IhmG","lH1ktRpBQm","rhl0JRxrsm","uN6r3gf8rI",
+"0Wr5yuN6r3","EoToP9rlg9","WmadACp3mZ","EdBKccShY2","BGaQYQ6Lix","BGaQYprNT6","45cIHOUYuF","kZANme6e4z","FFDuiU3yw5","3weIFIBe8k",
+"lj07QPb1pa","B3qemuvf7A","uoStw0Kyfs","AOgEeG1RhS","0h1b1cmXIX","yvOMIcShY2","9y4lwix74r","jS1ajhe9IA","Yf2EcBpYhV","iKqhr2TRI7",
+"HfyNQXyPZN","lkMUAdhSuH","D6rByxciqp","gf8rIMkgy8","FLsphokgRi","VLTy6Gv3Fq","jSjS38cVD3","8RCUAUvlv4","7X3uyAIYUu","JkzUnCIShG",
+"AkKTk8RCUA","NhXduBFkb8","gIYvE2ZHdk","LewvMgjUTu","jzUqRv1Hln","YOfrYGWqqX","TCgPp5Mg9r","Yh1hFS77LH","FwEJz9GXkX","64s8NAOgEe",
+"brhlQguMb8","48cHLYjB9t","lkMUATa8f6","JKWYRix74r","ksJbyVIlwP","piJSkpT8wu","5VZjSIBe8k","9GXkXs4786","fLNg8s93Ml","Yw2oUkZANm",
+"VIlwP0MR5X","XflUqFwEJz","azIWpru4UG","M6qcG0PktI","2TRI7IBe8k","OUYuFJ2mQi","U3yw5yvOMI","wiHrZ24ARF","2hEEU5Namm","Mkgy8piJSk",
+"a00b5C2Irc","guMb82hEEU","CK5W7FNYIM","Mm8sisqVrf","9iGoTlj07Q","FwEJzF6PT2","Kr8ysNOHsz","qaofNuJScX","yvOMIMK07Y","t59lRL7cGc",
+"0PktIDLhzM","pT8wu4W0Tl","fcwDao8Uyd","Mkgy8U3yw5","8hJdtxciqp","n8pJ9hYBCK","DQimpK20wK","CNHmvGWqqX","16lHc5Drn0","LewvMHlUbF",
+"KASQ8MmsIo","Waim6fcwDa","07n1c16lHc","tuDySFFDui","nlaBy5ZaEz","i7WMQrz7Ut","jzUqRtvdkD","vLsmSU3yw5","v1HlnsuY4x","WaWsvhSSvQ",
+"580YDgf8rI","b29RJ9eoRc","OxWIHYh1hF","No0QbFLsph","gtCA5xReec","FLsphuAWyp","uoStwvLsmS","tvdkDfcwDa","a00b5HlUbF","iqv4kZ4I1v",
+"yvOMIWaim6","CdyBVuvf7A","taOXKFjHXR","HlUbFtjQxs","lkMUAvLsmS","JJs5m07n1c","suY4xprNT6","lm0pD64s8N","GWqqXZ4I1v","pAhR1lweGy",
+"FNYIMgdQsS","xReeciqv4k","ru4UGn1pmO","5ZaEzMK07Y","2TRI7HfyNQ","Nxx9VlViBv","uZPqglCMxy","7hyVvGrDg7","MojnPru4UG","GSQwj618Di",
+"ZuDtD8RCUA","48cHLfaHir","jfREuSWfou","rz7UtOz8yZ","2TRI7FLsph","pvgjSuZPqg","fFDrJMojnP","8hJdtM6qcG","iB08lG1RhS","t98iWOUqFM",
+"RBhp0ydG8U","IBe8ktl72W","OUYuFJIqXi","2Yz7E2ZHdk","2DREsRACuj","I7p2agtCA5","wiHrZ1j5L8","n1pmOMm8si","BbwgAuLtKs","2NslmhE1Ql",
+"Zv7z0Chuy3","QbxXcXyPZN","ciuWzd85a9","lH1ktxciqp","jS1ajNAFuw","OUqFMhYBCK","Ul4a1BpYhV","2ZHdkxReec","D6rByEOE1o","TXQ0ZWPmlx",
+"DQimpGXdoH","VjCZqtl72W","CNHmv5iGN5","blLA9Uvlv4","AXpwE5Namm","EOE1o580YD","k85AeLewvM","BFkb8wiHrZ","FhtglRACuj","0h1b1HfyNQ",
+"WPmlxxXTI4","rhl0JOxWIH","EdBKcW3VFH","FNYIMhSSvQ","24ARFtjQxs","HP433guMb8","Kr8ysQworu","7Ow5CMojnP","8cVD3XflUq","uoStwa00b5",
+"XflUqdpe1v","ZzJHWv2eC3","uupzkTXQ0Z","xReec29QAz","uAWypTXQ0Z","O3iyQ1LB1L","vOqCERkQke","y94nwl83Ud","t98iWzHF1q","JKWYRWaWsv",
+"qQxHP7Ow5C","AmdQdG1RhS","PYBf4IjTwP","5nmWvhE1Ql","pAhR1NOHsz","Zv7z0Mkgy8","NcICAn8pJ9","5iGN5In3NS","FLsphuLtKs","dpe1vsoy9t",
+"gtCA5lpF6W","MmsIo5Drn0","QClRL3weIF","jS1aj9rlg9","cL0aEyEfy9","AkKTkG1RhS","faHirS2Dfu","Pb1paVprf2","ThjNnNo0Qb","nnP8oFPfSE",
+"5iGN5uvf7A","djsrvnFqik","0PktICIShG","FNYIM8U2nU","CNHmvRACuj","yToGWSs0Zu","7hyVvgf8rI","xXTI4CqqaD","fFDrJ45cIH","W7cTs8TxD7",
+"K20wK8FmFH","RxrsmoVQp6","I7p2aLewvM","8TxD7uTacx","zmLYDBpYhV","iqv4kGWqqX","oQ87ri3pyd","OHaBz1v5hH","45cIHEOE1o","AOgEeIRh48",
+"ZhwG1nFqik","K20wKpiJSk","fqypyZJTXH","JIqXiJ2mQi","5drc6Z4I1v","CNHmvQYxC0","tuDySChuy3","ulk41xXTI4","m4bxUYf2Ec","uTacxL7cGc",
+"Nxx9VFwEJz","SjskQGSQwj","ni2v1yEfy9","F6PT2xReec","5Mg9rGWqqX","LDk6fNOHsz","fLNg8JRJQB","dpe1vVprf2","CNHmv9GXkX","kZANmU3yw5",
+"FPfSEYh1hF","iqv4k29QAz","aL6AJWaim6","0KyfspT8wu","NcICAo8Uyd","oQ87rhE1Ql","ZhwG1SbRYy","m4bxU5ZaEz","atef2YjB9t","VerEAIn3NS",
+"BCxeCd7vjM","i7WMQ3weIF","RkQkeYh1hF","fLNg807n1c","ThjNn5drc6","tuDyS5Namm","F6PT2RACuj","8hJdtlViBv","XflUqBbwgA","SmGzv24ARF",
+"uQIczgdQsS","YOfrYHfyNQ","5VZjSguMb8","e6e4zyluBx","yofH3Y1mC0","uTacxVIlwP","jSjS3LDk6f","0MR5XC2Irc","bZLvSJJs5m","EoToPjS1aj",
+"zY1GYSmGzv","RACujYf2Ec","jfREuMm8si","euZA5Kr8ys","S77LHKr8ys","7Ow5CyvOMI","8RCUAJRJQB","QssNC4W0Tl","dpe1vMK07Y","GWqqXhUTw7",
+"QChxsogLgc","M6qcGogLgc","tjQxs7X3uy","FNYIM8xEKz","Kr8ysoVQp6","QChxs2TRI7","zHF1qSjskQ","1v5hHdhSuH","FVMxo2Nslm","UmaEvuJScX",
+"aDGtSReKEW","FnPFBIn3NS","Dz1R3blLA9","oQ87rtuDyS","OUqFMGrDg7","4QMc9FwEJz","zQt6QQChxs","4dEz6iB08l","Mm8si2DREs","GWqqXix74r",
+"M6qcGcmXIX","uupzk1v5hH","Yh1hFn1pmO","mz8gxCdyBV","YOfrY7lUXZ","YjB9tYOfrY","yofH3Twano","JJs5mKASQ8","iwzGkru4UG","FFDuituDyS",
+"GrDg7gf8rI","qaofNjeskS","4dEz68cVD3","lCMxyy94nw","RpBQmogLgc","taOXKMGlTF","lweGy5Drn0","MaJQsVBjhz","cmXIXFnPFB","3otm6LbRTH",
+"FwEJzpT8wu","VLTy6t98iW","VBjhzs7Mxk","zHF1qv8yFN","1LB1LS2Dfu","0PktIokgRi","SbRYybgJAz","jfREugdQsS","zqH0WpvgjS","FGzgp4QMc9",
+"9iGoTeuZA5","WPmlxVNCPd","XflUqGrDg7","FFDuiFLsph","prNT6GWqqX","J2mQik85Ae","7hyVvtlILt","GSQwjh1zcH","S2DfuqQxHP","RBhp0ix74r",
+"2DREsIRh48","uZPqgG1RhS","5drc61j5L8","Yh1hFpFrrl","RACujuPX7G","W3VFHTXQ0Z","Oz8yZ07n1c","FNYIMkB5nP","16lHcC2Irc","VIlwPJJs5m",
+"dpe1vix74r","ZUnqtjeskS","jS1ajt98iW","jSjS3FNYIM","tvdkDsx5Gl","QWxoTogLgc","n1pmOlkMUA","Ss0ZuVBjhz","SWfouQ6Lix","iKqhr9iGoT",
+"LDk6fhe9IA","Ss0ZuuPX7G","POUYSTwano","yvOMIpvgjS","FjHXRzHF1q","pv0i7zHF1q","RkQkeFnPFB","FjHXR2Nslm","soy9tZ4I1v","B3qema00b5",
+"tlILtRkQke","AOgEeZv7z0","uN6r3IRh48","Uvlv4RkQke","FxX9qVNCPd","29QAzThjNn","s4786blLA9","5Nammv2eC3","XflUq8xEKz","D6rBygtCA5",
+"W3VFH4QMc9","yofH3Q6Lix","cL0aEfmIK1","uupzkX6Pin","oVQp6ni2v1","VNCPdJJs5m","FcWrWokgRi","Z4I1vhYBCK","Dz1R3StlDJ","AXpwEIn3NS",
+"Zv7z0cL0aE","0Wr5yS2Dfu","rhl0JcQOnv","FFDuiOUYuF","DQimp0h1b1","tuDyS5Mg9r","Vprf2Zv7z0","yToGW14FLR","tuDyS14FLR","QChxsvLsmS",
+"29QAzo8Uyd","uN6r3RBhp0","djsrvoGu6x","1LB1LyluBx","Q6LixQ6hMC","RACujCp3mZ","rz7Ut6q6L9","blLA9FPfSE","brhlQs7Mxk","VjCZqAIYUu",
+"QbxXcHfyNQ","M3zXLlCMxy","pT8wuhe9IA","7hyVvVerEA","7hyVvdmoS7","jfREuPOUYS","Cfgr36q6L9","DcpWBUlU3M","U3yw5zmLYD","7X3uylsQGo",
+"MojnPkZANm","m4bxU9rlg9","yToGWokgRi","CxVEfKsjRK","Ta8f67hyVv","3weIFMmKGJ","IjTwPEdBKc","ksJbypiJSk","FVMxozQt6Q","5drc6C2Irc",
+"618Di5drc6","s7Mxk7fsYM","fqypyuJScX","MojnPYw2oU","ogLgc8U2nU","QYxC0FwEJz","pmeCd6AFT0","ru4UGlj07Q","5drc68U2nU","cmXIXVIlwP",
+"e6e4zxXTI4","uAWypguMb8","SjskQNOHsz","pT8wum4bxU","J2mQiThjNn","RsQUqRBhp0","soy9t16lHc","iKqhrIn3NS","pWiOsJIqXi","9GXkXaez9y",
+"ix74r0Kyfs","SmGzvNAFuw","AmdQdUvlv4","prNT67fsYM","Ta8f6J2mQi","FFDuiguMb8","Yh1hF5nmWv","AXpwE7hyVv","8xEKzrhl0J","L7cGcQYxC0",
+"K4GS8FnPFB","cmXIXa00b5","fcJOy2Yz7E","6AFT0cQOnv","iB08lpiJSk","QChxsZuDtD","7fsYMRmDcr","IRh48618Di","uZPqgVNCPd","DG4sTFjHXR",
+"UlU3MguMb8","atef2Pb1pa","azIWpTXQ0Z","2TRI7vLsmS","RzaZAReKEW","Uvlv4euZA5","YjB9tNhXdu","AgJHQzqH0W","RzaZACdyBV","iB08lSjskQ",
+"7lUXZpv0i7","VIlwPS2Dfu","8xEKz07n1c","3otm6suY4x","vkCHHlH1kt","FjHXRTwano","HlUbFsoy9t","5nmWvix74r","uJScXOUYuF","45cIHOHaBz",
+"POUYSEOE1o","Pb1padhSuH","TCgPpOUYuF","Cfgr3wDajX","pv0i7JRJQB","WPmlxQbxXc","7Ow5CCIShG","5iGN58U2nU","pv0i7EoToP","vOqCEkB5nP",
+"fFDrJulk41","RmDcrCfgr3","Qworue6e4z","Twanoaez9y","zmLYDru4UG","aDGtS4QMc9","0YAGH6AFT0","tlILt0ao3l","pAhR1FFDui","0Wr5yuoStw",
+"NAFuw5IhmG","ThjNnlH1kt","s7MxkMGlTF","o8UydGXdoH","EOE1oFxX9q","DG4sTzFgtB","rKDLJd85a9","sqVrfhSSvQ","55rfBOxWIH","Dz1R3D6rBy",
+"zHF1ql83Ud","azIWpwDajX","No0QblsQGo","M3zXLi3pyd","fmIK1CdyBV","b29RJReKEW","1j5L8jzUqR","rKDLJJXljW","ogLgcMGlTF","BpYhVJ2mQi",
+"UlU3MTXQ0Z","IRh482Yz7E","VIlwPWMiS3","pT8wulweGy","8TxD7FwEJz","ReKEWaez9y","45cIHLDk6f","W7cTsfcwDa","4QMc9ThjNn","cL0aEo8Uyd",
+"Pb1paHlUbF","FGzgpSWfou","U3yw5ix74r","uoStwhE1Ql","UlU3MBGaQY","s4786SjskQ","aDGtSi7WMQ","VBjhzGWqqX","POUYSaL6AJ","dhSuHqaofN",
+"Gv3Fq0BmCy","nlaByG1RhS","nFqikSWfou","yofH3CNHmv","CIShGECMvU","FnPFBChuy3","3weIF1v5hH","FLsphMezSW","n8pJ9QssNC","n1pmOTXQ0Z",
+"14FLR14FLR","ZUnqtl83Ud","P6bcgFLsph","IKxdLjfREu","48cHLyluBx","i7WMQ2ZHdk","I7p2aoQ87r","v1HlnK4GS8","WmadAfLNg8","n8pJ94dEz6",
+"t59lR5drc6","OUqFMhE1Ql","Yw2oUG1RhS","0YAGHtvdkD","MmKGJEoToP","uLtKsvkCHH","8xEKzydG8U","ni2v10h1b1","BGaQYZhwG1","JJs5mZUnqt",
+"vLsmS1v5hH","PYBf4JJs5m","zqH0WYh1hF","S2DfupAhR1","CNHmvJXljW","FhtglC2Irc","gdQsSRBhp0","6q6L9dhSuH","fLNg8SmGzv","n8pJ9tjQxs",
+"Mm8sin8pJ9","0ao3lwDajX","CIShGaFFss","PYBf4tl72W","Yw2oUY1mC0","POUYS2Nslm","9rlg9FnPFB","xReecxXTI4","pWiOszFgtB","xciqpiB08l",
+"Oz8yZ4QMc9","RmDcra00b5","fLNg8AmdQd","X6PinEOE1o","D6rByrz7Ut","HlUbFtAOsr","pT8wu618Di","S2DfuZJTXH","gf8rI5VZjS","F6PT2EOE1o",
+"tlILtzQt6Q","Q6hMCOUYuF","Twano64s8N","K20wKPYBf4","2TRI7AIYUu","ix74rS2Dfu","dpe1vL7cGc","pv0i7GrDg7","Cp3mZzQt6Q","ydG8UQYxC0",
+"v1Hln3weIF","AXpwEciuWz","3weIFWDVWJ","t59lRAgJHQ","5iGN5Z4I1v","s4786Pb1pa","piJSkxXTI4","pT8wuciuWz","AgJHQVIlwP","IKxdLjS1aj",
+"vOqCEFhtgl","2NslmhUTw7","lCMxyhE1Ql","K4GS8Kr8ys","16lHcMm8si","uLtKskB5nP","yToGWdpe1v","taOXKiwzGk","VLTy6NAFuw","5IhmGAmdQd",
+"6q6L99eoRc","Pb1paatef2","WPmlxydG8U","StlDJ2Yz7E","iKqhrFhtgl","7X3uyJkzUn","n1pmO7Ow5C","HfyNQx3LDe","ZhwG13otm6","TwanoSmGzv",
+"F6PT2HfyNQ","UlU3MhE1Ql","UlU3MdQ586","FVMxoksJby","Gv3FqEOE1o","DcpWBYOfrY","rhl0J0Kyfs","o8UydIKxdL","ni2v1yvOMI","he9IAlViBv",
+"BFkb89y4lw","FLsphThjNn","7Ow5Cy94nw","bgJAz0Wr5y","CxVEflkMUA","0KyfsydG8U","FPfSEzHF1q","8U2nU8TxD7","tvdkDHlUbF","MmsIo5iGN5",
+"uvf7AC2Irc","XyPZNQ6Lix","rhl0JPYBf4","Chuy30Kyfs","KsjRKP6bcg","i3pyd9GXkX","aL6AJRzaZA","lpF6WyToGW","L7cGcEdBKc","RsQUqQChxs",
+"7Ow5CdQ586","uoStwdpe1v","3otm64dEz6","ciuWztvdkD","Cfgr3d85a9","M3zXLRxrsm","qQxHP8hJdt","IjTwP2Yz7E","MaJQsuZPqg","ECMvUdmoS7",
+"Kr8yszQt6Q","AIYUui3pyd","ZzJHWzmLYD","J2mQilsQGo","Yw2oUgtCA5","7fKYUI7p2a","7lUXZmX2GE","mz8gxRxrsm","vkCHHUl4a1","djsrvlweGy",
+"QWxoTNxx9V","DG4sT5Mg9r","ReKEW07n1c","MojnPAOgEe","jeskSRACuj","oVQp66AFT0","8xEKzzqH0W","FnPFBuPX7G","FxX9qBGaQY","DcpWB0Kyfs",
+"Mm8siyofH3","tAOsr0BmCy","TwanoYjB9t","oQ87rOxWIH","pv0i7xXTI4","jiVBPlsQGo","5nmWvZUnqt","7hyVvReKEW","YOfrYix74r","QChxsP6bcg",
+"v2eC3mz8gx","kZANmcmXIX","n1pmOqaofN","gtCA5VjCZq","aDGtSJ2mQi","n8pJ9uupzk","8TxD7WPmlx","SbRYyRpBQm","vOqCEYh1hF","hSSvQtjQxs",
+"bZLvSQWxoT","WMiS3ogLgc","5drc6RpBQm","8xEKzVerEA","v2eC324ARF","a00b5QClRL","8TxD7JKWYR","lH1ktlkMUA","Nxx9V4QMc9","LbRTHJXljW",
+"HfyNQpmeCd","W3VFHJJs5m","yofH3fLNg8","aez9y2ZHdk","ThjNn7fsYM","zqH0WzbIYY","0h1b1i7WMQ","l83UdFnPFB","DcpWBUmaEv","fcJOyMmKGJ",
+"0h1b1OHaBz","nnP8oyofH3","0PktI8RCUA","xReecjSjS3","ZJTXHHzZT8","Oz8yZyEfy9","suY4xZhwG1","iwzGklsQGo","FFDuiB3qem","RACujQssNC",
+"AIYUuSWfou","8xEKz8hJdt","Z4I1vaez9y","55rfBs4786","Ss0Zupv0i7","K4GS8618Di","C2Ircuupzk","jiVBPcQOnv","uJScX5VZjS","ix74r0h1b1",
+"JIqXigtCA5","d85a9G1RhS","Z4I1v2Yz7E","b29RJC2Irc","7fsYMh1zcH","CK5W7P6bcg","aDGtSdpe1v","QChxsmX2GE","W3VFHgIYvE","fLNg8yluBx",
+"pWiOsWDVWJ","VIlwPGWqqX","Nxx9Vdpe1v","CK5W7HRxd8","ksJbyQChxs","hUTw7blLA9","i3pydlXFOB","NOHszAXpwE","o8UydfcwDa","AkKTkRzaZA",
+"45cIHFVMxo","hSSvQDQimp","lm0pDrhl0J","rz7Utdjsrv","45cIHS77LH","K20wKJIqXi","v2eC3soy9t","0MR5XK20wK","pT8wudhSuH","2Yz7ELDk6f",
+"DQimpcShY2","xXTI4wDajX","D6rBy9iGoT","F6PT2KZamH","0Kyfs7X3uy","07n1cHP433","1j5L8aFFss","M6qcGuAWyp","NOHszOUYuF","AmdQdoVQp6",
+"S2DfumX2GE","KZamH8FmFH","TXQ0ZiwzGk","lj07QblLA9","lj07Q1LB1L","QClRLL7cGc","iB08lVNCPd","aFFssQ6hMC","BGaQYZUnqt","QClRLdmoS7",
+"ZhwG1brhlQ","BbwgAW7cTs","QnJ1StaOXK","uvf7AdhSuH","2hEEUwDajX","HP4333weIF","AXpwEcmXIX","Twanoh1zcH","NcICA9eoRc","VjCZqm4bxU",
+"s93MlJXljW","d85a9xXTI4","Yf2EcoQ87r","euZA5AIYUu","DG4sTs4786","yofH3HzZT8","vOqCEgdQsS","GXdoHgtCA5","8U2nUhSSvQ","VjCZqLewvM",
+"5ZaEzx3LDe","GXdoHMmKGJ","QClRLoVQp6","W7cTszbIYY","9y4lwIjTwP","S2DfuAIYUu","I7p2aatef2","ydG8UDLhzM","hSSvQBbwgA","0KyfsMm8si",
+"AOgEeNcICA","gjUTu4QMc9","Uvlv4S2Dfu","7X3uyMm8si","uPX7GTwano","euZA5MGlTF","ogLgcpvgjS","m4bxUQWxoT","piJSkaez9y","yofH3GXdoH",
+"6AFT07lUXZ","lweGyiB08l","kB5nPD6rBy","9eoRcyofH3","XflUqyEfy9","ZhwG1Yf2Ec","n1pmOnnP8o","FLsphOxWIH","qUJMdCK5W7","MojnPCfgr3",
+"i7WMQ0YAGH","h1zcH0Wr5y","jtn0X8U2nU","LewvMtAOsr","FLsphvOqCE","MmKGJzY1GY","7fsYMs93Ml","lweGytl72W","0PktIqUJMd","UmaEv1j5L8",
+"wiHrZCqqaD","DG4sTNxx9V","VLTy6HfyNQ","rhl0JOUYuF","h1zcHzmLYD","nnP8oRmDcr","DLhzMYf2Ec","ECMvUb29RJ","DQimpS2Dfu","azIWpkZANm",
+"wiHrZi3pyd","QChxshe9IA","v8yFNcShY2","piJSkjtn0X","45cIHWreyP","Uvlv4DLhzM","NhXduSmGzv","DQimpuN6r3","9eoRcPYBf4","tAOsrlH1kt",
+"gjUTuDcpWB","Mkgy8JkzUn","7X3uyuQIcz","2NslmF6PT2","gtCA5jtn0X","Nxx9VCK5W7","5NammHzZT8","ulk41CxVEf","RsQUqnnP8o","uN6r3pvgjS",
+"BpYhVCqqaD","Cfgr3yToGW","VNCPdKr8ys","ZUnqthSSvQ","8FmFHZzJHW","brhlQDQimp","HlUbF14FLR","8RCUAni2v1","hUTw7jtn0X","IjTwPuZPqg",
+"qQxHPzz4ZU","he9IAQssNC","t59lR2DREs","2TRI75IhmG","8hJdt2Nslm","YOfrYBFkb8","X6PinVjCZq","jeskSeuZA5","sqVrfVIlwP","0h1b1U3yw5",
+"VBjhz24ARF","Mkgy8WaWsv","HzZT84W0Tl","pv0i7euZA5","ix74rQworu","AOgEewiHrZ","XyPZNtAOsr","lCMxyn8pJ9","zY1GYCqqaD","FGzgpulk41",
+"WMiS3UmaEv","mX2GEWPmlx","ECMvU580YD","gIYvEcQOnv","pT8wuQnJ1S","yluBxsqVrf","I7p2auupzk","48cHL5Drn0","EoToPAmdQd","7X3uyChuy3",
+"vLsmSksJby","m4bxUjSjS3","Ul4a1iwzGk","guMb807n1c","pmeCdmX2GE","oQ87rEoToP","AgJHQd7vjM","MK07YRpBQm","uLtKsECMvU","VNCPdbgJAz",
+"VNCPdBGaQY","DLhzMCxVEf","B3qemfmIK1","CNHmvtvdkD","7Ow5CbgJAz","HzZT8v2eC3","45cIH0MR5X","GrDg7ru4UG","gdQsSaL6AJ","vOqCEKsjRK",
+"MaJQsuTacx","CNHmv2hEEU","IjTwPvLsmS","NAFuwsqVrf","yEfy9VNCPd","0YAGHQYxC0","nlaBy7hyVv","vkCHHDcpWB","WDVWJjfREu","BpYhVFLsph",
+"14FLR2ZHdk","ECMvUJJs5m","zmLYDO3iyQ","vOqCEydG8U","oVQp6lH1kt","D6rByZJTXH","VIlwPS77LH","9y4lwfFDrJ","XflUq48cHL","5Mg9rtjQxs",
+"CxVEfBGaQY","uN6r3hUTw7","Vprf2Cp3mZ","14FLRYh1hF","ZUnqt7hyVv","s4786n8pJ9","8xEKz7Ow5C","AmdQdzY1GY","6AFT0CdyBV","taOXKoGu6x",
+"HRxd8cmXIX","B3qemv8yFN","zY1GYDG4sT","jfREu4dEz6","hSSvQ8FmFH","VjCZqUl4a1","55rfBfFDrJ","suY4x580YD","pmeCdHfyNQ","jtn0XMK07Y",
+"pv0i7guMb8","pvgjSAkKTk","XyPZNnlaBy","zqH0WfcJOy","ix74r0Wr5y","In3NSM6qcG","b29RJY1mC0","oGu6xaFFss","ECMvUVjCZq","8cVD3cQOnv",
+"48cHLBpYhV","FNYIMuoStw","CK5W7ix74r","v1HlniKqhr","WreyPRzaZA","UmaEvMaJQs","pWiOs1LB1L","xciqpxReec","IRh48FxX9q","C2Irc5Mg9r",
+"fmIK1jzUqR","fFDrJTXQ0Z","yEfy9cQOnv","yEfy9k85Ae","X6PinW7cTs","GWqqXQWxoT","CxVEfDLhzM","FxX9qUlU3M","WreyPWMiS3","jSjS3jiVBP",
+"ZUnqtKr8ys","X6Pin55rfB","gf8rIpT8wu","Nxx9VXyPZN","tlILtdQ586","7fsYMjSjS3","x3LDeDcpWB","ru4UGokgRi","zFgtBkB5nP","1j5L8JXljW",
+"CK5W7hE1Ql","Nxx9Vdjsrv","BpYhVIBe8k","TCgPpjtn0X","xXTI4hSSvQ","hUTw7s93Ml","Ss0ZuMK07Y","Q6hMCgtCA5","AgJHQ5drc6","D6rByP6bcg",
+"jzUqRtl72W","blLA9UlU3M","FhtglCxVEf","jiVBPX6Pin","I7p2ahSSvQ","Waim6OUqFM","h1zcHuAWyp","48cHL8FmFH","Yw2oU7fsYM","ksJbyGWqqX",
+"n8pJ9FcWrW","hi5X7yofH3","aDGtSv2eC3","ThjNnfqypy","aFFssCqqaD","AmdQdYjB9t","LDk6ftvdkD","RpBQmPb1pa","v2eC3VerEA","dpe1v2DREs",
+"aez9yaDGtS","0ao3lmz8gx","VIlwPZuDtD","Y1mC0Cp3mZ","taOXKqUJMd","fmIK1cQOnv","aFFssblLA9","CNHmvxReec","0PktIPYBf4","BCxeCi3pyd",
+"Ul4a1RpBQm","fmIK1x3LDe","aez9y7fsYM","FGzgpK20wK","J2mQi7fKYU","K20wKwiHrZ","ru4UG55rfB","lsQGoQYxC0","aDGtSUlU3M","X6Pinuupzk",
+"Ul4a1l83Ud","zbIYYOUYuF","FnPFBMezSW","y94nwaez9y","L7cGcn8pJ9","n8pJ916lHc","WmadArz7Ut","UmaEvJkzUn","kZANmxReec","ZhwG1oVQp6",
+"Nxx9VfLNg8","ZUnqtFxX9q","i3pydXyPZN","ksJbyD6rBy","ZJTXHhe9IA","VBjhzB3qem","VerEA7lUXZ","3otm6O3iyQ","XflUqs93Ml","nnP8oJKWYR",
+"MK07YJKWYR","jSjS38RCUA","MaJQs7fKYU","C2IrcYw2oU","fLNg88cVD3","hYBCKpWiOs","BFkb8he9IA","tvdkDbrhlQ","lm0pDb29RJ","QChxsSWfou",
+"lm0pDfcwDa","d85a9lViBv","5Drn0okgRi","lH1ktRmDcr","3weIFThjNn","HP433JJs5m","x3LDe2hEEU","Chuy3Fhtgl","OUYuFtlILt","2DREsSmGzv",
+"5IhmGCdyBV","KASQ8mX2GE","5Drn07fsYM","y94nw5nmWv","uTacxprNT6","NcICA4W0Tl","2ZHdk1j5L8","tl72WhUTw7","lsQGowDajX","sx5GltaOXK",
+"rKDLJgIYvE","U3yw51j5L8","XyPZNIKxdL","vOqCEzmLYD","8hJdtn8pJ9","uTacxazIWp","VLTy6CIShG","C2IrclsQGo","xciqpFcWrW","dQ586oQ87r",
+"CIShGlweGy","RsQUqvOqCE","7ku1pMaJQs","VIlwP5iGN5","JJs5mB3qem","uZPqgW7cTs","hSSvQLewvM","EoToPksJby","5Drn016lHc","StlDJmX2GE",
+"tuDySkZANm","BGaQY5Drn0","pAhR1prNT6","9XyT9OxWIH","I7p2ahe9IA","k85AeqUJMd","vkCHH9GXkX","iB08lSWfou","pmeCd5Mg9r","mX2GErhl0J",
+"7fsYMQClRL","7ku1p64s8N","cmXIXW3VFH","YjB9tfcwDa","Gv3Fqe6e4z","hYBCKyToGW","Twano8cVD3","ZuDtDQChxs","lkMUA8cVD3","sqVrfguMb8",
+"Ta8f69y4lw","pvgjS2Yz7E","9rlg9blLA9","atef2LewvM","vkCHHJRJQB","yvOMIGSQwj","cL0aEhi5X7","v1Hln5IhmG","rKDLJ9XyT9","aDGtSzHF1q",
+"Mkgy8In3NS","Twanohi5X7","yEfy9ThjNn","3weIFn8pJ9","hi5X7FnPFB","ulk4114FLR","x3LDeWPmlx","GrDg7xXTI4","9y4lwaDGtS","blLA9Twano",
+"VBjhzv2eC3","lweGyxReec","jSjS3uupzk","8xEKzFnPFB","iqv4klkMUA","KsjRKBFkb8","OxWIHyToGW","bgJAzguMb8","Yf2EcK4GS8","Kr8yszz4ZU",
+"QssNC6q6L9","8hJdtC2Irc","O3iyQzbIYY","dpe1vzqH0W","ZJTXHUlU3M","L7cGclm0pD","l83UdFPfSE","FPfSEDQimp","pv0i73otm6","IKxdLgf8rI",
+"DG4sTIKxdL","MmsIoaFFss","piJSkJkzUn","Uvlv4VNCPd","LewvMCqqaD","nlaBygtCA5","yluBxdQ586","K4GS8Ss0Zu","9rlg9Cfgr3","cQOnv8cVD3",
+"POUYSQssNC","YjB9t2DREs","fcJOytlILt","SbRYyxXTI4","QWxoTKr8ys","16lHcFFDui","qaofNMm8si","EdBKcpv0i7","JJs5mlViBv","lpF6WQChxs",
+"5ZaEzU3yw5","ru4UGP6bcg","B3qemZJTXH","bgJAznnP8o","Fhtglb29RJ","aL6AJi3pyd","RpBQm55rfB","prNT6iB08l","MmsIoO3iyQ","bZLvSuZPqg",
+"y94nwEOE1o","lm0pDNcICA","45cIH7hyVv","yEfy91v5hH","xXTI4VBjhz","5Namm5iGN5","fmIK1ni2v1","lsQGolm0pD","QChxsFjHXR","i7WMQAIYUu",
+"45cIHtAOsr","XflUqIjTwP","Chuy3zqH0W","14FLRrKDLJ","Ul4a1xXTI4","uZPqgsuY4x","CK5W75iGN5","Gv3Fq0ao3l","7X3uy8hJdt","b29RJpvgjS",
+"RkQkefaHir","PYBf4fmIK1","BGaQYCqqaD","okgRiM3zXL","QChxsFnPFB","5NammqaofN","pFrrlCdyBV","5VZjSDz1R3","fqypyTwano","45cIHNxx9V",
+"VerEAoVQp6","aDGtSs4786","hUTw7WPmlx","5VZjSo8Uyd","brhlQVLTy6","JRJQB3otm6","4QMc9AgJHQ","v8yFNUl4a1","AIYUugjUTu","X6PinFhtgl",
+"8cVD3NAFuw","29QAzFPfSE","9XyT9DcpWB","B3qemvkCHH","16lHcsqVrf","s93MltlILt","ix74rSWfou","0BmCyRsQUq","a00b5SjskQ","GSQwjZhwG1",
+"nlaByAXpwE","ix74r29QAz","580YDVLTy6","rKDLJeuZA5","PYBf4M3zXL","yvOMIoVQp6","1LB1LZ4I1v","fcwDaOUqFM","7fKYU55rfB","oQ87r7X3uy",
+"bgJAzQ6Lix","wDajXM6qcG","UlU3MzbIYY","pWiOsuQIcz","vOqCE580YD","OHaBz6AFT0","piJSkW3VFH","Oz8yZDQimp","s4786sqVrf","KASQ8AgJHQ",
+"DcpWBQWxoT","v2eC3FPfSE","2Yz7EwDajX","MaJQsYw2oU","nFqikogLgc","MGlTFfcJOy","kB5nPZzJHW","MmsIofLNg8","vkCHHzbIYY","Pb1paRBhp0",
+"FhtglY1mC0","XflUqQssNC","uJScXvOqCE","pmeCdBCxeC","uQIcz9y4lw","GrDg70ao3l","n1pmOP6bcg","07n1cv1Hln","guMb87fsYM","FPfSE8hJdt",
+"6q6L9uvf7A","t59lRMaJQs","Z4I1vReKEW","OHaBz29QAz","l83UdvOqCE","QChxsgIYvE","X6Pine6e4z","VerEAiKqhr","WPmlxhSSvQ","hi5X7n1pmO",
+"7hyVvB3qem","Mm8si6q6L9","7fKYU8cVD3","d7vjMzHF1q","BpYhVi3pyd","iKqhrECMvU","M6qcGS77LH","8xEKzksJby","cQOnv5drc6","VBjhzblLA9",
+"YjB9t3otm6","Dz1R3MGlTF","POUYS8RCUA","GrDg7uPX7G","s7MxkiwzGk","ZzJHWb29RJ","2TRI7SbRYy","IjTwPt59lR","hSSvQVIlwP","fLNg845cIH",
+"9y4lwBFkb8","nnP8o5ZaEz","0BmCy7lUXZ","CNHmvqQxHP","xXTI42TRI7","FFDuiiB08l","HlUbFuN6r3","VLTy67lUXZ","okgRi2ZHdk","fmIK1jtn0X",
+"Nxx9Vi7WMQ","CNHmv5VZjS","tAOsrpv0i7","OUqFMQChxs","tl72WgjUTu","1v5hHOxWIH","kZANmVBjhz","vOqCE5Drn0","n8pJ9LbRTH","2hEEUpFrrl",
+"I7p2ad7vjM","FPfSEWDVWJ","FLsphkB5nP","Cp3mZo8Uyd","C2IrcYjB9t","9GXkXChuy3","v1HlnjS1aj","soy9ttl72W","djsrvGv3Fq","KASQ8zY1GY",
+"fFDrJ5nmWv","LDk6f64s8N","7hyVvY1mC0","QWxoTIjTwP","ECMvUL7cGc","s4786hi5X7","s7MxkCK5W7","WreyPHfyNQ","8cVD3U3yw5","Q6hMCRBhp0",
+"EOE1ok85Ae","bZLvSCxVEf","B3qemBGaQY","fcwDauLtKs","uTacxBbwgA","vOqCE5VZjS","StlDJrhl0J","FPfSE0h1b1","mX2GEGrDg7","FxX9qt59lR",
+"MezSW7X3uy","v2eC3MojnP","lsQGojS1aj","CdyBVix74r","iKqhrAXpwE","oGu6xOUYuF","L7cGcKr8ys","2ZHdkJXljW","QnJ1SuLtKs","mX2GE45cIH",
+"lweGyyEfy9","M3zXLOxWIH","LDk6fWaWsv","U3yw5Vprf2","5Mg9rAmdQd","WreyPprNT6","FcWrWlm0pD","W3VFHlViBv","prNT6QYxC0","uvf7A5iGN5",
+"9y4lwGSQwj","lpF6WZUnqt","yvOMI55rfB","hi5X7yToGW","VjCZqzz4ZU","LewvMEOE1o","jiVBPSWfou","iqv4kfaHir","UmaEvuPX7G","O3iyQuvf7A",
+"ThjNnl83Ud","B3qemokgRi","iKqhrmX2GE","K4GS8TXQ0Z","sqVrfOUYuF","BFkb8BCxeC","fmIK1KASQ8","8U2nUWMiS3","d7vjMvLsmS","VerEAxciqp",
+"s93Ml9XyT9","pv0i7taOXK","zmLYDcQOnv","KZamH29QAz","qaofNRBhp0","HzZT8fmIK1","AOgEe1j5L8","brhlQ7hyVv","P6bcgIRh48","24ARFe6e4z",
+"0KyfsS2Dfu","5nmWvx3LDe","ciuWzt98iW","aL6AJrz7Ut","xXTI4FwEJz","HRxd8Cp3mZ","29QAzd7vjM","sx5Gl0PktI","0h1b1S2Dfu","7fKYUK20wK",
+"2TRI7ZzJHW","OxWIHHlUbF","mz8gxSjskQ","Yw2oUCNHmv","nnP8o2hEEU","JJs5m5nmWv","9eoRc4QMc9","6q6L9G1RhS","7ku1pWreyP","pFrrlFFDui",
+"pT8wuMK07Y","zqH0WM6qcG","s7MxkiKqhr","EOE1oLDk6f","5Namm4W0Tl","7lUXZFGzgp","Z4I1vMkgy8","HlUbFblLA9","TXQ0ZHRxd8","JKWYRpFrrl",
+"Waim6uTacx","DLhzMCqqaD","nnP8oQYxC0","ECMvUzFgtB","yvOMI2TRI7","1v5hHjiVBP","QWxoT2ZHdk","iB08lqQxHP","J2mQiuvf7A","5drc6Qworu",
+"HRxd88xEKz","euZA5RkQke","WPmlxhi5X7","ru4UGS77LH","MmsIozbIYY","v1HlnB3qem","X6PincL0aE","9GXkXzmLYD","J2mQiPYBf4","cmXIX2DREs",
+"NAFuwpvgjS","jS1ajk85Ae","EdBKcdQ586","RsQUq0BmCy","gf8rI2TRI7","cL0aE64s8N","rKDLJlm0pD","WDVWJokgRi","LDk6fGrDg7","d7vjMtlILt",
+"sqVrfY1mC0","U3yw5gtCA5","7Ow5CWaim6","uJScXQbxXc","580YDL7cGc","iKqhrOxWIH","K20wKuQIcz","tuDySZhwG1","Oz8yZqaofN","zmLYDpT8wu",
+"ZhwG1Fhtgl","BpYhVgdQsS","uvf7AGrDg7","s7MxkEoToP","FxX9qSbRYy","aFFsscmXIX","K20wKIn3NS","Pb1pakB5nP","FPfSEWaWsv","zz4ZUdmoS7",
+"NAFuwy94nw","W7cTsJXljW","Waim6GSQwj","2hEEUVprf2","cQOnvfqypy","jfREuSbRYy","pWiOs9y4lw","NAFuwyluBx","hE1QlcL0aE","I7p2a2Yz7E",
+"0BmCylj07Q","pT8wuuupzk","VNCPdzz4ZU","RBhp0nnP8o","blLA9VIlwP","Cfgr3pv0i7","RxrsmWreyP","9GXkXbZLvS","h1zcHKZamH","jS1aj1j5L8",
+"Gv3FqciuWz","ksJbyokgRi","5Mg9r7hyVv","JkzUnThjNn","VIlwPVBjhz","8RCUAWreyP","lH1ktOUqFM","IRh48DLhzM","d85a9CdyBV","Cfgr3BFkb8",
+"dmoS7ZUnqt","NhXdu580YD","9eoRc8hJdt","CNHmvsx5Gl","WPmlx4W0Tl","Nxx9VBFkb8","K20wKVLTy6","O3iyQ0PktI","G1RhS0BmCy","vOqCEVprf2",
+"5IhmGksJby","GXdoHuQIcz","ZUnqtvkCHH","gtCA5l83Ud","vLsmSsuY4x","QWxoTi3pyd","MojnPMmsIo","AOgEeZhwG1","0Wr5y2Yz7E","suY4xvLsmS",
+"gtCA58xEKz","BpYhV0YAGH","n1pmOcQOnv","guMb8VIlwP","jS1ajI7p2a","fmIK1In3NS","0BmCyVNCPd","VLTy6CdyBV","CNHmvWaim6","8RCUAsqVrf",
+"IBe8kYOfrY","BCxeCbgJAz","t59lRy94nw","Dz1R38U2nU","OUYuFKASQ8","aez9yYOfrY","0YAGHGSQwj","dmoS7uoStw","v2eC35Mg9r","zQt6Qiqv4k",
+"M6qcGReKEW","48cHLC2Irc","n8pJ9sqVrf","e6e4zi3pyd","i3pydRBhp0","ZUnqtgtCA5","ZhwG1YjB9t","Pb1pav8yFN","ulk41djsrv","Nxx9VaFFss",
+"GSQwjJKWYR","OHaBzm4bxU","8hJdtksJby","Yw2oUlXFOB","fcJOyWaim6","JKWYRFVMxo","lpF6WbZLvS","9eoRcoVQp6","Gv3Fqy94nw","9GXkXsoy9t",
+"azIWpZhwG1","Cp3mZGv3Fq","zqH0WpWiOs","BCxeCsuY4x","he9IARACuj","sqVrfK20wK","TXQ0Zpv0i7","dmoS79iGoT","CNHmvJkzUn","uZPqgGWqqX",
+"iqv4kY1mC0","ReKEWNo0Qb","VBjhzKsjRK","JkzUnRxrsm","cmXIXWreyP","NhXdudQ586","djsrvSmGzv","HzZT8ciuWz","9y4lwECMvU","0Wr5yL7cGc",
+"gIYvEzFgtB","b29RJ7hyVv","zY1GYIBe8k","S2DfuLbRTH","s4786nFqik","gjUTuFjHXR","Ul4a1IKxdL","7lUXZo8Uyd","5Drn064s8N","s93MlVLTy6",
+"xXTI4uZPqg","7lUXZiKqhr","VLTy6GWqqX","rhl0JlpF6W","oQ87rFFDui","QWxoTAmdQd","RxrsmfaHir","FLsphksJby","lViBvNAFuw","wDajXFPfSE",
+"yvOMInlaBy","BGaQY2Yz7E","Ul4a1AOgEe","Chuy3lkMUA","5Drn0JRJQB","AXpwElViBv","ulk41gdQsS","Ta8f6BGaQY","W7cTsOxWIH","bgJAzJ2mQi",
+"pWiOsGXdoH","LbRTHkZANm","IjTwPaFFss","7ku1p7lUXZ","FNYIMUl4a1","GSQwjBFkb8","pT8wuoVQp6","Ul4a114FLR","hSSvQdhSuH","o8UydvOqCE",
+"wiHrZgjUTu","nnP8oAOgEe","VLTy6x3LDe","uTacxFcWrW","Q6LixMmsIo","DLhzMIBe8k","8U2nUYh1hF","YOfrYazIWp","uTacxcShY2","ksJbyprNT6",
+"No0Qbh1zcH","FGzgpgdQsS","ydG8UFNYIM","uAWypWaim6","F6PT21j5L8","Zv7z0tl72W","5NammyofH3","lpF6WwDajX","NcICAGXdoH","RpBQmqUJMd",
+"WMiS3SjskQ","FLsphHfyNQ","l83Ud2Yz7E","l83UdIKxdL","l83UdXflUq","CIShGFPfSE","5IhmGrz7Ut","tjQxsdmoS7","xReec8FmFH","CxVEfBbwgA",
+"gIYvElm0pD","suY4xaDGtS","iqv4kM3zXL","t98iWSmGzv","ZUnqtguMb8","CqqaD8FmFH","Ul4a1sqVrf","OUqFMMmKGJ","0PktIs4786","uPX7GDz1R3",
+"jiVBP2hEEU","Yh1hFSmGzv","lViBvCqqaD","fFDrJ2Nslm","OxWIHhE1Ql","he9IAM6qcG","Waim60Kyfs","2NslmGWqqX","v1Hln7fKYU","PYBf4euZA5",
+"RkQke9XyT9","8cVD3ZJTXH","IRh48wiHrZ","2Nslm8hJdt","FwEJzStlDJ","yToGWEoToP","iKqhrhi5X7","tAOsrLDk6f","oGu6xGrDg7","FVMxo7Ow5C",
+"yvOMIRxrsm","IKxdL1LB1L","580YDRpBQm","3weIFVIlwP","D6rBygjUTu","Gv3FqMmsIo","d7vjMW7cTs","C2IrcL7cGc","jSjS3jtn0X","b29RJNcICA",
+"PYBf4uAWyp","580YDv8yFN","fLNg8Ul4a1","48cHLRkQke","dQ586brhlQ","4QMc9Kr8ys","LewvMS77LH","Waim6JIqXi","Cp3mZHRxd8","VIlwPY1mC0",
+"CxVEftlILt","i3pydNhXdu","KZamHi7WMQ","JKWYRVjCZq","GXdoHpmeCd","aez9yQWxoT","U3yw5QWxoT","Uvlv45iGN5","OHaBzmX2GE","CqqaDIn3NS",
+"J2mQiFcWrW","4W0TlYw2oU","vOqCE29QAz","B3qemIRh48","iB08lNAFuw","soy9tQ6Lix","pmeCdhSSvQ","IRh48pv0i7","gjUTuW7cTs","2DREszz4ZU",
+"lm0pDzFgtB","VIlwPKZamH","Waim6jtn0X","nlaByK20wK","YOfrY7ku1p","QbxXcRACuj","HP433iKqhr","djsrvPYBf4","hE1QlblLA9","X6PinWMiS3",
+"taOXK7X3uy","jfREuHfyNQ","9GXkX7Ow5C","HfyNQPOUYS","brhlQm4bxU","SjskQ5ZaEz","azIWpoQ87r","LDk6fiB08l","s7MxkNxx9V","4W0TlReKEW",
+"4W0Tl9rlg9","GrDg77X3uy","Mkgy85Mg9r","CIShGIRh48","NhXdu2TRI7","4dEz6F6PT2","YOfrY3weIF","AIYUuYh1hF","uJScXX6Pin","ZJTXHhUTw7",
+"JKWYRX6Pin","GXdoH48cHL","JIqXiTXQ0Z","blLA9HlUbF","CxVEfChuy3","vOqCEprNT6","qUJMdNhXdu","VLTy6S77LH","l83UduZPqg","lkMUAyluBx",
+"e6e4zP6bcg","zFgtBY1mC0","Vprf2uvf7A","PYBf4MGlTF","K4GS8Twano","2hEEU2Yz7E","atef2JIqXi","MmsIoRzaZA","DQimp7Ow5C","KsjRK45cIH",
+"3weIFX6Pin","SjskQk85Ae","FxX9qVprf2","K20wK2DREs","FGzgpuLtKs","iwzGk6AFT0","POUYSd7vjM","5drc6ZuDtD","2TRI764s8N","NhXduzz4ZU",
+"xReecokgRi","YjB9tJkzUn","NOHsz5ZaEz","DLhzMaFFss","o8UydG1RhS","s93MliKqhr","lCMxyRxrsm","M6qcG24ARF","MmKGJpT8wu","OUYuF5drc6",
+"VLTy66AFT0","FVMxo2DREs","uZPqg2ZHdk","vLsmS64s8N","VIlwPHP433","wiHrZJRJQB","ZhwG1OHaBz","9y4lwWreyP","JJs5mDG4sT","IBe8kMkgy8",
+"HRxd8W7cTs","zz4ZUgIYvE","tjQxsM3zXL","XflUqOxWIH","Oz8yZPYBf4","pFrrlOz8yZ","jfREu9iGoT","lH1ktiKqhr","FhtgltaOXK","zqH0WIBe8k",
+"lweGyoVQp6","ulk41NAFuw","Ta8f6G1RhS","580YDpvgjS","7X3uy0YAGH","NOHszWMiS3","MK07YfaHir","FwEJzUvlv4","Oz8yZRmDcr","WPmlxqaofN",
+"fFDrJHRxd8","bZLvSv2eC3","Cp3mZmX2GE","YjB9tv8yFN","5ZaEz4QMc9","cmXIX0PktI","VIlwPVLTy6","FLsphMm8si","RpBQmdhSuH","CdyBVdpe1v",
+"oGu6x7fsYM","soy9tReKEW","KZamHFLsph","EdBKc7fsYM","xReecZzJHW","ZJTXHTwano","5iGN529QAz","qaofNd85a9","oQ87r3otm6","9XyT916lHc",
+"WaWsvJJs5m","gdQsSqQxHP","HP4339eoRc","45cIHRsQUq","wiHrZksJby","WaWsvfFDrJ","CNHmva00b5","t59lR16lHc","ZJTXHStlDJ","RmDcr7Ow5C",
+"LbRTHzz4ZU","5nmWvs93Ml","bgJAzNAFuw","In3NSMezSW","JXljWEOE1o","GrDg7i7WMQ","Gv3FqCp3mZ","LDk6fb29RJ","aL6AJzqH0W","FGzgpiwzGk",
+"VjCZq9eoRc","faHirKr8ys","i7WMQLDk6f","SbRYydhSuH","gtCA5uQIcz","2Nslmk85Ae","cL0aEulk41","vLsmSsx5Gl","hE1QlxReec","qUJMdpmeCd",
+"zHF1qDG4sT","RpBQmuN6r3","JKWYR24ARF","oQ87ruJScX","8FmFHyofH3","aez9ycmXIX","8cVD3tlILt","QYxC0DG4sT","NhXdua00b5","lsQGoaFFss",
+"5Mg9r0PktI","MmsIoaL6AJ","JXljWUl4a1","2DREsvLsmS","48cHLnFqik","jiVBPZuDtD","jtn0XYf2Ec","zbIYY0PktI","fFDrJRxrsm","vLsmSrz7Ut",
+"v2eC3kZANm","mz8gx7lUXZ","tjQxsNhXdu","JKWYRMmsIo","SWfouzY1GY","ECMvUMezSW","VerEA5Namm","In3NStaOXK","Mm8siMkgy8","Yw2oUuQIcz",
+"6q6L9Cp3mZ","RpBQm618Di","ZhwG1CqqaD","AXpwE2Yz7E","07n1cCK5W7","WaWsvn8pJ9","gtCA5YOfrY","LDk6fdpe1v","Chuy3tuDyS","1j5L88xEKz",
+"ulk41kB5nP","QClRL8RCUA","fFDrJBbwgA","gf8rIn1pmO","Ss0ZuoVQp6","GrDg7rKDLJ","nlaBy6AFT0","4W0TlKr8ys","ReKEWYOfrY","prNT6nlaBy",
+"CdyBVaDGtS","RmDcrVLTy6","soy9tVLTy6","0h1b19iGoT","ECMvUYw2oU","dQ586Pb1pa","i3pydB3qem","AXpwEzqH0W","Gv3Fq7Ow5C","16lHcP6bcg",
+"ReKEWjS1aj","CqqaDP6bcg","MojnPvLsmS","CxVEfjeskS","5Drn0fqypy","U3yw5UlU3M","CK5W7fqypy","P6bcgzz4ZU","Gv3FqAOgEe","QYxC0rKDLJ",
+"Qworu0ao3l","MGlTFjtn0X","euZA5HlUbF","zmLYD0MR5X","KsjRKFxX9q","UlU3MRpBQm","SWfouI7p2a","suY4xvkCHH","tAOsrzmLYD","soy9tsoy9t",
+"brhlQS77LH","VBjhzlpF6W","ECMvUM3zXL","zmLYDDG4sT","uLtKsVjCZq","gIYvEiqv4k","tAOsrSmGzv","BFkb8fcJOy","k85AeCxVEf","3weIFhUTw7",
+"5Mg9r6q6L9","3otm6W7cTs","ciuWz1j5L8","16lHcRBhp0","NcICAHRxd8","0YAGHi3pyd","sqVrfni2v1","n1pmOBCxeC","LewvMQnJ1S","cQOnvzbIYY",
+"iB08lChuy3","gIYvE2DREs","ulk41ZhwG1","RkQkee6e4z","okgRiG1RhS","tAOsrb29RJ","yofH38hJdt","ksJbyIjTwP","t59lR580YD","lsQGopv0i7",
+"Ta8f67lUXZ","sx5GlogLgc","Cp3mZcmXIX","BFkb8vOqCE","0KyfsVLTy6","9XyT9BpYhV","Mm8si7hyVv","Vprf2HP433","LewvM5Drn0","5NammMmsIo",
+"gf8rIYh1hF","EoToPdhSuH","HzZT8LbRTH","4W0TlOUqFM","CK5W7SjskQ","HP433nlaBy","29QAzjS1aj","LDk6fGXdoH","qUJMdfmIK1","oQ87ry94nw",
+"Vprf2Yh1hF","SmGzvDG4sT","pT8wufFDrJ","ZhwG1dhSuH","ogLgc5IhmG","l83UdVjCZq","IBe8kqaofN","pFrrl2TRI7","azIWp9XyT9","wiHrZcmXIX",
+"v8yFNNxx9V","RxrsmdhSuH","QssNCnnP8o","2NslmWaWsv","oVQp6ReKEW","U3yw5zY1GY","oQ87rcQOnv","Ul4a18cVD3","DLhzMlXFOB","StlDJguMb8",
+"5Mg9r2hEEU","9iGoTM3zXL","VjCZqJXljW","7lUXZRzaZA","HRxd8ZzJHW","QChxsRmDcr","faHirxciqp","uN6r3UmaEv","AXpwEGWqqX","soy9tI7p2a",
+"RACujuQIcz","SWfouhe9IA","xXTI4OxWIH","DG4sTWaim6","MaJQsZUnqt","9iGoTs7Mxk","07n1cd85a9","QnJ1S7ku1p","WPmlxJIqXi","B3qemFnPFB",
+"LDk6fs7Mxk","0BmCydpe1v","14FLRQChxs","m4bxUFFDui","zbIYYyofH3","tuDySru4UG","RpBQm0Kyfs","CK5W7jS1aj","0ao3lK20wK","4W0TlFjHXR",
+"DLhzMokgRi","7ku1pzbIYY","lweGy7ku1p","gdQsSNcICA","NOHszfcwDa","0Kyfs5drc6","OHaBzEoToP","uZPqgfFDrJ","OHaBzuAWyp","M3zXLLbRTH",
+"UlU3MNAFuw","pmeCd3otm6","wDajXK4GS8","prNT6zqH0W","gIYvEEdBKc","J2mQiECMvU","S77LHjS1aj","v8yFNPb1pa","rKDLJ3weIF","lj07QRsQUq",
+"SjskQW7cTs","x3LDeix74r","Waim6zqH0W","b29RJ5iGN5","VjCZqB3qem","jS1ajCfgr3","tAOsrZuDtD","0Wr5yOUqFM","zY1GYFjHXR","9eoRcBCxeC",
+"ksJbyMaJQs","ix74rnnP8o","pWiOsCNHmv","0Wr5y8hJdt","Oz8yZcL0aE","a00b5Cp3mZ","SmGzvxciqp","e6e4zzHF1q","e6e4z2ZHdk","sqVrf9y4lw",
+"ulk41v8yFN","RkQkeXflUq","lweGyQChxs","FnPFB0Kyfs","lXFOBOUqFM","S2DfuokgRi","XflUqFhtgl","cL0aEFLsph","xReecprNT6","d7vjMB3qem",
+"yvOMIM6qcG","8RCUAOxWIH","M3zXLQbxXc","2TRI75nmWv","ECMvUi7WMQ","14FLRZ4I1v","dmoS7LDk6f","ZJTXH7fsYM","0YAGHt98iW","UlU3McL0aE",
+"RmDcr6q6L9","prNT6jS1aj","D6rByKr8ys","cL0aEAmdQd","5iGN5xXTI4","pAhR10ao3l","uN6r364s8N","jfREuzY1GY","CqqaDsqVrf","pAhR1IBe8k",
+"JXljWuupzk","RmDcruvf7A","AkKTk24ARF","7Ow5Cjtn0X","Pb1paulk41","aDGtS8TxD7","0BmCyqaofN","faHirnnP8o","FLsphJRJQB","vOqCE1LB1L",
+"KsjRKSWfou","fcJOya00b5","7Ow5C8xEKz","jeskSUvlv4","sx5GlMezSW","YjB9tCNHmv","dpe1vReKEW","2NslmAOgEe","RBhp0xReec","hi5X7OHaBz",
+"kZANmAkKTk","FFDuio8Uyd","AIYUuoVQp6","xReeciwzGk","yofH3EdBKc","8RCUAuJScX","yofH3a00b5","8RCUADcpWB","Uvlv4bgJAz","VLTy6vOqCE",
+"jSjS3kB5nP","FcWrWQnJ1S","faHirBbwgA","1LB1LcL0aE","tAOsrRkQke","wiHrZhUTw7","Nxx9VCxVEf","zFgtBfaHir","hE1QlS77LH","0KyfsTCgPp",
+"GXdoH7fsYM","kZANmWDVWJ","9y4lwMK07Y","7Ow5CkB5nP","OHaBzzQt6Q","ZuDtDfLNg8","OxWIHNcICA","BFkb8Waim6","0YAGHiwzGk","580YDlH1kt",
+"ReKEW14FLR","9eoRc29QAz","WPmlxQ6Lix","atef2kB5nP","nlaByfLNg8","fcwDalj07Q","azIWpB3qem","TXQ0ZZUnqt","IjTwPrKDLJ","KsjRKlpF6W",
+"G1RhSFGzgp","lm0pDZhwG1","OUYuFyvOMI","RkQkel83Ud","Uvlv45Mg9r","JkzUntvdkD","kZANmBFkb8","8cVD3WaWsv","1v5hHsx5Gl","Cp3mZ6AFT0",
+"s47861LB1L","NhXduKr8ys","m4bxU14FLR","UmaEv2DREs","zFgtB0Wr5y","jtn0XM3zXL","i7WMQ7fsYM","dhSuHM3zXL","yluBxMezSW","tjQxsv8yFN",
+"b29RJ0Kyfs","dhSuH2TRI7","IBe8k6q6L9","Pb1paAIYUu","0PktIlCMxy","pWiOsZuDtD","e6e4zY1mC0","QWxoTFGzgp","5NammpiJSk","2Yz7EqUJMd",
+"7hyVvKsjRK","BbwgAjtn0X","OUqFMzFgtB","RxrsmpFrrl","Zv7z0Uvlv4","2NslmRpBQm","VerEAUvlv4","FxX9qokgRi","VjCZqQClRL","QYxC0EoToP",
+"NcICAECMvU","okgRiX6Pin","MojnPzFgtB","OUYuFU3yw5","HlUbFfcJOy","fmIK1fmIK1","yEfy9qaofN","Z4I1vlm0pD","Q6LixfcwDa","QssNCSmGzv",
+"VjCZqix74r","WMiS39rlg9","KASQ8EOE1o","RACujNcICA","XyPZNChuy3","zqH0WgdQsS","MmKGJyofH3","okgRieuZA5","uoStwOUqFM","FjHXRatef2",
+"cL0aEQnJ1S","oVQp6OUYuF","v1Hlnv1Hln","fcwDa29QAz","uQIczqaofN","v2eC3AkKTk","WMiS3EOE1o","JIqXi9iGoT","GWqqXDz1R3","s4786JKWYR",
+"cmXIXpAhR1","BpYhV07n1c","m4bxUBCxeC","45cIHyvOMI","piJSkuAWyp","HRxd8rhl0J","5VZjSKr8ys","zqH0WWreyP","yvOMIQClRL","DcpWBQClRL",
+"MK07YxReec","0BmCy9rlg9","wDajXxciqp","uN6r3nFqik","qaofNFnPFB","jiVBPHfyNQ","4W0Tl9iGoT","P6bcg8TxD7","ECMvUNOHsz","lXFOBsuY4x",
+"L7cGc9eoRc","07n1cKsjRK","2DREspFrrl","NAFuwwDajX","16lHc8cVD3","Pb1palCMxy","euZA5djsrv","F6PT2oQ87r","O3iyQOUqFM","IKxdLcQOnv",
+"HRxd8Ss0Zu","atef26q6L9","5iGN5taOXK","fFDrJOUqFM","QbxXcBCxeC","S77LHtAOsr","SWfouF6PT2","JKWYR5VZjS","Ta8f6tjQxs","oGu6x618Di",
+"iB08l6q6L9","ReKEWECMvU","0ao3lcQOnv","AIYUupv0i7","uAWyp9iGoT","b29RJB3qem","wiHrZokgRi","h1zcHIn3NS","bgJAzVNCPd","BbwgAXyPZN",
+"CNHmvMK07Y","uPX7G9y4lw","Gv3Fqn1pmO","lXFOBWPmlx","DLhzMhUTw7","zQt6QPOUYS","JKWYRJXljW","9eoRc07n1c","Pb1paGSQwj","X6PinUlU3M",
+"I7p2a2hEEU","XflUq5drc6","d85a9fqypy","fcwDalViBv","vLsmSStlDJ","lweGygjUTu","dhSuHBGaQY","FNYIMy94nw","6q6L97X3uy","l83UdCNHmv",
+"tuDySuupzk","yluBxFnPFB","gjUTuXyPZN","9eoRclm0pD","0PktIuPX7G","kZANmoGu6x","MmKGJW3VFH","ix74rtaOXK","oGu6xlXFOB","vLsmSVNCPd",
+"dhSuHRzaZA","WaWsvoGu6x","HfyNQjeskS","Yh1hFn8pJ9","PYBf4Zv7z0","2hEEUWaim6","ZhwG1AgJHQ","KsjRKTwano","MGlTFoQ87r","hE1QlJJs5m",
+"MaJQsBpYhV","14FLRprNT6","uvf7AG1RhS","M6qcGRACuj","dmoS7CNHmv","ECMvUoVQp6","L7cGc4W0Tl","DQimpdpe1v","RBhp01j5L8","Vprf2hUTw7",
+"VLTy6pvgjS","5Mg9rVprf2","OUYuF8TxD7","O3iyQuTacx","MojnPzqH0W","uQIczzz4ZU","d7vjM0MR5X","soy9t0YAGH","SjskQ29QAz","KsjRKtjQxs",
+"Nxx9Vrhl0J","okgRioGu6x","ZUnqtuPX7G","oVQp6FPfSE","oGu6xix74r","KsjRKni2v1","TXQ0ZZ4I1v","5drc6sqVrf","0MR5XVLTy6","FPfSElXFOB",
+"MezSWeuZA5","s7Mxk7hyVv","GrDg7SjskQ","CNHmv0BmCy","P6bcg2ZHdk","XflUqpT8wu","Ss0Zu5drc6","wDajXYw2oU","lXFOBDz1R3","ciuWzuZPqg",
+"tlILttjQxs","QworuNo0Qb","v8yFN9eoRc","s47860BmCy","v1Hln6q6L9","0BmCyP6bcg","TwanoMaJQs","RzaZAyToGW","tl72WUlU3M","24ARFbrhlQ",
+"hYBCKSbRYy","Ss0ZuVprf2","mz8gxECMvU","atef2Yh1hF","VLTy6MK07Y","Q6LixFxX9q","JKWYRWPmlx","h1zcHRmDcr","VjCZqsoy9t","FxX9qnlaBy",
+"8hJdtuLtKs","POUYSVBjhz","FcWrWlkMUA","IRh48pFrrl","BpYhVPb1pa","9rlg9GSQwj","TwanoOHaBz","o8UyduQIcz","ciuWzOHaBz","BCxeC4W0Tl",
+"rhl0JY1mC0","RACujlm0pD","o8UydydG8U","AgJHQX6Pin","HzZT80YAGH","CK5W7gf8rI","Yf2EcHzZT8","h1zcHRBhp0","pAhR1nlaBy","mX2GEeuZA5",
+"ksJbyWMiS3","SjskQDcpWB","Yw2oUdQ586","5NammogLgc","W3VFHFGzgp","ru4UGazIWp","KZamH64s8N","8U2nUpT8wu","U3yw5Qworu","0YAGH8cVD3",
+"TCgPpd7vjM","yToGWZJTXH","X6Pin48cHL","HzZT8brhlQ","KsjRKK4GS8","NAFuwxciqp","k85AeQnJ1S","zQt6QeuZA5","In3NS0h1b1","uN6r3JRJQB",
+"FFDuiFVMxo","9y4lwuQIcz","kZANmzHF1q","dpe1vJKWYR","64s8NVLTy6","1j5L8Cfgr3","gIYvEAgJHQ","M6qcG580YD","ix74rVerEA","64s8NUvlv4",
+"7hyVvgdQsS","WDVWJAkKTk","9y4lwhYBCK","VBjhz1LB1L","MezSWblLA9","StlDJZhwG1","x3LDeiKqhr","0MR5XGv3Fq","QClRLGXdoH","FLsph8cVD3",
+"C2IrcP6bcg","NAFuwPb1pa","mX2GEiKqhr","uvf7AGWqqX","SWfouy94nw","LbRTHEdBKc","pmeCdix74r","Waim6pWiOs","FNYIMMGlTF","C2IrcfaHir",
+"0ao3lEOE1o","aL6AJCdyBV","2ZHdkYh1hF","hUTw7CIShG","M3zXLSs0Zu","jS1ajYjB9t","GWqqXVNCPd","Yf2EcFcWrW","0BmCytaOXK","Q6hMCMm8si",
+"RsQUq8TxD7","FLsph9iGoT","BGaQYJRJQB","QssNC5Drn0","k85AeW3VFH","SWfoujS1aj","cQOnvDQimp","pAhR1rz7Ut","zmLYDjtn0X","iB08lazIWp",
+"d85a948cHL","xXTI4VjCZq","8hJdtP6bcg","pT8wuDG4sT","hSSvQ4QMc9","cmXIXQClRL","Vprf2ciuWz","16lHctAOsr","CxVEfTa8f6","yluBxVBjhz",
+"lj07QNOHsz","FcWrWGWqqX","Uvlv4uN6r3","soy9tB3qem","JkzUn5Mg9r","2hEEUcShY2","WPmlxogLgc","WMiS3lm0pD","t59lRhe9IA","ZuDtD4dEz6",
+"IRh48QbxXc","TCgPpCdyBV","Pb1paxXTI4","cShY2BCxeC","lweGyGWqqX","Q6hMC4W0Tl","0ao3ltjQxs","IRh48TXQ0Z","QssNCqQxHP","jtn0XIjTwP",
+"a00b5QssNC","8U2nU4QMc9","NOHszv8yFN","5NammzQt6Q","RmDcry94nw","StlDJCxVEf","uQIczFPfSE","mz8gxNcICA","dpe1vLewvM","FLsphNxx9V",
+"ogLgcZzJHW","dmoS7S77LH","7lUXZyEfy9","uoStwXflUq","J2mQi64s8N","ogLgclweGy","Nxx9VHfyNQ","FxX9qWmadA","okgRiU3yw5","wDajXXflUq",
+"RzaZAZv7z0","Cfgr3mz8gx","aez9yk85Ae","kB5nPAOgEe","hSSvQ9y4lw","iwzGkZ4I1v","4W0Tllm0pD","9rlg9Yh1hF","pT8wuIjTwP","Cfgr3TXQ0Z",
+"6q6L9hi5X7","CK5W7AXpwE","2ZHdk7Ow5C","soy9tYw2oU","D6rByzmLYD","GSQwjuvf7A","MezSWRxrsm","5nmWvd7vjM","IRh48YOfrY","5Mg9rDcpWB",
+"zFgtBdQ586","tuDySMojnP","5VZjSVIlwP","YjB9t1v5hH","GWqqXxciqp","JkzUnDz1R3","xReecVprf2","S77LHjeskS","UlU3MRBhp0","Kr8ysJIqXi",
+"fLNg8sqVrf","bZLvSjSjS3","MK07Yb29RJ","nlaByCp3mZ","FcWrWZuDtD","tl72WYw2oU","SWfoulpF6W","MGlTFC2Irc","0BmCyt59lR","pvgjS4W0Tl",
+"M6qcGy94nw","8hJdt1v5hH","BbwgAyEfy9","0MR5XdQ586","zQt6QtjQxs","IBe8kIBe8k","FFDuiSbRYy","QChxsNOHsz","vLsmSUmaEv","ulk41pmeCd",
+"7Ow5Catef2","tvdkDuTacx","gf8rIChuy3","ulk41ReKEW","tvdkDjzUqR","NOHszYjB9t","hi5X7atef2","nnP8oAIYUu","14FLRChuy3","3weIFNhXdu",
+"QYxC055rfB","FhtglyofH3","sx5GllpF6W","C2IrcIRh48","qaofNWmadA","UlU3MzY1GY","9eoRcIRh48","MmsIo8cVD3","hYBCK7hyVv","M3zXLhYBCK",
+"2DREskB5nP","nnP8oatef2","GSQwjZuDtD","soy9ts93Ml","U3yw5IKxdL","uLtKscmXIX","8xEKzVjCZq","5Drn0Q6hMC","GXdoHKZamH","lj07QChuy3",
+"jiVBPHlUbF","CqqaDMojnP","JkzUnuJScX","29QAzBbwgA","9iGoTb29RJ","ZzJHWK20wK","Z4I1v6q6L9","uAWypPYBf4","xReecBFkb8","iwzGkD6rBy",
+"DQimpmz8gx","ZuDtD8cVD3","iwzGkuZPqg","hYBCKhYBCK","xXTI4DcpWB","n8pJ9gdQsS","FnPFBguMb8","JJs5mhYBCK","fcwDaMm8si","JIqXi2Nslm",
+"Uvlv4IjTwP","QssNCEOE1o","t98iWiwzGk","JXljW29QAz","uN6r3s4786","YOfrYMGlTF","M3zXLksJby","AOgEeQWxoT","W7cTspvgjS","uAWypksJby",
+"HRxd8FLsph","BCxeC580YD","fqypyStlDJ","HlUbF1j5L8","M6qcGtl72W","2DREspT8wu","gIYvEAmdQd","k85Ael83Ud","8U2nUQYxC0","cmXIXTa8f6",
+"zQt6Qzz4ZU","RBhp0Zv7z0","14FLRfLNg8","7fKYUQ6hMC","kZANmCK5W7","DG4sTpT8wu","d85a9faHir","ni2v1pv0i7","he9IAJXljW","W7cTswDajX",
+"IRh4807n1c","aez9yRxrsm","9rlg95Mg9r","bZLvSlkMUA","FNYIMDz1R3","Vprf214FLR","lpF6WyluBx","Z4I1vlViBv","BFkb8U3yw5","jfREuQClRL",
+"jtn0XSjskQ","Uvlv4QbxXc","Uvlv4NOHsz","QbxXc7Ow5C","yvOMIsuY4x","AXpwEtuDyS","zmLYD8RCUA","BFkb8m4bxU","uPX7GuAWyp","FjHXRWPmlx",
+"Uvlv4D6rBy","No0QbCK5W7","NcICAazIWp","RBhp04QMc9","FVMxofcwDa","taOXK6q6L9","l83UdpiJSk","FLsph8xEKz","dQ5867fsYM","Cfgr3P6bcg",
+"KASQ8W3VFH","xXTI4t59lR","cmXIXU3yw5","yEfy9ECMvU","xReecsqVrf","BCxeC64s8N","MGlTF0BmCy","n1pmO1LB1L","HP4339y4lw","SWfouDQimp",
+"lkMUARACuj","RkQkewiHrZ","1v5hHfLNg8","14FLRwiHrZ","pWiOsAXpwE","Ta8f6JJs5m","zQt6Qsoy9t","Kr8ysPb1pa","pWiOsMK07Y","tjQxsQssNC",
+"LbRTHK4GS8","VerEAoGu6x","jfREu5VZjS","OUqFMe6e4z","FGzgpBbwgA","ksJbyksJby","RpBQmSmGzv","HP433ECMvU","i7WMQOUYuF","ZhwG1TXQ0Z",
+"2DREslViBv","JJs5mSjskQ","16lHc7Ow5C","cQOnvJKWYR","SmGzvTwano","EdBKcoVQp6","1LB1Luupzk","FVMxoo8Uyd","ZhwG1ru4UG","MmsIouLtKs",
+"SmGzvatef2","Cp3mZxciqp","DcpWBYjB9t","StlDJzY1GY","lm0pDEdBKc","2Yz7EFLsph","wiHrZPb1pa","0PktI5Mg9r","SbRYyFhtgl","FPfSE1v5hH",
+"ZhwG10h1b1","FGzgpHRxd8","pvgjSh1zcH","QChxsB3qem","rz7UtGXdoH","bZLvSi3pyd","aDGtSni2v1","WreyPFVMxo","iqv4kHRxd8","K4GS8RBhp0",
+"kZANmTwano","qQxHP1LB1L","K4GS8Oz8yZ","JKWYRkB5nP","IjTwPVerEA","lpF6WMK07Y","XflUqS2Dfu","QWxoTWmadA","Kr8ysL7cGc","lsQGoZUnqt",
+"gf8rIRmDcr","RsQUq5IhmG","k85AeWDVWJ","MmKGJcQOnv","DG4sTv1Hln","MGlTFHzZT8","blLA9ECMvU","580YD1j5L8","4W0TlVIlwP","Ss0ZuyEfy9",
+"AXpwEy94nw","tAOsr7fKYU","P6bcgMmsIo","J2mQiIRh48","8TxD7LbRTH","FcWrWzz4ZU","lkMUAsqVrf","RkQkeCK5W7","9iGoT6q6L9","tvdkDChuy3",
+"azIWpHzZT8","aDGtSZhwG1","jfREulXFOB","No0QbJJs5m","VIlwPAXpwE","yEfy9cShY2","Ul4a1TXQ0Z","KZamH7fKYU","8xEKz24ARF","dQ586BbwgA",
+"NOHszuvf7A","cQOnvni2v1","NAFuwDz1R3","5Mg9rksJby","s4786EOE1o","CxVEf0PktI","ZzJHWuTacx","OUYuFvOqCE","SmGzvQYxC0","tuDyS0MR5X",
+"lsQGoRmDcr","OHaBzpmeCd","55rfB2TRI7","yToGWM6qcG","xReecSs0Zu","9y4lw55rfB","DLhzMNxx9V","K4GS8FLsph","jiVBPTCgPp","uJScXtvdkD",
+"wDajXJXljW","nlaByjfREu","AmdQdWMiS3","P6bcgZ4I1v","OxWIHYjB9t","ydG8UMK07Y","BGaQYFxX9q","55rfB0BmCy","soy9tuAWyp","W7cTsxReec",
+"rhl0JzqH0W","48cHLTCgPp","EOE1oOUqFM","wiHrZZv7z0","QYxC0Mm8si","cQOnvQChxs","CIShG6AFT0","FVMxoNhXdu","K20wKx3LDe","uAWypFcWrW",
+"hUTw7NhXdu","zY1GYPOUYS","Y1mC0MaJQs","Kr8ysn8pJ9","IjTwPAmdQd","TXQ0ZuoStw","rz7UtEoToP","2DREsBFkb8","fmIK1zQt6Q","o8UydhE1Ql",
+"VNCPdnnP8o","i7WMQlm0pD","Z4I1vlpF6W","FVMxoMkgy8","pv0i7QbxXc","6q6L9BpYhV","jfREueuZA5","QnJ1S64s8N","16lHcnlaBy","0KyfsEdBKc",
+"8xEKzgf8rI","MmKGJBGaQY","Mm8sitAOsr","KASQ87fsYM","ZuDtD2DREs","Y1mC0PYBf4","4QMc9Oz8yZ","tAOsr8FmFH","Mm8si4QMc9","OxWIH24ARF",
+"PYBf4lH1kt","m4bxU7ku1p","Twano7X3uy","ZzJHWCqqaD","yvOMIhe9IA","gf8rIpAhR1","zY1GYSjskQ","JIqXi7ku1p","lkMUAChuy3","xReecpmeCd",
+"618DiOUYuF","tlILtMkgy8","NOHszW3VFH","ulk418cVD3","e6e4ztuDyS","lXFOBRACuj","FPfSEi3pyd","dhSuHfcwDa","QClRLBGaQY","djsrvjtn0X",
+"i7WMQ0PktI","8hJdtpv0i7","IBe8kqUJMd","lweGyVerEA","5iGN5piJSk","Cp3mZsoy9t","iKqhrVIlwP","07n1c5Mg9r","TXQ0ZK4GS8","Vprf2yToGW",
+"GrDg7CdyBV","Zv7z0FPfSE","IBe8kZhwG1","uvf7ADz1R3","Zv7z0Dz1R3","QnJ1SguMb8","JkzUnpAhR1","KZamHQClRL","Pb1paZJTXH","ru4UG3weIF",
+"Q6LixjSjS3","iKqhrZ4I1v","618Di24ARF","RsQUq0YAGH","SWfougdQsS","CNHmvtAOsr","VNCPdAIYUu","W3VFH5drc6","6q6L9FLsph","RBhp0jSjS3",
+"zmLYD7hyVv","CNHmvvkCHH","rz7UtPYBf4","iB08lSbRYy","Oz8yZuZPqg","lpF6W8FmFH","Q6hMCIBe8k","45cIHlsQGo","FLsph29QAz","2hEEUhYBCK",
+"iKqhr0BmCy","SjskQOUqFM","ix74rBpYhV","k85Aei7WMQ","XyPZNsqVrf","tl72WYOfrY","zY1GYUl4a1","DcpWBMK07Y","WmadAm4bxU","lCMxyv2eC3",
+"TCgPpSbRYy","jeskS8U2nU","k85Aexciqp","tAOsrYOfrY","5ZaEzYf2Ec","uJScXpFrrl","QbxXcK4GS8","Kr8ystjQxs","5iGN5KZamH","hE1QlReKEW",
+"WPmlxyofH3","24ARF8RCUA","tvdkDjS1aj","cQOnv45cIH","5drc6Ta8f6","2Yz7EC2Irc","Z4I1vMmsIo","Kr8ysnlaBy","ReKEWfLNg8","9iGoTJ2mQi",
+"IKxdLFGzgp","S77LHqUJMd","BFkb8KsjRK","WmadAjfREu","GWqqXDG4sT","soy9tCNHmv","DG4sTMkgy8","M3zXLtvdkD","lCMxyDz1R3","Kr8ysyvOMI",
+"cShY2fqypy","M6qcGKsjRK","cShY2Mkgy8","fFDrJKr8ys","8cVD3bgJAz","v1Hln5iGN5","yToGWJJs5m","O3iyQuLtKs","6q6L9d7vjM","oQ87rMezSW",
+"nlaBycmXIX","lweGy0PktI","0MR5XyofH3","JJs5mmX2GE","W7cTsQClRL","FFDuiOUqFM","d7vjMlViBv","W3VFHuvf7A","rKDLJvOqCE","VIlwPMaJQs",
+"aDGtSaL6AJ","blLA90YAGH","KZamHHlUbF","24ARFhYBCK","zz4ZUWaim6","CdyBVFwEJz","MaJQsv2eC3","ogLgcXyPZN","uAWypd85a9","taOXKDz1R3",
+"48cHL7fKYU","tAOsrEOE1o","UlU3Md85a9","oGu6x2ZHdk","Cfgr3ogLgc","VBjhzlkMUA","QYxC0CdyBV","FcWrWOUqFM","jtn0XThjNn","POUYSsuY4x",
+"PYBf4UmaEv","Y1mC0RsQUq","DG4sTiB08l","fcwDaKsjRK","ZzJHW9GXkX","M6qcGKr8ys","uN6r30Kyfs","mz8gx9rlg9","pWiOsTCgPp","5NammIKxdL",
+"zQt6QWPmlx","WaWsvECMvU","hSSvQxReec","Chuy3MGlTF","OxWIHCIShG","1v5hHMmsIo","jSjS3lkMUA","zqH0WuAWyp","jS1ajF6PT2","v1HlnlViBv",
+"5nmWvfaHir","IjTwPoQ87r","lViBvo8Uyd","MmKGJx3LDe","FNYIMZzJHW","rhl0Jrhl0J","x3LDey94nw","lViBvcQOnv","RzaZAFVMxo","Z4I1vt59lR",
+"QClRL1v5hH","BFkb80ao3l","NOHszVerEA","AOgEeBFkb8","W7cTsIn3NS","qQxHPd85a9","jfREuVLTy6","piJSkhE1Ql","vLsmSdhSuH","5nmWvzmLYD",
+"G1RhSyluBx","pFrrl8hJdt","yEfy9zHF1q","FcWrWpmeCd","pFrrl0YAGH","uLtKsbgJAz","PYBf4hE1Ql","7fsYMWMiS3","VIlwP6q6L9","L7cGctaOXK",
+"FjHXRy94nw","MmKGJAmdQd","ZUnqtyofH3","QnJ1S5Namm","QWxoTpWiOs","nlaByLbRTH","b29RJHRxd8","zmLYDi3pyd","m4bxUMm8si","cQOnvpT8wu",
+"dQ586X6Pin","t59lRQ6hMC","VBjhz5ZaEz","EOE1o9y4lw","hi5X7yvOMI","nnP8oGSQwj","8xEKz5drc6","RmDcrtjQxs","Yf2EcWaim6","lpF6WMkgy8",
+"KZamHuN6r3","QworuvOqCE","e6e4zfaHir","ciuWzTa8f6","7fsYMRpBQm","suY4xjfREu","CIShGYjB9t","MGlTFlkMUA","24ARFNo0Qb","y94nwIKxdL",
+"v2eC3ksJby","GSQwjzFgtB","5VZjSuZPqg","8cVD3kB5nP","YOfrYsoy9t","EOE1o4dEz6","VLTy6lViBv","55rfBBpYhV","FwEJzSmGzv","2TRI7y94nw",
+"t59lRM6qcG","hYBCKqaofN","oGu6xfcwDa","suY4xO3iyQ","8RCUALewvM","jS1aj8RCUA","K4GS8K20wK","GrDg7DLhzM","4QMc9GWqqX","AgJHQW3VFH",
+"Waim6BpYhV","hYBCK0MR5X","5VZjSYjB9t","Q6hMCs7Mxk","UmaEv5VZjS","wiHrZsqVrf","KASQ8e6e4z","faHirFnPFB","QChxsulk41","jSjS3CqqaD",
+"lXFOBM6qcG","sqVrf7lUXZ","tl72WcQOnv","1LB1LFGzgp","DQimpFLsph","580YDS77LH","ix74rHP433","WaWsvuLtKs","HzZT8rKDLJ","lXFOB2DREs",
+"cQOnvMojnP","3otm69GXkX","SmGzvhYBCK","SjskQvkCHH","2Yz7EGrDg7","8xEKzZuDtD","Pb1paDcpWB","blLA9k85Ae","FNYIMuvf7A","kB5nPCqqaD",
+"8TxD7iB08l","i7WMQiKqhr","kB5nPcQOnv","Q6hMCFPfSE","QnJ1S6AFT0","b29RJ24ARF","TXQ0ZlkMUA","wiHrZpT8wu","uJScXIBe8k","AkKTkqQxHP",
+"BFkb8fmIK1","EdBKcgtCA5","0ao3lBGaQY","ZJTXHsqVrf","8hJdt9eoRc","U3yw5FcWrW","fmIK1QYxC0","POUYSZJTXH","QClRLJXljW","jeskSoGu6x",
+"okgRiWDVWJ","GrDg7dQ586","IKxdLsuY4x","v1HlnD6rBy","vkCHHJkzUn","tvdkD8hJdt","tvdkDl83Ud","IjTwP3otm6","LDk6fblLA9","tjQxsMmKGJ",
+"vOqCEoVQp6","8RCUAnlaBy","AIYUuQnJ1S","7lUXZFxX9q","2NslmblLA9","s7MxkbrhlQ","uvf7AgtCA5","5NammGWqqX","AmdQdyofH3","uN6r3Twano",
+"tjQxsCK5W7","ni2v1faHir","zz4ZUpWiOs","4W0TlRkQke","9GXkXB3qem","oGu6xMmsIo","0Wr5yaDGtS","O3iyQMojnP","faHirJKWYR","cmXIXv2eC3",
+"tAOsrzHF1q","CK5W7tl72W","WaWsv9GXkX","azIWpQClRL","7fsYMFPfSE","pFrrlt98iW","pmeCdokgRi","uJScXazIWp","guMb89XyT9","pvgjSM6qcG",
+"x3LDeS77LH","uAWyph1zcH","In3NSWMiS3","Q6hMClkMUA","JKWYRn1pmO","5Mg9rYf2Ec","lpF6WD6rBy","07n1cNAFuw","JRJQBydG8U","tl72WWMiS3",
+"yToGWmz8gx","ZUnqtP6bcg","4dEz67X3uy","CNHmvD6rBy","WaWsvEdBKc","StlDJhUTw7","FFDuiFNYIM","MaJQsFVMxo","ZhwG1OxWIH","YjB9t9rlg9",
+"Uvlv42Nslm","O3iyQs7Mxk","Cfgr3dpe1v","LDk6fK4GS8","kB5nPCNHmv","zFgtBRkQke","lweGyuLtKs","yToGW3weIF","fmIK1XyPZN","UlU3MGrDg7",
+"hYBCKVNCPd","i3pydkZANm","9eoRcfaHir","LbRTHvkCHH","HzZT8aDGtS","suY4xMojnP","BCxeC2Nslm","tAOsrjtn0X","S77LHzz4ZU","faHir48cHL",
+"d7vjMIn3NS","0BmCyCIShG","dmoS7vLsmS","DLhzMuJScX","U3yw5blLA9","uupzkl83Ud","0MR5XFcWrW","Cfgr33otm6","lkMUAMezSW","1v5hHWaim6",
+"64s8NprNT6","lm0pD5IhmG","RkQkeAkKTk","0MR5XksJby","iqv4kmz8gx","oVQp63otm6","K20wKxReec","Mkgy8No0Qb","5VZjSWPmlx","48cHLgdQsS",
+"soy9tFLsph","MmKGJPOUYS","9rlg9zFgtB","6AFT0MezSW","9y4lw8RCUA","VerEADcpWB","DcpWBOUqFM","d7vjMzqH0W","YOfrYm4bxU","jzUqRM3zXL",
+"2TRI70Kyfs","gIYvEb29RJ","uJScX8RCUA","7Ow5COz8yZ","CdyBVB3qem","e6e4zKASQ8","ZJTXH8RCUA","RBhp0pv0i7","sx5GlhYBCK","24ARFCqqaD",
+"BpYhVqUJMd","0ao3lW3VFH","EdBKcJKWYR","7X3uyhE1Ql","rz7Ut8hJdt","16lHc9XyT9","64s8NW7cTs","2Yz7EpAhR1","yvOMIFNYIM","iwzGkFcWrW",
+"KsjRKS77LH","hE1Ql8U2nU","Vprf2uAWyp","FGzgpgf8rI","EOE1opvgjS","RmDcrVIlwP","TXQ0ZfaHir","fqypyaL6AJ","t59lRHP433","a00b5FcWrW",
+"SjskQo8Uyd","Zv7z0RkQke","64s8Nlm0pD","ZuDtDgdQsS","2Yz7E9GXkX","Yw2oUiKqhr","UlU3MAIYUu","cShY2tjQxs","0ao3lYw2oU","d85a9ZuDtD",
+"RxrsmAIYUu","MK07YBpYhV","OHaBz8TxD7","qUJMdMm8si","Gv3FqgdQsS","16lHcWaim6","Mkgy8b29RJ","djsrvlXFOB","qUJMddjsrv","yToGWZzJHW",
+"oQ87rksJby","TXQ0Z0BmCy","dQ5860h1b1","Yf2EcjfREu","Yh1hFDLhzM","lXFOBEdBKc","yEfy9Yw2oU","tAOsriwzGk","ZuDtD5VZjS","uJScXZhwG1",
+"Waim6bgJAz","RzaZAaL6AJ","guMb86AFT0","JkzUnyofH3","atef2piJSk","TXQ0ZIKxdL","5IhmGOz8yZ","zbIYYQworu","VjCZqDz1R3","uJScXMK07Y",
+"B3qem4dEz6","5nmWvdhSuH","mX2GEnnP8o","Nxx9VjzUqR","NOHszS2Dfu","hYBCKuN6r3","1v5hHRACuj","FjHXRDz1R3","lm0pD7lUXZ","QYxC0lm0pD",
+"yToGW7fsYM","Pb1paFjHXR","QClRLWaWsv","8RCUANxx9V","8RCUAXflUq","CqqaD7hyVv","s4786m4bxU","FGzgpzz4ZU","Chuy3GXdoH","m4bxUdQ586",
+"d85a9gIYvE","yToGW6q6L9","uJScX5drc6","PYBf4pWiOs","WmadAAmdQd","FhtglLewvM","djsrvlH1kt","QssNCn8pJ9","nFqikECMvU","L7cGcVNCPd",
+"xReec8TxD7","6AFT0euZA5","ECMvUzz4ZU","MojnP0MR5X","taOXK5IhmG","xXTI4pT8wu","AIYUuLbRTH","GXdoHFxX9q","2DREsfLNg8","tuDySyEfy9",
+"ogLgcQYxC0","AgJHQ64s8N","JKWYRoGu6x","soy9to8Uyd","Y1mC0zHF1q","J2mQidjsrv","M6qcGdpe1v","Waim6CxVEf","zz4ZUzY1GY","5IhmGcShY2",
+"G1RhSRkQke","blLA945cIH","jiVBPgf8rI","OUqFMM3zXL","9GXkXni2v1","azIWpOHaBz","FNYIMQnJ1S","Ul4a12DREs","VBjhzzmLYD","Ss0ZuQ6hMC",
+"FhtglSjskQ","OUYuF4QMc9","BbwgApT8wu","ZzJHWsx5Gl","Vprf2fcJOy","Mkgy8MojnP","zz4ZUpAhR1","d7vjMlkMUA","HfyNQiqv4k","StlDJprNT6",
+"iB08lGv3Fq","1j5L8vLsmS","RkQke5drc6","oVQp6MmKGJ","LbRTH1v5hH","yofH3WaWsv","PYBf4aez9y","2Yz7Esoy9t","s7MxkAmdQd","zQt6QtlILt",
+"P6bcguupzk","v2eC3LewvM","7fsYMokgRi","gdQsSzz4ZU","NhXduuAWyp","Ta8f6taOXK","uupzkYf2Ec","JXljWJkzUn","MGlTFprNT6","rz7UtS2Dfu",
+"kZANmRpBQm","EdBKcQChxs","K20wKuPX7G","lCMxyru4UG","MGlTFuvf7A","HP433M6qcG","euZA5SmGzv","No0Qbxciqp","2TRI70ao3l","Mm8siDQimp",
+"SbRYyNcICA","azIWpi3pyd","xXTI45IhmG","WreyPEdBKc","NhXdulj07Q","4dEz6VerEA","KZamHy94nw","WDVWJ5Mg9r","nnP8oeuZA5","8TxD7taOXK",
+"Uvlv4Ul4a1","y94nw8FmFH","I7p2apT8wu","RBhp0MmsIo","uN6r3Cfgr3","QYxC0TCgPp","pv0i79y4lw","Y1mC0uAWyp","jtn0X5iGN5","QYxC0Yh1hF",
+"cL0aEWreyP","3otm6jSjS3","4W0TlIRh48","7hyVv29QAz","zQt6QFFDui","5drc6lXFOB","Oz8yZi3pyd","gf8rIPb1pa","zY1GY5Drn0","8xEKzD6rBy",
+"tlILtLbRTH","5nmWvUlU3M","29QAztvdkD","Dz1R3YOfrY","Ta8f6l83Ud","RxrsmZzJHW","b29RJJIqXi","s93Mlni2v1","0h1b1pAhR1","gf8rIciuWz",
+"pT8wu8hJdt","WmadAa00b5","vLsmSJXljW","2ZHdk5VZjS","QWxoTrhl0J","Cfgr3uZPqg","ni2v12DREs","BGaQYOUqFM","e6e4zsx5Gl","F6PT2jzUqR",
+"MmsIoTwano","jS1ajkB5nP","UmaEvThjNn","iqv4kZhwG1","ni2v1uAWyp","16lHcHzZT8","Ta8f6jiVBP","m4bxUCIShG","2Yz7Ejtn0X","qUJMdStlDJ",
+"iB08l16lHc","KsjRKnFqik","l83UduAWyp","LewvMd85a9","vOqCECfgr3","WDVWJCIShG","Vprf2wDajX","4QMc9yluBx","MK07YzQt6Q","MGlTFqUJMd",
+"SjskQlweGy","DLhzMzz4ZU","FwEJzrz7Ut","iKqhrAIYUu","5Mg9rCdyBV","NhXdub29RJ","FLsph2Nslm","Q6LixFFDui","3weIFe6e4z","lkMUAVIlwP",
+"618DiQworu","OxWIHy94nw","he9IA9XyT9","tvdkDTCgPp","FxX9qa00b5","WreyPK20wK","QChxsxciqp","SjskQVjCZq","6q6L9jtn0X","RBhp0TCgPp",
+"K20wKBpYhV","WDVWJRBhp0","0ao3lcShY2","6q6L9VNCPd","fcwDa3otm6","RsQUqFFDui","soy9tqaofN","RBhp0yofH3","lweGyguMb8","1j5L87ku1p",
+"uoStwLewvM","7fsYMyofH3","wiHrZix74r","FwEJzwiHrZ","JIqXiB3qem","ZUnqtJKWYR","NAFuwa00b5","2ZHdkZzJHW","xReecPOUYS","K20wKyToGW",
+"uZPqgBGaQY","AgJHQ0MR5X","Uvlv47lUXZ","4QMc9i3pyd","MmKGJ618Di","soy9tbgJAz","nnP8oTwano","0YAGHNo0Qb","J2mQiNhXdu","brhlQsx5Gl",
+"ru4UGZ4I1v","9y4lwtaOXK","MK07YD6rBy","azIWpoVQp6","rKDLJWDVWJ","XyPZNGXdoH","5NammLewvM","FGzgpyvOMI","RmDcrrKDLJ","Waim6K20wK",
+"AgJHQJJs5m","4dEz6o8Uyd","iqv4kIKxdL","CqqaDIjTwP","aL6AJAkKTk","KASQ82ZHdk","JKWYRcL0aE","ciuWzb29RJ","AIYUulj07Q","DcpWBzFgtB",
+"MK07YW3VFH","KsjRKIKxdL","POUYSjtn0X","WmadALbRTH","C2IrczQt6Q","qaofNk85Ae","NAFuwoVQp6","mX2GEdmoS7","8hJdtwDajX","4QMc9Fhtgl",
+"ru4UG07n1c","d7vjMx3LDe","ECMvUyEfy9","MmKGJZJTXH","iwzGkDz1R3","580YDhE1Ql","M3zXLhe9IA","tuDySHlUbF","4QMc9v1Hln","atef2tvdkD",
+"fqypyFwEJz","GWqqX9GXkX","uZPqgJIqXi","yvOMId7vjM","xciqpYjB9t","lH1ktMkgy8","i3pydVLTy6","C2IrcUmaEv","tAOsrzQt6Q","FhtglGSQwj",
+"B3qemStlDJ","XyPZNnFqik","4W0TlMmKGJ","Oz8yZhe9IA","DcpWBWreyP","K20wK7ku1p","8RCUAAkKTk","prNT6uN6r3","s7Mxklj07Q","AXpwEDQimp",
+"fmIK1qUJMd","J2mQiFjHXR","B3qemulk41","uPX7GM6qcG","uPX7GprNT6","VIlwP0PktI","5ZaEzWmadA","7fKYUG1RhS","zmLYDlViBv","AkKTkuTacx",
+"tjQxs4QMc9","BGaQYgtCA5","dQ586wDajX","U3yw5FwEJz","StlDJv2eC3","PYBf40Kyfs","mX2GEkZANm","In3NSStlDJ","CIShGlsQGo","qUJMdpFrrl",
+"jSjS3X6Pin","IKxdLLDk6f","8FmFHfcwDa","xciqpkB5nP","qUJMd2hEEU","1j5L8fqypy","uPX7GtuDyS","WPmlxAgJHQ","MezSWn1pmO","5drc6y94nw",
+"t59lRiwzGk","7fsYMFwEJz","8FmFHUvlv4","VerEAazIWp","m4bxUWDVWJ","VerEAFnPFB","P6bcg16lHc","AXpwE3weIF","5Drn0yToGW","Waim6VIlwP",
+"K20wKVerEA","3weIFMGlTF","OHaBzFFDui","JKWYRfcwDa","dQ586yvOMI","MK07Yatef2","bZLvSaDGtS","taOXKYw2oU","WMiS3AIYUu","iwzGkzqH0W",
+"Waim6Q6hMC","AgJHQn1pmO","NhXduuoStw","zY1GYVNCPd","7fKYUC2Irc","C2Irc618Di","Nxx9VuoStw","W7cTsv8yFN","fcwDaZhwG1","ZUnqty94nw",
+"suY4xSmGzv","MaJQsJJs5m","i3pydRpBQm","0MR5XK4GS8","uoStwFnPFB","UlU3MNo0Qb","nlaBy8cVD3","8RCUAjtn0X","StlDJa00b5","Q6LixMmKGJ",
+"TXQ0ZRBhp0","pWiOstuDyS","M6qcGM6qcG","2DREshi5X7","8RCUAPYBf4","WMiS3iB08l","v1HlnMmsIo","uupzkYw2oU","AXpwEJJs5m","uupzklweGy",
+"tl72Wgf8rI","lkMUADcpWB","kZANmIjTwP","ZzJHWogLgc","lH1ktqaofN","2DREs2Nslm","pvgjSOUqFM","yvOMIlViBv","pAhR1BGaQY","aFFssvOqCE",
+"FNYIMqUJMd","0KyfsMaJQs","2ZHdklsQGo","Q6LixGXdoH","yvOMIgjUTu","7Ow5CyofH3","lm0pDgIYvE","HRxd8NcICA","L7cGccQOnv","uoStwcQOnv",
+"soy9tru4UG","i7WMQFcWrW","v2eC3K4GS8","ReKEW2hEEU","GSQwjzHF1q","MaJQs2Yz7E","4dEz6GrDg7","U3yw5Rxrsm","yluBxyToGW","Ul4a15nmWv",
+"uLtKsZUnqt","5nmWvprNT6","gdQsSNo0Qb","FPfSEUvlv4","FGzgpydG8U","ni2v1Q6Lix","9XyT9NhXdu","ZUnqtuAWyp","Yf2EcZUnqt","nFqikatef2",
+"FnPFBZzJHW","DcpWBatef2","Ta8f69XyT9","NAFuwpT8wu","jiVBPLDk6f","RpBQmtvdkD","6q6L99rlg9","8cVD3L7cGc","B3qem6q6L9","Nxx9VzqH0W",
+"uLtKsRxrsm","yluBxb29RJ","48cHLcL0aE","uAWyp5IhmG","jS1aj7hyVv","2ZHdkfFDrJ","XyPZNBFkb8","zz4ZUhE1Ql","BpYhVZJTXH","8RCUAZUnqt",
+"n1pmOru4UG","3weIFRsQUq","s4786QChxs","e6e4zpFrrl","BbwgAlH1kt","yofH3zbIYY","Ss0Zulm0pD","Ss0ZuSs0Zu","WMiS3bgJAz","TCgPpQnJ1S",
+"MGlTFG1RhS","UmaEvcShY2","Dz1R31v5hH","tl72WHlUbF","WreyPAXpwE","FjHXRRmDcr","Mm8silweGy","8hJdtRBhp0","OUYuFvkCHH","d7vjMt59lR",
+"lH1ktMmsIo","0Wr5yWMiS3","StlDJkB5nP","uQIczSmGzv","RkQkeBGaQY","FcWrWD6rBy","MGlTFLbRTH","JJs5mRmDcr","5ZaEzMaJQs","a00b55IhmG",
+"4dEz6JRJQB","DQimpDLhzM","Cfgr3iB08l","jtn0XzqH0W","t98iWHRxd8","Mkgy8qaofN","HzZT8uQIcz","DLhzMix74r","l83UdOz8yZ","IBe8kgjUTu",
+"hi5X7Nxx9V","XflUqCIShG","yvOMINOHsz","iB08lAXpwE","a00b50PktI","0h1b1BFkb8","yToGWF6PT2","5drc6LDk6f","XyPZNjfREu","NhXduUl4a1",
+"MGlTF7X3uy","ydG8UtlILt","7X3uy8TxD7","fLNg8gdQsS","2Nslm9eoRc","uLtKsVNCPd","HzZT8YjB9t","i7WMQ5Namm","x3LDelm0pD","RBhp0n8pJ9",
+"14FLRMK07Y","VjCZqpT8wu","Z4I1vVNCPd","FwEJzlweGy","pWiOsk85Ae","ni2v1blLA9","14FLRGXdoH","8RCUA0MR5X","U3yw5wiHrZ","gdQsSSjskQ",
+"7X3uyCqqaD","oGu6xOHaBz","SjskQaDGtS","fqypyBpYhV","atef2gIYvE","NcICA9rlg9","RpBQmNAFuw","rKDLJ4W0Tl","qQxHPOxWIH","jzUqRnFqik",
+"4dEz6MezSW","8hJdtjzUqR","hUTw7NcICA","UlU3M7Ow5C","B3qem5nmWv","ReKEWaDGtS","Dz1R3MezSW","jS1ajo8Uyd","VjCZqJkzUn","8TxD7i7WMQ",
+"2ZHdkdmoS7","mX2GE48cHL","1LB1LprNT6","iB08lPOUYS","lXFOBXyPZN","24ARFWaim6","0Kyfsi7WMQ","ZuDtDzz4ZU","QYxC0WPmlx","M3zXLyluBx",
+"FwEJz4QMc9","NcICAB3qem","S2DfuQ6hMC","2ZHdktjQxs","k85AeSmGzv","NAFuwtaOXK","16lHco8Uyd","n1pmOW7cTs","jiVBPzHF1q","uTacxtaOXK",
+"Oz8yZC2Irc","mX2GE8U2nU","cQOnvMGlTF","JJs5mMmsIo","VerEAWPmlx","pv0i7In3NS","QworufaHir","ThjNnNxx9V","dhSuHUmaEv","UmaEvJ2mQi",
+"fFDrJ1j5L8","FNYIM07n1c","pAhR1SbRYy","aL6AJFVMxo","Yf2Eca00b5","ZJTXHl83Ud","hSSvQlpF6W","K4GS8WmadA","PYBf4BbwgA","mX2GEfqypy",
+"RsQUqZhwG1","nlaByRmDcr","7fsYM5Drn0","QClRLAkKTk","QbxXc5ZaEz","vkCHHEdBKc","fqypy9eoRc","Q6LixFGzgp","jzUqROUqFM","1j5L8LbRTH",
+"ZuDtD6q6L9","LbRTHUlU3M","KASQ8M3zXL","CNHmvCK5W7","Kr8ysKZamH","ksJbyO3iyQ","WDVWJCNHmv","8hJdtTa8f6","HP433cShY2","aez9y9eoRc",
+"KASQ87fKYU","8hJdthSSvQ","MojnPuPX7G","Mm8siZhwG1","yEfy9VjCZq","8U2nUuTacx","k85AeuZPqg","CNHmvs4786","oGu6xXyPZN","In3NSQYxC0",
+"BbwgAuoStw","8U2nUWreyP","X6Pini7WMQ","wDajXjzUqR","VLTy6s7Mxk","iwzGkvOqCE","ogLgcuJScX","HlUbFKASQ8","LDk6ftl72W","Q6Lix7Ow5C",
+"suY4x4dEz6","uoStw16lHc","SbRYynnP8o","b29RJFhtgl","M6qcGY1mC0","LewvMRsQUq","OUYuFQChxs","HfyNQKASQ8","0h1b1ksJby","azIWpFLsph",
+"UmaEv7fKYU","07n1cSjskQ","NhXduOxWIH","U3yw5BpYhV","5Drn0qaofN","TwanoBFkb8","aL6AJjzUqR","okgRixXTI4","aez9yLDk6f","JJs5mAgJHQ",
+"C2IrcCK5W7","WDVWJKZamH","yofH3faHir","iqv4kMmKGJ","Yw2oUECMvU","ulk41fqypy","DLhzMZUnqt","S77LHFGzgp","QssNC48cHL","IRh48tl72W",
+"HfyNQgIYvE","vLsmSgtCA5","FPfSEvLsmS","pAhR12DREs","QworuReKEW","Q6LixqQxHP","yEfy9vOqCE","qUJMdrz7Ut","ydG8UZUnqt","5nmWvFFDui",
+"FNYIMcmXIX","v8yFNnlaBy","uupzk7fKYU","RACuj9iGoT","LbRTHAOgEe","Pb1paQYxC0","BbwgAatef2","POUYSgf8rI","8FmFHC2Irc","FjHXROUqFM",
+"CNHmvZhwG1","5Namm0Wr5y","55rfBL7cGc","HP4331j5L8","fcwDawiHrZ","BFkb8lXFOB","jzUqRCdyBV","qUJMduAWyp","QssNCpWiOs","n8pJ9xXTI4",
+"QYxC0aDGtS","zFgtBMaJQs","0MR5XRxrsm","DLhzMuLtKs","BbwgAmX2GE","s93MluLtKs","Y1mC0zbIYY","0KyfsJkzUn","euZA5e6e4z","piJSk9rlg9",
+"QChxsVNCPd","MaJQs8FmFH","KZamHNcICA","9rlg9Fhtgl","gjUTusqVrf","pWiOsv2eC3","lpF6W8RCUA","GXdoHuvf7A","k85AeQYxC0","K20wK55rfB",
+"zqH0WuZPqg","4W0TlvLsmS","NAFuwt98iW","U3yw5PYBf4","uJScXrKDLJ","W7cTs9y4lw","0ao3lVBjhz","hi5X7tuDyS","4dEz6TXQ0Z","OUqFMfqypy",
+"zmLYDWPmlx","suY4xlm0pD","wDajXdpe1v","o8UydkZANm","9eoRctaOXK","JJs5mC2Irc","he9IAhe9IA","5drc6blLA9","jSjS3WMiS3","pvgjSWMiS3",
+"blLA9EoToP","CIShGCp3mZ","RsQUqsqVrf","FxX9qYh1hF","8U2nUgtCA5","CK5W70YAGH","VjCZqRBhp0","zY1GY9GXkX","SjskQ7hyVv","hUTw7BFkb8",
+"2Yz7EKASQ8","oQ87rQ6Lix","VBjhzUl4a1","iKqhrY1mC0","cmXIXK20wK","D6rBy2Yz7E","Zv7z0BFkb8","WDVWJbgJAz","YjB9tEOE1o","4dEz6CxVEf",
+"VIlwPCxVEf","gtCA5piJSk","SjskQlViBv","atef2ix74r","Cfgr3aL6AJ","VjCZqX6Pin","580YDcQOnv","cQOnvyofH3","MGlTFlXFOB","s7MxkU3yw5",
+"fcwDaZzJHW","VNCPddmoS7","M3zXLjS1aj","oVQp6Zv7z0","9y4lwUl4a1","djsrvciuWz","CNHmvWreyP","FhtglWreyP","ni2v1cL0aE","EdBKcCfgr3",
+"W3VFHblLA9","guMb8RpBQm","5NammtlILt","AIYUuhYBCK","WreyPpmeCd","1v5hH0Wr5y","B3qemuupzk","oQ87rzY1GY","0ao3lMaJQs","580YDs93Ml",
+"G1RhS0Kyfs","0MR5XEoToP","EoToPStlDJ","wiHrZy94nw","fqypyMojnP","FjHXRuupzk","CdyBVCK5W7","55rfBNxx9V","faHir6AFT0","ydG8U8RCUA",
+"blLA9RpBQm","euZA5Qworu","5drc6yofH3","tuDySCqqaD","taOXKQ6hMC","07n1culk41","AXpwEOz8yZ","7ku1phi5X7","HRxd8RkQke","kZANm5VZjS",
+"P6bcgMmKGJ","kZANmRzaZA","cShY2SWfou","pFrrlECMvU","24ARFFVMxo","1v5hHRsQUq","O3iyQ7fsYM","MmKGJGv3Fq","fFDrJYOfrY","SmGzvuJScX",
+"nFqikFVMxo","TwanoCp3mZ","tAOsr7ku1p","NcICAmX2GE","BbwgAThjNn","Oz8yZjtn0X","Yh1hFvOqCE","taOXKIjTwP","m4bxUvOqCE","FGzgp9GXkX",
+"WDVWJZhwG1","2TRI7rKDLJ","RzaZAhi5X7","EOE1oBCxeC","uZPqgqUJMd","HlUbFCfgr3","GXdoHKASQ8","TCgPpfcwDa","qUJMdQ6hMC","Mm8si9XyT9",
+"lsQGoIKxdL","uQIczFwEJz","TwanopT8wu","9y4lwqQxHP","Gv3FqsqVrf","QbxXcRxrsm","ulk41SWfou","JKWYRFLsph","SmGzvThjNn","taOXKOz8yZ",
+"1j5L85Drn0","iwzGkEOE1o","FcWrWFxX9q","AIYUuQbxXc","dQ586NcICA","y94nwd85a9","n1pmOfmIK1","m4bxUogLgc","Y1mC0RkQke","LDk6fO3iyQ",
+"NcICAv1Hln","In3NSRsQUq","euZA5KASQ8","X6PinC2Irc","JRJQBtaOXK","FwEJzjS1aj","xciqpdhSuH","5Mg9rni2v1","45cIHuTacx","tAOsr9rlg9",
+"i7WMQBpYhV","tuDySzY1GY","F6PT2nnP8o","ogLgcpT8wu","RACujtl72W","SbRYyRkQke","vkCHHyToGW","ydG8UGv3Fq","lH1ktOxWIH","zbIYYv8yFN",
+"lCMxyQClRL","uPX7GgIYvE","lXFOBK20wK","h1zcHfFDrJ","LbRTHpAhR1","XflUq0Wr5y","0KyfsNo0Qb","LDk6fAIYUu","618DigjUTu","CK5W7zY1GY",
+"zz4ZUAgJHQ","qaofNuPX7G","29QAzNhXdu","7ku1puJScX","FFDui5Mg9r","oQ87rqaofN","M3zXLwDajX","uJScXdhSuH","VBjhzChuy3","OUYuFUvlv4",
+"iqv4kyEfy9","5NammlweGy","nFqikJXljW","OUqFM64s8N","MmsIoqaofN","64s8Ne6e4z","IjTwPFLsph","piJSkksJby","0Wr5yD6rBy","No0QbLewvM",
+"SWfouNhXdu","pAhR1wDajX","VerEA618Di","HfyNQQssNC","zY1GYJ2mQi","29QAzhUTw7","9iGoTh1zcH","qUJMddhSuH","Q6hMC07n1c","YOfrYECMvU",
+"K4GS8HzZT8","qQxHPoQ87r","VIlwPYOfrY","iB08lXflUq","jiVBP0BmCy","M3zXLgIYvE","U3yw5OUYuF","P6bcgGXdoH","Ul4a1pT8wu","nlaBys4786",
+"l83UdqQxHP","5VZjSyluBx","gtCA5xXTI4","7Ow5Cmz8gx","JKWYRYjB9t","CIShGix74r","piJSkPb1pa","Nxx9VPOUYS","CxVEfFxX9q","AXpwEbrhlQ",
+"JIqXiuvf7A","B3qem8hJdt","CqqaDeuZA5","iKqhrYf2Ec","ru4UGWDVWJ","8hJdtQnJ1S","AXpwEiqv4k","5ZaEzJXljW","0BmCyzFgtB","jzUqRfcwDa",
+"HfyNQxXTI4","zFgtB5nmWv","zqH0Wrhl0J","StlDJLbRTH","JRJQBHRxd8","TwanoqQxHP","SWfoukB5nP","dmoS7NAFuw","Fhtglix74r","AmdQdVBjhz",
+"iqv4ktl72W","tvdkDulk41","lpF6WfaHir","gf8rIAgJHQ","FnPFBjfREu","v1HlnHP433","U3yw5ksJby","ThjNnMm8si","vkCHHkB5nP","Ta8f6HlUbF",
+"5NammSs0Zu","hSSvQHP433","tlILtAmdQd","M6qcGnnP8o","b29RJuJScX","vkCHH48cHL","aez9yix74r","2ZHdkKr8ys","yofH3Zv7z0","uTacxSjskQ",
+"hYBCKVIlwP","BbwgApWiOs","LbRTHt98iW","07n1c5VZjS","TCgPpYw2oU","pT8wuaez9y","JJs5mIBe8k","Zv7z0soy9t","oGu6xFcWrW","nnP8oyvOMI",
+"29QAzVLTy6","faHircShY2","ZJTXH2Nslm","IRh48suY4x","S77LHjSjS3","Kr8ysZuDtD","gtCA5Yf2Ec","WPmlx4dEz6","ciuWz2hEEU","AmdQdQssNC",
+"4W0TlU3yw5","rKDLJ2DREs","tvdkDpT8wu","he9IAMojnP","lj07Q7X3uy","RsQUqOUYuF","cShY2K20wK","GWqqXtl72W","Zv7z0yToGW","RBhp0IjTwP",
+"djsrvokgRi","FPfSE16lHc","7fsYMF6PT2","gf8rIFNYIM","a00b5sqVrf","B3qemUl4a1","uoStwAgJHQ","jiVBP1LB1L","Z4I1vHfyNQ","tuDySFwEJz",
+"8U2nUFVMxo","ZJTXHfmIK1","oVQp6Twano","jS1aj8cVD3","hUTw7QbxXc","2hEEUsx5Gl","D6rByAOgEe","zQt6Quvf7A","NAFuws4786","lXFOB618Di",
+"5iGN5AOgEe","cQOnvFnPFB","FjHXRjSjS3","VNCPdv1Hln","ogLgc45cIH","8hJdtfcJOy","bgJAzs4786","IjTwPokgRi","qaofNRACuj","QssNCb29RJ",
+"WaWsvlweGy","4W0TlVjCZq","vkCHHoQ87r","JKWYRVerEA","7Ow5CuPX7G","Mm8sitlILt","9iGoTtAOsr","vkCHHFFDui","blLA9F6PT2","MaJQsnFqik",
+"Cp3mZ2Yz7E","Dz1R3FPfSE","WreyP2DREs","KsjRKK20wK","IRh48iKqhr","t98iWGSQwj","4QMc9ni2v1","GSQwjru4UG","qaofNru4UG","vOqCEFFDui",
+"kB5nPni2v1","v1HlnM6qcG","2hEEU1j5L8","SmGzvOUqFM","No0QbW7cTs","SWfouSbRYy","wiHrZnFqik","QWxoTOUqFM","gIYvEMGlTF","Oz8yZnnP8o",
+"FcWrW1LB1L","Kr8ystaOXK","24ARFRxrsm","fqypyhSSvQ","CdyBVSjskQ","0KyfsDLhzM","RzaZAfqypy","FGzgp8hJdt","atef2ZJTXH","lCMxyYw2oU",
+"hE1Ql9y4lw","jiVBPYw2oU","MaJQsCIShG","48cHLFVMxo","0h1b1uQIcz","zFgtBLbRTH","AgJHQMojnP","NhXdu0YAGH","IKxdL5drc6","ReKEWU3yw5",
+"ksJbyCK5W7","aFFssMK07Y","OHaBzpAhR1","lpF6Wm4bxU","uJScXQssNC","OUYuFpFrrl","5ZaEz6AFT0","he9IApmeCd","FhtglqQxHP","l83UdRpBQm",
+"ReKEWHlUbF","StlDJvkCHH","bgJAzy94nw","SWfouM3zXL","oQ87rIRh48","WaWsvIn3NS","lj07Q45cIH","580YD3otm6","8TxD77fKYU","RACujfFDrJ",
+"Y1mC0jiVBP","IBe8k2hEEU","W7cTsMkgy8","MK07Y9rlg9","FhtglIBe8k","cShY20BmCy","7ku1pnlaBy","5ZaEzPYBf4","i7WMQ0BmCy","Ul4a1b29RJ",
+"Uvlv4oGu6x","AXpwE5drc6","uoStwQClRL","y94nw29QAz","7X3uyBGaQY","Gv3FqfcwDa","gdQsSpmeCd","HfyNQ0ao3l","0KyfsDG4sT","uTacxSWfou",
+"aFFssi7WMQ","SWfouuAWyp","FNYIMi7WMQ","ZzJHWNAFuw","LDk6frhl0J","qUJMd7fsYM","FVMxoaL6AJ","wDajXReKEW","DQimpGSQwj","aDGtS45cIH",
+"pmeCdFPfSE","bZLvSuoStw","2DREsSs0Zu","2DREs5iGN5","JRJQBprNT6","9eoRc9y4lw","NcICAtl72W","QssNC1j5L8","lm0pDZJTXH","Yh1hFGXdoH",
+"tvdkDaL6AJ","Y1mC0LewvM","tlILtCqqaD","he9IAt59lR","sqVrfjtn0X","FNYIMfmIK1","Y1mC0d7vjM","M3zXLGWqqX","RsQUqoVQp6","v1HlngIYvE",
+"IjTwPxXTI4","pWiOsFnPFB","lsQGoIRh48","5drc6cmXIX","FwEJzFnPFB","RBhp0RsQUq","4QMc9sqVrf","HRxd8dhSuH","5drc6jtn0X","RkQkex3LDe",
+"pv0i71LB1L","9XyT9Yf2Ec","1v5hHMK07Y","i7WMQRACuj","gf8rIhUTw7","zQt6Q8U2nU","AXpwEYh1hF","GrDg7ZhwG1","5ZaEzi7WMQ","yToGW8xEKz",
+"Dz1R3rKDLJ","xXTI4In3NS","vLsmSNhXdu","HlUbFTXQ0Z","okgRiHP433","fqypylm0pD","5IhmGRkQke","KASQ8OHaBz","JkzUnQChxs","Waim6gIYvE",
+"fFDrJlm0pD","oVQp6wDajX","kB5nPK4GS8","M6qcGzY1GY","Cfgr3lH1kt","JIqXiIBe8k","7ku1pkZANm","ni2v1lH1kt","ZJTXHJ2mQi","Yf2EcGXdoH",
+"VerEAGv3Fq","Mkgy8i7WMQ","5VZjSaDGtS","lViBvJJs5m","NAFuwS2Dfu","m4bxUkZANm","9rlg9jiVBP","RmDcrC2Irc","tl72W0Kyfs","tlILt7fsYM",
+"zqH0WVNCPd","9rlg9VIlwP","zHF1q618Di","W3VFHksJby","Dz1R3FcWrW","lViBv5VZjS","vOqCEyvOMI","G1RhSLbRTH","HlUbFWDVWJ","s4786SbRYy",
+"jtn0XpFrrl","dhSuHv1Hln","0YAGHWreyP","16lHcPOUYS","7Ow5Ca00b5","RsQUqfaHir","Z4I1vZv7z0","kB5nPblLA9","FxX9qs4786","e6e4zcQOnv",
+"IKxdLWPmlx","K4GS8Yh1hF","8hJdtJXljW","W3VFHtvdkD","WMiS3gf8rI","WMiS35IhmG","euZA5CK5W7","OxWIHHfyNQ","8RCUAVprf2","Z4I1vFxX9q",
+"CK5W7fmIK1","YOfrYpT8wu","48cHLjeskS","QssNCoQ87r","B3qemBbwgA","1v5hHqQxHP","DcpWB64s8N","xReecix74r","WMiS3VBjhz","JJs5mzbIYY",
+"pvgjSJIqXi","tlILtlXFOB","zFgtByofH3","Gv3Fqlm0pD","fcJOyRzaZA","lViBvLewvM","guMb8HRxd8","JkzUnlweGy","7lUXZtaOXK","K20wKrhl0J",
+"fcwDaZUnqt","xReecLewvM","FnPFBvOqCE","WMiS37lUXZ","e6e4zm4bxU","y94nwRsQUq","yluBxUl4a1","m4bxUaDGtS","FVMxos4786","uLtKshe9IA",
+"2ZHdks7Mxk","48cHL45cIH","KsjRKU3yw5","GWqqXokgRi","QbxXctuDyS","lj07QU3yw5","9y4lwaL6AJ","MmsIoHP433","gtCA5CdyBV","Q6hMC0ao3l",
+"fcwDaG1RhS","hi5X7JXljW","IjTwPIn3NS","WaWsv2TRI7","JXljWfLNg8","Yw2oUtvdkD","gIYvEnlaBy","uAWyprKDLJ","Kr8ysNo0Qb","cL0aEcShY2",
+"HfyNQB3qem","xXTI4v8yFN","Yf2Ec4dEz6","9y4lwOxWIH","i3pydfcwDa","n1pmO0Wr5y","UmaEvvkCHH","9eoRcLDk6f","45cIHCqqaD","s93MlYf2Ec",
+"IBe8k7fKYU","Fhtgl0Kyfs","ksJbyiwzGk","RmDcrlViBv","M3zXL0Kyfs","5NammO3iyQ","FNYIM5drc6","5VZjSn8pJ9","y94nwDcpWB","PYBf4CqqaD",
+"fcJOyRkQke","bZLvSnnP8o","JKWYRU3yw5","ThjNnvLsmS","uJScXCIShG","1j5L8B3qem","Yf2EccmXIX","JkzUngtCA5","VLTy6FxX9q","HP433v2eC3",
+"2NslmyvOMI","fLNg8FnPFB","4W0TluQIcz","U3yw5uoStw","o8UydyluBx","zbIYYFwEJz","DG4sTHP433","zQt6Q7Ow5C","48cHLuvf7A","kZANm9iGoT",
+"RpBQmaFFss","B3qem9eoRc","uLtKslViBv","oVQp6BpYhV","SWfouCIShG","0Wr5ytl72W","0PktIx3LDe","yofH307n1c","euZA56AFT0","RsQUquupzk",
+"ZJTXHcmXIX","8cVD3pFrrl","LDk6ffmIK1","EdBKcChuy3","JkzUnNo0Qb","AXpwE5IhmG","hE1QlpmeCd","fcwDahE1Ql","tl72WprNT6","Uvlv45VZjS",
+"hUTw7prNT6","tvdkDoVQp6","OUqFMuvf7A","o8UydVprf2","SWfoupT8wu","RkQkeZ4I1v","s4786he9IA","pAhR18cVD3","Twanoix74r","P6bcgNo0Qb",
+"uvf7AFxX9q","uvf7AJIqXi","piJSklViBv","rz7Uts93Ml","TCgPp48cHL","NcICAFnPFB","iwzGkqUJMd","LbRTH9rlg9","7ku1patef2","I7p2azqH0W",
+"o8UydFnPFB","lj07QWaWsv","L7cGcYOfrY","EdBKchYBCK","4W0Tlsx5Gl","7X3uyhi5X7","kB5nPWPmlx","gf8rICqqaD","8hJdt48cHL","M3zXLWmadA",
+"CdyBVPOUYS","CK5W7okgRi","0YAGHbgJAz","sx5GlxXTI4","FcWrWlj07Q","CxVEfJIqXi","WreyPDLhzM","dmoS7dpe1v","taOXKNhXdu","NOHszguMb8",
+"yofH3Ul4a1","NcICAPb1pa","jSjS3uTacx","SmGzvNcICA","TXQ0Z7lUXZ","48cHLCfgr3","ThjNnJKWYR","euZA5rKDLJ","ThjNni7WMQ","dpe1vCqqaD",
+"iKqhrAgJHQ","NcICAlH1kt","14FLRRpBQm","soy9ta00b5","ThjNnzHF1q","oVQp61v5hH","OUqFMvLsmS","dhSuH8RCUA","JJs5mHP433","rz7UtL7cGc",
+"b29RJs7Mxk","uZPqgWaim6","uJScXbZLvS","8TxD7qUJMd","iwzGkuLtKs","7fKYUFhtgl","RsQUq5Drn0","W7cTslkMUA","jfREuyEfy9","CdyBVsoy9t",
+"pv0i7wDajX","Mm8siSbRYy","oVQp6B3qem","hE1QlTwano","t59lRdhSuH","s4786QbxXc","lpF6WGWqqX","v2eC3ni2v1","EoToPi7WMQ","dQ586MojnP",
+"CK5W77lUXZ","Yf2EclViBv","MGlTFUvlv4","7Ow5CP6bcg","fcwDazHF1q","D6rByZ4I1v","yvOMITXQ0Z","CNHmv6AFT0","9iGoTHlUbF","NOHszHfyNQ",
+"EoToPL7cGc","OxWIHQChxs","taOXKni2v1","mz8gxpWiOs","uAWypJKWYR","xReectAOsr","W7cTsZuDtD","48cHLJRJQB","FjHXR2ZHdk","1LB1LfmIK1",
+"2ZHdk0BmCy","QWxoT6AFT0","Yw2oUlkMUA","Uvlv4s7Mxk","nFqikoGu6x","FcWrWSbRYy","jSjS3Vprf2","atef2d85a9","ECMvUFPfSE","IKxdLlXFOB",
+"JKWYRjtn0X","8hJdt2TRI7","oQ87rgf8rI","JkzUnMK07Y","8FmFHQ6Lix","LewvM55rfB","guMb8Chuy3","5Drn0GrDg7","9rlg90YAGH","GrDg714FLR",
+"GSQwj3weIF","n8pJ9580YD","nlaByt98iW","2NslmXyPZN","yToGWlj07Q","NAFuw6AFT0","mX2GEQChxs","xReeclpF6W","suY4xFPfSE","AkKTk5iGN5",
+"Ta8f6AkKTk","jSjS3wiHrZ","8FmFHy94nw","5Drn00ao3l","XflUqMkgy8","TCgPp14FLR","9rlg97Ow5C","5iGN5euZA5","gjUTuFcWrW","S77LH8RCUA",
+"Ul4a1fcJOy","QworuS77LH","yvOMIuJScX","IKxdLNOHsz","Yw2oURpBQm","ZJTXH2hEEU","aL6AJ7ku1p","lH1ktoGu6x","QYxC0M6qcG","fcJOygf8rI",
+"DLhzMlpF6W","D6rBywiHrZ","VerEAReKEW","WreyPv8yFN","45cIHbZLvS","lXFOBjSjS3","PYBf4LbRTH","16lHcVjCZq","WDVWJdpe1v","nnP8oTa8f6",
+"Pb1pa4dEz6","K20wKZJTXH","yvOMIBFkb8","HP433HP433","FFDuigf8rI","FNYIMAIYUu","Zv7z0uvf7A","ECMvUCdyBV","WDVWJMmsIo","NOHszd7vjM",
+"hUTw7fLNg8","W3VFH2DREs","EdBKcbZLvS","5NammCNHmv","9y4lwaFFss","ix74rFNYIM","AgJHQuTacx","8hJdtjtn0X","QssNCMmsIo","HzZT8wiHrZ",
+"LewvMAgJHQ","FVMxo7lUXZ","x3LDepT8wu","AgJHQU3yw5","Yf2EcyvOMI","64s8NJkzUn","7fsYMuZPqg","rKDLJfcJOy","OUYuFDQimp","0ao3lKASQ8",
+"Gv3FqguMb8","2NslmS2Dfu","UlU3MYf2Ec","a00b5vOqCE","okgRiuQIcz","yofH3Fhtgl","M6qcGIn3NS","piJSkyEfy9","X6PinVBjhz","DQimpBFkb8",
+"FjHXRHP433","aL6AJdhSuH","uLtKsP6bcg","HzZT8Oz8yZ","RACujn8pJ9","cShY24W0Tl","0MR5Xd7vjM","KASQ8RACuj","MaJQs7lUXZ","Yf2Ech1zcH",
+"taOXKyofH3","nnP8oSmGzv","2DREs5Namm","UlU3MVprf2","KsjRK7X3uy","ZhwG1GrDg7","ogLgc4dEz6","8FmFHWPmlx","LewvMPYBf4","9GXkX6AFT0",
+"Zv7z0prNT6","tAOsrQClRL","oGu6xJRJQB","QYxC0AmdQd","DG4sTFVMxo","a00b5Rxrsm","8FmFHRmDcr","QbxXc9y4lw","7hyVv580YD","7lUXZQ6hMC",
+"he9IATwano","I7p2aECMvU","HRxd8ZUnqt","Q6hMCBGaQY","TXQ0Zv1Hln","qUJMdMaJQs","1v5hH5drc6","L7cGcuPX7G","pAhR1X6Pin","VIlwPFxX9q",
+"BCxeCt98iW","0PktIzqH0W","S2DfuDQimp","7Ow5C8TxD7","iB08l2hEEU","WDVWJLbRTH","O3iyQOxWIH","In3NSMkgy8","YjB9tAmdQd","IKxdLVNCPd",
+"h1zcH9y4lw","MGlTFaez9y","WaWsvydG8U","nFqikokgRi","zQt6QuQIcz","ulk41vLsmS","FLsphcShY2","OUYuFzqH0W","JRJQBYh1hF","CIShG4dEz6",
+"WmadATCgPp","fqypyNhXdu","SWfou07n1c","zz4ZUhYBCK","0PktIblLA9","CK5W7YOfrY","lXFOBHRxd8","JXljWjtn0X","BCxeCECMvU","oGu6x1j5L8",
+"FGzgpyofH3","bZLvS2ZHdk","i7WMQazIWp","m4bxUVNCPd","SmGzvgtCA5","prNT6y94nw","guMb8uupzk","2ZHdkzHF1q","CqqaD45cIH","Yh1hF0ao3l",
+"kB5nP16lHc","Dz1R3l83Ud","aFFssF6PT2","VjCZqoQ87r","mz8gx6q6L9","4W0Tl5Namm","24ARF7fKYU","e6e4zn1pmO","StlDJmz8gx","9rlg9djsrv",
+"SbRYyZJTXH","7X3uyfqypy","618DiP6bcg","zbIYYkB5nP","Ul4a1In3NS","m4bxUeuZA5","HfyNQNxx9V","uupzkWreyP","pvgjSxReec","oVQp6K20wK",
+"djsrvQWxoT","FjHXRZUnqt","2ZHdknlaBy","In3NSCdyBV","DcpWBe6e4z","hE1Ql8xEKz","ogLgc8TxD7","he9IAsuY4x","9XyT9pvgjS","zmLYD55rfB",
+"29QAzzHF1q","7lUXZuTacx","pv0i7J2mQi","uJScX7ku1p","9GXkXyToGW","t59lRTa8f6","HRxd8n1pmO","7Ow5CpWiOs","NhXduTwano","ZzJHWJJs5m",
+"RkQkeRkQke","rhl0JBCxeC","JXljW618Di","AmdQdJ2mQi","8TxD716lHc","EoToPKr8ys","Ul4a17X3uy","ni2v1ulk41","HlUbFIKxdL","QClRLatef2",
+"bZLvSb29RJ","sqVrfh1zcH","piJSkgdQsS","29QAzC2Irc","FNYIMFwEJz","GXdoHLewvM","KASQ8uTacx","D6rBykB5nP","lweGy64s8N","FwEJzZhwG1",
+"Cfgr3zbIYY","U3yw52hEEU","SjskQpvgjS","mX2GEHP433","2Yz7E5VZjS","ReKEWQChxs","QWxoTfLNg8","lm0pDAmdQd","v8yFNStlDJ","VIlwPgIYvE",
+"Mkgy8pAhR1","gdQsS5ZaEz","bZLvSKr8ys","jSjS3Cfgr3","atef28xEKz","yToGWQChxs","pAhR1NhXdu","bZLvSYh1hF","IRh48rhl0J","FjHXRKASQ8",
+"G1RhS2TRI7","MojnPzQt6Q","hUTw70h1b1","ECMvUECMvU","0MR5XcShY2","FjHXRPOUYS","GSQwjRzaZA","lsQGoNxx9V","GXdoHGWqqX","SWfouFPfSE",
+"QssNCpv0i7","7Ow5C5iGN5","aDGtS0YAGH","NOHszfLNg8","GXdoHP6bcg","RxrsmK4GS8","BGaQYuAWyp","CqqaDrz7Ut","29QAzuZPqg","ni2v1RmDcr",
+"ZzJHWhYBCK","K4GS8zQt6Q","gjUTuuQIcz","bZLvSh1zcH","FGzgpcShY2","I7p2aIRh48","pv0i7CdyBV","1LB1LMm8si","GSQwjnFqik","PYBf40YAGH",
+"lj07QtvdkD","ksJbyCfgr3","ulk417fsYM","uPX7GdQ586","DG4sTW7cTs","29QAzqQxHP","FwEJz55rfB","POUYS0ao3l","LewvMt59lR","WreyP4QMc9",
+"oGu6xzbIYY","45cIHtl72W","RsQUq7hyVv","MezSW8cVD3","qQxHPpmeCd","ru4UGtuDyS","14FLRyluBx","uQIczLbRTH","Nxx9V7ku1p","v8yFNjtn0X",
+"uvf7AUlU3M","MaJQsJ2mQi","jzUqRpmeCd","Ss0ZuFNYIM","FNYIML7cGc","yvOMIoGu6x","AIYUuTa8f6","64s8NjSjS3","uQIczVLTy6","LbRTHZhwG1",
+"t59lROUYuF","euZA5ReKEW","Yw2oUuTacx","Kr8ysWPmlx","SbRYyW3VFH","CxVEf7lUXZ","OUqFMMezSW","tjQxsXflUq","Nxx9VKsjRK","Q6LixCp3mZ",
+"Yh1hFZJTXH","cL0aERACuj","0MR5XVNCPd","zHF1qmX2GE","nnP8o9rlg9","hUTw7lXFOB","64s8Ns7Mxk","S2DfuQ6Lix","5drc6BbwgA","tuDySaL6AJ",
+"FGzgpD6rBy","HP4330BmCy","cQOnvYh1hF","uJScXMmsIo","k85AeJJs5m","oGu6xAkKTk","he9IAjSjS3","W3VFH5Mg9r","t59lRStlDJ","K20wKfmIK1",
+"5Drn0Rxrsm","RsQUqFxX9q","XyPZNW3VFH","lCMxyd85a9","RzaZAlpF6W","kZANmtAOsr","W3VFHOUqFM","16lHcrz7Ut","2Yz7EhUTw7","iwzGkt59lR",
+"9iGoThSSvQ","0ao3lFhtgl","d7vjMKASQ8","24ARFiwzGk","nlaBypiJSk","yvOMI8TxD7","ECMvUFLsph","a00b5IRh48","FVMxo6q6L9","fcJOyIn3NS",
+"WMiS3jtn0X","KASQ8o8Uyd","0Kyfst98iW","Nxx9VAkKTk","cQOnvm4bxU","wDajXOHaBz","fcwDaru4UG","b29RJogLgc","v8yFNogLgc","QnJ1S2TRI7",
+"MezSWtaOXK","nFqikRBhp0","P6bcglpF6W","4dEz6jtn0X","UmaEvqUJMd","djsrvWaim6","RsQUqUl4a1","t59lR9GXkX","uLtKsJ2mQi","Uvlv4lCMxy",
+"cmXIXfqypy","0YAGHlH1kt","iwzGkUlU3M","OHaBzbgJAz","dmoS7I7p2a","ZJTXH5Drn0","JKWYROxWIH","2ZHdkP6bcg","jfREus93Ml","he9IAwDajX",
+"v1HlnksJby","uQIczyToGW","wiHrZs7Mxk","YOfrYpAhR1","b29RJ9iGoT","OHaBz0BmCy","ciuWzfLNg8","dhSuHRmDcr","RxrsmChuy3","QChxsQ6hMC",
+"gtCA5FVMxo","uZPqgpFrrl","cQOnvpFrrl","Ta8f6NOHsz","iKqhrn1pmO","VerEAfmIK1","ZzJHWjeskS","9GXkX9rlg9","0h1b1yofH3","Zv7z014FLR",
+"G1RhSBpYhV","K20wKhYBCK","pT8wuFxX9q","KZamHQworu","KASQ864s8N","HlUbFHP433","rKDLJDG4sT","tlILt45cIH","JKWYRjS1aj","hYBCKYOfrY",
+"9eoRcfcJOy","FcWrWYh1hF","ZUnqtJXljW","qaofNBCxeC","nlaByHzZT8","ru4UGMkgy8","1j5L8MK07Y","In3NSn1pmO","HzZT8fqypy","oVQp6VerEA",
+"NOHszK20wK","nnP8oHlUbF","X6PintuDyS","W7cTsIKxdL","Q6LixxXTI4","nnP8oVjCZq","Pb1pai7WMQ","k85AeoVQp6","5IhmGMGlTF","4QMc9uZPqg",
+"W3VFH9rlg9","ksJbyt59lR","QChxsokgRi","ZJTXHv1Hln","GSQwjK4GS8","iqv4kC2Irc","DQimp64s8N","7X3uyOUqFM","7fsYMtaOXK","Cp3mZzbIYY",
+"JRJQBD6rBy","hE1QlokgRi","l83UdjzUqR","JJs5mZv7z0","dmoS7OUqFM","bZLvSGXdoH","5nmWv5iGN5","0BmCyVBjhz","xReeclH1kt","5Drn0TXQ0Z",
+"nFqikIBe8k","jtn0XSmGzv","uTacx16lHc","HP433kB5nP","FhtglyEfy9","e6e4zSWfou","WreyPnFqik","uupzkdjsrv","qQxHPVLTy6","W3VFH8hJdt",
+"kB5nPZ4I1v","I7p2aGrDg7","jSjS3Cp3mZ","VBjhzBFkb8","ogLgcW7cTs","tvdkDZv7z0","FwEJz580YD","jeskSciuWz","yluBxEoToP","FLsphpWiOs",
+"7Ow5CAmdQd","MmsIojSjS3","QbxXcs4786","uZPqguoStw","FNYIMStlDJ","2DREsyvOMI","prNT6jfREu","QYxC0No0Qb","Cfgr3ZJTXH","pWiOsVNCPd",
+"8hJdtChuy3","bZLvSlH1kt","Fhtglx3LDe","9eoRclsQGo","BFkb8pAhR1","Dz1R35VZjS","2TRI72Nslm","07n1cQChxs","Uvlv4P6bcg","AkKTkjSjS3",
+"ReKEWL7cGc","fmIK1bZLvS","AXpwEgdQsS","uTacxQworu","QChxszQt6Q","aL6AJKsjRK","K20wKWaWsv","rz7UtRxrsm","AgJHQFnPFB","guMb8KsjRK",
+"lkMUAyToGW","AIYUu8FmFH","jSjS3pWiOs","hi5X7SmGzv","GXdoHgjUTu","ogLgcS77LH","Uvlv4djsrv","nFqikXflUq","hi5X7oGu6x","Nxx9Vs4786",
+"aez9yn1pmO","GWqqXrz7Ut","ZhwG1aez9y","BGaQYkZANm","Q6hMCW3VFH","Yh1hFrKDLJ","M3zXLPOUYS","lCMxyOxWIH","0PktIMaJQs","a00b5vkCHH",
+"Oz8yZfqypy","hi5X7FwEJz","gtCA5ECMvU","5VZjS9XyT9","bgJAz5ZaEz","oQ87rMaJQs","yofH3SjskQ","KZamHEoToP","S2Dfufqypy","kZANm2Yz7E",
+"MGlTFgtCA5","0MR5Xdjsrv","4dEz6h1zcH","Kr8ysU3yw5","uZPqg0PktI","S2DfuzqH0W","OUYuFsx5Gl","QChxsRsQUq","7X3uyFNYIM","AXpwEhi5X7",
+"v2eC3b29RJ","DLhzM1v5hH","mX2GEWMiS3","iKqhr29QAz","Yw2oUP6bcg","iB08lMK07Y","hUTw75iGN5","d7vjM6q6L9","NAFuwStlDJ","AXpwE580YD",
+"RACujprNT6","Q6hMCSmGzv","dQ586MmKGJ","24ARFY1mC0","VIlwPLewvM","uN6r3Mkgy8","Cfgr3IBe8k","tjQxspWiOs","NOHszhe9IA","k85Aedjsrv",
+"nlaByxciqp","lj07QuLtKs","xReecatef2","VjCZqKsjRK","Yf2EclH1kt","hi5X7okgRi","AkKTkK20wK","7hyVvMmsIo","0YAGHatef2","POUYSfcwDa",
+"VBjhz64s8N","uPX7GFFDui","Yh1hFQbxXc","hE1QlyvOMI","uTacxBpYhV","CIShGyToGW","D6rByQClRL","2Yz7EcShY2","zHF1qgjUTu","W7cTsJkzUn",
+"16lHcIn3NS","JJs5mdQ586","gdQsSDQimp","BCxeCwDajX","t98iWvkCHH","gIYvEqQxHP","OUqFMguMb8","5iGN5lCMxy","GSQwjPYBf4","WreyPFcWrW",
+"GrDg7pT8wu","jfREuHRxd8","Qworu45cIH","YjB9tatef2","VNCPdBbwgA","s4786MmKGJ","lm0pDi3pyd","rKDLJjzUqR","YOfrYjSjS3","7X3uyTCgPp",
+"5ZaEzuvf7A","5ZaEzFhtgl","Mkgy8DLhzM","cQOnvTwano","POUYSAOgEe","okgRilweGy","LbRTHNxx9V","2TRI7lViBv","BCxeCuTacx","i3pydwiHrZ",
+"7lUXZHRxd8","Q6Lixv2eC3","hi5X72ZHdk","v1HlnC2Irc","prNT6WaWsv","BFkb8v1Hln","JIqXiF6PT2","lm0pDNhXdu","JXljWF6PT2","ThjNnIBe8k",
+"2TRI7Uvlv4","bgJAztjQxs","0Wr5yIn3NS","5ZaEzC2Irc","zbIYYPOUYS","jS1ajWaim6","atef22ZHdk","JJs5mtjQxs","s93Ml7fKYU","MK07Y0MR5X",
+"AOgEegIYvE","hE1QlRACuj","uTacxIKxdL","uJScXSWfou","ksJbyWDVWJ","jfREu9XyT9","FwEJzcmXIX","55rfBokgRi","uQIczNAFuw","TCgPpMaJQs",
+"ru4UGG1RhS","pT8wuzz4ZU","6AFT0pAhR1","8RCUAHlUbF","5VZjSJXljW","PYBf4Dz1R3","jfREuoVQp6","P6bcghSSvQ","QClRLI7p2a","5NammFVMxo",
+"In3NSGSQwj","0PktIt59lR","Yw2oU1v5hH","1v5hHVNCPd","JXljWK20wK","CK5W7Pb1pa","i7WMQgIYvE","EOE1oBGaQY","jeskSVjCZq","uAWypK4GS8",
+"yofH3QnJ1S","29QAz0PktI","rKDLJStlDJ","n1pmOM6qcG","lCMxyFcWrW","aFFss9eoRc","QnJ1SuAWyp","uLtKsdjsrv","7hyVvUmaEv","Y1mC0cQOnv",
+"3otm6xReec","3otm655rfB","HfyNQECMvU","Mm8siX6Pin","jiVBPi7WMQ","xReecfLNg8","IjTwPFFDui","Chuy3zz4ZU","pWiOskB5nP","PYBf45Namm",
+"d7vjMFhtgl","yEfy9QnJ1S","lsQGotjQxs","gtCA5dpe1v","VBjhzyEfy9","9y4lwkB5nP","1v5hHuupzk","7X3uyyToGW","5drc6RmDcr","DG4sTfFDrJ",
+"F6PT2iKqhr","QChxs5ZaEz","EOE1o618Di","AOgEedQ586","FNYIMdhSuH","bgJAz9XyT9","Cfgr3hi5X7","fqypy8RCUA","GrDg7AmdQd","L7cGcVLTy6",
+"BbwgAWaWsv","pmeCdLDk6f","hE1QlGrDg7","M6qcGEoToP","DQimpuupzk","POUYSRACuj","SbRYy55rfB","AXpwEogLgc","VerEAi3pyd","cShY2Ss0Zu",
+"a00b5RsQUq","a00b5piJSk","bgJAzcmXIX","5ZaEze6e4z","s4786L7cGc","5iGN5b29RJ","hi5X79rlg9","qaofNYOfrY","cL0aE07n1c","ix74rjiVBP",
+"NOHsz4QMc9","v1Hln0Wr5y","LbRTHGrDg7","l83UdRBhp0","WMiS32Nslm","AmdQdhYBCK","pWiOspT8wu","7X3uyUl4a1","FVMxov2eC3","2Yz7EEOE1o",
+"ydG8Uru4UG","QWxoTU3yw5","zHF1qix74r","jS1ajogLgc","vOqCESjskQ","pv0i7X6Pin","FPfSE5Namm","vLsmSL7cGc","soy9txciqp","pWiOs5iGN5",
+"FwEJzBpYhV","y94nwtaOXK","fcJOy8xEKz","EdBKc14FLR","5Mg9rRmDcr","FhtglzmLYD","v2eC3s4786","bZLvSmz8gx","wiHrZbrhlQ","JXljWIKxdL",
+"zHF1qzQt6Q","MGlTFW7cTs","EOE1ojzUqR","9iGoTx3LDe","tlILtCp3mZ","FcWrWpWiOs","CNHmvRBhp0","tjQxsFjHXR","Dz1R3IBe8k","VerEAQssNC",
+"nnP8oQ6Lix","CqqaDDQimp","U3yw5uQIcz","sx5Gl5VZjS","LbRTHcShY2","B3qemgjUTu","yluBxYf2Ec","Dz1R35Drn0","b29RJ7Ow5C","yvOMIM3zXL",
+"VBjhzCfgr3","mz8gxBpYhV","KASQ814FLR","FLsph5Namm","HfyNQRsQUq","n1pmONhXdu","QClRL580YD","QworupFrrl","Yf2Ec2DREs","5nmWvaez9y",
+"SbRYyAOgEe","FwEJzNhXdu","fcJOyrKDLJ","MezSWNAFuw","VNCPdWaWsv","iqv4kLDk6f","IRh48GrDg7","Rxrsm3otm6","k85AeRpBQm","K4GS8ZJTXH",
+"BCxeCBbwgA","m4bxUMmKGJ","zQt6QMojnP","8TxD7W3VFH","uoStwhSSvQ","K4GS855rfB","dQ586pT8wu","s93MlJJs5m","AOgEeJKWYR","5Mg9rsx5Gl",
+"s93MlSs0Zu","OxWIHVNCPd","ZuDtDokgRi","ZuDtDmz8gx","0Wr5yVerEA","t59lR0PktI","W7cTsNhXdu","55rfB3otm6","9y4lw7ku1p","FNYIMlm0pD",
+"MmsIoVLTy6","t98iWJKWYR","hi5X7v8yFN","FPfSEWPmlx","Mm8siS77LH","Vprf2MmKGJ","BGaQYK20wK","AmdQdhi5X7","QChxsYf2Ec","GXdoHKr8ys",
+"FjHXRJIqXi","ogLgc5VZjS","ReKEWyluBx","4dEz6ni2v1","bgJAzb29RJ","Yf2EcbZLvS","ogLgcQClRL","RzaZACNHmv","0YAGHZUnqt","WreyPb29RJ",
+"M3zXLd85a9","PYBf45Drn0","BpYhVAXpwE","jfREu1j5L8","pFrrls7Mxk","6AFT0IRh48","LewvM4QMc9","BpYhVEoToP","okgRiGSQwj","JRJQB48cHL",
+"lH1ktFnPFB","iqv4kNOHsz","YjB9tni2v1","NhXduCfgr3","B3qem7hyVv","FjHXRs4786","OxWIHrKDLJ","Cp3mZuQIcz","7lUXZAXpwE","kB5nPIn3NS",
+"s7Mxkxciqp","FNYIMUmaEv","GXdoHlpF6W","JIqXi2Yz7E","ogLgcWPmlx","v2eC3t59lR","RpBQmrz7Ut","ReKEWrz7Ut","BGaQYZzJHW","AkKTkzz4ZU",
+"OHaBzDQimp","1j5L8uPX7G","7X3uyqaofN","2NslmdQ586","xciqpjS1aj","pAhR18xEKz","jiVBPWaWsv","RsQUq2TRI7","cQOnvrhl0J","5VZjS8hJdt",
+"e6e4z8U2nU","FFDuia00b5","O3iyQciuWz","580YDMaJQs","CxVEfzz4ZU","5Drn0HlUbF","uupzkRzaZA","ogLgc9eoRc","ni2v1K4GS8","RzaZAFwEJz",
+"D6rByMmsIo","jiVBP7ku1p","MezSWuZPqg","i7WMQCdyBV","JIqXiCxVEf","v1HlnzbIYY","0ao3l7ku1p","580YDt98iW","DQimpy94nw","K4GS8ZuDtD",
+"XyPZNUmaEv","rhl0JSmGzv","VNCPd8cVD3","ECMvUIRh48","618DioVQp6","O3iyQvLsmS","2Yz7EiB08l","zbIYYsoy9t","pT8wu45cIH","v1HlntaOXK",
+"soy9t2DREs","RpBQmSWfou","soy9tMm8si","jzUqR580YD","lXFOBQnJ1S","zY1GYQWxoT","FLsphfFDrJ","DcpWBQYxC0","BCxeCCIShG","rz7UtFLsph",
+"FLsphAXpwE","RxrsmJXljW","J2mQiTCgPp","9iGoT7fsYM","VIlwPRACuj","8TxD7qQxHP","BpYhVrhl0J","SbRYyK4GS8","JKWYRhe9IA","guMb8atef2",
+"14FLRYw2oU","FLsphReKEW","soy9tlXFOB","LewvMGWqqX","zz4ZUlpF6W","SmGzvdjsrv","ZhwG1aDGtS","zbIYYDz1R3","9GXkXM6qcG","LDk6ft59lR",
+"5VZjSgtCA5","Yf2EcOUqFM","HRxd8fqypy","rhl0JDQimp","uJScX580YD","piJSkFFDui","d85a99eoRc","suY4xLbRTH","RsQUqG1RhS","jS1ajD6rBy",
+"yToGWv8yFN","yEfy9ZUnqt","EoToP4QMc9","lpF6WqUJMd","7fsYM8cVD3","MaJQsHfyNQ","b29RJ7fsYM","rz7UtjiVBP","8TxD77fsYM","VNCPdgtCA5",
+"fFDrJPYBf4","IjTwP2hEEU","16lHcTa8f6","CNHmvJRJQB","QChxsfcJOy","0YAGH5IhmG","KsjRK7hyVv","MGlTFydG8U","bgJAzcShY2","In3NS0PktI",
+"580YDyEfy9","brhlQlweGy","s93MlhE1Ql","ThjNncQOnv","PYBf4QssNC","x3LDeS2Dfu","16lHcoGu6x","No0QbFPfSE","oGu6xSbRYy","d7vjMiKqhr",
+"gtCA54W0Tl","Oz8yZs7Mxk","5drc6dpe1v","GWqqXEdBKc","sx5GlokgRi","64s8NqQxHP","iKqhrJXljW","6AFT0pFrrl","iwzGkqaofN","k85Aex3LDe",
+"ZUnqt7fsYM","MezSWP6bcg","aFFssbgJAz","blLA9ZzJHW","GWqqX7Ow5C","tvdkDBFkb8","wDajXS77LH","d7vjM4QMc9","yofH3B3qem","Vprf2gIYvE",
+"VerEAdQ586","Chuy3l83Ud","FGzgpTwano","F6PT2tl72W","lCMxyKZamH","C2Irc7fKYU","xciqp0h1b1","Uvlv4fqypy","2TRI7VLTy6","gtCA5ZJTXH",
+"xReecv8yFN","zQt6Qt98iW","brhlQVNCPd","MaJQsyluBx","0BmCyzmLYD","JXljWgIYvE","i3pydkB5nP","IjTwPzY1GY","MezSWFwEJz","Z4I1v24ARF",
+"RpBQmhe9IA","CqqaDKr8ys","GWqqX0YAGH","dpe1viB08l","POUYSK20wK","v8yFNVNCPd","S77LHAIYUu","OHaBzjzUqR","jSjS3vOqCE","jeskSgjUTu",
+"ThjNno8Uyd","jzUqR3otm6","07n1c9rlg9","3weIF2Yz7E","vOqCEyToGW","6AFT0NcICA","Nxx9Vt59lR","vOqCEl83Ud","C2Ircxciqp","RpBQmLDk6f",
+"ZhwG1mX2GE","OUqFMix74r","s93Ml8U2nU","QYxC0gIYvE","W7cTs7fsYM","s7Mxkni2v1","GWqqX0BmCy","rKDLJpiJSk","wiHrZkZANm","Uvlv4HlUbF",
+"iKqhrkZANm","Oz8yZHRxd8","CxVEfrz7Ut","MGlTFmz8gx","zHF1qa00b5","JJs5mcmXIX","oVQp6DQimp","EdBKc3weIF","QworuFnPFB","B3qemiKqhr",
+"0MR5XUvlv4","VBjhzxXTI4","8TxD748cHL","Cfgr3GSQwj","55rfBIn3NS","IjTwPhe9IA","ZJTXH5Mg9r","o8UydFVMxo","B3qem618Di","YOfrY2TRI7",
+"PYBf46q6L9","o8UydFxX9q","ReKEWwiHrZ","Nxx9V1j5L8","ZUnqthUTw7","i7WMQ1j5L8","1j5L8IBe8k","he9IAiwzGk","Ul4a1WDVWJ","aez9yaFFss",
+"Yw2oUdjsrv","x3LDe8hJdt","D6rByyToGW","4QMc9rhl0J","48cHLlkMUA","zqH0WyluBx","prNT6ni2v1","qaofNGWqqX","lViBvQworu","WMiS3cmXIX",
+"jzUqRy94nw","07n1cbrhlQ","dmoS7JXljW","J2mQiZuDtD","2Yz7E8RCUA","uLtKsM6qcG","1LB1LuPX7G","tlILtjeskS","AmdQdKZamH","9rlg97hyVv",
+"AkKTkGWqqX","WmadA8TxD7","zHF1quLtKs","aFFssECMvU","oVQp6GrDg7","mz8gx5Drn0","MaJQsdhSuH","soy9tfqypy","ZuDtDgf8rI","rz7Utt59lR",
+"2TRI7v8yFN","FhtgltuDyS","ThjNnZzJHW","3weIFIjTwP","FPfSEx3LDe","9GXkXlpF6W","hUTw7qUJMd","9y4lwZv7z0","ZJTXHReKEW","tuDySOUqFM",
+"4W0TlzHF1q","VerEAQYxC0","jtn0XfaHir","euZA5WPmlx","brhlQIRh48","S2DfuBCxeC","dhSuHFhtgl","ZzJHWuLtKs","JRJQBnFqik","WPmlxYh1hF",
+"fmIK1Yw2oU","NhXduReKEW","djsrvQ6hMC","lH1kt9iGoT","ix74rKASQ8","1j5L8L7cGc","BFkb8cShY2","iKqhriwzGk","v8yFNAmdQd","oVQp6lCMxy",
+"brhlQFnPFB","24ARFjSjS3","euZA57fsYM","TCgPp64s8N","CIShGVNCPd","lsQGosqVrf","EOE1ojeskS","zHF1qhYBCK","Cfgr3b29RJ","oVQp6Waim6",
+"xciqptvdkD","euZA5I7p2a","okgRitlILt","Zv7z0dmoS7","xXTI41j5L8","29QAz07n1c","LDk6ffFDrJ","okgRiMK07Y","Kr8ysRkQke","uLtKszY1GY",
+"5drc65nmWv","Ss0ZuAgJHQ","4dEz6J2mQi","45cIHEdBKc","bgJAzdmoS7","gjUTuOUqFM","D6rBytlILt","M3zXLuAWyp","WMiS3yEfy9","2Yz7EuQIcz",
+"L7cGcaL6AJ","FNYIMTwano","5Drn0xReec","FGzgp0MR5X","I7p2aQWxoT","AIYUuuupzk","fLNg8L7cGc","JkzUny94nw","M6qcGCNHmv","EOE1oEdBKc",
+"lj07QoVQp6","ZuDtDpiJSk","Ul4a10h1b1","MojnPL7cGc","Pb1paMaJQs","No0Qb5drc6","pvgjSHfyNQ","gdQsSyToGW","v2eC3vkCHH","9y4lwLewvM",
+"xciqpRkQke","JkzUnCdyBV","GSQwjEOE1o","zY1GYWPmlx","Q6LixTa8f6","jfREupiJSk","lViBvVprf2","OUqFMHzZT8","tjQxslj07Q","okgRiSmGzv",
+"qQxHPECMvU","QWxoTUvlv4","taOXKprNT6","iqv4k0h1b1","24ARFOxWIH","jeskSnFqik","5drc6TCgPp","taOXKFFDui","l83Udn1pmO","pvgjSoVQp6",
+"618Di7Ow5C","RpBQmDQimp","QbxXcNcICA","3otm6QbxXc","uN6r3rz7Ut","7fsYMtuDyS","MK07YhUTw7","4W0Tl7Ow5C","8U2nUazIWp","VLTy6lkMUA",
+"tjQxs5Namm","TXQ0Z8FmFH","yluBxfFDrJ","lm0pDCxVEf","0h1b1QssNC","Uvlv4RsQUq","xReec2Yz7E","tlILtECMvU","Z4I1vBFkb8","ZzJHWtl72W",
+"YjB9t5Namm","5IhmGbgJAz","iqv4kQClRL","HzZT8No0Qb","BpYhV7fKYU","DcpWBVjCZq","8hJdt9rlg9","MezSWt59lR","pWiOs0MR5X","OHaBzxXTI4",
+"P6bcg9GXkX","SWfouVIlwP","6AFT0L7cGc","XyPZNMGlTF","DQimpW3VFH","uTacxdmoS7","NcICAlj07Q","atef2Chuy3","1j5L8RsQUq","s93MlQssNC",
+"uZPqgk85Ae","xXTI4xciqp","SjskQNhXdu","No0QbfLNg8","uQIczlweGy","QYxC0Gv3Fq","fcJOytAOsr","gdQsSjzUqR","QssNCuAWyp","t98iWDz1R3",
+"B3qemyvOMI","blLA9RACuj","29QAzYOfrY","vOqCExXTI4","9XyT9F6PT2","Dz1R3C2Irc","nnP8oTXQ0Z","CK5W7Rxrsm","s7MxkStlDJ","Ss0ZuvLsmS",
+"QYxC0StlDJ","tAOsr29QAz","MmKGJVLTy6","VIlwP0Kyfs","qQxHPh1zcH","MezSW9GXkX","Zv7z0gtCA5","NhXduuvf7A","1v5hHUvlv4","Ta8f69eoRc",
+"lH1ktmX2GE","FxX9qv1Hln","pFrrlFwEJz","RACujOxWIH","IRh48jeskS","I7p2abZLvS","sx5GlnnP8o","l83UdlsQGo","Mkgy8soy9t","d85a90PktI",
+"AgJHQgf8rI","lCMxymz8gx","iwzGk2TRI7","6q6L9UmaEv","v1HlnJ2mQi","FLsphFcWrW","jzUqRSbRYy","3otm6iKqhr","Gv3FquPX7G","vLsmSFLsph",
+"QChxso8Uyd","dpe1vblLA9","24ARFlkMUA","5ZaEzhSSvQ","zz4ZULbRTH","zz4ZUfcJOy","cQOnvFxX9q","x3LDeprNT6","MaJQssx5Gl","sx5GlKZamH",
+"jzUqRuJScX","MezSWo8Uyd","6AFT0GrDg7","BpYhVYf2Ec","lCMxyAOgEe","wDajXFNYIM","W7cTsTXQ0Z","1v5hHkB5nP","KZamHW7cTs","QssNCm4bxU",
+"K20wKQWxoT","nFqikoQ87r","LDk6fOHaBz","JkzUnQ6Lix","uQIcz64s8N","fcJOyVerEA","JIqXi0Wr5y","0h1b1SWfou","No0QbtaOXK","pmeCd0PktI",
+"GrDg7kB5nP","cShY2MezSW","hi5X7DcpWB","3otm6FVMxo","SjskQJJs5m","U3yw58hJdt","lj07Q3weIF","RxrsmgdQsS","guMb8WaWsv","zmLYDKASQ8",
+"gjUTuGSQwj","n8pJ9B3qem","0ao3lnFqik","NcICA4QMc9","WmadA2DREs","s478648cHL","IRh483weIF","JRJQBksJby","v8yFNOUYuF","WreyPChuy3",
+"U3yw5TXQ0Z","bgJAziqv4k","qUJMd9rlg9","9eoRcD6rBy","FPfSEjzUqR","LbRTHBpYhV","nFqik5Drn0","VLTy6WreyP","8xEKzJRJQB","CIShGtuDyS",
+"rKDLJuN6r3","No0Qbs93Ml","QworuQssNC","0PktInlaBy","yluBxpiJSk","zHF1qMkgy8","Vprf2JkzUn","cQOnvKsjRK","7X3uy8RCUA","uJScXmX2GE",
+"taOXKmz8gx","yluBx9GXkX","HRxd8ix74r","FLsphhSSvQ","0h1b19y4lw","VjCZqMojnP","Fhtgl2hEEU","LewvMuQIcz","Dz1R3uLtKs","4W0TljSjS3",
+"tlILtWPmlx","rhl0JAmdQd","C2Irc5IhmG","ThjNnFxX9q","h1zcHBCxeC","jS1ajZhwG1","Zv7z0RsQUq","AOgEezbIYY","WaWsv0YAGH","tjQxs8FmFH",
+"xciqpFwEJz","AOgEejS1aj","618DiCIShG","1v5hHzQt6Q","4QMc9fcJOy","s4786X6Pin","Q6hMCM6qcG","FcWrWQssNC","ydG8UDQimp","HfyNQ14FLR",
+"5NammtvdkD","5iGN5s93Ml","iB08lEOE1o","ThjNn5Namm","MGlTFuZPqg","55rfByofH3","qUJMdtvdkD","8xEKzh1zcH","o8UydXyPZN","i7WMQFVMxo",
+"tAOsrl83Ud","xXTI4RsQUq","atef2EOE1o","JkzUn1v5hH","RBhp05IhmG","gf8rIFGzgp","OxWIH9GXkX","zFgtBS2Dfu","AgJHQ6q6L9","aFFss5iGN5",
+"QWxoTgf8rI","l83Ud9y4lw","vLsmSOHaBz","KsjRKpv0i7","BFkb8Oz8yZ","0MR5XW3VFH","5VZjS8xEKz","v2eC3ZJTXH","ydG8UeuZA5","BpYhVuAWyp",
+"POUYSCqqaD","7X3uy24ARF","JKWYR5drc6","AgJHQSs0Zu","1LB1LMmKGJ","ECMvU5iGN5","nFqikMojnP","Y1mC0NcICA","HlUbFzFgtB","5Mg9rOxWIH",
+"QworuZzJHW","AIYUudQ586","lsQGoJXljW","9GXkXaL6AJ","dQ586RmDcr","0PktIpFrrl","uvf7AIBe8k","0YAGHD6rBy","JXljWdmoS7","wDajXMmKGJ",
+"LDk6fxReec","B3qemqUJMd","oGu6xFLsph","FLsphh1zcH","zqH0WS77LH","BbwgARzaZA","iwzGkVLTy6","07n1caDGtS","8U2nU8FmFH","ru4UGrhl0J",
+"OUYuFBCxeC","Ss0Zu8TxD7","kZANmsuY4x","7fsYM24ARF","RpBQmwDajX","0BmCyLewvM","jfREuWMiS3","0MR5Xk85Ae","5iGN5Ul4a1","RsQUqjzUqR",
+"0h1b1he9IA","GWqqXOUqFM","WaWsvdhSuH","gIYvEtAOsr","ksJbyFGzgp","5nmWvlViBv","VjCZqgIYvE","zbIYYGXdoH","zQt6Qatef2","lm0pDfaHir",
+"Q6hMCLDk6f","s4786DLhzM","UlU3MprNT6","FFDuirKDLJ","aL6AJ618Di","fmIK1ulk41","JXljWqQxHP","Ul4a1EOE1o","dpe1vxReec","mX2GEgf8rI",
+"Pb1paGXdoH","CqqaDUl4a1","5Mg9rQnJ1S","xciqpuTacx","SbRYyQWxoT","lpF6WNo0Qb","7hyVvv8yFN","MaJQsTa8f6","i3pyd0MR5X","ReKEWpmeCd",
+"ReKEWWaim6","Yf2EcNxx9V","SmGzvUvlv4","S2Dfu2ZHdk","9GXkX0h1b1","l83UdVprf2","DcpWBiKqhr","tuDyS16lHc","uvf7ABFkb8","Kr8ysaFFss",
+"VjCZqJ2mQi","FhtglTCgPp","SWfouRxrsm","QClRLRkQke","RsQUqWDVWJ","s93MluZPqg","JIqXiFjHXR","fcwDaWDVWJ","okgRi24ARF","Gv3Fq7X3uy",
+"14FLRJRJQB","yofH3JJs5m","6q6L9LDk6f","t98iWRmDcr","StlDJG1RhS","gjUTudpe1v","uTacxlpF6W","JkzUnUl4a1","ThjNnWreyP","gIYvEKZamH",
+"NAFuw7fsYM","jeskSuZPqg","hUTw72TRI7","XflUqnlaBy","rhl0JNo0Qb","O3iyQSmGzv","I7p2aWaWsv","qaofNEOE1o","piJSkG1RhS","FxX9qiKqhr",
+"CIShGtl72W","AOgEeguMb8","Chuy3XflUq","X6PinQworu","M6qcGzbIYY","Nxx9VB3qem","zQt6Q0Wr5y","qUJMdiqv4k","hE1QlWPmlx","RzaZAe6e4z",
+"ksJbyThjNn","Z4I1v1j5L8","ru4UGDLhzM","W3VFHkZANm","Z4I1v2TRI7","5Drn0lsQGo","Ta8f6Vprf2","lpF6W8xEKz","dpe1vDLhzM","YOfrYRkQke",
+"Q6LixMezSW","v1Hlnatef2","ru4UGZhwG1","oVQp6M3zXL","pAhR1tlILt","hi5X7tlILt","0Wr5ybrhlQ","qQxHP9rlg9","x3LDeQnJ1S","qUJMdGXdoH",
+"Waim6DcpWB","RBhp0mX2GE","aL6AJWPmlx","uZPqg7fKYU","FxX9qQ6Lix","TXQ0Zb29RJ","soy9tTwano","aL6AJe6e4z","gIYvEjS1aj","aFFssiB08l",
+"Q6hMCCIShG","FhtgllViBv","OUqFM8hJdt","oGu6xBCxeC","8xEKz48cHL","6q6L95iGN5","S77LH1j5L8","vkCHHcmXIX","b29RJPOUYS","7lUXZVNCPd",
+"kZANmgf8rI","xciqpSs0Zu","NOHsz5VZjS","cL0aEv2eC3","7fsYMlCMxy","dQ586Vprf2","XyPZNuZPqg","QbxXcReKEW","vkCHHDG4sT","2Yz7EyToGW",
+"IBe8k8RCUA","16lHcBGaQY","ZuDtDqQxHP","M3zXL2ZHdk","jiVBPbgJAz","qQxHPk85Ae","2ZHdkKsjRK","Waim6VBjhz","7fKYULDk6f","CNHmvBCxeC",
+"8cVD3aDGtS","D6rByVjCZq","n1pmORpBQm","zmLYD618Di","bgJAzdQ586","HP433suY4x","ReKEWy94nw","2hEEUMezSW","GrDg7MezSW","iB08lTCgPp",
+"BbwgAqUJMd","64s8Nlj07Q","jfREuuPX7G","wiHrZuJScX","lkMUAlXFOB","QClRLy94nw","M3zXLNhXdu","8cVD3SbRYy","5nmWvlsQGo","zz4ZU618Di",
+"hE1QlvkCHH","7X3uyxReec","djsrvblLA9","yluBxHP433","cL0aE2Yz7E","mz8gxtAOsr","QWxoTQClRL","DcpWBC2Irc","4QMc9hYBCK","MaJQsAXpwE",
+"gjUTuVBjhz","QYxC0suY4x","IBe8kfFDrJ","ciuWzCxVEf","D6rByYf2Ec","m4bxUVLTy6","uupzk7lUXZ","Yh1hF8FmFH","4QMc924ARF","jSjS3PYBf4",
+"5Drn05iGN5","zmLYDSjskQ","K20wKciuWz","M6qcGs93Ml","y94nwfcJOy","HP433RsQUq","kZANm8U2nU","45cIHjS1aj","TCgPpzbIYY","xciqpIKxdL",
+"8cVD3yEfy9","C2Irc9eoRc","vkCHHFjHXR","kZANmxciqp","HfyNQeuZA5","FjHXRsqVrf","mz8gx07n1c","6AFT07X3uy","Waim6CIShG","qUJMdPOUYS",
+"MK07YeuZA5","oQ87r580YD","HP4336AFT0","v2eC3xReec","gIYvEzqH0W","ThjNn9XyT9","t59lRlCMxy","tuDySlsQGo","Ss0ZuaDGtS","uLtKsjS1aj",
+"BbwgAK20wK","VBjhzDcpWB","zHF1qfFDrJ","MmKGJBbwgA","VBjhzVIlwP","jzUqRzqH0W","lj07QlkMUA","gIYvECfgr3","Gv3FqoQ87r","aDGtSGXdoH",
+"x3LDezbIYY","pT8wuzbIYY","CdyBV0BmCy","MmsIoydG8U","Uvlv4aL6AJ","BpYhV2TRI7","aDGtStlILt","lViBvksJby","CNHmvi7WMQ","VNCPd7hyVv",
+"5drc63otm6","9eoRcNAFuw","HfyNQni2v1","ZhwG1DQimp","iwzGkgjUTu","FNYIM4dEz6","dQ586VNCPd","RkQkeK4GS8","uoStwW7cTs","8TxD7v1Hln",
+"5ZaEzfqypy","6AFT0fFDrJ","v1HlnpmeCd","5Mg9rWPmlx","6AFT0iKqhr","8RCUAWDVWJ","fqypyHP433","hE1QlDLhzM","FPfSETXQ0Z","6q6L93otm6",
+"07n1ccL0aE","Cfgr3y94nw","zbIYYEOE1o","Chuy3WaWsv","5NammMmKGJ","AOgEepWiOs","07n1cqQxHP","Nxx9VuJScX","RBhp0rhl0J","BGaQYEOE1o",
+"3otm6Dz1R3","WMiS31j5L8","C2IrcD6rBy","piJSkAmdQd","o8UydkB5nP","Ul4a1DG4sT","zmLYDNo0Qb","IBe8kogLgc","i3pydAOgEe","vOqCEOUYuF",
+"8RCUAS2Dfu","jiVBP07n1c","fcwDaokgRi","ru4UG64s8N","MezSWtvdkD","55rfBFcWrW","tvdkDWreyP","618DiazIWp","xXTI4DLhzM","5drc6tjQxs",
+"0Wr5y9y4lw","HzZT85Drn0","Gv3FqrKDLJ","pWiOscQOnv","No0Qb5nmWv","cQOnvgtCA5","RBhp0Ul4a1","jSjS3QssNC","HzZT8nFqik","FcWrWLDk6f",
+"HlUbFAXpwE","jfREu8U2nU","v1HlnXflUq","8xEKzMmKGJ","DcpWBsqVrf","v2eC3TCgPp","nnP8oix74r","UlU3MECMvU","S77LHy94nw","Ss0Zurz7Ut",
+"t59lRsqVrf","HfyNQZUnqt","soy9tn8pJ9","YjB9tRmDcr","uJScXHRxd8","JkzUnStlDJ","Vprf2uTacx","PYBf4lsQGo","okgRiuN6r3","s93MlZzJHW",
+"vLsmSRpBQm","FNYIMix74r","OHaBziqv4k","aL6AJRpBQm","J2mQiVIlwP","s4786euZA5","48cHLgIYvE","uupzkFcWrW","hi5X7piJSk","vLsmSW7cTs",
+"NcICAwDajX","tlILt8FmFH","YOfrYIKxdL","Mkgy86q6L9","faHirQ6hMC","ZJTXHVIlwP","oVQp6AkKTk","9y4lw45cIH","aL6AJ2TRI7","WPmlxsoy9t",
+"Mkgy8WMiS3","tuDyS7Ow5C","7fKYUyvOMI","U3yw5Cfgr3","JXljWFLsph","GXdoHY1mC0","aFFssFxX9q","OHaBzk85Ae","RmDcrX6Pin","2DREsogLgc",
+"7ku1plViBv","XflUqjiVBP","ZuDtDtvdkD","C2IrchE1Ql","azIWpTCgPp","rz7Ut9XyT9","IBe8ktuDyS","gf8rIsoy9t","ZhwG1GWqqX","gtCA5oVQp6",
+"IjTwPB3qem","StlDJF6PT2","bZLvS2Yz7E","VjCZqlpF6W","m4bxUgtCA5","nlaBy16lHc","rz7UtpT8wu","2hEEUDz1R3","jS1ajydG8U","YOfrYrz7Ut",
+"FVMxopT8wu","uZPqgoGu6x","cL0aE2ZHdk","WaWsvO3iyQ","lkMUAFxX9q","J2mQiS77LH","n8pJ9BbwgA","FNYIMoVQp6","Uvlv4BbwgA","oVQp645cIH",
+"soy9tBpYhV","L7cGcZzJHW","0BmCyXflUq","FwEJzMmKGJ","EoToP5Drn0","cmXIXfcJOy","ix74rdjsrv","7lUXZJKWYR","YOfrYF6PT2","pmeCdNhXdu",
+"rKDLJF6PT2","3weIFzmLYD","pT8wuuAWyp","tvdkDBpYhV","CxVEfwiHrZ","pFrrlzHF1q","n8pJ929QAz","ciuWzs4786","HfyNQmz8gx","K4GS8Waim6",
+"qQxHPBFkb8","FhtglksJby","uJScXD6rBy","CK5W7MK07Y","xXTI4QbxXc","LDk6fcmXIX","9y4lwRsQUq","pv0i70PktI","wDajXRxrsm","AkKTkZhwG1",
+"atef207n1c","suY4xhYBCK","djsrvyluBx","P6bcgOxWIH","DG4sTJ2mQi","9GXkXazIWp","CIShGqUJMd","fmIK12hEEU","AgJHQFhtgl","K20wKRzaZA",
+"EdBKcS77LH","Oz8yZQ6hMC","iwzGkazIWp","W7cTspAhR1","n1pmOrKDLJ","0BmCy9eoRc","2DREss93Ml","b29RJYjB9t","faHirvLsmS","Yw2oU4W0Tl",
+"ZJTXHUmaEv","zqH0Wy94nw","uoStwy94nw","GXdoHSWfou","2DREsX6Pin","PYBf4lpF6W","TCgPpfmIK1","uvf7Auvf7A","zY1GY8hJdt","FxX9qKr8ys",
+"WmadAxciqp","uPX7Gh1zcH","pAhR1DQimp","FcWrWguMb8","IjTwPMezSW","9eoRc5Drn0","ulk41VBjhz","X6PinVerEA","hi5X7WaWsv","OxWIHiKqhr",
+"UmaEvpWiOs","rhl0JgjUTu","QWxoTbgJAz","tAOsrWmadA","O3iyQMezSW","8FmFH2Yz7E","uQIczn1pmO","lkMUApv0i7","JIqXiBbwgA","ReKEWd85a9",
+"FhtglQbxXc","Zv7z0K4GS8","2ZHdk7ku1p","J2mQi0ao3l","NcICAFxX9q","uvf7AStlDJ","azIWpvkCHH","ksJbyFjHXR","guMb8FNYIM","BbwgAQ6hMC",
+"lpF6WksJby","AgJHQF6PT2","qaofNFhtgl","vLsmS5iGN5","RACuj6AFT0","RACujjSjS3","d85a9I7p2a","cQOnvzqH0W","9rlg9BCxeC","J2mQiWaim6",
+"hUTw7G1RhS","CNHmvpv0i7","BGaQYSmGzv","9iGoTL7cGc","zY1GYRzaZA","FnPFBnnP8o","7X3uyRsQUq","5drc6QnJ1S","tuDySSmGzv","MGlTF8hJdt",
+"nFqiklH1kt","aL6AJ8FmFH","uN6r3sx5Gl","0BmCy1v5hH","vOqCE7lUXZ","Cp3mZFjHXR","rz7UtvLsmS","e6e4zMGlTF","FVMxoblLA9","cQOnvmz8gx",
+"07n1cdQ586","HfyNQDcpWB","LbRTHaez9y","yofH32DREs","OHaBz5nmWv","prNT6aDGtS","F6PT2UmaEv","QYxC0AXpwE","YOfrYRzaZA","Zv7z055rfB",
+"m4bxUDQimp","WreyPNOHsz","Ss0ZuWMiS3","taOXKL7cGc","3otm6zY1GY","DQimpMkgy8","0h1b1brhlQ","rz7Ut6AFT0","a00b5Nxx9V","0YAGHtaOXK",
+"SmGzv9iGoT","QChxsF6PT2","aL6AJrhl0J","nlaBybZLvS","OxWIHMm8si","VjCZqpmeCd","TXQ0ZDcpWB","taOXKd85a9","FnPFBQ6hMC","Nxx9VtAOsr",
+"RBhp0BFkb8","JJs5mQChxs","Dz1R3P6bcg","C2Ircv8yFN","618DiblLA9","7hyVvQClRL","6AFT0ix74r","TXQ0ZlXFOB","7X3uynlaBy","No0QbcmXIX",
+"FNYIM5nmWv","ix74rblLA9","Mkgy82Yz7E","gIYvEtjQxs","aDGtSlkMUA","VjCZqqUJMd","FVMxoL7cGc","k85AeBCxeC","Yw2oUcQOnv","0h1b1Waim6",
+"iB08lPb1pa","iB08lZhwG1","ciuWzrz7Ut","9rlg9Nxx9V","Pb1paFGzgp","8xEKzNcICA","Pb1pahE1Ql","lH1ktiqv4k","LewvM7hyVv","K20wKni2v1",
+"Z4I1v8RCUA","i7WMQNOHsz","faHirNxx9V","KsjRK16lHc","b29RJTXQ0Z","5iGN5Pb1pa","Y1mC0HP433","KZamHuTacx","VIlwPsoy9t","dpe1v2Yz7E",
+"y94nwrKDLJ","m4bxUBGaQY","Oz8yZQYxC0","pmeCdbrhlQ","okgRibZLvS","EoToPv2eC3","FPfSEMK07Y","yofH3Z4I1v","QnJ1SChuy3","Cfgr3BCxeC",
+"lweGyPYBf4","IBe8knnP8o","sqVrfvOqCE","jfREuUmaEv","atef2l83Ud","he9IAYw2oU","KZamHuJScX","cShY2FLsph","i3pydNAFuw","lXFOBdhSuH",
+"55rfBatef2","ReKEWNAFuw","L7cGcciuWz","CNHmv5Namm","LewvMAOgEe","CK5W7CqqaD","dmoS7xXTI4","ksJbyn1pmO","n8pJ9F6PT2","2hEEUFwEJz",
+"xciqpBFkb8","MmKGJmz8gx","MaJQsIBe8k","aDGtSuN6r3","LDk6fYw2oU","tjQxsY1mC0","FPfSEJKWYR","BbwgAy94nw","580YDsqVrf","StlDJ5nmWv",
+"ogLgcRACuj","mz8gx2ZHdk","aFFssuJScX","DG4sTfcwDa","OUYuFVerEA","VIlwPrhl0J","QWxoTCNHmv","d7vjMdQ586","he9IACxVEf","OUqFMa00b5",
+"wDajXlweGy","nFqikb29RJ","blLA9fqypy","2DREsaFFss","dhSuHFFDui","nnP8olpF6W","ciuWzIKxdL","S77LHCfgr3","CIShGgIYvE","P6bcguPX7G",
+"brhlQCfgr3","5NammeuZA5","Dz1R3ZzJHW","RxrsmStlDJ","n8pJ9pvgjS","BGaQYrKDLJ","14FLR0Wr5y","x3LDe5Mg9r","NhXduOHaBz","JRJQBLewvM",
+"uJScXjS1aj","pvgjSSWfou","pv0i7FLsph","Mkgy8aFFss","Chuy39iGoT","kZANmzz4ZU","0MR5X7ku1p","QWxoT7X3uy","WmadAlpF6W","fcJOyGSQwj",
+"EdBKcDz1R3","CqqaDzbIYY","AIYUu6AFT0","fLNg8vkCHH","CdyBViwzGk","rKDLJCqqaD","gIYvEHzZT8","gtCA5tl72W","Cp3mZ6q6L9","faHir2Yz7E",
+"M6qcGwiHrZ","pWiOs5nmWv","fcwDaK20wK","fcJOymX2GE","S2DfuuoStw","tlILtI7p2a","14FLRd7vjM","StlDJWmadA","WMiS34QMc9","1j5L8lsQGo",
+"0YAGH9rlg9","RsQUqUvlv4","yEfy9ZhwG1","DQimpNxx9V","64s8NXyPZN","taOXKtjQxs","KASQ80MR5X","5drc6d7vjM","W7cTsJ2mQi","Mm8siK20wK",
+"nlaBynnP8o","BbwgA2ZHdk","pWiOsaL6AJ","xXTI4FPfSE","HzZT8ix74r","QYxC0CqqaD","cShY2a00b5","FnPFBpv0i7","fqypygtCA5","gjUTu45cIH",
+"64s8N0YAGH","9eoRcuAWyp","IBe8kRzaZA","NOHsz7fsYM","suY4xQWxoT","MaJQsXyPZN","C2IrcIKxdL","BGaQYjS1aj","oGu6xBFkb8","1j5L8cL0aE",
+"4W0TljeskS","t59lRFVMxo","hi5X7QYxC0","zFgtBJ2mQi","tl72WCxVEf","t98iWlXFOB","aL6AJQworu","JJs5mk85Ae","I7p2aFxX9q","zY1GYfFDrJ",
+"IBe8kY1mC0","CNHmv9rlg9","MmsIoUmaEv","U3yw5RzaZA","9iGoTa00b5","DcpWBgIYvE","zHF1qAXpwE","TCgPpS77LH","VIlwPpAhR1","aDGtSM3zXL",
+"zY1GYbZLvS","RxrsmpvgjS","Yh1hFlweGy","GXdoHrKDLJ","a00b5580YD","yofH316lHc","xXTI4AgJHQ","5VZjSlXFOB","ogLgclH1kt","UmaEvG1RhS",
+"0MR5Xm4bxU","atef2suY4x","t98iWAIYUu","2ZHdknFqik","VLTy664s8N","yEfy9pvgjS","uJScXK4GS8","pFrrlMmKGJ","FVMxos93Ml","LbRTHCp3mZ",
+"No0Qbfqypy","IjTwPtl72W","5nmWvazIWp","Ta8f6FNYIM","t59lR8TxD7","Y1mC0aez9y","L7cGcRBhp0","AXpwEStlDJ","aDGtSEdBKc","WMiS3JXljW",
+"Chuy3gIYvE","taOXKCfgr3","0YAGHCIShG","5NammhSSvQ","zY1GYtuDyS","POUYScQOnv","2NslmEoToP","mX2GEhi5X7","uJScX3weIF","DQimp7lUXZ",
+"Ta8f6dhSuH","TCgPpcL0aE","k85AepT8wu","oGu6xJKWYR","Kr8yslkMUA","cmXIXnlaBy","AOgEea00b5","EoToPI7p2a","yofH3RsQUq","P6bcgWaim6",
+"QbxXc5nmWv","CK5W72DREs","5Drn07X3uy","taOXKUlU3M","FxX9q5Namm","3otm6fqypy","ZhwG15drc6","oVQp67Ow5C","jeskSFjHXR","7hyVvAIYUu",
+"0YAGHS77LH","HfyNQJkzUn","5VZjSG1RhS","I7p2aHfyNQ","CK5W7fFDrJ","AmdQdvLsmS","HlUbF4QMc9","W3VFHYf2Ec","2NslmTXQ0Z","GXdoHpv0i7",
+"DQimphSSvQ","taOXKlCMxy","LewvM45cIH","AkKTkWmadA","7hyVvBFkb8","G1RhSVjCZq","gjUTuciuWz","HlUbF7lUXZ","Z4I1vcQOnv","HfyNQyvOMI",
+"oGu6x3otm6","RzaZAMK07Y","dpe1vMojnP","9iGoTqQxHP","jSjS3s93Ml","07n1cQWxoT","jzUqR1v5hH","tAOsrhE1Ql","zqH0WaDGtS","Waim6OUYuF",
+"F6PT2v8yFN","2Yz7E580YD","v1HlnWDVWJ","WaWsvn1pmO","Uvlv4Mm8si","GSQwj8TxD7","vOqCEuoStw","7fsYMfcJOy","qQxHPJRJQB","C2IrcpAhR1",
+"AXpwEulk41","atef2PYBf4","v2eC38U2nU","uLtKscQOnv","vOqCEs93Ml","FNYIM2Yz7E","lpF6W2hEEU","JRJQB6AFT0","RmDcrsoy9t","pv0i7CxVEf",
+"9GXkXPYBf4","hSSvQuJScX","uLtKsM3zXL","ru4UGCdyBV","ThjNnvOqCE","WDVWJCp3mZ","Ta8f6vkCHH","n1pmO5Mg9r","CxVEfyvOMI","XyPZNRxrsm",
+"4dEz6s4786","KZamHwiHrZ","M6qcGTwano","0YAGHbrhlQ","uvf7AWPmlx","x3LDeGXdoH","ThjNn4W0Tl","aDGtS9y4lw","AkKTklj07Q","uZPqgv2eC3",
+"HfyNQoQ87r","sx5GlCdyBV","s93MlVprf2","cShY2lsQGo","9XyT948cHL","Gv3FqlweGy","yToGW0PktI","rKDLJkZANm","M6qcG1LB1L","fFDrJQnJ1S",
+"5Mg9rJJs5m","qaofN16lHc","VIlwP0BmCy","0Kyfsl83Ud","qUJMdKsjRK","SWfouQworu","guMb8YjB9t","VerEAuLtKs","Dz1R3K4GS8","FFDuiqaofN",
+"P6bcgpvgjS","64s8NQbxXc","8TxD714FLR","8TxD7bZLvS","W7cTsStlDJ","ni2v1hUTw7","yToGW64s8N","zbIYYWaim6","ZhwG1faHir","SjskQpv0i7",
+"ThjNnQnJ1S","aFFssa00b5","lj07QVIlwP","5VZjSDG4sT","FxX9qBbwgA","prNT6ksJby","tAOsrgjUTu","OxWIHAIYUu","FhtglprNT6","ZJTXHzmLYD",
+"FwEJzuAWyp","ReKEWuupzk","Kr8ysM3zXL","zbIYYCIShG","iqv4k45cIH","hYBCKyEfy9","4QMc9yEfy9","yvOMIjeskS","d7vjMuPX7G","9eoRclpF6W",
+"0h1b1QnJ1S","uPX7GsqVrf","Waim6suY4x","8hJdtIRh48","14FLRThjNn","X6Pin0Kyfs","brhlQEOE1o","XyPZNDLhzM","JRJQBZUnqt","F6PT2i7WMQ",
+"NhXduMezSW","XyPZNoVQp6","uupzk0YAGH","vLsmSciuWz","uJScXB3qem","HRxd8aDGtS","0PktIwDajX","7fKYUYjB9t","CK5W7Qworu","n1pmO2Yz7E",
+"iB08lNxx9V","BpYhV5iGN5","t98iW0MR5X","EOE1oMm8si","t59lR8hJdt","zQt6QnlaBy","24ARFgtCA5","DG4sTFFDui","5NammoVQp6","9rlg9StlDJ",
+"WmadAgdQsS","tl72W7ku1p","KASQ8uPX7G","LbRTH7fsYM","vOqCE7Ow5C","RBhp0WMiS3","X6Pin8FmFH","Pb1paP6bcg","RpBQmCp3mZ","i3pydW7cTs",
+"JKWYRZJTXH","jSjS3suY4x","v2eC3JJs5m","BpYhVhYBCK","cQOnvGv3Fq","o8UydeuZA5","iKqhrRpBQm","jfREumX2GE","BFkb8UlU3M","GSQwj5IhmG",
+"JXljW3weIF","zQt6QMkgy8","wDajXv2eC3","ni2v1EOE1o","W3VFH9XyT9","2Yz7EiwzGk","cL0aEdpe1v","yEfy9s7Mxk","x3LDeECMvU","FnPFBuvf7A",
+"I7p2aYjB9t","FGzgpPOUYS","h1zcH64s8N","suY4xd7vjM","580YDn1pmO","he9IAZJTXH","AIYUuiB08l","0ao3lRBhp0","d85a9vLsmS","ReKEWdhSuH",
+"wiHrZPOUYS","NOHszOHaBz","rz7UtIBe8k","okgRiDG4sT","ECMvUi3pyd","RzaZAv1Hln","3otm6v2eC3","LDk6fFjHXR","tAOsrBFkb8","7fsYMJkzUn",
+"tvdkD9rlg9","0h1b1lkMUA","jeskSyToGW","8xEKzThjNn","hUTw79GXkX","iB08lgtCA5","i7WMQgtCA5","SjskQ9iGoT","hi5X7tAOsr","24ARFHfyNQ",
+"QbxXcdjsrv","QworuMkgy8","aL6AJ07n1c","45cIHpiJSk","DQimpEoToP","UmaEvXflUq","azIWpQssNC","aL6AJZ4I1v","uLtKsFGzgp","VBjhz9rlg9",
+"hE1QlCK5W7","FnPFBt98iW","4dEz69iGoT","yluBxn8pJ9","5IhmGJKWYR","MmsIoZUnqt","AgJHQs4786","55rfBWaim6","Oz8yZd7vjM","t59lRECMvU",
+"jSjS38TxD7","nFqikQChxs","SjskQjiVBP","ulk4148cHL","Z4I1vsqVrf","1LB1L2hEEU","uupzk1j5L8","MK07YWaim6","ni2v15VZjS","ksJby6q6L9",
+"zQt6QFLsph","POUYSRmDcr","rz7Utxciqp","JIqXitvdkD","v1HlnZUnqt","n8pJ9AgJHQ","9rlg95iGN5","8cVD3ru4UG","FFDui8TxD7","xciqpv1Hln",
+"faHirl83Ud","y94nwOUYuF","L7cGcxciqp","5iGN5IKxdL","1LB1LVprf2","U3yw5Oz8yZ","WPmlxFNYIM","TCgPp4dEz6","580YDIjTwP","7fsYMCxVEf",
+"VjCZqxReec","cmXIXhe9IA","yEfy9OHaBz","yToGWs4786","Ta8f68xEKz","iwzGklViBv","mz8gxjS1aj","OxWIHfFDrJ","RmDcrRxrsm","okgRiQChxs",
+"s93MlPYBf4","29QAzFcWrW","2DREss4786","JJs5mpAhR1","WreyPqQxHP","GSQwjrKDLJ","StlDJ7fKYU","HfyNQRxrsm","v1HlnZ4I1v","Gv3FqJ2mQi",
+"Z4I1v618Di","e6e4zIRh48","NhXduL7cGc","CdyBVnFqik","NAFuw8TxD7","oVQp6IjTwP","jfREunFqik","fFDrJt98iW","uTacxoGu6x","KsjRK8U2nU",
+"6q6L9soy9t","uJScXru4UG","tuDyStuDyS","2NslmoQ87r","UmaEvhe9IA","PYBf4ReKEW","0MR5X2Yz7E","nlaByMaJQs","5NammYOfrY","fFDrJjfREu",
+"uPX7G8RCUA","b29RJ7X3uy","zz4ZUPYBf4","QbxXctlILt","3weIFeuZA5","MezSWVBjhz","TXQ0ZJJs5m","FPfSEU3yw5","MojnPQWxoT","TCgPptAOsr",
+"7fKYUCIShG","AIYUuDLhzM","9rlg9d85a9","RkQke45cIH","piJSkKr8ys","NcICAFVMxo","bgJAzEOE1o","iB08l48cHL","yEfy9cL0aE","jfREubrhlQ",
+"n8pJ9fLNg8","VIlwPIKxdL","F6PT2CNHmv","tuDySogLgc","azIWpnnP8o","vLsmS7fKYU","tvdkDHfyNQ","taOXKOUYuF","JRJQBfmIK1","QYxC02Yz7E",
+"K20wKYf2Ec","WDVWJ5IhmG","TwanoYOfrY","Q6hMCECMvU","ZUnqtzQt6Q","WaWsv7fsYM","Kr8ysQnJ1S","5ZaEzK20wK","Yf2Eci7WMQ","SjskQJ2mQi",
+"dQ586rz7Ut","xXTI42DREs","soy9tZUnqt","S2DfuStlDJ","a00b5iB08l","FwEJzLDk6f","fcwDaThjNn","MezSWIKxdL","0Kyfsatef2","OHaBzwDajX",
+"i3pyd618Di","h1zcHDcpWB","ksJbyaDGtS","S77LHaL6AJ","9y4lwBGaQY","D6rBy6q6L9","lsQGopWiOs","fFDrJXflUq","SbRYypWiOs","2Yz7EEoToP",
+"5Mg9r7fKYU","StlDJaDGtS","yToGWAXpwE","djsrvpvgjS","2Yz7EWreyP","IKxdLuTacx","fLNg84W0Tl","atef2LbRTH","7hyVvJkzUn","qQxHPjS1aj",
+"fcwDatAOsr","Yw2oUK4GS8","W7cTs2DREs","ksJbyVprf2","VIlwPcShY2","HlUbF5nmWv","OUqFMsqVrf","NAFuwSmGzv","Chuy3AXpwE","t59lRyToGW",
+"Q6hMCWPmlx","QChxs7Ow5C","d7vjMQYxC0","aez9yVprf2","kZANmuJScX","CK5W7kB5nP","AmdQdfqypy","TCgPpaez9y","hSSvQn8pJ9","tl72WS2Dfu",
+"BFkb8qQxHP","B3qemCqqaD","6q6L9tlILt","qaofNprNT6","tl72WfcwDa","v1HlnaFFss","UmaEvwiHrZ","CK5W7BGaQY","SbRYy5ZaEz","1LB1Ln8pJ9",
+"uupzkpvgjS","HRxd8JkzUn","0MR5XKsjRK","uoStwlsQGo","Yf2EcwDajX","ulk41oVQp6","LbRTHAXpwE","d85a95VZjS","jSjS3ru4UG","azIWp5Namm",
+"Ta8f6hi5X7","S2DfuNAFuw","7fsYMAgJHQ","FGzgpEOE1o","atef2SmGzv","LewvMhi5X7","8U2nUlweGy","i3pydD6rBy","C2IrcMkgy8","0BmCyZ4I1v",
+"oVQp6Cp3mZ","0BmCyCK5W7","ciuWzZJTXH","M6qcGBFkb8","dQ586v1Hln","iwzGk48cHL","8cVD3C2Irc","MmKGJSWfou","8U2nUFLsph","2NslmMGlTF",
+"FcWrWNOHsz","nnP8ot59lR","taOXKfLNg8","v2eC348cHL","rhl0JZv7z0","uupzkEoToP","qQxHPbrhlQ","rz7UtJKWYR","2Yz7E8cVD3","yvOMItlILt",
+"Cp3mZVNCPd","t98iWaFFss","I7p2ajfREu","NAFuw16lHc","sqVrf8hJdt","AmdQdn8pJ9","LewvMfaHir","IjTwPnFqik","cShY2BGaQY","iKqhrHzZT8",
+"suY4xECMvU","Mm8siTa8f6","2ZHdkuZPqg","K20wKfFDrJ","07n1cgjUTu","cShY2MojnP","ZUnqtW7cTs","ReKEWFnPFB","uupzkY1mC0","55rfBRzaZA",
+"lkMUA7X3uy","AOgEeHfyNQ","qUJMdyvOMI","0YAGHkZANm","5NammPb1pa","euZA5fFDrJ","7ku1p9GXkX","kZANmdpe1v","2hEEUnlaBy","NAFuwZ4I1v",
+"8FmFHatef2","iqv4kNcICA","bZLvSdpe1v","a00b5he9IA","0h1b1Dz1R3","0ao3lHfyNQ","xXTI416lHc","v1HlnFxX9q","7fsYMGSQwj","CIShGrKDLJ",
+"L7cGcU3yw5","RsQUqQbxXc","6AFT0Ul4a1","HRxd8lpF6W","fLNg8HP433","QChxs5VZjS","24ARF0BmCy","HP433Vprf2","LbRTHazIWp","9eoRcn8pJ9",
+"LbRTHtvdkD","fqypy14FLR","CNHmvpFrrl","DcpWB8U2nU","iqv4k6AFT0","OUYuFFLsph","lXFOBYjB9t","t59lRVNCPd","piJSkDcpWB","pFrrlMaJQs",
+"fFDrJ4QMc9","6AFT0VerEA","Nxx9VOxWIH","HfyNQlViBv","NOHsz5Drn0","RBhp00PktI","jeskSuvf7A","XflUqWDVWJ","MojnPQClRL","IjTwPl83Ud",
+"FNYIMprNT6","rKDLJjtn0X","5nmWvguMb8","qQxHPHlUbF","GrDg7ksJby","BpYhVjeskS","zz4ZUs4786","fLNg80PktI","14FLRpmeCd","IRh48Waim6",
+"MezSW16lHc","faHirrKDLJ","cShY2KASQ8","C2IrcsqVrf","F6PT2W7cTs","piJSk07n1c","QbxXcIjTwP","tjQxsHfyNQ","cmXIXlweGy","2TRI7CNHmv",
+"vOqCEcQOnv","FxX9qrhl0J","6AFT0fcwDa","soy9tIKxdL","9iGoTvLsmS","3otm62Yz7E","29QAzCfgr3","aFFssHP433","jeskSSWfou","t98iWv8yFN",
+"uTacxi3pyd","BFkb8Rxrsm","8RCUAiqv4k","0PktI16lHc","5iGN5jiVBP","x3LDeTCgPp","bZLvS1v5hH","6q6L9F6PT2","QbxXcW7cTs","RmDcrVerEA",
+"QbxXcvkCHH","kZANmfqypy","M3zXL45cIH","fcJOyUlU3M","GWqqXb29RJ","4QMc99rlg9","lXFOBni2v1","8RCUAbgJAz","zbIYYpvgjS","EoToPt59lR",
+"CIShGMaJQs","48cHLUvlv4","hi5X7zFgtB","iqv4kYh1hF","lCMxyni2v1","kZANmKsjRK","lXFOBpvgjS","QChxstuDyS","3weIF2hEEU","gf8rIjtn0X",
+"tjQxsK20wK","B3qemsqVrf","t98iWK4GS8","pT8wuI7p2a","MmsIouQIcz","s4786QYxC0","jtn0X7lUXZ","uJScXO3iyQ","7hyVvuN6r3","XflUq7fsYM",
+"OHaBzXyPZN","mz8gxKsjRK","Uvlv4uoStw","GSQwjb29RJ","qQxHPqQxHP","9y4lw9XyT9","d85a9MK07Y","4dEz6Gv3Fq","X6PinQWxoT","pv0i76q6L9",
+"GWqqXW3VFH","t98iW0Wr5y","LDk6flViBv","b29RJNhXdu","cShY28RCUA","LbRTHFjHXR","IjTwP2ZHdk","QWxoThYBCK","BFkb8ksJby","Gv3Fq2TRI7",
+"sx5GlFwEJz","0ao3lPb1pa","fmIK1ECMvU","3otm67fsYM","mX2GE5iGN5","gf8rIaez9y","jSjS3ReKEW","JKWYRGWqqX","MmsIo5Mg9r","yvOMIiKqhr",
+"jtn0XlH1kt","oVQp6tl72W","YOfrYy94nw","nFqikB3qem","Waim6uAWyp","SWfoupiJSk","AkKTkVerEA","nlaBy2Nslm","qaofNb29RJ","CNHmvVjCZq",
+"JXljW6q6L9","QYxC0JRJQB","8cVD3y94nw","16lHcv8yFN","L7cGcIRh48","Ta8f63weIF","pvgjSChuy3","KZamHd85a9","Pb1paMmKGJ","y94nwpvgjS",
+"FVMxoa00b5","FwEJzBGaQY","FcWrWzmLYD","StlDJogLgc","WmadAb29RJ","euZA5VBjhz","OxWIHFnPFB","TwanofcJOy","UmaEv1LB1L","zmLYD16lHc",
+"B3qemhi5X7","FwEJzJIqXi","hUTw7ZuDtD","FcWrWlweGy","mz8gxSmGzv","uQIczd85a9","J2mQiFFDui","iwzGktlILt","lXFOBpT8wu","HlUbF0Kyfs",
+"HzZT8RBhp0","zmLYD0BmCy","BbwgAru4UG","8cVD38cVD3","8RCUANAFuw","h1zcH5VZjS","euZA5AXpwE","OUqFMlj07Q","UmaEvhE1Ql","7fsYMuvf7A",
+"RmDcrG1RhS","oQ87rNOHsz","5VZjS8TxD7","pWiOsYOfrY","AkKTkX6Pin","48cHL5ZaEz","VBjhzEoToP","SbRYy64s8N","7fsYMlViBv","yluBxnnP8o",
+"LewvM5iGN5","uAWypOUqFM","tvdkDD6rBy","pmeCdhi5X7","29QAzRzaZA","CNHmvuPX7G","16lHcgdQsS","UlU3MQnJ1S","3weIF4dEz6","MGlTFdhSuH",
+"XyPZNZUnqt","SbRYyVBjhz","Yh1hFdQ586","RzaZALewvM","5ZaEzFjHXR","d7vjM580YD","sqVrfWmadA","x3LDegIYvE","RACujpAhR1","kB5nPQworu",
+"faHiroVQp6","uPX7GuPX7G","OUYuFaL6AJ","BGaQY07n1c","FFDuirhl0J","dpe1vjS1aj","AOgEeni2v1","EOE1oFLsph","2Yz7EWDVWJ","FNYIMtAOsr",
+"Y1mC0MmKGJ","2hEEUAIYUu","I7p2abrhlQ","soy9t5ZaEz","uvf7AfLNg8","yluBxO3iyQ","2Yz7ENOHsz","x3LDe2Yz7E","RpBQms4786","Mm8siqaofN",
+"7X3uyd7vjM","GrDg7blLA9","e6e4zgtCA5","djsrvRkQke","4dEz6RkQke","dmoS79GXkX","IRh489rlg9","No0QbWPmlx","BpYhVzbIYY","Rxrsm9y4lw",
+"y94nw8xEKz","MaJQsRpBQm","ZhwG1Q6hMC","AXpwE5Mg9r","AkKTkY1mC0","OUYuFYOfrY","ni2v1ZhwG1","D6rByjtn0X","580YDvLsmS","uJScX4W0Tl",
+"0ao3lMm8si","ni2v1iKqhr","jtn0X8hJdt","uAWypbrhlQ","jtn0X2Yz7E","qaofNfqypy","wiHrZTa8f6","07n1cZv7z0","KZamHt59lR","lm0pDQClRL",
+"Uvlv4FPfSE","iB08lReKEW","9eoRcyEfy9","wDajXUvlv4","lsQGo5Mg9r","n1pmObgJAz","IjTwPguMb8","AIYUulkMUA","3otm664s8N","QChxsECMvU",
+"VIlwPlH1kt","FnPFBlpF6W","55rfBCxVEf","SmGzv6q6L9","C2Irc16lHc","QnJ1SCIShG","QworuKASQ8","cL0aEv1Hln","Cp3mZtvdkD","8xEKzoQ87r",
+"In3NS1j5L8","24ARFpWiOs","l83UdwiHrZ","5ZaEz8U2nU","MezSWAgJHQ","2hEEUgjUTu","AOgEepFrrl","gIYvE0BmCy","e6e4zt98iW","azIWptAOsr",
+"hUTw7FNYIM","WDVWJ55rfB","ZJTXHZzJHW","uN6r3kZANm","MezSWmX2GE","Q6LixK4GS8","K4GS8KZamH","DLhzMaL6AJ","QssNCazIWp","d85a9X6Pin",
+"piJSkaDGtS","gIYvEpT8wu","uoStwWDVWJ","2TRI70Wr5y","lj07Q9eoRc","W3VFHxXTI4","dQ586ThjNn","2DREsMK07Y","Z4I1v7fsYM","vOqCEuPX7G",
+"cmXIXtAOsr","l83UdCp3mZ","t98iWydG8U","sx5Gld7vjM","Kr8yshe9IA","5Mg9rXyPZN","jtn0XWPmlx","uTacx0BmCy","Zv7z0Z4I1v","v2eC3zHF1q",
+"CxVEfnlaBy","QClRLm4bxU","pv0i7LDk6f","rhl0JhSSvQ","uAWyps4786","iB08lpv0i7","9XyT9BFkb8","7fKYUHP433","pWiOs4QMc9","RACuj5nmWv",
+"WaWsvCxVEf","KZamHvOqCE","MaJQsjfREu","n1pmOF6PT2","ZzJHWdQ586","SWfoulXFOB","9rlg9oGu6x","JIqXicShY2","KZamHdjsrv","fmIK1K4GS8",
+"Z4I1vyvOMI","RpBQmjSjS3","RBhp0okgRi","GWqqXXflUq","QbxXcAkKTk","CK5W7B3qem","piJSkjS1aj","Pb1pav2eC3","7fsYMvkCHH","m4bxUQnJ1S",
+"MmsIoP6bcg","Pb1papiJSk","CdyBVbrhlQ","fcJOypWiOs","DLhzMStlDJ","lweGyReKEW","8xEKzkB5nP","RxrsmlsQGo","K20wKv8yFN","yvOMI4W0Tl",
+"6q6L9pvgjS","yvOMIyToGW","BCxeCUvlv4","h1zcHQworu","JKWYRYw2oU","LDk6fjiVBP","Dz1R3HRxd8","AOgEeh1zcH","LDk6fRxrsm","8FmFHRpBQm",
+"uoStwKsjRK","hi5X7fLNg8","8FmFHgf8rI","mX2GEFhtgl","jtn0XjSjS3","blLA9StlDJ","55rfB3weIF","x3LDeO3iyQ","RpBQmX6Pin","EdBKcP6bcg",
+"ni2v17hyVv","qaofNFwEJz","Ul4a1uPX7G","Y1mC0Yh1hF","0h1b1Yw2oU","QClRL1LB1L","NOHszQnJ1S","aDGtS2ZHdk","8cVD32Nslm","1v5hH1LB1L",
+"hYBCKiqv4k","yEfy9v8yFN","QssNCcL0aE","hi5X7s4786","2NslmWMiS3","FPfSEpWiOs","pvgjSFVMxo","LDk6fPYBf4","pvgjS8cVD3","tjQxsL7cGc",
+"OxWIHRzaZA","EdBKczQt6Q","VBjhzuvf7A","8hJdtW3VFH","Ss0ZuW3VFH","7ku1p29QAz","uoStwqUJMd","8xEKzzY1GY","yvOMItuDyS","kZANmMmsIo",
+"xReecfmIK1","o8UydQworu","xciqpzz4ZU","7X3uyIn3NS","RBhp0GSQwj","lXFOB0h1b1","jzUqRpT8wu","HlUbFKZamH","h1zcHgIYvE","cmXIXJXljW",
+"6AFT0zmLYD","Q6hMCzHF1q","5iGN5B3qem","Dz1R3NAFuw","TCgPpChuy3","0PktIydG8U","soy9t45cIH","fqypyjSjS3","2DREssoy9t","Z4I1vQYxC0",
+"9GXkXTXQ0Z","NcICAQYxC0","yofH3Rxrsm","MmsIoIKxdL","dpe1v4dEz6","sx5GlQWxoT","GrDg78RCUA","2DREsD6rBy","Waim6QWxoT","yEfy9HzZT8",
+"VerEAlpF6W","I7p2aUlU3M","FGzgpFhtgl","tAOsrFhtgl","HP43348cHL","lsQGoLewvM","M6qcGDLhzM","S77LHFVMxo","bgJAzTXQ0Z","mX2GEuPX7G",
+"n8pJ9Uvlv4","F6PT2yvOMI","RmDcrGXdoH","WmadAEOE1o","XyPZNQClRL","29QAzokgRi","pv0i7kZANm","Yf2Ec7ku1p","KASQ8fcwDa","jzUqRaDGtS",
+"nFqik14FLR","Pb1palweGy","AIYUuOz8yZ","64s8NlsQGo","5drc6v2eC3","0KyfsNOHsz","OHaBzlXFOB","JJs5mdhSuH","3weIFdpe1v","pT8wudQ586",
+"8U2nUOUYuF","4QMc9lweGy","jS1ajJJs5m","0YAGHKsjRK","FVMxolj07Q","FwEJz5iGN5","Kr8ysThjNn","FFDuiJKWYR","ZJTXHQWxoT","7ku1pIBe8k",
+"he9IA7hyVv","WDVWJpiJSk","Yw2oU24ARF","d85a9Kr8ys","FLsphHP433","LbRTHpv0i7","AIYUuI7p2a","iqv4kEOE1o","y94nwW7cTs","6q6L9P6bcg",
+"pAhR1BFkb8","djsrvt59lR","NcICA4dEz6","5Mg9r6AFT0","d85a9580YD","X6Pin4QMc9","pmeCdy94nw","MGlTFfcwDa","RBhp0jzUqR","618DiFFDui",
+"W3VFH7hyVv","hYBCKGv3Fq","8cVD3nFqik","qUJMdTCgPp","64s8NkZANm","FjHXR29QAz","rz7UttlILt","YjB9trz7Ut","IRh48guMb8","Kr8ysHlUbF",
+"Cp3mZQworu","8U2nUSWfou","e6e4zHRxd8","GrDg7HP433","fmIK1TCgPp","gdQsSLewvM","prNT6soy9t","FLsphe6e4z","d7vjMQworu","qUJMdNOHsz",
+"uoStw07n1c","WPmlxrKDLJ","0MR5XQWxoT","ogLgcF6PT2","kB5nP7Ow5C","JKWYRMojnP","t59lRdjsrv","RkQkeatef2","DcpWBG1RhS","atef2BGaQY",
+"YjB9tsuY4x","BFkb8nFqik","aFFssgjUTu","dhSuH5IhmG","s7MxkvLsmS","Dz1R3Waim6","xReecfqypy","tl72WMmsIo","7hyVvGv3Fq","i7WMQD6rBy",
+"VIlwPpFrrl","vkCHHHlUbF","M3zXL5ZaEz","3otm607n1c","G1RhSgtCA5","U3yw58TxD7","Chuy3xReec","P6bcgy94nw","7fKYUQ6Lix","TwanoJIqXi",
+"lCMxyGrDg7","Kr8ys9eoRc","JXljWwiHrZ","h1zcHM6qcG","QssNCKZamH","FPfSEXflUq","FhtglhE1Ql","LewvMW3VFH","dhSuHlCMxy","SmGzvsuY4x",
+"WPmlxPb1pa","QbxXcCfgr3","a00b5prNT6","Rxrsm6AFT0","d85a9bZLvS","QClRLlXFOB","k85AeFhtgl","FNYIMb29RJ","Y1mC0S77LH","pv0i7W3VFH",
+"5iGN5S77LH","3weIFTwano","XyPZNprNT6","hSSvQMmsIo","3weIFGv3Fq","rhl0JLewvM","QChxsUvlv4","RsQUqpv0i7","FcWrWzY1GY","hUTw7uvf7A",
+"0MR5X580YD","2ZHdk7lUXZ","GrDg7v2eC3","8FmFHlweGy","QworudQ586","5Mg9ruLtKs","0Wr5y0BmCy","CqqaDt59lR","k85Ae5Mg9r","RxrsmRxrsm",
+"wiHrZpvgjS","soy9tUlU3M","Y1mC0qQxHP","TXQ0Z1LB1L","Zv7z0XflUq","AkKTkDQimp","pAhR1QWxoT","yEfy9okgRi","cQOnv2TRI7","d7vjMIBe8k",
+"HRxd8MmKGJ","brhlQP6bcg","b29RJi7WMQ","oVQp6rz7Ut","uTacxqUJMd","uAWypBFkb8","DLhzMbZLvS","MK07YJRJQB","gjUTuv2eC3","G1RhSx3LDe",
+"618DiFNYIM","FPfSEnlaBy","No0QbY1mC0","5Mg9rzQt6Q","MezSWPOUYS","9rlg90ao3l","lj07Q5nmWv","3weIFY1mC0","GrDg7fqypy","VNCPda00b5",
+"zY1GY0MR5X","QChxs9GXkX","4dEz6fqypy","cQOnv3otm6","AXpwElm0pD","FhtglwiHrZ","h1zcHn1pmO","7ku1pOz8yZ","bZLvSzbIYY","tl72WQnJ1S",
+"64s8NU3yw5","djsrv8TxD7","O3iyQFGzgp","UlU3Mi3pyd","vkCHHIn3NS","CNHmvYOfrY","hSSvQuupzk","lsQGoOUqFM","P6bcgciuWz","QssNCAkKTk",
+"tlILt6q6L9","Waim6taOXK","azIWpzY1GY","tl72W2ZHdk","fLNg8iKqhr","X6PinyEfy9","AXpwE2DREs","Pb1paVBjhz","ZzJHWydG8U","9iGoTNOHsz",
+"ksJbyFNYIM","hYBCKguMb8","9GXkXAgJHQ","RsQUqM3zXL","HlUbF0Wr5y","hE1QlIjTwP","IjTwP2TRI7","x3LDecShY2","5ZaEzQWxoT","VNCPdWPmlx",
+"m4bxUzY1GY","jiVBPxciqp","AIYUuEOE1o","cL0aEMezSW","dpe1vFjHXR","jtn0XSs0Zu","07n1ct59lR","XyPZN9y4lw","lsQGokZANm","Dz1R3OUYuF",
+"MGlTFsoy9t","tlILt5drc6","TXQ0ZPOUYS","7lUXZsx5Gl","BFkb8HfyNQ","sx5Gl8TxD7","Ss0ZuCqqaD","9y4lw24ARF","soy9trKDLJ","hi5X7S2Dfu",
+"uPX7G48cHL","IRh48MaJQs","C2Irc9y4lw","J2mQiSbRYy","lsQGolCMxy","SjskQMezSW","Cfgr3IjTwP","s4786Chuy3","D6rByWaim6","iwzGkzQt6Q",
+"oQ87rI7p2a","CxVEfokgRi","CK5W7OxWIH","Q6hMC2DREs","iwzGk3otm6","ZUnqtO3iyQ","7X3uytuDyS","fcJOysuY4x","SbRYyqaofN","55rfBFPfSE",
+"ogLgccQOnv","gjUTuReKEW","yluBxVprf2","iB08llj07Q","zQt6QuJScX","VLTy6WDVWJ","hi5X7AmdQd","X6PinX6Pin","QClRL4dEz6","B3qemtvdkD",
+"jeskSW3VFH","FPfSE7Ow5C","uupzkjeskS","MezSWEOE1o","QssNCoVQp6","M6qcG618Di","MaJQs48cHL","nnP8oS2Dfu","DG4sTCNHmv","QYxC0jzUqR",
+"K20wKEOE1o","KsjRKrKDLJ","IjTwPuN6r3","lViBvHRxd8","y94nwVprf2","hYBCKhE1Ql","IKxdLHzZT8","KsjRKM6qcG","yofH348cHL","BCxeC8hJdt",
+"lXFOBFhtgl","Kr8ysGSQwj","QYxC0DcpWB","9eoRc5ZaEz","AmdQdFNYIM","SWfousoy9t","rKDLJ8xEKz","FjHXR2TRI7","Gv3FquZPqg","xReecrKDLJ",
+"jiVBP6q6L9","wiHrZJ2mQi","xciqpG1RhS","FVMxouQIcz","prNT6zY1GY","oQ87rK20wK","pmeCdv8yFN","guMb8MojnP","iKqhr8RCUA","zmLYDcmXIX",
+"zqH0WWmadA","HfyNQzFgtB","OxWIH8RCUA","OUYuFCIShG","zFgtB5iGN5","OUYuFaez9y","FxX9q4W0Tl","45cIHVLTy6","HzZT8B3qem","gIYvEmz8gx",
+"Vprf2oVQp6","uLtKsJkzUn","Pb1paHzZT8","v2eC3Pb1pa","tjQxsChuy3","5drc6zFgtB","oQ87rTCgPp","MmsIo5drc6","uQIczThjNn","t98iWn1pmO",
+"h1zcHGv3Fq","RACujbZLvS","F6PT2OxWIH","PYBf4580YD","X6Pin8xEKz","uLtKs0BmCy","xXTI4yvOMI","t98iWs7Mxk","BCxeC0ao3l","BGaQYI7p2a",
+"JIqXiazIWp","pWiOsNcICA","KsjRK9rlg9","v8yFNatef2","qQxHP5Drn0","gjUTuzQt6Q","FPfSEpiJSk","oVQp6Mm8si","X6PinYf2Ec","LbRTHoQ87r",
+"64s8NIjTwP","Z4I1vpT8wu","uoStwRxrsm","Q6hMCMezSW","JRJQBv1Hln","soy9tlweGy","HP433lH1kt","ECMvUfqypy","RxrsmAOgEe","Mm8siAkKTk",
+"9GXkXGSQwj","QbxXcRmDcr","uPX7GkB5nP","GrDg71v5hH","29QAzNo0Qb","CqqaDFcWrW","QssNCjfREu","lj07Q07n1c","pv0i7hi5X7","gf8rIQbxXc",
+"y94nwQssNC","i3pydSbRYy","QWxoTwDajX","P6bcgQ6Lix","UlU3M5VZjS","IjTwPhYBCK","l83UdChuy3","d7vjMVNCPd","uvf7A5Namm","ni2v1VBjhz",
+"W3VFHzFgtB","qaofNNhXdu","Yw2oUi3pyd","GrDg75Mg9r","MmsIoWDVWJ","64s8Nm4bxU","5drc6tl72W","zHF1qOHaBz","1j5L8fcJOy","4W0Tl14FLR",
+"P6bcgdQ586","Gv3FqdhSuH","gf8rIyofH3","Nxx9VGv3Fq","GXdoH9iGoT","UlU3MiwzGk","uJScXa00b5","7ku1poVQp6","xciqpKZamH","cL0aE5IhmG",
+"Yh1hFLbRTH","xReeclViBv","e6e4zFVMxo","D6rByOxWIH","F6PT2G1RhS","FFDuib29RJ","o8UydVLTy6","FLsph2hEEU","uTacxOUqFM","POUYSazIWp",
+"ZhwG17hyVv","uupzkSbRYy","5Mg9rFNYIM","7X3uy7fsYM","o8Uyd16lHc","aDGtSMGlTF","4W0TlFxX9q","S2DfuuJScX","HlUbFiB08l","JRJQBtlILt",
+"MGlTFhi5X7","hYBCKJ2mQi","ThjNnnlaBy","fcwDaHlUbF","FnPFBdjsrv","Mkgy8BFkb8","hi5X7cShY2","blLA9I7p2a","CdyBVyToGW","6q6L9jiVBP",
+"suY4xJKWYR","hUTw7brhlQ","618Div1Hln","lj07Q0h1b1","NcICAfmIK1","cL0aE8hJdt","JKWYRzmLYD","Yf2EcRpBQm","MaJQsxReec","lH1ktQworu",
+"tjQxsnnP8o","DLhzMsx5Gl","D6rBylsQGo","gdQsSv8yFN","9eoRcNcICA","Qworu3weIF","okgRiECMvU","pv0i7yToGW","ydG8UCK5W7","16lHcRkQke",
+"iKqhrdhSuH","vLsmSDLhzM","yEfy9MojnP","v8yFNJ2mQi","W3VFHk85Ae","7fsYMMojnP","AmdQdy94nw","uPX7GMojnP","aL6AJatef2","oQ87rfFDrJ",
+"BbwgAM3zXL","yEfy9jS1aj","mz8gxoVQp6","VerEAaez9y","uoStwYf2Ec","Vprf2yluBx","5NammcShY2","0ao3laez9y","Zv7z0MezSW","fcwDaCK5W7",
+"MmsIoAIYUu","AIYUusqVrf","FxX9qWaWsv","gIYvEJXljW","6AFT0dhSuH","1v5hHLbRTH","IjTwPAIYUu","1j5L8y94nw","5IhmGIKxdL","5iGN5gf8rI",
+"S77LHd7vjM","ZUnqt0h1b1","EoToPOUqFM","d7vjMnFqik","1j5L8oQ87r","wDajXIjTwP","RpBQmJIqXi","AIYUuHRxd8","jSjS3qUJMd","StlDJ4dEz6",
+"jfREuMezSW","uvf7AXyPZN","IKxdLS77LH","5VZjSfcJOy","zY1GYs4786","ulk41sqVrf","vOqCElCMxy","Vprf2CqqaD","EoToPpT8wu","UlU3Mjtn0X",
+"5VZjS14FLR","48cHLBCxeC","29QAzyluBx","AkKTkyluBx","5VZjStlILt","7ku1puN6r3","uQIczmz8gx","soy9tVNCPd","yluBx3weIF","y94nw0BmCy",
+"QClRLXflUq","K4GS8zz4ZU","zQt6Q7hyVv","tvdkDpAhR1","ksJbyrz7Ut","uN6r3vkCHH","e6e4zJIqXi","Vprf28TxD7","FjHXRS2Dfu","XflUqpiJSk",
+"GWqqXBFkb8","IRh48t98iW","ZuDtDn8pJ9","tuDySlCMxy","BbwgAWaim6","aL6AJ64s8N","BGaQYhYBCK","0h1b1aL6AJ","zz4ZUK4GS8","FVMxoprNT6",
+"tlILtQbxXc","BGaQYqUJMd","Zv7z0VLTy6","VIlwPwDajX","qaofN8TxD7","RpBQmAkKTk","iKqhraez9y","CNHmvOz8yZ","CdyBVjeskS","hi5X7soy9t",
+"cL0aEEOE1o","BCxeCyEfy9","soy9tcmXIX","QnJ1Ss4786","EdBKcGXdoH","In3NSQworu","7fKYUKASQ8","pT8wuNxx9V","uQIcz9iGoT","jeskSRmDcr",
+"zHF1q7X3uy","Z4I1vB3qem","a00b55drc6","7Ow5C1j5L8","2hEEUmX2GE","OxWIHxciqp","vkCHHMmKGJ","Dz1R3zmLYD","7X3uy7lUXZ","PYBf424ARF",
+"lkMUAJXljW","v2eC3pmeCd","Gv3FqWaim6","qaofNL7cGc","SbRYyb29RJ","sx5GlQ6Lix","0BmCyOz8yZ","Cfgr3suY4x","AXpwEYOfrY","OUYuF0YAGH",
+"fLNg8FVMxo","n1pmOUlU3M","Twanodpe1v","OUqFMvkCHH","uupzkIBe8k","4QMc9h1zcH","qaofNi3pyd","lkMUANOHsz","QClRLGv3Fq","EdBKcsqVrf",
+"zqH0WSWfou","KZamHkB5nP","0YAGH8FmFH","zz4ZUjtn0X","L7cGcNo0Qb","MojnPtl72W","VjCZqAgJHQ","K4GS8jS1aj","3weIFrhl0J","he9IAJ2mQi",
+"Z4I1vcL0aE","prNT6x3LDe","cL0aECdyBV","ZuDtDyluBx","yvOMIReKEW","BpYhV5Namm","yluBxPb1pa","aL6AJbgJAz","AOgEei3pyd","BpYhV16lHc",
+"AIYUuuN6r3","hUTw78RCUA","guMb8kZANm","9iGoTqaofN","8U2nUVLTy6","EOE1o07n1c","fmIK1RBhp0","pv0i7fFDrJ","jSjS3MmsIo","he9IAL7cGc",
+"CIShGfaHir","rz7Ut7ku1p","jiVBP45cIH","YOfrYWDVWJ","HP433t98iW","e6e4zgdQsS","cQOnvuLtKs","zz4ZUMmKGJ","hi5X7AOgEe","cQOnvv2eC3",
+"AXpwE9rlg9","X6PinO3iyQ","bZLvSLewvM","Oz8yZmz8gx","F6PT25IhmG","AmdQdYOfrY","48cHLy94nw","gjUTujiVBP","aL6AJ5nmWv","GWqqXVerEA",
+"yofH37X3uy","JXljWMkgy8","he9IA7fKYU","sqVrfvkCHH","NAFuw5Namm","8xEKzCdyBV","WaWsvzY1GY","C2IrclpF6W","O3iyQSjskQ","VLTy6BCxeC",
+"X6PinWaWsv","djsrvGXdoH","45cIHfLNg8","XyPZNlj07Q","X6PinQYxC0","CxVEf9eoRc","3otm6fcwDa","9y4lwQChxs","uJScXogLgc","s93Mlmz8gx",
+"2DREsprNT6","MezSWiKqhr","3otm629QAz","LbRTHIjTwP","tjQxsVprf2","i3pydOHaBz","0MR5XpiJSk","SbRYyWPmlx","55rfBk85Ae","6q6L9XyPZN",
+"SmGzvHP433","WPmlx5IhmG","EdBKcStlDJ","n1pmO0YAGH","wiHrZ9rlg9","hUTw7In3NS","5Nammv1Hln","Ul4a1ni2v1","VBjhzqUJMd","0BmCyn8pJ9",
+"lViBvwiHrZ","hi5X7t98iW","RkQkeuLtKs","QworuyEfy9","MK07Yo8Uyd","K4GS85nmWv","yToGWbZLvS","RpBQmVLTy6","xXTI4Pb1pa","zQt6QW3VFH",
+"ECMvUDG4sT","Chuy35Namm","8hJdtOUYuF","faHirtaOXK","M3zXLAXpwE","vOqCEtjQxs","soy9tMojnP","b29RJtvdkD","Uvlv4gf8rI","Cfgr348cHL",
+"MmKGJulk41","yToGWW7cTs","DcpWBpWiOs","oQ87r5Namm","YjB9t1LB1L","zbIYYNo0Qb","P6bcg48cHL","RpBQmPYBf4","07n1cS77LH","aDGtSB3qem",
+"Nxx9VqaofN","0KyfslXFOB","2hEEUQYxC0","AOgEeCqqaD","C2IrcvkCHH","jeskSCfgr3","JRJQBSjskQ","nFqikiqv4k","ECMvU7Ow5C","MezSWqUJMd",
+"4dEz6XflUq","Ul4a11j5L8","ydG8UPb1pa","29QAzAmdQd","0MR5XpAhR1","dhSuH2DREs","gf8rICK5W7","EdBKcCdyBV","In3NSK4GS8","FhtglpmeCd",
+"24ARFFxX9q","XflUq580YD","I7p2aqUJMd","IjTwP07n1c","SjskQQChxs","uN6r3RpBQm","Zv7z0HRxd8","W3VFHogLgc","lweGypFrrl","gtCA5i7WMQ",
+"7Ow5C5Namm","k85Aedpe1v","JXljWRkQke","Ta8f6TCgPp","Vprf24QMc9","0YAGHChuy3","d85a9qUJMd","FNYIMfqypy","P6bcgPYBf4","Yf2EcaDGtS",
+"7Ow5CpT8wu","uAWypzQt6Q","QYxC0RkQke","FxX9q0Wr5y","t98iWYOfrY","Pb1paqUJMd","RkQkeSmGzv","uAWypVprf2","QWxoTRxrsm","nFqik9rlg9",
+"2DREsMmsIo","6q6L9TCgPp","suY4xtuDyS","S77LHJRJQB","BFkb8hE1Ql","d85a9cmXIX","uQIczIn3NS","QClRLIjTwP","t59lR2Yz7E","TCgPpt98iW",
+"GSQwjx3LDe","s93MluTacx","MmsIo07n1c","0h1b1GrDg7","5iGN5zQt6Q","uN6r3FjHXR","WPmlxi7WMQ","aFFssSbRYy","OUqFM2Yz7E","FwEJzvOqCE",
+"tAOsrMezSW","HlUbFX6Pin","lCMxyO3iyQ","0h1b1SmGzv","BGaQYkB5nP","ZUnqt6q6L9","xciqp55rfB","VjCZqBFkb8","OHaBz5iGN5","iwzGkQssNC",
+"atef2ogLgc","Yw2oU7X3uy","9y4lwt98iW","aFFssIjTwP","9XyT9jS1aj","24ARFOUYuF","6AFT0QbxXc","tAOsrQChxs","aFFssFGzgp","O3iyQThjNn",
+"LewvMzqH0W","IjTwP9eoRc","cQOnv8TxD7","ix74rZzJHW","PYBf4pmeCd","RpBQm6AFT0","S2DfuVNCPd","ydG8U14FLR","FPfSE5Mg9r","djsrvoVQp6",
+"dhSuHpv0i7","hSSvQjfREu","hSSvQK20wK","ciuWzW7cTs","WreyPZJTXH","IKxdL4W0Tl","StlDJSs0Zu","mX2GEpT8wu","OUYuFzQt6Q","POUYS580YD",
+"QClRLLDk6f","9y4lwxReec","FwEJzazIWp","WDVWJRxrsm","WmadAgjUTu","zQt6QY1mC0","RACujGWqqX","OHaBzMK07Y","fLNg8DcpWB","FcWrWWaim6",
+"QClRLlweGy","QnJ1SmX2GE","RzaZA7lUXZ","mX2GECxVEf","VerEAOUYuF","fqypyfLNg8","BbwgA8RCUA","ZhwG107n1c","VerEAuQIcz","FPfSEFPfSE",
+"QssNCksJby","Yh1hFBFkb8","KZamHAgJHQ","qaofNCIShG","RmDcrZhwG1","uN6r3KsjRK","gtCA5WreyP","dQ586ciuWz","iqv4kwiHrZ","WreyP5VZjS",
+"zY1GYqaofN","lkMUAxReec","RsQUqW3VFH","FjHXR618Di","zFgtBAXpwE","FxX9qLewvM","t98iWb29RJ","GXdoHG1RhS","rKDLJtaOXK","bgJAzd7vjM",
+"RxrsmogLgc","0PktIyluBx","5NammAmdQd","UlU3MlweGy","JKWYRlm0pD","9GXkXvLsmS","VjCZqQWxoT","oVQp6wiHrZ","xciqpCfgr3","Yh1hFciuWz",
+"d7vjM8hJdt","KsjRKpAhR1","i3pydjSjS3","dpe1vyluBx","In3NSiqv4k","2DREs8TxD7","uoStw4dEz6","OHaBzd85a9","M3zXLtuDyS","0Kyfs5nmWv",
+"uJScXY1mC0","a00b55Namm","zmLYDmz8gx","S77LHTwano","tjQxsjeskS","jiVBP0PktI","bZLvS29QAz","8RCUA24ARF","qQxHPNhXdu","RpBQmcmXIX",
+"9GXkXrKDLJ","7fsYM9y4lw","GWqqXvkCHH","VLTy6LbRTH","rhl0JHRxd8","FxX9qo8Uyd","brhlQIn3NS","3weIFvLsmS","64s8NB3qem","3otm6hSSvQ",
+"9iGoTZhwG1","2Yz7EIjTwP","prNT6aL6AJ","1LB1LAgJHQ","16lHc0BmCy","zHF1qS77LH","rhl0JfFDrJ","v8yFNAXpwE","In3NS0MR5X","WmadAiwzGk",
+"OHaBzRkQke","X6Pin5ZaEz","CqqaDoQ87r","zqH0WuTacx","0KyfsFcWrW","s93MlNcICA","lj07QuoStw","n8pJ9aDGtS","dhSuHtaOXK","RzaZAk85Ae",
+"5Mg9re6e4z","MmKGJHRxd8","dQ586cShY2","EdBKcuTacx","Yf2EcyofH3","zY1GYaFFss","NhXdu1j5L8","55rfBiqv4k","29QAzReKEW","9XyT9tvdkD",
+"gjUTuEdBKc","Ss0ZudhSuH","v2eC3hE1Ql","QChxsFLsph","oQ87rU3yw5","29QAz24ARF","i3pyd3weIF","zHF1qm4bxU","QbxXcEoToP","SWfouRsQUq",
+"ydG8UlXFOB","tuDySulk41","CK5W75Namm","LDk6fyluBx","tlILt580YD","gjUTuRmDcr","AOgEedhSuH","FVMxo24ARF","k85Aet98iW","8RCUAFGzgp",
+"MmsIo7fKYU","fcJOyMGlTF","mX2GElCMxy","07n1cK20wK","FPfSEix74r","hE1Qls93Ml","AgJHQiwzGk","FjHXRKsjRK","xXTI47X3uy","LbRTH8FmFH",
+"Q6LixGSQwj","tvdkDVLTy6","0ao3lZJTXH","7ku1pzHF1q","HfyNQ64s8N","RsQUqSjskQ","TCgPpbrhlQ","qQxHPpvgjS","lweGyQnJ1S","ogLgcxciqp",
+"MezSWzmLYD","vOqCE3otm6","FwEJzIn3NS","4W0Tl0ao3l","JRJQB8TxD7","a00b5fcwDa","dQ586bZLvS","Q6hMClj07Q","xciqpjtn0X","07n1c4QMc9",
+"580YDSmGzv","gIYvElXFOB","LDk6f0PktI","gtCA5ix74r","No0QbTXQ0Z","pmeCdJKWYR","iKqhr5Drn0","Pb1pat98iW","Zv7z0fcJOy","4QMc9e6e4z",
+"OHaBzK20wK","JIqXiwDajX","HzZT8m4bxU","ksJby07n1c","wiHrZZJTXH","KZamHhYBCK","LbRTHWaim6","CK5W7BFkb8","7X3uyZuDtD","blLA9uPX7G",
+"lweGy0YAGH","8FmFHPb1pa","vkCHHUvlv4","yToGWydG8U","iB08luAWyp","CK5W7Mm8si","FxX9qgjUTu","5ZaEzGSQwj","o8Uyd6q6L9","uTacxbZLvS",
+"e6e4znFqik","UlU3M5drc6","FnPFBS77LH","fFDrJP6bcg","bZLvSnlaBy","Mm8sicShY2","zY1GYvOqCE","NOHsz9y4lw","MGlTFaFFss","S2DfuXyPZN",
+"EoToPi3pyd","64s8Nni2v1","fmIK18xEKz","0YAGHfmIK1","8cVD3v2eC3","sqVrfHRxd8","cmXIXCqqaD","jSjS3yToGW","LbRTH07n1c","fqypybgJAz",
+"CK5W7zz4ZU","1v5hHCfgr3","HRxd8FnPFB","JIqXivkCHH","WreyPP6bcg","7fKYUiwzGk","3weIFtjQxs","WMiS3HP433","tjQxsQClRL","uQIcztaOXK",
+"JKWYRDLhzM","GXdoHyvOMI","tlILtIjTwP","GWqqXHlUbF","fcJOyIjTwP","RmDcrStlDJ","8cVD32hEEU","RpBQm8xEKz","fFDrJcQOnv","ZuDtDjSjS3",
+"pvgjSMkgy8","5iGN5L7cGc","aDGtSoQ87r","XflUqlm0pD","ZUnqtJIqXi","QworugdQsS","VerEAJ2mQi","rhl0JZuDtD","J2mQiaDGtS","C2IrcSmGzv",
+"hi5X7OUqFM","K20wKtuDyS","pT8wuQWxoT","s4786FFDui","jiVBPM3zXL","ECMvUnlaBy","atef2HlUbF","Mm8siZuDtD","l83UdKASQ8","fFDrJpmeCd",
+"hi5X7BFkb8","8cVD30h1b1","2DREsd7vjM","QssNC5iGN5","L7cGct98iW","wDajXmz8gx","8TxD7LDk6f","3weIFJRJQB","BGaQYNo0Qb","VNCPdWDVWJ",
+"WaWsvJKWYR","SjskQlsQGo","FNYIMhE1Ql","0Wr5yCK5W7","MGlTFvLsmS","3weIFlH1kt","SmGzvCp3mZ","fLNg8fcJOy","taOXK55rfB","QChxsNAFuw",
+"Chuy3aDGtS","ix74rwDajX","6AFT0uJScX","Nxx9VvkCHH","OUqFMaL6AJ","5NammCp3mZ","HzZT81v5hH","FLsphv1Hln","zqH0WKASQ8","8TxD7I7p2a",
+"QChxsS77LH","XflUqpmeCd","euZA50BmCy","OHaBzThjNn","K4GS8DG4sT","B3qemoVQp6","lCMxyMm8si","iB08l3otm6","5nmWvru4UG","S77LHCqqaD",
+"W7cTsMezSW","GrDg74dEz6","zQt6QIKxdL","QClRLdhSuH","ciuWzZv7z0","MGlTFfqypy","zqH0WpmeCd","7hyVvnnP8o","HP433ZUnqt","hSSvQS77LH",
+"d85a9MojnP","uTacxhe9IA","v2eC3mX2GE","No0QbpAhR1","e6e4zS2Dfu","Nxx9VMGlTF","TXQ0ZNo0Qb","l83Udi3pyd","LewvMUl4a1","KZamHzHF1q",
+"618DifFDrJ","i7WMQGWqqX","1LB1LmX2GE","2ZHdkhSSvQ","X6Pino8Uyd","7fKYUEoToP","AmdQd5IhmG","4W0TlIjTwP","ni2v18RCUA","5IhmGuLtKs",
+"9GXkXThjNn","7fKYU0PktI","Yh1hF3weIF","uQIcz5Mg9r","CK5W7uQIcz","iwzGkHzZT8","zbIYYJIqXi","ydG8UPOUYS","fFDrJYjB9t","4QMc9Y1mC0",
+"faHirjtn0X","zFgtB4W0Tl","tuDySCfgr3","i3pydqQxHP","0MR5Xix74r","WmadA0Wr5y","oGu6xwiHrZ","CqqaDzFgtB","5Mg9rFxX9q","zFgtB07n1c",
+"K4GS8cmXIX","QYxC0LewvM","ix74ruupzk","HzZT8vkCHH","s93Mlb29RJ","tvdkDXyPZN","uAWypuQIcz","SWfou8U2nU","KsjRKKASQ8","RmDcrWreyP",
+"I7p2ajiVBP","TXQ0ZHfyNQ","Yw2oUJXljW","2Yz7Ezz4ZU","tjQxsFNYIM","o8UydBGaQY","EoToPDLhzM","lXFOBcShY2","e6e4zEdBKc","4dEz68U2nU",
+"ZJTXH0BmCy","5Mg9rGrDg7","9iGoTUl4a1","yToGWzz4ZU","s4786d85a9","0MR5XhUTw7","CK5W7azIWp","MGlTF7fKYU","d7vjMS2Dfu","Nxx9Vd7vjM",
+"prNT6AkKTk","HRxd8gf8rI","EoToPHlUbF","580YD0Kyfs","l83UdCxVEf","XflUq0YAGH","QClRLFLsph","wiHrZh1zcH","Ul4a1xReec","W3VFHHP433",
+"oVQp6ThjNn","UmaEv0Kyfs","hYBCKPOUYS","FVMxohSSvQ","GXdoHD6rBy","qaofNnnP8o","euZA5fqypy","FPfSEfcwDa","GrDg7guMb8","x3LDe5IhmG",
+"9XyT9ThjNn","U3yw5qUJMd","HfyNQ7Ow5C","jiVBPMK07Y","JkzUnZzJHW","ydG8UbgJAz","0ao3lpAhR1","lCMxywiHrZ","aFFss8RCUA","Yh1hFVjCZq",
+"Y1mC0618Di","CqqaDK20wK","zqH0Wo8Uyd","uvf7ALDk6f","X6PincShY2","24ARFprNT6","djsrvRpBQm","tAOsrm4bxU","faHiruvf7A","X6PinZJTXH",
+"Q6hMC9iGoT","1v5hHQClRL","WreyPG1RhS","uupzk5IhmG","FjHXRqQxHP","CxVEf5Drn0","v8yFNWaWsv","azIWpx3LDe","cShY2SmGzv","hUTw7LbRTH",
+"Ss0Zu9y4lw","azIWpcQOnv","RBhp0Twano","HRxd82DREs","ydG8UVjCZq","1LB1LcmXIX","tuDyS0PktI","K20wKuTacx","i7WMQ4dEz6","zY1GY5nmWv",
+"MaJQsvkCHH","55rfBDG4sT","rz7Ut55rfB","okgRi5ZaEz","FFDui7ku1p","i3pydBGaQY","Waim60MR5X","8cVD3FxX9q","9XyT9HzZT8","fcJOy5VZjS",
+"FVMxoVLTy6","DQimpqUJMd","jeskSCqqaD","h1zcH9rlg9","b29RJVerEA","O3iyQD6rBy","ni2v1VjCZq","qUJMdX6Pin","KASQ8tuDyS","WaWsvs93Ml",
+"jzUqRjSjS3","7lUXZVLTy6","DcpWBSjskQ","8hJdtdpe1v","v8yFNYw2oU","8xEKz2ZHdk","VLTy607n1c","t59lRMkgy8","ru4UGlsQGo","TXQ0ZSWfou",
+"KASQ8jzUqR","OUYuFWaWsv","Chuy3Dz1R3","S2DfuVerEA","he9IAuZPqg","okgRi6AFT0","5IhmGK4GS8","5ZaEzlm0pD","FPfSEcL0aE","ZuDtDSbRYy",
+"AkKTkjzUqR","xXTI4y94nw","9GXkXfaHir","rKDLJOUqFM","t98iWYf2Ec","XflUqlH1kt","WreyPwDajX","UmaEvU3yw5","fmIK1okgRi","ReKEWcmXIX",
+"LbRTH580YD","hE1QlMm8si","iB08lDG4sT","lkMUAgIYvE","IjTwPFcWrW","uTacxZ4I1v","v8yFNlViBv","JkzUno8Uyd","oQ87rNhXdu","oGu6xNxx9V",
+"618DiGv3Fq","HzZT8ZuDtD","5ZaEzFxX9q","RxrsmIjTwP","GWqqXZJTXH","FwEJzZv7z0","ZUnqtkB5nP","n1pmOI7p2a","Y1mC0tAOsr","DQimpatef2",
+"o8UydwiHrZ","2Yz7EqaofN","dpe1vtAOsr","BbwgAx3LDe","WmadAReKEW","B3qemgdQsS","TCgPp8hJdt","pT8wunnP8o","hUTw7jSjS3","s7MxkWPmlx",
+"FGzgp5Namm","VerEAQChxs","lCMxySWfou","29QAzPb1pa","16lHcRzaZA","Dz1R3tjQxs","uJScXjzUqR","SbRYy9iGoT","tl72Wjtn0X","hi5X7YjB9t",
+"a00b5a00b5","uTacxrz7Ut","Q6LixMojnP","s93MllkMUA","QbxXcF6PT2","JJs5mUmaEv","cShY2QClRL","CNHmvciuWz","9eoRc5IhmG","5nmWvHlUbF",
+"gIYvERACuj","5ZaEzRsQUq","ECMvUbrhlQ","7fKYUWreyP","m4bxUnlaBy","lCMxyzY1GY","pT8wu5iGN5","5Nammru4UG","FGzgpXflUq","lsQGo55rfB",
+"jzUqRlweGy","lweGyzY1GY","MojnPY1mC0","qUJMdzHF1q","lpF6WZzJHW","3weIFGWqqX","G1RhSAmdQd","DG4sTLewvM","FPfSEyToGW","MaJQsECMvU",
+"2TRI7S2Dfu","uAWypW3VFH","AXpwEYjB9t","K20wK0h1b1","pAhR1cQOnv","ZJTXHZhwG1","s93Mlpv0i7","a00b5cQOnv","Qworum4bxU","taOXKDG4sT",
+"fLNg8XflUq","gdQsSTwano","L7cGcVerEA","uN6r35VZjS","oGu6xL7cGc","uN6r3uoStw","zz4ZU16lHc","8cVD3KZamH","RmDcrThjNn","d7vjMvOqCE",
+"s4786RpBQm","HzZT8oQ87r","tjQxsFnPFB","suY4xUl4a1","BCxeCBFkb8","RmDcrsqVrf","s4786KsjRK","uAWypzbIYY","pmeCdwDajX","n8pJ9fcJOy",
+"ksJbyPYBf4","QClRL1j5L8","cShY2TXQ0Z","aL6AJ1v5hH","rhl0JfcwDa","jtn0Xpv0i7","s93Mlaez9y","48cHLguMb8","faHiruAWyp","pvgjS45cIH",
+"PYBf4FjHXR","0YAGHxReec","M6qcGAOgEe","0h1b1pT8wu","GWqqXi7WMQ","yofH3VNCPd","AkKTkfcwDa","yEfy96q6L9","48cHLQ6hMC","SjskQS77LH",
+"bgJAzn8pJ9","vLsmSTa8f6","JRJQBUlU3M","e6e4zGWqqX","aez9ytvdkD","Ta8f6o8Uyd","tjQxsuLtKs","DG4sTpmeCd","6AFT0uvf7A","FNYIMt98iW",
+"2NslmwDajX","pAhR1ix74r","9y4lwxXTI4","x3LDeJXljW","GWqqX2TRI7","kB5nPzmLYD","soy9td7vjM","NAFuw2hEEU","zY1GYFNYIM","9iGoTQClRL",
+"RpBQm7hyVv","HP433WPmlx","FPfSEVNCPd","hUTw7okgRi","Ta8f65VZjS","tjQxsKsjRK","DQimpaDGtS","CdyBVe6e4z","JkzUnYw2oU","StlDJn1pmO",
+"ix74rulk41","FFDuiaL6AJ","618DilweGy","fcJOyK4GS8","QworuFGzgp","v1HlnuN6r3","QssNCSjskQ","hi5X7IjTwP","IBe8kv1Hln","VLTy6ni2v1",
+"7ku1pJXljW","HP433vOqCE","ni2v1uLtKs","gdQsS29QAz","5ZaEzZJTXH","zFgtBYjB9t","n8pJ9l83Ud","tl72WK20wK","6q6L9hE1Ql","FnPFBCdyBV",
+"BFkb8FFDui","zY1GY2TRI7","iB08lZ4I1v","uupzkb29RJ","qaofNQChxs","euZA5HzZT8","NAFuwLewvM","suY4xThjNn","7lUXZ48cHL","0Wr5yUmaEv",
+"nnP8ofLNg8","vOqCEdmoS7","Gv3FqyEfy9","FGzgpzY1GY","fmIK1lpF6W","In3NSWreyP","l83UdjfREu","7lUXZvLsmS","tl72WMGlTF","e6e4zk85Ae",
+"8cVD3LDk6f","EOE1ogjUTu","Cp3mZmz8gx","ni2v1I7p2a","ZzJHWyofH3","pFrrlzQt6Q","lpF6WjfREu","C2IrcokgRi","BGaQYU3yw5","bZLvSlsQGo",
+"l83Ud8RCUA","MK07Y8TxD7","soy9tgIYvE","jeskStjQxs","VIlwP7fKYU","ReKEWuQIcz","3weIFyofH3","dQ586YOfrY","4W0Tld85a9","Gv3FquQIcz",
+"GXdoHYjB9t","aDGtSKZamH","0KyfsTa8f6","FnPFBs7Mxk","ZJTXHkZANm","NcICAfaHir","QWxoT7fKYU","fFDrJSjskQ","dhSuHyofH3","xXTI4DG4sT",
+"qUJMd0ao3l","vOqCEEdBKc","SmGzvoQ87r","lkMUAnlaBy","dpe1vVLTy6","U3yw5iB08l","FhtglHRxd8","Q6hMCKASQ8","tAOsrC2Irc","dhSuH1v5hH",
+"tuDyS7ku1p","P6bcgAIYUu","i3pydv8yFN","OHaBzcmXIX","8TxD7e6e4z","djsrvYf2Ec","LewvMRzaZA","0KyfsQ6hMC","JkzUnrhl0J","uLtKs7X3uy",
+"IKxdLiB08l","gdQsSCK5W7","1j5L8d7vjM","7X3uyuAWyp","lH1ktd85a9","fcwDaVBjhz","5Mg9rWDVWJ","UlU3MPOUYS","AkKTk0h1b1","CdyBV5Drn0",
+"6q6L97hyVv","14FLRMm8si","d85a9QbxXc","gtCA5dQ586","VjCZqQ6hMC","e6e4zuN6r3","0Wr5yZhwG1","U3yw52ZHdk","QChxsfmIK1","3weIFF6PT2",
+"iB08le6e4z","Dz1R3ZJTXH","aL6AJsoy9t","9y4lwlCMxy","rz7Ut16lHc","4dEz6piJSk","NhXducmXIX","hUTw7SbRYy","bgJAzlsQGo","G1RhS64s8N",
+"DQimpuTacx","5VZjStaOXK","cQOnvx3LDe","azIWpdmoS7","VLTy6EoToP","2NslmhYBCK","1v5hHRkQke","pmeCdru4UG","rz7UtXyPZN","AIYUu2hEEU",
+"RzaZAM3zXL","x3LDeaFFss","Yw2oUAmdQd","azIWpFcWrW","gIYvE7fsYM","9iGoTReKEW","xReecSmGzv","v1HlnIn3NS","9eoRcrz7Ut","Vprf2v2eC3",
+"EoToPFcWrW","zz4ZUbgJAz","QClRLYjB9t","NhXdudjsrv","7fsYM6AFT0","hE1Qlk85Ae","b29RJ580YD","oVQp6pAhR1","0BmCyblLA9","Vprf25Mg9r",
+"PYBf4Uvlv4","2hEEUtaOXK","Ul4a1zY1GY","EOE1o7ku1p","Yh1hFtuDyS","16lHcU3yw5","CqqaDLewvM","tl72Ws7Mxk","RBhp0atef2","XflUqnFqik",
+"tjQxsJIqXi","CK5W7Zv7z0","5NammDLhzM","YjB9t07n1c","W7cTslCMxy","0Wr5ysqVrf","CIShGfcJOy","kB5nPKASQ8","48cHLlH1kt","CNHmvVIlwP",
+"cL0aEni2v1","brhlQIjTwP","QClRLBbwgA","RpBQmVerEA","aFFsshe9IA","s93Ml0PktI","QClRL618Di","pFrrl7X3uy","NOHsz8FmFH","s93Ml2TRI7",
+"2ZHdk55rfB","Rxrsmb29RJ","bgJAzlj07Q","iwzGkrhl0J","jtn0Xni2v1","qQxHPuvf7A","F6PT2mz8gx","ru4UGSmGzv","uQIcz2hEEU","FNYIMZJTXH",
+"uAWypfqypy","C2Irc2hEEU","Yf2EcOUYuF","bgJAzjtn0X","5Drn0tvdkD","zbIYY16lHc","POUYSQClRL","qaofNgdQsS","WreyPhUTw7","FjHXRiKqhr",
+"MmKGJuTacx","LDk6fzFgtB","16lHcKZamH","uPX7GWaim6","uQIczs7Mxk","VLTy6AOgEe","K20wKbgJAz","AgJHQtl72W","jSjS3he9IA","y94nwWmadA",
+"QbxXcC2Irc","DQimppT8wu","zbIYY9eoRc","t98iW7lUXZ","s4786gtCA5","ulk41EOE1o","No0Qbulk41","IjTwPCxVEf","3weIFa00b5","DLhzMoVQp6",
+"SbRYydmoS7","8U2nUBbwgA","v8yFN8cVD3","hYBCKFjHXR","Nxx9Vlm0pD","e6e4z8xEKz","cL0aENcICA","RxrsmD6rBy","S77LHdjsrv","RsQUqv8yFN",
+"lCMxy4dEz6","2Yz7EyluBx","D6rBygIYvE","lj07QvkCHH","AmdQd8TxD7","uvf7Arhl0J","iwzGkTXQ0Z","WmadAoVQp6","7X3uyPOUYS","Yw2oUoGu6x",
+"8U2nUlkMUA","wiHrZMkgy8","KZamHaFFss","taOXK5Namm","Nxx9VYjB9t","zHF1qJXljW","lXFOB7X3uy","AmdQdt59lR","J2mQiJJs5m","7fsYM5ZaEz",
+"SjskQGrDg7","RsQUqXflUq","8hJdt0ao3l","2Yz7Ev1Hln","5NammzY1GY","Oz8yZbrhlQ","Cfgr3cQOnv","SjskQ3otm6","5drc6RBhp0","EdBKc0Wr5y",
+"WreyPJJs5m","0PktI5iGN5","7fKYUECMvU","ZuDtDlkMUA","pT8wupv0i7","VjCZq24ARF","KZamHY1mC0","iKqhr8cVD3","29QAzsx5Gl","0MR5XCIShG",
+"uupzklsQGo","RACujJJs5m","jzUqR8xEKz","3weIFW7cTs","ZUnqtlH1kt","piJSkEOE1o","sqVrfjzUqR","Chuy3lH1kt","9y4lwfaHir","jzUqR7X3uy",
+"4dEz6No0Qb","SmGzvSbRYy","AXpwEaL6AJ","vkCHHmz8gx","n8pJ9SmGzv","9XyT9iqv4k","24ARFEoToP","fFDrJpvgjS","tuDySBbwgA","ZUnqtfcwDa",
+"o8UydFhtgl","Cp3mZUvlv4","uJScXjSjS3","t98iW5Namm","QnJ1SAOgEe","BbwgAfqypy","U3yw5Fhtgl","b29RJMezSW","he9IAEoToP","LewvM5VZjS",
+"Dz1R3VNCPd","2DREsbrhlQ","Kr8ys0BmCy","DcpWB8TxD7","qaofNpiJSk","0MR5Xsx5Gl","xXTI4atef2","v1HlnAOgEe","VBjhzoGu6x","uupzkIn3NS",
+"uN6r3ZhwG1","fLNg8IRh48","qaofNwDajX","pv0i7QssNC","BFkb8NhXdu","45cIHRzaZA","Z4I1vd85a9","Cfgr3tuDyS","ZUnqt45cIH","580YDTa8f6",
+"qQxHPn8pJ9","lj07QfLNg8","guMb8pFrrl","zz4ZUBGaQY","UlU3MpWiOs","1j5L8I7p2a","W3VFHGv3Fq","qQxHPyEfy9","WDVWJYOfrY","CxVEfgIYvE",
+"lpF6W4W0Tl","7hyVvb29RJ","IBe8kbZLvS","xReec580YD","1LB1LbrhlQ","FPfSEVLTy6","9GXkXJXljW","yluBxpT8wu","RkQkeh1zcH","7hyVvprNT6",
+"0ao3lhSSvQ","CxVEfsoy9t","0KyfsFhtgl","3otm6GWqqX","ZuDtDiwzGk","X6Pinv8yFN","S2DfuW7cTs","b29RJWaWsv","3weIF5nmWv","yToGWMaJQs",
+"FNYIM3otm6","RBhp0NcICA","xReec9GXkX","IKxdLoQ87r","6q6L9TXQ0Z","ru4UG5Mg9r","HlUbFLbRTH","CIShGpiJSk","nlaBytvdkD","ThjNnTwano",
+"Dz1R3POUYS","NcICAdmoS7","uAWypQWxoT","GSQwj5Namm","JIqXiuPX7G","pT8wuVLTy6","cQOnvECMvU","P6bcgFwEJz","wDajXuLtKs","IBe8kuJScX",
+"vOqCEG1RhS","WaWsvBGaQY","gdQsSQbxXc","iqv4kpT8wu","rhl0JECMvU","lViBvvOqCE","OHaBzoGu6x","s93MlmX2GE","I7p2a8RCUA","faHirK4GS8",
+"SbRYyY1mC0","618DiFcWrW","EdBKcDcpWB","BpYhVWPmlx","pmeCduAWyp","prNT6In3NS","iKqhrwiHrZ","SjskQpWiOs","2NslmEOE1o","cmXIXlpF6W",
+"s93Mli3pyd","lXFOBcL0aE","djsrv0MR5X","v8yFNfFDrJ","LbRTHvLsmS","9y4lwCK5W7","zz4ZUFwEJz","QChxsReKEW","zFgtBsuY4x","tvdkDnlaBy",
+"TCgPprz7Ut","RsQUquZPqg","tuDySnFqik","QWxoTCqqaD","RmDcrt98iW","7X3uykZANm","Ta8f6In3NS","B3qemlm0pD","sqVrfYjB9t","YOfrYs93Ml",
+"DQimpuZPqg","zQt6Q16lHc","hi5X7iqv4k","i3pydYf2Ec","zQt6Q8cVD3","i3pydWmadA","5Drn0S77LH","OHaBz9rlg9","5Mg9rVerEA","ix74rMojnP",
+"he9IApFrrl","HlUbF6AFT0","xciqpqUJMd","2TRI7v2eC3","iB08lM6qcG","7hyVvuAWyp","HP433MmsIo","16lHcMezSW","In3NSogLgc","pT8wuU3yw5",
+"7fsYMDQimp","xciqp8xEKz","qQxHPxReec","1j5L8RzaZA","FLsphJkzUn","2hEEUWMiS3","HP4335Drn0","yEfy9Yh1hF","RmDcrPYBf4","azIWpv8yFN",
+"3weIFHP433","dQ5865nmWv","2Yz7EogLgc","fLNg89XyT9","7fKYUGXdoH","TCgPpEoToP","oGu6xlViBv","HfyNQtuDyS","Ta8f6ni2v1","cL0aEGrDg7",
+"Pb1paFnPFB","ReKEWmz8gx","vkCHH5ZaEz","RpBQmRsQUq","WmadAydG8U","8TxD7uQIcz","NhXduD6rBy","suY4xa00b5","5ZaEzKZamH","WDVWJm4bxU",
+"NcICACIShG","QYxC0zqH0W","Pb1paZ4I1v","cShY26q6L9","guMb8BCxeC","he9IAFnPFB","bZLvS5ZaEz","Dz1R3jeskS","16lHcjeskS","ThjNngf8rI",
+"ydG8U0PktI","ni2v10YAGH","gf8rI8FmFH","blLA9BGaQY","nnP8o5drc6","Yh1hFUvlv4","580YDSWfou","gjUTunFqik","QClRLl83Ud","ogLgcpv0i7",
+"Ul4a1UmaEv","2ZHdkOz8yZ","5Mg9rqaofN","Pb1pa2ZHdk","DLhzMOxWIH","yToGWaDGtS","5drc65iGN5","BCxeC8FmFH","oGu6xd7vjM","h1zcH5drc6",
+"okgRiIKxdL","XyPZN5Mg9r","fLNg8Uvlv4","Cfgr3618Di","ni2v1FLsph","FcWrWSs0Zu","K20wKYw2oU","8cVD3Mm8si","Q6LixSmGzv","jeskS8hJdt",
+"AXpwEyEfy9","ECMvUQWxoT","OUqFMIn3NS","ECMvUZzJHW","uPX7Ga00b5","VNCPdeuZA5","NOHsz1LB1L","PYBf4lweGy","P6bcgkZANm","guMb8VerEA",
+"ogLgc3weIF","yvOMI2ZHdk","Mm8siReKEW","CK5W73weIF","0Wr5yv2eC3","BFkb88xEKz","dhSuH0ao3l","FFDuilkMUA","X6Pin2hEEU","BFkb8sx5Gl",
+"EOE1olpF6W","aez9yyToGW","2NslmJJs5m","zbIYYSWfou","ru4UGF6PT2","TwanofmIK1","aFFssRBhp0","M6qcGfcJOy","fqypyfmIK1","Ss0Zuuvf7A",
+"QworuJKWYR","FNYIMogLgc","rz7Ut7fKYU","Ss0ZufcwDa","k85AexXTI4","nnP8obgJAz","Cp3mZlH1kt","AIYUuCqqaD","gtCA5dhSuH","7X3uyD6rBy",
+"LDk6fXflUq","FPfSEHP433","580YDF6PT2","55rfBjeskS","DG4sTFNYIM","vkCHH0h1b1","gIYvEOUqFM","yluBxZ4I1v","fcwDa45cIH","taOXKX6Pin",
+"64s8N14FLR","pT8wu0BmCy","Uvlv4pv0i7","bZLvSgf8rI","i3pydpv0i7","blLA9gIYvE","8xEKzC2Irc","FxX9q5IhmG","CqqaDMezSW","i7WMQpmeCd",
+"lH1ktfmIK1","VBjhzRpBQm","7Ow5CQ6hMC","2ZHdkMojnP","OUqFMC2Irc","v8yFNQssNC","fqypy45cIH","v8yFNni2v1","blLA9C2Irc","piJSkvOqCE",
+"d85a9QYxC0","YjB9thYBCK","7lUXZtl72W","DcpWBv2eC3","cL0aEpmeCd","BFkb8djsrv","s93Ml0YAGH","oVQp6AXpwE","QWxoTEdBKc","OUYuFh1zcH",
+"G1RhSvLsmS","ZhwG1JJs5m","wiHrZkB5nP","ECMvUQssNC","Ul4a1KASQ8","BFkb85iGN5","FxX9qM3zXL","l83UdI7p2a","MmKGJZuDtD","hUTw7UlU3M",
+"WmadAO3iyQ","b29RJ5Mg9r","uoStw0Wr5y","2ZHdkVjCZq","djsrv9XyT9","zY1GYk85Ae","BCxeCMkgy8","CK5W7fcwDa","kZANmjfREu","qQxHPBbwgA",
+"n1pmOGWqqX","Y1mC0taOXK","K4GS8OUqFM","HfyNQFjHXR","ZJTXHGv3Fq","qUJMd5Mg9r","WDVWJ0BmCy","SWfouiwzGk","piJSkix74r","4QMc9v8yFN",
+"ix74r7ku1p","vLsmSFnPFB","iqv4k9XyT9","UmaEvtuDyS","ni2v116lHc","SjskQThjNn","s93MlGWqqX","nlaByMmKGJ","hi5X7Cp3mZ","uN6r38xEKz",
+"n8pJ90YAGH","hSSvQChuy3","Cfgr3PYBf4","yvOMIPb1pa","NAFuwFLsph","KZamHuupzk","mz8gx1LB1L","QChxs8xEKz","pv0i7fmIK1","EoToPVIlwP",
+"atef2uoStw","hYBCKlH1kt","RzaZAprNT6","uAWypIBe8k","M3zXLpvgjS","h1zcHaFFss","RBhp0uAWyp","n1pmOSWfou","Zv7z0Cfgr3","GWqqXOz8yZ",
+"MezSWJRJQB","RsQUqWMiS3","MezSWEoToP","mX2GEiB08l","cmXIXtjQxs","IRh48LDk6f","s93Ml5ZaEz","wDajXQssNC","BGaQYDcpWB","jtn0XjS1aj",
+"JkzUnEOE1o","HzZT8MmKGJ","B3qemzbIYY","UmaEvJJs5m","K4GS8POUYS","IRh485Drn0","4dEz6cQOnv","GXdoHqaofN","ReKEWQworu","pvgjS0Wr5y",
+"K20wKtaOXK","cQOnvMK07Y","Oz8yZKZamH","yvOMIMaJQs","iqv4kGSQwj","3otm67fKYU","0Kyfs7lUXZ","0ao3l2TRI7","24ARFuPX7G","9rlg9FGzgp",
+"MaJQsMaJQs","Z4I1vS77LH","WaWsvsuY4x","aDGtS5IhmG","Z4I1v0Kyfs","jiVBPtAOsr","Zv7z0VBjhz","RBhp0uLtKs","iwzGkzY1GY","VIlwPWDVWJ",
+"dQ586Mkgy8","5ZaEzAIYUu","uAWypP6bcg","zbIYY0ao3l","IRh48Chuy3","hE1Ql7Ow5C","CxVEfydG8U","cL0aE2hEEU","ru4UGWmadA","s4786brhlQ",
+"7Ow5CCdyBV","hYBCK1v5hH","2DREsG1RhS","ksJbyLewvM","GWqqX2Nslm","POUYSSWfou","64s8N2Yz7E","zQt6QS77LH","bgJAzaDGtS","WaWsvnFqik",
+"UmaEvhi5X7","brhlQY1mC0","jtn0X9iGoT","24ARFG1RhS","HRxd82hEEU","0KyfskZANm","Yw2oUMkgy8","rz7UtJkzUn","piJSkv1Hln","NcICALbRTH",
+"rhl0JVerEA","tlILtBbwgA","ZUnqtAkKTk","WPmlxMaJQs","fqypyQClRL","AOgEeuN6r3","d7vjMK20wK","9y4lwQClRL","TCgPpI7p2a","WmadA5iGN5",
+"xReecG1RhS","FPfSEjeskS","ThjNnLbRTH","WaWsvpAhR1","WPmlxh1zcH","HfyNQhe9IA","FwEJzyofH3","S77LHC2Irc","580YDiqv4k","jzUqRFxX9q",
+"In3NSECMvU","qaofN5nmWv","OHaBzlViBv","QClRLQ6Lix","5Mg9rdjsrv","vkCHH2hEEU","S77LHIjTwP","o8UydZv7z0","t98iWjS1aj","FwEJzeuZA5",
+"fmIK1BpYhV","mz8gxfmIK1","Gv3FqY1mC0","AXpwEFFDui","Q6hMC0YAGH","7hyVvM3zXL","StlDJMK07Y","lj07Q8cVD3","6AFT0IjTwP","s93MlUlU3M",
+"CqqaDazIWp","SWfoudQ586","BbwgAWPmlx","FwEJz4W0Tl","5VZjSwiHrZ","F6PT2FVMxo","KZamHi3pyd","OHaBzWreyP","ogLgcRmDcr","RkQkeRBhp0",
+"pAhR1v1Hln","O3iyQhE1Ql","zbIYYWaWsv","tjQxsHzZT8","0YAGHni2v1","azIWppv0i7","lCMxyZUnqt","HRxd8PYBf4","JRJQBjSjS3","OUqFMFcWrW",
+"Z4I1vm4bxU","tAOsroGu6x","LewvMxciqp","55rfBFVMxo","FGzgpuupzk","0MR5XGrDg7","I7p2ao8Uyd","yvOMIDQimp","AXpwEBpYhV","dpe1v29QAz",
+"HzZT8QWxoT","GrDg7zqH0W","Waim6FNYIM","1v5hH5nmWv","XyPZN5nmWv","JRJQBEoToP","WMiS3VIlwP","SWfouD6rBy","lj07Q7hyVv","nlaByFVMxo",
+"n8pJ9h1zcH","AOgEeCK5W7","Cp3mZIRh48","TCgPphe9IA","RmDcriwzGk","SjskQI7p2a","Ta8f6okgRi","In3NS8xEKz","zz4ZU55rfB","PYBf48xEKz",
+"No0QbDcpWB","JRJQBaFFss","IjTwPjeskS","yofH3e6e4z","xciqpLewvM","zFgtBpvgjS","rhl0JbgJAz","uJScXvkCHH","uN6r3Fhtgl","5NammqQxHP",
+"AIYUuiwzGk","jiVBPGWqqX","iqv4kXyPZN","0PktIJJs5m","WreyPNo0Qb","9XyT9Q6Lix","rz7UtEOE1o","Gv3FqCNHmv","DQimpprNT6","sx5GlEoToP",
+"EdBKcazIWp","2NslmkZANm","MmsIoCfgr3","rz7Uty94nw","uvf7AOHaBz","8TxD7he9IA","AIYUusx5Gl","CK5W73otm6","Y1mC0KZamH","he9IARsQUq",
+"6q6L9yvOMI","tl72WFNYIM","8hJdtYh1hF","lkMUAFjHXR","hSSvQWaWsv","OHaBzlCMxy","FGzgplweGy","ZhwG1FnPFB","S77LHUmaEv","CxVEfUvlv4",
+"8TxD7atef2","In3NSZJTXH","9y4lwSjskQ","VerEA6q6L9","Gv3FqFxX9q","NhXduYOfrY","qQxHP7X3uy","jeskSAIYUu","TXQ0ZF6PT2","FPfSEjiVBP",
+"QWxoT8TxD7","uupzkAIYUu","FPfSENo0Qb","Y1mC0prNT6","uZPqgv8yFN","RACuj5iGN5","v2eC3HzZT8","7Ow5CCNHmv","2TRI75iGN5","rhl0JYw2oU",
+"WmadAuN6r3","BpYhVC2Irc","uQIczgjUTu","s7MxkqUJMd","UlU3MvLsmS","5Namm7hyVv","48cHLNcICA","FGzgplj07Q","FLsphaL6AJ","ydG8UNo0Qb",
+"aez9yBbwgA","64s8NydG8U","s7MxkpAhR1","YjB9tHRxd8","Pb1patuDyS","0KyfsMezSW","DcpWBuN6r3","cShY2Cfgr3","azIWpG1RhS","Oz8yZiKqhr",
+"C2Irc4dEz6","uoStwCdyBV","0Wr5yguMb8","Yw2oUJIqXi","In3NSv8yFN","FPfSEblLA9","X6PinCxVEf","pAhR1pvgjS","48cHLogLgc","ulk41blLA9",
+"NhXdu29QAz","bgJAzjeskS","9GXkXe6e4z","v1HlnVerEA","45cIHAOgEe","qUJMdSs0Zu","FwEJzbgJAz","s93Ml5Mg9r","UlU3MZUnqt","EdBKcyToGW",
+"pmeCdhE1Ql","BbwgAsx5Gl","EoToP9y4lw","5IhmGfFDrJ","618DiQYxC0","i7WMQRpBQm","JRJQB55rfB","L7cGcTa8f6","y94nwJ2mQi","guMb88RCUA",
+"8cVD3Y1mC0","NcICA5VZjS","AIYUuDz1R3","580YD618Di","2Yz7EhSSvQ","Yw2oU6q6L9","fqypyNxx9V","dQ586rhl0J","S77LHsuY4x","EOE1oRkQke",
+"B3qemaFFss","ni2v1FNYIM","zqH0WfcwDa","5VZjS5nmWv","4QMc9qQxHP","pv0i7SmGzv","he9IAzFgtB","lweGyZJTXH","KZamHzQt6Q","dQ586yofH3",
+"suY4x16lHc","qUJMdVprf2","RACujAXpwE","lViBvIn3NS","GrDg7he9IA","dmoS7hUTw7","5ZaEzWDVWJ","yvOMIIjTwP","WDVWJZJTXH","n1pmOiB08l",
+"VLTy6vkCHH","7Ow5C9XyT9","WmadAMK07Y","pmeCdhYBCK","UlU3MMmsIo","JRJQBP6bcg","LDk6faL6AJ","djsrvhi5X7","mz8gxOHaBz","gjUTu8FmFH",
+"zHF1q5ZaEz","xReecNhXdu","ZuDtD618Di","sqVrfWaim6","HRxd82TRI7","5drc6pFrrl","ZJTXHaDGtS","7lUXZuJScX","bgJAzVerEA","zHF1qWDVWJ",
+"7Ow5CGrDg7","vOqCElj07Q","zbIYYfcwDa","QWxoTzFgtB","P6bcgv2eC3","G1RhSuvf7A","fFDrJQChxs","h1zcHD6rBy","xXTI4cL0aE","Yh1hFKsjRK",
+"JJs5muQIcz","MK07YZuDtD","BGaQY2hEEU","FVMxolweGy","dmoS7Zv7z0","s7MxkuZPqg","zHF1qpT8wu","CdyBVlm0pD","i3pydokgRi","OUqFMCIShG",
+"RpBQmVNCPd","7hyVvWaWsv","QbxXculk41","ciuWzpT8wu","C2IrcPb1pa","FNYIMReKEW","v2eC3D6rBy","v2eC3Yf2Ec","RmDcr55rfB","OxWIHAXpwE",
+"0PktIs7Mxk","ZJTXHMm8si","AOgEek85Ae","piJSkVerEA","HfyNQEOE1o","hYBCK2Yz7E","RpBQmtl72W","ksJbyjiVBP","MojnP6q6L9","WDVWJUmaEv",
+"0MR5XYOfrY","jtn0XFjHXR","No0QbRpBQm","uoStwPOUYS","uLtKs7lUXZ","POUYSpAhR1","RBhp0faHir","JIqXi7Ow5C","uLtKs5VZjS","AOgEe2hEEU",
+"W3VFHn1pmO","fcJOy1v5hH","bZLvSEOE1o","jzUqRQChxs","tlILtFnPFB","mX2GEStlDJ","RxrsmIRh48","1j5L8aez9y","FLsphjiVBP","QbxXcSWfou",
+"SmGzvprNT6","HzZT8U3yw5","yvOMIEOE1o","8cVD37ku1p","K4GS8M6qcG","J2mQiP6bcg","P6bcgW3VFH","nnP8o2TRI7","5drc6ZJTXH","MGlTFNhXdu",
+"lsQGoWMiS3","In3NSWmadA","pWiOsGv3Fq","24ARF0h1b1","piJSk5Drn0","VIlwPtlILt","iKqhrW3VFH","Yw2oU2ZHdk","nnP8oMezSW","07n1cVNCPd",
+"pT8wuSjskQ","OxWIHfaHir","wDajXLewvM","QChxsl83Ud","DLhzM0Kyfs","l83UdZzJHW","0ao3lNxx9V","bgJAzcQOnv","FnPFB618Di","EdBKcs93Ml",
+"oGu6xHRxd8","7Ow5ClweGy","FxX9qVBjhz","2TRI7d85a9","BbwgAzqH0W","aFFssydG8U","y94nwk85Ae","JKWYRpAhR1","zz4ZUJXljW","AXpwEaFFss",
+"FFDuiSWfou","ZhwG18xEKz","ciuWzQ6Lix","XflUqdQ586","t98iWQ6Lix","S2DfuGSQwj","ECMvUFFDui","RsQUq2Yz7E","5Mg9roGu6x","K20wKo8Uyd",
+"JRJQB7ku1p","zQt6QDz1R3","h1zcHzbIYY","YOfrYVjCZq","TCgPprhl0J","nlaByHRxd8","LDk6fY1mC0","oVQp6HRxd8","C2IrcydG8U","pvgjSBFkb8",
+"tuDySlViBv","yvOMIaFFss","Ss0ZuhYBCK","29QAzvOqCE","SWfouZJTXH","4W0Tl2hEEU","WreyPjSjS3","Zv7z0cQOnv","JJs5mJRJQB","v8yFNB3qem",
+"P6bcgzbIYY","WMiS37hyVv","v1HlnJkzUn","bZLvSjtn0X","FFDuiy94nw","VNCPdIKxdL","QnJ1SIjTwP","pvgjSMezSW","djsrvzQt6Q","VIlwPKASQ8",
+"CdyBVoVQp6","KASQ8YjB9t","5ZaEzrKDLJ","Yw2oUiB08l","JRJQBGrDg7","MmsIoNo0Qb","zz4ZUNOHsz","Oz8yZfcwDa","x3LDehSSvQ","jfREun8pJ9",
+"VNCPdpFrrl","AIYUu5drc6","FLsphs7Mxk","nlaByfcwDa","atef2CqqaD","No0QbCp3mZ","IRh48CxVEf","jfREuTXQ0Z","AIYUuGv3Fq","oVQp6sx5Gl",
+"sqVrfLDk6f","n1pmODLhzM","FcWrWJKWYR","P6bcgThjNn","GrDg7PYBf4","sx5GltuDyS","55rfBcShY2","uTacx0PktI","xciqppFrrl","MojnPPb1pa",
+"cShY2lj07Q","7fsYMCK5W7","7fsYMhYBCK","fFDrJwiHrZ","lViBvKASQ8","5NammFPfSE","DG4sTEoToP","7lUXZ6AFT0","Z4I1voVQp6","B3qemD6rBy",
+"s93MlSmGzv","B3qemHfyNQ","xReecyEfy9","v2eC3CNHmv","8hJdtAmdQd","soy9tQ6hMC","KsjRK0YAGH","29QAzbrhlQ","aez9yzHF1q","IjTwPfcwDa",
+"ZJTXHXflUq","1LB1LjzUqR","i3pydzQt6Q","2NslmAmdQd","VLTy6OHaBz","9eoRchUTw7","9eoRc8cVD3","WDVWJguMb8","vOqCEDz1R3","nlaBy5IhmG",
+"VNCPdlj07Q","O3iyQhSSvQ","tAOsroQ87r","lXFOBP6bcg","JKWYRFGzgp","Cfgr3CK5W7","FLsphGWqqX","lCMxy1v5hH","TCgPpBbwgA","4W0Tli3pyd",
+"FFDuiSmGzv","uAWypTCgPp","L7cGcd85a9","Waim6U3yw5","M6qcGksJby","AXpwE8cVD3","OUqFM7X3uy","Dz1R3DQimp","CK5W7lkMUA","lViBvsx5Gl",
+"2Yz7EKsjRK","KASQ8Y1mC0","K20wKMkgy8","y94nwQ6hMC","uQIczuZPqg","xXTI4zHF1q","7hyVvru4UG","FGzgpRACuj","lXFOBCK5W7","uLtKsD6rBy",
+"5Drn0JXljW","ThjNnZhwG1","580YDksJby","8xEKznnP8o","pWiOs2TRI7","l83UdJkzUn","Pb1pa8cVD3","KsjRKpiJSk","Q6LixAIYUu","9rlg9y94nw",
+"K20wKulk41","EoToP9XyT9","OUqFMaez9y","ciuWzkZANm","vkCHHrKDLJ","HfyNQoVQp6","S2Dfudjsrv","IRh48BFkb8","K20wKk85Ae","v8yFNQbxXc",
+"YjB9tlweGy","guMb8hi5X7","ix74rrKDLJ","9rlg9NcICA","lViBv2Nslm","lCMxyRACuj","nnP8oaez9y","7hyVvBCxeC","FLsphQworu","FNYIMatef2",
+"ZJTXHYh1hF","F6PT28TxD7","lCMxyvOqCE","45cIHFGzgp","jtn0XblLA9","NAFuw7lUXZ","uQIczl83Ud","mz8gx0ao3l","UmaEv5drc6","MK07Y5IhmG",
+"pv0i7nFqik","SmGzvNOHsz","5VZjSEdBKc","ru4UGTCgPp","pmeCdhUTw7","taOXKQ6Lix","s4786fmIK1","WMiS3RACuj","uLtKsDLhzM","vLsmSyEfy9",
+"tAOsrdQ586","TCgPpCp3mZ","S77LH5IhmG","fcwDa1j5L8","0PktIxXTI4","xReecm4bxU","0h1b1qaofN","fFDrJNOHsz","MmKGJfqypy","kZANmgdQsS",
+"HlUbF3otm6","i7WMQn8pJ9","Yh1hF4QMc9","uZPqgIn3NS","7Ow5Ck85Ae","y94nwhE1Ql","hE1QlazIWp","ni2v1StlDJ","Oz8yZi7WMQ","5iGN5O3iyQ",
+"zqH0W2TRI7","TwanofFDrJ","cmXIXBCxeC","cmXIX24ARF","zFgtBrhl0J","zY1GYD6rBy","Oz8yZThjNn","VLTy6TCgPp","QYxC0ZhwG1","QworuQ6hMC",
+"b29RJJRJQB","ksJbyUvlv4","0ao3lzFgtB","FVMxo0ao3l","IKxdL64s8N","Yf2EcAgJHQ","dQ586dmoS7","VjCZqSbRYy","ogLgczHF1q","KZamHCfgr3",
+"lViBv7fsYM","xciqp0Kyfs","yEfy9ZuDtD","s7Mxk9rlg9","1LB1LOxWIH","5nmWv7lUXZ","d85a9dpe1v","soy9tbZLvS","ogLgc7lUXZ","K20wKpvgjS",
+"he9IA0BmCy","ogLgc4W0Tl","X6PinuQIcz","BGaQY29QAz","DG4sT8FmFH","IKxdLCIShG","nFqikNhXdu","fqypylpF6W","29QAz2TRI7","580YDlj07Q",
+"iKqhrh1zcH","1v5hHxXTI4","wDajXIKxdL","CqqaDfmIK1","dpe1vcmXIX","OUYuFaFFss","4dEz6VBjhz","RkQkeZuDtD","AkKTkhSSvQ","CNHmvMojnP",
+"1LB1LC2Irc","Yw2oUs93Ml","SbRYyI7p2a","tAOsriB08l","Ss0ZuVjCZq","soy9tuN6r3","lH1ktjS1aj","gdQsSRACuj","CdyBVulk41","In3NSEoToP",
+"GSQwjS2Dfu","ulk41No0Qb","ogLgcgIYvE","1v5hHTXQ0Z","OUYuFW7cTs","55rfBs93Ml","ru4UGUl4a1","45cIH5nmWv","lH1ktkZANm","vLsmSnnP8o",
+"WaWsvCfgr3","POUYS7lUXZ","K4GS8ulk41","AmdQdcL0aE","OUqFMHP433","0BmCyuoStw","gtCA5guMb8","zmLYDhe9IA","5IhmGTCgPp","JKWYRPOUYS",
+"Uvlv4l83Ud","ydG8UjzUqR","8TxD7hYBCK","qQxHPK4GS8","UmaEvZv7z0","s4786lCMxy","2TRI7zqH0W","7lUXZ5iGN5","ZJTXHCp3mZ","v8yFN0BmCy",
+"pT8wuBpYhV","Cp3mZMezSW","5ZaEzKsjRK","zz4ZUoQ87r","RBhp0F6PT2","StlDJd85a9","Vprf2S2Dfu","iKqhrd85a9","MezSWlViBv","9iGoTBFkb8",
+"bgJAzJRJQB","X6Pin7fsYM","n1pmOFwEJz","XflUqhe9IA","ogLgcgf8rI","FhtglRsQUq","uN6r3soy9t","tlILttAOsr","Z4I1vlH1kt","ThjNnS2Dfu",
+"07n1czFgtB","l83UdX6Pin","hUTw7OUYuF","Oz8yZXflUq","U3yw57Ow5C","CIShGcQOnv","uQIczsuY4x","Pb1papWiOs","AXpwE9XyT9","nFqikBpYhV",
+"7fsYMJKWYR","IjTwPAOgEe","CNHmvb29RJ","aDGtSjtn0X","rKDLJoVQp6","G1RhSfLNg8","Yw2oUMojnP","IBe8kW3VFH","IKxdLpWiOs","2Yz7EMaJQs",
+"8TxD7RmDcr","k85Ae8cVD3","24ARFChuy3","cShY2gjUTu","BFkb87hyVv","Yh1hFCNHmv","ksJby14FLR","Chuy3fcwDa","faHirNcICA","VjCZq8xEKz",
+"KsjRKkZANm","2hEEUfFDrJ","tvdkDfcJOy","3otm6tl72W","NhXdus4786","i3pydHfyNQ","b29RJK4GS8","G1RhSL7cGc","FLsphZ4I1v","P6bcgpAhR1",
+"8cVD3AXpwE","AkKTkM6qcG","BbwgAF6PT2","9XyT9FjHXR","zmLYDjS1aj","CK5W7HlUbF","JkzUnJJs5m","VNCPdlm0pD","5Nammi7WMQ","4QMc91LB1L",
+"DG4sTlm0pD","oGu6xoQ87r","RpBQmv8yFN","GSQwj29QAz","brhlQZ4I1v","45cIHDz1R3","jiVBPZUnqt","TwanoVerEA","JXljW14FLR","W3VFHpmeCd",
+"ydG8UdhSuH","uN6r3uJScX","VIlwP0ao3l","MaJQsKr8ys","8hJdtRxrsm","tuDyS0YAGH","vLsmStl72W","s4786y94nw","29QAzWaWsv","HP433QnJ1S",
+"S2DfuFLsph","s93MlCK5W7","zqH0WYf2Ec","9XyT9xXTI4","he9IAbrhlQ","vLsmSRmDcr","jfREuECMvU","Mm8siMK07Y","8cVD3lpF6W","DQimpYf2Ec",
+"gIYvEKsjRK","zqH0WD6rBy","cQOnv8FmFH","zmLYDEoToP","WMiS3TXQ0Z","dQ586atef2","0PktIm4bxU","In3NSFcWrW","29QAzMK07Y","s47862DREs",
+"14FLRzFgtB","vOqCEP6bcg","LDk6fpWiOs","IRh487hyVv","W7cTs2hEEU","e6e4zhi5X7","24ARF2TRI7","guMb8v2eC3","SjskQ8FmFH","4W0TlM6qcG",
+"yluBxv8yFN","SmGzvdpe1v","brhlQiwzGk","ReKEWqUJMd","IBe8kuvf7A","JkzUnjeskS","RmDcrh1zcH","KASQ8Gv3Fq","7ku1pCfgr3","lsQGo1LB1L",
+"lm0pDFxX9q","LDk6fLbRTH","CIShGEdBKc","07n1c7ku1p","gjUTuOUYuF","CqqaDdQ586","fmIK11LB1L","iqv4kQbxXc","cQOnvCqqaD","uJScXAgJHQ",
+"ZhwG1uAWyp","Waim6jeskS","6q6L94W0Tl","AkKTk2DREs","LewvMMmKGJ","RBhp0StlDJ","cmXIXS2Dfu","HRxd8Fhtgl","FjHXRTXQ0Z","pmeCdaez9y",
+"FnPFBBFkb8","F6PT27Ow5C","JkzUnksJby","OHaBz1LB1L","7hyVvblLA9","QChxsxReec","xciqprhl0J","ogLgcJIqXi","JXljWbrhlQ","WDVWJyvOMI",
+"WreyPM6qcG","a00b5mX2GE","fFDrJ0MR5X","ZuDtDWMiS3","zHF1quPX7G","Ul4a1zz4ZU","jtn0XReKEW","W7cTsMojnP","XflUqB3qem","JJs5m6AFT0",
+"3otm6JkzUn","TCgPppvgjS","uN6r3Oz8yZ","uTacxQ6hMC","QbxXc3otm6","RsQUqt98iW","uupzkh1zcH","Gv3FqhYBCK","yToGWqQxHP","4QMc9azIWp",
+"580YD0MR5X","CqqaDMm8si","jiVBPAkKTk","SmGzvDcpWB","Y1mC0X6Pin","ReKEWbrhlQ","taOXKfcJOy","5NammCdyBV","BpYhVbgJAz","oVQp6Vprf2",
+"d85a9VIlwP","7fKYUMmsIo","RBhp0v2eC3","L7cGctjQxs","3otm6v1Hln","cL0aEb29RJ","FFDuiJRJQB","VerEA1v5hH","OxWIHMojnP","SWfout59lR",
+"wiHrZhSSvQ","vLsmSvLsmS","hi5X7lXFOB","Cfgr3QbxXc","oVQp6U3yw5","55rfBFnPFB","GSQwjd7vjM","F6PT2FGzgp","aez9y7fKYU","ciuWz5nmWv",
+"8TxD72ZHdk","VLTy6MezSW","BFkb8taOXK","AXpwECK5W7","Ul4a1QssNC","lViBvuAWyp","Zv7z0iwzGk","wiHrZgIYvE","MezSWxReec","07n1cUlU3M",
+"sqVrfVLTy6","Vprf2pvgjS","IRh48No0Qb","BCxeCciuWz","HfyNQfmIK1","Mkgy8iKqhr","azIWpBCxeC","No0QbTCgPp","KsjRKeuZA5","TXQ0Z1v5hH",
+"KZamHQWxoT","o8UydOz8yZ","Rxrsm2Nslm","LDk6fpFrrl","aFFsslsQGo","cL0aE1LB1L","7X3uyGv3Fq","DcpWBulk41","FnPFBKASQ8","LewvMZhwG1",
+"2DREsWmadA","IBe8kRxrsm","zbIYYmz8gx","iqv4kqQxHP","Yw2oU8TxD7","WreyPn8pJ9","Ul4a1CK5W7","lCMxyAmdQd","ThjNnjeskS","WMiS3rKDLJ",
+"Gv3FqZhwG1","SbRYy48cHL","fmIK1DLhzM","8RCUAVIlwP","FnPFB45cIH","UmaEvNcICA","618Diru4UG","KZamHWmadA","EdBKcFPfSE","WreyPVerEA",
+"UmaEv7ku1p","JJs5mv8yFN","U3yw5taOXK","MezSWlsQGo","Ul4a10PktI","lweGyUl4a1","pFrrlCxVEf","3weIFCdyBV","FcWrWFNYIM","CIShGjS1aj",
+"QWxoToGu6x","DcpWBiB08l","LewvM1v5hH","CIShGPb1pa","UmaEvBGaQY","zY1GYwDajX","IBe8kgIYvE","cShY2pAhR1","aL6AJGWqqX","14FLRW3VFH",
+"FFDuiblLA9","lj07QAIYUu","LewvMtl72W","jtn0XlpF6W","BCxeCzQt6Q","4QMc99eoRc","7lUXZB3qem","CNHmvogLgc","x3LDe0BmCy","lweGyKASQ8",
+"QbxXcNo0Qb","6q6L945cIH","JkzUnC2Irc","7hyVvyluBx","dpe1vlsQGo","v1HlnSbRYy","U3yw5VIlwP","lCMxyksJby","vLsmSo8Uyd","ciuWzP6bcg",
+"0ao3l5Namm","uvf7AsuY4x","m4bxUnFqik","hSSvQogLgc","a00b5WreyP","aFFssdQ586","AmdQdpWiOs","45cIHPb1pa","xReecCIShG","5Drn04W0Tl",
+"UlU3M9eoRc","tlILtPYBf4","9iGoTiKqhr","zmLYDzHF1q","s93MlBpYhV","uvf7AECMvU","BGaQYjiVBP","qaofN5Namm","dhSuHVBjhz","bZLvSYf2Ec",
+"Mm8siVprf2","NhXduJXljW","P6bcgMK07Y","uJScX9iGoT","soy9tzz4ZU","ydG8URkQke","uAWypoQ87r","ReKEWtvdkD","07n1cD6rBy","gIYvEuJScX",
+"8cVD3GrDg7","S77LHaez9y","W3VFHJKWYR","s7MxkMm8si","YOfrYOUYuF","m4bxUbgJAz","oGu6xDz1R3","Pb1pahYBCK","y94nwMkgy8","GXdoH8U2nU",
+"Gv3FqtuDyS","W7cTswiHrZ","6AFT05Namm","29QAz4W0Tl","OUqFMXyPZN","8U2nUlj07Q","MmKGJ8FmFH","lweGyC2Irc","v2eC3Kr8ys","IKxdLuAWyp",
+"nFqikgf8rI","wiHrZa00b5","4W0TlMojnP","LbRTH5Drn0","Y1mC0IRh48","55rfB0h1b1","he9IAzY1GY","SWfouHRxd8","AkKTkBGaQY","HzZT829QAz",
+"lViBvThjNn","VNCPdv8yFN","uN6r3MmKGJ","F6PT2qQxHP","gdQsSDLhzM","uoStw9rlg9","wDajXjSjS3","qaofNogLgc","0BmCycL0aE","LDk6fNo0Qb",
+"fcJOyPb1pa","fcwDacShY2","vkCHHK4GS8","FwEJzhSSvQ","wiHrZAkKTk","brhlQL7cGc","JIqXisx5Gl","Ul4a1yvOMI","HzZT8CIShG","uPX7GFcWrW",
+"D6rByYh1hF","2DREstaOXK","5VZjSQnJ1S","Mm8si1v5hH","lkMUAYw2oU","WreyP3weIF","No0Qbrhl0J","Q6hMCBFkb8","cmXIXiwzGk","Yf2EcnFqik",
+"AXpwEcL0aE","wiHrZF6PT2","LDk6fM6qcG","jS1ajcmXIX","2Yz7EHP433","pWiOslj07Q","okgRi0YAGH","wiHrZaDGtS","gtCA5sqVrf","5drc64QMc9",
+"0PktI5Namm","pvgjSjzUqR","Nxx9VAmdQd","HfyNQo8Uyd","KASQ8blLA9","MmKGJUl4a1","4QMc9UmaEv","EdBKc5drc6","bZLvSAgJHQ","aDGtSW3VFH",
+"XyPZNNhXdu","Q6LixW7cTs","rhl0JXyPZN","StlDJ5Mg9r","suY4xFnPFB","F6PT2QbxXc","kB5nPThjNn","rhl0J9rlg9","sx5GlJIqXi","9y4lwPb1pa",
+"zFgtB9GXkX","FnPFB5VZjS","VNCPdpv0i7","WmadAHP433","x3LDeokgRi","uLtKsChuy3","uQIczRBhp0","pAhR1lViBv","pAhR1ThjNn","QChxsQChxs",
+"a00b5wDajX","StlDJMm8si","QWxoTVprf2","zbIYY7lUXZ","Mm8siazIWp","lsQGoGSQwj","AgJHQFPfSE","JKWYRpiJSk","StlDJCp3mZ","rKDLJ580YD",
+"uupzkKASQ8","uZPqgEdBKc","Chuy3gtCA5","5NammfcwDa","xReecAOgEe","fLNg8Oz8yZ","RzaZAjfREu","t98iWSWfou","RkQkeO3iyQ","7X3uyjS1aj",
+"ECMvULewvM","jfREuJKWYR","GrDg72DREs","CxVEfoVQp6","ix74rFPfSE","5drc6FxX9q","9iGoTzHF1q","0BmCyjSjS3","JkzUn7hyVv","FxX9qdhSuH",
+"SbRYyMezSW","lj07QFcWrW","CqqaDW3VFH","lkMUA5nmWv","AgJHQQssNC","5NammyEfy9","Qworu5drc6","AOgEefmIK1","P6bcg5Namm","QWxoTJ2mQi",
+"Uvlv4guMb8","Ul4a1Rxrsm","EdBKcGrDg7","aDGtS2hEEU","taOXK0PktI","iqv4kuLtKs","yEfy924ARF","Y1mC0yEfy9","jzUqRxciqp","2TRI7uupzk",
+"0PktIfcwDa","GrDg707n1c","lweGy4QMc9","dpe1vRpBQm","SmGzvmX2GE","LbRTHWMiS3","FLsphv2eC3","yofH3In3NS","y94nwyluBx","Vprf2ogLgc",
+"5nmWvgdQsS","Dz1R3k85Ae","24ARF7Ow5C","rhl0JLbRTH","wiHrZVNCPd","uupzk2TRI7","kZANmMojnP","ZJTXHRBhp0","GXdoHogLgc","8RCUAfmIK1",
+"tvdkDJIqXi","9rlg9i3pyd","fcwDazz4ZU","s7MxkYh1hF","jS1ajjtn0X","PYBf4prNT6","29QAz64s8N","he9IAS77LH","zmLYDVBjhz","HfyNQbZLvS",
+"aFFssW3VFH","ThjNnM6qcG","D6rByGv3Fq","ulk41M6qcG","WMiS3cL0aE","TXQ0ZQClRL","O3iyQQClRL","JKWYRqUJMd","Dz1R3WaWsv","L7cGcatef2",
+"d85a9NAFuw","9GXkXFGzgp","DLhzMM6qcG","lXFOB07n1c","9rlg9b29RJ","XyPZN24ARF","JJs5mm4bxU","29QAzatef2","MojnPguMb8","suY4xOz8yZ",
+"lViBv9y4lw","AIYUuLDk6f","J2mQiAIYUu","DcpWBo8Uyd","he9IABGaQY","lCMxyiqv4k","soy9t0PktI","BGaQY4W0Tl","h1zcHlkMUA","RBhp0rz7Ut",
+"gtCA50ao3l","gtCA55Drn0","TwanogtCA5","RsQUqKr8ys","5IhmGYf2Ec","EdBKcni2v1","ZuDtD0PktI","sx5GlTa8f6","RpBQmo8Uyd","tuDySAkKTk",
+"5iGN5CIShG","BGaQYsqVrf","IjTwPRmDcr","ciuWz9GXkX","FGzgpvkCHH","fmIK15Namm","i3pydVjCZq","MmsIo618Di","8xEKzciuWz","WreyPx3LDe",
+"S77LHpFrrl","FVMxo2TRI7","gf8rIQClRL","X6PinDcpWB","RxrsmS77LH","EdBKc2ZHdk","gIYvEgdQsS","qQxHPNOHsz","uQIczciuWz","K20wK7X3uy",
+"Z4I1vzQt6Q","vLsmSMmsIo","yofH3ZUnqt","yofH31v5hH","FLsphECMvU","FnPFBFhtgl","azIWpguMb8","G1RhSiqv4k","Cp3mZyvOMI","2TRI7Chuy3",
+"okgRi7fKYU","yvOMIUvlv4","5ZaEz7X3uy","O3iyQhe9IA","UmaEvQbxXc","Zv7z0faHir","K4GS8jzUqR","d7vjM0BmCy","b29RJyluBx","IRh483otm6",
+"yvOMI0BmCy","ReKEWQWxoT","jeskSZhwG1","HfyNQTa8f6","0Kyfsn8pJ9","s4786FVMxo","tAOsrRpBQm","ru4UGGWqqX","LewvMpmeCd","7Ow5CiwzGk",
+"6AFT0OHaBz","n8pJ9Ta8f6","lsQGoNAFuw","dhSuH0BmCy","2hEEUXflUq","WMiS35nmWv","6q6L9KsjRK","mX2GEFNYIM","8RCUA5ZaEz","HlUbFMmKGJ",
+"2DREst98iW","v1Hlna00b5","5drc6VNCPd","RxrsmpWiOs","B3qemcQOnv","Mm8siKr8ys","yofH32ZHdk","v8yFNW7cTs","UlU3McQOnv","K4GS8iqv4k",
+"v2eC3guMb8","Waim6Dz1R3","SjskQYf2Ec","bgJAz0BmCy","OHaBzjiVBP","HRxd8TXQ0Z","b29RJPYBf4","piJSkJJs5m","mX2GEcL0aE","FGzgp2DREs",
+"MK07YfcwDa","faHiroQ87r","FcWrW8TxD7","tlILtVerEA","8FmFHiqv4k","OUYuFVjCZq","tlILtMGlTF","24ARFOz8yZ","8FmFHQ6hMC","okgRiFLsph",
+"b29RJ618Di","faHirBCxeC","fFDrJTa8f6","FGzgp8cVD3","nFqik8FmFH","RACujVNCPd","B3qemuLtKs","RpBQmxciqp","gdQsSpiJSk","8RCUA9rlg9",
+"GWqqX1v5hH","l83UdiKqhr","5Mg9rl83Ud","TwanoQ6hMC","K4GS8pv0i7","48cHLyEfy9","i7WMQrKDLJ","IRh48Ta8f6","sx5GlI7p2a","4dEz629QAz",
+"6q6L95IhmG","RACujDcpWB","WmadAStlDJ","Mm8siVNCPd","Ta8f6Fhtgl","RsQUqqQxHP","FnPFBQbxXc","0ao3l2Yz7E","7fsYMKr8ys","3weIF7X3uy",
+"azIWptuDyS","m4bxUazIWp","soy9tVprf2","VLTy6iKqhr","Z4I1vFjHXR","0MR5XNcICA","580YD8hJdt","MaJQsI7p2a","mz8gxfqypy","aL6AJpiJSk",
+"Pb1paDLhzM","7Ow5CU3yw5","uJScXiKqhr","5IhmG45cIH","ru4UG580YD","S77LHoQ87r","RkQkeOxWIH","uJScXlkMUA","0KyfsAXpwE","qUJMdUvlv4",
+"OHaBzYh1hF","ciuWzX6Pin","FwEJzL7cGc","i3pydsuY4x","zFgtBuoStw","QWxoTyluBx","uN6r3Cp3mZ","QWxoTM6qcG","pvgjS16lHc","v2eC3Yw2oU",
+"Gv3FqVBjhz","Y1mC0AgJHQ","3otm6618Di","1LB1Lfqypy","TCgPp7Ow5C","1v5hHVIlwP","CNHmvfcwDa","JRJQBv2eC3","lXFOBulk41","0BmCyy94nw",
+"LewvM9GXkX","rz7Uts4786","7fKYUZzJHW","vkCHHHfyNQ","PYBf4gf8rI","iqv4kt98iW","ulk41s93Ml","v2eC3gtCA5","kB5nPRzaZA","ThjNnUl4a1",
+"0KyfsJXljW","brhlQpAhR1","Waim6gjUTu","WDVWJVIlwP","Chuy3jfREu","b29RJuQIcz","v8yFNFhtgl","Yh1hF5VZjS","cL0aEfcJOy","CK5W7TXQ0Z",
+"OxWIHb29RJ","m4bxUzFgtB","GWqqXAmdQd","o8Uyd0BmCy","t98iWTXQ0Z","NcICA1LB1L","MmsIo580YD","kB5nPECMvU","LbRTHtuDyS","t59lRlm0pD",
+"CqqaDQClRL","cmXIXLewvM","KZamHpWiOs","S2DfuGv3Fq","W3VFHiB08l","vOqCEqaofN","v1Hlnfqypy","iB08laez9y","ThjNnIjTwP","uAWypgdQsS",
+"StlDJtlILt","zmLYDReKEW","9iGoTzY1GY","tAOsrTXQ0Z","JRJQBAIYUu","618Die6e4z","FjHXRzFgtB","aL6AJ9iGoT","FPfSEoVQp6","RACujK20wK",
+"uZPqglj07Q","he9IAlm0pD","gIYvESWfou","HfyNQKsjRK","GrDg7AXpwE","1LB1L48cHL","CdyBVs7Mxk","IjTwPHRxd8","euZA5SbRYy","ulk41jtn0X",
+"HzZT85drc6","RACujTCgPp","a00b5RpBQm","EoToPFFDui","iB08lRkQke","tvdkDUlU3M","MezSWFhtgl","iqv4k7Ow5C","9y4lwNcICA","Zv7z007n1c",
+"v2eC3lH1kt","LbRTH8xEKz","0MR5XgjUTu","WDVWJhYBCK","zmLYDfcwDa","OUYuFnlaBy","BGaQYqQxHP","CxVEfIKxdL","t59lRhSSvQ","ksJbyFPfSE",
+"cL0aEQClRL","6q6L93weIF","RmDcrjzUqR","FFDuisuY4x","gf8rIJRJQB","fLNg87X3uy","PYBf4i7WMQ","Waim67fKYU","xReecMaJQs","S77LHv1Hln",
+"8xEKzlXFOB","0MR5XVjCZq","Yw2oU5IhmG","AXpwEBbwgA","hUTw7MK07Y","5nmWvDLhzM","CIShGIn3NS","kB5nPAmdQd","ix74r5IhmG","ksJbyhUTw7",
+"xciqpnnP8o","9y4lwHfyNQ","2ZHdkVBjhz","Yw2oUwDajX","t98iWcShY2","QworuOz8yZ","Uvlv48TxD7","euZA5StlDJ","VIlwP5nmWv","S2DfuFPfSE",
+"sqVrfXyPZN","W7cTsFFDui","QClRLP6bcg","brhlQRpBQm","Z4I1vjzUqR","oVQp6Yh1hF","zqH0WO3iyQ","RkQke7lUXZ","JIqXizmLYD","S2DfuHRxd8",
+"5VZjSMaJQs","MaJQsMmKGJ","i7WMQCIShG","Cfgr3WMiS3","0Wr5y9eoRc","5nmWvRmDcr","WreyPyofH3","ogLgclsQGo","yvOMI48cHL","uPX7G4QMc9",
+"16lHculk41","2NslmuQIcz","lViBvfcJOy","dhSuHQWxoT","QChxsx3LDe","FGzgpMmsIo","AIYUun8pJ9","Pb1papT8wu","SbRYyWaim6","Twanot98iW",
+"i7WMQECMvU","he9IAFjHXR","0BmCyoGu6x","n1pmOhE1Ql","PYBf4Mkgy8","LbRTHjiVBP","dpe1voGu6x","4W0TlJXljW","FjHXRaL6AJ","K20wKvOqCE",
+"qaofNgjUTu","3otm6AkKTk","M3zXLKASQ8","RBhp02ZHdk","hE1Ql45cIH","pv0i7l83Ud","lweGyi3pyd","Cfgr3pWiOs","lXFOBK4GS8","8U2nUiwzGk",
+"S2DfuWaWsv","pFrrlpFrrl","AXpwEnFqik","qaofN7ku1p","n8pJ9fmIK1","uoStw7X3uy","JKWYRNo0Qb","bZLvSdjsrv","tAOsrcShY2","VerEA4W0Tl",
+"fqypyFcWrW","VNCPdfcJOy","FFDuiogLgc","uJScXix74r","FNYIMh1zcH","2hEEUv1Hln","POUYSOz8yZ","HRxd8MaJQs","TXQ0ZRmDcr","NAFuwS77LH",
+"9XyT9Ul4a1","okgRini2v1","cQOnv9XyT9","Oz8yZZhwG1","pmeCdlH1kt","RmDcrCxVEf","RACujZ4I1v","CNHmviqv4k","KASQ88xEKz","dQ586AXpwE",
+"2ZHdktl72W","qaofNi7WMQ","suY4x618Di","zFgtBDLhzM","ydG8UzHF1q","e6e4zuvf7A","he9IAk85Ae","14FLRB3qem","M3zXL6q6L9","KZamHjiVBP",
+"zY1GYru4UG","ogLgcgjUTu","wiHrZK20wK","v8yFNtl72W","CqqaDnFqik","NAFuwFwEJz","JJs5mrKDLJ","MmKGJgIYvE","XflUqo8Uyd","AmdQd1v5hH",
+"oQ87rKsjRK","UmaEv6AFT0","i7WMQfFDrJ","4dEz6BFkb8","n1pmOUvlv4","Zv7z0mX2GE","5Mg9r9y4lw","C2IrcyvOMI","WmadAt98iW","uAWyp2TRI7",
+"GrDg7I7p2a","iKqhrFFDui","Uvlv4NhXdu","uupzkuLtKs","QChxs8TxD7","aDGtSFVMxo","WmadAuPX7G","TwanouPX7G","ECMvUhUTw7","k85AeFjHXR",
+"Y1mC0t59lR","dmoS7jSjS3","mz8gxQChxs","qUJMdZzJHW","2TRI7d7vjM","RACujQYxC0","FVMxoSmGzv","Rxrsm55rfB","YjB9ttAOsr","lweGyW3VFH",
+"v8yFNt59lR","29QAz2hEEU","MezSW0PktI","y94nwpmeCd","ZzJHWK4GS8","k85AeHRxd8","fLNg8LbRTH","3otm6StlDJ","n1pmO2DREs","MezSWCp3mZ",
+"VjCZqv2eC3","2hEEUtlILt","7fKYU9XyT9","jSjS3hSSvQ","G1RhSfaHir","Q6LixYjB9t","7fsYMKASQ8","o8UydAOgEe","zFgtBgtCA5","pv0i74dEz6",
+"9XyT9qUJMd","POUYSUmaEv","J2mQivOqCE","cQOnv2Yz7E","uupzkhSSvQ","618Dib29RJ","LDk6f5VZjS","Yf2EcuAWyp","ulk41lj07Q","GXdoH7X3uy",
+"5nmWvuvf7A","YOfrY8RCUA","vLsmSmX2GE","2TRI7CdyBV","jeskSFcWrW","fcwDaLDk6f","55rfBQbxXc","nnP8opFrrl","jSjS36AFT0","vOqCE8xEKz",
+"Vprf28cVD3","ZhwG1DG4sT","Kr8ysrKDLJ","TXQ0ZnFqik","azIWpKZamH","8TxD7mX2GE","VerEAS2Dfu","ogLgcCIShG","MGlTFh1zcH","CxVEfyEfy9",
+"RpBQmkZANm","okgRiQYxC0","SWfouCp3mZ","uPX7Gfqypy","ZuDtDJKWYR","29QAzzqH0W","ZJTXHFFDui","o8UydvkCHH","5drc6NAFuw","uoStw8FmFH",
+"v2eC3v8yFN","v8yFNydG8U","WaWsvtaOXK","X6Pin07n1c","fcwDaPb1pa","gf8rIgf8rI","Cp3mZhe9IA","2DREsI7p2a","8RCUAUl4a1","DLhzMIRh48",
+"7lUXZpAhR1","WreyPfaHir","MGlTFOHaBz","BbwgANo0Qb","Yf2Ec1j5L8","hUTw7580YD","fcwDa4QMc9","HfyNQ9rlg9","s7Mxk8xEKz","WmadAJkzUn",
+"MaJQsrhl0J","zFgtBEOE1o","n1pmOfcJOy","Q6hMCt59lR","NAFuw5ZaEz","QYxC0YOfrY","CdyBVO3iyQ","P6bcgOz8yZ","NOHszn8pJ9","45cIHMaJQs",
+"hYBCK5iGN5","pWiOsOxWIH","uQIczW3VFH","Mm8siLewvM","3otm6VBjhz","lweGyzbIYY","aez9yzQt6Q","jSjS3rhl0J","cShY2yToGW","KZamH0PktI",
+"1LB1LVNCPd","48cHLyofH3","xReecoQ87r","2TRI7dhSuH","blLA9ulk41","QnJ1SNxx9V","vOqCEHlUbF","QClRLoQ87r","CIShGZhwG1","uZPqgpiJSk",
+"o8Uydy94nw","QWxoTZJTXH","BFkb87lUXZ","jS1ajn8pJ9","Pb1payEfy9","Ul4a10ao3l","BFkb8uN6r3","Gv3FqiB08l","prNT6YjB9t","hYBCKcQOnv",
+"9y4lwtjQxs","euZA5lm0pD","FcWrWjfREu","Z4I1vEOE1o","OHaBzrhl0J","8FmFHtuDyS","xReecS2Dfu","OxWIHjzUqR","ksJbyBpYhV","gIYvE5Drn0",
+"ru4UGHlUbF","v1HlnlXFOB","F6PT2BGaQY","lViBvt98iW","cShY2O3iyQ","7fsYMzY1GY","zFgtB3weIF","uZPqgM3zXL","s4786Gv3Fq","qQxHPlpF6W",
+"azIWpXflUq","gf8rINxx9V","K4GS8dmoS7","NAFuw8U2nU","Q6hMCni2v1","5Drn0m4bxU","7X3uyrz7Ut","piJSkt98iW","zY1GY2ZHdk","bZLvSCqqaD",
+"ZzJHWjzUqR","CdyBVCxVEf","HfyNQNAFuw","5Namm5drc6","CqqaDVjCZq","HzZT8uoStw","uJScXPOUYS","G1RhSWMiS3","lj07QIjTwP","fcwDayToGW",
+"DG4sTpAhR1","Chuy3AgJHQ","LbRTHLbRTH","kZANmBCxeC","FhtglVLTy6","6AFT0Yf2Ec","fcwDaS2Dfu","hYBCKEdBKc","VNCPdpvgjS","7lUXZoGu6x",
+"RBhp0Rxrsm","7Ow5CCfgr3","8hJdtqQxHP","Q6Lix8FmFH","cQOnvRpBQm","9iGoTi7WMQ","WMiS3jiVBP","BGaQYTa8f6","QssNCbrhlQ","VBjhzW7cTs",
+"DQimpiwzGk","pv0i7B3qem","v1HlnEOE1o","ru4UGFLsph","RsQUqJXljW","rhl0JuoStw","No0QbUmaEv","cQOnvtvdkD","n8pJ9vkCHH","AmdQdS77LH",
+"uvf7A2Yz7E","uTacx5Namm","MezSWRkQke","CNHmvMaJQs","v2eC37fsYM","VjCZqWPmlx","FnPFBWMiS3","OUYuFatef2","FPfSEQClRL","nFqik0h1b1",
+"okgRiCqqaD","Gv3Fq2Nslm","zbIYYtvdkD","t59lRWaim6","pmeCdciuWz","S2DfutjQxs","HlUbFMm8si","hi5X7ulk41","8TxD7ciuWz","qaofNa00b5",
+"BFkb8AXpwE","lj07QTCgPp","WPmlxSbRYy","dQ586mX2GE","Y1mC0ciuWz","tAOsrGWqqX","ulk41suY4x","blLA9P6bcg","ciuWzMK07Y","NcICAfcJOy",
+"SbRYyRACuj","AkKTkVjCZq","t98iWtvdkD","aDGtSWmadA","DcpWBZhwG1","zbIYYjzUqR","ydG8U1j5L8","UmaEvyofH3","uN6r3atef2","gjUTu7fKYU",
+"8FmFHuJScX","JIqXiRkQke","JKWYRuvf7A","djsrv9iGoT","ru4UGnFqik","Waim6Pb1pa","CdyBVzmLYD","taOXKcQOnv","2Yz7ETa8f6","JRJQBrKDLJ",
+"brhlQHzZT8","fmIK145cIH","LbRTHsuY4x","yofH3JXljW","t98iWyvOMI","taOXKzFgtB","JKWYR7ku1p","uoStwZhwG1","n1pmO9rlg9","7lUXZRsQUq",
+"SbRYyydG8U","S77LHZUnqt","SmGzvoVQp6","jeskSt59lR","xXTI4pmeCd","4QMc9uTacx","GXdoHlkMUA","zz4ZUI7p2a","0PktIG1RhS","kZANmfLNg8",
+"cmXIX7lUXZ","9y4lwCp3mZ","jzUqRaFFss","VNCPdcQOnv","GrDg7VIlwP","6AFT0rKDLJ","ZUnqtuTacx","M6qcGxXTI4","YjB9tCfgr3","ciuWz4W0Tl",
+"5IhmGJJs5m","I7p2a0PktI","Dz1R3yEfy9","aez9yK4GS8","rz7Uta00b5","4dEz6Waim6","pWiOs7fKYU","TwanoDz1R3","AgJHQMmsIo","VIlwPRkQke",
+"ru4UGQworu","F6PT2ix74r","ni2v1AkKTk","XflUqCK5W7","2hEEUix74r","W7cTsRACuj","i7WMQtvdkD","zQt6QWreyP","5drc6HP433","ZUnqtYjB9t",
+"Y1mC0VjCZq","7X3uy4QMc9","brhlQ2TRI7","TwanoXyPZN","WaWsvWmadA","zmLYD5Mg9r","v1Hlni7WMQ","lj07QlpF6W","uTacxgtCA5","8TxD77Ow5C",
+"xXTI4iKqhr","K20wKYjB9t","sqVrfjiVBP","IKxdLpvgjS","BpYhVHzZT8","n1pmOlj07Q","HfyNQMojnP","C2Irc55rfB","oGu6x5VZjS","brhlQru4UG",
+"FwEJzlm0pD","BbwgAjeskS","b29RJRBhp0","2ZHdkaL6AJ","uvf7Av2eC3","UlU3MzqH0W","MGlTFWmadA","ydG8UWmadA","BpYhVm4bxU","RmDcrOUqFM",
+"5Mg9rNxx9V","nlaBy5VZjS","JJs5m580YD","DG4sTbrhlQ","hi5X7EoToP","QClRL8xEKz","618DilsQGo","Pb1paD6rBy","Ul4a1SbRYy","RsQUq7ku1p",
+"oQ87rlViBv","KsjRKMGlTF","0Wr5yRkQke","taOXKtvdkD","gf8rIQYxC0","kZANmMK07Y","Q6LixuLtKs","VNCPdvOqCE","AOgEejSjS3","vLsmS2ZHdk",
+"xciqpt98iW","VNCPdZv7z0","OxWIHZJTXH","M3zXL64s8N","24ARFMK07Y","WPmlxC2Irc","5drc6Oz8yZ","bZLvS0MR5X","Yh1hFJRJQB","s7Mxk7fKYU",
+"rhl0JwiHrZ","k85AegjUTu","gjUTuHfyNQ","FcWrW7ku1p","8FmFHQworu","5nmWvHzZT8","7hyVviwzGk","aFFssmX2GE","d7vjM9rlg9","2DREsuLtKs",
+"IRh48yofH3","IBe8kGSQwj","GXdoHjiVBP","5Nammuvf7A","BGaQYjtn0X","Yw2oU8RCUA","2TRI7vkCHH","tjQxsk85Ae","tjQxsCp3mZ","IjTwPJXljW",
+"48cHLFLsph","b29RJ16lHc","JRJQBs4786","KZamHAmdQd","YOfrYJIqXi","ZzJHWWDVWJ","EdBKcKr8ys","QClRLCIShG","X6PinAgJHQ","y94nwG1RhS",
+"FNYIM2ZHdk","gdQsSFGzgp","jeskS618Di","OxWIHKsjRK","mX2GEHRxd8","5NammdmoS7","nnP8oFxX9q","tuDyS7lUXZ","prNT6e6e4z","tlILt1LB1L",
+"No0Qbn1pmO","mX2GEFjHXR","8TxD7U3yw5","Pb1pasuY4x","2Yz7E0Wr5y","7fsYM45cIH","kB5nPxXTI4","rhl0J1v5hH","lm0pD8U2nU","yEfy9SjskQ",
+"LbRTHRsQUq","NcICAtAOsr","VerEARzaZA","RBhp0FLsph","ogLgcuZPqg","FnPFByEfy9","WPmlxjSjS3","cmXIXPOUYS","zHF1qCIShG","s7Mxk5IhmG",
+"wDajXqUJMd","hE1QlFcWrW","WmadAfcwDa","oQ87rZhwG1","yluBxLbRTH","s4786pFrrl","gjUTuxXTI4","S77LHlH1kt","Twanorhl0J","OxWIHIn3NS",
+"XyPZNjS1aj","cmXIXqQxHP","zmLYDe6e4z","KASQ8aL6AJ","Kr8ysjtn0X","IBe8ke6e4z","pT8wuOHaBz","jtn0XpmeCd","X6PinFPfSE","LewvMnFqik",
+"gjUTuL7cGc","uupzk0MR5X","ix74ryofH3","ReKEWTXQ0Z","d85a9Oz8yZ","QnJ1SSjskQ","9eoRcZuDtD","ZuDtDTCgPp","TwanoNOHsz","XflUqFNYIM",
+"YjB9tBCxeC","QWxoTatef2","suY4xFNYIM","FNYIM9eoRc","0Kyfs2Nslm","hYBCKoGu6x","8xEKzyToGW","n1pmOuJScX","lkMUAFhtgl","aL6AJWMiS3",
+"lsQGoyEfy9","NhXduuN6r3","XyPZN2TRI7","ZhwG1lsQGo","RkQkeGv3Fq","ciuWziqv4k","tAOsra00b5","Zv7z0FFDui","suY4x7X3uy","o8Uyd2Yz7E",
+"OHaBztlILt","a00b5FLsph","VIlwPt98iW","0Wr5y55rfB","mX2GEFcWrW","IBe8kt98iW","s4786fFDrJ","NhXduIjTwP","OxWIH0PktI","MojnP5Mg9r",
+"7ku1pJKWYR","jtn0XHlUbF","zHF1qfmIK1","FxX9qfcwDa","taOXKIBe8k","d7vjM55rfB","NhXduEdBKc","7X3uy2DREs","9iGoTfLNg8","b29RJEOE1o",
+"hSSvQKsjRK","fqypyxReec","JKWYROUqFM","faHirydG8U","gjUTuTwano","GrDg7VNCPd","JJs5mpT8wu","FVMxo4QMc9","LDk6fkB5nP","5iGN5uN6r3",
+"KsjRKTa8f6","ydG8UYw2oU","jiVBPnFqik","SbRYytjQxs","S2DfuZhwG1","DG4sTtAOsr","FVMxoEoToP","uTacxFFDui","LewvMvkCHH","ogLgcqQxHP",
+"6AFT08TxD7","zz4ZUzbIYY","SbRYygf8rI","tuDySCdyBV","GrDg7Nxx9V","XyPZNtvdkD","tl72W55rfB","W7cTsQnJ1S","prNT6FGzgp","nnP8oM6qcG",
+"nFqikWDVWJ","i7WMQFxX9q","QWxoTmz8gx","lpF6WQ6Lix","DG4sTmX2GE","lXFOBuLtKs","6AFT0nlaBy","VBjhzJkzUn","NOHszK4GS8","tuDyS4QMc9",
+"FPfSEzFgtB","cL0aEfcwDa","soy9tfcJOy","tuDySrz7Ut","Ul4a1iB08l","P6bcge6e4z","D6rByPb1pa","O3iyQix74r","618DiOHaBz","tjQxsQbxXc",
+"gdQsS5iGN5","vkCHHBpYhV","zQt6QJRJQB","Yh1hF5iGN5","gIYvE0YAGH","fcwDaXflUq","tuDySIRh48","7X3uyVprf2","fcJOyFnPFB","qaofN14FLR",
+"StlDJLDk6f","dQ586VIlwP","HRxd8d85a9","RBhp0AmdQd","Ss0ZuZv7z0","Chuy3CK5W7","b29RJKsjRK","pv0i7AOgEe","5ZaEzWaWsv","jfREutvdkD",
+"aDGtS4W0Tl","UlU3MMm8si","0YAGHEoToP","sx5GlnFqik","xXTI4sqVrf","StlDJVNCPd","GSQwjgtCA5","PYBf48U2nU","I7p2axciqp","FLsph9XyT9",
+"2DREsxciqp","pAhR1zQt6Q","iwzGkZUnqt","5drc6NOHsz","bgJAzIRh48","yofH3D6rBy","W3VFHpv0i7","5NammQssNC","zz4ZU2DREs","aDGtSGv3Fq",
+"VBjhzFPfSE","2TRI7jiVBP","SmGzvFNYIM","ciuWzL7cGc","QworuzqH0W","Cfgr3RBhp0","hUTw7ReKEW","yofH3h1zcH","4dEz6618Di","fqypyBFkb8",
+"FLsph64s8N","K20wKNxx9V","RxrsmLDk6f","s93Ml2hEEU","8xEKzXyPZN","piJSkhSSvQ","6q6L907n1c","lCMxy8cVD3","o8UydL7cGc","qQxHPtjQxs",
+"SmGzvHfyNQ","07n1cblLA9","2hEEUMm8si","HP433fLNg8","RACujBGaQY","FNYIMSmGzv","FVMxofFDrJ","8xEKzhe9IA","x3LDeAOgEe","Yf2Ec7fsYM",
+"yvOMI24ARF","x3LDeRzaZA","gf8rIMK07Y","HlUbFbgJAz","s4786uAWyp","2hEEUO3iyQ","SWfouuZPqg","9y4lwcmXIX","55rfBCIShG","m4bxUOHaBz",
+"K20wKGSQwj","WreyPlCMxy","3weIFNOHsz","JJs5maez9y","AXpwETwano","YjB9tQWxoT","DLhzMzmLYD","rhl0Jhe9IA","2DREsAOgEe","QnJ1SRBhp0",
+"tlILtVIlwP","ksJbyQworu","fcJOypvgjS","pWiOsgdQsS","WMiS3i7WMQ","MezSWqaofN","0Wr5yY1mC0","aez9ySs0Zu","AIYUufaHir","jS1ajLbRTH",
+"DG4sTazIWp","pmeCdrz7Ut","2NslmFPfSE","lkMUAi3pyd","HlUbFgtCA5","QssNC1v5hH","cL0aEx3LDe","2DREsFhtgl","Waim62Yz7E","SbRYyXflUq",
+"5Drn0zFgtB","TCgPpsx5Gl","lCMxyuQIcz","m4bxUbrhlQ","CdyBVjfREu","iqv4kIBe8k","jiVBPRBhp0","QworulkMUA","uAWypMmKGJ","4dEz6WPmlx",
+"kZANmy94nw","RACujcL0aE","VIlwPK4GS8","XflUqzQt6Q","QYxC0580YD","uupzk8TxD7","lm0pDCdyBV","KZamHzbIYY","0KyfsFVMxo","MojnPaez9y",
+"Vprf2jiVBP","Dz1R38cVD3","pWiOsFFDui","RkQkeo8Uyd","v8yFNnFqik","t59lRgjUTu","7X3uyMmsIo","TwanovkCHH","gtCA5XflUq","MaJQsYjB9t",
+"soy9tlj07Q","ThjNntaOXK","8TxD7euZA5","8cVD3jS1aj","GXdoHJkzUn","zbIYYoGu6x","Z4I1vRzaZA","wiHrZFFDui","cmXIXi7WMQ","5Nammjtn0X",
+"pvgjSlweGy","TwanoSbRYy","Yf2EcFPfSE","1v5hHcmXIX","MmKGJqaofN","2Yz7ESjskQ","WMiS3YOfrY","5nmWvX6Pin","WDVWJYjB9t","55rfB1v5hH",
+"k85AeuoStw","uN6r3VIlwP","RmDcrcL0aE","Qworun8pJ9","gdQsStlILt","uupzkciuWz","OUYuFMm8si","K4GS8gdQsS","Zv7z0fcwDa","NOHszzmLYD",
+"POUYS5VZjS","h1zcHM3zXL","jiVBPOz8yZ","7fKYUdjsrv","prNT6cShY2","pAhR1tl72W","Zv7z07X3uy","WDVWJb29RJ","OUYuFhE1Ql","RBhp0lCMxy",
+"AgJHQWmadA","9rlg9fqypy","pAhR1MK07Y","lweGysoy9t","618Di2hEEU","DLhzMxciqp","hSSvQaDGtS","ulk41BCxeC","e6e4zAgJHQ","Waim65Drn0",
+"FxX9qReKEW","0MR5XOHaBz","s7MxkzY1GY","jeskSDQimp","DcpWBpT8wu","Gv3FqAmdQd","prNT6QssNC","brhlQRBhp0","2ZHdkWaim6","B3qemCfgr3",
+"lj07QhSSvQ","0PktIS77LH","fmIK1jfREu","oGu6xlkMUA","Nxx9VEOE1o","ni2v1euZA5","pAhR13weIF","vOqCElm0pD","v8yFNI7p2a","2ZHdkdjsrv",
+"BCxeC0YAGH","rKDLJoQ87r","TCgPpIBe8k","GWqqXiwzGk","O3iyQCIShG","yvOMI3weIF","RBhp05ZaEz","S2Dfu5Drn0","8U2nU3otm6","0ao3lru4UG",
+"pmeCdlsQGo","2DREshUTw7","24ARFAOgEe","TCgPpX6Pin","Cp3mZZ4I1v","MK07YVIlwP","L7cGcOxWIH","tAOsrv1Hln","zQt6QZUnqt","Yw2oUKASQ8",
+"gjUTuYOfrY","RkQkeQbxXc","qUJMdQChxs","hE1QlqUJMd","BbwgAFcWrW","lViBvpiJSk","ZJTXHydG8U","MaJQsWaim6","Rxrsm14FLR","uZPqgs93Ml",
+"WPmlxSmGzv","y94nwGv3Fq","qQxHPG1RhS","YjB9t0Kyfs","oQ87ruPX7G","hi5X716lHc","BpYhV2DREs","0YAGHZ4I1v","5ZaEzGXdoH","cL0aEpWiOs",
+"0MR5XBFkb8","IRh48zY1GY","yToGW5ZaEz","FPfSE29QAz","DLhzMMezSW","IKxdLOHaBz","FLsphB3qem","iwzGkM3zXL","7lUXZRBhp0","UmaEv4W0Tl",
+"MK07YiwzGk","G1RhSjfREu","pWiOs618Di","S77LHqQxHP","jzUqRhi5X7","e6e4z7lUXZ","5Namm0h1b1","dQ586ogLgc","RxrsmM3zXL","P6bcgqaofN",
+"n8pJ9vOqCE","PYBf4dhSuH","J2mQiZhwG1","O3iyQTCgPp","azIWpRACuj","oVQp6oGu6x","RBhp0Ss0Zu","0MR5XLbRTH","gdQsS5nmWv","4QMc9fmIK1",
+"No0QbECMvU","uZPqg2Yz7E","ni2v12Nslm","BCxeCQnJ1S","MmsIoAmdQd","lweGybgJAz","piJSkAkKTk","7X3uyxXTI4","fFDrJ3weIF","BFkb8cmXIX",
+"kZANmaFFss","RACuji7WMQ","0YAGH3otm6","QnJ1SsuY4x","yluBxQworu","FhtglX6Pin","v1HlnReKEW","FhtglChuy3","uLtKss93Ml","8RCUACdyBV",
+"CIShGpmeCd","GSQwjJkzUn","5IhmGVjCZq","4W0TlvkCHH","iB08lJ2mQi","9XyT9CxVEf","jfREufcwDa","16lHcfFDrJ","QworuprNT6","M3zXLAgJHQ",
+"uJScX8xEKz","8cVD38hJdt","QworuTXQ0Z","RBhp048cHL","FnPFBXflUq","X6PinOz8yZ","YOfrYpmeCd","5Drn0zHF1q","8hJdtK4GS8","Mm8si5ZaEz",
+"b29RJuPX7G","jfREufaHir","djsrvtaOXK","I7p2aCqqaD","sqVrfqQxHP","tlILtjfREu","Yf2EclXFOB","nFqikpv0i7","ThjNnfcwDa","W3VFHni2v1",
+"rz7Utlj07Q","F6PT2FnPFB","TwanoF6PT2","8cVD3G1RhS","3otm6fcJOy","xReecLbRTH","fqypyYf2Ec","9XyT9BCxeC","BFkb8DcpWB","pWiOsVLTy6",
+"VBjhzVprf2","8U2nU55rfB","FxX9qjeskS","brhlQtuDyS","Uvlv4rhl0J","zqH0WVjCZq","xReeci7WMQ","CNHmvUl4a1","45cIH0Wr5y","Y1mC0uPX7G",
+"Q6LixBGaQY","zz4ZUBbwgA","pvgjSBpYhV","jeskSVprf2","RpBQmkB5nP","cShY2J2mQi","0h1b11j5L8","Nxx9VQ6Lix","yluBx2Nslm","pAhR1xciqp",
+"h1zcHzY1GY","24ARFQWxoT","SmGzvpmeCd","PYBf45IhmG","y94nwzHF1q","KZamHBbwgA","ydG8ULDk6f","0KyfsRxrsm","ZUnqtFPfSE","AmdQdzmLYD",
+"ZUnqtHzZT8","5nmWvOxWIH","fmIK1Pb1pa","QChxspWiOs","fmIK1M6qcG","ZJTXHYjB9t","K4GS84QMc9","s4786pAhR1","45cIHK4GS8","EoToP2hEEU",
+"In3NSIn3NS","o8Uydd7vjM","1v5hHokgRi","zFgtBCdyBV","NOHszzQt6Q","RmDcr9iGoT","pmeCdqUJMd","KsjRKG1RhS","zqH0WLewvM","ru4UGKASQ8",
+"No0QbMGlTF","BbwgAksJby","RkQkeYw2oU","MojnPPYBf4","pv0i7azIWp","5Mg9rt98iW","5IhmGZUnqt","WDVWJEOE1o","2TRI724ARF","ix74rQWxoT",
+"MmKGJSmGzv","yluBxAIYUu","FwEJzzqH0W","VjCZqiwzGk","8RCUAqQxHP","2TRI7o8Uyd","7X3uy5drc6","yluBxksJby","NAFuwuN6r3","Vprf2ECMvU",
+"yEfy9OUYuF","rKDLJ7X3uy","Mkgy8Dz1R3","FwEJzHzZT8","RACujqUJMd","0MR5XQ6hMC","AgJHQru4UG","2TRI755rfB","0KyfsfLNg8","jSjS3DG4sT",
+"Pb1pagjUTu","0YAGHrz7Ut","NcICA5nmWv","jS1ajrhl0J","ru4UGAkKTk","5drc6bZLvS","3otm6FPfSE","6AFT0Y1mC0","JJs5m0Wr5y","JkzUnDG4sT",
+"RBhp0LbRTH","WreyPQ6Lix","HfyNQ16lHc","MaJQsogLgc","fFDrJFFDui","zmLYDdQ586","gtCA5ZhwG1","ReKEW9rlg9","5Drn0JJs5m","K20wKQ6hMC",
+"Zv7z0YjB9t","2NslmSWfou","VIlwPs93Ml","v1HlnGv3Fq","QClRLjtn0X","Ul4a1Q6Lix","t59lRAIYUu","I7p2a7Ow5C","Z4I1vYw2oU","Oz8yZ16lHc",
+"zz4ZU6AFT0","BbwgAMmKGJ","cmXIXVprf2","nFqikJIqXi","QClRLMmKGJ","DQimpfcwDa","i3pydcL0aE","LewvMBCxeC","VNCPdzY1GY","zFgtBpv0i7",
+"TXQ0Zxciqp","9GXkX0YAGH","B3qemQ6Lix","FPfSEdhSuH","FVMxoh1zcH","MmsIotaOXK","zQt6QtvdkD","faHirC2Irc","blLA9lweGy","580YDBpYhV",
+"aL6AJLbRTH","fqypyQworu","5Drn0NhXdu","uJScX9eoRc","cL0aEJkzUn","zbIYYeuZA5","atef24dEz6","Zv7z0lweGy","cL0aEt98iW","lCMxyyToGW",
+"WDVWJW3VFH","Z4I1v0MR5X","L7cGc7fKYU","pFrrlv2eC3","BFkb8CqqaD","RxrsmVIlwP","Vprf2RzaZA","SmGzv5Drn0","45cIHUlU3M","VIlwPaez9y",
+"Ss0ZuzFgtB","24ARFMaJQs","iwzGkdpe1v","hi5X7VerEA","pmeCd1v5hH","4QMc9xciqp","fmIK1Gv3Fq","RmDcrF6PT2","BbwgA7lUXZ","24ARFazIWp",
+"cmXIXlH1kt","uPX7G5ZaEz","K4GS8qUJMd","FxX9qZzJHW","djsrvogLgc","KASQ8v8yFN","F6PT2AXpwE","MmKGJlXFOB","2ZHdklweGy","aL6AJx3LDe",
+"xXTI40MR5X","WPmlxK20wK","RmDcrn8pJ9","RmDcr5VZjS","DG4sTYw2oU","Ul4a1lH1kt","48cHLNhXdu","blLA9M6qcG","UlU3MvOqCE","xXTI4suY4x",
+"bZLvSFNYIM","WPmlxSWfou","9XyT9euZA5","uupzkqaofN","QbxXcWaWsv","FxX9q45cIH","ZzJHWGXdoH","TXQ0Zni2v1","K20wKpmeCd","7ku1p0h1b1",
+"IBe8kNcICA","vOqCE0Wr5y","1LB1LydG8U","SjskQTa8f6","07n1cQbxXc","aL6AJJkzUn","FjHXRpAhR1","i7WMQCfgr3","Y1mC0TXQ0Z","fqypy5iGN5",
+"zqH0WiB08l","QWxoTEOE1o","Dz1R3NOHsz","XflUqgIYvE","Ul4a1WPmlx","SmGzvjiVBP","dmoS7XyPZN","oVQp6e6e4z","zQt6QaFFss","DLhzMn8pJ9",
+"580YDCxVEf","JXljWpvgjS","S2DfujzUqR","rKDLJYjB9t","YOfrYxReec","4dEz62DREs","MmKGJ4QMc9","9rlg9fLNg8","3weIFFNYIM","Pb1paKr8ys",
+"Chuy3RkQke","vOqCEKASQ8","Nxx9VksJby","9XyT9IRh48","i7WMQK20wK","P6bcgFGzgp","d7vjMgIYvE","1LB1LMaJQs","RzaZArz7Ut","ciuWz7lUXZ",
+"NhXdutAOsr","OHaBzxciqp","NOHsznlaBy","FcWrWAXpwE","OHaBzS2Dfu","7hyVvQworu","FVMxoOxWIH","tuDySTa8f6","rKDLJAkKTk","0Wr5yVIlwP",
+"jSjS3gdQsS","kZANmd85a9","7Ow5C0Kyfs","K4GS8Y1mC0","07n1cHzZT8","ksJbyxReec","NAFuwThjNn","14FLRIRh48","hYBCKfmIK1","4QMc9zQt6Q",
+"t59lR9iGoT","29QAz3weIF","GrDg7FNYIM","9eoRcDcpWB","0MR5XlpF6W","TCgPpgdQsS","uQIczpAhR1","JIqXi2hEEU","vkCHHNAFuw","blLA9i7WMQ",
+"0h1b1ZUnqt","YOfrYdQ586","wDajXtaOXK","a00b5BbwgA","5Drn0M3zXL","Yf2EcYw2oU","gjUTu7X3uy","HzZT8EoToP","IBe8klpF6W","QYxC0Oz8yZ",
+"Cp3mZNAFuw","yToGWhUTw7","2NslmY1mC0","lj07Qxciqp","FPfSEuQIcz","LewvMn8pJ9","ZUnqtoVQp6","5nmWvni2v1","zz4ZUJkzUn","0Wr5yni2v1",
+"FLsph618Di","Pb1paaez9y","GXdoHciuWz","tl72WfaHir","sx5GlG1RhS","Nxx9V4W0Tl","JKWYRSjskQ","ksJbyazIWp","lViBvlkMUA","HlUbFRmDcr",
+"L7cGcReKEW","0PktIVNCPd","F6PT2Uvlv4","uJScXDcpWB","5iGN5M3zXL","uoStwuTacx","guMb8No0Qb","Cfgr3VIlwP","O3iyQjiVBP","n1pmOBbwgA",
+"RBhp055rfB","soy9tzqH0W","RmDcrRsQUq","QnJ1S9XyT9","Waim68U2nU","zz4ZUPOUYS","POUYSlCMxy","uupzkwDajX","7fsYM9rlg9","a00b5OHaBz",
+"tlILt0h1b1","5Mg9rGXdoH","7lUXZJXljW","16lHcIKxdL","QWxoTzQt6Q","UlU3Mv1Hln","y94nwkB5nP","ydG8UlweGy","6q6L9n8pJ9","xXTI4bZLvS",
+"HlUbFPb1pa","BFkb8hYBCK","n1pmOdQ586","MojnPiqv4k","OUqFMOUYuF","v2eC3k85Ae","i3pydCK5W7","Z4I1vulk41","WmadAyvOMI","2Yz7EokgRi",
+"0ao3l9eoRc","yToGWRsQUq","X6PinuoStw","yvOMIWMiS3","HfyNQvOqCE","45cIHD6rBy","MmKGJCdyBV","qaofNhE1Ql","ulk41FVMxo","nFqikQ6hMC",
+"7X3uyRzaZA","24ARFhUTw7","QworujiVBP","F6PT2lsQGo","yToGW7hyVv","gdQsSzqH0W","uupzkNAFuw","cQOnvlpF6W","5Drn0fcwDa","sqVrfgjUTu",
+"zQt6QfcwDa","pWiOsXyPZN","FjHXRuJScX","ZzJHWpFrrl","2DREsO3iyQ","FcWrWpT8wu","cL0aE55rfB","7X3uyWDVWJ","zHF1qTwano","n8pJ9yofH3",
+"PYBf4aFFss","GrDg7sx5Gl","Ul4a1GSQwj","FPfSEYf2Ec","Mkgy8WDVWJ","RpBQmazIWp","AXpwE4W0Tl","lsQGoyluBx","Y1mC0jtn0X","QClRLCfgr3",
+"faHir618Di","X6Pin8RCUA","VIlwPgtCA5","taOXKrKDLJ","RzaZA29QAz","5nmWv4QMc9","NcICAaFFss","tvdkD5Mg9r","3otm65nmWv","o8UyduZPqg",
+"RzaZA1j5L8","zbIYY14FLR","WDVWJUlU3M","soy9t5Mg9r","0PktIJRJQB","hi5X7JIqXi","zqH0WokgRi","hYBCKnlaBy","dmoS7NOHsz","24ARFFcWrW",
+"MaJQs3otm6","ix74rDG4sT","UmaEvdjsrv","jS1ajHfyNQ","DcpWBECMvU","BFkb8VBjhz","rz7UtOUYuF","fLNg8JKWYR","piJSkZhwG1","Z4I1vWmadA",
+"uAWyp8FmFH","J2mQiW3VFH","t59lRXyPZN","4dEz6D6rBy","AgJHQ7X3uy","zQt6Q48cHL","QWxoT5Drn0","nnP8oHP433","y94nwWDVWJ","FxX9qOHaBz",
+"uPX7GVerEA","jSjS3mX2GE","7X3uyY1mC0","JkzUnVjCZq","AXpwEBGaQY","45cIHokgRi","e6e4zzFgtB","mz8gxGXdoH","WDVWJZuDtD","JkzUn9y4lw",
+"OUYuFlweGy","cL0aEGv3Fq","RpBQmRxrsm","t59lRPYBf4","0KyfsfaHir","U3yw5Mkgy8","MaJQsWMiS3","MmsIoD6rBy","29QAz8RCUA","2Nslmsoy9t",
+"KASQ8uQIcz","2TRI7WaWsv","sqVrfIRh48","fmIK15Mg9r","uQIczrz7Ut","B3qempWiOs","VerEAjzUqR","2TRI73weIF","uoStwprNT6","In3NS8FmFH",
+"9XyT97ku1p","nnP8oYOfrY","WMiS3lH1kt","G1RhSBbwgA","HfyNQRzaZA","lCMxyRzaZA","qaofNStlDJ","2NslmKsjRK","I7p2aBCxeC","cShY2jfREu",
+"lH1ktCxVEf","cQOnvzFgtB","MezSWZuDtD","ZUnqtL7cGc","Z4I1vjeskS","vLsmSn1pmO","07n1cxReec","0Wr5y1v5hH","taOXKiqv4k","29QAzUlU3M",
+"G1RhSuJScX","JRJQBuvf7A","1j5L8StlDJ","uLtKsJKWYR","9y4lwzY1GY","JXljWGXdoH","OHaBzfcwDa","aez9yG1RhS","fFDrJYh1hF","prNT68cVD3",
+"B3qemVBjhz","yluBxjzUqR","0Wr5yQYxC0","NOHszRACuj","fcJOyaez9y","IRh48RsQUq","QWxoTMkgy8","uLtKsvOqCE","QChxs8hJdt","16lHcJKWYR",
+"xciqpd7vjM","5VZjSWmadA","Ss0ZuRsQUq","iB08lTa8f6","prNT6U3yw5","lCMxy3weIF","1j5L8AXpwE","jeskSHRxd8","0h1b10BmCy","WMiS3MezSW",
+"uQIcz8cVD3","euZA50Kyfs","XyPZNCp3mZ","BbwgANhXdu","dpe1vCp3mZ","GWqqXv8yFN","FNYIM5ZaEz","6q6L9aFFss","ECMvUHfyNQ","FLsphMK07Y",
+"NAFuwo8Uyd","faHirMkgy8","yEfy9Y1mC0","piJSks93Ml","ECMvU9GXkX","MezSWGrDg7","x3LDeFVMxo","h1zcHCdyBV","MGlTFMezSW","HRxd8v8yFN",
+"uPX7GbZLvS","Waim6xXTI4","3otm6iqv4k","2NslmzQt6Q","tuDyScShY2","ksJby8cVD3","3weIF8RCUA","7fKYU5Namm","uZPqgvkCHH","ulk41cL0aE",
+"QssNC0h1b1","rz7UtBGaQY","07n1clm0pD","gjUTuy94nw","rKDLJSs0Zu","6q6L9RkQke","618DiEOE1o","0BmCyhSSvQ","aFFss4W0Tl","Cfgr3FLsph",
+"MGlTFCdyBV","e6e4z2Yz7E","0PktIsuY4x","d7vjMZJTXH","W3VFHcQOnv","blLA9lj07Q","ThjNnRACuj","hYBCK7Ow5C","DG4sTfcJOy","lsQGos7Mxk",
+"9rlg9MmKGJ","WmadA1v5hH","uvf7ApT8wu","5ZaEzFwEJz","zHF1qDz1R3","UlU3MLDk6f","7ku1pY1mC0","pWiOspFrrl","AkKTkcmXIX","WPmlxksJby",
+"2hEEUi7WMQ","64s8NHRxd8","MmKGJfmIK1","JIqXiMmsIo","iB08ltuDyS","SbRYyKr8ys","OUYuFfcwDa","EdBKcNOHsz","ZuDtDogLgc","FcWrW2hEEU",
+"0PktIgf8rI","XflUq8RCUA","gIYvEtlILt","GXdoHe6e4z","OxWIH5Drn0","0PktISbRYy","BpYhVlj07Q","RpBQmb29RJ","yEfy9lXFOB","a00b5ZUnqt",
+"aDGtSh1zcH","FGzgpfcwDa","BGaQYIn3NS","piJSkrhl0J","tjQxs0YAGH","uvf7AuoStw","sx5GlDG4sT","aez9yazIWp","uQIczbZLvS","Z4I1vQChxs",
+"BFkb8atef2","uoStwChuy3","uJScXKsjRK","EOE1oChuy3","1j5L8RmDcr","oQ87rBCxeC","uLtKsF6PT2","n8pJ9Twano","WaWsvyEfy9","4dEz6JJs5m",
+"QbxXcRpBQm","8xEKzpv0i7","zY1GYuoStw","m4bxUZv7z0","TwanoKsjRK","48cHLGv3Fq","64s8N580YD","RACujxXTI4","WDVWJxXTI4","yluBxpAhR1",
+"9y4lwtl72W","nnP8o0Kyfs","14FLRMezSW","PYBf4qQxHP","Uvlv4yluBx","1v5hHJRJQB","5Nammb29RJ","pmeCdVLTy6","FPfSEQWxoT","Oz8yZpmeCd",
+"8U2nUuAWyp","8TxD7MK07Y","1j5L8rz7Ut","07n1czQt6Q","MmKGJl83Ud","AkKTkrz7Ut","s93MlLDk6f","MmKGJjSjS3","sqVrfZv7z0","uvf7AzY1GY",
+"IRh48gtCA5","1j5L8v2eC3","i3pydM3zXL","ulk41QnJ1S","jS1ajgtCA5","1v5hHFLsph","SbRYy14FLR","EoToPrKDLJ","euZA5lViBv","4dEz6pvgjS",
+"D6rBy5VZjS","hYBCK5IhmG","RmDcrydG8U","LewvMuupzk","2TRI72Yz7E","tjQxs5IhmG","Nxx9VW3VFH","3otm6b29RJ","pFrrllkMUA","BFkb8tAOsr",
+"wiHrZcQOnv","pWiOsZ4I1v","lXFOB2Yz7E","PYBf4IRh48","prNT6WDVWJ","XflUqSmGzv","JJs5mCK5W7","Cp3mZn1pmO","bgJAzC2Irc","TCgPp6q6L9",
+"cmXIXUlU3M","gf8rIMm8si","BbwgAkB5nP","QClRLoGu6x","uvf7ACdyBV","7fsYMMmKGJ","LDk6fdmoS7","VjCZqReKEW","EOE1oxReec","L7cGcM3zXL",
+"v2eC3X6Pin","X6PinxReec","HlUbFiwzGk","jeskSKASQ8","xciqptl72W","Nxx9VIBe8k","1v5hH8hJdt","qaofNrz7Ut","HfyNQLbRTH","5IhmGdhSuH",
+"9iGoTCNHmv","kB5nPAgJHQ","0YAGHIBe8k","rhl0JJKWYR","AgJHQWaWsv","pvgjSlCMxy","0Wr5yKsjRK","uN6r38hJdt","CK5W7D6rBy","QYxC0Ss0Zu",
+"jeskSdQ586","7Ow5C580YD","Q6Lixn8pJ9","2NslmBCxeC","J2mQiCK5W7","KZamHLbRTH","rz7UtokgRi","GrDg72TRI7","nnP8oCxVEf","t59lRvLsmS",
+"suY4xCdyBV","RBhp0U3yw5","lsQGoJIqXi","KASQ8jS1aj","gf8rIxReec","iqv4ks7Mxk","zz4ZUZ4I1v","55rfBhe9IA","L7cGc0PktI","F6PT2uTacx",
+"9rlg9n8pJ9","hYBCKix74r","TCgPpaFFss","BFkb87Ow5C","1v5hH7ku1p","jSjS3tvdkD","6AFT0v1Hln","KsjRKksJby","GXdoHQClRL","v2eC35ZaEz",
+"pvgjSO3iyQ","AkKTkZzJHW","v8yFN1LB1L","ThjNnAOgEe","v8yFNL7cGc","XflUqcQOnv","Yw2oU9eoRc","MK07YpvgjS","lH1kt618Di","ru4UGyEfy9",
+"POUYS8FmFH","NOHszlkMUA","cQOnv5iGN5","tAOsrOHaBz","StlDJ5Namm","AIYUu7X3uy","618DijiVBP","0Wr5yNAFuw","yEfy9prNT6","In3NSL7cGc",
+"CNHmvzFgtB","tjQxsCdyBV","djsrvdhSuH","BbwgAgjUTu","tAOsrJRJQB","HzZT8WaWsv","mz8gxmX2GE","kB5nPNhXdu","WMiS3yvOMI","5IhmGK20wK",
+"uZPqgulk41","atef2TXQ0Z","Rxrsm8hJdt","zmLYDVerEA","dmoS7d7vjM","5VZjSO3iyQ","WMiS3FxX9q","faHirTwano","Waim6fqypy","d85a964s8N",
+"aez9yCK5W7","QClRLTa8f6","fcJOyGXdoH","fFDrJFVMxo","8xEKziqv4k","Zv7z0kZANm","xReec5ZaEz","TCgPprKDLJ","o8Uyd0ao3l","djsrvUvlv4",
+"2hEEUzHF1q","OUqFM4W0Tl","B3qemAmdQd","WaWsvIRh48","uLtKs9rlg9","B3qemv2eC3","xReecciuWz","5drc6pv0i7","NcICAFNYIM","ZuDtDQ6hMC",
+"FFDuixReec","1v5hHRBhp0","Kr8ysQChxs","S77LHblLA9","uQIcz0YAGH","dpe1v7fKYU","JRJQBk85Ae","AmdQdYw2oU","7fKYUi7WMQ","RzaZASWfou",
+"fqypynFqik","QssNCC2Irc","gf8rIi3pyd","lj07Qm4bxU","O3iyQkB5nP","qUJMdfcJOy","v8yFNrhl0J","kZANm8FmFH","POUYSpv0i7","BGaQYCxVEf",
+"jeskS6AFT0","FFDuiZzJHW","0h1b1AkKTk","ZUnqteuZA5","2Yz7EtaOXK","M6qcGFGzgp","yluBxqQxHP","aDGtSF6PT2","UmaEvJRJQB","vLsmSydG8U",
+"POUYSOUYuF","618DiVIlwP","Zv7z0M3zXL","t98iWFNYIM","No0QbWaim6","ReKEWRxrsm","Uvlv42hEEU","Pb1pa8hJdt","FLsphnlaBy","zqH0WnnP8o",
+"5Namm07n1c","zbIYYuZPqg","v2eC3CqqaD","cShY2lweGy","J2mQi8hJdt","4W0Tl7ku1p","ciuWzNcICA","AOgEeMK07Y","BFkb8uZPqg","euZA5guMb8",
+"5VZjSaez9y","RmDcrzbIYY","sx5Gl3weIF","bgJAz1v5hH","gIYvEjSjS3","SWfouAkKTk","mz8gxoQ87r","tuDySjSjS3","HlUbFZUnqt","bZLvSRzaZA",
+"s7MxkOUYuF","tjQxs2Yz7E","MmKGJY1mC0","AgJHQXflUq","suY4xRxrsm","tjQxsTXQ0Z","07n1cEOE1o","hE1Ql14FLR","faHirjS1aj","tAOsrd85a9",
+"uZPqg9eoRc","i7WMQuZPqg","4QMc9NhXdu","ZzJHWFnPFB","MK07YksJby","8cVD3euZA5","K20wKZhwG1","dQ586WmadA","8U2nUzbIYY","3otm68U2nU",
+"618Di7fKYU","pFrrlk85Ae","pAhR12Nslm","hYBCKbrhlQ","YjB9t48cHL","FnPFBX6Pin","EOE1oydG8U","I7p2aYh1hF","SbRYyd85a9","azIWpYw2oU",
+"EoToPQworu","Pb1pax3LDe","WPmlxWPmlx","VLTy6FNYIM","fqypy9iGoT","F6PT2jfREu","ni2v155rfB","wiHrZVLTy6","lm0pDdhSuH","a00b5b29RJ",
+"Q6LixRpBQm","qUJMdFxX9q","cL0aEzmLYD","F6PT2uPX7G","EdBKcF6PT2","F6PT2IjTwP","EOE1oksJby","8U2nUydG8U","a00b564s8N","cmXIXReKEW",
+"G1RhSJXljW","lm0pDpWiOs","rz7Utd85a9","jSjS32Yz7E","rhl0Jrz7Ut","cQOnvn1pmO","4dEz6yToGW","hSSvQyvOMI","MmsIo16lHc","618DiprNT6",
+"S77LH3otm6","RzaZA618Di","MezSWC2Irc","MmsIotuDyS","prNT6pmeCd","TCgPpuoStw","RxrsmWPmlx","Vprf26AFT0","CqqaDSjskQ","FjHXRSs0Zu",
+"DcpWBWDVWJ","2DREso8Uyd","LbRTHoVQp6","FnPFB7fsYM","Kr8ys14FLR","guMb8HlUbF","zHF1qdmoS7","DLhzMjSjS3","cQOnvpiJSk","tvdkDIRh48",
+"prNT6d85a9","pT8wuAOgEe","29QAzlweGy","sqVrfQnJ1S","FxX9qsuY4x","QssNClCMxy","O3iyQvkCHH","pT8wurz7Ut","TwanoKASQ8","9XyT9JKWYR",
+"L7cGcK20wK","hUTw7qaofN","hYBCKBGaQY","d7vjM0Kyfs","qQxHP07n1c","CdyBVgjUTu","8TxD7GSQwj","he9IA8xEKz","hSSvQ0Kyfs","GrDg7ulk41",
+"uupzkrz7Ut","jeskSSmGzv","WMiS35Mg9r","8TxD7pmeCd","fcwDasuY4x","2hEEUfaHir","lsQGoMojnP","zQt6QFGzgp","QWxoTB3qem","GXdoHl83Ud",
+"UlU3MuZPqg","FjHXR7fsYM","piJSkwDajX","yEfy9TXQ0Z","uN6r3vOqCE","guMb89eoRc","Yw2oUVNCPd","ECMvUs4786","1v5hHk85Ae","8TxD7GXdoH",
+"ZuDtDBpYhV","UmaEvzHF1q","HP433atef2","0PktI2DREs","Yh1hF7fsYM","07n1cvkCHH","vkCHHfcwDa","rz7UtuPX7G","UmaEvjzUqR","Ss0ZuiB08l",
+"KsjRKNo0Qb","B3qemFVMxo","qaofNPOUYS","oQ87rWreyP","OHaBzgtCA5","VjCZq16lHc","yofH3CqqaD","nlaByWaWsv","U3yw5No0Qb","In3NSDz1R3",
+"MmKGJb29RJ","ZzJHWprNT6","hYBCKyluBx","JIqXiHzZT8","L7cGcJkzUn","Pb1paVLTy6","VBjhzDLhzM","jSjS31v5hH","Qworu7ku1p","fcJOyStlDJ",
+"NOHszJKWYR","CxVEf5ZaEz","1j5L8s7Mxk","WmadAfmIK1","7ku1psuY4x","uupzkOHaBz","FFDuiMaJQs","8hJdtMaJQs","s7MxkFGzgp","I7p2aguMb8",
+"jtn0XuTacx","GXdoHvOqCE","7lUXZZ4I1v","6q6L9zbIYY","qaofNRxrsm","JJs5muJScX","8xEKzSbRYy","XyPZNuN6r3","POUYSjeskS","SbRYyDQimp",
+"MmsIoYw2oU","8TxD7uoStw","Oz8yZv2eC3","jiVBPs7Mxk","fqypy1LB1L","5ZaEz8cVD3","jSjS3Twano","MGlTFCIShG","fLNg89rlg9","h1zcHVerEA",
+"9XyT92Nslm","lm0pD2DREs","e6e4zrKDLJ","zQt6QB3qem","BpYhVLbRTH","zQt6QzmLYD","HzZT8LewvM","jeskSblLA9","0MR5X7fKYU","9eoRcwDajX",
+"uN6r3580YD","hYBCKCNHmv","JJs5mUvlv4","brhlQd85a9","uJScX0MR5X","tjQxsaDGtS","k85AelsQGo","OUqFMrhl0J","F6PT2NAFuw","29QAzNcICA",
+"MezSWs4786","7Ow5CCK5W7","5iGN5m4bxU","faHir580YD","GrDg7qQxHP","h1zcHZuDtD","LbRTHRpBQm","fcJOyMkgy8","9GXkXatef2","m4bxUM6qcG",
+"FwEJztuDyS","t59lRgdQsS","AmdQdFcWrW","NhXdulm0pD","ydG8UWaim6","VLTy6bgJAz","t98iWhUTw7","euZA5Chuy3","7lUXZ8cVD3","QYxC0pT8wu",
+"L7cGcXyPZN","qaofNuLtKs","QbxXcAOgEe","3otm65Mg9r","9XyT9JkzUn","GrDg7MmsIo","cL0aEJIqXi","euZA5S2Dfu","atef2lweGy","VjCZqtvdkD",
+"blLA9Z4I1v","2ZHdkni2v1","zQt6QNxx9V","iKqhr8TxD7","ix74rd7vjM","VerEA5drc6","xXTI4QssNC","hYBCKOxWIH","y94nw9iGoT","iB08li3pyd",
+"DG4sTbZLvS","8xEKz7fsYM","gIYvE16lHc","RpBQmWPmlx","t59lRlpF6W","2hEEU64s8N","DcpWB0MR5X","9iGoTF6PT2","9y4lwdmoS7","2ZHdkZuDtD",
+"K20wKVprf2","580YDtuDyS","IKxdLbZLvS","7ku1pt59lR","OxWIHTwano","JKWYRChuy3","VerEAWaim6","FNYIMFLsph","Ta8f6HzZT8","5iGN5sx5Gl",
+"3otm6cmXIX","LDk6f9iGoT","RkQkeF6PT2","n1pmOHfyNQ","QnJ1SCqqaD","DLhzM9XyT9","MGlTFS77LH","DQimpRBhp0","hYBCKNAFuw","KsjRKcQOnv",
+"blLA9piJSk","pT8wuAmdQd","RBhp0KsjRK","hE1Qlx3LDe","4QMc948cHL","9y4lwb29RJ","fqypyaFFss","2Yz7EAXpwE","bgJAzBbwgA","0PktIaFFss",
+"wDajXWMiS3","7hyVvpv0i7","OUYuF618Di","dQ586lpF6W","5drc6ciuWz","lsQGo48cHL","ru4UGRkQke","Uvlv4cShY2","U3yw5aFFss","3otm6OxWIH",
+"5nmWvuoStw","MmsIoJIqXi","jtn0XydG8U","KZamHdmoS7","cmXIXgIYvE","atef2uvf7A","7ku1pIKxdL","XflUqzqH0W","taOXK4QMc9","14FLRfFDrJ",
+"jiVBPfmIK1","fmIK1fFDrJ","FFDui14FLR","TwanojSjS3","okgRiNOHsz","jSjS3Q6hMC","kZANmPb1pa","M6qcGQbxXc","MK07YbZLvS","7ku1pHRxd8",
+"VjCZqYOfrY","Y1mC0RBhp0","ciuWzRzaZA","S2DfuHP433","MezSW6q6L9","tAOsrpAhR1","D6rByF6PT2","JIqXiprNT6","VBjhzzqH0W","tjQxslsQGo",
+"Gv3FqjiVBP","BGaQYtjQxs","7fsYM3weIF","oQ87ruN6r3","jfREu8RCUA","Mkgy85iGN5","2ZHdkyofH3","lXFOBjzUqR","aDGtS7X3uy","5VZjSYw2oU",
+"qaofN9eoRc","s93MlL7cGc","t59lR45cIH","Z4I1vOUqFM","5nmWvMezSW","K20wKv2eC3","QWxoT3otm6","9XyT9lXFOB","S2DfudQ586","Cp3mZMkgy8",
+"jeskSCNHmv","7Ow5CSjskQ","yEfy9atef2","5ZaEzpv0i7","LewvM2DREs","SmGzvAgJHQ","AkKTkn1pmO","24ARFTCgPp","JJs5mWaim6","nFqik2ZHdk",
+"RpBQmUl4a1","5drc6vLsmS","Q6LixRACuj","Waim6IjTwP","pT8wujS1aj","24ARFGWqqX","GWqqXRBhp0","ciuWzguMb8","Rxrsm7fKYU","nlaBy7fKYU",
+"SbRYyUmaEv","ZJTXH0ao3l","i7WMQWreyP","oVQp6nnP8o","suY4xydG8U","hYBCKcL0aE","WMiS3KASQ8","lpF6WvLsmS","Nxx9V2TRI7","hYBCKrKDLJ",
+"hYBCKFhtgl","gjUTuKr8ys","uN6r3DQimp","v1HlnlH1kt","FVMxoOUYuF","QYxC0k85Ae","In3NSRBhp0","aL6AJRsQUq","pWiOs9eoRc","Zv7z0HzZT8",
+"8TxD7EOE1o","QChxsFGzgp","hi5X7qaofN","vkCHHokgRi","MaJQs7hyVv","yvOMIAXpwE","Nxx9VvOqCE","QbxXcZhwG1","JRJQBFjHXR","bZLvScL0aE",
+"ciuWzCdyBV","2DREsqaofN","5Drn0DG4sT","jzUqRzFgtB","CK5W7pFrrl","jS1aj9XyT9","14FLRPYBf4","zbIYYIn3NS","TwanoIBe8k","tlILtl83Ud",
+"RACujMmsIo","Ss0ZuAOgEe","Chuy35VZjS","TwanoMK07Y","he9IAkZANm","ZhwG12Nslm","6q6L9guMb8","Yf2EcO3iyQ","OxWIHlH1kt","uTacx8RCUA",
+"48cHLSjskQ","sqVrfLewvM","PYBf4n8pJ9","14FLRpiJSk","XyPZNyofH3","yvOMIHRxd8","KZamHMezSW","SbRYy9GXkX","kB5nP4dEz6","SjskQCxVEf",
+"9eoRcGrDg7","cShY2Cp3mZ","7ku1pNo0Qb","FnPFBnlaBy","7fsYMFFDui","FLsphoGu6x","tvdkDa00b5","IBe8kni2v1","lXFOBSbRYy","HlUbFqQxHP",
+"UmaEvcQOnv","pT8wuVprf2","2DREsBpYhV","HzZT8RmDcr","VLTy6okgRi","FhtglJRJQB","LewvM8cVD3","7ku1ph1zcH","tAOsr2hEEU","euZA5UmaEv",
+"soy9tiqv4k","zqH0WHRxd8","rhl0JQYxC0","aez9yCxVEf","5nmWvmz8gx","Q6LixECMvU","NOHsz0BmCy","XyPZNlsQGo","pWiOsTwano","Ul4a1ix74r",
+"RxrsmfLNg8","yEfy9rz7Ut","oGu6xiqv4k","8xEKzX6Pin","QYxC0VIlwP","atef2S2Dfu","pAhR1QssNC","sqVrfGSQwj","JKWYRv2eC3","9GXkXvkCHH",
+"Ul4a1OUqFM","OxWIHO3iyQ","O3iyQFnPFB","0MR5Xv1Hln","OxWIHVjCZq","he9IA07n1c","n1pmOksJby","D6rByChuy3","wiHrZfaHir","dQ586WreyP",
+"Gv3FqNcICA","CqqaDkZANm","pmeCdsx5Gl","iwzGkReKEW","Mm8siRmDcr","jzUqRi7WMQ","WaWsvSWfou","StlDJX6Pin","euZA5RBhp0","IBe8kFGzgp",
+"7ku1pLDk6f","5Mg9rChuy3","FNYIMVIlwP","NcICAVBjhz","VBjhzYf2Ec","KASQ8djsrv","zqH0WEdBKc","Pb1paBCxeC","uZPqgbZLvS","jtn0XfLNg8",
+"zQt6QC2Irc","0Kyfs16lHc","AkKTkStlDJ","ZuDtDgtCA5","JJs5myToGW","5Drn0EOE1o","lH1ktGXdoH","dpe1v2Nslm","yofH3cmXIX","CNHmvqaofN",
+"16lHcZUnqt","wDajXdhSuH","cQOnvThjNn","lkMUABpYhV","L7cGc07n1c","v2eC3fmIK1","lH1kt24ARF","S77LHfLNg8","2Yz7EuJScX","nlaByFcWrW",
+"FLsphuN6r3","ix74rCp3mZ","2hEEU7fKYU","lH1ktVLTy6","v8yFNRzaZA","yEfy9CNHmv","yEfy9UmaEv","QYxC0zHF1q","QClRLJKWYR","OHaBzO3iyQ",
+"SWfouJXljW","DG4sTO3iyQ","i3pydiwzGk","VjCZqcmXIX","aDGtSoGu6x","Q6LixStlDJ","s93MlYOfrY","DG4sTdjsrv","VjCZq0PktI","SmGzvI7p2a",
+"jtn0XJ2mQi","okgRiAOgEe","GSQwj8U2nU","nlaByciuWz","M6qcGYOfrY","tAOsr1v5hH","dmoS78cVD3","ZUnqtTa8f6","Cfgr3vkCHH","nnP8orKDLJ",
+"618DijfREu","nnP8oStlDJ","nlaByyluBx","yofH3SWfou","5drc62Yz7E","uQIczYh1hF","GSQwjZ4I1v","D6rByFGzgp","dQ586lXFOB","WaWsvMGlTF",
+"RkQke24ARF","0MR5XzmLYD","D6rBynFqik","yofH3pT8wu","ydG8UZhwG1","5Mg9rrz7Ut","gtCA55iGN5","Pb1paru4UG","QChxsbrhlQ","TXQ0ZUmaEv",
+"lH1ktRBhp0","CIShGuPX7G","mz8gxokgRi","0PktICK5W7","djsrvF6PT2","FLsphxciqp","RBhp0zFgtB","zmLYDChuy3","VIlwPlj07Q","Gv3FqHP433",
+"hUTw7Yf2Ec","jtn0Xru4UG","yofH3YjB9t","U3yw5a00b5","dpe1vHRxd8","hUTw7Dz1R3","FhtglkZANm","Ta8f6vLsmS","he9IAtuDyS","2hEEUa00b5",
+"ReKEWSWfou","U3yw5KASQ8","16lHclXFOB","ThjNnuAWyp","M6qcG0ao3l","RpBQmECMvU","AgJHQIKxdL","SjskQTwano","B3qemLDk6f","Pb1pa5IhmG",
+"24ARFwDajX","xXTI4Ss0Zu","EOE1oHzZT8","QssNCBbwgA","fcwDaW7cTs","GSQwjt59lR","fcJOyFwEJz","5iGN58FmFH","16lHczFgtB","B3qem8xEKz",
+"LewvMpAhR1","tvdkDv8yFN","7X3uyuN6r3","Chuy3jSjS3","tAOsr0PktI","9GXkXNhXdu","gdQsSYOfrY","5Drn0d7vjM","vLsmS1LB1L","ni2v1dmoS7",
+"rKDLJMmKGJ","5ZaEzJ2mQi","2ZHdkvLsmS","X6PinQssNC","d85a94W0Tl","blLA9CIShG","FVMxo0MR5X","SjskQlm0pD","5IhmGix74r","FFDuiCqqaD",
+"fmIK1qQxHP","S2Dfujtn0X","Kr8ysFGzgp","Gv3FqJRJQB","55rfBKASQ8","FLsphlm0pD","3otm6jtn0X","9GXkXJJs5m","6q6L9he9IA","0Wr5ypvgjS",
+"FLsph0Kyfs","QbxXctjQxs","y94nwyofH3","piJSkk85Ae","lsQGoUvlv4","55rfBd85a9","HzZT8Mm8si","zmLYD0ao3l","zHF1quAWyp","Q6hMCEdBKc",
+"jiVBPaez9y","7Ow5CYf2Ec","F6PT2sx5Gl","tAOsrCfgr3","Pb1paksJby","2hEEU0YAGH","uAWypAgJHQ","tvdkDAgJHQ","tl72W8hJdt","lkMUACfgr3",
+"d7vjMo8Uyd","hYBCKHP433","oVQp6Q6hMC","suY4xQworu","BGaQYjzUqR","QClRLgIYvE","BCxeCDG4sT","FFDuiAXpwE","l83UddhSuH","5Mg9rwiHrZ",
+"tvdkDBGaQY","Y1mC08FmFH","0YAGHYjB9t","3weIFblLA9","VBjhzRBhp0","Ul4a1n8pJ9","WaWsvZhwG1","a00b5618Di","iKqhrSWfou","o8Uydfqypy",
+"CK5W764s8N","rKDLJJKWYR","XflUqn8pJ9","5iGN50BmCy","tAOsrHP433","0ao3lQClRL","fFDrJsuY4x","QssNC8hJdt","QbxXc5IhmG","HzZT8D6rBy",
+"NAFuwulk41","GXdoHIBe8k","2hEEUpvgjS","8FmFHfqypy","o8UydlH1kt","5Mg9rfcwDa","lweGysx5Gl","CK5W7GWqqX","lweGyMmKGJ","ydG8US2Dfu",
+"7ku1pSmGzv","FPfSEgf8rI","618DizY1GY","618DiEoToP","tlILtQnJ1S","9eoRc1j5L8","qQxHPaL6AJ","Cfgr3W3VFH","oQ87rS2Dfu","Cfgr30MR5X",
+"rhl0JMGlTF","Cp3mZsqVrf","RmDcrOz8yZ","pmeCdPYBf4","pvgjSTa8f6","5iGN516lHc","MmKGJRBhp0","S2DfuQbxXc","YOfrYhYBCK","24ARF0YAGH",
+"b29RJQClRL","Ta8f6pFrrl","pT8wu3weIF","uoStwJJs5m","L7cGcSmGzv","uvf7AZzJHW","hYBCKC2Irc","jeskSuJScX","ECMvUulk41","n8pJ9ogLgc",
+"No0QbDLhzM","rKDLJPYBf4","gf8rIv2eC3","i3pyds4786","ECMvUGWqqX","FnPFBjzUqR","kB5nPzbIYY","oQ87rd85a9","14FLRFxX9q","1LB1LkB5nP",
+"GrDg7BCxeC","0ao3lGWqqX","fFDrJv2eC3","gdQsSPYBf4","uN6r3ciuWz","bZLvSn8pJ9","CK5W7Waim6","KZamHuPX7G","lViBvfLNg8","FLsphQ6hMC",
+"PYBf4ECMvU","nnP8on1pmO","AkKTkhYBCK","x3LDe24ARF","Yh1hFD6rBy","okgRiGv3Fq","0Wr5yHfyNQ","gjUTu3weIF","GXdoHQ6Lix","tvdkDgf8rI",
+"HlUbFsqVrf","9rlg9C2Irc","C2IrceuZA5","aez9ynlaBy","M6qcGoGu6x","IRh48ciuWz","SmGzvs7Mxk","faHirRsQUq","16lHcFPfSE","rhl0JuPX7G",
+"618Didjsrv","EOE1oZJTXH","OxWIHtlILt","tlILtlsQGo","zz4ZU5IhmG","jiVBP7hyVv","tuDySSbRYy","3weIFG1RhS","BCxeCQworu","RxrsmuAWyp",
+"BFkb8oVQp6","pv0i7pWiOs","0BmCyo8Uyd","W3VFHUvlv4","FVMxoMojnP","iKqhrxciqp","4QMc9gtCA5","Cp3mZZuDtD","MaJQsO3iyQ","Cfgr3zmLYD",
+"uTacxIBe8k","DcpWBZzJHW","ciuWzfcwDa","fcwDauTacx","k85AeDQimp","zqH0WbrhlQ","pAhR10MR5X","8cVD3ZuDtD","5NammaL6AJ","uupzkWaWsv",
+"2TRI7dpe1v","euZA5azIWp","fLNg8dpe1v","oGu6xtaOXK","CxVEfRpBQm","14FLRSjskQ","dpe1v64s8N","2NslmlH1kt","dpe1v0BmCy","bgJAzJJs5m",
+"i7WMQ7ku1p","GSQwjMezSW","C2IrcgjUTu","tjQxswiHrZ","SjskQsuY4x","K4GS8zmLYD","MaJQsCK5W7","QssNCgdQsS","lH1ktFNYIM","gIYvEYf2Ec",
+"ReKEW7hyVv","TXQ0Zdjsrv","sqVrfqaofN","IRh48qUJMd","Yh1hFW3VFH","xciqp2Yz7E","lj07QoQ87r","atef2x3LDe","0MR5XQworu","AgJHQe6e4z",
+"CqqaDtAOsr","uvf7Ahi5X7","FjHXRcQOnv","Mkgy8F6PT2","5nmWvGXdoH","fqypypv0i7","lsQGoI7p2a","jzUqR2TRI7","W3VFHStlDJ","iB08lCfgr3",
+"d7vjMprNT6","POUYSiwzGk","RkQkeD6rBy","QnJ1S5iGN5","qUJMdkB5nP","uTacxdQ586","BCxeCOz8yZ","RpBQm7fKYU","jzUqR8RCUA","CdyBV0ao3l",
+"ogLgcdmoS7","7X3uyQ6hMC","y94nwNo0Qb","5Drn0l83Ud","kZANmZhwG1","cmXIXRpBQm","S2DfuQnJ1S","RpBQm1j5L8","sqVrfBpYhV","DQimpMojnP",
+"hYBCKjfREu","uZPqghYBCK","HfyNQWmadA","suY4xBCxeC","Chuy3rhl0J","7X3uyCdyBV","gIYvEVIlwP","QWxoTvOqCE","cQOnvFjHXR","UlU3ML7cGc",
+"P6bcgUl4a1","9XyT9zFgtB","3otm6uoStw","ECMvUZJTXH","XflUq618Di","RkQke5ZaEz","JIqXi6AFT0","7ku1pU3yw5","yofH3J2mQi","9y4lwQWxoT",
+"1v5hH8xEKz","FcWrWuupzk","QnJ1S580YD","uAWypaFFss","Yw2oU2TRI7","lsQGojSjS3","S77LHru4UG","fcwDaRzaZA","hYBCKjiVBP","hUTw73weIF",
+"FPfSEX6Pin","9GXkXW3VFH","lsQGo2ZHdk","pWiOspmeCd","oVQp6WPmlx","7hyVvzQt6Q","ZJTXHk85Ae","K4GS8DLhzM","FxX9qTXQ0Z","pT8wuZUnqt",
+"WPmlxQYxC0","s7MxkuQIcz","Yw2oUhi5X7","GWqqXReKEW","tlILtZzJHW","fLNg8suY4x","QnJ1Ssx5Gl","UmaEvyEfy9","DQimp4dEz6","iKqhrI7p2a",
+"Ul4a1jfREu","oVQp6nlaBy","xReec7fsYM","yvOMIaez9y","AkKTk4dEz6","fLNg8KZamH","0Wr5yB3qem","In3NScL0aE","3weIFJIqXi","sqVrf7fKYU",
+"5NammpvgjS","ciuWzFcWrW","lCMxys4786","gdQsSRzaZA","FwEJzEdBKc","tlILt5ZaEz","zz4ZUxXTI4","hi5X724ARF","0ao3l5Drn0","hi5X7TXQ0Z",
+"VerEAAkKTk","xReec2hEEU","Chuy348cHL","aDGtS5drc6","jfREu5Drn0","7ku1ps93Ml","L7cGcsx5Gl","MezSW580YD","gdQsSatef2","uupzkdmoS7",
+"FGzgpzHF1q","zQt6QSmGzv","hE1QlBCxeC","CxVEflsQGo","JKWYRUvlv4","uJScX4QMc9","2Yz7E5Mg9r","BCxeCWDVWJ","JkzUnVIlwP","JIqXiDLhzM",
+"Ss0ZuCxVEf","wiHrZjtn0X","55rfBix74r","Y1mC0CqqaD","CdyBVzFgtB","s93Mlhi5X7","7hyVvuQIcz","uoStwKZamH","Kr8ys0Wr5y","cQOnvUl4a1",
+"n8pJ9pWiOs","5drc67Ow5C","5nmWv6q6L9","v8yFNbZLvS","2hEEUfqypy","sqVrfpvgjS","l83UdCIShG","LbRTHMaJQs","aFFssxReec","YOfrYi7WMQ",
+"kZANm0BmCy","tvdkD07n1c","rhl0JtlILt","KASQ8L7cGc","vLsmSfcJOy","2DREsCNHmv","DLhzMMojnP","580YDDz1R3","faHirt59lR","tvdkDYjB9t",
+"HP433gIYvE","s7MxkgdQsS","8RCUAd85a9","B3qemuQIcz","VjCZqyluBx","C2IrccShY2","ZJTXH0MR5X","aL6AJ5ZaEz","faHirXyPZN","CxVEfRsQUq",
+"0MR5X9GXkX","WaWsvNo0Qb","qaofNFLsph","oQ87rjtn0X","ZUnqtCdyBV","Dz1R3CK5W7","1LB1LQ6Lix","yToGW48cHL","GWqqXJXljW","PYBf4NAFuw",
+"TXQ0ZWmadA","VIlwPtjQxs","zHF1qzHF1q","5IhmG5ZaEz","lsQGopiJSk","gtCA5hYBCK","7ku1p07n1c","ni2v1VNCPd","BpYhV45cIH","PYBf4BGaQY",
+"fFDrJIBe8k","azIWpMK07Y","lj07QydG8U","jiVBPPYBf4","Kr8ysSjskQ","VNCPdVBjhz","k85Aepv0i7","2TRI7X6Pin","4dEz6hYBCK","a00b5jtn0X",
+"WPmlxMkgy8","VLTy6jS1aj","AkKTk2ZHdk","Mm8siRzaZA","W7cTsCxVEf","OUYuFtjQxs","soy9tsqVrf","D6rBypT8wu","24ARFzz4ZU","TXQ0Z5IhmG",
+"I7p2afFDrJ","bgJAzhUTw7","Y1mC00BmCy","Kr8ys0YAGH","7hyVvGXdoH","nFqikzFgtB","I7p2aYOfrY","MezSW7fsYM","NAFuwd85a9","WmadAjS1aj",
+"d7vjMIRh48","rhl0JyofH3","VLTy6tjQxs","0BmCy8TxD7","5VZjSF6PT2","Yh1hFJIqXi","WmadAWDVWJ","uZPqgSs0Zu","O3iyQQworu","RpBQmyluBx",
+"pT8wuvOqCE","CdyBVfaHir","EoToPG1RhS","o8UydNOHsz","0BmCyjzUqR","EOE1o45cIH","8FmFHtAOsr","HlUbFbZLvS","No0QbpT8wu","pvgjSt98iW",
+"ZhwG1cQOnv","8U2nUl83Ud","piJSkFxX9q","7Ow5COUqFM","M3zXLQworu","NAFuwUmaEv","5IhmGrhl0J","GSQwjJXljW","DQimpzY1GY","9y4lw7X3uy",
+"jeskSo8Uyd","IRh48QnJ1S","Yh1hF0BmCy","ECMvUOUqFM","0YAGH0PktI","48cHLHzZT8","piJSkYf2Ec","fcwDa5drc6","jfREuCfgr3","pv0i7S77LH",
+"6AFT02hEEU","7hyVv5drc6","SWfou2Nslm","BbwgAvkCHH","HP433euZA5","Y1mC0Oz8yZ","OUqFMYw2oU","cmXIXjtn0X","FjHXRt59lR","jtn0XguMb8",
+"kB5nPYjB9t","okgRiy94nw","SmGzvi7WMQ","FLsphlj07Q","W3VFHe6e4z","EOE1osuY4x","VBjhzcShY2","0KyfsDz1R3","gjUTuQYxC0","8RCUAcmXIX",
+"2Yz7Ee6e4z","HRxd8ksJby","5iGN57hyVv","DG4sTZhwG1","FLsphCNHmv","hSSvQL7cGc","BGaQYMezSW","KZamHRxrsm","hUTw7kB5nP","2Nslmatef2",
+"IRh48nnP8o","gjUTu5ZaEz","uAWyplXFOB","M3zXLEdBKc","NcICAaL6AJ","TXQ0ZM3zXL","GXdoH29QAz","8TxD7Dz1R3","cShY2oQ87r","CIShG0BmCy",
+"AmdQdzFgtB","KZamHgf8rI","NhXduVLTy6","RBhp0VjCZq","m4bxU5iGN5","t59lRaL6AJ","Q6hMCWaWsv","i7WMQX6Pin","iKqhrxReec","AgJHQzY1GY",
+"yEfy9yluBx","45cIHyToGW","yvOMIguMb8","1j5L8618Di","NhXduU3yw5","lj07Q580YD","XyPZNt59lR","QClRLvOqCE","cmXIXWaWsv","Vprf2OxWIH",
+"dmoS7CK5W7","1LB1L45cIH","GrDg7BbwgA","29QAzlCMxy","zFgtBgIYvE","No0QbuAWyp","VerEAPYBf4","ni2v1PYBf4","qaofN3otm6","SbRYyzmLYD",
+"jfREuW7cTs","iKqhrQWxoT","rhl0JMezSW","AOgEeJRJQB","1LB1LyofH3","Z4I1vNhXdu","2TRI7ciuWz","1v5hH7lUXZ","fmIK1ZuDtD","a00b5MojnP",
+"8RCUAEoToP","WPmlxI7p2a","fmIK1W7cTs","5Drn0zmLYD","FPfSEFxX9q","lsQGoQChxs","MK07YkZANm","JKWYR0MR5X","QnJ1Sni2v1","CdyBVG1RhS",
+"aFFssv1Hln","ZUnqtuN6r3","ogLgcGv3Fq","euZA5Mkgy8","OUYuFMGlTF","hUTw7CxVEf","QYxC06q6L9","djsrvPb1pa","0MR5XWaWsv","t98iWlViBv",
+"5iGN545cIH","YjB9tUlU3M","XflUq5Namm","gtCA5Dz1R3","P6bcgZzJHW","GXdoHWPmlx","TCgPpqaofN","Yf2EcYjB9t","BpYhVfaHir","RBhp0JXljW",
+"ru4UGNo0Qb","UlU3M0Wr5y","uN6r3x3LDe","b29RJsqVrf","jtn0XlViBv","zqH0WRACuj","IjTwPCNHmv","CIShGsuY4x","SmGzv2ZHdk","IBe8kD6rBy",
+"JkzUn4QMc9","7fsYMi7WMQ","CdyBVChuy3","ECMvUPYBf4","VjCZq5Mg9r","qaofNuAWyp","8FmFHDQimp","lkMUAa00b5","1v5hHzmLYD","YjB9tAgJHQ",
+"NcICAJIqXi","FhtglHfyNQ","RxrsmMmKGJ","cmXIXFPfSE","SmGzvIBe8k","hE1Qla00b5","gdQsSXflUq","GrDg7t98iW","vkCHH6AFT0","5NammbZLvS",
+"gdQsSAgJHQ","ksJbyOHaBz","lH1ktmz8gx","1LB1LuN6r3","ix74rx3LDe","tlILtZ4I1v","OHaBzBbwgA","MK07YNo0Qb","5Mg9rNcICA","9rlg9sx5Gl",
+"DG4sTVjCZq","fmIK1lj07Q","MmKGJWaWsv","SmGzv7X3uy","ZhwG1t98iW","D6rByCIShG","WaWsvHP433","TXQ0Z24ARF","7fsYMlsQGo","OxWIHIjTwP",
+"7Ow5C5nmWv","6q6L9RzaZA","RsQUqtuDyS","BpYhV2Nslm","BGaQY7Ow5C","RsQUqaDGtS","3weIF45cIH","FjHXRQssNC","bZLvSzHF1q","pWiOsCqqaD",
+"WDVWJ07n1c","RmDcrfcwDa","gdQsS48cHL","6q6L9LbRTH","CIShGJkzUn","CdyBVYf2Ec","WmadA64s8N","rhl0Jsx5Gl","OHaBzFGzgp","XflUqTa8f6",
+"fLNg8euZA5","W7cTs5iGN5","MK07YHfyNQ","No0QbzHF1q","0h1b15Mg9r","Waim6Mkgy8","ZJTXHguMb8","lsQGoVprf2","s93Mld85a9","yToGWdQ586",
+"3weIFix74r","tl72WW7cTs","BFkb8RmDcr","dmoS7s93Ml","2TRI7uTacx","VBjhzjSjS3","tlILt8RCUA","jtn0XFhtgl","he9IAru4UG","0BmCyJJs5m",
+"FwEJz5drc6","jtn0X16lHc","RpBQmsqVrf","4QMc9uQIcz","dmoS7VNCPd","29QAz9GXkX","uQIczd7vjM","U3yw5t59lR","uvf7AaFFss","gjUTuWDVWJ",
+"FGzgphe9IA","2ZHdkTwano","sx5GlBCxeC","oVQp6jiVBP","pFrrlEoToP","dmoS7YOfrY","zFgtBPYBf4","b29RJBbwgA","IKxdLsqVrf","J2mQiAkKTk",
+"ECMvUyvOMI","UlU3MVjCZq","EOE1oECMvU","rhl0J9y4lw","P6bcgQ6hMC","NAFuwY1mC0","5nmWvTCgPp","NOHsz1j5L8","KZamHJ2mQi","ulk4145cIH",
+"QbxXczqH0W","GWqqXSjskQ","ulk41FFDui","rKDLJ5iGN5","okgRin1pmO","qUJMdokgRi","tl72W9XyT9","J2mQiXyPZN","3weIFCxVEf","PYBf41LB1L",
+"zqH0WCK5W7","piJSkAXpwE","AIYUuNAFuw","5nmWv48cHL","MGlTFyEfy9","faHir07n1c","0Kyfs0Kyfs","okgRiFFDui","iwzGkuoStw","7hyVvO3iyQ",
+"2NslmaDGtS","Cp3mZFnPFB","Waim6tAOsr","x3LDelH1kt","ZJTXHNAFuw","uN6r3FnPFB","CdyBVQnJ1S","EoToPRkQke","2Yz7Etl72W","FVMxogjUTu",
+"GrDg7K4GS8","5iGN5KASQ8","Vprf2yvOMI","AXpwEvOqCE","GWqqXqQxHP","MGlTFpWiOs","MmsIoOUYuF","0BmCyni2v1","uvf7AVjCZq","0Wr5yMojnP",
+"oQ87rnFqik","XflUqBGaQY","pv0i7oQ87r","IRh48W3VFH","2ZHdkFLsph","Dz1R3RACuj","cL0aEcQOnv","IjTwPLewvM","7fKYUIBe8k","uN6r3Nxx9V",
+"AgJHQWDVWJ","t59lRM3zXL","0KyfsgIYvE","s4786VjCZq","1LB1L5drc6","faHirUl4a1","DG4sTUlU3M","2TRI77X3uy","a00b5hSSvQ","jzUqR24ARF",
+"aL6AJ0MR5X","SbRYyS2Dfu","Cfgr3qUJMd","8RCUADQimp","t59lRCdyBV","uvf7ACIShG","DLhzMlH1kt","tl72Wv1Hln","KZamHNo0Qb","uN6r3cShY2",
+"faHirECMvU","CxVEfUl4a1","MmsIoPYBf4","IRh48Oz8yZ","Uvlv4MGlTF","9iGoT4dEz6","QWxoT9XyT9","MGlTFKr8ys","brhlQU3yw5","BCxeCMK07Y",
+"v1Hln9GXkX","jeskS7fsYM","Cp3mZpmeCd","45cIHFwEJz","MojnPJRJQB","piJSk2Nslm","ZuDtDatef2","Oz8yZCdyBV","ksJbyciuWz","9rlg91LB1L",
+"8FmFHFxX9q","s7MxktlILt","rKDLJMm8si","qQxHPTCgPp","fmIK1jiVBP","tvdkDZhwG1","i7WMQcQOnv","8RCUAazIWp","uoStwQ6hMC","BpYhVpWiOs",
+"X6PinQbxXc","fqypy07n1c","ksJbynlaBy","IBe8krhl0J","kB5nPC2Irc","lXFOBZJTXH","VIlwP2Yz7E","sx5GlPb1pa","4W0TlhUTw7","vkCHHZv7z0",
+"zmLYDOUYuF","LbRTHVprf2","HRxd89GXkX","l83Ud7ku1p","1v5hHru4UG","yluBxWPmlx","OHaBzpv0i7","SjskQatef2","dmoS7MK07Y","OHaBzSWfou",
+"hYBCKwDajX","RACujnnP8o","BFkb8n1pmO","RBhp0X6Pin","v1Hlndjsrv","LewvMZuDtD","8U2nUxXTI4","Ss0ZuYf2Ec","FPfSEulk41","Ul4a1cShY2",
+"YOfrYv1Hln","dQ586gIYvE","v8yFNfqypy","ECMvUatef2","uTacx8hJdt","iwzGkFwEJz","jSjS3CK5W7","uTacx5VZjS","XflUqZv7z0","580YDFnPFB",
+"uN6r3FcWrW","AXpwEQworu","MaJQsIn3NS","FLsphI7p2a","ciuWzFFDui","8RCUAi7WMQ","9GXkXMaJQs","hSSvQMezSW","FLsphwDajX","fcJOyQbxXc",
+"BCxeC0Wr5y","hUTw7oVQp6","MaJQsv8yFN","8FmFHZJTXH","RmDcr0ao3l","UlU3MtuDyS","6q6L9b29RJ","v2eC37Ow5C","Ul4a1HfyNQ","QChxs2hEEU",
+"2ZHdk7fKYU","jtn0XWDVWJ","NAFuw3weIF","2ZHdkguMb8","ReKEWgjUTu","JIqXiG1RhS","tlILtpT8wu","XflUqHlUbF","HfyNQAkKTk","580YDx3LDe",
+"1j5L8FcWrW","9rlg9lsQGo","ru4UGFFDui","ix74rRmDcr","55rfBZuDtD","oQ87rStlDJ","k85Aev8yFN","pFrrlfaHir","lkMUAK20wK","24ARFBbwgA",
+"MK07Y5nmWv","3otm6tuDyS","FPfSEP6bcg","NOHszuQIcz","RACujt98iW","DG4sTzmLYD","ZUnqtXyPZN","lViBvUmaEv","FNYIMTa8f6","HzZT8FjHXR",
+"WmadARsQUq","1LB1Lt59lR","b29RJaez9y","ThjNnIRh48","J2mQiMGlTF","EdBKctl72W","MezSW0BmCy","7ku1ppiJSk","aDGtSlXFOB","VjCZqokgRi",
+"hE1QlgIYvE","jfREuZuDtD","BCxeC1LB1L","tvdkDo8Uyd","ThjNnP6bcg","FLsphn1pmO","tlILtrhl0J","zFgtBsx5Gl","tAOsr4W0Tl","yToGW6AFT0",
+"uLtKsY1mC0","DQimpLDk6f","v1HlnX6Pin","jiVBPP6bcg","zz4ZU7fsYM","7hyVvAXpwE","azIWpuupzk","zmLYDbgJAz","7hyVvU3yw5","1j5L8yvOMI",
+"UlU3MhSSvQ","Ul4a1HlUbF","zHF1qZuDtD","Rxrsm5IhmG","LewvMuPX7G","RsQUqMkgy8","QChxs7lUXZ","AOgEeulk41","dmoS7OxWIH","2NslmvkCHH",
+"l83UdFLsph","h1zcHOUqFM","8TxD77ku1p","vLsmS2Yz7E","s7MxkLbRTH","HRxd8hUTw7","O3iyQ8FmFH","jiVBPKZamH","WMiS3aez9y","QnJ1SCp3mZ",
+"Cfgr3sqVrf","pv0i748cHL","RpBQmRACuj","lViBvlXFOB","7fKYUpmeCd","5drc6gtCA5","QworuBbwgA","16lHcyToGW","s4786SmGzv","ix74r9y4lw",
+"nFqiklkMUA","YjB9trhl0J","qUJMdDQimp","qQxHPQClRL","55rfBK20wK","IRh48S77LH","jtn0X9y4lw","yluBx2ZHdk","VBjhztvdkD","cmXIXuQIcz",
+"VLTy6lH1kt","55rfB5Drn0","e6e4zciuWz","xReecJXljW","CxVEfpAhR1","Chuy3FGzgp","TXQ0ZCK5W7","EOE1owiHrZ","qUJMdfFDrJ","3weIFWPmlx",
+"h1zcH6q6L9","sx5GlZJTXH","3otm6VerEA","JkzUncL0aE","9y4lwjiVBP","KASQ8DQimp","fmIK1d7vjM","ZJTXHRsQUq","Q6hMC9y4lw","SmGzvGXdoH",
+"fqypyOHaBz","J2mQiiKqhr","JRJQBRkQke","fcJOy0Kyfs","WmadA7fKYU","mX2GEuTacx","14FLRCfgr3","Waim6hSSvQ","v2eC3jzUqR","Yh1hFQChxs",
+"8hJdtEoToP","CK5W707n1c","IjTwPHfyNQ","b29RJIRh48","LbRTHJRJQB","DG4sT9XyT9","0PktIFxX9q","Ul4a15Mg9r","a00b51j5L8","jS1ajBpYhV",
+"POUYSL7cGc","lsQGoFhtgl","Vprf2gdQsS","zbIYYTa8f6","cShY2LewvM","zbIYYuAWyp","Gv3Fq29QAz","uoStwEOE1o","WmadAkZANm","7fKYUrKDLJ",
+"zz4ZUguMb8","d85a9GrDg7","NAFuwPYBf4","aDGtS8xEKz","dhSuHQ6Lix","FVMxouZPqg","VNCPdtjQxs","Yw2oUFLsph","cmXIXCp3mZ","GrDg7n8pJ9",
+"azIWpSmGzv","FxX9qiqv4k","Kr8ysVNCPd","64s8Na00b5","OUYuFuN6r3","TXQ0ZDLhzM","oVQp6hi5X7","KZamHlH1kt","580YDFcWrW","LbRTH1j5L8",
+"K20wKtl72W","64s8NW3VFH","AIYUubgJAz","s4786ECMvU","G1RhSmz8gx","xXTI4lweGy","zHF1qsuY4x","1LB1LBFkb8","mX2GEDG4sT","ThjNnaL6AJ",
+"SmGzvMm8si","AmdQdCxVEf","DQimpF6PT2","2Yz7EOxWIH","45cIHhe9IA","tjQxshYBCK","lm0pDoVQp6","48cHLDcpWB","AkKTkQClRL","y94nw4dEz6",
+"8RCUASjskQ","gtCA5SbRYy","uupzkFNYIM","5Nammk85Ae","t59lR7ku1p","JKWYRD6rBy","1LB1LMK07Y","MGlTFAkKTk","uN6r3RmDcr","OUYuFzmLYD",
+"Vprf2AOgEe","QWxoT48cHL","VBjhzni2v1","Mkgy80Wr5y","vLsmSIjTwP","0h1b1zQt6Q","2NslmX6Pin","ix74rDz1R3","NOHszru4UG","OUqFMkB5nP",
+"S2DfuECMvU","K4GS8rKDLJ","jeskShYBCK","JJs5mLDk6f","GSQwjUl4a1","yluBxRxrsm","vkCHHt59lR","uQIcz5iGN5","HfyNQ0BmCy","IBe8kDz1R3",
+"okgRiSs0Zu","S77LHEoToP","yToGWVLTy6","FhtglNOHsz","Kr8yslj07Q","xReecQnJ1S","W3VFH8TxD7","4QMc9BGaQY","YOfrYAOgEe","LbRTH5iGN5",
+"WMiS3v1Hln","KsjRK7fKYU","aDGtSFLsph","AkKTkprNT6","rKDLJRxrsm","HlUbFydG8U","ZJTXHgdQsS","CqqaDCIShG","gtCA5AkKTk","4dEz6GXdoH",
+"oGu6xpAhR1","ThjNnRxrsm","dmoS7618Di","0YAGHi7WMQ","QClRLsoy9t","v1Hlnhi5X7","580YDNo0Qb","lpF6WsuY4x","S77LHfqypy","lH1ktGSQwj",
+"DLhzMVLTy6","uN6r3yEfy9","Yf2EcGSQwj","bZLvShi5X7","5iGN5jzUqR","lpF6WkB5nP","D6rByokgRi","hSSvQD6rBy","yluBxX6Pin","CIShGoQ87r",
+"euZA5ksJby","8hJdtDQimp","5ZaEz5Drn0","RmDcrm4bxU","s7Mxk5ZaEz","Chuy3S77LH","v2eC3zbIYY","ZuDtD3weIF","fFDrJK20wK","9iGoTUmaEv",
+"07n1cmz8gx","piJSkNxx9V","QbxXcuPX7G","P6bcgKr8ys","FNYIMdpe1v","4W0TlK20wK","yvOMIFnPFB","gtCA5lCMxy","QbxXc5Namm","lXFOBgf8rI",
+"xXTI4uAWyp","FnPFBAXpwE","n1pmOxXTI4","cL0aEzY1GY","MGlTFTXQ0Z","G1RhSydG8U","tlILtGSQwj","fLNg8lH1kt","mX2GEuJScX","kZANmdQ586",
+"vOqCEulk41","cShY2gIYvE","lj07QVerEA","XyPZNTa8f6","Ta8f6xciqp","prNT6tjQxs","IKxdLGv3Fq","FFDuit98iW","SmGzvY1mC0","RmDcrIBe8k",
+"FxX9qfFDrJ","m4bxUiqv4k","gf8rIKASQ8","aDGtSGSQwj","QWxoTtvdkD","Oz8yZ9iGoT","jtn0XJIqXi","5VZjSQYxC0","I7p2a2Nslm","MGlTFWaim6",
+"0BmCylCMxy","hYBCKuPX7G","fLNg8zY1GY","zz4ZUlweGy","prNT6HRxd8","14FLRMGlTF","POUYS48cHL","GWqqXBGaQY","sx5GlqUJMd","XyPZNv2eC3",
+"BGaQYQYxC0","C2Ircdjsrv","v8yFNVLTy6","RmDcrx3LDe","piJSkPYBf4","gIYvEfcJOy","6q6L9gf8rI","he9IAaFFss","Yw2oUiwzGk","n8pJ9Vprf2",
+"lH1kt0BmCy","wiHrZYjB9t","k85AepiJSk","GSQwjWMiS3","QWxoT9eoRc","gIYvEqaofN","VNCPdOUqFM","yvOMIL7cGc","C2IrcnlaBy","48cHL8U2nU",
+"kB5nPogLgc","2hEEUpAhR1","MK07Y8FmFH","nlaByuLtKs","MGlTFciuWz","8cVD3jiVBP","oGu6xCNHmv","hi5X7s93Ml","MaJQsDcpWB","nnP8ol83Ud",
+"P6bcg8RCUA","pT8wulXFOB","FLsph0YAGH","ReKEWcShY2","GWqqXBCxeC","JIqXizQt6Q","TCgPpbZLvS","CK5W7bgJAz","lsQGoXflUq","NcICAhi5X7",
+"YjB9tKsjRK","gtCA5zqH0W","OHaBzvLsmS","EdBKcoQ87r","dhSuHIn3NS","soy9tK20wK","aDGtSD6rBy","LewvMMaJQs","euZA5GXdoH","P6bcgEOE1o",
+"l83UdxXTI4","tuDySMmKGJ","Ta8f6pv0i7","NcICAWPmlx","9GXkXMGlTF","jtn0XQworu","Dz1R3AmdQd","uLtKsI7p2a","aL6AJBpYhV","Ul4a1Qworu",
+"29QAzRpBQm","FGzgp618Di","5Mg9rHzZT8","S77LHdmoS7","hSSvQuLtKs","9iGoTIjTwP","cmXIXP6bcg","QnJ1S8hJdt","EdBKc3otm6","lViBvhE1Ql",
+"pT8wuD6rBy","dhSuHAgJHQ","oQ87rx3LDe","C2Ircrhl0J","CxVEfMGlTF","Pb1pazY1GY","zqH0WciuWz","gtCA5618Di","d7vjMjeskS","0h1b1NcICA",
+"e6e4zBFkb8","zQt6QcShY2","b29RJgf8rI","CxVEfNAFuw","Y1mC0mX2GE","XyPZNGWqqX","TCgPpuupzk","NAFuw48cHL","zFgtBdhSuH","ECMvUHRxd8",
+"7Ow5CKZamH","JXljWYOfrY","bZLvSOUYuF","fFDrJ0Wr5y","iB08lF6PT2","VNCPdKsjRK","uN6r3qaofN","ciuWzyToGW","suY4xlj07Q","1v5hHprNT6",
+"piJSkCp3mZ","iB08ljzUqR","tuDyS4dEz6","kZANm8cVD3","jSjS3FnPFB","uAWypJXljW","l83Udy94nw","BGaQYMkgy8","lweGy5ZaEz","lpF6W5nmWv",
+"14FLRsuY4x","BpYhVfLNg8","dhSuHHzZT8","B3qem0Kyfs","POUYSjS1aj","vOqCEs4786","MaJQs8hJdt","2Yz7EuZPqg","IRh48lH1kt","EoToP0YAGH",
+"m4bxUtvdkD","DG4sT5IhmG","piJSk2Yz7E","wiHrZThjNn","XyPZNVLTy6","lsQGogf8rI","YOfrYM3zXL","QChxsRkQke","RBhp03weIF","jSjS3uvf7A",
+"b29RJIBe8k","ZJTXHNcICA","U3yw5hYBCK","jtn0XUmaEv","HfyNQNOHsz","C2IrcdmoS7","FcWrWTwano","OxWIHfcJOy","piJSkmX2GE","24ARFKASQ8",
+"AkKTkuoStw","29QAzGWqqX","azIWpFVMxo","jfREuMmsIo","CNHmvTXQ0Z","KZamH1j5L8","soy9tkZANm","tjQxsfLNg8","HzZT8Yw2oU","jtn0XDG4sT",
+"FNYIMQClRL","KASQ88FmFH","wDajXMGlTF","W3VFHoQ87r","8TxD7YjB9t","a00b5uPX7G","GrDg7Ta8f6","zQt6QQYxC0","gjUTuru4UG","iqv4k7fKYU",
+"b29RJS2Dfu","RsQUqRsQUq","Z4I1veuZA5","FGzgppvgjS","oQ87rUmaEv","lkMUAoGu6x","9iGoT9y4lw","ReKEWru4UG","oQ87r6q6L9","aDGtSfqypy",
+"Chuy3n1pmO","S2Dfu64s8N","qUJMdHzZT8","yEfy9JkzUn","QClRLFwEJz","BbwgAIKxdL","AkKTkECMvU","BbwgA7hyVv","MezSWLewvM","zY1GYJJs5m",
+"MGlTFJJs5m","GXdoHguMb8","7ku1pNcICA","5Drn05ZaEz","RBhp0uvf7A","YOfrYuupzk","CxVEfjS1aj","NOHszlj07Q","SjskQRACuj","RBhp0FxX9q",
+"lCMxyokgRi","5Mg9ruN6r3","IKxdLJIqXi","BpYhVGv3Fq","hUTw7zFgtB","FPfSEy94nw","48cHLtjQxs","tuDySAIYUu","FLsphCIShG","K20wKdjsrv",
+"IRh48OUYuF","uupzkpiJSk","8FmFHBpYhV","ZuDtDdhSuH","ZuDtDzQt6Q","rhl0Jh1zcH","ECMvUcQOnv","piJSk2hEEU","P6bcgAgJHQ","yEfy9P6bcg",
+"Uvlv42Yz7E","1LB1L4W0Tl","rz7UttuDyS","gdQsSl83Ud","Cfgr3QClRL","TwanozY1GY","J2mQioQ87r","piJSkAIYUu","jtn0XDQimp","FFDuiFhtgl",
+"SjskQ2DREs","uQIczFjHXR","CqqaDfaHir","SWfouZv7z0","UmaEvyvOMI","AgJHQ9XyT9","ReKEWF6PT2","55rfBcQOnv","i3pydi3pyd","8RCUASmGzv",
+"7ku1pWaim6","2Yz7EYw2oU","JJs5mFcWrW","CdyBVjS1aj","pmeCd0ao3l","DcpWBogLgc","W7cTs45cIH","WDVWJFwEJz","VBjhzAXpwE","gdQsSm4bxU",
+"QbxXc7X3uy","618DiTCgPp","oQ87rMkgy8","VIlwP64s8N","YOfrYAIYUu","FNYIMO3iyQ","3otm6dQ586","5ZaEz9XyT9","1LB1LDLhzM","QbxXcBFkb8",
+"s7MxkDLhzM","uLtKsDz1R3","soy9tW3VFH","b29RJ4W0Tl","C2IrcUlU3M","kB5nPlj07Q","KsjRKyEfy9","jeskSl83Ud","bgJAzOxWIH","5Drn0Chuy3",
+"S77LHl83Ud","IKxdL3weIF","FcWrWsoy9t","tjQxsVLTy6","VjCZqAkKTk","e6e4z48cHL","JIqXiVprf2","Ta8f6uJScX","JKWYRAgJHQ","0ao3lyToGW",
+"Q6LixlViBv","FhtglyvOMI","s7MxkoVQp6","faHir3otm6","tvdkDvOqCE","M3zXLJJs5m","OUYuFRACuj","AgJHQ4W0Tl","HP433gf8rI","5Drn0euZA5",
+"Yw2oUGWqqX","nlaBy14FLR","MojnP48cHL","UlU3MYw2oU","fqypy0h1b1","euZA5brhlQ","lXFOBtuDyS","8TxD7tAOsr","NhXduGrDg7","sqVrfpWiOs",
+"fcwDapWiOs","MmKGJDG4sT","MK07YXyPZN","6q6L90Kyfs","JkzUnOHaBz","uN6r3WDVWJ","WPmlxgIYvE","FjHXRk85Ae","FjHXRgIYvE","i3pydRxrsm",
+"sx5GlK4GS8","atef2RkQke","ZJTXHO3iyQ","K20wKlH1kt","POUYSzbIYY","RmDcrGSQwj","oGu6xTCgPp","taOXKCIShG","dmoS7BCxeC","NAFuwhYBCK",
+"soy9tRsQUq","5iGN5oVQp6","HfyNQAmdQd","uTacx4W0Tl","0YAGHoQ87r","dmoS7QnJ1S","55rfBRsQUq","JIqXi1LB1L","EOE1oIBe8k","jiVBPqQxHP",
+"Yh1hF29QAz","0PktIwiHrZ","MGlTFDz1R3","pWiOsd7vjM","suY4xSs0Zu","QChxsQ6Lix","nFqikQnJ1S","XflUqHfyNQ","AXpwEJIqXi","xciqpdpe1v",
+"b29RJiKqhr","n8pJ9IjTwP","2Yz7EjeskS","ulk41y94nw","LbRTHyluBx","mX2GE24ARF","CdyBV8FmFH","i3pyddQ586","WPmlxK4GS8","a00b5QChxs",
+"k85AedmoS7","16lHc14FLR","kZANmhE1Ql","RkQkey94nw","64s8NyofH3","FwEJzPb1pa","Mkgy8taOXK","cShY2ulk41","lH1kte6e4z","uLtKsfmIK1",
+"lXFOBZzJHW","hSSvQ9GXkX","L7cGccL0aE","pWiOsFGzgp","RzaZAgtCA5","CqqaDn1pmO","oQ87riqv4k","MaJQs580YD","suY4xNAFuw","zz4ZUTXQ0Z",
+"HP433FFDui","Qworuhi5X7","fcwDaFFDui","JXljW8hJdt","dpe1vy94nw","WDVWJChuy3","UlU3MjiVBP","0YAGHVNCPd","s93MlKZamH","BbwgA7fsYM",
+"D6rByLewvM","euZA5dmoS7","WPmlx7fsYM","n8pJ9lCMxy","yToGWMmKGJ","FFDui4dEz6","uZPqgYjB9t","lm0pDciuWz","gIYvEHfyNQ","b29RJcShY2",
+"lCMxyuLtKs","fLNg8zFgtB","uAWypVNCPd","jtn0XK20wK","16lHcFnPFB","fFDrJDQimp","OUqFMn8pJ9","Oz8yZYf2Ec","okgRiFPfSE","hUTw7Qworu",
+"StlDJW3VFH","b29RJJJs5m","jSjS3SWfou","MaJQsYh1hF","tuDySlXFOB","gf8rIqaofN","JIqXiCfgr3","ciuWztaOXK","Dz1R38RCUA","FPfSEGWqqX",
+"JXljWYw2oU","WreyPGv3Fq","HP433s93Ml","5NammMGlTF","ZJTXHAmdQd","qQxHPTa8f6","cQOnvXflUq","0MR5XokgRi","Mm8siRsQUq","5drc67hyVv",
+"B3qemOHaBz","WaWsvdjsrv","AmdQdMezSW","aez9y8RCUA","Y1mC0EOE1o","ZuDtDzmLYD","HP433bgJAz","ECMvUAkKTk","1LB1L0Wr5y","F6PT255rfB",
+"uN6r3pWiOs","VLTy6580YD","2hEEUBCxeC","WaWsvHlUbF","BCxeCB3qem","BpYhVFhtgl","prNT6guMb8","1v5hHs93Ml","5Mg9rUlU3M","SbRYyn1pmO",
+"W3VFHpvgjS","jiVBPD6rBy","Uvlv4dQ586","Gv3FqnFqik","U3yw5M3zXL","jzUqRFjHXR","v8yFNBCxeC","aez9yMmsIo","JKWYRblLA9","oGu6xPOUYS",
+"cQOnvs93Ml","W7cTsmz8gx","64s8NTwano","9y4lwQ6Lix","iwzGkNo0Qb","hE1Ql16lHc","iKqhrlsQGo","HP433zY1GY","xXTI4gdQsS","jfREuCdyBV",
+"taOXKW3VFH","zz4ZU9rlg9","Ss0ZuIBe8k","8FmFHD6rBy","uJScXwiHrZ","vkCHHblLA9","uJScXpiJSk","FNYIMM6qcG","hE1Ql580YD","WDVWJnnP8o",
+"7fsYMKsjRK","WPmlxuAWyp","yvOMIGXdoH","MGlTFUmaEv","dpe1v4QMc9","ni2v1VerEA","fcJOyQWxoT","dhSuHdmoS7","AIYUuRpBQm","DG4sTDcpWB",
+"VIlwP9eoRc","aDGtSm4bxU","MaJQsC2Irc","d85a9Q6Lix","nnP8oCNHmv","Nxx9V7Ow5C","b29RJ07n1c","uZPqgZv7z0","zqH0WksJby","618Di16lHc",
+"aL6AJVerEA","fmIK1uZPqg","55rfBdmoS7","uTacxydG8U","5ZaEzn8pJ9","0YAGHaFFss","3weIFReKEW","FFDuiChuy3","DQimplH1kt","VIlwPqaofN",
+"dhSuH55rfB","hi5X7hUTw7","vOqCEQ6Lix","yToGW2Yz7E","s93MloGu6x","Pb1palm0pD","pmeCd7ku1p","jeskSzqH0W","lViBvhYBCK","VerEAa00b5",
+"8TxD7lsQGo","QWxoTNcICA","J2mQiMezSW","TXQ0ZaFFss","hYBCKKASQ8","ZJTXHoVQp6","euZA5RsQUq","5ZaEzVerEA","ReKEWHP433","45cIHB3qem",
+"dhSuHdjsrv","Uvlv4SmGzv","jfREu45cIH","m4bxUuN6r3","FNYIMNxx9V","aez9ylXFOB","14FLRksJby","POUYSGXdoH","VjCZqDcpWB","GXdoHBFkb8",
+"pFrrlFjHXR","okgRiJKWYR","piJSk9y4lw","FjHXRS77LH","MmsIociuWz","NhXdusqVrf","RzaZAWPmlx","YOfrYdhSuH","prNT6KZamH","KASQ8iqv4k",
+"faHiruQIcz","oGu6xtjQxs","nlaByiKqhr","TXQ0ZlweGy","lXFOB14FLR","b29RJ2hEEU","JKWYRPb1pa","HP433QWxoT","cQOnvpmeCd","ksJbyGv3Fq",
+"pFrrlfcwDa","fcJOyOUYuF","d85a9tjQxs","7hyVvUvlv4","fqypyhE1Ql","VBjhzazIWp","v1HlncShY2","FhtgltlILt","LewvMzmLYD","uupzkGWqqX",
+"5iGN5l83Ud","VIlwPjeskS","Qworuhe9IA","NOHsznnP8o","n1pmOOz8yZ","zz4ZU8RCUA","s4786uJScX","rhl0J45cIH","DcpWBjfREu","XyPZNFwEJz",
+"t98iWChuy3","aDGtSTXQ0Z","AXpwEBCxeC","StlDJgdQsS","IjTwP0BmCy","tuDyStaOXK","vLsmS9y4lw","RACujgjUTu","9eoRc8RCUA","s478607n1c",
+"RzaZAtl72W","WreyPEoToP","qUJMdzmLYD","n8pJ97fsYM","MezSWCNHmv","5IhmGHlUbF","07n1c1LB1L","d7vjM9eoRc","MmKGJJ2mQi","RACujWmadA",
+"F6PT2uAWyp","jeskSqUJMd","BFkb8qUJMd","5Drn0ECMvU","uLtKs3otm6","QWxoT5IhmG","RsQUq16lHc","OHaBzMezSW","i7WMQVLTy6","cQOnvCxVEf",
+"M6qcGDG4sT","nlaByQworu","OxWIHVBjhz","Uvlv4rz7Ut","LewvMQClRL","JIqXiLewvM","Vprf2Yw2oU","45cIHrz7Ut","GSQwjS77LH","Mm8situDyS",
+"iKqhrChuy3","MezSW5Mg9r","oVQp6ECMvU","VIlwPZzJHW","No0QbfaHir","bgJAzL7cGc","RsQUqAOgEe","lm0pDyToGW","BpYhVTa8f6","azIWpoGu6x",
+"7X3uyiwzGk","2ZHdklj07Q","uZPqgXflUq","1j5L845cIH","EdBKcZJTXH","lpF6WDcpWB","8hJdtFPfSE","GSQwj8cVD3","IKxdL8RCUA","v8yFNEoToP",
+"Uvlv4RzaZA","7fsYMLewvM","KZamHsqVrf","HfyNQfcwDa","CxVEfEdBKc","C2IrcECMvU","cQOnv0BmCy","ciuWzQssNC","9y4lwsuY4x","d7vjMBpYhV",
+"bgJAzn1pmO","ZzJHWvOqCE","B3qemNhXdu","DcpWBNo0Qb","uAWypru4UG","RxrsmJRJQB","aez9yO3iyQ","RpBQmbgJAz","1v5hHsoy9t","faHirAmdQd",
+"3weIFQ6hMC","HlUbF5iGN5","AgJHQ8U2nU","hYBCKd85a9","RkQkejiVBP","QWxoTsuY4x","4W0Tluupzk","Mkgy8Cfgr3","tl72WtlILt","2TRI7s4786",
+"FVMxoSs0Zu","lweGyUlU3M","Chuy3EOE1o","mX2GEru4UG","CIShGHfyNQ","TXQ0Zrhl0J","580YDBbwgA","D6rByjzUqR","aL6AJSjskQ","4QMc9O3iyQ",
+"45cIH48cHL","24ARFpAhR1","MojnPQ6hMC","UlU3MyEfy9","rhl0JzHF1q","X6PintAOsr","QssNCnlaBy","uoStwG1RhS","xciqpCdyBV","Chuy3yToGW",
+"J2mQixciqp","n1pmOiKqhr","B3qemB3qem","YjB9tI7p2a","S77LHLbRTH","qQxHPiqv4k","iwzGkAOgEe","iB08lLewvM","djsrvxXTI4","uvf7A7X3uy",
+"kZANm5Drn0","iKqhrUlU3M","2hEEU9XyT9","JRJQBlsQGo","UlU3MK20wK","CxVEfJXljW","n1pmOvkCHH","8FmFHKr8ys","rhl0JKsjRK","zHF1q2ZHdk",
+"lweGyJkzUn","0KyfsuZPqg","faHirkB5nP","HRxd8618Di","AXpwEx3LDe","DQimps4786","kZANmG1RhS","vkCHHuupzk","dhSuHzmLYD","TwanoZJTXH",
+"2DREs7fsYM","JJs5mfmIK1","14FLRn8pJ9","M6qcG5drc6","UmaEv5Drn0","vkCHHXyPZN","8xEKzhE1Ql","SjskQ5Namm","a00b5EdBKc","ciuWzJRJQB",
+"dhSuHtvdkD","ni2v1gjUTu","7Ow5CFLsph","fqypyciuWz","ThjNn5nmWv","S77LHGrDg7","kB5nPmX2GE","KASQ8Cfgr3","m4bxUv8yFN","VIlwPgf8rI",
+"oQ87rVerEA","zY1GYokgRi","M6qcGI7p2a","uJScXsqVrf","oVQp6GXdoH","cmXIXx3LDe","uTacxdpe1v","C2IrcAOgEe","In3NSuQIcz","5ZaEzChuy3",
+"TXQ0ZhE1Ql","RsQUqPOUYS","Chuy3IKxdL","MaJQsTCgPp","Q6LixIKxdL","Cfgr3faHir","prNT616lHc","Q6Lix5nmWv","8cVD3No0Qb","9XyT9DG4sT",
+"5VZjSfaHir","Z4I1vQbxXc","tuDyShE1Ql","azIWpiKqhr","atef2VNCPd","Kr8yseuZA5","DcpWBxciqp","8RCUAyToGW","CxVEfaFFss","Ss0ZuuN6r3",
+"uJScXn1pmO","VjCZqnFqik","h1zcHnFqik","HlUbFEdBKc","CxVEfZuDtD","8FmFHd7vjM","YjB9ts93Ml","v8yFN5drc6","D6rByvLsmS","pFrrlIKxdL",
+"D6rByHlUbF","uZPqgtAOsr","zmLYDuLtKs","kB5nPQssNC","ydG8UksJby","hE1QlfaHir","BpYhVyToGW","0ao3ljSjS3","OHaBzFnPFB","JIqXizY1GY",
+"Kr8yskZANm","4QMc92Nslm","0h1b1FnPFB","ZUnqtJJs5m","zmLYDiqv4k","I7p2asqVrf","7hyVvStlDJ","fFDrJfLNg8","Yh1hFuJScX","1j5L89y4lw",
+"EdBKcQClRL","RpBQmWaim6","xXTI4yEfy9","HlUbF8U2nU","XyPZNYjB9t","vLsmSG1RhS","MGlTFBpYhV","uAWypSs0Zu","RmDcrRmDcr","lweGy2TRI7",
+"BCxeCqUJMd","dhSuH3otm6","1v5hHrz7Ut","8FmFH9GXkX","lj07QSs0Zu","Zv7z029QAz","KASQ8pFrrl","2DREsvOqCE","LewvMCfgr3","FnPFBgtCA5",
+"blLA9lpF6W","tlILtStlDJ","qQxHPNxx9V","MojnPW3VFH","QChxsqaofN","Mm8siMm8si","9eoRcMkgy8","jtn0Xuupzk","rKDLJMK07Y","rKDLJJ2mQi",
+"5VZjSCfgr3","jzUqRRkQke","4dEz6gjUTu","FVMxolkMUA","v2eC3tlILt","0PktI5ZaEz","lH1ktcQOnv","Yf2EcFGzgp","8FmFHuLtKs","taOXKBGaQY",
+"BpYhVFxX9q","PYBf4a00b5","hSSvQ14FLR","Vprf2pv0i7","618DigIYvE","blLA9FLsph","0ao3lxReec","AmdQdU3yw5","K20wKzmLYD","KsjRKMkgy8",
+"ThjNnJJs5m","J2mQivLsmS","AOgEeRpBQm","blLA92Nslm","SbRYyThjNn","gjUTuC2Irc","P6bcgm4bxU","piJSk5drc6","okgRi0MR5X","2NslmYf2Ec",
+"lm0pDlpF6W","n8pJ90BmCy","jSjS3WreyP","aez9ybrhlQ","HRxd8uvf7A","ydG8UJRJQB","gdQsSCfgr3","pWiOshE1Ql","iwzGkKr8ys","DQimpWreyP",
+"oVQp6hUTw7","M6qcGQworu","FPfSEBpYhV","J2mQi9XyT9","lXFOBGv3Fq","MaJQsPb1pa","FxX9qGrDg7","gtCA55IhmG","Kr8ysy94nw","pT8wu6AFT0",
+"tAOsrRBhp0","yofH3uAWyp","C2IrccmXIX","JkzUnZuDtD","8FmFHVIlwP","jS1ajv1Hln","6q6L9ReKEW","YOfrYWaim6","pFrrljzUqR","uPX7G1j5L8",
+"0YAGHa00b5","580YDfFDrJ","hYBCK0Wr5y","Mm8siKsjRK","FcWrWUmaEv","zY1GYpvgjS","iB08l8TxD7","24ARFGrDg7","5NammI7p2a","GWqqXjiVBP",
+"XflUqJRJQB","CqqaDsoy9t","DG4sTGrDg7","zFgtBSjskQ","24ARFjfREu","FGzgpKr8ys","gf8rIvkCHH","OUYuFSjskQ","618DiQ6hMC","7Ow5CUl4a1",
+"zY1GYECMvU","qaofNlj07Q","oGu6xhe9IA","XyPZN5iGN5","M3zXLMkgy8","CdyBV9iGoT","vOqCE8TxD7","YjB9tfmIK1","Oz8yZBGaQY","F6PT2KsjRK",
+"StlDJZzJHW","5VZjSTCgPp","zFgtBbgJAz","EoToPTa8f6","guMb8cmXIX","QbxXcVNCPd","aFFssn1pmO","ZhwG1tvdkD","3weIFgf8rI","brhlQbZLvS",
+"fmIK1MK07Y","XflUqRzaZA","iKqhrkB5nP","lXFOB7hyVv","nlaBy1v5hH","tAOsrGrDg7","FVMxoRACuj","5drc6FFDui","L7cGcDQimp","pvgjS4dEz6",
+"JKWYRm4bxU","Cp3mZt98iW","dmoS7RpBQm","4dEz6lj07Q","cQOnvyEfy9","CxVEfaez9y","VIlwPulk41","5ZaEzNxx9V","SbRYyCfgr3","0BmCyv2eC3",
+"ni2v1d7vjM","CNHmvydG8U","BFkb8rKDLJ","3otm6NhXdu","JRJQBh1zcH","DG4sTAgJHQ","zz4ZUAmdQd","9rlg95ZaEz","zFgtBgdQsS","RzaZA24ARF",
+"55rfBFLsph","AkKTkJJs5m","RpBQmCIShG","5ZaEz2hEEU","o8UydpT8wu","uTacx1LB1L","JXljW0Kyfs","gf8rIYw2oU","s7Mxk5nmWv","PYBf4jSjS3",
+"K4GS87ku1p","OxWIH07n1c","WmadAW7cTs","ogLgcokgRi","5IhmGoGu6x","blLA9Cfgr3","prNT6DG4sT","jSjS3ZUnqt","ru4UG2DREs","bZLvSksJby",
+"RpBQm6q6L9","C2IrczmLYD","QnJ1S7fKYU","CIShG0Wr5y","F6PT2LbRTH","ZJTXHfcJOy","aDGtSprNT6","9y4lwjtn0X","uoStwnFqik","ix74rB3qem",
+"Cfgr30BmCy","P6bcgqUJMd","t98iWblLA9","S77LHulk41","ogLgc4QMc9","AIYUu29QAz","Vprf2ulk41","lweGyogLgc","okgRiMezSW","aDGtSDQimp",
+"64s8NbZLvS","dhSuHfLNg8","ix74riB08l","4dEz6P6bcg","cL0aEMm8si","dhSuHiwzGk","QWxoTv8yFN","hi5X7ZUnqt","55rfBW3VFH","d7vjM8U2nU",
+"LDk6ffqypy","AmdQdhe9IA","ru4UGv1Hln","9eoRcMmsIo","No0QbNxx9V","O3iyQzQt6Q","pmeCd9eoRc","qaofN07n1c","AIYUuFNYIM","8cVD3fqypy",
+"VIlwPdhSuH","FhtglMmKGJ","I7p2aUvlv4","QChxsK4GS8","SWfou1j5L8","kB5nP0PktI","WPmlxuTacx","cQOnvMmKGJ","fLNg8MezSW","0BmCyVIlwP",
+"kZANmiKqhr","o8Uyd5drc6","U3yw50YAGH","9rlg92Nslm","W7cTsiB08l","uN6r307n1c","uupzkNxx9V","07n1caL6AJ","IjTwPK20wK","VIlwP7ku1p",
+"mz8gxCp3mZ","Gv3FqTa8f6","iKqhrKASQ8","Vprf2s93Ml","4QMc9uPX7G","FjHXRhUTw7","xciqpSWfou","BbwgAQbxXc","v2eC3QYxC0","QClRLJIqXi",
+"d85a9uPX7G","SmGzvMojnP","VBjhzi7WMQ","Dz1R324ARF","d7vjMSbRYy","0BmCybrhlQ","5Drn02Yz7E","3otm6lViBv","PYBf4Mm8si","FcWrWBGaQY",
+"WmadAxReec","Yw2oU5iGN5","Yh1hFAgJHQ","hE1Ql0BmCy","5Mg9rzmLYD","OUqFMAgJHQ","AIYUuv2eC3","FnPFBuN6r3","RmDcrHlUbF","OHaBz48cHL",
+"m4bxUS2Dfu","hUTw7F6PT2","XflUqKr8ys","PYBf4MojnP","Ta8f60PktI","RzaZAuvf7A","tvdkD9XyT9","JJs5mSbRYy","uoStwgIYvE","P6bcgSs0Zu",
+"yvOMIpFrrl","JIqXiThjNn","5iGN5tAOsr","8TxD7brhlQ","vOqCEzFgtB","zY1GYd7vjM","vLsmSjS1aj","ReKEWGrDg7","I7p2aY1mC0","B3qemWaim6",
+"618DiuN6r3","VIlwPyEfy9","8xEKzzz4ZU","XyPZNEOE1o","QnJ1SYOfrY","JKWYRuAWyp","dhSuHU3yw5","24ARF3otm6","7fKYUlCMxy","Q6LixY1mC0",
+"UmaEvKZamH","fqypyuPX7G","QbxXcGrDg7","3weIFzFgtB","hYBCKYf2Ec","k85AepFrrl","OxWIH64s8N","tAOsrOxWIH","6AFT0FLsph","QbxXcb29RJ",
+"5iGN5Ta8f6","d7vjMhE1Ql","lkMUATwano","4QMc97ku1p","l83Ud5iGN5","IRh48CdyBV","lH1kt0PktI","Gv3FqKsjRK","jiVBPRkQke","BCxeCLewvM",
+"pFrrlW3VFH","Waim6CNHmv","aFFss1LB1L","xXTI4he9IA","S77LHh1zcH","VjCZquJScX","Z4I1vs7Mxk","UmaEvF6PT2","JXljWGWqqX","KsjRKCIShG",
+"m4bxUcmXIX","pWiOsm4bxU","cmXIXF6PT2","Dz1R3fmIK1","Z4I1vF6PT2","b29RJdjsrv","FcWrWXyPZN","3otm6QWxoT","e6e4zzbIYY","HfyNQFhtgl",
+"RzaZAa00b5","8cVD3M6qcG","zbIYYYh1hF","Gv3FqlpF6W","FnPFB5iGN5","dpe1vS77LH","4QMc9RmDcr","VerEAW3VFH","Uvlv4t98iW","wiHrZTXQ0Z",
+"JkzUnAXpwE","piJSkuLtKs","vOqCEhYBCK","4QMc9gjUTu","WreyPDG4sT","n8pJ9FjHXR","m4bxUqQxHP","i3pyd2ZHdk","jS1ajK4GS8","8FmFHhE1Ql",
+"FNYIMuPX7G","brhlQlH1kt","fFDrJbZLvS","0YAGH7lUXZ","vOqCEpmeCd","FGzgpfFDrJ","gjUTuChuy3","pWiOsVIlwP","Ss0ZuB3qem","JkzUn8U2nU",
+"mz8gx7X3uy","dmoS7ydG8U","LewvMBpYhV","hi5X7GSQwj","CdyBVwDajX","ZhwG1Twano","FnPFBhe9IA","5Nammgf8rI","IRh48yluBx","cQOnv8hJdt",
+"8U2nU5IhmG","h1zcHdpe1v","FPfSEzbIYY","7hyVvRBhp0","h1zcH9iGoT","1LB1LdmoS7","lkMUABCxeC","CqqaDgdQsS","mX2GEFxX9q","Gv3Fqn8pJ9",
+"ciuWzJ2mQi","SjskQVprf2","5IhmGpiJSk","9XyT9NOHsz","Y1mC0zFgtB","m4bxUxXTI4","HzZT8IRh48","F6PT2StlDJ","GrDg78hJdt","CIShGs4786",
+"Cp3mZJRJQB","d7vjMQ6hMC","gf8rIS77LH","7lUXZChuy3","i7WMQ5VZjS","zz4ZUciuWz","4dEz6AIYUu","618DiqaofN","8hJdtsuY4x","FcWrW0Kyfs",
+"RpBQmAOgEe","FFDuiNo0Qb","v1HlnYw2oU","tlILt8xEKz","580YDZzJHW","QworuCp3mZ","Z4I1vIRh48","MGlTFCNHmv","ThjNnjtn0X","ZUnqtv2eC3",
+"iKqhr5ZaEz","7hyVvChuy3","Vprf2uoStw","64s8NwiHrZ","d85a9lm0pD","5NammaFFss","0Wr5yCp3mZ","VNCPdQYxC0","29QAzcL0aE","s7MxkBGaQY",
+"lH1ktZv7z0","he9IAs7Mxk","sx5GlFLsph","14FLRFVMxo","2Yz7ECNHmv","cmXIXtlILt","ZJTXHZUnqt","zY1GYpT8wu","0BmCyfLNg8","580YDqUJMd",
+"uZPqgyvOMI","RsQUqdpe1v","VIlwPIRh48","MK07Y5Drn0","zHF1qCp3mZ","16lHcSmGzv","lm0pDBbwgA","JIqXi8xEKz","a00b5ZzJHW","FnPFBlXFOB",
+"5NammfcJOy","YOfrYJJs5m","0KyfsHlUbF","i7WMQ45cIH","J2mQid85a9","uupzk5nmWv","FVMxoSWfou","4QMc9FjHXR","TwanoTCgPp","euZA5zbIYY",
+"h1zcH2ZHdk","D6rBy9eoRc","Gv3Fquvf7A","nFqikO3iyQ","DLhzMsuY4x","I7p2asoy9t","QworuWDVWJ","Ta8f6QWxoT","t98iWtuDyS","MmKGJbZLvS",
+"dhSuHwDajX","rz7Utd7vjM","uvf7A9eoRc","I7p2av2eC3","Q6hMCFFDui","UlU3M8hJdt","SbRYyogLgc","iB08l0MR5X","tjQxsGWqqX","QYxC0dmoS7",
+"L7cGcYw2oU","7X3uylH1kt","vOqCERmDcr","aFFssVBjhz","OUYuFWreyP","BGaQYjfREu","t59lRZhwG1","RmDcrHP433","IKxdLcmXIX","hE1QlmX2GE",
+"JIqXi5VZjS","Zv7z05iGN5","oQ87rhUTw7","aDGtSlpF6W","t59lRWreyP","pmeCdI7p2a","C2IrcAkKTk","sqVrfIKxdL","55rfBlkMUA","hi5X7oVQp6",
+"hE1QlyofH3","WreyPmX2GE","AmdQdDG4sT","fcwDaEoToP","ZJTXHatef2","WMiS3iKqhr","AkKTkQssNC","nnP8ocQOnv","IKxdLPOUYS","SmGzvpvgjS",
+"FVMxoXflUq","AIYUuPYBf4","cmXIXO3iyQ","cmXIXjSjS3","07n1cCxVEf","hE1QlJXljW","iwzGkKZamH","MaJQsXflUq","8RCUAnFqik","y94nwKASQ8",
+"jfREuQbxXc","8hJdtCfgr3","1j5L8OHaBz","lkMUAXyPZN","cQOnvVLTy6","e6e4zaDGtS","uAWypFGzgp","QworupiJSk","blLA9jS1aj","fFDrJuPX7G",
+"KASQ8WreyP","fcJOyQClRL","9iGoT7Ow5C","TXQ0Z0h1b1","yEfy9yvOMI","FjHXRGv3Fq","jfREuzFgtB","lm0pDEOE1o","RsQUqjiVBP","l83Udh1zcH",
+"4QMc929QAz","Cfgr3zFgtB","BpYhVrz7Ut","zY1GYXflUq","VNCPdRzaZA","2ZHdkDQimp","Mm8siyvOMI","MGlTFHRxd8","KASQ8fFDrJ","JKWYRHP433",
+"FnPFBHzZT8","0ao3lpmeCd","vkCHHFPfSE","CK5W7Gv3Fq","0Wr5yMaJQs","AIYUucQOnv","618DiuJScX","lH1ktIn3NS","8FmFH0Kyfs","soy9tpmeCd",
+"IKxdLYjB9t","GSQwjqQxHP","StlDJNcICA","X6PinFVMxo","QChxs4QMc9","JXljW8RCUA","9rlg9ix74r","zbIYYd7vjM","ogLgczY1GY","3weIFDcpWB",
+"XyPZN2hEEU","KsjRKuLtKs","aez9yciuWz","zz4ZU8xEKz","MmsIo9rlg9","uupzkRxrsm","Q6Lix618Di","b29RJYh1hF","Zv7z0AmdQd","bZLvS9GXkX",
+"uupzk4dEz6","SjskQrhl0J","QnJ1SUl4a1","yofH3O3iyQ","gjUTu55rfB","CqqaD4W0Tl","tuDySiKqhr","9rlg9NOHsz","ciuWzZzJHW","5Mg9rIjTwP",
+"5IhmGdmoS7","IBe8kmz8gx","0h1b1K4GS8","fqypyuZPqg","okgRik85Ae","YOfrYM6qcG","ciuWzQWxoT","48cHLZJTXH","1v5hHbrhlQ","uLtKsfaHir",
+"ogLgcfFDrJ","RmDcruPX7G","TXQ0ZoGu6x","tlILtGXdoH","VIlwPjfREu","sqVrfGWqqX","oQ87r9XyT9","BGaQYl83Ud","KASQ8JRJQB","SjskQx3LDe",
+"CqqaDh1zcH","NAFuwtuDyS","JJs5mJXljW","K4GS8lkMUA","5VZjS2Yz7E","9iGoTwDajX","atef2FNYIM","5Namm8xEKz","GWqqXlm0pD","IRh486q6L9",
+"zFgtB64s8N","JJs5mtlILt","QYxC0cShY2","fFDrJyofH3","lViBvXflUq","CNHmv1j5L8","UmaEvHfyNQ","I7p2a4QMc9","a00b5Q6hMC","VNCPduZPqg",
+"JKWYRb29RJ","v1HlnZzJHW","ECMvUhSSvQ","cShY2vLsmS","lCMxyi3pyd","MmKGJOUqFM","blLA92TRI7","7ku1pRsQUq","mz8gxfLNg8","IjTwPCdyBV",
+"CqqaD8hJdt","I7p2avOqCE","OUYuFa00b5","Yw2oU8cVD3","HRxd8FFDui","ECMvUThjNn","s93MlgjUTu","lH1ktprNT6","AIYUuVBjhz","ZJTXHUl4a1",
+"pmeCdJkzUn","9rlg9d7vjM","Nxx9Vzz4ZU","rz7Ut7Ow5C","Chuy37fKYU","7Ow5CaDGtS","uvf7AFNYIM","Gv3FqOxWIH","D6rByh1zcH","HlUbFXyPZN",
+"d7vjMD6rBy","TCgPplkMUA","M6qcG3weIF","POUYSydG8U","uPX7Giqv4k","uN6r3jzUqR","GSQwjhE1Ql","LewvMogLgc","ix74rpmeCd","fqypyl83Ud",
+"2hEEUk85Ae","OxWIHpAhR1","8xEKzRACuj","AkKTkyvOMI","Cfgr3ZuDtD","gf8rIZJTXH","Cfgr3fqypy","Oz8yZ2hEEU","uLtKsGXdoH","ZuDtD9XyT9",
+"ZUnqtcShY2","jiVBPPOUYS","IKxdLJ2mQi","5Mg9rv8yFN","7fKYUl83Ud","8FmFHYf2Ec","Kr8ysAgJHQ","5drc6pmeCd","uLtKsFVMxo","2ZHdkfcJOy",
+"brhlQAIYUu","a00b5ogLgc","LbRTHxXTI4","FVMxo8U2nU","KZamH8cVD3","AOgEe24ARF","fLNg82Nslm","IBe8kECMvU","oQ87rMojnP","lweGyYh1hF",
+"uLtKsWMiS3","cQOnvvOqCE","DcpWBeuZA5","VNCPdUl4a1","rhl0J24ARF","fcwDav1Hln","gf8rISmGzv","brhlQix74r","4W0TlTCgPp","mz8gxAmdQd",
+"K4GS8pmeCd","UlU3MoQ87r","i3pyd7ku1p","580YDlViBv","5VZjSKsjRK","cShY2jzUqR","cQOnvX6Pin","WreyPzFgtB","MaJQslm0pD","m4bxUqaofN",
+"o8UydSbRYy","sx5GlmX2GE","iqv4kCNHmv","nnP8oQChxs","bgJAzqUJMd","guMb8dQ586","rz7UtzY1GY","DQimpuPX7G","FPfSEIBe8k","YjB9tK20wK",
+"cL0aE5drc6","C2Ircdpe1v","AXpwE16lHc","5drc6ru4UG","aL6AJSbRYy","jzUqRAgJHQ","ThjNnM3zXL","a00b5Yf2Ec","ni2v1e6e4z","pvgjSRpBQm",
+"0PktIazIWp","faHirCdyBV","JkzUnFnPFB","VerEAn8pJ9","5nmWvFnPFB","piJSkC2Irc","QssNCFnPFB","uLtKsuoStw","HRxd84W0Tl","QClRLSbRYy",
+"8FmFHdmoS7","64s8N07n1c","Waim6ZhwG1","64s8NRsQUq","lj07QKsjRK","S2DfueuZA5","t59lRZv7z0","No0QbGSQwj","6q6L9NhXdu","5ZaEzI7p2a",
+"7fKYUFPfSE","M3zXLxReec","n8pJ9pAhR1","RzaZAQnJ1S","7hyVvRzaZA","9rlg9m4bxU","BCxeC4QMc9","4W0Tl8xEKz","uZPqgJJs5m","45cIHbrhlQ",
+"Ta8f6CNHmv","pAhR1taOXK","0BmCyMezSW","Vprf2RkQke","m4bxUs93Ml","jSjS38hJdt","StlDJJkzUn","qQxHPiwzGk","jtn0XNo0Qb","IjTwPCIShG",
+"pvgjSQWxoT","24ARFsoy9t","RBhp0jiVBP","hE1QlZJTXH","Gv3Fqsx5Gl","1j5L8VLTy6","CIShGfcwDa","gtCA5VNCPd","7Ow5CW7cTs","yluBxOxWIH",
+"FFDuiqUJMd","QYxC0jfREu","k85AeCNHmv","yluBxogLgc","55rfBlpF6W","Cfgr3tl72W","CqqaDXflUq","MojnPdpe1v","nlaByZv7z0","fFDrJ0YAGH",
+"tAOsrhi5X7","WreyPni2v1","fmIK129QAz","ix74r64s8N","HfyNQ0h1b1","5drc6FPfSE","pmeCd7Ow5C","ksJbywiHrZ","lCMxygjUTu","VNCPdReKEW",
+"9iGoT5Drn0","gf8rIgtCA5","LewvMYjB9t","gtCA5GXdoH","9iGoTdQ586","6AFT0KsjRK","euZA5kZANm","QnJ1S1LB1L","yvOMIxReec","JJs5muoStw",
+"618DiwDajX","Yf2EcEoToP","dmoS7iKqhr","14FLRNhXdu","wDajXfqypy","n1pmO3weIF","o8UydaFFss","Uvlv4ZJTXH","29QAzfcJOy","MK07YQYxC0",
+"O3iyQ4W0Tl","lCMxyMmsIo","OUYuFRzaZA","aL6AJblLA9","OUYuFVprf2","lsQGoW7cTs","8cVD3EdBKc","MojnPtAOsr","HlUbFni2v1","L7cGcsoy9t",
+"jSjS3taOXK","FLsphuvf7A","BFkb8JXljW","s7Mxk7lUXZ","rhl0J1j5L8","mz8gxtaOXK","VIlwPMGlTF","5VZjSSjskQ","MGlTFMkgy8","IKxdL0YAGH",
+"guMb8suY4x","qaofNydG8U","C2Irc580YD","07n1cnnP8o","VjCZqSjskQ","In3NSpFrrl","SbRYyMkgy8","o8Uyduupzk","yofH3EoToP","GSQwjjfREu",
+"NOHszUlU3M","I7p2acQOnv","nlaByRxrsm","I7p2afqypy","BCxeCmX2GE","Kr8ysPOUYS","8FmFHWMiS3","vkCHHuTacx","h1zcHJJs5m","DQimpFhtgl",
+"M6qcGpmeCd","piJSk8U2nU","9eoRcK20wK","KsjRKlm0pD","t98iW0BmCy","blLA9AkKTk","taOXKKASQ8","MaJQshi5X7","6AFT0BbwgA","Ta8f6yvOMI",
+"07n1chE1Ql","oVQp65iGN5","mz8gxRmDcr","CqqaD29QAz","FjHXRK20wK","I7p2aHRxd8","FPfSElViBv","LbRTHh1zcH","DLhzMt59lR","W7cTszmLYD",
+"8U2nU24ARF","9XyT9580YD","CIShGFFDui","RACujKsjRK","fcwDax3LDe","Mkgy85VZjS","jiVBP7fsYM","VNCPd5ZaEz","9eoRcMK07Y","v8yFNoVQp6",
+"oVQp6pv0i7","KASQ8h1zcH","iKqhrpvgjS","UmaEvprNT6","wDajXAmdQd","FFDuiAgJHQ","zbIYYFPfSE","48cHLaFFss","FwEJzBCxeC","0KyfsblLA9",
+"tuDyS5nmWv","In3NSPb1pa","xciqplj07Q","X6PinzbIYY","AXpwEd7vjM","RsQUqnlaBy","AOgEe9rlg9","GrDg7lH1kt","O3iyQQChxs","Yw2oU48cHL",
+"X6Pink85Ae","yToGWyvOMI","4dEz62Nslm","0KyfsjzUqR","ydG8UiwzGk","NhXduVjCZq","0Wr5yfqypy","GSQwjoGu6x","suY4xdpe1v","XyPZN580YD",
+"iKqhrl83Ud","64s8NpiJSk","uTacx7Ow5C","16lHctaOXK","AmdQdRxrsm","jfREuMmKGJ","oVQp6ZuDtD","WDVWJFLsph","14FLRK20wK","atef2ThjNn",
+"QClRLQYxC0","xciqpWaim6","VjCZqzFgtB","0ao3lM6qcG","qQxHPUl4a1","FnPFBxXTI4","6q6L9I7p2a","dmoS7oQ87r","CxVEfL7cGc","G1RhSY1mC0",
+"fFDrJIn3NS","xReecrhl0J","piJSkQYxC0","64s8N7Ow5C","nFqikRxrsm","nnP8oFFDui","P6bcg7Ow5C","QssNCuvf7A","okgRi9y4lw","DG4sTWaWsv",
+"cmXIXbZLvS","IBe8kFxX9q","Oz8yZFFDui","oQ87rVNCPd","n1pmOhYBCK","LewvMfLNg8","0ao3lUlU3M","i7WMQt98iW","RmDcrjiVBP","CxVEfxReec",
+"CdyBVhE1Ql","tlILtDQimp","M6qcG0Kyfs","tl72WNo0Qb","AkKTkMmKGJ","xXTI4d85a9","48cHLCxVEf","29QAzuLtKs","8cVD3Z4I1v","iB08lVLTy6",
+"K4GS8BGaQY","QbxXcCxVEf","jS1ajzbIYY","RzaZAHlUbF","d85a9s4786","Nxx9VzmLYD","zY1GYl83Ud","MK07YVLTy6","yluBxQWxoT","vLsmSAkKTk",
+"KZamHvLsmS","iwzGkv1Hln","WDVWJCqqaD","8xEKzWPmlx","OUqFMLewvM","618Di0Kyfs","JIqXilm0pD","s7MxkThjNn","JkzUnulk41","djsrvd85a9",
+"tjQxsyluBx","7fKYUnFqik","piJSk9iGoT","Mm8siRpBQm","MmsIo8U2nU","DQimpfmIK1","ni2v1DLhzM","0PktIQworu","45cIHd7vjM","7fKYU8U2nU",
+"QssNCjSjS3","AmdQd0ao3l","FwEJzn1pmO","xReecCNHmv","jtn0Xi3pyd","RACujsx5Gl","oGu6xFxX9q","oGu6xStlDJ","7fKYUjS1aj","JIqXiNOHsz",
+"Q6LixjzUqR","suY4x5Drn0","AgJHQ5Namm","ogLgc16lHc","uAWyphYBCK","Z4I1vguMb8","kZANmtlILt","EOE1o5IhmG","AgJHQWaim6","2ZHdkMK07Y",
+"uQIcz55rfB","POUYSO3iyQ","VLTy6FjHXR","7fKYU29QAz","lViBv6q6L9","OxWIHjS1aj","Y1mC0GXdoH","WaWsvMmsIo","S2DfuNOHsz","CNHmvt59lR",
+"aFFss2hEEU","fmIK1Cfgr3","Ul4a1BGaQY","uN6r324ARF","yEfy9vLsmS","IBe8k45cIH","pT8wu9eoRc","zmLYD1v5hH","Y1mC0UlU3M","jfREulkMUA",
+"In3NSuvf7A","jiVBP4dEz6","YjB9tl83Ud","WmadADLhzM","9iGoTAOgEe","lpF6WJKWYR","4W0TlpWiOs","DG4sTvOqCE","qaofNWaWsv","HfyNQJRJQB",
+"XyPZNSWfou","lm0pD7fsYM","AIYUuX6Pin","SWfourz7Ut","tvdkDZuDtD","9GXkXSjskQ","okgRih1zcH","fFDrJuQIcz","vkCHHlCMxy","5IhmGgjUTu",
+"zY1GYAgJHQ","DG4sTOUYuF","fmIK1iqv4k","FwEJz5Mg9r","i3pydOUYuF","zmLYDyluBx","Mkgy8AXpwE","e6e4z5Namm","blLA95IhmG","zFgtBlH1kt",
+"WmadASmGzv","GSQwjIjTwP","Uvlv4HzZT8","jtn0XcQOnv","0Wr5yzFgtB","1j5L8P6bcg","sx5GluPX7G","JXljW64s8N","FLsph2ZHdk","NhXduyofH3",
+"l83UdxReec","d85a9v8yFN","i7WMQjfREu","5drc6he9IA","tlILtnlaBy","7fKYUIn3NS","ZuDtDRzaZA","d85a945cIH","hSSvQ9rlg9","n1pmOJIqXi",
+"BFkb8v2eC3","Yw2oUKsjRK","5IhmG5iGN5","14FLRiB08l","FGzgpUmaEv","v1HlnpWiOs","qaofNyvOMI","uLtKs4W0Tl","QClRLFVMxo","aez9yydG8U",
+"GrDg7mX2GE","POUYSdhSuH","ix74rbrhlQ","soy9tjS1aj","2NslmksJby","2ZHdkB3qem","2ZHdkbZLvS","pFrrlWMiS3","fFDrJJ2mQi","J2mQiJRJQB",
+"nlaByydG8U","nlaByYOfrY","atef2UlU3M","5Mg9rprNT6","7fKYUFjHXR","MK07Y5Mg9r","gjUTuDQimp","lpF6W7ku1p","JRJQBFFDui","RkQkeSWfou",
+"n8pJ9GSQwj","fFDrJ5drc6","uvf7AS2Dfu","uPX7GCp3mZ","uvf7A3otm6","oVQp6Chuy3","5ZaEzCqqaD","2DREs0BmCy","TwanoiKqhr","zFgtBoGu6x",
+"tl72WnnP8o","nnP8ooGu6x","J2mQiQChxs","RmDcrd7vjM","hi5X7ZJTXH","lkMUA2hEEU","aDGtSgdQsS","Pb1pauoStw","CNHmvFGzgp","WreyPVNCPd",
+"VIlwPlweGy","dhSuHprNT6","lpF6WWMiS3","t98iWmX2GE","L7cGcmX2GE","CqqaDnlaBy","mz8gx5nmWv","lCMxyQbxXc","MmsIoWreyP","WmadAAgJHQ",
+"OHaBzAgJHQ","Z4I1vM3zXL","ciuWz9iGoT","lsQGoOz8yZ","tjQxsv2eC3","okgRiRACuj","EOE1oVjCZq","7fKYUi3pyd","vkCHHChuy3","djsrvhUTw7",
+"b29RJRACuj","y94nwFjHXR","OUqFMfcJOy","atef2taOXK","JkzUnmX2GE","IRh48jSjS3","gIYvEW3VFH","uTacxzqH0W","4QMc945cIH","2NslmOUqFM",
+"FnPFBQ6Lix","RpBQmGrDg7","e6e4zFnPFB","5ZaEzStlDJ","gdQsS8FmFH","FFDuiStlDJ","2ZHdkAgJHQ","Dz1R3uPX7G","580YDYf2Ec","NAFuwpAhR1",
+"LDk6fU3yw5","a00b55VZjS","jfREu1LB1L","NAFuwYw2oU","W3VFHWDVWJ","RsQUqxXTI4","1v5hHJJs5m","No0QbReKEW","55rfBuoStw","G1RhS14FLR",
+"UmaEvv8yFN","F6PT2DQimp","ksJbygjUTu","Dz1R32hEEU","aez9ywDajX","HP4335drc6","tAOsrs93Ml","iB08lMmsIo","LDk6fwiHrZ","M3zXLjiVBP",
+"Chuy39eoRc","cL0aEHRxd8","x3LDedQ586","xciqps93Ml","ksJbyCdyBV","TXQ0ZOHaBz","G1RhSKASQ8","2DREsUl4a1","d7vjMjSjS3","X6PinLewvM",
+"a00b5azIWp","0MR5XSjskQ","IjTwP64s8N","uLtKsix74r","J2mQiIjTwP","h1zcHxXTI4","IKxdLMK07Y","m4bxUVprf2","14FLRPOUYS","RsQUqs4786",
+"OxWIHZUnqt","iqv4k5ZaEz","sqVrffLNg8","MK07YAmdQd","dpe1vd7vjM","tl72Wlm0pD","aDGtSvLsmS","0ao3lKZamH","lViBvCxVEf","guMb8MmKGJ",
+"2DREsVprf2","fmIK1ogLgc","55rfBbZLvS","Yf2EcThjNn","ECMvUlViBv","VjCZqChuy3","WaWsvMmKGJ","cShY2Oz8yZ","CqqaD5VZjS","DcpWBOUYuF",
+"jSjS30h1b1","618Diaez9y","jiVBPBpYhV","jiVBPo8Uyd","O3iyQjtn0X","S77LH6AFT0","Uvlv4tuDyS","hE1Ql5drc6","AkKTkLbRTH","rhl0JVLTy6",
+"vOqCEiKqhr","cL0aEZ4I1v","lXFOB8xEKz","Chuy3In3NS","LbRTHFVMxo","RkQkeSs0Zu","WDVWJfFDrJ","fLNg8S2Dfu","YOfrYvkCHH","DLhzM6q6L9",
+"MmsIoJRJQB","e6e4z1v5hH","MaJQs618Di","xciqpFnPFB","yofH3Pb1pa","1j5L8SbRYy","IRh48RBhp0","Vprf2taOXK","guMb8nlaBy","U3yw52Nslm",
+"jtn0XOz8yZ","zbIYYJKWYR","rz7UtWaWsv","fqypy6AFT0","wiHrZNAFuw","2hEEUM6qcG","WMiS3azIWp","jtn0XRpBQm","HP433fcJOy","zz4ZUcmXIX",
+"Y1mC0Mm8si","NhXdu7fKYU","HlUbFW3VFH","0ao3lThjNn","pmeCduQIcz","ydG8UCp3mZ","MaJQsBbwgA","s47864QMc9","J2mQiOUqFM","blLA914FLR",
+"G1RhSs4786","5ZaEzFnPFB","Waim6AXpwE","NAFuwb29RJ","VNCPdYjB9t","ZhwG1lm0pD","yluBxRmDcr","FxX9qlViBv","45cIHiqv4k","0ao3lpv0i7",
+"3weIFSWfou","BGaQY8RCUA","d85a9WPmlx","4W0Tl2TRI7","ciuWzcShY2","Yh1hFNcICA","oQ87rKZamH","0ao3lYh1hF","Pb1paThjNn","iB08l8xEKz",
+"vOqCEBFkb8","AXpwEZhwG1","W7cTsAmdQd","pFrrl0Wr5y","8hJdtWreyP","RmDcrs4786","K20wKTa8f6","VjCZq7ku1p","jiVBPlkMUA","uN6r35Mg9r",
+"zmLYDb29RJ","WaWsvRACuj","PYBf48RCUA","b29RJe6e4z","hi5X78FmFH","TXQ0ZydG8U","Gv3FqbrhlQ","s93MlRkQke","wiHrZ29QAz","qaofNjtn0X",
+"RkQkeni2v1","ulk410PktI","v1HlnwiHrZ","taOXK2TRI7","EOE1oJXljW","DQimpAkKTk","QbxXc7hyVv","o8UydcmXIX","lpF6Wrz7Ut","lsQGoPYBf4",
+"Cp3mZTwano","9GXkXDG4sT","VLTy69y4lw","WmadAatef2","DLhzMpT8wu","Uvlv4WMiS3","FPfSEAgJHQ","t98iW2Nslm","4W0Tl5VZjS","SmGzvCIShG",
+"SmGzvv2eC3","RACujX6Pin","jS1aj4dEz6","ReKEWFVMxo","ECMvUJKWYR","RzaZAChuy3","s93Mlix74r","cmXIXOxWIH","o8UydOUqFM","ni2v1VIlwP",
+"QworuQWxoT","RmDcryofH3","KASQ8okgRi","RBhp0fqypy","MojnPbZLvS","fFDrJHlUbF","3weIFlViBv","yluBx0h1b1","zmLYDgIYvE","Yw2oUYw2oU",
+"uQIczWaWsv","2TRI7OUqFM","uAWypb29RJ","CqqaDsuY4x","aFFssAgJHQ","OUYuFbrhlQ","JXljWaL6AJ","NhXduiB08l","FcWrWgIYvE","0KyfsRsQUq",
+"tvdkDWmadA","blLA9fmIK1","qQxHPoVQp6","zbIYYDQimp","rz7UtAkKTk","e6e4zgjUTu","ulk41jzUqR","Mm8sio8Uyd","guMb84W0Tl","FjHXRYh1hF",
+"h1zcHGWqqX","hi5X7rz7Ut","cmXIXKZamH","vLsmSuupzk","G1RhSBGaQY","o8Uyd2hEEU","gIYvEBbwgA","v8yFN8xEKz","aez9ySjskQ","mz8gx8U2nU",
+"7ku1p8FmFH","taOXKvLsmS","yToGW0BmCy","cL0aEAkKTk","gtCA5iKqhr","SmGzvYjB9t","64s8NjS1aj","F6PT2IKxdL","euZA5HfyNQ","jzUqRFwEJz",
+"IBe8kvkCHH","zmLYDrhl0J","KsjRKpT8wu","8FmFHDz1R3","y94nw3otm6","580YD0h1b1","MGlTFx3LDe","B3qemhUTw7","JXljWv1Hln","HfyNQ45cIH",
+"DG4sTM6qcG","tjQxsCqqaD","0Wr5y2hEEU","he9IAokgRi","TwanocL0aE","9eoRcSmGzv","lH1ktVprf2","YjB9t6AFT0","W7cTsIjTwP","azIWp6AFT0",
+"D6rBy9rlg9","GSQwj0Wr5y","nlaByd85a9","hYBCKjS1aj","x3LDemz8gx","qQxHPFNYIM","hUTw7FwEJz","pmeCdRxrsm","gtCA5a00b5","QYxC0qUJMd",
+"S2DfuYjB9t","yluBxFGzgp","Gv3FqDz1R3","iB08lmX2GE","9GXkX5nmWv","yvOMI0Kyfs","IjTwPt98iW","9eoRcM3zXL","WDVWJ29QAz","1j5L8xReec",
+"ix74r0YAGH","55rfBRpBQm","aFFssKsjRK","cmXIXsx5Gl","qQxHPAXpwE","RkQkepmeCd","24ARF8cVD3","aFFssRkQke","0h1b148cHL","tvdkDM6qcG",
+"7ku1pW3VFH","Q6hMCRsQUq","azIWpX6Pin","uPX7Guupzk","yvOMIJ2mQi","Ta8f6MaJQs","Uvlv4iwzGk","m4bxUNcICA","J2mQiokgRi","HfyNQhUTw7",
+"IBe8kWPmlx","hYBCKOUqFM","fqypyKsjRK","LewvMGXdoH","i3pydzmLYD","FVMxoO3iyQ","uPX7GAOgEe","ZUnqtyEfy9","BGaQY4QMc9","MGlTF5ZaEz",
+"JkzUnlpF6W","ru4UG5Namm","OHaBzTwano","vLsmSaez9y","U3yw5QClRL","he9IAeuZA5","AkKTkogLgc","uTacxzbIYY","F6PT2n1pmO","7X3uyuZPqg",
+"7Ow5CuAWyp","3otm6Yh1hF","qaofN2Nslm","v1Hln5ZaEz","Uvlv4brhlQ","CK5W7lH1kt","jzUqRaez9y","Yw2oUciuWz","4dEz67Ow5C","hi5X7CK5W7",
+"uLtKs5drc6","ZUnqtjzUqR","45cIH1v5hH","8cVD3prNT6","AkKTkfLNg8","FFDuiyluBx","Mm8sijeskS","FPfSExXTI4","pvgjSFhtgl","dQ586SbRYy",
+"t59lRrz7Ut","tAOsr5iGN5","uoStwMojnP","rhl0JJXljW","piJSkHlUbF","PYBf44W0Tl","QWxoTJJs5m","NcICAZhwG1","Ul4a1FwEJz","7ku1pqUJMd",
+"BGaQYfmIK1","HzZT8KsjRK","yofH3oQ87r","aDGtSiB08l","MezSWcmXIX","ksJbyogLgc","jzUqRPb1pa","lsQGox3LDe","MmKGJ8TxD7","LewvM7Ow5C",
+"qQxHP7lUXZ","8U2nUJRJQB","FLsphuoStw","Mm8sioVQp6","FhtglKsjRK","VLTy6fcwDa","jtn0XOUqFM","RBhp0fcwDa","XflUqoGu6x","C2IrcxXTI4",
+"s7Mxkpv0i7","64s8NWDVWJ","gtCA5K20wK","9y4lwuZPqg","FFDuitlILt","2hEEUK20wK","MmsIoHzZT8","vLsmSFPfSE","J2mQiKASQ8","iB08lPYBf4",
+"dmoS70ao3l","tjQxsl83Ud","5iGN5hSSvQ","OHaBzCK5W7","FxX9qyToGW","dhSuHQChxs","yofH3bZLvS","piJSk3weIF","Yh1hFGv3Fq","pv0i7ydG8U",
+"AOgEeAkKTk","cL0aEGSQwj","lXFOBS77LH","POUYS45cIH","ni2v1RBhp0","7hyVvkB5nP","MezSWrKDLJ","zbIYYfmIK1","OUYuFIn3NS","sqVrf580YD",
+"uQIczFLsph","tl72WMojnP","Dz1R3dhSuH","ulk41C2Irc","sqVrfYf2Ec","jSjS31j5L8","lpF6WlViBv","pWiOsulk41","Rxrsm3weIF","zQt6Q3otm6",
+"Nxx9Viqv4k","h1zcH7hyVv","FwEJzRsQUq","JkzUnLDk6f","5VZjSAgJHQ","8RCUAMmKGJ","QworuGWqqX","ydG8UB3qem","hi5X7pvgjS","RmDcrXflUq",
+"nnP8ouJScX","vkCHHKASQ8","TXQ0ZNcICA","AmdQd3otm6","aez9yqaofN","oVQp6EoToP","qaofNqQxHP","9GXkX5drc6","0ao3ls93Ml","djsrvpT8wu",
+"9iGoTogLgc","5NammVerEA","zz4ZUWPmlx","mX2GEuvf7A","TCgPpIKxdL","azIWpO3iyQ","RzaZAn8pJ9","uvf7AuN6r3","G1RhSRACuj","MK07YrKDLJ",
+"Yh1hFogLgc","P6bcgrz7Ut","cQOnvaDGtS","nnP8otjQxs","WreyPOUqFM","Cfgr3brhlQ","6q6L90MR5X","uTacx5iGN5","FLsphzbIYY","tuDySzFgtB",
+"d7vjMpvgjS","jSjS3iKqhr","B3qemkB5nP","0Wr5yhYBCK","jzUqRix74r","OUqFMmz8gx","GWqqXAIYUu","ydG8U4W0Tl","lpF6Wlm0pD","8TxD7VNCPd",
+"fFDrJGWqqX","Waim6ksJby","pv0i7o8Uyd","fFDrJd7vjM","he9IAF6PT2","tlILtaFFss","lXFOB3otm6","FPfSEpAhR1","RBhp01v5hH","QworuNcICA",
+"YOfrYtl72W","DQimplViBv","tjQxsZzJHW","CdyBVb29RJ","a00b5t59lR","VLTy68hJdt","5nmWvIjTwP","uAWypFnPFB","NhXdu5ZaEz","fcwDaIKxdL",
+"Zv7z0CNHmv","4dEz6ru4UG","hYBCKuupzk","zbIYYYf2Ec","hSSvQEOE1o","pmeCdWreyP","s93MlRmDcr","zFgtBNhXdu","AgJHQCqqaD","soy9tZhwG1",
+"lsQGo0PktI","0Wr5yDcpWB","6AFT0QWxoT","VLTy6yToGW","uJScXGrDg7","iB08lFPfSE","FPfSE0MR5X","AXpwEs7Mxk","iwzGkWDVWJ","0BmCyDQimp",
+"BbwgA3weIF","2DREsMmKGJ","MezSWW7cTs","i3pydYh1hF","X6PinCqqaD","jzUqRMGlTF","azIWpIjTwP","JIqXizbIYY","4QMc96q6L9","FGzgpdpe1v",
+"aez9yhE1Ql","580YDQClRL","AgJHQ7ku1p","DLhzM0Wr5y","5nmWvCK5W7","cShY2he9IA","1j5L80BmCy","RsQUqFcWrW","Vprf2Z4I1v","5drc6VerEA",
+"guMb8zz4ZU","dQ586jfREu","h1zcHDQimp","n8pJ9HlUbF","fqypyoGu6x","Ta8f614FLR","wiHrZW3VFH","DcpWB0h1b1","uZPqgFNYIM","jfREuBbwgA",
+"5VZjSCIShG","tuDySRmDcr","5nmWvSbRYy","MojnPgIYvE","ZhwG155rfB","s93Ml5Namm","FVMxo2hEEU","K4GS8UmaEv","mz8gxU3yw5","EOE1otvdkD",
+"NAFuwtvdkD","ix74r0MR5X","blLA9ciuWz","fmIK1WmadA","n1pmOtAOsr","9eoRcfmIK1","MGlTFaL6AJ","pT8wuQYxC0","BCxeCDQimp","pvgjSCK5W7",
+"7fKYU16lHc","2Yz7ETCgPp","d7vjMcQOnv","JkzUnh1zcH","Zv7z0Oz8yZ","JkzUnIRh48","jiVBPwiHrZ","IBe8kpmeCd","SmGzv618Di","0ao3l8RCUA",
+"5drc68cVD3","Nxx9VRzaZA","zFgtBQ6Lix","lViBve6e4z","07n1cpWiOs","LewvMOUYuF","5Drn0kZANm","FFDui24ARF","9rlg9aL6AJ","9iGoT2Nslm",
+"SbRYylH1kt","No0QblCMxy","Chuy3n8pJ9","SjskQOHaBz","5Namm4dEz6","kZANmulk41","MGlTFCp3mZ","pWiOsfqypy","EoToPdpe1v","lj07QCxVEf",
+"0BmCylH1kt","IjTwPlViBv","M3zXLDQimp","StlDJsqVrf","8xEKzGSQwj","pWiOsvLsmS","fFDrJ7X3uy","Yf2Ec5ZaEz","fmIK1VerEA","gtCA5Cp3mZ",
+"Kr8ys2Nslm","5IhmGlm0pD","tlILtUlU3M","YjB9tsx5Gl","gIYvEFhtgl","qUJMd2Nslm","HfyNQNo0Qb","yluBx5drc6","Mkgy8lViBv","pFrrlhE1Ql",
+"zbIYYCp3mZ","X6Pint59lR","gf8rIdhSuH","uvf7AqUJMd","5nmWv8FmFH","YOfrY7fKYU","QbxXcHP433","e6e4z5nmWv","dmoS7zbIYY","qaofNJIqXi",
+"4dEz6qUJMd","7hyVvOxWIH","pmeCdfLNg8","C2IrcB3qem","Zv7z0FnPFB","djsrveuZA5","4QMc97X3uy","okgRi2TRI7","bZLvSSWfou","atef2pT8wu",
+"MezSWe6e4z","iwzGkIKxdL","QnJ1SfcwDa","dQ586Oz8yZ","DG4sTQClRL","K4GS8GXdoH","iqv4kdQ586","IRh48euZA5","Mkgy8POUYS","JKWYRFNYIM",
+"yToGWRxrsm","AXpwEThjNn","7fsYMIjTwP","BGaQYuLtKs","I7p2aJKWYR","s7MxkNhXdu","hYBCKn8pJ9","0ao3lWPmlx","VjCZqIjTwP","6q6L9WPmlx",
+"vkCHHMezSW","MaJQsyEfy9","8TxD7gdQsS","C2IrcFLsph","MmsIobrhlQ","HfyNQl83Ud","AIYUuWPmlx","EdBKczz4ZU","QnJ1SciuWz","iKqhrb29RJ",
+"Q6LixpWiOs","WMiS3Yf2Ec","RkQkevLsmS","7Ow5C7X3uy","WmadAGXdoH","iqv4k0YAGH","RACujSjskQ","ZzJHWYh1hF","Chuy3YjB9t","7ku1puPX7G",
+"2Yz7E4QMc9","5NammFcWrW","uPX7GRACuj","zHF1qqQxHP","FVMxouAWyp","euZA5LDk6f","KASQ8l83Ud","zHF1qdjsrv","ix74rcL0aE","AmdQdpiJSk",
+"qaofNzbIYY","EOE1oaez9y","Zv7z0ix74r","WMiS3jzUqR","qaofNB3qem","tuDySJRJQB","LewvMgtCA5","VjCZqQworu","POUYSfqypy","8RCUAv8yFN",
+"4W0TlLDk6f","lXFOB5Namm","GrDg7RACuj","24ARFjiVBP","v8yFNKr8ys","SjskQyEfy9","618DiUl4a1","uTacxuTacx","i7WMQeuZA5","piJSksoy9t",
+"nFqika00b5","pAhR1xReec","5NammAXpwE","bZLvSyToGW","yluBxSmGzv","NhXduazIWp","xciqpokgRi","W3VFH5IhmG","rz7UtuN6r3","5iGN5HfyNQ",
+"nlaBy9eoRc","JKWYRkZANm","pAhR1zY1GY","yvOMImX2GE","16lHcOUYuF","Ta8f6qUJMd","Pb1pasoy9t","ru4UGksJby","zY1GYdjsrv","24ARFU3yw5",
+"XflUquN6r3","jtn0XokgRi","ni2v1GSQwj","yvOMItaOXK","QWxoThSSvQ","rKDLJ2Nslm","cmXIXfFDrJ","i7WMQzY1GY","SmGzvVLTy6","QClRLwiHrZ",
+"lXFOBVIlwP","OUqFMYjB9t","FnPFBDQimp","yvOMIlweGy","DcpWB5nmWv","5Drn0ulk41","Cp3mZyluBx","HlUbFv2eC3","SWfouMaJQs","s7MxklViBv",
+"16lHcbgJAz","Zv7z0v1Hln","i3pydTCgPp","JkzUnjfREu","4dEz6taOXK","ThjNnxciqp","gf8rIqUJMd","W3VFHSbRYy","WDVWJMkgy8","DcpWB5ZaEz",
+"QYxC00BmCy","ReKEWWaWsv","VLTy6GXdoH","WreyPJkzUn","XflUqKsjRK","cQOnvFNYIM","blLA97hyVv","OUYuFix74r","Q6hMClCMxy","n8pJ9FGzgp",
+"PYBf4BCxeC","9rlg9tlILt","hYBCKvOqCE","tvdkDF6PT2","dpe1vaFFss","wiHrZ2hEEU","pv0i7t98iW","Oz8yZfmIK1","WMiS32DREs","5iGN5yluBx",
+"jS1ajuLtKs","kB5nPBFkb8","jiVBP5IhmG","RxrsmTCgPp","FVMxobgJAz","U3yw5RsQUq","rz7UtksJby","JJs5m8hJdt","pT8wu0YAGH","Q6hMCd85a9",
+"5Namm9y4lw","D6rBytl72W","DcpWBlpF6W","7Ow5CECMvU","ZJTXHjtn0X","lj07QIRh48","LewvMuLtKs","QYxC0RBhp0","JRJQBQWxoT","Chuy3X6Pin",
+"prNT6UlU3M","TCgPpZ4I1v","aDGtS5Drn0","EOE1oSs0Zu","tjQxsv1Hln","FnPFBaL6AJ","nnP8oSbRYy","NcICAZuDtD","Waim6vOqCE","mX2GEL7cGc",
+"cShY2KZamH","Pb1pauupzk","RkQkecmXIX","ZuDtDD6rBy","IBe8kaFFss","9iGoTn8pJ9","ReKEW9GXkX","VLTy6NOHsz","s7MxkMezSW","5ZaEzFGzgp",
+"FnPFBtuDyS","JIqXihYBCK","Oz8yZOUYuF","SjskQhe9IA","cL0aEtAOsr","lViBvVLTy6","5Drn0MmsIo","jfREulpF6W","b29RJHfyNQ","xReecb29RJ",
+"o8UydpvgjS","a00b5GSQwj","dQ5866q6L9","yluBxDz1R3","uupzk5Mg9r","vkCHHFcWrW","zmLYDBCxeC","2Yz7EOUqFM","AmdQdCqqaD","RzaZAqUJMd",
+"3weIFhE1Ql","atef2s7Mxk","VIlwPhSSvQ","djsrvMm8si","8hJdttl72W","0Wr5yDLhzM","Chuy3piJSk","5nmWvC2Irc","mz8gxMezSW","JJs5mQYxC0",
+"16lHcni2v1","MmKGJS2Dfu","iqv4kFcWrW","Mkgy8s7Mxk","t98iWKr8ys","580YDRxrsm","v1Hlngf8rI","0Wr5yJRJQB","jfREuCK5W7","QssNCF6PT2",
+"cShY2AOgEe","0PktI0Kyfs","K20wK5IhmG","ZuDtDRmDcr","QYxC0K20wK","wiHrZulk41","SWfouv8yFN","tAOsrk85Ae","CK5W7fcJOy","GSQwj0PktI",
+"RkQkeyvOMI","AOgEeMmsIo","zbIYYvLsmS","v2eC3DQimp","he9IA5Mg9r","SjskQJXljW","lm0pD0h1b1","MmKGJnnP8o","5Mg9raL6AJ","VNCPdlkMUA",
+"7X3uyI7p2a","FLspht59lR","XyPZN3otm6","n8pJ9hUTw7","Nxx9VGrDg7","BbwgAHRxd8","xReecEOE1o","Q6hMCjtn0X","guMb8EOE1o","DQimpMezSW",
+"ydG8U3otm6","dpe1v4W0Tl","QssNC9rlg9","VIlwPZ4I1v","IjTwPksJby","LDk6fCNHmv","S2DfutuDyS","uupzkGSQwj","45cIHatef2","pWiOsS77LH",
+"1LB1LTa8f6","UmaEvSs0Zu","VLTy62TRI7","s7MxkaFFss","gjUTuQClRL","SbRYyCNHmv","QnJ1S618Di","L7cGcvkCHH","FxX9q5nmWv","Ul4a1fqypy",
+"cQOnvuN6r3","FLsph1v5hH","l83UdazIWp","hYBCKZuDtD","6q6L9pWiOs","Kr8ystlILt","hYBCKsqVrf","qUJMdtuDyS","hE1QlS2Dfu","FLsphjzUqR",
+"IKxdLiKqhr","uPX7GMGlTF","J2mQilm0pD","zHF1qHP433","AgJHQtuDyS","yvOMIsoy9t","Cp3mZFxX9q","DLhzMRxrsm","t98iWpiJSk","AIYUuzbIYY",
+"QYxC06AFT0","lpF6WDQimp","MmKGJ8U2nU","M6qcG9iGoT","Y1mC0oVQp6","YOfrYW7cTs","F6PT2h1zcH","qaofNVIlwP","kB5nPQbxXc","BbwgAm4bxU",
+"vkCHHksJby","jiVBPJRJQB","K20wK8cVD3","HzZT8BFkb8","ZUnqtAmdQd","1j5L8nnP8o","U3yw5vkCHH","FFDuiOHaBz","45cIHKr8ys","7ku1p3otm6",
+"xciqpBCxeC","HzZT8QnJ1S","pv0i7hYBCK","jfREu7fKYU","uPX7Gs4786","xXTI4nnP8o","nnP8oy94nw","zqH0WUvlv4","UmaEv9eoRc","WPmlx4QMc9",
+"ogLgc0h1b1","AkKTkI7p2a","EOE1oAOgEe","J2mQiFVMxo","IRh48he9IA","EdBKcMaJQs","EOE1o9rlg9","HfyNQLDk6f","pWiOsuAWyp","FPfSEeuZA5",
+"gf8rIv8yFN","DQimpSs0Zu","IBe8k5iGN5","zHF1q5Namm","AmdQdlkMUA","14FLRAXpwE","lCMxyTXQ0Z","CK5W7ThjNn","VBjhzn8pJ9","aez9y0h1b1",
+"8FmFHyToGW","jeskSBpYhV","GrDg7ogLgc","faHirQssNC","y94nwM6qcG","ZhwG1OUYuF","suY4x8FmFH","fcwDatjQxs","dQ586piJSk","iwzGks93Ml",
+"jS1ajECMvU","IRh48x3LDe","kZANmd7vjM","zbIYYFNYIM","Waim6i3pyd","FFDuiThjNn","vLsmSGv3Fq","pvgjS3otm6","8RCUAuupzk","cQOnv618Di",
+"tuDySuZPqg","fqypyjeskS","3weIFU3yw5","FjHXRWDVWJ","VjCZqW3VFH","pmeCdk85Ae","jS1ajDLhzM","X6PinW3VFH","KZamHX6Pin","Yw2oUThjNn",
+"WmadAU3yw5","55rfBrKDLJ","5iGN5RpBQm","Q6hMCix74r","jzUqRlViBv","5IhmG7hyVv","iqv4kx3LDe","kB5nPn1pmO","7ku1pi7WMQ","Gv3FqvLsmS",
+"7fsYMNo0Qb","a00b5i3pyd","OHaBzoVQp6","WmadAUmaEv","DQimpsoy9t","MezSWoGu6x","qQxHPfLNg8","MaJQseuZA5","fcwDaFcWrW","DQimpZhwG1",
+"m4bxUU3yw5","Yw2oUPOUYS","WmadA0PktI","jSjS3fLNg8","gf8rIgjUTu","tAOsruQIcz","24ARFK20wK","2Nslmy94nw","ciuWzfqypy","uJScXhe9IA",
+"AkKTkSmGzv","SWfouCK5W7","FNYIMK4GS8","euZA5zqH0W","pvgjS5Mg9r","fmIK1LDk6f","DQimpXflUq","9XyT93weIF","rz7Ut0BmCy","pT8wuQssNC",
+"uZPqgLbRTH","0YAGHgf8rI","FcWrWmz8gx","gIYvEFNYIM","0MR5XhYBCK","LbRTHQworu","ciuWzvOqCE","ZJTXHuN6r3","suY4xWDVWJ","uTacxzHF1q",
+"ZJTXHiqv4k","uLtKsB3qem","WaWsvWaim6","ZJTXH2TRI7","M3zXLAmdQd","VNCPdlH1kt","hE1QlcmXIX","64s8N8xEKz","atef2StlDJ","ydG8Uv1Hln",
+"QbxXcAIYUu","aDGtSCfgr3","S2DfuuPX7G","tl72WGv3Fq","FNYIMMm8si","s7Mxk45cIH","tjQxsHP433","VIlwPQWxoT","l83Ud2hEEU","14FLRCp3mZ",
+"soy9tQYxC0","bZLvSgtCA5","IRh488U2nU","580YDD6rBy","7ku1pqaofN","JXljWJIqXi","29QAzWPmlx","uPX7GDQimp","k85Ae2DREs","4QMc9vOqCE",
+"RzaZAguMb8","9iGoTuTacx","tvdkDOUYuF","yluBxAgJHQ","Waim6L7cGc","zHF1qWaim6","ru4UG5drc6","blLA9Waim6","gjUTu48cHL","07n1cMm8si",
+"o8UydQChxs","yEfy9XflUq","MezSWulk41","9rlg9CdyBV","jeskSMmKGJ","dpe1v8cVD3","hUTw7zbIYY","QbxXcUlU3M","U3yw5CNHmv","QChxsv2eC3",
+"CqqaDuupzk","sqVrf16lHc","Pb1pahe9IA","VIlwP4dEz6","uupzkcShY2","NOHszG1RhS","GrDg7tl72W","cShY2MGlTF","AmdQds93Ml","cQOnvNxx9V",
+"OUYuFMezSW","rKDLJjiVBP","jtn0XHfyNQ","tAOsrIKxdL","v8yFNIRh48","VNCPd07n1c","OHaBzKr8ys","Fhtgl6AFT0","Yw2oU2Nslm","fmIK1hYBCK",
+"CxVEfgdQsS","HP433S77LH","fLNg8CNHmv","POUYSfLNg8","l83Udv2eC3","No0QbvLsmS","45cIHFPfSE","HfyNQY1mC0","yluBxHlUbF","pAhR1hUTw7",
+"tl72WKZamH","RzaZAOUqFM","AXpwEJXljW","ogLgciqv4k","8hJdtokgRi","jS1ajUvlv4","vkCHHaL6AJ","zQt6QFnPFB","iqv4kRxrsm","cmXIXpmeCd",
+"iqv4kUmaEv","07n1clXFOB","Z4I1vW3VFH","7lUXZ4QMc9","aFFssZhwG1","jzUqRpWiOs","HzZT8oVQp6","NOHszLewvM","fFDrJrKDLJ","Q6LixlXFOB",
+"QbxXcbrhlQ","hE1QlYh1hF","VLTy614FLR","uJScXaez9y","IjTwPtlILt","9rlg9Yf2Ec","t98iWyToGW","zFgtBQnJ1S","U3yw5uN6r3","h1zcHtvdkD",
+"ECMvUJRJQB","pT8wusuY4x","yToGWIBe8k","zY1GYWreyP","fFDrJs7Mxk","kZANmHRxd8","EdBKc4dEz6","XflUq4QMc9","tlILtW3VFH","dQ586jSjS3",
+"JXljWfmIK1","lkMUAFwEJz","RkQkeFxX9q","IRh4814FLR","WPmlxjS1aj","0ao3lL7cGc","2Nslm9y4lw","WMiS3XyPZN","F6PT2tjQxs","BbwgAvLsmS",
+"7X3uywiHrZ","0YAGHVBjhz","dpe1vOUqFM","okgRiiB08l","4QMc9M6qcG","guMb8l83Ud","3weIFAgJHQ","FcWrWPOUYS","StlDJCfgr3","tAOsrZ4I1v",
+"ix74rMkgy8","Zv7z0PYBf4","4QMc95Namm","yToGWy94nw","GSQwjcShY2","zz4ZU8hJdt","FPfSEjSjS3","OxWIHMezSW","hYBCKh1zcH","CIShGDz1R3",
+"QnJ1SLDk6f","sx5GldQ586","FLsphW3VFH","k85AeqaofN","O3iyQbgJAz","2ZHdkzmLYD","FwEJzpv0i7","AkKTkuJScX","48cHLSWfou","WDVWJReKEW",
+"ulk41WDVWJ","K4GS8WaWsv","48cHLblLA9","ru4UGPb1pa","IRh48ru4UG","prNT6MojnP","WaWsv8hJdt","9iGoTYOfrY","wDajXazIWp","Waim6uLtKs",
+"d7vjM1j5L8","s4786FnPFB","5ZaEz29QAz","uQIczQ6Lix","29QAzJKWYR","2ZHdk6AFT0","0YAGHJkzUn","MGlTFVIlwP","zY1GYbgJAz","ZzJHWazIWp",
+"FGzgpW7cTs","tAOsrB3qem","5Namm48cHL","GSQwjtjQxs","JXljWNOHsz","RkQkeCfgr3","djsrvK4GS8","tjQxsUmaEv","7X3uyRACuj","Chuy30YAGH",
+"lweGyQworu","jfREu64s8N","JkzUnBCxeC","soy9tRkQke","LewvM6q6L9","kB5nPl83Ud","BFkb8GSQwj","jtn0XNOHsz","pmeCdqaofN","hi5X7TCgPp",
+"CNHmvGXdoH","ZuDtDVLTy6","QChxs0Kyfs","gIYvE2Nslm","16lHcfcwDa","0ao3l2ZHdk","5Mg9rRsQUq","qaofN5drc6","AIYUu4QMc9","FLsph5iGN5",
+"wiHrZAmdQd","oGu6x5iGN5","5iGN52TRI7","m4bxUXyPZN","2Yz7EzqH0W","GrDg7xciqp","dQ586K20wK","CdyBV2DREs","pv0i755rfB","5Mg9rTwano",
+"IBe8kuQIcz","FjHXRlCMxy","xciqpx3LDe","lweGyuAWyp","FVMxo48cHL","uvf7AI7p2a","1v5hHXflUq","Yh1hF5IhmG","GWqqXWaWsv","tAOsrmz8gx",
+"BbwgACNHmv","CxVEfPb1pa","d7vjMxReec","9y4lwVNCPd","29QAz2ZHdk","3otm6IjTwP","n1pmOqUJMd","HRxd80PktI","FnPFBd85a9","Chuy3CqqaD",
+"24ARFJRJQB","v2eC3FxX9q","WmadAYjB9t","yvOMICIShG","kB5nPuoStw","bZLvSfcwDa","580YDO3iyQ","WPmlx7fKYU","xReecFPfSE","OHaBzpT8wu",
+"ni2v10Kyfs","LDk6fDz1R3","lj07QmX2GE","B3qemYOfrY","8U2nUQ6Lix","OUqFMTwano","mX2GEZUnqt","0MR5Xx3LDe","Pb1paRACuj","zQt6Q9eoRc",
+"ThjNns4786","vLsmSDcpWB","FnPFB7hyVv","iwzGkOUYuF","5VZjSIn3NS","Yw2oUpmeCd","k85AeuLtKs","WDVWJFNYIM","sqVrfkZANm","uLtKsSWfou",
+"zmLYDWaWsv","azIWpMaJQs","I7p2alViBv","BCxeCJJs5m","ksJbyJJs5m","JXljW8TxD7","Nxx9V5iGN5","NhXdu3weIF","RmDcrAOgEe","jeskS5Drn0",
+"aDGtS2DREs","uZPqgPOUYS","Z4I1v5Namm","S2DfuFhtgl","bZLvS5iGN5","FVMxoX6Pin","AOgEegtCA5","wiHrZWaWsv","5iGN5HP433","PYBf4Oz8yZ",
+"1v5hHKsjRK","jiVBPFGzgp","2TRI7AkKTk","P6bcgt98iW","CK5W7UmaEv","EoToPCxVEf","1j5L8piJSk","NAFuw8hJdt","lm0pDzmLYD","wDajXMezSW",
+"AXpwEuAWyp","RACujQbxXc","9XyT9yluBx","yofH3WreyP","sx5GlM3zXL","cShY2vOqCE","JkzUnRACuj","RmDcrfaHir","Fhtglpv0i7","7hyVvguMb8",
+"48cHLoGu6x","RACujLbRTH","x3LDefaHir","7fKYUprNT6","MaJQsAmdQd","U3yw5HP433","uJScXQWxoT","M3zXLdpe1v","v1HlnF6PT2","Mm8siyToGW",
+"fFDrJHzZT8","QChxsU3yw5","2Yz7EDG4sT","i7WMQIKxdL","guMb8sqVrf","9GXkXRmDcr","In3NSdmoS7","FcWrWZUnqt","8cVD3NOHsz","24ARFCK5W7",
+"ix74rIBe8k","yvOMIpWiOs","fcJOyzHF1q","2TRI7B3qem","t98iWYjB9t","POUYSoQ87r","prNT6d7vjM","POUYS0Wr5y","uoStwRkQke","xXTI4L7cGc",
+"Z4I1vAIYUu","Y1mC0Ul4a1","wiHrZpmeCd","DG4sT9iGoT","5Mg9rCK5W7","s7MxkjS1aj","9GXkX64s8N","wiHrZRzaZA","M3zXL7fKYU","dmoS72ZHdk",
+"WPmlxuJScX","StlDJlCMxy","FGzgp0Kyfs","dQ586BFkb8","gdQsSn8pJ9","X6PinJIqXi","IRh48UmaEv","ZhwG1iKqhr","Rxrsmatef2","ThjNnpWiOs",
+"VerEAuupzk","uZPqg7fsYM","k85AeNhXdu","cShY2Fhtgl","JIqXiOUYuF","YjB9tyvOMI","NhXduv2eC3","dmoS7LewvM","gtCA5EoToP","iqv4kMGlTF",
+"k85AeyEfy9","S77LH7fsYM","QYxC0zFgtB","2hEEUqaofN","Dz1R3aez9y","0BmCyEdBKc","Nxx9VKr8ys","lH1ktuN6r3","lm0pDGSQwj","OHaBzOz8yZ",
+"DLhzMgdQsS","yofH3ix74r","4QMc9s93Ml","FNYIMZ4I1v","dQ5860Kyfs","LDk6fSWfou","2TRI7Rxrsm","HP433AgJHQ","lj07QJIqXi","ksJbyxciqp",
+"jzUqRh1zcH","Yf2EcMm8si","rKDLJChuy3","yToGWXyPZN","uvf7AuTacx","ulk412DREs","yvOMIlj07Q","nnP8oJRJQB","C2IrcZ4I1v","Chuy3hUTw7",
+"ni2v1pFrrl","RkQkepvgjS","xciqpiwzGk","8xEKzCNHmv","5IhmGv1Hln","gtCA5zHF1q","EdBKcb29RJ","2hEEUhi5X7","gIYvENcICA","Oz8yZFLsph",
+"FVMxoNAFuw","IRh48F6PT2","UlU3MzFgtB","uZPqgzFgtB","lpF6WJJs5m","i7WMQVjCZq","Waim69XyT9","JRJQBIBe8k","d85a9OxWIH","kB5nPcShY2",
+"NhXduuupzk","yEfy9Zv7z0","FhtgldmoS7","BCxeCuPX7G","RpBQmv2eC3","2TRI7FNYIM","KZamHXyPZN","POUYSDLhzM","Cfgr3yEfy9","BGaQY5Mg9r",
+"OUqFMTXQ0Z","s7Mxk3otm6","4dEz6bgJAz","JkzUnwDajX","9GXkXFhtgl","FcWrWlpF6W","gdQsSe6e4z","RBhp0CqqaD","wDajX14FLR","IjTwPMK07Y",
+"U3yw5KsjRK","RsQUqGrDg7","9GXkXL7cGc","YjB9tWaim6","TXQ0Zd85a9","Waim6JXljW","Y1mC0WaWsv","y94nwM3zXL","YOfrYFhtgl","8FmFHd85a9",
+"yEfy9lkMUA","WDVWJGrDg7","sx5Gl7fsYM","7hyVv2Nslm","dQ5869rlg9","s93MlQYxC0","0YAGHh1zcH","yToGWzbIYY","NOHszksJby","AIYUuFjHXR",
+"uupzkRACuj","4W0TlxXTI4","Zv7z0aL6AJ","GWqqXjzUqR","45cIHZv7z0","GSQwjWDVWJ","lj07QzY1GY","ECMvU5VZjS","zz4ZUa00b5","VLTy6prNT6",
+"xXTI4n8pJ9","O3iyQRpBQm","CIShGtjQxs","U3yw5nnP8o","IBe8klm0pD","sqVrfrhl0J","FnPFBlm0pD","RpBQmzQt6Q","yEfy9LDk6f","ciuWzCIShG",
+"24ARF8FmFH","ni2v1jiVBP","lViBvCIShG","uAWypAIYUu","Ss0ZugdQsS","2DREs0ao3l","BbwgAIBe8k","D6rBy07n1c","LDk6fjzUqR","W3VFHs4786",
+"fcJOy5Mg9r","o8UydSmGzv","48cHLgjUTu","F6PT2ZzJHW","v2eC38xEKz","ZzJHWPb1pa","zz4ZUCIShG","WaWsvuQIcz","ru4UGsx5Gl","yvOMINxx9V",
+"DcpWBuoStw","ulk41LDk6f","6q6L9No0Qb","Vprf2uZPqg","45cIHogLgc","ix74reuZA5","nlaByJ2mQi","3weIF9iGoT","FcWrWY1mC0","S77LH0PktI",
+"QbxXc5Drn0","FGzgpQWxoT","tlILt48cHL","x3LDehi5X7","gf8rIPOUYS","zY1GYoGu6x","1v5hHjzUqR","UlU3Muupzk","blLA9d7vjM","YjB9tdhSuH",
+"lpF6WB3qem","wiHrZ8FmFH","uAWypfaHir","uZPqgFjHXR","hi5X7nlaBy","uoStwZzJHW","prNT62TRI7","Ss0ZugIYvE","Kr8yss4786","gf8rIUmaEv",
+"oQ87rdmoS7","0PktIk85Ae","Yw2oU16lHc","BCxeCCdyBV","pFrrljiVBP","i7WMQvOqCE","JRJQBfcJOy","cmXIXm4bxU","FjHXRF6PT2","LbRTHOUYuF",
+"Zv7z0n8pJ9","lsQGo64s8N","gjUTuSjskQ","Pb1paaL6AJ","FLsph8RCUA","07n1c5Drn0","7fsYMlm0pD","JIqXiMaJQs","pT8wuS77LH","8xEKzsoy9t",
+"LDk6fHP433","tjQxsD6rBy","In3NSdQ586","FjHXRQ6hMC","zqH0WFVMxo","4dEz6Zv7z0","O3iyQZ4I1v","In3NS29QAz","4QMc90BmCy","CNHmvuJScX",
+"v1HlnJRJQB","zbIYY1j5L8","TCgPpb29RJ","RmDcrmz8gx","vkCHH7lUXZ","Vprf20BmCy","7Ow5CNo0Qb","gdQsS14FLR","Zv7z0pmeCd","suY4xaL6AJ",
+"n1pmOuZPqg","RzaZAlCMxy","1LB1LZuDtD","iKqhrOUqFM","3otm6rKDLJ","uZPqgVprf2","Dz1R3rhl0J","taOXKUmaEv","J2mQiC2Irc","zFgtBIBe8k",
+"faHirD6rBy","lm0pDJkzUn","e6e4zZuDtD","ix74rXflUq","gIYvEQ6Lix","9eoRcFjHXR","XflUqwiHrZ","dpe1vk85Ae","lj07QQ6hMC","ReKEWokgRi",
+"580YDkZANm","ogLgc9rlg9","zz4ZUfmIK1","ZzJHWAkKTk","VLTy6DcpWB","Twano2ZHdk","hUTw7ThjNn","WDVWJIjTwP","EdBKc5Namm","JRJQBkB5nP",
+"S77LH24ARF","WreyPJIqXi","4QMc9FnPFB","TCgPpG1RhS","9XyT9iwzGk","sqVrf64s8N","jfREuBpYhV","55rfBMmsIo","uTacxQ6Lix","FcWrWQClRL",
+"14FLRuAWyp","8xEKzY1mC0","QWxoTiqv4k","BGaQYJIqXi","k85AeHP433","yofH31j5L8","OUYuFd85a9","UlU3M7X3uy","dpe1vuoStw","Qworua00b5",
+"uQIcznlaBy","lsQGoAOgEe","16lHcJkzUn","K20wKi7WMQ","zQt6QMGlTF","0YAGH9XyT9","nFqikAgJHQ","blLA9hE1Ql","bZLvSjiVBP","zmLYDxXTI4",
+"pFrrlGrDg7","qaofNzHF1q","Zv7z0AkKTk","StlDJZJTXH","pvgjSfaHir","8RCUAd7vjM","5Mg9rTXQ0Z","xReecNo0Qb","JJs5mYw2oU","CqqaDMaJQs",
+"GXdoHuN6r3","D6rByguMb8","ZzJHWzQt6Q","Y1mC09XyT9","GrDg7jiVBP","W7cTs07n1c","F6PT2oGu6x","bZLvS0Wr5y","tvdkDWPmlx","OxWIH7fsYM",
+"blLA9iKqhr","3weIFQssNC","cmXIXpT8wu","AgJHQQWxoT","6q6L92ZHdk","0h1b1guMb8","kB5nPcmXIX","16lHcDQimp","he9IALewvM","0KyfsKr8ys",
+"pWiOsCp3mZ","RmDcr9GXkX","07n1cGv3Fq","Dz1R3pT8wu","9y4lwHP433","uZPqgpmeCd","0KyfsGWqqX","SmGzvb29RJ","Ul4a145cIH","5VZjSjS1aj",
+"k85AerKDLJ","No0QbZJTXH","9y4lwdpe1v","dmoS7MmsIo","2Yz7Euvf7A","5Drn0ksJby","SbRYyMmsIo","WMiS3Qworu","I7p2aVBjhz","sqVrfBbwgA",
+"lj07QxReec","1LB1LRsQUq","hE1QlAIYUu","cL0aEYw2oU","GSQwjyofH3","okgRilH1kt","jS1ajGWqqX","5drc6J2mQi","DG4sTx3LDe","2Nslmo8Uyd",
+"MezSWrhl0J","n8pJ9SWfou","2hEEUYOfrY","lpF6WxXTI4","0Wr5yrhl0J","WDVWJ0MR5X","2DREstAOsr","kB5nPNxx9V","VjCZqs7Mxk","lCMxyCxVEf",
+"yofH3Dz1R3","J2mQirKDLJ","zHF1qxciqp","e6e4zWreyP","AIYUuTCgPp","soy9taDGtS","Vprf2K4GS8","s7MxkZhwG1","Waim6OHaBz","b29RJksJby",
+"fcJOyCp3mZ","fLNg8nlaBy","ni2v1OxWIH","ZuDtDkB5nP","aDGtSQWxoT","1v5hHuLtKs","aDGtSbZLvS","y94nwAkKTk","Vprf2JRJQB","7fKYUbgJAz",
+"UlU3MWaim6","vOqCEtl72W","v8yFNSWfou","rz7Ut2DREs","uTacxFLsph","CIShGVjCZq","zmLYDQworu","pmeCds93Ml","X6PiniKqhr","gjUTuTCgPp",
+"zHF1qzbIYY","euZA5gIYvE","Yf2EcY1mC0","VLTy6RBhp0","MK07YtlILt","Pb1pazQt6Q","lpF6WlH1kt","gdQsSZuDtD","iwzGkTa8f6","fLNg8MmsIo",
+"ydG8UK4GS8","FxX9qi7WMQ","t59lRTwano","J2mQicShY2","aDGtSEOE1o","rhl0JMojnP","aL6AJ8xEKz","XyPZN0BmCy","JXljWtvdkD","pvgjSUl4a1",
+"d85a9aFFss","Gv3FqD6rBy","VLTy6P6bcg","lsQGo618Di","PYBf4h1zcH","2Yz7Ei3pyd","2ZHdkrhl0J","lm0pDLbRTH","jSjS3tuDyS","7X3uyZ4I1v",
+"hE1QlnlaBy","ZUnqtQssNC","CNHmvOUqFM","HzZT8NcICA","uQIczazIWp","fFDrJRpBQm","uZPqgChuy3","WreyP48cHL","XflUqTXQ0Z","Ul4a116lHc",
+"HzZT8a00b5","ThjNnhSSvQ","n8pJ95VZjS","6AFT0ulk41","CqqaDPOUYS","LewvM9iGoT","LbRTHlH1kt","5drc6yvOMI","VBjhzuLtKs","iqv4kjzUqR",
+"DLhzMChuy3","KZamH24ARF","brhlQb29RJ","AkKTkv1Hln","7fsYMNOHsz","nFqikHlUbF","gf8rItAOsr","lXFOBRmDcr","2TRI7DcpWB","5iGN5Mm8si",
+"48cHLzHF1q","JJs5m14FLR","580YDiKqhr","FjHXRhi5X7","EOE1ouupzk","faHire6e4z","TCgPpt59lR","sqVrf0h1b1","WmadAKr8ys","QWxoTxciqp",
+"he9IAVLTy6","KZamHuZPqg","AXpwEdpe1v","7fsYMxciqp","IjTwPpT8wu","SWfouAgJHQ","hi5X7n8pJ9","pv0i7Waim6","MGlTFZzJHW","AIYUujzUqR",
+"sqVrf9XyT9","RpBQmMkgy8","DG4sTyToGW","MmKGJaez9y","lweGy55rfB","Waim6StlDJ","NcICAwiHrZ","YOfrY4dEz6","QYxC0GrDg7","sqVrfgIYvE",
+"uAWypZJTXH","lXFOBCdyBV","djsrvMK07Y","O3iyQjeskS","FxX9qxReec","CqqaDTa8f6","DcpWBsoy9t","xReecZv7z0","s93Ml14FLR","d85a9pWiOs",
+"m4bxUokgRi","P6bcgJXljW","Waim6TXQ0Z","gjUTuWaWsv","fcwDaRpBQm","FGzgpAXpwE","NcICAiB08l","MK07YStlDJ","F6PT2rz7Ut","QssNCYjB9t",
+"OxWIHZuDtD","iKqhrGWqqX","tjQxsW3VFH","QssNCYh1hF","pv0i7MmKGJ","zbIYYTwano","ZuDtDblLA9","lCMxyrKDLJ","fLNg8dhSuH","QClRLtAOsr",
+"TwanoogLgc","Dz1R3b29RJ","ZJTXHgIYvE","OUYuFKr8ys","DG4sTfqypy","F6PT2fcJOy","aDGtSYf2Ec","FVMxoZzJHW","Mm8sitjQxs","CIShGXyPZN",
+"8hJdtxXTI4","aez9y8cVD3","ksJbyDz1R3","618DiReKEW","qQxHPhi5X7","14FLReuZA5","zz4ZUMm8si","24ARFv2eC3","24ARFtvdkD","Pb1paydG8U",
+"y94nwWaim6","5Drn0n8pJ9","yToGWBCxeC","qaofNIn3NS","GXdoH5Namm","fFDrJsx5Gl","s7MxkGSQwj","fqypy5Drn0","qUJMdix74r","Ul4a1dpe1v",
+"HRxd8djsrv","lsQGoNOHsz","5Drn0ix74r","FVMxo5iGN5","d7vjMatef2","29QAzQYxC0","QworuNAFuw","Mkgy8jS1aj","7fKYUt59lR","Uvlv4K20wK",
+"brhlQrhl0J","okgRihYBCK","TwanoHzZT8","dpe1vNcICA","aDGtSy94nw","AkKTkKZamH","x3LDevOqCE","UmaEvUmaEv","ru4UG0ao3l","FhtglAkKTk",
+"zHF1qgtCA5","qQxHPYOfrY","JkzUnhUTw7","JKWYRMmKGJ","WPmlx1j5L8","WMiS3ZJTXH","ciuWz5ZaEz","OUYuFguMb8","8TxD75IhmG","Uvlv4t59lR",
+"s93Mln1pmO","WreyPHzZT8","AmdQds7Mxk","piJSkKZamH","nFqikVIlwP","n8pJ90PktI","0h1b1AIYUu","M3zXLpWiOs","Pb1paW3VFH","jfREuWPmlx",
+"AgJHQni2v1","FPfSEfaHir","Nxx9VsuY4x","n1pmOWaWsv","lpF6W7hyVv","FNYIM29QAz","AOgEevkCHH","he9IAdQ586","7fsYMhSSvQ","16lHcRxrsm",
+"pvgjSLewvM","7X3uyuvf7A","Ss0Zu7fKYU","W7cTss4786","n8pJ9tl72W","K20wK2Nslm","JkzUnn8pJ9","FGzgpEdBKc","O3iyQFjHXR","VerEAhi5X7",
+"oVQp6djsrv","WreyPMGlTF","ZhwG1pAhR1","XflUqoVQp6","yToGWL7cGc","Ul4a18xEKz","b29RJwiHrZ","pT8wuhE1Ql","uQIczxciqp","DLhzMFNYIM",
+"dpe1vgf8rI","zY1GYCfgr3","m4bxUZUnqt","ZzJHWFcWrW","oQ87rFNYIM","YOfrYFGzgp","nnP8oM3zXL","Yf2EcXyPZN","FjHXRpmeCd","9iGoTOUqFM",
+"ogLgcSbRYy","zmLYDlkMUA","BbwgAOUqFM","MojnPcL0aE","blLA9dmoS7","2NslmpvgjS","MGlTFVBjhz","cShY2BpYhV","45cIHjtn0X","PYBf4zHF1q",
+"uJScXnnP8o","FhtglNxx9V","zFgtBuN6r3","uoStwk85Ae","tAOsrP6bcg","XyPZNTwano","CdyBV4dEz6","tuDySFPfSE","lweGyZuDtD","dpe1vmX2GE",
+"LDk6fogLgc","dhSuHHlUbF","dpe1v55rfB","Waim60PktI","PYBf4OUqFM","8xEKzOxWIH","ydG8UL7cGc","YjB9toQ87r","cShY229QAz","uvf7AZuDtD",
+"aL6AJrKDLJ","uLtKsKASQ8","FNYIM5VZjS","fcJOyzFgtB","0h1b1Ta8f6","MaJQsmz8gx","24ARFXflUq","aDGtSZUnqt","uN6r3SjskQ","DLhzMdpe1v",
+"uLtKsuJScX","YjB9tXflUq","jSjS3Waim6","pv0i7rKDLJ","LewvMAIYUu","RpBQmChuy3","yEfy99rlg9","zqH0WGrDg7","Gv3FqpFrrl","jzUqRt98iW",
+"7lUXZkZANm","StlDJAIYUu","2TRI7RzaZA","16lHcPb1pa","RACujUl4a1","cQOnvVerEA","EdBKcfFDrJ","euZA5faHir","8U2nU9iGoT","EdBKczqH0W",
+"EdBKcHlUbF","CqqaDK4GS8","Gv3FquAWyp","07n1chUTw7","In3NSEdBKc","1j5L8MGlTF","LewvMgdQsS","uLtKsTa8f6","UmaEvyToGW","sqVrfIjTwP",
+"LbRTHQ6hMC","zY1GYrhl0J","OHaBzNxx9V","JIqXiVLTy6","Rxrsm0MR5X","m4bxUoGu6x","ciuWzv8yFN","FnPFBix74r","fcwDaLbRTH","GSQwjMkgy8",
+"W3VFHuupzk","Zv7z08hJdt","d85a98xEKz","FLsphJ2mQi","VNCPdQssNC","2ZHdkZv7z0","wDajXpFrrl","OUYuFulk41","fcJOyAXpwE","P6bcgtl72W",
+"xXTI4djsrv","0PktIJkzUn","Mm8si2Yz7E","d7vjMGWqqX","In3NSYh1hF","RsQUqfcJOy","HlUbF5IhmG","FwEJz45cIH","RsQUqGWqqX","I7p2aFnPFB",
+"QworubrhlQ","8hJdtNhXdu","JRJQBfLNg8","lkMUASmGzv","7fKYUZhwG1","Q6LixJJs5m","hi5X7zHF1q","Yh1hFsqVrf","YOfrYlViBv","Mm8si5Namm",
+"HfyNQQ6Lix","t98iW55rfB","RBhp0580YD","pWiOsxXTI4","lViBvs93Ml","TwanoFVMxo","AgJHQt98iW","JIqXiSWfou","azIWpUvlv4","gIYvEk85Ae",
+"BCxeCjiVBP","GSQwj5ZaEz","DLhzMdjsrv","jfREuPb1pa","yofH3uvf7A","ThjNnCfgr3","IKxdL2ZHdk","pT8wufLNg8","JJs5mAIYUu","QYxC0AOgEe",
+"GWqqX8hJdt","9iGoTfcJOy","cL0aE580YD","he9IAyluBx","IjTwPS2Dfu","5VZjSydG8U","nlaByCxVEf","aL6AJ9y4lw","5ZaEz0h1b1","BGaQYWmadA",
+"5Drn0MGlTF","MaJQsNOHsz","Mm8si0BmCy","v8yFNRBhp0","mz8gxVIlwP","gtCA5UlU3M","rKDLJqQxHP","0h1b1ZzJHW","oQ87rHfyNQ","Q6LixOUYuF",
+"Gv3Fq8TxD7","fmIK1CNHmv","k85AeMm8si","iKqhrfFDrJ","YjB9tPYBf4","1v5hHThjNn","pmeCd2Nslm","mX2GEix74r","MezSW5nmWv","6q6L9azIWp",
+"v1HlnoGu6x","FjHXR6q6L9","RmDcrJRJQB","14FLR7Ow5C","DcpWBMmKGJ","lj07Q2ZHdk","fqypyK20wK","KASQ8BFkb8","oQ87r14FLR","5Drn0POUYS",
+"a00b5d85a9","L7cGcd7vjM","v2eC3aDGtS","v1HlnCfgr3","BFkb8RACuj","dQ586cmXIX","0h1b1MezSW","P6bcg6q6L9","Dz1R3iKqhr","qUJMd7lUXZ",
+"7fKYUVjCZq","8RCUA9GXkX","WPmlxB3qem","WPmlxPOUYS","XflUqfLNg8","e6e4zCK5W7","XyPZNFNYIM","G1RhSSbRYy","2ZHdkv1Hln","Gv3FqdmoS7",
+"I7p2a0YAGH","AmdQdWaWsv","8TxD7lm0pD","pmeCdogLgc","FjHXRU3yw5","Mkgy8MezSW","tvdkD7ku1p","C2Ircd85a9","x3LDe8cVD3","StlDJazIWp",
+"4QMc98hJdt","lweGypAhR1","XyPZNZJTXH","JXljWhYBCK","yToGWOUYuF","fFDrJW7cTs","aez9yiwzGk","zqH0WL7cGc","RBhp014FLR","jtn0XzQt6Q",
+"vkCHH7hyVv","gjUTuv8yFN","TXQ0Z9iGoT","HRxd8ZJTXH","atef2v1Hln","AXpwE64s8N","W3VFHF6PT2","jzUqRJXljW","ni2v1POUYS","fcwDaWMiS3",
+"4QMc9VjCZq","tjQxsnlaBy","nnP8ohE1Ql","lH1ktvLsmS","s7MxklweGy","O3iyQ64s8N","Vprf229QAz","ZuDtDtlILt","U3yw5aez9y","GrDg7CxVEf",
+"FGzgp6q6L9","4W0TllkMUA","Mkgy8SmGzv","CIShGDG4sT","9GXkXNxx9V","ReKEWKASQ8","WDVWJGSQwj","suY4xCxVEf","QbxXcjeskS","Y1mC0pv0i7",
+"rz7UttjQxs","RzaZAFLsph","uvf7AFcWrW","cQOnvYOfrY","yluBxNOHsz","EdBKcdpe1v","NcICA16lHc","xXTI4Fhtgl","okgRiksJby","jzUqRkZANm",
+"iB08lHRxd8","fFDrJFnPFB","dmoS7t59lR","Mkgy8pmeCd","WPmlxfFDrJ","HzZT8k85Ae","WDVWJfaHir","pmeCdCIShG","FcWrWsqVrf","7lUXZYw2oU",
+"StlDJjeskS","ZhwG1Pb1pa","RsQUqIjTwP","o8UydjiVBP","7X3uyJJs5m","pmeCd4dEz6","sqVrfDG4sT","GXdoHVIlwP","nFqikFGzgp","dpe1vl83Ud",
+"S2Dfu07n1c","NcICArhl0J","pv0i7Cfgr3","Oz8yZyvOMI","Ul4a1P6bcg","DcpWBSWfou","aL6AJ4QMc9","HlUbFlweGy","StlDJ2hEEU","Yw2oUsqVrf",
+"cmXIXAgJHQ","IKxdLb29RJ","wiHrZhE1Ql","8RCUARzaZA","lCMxySjskQ","uQIczAIYUu","5Mg9ruZPqg","Ta8f6SjskQ","SmGzvni2v1","2hEEUYh1hF",
+"KsjRK64s8N","blLA9uAWyp","BGaQYlH1kt","ni2v1fLNg8","3weIFsx5Gl","tvdkDBCxeC","W7cTs3otm6","RmDcrvLsmS","vkCHHDz1R3","ZUnqte6e4z",
+"AmdQdVLTy6","MmsIoBCxeC","s7MxkgtCA5","5Mg9rB3qem","JKWYRuZPqg","9XyT9lkMUA","Dz1R3lkMUA","CxVEf4QMc9","e6e4z64s8N","W7cTs7Ow5C",
+"Z4I1v3otm6","AOgEe5Drn0","MmsIoUlU3M","9rlg9v8yFN","iB08l4W0Tl","8TxD79eoRc","Ul4a1Yh1hF","SmGzv2Yz7E","BbwgACp3mZ","gtCA5lViBv",
+"2Yz7Erz7Ut","F6PT22DREs","ZuDtDAmdQd","IBe8kHP433","5Mg9rL7cGc","WDVWJNo0Qb","tjQxsOxWIH","3otm6SmGzv","GrDg7lweGy","AmdQdqUJMd",
+"U3yw5BGaQY","JRJQBatef2","Ul4a1M6qcG","ksJbyK20wK","b29RJAkKTk","9GXkXSWfou","0PktI9eoRc","45cIHUmaEv","Mkgy8oGu6x","Q6hMCS77LH",
+"7hyVvJXljW","pAhR1CdyBV","Pb1paGv3Fq","JXljWpmeCd","Ta8f6zY1GY","guMb8F6PT2","GWqqXa00b5","F6PT2rhl0J","QChxsO3iyQ","bZLvSCNHmv",
+"uN6r3wiHrZ","I7p2aogLgc","suY4xW7cTs","lj07QMezSW","Vprf2lm0pD","n8pJ9gf8rI","Pb1pa4W0Tl","lj07QyToGW","ThjNn48cHL","BpYhV7X3uy",
+"pmeCd16lHc","Vprf2BbwgA","fcwDaOz8yZ","W7cTsHfyNQ","v2eC3djsrv","vkCHHuvf7A","8cVD3MK07Y","ZuDtDPb1pa","JIqXit98iW","cShY2LbRTH",
+"iKqhr618Di","zz4ZUjfREu","LDk6fHzZT8","zz4ZUKr8ys","B3qemCNHmv","ECMvURACuj","dhSuHZuDtD","oVQp6EOE1o","DG4sTHfyNQ","7hyVvQnJ1S",
+"JJs5m0Kyfs","MK07YP6bcg","2TRI79y4lw","pWiOspAhR1","zY1GYuN6r3","nFqikh1zcH","vkCHH5Mg9r","MojnPReKEW","zHF1qW7cTs","nnP8ocmXIX",
+"taOXKfFDrJ","I7p2aDQimp","YOfrYfcwDa","fLNg8pv0i7","k85AeAgJHQ","CK5W7m4bxU","OHaBzlweGy","jSjS3IRh48","fcwDaIjTwP","Zv7z0RACuj",
+"v8yFNulk41","7Ow5CzmLYD","CK5W7uAWyp","x3LDeTwano","zbIYY7X3uy","Cp3mZZzJHW","7ku1pSWfou","cQOnvCp3mZ","Ul4a1BCxeC","kZANmQClRL",
+"7fsYMTXQ0Z","hE1QlgdQsS","0YAGHzbIYY","MojnPlpF6W","U3yw5Twano","JXljWhi5X7","MmKGJZUnqt","WDVWJY1mC0","uPX7GgdQsS","JXljWYjB9t",
+"MK07YbgJAz","8U2nUGXdoH","GXdoHWaWsv","WaWsvbZLvS","UmaEvb29RJ","lViBvzbIYY","t98iWSjskQ","Yf2EcRxrsm","VerEAXyPZN","jtn0XlCMxy",
+"S77LHfaHir","prNT6FVMxo","jzUqR7fsYM","pAhR1KASQ8","zHF1qRACuj","X6PinFGzgp","8xEKzFjHXR","5iGN50Wr5y","fLNg8uupzk","VNCPdnlaBy",
+"iKqhrSbRYy","brhlQYjB9t","sx5GlSmGzv","GrDg7wDajX","1LB1L5Namm","iKqhr7fKYU","ZuDtDb29RJ","kZANmDcpWB","gtCA5jeskS","cmXIXtl72W",
+"Waim6MojnP","ZJTXHblLA9","qUJMdBGaQY","WMiS35iGN5","l83UdTa8f6","5Drn0yvOMI","pT8wu2hEEU","BpYhVFNYIM","Pb1paCdyBV","LbRTHLDk6f",
+"kZANmAOgEe","uJScXokgRi","AIYUuhi5X7","x3LDeNcICA","tlILtix74r","SmGzvuvf7A","RxrsmGWqqX","W7cTsJIqXi","Ta8f6vOqCE","vOqCETwano",
+"RmDcrVBjhz","FwEJzOHaBz","DG4sT3weIF","GXdoHjtn0X","qUJMdpiJSk","YjB9tKr8ys","piJSkfqypy","lsQGo16lHc","jeskS29QAz","ZJTXHlH1kt",
+"EOE1onlaBy","ulk41tlILt","SjskQazIWp","BGaQYaL6AJ","xXTI4h1zcH","tAOsrI7p2a","bZLvS2Nslm","Y1mC0Dz1R3","QWxoTtlILt","64s8NSbRYy",
+"07n1cVjCZq","8cVD39y4lw","MezSWuTacx","D6rBylweGy","POUYSP6bcg","ix74rCNHmv","zFgtBHRxd8","jtn0X8TxD7","OxWIH8FmFH","9eoRcBbwgA",
+"jtn0XS77LH","lj07QguMb8","DQimpDQimp","jzUqRQWxoT","Gv3FqfFDrJ","ulk412Nslm","8RCUAMojnP","TwanoYw2oU","lXFOBMmsIo","HP433ThjNn",
+"Twano14FLR","JXljWOUYuF","OxWIH4W0Tl","F6PT2uLtKs","9iGoT0h1b1","fmIK18TxD7","U3yw59GXkX","W7cTstl72W","ogLgcksJby","VIlwP580YD",
+"GXdoHChuy3","LDk6fK20wK","WPmlx2Yz7E","i7WMQOHaBz","EdBKcI7p2a","blLA9FwEJz","DcpWBtl72W","AOgEeyToGW","F6PT2OUqFM","zbIYYlXFOB",
+"jS1ajv8yFN","y94nwQChxs","faHir7Ow5C","5nmWvOUYuF","ni2v1BCxeC","aFFssaFFss","QbxXcdpe1v","yofH3LbRTH","uN6r3W7cTs","aez9ytAOsr",
+"MezSWkZANm","nlaByfmIK1","Vprf2L7cGc","n1pmOXflUq","0ao3lNhXdu","GWqqXvLsmS","m4bxUjtn0X","hi5X7iKqhr","48cHLatef2","lpF6WLDk6f",
+"Oz8yZzFgtB","16lHc64s8N","wDajXzbIYY","9rlg9HlUbF","FcWrWzbIYY","FcWrW618Di","Q6LixP6bcg","tl72WxReec","ciuWzFPfSE","AOgEeksJby",
+"iwzGkfLNg8","ciuWzpv0i7","AgJHQ9iGoT","SmGzv8TxD7","Q6LixdmoS7","prNT6uPX7G","In3NS5drc6","YOfrYHP433","CK5W7v8yFN","Uvlv46q6L9",
+"FPfSEbZLvS","QssNCjiVBP","rz7UtfFDrJ","v1HlnBFkb8","bgJAzd85a9","FjHXRM6qcG","Yf2EcaL6AJ","Ta8f6Ul4a1","MaJQszz4ZU","lCMxy7ku1p",
+"580YDKsjRK","ciuWzUlU3M","HRxd8AmdQd","uoStwNhXdu","580YDuQIcz","jfREusuY4x","KASQ8CdyBV","aDGtSIRh48","2hEEUS77LH","5drc6Yw2oU",
+"EdBKcxciqp","zbIYY0BmCy","C2Irche9IA","azIWpfmIK1","suY4xbrhlQ","EOE1oW7cTs","6AFT0lm0pD","cQOnvGSQwj","Kr8ysEdBKc","JRJQBCdyBV",
+"blLA9jSjS3","8FmFHX6Pin","618DiFGzgp","OUqFMFGzgp","HlUbFuvf7A","B3qemjSjS3","gtCA5s4786","jSjS3WDVWJ","n8pJ9euZA5","FjHXRlpF6W",
+"Rxrsmjtn0X","MaJQsFFDui","Dz1R3zY1GY","OHaBz7Ow5C","zz4ZUJ2mQi","YOfrYJ2mQi","1LB1Llj07Q","2hEEUjS1aj","8FmFHMaJQs","O3iyQ5ZaEz",
+"J2mQikB5nP","O3iyQYh1hF","n8pJ9ni2v1","WDVWJ9GXkX","45cIHIBe8k","dQ586EoToP","tjQxs14FLR","TCgPpQYxC0","VIlwPUmaEv","UlU3M8RCUA",
+"Dz1R3cQOnv","aFFssSWfou","wDajX64s8N","euZA5ZhwG1","VIlwP0YAGH","aL6AJHzZT8","BGaQY7X3uy","zbIYYM3zXL","D6rBylCMxy","0KyfsYh1hF",
+"OUYuFLDk6f","gjUTu7hyVv","PYBf4FxX9q","0Kyfs5Mg9r","Yh1hFHzZT8","IRh48Z4I1v","wDajX4QMc9","Mm8siIjTwP","MmKGJMaJQs","aez9yF6PT2",
+"zmLYDRmDcr","jS1ajQ6hMC","BCxeCgf8rI","Ta8f6yToGW","rz7Utn8pJ9","kZANmpT8wu","M6qcGQssNC","QnJ1SQClRL","CqqaDvLsmS","fmIK1MGlTF",
+"D6rByReKEW","bZLvS3otm6","uZPqgIjTwP","VLTy6Ta8f6","9eoRcPOUYS","DcpWBZuDtD","VNCPddpe1v","KsjRKhe9IA","wiHrZFjHXR","W7cTs5Mg9r",
+"GXdoH2TRI7","tlILtFjHXR","uQIczAmdQd","CNHmvdhSuH","IKxdL9iGoT","Uvlv4F6PT2","55rfBWreyP","o8UydK4GS8","RkQke5Mg9r","gtCA5y94nw",
+"8cVD3Gv3Fq","Kr8yspT8wu","jfREuhYBCK","iwzGkuAWyp","6q6L9atef2","HRxd8SbRYy","yofH3CdyBV","Qworu9rlg9","s47869y4lw","FVMxoi7WMQ",
+"QClRLs93Ml","ReKEWRpBQm","VLTy6fmIK1","hE1QlpiJSk","7fsYMZv7z0","0YAGHfLNg8","Y1mC0QChxs","RpBQmEoToP","IBe8k5Namm","UlU3M1v5hH",
+"UmaEvyluBx","RkQke2hEEU","JKWYR9rlg9","d85a9LewvM","tlILtC2Irc","QClRL3otm6","GSQwj5iGN5","e6e4zChuy3","8hJdtCp3mZ","Cp3mZNxx9V",
+"AgJHQ8TxD7","Mkgy8fLNg8","StlDJGv3Fq","Kr8yst98iW","8xEKz5IhmG","QYxC0hE1Ql","zFgtBVprf2","gIYvEeuZA5","taOXKMkgy8","GSQwjD6rBy",
+"Mm8siC2Irc","zqH0W48cHL","Q6LixzHF1q","i3pyds93Ml","Vprf25nmWv","aL6AJ7lUXZ","pvgjSvkCHH","WmadAZUnqt","Ul4a1azIWp","GSQwjGrDg7",
+"e6e4zuQIcz","EdBKce6e4z","580YD1v5hH","yToGW7lUXZ","WmadAzQt6Q","45cIHnFqik","DLhzMv1Hln","JKWYRL7cGc","rz7UtdQ586","YjB9tuoStw",
+"Gv3Fq5VZjS","7hyVvuLtKs","5Mg9rmX2GE","taOXKQnJ1S","blLA95Mg9r","JXljWDLhzM","wiHrZmz8gx","M3zXLzHF1q","GWqqXB3qem","45cIHXflUq",
+"CdyBVRpBQm","IRh48B3qem","2hEEUhSSvQ","HzZT80Wr5y","pmeCdHlUbF","lm0pDtuDyS","lCMxyMK07Y","O3iyQyofH3","aFFssv8yFN","vLsmScQOnv",
+"sqVrfl83Ud","Nxx9VNxx9V","mz8gxcmXIX","ZhwG15Mg9r","OUYuF48cHL","lViBvZzJHW","I7p2aNo0Qb","S77LHv2eC3","Z4I1vTCgPp","2NslmIRh48",
+"Chuy30MR5X","16lHceuZA5","uZPqg7X3uy","Nxx9VUl4a1","ogLgcI7p2a","9rlg99eoRc","bZLvSjfREu","rKDLJyEfy9","hYBCKCIShG","ZhwG1SWfou",
+"QChxsNhXdu","WaWsvNhXdu","AkKTklsQGo","ZJTXHuTacx","gjUTuO3iyQ","SmGzvECMvU","2TRI7AgJHQ","cL0aEfqypy","yvOMIhYBCK","FGzgpxciqp",
+"Mkgy8CK5W7","ZuDtDJkzUn","ydG8Ut98iW","JRJQBOz8yZ","uTacxcQOnv","16lHc4W0Tl","U3yw50PktI","3weIFKASQ8","pFrrlKsjRK","2DREsSbRYy",
+"1LB1L5Drn0","4W0TlJkzUn","uQIcz0h1b1","xciqpD6rBy","tAOsrFwEJz","6AFT0IBe8k","K20wKNo0Qb","dhSuHrKDLJ","uLtKs9XyT9","lH1ktpFrrl",
+"NhXduStlDJ","OxWIH7fKYU","EdBKcv1Hln","lH1ktVerEA","GSQwj5VZjS","4dEz6d85a9","5Drn0aez9y","KsjRKPOUYS","zY1GYNo0Qb","BbwgAtAOsr",
+"hi5X7guMb8","euZA5m4bxU","LDk6f29QAz","JXljWjzUqR","2Yz7EnlaBy","ksJby7X3uy","n8pJ9RsQUq","lkMUAblLA9","NhXduoQ87r","7fKYUNhXdu",
+"lj07QM3zXL","Kr8ysD6rBy","RmDcrKASQ8","K20wKOHaBz","O3iyQFLsph","DLhzMlm0pD","7ku1pDz1R3","Fhtgl618Di","9y4lwKZamH","azIWpn1pmO",
+"Q6LixM3zXL","yEfy93weIF","soy9tS77LH","ru4UGpiJSk","45cIHEoToP","mX2GEQworu","hUTw75Mg9r","FLsphwiHrZ","S2DfuyEfy9","6AFT0KZamH",
+"NAFuw0Kyfs","blLA9ogLgc","m4bxUfFDrJ","y94nwIRh48","ThjNnZJTXH","soy9t5IhmG","JXljWfFDrJ","EOE1oYw2oU","QbxXcoGu6x","yToGW9iGoT",
+"BFkb8fLNg8","jzUqRECMvU","8xEKzNxx9V","jzUqRoGu6x","618DiCK5W7","1LB1LNOHsz","8RCUAL7cGc","tAOsrY1mC0","1v5hHOUYuF","IBe8kCp3mZ",
+"nlaByfqypy","7fKYU9eoRc","B3qemL7cGc","QWxoTDQimp","CIShGZUnqt","jtn0XpAhR1","Q6LixKASQ8","AmdQdgf8rI","618Div2eC3","45cIH3weIF",
+"qaofNHRxd8","b29RJlH1kt","BbwgAZzJHW","9XyT9CdyBV","vkCHHY1mC0","uoStw2ZHdk","L7cGcJIqXi","iB08l0Kyfs","Q6hMCJIqXi","CIShGzFgtB",
+"Rxrsmuupzk","2NslmuLtKs","x3LDeBbwgA","lpF6WRBhp0","JkzUnHzZT8","AkKTkkB5nP","oQ87rqUJMd","brhlQRkQke","FwEJz8U2nU","FPfSEuupzk",
+"QnJ1SSWfou","yEfy9S2Dfu","sx5GlEdBKc","GXdoHiqv4k","8RCUA8TxD7","ECMvUDLhzM","5Mg9r29QAz","gIYvEAXpwE","0h1b1DG4sT","uoStwFwEJz",
+"oVQp6n1pmO","VBjhzSWfou","SWfouW3VFH","DG4sTS2Dfu","mz8gxni2v1","UmaEv8xEKz","ru4UGbrhlQ","taOXKCqqaD","ECMvUAgJHQ","RkQkehYBCK",
+"8FmFHNAFuw","y94nwm4bxU","uTacxPOUYS","GSQwjdjsrv","MojnPsuY4x","v1HlnqUJMd","HlUbFK20wK","Q6hMCTa8f6","gf8rIWmadA","sqVrfL7cGc",
+"EdBKckZANm","PYBf4oGu6x","zz4ZUVerEA","FNYIMlpF6W","e6e4zAXpwE","d7vjMzY1GY","n8pJ9yEfy9","ix74re6e4z","Cp3mZ9y4lw","D6rByZv7z0",
+"s93MlZJTXH","qUJMdlViBv","gIYvESjskQ","oQ87rRzaZA","LbRTHPb1pa","QChxsmz8gx","uAWypKZamH","Ul4a1jSjS3","lsQGo4QMc9","HzZT8Cfgr3",
+"FnPFB3weIF","v1HlnMmKGJ","In3NS9XyT9","HfyNQX6Pin","kB5nP2DREs","Nxx9VydG8U","dmoS7lj07Q","0PktId7vjM","NOHszSs0Zu","dmoS74W0Tl",
+"BGaQY0h1b1","WPmlxxciqp","lj07QzFgtB","64s8NJ2mQi","0ao3lFVMxo","Z4I1vYf2Ec","FGzgpjfREu","Mm8siZzJHW","wiHrZ8U2nU","Nxx9VZzJHW",
+"FxX9qlweGy","FxX9qpWiOs","UlU3MMojnP","ZzJHW580YD","t98iWAkKTk","ogLgckB5nP","l83UdWmadA","d7vjMKZamH","HzZT8Waim6","W3VFHUl4a1",
+"YjB9tRACuj","Z4I1vAmdQd","48cHL64s8N","CdyBV7Ow5C","uoStwMmKGJ","tAOsrydG8U","cL0aE9y4lw","TCgPpIRh48","ThjNnjS1aj","QYxC05Drn0",
+"rhl0Jzz4ZU","ZzJHWnlaBy","Uvlv4zFgtB","AXpwEQYxC0","Ul4a1aez9y","iqv4k0Wr5y","hSSvQSmGzv","d7vjM2TRI7","4QMc9dpe1v","QYxC0kB5nP",
+"EOE1o8hJdt","JIqXiuupzk","zQt6QqUJMd","euZA5zz4ZU","UmaEvSWfou","QWxoTksJby","xXTI4d7vjM","bgJAzru4UG","S2Dfus7Mxk","F6PT2TCgPp",
+"L7cGcgdQsS","5VZjSPOUYS","Waim6aez9y","e6e4z0Wr5y","gIYvEReKEW","ZUnqtrhl0J","s4786IBe8k","uN6r35Drn0","RkQke1j5L8","lH1ktAOgEe",
+"ECMvUuoStw","uoStwFhtgl","VLTy6Pb1pa","fcJOyReKEW","BbwgAQChxs","0ao3lzqH0W","QworuQ6Lix","b29RJThjNn","Yw2oUQClRL","AIYUuMm8si",
+"MojnPWPmlx","nnP8o0ao3l","uPX7GMaJQs","5nmWvxXTI4","oQ87r7lUXZ","Y1mC0uN6r3","oQ87rDcpWB","ThjNns7Mxk","P6bcgXyPZN","aDGtSQbxXc",
+"OHaBzQYxC0","TCgPpfcJOy","Mm8siv1Hln","uAWypzqH0W","7fKYUlm0pD","M3zXLtjQxs","CNHmvsoy9t","zY1GYRpBQm","XflUqulk41","lm0pDFFDui",
+"fmIK1JIqXi","QYxC0ksJby","6q6L9uLtKs","lsQGo1v5hH","yvOMIyluBx","NhXdu8cVD3","ni2v1lweGy","P6bcg0Kyfs","8FmFHGWqqX","tlILtFVMxo",
+"dQ5866AFT0","zHF1qtjQxs","bZLvSAmdQd","ni2v1pAhR1","5nmWvAmdQd","qQxHPcShY2","1j5L8FFDui","RkQketlILt","EdBKc2hEEU","zz4ZUpiJSk",
+"lkMUAFPfSE","5nmWvQnJ1S","CdyBVJRJQB","VNCPdiqv4k","gIYvEbZLvS","vLsmSO3iyQ","0KyfsQWxoT","RACujMm8si","pmeCdZJTXH","b29RJ2ZHdk",
+"14FLR7fKYU","B3qemJJs5m","e6e4zYf2Ec","2hEEUs93Ml","oQ87rRmDcr","e6e4z6q6L9","iB08lvOqCE","azIWpl83Ud","aDGtSAOgEe","Yf2Eci3pyd",
+"6AFT0yvOMI","ksJbys4786","ZuDtD9iGoT","16lHc5Mg9r","CK5W7iKqhr","zY1GYuTacx","3weIF64s8N","KsjRKuN6r3","lj07QMK07Y","fLNg8n8pJ9",
+"gf8rItjQxs","1v5hHZv7z0","CNHmvZuDtD","CIShGyvOMI","SjskQtjQxs","64s8NRmDcr","S2DfuJXljW","lkMUAZuDtD","qQxHPni2v1","y94nwQ6Lix",
+"Yh1hFlm0pD","k85Aes93Ml","jeskS2TRI7","i7WMQFwEJz","CqqaD7ku1p","EOE1o4W0Tl","VLTy6ReKEW","n8pJ9QWxoT","uLtKsOz8yZ","9rlg95Drn0",
+"Nxx9VS77LH","piJSkSWfou","CNHmvRzaZA","X6Pin580YD","IBe8k7X3uy","AmdQdQworu","MmsIo2Nslm","FhtglPOUYS","mz8gxWmadA","xciqp9iGoT",
+"xXTI4tlILt","l83UdnFqik","kB5nPxciqp","kB5nPgtCA5","faHiri7WMQ","ZzJHWuJScX","i3pydLbRTH","QssNC4dEz6","AgJHQG1RhS","MmKGJtlILt",
+"9eoRcWaim6","aFFssRmDcr","hSSvQ64s8N","5VZjSQssNC","LewvM4W0Tl","iKqhr3weIF","HzZT8zqH0W","5Drn0lkMUA","ThjNnUvlv4","4QMc92DREs",
+"uoStwuQIcz","FGzgpgIYvE","JXljWzY1GY","DG4sTQChxs","S2DfuMK07Y","QbxXcKr8ys","l83UdPOUYS","lweGy2hEEU","DQimpt98iW","NOHszFxX9q",
+"9y4lwFhtgl","POUYSiB08l","ksJbyyEfy9","7lUXZlViBv","Ul4a1k85Ae","dpe1vqQxHP","Oz8yZMm8si","S77LH0Kyfs","CNHmvtaOXK","MK07YFGzgp",
+"ZUnqtFjHXR","618DixXTI4","TXQ0Z5Drn0","1LB1LvOqCE","jzUqRVprf2","Pb1paOUqFM","K4GS8wiHrZ","G1RhSFLsph","mz8gx4QMc9","UlU3MokgRi",
+"7fKYUBpYhV","lViBv0h1b1","AIYUuW3VFH","5ZaEzblLA9","NhXduWreyP","tuDyS24ARF","JRJQBDG4sT","zFgtBzHF1q","NAFuwjS1aj","64s8Naez9y",
+"WMiS3xReec","taOXKFwEJz","yToGWFhtgl","0YAGH9GXkX","lpF6W2TRI7","OxWIHThjNn","QnJ1STXQ0Z","EdBKcFhtgl","zY1GYn8pJ9","0ao3lLewvM",
+"fqypyGSQwj","pAhR1dmoS7","sx5Gl5IhmG","HfyNQEoToP","jiVBPEoToP","K20wKIBe8k","M3zXLX6Pin","OHaBzK4GS8","14FLRJ2mQi","lXFOB9rlg9",
+"MGlTFvOqCE","suY4xzmLYD","0Wr5yiqv4k","d7vjMO3iyQ","LDk6fQnJ1S","b29RJEdBKc","GWqqXcL0aE","guMb8euZA5","prNT6yvOMI","wDajXWaWsv",
+"F6PT22ZHdk","bZLvSNcICA","xXTI4QWxoT","8TxD7cShY2","n8pJ9S77LH","vOqCEpFrrl","hE1QlQnJ1S","0YAGHVjCZq","SjskQHP433","uQIczCqqaD",
+"o8UyduPX7G","hE1QlTCgPp","VNCPd6q6L9","yluBxo8Uyd","v2eC3jeskS","MmsIocmXIX","ZzJHWs4786","5Drn0JKWYR","KASQ8pWiOs","Zv7z0L7cGc",
+"xXTI4YOfrY","LbRTHVjCZq","RpBQmO3iyQ","AkKTkni2v1","FNYIMYjB9t","6AFT0VjCZq","k85AeRkQke","gtCA59XyT9","ulk411LB1L","vkCHHFwEJz",
+"In3NSlXFOB","Z4I1vSmGzv","24ARFzqH0W","RpBQmQChxs","Y1mC0fcwDa","S2DfuvLsmS","EoToPFhtgl","YOfrY5nmWv","StlDJDG4sT","580YD4QMc9",
+"uvf7ASbRYy","xReecvOqCE","OxWIHOUYuF","uTacxatef2","ogLgctlILt","vkCHHWMiS3","29QAzv8yFN","VNCPd8xEKz","FFDuiJJs5m","h1zcHO3iyQ",
+"SjskQ5IhmG","AXpwE7Ow5C","iwzGkm4bxU","OUqFMZUnqt","nlaByHlUbF","Waim6oGu6x","JXljWyEfy9","mz8gxtuDyS","M3zXLEOE1o","taOXKAmdQd",
+"3weIFkB5nP","QWxoTRzaZA","zHF1qQYxC0","h1zcHaL6AJ","zmLYDtlILt","2NslmsqVrf","he9IAMaJQs","Fhtgl5iGN5","bZLvSK4GS8","GWqqX2Yz7E",
+"sx5Glpv0i7","oVQp6mX2GE","d7vjMgjUTu","7X3uyjSjS3","ThjNnn8pJ9","StlDJFPfSE","HP433RpBQm","iKqhrnlaBy","xReec7ku1p","tvdkDoQ87r",
+"55rfBlCMxy","D6rByHzZT8","e6e4zCfgr3","jS1ajS77LH","NhXduM6qcG","zbIYYvkCHH","m4bxUGWqqX","5nmWvpWiOs","OUqFMv8yFN","s4786Kr8ys",
+"cShY2FNYIM","QworuQworu","MaJQshUTw7","CqqaDEOE1o","prNT6MmsIo","O3iyQblLA9","2hEEUb29RJ","HfyNQnnP8o","FGzgpdjsrv","SmGzvpWiOs",
+"jtn0XYh1hF","iB08lMm8si","QClRLAgJHQ","7Ow5CL7cGc","l83UdpvgjS","WDVWJ2Yz7E","HzZT8dhSuH","tjQxsDcpWB","pv0i7lsQGo","yToGWHRxd8",
+"n8pJ9Rxrsm","YOfrYD6rBy","cQOnvWreyP","8FmFH5iGN5","LDk6fQChxs","l83UdReKEW","Mm8siEdBKc","JkzUnFhtgl","2Yz7ERBhp0","WaWsvlkMUA",
+"QbxXcguMb8","6AFT08xEKz","TXQ0ZLbRTH","8cVD3Fhtgl","bgJAz24ARF","JIqXiQClRL","WPmlxjeskS","S2DfusqVrf","Ta8f6RsQUq","t98iWuJScX",
+"KASQ8jtn0X","FxX9qe6e4z","FLsphs93Ml","zmLYDpvgjS","ECMvUjiVBP","d85a97lUXZ","FGzgpDQimp","FxX9qprNT6","dpe1vVBjhz","yEfy9brhlQ",
+"7fsYMQWxoT","Q6hMC0MR5X","FNYIMXflUq","ydG8UQChxs","uN6r3AXpwE","atef2i3pyd","QYxC0TXQ0Z","yToGWyluBx","RACujnlaBy","5nmWv9iGoT",
+"xReeca00b5","FnPFBUmaEv","RmDcrZUnqt","GWqqXMGlTF","8xEKzNhXdu","W7cTsgjUTu","hUTw74W0Tl","F6PT2djsrv","2ZHdkulk41","lViBvY1mC0",
+"pAhR1DG4sT","pAhR1DcpWB","8cVD3dmoS7","8hJdtvLsmS","3weIFiKqhr","l83Udrz7Ut","Cp3mZSs0Zu","HzZT8jS1aj","SWfouNOHsz","XyPZNYf2Ec",
+"MmKGJjzUqR","0Wr5ye6e4z","mX2GERsQUq","yToGWO3iyQ","2ZHdkGrDg7","RsQUqIBe8k","dhSuHtuDyS","BGaQYpiJSk","pvgjSzbIYY","suY4xEOE1o",
+"WPmlxatef2","kZANmpFrrl","64s8NMkgy8","l83UdL7cGc","Ul4a1bZLvS","mX2GEmz8gx","zz4ZUuoStw","U3yw5DG4sT","dmoS70Wr5y","RpBQmmX2GE",
+"tuDySdhSuH","dQ586RkQke","s7MxkJXljW","azIWpFjHXR","ZzJHW0Kyfs","cmXIX3otm6","Cfgr3LbRTH","5nmWvLbRTH","5nmWvzqH0W","pAhR1dQ586",
+"uJScXMkgy8","gf8rIW7cTs","suY4xfLNg8","GSQwjW3VFH","aDGtSGrDg7","9iGoThUTw7","OUYuFsuY4x","OHaBz7fsYM","JXljWIjTwP","piJSkokgRi",
+"pvgjS5Drn0","RzaZApvgjS","blLA9s7Mxk","2TRI7fLNg8","JIqXiZhwG1","gf8rITCgPp","DG4sTXflUq","QworuYjB9t","dQ5864QMc9","ReKEWpvgjS",
+"fmIK1Oz8yZ","Cfgr3lCMxy","TXQ0ZMmKGJ","IKxdLZuDtD","gdQsSOUqFM","3weIFrKDLJ","C2IrcS77LH","8TxD7d85a9","FVMxo5IhmG","IRh48azIWp",
+"wiHrZSs0Zu","7fKYUd7vjM","fcJOyCNHmv","tAOsrK20wK","BpYhVpvgjS","x3LDeo8Uyd","3weIFDLhzM","5Drn0tjQxs","Q6hMC48cHL","AmdQdM3zXL",
+"BpYhV3weIF","Oz8yZNOHsz","taOXKlkMUA","NcICApWiOs","S2Dfun1pmO","MK07Y5iGN5","uPX7GAkKTk","8U2nUk85Ae","SWfoulH1kt","ix74rfFDrJ",
+"tl72W1LB1L","JIqXiOHaBz","pvgjSyluBx","4W0TlWmadA","aDGtSO3iyQ","lXFOBn8pJ9","FcWrWFwEJz","jeskSazIWp","ru4UGD6rBy","jS1ajKASQ8",
+"sx5GlDLhzM","ZhwG1S2Dfu","sx5GlQnJ1S","taOXKix74r","sqVrfMkgy8","FwEJzyvOMI","fmIK1uJScX","zqH0WoGu6x","WPmlxdpe1v","uZPqgMGlTF",
+"AOgEevLsmS","Q6LixyluBx","HfyNQ5iGN5","W3VFHuPX7G","2Yz7EFFDui","fqypyn1pmO","Mkgy8UlU3M","EoToPo8Uyd","vOqCEYf2Ec","t59lRFxX9q",
+"uAWypdpe1v","Yw2oUQbxXc","SbRYyAkKTk","oGu6xfaHir","lH1ktogLgc","yEfy9DG4sT","Nxx9VQssNC","djsrvDG4sT","X6Pin0BmCy","RxrsmM6qcG",
+"580YD0Wr5y","yluBxB3qem","8FmFHo8Uyd","8FmFH8hJdt","yEfy9tl72W","OUqFMd85a9","n1pmOGv3Fq","JkzUn8xEKz","VjCZqDG4sT","VIlwP7fsYM",
+"VNCPd3otm6","lpF6WQbxXc","nnP8o0YAGH","SbRYyfcwDa","HfyNQrKDLJ","CIShGL7cGc","RzaZAcQOnv","HlUbFzHF1q","StlDJGWqqX","IjTwPSbRYy",
+"jzUqRDG4sT","I7p2aru4UG","h1zcHCp3mZ","BGaQYKZamH","b29RJ55rfB","0MR5X07n1c","HRxd80YAGH","FNYIM4QMc9","xXTI4blLA9","1LB1LLbRTH",
+"n1pmOIjTwP","DLhzMpvgjS","iqv4kKZamH","IRh48ThjNn","wiHrZzY1GY","OUYuFDLhzM","kB5nPpT8wu","AmdQdWDVWJ","lsQGoi3pyd","FGzgpVjCZq",
+"8FmFH9iGoT","DcpWBL7cGc","gtCA5aez9y","kB5nPJKWYR","Yh1hFEdBKc","TXQ0ZUvlv4","Zv7z0JKWYR","OUYuFOz8yZ","lkMUAgtCA5","gjUTuNxx9V",
+"s93MlzmLYD","Kr8ysni2v1","DcpWBksJby","1LB1LEOE1o","OHaBzZzJHW","nlaByxXTI4","jS1ajHP433","2NslmMK07Y","ksJbybrhlQ","uoStwzqH0W",
+"tl72WzbIYY","vLsmSCp3mZ","uN6r3taOXK","dhSuHpvgjS","tlILt07n1c","8xEKzStlDJ","FNYIMzz4ZU","qUJMdK4GS8","WPmlxuoStw","HRxd8qQxHP",
+"HP433x3LDe","YjB9tQChxs","faHirYf2Ec","1j5L8Y1mC0","v8yFNx3LDe","taOXKpvgjS","DLhzMUlU3M","HRxd8fLNg8","iqv4kZJTXH","0KyfslCMxy",
+"I7p2a2ZHdk","aL6AJjeskS","ix74rDLhzM","uupzk2DREs","k85AezHF1q","XyPZN8TxD7","RmDcrTa8f6","hSSvQM3zXL","P6bcglj07Q","yluBxK20wK",
+"5IhmGbZLvS","9rlg9gf8rI","5drc6s7Mxk","ZzJHWjS1aj","Gv3FqkB5nP","WreyPv1Hln","VIlwPStlDJ","ZhwG1POUYS","iwzGkgf8rI","MGlTFt59lR",
+"S2DfuPYBf4","5Drn00YAGH","WPmlxFLsph","Q6hMCo8Uyd","zFgtBReKEW","MK07YC2Irc","aL6AJUmaEv","8TxD71LB1L","WMiS3Ul4a1","gIYvE55rfB",
+"Pb1pa580YD","gf8rI24ARF","FwEJzv2eC3","FLspheuZA5","uN6r3OHaBz","8cVD3POUYS","wDajXTa8f6","tuDySKASQ8","d7vjMuTacx","pv0i7WMiS3",
+"M6qcGZUnqt","lkMUAHfyNQ","0YAGHK20wK","lsQGo9y4lw","WPmlxpmeCd","dhSuHs4786","2NslmYh1hF","TwanoJJs5m","P6bcg5iGN5","DcpWBpmeCd",
+"K4GS8gtCA5","ulk41e6e4z","ydG8Uhe9IA","ogLgc9y4lw","BbwgA2DREs","2hEEUUlU3M","HfyNQfFDrJ","jS1aj24ARF","5VZjSdhSuH","i3pydJKWYR",
+"POUYSMaJQs","Oz8yZpAhR1","MmsIoCdyBV","JkzUnMojnP","ni2v1ru4UG","QYxC0iKqhr","Mm8sizFgtB","rKDLJlCMxy","FVMxo618Di","3otm6wiHrZ",
+"Mkgy824ARF","oGu6xYw2oU","W3VFHlCMxy","RkQkeuupzk","gf8rIFVMxo","iKqhr8hJdt","ix74rHfyNQ","GWqqXgIYvE","55rfBvLsmS","5NammKr8ys",
+"guMb87Ow5C","pWiOs2Nslm","64s8N9XyT9","4W0TlciuWz","WPmlxfcwDa","8FmFHuAWyp","gjUTupiJSk","tvdkDdhSuH","RpBQmDLhzM","IjTwPe6e4z",
+"Cfgr3sx5Gl","K20wKydG8U","lj07QpvgjS","RBhp0hE1Ql","fcwDaB3qem","uvf7AMGlTF","Cfgr3KASQ8","EdBKcjtn0X","kZANmMmKGJ","oQ87ryofH3",
+"oQ87rJKWYR","tAOsratef2","uAWyp4dEz6","FxX9qIBe8k","uoStwn8pJ9","jiVBPjzUqR","bgJAzJXljW","ulk41lkMUA","MmsIoDQimp","GXdoHTwano",
+"lsQGosoy9t","uLtKsru4UG","GWqqXl83Ud","JJs5mW7cTs","gf8rIbgJAz","W3VFHFxX9q","ZhwG1aL6AJ","oQ87rS77LH","7fsYMDcpWB","pFrrlOHaBz",
+"EoToPzFgtB","ZUnqtSWfou","fLNg83weIF","tlILtThjNn","SbRYy5iGN5","RmDcrIRh48","zqH0W5drc6","9y4lwuTacx","AkKTk64s8N","aFFssguMb8",
+"jfREuMkgy8","2DREsYh1hF","rhl0JjS1aj","zmLYDECMvU","RpBQm4QMc9","qQxHP5Namm","yEfy9FFDui","QnJ1SLbRTH","mX2GEKASQ8","cmXIXogLgc",
+"tvdkDlXFOB","CqqaDwiHrZ","pmeCdU3yw5","7X3uyVIlwP","8FmFHpFrrl","HP433Oz8yZ","mz8gxWMiS3","BFkb8hSSvQ","VerEAx3LDe","7ku1pMkgy8",
+"5drc6lCMxy","8cVD3OUqFM","v1HlnIKxdL","FFDuiRmDcr","NcICAgdQsS","Pb1pannP8o","a00b5zQt6Q","NcICAJKWYR","d85a9hi5X7","MK07Y5drc6",
+"hYBCKWMiS3","UlU3MpAhR1","HfyNQoGu6x","fLNg8IjTwP","ogLgcJkzUn","aDGtSd85a9","I7p2aDcpWB","OHaBzdjsrv","Dz1R3gtCA5","FNYIMxXTI4",
+"dQ586ECMvU","8xEKzS2Dfu","dpe1v7X3uy","fcJOyAIYUu","Chuy3FcWrW","07n1chi5X7","U3yw5QssNC","4dEz6QnJ1S","cmXIX5iGN5","tlILti7WMQ",
+"yEfy9W7cTs","14FLR5Drn0","fqypyVLTy6","OxWIH5nmWv","jiVBP3otm6","WmadAMkgy8","QbxXcFGzgp","n1pmONxx9V","euZA5h1zcH","zz4ZUK20wK",
+"v8yFNrz7Ut","WreyPcShY2","D6rByTCgPp","sx5GlCK5W7","0YAGHdmoS7","lj07Quupzk","t98iWy94nw","J2mQi55rfB","I7p2aFVMxo","v1HlnuQIcz",
+"8TxD7x3LDe","BCxeChE1Ql","iqv4kbZLvS","xReecnnP8o","cmXIXfmIK1","PYBf4SWfou","QClRL5Namm","NOHszni2v1","i3pydM6qcG","s4786P6bcg",
+"gIYvECIShG","29QAzAgJHQ","LbRTHQWxoT","9XyT9SWfou","FNYIMWmadA","L7cGcG1RhS","8U2nURmDcr","lsQGoMmsIo","5drc6WreyP","hUTw7IRh48",
+"K20wKZv7z0","ciuWzECMvU","QClRLpAhR1","ZuDtD48cHL","J2mQiS2Dfu","QWxoTokgRi","48cHLciuWz","ciuWz7ku1p","PYBf4dmoS7","cShY2wDajX",
+"MaJQsCNHmv","29QAz4QMc9","yluBxuAWyp","kB5nPW3VFH","B3qemv1Hln","AXpwEOUqFM","K4GS8GWqqX","e6e4zWaim6","xReecfFDrJ","yvOMIrhl0J",
+"d7vjMJkzUn","s93MlDz1R3","0Wr5ytvdkD","x3LDetvdkD","cQOnvBpYhV","MK07YUl4a1","55rfBFFDui","faHirdQ586","oGu6x7Ow5C","x3LDeoVQp6",
+"pmeCdAIYUu","Zv7z0zFgtB","faHirhYBCK","S2DfuzFgtB","BpYhVdjsrv","lj07Q5ZaEz","Nxx9Vx3LDe","MmKGJ0PktI","x3LDeF6PT2","GWqqXe6e4z",
+"uAWypLDk6f","J2mQipT8wu","hE1QlVIlwP","WaWsviqv4k","HzZT8NhXdu","IRh48CNHmv","UmaEvblLA9","07n1cMojnP","FnPFBtvdkD","8TxD7CdyBV",
+"24ARFZ4I1v","WMiS3okgRi","qaofN3weIF","yluBxfLNg8","Z4I1vKASQ8","dQ586BGaQY","FwEJzGrDg7","8FmFHuN6r3","fLNg89eoRc","LDk6ftAOsr",
+"lH1ktoVQp6","48cHLoQ87r","AOgEeUmaEv","HfyNQ2DREs","Kr8ys9GXkX","4QMc9IjTwP","YjB9t2TRI7","vLsmSRACuj","9iGoTQYxC0","IBe8klj07Q",
+"fLNg88TxD7","v8yFNuoStw","IBe8kblLA9","rKDLJaL6AJ","bgJAzNhXdu","14FLR6q6L9","RsQUqhE1Ql","fcJOyHP433","he9IAReKEW","AmdQdb29RJ",
+"xciqpMezSW","fqypyZhwG1","9GXkXU3yw5","tjQxsyEfy9","SmGzvcL0aE","GXdoHNo0Qb","uvf7An1pmO","Nxx9VAIYUu","gdQsS6q6L9","jtn0XQ6hMC",
+"VBjhzG1RhS","M6qcGni2v1","WaWsvgf8rI","SWfouuQIcz","gjUTuJKWYR","29QAzKsjRK","0h1b1lweGy","aL6AJtaOXK","Ta8f62DREs","B3qemTCgPp",
+"FFDui1LB1L","MezSWOxWIH","ulk41lpF6W","5nmWv7ku1p","7hyVvh1zcH","Mkgy8uvf7A","Q6LixzmLYD","nFqikEdBKc","s7Mxko8Uyd","No0QbRBhp0",
+"i7WMQtaOXK","5iGN5iwzGk","POUYSuvf7A","Nxx9VzFgtB","fcJOyru4UG","n1pmOEOE1o","Fhtgl4dEz6","CqqaDYw2oU","DLhzMulk41","ZzJHWt59lR",
+"zz4ZUIKxdL","lH1ktDz1R3","guMb8yEfy9","5ZaEz8hJdt","M6qcGl83Ud","uQIczuupzk","580YDtAOsr","okgRilXFOB","M6qcGazIWp","LbRTHVBjhz",
+"pWiOsZzJHW","v8yFNjeskS","qQxHPnFqik","OHaBzhUTw7","NOHsz618Di","uvf7ArKDLJ","yvOMI3otm6","Yf2Ec0ao3l","2TRI7m4bxU","HfyNQWPmlx",
+"DLhzMtuDyS","OUqFMblLA9","K20wKdpe1v","L7cGcSs0Zu","prNT6uQIcz","iqv4kqUJMd","NcICAtlILt","i7WMQxXTI4","cL0aEBFkb8","2Yz7EQYxC0",
+"TXQ0ZIjTwP","P6bcgTCgPp","uPX7GeuZA5","sqVrfhE1Ql","CdyBV3weIF","64s8N9iGoT","MGlTFRkQke","9eoRccL0aE","WPmlxQ6hMC","2hEEUSbRYy",
+"zz4ZUyToGW","ZzJHWFLsph","uupzkDQimp","W7cTst59lR","UlU3MOUYuF","4W0TlpiJSk","8hJdtDLhzM","lpF6Ws93Ml","pv0i7AIYUu","FwEJzQssNC",
+"OUqFMCfgr3","QbxXcDcpWB","0KyfsWmadA","yluBx7hyVv","lj07Qx3LDe","xReecuJScX","lweGyCqqaD","Ta8f6fFDrJ","tAOsrlXFOB","48cHL29QAz",
+"618DizHF1q","brhlQCK5W7","pvgjStlILt","pv0i7U3yw5","CK5W7lCMxy","580YDo8Uyd","sx5GlzQt6Q","h1zcHJIqXi","TXQ0ZogLgc","uAWypXyPZN",
+"2DREswiHrZ","vLsmSFxX9q","lViBv8hJdt","Waim64dEz6","Ss0ZuJkzUn","zmLYDjfREu","lsQGozFgtB","i7WMQMezSW","JXljWfcwDa","dmoS7i7WMQ",
+"2DREsIBe8k","zY1GYzmLYD","BGaQYcQOnv","RxrsmYjB9t","t59lRjtn0X","S2Dfuaez9y","tjQxsQChxs","xReec4dEz6","4dEz6pFrrl","dQ5868RCUA",
+"RBhp0UlU3M","v2eC3EoToP","Yf2EcqUJMd","iqv4kGXdoH","azIWpzHF1q","jSjS3No0Qb","x3LDe8xEKz","IBe8kCNHmv","4W0Tlix74r","suY4xYf2Ec",
+"n8pJ9sx5Gl","jfREuCp3mZ","Uvlv4ECMvU","MGlTFPYBf4","ZUnqtgjUTu","Yw2oUIRh48","pv0i7d7vjM","o8UydEoToP","SmGzvfFDrJ","kB5nPoGu6x",
+"5VZjSZv7z0","oGu6xzz4ZU","rKDLJciuWz","24ARFiKqhr","64s8Nh1zcH","nlaBysoy9t","AkKTkNhXdu","Dz1R3tl72W","vLsmSZv7z0","VLTy6POUYS",
+"7X3uya00b5","8xEKzO3iyQ","W3VFHtuDyS","Q6hMCI7p2a","jfREuokgRi","24ARFFjHXR","RzaZAuupzk","iwzGkVNCPd","wDajX8xEKz","ZUnqtNo0Qb",
+"vkCHHs93Ml","iqv4kzFgtB","AkKTkjtn0X","9eoRcQYxC0","i3pydJRJQB","WreyPtAOsr","fcJOyjiVBP","k85AeVjCZq","v2eC3cShY2","zFgtBCNHmv",
+"rhl0JReKEW","Yh1hFd85a9","s93MlfmIK1","Pb1pataOXK","qUJMdGWqqX","5VZjSMm8si","S77LHrhl0J","i7WMQb29RJ","WDVWJi3pyd","qUJMdL7cGc",
+"No0Qbi7WMQ","9XyT9OUYuF","piJSkpvgjS","AXpwEi7WMQ","Y1mC0AXpwE","QWxoTECMvU","h1zcHQbxXc","64s8NhYBCK","5Drn02TRI7","sx5GlJJs5m",
+"FPfSEcmXIX","9y4lwuAWyp","djsrvVjCZq","OUqFMqQxHP","29QAzuoStw","iB08lYOfrY","LbRTHZuDtD","WreyP8hJdt","S77LHprNT6","8hJdtPOUYS",
+"cQOnvS2Dfu","e6e4zoVQp6","OUYuF64s8N","fLNg8uPX7G","Qworu8cVD3","K20wK0ao3l","FxX9qkB5nP","0h1b145cIH","CIShGksJby","WPmlxDLhzM",
+"5Nammmz8gx","n1pmOjtn0X","xXTI4jS1aj","pvgjSBGaQY","EoToPaez9y","vLsmSgIYvE","2ZHdk9rlg9","Uvlv45Namm","QWxoTn8pJ9","GrDg77hyVv",
+"Q6hMC8TxD7","2NslmokgRi","14FLRGrDg7","In3NSLDk6f","n8pJ9zHF1q","iwzGkQ6Lix","ThjNnB3qem","0Wr5yAIYUu","zmLYDzQt6Q","DLhzMaez9y",
+"ciuWzbrhlQ","lweGy24ARF","2hEEUOHaBz","HfyNQFxX9q","gdQsSgdQsS","GrDg7HlUbF","X6PinOUqFM","dpe1vlViBv","UlU3M45cIH","S2Dfu29QAz",
+"GSQwjuZPqg","m4bxUuJScX","9iGoT4QMc9","XflUqZuDtD","W7cTsIRh48","v1HlnFPfSE","WreyPsoy9t","Ta8f6bZLvS","xReecru4UG","7fsYMiwzGk",
+"8TxD7dQ586","aez9y24ARF","MaJQsl83Ud","RkQke64s8N","Gv3FquJScX","No0QbO3iyQ","9iGoTRBhp0","prNT6yofH3","5NammuJScX","Ss0Zu580YD",
+"azIWpRsQUq","Gv3FqqUJMd","ZJTXHCNHmv","VjCZqS77LH","fqypyVjCZq","o8UydECMvU","FhtglvLsmS","gIYvEdmoS7","D6rByiB08l","SmGzv64s8N",
+"hSSvQZuDtD","WDVWJvLsmS","07n1cWaim6","ZhwG1uQIcz","0ao3lTa8f6","3otm6euZA5","580YDuLtKs","Yf2EcC2Irc","POUYS4dEz6","CxVEflXFOB",
+"2TRI7iKqhr","pmeCdlj07Q","CqqaD9XyT9","W3VFHfcJOy","m4bxUfmIK1","ydG8UNOHsz","MmsIoWmadA","HlUbFCIShG","s4786AgJHQ","2NslmzmLYD",
+"8hJdtiB08l","nnP8oFcWrW","0BmCykZANm","t98iWRxrsm","P6bcgkB5nP","OHaBzFLsph","Y1mC00MR5X","cQOnvzz4ZU","aez9yGSQwj","BpYhViwzGk",
+"9eoRcLbRTH","WDVWJ580YD","tl72Wni2v1","POUYSyluBx","fcJOy07n1c","7lUXZoVQp6","lkMUALewvM","RkQkeyEfy9","7hyVvgjUTu","zbIYYFhtgl",
+"NhXduMaJQs","4dEz6oGu6x","0ao3lOUYuF","wiHrZ5IhmG","BbwgA7fKYU","uZPqgZuDtD","JIqXilXFOB","AkKTkMkgy8","yToGWkB5nP","BFkb8ulk41",
+"s7MxkFPfSE","HlUbFwDajX","IBe8kFVMxo","ZUnqtx3LDe","8hJdtHP433","StlDJ14FLR","2TRI7FFDui","nlaByjtn0X","Q6Lixni2v1","I7p2a0Wr5y",
+"Zv7z0Rxrsm","U3yw5jtn0X","o8UydNAFuw","Y1mC0lweGy","0MR5Xzz4ZU","lCMxy5Mg9r","EoToPIBe8k","iqv4k0PktI","ix74rZuDtD","WPmlxx3LDe",
+"brhlQZUnqt","bgJAzgtCA5","8xEKzlweGy","tuDyS4W0Tl","WmadAMm8si","IRh48SbRYy","soy9t9XyT9","9XyT9atef2","pFrrllXFOB","Twano5Drn0",
+"L7cGcC2Irc","9GXkXv2eC3","RpBQmRkQke","guMb8rKDLJ","0YAGH2Nslm","oGu6xjeskS","X6Pinlm0pD","XflUqYh1hF","FxX9qQClRL","LbRTHsx5Gl",
+"o8UydPYBf4","yluBxCp3mZ","3otm6BGaQY","7lUXZWmadA","JXljWJRJQB","mz8gxFNYIM","tl72WpAhR1","guMb8Fhtgl","Pb1pa0Kyfs","IjTwPzmLYD",
+"5nmWvtaOXK","9rlg9Zv7z0","SWfouJkzUn","JJs5mprNT6","vkCHHkZANm","zHF1qXflUq","t59lRReKEW","dmoS7XflUq","pv0i7t59lR","IBe8kCdyBV",
+"MmKGJ55rfB","uN6r3a00b5","In3NSsqVrf","d85a9uZPqg","No0QbxReec","nFqikW7cTs","WDVWJlj07Q","RmDcrcmXIX","POUYSHRxd8","618Di4W0Tl",
+"AgJHQtjQxs","I7p2aGWqqX","k85Aejtn0X","J2mQiB3qem","C2IrcYh1hF","8xEKzP6bcg","Oz8yZSjskQ","zFgtBDz1R3","Zv7z0DG4sT","Cfgr3Oz8yZ",
+"ZzJHWQYxC0","i7WMQ8U2nU","OHaBzBGaQY","uLtKsLbRTH","FFDuiFGzgp","7fKYU5VZjS","1j5L8lViBv","lViBv1v5hH","tAOsr7X3uy","4W0TluPX7G",
+"v8yFNGv3Fq","IRh48VNCPd","8RCUApmeCd","RACujpvgjS","5nmWvThjNn","Z4I1vYjB9t","WmadA5drc6","sqVrftlILt","VNCPdZJTXH","uPX7GIKxdL",
+"pT8wuGv3Fq","QssNCfqypy","uTacxFxX9q","FhtglzbIYY","FnPFB0BmCy","blLA9FVMxo","MK07Ytl72W","zY1GYM6qcG","7lUXZd7vjM","5NammgdQsS",
+"hSSvQMm8si","FcWrWJRJQB","QWxoTUmaEv","kZANmFNYIM","G1RhSQworu","i3pydMmsIo","jS1ajpv0i7","8U2nUFPfSE","qaofNK20wK","2TRI7JJs5m",
+"MmKGJwDajX","jeskSFVMxo","SmGzvVprf2","AgJHQuQIcz","BFkb8Uvlv4","t98iWPb1pa","4W0Tlpv0i7","FcWrWaez9y","TwanojeskS","zmLYD14FLR",
+"M3zXLUvlv4","ni2v1lsQGo","U3yw5yEfy9","W3VFHuJScX","lCMxy2hEEU","8TxD7lweGy","FGzgpPYBf4","djsrvLewvM","S77LH2hEEU","UmaEvt59lR",
+"8cVD3JKWYR","suY4xt98iW","lXFOBaDGtS","oQ87rWDVWJ","vOqCEa00b5","EOE1okZANm","soy9tuLtKs","5IhmGzmLYD","GSQwjiKqhr","MGlTFOUqFM",
+"5iGN59eoRc","fcwDaGv3Fq","S77LH0h1b1","9iGoTYw2oU","pT8wuh1zcH","0Kyfs5Drn0","W7cTsFVMxo","IRh48WMiS3","J2mQi5Drn0","pvgjSwiHrZ",
+"Q6LixMm8si","cShY2t59lR","Cp3mZhSSvQ","uoStwQssNC","LDk6fBCxeC","lkMUAHlUbF","ZJTXHs4786","pAhR1FGzgp","KASQ8MmKGJ","nlaBy1j5L8",
+"AmdQdvOqCE","Cfgr3G1RhS","QClRLb29RJ","Uvlv4Oz8yZ","1j5L8BpYhV","gdQsSGv3Fq","6q6L9piJSk","dpe1vYh1hF","O3iyQZUnqt","O3iyQoGu6x",
+"pFrrltAOsr","AIYUuWmadA","5iGN5Chuy3","he9IAQ6hMC","pAhR1soy9t","07n1ci7WMQ","GXdoH4dEz6","Z4I1vIBe8k","sqVrfRpBQm","I7p2aMojnP",
+"dhSuHxXTI4","gdQsSkZANm","NOHszlpF6W","lkMUAlH1kt","5Drn0W7cTs","0h1b1RpBQm","pFrrls93Ml","Uvlv4DQimp","6q6L914FLR","LewvMD6rBy",
+"DG4sTBGaQY","tl72WvkCHH","uPX7GCIShG","JRJQBfqypy","7Ow5CRkQke","iB08lRpBQm","KsjRKhi5X7","AOgEeFhtgl","7lUXZiqv4k","5drc6cL0aE",
+"blLA9WPmlx","No0Qb2hEEU","5Mg9rcQOnv","TCgPpThjNn","SWfouOxWIH","QbxXcGXdoH","7fKYUAkKTk","FLsph1LB1L","64s8NBCxeC","8U2nUIBe8k",
+"Waim6D6rBy","OHaBzYw2oU","5VZjSqQxHP","FLsphYh1hF","ZhwG1jzUqR","s93Mls4786","TCgPpRBhp0","StlDJ0Wr5y","oGu6xQClRL","MojnPWmadA",
+"jeskSi3pyd","oGu6xaL6AJ","ksJbydQ586","CxVEfmz8gx","618DiYjB9t","ru4UG0h1b1","suY4xAmdQd","zz4ZUKASQ8","M3zXLwiHrZ","taOXKxReec",
+"Nxx9V2hEEU","FNYIMpFrrl","AXpwEDz1R3","GWqqXd7vjM","POUYSLewvM","POUYSB3qem","64s8NpAhR1","RACujdhSuH","RxrsmLewvM","RBhp0JKWYR",
+"okgRilsQGo","lkMUATCgPp","gf8rIDcpWB","W7cTsFwEJz","Q6hMCQ6hMC","MojnPpFrrl","SWfouMmsIo","ZUnqtrKDLJ","FhtgljfREu","jtn0Xgf8rI",
+"1j5L84dEz6","Uvlv4i7WMQ","bZLvSokgRi","gIYvEFnPFB","EoToPjSjS3","POUYSBCxeC","lpF6Wn8pJ9","RACujMmKGJ","CIShGh1zcH","FPfSENhXdu",
+"9eoRc5nmWv","XflUqS77LH","LbRTHWaWsv","tuDySJKWYR","AmdQdIjTwP","64s8N7hyVv","cL0aETXQ0Z","uupzkC2Irc","SWfout98iW","cL0aEaL6AJ",
+"tvdkDsqVrf","5drc6uAWyp","i7WMQQworu","X6PinzFgtB","Mm8siRBhp0","lViBvCK5W7","O3iyQv1Hln","hYBCK618Di","0h1b17X3uy","rKDLJuoStw",
+"0YAGHTa8f6","cL0aERBhp0","CxVEfU3yw5","64s8NyluBx","QssNC580YD","HzZT8lViBv","QnJ1SvLsmS","piJSkpAhR1","ru4UGSbRYy","e6e4zatef2",
+"BpYhVZUnqt","1j5L8tAOsr","zqH0WOz8yZ","VBjhz0Kyfs","QbxXcQ6hMC","rKDLJhE1Ql","JKWYRFcWrW","t98iWMm8si","oVQp68cVD3","djsrv1LB1L",
+"VBjhzWMiS3","jSjS3XyPZN","XflUqhE1Ql","IjTwPLbRTH","GWqqXOUYuF","J2mQio8Uyd","9rlg9l83Ud","55rfBBCxeC","UlU3MOz8yZ","1j5L8Cp3mZ",
+"HP433pT8wu","uAWyp64s8N","QworuMGlTF","iKqhratef2","FwEJzVprf2","euZA5EoToP","EoToPv1Hln","Nxx9VVBjhz","FGzgpnnP8o","BFkb8JKWYR",
+"jiVBPI7p2a","B3qem1j5L8","ogLgcqUJMd","uN6r3e6e4z","rz7UtcShY2","bgJAzCIShG","pmeCdWMiS3","qUJMdKASQ8","3otm6bZLvS","bZLvSUmaEv",
+"lm0pDuJScX","fqypy2Yz7E","ni2v1xReec","FLsphTCgPp","zz4ZU48cHL","2hEEUy94nw","4dEz6vOqCE","L7cGc14FLR","yvOMI64s8N","OUYuFfLNg8",
+"7lUXZYjB9t","atef2lsQGo","C2Irc7Ow5C","4QMc9piJSk","uvf7AQChxs","I7p2apmeCd","uQIczgf8rI","FFDuilXFOB","WreyPm4bxU","piJSkVBjhz",
+"mX2GEUvlv4","uZPqg9rlg9","G1RhStl72W","S77LHk85Ae","DG4sT580YD","IBe8kQClRL","pWiOsM6qcG","Nxx9VSWfou","ksJbyStlDJ","lm0pDFNYIM",
+"hE1QlyToGW","Pb1pa0BmCy","zz4ZUGWqqX","S2DfuWreyP","sx5GlFVMxo","AOgEeM6qcG","Dz1R3iqv4k","AXpwEzz4ZU","zQt6Quupzk","48cHLUlU3M",
+"ulk41GXdoH","Ss0ZuAmdQd","VLTy68cVD3","LewvMJJs5m","SbRYyyluBx","QworuuPX7G","SWfouyluBx","RkQkeQ6Lix","Q6Lix2DREs","JRJQBDcpWB",
+"7fsYM9XyT9","K20wKh1zcH","n1pmOv1Hln","pWiOsAmdQd","MmsIoqUJMd","hUTw7AmdQd","okgRiatef2","dhSuHh1zcH","xReecY1mC0","suY4xsx5Gl",
+"Q6LixcL0aE","CK5W7aez9y","fmIK1EoToP","UmaEvk85Ae","iqv4kDQimp","GSQwjVNCPd","jtn0XCK5W7","FxX9qjiVBP","YjB9tTa8f6","7fKYUB3qem",
+"nlaByChuy3","5ZaEzIjTwP","1LB1LsqVrf","xReec5nmWv","9GXkXtAOsr","FwEJzAgJHQ","gjUTu0PktI","CIShGmz8gx","pmeCdS2Dfu","blLA9lkMUA",
+"K20wKqQxHP","FNYIMPOUYS","7ku1pOHaBz","tl72WfmIK1","4dEz6AgJHQ","WMiS3n1pmO","FcWrWIjTwP","AmdQdfcwDa","uLtKslCMxy","9y4lwpAhR1",
+"I7p2a8hJdt","ogLgcjzUqR","wDajXDLhzM","t98iW4QMc9","jfREuPYBf4","1j5L8jeskS","In3NSNcICA","o8UydMezSW","DG4sTJIqXi","VjCZq45cIH",
+"ReKEWiqv4k","OxWIHZhwG1","6q6L9MmsIo","n1pmOVIlwP","3weIF5iGN5","ulk41azIWp","24ARFVLTy6","FcWrWYf2Ec","lCMxyThjNn","dQ586v8yFN",
+"aFFssvkCHH","dmoS7kZANm","lViBvFhtgl","7fsYMn1pmO","aez9yGrDg7","4dEz61LB1L","NOHszStlDJ","tvdkDv2eC3","oQ87rcL0aE","wiHrZWmadA",
+"zmLYDLbRTH","dmoS7b29RJ","sqVrfMaJQs","wDajXStlDJ","2Yz7EPb1pa","NcICA5Drn0","hYBCKQworu","BCxeCCp3mZ","CIShGNOHsz","JRJQBSWfou",
+"0ao3l16lHc","suY4xtvdkD","8TxD7uAWyp","yofH3uTacx","MezSWsuY4x","AIYUuru4UG","0PktIFLsph","Waim65IhmG","OHaBznlaBy","VLTy6L7cGc",
+"JJs5m7fsYM","ZzJHWuN6r3","cQOnvHfyNQ","e6e4zFcWrW","dhSuHRBhp0","Yh1hFtl72W","Cp3mZjzUqR","5Mg9rwDajX","5ZaEzG1RhS","IKxdLrz7Ut",
+"lXFOB3weIF","Nxx9Vb29RJ","uoStw4QMc9","5IhmGgtCA5","dmoS7dmoS7","djsrv1j5L8","8TxD7azIWp","5nmWvqUJMd","Yw2oUWDVWJ","WDVWJprNT6",
+"IKxdL7hyVv","WPmlxgjUTu","KZamHUl4a1","t98iWqQxHP","KsjRK5drc6","pWiOsxReec","4QMc9fFDrJ","SbRYyrhl0J","L7cGcQssNC","pWiOsqQxHP",
+"yEfy9JXljW","tlILtSWfou","gIYvEdpe1v","K4GS8zbIYY","6AFT0AkKTk","ECMvUkZANm","VBjhzaFFss","EoToP8xEKz","O3iyQQ6hMC","DLhzM7lUXZ",
+"0ao3l9iGoT","AgJHQfLNg8","v1HlnWreyP","lj07Q4dEz6","StlDJyEfy9","S77LH5ZaEz","2TRI7W7cTs","brhlQBCxeC","xReecMmKGJ","K20wKuvf7A",
+"tl72WNOHsz","Z4I1v9GXkX","FFDuiP6bcg","0PktIrz7Ut","RpBQmZ4I1v","EOE1oBbwgA","FLsphTa8f6","gdQsS9XyT9","qUJMdcmXIX","n8pJ9uTacx",
+"EoToPlweGy","oQ87rRpBQm","iB08lWmadA","EOE1oUmaEv","GrDg7pvgjS","AmdQdlXFOB","5VZjSfmIK1","5VZjSjSjS3","16lHcYOfrY","SbRYyQnJ1S",
+"FFDuit59lR","lm0pDRzaZA","vOqCE0ao3l","SbRYy7fsYM","JXljWNAFuw","7fsYM0ao3l","IKxdLuZPqg","gjUTuYw2oU","GXdoHoVQp6","blLA9nnP8o",
+"lm0pDiKqhr","HzZT8pmeCd","pmeCdAXpwE","SmGzvzz4ZU","uvf7ASs0Zu","fqypy48cHL","PYBf4uJScX","k85AeCIShG","5Mg9rdhSuH","vOqCEhSSvQ",
+"ix74r9rlg9","In3NS4W0Tl","9rlg9WmadA","zFgtBHfyNQ","azIWpdjsrv","Twano3weIF","VNCPdVIlwP","KsjRK9XyT9","hSSvQ0MR5X","FVMxouoStw",
+"cL0aEgIYvE","zQt6Qdjsrv","QssNClj07Q","5ZaEzyEfy9","MaJQsFnPFB","KsjRKtlILt","DQimpnlaBy","FVMxoIjTwP","OUqFMqUJMd","yToGWYw2oU",
+"24ARF07n1c","U3yw5MmKGJ","7Ow5CThjNn","azIWpXyPZN","VerEA9rlg9","okgRi4QMc9","lm0pD8TxD7","MmKGJJKWYR","gf8rI580YD","9eoRcxReec",
+"hE1Ql3otm6","DQimplj07Q","lpF6WJXljW","07n1cfmIK1","JIqXiS77LH","OUqFMuPX7G","POUYSChuy3","FLsphVLTy6","W3VFHHfyNQ","zmLYDwiHrZ",
+"2hEEUuN6r3","xXTI4lpF6W","0ao3lbZLvS","AIYUuNcICA","pWiOsVjCZq","VLTy6jtn0X","2hEEUFjHXR","8U2nU0BmCy","Cp3mZ8hJdt","7Ow5CTwano",
+"JkzUnjtn0X","In3NSMojnP","7Ow5CRACuj","RzaZAZuDtD","IKxdLatef2","pmeCdYw2oU","64s8NjeskS","GXdoHFVMxo","14FLRCqqaD","29QAzciuWz",
+"nnP8oXflUq","HzZT8rz7Ut","hUTw7aDGtS","bZLvSLDk6f","CxVEfxXTI4","2ZHdkSWfou","Ss0ZuS77LH","ogLgcuAWyp","lkMUAECMvU","zqH0WpFrrl",
+"djsrvuJScX","7ku1pEoToP","Ss0ZutaOXK","sx5GlpvgjS","ReKEWUl4a1","d7vjM5Namm","fLNg8RpBQm","uupzk5ZaEz","gIYvELbRTH","kB5nPmz8gx",
+"FcWrW9y4lw","zqH0WcQOnv","jeskSmz8gx","uLtKslj07Q","1LB1LyToGW","h1zcHs7Mxk","gdQsSEdBKc","uAWyp2hEEU","nlaByS77LH","WDVWJk85Ae",
+"SmGzvCqqaD","SjskQ5Drn0","Oz8yZuTacx","QChxsRACuj","uQIczYOfrY","tl72WjzUqR","5VZjS1j5L8","yToGWJIqXi","580YDkB5nP","GWqqX7hyVv",
+"Cfgr3yvOMI","AXpwEnnP8o","VNCPdTCgPp","GSQwjlweGy","AXpwEpiJSk","kZANmhe9IA","QClRLZuDtD","B3qemS77LH","0h1b1pWiOs","tuDySk85Ae",
+"ix74r7X3uy","7hyVvhSSvQ","2ZHdk29QAz","he9IAVerEA","zQt6Qe6e4z","9GXkXogLgc","jfREuy94nw","oQ87rCK5W7","oGu6xDLhzM","uPX7GlCMxy",
+"mz8gxeuZA5","KZamHguMb8","bZLvSs7Mxk","hUTw7W7cTs","U3yw5RmDcr","NcICAlpF6W","PYBf49eoRc","hE1QlhE1Ql","8cVD35Drn0","9GXkXMezSW",
+"FjHXRUvlv4","d85a93weIF","hE1QlQ6Lix","v1HlnMGlTF","xciqplXFOB","L7cGc5ZaEz","FwEJzGXdoH","GXdoH9eoRc","zmLYDsx5Gl","x3LDeDG4sT",
+"0YAGHhe9IA","VIlwP8RCUA","y94nwsoy9t","iwzGkVprf2","Yf2EcpFrrl","3otm6piJSk","BCxeCStlDJ","2ZHdkfaHir","JJs5m618Di","Chuy3Q6Lix",
+"Yh1hFhi5X7","VIlwPhYBCK","LewvMK20wK","FLsphazIWp","uupzkMGlTF","2ZHdk14FLR","14FLRoGu6x","5drc6FwEJz","rhl0JkB5nP","aFFssNxx9V",
+"5ZaEzAmdQd","zFgtBCqqaD","AIYUuIBe8k","ksJbycShY2","RmDcr7fKYU","AkKTk0Wr5y","Dz1R30Kyfs","bgJAzQClRL","QYxC0In3NS","1LB1LPOUYS",
+"gIYvEECMvU","7lUXZ0Wr5y","faHirYw2oU","Gv3FqogLgc","Ss0ZuQYxC0","vOqCEF6PT2","IRh48TCgPp","3weIFo8Uyd","cQOnvh1zcH","zY1GYYf2Ec",
+"StlDJeuZA5","0Wr5yRzaZA","lkMUArKDLJ","vkCHHAOgEe","HP4330PktI","7Ow5C0ao3l","zY1GYKZamH","No0QbQClRL","LewvMfmIK1","ix74ruPX7G",
+"SjskQDG4sT","rz7UtoQ87r","4dEz6ogLgc","dQ586I7p2a","9GXkXhE1Ql","tl72WMm8si","Zv7z0Q6Lix","FPfSEFjHXR","hE1Qlgf8rI","yvOMICK5W7",
+"uQIczOUqFM","FnPFBkZANm","azIWp8hJdt","HRxd8EOE1o","580YDW3VFH","iKqhrtlILt","yvOMIOUqFM","d85a9Vprf2","oVQp6gf8rI","0KyfsuLtKs",
+"lm0pDkB5nP","KsjRKZzJHW","U3yw5pvgjS","IRh48JkzUn","nnP8ooQ87r","jfREurKDLJ","RzaZAuAWyp","FFDuiIBe8k","RsQUqDQimp","NcICA7X3uy",
+"AIYUuzHF1q","mX2GE1LB1L","Dz1R3Twano","a00b58RCUA","2TRI7XyPZN","djsrvRBhp0","NhXdutaOXK","vkCHHAXpwE","7ku1p0MR5X","lViBvjeskS",
+"lm0pDhUTw7","jiVBPBCxeC","POUYSSjskQ","JJs5mpvgjS","QYxC09XyT9","5IhmG2TRI7","tl72WVIlwP","RxrsmNhXdu","jtn0XAXpwE","n8pJ9VBjhz",
+"Vprf2QbxXc","Pb1pa9XyT9","nFqikrKDLJ","5VZjS9GXkX","HRxd8t59lR","WPmlxrz7Ut","bgJAzWPmlx","QnJ1SFhtgl","soy9tSbRYy","qQxHPv1Hln",
+"SbRYy2DREs","OUYuFPYBf4","nFqikcL0aE","FwEJzFLsph","OHaBzhe9IA","k85AeEoToP","m4bxUTwano","07n1c5Namm","zFgtBQssNC","ZhwG1ogLgc",
+"RkQkeciuWz","IBe8kuLtKs","BpYhV8cVD3","DQimpHfyNQ","RsQUqSs0Zu","iB08lyofH3","WPmlx5Namm","aDGtS48cHL","FFDuifcJOy","6AFT07Ow5C",
+"uLtKsv8yFN","XyPZNVerEA","2hEEUQWxoT","OUqFM8FmFH","P6bcgtuDyS","OUYuFpAhR1","FFDuiv2eC3","zY1GYjfREu","9XyT9wiHrZ","7ku1pBbwgA",
+"29QAzQssNC","WaWsvpT8wu","LDk6fDcpWB","ECMvUIn3NS","JRJQBlweGy","uJScXWMiS3","faHir0MR5X","WreyPWPmlx","iB08lguMb8","lkMUAL7cGc",
+"EdBKcS2Dfu","GrDg7vkCHH","HlUbFSs0Zu","aL6AJVBjhz","55rfBrhl0J","AXpwEnlaBy","h1zcH7X3uy","iqv4kWMiS3","3weIFb29RJ","fcJOy2hEEU",
+"LbRTH9y4lw","3otm6BpYhV","VerEAQ6hMC","k85Ae7ku1p","Mm8sixReec","SmGzvSs0Zu","hUTw77lUXZ","uQIczVNCPd","uPX7Ghe9IA","6q6L9Vprf2",
+"G1RhSF6PT2","7fsYMni2v1","GrDg7HRxd8","yvOMItjQxs","nlaBy07n1c","7lUXZYf2Ec","BbwgA6AFT0","FVMxozFgtB","uZPqgy94nw","dpe1vAkKTk",
+"O3iyQb29RJ","9GXkXuoStw","QClRL45cIH","KsjRKuvf7A","NOHszlweGy","2Yz7E7lUXZ","Y1mC0pT8wu","6q6L9jSjS3","BCxeClH1kt","O3iyQnFqik",
+"UlU3M2Yz7E","U3yw5POUYS","wiHrZtAOsr","lsQGo1j5L8","okgRiZuDtD","0BmCyCqqaD","EOE1ot59lR","4W0Tl6q6L9","F6PT2ECMvU","8cVD3nlaBy",
+"iwzGklXFOB","nlaByrz7Ut","pvgjSfmIK1","ulk41x3LDe","ZJTXHpWiOs","jiVBPfqypy","zHF1qBGaQY","7X3uy0Wr5y","QnJ1SNo0Qb","9y4lwSs0Zu",
+"IRh48gdQsS","iqv4kdjsrv","t59lRBpYhV","XflUqcShY2","lCMxy580YD","XflUqguMb8","StlDJb29RJ","b29RJ7fKYU","kB5nPfcJOy","nlaBy7fsYM",
+"ix74rmz8gx","blLA99eoRc","lXFOBtl72W","RACujYjB9t","AkKTk0YAGH","kB5nPhUTw7","FcWrWpFrrl","vOqCEUvlv4","EdBKc8RCUA","I7p2ahUTw7",
+"AmdQdVNCPd","TCgPpECMvU","RBhp0DLhzM","cmXIXtaOXK","FFDuibrhlQ","zHF1qFNYIM","zHF1qQWxoT","JRJQB07n1c","dmoS7FnPFB","TCgPpWPmlx",
+"DLhzMUl4a1","lViBvVerEA","GSQwjpmeCd","hYBCKIn3NS","VjCZqDQimp","EoToPfFDrJ","Cp3mZuupzk","8xEKzuJScX","VNCPd9GXkX","OUqFM8U2nU",
+"2hEEUX6Pin","jtn0X0Wr5y","2TRI75Mg9r","oQ87rrz7Ut","16lHc2Yz7E","7Ow5CokgRi","azIWpuQIcz","U3yw5ni2v1","n8pJ9HRxd8","7ku1p7fKYU",
+"2Yz7E2hEEU","FNYIMpiJSk","o8Uyd2Nslm","zQt6Qn8pJ9","mX2GEZhwG1","64s8Nt59lR","B3qem2Yz7E","Mkgy8uQIcz","No0QbHfyNQ","aez9ydQ586",
+"Yf2EcKZamH","zFgtBulk41","KZamHciuWz","gdQsSCdyBV","lViBvuvf7A","Chuy3KZamH","WPmlxMGlTF","tjQxs0Kyfs","FhtgluJScX","cmXIXC2Irc",
+"DQimpIjTwP","fqypyuoStw","azIWpfcJOy","GSQwjuAWyp","zY1GYatef2","S2DfuWPmlx","4W0TlI7p2a","3weIFcL0aE","XflUq7ku1p","taOXKdmoS7",
+"DQimpNOHsz","i3pydcShY2","uZPqgzqH0W","VIlwPRsQUq","0YAGHmz8gx","lsQGoEdBKc","8cVD3xReec","nnP8o5Mg9r","QssNCuZPqg","FhtglAmdQd",
+"jiVBPgtCA5","0PktIYjB9t","yToGWDQimp","55rfBQ6hMC","fLNg8MK07Y","hSSvQZJTXH","TCgPpVBjhz","zY1GYy94nw","O3iyQbrhlQ","WaWsvFLsph",
+"Q6LixvOqCE","QbxXcydG8U","vLsmSWaim6","9XyT9sqVrf","Pb1paTa8f6","dmoS7QChxs","pmeCdGSQwj","NAFuwguMb8","XyPZNdQ586","8cVD3BGaQY",
+"7lUXZlweGy","PYBf4mz8gx","PYBf4In3NS","S2DfuNhXdu","guMb8Kr8ys","iB08loGu6x","4W0Tl2Yz7E","oGu6xFVMxo","dhSuH0h1b1","gdQsSWreyP",
+"POUYSs4786","ksJbyRxrsm","uTacx2DREs","uPX7GZhwG1","HfyNQDLhzM","fFDrJ0Kyfs","zbIYY8RCUA","ECMvUuQIcz","0ao3l9XyT9","ni2v1gf8rI",
+"Mkgy8ECMvU","Z4I1vJkzUn","AXpwEKASQ8","LewvMpFrrl","rKDLJprNT6","EdBKcv8yFN","cShY2l83Ud","zmLYDuupzk","7hyVvzFgtB","Waim6dQ586",
+"uQIczUlU3M","7lUXZhSSvQ","zmLYDfFDrJ","d7vjM1v5hH","BpYhVix74r","7fKYUpWiOs","L7cGchSSvQ","UmaEvYjB9t","2hEEULewvM","FxX9qzQt6Q",
+"8xEKz2hEEU","piJSkRpBQm","TwanoReKEW","OUqFMyToGW","zQt6QcQOnv","Mm8si1LB1L","9GXkXhSSvQ","rz7UthYBCK","7hyVv0ao3l","JIqXiKZamH",
+"DcpWB1j5L8","BCxeChYBCK","lsQGouPX7G","KASQ8MaJQs","qUJMdJKWYR","FhtglS77LH","SmGzviqv4k","S77LHQWxoT","P6bcgCfgr3","Twanon8pJ9",
+"hUTw7EoToP","kZANmtjQxs","Ss0ZuNcICA","5nmWvLDk6f","VjCZqlViBv","lXFOBxciqp","7fKYUpiJSk","djsrvD6rBy","4QMc9FcWrW","BFkb89iGoT",
+"okgRilj07Q","EOE1oEoToP","2Yz7Ex3LDe","0YAGHNxx9V","FnPFBZuDtD","l83UdYOfrY","XflUqvkCHH","okgRi8hJdt","azIWpjtn0X","WmadAQWxoT",
+"F6PT2cQOnv","DQimpTXQ0Z","pWiOsLDk6f","FGzgpJJs5m","2NslmfaHir","ksJbybZLvS","VerEAqQxHP","yEfy9d85a9","vOqCEFVMxo","tlILtFwEJz",
+"5NammHP433","b29RJYw2oU","BGaQYMK07Y","8U2nUQClRL","atef2ZuDtD","tjQxsRACuj","zbIYYECMvU","UmaEvoQ87r","QssNCzQt6Q","lkMUApT8wu",
+"No0QbtjQxs","8FmFH0YAGH","RsQUqoQ87r","Mkgy814FLR","djsrvMmsIo","MmsIoFwEJz","i7WMQhYBCK","9y4lwL7cGc","ciuWz2DREs","pWiOs2DREs",
+"RkQkeokgRi","0KyfswDajX","M3zXLVIlwP","64s8NmX2GE","fmIK1DcpWB","1v5hHcShY2","Yf2EcgjUTu","5Drn0CNHmv","618DiYOfrY","RxrsmydG8U",
+"fLNg8VLTy6","Yf2EcTa8f6","Cfgr3MK07Y","QWxoTAkKTk","fcwDam4bxU","5NammZhwG1","iB08l4QMc9","ECMvUMmKGJ","EdBKcsuY4x","Gv3Fqatef2",
+"QssNCmX2GE","s7Mxkfqypy","KZamH9XyT9","TwanolsQGo","0YAGH45cIH","d7vjMulk41","7fKYUzFgtB","2NslmUlU3M","uQIczHlUbF","lj07QNAFuw",
+"ThjNnzmLYD","RpBQmNhXdu","DQimpHRxd8","0MR5X9iGoT","MK07YnlaBy","7lUXZZhwG1","KZamHAIYUu","1LB1LFNYIM","WmadA618Di","jiVBPOxWIH",
+"bZLvSDQimp","GWqqXJ2mQi","KASQ8K20wK","Ta8f6FGzgp","WaWsvVprf2","KsjRKqaofN","XflUqm4bxU","7ku1ppv0i7","zHF1qUmaEv","FxX9qy94nw",
+"gtCA5BGaQY","e6e4zCNHmv","zFgtBrz7Ut","ru4UGFPfSE","uupzk5VZjS","soy9tblLA9","9eoRcPb1pa","X6Pinh1zcH","5nmWvStlDJ","kZANmGWqqX",
+"uN6r3m4bxU","ThjNnSmGzv","guMb8tlILt","vkCHHZUnqt","cShY2EOE1o","FPfSE45cIH","nFqikyEfy9","ni2v1zz4ZU","8FmFHuvf7A","2hEEUECMvU",
+"7X3uyxciqp","9XyT9FLsph","n8pJ9UlU3M","euZA5rhl0J","9y4lwuLtKs","Gv3FqJJs5m","BCxeCGrDg7","EoToPKZamH","45cIHaL6AJ","14FLROHaBz",
+"Ta8f6DLhzM","uLtKsCqqaD","sx5GlUvlv4","vOqCEiB08l","b29RJsx5Gl","KASQ8atef2","KsjRKCdyBV","m4bxU24ARF","lH1ktNOHsz","QbxXceuZA5",
+"IjTwP16lHc","CIShG9rlg9","SWfouG1RhS","AmdQdVIlwP","6AFT0v2eC3","b29RJMGlTF","8TxD7No0Qb","ZzJHWFFDui","jiVBPJKWYR","5ZaEz7ku1p",
+"1LB1LjfREu","XyPZNfFDrJ","FGzgpJXljW","StlDJFwEJz","Fhtgl1j5L8","rhl0JTwano","QssNCStlDJ","29QAzgf8rI","v8yFN07n1c","O3iyQ2TRI7",
+"hE1QllCMxy","o8UydXflUq","ZJTXHW3VFH","uPX7GW7cTs","SWfouPOUYS","pAhR1LbRTH","AOgEetvdkD","WDVWJBGaQY","zbIYYh1zcH","HzZT8X6Pin",
+"jzUqRiB08l","ZhwG1lCMxy","dhSuHVerEA","okgRiDQimp","qaofNTwano","5Nammatef2","GXdoHRpBQm","3weIF9GXkX","cmXIX5IhmG","mz8gxBGaQY",
+"RmDcrxXTI4","JRJQBXyPZN","0Wr5y5iGN5","Dz1R33otm6","DG4sTCIShG","pFrrlazIWp","FLspho8Uyd","tvdkDTXQ0Z","SbRYyk85Ae","t59lRlweGy",
+"0ao3lyluBx","Yh1hFSbRYy","8cVD3VBjhz","vOqCELewvM","K4GS8W3VFH","FPfSERkQke","580YD7Ow5C","5iGN5ksJby","SjskQ7ku1p","M6qcGHlUbF",
+"iqv4ksqVrf","2DREs4dEz6","aDGtSOUYuF","580YDFPfSE","S77LH55rfB","euZA5l83Ud","Nxx9VuPX7G","IBe8kuN6r3","9eoRcgIYvE","kZANmNo0Qb",
+"U3yw5wDajX","ksJbyAgJHQ","UmaEvTwano","TCgPp24ARF","m4bxUAIYUu","0h1b1ECMvU","StlDJMmsIo","dpe1vhe9IA","zFgtBVLTy6","MojnPHRxd8",
+"yToGW8TxD7","h1zcHFhtgl","KZamHlweGy","Cfgr3s4786","QnJ1S5IhmG","nnP8ohi5X7","kZANm6q6L9","ru4UGfaHir","uN6r3AmdQd","07n1cIjTwP",
+"taOXKGSQwj","NAFuwLbRTH","5iGN5hUTw7","lCMxy45cIH","mX2GEokgRi","FcWrWGv3Fq","lm0pDvOqCE","okgRiWPmlx","pmeCdEoToP","2NslmAkKTk",
+"ulk411j5L8","taOXKzY1GY","v8yFNFLsph","5ZaEzZUnqt","3weIFru4UG","SWfouzQt6Q","vkCHHtvdkD","fLNg8BGaQY","iqv4kcShY2","618Di4dEz6",
+"lCMxyK20wK","14FLRs93Ml","fFDrJvOqCE","5iGN5vLsmS","9y4lwO3iyQ","KZamH55rfB","KASQ8s7Mxk","fqypys7Mxk","zz4ZUtAOsr","zmLYDCxVEf",
+"OHaBzQClRL","S77LHB3qem","cL0aEqaofN","hUTw7hYBCK","Cfgr3AXpwE","lpF6WChuy3","L7cGcbrhlQ","RpBQmfcJOy","SmGzvSjskQ","D6rByThjNn",
+"GXdoHUmaEv","M3zXLuPX7G","s93Mlm4bxU","YjB9t8xEKz","s93Mliqv4k","Chuy3faHir","NOHszjiVBP","vOqCEfqypy","4dEz6d7vjM","okgRiqaofN",
+"Cp3mZ7fKYU","7Ow5Cd7vjM","h1zcHogLgc","h1zcH9XyT9","Chuy37Ow5C","2Yz7EpvgjS","tvdkDOUqFM","tuDySjfREu","n8pJ9RpBQm","lCMxyQChxs",
+"FGzgpECMvU","9rlg9iqv4k","ix74rWMiS3","gtCA5QClRL","QbxXct98iW","blLA9LbRTH","ZuDtDLbRTH","4W0TlBCxeC","jtn0Xhe9IA","RzaZA3otm6",
+"ni2v1MaJQs","gjUTuQssNC","3weIFprNT6","9XyT9s93Ml","2ZHdkpvgjS","wiHrZQClRL","AOgEe8cVD3","hUTw7cL0aE","uupzk5Namm","e6e4zcL0aE",
+"Pb1paYf2Ec","I7p2aJ2mQi","Ta8f6QChxs","Dz1R3lViBv","gjUTun8pJ9","FPfSEguMb8","BbwgA9iGoT","45cIH0BmCy","GXdoH5VZjS","Cfgr3pmeCd",
+"x3LDeGWqqX","xXTI4Yw2oU","TCgPpYf2Ec","yEfy9U3yw5","FVMxonFqik","SWfouzmLYD","VBjhziqv4k","aez9yQssNC","GrDg7DG4sT","ni2v1AIYUu",
+"BbwgA14FLR","Yw2oUpWiOs","07n1c0Wr5y","FLsphZv7z0","v8yFNQClRL","tlILtsuY4x","StlDJM6qcG","EdBKc8FmFH","G1RhSRmDcr","EOE1o8cVD3",
+"NAFuwCK5W7","ECMvU2Nslm","PYBf4hYBCK","D6rBynnP8o","CxVEfFVMxo","s93Ml1v5hH","FnPFBFPfSE","FxX9qZUnqt","cShY20h1b1","XflUqlCMxy",
+"0PktIRzaZA","Mm8sipFrrl","kB5nPuLtKs","M6qcGAgJHQ","Z4I1vZ4I1v","e6e4z9rlg9","zqH0WQnJ1S","X6PinTa8f6","24ARFFFDui","uPX7Gru4UG",
+"FcWrWdQ586","AkKTkP6bcg","lH1ktru4UG","29QAzZJTXH","he9IAv1Hln","M3zXLfLNg8","8U2nUfLNg8","suY4xlXFOB","JkzUnix74r","v8yFNQnJ1S",
+"tvdkDlsQGo","e6e4zix74r","h1zcHAgJHQ","RkQkerhl0J","jtn0X1v5hH","Q6hMCM3zXL","CNHmvHRxd8","VNCPdtaOXK","SbRYyQssNC","VNCPd7fKYU",
+"24ARFuLtKs","9y4lwpWiOs","v2eC3dQ586","YOfrYZhwG1","MK07YNcICA","0KyfsAOgEe","W3VFH8xEKz","S77LHNOHsz","zQt6Qv1Hln","tvdkDuPX7G",
+"RzaZAVIlwP","5VZjSUlU3M","XyPZNzHF1q","dhSuHSbRYy","gjUTuKASQ8","Ul4a1OxWIH","RsQUqmz8gx","0ao3loVQp6","cL0aEDz1R3","DcpWBxXTI4",
+"Uvlv4B3qem","Oz8yZ29QAz","ix74rn8pJ9","BFkb8Y1mC0","sx5GlqaofN","jiVBPjeskS","fLNg8d7vjM","VBjhzCqqaD","aez9ysuY4x","EdBKc5Mg9r",
+"e6e4zfFDrJ","MezSWPb1pa","he9IAG1RhS","RACujStlDJ","nnP8oO3iyQ","fFDrJ7fKYU","WDVWJmX2GE","NcICAIn3NS","DQimp3weIF","bZLvSIn3NS",
+"1LB1LHP433","bZLvSJRJQB","6q6L98TxD7","8RCUAqaofN","uoStwn1pmO","uTacx0Kyfs","7fsYMDG4sT","vLsmSpFrrl","iB08lWreyP","2ZHdkjtn0X",
+"gtCA5ThjNn","Oz8yZ9y4lw","ru4UGEdBKc","qaofNcL0aE","2hEEUDQimp","8FmFHb29RJ","yofH329QAz","MojnPpmeCd","CK5W7FFDui","WMiS3MmKGJ",
+"Ta8f6NhXdu","EdBKcTa8f6","5nmWvgtCA5","55rfBwDajX","sx5Gls4786","pAhR1OUYuF","No0QbF6PT2","5Mg9rblLA9","pAhR1GWqqX","ru4UGSs0Zu",
+"8TxD7guMb8","Mm8si64s8N","HP433s4786","ECMvUiwzGk","Gv3FqBpYhV","vkCHHBGaQY","1j5L8iwzGk","tl72WaFFss","yToGWAOgEe","IKxdLv8yFN",
+"jSjS3nlaBy","In3NSGv3Fq","4QMc9uAWyp","NAFuwNhXdu","okgRie6e4z","KZamHfLNg8","LbRTH3otm6","mX2GETXQ0Z","4dEz6QChxs","RACujxReec",
+"CdyBVUlU3M","VLTy648cHL","hE1Qll83Ud","tlILtTa8f6","VjCZqdjsrv","ReKEW0PktI","VBjhz4W0Tl","6q6L9FnPFB","cmXIXCNHmv","Dz1R38TxD7",
+"xXTI4aDGtS","5IhmG2DREs","dQ586wiHrZ","mX2GEC2Irc","Y1mC048cHL","QChxs9iGoT","ulk41soy9t","QChxsUlU3M","0h1b155rfB","M3zXLuZPqg",
+"IBe8ktvdkD","Nxx9VBGaQY","SmGzvlpF6W","UmaEvHRxd8","14FLRjtn0X","JRJQBUmaEv","Oz8yZuPX7G","kB5nPX6Pin","9y4lw9eoRc","0YAGHGXdoH",
+"l83UdjiVBP","hYBCK9y4lw","NhXduWmadA","Qworu1LB1L","blLA9NOHsz","U3yw57X3uy","lkMUAe6e4z","mX2GEDz1R3","WreyPgf8rI","VerEA64s8N",
+"lj07Qfqypy","8xEKzvLsmS","Yh1hFeuZA5","O3iyQpv0i7","yofH3dQ586","ogLgcB3qem","D6rByRzaZA","uN6r3NAFuw","Yw2oUksJby","uQIczJIqXi",
+"ru4UGtl72W","i3pyddmoS7","hYBCKFGzgp","Chuy307n1c","CdyBVEOE1o","zY1GYEOE1o","qQxHPWDVWJ","6AFT0WPmlx","F6PT2MaJQs","618DifaHir",
+"FjHXRuLtKs","JRJQBF6PT2","mz8gxTCgPp","FjHXRCp3mZ","VLTy6NhXdu","RkQkeiB08l","5iGN5gjUTu","9rlg9POUYS","Q6hMClm0pD","6q6L98RCUA",
+"l83UdiwzGk","BGaQYfFDrJ","7fsYMSmGzv","uvf7ATa8f6","4QMc9aL6AJ","CIShGEoToP","TCgPpJ2mQi","FwEJzFGzgp","QWxoTdmoS7","2Yz7ExXTI4",
+"n1pmO55rfB","dhSuHi3pyd","zz4ZUAIYUu","FnPFB07n1c","ydG8UJXljW","qaofNRzaZA","ThjNnIn3NS","d85a9h1zcH","tjQxsb29RJ","pAhR10PktI",
+"ZzJHWRmDcr","sx5GllweGy","xciqpxXTI4","4dEz6mz8gx","blLA9VLTy6","fmIK12TRI7","azIWpOUYuF","tjQxs9y4lw","GrDg78xEKz","fFDrJcmXIX",
+"gdQsScL0aE","yEfy9FVMxo","suY4xy94nw","qUJMdlkMUA","RkQkeHfyNQ","pvgjSNAFuw","Yf2EcWDVWJ","ksJbyZhwG1","lsQGorhl0J","LewvMRACuj",
+"lXFOBOz8yZ","t59lRnnP8o","RsQUqL7cGc","FPfSENAFuw","fcJOyP6bcg","nFqikNcICA","zbIYYy94nw","hUTw7GWqqX","Mkgy8MaJQs","kZANmDLhzM",
+"gIYvEzHF1q","ru4UG9rlg9","0h1b1BGaQY","HlUbF9rlg9","uLtKsBGaQY","WmadAMezSW","zz4ZUe6e4z","618DizbIYY","HlUbFlkMUA","d7vjMk85Ae",
+"v2eC3M3zXL","2Yz7EpiJSk","jtn0XxReec","6AFT0IKxdL","8U2nUuupzk","7fsYMlj07Q","POUYSbrhlQ","lViBvwDajX","dhSuHIKxdL","StlDJIjTwP",
+"Fhtgl07n1c","blLA9Y1mC0","tl72WgtCA5","0h1b1jfREu","yluBx14FLR","n8pJ9oGu6x","Gv3FqYw2oU","rhl0JbZLvS","5ZaEzru4UG","SjskQQnJ1S",
+"gdQsStl72W","e6e4zpWiOs","dpe1vStlDJ","C2IrcbZLvS","bgJAz6AFT0","GSQwjeuZA5","guMb8DcpWB","aL6AJ7X3uy","BbwgAlkMUA","2hEEURxrsm",
+"2NslmHlUbF","taOXKwDajX","KsjRKoQ87r","UmaEvtjQxs","zFgtBHP433","4W0Tluvf7A","5IhmGhi5X7","NAFuw4QMc9","8U2nURBhp0","Vprf20PktI",
+"CqqaD2TRI7","cQOnvDcpWB","NAFuwFxX9q","yofH3QssNC","Zv7z0s7Mxk","QWxoTcShY2","prNT6uoStw","64s8N9rlg9","IKxdLOz8yZ","iKqhruupzk",
+"AXpwEpvgjS","zz4ZUvOqCE","QssNCiB08l","FwEJzQWxoT","gIYvEG1RhS","M3zXLFjHXR","RmDcrs7Mxk","MmsIo48cHL","ydG8UoVQp6","lXFOB8RCUA",
+"ciuWz5Drn0","2ZHdkjiVBP","J2mQifcJOy","BbwgA5VZjS","CIShGRxrsm","FcWrWChuy3","Dz1R3618Di","3weIFfFDrJ","UlU3Mi7WMQ","zY1GYC2Irc",
+"mz8gxEoToP","9XyT9GWqqX","BpYhVRxrsm","FNYIMulk41","uAWyppT8wu","IjTwPRACuj","DLhzMgIYvE","5ZaEz618Di","QClRL2Yz7E","VBjhzZhwG1",
+"VNCPdDcpWB","cmXIXyToGW","16lHcQbxXc","uJScX5IhmG","AIYUu9y4lw","AXpwEZzJHW","J2mQiuoStw","oQ87rMmKGJ","NhXduZuDtD","9XyT9zqH0W",
+"YOfrYcL0aE","5Drn0Yw2oU","C2Irc3weIF","cmXIXAIYUu","dmoS7fLNg8","EOE1ooVQp6","yEfy9K20wK","KsjRKsqVrf","HfyNQMmsIo","JkzUnI7p2a",
+"jS1ajNhXdu","FGzgpbZLvS","F6PT2tlILt","5ZaEzlweGy","FnPFBfmIK1","uupzkazIWp","azIWpM3zXL","pv0i7uJScX","zQt6QQ6hMC","CIShGVIlwP",
+"lweGynFqik","Ul4a1QbxXc","WmadAzbIYY","tlILtPb1pa","tuDySblLA9","yEfy9he9IA","nFqik3otm6","lViBvyEfy9","K4GS87hyVv","v1Hln9eoRc",
+"2Yz7EDLhzM","IKxdLGrDg7","Nxx9Vulk41","VNCPdMojnP","tvdkDlj07Q","Q6LixZuDtD","JIqXisqVrf","zz4ZUuQIcz","W7cTsblLA9","7lUXZogLgc",
+"Mm8siaFFss","FFDuin1pmO","wiHrZQworu","MK07Y9XyT9","zFgtBQworu","xXTI4NOHsz","m4bxUMGlTF","sx5GlRsQUq","RmDcr24ARF","pv0i7aDGtS",
+"JJs5mMaJQs","zz4ZUuvf7A","nnP8oFLsph","24ARFYh1hF","580YDbZLvS","5VZjSReKEW","uZPqgxXTI4","5nmWve6e4z","GSQwjSWfou","jzUqRAmdQd",
+"AXpwEzmLYD","55rfBEdBKc","QssNC5ZaEz","okgRiK20wK","580YDfaHir","4W0TlY1mC0","VIlwPt59lR","k85AeG1RhS","7lUXZWaWsv","StlDJksJby",
+"lCMxyFLsph","4QMc9cmXIX","POUYSxReec","b29RJtuDyS","kB5nPo8Uyd","No0QbBpYhV","Pb1palj07Q","7lUXZnlaBy","ZzJHWcShY2","DG4sTHlUbF",
+"mz8gxn1pmO","fcwDai3pyd","AkKTk5Mg9r","FPfSE8TxD7","VLTy6hE1Ql","WreyP16lHc","suY4xF6PT2","RmDcrDG4sT","cL0aEJXljW","M6qcGQWxoT",
+"gdQsScShY2","RsQUqyToGW","i7WMQtAOsr","CqqaDHfyNQ","azIWpuvf7A","GXdoHhUTw7","MezSWpWiOs","uLtKsRpBQm","UlU3Muvf7A","GrDg7GWqqX",
+"QYxC0VjCZq","KsjRK580YD","3weIFpWiOs","NhXduOUYuF","ciuWzsuY4x","EdBKcD6rBy","8RCUAVerEA","0h1b1s93Ml","prNT6HlUbF","zmLYDFPfSE",
+"0Wr5ytAOsr","GXdoHsoy9t","zmLYDK20wK","IKxdLnnP8o","0ao3lGSQwj","4QMc9J2mQi","oGu6xQ6Lix","ECMvU14FLR","2DREsOHaBz","blLA9Dz1R3",
+"6AFT0Kr8ys","yEfy9S77LH","OxWIHEoToP","9iGoT9GXkX","RmDcrHRxd8","rhl0JQworu","W7cTstuDyS","dmoS7bgJAz","pvgjSAIYUu","iKqhrogLgc",
+"aFFss1j5L8","L7cGc8TxD7","t98iWVLTy6","lm0pDn8pJ9","8U2nUUvlv4","iB08l5iGN5","EoToPiB08l","gjUTuYf2Ec","G1RhSzqH0W","O3iyQk85Ae",
+"55rfBGv3Fq","LDk6f07n1c","jeskSJIqXi","14FLR3weIF","K4GS8X6Pin","14FLRyvOMI","Q6hMCMojnP","P6bcg9rlg9","jtn0XbgJAz","lViBv0YAGH",
+"IRh48YjB9t","tjQxsqaofN","Pb1paI7p2a","Yf2EcfFDrJ","3weIFQChxs","DG4sTMmsIo","Y1mC0sx5Gl","tuDySdmoS7","OHaBz8U2nU","5VZjS5VZjS",
+"ogLgcNo0Qb","bZLvSFcWrW","lViBvVNCPd","JRJQBuQIcz","zFgtBtvdkD","5IhmGNxx9V","soy9tBCxeC","Fhtglt98iW","KsjRKzY1GY","oVQp6dpe1v",
+"cmXIXHfyNQ","faHir5Drn0","OxWIH29QAz","aDGtSgf8rI","oQ87rhSSvQ","8xEKzHlUbF","a00b5lsQGo","uZPqgEOE1o","4dEz62hEEU","NAFuwi7WMQ",
+"FhtglCIShG","pv0i7VNCPd","lsQGofaHir","piJSkxciqp","MK07Yru4UG","In3NShi5X7","y94nwJRJQB","qQxHPOUqFM","QClRLhUTw7","yvOMIlsQGo",
+"tl72WFnPFB","BpYhV8U2nU","yluBxUlU3M","6q6L9jeskS","nlaByFGzgp","Ul4a10Wr5y","7X3uyazIWp","AkKTkBpYhV","AXpwEAIYUu","cQOnvUmaEv",
+"cShY2gdQsS","3otm6LewvM","EdBKcciuWz","FPfSE9XyT9","rz7UtQYxC0","M3zXLfcwDa","kZANmfcwDa","nlaBys93Ml","TXQ0ZuN6r3","CK5W7uPX7G",
+"Uvlv4he9IA","BFkb8zz4ZU","MK07YuoStw","zqH0WtlILt","FNYIM580YD","8TxD7BFkb8","fLNg8QnJ1S","yToGWK4GS8","2TRI7zbIYY","tvdkDt98iW",
+"Zv7z0jtn0X","cQOnvnFqik","1LB1Lt98iW","RkQkeUl4a1","d85a9F6PT2","zmLYD3otm6","3weIFni2v1","W3VFHi3pyd","1v5hHnlaBy","b29RJs4786",
+"FLsphlViBv","DLhzMksJby","ZzJHWlm0pD","Yw2oUNxx9V","YjB9t0h1b1","2DREs24ARF","bZLvSVNCPd","fLNg8NhXdu","IRh48FcWrW","Waim6lkMUA",
+"2ZHdktvdkD","2Yz7E9rlg9","SjskQtaOXK","QYxC0vLsmS","8hJdtrhl0J","IjTwPyvOMI","rKDLJs93Ml","XflUqMmKGJ","XyPZNsuY4x","48cHLksJby",
+"F6PT25Drn0","W7cTs29QAz","EOE1oFwEJz","FNYIMm4bxU","IBe8kCIShG","IBe8kFjHXR","zQt6QIjTwP","BbwgAMmsIo","VIlwP7lUXZ","vLsmS2TRI7",
+"580YDzmLYD","brhlQJIqXi","IBe8kksJby","bgJAzsx5Gl","C2IrcuLtKs","5ZaEzUlU3M","9GXkX2Yz7E","5drc6v8yFN","ydG8UW7cTs","tvdkD9eoRc",
+"Vprf2he9IA","QClRLmX2GE","0YAGHnFqik","GSQwj8hJdt","GSQwj2hEEU","cShY2BbwgA","oQ87rblLA9","16lHc7hyVv","JIqXipT8wu","KsjRKjSjS3",
+"8RCUAIjTwP","piJSktAOsr","AIYUulCMxy","0Wr5y8U2nU","zQt6QVjCZq","Waim65ZaEz","QChxsBpYhV","d85a9XflUq","8hJdtBpYhV","AmdQdpvgjS",
+"5IhmGJXljW","fLNg8VIlwP","dmoS72Nslm","FwEJzHP433","pAhR1pAhR1","yofH3vLsmS","KZamH8TxD7","uZPqgQworu","qQxHPTXQ0Z","qQxHPW3VFH",
+"8xEKztAOsr","Fhtglo8Uyd","8FmFHkB5nP","atef2VerEA","dhSuHWreyP","VjCZq0h1b1","OHaBzzHF1q","DG4sThUTw7","cShY2VBjhz","X6Pin5IhmG",
+"k85AecmXIX","vLsmSNxx9V","KZamHAXpwE","OUYuF9GXkX","NcICANAFuw","cShY2D6rBy","sqVrft98iW","DcpWBVerEA","dmoS7vkCHH","CIShG9y4lw",
+"IBe8kpiJSk","vkCHHGrDg7","sqVrf8xEKz","n1pmOrz7Ut","VerEAWDVWJ","0h1b1HP433","atef28cVD3","iB08lMaJQs","SmGzv7hyVv","TwanoOz8yZ",
+"euZA5M3zXL","5Mg9rjS1aj","pFrrlgdQsS","dpe1vRBhp0","o8Uyd8RCUA","8U2nUAmdQd","vOqCEQnJ1S","iwzGkZJTXH","ydG8UVLTy6","O3iyQGWqqX",
+"PYBf4rz7Ut","QssNCG1RhS","GWqqXatef2","GWqqX14FLR","Twano2TRI7","MmKGJFVMxo","GSQwjSs0Zu","Kr8yszY1GY","G1RhSJJs5m","xXTI4Zv7z0",
+"AOgEe9GXkX","YjB9tWPmlx","yofH3VjCZq","Vprf2IKxdL","07n1c0h1b1","uoStwX6Pin","P6bcgZUnqt","yEfy9Fhtgl","Yh1hFRACuj","8U2nUfFDrJ",
+"0h1b1uJScX","o8UydAIYUu","5Drn0jtn0X","yofH35drc6","AkKTkIn3NS","hi5X7oQ87r","aFFss9iGoT","WDVWJfcJOy","uJScXMGlTF","euZA55iGN5",
+"ogLgchYBCK","soy9t14FLR","RmDcr1v5hH","MmsIotlILt","0ao3lgdQsS","Zv7z0ECMvU","VerEAIBe8k","07n1cni2v1","RxrsmxXTI4","zbIYYprNT6",
+"ZJTXH0Kyfs","yEfy9Oz8yZ","W3VFHJXljW","brhlQ5IhmG","X6PinpFrrl","CNHmvrz7Ut","Oz8yZ1LB1L","azIWpFGzgp","FVMxoMmsIo","lsQGo6q6L9",
+"h1zcHaDGtS","lpF6WzHF1q","jSjS3ECMvU","618Dizz4ZU","RpBQmfFDrJ","zHF1qAgJHQ","M6qcGAIYUu","X6PinzY1GY","14FLRGv3Fq","VIlwP8hJdt",
+"RpBQmfmIK1","VLTy60MR5X","blLA9sx5Gl","rKDLJyofH3","v8yFNaL6AJ","uQIcz7Ow5C","pvgjShSSvQ","pvgjSDcpWB","F6PT2pFrrl","8U2nUfqypy",
+"POUYSPOUYS","Oz8yZ0MR5X","ix74rzbIYY","fLNg8GrDg7","guMb8B3qem","MaJQskB5nP","iB08ls7Mxk","DLhzM5Drn0","qaofNUvlv4","P6bcgWreyP",
+"3weIFRpBQm","uupzkAmdQd","9y4lw0h1b1","lweGy9y4lw","y94nwMK07Y","jfREuFFDui","hSSvQJIqXi","Q6hMCsqVrf","aFFss14FLR","aDGtSmz8gx",
+"ZhwG19rlg9","AgJHQZ4I1v","hSSvQgIYvE","SbRYyWDVWJ","StlDJ8RCUA","prNT66AFT0","uLtKsSmGzv","iKqhrMezSW","rKDLJiqv4k","mX2GE1j5L8",
+"45cIHHP433","KsjRKChuy3","lCMxyKr8ys","LDk6fxciqp","14FLRStlDJ","IjTwPjtn0X","SbRYy29QAz","L7cGc3otm6","G1RhSW3VFH","0YAGHsuY4x",
+"s93MlnlaBy","nFqiklCMxy","EOE1oDQimp","soy9tIn3NS","x3LDeZ4I1v","8FmFHblLA9","0h1b1nlaBy","vkCHHRBhp0","LbRTHP6bcg","xciqpThjNn",
+"MmKGJogLgc","FLsphn8pJ9","d85a9aez9y","xciqpfmIK1","guMb8XflUq","Y1mC0LDk6f","9eoRchSSvQ","QssNCDcpWB","IBe8kJXljW","d7vjMjiVBP",
+"MezSWFGzgp","Yh1hF48cHL","uLtKsuAWyp","lXFOBGXdoH","VIlwPfcwDa","HfyNQgf8rI","8cVD3ciuWz","5Drn0taOXK","DG4sTdhSuH","9GXkXcShY2",
+"MezSWNcICA","ThjNnQChxs","YOfrYpWiOs","5IhmGBCxeC","S2DfuPb1pa","KASQ8IKxdL","9y4lwIn3NS","5Drn0uQIcz","BFkb8nlaBy","uQIczRkQke",
+"Oz8yZoVQp6","hi5X75Drn0","3weIFjzUqR","pT8wuGXdoH","CIShG8xEKz","Nxx9VQnJ1S","jS1ajP6bcg","HfyNQF6PT2","Zv7z04W0Tl","YjB9tHlUbF",
+"RsQUqulk41","5VZjSYf2Ec","uupzkWDVWJ","yvOMI8xEKz","2ZHdks4786","zY1GY8FmFH","7lUXZ618Di","8U2nUrhl0J","pFrrli3pyd","Yh1hFB3qem",
+"0BmCydhSuH","a00b5Ss0Zu","J2mQiv2eC3","d7vjMWaWsv","djsrvtjQxs","9y4lwGv3Fq","jS1ajMK07Y","S77LHsqVrf","OUqFMYOfrY","3otm6iB08l",
+"Nxx9V45cIH","vLsmS8RCUA","55rfB8RCUA","BGaQYNhXdu","FNYIMJJs5m","7ku1plsQGo","NOHszVNCPd","LbRTH2TRI7","Yw2oUUmaEv","gdQsS0ao3l",
+"ogLgcAOgEe","FjHXRazIWp","uLtKsoVQp6","SjskQuQIcz","zQt6Qulk41","Fhtgl1v5hH","lViBvXyPZN","a00b5MezSW","KZamHo8Uyd","kB5nPuvf7A",
+"NhXduFFDui","7fsYMnlaBy","FjHXR8TxD7","580YD5Mg9r","HzZT8OUqFM","29QAzDcpWB","oQ87rtlILt","v8yFNpFrrl","Kr8ysDQimp","brhlQjeskS",
+"v2eC34dEz6","d85a94dEz6","AXpwEguMb8","okgRitaOXK","fFDrJReKEW","he9IAM3zXL","Uvlv4DcpWB","0BmCy3otm6","rhl0JZUnqt","5Mg9rru4UG",
+"bZLvSQ6Lix","uJScXRsQUq","Ss0ZugjUTu","C2IrcM3zXL","atef2QssNC","Kr8yscmXIX","S77LHnlaBy","lViBvEoToP","hSSvQvOqCE","BGaQY580YD",
+"okgRipvgjS","yvOMIZzJHW","580YD5nmWv","SmGzvd7vjM","16lHcSjskQ","ZuDtDBGaQY","hSSvQGXdoH","QYxC0uupzk","2TRI70PktI","jfREuzbIYY",
+"L7cGcBbwgA","cQOnvsqVrf","2Yz7EZhwG1","pAhR1Kr8ys","8cVD3cmXIX","I7p2aoGu6x","JKWYRdmoS7","5drc6No0Qb","DcpWBjSjS3","uN6r31j5L8",
+"GSQwjMmsIo","4W0TlcL0aE","8TxD7qaofN","K20wKChuy3","K4GS8tvdkD","IBe8kHRxd8","Ul4a16q6L9","RkQkeMmsIo","uN6r3azIWp","he9IACK5W7",
+"Q6hMCUl4a1","0BmCyhUTw7","5Drn00h1b1","O3iyQ29QAz","ZhwG1XyPZN","he9IAzmLYD","VIlwPUl4a1","zFgtBs93Ml","uoStwtvdkD","x3LDeJRJQB",
+"yToGWaez9y","TwanoFLsph","hUTw7bgJAz","WaWsv8RCUA","07n1czz4ZU","AIYUuZuDtD","ZJTXHOUYuF","F6PT2NcICA","lH1ktaez9y","QYxC0lweGy",
+"IKxdLhYBCK","h1zcHuvf7A","WaWsvPb1pa","FGzgpNAFuw","gIYvEv1Hln","iqv4kpvgjS","euZA5iB08l","x3LDeIBe8k","pmeCdTCgPp","yofH3GrDg7",
+"MezSWjSjS3","ix74rqaofN","RkQkedhSuH","K20wKNOHsz","KsjRKprNT6","1j5L8IjTwP","BFkb82Nslm","0h1b1WPmlx","fcJOyVLTy6","0h1b15Drn0",
+"FhtglRpBQm","VBjhzkZANm","FwEJz64s8N","5IhmGMm8si","64s8NRBhp0","taOXKdpe1v","1v5hHi3pyd","HRxd8h1zcH","ogLgc55rfB","s93Ml4W0Tl",
+"e6e4zMm8si","dmoS7euZA5","zFgtBogLgc","pvgjSnFqik","HzZT8hUTw7","dhSuHVprf2","cL0aE5Drn0","jeskS6q6L9","RACujDLhzM","tuDySYf2Ec",
+"d85a95Namm","ulk41v1Hln","I7p2azHF1q","4W0Tl2ZHdk","D6rByoVQp6","qQxHPhUTw7","FFDuiYw2oU","x3LDe0PktI","K4GS8t59lR","EOE1okB5nP",
+"5drc6i7WMQ","Ta8f6Q6Lix","mz8gxJkzUn","Gv3FqNo0Qb","BGaQY3weIF","5NammB3qem","lj07QgtCA5","h1zcHIBe8k","h1zcH24ARF","5Mg9rcL0aE",
+"X6Pinfqypy","Mm8siVBjhz","iB08loVQp6","0h1b11LB1L","HfyNQyToGW","oGu6xv8yFN","pmeCdzQt6Q","uJScX0h1b1","AIYUuRBhp0","AIYUuCdyBV",
+"ciuWzuvf7A","hYBCKsoy9t","D6rBy48cHL","MK07YoVQp6","oGu6x9eoRc","lj07QFNYIM","gjUTuK20wK","euZA5ECMvU","ni2v1oGu6x","2NslmqUJMd",
+"1v5hHcL0aE","suY4xokgRi","14FLRlweGy","jtn0XEdBKc","prNT6LbRTH","OUqFMVprf2","LewvMSjskQ","XyPZNFVMxo","In3NSUvlv4","W7cTsLDk6f",
+"nnP8oJXljW","7hyVvhe9IA","Uvlv4jzUqR","C2IrcHzZT8","64s8NaDGtS","OUqFMwiHrZ","Gv3Fq9iGoT","lXFOBIjTwP","brhlQuN6r3","WDVWJ6q6L9",
+"uPX7G6AFT0","FLsphvkCHH","hUTw7SmGzv","tlILtZv7z0","LewvMsx5Gl","0BmCyaL6AJ","uN6r3fFDrJ","9iGoTqUJMd","FFDuiFxX9q","taOXKU3yw5",
+"JRJQBPb1pa","Yf2Ec5drc6","RzaZAEoToP","djsrvzHF1q","k85AeprNT6","FwEJzYh1hF","UlU3MAXpwE","lm0pD3weIF","GWqqX5Namm","qUJMd5ZaEz",
+"EdBKcC2Irc","ZUnqtFFDui","StlDJHP433","uQIczaez9y","7X3uyQnJ1S","DcpWBJXljW","WreyP1LB1L","OHaBz9XyT9","HlUbFPYBf4","v8yFNMaJQs",
+"8xEKzDG4sT","jS1ajL7cGc","GrDg7dmoS7","8hJdta00b5","blLA9GrDg7","SjskQqaofN","0KyfslH1kt","uoStwK20wK","FjHXRe6e4z","BbwgAAgJHQ",
+"UlU3M07n1c","Gv3FqnlaBy","B3qemyToGW","GXdoHW3VFH","L7cGcZ4I1v","FcWrWFnPFB","6q6L9zY1GY","jfREujzUqR","I7p2aStlDJ","0PktIFcWrW",
+"WaWsvAmdQd","S77LHvLsmS","K20wKStlDJ","C2IrcFGzgp","SWfou6q6L9","W3VFHn8pJ9","NhXdu24ARF","9GXkX7X3uy","IjTwPjSjS3","QChxsd7vjM",
+"ogLgcbrhlQ","8hJdtbrhlQ","4W0TlydG8U","W7cTsX6Pin","QbxXcciuWz","yvOMIciuWz","azIWpciuWz","9rlg9QWxoT","POUYSa00b5","ZJTXHmX2GE",
+"vkCHHVIlwP","OUYuFDcpWB","kB5nPtjQxs","5IhmGeuZA5","9eoRcaez9y","rhl0JD6rBy","EOE1oprNT6","lj07Q5Namm","XyPZN618Di","UmaEvM3zXL",
+"k85AetjQxs","fmIK14W0Tl","d7vjMzbIYY","FcWrWtjQxs","gtCA5cShY2","7X3uy0ao3l","EoToPIn3NS","DG4sTKsjRK","GWqqX0ao3l","2ZHdkKASQ8",
+"WaWsvJRJQB","0PktIzQt6Q","EoToP0PktI","qaofNLDk6f","GXdoH14FLR","pmeCdOz8yZ","2DREsK20wK","vOqCEzbIYY","Yw2oUprNT6","zz4ZUCfgr3",
+"2NslmD6rBy","8U2nUksJby","ReKEW0Wr5y","uJScXvLsmS","FLsphd85a9","14FLR0BmCy","lXFOBIBe8k","zHF1q45cIH","L7cGcFLsph","0YAGHqUJMd",
+"In3NSt98iW","MojnPZhwG1","yluBxwDajX","uPX7GFPfSE","jiVBPJ2mQi","F6PT2UlU3M","zQt6QDLhzM","4dEz62Yz7E","DLhzMK4GS8","t59lRoGu6x",
+"WreyPLbRTH","K20wK5VZjS","8xEKzb29RJ","LbRTHDLhzM","jS1ajb29RJ","nlaBy24ARF","pWiOsl83Ud","MmsIouAWyp","VLTy6ydG8U","tAOsrni2v1",
+"8FmFHtvdkD","Qworuo8Uyd","5Drn0iKqhr","6q6L9gtCA5","lpF6WGrDg7","fcJOytaOXK","hYBCKSWfou","1LB1LWPmlx","GXdoHF6PT2","n8pJ9taOXK",
+"brhlQ0h1b1","QClRL16lHc","LDk6fG1RhS","bZLvSP6bcg","d85a9iKqhr","16lHcMojnP","gtCA5No0Qb","xciqpuoStw","VBjhza00b5","uupzkUmaEv",
+"Kr8ysK20wK","wDajXCfgr3","AgJHQjSjS3","7fKYU0Wr5y","v1HlnfFDrJ","atef27fsYM","1j5L8o8Uyd","lH1ktEOE1o","s7MxkmX2GE","sqVrffcJOy",
+"euZA5D6rBy","fcwDaYOfrY","GrDg7Twano","ZUnqtCK5W7","kB5nPKZamH","Q6LixsqVrf","VLTy6gf8rI","cL0aE3otm6","VerEApmeCd","Dz1R3uAWyp",
+"StlDJuTacx","TCgPpQClRL","lj07QhUTw7","lXFOB0YAGH","GrDg7S2Dfu","TXQ0ZpFrrl","ZUnqtKsjRK","rz7Utt98iW","e6e4zvkCHH","lkMUAJ2mQi",
+"dhSuHOHaBz","WDVWJVLTy6","SmGzve6e4z","2TRI7ZJTXH","O3iyQMkgy8","m4bxU8TxD7","prNT6Dz1R3","Cfgr3m4bxU","HRxd8MmsIo","9GXkXEOE1o",
+"5Mg9rNAFuw","uQIczOxWIH","nnP8oWaWsv","Q6hMCv8yFN","Chuy3WmadA","0KyfszqH0W","pmeCdXyPZN","sqVrfprNT6","VBjhzydG8U","QssNC8xEKz",
+"pFrrljtn0X","pAhR1OUqFM","S77LHXflUq","5iGN51v5hH","S2DfuQChxs","4W0TlDQimp","fmIK1Q6Lix","aez9yZuDtD","guMb8SmGzv","fcJOyMmsIo",
+"AOgEeFLsph","HzZT8MmsIo","Waim6blLA9","uLtKsSbRYy","Z4I1vKsjRK","uZPqgoQ87r","lH1ktfcwDa","bgJAzXyPZN","RzaZAuLtKs","2DREs1LB1L",
+"gdQsSZv7z0","UmaEvpT8wu","aL6AJDcpWB","45cIHzY1GY","EoToP9iGoT","mX2GEjSjS3","M6qcG6q6L9","pWiOsb29RJ","MGlTFTa8f6","sqVrf8RCUA",
+"xXTI45ZaEz","J2mQiSs0Zu","lCMxyI7p2a","sx5GlgtCA5","pv0i7EdBKc","SmGzvvLsmS","9iGoTRzaZA","45cIHpv0i7","zbIYYZ4I1v","XflUqZhwG1",
+"7X3uy8xEKz","piJSke6e4z","OxWIHokgRi","BbwgATXQ0Z","HfyNQjiVBP","HfyNQqQxHP","POUYSWreyP","okgRiJkzUn","x3LDeFPfSE","ciuWzMkgy8",
+"4QMc97fKYU","yofH3ThjNn","jSjS3sx5Gl","qQxHPblLA9","cmXIXjiVBP","uPX7Gl83Ud","8cVD3Waim6","D6rByFwEJz","P6bcgMojnP","s7MxkFjHXR",
+"gdQsS7fKYU","KASQ8yToGW","EOE1o9GXkX","kB5nPy94nw","MK07YsuY4x","JXljWAgJHQ","VjCZqQ6Lix","lm0pDMaJQs","IRh48LbRTH","cQOnv6q6L9",
+"yEfy91LB1L","bgJAzCK5W7","iB08lhUTw7","t98iWS2Dfu","Y1mC0GWqqX","ksJbynFqik","fFDrJbgJAz","cmXIXSbRYy","ECMvUWDVWJ","mz8gxVLTy6",
+"9rlg97lUXZ","soy9t9rlg9","24ARFru4UG","ReKEWlH1kt","zY1GYCK5W7","ZuDtDdmoS7","o8Uydulk41","ReKEWkB5nP","oGu6xNhXdu","Cfgr38cVD3",
+"LbRTHhUTw7","pT8wu580YD","lm0pDdmoS7","8TxD7zHF1q","v2eC3VNCPd","0h1b1lsQGo","QChxscmXIX","0h1b1BpYhV","zbIYY7hyVv","SmGzvhe9IA",
+"jS1ajPb1pa","Ta8f6HRxd8","0Kyfs7Ow5C","QworuzHF1q","ulk41dmoS7","5nmWvlkMUA","Cfgr3iKqhr","QnJ1S0Wr5y","y94nwSs0Zu","07n1cVprf2",
+"OUYuFNxx9V","iqv4kBpYhV","618Ditl72W","uvf7A0BmCy","5Drn05drc6","PYBf4M6qcG","JXljWs93Ml","J2mQizqH0W","CNHmvIKxdL","RsQUqrz7Ut",
+"nFqik29QAz","8cVD37fKYU","55rfBy94nw","5Drn0jfREu","xReecReKEW","n8pJ9ZzJHW","9rlg9JJs5m","MmKGJo8Uyd","Kr8ys16lHc","yToGWJkzUn",
+"AXpwEZuDtD","iwzGk0Wr5y","I7p2apiJSk","MojnPSbRYy","Ul4a1RzaZA","9rlg9RACuj","L7cGciqv4k","7X3uyzY1GY","EOE1ov2eC3","yofH3dmoS7",
+"zFgtBuJScX","BpYhVzQt6Q","jSjS3RpBQm","KsjRKD6rBy","Cfgr3RACuj","5iGN5MmKGJ","7fKYU0h1b1","EOE1oqaofN","2ZHdkM3zXL","SbRYyRxrsm",
+"fLNg8WPmlx","gjUTuzY1GY","vOqCEgtCA5","hUTw7jS1aj","K20wKJXljW","xXTI4zQt6Q","VLTy6e6e4z","y94nwvOqCE","xXTI4brhlQ","618DiDQimp",
+"IKxdLlkMUA","ZJTXHVprf2","ECMvUWPmlx","tlILtxciqp","jzUqRJJs5m","l83UdbZLvS","JXljWrKDLJ","DLhzMFnPFB","GXdoHNcICA","fcJOy9iGoT",
+"IBe8k3weIF","WaWsvQworu","QWxoTVNCPd","uZPqgCxVEf","VerEA5ZaEz","2hEEUNcICA","lViBvL7cGc","KZamHaDGtS","Chuy3SWfou","K4GS8lpF6W",
+"7X3uyhSSvQ","atef2azIWp","6q6L9W7cTs","sx5GlX6Pin","UlU3MrKDLJ","jS1ajW7cTs","PYBf4Nxx9V","pT8wuzQt6Q","8hJdt3weIF","yEfy9uAWyp",
+"VBjhzYw2oU","pv0i7No0Qb","x3LDes93Ml","fLNg8BFkb8","xciqpRsQUq","29QAzFVMxo","4dEz6W7cTs","ZzJHWlXFOB","XflUqn1pmO","gtCA5LewvM",
+"M3zXL5VZjS","iKqhrAOgEe","VBjhzKZamH","MojnPMkgy8","AmdQdiB08l","W3VFHtjQxs","cQOnvF6PT2","CqqaDCdyBV","8cVD3v8yFN","VjCZqYf2Ec",
+"oVQp6fcwDa","RmDcrksJby","JKWYRCK5W7","lXFOBatef2","pvgjSZUnqt","FnPFBKZamH","9rlg92TRI7","JIqXiPYBf4","JIqXiqaofN","JRJQBdhSuH",
+"i3pydtAOsr","he9IAMkgy8","3weIFLbRTH","aL6AJJJs5m","JKWYRpvgjS","tAOsrNhXdu","BpYhVuupzk","S77LHyluBx","xXTI4JJs5m","uN6r3uvf7A",
+"pv0i78TxD7","ZuDtDksJby","VerEAXflUq","14FLR5iGN5","bZLvS618Di","fcJOyQworu","Pb1paAmdQd","ni2v1SmGzv","Ul4a1580YD","ogLgc2Yz7E",
+"CqqaDt98iW","aL6AJl83Ud","pT8wulj07Q","HlUbFM3zXL","okgRiYf2Ec","pvgjSqaofN","Chuy3fmIK1","lkMUAIBe8k","45cIHZUnqt","5Mg9reuZA5",
+"gtCA5i3pyd","QYxC0yofH3","NcICA5ZaEz","xReec0MR5X","tuDySGWqqX","HlUbFSmGzv","jtn0XKASQ8","0BmCyMm8si","uvf7AMm8si","k85AeVIlwP",
+"RzaZAxReec","QClRL2DREs","FwEJzAmdQd","pT8wulsQGo","0BmCypmeCd","zFgtBI7p2a","PYBf41j5L8","5Mg9rOz8yZ","lCMxyUlU3M","6q6L9C2Irc",
+"d7vjMy94nw","bZLvSG1RhS","faHir8cVD3","lCMxyGXdoH","cL0aEWMiS3","Gv3FqTXQ0Z","7ku1p9eoRc","gIYvEd7vjM","2TRI7Q6hMC","uAWypF6PT2",
+"MmKGJQssNC","Ul4a1RsQUq","kZANmSbRYy","ZzJHWiB08l","9GXkXjfREu","YOfrY8hJdt","faHirHRxd8","QWxoTdpe1v","tl72WlCMxy","ZzJHWStlDJ",
+"iwzGkk85Ae","uZPqgblLA9","0MR5XjSjS3","55rfBCfgr3","7X3uytl72W","Waim6yvOMI","KZamH7fsYM","0ao3l9rlg9","IjTwPdmoS7","pmeCdJXljW",
+"k85AeP6bcg","uupzk14FLR","pvgjSt59lR","fcJOyciuWz","qQxHPzqH0W","jSjS3t98iW","DLhzMAIYUu","fLNg8jiVBP","i3pyduN6r3","iKqhruZPqg",
+"cmXIXDQimp","2NslmQbxXc","tjQxsRxrsm","h1zcHbrhlQ","lpF6WxReec","5nmWvyvOMI","uQIczRmDcr","5Mg9rQ6hMC","iB08lFhtgl","SjskQfqypy",
+"S77LHStlDJ","0BmCyWreyP","euZA5aDGtS","MGlTF8TxD7","3otm6AXpwE","y94nwxReec","HlUbFLewvM","pmeCdCfgr3","CxVEfY1mC0","atef2OUYuF",
+"FwEJzbZLvS","EoToPgIYvE","580YD48cHL","ulk417lUXZ","RACuj0Kyfs","7ku1plm0pD","o8Uyddpe1v","POUYSLDk6f","hUTw7uQIcz","FjHXRbgJAz",
+"WPmlxa00b5","KZamHMK07Y","lj07QGXdoH","BpYhVWaim6","OxWIHyvOMI","Uvlv4mX2GE","K4GS8Dz1R3","okgRiHfyNQ","mz8gxTwano","iwzGkjSjS3",
+"Z4I1vNo0Qb","guMb8HP433","pFrrlRsQUq","yEfy9jeskS","45cIHHfyNQ","AkKTkTXQ0Z","WreyP5Mg9r","lm0pDru4UG","KsjRKUl4a1","D6rByuupzk",
+"5ZaEz7hyVv","s93MlfcJOy","9y4lwJkzUn","Waim6EdBKc","v8yFNFFDui","K20wKlViBv","dhSuHAIYUu","pT8wuIn3NS","nFqikhe9IA","lpF6W0BmCy",
+"Yh1hFhSSvQ","GWqqXyEfy9","lj07Qmz8gx","cShY2ciuWz","4QMc9taOXK","bgJAzAgJHQ","DG4sTMGlTF","5Mg9rQworu","vLsmSOUYuF","8FmFHfcJOy",
+"AmdQdsqVrf","8FmFHUmaEv","qUJMdRpBQm","KZamH9GXkX","atef2nlaBy","TwanoDG4sT","0h1b1QWxoT","24ARFydG8U","uTacxJJs5m","OxWIHCp3mZ",
+"qQxHP580YD","jeskSCp3mZ","1v5hHLewvM","AIYUufLNg8","0PktIuupzk","okgRiFxX9q","WreyPHlUbF","fLNg8piJSk","lm0pDzHF1q","AIYUudmoS7",
+"Pb1pan8pJ9","FPfSEmz8gx","pFrrloGu6x","ThjNnPb1pa","yvOMIjiVBP","QYxC0MojnP","pvgjSMojnP","lm0pDlm0pD","UmaEvIRh48","fqypyy94nw",
+"DQimpZ4I1v","nlaBy5iGN5","tAOsrn1pmO","k85AeCqqaD","pmeCduJScX","JXljW4QMc9","RkQkeQYxC0","sqVrfM3zXL","DG4sTSjskQ","CK5W7zHF1q",
+"0Wr5yGWqqX","CqqaDOUqFM","yofH3uupzk","NAFuwblLA9","DG4sTRsQUq","KZamHfaHir","OxWIHzHF1q","Gv3FqRzaZA","wDajX9iGoT","2hEEUIKxdL",
+"ZUnqtD6rBy","nnP8odhSuH","WDVWJ9rlg9","zqH0WZzJHW","kZANmB3qem","uvf7A1v5hH","9XyT964s8N","MmsIo24ARF","DQimpB3qem","WmadAlsQGo",
+"cQOnvgf8rI","jfREuWaWsv","zFgtB9XyT9","sqVrfWaWsv","SbRYyfLNg8","VNCPdd85a9","MmsIo6q6L9","GSQwjgIYvE","yluBxkZANm","wDajX45cIH",
+"wiHrZ5Mg9r","nnP8o0h1b1","sx5GlVerEA","MmKGJtl72W","uZPqg45cIH","jiVBPl83Ud","suY4xv8yFN","QssNCdhSuH","8FmFHUl4a1","brhlQkZANm",
+"UmaEvTXQ0Z","k85Ae24ARF","xciqpfFDrJ","tjQxsWaWsv","aFFss45cIH","pmeCd5nmWv","Cfgr3gtCA5","KsjRKJJs5m","dQ5860YAGH","sx5Gluupzk",
+"618Di8TxD7","55rfBv8yFN","zmLYD9y4lw","azIWpOz8yZ","TCgPpK20wK","FNYIMokgRi","KASQ8faHir","HfyNQ8RCUA","iB08lEdBKc","a00b5qaofN",
+"In3NSGXdoH","rhl0JdhSuH","jtn0XQnJ1S","nlaBy8RCUA","IjTwPYOfrY","kB5nPBGaQY","mX2GEaDGtS","YjB9th1zcH","a00b5UmaEv","5drc6POUYS",
+"5iGN5lXFOB","pWiOs5Mg9r","tAOsrBbwgA","0BmCyx3LDe","tvdkDDz1R3","64s8NDz1R3","JJs5mNcICA","uJScXLDk6f","h1zcHs4786","UlU3MMGlTF",
+"07n1cuvf7A","TCgPpQWxoT","Nxx9VzY1GY","JKWYRru4UG","XflUq9GXkX","uPX7GkZANm","Zv7z01v5hH","FPfSEOz8yZ","zmLYD6AFT0","45cIHYjB9t",
+"zHF1qBpYhV","wiHrZ8cVD3","NAFuwi3pyd","9y4lwnlaBy","JJs5muPX7G","48cHLFGzgp","d85a97hyVv","ulk41WMiS3","JRJQBTwano","C2IrcnnP8o",
+"RACujxciqp","K4GS88TxD7","blLA9FFDui","yvOMIY1mC0","07n1cAkKTk","DQimpjeskS","iKqhrYh1hF","XflUq7Ow5C","Dz1R3X6Pin","48cHLbrhlQ",
+"ECMvUru4UG","blLA9DG4sT","djsrv48cHL","EOE1oVLTy6","jfREugtCA5","zqH0W8FmFH","VLTy6MmsIo","fcJOyh1zcH","OUqFMSjskQ","lkMUAkB5nP",
+"s4786IKxdL","MezSWIRh48","Mm8sidhSuH","RpBQmFVMxo","uoStwGv3Fq","2TRI7mz8gx","pmeCdhe9IA","IBe8k2TRI7","No0Qbmz8gx","aDGtSHRxd8",
+"jSjS37lUXZ","aDGtSMezSW","8RCUARkQke","gjUTuLDk6f","ECMvUrz7Ut","HzZT8QbxXc","0ao3lKsjRK","BGaQYgIYvE","jeskSwDajX","PYBf4s7Mxk",
+"suY4xJRJQB","0MR5XUl4a1","Zv7z0AIYUu","ydG8Uix74r","U3yw5cL0aE","aez9yzmLYD","QssNCJ2mQi","vLsmSFNYIM","piJSkQ6Lix","RmDcrUmaEv",
+"sqVrfFGzgp","uJScXGv3Fq","7hyVvJKWYR","xXTI49rlg9","BCxeC24ARF","kZANmbZLvS","14FLRCK5W7","jS1ajRkQke","lXFOBbgJAz","Cp3mZ7Ow5C",
+"mz8gxYjB9t","4W0TllXFOB","CK5W7faHir","2ZHdkNAFuw","lXFOBlweGy","uJScXP6bcg","AkKTkpiJSk","9XyT92Yz7E","618Di6AFT0","O3iyQJRJQB",
+"CIShGtlILt","NcICAzz4ZU","B3qemHP433","AIYUu4W0Tl","Ss0ZurKDLJ","fFDrJ8RCUA","5IhmG2ZHdk","9XyT9WDVWJ","2TRI7nFqik","HzZT8MaJQs",
+"Yw2oUkB5nP","kB5nPWDVWJ","lpF6W4dEz6","KsjRK2ZHdk","yvOMIuZPqg","soy9tCdyBV","EOE1os7Mxk","8U2nUpv0i7","LewvMiwzGk","0ao3lNo0Qb",
+"9iGoTLDk6f","JKWYRVBjhz","5nmWvS77LH","oVQp69rlg9","s7MxkCp3mZ","iB08lJkzUn","y94nwCqqaD","QbxXc16lHc","ydG8UIKxdL","jiVBP55rfB",
+"9rlg9No0Qb","9XyT9HfyNQ","uZPqgaez9y","aez9yZhwG1","8hJdt4W0Tl","SbRYy5drc6","POUYSd85a9","lpF6W9GXkX","jS1aj29QAz","B3qempFrrl",
+"VIlwP45cIH","zbIYYFVMxo","ZJTXHG1RhS","AgJHQDz1R3","Pb1pamX2GE","ZzJHWVBjhz","s93MlX6Pin","gf8rId85a9","8FmFHCK5W7","fmIK1VIlwP",
+"gjUTueuZA5","U3yw5GSQwj","lpF6WK20wK","7lUXZTa8f6","b29RJ5VZjS","zmLYDdmoS7","6AFT0Cp3mZ","7lUXZ7ku1p","lkMUAjeskS","piJSkfcJOy",
+"taOXKfaHir","ReKEWEoToP","OxWIHJJs5m","fqypyAkKTk","2Yz7ENxx9V","gf8rI07n1c","CdyBVJKWYR","JKWYRI7p2a","ECMvUFjHXR","S2DfuUl4a1",
+"AXpwE6AFT0","gjUTutlILt","5iGN50Kyfs","rhl0JfLNg8","CqqaDS77LH","t59lR6AFT0","ydG8UGXdoH","prNT6Mm8si","OxWIH0YAGH","RpBQmFxX9q",
+"O3iyQRACuj","o8UydtlILt","MmKGJ29QAz","WDVWJksJby","6q6L9FcWrW","S2DfuL7cGc","8hJdt0Wr5y","YjB9ttaOXK","RxrsmyluBx","tAOsrvkCHH",
+"9rlg9tl72W","hE1QluTacx","fcwDaFPfSE","GSQwjhe9IA","OUYuFpmeCd","jfREuZhwG1","pWiOsL7cGc","W3VFHdQ586","ulk41Gv3Fq","gf8rIhe9IA",
+"ciuWzzz4ZU","jSjS3v2eC3","StlDJfqypy","pmeCdjtn0X","jiVBPAgJHQ","NAFuwBFkb8","S77LH2ZHdk","ix74rFjHXR","iwzGkUl4a1","VIlwPEdBKc",
+"Vprf2WreyP","0h1b1FFDui","BGaQYEoToP","wiHrZxReec","oGu6xwDajX","MGlTFksJby","tl72W618Di","4QMc9RsQUq","fcJOyfLNg8","QYxC0uAWyp",
+"faHir5IhmG","5iGN5618Di","s4786jfREu","hE1Ql9GXkX","8RCUACfgr3","uvf7AZUnqt","ydG8UxReec","Ul4a1tAOsr","K4GS8s93Ml","5iGN5ZzJHW",
+"OUqFMru4UG","SmGzvuoStw","hE1QlK20wK","v1HlnStlDJ","lXFOBM3zXL","JkzUnJ2mQi","StlDJFFDui","i7WMQLewvM","1v5hHFVMxo","he9IAd85a9",
+"qQxHPlm0pD","pmeCdOHaBz","hUTw7RmDcr","JRJQBKZamH","jeskSEoToP","14FLRe6e4z","F6PT22Yz7E","lpF6WAIYUu","uoStw8xEKz","taOXK16lHc",
+"JXljWCp3mZ","Chuy3tAOsr","zbIYY5iGN5","t98iWcmXIX","zz4ZUQClRL","5nmWv5IhmG","9y4lwh1zcH","9XyT9VNCPd","FcWrWuJScX","9GXkXfcwDa",
+"7Ow5CYw2oU","OHaBzF6PT2","uJScX2DREs","DG4sTCfgr3","F6PT2uN6r3","o8UydKZamH","Mkgy8MmKGJ","xXTI4faHir","KZamHyofH3","5Mg9rJ2mQi",
+"ksJbyzqH0W","uLtKsGSQwj","rhl0Juupzk","x3LDe7X3uy","Ss0ZuFnPFB","IjTwPtaOXK","HlUbFguMb8","wiHrZZhwG1","yvOMIfmIK1","ksJbyCp3mZ",
+"VNCPd9XyT9","jS1ajPYBf4","JRJQBCIShG","d7vjM0ao3l","DG4sT2hEEU","Rxrsm0PktI","RxrsmZv7z0","piJSky94nw","7lUXZQWxoT","hi5X7ZzJHW",
+"9XyT9i3pyd","DLhzMZ4I1v","S2Dfutl72W","Ss0ZublLA9","K4GS8HP433","pv0i7hUTw7","Oz8yZDcpWB","lH1kt9GXkX","gf8rIpv0i7","hUTw7lCMxy",
+"Chuy3ogLgc","piJSkYw2oU","hYBCKmz8gx","4QMc9y94nw","0MR5X4QMc9","iwzGkuupzk","pFrrle6e4z","KASQ8VLTy6","BFkb8uupzk","ZhwG1jtn0X",
+"Cp3mZgdQsS","oQ87rOUqFM","24ARFyofH3","n8pJ9K20wK","9eoRcuvf7A","BFkb86AFT0","F6PT2VjCZq","IRh48GSQwj","8hJdt2Yz7E","VerEAMmKGJ",
+"3weIFuLtKs","16lHcW3VFH","RpBQmuQIcz","fcwDaFVMxo","bgJAzWreyP","fqypyD6rBy","uN6r3X6Pin","NAFuwZJTXH","uPX7GMK07Y","n1pmO3otm6",
+"fqypya00b5","MaJQss7Mxk","hUTw79XyT9","WPmlxgf8rI","hUTw7MGlTF","uTacxMojnP","8xEKzFLsph","RxrsmMaJQs","StlDJbZLvS","1v5hHl83Ud",
+"ru4UGtvdkD","fLNg8Cp3mZ","9GXkXoGu6x","IjTwPhSSvQ","tl72WQClRL","blLA9uLtKs","ZhwG1tuDyS","Yh1hFxciqp","IBe8kiB08l","8FmFHjiVBP",
+"lsQGo7lUXZ","vkCHHzqH0W","dhSuH8TxD7","7ku1p2TRI7","GrDg7pWiOs","Dz1R3FjHXR","AgJHQLewvM","zQt6QvLsmS","zz4ZUn1pmO","LDk6flH1kt",
+"mz8gxSWfou","0MR5XbrhlQ","Cp3mZHzZT8","5ZaEzb29RJ","8TxD707n1c","GWqqX6q6L9","NhXduXyPZN","s478616lHc","v8yFNZv7z0","tvdkDgtCA5",
+"ZUnqtS2Dfu","NhXduCp3mZ","TwanoAgJHQ","TXQ0Z7hyVv","SmGzvzmLYD","taOXKtuDyS","IjTwPWaWsv","FnPFBKsjRK","JRJQBix74r","MmKGJzqH0W",
+"HRxd8hE1Ql","zQt6QAkKTk","OxWIH0ao3l","d7vjM7X3uy","zY1GYfaHir","s47865nmWv","55rfBjiVBP","faHirCfgr3","JIqXiYf2Ec","djsrvStlDJ",
+"S2DfuiwzGk","0MR5X9XyT9","h1zcHv8yFN","WDVWJVerEA","BCxeCuQIcz","IKxdLGWqqX","FnPFBdpe1v","Yh1hFHlUbF","uupzkQbxXc","t59lRRBhp0",
+"yToGWZUnqt","uPX7GlpF6W","gjUTuZv7z0","BbwgAEoToP","ogLgc0PktI","W7cTsSs0Zu","6AFT0QChxs","ReKEWv1Hln","nlaByLewvM","d7vjMwiHrZ",
+"8hJdtJIqXi","fmIK1zqH0W","IKxdLtuDyS","MaJQsnlaBy","618Di9eoRc","POUYSG1RhS","vLsmStlILt","HRxd8azIWp","XyPZNUl4a1","Oz8yZTCgPp",
+"vkCHHWPmlx","SjskQ7X3uy","gIYvE8cVD3","gf8rIx3LDe","WDVWJQClRL","xXTI4C2Irc","taOXKrz7Ut","EdBKclj07Q","iqv4kL7cGc","07n1cazIWp",
+"JXljWJXljW","2Yz7Em4bxU","K4GS8IKxdL","Ul4a1VerEA","M6qcG9y4lw","ZhwG1gIYvE","oGu6x2hEEU","0Wr5yZ4I1v","m4bxUpvgjS","8U2nUkB5nP",
+"kB5nPFcWrW","JkzUnFVMxo","jfREuRpBQm","s4786guMb8","QChxsEdBKc","rz7UtW7cTs","B3qemeuZA5","rKDLJqUJMd","5iGN5cmXIX","24ARF4W0Tl",
+"tl72Wt98iW","LbRTHM3zXL","dQ586ydG8U","RkQkesoy9t","Mm8siDLhzM","8FmFHJ2mQi","CNHmvQChxs","gf8rI8hJdt","aFFssnnP8o","dhSuHhE1Ql",
+"9XyT9lsQGo","P6bcgK4GS8","Yw2oUZv7z0","Chuy316lHc","Ta8f6yluBx","YOfrYaL6AJ","WmadAWMiS3","FwEJzwDajX","CNHmvAOgEe","FcWrWtl72W",
+"IjTwPU3yw5","RpBQmJ2mQi","2DREsYf2Ec","yluBxWMiS3","DG4sTDQimp","S77LHkB5nP","uQIcz8U2nU","FLsphDQimp","RACuj9rlg9","oQ87rlH1kt",
+"YjB9tPb1pa","QnJ1S0ao3l","ciuWzlViBv","Mm8siIn3NS","RACujReKEW","uupzkzz4ZU","jfREulsQGo","vLsmS2DREs","7ku1pJRJQB","hE1QlUvlv4",
+"DcpWBhSSvQ","D6rByFFDui","jeskS2DREs","JIqXis7Mxk","07n1cKZamH","0PktIFGzgp","RmDcr2hEEU","iqv4kyluBx","x3LDeHzZT8","7X3uyC2Irc",
+"l83Udhe9IA","tvdkDVBjhz","gf8rITa8f6","DLhzM0MR5X","ulk41LbRTH","Pb1paS77LH","jiVBPrhl0J","ix74rJ2mQi","L7cGcZuDtD","xciqpTa8f6",
+"ni2v11j5L8","QYxC0SjskQ","In3NSdpe1v","pWiOsdhSuH","ydG8UPYBf4","ix74rGXdoH","pvgjSF6PT2","QnJ1S8xEKz","e6e4zOHaBz","brhlQKZamH",
+"B3qemIn3NS","7ku1pRkQke","0PktINcICA","ReKEW5iGN5","RxrsmqQxHP","ni2v1Yh1hF","AXpwEDG4sT","vOqCEe6e4z","L7cGcjS1aj","Pb1paZuDtD",
+"KsjRKLewvM","ZuDtDoQ87r","EoToPLDk6f","djsrvGrDg7","a00b5wiHrZ","EOE1o2Nslm","wiHrZ7hyVv","IjTwPYw2oU","hSSvQZhwG1","0ao3lFnPFB",
+"guMb80PktI","IRh48ydG8U","qQxHPZhwG1","yvOMIeuZA5","t59lRxReec","JXljWECMvU","XyPZNl83Ud","IKxdL6q6L9","yvOMIatef2","pvgjSiwzGk",
+"iKqhrsqVrf","55rfBsoy9t","CdyBVMaJQs","Zv7z0B3qem","5Mg9rCxVEf","VNCPdni2v1","zqH0Wni2v1","ZhwG1oGu6x","pmeCdVIlwP","WmadAdmoS7",
+"Ss0ZuqQxHP","6AFT0uPX7G","2TRI78U2nU","Waim6HfyNQ","gf8rIvOqCE","kZANm8TxD7","CNHmvVerEA","jSjS3Yw2oU","suY4x0MR5X","iwzGkiwzGk",
+"J2mQia00b5","AmdQdtl72W","BCxeCcShY2","VBjhzfcwDa","7X3uyeuZA5","X6Pinrz7Ut","n1pmOfFDrJ","CdyBVfLNg8","ogLgcogLgc","pvgjSWreyP",
+"pFrrlyvOMI","CK5W7K20wK","s93Ml3otm6","FPfSE8xEKz","2ZHdkhE1Ql","Oz8yZB3qem","AOgEeAOgEe","y94nwD6rBy","OHaBzt59lR","FwEJzm4bxU",
+"07n1cQ6Lix","2DREs9XyT9","Yh1hF8TxD7","9y4lw580YD","suY4xn8pJ9","No0QbsuY4x","fcwDaUvlv4","RzaZA5IhmG","MmsIoiB08l","5Drn08U2nU",
+"Yh1hFbrhlQ","lXFOB55rfB","XyPZN7X3uy","ydG8UEoToP","IBe8kOxWIH","soy9tuQIcz","8FmFH0ao3l","pmeCdvLsmS","cmXIXqaofN","lweGyv8yFN",
+"0ao3lzHF1q","CdyBVPb1pa","UlU3MwDajX","ZuDtDZhwG1","qaofNUlU3M","GXdoHlH1kt","CdyBVeuZA5","L7cGcoVQp6","8xEKz8xEKz","VNCPdQnJ1S",
+"AOgEe2ZHdk","ciuWzh1zcH","s93MllpF6W","07n1cfFDrJ","MmsIoC2Irc","ciuWzUvlv4","iKqhrFPfSE","7ku1p8TxD7","MojnPoVQp6","TCgPpvLsmS",
+"rz7UtAXpwE","gf8rIK20wK","QWxoTYjB9t","TwanoxXTI4","kZANmmX2GE","618DiiKqhr","AkKTk5Drn0","PYBf42ZHdk","JJs5myluBx","0MR5XlsQGo",
+"IRh481v5hH","Vprf2FnPFB","5Mg9ryluBx","v8yFNMK07Y","lCMxyWaim6","580YDHzZT8","Ss0ZuZhwG1","n8pJ99GXkX","AmdQdulk41","JkzUnQbxXc",
+"fmIK1Ss0Zu","GWqqXnlaBy","azIWpulk41","djsrvbZLvS","n1pmO8TxD7","M3zXLnnP8o","DQimppvgjS","atef2rhl0J","tvdkD7Ow5C","CxVEffFDrJ",
+"Rxrsme6e4z","7ku1po8Uyd","uZPqgciuWz","BFkb8J2mQi","KASQ8lj07Q","uTacx5Mg9r","Chuy3DG4sT","BbwgAtjQxs","pFrrl618Di","0h1b1atef2",
+"2Nslm7lUXZ","G1RhShSSvQ","CK5W7iwzGk","xciqpk85Ae","S77LH0Wr5y","UlU3M48cHL","fcJOylkMUA","brhlQZv7z0","POUYSYf2Ec","b29RJxReec",
+"580YDru4UG","jeskSGXdoH","jSjS3VIlwP","IRh48fLNg8","yToGWIn3NS","AIYUuJ2mQi","uAWypOxWIH","tl72WwDajX","KsjRKFwEJz","MK07YnnP8o",
+"S2DfuCxVEf","QssNCciuWz","djsrvEdBKc","Mm8si5iGN5","JJs5mhi5X7","29QAzQ6hMC","EoToPSbRYy","v2eC3iB08l","Chuy3Cfgr3","iwzGklweGy",
+"NAFuwHP433","NhXduCNHmv","Q6hMCVerEA","7X3uyMK07Y","okgRihSSvQ","WPmlxKASQ8","L7cGc7ku1p","nlaByt59lR","HfyNQtjQxs","6AFT0U3yw5",
+"2Nslm7fsYM","BFkb8gf8rI","s93MlxXTI4","GWqqX8xEKz","iqv4k2hEEU","hi5X7BGaQY","K20wK64s8N","LbRTHG1RhS","djsrvpmeCd","LewvMHP433",
+"hE1QlOUqFM","CdyBV5drc6","qQxHPVprf2","L7cGc7lUXZ","OUqFM9GXkX","LbRTHRACuj","wDajXdQ586","gf8rINhXdu","Ss0Zu14FLR","JKWYRn8pJ9",
+"QChxsFFDui","SWfoufLNg8","SmGzvRkQke","RBhp0brhlQ","e6e4z4QMc9","QnJ1SP6bcg","5nmWvv1Hln","bZLvSRBhp0","OxWIHUvlv4","AXpwEoVQp6",
+"8hJdtJkzUn","FPfSEgjUTu","d7vjMAmdQd","UmaEvRkQke","nlaBy0Wr5y","2DREs9eoRc","5VZjSmz8gx","16lHc9y4lw","JRJQBCxVEf","ReKEW2Yz7E",
+"ulk414QMc9","VIlwPhUTw7","FPfSEm4bxU","wDajXprNT6","1LB1LlsQGo","1j5L82ZHdk","C2IrciB08l","GrDg7NhXdu","EdBKcFFDui","RBhp0K20wK",
+"aL6AJOz8yZ","HRxd8JRJQB","7Ow5CydG8U","iqv4kSWfou","VNCPdFcWrW","16lHc7lUXZ","7fsYM5Namm","8cVD3uN6r3","iwzGk8hJdt","FPfSEZv7z0",
+"DG4sT5Drn0","BCxeCsoy9t","sqVrfa00b5","QYxC0zmLYD","JIqXi4W0Tl","8xEKzB3qem","ix74r2hEEU","16lHcm4bxU","kB5nPfcwDa","IjTwPjfREu",
+"CqqaDzQt6Q","5Namm6q6L9","QnJ1SMkgy8","m4bxUY1mC0","EOE1oRzaZA","QbxXcpiJSk","uTacx64s8N","vkCHHUlU3M","iwzGkpT8wu","m4bxUksJby",
+"Nxx9VU3yw5","NcICAbZLvS","e6e4zyvOMI","CNHmvU3yw5","aDGtSFxX9q","GSQwjZzJHW","GXdoHkB5nP","QYxC0POUYS","yvOMI5Mg9r","rhl0JsqVrf",
+"K4GS8MezSW","0KyfsnnP8o","DG4sTzQt6Q","JRJQBlkMUA","m4bxUjiVBP","Mkgy8ZuDtD","Uvlv4Yf2Ec","7fKYUuoStw","yEfy9lj07Q","jtn0Xd85a9",
+"2DREsQChxs","JJs5mOUYuF","QnJ1SblLA9","CdyBVZhwG1","OUYuFPOUYS","5IhmGS77LH","rhl0JtjQxs","dmoS7dhSuH","aez9y9XyT9","WPmlxMojnP",
+"pAhR1d7vjM","5Mg9ryofH3","5Drn0BpYhV","WPmlxVIlwP","K20wKI7p2a","YOfrY1v5hH","iKqhrpv0i7","tlILtHRxd8","2TRI7vOqCE","5nmWv8xEKz",
+"ZUnqtn8pJ9","oQ87rXyPZN","prNT6Pb1pa","9XyT9zbIYY","Rxrsmlj07Q","NOHszCqqaD","29QAzSWfou","HRxd8prNT6","sx5GlECMvU","W7cTst98iW",
+"uvf7AdmoS7","5nmWvEoToP","RBhp0n1pmO","b29RJguMb8","5Drn0mX2GE","AmdQdk85Ae","iB08l9y4lw","F6PT2FLsph","EdBKcRkQke","2Yz7EYf2Ec",
+"lH1ktlViBv","iKqhrHlUbF","brhlQzHF1q","4QMc9DQimp","s93MlhUTw7","OUqFM1v5hH","FLsphRmDcr","MojnPprNT6","vLsmSfaHir","n8pJ9lsQGo",
+"Cp3mZCfgr3","5drc6YOfrY","tlILtkZANm","Cfgr3lsQGo","BCxeCcQOnv","yofH3vkCHH","qUJMdZ4I1v","fmIK10PktI","VBjhzlsQGo","W7cTs8RCUA",
+"GrDg7ix74r","KASQ8iKqhr","iqv4katef2","kB5nPNcICA","uTacx9iGoT","hi5X7LDk6f","0BmCyIRh48","X6PinFwEJz","MaJQs0Kyfs","Ta8f6VNCPd",
+"FFDuiZuDtD","jS1ajfaHir","bgJAzokgRi","rKDLJtlILt","Nxx9VguMb8","wiHrZd85a9","okgRi9GXkX","580YDQWxoT","DQimpZv7z0","2DREsHfyNQ",
+"AXpwEuJScX","ydG8UK20wK","G1RhSZJTXH","tjQxsAmdQd","taOXK1j5L8","wDajXxXTI4","e6e4zzz4ZU","Zv7z0GrDg7","2NslmcmXIX","5Drn0XflUq",
+"VIlwPmz8gx","DG4sTFhtgl","UlU3MBFkb8","hSSvQGWqqX","lsQGoYh1hF","07n1cBbwgA","VLTy6WmadA","uupzkO3iyQ","0ao3l14FLR","FLsphFVMxo",
+"6AFT0WDVWJ","ZUnqtuupzk","BFkb85Mg9r","nFqikK20wK","9iGoTMezSW","XyPZNiwzGk","faHirBFkb8","CIShGnFqik","Yh1hFMmKGJ","ZuDtDfcwDa",
+"BCxeCGXdoH","S77LHFcWrW","piJSka00b5","jS1ajyToGW","uJScXHP433","h1zcH8hJdt","v1HlnxReec","O3iyQNcICA","FxX9qhi5X7","Pb1pawDajX",
+"aez9ylm0pD","2Yz7ENcICA","pFrrlsx5Gl","0PktI9GXkX","Z4I1vPYBf4","kB5nPWreyP","2NslmCp3mZ","P6bcgs4786","lViBvqQxHP","7hyVvtl72W",
+"jS1ajGXdoH","YjB9t0Wr5y","atef2Gv3Fq","yEfy9xciqp","XyPZNgIYvE","2ZHdkMkgy8","zz4ZU3weIF","2ZHdkFnPFB","VNCPdqQxHP","atef2hSSvQ",
+"QssNC7Ow5C","Nxx9VK4GS8","k85AeKASQ8","0PktIuLtKs","7X3uy14FLR","BGaQYVNCPd","7fKYUiB08l","ogLgcCfgr3","pvgjSK20wK","ZUnqtsx5Gl",
+"pAhR1lm0pD","48cHLWDVWJ","n1pmOtaOXK","Waim68cVD3","lj07QFFDui","bZLvSa00b5","O3iyQtlILt","e6e4zrhl0J","64s8NNhXdu","O3iyQ8cVD3",
+"dmoS7AOgEe","tjQxsuoStw","o8UydJ2mQi","1v5hH2Nslm","y94nw2TRI7","FwEJzgf8rI","qaofNY1mC0","gdQsSCNHmv","2TRI7TXQ0Z","W7cTs9rlg9",
+"FhtglyToGW","pmeCdK20wK","VNCPdJXljW","BFkb8fqypy","ZhwG1618Di","0KyfsYf2Ec","8cVD3hi5X7","BpYhV3otm6","he9IARBhp0","5Mg9rJIqXi",
+"HRxd8JJs5m","uvf7AuPX7G","5IhmGQ6hMC","LDk6fMaJQs","xXTI4B3qem","FxX9qv2eC3","xXTI4Qworu","oQ87rnlaBy","lCMxyFhtgl","Zv7z0jS1aj",
+"cL0aEW7cTs","2TRI7Oz8yZ","Uvlv4Cp3mZ","uTacxG1RhS","aL6AJQnJ1S","uQIczCIShG","oGu6xbgJAz","2NslmEdBKc","KASQ8sqVrf","Twano618Di",
+"QworuVNCPd","FNYIMydG8U","EOE1o5Drn0","64s8NPYBf4","POUYScmXIX","atef2RpBQm","yEfy9h1zcH","hYBCK1j5L8","e6e4zYw2oU","FhtglSbRYy",
+"jS1ajwDajX","gjUTuHRxd8","NhXdu2ZHdk","AkKTkkZANm","24ARFWPmlx","aez9yrhl0J","JKWYRZ4I1v","1v5hHuN6r3","UmaEvFwEJz","KASQ85ZaEz",
+"L7cGctl72W","Z4I1vzbIYY","RpBQmaDGtS","QbxXcTXQ0Z","suY4xL7cGc","fqypyYw2oU","CIShGRkQke","vkCHHVLTy6","VIlwPqQxHP","uPX7G64s8N",
+"vOqCEaez9y","zz4ZUBFkb8","ThjNndjsrv","EoToPmz8gx","WreyPo8Uyd","FPfSENxx9V","QworuFFDui","pvgjS5drc6","yvOMIMkgy8","lkMUANAFuw",
+"DG4sTdmoS7","M6qcGECMvU","JXljWBFkb8","WMiS30Wr5y","Ta8f6pmeCd","kZANmo8Uyd","J2mQiChuy3","OUYuFfFDrJ","WaWsviKqhr","lpF6WYh1hF",
+"8hJdtECMvU","SjskQuvf7A","Yh1hFxXTI4","brhlQydG8U","7fsYMfFDrJ","vOqCEAIYUu","jeskSF6PT2","QChxsm4bxU","qQxHPGv3Fq","aDGtSWPmlx",
+"vLsmSgf8rI","4QMc99y4lw","QChxss7Mxk","DG4sTuupzk","zqH0WVBjhz","aL6AJKASQ8","zqH0W29QAz","jS1aj618Di","618DiRmDcr","zHF1q4QMc9",
+"bgJAzQYxC0","e6e4zfqypy","5VZjSS77LH","FPfSE3weIF","G1RhSIjTwP","K4GS8RkQke","8U2nUgdQsS","SbRYyTCgPp","7Ow5C2TRI7","lXFOBbrhlQ",
+"pAhR12TRI7","WmadAv2eC3","TwanoQWxoT","M3zXLyEfy9","7lUXZMaJQs","t59lRLewvM","nFqiksuY4x","7lUXZaFFss","pmeCdtlILt","Q6LixDQimp",
+"Z4I1vxXTI4","Rxrsmm4bxU","FVMxoe6e4z","FcWrWiqv4k","4W0TlzQt6Q","hE1QlLbRTH","n1pmOHzZT8","W7cTsPYBf4","TCgPpZuDtD","8TxD7tlILt",
+"uN6r3AOgEe","AOgEelXFOB","ogLgc24ARF","XyPZNZzJHW","1v5hHVLTy6","iqv4kzmLYD","lsQGoBGaQY","2Yz7EUl4a1","MezSWfmIK1","FGzgpiqv4k",
+"tl72W6q6L9","Chuy3IjTwP","jS1ajazIWp","Cp3mZlj07Q","KASQ8VNCPd","ZhwG1MmKGJ","BpYhVjtn0X","6AFT0Ta8f6","ZJTXHjiVBP","gdQsS0PktI",
+"D6rByVLTy6","tvdkD14FLR","5Mg9rx3LDe","aDGtSXyPZN","DQimp2ZHdk","m4bxUKsjRK","0Wr5yjeskS","7lUXZXyPZN","e6e4zs93Ml","7lUXZ8hJdt",
+"pWiOst59lR","k85Ae2ZHdk","DLhzMoGu6x","suY4xMK07Y","HlUbFiKqhr","JkzUnt59lR","uAWypd7vjM","1v5hHjeskS","t59lRW3VFH","5iGN5fcwDa",
+"580YD7fsYM","2DREsDQimp","8FmFHWaWsv","MezSWn8pJ9","KASQ8ni2v1","1v5hHKZamH","5drc6mz8gx","L7cGcfcwDa","55rfBJIqXi","TwanoqaofN",
+"0KyfsFxX9q","OUYuFD6rBy","7Ow5CksJby","VBjhzGv3Fq","TXQ0Zhe9IA","bZLvSWreyP","ZhwG1fcwDa","atef2e6e4z","7lUXZVBjhz","U3yw5lViBv",
+"Ss0ZuFVMxo","ZzJHWyluBx","guMb85ZaEz","BCxeCVjCZq","uvf7AzFgtB","5iGN5lm0pD","xXTI47Ow5C","AOgEexXTI4","piJSkAgJHQ","No0QbyvOMI",
+"ZhwG19y4lw","jSjS3dmoS7","v8yFNHfyNQ","8hJdtGWqqX","Uvlv4jtn0X","BbwgASjskQ","L7cGcZhwG1","jzUqRWmadA","VIlwPtvdkD","StlDJAkKTk",
+"WreyPru4UG","W3VFH5nmWv","PYBf4RBhp0","5iGN5iB08l","MGlTF9XyT9","SbRYypmeCd","Gv3FqJXljW","U3yw58xEKz","PYBf4Vprf2","S77LHpAhR1",
+"MK07YChuy3","2ZHdkuJScX","7X3uym4bxU","yEfy9FxX9q","ThjNniB08l","he9IApT8wu","kZANmfmIK1","BGaQYBbwgA","BGaQYRkQke","he9IAlXFOB",
+"IBe8kgf8rI","fcJOyLDk6f","VLTy65drc6","Yf2Ecv8yFN","F6PT25nmWv","h1zcHSWfou","CqqaDBGaQY","5IhmGxXTI4","hE1QlydG8U","FnPFBzqH0W",
+"MmKGJ5Namm","RmDcrYw2oU","uPX7GzqH0W","l83UdNxx9V","ECMvUpvgjS","HlUbFNAFuw","ThjNnDcpWB","bZLvSNOHsz","pFrrlQssNC","m4bxUlkMUA",
+"jzUqR07n1c","mX2GEMm8si","cmXIXlXFOB","jiVBPksJby","ECMvUv8yFN","jzUqRblLA9","KZamH0Kyfs","IjTwPQbxXc","lweGyJXljW","W7cTsjS1aj",
+"Vprf2rhl0J","h1zcH4QMc9","14FLRFjHXR","8cVD32TRI7","HzZT8StlDJ","9eoRck85Ae","618DiSjskQ","lXFOBJJs5m","gdQsSChuy3","WreyPHRxd8",
+"0h1b1n1pmO","jtn0XuJScX","FxX9qWaim6","uQIczGWqqX","HfyNQiKqhr","07n1cyvOMI","7fsYMcQOnv","LbRTHl83Ud","faHirUmaEv","MaJQscL0aE",
+"BCxeCYjB9t","QssNCNcICA","0Wr5y14FLR","ThjNnjzUqR","MezSWNxx9V","WDVWJcmXIX","aFFss5VZjS","a00b55Mg9r","ZJTXHVNCPd","lCMxyiKqhr",
+"0BmCyAgJHQ","0Wr5yIRh48","FPfSEDcpWB","5NammUvlv4","pv0i7TCgPp","16lHcGWqqX","lXFOBb29RJ","zqH0W5Namm","oVQp6o8Uyd","8xEKzMmsIo",
+"ogLgczbIYY","AOgEeKASQ8","C2IrcStlDJ","Yw2oUCfgr3","qUJMd5iGN5","yluBxyEfy9","Pb1parKDLJ","2ZHdkmz8gx","atef2QChxs","x3LDeYw2oU",
+"hSSvQThjNn","oGu6xPb1pa","yEfy9vkCHH","rhl0JsuY4x","pT8wucQOnv","okgRicL0aE","WaWsvuvf7A","6AFT0ZJTXH","TXQ0ZWDVWJ","IRh48uupzk",
+"ni2v1IjTwP","uAWypxReec","Chuy3uoStw","64s8NM3zXL","5Mg9rU3yw5","LDk6fzbIYY","Yf2EcM6qcG","2NslmUvlv4","x3LDeThjNn","F6PT2fqypy",
+"2hEEUCdyBV","618Di1j5L8","CxVEfWreyP","ZJTXHLewvM","zQt6QHzZT8","MK07Y29QAz","cShY2fLNg8","9eoRcMmKGJ","UmaEvi3pyd","OHaBzU3yw5",
+"WMiS3b29RJ","yofH3pmeCd","5NammMm8si","fmIK1atef2","ZJTXHIjTwP","GSQwjRACuj","FGzgpJIqXi","wDajXgtCA5","W3VFHvOqCE","FLsphChuy3",
+"d85a9wDajX","prNT6VNCPd","Ss0ZuNAFuw","gIYvEl83Ud","y94nw618Di","rz7UttAOsr","BFkb8Twano","brhlQxciqp","9rlg9rKDLJ","uoStw3weIF",
+"FjHXRrz7Ut","RpBQmhi5X7","CdyBVEdBKc","LbRTHjSjS3","JKWYRjSjS3","jS1ajQ6Lix","BGaQYOxWIH","7hyVv1v5hH","45cIHtjQxs","CdyBVDG4sT",
+"RzaZApWiOs","ThjNnTCgPp","ru4UG7fsYM","sqVrfnlaBy","FjHXRRkQke","QWxoTvkCHH","0h1b1xciqp","Pb1paix74r","dpe1vgdQsS","i7WMQCNHmv",
+"8RCUAFFDui","suY4xxciqp","hUTw7o8Uyd","5drc6G1RhS","Fhtgljtn0X","YOfrYY1mC0","i3pydGv3Fq","hE1Qlhe9IA","CqqaDQ6hMC","GSQwjCdyBV",
+"ZJTXHRmDcr","P6bcg2DREs","DLhzMThjNn","Ta8f6GrDg7","Cfgr3Dz1R3","zz4ZUyEfy9","uAWypni2v1","cShY27hyVv","lm0pDyvOMI","VerEAd7vjM",
+"GWqqXulk41","Chuy3TXQ0Z","uoStwO3iyQ","StlDJblLA9","pv0i7qQxHP","7ku1pUvlv4","dQ5869y4lw","WDVWJ2Nslm","zHF1qfaHir","qaofNRsQUq",
+"s93Mllj07Q","azIWphSSvQ","C2Irc0YAGH","9y4lwFGzgp","RkQkeRxrsm","JRJQBLDk6f","zQt6QJIqXi","4dEz6lpF6W","0ao3l5VZjS","b29RJaFFss",
+"lViBv8RCUA","FLsphYf2Ec","M3zXLBFkb8","MmKGJaFFss","WPmlx7ku1p","bgJAzVBjhz","VjCZqtaOXK","DQimpG1RhS","EdBKcBpYhV","TXQ0ZuJScX",
+"VBjhzy94nw","WPmlx14FLR","d7vjMkZANm","faHirX6Pin","atef2L7cGc","fLNg8FGzgp","HzZT8zY1GY","55rfBDQimp","M6qcGaFFss","l83UdS2Dfu",
+"7hyVvMGlTF","faHir0BmCy","5nmWvb29RJ","gIYvEU3yw5","dpe1vQbxXc","GrDg7xReec","W7cTsOUYuF","IRh48BpYhV","FNYIMCdyBV","x3LDeJJs5m",
+"tjQxsBFkb8","OxWIHRmDcr","blLA9uJScX","29QAzoVQp6","QnJ1So8Uyd","he9IAuN6r3","UmaEvtvdkD","PYBf4DcpWB","OxWIHpmeCd","45cIH1j5L8",
+"pWiOsjS1aj","8xEKzlpF6W","qaofNaDGtS","nlaByJkzUn","FFDuivkCHH","FxX9qix74r","2hEEUtjQxs","24ARF8U2nU","SbRYyhUTw7","Ul4a16AFT0",
+"lpF6WNOHsz","JKWYRfFDrJ","iqv4kBCxeC","hi5X7Mkgy8","xXTI45iGN5","S77LH9y4lw","ZJTXHGSQwj","zz4ZUOUqFM","Waim6rhl0J","64s8N7lUXZ",
+"UmaEv2ZHdk","zHF1qTa8f6","cQOnvlsQGo","MmsIoECMvU","lXFOB0Kyfs","45cIHSmGzv","S77LHzY1GY","ydG8Uuvf7A","0YAGHpvgjS","JJs5mlH1kt",
+"qaofNlH1kt","QworujSjS3","uvf7AMezSW","guMb8DLhzM","y94nw1LB1L","bgJAzPYBf4","7hyVv5IhmG","8RCUAP6bcg","ulk41WmadA","ksJbyvkCHH",
+"RACujlViBv","JRJQBNAFuw","d85a9Twano","7ku1pWmadA","Yf2EcKsjRK","bZLvShE1Ql","aDGtSjiVBP","AgJHQiKqhr","48cHLLDk6f","jfREuIjTwP",
+"UmaEvfFDrJ","9eoRcIn3NS","ThjNnCdyBV","Mm8siJ2mQi","AOgEe7ku1p","DcpWBzqH0W","bgJAzGXdoH","6q6L9EoToP","HRxd8gdQsS","zHF1qJJs5m",
+"JJs5m48cHL","3weIFOz8yZ","v2eC3UmaEv","ReKEWzQt6Q","QworuwiHrZ","DLhzMHfyNQ","AIYUuS77LH","SWfoujtn0X","RzaZA2Yz7E","7ku1p2ZHdk",
+"l83UdUl4a1","cShY22TRI7","W3VFHpFrrl","Rxrsms4786","55rfBFhtgl","8U2nUjzUqR","5Drn0VBjhz","atef2i7WMQ","uAWypUmaEv","ulk418TxD7",
+"lViBv5IhmG","XflUqDz1R3","48cHLsqVrf","FLsphZzJHW","JJs5m2DREs","xReecMezSW","LewvMeuZA5","uPX7GNxx9V","5ZaEzgdQsS","fFDrJQClRL",
+"cShY2L7cGc","SbRYyYf2Ec","JJs5mlXFOB","m4bxUciuWz","IRh489y4lw","taOXK5iGN5","dQ586ZJTXH","ReKEWlj07Q","rz7UtIKxdL","hi5X7he9IA",
+"lViBviqv4k","t59lRzHF1q","JJs5moQ87r","CqqaDD6rBy","4QMc9VLTy6","oGu6xEoToP","zY1GY5iGN5","HzZT81j5L8","G1RhSnlaBy","VBjhzOxWIH",
+"EdBKcZv7z0","FGzgpuZPqg","aFFssKASQ8","GrDg7ydG8U","ZUnqt7X3uy","fqypyEOE1o","X6PinB3qem","ReKEWydG8U","4QMc9zbIYY","O3iyQIRh48",
+"0PktIAkKTk","ZUnqtWaWsv","9iGoTSbRYy","0PktIyToGW","AmdQdxReec","Ss0Zu9rlg9","0Kyfsv2eC3","SbRYyIRh48","JIqXilweGy","B3qemNxx9V",
+"t59lRJRJQB","oVQp6soy9t","K20wKRsQUq","CNHmvuN6r3","a00b52Yz7E","IRh484dEz6","MGlTFbgJAz","FPfSE2hEEU","JRJQBuAWyp","o8UydU3yw5",
+"MmsIohi5X7","MaJQs9y4lw","zqH0WvOqCE","3otm6he9IA","TCgPpxReec","XflUqiKqhr","Yf2EcogLgc","uJScXh1zcH","Yh1hFQWxoT","lH1ktAIYUu",
+"l83UdzbIYY","Dz1R3SWfou","n8pJ9jiVBP","Z4I1vydG8U","UlU3Ml83Ud","ni2v16q6L9","DG4sTpiJSk","yvOMIRpBQm","7lUXZ5Mg9r","iwzGkGrDg7",
+"IRh48oVQp6","Mm8siSjskQ","64s8Nix74r","Oz8yZuQIcz","P6bcgQYxC0","HRxd848cHL","tjQxss93Ml","lsQGoFLsph","jfREuzHF1q","s93Ml7lUXZ",
+"F6PT2SjskQ","QYxC0sx5Gl","QssNCCxVEf","55rfBZzJHW","suY4xbgJAz","9eoRcHlUbF","DG4sTkB5nP","Ss0ZuDz1R3","ReKEWdmoS7","7fKYU580YD",
+"9XyT9uPX7G","45cIHcmXIX","2hEEUZJTXH","5Mg9r7lUXZ","dQ586FnPFB","hi5X7hSSvQ","8FmFH7lUXZ","n8pJ98cVD3","I7p2aI7p2a","5Mg9rsqVrf",
+"2NslmnlaBy","guMb8IRh48","WMiS3QnJ1S","TCgPpBCxeC","jfREuxciqp","Yf2Ec7lUXZ","i3pyd7fKYU","lpF6Whi5X7","MojnPulk41","9rlg9uupzk",
+"Zv7z0In3NS","Dz1R37fKYU","CxVEfuTacx","AkKTkaFFss","fqypyUlU3M","uvf7AYf2Ec","v1HlnlweGy","gtCA5AmdQd","FnPFBJJs5m","MGlTFJkzUn",
+"EOE1oMmsIo","Mkgy8jSjS3","wiHrZaFFss","BpYhVF6PT2","djsrvyvOMI","7Ow5Cgf8rI","IRh48ulk41","pFrrlEOE1o","HRxd8lsQGo","2NslmvLsmS",
+"Vprf2kZANm","jiVBPW7cTs","S77LHhE1Ql","8FmFHB3qem","taOXKjSjS3","0ao3lNOHsz","oQ87r0Kyfs","Vprf2sqVrf","QbxXcDQimp","XyPZN5VZjS",
+"dQ586aDGtS","HfyNQWMiS3","UmaEvRpBQm","pv0i7LbRTH","5iGN5VNCPd","YOfrYCNHmv","piJSkcShY2","ni2v1YOfrY","X6PinxXTI4","MaJQsRkQke",
+"zqH0WQYxC0","iqv4khSSvQ","euZA5JkzUn","6AFT014FLR","B3qem1LB1L","Dz1R3wiHrZ","aDGtS9rlg9","ZJTXHPb1pa","JJs5mU3yw5","AgJHQgdQsS",
+"zz4ZUlkMUA","iKqhrGrDg7","HRxd8CK5W7","HRxd8s93Ml","FPfSEQssNC","yToGWtl72W","RzaZAVNCPd","GrDg7VLTy6","faHirlCMxy","5Mg9ry94nw",
+"tAOsrCqqaD","PYBf4FNYIM","VNCPdnFqik","C2IrcfcJOy","1v5hHAmdQd","soy9tAkKTk","Nxx9VEoToP","0PktI29QAz","tjQxsmz8gx","bZLvSRxrsm",
+"Yw2oUNAFuw","n1pmOX6Pin","O3iyQv8yFN","lCMxyhi5X7","14FLR5nmWv","yToGW4W0Tl","euZA5wDajX","uZPqgFGzgp","XyPZNIRh48","Mm8siEOE1o",
+"lm0pDO3iyQ","POUYSD6rBy","DLhzMBbwgA","rz7UtIjTwP","ZhwG1mz8gx","uAWypn1pmO","0Wr5yn1pmO","SWfouSWfou","b29RJQnJ1S","jS1ajd85a9",
+"FnPFBFjHXR","iwzGkCp3mZ","xciqpoGu6x","BbwgAFwEJz","uoStwpAhR1","ulk41o8Uyd","BGaQYwDajX","pT8wuix74r","618Di9GXkX","sx5GlZ4I1v",
+"YOfrYNAFuw","t59lRP6bcg","t59lR48cHL","QWxoTyToGW","aL6AJlViBv","atef22Yz7E","AkKTkksJby","lm0pDxReec","dmoS74QMc9","zqH0W6q6L9",
+"SbRYyVLTy6","B3qemBFkb8","6AFT0lH1kt","soy9tJJs5m","GrDg7Pb1pa","iwzGkyToGW","7lUXZMezSW","dmoS7AIYUu","LbRTHY1mC0","FLsphiqv4k",
+"uN6r3fcwDa","2TRI7RmDcr","l83Udni2v1","lXFOBrKDLJ","v1HlnSWfou","jeskSru4UG","FPfSEtl72W","VIlwP8U2nU","JKWYRcShY2","d85a9IBe8k",
+"ciuWzDLhzM","CqqaDMK07Y","d7vjMzFgtB","6AFT0WmadA","vkCHHEoToP","Ss0ZuDLhzM","3otm6qaofN","CK5W7AOgEe","WaWsvhe9IA","Mm8siRkQke",
+"d85a90MR5X","G1RhSDG4sT","0h1b1FGzgp","F6PT2GrDg7","rz7UtF6PT2","jeskSHlUbF","WDVWJS77LH","WDVWJQ6hMC","qUJMdnFqik","zqH0WIjTwP",
+"ydG8UfcwDa","2NslmgdQsS","xciqpiKqhr","TwanolweGy","6q6L9Dz1R3","4W0Tla00b5","BGaQYksJby","kZANmyofH3","i3pyd24ARF","EOE1ojtn0X",
+"45cIHIjTwP","Waim6Oz8yZ","RACujRkQke","K20wKMojnP","oQ87r5ZaEz","0Wr5yvOqCE","RxrsmKr8ys","zbIYYThjNn","7Ow5CPOUYS","BbwgAFjHXR",
+"9y4lwgf8rI","y94nwt59lR","Kr8ysjeskS","ZhwG1MojnP","0h1b12TRI7","X6PinfLNg8","Mm8siulk41","v2eC30PktI","8xEKzru4UG","M6qcGaez9y",
+"QChxsHfyNQ","AOgEexciqp","FGzgpQ6Lix","tlILtYf2Ec","QChxs64s8N","EdBKcdmoS7","ksJbyJ2mQi","zmLYD5Drn0","IKxdLM3zXL","gtCA5mz8gx",
+"xReec7fKYU","iwzGkFnPFB","PYBf4hUTw7","y94nwaFFss","v1HlnEoToP","RsQUq3otm6","1v5hHvLsmS","D6rByb29RJ","YOfrYAkKTk","07n1cfqypy",
+"WDVWJStlDJ","ZhwG1Zv7z0","i3pydlViBv","OHaBzQnJ1S","WreyPrz7Ut","S2DfugdQsS","Ta8f6m4bxU","AXpwEfFDrJ","W7cTspWiOs","n8pJ92DREs",
+"OxWIHXflUq","qQxHP8xEKz","VNCPdFGzgp","n1pmO0MR5X","M6qcGZzJHW","Kr8ys7fsYM","wiHrZChuy3","Y1mC0GSQwj","AkKTktl72W","dQ586euZA5",
+"lj07Q1v5hH","pv0i7NhXdu","MojnPl83Ud","k85AeTa8f6","uAWypAOgEe","45cIHThjNn","TwanosqVrf","DcpWBD6rBy","ydG8UI7p2a","5VZjSsx5Gl",
+"ZzJHWiKqhr","atef2DQimp","WMiS3aDGtS","J2mQizY1GY","tjQxsF6PT2","uoStwIn3NS","580YDMK07Y","WaWsvyToGW","uLtKsZhwG1","CNHmvdQ586",
+"AkKTk5IhmG","16lHcF6PT2","yToGWfFDrJ","BFkb8uPX7G","29QAzxXTI4","SWfouNcICA","0h1b1hUTw7","sqVrfyEfy9","Pb1pa5ZaEz","5Drn0O3iyQ",
+"RkQkepT8wu","VLTy6ksJby","9GXkX8U2nU","K20wKNhXdu","aez9yYw2oU","Dz1R3jS1aj","lsQGolXFOB","FwEJzuN6r3","5NammuoStw","VBjhzkB5nP",
+"uN6r3CIShG","lH1ktzFgtB","2NslmiKqhr","hSSvQcmXIX","ni2v10Wr5y","RpBQmQYxC0","nFqikxXTI4","t59lRkZANm","Chuy3t98iW","Nxx9VCIShG",
+"aL6AJzFgtB","OUqFMoVQp6","OxWIHmX2GE","ZhwG129QAz","ZJTXHRpBQm","TXQ0Zd7vjM","gf8rI8RCUA","16lHcvOqCE","3otm6lweGy","0BmCyFjHXR",
+"UmaEvW7cTs","pWiOsWmadA","RxrsmzQt6Q","s7MxklsQGo","FVMxogtCA5","9XyT9uAWyp","pvgjSazIWp","TCgPpCIShG","pvgjSd7vjM","QClRL0ao3l",
+"rKDLJlH1kt","i7WMQ4W0Tl","bgJAzF6PT2","yluBxDcpWB","zQt6Q2Yz7E","VjCZqt59lR","zFgtB8FmFH","HP433QChxs","bZLvSGrDg7","uJScXdQ586",
+"jzUqRKZamH","FwEJzPOUYS","qQxHPyToGW","sqVrf8TxD7","MojnP9XyT9","RACujoQ87r","uoStw9XyT9","s47863otm6","5nmWvPb1pa","lweGyhe9IA",
+"55rfBpiJSk","YOfrYAXpwE","Y1mC0VerEA","hUTw7iKqhr","LbRTHTCgPp","7X3uyuJScX","DQimpDz1R3","lsQGohSSvQ","fcwDaGSQwj","WDVWJcL0aE",
+"KZamHRACuj","a00b5lH1kt","Vprf2tl72W","LDk6fSbRYy","hE1QldhSuH","t59lRhE1Ql","0ao3lazIWp","lH1ktblLA9","VjCZqwiHrZ","4W0Tl3otm6",
+"4W0TlVerEA","JIqXilj07Q","zqH0WCNHmv","KZamHZv7z0","5drc6P6bcg","aFFssuZPqg","hUTw7pWiOs","yToGWpvgjS","cQOnvJJs5m","7ku1pfaHir",
+"5Mg9r16lHc","3otm6S77LH","Mm8sibZLvS","tvdkDWDVWJ","TCgPpcShY2","Mkgy8uAWyp","W7cTsQ6Lix","tuDySK20wK","sx5GlCxVEf","v2eC3pAhR1",
+"d85a9JKWYR","5IhmGDcpWB","fcwDaTwano","Yh1hFnlaBy","8hJdtWmadA","Qworu618Di","uvf7ABGaQY","0h1b1lH1kt","TwanojfREu","lm0pDJRJQB",
+"OxWIHiqv4k","xciqpcmXIX","iqv4kFwEJz","x3LDev8yFN","tvdkDt59lR","0PktIKZamH","tjQxsNxx9V","5nmWvQ6hMC","D6rBytvdkD","IBe8kM3zXL",
+"o8UydBbwgA","F6PT2lpF6W","K4GS8jSjS3","5nmWvP6bcg","euZA5OUYuF","cL0aEC2Irc","QbxXcDLhzM","FwEJz07n1c","0MR5XLDk6f","qQxHPprNT6",
+"9iGoTNAFuw","VBjhzVBjhz","NOHszcmXIX","aDGtSbgJAz","GSQwjzQt6Q","SWfouNo0Qb","wDajXVprf2","OUqFMdQ586","faHirru4UG","uAWypRkQke",
+"zFgtBpAhR1","7lUXZ55rfB","8TxD7QbxXc","Dz1R3Fhtgl","x3LDed85a9","DLhzMFGzgp","55rfBdjsrv","7fKYUVNCPd","nFqikuQIcz","rz7UtnFqik",
+"h1zcHydG8U","yvOMIzbIYY","M6qcGXyPZN","uLtKsqUJMd","oQ87rlj07Q","hYBCKL7cGc","BCxeChe9IA","EoToPqaofN","i3pydFVMxo","WaWsvpvgjS",
+"POUYSuJScX","OxWIHprNT6","i3pydG1RhS","D6rByuTacx","tvdkDhSSvQ","FnPFBlH1kt","y94nwJKWYR","Ta8f655rfB","jtn0XZJTXH","IBe8ktaOXK",
+"prNT6NhXdu","iqv4kuTacx","o8UydpFrrl","P6bcgFPfSE","uoStwuvf7A","Mm8si3otm6","QnJ1SgjUTu","qaofN0PktI","hYBCKfcwDa","FFDuiYf2Ec",
+"64s8NChuy3","sqVrfsoy9t","gIYvEpmeCd","uPX7GbgJAz","POUYShYBCK","TCgPpLDk6f","HlUbFciuWz","IBe8kJJs5m","Uvlv4pT8wu","MojnPydG8U",
+"zQt6Q0BmCy","MmKGJkB5nP","OUqFM55rfB","8cVD3HRxd8","7Ow5CC2Irc","Yw2oUjeskS","aL6AJOxWIH","LDk6fqaofN","pmeCdCdyBV","QWxoTC2Irc",
+"ZJTXH3weIF","BbwgA5Namm","a00b5BGaQY","1v5hHQ6hMC","EOE1os93Ml","55rfBAOgEe","VNCPds7Mxk","9y4lwwiHrZ","kB5nPRkQke","Mm8siaez9y",
+"ZuDtDGSQwj","LewvMm4bxU","sqVrfuN6r3","GSQwjThjNn","fcwDaUmaEv","9GXkXlj07Q","yofH3pFrrl","yofH37lUXZ","Rxrsm7lUXZ","cQOnvlweGy",
+"okgRi16lHc","QworugjUTu","QChxsVLTy6","suY4xfcwDa","ogLgc2hEEU","3otm67lUXZ","zFgtBNAFuw","9XyT9KASQ8","gjUTucmXIX","YjB9tt59lR",
+"Yw2oUpv0i7","VNCPd8U2nU","AXpwEVBjhz","RpBQmyEfy9","Q6hMCS2Dfu","ZzJHWZuDtD","I7p2a7hyVv","gIYvEJIqXi","B3qemhSSvQ","ZuDtDK20wK",
+"MmsIoVjCZq","HzZT8xReec","he9IA0ao3l","K4GS8L7cGc","580YD29QAz","HfyNQpFrrl","QworuogLgc","BpYhV2hEEU","guMb8gIYvE","AkKTkpWiOs",
+"CK5W7FLsph","PYBf4qaofN","LewvMoQ87r","JkzUnpiJSk","MmKGJazIWp","fcJOySjskQ","v8yFNUlU3M","Ta8f6y94nw","9y4lwnFqik","jeskSy94nw",
+"EOE1oNo0Qb","qaofNKZamH","k85AeY1mC0","FVMxo9GXkX","CK5W7gtCA5","fcJOyHzZT8","8RCUAAgJHQ","dpe1v618Di","64s8NS2Dfu","M6qcGlj07Q",
+"C2IrcRzaZA","QbxXcKASQ8","RmDcrQssNC","BCxeCi7WMQ","HlUbFJIqXi","NhXduhe9IA","yluBxoVQp6","cmXIXZ4I1v","pFrrlcL0aE","I7p2axReec",
+"tlILtyofH3","qaofNvOqCE","cShY2JRJQB","lm0pDWaWsv","uupzkQworu","m4bxUD6rBy","wDajXYf2Ec","AmdQdKsjRK","FwEJz3weIF","prNT6EOE1o",
+"IKxdLd85a9","Ul4a1Yf2Ec","7fsYMmX2GE","W3VFHWPmlx","UlU3M0Kyfs","RACujVLTy6","8cVD3ogLgc","ru4UGAOgEe","Cp3mZi3pyd","FPfSEVBjhz",
+"iqv4ko8Uyd","HzZT89XyT9","AkKTk4QMc9","VNCPdfaHir","Nxx9VNOHsz","4dEz6tAOsr","RkQkezqH0W","pvgjSFnPFB","0BmCyMojnP","Vprf2HlUbF",
+"gIYvEguMb8","VerEAm4bxU","KZamHDLhzM","JkzUnZhwG1","wiHrZuPX7G","lXFOBkB5nP","XflUq16lHc","5ZaEz2ZHdk","vkCHH1v5hH","0YAGHQ6hMC",
+"ru4UGHfyNQ","BCxeCUmaEv","3weIFcmXIX","RxrsmuLtKs","brhlQBGaQY","rz7UtuTacx","1LB1LEdBKc","YOfrYCqqaD","ThjNnguMb8","lsQGoHRxd8",
+"n8pJ9uoStw","KsjRKWreyP","Gv3Fq6q6L9","rz7UtRACuj","mX2GEHlUbF","EOE1oXyPZN","hYBCKQChxs","DG4sTprNT6","rKDLJOHaBz","fcwDanlaBy",
+"iB08lpFrrl","cShY2vkCHH","bZLvShe9IA","VNCPdFLsph","K20wKqUJMd","lm0pDIn3NS","d7vjMs4786","LbRTHaFFss","jSjS3blLA9","i7WMQv1Hln",
+"48cHLJJs5m","yluBxd7vjM","lViBvi3pyd","s4786FNYIM","F6PT2C2Irc","AkKTkRmDcr","uAWypQssNC","WMiS3FGzgp","nFqikFnPFB","IBe8kGWqqX",
+"RzaZAkZANm","zbIYYVNCPd","iwzGkulk41","uN6r3ECMvU","WmadAUl4a1","uAWyppiJSk","MaJQsgjUTu","7X3uyNAFuw","8hJdtHlUbF","tl72W5VZjS",
+"RxrsmbgJAz","XflUqQChxs","D6rByIjTwP","lXFOB8hJdt","KZamHYw2oU","HP433uJScX","Cp3mZ1v5hH","U3yw5JKWYR","nnP8oRpBQm","ydG8UtaOXK",
+"2ZHdkK4GS8","xciqpzHF1q","OUYuFMmKGJ","B3qemGrDg7","zbIYYVerEA","LewvMFwEJz","uTacxCdyBV","ksJbyblLA9","iqv4kuN6r3","FVMxorKDLJ",
+"K4GS8NcICA","d85a955rfB","suY4xfcJOy","yluBxAmdQd","atef2pFrrl","ni2v1dpe1v","zz4ZUW7cTs","Ss0ZuMmsIo","0KyfsSbRYy","azIWpIn3NS",
+"oQ87rP6bcg","pvgjSJJs5m","DG4sT5ZaEz","xciqpulk41","ZzJHWThjNn","s93Ml2Nslm","s7MxkvkCHH","TXQ0ZGXdoH","AOgEezz4ZU","FcWrW2Yz7E",
+"ReKEWVIlwP","RsQUqQClRL","vLsmSs93Ml","dQ586Yh1hF","bgJAzqaofN","2ZHdkpAhR1","vkCHHuQIcz","lXFOBxXTI4","ksJbyEdBKc","Dz1R3DG4sT",
+"RBhp0gjUTu","ni2v1bZLvS","fcwDaFGzgp","MK07YyEfy9","RBhp0IRh48","uPX7GQnJ1S","vkCHHM6qcG","guMb829QAz","DQimpuLtKs","BFkb8QssNC",
+"lpF6WWPmlx","xciqpaez9y","kZANmvOqCE","lViBvuTacx","qUJMdQYxC0","MojnPJJs5m","SbRYy0Wr5y","9eoRczmLYD","MmKGJ4W0Tl","iwzGk5nmWv",
+"RACujx3LDe","D6rBysqVrf","uQIczkZANm","fcwDaRmDcr","tAOsrzbIYY","QWxoT3weIF","t98iWFFDui","TCgPpDQimp","3otm6ru4UG","v1Hln8hJdt",
+"pWiOsyEfy9","faHir9iGoT","5IhmGQbxXc","RkQke0PktI","X6PinNAFuw","8xEKzSmGzv","ogLgcTwano","QClRLYOfrY","M6qcGGXdoH","vLsmSQbxXc",
+"Q6hMCcL0aE","9y4lwZhwG1","TCgPpjzUqR","SmGzvKASQ8","BGaQYMmsIo","ksJbyVLTy6","4dEz6nlaBy","piJSkTXQ0Z","EoToPEdBKc","lH1ktsqVrf",
+"suY4xvOqCE","6q6L9OHaBz","uvf7AUvlv4","K4GS8CxVEf","Cp3mZJKWYR","BCxeCJ2mQi","zFgtBJIqXi","m4bxUCdyBV","pAhR1ru4UG","0BmCyI7p2a",
+"Nxx9VtaOXK","zz4ZUWmadA","IjTwPgdQsS","FwEJzuPX7G","WDVWJTa8f6","Oz8yZ0YAGH","oVQp6tAOsr","cmXIXiB08l","FFDuiS2Dfu","ECMvU8cVD3",
+"wDajXRACuj","FVMxoru4UG","pAhR1BpYhV","JKWYRNAFuw","vOqCElkMUA","lkMUAYf2Ec","ydG8UaFFss","oVQp6uJScX","y94nwmz8gx","Yw2oUdmoS7",
+"uN6r3JkzUn","tjQxsmX2GE","580YDpWiOs","0Wr5yPYBf4","6AFT07fsYM","QbxXcfqypy","jiVBPJJs5m","blLA9sqVrf","1LB1Ls4786","9XyT9prNT6",
+"atef2s4786","rhl0JpWiOs","RsQUq6AFT0","tAOsruoStw","POUYSm4bxU","IKxdLx3LDe","ZzJHWFjHXR","4W0TlwiHrZ","GXdoHxXTI4","5iGN5Waim6",
+"OUqFMydG8U","Twano7lUXZ","BpYhVblLA9","a00b59y4lw","EoToPK4GS8","bgJAzU3yw5","ECMvUprNT6","Nxx9VFjHXR","ulk413weIF","FcWrWuTacx",
+"0h1b1Yf2Ec","pmeCdeuZA5","Vprf27ku1p","JkzUnvOqCE","618DiTa8f6","48cHLni2v1","AIYUuVNCPd","8RCUAOUqFM","djsrvaDGtS","tjQxsFVMxo",
+"BpYhVvLsmS","L7cGck85Ae","m4bxUi7WMQ","Yh1hFSjskQ","oQ87rydG8U","5NammvkCHH","PYBf4GWqqX","JKWYRPYBf4","lXFOBpAhR1","cL0aE9XyT9",
+"zqH0W4QMc9","ZuDtDQClRL","DG4sTaez9y","RkQkeG1RhS","fcwDauZPqg","s93MlqaofN","VIlwPU3yw5","4W0Tl1j5L8","EoToPXflUq","s93MlFjHXR",
+"YjB9tJRJQB","pvgjShE1Ql","kB5nPJkzUn","AkKTk6AFT0","OxWIHaL6AJ","vLsmScmXIX","uAWypfLNg8","CK5W7jfREu","Yf2EcbrhlQ","BbwgAaL6AJ",
+"S77LHVNCPd","SWfoufaHir","fcwDa4dEz6","pFrrlgIYvE","fmIK1yEfy9","FcWrWX6Pin","hUTw74dEz6","gtCA5tjQxs","fcwDaksJby","euZA51v5hH",
+"nlaBytlILt","8U2nUdhSuH","BCxeCjS1aj","K4GS8Yf2Ec","tvdkDhUTw7","hYBCK0YAGH","QChxs4W0Tl","pmeCdni2v1","AgJHQrKDLJ","ZhwG1NcICA",
+"4W0Tl4QMc9","Dz1R3M3zXL","WmadAVprf2","n1pmOx3LDe","Chuy3zY1GY","jzUqRKr8ys","Ta8f6i7WMQ","64s8NKsjRK","HzZT84dEz6","BFkb8MezSW",
+"ru4UGtlILt","9eoRct98iW","lkMUAG1RhS","GSQwjStlDJ","9iGoTXyPZN","Chuy36AFT0","EoToPkZANm","55rfBRmDcr","kB5nPuTacx","6q6L9IKxdL",
+"XflUqD6rBy","h1zcHChuy3","M3zXLaez9y","VNCPdtvdkD","NAFuwv8yFN","jiVBPYjB9t","EOE1otAOsr","fcJOyblLA9","0PktIIn3NS","uPX7Go8Uyd",
+"VBjhz5drc6","FNYIMPb1pa","VLTy62Nslm","MGlTF3weIF","ZUnqtpWiOs","X6Pin0Wr5y","pT8wuKZamH","TXQ0ZAIYUu","0BmCyVprf2","uAWyp7Ow5C",
+"FPfSE5VZjS","F6PT2ru4UG","B3qemwDajX","blLA9t59lR","5ZaEzQssNC","64s8NO3iyQ","zQt6Q9XyT9","FnPFB5ZaEz","9GXkXpv0i7","UmaEvjtn0X",
+"Q6hMCX6Pin","jSjS3I7p2a","Cfgr3L7cGc","Ta8f6gIYvE","EoToPyofH3","ulk41FcWrW","lXFOB5ZaEz","B3qemPYBf4","TCgPp07n1c","9XyT9No0Qb",
+"6q6L9FPfSE","tjQxsazIWp","zFgtBWMiS3","SjskQQbxXc","b29RJRsQUq","jzUqRd7vjM","9XyT90Wr5y","M3zXL3otm6","MK07YBbwgA","JXljWoGu6x",
+"Cfgr3VjCZq","9eoRcQChxs","7fsYM8TxD7","xXTI4AIYUu","VBjhziwzGk","uoStwWMiS3","7X3uyZUnqt","ciuWzChuy3","hE1Qln1pmO","taOXKAXpwE",
+"JXljWChuy3","jtn0XOHaBz","oGu6xk85Ae","uPX7GU3yw5","MK07Y5Namm","uoStwJKWYR","pWiOsdpe1v","Dz1R3S2Dfu","CK5W7jeskS","dhSuHuTacx",
+"YjB9ttuDyS","J2mQi4W0Tl","Oz8yZRACuj","jiVBPFhtgl","d7vjMsx5Gl","tuDySXyPZN","Chuy3lViBv","FLsphrz7Ut","8U2nUprNT6","Q6hMCPb1pa",
+"ZuDtDlm0pD","gtCA5OUqFM","9XyT9YjB9t","JkzUn7ku1p","IjTwPZUnqt","7hyVvlm0pD","KZamHUmaEv","7Ow5C07n1c","JKWYRBbwgA","IRh48SmGzv",
+"tl72Whi5X7","G1RhSxReec","VLTy6azIWp","FxX9q1LB1L","VjCZqWmadA","5Drn0uLtKs","tlILtTwano","ni2v1n8pJ9","MezSWCqqaD","CIShGCqqaD",
+"vLsmSprNT6","2ZHdkQ6Lix","5Mg9roQ87r","KsjRKydG8U","fmIK1ReKEW","K20wK9y4lw","K4GS8hUTw7","7X3uyzHF1q","0ao3l8cVD3","sqVrfgdQsS",
+"FjHXRJKWYR","i7WMQK4GS8","K4GS89iGoT","gf8rIbrhlQ","uPX7GRxrsm","uZPqg4QMc9","rz7UtVLTy6","6AFT0P6bcg","pFrrlKr8ys","hYBCKe6e4z",
+"580YDGrDg7","lXFOByToGW","d85a98hJdt","XflUqK20wK","3weIFRzaZA","DLhzM0YAGH","dhSuHjSjS3","AOgEeCp3mZ","fcwDaDz1R3","KsjRKAkKTk",
+"0ao3l5ZaEz","bgJAzjfREu","i3pydHzZT8","0PktIWaim6","Yf2EcOz8yZ","WaWsvlH1kt","Pb1paX6Pin","rz7UtkB5nP","lm0pDpT8wu","taOXKuTacx",
+"DLhzM7X3uy","SWfou7fKYU","XyPZNJ2mQi","5Mg9rS2Dfu","UmaEvVerEA","hSSvQB3qem","s4786soy9t","qQxHPStlDJ","48cHLxXTI4","NhXdu9iGoT",
+"Gv3FqxXTI4","gdQsSqaofN","0h1b1faHir","5Nammix74r","bZLvSL7cGc","ni2v1fmIK1","fLNg8s7Mxk","FPfSEi7WMQ","vOqCEMmsIo","8RCUAIn3NS",
+"BFkb8KASQ8","XflUqIn3NS","kB5nPpWiOs","3weIFRxrsm","6AFT0jeskS","Ul4a1BbwgA","s478655rfB","OUYuF7ku1p","No0Qb9GXkX","e6e4z4W0Tl",
+"VLTy6wDajX","s4786jtn0X","zmLYDk85Ae","cShY2yluBx","5IhmG1j5L8","tAOsrwDajX","JXljW0YAGH","Uvlv4HRxd8","jeskSpAhR1","nlaBy6q6L9",
+"FcWrWs93Ml","VIlwPguMb8","Z4I1vBCxeC","KASQ8C2Irc","Waim6Qworu","n1pmOsoy9t","gf8rIvLsmS","MK07YFNYIM","8FmFHeuZA5","No0Qb5iGN5",
+"d7vjMsoy9t","Cfgr3atef2","WMiS3HzZT8","xciqpLDk6f","HlUbFI7p2a","W7cTsIBe8k","P6bcg2Nslm","DG4sTzHF1q","djsrvRACuj","StlDJhe9IA",
+"oQ87rwDajX","8FmFHsx5Gl","BCxeCFxX9q","HP433uLtKs","Chuy3Z4I1v","2hEEUIRh48","MezSWzFgtB","I7p2aFwEJz","RpBQmFPfSE","CdyBVIRh48",
+"5Nammzz4ZU","sqVrfJ2mQi","L7cGcuvf7A","P6bcguvf7A","oQ87r7Ow5C","vLsmS5Namm","pFrrlzbIYY","yluBxtlILt","AgJHQQChxs","yluBxY1mC0",
+"FLsphO3iyQ","yvOMI5nmWv","8RCUAuN6r3","tl72WjiVBP","lCMxyCIShG","jS1ajMGlTF","FVMxopWiOs","GWqqXQChxs","0MR5XYh1hF","MmKGJzFgtB",
+"48cHLOz8yZ","dhSuHGSQwj","BCxeCs4786","hSSvQzY1GY","Cp3mZO3iyQ","NAFuwuJScX","7hyVvWDVWJ","CdyBVFFDui","tjQxsKZamH","DLhzMbgJAz",
+"Cfgr3zHF1q","rz7UtYw2oU","StlDJJXljW","faHirVBjhz","RBhp0KASQ8","ydG8UBpYhV","0MR5XStlDJ","POUYSn8pJ9","580YDiwzGk","tvdkDTwano",
+"gtCA5iB08l","Oz8yZ8cVD3","hE1QllH1kt","y94nw55rfB","StlDJuZPqg","hE1QllsQGo","dpe1vRzaZA","FGzgptjQxs","W7cTsWaim6","dhSuHVIlwP",
+"ThjNn2DREs","JKWYRmz8gx","hE1Qld7vjM","zmLYDFcWrW","GrDg7taOXK","prNT6faHir","FhtglfcwDa","1j5L8BFkb8","29QAzLDk6f","YjB9tfaHir",
+"0PktIeuZA5","14FLRbrhlQ","QssNCThjNn","pFrrlbgJAz","h1zcH3otm6","Chuy3VerEA","gIYvEyEfy9","vOqCE618Di","dhSuHk85Ae","5iGN5YjB9t",
+"kZANm9eoRc","nFqikQworu","3otm6YOfrY","KASQ8UlU3M","POUYSpFrrl","QssNCfFDrJ","tlILtVjCZq","5ZaEzZzJHW","v8yFN16lHc","7X3uy4W0Tl",
+"lViBvDLhzM","Dz1R36q6L9","5iGN5Zv7z0","JXljWWaWsv","uN6r30MR5X","GXdoH5drc6","0ao3luZPqg","jfREuKsjRK","ZUnqtJ2mQi","y94nwP6bcg",
+"KsjRKQworu","Oz8yZhSSvQ","kB5nPFNYIM","aFFssnlaBy","AkKTkFnPFB","Ss0ZuU3yw5","FhtgldQ586","tvdkDFhtgl","QYxC045cIH","QbxXcSs0Zu",
+"uupzkVerEA","LbRTH5Mg9r","VjCZqVjCZq","O3iyQxXTI4","jeskSuoStw","XyPZNJkzUn","zqH0WjfREu","4QMc9JJs5m","jtn0X9XyT9","NhXdu5VZjS",
+"IRh488xEKz","m4bxUQYxC0","jtn0XX6Pin","lm0pD7hyVv","rz7UtQWxoT","5nmWv7hyVv","uupzkQYxC0","Rxrsmru4UG","Ss0ZuRACuj","dmoS7RACuj",
+"CK5W7ZzJHW","kB5nP07n1c","t98iWVjCZq","k85AeyofH3","euZA5qUJMd","JJs5mQnJ1S","16lHcJXljW","55rfBkZANm","i7WMQEoToP","KsjRKWmadA",
+"piJSkQssNC","0MR5XzbIYY","0PktI8TxD7","qQxHPVNCPd","8xEKzfFDrJ","DLhzMRzaZA","RkQkeKr8ys","JIqXifaHir","FPfSE07n1c","8TxD7hUTw7",
+"lkMUApiJSk","X6Pin8U2nU","XyPZNMmKGJ","ksJbySWfou","i3pydaez9y","Mkgy8sx5Gl","Z4I1vlweGy","16lHcnFqik","euZA58xEKz","64s8NcmXIX",
+"2DREsFxX9q","AXpwEOHaBz","AgJHQ2Nslm","yluBxpmeCd","8xEKzMaJQs","ksJbyguMb8","gtCA5FjHXR","t98iWJRJQB","GXdoHrhl0J","9eoRcF6PT2",
+"jeskSXyPZN","Y1mC0okgRi","zY1GY6q6L9","d7vjMMaJQs","t59lRogLgc","580YDFhtgl","UmaEvKsjRK","Cp3mZ618Di","nFqikuAWyp","uTacxzFgtB",
+"Chuy3WreyP","LewvMCNHmv","FwEJzWmadA","CK5W724ARF","DcpWBa00b5","No0QbRxrsm","0Kyfs3weIF","ThjNnReKEW","lH1ktLewvM","bgJAzkZANm",
+"iqv4kuJScX","yofH33weIF","In3NSS77LH","lj07QZJTXH","C2IrcQbxXc","a00b5FVMxo","0h1b1s4786","CNHmvgIYvE","TXQ0ZvLsmS","yluBxuZPqg",
+"Z4I1v2Nslm","zQt6QKr8ys","nFqikFNYIM","uN6r3lH1kt","yofH3FNYIM","wiHrZ7ku1p","okgRiaDGtS","1v5hHVerEA","ksJbypv0i7","aL6AJTwano",
+"DG4sTQ6Lix","v8yFNmz8gx","iB08lIKxdL","mX2GEuLtKs","ciuWzPYBf4","6q6L9K4GS8","LbRTHMm8si","ZhwG1iwzGk","pvgjSprNT6","CdyBV0YAGH",
+"uoStw8RCUA","Ss0ZuvkCHH","Ss0ZuQnJ1S","bZLvSgjUTu","BbwgAM6qcG","iwzGkECMvU","8hJdtX6Pin","lsQGoaez9y","bgJAzzFgtB","yvOMIJJs5m",
+"X6Pinpv0i7","IjTwP55rfB","s7MxkX6Pin","PYBf4X6Pin","VLTy6LDk6f","fLNg8lXFOB","uZPqgStlDJ","AIYUuNo0Qb","Yh1hFCp3mZ","tl72WFxX9q",
+"hi5X7UmaEv","ulk41s4786","lCMxyjfREu","B3qemMmsIo","nFqikpFrrl","nnP8oIRh48","5NammP6bcg","taOXKt98iW","wDajXQ6hMC","nnP8oWreyP",
+"U3yw5nFqik","kB5nPIBe8k","MezSWWmadA","s93MlTwano","dhSuHWPmlx","In3NScmXIX","4QMc9RzaZA","uTacxZuDtD","rKDLJQClRL","RzaZAgdQsS",
+"yEfy9bZLvS","BCxeCrKDLJ","l83UdcL0aE","8FmFHjzUqR","hE1Ql64s8N","b29RJfmIK1","1v5hHqUJMd","uN6r3ZJTXH","KsjRKuQIcz","1v5hHfqypy",
+"5ZaEzdQ586","nlaBybrhlQ","8xEKzgjUTu","cQOnvulk41","24ARF1v5hH","2DREsazIWp","2DREstjQxs","FGzgpxReec","DG4sTFwEJz","HzZT8uN6r3",
+"ogLgcCp3mZ","W7cTszY1GY","0BmCyzqH0W","BFkb8M6qcG","lViBvtlILt","WDVWJvOqCE","AOgEeQssNC","zY1GYaez9y","tlILtk85Ae","9y4lwStlDJ",
+"5ZaEz580YD","mz8gxsqVrf","GXdoH7lUXZ","EdBKc1v5hH","ReKEWHzZT8","aDGtSvOqCE","brhlQFPfSE","7X3uyb29RJ","4W0TlAOgEe","fFDrJh1zcH",
+"rKDLJGv3Fq","0BmCytl72W","s93Mld7vjM","i3pydJkzUn","FwEJzGv3Fq","1j5L8n1pmO","CdyBVFGzgp","EOE1ocQOnv","No0QbUvlv4","uPX7G8hJdt",
+"uupzk7fsYM","RkQkeuJScX","Uvlv48hJdt","jiVBPRxrsm","48cHLs4786","jzUqRuAWyp","24ARFrKDLJ","v2eC3In3NS","AkKTkMezSW","zQt6QThjNn",
+"ZuDtDbZLvS","okgRiOxWIH","s93MlQChxs","atef2nFqik","v2eC3AIYUu","uZPqgxciqp","h1zcHEdBKc","bZLvSC2Irc","o8Uyda00b5","0YAGHzqH0W",
+"Kr8ysd7vjM","cShY2n8pJ9","0BmCysqVrf","dhSuHRsQUq","TCgPpuTacx","POUYSDz1R3","jiVBPNxx9V","Cp3mZbgJAz","lj07QVBjhz","9XyT9n1pmO",
+"S77LH4QMc9","zbIYYtaOXK","BCxeC2DREs","WMiS3Pb1pa","mz8gxbrhlQ","pAhR1sx5Gl","fcJOydmoS7","KASQ84W0Tl","lpF6Wjtn0X","EoToPyEfy9",
+"S2DfuaDGtS","brhlQSs0Zu","gdQsSpWiOs","ZUnqtDLhzM","zbIYYCxVEf","8RCUAs4786","O3iyQdhSuH","ydG8UBFkb8","iB08liB08l","i7WMQlCMxy",
+"C2IrcQ6Lix","lH1ktkB5nP","ydG8URACuj","BbwgAb29RJ","BbwgA2Yz7E","MK07Yx3LDe","ksJbyl83Ud","NhXdu618Di","guMb8zbIYY","Ta8f6DcpWB",
+"580YDaez9y","W3VFHYjB9t","uvf7AX6Pin","CK5W7nnP8o","mz8gx7hyVv","VLTy6uLtKs","aDGtS5nmWv","8hJdts4786","29QAzyEfy9","HRxd8EdBKc",
+"5VZjSxReec","5iGN5i7WMQ","JRJQBNcICA","zmLYDY1mC0","D6rByFPfSE","Q6LixI7p2a","RBhp0uoStw","Q6LixuPX7G","fLNg8In3NS","ru4UGuoStw",
+"tl72WKASQ8","brhlQ8TxD7","GXdoHd7vjM","Y1mC0SjskQ","4QMc9hUTw7","cQOnvB3qem","AOgEelCMxy","yEfy95iGN5","TXQ0Zs4786","No0Qb9y4lw",
+"VerEAs7Mxk","I7p2ayvOMI","Zv7z0ZUnqt","okgRihe9IA","ogLgcG1RhS","uAWypIRh48","7Ow5C9eoRc","RsQUqVprf2","faHirh1zcH","wDajXFjHXR",
+"OUqFMlViBv","ogLgcn1pmO","d7vjMgf8rI","iB08l5Drn0","CNHmvQWxoT","IKxdLP6bcg","djsrvVerEA","XflUqpv0i7","e6e4zThjNn","yofH3uoStw",
+"Mkgy8Oz8yZ","aez9ydpe1v","xReeceuZA5","lkMUAuZPqg","uLtKs9iGoT","7lUXZJIqXi","zQt6QSs0Zu","sx5GlMGlTF","s93Mly94nw","CNHmvFjHXR",
+"9XyT9ksJby","618Dijtn0X","tAOsrgIYvE","S2Dfu2Nslm","uZPqgNcICA","Yh1hFjS1aj","Chuy3lCMxy","RzaZAG1RhS","4dEz6AkKTk","zHF1qReKEW",
+"pT8wu07n1c","LewvMyToGW","iKqhryToGW","uLtKsUl4a1","ReKEWv8yFN","KASQ8qUJMd","iB08l8cVD3","uN6r3WreyP","4dEz645cIH","lj07QCfgr3",
+"jzUqRbrhlQ","lweGyVLTy6","m4bxU9iGoT","OHaBz2Nslm","dQ586WaWsv","h1zcHyvOMI","JRJQBfaHir","JIqXiiqv4k","NOHszcShY2","t98iW07n1c",
+"VBjhzQworu","7hyVv5ZaEz","soy9tuoStw","RpBQmuJScX","Waim6J2mQi","okgRid7vjM","AmdQdQClRL","azIWpsqVrf","guMb85iGN5","0YAGHRpBQm",
+"FxX9q7lUXZ","IRh4864s8N","NAFuw7hyVv","S77LHLewvM","zbIYYQYxC0","blLA9FjHXR","SjskQSmGzv","jSjS3yluBx","iqv4kOUYuF","D6rByRmDcr",
+"7Ow5CYOfrY","JRJQBFnPFB","Q6hMCGXdoH","jeskShUTw7","uLtKsxciqp","zQt6QyToGW","No0QbZzJHW","JkzUn580YD","Kr8ysciuWz","uTacxt98iW",
+"cQOnvlj07Q","y94nw4QMc9","EdBKc9GXkX","9eoRc2TRI7","Yw2oU2DREs","uupzkVBjhz","qaofNbZLvS","O3iyQvOqCE","pvgjSRkQke","618Diiqv4k",
+"zQt6QgIYvE","y94nwguMb8","gdQsSuN6r3","Zv7z05ZaEz","FcWrW1v5hH","rhl0JS77LH","bgJAzix74r","MaJQsRxrsm","zY1GYMmsIo","Mkgy8v1Hln",
+"hi5X72Yz7E","FcWrWDLhzM","RmDcro8Uyd","zmLYDhi5X7","zHF1q0YAGH","X6PinsuY4x","dpe1vZzJHW","h1zcHCNHmv","ru4UGjS1aj","KASQ8Rxrsm",
+"wDajXjfREu","ECMvUlXFOB","MK07Y7lUXZ","zQt6QQssNC","KASQ89iGoT","TCgPpAXpwE","BGaQYzY1GY","8RCUAFhtgl","7lUXZOxWIH","sx5GljS1aj",
+"MGlTFFcWrW","K4GS8lXFOB","gdQsSMK07Y","8cVD3zmLYD","IRh48AgJHQ","fqypyM3zXL","ix74rRxrsm","VerEA0Wr5y","O3iyQh1zcH","VerEACfgr3",
+"VBjhzxReec","GXdoH2DREs","oGu6xl83Ud","CNHmvpvgjS","uTacxEdBKc","qQxHPVerEA","uN6r30Wr5y","8RCUABbwgA","Ss0Zu1v5hH","ThjNn55rfB",
+"dQ586uAWyp","OxWIHgIYvE","MmKGJWPmlx","ksJby0h1b1","lViBvuQIcz","O3iyQIn3NS","t59lRSs0Zu","mX2GEYw2oU","rKDLJQworu","rKDLJCdyBV",
+"jiVBPfcJOy","zz4ZUgf8rI","yToGWAmdQd","okgRikB5nP","0Wr5ytlILt","JkzUnBpYhV","qUJMdAkKTk","Vprf2aez9y","9y4lwEdBKc","lsQGoRACuj",
+"5drc6FcWrW","lsQGoiB08l","Mkgy8qUJMd","Q6Lix8xEKz","DcpWBs4786","cShY2uoStw","S2DfuCqqaD","zz4ZULewvM","tjQxs5Drn0","n8pJ95nmWv",
+"dmoS7WmadA","FGzgp2TRI7","P6bcglViBv","Yf2Ecv2eC3","CqqaDSWfou","d85a9gtCA5","5ZaEz55rfB","a00b5nFqik","aL6AJJIqXi","K20wKJ2mQi",
+"9iGoT1j5L8","gtCA50PktI","Oz8yZFwEJz","lH1ktgjUTu","ReKEWRsQUq","RACujFPfSE","EOE1oAXpwE","NhXduoGu6x","9y4lw0BmCy","IRh48FjHXR",
+"fcwDaSjskQ","xReecsx5Gl","iKqhr6q6L9","Oz8yZaDGtS","SjskQAXpwE","n8pJ9e6e4z","rhl0JjeskS","7lUXZ9GXkX","7hyVvjzUqR","jeskSjzUqR",
+"KASQ8TXQ0Z","Cp3mZGrDg7","hUTw7Yw2oU","uupzkCK5W7","45cIHhSSvQ","RACuj2ZHdk","IjTwP4W0Tl","M3zXLi7WMQ","2ZHdkYOfrY","BFkb8QClRL",
+"v1HlnZJTXH","lweGyyvOMI","580YD2hEEU","hE1QltuDyS","MaJQs2TRI7","v2eC3yofH3","BCxeCYh1hF","tl72WbrhlQ","tuDyS8xEKz","4dEz6vLsmS",
+"W3VFHOxWIH","OUYuFkB5nP","7fsYMGXdoH","Kr8ysd85a9","cmXIXzHF1q","pWiOsEOE1o","cL0aEv8yFN","SbRYyx3LDe","hUTw75Namm","FNYIMk85Ae",
+"mX2GE4QMc9","ZJTXHMkgy8","rhl0Jfqypy","uoStwQnJ1S","4QMc9I7p2a","U3yw5RpBQm","FFDuioQ87r","gdQsSoGu6x","GWqqX9eoRc","2NslmgIYvE",
+"CK5W7y94nw","ru4UGhUTw7","WreyPPOUYS","gIYvEvkCHH","X6PinydG8U","brhlQTwano","fqypyZ4I1v","lpF6WIjTwP","7fKYUdQ586","JIqXi07n1c",
+"mX2GE5Drn0","3otm648cHL","OUqFM2Nslm","QClRL0h1b1","a00b5dmoS7","Chuy3tl72W","HRxd8HzZT8","n1pmOpFrrl","Yw2oUo8Uyd","5ZaEzd7vjM",
+"tvdkDTa8f6","ZJTXHY1mC0","5ZaEzbgJAz","6q6L9FVMxo","AmdQd48cHL","fLNg8m4bxU","Nxx9VkZANm","EdBKciwzGk","GSQwjuupzk","d7vjMrz7Ut",
+"RpBQmlsQGo","StlDJpT8wu","Mm8si3weIF","jiVBPpiJSk","2Nslm2Yz7E","cmXIXiKqhr","RsQUqn1pmO","SWfoujfREu","KASQ8TCgPp","e6e4zdjsrv",
+"lkMUAVprf2","nnP8oMojnP","VBjhzb29RJ","QssNCS2Dfu","lj07QZhwG1","iB08lQworu","aL6AJU3yw5","piJSkWPmlx","o8Uyd14FLR","hi5X7Gv3Fq",
+"EdBKcUlU3M","6AFT0FVMxo","dhSuH8xEKz","GrDg7WMiS3","pv0i7FcWrW","IKxdLJXljW","uoStwjfREu","IjTwPlpF6W","07n1clj07Q","S77LHCIShG",
+"yvOMI8hJdt","CNHmvOHaBz","h1zcHd7vjM","B3qemWDVWJ","D6rByiKqhr","qQxHPaFFss","lCMxyGv3Fq","GSQwj4dEz6","IBe8ks93Ml","Q6hMCMaJQs",
+"0MR5XL7cGc","ni2v1jzUqR","AXpwEfqypy","HfyNQWDVWJ","1LB1L3otm6","Cp3mZpFrrl","DLhzMKASQ8","W3VFHRxrsm","DcpWBuTacx","BbwgAGXdoH",
+"5nmWvhUTw7","0BmCyXyPZN","0h1b1Fhtgl","cShY2qUJMd","CK5W7Mkgy8","MezSWjfREu","64s8NTXQ0Z","a00b59GXkX","AOgEejeskS","qUJMdOUqFM",
+"jSjS3gtCA5","uoStwpv0i7","580YDrKDLJ","PYBf4bZLvS","xReecEoToP","StlDJSbRYy","1j5L8J2mQi","EOE1oSWfou","pFrrl0Kyfs","NcICANhXdu",
+"EoToPAgJHQ","faHir0Kyfs","xReec9XyT9","7lUXZzqH0W","Oz8yZ6AFT0","5Drn0LDk6f","DQimpM6qcG","qQxHPNo0Qb","KASQ8NAFuw","uQIczFFDui",
+"5NammRsQUq","UlU3MM6qcG","GrDg7StlDJ","v2eC3nnP8o","KZamHWaim6","Yw2oUfaHir","fqypyMGlTF","D6rByjSjS3","8hJdt2DREs","SWfouGSQwj",
+"4QMc9PYBf4","CxVEfUmaEv","pWiOsUl4a1","O3iyQWaWsv","FnPFBVprf2","ECMvUZv7z0","LewvM0BmCy","fmIK148cHL","2TRI77ku1p","vOqCESmGzv",
+"FFDui7Ow5C","vkCHHMaJQs","mX2GEpiJSk","tl72WAgJHQ","dQ586K4GS8","iqv4klpF6W","2TRI7JkzUn","2hEEUtl72W","d7vjMSjskQ","uZPqgNAFuw",
+"VjCZq14FLR","O3iyQNxx9V","JkzUnNhXdu","ZuDtD8U2nU","5Mg9r1j5L8","W3VFHjeskS","t59lRDcpWB","FVMxocL0aE","LewvMpv0i7","ksJbySmGzv",
+"ksJbydhSuH","lm0pDx3LDe","XyPZNhYBCK","v2eC3sx5Gl","5VZjS64s8N","OUYuFuoStw","ogLgcUmaEv","RACujbgJAz","5iGN5okgRi","zbIYYzqH0W",
+"JKWYRo8Uyd","zFgtBwDajX","b29RJWDVWJ","Gv3FqFVMxo","HP433uZPqg","CK5W7he9IA","0YAGHSbRYy","taOXKSWfou","tl72WFLsph","S2DfuUvlv4",
+"0Kyfs14FLR","ogLgchUTw7","jeskSpWiOs","xciqp29QAz","J2mQiMm8si","CqqaDtaOXK","AmdQd1LB1L","2ZHdkC2Irc","SjskQKsjRK","2TRI7jfREu",
+"Oz8yZ64s8N","OHaBzAmdQd","pvgjSW3VFH","ZJTXHt98iW","9XyT9O3iyQ","CIShGYf2Ec","h1zcHSs0Zu","rhl0JHfyNQ","64s8NdQ586","Nxx9VNo0Qb",
+"aL6AJtjQxs","SbRYytlILt","OUYuFRBhp0","tvdkDn8pJ9","a00b5WaWsv","U3yw5GrDg7","rKDLJIBe8k","uLtKsIBe8k","fFDrJuZPqg","JkzUnQnJ1S",
+"FhtgliKqhr","RBhp0tjQxs","djsrvOxWIH","SbRYyuZPqg","vOqCEpiJSk","fmIK1mX2GE","t59lRtvdkD","GrDg7SbRYy","IRh48FGzgp","Waim6ru4UG",
+"ZhwG1JXljW","guMb8I7p2a","gIYvErKDLJ","yToGWK20wK","xXTI4iqv4k","djsrvS77LH","yluBxPYBf4","UlU3MQssNC","WreyPCIShG","Ss0Zub29RJ",
+"s93MlK4GS8","yluBxnlaBy","8FmFHaFFss","5drc6hE1Ql","soy9tb29RJ","WMiS3AmdQd","MaJQslCMxy","2TRI7ZhwG1","Gv3FqLDk6f","Waim6WaWsv",
+"2TRI7fcJOy","7X3uys7Mxk","xXTI40Wr5y","F6PT2I7p2a","8hJdtxReec","iKqhruAWyp","29QAzQnJ1S","HlUbFlpF6W","lCMxypvgjS","FxX9qiB08l",
+"jeskS7fKYU","vkCHHtjQxs","faHirBGaQY","48cHLYf2Ec","oQ87rJRJQB","TCgPp8xEKz","lCMxygtCA5","sx5Gl24ARF","i3pydydG8U","pFrrlNAFuw",
+"fmIK12Yz7E","n1pmOazIWp","5VZjSFwEJz","HRxd8yvOMI","5Mg9rMojnP","lweGyIjTwP","JKWYRtuDyS","8FmFHlj07Q","n8pJ9n1pmO","nnP8oZhwG1",
+"jeskSiwzGk","Gv3FqP6bcg","6AFT0Mkgy8","MK07YyToGW","hUTw7O3iyQ","fLNg8EOE1o","W3VFHM6qcG","aez9ydmoS7","fmIK19XyT9","BpYhV9iGoT",
+"OUqFMpT8wu","5Drn0uAWyp","prNT6jiVBP","07n1cOUqFM","VjCZqv8yFN","NcICAcQOnv","F6PT2Cp3mZ","OUYuFZhwG1","iqv4krKDLJ","XflUqatef2",
+"SmGzvyToGW","RsQUquAWyp","Cfgr37fsYM","8hJdt5Mg9r","xReeco8Uyd","fcJOyBpYhV","lm0pDStlDJ","FNYIMAgJHQ","P6bcggtCA5","yToGWpWiOs",
+"L7cGc0MR5X","9iGoT0Wr5y","t98iWs4786","Waim6i7WMQ","2Yz7Egf8rI","yEfy9DLhzM","Mm8sihe9IA","Cfgr3oQ87r","Y1mC02hEEU","Rxrsm580YD",
+"BCxeCNOHsz","HfyNQgtCA5","Y1mC0I7p2a","n1pmOjiVBP","JKWYRiB08l","RsQUqfcwDa","48cHLChuy3","QworuGSQwj","Z4I1vXflUq","07n1cuPX7G",
+"ni2v1LbRTH","rhl0JoGu6x","MojnP9y4lw","RzaZACK5W7","lViBvokgRi","MK07YVjCZq","guMb8M6qcG","G1RhSnFqik","cShY29rlg9","yofH3xXTI4",
+"tl72W5drc6","JRJQBOUYuF","JRJQBuPX7G","FnPFBzY1GY","BbwgAt59lR","pAhR14dEz6","xReecM3zXL","5IhmGsx5Gl","CNHmv7ku1p","7ku1pwiHrZ",
+"lXFOBiB08l","euZA5zY1GY","KsjRKVIlwP","aFFssjeskS","aL6AJIRh48","S2DfuEOE1o","GrDg77ku1p","B3qemThjNn","StlDJS77LH","pmeCdiKqhr",
+"fFDrJRmDcr","i7WMQkZANm","hYBCKtuDyS","oGu6xQWxoT","580YDStlDJ","x3LDe14FLR","Yh1hFjiVBP","lH1ktIKxdL","TwanoOUYuF","P6bcglsQGo",
+"2NslmPOUYS","9eoRcuTacx","Oz8yZbgJAz","uZPqgYw2oU","RsQUqQworu","djsrvChuy3","jS1ajjS1aj","CxVEfdpe1v","cmXIXChuy3","WPmlxKZamH",
+"Cp3mZpT8wu","Ul4a148cHL","lweGyLbRTH","5Drn0SWfou","uAWypDLhzM","FNYIMfcwDa","lkMUA0BmCy","lweGydjsrv","dpe1vBbwgA","NcICAOHaBz",
+"0h1b1DLhzM","GSQwjuLtKs","oQ87rgtCA5","CqqaDZzJHW","ZuDtDhi5X7","pvgjSJkzUn","IBe8kS77LH","uZPqgi7WMQ","EdBKcAIYUu","8FmFHk85Ae",
+"CqqaDhi5X7","Ul4a1h1zcH","FLsphVprf2","Ta8f6PYBf4","G1RhSK20wK","nnP8oGrDg7","2NslmFjHXR","zHF1qeuZA5","RBhp0jS1aj","fmIK1BFkb8",
+"fcwDa64s8N","64s8NuZPqg","pFrrlVBjhz","hi5X7ru4UG","FNYIMBpYhV","WreyPOHaBz","0Wr5ykB5nP","1j5L8zz4ZU","zqH0WYOfrY","ZuDtDWmadA",
+"BFkb81LB1L","OUqFM5Mg9r","2ZHdkDG4sT","OUqFM5IhmG","2NslmlkMUA","zHF1q5nmWv","OUqFMh1zcH","Yf2EcOHaBz","48cHLzY1GY","brhlQlsQGo",
+"K20wKCqqaD","oGu6x64s8N","8hJdtQ6hMC","a00b5aFFss","8hJdtd7vjM","7lUXZYh1hF","JRJQBvOqCE","he9IA7Ow5C","5ZaEzAXpwE","ix74rMm8si",
+"AmdQd8FmFH","l83Udmz8gx","VBjhz9iGoT","m4bxUFPfSE","L7cGcXflUq","piJSkI7p2a","G1RhSW7cTs","AOgEeoVQp6","5iGN5Dz1R3","oQ87rChuy3",
+"kZANmrKDLJ","14FLR0ao3l","ZuDtD7Ow5C","d7vjM5ZaEz","U3yw5jS1aj","gIYvE2TRI7","gdQsS7X3uy","qUJMdM3zXL","lH1ktB3qem","HlUbFC2Irc",
+"FcWrWYw2oU","blLA9xciqp","s7Mxk580YD","9GXkX2ZHdk","Dz1R3QYxC0","8xEKzEoToP","zbIYY7fKYU","NhXduFGzgp","KsjRKxReec","dpe1vfmIK1",
+"WmadAIn3NS","7hyVvjS1aj","OxWIHFFDui","Waim6GrDg7","aDGtSxXTI4","KsjRK1v5hH","4W0TlZJTXH","jzUqRL7cGc","GSQwjm4bxU","ZUnqt2Nslm",
+"RmDcr14FLR","pWiOsaez9y","0h1b1fcwDa","n8pJ96AFT0","JJs5mLewvM","48cHLJIqXi","S77LHuTacx","uPX7GEdBKc","s7MxkK4GS8","tuDySI7p2a",
+"OxWIHsqVrf","QnJ1SThjNn","9rlg9MojnP","1v5hHFFDui","hi5X79y4lw","Kr8yshE1Ql","J2mQiulk41","MGlTF4dEz6","No0QbBFkb8","QChxsMmKGJ",
+"t59lRi7WMQ","uvf7A24ARF","ksJby8TxD7","rz7UtpWiOs","cmXIX5Drn0","VIlwPuvf7A","piJSkQ6hMC","MGlTFuTacx","StlDJ55rfB","ZUnqtpmeCd",
+"oQ87rdQ586","LewvMTXQ0Z","mz8gxReKEW","Ss0ZuFxX9q","MaJQshYBCK","blLA9uvf7A","POUYS5Namm","tlILtCxVEf","WmadAhi5X7","ogLgcNOHsz",
+"pT8wuQ6Lix","hYBCKQnJ1S","KASQ8RsQUq","5IhmG7X3uy","uLtKsVLTy6","gdQsSydG8U","O3iyQUl4a1","euZA5lH1kt","jtn0XUl4a1","n1pmOyvOMI",
+"FLsphsuY4x","RkQkebZLvS","618Di3otm6","DQimpokgRi","OxWIHCNHmv","FFDui0Kyfs","nlaByNOHsz","ZuDtDd85a9","MaJQsJkzUn","uvf7AvOqCE",
+"CIShG55rfB","yToGW5VZjS","gjUTuyluBx","VNCPdCIShG","s7Mxk0BmCy","8cVD3WmadA","v8yFNo8Uyd","9iGoTKASQ8","Yh1hFDQimp","gdQsS5drc6",
+"WreyPfmIK1","POUYSFNYIM","JkzUn4W0Tl","v2eC3Twano","lj07QlH1kt","AOgEeqUJMd","bgJAzlXFOB","8RCUA8FmFH","FGzgpnlaBy","mz8gxFxX9q",
+"8TxD7uvf7A","8xEKzOUYuF","CK5W7MGlTF","9y4lwRBhp0","ni2v1ni2v1","oGu6x0ao3l","8xEKzi7WMQ","AkKTk0PktI","he9IAogLgc","zqH0WMGlTF",
+"07n1cHlUbF","atef2Mkgy8","618DiMK07Y","v2eC3fqypy","14FLR6AFT0","Q6hMCiqv4k","In3NS45cIH","LDk6fuN6r3","JJs5mHRxd8","bgJAzM6qcG",
+"dmoS7Z4I1v","Q6hMC2ZHdk","POUYSgtCA5","Cp3mZjiVBP","tjQxszbIYY","aez9yECMvU","uPX7GYjB9t","0MR5XOUYuF","MezSW4QMc9","zmLYDXflUq",
+"QYxC0LDk6f","rKDLJ7Ow5C","ogLgcWaim6","5iGN5lsQGo","ix74rBCxeC","QworuYOfrY","HfyNQtAOsr","lj07Qt59lR","v1HlnSmGzv","OxWIHW7cTs",
+"RkQke2DREs","I7p2a1LB1L","5NammNxx9V","oVQp6Mkgy8","Kr8ysiB08l","FGzgpO3iyQ","Yf2Ec8FmFH","8FmFH8TxD7","pWiOsMGlTF","LDk6fvkCHH",
+"i3pydThjNn","BGaQYKASQ8","yEfy95IhmG","VerEAKsjRK","FVMxoLewvM","xciqp8hJdt","2Nslmv1Hln","KASQ82Nslm","qQxHPvOqCE","5IhmGiB08l",
+"IBe8kxReec","K4GS81LB1L","s7MxkAOgEe","AgJHQAgJHQ","3weIFAOgEe","In3NSAmdQd","NhXdurz7Ut","pvgjSeuZA5","XflUqjSjS3","lm0pDWmadA",
+"MaJQsS2Dfu","QWxoTMojnP","Waim629QAz","HzZT8In3NS","s4786D6rBy","nlaBy9rlg9","2DREsQWxoT","16lHclweGy","ECMvU0PktI","Uvlv4FLsph",
+"CxVEfCdyBV","mz8gxDz1R3","8hJdt07n1c","XyPZNhUTw7","okgRizQt6Q","nnP8oF6PT2","WmadA48cHL","gtCA5ciuWz","y94nwZuDtD","CqqaDWmadA",
+"zY1GY0YAGH","mz8gxwiHrZ","POUYSWmadA","2hEEU0h1b1","5IhmGSmGzv","mz8gxgtCA5","VIlwPyofH3","MK07YLbRTH","o8UydMGlTF","ix74ra00b5",
+"ReKEWatef2","qaofNqaofN","oVQp6faHir","WPmlxCp3mZ","L7cGcbZLvS","zmLYD9GXkX","fLNg8mX2GE","uJScXuLtKs","2hEEUGXdoH","PYBf4yofH3",
+"StlDJXflUq","vkCHHOUYuF","fqypy7Ow5C","lm0pDCfgr3","FFDui55rfB","GXdoHMkgy8","v1HlncQOnv","gIYvEVprf2","zbIYYaFFss","Mkgy8KsjRK",
+"Yf2Eche9IA","AXpwEqQxHP","wDajXOUqFM","LDk6fW3VFH","G1RhSQWxoT","uZPqgOUYuF","618DiChuy3","dmoS73weIF","pvgjSiKqhr","SjskQpiJSk",
+"G1RhSM3zXL","Uvlv4U3yw5","yToGWbgJAz","IRh48QssNC","fcwDaHzZT8","VBjhzP6bcg","rhl0JIn3NS","IBe8koVQp6","Ss0ZuAkKTk","KsjRK5VZjS",
+"iqv4k5Namm","SmGzvn8pJ9","suY4x24ARF","CIShGQworu","JRJQBtvdkD","Uvlv4CK5W7","fcJOysoy9t","FhtglW3VFH","5ZaEz0Wr5y","B3qemSjskQ",
+"Gv3FqEdBKc","tlILtCdyBV","CxVEfvkCHH","nnP8oSWfou","K4GS8P6bcg","0KyfsgtCA5","ydG8UjeskS","t59lRaDGtS","zz4ZUZhwG1","9eoRc4W0Tl",
+"6AFT0uupzk","GWqqXyluBx","6q6L916lHc","vLsmSuLtKs","0BmCyeuZA5","S2Dfu8hJdt","XyPZNMK07Y","dhSuH5Drn0","ZJTXHS2Dfu","rz7Ut3otm6",
+"oQ87rY1mC0","aFFssAmdQd","i7WMQGXdoH","VNCPdCp3mZ","P6bcgB3qem","Oz8yZ0Wr5y","fLNg8i7WMQ","FwEJzxciqp","Ta8f6EOE1o","4QMc9oGu6x",
+"i3pydSWfou","VjCZqYjB9t","BFkb8aFFss","sx5Glrhl0J","FcWrWCdyBV","MojnPyluBx","zHF1qokgRi","zFgtBDQimp","OxWIHWPmlx","FhtglVprf2",
+"Oz8yZNhXdu","618Dix3LDe","AgJHQSjskQ","S77LHxReec","faHirzHF1q","I7p2aAkKTk","29QAz0YAGH","VBjhzdjsrv","C2IrcMezSW","FVMxoUvlv4",
+"fLNg8O3iyQ","6q6L9jzUqR","Ta8f6lj07Q","DcpWBwDajX","5nmWvgjUTu","IRh48pAhR1","KZamHsuY4x","Q6LixFjHXR","x3LDeCdyBV","iqv4kG1RhS",
+"iqv4kAOgEe","HlUbF48cHL","n1pmOvOqCE","Yh1hFZUnqt","8U2nUHfyNQ","zbIYYG1RhS","h1zcHpWiOs","FFDuicL0aE","aez9y5IhmG","uQIczatef2",
+"wDajXVjCZq","gf8rIjzUqR","5drc68TxD7","ciuWzHRxd8","x3LDepmeCd","5nmWviB08l","5iGN50MR5X","uvf7At98iW","5nmWvHRxd8","atef2hE1Ql",
+"GrDg7D6rBy","7Ow5CCp3mZ","azIWpm4bxU","5Namm5IhmG","MmKGJECMvU","xciqpe6e4z","i7WMQogLgc","ZzJHWKZamH","14FLRpvgjS","9y4lwYw2oU",
+"CNHmv29QAz","tlILtsx5Gl","taOXKeuZA5","618DiNo0Qb","JIqXiIRh48","Ta8f69rlg9","Uvlv4JJs5m","X6PinVNCPd","x3LDex3LDe","AOgEeOUqFM",
+"pv0i74W0Tl","faHircL0aE","NhXduI7p2a","pWiOsv8yFN","mX2GE2Yz7E","d85a9zz4ZU","7Ow5Cru4UG","7hyVv2TRI7","7ku1p45cIH","fqypyd85a9",
+"FcWrWOz8yZ","taOXKS77LH","RmDcr5IhmG","jeskS5Namm","Y1mC07ku1p","piJSk5IhmG","5iGN5QbxXc","In3NSXyPZN","QssNCOz8yZ","uPX7GWaWsv",
+"ThjNnCK5W7","ECMvUtl72W","m4bxUzmLYD","K20wKRpBQm","SjskQIKxdL","580YDmX2GE","QYxC0OUYuF","S77LHuN6r3","EdBKcL7cGc","7ku1pZzJHW",
+"fcwDaRxrsm","ZUnqthe9IA","zFgtBVerEA","FGzgpAIYUu","POUYSzqH0W","5ZaEzh1zcH","OUqFMQworu","Q6Lixx3LDe","2TRI7faHir","6AFT0dmoS7",
+"Cfgr3Cp3mZ","ru4UGTXQ0Z","Yw2oUB3qem","4W0Tl8U2nU","Gv3FqOHaBz","7hyVv8hJdt","dpe1vFwEJz","s93MlgIYvE","9GXkX7lUXZ","AkKTkJXljW",
+"ZuDtDSmGzv","0ao3lgtCA5","fmIK1gdQsS","EoToPSjskQ","5VZjSRpBQm","3weIFKZamH","8hJdt5nmWv","jSjS3RmDcr","tAOsrbZLvS","2Nslma00b5",
+"CdyBVnnP8o","D6rByrhl0J","0PktI9rlg9","uQIcz1v5hH","IjTwPpmeCd","JXljWaDGtS","7fsYMhi5X7","CxVEfm4bxU","MezSWBCxeC","soy9tQClRL",
+"M3zXLsx5Gl","J2mQilViBv","Dz1R3h1zcH","uvf7Aa00b5","aFFssRxrsm","WPmlxOUYuF","nnP8otlILt","tAOsryToGW","3weIFBbwgA","F6PT2Kr8ys",
+"sqVrf5Drn0","cQOnvfaHir","VjCZqTXQ0Z","hYBCKokgRi","h1zcHix74r","PYBf4QbxXc","DG4sT1j5L8","ogLgc5ZaEz","Y1mC02Yz7E","Yf2EcDG4sT",
+"Ss0Zu8xEKz","vOqCEZzJHW","2DREsokgRi","Ul4a1zmLYD","h1zcHjtn0X","GWqqX0Wr5y","2Yz7EdmoS7","rz7UtQnJ1S","Dz1R3qUJMd","Oz8yZVBjhz",
+"bgJAzFPfSE","JJs5mvOqCE","Cfgr3pFrrl","lXFOBNcICA","Kr8ysi3pyd","jS1ajFPfSE","yluBx4QMc9","NcICAlkMUA","dQ586QnJ1S","lXFOB1LB1L",
+"AXpwEJRJQB","5Mg9rYw2oU","ogLgcMezSW","L7cGclkMUA","zqH0WvLsmS","0h1b1aez9y","L7cGccmXIX","Zv7z0UlU3M","618DilpF6W","8cVD3FLsph",
+"pWiOssx5Gl","t98iWWaWsv","MojnPksJby","lj07QdmoS7","tuDySiqv4k","2Yz7EoQ87r","nlaBy0Kyfs","WaWsvazIWp","oQ87rb29RJ","djsrvNAFuw",
+"4dEz6U3yw5","7Ow5CEOE1o","OUqFMIRh48","W7cTsVLTy6","hSSvQTa8f6","UmaEvlj07Q","zqH0WQbxXc","Vprf2Fhtgl","BGaQY8U2nU","07n1cQworu",
+"FxX9qmX2GE","1v5hHNxx9V","WreyPl83Ud","4QMc9Twano","6q6L9XflUq","8cVD30YAGH","8xEKzReKEW","sqVrfoGu6x","fmIK1AXpwE","FjHXRBFkb8",
+"Cfgr3azIWp","IBe8k7lUXZ","vLsmSuvf7A","Zv7z0GSQwj","JJs5mAOgEe","K4GS88xEKz","IBe8kWaWsv","t59lR0Kyfs","fcJOykB5nP","UlU3MCIShG",
+"lXFOBd7vjM","ReKEWzmLYD","bZLvSxReec","G1RhSMaJQs","Mm8siS2Dfu","OUqFM4dEz6","yvOMIOxWIH","RpBQmd7vjM","guMb8ydG8U","OUYuF5ZaEz",
+"WMiS3y94nw","vOqCEIKxdL","0Wr5y580YD","14FLRYf2Ec","LbRTHtjQxs","QnJ1SlweGy","pv0i7FxX9q","8TxD7tvdkD","ulk41WPmlx","MaJQstAOsr",
+"RxrsmIBe8k","CxVEfjzUqR","TCgPpksJby","7lUXZS2Dfu","OHaBzxReec","yEfy9pmeCd","ciuWzyluBx","ThjNn0MR5X","JkzUnFPfSE","TCgPpCfgr3",
+"7Ow5ClViBv","0ao3lTXQ0Z","LbRTHuupzk","G1RhSksJby","TwanoM6qcG","0ao3liwzGk","2DREsaez9y","oVQp6euZA5","UmaEvZUnqt","YOfrY2ZHdk",
+"okgRiulk41","nlaByzmLYD","IKxdLqUJMd","FnPFBk85Ae","TCgPpZv7z0","azIWppmeCd","vkCHH9iGoT","zqH0WKsjRK","0h1b1fmIK1","qQxHP5Mg9r",
+"4dEz6qaofN","pmeCdpAhR1","uoStwW3VFH","aez9y618Di","lsQGoL7cGc","vkCHHn1pmO","JRJQBxXTI4","4dEz6LewvM","EOE1oVNCPd","nFqiksx5Gl",
+"BFkb8WmadA","7ku1pjfREu","Zv7z03otm6","9XyT9AOgEe","P6bcgsuY4x","RsQUqF6PT2","5Mg9rM3zXL","fcwDaRkQke","tvdkDFcWrW","5iGN5ulk41",
+"9iGoT55rfB","uQIczCdyBV","x3LDeZhwG1","oQ87ruAWyp","ReKEWS77LH","lH1ktgf8rI","Dz1R3FVMxo","gjUTunlaBy","EdBKc9eoRc","pvgjSEdBKc",
+"Pb1pacShY2","Q6hMCY1mC0","fcwDa7Ow5C","v2eC3fcJOy","wiHrZ2Nslm","2ZHdkbgJAz","n8pJ9ix74r","EdBKcUmaEv","fqypyzQt6Q","jS1ajBGaQY",
+"2ZHdkFFDui","uAWypQChxs","HRxd8Twano","yvOMIyofH3","v8yFNBpYhV","kZANmt59lR","VjCZqW7cTs","JIqXiEOE1o","MezSWU3yw5","lsQGoRxrsm",
+"FwEJzKZamH","RkQkeQWxoT","RsQUqsoy9t","zHF1qqaofN","29QAzfLNg8","KsjRKEdBKc","7X3uyO3iyQ","SmGzv9eoRc","580YDzHF1q","OxWIHTCgPp",
+"jS1ajhSSvQ","8U2nU5ZaEz","Q6hMCt98iW","ZuDtDEdBKc","prNT6SmGzv","SWfouLbRTH","7lUXZ0YAGH","U3yw5zHF1q","4QMc9OUYuF","FPfSEuJScX",
+"AkKTkUmaEv","WaWsv5VZjS","0PktIoVQp6","blLA9RzaZA","s93MlVIlwP","ZuDtDuTacx","n1pmODG4sT","gtCA5C2Irc","ZhwG1XflUq","wiHrZNhXdu",
+"5iGN5AIYUu","0KyfsCqqaD","ThjNnk85Ae","gdQsSQClRL","AgJHQ0Wr5y","5ZaEz64s8N","FxX9qs93Ml","lH1ktYOfrY","zqH0WjiVBP","cShY2y94nw",
+"ZJTXHCIShG","kB5nPzQt6Q","NAFuwRkQke","aL6AJCNHmv","rKDLJNo0Qb","n8pJ9jfREu","uTacxfmIK1","HfyNQcL0aE","VIlwP2DREs","4W0TlrKDLJ",
+"sqVrfHP433","azIWpRmDcr","7fKYUxciqp","lH1ktAmdQd","Oz8yZciuWz","JJs5mWMiS3","NhXdutl72W","RxrsmZuDtD","bgJAzuAWyp","pAhR1POUYS",
+"SmGzvFFDui","BbwgAoVQp6","RzaZAd85a9","JkzUn4dEz6","5VZjSGv3Fq","qaofN55rfB","IjTwPb29RJ","5nmWvjfREu","mX2GEmX2GE","JIqXiZuDtD",
+"VerEAjtn0X","vLsmSHRxd8","iB08lS2Dfu","pvgjSogLgc","4W0Tl9y4lw","Oz8yZTXQ0Z","AkKTkFcWrW","s4786HfyNQ","pvgjSHlUbF","FwEJzFPfSE",
+"v8yFN6AFT0","zbIYYP6bcg","7lUXZuPX7G","MK07YdQ586","gIYvEF6PT2","3weIFpiJSk","O3iyQcmXIX","aFFssaDGtS","580YDl83Ud","9GXkXyEfy9",
+"uN6r3iqv4k","RmDcrS77LH","s93MlfFDrJ","QClRLGWqqX","J2mQini2v1","GWqqXWMiS3","NAFuwsoy9t","0MR5XWPmlx","o8UydrKDLJ","xXTI4POUYS",
+"fcJOyyToGW","qQxHPCdyBV","FFDui64s8N","yofH31LB1L","SmGzvVjCZq","NAFuw07n1c","v1Hlnxciqp","JIqXiFFDui","AmdQdCp3mZ","CIShGdQ586",
+"RkQkeYOfrY","UmaEv8TxD7","Z4I1vGSQwj","ECMvUGSQwj","IRh489iGoT","uTacxZhwG1","7hyVv7hyVv","16lHcd85a9","uN6r3RACuj","AOgEelkMUA",
+"2ZHdk9y4lw","I7p2aazIWp","t59lR5Drn0","FVMxoBbwgA","MK07YciuWz","Oz8yZ8FmFH","kB5nPZUnqt","9iGoTZUnqt","pWiOsuvf7A","pv0i7MojnP",
+"BCxeCtuDyS","DcpWB5Drn0","TCgPpMezSW","dQ586sx5Gl","QClRLHRxd8","HzZT88TxD7","a00b52DREs","9y4lwru4UG","580YDhe9IA","0h1b1Oz8yZ",
+"Dz1R3hSSvQ","MaJQscQOnv","FnPFB0ao3l","s4786fcJOy","48cHLokgRi","1j5L8ksJby","ZUnqtZzJHW","cmXIXWaim6","Waim6fLNg8","UmaEvatef2",
+"MGlTFI7p2a","v2eC3aL6AJ","J2mQitAOsr","lCMxy618Di","uupzkFFDui","zY1GYS77LH","P6bcgZhwG1","bZLvSUl4a1","d7vjM0Wr5y","lweGyvkCHH",
+"FNYIMJIqXi","5VZjSokgRi","gf8rILDk6f","sqVrfrz7Ut","aDGtSuLtKs","MezSWJ2mQi","rKDLJVerEA","he9IA24ARF","blLA9d85a9","ZzJHW7fsYM",
+"Nxx9VMkgy8","ydG8UzQt6Q","M3zXLe6e4z","uJScXTXQ0Z","WreyPReKEW","9rlg9RmDcr","s4786AkKTk","4QMc9d7vjM","MGlTFJXljW","sx5GlDz1R3",
+"tjQxs5Mg9r","guMb8tl72W","PYBf4aL6AJ","3weIFGXdoH","s93MlC2Irc","hi5X7MK07Y","Ta8f6AIYUu","XyPZNM6qcG","6AFT0zY1GY","EOE1ov8yFN",
+"pFrrlx3LDe","In3NSCK5W7","2Yz7EThjNn","7Ow5CRzaZA","OxWIHcmXIX","580YDcShY2","AOgEev2eC3","m4bxU0ao3l","HfyNQ29QAz","JkzUnDcpWB",
+"gtCA5CqqaD","6AFT0yToGW","ix74rCdyBV","yToGWx3LDe","2NslmaFFss","O3iyQt98iW","64s8NfmIK1","9y4lwyToGW","64s8NK20wK","oQ87rfLNg8",
+"FcWrW0PktI","n8pJ9lpF6W","UlU3M8TxD7","5Drn0tlILt","kZANmgtCA5","FwEJzoGu6x","JkzUnRpBQm","24ARFtl72W","cShY28cVD3","SWfouzqH0W",
+"wDajX3weIF","RkQke8hJdt","DcpWBWaim6","X6PinbZLvS","jeskSaFFss","6AFT0bZLvS","yluBxDG4sT","2hEEUuTacx","RpBQmguMb8","Yw2oUaez9y",
+"RmDcrhYBCK","4QMc9NAFuw","cQOnvW3VFH","ni2v1v1Hln","OUYuFhe9IA","AIYUuLewvM","t98iWEdBKc","rz7UtlweGy","hE1QlAkKTk","7fKYUO3iyQ",
+"AXpwE07n1c","FLsphhe9IA","NOHszsuY4x","Waim6XflUq","JRJQBuTacx","he9IAnnP8o","zmLYDvLsmS","F6PT2CqqaD","U3yw55Drn0","CqqaDTXQ0Z",
+"ydG8UhSSvQ","Yf2Ecjtn0X","ThjNn5Mg9r","xReecrz7Ut","prNT6OHaBz","h1zcHi3pyd","2Yz7EIKxdL","yluBx5VZjS","K20wKix74r","nFqikksJby",
+"0BmCyCNHmv","XflUqSjskQ","cmXIXhUTw7","jtn0XWaWsv","YjB9tFLsph","HfyNQIKxdL","AIYUue6e4z","24ARF0ao3l","W7cTsjiVBP","4dEz6ciuWz",
+"KASQ8618Di","CK5W7cShY2","RsQUqyluBx","Vprf2Cfgr3","FPfSEpFrrl","P6bcgnlaBy","VIlwPy94nw","uJScXcShY2","hSSvQfaHir","d7vjMa00b5",
+"Ul4a1s7Mxk","JXljWtAOsr","ix74rXyPZN","MmsIohSSvQ","5iGN5JkzUn","Ta8f6rKDLJ","AXpwEMm8si","XyPZNfqypy","uZPqg5Namm","vLsmS5IhmG",
+"mX2GEVerEA","AgJHQ1LB1L","5Namm29QAz","CxVEfWMiS3","azIWpLbRTH","ZuDtDFjHXR","Z4I1vZuDtD","pv0i7n1pmO","14FLRGSQwj","Cfgr38xEKz",
+"n1pmOzHF1q","wDajX9y4lw","s7MxkNOHsz","W7cTstjQxs","MezSWUl4a1","yvOMI7hyVv","MojnPW7cTs","Rxrsmaez9y","cQOnvpWiOs","TwanoStlDJ",
+"WmadAqQxHP","Cp3mZdmoS7","VjCZqgtCA5","ZuDtDZ4I1v","lweGy5Namm","zqH0WIRh48","fqypyWMiS3","AmdQd5VZjS","4dEz6VjCZq","dpe1vh1zcH",
+"Mm8sisuY4x","oVQp68TxD7","LbRTHWreyP","Ss0ZutjQxs","uoStwzz4ZU","WreyPFGzgp","8TxD7Ss0Zu","ZuDtD07n1c","s7MxkUlU3M","NAFuw8cVD3",
+"Ss0Zu3weIF","Mkgy80ao3l","ZzJHWF6PT2","FPfSExReec","JIqXitAOsr","In3NSwDajX","Mm8sicL0aE","ni2v1JRJQB","bZLvSyEfy9","hE1Ql2Nslm",
+"RkQke55rfB","FjHXRwDajX","X6Pinn8pJ9","lm0pD6AFT0","ZUnqtIRh48","DG4sTqUJMd","pv0i7DLhzM","HzZT85nmWv","5NammQ6Lix","v1HlnRkQke",
+"cQOnvuTacx","zz4ZUW3VFH","MezSWv8yFN","8cVD32ZHdk","ZuDtDHlUbF","8xEKzdmoS7","i3pydCxVEf","s4786h1zcH","dQ586CK5W7","uvf7AWaim6",
+"zY1GYWDVWJ","ECMvU4dEz6","tjQxsZ4I1v","VBjhznFqik","cShY2tAOsr","8RCUAGSQwj","h1zcHsqVrf","v1HlnUmaEv","IBe8kMezSW","rz7UtZuDtD",
+"BFkb8SjskQ","e6e4zKsjRK","9eoRcTa8f6","7ku1pix74r","Mkgy8IjTwP","qUJMd8FmFH","VNCPdrKDLJ","TCgPp5IhmG","Cp3mZ5VZjS","yToGW8FmFH",
+"e6e4zSs0Zu","Fhtgl2TRI7","XflUq0MR5X","pvgjS6AFT0","LewvML7cGc","MojnPChuy3","07n1cGrDg7","oQ87rFwEJz","rz7UtbrhlQ","nlaByfFDrJ",
+"9GXkXHRxd8","AkKTko8Uyd","WPmlxulk41","m4bxUfcJOy","xciqp7lUXZ","5Drn03otm6","0Wr5yLewvM","0Wr5yuQIcz","dQ586pv0i7","M6qcGbrhlQ",
+"QbxXcgjUTu","OUqFMNxx9V","zHF1qjiVBP","7X3uyiB08l","aFFss9rlg9","kZANmDz1R3","9y4lwtAOsr","MGlTFDLhzM","uvf7Agf8rI","MaJQsM3zXL",
+"K20wKBGaQY","SWfoui7WMQ","x3LDe2TRI7","d85a9B3qem","FcWrW9iGoT","D6rByOHaBz","YOfrYpvgjS","3otm6sx5Gl","OUYuFv2eC3","y94nwL7cGc",
+"QssNCMGlTF","2Yz7E5nmWv","Q6hMChYBCK","OUqFMB3qem","uLtKsReKEW","jfREu5Mg9r","NcICA0Kyfs","J2mQiQbxXc","uLtKspFrrl","pvgjSYOfrY",
+"RBhp07fKYU","dmoS75drc6","HzZT84QMc9","pAhR1U3yw5","4dEz68FmFH","qUJMdGv3Fq","vkCHHyvOMI","d7vjM7Ow5C","S77LHatef2","OxWIHFxX9q",
+"IKxdLWmadA","taOXKyluBx","mX2GEsx5Gl","JKWYRuupzk","ix74rhE1Ql","suY4xK4GS8","sx5GlcL0aE","mz8gx48cHL","CxVEfW7cTs","RkQkes4786",
+"Ul4a1WreyP","S77LHGSQwj","ni2v1s7Mxk","K4GS8NAFuw","0h1b1OUYuF","Ss0ZuFjHXR","ECMvU5Namm","ReKEWFxX9q","LDk6fDG4sT","FnPFByToGW",
+"soy9tUvlv4","VLTy6Cfgr3","EOE1oyluBx","LewvM9eoRc","brhlQDz1R3","Ta8f6HfyNQ","cmXIXY1mC0","5Drn0AkKTk","JIqXiMGlTF","9GXkXi3pyd",
+"HlUbFFxX9q","9GXkXVBjhz","oGu6xY1mC0","G1RhSpFrrl","FPfSEECMvU","EdBKcfLNg8","tAOsrYjB9t","mz8gx0PktI","HlUbFUlU3M","PYBf4iB08l",
+"rKDLJGrDg7","GXdoHDz1R3","uPX7GM3zXL","5ZaEzUmaEv","Kr8ysAOgEe","tuDySGSQwj","KZamH5ZaEz","TXQ0Za00b5","QWxoTyEfy9","jS1aj45cIH",
+"uTacxblLA9","oVQp60PktI","7fKYUfaHir","Yf2Ec14FLR","tl72WqQxHP","WmadAtlILt","GXdoHa00b5","guMb8JJs5m","3weIF580YD","hE1QlhYBCK",
+"pv0i7FFDui","6q6L9NAFuw","7X3uyOz8yZ","GrDg7s93Ml","CqqaDfcJOy","n8pJ9x3LDe","WMiS32Yz7E","rKDLJUl4a1","brhlQJXljW","hi5X7sx5Gl",
+"JRJQBQnJ1S","8cVD3jeskS","F6PT2zFgtB","07n1cNhXdu","0MR5XTwano","1LB1L5VZjS","IBe8klsQGo","BFkb8jfREu","RACujCNHmv","sx5GloGu6x",
+"m4bxUqUJMd","DcpWBRmDcr","TCgPpFPfSE","YOfrYfcJOy","UmaEvVjCZq","M6qcGpT8wu","pAhR1v8yFN","BbwgAAkKTk","OxWIHd85a9","b29RJmX2GE",
+"yofH3taOXK","AmdQdNo0Qb","oVQp6i7WMQ","dQ586ix74r","rz7UtVerEA","i3pyd9y4lw","lpF6WSWfou","ix74rRzaZA","8hJdttlILt","07n1cDz1R3",
+"JJs5msoy9t","FwEJzVLTy6","uAWypCNHmv","s93MlpT8wu","blLA9Ss0Zu","vLsmSd7vjM","M6qcGciuWz","NAFuwpFrrl","dpe1vF6PT2","s93MlvkCHH",
+"v1HlnKZamH","7fsYMOxWIH","0Wr5ySbRYy","h1zcH2Yz7E","pWiOsnFqik","aez9y5nmWv","d7vjM2DREs","Pb1pazbIYY","64s8N5Mg9r","5NammZ4I1v",
+"Vprf2k85Ae","MmsIo8FmFH","bgJAzNo0Qb","FGzgpcmXIX","e6e4zzY1GY","618DiXflUq","Fhtgl580YD","pmeCdfaHir","yvOMIG1RhS","QYxC0pAhR1",
+"48cHLtuDyS","lXFOBuvf7A","EOE1oL7cGc","2ZHdkKZamH","n1pmO6q6L9","uAWypAkKTk","BGaQYwiHrZ","uTacxNOHsz","RpBQmsx5Gl","VBjhzhE1Ql",
+"atef2iB08l","FVMxotl72W","ydG8U7lUXZ","5nmWvWaWsv","he9IABpYhV","h1zcHIKxdL","jzUqRazIWp","cQOnvKASQ8","lH1ktUl4a1","d85a9SWfou",
+"AOgEeGSQwj","POUYSTa8f6","TXQ0ZCqqaD","QChxs3otm6","azIWp8cVD3","3otm6aL6AJ","TXQ0ZPb1pa","rz7UtKASQ8","QssNCgtCA5","he9IALDk6f",
+"pFrrllCMxy","m4bxU8cVD3","2hEEUB3qem","U3yw5WreyP","iqv4ksuY4x","FxX9qlsQGo","oGu6x5Mg9r","ReKEWStlDJ","lm0pDJKWYR","GXdoHFjHXR",
+"SWfou0Kyfs","wDajXP6bcg","OUqFMFPfSE","wDajX6AFT0","24ARFd7vjM","WDVWJCxVEf","Y1mC0e6e4z","B3qem9XyT9","nFqikVjCZq","2NslmDQimp",
+"bZLvSQ6hMC","ZuDtDNAFuw","JJs5mqQxHP","gf8rIQWxoT","5IhmG07n1c","Fhtgl55rfB","e6e4zX6Pin","IRh48wDajX","oQ87rK4GS8","7ku1ps7Mxk",
+"uJScXcmXIX","HzZT8dQ586","SjskQydG8U","5iGN5guMb8","9iGoTyofH3","4W0TlMGlTF","WaWsvS77LH","DcpWBuPX7G","UmaEvuLtKs","NOHszlCMxy",
+"uupzk9eoRc","AmdQdNhXdu","aez9ytuDyS","ThjNnt59lR","zHF1qblLA9","ZzJHWBFkb8","Ul4a1RmDcr","a00b5In3NS","QworuDQimp","HRxd8tvdkD",
+"7hyVvNOHsz","EdBKctaOXK","rz7UtECMvU","y94nwhe9IA","HlUbFFPfSE","MK07YuTacx","guMb8tvdkD","AOgEei7WMQ","9y4lwZ4I1v","WreyPGSQwj",
+"9rlg9HRxd8","AmdQdWPmlx","lweGyYjB9t","QClRLDz1R3","uTacxRACuj","FGzgpLbRTH","4dEz616lHc","DLhzMFhtgl","pFrrlVprf2","tuDySqQxHP",
+"OxWIH7hyVv","aDGtSIBe8k","Mm8siFVMxo","QnJ1Sfqypy","GWqqXFcWrW","7lUXZ1v5hH","I7p2asx5Gl","lkMUAuupzk","ZuDtDNxx9V","JJs5mMm8si",
+"pvgjSFwEJz","zHF1qUl4a1","m4bxUJRJQB","MaJQsoQ87r","5Namm8TxD7","CqqaDIRh48","zFgtBtaOXK","6q6L9Nxx9V","lj07QsuY4x","rKDLJFGzgp",
+"okgRiru4UG","5nmWveuZA5","MmsIorKDLJ","suY4x8xEKz","RsQUqjSjS3","K4GS86AFT0","Waim6BbwgA","QnJ1ShYBCK","RpBQm2Yz7E","6q6L9s7Mxk",
+"XyPZNeuZA5","i3pyd1LB1L","YOfrYSs0Zu","1j5L8kB5nP","JXljW2ZHdk","0Wr5yfLNg8","QChxsbZLvS","8FmFHVprf2","BGaQYDLhzM","ThjNntjQxs",
+"618DihE1Ql","yToGWNOHsz","9GXkXS2Dfu","2Yz7ECqqaD","gIYvEK20wK","d7vjMhYBCK","jfREuDcpWB","VLTy6CqqaD","k85Ae8RCUA","vLsmS5Drn0",
+"BbwgAcmXIX","9rlg9hi5X7","WPmlxWDVWJ","HP433yluBx","y94nwDG4sT","3otm6GSQwj","OUqFM7Ow5C","ix74rDQimp","FNYIMEoToP","MmsIoK20wK",
+"8TxD7djsrv","FhtgllsQGo","pv0i7Rxrsm","ECMvUPb1pa","jS1ajiqv4k","Y1mC03otm6","xReec2DREs","RxrsmuJScX","DQimpzHF1q","X6PinAOgEe",
+"3weIFtvdkD","vLsmSazIWp","RkQkeEoToP","9eoRc8TxD7","5IhmGUmaEv","OxWIHguMb8","SWfouQbxXc","v2eC3cL0aE","VerEA2Yz7E","8U2nUtuDyS",
+"VjCZqMmKGJ","Q6hMCIRh48","fFDrJCfgr3","7fKYUJRJQB","JkzUnZv7z0","hi5X7RmDcr","RACujtuDyS","No0QbCIShG","Ul4a1gIYvE","Z4I1vgf8rI",
+"CqqaDXyPZN","QssNCjS1aj","fLNg8okgRi","JRJQBQworu","iwzGkd85a9","580YD8cVD3","In3NSyofH3","Cfgr3GXdoH","XflUquQIcz","7Ow5CpFrrl",
+"v2eC38RCUA","dhSuH2hEEU","rz7UtIn3NS","VerEAv2eC3","0YAGH4W0Tl","tl72WyToGW","pAhR1Ul4a1","xciqpi7WMQ","Y1mC0QWxoT","IKxdLjSjS3",
+"Ss0ZuuLtKs","Uvlv4XyPZN","gjUTuhe9IA","Q6hMCtaOXK","sx5GlpiJSk","okgRiNcICA","WMiS3Yw2oU","zFgtB1j5L8","lpF6WmX2GE","fLNg8P6bcg",
+"fcwDa9y4lw","618Dihi5X7","e6e4zTa8f6","uPX7GlXFOB","vkCHHoVQp6","DLhzMXflUq","F6PT2M6qcG","brhlQmz8gx","dQ586JkzUn","suY4xzqH0W",
+"hYBCK4W0Tl","JkzUnOz8yZ","QnJ1Satef2","QnJ1SksJby","uTacxJXljW","FwEJzlXFOB","3weIFYf2Ec","bgJAz2hEEU","QnJ1SDLhzM","jS1ajjSjS3",
+"fFDrJtvdkD","W7cTsDLhzM","6AFT0J2mQi","6q6L9cQOnv","KASQ8D6rBy","uAWyplCMxy","VIlwPfFDrJ","64s8NFhtgl","WPmlxnFqik","RBhp0zY1GY",
+"WreyP0PktI","kZANmECMvU","vLsmSzQt6Q","Mm8sirhl0J","HRxd8yofH3","l83UdKr8ys","ksJby0BmCy","yluBxix74r","vOqCEBbwgA","gtCA5YjB9t",
+"WaWsvJ2mQi","Zv7z0n1pmO","l83Udv8yFN","Ta8f60ao3l","ZzJHW1j5L8","yofH3jSjS3","k85AegIYvE","BbwgAtlILt","fcJOyMm8si","Yw2oUGv3Fq",
+"9eoRcvOqCE","BFkb80YAGH","FNYIMAkKTk","lkMUADLhzM","sqVrfSjskQ","Yw2oUDG4sT","azIWprhl0J","VLTy6nFqik","jSjS3CIShG","DLhzMAkKTk",
+"k85AejfREu","uZPqgjSjS3","zmLYDgjUTu","Pb1paUmaEv","i7WMQiB08l","YOfrYJKWYR","8RCUAdpe1v","CIShGCxVEf","CK5W7mz8gx","BCxeC48cHL",
+"7fKYURBhp0","e6e4zUmaEv","7fsYM1LB1L","e6e4zG1RhS","cmXIXzY1GY","kZANmMm8si","AXpwEVIlwP","nnP8o2ZHdk","ZhwG1580YD","Mm8siBFkb8",
+"tuDySMkgy8","sqVrfYw2oU","cmXIXNOHsz","tl72WK4GS8","0BmCyWDVWJ","lH1ktlweGy","0YAGHRxrsm","X6Pinmz8gx","MojnPs93Ml","zmLYDUlU3M",
+"ru4UGuJScX","KZamHwDajX","EOE1ofFDrJ","JRJQBBCxeC","kZANm48cHL","WaWsvBpYhV","yEfy98hJdt","jtn0XzbIYY","8U2nUNxx9V","uoStw45cIH",
+"Mkgy8JJs5m","580YDUl4a1","4dEz6Yf2Ec","zQt6QLbRTH","5IhmG0Wr5y","45cIHtuDyS","UmaEv3weIF","RBhp024ARF","sx5Gl1LB1L","xReec07n1c",
+"e6e4zHlUbF","S77LHmz8gx","tuDySRsQUq","iwzGkpAhR1","5IhmG8TxD7","sqVrfOxWIH","5drc6Kr8ys","7lUXZIjTwP","FwEJznnP8o","EOE1ouQIcz",
+"Ss0Zu1j5L8","FLsphqaofN","UmaEvuTacx","he9IAVBjhz","8cVD3oGu6x","euZA5ulk41","I7p2aulk41","AmdQd618Di","rz7UtCqqaD","AgJHQIjTwP",
+"JIqXilH1kt","he9IAydG8U","o8UydWaim6","JXljWGSQwj","fFDrJzQt6Q","pvgjSpAhR1","hi5X7FxX9q","O3iyQyluBx","MezSWKASQ8","I7p2arhl0J",
+"mz8gx8RCUA","2Yz7EGXdoH","OHaBzsuY4x","i3pyddjsrv","XyPZNix74r","djsrv9rlg9","brhlQG1RhS","prNT6pAhR1","guMb8WDVWJ","HP433hE1Ql",
+"2ZHdk8cVD3","HRxd8uoStw","D6rBy1LB1L","nFqikVBjhz","In3NSuN6r3","QssNCs7Mxk","uvf7Auupzk","WaWsvLewvM","Ta8f6ZUnqt","kZANmazIWp",
+"xXTI4yluBx","AXpwEReKEW","G1RhSaez9y","VIlwPm4bxU","5drc6OxWIH","KZamHKr8ys","t98iWSs0Zu","DLhzMBCxeC","rz7UtrKDLJ","ReKEWrhl0J",
+"zQt6QiKqhr","FxX9qW7cTs","DG4sT45cIH","uTacxwiHrZ","EoToP07n1c","MmKGJDcpWB","ZuDtDt59lR","VBjhztl72W","2DREsVLTy6","FxX9q7X3uy",
+"o8UydblLA9","uTacxCp3mZ","QworuMK07Y","uZPqgGv3Fq","4W0Tls7Mxk","hYBCKAkKTk","gtCA5Q6hMC","nlaByrKDLJ","lkMUArz7Ut","9XyT9RBhp0",
+"ZJTXHnFqik","OUqFMpAhR1","tlILtK20wK","Yf2EcjSjS3","FPfSEiwzGk","5Drn00PktI","J2mQiqaofN","JJs5m5drc6","0MR5XJKWYR","jeskSQssNC",
+"CxVEfVjCZq","CNHmvxXTI4","hi5X7GWqqX","blLA9rKDLJ","rKDLJtjQxs","lsQGoyvOMI","RACujUlU3M","7hyVv8TxD7","djsrvWmadA","x3LDeGrDg7",
+"IRh48yToGW","VLTy6XflUq","Dz1R35drc6","EdBKcqQxHP","jeskS9eoRc","soy9t0MR5X","zY1GYLbRTH","QworuIjTwP","Y1mC0lCMxy","1v5hHRzaZA",
+"gdQsSFhtgl","DLhzM9rlg9","Gv3Fqv1Hln","FnPFBJ2mQi","7lUXZt98iW","Ul4a1YjB9t","lXFOBt98iW","gf8rIFhtgl","fcJOy7fKYU","618Dipv0i7",
+"2hEEUJ2mQi","iqv4kMezSW","K20wKEdBKc","OUqFMI7p2a","MezSWciuWz","RpBQmlweGy","fqypygdQsS","HRxd8SjskQ","MaJQsKsjRK","FGzgpMkgy8",
+"5Namms7Mxk","lH1ktNhXdu","K4GS8ReKEW","yEfy9yToGW","ReKEWMK07Y","JKWYRJRJQB","lpF6WAmdQd","hSSvQTXQ0Z","uZPqgVjCZq","yToGWDG4sT",
+"xciqphi5X7","iqv4k7hyVv","ogLgcRsQUq","W3VFH9eoRc","29QAz5nmWv","s7MxkZuDtD","uZPqg16lHc","d85a9Fhtgl","WPmlxQClRL","oVQp6RBhp0",
+"Y1mC0brhlQ","ni2v1WaWsv","qQxHPNcICA","ix74r4W0Tl","fcwDaYw2oU","WDVWJ618Di","0Wr5yHRxd8","2ZHdkuLtKs","zY1GYQ6hMC","ECMvUTwano",
+"zQt6QwDajX","QClRLpFrrl","cShY2JkzUn","aL6AJ16lHc","faHirOxWIH","LewvMrKDLJ","nlaByYh1hF","QssNC9y4lw","XyPZND6rBy","zHF1qY1mC0",
+"uN6r3QWxoT","Rxrsm24ARF","hi5X7Zv7z0","lj07QSWfou","FjHXROxWIH","pFrrlK4GS8","D6rBys93Ml","atef25nmWv","8TxD7SbRYy","VBjhzx3LDe",
+"OxWIHGSQwj","cL0aEsx5Gl","QChxsrz7Ut","xReecGrDg7","h1zcHtuDyS","64s8NlCMxy","5ZaEzIKxdL","ni2v1taOXK","iKqhrlkMUA","RxrsmuN6r3",
+"Q6LixThjNn","LDk6fjS1aj","uPX7GQChxs","cQOnvBFkb8","ReKEWYh1hF","l83UdjS1aj","n8pJ9o8Uyd","ZzJHWYjB9t","uvf7AXflUq","blLA9DQimp",
+"tAOsrKsjRK","9eoRcAmdQd","uAWypNAFuw","StlDJy94nw","KsjRKI7p2a","yluBxCK5W7","FNYIMQworu","cShY2RmDcr","POUYStAOsr","0Kyfs2hEEU",
+"pvgjSpmeCd","Q6hMC7hyVv","yofH3FFDui","07n1cjfREu","cmXIX14FLR","ZJTXHe6e4z","lCMxy8TxD7","NcICAFGzgp","618DiW7cTs","1v5hHvOqCE",
+"WmadAZuDtD","lkMUAs7Mxk","fmIK15iGN5","VLTy68FmFH","8TxD7pAhR1","2TRI7ksJby","euZA5v2eC3","KASQ8hUTw7","7fsYMlweGy","iqv4kgjUTu",
+"yluBxhE1Ql","Chuy39y4lw","WMiS3ReKEW","yluBxRkQke","55rfBKZamH","suY4xIBe8k","oGu6xt98iW","0Wr5yAkKTk","djsrvFGzgp","KsjRKEOE1o",
+"48cHLK20wK","16lHcI7p2a","xReec9eoRc","zmLYDF6PT2","0Wr5ypiJSk","euZA5pvgjS","0MR5Xy94nw","Zv7z0JXljW","8cVD3M3zXL","IRh48sqVrf",
+"uQIczM6qcG","5drc6ZzJHW","dhSuHDG4sT","29QAzazIWp","CxVEfuvf7A","hi5X7In3NS","Yf2EcAOgEe","HP433NAFuw","VLTy6l83Ud","nnP8oni2v1",
+"suY4xiqv4k","dQ586QssNC","iKqhrJIqXi","tvdkD7lUXZ","VNCPd7lUXZ","TCgPpRsQUq","Oz8yZuupzk","blLA9dhSuH","0MR5Xaez9y","VIlwPX6Pin",
+"Yh1hFX6Pin","ogLgcoQ87r","Ta8f68FmFH","Q6hMCJKWYR","3weIFlweGy","TXQ0ZeuZA5","cL0aEjiVBP","M6qcGguMb8","taOXKYf2Ec","W7cTscQOnv",
+"ogLgc618Di","Y1mC0Q6Lix","U3yw5YjB9t","RBhp0oGu6x","v1HlnTa8f6","5IhmGMkgy8","yEfy9fcwDa","azIWpL7cGc","fFDrJogLgc","StlDJvOqCE",
+"lXFOBs4786","FLsph9eoRc","JkzUnlXFOB","7fsYMaL6AJ","4QMc9pT8wu","jtn0X8RCUA","JkzUn0Kyfs","s93MlRBhp0","EOE1oRsQUq","t98iWJkzUn",
+"lweGyqUJMd","CIShGiwzGk","hYBCKG1RhS","VIlwP5drc6","FhtglnFqik","hYBCK8FmFH","gIYvEtl72W","cQOnvzY1GY","vOqCEDQimp","X6PinlXFOB",
+"ZUnqtdQ586","cL0aEd85a9","ReKEWVprf2","7Ow5CQworu","7Ow5CBCxeC","lCMxyJkzUn","ogLgck85Ae","uTacxzmLYD","G1RhSNhXdu","i3pydGrDg7",
+"WreyP0MR5X","Chuy3Uvlv4","6AFT0tjQxs","lj07QFwEJz","VLTy6bZLvS","dQ586RBhp0","FnPFBdmoS7","9iGoT1LB1L","fcJOyAkKTk","64s8NIn3NS",
+"RzaZAS77LH","xciqppAhR1","Gv3Fq1v5hH","In3NSuoStw","piJSkzqH0W","pmeCdiqv4k","48cHLVNCPd","zqH0Wfqypy","yluBxtaOXK","FxX9qfcJOy",
+"tvdkDs93Ml","gtCA5WaWsv","pFrrlNOHsz","MGlTF7hyVv","zHF1qFFDui","2hEEUStlDJ","OUYuF2hEEU","FPfSEMmsIo","zY1GYuupzk","atef2vLsmS",
+"v8yFNaFFss","jzUqRMojnP","FLsphfcJOy","OxWIHazIWp","7Ow5C7lUXZ","FjHXRfcwDa","6q6L9WDVWJ","WMiS3taOXK","v2eC3BbwgA","8TxD7a00b5",
+"xciqpDQimp","Ss0Zu1LB1L","WPmlxMezSW","d7vjMuN6r3","7hyVvfFDrJ","soy9tWaWsv","IjTwPqaofN","i3pydnFqik","iwzGkokgRi","4dEz6aFFss",
+"Mm8si5Drn0","4QMc9QChxs","Uvlv4ZhwG1","RACujdpe1v","0MR5XIn3NS","7lUXZHP433","he9IAQYxC0","dQ586uQIcz","dQ586o8Uyd","WmadAlm0pD",
+"iKqhrBGaQY","SbRYyrKDLJ","DQimpAIYUu","y94nwFhtgl","JIqXiiB08l","LDk6fIBe8k","l83UdGrDg7","uPX7G5IhmG","dmoS71v5hH","Kr8ys8FmFH",
+"t98iWsoy9t","0BmCyZzJHW","m4bxUO3iyQ","nlaBypT8wu","55rfByluBx","WaWsvLDk6f","Mm8siM3zXL","hUTw7IBe8k","DLhzMx3LDe","EdBKcjSjS3",
+"m4bxUUlU3M","AXpwEtjQxs","GWqqX48cHL","9rlg9kB5nP","55rfBPb1pa","oGu6xa00b5","jiVBP9rlg9","uN6r3suY4x","0MR5XRmDcr","618DiVNCPd",
+"uvf7AaDGtS","6q6L9B3qem","W7cTsC2Irc","lpF6WFjHXR","dhSuHlkMUA","IKxdLYf2Ec","tjQxs8TxD7","kB5nPVprf2","JIqXi4dEz6","StlDJTXQ0Z",
+"oVQp6dmoS7","FNYIMRkQke","9iGoTChuy3","lj07Qk85Ae","MezSWGv3Fq","Pb1paNAFuw","BbwgAprNT6","4QMc98FmFH","uAWypIn3NS","D6rByiwzGk",
+"d85a98U2nU","RkQkepv0i7","0Wr5yM6qcG","PYBf4cmXIX","0PktI5drc6","D6rByEoToP","kB5nPMkgy8","2TRI7U3yw5","Dz1R3FnPFB","CdyBVGrDg7",
+"i3pydCfgr3","1LB1L9y4lw","8RCUAZ4I1v","MmKGJcShY2","KASQ8vLsmS","iKqhrciuWz","RpBQmU3yw5","lsQGoSmGzv","9iGoTIBe8k","ru4UGKr8ys",
+"s4786bgJAz","5VZjS2DREs","AkKTkQYxC0","5IhmGjeskS","qQxHPChuy3","MK07YOz8yZ","I7p2aG1RhS","kZANmru4UG","SbRYyRBhp0","uQIczcShY2",
+"7Ow5CIBe8k","Waim6ZUnqt","jS1ajDG4sT","yvOMI9rlg9","SmGzvh1zcH","yEfy9CIShG","DLhzM7hyVv","LbRTHRkQke","LewvM7lUXZ","he9IAAgJHQ",
+"nFqikFxX9q","JXljWFcWrW","Y1mC0XflUq","EdBKcpAhR1","VNCPdYw2oU","jSjS37fsYM","DG4sTeuZA5","Ta8f6VBjhz","SmGzvLbRTH","4W0Tl5Mg9r",
+"VerEAHzZT8","DLhzMd7vjM","jSjS3YOfrY","WmadAqUJMd","YjB9tKASQ8","Qworusoy9t","No0QbChuy3","VBjhzLewvM","J2mQipWiOs","fmIK1YOfrY",
+"In3NSZv7z0","UmaEvYOfrY","gIYvEuQIcz","RzaZAPOUYS","618DiHzZT8","gdQsSI7p2a","Ul4a1AkKTk","5Mg9rAkKTk","CqqaDSbRYy","TXQ0Zsx5Gl",
+"2ZHdkRsQUq","8TxD7WMiS3","7ku1pWDVWJ","I7p2aMK07Y","W7cTsK20wK","ydG8UgjUTu","ksJbyYw2oU","GSQwjGWqqX","WPmlx8TxD7","48cHLDG4sT",
+"vkCHHRzaZA","hE1QlcShY2","oGu6xGv3Fq","t98iWAOgEe","uTacxQnJ1S","d85a9uQIcz","hSSvQv2eC3","P6bcgBbwgA","CIShGTwano","AXpwEsx5Gl",
+"gtCA5tlILt","iwzGk8U2nU","rhl0JYf2Ec","RzaZA4dEz6","ZzJHWC2Irc","CxVEfk85Ae","iB08lzz4ZU","DcpWBLbRTH","U3yw5FVMxo","Mm8siJkzUn",
+"FnPFB5drc6","LewvMPOUYS","9XyT9XflUq","4QMc9guMb8","he9IADG4sT","vLsmSQ6hMC","pAhR1KZamH","m4bxU0PktI","d7vjM9XyT9","NOHszuN6r3",
+"5iGN5ECMvU","PYBf4MezSW","sx5Gl29QAz","DG4sTbgJAz","fcwDa0YAGH","In3NSHP433","gdQsSGSQwj","MK07Ye6e4z","yluBxI7p2a","AXpwEFwEJz",
+"zHF1qVerEA","1v5hHoGu6x","dhSuHPOUYS","s7MxkqQxHP","fqypy7X3uy","soy9tGSQwj","QChxs2Nslm","AgJHQWPmlx","2TRI7SjskQ","SjskQdmoS7",
+"Yf2EcMaJQs","SjskQRsQUq","dhSuHFjHXR","Q6LixpvgjS","W7cTs0Wr5y","HP4334dEz6","zFgtBMkgy8","TXQ0Zmz8gx","9iGoTsoy9t","qQxHPuJScX",
+"AkKTkKsjRK","kZANmn1pmO","6q6L9qQxHP","ydG8UjiVBP","fmIK1RkQke","aL6AJs93Ml","0MR5Xo8Uyd","hSSvQQChxs","CK5W7MmKGJ","pv0i78xEKz",
+"FjHXR0Kyfs","fLNg8Y1mC0","29QAzkZANm","ZuDtDi3pyd","ogLgcUlU3M","hSSvQs93Ml","pv0i7nlaBy","X6PinReKEW","wDajXGrDg7","CxVEf24ARF",
+"cmXIXbgJAz","HfyNQgdQsS","QssNCQbxXc","HlUbFTCgPp","yEfy95Mg9r","Ta8f6djsrv","zz4ZU8TxD7","0KyfsCdyBV","1j5L8tuDyS","RsQUqtvdkD",
+"prNT6lweGy","okgRiFjHXR","lViBvcL0aE","zmLYDZv7z0","wDajXi3pyd","fmIK1n1pmO","QYxC0gtCA5","FxX9qBpYhV","zbIYYrz7Ut","AmdQd4W0Tl",
+"tl72Wl83Ud","lj07Q8hJdt","SjskQKASQ8","ReKEWMojnP","pvgjSo8Uyd","AIYUuCxVEf","WreyPWaWsv","brhlQoGu6x","7fKYUjzUqR","vkCHHThjNn",
+"zmLYDgtCA5","Q6hMC7fsYM","o8UydUlU3M","cL0aElm0pD","fmIK1AmdQd","gIYvExciqp","UmaEvFFDui","Mkgy8D6rBy","lXFOB5iGN5","2Yz7EaDGtS",
+"7ku1pv1Hln","v1HlnUlU3M","OUYuFt59lR","8cVD38FmFH","YOfrYguMb8","K20wKHzZT8","yofH3tAOsr","gtCA5NhXdu","kB5nP3weIF","Ul4a1MezSW",
+"1LB1LFLsph","U3yw5hUTw7","s93Mluupzk","POUYSVIlwP","FcWrWWPmlx","WDVWJh1zcH","Nxx9VcL0aE","cmXIXQworu","JkzUnGWqqX","oQ87r16lHc",
+"lweGyOUqFM","RBhp0VerEA","iKqhrP6bcg","tAOsri7WMQ","lweGyvLsmS","jS1aj7lUXZ","5Mg9rdmoS7","Yf2Ec45cIH","uZPqg0h1b1","WMiS3WPmlx",
+"soy9twiHrZ","BGaQYydG8U","zmLYDydG8U","hE1QlQbxXc","uJScX5ZaEz","lkMUAW3VFH","OUqFMpmeCd","oVQp6FcWrW","xciqpogLgc","suY4x5Mg9r",
+"0MR5X9rlg9","QYxC0MGlTF","lweGygdQsS","QworuGrDg7","mz8gxzmLYD","jfREu8xEKz","bZLvSaez9y","OUqFM48cHL","i3pydgf8rI","CqqaDMkgy8",
+"5Drn0sqVrf","QWxoTHzZT8","55rfB55rfB","he9IABbwgA","Ta8f6fcwDa","FhtgleuZA5","oQ87rjSjS3","SWfouciuWz","v8yFNlXFOB","5VZjS9rlg9",
+"VIlwPpiJSk","MojnP0ao3l","16lHcNOHsz","Yw2oUqaofN","OHaBzVNCPd","In3NSD6rBy","M3zXLzz4ZU","wDajXFwEJz","OUqFMhUTw7","Mm8siWaWsv",
+"3otm6B3qem","gtCA5xciqp","QWxoTlm0pD","JKWYRTwano","fmIK1fLNg8","bgJAzRkQke","Zv7z0HfyNQ","zz4ZU4W0Tl","D6rByJkzUn","ru4UGMezSW",
+"yluBxDLhzM","5Nammni2v1","Uvlv4OUqFM","jSjS3lm0pD","Cfgr3RmDcr","i3pydFNYIM","5nmWvK4GS8","aFFss29QAz","RzaZAFPfSE","CxVEfHzZT8",
+"7fsYM0Wr5y","dQ586Ul4a1","Cfgr32hEEU","2Nslmhi5X7","StlDJ48cHL","uvf7ApAhR1","DQimpydG8U","uupzkCp3mZ","Zv7z07fsYM","07n1cNxx9V",
+"MmsIo0MR5X","S2DfucShY2","AIYUuM6qcG","RBhp0gf8rI","3weIFzz4ZU","Q6Lixi7WMQ","zFgtB8TxD7","RpBQm7ku1p","fmIK1L7cGc","gtCA5Z4I1v",
+"GXdoHPYBf4","ru4UGvOqCE","hYBCKVBjhz","prNT6I7p2a","FcWrW8U2nU","1v5hHCp3mZ","8xEKzhUTw7","aFFss5ZaEz","Waim68FmFH","Mkgy8S2Dfu",
+"JIqXi0ao3l","v1Hln1j5L8","gdQsSThjNn","MmsIogIYvE","he9IAWaim6","qaofN8cVD3","s7MxkW3VFH","fLNg8pT8wu","ni2v14QMc9","pmeCdHzZT8",
+"8FmFHRsQUq","HzZT8taOXK","Pb1pa3weIF","Fhtgl14FLR","gjUTul83Ud","zFgtBTCgPp","ru4UGS2Dfu","Zv7z08TxD7","BCxeCm4bxU","6AFT0suY4x",
+"tuDySKZamH","14FLRyEfy9","CIShGBFkb8","AOgEe4dEz6","ECMvU0ao3l","X6Pinhe9IA","16lHcxReec","uoStwtjQxs","aFFsslm0pD","k85AeB3qem",
+"07n1cFhtgl","zFgtBRsQUq","W3VFHpiJSk","Qworuv1Hln","rKDLJn8pJ9","7X3uy5ZaEz","OHaBzD6rBy","jS1aj9eoRc","S77LH0ao3l","BbwgAciuWz",
+"Mkgy8DcpWB","pv0i77ku1p","yofH3P6bcg","SbRYyFcWrW","e6e4zcmXIX","cL0aEU3yw5","Vprf2ZhwG1","6AFT0l83Ud","d7vjMXyPZN","ulk41uPX7G",
+"yEfy9FjHXR","uQIczMGlTF","v2eC32TRI7","24ARFfqypy","9eoRcAXpwE","WreyPjS1aj","n8pJ9Z4I1v","29QAztl72W","zY1GYAmdQd","JJs5m5VZjS"
+] } }
+}
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//sorted-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 200000,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//sorted-queue?durable='true'",
+ "_numberOfMessages": 200000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "queue-type:simple-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//simple-queue?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//simple-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 200000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//simple-queue?durable='true'",
+ "_numberOfMessages": 200000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ {
+ "_name": "queue-type:priority-queue";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//priority-queue?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-priorities": 10
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "priority": {"@def": "range", "_lower": 0, "_upper": 9, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//priority-queue?durable='true'",
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_numberOfMessages": 20000,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//priority-queue?durable='true'",
+ "_numberOfMessages": 20000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/etc/testdefs/standard/QueuesWithSelectors.json b/qpid/java/perftests/etc/testdefs/standard/QueuesWithSelectors.json
new file mode 100644
index 0000000000..2e8175c602
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/standard/QueuesWithSelectors.json
@@ -0,0 +1,2036 @@
+{
+ "_tests":[
+ {
+ "_name": "Queues with selectors: 1 consumer - 1 producer - non overlapping - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": 1 }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Queues with selectors: 2 consumers - 1 producer - non overlapping - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 2, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 200000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Queues with selectors: 5 consumers - 1 producer - non overlapping - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 5, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=5"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Queues with selectors: 10 consumers - 1 producer - non overlapping - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 10, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=5"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=6"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=7"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=9"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable?durable='true'",
+ "_numberOfMessages": 100000,
+ "_selector": "id=10"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Queues with selectors: 2 consumers - 1 producer - overlapping 50% - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 76800000,
+ "x-qpid-flow-resume-capacity": 51200000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 4, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 100000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =1 or id= 2 or id= 3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =2 or id= 3 or id= 4"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Queues with selectors: 5 consumers - 1 producer - overlapping 50% - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 307200000,
+ "x-qpid-flow-resume-capacity": 256000000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 10, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 50000,
+ "_selector": "id =1 or id=2 or id= 10"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 50000,
+ "_selector": "id =2 or id=3 or id= 4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 50000,
+ "_selector": "id =4 or id= 5 or id= 6"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 50000,
+ "_selector": "id =6 or id= 7 or id =8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 50000,
+ "_selector": "id =8 or id =9 or id =10"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Queues with selectors: 10 consumers - 1 producer - overlapping 50% - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 307200000,
+ "x-qpid-flow-resume-capacity": 25600000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 20, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =1 or id =2 or id =3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =2 or id =3 or id= 4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =5 or id=6 or id =7"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =6 or id =7 or id =8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =9 or id = 10 or id = 11"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =10 or id = 11 or id =12"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 13 or id = 14 or id =15"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 14 or id =15 or id =16"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id =17 or id =18 or id= 19"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//queue-selectors-durable-overlapping?durable='true'",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 18 or id = 19 or id =20"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+{
+ "_name": "Queues with selectors: 1 consumer - 1 producer - non overlapping - NON_PERSISTENT ",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors?durable='false'",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": 1 }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Queues with selectors: 2 consumers - 1 producer - non overlapping - NON_PERSISTENT ",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors?durable='false'",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 2, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 200000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Queues with selectors: 5 consumers - 1 producer - non overlapping - NON_PERSISTENT ",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors?durable='false'",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 5, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=5"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Queues with selectors: 10 consumers - 1 producer - non overlapping - NON_PERSISTENT ",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors?durable='false'",
+ "_attributes":
+ {
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 10, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=5"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=6"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=7"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=9"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//queue-selectors",
+ "_numberOfMessages": 100000,
+ "_selector": "id=10"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Queues with selectors: 2 consumers - 1 producer - overlapping selectors 50% - NON_PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-overlapping",
+ "_attributes":
+ {
+ "x-qpid-capacity": 61440000,
+ "x-qpid-flow-resume-capacity": 51200000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 4, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 200000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =1 or id= 2 or id= 3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =2 or id= 3 or id= 4"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Queues with selectors: 5 consumers - 1 producer - overlapping selectors 50% - NON_PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-overlapping",
+ "_attributes":
+ {
+ "x-qpid-capacity": 307200000,
+ "x-qpid-flow-resume-capacity": 256000000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 10, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 50000,
+ "_selector": "id =1 or id=2 or id= 10"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 50000,
+ "_selector": "id =2 or id=3 or id= 4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 50000,
+ "_selector": "id =4 or id= 5 or id= 6"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 50000,
+ "_selector": "id =6 or id= 7 or id =8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 50000,
+ "_selector": "id =8 or id =9 or id =10"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Queues with selectors: 10 consumers - 1 producer - overlapping selectors 50% - NON_PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//queue-selectors-overlapping",
+ "_attributes":
+ {
+ "x-qpid-capacity": 307200000,
+ "x-qpid-flow-resume-capacity": 25600000
+ }
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_messageProviders": [
+ {
+ "_name": "messageProvider",
+ "_messageProperties":{ "id": {"@def": "range", "_lower": 1, "_upper": 20, "_type": "int"} }
+ }
+ ],
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 500000,
+ "_deliveryMode": 1,
+ "_messageSize": 1024,
+ "_messageProviderName": "messageProvider"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =1 or id =2 or id =3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =2 or id =3 or id= 4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =5 or id=6 or id =7"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =6 or id =7 or id =8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =9 or id = 10 or id = 11"
+
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =10 or id = 11 or id =12"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 13 or id = 14 or id =15"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 14 or id =15 or id =16"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id =17 or id =18 or id= 19"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//queue-selectors-overlapping",
+ "_numberOfMessages": 25000,
+ "_selector": "id = 18 or id = 19 or id =20"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/etc/testdefs/standard/VaryingNumberOfParticipants.json b/qpid/java/perftests/etc/testdefs/standard/VaryingNumberOfParticipants.json
new file mode 100644
index 0000000000..6cf67cbbf0
--- /dev/null
+++ b/qpid/java/perftests/etc/testdefs/standard/VaryingNumberOfParticipants.json
@@ -0,0 +1,2981 @@
+{
+ "_tests":[
+ {
+ "_name": "Varying number of participants: 1 consumer - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Varying number of participants: 2 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Varying number of participants: 5 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 1 producer - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection0",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session0",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 2 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 5 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 1 consumer - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 2 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+
+ {
+ "_name": "Varying number of participants: 5 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+
+
+
+
+ {
+ "_name": "Varying number of participants: 10 consumers - 10 producers - PERSISTENT",
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//varying-consumers?durable='true'",
+ "_durable": true
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "connection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//varying-consumers?durable='true'",
+ "_maximumDuration": 180000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/example/PQBT-AA-Qpid-01.json b/qpid/java/perftests/example/PQBT-AA-Qpid-01.json
new file mode 100644
index 0000000000..28cb4fa410
--- /dev/null
+++ b/qpid/java/perftests/example/PQBT-AA-Qpid-01.json
@@ -0,0 +1,795 @@
+{
+ "_tests":[
+ {
+ "_name": "PQBT-AA-Qpid-01";
+ "_description": "16 clients, one 1P 1C each. Persistent, Auto-Ack, 10 minutes";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue1?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue2?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue3?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue4?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue5?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue6?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue7?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue8?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue9?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue10?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue11?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue12?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue13?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue14?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue15?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue16?durable='true'",
+ "_durable": true,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "client1",
+ "_connections":[
+ {
+ "_name": "pconnection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue1?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue1?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client2",
+ "_connections":[
+ {
+ "_name": "pconnection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//testQueue2?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession2",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//testQueue2?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client3",
+ "_connections":[
+ {
+ "_name": "pconnection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//testQueue3?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession3",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//testQueue3?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client4",
+ "_connections":[
+ {
+ "_name": "pconnection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//testQueue4?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession4",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//testQueue4?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client5",
+ "_connections":[
+ {
+ "_name": "pconnection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession5",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//testQueue5?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//testQueue5?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client6",
+ "_connections":[
+ {
+ "_name": "pconnection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession6",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//testQueue6?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession6",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//testQueue6?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client7",
+ "_connections":[
+ {
+ "_name": "pconnection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession7",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//testQueue7?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession7",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//testQueue7?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client8",
+ "_connections":[
+ {
+ "_name": "pconnection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession8",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//testQueue8?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession8",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//testQueue8?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client9",
+ "_connections":[
+ {
+ "_name": "pconnection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession9",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//testQueue9?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession9",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//testQueue9?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client10",
+ "_connections":[
+ {
+ "_name": "pconnection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession10",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//testQueue10?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession10",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//testQueue10?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client11",
+ "_connections":[
+ {
+ "_name": "pconnection11",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession11",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer11",
+ "_destinationName": "direct://amq.direct//testQueue11?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection11",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession11",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer11",
+ "_destinationName": "direct://amq.direct//testQueue11?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client12",
+ "_connections":[
+ {
+ "_name": "pconnection12",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession12",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer12",
+ "_destinationName": "direct://amq.direct//testQueue12?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection12",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession12",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer12",
+ "_destinationName": "direct://amq.direct//testQueue12?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client13",
+ "_connections":[
+ {
+ "_name": "pconnection13",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession13",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer13",
+ "_destinationName": "direct://amq.direct//testQueue13?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection13",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession13",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer13",
+ "_destinationName": "direct://amq.direct//testQueue13?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client14",
+ "_connections":[
+ {
+ "_name": "pconnection14",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession14",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer14",
+ "_destinationName": "direct://amq.direct//testQueue14?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection14",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession14",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer14",
+ "_destinationName": "direct://amq.direct//testQueue14?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client15",
+ "_connections":[
+ {
+ "_name": "pconnection15",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession15",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer15",
+ "_destinationName": "direct://amq.direct//testQueue15?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection15",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession15",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer15",
+ "_destinationName": "direct://amq.direct//testQueue15?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client16",
+ "_connections":[
+ {
+ "_name": "pconnection16",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession16",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer16",
+ "_destinationName": "direct://amq.direct//testQueue16?durable='true'",
+ "_messageSize": 256,
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection16",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession16",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer16",
+ "_destinationName": "direct://amq.direct//testQueue16?durable='true'",
+ "_maximumDuration": 600000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+}
diff --git a/qpid/java/perftests/example/TQBT-TX-Qpid-01.json b/qpid/java/perftests/example/TQBT-TX-Qpid-01.json
new file mode 100644
index 0000000000..eea8666fa4
--- /dev/null
+++ b/qpid/java/perftests/example/TQBT-TX-Qpid-01.json
@@ -0,0 +1,843 @@
+{
+ "_tests":[
+ {
+ "_name": "TQBT-TX-Qpid-01";
+ "_description": "16 clients, one 1P 1C each. Non-Persistent, Transactional publisher batch 1, Transactional consumer batch 1000, 10 minutes";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue1",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue2",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue3",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue4",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue5",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue6",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue7",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue8",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue9",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue10",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue11",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue12",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue13",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue14",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue15",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ },
+ {
+ "_name": "direct://amq.direct//testQueue16",
+ "_durable": false,
+ "_attributes":
+ {
+ "x-qpid-capacity": 2000000,
+ "x-qpid-flow-resume-capacity": 1500000
+ }
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "client1",
+ "_connections":[
+ {
+ "_name": "pconnection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession1",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue1",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession1",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue1",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client2",
+ "_connections":[
+ {
+ "_name": "pconnection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession2",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//testQueue2",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession2",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//testQueue2",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client3",
+ "_connections":[
+ {
+ "_name": "pconnection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession3",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//testQueue3",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession3",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer3",
+ "_destinationName": "direct://amq.direct//testQueue3",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client4",
+ "_connections":[
+ {
+ "_name": "pconnection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession4",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//testQueue4",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession4",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer4",
+ "_destinationName": "direct://amq.direct//testQueue4",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client5",
+ "_connections":[
+ {
+ "_name": "pconnection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession5",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//testQueue5",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession5",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer5",
+ "_destinationName": "direct://amq.direct//testQueue5",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client6",
+ "_connections":[
+ {
+ "_name": "pconnection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession6",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer6",
+ "_destinationName": "direct://amq.direct//testQueue6",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection6",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession6",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer6",
+ "_destinationName": "direct://amq.direct//testQueue6",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client7",
+ "_connections":[
+ {
+ "_name": "pconnection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession7",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer7",
+ "_destinationName": "direct://amq.direct//testQueue7",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection7",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession7",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer7",
+ "_destinationName": "direct://amq.direct//testQueue7",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client8",
+ "_connections":[
+ {
+ "_name": "pconnection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession8",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer8",
+ "_destinationName": "direct://amq.direct//testQueue8",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection8",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession8",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer8",
+ "_destinationName": "direct://amq.direct//testQueue8",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client9",
+ "_connections":[
+ {
+ "_name": "pconnection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession9",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer9",
+ "_destinationName": "direct://amq.direct//testQueue9",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection9",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession9",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer9",
+ "_destinationName": "direct://amq.direct//testQueue9",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client10",
+ "_connections":[
+ {
+ "_name": "pconnection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession10",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer10",
+ "_destinationName": "direct://amq.direct//testQueue10",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection10",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession10",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer10",
+ "_destinationName": "direct://amq.direct//testQueue10",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client11",
+ "_connections":[
+ {
+ "_name": "pconnection11",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession11",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer11",
+ "_destinationName": "direct://amq.direct//testQueue11",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection11",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession11",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer11",
+ "_destinationName": "direct://amq.direct//testQueue11",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client12",
+ "_connections":[
+ {
+ "_name": "pconnection12",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession12",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer12",
+ "_destinationName": "direct://amq.direct//testQueue12",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection12",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession12",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer12",
+ "_destinationName": "direct://amq.direct//testQueue12",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client13",
+ "_connections":[
+ {
+ "_name": "pconnection13",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession13",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer13",
+ "_destinationName": "direct://amq.direct//testQueue13",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection13",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession13",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer13",
+ "_destinationName": "direct://amq.direct//testQueue13",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client14",
+ "_connections":[
+ {
+ "_name": "pconnection14",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession14",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer14",
+ "_destinationName": "direct://amq.direct//testQueue14",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection14",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession14",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer14",
+ "_destinationName": "direct://amq.direct//testQueue14",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client15",
+ "_connections":[
+ {
+ "_name": "pconnection15",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession15",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer15",
+ "_destinationName": "direct://amq.direct//testQueue15",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection15",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession15",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer15",
+ "_destinationName": "direct://amq.direct//testQueue15",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "client16",
+ "_connections":[
+ {
+ "_name": "pconnection16",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "psession16",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer16",
+ "_destinationName": "direct://amq.direct//testQueue16",
+ "_messageSize": 256,
+ "_deliveryMode": 1,
+ "_batchSize": 1,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "cconnection16",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "csession16",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer16",
+ "_destinationName": "direct://amq.direct//testQueue16",
+ "_batchSize": 1000,
+ "_numberOfMessages": 1500000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+}
diff --git a/qpid/java/perftests/example/brokerconfig/log4j.xml b/qpid/java/perftests/example/brokerconfig/log4j.xml
new file mode 100644
index 0000000000..7dbb1bc87d
--- /dev/null
+++ b/qpid/java/perftests/example/brokerconfig/log4j.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ --><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="null" threshold="null">
+ <appender class="org.apache.log4j.QpidCompositeRollingAppender" name="ArchivingFileAppender">
+ <!-- Ensure that logs always have the DatePattern appended to the filename.
+ DEFAULT IF NOT CONFIGURED: true -->
+ <param name="StaticLogFileName" value="true"/>
+ <param name="file" value="${QPID_WORK}/log/${logprefix}qpid${logsuffix}.log"/>
+ <!-- Style of rolling to use, by:
+ File Size(1)
+ Date(2)
+ Both(3)
+
+ When Date (or Both) is enabled then the value of DatePattern will determine
+ when the new file is made. e.g. a DatePattern of "'.'yyyy-MM-dd-HH-mm"
+ which includes minutes will cause a new backup file to be made every minute.
+
+ DEFAULT IF NOT CONFIGURED: 3 -->
+ <param name="RollingStyle" value="1"/>
+ <!-- Set the count direction:
+ Negative numbers mean backups are numbered <latest>, .0, .1, .2,..., .n
+ 0 means backup is DatePattern stamped and followed with a Positive number
+ if the DatePattern stamp clashes with other existing backups.
+ Positive numbers mean backups are numbered 0, 1, 2, ..., n, <latest>
+
+ DEFAULT IF NOT CONFIGURED: -1 -->
+ <param name="CountDirection" value="0"/>
+ <!-- Maximum File Size:
+ DEFAULT IF NOT CONFIGURED: 10MB -->
+ <param name="MaxFileSize" value="1MB"/>
+ <!-- Date Pattern:
+ DEFAULT IF NOT CONFIGURED: "'.'yyyy-MM-dd" -->
+ <param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm"/>
+ <!-- Maximum number of backup files:
+ 0 means no backups
+ -1 means infinite backups
+
+ DEFAULT IF NOT CONFIGURED: 0 -->
+ <param name="MaxSizeRollBackups" value="-1"/>
+ <!-- Compress(gzip) the backup files to the backup location:
+ DEFAULT IF NOT CONFIGURED: FALSE -->
+ <param name="CompressBackupFiles" value="true"/>
+ <!-- Compress the backup files using a second thread:
+ DEFAULT IF NOT CONFIGURED: FALSE -->
+ <param name="CompressAsync" value="true"/>
+ <!-- Backup Location:
+ DEFAULT IF NOT CONFIGURED: same dir as log file -->
+ <param name="backupFilesToPath" value="${QPID_WORK}/backup/log"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d %-5p [%t] (%F:%L) - %m%n"/>
+ </layout>
+ </appender>
+
+ <appender class="org.apache.log4j.FileAppender" name="FileAppender">
+ <param name="File" value="${QPID_WORK}/log/${logprefix}qpid${logsuffix}.log"/>
+ <param name="Append" value="false"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d %-5p [%t] (%F:%L) - %m%n"/>
+ </layout>
+ </appender>
+
+ <appender class="org.apache.log4j.ConsoleAppender" name="STDOUT">
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d %-5p [%t] (%F:%L) - %m%n"/>
+ </layout>
+ </appender>
+
+ <category additivity="true" name="org.apache.qpid.server.queue.AMQQueueMBean">
+ <priority value="info"/>
+ </category>
+
+ <!-- Provide warnings to standard output -->
+ <category additivity="true" name="org.apache.qpid">
+ <priority value="warn"/>
+ </category>
+
+ <!-- Enable info messages for the status-logging hierarchy -->
+ <logger additivity="true" name="qpid.message">
+ <level value="info"/>
+ </logger>
+
+
+
+ <!-- Examples of additional logging settings -->
+ <!-- Used to generate extra debug. See debug.log4j.xml -->
+
+ <!--<category additivity="true" name="org.apache.qpid.server.store">
+ <priority value="debug"/>
+ </category-->
+
+ <!-- Set the commons logging that the XML parser uses to WARN, it is very chatty at debug -->
+ <logger name="org.apache.commons">
+ <level value="WARN"/>
+ </logger>
+
+ <!-- Log all info events to file -->
+ <root>
+ <priority value="info"/>
+ <appender-ref ref="FileAppender"/>
+ <!--appender-ref ref="ArchivingFileAppender"/-->
+ </root>
+
+</log4j:configuration>
diff --git a/qpid/java/perftests/example/brokerconfig/passwd b/qpid/java/perftests/example/brokerconfig/passwd
new file mode 100644
index 0000000000..99f0f05c6a
--- /dev/null
+++ b/qpid/java/perftests/example/brokerconfig/passwd
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+guest:guest
+client:guest
+server:guest
+admin:admin
+
diff --git a/qpid/java/perftests/example/brokerconfig/virtualhosts.xml b/qpid/java/perftests/example/brokerconfig/virtualhosts.xml
new file mode 100644
index 0000000000..b0dbc89833
--- /dev/null
+++ b/qpid/java/perftests/example/brokerconfig/virtualhosts.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<virtualhosts>
+ <default>test</default>
+
+ <virtualhost>
+ <name>test</name>
+ <test>
+ <store>
+ <!-- class>org.apache.qpid.server.store.MemoryMessageStore</class -->
+
+ <class>org.apache.qpid.server.store.berkeleydb.BDBMessageStore</class>
+ <environment-path>/home/V510279/dev/qpid/qpid/java/build/work/bdbstore/test-store</environment-path>
+ </store>
+
+ <queues>
+ <minimumAlertRepeatGap>30000</minimumAlertRepeatGap>
+ <maximumMessageCount>50</maximumMessageCount>
+ <queue>
+ <name>queue</name>
+ <queue>
+ <exchange>amq.direct</exchange>
+ <maximumQueueDepth>4235264</maximumQueueDepth>
+ <!-- 4Mb -->
+ <maximumMessageSize>2117632</maximumMessageSize>
+ <!-- 2Mb -->
+ <maximumMessageAge>600000</maximumMessageAge>
+ <!-- 10 mins -->
+ </queue>
+ </queue>
+ <queue>
+ <name>ping</name>
+ <ping>
+ <exchange>amq.direct</exchange>
+ <maximumQueueDepth>4235264</maximumQueueDepth>
+ <!-- 4Mb -->
+ <maximumMessageSize>2117632</maximumMessageSize>
+ <!-- 2Mb -->
+ <maximumMessageAge>600000</maximumMessageAge>
+ <!-- 10 mins -->
+ </ping>
+ </queue>
+ </queues>
+ </test>
+ </virtualhost>
+</virtualhosts>
+
+
diff --git a/qpid/java/perftests/example/config-one-test.json b/qpid/java/perftests/example/config-one-test.json
new file mode 100644
index 0000000000..8f4e577d49
--- /dev/null
+++ b/qpid/java/perftests/example/config-one-test.json
@@ -0,0 +1,55 @@
+{
+ "_tests":[
+ {
+ "_name": "One producer to one consumer";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+}
diff --git a/qpid/java/perftests/example/config-stress-testing-manyp-c1-with-psfc.json b/qpid/java/perftests/example/config-stress-testing-manyp-c1-with-psfc.json
new file mode 100644
index 0000000000..42c0f4a155
--- /dev/null
+++ b/qpid/java/perftests/example/config-stress-testing-manyp-c1-with-psfc.json
@@ -0,0 +1,162 @@
+{
+ "_tests":[
+ {
+ "_name": "Many producers to one consumer w/producer flow-control";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue",
+ "_attributes":
+ {
+ "comment": "does not work yet - configure in virtualhost.xml",
+ "x-qpid-capacity": 10485760,
+ "x-qpid-flow-resume-capacity": 8388608
+ }
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient1",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 10000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "producingClient2",
+ "_connections":[
+ {
+ "_name": "connection2",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session2",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer2",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 10000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "producingClient3",
+ "_connections":[
+ {
+ "_name": "connection3",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session3",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer3",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 10000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "producingClient4",
+ "_connections":[
+ {
+ "_name": "connection4",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session4",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer4",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 10000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "producingClient5",
+ "_connections":[
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": "1",
+ "_producers": [
+ {
+ "_name": "Producer5",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1,
+ "_messageSize": 10000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection5",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session5",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/qpid/java/perftests/example/config-stress-testing.json b/qpid/java/perftests/example/config-stress-testing.json
new file mode 100644
index 0000000000..f6029b848d
--- /dev/null
+++ b/qpid/java/perftests/example/config-stress-testing.json
@@ -0,0 +1,84 @@
+{
+ "_tests":[
+ {
+ "_name": "One producer to one consumer";
+ "_iterations":[
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ },
+ {
+ "_messageSize": 10000
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000,
+ "_deliveryMode": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 1,
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1000000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+}
diff --git a/qpid/java/perftests/example/config-two-tests.json b/qpid/java/perftests/example/config-two-tests.json
new file mode 100644
index 0000000000..79d305b100
--- /dev/null
+++ b/qpid/java/perftests/example/config-two-tests.json
@@ -0,0 +1,117 @@
+{
+ "_tests":[
+ {
+ "_name": "One producer to one consumer";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "One producer to two consumers";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "Producer",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 5000
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "Consumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 2500
+ }
+ ]
+ },
+ {
+ "_sessionName": "session2",
+ "_consumers": [
+ {
+ "_name": "Consumer2",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 2500
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+}
diff --git a/qpid/java/perftests/example/log4j-client.properties b/qpid/java/perftests/example/log4j-client.properties
new file mode 100644
index 0000000000..b724cbf5f2
--- /dev/null
+++ b/qpid/java/perftests/example/log4j-client.properties
@@ -0,0 +1,29 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+log4j.rootLogger=ERROR,console
+
+log4j.logger.org.apache.qpid=WARN
+log4j.logger.org.apache.qpid.disttest=INFO
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=all
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+
+log4j.appender.console.layout.ConversionPattern=%d %p [%c{1}] %m%n
+
diff --git a/qpid/java/perftests/example/log4j.properties b/qpid/java/perftests/example/log4j.properties
new file mode 100644
index 0000000000..8af70ebef2
--- /dev/null
+++ b/qpid/java/perftests/example/log4j.properties
@@ -0,0 +1,35 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+log4j.rootLogger=ERROR,console,fileApp
+
+log4j.logger.org.apache.qpid=WARN
+log4j.logger.org.apache.qpid.disttest=INFO
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=all
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+
+log4j.appender.console.layout.ConversionPattern=%d %p [%c{1}] %m%n
+
+log4j.appender.fileApp=org.apache.log4j.FileAppender
+log4j.appender.fileApp.file=perftests.log
+log4j.appender.fileApp.Threshold=info
+log4j.appender.fileApp.append=false
+log4j.appender.fileApp.layout=org.apache.log4j.PatternLayout
+log4j.appender.fileApp.layout.ConversionPattern=%d %p [%c{1}] %m%n \ No newline at end of file
diff --git a/qpid/java/perftests/example/perftests-jndi.properties b/qpid/java/perftests/example/perftests-jndi.properties
new file mode 100644
index 0000000000..8ad0decaad
--- /dev/null
+++ b/qpid/java/perftests/example/perftests-jndi.properties
@@ -0,0 +1,26 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# this file is used for running system tests of the performance test framework,
+# (i.e. not for running the performance tests themselves!)
+
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+# use QpidBrokerTestCase's default port
+connectionfactory.connectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
+
+destination.controllerqueue = direct://amq.direct//controllerqueue
diff --git a/qpid/java/perftests/example/run-client.sh b/qpid/java/perftests/example/run-client.sh
new file mode 100755
index 0000000000..ad158529b6
--- /dev/null
+++ b/qpid/java/perftests/example/run-client.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+java -cp ".:${QPID_HOME}/lib/*" -Dlog4j.configuration=log4j-client.properties -Dqpid.dest_syntax=BURL org.apache.qpid.disttest.ClientRunner jndi-config=perftests-jndi.properties
diff --git a/qpid/java/perftests/example/run.sh b/qpid/java/perftests/example/run.sh
new file mode 100755
index 0000000000..cb68c52853
--- /dev/null
+++ b/qpid/java/perftests/example/run.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+java -cp ".:${QPID_HOME}/lib/*" -Dqpid.dest_syntax=BURL org.apache.qpid.disttest.ControllerRunner jndi-config=perftests-jndi.properties test-config=$1 distributed=false
+
diff --git a/qpid/java/perftests/generate-scripts b/qpid/java/perftests/generate-scripts
deleted file mode 100644
index 3d12cc13c3..0000000000
--- a/qpid/java/perftests/generate-scripts
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env python
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-import os, sys, mllib
-
-template = """#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-if [ -z "$QPID_HOME" ]; then
- export QPID_HOME=$(dirname $(dirname $(dirname $(readlink -f $0))))
- export PATH=${PATH}:${QPID_HOME}/bin
-fi
-
-# Parse arguements taking all - prefixed args as JAVA_OPTS
-for arg in "$@"; do
- if [[ $arg == -java:* ]]; then
- JAVA_OPTS="${JAVA_OPTS}-`echo $arg|cut -d ':' -f 2` "
- else
- ARGS="${ARGS}$arg "
- fi
-done
-
-# Set classpath to include Qpid jar with all required jars in manifest
-QPID_LIBS=$QPID_HOME/lib/qpid-all.jar
-
-# Set other variables used by the qpid-run script before calling
-export JAVA=java \
- JAVA_VM=-server \
- JAVA_MEM=-Xmx1024m \
- QPID_CLASSPATH=$QPID_LIBS
-
-. qpid-run -Xms256m -Dlog4j.configuration=file://${QPID_HOME}/etc/perftests.log4j -Dbadger.level=warn -Damqj.test.logging.level=info -Damqj.logging.level=warn org.apache.qpid.junit.extensions.TKTestRunner %s ${ARGS}
-"""
-
-doc = mllib.xml_parse(sys.argv[1])
-dir = sys.argv[2]
-for s in doc.query["scripts/script"]:
- file = open(os.path.join(dir, "%s.sh" % s["@name"]), "w")
- file.write(template % s.text())
- file.close()
diff --git a/qpid/java/perftests/jar-with-dependencies.xml b/qpid/java/perftests/jar-with-dependencies.xml
deleted file mode 100644
index bbbbd3788e..0000000000
--- a/qpid/java/perftests/jar-with-dependencies.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- -
- http://www.apache.org/licenses/LICENSE-2.0
- -
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<!-- This is an assembly descriptor that produces a distribution that contains all the
- dependencies, with a manifest only jar that references them, required to run the
- tests of a maven project.
--->
-<assembly>
- <id>all-test-deps</id>
- <formats>
- <format>tar.gz</format>
- <format>zip</format>
- </formats>
- <includeBaseDirectory>false</includeBaseDirectory>
- <dependencySets>
- <dependencySet>
- <outputDirectory>/</outputDirectory>
- <unpack>false</unpack>
- <scope>test</scope>
- </dependencySet>
- </dependencySets>
- <fileSets>
- <fileSet>
- <directory>target/classes</directory>
- <outputDirectory></outputDirectory>
- </fileSet>
- <fileSet>
- <directory>target/test-classes</directory>
- <outputDirectory></outputDirectory>
- </fileSet>
-
- <!-- Include all the test scripts, both generated and hand-written. -->
- <fileSet>
- <directory>target</directory>
- <outputDirectory></outputDirectory>
- <includes>
- <include>*.sh</include>
- </includes>
- </fileSet>
- <fileSet>
- <directory>etc/scripts</directory>
- <outputDirectory></outputDirectory>
- <includes>
- <include>*.sh</include>
- </includes>
- </fileSet>
-
- <!-- Include all jndi configurations needed to run the tests. -->
- <fileSet>
- <directory>etc/jndi</directory>
- <outputDirectory></outputDirectory>
- <includes>
- <include>*.properties</include>
- </includes>
- </fileSet>
-
- <!-- Include the build artifact. -->
- <fileSet>
- <directory>target</directory>
- <outputDirectory></outputDirectory>
- <includes>
- <include>qpid-perftests-1.0-incubating-M2-SNAPSHOT.jar</include>
- </includes>
- </fileSet>
-
- <!-- Include the manifest with classpath jar. -->
- <fileSet>
- <directory>target</directory>
- <outputDirectory></outputDirectory>
- <includes>
- <include>qpid-perftests-${qpid.version}.jar</include>
- </includes>
- </fileSet>
-
- </fileSets>
-</assembly>
diff --git a/qpid/java/perftests/scripts.xml b/qpid/java/perftests/scripts.xml
deleted file mode 100644
index 9a5163c598..0000000000
--- a/qpid/java/perftests/scripts.xml
+++ /dev/null
@@ -1,328 +0,0 @@
-<!--
- -
- - Licensed to the Apache Software Foundation (ASF) under one
- - or more contributor license agreements. See the NOTICE file
- - distributed with this work for additional information
- - regarding copyright ownership. The ASF licenses this file
- - to you under the Apache License, Version 2.0 (the
- - "License"); you may not use this file except in compliance
- - with the License. You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing,
- - software distributed under the License is distributed on an
- - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- - KIND, either express or implied. See the License for the
- - specific language governing permissions and limitations
- - under the License.
- -
- -->
-
-<scripts>
- <!-- Single pings. These can be scaled up by overriding the parameters when calling the test script. -->
- <script name="Ping-Once">-n Ping-Once -s[1] -r 1 -t testPingOk -o . org.apache.qpid.ping.PingTestPerf</script>
- <script name="Ping-Once-Async">-n Ping-Once-Async -s[1] -r 1 -t testAsyncPingOk -o . org.apache.qpid.ping.PingAsyncTestPerf</script>
- <script name="Ping-Latency">-n Ping-Latency -s[1000] -d10S -t testPingLatency -o . org.apache.qpid.ping.PingLatencyTestPerf rate=100 batchSize=100</script>
-
- <!-- More example Tests. These are examples to exercise all the features of the test harness. Can scale up with option overrides. -->
- <script name="Ping-Tx">-n Ping-Tx -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf transacted=true</script>
- <script name="Ping-Size">-n Ping-Size -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=512</script>
- <script name="Ping-Concurrent">-n Ping-Concurrent -s[100] -c [4] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf</script>
- <script name="Ping-Many-Queues">-n Ping-Many-Queues -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf destinationCount=4</script>
- <script name="Ping-Duration">-n Ping-Duration -s[100] -d10S -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf</script>
- <script name="Ping-Rate">-n Ping-Rate -s[100] -d10S -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf rate=500</script>
- <script name="Ping-PubSub">-n Ping-PubSub -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true</script>
- <script name="Ping-Many-Topics">-n Ping-Many-Topics -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf pubsub=true destinationCount=4</script>
- <script name="Ping-Persistent">-n Ping-Persistent -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true</script>
- <script name="Ping-Batch-Logging">-n Ping-Batch-Logging -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf batchSize=10</script>
- <script name="Ping-Failover-Before-Send">-n Ping-Failover-Before-Send -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf commitBatchSize=10 failBeforeSend=true</script>
- <script name="Ping-Failover-After-Send">-n Ping-Failover-After-Send -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf commitBatchSize=10 failAfterSend=true</script>
- <script name="Ping-Failover-Before-Commit">-n Ping-Failover-Before-Commit -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf commitBatchSize=10 failBeforeCommit=true</script>
- <script name="Ping-Failover-After-Commit">-n Ping-Failover-After-Commit -s[100] -o . -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf commitBatchSize=10 failAfterCommit=true</script>
-
- <!--
- ***** If editing below, please use a non line wrapping mode and keep in columns, makes it easier to check for consistent
- ***** parameter setting accross all of the tests.
- -->
-
- <!--
- Reliability tests. The longer these tests can be run, the better.
- Tests 01 and 02 run for a short time. Use these to get an idea of the expected throughput.
- Tests 03 to 08 test all ack modes, transient/persistent, p2p/pubsub. There are 24 tests in total running for 1 hour each.
- This can be shortened or lengthened for the desired burn-in test time.
- -->
- <script name="TQR-Qpid-01">-n TQR-Qpid-01 -d1M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-02">-n TQR-Qpid-02 -d1M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-01">-n TTR-Qpid-01 -d1M -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-02">-n TTR-Qpid-02 -d1M -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-01">-n PQR-Qpid-01 -d1M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-02">-n PQR-Qpid-02 -d1M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-01">-n PTR-Qpid-01 -d1M -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-02">-n PTR-Qpid-02 -d1M -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
-
- <script name="TQR-Qpid-03-TX">-n TQR-Qpid-03 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-04-AUTOACK">-n TQR-Qpid-04 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-05-CLIENTACK">-n TQR-Qpid-05 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=2 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-06-DUPSOKACK">-n TQR-Qpid-06 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=3 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-07-NOACK">-n TQR-Qpid-07 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=257 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TQR-Qpid-08-PREACK">-n TQR-Qpid-08 -d1H -s[10000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=258 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
-
- <script name="TTR-Qpid-03-TX">-n TTR-Qpid-03 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-04-AUTOACK">-n TTR-Qpid-04 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-05-CLIENTACK">-n TTR-Qpid-05 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=2 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-06-DUPSOKACK">-n TTR-Qpid-06 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=3 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-07-NOACK">-n TTR-Qpid-07 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=257 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="TTR-Qpid-08-PREACK">-n TTR-Qpid-08 -d1H -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=258 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
-
- <script name="PQR-Qpid-03-TX">-n PQR-Qpid-03 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-04-AUTOACK">-n PQR-Qpid-04 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-05-CLIENTACK">-n PQR-Qpid-05 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=2 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-06-DUPSOKACK">-n PQR-Qpid-06 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=3 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-07-NOACK">-n PQR-Qpid-07 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=257 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PQR-Qpid-08-PREACK">-n PQR-Qpid-08 -d1H -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=258 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
-
- <script name="PTR-Qpid-03-TX">-n PTR-Qpid-03 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-04-AUTOACK">-n PTR-Qpid-04 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-05-CLIENTACK">-n PTR-Qpid-05 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=2 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-06-DUPSOKACK">-n PTR-Qpid-06 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=3 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-07-NOACK">-n PTR-Qpid-07 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=257 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
- <script name="PTR-Qpid-08-PREACK">-n PTR-Qpid-08 -d1H -s[100] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=258 commitBatchSize=10 batchSize=100000 messageSize=256 destinationCount=1 rate=0 maxPending=500000 </script>
-
- <!-- Performance Tests. -->
-
- <!-- Transient, P2P Tests -->
- <!-- Concurrency Tests : What are the effects of increasing consumers from 1...30 consumers -->
- <script name="TQCT-Qpid-01">-n TQCT-Qpid-01 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
- <script name="TQCT-Qpid-02">-n TQCT-Qpid-02 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
- <!-- Latency Tests : What are the effects on latency of increasing consumers from 1...30 consumers -->
- <script name="TQCL-Qpid-01">-n TQCL-Qpid-01 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
- <script name="TQCL-Qpid-02">-n TQCL-Qpid-02 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
-
- <!-- <script name="TQC-Qpid-05">-n TQC-Qpid-05 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
- <!-- <script name="TQC-Qpid-06">-n TQC-Qpid-06 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
-
-
- <!-- Message Size Tests : Tests sending message from 512b upto 1M with Point to Point messaging -->
- <script name="TQM-Qpid-01-512b">-n TQM-Qpid-01-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-02-512b">-n TQM-Qpid-02-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-01-1K">-n TQM-Qpid-01-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-02-1K">-n TQM-Qpid-02-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-01-5K">-n TQM-Qpid-01-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-02-5K">-n TQM-Qpid-02-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-01-10K">-n TQM-Qpid-01-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-02-10K">-n TQM-Qpid-02-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQM-Qpid-01-50K">-n TQM-Qpid-01-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-02-50K">-n TQM-Qpid-02-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-01-100K">-n TQM-Qpid-01-100K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-02-100K">-n TQM-Qpid-02-100K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-01-500K">-n TQM-Qpid-01-500K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-02-500K">-n TQM-Qpid-02-500K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-01-1M">-n TQM-Qpid-01-1M -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=100000000</script>
- <script name="TQM-Qpid-02-1M">-n TQM-Qpid-02-1M -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=100000000</script>
-
- <!-- Transient, Pub/Sub Tests -->
- <!-- Concurrency Tests : What are the effects of increasing consumers from 1...30 consumers -->
- <script name="TTCT-Qpid-01">-n TTCT-Qpid-01 -d1M -s[10] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=40 maxPending=2000000 </script>
- <script name="TTCT-Qpid-02">-n TTCT-Qpid-02 -d1M -s[10] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=40 maxPending=2000000 </script>
- <!-- Latency Tests : What are the effects on latency of increasing consumers from 1...30 consumers -->
- <script name="TTCL-Qpid-01">-n TTCL-Qpid-01 -d1M -s[10] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=40 maxPending=2000000 </script>
- <script name="TTCL-Qpid-02">-n TTCL-Qpid-02 -d1M -s[10] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=40 maxPending=2000000 </script>
-
- <!-- <script name="TTC-Qpid-05">-n TTC-Qpid-05 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
- <!-- <script name="TTC-Qpid-06">-n TTC-Qpid-06 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
-
- <!-- Message Size Tests : Tests sending message from 512b upto 1M with Point to Point messaging -->
- <script name="TTM-Qpid-01-512b">-n TTM-Qpid-01-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-02-512b">-n TTM-Qpid-02-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-01-1K">-n TTM-Qpid-01-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-02-1K">-n TTM-Qpid-02-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-01-5K">-n TTM-Qpid-01-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-02-5K">-n TTM-Qpid-02-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-01-10K">-n TTM-Qpid-01-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-02-10K">-n TTM-Qpid-02-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTM-Qpid-01-50K">-n TTM-Qpid-01-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-02-50K">-n TTM-Qpid-02-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-01-100K">-n TTM-Qpid-01-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-02-100K">-n TTM-Qpid-02-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-01-500K">-n TTM-Qpid-01-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-02-500K">-n TTM-Qpid-02-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-01-1M">-n TTM-Qpid-01-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="TTM-Qpid-02-1M">-n TTM-Qpid-02-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1048476 destinationCount=1 rate=0 maxPending=20000000</script>
-
- <!-- Persistent, P2P Tests -->
- <!-- Concurrency Tests : What are the effects of increasing consumers from 1...30 consumers -->
- <script name="PQCT-Qpid-01">-n PQCT-Qpid-01 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="PQCT-Qpid-02">-n PQCT-Qpid-02 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=100 maxPending=2000000 </script>
- <!-- Latency Tests : What are the effects on latency of increasing consumers from 1...30 consumers -->
- <script name="PQCL-Qpid-01">-n PQCL-Qpid-01 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="PQCL-Qpid-02">-n PQCL-Qpid-02 -d1M -s[1000] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=100 maxPending=2000000 </script>
-
- <!-- <script name="PQC-Qpid-05">-n PQC-Qpid-05 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
- <!-- <script name="PQC-Qpid-06">-n PQC-Qpid-06 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
-
- <!-- Message Size Tests : Tests sending message from 512b upto 1M with Point to Point messaging -->
- <script name="PQM-Qpid-01-512b">-n PQM-Qpid-01-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-02-512b">-n PQM-Qpid-02-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-01-1K">-n PQM-Qpid-01-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-02-1K">-n PQM-Qpid-02-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-01-5K">-n PQM-Qpid-01-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-02-5K">-n PQM-Qpid-02-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-01-10K">-n PQM-Qpid-01-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-02-10K">-n PQM-Qpid-02-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQM-Qpid-01-50K">-n PQM-Qpid-01-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-02-50K">-n PQM-Qpid-02-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-01-100K">-n PQM-Qpid-01-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-02-100K">-n PQM-Qpid-02-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-01-500K">-n PQM-Qpid-01-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-02-500K">-n PQM-Qpid-02-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-01-1M">-n PQM-Qpid-01-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PQM-Qpid-02-1M">-n PQM-Qpid-02-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=20000000</script>
-
- <!-- Persistent, Pub/Sub Tests -->
- <script name="PTCT-Qpid-01">-n PTCT-Qpid-01 -d1M -s[1] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=1 maxPending=2000000 </script>
- <script name="PTCT-Qpid-02">-n PTCT-Qpid-02 -d1M -s[1] -c[1:30]:samples=30 -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=1 maxPending=2000000 </script>
- <script name="PTCL-Qpid-01">-n PTCL-Qpid-01 -d1M -s[1] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=1 maxPending=2000000 </script>
- <script name="PTCL-Qpid-02">-n PTCL-Qpid-02 -d1M -s[1] -c[1:30]:samples=30 -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=1 rate=1 maxPending=2000000 </script>
-
- <!-- <script name="PTC-Qpid-05">-n PTC-Qpid-05 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
- <!-- <script name="PTC-Qpid-06">-n PTC-Qpid-06 -d10M -s[10] -c[100] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=256 destinationCount=10 rate=0 maxPending=100000 </script> -->
-
- <script name="PTM-Qpid-01-512b">-n PTM-Qpid-01-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-02-512b">-n PTM-Qpid-02-512b -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-01-1K">-n PTM-Qpid-01-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-02-1K">-n PTM-Qpid-02-1K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1024 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-01-5K">-n PTM-Qpid-01-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-02-5K">-n PTM-Qpid-02-5K -d10M -s[1000] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=5120 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-01-10K">-n PTM-Qpid-01-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-02-10K">-n PTM-Qpid-02-10K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=10240 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTM-Qpid-01-50K">-n PTM-Qpid-01-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-02-50K">-n PTM-Qpid-02-50K -d10M -s[100] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=51200 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-01-100K">-n PTM-Qpid-01-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-02-100K">-n PTM-Qpid-02-100K -d10M -s[40] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=102400 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-01-500K">-n PTM-Qpid-01-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-02-500K">-n PTM-Qpid-02-500K -d10M -s[8] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=512000 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-01-1M">-n PTM-Qpid-01-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=10 batchSize=1000 messageSize=1048576 destinationCount=1 rate=0 maxPending=20000000</script>
- <script name="PTM-Qpid-02-1M">-n PTM-Qpid-02-1M -d10M -s[4] -c[8] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=10 batchSize=1000 messageSize=1048476 destinationCount=1 rate=0 maxPending=20000000</script>
-
- <!-- Benchmarking tests. -->
- <!-- Throughput. -->
- <script name="TQBT-TX-Qpid-01">-n TQBT-TX-Qpid-01 -d10M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQBT-AA-Qpid-01">-n TQBT-AA-Qpid-01 -d10M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TQBT-NA-Qpid-01">-n TQBT-NA-Qpid-01 -d10M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTBT-TX-Qpid-01">-n TTBT-TX-Qpid-01 -d10M -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTBT-AA-Qpid-01">-n TTBT-AA-Qpid-01 -d10M -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="TTBT-NA-Qpid-01">-n TTBT-NA-Qpid-01 -d10M -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
-
- <script name="PQBT-TX-Qpid-01">-n PQBT-TX-Qpid-01 -d10M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=true consTransacted=true consAckMode=0 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PQBT-AA-Qpid-01">-n PQBT-AA-Qpid-01 -d10M -s[1000] -c[16] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=1 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTBT-TX-Qpid-01">-n PTBT-TX-Qpid-01 -d10M -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=true consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
- <script name="PTBT-AA-Qpid-01">-n PTBT-AA-Qpid-01 -d10M -s[1000] -c[2] -o $QPID_WORK/results -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=8 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=256 destinationCount=1 rate=0 maxPending=2000000 </script>
-
- <!-- Benchmark Latency testing-->
- <!-- Job Queueing. 1:10 -->
- <script name="TQBL-AA-Qpid-02-01">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=1000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-02">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=2000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-03">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=3000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-04">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=4000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-05">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=5000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-06">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=6000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-07">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=7000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-08">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=8000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-09">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=9000 maxPending=2000000 </script>
- <script name="TQBL-AA-Qpid-02-10">-n TQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=10000 maxPending=2000000 </script>
-
- <script name="PQBL-AA-Qpid-02-01">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=100 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-02">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=200 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-03">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=300 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-04">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=400 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-05">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=500 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-06">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-07">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=700 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-08">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=800 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-09">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=900 maxPending=2000000 </script>
- <script name="PQBL-AA-Qpid-02-10">-n PQBL-AA-Qpid-02 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=false uniqueDests=true numConsumers=10 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1000 messageSize=5120 destinationCount=1 rate=1000 maxPending=2000000 </script>
-
- <!-- Broadcast of small sized time critical messages. Lowish rates. Transient/Persistent. 1:100, auto ack. -->
- <script name="TTBL-AA-Qpid-03-01">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=200 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-02">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=400 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-03">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-04">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=800 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-05">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1000 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-06">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1200 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-07">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1400 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-08">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1600 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-09">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1800 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-03-10">-n TTBL-AA-Qpid-03 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
-
- <script name="PTBL-AA-Qpid-03-01">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=10 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-02">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=20 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-03">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=30 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-04">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=40 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-05">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=50 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-06">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=60 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-07">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=70 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-08">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=80 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-09">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=90 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-03-10">-n PTBL-AA-Qpid-03 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=256 destinationCount=1 rate=100 maxPending=2000000 </script>
-
- <!-- Broadcast of medium sized time critical messages. Lowish rates. Transient/Persistent. 1:100, auto ack. -->
- <script name="TTBL-AA-Qpid-04-01">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=100 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-02">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=200 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-03">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=300 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-04">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=400 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-05">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=500 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-06">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-07">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=700 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-08">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=800 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-09">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=900 maxPending=2000000 </script>
- <script name="TTBL-AA-Qpid-04-10">-n TTBL-AA-Qpid-04 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=1000 maxPending=2000000 </script>
-
- <script name="PTBL-AA-Qpid-04-01">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=10 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-02">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=20 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-03">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=30 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-04">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=40 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-05">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=50 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-06">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=60 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-07">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=70 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-08">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=80 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-09">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=90 maxPending=2000000 </script>
- <script name="PTBL-AA-Qpid-04-10">-n PTBL-AA-Qpid-04 -d1M -s[100] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=true pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=1 commitBatchSize=1 batchSize=101 messageSize=5120 destinationCount=1 rate=100 maxPending=2000000 </script>
-
- <!-- Low-latency broadcast of time sensitive events. Transient, no_ack. -->
- <script name="TTBL-NA-Qpid-05-01">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=400 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-02">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=800 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-03">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1200 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-04">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=1600 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-05">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=2000 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-06">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=2400 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-07">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=2800 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-08">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=3200 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-09">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=3600 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-05-10">-n TTBL-NA-Qpid-05 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=256 destinationCount=1 rate=4000 maxPending=2000000 </script>
-
- <!-- Low-latency broadcast of medium sized time sensitive events. Transient, no_ack. -->
- <script name="TTBL-NA-Qpid-06-01">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=100 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-02">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=200 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-03">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=300 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-04">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=400 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-05">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=500 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-06">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=600 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-07">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=700 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-08">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=800 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-09">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=900 maxPending=2000000 </script>
- <script name="TTBL-NA-Qpid-06-10">-n TTBL-NA-Qpid-06 -d1M -s[1000] -c[1] -o $QPID_WORK/results -t testPingLatency org.apache.qpid.ping.PingLatencyTestPerf persistent=false pubsub=true uniqueDests=false numConsumers=50 transacted=false consTransacted=false consAckMode=257 commitBatchSize=1 batchSize=1001 messageSize=5120 destinationCount=1 rate=1000 maxPending=2000000 </script>
-
- <!-- Failover Tests. -->
- <script name="FT-Qpid-01">-n FT-Qpid-01 -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=256 batchSize=10000 transacted=true properties=failovertest.properties failBeforeSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-02">-n FT-Qpid-02 -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=256 batchSize=10000 transacted=true properties=failovertest.properties failAfterSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-03">-n FT-Qpid-03 -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=256 batchSize=1000 transacted=true properties=failovertest.properties failAfterCommit=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-04">-n FT-Qpid-04 -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=256 batchSize=1000 properties=failovertest.properties transacted=false failBeforeSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-05">-n FT-Qpid-05 -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf messageSize=256 batchSize=1000 properties=failovertest.properties transacted=false failAfterSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-01-P">-n FT-Qpid-01-P -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true messageSize=256 batchSize=1000 transacted=true properties=failovertest.properties failBeforeSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-02-P">-n FT-Qpid-02-P -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true messageSize=256 batchSize=1000 transacted=true properties=failovertest.properties failAfterSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-03-P">-n FT-Qpid-03-P -s[2500] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true messageSize=256 batchSize=1000 transacted=true properties=failovertest.properties failAfterCommit=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-04-P">-n FT-Qpid-04-P -s[250] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true messageSize=256 batchSize=1000 properties=failovertest.properties transacted=false failBeforeSend=true -o $QPID_WORK/results</script>
- <script name="FT-Qpid-05-P">-n FT-Qpid-05-P -s[250] -t testAsyncPingOk org.apache.qpid.ping.PingAsyncTestPerf persistent=true messageSize=256 batchSize=1000 properties=failovertest.properties transacted=false failAfterSend=true -o $QPID_WORK/results</script>
-
-</scripts>
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/client/message/TestMessageFactory.java b/qpid/java/perftests/src/main/java/org/apache/qpid/client/message/TestMessageFactory.java
deleted file mode 100644
index d94ca5592b..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/client/message/TestMessageFactory.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.client.message;
-
-import javax.jms.JMSException;
-import javax.jms.Session;
-import javax.jms.ObjectMessage;
-import javax.jms.StreamMessage;
-import javax.jms.BytesMessage;
-import javax.jms.TextMessage;
-import javax.jms.DeliveryMode;
-import javax.jms.Destination;
-
-public class TestMessageFactory
-{
- private static final String MESSAGE_DATA_BYTES = "-message payload-message paylaod-message payload-message paylaod";
-
- public static TextMessage newTextMessage(Session session, int size) throws JMSException
- {
- return session.createTextMessage(createMessagePayload(size));
- }
-
- public static TextMessage newJMSTextMessage(Session session, int size, String encoding) throws JMSException
- {
-
- TextMessage message = session.createTextMessage();
- message.clearBody();
- message.setText(createMessagePayload(size));
- return message;
- }
-
- public static BytesMessage newBytesMessage(Session session, int size) throws JMSException
- {
- BytesMessage message = session.createBytesMessage();
- message.writeUTF(createMessagePayload(size));
- return message;
- }
-
- public static StreamMessage newStreamMessage(Session session, int size) throws JMSException
- {
- StreamMessage message = session.createStreamMessage();
- message.writeString(createMessagePayload(size));
- return message;
- }
-
- public static ObjectMessage newObjectMessage(Session session, int size) throws JMSException
- {
- if (size == 0)
- {
- return session.createObjectMessage();
- }
- else
- {
- return session.createObjectMessage(createMessagePayload(size));
- }
- }
-
- /**
- * Creates an ObjectMessage with given size and sets the JMS properties (JMSReplyTo and DeliveryMode)
- * @param session
- * @param replyDestination
- * @param size
- * @param persistent
- * @return the new ObjectMessage
- * @throws JMSException
- */
- public static ObjectMessage newObjectMessage(Session session, Destination replyDestination, int size, boolean persistent) throws JMSException
- {
- ObjectMessage msg = newObjectMessage(session, size);
-
- // Set the messages persistent delivery flag.
- msg.setJMSDeliveryMode(persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
-
- // Ensure that the temporary reply queue is set as the reply to destination for the message.
- if (replyDestination != null)
- {
- msg.setJMSReplyTo(replyDestination);
- }
-
- return msg;
- }
-
- public static String createMessagePayload(int size)
- {
- StringBuffer buf = new StringBuffer(size);
- int count = 0;
- while (count <= (size - MESSAGE_DATA_BYTES.length()))
- {
- buf.append(MESSAGE_DATA_BYTES);
- count += MESSAGE_DATA_BYTES.length();
- }
- if (count < size)
- {
- buf.append(MESSAGE_DATA_BYTES, 0, size - count);
- }
-
- return buf.toString();
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java b/qpid/java/perftests/src/main/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java
deleted file mode 100644
index 76fd318625..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/config/AMQConnectionFactoryInitialiser.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-import org.apache.qpid.client.AMQConnectionFactory;
-import org.apache.qpid.client.AMQConnectionURL;
-import org.apache.qpid.config.ConnectionFactoryInitialiser;
-import org.apache.qpid.config.ConnectorConfig;
-import org.apache.qpid.jms.ConnectionURL;
-import org.apache.qpid.url.URLSyntaxException;
-
-import javax.jms.ConnectionFactory;
-
-class AMQConnectionFactoryInitialiser implements ConnectionFactoryInitialiser
-{
- public ConnectionFactory getFactory(ConnectorConfig config)
- {
- try
- {
- final ConnectionURL connectionUrl = new AMQConnectionURL(ConnectionURL.AMQ_PROTOCOL +
- "://guest:guest@/test_path?brokerlist='tcp://" + config.getHost() + ":" + config.getPort() + "'");
- return new AMQConnectionFactory(connectionUrl);
- }
- catch (URLSyntaxException e)
- {
- throw new RuntimeException("Problem building URL", e);
- }
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/config/AbstractConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/config/AbstractConfig.java
deleted file mode 100644
index 14db74438f..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/config/AbstractConfig.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-public abstract class AbstractConfig
-{
- public boolean setOptions(String[] argv)
- {
- try
- {
- for(int i = 0; i < argv.length - 1; i += 2)
- {
- String key = argv[i];
- String value = argv[i+1];
- setOption(key, value);
- }
- return true;
- }
- catch(Exception e)
- {
- System.out.println(e.getMessage());
- }
- return false;
- }
-
- protected int parseInt(String msg, String i)
- {
- try
- {
- return Integer.parseInt(i);
- }
- catch(NumberFormatException e)
- {
- throw new RuntimeException(msg + ": " + i, e);
- }
- }
-
- protected long parseLong(String msg, String i)
- {
- try
- {
- return Long.parseLong(i);
- }
- catch(NumberFormatException e)
- {
- throw new RuntimeException(msg + ": " + i, e);
- }
- }
-
- public abstract void setOption(String key, String value);
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java b/qpid/java/perftests/src/main/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java
deleted file mode 100644
index a9984eb09a..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/config/ConnectionFactoryInitialiser.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-import javax.jms.ConnectionFactory;
-import javax.jms.JMSException;
-
-public interface ConnectionFactoryInitialiser
-{
- public ConnectionFactory getFactory(ConnectorConfig config) throws JMSException;
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/config/Connector.java b/qpid/java/perftests/src/main/java/org/apache/qpid/config/Connector.java
deleted file mode 100644
index 81541a3260..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/config/Connector.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-
-public class Connector
-{
- public Connection createConnection(ConnectorConfig config) throws Exception
- {
- return getConnectionFactory(config).createConnection();
- }
-
- ConnectionFactory getConnectionFactory(ConnectorConfig config) throws Exception
- {
- String factory = config.getFactory();
- if(factory == null)
- {
- factory = AMQConnectionFactoryInitialiser.class.getName();
- }
- System.out.println("Using " + factory);
- return ((ConnectionFactoryInitialiser) Class.forName(factory).newInstance()).getFactory(config);
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/config/ConnectorConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/config/ConnectorConfig.java
deleted file mode 100644
index b120ed3f12..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/config/ConnectorConfig.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-public interface ConnectorConfig
-{
- public String getHost();
- public int getPort();
- public String getFactory();
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java b/qpid/java/perftests/src/main/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java
deleted file mode 100644
index a0248a8f79..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/config/JBossConnectionFactoryInitialiser.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.config;
-
-import org.apache.qpid.config.ConnectionFactoryInitialiser;
-import org.apache.qpid.config.ConnectorConfig;
-import org.apache.qpid.client.JMSAMQException;
-
-import javax.jms.ConnectionFactory;
-import javax.jms.JMSException;
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.MBeanException;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.naming.NameNotFoundException;
-import java.util.Hashtable;
-
-public class JBossConnectionFactoryInitialiser implements ConnectionFactoryInitialiser
-{
- public ConnectionFactory getFactory(ConnectorConfig config) throws JMSException
- {
- ConnectionFactory cf = null;
- InitialContext ic = null;
- Hashtable ht = new Hashtable();
- ht.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
- String jbossHost = System.getProperty("jboss.host", "eqd-lxamq01");
- String jbossPort = System.getProperty("jboss.port", "1099");
- ht.put(InitialContext.PROVIDER_URL, "jnp://" + jbossHost + ":" + jbossPort);
- ht.put(InitialContext.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
-
- try
- {
- ic = new InitialContext(ht);
- if (!doesDestinationExist("topictest.messages", ic))
- {
- deployTopic("topictest.messages", ic);
- }
- if (!doesDestinationExist("topictest.control", ic))
- {
- deployTopic("topictest.control", ic);
- }
-
- cf = (ConnectionFactory) ic.lookup("/ConnectionFactory");
- return cf;
- }
- catch (NamingException e)
- {
- throw new JMSAMQException("Unable to lookup object: " + e, e);
- }
- catch (Exception e)
- {
- throw new JMSAMQException("Error creating topic: " + e, e);
- }
- }
-
- private boolean doesDestinationExist(String name, InitialContext ic) throws Exception
- {
- try
- {
- ic.lookup("/" + name);
- }
- catch (NameNotFoundException e)
- {
- return false;
- }
- return true;
- }
-
- private void deployTopic(String name, InitialContext ic) throws Exception
- {
- MBeanServerConnection mBeanServer = lookupMBeanServerProxy(ic);
-
- ObjectName serverObjectName = new ObjectName("jboss.messaging:service=ServerPeer");
-
- String jndiName = "/" + name;
- try
- {
- mBeanServer.invoke(serverObjectName, "createTopic",
- new Object[]{name, jndiName},
- new String[]{"java.lang.String", "java.lang.String"});
- }
- catch (MBeanException e)
- {
- System.err.println("Error: " + e);
- System.err.println("Cause: " + e.getCause());
- }
- }
-
- private MBeanServerConnection lookupMBeanServerProxy(InitialContext ic) throws NamingException
- {
- return (MBeanServerConnection) ic.lookup("jmx/invoker/RMIAdaptor");
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/AbstractRunner.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/AbstractRunner.java
new file mode 100644
index 0000000000..9e865010f8
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/AbstractRunner.java
@@ -0,0 +1,74 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.io.FileInputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+
+public class AbstractRunner
+{
+ public static final String JNDI_CONFIG_PROP = "jndi-config";
+ public static final String JNDI_CONFIG_DEFAULT = "perftests-jndi.properties";
+
+ private Map<String,String> _cliOptions = new HashMap<String, String>();
+ {
+ getCliOptions().put(JNDI_CONFIG_PROP, JNDI_CONFIG_DEFAULT);
+ }
+
+ protected Context getContext()
+ {
+ Context context = null;
+
+ try
+ {
+ final Properties properties = new Properties();
+ properties.load(new FileInputStream(getJndiConfig()));
+ context = new InitialContext(properties);
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Exception while loading JNDI properties", e);
+ }
+
+ return context;
+ }
+
+ public void parseArgumentsIntoConfig(String[] args)
+ {
+ ArgumentParser argumentParser = new ArgumentParser();
+ argumentParser.parseArgumentsIntoConfig(getCliOptions(), args);
+ }
+
+ protected String getJndiConfig()
+ {
+ return getCliOptions().get(AbstractRunner.JNDI_CONFIG_PROP);
+ }
+
+ protected Map<String,String> getCliOptions()
+ {
+ return _cliOptions;
+ }
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ArgumentParser.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ArgumentParser.java
new file mode 100644
index 0000000000..8c1f8675e3
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ArgumentParser.java
@@ -0,0 +1,44 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.util.Map;
+
+public class ArgumentParser
+{
+ public void parseArgumentsIntoConfig(Map<String, String> initialValues, String[] args)
+ {
+ for(String arg: args)
+ {
+ String[] splitArg = arg.split("=");
+ if(splitArg.length != 2)
+ {
+ throw new IllegalArgumentException("arguments must have format <name>=<value>: " + arg);
+ }
+
+ if(initialValues.put(splitArg[0], splitArg[1]) == null)
+ {
+ throw new IllegalArgumentException("not a valid configuration property: " + arg);
+ }
+ }
+
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java
new file mode 100644
index 0000000000..9c2f4a3d95
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ClientRunner.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClientRunner extends AbstractRunner
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ClientRunner.class);
+
+ public static final String NUM_OF_CLIENTS_PROP = "number-of-clients";
+
+ public static final String NUM_OF_CLIENTS_DEFAULT = "1";
+
+ public ClientRunner()
+ {
+ getCliOptions().put(NUM_OF_CLIENTS_PROP, NUM_OF_CLIENTS_DEFAULT);
+ }
+
+ public static void main(String[] args)
+ {
+ ClientRunner runner = new ClientRunner();
+ runner.parseArgumentsIntoConfig(args);
+ runner.runClients();
+ }
+
+ public void setJndiPropertiesFileLocation(String jndiConfigFileLocation)
+ {
+ getCliOptions().put(JNDI_CONFIG_PROP, jndiConfigFileLocation);
+ }
+
+ /**
+ * Run the clients in the background
+ */
+ public void runClients()
+ {
+ int numClients = Integer.parseInt(getCliOptions().get(NUM_OF_CLIENTS_PROP));
+
+ Context context = getContext();
+
+ for(int i = 1; i <= numClients; i++)
+ {
+ createBackgroundClient(context);
+ }
+ }
+
+ private void createBackgroundClient(Context context)
+ {
+ try
+ {
+ final Client client = new Client(new ClientJmsDelegate(context));
+
+ final Thread clientThread = new Thread(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ LOGGER.info("Starting client " + client.getClientName());
+ client.start();
+ client.waitUntilStopped();
+ LOGGER.info("Stopped client " + client.getClientName());
+ }
+ });
+ clientThread.start();
+ }
+ catch (NamingException e)
+ {
+ throw new DistributedTestException("Exception while creating client instance", e);
+ }
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java
new file mode 100644
index 0000000000..aa9c582bf8
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.naming.Context;
+
+import org.apache.qpid.disttest.controller.Controller;
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.controller.config.ConfigReader;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.results.aggregation.Aggregator;
+import org.apache.qpid.disttest.results.formatting.CSVFormater;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ControllerRunner extends AbstractRunner
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ControllerRunner.class);
+
+ public static final String TEST_CONFIG_PROP = "test-config";
+ public static final String DISTRIBUTED_PROP = "distributed";
+ public static final String OUTPUT_DIR_PROP = "outputdir";
+
+ private static final String TEST_CONFIG_DEFAULT = "perftests-config.json";
+ private static final String DISTRIBUTED_DEFAULT = "false";
+ private static final String OUTPUT_DIR_DEFAULT = ".";
+
+ private final Aggregator _aggregator = new Aggregator();
+
+
+ public ControllerRunner()
+ {
+ getCliOptions().put(TEST_CONFIG_PROP, TEST_CONFIG_DEFAULT);
+ getCliOptions().put(DISTRIBUTED_PROP, DISTRIBUTED_DEFAULT);
+ getCliOptions().put(OUTPUT_DIR_PROP, OUTPUT_DIR_DEFAULT);
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ ControllerRunner runner = new ControllerRunner();
+ runner.parseArgumentsIntoConfig(args);
+ runner.runController();
+ }
+
+ public void runController() throws Exception
+ {
+ Context context = getContext();
+
+ ControllerJmsDelegate jmsDelegate = new ControllerJmsDelegate(context);
+
+ try
+ {
+ runTests(jmsDelegate);
+ }
+ finally
+ {
+ jmsDelegate.closeConnections();
+ }
+ }
+
+ private void runTests(ControllerJmsDelegate jmsDelegate)
+ {
+ Controller controller = new Controller(jmsDelegate, DistributedTestConstants.REGISTRATION_TIMEOUT, DistributedTestConstants.COMMAND_RESPONSE_TIMEOUT);
+
+ final List<String> testConfigFiles = getTestConfigFiles();
+ createClientsIfNotDistributed(testConfigFiles);
+
+ try
+ {
+ for (String testConfigFile : testConfigFiles)
+ {
+ final Config testConfig = buildTestConfigFrom(testConfigFile);
+ controller.setConfig(testConfig);
+
+ controller.awaitClientRegistrations();
+
+ LOGGER.info("Running test : " + testConfigFile);
+ runTest(controller, testConfigFile);
+ }
+ }
+ finally
+ {
+ controller.stopAllRegisteredClients();
+ }
+
+ }
+
+ private void runTest(Controller controller, String testConfigFile)
+ {
+ final Config testConfig = buildTestConfigFrom(testConfigFile);
+ controller.setConfig(testConfig);
+
+ ResultsForAllTests rawResultsForAllTests = controller.runAllTests();
+ ResultsForAllTests resultsForAllTests = _aggregator.aggregateResults(rawResultsForAllTests);
+
+ final String outputFile = generateOutputCsvNameFrom(testConfigFile);
+ writeResultsToFile(resultsForAllTests, outputFile);
+ }
+
+ private void createClientsIfNotDistributed(final List<String> testConfigFiles)
+ {
+ if(!isDistributed())
+ {
+ int maxNumberOfClients = 0;
+ for (String testConfigFile : testConfigFiles)
+ {
+ final Config testConfig = buildTestConfigFrom(testConfigFile);
+ final int numClients = testConfig.getTotalNumberOfClients();
+ maxNumberOfClients = Math.max(numClients, maxNumberOfClients);
+ }
+
+ //we must create the required test clients, running in single-jvm mode
+ for (int i = 1; i <= maxNumberOfClients; i++)
+ {
+ ClientRunner clientRunner = new ClientRunner();
+ clientRunner.setJndiPropertiesFileLocation(getJndiConfig());
+ clientRunner.runClients();
+ }
+ }
+ }
+
+ private void writeResultsToFile(ResultsForAllTests resultsForAllTests, String outputFile)
+ {
+ FileWriter writer = null;
+ try
+ {
+ final String outputCsv = new CSVFormater().format(resultsForAllTests);
+ writer = new FileWriter(outputFile);
+ writer.write(outputCsv);
+ LOGGER.info("Wrote " + resultsForAllTests.getTestResults().size() + " test result(s) to output file " + outputFile);
+ }
+ catch (IOException e)
+ {
+ throw new DistributedTestException("Unable to write output file " + outputFile, e);
+ }
+ finally
+ {
+ if (writer != null)
+ {
+ try
+ {
+ writer.close();
+ }
+ catch (IOException e)
+ {
+ LOGGER.error("Failed to close stream for file " + outputFile, e);
+ }
+ }
+ }
+ }
+
+ private String generateOutputCsvNameFrom(String testConfigFile)
+ {
+ final String filenameOnlyWithExtension = new File(testConfigFile).getName();
+ final String cvsFile = filenameOnlyWithExtension.replaceFirst(".?\\w*$", ".csv");
+ final String outputDir = String.valueOf(getCliOptions().get(ControllerRunner.OUTPUT_DIR_PROP));
+
+ return new File(outputDir, cvsFile).getAbsolutePath();
+ }
+
+ private List<String> getTestConfigFiles()
+ {
+ final List<String> testConfigFile = new ArrayList<String>();
+ final File configFileOrDirectory = new File(getCliOptions().get(ControllerRunner.TEST_CONFIG_PROP));
+
+ if (configFileOrDirectory.isDirectory())
+ {
+ final String[] configFiles = configFileOrDirectory.list(new FilenameFilter()
+ {
+ @Override
+ public boolean accept(File dir, String name)
+ {
+ return new File(dir, name).isFile() && name.endsWith(".json");
+ }
+ });
+
+ for (String configFile : configFiles)
+ {
+ testConfigFile.add(new File(configFileOrDirectory, configFile).getAbsolutePath());
+ }
+ }
+ else
+ {
+ testConfigFile.add(configFileOrDirectory.getAbsolutePath());
+ }
+
+ return testConfigFile;
+ }
+
+ private Config buildTestConfigFrom(String testConfigFile)
+ {
+ ConfigReader configReader = new ConfigReader();
+ Config testConfig;
+ try
+ {
+ testConfig = configReader.getConfigFromFile(testConfigFile);
+ }
+ catch (FileNotFoundException e)
+ {
+ throw new DistributedTestException("Exception while loading test config from " + testConfigFile, e);
+ }
+ return testConfig;
+ }
+
+ private boolean isDistributed()
+ {
+ return Boolean.valueOf(getCliOptions().get(ControllerRunner.DISTRIBUTED_PROP));
+ }
+
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestConstants.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestConstants.java
new file mode 100644
index 0000000000..c4892edca9
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestConstants.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+public abstract class DistributedTestConstants
+{
+ public static final String PERF_TEST_PROPERTIES_FILE = "perftests.properties";
+
+ public static final String MSG_COMMAND_PROPERTY = "COMMAND";
+ public static final String MSG_JSON_PROPERTY = "JSON";
+
+ public static final long REGISTRATION_TIMEOUT = 60000;
+ public static final long COMMAND_RESPONSE_TIMEOUT = 10000;
+
+ public static final String CONTROLLER_QUEUE_JNDI_NAME = "controllerqueue";
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestException.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestException.java
new file mode 100644
index 0000000000..d1d24dcfff
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/DistributedTestException.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import org.apache.qpid.disttest.message.Command;
+
+public class DistributedTestException extends RuntimeException
+{
+ private static final long serialVersionUID = 1L;
+ private final Command causeCommand;
+
+ public DistributedTestException(final String message)
+ {
+ this(message, (Command) null);
+ }
+
+ public DistributedTestException(final Throwable cause)
+ {
+ this(cause, null);
+ }
+
+ public DistributedTestException(final String message, final Throwable cause)
+ {
+ this(message, cause, null);
+ }
+
+ public DistributedTestException(final String message, final Command commandCause)
+ {
+ super(message);
+ causeCommand = commandCause;
+ }
+
+ public DistributedTestException(final Throwable cause, final Command commandCause)
+ {
+ super(cause);
+ causeCommand = commandCause;
+ }
+
+ public DistributedTestException(final String message, final Throwable cause, final Command commandCause)
+ {
+ super(message, cause);
+ causeCommand = commandCause;
+ }
+
+ public Command getCauseCommand()
+ {
+ return causeCommand;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/Visitor.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/Visitor.java
new file mode 100644
index 0000000000..52dad9aa4d
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/Visitor.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * A variation of the visitor pattern that uses reflection to call the correct
+ * visit method. By convention, subclasses should provide public
+ * <pre>visit(SpecificClass)</pre> methods.
+ */
+public abstract class Visitor
+{
+
+ private static final String VISITOR_METHOD_NAME = "visit";
+
+ public void visit(Object targetObject)
+ {
+ Class<? extends Object> targetObjectClass = targetObject.getClass();
+ final Method method = findVisitMethodForTargetObjectClass(targetObjectClass);
+ invokeVisitMethod(targetObject, method);
+ }
+
+ private Method findVisitMethodForTargetObjectClass(
+ Class<? extends Object> targetObjectClass)
+ {
+ final Method method;
+ try
+ {
+ method = getClass().getDeclaredMethod(VISITOR_METHOD_NAME, targetObjectClass);
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Failed to find method " + VISITOR_METHOD_NAME + " on object of class " + targetObjectClass, e);
+ }
+ return method;
+ }
+
+ private void invokeVisitMethod(Object targetObject, final Method method)
+ {
+ try
+ {
+ method.invoke(this, targetObject);
+ }
+ catch (IllegalArgumentException e)
+ {
+ throw new DistributedTestException(e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new DistributedTestException(e);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new DistributedTestException(e.getCause());
+ }
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/Client.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/Client.java
new file mode 100644
index 0000000000..1d2d862301
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/Client.java
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.naming.NamingException;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.Visitor;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.Response;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Client
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(Client.class);
+
+ private final ClientJmsDelegate _clientJmsDelegate;
+
+ private final CountDownLatch _latch = new CountDownLatch(1);
+ private Visitor _visitor;
+ private final AtomicReference<ClientState> _state;
+ private ParticipantExecutorRegistry _participantRegistry = new ParticipantExecutorRegistry();
+
+ public Client(final ClientJmsDelegate delegate) throws NamingException
+ {
+ _clientJmsDelegate = delegate;
+ _state = new AtomicReference<ClientState>(ClientState.CREATED);
+ _visitor = new ClientCommandVisitor(this, _clientJmsDelegate);
+ }
+
+ /**
+ * Register with the controller
+ */
+ public void start()
+ {
+ _clientJmsDelegate.setInstructionListener(this);
+ _clientJmsDelegate.sendRegistrationMessage();
+ _state.set(ClientState.READY);
+ }
+
+ public void stop()
+ {
+ _state.set(ClientState.STOPPED);
+ _latch.countDown();
+ }
+
+ public void addParticipantExecutor(final ParticipantExecutor participant)
+ {
+ _participantRegistry.add(participant);
+ }
+
+ public void waitUntilStopped()
+ {
+ waitUntilStopped(0);
+ }
+
+ public void waitUntilStopped(final long timeout)
+ {
+ try
+ {
+ if (timeout == 0)
+ {
+ _latch.await();
+ }
+ else
+ {
+ _latch.await(timeout, TimeUnit.MILLISECONDS);
+ }
+ }
+ catch (final InterruptedException ie)
+ {
+ Thread.currentThread().interrupt();
+ }
+
+ _clientJmsDelegate.destroy();
+ }
+
+ public void processInstruction(final Command command)
+ {
+ if (LOGGER.isInfoEnabled())
+ {
+ LOGGER.info("Client " + getClientName() + " received command: " + command);
+ }
+ String responseMessage = null;
+ try
+ {
+ command.accept(_visitor);
+ }
+ catch (final Exception e)
+ {
+ LOGGER.error("Error processing instruction", e);
+ responseMessage = e.getMessage();
+ }
+ finally
+ {
+ _clientJmsDelegate.sendResponseMessage(new Response(_clientJmsDelegate.getClientName(), command.getType(), responseMessage));
+ }
+ }
+
+ public ClientState getState()
+ {
+ return _state.get();
+ }
+
+ public String getClientName()
+ {
+ return _clientJmsDelegate.getClientName();
+ }
+
+ public void setClientCommandVisitor(final ClientCommandVisitor visitor)
+ {
+ _visitor = visitor;
+ }
+
+ public void startTest()
+ {
+ if (_state.compareAndSet(ClientState.READY, ClientState.RUNNING_TEST))
+ {
+ try
+ {
+ _clientJmsDelegate.startConnections();
+ for (final ParticipantExecutor executor : _participantRegistry.executors())
+ {
+ executor.start(this);
+ }
+ }
+ catch (final Exception e)
+ {
+ try
+ {
+ tearDownTest();
+ }
+ catch (final Exception e2)
+ {
+ // ignore
+ }
+ throw new DistributedTestException("Error starting test: " + _clientJmsDelegate.getClientName(), e);
+ }
+ }
+ else
+ {
+ throw new DistributedTestException("Client '" + _clientJmsDelegate.getClientName()
+ + "' is not in READY state:" + _state.get());
+ }
+ }
+
+ public void tearDownTest()
+ {
+ if (_state.compareAndSet(ClientState.RUNNING_TEST, ClientState.READY))
+ {
+ LOGGER.info("Tearing down test on client: " + _clientJmsDelegate.getClientName());
+
+ _clientJmsDelegate.closeTestConnections();
+ }
+ else
+ {
+ throw new DistributedTestException("Client '" + _clientJmsDelegate.getClientName() + "' is not in RUNNING_TEST state! Ignoring tearDownTest");
+ }
+
+
+ _participantRegistry.clear();
+ }
+
+ public void sendResults(ParticipantResult testResult)
+ {
+ _clientJmsDelegate.sendResponseMessage(testResult);
+ LOGGER.info("Sent test results " + testResult);
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+ .append("clientJmsDelegate", _clientJmsDelegate).toString();
+ }
+
+ void setParticipantRegistry(ParticipantExecutorRegistry participantRegistry)
+ {
+ _participantRegistry = participantRegistry;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientCommandVisitor.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientCommandVisitor.java
new file mode 100644
index 0000000000..791897323e
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientCommandVisitor.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import org.apache.qpid.disttest.Visitor;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+
+public class ClientCommandVisitor extends Visitor
+{
+ private final Client _client;
+ private final ClientJmsDelegate _clientJmsDelegate;
+
+ public ClientCommandVisitor(final Client client, final ClientJmsDelegate clientJmsDelegate)
+ {
+ super();
+ _client = client;
+ _clientJmsDelegate = clientJmsDelegate;
+ }
+
+ public void visit(final StopClientCommand command)
+ {
+ _client.stop();
+ }
+
+ public void visit(final NoOpCommand command)
+ {
+ // no-op
+ }
+
+ public void visit(final CreateConnectionCommand command)
+ {
+ _clientJmsDelegate.createConnection(command);
+ }
+
+ public void visit(final CreateSessionCommand command)
+ {
+ _clientJmsDelegate.createSession(command);
+ }
+
+ public void visit(final CreateProducerCommand command)
+ {
+
+ final ProducerParticipant participant = new ProducerParticipant(_clientJmsDelegate, command);
+ _clientJmsDelegate.createProducer(command);
+ final ParticipantExecutor executor = new ParticipantExecutor(participant);
+ _client.addParticipantExecutor(executor);
+ }
+
+ public void visit(final CreateConsumerCommand command)
+ {
+ final ConsumerParticipant participant = new ConsumerParticipant(_clientJmsDelegate, command);
+ _clientJmsDelegate.createConsumer(command);
+ final ParticipantExecutor executor = new ParticipantExecutor(participant);
+ _client.addParticipantExecutor(executor);
+ }
+
+ public void visit(final StartTestCommand command)
+ {
+ _client.startTest();
+ }
+
+ public void visit(final TearDownTestCommand command)
+ {
+ _client.tearDownTest();
+ }
+
+ public void visit(final CreateMessageProviderCommand command)
+ {
+ _clientJmsDelegate.createMessageProvider(command);
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientState.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientState.java
new file mode 100644
index 0000000000..c88c0a6c86
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ClientState.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+public enum ClientState
+{
+ CREATED, READY, STOPPED, RUNNING_TEST;
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java
new file mode 100644
index 0000000000..1b5e8276c2
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ConsumerParticipant.java
@@ -0,0 +1,251 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+
+import java.util.Date;
+import java.util.NavigableSet;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.jms.Message;
+import javax.jms.MessageListener;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ConsumerParticipant implements Participant
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ConsumerParticipant.class);
+
+ private final AtomicInteger _totalNumberOfMessagesReceived = new AtomicInteger(0);
+ private final NavigableSet<Integer> _allConsumedPayloadSizes = new ConcurrentSkipListSet<Integer>();
+ private final AtomicLong _totalPayloadSizeOfAllMessagesReceived = new AtomicLong(0);
+ private final CountDownLatch _asyncRunHasFinished = new CountDownLatch(1);
+ private final ClientJmsDelegate _jmsDelegate;
+ private final CreateConsumerCommand _command;
+ private final ParticipantResultFactory _resultFactory;
+
+ private long _startTime;
+
+ private volatile Exception _asyncMessageListenerException;
+
+ public ConsumerParticipant(final ClientJmsDelegate delegate, final CreateConsumerCommand command)
+ {
+ _jmsDelegate = delegate;
+ _command = command;
+ _resultFactory = new ParticipantResultFactory();
+ }
+
+ @Override
+ public ParticipantResult doIt(String registeredClientName) throws Exception
+ {
+ final Date start = new Date();
+ final int acknowledgeMode = _jmsDelegate.getAcknowledgeMode(_command.getSessionName());
+
+ if (_command.getMaximumDuration() == 0 && _command.getNumberOfMessages() == 0)
+ {
+ throw new DistributedTestException("number of messages and duration cannot both be zero");
+ }
+
+ if (_command.isSynchronous())
+ {
+ synchronousRun();
+ }
+ else
+ {
+ _jmsDelegate.registerListener(_command.getParticipantName(), new MessageListener(){
+
+ @Override
+ public void onMessage(Message message)
+ {
+ processAsynchMessage(message);
+ }
+
+ });
+
+ waitUntilMsgListenerHasFinished();
+ rethrowAnyAsyncMessageListenerException();
+ }
+
+ Date end = new Date();
+ int numberOfMessagesSent = _totalNumberOfMessagesReceived.get();
+ long totalPayloadSize = _totalPayloadSizeOfAllMessagesReceived.get();
+ int payloadSize = getPayloadSizeForResultIfConstantOrZeroOtherwise(_allConsumedPayloadSizes);
+
+ ConsumerParticipantResult result = _resultFactory.createForConsumer(
+ getName(),
+ registeredClientName,
+ _command,
+ acknowledgeMode,
+ numberOfMessagesSent,
+ payloadSize,
+ totalPayloadSize,
+ start, end);
+
+ return result;
+ }
+
+ private void synchronousRun()
+ {
+ LOGGER.debug("entered synchronousRun: " + this);
+
+ _startTime = System.currentTimeMillis();
+
+ Message message = null;
+
+ do
+ {
+ message = _jmsDelegate.consumeMessage(_command.getParticipantName(),
+ _command.getReceiveTimeout());
+ } while (processMessage(message));
+ }
+
+ /**
+ * @return whether to continue running (ie returns false if the message quota has been reached)
+ */
+ private boolean processMessage(Message message)
+ {
+ int messageCount = _totalNumberOfMessagesReceived.incrementAndGet();
+ if (LOGGER.isTraceEnabled())
+ {
+ LOGGER.trace("message " + messageCount + " received by " + this);
+ }
+ int messagePayloadSize = _jmsDelegate.calculatePayloadSizeFrom(message);
+ _allConsumedPayloadSizes.add(messagePayloadSize);
+ _totalPayloadSizeOfAllMessagesReceived.addAndGet(messagePayloadSize);
+
+ boolean batchEnabled = _command.getBatchSize() > 0;
+ boolean batchComplete = batchEnabled && messageCount % _command.getBatchSize() == 0;
+
+ if (!batchEnabled || batchComplete)
+ {
+ if (LOGGER.isTraceEnabled() && batchEnabled)
+ {
+ LOGGER.trace("Committing: batch size " + _command.getBatchSize() );
+ }
+ _jmsDelegate.commitOrAcknowledgeMessage(message, _command.getSessionName());
+ }
+
+ boolean reachedExpectedNumberOfMessages = _command.getNumberOfMessages() > 0 && messageCount >= _command.getNumberOfMessages();
+ boolean reachedMaximumDuration = _command.getMaximumDuration() > 0 && System.currentTimeMillis() - _startTime >= _command.getMaximumDuration();
+ boolean finishedConsuming = reachedExpectedNumberOfMessages || reachedMaximumDuration;
+
+ if (finishedConsuming)
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("message " + messageCount
+ + " reachedExpectedNumberOfMessages " + reachedExpectedNumberOfMessages
+ + " reachedMaximumDuration " + reachedMaximumDuration);
+ }
+
+ if (batchEnabled && !batchComplete)
+ {
+ if (LOGGER.isTraceEnabled())
+ {
+ LOGGER.trace("Committing: batch size " + _command.getBatchSize() );
+ }
+
+ // commit/acknowledge remaining messages if necessary
+ _jmsDelegate.commitOrAcknowledgeMessage(message, _command.getSessionName());
+ }
+ return false;
+ }
+
+ return true;
+ }
+
+
+ /**
+ * Intended to be called from a {@link MessageListener}. Updates {@link #_asyncRunHasFinished} if
+ * no more messages should be processed, causing {@link #doIt(String)} to exit.
+ */
+ public void processAsynchMessage(Message message)
+ {
+ boolean continueRunning = true;
+ try
+ {
+ if (_startTime == 0)
+ {
+ // reset counter and start time on receiving of first message
+ _startTime = System.currentTimeMillis();
+ }
+
+ continueRunning = processMessage(message);
+ }
+ catch (Exception e)
+ {
+ LOGGER.error("Error occured consuming message " + _totalNumberOfMessagesReceived, e);
+ continueRunning = false;
+ _asyncMessageListenerException = e;
+ }
+
+ if(!continueRunning)
+ {
+ _asyncRunHasFinished.countDown();
+ }
+ }
+
+ @Override
+ public void releaseResources()
+ {
+ _jmsDelegate.closeTestConsumer(_command.getParticipantName());
+ }
+
+ private int getPayloadSizeForResultIfConstantOrZeroOtherwise(NavigableSet<Integer> allSizes)
+ {
+ return allSizes.size() == 1 ? _allConsumedPayloadSizes.first() : 0;
+ }
+
+ private void rethrowAnyAsyncMessageListenerException()
+ {
+ if (_asyncMessageListenerException != null)
+ {
+ throw new DistributedTestException(_asyncMessageListenerException);
+ }
+ }
+
+ private void waitUntilMsgListenerHasFinished() throws Exception
+ {
+ LOGGER.debug("waiting until message listener has finished for " + this);
+ _asyncRunHasFinished.await();
+ LOGGER.debug("Message listener has finished for " + this);
+ }
+
+ @Override
+ public String getName()
+ {
+ return _command.getParticipantName();
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ConsumerParticipant [_command=" + _command + ", _startTime=" + _startTime + "]";
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/MessageProvider.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/MessageProvider.java
new file mode 100644
index 0000000000..2dcf8940b6
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/MessageProvider.java
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+
+public class MessageProvider
+{
+ public static final String TTL = "ttl";
+
+ public static final String DELIVERY_MODE = "deliveryMode";
+
+ public static final String PRIORITY = "priority";
+
+ public static final String[] STANDARD_JMS_PROPERTIES = { "correlationID", DELIVERY_MODE,
+ "expiration", "messageID", PRIORITY, "redelivered", "replyTo", "timestamp", "type", TTL };
+
+ private Map<String, PropertyValue> _messageProperties;
+ private ConcurrentMap<Integer, Future<String>> _payloads;
+
+ public MessageProvider(Map<String, PropertyValue> messageProperties)
+ {
+ _messageProperties = messageProperties;
+ _payloads = new ConcurrentHashMap<Integer, Future<String>>();
+ }
+
+ public Message nextMessage(Session session, CreateProducerCommand command) throws JMSException
+ {
+ Message message = createTextMessage(session, command);
+ setMessageProperties(message);
+ return message;
+ }
+
+ public boolean isPropertySet(String name)
+ {
+ return _messageProperties != null && _messageProperties.containsKey(name);
+ }
+
+ public void setMessageProperties(Message message) throws JMSException
+ {
+ if (_messageProperties != null)
+ {
+ for (Entry<String, PropertyValue> entry : _messageProperties.entrySet())
+ {
+ String propertyName = entry.getKey();
+ Object propertyValue = entry.getValue().getValue();
+ if (isStandardProperty(propertyName))
+ {
+ setStandardProperty(message, propertyName, propertyValue);
+ }
+ else
+ {
+ setCustomProperty(message, propertyName, propertyValue);
+ }
+ }
+ }
+ }
+
+ protected void setCustomProperty(Message message, String propertyName, Object propertyValue) throws JMSException
+ {
+ if (propertyValue instanceof Integer)
+ {
+ message.setIntProperty(propertyName, ((Integer) propertyValue).intValue());
+ }
+ else if (propertyValue instanceof Long)
+ {
+ message.setLongProperty(propertyName, ((Long) propertyValue).longValue());
+ }
+ else if (propertyValue instanceof Boolean)
+ {
+ message.setBooleanProperty(propertyName, ((Boolean) propertyValue).booleanValue());
+ }
+ else if (propertyValue instanceof Byte)
+ {
+ message.setByteProperty(propertyName, ((Byte) propertyValue).byteValue());
+ }
+ else if (propertyValue instanceof Double)
+ {
+ message.setDoubleProperty(propertyName, ((Double) propertyValue).doubleValue());
+ }
+ else if (propertyValue instanceof Float)
+ {
+ message.setFloatProperty(propertyName, ((Float) propertyValue).floatValue());
+ }
+ else if (propertyValue instanceof Short)
+ {
+ message.setShortProperty(propertyName, ((Short) propertyValue).shortValue());
+ }
+ else if (propertyValue instanceof String)
+ {
+ message.setStringProperty(propertyName, (String) propertyValue);
+ }
+ else
+ {
+ message.setObjectProperty(propertyName, propertyValue);
+ }
+ }
+
+ protected void setStandardProperty(Message message, String property, Object propertyValue) throws JMSException
+ {
+ String propertyName = "JMS" + StringUtils.capitalize(property);
+ try
+ {
+ BeanUtils.setProperty(message, propertyName, propertyValue);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new DistributedTestException("Unable to set property " + propertyName + " :" + e.getMessage(), e);
+ }
+ catch (InvocationTargetException e)
+ {
+ if (e.getCause() instanceof JMSException)
+ {
+ throw ((JMSException) e.getCause());
+ }
+ else
+ {
+ throw new DistributedTestException("Unable to set property " + propertyName + " :" + e.getMessage(), e);
+ }
+ }
+ }
+
+ protected boolean isStandardProperty(String propertyName)
+ {
+ for (int i = 0; i < STANDARD_JMS_PROPERTIES.length; i++)
+ {
+ if (propertyName.equals(STANDARD_JMS_PROPERTIES[i]))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected Message createTextMessage(Session ssn, final CreateProducerCommand command) throws JMSException
+ {
+ String payload = getMessagePayload(command);
+ TextMessage msg = ssn.createTextMessage();
+ msg.setText(payload);
+ return msg;
+ }
+
+ protected String getMessagePayload(final CreateProducerCommand command)
+ {
+ FutureTask<String> createTextFuture = new FutureTask<String>(new Callable<String>()
+ {
+ @Override
+ public String call() throws Exception
+ {
+ return StringUtils.repeat("a", command.getMessageSize());
+ }
+ });
+
+ Future<String> future = _payloads.putIfAbsent(command.getMessageSize(), createTextFuture);
+ if (future == null)
+ {
+ createTextFuture.run();
+ future = createTextFuture;
+ }
+ String payload = null;
+ try
+ {
+ payload = future.get();
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Unable to create message payload :" + e.getMessage(), e);
+ }
+ return payload;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "MessageProvider [_messageProperties=" + _messageProperties + "]";
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/Participant.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/Participant.java
new file mode 100644
index 0000000000..941ec90565
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/Participant.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+
+public interface Participant
+{
+ ParticipantResult doIt(String registeredClientName) throws Exception;
+
+ void releaseResources();
+
+ String getName();
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java
new file mode 100644
index 0000000000..d5e307d50f
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutor.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ParticipantExecutor
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ParticipantExecutor.class);
+
+ private static final ExecutorService SHARED_UNBOUNDED_THREAD_POOL = Executors.newCachedThreadPool(new DaemonThreadFactory());
+
+ private Executor _executor = SHARED_UNBOUNDED_THREAD_POOL;
+
+ private Client _client;
+
+ private final Participant _participant;
+
+ private final ParticipantResultFactory _factory;
+
+ public ParticipantExecutor(Participant participant)
+ {
+ _participant = participant;
+ _factory = new ParticipantResultFactory();
+ }
+
+ /**
+ * Schedules the test participant to be run in a background thread.
+ */
+ public void start(Client client)
+ {
+ _client = client;
+
+ LOGGER.info("Starting test participant in background thread: " + this);
+ _executor.execute(new ParticipantRunnable());
+ }
+
+ public String getParticipantName()
+ {
+ return _participant.getName();
+ }
+
+ void setExecutor(Executor executor)
+ {
+ _executor = executor;
+ }
+
+ private class ParticipantRunnable implements Runnable
+ {
+ @Override
+ public final void run()
+ {
+ Thread currentThread = Thread.currentThread();
+ final String initialThreadName = currentThread.getName();
+ currentThread.setName(initialThreadName + "-" + getParticipantName());
+
+ try
+ {
+ runParticipantAndSendResults();
+ }
+ finally
+ {
+ currentThread.setName(initialThreadName);
+ }
+ }
+
+ private void runParticipantAndSendResults()
+ {
+ ParticipantResult result = null;
+ try
+ {
+ if (LOGGER.isInfoEnabled())
+ {
+ LOGGER.info("About to run participant " + _participant);
+ }
+ result = _participant.doIt(_client.getClientName());
+ }
+ catch (Throwable t)
+ {
+ String errorMessage = "Unhandled error: " + t.getMessage();
+ LOGGER.error(errorMessage, t);
+ result = _factory.createForError(_participant.getName(), _client.getClientName(), errorMessage);
+ }
+ finally
+ {
+ _client.sendResults(result);
+ _participant.releaseResources();
+ }
+ }
+ }
+
+ private static final class DaemonThreadFactory implements ThreadFactory
+ {
+ @Override
+ public Thread newThread(Runnable r)
+ {
+ Thread thread = new Thread(r);
+ thread.setDaemon(true);
+ return thread;
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+ .append("participantName", getParticipantName())
+ .append("client", _client)
+ .toString();
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutorRegistry.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutorRegistry.java
new file mode 100644
index 0000000000..3d9780e640
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantExecutorRegistry.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class ParticipantExecutorRegistry
+{
+ private final Set<ParticipantExecutor> _participantExecutors = Collections.synchronizedSet(new HashSet<ParticipantExecutor>());
+
+ public void add(ParticipantExecutor participantExecutor)
+ {
+ _participantExecutors.add(participantExecutor);
+ }
+
+ public void clear()
+ {
+ _participantExecutors.clear();
+ }
+
+ public Collection<ParticipantExecutor> executors()
+ {
+ return Collections.unmodifiableSet(_participantExecutors);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java
new file mode 100644
index 0000000000..7f6b96b87c
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ParticipantResultFactory.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.Date;
+
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateParticpantCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+
+public class ParticipantResultFactory
+{
+ public ConsumerParticipantResult createForConsumer(String participantName, String clientRegisteredName, CreateConsumerCommand command, int acknowledgeMode, int numberOfMessagesReceived, int payloadSize, long totalPayloadReceived, Date start, Date end)
+ {
+ ConsumerParticipantResult consumerParticipantResult = new ConsumerParticipantResult();
+
+ setTestProperties(consumerParticipantResult, command, participantName, clientRegisteredName, acknowledgeMode);
+ setTestResultProperties(consumerParticipantResult, numberOfMessagesReceived, payloadSize, totalPayloadReceived, start, end);
+
+ consumerParticipantResult.setTopic(command.isTopic());
+ consumerParticipantResult.setDurableSubscription(command.isDurableSubscription());
+ consumerParticipantResult.setBrowsingSubscription(command.isBrowsingSubscription());
+ consumerParticipantResult.setSelector(command.getSelector() != null);
+ consumerParticipantResult.setNoLocal(command.isNoLocal());
+ consumerParticipantResult.setSynchronousConsumer(command.isSynchronous());
+ consumerParticipantResult.setTotalNumberOfConsumers(1);
+ consumerParticipantResult.setTotalNumberOfProducers(0);
+
+ return consumerParticipantResult;
+ }
+
+ public ProducerParticipantResult createForProducer(String participantName, String clientRegisteredName, CreateProducerCommand command, int acknowledgeMode, int numberOfMessagesSent, int payloadSize, long totalPayloadSent, Date start, Date end)
+ {
+ final ProducerParticipantResult producerParticipantResult = new ProducerParticipantResult();
+
+ producerParticipantResult.setStartDelay(command.getStartDelay());
+ producerParticipantResult.setDeliveryMode(command.getDeliveryMode());
+ producerParticipantResult.setPriority(command.getPriority());
+ producerParticipantResult.setInterval(command.getInterval());
+ producerParticipantResult.setTimeToLive(command.getTimeToLive());
+ producerParticipantResult.setTotalNumberOfConsumers(0);
+ producerParticipantResult.setTotalNumberOfProducers(1);
+
+
+ setTestProperties(producerParticipantResult, command, participantName, clientRegisteredName, acknowledgeMode);
+
+ setTestResultProperties(producerParticipantResult, numberOfMessagesSent, payloadSize, totalPayloadSent, start, end);
+
+ return producerParticipantResult;
+ }
+
+ private void setTestResultProperties(final ParticipantResult participantResult, int numberOfMessagesSent, int payloadSize, long totalPayloadReceived, Date start, Date end)
+ {
+ participantResult.setNumberOfMessagesProcessed(numberOfMessagesSent);
+ participantResult.setPayloadSize(payloadSize);
+ participantResult.setTotalPayloadProcessed(totalPayloadReceived);
+ participantResult.setStartDate(start);
+ participantResult.setEndDate(end);
+ }
+
+ private void setTestProperties(final ParticipantResult participantResult, CreateParticpantCommand command, String participantName, String clientRegisteredName, int acknowledgeMode)
+ {
+ participantResult.setParticipantName(participantName);
+ participantResult.setRegisteredClientName(clientRegisteredName);
+ participantResult.setBatchSize(command.getBatchSize());
+ participantResult.setMaximumDuration(command.getMaximumDuration());
+ participantResult.setAcknowledgeMode(acknowledgeMode);
+
+ }
+
+ public ParticipantResult createForError(String participantName, String clientRegisteredName, String errorMessage)
+ {
+ ParticipantResult result = new ParticipantResult();
+ result.setParticipantName(participantName);
+ result.setRegisteredClientName(clientRegisteredName);
+ result.setErrorMessage(errorMessage);
+
+ return result;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ProducerParticipant.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ProducerParticipant.java
new file mode 100644
index 0000000000..bcad81b4aa
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/ProducerParticipant.java
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.Date;
+import java.util.NavigableSet;
+import java.util.TreeSet;
+
+import javax.jms.Message;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProducerParticipant implements Participant
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProducerParticipant.class);
+
+ private final ClientJmsDelegate _jmsDelegate;
+
+ private final CreateProducerCommand _command;
+
+ private ParticipantResultFactory _resultFactory;
+
+ public ProducerParticipant(final ClientJmsDelegate jmsDelegate, final CreateProducerCommand command)
+ {
+ _jmsDelegate = jmsDelegate;
+ _command = command;
+ _resultFactory = new ParticipantResultFactory();
+ }
+
+ @Override
+ public ParticipantResult doIt(String registeredClientName) throws Exception
+ {
+ if (_command.getMaximumDuration() == 0 && _command.getNumberOfMessages() == 0)
+ {
+ throw new DistributedTestException("number of messages and duration cannot both be zero");
+ }
+
+ int acknowledgeMode = _jmsDelegate.getAcknowledgeMode(_command.getSessionName());
+
+ long expectedDuration = _command.getMaximumDuration() - _command.getStartDelay();
+
+ doSleepForStartDelay();
+
+ final long startTime = System.currentTimeMillis();
+
+ Message lastPublishedMessage = null;
+ int numberOfMessagesSent = 0;
+ long totalPayloadSizeOfAllMessagesSent = 0;
+ NavigableSet<Integer> allProducedPayloadSizes = new TreeSet<Integer>();
+
+ while (true)
+ {
+ numberOfMessagesSent++;
+
+ lastPublishedMessage = _jmsDelegate.sendNextMessage(_command);
+
+ int lastPayloadSize = _jmsDelegate.calculatePayloadSizeFrom(lastPublishedMessage);
+ totalPayloadSizeOfAllMessagesSent += lastPayloadSize;
+ allProducedPayloadSizes.add(lastPayloadSize);
+
+ if (LOGGER.isTraceEnabled())
+ {
+ LOGGER.trace("message " + numberOfMessagesSent + " sent by " + this);
+ }
+
+ final boolean batchLimitReached = _command.getBatchSize() <= 0
+ || numberOfMessagesSent % _command.getBatchSize() == 0;
+
+ if (batchLimitReached)
+ {
+ if (LOGGER.isTraceEnabled() && _command.getBatchSize() > 0)
+ {
+ LOGGER.trace("Committing: batch size " + _command.getBatchSize() );
+ }
+ _jmsDelegate.commitOrAcknowledgeMessage(lastPublishedMessage, _command.getSessionName());
+
+ if (_command.getInterval() > 0)
+ {
+ // sleep for given time
+ Thread.sleep(_command.getInterval());
+ }
+ }
+
+ if (_command.getNumberOfMessages() > 0 && numberOfMessagesSent >= _command.getNumberOfMessages()
+ || expectedDuration > 0 && System.currentTimeMillis() - startTime >= expectedDuration)
+ {
+ break;
+ }
+ }
+
+ // commit the remaining batch messages
+ if (_command.getBatchSize() > 0 && numberOfMessagesSent % _command.getBatchSize() != 0)
+ {
+ if (LOGGER.isTraceEnabled())
+ {
+ LOGGER.trace("Committing: batch size " + _command.getBatchSize() );
+ }
+ _jmsDelegate.commitOrAcknowledgeMessage(lastPublishedMessage, _command.getSessionName());
+ }
+
+ Date start = new Date(startTime);
+ Date end = new Date();
+ int payloadSize = getPayloadSizeForResultIfConstantOrZeroOtherwise(allProducedPayloadSizes);
+
+ return _resultFactory.createForProducer(
+ getName(),
+ registeredClientName,
+ _command,
+ acknowledgeMode,
+ numberOfMessagesSent,
+ payloadSize, totalPayloadSizeOfAllMessagesSent, start, end);
+ }
+
+ private int getPayloadSizeForResultIfConstantOrZeroOtherwise(NavigableSet<Integer> allPayloadSizes)
+ {
+ return allPayloadSizes.size() == 1 ? allPayloadSizes.first() : 0;
+ }
+
+ private void doSleepForStartDelay()
+ {
+ if (_command.getStartDelay() > 0)
+ {
+ // start delay is specified. Sleeping...
+ try
+ {
+ Thread.sleep(_command.getStartDelay());
+ }
+ catch (final InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
+
+ @Override
+ public void releaseResources()
+ {
+ _jmsDelegate.closeTestProducer(_command.getParticipantName());
+ }
+
+ @Override
+ public String getName()
+ {
+ return _command.getParticipantName();
+ }
+
+ @Override
+ public String toString()
+ {
+ return "ProducerParticipant [command=" + _command + "]";
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertySupport.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertySupport.java
new file mode 100644
index 0000000000..a49ebf756e
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertySupport.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Provides support to generate message property values.
+ */
+public abstract class GeneratedPropertySupport implements GeneratedPropertyValue
+{
+ private Object _lastValue;
+
+ public GeneratedPropertySupport()
+ {
+ super();
+ _lastValue = null;
+ }
+
+ @Override
+ public Object getValue()
+ {
+ Object result = nextValue();
+ result = evaluate(result);
+ synchronized(this)
+ {
+ _lastValue = result;
+ }
+ return result;
+ }
+
+ protected Object evaluate(Object result)
+ {
+ while (result instanceof PropertyValue)
+ {
+ result = ((PropertyValue)result).getValue();
+ }
+ return result;
+ }
+
+ public abstract Object nextValue();
+
+ public synchronized Object getLastValue()
+ {
+ return _lastValue;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "GeneratedPropertyValue [value=" + getLastValue() + ", @def=" + getDefinition() + "]";
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertyValue.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertyValue.java
new file mode 100644
index 0000000000..39c093fac5
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/GeneratedPropertyValue.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Provides operations to generate message property values.
+ */
+public interface GeneratedPropertyValue extends PropertyValue
+{
+ public String getDefinition();
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/ListPropertyValue.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/ListPropertyValue.java
new file mode 100644
index 0000000000..4444351976
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/ListPropertyValue.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Provides property values from the underlining list of items.
+ */
+public class ListPropertyValue extends GeneratedPropertySupport
+{
+ public static final String DEF_VALUE = "list";
+ private List<PropertyValue> _items;
+ private boolean _cyclic;
+ private int _currentIndex;
+
+ public ListPropertyValue()
+ {
+ super();
+ _cyclic = true;
+ _currentIndex = 0;
+ _items = new ArrayList<PropertyValue>();
+ }
+
+ public synchronized void setItems(List<PropertyValue> items)
+ {
+ _items = new ArrayList<PropertyValue>(items);
+ }
+
+ public synchronized List<PropertyValue> getItems()
+ {
+ return Collections.unmodifiableList(_items);
+ }
+
+ public synchronized void setCyclic(boolean cyclic)
+ {
+ _cyclic = cyclic;
+ }
+
+ public synchronized boolean isCyclic()
+ {
+ return _cyclic;
+ }
+
+ @Override
+ public synchronized Object nextValue()
+ {
+ if (_currentIndex >= _items.size())
+ {
+ if (_cyclic)
+ {
+ _currentIndex = 0;
+ }
+ else
+ {
+ _currentIndex = _items.size() -1;
+ }
+ }
+ Object nextValue = _items.get(_currentIndex);
+ _currentIndex++;
+ return nextValue;
+ }
+
+ @Override
+ public String getDefinition()
+ {
+ return DEF_VALUE;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + _currentIndex;
+ result = prime * result + (_cyclic ? 1231 : 1237);
+ result = prime * result + ((_items == null) ? 0 : _items.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null || !(obj instanceof ListPropertyValue))
+ {
+ return false;
+ }
+ ListPropertyValue other = (ListPropertyValue) obj;
+ if (_cyclic != other._cyclic)
+ {
+ return false;
+ }
+ if (_items == null && other._items != null)
+ {
+ return false;
+ }
+ return _items.equals(other._items);
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/NumericGeneratedPropertySupport.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/NumericGeneratedPropertySupport.java
new file mode 100644
index 0000000000..e0ae137c35
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/NumericGeneratedPropertySupport.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import java.util.Arrays;
+
+/**
+ * Provides support for numeric generators with lower and upper boundaries.
+ */
+public abstract class NumericGeneratedPropertySupport extends GeneratedPropertySupport
+{
+ public static final Class<?>[] SUPPORTED_TYPES = { double.class, float.class, int.class, long.class, short.class,
+ byte.class };
+
+ private String _type;
+ private double _upper;
+ private double _lower;
+
+
+ public NumericGeneratedPropertySupport()
+ {
+ super();
+ _type = SUPPORTED_TYPES[0].getName();
+ _upper = Double.MAX_VALUE;
+ _lower = 0.0;
+ }
+
+ public synchronized String getType()
+ {
+ return _type;
+ }
+
+ public synchronized double getUpper()
+ {
+ return _upper;
+ }
+
+ public synchronized double getLower()
+ {
+ return _lower;
+ }
+
+ public synchronized void setUpper(double upper)
+ {
+ _upper = upper;
+ }
+
+ public synchronized void setLower(double lower)
+ {
+ _lower = lower;
+ }
+
+ public synchronized void setType(String type)
+ {
+ _type = toClass(type).getName();
+ }
+
+ protected Class<?> toClass(String type)
+ {
+ Class<?> t = null;
+ for (int i = 0; i < SUPPORTED_TYPES.length; i++)
+ {
+ if (SUPPORTED_TYPES[i].getName().equals(type))
+ {
+ t = SUPPORTED_TYPES[i];
+ break;
+ }
+ }
+ if (t == null)
+ {
+ throw new IllegalArgumentException("Type " + type + " is not supported: "
+ + Arrays.toString(SUPPORTED_TYPES));
+ }
+ return t;
+ }
+
+ @Override
+ public Object nextValue()
+ {
+ double result = nextDouble();
+ return doubleToNumber(result, toClass(_type));
+ }
+
+ protected Number doubleToNumber(double value, Class<?> targetType)
+ {
+ Number result = null;
+ if (targetType == double.class)
+ {
+ result = new Double(value);
+ }
+ else if (targetType == float.class)
+ {
+ result = new Float(value);
+ }
+ else if (targetType == int.class)
+ {
+ result = new Integer((int) value);
+ }
+ else if (targetType == long.class)
+ {
+ result = new Long((long) value);
+ }
+ else if (targetType == short.class)
+ {
+ result = new Short((short) value);
+ }
+ else if (targetType == byte.class)
+ {
+ result = new Byte((byte) value);
+ }
+ else
+ {
+ throw new IllegalArgumentException("Type " + targetType + " is not supported: "
+ + Arrays.toString(SUPPORTED_TYPES));
+ }
+ return result;
+ }
+
+ protected abstract double nextDouble();
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = super.hashCode();
+ long temp;
+ temp = Double.doubleToLongBits(_lower);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ result = prime * result + ((_type == null) ? 0 : _type.hashCode());
+ temp = Double.doubleToLongBits(_upper);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null || !(obj instanceof NumericGeneratedPropertySupport))
+ {
+ return false;
+ }
+ NumericGeneratedPropertySupport other = (NumericGeneratedPropertySupport) obj;
+ if (Double.doubleToLongBits(_lower) != Double.doubleToLongBits(other._lower)
+ || Double.doubleToLongBits(_upper) != Double.doubleToLongBits(other._upper))
+ {
+ return false;
+ }
+ if (_type == null && other._type != null)
+ {
+ return false;
+ }
+ else if (!_type.equals(other._type))
+ {
+ return false;
+ }
+ return true;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValue.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValue.java
new file mode 100644
index 0000000000..97adc0cee1
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValue.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Provides operations to get a message property value.
+ */
+public interface PropertyValue
+{
+ public Object getValue();
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValueFactory.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValueFactory.java
new file mode 100644
index 0000000000..fa44b2da1e
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/PropertyValueFactory.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.qpid.disttest.DistributedTestException;
+
+/**
+ * Creates property value instances using given alias (type) value.
+ */
+public class PropertyValueFactory
+{
+ public PropertyValue createPropertyValue(String type)
+ {
+ try
+ {
+ return (PropertyValue)getPropertyValueClass(type).newInstance();
+ }
+ catch(Exception e)
+ {
+ throw new DistributedTestException("Unable to create a generator for a type:" + type, e);
+ }
+ }
+
+ public Class<?> getPropertyValueClass(String type) throws ClassNotFoundException
+ {
+ String className = "org.apache.qpid.disttest.client.property." + StringUtils.capitalize(type) + "PropertyValue";
+ return Class.forName(className);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RandomPropertyValue.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RandomPropertyValue.java
new file mode 100644
index 0000000000..4f44a4bca8
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RandomPropertyValue.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Generates random property values in a given lower and upper boundaries.
+ */
+public class RandomPropertyValue extends NumericGeneratedPropertySupport
+{
+ public static final String DEF_VALUE = "random";
+
+ public RandomPropertyValue()
+ {
+ super();
+ }
+
+ @Override
+ protected double nextDouble()
+ {
+ double lower = getLower();
+ double upper = getUpper();
+ return lower + Math.random() * (upper - lower);
+ }
+
+ @Override
+ public String getDefinition()
+ {
+ return DEF_VALUE;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RangePropertyValue.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RangePropertyValue.java
new file mode 100644
index 0000000000..3aca4d4bca
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/RangePropertyValue.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Generates property values from a range with given lower and upper boundaries.
+ */
+public class RangePropertyValue extends NumericGeneratedPropertySupport
+{
+ public static final String DEF_VALUE = "range";
+ private double _step;
+ private double _currentValue;
+ private boolean _cyclic;
+
+ public RangePropertyValue()
+ {
+ super();
+ _cyclic = true;
+ _currentValue = 0.0;
+ _step = 1.0;
+ }
+
+ public synchronized double getStep()
+ {
+ return _step;
+ }
+
+ public synchronized boolean isCyclic()
+ {
+ return _cyclic;
+ }
+
+ public synchronized void setCyclic(boolean cyclic)
+ {
+ _cyclic = cyclic;
+ }
+
+ public synchronized void setStep(double step)
+ {
+ _step = step;
+ }
+
+ @Override
+ public synchronized double nextDouble()
+ {
+ double result = 0.0;
+ double lower = getLower();
+ double upper = getUpper();
+ if (_currentValue < lower)
+ {
+ _currentValue = lower;
+ }
+ else if (_currentValue > upper)
+ {
+ if (_cyclic)
+ {
+ _currentValue = lower;
+ }
+ else
+ {
+ _currentValue = upper;
+ }
+ }
+ result = _currentValue;
+ _currentValue += _step;
+ return result;
+ }
+
+ @Override
+ public String getDefinition()
+ {
+ return DEF_VALUE;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = super.hashCode();
+ long temp;
+ temp = Double.doubleToLongBits(_currentValue);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ result = prime * result + (_cyclic ? 1231 : 1237);
+ temp = Double.doubleToLongBits(_step);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (!(obj instanceof RangePropertyValue))
+ {
+ return false;
+ }
+ if (!super.equals(obj))
+ {
+ return false;
+ }
+ RangePropertyValue other = (RangePropertyValue) obj;
+ if (Double.doubleToLongBits(_currentValue) != Double.doubleToLongBits(other._currentValue)
+ || Double.doubleToLongBits(_step) != Double.doubleToLongBits(other._step) || _cyclic != other._cyclic)
+ {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/SimplePropertyValue.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/SimplePropertyValue.java
new file mode 100644
index 0000000000..9141e68656
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/client/property/SimplePropertyValue.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+/**
+ * Simple property value holder for a constant properties.
+ */
+public class SimplePropertyValue implements PropertyValue
+{
+ private Object _value;
+
+ public SimplePropertyValue()
+ {
+ super();
+ }
+
+ public SimplePropertyValue(Object value)
+ {
+ super();
+ this._value = value;
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return _value;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "SimplePropertyValue [value=" + _value + "]";
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((_value == null) ? 0 : _value.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass())
+ {
+ return false;
+ }
+ SimplePropertyValue other = (SimplePropertyValue) obj;
+ if (_value == null && other._value != null)
+ {
+ return false;
+ }
+ return _value.equals(other._value);
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java
new file mode 100644
index 0000000000..eaccb54f0e
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ClientRegistry.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.ConcurrentSkipListSet;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClientRegistry
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ClientRegistry.class);
+
+ private final Set<String> _registeredClientNames = new ConcurrentSkipListSet<String>();
+
+ private final Object _lock = new Object();
+
+ public void registerClient(String clientName)
+ {
+ final boolean alreadyContainsClient = !_registeredClientNames.add(clientName);
+ if (alreadyContainsClient)
+ {
+ throw new DistributedTestException("Duplicate client name " + clientName);
+ }
+
+ notifyAllWaiters();
+
+ if (LOGGER.isInfoEnabled())
+ {
+ LOGGER.info("Client registered: " + clientName);
+ }
+ }
+
+
+ public Collection<String> getClients()
+ {
+ return Collections.unmodifiableSet(_registeredClientNames);
+ }
+
+ public int awaitClients(int numberOfClientsToAwait, long timeout)
+ {
+ final long endTime = System.currentTimeMillis() + timeout;
+
+ int numberOfClientsAbsent = numberOfClientsToAwait - _registeredClientNames.size();
+ long remainingTimeout = endTime - System.currentTimeMillis();
+
+ while(numberOfClientsAbsent > 0 && remainingTimeout > 0)
+ {
+ synchronized (_lock)
+ {
+ try
+ {
+ _lock.wait(remainingTimeout);
+ }
+ catch (InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ numberOfClientsAbsent = numberOfClientsToAwait - _registeredClientNames.size();
+ remainingTimeout = endTime - System.currentTimeMillis();
+ }
+
+ return numberOfClientsAbsent < 0 ? 0 : numberOfClientsAbsent;
+ }
+
+ private void notifyAllWaiters()
+ {
+ synchronized (_lock)
+ {
+ _lock.notifyAll();
+ }
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandForClient.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandForClient.java
new file mode 100644
index 0000000000..6c0c253807
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandForClient.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller;
+
+import org.apache.qpid.disttest.message.Command;
+
+public class CommandForClient
+{
+ private String _clientName;
+ private Command _command;
+
+ public CommandForClient(String clientName, Command command)
+ {
+ _clientName = clientName;
+ _command = command;
+ }
+
+ public String getClientName()
+ {
+ return _clientName;
+ }
+
+ public Command getCommand()
+ {
+ return _command;
+ }
+
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandListener.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandListener.java
new file mode 100644
index 0000000000..e2f40bebe8
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/CommandListener.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller;
+
+import org.apache.qpid.disttest.message.Command;
+
+public interface CommandListener
+{
+
+ public abstract void processCommand(Command command);
+
+ public boolean supports(Command command);
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/Controller.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/Controller.java
new file mode 100644
index 0000000000..7c935065f0
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/Controller.java
@@ -0,0 +1,228 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.Collection;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.controller.config.TestInstance;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Controller
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(Controller.class);
+
+ private final long _registrationTimeout;
+ private final long _commandResponseTimeout;
+
+ private final ControllerJmsDelegate _jmsDelegate;
+
+ private volatile CountDownLatch _stopClientsResponseLatch = null;
+
+ private Config _config;
+ private TestRunnerFactory _testRunnerFactory;
+ private ClientRegistry _clientRegistry;
+
+ private long _testResultTimeout = TestRunner.WAIT_FOREVER;
+
+ public Controller(final ControllerJmsDelegate jmsDelegate, long registrationTimeout, long commandResponseTimeout)
+ {
+ _jmsDelegate = jmsDelegate;
+ _registrationTimeout = registrationTimeout;
+ _commandResponseTimeout = commandResponseTimeout;
+ _testRunnerFactory = new TestRunnerFactory();
+ _clientRegistry = new ClientRegistry();
+
+ _jmsDelegate.addCommandListener(new RegisterClientCommandListener());
+ _jmsDelegate.addCommandListener(new StopClientResponseListener());
+ _jmsDelegate.start();
+ }
+
+ public void setConfig(Config config)
+ {
+ _config = config;
+ validateConfiguration();
+ }
+
+ public void awaitClientRegistrations()
+ {
+ LOGGER.info("Awaiting client registrations");
+
+ final int numberOfAbsentClients = _clientRegistry.awaitClients(_config.getTotalNumberOfClients(), _registrationTimeout);
+ if (numberOfAbsentClients > 0)
+ {
+ String formattedMessage = String.format("Timed out waiting for registrations. Expecting %d more registrations", numberOfAbsentClients);
+ throw new DistributedTestException(formattedMessage);
+ }
+
+ }
+
+ private void validateConfiguration()
+ {
+ if (_config == null || _config.getTotalNumberOfClients() == 0)
+ {
+ throw new DistributedTestException("No controller config or no clients specified in test config");
+ }
+ }
+
+ private void awaitLatch(CountDownLatch latch, long timeout, String messageWithOneDecimalPlaceholder)
+ {
+ try
+ {
+ final boolean countedDownOK = latch.await(timeout, TimeUnit.MILLISECONDS);
+ if (!countedDownOK)
+ {
+ final long latchCount = latch.getCount();
+ String formattedMessage = String.format(messageWithOneDecimalPlaceholder, latchCount);
+ throw new DistributedTestException(formattedMessage);
+ }
+ }
+ catch (final InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ public void registerClient(final RegisterClientCommand registrationCommand)
+ {
+ final String clientName = registrationCommand.getClientName();
+
+ _jmsDelegate.registerClient(registrationCommand);
+ _clientRegistry.registerClient(clientName);
+ }
+
+ void processStopClientResponse(final Response response)
+ {
+ // TODO clientRegistry should expose a deregisterClient
+ _stopClientsResponseLatch.countDown();
+ if (response.hasError())
+ {
+ LOGGER.error("Client " + response.getRegisteredClientName() + " reported exception in response to command : " +
+ response.getErrorMessage());
+ }
+ }
+
+ public void stopAllRegisteredClients()
+ {
+ Collection<String> registeredClients = _clientRegistry.getClients();
+
+ LOGGER.info("Stopping all clients");
+ _stopClientsResponseLatch = new CountDownLatch(registeredClients.size());
+ Command command = new StopClientCommand();
+ for (final String clientName : registeredClients)
+ {
+ _jmsDelegate.sendCommandToClient(clientName, command);
+ }
+
+ awaitLatch(_stopClientsResponseLatch, _commandResponseTimeout, "Timed out waiting for stop command responses. Expecting %d more responses.");
+
+ LOGGER.info("Stopped all clients");
+ }
+
+
+ public ResultsForAllTests runAllTests()
+ {
+ LOGGER.info("Running all tests");
+
+ ResultsForAllTests resultsForAllTests = new ResultsForAllTests();
+
+ for (TestInstance testInstance : _config.getTests())
+ {
+
+ ParticipatingClients participatingClients = new ParticipatingClients(_clientRegistry, testInstance.getClientNames());
+
+ LOGGER.info("Running test " + testInstance + ". Participating clients: " + participatingClients.getRegisteredNames());
+ TestRunner runner = _testRunnerFactory.createTestRunner(participatingClients,
+ testInstance,
+ _jmsDelegate,
+ _commandResponseTimeout,
+ _testResultTimeout);
+
+ TestResult testResult = runner.run();
+ LOGGER.info("Finished test " + testInstance);
+
+ resultsForAllTests.add(testResult);
+ }
+
+ return resultsForAllTests;
+ }
+
+ private final class StopClientResponseListener implements CommandListener
+ {
+ @Override
+ public boolean supports(Command command)
+ {
+ return command.getType() == CommandType.RESPONSE && ((Response)command).getInReplyToCommandType() == CommandType.STOP_CLIENT;
+ }
+
+ @Override
+ public void processCommand(Command command)
+ {
+ processStopClientResponse((Response)command);
+ }
+ }
+
+ private final class RegisterClientCommandListener implements
+ CommandListener
+ {
+ @Override
+ public boolean supports(Command command)
+ {
+ return command.getType() == CommandType.REGISTER_CLIENT;
+ }
+
+ @Override
+ public void processCommand(Command command)
+ {
+ registerClient((RegisterClientCommand)command);
+ }
+ }
+
+ public void setTestResultTimeout(final long testResultTimeout)
+ {
+ _testResultTimeout = testResultTimeout;
+
+ }
+
+ void setClientRegistry(ClientRegistry clientRegistry)
+ {
+ _clientRegistry = clientRegistry;
+
+ }
+
+ void setTestRunnerFactory(TestRunnerFactory factory)
+ {
+ if (factory == null)
+ {
+ throw new IllegalArgumentException("TestRunnerFactory cannot be null!");
+ }
+ _testRunnerFactory = factory;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ParticipatingClients.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ParticipatingClients.java
new file mode 100644
index 0000000000..077d628697
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ParticipatingClients.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.TreeSet;
+
+import org.apache.commons.collections.BidiMap;
+import org.apache.commons.collections.bidimap.DualHashBidiMap;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+
+public class ParticipatingClients
+{
+ private final BidiMap _configuredToRegisteredNameMap;
+
+ public ParticipatingClients(ClientRegistry clientRegistry, List<String> configuredClientNamesForTest)
+ {
+ _configuredToRegisteredNameMap = mapConfiguredToRegisteredClientNames(configuredClientNamesForTest, clientRegistry);
+ }
+
+ public String getRegisteredNameFromConfiguredName(String clientConfiguredName)
+ {
+ String registeredClientName = (String) _configuredToRegisteredNameMap.get(clientConfiguredName);
+ if (registeredClientName == null)
+ {
+ throw new IllegalArgumentException("Unrecognised client configured name " + clientConfiguredName
+ + " Mapping is " + _configuredToRegisteredNameMap);
+ }
+ return registeredClientName;
+ }
+
+ public String getConfiguredNameFromRegisteredName(String registeredClientName)
+ {
+ String clientConfiguredName = (String) _configuredToRegisteredNameMap.getKey(registeredClientName);
+ if (clientConfiguredName == null)
+ {
+ throw new IllegalArgumentException("Unrecognised client registered name " + registeredClientName
+ + " Mapping is " + _configuredToRegisteredNameMap);
+ }
+
+ return clientConfiguredName;
+ }
+
+ private BidiMap mapConfiguredToRegisteredClientNames(List<String> configuredClientNamesForTest, ClientRegistry clientRegistry)
+ {
+ BidiMap configuredToRegisteredNameMap = new DualHashBidiMap();
+
+ TreeSet<String> registeredClients = new TreeSet<String>(clientRegistry.getClients());
+ for (String configuredClientName : configuredClientNamesForTest)
+ {
+ String allocatedClientName = registeredClients.pollFirst();
+ if (allocatedClientName == null)
+ {
+ throw new IllegalArgumentException("Too few clients in registry " + clientRegistry + " configured clients " + configuredClientNamesForTest);
+ }
+ configuredToRegisteredNameMap.put(configuredClientName, allocatedClientName);
+ }
+
+ return configuredToRegisteredNameMap;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Collection<String> getRegisteredNames()
+ {
+ return _configuredToRegisteredNameMap.values();
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+ .append("configuredToRegisteredNameMap", _configuredToRegisteredNameMap).toString();
+ }
+
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ResultsForAllTests.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ResultsForAllTests.java
new file mode 100644
index 0000000000..6c5ff3450c
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/ResultsForAllTests.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+
+public class ResultsForAllTests
+{
+ private List<ITestResult> _results = new ArrayList<ITestResult>();
+ private boolean _hasErrors;
+
+ public List<ITestResult> getTestResults()
+ {
+ return _results;
+ }
+
+ public void add(ITestResult testResult)
+ {
+ _results.add(testResult);
+ if(testResult.hasErrors())
+ {
+ _hasErrors = true;
+ }
+ }
+
+ public boolean hasErrors()
+ {
+ return _hasErrors;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestResult.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestResult.java
new file mode 100644
index 0000000000..756c641532
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestResult.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+
+public class TestResult implements ITestResult
+{
+ private final SortedSet<ParticipantResult> _participantResults = Collections.synchronizedSortedSet(
+ new TreeSet<ParticipantResult>(ParticipantResult.PARTICIPANT_NAME_COMPARATOR));
+
+ private boolean _hasErrors;
+ private String _name;
+
+ public TestResult(String name)
+ {
+ _name = name;
+ }
+
+ @Override
+ public List<ParticipantResult> getParticipantResults()
+ {
+ List<ParticipantResult> list = new ArrayList<ParticipantResult>(_participantResults);
+ return Collections.unmodifiableList(list);
+ }
+
+ public void addParticipantResult(ParticipantResult participantResult)
+ {
+ _participantResults.add(participantResult);
+ if(participantResult.hasError())
+ {
+ _hasErrors = true;
+ }
+ }
+
+ @Override
+ public boolean hasErrors()
+ {
+ return _hasErrors;
+ }
+
+ @Override
+ public String getName()
+ {
+ return _name;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java
new file mode 100644
index 0000000000..30595269b3
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunner.java
@@ -0,0 +1,342 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+import org.apache.qpid.disttest.controller.config.TestInstance;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestRunner
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(TestRunner.class);
+
+ private static final long PARTICIPANT_RESULTS_LOG_INTERVAL = 60000;
+ public static final long WAIT_FOREVER = -1;
+
+ private final long _commandResponseTimeout;
+
+ private final Set<CommandType> _setOfResponsesToExpect = Collections.synchronizedSet(new HashSet<CommandType>());
+
+ private final ParticipatingClients _participatingClients;
+
+ private final TestInstance _testInstance;
+ private ControllerJmsDelegate _jmsDelegate;
+
+ private volatile CountDownLatch _commandResponseLatch = null;
+ private final CountDownLatch _testResultsLatch;
+ private final TestResult _testResult;
+
+ /** Length of time to await test results or {@value #WAIT_FOREVER} */
+ private final long _testResultTimeout;
+
+ private Thread _removeQueuesShutdownHook = new Thread()
+ {
+ @Override
+ public void run()
+ {
+ LOGGER.info("Shutdown intercepted: deleting test queues");
+ try
+ {
+ deleteQueues();
+ }
+ catch (Throwable t)
+ {
+ LOGGER.error("Failed to delete test queues during shutdown", t);
+ }
+ }
+ };
+
+ public TestRunner(ParticipatingClients participatingClients, TestInstance testInstance, ControllerJmsDelegate jmsDelegate, long commandResponseTimeout, long testResultTimeout)
+ {
+ _participatingClients = participatingClients;
+ _testInstance = testInstance;
+ _jmsDelegate = jmsDelegate;
+ _commandResponseTimeout = commandResponseTimeout;
+ _testResultsLatch = new CountDownLatch(testInstance.getTotalNumberOfParticipants());
+ _testResultTimeout = testResultTimeout;
+ _testResult = new TestResult(testInstance.getName());
+ }
+
+ public TestResult run()
+ {
+ final ParticipantResultListener participantResultListener = new ParticipantResultListener();
+ TestCommandResponseListener testCommandResponseListener = new TestCommandResponseListener();
+
+ try
+ {
+ _jmsDelegate.addCommandListener(testCommandResponseListener);
+ _jmsDelegate.addCommandListener(participantResultListener);
+
+ runParts();
+
+ return _testResult;
+ }
+ finally
+ {
+ _jmsDelegate.removeCommandListener(participantResultListener);
+ _jmsDelegate.removeCommandListener(testCommandResponseListener);
+ }
+ }
+
+ private void runParts()
+ {
+ boolean queuesCreated = false;
+
+ try
+ {
+ createQueues();
+ queuesCreated = true;
+ Runtime.getRuntime().addShutdownHook(_removeQueuesShutdownHook);
+
+ sendTestSetupCommands();
+ awaitCommandResponses();
+ sendCommandToParticipatingClients(new StartTestCommand());
+ awaitCommandResponses();
+
+ awaitTestResults();
+
+ sendCommandToParticipatingClients(new TearDownTestCommand());
+ awaitCommandResponses();
+ }
+ finally
+ {
+
+ if (queuesCreated)
+ {
+ deleteQueues();
+ }
+
+ Runtime.getRuntime().removeShutdownHook(_removeQueuesShutdownHook);
+
+ }
+ }
+
+ void createQueues()
+ {
+ List<QueueConfig> queues = _testInstance.getQueues();
+ if (!queues.isEmpty())
+ {
+ _jmsDelegate.createQueues(queues);
+ }
+ }
+
+ void sendTestSetupCommands()
+ {
+ List<CommandForClient> commandsForAllClients = _testInstance.createCommands();
+ final int numberOfCommandsToSend = commandsForAllClients.size();
+ _commandResponseLatch = new CountDownLatch(numberOfCommandsToSend);
+
+ LOGGER.debug("About to send {} command(s)", numberOfCommandsToSend);
+
+ for (CommandForClient commandForClient : commandsForAllClients)
+ {
+ String configuredClientName = commandForClient.getClientName();
+ String registeredClientName = _participatingClients.getRegisteredNameFromConfiguredName(configuredClientName);
+
+ Command command = commandForClient.getCommand();
+
+ LOGGER.debug("Sending command : {} ", command);
+
+ sendCommandInternal(registeredClientName, command);
+ }
+ }
+
+ void awaitCommandResponses()
+ {
+ awaitLatch(_commandResponseLatch, _commandResponseTimeout, "Timed out waiting for command responses. Expecting %d more responses.");
+ }
+
+
+ void processCommandResponse(final Response response)
+ {
+ if (LOGGER.isDebugEnabled())
+ {
+ LOGGER.debug("Received response for command " + response);
+ }
+
+ _commandResponseLatch.countDown();
+ checkForResponseError(response);
+ }
+
+
+ void awaitTestResults()
+ {
+ long timeout = _testResultTimeout;
+ DistributedTestException lastException = null;
+
+ boolean waitForever = _testResultTimeout == WAIT_FOREVER;
+ final long interval = waitForever ? PARTICIPANT_RESULTS_LOG_INTERVAL : Math.min(PARTICIPANT_RESULTS_LOG_INTERVAL, _testResultTimeout);
+
+ while(_testResultsLatch.getCount() > 0 && (waitForever || timeout > 0))
+ {
+ try
+ {
+ awaitLatch(_testResultsLatch, interval, "Waiting for participant results... Expecting %d more responses.");
+ }
+ catch (DistributedTestException e)
+ {
+ lastException = e;
+ LOGGER.info(e.getMessage());
+ }
+
+ if (!waitForever)
+ {
+ timeout =- interval;
+ }
+ }
+
+ if (_testResultsLatch.getCount() > 0)
+ {
+ throw lastException;
+ }
+ }
+
+ void deleteQueues()
+ {
+ List<QueueConfig> queues = _testInstance.getQueues();
+ if (!queues.isEmpty())
+ {
+ _jmsDelegate.deleteQueues(queues);
+ }
+ }
+
+ void sendCommandToParticipatingClients(final Command command)
+ {
+ Collection<String> participatingRegisteredClients = _participatingClients.getRegisteredNames();
+ final int numberOfClients = participatingRegisteredClients.size();
+ _commandResponseLatch = new CountDownLatch(numberOfClients);
+
+ LOGGER.debug("About to send command {} to {} clients", command, numberOfClients);
+
+ for (final String clientName : participatingRegisteredClients)
+ {
+ LOGGER.debug("Sending command : {} ", command);
+ sendCommandInternal(clientName, command);
+ }
+ }
+
+ public void processParticipantResult(ParticipantResult result)
+ {
+ setOriginalTestDetailsOn(result);
+
+ _testResult.addParticipantResult(result);
+ LOGGER.info("Received result " + result);
+
+ _testResultsLatch.countDown();
+ checkForResponseError(result);
+ }
+
+ private void setOriginalTestDetailsOn(ParticipantResult result)
+ {
+ // Client knows neither the configured client name nor test name
+ String registeredClientName = result.getRegisteredClientName();
+ String configuredClient = _participatingClients.getConfiguredNameFromRegisteredName(registeredClientName);
+
+ result.setConfiguredClientName(configuredClient);
+ result.setTestName(_testInstance.getName());
+ result.setIterationNumber(_testInstance.getIterationNumber());
+ }
+
+ private void sendCommandInternal(String registeredClientName, Command command)
+ {
+ _setOfResponsesToExpect.add(command.getType());
+ _jmsDelegate.sendCommandToClient(registeredClientName, command);
+ }
+
+ private void awaitLatch(CountDownLatch latch, long timeout, String messageWithOneDecimalPlaceholder)
+ {
+ try
+ {
+ final boolean countedDownOK = latch.await(timeout, TimeUnit.MILLISECONDS);
+ if (!countedDownOK)
+ {
+ final long latchCount = latch.getCount();
+ String formattedMessage = String.format(messageWithOneDecimalPlaceholder, latchCount);
+ throw new DistributedTestException(formattedMessage);
+ }
+ }
+ catch (final InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ private void checkForResponseError(final Response response)
+ {
+ if (response.hasError())
+ {
+ LOGGER.error("Client " + response.getRegisteredClientName() + " reported error " + response);
+ }
+ }
+
+ final class ParticipantResultListener implements CommandListener
+ {
+ @Override
+ public boolean supports(Command command)
+ {
+ return command instanceof ParticipantResult;
+ }
+
+ @Override
+ public void processCommand(Command command)
+ {
+ processParticipantResult((ParticipantResult) command);
+
+ }
+ }
+
+ final class TestCommandResponseListener implements CommandListener
+ {
+ @Override
+ public void processCommand(Command command)
+ {
+ processCommandResponse((Response)command);
+ }
+
+ @Override
+ public boolean supports(Command command)
+ {
+ CommandType type = command.getType();
+ if (type == CommandType.RESPONSE)
+ {
+ Response response = (Response)command;
+ return _setOfResponsesToExpect.contains(response.getInReplyToCommandType());
+ }
+ return false;
+ }
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunnerFactory.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunnerFactory.java
new file mode 100644
index 0000000000..bf0e5afb9c
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/TestRunnerFactory.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller;
+
+import org.apache.qpid.disttest.controller.config.TestInstance;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+
+public class TestRunnerFactory
+{
+ public TestRunner createTestRunner(ParticipatingClients participatingClients, TestInstance testInstance, ControllerJmsDelegate jmsDelegate, long commandResponseTimeout, long testResultTimeout)
+ {
+ return new TestRunner(participatingClients, testInstance, jmsDelegate, commandResponseTimeout, testResultTimeout);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ClientConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ClientConfig.java
new file mode 100644
index 0000000000..4353a85cd3
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ClientConfig.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.Command;
+
+public class ClientConfig
+{
+ /*
+ * TODO add this field when repeating groups of clients need to be used. Talk to Phil and Keith!
+ * private int _instances;
+ */
+
+ private List<ConnectionConfig> _connections;
+ private List<MessageProviderConfig> _messageProviders;
+ private String _name;
+
+ public ClientConfig()
+ {
+ _name = null;
+ _connections = Collections.emptyList();
+ _messageProviders = Collections.emptyList();
+ }
+
+ public ClientConfig(String name, ConnectionConfig... connections)
+ {
+ this(name, Arrays.asList(connections), null);
+ }
+
+ public ClientConfig(String name, List<ConnectionConfig> connections, List<MessageProviderConfig> messageProviders)
+ {
+ _name = name;
+ _connections = connections;
+ if (messageProviders == null)
+ {
+ _messageProviders = Collections.emptyList();
+ }
+ else
+ {
+ _messageProviders = messageProviders;
+ }
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public List<ConnectionConfig> getConnections()
+ {
+ return Collections.unmodifiableList(_connections);
+ }
+
+ public List<CommandForClient> createCommands()
+ {
+ List<CommandForClient> commandsForClient = new ArrayList<CommandForClient>();
+
+ for (MessageProviderConfig messageProvider : _messageProviders)
+ {
+ Command command = messageProvider.createCommand();
+ commandsForClient.add(new CommandForClient(_name, command));
+ }
+ for (ConnectionConfig connection : _connections)
+ {
+ List<Command> commands = connection.createCommands();
+ for (Command command : commands)
+ {
+ commandsForClient.add(new CommandForClient(_name, command));
+ }
+ }
+ return commandsForClient;
+ }
+
+ public int getTotalNumberOfParticipants()
+ {
+ int numOfParticipants = 0;
+ for (ConnectionConfig connection : _connections)
+ {
+ numOfParticipants = numOfParticipants + connection.getTotalNumberOfParticipants();
+ }
+ return numOfParticipants;
+ }
+
+ public List<MessageProviderConfig> getMessageProviders()
+ {
+ return Collections.unmodifiableList(_messageProviders);
+ }
+
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/Config.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/Config.java
new file mode 100644
index 0000000000..fe56137276
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/Config.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class Config
+{
+ private List<TestConfig> _tests;
+
+ public Config()
+ {
+ super();
+ _tests = Collections.emptyList();
+ }
+
+ public Config(TestConfig... tests)
+ {
+ _tests = Arrays.asList(tests);
+ }
+
+ public List<TestInstance> getTests()
+ {
+ List<TestInstance> testInstances = new ArrayList<TestInstance>();
+ for (TestConfig testConfig : _tests)
+ {
+ int iterationNumber = 0;
+
+ List<IterationValue> iterationValues = testConfig.getIterationValues();
+ if(iterationValues.isEmpty())
+ {
+ testInstances.add(new TestInstance(testConfig));
+ }
+ else
+ {
+ for (IterationValue iterationValue : iterationValues)
+ {
+ testInstances.add(new TestInstance(testConfig, iterationNumber, iterationValue));
+ iterationNumber++;
+ }
+ }
+ }
+
+ return Collections.unmodifiableList(testInstances);
+ }
+
+ List<TestConfig> getTestConfigs()
+ {
+ return Collections.unmodifiableList(_tests);
+ }
+
+ public int getTotalNumberOfClients()
+ {
+ int numberOfClients = 0;
+ for (TestConfig testConfig : _tests)
+ {
+ numberOfClients = Math.max(testConfig.getTotalNumberOfClients(), numberOfClients);
+ }
+ return numberOfClients;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java
new file mode 100644
index 0000000000..6288b42eac
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.Reader;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.json.PropertyValueAdapter;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+public class ConfigReader
+{
+
+ public Config getConfigFromFile(String fileName) throws FileNotFoundException
+ {
+ FileReader reader = new FileReader(fileName);
+
+ Config config = readConfig(reader);
+ return config;
+ }
+
+ public Config readConfig(Reader reader)
+ {
+ Gson gson = new GsonBuilder()
+ .registerTypeAdapter(PropertyValue.class, new PropertyValueAdapter())
+ .create();
+ Config config = gson.fromJson(reader, Config.class);
+ return config;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConnectionConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConnectionConfig.java
new file mode 100644
index 0000000000..e2cc31e21e
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConnectionConfig.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+
+public class ConnectionConfig
+{
+ private String _name;
+ private List<SessionConfig> _sessions;
+ private String _factory;
+
+ // For Gson
+ public ConnectionConfig()
+ {
+ super();
+ _sessions = Collections.emptyList();
+ }
+
+ public ConnectionConfig(String name, String factory, SessionConfig... sessions)
+ {
+ super();
+ _name = name;
+ _factory = factory;
+ _sessions = Arrays.asList(sessions);
+
+ }
+
+ public List<SessionConfig> getSessions()
+ {
+ return Collections.unmodifiableList(_sessions);
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public List<Command> createCommands()
+ {
+ List<Command> commands = new ArrayList<Command>();
+ commands.add(createCommand());
+ for (SessionConfig sessionConfig : _sessions)
+ {
+ commands.addAll(sessionConfig.createCommands(_name));
+ }
+ return commands;
+ }
+
+ private CreateConnectionCommand createCommand()
+ {
+ CreateConnectionCommand command = new CreateConnectionCommand();
+ command.setConnectionName(_name);
+ command.setConnectionFactoryName(_factory);
+ return command;
+ }
+
+ public int getTotalNumberOfParticipants()
+ {
+ int numOfParticipants = 0;
+
+ for (SessionConfig sessionConfig : _sessions)
+ {
+ numOfParticipants = numOfParticipants + sessionConfig.getTotalNumberOfParticipants();
+ }
+ return numOfParticipants;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java
new file mode 100644
index 0000000000..ed47e02667
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConsumerConfig.java
@@ -0,0 +1,65 @@
+package org.apache.qpid.disttest.controller.config;
+
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+
+public class ConsumerConfig extends ParticipantConfig
+{
+ private boolean _isTopic;
+ private boolean _isDurableSubscription;
+ private boolean _isBrowsingSubscription;
+ private String _selector;
+ private boolean _noLocal;
+ private boolean _synchronous;
+
+ // For Gson
+ public ConsumerConfig()
+ {
+ _isTopic = false;
+ _isDurableSubscription = false;
+ _isBrowsingSubscription = false;
+ _selector = null;
+ _noLocal = false;
+ _synchronous = true;
+ }
+
+ public ConsumerConfig(
+ String consumerName,
+ String destinationName,
+ long numberOfMessages,
+ int batchSize,
+ long maximumDuration,
+ boolean isTopic,
+ boolean isDurableSubscription,
+ boolean isBrowsingSubscription,
+ String selector,
+ boolean noLocal,
+ boolean synchronous)
+ {
+ super(consumerName, destinationName, numberOfMessages, batchSize, maximumDuration);
+
+ _isTopic = isTopic;
+ _isDurableSubscription = isDurableSubscription;
+ _isBrowsingSubscription = isBrowsingSubscription;
+ _selector = selector;
+ _noLocal = noLocal;
+ _synchronous = synchronous;
+ }
+
+ public CreateConsumerCommand createCommand(String sessionName)
+ {
+ CreateConsumerCommand createConsumerCommand = new CreateConsumerCommand();
+
+ setParticipantProperties(createConsumerCommand);
+
+ createConsumerCommand.setSessionName(sessionName);
+ createConsumerCommand.setTopic(_isTopic);
+ createConsumerCommand.setDurableSubscription(_isDurableSubscription);
+ createConsumerCommand.setBrowsingSubscription(_isBrowsingSubscription);
+ createConsumerCommand.setSelector(_selector);
+ createConsumerCommand.setNoLocal(_noLocal);
+ createConsumerCommand.setSynchronous(_synchronous);
+
+ return createConsumerCommand;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/IterationValue.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/IterationValue.java
new file mode 100644
index 0000000000..ef953a5d07
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/IterationValue.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.beanutils.BeanUtilsBean;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.message.Command;
+
+public class IterationValue
+{
+ private final Map<String, String> _iterationPropertyValuesWithUnderscores;
+
+ public IterationValue(Map<String, String> iterationMap)
+ {
+ _iterationPropertyValuesWithUnderscores = iterationMap;
+ }
+
+ public IterationValue()
+ {
+ _iterationPropertyValuesWithUnderscores = Collections.emptyMap();
+ }
+
+ public Map<String, String> getIterationPropertyValuesWithUnderscores()
+ {
+ return _iterationPropertyValuesWithUnderscores;
+ }
+
+ public void applyToCommand(Command command)
+ {
+ try
+ {
+ Map<String, String> withoutUnderscoresToMatchCommandPropertyNames = getIterationPropertyValuesWithoutUnderscores();
+ BeanUtilsBean.getInstance().copyProperties(command, withoutUnderscoresToMatchCommandPropertyNames);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new RuntimeException("Couldn't copy properties from iteration " + this + " to " + command, e);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new RuntimeException("Couldn't copy properties from iteration " + this + " to " + command, e);
+ }
+ }
+
+ private Map<String, String> getIterationPropertyValuesWithoutUnderscores()
+ {
+ Map<String, String> iterationPropertyValues = new HashMap<String, String>();
+ for (String propertyNameWithUnderscore : _iterationPropertyValuesWithUnderscores.keySet())
+ {
+ String propertyName = propertyNameWithUnderscore.replaceFirst("_", "");
+ String propertyValue = _iterationPropertyValuesWithUnderscores.get(propertyNameWithUnderscore);
+
+ iterationPropertyValues.put(propertyName, propertyValue);
+ }
+ return iterationPropertyValues;
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("iterationMap", _iterationPropertyValuesWithUnderscores).toString();
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/MessageProviderConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/MessageProviderConfig.java
new file mode 100644
index 0000000000..318ec7f045
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/MessageProviderConfig.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.Map;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+
+public class MessageProviderConfig
+{
+ private String _name;
+ private Map<String, PropertyValue> _messageProperties;
+
+ public MessageProviderConfig()
+ {
+ super();
+ }
+
+ public MessageProviderConfig(String name, Map<String, PropertyValue> messageProperties)
+ {
+ super();
+ _name = name;
+ _messageProperties = messageProperties;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public Map<String, PropertyValue> getMessageProperties()
+ {
+ return _messageProperties;
+ }
+
+ public CreateMessageProviderCommand createCommand()
+ {
+ CreateMessageProviderCommand command = new CreateMessageProviderCommand();
+ command.setProviderName(_name);
+ command.setMessageProperties(_messageProperties);
+ return command;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ParticipantConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ParticipantConfig.java
new file mode 100644
index 0000000000..31037a3038
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ParticipantConfig.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import org.apache.qpid.disttest.message.CreateParticpantCommand;
+
+public abstract class ParticipantConfig
+{
+ private String _destinationName;
+ private long _numberOfMessages;
+ private String _name;
+ private int _batchSize;
+ private long _maximumDuration;
+
+ // For GSON
+ public ParticipantConfig()
+ {
+ _name = null;
+ _destinationName = null;
+ _numberOfMessages = 0;
+ _batchSize = 0;
+ _maximumDuration = 0;
+ }
+
+ public ParticipantConfig(
+ String name,
+ String destinationName,
+ long numberOfMessages,
+ int batchSize,
+ long maximumDuration)
+ {
+ _name = name;
+ _destinationName = destinationName;
+ _numberOfMessages = numberOfMessages;
+ _batchSize = batchSize;
+ _maximumDuration = maximumDuration;
+ }
+
+ protected void setParticipantProperties(CreateParticpantCommand createParticipantCommand)
+ {
+ createParticipantCommand.setParticipantName(_name);
+ createParticipantCommand.setDestinationName(_destinationName);
+ createParticipantCommand.setNumberOfMessages(_numberOfMessages);
+ createParticipantCommand.setBatchSize(_batchSize);
+ createParticipantCommand.setMaximumDuration(_maximumDuration);
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java
new file mode 100644
index 0000000000..7806528a8c
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import javax.jms.Message;
+
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+
+public class ProducerConfig extends ParticipantConfig
+{
+ private int _deliveryMode;
+ private int _messageSize;
+ private int _priority;
+ private long _timeToLive;
+ private long _interval;
+ private long _startDelay;
+ private String _messageProviderName;
+
+ // For Gson
+ public ProducerConfig()
+ {
+ _deliveryMode = Message.DEFAULT_DELIVERY_MODE;
+ _messageSize = 0;
+ _priority = Message.DEFAULT_PRIORITY;
+ _timeToLive = Message.DEFAULT_TIME_TO_LIVE;
+ _interval = 0;
+ _startDelay = 0;
+ _messageProviderName = null;
+ }
+
+ public ProducerConfig(
+ String producerName,
+ String destinationName,
+ long numberOfMessages,
+ int batchSize,
+ long maximumDuration,
+ int deliveryMode,
+ int messageSize,
+ int priority,
+ long timeToLive,
+ long interval,
+ long startDelay,
+ String messageProviderName)
+ {
+ super(producerName, destinationName, numberOfMessages, batchSize, maximumDuration);
+
+ _deliveryMode = deliveryMode;
+ _messageSize = messageSize;
+ _priority = priority;
+ _timeToLive = timeToLive;
+ _interval = interval;
+ _startDelay = startDelay;
+ _messageProviderName = messageProviderName;
+ }
+
+ public CreateProducerCommand createCommand(String sessionName)
+ {
+ CreateProducerCommand command = new CreateProducerCommand();
+
+ setParticipantProperties(command);
+
+ command.setSessionName(sessionName);
+ command.setDeliveryMode(_deliveryMode);
+ command.setMessageSize(_messageSize);
+ command.setPriority(_priority);
+ command.setTimeToLive(_timeToLive);
+ command.setInterval(_interval);
+ command.setStartDelay(_startDelay);
+ command.setMessageProviderName(_messageProviderName);
+
+ return command;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/QueueConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/QueueConfig.java
new file mode 100644
index 0000000000..cffc2b7c50
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/QueueConfig.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.commons.lang.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+
+public class QueueConfig
+{
+ private String _name;
+ private boolean _durable;
+ private Map<String, Object> _attributes;
+
+ public QueueConfig()
+ {
+ super();
+ _attributes = Collections.emptyMap();
+ }
+
+ public QueueConfig(String name, boolean durable, Map<String, Object> attributes)
+ {
+ super();
+ this._name = name;
+ this._durable = durable;
+ this._attributes = attributes;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ // TODO x-qpid-capacity and x-qpid-flow-resume-capacity need to be typed as numeric but we currrently
+ // pass these as a string.
+ public Map<String, Object> getAttributes()
+ {
+ return _attributes;
+ }
+
+ public boolean isDurable()
+ {
+ return _durable;
+ }
+
+ @Override
+ public String toString()
+ {
+ return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/SessionConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/SessionConfig.java
new file mode 100644
index 0000000000..12372e5391
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/SessionConfig.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+
+public class SessionConfig
+{
+ private static final List<ProducerConfig> EMPTY_PRODUCER_LIST = Collections.emptyList();
+ private static final List<ConsumerConfig> EMPTY_CONSUMER_LIST = Collections.emptyList();
+
+ private int _acknowledgeMode;
+ private String _sessionName;
+ private List<ProducerConfig> _producers;
+ private List<ConsumerConfig> _consumers;
+
+ // For Gson
+ public SessionConfig()
+ {
+ this(null, Session.SESSION_TRANSACTED, EMPTY_CONSUMER_LIST, EMPTY_PRODUCER_LIST);
+ }
+
+ public SessionConfig(String sessionName, int acknowledgeMode, ProducerConfig...producers)
+ {
+ this(sessionName, acknowledgeMode, EMPTY_CONSUMER_LIST, Arrays.asList(producers));
+ }
+
+ public SessionConfig(String sessionName, int acknowledgeMode, ConsumerConfig... consumers)
+ {
+ this(sessionName, acknowledgeMode, Arrays.asList(consumers), EMPTY_PRODUCER_LIST);
+ }
+
+ public SessionConfig(String sessionName, int acknowledgeMode, List<ConsumerConfig> consumers, List<ProducerConfig> producers)
+ {
+ _sessionName = sessionName;
+ _acknowledgeMode = acknowledgeMode;
+ _consumers = consumers;
+ _producers = producers;
+ }
+
+ public int getAcknowledgeMode()
+ {
+ return _acknowledgeMode;
+ }
+
+ public String getSessionName()
+ {
+ return _sessionName;
+ }
+
+ public List<ProducerConfig> getProducers()
+ {
+ return Collections.unmodifiableList(_producers);
+ }
+
+ public List<ConsumerConfig> getConsumers()
+ {
+ return Collections.unmodifiableList(_consumers);
+ }
+
+ public List<Command> createCommands(String connectionName)
+ {
+ List<Command> commands = new ArrayList<Command>();
+ commands.add(createCommand(connectionName));
+ for (ProducerConfig producer : _producers)
+ {
+ commands.add(producer.createCommand(_sessionName));
+ }
+ for (ConsumerConfig consumer : _consumers)
+ {
+ commands.add(consumer.createCommand(_sessionName));
+ }
+ return commands;
+ }
+
+ private CreateSessionCommand createCommand(String connectionName)
+ {
+ CreateSessionCommand command = new CreateSessionCommand();
+ command.setAcknowledgeMode(_acknowledgeMode);
+ command.setConnectionName(connectionName);
+ command.setSessionName(_sessionName);
+ return command;
+ }
+
+ public int getTotalNumberOfParticipants()
+ {
+ return _producers.size() + _consumers.size();
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestConfig.java
new file mode 100644
index 0000000000..2bb5f1b289
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestConfig.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.qpid.disttest.controller.CommandForClient;
+
+public class TestConfig
+{
+ private final String _name;
+
+ private final List<ClientConfig> _clients;
+
+ private final List<QueueConfig> _queues;
+
+ private final List<Map<String, String>> _iterations;
+
+ public TestConfig()
+ {
+ _clients = Collections.emptyList();
+ _queues = Collections.emptyList();
+ _name = null;
+ _iterations = Collections.emptyList();
+ }
+
+ public TestConfig(String name, ClientConfig[] clients, QueueConfig[] queues)
+ {
+ _clients = Arrays.asList(clients);
+ _queues = Arrays.asList(queues);
+ _name = name;
+ _iterations = Collections.emptyList();
+ }
+
+ public List<String> getClientNames()
+ {
+ List<String> clientNames = new ArrayList<String>();
+ for (ClientConfig clientConfig : _clients)
+ {
+ clientNames.add(clientConfig.getName());
+ }
+ return clientNames;
+ }
+
+ public int getTotalNumberOfClients()
+ {
+ return _clients.size();
+ }
+
+ public int getTotalNumberOfParticipants()
+ {
+ int numOfParticipants = 0;
+ for (ClientConfig client : _clients)
+ {
+ numOfParticipants = numOfParticipants + client.getTotalNumberOfParticipants();
+ }
+ return numOfParticipants;
+ }
+
+ public List<CommandForClient> createCommands()
+ {
+ List<CommandForClient> commandsForClients = new ArrayList<CommandForClient>();
+ for (ClientConfig client : _clients)
+ {
+ commandsForClients.addAll(client.createCommands());
+ }
+
+ return Collections.unmodifiableList(commandsForClients);
+ }
+
+ public List<QueueConfig> getQueues()
+ {
+ return Collections.unmodifiableList(_queues);
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public List<IterationValue> getIterationValues()
+ {
+ List<IterationValue> iterationValues = new ArrayList<IterationValue>();
+ for (Map<String, String> iterationMap : _iterations)
+ {
+ iterationValues.add(new IterationValue(iterationMap));
+ }
+
+ return iterationValues;
+ }
+
+ public List<ClientConfig> getClients()
+ {
+ return Collections.unmodifiableList(_clients);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestInstance.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestInstance.java
new file mode 100644
index 0000000000..9f555ef4da
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/TestInstance.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.Command;
+
+public class TestInstance
+{
+ private static final IterationValue EMPTY_ITERATION_VALUES = new IterationValue();
+
+ private TestConfig _testConfig;
+ private IterationValue _iterationValue;
+ private int _iterationNumber;
+
+ public TestInstance(TestConfig testConfig, int iterationNumber, IterationValue iterationValue)
+ {
+ _testConfig = testConfig;
+ _iterationNumber = iterationNumber;
+ _iterationValue = iterationValue;
+ }
+
+ public TestInstance(TestConfig testConfig)
+ {
+ this(testConfig, 0, EMPTY_ITERATION_VALUES);
+ }
+
+ public List<CommandForClient> createCommands()
+ {
+ List<CommandForClient> commands = _testConfig.createCommands();
+ List<CommandForClient> newCommands = new ArrayList<CommandForClient>(commands.size());
+
+ for (CommandForClient commandForClient : commands)
+ {
+ String clientName = commandForClient.getClientName();
+ Command command = commandForClient.getCommand();
+
+ _iterationValue.applyToCommand(command);
+
+ newCommands.add(new CommandForClient(clientName, command));
+ }
+
+ return newCommands;
+
+ }
+
+ public String getName()
+ {
+ return _testConfig.getName();
+ }
+
+ public int getIterationNumber()
+ {
+ return _iterationNumber;
+ }
+
+ public int getTotalNumberOfParticipants()
+ {
+ return _testConfig.getTotalNumberOfParticipants();
+ }
+
+ public List<QueueConfig> getQueues()
+ {
+ return _testConfig.getQueues();
+ }
+
+ public List<String> getClientNames()
+ {
+ return _testConfig.getClientNames();
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
+ .append("testName", getName())
+ .append("iterationNumber", _iterationNumber)
+ .toString();
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ClientJmsDelegate.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ClientJmsDelegate.java
new file mode 100644
index 0000000000..d68fc86a0e
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ClientJmsDelegate.java
@@ -0,0 +1,592 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.jms;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.Context;
+import javax.naming.NamingException;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.DistributedTestConstants;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.MessageProvider;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ClientJmsDelegate
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ClientJmsDelegate.class);
+
+ private final Context _context;
+ private final Destination _controllerQueue;
+ private final Connection _controllerConnection;
+ private final Session _controllerSession;
+ private final MessageProducer _controlQueueProducer;
+
+ private final String _clientName;
+ private Queue _instructionQueue;
+
+ private Map<String, Connection> _testConnections;
+ private Map<String, Session> _testSessions;
+ private Map<String, MessageProducer> _testProducers;
+ private Map<String, MessageConsumer> _testConsumers;
+ private Map<String, MessageProvider> _testMessageProviders;
+
+ private final MessageProvider _defaultMessageProvider;
+
+ public ClientJmsDelegate(final Context context)
+ {
+ try
+ {
+ _context = context;
+ final ConnectionFactory connectionFactory = (ConnectionFactory) _context.lookup("connectionfactory");
+ _controllerConnection = connectionFactory.createConnection();
+ _controllerConnection.start();
+ _controllerQueue = (Destination) context.lookup(DistributedTestConstants.CONTROLLER_QUEUE_JNDI_NAME);
+ _controllerSession = _controllerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _controlQueueProducer = _controllerSession.createProducer(_controllerQueue);
+ _clientName = UUID.randomUUID().toString();
+ _testConnections = new HashMap<String, Connection>();
+ _testSessions = new HashMap<String, Session>();
+ _testProducers = new HashMap<String, MessageProducer>();
+ _testConsumers = new HashMap<String, MessageConsumer>();
+ _testMessageProviders = new HashMap<String, MessageProvider>();
+ _defaultMessageProvider = new MessageProvider(null);
+ }
+ catch (final NamingException ne)
+ {
+ throw new DistributedTestException("Unable to create client jms delegate", ne);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create client jms delegate", jmse);
+ }
+ }
+
+ public void setInstructionListener(final Client client)
+ {
+ try
+ {
+ _instructionQueue = _controllerSession.createTemporaryQueue();
+ final MessageConsumer instructionConsumer = _controllerSession.createConsumer(_instructionQueue);
+ instructionConsumer.setMessageListener(new MessageListener()
+ {
+ @Override
+ public void onMessage(final Message message)
+ {
+ client.processInstruction(JmsMessageAdaptor.messageToCommand(message));
+ }
+ });
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to setup instruction listener", jmse);
+ }
+ }
+
+ public void sendRegistrationMessage()
+ {
+ Command command;
+ try
+ {
+ command = new RegisterClientCommand(_clientName, _instructionQueue.getQueueName());
+ }
+ catch (final JMSException e)
+ {
+ throw new DistributedTestException(e);
+ }
+ sendCommand(command);
+ }
+
+ public void sendResponseMessage(final Response responseMessage)
+ {
+ sendCommand(responseMessage);
+ }
+
+ private void sendCommand(final Command command)
+ {
+ try
+ {
+ final Message message = JmsMessageAdaptor.commandToMessage(_controllerSession, command);
+ _controlQueueProducer.send(message);
+ LOGGER.debug("Sent message for " + command.getType() + ". message id: " + message.getJMSMessageID());
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to send command: " + command, jmse);
+ }
+ }
+
+ public void createConnection(final CreateConnectionCommand command)
+ {
+ try
+ {
+ final ConnectionFactory connectionFactory = (ConnectionFactory) _context.lookup(command
+ .getConnectionFactoryName());
+ final Connection newConnection = connectionFactory.createConnection();
+ addConnection(command.getConnectionName(), newConnection);
+ }
+ catch (final NamingException ne)
+ {
+ throw new DistributedTestException("Unable to lookup factoryName: " + command.getConnectionFactoryName(),
+ ne);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create connection: " + command.getConnectionName()
+ + " (using factory name: " + command.getConnectionFactoryName() + ")", jmse);
+ }
+ }
+
+ public void createSession(final CreateSessionCommand command)
+ {
+ try
+ {
+ final Connection connection = _testConnections.get(command.getConnectionName());
+ if (connection == null)
+ {
+ throw new DistributedTestException("No test connection found called: " + command.getConnectionName(),
+ command);
+ }
+ final boolean transacted = command.getAcknowledgeMode() == Session.SESSION_TRANSACTED;
+
+ final Session newSession = connection.createSession(transacted, command.getAcknowledgeMode());
+ LOGGER.info("Created session " + command.getSessionName() + " with transacted = " + newSession.getTransacted() + " and acknowledgeMode = " + newSession.getAcknowledgeMode());
+
+ addSession(command.getSessionName(), newSession);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create new session: " + command, jmse);
+ }
+ }
+
+ public void createProducer(final CreateProducerCommand command)
+ {
+ try
+ {
+ final Session session = _testSessions.get(command.getSessionName());
+ if (session == null)
+ {
+ throw new DistributedTestException("No test session found called: " + command.getSessionName(), command);
+ }
+ final Destination destination = session.createQueue(command.getDestinationName());
+ final MessageProducer jmsProducer = session.createProducer(destination);
+ if (command.getPriority() != -1)
+ {
+ jmsProducer.setPriority(command.getPriority());
+ }
+ if (command.getTimeToLive() > 0)
+ {
+ jmsProducer.setTimeToLive(command.getTimeToLive());
+ }
+
+ if (command.getDeliveryMode() == DeliveryMode.NON_PERSISTENT
+ || command.getDeliveryMode() == DeliveryMode.PERSISTENT)
+ {
+ jmsProducer.setDeliveryMode(command.getDeliveryMode());
+ }
+
+ addProducer(command.getParticipantName(), jmsProducer);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create new producer: " + command, jmse);
+ }
+
+ }
+
+ public void createConsumer(final CreateConsumerCommand command)
+ {
+ try
+ {
+ final Session session = _testSessions.get(command.getSessionName());
+ if (session == null)
+ {
+ throw new DistributedTestException("No test session found called: " + command.getSessionName(), command);
+ }
+ final Destination destination = command.isTopic() ? session.createTopic(command.getDestinationName())
+ : session.createQueue(command.getDestinationName());
+ final MessageConsumer jmsConsumer = session.createConsumer(destination, command.getSelector());
+
+ _testConsumers.put(command.getParticipantName(), jmsConsumer);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create new consumer: " + command, jmse);
+ }
+ }
+
+ /**
+ * destroy the client. Don't call from the Dispatcher thread.
+ */
+ public void destroy()
+ {
+ try
+ {
+ // Stopping the connection allows in-flight onMessage calls to
+ // finish.
+ _controllerConnection.stop();
+
+ if (_controllerSession != null)
+ {
+ _controllerSession.close();
+ }
+ if (_controllerConnection != null)
+ {
+ _controllerConnection.close();
+ }
+
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to destroy cleanly", jmse);
+ }
+ }
+
+ public Destination getControllerQueue()
+ {
+ return _controllerQueue;
+ }
+
+ public String getClientName()
+ {
+ return _clientName;
+ }
+
+ public int getNoOfTestConnections()
+ {
+ return _testConnections.size();
+ }
+
+ public int getNoOfTestSessions()
+ {
+ return _testSessions.size();
+ }
+
+ public int getNoOfTestProducers()
+ {
+ return _testProducers.size();
+ }
+
+ public int getNoOfTestConsumers()
+ {
+ return _testConsumers.size();
+ }
+
+ public void startConnections()
+ {
+ // start connections for consumers
+ // it would be better if we could track consumer connections and start
+ // only those
+ if (!_testConsumers.isEmpty())
+ {
+ for (final Map.Entry<String, Connection> entry : _testConnections.entrySet())
+ {
+ final Connection connection = entry.getValue();
+ try
+ {
+ connection.start();
+ }
+ catch (final JMSException e)
+ {
+ throw new DistributedTestException("Failed to start connection '" + entry.getKey() + "' :"
+ + e.getLocalizedMessage());
+ }
+ }
+ }
+ }
+
+ public void commitOrAcknowledgeMessage(final Message message, final String sessionName)
+ {
+ try
+ {
+ final Session session = _testSessions.get(sessionName);
+ if (session.getTransacted())
+ {
+ session.commit();
+ }
+ else if (message != null && session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE)
+ {
+ message.acknowledge();
+ }
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to commit or acknowledge message on session: " +
+ sessionName, jmse);
+ }
+ }
+
+ public int getAcknowledgeMode(final String sessionName)
+ {
+ try
+ {
+ final Session session = _testSessions.get(sessionName);
+ return session.getAcknowledgeMode();
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to determine acknowledgement mode for session: " +
+ sessionName, jmse);
+ }
+ }
+
+ public Message sendNextMessage(final CreateProducerCommand command)
+ {
+ Message sentMessage = null;
+ MessageProvider messageProvider = _testMessageProviders.get(command.getMessageProviderName());
+ if (messageProvider == null)
+ {
+ messageProvider = _defaultMessageProvider;
+ }
+
+ final Session session = _testSessions.get(command.getSessionName());
+ final MessageProducer producer = _testProducers.get(command.getParticipantName());
+ try
+ {
+ sentMessage = messageProvider.nextMessage(session, command);
+ int deliveryMode = producer.getDeliveryMode();
+ int priority = producer.getPriority();
+ long ttl = producer.getTimeToLive();
+ if (messageProvider.isPropertySet(MessageProvider.PRIORITY))
+ {
+ priority = sentMessage.getJMSPriority();
+ }
+ if (messageProvider.isPropertySet(MessageProvider.DELIVERY_MODE))
+ {
+ deliveryMode = sentMessage.getJMSDeliveryMode();
+ }
+ if (messageProvider.isPropertySet(MessageProvider.TTL))
+ {
+ ttl = sentMessage.getLongProperty(MessageProvider.TTL);
+ }
+ producer.send(sentMessage, deliveryMode, priority, ttl);
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to create and send message with producer: " +
+ command.getParticipantName() + " on session: " + command.getSessionName(), jmse);
+ }
+ return sentMessage;
+ }
+
+ protected void addSession(final String sessionName, final Session newSession)
+ {
+ _testSessions.put(sessionName, newSession);
+ }
+
+ protected void addConnection(final String connectionName, final Connection newConnection)
+ {
+ _testConnections.put(connectionName, newConnection);
+ }
+
+ protected void addProducer(final String producerName, final MessageProducer jmsProducer)
+ {
+ _testProducers.put(producerName, jmsProducer);
+ }
+
+ public Message consumeMessage(String consumerName, long receiveInterval)
+ {
+ Message consumedMessage = null;
+ MessageConsumer consumer = _testConsumers.get(consumerName);
+ try
+ {
+ consumedMessage = consumer.receive(receiveInterval);
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Unable to consume message with consumer: " + consumerName, e);
+ }
+ return consumedMessage;
+ }
+
+ public void registerListener(String consumerName, MessageListener messageListener)
+ {
+ MessageConsumer consumer = _testConsumers.get(consumerName);
+ try
+ {
+ consumer.setMessageListener(messageListener);
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Unable to register message listener with consumer: " + consumerName, e);
+ }
+ }
+
+ public void rollbackOrRecover(String sessionName)
+ {
+ try
+ {
+ final Session session = _testSessions.get(sessionName);
+ if (session.getTransacted())
+ {
+ session.rollback();
+ }
+ else if (session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE)
+ {
+ session.recover();
+ }
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to rollback or recover on session: " +
+ sessionName, jmse);
+ }
+ }
+
+ public void releaseMessage(String sessionName)
+ {
+ try
+ {
+ final Session session = _testSessions.get(sessionName);
+ if (session.getTransacted())
+ {
+ session.rollback();
+ }
+ else
+ {
+ session.recover();
+ }
+ }
+ catch (final JMSException jmse)
+ {
+ LOGGER.warn("Unable to rollback or recover on session: " + sessionName, jmse);
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("clientName", _clientName).toString();
+ }
+
+ public void closeTestConnections()
+ {
+ StringBuilder jmsErrorMessages = new StringBuilder();
+ int failedCloseCounter = 0;
+ for (final Map.Entry<String, Connection> entry : _testConnections.entrySet())
+ {
+ final Connection connection = entry.getValue();
+ try
+ {
+ connection.close();
+ }
+ catch (final JMSException e)
+ {
+ LOGGER.error("Failed to close connection '" + entry.getKey() + "' :" + e.getLocalizedMessage(), e);
+ failedCloseCounter++;
+ if (jmsErrorMessages.length() > 0)
+ {
+ jmsErrorMessages.append('\n');
+ }
+ jmsErrorMessages.append(e.getMessage());
+ }
+ }
+ _testConnections.clear();
+ _testSessions.clear();
+ _testProducers.clear();
+ _testConsumers.clear();
+ if (failedCloseCounter > 0)
+ {
+ throw new DistributedTestException("Close failed for " + failedCloseCounter + " connection(s) with the following errors: " + jmsErrorMessages.toString());
+ }
+ }
+
+ public void closeTestConsumer(String consumerName)
+ {
+ MessageConsumer consumer = _testConsumers.get(consumerName);
+ if (consumer != null)
+ {
+ try
+ {
+ consumer.close();
+ LOGGER.info("Closed test consumer " + consumerName);
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Failed to close consumer: " + consumerName, e);
+ }
+ }
+ }
+
+ public void closeTestProducer(String producerName)
+ {
+ MessageProducer producer = _testProducers.get(producerName);
+ if (producer != null)
+ {
+ try
+ {
+ producer.close();
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Failed to close producer: " + producerName, e);
+ }
+ }
+ }
+
+ public int calculatePayloadSizeFrom(Message message)
+ {
+ try
+ {
+ if (message != null && message instanceof TextMessage)
+ {
+ return ((TextMessage) message).getText().getBytes().length;
+ }
+ // TODO support other message types
+ return 0;
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Unable to determine the payload size for message " + message, e);
+ }
+ }
+
+ public void createMessageProvider(CreateMessageProviderCommand command)
+ {
+ _testMessageProviders.put(command.getProviderName(), new MessageProvider(command.getMessageProperties()));
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java
new file mode 100644
index 0000000000..69da409be5
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/ControllerJmsDelegate.java
@@ -0,0 +1,210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.jms;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.naming.Context;
+import javax.naming.NamingException;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.CommandListener;
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ControllerJmsDelegate
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ControllerJmsDelegate.class);
+
+ private final Map<String, Destination> _clientNameToQueueMap = new ConcurrentHashMap<String, Destination>();
+ private final Connection _connection;
+ private final Destination _controllerQueue;
+ private final Session _session;
+ private final QueueCreator _queueCreator;
+
+ private List<CommandListener> _commandListeners = new CopyOnWriteArrayList<CommandListener>();
+
+ public ControllerJmsDelegate(final Context context) throws NamingException, JMSException
+ {
+ final ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("connectionfactory");
+ _connection = connectionFactory.createConnection();
+ _connection.start();
+ _controllerQueue = (Destination) context.lookup("controllerqueue");
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _queueCreator = new QpidQueueCreator();
+ }
+
+ public void start()
+ {
+ try
+ {
+ final MessageConsumer consumer = _session.createConsumer(_controllerQueue);
+ consumer.setMessageListener(new MessageListener()
+ {
+ @Override
+ public void onMessage(final Message message)
+ {
+ try
+ {
+ String jmsMessageID = message.getJMSMessageID();
+ LOGGER.debug("Received message " + jmsMessageID);
+
+ final Command command = JmsMessageAdaptor.messageToCommand(message);
+ LOGGER.debug("Converted message " + jmsMessageID + " into command: " + command);
+
+ processCommandWithFirstSupportingListener(command);
+ LOGGER.debug("Finished processing command for message " + jmsMessageID);
+ }
+ catch (Throwable t)
+ {
+ LOGGER.error("Can't handle JMS message", t);
+ }
+ }
+ });
+ }
+ catch (final JMSException e)
+ {
+ throw new DistributedTestException(e);
+ }
+ }
+
+ /** ensures connections are closed, otherwise the JVM may be prevented from terminating */
+ public void closeConnections()
+ {
+ try
+ {
+ _session.close();
+ }
+ catch (JMSException e)
+ {
+ LOGGER.error("Unable to close session", e);
+ }
+
+ try
+ {
+ _connection.stop();
+ }
+ catch (JMSException e)
+ {
+ LOGGER.error("Unable to stop connection", e);
+ }
+
+ try
+ {
+ _connection.close();
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Unable to close connection", e);
+ }
+ }
+
+ public void registerClient(final RegisterClientCommand command)
+ {
+ final String clientName = command.getClientName();
+ final Destination clientIntructionQueue = createDestinationFromString(command.getClientQueueName());
+ _clientNameToQueueMap.put(clientName, clientIntructionQueue);
+ }
+
+ public void sendCommandToClient(final String clientName, final Command command)
+ {
+ final Destination clientQueue = _clientNameToQueueMap.get(clientName);
+ if (clientQueue == null)
+ {
+ throw new DistributedTestException("Client name " + clientName + " not known. I know about: "
+ + _clientNameToQueueMap.keySet());
+ }
+
+ try
+ {
+ final MessageProducer producer = _session.createProducer(clientQueue);
+ final Message message = JmsMessageAdaptor.commandToMessage(_session, command);
+
+ producer.send(message);
+ }
+ catch (final JMSException e)
+ {
+ throw new DistributedTestException(e);
+ }
+ }
+
+ private void processCommandWithFirstSupportingListener(Command command)
+ {
+ for (CommandListener listener : _commandListeners)
+ {
+ if (listener.supports(command))
+ {
+ listener.processCommand(command);
+ return;
+ }
+ }
+
+ throw new IllegalStateException("There is no registered listener to process command " + command);
+ }
+
+ private Destination createDestinationFromString(final String clientQueueName)
+ {
+ Destination clientIntructionQueue;
+ try
+ {
+ clientIntructionQueue = _session.createQueue(clientQueueName);
+ }
+ catch (JMSException e)
+ {
+ throw new DistributedTestException("Unable to create Destination from " + clientQueueName);
+ }
+ return clientIntructionQueue;
+ }
+
+ public void createQueues(List<QueueConfig> queues)
+ {
+ _queueCreator.createQueues(_session, queues);
+ }
+
+ public void deleteQueues(List<QueueConfig> queues)
+ {
+ _queueCreator.deleteQueues(_session, queues);
+ }
+
+ public void addCommandListener(CommandListener commandListener)
+ {
+ _commandListeners.add(commandListener);
+ }
+
+ public void removeCommandListener(CommandListener commandListener)
+ {
+ _commandListeners.remove(commandListener);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/JmsMessageAdaptor.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/JmsMessageAdaptor.java
new file mode 100644
index 0000000000..c9dba21a74
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/JmsMessageAdaptor.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.jms;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.DistributedTestConstants;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.json.JsonHandler;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateResponderCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+
+public class JmsMessageAdaptor
+{
+ public static Message commandToMessage(final Session session, final Command command)
+ {
+ Message jmsMessage = null;
+ try
+ {
+ jmsMessage = session.createMessage();
+ jmsMessage.setStringProperty(DistributedTestConstants.MSG_COMMAND_PROPERTY, command.getType().name());
+ final JsonHandler jsonHandler = new JsonHandler();
+ jmsMessage.setStringProperty(DistributedTestConstants.MSG_JSON_PROPERTY, jsonHandler.marshall(command));
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to convert command " + command + " to JMS Message", jmse);
+ }
+
+ return jmsMessage;
+ }
+
+ public static Command messageToCommand(final Message jmsMessage)
+ {
+ Command command = null;
+ try
+ {
+ final CommandType commandType = CommandType.valueOf(jmsMessage
+ .getStringProperty(DistributedTestConstants.MSG_COMMAND_PROPERTY));
+ final JsonHandler jsonHandler = new JsonHandler();
+ command = jsonHandler.unmarshall(jmsMessage.getStringProperty(DistributedTestConstants.MSG_JSON_PROPERTY),
+ getCommandClassFromType(commandType));
+ }
+ catch (final JMSException jmse)
+ {
+ throw new DistributedTestException("Unable to convert JMS message " + jmsMessage + " to command object",
+ jmse);
+ }
+ return command;
+ }
+
+ static Class<? extends Command> getCommandClassFromType(final CommandType type)
+ {
+ switch (type)
+ {
+ case CREATE_CONNECTION:
+ return CreateConnectionCommand.class;
+ case CREATE_SESSION:
+ return CreateSessionCommand.class;
+ case CREATE_PRODUCER:
+ return CreateProducerCommand.class;
+ case CREATE_CONSUMER:
+ return CreateConsumerCommand.class;
+ case CREATE_RESPONDER:
+ return CreateResponderCommand.class;
+ case NO_OP:
+ return NoOpCommand.class;
+ case REGISTER_CLIENT:
+ return RegisterClientCommand.class;
+ case STOP_CLIENT:
+ return StopClientCommand.class;
+ case RESPONSE:
+ return Response.class;
+ case START_TEST:
+ return StartTestCommand.class;
+ case TEAR_DOWN_TEST:
+ return TearDownTestCommand.class;
+ case PARTICIPANT_RESULT:
+ return ParticipantResult.class;
+ case CONSUMER_PARTICIPANT_RESULT:
+ return ConsumerParticipantResult.class;
+ case PRODUCER_PARTICIPANT_RESULT:
+ return ProducerParticipantResult.class;
+ case CREATE_MESSAGE_PROVIDER:
+ return CreateMessageProviderCommand.class;
+ default:
+ throw new DistributedTestException("No class defined for type: " + type);
+ }
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QpidQueueCreator.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QpidQueueCreator.java
new file mode 100644
index 0000000000..912ce54495
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QpidQueueCreator.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.jms;
+
+import java.util.List;
+
+import javax.jms.Session;
+
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.client.AMQSession;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+import org.apache.qpid.framing.FieldTable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class QpidQueueCreator implements QueueCreator
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(QpidQueueCreator.class);
+
+ private static final FieldTable EMPTY_QUEUE_BIND_ARGUMENTS = new FieldTable();
+
+ @Override
+ public void createQueues(Session session, List<QueueConfig> configs)
+ {
+ AMQSession<?, ?> amqSession = (AMQSession<?, ?>)session;
+ for (QueueConfig queueConfig : configs)
+ {
+ createQueue(amqSession, queueConfig);
+ }
+ }
+
+ @Override
+ public void deleteQueues(Session session, List<QueueConfig> configs)
+ {
+ AMQSession<?, ?> amqSession = (AMQSession<?, ?>)session;
+ for (QueueConfig queueConfig : configs)
+ {
+ deleteQueue(amqSession, queueConfig);
+ }
+ }
+
+ private void createQueue(AMQSession<?, ?> session, QueueConfig queueConfig)
+ {
+ try
+ {
+ AMQDestination destination = (AMQDestination) session.createQueue(queueConfig.getName());
+ boolean autoDelete = false;
+ boolean exclusive = false;
+ session.createQueue(destination.getAMQQueueName(), autoDelete,
+ queueConfig.isDurable(), exclusive, queueConfig.getAttributes());
+ session.bindQueue(destination.getAMQQueueName(), destination.getRoutingKey(),
+ EMPTY_QUEUE_BIND_ARGUMENTS, destination.getExchangeName(),
+ destination, autoDelete);
+
+ LOGGER.info("Created queue " + queueConfig);
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Failed to create queue:" + queueConfig, e);
+ }
+ }
+
+ private void deleteQueue(AMQSession<?, ?> session, QueueConfig queueConfig)
+ {
+ try
+ {
+ // The Qpid AMQSession API currently makes the #deleteQueue method protected and the
+ // raw protocol method public. This should be changed then we should switch the below to
+ // use #deleteQueue.
+ AMQDestination destination = (AMQDestination) session.createQueue(queueConfig.getName());
+ session.sendQueueDelete(destination.getAMQQueueName());
+ LOGGER.info("Deleted queue " + queueConfig.getName());
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Failed to delete queue:" + queueConfig.getName(), e);
+ }
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QueueCreator.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QueueCreator.java
new file mode 100644
index 0000000000..0947dd53cb
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/jms/QueueCreator.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.jms;
+
+import java.util.List;
+
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+
+public interface QueueCreator
+{
+ public void createQueues(final Session session, final List<QueueConfig> configs);
+ public void deleteQueues(final Session session, final List<QueueConfig> configs);
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/json/JsonHandler.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/json/JsonHandler.java
new file mode 100644
index 0000000000..8e50cd4f11
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/json/JsonHandler.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.json;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.message.Command;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+public class JsonHandler
+{
+ private final Gson _gson = new GsonBuilder()
+ .registerTypeAdapter(PropertyValue.class, new PropertyValueAdapter())
+ .create();
+
+ public <T extends Command> T unmarshall(final String jsonParams, final Class<T> clazz)
+ {
+ return _gson.fromJson(jsonParams, clazz);
+ }
+
+ public <T extends Command> String marshall(final T command)
+ {
+ return _gson.toJson(command);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/json/PropertyValueAdapter.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/json/PropertyValueAdapter.java
new file mode 100644
index 0000000000..94f712e652
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/json/PropertyValueAdapter.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.json;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.qpid.disttest.client.property.GeneratedPropertyValue;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.PropertyValueFactory;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+public class PropertyValueAdapter implements JsonDeserializer<PropertyValue>, JsonSerializer<PropertyValue>
+{
+ private static final String DEF_FIELD = "@def";
+ private PropertyValueFactory _factory = new PropertyValueFactory();
+
+ @Override
+ public PropertyValue deserialize(JsonElement json, Type type, JsonDeserializationContext context)
+ throws JsonParseException
+ {
+ if (json.isJsonNull())
+ {
+ return null;
+ }
+ else if (json.isJsonPrimitive())
+ {
+ Object result = null;
+ JsonPrimitive primitive = json.getAsJsonPrimitive();
+ if (primitive.isString())
+ {
+ result = primitive.getAsString();
+ }
+ else if (primitive.isNumber())
+ {
+ String asString = primitive.getAsString();
+ if (asString.indexOf('.') != -1 || asString.indexOf('e') != -1)
+ {
+ result = primitive.getAsDouble();
+ }
+ else
+ {
+ result = primitive.getAsLong();
+ }
+ }
+ else if (primitive.isBoolean())
+ {
+ result = primitive.getAsBoolean();
+ }
+ else
+ {
+ throw new JsonParseException("Unsupported primitive value " + primitive);
+ }
+ return new SimplePropertyValue(result);
+ }
+ else if (json.isJsonArray())
+ {
+ JsonArray array = json.getAsJsonArray();
+ List<Object> result = new ArrayList<Object>(array.size());
+ for (JsonElement element : array)
+ {
+ result.add(context.deserialize(element, Object.class));
+ }
+ return new SimplePropertyValue(result);
+ }
+ else if (json.isJsonObject())
+ {
+ JsonObject object = json.getAsJsonObject();
+ JsonElement defElement = object.getAsJsonPrimitive(DEF_FIELD);
+ Class<?> classInstance = null;
+ if (defElement != null)
+ {
+ try
+ {
+ classInstance = _factory.getPropertyValueClass(defElement.getAsString());
+ }
+ catch (ClassNotFoundException e)
+ {
+ // ignore
+ }
+ }
+ if (classInstance == null)
+ {
+ Map<String, Object> result = new HashMap<String, Object>();
+ for (Map.Entry<String, JsonElement> entry : object.entrySet())
+ {
+ Object value = context.deserialize(entry.getValue(), Object.class);
+ result.put(entry.getKey(), value);
+ }
+ return new SimplePropertyValue(result);
+ }
+ else
+ {
+ return context.deserialize(json, classInstance);
+ }
+ }
+ else
+ {
+ throw new JsonParseException("Unsupported JSON type " + json);
+ }
+ }
+
+ @Override
+ public JsonElement serialize(PropertyValue src, Type typeOfSrc, JsonSerializationContext context)
+ {
+ if (src instanceof GeneratedPropertyValue)
+ {
+ JsonObject object = (JsonObject) context.serialize(src, Object.class);
+ object.addProperty(DEF_FIELD, ((GeneratedPropertyValue) src).getDefinition());
+ return object;
+ }
+ else
+ {
+ return context.serialize(src.getValue(), Object.class);
+ }
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/Command.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/Command.java
new file mode 100644
index 0000000000..86b4d0e439
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/Command.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+
+import org.apache.commons.lang.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.qpid.disttest.Visitor;
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.controller.Controller;
+
+/**
+ * A command sent between the {@link Controller} and a {@link Client}
+ */
+public abstract class Command
+{
+ private final CommandType type;
+
+ public Command(final CommandType type)
+ {
+ this.type = type;
+ }
+
+ public CommandType getType()
+ {
+ return type;
+ }
+
+ public void accept(Visitor visitor)
+ {
+ visitor.visit(this);
+ }
+
+ @Override
+ public String toString()
+ {
+ return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CommandType.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CommandType.java
new file mode 100644
index 0000000000..b04cbdaba1
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CommandType.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public enum CommandType
+{
+ CREATE_CONNECTION,
+ CREATE_CONSUMER,
+ CREATE_PRODUCER,
+ CREATE_RESPONDER,
+ CREATE_SESSION,
+ NO_OP,
+ REGISTER_CLIENT,
+ RESPONSE,
+ START_TEST,
+ STOP_CLIENT,
+ TEAR_DOWN_TEST,
+ PARTICIPANT_RESULT,
+ CONSUMER_PARTICIPANT_RESULT,
+ PRODUCER_PARTICIPANT_RESULT,
+ CREATE_MESSAGE_PROVIDER
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java
new file mode 100644
index 0000000000..f92e3ea538
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ConsumerParticipantResult.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_BROWSIING_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_DURABLE_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_NO_LOCAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SELECTOR;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SYNCHRONOUS_CONSUMER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_TOPIC;
+
+public class ConsumerParticipantResult extends ParticipantResult
+{
+ private boolean _topic;
+ private boolean _durableSubscription;
+ private boolean _browsingSubscription;
+ private boolean _selector;
+ private boolean _noLocal;
+ private boolean _synchronousConsumer;
+
+ public ConsumerParticipantResult()
+ {
+ super(CommandType.CONSUMER_PARTICIPANT_RESULT);
+ }
+
+ public ConsumerParticipantResult(String participantName)
+ {
+ this();
+ setParticipantName(participantName);
+ }
+
+ @OutputAttribute(attribute=IS_DURABLE_SUBSCRIPTION)
+ public boolean isDurableSubscription()
+ {
+ return _durableSubscription;
+ }
+
+ public void setDurableSubscription(boolean durable)
+ {
+ _durableSubscription = durable;
+ }
+
+
+ @OutputAttribute(attribute=IS_BROWSIING_SUBSCRIPTION)
+ public boolean isBrowsingSubscription()
+ {
+ return _browsingSubscription;
+ }
+
+ public void setBrowsingSubscription(boolean browsingSubscription)
+ {
+ _browsingSubscription = browsingSubscription;
+ }
+
+
+ @OutputAttribute(attribute=IS_SELECTOR)
+ public boolean isSelector()
+ {
+ return _selector;
+ }
+
+ public void setSelector(boolean selector)
+ {
+ _selector = selector;
+ }
+
+
+ @OutputAttribute(attribute=IS_NO_LOCAL)
+ public boolean isNoLocal()
+ {
+ return _noLocal;
+
+ }
+
+ public void setNoLocal(boolean noLocal)
+ {
+ _noLocal = noLocal;
+ }
+
+ @OutputAttribute(attribute=IS_SYNCHRONOUS_CONSUMER)
+ public boolean isSynchronousConsumer()
+ {
+ return _synchronousConsumer;
+ }
+
+ public void setSynchronousConsumer(boolean synchronousConsumer)
+ {
+ _synchronousConsumer = synchronousConsumer;
+ }
+
+
+ public void setTopic(boolean isTopic)
+ {
+ _topic = isTopic;
+ }
+
+ @OutputAttribute(attribute=IS_TOPIC)
+ public boolean isTopic()
+ {
+ return _topic;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConnectionCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConnectionCommand.java
new file mode 100644
index 0000000000..c5a96e9a94
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConnectionCommand.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class CreateConnectionCommand extends Command
+{
+ private String _connectionName;
+ private String _connectionFactoryName;
+
+ public CreateConnectionCommand()
+ {
+ super(CommandType.CREATE_CONNECTION);
+ }
+
+ public CreateConnectionCommand(String connectionName, String connectionFactoryName)
+ {
+ super(CommandType.CREATE_CONNECTION);
+ _connectionName = connectionName;
+ _connectionFactoryName = connectionFactoryName;
+ }
+
+ public void setConnectionName(final String connectionName)
+ {
+ this._connectionName = connectionName;
+ }
+
+ public String getConnectionName()
+ {
+ return _connectionName;
+ }
+
+ public void setConnectionFactoryName(final String connectionFactoryName)
+ {
+ this._connectionFactoryName = connectionFactoryName;
+ }
+
+ public String getConnectionFactoryName()
+ {
+ return _connectionFactoryName;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java
new file mode 100644
index 0000000000..678e428f94
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateConsumerCommand.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class CreateConsumerCommand extends CreateParticpantCommand
+{
+ private boolean _isTopic;
+ private boolean _isDurableSubscription;
+ private boolean _isBrowsingSubscription;
+ private String _selector;
+ private boolean _noLocal;
+ private boolean _synchronous;
+ private long _receiveTimeout = 5000;
+
+
+ public CreateConsumerCommand()
+ {
+ super(CommandType.CREATE_CONSUMER);
+ }
+
+ public boolean isDurableSubscription()
+ {
+ return _isDurableSubscription;
+ }
+
+ public void setDurableSubscription(final boolean isDurableSubscription)
+ {
+ this._isDurableSubscription = isDurableSubscription;
+ }
+
+ public boolean isBrowsingSubscription()
+ {
+ return _isBrowsingSubscription;
+ }
+
+ public void setBrowsingSubscription(final boolean isBrowsingSubscription)
+ {
+ _isBrowsingSubscription = isBrowsingSubscription;
+ }
+
+ public String getSelector()
+ {
+ return _selector;
+ }
+
+ public void setSelector(final String selector)
+ {
+ this._selector = selector;
+ }
+
+ public boolean isNoLocal()
+ {
+ return _noLocal;
+ }
+
+ public void setNoLocal(final boolean noLocal)
+ {
+ this._noLocal = noLocal;
+ }
+
+ public boolean isTopic()
+ {
+ return _isTopic;
+ }
+
+ public void setTopic(boolean isTopic)
+ {
+ this._isTopic = isTopic;
+ }
+
+ public boolean isSynchronous()
+ {
+ return _synchronous;
+ }
+
+ public void setSynchronous(boolean synchronous)
+ {
+ _synchronous = synchronous;
+ }
+
+ public void setReceiveTimeout(long receiveTimeout)
+ {
+ _receiveTimeout = receiveTimeout;
+
+ }
+
+ public long getReceiveTimeout()
+ {
+ return _receiveTimeout;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateMessageProviderCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateMessageProviderCommand.java
new file mode 100644
index 0000000000..3f30fdd96a
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateMessageProviderCommand.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import java.util.Map;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+
+public class CreateMessageProviderCommand extends Command
+{
+ private String _providerName;
+ private Map<String, PropertyValue> _messageProperties;
+
+ public CreateMessageProviderCommand()
+ {
+ super(CommandType.CREATE_MESSAGE_PROVIDER);
+ }
+
+ public String getProviderName()
+ {
+ return _providerName;
+ }
+
+ public void setProviderName(String providerName)
+ {
+ this._providerName = providerName;
+ }
+
+ public Map<String, PropertyValue> getMessageProperties()
+ {
+ return _messageProperties;
+ }
+
+ public void setMessageProperties(Map<String, PropertyValue> messageProperties)
+ {
+ this._messageProperties = messageProperties;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateParticpantCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateParticpantCommand.java
new file mode 100644
index 0000000000..b1caa6ef75
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateParticpantCommand.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+
+public abstract class CreateParticpantCommand extends Command
+{
+ private String _participantName;
+ private String _sessionName;
+ private String _destinationName;
+ private long _numberOfMessages;
+ private int _batchSize;
+ private long _maximumDuration;
+
+ public CreateParticpantCommand(CommandType type)
+ {
+ super(type);
+ }
+
+ public String getParticipantName()
+ {
+ return _participantName;
+ }
+
+ public void setParticipantName(final String participantName)
+ {
+ _participantName = participantName;
+ }
+
+ public String getSessionName()
+ {
+ return _sessionName;
+ }
+
+ public void setSessionName(final String sessionName)
+ {
+ _sessionName = sessionName;
+ }
+
+ public String getDestinationName()
+ {
+ return _destinationName;
+ }
+
+ public void setDestinationName(final String destinationName)
+ {
+ _destinationName = destinationName;
+ }
+
+ public long getNumberOfMessages()
+ {
+ return _numberOfMessages;
+ }
+
+ public void setNumberOfMessages(final long numberOfMessages)
+ {
+ _numberOfMessages = numberOfMessages;
+ }
+
+ public int getBatchSize()
+ {
+ return _batchSize;
+ }
+
+ public void setBatchSize(int batchSize)
+ {
+ _batchSize = batchSize;
+ }
+
+ public long getMaximumDuration()
+ {
+ return _maximumDuration;
+ }
+
+ public void setMaximumDuration(long maximumDuration)
+ {
+ _maximumDuration = maximumDuration;
+ }
+
+ @Override
+ public String toString()
+ {
+ return ToStringBuilder.reflectionToString(this);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateProducerCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateProducerCommand.java
new file mode 100644
index 0000000000..69dfe1ff5a
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateProducerCommand.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class CreateProducerCommand extends CreateParticpantCommand
+{
+ private int _deliveryMode;
+ private int _messageSize;
+ private int _priority;
+ private long _timeToLive;
+ private long _interval;
+ private long _startDelay;
+ private String _messageProviderName;
+
+ public CreateProducerCommand()
+ {
+ super(CommandType.CREATE_PRODUCER);
+ }
+
+ public int getMessageSize()
+ {
+ return _messageSize;
+ }
+
+ public void setMessageSize(final int messageSize)
+ {
+ this._messageSize = messageSize;
+ }
+
+ public int getPriority()
+ {
+ return _priority;
+ }
+
+ public void setPriority(final int priority)
+ {
+ this._priority = priority;
+ }
+
+ public int getDeliveryMode()
+ {
+ return _deliveryMode;
+ }
+
+ public void setDeliveryMode(final int deliveryMode)
+ {
+ this._deliveryMode = deliveryMode;
+ }
+
+ public long getTimeToLive()
+ {
+ return _timeToLive;
+ }
+
+ public void setTimeToLive(final long timeToLive)
+ {
+ this._timeToLive = timeToLive;
+ }
+
+ public long getInterval()
+ {
+ return _interval;
+ }
+
+ public void setInterval(long interval)
+ {
+ this._interval = interval;
+ }
+
+ public long getStartDelay()
+ {
+ return _startDelay;
+ }
+
+ public void setStartDelay(long startDelay)
+ {
+ this._startDelay = startDelay;
+ }
+
+ public String getMessageProviderName()
+ {
+ return _messageProviderName;
+ }
+
+ public void setMessageProviderName(String messageProviderName)
+ {
+ this._messageProviderName = messageProviderName;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateResponderCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateResponderCommand.java
new file mode 100644
index 0000000000..85a2b5e548
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateResponderCommand.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class CreateResponderCommand extends Command
+{
+ public CreateResponderCommand()
+ {
+ super(CommandType.CREATE_RESPONDER);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateSessionCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateSessionCommand.java
new file mode 100644
index 0000000000..f6f59c26af
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/CreateSessionCommand.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class CreateSessionCommand extends Command
+{
+ private String sessionName;
+ private String connectionName;
+ private int acknowledgeMode;
+
+ public CreateSessionCommand()
+ {
+ super(CommandType.CREATE_SESSION);
+ }
+
+ public String getSessionName()
+ {
+ return sessionName;
+ }
+
+ public void setSessionName(final String sessionName)
+ {
+ this.sessionName = sessionName;
+ }
+
+ public String getConnectionName()
+ {
+ return connectionName;
+ }
+
+ public void setConnectionName(final String connectionName)
+ {
+ this.connectionName = connectionName;
+ }
+
+ public int getAcknowledgeMode()
+ {
+ return acknowledgeMode;
+ }
+
+ public void setAcknowledgeMode(final int acknowledgeMode)
+ {
+ this.acknowledgeMode = acknowledgeMode;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/NoOpCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/NoOpCommand.java
new file mode 100644
index 0000000000..1cdaf00163
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/NoOpCommand.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+
+public class NoOpCommand extends Command
+{
+ public NoOpCommand()
+ {
+ super(CommandType.NO_OP);
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/OutputAttribute.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/OutputAttribute.java
new file mode 100644
index 0000000000..b912eaa1cb
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/OutputAttribute.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * Marks an attribute of {@link ParticipantResult} that should be written to the test output file.
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OutputAttribute
+{
+ ParticipantAttribute attribute();
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java
new file mode 100644
index 0000000000..ccc7c0d9fb
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttribute.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import org.apache.qpid.disttest.client.Participant;
+
+/**
+ * Meta-date representing the attributes of {@link Participant} that we write to the test output file.
+ *
+ * Order of declaration is currently important - it determines they order they appear in the output.
+ *
+ * @see OutputAttribute
+ */
+public enum ParticipantAttribute
+{
+ TEST_NAME("testName"),
+ ITERATION_NUMBER("iterationNumber"),
+ CONFIGURED_CLIENT_NAME("clientName"),
+ PARTICIPANT_NAME("participantName"),
+ NUMBER_OF_MESSAGES_PROCESSED("numberOfMessages"),
+ PAYLOAD_SIZE("payloadSizeB"),
+ PRIORITY("priority"),
+ TIME_TO_LIVE("timeToLiveMs"),
+ ACKNOWLEDGE_MODE("acknowledgeMode"),
+ DELIVERY_MODE("deliveryMode"),
+ BATCH_SIZE("batchSize"),
+ MAXIMUM_DURATION("maximumDurationMs"),
+ PRODUCER_START_DELAY("producerStartDelayMs"),
+ PRODUCER_INTERVAL("producerIntervalMs"),
+ IS_TOPIC("isTopic"),
+ IS_DURABLE_SUBSCRIPTION("isDurableSubscription"),
+ IS_BROWSIING_SUBSCRIPTION("isBrowsingSubscription"),
+ IS_SELECTOR("isSelector"),
+ IS_NO_LOCAL("isNoLocal"),
+ IS_SYNCHRONOUS_CONSUMER("isSynchronousConsumer"),
+ TOTAL_NUMBER_OF_CONSUMERS("totalNumberOfConsumers"),
+ TOTAL_NUMBER_OF_PRODUCERS("totalNumberOfProducers"),
+ TOTAL_PAYLOAD_PROCESSED("totalPayloadProcessedB"),
+ THROUGHPUT("throughputKbPerS"),
+ TIME_TAKEN("timeTakenMs"),
+ ERROR_MESSAGE("errorMessage");
+
+ private String _displayName;
+
+ ParticipantAttribute(String displayName)
+ {
+ _displayName = displayName;
+ }
+
+ public String getDisplayName()
+ {
+ return _displayName;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttributeExtractor.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttributeExtractor.java
new file mode 100644
index 0000000000..95a19ceefc
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantAttributeExtractor.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import java.beans.PropertyDescriptor;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.beanutils.PropertyUtils;
+
+
+public class ParticipantAttributeExtractor
+{
+ public static Map<ParticipantAttribute, Object> getAttributes(Object targetObject)
+ {
+ Map<ParticipantAttribute, Object> attributes = new HashMap<ParticipantAttribute, Object>();
+
+
+ PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(targetObject);
+ for (PropertyDescriptor propertyDescriptor : descriptors)
+ {
+ final Method readMethod = getPropertyReadMethod(targetObject, propertyDescriptor);
+
+ for (Annotation annotation : readMethod.getDeclaredAnnotations())
+ {
+ if (annotation instanceof OutputAttribute)
+ {
+ OutputAttribute outputAttribute = (OutputAttribute) annotation;
+
+ Object value = getPropertyValue(targetObject, propertyDescriptor.getName());
+ attributes.put(outputAttribute.attribute(), value);
+ }
+ }
+ }
+
+ return attributes;
+ }
+
+ public static Method getPropertyReadMethod(Object targetObject, PropertyDescriptor propertyDescriptor)
+ {
+ final Method readMethod = propertyDescriptor.getReadMethod();
+
+ if (readMethod == null)
+ {
+ throw new RuntimeException("No read method for property " + propertyDescriptor.getName() + " on " + targetObject);
+ }
+ return readMethod;
+ }
+
+ public static Object getPropertyValue(Object targetObject, String propertyName)
+ {
+ try
+ {
+ return PropertyUtils.getProperty(targetObject, propertyName);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new RuntimeException("Couldn't get value of property " + propertyName + " from " + targetObject, e);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new RuntimeException("Couldn't get value of property " + propertyName + " from " + targetObject, e);
+ }
+ catch (NoSuchMethodException e)
+ {
+ throw new RuntimeException("Couldn't get value of property " + propertyName + " from " + targetObject, e);
+ }
+
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantResult.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantResult.java
new file mode 100644
index 0000000000..a6d3d91bae
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ParticipantResult.java
@@ -0,0 +1,272 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import static org.apache.qpid.disttest.message.ParticipantAttribute.BATCH_SIZE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.CONFIGURED_CLIENT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.ITERATION_NUMBER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.MAXIMUM_DURATION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PAYLOAD_SIZE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.NUMBER_OF_MESSAGES_PROCESSED;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.THROUGHPUT;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PARTICIPANT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TEST_NAME;
+
+import java.util.Comparator;
+import java.util.Date;
+import java.util.Map;
+
+public class ParticipantResult extends Response
+{
+ private String _testName;
+ private String _participantName;
+ private int _iterationNumber;
+
+ private long _startInMillis;
+ private long _endInMillis;
+ private int _batchSize;
+ private long _maximumDuration;
+
+ private String _configuredClientName;
+
+ private long _numberOfMessagesProcessed;
+ private long _totalPayloadProcessed;
+ private int _payloadSize;
+ private double _throughput;
+
+ private int _totalNumberOfConsumers;
+ private int _totalNumberOfProducers;
+
+ // As Session.SESSION_TRANSACTED is 0, we use value -1 so we can distinguish the case where an aggregated result
+ // summarizes results from participants using different session acknowledge modes.
+ private int _acknowledgeMode = -1;
+
+ public static final Comparator<? super ParticipantResult> PARTICIPANT_NAME_COMPARATOR = new Comparator<ParticipantResult>()
+ {
+ @Override
+ public int compare(ParticipantResult participantResult1, ParticipantResult participantResult2)
+ {
+ return participantResult1.getParticipantName().compareTo(participantResult2.getParticipantName());
+ }
+ };
+
+ public ParticipantResult()
+ {
+ this(CommandType.PARTICIPANT_RESULT);
+ }
+
+ public ParticipantResult(CommandType commandType)
+ {
+ super(commandType);
+ }
+
+ public ParticipantResult(String participantName)
+ {
+ this();
+ setParticipantName(participantName);
+ }
+
+ @OutputAttribute(attribute=TEST_NAME)
+ public String getTestName()
+ {
+ return _testName;
+ }
+
+ public void setTestName(String testName)
+ {
+ _testName = testName;
+ }
+
+ @OutputAttribute(attribute=ITERATION_NUMBER)
+ public int getIterationNumber()
+ {
+ return _iterationNumber;
+ }
+
+ public void setIterationNumber(int iterationNumber)
+ {
+ _iterationNumber = iterationNumber;
+ }
+
+ public void setStartDate(Date start)
+ {
+ _startInMillis = start.getTime();
+ }
+
+ public void setEndDate(Date end)
+ {
+ _endInMillis = end.getTime();
+ }
+
+ public Date getStartDate()
+ {
+ return new Date(_startInMillis);
+ }
+
+ public Date getEndDate()
+ {
+ return new Date(_endInMillis);
+ }
+
+
+ public long getStartInMillis()
+ {
+ return _startInMillis;
+ }
+
+ public long getEndInMillis()
+ {
+ return _endInMillis;
+ }
+
+
+ @OutputAttribute(attribute=PARTICIPANT_NAME)
+ public String getParticipantName()
+ {
+ return _participantName;
+ }
+
+
+ public void setParticipantName(String participantName)
+ {
+ _participantName = participantName;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.TIME_TAKEN)
+ public long getTimeTaken()
+ {
+ return _endInMillis - _startInMillis;
+ }
+
+ @OutputAttribute(attribute=CONFIGURED_CLIENT_NAME)
+ public String getConfiguredClientName()
+ {
+ return _configuredClientName;
+ }
+
+ public void setConfiguredClientName(String configuredClientName)
+ {
+ _configuredClientName = configuredClientName;
+ }
+
+ @OutputAttribute(attribute=NUMBER_OF_MESSAGES_PROCESSED)
+ public long getNumberOfMessagesProcessed()
+ {
+ return _numberOfMessagesProcessed;
+ }
+
+ public void setNumberOfMessagesProcessed(long numberOfMessagesProcessed)
+ {
+ _numberOfMessagesProcessed = numberOfMessagesProcessed;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.TOTAL_PAYLOAD_PROCESSED)
+ public long getTotalPayloadProcessed()
+ {
+ return _totalPayloadProcessed;
+ }
+
+ @OutputAttribute(attribute = PAYLOAD_SIZE)
+ public int getPayloadSize()
+ {
+ return _payloadSize;
+ }
+
+ public void setPayloadSize(int payloadSize)
+ {
+ _payloadSize = payloadSize;
+ }
+
+ public void setTotalPayloadProcessed(long totalPayloadProcessed)
+ {
+ _totalPayloadProcessed = totalPayloadProcessed;
+ }
+
+ public Map<ParticipantAttribute, Object> getAttributes()
+ {
+ return ParticipantAttributeExtractor.getAttributes(this);
+ }
+
+ public void setBatchSize(int batchSize)
+ {
+ _batchSize = batchSize;
+ }
+
+ @OutputAttribute(attribute=BATCH_SIZE)
+ public int getBatchSize()
+ {
+ return _batchSize;
+ }
+
+ public void setMaximumDuration(long maximumDuration)
+ {
+ _maximumDuration = maximumDuration;
+ }
+
+ @OutputAttribute(attribute=MAXIMUM_DURATION)
+ public long getMaximumDuration()
+ {
+ return _maximumDuration;
+ }
+
+ @OutputAttribute(attribute=THROUGHPUT)
+ public double getThroughput()
+ {
+ return _throughput;
+ }
+
+ public void setThroughput(double throughput)
+ {
+ _throughput = throughput;
+ }
+
+ public void setTotalNumberOfConsumers(int totalNumberOfConsumers)
+ {
+ _totalNumberOfConsumers = totalNumberOfConsumers;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.TOTAL_NUMBER_OF_CONSUMERS)
+ public int getTotalNumberOfConsumers()
+ {
+ return _totalNumberOfConsumers;
+ }
+
+ public void setTotalNumberOfProducers(int totalNumberOfProducers)
+ {
+ _totalNumberOfProducers = totalNumberOfProducers;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.TOTAL_NUMBER_OF_PRODUCERS)
+ public int getTotalNumberOfProducers()
+ {
+ return _totalNumberOfProducers;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.ACKNOWLEDGE_MODE)
+ public int getAcknowledgeMode()
+ {
+ return _acknowledgeMode;
+ }
+
+ public void setAcknowledgeMode(int acknowledgeMode)
+ {
+ _acknowledgeMode = acknowledgeMode;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ProducerParticipantResult.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ProducerParticipantResult.java
new file mode 100644
index 0000000000..766c90eec8
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/ProducerParticipantResult.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import static org.apache.qpid.disttest.message.ParticipantAttribute.DELIVERY_MODE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRIORITY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_INTERVAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_START_DELAY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TIME_TO_LIVE;
+
+public class ProducerParticipantResult extends ParticipantResult
+{
+ private int _priority;
+ private long _timeToLive;
+ private long _startDelay;
+ private long _interval;
+ private int _deliveryMode;
+ public ProducerParticipantResult()
+ {
+ super(CommandType.PRODUCER_PARTICIPANT_RESULT);
+ }
+
+ public ProducerParticipantResult(String participantName)
+ {
+ this();
+ setParticipantName(participantName);
+ }
+
+ @OutputAttribute(attribute=PRIORITY)
+ public int getPriority()
+ {
+ return _priority;
+ }
+
+ public void setPriority(int priority)
+ {
+ _priority = priority;
+ }
+
+ @OutputAttribute(attribute=TIME_TO_LIVE)
+ public long getTimeToLive()
+ {
+ return _timeToLive;
+ }
+
+ public void setTimeToLive(long timeToLive)
+ {
+ _timeToLive = timeToLive;
+ }
+
+ @OutputAttribute(attribute=PRODUCER_START_DELAY)
+ public long getStartDelay()
+ {
+ return _startDelay;
+ }
+
+ public void setStartDelay(long startDelay)
+ {
+ _startDelay = startDelay;
+ }
+
+ @OutputAttribute(attribute=PRODUCER_INTERVAL)
+ public long getInterval()
+ {
+ return _interval;
+ }
+
+ public void setInterval(long producerInterval)
+ {
+ _interval = producerInterval;
+ }
+
+ @OutputAttribute(attribute=DELIVERY_MODE)
+ public int getDeliveryMode()
+ {
+ return _deliveryMode;
+ }
+
+ public void setDeliveryMode(int deliveryMode)
+ {
+ this._deliveryMode = deliveryMode;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/RegisterClientCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/RegisterClientCommand.java
new file mode 100644
index 0000000000..af880a37d9
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/RegisterClientCommand.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class RegisterClientCommand extends Command
+{
+ private final String _clientName;
+ private final String _clientQueueName;
+
+ public RegisterClientCommand(final String clientName, final String clientQueueName)
+ {
+ super(CommandType.REGISTER_CLIENT);
+ _clientName = clientName;
+ _clientQueueName = clientQueueName;
+ }
+
+ public String getClientName()
+ {
+ return _clientName;
+ }
+
+ public String getClientQueueName()
+ {
+ return _clientQueueName;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/Response.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/Response.java
new file mode 100644
index 0000000000..aac056efcb
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/Response.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+
+public class Response extends Command
+{
+ protected String _registeredClientName;
+ protected String _errorMessage;
+ private CommandType _inReplyToCommandType;
+
+ public Response(final String registeredclientName, final CommandType inReplyToCommandType, final String errorMessage)
+ {
+ super(CommandType.RESPONSE);
+ _registeredClientName = registeredclientName;
+ _errorMessage = errorMessage;
+ _inReplyToCommandType = inReplyToCommandType;
+ }
+
+ public Response(String clientName, CommandType inReplyToCommandType)
+ {
+ this(clientName, inReplyToCommandType, null);
+ }
+
+ /**
+ * Provided so that subclasses can call super(commandType)
+ */
+ protected Response(CommandType commandType)
+ {
+ super(commandType);
+ }
+
+ public String getRegisteredClientName()
+ {
+ return _registeredClientName;
+ }
+
+ public void setRegisteredClientName(String registeredClientName)
+ {
+ _registeredClientName = registeredClientName;
+ }
+
+ @OutputAttribute(attribute=ParticipantAttribute.ERROR_MESSAGE)
+ public String getErrorMessage()
+ {
+ return _errorMessage;
+ }
+
+ public void setErrorMessage(String errorMessage)
+ {
+ _errorMessage = errorMessage;
+ }
+
+ public boolean hasError()
+ {
+ return _errorMessage != null;
+ }
+
+ public CommandType getInReplyToCommandType()
+ {
+ return _inReplyToCommandType;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/StartTestCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/StartTestCommand.java
new file mode 100644
index 0000000000..4a53697ecd
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/StartTestCommand.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+public class StartTestCommand extends Command
+{
+
+ public StartTestCommand()
+ {
+ super(CommandType.START_TEST);
+ }
+
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/StopClientCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/StopClientCommand.java
new file mode 100644
index 0000000000..08758aaa69
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/StopClientCommand.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+public class StopClientCommand extends Command
+{
+ public StopClientCommand()
+ {
+ super(CommandType.STOP_CLIENT);
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/TearDownTestCommand.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/TearDownTestCommand.java
new file mode 100644
index 0000000000..6b1367d4f9
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/message/TearDownTestCommand.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+public class TearDownTestCommand extends Command
+{
+
+ public TearDownTestCommand()
+ {
+ super(CommandType.TEAR_DOWN_TEST);
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/AggregatedTestResult.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/AggregatedTestResult.java
new file mode 100644
index 0000000000..5e6da2e65b
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/AggregatedTestResult.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+
+public class AggregatedTestResult implements ITestResult
+{
+ private ParticipantResult _allParticipantResult;
+ private ParticipantResult _allConsumerParticipantResult;
+ private ParticipantResult _allProducerParticipantResult;
+ private final ITestResult _originalTestResult;
+
+ public AggregatedTestResult(ITestResult originalTestResult)
+ {
+ _originalTestResult = originalTestResult;
+ }
+
+ /**
+ * Returns the result where {@link ParticipantResult#getNumberOfMessagesProcessed()}
+ * is the total number of messages consumed during the test, and {@link ParticipantResult#getTimeTaken()}
+ * is the time between the start of the first producer and the end of the last consumer to finish.
+ */
+ public ParticipantResult getAllParticipantResult()
+ {
+ return _allParticipantResult;
+ }
+
+ public void setAllParticipantResult(ParticipantResult allParticipantResult)
+ {
+ _allParticipantResult = allParticipantResult;
+ }
+
+ public ParticipantResult getAllConsumerParticipantResult()
+ {
+ return _allConsumerParticipantResult;
+ }
+ public void setAllConsumerParticipantResult(ParticipantResult allConsumerParticipantResult)
+ {
+ _allConsumerParticipantResult = allConsumerParticipantResult;
+ }
+ public ParticipantResult getAllProducerParticipantResult()
+ {
+ return _allProducerParticipantResult;
+ }
+ public void setAllProducerParticipantResult(ParticipantResult allProducerParticipantResult)
+ {
+ _allProducerParticipantResult = allProducerParticipantResult;
+ }
+
+ // TODO should weaken to Collection
+ @Override
+ public List<ParticipantResult> getParticipantResults()
+ {
+ List<ParticipantResult> allParticipantResults = new ArrayList<ParticipantResult>(_originalTestResult.getParticipantResults());
+
+ allParticipantResults.add(_allConsumerParticipantResult);
+ allParticipantResults.add(_allProducerParticipantResult);
+ allParticipantResults.add(_allParticipantResult);
+
+ return allParticipantResults;
+ }
+
+ @Override
+ public boolean hasErrors()
+ {
+ return _originalTestResult.hasErrors();
+ }
+
+ @Override
+ public String getName()
+ {
+ return _originalTestResult.getName();
+ }
+
+
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/Aggregator.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/Aggregator.java
new file mode 100644
index 0000000000..cde30d36e5
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/Aggregator.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+
+public class Aggregator
+{
+
+ private TestResultAggregator _testResultAggregator = new TestResultAggregator();
+
+ public ResultsForAllTests aggregateResults(ResultsForAllTests rawResultsForAllTests)
+ {
+
+ ResultsForAllTests aggregatedResultsForAllTests = new ResultsForAllTests();
+
+
+ for (ITestResult testResult : rawResultsForAllTests.getTestResults())
+ {
+ AggregatedTestResult aggregateTestResult = _testResultAggregator.aggregateTestResult(testResult);
+ aggregatedResultsForAllTests.add(aggregateTestResult);
+ }
+
+
+ return aggregatedResultsForAllTests;
+ }
+
+ void setTestResultAggregator(TestResultAggregator testResultAggregator)
+ {
+ _testResultAggregator = testResultAggregator;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ITestResult.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ITestResult.java
new file mode 100644
index 0000000000..3f9cdff69d
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ITestResult.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.List;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+
+// TODO rename me!!
+public interface ITestResult
+{
+
+ // TODO should weaken to Collection
+ List<ParticipantResult> getParticipantResults();
+
+ boolean hasErrors();
+
+ String getName();
+
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java
new file mode 100644
index 0000000000..207d0131eb
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregator.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.Date;
+import java.util.NavigableSet;
+import java.util.TreeSet;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+
+public class ParticipantResultAggregator
+{
+ private final String _aggregatedResultName;
+ private final Class<? extends ParticipantResult> _targetClass;
+
+ private long _minStartDate = Long.MAX_VALUE;
+ private long _maxEndDate = 0;
+ private long _numberOfMessagesProcessed = 0;
+ private long _totalPayloadProcessed = 0;
+
+ private int _totalNumberOfConsumers = 0;
+ private int _totalNumberOfProducers = 0;
+
+ private NavigableSet<Integer> _encounteredPayloadSizes = new TreeSet<Integer>();
+ private NavigableSet<Integer> _encounteredIterationNumbers = new TreeSet<Integer>();
+ private NavigableSet<Integer> _encounteredBatchSizes = new TreeSet<Integer>();
+ private NavigableSet<Integer> _encounteredAcknowledgeMode = new TreeSet<Integer>();
+ private NavigableSet<String> _encountedTestNames = new TreeSet<String>();
+
+ public ParticipantResultAggregator(Class<? extends ParticipantResult> targetClass, String aggregateResultName)
+ {
+ _aggregatedResultName = aggregateResultName;
+ _targetClass = targetClass;
+ }
+
+ public void aggregate(ParticipantResult result)
+ {
+ if (isAggregatable(result))
+ {
+ rollupConstantAttributes(result);
+ computeVariableAttributes(result);
+ }
+ }
+
+ public ParticipantResult getAggregatedResult()
+ {
+ ParticipantResult aggregatedResult = new ParticipantResult(_aggregatedResultName);
+
+ setRolledUpConstantAttributes(aggregatedResult);
+ setComputedVariableAttributes(aggregatedResult);
+
+ return aggregatedResult;
+ }
+
+ private boolean isAggregatable(ParticipantResult result)
+ {
+ return _targetClass.isAssignableFrom(result.getClass());
+ }
+
+ private void computeVariableAttributes(ParticipantResult result)
+ {
+ _numberOfMessagesProcessed += result.getNumberOfMessagesProcessed();
+ _totalPayloadProcessed += result.getTotalPayloadProcessed();
+ _totalNumberOfConsumers += result.getTotalNumberOfConsumers();
+ _totalNumberOfProducers += result.getTotalNumberOfProducers();
+ _minStartDate = Math.min(_minStartDate, result.getStartInMillis());
+ _maxEndDate = Math.max(_maxEndDate, result.getEndInMillis());
+ }
+
+ private void rollupConstantAttributes(ParticipantResult result)
+ {
+ if (result.getTestName() != null)
+ {
+ _encountedTestNames.add(result.getTestName());
+ }
+ _encounteredPayloadSizes.add(result.getPayloadSize());
+ _encounteredIterationNumbers.add(result.getIterationNumber());
+ _encounteredBatchSizes.add(result.getBatchSize());
+ _encounteredAcknowledgeMode.add(result.getAcknowledgeMode());
+ }
+
+ private void setComputedVariableAttributes(ParticipantResult aggregatedResult)
+ {
+ aggregatedResult.setNumberOfMessagesProcessed(_numberOfMessagesProcessed);
+ aggregatedResult.setTotalPayloadProcessed(_totalPayloadProcessed);
+ aggregatedResult.setTotalNumberOfConsumers(_totalNumberOfConsumers);
+ aggregatedResult.setTotalNumberOfProducers(_totalNumberOfProducers);
+ aggregatedResult.setStartDate(new Date(_minStartDate));
+ aggregatedResult.setEndDate(new Date(_maxEndDate));
+ aggregatedResult.setThroughput(calculateThroughputInKiloBytesPerSecond());
+ }
+
+ private void setRolledUpConstantAttributes(ParticipantResult aggregatedResult)
+ {
+ if (_encounteredIterationNumbers.size() == 1)
+ {
+ aggregatedResult.setIterationNumber( _encounteredIterationNumbers.first());
+ }
+ if (_encounteredPayloadSizes.size() == 1)
+ {
+ aggregatedResult.setPayloadSize(_encounteredPayloadSizes.first());
+ }
+ if (_encountedTestNames.size() == 1)
+ {
+ aggregatedResult.setTestName(_encountedTestNames.first());
+ }
+ if (_encounteredBatchSizes.size() == 1)
+ {
+ aggregatedResult.setBatchSize(_encounteredBatchSizes.first());
+ }
+ if (_encounteredAcknowledgeMode.size() == 1)
+ {
+ aggregatedResult.setAcknowledgeMode(_encounteredAcknowledgeMode.first());
+ }
+ }
+
+ private double calculateThroughputInKiloBytesPerSecond()
+ {
+ double durationInMillis = _maxEndDate - _minStartDate;
+ double durationInSeconds = durationInMillis / 1000;
+ double totalPayloadProcessedInKiloBytes = ((double)_totalPayloadProcessed) / 1024;
+
+ return totalPayloadProcessedInKiloBytes/durationInSeconds;
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregator.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregator.java
new file mode 100644
index 0000000000..5934e0e997
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregator.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+
+public class TestResultAggregator
+{
+ static final String AGGREGATED_ERROR_MESSAGE = "One or more participants reported errors.";
+ public static final String ALL_PARTICIPANTS_NAME = "All";
+ public static final String ALL_PRODUCER_PARTICIPANTS_NAME = "All Producers";
+ public static final String ALL_CONSUMER_PARTICIPANTS_NAME = "All Consumers";
+
+ public AggregatedTestResult aggregateTestResult(ITestResult originalTestResult)
+ {
+ ParticipantResultAggregator consumerResultAggregator = new ParticipantResultAggregator(ConsumerParticipantResult.class,
+ ALL_CONSUMER_PARTICIPANTS_NAME);
+ ParticipantResultAggregator producerResultAggregator = new ParticipantResultAggregator(ProducerParticipantResult.class,
+ ALL_PRODUCER_PARTICIPANTS_NAME);
+ ParticipantResultAggregator aggregatedResultsAggregator = new ParticipantResultAggregator(ParticipantResult.class,
+ ALL_PARTICIPANTS_NAME);
+
+ boolean hasError = aggregateOriginalResults(originalTestResult,
+ consumerResultAggregator,
+ producerResultAggregator);
+
+ ParticipantResult aggregatedProducerResult = producerResultAggregator.getAggregatedResult();
+ ParticipantResult aggregaredConsumerResult = consumerResultAggregator.getAggregatedResult();
+
+ ParticipantResult aggregatedAllResult = aggregateAggregatedResults(
+ aggregatedResultsAggregator, aggregatedProducerResult,
+ aggregaredConsumerResult);
+
+ applyNonAggregateablesToAll(aggregatedAllResult,
+ aggregatedProducerResult, aggregaredConsumerResult);
+
+ AggregatedTestResult newTestResult = new AggregatedTestResult(originalTestResult);
+ newTestResult.setAllProducerParticipantResult(aggregatedProducerResult);
+ newTestResult.setAllConsumerParticipantResult(aggregaredConsumerResult);
+ newTestResult.setAllParticipantResult(aggregatedAllResult);
+
+ if (hasError)
+ {
+ aggregatedAllResult.setErrorMessage(TestResultAggregator.AGGREGATED_ERROR_MESSAGE);
+ }
+
+ return newTestResult;
+ }
+
+ private ParticipantResult aggregateAggregatedResults(
+ ParticipantResultAggregator aggregatedResultsAggregator,
+ ParticipantResult aggregatedProducerResult,
+ ParticipantResult aggregaredConsumerResult)
+ {
+ aggregatedResultsAggregator.aggregate(aggregatedProducerResult);
+ aggregatedResultsAggregator.aggregate(aggregaredConsumerResult);
+ ParticipantResult aggregatedAllResult = aggregatedResultsAggregator.getAggregatedResult();
+ return aggregatedAllResult;
+ }
+
+ private boolean aggregateOriginalResults(ITestResult originalTestResult,
+ ParticipantResultAggregator consumerParticipantResultAggregator,
+ ParticipantResultAggregator producerParticipantResultAggregator)
+ {
+ boolean hasError = false;
+ for (ParticipantResult result : originalTestResult.getParticipantResults())
+ {
+ consumerParticipantResultAggregator.aggregate(result);
+ producerParticipantResultAggregator.aggregate(result);
+
+ if (result.hasError())
+ {
+ hasError = true;
+ }
+ }
+ return hasError;
+ }
+
+ private void applyNonAggregateablesToAll(ParticipantResult aggregatedAllResult, ParticipantResult aggregatedProducerResult, ParticipantResult aggregatedConsumerResult)
+ {
+ aggregatedAllResult.setStartDate(aggregatedProducerResult.getStartDate());
+ aggregatedAllResult.setEndDate(aggregatedConsumerResult.getEndDate());
+
+ aggregatedAllResult.setNumberOfMessagesProcessed(aggregatedConsumerResult.getNumberOfMessagesProcessed());
+ aggregatedAllResult.setTotalPayloadProcessed(aggregatedConsumerResult.getTotalPayloadProcessed());
+ aggregatedAllResult.setThroughput(aggregatedConsumerResult.getThroughput());
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVFormater.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVFormater.java
new file mode 100644
index 0000000000..52e53ca624
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVFormater.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.formatting;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.message.ParticipantAttribute;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+
+/**
+ * produces CSV output using the ordered enums in {@link ParticipantAttribute}
+ */
+public class CSVFormater
+{
+ public String format(ResultsForAllTests results)
+ {
+ StringBuilder builder = new StringBuilder();
+
+ builder.append(header());
+
+ List<ITestResult> testResults = results.getTestResults();
+
+ for (ITestResult testResult : testResults)
+ {
+
+ List<ParticipantResult> participantResults = new ArrayList<ParticipantResult>(testResult.getParticipantResults());
+ Collections.sort(participantResults, new CSVOrderParticipantResultComparator());
+
+ for (ParticipantResult participantResult : participantResults)
+ {
+ Map<ParticipantAttribute, Object> attributes = participantResult.getAttributes();
+ builder.append(row(attributes));
+ }
+ }
+
+ return builder.toString();
+ }
+
+ /**
+ * return a row, including a newline character at the end
+ */
+ private String row(Map<ParticipantAttribute, Object> attributeValueMap)
+ {
+ List<Object> attributeValues = new ArrayList<Object>();
+ for (ParticipantAttribute attribute : ParticipantAttribute.values())
+ {
+ attributeValues.add(attributeValueMap.get(attribute));
+ }
+
+ String row = StringUtils.join(attributeValues.toArray(), ",");
+ return row + "\n";
+ }
+
+ /** return the header row, including a newline at the end */
+ private String header()
+ {
+ List<String> displayNames = new ArrayList<String>();
+ for (ParticipantAttribute attribute : ParticipantAttribute.values())
+ {
+ displayNames.add(attribute.getDisplayName());
+ }
+
+ String header = StringUtils.join(displayNames.toArray(), ",");
+ return header + "\n";
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparator.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparator.java
new file mode 100644
index 0000000000..0e1fbbc3c6
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparator.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.formatting;
+
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+
+public class CSVOrderParticipantResultComparator implements Comparator<ParticipantResult>
+{
+ // TODO yuk
+ private static final Map<Class<? extends ParticipantResult>, Integer> TYPE_CODES = new HashMap<Class<? extends ParticipantResult>, Integer>();
+ static {
+ TYPE_CODES.put(ProducerParticipantResult.class, 0);
+ TYPE_CODES.put(ConsumerParticipantResult.class, 1);
+ TYPE_CODES.put(ParticipantResult.class, 2);
+ }
+
+ @Override
+ public int compare(ParticipantResult left, ParticipantResult right)
+ {
+ return new CompareToBuilder()
+ .append(getTypeCode(left), getTypeCode(right))
+ .append(left.getParticipantName(), right.getParticipantName())
+ .toComparison();
+ }
+
+
+ private int getTypeCode(ParticipantResult participantResult)
+ {
+ return TYPE_CODES.get(participantResult.getClass());
+ }
+
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Config.java b/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Config.java
deleted file mode 100644
index 5b6169ed2d..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Config.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.oldtopic;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.config.ConnectorConfig;
-import org.apache.qpid.config.ConnectionFactoryInitialiser;
-import org.apache.qpid.config.Connector;
-import org.apache.qpid.config.AbstractConfig;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-
-class Config extends AbstractConfig implements ConnectorConfig
-{
-
- private String host = "localhost";
- private int port = 5672;
- private String factory = null;
-
- private int payload = 256;
- private int messages = 1000;
- private int clients = 1;
- private int batch = 1;
- private long delay = 1;
- private int warmup;
- private int ackMode= AMQSession.NO_ACKNOWLEDGE;
- private String clientId;
- private String subscriptionId;
- private boolean persistent;
-
- public Config()
- {
- }
-
- int getAckMode()
- {
- return ackMode;
- }
-
- void setPayload(int payload)
- {
- this.payload = payload;
- }
-
- int getPayload()
- {
- return payload;
- }
-
- void setClients(int clients)
- {
- this.clients = clients;
- }
-
- int getClients()
- {
- return clients;
- }
-
- void setMessages(int messages)
- {
- this.messages = messages;
- }
-
- int getMessages()
- {
- return messages;
- }
-
- public String getHost()
- {
- return host;
- }
-
- public void setHost(String host)
- {
- this.host = host;
- }
-
- public int getPort()
- {
- return port;
- }
-
- public String getFactory()
- {
- return factory;
- }
-
- public void setPort(int port)
- {
- this.port = port;
- }
-
- int getBatch()
- {
- return batch;
- }
-
- void setBatch(int batch)
- {
- this.batch = batch;
- }
-
- int getWarmup()
- {
- return warmup;
- }
-
- void setWarmup(int warmup)
- {
- this.warmup = warmup;
- }
-
- public long getDelay()
- {
- return delay;
- }
-
- public void setDelay(long delay)
- {
- this.delay = delay;
- }
-
- String getClientId()
- {
- return clientId;
- }
-
- String getSubscriptionId()
- {
- return subscriptionId;
- }
-
- boolean usePersistentMessages()
- {
- return persistent;
- }
-
- public void setOption(String key, String value)
- {
- if("-host".equalsIgnoreCase(key))
- {
- setHost(value);
- }
- else if("-port".equalsIgnoreCase(key))
- {
- try
- {
- setPort(Integer.parseInt(value));
- }
- catch(NumberFormatException e)
- {
- throw new RuntimeException("Bad port number: " + value);
- }
- }
- else if("-payload".equalsIgnoreCase(key))
- {
- setPayload(parseInt("Bad payload size", value));
- }
- else if("-messages".equalsIgnoreCase(key))
- {
- setMessages(parseInt("Bad message count", value));
- }
- else if("-clients".equalsIgnoreCase(key))
- {
- setClients(parseInt("Bad client count", value));
- }
- else if("-batch".equalsIgnoreCase(key))
- {
- setBatch(parseInt("Bad batch count", value));
- }
- else if("-delay".equalsIgnoreCase(key))
- {
- setDelay(parseLong("Bad batch delay", value));
- }
- else if("-warmup".equalsIgnoreCase(key))
- {
- setWarmup(parseInt("Bad warmup count", value));
- }
- else if("-ack".equalsIgnoreCase(key))
- {
- ackMode = parseInt("Bad ack mode", value);
- }
- else if("-factory".equalsIgnoreCase(key))
- {
- factory = value;
- }
- else if("-clientId".equalsIgnoreCase(key))
- {
- clientId = value;
- }
- else if("-subscriptionId".equalsIgnoreCase(key))
- {
- subscriptionId = value;
- }
- else if("-persistent".equalsIgnoreCase(key))
- {
- persistent = "true".equalsIgnoreCase(value);
- }
- else
- {
- System.out.println("Ignoring unrecognised option: " + key);
- }
- }
-
- static String getAckModeDescription(int ackMode)
- {
- switch(ackMode)
- {
- case AMQSession.NO_ACKNOWLEDGE: return "NO_ACKNOWLEDGE";
- case AMQSession.AUTO_ACKNOWLEDGE: return "AUTO_ACKNOWLEDGE";
- case AMQSession.CLIENT_ACKNOWLEDGE: return "CLIENT_ACKNOWLEDGE";
- case AMQSession.DUPS_OK_ACKNOWLEDGE: return "DUPS_OK_ACKNOWELDGE";
- case AMQSession.PRE_ACKNOWLEDGE: return "PRE_ACKNOWLEDGE";
- }
- return "AckMode=" + ackMode;
- }
-
- public Connection createConnection() throws Exception
- {
- return new Connector().createConnection(this);
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Listener.java b/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Listener.java
deleted file mode 100644
index 4732782d4c..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Listener.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.oldtopic;
-import org.apache.log4j.*;
-import javax.jms.Connection;
-import javax.jms.Message;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-public class Listener implements MessageListener
-{
- private final Connection _connection;
- private final MessageProducer _controller;
- private final javax.jms.Session _session;
- private final MessageFactory _factory;
- private boolean init;
- private int count;
- private long start;
-
- Listener(Connection connection, int ackMode) throws Exception
- {
- this(connection, ackMode, null);
- }
-
- Listener(Connection connection, int ackMode, String name) throws Exception
- {
- _connection = connection;
- _session = connection.createSession(false, ackMode);
- _factory = new MessageFactory(_session);
-
- //register for events
- if(name == null)
- {
- _factory.createTopicConsumer().setMessageListener(this);
- }
- else
- {
- _factory.createDurableTopicConsumer(name).setMessageListener(this);
- }
-
- _connection.start();
-
- _controller = _factory.createControlPublisher();
- System.out.println("Waiting for messages " +
- Config.getAckModeDescription(ackMode)
- + (name == null ? "" : " (subscribed with name " + name + " and client id " + connection.getClientID() + ")")
- + "...");
-
- }
-
- private void shutdown()
- {
- try
- {
- _session.close();
- _connection.stop();
- _connection.close();
- }
- catch(Exception e)
- {
- e.printStackTrace(System.out);
- }
- }
-
- private void report()
- {
- try
- {
- String msg = getReport();
- _controller.send(_factory.createReportResponseMessage(msg));
- System.out.println("Sent report: " + msg);
- }
- catch(Exception e)
- {
- e.printStackTrace(System.out);
- }
- }
-
- private String getReport()
- {
- long time = (System.currentTimeMillis() - start);
- return "Received " + count + " in " + time + "ms";
- }
-
- public void onMessage(Message message)
- {
- if(!init)
- {
- start = System.currentTimeMillis();
- count = 0;
- init = true;
- }
-
- if(_factory.isShutdown(message))
- {
- shutdown();
- }
- else if(_factory.isReport(message))
- {
- //send a report:
- report();
- init = false;
- }
- else if (++count % 100 == 0)
- {
- System.out.println("Received " + count + " messages.");
- }
- }
-
- public static void main(String[] argv) throws Exception
- {
- Config config = new Config();
- config.setOptions(argv);
-
- Connection con = config.createConnection();
- if(config.getClientId() != null)
- {
- con.setClientID(config.getClientId());
- }
- new Listener(con, config.getAckMode(), config.getSubscriptionId());
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/MessageFactory.java b/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/MessageFactory.java
deleted file mode 100644
index b2fbeb7e35..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/MessageFactory.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.oldtopic;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.client.AMQTopic;
-
-import javax.jms.*;
-
-/**
- */
-class MessageFactory
-{
- private static final char[] DATA = "abcdefghijklmnopqrstuvwxyz".toCharArray();
-
- private final Session _session;
- private final Topic _topic;
- private final Topic _control;
- private final byte[] _payload;
-
-
- MessageFactory(Session session) throws JMSException
- {
- this(session, 256);
- }
-
- MessageFactory(Session session, int size) throws JMSException
- {
- _session = session;
-/* if(session instanceof AMQSession)
- {
- _topic = new AMQTopic("topictest.messages");
- _control = new AMQTopic("topictest.control");
- }
- else*/
- {
- _topic = session.createTopic("topictest.messages");
- _control = session.createTopic("topictest.control");
- }
- _payload = new byte[size];
-
- for(int i = 0; i < size; i++)
- {
- _payload[i] = (byte) DATA[i % DATA.length];
- }
- }
-
- Topic getTopic()
- {
- return _topic;
- }
-
- Message createEventMessage() throws JMSException
- {
- BytesMessage msg = _session.createBytesMessage();
- msg.writeBytes(_payload);
- return msg;
- }
-
- Message createShutdownMessage() throws JMSException
- {
- return _session.createTextMessage("SHUTDOWN");
- }
-
- Message createReportRequestMessage() throws JMSException
- {
- return _session.createTextMessage("REPORT");
- }
-
- Message createReportResponseMessage(String msg) throws JMSException
- {
- return _session.createTextMessage(msg);
- }
-
- boolean isShutdown(Message m)
- {
- return checkText(m, "SHUTDOWN");
- }
-
- boolean isReport(Message m)
- {
- return checkText(m, "REPORT");
- }
-
- Object getReport(Message m)
- {
- try
- {
- return ((TextMessage) m).getText();
- }
- catch (JMSException e)
- {
- e.printStackTrace(System.out);
- return e.toString();
- }
- }
-
- MessageConsumer createTopicConsumer() throws Exception
- {
- return _session.createConsumer(_topic);
- }
-
- MessageConsumer createDurableTopicConsumer(String name) throws Exception
- {
- return _session.createDurableSubscriber(_topic, name);
- }
-
- MessageConsumer createControlConsumer() throws Exception
- {
- return _session.createConsumer(_control);
- }
-
- MessageProducer createTopicPublisher() throws Exception
- {
- return _session.createProducer(_topic);
- }
-
- MessageProducer createControlPublisher() throws Exception
- {
- return _session.createProducer(_control);
- }
-
- private static boolean checkText(Message m, String s)
- {
- try
- {
- return m instanceof TextMessage && ((TextMessage) m).getText().equals(s);
- }
- catch (JMSException e)
- {
- e.printStackTrace(System.out);
- return false;
- }
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Publisher.java b/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Publisher.java
deleted file mode 100644
index 841fcc63ad..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/oldtopic/Publisher.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.oldtopic;
-
-import javax.jms.*;
-
-public class Publisher implements MessageListener
-{
- private final Object _lock = new Object();
- private final Connection _connection;
- private final Session _session;
- private final MessageFactory _factory;
- private final MessageProducer _publisher;
- private int _count;
-
- Publisher(Connection connection, int size, int ackMode, boolean persistent) throws Exception
- {
- _connection = connection;
- _session = _connection.createSession(false, ackMode);
- _factory = new MessageFactory(_session, size);
- _publisher = _factory.createTopicPublisher();
- _publisher.setDeliveryMode(persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
- System.out.println("Publishing " + (persistent ? "persistent" : "non-persistent") + " messages of " + size + " bytes, " + Config.getAckModeDescription(ackMode) + ".");
- }
-
- private void test(Config config) throws Exception
- {
- test(config.getBatch(), config.getDelay(), config.getMessages(), config.getClients(), config.getWarmup());
- }
-
- private void test(int batches, long delay, int msgCount, int consumerCount, int warmup) throws Exception
- {
- _factory.createControlConsumer().setMessageListener(this);
- _connection.start();
-
- if(warmup > 0)
- {
- System.out.println("Runing warmup (" + warmup + " msgs)");
- long time = batch(warmup, consumerCount);
- System.out.println("Warmup completed in " + time + "ms");
- }
-
- long[] times = new long[batches];
- for(int i = 0; i < batches; i++)
- {
- if(i > 0)
- {
- Thread.sleep(delay*1000);
- }
- times[i] = batch(msgCount, consumerCount);
- System.out.println("Batch " + (i+1) + " of " + batches + " completed in " + times[i] + " ms.");
- }
-
- long min = min(times);
- long max = max(times);
- System.out.println("min: " + min + ", max: " + max + " avg: " + avg(times, min, max));
-
- //request shutdown
- _publisher.send(_factory.createShutdownMessage());
-
- _connection.stop();
- _connection.close();
- }
-
- private long batch(int msgCount, int consumerCount) throws Exception
- {
- _count = consumerCount;
- long start = System.currentTimeMillis();
- publish(msgCount);
- waitForCompletion(consumerCount);
- return System.currentTimeMillis() - start;
- }
-
- private void publish(int count) throws Exception
- {
-
- //send events
- for (int i = 0; i < count; i++)
- {
- _publisher.send(_factory.createEventMessage());
- if ((i + 1) % 100 == 0)
- {
- System.out.println("Sent " + (i + 1) + " messages");
- }
- }
-
- //request report
- _publisher.send(_factory.createReportRequestMessage());
- }
-
- private void waitForCompletion(int consumers) throws Exception
- {
- System.out.println("Waiting for completion...");
- synchronized (_lock)
- {
- while (_count > 0)
- {
- _lock.wait();
- }
- }
- }
-
-
- public void onMessage(Message message)
- {
- System.out.println("Received report " + _factory.getReport(message) + " " + --_count + " remaining");
- if (_count == 0)
- {
- synchronized (_lock)
- {
- _lock.notify();
- }
- }
- }
-
- static long min(long[] times)
- {
- long min = times.length > 0 ? times[0] : 0;
- for(int i = 0; i < times.length; i++)
- {
- min = Math.min(min, times[i]);
- }
- return min;
- }
-
- static long max(long[] times)
- {
- long max = times.length > 0 ? times[0] : 0;
- for(int i = 0; i < times.length; i++)
- {
- max = Math.max(max, times[i]);
- }
- return max;
- }
-
- static long avg(long[] times, long min, long max)
- {
- long sum = 0;
- for(int i = 0; i < times.length; i++)
- {
- sum += times[i];
- }
- sum -= min;
- sum -= max;
-
- return (sum / (times.length - 2));
- }
-
- public static void main(String[] argv) throws Exception
- {
- Config config = new Config();
- config.setOptions(argv);
-
- Connection con = config.createConnection();
- int size = config.getPayload();
- int ackMode = config.getAckMode();
- boolean persistent = config.usePersistentMessages();
- new Publisher(con, size, ackMode, persistent).test(config);
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingAsyncTestPerf.java b/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingAsyncTestPerf.java
deleted file mode 100644
index b55dac45c7..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingAsyncTestPerf.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.ping;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.requestreply.PingPongProducer;
-
-import org.apache.qpid.junit.extensions.TimingController;
-import org.apache.qpid.junit.extensions.TimingControllerAware;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * PingAsyncTestPerf is a performance test that outputs multiple timings from its test method, using the timing controller
- * interface supplied by the test runner from a seperate listener thread. It differs from the {@link PingTestPerf} test
- * that it extends because it can output timings as replies are received, rather than waiting until all expected replies
- * are received. This is less 'blocky' than the tests in {@link PingTestPerf}, and provides a truer simulation of sending
- * and recieving clients working asynchronously.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><td> Responsibilities <th> Collaborations
- * <tr><td> Send many ping messages and output timings asynchronously on batches received.
- * </table>
- */
-public class PingAsyncTestPerf extends PingTestPerf implements TimingControllerAware
-{
- private static Logger _logger = Logger.getLogger(PingAsyncTestPerf.class);
-
- /** Holds the name of the property to get the test results logging batch size. */
- public static final String TEST_RESULTS_BATCH_SIZE_PROPNAME = "batchSize";
-
- /** Holds the default test results logging batch size. */
- public static final int TEST_RESULTS_BATCH_SIZE_DEFAULT = 1000;
-
- /** Used to hold the timing controller passed from the test runner. */
- private TimingController _timingController;
-
- /** Used to generate unique correlation ids for each test run. */
- private AtomicLong corellationIdGenerator = new AtomicLong();
-
- /** Holds test specifics by correlation id. This consists of the expected number of messages and the timing controler. */
- private Map<String, PerCorrelationId> perCorrelationIds =
- Collections.synchronizedMap(new HashMap<String, PerCorrelationId>());
-
- /** Holds the batched results listener, that does logging on batch boundaries. */
- private BatchedResultsListener batchedResultsListener = null;
-
- /**
- * Creates a new asynchronous ping performance test with the specified name.
- *
- * @param name The test name.
- */
- public PingAsyncTestPerf(String name)
- {
- super(name);
-
- // Sets up the test parameters with defaults.
- testParameters.setPropertyIfNull(TEST_RESULTS_BATCH_SIZE_PROPNAME,
- Integer.toString(TEST_RESULTS_BATCH_SIZE_DEFAULT));
- }
-
- /**
- * Compile all the tests into a test suite.
- * @return The test suite to run. Should only contain testAsyncPingOk method.
- */
- public static Test suite()
- {
- // Build a new test suite
- TestSuite suite = new TestSuite("Ping Performance Tests");
-
- // Run performance tests in read committed mode.
- suite.addTest(new PingAsyncTestPerf("testAsyncPingOk"));
-
- return suite;
- }
-
- /**
- * Accepts a timing controller from the test runner.
- *
- * @param timingController The timing controller to register mutliple timings with.
- */
- public void setTimingController(TimingController timingController)
- {
- _timingController = timingController;
- }
-
- /**
- * Gets the timing controller passed in by the test runner.
- *
- * @return The timing controller passed in by the test runner.
- */
- public TimingController getTimingController()
- {
- return _timingController;
- }
-
- /**
- * Sends the specified number of pings, asynchronously outputs timings on every batch boundary, and waits until
- * all replies have been received or a time out occurs before exiting this method.
- *
- * @param numPings The number of pings to send.
- * @throws Exception pass all errors out to the test harness
- */
- public void testAsyncPingOk(int numPings) throws Exception
- {
- // _logger.debug("public void testAsyncPingOk(int numPings): called");
-
- // get prefill count to update the expected count
- int preFill = testParameters.getPropertyAsInteger(PingPongProducer.PREFILL_PROPNAME);
-
- // Ensure that at least one ping was requeusted.
- if (numPings + preFill == 0)
- {
- _logger.error("Number of pings requested was zero.");
- fail("Number of pings requested was zero.");
- }
-
- // Get the per thread test setup to run the test through.
- PerThreadSetup perThreadSetup = threadSetup.get();
- PingClient pingClient = perThreadSetup._pingClient;
-
- // Advance the correlation id of messages to send, to make it unique for this run.
- perThreadSetup._correlationId = Long.toString(corellationIdGenerator.incrementAndGet());
- // String messageCorrelationId = perThreadSetup._correlationId;
- // _logger.debug("messageCorrelationId = " + messageCorrelationId);
-
-
- // Initialize the count and timing controller for the new correlation id.
- // This perCorrelationId is only used for controlling the test.
- // The PingClient itself uses its own perCorrelationId see in PingPongProducer
- PerCorrelationId perCorrelationId = new PerCorrelationId();
- TimingController tc = getTimingController().getControllerForCurrentThread();
- perCorrelationId._tc = tc;
- perCorrelationId._expectedCount = pingClient.getExpectedNumPings(numPings + preFill);
- perCorrelationIds.put(perThreadSetup._correlationId, perCorrelationId);
-
- // Must be called before pingAndWaitForReply to setup the CorrelationID.
- // This is required because pingClient.start() will start all client threads
- // This means that the CorrelationID must be registered before hand.
- pingClient.setupCorrelationID(perThreadSetup._correlationId, perCorrelationId._expectedCount);
-
- // Start the client connection if:
- // 1) we are not in a SEND_ONLY test.
- // 2) if we have not yet started client because messages are sitting on broker.
- // This is either due to a preFill or a consume only test.
- if (!testParameters.getPropertyAsBoolean(PingPongProducer.SEND_ONLY_PROPNAME) &&
- (preFill > 0 || testParameters.getPropertyAsBoolean(PingPongProducer.CONSUME_ONLY_PROPNAME)))
- {
- pingClient.start();
- }
-
- // Send the requested number of messages, and wait until they have all been received.
- long timeout = Long.parseLong(testParameters.getProperty(PingPongProducer.TIMEOUT_PROPNAME));
- int numReplies = pingClient.pingAndWaitForReply(null, numPings , preFill, timeout, perThreadSetup._correlationId);
-
- // Check that all the replies were received and log a fail if they were not.
- if (numReplies < perCorrelationId._expectedCount)
- {
- System.out.println("##### " + numReplies + "replies, expected " + perCorrelationId._expectedCount + " #####");
- perCorrelationId._tc.completeTest(false, numPings - perCorrelationId._expectedCount);
- }
-
- // Remove the expected count and timing controller for the message correlation id, to ensure they are cleaned up.
- perCorrelationIds.remove(perThreadSetup._correlationId);
- }
-
- /**
- * Performs test fixture creation on a per thread basis. This will only be called once for each test thread.
- */
- public void threadSetUp()
- {
- _logger.debug("public void threadSetUp(): called");
-
- try
- {
- // Call the set up method in the super class. This creates a PingClient pinger.
- super.threadSetUp();
-
- // Create the chained message listener, only if it has not already been created. This is set up with the
- // batch size property, to tell it what batch size to output results on. A synchronized block is used to
- // ensure that only one thread creates this.
- synchronized (this)
- {
- if (batchedResultsListener == null)
- {
- int batchSize = Integer.parseInt(testParameters.getProperty(TEST_RESULTS_BATCH_SIZE_PROPNAME));
- batchedResultsListener = new BatchedResultsListener(batchSize);
- }
- }
-
- // Get the set up that the super class created.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- // Register the chained message listener on the pinger to do its asynchronous test timings from.
- perThreadSetup._pingClient.setChainedMessageListener(batchedResultsListener);
- }
- catch (Exception e)
- {
- _logger.warn("There was an exception during per thread setup.", e);
- }
- }
-
- /**
- * BatchedResultsListener is a {@link PingPongProducer.ChainedMessageListener} that can be attached to the
- * pinger, in order to receive notifications about every message received and the number remaining to be
- * received. Whenever the number remaining crosses a batch size boundary this results listener outputs
- * a test timing for the actual number of messages received in the current batch.
- */
- private class BatchedResultsListener implements PingPongProducer.ChainedMessageListener
- {
- /** The test results logging batch size. */
- int _batchSize;
-
- /** The latency recoreded for the batch */
- private long _batchLatency = 0;
-
- /**
- * Creates a results listener on the specified batch size.
- *
- * @param batchSize The batch size to use.
- */
- public BatchedResultsListener(int batchSize)
- {
- _batchSize = batchSize;
- }
-
- /**
- * This callback method is called from all of the pingers that this test creates. It uses the correlation id
- * from the message to identify the timing controller for the test thread that was responsible for sending those
- * messages.
- *
- * @param message The message.
- * @param remainingCount The count of messages remaining to be received with a particular correlation id.
- *
- * @throws JMSException Any underlying JMSException is allowed to fall through.
- */
- public void onMessage(Message message, int remainingCount, long latency) throws JMSException
- {
- // Record the latency for the whole batch
- _batchLatency += latency;
- // Check if a batch boundary has been crossed.
- if ((remainingCount % _batchSize) == 0)
- {
- // Extract the correlation id from the message.
- String correlationId = message.getJMSCorrelationID();
-
- /*_logger.debug("public void onMessage(Message message, int remainingCount = " + remainingCount
- + "): called on batch boundary for message id: " + correlationId + " with thread id: "
- + Thread.currentThread().getId());*/
-
- // Get the details for the correlation id and check that they are not null. They can become null
- // if a test times out.
- PerCorrelationId perCorrelationId = perCorrelationIds.get(correlationId);
- if (perCorrelationId != null)
- {
- // Get the timing controller and expected count for this correlation id.
- TimingController tc = perCorrelationId._tc;
- int expected = perCorrelationId._expectedCount;
-
- // Calculate how many messages were actually received in the last batch. This will be the batch size
- // except where the number expected is not a multiple of the batch size and this is the first remaining
- // count to cross a batch size boundary, in which case it will be the number expected modulo the batch
- // size.
- int receivedInBatch = ((expected - remainingCount) < _batchSize) ? (expected % _batchSize) : _batchSize;
-
- // Register a test result for the correlation id.
- try
- {
- // Record the total latency for the batch.
- // if batchSize=1 then this will just be the message latency
- tc.completeTest(true, receivedInBatch, null, _batchSize == 1 ? latency : _batchLatency);
- // Reset latency
- _batchLatency = 0;
- }
- catch (InterruptedException e)
- {
- // Ignore this. It means the test runner wants to stop as soon as possible.
- _logger.warn("Got InterruptedException.", e);
- }
- }
- // Else ignore, test timed out. Should log a fail here?
- }
- }
- }
-
- /**
- * Holds state specific to each correlation id, needed to output test results. This consists of the count of
- * the total expected number of messages, and the timing controller for the thread sending those message ids.
- */
- private static class PerCorrelationId
- {
- public int _expectedCount;
- public TimingController _tc;
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingClient.java b/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingClient.java
deleted file mode 100644
index dcfc67d4fc..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingClient.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.ping;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.requestreply.PingPongProducer;
-
-import javax.jms.Destination;
-
-import java.util.List;
-import java.util.Properties;
-
-/**
- * PingClient is a {@link PingPongProducer} that does not need a {@link org.apache.qpid.requestreply.PingPongBouncer}
- * to send replies to its pings. It simply listens to its own ping destinations, rather than seperate reply queues.
- * It is an all in one ping client, that produces and consumes its own pings.
- *
- * <p/>The constructor increments a count of the number of ping clients created. It is assumed that where many
- * are created they will all be run in parallel and be active in sending and consuming pings at the same time.
- * If the unique destinations flag is not set and a pub/sub ping cycle is being run, this means that they will all hear
- * pings sent by each other. The expected number of pings received will therefore be multiplied up by the number of
- * active ping clients. The {@link #getConsumersPerDestination()} method is used to supply this multiplier under these
- * conditions.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create a ping producer that listens to its own pings <td> {@link PingPongProducer}
- * <tr><td> Count the number of ping producers and produce multiplier for scaling up messages expected over topic pings.
- * </table>
- */
-public class PingClient extends PingPongProducer
-{
- /** Used for debugging. */
- private final Logger log = Logger.getLogger(PingClient.class);
-
- /** Used to count the number of ping clients created. */
- private static int _pingClientCount;
-
- /**
- * Creates a ping producer with the specified parameters, of which there are many. See the class level comments
- * for {@link PingPongProducer} for details. This constructor creates a connection to the broker and creates
- * producer and consumer sessions on it, to send and recieve its pings and replies on.
- *
- * @param overrides Properties containing any desired overrides to the defaults.
- *
- * @throws Exception Any exceptions are allowed to fall through.
- */
- public PingClient(Properties overrides) throws Exception
- {
- super(overrides);
-
- _pingClientCount++;
- }
-
- /**
- * Returns the ping destinations themselves as the reply destinations for this pinger to listen to. This has the
- * effect of making this pinger listen to its own pings.
- *
- * @return The ping destinations.
- */
- public List<Destination> getReplyDestinations()
- {
- return _pingDestinations;
- }
-
- /**
- * Supplies the multiplier for the number of ping clients that will hear each ping when doing pub/sub pinging.
- *
- * @return The scaling up of the number of expected pub/sub pings.
- */
- public int getConsumersPerDestination()
- {
- log.debug("public int getConsumersPerDestination(): called");
-
- if (_isUnique)
- {
- log.debug(_noOfConsumers + " consumer per destination.");
-
- return _noOfConsumers;
- }
- else
- {
- log.debug((_pingClientCount * _noOfConsumers) + " consumers per destination.");
-
- return _pingClientCount * _noOfConsumers;
- }
- }
-
- public int getClientCount()
- {
- return _pingClientCount;
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java b/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java
deleted file mode 100644
index a15897c82b..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.ping;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.requestreply.PingPongProducer;
-import org.apache.qpid.util.CommandLineParser;
-
-import org.apache.qpid.junit.extensions.util.MathUtils;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import javax.jms.*;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.List;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * PingDurableClient is a variation of the {@link PingPongProducer} ping tool. Instead of sending its pings and
- * receiving replies to them at the same time, this tool sends pings until it is signalled by some 'event' to stop
- * sending. It then waits for another signal before it re-opens a fresh connection and attempts to receive all of the
- * pings that it has succesfully sent. It is intended to be an interactive test that lets a user experiment with
- * failure conditions when using durable messaging.
- *
- * <p/>The events that can stop it from sending are input from the user on the console, failure of its connection to
- * the broker, completion of sending a specified number of messages, or expiry of a specified duration. In all cases
- * it will do its best to clean up and close the connection before opening a fresh connection to receive the pings
- * with.
- *
- * <p/>The event to re-connect and attempt to recieve the pings is input from the user on the console.
- *
- * <p/>This ping client inherits the configuration properties of its parent class ({@link PingPongProducer}) and
- * additionally accepts the following parameters:
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> numMessages <td> 100 <td> The total number of messages to send.
- * <tr><td> numMessagesToAction <td> -1 <td> The number of messages to send before taking a custom 'action'.
- * <tr><td> duration <td> 30S <td> The length of time to ping for. (Format dDhHmMsS, for d days, h hours,
- * m minutes and s seconds).
- * </table>
- *
- * <p/>This ping client also overrides some of the defaults of its parent class, to provide a reasonable set up
- * when no parameters are specified.
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> uniqueDests <td> false <td> Prevents destination names being timestamped.
- * <tr><td> transacted <td> true <td> Only makes sense to test with transactions.
- * <tr><td> persistent <td> true <td> Only makes sense to test persistent.
- * <tr><td> durableDests <td> true <td> Should use durable queues with persistent messages.
- * <tr><td> commitBatchSize <td> 10
- * <tr><td> rate <td> 20 <td> Total default test time is 5 seconds.
- * </table>
- *
- * <p/>When a number of messages or duration is specified, this ping client will ping until the first of those limits
- * is reached. Reaching the limit will be interpreted as the first signal to stop sending, and the ping client will
- * wait for the second signal before receiving its pings.
- *
- * <p/>This class provides a mechanism for extensions to add arbitrary actions, after a particular number of messages
- * have been sent. When the number of messages equal the value set in the 'numMessagesToAction' property is method,
- * the {@link #takeAction} method is called. By default this does nothing, but extensions of this class can provide
- * custom behaviour with alternative implementations of this method (for example taking a backup).
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Send and receive pings.
- * <tr><td> Accept user input to signal stop sending.
- * <tr><td> Accept user input to signal start receiving.
- * <tr><td> Provide feedback on pings sent versus pings received.
- * <tr><td> Provide extension point for arbitrary action on a particular message count.
- * </table>
- */
-public class PingDurableClient extends PingPongProducer implements ExceptionListener
-{
- private static final Logger log = Logger.getLogger(PingDurableClient.class);
-
- public static final String NUM_MESSAGES_PROPNAME = "numMessages";
- public static final String NUM_MESSAGES_DEFAULT = "100";
- public static final String DURATION_PROPNAME = "duration";
- public static final String DURATION_DEFAULT = "30S";
- public static final String NUM_MESSAGES_TO_ACTION_PROPNAME = "numMessagesToAction";
- public static final String NUM_MESSAGES_TO_ACTION_DEFAULT = "-1";
-
- /** The maximum length of time to wait whilst receiving pings before assuming that no more are coming. */
- private static final long TIME_OUT = 3000;
-
- static
- {
- defaults.setProperty(NUM_MESSAGES_PROPNAME, NUM_MESSAGES_DEFAULT);
- defaults.setProperty(DURATION_PROPNAME, DURATION_DEFAULT);
- defaults.setProperty(UNIQUE_DESTS_PROPNAME, "false");
- defaults.setProperty(TRANSACTED_PROPNAME, "true");
- defaults.setProperty(PERSISTENT_MODE_PROPNAME, "true");
- defaults.setProperty(TX_BATCH_SIZE_PROPNAME, "10");
- defaults.setProperty(RATE_PROPNAME, "20");
- defaults.setProperty(DURABLE_DESTS_PROPNAME, "true");
- defaults.setProperty(NUM_MESSAGES_TO_ACTION_PROPNAME, NUM_MESSAGES_TO_ACTION_DEFAULT);
- }
-
- /** Specifies the number of pings to send, if larger than 0. 0 means send until told to stop. */
- private int numMessages;
-
- /** Holds the number of messages to send before taking triggering the action. */
- private int numMessagesToAction;
-
- /** Sepcifies how long to ping for, if larger than 0. 0 means send until told to stop. */
- private long duration;
-
- /** Used to indciate that this application should terminate. Set by the shutdown hook. */
- private boolean terminate = false;
-
- /**
- * @throws Exception Any exceptions are allowed to fall through.
- */
- public PingDurableClient(Properties overrides) throws Exception
- {
- super(overrides);
- log.debug("public PingDurableClient(Properties overrides = " + overrides + "): called");
-
- // Extract the additional configuration parameters.
- ParsedProperties properties = new ParsedProperties(defaults);
- properties.putAll(overrides);
-
- numMessages = properties.getPropertyAsInteger(NUM_MESSAGES_PROPNAME);
- String durationSpec = properties.getProperty(DURATION_PROPNAME);
- numMessagesToAction = properties.getPropertyAsInteger(NUM_MESSAGES_TO_ACTION_PROPNAME);
-
- if (durationSpec != null)
- {
- duration = MathUtils.parseDuration(durationSpec) * 1000000;
- }
- }
-
- /**
- * Starts the ping/wait/receive process.
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- try
- {
- // Create a ping producer overriding its defaults with all options passed on the command line.
- Properties options =
- CommandLineParser.processCommandLine(args, new CommandLineParser(new String[][] {}), System.getProperties());
- PingDurableClient pingProducer = new PingDurableClient(options);
-
- // Create a shutdown hook to terminate the ping-pong producer.
- Runtime.getRuntime().addShutdownHook(pingProducer.getShutdownHook());
-
- // Ensure that the ping pong producer is registered to listen for exceptions on the connection too.
- // pingProducer.getConnection().setExceptionListener(pingProducer);
-
- // Run the test procedure.
- int sent = pingProducer.send();
- pingProducer.closeConnection();
- pingProducer.waitForUser("Press return to begin receiving the pings.");
- pingProducer.receive(sent);
-
- System.exit(0);
- }
- catch (Exception e)
- {
- System.err.println(e.getMessage());
- log.error("Top level handler caught execption.", e);
- System.exit(1);
- }
- }
-
- /**
- * Performs the main test procedure implemented by this ping client. See the class level comment for details.
- */
- protected int send() throws Exception
- {
- log.debug("public void sendWaitReceive(): called");
-
- log.debug("duration = " + duration);
- log.debug("numMessages = " + numMessages);
-
- if (duration > 0)
- {
- System.out.println("Sending for up to " + (duration / 1000000000f) + " seconds.");
- }
-
- if (_rate > 0)
- {
- System.out.println("Sending at " + _rate + " messages per second.");
- }
-
- if (numMessages > 0)
- {
- System.out.println("Sending up to " + numMessages + " messages.");
- }
-
- // Establish the connection and the message producer.
- establishConnection(true, false);
- _connection.start();
-
- Message message = getTestMessage(getReplyDestinations().get(0), _messageSize, _persistent);
-
- // Send pings until a terminating condition is received.
- boolean endCondition = false;
- int messagesSent = 0;
- int messagesCommitted = 0;
- int messagesNotCommitted = 0;
- long start = System.nanoTime();
-
- // Clear console in.
- clearConsole();
-
- while (!endCondition)
- {
- boolean committed = false;
-
- try
- {
- committed = sendMessage(messagesSent, message) && _transacted;
-
- messagesSent++;
- messagesNotCommitted++;
-
- // Keep count of the number of messsages currently committed and pending commit.
- if (committed)
- {
- log.debug("Adding " + messagesNotCommitted + " messages to the committed count.");
- messagesCommitted += messagesNotCommitted;
- messagesNotCommitted = 0;
-
- System.out.println("Commited: " + messagesCommitted);
- }
- }
- catch (JMSException e)
- {
- log.debug("Got JMSException whilst sending.");
- _publish = false;
- }
-
- // Perform the arbitrary action if the number of messages sent has reached the right number.
- if (messagesSent == numMessagesToAction)
- {
- System.out.println("At action point, Messages sent = " + messagesSent + ", Messages Committed = "
- + messagesCommitted + ", Messages not Committed = " + messagesNotCommitted);
- takeAction();
- }
-
- // Determine if the end condition has been met, based on the number of messages, time passed, errors on
- // the connection or user input.
- long now = System.nanoTime();
-
- if ((duration != 0) && ((now - start) > duration))
- {
- System.out.println("Send halted because duration expired.");
- endCondition = true;
- }
- else if ((numMessages != 0) && (messagesSent >= numMessages))
- {
- System.out.println("Send halted because # messages completed.");
- endCondition = true;
- }
- else if (System.in.available() > 0)
- {
- System.out.println("Send halted by user input.");
- endCondition = true;
-
- clearConsole();
- }
- else if (!_publish)
- {
- System.out.println("Send halted by error on the connection.");
- endCondition = true;
- }
- }
-
- log.debug("messagesSent = " + messagesSent);
- log.debug("messagesCommitted = " + messagesCommitted);
- log.debug("messagesNotCommitted = " + messagesNotCommitted);
-
- System.out.println("Messages sent: " + messagesSent + ", Messages Committed = " + messagesCommitted
- + ", Messages not Committed = " + messagesNotCommitted);
-
- return messagesSent;
- }
-
- protected void closeConnection()
- {
- // Clean up the connection.
- try
- {
- close();
- }
- catch (JMSException e)
- {
- log.debug("There was an error whilst closing the connection: " + e, e);
- System.out.println("There was an error whilst closing the connection.");
-
- // Ignore as did best could manage to clean up.
- }
- }
-
- protected void receive(int messagesSent) throws Exception
- {
- // Re-establish the connection and the message consumer.
- _queueJVMSequenceID = new AtomicInteger();
- _queueSharedID = new AtomicInteger();
-
- establishConnection(false, true);
- _consumer[0].setMessageListener(null);
- _consumerConnection[0].start();
-
- // Try to receive all of the pings that were successfully sent.
- int messagesReceived = 0;
- boolean endCondition = false;
-
- while (!endCondition)
- {
- // Message received = _consumer.receiveNoWait();
- Message received = _consumer[0].receive(TIME_OUT);
- log.debug("received = " + received);
-
- if (received != null)
- {
- messagesReceived++;
- }
-
- // Determine if the end condition has been met, based on the number of messages and time passed since last
- // receiving a message.
- if (received == null)
- {
- System.out.println("Timed out.");
- endCondition = true;
- }
- else if (messagesReceived >= messagesSent)
- {
- System.out.println("Got all messages.");
- endCondition = true;
- }
- }
-
- // Ensure messages received are committed.
- if (_consTransacted)
- {
- try
- {
- _consumerSession[0].commit();
- System.out.println("Committed for all messages received.");
- }
- catch (JMSException e)
- {
- log.debug("Error during commit: " + e, e);
- System.out.println("Error during commit.");
- try
- {
- _consumerSession[0].rollback();
- System.out.println("Rolled back on all messages received.");
- }
- catch (JMSException e2)
- {
- log.debug("Error during rollback: " + e, e);
- System.out.println("Error on roll back of all messages received.");
- }
-
- }
- }
-
- log.debug("messagesReceived = " + messagesReceived);
-
- System.out.println("Messages received: " + messagesReceived);
-
- // Clean up the connection.
- close();
- }
-
- /**
- * Clears any pending input from the console.
- */
- private void clearConsole()
- {
- try
- {
- BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));
-
- // System.in.skip(System.in.available());
- while (bis.ready())
- {
- bis.readLine();
- }
- }
- catch (IOException e)
- { }
- }
-
- /**
- * Returns the ping destinations themselves as the reply destinations for this pinger to listen to. This has the
- * effect of making this pinger listen to its own pings.
- *
- * @return The ping destinations.
- */
- public List<Destination> getReplyDestinations()
- {
- return _pingDestinations;
- }
-
- /**
- * Gets a shutdown hook that will cleanly shut this down when it is running the ping loop. This can be registered with
- * the runtime system as a shutdown hook. This shutdown hook sets an additional terminate flag, compared with the
- * shutdown hook in {@link PingPongProducer}, because the publish flag is used to indicate that sending or receiving
- * message should stop, not that the application should termiante.
- *
- * @return A shutdown hook for the ping loop.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- stop();
- terminate = true;
- }
- });
- }
-
- /**
- * Performs an aribtrary action once the 'numMesagesToAction' count is reached on sending messages. This default
- * implementation does nothing.
- */
- public void takeAction()
- { }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingLatencyTestPerf.java b/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingLatencyTestPerf.java
deleted file mode 100644
index 5ba4004c56..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingLatencyTestPerf.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.ping;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.requestreply.PingPongProducer;
-
-import org.apache.qpid.junit.extensions.TimingController;
-import org.apache.qpid.junit.extensions.TimingControllerAware;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * PingLatencyTestPerf is a performance test that outputs multiple timings from its test method, using the timing
- * controller interface supplied by the test runner from a seperate listener thread. It outputs round trip timings for
- * individual ping messages rather than for how long a complete batch of messages took to process. It also differs from
- * the {@link PingTestPerf} test that it extends because it can output timings as replies are received, rather than
- * waiting until all expected replies are received.
- *
- * <p/>This test does not output timings for every single ping message, as when running at high volume, writing the test
- * log for a vast number of messages would slow the testing down. Instead samples ping latency occasionally. The
- * frequency of ping sampling is set using the {@link #TEST_RESULTS_BATCH_SIZE_PROPNAME} property, to override the
- * default of every {@link #DEFAULT_TEST_RESULTS_BATCH_SIZE}.
- *
- * <p/>The size parameter logged for each individual ping is set to the size of the batch of messages that the
- * individual timed ping was taken from, rather than 1 for a single message. This is so that the total throughput
- * (messages / time) can be calculated in order to examine the relationship between throughput and latency.
- *
- * <p/><table id="crc"><caption>CRC Card</caption> <tr><td> Responsibilities <th> Collaborations <tr><td> Send many ping
- * messages and output timings for sampled individual pings. </table>
- */
-public class PingLatencyTestPerf extends PingTestPerf implements TimingControllerAware
-{
- private static Logger _logger = Logger.getLogger(PingLatencyTestPerf.class);
-
- /** Holds the name of the property to get the test results logging batch size. */
- public static final String TEST_RESULTS_BATCH_SIZE_PROPNAME = "batchSize";
-
- /** Holds the default test results logging batch size. */
- public static final int DEFAULT_TEST_RESULTS_BATCH_SIZE = 1000;
-
- /** Used to hold the timing controller passed from the test runner. */
- private TimingController _timingController;
-
- /** Used to generate unique correlation ids for each test run. */
- private AtomicLong corellationIdGenerator = new AtomicLong();
-
- /**
- * Holds test specifics by correlation id. This consists of the expected number of messages and the timing
- * controler.
- */
- private Map<String, PerCorrelationId> perCorrelationIds =
- Collections.synchronizedMap(new HashMap<String, PerCorrelationId>());
-
- /** Holds the batched results listener, that does logging on batch boundaries. */
- private BatchedResultsListener batchedResultsListener = null;
-
- /**
- * Creates a new asynchronous ping performance test with the specified name.
- *
- * @param name The test name.
- */
- public PingLatencyTestPerf(String name)
- {
- super(name);
-
- // Sets up the test parameters with defaults.
- ParsedProperties.setSysPropertyIfNull(TEST_RESULTS_BATCH_SIZE_PROPNAME,
- Integer.toString(DEFAULT_TEST_RESULTS_BATCH_SIZE));
- }
-
- /** Compile all the tests into a test suite. */
- public static Test suite()
- {
- // Build a new test suite
- TestSuite suite = new TestSuite("Ping Latency Tests");
-
- // Run performance tests in read committed mode.
- suite.addTest(new PingLatencyTestPerf("testPingLatency"));
-
- return suite;
- }
-
- /**
- * Accepts a timing controller from the test runner.
- *
- * @param timingController The timing controller to register mutliple timings with.
- */
- public void setTimingController(TimingController timingController)
- {
- _timingController = timingController;
- }
-
- /**
- * Gets the timing controller passed in by the test runner.
- *
- * @return The timing controller passed in by the test runner.
- */
- public TimingController getTimingController()
- {
- return _timingController;
- }
-
- /**
- * Sends the specified number of pings, asynchronously outputs timings on every batch boundary, and waits until all
- * replies have been received or a time out occurs before exiting this method.
- *
- * @param numPings The number of pings to send.
- */
- public void testPingLatency(int numPings) throws Exception
- {
- _logger.debug("public void testPingLatency(int numPings): called");
-
- // Ensure that at least one ping was requeusted.
- if (numPings == 0)
- {
- _logger.error("Number of pings requested was zero.");
- }
-
- // Get the per thread test setup to run the test through.
- PerThreadSetup perThreadSetup = threadSetup.get();
- PingClient pingClient = perThreadSetup._pingClient;
-
- // Advance the correlation id of messages to send, to make it unique for this run.
- String messageCorrelationId = Long.toString(corellationIdGenerator.incrementAndGet());
- _logger.debug("messageCorrelationId = " + messageCorrelationId);
-
- // Initialize the count and timing controller for the new correlation id.
- PerCorrelationId perCorrelationId = new PerCorrelationId();
- TimingController tc = getTimingController().getControllerForCurrentThread();
- perCorrelationId._tc = tc;
- perCorrelationId._expectedCount = numPings;
- perCorrelationIds.put(messageCorrelationId, perCorrelationId);
-
- // Attach the chained message listener to the ping producer to listen asynchronously for the replies to these
- // messages.
- pingClient.setChainedMessageListener(batchedResultsListener);
-
- // Generate a sample message of the specified size.
- Message msg =
- pingClient.getTestMessage(perThreadSetup._pingClient.getReplyDestinations().get(0),
- testParameters.getPropertyAsInteger(PingPongProducer.MESSAGE_SIZE_PROPNAME),
- testParameters.getPropertyAsBoolean(PingPongProducer.PERSISTENT_MODE_PROPNAME));
-
- // Send the requested number of messages, and wait until they have all been received.
- long timeout = Long.parseLong(testParameters.getProperty(PingPongProducer.TIMEOUT_PROPNAME));
- int numReplies = pingClient.pingAndWaitForReply(msg, numPings, timeout, null);
-
- // Check that all the replies were received and log a fail if they were not.
- if (numReplies < numPings)
- {
- tc.completeTest(false, 0);
- }
-
- // Remove the chained message listener from the ping producer.
- pingClient.removeChainedMessageListener();
-
- // Remove the expected count and timing controller for the message correlation id, to ensure they are cleaned up.
- perCorrelationIds.remove(messageCorrelationId);
- }
-
- /** Performs test fixture creation on a per thread basis. This will only be called once for each test thread. */
- public void threadSetUp()
- {
- _logger.debug("public void threadSetUp(): called");
-
- try
- {
- // Call the set up method in the super class. This creates a PingClient pinger.
- super.threadSetUp();
-
- // Create the chained message listener, only if it has not already been created. This is set up with the
- // batch size property, to tell it what batch size to output results on. A synchronized block is used to
- // ensure that only one thread creates this.
- synchronized (this)
- {
- if (batchedResultsListener == null)
- {
- int batchSize = Integer.parseInt(testParameters.getProperty(TEST_RESULTS_BATCH_SIZE_PROPNAME));
- batchedResultsListener = new BatchedResultsListener(batchSize);
- }
- }
-
- // Get the set up that the super class created.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- // Register the chained message listener on the pinger to do its asynchronous test timings from.
- perThreadSetup._pingClient.setChainedMessageListener(batchedResultsListener);
- }
- catch (Exception e)
- {
- _logger.warn("There was an exception during per thread setup.", e);
- }
- }
-
- /**
- * BatchedResultsListener is a {@link org.apache.qpid.requestreply.PingPongProducer.ChainedMessageListener} that can
- * be attached to the pinger, in order to receive notifications about every message received and the number
- * remaining to be received. Whenever the number remaining crosses a batch size boundary this results listener
- * outputs a test timing for the actual number of messages received in the current batch.
- */
- private class BatchedResultsListener implements PingPongProducer.ChainedMessageListener
- {
- /** The test results logging batch size. */
- int _batchSize;
- private boolean _strictAMQP;
-
- /**
- * Creates a results listener on the specified batch size.
- *
- * @param batchSize The batch size to use.
- */
- public BatchedResultsListener(int batchSize)
- {
- _batchSize = batchSize;
- _strictAMQP =
- Boolean.parseBoolean(System.getProperties().getProperty(AMQSession.STRICT_AMQP,
- AMQSession.STRICT_AMQP_DEFAULT));
- }
-
- /**
- * This callback method is called from all of the pingers that this test creates. It uses the correlation id
- * from the message to identify the timing controller for the test thread that was responsible for sending those
- * messages.
- *
- * @param message The message.
- * @param remainingCount The count of messages remaining to be received with a particular correlation id.
- *
- * @throws javax.jms.JMSException Any underlying JMSException is allowed to fall through.
- */
- public void onMessage(Message message, int remainingCount, long latency) throws JMSException
- {
- _logger.debug("public void onMessage(Message message, int remainingCount = " + remainingCount + "): called");
-
- // Check if a batch boundary has been crossed.
- if ((remainingCount % _batchSize) == 0)
- {
- // Extract the correlation id from the message.
- String correlationId = message.getJMSCorrelationID();
-
- // Get the details for the correlation id and check that they are not null. They can become null
- // if a test times out.
- PerCorrelationId perCorrelationId = perCorrelationIds.get(correlationId);
- if (perCorrelationId != null)
- {
- // Get the timing controller and expected count for this correlation id.
- TimingController tc = perCorrelationId._tc;
- int expected = perCorrelationId._expectedCount;
-
- // Calculate how many messages were actually received in the last batch. This will be the batch size
- // except where the number expected is not a multiple of the batch size and this is the first remaining
- // count to cross a batch size boundary, in which case it will be the number expected modulo the batch
- // size.
- int receivedInBatch = ((expected - remainingCount) < _batchSize) ? (expected % _batchSize) : _batchSize;
-
- // Register a test result for the correlation id.
- try
- {
- tc.completeTest(true, receivedInBatch, latency);
- }
- catch (InterruptedException e)
- {
- // Ignore this. It means the test runner wants to stop as soon as possible.
- _logger.warn("Got InterruptedException.", e);
- }
- }
- // Else ignore, test timed out. Should log a fail here?
- }
- }
- }
-
- /**
- * Holds state specific to each correlation id, needed to output test results. This consists of the count of the
- * total expected number of messages, and the timing controller for the thread sending those message ids.
- */
- private static class PerCorrelationId
- {
- public int _expectedCount;
- public TimingController _tc;
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingSendOnlyClient.java b/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingSendOnlyClient.java
deleted file mode 100644
index 2fe852af77..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingSendOnlyClient.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.qpid.ping;
-
-import java.util.Properties;
-
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.ObjectMessage;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.message.TestMessageFactory;
-import org.apache.qpid.util.CommandLineParser;
-
-/**
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * </table>
- */
-public class PingSendOnlyClient extends PingDurableClient
-{
- private static final Logger log = Logger.getLogger(PingSendOnlyClient.class);
-
- public PingSendOnlyClient(Properties overrides) throws Exception
- {
- super(overrides);
- }
-
- /**
- * Starts the ping/wait/receive process.
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- try
- {
- // Create a ping producer overriding its defaults with all options passed on the command line.
- Properties options = CommandLineParser.processCommandLine(args, new CommandLineParser(new String[][] {}), System.getProperties());
- PingSendOnlyClient pingProducer = new PingSendOnlyClient(options);
-
- // Create a shutdown hook to terminate the ping-pong producer.
- Runtime.getRuntime().addShutdownHook(pingProducer.getShutdownHook());
-
- // Ensure that the ping pong producer is registered to listen for exceptions on the connection too.
- // pingProducer.getConnection().setExceptionListener(pingProducer);
-
- // Run the test procedure.
- pingProducer.send();
- pingProducer.waitForUser("Press return to close connection and quit.");
- pingProducer.closeConnection();
-
- System.exit(0);
- }
- catch (Exception e)
- {
- System.err.println(e.getMessage());
- log.error("Top level handler caught execption.", e);
- System.exit(1);
- }
- }
-
- public Message getTestMessage(Destination replyQueue, int messageSize, boolean persistent) throws JMSException
- {
- Message msg = TestMessageFactory.newTextMessage(_producerSession, messageSize);
-
- // Timestamp the message in nanoseconds.
- msg.setLongProperty(MESSAGE_TIMESTAMP_PROPNAME, System.nanoTime());
-
- return msg;
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingTestPerf.java b/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingTestPerf.java
deleted file mode 100644
index cf16abc596..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingTestPerf.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.ping;
-
-import junit.framework.Assert;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.requestreply.PingPongProducer;
-
-import org.apache.qpid.junit.extensions.AsymptoticTestCase;
-import org.apache.qpid.junit.extensions.TestThreadAware;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-
-import javax.jms.*;
-
-/**
- * PingTestPerf is a ping test, that has been written with the intention of being scaled up to run many times
- * simultaneously to simluate many clients/producers/connections.
- *
- * <p/>A single run of the test using the default JUnit test runner will result in the sending and timing of a single
- * full round trip ping. This test may be scaled up using a suitable JUnit test runner.
- *
- * <p/>The setup/teardown cycle establishes a connection to a broker and sets up a queue to send ping messages to and a
- * temporary queue for replies. This setup is only established once for all the test repeats/threads that may be run,
- * except if the connection is lost in which case an attempt to re-establish the setup is made.
- *
- * <p/>The test cycle is: Connects to a queue, creates a temporary queue, creates messages containing a property that
- * is the name of the temporary queue, fires off a message on the original queue and waits for a response on the
- * temporary queue.
- *
- * <p/>Configurable test properties: message size, transacted or not, persistent or not. Broker connection details.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * </table>
- */
-public class PingTestPerf extends AsymptoticTestCase implements TestThreadAware
-{
- private static Logger _logger = Logger.getLogger(PingTestPerf.class);
-
- /** Thread local to hold the per-thread test setup fields. */
- ThreadLocal<PerThreadSetup> threadSetup = new ThreadLocal<PerThreadSetup>();
-
- /** Holds a property reader to extract the test parameters from. */
- protected ParsedProperties testParameters =
- TestContextProperties.getInstance(PingPongProducer.defaults /*System.getProperties()*/);
-
- public PingTestPerf(String name)
- {
- super(name);
-
- _logger.debug("testParameters = " + testParameters);
- }
-
- /**
- * Compile all the tests into a test suite.
- * @return The test method testPingOk.
- */
- public static Test suite()
- {
- // Build a new test suite
- TestSuite suite = new TestSuite("Ping Performance Tests");
-
- // Run performance tests in read committed mode.
- suite.addTest(new PingTestPerf("testPingOk"));
-
- return suite;
- }
-
- public void testPingOk(int numPings) throws Exception
- {
- if (numPings == 0)
- {
- Assert.fail("Number of pings requested was zero.");
- }
-
- // Get the per thread test setup to run the test through.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- if (perThreadSetup == null)
- {
- Assert.fail("Could not get per thread test setup, it was null.");
- }
-
- // Generate a sample message. This message is already time stamped and has its reply-to destination set.
- Message msg =
- perThreadSetup._pingClient.getTestMessage(perThreadSetup._pingClient.getReplyDestinations().get(0),
- testParameters.getPropertyAsInteger(PingPongProducer.MESSAGE_SIZE_PROPNAME),
- testParameters.getPropertyAsBoolean(PingPongProducer.PERSISTENT_MODE_PROPNAME));
-
- // start the test
- long timeout = Long.parseLong(testParameters.getProperty(PingPongProducer.TIMEOUT_PROPNAME));
- int numReplies = perThreadSetup._pingClient.pingAndWaitForReply(msg, numPings, timeout, null);
-
- // Fail the test if the timeout was exceeded.
- if (numReplies != perThreadSetup._pingClient.getExpectedNumPings(numPings))
- {
- Assert.fail("The ping timed out after " + timeout + " ms. Messages Sent = " + numPings + ", MessagesReceived = "
- + numReplies);
- }
- }
-
- /** Performs test fixture creation on a per thread basis. This will only be called once for each test thread. */
- public void threadSetUp()
- {
- _logger.debug("public void threadSetUp(): called");
-
- try
- {
- PerThreadSetup perThreadSetup = new PerThreadSetup();
-
- // This is synchronized because there is a race condition, which causes one connection to sleep if
- // all threads try to create connection concurrently.
- synchronized (this)
- {
- // Establish a client to ping a Destination and listen the reply back from same Destination
- perThreadSetup._pingClient = new PingClient(testParameters);
- perThreadSetup._pingClient.establishConnection(true, true);
- }
-
- // Attach the per-thread set to the thread.
- threadSetup.set(perThreadSetup);
- }
- catch (Exception e)
- {
- _logger.warn("There was an exception during per thread setup.", e);
- }
- }
-
- /**
- * Called after all threads have completed their setup.
- */
- public void postThreadSetUp()
- {
- _logger.debug("public void postThreadSetUp(): called");
-
- PerThreadSetup perThreadSetup = threadSetup.get();
- // Prefill the broker unless we are in consume only mode.
- int preFill = testParameters.getPropertyAsInteger(PingPongProducer.PREFILL_PROPNAME);
- if (!testParameters.getPropertyAsBoolean(PingPongProducer.CONSUME_ONLY_PROPNAME) && preFill > 0)
- {
- try
- {
- // Manually set the correlation ID to 1. This is not ideal but it is the
- // value that the main test loop will use.
- perThreadSetup._pingClient.pingNoWaitForReply(null, preFill, String.valueOf(perThreadSetup._pingClient.getClientCount()));
-
- // Note with a large preFill and non-tx session the messages will be
- // rapidly pushed in to the mina buffers. OOM's are a real risk here.
- // Should perhaps consider using a TX session for the prefill.
-
- long delayBeforeConsume = testParameters.getPropertyAsLong(PingPongProducer.DELAY_BEFORE_CONSUME_PROPNAME);
-
- // Only delay if we are
- // not doing send only
- // and we have consumers
- // and a delayBeforeConsume
- if (!(testParameters.getPropertyAsBoolean(PingPongProducer.SEND_ONLY_PROPNAME))
- && (testParameters.getPropertyAsInteger(PingPongProducer.NUM_CONSUMERS_PROPNAME) > 0)
- && delayBeforeConsume > 0)
- {
-
- boolean verbose = testParameters.getPropertyAsBoolean(PingPongProducer.VERBOSE_PROPNAME);
- // Only do logging if in verbose mode.
- if (verbose)
- {
- if (delayBeforeConsume > 60000)
- {
- long minutes = delayBeforeConsume / 60000;
- long seconds = (delayBeforeConsume - (minutes * 60000)) / 1000;
- long ms = delayBeforeConsume - (minutes * 60000) - (seconds * 1000);
- _logger.info("Delaying for " + minutes + "m " + seconds + "s " + ms + "ms before starting test.");
- }
- else
- {
- _logger.info("Delaying for " + delayBeforeConsume + "ms before starting test.");
- }
- }
-
- Thread.sleep(delayBeforeConsume);
-
- if (verbose)
- {
- _logger.info("Starting Test.");
- }
- }
-
- // We can't start the client's here as the test client has not yet been configured to receieve messages.
- // only when the test method is executed will the correlationID map be set up and ready to consume
- // the messages we have sent here.
- }
- catch (Exception e)
- {
- _logger.warn("There was an exception during per thread setup.", e);
- }
- }
- else //Only start the consumer if we are not preFilling.
- {
- // Start the consumers, unless we have data on the broker
- // already this is signified by being in consume_only, we will
- // start the clients after setting up the correlation IDs.
- // We should also not start the clients if we are in Send only
- if (!testParameters.getPropertyAsBoolean(PingPongProducer.CONSUME_ONLY_PROPNAME) &&
- !(testParameters.getPropertyAsBoolean(PingPongProducer.SEND_ONLY_PROPNAME)))
- {
- // Start the client connection
- try
- {
- perThreadSetup._pingClient.start();
- }
- catch (JMSException e)
- {
- e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
- }
- }
- }
- }
-
- /**
- * Performs test fixture clean
- */
- public void threadTearDown()
- {
- _logger.debug("public void threadTearDown(): called");
-
- try
- {
- // Get the per thread test fixture.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- // Close the pingers so that it cleans up its connection cleanly.
- synchronized (this)
- {
- if ((perThreadSetup != null) && (perThreadSetup._pingClient != null))
- {
- perThreadSetup._pingClient.close();
- }
- }
- }
- catch (JMSException e)
- {
- _logger.warn("There was an exception during per thread tear down.");
- }
- finally
- {
- // Ensure the per thread fixture is reclaimed.
- threadSetup.remove();
- }
- }
-
- protected static class PerThreadSetup
- {
- /**
- * Holds the test ping client.
- */
- protected PingClient _pingClient;
- protected String _correlationId;
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongBouncer.java b/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongBouncer.java
deleted file mode 100644
index 8e010ccf07..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongBouncer.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.requestreply;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import javax.jms.*;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.AMQConnection;
-import org.apache.qpid.client.AMQQueue;
-import org.apache.qpid.client.AMQTopic;
-import org.apache.qpid.jms.ConnectionListener;
-import org.apache.qpid.jms.Session;
-import org.apache.qpid.topic.Config;
-import org.apache.qpid.exchange.ExchangeDefaults;
-
-/**
- * PingPongBouncer is a message listener the bounces back messages to their reply to destination. This is used to return
- * ping messages generated by {@link org.apache.qpid.requestreply.PingPongProducer} but could be used for other purposes
- * too.
- *
- * <p/>The correlation id from the received message is extracted, and placed into the reply as the correlation id. Messages
- * are bounced back to their reply-to destination. The original sender of the message has the option to use either a unique
- * temporary queue or the correlation id to correlate the original message to the reply.
- *
- * <p/>There is a verbose mode flag which causes information about each ping to be output to the console
- * (info level logging, so usually console). This can be helpfull to check the bounce backs are happening but should
- * be disabled for real timing tests as writing to the console will slow things down.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Bounce back messages to their reply to destination.
- * <tr><td> Provide command line invocation to start the bounce back on a configurable broker url.
- * </table>
- *
- * @todo Replace the command line parsing with a neater tool.
- *
- * @todo Make verbose accept a number of messages, only prints to console every X messages.
- */
-public class PingPongBouncer implements MessageListener
-{
- private static final Logger _logger = Logger.getLogger(PingPongBouncer.class);
-
- /** The default prefetch size for the message consumer. */
- private static final int PREFETCH = 1;
-
- /** The default no local flag for the message consumer. */
- private static final boolean NO_LOCAL = true;
-
- private static final String DEFAULT_DESTINATION_NAME = "ping";
-
- /** The default exclusive flag for the message consumer. */
- private static final boolean EXCLUSIVE = false;
-
- /** A convenient formatter to use when time stamping output. */
- protected static final SimpleDateFormat timestampFormatter = new SimpleDateFormat("hh:mm:ss:SS");
-
- /** Used to indicate that the reply generator should log timing info to the console (logger info level). */
- private boolean _verbose = false;
-
- /** Determines whether this bounce back client bounces back messages persistently. */
- private boolean _persistent = false;
-
- private Destination _consumerDestination;
-
- /** Keeps track of the response destination of the previous message for the last reply to producer cache. */
- private Destination _lastResponseDest;
-
- /** The producer for sending replies with. */
- private MessageProducer _replyProducer;
-
- /** The consumer controlSession. */
- private Session _consumerSession;
-
- /** The producer controlSession. */
- private Session _producerSession;
-
- /** Holds the connection to the broker. */
- private AMQConnection _connection;
-
- /** Flag used to indicate if this is a point to point or pub/sub ping client. */
- private boolean _isPubSub = false;
-
- /**
- * This flag is used to indicate that the user should be prompted to kill a broker, in order to test
- * failover, immediately before committing a transaction.
- */
- protected boolean _failBeforeCommit = false;
-
- /**
- * This flag is used to indicate that the user should be prompted to a kill a broker, in order to test
- * failover, immediate after committing a transaction.
- */
- protected boolean _failAfterCommit = false;
-
- /**
- * Creates a PingPongBouncer on the specified producer and consumer sessions.
- *
- * @param brokerDetails The addresses of the brokers to connect to.
- * @param username The broker username.
- * @param password The broker password.
- * @param virtualpath The virtual host name within the broker.
- * @param destinationName The name of the queue to receive pings on
- * (or root of the queue name where many queues are generated).
- * @param persistent A flag to indicate that persistent message should be used.
- * @param transacted A flag to indicate that pings should be sent within transactions.
- * @param selector A message selector to filter received pings with.
- * @param verbose A flag to indicate that message timings should be sent to the console.
- *
- * @throws Exception All underlying exceptions allowed to fall through. This is only test code...
- */
- public PingPongBouncer(String brokerDetails, String username, String password, String virtualpath,
- String destinationName, boolean persistent, boolean transacted, String selector, boolean verbose,
- boolean pubsub) throws Exception
- {
- // Create a client id to uniquely identify this client.
- InetAddress address = InetAddress.getLocalHost();
- String clientId = address.getHostName() + System.currentTimeMillis();
- _verbose = verbose;
- _persistent = persistent;
- setPubSub(pubsub);
- // Connect to the broker.
- setConnection(new AMQConnection(brokerDetails, username, password, clientId, virtualpath));
- _logger.info("Connected with URL:" + getConnection().toURL());
-
- // Set up the failover notifier.
- getConnection().setConnectionListener(new FailoverNotifier());
-
- // Create a controlSession to listen for messages on and one to send replies on, transactional depending on the
- // command line option.
- _consumerSession = (Session) getConnection().createSession(transacted, Session.AUTO_ACKNOWLEDGE);
- _producerSession = (Session) getConnection().createSession(transacted, Session.AUTO_ACKNOWLEDGE);
-
- // Create the queue to listen for message on.
- createConsumerDestination(destinationName);
- MessageConsumer consumer =
- _consumerSession.createConsumer(_consumerDestination, PREFETCH, NO_LOCAL, EXCLUSIVE, selector);
-
- // Create a producer for the replies, without a default destination.
- _replyProducer = _producerSession.createProducer(null);
- _replyProducer.setDisableMessageTimestamp(true);
- _replyProducer.setDeliveryMode(_persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
-
- // Set this up to listen for messages on the queue.
- consumer.setMessageListener(this);
- }
-
- /**
- * Starts a stand alone ping-pong client running in verbose mode.
- *
- * @param args
- */
- public static void main(String[] args) throws Exception
- {
- System.out.println("Starting...");
-
- // Display help on the command line.
- if (args.length == 0)
- {
- _logger.info("Running test with default values...");
- //usage();
- //System.exit(0);
- }
-
- // Extract all command line parameters.
- Config config = new Config();
- config.setOptions(args);
- String brokerDetails = config.getHost() + ":" + config.getPort();
- String virtualpath = "test";
- String destinationName = config.getDestination();
- if (destinationName == null)
- {
- destinationName = DEFAULT_DESTINATION_NAME;
- }
-
- String selector = config.getSelector();
- boolean transacted = config.isTransacted();
- boolean persistent = config.usePersistentMessages();
- boolean pubsub = config.isPubSub();
- boolean verbose = true;
-
- //String selector = null;
-
- // Instantiate the ping pong client with the command line options and start it running.
- PingPongBouncer pingBouncer =
- new PingPongBouncer(brokerDetails, "guest", "guest", virtualpath, destinationName, persistent, transacted,
- selector, verbose, pubsub);
- pingBouncer.getConnection().start();
-
- System.out.println("Waiting...");
- }
-
- private static void usage()
- {
- System.err.println("Usage: PingPongBouncer \n" + "-host : broker host\n" + "-port : broker port\n"
- + "-destinationname : queue/topic name\n" + "-transacted : (true/false). Default is false\n"
- + "-persistent : (true/false). Default is false\n"
- + "-pubsub : (true/false). Default is false\n" + "-selector : selector string\n");
- }
-
- /**
- * This is a callback method that is notified of all messages for which this has been registered as a message
- * listener on a message consumer. It sends a reply (pong) to all messages it receieves on the reply to
- * destination of the message.
- *
- * @param message The message that triggered this callback.
- */
- public void onMessage(Message message)
- {
- try
- {
- String messageCorrelationId = message.getJMSCorrelationID();
- if (_verbose)
- {
- _logger.info(timestampFormatter.format(new Date()) + ": Got ping with correlation id, "
- + messageCorrelationId);
- }
-
- // Get the reply to destination from the message and check it is set.
- Destination responseDest = message.getJMSReplyTo();
-
- if (responseDest == null)
- {
- _logger.debug("Cannot send reply because reply-to destination is null.");
-
- return;
- }
-
- // Spew out some timing information if verbose mode is on.
- if (_verbose)
- {
- Long timestamp = message.getLongProperty("timestamp");
-
- if (timestamp != null)
- {
- long diff = System.currentTimeMillis() - timestamp;
- _logger.info("Time to bounce point: " + diff);
- }
- }
-
- // Correlate the reply to the original.
- message.setJMSCorrelationID(messageCorrelationId);
-
- // Send the receieved message as the pong reply.
- _replyProducer.send(responseDest, message);
-
- if (_verbose)
- {
- _logger.info(timestampFormatter.format(new Date()) + ": Sent reply with correlation id, "
- + messageCorrelationId);
- }
-
- // Commit the transaction if running in transactional mode.
- commitTx(_producerSession);
- }
- catch (JMSException e)
- {
- _logger.debug("There was a JMSException: " + e.getMessage(), e);
- }
- }
-
- /**
- * Gets the underlying connection that this ping client is running on.
- *
- * @return The underlying connection that this ping client is running on.
- */
- public AMQConnection getConnection()
- {
- return _connection;
- }
-
- /**
- * Sets the connection that this ping client is using.
- *
- * @param connection The ping connection.
- */
- public void setConnection(AMQConnection connection)
- {
- this._connection = connection;
- }
-
- /**
- * Sets or clears the pub/sub flag to indiciate whether this client is pinging a queue or a topic.
- *
- * @param pubsub <tt>true</tt> if this client is pinging a topic, <tt>false</tt> if it is pinging a queue.
- */
- public void setPubSub(boolean pubsub)
- {
- _isPubSub = pubsub;
- }
-
- /**
- * Checks whether this client is a p2p or pub/sub ping client.
- *
- * @return <tt>true</tt> if this client is pinging a topic, <tt>false</tt> if it is pinging a queue.
- */
- public boolean isPubSub()
- {
- return _isPubSub;
- }
-
- /**
- * Convenience method to commit the transaction on the specified controlSession. If the controlSession to commit on is not
- * a transactional controlSession, this method does nothing.
- *
- * <p/>If the {@link #_failBeforeCommit} flag is set, this will prompt the user to kill the broker before the
- * commit is applied. If the {@link #_failAfterCommit} flag is set, this will prompt the user to kill the broker
- * after the commit is applied.
- *
- * @throws javax.jms.JMSException If the commit fails and then the rollback fails.
- */
- protected void commitTx(Session session) throws JMSException
- {
- if (session.getTransacted())
- {
- try
- {
- if (_failBeforeCommit)
- {
- _logger.debug("Failing Before Commit");
- doFailover();
- }
-
- session.commit();
-
- if (_failAfterCommit)
- {
- _logger.debug("Failing After Commit");
- doFailover();
- }
-
- _logger.debug("Session Commited.");
- }
- catch (JMSException e)
- {
- _logger.trace("JMSException on commit:" + e.getMessage(), e);
-
- try
- {
- session.rollback();
- _logger.debug("Message rolled back.");
- }
- catch (JMSException jmse)
- {
- _logger.trace("JMSE on rollback:" + jmse.getMessage(), jmse);
-
- // Both commit and rollback failed. Throw the rollback exception.
- throw jmse;
- }
- }
- }
- }
-
- /**
- * Prompts the user to terminate the named broker, in order to test failover functionality. This method will block
- * until the user supplied some input on the terminal.
- *
- * @param broker The name of the broker to terminate.
- */
- protected void doFailover(String broker)
- {
- System.out.println("Kill Broker " + broker + " now.");
- try
- {
- System.in.read();
- }
- catch (IOException e)
- { }
-
- System.out.println("Continuing.");
- }
-
- /**
- * Prompts the user to terminate the broker, in order to test failover functionality. This method will block
- * until the user supplied some input on the terminal.
- */
- protected void doFailover()
- {
- System.out.println("Kill Broker now.");
- try
- {
- System.in.read();
- }
- catch (IOException e)
- { }
-
- System.out.println("Continuing.");
-
- }
-
- private void createConsumerDestination(String name)
- {
- if (isPubSub())
- {
- _consumerDestination = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, name);
- }
- else
- {
- _consumerDestination = new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, name);
- }
- }
-
- /**
- * A connection listener that logs out any failover complete events. Could do more interesting things with this
- * at some point...
- */
- public static class FailoverNotifier implements ConnectionListener
- {
- public void bytesSent(long count)
- { }
-
- public void bytesReceived(long count)
- { }
-
- public boolean preFailover(boolean redirect)
- {
- return true;
- }
-
- public boolean preResubscribe()
- {
- return true;
- }
-
- public void failoverComplete()
- {
- _logger.info("App got failover complete callback.");
- }
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java b/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java
deleted file mode 100644
index 639b0c72ba..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java
+++ /dev/null
@@ -1,1818 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.requestreply;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.NDC;
-
-import org.apache.qpid.test.framework.TestUtils;
-
-import org.apache.qpid.junit.extensions.BatchedThrottle;
-import org.apache.qpid.junit.extensions.Throttle;
-import org.apache.qpid.junit.extensions.util.CommandLineParser;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import javax.jms.*;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-
-import java.io.*;
-import java.net.InetAddress;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * PingPongProducer is a client that sends test messages, and waits for replies to these messages. The replies may
- * either be generated by another client (see {@link PingPongBouncer}, or an extension of it may be used that listens
- * to its own messages and does not send replies (see {@link org.apache.qpid.ping.PingClient}). The intention of ping
- * pong producer is that it is a swiss-army knife test client that makes almost every aspect of its behaviour
- * configurable.
- *
- * <p/>The pings are sent with a reply-to field set to a single temporary queue, which is the same for all pings. This
- * means that this class has to do some work to correlate pings with pongs; it expectes the original message correlation
- * id in the ping to be bounced back in the reply correlation id.
- *
- * <p/>This ping tool accepts a vast number of configuration options, all of which are passed in to the constructor. It
- * can ping topics or queues; ping multiple destinations; do persistent pings; send messages of any size; do pings within
- * transactions; control the number of pings to send in each transaction; limit its sending rate; and perform failover
- * testing. A complete list of accepted parameters, default values and comments on their usage is provided here:
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> messageSize <td> 0 <td> Message size in bytes. Not including any headers.
- * <tr><td> destinationName <td> ping <td> The root name to use to generate destination names to ping.
- * <tr><td> persistent <td> false <td> Determines whether peristent delivery is used.
- * <tr><td> transacted <td> false <td> Determines whether messages are sent/received in transactions.
- * <tr><td> broker <td> tcp://localhost:5672 <td> Determines the broker to connect to.
- * <tr><td> virtualHost <td> test <td> Determines the virtual host to send all ping over.
- * <tr><td> rate <td> 0 <td> The maximum rate (in hertz) to send messages at. 0 means no limit.
- * <tr><td> verbose <td> false <td> The verbose flag for debugging. Prints to console on every message.
- * <tr><td> pubsub <td> false <td> Whether to ping topics or queues. Uses p2p by default.
- * <tr><td> failAfterCommit <td> false <td> Whether to prompt user to kill broker after a commit batch.
- * <tr><td> failBeforeCommit <td> false <td> Whether to prompt user to kill broker before a commit batch.
- * <tr><td> failAfterSend <td> false <td> Whether to prompt user to kill broker after a send.
- * <tr><td> failBeforeSend <td> false <td> Whether to prompt user to kill broker before a send.
- * <tr><td> failOnce <td> true <td> Whether to prompt for failover only once.
- * <tr><td> username <td> guest <td> The username to access the broker with.
- * <tr><td> password <td> guest <td> The password to access the broker with.
- * <tr><td> selector <td> null <td> Not used. Defines a message selector to filter pings with.
- * <tr><td> destinationCount <td> 1 <td> The number of destinations to send pings to.
- * <tr><td> numConsumers <td> 1 <td> The number of consumers on each destination.
- * <tr><td> timeout <td> 30000 <td> In milliseconds. The timeout to stop waiting for replies.
- * <tr><td> commitBatchSize <td> 1 <td> The number of messages per transaction in transactional mode.
- * <tr><td> uniqueDests <td> true <td> Whether each receivers only listens to one ping destination or all.
- * <tr><td> durableDests <td> false <td> Whether or not durable destinations are used.
- * <tr><td> ackMode <td> AUTO_ACK <td> The message acknowledgement mode. Possible values are:
- * 0 - SESSION_TRANSACTED
- * 1 - AUTO_ACKNOWLEDGE
- * 2 - CLIENT_ACKNOWLEDGE
- * 3 - DUPS_OK_ACKNOWLEDGE
- * 257 - NO_ACKNOWLEDGE
- * 258 - PRE_ACKNOWLEDGE
- * <tr><td> consTransacted <td> false <td> Whether or not consumers use transactions. Defaults to the same value
- * as the 'transacted' option if not seperately defined.
- * <tr><td> consAckMode <td> AUTO_ACK <td> The message acknowledgement mode for consumers. Defaults to the same
- * value as 'ackMode' if not seperately defined.
- * <tr><td> maxPending <td> 0 <td> The maximum size in bytes, of messages sent but not yet received.
- * Limits the volume of messages currently buffered on the client
- * or broker. Can help scale test clients by limiting amount of buffered
- * data to avoid out of memory errors.
- * </table>
- *
- * <p/>This implements the Runnable interface with a run method that implements an infinite ping loop. The ping loop
- * does all its work through helper methods, so that code wishing to run a ping-pong cycle is not forced to do so by
- * starting a new thread. The command line invocation does take advantage of this ping loop. A shutdown hook is also
- * registered to terminate the ping-pong loop cleanly.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a ping and wait for all responses cycle.
- * <tr><td> Provide command line invocation to loop the ping cycle on a configurable broker url.
- * </table>
- *
- * @todo Use read/write lock in the onmessage, not for reading writing but to make use of a shared and exlcusive lock pair.
- * Obtain read lock on all messages, before decrementing the message count. At the end of the on message method add a
- * block that obtains the write lock for the very last message, releases any waiting producer. Means that the last
- * message waits until all other messages have been handled before releasing producers but allows messages to be
- * processed concurrently, unlike the current synchronized block.
- */
-public class PingPongProducer implements Runnable, ExceptionListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(PingPongProducer.class);
-
- /** Holds the name of the property to determine whether of not client id is overridden at connection time. */
- public static final String OVERRIDE_CLIENT_ID_PROPNAME = "overrideClientId";
-
- /** Holds the default value of the override client id flag. */
- public static final String OVERRIDE_CLIENT_ID_DEAFULT = "false";
-
- /** Holds the name of the property to define the JNDI factory name with. */
- public static final String FACTORY_NAME_PROPNAME = "factoryName";
-
- /** Holds the default JNDI name of the connection factory. */
- public static final String FACTORY_NAME_DEAFULT = "local";
-
- /** Holds the name of the property to set the JNDI initial context properties with. */
- public static final String FILE_PROPERTIES_PROPNAME = "properties";
-
- /** Holds the default file name of the JNDI initial context properties. */
- public static final String FILE_PROPERTIES_DEAFULT = "perftests.properties";
-
- /** Holds the name of the property to get the test message size from. */
- public static final String MESSAGE_SIZE_PROPNAME = "messageSize";
-
- /** Used to set up a default message size. */
- public static final int MESSAGE_SIZE_DEAFULT = 0;
-
- /** Holds the name of the property to get the ping queue name from. */
- public static final String PING_QUEUE_NAME_PROPNAME = "destinationName";
-
- /** Holds the name of the default destination to send pings on. */
- public static final String PING_QUEUE_NAME_DEFAULT = "ping";
-
- /** Holds the name of the property to get the queue name postfix from. */
- public static final String QUEUE_NAME_POSTFIX_PROPNAME = "queueNamePostfix";
-
- /** Holds the default queue name postfix value. */
- public static final String QUEUE_NAME_POSTFIX_DEFAULT = "";
-
- /** Holds the name of the property to get the test delivery mode from. */
- public static final String PERSISTENT_MODE_PROPNAME = "persistent";
-
- /** Holds the message delivery mode to use for the test. */
- public static final boolean PERSISTENT_MODE_DEFAULT = false;
-
- /** Holds the name of the property to get the test transactional mode from. */
- public static final String TRANSACTED_PROPNAME = "transacted";
-
- /** Holds the transactional mode to use for the test. */
- public static final boolean TRANSACTED_DEFAULT = false;
-
- /** Holds the name of the property to get the test consumer transacted mode from. */
- public static final String CONSUMER_TRANSACTED_PROPNAME = "consTransacted";
-
- /** Holds the consumer transactional mode default setting. */
- public static final boolean CONSUMER_TRANSACTED_DEFAULT = false;
-
- /** Holds the name of the property to get the test broker url from. */
- public static final String BROKER_PROPNAME = "broker";
-
- /** Holds the default broker url for the test. */
- public static final String BROKER_DEFAULT = "tcp://localhost:5672";
-
- /** Holds the name of the property to get the test broker virtual path. */
- public static final String VIRTUAL_HOST_PROPNAME = "virtualHost";
-
- /** Holds the default virtual path for the test. */
- public static final String VIRTUAL_HOST_DEFAULT = "";
-
- /** Holds the name of the property to get the message rate from. */
- public static final String RATE_PROPNAME = "rate";
-
- /** Defines the default rate (in pings per second) to send pings at. 0 means as fast as possible, no restriction. */
- public static final int RATE_DEFAULT = 0;
-
- /** Holds the name of the property to get the verbose mode proeprty from. */
- public static final String VERBOSE_PROPNAME = "verbose";
-
- /** Holds the default verbose mode. */
- public static final boolean VERBOSE_DEFAULT = false;
-
- /** Holds the name of the property to get the p2p or pub/sub messaging mode from. */
- public static final String PUBSUB_PROPNAME = "pubsub";
-
- /** Holds the pub/sub mode default, true means ping a topic, false means ping a queue. */
- public static final boolean PUBSUB_DEFAULT = false;
-
- /** Holds the name of the property to get the fail after commit flag from. */
- public static final String FAIL_AFTER_COMMIT_PROPNAME = "failAfterCommit";
-
- /** Holds the default failover after commit test flag. */
- public static final boolean FAIL_AFTER_COMMIT_DEFAULT = false;
-
- /** Holds the name of the proeprty to get the fail before commit flag from. */
- public static final String FAIL_BEFORE_COMMIT_PROPNAME = "failBeforeCommit";
-
- /** Holds the default failover before commit test flag. */
- public static final boolean FAIL_BEFORE_COMMIT_DEFAULT = false;
-
- /** Holds the name of the proeprty to get the fail after send flag from. */
- public static final String FAIL_AFTER_SEND_PROPNAME = "failAfterSend";
-
- /** Holds the default failover after send test flag. */
- public static final boolean FAIL_AFTER_SEND_DEFAULT = false;
-
- /** Holds the name of the property to get the fail before send flag from. */
- public static final String FAIL_BEFORE_SEND_PROPNAME = "failBeforeSend";
-
- /** Holds the default failover before send test flag. */
- public static final boolean FAIL_BEFORE_SEND_DEFAULT = false;
-
- /** Holds the name of the property to get the fail once flag from. */
- public static final String FAIL_ONCE_PROPNAME = "failOnce";
-
- /** The default failover once flag, true means only do one failover, false means failover on every commit cycle. */
- public static final boolean FAIL_ONCE_DEFAULT = true;
-
- /** Holds the name of the property to get the broker access username from. */
- public static final String USERNAME_PROPNAME = "username";
-
- /** Holds the default broker log on username. */
- public static final String USERNAME_DEFAULT = "guest";
-
- /** Holds the name of the property to get the broker access password from. */
- public static final String PASSWORD_PROPNAME = "password";
-
- /** Holds the default broker log on password. */
- public static final String PASSWORD_DEFAULT = "guest";
-
- /** Holds the name of the proeprty to get the. */
- public static final String SELECTOR_PROPNAME = "selector";
-
- /** Holds the default message selector. */
- public static final String SELECTOR_DEFAULT = "";
-
- /** Holds the name of the property to get the destination count from. */
- public static final String DESTINATION_COUNT_PROPNAME = "destinationCount";
-
- /** Defines the default number of destinations to ping. */
- public static final int DESTINATION_COUNT_DEFAULT = 1;
-
- /** Holds the name of the property to get the number of consumers per destination from. */
- public static final String NUM_CONSUMERS_PROPNAME = "numConsumers";
-
- /** Defines the default number consumers per destination. */
- public static final int NUM_CONSUMERS_DEFAULT = 1;
-
- /** Holds the name of the property to get the waiting timeout for response messages. */
- public static final String TIMEOUT_PROPNAME = "timeout";
-
- /** Default time to wait before assuming that a ping has timed out. */
- public static final long TIMEOUT_DEFAULT = 30000;
-
- /** Holds the name of the property to get the commit batch size from. */
- public static final String TX_BATCH_SIZE_PROPNAME = "commitBatchSize";
-
- /** Defines the default number of pings to send in each transaction when running transactionally. */
- public static final int TX_BATCH_SIZE_DEFAULT = 1;
-
- /** Holds the name of the property to get the unique destinations flag from. */
- public static final String UNIQUE_DESTS_PROPNAME = "uniqueDests";
-
- /** Defines the default value for the unique destinations property. */
- public static final boolean UNIQUE_DESTS_DEFAULT = true;
-
- /** Holds the name of the property to get the durable destinations flag from. */
- public static final String DURABLE_DESTS_PROPNAME = "durableDests";
-
- /** Defines the default value of the durable destinations flag. */
- public static final boolean DURABLE_DESTS_DEFAULT = false;
-
- /** Holds the name of the proeprty to get the message acknowledgement mode from. */
- public static final String ACK_MODE_PROPNAME = "ackMode";
-
- /** Defines the default message acknowledgement mode. */
- public static final int ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE;
-
- /** Holds the name of the property to get the consumers message acknowledgement mode from. */
- public static final String CONSUMER_ACK_MODE_PROPNAME = "consAckMode";
-
- /** Defines the default consumers message acknowledgement mode. */
- public static final int CONSUMER_ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE;
-
- /** Holds the name of the property to get the maximum pending message size setting from. */
- public static final String MAX_PENDING_PROPNAME = "maxPending";
-
- /** Defines the default value for the maximum pending message size setting. 0 means no limit. */
- public static final int MAX_PENDING_DEFAULT = 0;
-
- /** Defines the default prefetch size to use when consuming messages. */
- public static final int PREFETCH_DEFAULT = 100;
-
- /** Defines the default value of the no local flag to use when consuming messages. */
- public static final boolean NO_LOCAL_DEFAULT = false;
-
- /** Defines the default value of the exclusive flag to use when consuming messages. */
- public static final boolean EXCLUSIVE_DEFAULT = false;
-
- /** Holds the name of the property to store nanosecond timestamps in ping messages with. */
- public static final String MESSAGE_TIMESTAMP_PROPNAME = "timestamp";
-
- /** Holds the name of the property to get the number of message to prefill the broker with before starting the main test. */
- public static final String PREFILL_PROPNAME = "preFill";
-
- /** Defines the default value for the number of messages to prefill. 0,default, no messages. */
- public static final int PREFILL_DEFAULT = 0;
-
- /** Holds the name of the property to get the delay to wait in ms before starting the main test after having prefilled. */
- public static final String DELAY_BEFORE_CONSUME_PROPNAME = "delayBeforeConsume";
-
- /** Defines the default value for delay in ms to wait before starting thet test run. 0,default, no delay. */
- public static final long DELAY_BEFORE_CONSUME = 0;
-
- /** Holds the name of the property to get when no messasges should be sent. */
- public static final String CONSUME_ONLY_PROPNAME = "consumeOnly";
-
- /** Defines the default value of the consumeOnly flag to use when publishing messages is not desired. */
- public static final boolean CONSUME_ONLY_DEFAULT = false;
-
- /** Holds the name of the property to get when no messasges should be sent. */
- public static final String SEND_ONLY_PROPNAME = "sendOnly";
-
- /** Defines the default value of the consumeOnly flag to use when publishing messages is not desired. */
- public static final boolean SEND_ONLY_DEFAULT = false;
-
- /** Holds the default configuration properties. */
- public static ParsedProperties defaults = new ParsedProperties();
-
- static
- {
- defaults.setPropertyIfNull(OVERRIDE_CLIENT_ID_PROPNAME, OVERRIDE_CLIENT_ID_DEAFULT);
- defaults.setPropertyIfNull(FILE_PROPERTIES_PROPNAME, FILE_PROPERTIES_DEAFULT);
- defaults.setPropertyIfNull(FACTORY_NAME_PROPNAME, FACTORY_NAME_DEAFULT);
- defaults.setPropertyIfNull(BROKER_PROPNAME, BROKER_DEFAULT);
- defaults.setPropertyIfNull(USERNAME_PROPNAME, USERNAME_DEFAULT);
- defaults.setPropertyIfNull(PASSWORD_PROPNAME, PASSWORD_DEFAULT);
- defaults.setPropertyIfNull(VIRTUAL_HOST_PROPNAME, VIRTUAL_HOST_DEFAULT);
- defaults.setPropertyIfNull(PING_QUEUE_NAME_PROPNAME, PING_QUEUE_NAME_DEFAULT);
- defaults.setPropertyIfNull(QUEUE_NAME_POSTFIX_PROPNAME, QUEUE_NAME_POSTFIX_DEFAULT);
- defaults.setPropertyIfNull(SELECTOR_PROPNAME, SELECTOR_DEFAULT);
- defaults.setPropertyIfNull(TRANSACTED_PROPNAME, TRANSACTED_DEFAULT);
- defaults.setPropertyIfNull(CONSUMER_TRANSACTED_PROPNAME, CONSUMER_TRANSACTED_DEFAULT);
- defaults.setPropertyIfNull(PERSISTENT_MODE_PROPNAME, PERSISTENT_MODE_DEFAULT);
- defaults.setPropertyIfNull(ACK_MODE_PROPNAME, ACK_MODE_DEFAULT);
- defaults.setPropertyIfNull(CONSUMER_ACK_MODE_PROPNAME, CONSUMER_ACK_MODE_DEFAULT);
- defaults.setPropertyIfNull(MESSAGE_SIZE_PROPNAME, MESSAGE_SIZE_DEAFULT);
- defaults.setPropertyIfNull(VERBOSE_PROPNAME, VERBOSE_DEFAULT);
- defaults.setPropertyIfNull(PUBSUB_PROPNAME, PUBSUB_DEFAULT);
- defaults.setPropertyIfNull(UNIQUE_DESTS_PROPNAME, UNIQUE_DESTS_DEFAULT);
- defaults.setPropertyIfNull(DURABLE_DESTS_PROPNAME, DURABLE_DESTS_DEFAULT);
- defaults.setPropertyIfNull(FAIL_BEFORE_COMMIT_PROPNAME, FAIL_BEFORE_COMMIT_DEFAULT);
- defaults.setPropertyIfNull(FAIL_AFTER_COMMIT_PROPNAME, FAIL_AFTER_COMMIT_DEFAULT);
- defaults.setPropertyIfNull(FAIL_BEFORE_SEND_PROPNAME, FAIL_BEFORE_SEND_DEFAULT);
- defaults.setPropertyIfNull(FAIL_AFTER_SEND_PROPNAME, FAIL_AFTER_SEND_DEFAULT);
- defaults.setPropertyIfNull(FAIL_ONCE_PROPNAME, FAIL_ONCE_DEFAULT);
- defaults.setPropertyIfNull(TX_BATCH_SIZE_PROPNAME, TX_BATCH_SIZE_DEFAULT);
- defaults.setPropertyIfNull(DESTINATION_COUNT_PROPNAME, DESTINATION_COUNT_DEFAULT);
- defaults.setPropertyIfNull(NUM_CONSUMERS_PROPNAME, NUM_CONSUMERS_DEFAULT);
- defaults.setPropertyIfNull(RATE_PROPNAME, RATE_DEFAULT);
- defaults.setPropertyIfNull(TIMEOUT_PROPNAME, TIMEOUT_DEFAULT);
- defaults.setPropertyIfNull(MAX_PENDING_PROPNAME, MAX_PENDING_DEFAULT);
- defaults.setPropertyIfNull(PREFILL_PROPNAME, PREFILL_DEFAULT);
- defaults.setPropertyIfNull(DELAY_BEFORE_CONSUME_PROPNAME, DELAY_BEFORE_CONSUME);
- defaults.setPropertyIfNull(CONSUME_ONLY_PROPNAME, CONSUME_ONLY_DEFAULT);
- defaults.setPropertyIfNull(SEND_ONLY_PROPNAME, SEND_ONLY_DEFAULT);
- }
-
- /** Allows setting of client ID on the connection, rather than through the connection URL. */
- protected boolean _overrideClientId;
-
- /** Holds the JNDI name of the JMS connection factory. */
- protected String _factoryName;
-
- /** Holds the name of the properties file to configure JNDI with. */
- protected String _fileProperties;
-
- /** Holds the broker url. */
- protected String _brokerDetails;
-
- /** Holds the username to access the broker with. */
- protected String _username;
-
- /** Holds the password to access the broker with. */
- protected String _password;
-
- /** Holds the virtual host on the broker to run the tests through. */
- protected String _virtualpath;
-
- /** Holds the root name from which to generate test destination names. */
- protected String _destinationName;
-
- /** Holds the default queue name postfix value. */
- protected String _queueNamePostfix;
-
- /** Holds the message selector to filter the pings with. */
- protected String _selector;
-
- /** Holds the producers transactional mode flag. */
- protected boolean _transacted;
-
- /** Holds the consumers transactional mode flag. */
- protected boolean _consTransacted;
-
- /** Determines whether this producer sends persistent messages. */
- protected boolean _persistent;
-
- /** Holds the acknowledgement mode used for the producers. */
- protected int _ackMode;
-
- /** Holds the acknowledgement mode setting for the consumers. */
- protected int _consAckMode;
-
- /** Determines what size of messages this producer sends. */
- protected int _messageSize;
-
- /** Used to indicate that the ping loop should print out whenever it pings. */
- protected boolean _verbose;
-
- /** Flag used to indicate if this is a point to point or pub/sub ping client. */
- protected boolean _isPubSub;
-
- /** Flag used to indicate if the destinations should be unique client. */
- protected boolean _isUnique;
-
- /** Flag used to indicate that durable destination should be used. */
- protected boolean _isDurable;
-
- /** Flag used to indicate that the user should be prompted to terminate a broker, to test failover before a commit. */
- protected boolean _failBeforeCommit;
-
- /** Flag used to indicate that the user should be prompted to terminate a broker, to test failover after a commit. */
- protected boolean _failAfterCommit;
-
- /** Flag used to indicate that the user should be prompted to terminate a broker, to test failover before a send. */
- protected boolean _failBeforeSend;
-
- /** Flag used to indicate that the user should be prompted to terminate a broker, to test failover after a send. */
- protected boolean _failAfterSend;
-
- /** Flag used to indicate that failover prompting should only be done on the first commit, not on every commit. */
- protected boolean _failOnce;
-
- /** Holds the number of sends that should be performed in every transaction when using transactions. */
- protected int _txBatchSize;
-
- /** Holds the number of destinations to ping. */
- protected int _noOfDestinations;
-
- /** Holds the number of consumers per destination. */
- protected int _noOfConsumers;
-
- private int[] _consumerBatchCounts;
-
- /** Holds the maximum send rate in herz. */
- protected int _rate;
-
- /**
- * Holds the size of the maximum amount of pending data that the client should buffer, sending is suspended
- * if this limit is breached.
- */
- protected int _maxPendingSize;
-
- /**
- * Holds the number of messages to send during the setup phase, before the clients start consuming.
- */
- private Integer _preFill;
-
- /**
- * Holds the time in ms to wait after preFilling before starting thet test.
- */
- private Long _delayBeforeConsume;
-
- /**
- * Holds a boolean value of wither this test should just consume, i.e. skips
- * sending messages, but still expects to receive the specified number.
- */
- private boolean _consumeOnly;
-
- /**
- * Holds a boolean value of wither this test should just send, i.e. skips
- * consuming messages, but still creates clients just doesn't start them.
- */
- private boolean _sendOnly;
-
-
- /** A source for providing sequential unique correlation ids. These will be unique within the same JVM. */
- private static AtomicLong _correlationIdGenerator = new AtomicLong(0L);
-
- /** A source for providing sequential unqiue ids for instances of this class to be identifed with. */
- private static AtomicInteger _instanceIdGenerator = new AtomicInteger(0);
-
- /** Holds this instances unique id. */
- private int instanceId;
-
- /**
- * Holds a map from message ids to latches on which threads wait for replies. This map is shared accross multiple
- * ping producers on the same JVM.
- */
- private static Map<String, PerCorrelationId> perCorrelationIds =
- Collections.synchronizedMap(new HashMap<String, PerCorrelationId>());
-
- /** A convenient formatter to use when time stamping output. */
- protected static final DateFormat timestampFormatter = new SimpleDateFormat("hh:mm:ss:SS");
-
- /** Holds the connection for the message producer. */
- protected Connection _connection;
-
- /** Holds the consumer connections. */
- protected Connection[] _consumerConnection;
-
- /** Holds the controlSession on which ping replies are received. */
- protected Session[] _consumerSession;
-
- /** Holds the producer controlSession, needed to create ping messages. */
- protected Session _producerSession;
-
- /** Holds the destination where the response messages will arrive. */
- protected Destination _replyDestination;
-
- /** Holds the set of destinations that this ping producer pings. */
- protected List<Destination> _pingDestinations;
-
- /** Used to restrict the sending rate to a specified limit. */
- protected Throttle _rateLimiter;
-
- /** Holds a message listener that this message listener chains all its messages to. */
- protected ChainedMessageListener _chainedMessageListener = null;
-
- /**
- * This id generator is used to generate ids to append to the queue name to ensure that queues can be unique when
- * creating multiple ping producers in the same JVM.
- */
- protected static AtomicInteger _queueJVMSequenceID = new AtomicInteger();
-
- /**
- * This id generator is used to generates ids that are only unique within this pinger. Creating multiple pingers
- * on the same JVM using this id generator will allow them to ping on the same queues.
- */
- protected AtomicInteger _queueSharedID = new AtomicInteger();
-
- /** Used to tell the ping loop when to terminate, it only runs while this is true. */
- protected boolean _publish = true;
-
- /** Holds the message producer to send the pings through. */
- protected MessageProducer _producer;
-
- /** Holds the message consumer to receive the ping replies through. */
- protected MessageConsumer[] _consumer;
-
- /** The prompt to display when asking the user to kill the broker for failover testing. */
- private static final String KILL_BROKER_PROMPT = "Kill broker now, then press Return.";
-
- /** Holds the name for this test client to be identified to the broker with. */
- private String _clientID;
-
- /** Keeps count of the total messages sent purely for debugging purposes. */
- private static AtomicInteger numSent = new AtomicInteger();
-
- /**
- * Holds a monitor which is used to synchronize sender and receivers threads, where the sender has elected
- * to wait until the number of unreceived message is reduced before continuing to send. This monitor is a
- * fair SynchronousQueue becuase that provides fair scheduling, to ensure that all producer threads get an
- * equal chance to produce messages.
- */
- static final SynchronousQueue _sendPauseMonitor = new SynchronousQueue(true);
-
- /** Keeps a count of the number of message currently sent but not received. */
- static AtomicInteger _unreceived = new AtomicInteger(0);
-
- /**
- * Creates a ping producer with the specified parameters, of which there are many. See the class level comments
- * for details. This constructor creates a connection to the broker and creates producer and consumer sessions on
- * it, to send and recieve its pings and replies on.
- *
- * @param overrides Properties containing any desired overrides to the defaults.
- *
- * @throws Exception Any exceptions are allowed to fall through.
- */
- public PingPongProducer(Properties overrides) throws Exception
- {
- // log.debug("public PingPongProducer(Properties overrides = " + overrides + "): called");
- instanceId = _instanceIdGenerator.getAndIncrement();
-
- // Create a set of parsed properties from the defaults overriden by the passed in values.
- ParsedProperties properties = new ParsedProperties(defaults);
- properties.putAll(overrides);
-
- // Extract the configuration properties to set the pinger up with.
- _overrideClientId = properties.getPropertyAsBoolean(OVERRIDE_CLIENT_ID_PROPNAME);
- _factoryName = properties.getProperty(FACTORY_NAME_PROPNAME);
- _fileProperties = properties.getProperty(FILE_PROPERTIES_PROPNAME);
- _brokerDetails = properties.getProperty(BROKER_PROPNAME);
- _username = properties.getProperty(USERNAME_PROPNAME);
- _password = properties.getProperty(PASSWORD_PROPNAME);
- _virtualpath = properties.getProperty(VIRTUAL_HOST_PROPNAME);
- _destinationName = properties.getProperty(PING_QUEUE_NAME_PROPNAME);
- _queueNamePostfix = properties.getProperty(QUEUE_NAME_POSTFIX_PROPNAME);
- _selector = properties.getProperty(SELECTOR_PROPNAME);
- _transacted = properties.getPropertyAsBoolean(TRANSACTED_PROPNAME);
- _consTransacted = properties.getPropertyAsBoolean(CONSUMER_TRANSACTED_PROPNAME);
- _persistent = properties.getPropertyAsBoolean(PERSISTENT_MODE_PROPNAME);
- _messageSize = properties.getPropertyAsInteger(MESSAGE_SIZE_PROPNAME);
- _verbose = properties.getPropertyAsBoolean(VERBOSE_PROPNAME);
- _failAfterCommit = properties.getPropertyAsBoolean(FAIL_AFTER_COMMIT_PROPNAME);
- _failBeforeCommit = properties.getPropertyAsBoolean(FAIL_BEFORE_COMMIT_PROPNAME);
- _failAfterSend = properties.getPropertyAsBoolean(FAIL_AFTER_SEND_PROPNAME);
- _failBeforeSend = properties.getPropertyAsBoolean(FAIL_BEFORE_SEND_PROPNAME);
- _failOnce = properties.getPropertyAsBoolean(FAIL_ONCE_PROPNAME);
- _txBatchSize = properties.getPropertyAsInteger(TX_BATCH_SIZE_PROPNAME);
- _noOfDestinations = properties.getPropertyAsInteger(DESTINATION_COUNT_PROPNAME);
- _noOfConsumers = properties.getPropertyAsInteger(NUM_CONSUMERS_PROPNAME);
- _consumerBatchCounts = new int[_noOfConsumers];
- _rate = properties.getPropertyAsInteger(RATE_PROPNAME);
- _isPubSub = properties.getPropertyAsBoolean(PUBSUB_PROPNAME);
- _isUnique = properties.getPropertyAsBoolean(UNIQUE_DESTS_PROPNAME);
- _isDurable = properties.getPropertyAsBoolean(DURABLE_DESTS_PROPNAME);
- _ackMode = _transacted ? 0 : properties.getPropertyAsInteger(ACK_MODE_PROPNAME);
- _consAckMode = _consTransacted ? 0 : properties.getPropertyAsInteger(CONSUMER_ACK_MODE_PROPNAME);
- _maxPendingSize = properties.getPropertyAsInteger(MAX_PENDING_PROPNAME);
- _preFill = properties.getPropertyAsInteger(PREFILL_PROPNAME);
- _delayBeforeConsume = properties.getPropertyAsLong(DELAY_BEFORE_CONSUME_PROPNAME);
- _consumeOnly = properties.getPropertyAsBoolean(CONSUME_ONLY_PROPNAME);
- _sendOnly = properties.getPropertyAsBoolean(SEND_ONLY_PROPNAME);
-
- // Check that one or more destinations were specified.
- if (_noOfDestinations < 1)
- {
- throw new IllegalArgumentException("There must be at least one destination.");
- }
-
- // Set up a throttle to control the send rate, if a rate > 0 is specified.
- if (_rate > 0)
- {
- _rateLimiter = new BatchedThrottle();
- _rateLimiter.setRate(_rate);
- }
-
- // Create the connection and message producers/consumers.
- // establishConnection(true, true);
- }
-
- /**
- * Establishes a connection to the broker and creates message consumers and producers based on the parameters
- * that this ping client was created with.
- *
- * @param producer Flag to indicate whether or not the producer should be set up.
- * @param consumer Flag to indicate whether or not the consumers should be set up.
- *
- * @throws Exception Any exceptions are allowed to fall through.
- */
- public void establishConnection(boolean producer, boolean consumer) throws Exception
- {
- // log.debug("public void establishConnection(): called");
-
- // Generate a unique identifying name for this client, based on it ip address and the current time.
- InetAddress address = InetAddress.getLocalHost();
- // _clientID = address.getHostName() + System.currentTimeMillis();
- _clientID = "perftest_" + instanceId;
-
- // Create a connection to the broker.
- createConnection(_clientID);
-
- // Create transactional or non-transactional sessions, based on the command line arguments.
- _producerSession = _connection.createSession(_transacted, _ackMode);
-
- _consumerSession = new Session[_noOfConsumers];
-
- for (int i = 0; i < _noOfConsumers; i++)
- {
- _consumerSession[i] = _consumerConnection[i].createSession(_consTransacted, _consAckMode);
- }
-
- // Create the destinations to send pings to and receive replies from.
- if (_noOfConsumers > 0)
- {
- _replyDestination = _consumerSession[0].createTemporaryQueue();
- }
- createPingDestinations(_noOfDestinations, _selector, _destinationName, _isUnique, _isDurable);
-
- // Create the message producer only if instructed to.
- if (producer)
- {
- createProducer();
- }
-
- // Create the message consumer only if instructed to.
- if (consumer)
- {
- createReplyConsumers(getReplyDestinations(), _selector);
- }
- }
-
- /**
- * Establishes a connection to the broker, based on the configuration parameters that this ping client was
- * created with.
- *
- * @param clientID The clients identifier.
- *
- * @throws JMSException Underlying exceptions allowed to fall through.
- * @throws NamingException Underlying exceptions allowed to fall through.
- * @throws IOException Underlying exceptions allowed to fall through.
- */
- protected void createConnection(String clientID) throws JMSException, NamingException, IOException
- {
- // _log.debug("protected void createConnection(String clientID = " + clientID + "): called");
-
- // _log.debug("Creating a connection for the message producer.");
- File propsFile = new File(_fileProperties);
- InputStream is = new FileInputStream(propsFile);
- Properties properties = new Properties();
- properties.load(is);
-
- Context context = new InitialContext(properties);
- ConnectionFactory factory = (ConnectionFactory) context.lookup(_factoryName);
- _connection = factory.createConnection(_username, _password);
-
- if (_overrideClientId)
- {
- _connection.setClientID(clientID);
- }
-
- // _log.debug("Creating " + _noOfConsumers + " connections for the consumers.");
-
- _consumerConnection = new Connection[_noOfConsumers];
-
- for (int i = 0; i < _noOfConsumers; i++)
- {
- _consumerConnection[i] = factory.createConnection(_username, _password);
- // _consumerConnection[i].setClientID(clientID);
- }
- }
-
- /**
- * Starts a ping-pong loop running from the command line. The bounce back client {@link PingPongBouncer} also needs
- * to be started to bounce the pings back again.
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- try
- {
- Properties options =
- CommandLineParser.processCommandLine(args, new CommandLineParser(new String[][] {}), System.getProperties());
-
- // Create a ping producer overriding its defaults with all options passed on the command line.
- PingPongProducer pingProducer = new PingPongProducer(options);
- pingProducer.establishConnection(true, true);
-
- // Start the ping producers dispatch thread running.
- pingProducer._connection.start();
-
- // Create a shutdown hook to terminate the ping-pong producer.
- Runtime.getRuntime().addShutdownHook(pingProducer.getShutdownHook());
-
- // Ensure that the ping pong producer is registered to listen for exceptions on the connection too.
- pingProducer._connection.setExceptionListener(pingProducer);
-
- // Create the ping loop thread and run it until it is terminated by the shutdown hook or exception.
- Thread pingThread = new Thread(pingProducer);
- pingThread.run();
- pingThread.join();
- }
- catch (Exception e)
- {
- System.err.println(e.getMessage());
- log.error("Top level handler caught execption.", e);
- System.exit(1);
- }
- }
-
- /**
- * Convenience method for a short pause.
- *
- * @param sleepTime The time in milliseconds to pause for.
- */
- public static void pause(long sleepTime)
- {
- if (sleepTime > 0)
- {
- try
- {
- Thread.sleep(sleepTime);
- }
- catch (InterruptedException ie)
- { }
- }
- }
-
- /**
- * Gets all the reply destinations (to listen for replies on). In this case this will just be the single reply to
- * destination of this pinger.
- *
- * @return The single reply to destination of this pinger, wrapped in a list.
- */
- public List<Destination> getReplyDestinations()
- {
- // log.debug("public List<Destination> getReplyDestinations(): called");
-
- List<Destination> replyDestinations = new ArrayList<Destination>();
- replyDestinations.add(_replyDestination);
-
- // log.debug("replyDestinations = " + replyDestinations);
-
- return replyDestinations;
- }
-
- /**
- * Creates the producer to send the pings on. This is created without a default destination. Its persistent delivery
- * flag is set accoring the ping producer creation options.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- public void createProducer() throws JMSException
- {
- // log.debug("public void createProducer(): called");
-
- _producer = (MessageProducer) _producerSession.createProducer(null);
- _producer.setDeliveryMode(_persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
-
- // log.debug("Created producer for " + (_persistent ? "persistent" : "non-persistent") + " messages.");
- }
-
- /**
- * Creates consumers for the specified number of destinations. The destinations themselves are also created by this
- * method.
- *
- * @param noOfDestinations The number of destinations to create consumers for.
- * @param selector The message selector to filter the consumers with.
- * @param rootName The root of the name, or actual name if only one is being created.
- * @param unique <tt>true</tt> to make the destinations unique to this pinger, <tt>false</tt> to share the
- * numbering with all pingers on the same JVM.
- * @param durable If the destinations are durable topics.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- public void createPingDestinations(int noOfDestinations, String selector, String rootName, boolean unique,
- boolean durable) throws JMSException
- {
- /*log.debug("public void createPingDestinations(int noOfDestinations = " + noOfDestinations + ", String selector = "
- + selector + ", String rootName = " + rootName + ", boolean unique = " + unique + ", boolean durable = "
- + durable + "): called");*/
-
- _pingDestinations = new ArrayList<Destination>();
-
- // Create the desired number of ping destinations and consumers for them.
- // log.debug("Creating " + noOfDestinations + " destinations to ping.");
-
- for (int i = 0; i < noOfDestinations; i++)
- {
- Destination destination;
- String id;
-
- // Generate an id, unique within this pinger or to the whole JVM depending on the unique flag.
- if (unique)
- {
- // log.debug("Creating unique destinations.");
- id = "_" + _queueJVMSequenceID.incrementAndGet() + "_" + _connection.getClientID();
- }
- else
- {
- // log.debug("Creating shared destinations.");
- id = "_" + _queueSharedID.incrementAndGet();
- }
-
- // Check if this is a pub/sub pinger, in which case create topics.
- if (_isPubSub)
- {
- destination = _producerSession.createTopic(rootName + id);
- // log.debug("Created non-durable topic " + destination);
-
- if (durable)
- {
- _producerSession.createDurableSubscriber((Topic) destination, _connection.getClientID());
- }
- }
- // Otherwise this is a p2p pinger, in which case create queues.
- else
- {
- destination = _producerSession.createQueue(rootName + id + _queueNamePostfix);
- // log.debug("Created queue " + destination);
- }
-
- // Keep the destination.
- _pingDestinations.add(destination);
- }
- }
-
- /**
- * Creates consumers for the specified destinations and registers this pinger to listen to their messages.
- *
- * @param destinations The destinations to listen to.
- * @param selector A selector to filter the messages with.
- *
- * @throws javax.jms.JMSException Any JMSExceptions are allowed to fall through.
- */
- public void createReplyConsumers(Collection<Destination> destinations, String selector) throws JMSException
- {
- /*log.debug("public void createReplyConsumers(Collection<Destination> destinations = " + destinations
- + ", String selector = " + selector + "): called");*/
-
- log.debug("There are " + destinations.size() + " destinations.");
- log.debug("Creating " + _noOfConsumers + " consumers on each destination.");
- log.debug("Total number of consumers is: " + (destinations.size() * _noOfConsumers));
-
- for (Destination destination : destinations)
- {
- _consumer = new MessageConsumer[_noOfConsumers];
-
- // If we don't have consumers then ensure we have created the
- // destination.
- if (_noOfConsumers == 0)
- {
- _producerSession.createConsumer(destination, selector,
- NO_LOCAL_DEFAULT).close();
- }
-
- for (int i = 0; i < _noOfConsumers; i++)
- {
- // Create a consumer for the destination and set this pinger to listen to its messages.
- _consumer[i] = _consumerSession[i].createConsumer(destination, selector, NO_LOCAL_DEFAULT);
-
- final int consumerNo = i;
-
- _consumer[i].setMessageListener(new MessageListener()
- {
- public void onMessage(Message message)
- {
- onMessageWithConsumerNo(message, consumerNo);
- }
- });
-
- log.debug("Set consumer " + i + " to listen to replies sent to destination: " + destination);
- }
- }
- }
-
- /**
- * Stores the received message in the replies map, then resets the boolean latch that a thread waiting for a
- * correlating reply may be waiting on. This is only done if the reply has a correlation id that is expected in the
- * replies map.
- *
- * @param message The received message.
- * @param consumerNo The consumer number within this test pinger instance.
- */
- public void onMessageWithConsumerNo(Message message, int consumerNo)
- {
- // log.debug("public void onMessageWithConsumerNo(Message message, int consumerNo = " + consumerNo + "): called");
- try
- {
- long now = System.nanoTime();
- long timestamp = getTimestamp(message);
- long pingTime = now - timestamp;
-
- // NDC.push("id" + instanceId + "/cons" + consumerNo);
-
- // Extract the messages correlation id.
- String correlationID = message.getJMSCorrelationID();
- // log.debug("correlationID = " + correlationID);
-
- // int num = message.getIntProperty("MSG_NUM");
- // log.info("Message " + num + " received.");
-
- boolean isRedelivered = message.getJMSRedelivered();
- // log.debug("isRedelivered = " + isRedelivered);
-
- if (!isRedelivered)
- {
- // Countdown on the traffic light if there is one for the matching correlation id.
- PerCorrelationId perCorrelationId = perCorrelationIds.get(correlationID);
-
- if (perCorrelationId != null)
- {
- CountDownLatch trafficLight = perCorrelationId.trafficLight;
-
- // Restart the timeout timer on every message.
- perCorrelationId.timeOutStart = System.nanoTime();
-
- // log.debug("Reply was expected, decrementing the latch for the id, " + correlationID);
-
- // Release waiting senders if there are some and using maxPending limit.
- if ((_maxPendingSize > 0))
- {
- // Decrement the count of sent but not yet received messages.
- int unreceived = _unreceived.decrementAndGet();
- int unreceivedSize =
- (unreceived * ((_messageSize == 0) ? 1 : _messageSize))
- / (_isPubSub ? getConsumersPerDestination() : 1);
-
- // log.debug("unreceived = " + unreceived);
- // log.debug("unreceivedSize = " + unreceivedSize);
-
- // synchronized (_sendPauseMonitor)
- // {
- if (unreceivedSize < _maxPendingSize)
- {
- _sendPauseMonitor.poll();
- }
- // }
- }
-
- // Decrement the countdown latch. Before this point, it is possible that two threads might enter this
- // method simultanesouly with the same correlation id. Decrementing the latch in a synchronized block
- // ensures that each thread will get a unique value for the remaining messages.
- long trueCount;
- long remainingCount;
-
- synchronized (trafficLight)
- {
- trafficLight.countDown();
-
- trueCount = trafficLight.getCount();
- remainingCount = trueCount - 1;
-
- if (++_consumerBatchCounts[consumerNo] == _txBatchSize)
- {
- _consumerBatchCounts[consumerNo] = 0;
- if (_consAckMode == 2)
- {
- // log.debug("Doing client ack for consumer " + consumerNo + ".");
- message.acknowledge();
- }
- else
- {
- // log.debug("Trying commit for consumer " + consumerNo + ".");
- commitTx(_consumerSession[consumerNo]);
- // log.info("Tx committed on consumer " + consumerNo);
- }
- }
-
- // Forward the message and remaining count to any interested chained message listener.
- if (_chainedMessageListener != null)
- {
- _chainedMessageListener.onMessage(message, (int) remainingCount, pingTime);
- }
-
- // Check if this is the last message, in which case release any waiting producers. This is done
- // after the transaction has been committed and any listeners notified.
- if (trueCount == 1)
- {
- trafficLight.countDown();
- }
- }
- }
- else
- {
- log.warn(consumerNo + " Got unexpected message with correlationId: " + correlationID);
- log.warn(consumerNo + " Map contains:" + perCorrelationIds.entrySet());
- }
- }
- else
- {
- log.warn("Got redelivered message, ignoring.");
- }
- }
- catch (Exception e)
- {
- log.warn("There was a Exception: " + e.getMessage(), e);
- }
- finally
- {
- // log.debug("public void onMessageWithConsumerNo(Message message, int consumerNo): ending");
- // NDC.clear();
- }
- }
-
- public void setupCorrelationID(String correlationId, int expectedCount)
- {
- PerCorrelationId perCorrelationId = new PerCorrelationId();
-
- // Create a count down latch to count the number of replies with. This is created before the messages are
- // sent so that the replies cannot be received before the count down is created.
- // One is added to this, so that the last reply becomes a special case. The special case is that the
- // chained message listener must be called before this sender can be unblocked, but that decrementing the
- // countdown needs to be done before the chained listener can be called.
- perCorrelationId.trafficLight = new CountDownLatch(expectedCount + 1);
-
- perCorrelationIds.put(correlationId, perCorrelationId);
- }
-
-
- /**
- * Sends the specified number of ping message and then waits for all correlating replies. If the wait times out
- * before a reply arrives, then a null reply is returned from this method. This method allows the caller to specify
- * the correlation id.
- *
- * Can be augmented through a pre-fill property (PingPongProducer.PREFILL_PROPNAME) that will populate the destination
- * with a set number of messages so the total pings sent and therefore expected will be PREFILL + numPings.
- *
- * If pre-fill is specified then the consumers will start paused to allow the prefilling to occur.
- *
- * @param message The message to send. If this is null, one is generated.
- * @param numPings The number of ping messages to send.
- * @param timeout The timeout in milliseconds.
- * @param messageCorrelationId The message correlation id. If this is null, one is generated.
- *
- * @return The number of replies received. This may be less than the number sent if the timeout terminated the wait
- * for all prematurely. If we are running in noConsumer=0 so send only mode then it will return the no msgs sent.
- *
- * @throws JMSException All underlying JMSExceptions are allowed to fall through.
- * @throws InterruptedException When interrupted by a timeout
- */
- public int pingAndWaitForReply(Message message, int numPings, long timeout, String messageCorrelationId)
- throws JMSException, InterruptedException
- {
- return pingAndWaitForReply(message, numPings, 0, timeout, messageCorrelationId);
- }
-
- public int pingAndWaitForReply(Message message, int numPings, int preFill, long timeout, String messageCorrelationId)
- throws JMSException, InterruptedException
- {
- /*log.debug("public int pingAndWaitForReply(Message message, int numPings = " + numPings + ", long timeout = "
- + timeout + ", String messageCorrelationId = " + messageCorrelationId + "): called");*/
-
- int totalPingsRequested = numPings + preFill;
-
- // Generate a unique correlation id to put on the messages before sending them, if one was not specified.
- if (messageCorrelationId == null)
- {
- messageCorrelationId = Long.toString(_correlationIdGenerator.incrementAndGet());
-
- setupCorrelationID(messageCorrelationId, getExpectedNumPings(totalPingsRequested));
- }
-
- try
- {
- // NDC.push("prod");
-
- PerCorrelationId perCorrelationId = perCorrelationIds.get(messageCorrelationId);
-
- // Set up the current time as the start time for pinging on the correlation id. This is used to determine
- // timeouts.
- perCorrelationId.timeOutStart = System.nanoTime();
-
- // Send the specifed number of messages for this test
- pingNoWaitForReply(message, numPings, messageCorrelationId);
-
- boolean timedOut;
- boolean allMessagesReceived;
- int numReplies;
-
- // We don't have a consumer so don't try and wait for the messages.
- // this does mean that if the producerSession is !TXed then we may
- // get to exit before all msgs have been received.
- //
- // Return the number of requested messages, this will let the test
- // report a pass.
- if (_noOfConsumers == 0 || _sendOnly)
- {
- return getExpectedNumPings(totalPingsRequested);
- }
-
- do
- {
- // Block the current thread until replies to all the messages are received, or it times out.
- perCorrelationId.trafficLight.await(timeout, TimeUnit.MILLISECONDS);
-
- // Work out how many replies were receieved.
- numReplies = getExpectedNumPings(totalPingsRequested) - (int) perCorrelationId.trafficLight.getCount();
-
- allMessagesReceived = numReplies == getExpectedNumPings(totalPingsRequested);
-
- // log.debug("numReplies = " + numReplies);
- // log.debug("allMessagesReceived = " + allMessagesReceived);
-
- // Recheck the timeout condition.
- long now = System.nanoTime();
- long lastMessageReceievedAt = perCorrelationId.timeOutStart;
- timedOut = (now - lastMessageReceievedAt) > (timeout * 1000000);
-
- // log.debug("now = " + now);
- // log.debug("lastMessageReceievedAt = " + lastMessageReceievedAt);
- }
- while (!timedOut && !allMessagesReceived);
-
- if ((numReplies < getExpectedNumPings(totalPingsRequested)) && _verbose)
- {
- log.info("Timed out (" + timeout + " ms) before all replies received on id, " + messageCorrelationId);
- }
- else if (_verbose)
- {
- log.info("Got all replies on id, " + messageCorrelationId);
- }
-
- // commitTx(_consumerSession);
-
- // log.debug("public int pingAndWaitForReply(Message message, int numPings, long timeout): ending");
-
- return numReplies;
- }
- // Ensure that the message countdown latch is always removed from the reply map. The reply map is long lived,
- // so will be a memory leak if this is not done.
- finally
- {
- // NDC.pop();
- perCorrelationIds.remove(messageCorrelationId);
- }
- }
-
- /**
- * Sends the specified number of ping messages and does not wait for correlating replies.
- *
- * @param message The message to send.
- * @param numPings The number of pings to send.
- * @param messageCorrelationId A correlation id to place on all messages sent.
- *
- * @throws JMSException All underlying JMSExceptions are allowed to fall through.
- */
- public void pingNoWaitForReply(Message message, int numPings, String messageCorrelationId) throws JMSException
- {
- /*log.debug("public void pingNoWaitForReply(Message message, int numPings = " + numPings
- + ", String messageCorrelationId = " + messageCorrelationId + "): called");*/
-
- // If we are runnning a consumeOnly test then don't send any messages
- if (_consumeOnly)
- {
- return;
- }
-
- if (message == null)
- {
- message = getTestMessage(getReplyDestinations().get(0), _messageSize, _persistent);
- }
-
- message.setJMSCorrelationID(messageCorrelationId);
-
- // Set up a committed flag to detect uncommitted messages at the end of the send loop. This may occurr if the
- // transaction batch size is not a factor of the number of pings. In which case an extra commit at the end is
- // needed.
- boolean committed = false;
-
- // Send all of the ping messages.
- for (int i = 0; i < numPings; i++)
- {
- // Re-timestamp the message.
- // message.setLongProperty(MESSAGE_TIMESTAMP_PROPNAME, System.nanoTime());
-
- // Send the message, passing in the message count.
- committed = sendMessage(i, message);
-
- // Spew out per message timings on every message sonly in verbose mode.
- /*if (_verbose)
- {
- log.info(timestampFormatter.format(new Date()) + ": Pinged at with correlation id, " + messageCorrelationId);
- }*/
- }
-
- // Call commit if the send loop finished before reaching a batch size boundary so there may still be uncommitted messages.
- if (!committed)
- {
- commitTx(_producerSession);
- }
- }
-
- /**
- * Sends the sepcified message, applies rate limiting and possibly commits the current transaction. The count of
- * messages sent so far must be specified and is used to round robin the ping destinations (where there are more
- * than one), and to determine if the transaction batch size has been reached and the sent messages should be
- * committed.
- *
- * @param i The count of messages sent so far in a loop of multiple calls to this send method.
- * @param message The message to send.
- *
- * @return <tt>true</tt> if the messages were committed, <tt>false</tt> otherwise.
- *
- * @throws JMSException All underlyiung JMSExceptions are allowed to fall through.
- */
- protected boolean sendMessage(int i, Message message) throws JMSException
- {
- try
- {
- NDC.push("id" + instanceId + "/prod");
-
- // log.debug("protected boolean sendMessage(int i = " + i + ", Message message): called");
- // log.debug("_txBatchSize = " + _txBatchSize);
-
- // Round robin the destinations as the messages are sent.
- Destination destination = _pingDestinations.get(i % _pingDestinations.size());
-
- // Prompt the user to kill the broker when doing failover testing.
- _failBeforeSend = waitForUserToPromptOnFailure(_failBeforeSend);
-
- // Get the test setup for the correlation id.
- String correlationID = message.getJMSCorrelationID();
- PerCorrelationId perCorrelationId = perCorrelationIds.get(correlationID);
-
- // If necessary, wait until the max pending message size comes within its limit.
- if (_maxPendingSize > 0)
- {
- synchronized (_sendPauseMonitor)
- {
- // Used to keep track of the number of times that send has to wait.
- int numWaits = 0;
-
- // The maximum number of waits before the test gives up and fails. This has been chosen to correspond with
- // the test timeout.
- int waitLimit = (int) (TIMEOUT_DEFAULT / 10000);
-
- while (true)
- {
- // Get the size estimate of sent but not yet received messages.
- int unreceived = _unreceived.get();
- int unreceivedSize =
- (unreceived * ((_messageSize == 0) ? 1 : _messageSize))
- / (_isPubSub ? getConsumersPerDestination() : 1);
-
- // log.debug("unreceived = " + unreceived);
- // log.debug("unreceivedSize = " + unreceivedSize);
- // log.debug("_maxPendingSize = " + _maxPendingSize);
-
- if (unreceivedSize > _maxPendingSize)
- {
- // log.debug("unreceived size estimate over limit = " + unreceivedSize);
-
- // Fail the test if the send has had to wait more than the maximum allowed number of times.
- if (numWaits > waitLimit)
- {
- String errorMessage =
- "Send has had to wait for the unreceivedSize (" + unreceivedSize
- + ") to come below the maxPendingSize (" + _maxPendingSize + ") more that " + waitLimit
- + " times.";
- log.warn(errorMessage);
- throw new RuntimeException(errorMessage);
- }
-
- // Wait on the send pause barrier for the limit to be re-established.
- try
- {
- long start = System.nanoTime();
- // _sendPauseMonitor.wait(10000);
- _sendPauseMonitor.offer(new Object(), 10000, TimeUnit.MILLISECONDS);
- long end = System.nanoTime();
-
- // Count the wait only if it was for > 99% of the requested wait time.
- if (((float) (end - start) / (float) (10000 * 1000000L)) > 0.99)
- {
- numWaits++;
- }
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted status
- Thread.currentThread().interrupt();
- throw new RuntimeException(e);
- }
- }
- else
- {
- break;
- }
- }
- }
- }
-
- // Send the message either to its round robin destination, or its default destination.
- // int num = numSent.incrementAndGet();
- // message.setIntProperty("MSG_NUM", num);
- setTimestamp(message);
-
- if (destination == null)
- {
- _producer.send(message);
- }
- else
- {
- _producer.send(destination, message);
- }
-
- // Increase the unreceived size, this may actually happen after the message is received.
- // The unreceived size is incremented by the number of consumers that will get a copy of the message,
- // in pub/sub mode.
- if (_maxPendingSize > 0)
- {
- int newUnreceivedCount = _unreceived.addAndGet(_isPubSub ? getConsumersPerDestination() : 1);
- // log.debug("newUnreceivedCount = " + newUnreceivedCount);
- }
-
- // Apply message rate throttling if a rate limit has been set up.
- if (_rateLimiter != null)
- {
- _rateLimiter.throttle();
- }
-
- // Call commit every time the commit batch size is reached.
- boolean committed = false;
-
- // Commit on every transaction batch size boundary. Here i + 1 is the count of actual messages sent.
- if (((i + 1) % _txBatchSize) == 0)
- {
- // log.debug("Trying commit on producer session.");
- committed = commitTx(_producerSession);
- }
-
- return committed;
- }
- finally
- {
- NDC.clear();
- }
- }
-
- /**
- * If the specified fail flag is set, this method waits for the user to cause a failure and then indicate to the
- * test that the failure has occurred, before the method returns.
- *
- * @param failFlag The fail flag to test.
- *
- * @return The new value for the fail flag. If the {@link #_failOnce} flag is set, then each fail flag is only
- * used once, then reset.
- */
- private boolean waitForUserToPromptOnFailure(boolean failFlag)
- {
- if (failFlag)
- {
- if (_failOnce)
- {
- failFlag = false;
- }
-
- // log.debug("Failing Before Send");
- waitForUser(KILL_BROKER_PROMPT);
- }
-
- return failFlag;
- }
-
- /**
- * Implements a single iteration of the ping loop. This sends the number of pings specified by the transaction batch
- * size property, and waits for replies to all of them. Any errors cause the publish flag to be cleared, which will
- * terminate the pinger.
- */
- public void pingLoop()
- {
- try
- {
- // Generate a sample message and time stamp it.
- Message msg = getTestMessage(_replyDestination, _messageSize, _persistent);
- // setTimestamp(msg);
-
- // Send the message and wait for a reply.
- pingAndWaitForReply(msg, TX_BATCH_SIZE_DEFAULT, TIMEOUT_DEFAULT, null);
- }
- catch (JMSException e)
- {
- _publish = false;
- // log.debug("There was a JMSException: " + e.getMessage(), e);
- }
- catch (InterruptedException e)
- {
- _publish = false;
- // log.debug("There was an interruption: " + e.getMessage(), e);
- }
- }
-
- /**
- * Sets a chained message listener. The message listener on this pinger, chains all its messages to the one set
- * here.
- *
- * @param messageListener The chained message listener.
- */
- public void setChainedMessageListener(ChainedMessageListener messageListener)
- {
- _chainedMessageListener = messageListener;
- }
-
- /** Removes any chained message listeners from this pinger. */
- public void removeChainedMessageListener()
- {
- _chainedMessageListener = null;
- }
-
- /**
- * Generates a test message of the specified size, with the specified reply-to destination and persistence flag.
- *
- * @param replyQueue The reply-to destination for the message.
- * @param messageSize The desired size of the message in bytes.
- * @param persistent <tt>true</tt> if the message should use persistent delivery, <tt>false</tt> otherwise.
- *
- * @return A freshly generated test message.
- *
- * @throws javax.jms.JMSException All underlying JMSException are allowed to fall through.
- */
- public Message getTestMessage(Destination replyQueue, int messageSize, boolean persistent) throws JMSException
- {
- // return TestMessageFactory.newObjectMessage(_producerSession, replyQueue, messageSize, persistent);
- return TestUtils.createTestMessageOfSize(_producerSession, messageSize);
- }
-
- /**
- * Sets the current time in nanoseconds as the timestamp on the message.
- *
- * @param msg The message to timestamp.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- protected void setTimestamp(Message msg) throws JMSException
- {
- /*if (((AMQSession)_producerSession).isStrictAMQP())
- {
- ((AMQMessage)msg).setTimestampProperty(new AMQShortString(MESSAGE_TIMESTAMP_PROPNAME), System.nanoTime());
- }
- else
- {*/
- msg.setLongProperty(MESSAGE_TIMESTAMP_PROPNAME, System.nanoTime());
- // }
- }
-
- /**
- * Extracts the nanosecond timestamp from a message.
- *
- * @param msg The message to extract the time stamp from.
- *
- * @return The timestamp in nanos.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- protected long getTimestamp(Message msg) throws JMSException
- {
- /*if (((AMQSession)_producerSession).isStrictAMQP())
- {
- Long value = ((AMQMessage)msg).getTimestampProperty(new AMQShortString(MESSAGE_TIMESTAMP_PROPNAME));
-
- return (value == null) ? 0L : value;
- }
- else
- {*/
- return msg.getLongProperty(PingPongProducer.MESSAGE_TIMESTAMP_PROPNAME);
- // }
- }
-
- /**
- * Stops the ping loop by clearing the publish flag. The current loop will complete when it notices that this flag
- * has been cleared.
- */
- public void stop()
- {
- _publish = false;
- }
-
- /**
- * Starts the producer and consumer connections.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- public void start() throws JMSException
- {
- // log.debug("public void start(): called");
-
- _connection.start();
- // log.debug("Producer started.");
-
- for (int i = 0; i < _noOfConsumers; i++)
- {
- _consumerConnection[i].start();
- // log.debug("Consumer " + i + " started.");
- }
- }
-
- /** Implements a ping loop that repeatedly pings until the publish flag becomes false. */
- public void run()
- {
- // Keep running until the publish flag is cleared.
- while (_publish)
- {
- pingLoop();
- }
- }
-
- /**
- * Callback method, implementing ExceptionListener. This should be registered to listen for exceptions on the
- * connection, this clears the publish flag which in turn will halt the ping loop.
- *
- * @param e The exception that triggered this callback method.
- */
- public void onException(JMSException e)
- {
- // log.debug("public void onException(JMSException e = " + e + "): called", e);
- _publish = false;
- }
-
- /**
- * Gets a shutdown hook that will cleanly shut this down when it is running the ping loop. This can be registered
- * with the runtime system as a shutdown hook.
- *
- * @return A shutdown hook for the ping loop.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- stop();
- }
- });
- }
-
- /**
- * Closes all of the producer and consumer connections.
- *
- * @throws JMSException All JMSException are allowed to fall through.
- */
- public void close() throws JMSException
- {
- // log.debug("public void close(): called");
-
- try
- {
- if (_connection != null)
- {
- // log.debug("Before close producer connection.");
- _connection.close();
- // log.debug("Closed producer connection.");
- }
-
- for (int i = 0; i < _noOfConsumers; i++)
- {
- if (_consumerConnection[i] != null)
- {
- // log.debug("Before close consumer connection " + i + ".");
- _consumerConnection[i].close();
- // log.debug("Closed consumer connection " + i + ".");
- }
- }
- }
- finally
- {
- _connection = null;
- _producerSession = null;
- _consumerSession = null;
- _consumerConnection = null;
- _producer = null;
- _consumer = null;
- _pingDestinations = null;
- _replyDestination = null;
- }
- }
-
- /**
- * Convenience method to commit the transaction on the specified controlSession. If the controlSession to commit on is not a
- * transactional controlSession, this method does nothing (unless the failover after send flag is set).
- *
- * <p/>If the {@link #_failAfterSend} flag is set, this will prompt the user to kill the broker before the commit is
- * applied. This flag applies whether the pinger is transactional or not.
- *
- * <p/>If the {@link #_failBeforeCommit} flag is set, this will prompt the user to kill the broker before the commit
- * is applied. If the {@link #_failAfterCommit} flag is set, this will prompt the user to kill the broker after the
- * commit is applied. These flags will only apply if using a transactional pinger.
- *
- * @param session The controlSession to commit
- *
- * @return <tt>true</tt> if the controlSession was committed, <tt>false</tt> if it was not.
- *
- * @throws javax.jms.JMSException If the commit fails and then the rollback fails.
- *
- * @todo Consider moving the fail after send logic into the send method. It is confusing to have it in this commit
- * method, because commits only apply to transactional pingers, but fail after send applied to transactional and
- * non-transactional alike.
- */
- protected boolean commitTx(Session session) throws JMSException
- {
- // log.debug("protected void commitTx(Session session): called");
-
- boolean committed = false;
-
- _failAfterSend = waitForUserToPromptOnFailure(_failAfterSend);
-
- if (session.getTransacted())
- {
- // log.debug("Session is transacted.");
-
- try
- {
- _failBeforeCommit = waitForUserToPromptOnFailure(_failBeforeCommit);
-
- long start = System.nanoTime();
- session.commit();
- committed = true;
- // log.debug("Time taken to commit :" + ((System.nanoTime() - start) / 1000000f) + " ms");
-
- _failAfterCommit = waitForUserToPromptOnFailure(_failAfterCommit);
-
- // log.debug("Session Commited.");
- }
- catch (JMSException e)
- {
- // log.debug("JMSException on commit:" + e.getMessage(), e);
-
- try
- {
- session.rollback();
- // log.debug("Message rolled back.");
- }
- catch (JMSException jmse)
- {
- // log.debug("JMSE on rollback:" + jmse.getMessage(), jmse);
-
- // Both commit and rollback failed. Throw the rollback exception.
- throw jmse;
- }
- }
- }
-
- return committed;
- }
-
- /**
- * Outputs a prompt to the console and waits for the user to press return.
- *
- * @param prompt The prompt to display on the console.
- */
- public void waitForUser(String prompt)
- {
- System.out.println(prompt);
-
- try
- {
- System.in.read();
- }
- catch (IOException e)
- {
- // Ignored.
- }
-
- System.out.println("Continuing.");
- }
-
- /**
- * Gets the number of consumers that are listening to each destination in the test.
- *
- * @return int The number of consumers subscribing to each topic.
- */
- public int getConsumersPerDestination()
- {
- return _noOfConsumers;
- }
-
- /**
- * Calculates how many pings are expected to be received for the given number sent.
- *
- * Note : that if you have set noConsumers to 0 then this will also return 0
- * in the case of PubSub testing. This is correct as without consumers there
- * will be no-one to receive the sent messages so they will be unable to respond.
- *
- * @param numpings The number of pings that will be sent.
- *
- * @return The number that should be received, for the test to pass.
- */
- public int getExpectedNumPings(int numpings)
- {
- // Wow, I'm freaking sorry about this return here...
- return ((_failAfterSend || _failBeforeCommit) ? numpings - 1: numpings) *
- (_isPubSub ? getConsumersPerDestination() : 1);
- }
-
- /**
- * Defines a chained message listener interface that can be attached to this pinger. Whenever this pinger's {@link
- * PingPongProducer#onMessageWithConsumerNo} method is called, the chained listener set through the {@link
- * PingPongProducer#setChainedMessageListener} method is passed the message, and the remaining expected count of
- * messages with that correlation id.
- *
- * <p/>Provided only one pinger is producing messages with that correlation id, the chained listener will always be
- * given unique message counts. It will always be called while the producer waiting for all messages to arrive is
- * still blocked.
- */
- public static interface ChainedMessageListener
- {
- /**
- * Notifies interested listeners about message arrival and important test stats, the number of messages
- * remaining in the test, and the messages send timestamp.
- *
- * @param message The newly arrived message.
- * @param remainingCount The number of messages left to complete the test.
- * @param latency The nanosecond latency of the message.
- *
- * @throws JMSException Any JMS exceptions is allowed to fall through.
- */
- public void onMessage(Message message, int remainingCount, long latency) throws JMSException;
- }
-
- /**
- * Holds information on each correlation id. The countdown latch, the current timeout timer... More stuff to be
- * added to this: read/write lock to make onMessage more concurrent as described in class header comment.
- */
- protected static class PerCorrelationId
- {
- /** Holds a countdown on number of expected messages. */
- CountDownLatch trafficLight;
-
- /** Holds the last timestamp that the timeout was reset to. */
- Long timeOutStart;
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongTestPerf.java b/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongTestPerf.java
deleted file mode 100644
index 009254c612..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongTestPerf.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.requestreply;
-
-import junit.framework.Assert;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.AsymptoticTestCase;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-
-import javax.jms.*;
-
-/**
- * PingPongTestPerf is a full round trip ping test, that has been written with the intention of being scaled up to run
- * many times simultaneously to simluate many clients/producer/connections. A full round trip ping sends a message from
- * a producer to a conumer, then the consumer replies to the message on a temporary queue.
- *
- * <p/>A single run of the test using the default JUnit test runner will result in the sending and timing of the number
- * of pings specified by the test size and time how long it takes for all of these to complete. This test may be scaled
- * up using a suitable JUnit test runner. See {@link org.apache.qpid.junit.extensions.TKTestRunner} for more
- * information on how to do this.
- *
- * <p/>The setup/teardown cycle establishes a connection to a broker and sets up a queue to send ping messages to and a
- * temporary queue for replies. This setup is only established once for all the test repeats, but each test threads
- * gets its own connection/producer/consumer, this is only re-established if the connection is lost.
- *
- * <p/>The test cycle is: Connects to a queue, creates a temporary queue, creates messages containing a property that
- * is the name of the temporary queue, fires off many messages on the original queue and waits for them all to come
- * back on the temporary queue.
- *
- * <p/>Configurable test properties: message size, transacted or not, persistent or not. Broker connection details.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * </table>
- */
-public class PingPongTestPerf extends AsymptoticTestCase
-{
- private static Logger _logger = Logger.getLogger(PingPongTestPerf.class);
-
- /** Thread local to hold the per-thread test setup fields. */
- ThreadLocal<PerThreadSetup> threadSetup = new ThreadLocal<PerThreadSetup>();
-
- // Set up a property reader to extract the test parameters from. Once ContextualProperties is available in
- // the project dependencies, use it to get property overrides for configurable tests and to notify the test runner
- // of the test parameters to log with the results. It also providers some basic type parsing convenience methods.
- // private Properties testParameters = System.getProperties();
- private ParsedProperties testParameters =
- TestContextProperties.getInstance(PingPongProducer.defaults /*System.getProperties()*/);
-
- public PingPongTestPerf(String name)
- {
- super(name);
-
- _logger.debug(testParameters);
-
- // Sets up the test parameters with defaults.
- /*testParameters.setPropertyIfNull(PingPongProducer.TX_BATCH_SIZE_PROPNAME,
- Integer.toString(PingPongProducer.TX_BATCH_SIZE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.MESSAGE_SIZE_PROPNAME,
- Integer.toString(PingPongProducer.MESSAGE_SIZE_DEAFULT));
- testParameters.setPropertyIfNull(PingPongProducer.PING_QUEUE_NAME_PROPNAME,
- PingPongProducer.PING_QUEUE_NAME_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.PERSISTENT_MODE_PROPNAME,
- Boolean.toString(PingPongProducer.PERSISTENT_MODE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.TRANSACTED_PROPNAME,
- Boolean.toString(PingPongProducer.TRANSACTED_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.BROKER_PROPNAME, PingPongProducer.BROKER_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.USERNAME_PROPNAME, PingPongProducer.USERNAME_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.PASSWORD_PROPNAME, PingPongProducer.PASSWORD_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.VIRTUAL_HOST_PROPNAME, PingPongProducer.VIRTUAL_HOST_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.VERBOSE_PROPNAME,
- Boolean.toString(PingPongProducer.VERBOSE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.RATE_PROPNAME, Integer.toString(PingPongProducer.RATE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.PUBSUB_PROPNAME,
- Boolean.toString(PingPongProducer.PUBSUB_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.TX_BATCH_SIZE_PROPNAME,
- Integer.toString(PingPongProducer.TX_BATCH_SIZE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.TIMEOUT_PROPNAME, Long.toString(PingPongProducer.TIMEOUT_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.DESTINATION_COUNT_PROPNAME,
- Integer.toString(PingPongProducer.DESTINATION_COUNT_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.FAIL_AFTER_COMMIT_PROPNAME,
- PingPongProducer.FAIL_AFTER_COMMIT_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.FAIL_BEFORE_COMMIT_PROPNAME,
- PingPongProducer.FAIL_BEFORE_COMMIT_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.FAIL_AFTER_SEND_PROPNAME,
- PingPongProducer.FAIL_AFTER_SEND_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.FAIL_BEFORE_SEND_PROPNAME,
- PingPongProducer.FAIL_BEFORE_SEND_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.FAIL_ONCE_PROPNAME, PingPongProducer.FAIL_ONCE_DEFAULT);
- testParameters.setPropertyIfNull(PingPongProducer.UNIQUE_DESTS_PROPNAME,
- Boolean.toString(PingPongProducer.UNIQUE_DESTS_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.ACK_MODE_PROPNAME,
- Integer.toString(PingPongProducer.ACK_MODE_DEFAULT));
- testParameters.setPropertyIfNull(PingPongProducer.PAUSE_AFTER_BATCH_PROPNAME,
- PingPongProducer.PAUSE_AFTER_BATCH_DEFAULT);*/
- }
-
- /**
- * Compile all the tests into a test suite.
- */
- public static Test suite()
- {
- // Build a new test suite
- TestSuite suite = new TestSuite("Ping-Pong Performance Tests");
-
- // Run performance tests in read committed mode.
- suite.addTest(new PingPongTestPerf("testPingPongOk"));
-
- return suite;
- }
-
- private static void setSystemPropertyIfNull(String propName, String propValue)
- {
- if (System.getProperty(propName) == null)
- {
- System.setProperty(propName, propValue);
- }
- }
-
- public void testPingPongOk(int numPings) throws Exception
- {
- // Get the per thread test setup to run the test through.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- // Generate a sample message. This message is already time stamped and has its reply-to destination set.
- Message msg =
- perThreadSetup._testPingProducer.getTestMessage(perThreadSetup._testPingProducer.getReplyDestinations().get(0),
- testParameters.getPropertyAsInteger(PingPongProducer.MESSAGE_SIZE_PROPNAME),
- testParameters.getPropertyAsBoolean(PingPongProducer.PERSISTENT_MODE_PROPNAME));
-
- // Send the message and wait for a reply.
- int numReplies =
- perThreadSetup._testPingProducer.pingAndWaitForReply(msg, numPings, PingPongProducer.TIMEOUT_DEFAULT, null);
-
- // Fail the test if the timeout was exceeded.
- if (numReplies != numPings)
- {
- Assert.fail("The ping timed out, got " + numReplies + " out of " + numPings);
- }
- }
-
- /**
- * Performs test fixture creation on a per thread basis. This will only be called once for each test thread.
- */
- public void threadSetUp()
- {
- try
- {
- PerThreadSetup perThreadSetup = new PerThreadSetup();
-
- // Extract the test set up paramaeters.
- String brokerDetails = testParameters.getProperty(PingPongProducer.BROKER_PROPNAME);
- String username = testParameters.getProperty(PingPongProducer.USERNAME_PROPNAME);
- String password = testParameters.getProperty(PingPongProducer.PASSWORD_PROPNAME);
- String virtualPath = testParameters.getProperty(PingPongProducer.VIRTUAL_HOST_PROPNAME);
- String destinationName = testParameters.getProperty(PingPongProducer.PING_QUEUE_NAME_PROPNAME);
- boolean persistent = testParameters.getPropertyAsBoolean(PingPongProducer.PERSISTENT_MODE_PROPNAME);
- boolean transacted = testParameters.getPropertyAsBoolean(PingPongProducer.TRANSACTED_PROPNAME);
- String selector = testParameters.getProperty(PingPongProducer.SELECTOR_PROPNAME);
- boolean verbose = testParameters.getPropertyAsBoolean(PingPongProducer.VERBOSE_PROPNAME);
- boolean pubsub = testParameters.getPropertyAsBoolean(PingPongProducer.PUBSUB_PROPNAME);
-
- synchronized (this)
- {
- // Establish a bounce back client on the ping queue to bounce back the pings.
- perThreadSetup._testPingBouncer =
- new PingPongBouncer(brokerDetails, username, password, virtualPath, destinationName, persistent,
- transacted, selector, verbose, pubsub);
-
- // Start the connections for client and producer running.
- perThreadSetup._testPingBouncer.getConnection().start();
-
- // Establish a ping-pong client on the ping queue to send the pings and receive replies with.
- perThreadSetup._testPingProducer = new PingPongProducer(testParameters);
- perThreadSetup._testPingProducer.establishConnection(true, true);
- perThreadSetup._testPingProducer.start();
- }
-
- // Attach the per-thread set to the thread.
- threadSetup.set(perThreadSetup);
- }
- catch (Exception e)
- {
- _logger.warn("There was an exception during per thread setup.", e);
- }
- }
-
- /**
- * Performs test fixture clean
- */
- public void threadTearDown()
- {
- _logger.debug("public void threadTearDown(): called");
-
- try
- {
- // Get the per thread test fixture.
- PerThreadSetup perThreadSetup = threadSetup.get();
-
- // Close the pingers so that it cleans up its connection cleanly.
- synchronized (this)
- {
- perThreadSetup._testPingProducer.close();
- // perThreadSetup._testPingBouncer.close();
- }
-
- // Ensure the per thread fixture is reclaimed.
- threadSetup.remove();
- }
- catch (JMSException e)
- {
- _logger.warn("There was an exception during per thread tear down.");
- }
- }
-
- protected static class PerThreadSetup
- {
- /**
- * Holds the test ping-pong producer.
- */
- private PingPongProducer _testPingProducer;
-
- /**
- * Holds the test ping client.
- */
- private PingPongBouncer _testPingBouncer;
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Config.java b/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Config.java
deleted file mode 100644
index d5c0979399..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Config.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.topic;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.config.ConnectorConfig;
-import org.apache.qpid.config.Connector;
-import org.apache.qpid.config.AbstractConfig;
-
-import javax.jms.Connection;
-
-public class Config extends AbstractConfig implements ConnectorConfig
-{
-
- private String host = "localhost";
- private int port = 5672;
- private String factory = null;
-
- private int payload = 256;
- private int messages = 1000;
- private int clients = 1;
- private int batch = 1;
- private long delay = 1;
- private int warmup;
- private int ackMode= AMQSession.NO_ACKNOWLEDGE;
- private String clientId;
- private String subscriptionId;
- private String selector;
- private String destinationName;
- private boolean persistent;
- private boolean transacted;
- private int destinationsCount;
- private int batchSize;
- private int rate;
- private boolean ispubsub;
- private long timeout;
-
- public Config()
- {
- }
-
- public int getAckMode()
- {
- return ackMode;
- }
-
- public void setPayload(int payload)
- {
- this.payload = payload;
- }
-
- public int getPayload()
- {
- return payload;
- }
-
- void setClients(int clients)
- {
- this.clients = clients;
- }
-
- int getClients()
- {
- return clients;
- }
-
- void setMessages(int messages)
- {
- this.messages = messages;
- }
-
- public int getMessages()
- {
- return messages;
- }
-
- public int getBatchSize()
- {
- return batchSize;
- }
-
- public int getRate()
- {
- return rate;
- }
-
- public int getDestinationsCount()
- {
- return destinationsCount;
- }
-
- public String getHost()
- {
- return host;
- }
-
- public void setHost(String host)
- {
- this.host = host;
- }
-
- public int getPort()
- {
- return port;
- }
-
- public String getFactory()
- {
- return factory;
- }
-
- public void setPort(int port)
- {
- this.port = port;
- }
-
- int getBatch()
- {
- return batch;
- }
-
- void setBatch(int batch)
- {
- this.batch = batch;
- }
-
- int getWarmup()
- {
- return warmup;
- }
-
- void setWarmup(int warmup)
- {
- this.warmup = warmup;
- }
-
- public long getDelay()
- {
- return delay;
- }
-
- public void setDelay(long delay)
- {
- this.delay = delay;
- }
-
- public long getTimeout()
- {
- return timeout;
- }
-
- public void setTimeout(long time)
- {
- this.timeout = time;
- }
-
- public String getClientId()
- {
- return clientId;
- }
-
- public String getSubscriptionId()
- {
- return subscriptionId;
- }
-
- public String getSelector()
- {
- return selector;
- }
-
- public String getDestination()
- {
- return destinationName;
- }
-
- public boolean usePersistentMessages()
- {
- return persistent;
- }
-
- public boolean isTransacted()
- {
- return transacted;
- }
-
- public boolean isPubSub()
- {
- return ispubsub;
- }
-
- public void setOption(String key, String value)
- {
- if("-host".equalsIgnoreCase(key))
- {
- setHost(value);
- }
- else if("-port".equalsIgnoreCase(key))
- {
- try
- {
- setPort(Integer.parseInt(value));
- }
- catch(NumberFormatException e)
- {
- throw new RuntimeException("Bad port number: " + value, e);
- }
- }
- else if("-payload".equalsIgnoreCase(key))
- {
- setPayload(parseInt("Bad payload size", value));
- }
- else if("-messages".equalsIgnoreCase(key))
- {
- setMessages(parseInt("Bad message count", value));
- }
- else if("-clients".equalsIgnoreCase(key))
- {
- setClients(parseInt("Bad client count", value));
- }
- else if("-batch".equalsIgnoreCase(key))
- {
- setBatch(parseInt("Bad batch count", value));
- }
- else if("-delay".equalsIgnoreCase(key))
- {
- setDelay(parseLong("Bad batch delay", value));
- }
- else if("-warmup".equalsIgnoreCase(key))
- {
- setWarmup(parseInt("Bad warmup count", value));
- }
- else if("-ack".equalsIgnoreCase(key))
- {
- ackMode = parseInt("Bad ack mode", value);
- }
- else if("-factory".equalsIgnoreCase(key))
- {
- factory = value;
- }
- else if("-clientId".equalsIgnoreCase(key))
- {
- clientId = value;
- }
- else if("-subscriptionId".equalsIgnoreCase(key))
- {
- subscriptionId = value;
- }
- else if("-persistent".equalsIgnoreCase(key))
- {
- persistent = "true".equalsIgnoreCase(value);
- }
- else if("-transacted".equalsIgnoreCase(key))
- {
- transacted = "true".equalsIgnoreCase(value);
- }
- else if ("-destinationscount".equalsIgnoreCase(key))
- {
- destinationsCount = parseInt("Bad destinations count", value);
- }
- else if ("-batchsize".equalsIgnoreCase(key))
- {
- batchSize = parseInt("Bad batch size", value);
- }
- else if ("-rate".equalsIgnoreCase(key))
- {
- rate = parseInt("MEssage rate", value);
- }
- else if("-pubsub".equalsIgnoreCase(key))
- {
- ispubsub = "true".equalsIgnoreCase(value);
- }
- else if("-selector".equalsIgnoreCase(key))
- {
- selector = value;
- }
- else if("-destinationname".equalsIgnoreCase(key))
- {
- destinationName = value;
- }
- else if("-timeout".equalsIgnoreCase(key))
- {
- setTimeout(parseLong("Bad timeout data", value));
- }
- else
- {
- System.out.println("Ignoring unrecognised option: " + key);
- }
- }
-
- static String getAckModeDescription(int ackMode)
- {
- switch(ackMode)
- {
- case AMQSession.NO_ACKNOWLEDGE: return "NO_ACKNOWLEDGE";
- case AMQSession.AUTO_ACKNOWLEDGE: return "AUTO_ACKNOWLEDGE";
- case AMQSession.CLIENT_ACKNOWLEDGE: return "CLIENT_ACKNOWLEDGE";
- case AMQSession.DUPS_OK_ACKNOWLEDGE: return "DUPS_OK_ACKNOWELDGE";
- case AMQSession.PRE_ACKNOWLEDGE: return "PRE_ACKNOWLEDGE";
- }
- return "AckMode=" + ackMode;
- }
-
- public Connection createConnection() throws Exception
- {
- return new Connector().createConnection(this);
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Listener.java b/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Listener.java
deleted file mode 100644
index 6dcea42bfe..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Listener.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.topic;
-
-import java.util.Random;
-
-import javax.jms.*;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.NDC;
-
-import org.apache.qpid.client.AMQConnection;
-import org.apache.qpid.client.AMQQueue;
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.client.AMQTopic;
-import org.apache.qpid.exchange.ExchangeDefaults;
-
-/**
- * This class has not kept up to date with the topic_listener in the cpp tests. It should provide identical behaviour for
- * cross testing the java and cpp clients.
- *
- * <p/>How the cpp topic_publisher operates:
- * It publishes text messages to the default topic exchange, on virtual host "/test", on the topic "topic_control", for
- * the specified number of test messages to be sent.
- * It publishes a report request message (on same topic), with the header text field "TYPE", value "REPORT_REQUEST",
- * optionally within a transaction, and waits for the specified number of consumers to reply to this request. The
- * listeners should reply to this message on a queue named "response", on virtual host "/test", with some sort of message
- * about the number of messages received and how long it took, although the publisher never looks at the message content.
- * The publisher then send a message (on the same topic), with the header text field "TYPE", value "TERMINATION_REQUEST",
- * which the listener should close its connection and terminate upon receipt of.
- *
- * @todo I've added lots of field table types in the report message, just to check if the other end can decode them
- * correctly. Not really the right place to test this, so remove them from
- * {@link #createReportResponseMessage(String)} once a better test exists.
- */
-public class Listener implements MessageListener
-{
- private static Logger log = Logger.getLogger(Listener.class);
-
- public static final String CONTROL_TOPIC = "topic_control";
- public static final String RESPONSE_QUEUE = "response";
-
- private final Topic _topic;
- //private final Topic _control;
-
- private final Queue _response;
-
- /** Holds the connection to listen on. */
- private final Connection _connection;
-
- /** Holds the producer to send control messages on. */
- private final MessageProducer _controller;
-
- /** Holds the JMS session. */
- private final javax.jms.Session _session;
-
- /** Holds a flag to indicate that a timer has begun on the first message. Reset when report is sent. */
- private boolean init;
-
- /** Holds the count of messages received by this listener. */
- private int count;
-
- /** Used to hold the start time of the first message. */
- private long start;
- private static String clientId;
-
- Listener(Connection connection, int ackMode, String name) throws Exception
- {
- log.debug("Listener(Connection connection = " + connection + ", int ackMode = " + ackMode + ", String name = " + name
- + "): called");
-
- _connection = connection;
- _session = connection.createSession(false, ackMode);
-
- if (_session instanceof AMQSession)
- {
- _topic = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, CONTROL_TOPIC);
- //_control = new AMQTopic(CONTROL_TOPIC);
- _response = new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, RESPONSE_QUEUE);
- }
- else
- {
- _topic = _session.createTopic(CONTROL_TOPIC);
- //_control = _session.createTopic(CONTROL_TOPIC);
- _response = _session.createQueue(RESPONSE_QUEUE);
- }
-
- //register for events
- if (name == null)
- {
- log.debug("Calling _factory.createTopicConsumer().setMessageListener(this)");
- createTopicConsumer().setMessageListener(this);
- }
- else
- {
- log.debug("Calling createDurableTopicConsumer(name).setMessageListener(this)");
- createDurableTopicConsumer(name).setMessageListener(this);
- }
-
- _connection.start();
-
- _controller = createControlPublisher();
- System.out.println("Waiting for messages " + Config.getAckModeDescription(ackMode)
- +
- ((name == null)
- ? "" : (" (subscribed with name " + name + " and client id " + connection.getClientID() + ")"))
- + "...");
- }
-
- public static void main(String[] argv) throws Exception
- {
- clientId = "Listener-" + System.currentTimeMillis();
-
- NDC.push(clientId);
-
- Config config = new Config();
- config.setOptions(argv);
-
- //Connection con = config.createConnection();
- Connection con =
- new AMQConnection("amqp://guest:guest@testid/test?brokerlist='" + config.getHost() + ":" + config.getPort()
- + "'");
-
- if (config.getClientId() != null)
- {
- con.setClientID(config.getClientId());
- }
-
- new Listener(con, config.getAckMode(), config.getSubscriptionId());
-
- NDC.pop();
- NDC.remove();
- }
-
- /**
- * Checks whether or not a text field on a message has the specified value.
- *
- * @param m The message to check.
- * @param fieldName The name of the field to check.
- * @param value The expected value of the field to compare with.
- *
- * @return <tt>true</tt>If the specified field has the specified value, <tt>fals</tt> otherwise.
- *
- * @throws JMSException Any JMSExceptions are allowed to fall through.
- */
- private static boolean checkTextField(Message m, String fieldName, String value) throws JMSException
- {
- log.debug("private static boolean checkTextField(Message m = " + m + ", String fieldName = " + fieldName
- + ", String value = " + value + "): called");
-
- String comp = m.getStringProperty(fieldName);
- log.debug("comp = " + comp);
-
- boolean result = (comp != null) && comp.equals(value);
- log.debug("result = " + result);
-
- return result;
- }
-
- public void onMessage(Message message)
- {
- NDC.push(clientId);
-
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- if (!init)
- {
- start = System.nanoTime() / 1000000;
- count = 0;
- init = true;
- }
-
- try
- {
- if (isShutdown(message))
- {
- log.debug("Got a shutdown message.");
- shutdown();
- }
- else if (isReport(message))
- {
- log.debug("Got a report request message.");
-
- // Send the report.
- report();
- init = false;
- }
- }
- catch (JMSException e)
- {
- log.warn("There was a JMSException during onMessage.", e);
- }
- finally
- {
- NDC.pop();
- }
- }
-
- Message createReportResponseMessage(String msg) throws JMSException
- {
- Message message = _session.createTextMessage(msg);
-
- // Shove some more field table type in the message just to see if the other end can handle it.
- message.setBooleanProperty("BOOLEAN", true);
- message.setByteProperty("BYTE", (byte) 5);
- message.setDoubleProperty("DOUBLE", Math.PI);
- message.setFloatProperty("FLOAT", 1.0f);
- message.setIntProperty("INT", 1);
- message.setShortProperty("SHORT", (short) 1);
- message.setLongProperty("LONG", (long) 1827361278);
- message.setStringProperty("STRING", "hello");
-
- return message;
- }
-
- boolean isShutdown(Message m) throws JMSException
- {
- boolean result = checkTextField(m, "TYPE", "TERMINATION_REQUEST");
-
- //log.debug("isShutdown = " + result);
-
- return result;
- }
-
- boolean isReport(Message m) throws JMSException
- {
- boolean result = checkTextField(m, "TYPE", "REPORT_REQUEST");
-
- //log.debug("isReport = " + result);
-
- return result;
- }
-
- MessageConsumer createTopicConsumer() throws Exception
- {
- return _session.createConsumer(_topic);
- }
-
- MessageConsumer createDurableTopicConsumer(String name) throws Exception
- {
- return _session.createDurableSubscriber(_topic, name);
- }
-
- MessageProducer createControlPublisher() throws Exception
- {
- return _session.createProducer(_response);
- }
-
- private void shutdown()
- {
- try
- {
- _session.close();
- _connection.stop();
- _connection.close();
- }
- catch (Exception e)
- {
- e.printStackTrace(System.out);
- }
- }
-
- private void report()
- {
- log.debug("private void report(): called");
-
- try
- {
- String msg = getReport();
- _controller.send(createReportResponseMessage(msg));
- log.debug("Sent report: " + msg);
- }
- catch (Exception e)
- {
- e.printStackTrace(System.out);
- }
- }
-
- private String getReport()
- {
- long time = ((System.nanoTime() / 1000000) - start);
-
- return "Received " + count + " in " + time + "ms";
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/MessageFactory.java b/qpid/java/perftests/src/main/java/org/apache/qpid/topic/MessageFactory.java
deleted file mode 100644
index 4efdc1cb56..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/MessageFactory.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.topic;
-
-import javax.jms.*;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.client.AMQTopic;
-import org.apache.qpid.exchange.ExchangeDefaults;
-
-/**
- */
-class MessageFactory
-{
- private static final char[] DATA = "abcdefghijklmnopqrstuvwxyz".toCharArray();
-
- private final Session _session;
- private final Topic _topic;
- private final Topic _control;
- private final byte[] _payload;
-
- MessageFactory(Session session) throws JMSException
- {
- this(session, 256);
- }
-
- MessageFactory(Session session, int size) throws JMSException
- {
- _session = session;
- if (session instanceof AMQSession)
- {
- _topic = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, "topic_control");
- _control = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, "topictest.control");
- }
- else
- {
- _topic = session.createTopic("topic_control");
- _control = session.createTopic("topictest.control");
- }
-
- _payload = new byte[size];
-
- for (int i = 0; i < size; i++)
- {
- _payload[i] = (byte) DATA[i % DATA.length];
- }
- }
-
- private static boolean checkText(Message m, String s)
- {
- try
- {
- return (m instanceof TextMessage) && ((TextMessage) m).getText().equals(s);
- }
- catch (JMSException e)
- {
- e.printStackTrace(System.out);
-
- return false;
- }
- }
-
- Topic getTopic()
- {
- return _topic;
- }
-
- Message createEventMessage() throws JMSException
- {
- BytesMessage msg = _session.createBytesMessage();
- msg.writeBytes(_payload);
-
- return msg;
- }
-
- Message createShutdownMessage() throws JMSException
- {
- return _session.createTextMessage("SHUTDOWN");
- }
-
- Message createReportRequestMessage() throws JMSException
- {
- return _session.createTextMessage("REPORT");
- }
-
- Message createReportResponseMessage(String msg) throws JMSException
- {
- return _session.createTextMessage(msg);
- }
-
- boolean isShutdown(Message m)
- {
- return checkText(m, "SHUTDOWN");
- }
-
- boolean isReport(Message m)
- {
- return checkText(m, "REPORT");
- }
-
- Object getReport(Message m)
- {
- try
- {
- return ((TextMessage) m).getText();
- }
- catch (JMSException e)
- {
- e.printStackTrace(System.out);
-
- return e.toString();
- }
- }
-
- MessageConsumer createTopicConsumer() throws Exception
- {
- return _session.createConsumer(_topic);
- }
-
- MessageConsumer createDurableTopicConsumer(String name) throws Exception
- {
- return _session.createDurableSubscriber(_topic, name);
- }
-
- MessageConsumer createControlConsumer() throws Exception
- {
- return _session.createConsumer(_control);
- }
-
- MessageProducer createTopicPublisher() throws Exception
- {
- return _session.createProducer(_topic);
- }
-
- MessageProducer createControlPublisher() throws Exception
- {
- return _session.createProducer(_control);
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Publisher.java b/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Publisher.java
deleted file mode 100644
index c3b19b558a..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/Publisher.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.topic;
-
-import javax.jms.*;
-
-public class Publisher implements MessageListener
-{
- private final Object _lock = new Object();
- private final Connection _connection;
- private final Session _session;
- private final MessageFactory _factory;
- private final MessageProducer _publisher;
- private int _count;
-
- Publisher(Connection connection, int size, int ackMode, boolean persistent) throws Exception
- {
- _connection = connection;
- _session = _connection.createSession(false, ackMode);
- _factory = new MessageFactory(_session, size);
- _publisher = _factory.createTopicPublisher();
- _publisher.setDeliveryMode(persistent ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
- System.out.println("Publishing " + (persistent ? "persistent" : "non-persistent") + " messages of " + size + " bytes, " + Config.getAckModeDescription(ackMode) + ".");
- }
-
- private void test(Config config) throws Exception
- {
- test(config.getBatch(), config.getDelay(), config.getMessages(), config.getClients(), config.getWarmup());
- }
-
- private void test(int batches, long delay, int msgCount, int consumerCount, int warmup) throws Exception
- {
- _factory.createControlConsumer().setMessageListener(this);
- _connection.start();
-
- if (warmup > 0)
- {
- System.out.println("Runing warmup (" + warmup + " msgs)");
- long time = batch(warmup, consumerCount);
- System.out.println("Warmup completed in " + time + "ms");
- }
-
- long[] times = new long[batches];
- for (int i = 0; i < batches; i++)
- {
- if (i > 0)
- {
- Thread.sleep(delay * 1000);
- }
- times[i] = batch(msgCount, consumerCount);
- System.out.println("Batch " + (i + 1) + " of " + batches + " completed in " + times[i] + " ms.");
- }
-
- long min = min(times);
- long max = max(times);
- System.out.println("min: " + min + ", max: " + max + " avg: " + avg(times, min, max));
-
- //request shutdown
- _publisher.send(_factory.createShutdownMessage());
-
- _connection.stop();
- _connection.close();
- }
-
- private long batch(int msgCount, int consumerCount) throws Exception
- {
- _count = consumerCount;
- long start = System.currentTimeMillis();
- publish(msgCount);
- waitForCompletion(consumerCount);
- return System.currentTimeMillis() - start;
- }
-
- private void publish(int count) throws Exception
- {
-
- //send events
- for (int i = 0; i < count; i++)
- {
- _publisher.send(_factory.createEventMessage());
- if ((i + 1) % 100 == 0)
- {
- System.out.println("Sent " + (i + 1) + " messages");
- }
- }
-
- //request report
- _publisher.send(_factory.createReportRequestMessage());
- }
-
- private void waitForCompletion(int consumers) throws Exception
- {
- System.out.println("Waiting for completion...");
- synchronized (_lock)
- {
- while (_count > 0)
- {
- _lock.wait();
- }
- }
- }
-
-
- public void onMessage(Message message)
- {
- System.out.println("Received report " + _factory.getReport(message) + " " + --_count + " remaining");
- if (_count == 0)
- {
- synchronized (_lock)
- {
- _lock.notify();
- }
- }
- }
-
- static long min(long[] times)
- {
- long min = times.length > 0 ? times[0] : 0;
- for (int i = 0; i < times.length; i++)
- {
- min = Math.min(min, times[i]);
- }
- return min;
- }
-
- static long max(long[] times)
- {
- long max = times.length > 0 ? times[0] : 0;
- for (int i = 0; i < times.length; i++)
- {
- max = Math.max(max, times[i]);
- }
- return max;
- }
-
- static long avg(long[] times, long min, long max)
- {
- long sum = 0;
- for (int i = 0; i < times.length; i++)
- {
- sum += times[i];
- }
-
- int adjustment = 0;
-
- // Remove min and max if we have run enough batches.
- if (times.length > 2)
- {
- sum -= min;
- sum -= max;
- adjustment = 2;
- }
-
- return (sum / (times.length - adjustment));
- }
-
- public static void main(String[] argv) throws Exception
- {
- Config config = new Config();
- config.setOptions(argv);
-
- Connection con = config.createConnection();
- int size = config.getPayload();
- int ackMode = config.getAckMode();
- boolean persistent = config.usePersistentMessages();
- new Publisher(con, size, ackMode, persistent).test(config);
- }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/TopicWithSelectorsTransientVolumeTest.java b/qpid/java/perftests/src/main/java/org/apache/qpid/topic/TopicWithSelectorsTransientVolumeTest.java
deleted file mode 100644
index 1d6ec07bb0..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/TopicWithSelectorsTransientVolumeTest.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.topic;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import javax.jms.BytesMessage;
-import javax.jms.DeliveryMode;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import javax.jms.Topic;
-import javax.jms.TopicConnection;
-import javax.jms.TopicPublisher;
-import javax.jms.TopicSession;
-import javax.jms.TopicSubscriber;
-import javax.naming.NamingException;
-
-import org.apache.qpid.AMQException;
-import org.apache.qpid.client.AMQQueue;
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.client.AMQTopic;
-import org.apache.qpid.exchange.ExchangeDefaults;
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-public class TopicWithSelectorsTransientVolumeTest extends QpidBrokerTestCase
-{
- private static final int NUM_MSG_PER_ITERATION = 50;//must be a multiple of 10
- private static final int NUM_ITERATIONS = 1000;
-
- private static final int NUM_CONSUMERS = 50;
- private static final int MSG_SIZE = 1024;
- private static final byte[] BYTE_ARRAY = new byte[MSG_SIZE];
-
- private ArrayList<MyMessageSubscriber> _subscribers = new ArrayList<MyMessageSubscriber>();
- private HashMap<String,Long> _queueMsgCounts = new HashMap<String,Long>();
-
- private final static Object _lock=new Object();
- private boolean _producerFailed;
- private static int _finishedCount;
- private static int _failedCount;
-
- protected void setUp() throws Exception
- {
- super.setUp();
- init();
- }
-
- protected void tearDown() throws Exception
- {
- super.tearDown();
- }
-
- private void init()
- {
- _finishedCount = 0;
- _failedCount = 0;
- _producerFailed = false;
- _subscribers.clear();
- _queueMsgCounts.clear();
- }
-
-
- private Message createMessage(Session session) throws JMSException
- {
- BytesMessage message = session.createBytesMessage();
- message.writeBytes(BYTE_ARRAY);
-
- return message;
- }
-
- /**
- * 1 Topic with 50 subscribers using a selector, and 1 producer sending 50,000 1K messages with 90% selector success ratio.
- */
- public void test50SubscribersWith90PercentMatched() throws Exception
- {
- Topic topic = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, "test50ConsumersWith10PercentUnmatched");
-
- System.out.println("Creating consumers");
-
- MyMessageSubscriber sub;
-
- for(int i=1; i <= NUM_CONSUMERS; i++)
- {
- sub = new MyMessageSubscriber(topic, "consumer" + i, ((9 * NUM_MSG_PER_ITERATION * NUM_ITERATIONS) / 10));
- _subscribers.add(sub);
- }
-
- System.out.println("Starting consumers");
- for(MyMessageSubscriber s: _subscribers)
- {
- Thread consumer = new Thread(s);
- consumer.start();
- }
-
- System.out.println("Creating producer");
- MyMessageProducer prod = new MyMessageProducer(topic);
-
- long startTime = System.currentTimeMillis();
-
- System.out.println("Starting producer");
- Thread producer = new Thread(prod);
- producer.start();
-
-
- // Wait for all the messageConsumers to have finished or failed
- synchronized (_lock)
- {
- while (_finishedCount + _failedCount < NUM_CONSUMERS)
- {
- try
- {
- _lock.wait();
- }
- catch (InterruptedException e)
- {
- //ignore
- }
- }
- }
-
- long endTime = System.currentTimeMillis();
- System.out.println("Elapsed time for messaging: " + (endTime-startTime) + "ms");
-
- assertFalse("Producer failed to send all messages", _producerFailed);
-
- //check if all messages received by consumers, or if there were failures
- if (_finishedCount != NUM_CONSUMERS)
- {
- fail(_failedCount + " consumers did not recieve all their expected messages");
- }
-
- //check if all queue depths were 0
- for(String consumer: _queueMsgCounts.keySet())
- {
- long depth = _queueMsgCounts.get(consumer);
- assertEquals(consumer + " subscription queue msg count was not 0", 0, depth);
- }
-
- }
-
- private class MyMessageProducer implements Runnable
- {
- private TopicConnection _connection;
- private TopicSession _session;
- private TopicPublisher _messagePublisher;
-
- public MyMessageProducer(Topic topic) throws JMSException, NamingException
- {
- _connection = (TopicConnection) getConnection();
- _session = (TopicSession) _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- _messagePublisher = _session.createPublisher(topic);
- }
-
- public void run()
- {
- try
- {
- for(int iter = 0; iter < NUM_ITERATIONS; iter++)
- {
- int i = 0;
-
- //send 90% matching messages
- for (; i < (9 * NUM_MSG_PER_ITERATION)/10; i++)
- {
- Message message = createMessage(_session);
- message.setStringProperty("testprop", "true");
-
- _messagePublisher.publish(message, DeliveryMode.NON_PERSISTENT,
- Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
-
- Thread.yield();
- }
-
- //send remaining 10% non-matching messages
- for (; i < NUM_MSG_PER_ITERATION; i++)
- {
- Message message = _session.createMessage();
- message.setStringProperty("testprop", "false");
-
- _messagePublisher.publish(message, DeliveryMode.NON_PERSISTENT,
- Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
-
- Thread.yield();
- }
- }
-
- }
- catch (Exception exp)
- {
- System.out.println("producer: caught an exception, probably exiting before all messages sent");
- exp.printStackTrace();
- synchronized (_lock)
- {
- _producerFailed=true;
- _lock.notifyAll();
- }
- }
- }
- }
-
-
- private class MyMessageSubscriber implements Runnable
- {
- /* The topic this subscriber is subscribing to */
- private Topic _topic;
- private String _consumerName;
- private int _outstandingMsgCount;
- private TopicConnection _connection;
- private TopicSession _session;
- private TopicSubscriber _durSub;
-
- public MyMessageSubscriber(Topic topic, String consumerName, int messageCount) throws JMSException, NamingException
- {
- _outstandingMsgCount = messageCount;
- _topic=topic;
- _consumerName = consumerName;
- _connection = (TopicConnection) getConnection();
- _session = (TopicSession) _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- _durSub = _session.createDurableSubscriber(_topic, _consumerName,"testprop='true'", false);
- _connection.start();
- }
-
- public void run()
- {
-
- boolean failed = false;
- do
- {
- Message m = null;
- try
- {
- m = _durSub.receive(10000);
- }
- catch (JMSException exp)
- {
- System.out.println(_consumerName + ": caught an exception handling a received message");
- exp.printStackTrace();
-
- failed = true;
- break;
- }
-
- Thread.yield();
-
- _outstandingMsgCount--;
-
- if(_outstandingMsgCount % 500 == 0)
- {
- System.out.println(_consumerName + ": outstanding message count: " + _outstandingMsgCount);
- }
-
- if(m == null)
- {
- if(_outstandingMsgCount != 0)
- {
- failed = true;
- }
- break;
- }
- }
- while(_outstandingMsgCount > 0);
-
- System.out.println(_consumerName + ": outstanding message count: " + _outstandingMsgCount);
-
- try
- {
- AMQQueue subcriptionQueue = new AMQQueue(ExchangeDefaults.TOPIC_EXCHANGE_NAME,"clientid" + ":" + _consumerName);
-
- ((AMQSession)_session).sync();
- Long depth = ((AMQSession)_session).getQueueDepth(subcriptionQueue);
- _queueMsgCounts.put(_consumerName, depth);
-
- System.out.println(_consumerName + ": completion queue msg count: " + depth);
- }
- catch (AMQException exp)
- {
- System.out.println(_consumerName + ": caught an exception determining completion queue depth");
- exp.printStackTrace();
- }
- finally
- {
- try
- {
- _session.unsubscribe(_consumerName);
- }
- catch (JMSException e)
- {
- System.out.println(_consumerName + ": caught an exception whilst unsubscribing");
- e.printStackTrace();
- }
- }
-
- synchronized (_lock)
- {
- if (_outstandingMsgCount == 0 && !failed)
- {
- _finishedCount++;
- System.out.println(_consumerName + ": finished");
- }
- else
- {
- _failedCount++;
- System.out.println(_consumerName + ": failed");
- }
- _lock.notifyAll();
- }
-
- }
- }
-
- //helper method to allow easily running against an external standalone broker
-// public static void main(String[] args) throws Exception
-// {
-// System.setProperty("broker.config", "/dev/null");
-// System.setProperty("broker", "external");
-// System.setProperty("java.naming.factory.initial", "org.apache.qpid.jndi.PropertiesFileInitialContextFactory");
-// System.setProperty("java.naming.provider.url", "test-profiles/test-provider.properties");
-//
-// TopicWithSelectorsTransientVolumeTest test = new TopicWithSelectorsTransientVolumeTest();
-// test.init();
-// test.test50SubscribersWith90PercentMatched();
-// test.tearDown();
-// }
-}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/topicselectors.properties b/qpid/java/perftests/src/main/java/org/apache/qpid/topic/topicselectors.properties
deleted file mode 100644
index 1f572af58a..0000000000
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/topic/topicselectors.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
-
-
-# register some connection factories
-# connectionfactory.[jndiname] = [ConnectionURL]
-connectionfactory.default = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672' \ No newline at end of file
diff --git a/qpid/java/perftests/src/main/resources/perftests.properties b/qpid/java/perftests/src/main/resources/perftests.properties
new file mode 100644
index 0000000000..d8823f9dc5
--- /dev/null
+++ b/qpid/java/perftests/src/main/resources/perftests.properties
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+connectionfactory.connectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:5672'
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ArgumentParserTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ArgumentParserTest.java
new file mode 100644
index 0000000000..3be82627fe
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ArgumentParserTest.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class ArgumentParserTest extends QpidTestCase
+{
+ private static final String TEST_CONFIG_FILENAME = "ControllerRunnerTest-test-config-filename.json";
+ private static final String JNDI_CONFIG_FILENAME = "ControllerRunnerTest-jndi-config-filename.properties";
+ private static final String DISTRIBUTED_MODE = "true";
+
+ public static final String TEST_CONFIG_PROP = "test-config";
+ public static final String JNDI_CONFIG_PROP = "jndi-config";
+ public static final String DISTRIBUTED_PROP = "distributed";
+
+ public static final String TEST_CONFIG_DEFAULT = "perftests-config.json";
+ public static final String JNDI_CONFIG_DEFAULT = "perftests-jndi.properties";
+ public static final String DISTRIBUTED_DEFAULT = "false";
+
+ private Map<String,String> _options = new HashMap<String, String>();
+
+ private ArgumentParser _parser;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _parser = new ArgumentParser();
+
+ _options.clear();
+ _options.put(TEST_CONFIG_PROP, TEST_CONFIG_DEFAULT);
+ _options.put(JNDI_CONFIG_PROP, JNDI_CONFIG_DEFAULT);
+ _options.put(DISTRIBUTED_PROP, DISTRIBUTED_DEFAULT);
+ }
+
+ public void testInvalidArguments()
+ {
+ String[] args = new String[]{"nonExistentConfigProperty" + "=" + TEST_CONFIG_FILENAME};
+
+ try
+ {
+ _parser.parseArgumentsIntoConfig(_options, args);
+ fail("expected exception to be thrown due to provision of a non existent config property");
+ }
+ catch(IllegalArgumentException e)
+ {
+ //expected
+ }
+ }
+
+ public void testDefaultConfigValues()
+ {
+ String[] args = new String[0];
+
+ _parser.parseArgumentsIntoConfig(_options, args);
+
+ assertEquals("unexpected config value", TEST_CONFIG_DEFAULT, _options.get(TEST_CONFIG_PROP));
+ assertEquals("unexpected config value", JNDI_CONFIG_DEFAULT, _options.get(JNDI_CONFIG_PROP));
+ assertEquals("unexpected config value", DISTRIBUTED_DEFAULT, _options.get(DISTRIBUTED_PROP));
+ }
+
+ public void testConfigurationParsingOverridesDefault() throws Exception
+ {
+ String[] args = new String[]{TEST_CONFIG_PROP + "=" + TEST_CONFIG_FILENAME,
+ JNDI_CONFIG_PROP + "=" + JNDI_CONFIG_FILENAME,
+ DISTRIBUTED_PROP + "=" + DISTRIBUTED_MODE};
+
+ _parser.parseArgumentsIntoConfig(_options, args);
+
+ assertEquals("unexpected config value", TEST_CONFIG_FILENAME, _options.get(TEST_CONFIG_PROP));
+ assertEquals("unexpected config value", JNDI_CONFIG_FILENAME, _options.get(JNDI_CONFIG_PROP));
+ assertEquals("unexpected config value", DISTRIBUTED_MODE, _options.get(DISTRIBUTED_PROP));
+ assertFalse("override value was the same as the default", DISTRIBUTED_MODE.equalsIgnoreCase(_options.get(DISTRIBUTED_DEFAULT)));
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ConfigFileHelper.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ConfigFileHelper.java
new file mode 100644
index 0000000000..12ba3b56ad
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ConfigFileHelper.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.controller.config.ConfigReader;
+
+public class ConfigFileHelper
+{
+ public static Reader getConfigFileReader(Class<?> testClass, String resourceName)
+ {
+ InputStream inputStream = testClass.getResourceAsStream(resourceName);
+ if(inputStream == null)
+ {
+ throw new RuntimeException("Can't find resource " + resourceName + " using classloader of class " + testClass);
+ }
+ Reader reader = new InputStreamReader(inputStream);
+ return reader;
+ }
+
+ public static Config getConfigFromResource(Class<?> testClass, String resourceName)
+ {
+ ConfigReader configReader = new ConfigReader();
+ Config config = configReader.readConfig(getConfigFileReader(testClass, resourceName));
+ return config;
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/VisitorTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/VisitorTest.java
new file mode 100644
index 0000000000..320e7d8c9d
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/VisitorTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.Command;
+
+
+public class VisitorTest extends TestCase
+{
+
+ public void testStringVisited() throws Exception
+ {
+ Object argument = new String();
+
+ TestVisitor visitor = new TestVisitor();
+ visitor.visit(argument);
+
+ assertSame(argument, visitor._string);
+ }
+
+ public void testCommandVisited() throws Exception
+ {
+ Object argument = new TestCommand();
+
+ TestVisitor visitor = new TestVisitor();
+ visitor.visit(argument);
+
+ assertSame(argument, visitor._testCommand);
+ }
+
+ public void testNoVisitIntegerImplementatiom() throws Exception
+ {
+ Integer argument = Integer.valueOf(1);
+
+ TestVisitor visitor = new TestVisitor();
+
+ try
+ {
+ visitor.visit(argument);
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ assertNotNull(e.getCause());
+ assertEquals(NoSuchMethodException.class, e.getCause().getClass());
+ }
+ }
+
+ class TestVisitor extends Visitor
+ {
+ String _string = null;
+ TestCommand _testCommand = null;
+
+ public void visit(String string)
+ {
+ _string = string;
+ }
+
+ public void visit(TestCommand command)
+ {
+ _testCommand = command;
+ }
+ }
+
+ class TestCommand extends Command
+ {
+
+ public TestCommand()
+ {
+ super(null);
+ }
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientCommandVisitorTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientCommandVisitorTest.java
new file mode 100644
index 0000000000..4a82f6719f
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientCommandVisitorTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+
+public class ClientCommandVisitorTest extends TestCase
+{
+ private Client _client;
+ private ClientCommandVisitor _visitor;
+ private ClientJmsDelegate _delegate;
+
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _client = mock(Client.class);
+ _delegate = mock(ClientJmsDelegate.class);
+ _visitor = new ClientCommandVisitor(_client, _delegate);
+ }
+
+ public void testStopClient()
+ {
+ StopClientCommand command = new StopClientCommand();
+ _visitor.visit(command);
+ verify(_client).stop();
+ }
+
+ public void testCreateConnection() throws Exception
+ {
+ final CreateConnectionCommand command = new CreateConnectionCommand();
+ _visitor.visit(command);
+ verify(_delegate).createConnection(command);
+ }
+
+ public void testCreateSession() throws Exception
+ {
+ final CreateSessionCommand command = new CreateSessionCommand();
+ _visitor.visit(command);
+ verify(_delegate).createSession(command);
+ }
+
+ public void testCreateProducer() throws Exception
+ {
+ final CreateProducerCommand command = new CreateProducerCommand();
+ _visitor.visit(command);
+ verify(_delegate).createProducer(command);
+ }
+
+ public void testCreateConsumer() throws Exception
+ {
+ final CreateConsumerCommand command = new CreateConsumerCommand();
+ _visitor.visit(command);
+ verify(_delegate).createConsumer(command);
+ }
+
+ public void testStartTest() throws Exception
+ {
+ final StartTestCommand command = new StartTestCommand();
+ _visitor.visit(command);
+ verify(_client).startTest();
+ }
+
+ public void testStopTest() throws Exception
+ {
+ final TearDownTestCommand stopCommand = new TearDownTestCommand();
+ _visitor.visit(stopCommand);
+ verify(_client).tearDownTest();
+ }
+
+ public void testCreateMessageProvider() throws Exception
+ {
+ final CreateMessageProviderCommand command = new CreateMessageProviderCommand();
+ command.setProviderName("test");
+ _visitor.visit(command);
+ verify(_delegate).createMessageProvider(command);
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientTest.java
new file mode 100644
index 0000000000..198baa6ef4
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ClientTest.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Collections;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.mockito.InOrder;
+import org.mockito.Mockito;
+
+public class ClientTest extends TestCase
+{
+ private Client _client;
+ private ClientJmsDelegate _delegate;
+ private ClientCommandVisitor _visitor;
+ private ParticipantExecutor _participant;
+ private ParticipantExecutorRegistry _participantRegistry;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _delegate = mock(ClientJmsDelegate.class);
+ _visitor = mock(ClientCommandVisitor.class);
+ _client = new Client(_delegate);
+ _client.setClientCommandVisitor(_visitor);
+ _participant = mock(ParticipantExecutor.class);
+ when(_participant.getParticipantName()).thenReturn("testParticipantMock");
+
+ _participantRegistry = mock(ParticipantExecutorRegistry.class);
+ when(_participantRegistry.executors()).thenReturn(Collections.singletonList(_participant));
+ _client.setParticipantRegistry(_participantRegistry);
+ }
+
+ public void testInitialState() throws Exception
+ {
+ assertEquals("Expected client to be in CREATED state", ClientState.CREATED, _client.getState());
+ }
+
+ public void testStart() throws Exception
+ {
+ _client.start();
+ final InOrder inOrder = inOrder(_delegate);
+ inOrder.verify(_delegate).setInstructionListener(_client);
+ inOrder.verify(_delegate).sendRegistrationMessage();
+ assertEquals("Expected client to be in STARTED state", ClientState.READY, _client.getState());
+ }
+
+ public void testStopClient() throws Exception
+ {
+ _client.stop();
+
+ assertEquals("Expected client to be in STOPPED state", ClientState.STOPPED, _client.getState());
+ }
+
+ public void testProcessInstructionVisitsCommandAndResponds() throws Exception
+ {
+ // has to be declared to be of supertype Command otherwise Mockito verify()
+ // refers to wrong method
+ final Command command = new StopClientCommand();
+ _client.processInstruction(command);
+
+ verify(_visitor).visit(command);
+ verify(_delegate).sendResponseMessage(isA(Response.class));
+ }
+
+ public void testWaitUntilStopped() throws Exception
+ {
+ stopClientLater(500);
+ _client.waitUntilStopped(1000);
+ verify(_delegate).destroy();
+ }
+
+ public void testStartTest() throws Exception
+ {
+ _client.start();
+ _client.addParticipantExecutor(_participant);
+
+ verify(_participantRegistry).add(_participant);
+
+ _client.startTest();
+
+ InOrder inOrder = Mockito.inOrder(_delegate, _participant);
+ inOrder.verify(_delegate).startConnections();
+ inOrder.verify(_participant).start(_client);
+ }
+
+ public void testTearDownTest() throws Exception
+ {
+ // before we can tear down the test the client needs to be in the "running test" state, which requires a participant
+ _client.start();
+ _client.addParticipantExecutor(_participant);
+ _client.startTest();
+
+ _client.tearDownTest();
+
+ verify(_delegate).closeTestConnections();
+
+ verify(_participantRegistry).clear();
+ }
+
+ public void testResults() throws Exception
+ {
+ ParticipantResult testResult = mock(ParticipantResult.class);
+ _client.sendResults(testResult);
+ verify(_delegate).sendResponseMessage(testResult);
+ }
+
+ private void stopClientLater(long delay)
+ {
+ doLater(new TimerTask()
+ {
+ @Override
+ public void run()
+ {
+ _client.stop();
+ }
+
+ }, delay);
+ }
+
+ private void doLater(TimerTask task, long delayInMillis)
+ {
+ Timer timer = new Timer();
+ timer.schedule(task, delayInMillis);
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java
new file mode 100644
index 0000000000..ff7cfd2b41
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ConsumerParticipantTest.java
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.apache.qpid.disttest.client.ParticipantTestHelper.assertExpectedConsumerResults;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import javax.jms.Message;
+import javax.jms.Session;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.mockito.InOrder;
+
+public class ConsumerParticipantTest extends TestCase
+{
+ private static final String SESSION_NAME1 = "SESSION1";
+ private static final String PARTICIPANT_NAME1 = "PARTICIPANT_NAME1";
+ private static final long RECEIVE_TIMEOUT = 100;
+ private static final String CLIENT_NAME = "CLIENT_NAME";
+ private static final int PAYLOAD_SIZE_PER_MESSAGE = 1024;
+
+ private final Message _mockMessage = mock(Message.class);
+ private final CreateConsumerCommand _command = new CreateConsumerCommand();
+ private ClientJmsDelegate _delegate;
+ private ConsumerParticipant _consumerParticipant;
+ private InOrder _inOrder;
+
+ /** used to check start/end time of results */
+ private long _testStartTime;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _delegate = mock(ClientJmsDelegate.class);
+ _inOrder = inOrder(_delegate);
+
+ _command.setSessionName(SESSION_NAME1);
+ _command.setParticipantName(PARTICIPANT_NAME1);
+ _command.setSynchronous(true);
+ _command.setReceiveTimeout(RECEIVE_TIMEOUT);
+
+ _consumerParticipant = new ConsumerParticipant(_delegate, _command);
+
+ when(_delegate.consumeMessage(PARTICIPANT_NAME1, RECEIVE_TIMEOUT)).thenReturn(_mockMessage);
+ when(_delegate.calculatePayloadSizeFrom(_mockMessage)).thenReturn(PAYLOAD_SIZE_PER_MESSAGE);
+ when(_delegate.getAcknowledgeMode(SESSION_NAME1)).thenReturn(Session.CLIENT_ACKNOWLEDGE);
+
+ _testStartTime = System.currentTimeMillis();
+ }
+
+ public void testNoMessagesToReceive() throws Exception
+ {
+ _command.setNumberOfMessages(0);
+ _command.setMaximumDuration(0);
+
+ try
+ {
+ _consumerParticipant.doIt(CLIENT_NAME);
+ fail("Exception not thrown");
+ }
+ catch(DistributedTestException e)
+ {
+ // PASS
+ assertEquals("number of messages and duration cannot both be zero", e.getMessage());
+
+ }
+
+ verify(_delegate, never()).consumeMessage(anyString(), anyLong());
+ }
+
+ public void testReceiveOneMessageSynch() throws Exception
+ {
+ int numberOfMessages = 1;
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+ _command.setNumberOfMessages(numberOfMessages);
+
+ ParticipantResult result = _consumerParticipant.doIt(CLIENT_NAME);
+
+ assertExpectedConsumerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.CLIENT_ACKNOWLEDGE, null, numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+
+ _inOrder.verify(_delegate).consumeMessage(PARTICIPANT_NAME1, RECEIVE_TIMEOUT);
+ _inOrder.verify(_delegate).calculatePayloadSizeFrom(_mockMessage);
+ _inOrder.verify(_delegate).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testReceiveMessagesForDurationSynch() throws Exception
+ {
+ long duration = 100;
+ _command.setMaximumDuration(duration);
+
+ ParticipantResult result = _consumerParticipant.doIt(CLIENT_NAME);
+
+ assertExpectedConsumerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.CLIENT_ACKNOWLEDGE, null, null, PAYLOAD_SIZE_PER_MESSAGE, null, duration);
+
+ verify(_delegate, atLeastOnce()).consumeMessage(PARTICIPANT_NAME1, RECEIVE_TIMEOUT);
+ verify(_delegate, atLeastOnce()).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, atLeastOnce()).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testReceiveMessagesBatchedSynch() throws Exception
+ {
+ int numberOfMessages = 10;
+ final int batchSize = 3;
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+ _command.setNumberOfMessages(numberOfMessages);
+ _command.setBatchSize(batchSize);
+
+ ParticipantResult result = _consumerParticipant.doIt(CLIENT_NAME);
+
+ assertExpectedConsumerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.CLIENT_ACKNOWLEDGE, batchSize, numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+
+ verify(_delegate, times(numberOfMessages)).consumeMessage(PARTICIPANT_NAME1, RECEIVE_TIMEOUT);
+ verify(_delegate, times(numberOfMessages)).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, times(4)).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testReceiveMessagesWithVaryingPayloadSize() throws Exception
+ {
+ int numberOfMessages = 3;
+
+ int firstPayloadSize = PAYLOAD_SIZE_PER_MESSAGE;
+ int secondPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * 2;
+ int thirdPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * 4;
+
+ _command.setNumberOfMessages(numberOfMessages);
+
+ when(_delegate.calculatePayloadSizeFrom(_mockMessage)).thenReturn(firstPayloadSize, secondPayloadSize, thirdPayloadSize);
+
+ ParticipantResult result = _consumerParticipant.doIt(CLIENT_NAME);
+
+ final int expectedPayloadResultPayloadSize = 0;
+ final long totalPayloadSize = firstPayloadSize + secondPayloadSize + thirdPayloadSize;
+ assertExpectedConsumerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.CLIENT_ACKNOWLEDGE, null, numberOfMessages, expectedPayloadResultPayloadSize, totalPayloadSize, null);
+
+ verify(_delegate, times(numberOfMessages)).consumeMessage(PARTICIPANT_NAME1, RECEIVE_TIMEOUT);
+ verify(_delegate, times(numberOfMessages)).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, times(numberOfMessages)).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testReleaseResources()
+ {
+ _consumerParticipant.releaseResources();
+ verify(_delegate).closeTestConsumer(PARTICIPANT_NAME1);
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/MessageProviderTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/MessageProviderTest.java
new file mode 100644
index 0000000000..ffc3733eb7
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/MessageProviderTest.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.client.property.ListPropertyValue;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+
+public class MessageProviderTest extends TestCase
+{
+ private Session _session;
+ private TextMessage _message;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _session = mock(Session.class);
+ _message = mock(TextMessage.class);
+ when(_session.createTextMessage(isA(String.class))).thenReturn(_message);
+ when(_session.createTextMessage()).thenReturn(_message);
+ }
+
+ public void testGetMessagePayload() throws Exception
+ {
+ MessageProvider messageProvider = new MessageProvider(null)
+ {
+ public String getMessagePayload(CreateProducerCommand command)
+ {
+ return super.getMessagePayload(command);
+ }
+ };
+ CreateProducerCommand command = new CreateProducerCommand();
+ command.setMessageSize(100);
+ String payloadValue = messageProvider.getMessagePayload(command);
+ assertNotNull("Mesage payload should not be null", payloadValue);
+ assertEquals("Unexpected payload size", 100, payloadValue.length());
+ }
+
+ public void testNextMessage() throws Exception
+ {
+ MessageProvider messageProvider = new MessageProvider(null);
+ CreateProducerCommand command = new CreateProducerCommand();
+ command.setMessageSize(100);
+ Message message = messageProvider.nextMessage(_session, command);
+ assertNotNull("Mesage should be returned", message);
+ verify(_message, atLeastOnce()).setText(isA(String.class));
+ }
+
+ public void testNextMessageWithProperties() throws Exception
+ {
+ Map<String, PropertyValue> properties = new HashMap<String, PropertyValue>();
+ properties.put("test1", new SimplePropertyValue("testValue1"));
+ properties.put("test2", new SimplePropertyValue(new Integer(1)));
+ properties.put("priority", new SimplePropertyValue(new Integer(2)));
+ List<PropertyValue> listItems = new ArrayList<PropertyValue>();
+ listItems.add(new SimplePropertyValue(new Double(2.0)));
+ ListPropertyValue list = new ListPropertyValue();
+ list.setItems(listItems);
+ properties.put("test3", list);
+
+ MessageProvider messageProvider = new MessageProvider(properties);
+ CreateProducerCommand command = new CreateProducerCommand();
+ command.setMessageSize(100);
+ Message message = messageProvider.nextMessage(_session, command);
+ assertNotNull("Mesage should be returned", message);
+ verify(_message, atLeastOnce()).setText(isA(String.class));
+ verify(_message, atLeastOnce()).setJMSPriority(2);
+ verify(_message, atLeastOnce()).setStringProperty("test1", "testValue1");
+ verify(_message, atLeastOnce()).setIntProperty("test2", 1);
+ verify(_message, atLeastOnce()).setDoubleProperty("test3", 2.0);
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantExecutorTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantExecutorTest.java
new file mode 100644
index 0000000000..f30e4664ff
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantExecutorTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.qpid.disttest.client;
+
+import static org.mockito.Matchers.argThat;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.mockito.ArgumentMatcher;
+import org.mockito.InOrder;
+
+public class ParticipantExecutorTest extends TestCase
+{
+ private static final ResultHasError HAS_ERROR = new ResultHasError();
+ private static final String CLIENT_NAME = "CLIENT_NAME";
+ private static final String PARTICIPANT_NAME = "PARTICIPANT_NAME";
+ private ParticipantExecutor _participantExecutor = null;
+ private Client _client = null;
+ private Participant _participant = null;
+ private ParticipantResult _mockResult;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _client = mock(Client.class);
+ when(_client.getClientName()).thenReturn(CLIENT_NAME);
+ _participant = mock(Participant.class);
+
+ _participantExecutor = new ParticipantExecutor(_participant);
+ _participantExecutor.setExecutor(new SynchronousExecutor());
+
+ _mockResult = mock(ParticipantResult.class);
+ }
+
+ public void testStart() throws Exception
+ {
+ when(_participant.doIt(CLIENT_NAME)).thenReturn(_mockResult);
+
+ _participantExecutor.start(_client);
+
+ InOrder inOrder = inOrder(_participant, _client);
+
+ inOrder.verify(_participant).doIt(CLIENT_NAME);
+ inOrder.verify(_client).sendResults(_mockResult);
+ inOrder.verify(_participant).releaseResources();
+ }
+
+ public void testParticipantThrowsException() throws Exception
+ {
+ when(_participant.doIt(CLIENT_NAME)).thenThrow(DistributedTestException.class);
+
+ _participantExecutor.start(_client);
+
+ InOrder inOrder = inOrder(_participant, _client);
+
+ inOrder.verify(_participant).doIt(CLIENT_NAME);
+ inOrder.verify(_client).sendResults(argThat(HAS_ERROR));
+ inOrder.verify(_participant).releaseResources();
+ }
+
+ public void testThreadNameAndDaemonness() throws Exception
+ {
+
+ ThreadPropertyReportingParticipant participant = new ThreadPropertyReportingParticipant(PARTICIPANT_NAME);
+ _participantExecutor = new ParticipantExecutor(participant);
+
+ _participantExecutor.start(_client);
+ participant.awaitExecution();
+
+ assertTrue("Participant should be run in a thread named after it", participant.threadWasCalled().endsWith(PARTICIPANT_NAME));
+ assertTrue("Executor should use daemon threads to avoid them preventing JVM termination", participant.wasDaemon());
+ }
+
+ private static final class ThreadPropertyReportingParticipant implements Participant
+ {
+ private final String _participantName;
+ private final CountDownLatch _participantExecuted = new CountDownLatch(1);
+ private String _threadName;
+ private boolean _daemon;
+
+ public ThreadPropertyReportingParticipant(String participantName)
+ {
+ _participantName = participantName;
+ }
+
+ public String threadWasCalled()
+ {
+ return _threadName;
+ }
+
+ public boolean wasDaemon()
+ {
+ return _daemon;
+ }
+
+ @Override
+ public void releaseResources()
+ {
+ }
+
+ @Override
+ public String getName()
+ {
+ return _participantName;
+ }
+
+ @Override
+ public ParticipantResult doIt(String registeredClientName) throws Exception
+ {
+ Thread currentThread = Thread.currentThread();
+ _threadName = currentThread.getName();
+ _daemon = currentThread.isDaemon();
+
+ _participantExecuted.countDown();
+
+ return null; // unused
+ }
+
+ public void awaitExecution()
+ {
+ boolean success = false;
+ try
+ {
+ success = _participantExecuted.await(5, TimeUnit.SECONDS);
+ }
+ catch (InterruptedException e)
+ {
+ Thread.currentThread().interrupt();
+ }
+
+ assertTrue("Participant not executed", success);
+ }
+ }
+
+ /** avoids our unit test needing to use multiple threads */
+ private final class SynchronousExecutor implements Executor
+ {
+ @Override
+ public void execute(Runnable command)
+ {
+ command.run();
+ }
+ }
+
+ private static class ResultHasError extends ArgumentMatcher<ParticipantResult>
+ {
+ @Override
+ public boolean matches(Object argument)
+ {
+ ParticipantResult result = (ParticipantResult) argument;
+ return result.hasError();
+ }
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantRegistryTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantRegistryTest.java
new file mode 100644
index 0000000000..bd0d5a39c8
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantRegistryTest.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.mockito.Mockito.mock;
+import junit.framework.TestCase;
+
+public class ParticipantRegistryTest extends TestCase
+{
+ private ParticipantExecutorRegistry _participantRegistry = new ParticipantExecutorRegistry();
+
+ private ParticipantExecutor _testParticipant1 = mock(ParticipantExecutor.class);
+ private ParticipantExecutor _testParticipant2 = mock(ParticipantExecutor.class);
+
+ public void testAdd()
+ {
+ assertTrue(_participantRegistry.executors().isEmpty());
+
+ _participantRegistry.add(_testParticipant1);
+
+ assertTrue(_participantRegistry.executors().contains(_testParticipant1));
+
+ _participantRegistry.add(_testParticipant2);
+
+ assertTrue(_participantRegistry.executors().contains(_testParticipant2));
+ }
+
+ public void testClear()
+ {
+ _participantRegistry.add(_testParticipant1);
+
+ assertEquals(1, _participantRegistry.executors().size());
+
+ _participantRegistry.clear();
+
+ assertTrue(_participantRegistry.executors().isEmpty());
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantResultFactoryTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantResultFactoryTest.java
new file mode 100644
index 0000000000..3b21834a5c
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantResultFactoryTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import java.util.Date;
+
+import javax.jms.DeliveryMode;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateParticpantCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+
+public class ParticipantResultFactoryTest extends TestCase
+{
+ private static final String PARTICIPANT_NAME = "participantName";
+ private static final String REGISTERED_CLIENT_NAME = "registeredClientName";
+
+ private static final int BATCH_SIZE = 10;
+ private static final long MAXIMUM_DURATION = 500;
+ private static final int NUMBER_OF_MESSAGES_PROCESSED = 100;
+ private static final long TIME_TAKEN = 100;
+ private static final long TOTAL_PAYLOAD_PROCESSED = 200;
+ private static final int PAYLOAD_SIZE = 300;
+
+ private static final Date START = new Date(0);
+ private static final Date END = new Date(START.getTime() + TIME_TAKEN);
+
+ private ParticipantResultFactory _participantResultFactory;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _participantResultFactory = new ParticipantResultFactory();
+ }
+
+ public void testCreateForProducer()
+ {
+ CreateProducerCommand command = new CreateProducerCommand();
+ setCommonCommandFields(command);
+
+ long producerStartDelay = 30;
+ command.setStartDelay(producerStartDelay);
+
+ int deliveryMode = DeliveryMode.PERSISTENT;
+ command.setDeliveryMode(deliveryMode);
+
+ int priority = 5;
+ command.setPriority(priority);
+
+ long producerInterval = 50;
+ command.setInterval(producerInterval);
+
+ long timeToLive = 60;
+ command.setTimeToLive(timeToLive);
+
+ int totalNumberOfConsumers = 0;
+ int totalNumberOfProducers = 1;
+
+ int acknowledgeMode = 1;
+
+ ProducerParticipantResult result = _participantResultFactory.createForProducer(PARTICIPANT_NAME,
+ REGISTERED_CLIENT_NAME,
+ command,
+ acknowledgeMode,
+ NUMBER_OF_MESSAGES_PROCESSED,
+ PAYLOAD_SIZE,
+ TOTAL_PAYLOAD_PROCESSED,
+ START, END);
+
+ assertCommonResultProperties(result);
+
+ assertEquals(deliveryMode, result.getDeliveryMode());
+ assertEquals(acknowledgeMode, result.getAcknowledgeMode());
+ assertEquals(priority, result.getPriority());
+ assertEquals(producerInterval, result.getInterval());
+ assertEquals(producerStartDelay, result.getStartDelay());
+ assertEquals(timeToLive, result.getTimeToLive());
+ assertEquals(totalNumberOfConsumers, result.getTotalNumberOfConsumers());
+ assertEquals(totalNumberOfProducers, result.getTotalNumberOfProducers());
+ }
+
+ public void testCreateForConsumer()
+ {
+ CreateConsumerCommand command = new CreateConsumerCommand();
+ setCommonCommandFields(command);
+
+ boolean topic = true;
+ command.setTopic(topic);
+
+ boolean durable = true;
+ command.setDurableSubscription(durable);
+
+ boolean browsingSubscription = false;
+ command.setBrowsingSubscription(browsingSubscription);
+
+ String selector = "selector";
+ boolean isSelector = true;
+ command.setSelector(selector);
+
+ boolean noLocal = false;
+ command.setNoLocal(noLocal);
+
+ boolean synchronousConsumer = true;
+ command.setSynchronous(synchronousConsumer);
+
+ int totalNumberOfConsumers = 1;
+ int totalNumberOfProducers = 0;
+
+ int acknowledgeMode = 2;
+
+ ConsumerParticipantResult result = _participantResultFactory.createForConsumer(PARTICIPANT_NAME,
+ REGISTERED_CLIENT_NAME,
+ command,
+ acknowledgeMode,
+ NUMBER_OF_MESSAGES_PROCESSED,
+ PAYLOAD_SIZE,
+ TOTAL_PAYLOAD_PROCESSED,
+ START, END);
+
+ assertCommonResultProperties(result);
+
+ assertEquals(topic, result.isTopic());
+ assertEquals(durable, result.isDurableSubscription());
+ assertEquals(browsingSubscription, result.isBrowsingSubscription());
+ assertEquals(isSelector, result.isSelector());
+ assertEquals(noLocal, result.isNoLocal());
+ assertEquals(synchronousConsumer, result.isSynchronousConsumer());
+ assertEquals(totalNumberOfConsumers, result.getTotalNumberOfConsumers());
+ assertEquals(totalNumberOfProducers, result.getTotalNumberOfProducers());
+ }
+
+ public void testCreateForError()
+ {
+ String errorMessage = "error";
+ ParticipantResult result = _participantResultFactory.createForError(PARTICIPANT_NAME, REGISTERED_CLIENT_NAME, errorMessage);
+ assertEquals(PARTICIPANT_NAME, result.getParticipantName());
+ assertEquals(REGISTERED_CLIENT_NAME, result.getRegisteredClientName());
+ }
+
+
+ private void setCommonCommandFields(CreateParticpantCommand command)
+ {
+ command.setBatchSize(BATCH_SIZE);
+ command.setMaximumDuration(MAXIMUM_DURATION);
+ }
+
+
+ private void assertCommonResultProperties(ParticipantResult result)
+ {
+ assertEquals(PARTICIPANT_NAME, result.getParticipantName());
+ assertEquals(REGISTERED_CLIENT_NAME, result.getRegisteredClientName());
+ assertEquals(BATCH_SIZE, result.getBatchSize());
+ assertEquals(MAXIMUM_DURATION, result.getMaximumDuration());
+ assertEquals(TIME_TAKEN, result.getTimeTaken());
+ assertEquals(NUMBER_OF_MESSAGES_PROCESSED, result.getNumberOfMessagesProcessed());
+ assertEquals(TOTAL_PAYLOAD_PROCESSED, result.getTotalPayloadProcessed());
+ assertEquals(PAYLOAD_SIZE, result.getPayloadSize());
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantTestHelper.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantTestHelper.java
new file mode 100644
index 0000000000..a013cb0a06
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ParticipantTestHelper.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+
+public class ParticipantTestHelper
+{
+
+ public static void assertAtLeast(String message, final long minimumExpected, final long actual)
+ {
+ assertTrue(message + " " + actual, actual >= minimumExpected);
+ }
+
+ public static void assertExpectedConsumerResults(ParticipantResult result, String participantName, String registeredClientName, long expectedTestStartTime, int expectedAcknowledgeMode, Integer expectedBatchSize, Integer expectedNumberOfMessages, Integer expectedPayloadSize, Long expectedTotalPayloadProcessed, Long expectedMinimumExpectedDuration)
+ {
+ assertExpectedResults(result, participantName, registeredClientName, expectedTestStartTime,
+ expectedAcknowledgeMode, expectedBatchSize, expectedNumberOfMessages, expectedPayloadSize, expectedTotalPayloadProcessed, expectedMinimumExpectedDuration);
+ assertEquals("Unexpected number of consumers", 1, result.getTotalNumberOfConsumers());
+ assertEquals("Unexpected number of producers", 0, result.getTotalNumberOfProducers());
+ }
+
+ public static void assertExpectedProducerResults(ParticipantResult result, String participantName, String registeredClientName, long expectedTestStartTime, int expectedAcknowledgeMode, Integer expectedBatchSize, Integer expectedNumberOfMessages, Integer expectedPayloadSize, Long expectedTotalPayloadProcessed, Long expectedMinimumExpectedDuration)
+ {
+ assertExpectedResults(result, participantName, registeredClientName, expectedTestStartTime, expectedAcknowledgeMode, expectedBatchSize, expectedNumberOfMessages, expectedPayloadSize, expectedTotalPayloadProcessed, expectedMinimumExpectedDuration);
+ assertEquals("Unexpected number of producers", 1, result.getTotalNumberOfProducers());
+ assertEquals("Unexpected number of consumers", 0, result.getTotalNumberOfConsumers());
+ }
+
+ private static void assertExpectedResults(ParticipantResult result, String participantName, String registeredClientName, long expectedTestStartTime, int expectedAcknowledgeMode, Integer expectedBatchSize, Integer expectedNumberOfMessages, Integer expectedPayloadSize, Long expectedTotalPayloadProcessed, Long expectedMinimumExpectedDuration)
+ {
+ assertFalse(result.hasError());
+
+ assertEquals("unexpected participant name", participantName, result.getParticipantName());
+ assertEquals("unexpected client name", registeredClientName, result.getRegisteredClientName());
+
+ assertAtLeast("start time of result is too low", expectedTestStartTime, result.getStartInMillis());
+ assertAtLeast("end time of result should be after start time", result.getStartInMillis(), result.getEndInMillis());
+
+ assertEquals("unexpected acknowledge mode", expectedAcknowledgeMode, result.getAcknowledgeMode());
+
+ if(expectedNumberOfMessages != null)
+ {
+ assertEquals("unexpected number of messages", expectedNumberOfMessages.intValue(), result.getNumberOfMessagesProcessed());
+ }
+ if(expectedBatchSize != null)
+ {
+ assertEquals("unexpected batch size", expectedBatchSize.intValue(), result.getBatchSize());
+ }
+ if (expectedPayloadSize != null)
+ {
+ assertEquals("unexpected payload size", expectedPayloadSize.intValue(), result.getPayloadSize());
+ }
+ if (expectedTotalPayloadProcessed != null)
+ {
+ assertEquals("unexpected total payload processed", expectedTotalPayloadProcessed.longValue(), result.getTotalPayloadProcessed());
+ }
+ if(expectedMinimumExpectedDuration != null)
+ {
+ assertAtLeast("participant did not take a sufficient length of time.", expectedMinimumExpectedDuration, result.getTimeTaken());
+ }
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ProducerParticipantTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ProducerParticipantTest.java
new file mode 100644
index 0000000000..cf05623e8f
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/ProducerParticipantTest.java
@@ -0,0 +1,219 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client;
+
+import static org.apache.qpid.disttest.client.ParticipantTestHelper.assertExpectedProducerResults;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Message;
+import javax.jms.Session;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.mockito.InOrder;
+
+public class ProducerParticipantTest extends TestCase
+{
+ private ProducerParticipant _producer;
+
+ private static final String SESSION_NAME1 = "SESSION1";
+ private static final String PARTICIPANT_NAME1 = "PARTICIPANT_NAME1";
+
+ private static final String CLIENT_NAME = "CLIENT_NAME";
+ private static final int PAYLOAD_SIZE_PER_MESSAGE = 1024;
+
+
+ private final Message _mockMessage = mock(Message.class);
+ private final CreateProducerCommand _command = new CreateProducerCommand();
+ private ClientJmsDelegate _delegate;
+ private InOrder _inOrder;
+
+ /** used to check start/end time of results */
+ private long _testStartTime;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _delegate = mock(ClientJmsDelegate.class);
+ _inOrder = inOrder(_delegate);
+
+ _command.setSessionName(SESSION_NAME1);
+ _command.setParticipantName(PARTICIPANT_NAME1);
+
+ when(_delegate.sendNextMessage(isA(CreateProducerCommand.class))).thenReturn(_mockMessage);
+ when(_delegate.calculatePayloadSizeFrom(_mockMessage)).thenReturn(PAYLOAD_SIZE_PER_MESSAGE);
+ when(_delegate.getAcknowledgeMode(SESSION_NAME1)).thenReturn(Session.AUTO_ACKNOWLEDGE);
+
+ _producer = new ProducerParticipant(_delegate, _command);
+
+ _testStartTime = System.currentTimeMillis();
+ }
+
+ public void testStartDelay() throws Exception
+ {
+ final long delay = 100;
+ int numberOfMessages = 1;
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+
+ _command.setStartDelay(delay);
+ _command.setNumberOfMessages(numberOfMessages);
+
+ ParticipantResult result = _producer.doIt(CLIENT_NAME);
+
+ long expectedPublishedStartTime = _testStartTime + delay;
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, expectedPublishedStartTime, Session.AUTO_ACKNOWLEDGE, null, numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+ }
+
+
+ public void testNoMessagesToSend() throws Exception
+ {
+ _command.setNumberOfMessages(0);
+ _command.setMaximumDuration(0);
+
+ try
+ {
+ _producer.doIt(CLIENT_NAME);
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ // PASS
+ assertEquals("number of messages and duration cannot both be zero", e.getMessage());
+ }
+ }
+
+ public void testOneMessageToSend() throws Exception
+ {
+ int batchSize = 1;
+ int numberOfMessages = 1;
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+ int deliveryMode = DeliveryMode.PERSISTENT;
+
+ _command.setNumberOfMessages(numberOfMessages);
+ _command.setBatchSize(batchSize);
+ _command.setDeliveryMode(deliveryMode);
+
+ ParticipantResult result = (ParticipantResult) _producer.doIt(CLIENT_NAME);
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.AUTO_ACKNOWLEDGE, null, numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+
+ _inOrder.verify(_delegate).sendNextMessage(isA(CreateProducerCommand.class));
+ _inOrder.verify(_delegate).calculatePayloadSizeFrom(_mockMessage);
+ _inOrder.verify(_delegate).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+
+ }
+
+ public void testSendMessagesForDuration() throws Exception
+ {
+ final long duration = 100;
+ _command.setMaximumDuration(duration);
+
+ ParticipantResult result = _producer.doIt(CLIENT_NAME);
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.AUTO_ACKNOWLEDGE, null, null, PAYLOAD_SIZE_PER_MESSAGE, null, duration);
+
+ verify(_delegate, atLeastOnce()).sendNextMessage(isA(CreateProducerCommand.class));
+ verify(_delegate, atLeastOnce()).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, atLeastOnce()).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testSendMessageBatches() throws Exception
+ {
+ final int batchSize = 3;
+ final int numberOfMessages = 10;
+ final int expectedNumberOfCommits = 4; // one for each batch of 3 messages, plus one more at the end of the test for the tenth msg.
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+
+ _command.setNumberOfMessages(numberOfMessages);
+ _command.setBatchSize(batchSize);
+
+ ParticipantResult result = _producer.doIt(CLIENT_NAME);
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.AUTO_ACKNOWLEDGE, batchSize, numberOfMessages, PAYLOAD_SIZE_PER_MESSAGE, totalPayloadSize, null);
+
+ verify(_delegate, times(numberOfMessages)).sendNextMessage(isA(CreateProducerCommand.class));
+ verify(_delegate, times(numberOfMessages)).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, times(expectedNumberOfCommits)).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testSendMessageWithPublishInterval() throws Exception
+ {
+ final int batchSize = 3;
+ final long publishInterval = 100;
+ int numberOfMessages = 10;
+ long totalPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * numberOfMessages;
+
+ final long expectedTimeToRunTest = batchSize * publishInterval;
+
+ _command.setNumberOfMessages(numberOfMessages);
+ _command.setBatchSize(batchSize);
+ _command.setInterval(publishInterval);
+
+ ParticipantResult result = _producer.doIt(CLIENT_NAME);
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.AUTO_ACKNOWLEDGE, null, numberOfMessages, null, totalPayloadSize, expectedTimeToRunTest);
+
+ verify(_delegate, times(numberOfMessages)).sendNextMessage(isA(CreateProducerCommand.class));
+ verify(_delegate, times(numberOfMessages)).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, times(4)).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testSendMessageWithVaryingPayloadSize() throws Exception
+ {
+ int numberOfMessages = 3;
+
+ int firstPayloadSize = PAYLOAD_SIZE_PER_MESSAGE;
+ int secondPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * 2;
+ int thirdPayloadSize = PAYLOAD_SIZE_PER_MESSAGE * 4;
+
+ final long totalPayloadSize = firstPayloadSize + secondPayloadSize + thirdPayloadSize;
+
+ when(_delegate.calculatePayloadSizeFrom(_mockMessage)).thenReturn(firstPayloadSize, secondPayloadSize, thirdPayloadSize);
+
+ _command.setNumberOfMessages(numberOfMessages);
+
+ ParticipantResult result = _producer.doIt(CLIENT_NAME);
+
+ final int expectedPayloadResultPayloadSize = 0;
+ assertExpectedProducerResults(result, PARTICIPANT_NAME1, CLIENT_NAME, _testStartTime,
+ Session.AUTO_ACKNOWLEDGE, null, numberOfMessages, expectedPayloadResultPayloadSize, totalPayloadSize, null);
+
+ verify(_delegate, times(numberOfMessages)).sendNextMessage(isA(CreateProducerCommand.class));
+ verify(_delegate, times(numberOfMessages)).calculatePayloadSizeFrom(_mockMessage);
+ verify(_delegate, times(numberOfMessages)).commitOrAcknowledgeMessage(_mockMessage, SESSION_NAME1);
+ }
+
+ public void testReleaseResources()
+ {
+ _producer.releaseResources();
+ verify(_delegate).closeTestProducer(PARTICIPANT_NAME1);
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/ListPropertyValueTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/ListPropertyValueTest.java
new file mode 100644
index 0000000000..75a634ba54
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/ListPropertyValueTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.client.property.ListPropertyValue;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+
+public class ListPropertyValueTest extends TestCase
+{
+ private ListPropertyValue _generator;
+ private List<PropertyValue> _items;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _generator = new ListPropertyValue();
+ _items = new ArrayList<PropertyValue>();
+ _items.add(new SimplePropertyValue(new Integer(1)));
+ _items.add(new SimplePropertyValue(new Double(2.1)));
+ _items.add(new SimplePropertyValue(new Boolean(true)));
+ ListPropertyValue innerList = new ListPropertyValue();
+ List<PropertyValue> innerListItems = new ArrayList<PropertyValue>();
+ innerListItems.add(new SimplePropertyValue("test"));
+ innerListItems.add(new SimplePropertyValue(new Integer(2)));
+ innerList.setItems(innerListItems);
+ _items.add(innerList);
+ _generator.setItems(_items);
+ }
+
+ public void testGetItems()
+ {
+ List<? extends Object> items = _generator.getItems();
+ assertEquals("Unexpected list items", _items, items);
+ }
+
+ public void testGetValue()
+ {
+ for (int i = 0; i < 2; i++)
+ {
+ assertEquals("Unexpected first item", new Integer(1), _generator.getValue());
+ assertEquals("Unexpected second item", new Double(2.1), _generator.getValue());
+ assertEquals("Unexpected third item", new Boolean(true), _generator.getValue());
+ if (i == 0)
+ {
+ assertEquals("Unexpected forth item", "test", _generator.getValue());
+ }
+ else
+ {
+ assertEquals("Unexpected forth item", new Integer(2), _generator.getValue());
+ }
+ }
+ }
+
+ public void testNonCyclicGetValue()
+ {
+ _generator.setCyclic(false);
+ assertFalse("Generator should not be cyclic", _generator.isCyclic());
+ assertEquals("Unexpected first item", new Integer(1), _generator.getValue());
+ assertEquals("Unexpected second item", new Double(2.1), _generator.getValue());
+ assertEquals("Unexpected third item", new Boolean(true), _generator.getValue());
+ assertEquals("Unexpected forth item", "test", _generator.getValue());
+ assertEquals("Unexpected fifth item", new Integer(2), _generator.getValue());
+ assertEquals("Unexpected sixs item", "test", _generator.getValue());
+ assertEquals("Unexpected sevens item", new Integer(2), _generator.getValue());
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/PropertyValueFactoryTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/PropertyValueFactoryTest.java
new file mode 100644
index 0000000000..2d560163c2
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/PropertyValueFactoryTest.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import junit.framework.TestCase;
+
+public class PropertyValueFactoryTest extends TestCase
+{
+ private PropertyValueFactory _factory;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _factory = new PropertyValueFactory();
+ }
+
+ public void testCreateListPropertyValue()
+ {
+ PropertyValue propertyValue = _factory.createPropertyValue("list");
+ assertNotNull("List generator is not created", propertyValue);
+ assertTrue("Unexpected type of list generator", propertyValue instanceof ListPropertyValue);
+ }
+
+ public void testCreateRangePropertyValue()
+ {
+ PropertyValue propertyValue = _factory.createPropertyValue("range");
+ assertNotNull("Range generator is not created", propertyValue);
+ assertTrue("Unexpected type of range generator", propertyValue instanceof RangePropertyValue);
+ }
+
+ public void testCreateRandomPropertyValue()
+ {
+ PropertyValue propertyValue = _factory.createPropertyValue("random");
+ assertNotNull("Random generator is not created", propertyValue);
+ assertTrue("Unexpected type of range generator", propertyValue instanceof RandomPropertyValue);
+ }
+
+ public void testCreateSimplePropertyValue()
+ {
+ PropertyValue propertyValue = _factory.createPropertyValue("simple");
+ assertNotNull("Simple property value is not created", propertyValue);
+ assertTrue("Unexpected type of property value", propertyValue instanceof SimplePropertyValue);
+ }
+
+ public void testCreateNonExistingPropertyValue()
+ {
+ try
+ {
+ _factory.createPropertyValue("nonExisting");
+ fail("Non existing property value should not be created");
+ }
+ catch (Exception e)
+ {
+ // pass
+ }
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RandomPropertyValueTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RandomPropertyValueTest.java
new file mode 100644
index 0000000000..bd5de3e370
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RandomPropertyValueTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import org.apache.qpid.disttest.client.property.RandomPropertyValue;
+
+import junit.framework.TestCase;
+
+public class RandomPropertyValueTest extends TestCase
+{
+ private RandomPropertyValue _generator;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _generator = new RandomPropertyValue();
+ _generator.setUpper(20.0);
+ _generator.setLower(10.0);
+ _generator.setType("double");
+ }
+
+ public void testGetters()
+ {
+ assertEquals("Unexpected upper boundary", new Double(20.0), _generator.getUpper());
+ assertEquals("Unexpected lower boundary", new Double(10.0), _generator.getLower());
+ assertEquals("Unexpected type", "double", _generator.getType());
+ }
+
+ public void testGetValue()
+ {
+ Object value = _generator.getValue();
+ assertTrue("Unexpected type", value instanceof Double);
+ assertTrue("Unexpected value", ((Double) value).doubleValue() >= 10.0
+ && ((Double) value).doubleValue() <= 20.0);
+ }
+
+ public void testGetValueInt()
+ {
+ _generator.setType("int");
+ Object value = _generator.getValue();
+ assertTrue("Unexpected type", value instanceof Integer);
+ assertTrue("Unexpected value", ((Integer) value).intValue() >= 10 && ((Integer) value).intValue() <= 20);
+ }
+
+ public void testGetValueLong()
+ {
+ _generator.setType("long");
+ Object value = _generator.getValue();
+ assertTrue("Unexpected type", value instanceof Long);
+ assertTrue("Unexpected value", ((Long) value).longValue() >= 10 && ((Long) value).longValue() <= 20);
+ }
+
+ public void testGetValueFloat()
+ {
+ _generator.setType("float");
+ Object value = _generator.getValue();
+ assertTrue("Unexpected type", value instanceof Float);
+ assertTrue("Unexpected value", ((Float) value).floatValue() >= 10.0 && ((Float) value).floatValue() <= 20.0);
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RangePropertyValueTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RangePropertyValueTest.java
new file mode 100644
index 0000000000..91791c9d55
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/RangePropertyValueTest.java
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import org.apache.qpid.disttest.client.property.RangePropertyValue;
+
+import junit.framework.TestCase;
+
+public class RangePropertyValueTest extends TestCase
+{
+ private RangePropertyValue _generator;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ _generator = new RangePropertyValue();
+ _generator.setUpper(10.0);
+ _generator.setLower(0.0);
+ _generator.setStep(2.0);
+ _generator.setType("double");
+ }
+
+ public void testGetters()
+ {
+ assertEquals("Unexpected upper boundary", new Double(10.0), _generator.getUpper());
+ assertEquals("Unexpected lower boundary", new Double(0.0), _generator.getLower());
+ assertEquals("Unexpected step", new Double(2.0), _generator.getStep());
+ assertEquals("Unexpected type", "double", _generator.getType());
+ assertTrue("Unexpected cyclic", _generator.isCyclic());
+ }
+
+ public void testGetValue()
+ {
+ double[] expected = { 0.0, 2.0, 4.0, 6.0, 8.0, 10.0 };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Double);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+
+ public void testGetValueNonCyclic()
+ {
+ _generator.setCyclic(false);
+ double[] expected = { 0.0, 2.0, 4.0, 6.0, 8.0, 10.0 };
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Double);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertEquals("Unexpected value ", expected[expected.length - 1], value);
+ }
+ }
+
+ public void testGetValueInt()
+ {
+ _generator.setType("int");
+ int[] expected = { 0, 2, 4, 6, 8, 10 };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Integer);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+
+ public void testGetValueByte()
+ {
+ _generator.setType("byte");
+ byte[] expected = { 0, 2, 4, 6, 8, 10 };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Byte);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+
+ public void testGetValueLong()
+ {
+ _generator.setType("long");
+ long[] expected = { 0, 2, 4, 6, 8, 10 };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Long);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+
+ public void testGetValueShort()
+ {
+ _generator.setType("short");
+ short[] expected = { 0, 2, 4, 6, 8, 10 };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Short);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+
+ public void testGetValueFloat()
+ {
+ _generator.setType("float");
+ float[] expected = { 0.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f };
+ for (int j = 0; j < 2; j++)
+ {
+ for (int i = 0; i < expected.length; i++)
+ {
+ Object value = _generator.getValue();
+ assertTrue("Should be Double", value instanceof Float);
+ assertEquals("Unexpected value ", expected[i], value);
+ }
+ }
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/SimplePropertyValueTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/SimplePropertyValueTest.java
new file mode 100644
index 0000000000..a347d866c7
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/client/property/SimplePropertyValueTest.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.client.property;
+
+import junit.framework.TestCase;
+
+public class SimplePropertyValueTest extends TestCase
+{
+ public void testGetValue()
+ {
+ SimplePropertyValue value = new SimplePropertyValue(new Integer(1));
+ assertEquals("Unexpected value", new Integer(1), value.getValue());
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java
new file mode 100644
index 0000000000..cc969e1ef2
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ClientRegistryTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+
+public class ClientRegistryTest extends TestCase
+{
+ private static final String CLIENT1_REGISTERED_NAME = "CLIENT1_REGISTERED_NAME";
+ private static final String CLIENT2_REGISTERED_NAME = "CLIENT2_REGISTERED_NAME";
+ private static final int AWAIT_DELAY = 100;
+
+ private ClientRegistry _clientRegistry = new ClientRegistry();
+
+ public void testRegisterClient()
+ {
+ assertEquals(0, _clientRegistry.getClients().size());
+
+ _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
+ assertEquals(1, _clientRegistry.getClients().size());
+
+ }
+
+ public void testRejectsDuplicateClientNames()
+ {
+ _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
+ try
+ {
+ _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
+ fail("Should have thrown an exception");
+ }
+ catch (final DistributedTestException e)
+ {
+ // pass
+ }
+ }
+
+ public void testAwaitOneClientWhenClientNotRegistered()
+ {
+ int numberOfClientsAbsent = _clientRegistry.awaitClients(1, AWAIT_DELAY);
+ assertEquals(1, numberOfClientsAbsent);
+ }
+
+ public void testAwaitOneClientWhenClientAlreadyRegistered()
+ {
+ _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
+
+ int numberOfClientsAbsent = _clientRegistry.awaitClients(1, AWAIT_DELAY);
+ assertEquals(0, numberOfClientsAbsent);
+ }
+
+ public void testAwaitTwoClientWhenClientRegistersWhilstWaiting()
+ {
+ _clientRegistry.registerClient(CLIENT1_REGISTERED_NAME);
+ registerClientLater(CLIENT2_REGISTERED_NAME, 50);
+
+ int numberOfClientsAbsent = _clientRegistry.awaitClients(2, AWAIT_DELAY);
+ assertEquals(0, numberOfClientsAbsent);
+ }
+
+ private void registerClientLater(final String clientName, long delayInMillis)
+ {
+ doLater(new TimerTask()
+ {
+ @Override
+ public void run()
+ {
+ _clientRegistry.registerClient(clientName);
+ }
+ }, delayInMillis);
+ }
+
+ private void doLater(TimerTask task, long delayInMillis)
+ {
+ Timer timer = new Timer();
+ timer.schedule(task, delayInMillis);
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ControllerTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ControllerTest.java
new file mode 100644
index 0000000000..bc58ea41c5
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ControllerTest.java
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.controller.config.TestInstance;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class ControllerTest extends TestCase
+{
+ private static final String CLIENT1_REGISTERED_NAME = "client-uid1";
+
+ private static final long COMMAND_RESPONSE_TIMEOUT = 1000;
+ private static final long REGISTRATION_TIMEOUT = 1000;
+
+ private Controller _controller;
+ private ControllerJmsDelegate _respondingJmsDelegate;
+ private TestRunner _testRunner;
+ private ClientRegistry _clientRegistry;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _respondingJmsDelegate = mock(ControllerJmsDelegate.class);
+ _controller = new Controller(_respondingJmsDelegate, REGISTRATION_TIMEOUT, COMMAND_RESPONSE_TIMEOUT);
+ _testRunner = mock(TestRunner.class);
+ _clientRegistry = mock(ClientRegistry.class);
+
+ Config configWithOneClient = createMockConfig(1);
+ _controller.setConfig(configWithOneClient);
+ _controller.setClientRegistry(_clientRegistry);
+ _controller.setTestRunnerFactory(createTestFactoryReturningMock());
+
+ doAnswer(new Answer<Void>()
+ {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable
+ {
+ final String clientName = (String)invocation.getArguments()[0];
+ final Command command = (Command)invocation.getArguments()[1];
+ _controller.processStopClientResponse(new Response(clientName, command.getType()));
+ return null;
+ }
+ }).when(_respondingJmsDelegate).sendCommandToClient(anyString(), isA(Command.class));
+ }
+
+
+ public void testControllerRejectsEmptyConfiguration()
+ {
+ Config configWithZeroClients = createMockConfig(0);
+
+ try
+ {
+ _controller.setConfig(configWithZeroClients);
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ // PASS
+ }
+ }
+
+ public void testControllerReceivesTwoExpectedClientRegistrations()
+ {
+ Config configWithTwoClients = createMockConfig(2);
+ _controller.setConfig(configWithTwoClients);
+ when(_clientRegistry.awaitClients(2, REGISTRATION_TIMEOUT)).thenReturn(0);
+
+ _controller.awaitClientRegistrations();
+ }
+
+ public void testControllerDoesntReceiveAnyRegistrations()
+ {
+ when(_clientRegistry.awaitClients(1, REGISTRATION_TIMEOUT)).thenReturn(1);
+
+ try
+ {
+ _controller.awaitClientRegistrations();
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ // PASS
+ }
+ }
+
+ public void testRegisterClient()
+ {
+ RegisterClientCommand command = new RegisterClientCommand(CLIENT1_REGISTERED_NAME, "dummy");
+ _controller.registerClient(command);
+
+ verify(_clientRegistry).registerClient(CLIENT1_REGISTERED_NAME);
+ verify(_respondingJmsDelegate).registerClient(command);
+
+ }
+
+ public void testControllerSendsClientStopCommandToClient()
+ {
+ when(_clientRegistry.getClients()).thenReturn(Collections.singleton(CLIENT1_REGISTERED_NAME));
+
+ _controller.stopAllRegisteredClients();
+
+ verify(_respondingJmsDelegate).sendCommandToClient(eq(CLIENT1_REGISTERED_NAME), isA(StopClientCommand.class));
+ }
+
+ public void testRunAllTests()
+ {
+ Config config = createSimpleConfig();
+ _controller.setConfig(config);
+
+ TestResult testResult = new TestResult("test1");
+
+ when(_testRunner.run()).thenReturn(testResult);
+
+ ResultsForAllTests results = _controller.runAllTests();
+
+ List<ITestResult> testResults = results.getTestResults();
+ assertEquals(1, testResults.size());
+ assertSame(testResult, testResults.get(0));
+
+ verify(_testRunner).run();
+ }
+
+ private Config createSimpleConfig()
+ {
+ Config config = mock(Config.class);
+ TestInstance testInstance = mock(TestInstance.class);
+
+ List<TestInstance> testInstances = Arrays.asList(testInstance);
+
+ when(config.getTests()).thenReturn(testInstances);
+ when(config.getTotalNumberOfClients()).thenReturn(1); // necessary otherwise controller rejects "invalid" config
+
+ return config;
+ }
+
+ private Config createMockConfig(int numberOfClients)
+ {
+ Config config = mock(Config.class);
+ when(config.getTotalNumberOfClients()).thenReturn(numberOfClients);
+ return config;
+ }
+
+ private TestRunnerFactory createTestFactoryReturningMock()
+ {
+ TestRunnerFactory testRunnerFactory = mock(TestRunnerFactory.class);
+
+ when(testRunnerFactory.createTestRunner(
+ isA(ParticipatingClients.class),
+ isA(TestInstance.class),
+ isA(ControllerJmsDelegate.class),
+ isA(Long.class),
+ isA(Long.class)))
+ .thenReturn(_testRunner);
+
+ return testRunnerFactory;
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ParticipatingClientsTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ParticipatingClientsTest.java
new file mode 100644
index 0000000000..284db38f44
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/ParticipatingClientsTest.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class ParticipatingClientsTest extends TestCase
+{
+ private static final String CLIENT1_CONFIGURED_NAME = "CLIENT1_CONFIGURED_NAME";
+ private static final String CLIENT2_CONFIGURED_NAME = "CLIENT2_CONFIGURED_NAME";
+
+ private static final String CLIENT1_REGISTERED_NAME = "CLIENT1_REGISTERED_NAME";
+ private static final String CLIENT2_REGISTERED_NAME = "CLIENT2_REGISTERED_NAME";
+ private static final String CLIENT3_REGISTERED_NAME = "CLIENT3_REGISTERED_NAME";
+ private ClientRegistry _clientRegistry;
+ private List<String> _configuredClientNamesForTest;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _clientRegistry = mock(ClientRegistry.class);
+ }
+
+ public void testTooFewRegisteredClientsForTest()
+ {
+ _configuredClientNamesForTest = Arrays.asList(CLIENT1_CONFIGURED_NAME, CLIENT2_CONFIGURED_NAME);
+ when(_clientRegistry.getClients()).thenReturn(Arrays.asList(CLIENT1_REGISTERED_NAME));
+
+ try
+ {
+ new ParticipatingClients(_clientRegistry, _configuredClientNamesForTest);
+ fail("Exception not thrown");
+ }
+ catch (IllegalArgumentException e)
+ {
+ // PASS
+ }
+
+ }
+
+
+ public void testSelectOneClientFromPoolOfOne()
+ {
+ _configuredClientNamesForTest = Arrays.asList(CLIENT1_CONFIGURED_NAME);
+ when(_clientRegistry.getClients()).thenReturn(Arrays.asList(CLIENT1_REGISTERED_NAME));
+
+ ParticipatingClients clients = new ParticipatingClients(_clientRegistry, _configuredClientNamesForTest);
+ assertBothWays(clients, CLIENT1_REGISTERED_NAME, CLIENT1_CONFIGURED_NAME);
+ }
+
+ public void testSelectTwoClientFromPoolOfMany()
+ {
+ _configuredClientNamesForTest = Arrays.asList(CLIENT1_CONFIGURED_NAME, CLIENT2_CONFIGURED_NAME);
+ when(_clientRegistry.getClients()).thenReturn(Arrays.asList(CLIENT1_REGISTERED_NAME, CLIENT2_REGISTERED_NAME, CLIENT3_REGISTERED_NAME));
+
+ ParticipatingClients clients = new ParticipatingClients(_clientRegistry, _configuredClientNamesForTest);
+
+ assertBothWays(clients, CLIENT1_REGISTERED_NAME, CLIENT1_CONFIGURED_NAME);
+ assertBothWays(clients, CLIENT2_REGISTERED_NAME, CLIENT2_CONFIGURED_NAME);
+ }
+
+ public void testGetUnrecognisedConfiguredName()
+ {
+ _configuredClientNamesForTest = Arrays.asList(CLIENT1_CONFIGURED_NAME);
+ when(_clientRegistry.getClients()).thenReturn(Arrays.asList(CLIENT1_REGISTERED_NAME));
+
+ ParticipatingClients clients = new ParticipatingClients(_clientRegistry, _configuredClientNamesForTest);
+
+ testUnrecognisedClientConfiguredName(clients, "unknown");
+ testUnrecognisedClientRegisteredName(clients, "unknown");
+ }
+
+ public void testGetRegisteredClientNames()
+ {
+ _configuredClientNamesForTest = Arrays.asList(CLIENT1_CONFIGURED_NAME);
+ List<String> registeredNames = Arrays.asList(CLIENT1_REGISTERED_NAME);
+ when(_clientRegistry.getClients()).thenReturn(registeredNames);
+
+ ParticipatingClients clients = new ParticipatingClients(_clientRegistry, _configuredClientNamesForTest);
+
+ Collection<String> registeredParticipatingNames = clients.getRegisteredNames();
+ assertEquals(1, registeredParticipatingNames.size());
+ assertTrue(registeredParticipatingNames.contains(CLIENT1_REGISTERED_NAME));
+ }
+
+ private void testUnrecognisedClientConfiguredName(ParticipatingClients clients, String unrecognisedClientConfiguredName)
+ {
+ try
+ {
+ clients.getRegisteredNameFromConfiguredName(unrecognisedClientConfiguredName);
+ fail("Exception not thrown");
+ }
+ catch (IllegalArgumentException e)
+ {
+ // PASS
+ }
+ }
+
+ private void testUnrecognisedClientRegisteredName(ParticipatingClients clients, String unrecognisedClientRegisteredName)
+ {
+ try
+ {
+ clients.getConfiguredNameFromRegisteredName(unrecognisedClientRegisteredName);
+ fail("Exception not thrown");
+ }
+ catch (IllegalArgumentException e)
+ {
+ // PASS
+ }
+ }
+
+ private void assertBothWays(ParticipatingClients clients, String registeredName, String configuredName)
+ {
+ assertEquals(registeredName, clients.getRegisteredNameFromConfiguredName(configuredName));
+ assertEquals(configuredName, clients.getConfiguredNameFromRegisteredName(registeredName));
+ }
+
+
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/TestRunnerTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/TestRunnerTest.java
new file mode 100644
index 0000000000..983da299b9
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/TestRunnerTest.java
@@ -0,0 +1,253 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+import org.apache.qpid.disttest.controller.config.TestInstance;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class TestRunnerTest extends TestCase
+{
+ private static final String TEST_NAME = "TEST_NAME";
+ private static final String PARTICIPANT_NAME = "TEST_PARTICIPANT_NAME";
+ private static final int ITERATION_NUMBER = 1;
+
+ private static final String CLIENT1_REGISTERED_NAME = "client-uid1";
+ private static final String CLIENT1_CONFIGURED_NAME = "client1";
+
+ private static final long COMMAND_RESPONSE_TIMEOUT = 1000;
+ private static final long TEST_RESULT_TIMEOUT = 2000;
+ private static final long DELAY = 100;
+
+ private TestRunner _testRunner;
+ private TestInstance _testInstance;
+ private ControllerJmsDelegate _respondingJmsDelegate;
+ private ParticipatingClients _participatingClients;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _respondingJmsDelegate = mock(ControllerJmsDelegate.class);
+
+ _participatingClients = mock(ParticipatingClients.class);
+ when(_participatingClients.getRegisteredNameFromConfiguredName(CLIENT1_CONFIGURED_NAME)).thenReturn(CLIENT1_REGISTERED_NAME);
+ when(_participatingClients.getConfiguredNameFromRegisteredName(CLIENT1_REGISTERED_NAME)).thenReturn(CLIENT1_CONFIGURED_NAME);
+ when(_participatingClients.getRegisteredNames()).thenReturn(Collections.singleton(CLIENT1_REGISTERED_NAME));
+
+ doAnswer(new Answer<Void>()
+ {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable
+ {
+ final String clientName = (String)invocation.getArguments()[0];
+ final Command command = (Command)invocation.getArguments()[1];
+ _testRunner.processCommandResponse(new Response(clientName, command.getType()));
+ return null;
+ }
+ }).when(_respondingJmsDelegate).sendCommandToClient(anyString(), isA(Command.class));
+ }
+
+ public void testSendConnectionCommandToClient()
+ {
+ _testInstance = createTestInstanceWithConnection();
+
+ _testRunner = new TestRunner(_participatingClients, _testInstance , _respondingJmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+ _testRunner.sendTestSetupCommands();
+
+ verify(_respondingJmsDelegate).sendCommandToClient(eq(CLIENT1_REGISTERED_NAME), isA(CreateConnectionCommand.class));
+ }
+
+ public void testSendCommandToAllParticipatingClients()
+ {
+ _testRunner = new TestRunner(_participatingClients, mock(TestInstance.class), _respondingJmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+
+ StartTestCommand startTestCommand = new StartTestCommand();
+ _testRunner.sendCommandToParticipatingClients(startTestCommand);
+
+ verify(_respondingJmsDelegate).sendCommandToClient(CLIENT1_REGISTERED_NAME, startTestCommand);
+ }
+
+ public void testWaitsForCommandResponses()
+ {
+ _testInstance = createTestInstanceWithConnection();
+ _testRunner = new TestRunner(_participatingClients, _testInstance , _respondingJmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+
+ _testRunner.sendTestSetupCommands();
+
+ _testRunner.awaitCommandResponses();
+ }
+
+ public void testClientFailsToSendCommandResponseWithinTimeout()
+ {
+ ControllerJmsDelegate jmsDelegate = mock(ControllerJmsDelegate.class);
+
+ _testInstance = createTestInstanceWithConnection();
+ _testRunner = new TestRunner(_participatingClients, _testInstance , jmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+
+ _testRunner.sendTestSetupCommands();
+ // we don't call sendCommandResponseLater so controller should time out
+
+ try
+ {
+ _testRunner.awaitCommandResponses();
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ // PASS
+ }
+ }
+
+ public void testCreateAndDeleteQueues()
+ {
+ _testInstance = mock(TestInstance.class);
+ List<QueueConfig> queues = mock(List.class);
+ when(_testInstance.getQueues()).thenReturn(queues);
+
+ _testRunner = new TestRunner(_participatingClients, _testInstance, _respondingJmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+
+ _testRunner.createQueues();
+ verify(_respondingJmsDelegate).createQueues(queues);
+
+ _testRunner.deleteQueues();
+ verify(_respondingJmsDelegate).deleteQueues(queues);
+ }
+
+ public void testRun()
+ {
+ _testInstance = createTestInstanceWithOneParticipant();
+ _testRunner = new TestRunner(_participatingClients, _testInstance , _respondingJmsDelegate, COMMAND_RESPONSE_TIMEOUT, TEST_RESULT_TIMEOUT);
+
+ ParticipantResult incomingParticipantResult = new ParticipantResult(PARTICIPANT_NAME);
+ incomingParticipantResult.setRegisteredClientName(CLIENT1_REGISTERED_NAME);
+ sendTestResultsLater(_testRunner, incomingParticipantResult);
+
+ TestResult results = _testRunner.run();
+
+ verify(_respondingJmsDelegate).addCommandListener(isA(TestRunner.TestCommandResponseListener.class));
+ verify(_respondingJmsDelegate).addCommandListener(isA(TestRunner.ParticipantResultListener.class));
+
+ verify(_respondingJmsDelegate).createQueues(isA(List.class));
+
+ verify(_respondingJmsDelegate).sendCommandToClient(eq(CLIENT1_REGISTERED_NAME), isA(StartTestCommand.class));
+ verify(_respondingJmsDelegate).sendCommandToClient(eq(CLIENT1_REGISTERED_NAME), isA(NoOpCommand.class));
+ verify(_respondingJmsDelegate).sendCommandToClient(eq(CLIENT1_REGISTERED_NAME), isA(TearDownTestCommand.class));
+
+ verify(_respondingJmsDelegate).deleteQueues(isA(List.class));
+
+ verify(_respondingJmsDelegate).removeCommandListener(isA(TestRunner.ParticipantResultListener.class));
+ verify(_respondingJmsDelegate).removeCommandListener(isA(TestRunner.TestCommandResponseListener.class));
+
+ List<ParticipantResult> participantResults = results.getParticipantResults();
+ assertEquals(1, participantResults.size());
+ ParticipantResult resultingParticipantResult = participantResults.get(0);
+
+ assertResultHasCorrectTestDetails(resultingParticipantResult);
+ }
+
+ private void assertResultHasCorrectTestDetails(ParticipantResult resultingParticipantResult)
+ {
+ assertEquals("Test runner should have set configured name when it received participant results",
+ CLIENT1_CONFIGURED_NAME, resultingParticipantResult.getConfiguredClientName());
+ assertEquals("Test runner should have set test name when it received participant results",
+ TEST_NAME, resultingParticipantResult.getTestName());
+ assertEquals("Test runner should have set test iteration number when it received participant results",
+ ITERATION_NUMBER, resultingParticipantResult.getIterationNumber());
+ }
+
+
+ private TestInstance createTestInstanceWithOneParticipant()
+ {
+ TestInstance testInstance = mock(TestInstance.class);
+
+ List<CommandForClient> commands = Arrays.asList(
+ new CommandForClient(CLIENT1_CONFIGURED_NAME, new NoOpCommand()));
+
+ when(testInstance.createCommands()).thenReturn(commands);
+
+ when(testInstance.getTotalNumberOfParticipants()).thenReturn(1);
+
+ when(testInstance.getName()).thenReturn(TEST_NAME);
+
+ List<QueueConfig> queues = mock(List.class);
+ when(testInstance.getQueues()).thenReturn(queues);
+
+ when(testInstance.getIterationNumber()).thenReturn(ITERATION_NUMBER);
+
+ return testInstance;
+ }
+
+ private TestInstance createTestInstanceWithConnection()
+ {
+ TestInstance testInstance = mock(TestInstance.class);
+
+ List<CommandForClient> commands = Arrays.asList(
+ new CommandForClient(CLIENT1_CONFIGURED_NAME, new CreateConnectionCommand("conn1", "factory")));
+
+ when(testInstance.createCommands()).thenReturn(commands);
+
+ return testInstance;
+ }
+
+ private void sendTestResultsLater(final TestRunner runner, final ParticipantResult result)
+ {
+ doLater(new TimerTask()
+ {
+ @Override
+ public void run()
+ {
+ runner.processParticipantResult(result);
+ }
+ }, DELAY);
+ }
+
+ private void doLater(TimerTask task, long delayInMillis)
+ {
+ Timer timer = new Timer();
+ timer.schedule(task, delayInMillis);
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ClientConfigTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ClientConfigTest.java
new file mode 100644
index 0000000000..d4af439dea
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ClientConfigTest.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.assertCommandForClient;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+
+public class ClientConfigTest extends TestCase
+{
+ private static final String CLIENT1 = "client1";
+
+ public void testClientConfigHasZeroArgConstructorForGson()
+ {
+ ClientConfig c = new ClientConfig();
+ assertNotNull(c);
+ }
+
+ public void testCreateCommands()
+ {
+ ClientConfig clientConfig = createClientConfigWithConnectionConfigReturningChildCommands();
+
+ List<CommandForClient> commands = clientConfig.createCommands();
+ assertEquals(2, commands.size());
+
+ assertCommandForClient(commands, 0, CLIENT1, NoOpCommand.class);
+ assertCommandForClient(commands, 1, CLIENT1, NoOpCommand.class);
+ }
+
+ public void testCreateCommandsForMessageProvider()
+ {
+ ClientConfig clientConfig = createClientConfigWithMessageProviderConfigReturningCommands();
+
+ List<CommandForClient> commands = clientConfig.createCommands();
+ assertEquals(1, commands.size());
+
+ assertCommandForClient(commands, 0, CLIENT1, CreateMessageProviderCommand.class);
+ }
+
+ public void testGetTotalNumberOfParticipants()
+ {
+ ClientConfig clientConfig = createClientConfigWithTwoParticipants();
+ assertEquals(2, clientConfig.getTotalNumberOfParticipants());
+ }
+
+ private ClientConfig createClientConfigWithConnectionConfigReturningChildCommands()
+ {
+ ConnectionConfig connectionConfig = mock(ConnectionConfig.class);
+
+ List<Command> commands = Arrays.asList((Command)new NoOpCommand(), (Command)new NoOpCommand());
+ when(connectionConfig.createCommands()).thenReturn(commands);
+
+ return new ClientConfig(CLIENT1, connectionConfig);
+ }
+
+ private ClientConfig createClientConfigWithMessageProviderConfigReturningCommands()
+ {
+ Map<String, PropertyValue> messageProperties = new HashMap<String, PropertyValue>();
+ messageProperties.put("test", new SimplePropertyValue("testValue"));
+ MessageProviderConfig config = new MessageProviderConfig("test", messageProperties);
+
+ List<MessageProviderConfig> providerConfigs = new ArrayList<MessageProviderConfig>();
+ providerConfigs.add(config);
+
+ return new ClientConfig(CLIENT1, new ArrayList<ConnectionConfig>(), providerConfigs);
+ }
+
+ private ClientConfig createClientConfigWithTwoParticipants()
+ {
+ ConnectionConfig connectionConfig1 = mock(ConnectionConfig.class);
+ ConnectionConfig connectionConfig2 = mock(ConnectionConfig.class);
+
+ when(connectionConfig1.getTotalNumberOfParticipants()).thenReturn(1);
+ when(connectionConfig2.getTotalNumberOfParticipants()).thenReturn(1);
+
+ ClientConfig clientConfig = new ClientConfig(CLIENT1, connectionConfig1, connectionConfig2);
+ return clientConfig;
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigReaderTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigReaderTest.java
new file mode 100644
index 0000000000..af9ec28db0
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigReaderTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.io.Reader;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.ConfigFileHelper;
+import org.apache.qpid.disttest.client.MessageProvider;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.controller.CommandForClient;
+
+public class ConfigReaderTest extends TestCase
+{
+ private Config _config;
+
+ @Override
+ protected void setUp()
+ {
+ ConfigReader configReader = new ConfigReader();
+ Reader reader = ConfigFileHelper.getConfigFileReader(getClass(), "sampleConfig.json");
+ _config = configReader.readConfig(reader);
+ }
+
+ public void testReadTest()
+ {
+ List<TestConfig> tests = _config.getTestConfigs();
+ assertEquals("Unexpected number of tests", 2, tests.size());
+ TestConfig test1Config = tests.get(0);
+ assertNotNull("Test 1 configuration is expected", test1Config);
+ assertEquals("Unexpected test name", "Test 1", test1Config.getName());
+
+ TestConfig test2Config = tests.get(1);
+ assertNotNull("Test 2 configuration is expected", test2Config);
+ }
+
+ public void testReadsTestWithQueues()
+ {
+ TestConfig test1Config = _config.getTestConfigs().get(0);
+ List<QueueConfig> queues = test1Config.getQueues();
+ assertEquals("Unexpected number of queues", 2, queues.size());
+ QueueConfig queue1Config = queues.get(0);
+ assertNotNull("Expected queue 1 config", queue1Config);
+ assertEquals("Unexpected queue name", "Json-Queue-Name", queue1Config.getName());
+ assertTrue("Unexpected attributes", queue1Config.getAttributes().isEmpty());
+ assertFalse("Unexpected durable", queue1Config.isDurable());
+
+ QueueConfig queue2Config = queues.get(1);
+ assertNotNull("Expected queue 2 config", queue2Config);
+ assertEquals("Unexpected queue name", "Json Queue Name 2", queue2Config.getName());
+ assertTrue("Unexpected durable", queue2Config.isDurable());
+ Map<String, Object> attributes = queue2Config.getAttributes();
+ assertNotNull("Expected attributes", attributes);
+ assertFalse("Attributes are not loaded", attributes.isEmpty());
+ assertEquals("Unexpected number of attributes", 1, attributes.size());
+ assertEquals("Unexpected attribute 'x-qpid-priorities' value", 10,
+ ((Number)attributes.get("x-qpid-priorities")).intValue());
+ }
+
+ public void testReadsTestWithIterations()
+ {
+ TestConfig testConfig = _config.getTestConfigs().get(0);
+ List<IterationValue> iterationValues = testConfig.getIterationValues();
+ assertEquals("Unexpected number of iterations", 2, iterationValues.size());
+
+ IterationValue iteration1 = iterationValues.get(0);
+
+ String messageSizeProperty = "_messageSize";
+
+ assertEquals("Unexpected value for property " + messageSizeProperty,
+ "100",
+ iteration1.getIterationPropertyValuesWithUnderscores().get(messageSizeProperty));
+ }
+
+ public void testReadsMessageProviders()
+ {
+ TestConfig testConfig = _config.getTestConfigs().get(0);
+ ClientConfig cleintConfig = testConfig.getClients().get(0);
+ List<MessageProviderConfig> configs = cleintConfig.getMessageProviders();
+ assertNotNull("Message provider configs should not be null", configs);
+ assertEquals("Unexpected number of message providers", 1, configs.size());
+ MessageProviderConfig messageProvider = configs.get(0);
+ assertNotNull("Message provider config should not be null", messageProvider);
+ assertEquals("Unexpected provider name", "testProvider1", messageProvider.getName());
+ Map<String, PropertyValue> properties = messageProvider.getMessageProperties();
+ assertNotNull("Message properties should not be null", properties);
+ assertEquals("Unexpected number of message properties", 3, properties.size());
+ assertNotNull("test property is not found", properties.get("test"));
+ assertNotNull("priority property is not found", properties.get("priority"));
+ assertNotNull("id property is not found", properties.get("id"));
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTest.java
new file mode 100644
index 0000000000..88750b9737
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+public class ConfigTest extends TestCase
+{
+ public void testGetTestsForTestWithIteratingMessageSizes()
+ {
+ Config config = createConfigWithIteratingMessageSizes();
+ List<TestInstance> testConfigs = config.getTests();
+
+ assertEquals("should have a test config for each message size", 2, testConfigs.size());
+
+ TestInstance instance0 = testConfigs.get(0);
+ assertEquals(0, instance0.getIterationNumber());
+
+ TestInstance instance1 = testConfigs.get(1);
+ assertEquals(1, instance1.getIterationNumber());
+ }
+
+ private Config createConfigWithIteratingMessageSizes()
+ {
+ TestConfig testConfig = mock(TestConfig.class);
+
+ when(testConfig.getIterationValues()).thenReturn(Arrays.asList(new IterationValue(),new IterationValue()));
+
+ Config config = new Config(testConfig);
+
+ return config;
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTestUtils.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTestUtils.java
new file mode 100644
index 0000000000..ce5f92724f
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConfigTestUtils.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+
+import java.util.List;
+
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.Command;
+
+public class ConfigTestUtils
+{
+ public static <C extends Command> void assertCommandForClient(final List<CommandForClient> commandsForClients, final int index, final String expectedRegisteredClientName, final Class<C> expectedCommandClass)
+ {
+ final CommandForClient commandForClient = commandsForClients.get(index);
+ assertEquals(expectedRegisteredClientName, commandForClient.getClientName());
+ final Command command = commandForClient.getCommand();
+ assertTrue("Command " + index + " is of class " + command.getClass() + " but expecting " + expectedCommandClass,
+ expectedCommandClass.isAssignableFrom(command.getClass()));
+ }
+
+ public static <C extends Command> void assertCommandEquals(final List<Command> commands, final int index, final Class<C> expectedCommandClass)
+ {
+ @SuppressWarnings("unchecked")
+ C command = (C) getCommand(commands, index); //explicit cast added to get round oracle compiler bug (id 6302954)
+ assertTrue("Command " + index + " is of class " + command.getClass() + " but expecting " + expectedCommandClass,
+ expectedCommandClass.isAssignableFrom(command.getClass()));
+ }
+
+ public static <C extends Command> C getCommand(final List<Command> commands, final int index)
+ {
+ @SuppressWarnings("unchecked")
+ C command = (C) commands.get(index);
+ return command;
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConnectionConfigTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConnectionConfigTest.java
new file mode 100644
index 0000000000..7c839ed462
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConnectionConfigTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.assertCommandEquals;
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.getCommand;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+
+public class ConnectionConfigTest extends TestCase
+{
+ private static final String CONNECTION_FACTORY_NAME = "ConnectionFactoryName";
+ private static final String CONNECTION_NAME = "ConnectionName";
+
+ public void testConnectionConfigHasZeroArgConstructorForGson()
+ {
+ ConnectionConfig c = new ConnectionConfig();
+ assertNotNull(c);
+ }
+
+ public void testCreateCommandsForConnectionAndChildren()
+ {
+ ConnectionConfig connectionConfig = createConnectionConfigWithChildCommands();
+
+ List<Command> commands = connectionConfig.createCommands();
+ assertEquals(3, commands.size());
+
+ assertCommandEquals(commands, 0, CreateConnectionCommand.class);
+ assertCommandEquals(commands, 1, NoOpCommand.class);
+ assertCommandEquals(commands, 2, NoOpCommand.class);
+
+ CreateConnectionCommand createConnectionCommand = getCommand(commands, 0);
+ assertEquals(CONNECTION_NAME, createConnectionCommand.getConnectionName());
+ assertEquals(CONNECTION_FACTORY_NAME, createConnectionCommand.getConnectionFactoryName());
+ }
+
+ public void testGetTotalNumberOfParticipants()
+ {
+ ConnectionConfig connectionConfig = createConnectionConfigWithTwoParticipants();
+ assertEquals(2, connectionConfig.getTotalNumberOfParticipants());
+ }
+
+ private ConnectionConfig createConnectionConfigWithTwoParticipants()
+ {
+ SessionConfig sessionConfig1 = mock(SessionConfig.class);
+ SessionConfig sessionConfig2 = mock(SessionConfig.class);
+
+ when(sessionConfig1.getTotalNumberOfParticipants()).thenReturn(1);
+ when(sessionConfig2.getTotalNumberOfParticipants()).thenReturn(1);
+
+ ConnectionConfig connectionConfig = new ConnectionConfig(CONNECTION_NAME, CONNECTION_FACTORY_NAME, sessionConfig1, sessionConfig2);
+
+ return connectionConfig;
+ }
+
+ private ConnectionConfig createConnectionConfigWithChildCommands()
+ {
+ SessionConfig sessionConfig = mock(SessionConfig.class);
+
+ NoOpCommand cmd1 = mock(NoOpCommand.class);
+ NoOpCommand cmd2 = mock(NoOpCommand.class);
+ List<Command> commands = Arrays.asList((Command)cmd1, (Command)cmd2);
+ when(sessionConfig.createCommands(CONNECTION_NAME)).thenReturn(commands);
+
+ return new ConnectionConfig(CONNECTION_NAME, CONNECTION_FACTORY_NAME, sessionConfig);
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConsumerConfigTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConsumerConfigTest.java
new file mode 100644
index 0000000000..c011ff4711
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ConsumerConfigTest.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+
+public class ConsumerConfigTest extends TestCase
+{
+ public void testConsumerHasZeroArgConstructorForGson()
+ {
+ ConsumerConfig c = new ConsumerConfig();
+ assertNotNull(c);
+ }
+
+ public void testCreateConsumerCommand()
+ {
+ boolean isTopic = true;
+ boolean isDurableSubscription = true;
+ boolean isBrowsingSubscription = true;
+ boolean noLocal = true;
+ long numberOfMessages = 100;
+ String consumerName = "consumerName";
+ String sessionName = "sessionName";
+ String destinationName = "destinationName";
+ String selector = "selector";
+ int batchSize = 10;;
+ long maximumDuration = 50;
+ boolean isSynchronousNonDefault = false;
+
+ ConsumerConfig consumerConfig = new ConsumerConfig(
+ consumerName,
+ destinationName,
+ numberOfMessages,
+ batchSize,
+ maximumDuration,
+ isTopic,
+ isDurableSubscription,
+ isBrowsingSubscription,
+ selector,
+ noLocal,
+ isSynchronousNonDefault);
+
+ CreateConsumerCommand createConsumerCommand = consumerConfig.createCommand(sessionName);
+
+ assertEquals(sessionName, createConsumerCommand.getSessionName());
+ assertEquals(consumerName, createConsumerCommand.getParticipantName());
+ assertEquals(destinationName, createConsumerCommand.getDestinationName());
+ assertEquals(numberOfMessages, createConsumerCommand.getNumberOfMessages());
+ assertEquals(batchSize, createConsumerCommand.getBatchSize());
+ assertEquals(maximumDuration, createConsumerCommand.getMaximumDuration());
+
+ assertEquals(isTopic, createConsumerCommand.isTopic());
+ assertEquals(isDurableSubscription, createConsumerCommand.isDurableSubscription());
+ assertEquals(isBrowsingSubscription, createConsumerCommand.isBrowsingSubscription());
+ assertEquals(selector, createConsumerCommand.getSelector());
+ assertEquals(noLocal, createConsumerCommand.isNoLocal());
+ assertEquals(isSynchronousNonDefault, createConsumerCommand.isSynchronous());
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/IterationValueTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/IterationValueTest.java
new file mode 100644
index 0000000000..7998eae37e
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/IterationValueTest.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import java.util.Collections;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+
+public class IterationValueTest extends TestCase
+{
+ private static final int MESSAGE_SIZE = 10;
+
+ private CreateProducerCommand _createProducerCommand;
+ private CreateConsumerCommand _createConsumerCommand;
+ private Map<String, String> _iterationValueMap;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _createProducerCommand = mock(CreateProducerCommand.class);
+ _createConsumerCommand = mock(CreateConsumerCommand.class);
+
+ _iterationValueMap = Collections.singletonMap("_messageSize", String.valueOf(MESSAGE_SIZE));
+ }
+
+ public void testApplyPopulatedIterationValueToCommandWithMatchingProperties() throws Exception
+ {
+ IterationValue iterationValue = new IterationValue(_iterationValueMap);
+
+ iterationValue.applyToCommand(_createProducerCommand);
+
+ verify(_createProducerCommand).setMessageSize(MESSAGE_SIZE);
+ }
+
+ public void testApplyPopulatedIterationValueToCommandWithoutMatchingProperties() throws Exception
+ {
+ IterationValue iterationValue = new IterationValue(_iterationValueMap);
+
+ iterationValue.applyToCommand(_createConsumerCommand);
+
+ verifyZeroInteractions(_createConsumerCommand);
+ }
+
+ public void testApplyUnpopulatedIterationValueToCommand() throws Exception
+ {
+ IterationValue iterationValue = new IterationValue();
+
+ iterationValue.applyToCommand(_createProducerCommand);
+
+ verifyZeroInteractions(_createProducerCommand);
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/MessageProviderConfigTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/MessageProviderConfigTest.java
new file mode 100644
index 0000000000..a3b367a4b4
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/MessageProviderConfigTest.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+
+public class MessageProviderConfigTest extends TestCase
+{
+ public void testCreateCommandsForMessageProvider()
+ {
+ Map<String, PropertyValue> messageProperties = new HashMap<String, PropertyValue>();
+ messageProperties.put("test", new SimplePropertyValue("testValue"));
+ MessageProviderConfig config = new MessageProviderConfig("test", messageProperties);
+ CreateMessageProviderCommand command = config.createCommand();
+ assertNotNull("Command should not be null", command);
+ assertNotNull("Unexpected name", command.getProviderName());
+ assertEquals("Unexpected properties", messageProperties, command.getMessageProperties());
+ }
+
+ public void testMessageProviderConfig()
+ {
+ Map<String, PropertyValue> messageProperties = new HashMap<String, PropertyValue>();
+ messageProperties.put("test", new SimplePropertyValue("testValue"));
+ MessageProviderConfig config = new MessageProviderConfig("test", messageProperties);
+ assertEquals("Unexpected name", "test", config.getName());
+ assertEquals("Unexpected properties", messageProperties, config.getMessageProperties());
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java
new file mode 100644
index 0000000000..b9e591f113
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Message;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+
+public class ProducerConfigTest extends TestCase
+{
+ public void testProducerHasZeroArgConstructorForGson()
+ {
+ ProducerConfig p = new ProducerConfig();
+ assertNotNull(p);
+ }
+
+ public void testConfigProvidesJmsDefaults()
+ {
+ CreateProducerCommand p = new ProducerConfig().createCommand("session1");
+ assertEquals(Message.DEFAULT_DELIVERY_MODE, p.getDeliveryMode());
+ assertEquals(Message.DEFAULT_PRIORITY, p.getPriority());
+ assertEquals(Message.DEFAULT_TIME_TO_LIVE, p.getTimeToLive());
+ }
+
+ public void testCreateProducerCommand()
+ {
+ String destination = "url:/destination";
+ int messageSize = 1000;
+ int numberOfMessages = 10;
+ int priority = 4;
+ long timeToLive = 10000;
+ int batchSize = 5;
+ long interval = 60;
+ long maximumDuration = 70;
+ long startDelay = 80;
+ String providerName = "testProvider1";
+
+ ProducerConfig producerConfig = new ProducerConfig(
+ "producer1",
+ destination,
+ numberOfMessages,
+ batchSize,
+ maximumDuration,
+ DeliveryMode.NON_PERSISTENT,
+ messageSize,
+ priority,
+ timeToLive,
+ interval,
+ startDelay,
+ providerName);
+
+ CreateProducerCommand command = producerConfig.createCommand("session1");
+
+ assertEquals("session1", command.getSessionName());
+ assertEquals("producer1", command.getParticipantName());
+ assertEquals(destination, command.getDestinationName());
+ assertEquals(numberOfMessages, command.getNumberOfMessages());
+ assertEquals(batchSize, command.getBatchSize());
+ assertEquals(maximumDuration, command.getMaximumDuration());
+
+ assertEquals(DeliveryMode.NON_PERSISTENT, command.getDeliveryMode());
+ assertEquals(messageSize, command.getMessageSize());
+ assertEquals(priority, command.getPriority());
+ assertEquals(timeToLive, command.getTimeToLive());
+ assertEquals(interval, command.getInterval());
+ assertEquals(startDelay, command.getStartDelay());
+ assertEquals(providerName, command.getMessageProviderName());
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/SessionConfigTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/SessionConfigTest.java
new file mode 100644
index 0000000000..8775e4064d
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/SessionConfigTest.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.assertCommandEquals;
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.getCommand;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.jms.Session;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+
+public class SessionConfigTest extends TestCase
+{
+ private static final String CONNECTION_NAME = "conn1";
+ private static final String SESSION = "session1";
+
+ public void testSessionHasZeroArgConstructorForGson()
+ {
+ SessionConfig s = new SessionConfig();
+ assertNotNull(s);
+ }
+
+ public void testCreateCommandsForSessionAndChildren()
+ {
+ SessionConfig sessionConfig = createSessionConfigWithChildCommands();
+
+ List<Command> commands = sessionConfig.createCommands(CONNECTION_NAME);
+ assertEquals(3, commands.size());
+
+ assertCommandEquals(commands, 0, CreateSessionCommand.class);
+ assertCommandEquals(commands, 1, CreateProducerCommand.class);
+ assertCommandEquals(commands, 2, CreateConsumerCommand.class);
+
+ CreateSessionCommand createSessionCommand = getCommand(commands, 0);
+ assertEquals(Session.AUTO_ACKNOWLEDGE, createSessionCommand.getAcknowledgeMode());
+ assertEquals(SESSION, createSessionCommand.getSessionName());
+ assertEquals(CONNECTION_NAME, createSessionCommand.getConnectionName());
+ }
+
+ public void testGetTotalNumberOfParticipants()
+ {
+ SessionConfig sessionConfig = createSessionConfigWithOneConsumerAndOneProducer();
+ assertEquals(2, sessionConfig.getTotalNumberOfParticipants());
+ }
+
+ private SessionConfig createSessionConfigWithOneConsumerAndOneProducer()
+ {
+ return createSessionConfigWithChildCommands();
+ }
+
+ private SessionConfig createSessionConfigWithChildCommands()
+ {
+ ProducerConfig producerConfig = mock(ProducerConfig.class);
+ ConsumerConfig consumerConfig = mock(ConsumerConfig.class);
+
+ when(producerConfig.createCommand(SESSION)).thenReturn(mock(CreateProducerCommand.class));
+ when(consumerConfig.createCommand(SESSION)).thenReturn(mock(CreateConsumerCommand.class));
+
+ return new SessionConfig(SESSION,
+ Session.AUTO_ACKNOWLEDGE,
+ Collections.singletonList(consumerConfig),
+ Collections.singletonList(producerConfig));
+ }
+
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestConfigTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestConfigTest.java
new file mode 100644
index 0000000000..1212a57606
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestConfigTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.apache.qpid.disttest.controller.config.ConfigTestUtils.assertCommandForClient;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.NoOpCommand;
+
+public class TestConfigTest extends TestCase
+{
+ private static final QueueConfig[] EMPTY_QUEUES_ARRAY = new QueueConfig[0];
+ private static final String CLIENT1 = "client1";
+ private static final String CLIENT2 = "client2";
+ private static final String TEST1 = "test1";
+
+ public void testConfigHasZeroArgConstructorForGson()
+ {
+ TestConfig c = new TestConfig();
+ assertNotNull(c);
+ }
+
+ public void testCreateCommandsForClient()
+ {
+ TestConfig config = createTestConfigWithClientConfigReturningChildCommands();
+
+ List<CommandForClient> commandsForClients = config.createCommands();
+ assertEquals("Unexpected number of commands for client", 3, commandsForClients.size());
+
+ assertCommandForClient(commandsForClients, 0, CLIENT1, NoOpCommand.class);
+ assertCommandForClient(commandsForClients, 1, CLIENT1, NoOpCommand.class);
+ assertCommandForClient(commandsForClients, 2, CLIENT2, NoOpCommand.class);
+ }
+
+ public void testGetClientNames()
+ {
+ TestConfig config = createTestConfigWithTwoClients();
+
+ assertEquals(2, config.getClientNames().size());
+ }
+
+ public void testGetTotalNumberOfClients()
+ {
+ TestConfig config = createTestConfigWithTwoClients();
+ assertEquals(2, config.getTotalNumberOfClients());
+ }
+
+ public void testGetTotalNumberOfParticipants()
+ {
+ TestConfig config = createTestConfigWithTwoClients();
+ assertEquals(2, config.getTotalNumberOfParticipants());
+ }
+
+ private TestConfig createTestConfigWithClientConfigReturningChildCommands()
+ {
+ ClientConfig clientConfig1 = createClientConfigReturningCommands(CLIENT1, 2);
+ ClientConfig clientConfig2 = createClientConfigReturningCommands(CLIENT2, 1);
+
+ TestConfig config = new TestConfig(TEST1, new ClientConfig[] { clientConfig1, clientConfig2 }, EMPTY_QUEUES_ARRAY);
+ return config;
+ }
+
+ private ClientConfig createClientConfigReturningCommands(final String clientName, int numberOfCommands)
+ {
+ ClientConfig clientConfig = mock(ClientConfig.class);
+
+ List<CommandForClient> commandList = new ArrayList<CommandForClient>();
+
+ for (int i = 1 ; i <= numberOfCommands; i++)
+ {
+ commandList.add(new CommandForClient(clientName, new NoOpCommand()));
+ }
+
+ when(clientConfig.createCommands()).thenReturn(commandList);
+ return clientConfig;
+ }
+
+ private TestConfig createTestConfigWithTwoClients()
+ {
+ ClientConfig clientConfig1 = mock(ClientConfig.class);
+ ClientConfig clientConfig2 = mock(ClientConfig.class);
+
+ when(clientConfig1.getTotalNumberOfParticipants()).thenReturn(1);
+ when(clientConfig2.getTotalNumberOfParticipants()).thenReturn(1);
+
+ TestConfig config = new TestConfig(TEST1, new ClientConfig[] { clientConfig1, clientConfig2 }, EMPTY_QUEUES_ARRAY);
+ return config;
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestInstanceTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestInstanceTest.java
new file mode 100644
index 0000000000..928fbe58cf
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/TestInstanceTest.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.controller.config;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.controller.CommandForClient;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+
+public class TestInstanceTest extends TestCase
+{
+ private static final String CLIENT_NAME = "CLIENT_NAME";
+ private static final int ITERATION_NUMBER = 0;
+
+ private NoOpCommand _noOpCommand;
+ private CreateProducerCommand _createProducerCommand;
+ private CreateConsumerCommand _createConsumerCommand;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _noOpCommand = mock(NoOpCommand.class);
+ _createProducerCommand = mock(CreateProducerCommand.class);
+ _createConsumerCommand = mock(CreateConsumerCommand.class);
+ }
+
+ public void testCreateCommandsWithIterationValues()
+ {
+ IterationValue iterationValue = mock(IterationValue.class);
+
+ TestConfig config = createTestConfig();
+
+ TestInstance testInstance = new TestInstance(config, ITERATION_NUMBER, iterationValue);
+
+ List<CommandForClient> commandsForClients = testInstance.createCommands();
+ assertEquals("Unexpected number of commands for client", 3, commandsForClients.size());
+
+ verify(iterationValue).applyToCommand(_noOpCommand);
+ verify(iterationValue).applyToCommand(_createProducerCommand);
+ verify(iterationValue).applyToCommand(_createConsumerCommand);
+ }
+
+ public void testCreateCommandsWithoutIterationValues()
+ {
+ TestConfig config = createTestConfig();
+ TestInstance testInstance = new TestInstance(config);
+
+ List<CommandForClient> commandsForClients = testInstance.createCommands();
+ assertEquals("Unexpected number of commands for client", 3, commandsForClients.size());
+ }
+
+ public void testGetConfiguredClientNames()
+ {
+ TestConfig testConfig = mock(TestConfig.class);
+ when(testConfig.getClientNames()).thenReturn(Collections.singletonList(CLIENT_NAME));
+ TestInstance testInstance = new TestInstance(testConfig);
+
+ List<String> clientNames = testInstance.getClientNames();
+ assertEquals(1, clientNames.size());
+ assertEquals(CLIENT_NAME, clientNames.get(0));
+ }
+
+ private TestConfig createTestConfig()
+ {
+ CommandForClient commandForClient1 = new CommandForClient(CLIENT_NAME, _noOpCommand);
+ CommandForClient commandForClient2 = new CommandForClient(CLIENT_NAME, _createProducerCommand);
+ CommandForClient commandForClient3 = new CommandForClient(CLIENT_NAME, _createConsumerCommand);
+
+ TestConfig config = mock(TestConfig.class);
+ when(config.createCommands()).thenReturn(Arrays.asList(commandForClient1, commandForClient2, commandForClient3));
+
+ return config;
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/sampleConfig.json b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/sampleConfig.json
new file mode 100644
index 0000000000..9e1168129b
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/sampleConfig.json
@@ -0,0 +1,72 @@
+{
+ "_tests": [
+ {
+ "_name": "Test 1",
+ "_queues": [
+ {
+ "_name": "Json-Queue-Name",
+ "_durable": false,
+ "_attributes": {}
+ },
+ {
+ "_name": "Json Queue Name 2",
+ "_durable": true,
+ "_attributes": {
+ "x-qpid-priorities": 10.0
+ }
+ }
+ ],
+ "_iterations": [
+ {
+ "_messageSize": 100,
+ "_numberOfMessages": 10
+ },
+ {
+ "_messageSize": 200,
+ "_numberOfMessages": 5
+ }
+ ],
+ "_clients": [
+ {
+ "_connections": [
+ {
+ "_name": "connection1",
+ "_sessions": []
+ }
+ ];
+ "_messageProviders":[
+ {
+ "_name": "testProvider1";
+ "_messageProperties": {
+ "priority": {"@def": "list"; "_items": [1,2,3,4,4]};
+ "id": {"@def": "random"; "_upper": 10};
+ "test": "test-value"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Test 2",
+ "_queues": [
+ {
+ "_name": "Json-Queue-Name",
+ "_durable": false,
+ "_attributes": {}
+ }
+ ],
+ "_iterations": [],
+ "_clients": [
+ {
+ "_connections": [
+ {
+ "_name": "connection1",
+ "_sessions": []
+ }
+ ]
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/jms/JmsMessageAdaptorTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/jms/JmsMessageAdaptorTest.java
new file mode 100644
index 0000000000..ab0f52263b
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/jms/JmsMessageAdaptorTest.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.jms;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+
+public class JmsMessageAdaptorTest extends TestCase
+{
+
+ public void testCheckAllCommandTypes()
+ {
+ for (CommandType commandType : CommandType.values())
+ {
+ Class<? extends Command> clazz = JmsMessageAdaptor.getCommandClassFromType(commandType);
+ assertNotNull(clazz);
+
+ }
+
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/message/JsonHandlerTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/message/JsonHandlerTest.java
new file mode 100644
index 0000000000..4a56fff8fe
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/message/JsonHandlerTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.message;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.qpid.disttest.client.property.ListPropertyValue;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.json.JsonHandler;
+
+public class JsonHandlerTest extends TestCase
+{
+ private JsonHandler _jsonHandler = null;
+ private SendChristmasCards _testCommand = null;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _jsonHandler = new JsonHandler();
+
+ _testCommand = new SendChristmasCards(CommandType.START_TEST, Collections.singletonMap(SendChristmasCards.CardType.FUNNY, 5));
+ _testCommand.persons = Arrays.asList(new Person("Phil"), new Person("Andrew"));
+ }
+
+ public void testMarshallUnmarshall() throws Exception
+ {
+ final String jsonString = _jsonHandler.marshall(_testCommand);
+
+ final SendChristmasCards unmarshalledCommand = _jsonHandler.unmarshall(jsonString, SendChristmasCards.class);
+
+ assertEquals("Unmarshalled command should be equal to the original object", _testCommand, unmarshalledCommand);
+ }
+
+ public void testGeneratorDesrialization()
+ {
+ String json = "{_messageProperties: {test: 1; generator: {'@def': 'list'; _cyclic: false; _items: ['first', " +
+ "{'@def': 'range'; _upper:10; '_type':'int'}]}}}";
+ final TestCommand unmarshalledCommand = _jsonHandler.unmarshall(json, TestCommand.class);
+ Map<String, PropertyValue> properties = unmarshalledCommand.getMessageProperties();
+ assertNotNull("Properties should not be null", properties);
+ assertFalse("Properties should not be empty", properties.isEmpty());
+ assertEquals("Unexpected properties size", 2, properties.size());
+ PropertyValue testProperty = properties.get("test");
+ assertNotNull("Unexpected property test", testProperty);
+ assertTrue("Unexpected property test", testProperty.getValue() instanceof Number);
+ assertEquals("Unexpected property value", 1, ((Number)testProperty.getValue()).intValue());
+ Object generatorObject = properties.get("generator");
+ assertTrue("Unexpected generator object", generatorObject instanceof ListPropertyValue);
+ PropertyValue generator = (PropertyValue)generatorObject;
+ assertEquals("Unexpected generator value", "first", generator.getValue());
+ for (int i = 0; i < 10; i++)
+ {
+ assertEquals("Unexpected generator value", new Integer(i), generator.getValue());
+ }
+ String newJson =_jsonHandler.marshall(unmarshalledCommand);
+ final TestCommand newUnmarshalledCommand = _jsonHandler.unmarshall(newJson, TestCommand.class);
+ assertEquals("Unmarshalled command should be equal to the original object", unmarshalledCommand, newUnmarshalledCommand);
+ }
+
+ /**
+ * A {@link Command} designed to exercise {@link JsonHandler}, e.g does it handle a map of enums?.
+ *
+ * This class is non-private to avoid auto-deletion of "unused" fields/methods
+ */
+ static class SendChristmasCards extends Command
+ {
+ enum CardType {FUNNY, TRADITIONAL}
+
+ private Map<CardType, Integer> _cardTypes;
+ private List<Person> persons;
+
+ public SendChristmasCards(final CommandType type, Map<CardType, Integer> cardTypes)
+ {
+ super(type);
+ _cardTypes = cardTypes;
+ }
+
+ public Map<CardType, Integer> getCardTypes()
+ {
+ return _cardTypes;
+ }
+
+ public List<Person> getPersons()
+ {
+ return persons;
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ return EqualsBuilder.reflectionEquals(this, obj);
+ }
+ }
+
+ /**
+ * This class is non-private to avoid auto-deletion of "unused" fields/methods
+ */
+ static class Person
+ {
+ private String _firstName;
+
+ public Person(final String firstName)
+ {
+ _firstName = firstName;
+ }
+
+ public String getFirstName()
+ {
+ return _firstName;
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ return EqualsBuilder.reflectionEquals(this, obj);
+ }
+
+ }
+
+ /**
+ * Yet another test class
+ */
+ static class TestCommand extends Command
+ {
+
+ private Map<String, PropertyValue> _messageProperties;
+
+ public TestCommand(CommandType type)
+ {
+ super(type);
+ }
+
+ public Map<String, PropertyValue> getMessageProperties()
+ {
+ return _messageProperties;
+ }
+
+ public void setMessageProperties(Map<String, PropertyValue> _messageProperties)
+ {
+ this._messageProperties = _messageProperties;
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ if (obj == null || !(obj instanceof TestCommand))
+ {
+ return false;
+ }
+ TestCommand other = (TestCommand)obj;
+ if (_messageProperties == null && other._messageProperties != null )
+ {
+ return false;
+ }
+ return _messageProperties.equals(other._messageProperties);
+ }
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/message/ParticipantResultTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/message/ParticipantResultTest.java
new file mode 100644
index 0000000000..12731c06f4
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/message/ParticipantResultTest.java
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.message;
+
+import static org.apache.qpid.disttest.message.ParticipantAttribute.*;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.CONFIGURED_CLIENT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.DELIVERY_MODE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.ERROR_MESSAGE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_BROWSIING_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_DURABLE_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_NO_LOCAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SELECTOR;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SYNCHRONOUS_CONSUMER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_TOPIC;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.ITERATION_NUMBER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.MAXIMUM_DURATION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PAYLOAD_SIZE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.NUMBER_OF_MESSAGES_PROCESSED;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PARTICIPANT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRIORITY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_INTERVAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_START_DELAY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TEST_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TIME_TAKEN;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TIME_TO_LIVE;
+
+import java.util.Date;
+
+import javax.jms.DeliveryMode;
+
+import junit.framework.TestCase;
+
+public class ParticipantResultTest extends TestCase
+{
+
+ public void testSharedParticipantResultAttributes() throws Exception
+ {
+ final String participantName = "PARTICIPANT_NAME1";
+ final String testName = "TEST_NAME1";
+ String clientConfiguredName = "CLIENT_CONFIGURED_NAME";
+ String errorMessage = "errorMessage";
+ int iterationNumber = 1;
+
+ ParticipantResult result = new ParticipantResult();
+
+ long numberOfMessages = 500;
+ long timeTaken = 30;
+ int batchSize = 10;
+
+ long startTime = System.currentTimeMillis();
+ long endTime = startTime + timeTaken;
+ long maximumDuration = 1000;
+
+ int totalNumberOfConsumers = 1;
+ int totalNumberOfProducers = 1;
+
+ int acknowledgeMode = 1;
+
+ result.setParticipantName(participantName);
+ result.setTestName(testName);
+ result.setIterationNumber(iterationNumber);
+ result.setConfiguredClientName(clientConfiguredName);
+
+ result.setAcknowledgeMode(acknowledgeMode);
+ result.setNumberOfMessagesProcessed(numberOfMessages);
+ result.setConfiguredClientName(clientConfiguredName);
+ result.setBatchSize(batchSize);
+
+ result.setStartDate(new Date(startTime));
+ result.setEndDate(new Date(endTime));
+ result.setMaximumDuration(maximumDuration);
+
+ result.setTotalNumberOfConsumers(totalNumberOfConsumers);
+ result.setTotalNumberOfProducers(totalNumberOfProducers);
+
+ result.setErrorMessage(errorMessage);
+
+ assertEquals(participantName, result.getAttributes().get(PARTICIPANT_NAME));
+ assertEquals(testName, result.getAttributes().get(TEST_NAME));
+ assertEquals(iterationNumber, result.getAttributes().get(ITERATION_NUMBER));
+ assertEquals(clientConfiguredName, result.getAttributes().get(CONFIGURED_CLIENT_NAME));
+ assertEquals(numberOfMessages, result.getAttributes().get(NUMBER_OF_MESSAGES_PROCESSED));
+ assertEquals(timeTaken, result.getAttributes().get(TIME_TAKEN));
+ assertEquals(timeTaken, result.getAttributes().get(TIME_TAKEN));
+ assertEquals(timeTaken, result.getAttributes().get(TIME_TAKEN));
+ assertEquals(batchSize, result.getAttributes().get(BATCH_SIZE));
+ assertEquals(maximumDuration, result.getAttributes().get(MAXIMUM_DURATION));
+ assertEquals(totalNumberOfConsumers, result.getAttributes().get(TOTAL_NUMBER_OF_CONSUMERS));
+ assertEquals(totalNumberOfProducers, result.getAttributes().get(TOTAL_NUMBER_OF_PRODUCERS));
+ assertEquals(acknowledgeMode, result.getAttributes().get(ACKNOWLEDGE_MODE));
+ assertEquals(errorMessage, result.getAttributes().get(ERROR_MESSAGE));
+ }
+
+ public void testConsumerParticipantResultAttributes() throws Exception
+ {
+ ConsumerParticipantResult result = new ConsumerParticipantResult();
+
+ boolean topic = true;
+ boolean durable = true;
+ boolean browsingSubscription = false;
+ boolean selector = true;
+ boolean noLocal = false;
+ boolean synchronousConsumer = true;
+
+ result.setTopic(topic);
+ result.setDurableSubscription(durable);
+ result.setBrowsingSubscription(browsingSubscription);
+ result.setSelector(selector);
+ result.setNoLocal(noLocal);
+ result.setSynchronousConsumer(synchronousConsumer);
+
+ assertEquals(topic, result.getAttributes().get(IS_TOPIC));
+ assertEquals(durable, result.getAttributes().get(IS_DURABLE_SUBSCRIPTION));
+ assertEquals(browsingSubscription, result.getAttributes().get(IS_BROWSIING_SUBSCRIPTION));
+ assertEquals(selector, result.getAttributes().get(IS_SELECTOR));
+ assertEquals(noLocal, result.getAttributes().get(IS_NO_LOCAL));
+ assertEquals(synchronousConsumer, result.getAttributes().get(IS_SYNCHRONOUS_CONSUMER));
+ }
+
+ public void testProducerParticipantResultAttributes() throws Exception
+ {
+ ProducerParticipantResult result = new ProducerParticipantResult();
+
+ int priority = 2;
+ long timeToLive = 30;
+ long producerStartDelay = 40;
+ long producerInterval = 50;
+ int messageSize = 60;
+ int deliveryMode = DeliveryMode.PERSISTENT;
+
+ result.setPriority(priority);
+ result.setTimeToLive(timeToLive);
+ result.setStartDelay(producerStartDelay);
+ result.setInterval(producerInterval);
+ result.setPayloadSize(messageSize);
+ result.setDeliveryMode(deliveryMode);
+
+
+ assertEquals(priority, result.getAttributes().get(PRIORITY));
+ assertEquals(timeToLive, result.getAttributes().get(TIME_TO_LIVE));
+ assertEquals(producerStartDelay, result.getAttributes().get(PRODUCER_START_DELAY));
+ assertEquals(producerInterval, result.getAttributes().get(PRODUCER_INTERVAL));
+ assertEquals(messageSize, result.getAttributes().get(PAYLOAD_SIZE));
+ assertEquals(deliveryMode, result.getAttributes().get(DELIVERY_MODE));
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/AggregatorTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/AggregatorTest.java
new file mode 100644
index 0000000000..393837b4d5
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/AggregatorTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+
+public class AggregatorTest extends TestCase
+{
+ private Aggregator _aggregator = new Aggregator();
+ private TestResultAggregator _testResultAggregator = mock(TestResultAggregator.class);
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _aggregator.setTestResultAggregator(_testResultAggregator);
+ }
+
+ public void testAggregrateManyTestResults() throws Exception
+ {
+ ResultsForAllTests resultsForAllTests = mock(ResultsForAllTests.class);
+ ITestResult testResult1 = mock(ITestResult.class);
+ ITestResult testResult2 = mock(ITestResult.class);
+
+ when(resultsForAllTests.getTestResults()).thenReturn(Arrays.asList(testResult1, testResult2));
+ when(_testResultAggregator.aggregateTestResult(testResult1)).thenReturn(mock(AggregatedTestResult.class));
+ when(_testResultAggregator.aggregateTestResult(testResult2)).thenReturn(mock(AggregatedTestResult.class));
+
+ ResultsForAllTests aggregatedResultsForAllTests = _aggregator.aggregateResults(resultsForAllTests);
+ assertEquals(2, aggregatedResultsForAllTests.getTestResults().size());
+
+ verify(_testResultAggregator).aggregateTestResult(testResult1);
+ verify(_testResultAggregator).aggregateTestResult(testResult2);
+
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregatorTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregatorTest.java
new file mode 100644
index 0000000000..72743be1d1
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/ParticipantResultAggregatorTest.java
@@ -0,0 +1,272 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.Date;
+
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.ParticipantResultAggregator;
+
+import junit.framework.TestCase;
+
+public class ParticipantResultAggregatorTest extends TestCase
+{
+ private ParticipantResultAggregator _aggregator = new ParticipantResultAggregator(ParticipantResult.class, AGGREGATED_RESULT_NAME);
+
+ private static final String TEST_NAME = "TEST_NAME";
+ private static final String AGGREGATED_RESULT_NAME = "AGGREGATED_RESULT_NAME";
+ private static final int TEST_ITERATION_NUMBER = 1;
+
+ private static final long PARTICIPANT1_STARTDATE = 50;
+ private static final long PARTICIPANT1_ENDDATE = 20000;
+ private static final long PARTICIPANT1_TOTAL_PROCESSED = 1024;
+
+ private static final long PARTICIPANT2_STARTDATE = 100;
+ private static final long PARTICIPANT2_ENDDATE = 21000;
+ private static final long PARTICIPANT2_TOTAL_PROCESSED = 2048;
+
+ private static final long OVERALL_PROCESSED = PARTICIPANT1_TOTAL_PROCESSED + PARTICIPANT2_TOTAL_PROCESSED;
+ private static final double OVERALL_TIMETAKEN = PARTICIPANT2_ENDDATE - PARTICIPANT1_STARTDATE;
+
+ private static final double EXPECTED_AGGREGATED_ALL_THROUGHPUT = ((OVERALL_PROCESSED)/1024)/((OVERALL_TIMETAKEN)/1000);
+
+ public void testStartAndEndDateForOneParticipantResult()
+ {
+ ParticipantResult result = new ParticipantResult();
+ result.setStartDate(new Date(PARTICIPANT1_STARTDATE));
+ result.setEndDate(new Date(PARTICIPANT1_ENDDATE));
+
+ _aggregator.aggregate(result);
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(PARTICIPANT1_STARTDATE, aggregratedResult.getStartInMillis());
+ assertEquals(PARTICIPANT1_ENDDATE, aggregratedResult.getEndInMillis());
+ }
+
+ public void testStartAndEndDateForTwoParticipantResults()
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setStartDate(new Date(PARTICIPANT1_STARTDATE));
+ result1.setEndDate(new Date(PARTICIPANT1_ENDDATE));
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setStartDate(new Date(PARTICIPANT2_STARTDATE));
+ result2.setEndDate(new Date(PARTICIPANT2_ENDDATE));
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(PARTICIPANT1_STARTDATE, aggregratedResult.getStartInMillis());
+ assertEquals(PARTICIPANT2_ENDDATE, aggregratedResult.getEndInMillis());
+ }
+
+ public void testComputeNumberOfMessagesProcessed()
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setNumberOfMessagesProcessed(10);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setNumberOfMessagesProcessed(15);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(25, aggregratedResult.getNumberOfMessagesProcessed());
+ }
+
+ public void testComputeTotalPayloadProcessed()
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setTotalPayloadProcessed(PARTICIPANT1_TOTAL_PROCESSED);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setTotalPayloadProcessed(PARTICIPANT2_TOTAL_PROCESSED);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(OVERALL_PROCESSED, aggregratedResult.getTotalPayloadProcessed());
+ }
+
+ public void testComputeThroughput()
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setStartDate(new Date(PARTICIPANT1_STARTDATE));
+ result1.setEndDate(new Date(PARTICIPANT1_ENDDATE));
+ result1.setTotalPayloadProcessed(PARTICIPANT1_TOTAL_PROCESSED);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setStartDate(new Date(PARTICIPANT2_STARTDATE));
+ result2.setEndDate(new Date(PARTICIPANT2_ENDDATE));
+ result2.setTotalPayloadProcessed(PARTICIPANT2_TOTAL_PROCESSED);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(EXPECTED_AGGREGATED_ALL_THROUGHPUT, aggregratedResult.getThroughput(), 0.1);
+ }
+
+ public void testConstantTestNameAndIterationNumberRolledUp() throws Exception
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setTestName(TEST_NAME);
+ result1.setIterationNumber(TEST_ITERATION_NUMBER);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setTestName(TEST_NAME);
+ result2.setIterationNumber(TEST_ITERATION_NUMBER);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(TEST_ITERATION_NUMBER, aggregratedResult.getIterationNumber());
+ assertEquals(TEST_NAME, aggregratedResult.getTestName());
+ }
+
+ public void testConstantPayloadSizesRolledUp() throws Exception
+ {
+ final int payloadSize = 1024;
+
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setPayloadSize(payloadSize);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setPayloadSize(payloadSize);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(payloadSize, aggregratedResult.getPayloadSize());
+ }
+
+ public void testDifferingPayloadSizesNotRolledUp() throws Exception
+ {
+ final int payload1Size = 1024;
+ final int payload2Size = 2048;
+
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setPayloadSize(payload1Size);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setPayloadSize(payload2Size);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(0, aggregratedResult.getPayloadSize());
+ }
+
+ public void testConstantBatchSizesRolledUp() throws Exception
+ {
+ final int batchSize = 10;
+
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setBatchSize(batchSize);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setBatchSize(batchSize);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(batchSize, aggregratedResult.getBatchSize());
+ }
+
+ public void testDifferingBatchSizesNotRolledUp() throws Exception
+ {
+ final int batch1Size = 10;
+ final int batch2Size = 20;
+
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setBatchSize(batch1Size);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setBatchSize(batch2Size);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(0, aggregratedResult.getBatchSize());
+ }
+
+ public void testConstantAcknowledgeModesRolledUp() throws Exception
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setAcknowledgeMode(Session.DUPS_OK_ACKNOWLEDGE);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setAcknowledgeMode(Session.DUPS_OK_ACKNOWLEDGE);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(Session.DUPS_OK_ACKNOWLEDGE, aggregratedResult.getAcknowledgeMode());
+ }
+
+ public void testDifferingAcknowledgeModesNotRolledUp() throws Exception
+ {
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setBatchSize(Session.AUTO_ACKNOWLEDGE);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setBatchSize(Session.SESSION_TRANSACTED);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(-1, aggregratedResult.getAcknowledgeMode());
+ }
+
+ public void testSumNumberOfConsumerAndProducers() throws Exception
+ {
+ final int expectedNumberOfProducers = 1;
+ final int expectedNumberOfConsumers = 2;
+
+ ParticipantResult result1 = new ParticipantResult();
+ result1.setTotalNumberOfConsumers(1);
+
+ ParticipantResult result2 = new ParticipantResult();
+ result2.setTotalNumberOfConsumers(1);
+
+ ParticipantResult result3 = new ParticipantResult();
+ result2.setTotalNumberOfProducers(1);
+
+ _aggregator.aggregate(result1);
+ _aggregator.aggregate(result2);
+ _aggregator.aggregate(result3);
+
+ ParticipantResult aggregratedResult = _aggregator.getAggregatedResult();
+ assertEquals(expectedNumberOfConsumers, aggregratedResult.getTotalNumberOfConsumers());
+ assertEquals(expectedNumberOfProducers, aggregratedResult.getTotalNumberOfProducers());
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java
new file mode 100644
index 0000000000..a803120cc6
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/aggregation/TestResultAggregatorTest.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.aggregation;
+
+import java.util.Date;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.controller.TestResult;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.AggregatedTestResult;
+import org.apache.qpid.disttest.results.aggregation.TestResultAggregator;
+
+public class TestResultAggregatorTest extends TestCase
+{
+
+ private static final String TEST1_NAME = "TEST1_NAME";
+ private static final int TEST1_ITERATION_NUMBER = 1;
+
+
+ private static final String CONSUMER_PARTICIPANT_NAME1 = "CONSUMER_PARTICIPANT_NAME1";
+ private static final String CONSUMER_PARTICIPANT_NAME2 = "CONSUMER_PARTICIPANT_NAME2";
+
+ private static final String PRODUCER_PARTICIPANT_NAME = "PRODUCER_PARTICIPANT_NAME";
+
+
+ private static final long CONSUMER1_STARTDATE = 50;
+ private static final long CONSUMER1_ENDDATE = 20000;
+
+ private static final long CONSUMER2_STARTDATE = 100;
+ private static final long CONSUMER2_ENDDATE = 21000;
+
+ private static final long PRODUCER_STARTDATE = 0;
+ private static final long PRODUCER_ENDDATE = 19000;
+
+ private static final long NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER = 50;
+ private static final long NUMBER_OF_MESSAGES_CONSUMED_IN_TOTAL = NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER * 2;
+ private static final long NUMBER_OF_MESSAGES_PRODUCED = NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER * 2;
+
+ private static final int PAYLOAD_SIZE = 1024;
+ private static final long TOTAL_PAYLOAD_PROCESSED_PER_CONSUMER = NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER * PAYLOAD_SIZE;
+ private static final long TOTAL_PAYLOAD_PRODUCED_IN_TOTAL = TOTAL_PAYLOAD_PROCESSED_PER_CONSUMER * 2;
+
+ private static final int EXPECTED_NUMBER_OF_AGGREGATED_RESULTS = 3;
+
+ private static final int BATCH_SIZE = 3;
+
+ private TestResultAggregator _aggregator = new TestResultAggregator();
+
+ public void testAggregateResultsForTwoConsumerAndOneProducer() throws Exception
+ {
+ TestResult originalTestResult = createResultsFromTest();
+
+ int numberOfOriginalParticipantResults = originalTestResult.getParticipantResults().size();
+ int expectedNumberOfResults = numberOfOriginalParticipantResults + EXPECTED_NUMBER_OF_AGGREGATED_RESULTS;
+
+ AggregatedTestResult aggregatedTestResult = _aggregator.aggregateTestResult(originalTestResult);
+
+ aggregatedTestResult.getAllConsumerParticipantResult().getTotalPayloadProcessed();
+ assertEquals(expectedNumberOfResults, aggregatedTestResult.getParticipantResults().size());
+
+ assertMinimalAggregatedResults(
+ aggregatedTestResult.getAllConsumerParticipantResult(),
+ TEST1_NAME, TEST1_ITERATION_NUMBER,
+ BATCH_SIZE, NUMBER_OF_MESSAGES_CONSUMED_IN_TOTAL, 2, 0);
+
+ assertMinimalAggregatedResults(
+ aggregatedTestResult.getAllProducerParticipantResult(),
+ TEST1_NAME, TEST1_ITERATION_NUMBER,
+ BATCH_SIZE, NUMBER_OF_MESSAGES_PRODUCED, 0, 1);
+
+ assertMinimalAggregatedResults(
+ aggregatedTestResult.getAllParticipantResult(),
+ TEST1_NAME, TEST1_ITERATION_NUMBER,
+ BATCH_SIZE, NUMBER_OF_MESSAGES_CONSUMED_IN_TOTAL, 2, 1);
+ }
+
+ public void testAggregateResultsWhenParticipantErrored()
+ {
+ ParticipantResult failedParticipantResult = new ParticipantResult();
+ failedParticipantResult.setParticipantName(PRODUCER_PARTICIPANT_NAME);
+ failedParticipantResult.setErrorMessage("error");
+ TestResult result = new TestResult(TEST1_NAME);
+ result.addParticipantResult(failedParticipantResult);
+
+ AggregatedTestResult aggregatedTestResult = _aggregator.aggregateTestResult(result);
+ assertEquals(TestResultAggregator.AGGREGATED_ERROR_MESSAGE, aggregatedTestResult.getAllParticipantResult().getErrorMessage());
+ }
+
+ private void assertMinimalAggregatedResults(ParticipantResult result, String expectedTestName, int expectedIterationNumber, int expectedBatchSize, long expectedNumberOfMessagesProcessed, int expectedTotalNumberOfConsumers, int expectedTotalNumberOfProducers)
+ {
+ assertEquals("Unexpected test name in " + result.getParticipantName(), expectedTestName, result.getTestName());
+ assertEquals("Unexpected iteration number in " + result.getParticipantName(), expectedIterationNumber, result.getIterationNumber());
+ assertEquals("Unexpected batch size " + result.getParticipantName(), expectedBatchSize, result.getBatchSize());
+ assertEquals("Unexpected number of messages processed in " + result.getParticipantName(), expectedNumberOfMessagesProcessed, result.getNumberOfMessagesProcessed());
+ assertEquals("Unexpected total number of consumers " + result.getParticipantName(), expectedTotalNumberOfConsumers, result.getTotalNumberOfConsumers());
+ assertEquals("Unexpected total number of producers " + result.getParticipantName(), expectedTotalNumberOfProducers, result.getTotalNumberOfProducers());
+ }
+
+ private TestResult createResultsFromTest()
+ {
+ TestResult testResult = new TestResult(TEST1_NAME);
+
+ ConsumerParticipantResult consumerResult1 = new ConsumerParticipantResult();
+ setPropertiesOn(consumerResult1, TEST1_NAME, TEST1_ITERATION_NUMBER, CONSUMER_PARTICIPANT_NAME1, NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER, BATCH_SIZE, PAYLOAD_SIZE, TOTAL_PAYLOAD_PROCESSED_PER_CONSUMER, CONSUMER1_STARTDATE, CONSUMER1_ENDDATE, 1, 0);
+ testResult.addParticipantResult(consumerResult1);
+
+ ConsumerParticipantResult consumerResult2 = new ConsumerParticipantResult();
+ setPropertiesOn(consumerResult2, TEST1_NAME, TEST1_ITERATION_NUMBER, CONSUMER_PARTICIPANT_NAME2, NUMBER_OF_MESSAGES_PROCESSED_PER_CONSUMER, BATCH_SIZE, PAYLOAD_SIZE, TOTAL_PAYLOAD_PROCESSED_PER_CONSUMER, CONSUMER2_STARTDATE, CONSUMER2_ENDDATE, 1, 0);
+ testResult.addParticipantResult(consumerResult2);
+
+ ParticipantResult producerResult = new ProducerParticipantResult();
+ setPropertiesOn(producerResult, TEST1_NAME, TEST1_ITERATION_NUMBER, PRODUCER_PARTICIPANT_NAME, NUMBER_OF_MESSAGES_PRODUCED, BATCH_SIZE, PAYLOAD_SIZE, TOTAL_PAYLOAD_PRODUCED_IN_TOTAL, PRODUCER_STARTDATE, PRODUCER_ENDDATE, 0, 1);
+ testResult.addParticipantResult(producerResult);
+
+ return testResult;
+ }
+
+ private void setPropertiesOn(ParticipantResult participantResult, String testName, int iterationNumber, String participantName, long numberOfMessagesProcessed, int batchSize, int payloadSize, long totalPayloadProcessed, long start, long end, int totalNumberOfConsumers, int totalNumberOfProducers)
+ {
+ participantResult.setParticipantName(participantName);
+ participantResult.setTestName(testName);
+ participantResult.setIterationNumber(iterationNumber);
+ participantResult.setTotalNumberOfConsumers(totalNumberOfConsumers);
+ participantResult.setTotalNumberOfProducers(totalNumberOfProducers);
+
+ participantResult.setNumberOfMessagesProcessed(numberOfMessagesProcessed);
+ participantResult.setPayloadSize(payloadSize);
+ participantResult.setTotalPayloadProcessed(totalPayloadProcessed);
+ participantResult.setStartDate(new Date(start));
+ participantResult.setEndDate(new Date(end));
+ participantResult.setBatchSize(batchSize);
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java
new file mode 100644
index 0000000000..088746d8cd
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVFormaterTest.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.formatting;
+
+import static org.apache.qpid.disttest.message.ParticipantAttribute.BATCH_SIZE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.CONFIGURED_CLIENT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.*;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.ERROR_MESSAGE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_BROWSIING_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_DURABLE_SUBSCRIPTION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_NO_LOCAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SELECTOR;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_SYNCHRONOUS_CONSUMER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.IS_TOPIC;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.ITERATION_NUMBER;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.MAXIMUM_DURATION;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.NUMBER_OF_MESSAGES_PROCESSED;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PARTICIPANT_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PAYLOAD_SIZE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRIORITY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_INTERVAL;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.PRODUCER_START_DELAY;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TEST_NAME;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.THROUGHPUT;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TIME_TAKEN;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TIME_TO_LIVE;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TOTAL_NUMBER_OF_CONSUMERS;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TOTAL_NUMBER_OF_PRODUCERS;
+import static org.apache.qpid.disttest.message.ParticipantAttribute.TOTAL_PAYLOAD_PROCESSED;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.controller.TestResult;
+import org.apache.qpid.disttest.message.ParticipantAttribute;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.qmf.QMFProperty.AccessCode;
+
+public class CSVFormaterTest extends TestCase
+{
+ private static final String TEST1 = "TEST1";
+ private static final String PARTICIPANT = "PARTICIPANT";
+ private static final String CONFIGURED_CLIENT1 = "CONFIGURED_CLIENT1";
+
+ private CSVFormater _formatter = new CSVFormater();
+
+ public void testResultsFileWithWithOneRow() throws Exception
+ {
+ ParticipantResult participantResult = mock(ParticipantResult.class);
+ Map<ParticipantAttribute, Object> participantAttributes = getParticipantAttributes();
+
+ when(participantResult.getAttributes()).thenReturn(participantAttributes);
+ when(participantResult.getParticipantName()).thenReturn(PARTICIPANT);
+
+ TestResult testResult = new TestResult(TEST1);
+ testResult.addParticipantResult(participantResult);
+
+ ResultsForAllTests resultsForAllTests = new ResultsForAllTests();
+ resultsForAllTests.add(testResult);
+
+ String output = _formatter.format(resultsForAllTests);
+
+ String expectedOutput = readCsvOutputFileAsString("expectedOutput.csv");
+
+ assertEquals(expectedOutput, output);
+ }
+
+ private Map<ParticipantAttribute, Object> getParticipantAttributes()
+ {
+ Map<ParticipantAttribute, Object> participantAttributes = new HashMap<ParticipantAttribute, Object>();
+
+ participantAttributes.put(TEST_NAME, TEST1);
+ participantAttributes.put(ITERATION_NUMBER, 0);
+ participantAttributes.put(CONFIGURED_CLIENT_NAME, CONFIGURED_CLIENT1);
+ participantAttributes.put(PARTICIPANT_NAME, PARTICIPANT);
+ participantAttributes.put(NUMBER_OF_MESSAGES_PROCESSED, 0);
+ participantAttributes.put(PAYLOAD_SIZE, 1);
+ participantAttributes.put(PRIORITY, 2);
+ participantAttributes.put(TIME_TO_LIVE, 3);
+ participantAttributes.put(ACKNOWLEDGE_MODE, 4);
+ participantAttributes.put(DELIVERY_MODE, 5);
+ participantAttributes.put(BATCH_SIZE, 6);
+ participantAttributes.put(MAXIMUM_DURATION, 7);
+ participantAttributes.put(PRODUCER_START_DELAY, 8);
+ participantAttributes.put(PRODUCER_INTERVAL, 9);
+ participantAttributes.put(IS_TOPIC, true);
+ participantAttributes.put(IS_DURABLE_SUBSCRIPTION, false);
+ participantAttributes.put(IS_BROWSIING_SUBSCRIPTION, true);
+ participantAttributes.put(IS_SELECTOR, false);
+ participantAttributes.put(IS_NO_LOCAL, true);
+ participantAttributes.put(IS_SYNCHRONOUS_CONSUMER, false);
+ participantAttributes.put(TOTAL_NUMBER_OF_CONSUMERS, 1);
+ participantAttributes.put(TOTAL_NUMBER_OF_PRODUCERS, 2);
+ participantAttributes.put(TOTAL_PAYLOAD_PROCESSED, 1024);
+ participantAttributes.put(THROUGHPUT, 2048);
+ participantAttributes.put(TIME_TAKEN, 1000);
+ participantAttributes.put(ERROR_MESSAGE, "error");
+
+ return participantAttributes;
+ }
+
+ private String readCsvOutputFileAsString(String filename) throws Exception
+ {
+ InputStream is = getClass().getResourceAsStream(filename);
+ assertNotNull(is);
+
+ StringBuilder output = new StringBuilder();
+
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ String line = null;
+ while((line = br.readLine()) != null)
+ {
+ output.append(line);
+ output.append("\n");
+ }
+
+ return output.toString();
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparatorTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparatorTest.java
new file mode 100644
index 0000000000..6cec4b5245
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/CSVOrderParticipantResultComparatorTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.disttest.results.formatting;
+
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.TestResultAggregator;
+import org.apache.qpid.disttest.results.formatting.CSVOrderParticipantResultComparator;
+
+public class CSVOrderParticipantResultComparatorTest extends TestCase
+{
+ CSVOrderParticipantResultComparator _comparator = new CSVOrderParticipantResultComparator();
+
+ public void testOrderedConsumerParticipants() throws Exception
+ {
+ assertCompare(
+ new ConsumerParticipantResult("apple"),
+ new ConsumerParticipantResult("banana"));
+
+ }
+ public void testProducerPrecedesConsumerParticipants() throws Exception
+ {
+ assertCompare(
+ new ProducerParticipantResult(),
+ new ConsumerParticipantResult());
+ }
+
+ public void testProducerPrecedesAllProducersResult()
+ {
+ assertCompare(
+ new ProducerParticipantResult("participantName"),
+ new ParticipantResult(TestResultAggregator.ALL_PRODUCER_PARTICIPANTS_NAME));
+ }
+
+ public void testConsumerPrecedesAllConsumersResult()
+ {
+ assertCompare(
+ new ConsumerParticipantResult("participantName"),
+ new ParticipantResult(TestResultAggregator.ALL_CONSUMER_PARTICIPANTS_NAME));
+ }
+
+ public void testAllParticipantsPrecedesAllConsumersResult()
+ {
+ assertCompare(
+ new ParticipantResult(TestResultAggregator.ALL_PARTICIPANTS_NAME),
+ new ParticipantResult(TestResultAggregator.ALL_CONSUMER_PARTICIPANTS_NAME));
+ }
+
+ public void testAllParticipantsPrecedesAllProducersResult()
+ {
+ assertCompare(
+ new ParticipantResult(TestResultAggregator.ALL_PARTICIPANTS_NAME),
+ new ParticipantResult(TestResultAggregator.ALL_PRODUCER_PARTICIPANTS_NAME));
+ }
+
+ private void assertCompare(ParticipantResult smaller, ParticipantResult bigger)
+ {
+ assertEquals("Expected " + smaller + " to 'equal' itself",
+ 0,
+ _comparator.compare(smaller, smaller));
+
+ String failureMsg = "Expected " + smaller + " to be smaller than " + bigger;
+
+ assertTrue(failureMsg, _comparator.compare(smaller, bigger) < 0);
+ assertTrue(failureMsg, _comparator.compare(bigger, smaller) > 0);
+ }
+
+}
+// <ParticipantResult>
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv
new file mode 100644
index 0000000000..cfffb1e549
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/formatting/expectedOutput.csv
@@ -0,0 +1,2 @@
+testName,iterationNumber,clientName,participantName,numberOfMessages,payloadSizeB,priority,timeToLiveMs,acknowledgeMode,deliveryMode,batchSize,maximumDurationMs,producerStartDelayMs,producerIntervalMs,isTopic,isDurableSubscription,isBrowsingSubscription,isSelector,isNoLocal,isSynchronousConsumer,totalNumberOfConsumers,totalNumberOfProducers,totalPayloadProcessedB,throughputKbPerS,timeTakenMs,errorMessage
+TEST1,0,CONFIGURED_CLIENT1,PARTICIPANT,0,1,2,3,4,5,6,7,8,9,true,false,true,false,true,false,1,2,1024,2048,1000,error \ No newline at end of file
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/DistributedTestSystemTestBase.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/DistributedTestSystemTestBase.java
new file mode 100644
index 0000000000..96daf64526
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/DistributedTestSystemTestBase.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest;
+
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.JMSException;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
+
+public class DistributedTestSystemTestBase extends QpidBrokerTestCase
+{
+ protected Context _context;
+
+ protected Connection _connection;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ final Properties properties = new Properties();
+ properties.load(DistributedTestSystemTestBase.class.getResourceAsStream("perftests.systests.properties"));
+ _context = new InitialContext(properties);
+
+ _connection = getConnection();
+ _connection.start();
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ // no need to close connections - this is done by superclass
+
+ super.tearDown();
+ }
+
+ public Context getContext()
+ {
+ return _context;
+ }
+
+ @Override
+ public Connection getConnection() throws JMSException, NamingException
+ {
+ final ConnectionFactory connectionFactory = (ConnectionFactory) _context.lookup("connectionfactory");
+ final Connection connection = connectionFactory.createConnection();
+ _connections.add(connection);
+ return connection;
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/QpidQueueCreatorTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/QpidQueueCreatorTest.java
new file mode 100644
index 0000000000..784e43469e
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/QpidQueueCreatorTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jms.Connection;
+import javax.jms.Session;
+
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.client.AMQSession;
+import org.apache.qpid.disttest.DistributedTestException;
+import org.apache.qpid.disttest.controller.config.QueueConfig;
+import org.apache.qpid.disttest.jms.QpidQueueCreator;
+
+public class QpidQueueCreatorTest extends DistributedTestSystemTestBase
+{
+ private static final Map<String, Object> EMPTY_ATTRIBUTES = Collections.emptyMap();
+
+ private QpidQueueCreator _creator;
+ private Session _session;
+ private List<QueueConfig> _configs;
+ private String _queueName;
+
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ Connection connection = getConnection();
+ _session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _creator = new QpidQueueCreator();
+ _configs = new ArrayList<QueueConfig>();
+ _queueName = "direct://amq.direct//" + getTestQueueName();
+ }
+
+ public void testCreateQueueWithoutAttributes() throws Exception
+ {
+ _configs.add(new QueueConfig(_queueName, true, EMPTY_ATTRIBUTES));
+
+ assertQueueBound(_queueName, false);
+
+ _creator.createQueues(_session, _configs);
+
+ assertQueueBound(_queueName, true);
+ }
+
+ public void testCreateWithAttributes() throws Exception
+ {
+ Map<String, Object> attributes = new HashMap<String, Object>();
+ attributes.put("x-qpid-priorities", Integer.valueOf(5));
+ _configs.add(new QueueConfig(_queueName, true, attributes));
+
+ assertQueueBound(_queueName, false);
+
+ _creator.createQueues(_session, _configs);
+
+ assertQueueBound(_queueName, true);
+ }
+
+ public void testDeleteQueues() throws Exception
+ {
+ _configs.add(new QueueConfig(_queueName, true, EMPTY_ATTRIBUTES));
+
+ assertQueueBound(_queueName, false);
+
+ _creator.createQueues(_session, _configs);
+ assertQueueBound(_queueName, true);
+
+ _creator.deleteQueues(_session, _configs);
+ assertQueueBound(_queueName, false);
+ }
+
+ public void testDeleteQueueThatDoesNotExist() throws Exception
+ {
+ String queueThatDoesNotExist = _queueName;
+ List<QueueConfig> configs = new ArrayList<QueueConfig>();
+ Map<String, Object> attributes = Collections.emptyMap();
+ configs.add(new QueueConfig(queueThatDoesNotExist, true, attributes));
+
+ try
+ {
+ _creator.deleteQueues(_session, configs);
+ fail("Exception not thrown");
+ }
+ catch (DistributedTestException e)
+ {
+ // PASS
+ }
+ }
+
+ private void assertQueueBound(String queueName, boolean isBound) throws Exception
+ {
+ AMQDestination destination = (AMQDestination)_session.createQueue(queueName);
+ assertEquals("Queue is not in expected bound state", isBound, ((AMQSession<?, ?>)_session).isQueueBound(destination));
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/SystemTestConstants.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/SystemTestConstants.java
new file mode 100644
index 0000000000..808b428bc9
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/SystemTestConstants.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.disttest;
+
+public abstract class SystemTestConstants
+{
+ public static final long REGISTRATION_TIMEOUT = 5000;
+ public static final long COMMAND_RESPONSE_TIMEOUT = 10000;
+ public static final long TEST_RESULT_TIMEOUT = 5000;
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/BasicDistributedClientTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/BasicDistributedClientTest.java
new file mode 100644
index 0000000000..d599bdc5c4
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/BasicDistributedClientTest.java
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.disttest.clientonly;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.ClientState;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.jms.JmsMessageAdaptor;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.NoOpCommand;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StopClientCommand;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+
+public class BasicDistributedClientTest extends DistributedTestSystemTestBase
+{
+ private Session _session = null;
+ private MessageProducer _clientQueueProducer;
+ private Client _client;
+ private ControllerQueue _controllerQueue;
+ private ClientJmsDelegate _clientJmsDelegate = null;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _controllerQueue = new ControllerQueue(_connection, _context);
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+ _clientJmsDelegate = new ClientJmsDelegate(_context);
+ _client = new Client(_clientJmsDelegate);
+ _client.start();
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ try
+ {
+ _controllerQueue.close();
+ if (_session != null)
+ {
+ _session.close();
+ }
+ }
+ finally
+ {
+ super.tearDown();
+ }
+ }
+
+ public void testClientSendsRegistrationMessage() throws Exception
+ {
+ final RegisterClientCommand regClientCommand = _controllerQueue.getNext();
+
+ assertNotNull("Client must have a non-null name", regClientCommand.getClientName());
+ assertEquals("Unexpected client name", _clientJmsDelegate.getClientName(), regClientCommand.getClientName());
+ assertNotNull("Client queue name should not be null", regClientCommand.getClientQueueName());
+ }
+
+ public void testClientSendsCommandResponses() throws Exception
+ {
+ final RegisterClientCommand registrationCommand = _controllerQueue.getNext();
+ createClientQueueProducer(registrationCommand);
+
+ sendCommandToClient(new NoOpCommand());
+
+ final Response responseCommand = _controllerQueue.getNext();
+ assertEquals("Incorrect client message type", CommandType.RESPONSE, responseCommand.getType());
+ }
+
+ public void testClientCanBeStoppedViaCommand() throws Exception
+ {
+ assertEquals("Expected client to be in STARTED state", ClientState.READY, _client.getState());
+
+ final RegisterClientCommand registrationCommand = _controllerQueue.getNext();
+ createClientQueueProducer(registrationCommand);
+
+ final Command stopClientCommand = new StopClientCommand();
+ sendCommandToClient(stopClientCommand);
+
+ _client.waitUntilStopped(1000);
+
+ Response response = _controllerQueue.getNext();
+ assertNotNull(response);
+ assertFalse("response shouldn't contain error", response.hasError());
+
+ assertEquals("Expected client to be in STOPPED state", ClientState.STOPPED, _client.getState());
+ }
+
+ public void testClientCanCreateTestConnection() throws Exception
+ {
+ assertEquals("Unexpected number of test connections", 0, _clientJmsDelegate.getNoOfTestConnections());
+
+ final RegisterClientCommand registration = _controllerQueue.getNext();
+ createClientQueueProducer(registration);
+
+ final CreateConnectionCommand createConnectionCommand = new CreateConnectionCommand();
+ createConnectionCommand.setConnectionName("newTestConnection");
+ createConnectionCommand.setConnectionFactoryName("connectionfactory");
+
+ sendCommandToClient(createConnectionCommand);
+ Response response = _controllerQueue.getNext();
+
+ assertFalse("Response message should not have indicated an error", response.hasError());
+ assertEquals("Unexpected number of test connections", 1, _clientJmsDelegate.getNoOfTestConnections());
+ }
+
+ public void testClientCanCreateTestSession() throws Exception
+ {
+ assertEquals("Unexpected number of test sessions", 0, _clientJmsDelegate.getNoOfTestSessions());
+
+ final RegisterClientCommand registration = _controllerQueue.getNext();
+ createClientQueueProducer(registration);
+
+ final CreateConnectionCommand createConnectionCommand = new CreateConnectionCommand();
+ createConnectionCommand.setConnectionName("newTestConnection");
+ createConnectionCommand.setConnectionFactoryName("connectionfactory");
+
+ sendCommandToClient(createConnectionCommand);
+ Response response = _controllerQueue.getNext();
+ assertFalse("Response message should not have indicated an error", response.hasError());
+
+ final CreateSessionCommand createSessionCommand = new CreateSessionCommand();
+ createSessionCommand.setConnectionName("newTestConnection");
+ createSessionCommand.setSessionName("newTestSession");
+ createSessionCommand.setAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
+
+ sendCommandToClient(createSessionCommand);
+ response = _controllerQueue.getNext();
+
+ assertFalse("Response message should not have indicated an error", response.hasError());
+ assertEquals("Unexpected number of test sessions", 1, _clientJmsDelegate.getNoOfTestSessions());
+ }
+
+ private void sendCommandToClient(final Command command) throws JMSException
+ {
+ final Message message = JmsMessageAdaptor.commandToMessage(_session, command);
+ _clientQueueProducer.send(message);
+ }
+
+ private void createClientQueueProducer(
+ final RegisterClientCommand registration) throws JMSException
+ {
+ final Destination clientCommandQueue = createDestinationFromRegistration(registration);
+ _clientQueueProducer = _session.createProducer(clientCommandQueue);
+ }
+
+ private Queue createDestinationFromRegistration(
+ final RegisterClientCommand registrationCommand)
+ throws JMSException
+ {
+ String clientQueueName = registrationCommand.getClientQueueName();
+ assertNotNull("Null client queue in register message", clientQueueName);
+ return _session.createQueue(clientQueueName);
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ConsumerParticipantTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ConsumerParticipantTest.java
new file mode 100644
index 0000000000..a3c0430865
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ConsumerParticipantTest.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest.clientonly;
+
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.ConsumerParticipant;
+import org.apache.qpid.disttest.client.ParticipantExecutor;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+import org.apache.qpid.systest.disttest.clientonly.ProducerParticipantTest.TestClientJmsDelegate;
+
+public class ConsumerParticipantTest extends DistributedTestSystemTestBase
+{
+ private MessageProducer _producer;
+ private Session _session;
+ private TestClientJmsDelegate _delegate;
+ private Client _client;
+ private ControllerQueue _controllerQueue;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _controllerQueue = new ControllerQueue(_connection, _context);
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _producer = _session.createProducer(getTestQueue());
+
+ _delegate = new TestClientJmsDelegate(getContext());
+ _client = new Client(_delegate);
+ }
+
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ _controllerQueue.close();
+ super.tearDown();
+ }
+
+ public void testConsumeNumberOfMessagesSynchronously() throws Exception
+ {
+ runTest(Session.AUTO_ACKNOWLEDGE, 10, 0, true);
+ }
+
+ public void testConsumeNumberOfMessagesAsynchronously() throws Exception
+ {
+ runTest(Session.AUTO_ACKNOWLEDGE, 10, 0, false);
+ }
+
+ public void testSelectors() throws Exception
+ {
+ final CreateConsumerCommand command = new CreateConsumerCommand();
+ command.setNumberOfMessages(10);
+ command.setSessionName("testSession");
+ command.setDestinationName(getTestQueueName());
+ command.setSelector("id=1");
+ Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+ _delegate.addConnection("name-does-not-matter", _connection);
+ _delegate.addSession(command.getSessionName(), session);
+
+ ConsumerParticipant consumerParticipant = new ConsumerParticipant(_delegate, command);
+ _delegate.createConsumer(command);
+
+ for (int i = 0; i < 20; i++)
+ {
+ Message message = _session.createMessage();
+ if (i % 2 == 0)
+ {
+ message.setIntProperty("id", 0);
+ }
+ else
+ {
+ message.setIntProperty("id", 1);
+ }
+ _producer.send(message);
+ }
+
+ new ParticipantExecutor(consumerParticipant).start(_client);
+
+ ParticipantResult results = _controllerQueue.getNext();
+ assertNotNull("No results message recieved", results);
+ assertEquals("Unexpected number of messages received", 10, results.getNumberOfMessagesProcessed());
+
+ Session testQueueConsumerSession = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ final MessageConsumer testQueueConsumer = testQueueConsumerSession.createConsumer(getTestQueue());
+ for (int i = 0; i < 10; i++)
+ {
+ Message message = testQueueConsumer.receive(2000);
+ assertNotNull("Message is not received: " + message, message);
+ assertEquals("Unexpected id value", 0, message.getIntProperty("id"));
+ }
+ Message message = testQueueConsumer.receive(2000);
+ assertNull("Unexpected message remaining on test queue: " + message, message);
+
+ _connection.stop();
+ }
+
+ protected void runTest(int acknowledgeMode, int numberOfMessages, int batchSize, boolean synchronous) throws Exception
+ {
+ final CreateConsumerCommand command = new CreateConsumerCommand();
+ command.setNumberOfMessages(numberOfMessages);
+ command.setBatchSize(batchSize);
+ command.setSessionName("testSession");
+ command.setDestinationName(getTestQueueName());
+ command.setSynchronous(synchronous);
+
+ Session session = _connection.createSession(Session.SESSION_TRANSACTED == acknowledgeMode, acknowledgeMode);
+
+ _delegate.addConnection("name-does-not-matter", _connection);
+ _delegate.addSession(command.getSessionName(), session);
+
+ ConsumerParticipant consumerParticipant = new ConsumerParticipant(_delegate, command);
+ _delegate.createConsumer(command);
+
+ for (int i = 0; i < numberOfMessages; i++)
+ {
+ _producer.send(_session.createMessage());
+ }
+
+ new ParticipantExecutor(consumerParticipant).start(_client);
+
+ ParticipantResult results = _controllerQueue.getNext();
+ assertNotNull("No results message recieved", results);
+
+ Session testQueueConsumerSession = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ final MessageConsumer testQueueConsumer = testQueueConsumerSession.createConsumer(getTestQueue());
+ Message message = testQueueConsumer.receive(2000);
+ assertNull("Unexpected message remaining on test queue: " + message, message);
+
+ _connection.stop();
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ControllerQueue.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ControllerQueue.java
new file mode 100644
index 0000000000..7f0c23eb38
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ControllerQueue.java
@@ -0,0 +1,90 @@
+package org.apache.qpid.systest.disttest.clientonly;
+
+import java.util.Map;
+
+import javax.jms.Connection;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.naming.Context;
+
+import junit.framework.Assert;
+
+import org.apache.qpid.disttest.DistributedTestConstants;
+import org.apache.qpid.disttest.jms.JmsMessageAdaptor;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+
+/**
+ * Helper for unit tests to simplify access to the Controller Queue.
+ *
+ * Implicitly creates the queue, so you must create a {@link ControllerQueue} object before
+ * trying to use the underlying queue.
+ */
+public class ControllerQueue
+{
+ private MessageConsumer _controllerQueueMessageConsumer;
+ private Session _controllerQueueSession;
+
+ /**
+ * Implicitly creates the queue, so you must create a {@link ControllerQueue} object before
+ * trying to use the underlying queue.
+ *
+ * @param context used for looking up the controller queue {@link Destination}
+ */
+ public ControllerQueue(Connection connection, Context context) throws Exception
+ {
+ _controllerQueueSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Destination controllerQueue = (Destination) context.lookup(DistributedTestConstants.CONTROLLER_QUEUE_JNDI_NAME);
+ _controllerQueueMessageConsumer = _controllerQueueSession.createConsumer(controllerQueue);
+ }
+
+ public <T extends Command> T getNext(long timeout) throws JMSException
+ {
+ final Message message = _controllerQueueMessageConsumer.receive(timeout);
+ if(message == null)
+ {
+ return null;
+ }
+
+ return (T) JmsMessageAdaptor.messageToCommand(message);
+ }
+
+ public void addNextResponse(Map<CommandType, Command> responses) throws JMSException
+ {
+ Command nextResponse = getNext();
+ responses.put(nextResponse.getType(), nextResponse);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T extends Command> T getNext() throws JMSException
+ {
+ return (T)getNext(true);
+ }
+
+ public <T extends Command> T getNext(boolean assertMessageExists) throws JMSException
+ {
+ final Message message = _controllerQueueMessageConsumer.receive(1000);
+ if(assertMessageExists)
+ {
+ Assert.assertNotNull("No message received from control queue", message);
+ }
+
+ if(message == null)
+ {
+ return null;
+ }
+
+ T command = (T) JmsMessageAdaptor.messageToCommand(message);
+
+ return command;
+ }
+
+ public void close() throws Exception
+ {
+ _controllerQueueMessageConsumer.close();
+ _controllerQueueSession.close();
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/DistributedClientTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/DistributedClientTest.java
new file mode 100644
index 0000000000..4a872a7ee2
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/DistributedClientTest.java
@@ -0,0 +1,323 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.disttest.clientonly;
+
+import static org.apache.qpid.disttest.client.ClientState.READY;
+import static org.apache.qpid.disttest.client.ClientState.RUNNING_TEST;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.ClientState;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.jms.JmsMessageAdaptor;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.CreateConnectionCommand;
+import org.apache.qpid.disttest.message.CreateConsumerCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.CreateSessionCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.disttest.message.StartTestCommand;
+import org.apache.qpid.disttest.message.TearDownTestCommand;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+
+public class DistributedClientTest extends DistributedTestSystemTestBase
+{
+ private static final String TEST_CONSUMER = "newTestConsumer";
+ private static final String TEST_DESTINATION = "newDestination";
+ private static final String TEST_PRODUCER_NAME = "newTestProducer";
+ private static final String TEST_SESSION_NAME = "newTestSession";
+ private static final String TEST_CONNECTION_NAME = "newTestConnection";
+
+ private Session _session = null;
+ private MessageProducer _clientQueueProducer;
+ private Client _client;
+ private ControllerQueue _controllerQueue;
+ protected ClientJmsDelegate _clientJmsDelegate;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _controllerQueue = new ControllerQueue(_connection, _context);
+
+ _clientJmsDelegate = new ClientJmsDelegate(_context);
+ _client = new Client(_clientJmsDelegate);
+ _client.start();
+
+ final RegisterClientCommand registrationCommand = _controllerQueue.getNext();
+ createClientQueueProducer(registrationCommand);
+
+ createTestConnection(TEST_CONNECTION_NAME);
+ createTestSession(TEST_CONNECTION_NAME, TEST_SESSION_NAME);
+
+ assertEquals("Expected no test producers at start of test", 0, _clientJmsDelegate.getNoOfTestProducers());
+ assertEquals("Expected no test consumers at start of test", 0, _clientJmsDelegate.getNoOfTestConsumers());
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ try
+ {
+ _controllerQueue.close();
+ if (_session != null)
+ {
+ _session.close();
+ }
+ }
+ finally
+ {
+ super.tearDown();
+ }
+ }
+
+ public void testClientCanCreateTestProducer() throws Exception
+ {
+ assertEquals("Should initially have zero producers", 0, _clientJmsDelegate.getNoOfTestProducers());
+
+ createTestProducer(TEST_SESSION_NAME, TEST_PRODUCER_NAME, TEST_DESTINATION);
+
+ assertEquals("Should now have one test producer", 1, _clientJmsDelegate.getNoOfTestProducers());
+ }
+
+ public void testClientCanCreateTestConsumer() throws Exception
+ {
+ assertEquals("Should initially have no test consumers", 0, _clientJmsDelegate.getNoOfTestConsumers());
+
+ createTestConsumer(TEST_SESSION_NAME, TEST_CONSUMER, TEST_DESTINATION);
+
+ assertEquals("Should now have one test consumer", 1, _clientJmsDelegate.getNoOfTestConsumers());
+ }
+
+ public void testClientFailsToCreateSessionUsingInvalidConnection() throws Exception
+ {
+ int initialNoOfTestSessions = _clientJmsDelegate.getNoOfTestSessions();
+
+ createTestSession("nonExistentConnection", TEST_SESSION_NAME, false /* shouldSucceed */);
+
+ assertEquals("Number of test sessions should not have changed", initialNoOfTestSessions, _clientJmsDelegate.getNoOfTestSessions());
+ }
+
+ public void testClientFailsToCreateProducerUsingInvalidSession() throws Exception
+ {
+ int initialNoOfTestProducers = _clientJmsDelegate.getNoOfTestProducers();
+
+ createTestProducer("invalidSessionName", TEST_PRODUCER_NAME, TEST_DESTINATION, false /* shouldSucceed */);
+
+ assertEquals("Number of test producers should not have changed", initialNoOfTestProducers, _clientJmsDelegate.getNoOfTestProducers());
+ }
+
+ public void testClientFailsToCreateConsumerUsingInvalidSession() throws Exception
+ {
+ int initialNoOfTestConsumers = _clientJmsDelegate.getNoOfTestConsumers();
+
+ createTestConsumer("invalidSessionName", TEST_CONSUMER, TEST_DESTINATION, false /* shouldSucceed */);
+
+ assertEquals("Number of test consumers should not have changed", initialNoOfTestConsumers, _clientJmsDelegate.getNoOfTestConsumers());
+ }
+
+ public void testClientCanStartPerformingTests() throws Exception
+ {
+ createTestProducer(TEST_SESSION_NAME, TEST_PRODUCER_NAME, TEST_DESTINATION);
+
+ sendCommandToClient(new StartTestCommand());
+
+ validateStartTestResponseAndParticipantResults(CommandType.PRODUCER_PARTICIPANT_RESULT);
+
+ assertState(_client, RUNNING_TEST);
+ }
+
+ public void testParticipantsSendResults() throws JMSException
+ {
+ createTestProducer(TEST_SESSION_NAME, TEST_PRODUCER_NAME, TEST_DESTINATION);
+
+ sendCommandToClient(new StartTestCommand());
+
+ validateStartTestResponseAndParticipantResults(CommandType.PRODUCER_PARTICIPANT_RESULT);
+ }
+
+ /**
+ * Need to validate both of these responses together because their order is non-deterministic
+ * @param expectedParticipantResultCommandType TODO
+ */
+ private void validateStartTestResponseAndParticipantResults(CommandType expectedParticipantResultCommandType) throws JMSException
+ {
+ Map<CommandType, Command> responses = new HashMap<CommandType, Command>();
+ _controllerQueue.addNextResponse(responses);
+ _controllerQueue.addNextResponse(responses);
+
+ ParticipantResult results = (ParticipantResult) responses.get(expectedParticipantResultCommandType);
+ validateResponse(null, results, true);
+
+ Response startTestResponse = (Response) responses.get(CommandType.RESPONSE);
+ validateResponse(CommandType.START_TEST, startTestResponse, true);
+ }
+
+ public void testClientCannotStartPerformingTestsInNonReadyState() throws Exception
+ {
+ assertState(_client, READY);
+ sendCommandAndValidateResponse(new StartTestCommand(), true);
+ assertState(_client, RUNNING_TEST);
+
+ // Send another start test command
+ sendCommandAndValidateResponse(new StartTestCommand(), false /*should reject duplicate start command*/);
+ assertState(_client, RUNNING_TEST);
+ }
+
+ public void testNonRunningClientIsUnaffectedByStopTestCommand() throws Exception
+ {
+ assertState(_client, READY);
+
+ sendCommandAndValidateResponse(new TearDownTestCommand(), false);
+
+ assertState(_client, READY);
+ }
+
+ private void sendCommandToClient(final Command command) throws JMSException
+ {
+ final Message message = JmsMessageAdaptor.commandToMessage(_session, command);
+ _clientQueueProducer.send(message);
+ }
+
+ private void sendCommandAndValidateResponse(final Command command, boolean shouldSucceed) throws JMSException
+ {
+ sendCommandToClient(command);
+ Response response = _controllerQueue.getNext();
+ validateResponse(command.getType(), response, shouldSucceed);
+ }
+
+ private void sendCommandAndValidateResponse(final Command command) throws JMSException
+ {
+ sendCommandAndValidateResponse(command, true);
+ }
+
+ private void createTestConnection(String connectionName) throws Exception
+ {
+ int initialNumberOfConnections = _clientJmsDelegate.getNoOfTestConnections();
+
+ final CreateConnectionCommand createConnectionCommand = new CreateConnectionCommand();
+ createConnectionCommand.setConnectionName(connectionName);
+ createConnectionCommand.setConnectionFactoryName("connectionfactory");
+
+ sendCommandAndValidateResponse(createConnectionCommand);
+
+ int expectedNumberOfConnections = initialNumberOfConnections + 1;
+
+ assertEquals("unexpected number of test connections", expectedNumberOfConnections, _clientJmsDelegate.getNoOfTestConnections());
+ }
+
+ private void createTestSession(String connectionName, String sessionName, boolean shouldSucceed) throws Exception
+ {
+ int initialNumberOfSessions = _clientJmsDelegate.getNoOfTestSessions();
+
+ final CreateSessionCommand createSessionCommand = new CreateSessionCommand();
+ createSessionCommand.setConnectionName(connectionName);
+ createSessionCommand.setSessionName(sessionName);
+ createSessionCommand.setAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
+
+ sendCommandAndValidateResponse(createSessionCommand, shouldSucceed);
+
+ int expectedNumberOfSessions = initialNumberOfSessions + (shouldSucceed ? 1 : 0);
+
+ assertEquals("unexpected number of test sessions", expectedNumberOfSessions, _clientJmsDelegate.getNoOfTestSessions());
+ }
+
+ private void createTestSession(String connectionName, String sessionName) throws Exception
+ {
+ createTestSession(connectionName, sessionName, true);
+ }
+
+ private void createTestProducer(String sessionName, String producerName, String destinationName, boolean shouldSucceed) throws JMSException
+ {
+ final CreateProducerCommand createProducerCommand = new CreateProducerCommand();
+ createProducerCommand.setParticipantName(producerName);
+ createProducerCommand.setSessionName(sessionName);
+ createProducerCommand.setDestinationName(destinationName);
+ createProducerCommand.setNumberOfMessages(100);
+
+ sendCommandAndValidateResponse(createProducerCommand, shouldSucceed);
+ }
+
+ private void createTestProducer(String sessionName, String producerName, String destinationName) throws JMSException
+ {
+ createTestProducer(sessionName, producerName, destinationName, true);
+ }
+
+ private void createTestConsumer(String sessionName, String consumerName, String destinationName, boolean shouldSucceed) throws JMSException
+ {
+ final CreateConsumerCommand createConsumerCommand = new CreateConsumerCommand();
+ createConsumerCommand.setSessionName(sessionName);
+ createConsumerCommand.setDestinationName(destinationName);
+ createConsumerCommand.setParticipantName(consumerName);
+ createConsumerCommand.setNumberOfMessages(1);
+
+ sendCommandAndValidateResponse(createConsumerCommand, shouldSucceed);
+ }
+
+ private void createTestConsumer(String sessionName, String consumerName, String destinationName) throws JMSException
+ {
+ createTestConsumer(sessionName, consumerName, destinationName, true);
+ }
+
+ private void validateResponse(CommandType originatingCommandType, Response response, boolean shouldSucceed) throws JMSException
+ {
+ assertEquals("Response is a reply to the wrong command: " + response,
+ originatingCommandType,
+ response.getInReplyToCommandType());
+
+ boolean shouldHaveError = !shouldSucceed;
+ assertEquals("Response message " + response + " should have indicated hasError=" + shouldHaveError,
+ shouldHaveError,
+ response.hasError());
+ }
+
+ private void createClientQueueProducer(final RegisterClientCommand registration) throws JMSException
+ {
+ final Destination clientCommandQueue = createDestinationFromRegistration(registration);
+ _clientQueueProducer = _session.createProducer(clientCommandQueue);
+ }
+
+ private Queue createDestinationFromRegistration(final RegisterClientCommand registrationCommand) throws JMSException
+ {
+ String clientQueueName = registrationCommand.getClientQueueName();
+ assertNotNull("Null client queue in register message", clientQueueName);
+ return _session.createQueue(clientQueueName);
+ }
+
+ private static void assertState(Client client, ClientState expectedState)
+ {
+ ClientState clientState = client.getState();
+ assertEquals("Client should be in state: " + expectedState + " but is in state " + clientState, expectedState, clientState);
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/MessageProviderTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/MessageProviderTest.java
new file mode 100644
index 0000000000..dcbff6518b
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/MessageProviderTest.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest.clientonly;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jms.DeliveryMode;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.apache.qpid.disttest.client.MessageProvider;
+import org.apache.qpid.disttest.client.property.PropertyValue;
+import org.apache.qpid.disttest.client.property.SimplePropertyValue;
+import org.apache.qpid.disttest.message.CreateMessageProviderCommand;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+import org.apache.qpid.systest.disttest.clientonly.ProducerParticipantTest.TestClientJmsDelegate;
+
+public class MessageProviderTest extends DistributedTestSystemTestBase
+{
+ private MessageConsumer _consumer;
+ private Session _session;
+ private TestClientJmsDelegate _delegate;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _consumer = _session.createConsumer(getTestQueue());
+ _delegate = new TestClientJmsDelegate(getContext());
+ }
+
+ public void testMessageSize() throws Exception
+ {
+ runSizeTest(0);
+ runSizeTest(5);
+ runSizeTest(512);
+ }
+
+ public void runSizeTest(int size) throws Exception
+ {
+ CreateProducerCommand command = new CreateProducerCommand();
+ command.setMessageSize(size);
+ MessageProvider messageProvider = new MessageProvider(null);
+ Message message = messageProvider.nextMessage(_session, command);
+ assertNotNull("Message is not generated", message);
+ assertTrue("Wrong message type", message instanceof TextMessage);
+ TextMessage textMessage = (TextMessage)message;
+ String text = textMessage.getText();
+ assertNotNull("Message payload is not generated", text);
+ assertEquals("Message payload size is incorrect", size, text.length());
+ }
+
+ public void testCreateMessageProviderAndSendMessage() throws Exception
+ {
+ final CreateMessageProviderCommand messageProviderCommand = new CreateMessageProviderCommand();
+ messageProviderCommand.setProviderName("test1");
+ Map<String, PropertyValue> messageProperties = new HashMap<String, PropertyValue>();
+ messageProperties.put("test", new SimplePropertyValue("testValue"));
+ messageProperties.put("priority", new SimplePropertyValue(new Integer(9)));
+ messageProviderCommand.setMessageProperties(messageProperties);
+ _delegate.createMessageProvider(messageProviderCommand);
+
+ final CreateProducerCommand producerCommand = new CreateProducerCommand();
+ producerCommand.setNumberOfMessages(1);
+ producerCommand.setDeliveryMode(DeliveryMode.PERSISTENT);
+ producerCommand.setPriority(6);
+ producerCommand.setParticipantName("test");
+ producerCommand.setMessageSize(10);
+ producerCommand.setSessionName("testSession");
+ producerCommand.setDestinationName(getTestQueueName());
+ producerCommand.setMessageProviderName(messageProviderCommand.getProviderName());
+
+ Session session = _connection.createSession(true, Session.SESSION_TRANSACTED);
+ _delegate.addConnection("name-does-not-matter", _connection);
+ _delegate.addSession(producerCommand.getSessionName(), session);
+ _delegate.createProducer(producerCommand);
+
+ Message message = _delegate.sendNextMessage(producerCommand);
+ session.commit();
+ assertMessage(message);
+
+ _connection.start();
+ Message receivedMessage = _consumer.receive(1000l);
+ assertMessage(receivedMessage);
+ }
+
+ protected void assertMessage(Message message) throws JMSException
+ {
+ assertNotNull("Message should not be null", message);
+ assertEquals("Unexpected test property", "testValue", message.getStringProperty("test"));
+ assertEquals("Unexpected priority property", 9, message.getJMSPriority());
+ assertTrue("Unexpected message type", message instanceof TextMessage);
+ String text = ((TextMessage)message).getText();
+ assertNotNull("Message text should not be null", text);
+ assertNotNull("Unexpected message size ", text.length());
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ProducerParticipantTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ProducerParticipantTest.java
new file mode 100644
index 0000000000..54bb9efa98
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/clientonly/ProducerParticipantTest.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest.clientonly;
+
+import javax.jms.Connection;
+import javax.jms.DeliveryMode;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.Context;
+
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.ParticipantExecutor;
+import org.apache.qpid.disttest.client.ProducerParticipant;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+
+public class ProducerParticipantTest extends DistributedTestSystemTestBase
+{
+ private MessageConsumer _consumer;
+ private TestClientJmsDelegate _delegate;
+ private Client _client;
+ private ControllerQueue _controllerQueue;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _controllerQueue = new ControllerQueue(_connection, _context);
+ Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _consumer = session.createConsumer(getTestQueue());
+
+ _delegate = new TestClientJmsDelegate(getContext());
+ _client = new Client(_delegate);
+ }
+
+
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ _controllerQueue.close();
+ super.tearDown();
+ }
+
+
+
+ public void testProduceNumberOfMessages() throws Exception
+ {
+ runTest(Session.AUTO_ACKNOWLEDGE, 100, 10, 0, 0);
+ }
+
+ protected void runTest(int acknowledgeMode, int messageSize, int numberOfMessages, int batchSize, long publishInterval) throws Exception
+ {
+ final CreateProducerCommand command = new CreateProducerCommand();
+ command.setNumberOfMessages(numberOfMessages);
+ command.setDeliveryMode(DeliveryMode.PERSISTENT);
+ command.setParticipantName("test");
+ command.setMessageSize(messageSize);
+ command.setBatchSize(batchSize);
+ command.setInterval(publishInterval);
+ command.setSessionName("testSession");
+ command.setDestinationName(getTestQueueName());
+
+ Session session = _connection.createSession(Session.SESSION_TRANSACTED == acknowledgeMode, acknowledgeMode);
+
+ _delegate.addConnection("name-does-not-matter", _connection);
+ _delegate.addSession(command.getSessionName(), session);
+ _delegate.createProducer(command);
+
+ final ProducerParticipant producer = new ProducerParticipant(_delegate, command);
+
+ new ParticipantExecutor(producer).start(_client);
+
+ _connection.start();
+ for (int i = 0; i < numberOfMessages; i++)
+ {
+ final Message m = _consumer.receive(1000l);
+ assertNotNull("Expected message [" + i + "] is not received", m);
+ assertTrue("Unexpected message", m instanceof TextMessage);
+ }
+ Message m = _consumer.receive(500l);
+ assertNull("Unexpected message", m);
+
+ ParticipantResult results = _controllerQueue.getNext();
+
+ assertNotNull("no results", results);
+ assertFalse(results.getStartInMillis() == 0);
+ assertFalse(results.getEndInMillis() == 0);
+ }
+
+ static class TestClientJmsDelegate extends ClientJmsDelegate
+ {
+
+ public TestClientJmsDelegate(Context context)
+ {
+ super(context);
+ }
+
+ @Override
+ public void addSession(final String sessionName, final Session newSession)
+ {
+ super.addSession(sessionName, newSession);
+ }
+
+ @Override
+ public void addConnection(final String connectionName, final Connection newConnection)
+ {
+ super.addConnection(connectionName, newConnection);
+ }
+ }
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java
new file mode 100644
index 0000000000..9fd90d3215
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/ControllerAndClientTest.java
@@ -0,0 +1,249 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.disttest.controllerandclient;
+
+import static org.apache.qpid.systest.disttest.SystemTestConstants.COMMAND_RESPONSE_TIMEOUT;
+import static org.apache.qpid.systest.disttest.SystemTestConstants.REGISTRATION_TIMEOUT;
+import static org.apache.qpid.systest.disttest.SystemTestConstants.TEST_RESULT_TIMEOUT;
+
+import java.util.List;
+
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.naming.NamingException;
+
+import org.apache.qpid.disttest.ConfigFileHelper;
+import org.apache.qpid.disttest.client.Client;
+import org.apache.qpid.disttest.client.ClientState;
+import org.apache.qpid.disttest.controller.Controller;
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.controller.TestResult;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.jms.ClientJmsDelegate;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.message.ConsumerParticipantResult;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.message.ProducerParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ControllerAndClientTest extends DistributedTestSystemTestBase
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ControllerAndClientTest.class);
+ private static final long CLIENT_BACKGROUND_THREAD_WAIT_TIME = 5000;
+
+ private Controller _controller;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _controller = new Controller(new ControllerJmsDelegate(_context), REGISTRATION_TIMEOUT, COMMAND_RESPONSE_TIMEOUT);
+ _controller.setTestResultTimeout(TEST_RESULT_TIMEOUT);
+ }
+
+ public void testProducerAndConsumerInSeparateClients() throws Exception
+ {
+ List<TestResult> resultList = runTestsForTwoClients("producerAndConsumerInSeparateClients.json", 1);
+
+ TestResult testResult1 = resultList.get(0);
+ assertEquals("Unexpected test name", "Test 1", testResult1.getName());
+ List<ParticipantResult> test1ParticipantResults = testResult1.getParticipantResults();
+ assertEquals("Unexpected number of participant results for test 1", 2, test1ParticipantResults.size());
+ assertParticipantNames(test1ParticipantResults, "participantConsumer1", "participantProducer1");
+ }
+
+ public void testProducerClient() throws Exception
+ {
+ Session session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ Queue queue = session.createQueue("producerClient");
+ MessageConsumer consumer = session.createConsumer(queue);
+
+ // queue is not declared in configuration
+ // controller is not able to clean it
+ // cleaning manually
+ while(consumer.receive(1000l) != null);
+
+ final Config config = ConfigFileHelper.getConfigFromResource(getClass(), "produceClient.json");
+ _controller.setConfig(config);
+ final Client client1 = new Client(new ClientJmsDelegate(_context));
+ final Thread client1Thread = createBackgroundClientThread(client1);
+ _controller.awaitClientRegistrations();
+
+ ResultsForAllTests results = _controller.runAllTests();
+ _controller.stopAllRegisteredClients();
+
+ assertClientThreadsShutdown(client1Thread);
+ assertClientsStopped(ClientState.STOPPED, client1);
+ assertFalse("Test should have no errors", results.hasErrors());
+ List<ITestResult> allTestResults = results.getTestResults();
+ assertEquals("Unexpected number of test results", 1, allTestResults.size());
+ ITestResult testResult1 = allTestResults.get(0);
+ assertEquals("Unexpected test name", "Test 1", testResult1.getName());
+ List<ParticipantResult> test1ParticipantResults = testResult1.getParticipantResults();
+ assertEquals("Unexpected number of participant results for test 1", 1, test1ParticipantResults.size());
+ assertParticipantNames(test1ParticipantResults, "participantProducer1");
+
+ // check message properties
+ for (int i=0; i< 10; i++)
+ {
+ Message message = consumer.receive(1000l);
+ assertNotNull("Message " + i + " is not received", message);
+ assertEquals("Unexpected priority", i, message.getJMSPriority());
+ assertEquals("Unexpected id", i, message.getIntProperty("id"));
+ assertEquals("Unexpected test", "test-value", message.getStringProperty("test"));
+ }
+ }
+
+ public void testProducerAndThreeConsumersInSeparateClients() throws Exception
+ {
+ List<TestResult> resultList = runTestsForTwoClients("producerAndThreeConsumersInSeparateClients.json", 1);
+
+ TestResult testResult1 = resultList.get(0);
+ List<ParticipantResult> test1ParticipantResults = testResult1.getParticipantResults();
+ assertEquals("Unexpected number of participant results for test", 4, test1ParticipantResults.size());
+
+ assertParticipantNames(test1ParticipantResults, "participantConsumer1", "participantConsumer2", "participantConsumer3", "participantProducer1");
+
+ ConsumerParticipantResult consumer1 = (ConsumerParticipantResult) test1ParticipantResults.get(0);
+ assertEquals(3, consumer1.getNumberOfMessagesProcessed());
+ assertEquals(true, consumer1.isSynchronousConsumer());
+
+ ProducerParticipantResult producer1 = (ProducerParticipantResult) test1ParticipantResults.get(3);
+ assertEquals(9, producer1.getNumberOfMessagesProcessed());
+ assertEquals(2, producer1.getBatchSize());
+ assertEquals(50, producer1.getInterval());
+ }
+
+ public void testIteratingFeature() throws Exception
+ {
+ List<TestResult> resultList = runTestsForTwoClients("iteratingFeature.json", 2);
+
+ assertTestResultMessageSize(resultList.get(0), 0, 100, 10);
+ assertTestResultMessageSize(resultList.get(1), 1, 200, 5);
+
+ }
+
+ private void assertTestResultMessageSize(TestResult testResult, int iterationNumber, int expectedMessageSize, int expectedNumberOfMessages)
+ {
+ List<ParticipantResult> test1ParticipantResults = testResult.getParticipantResults();
+ assertEquals("Unexpected number of participant results for test", 2, test1ParticipantResults.size());
+
+ ParticipantResult producer1 = (ParticipantResult) test1ParticipantResults.get(1);
+
+ assertEquals(expectedMessageSize, producer1.getPayloadSize());
+ assertEquals(iterationNumber, producer1.getIterationNumber());
+ }
+
+ public void testTwoTests() throws Exception
+ {
+ List<TestResult> resultList = runTestsForTwoClients("testWithTwoTests.json", 2);
+
+ assertEquals("Test 1", resultList.get(0).getName());
+ assertEquals("Test 2", resultList.get(1).getName());
+ }
+
+ private List<TestResult> runTestsForTwoClients(String jsonConfigFile, int expectedNumberOfTests) throws NamingException, InterruptedException
+ {
+ final Config config = ConfigFileHelper.getConfigFromResource(getClass(), jsonConfigFile);
+ _controller.setConfig(config);
+
+ final Client client1 = new Client(new ClientJmsDelegate(_context));
+ final Client client2 = new Client(new ClientJmsDelegate(_context));
+
+ final Thread client1Thread = createBackgroundClientThread(client1);
+ final Thread client2Thread = createBackgroundClientThread(client2);
+
+ _controller.awaitClientRegistrations();
+
+ ResultsForAllTests results = _controller.runAllTests();
+ _controller.stopAllRegisteredClients();
+
+ assertClientThreadsShutdown(client1Thread, client2Thread);
+ assertClientsStopped(ClientState.STOPPED, client1, client2);
+
+ assertFalse("Test should have no errors", results.hasErrors());
+
+ List<TestResult> allTestResults = (List)results.getTestResults();
+ assertEquals("Unexpected number of test results", expectedNumberOfTests, allTestResults.size());
+
+ return allTestResults;
+ }
+
+
+ private void assertParticipantNames(List<ParticipantResult> participants, String... expectedOrderedParticipantNames)
+ {
+ assertEquals("Size of list of expected participant names is different from actual", expectedOrderedParticipantNames.length, participants.size());
+
+ for (int i = 0; i < expectedOrderedParticipantNames.length; i++)
+ {
+ String expectedParticipantName = expectedOrderedParticipantNames[i];
+ ParticipantResult participant = participants.get(i);
+ assertEquals(expectedParticipantName, participant.getParticipantName());
+ }
+ }
+
+ private void assertClientsStopped(ClientState expectedState, final Client... clients)
+ {
+ for (Client client : clients)
+ {
+ assertEquals(client.getClientName() + " in unexpected state", expectedState, client.getState());
+ }
+ }
+
+ private void assertClientThreadsShutdown(final Thread... clientThreads)
+ throws InterruptedException
+ {
+ for (Thread clientThread : clientThreads)
+ {
+ clientThread.join(2000);
+ assertFalse(clientThread.getName() + " should have shutdown", clientThread.isAlive());
+ }
+ }
+
+ private Thread createBackgroundClientThread(final Client client) throws NamingException
+ {
+ final String clientThreadName = client.getClientName() + "-thread";
+ final Thread clientThread = new Thread(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ try
+ {
+ client.start();
+ client.waitUntilStopped(CLIENT_BACKGROUND_THREAD_WAIT_TIME);
+ }
+ finally
+ {
+ LOGGER.debug("Client thread {} finished", clientThreadName);
+ }
+ }
+ }, clientThreadName);
+ clientThread.start();
+ return clientThread;
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/iteratingFeature.json b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/iteratingFeature.json
new file mode 100644
index 0000000000..89123302b7
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/iteratingFeature.json
@@ -0,0 +1,63 @@
+{
+ "_tests":[
+ {
+ "_name": "Test iteration feature",
+ "_iterations":[
+ {
+ "_messageSize": 100,
+ "_numberOfMessages": 10
+ },
+ {
+ "_messageSize": 200,
+ "_numberOfMessages": 5
+ }
+ ],
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ],
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantConsumer1",
+ "_destinationName": "direct://amq.direct//testQueue"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/produceClient.json b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/produceClient.json
new file mode 100644
index 0000000000..605e5cb585
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/produceClient.json
@@ -0,0 +1,41 @@
+{
+ "_tests":[
+ {
+ "_name": "Test 1";
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//producerClient",
+ "_numberOfMessages": 10;
+ "_messageProviderName": "testProvider1"
+ }
+ ]
+ }
+ ]
+ }
+ ];
+ "_messageProviders":[
+ {
+ "_name": "testProvider1";
+ "_messageProperties": {
+ "priority": {"@def": "list"; "_items": [0,1,2,3,4,5,6,7,8,9]};
+ "id": {"@def": "range"; "_upper": 10; "_type": "int"};
+ "test": "test-value"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json
new file mode 100644
index 0000000000..8d210dce84
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndConsumerInSeparateClients.json
@@ -0,0 +1,55 @@
+{
+ "_tests":[
+ {
+ "_name": "Test 1";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantConsumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndThreeConsumersInSeparateClients.json b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndThreeConsumersInSeparateClients.json
new file mode 100644
index 0000000000..f94c4f0ae0
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/producerAndThreeConsumersInSeparateClients.json
@@ -0,0 +1,77 @@
+{
+ "_tests":[
+ {
+ "_name": "ProducerAndThreeConsumersInSeparateClients";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 9,
+ "_batchSize": 2,
+ "_interval": 50
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantConsumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 3
+ }
+ ]
+ },
+ {
+ "_sessionName": "session2",
+ "_consumers": [
+ {
+ "_name": "participantConsumer2",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 3
+ }
+ ]
+ },
+ {
+ "_sessionName": "session3",
+ "_consumers": [
+ {
+ "_name": "participantConsumer3",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 3
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/testWithTwoTests.json b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/testWithTwoTests.json
new file mode 100644
index 0000000000..4abd7f4feb
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controllerandclient/testWithTwoTests.json
@@ -0,0 +1,107 @@
+{
+ "_tests":[
+ {
+ "_name": "Test 1";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantconsumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "Test 2";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue2"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer2",
+ "_destinationName": "direct://amq.direct//testQueue2",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantConsumer2",
+ "_destinationName": "direct://amq.direct//testQueue2",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/DistributedControllerTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/DistributedControllerTest.java
new file mode 100644
index 0000000000..ad7f0e0682
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/DistributedControllerTest.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.systest.disttest.controlleronly;
+
+import static org.apache.qpid.systest.disttest.SystemTestConstants.COMMAND_RESPONSE_TIMEOUT;
+import static org.apache.qpid.systest.disttest.SystemTestConstants.REGISTRATION_TIMEOUT;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.TemporaryQueue;
+
+import org.apache.qpid.disttest.ConfigFileHelper;
+import org.apache.qpid.disttest.controller.Controller;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.jms.JmsMessageAdaptor;
+import org.apache.qpid.disttest.message.Command;
+import org.apache.qpid.disttest.message.CommandType;
+import org.apache.qpid.disttest.message.RegisterClientCommand;
+import org.apache.qpid.disttest.message.Response;
+import org.apache.qpid.systest.disttest.DistributedTestSystemTestBase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DistributedControllerTest extends DistributedTestSystemTestBase
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(DistributedControllerTest.class);
+
+ private static final String CLIENT1 = "client1";
+ private Controller _controller = null;
+ private Session _session = null;
+ private Connection _connection = null;
+ private Destination _controllerQueue = null;
+ private TemporaryQueue _clientQueue = null;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ _controllerQueue = (Destination) _context.lookup("controllerqueue");
+
+ final ConnectionFactory connectionFactory = (ConnectionFactory) _context.lookup("connectionfactory");
+ _connection = connectionFactory.createConnection();
+ _connection.start();
+ _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ _clientQueue = _session.createTemporaryQueue();
+
+ _controller = new Controller(new ControllerJmsDelegate(_context), REGISTRATION_TIMEOUT, COMMAND_RESPONSE_TIMEOUT);
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ try
+ {
+ if (_connection != null)
+ {
+ _connection.close();
+ }
+ }
+ finally
+ {
+ super.tearDown();
+ }
+ }
+
+ public void testControllerSendsOneCommandToSingleClient() throws Exception
+ {
+ Config config = ConfigFileHelper.getConfigFromResource(getClass(), "distributedControllerTest.json");
+ _controller.setConfig(config);
+
+ sendRegistration(CLIENT1);
+ _controller.awaitClientRegistrations();
+
+ final ArrayBlockingQueue<Command> commandList = new ArrayBlockingQueue<Command>(4);
+ final MessageConsumer clientConsumer = _session.createConsumer(_clientQueue);
+ final AtomicReference<Exception> listenerException = new AtomicReference<Exception>();
+ final MessageProducer producer = _session.createProducer(_controllerQueue);
+ clientConsumer.setMessageListener(new MessageListener()
+ {
+ @Override
+ public void onMessage(Message message)
+ {
+ try
+ {
+ Command command = JmsMessageAdaptor.messageToCommand(message);
+ LOGGER.debug("Test client received " + command);
+ commandList.add(command);
+ producer.send(JmsMessageAdaptor.commandToMessage(_session, new Response(CLIENT1, command.getType())));
+ }
+ catch(Exception e)
+ {
+ listenerException.set(e);
+ }
+ }
+ });
+
+ _controller.runAllTests();
+ assertCommandType(CommandType.CREATE_CONNECTION, commandList);
+ assertCommandType(CommandType.START_TEST, commandList);
+ assertCommandType(CommandType.TEAR_DOWN_TEST, commandList);
+
+ _controller.stopAllRegisteredClients();
+ assertCommandType(CommandType.STOP_CLIENT, commandList);
+ assertNull("Unexpected exception occured", listenerException.get());
+ Command command = commandList.poll(1l, TimeUnit.SECONDS);
+ assertNull("Unexpected command is received", command);
+ }
+
+ private void assertCommandType(CommandType expectedType, BlockingQueue<Command> commandList) throws InterruptedException
+ {
+ Command command = commandList.poll(1l, TimeUnit.SECONDS);
+ assertNotNull("Command of type " + expectedType + " is not received", command);
+ assertEquals("Unexpected command type", expectedType, command.getType());
+ }
+
+ private void sendRegistration(final String clientId) throws JMSException
+ {
+ final MessageProducer registrationProducer = _session.createProducer(_controllerQueue);
+
+ final Command command = new RegisterClientCommand(clientId, _clientQueue.getQueueName());
+ final Message registrationMessage = JmsMessageAdaptor.commandToMessage(_session, command);
+ registrationProducer.send(registrationMessage);
+ LOGGER.debug("sent registrationMessage: " + registrationMessage);
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/distributedControllerTest.json b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/distributedControllerTest.json
new file mode 100644
index 0000000000..b49603ef23
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/controlleronly/distributedControllerTest.json
@@ -0,0 +1,17 @@
+{
+ "_tests":[
+ {
+ "_name": "Test 1";
+ "_clients":[
+ {
+ "_name": "client1",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory"
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java
new file mode 100644
index 0000000000..63c9b42858
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/EndToEndTest.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.qpid.systest.disttest.endtoend;
+
+import static org.apache.qpid.disttest.AbstractRunner.JNDI_CONFIG_PROP;
+import static org.apache.qpid.disttest.ControllerRunner.OUTPUT_DIR_PROP;
+import static org.apache.qpid.disttest.ControllerRunner.TEST_CONFIG_PROP;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.qpid.disttest.ControllerRunner;
+import org.apache.qpid.disttest.message.ParticipantAttribute;
+import org.apache.qpid.disttest.results.aggregation.TestResultAggregator;
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
+import org.apache.qpid.util.FileUtils;
+
+public class EndToEndTest extends QpidBrokerTestCase
+{
+ private ControllerRunner _runner;
+ private static final String TEST_CONFIG = "perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/endtoend.json";
+ private static final String JNDI_CONFIG_FILE = "perftests/src/test/java/org/apache/qpid/systest/disttest/perftests.systests.properties";
+
+ public void testRunner() throws Exception
+ {
+ File csvOutputDir = createTemporaryCsvDirectory();
+ assertTrue("CSV output dir must not exist",csvOutputDir.isDirectory());
+
+ final String[] args = new String[] {TEST_CONFIG_PROP + "=" + TEST_CONFIG,
+ JNDI_CONFIG_PROP + "=" + JNDI_CONFIG_FILE,
+ OUTPUT_DIR_PROP + "=" + csvOutputDir.getAbsolutePath()};
+ _runner = new ControllerRunner();
+ _runner.parseArgumentsIntoConfig(args);
+ _runner.runController();
+
+ File expectedCsvOutputFile = new File(csvOutputDir, "endtoend.csv");
+ assertTrue("CSV output file must exist", expectedCsvOutputFile.exists());
+ final String csvContents = FileUtils.readFileAsString(expectedCsvOutputFile);
+ final String[] csvLines = csvContents.split("\n");
+
+ int numberOfHeaders = 1;
+ int numberOfParticipants = 2;
+ int numberOfSummaries = 3;
+
+ int numberOfExpectedRows = numberOfHeaders + numberOfParticipants + numberOfSummaries;
+ assertEquals("Unexpected number of lines in CSV", numberOfExpectedRows, csvLines.length);
+
+ assertDataRowsHaveCorrectTestAndClientName("End To End 1", "producingClient", "participantProducer1", csvLines[1], 1);
+ assertDataRowsHaveCorrectTestAndClientName("End To End 1", "consumingClient", "participantConsumer1", csvLines[2], 1);
+
+ assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", TestResultAggregator.ALL_PARTICIPANTS_NAME, csvLines[3], 1);
+ assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", TestResultAggregator.ALL_CONSUMER_PARTICIPANTS_NAME, csvLines[4], 1);
+ assertDataRowsHaveCorrectTestAndClientName("End To End 1", "", TestResultAggregator.ALL_PRODUCER_PARTICIPANTS_NAME, csvLines[5], 1);
+
+ }
+
+ private void assertDataRowsHaveCorrectTestAndClientName(String testName, String clientName, String participantName, String csvLine, int expectedNumberOfMessagesProcessed)
+ {
+ final int DONT_STRIP_EMPTY_LAST_FIELD_FLAG = -1;
+ String[] cells = csvLine.split(",", DONT_STRIP_EMPTY_LAST_FIELD_FLAG);
+ // All attributes become cells in the CSV, so this will be true
+ assertEquals("Unexpected number of cells in CSV line " + csvLine, ParticipantAttribute.values().length, cells.length);
+ assertEquals("Unexpected test name in CSV line " + csvLine, testName, cells[0]);
+ assertEquals("Unexpected client name in CSV line " + csvLine, clientName, cells[2]);
+ assertEquals("Unexpected participant name in CSV line " + csvLine, participantName, cells[3]);
+ assertEquals("Unexpected number of messages processed in CSV line " + csvLine, String.valueOf(expectedNumberOfMessagesProcessed), cells[4]);
+
+ }
+
+ private File createTemporaryCsvDirectory() throws IOException
+ {
+ String tmpDir = System.getProperty("java.io.tmpdir");
+ File csvDir = new File(tmpDir, "csv");
+ csvDir.mkdir();
+ csvDir.deleteOnExit();
+ return csvDir;
+ }
+
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/endtoend.json b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/endtoend.json
new file mode 100644
index 0000000000..1b7cc51265
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/endtoend/endtoend.json
@@ -0,0 +1,65 @@
+{
+ "_tests":[
+ {
+ "_name": "End To End 1";
+ "_queues":[
+ {
+ "_name": "direct://amq.direct//testQueue"
+ }
+ ];
+ "_clients":[
+ {
+ "_name": "producingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_producers": [
+ {
+ "_name": "participantProducer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ];
+ "_messageProviders":[
+ {
+ "_name": "testProvider1";
+ "_messageProperties": {
+ "priority": {"@def": "list"; "_items": [1,2,3,4,4]};
+ "id": {"@def": "random"; "_upper": 10};
+ "test": "test-value"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "_name": "consumingClient",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_consumers": [
+ {
+ "_name": "participantConsumer1",
+ "_destinationName": "direct://amq.direct//testQueue",
+ "_numberOfMessages": 1
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }]
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/perftests.systests.properties b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/perftests.systests.properties
new file mode 100644
index 0000000000..b5d053227c
--- /dev/null
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/systest/disttest/perftests.systests.properties
@@ -0,0 +1,26 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# this file is used for running system tests of the performance test framework,
+# (i.e. not for running the performance tests themselves!)
+
+java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
+
+# use QpidBrokerTestCase's default port
+connectionfactory.connectionfactory = amqp://guest:guest@clientid/test?brokerlist='tcp://localhost:15672'
+
+destination.controllerqueue = direct://amq.direct//controllerqueue
diff --git a/qpid/java/perftests/visualisation-jfc/build.xml b/qpid/java/perftests/visualisation-jfc/build.xml
new file mode 100644
index 0000000000..b838855e8b
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/build.xml
@@ -0,0 +1,142 @@
+<!--
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements. See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership. The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License. You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied. See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -->
+<project name="visualisation-jfc" default="build">
+ <property name="module.depends" value="common perftests" />
+ <property name="module.test.depends" value="test" />
+
+ <import file="../../module.xml" />
+
+
+ <!-- JFreeChart and JFreeCommon -->
+
+ <property name="jfree.lib.dir" value="${project.root}/lib/jfree" />
+ <property name="jfreechart.version" value="1.0.13" />
+ <property name="jfreecommon.version" value="1.0.16" />
+ <property name="jfreechart.download.url" value="http://repo1.maven.org/maven2/jfree/jfreechart/${jfreechart.version}/jfreechart-${jfreechart.version}.jar" />
+ <property name="jfreecommon.download.url" value="http://repo1.maven.org/maven2/jfree/jcommon/${jfreecommon.version}/jcommon-${jfreecommon.version}.jar" />
+ <property name="jfreechart.jar.file" value="${jfree.lib.dir}/jfreechart-${jfreechart.version}.jar" />
+ <property name="jfreecommon.jar.file" value="${jfree.lib.dir}/jfreecommon-${jfreecommon.version}.jar" />
+
+ <!-- CSVJDBC -->
+
+ <property name="csvjdbc.lib.dir" value="${project.root}/lib/csvjdbc" />
+ <property name="csvjdbc.version" value="1.0.8" />
+ <property name="csvjdbc.download.url" value="http://csvjdbc.sourceforge.net/maven2/net/sourceforge/csvjdbc/csvjdbc/${csvjdbc.version}/csvjdbc-${csvjdbc.version}.jar" />
+
+ <property name="csvjdbc.jar.file" value="${csvjdbc.lib.dir}/csvjdbc-${csvjdbc.version}.jar" />
+
+ <!--check whether the JFree jar is present, possibly after download-->
+ <target name="check-jfree-jars">
+ <condition property="jfree.available">
+ <and>
+ <available file="${jfreechart.jar.file}"/>
+ <available file="${jfreecommon.jar.file}"/>
+ </and>
+ </condition>
+ </target>
+
+ <!--echo that BDB is required if it isnt present, with associated licencing note-->
+ <target name="jfree-jar-required" depends="jfree-licence-note-optional" unless="jfree.available">
+ <echo>The JFreeChart library is required to use this optional module.
+
+The jar file may be downloaded by either:
+
+ Seperately running the following command from the qpid/java/perftests/visualisation-jfc dir: ant download-jfree
+
+ OR
+
+ Adding -Ddownload-jfree=true to your regular build command.</echo>
+ <fail>The JFreechart JARs were not found</fail>
+ </target>
+
+ <!--issue JFree licencing note if JFree isnt already present-->
+ <target name="jfree-licence-note-optional" depends="check-jfree-jars" unless="jfree.available">
+ <antcall target="jfree-licence-note"/>
+ </target>
+
+ <!--issue JFree licencing note-->
+ <target name="jfree-licence-note">
+ <echo>*NOTE* The JFreeChart and JFreeCommon libraries required by this optional module are licensed under the LGPL Licence, which is not compatible with the Apache Licence v2.0.
+
+For a copy of the LGPL Licence, please see:
+http://www.gnu.org/licenses/lgpl.html
+ </echo>
+ </target>
+
+ <target name="check-csvjdbc-jars">
+ <condition property="csvjdbc.available">
+ <available file="${csvjdbc.jar.file}"/>
+ </condition>
+ </target>
+
+ <!--check if an inline JFree download was requested with the build-->
+ <target name="checkjfree-request-props" if="download-jfree">
+ <antcall target="download-jfree"/>
+ </target>
+
+ <!--echo that CSVJDBC is required if it isnt present, with associated licencing note-->
+ <target name="csvjdbc-jar-required" depends="csvjdbc-licence-note-optional" unless="csvjdbc.available">
+ <echo>The CSVJDBC library is required to use this optional module.
+
+The jar file may be downloaded by either:
+
+ Seperately running the following command from the qpid/java/perftests/visualisation-jfc dir: ant download-csvjdbc
+
+ OR
+
+ Adding -Ddownload-csvjdbc=true to your regular build command.</echo>
+ <fail>The CSVJDBC JAR was not found</fail>
+ </target>
+
+ <!--issue CSVJDBC licencing note-->
+ <target name="csvjdbc-licence-note">
+ <echo>*NOTE* The CSVJDBC library required by this optional module is licensed under the LGPL Licence, which is not compatible with the Apache Licence v2.0.
+
+For a copy of the LGPL Licence, please see:
+http://www.gnu.org/licenses/lgpl.html
+ </echo>
+ </target>
+
+ <!--issue CSVJDBC licencing note if CSVJDBC isnt already present-->
+ <target name="csvjdbc-licence-note-optional" depends="check-csvjdbc-jars" unless="csvjdbc.available">
+ <antcall target="csvjdbc-licence-note"/>
+ </target>
+
+ <!--download JFree, with licencing note-->
+ <target name="download-jfree" depends="jfree-licence-note">
+ <mkdir dir="${jfree.lib.dir}"/>
+ <echo>Downloading JFreeChart</echo>
+ <get src="${jfreechart.download.url}" dest="${jfreechart.jar.file}" usetimestamp="true" />
+ <get src="${jfreecommon.download.url}" dest="${jfreecommon.jar.file}" usetimestamp="true" />
+ </target>
+
+ <target name="checkcsvjdbc-request-props" if="download-csvjdbc">
+ <antcall target="download-csvjdbc"/>
+ </target>
+
+ <target name="download-csvjdbc" depends="csvjdbc-licence-note">
+ <mkdir dir="${csvjdbc.lib.dir}"/>
+ <echo>Downloading csvjdbc</echo>
+ <get src="${csvjdbc.download.url}" dest="${csvjdbc.jar.file}" usetimestamp="true" />
+ </target>
+
+ <target name="build" depends="checkjfree-request-props, jfree-jar-required, checkcsvjdbc-request-props, csvjdbc-jar-required, module.build" />
+
+
+</project>
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java
new file mode 100644
index 0000000000..2803f2d767
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartType.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting;
+
+public enum ChartType
+{
+ LINE, BAR
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingException.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingException.java
new file mode 100644
index 0000000000..120a4dc750
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingException.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting;
+
+public class ChartingException extends RuntimeException
+{
+ private static final long serialVersionUID = 1L;
+
+ public ChartingException()
+ {
+ super();
+ }
+
+ public ChartingException(String message)
+ {
+ super(message);
+ }
+
+ public ChartingException(Throwable cause)
+ {
+ super(cause);
+ }
+
+ public ChartingException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java
new file mode 100644
index 0000000000..a149d1a097
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/ChartingUtil.java
@@ -0,0 +1,135 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.qpid.disttest.ArgumentParser;
+import org.apache.qpid.disttest.charting.chartbuilder.ChartBuilder;
+import org.apache.qpid.disttest.charting.chartbuilder.ChartBuilderFactory;
+import org.apache.qpid.disttest.charting.definition.ChartingDefinition;
+import org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator;
+import org.jfree.chart.ChartUtilities;
+import org.jfree.chart.JFreeChart;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ChartingUtil
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ChartingUtil.class);
+
+ public static final String OUTPUT_DIR_PROP = "outputdir";
+ public static final String OUTPUT_DIR_DEFAULT = ".";
+
+ public static final String CHART_DEFINITIONS_PROP = "chart-defs";
+ public static final String CHART_DEFINITIONS_DEFAULT = ".";
+
+ private Map<String,String> _cliOptions = new HashMap<String, String>();
+ {
+ _cliOptions.put(OUTPUT_DIR_PROP, OUTPUT_DIR_DEFAULT);
+ _cliOptions.put(CHART_DEFINITIONS_PROP, CHART_DEFINITIONS_DEFAULT);
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ try
+ {
+ LOGGER.debug("Starting charting");
+
+ ChartingUtil chartingUtil = new ChartingUtil();
+ chartingUtil.parseArgumentsIntoConfig(args);
+ chartingUtil.produceAllCharts();
+ }
+ finally
+ {
+ LOGGER.debug("Charting complete");
+ }
+ }
+
+ private void produceAllCharts()
+ {
+ final String chartingDefsDir = _cliOptions.get(CHART_DEFINITIONS_PROP);
+ List<ChartingDefinition> definitions = loadChartDefinitions(chartingDefsDir);
+
+ LOGGER.debug("There are {} chart(s) to produce", definitions.size());
+
+ for (ChartingDefinition chartingDefinition : definitions)
+ {
+ ChartBuilder chartBuilder = ChartBuilderFactory.createChartBuilder(chartingDefinition.getChartType());
+ JFreeChart chart = chartBuilder.buildChart(chartingDefinition);
+ writeChartToFileSystem(chart, chartingDefinition.getChartStemName());
+ }
+ }
+
+ private void writeChartToFileSystem(JFreeChart chart, String chartStemName)
+ {
+ OutputStream pngOutputStream = null;
+ try
+ {
+
+ File pngFile = new File(chartStemName + ".png");
+ pngOutputStream = new BufferedOutputStream(new FileOutputStream(pngFile));
+ ChartUtilities.writeChartAsPNG(pngOutputStream, chart, 600, 400, true, 0);
+ pngOutputStream.close();
+
+ LOGGER.debug("Written {} chart", pngFile);
+ }
+ catch (IOException e)
+ {
+ throw new ChartingException("Failed to create chart", e);
+ }
+ finally
+ {
+ if (pngOutputStream != null)
+ {
+ try
+ {
+ pngOutputStream.close();
+ }
+ catch (IOException e)
+ {
+ throw new ChartingException("Failed to create chart", e);
+ }
+ }
+ }
+ }
+
+ private List<ChartingDefinition> loadChartDefinitions(String chartingDefsDir)
+ {
+ ChartingDefinitionCreator chartingDefinitionLoader = new ChartingDefinitionCreator();
+ return chartingDefinitionLoader.createFromFileOrDirectory(chartingDefsDir);
+ }
+
+ private void parseArgumentsIntoConfig(String[] args)
+ {
+ ArgumentParser argumentParser = new ArgumentParser();
+ argumentParser.parseArgumentsIntoConfig(_cliOptions, args);
+ }
+
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/BarChartBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/BarChartBuilder.java
new file mode 100644
index 0000000000..302263a604
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/BarChartBuilder.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.category.DefaultCategoryDataset;
+
+public class BarChartBuilder extends DataSetBasedChartBuilder
+{
+
+ @Override
+ public JFreeChart createChartImpl(String title, String xAxisTitle,
+ String yAxisTitle, final DefaultCategoryDataset dataset, PlotOrientation plotOrientation,
+ boolean showLegend, boolean showToolTips, boolean showUrls)
+ {
+ JFreeChart chart = ChartFactory.createBarChart(title,
+ xAxisTitle,
+ yAxisTitle,
+ dataset,
+ plotOrientation,
+ showLegend,
+ showToolTips,
+ showUrls);
+ return chart;
+ }
+
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilder.java
new file mode 100644
index 0000000000..c6f5ecc175
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.apache.qpid.disttest.charting.definition.ChartingDefinition;
+import org.jfree.chart.JFreeChart;
+
+public interface ChartBuilder
+{
+
+ public JFreeChart buildChart(ChartingDefinition chartingDefinition);
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java
new file mode 100644
index 0000000000..4c5d4fa09f
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactory.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.apache.qpid.disttest.charting.ChartType;
+
+public class ChartBuilderFactory
+{
+
+ public static ChartBuilder createChartBuilder(ChartType chartType)
+ {
+ switch (chartType)
+ {
+ case LINE:
+ return new LineChartBuilder();
+ case BAR:
+ return new BarChartBuilder();
+ default:
+ throw new IllegalArgumentException("Unknown chart type " + chartType);
+ }
+ }
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataPointCallback.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataPointCallback.java
new file mode 100644
index 0000000000..a47df0e8af
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataPointCallback.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
+
+public interface DataPointCallback
+{
+ public void addDataPointToSeries(SeriesDefinition seriesDefinition, Object xValue, Object yValue);
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataSetBasedChartBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataSetBasedChartBuilder.java
new file mode 100644
index 0000000000..6e2491c883
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/DataSetBasedChartBuilder.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.apache.qpid.disttest.charting.definition.ChartingDefinition;
+import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.axis.CategoryLabelPositions;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.category.DefaultCategoryDataset;
+
+public abstract class DataSetBasedChartBuilder implements ChartBuilder
+{
+ private static final CategoryLabelPositions LABEL_POSITION = CategoryLabelPositions.UP_45;
+ private static final PlotOrientation PLOT_ORIENTATION = PlotOrientation.VERTICAL;
+
+ @Override
+ public JFreeChart buildChart(ChartingDefinition chartingDefinition)
+ {
+ String title = chartingDefinition.getChartTitle();
+ String xAxisTitle = chartingDefinition.getXAxisTitle();
+ String yAxisTitle = chartingDefinition.getYAxisTitle();
+
+ final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+
+ SeriesBuilder seriesBuilder = new SeriesBuilder(new DataPointCallback()
+ {
+ @Override
+ public void addDataPointToSeries(SeriesDefinition seriesDefinition,
+ Object xValue, Object yValue)
+ {
+ String x = (String) xValue;
+ double y = (Double) yValue;
+ dataset.addValue( y, seriesDefinition.getSeriesLegend(), x);
+ }
+ });
+
+ seriesBuilder.build(chartingDefinition.getSeries());
+
+ JFreeChart chart = createChartImpl(title, xAxisTitle, yAxisTitle,
+ dataset, PLOT_ORIENTATION, true, false, false);
+
+ chart.getCategoryPlot().getDomainAxis().setCategoryLabelPositions(LABEL_POSITION);
+
+ return chart;
+ }
+
+ public abstract JFreeChart createChartImpl(String title, String xAxisTitle,
+ String yAxisTitle, final DefaultCategoryDataset dataset, PlotOrientation plotOrientation,
+ boolean showLegend, boolean showToolTips, boolean showUrls);
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/LineChartBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/LineChartBuilder.java
new file mode 100644
index 0000000000..697dfdcf3e
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/LineChartBuilder.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.category.DefaultCategoryDataset;
+
+public class LineChartBuilder extends DataSetBasedChartBuilder
+{
+ @Override
+ public JFreeChart createChartImpl(String title, String xAxisTitle,
+ String yAxisTitle, final DefaultCategoryDataset dataset, PlotOrientation plotOrientation,
+ boolean showLegend, boolean showToolTips, boolean showUrls)
+ {
+ JFreeChart chart = ChartFactory.createLineChart(title,
+ xAxisTitle,
+ yAxisTitle,
+ dataset,
+ plotOrientation,
+ showLegend,
+ showToolTips,
+ showUrls);
+ return chart;
+ }
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilder.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilder.java
new file mode 100644
index 0000000000..de717792db
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilder.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import java.io.File;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.qpid.disttest.charting.ChartingException;
+import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
+
+public class SeriesBuilder
+{
+ static
+ {
+ registerCsvDriver();
+ }
+
+ private final DataPointCallback _dataPointCallback;
+
+ public SeriesBuilder(DataPointCallback dataPointCallback)
+ {
+ _dataPointCallback = dataPointCallback;
+ }
+
+ public void build(List<SeriesDefinition> seriesDefinitions)
+ {
+ for (Iterator<SeriesDefinition> iterator = seriesDefinitions.iterator(); iterator.hasNext();)
+ {
+ SeriesDefinition series = iterator.next();
+ buildDataSetForSingleSeries(series);
+ }
+ }
+
+ private void buildDataSetForSingleSeries(SeriesDefinition seriesDefinition)
+ {
+ Connection conn = null;
+ Statement stmt = null;
+ try
+ {
+ File seriesDir = getValidatedSeriesDirectory(seriesDefinition);
+
+ conn = DriverManager.getConnection("jdbc:relique:csv:" + seriesDir.getAbsolutePath());
+
+ final String seriesStatement = seriesDefinition.getSeriesStatement();
+
+ stmt = conn.createStatement();
+ ResultSet results = stmt.executeQuery(seriesStatement);
+
+ while (results.next())
+ {
+ Object xValue = results.getString(1);
+ Object yValue = results.getDouble(2);
+
+ _dataPointCallback.addDataPointToSeries(seriesDefinition, xValue, yValue);
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new ChartingException("Failed to create chart dataset", e);
+ }
+ finally
+ {
+ if (stmt != null)
+ {
+ try
+ {
+ stmt.close();
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException("Failed to close statement", e);
+ }
+ }
+ if (conn != null)
+ {
+ try
+ {
+ conn.close();
+ }
+ catch (SQLException e)
+ {
+ throw new RuntimeException("Failed to close connection", e);
+ }
+ }
+ }
+ }
+
+ private File getValidatedSeriesDirectory(SeriesDefinition series)
+ {
+ File seriesDir = new File(series.getSeriesDirectory());
+ if (!seriesDir.isDirectory())
+ {
+ throw new ChartingException("seriesDirectory must be a directory : " + seriesDir);
+ }
+ return seriesDir;
+ }
+
+ private static void registerCsvDriver() throws ExceptionInInitializerError
+ {
+ try
+ {
+ Class.forName("org.relique.jdbc.csv.CsvDriver");
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new RuntimeException("Could not load CSV/JDBC driver", e);
+ }
+ }
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinition.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinition.java
new file mode 100644
index 0000000000..82b59b6d6e
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinition.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.qpid.disttest.charting.ChartType;
+
+public class ChartingDefinition
+{
+ private final String _chartStemName;
+ private final ChartType _chartType;
+ private final String _chartTitle;
+ private final String _xaxisTitle;
+ private final String _yaxisTitle;
+ private final List<SeriesDefinition> _seriesDefinitions;
+
+
+ public ChartingDefinition(final String chartStemName,
+ final ChartType chartType,
+ final String chartTitle,
+ final String xaxisTitle,
+ final String yaxisTitle, List<SeriesDefinition> seriesDefinitions)
+ {
+ _chartStemName = chartStemName;
+ _chartType = chartType;
+ _chartTitle = chartTitle;
+ _xaxisTitle = xaxisTitle;
+ _yaxisTitle = yaxisTitle;
+ _seriesDefinitions = seriesDefinitions;
+ }
+
+ public String getChartStemName()
+ {
+ return _chartStemName;
+ }
+
+ public String getChartTitle()
+ {
+ return _chartTitle;
+ }
+
+
+ public String getXAxisTitle()
+ {
+ return _xaxisTitle;
+ }
+
+
+ public String getYAxisTitle()
+ {
+ return _yaxisTitle;
+ }
+
+
+
+ public ChartType getChartType()
+ {
+ return _chartType;
+ }
+
+ public List<SeriesDefinition> getSeries()
+ {
+ return Collections.unmodifiableList(_seriesDefinitions);
+ }
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreator.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreator.java
new file mode 100644
index 0000000000..8a3d313519
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreator.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.qpid.disttest.charting.ChartType;
+import org.apache.qpid.disttest.charting.ChartingException;
+
+public class ChartingDefinitionCreator
+{
+ public static final String CHARTDEF_FILE_EXTENSION = ".chartdef";
+
+ public static final String CHART_TYPE_KEY = "chartType";
+ public static final String CHART_TITLE_KEY = "chartTitle";
+ public static final String XAXIS_TITLE_KEY = "xAxisTitle";
+ public static final String YAXIS_TITLE_KEY = "yAxisTitle";
+
+ private SeriesDefinitionCreator _seriesDefinitionCreator = new SeriesDefinitionCreator();
+
+ public List<ChartingDefinition> createFromFileOrDirectory(String chartingDefinitionFileOrDirectory)
+ {
+ List<ChartingDefinition> definitions = new ArrayList<ChartingDefinition>();
+
+ File fileOrDirectory = new File(chartingDefinitionFileOrDirectory);
+ if (fileOrDirectory.isDirectory())
+ {
+ File[] matchingFiles = fileOrDirectory.listFiles(new CHARTDEF_FILE_FILTER());
+
+ for (File file : matchingFiles)
+ {
+ final ChartingDefinition chartDefinition = createChartDefinition(file);
+ definitions.add(chartDefinition);
+ }
+ }
+ else
+ {
+ final ChartingDefinition chartDefinition = createChartDefinition(fileOrDirectory);
+ definitions.add(chartDefinition);
+ }
+
+ return definitions;
+ }
+
+ private ChartingDefinition createChartDefinition(File file)
+ {
+ Reader reader = null;
+ try
+ {
+ reader = new BufferedReader(new FileReader(file));
+ Properties props = new Properties();
+ props.load(reader);
+
+ final String chartStemName = getStemNameFrom(file);
+
+ final ChartType chartType = ChartType.valueOf(props.getProperty(CHART_TYPE_KEY));
+ final String chartTitle = props.getProperty(CHART_TITLE_KEY);
+ final String xAxisTitle = props.getProperty(XAXIS_TITLE_KEY);
+ final String yAxisTitle = props.getProperty(YAXIS_TITLE_KEY);
+
+ final List<SeriesDefinition> seriesDefinitions = createSeriesDefinitions(props);
+
+ final ChartingDefinition chartDefinition = new ChartingDefinition(chartStemName,
+ chartType,
+ chartTitle,
+ xAxisTitle,
+ yAxisTitle,
+ seriesDefinitions);
+ return chartDefinition;
+ }
+ catch (IOException e)
+ {
+ throw new ChartingException("Unable to open file " + file, e);
+ }
+ finally
+ {
+ if (reader != null)
+ {
+ try
+ {
+ reader.close();
+ }
+ catch (IOException e)
+ {
+ throw new ChartingException(e);
+ }
+ }
+ }
+
+ }
+
+ private String getStemNameFrom(File file)
+ {
+ final String nameWithExtension = file.getName();
+ final String nameWithoutExtensionPart = nameWithExtension.replaceAll("\\.[^\\.]*$", "");
+ return nameWithoutExtensionPart;
+ }
+
+ private List<SeriesDefinition> createSeriesDefinitions(Properties props)
+ {
+ return _seriesDefinitionCreator.createFromProperties(props);
+ }
+
+ private final class CHARTDEF_FILE_FILTER implements FileFilter
+ {
+ @Override
+ public boolean accept(File pathname)
+ {
+ return pathname.isFile() && pathname.getName().endsWith(CHARTDEF_FILE_EXTENSION);
+ }
+ }
+
+
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinition.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinition.java
new file mode 100644
index 0000000000..a39e906957
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinition.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+public class SeriesDefinition
+{
+ private final String _seriesStatement;
+ private final String _seriesLegend;
+ private final String _seriesDirectory;
+
+ public SeriesDefinition(String seriesStatement, String seriesLegend, String seriesDirectory)
+ {
+ _seriesStatement = seriesStatement;
+ _seriesLegend = seriesLegend;
+ _seriesDirectory = seriesDirectory;
+ }
+
+ public String getSeriesStatement()
+ {
+ return _seriesStatement;
+ }
+
+ public String getSeriesLegend()
+ {
+ return _seriesLegend;
+ }
+
+ public String getSeriesDirectory()
+ {
+ return _seriesDirectory;
+ }
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreator.java b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreator.java
new file mode 100644
index 0000000000..fcc11807c8
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/main/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreator.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.commons.lang.text.StrSubstitutor;
+
+public class SeriesDefinitionCreator
+{
+ public static final String SERIES_STATEMENT_KEY_FORMAT = "series.%d.statement";
+ public static final String SERIES_LEGEND_KEY_FORMAT = "series.%d.legend";
+ public static final String SERIES_DIRECTORY_KEY_FORMAT = "series.%d.dir";
+
+ public List<SeriesDefinition> createFromProperties(Properties properties)
+ {
+ final List<SeriesDefinition> seriesDefinitions = new ArrayList<SeriesDefinition>();
+
+ int index = 1;
+ boolean moreSeriesDefinitions = true;
+ while(moreSeriesDefinitions)
+ {
+ String seriesStatement = properties.getProperty(String.format(SERIES_STATEMENT_KEY_FORMAT, index));
+ String seriesLegend = properties.getProperty(String.format(SERIES_LEGEND_KEY_FORMAT, index));
+ String seriesDir = StrSubstitutor.replaceSystemProperties(properties.getProperty(String.format(SERIES_DIRECTORY_KEY_FORMAT, index)));
+
+ if (seriesStatement != null)
+ {
+ final SeriesDefinition seriesDefinition = new SeriesDefinition(seriesStatement, seriesLegend, seriesDir);
+ seriesDefinitions.add(seriesDefinition);
+ }
+ else
+ {
+ moreSeriesDefinitions = false;
+ }
+ index++;
+ }
+ return seriesDefinitions;
+ }
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactoryTest.java b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactoryTest.java
new file mode 100644
index 0000000000..bdbbc4a585
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/ChartBuilderFactoryTest.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import org.apache.qpid.disttest.charting.ChartType;
+
+import junit.framework.TestCase;
+
+public class ChartBuilderFactoryTest extends TestCase
+{
+ public void testLineChart()
+ {
+ ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.LINE);
+ assertTrue(builder instanceof LineChartBuilder);
+ }
+
+ public void testBarChart()
+ {
+ ChartBuilder builder = ChartBuilderFactory.createChartBuilder(ChartType.BAR);
+ assertTrue(builder instanceof BarChartBuilder);
+ }
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilderTest.java b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilderTest.java
new file mode 100644
index 0000000000..1b1c9969b3
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/chartbuilder/SeriesBuilderTest.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.chartbuilder;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import java.util.Collections;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.charting.definition.SeriesDefinition;
+
+public class SeriesBuilderTest extends TestCase
+{
+ private static final String TEST_SERIES_1_SELECT_STATEMENT = "SELECT A, B FROM test";
+ private static final String TEST_SERIES_1_LEGEND = "SERIES_1_LEGEND";
+
+ private DataPointCallback _dataPointCallback = mock(DataPointCallback.class);
+ private SeriesBuilder _seriesBuilder = new SeriesBuilder(_dataPointCallback);
+
+ private File _testTempDir;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _testTempDir = createTestTemporaryDirectory();
+ }
+
+ public void testBuildOneSeries() throws Exception
+ {
+ createTestCsvIn(_testTempDir);
+ SeriesDefinition seriesDefinition = createTestSeriesDefinition();
+
+ _seriesBuilder.build(Collections.singletonList(seriesDefinition));
+
+ verify(_dataPointCallback).addDataPointToSeries(seriesDefinition, (Object)"elephant", (Object)2.0);
+ verify(_dataPointCallback).addDataPointToSeries(seriesDefinition, (Object)"lion", (Object)3.0);
+ verify(_dataPointCallback).addDataPointToSeries(seriesDefinition, (Object)"tiger", (Object)4.0);
+ }
+
+ private void createTestCsvIn(File testDir) throws Exception
+ {
+ File csv = new File(_testTempDir, "test.csv");
+
+ PrintWriter csvWriter = new PrintWriter(new BufferedWriter(new FileWriter(csv)));
+ csvWriter.println("A,B");
+ csvWriter.println("elephant,2");
+ csvWriter.println("lion,3");
+ csvWriter.println("tiger,4");
+ csvWriter.close();
+ }
+
+ private SeriesDefinition createTestSeriesDefinition()
+ {
+ SeriesDefinition definition = new SeriesDefinition(TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, _testTempDir.getAbsolutePath());
+ return definition;
+ }
+
+ private File createTestTemporaryDirectory() throws Exception
+ {
+ File tmpDir = new File(System.getProperty("java.io.tmpdir"), "testdef" + System.nanoTime());
+ tmpDir.mkdirs();
+ tmpDir.deleteOnExit();
+ return tmpDir;
+ }
+
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreatorTest.java b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreatorTest.java
new file mode 100644
index 0000000000..80d1cc3d21
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/ChartingDefinitionCreatorTest.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+import static org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator.CHART_TITLE_KEY;
+import static org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator.CHART_TYPE_KEY;
+import static org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator.XAXIS_TITLE_KEY;
+import static org.apache.qpid.disttest.charting.definition.ChartingDefinitionCreator.YAXIS_TITLE_KEY;
+import static org.apache.qpid.disttest.charting.definition.SeriesDefinitionCreator.SERIES_STATEMENT_KEY_FORMAT;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.util.List;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.apache.qpid.disttest.charting.ChartType;
+import org.apache.qpid.disttest.charting.ChartingException;
+
+public class ChartingDefinitionCreatorTest extends TestCase
+{
+ private static final String TEST_CHART_TITLE = "CHART_TITLE";
+ private static final String TEST_XAXIS_TITLE = "XAXIS_TITLE";
+ private static final String TEST_YAXIS_TITLE = "YAXIS_TITLE";
+ private static final ChartType TEST_CHART_TYPE = ChartType.LINE;
+
+ private static final String TEST_SERIES_SELECT_STATEMENT = "SERIES_SELECT_STATEMENT";
+
+ private ChartingDefinitionCreator _chartingDefinitionLoader = new ChartingDefinitionCreator();
+ private File _testTempDir;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ _testTempDir = createTestTemporaryDirectory();
+ }
+
+ public void testLoadTwoDefinitionsFromDirectory() throws Exception
+ {
+ createTestDefinitionWithin(_testTempDir);
+ createTestDefinitionWithin(_testTempDir);
+
+ List<ChartingDefinition> definitions = _chartingDefinitionLoader.createFromFileOrDirectory(_testTempDir.getAbsolutePath());
+ assertEquals(2, definitions.size());
+ }
+
+ public void testLoadOneDefinitionFromFile() throws Exception
+ {
+ File testDefFile = createTestDefinitionWithin(_testTempDir);
+
+ List<ChartingDefinition> definitions = _chartingDefinitionLoader.createFromFileOrDirectory(testDefFile.getAbsolutePath());
+ assertEquals(1, definitions.size());
+
+ ChartingDefinition definition1 = definitions.get(0);
+ assertEquals(TEST_CHART_TITLE, definition1.getChartTitle());
+ }
+
+ public void testDefinitionsProperties() throws Exception
+ {
+ File testDefFile = createTestDefinitionWithin(_testTempDir);
+
+ List<ChartingDefinition> definitions = _chartingDefinitionLoader.createFromFileOrDirectory(testDefFile.getAbsolutePath());
+ assertEquals(1, definitions.size());
+
+ ChartingDefinition definition1 = definitions.get(0);
+ assertEquals(TEST_CHART_TITLE, definition1.getChartTitle());
+ assertEquals(TEST_XAXIS_TITLE, definition1.getXAxisTitle());
+ assertEquals(TEST_YAXIS_TITLE, definition1.getYAxisTitle());
+ assertEquals(TEST_CHART_TYPE, definition1.getChartType());
+
+ String stemOnly = testDefFile.getName().replaceFirst("\\.chartdef", "");
+ assertEquals(stemOnly, definition1.getChartStemName());
+
+ final List<SeriesDefinition> seriesDefinitions = definition1.getSeries();
+ assertEquals(1, seriesDefinitions.size());
+ SeriesDefinition seriesDefinition = seriesDefinitions.get(0);
+ assertEquals(TEST_SERIES_SELECT_STATEMENT, seriesDefinition.getSeriesStatement());
+ }
+
+ public void testDefinitionFileNotFound() throws Exception
+ {
+ File notFound = new File(_testTempDir,"notfound.chartdef");
+ assertFalse(notFound.exists());
+
+ try
+ {
+ _chartingDefinitionLoader.createFromFileOrDirectory(notFound.getAbsolutePath());
+ fail("Exception not thrown");
+ }
+ catch(ChartingException ce)
+ {
+ // PASS
+ }
+ }
+
+ private File createTestDefinitionWithin(File _testTempDir) throws Exception
+ {
+ final String testDefFileName = "test." + System.nanoTime() + ".chartdef";
+ File chartDef = new File(_testTempDir, testDefFileName);
+ chartDef.createNewFile();
+
+ Properties props = new Properties();
+ props.setProperty(CHART_TYPE_KEY, TEST_CHART_TYPE.name());
+ props.setProperty(CHART_TITLE_KEY, TEST_CHART_TITLE);
+ props.setProperty(XAXIS_TITLE_KEY, TEST_XAXIS_TITLE);
+ props.setProperty(YAXIS_TITLE_KEY, TEST_YAXIS_TITLE);
+
+ props.setProperty(String.format(SERIES_STATEMENT_KEY_FORMAT, 1), TEST_SERIES_SELECT_STATEMENT);
+
+ final FileWriter writer = new FileWriter(chartDef);
+ try
+ {
+ props.store(writer, "Test chart definition file");
+ }
+ finally
+ {
+ writer.close();
+ }
+
+ return chartDef;
+ }
+
+ private File createTestTemporaryDirectory() throws Exception
+ {
+ File tmpDir = new File(System.getProperty("java.io.tmpdir"), "testdef" + System.nanoTime());
+ tmpDir.mkdirs();
+ tmpDir.deleteOnExit();
+ return tmpDir;
+ }
+}
diff --git a/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreatorTest.java b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreatorTest.java
new file mode 100644
index 0000000000..2187793c53
--- /dev/null
+++ b/qpid/java/perftests/visualisation-jfc/src/test/java/org/apache/qpid/disttest/charting/definition/SeriesDefinitionCreatorTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.disttest.charting.definition;
+
+import static org.apache.qpid.disttest.charting.definition.SeriesDefinitionCreator.SERIES_DIRECTORY_KEY_FORMAT;
+import static org.apache.qpid.disttest.charting.definition.SeriesDefinitionCreator.SERIES_LEGEND_KEY_FORMAT;
+import static org.apache.qpid.disttest.charting.definition.SeriesDefinitionCreator.SERIES_STATEMENT_KEY_FORMAT;
+
+import java.util.List;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+public class SeriesDefinitionCreatorTest extends TestCase
+{
+ private static final String TEST_SERIES_1_SELECT_STATEMENT = "SERIES_1_SELECT_STATEMENT";
+ private static final String TEST_SERIES_1_LEGEND = "SERIES_1_LEGEND";
+ private static final String TEST_SERIES_1_DIR = "SERIES_1_DIR";
+
+ private static final String TEST_SERIES_1_DIR_WITH_SYSPROP = "${java.io.tmpdir}/mydir";
+
+ private static final String TEST_SERIES_2_SELECT_STATEMENT = "SERIES_2_SELECT_STATEMENT";
+ private static final String TEST_SERIES_2_LEGEND = "SERIES_2_LEGEND";
+ private static final String TEST_SERIES_2_DIR = "SERIES_2_DIR";
+
+ private Properties _properties = new Properties();
+
+ private SeriesDefinitionCreator _seriesDefinitionLoader = new SeriesDefinitionCreator();
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ }
+
+ public void testOneSeriesDefinition() throws Exception
+ {
+ createTestProperties(1, TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, TEST_SERIES_1_DIR);
+
+ List<SeriesDefinition> definitions = _seriesDefinitionLoader.createFromProperties(_properties);
+ assertEquals(1, definitions.size());
+
+ SeriesDefinition definition = definitions.get(0);
+ assertEquals(TEST_SERIES_1_SELECT_STATEMENT, definition.getSeriesStatement());
+ assertEquals(TEST_SERIES_1_LEGEND, definition.getSeriesLegend());
+ assertEquals(TEST_SERIES_1_DIR, definition.getSeriesDirectory());
+ }
+
+ public void testTwoSeriesDefinitions() throws Exception
+ {
+ createTestProperties(1, TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, TEST_SERIES_1_DIR);
+ createTestProperties(2, TEST_SERIES_2_SELECT_STATEMENT, TEST_SERIES_2_LEGEND, TEST_SERIES_2_DIR);
+
+ List<SeriesDefinition> definitions = _seriesDefinitionLoader.createFromProperties(_properties);
+ assertEquals(2, definitions.size());
+
+ SeriesDefinition seriesDefinition1 = definitions.get(0);
+ assertEquals(TEST_SERIES_1_SELECT_STATEMENT, seriesDefinition1.getSeriesStatement());
+ assertEquals(TEST_SERIES_1_LEGEND, seriesDefinition1.getSeriesLegend());
+ assertEquals(TEST_SERIES_1_DIR, seriesDefinition1.getSeriesDirectory());
+
+ SeriesDefinition seriesDefinition2 = definitions.get(1);
+ assertEquals(TEST_SERIES_2_SELECT_STATEMENT, seriesDefinition2.getSeriesStatement());
+ assertEquals(TEST_SERIES_2_LEGEND, seriesDefinition2.getSeriesLegend());
+ assertEquals(TEST_SERIES_2_DIR, seriesDefinition2.getSeriesDirectory());
+ }
+
+ public void testNonSequentialSeriesDefinitionsIgnored() throws Exception
+ {
+ createTestProperties(1, TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, TEST_SERIES_1_DIR);
+ createTestProperties(3, TEST_SERIES_2_SELECT_STATEMENT, TEST_SERIES_2_LEGEND, TEST_SERIES_2_DIR);
+
+ List<SeriesDefinition> definitions = _seriesDefinitionLoader.createFromProperties(_properties);
+ assertEquals(1, definitions.size());
+ }
+
+ public void testSeriesDirectorySubstitution() throws Exception
+ {
+ final String tmpDir = System.getProperty("java.io.tmpdir");
+ createTestProperties(1, TEST_SERIES_1_SELECT_STATEMENT, TEST_SERIES_1_LEGEND, TEST_SERIES_1_DIR_WITH_SYSPROP);
+
+ List<SeriesDefinition> definitions = _seriesDefinitionLoader.createFromProperties(_properties);
+ assertEquals(1, definitions.size());
+
+ SeriesDefinition seriesDefinition1 = definitions.get(0);
+ assertTrue(seriesDefinition1.getSeriesDirectory().startsWith(tmpDir));
+ }
+
+ private void createTestProperties(int index, String selectStatement, String seriesLegend, String seriesDir) throws Exception
+ {
+ _properties.setProperty(String.format(SERIES_STATEMENT_KEY_FORMAT, index), selectStatement);
+ _properties.setProperty(String.format(SERIES_LEGEND_KEY_FORMAT, index), seriesLegend);
+ _properties.setProperty(String.format(SERIES_DIRECTORY_KEY_FORMAT, index), seriesDir);
+ }
+
+}
diff --git a/qpid/java/systests/build.xml b/qpid/java/systests/build.xml
index fd7203dd40..6adce705cd 100644
--- a/qpid/java/systests/build.xml
+++ b/qpid/java/systests/build.xml
@@ -27,7 +27,7 @@ nn - or more contributor license agreements. See the NOTICE file
</and>
</condition>
- <property name="module.depends" value="client management/common broker broker/test common common/test junit-toolkit jca ${systests.optional.depends}"/>
+ <property name="module.depends" value="client management/common broker broker/test common amqp-1-0-common common/test jca ${systests.optional.depends}"/>
<property name="module.test.src" location="src/main/java"/>
<property name="module.test.excludes"
value="**/DropInTest.java,**/TestClientControlledTest.java"/>
diff --git a/qpid/java/systests/etc/bin/testclients.sh b/qpid/java/systests/etc/bin/testclients.sh
deleted file mode 100755
index 002f3d98bb..0000000000
--- a/qpid/java/systests/etc/bin/testclients.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-for x in `seq 1 $1`;
-do
- java -cp qpid-integrationtests-1.0-incubating-M2-SNAPSHOT-all-test-deps.jar -Dlog4j.configuration=file:/home/rupert/qpid/trunk/qpid/java/etc/mylog4j.xml org.apache.qpid.test.framework.distributedtesting.TestClient -n java$x &
-done
diff --git a/qpid/java/systests/etc/virtualhosts-systests-bdb-settings.xml b/qpid/java/systests/etc/virtualhosts-systests-bdb-settings.xml
index ce16523f13..216046b40b 100644
--- a/qpid/java/systests/etc/virtualhosts-systests-bdb-settings.xml
+++ b/qpid/java/systests/etc/virtualhosts-systests-bdb-settings.xml
@@ -26,7 +26,7 @@
<name>localhost</name>
<localhost>
<store>
- <class>org.apache.qpid.server.store.berkeleydb.BDBMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory</factoryclass>
<environment-path>${work}/bdbstore/localhost-store</environment-path>
</store>
</localhost>
@@ -36,7 +36,7 @@
<name>development</name>
<development>
<store>
- <class>org.apache.qpid.server.store.berkeleydb.BDBMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory</factoryclass>
<environment-path>${work}/bdbstore/development-store</environment-path>
</store>
</development>
@@ -46,7 +46,7 @@
<name>test</name>
<test>
<store>
- <class>org.apache.qpid.server.store.berkeleydb.BDBMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory</factoryclass>
<environment-path>${work}/bdbstore/test-store</environment-path>
</store>
</test>
diff --git a/qpid/java/systests/etc/virtualhosts-systests-derby-settings.xml b/qpid/java/systests/etc/virtualhosts-systests-derby-settings.xml
index ed5ffbb1fd..d494768e91 100644
--- a/qpid/java/systests/etc/virtualhosts-systests-derby-settings.xml
+++ b/qpid/java/systests/etc/virtualhosts-systests-derby-settings.xml
@@ -26,7 +26,7 @@
<virtualhost>
<localhost>
<store>
- <class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
<environment-path>${QPID_WORK}/derbyDB/localhost-store</environment-path>
</store>
</localhost>
@@ -35,8 +35,8 @@
<virtualhost>
<development>
<store>
- <class>org.apache.qpid.server.store.DerbyMessageStore</class>
- <environment-path>${QPID_WORK}/derbyDB/development-store</environment-path>
+ <factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
+ <environment-path>${QPID_WORK}/derbyDB/development-store</environment-path>
</store>
</development>
</virtualhost>
@@ -44,7 +44,7 @@
<virtualhost>
<test>
<store>
- <class>org.apache.qpid.server.store.DerbyMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.derby.DerbyMessageStoreFactory</factoryclass>
<environment-path>${QPID_WORK}/derbyDB/test-store</environment-path>
</store>
</test>
diff --git a/qpid/java/systests/etc/virtualhosts-systests-firewall-2.xml b/qpid/java/systests/etc/virtualhosts-systests-firewall-2.xml
index 20908e6eb4..f8e9fde8ca 100644
--- a/qpid/java/systests/etc/virtualhosts-systests-firewall-2.xml
+++ b/qpid/java/systests/etc/virtualhosts-systests-firewall-2.xml
@@ -26,7 +26,7 @@
<name>test</name>
<test>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
</store>
</test>
</virtualhost>
@@ -35,7 +35,7 @@
<name>test2</name>
<test2>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
</store>
<security>
<firewall default-action="deny">
diff --git a/qpid/java/systests/etc/virtualhosts-systests-firewall-3.xml b/qpid/java/systests/etc/virtualhosts-systests-firewall-3.xml
index 90377f345f..95db02672a 100644
--- a/qpid/java/systests/etc/virtualhosts-systests-firewall-3.xml
+++ b/qpid/java/systests/etc/virtualhosts-systests-firewall-3.xml
@@ -26,7 +26,7 @@
<name>test</name>
<test>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
</store>
</test>
</virtualhost>
@@ -35,7 +35,7 @@
<name>test2</name>
<test2>
<store>
- <class>org.apache.qpid.server.store.MemoryMessageStore</class>
+ <factoryclass>org.apache.qpid.server.store.MemoryMessageStoreFactory</factoryclass>
</store>
<security>
<firewall default-action="deny"/>
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/client/redelivered/RedeliveredMessageTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/client/redelivered/RedeliveredMessageTest.java
index cd74691035..0f12c8c7e6 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/client/redelivered/RedeliveredMessageTest.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/client/redelivered/RedeliveredMessageTest.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
package org.apache.qpid.client.redelivered;
import org.apache.qpid.test.utils.QpidBrokerTestCase;
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/jms/xa/XAResourceTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/jms/xa/XAResourceTest.java
index c8ffe8571d..ac29b72620 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/jms/xa/XAResourceTest.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/jms/xa/XAResourceTest.java
@@ -90,15 +90,6 @@ public class XAResourceTest extends QpidBrokerTestCase
}
@Override
- public void stopBroker(int port) throws Exception
- {
- if (isBrokerPresent(port))
- {
- super.stopBroker(port);
- }
- }
-
- @Override
public void tearDown() throws Exception
{
try
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/ra/QpidRAConnectionTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/ra/QpidRAConnectionTest.java
index 658e1fca1f..0ca90ac2ea 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/ra/QpidRAConnectionTest.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/ra/QpidRAConnectionTest.java
@@ -86,12 +86,4 @@ public class QpidRAConnectionTest extends QpidBrokerTestCase
c.close();
}
}
- @Override
- public void stopBroker(int port) throws Exception
- {
- if (isBrokerPresent(port))
- {
- super.stopBroker(port);
- }
- }
}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java
index c42bb3b1fa..0e3a658e32 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/server/SupportedProtocolVersionsTest.java
@@ -77,6 +77,7 @@ public class SupportedProtocolVersionsTest extends QpidBrokerTestCase
public void testDisabling010() throws Exception
{
//disable 0-10 support
+ setConfigurationProperty("connector.amqp10enabled", "false");
setConfigurationProperty("connector.amqp010enabled", "false");
super.setUp();
@@ -92,6 +93,7 @@ public class SupportedProtocolVersionsTest extends QpidBrokerTestCase
public void testDisabling091and010() throws Exception
{
//disable 0-91 and 0-10 support
+ setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP10ENABLED, "false");
setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP010ENABLED, "false");
setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP091ENABLED, "false");
@@ -111,6 +113,7 @@ public class SupportedProtocolVersionsTest extends QpidBrokerTestCase
setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP09ENABLED, "false");
setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP091ENABLED, "false");
setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP010ENABLED, "false");
+ setConfigurationProperty(ServerConfiguration.CONNECTOR_AMQP10ENABLED, "false");
super.setUp();
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java
deleted file mode 100644
index 4a92f04b30..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.exchange;
-
-import org.apache.qpid.jms.Session;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-/**
- * MessagingTestConfigProperties defines a set of property names and default values for specifying a messaging topology,
- * and test parameters for running a messaging test over that topology. A Properties object holding some of these
- * properties, superimposed onto the defaults, is used to establish test topologies and control test behaviour.
- *
- * <p/>A complete list of the parameters, default values and comments on their usage is provided here:
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> messageSize <td> 0 <td> Message size in bytes. Not including any headers.
- * <tr><td> destinationName <td> ping <td> The root name to use to generate destination names to ping.
- * <tr><td> persistent <td> false <td> Determines whether peristent delivery is used.
- * <tr><td> transacted <td> false <td> Determines whether messages are sent/received in transactions.
- * <tr><td> broker <td> tcp://localhost:5672 <td> Determines the broker to connect to.
- * <tr><td> virtualHost <td> test <td> Determines the virtual host to send all ping over.
- * <tr><td> rate <td> 0 <td> The maximum rate (in hertz) to send messages at. 0 means no limit.
- * <tr><td> verbose <td> false <td> The verbose flag for debugging. Prints to console on every message.
- * <tr><td> pubsub <td> false <td> Whether to ping topics or queues. Uses p2p by default.
- * <tr><td> username <td> guest <td> The username to access the broker with.
- * <tr><td> password <td> guest <td> The password to access the broker with.
- * <tr><td> selector <td> null <td> Not used. Defines a message selector to filter pings with.
- * <tr><td> destinationCount <td> 1 <td> The number of receivers listening to the pings.
- * <tr><td> timeout <td> 30000 <td> In milliseconds. The timeout to stop waiting for replies.
- * <tr><td> commitBatchSize <td> 1 <td> The number of messages per transaction in transactional mode.
- * <tr><td> uniqueDests <td> true <td> Whether each receiver only listens to one ping destination or all.
- * <tr><td> durableDests <td> false <td> Whether or not durable destinations are used.
- * <tr><td> ackMode <td> AUTO_ACK <td> The message acknowledgement mode. Possible values are:
- * 0 - SESSION_TRANSACTED
- * 1 - AUTO_ACKNOWLEDGE
- * 2 - CLIENT_ACKNOWLEDGE
- * 3 - DUPS_OK_ACKNOWLEDGE
- * 257 - NO_ACKNOWLEDGE
- * 258 - PRE_ACKNOWLEDGE
- * <tr><td> maxPending <td> 0 <td> The maximum size in bytes, of messages sent but not yet received.
- * Limits the volume of messages currently buffered on the client
- * or broker. Can help scale test clients by limiting amount of buffered
- * data to avoid out of memory errors.
- * </table>
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide the names and defaults of all test parameters.
- * </table>
- */
-public class MessagingTestConfigProperties
-{
- // ====================== Connection Properties ==================================
-
- /** Holds the name of the default connection configuration. */
- public static final String CONNECTION_NAME = "broker";
-
- /** Holds the name of the property to get the initial context factory name from. */
- public static final String INITIAL_CONTEXT_FACTORY_PROPNAME = "java.naming.factory.initial";
-
- /** Defines the class to use as the initial context factory by default. */
- public static final String INITIAL_CONTEXT_FACTORY_DEFAULT = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
-
- /** Holds the name of the default connection factory configuration property. */
- public static final String CONNECTION_PROPNAME = "connectionfactory.broker";
-
- /** Holds the name of the property to get the test broker url from. */
- public static final String BROKER_PROPNAME = "qpid.test.broker";
-
- /** Holds the name of the property to get the test broker virtual path. */
- public static final String VIRTUAL_HOST_PROPNAME = "virtualHost";
-
- /** Holds the default virtual path for the test. */
- public static final String VIRTUAL_HOST_DEFAULT = "";
-
- /** Holds the name of the property to get the broker access username from. */
- public static final String USERNAME_PROPNAME = "username";
-
- /** Holds the default broker log on username. */
- public static final String USERNAME_DEFAULT = "guest";
-
- /** Holds the name of the property to get the broker access password from. */
- public static final String PASSWORD_PROPNAME = "password";
-
- /** Holds the default broker log on password. */
- public static final String PASSWORD_DEFAULT = "guest";
-
- // ====================== Messaging Topology Properties ==========================
-
- /** Holds the name of the property to get the bind publisher procuder flag from. */
- public static final String PUBLISHER_PRODUCER_BIND_PROPNAME = "publisherProducerBind";
-
- /** Holds the default value of the publisher producer flag. */
- public static final boolean PUBLISHER_PRODUCER_BIND_DEFAULT = true;
-
- /** Holds the name of the property to get the bind publisher procuder flag from. */
- public static final String PUBLISHER_CONSUMER_BIND_PROPNAME = "publisherConsumerBind";
-
- /** Holds the default value of the publisher consumer flag. */
- public static final boolean PUBLISHER_CONSUMER_BIND_DEFAULT = false;
-
- /** Holds the name of the property to get the bind receiver procuder flag from. */
- public static final String RECEIVER_PRODUCER_BIND_PROPNAME = "receiverProducerBind";
-
- /** Holds the default value of the receiver producer flag. */
- public static final boolean RECEIVER_PRODUCER_BIND_DEFAULT = false;
-
- /** Holds the name of the property to get the bind receiver procuder flag from. */
- public static final String RECEIVER_CONSUMER_BIND_PROPNAME = "receiverConsumerBind";
-
- /** Holds the default value of the receiver consumer flag. */
- public static final boolean RECEIVER_CONSUMER_BIND_DEFAULT = true;
-
- /** Holds the name of the property to get the destination name root from. */
- public static final String SEND_DESTINATION_NAME_ROOT_PROPNAME = "sendDestinationRoot";
-
- /** Holds the root of the name of the default destination to send to. */
- public static final String SEND_DESTINATION_NAME_ROOT_DEFAULT = "sendTo";
-
- /** Holds the name of the property to get the destination name root from. */
- public static final String RECEIVE_DESTINATION_NAME_ROOT_PROPNAME = "receiveDestinationRoot";
-
- /** Holds the root of the name of the default destination to send to. */
- public static final String RECEIVE_DESTINATION_NAME_ROOT_DEFAULT = "receiveFrom";
-
- /** Holds the name of the proeprty to get the destination count from. */
- public static final String DESTINATION_COUNT_PROPNAME = "destinationCount";
-
- /** Defines the default number of destinations to ping. */
- public static final int DESTINATION_COUNT_DEFAULT = 1;
-
- /** Holds the name of the property to get the p2p or pub/sub messaging mode from. */
- public static final String PUBSUB_PROPNAME = "pubsub";
-
- /** Holds the pub/sub mode default, true means ping a topic, false means ping a queue. */
- public static final boolean PUBSUB_DEFAULT = false;
-
- // ====================== JMS Options and Flags =================================
-
- /** Holds the name of the property to get the test delivery mode from. */
- public static final String PERSISTENT_MODE_PROPNAME = "persistent";
-
- /** Holds the message delivery mode to use for the test. */
- public static final boolean PERSISTENT_MODE_DEFAULT = false;
-
- /** Holds the name of the property to get the test transactional mode from. */
- public static final String TRANSACTED_PROPNAME = "transacted";
-
- /** Holds the transactional mode to use for the test. */
- public static final boolean TRANSACTED_DEFAULT = false;
-
- /** Holds the name of the property to set the no local flag from. */
- public static final String NO_LOCAL_PROPNAME = "noLocal";
-
- /** Defines the default value of the no local flag to use when consuming messages. */
- public static final boolean NO_LOCAL_DEFAULT = false;
-
- /** Holds the name of the property to get the message acknowledgement mode from. */
- public static final String ACK_MODE_PROPNAME = "ackMode";
-
- /** Defines the default message acknowledgement mode. */
- public static final int ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE;
-
- /** Holds the name of the property to get the durable subscriptions flag from, when doing pub/sub messaging. */
- public static final String DURABLE_SUBSCRIPTION_PROPNAME = "durableSubscription";
-
- /** Defines the default value of the durable subscriptions flag. */
- public static final boolean DURABLE_SUBSCRIPTION_DEFAULT = false;
-
- // ====================== Qpid Options and Flags ================================
-
- /** Holds the name of the property to set the exclusive flag from. */
- public static final String EXCLUSIVE_PROPNAME = "exclusive";
-
- /** Defines the default value of the exclusive flag to use when consuming messages. */
- public static final boolean EXCLUSIVE_DEFAULT = false;
-
- /** Holds the name of the property to set the immediate flag from. */
- public static final String IMMEDIATE_PROPNAME = "immediate";
-
- /** Defines the default value of the immediate flag to use when sending messages. */
- public static final boolean IMMEDIATE_DEFAULT = false;
-
- /** Holds the name of the property to set the mandatory flag from. */
- public static final String MANDATORY_PROPNAME = "mandatory";
-
- /** Defines the default value of the mandatory flag to use when sending messages. */
- public static final boolean MANDATORY_DEFAULT = false;
-
- /** Holds the name of the property to get the durable destinations flag from. */
- public static final String DURABLE_DESTS_PROPNAME = "durableDests";
-
- /** Default value for the durable destinations flag. */
- public static final boolean DURABLE_DESTS_DEFAULT = false;
-
- /** Holds the name of the proeprty to set the prefetch size from. */
- public static final String PREFECTH_PROPNAME = "prefetch";
-
- /** Defines the default prefetch size to use when consuming messages. */
- public static final int PREFETCH_DEFAULT = 100;
-
- // ====================== Common Test Parameters ================================
-
- /** Holds the name of the property to get the test message size from. */
- public static final String MESSAGE_SIZE_PROPNAME = "messageSize";
-
- /** Used to set up a default message size. */
- public static final int MESSAGE_SIZE_DEAFULT = 0;
-
- /** Holds the name of the property to get the message rate from. */
- public static final String RATE_PROPNAME = "rate";
-
- /** Defines the default rate (in pings per second) to send pings at. 0 means as fast as possible, no restriction. */
- public static final int RATE_DEFAULT = 0;
-
- /** Holds the name of the proeprty to get the. */
- public static final String SELECTOR_PROPNAME = "selector";
-
- /** Holds the default message selector. */
- public static final String SELECTOR_DEFAULT = "";
-
- /** Holds the name of the property to get the waiting timeout for response messages. */
- public static final String TIMEOUT_PROPNAME = "timeout";
-
- /** Default time to wait before assuming that a ping has timed out. */
- public static final long TIMEOUT_DEFAULT = 30000;
-
- /** Holds the name of the property to get the commit batch size from. */
- public static final String TX_BATCH_SIZE_PROPNAME = "commitBatchSize";
-
- /** Defines the default number of pings to send in each transaction when running transactionally. */
- public static final int TX_BATCH_SIZE_DEFAULT = 1;
-
- /** Holds the name of the property to set the maximum amount of pending message data for a producer to hold. */
- public static final String MAX_PENDING_PROPNAME = "maxPending";
-
- /** Defines the default maximum quantity of pending message data to allow producers to hold. */
- public static final int MAX_PENDING_DEFAULT = 0;
-
- /** Holds the name of the property to get the verbose mode proeprty from. */
- public static final String VERBOSE_PROPNAME = "verbose";
-
- /** Holds the default verbose mode. */
- public static final boolean VERBOSE_DEFAULT = false;
-
- /** Holds the default configuration properties. */
- public static ParsedProperties defaults = new ParsedProperties();
-
- static
- {
- defaults.setPropertyIfNull(INITIAL_CONTEXT_FACTORY_PROPNAME, INITIAL_CONTEXT_FACTORY_DEFAULT);
- defaults.setPropertyIfNull(MESSAGE_SIZE_PROPNAME, MESSAGE_SIZE_DEAFULT);
- defaults.setPropertyIfNull(PUBLISHER_PRODUCER_BIND_PROPNAME, PUBLISHER_PRODUCER_BIND_DEFAULT);
- defaults.setPropertyIfNull(PUBLISHER_CONSUMER_BIND_PROPNAME, PUBLISHER_CONSUMER_BIND_DEFAULT);
- defaults.setPropertyIfNull(RECEIVER_PRODUCER_BIND_PROPNAME, RECEIVER_PRODUCER_BIND_DEFAULT);
- defaults.setPropertyIfNull(RECEIVER_CONSUMER_BIND_PROPNAME, RECEIVER_CONSUMER_BIND_DEFAULT);
- defaults.setPropertyIfNull(SEND_DESTINATION_NAME_ROOT_PROPNAME, SEND_DESTINATION_NAME_ROOT_DEFAULT);
- defaults.setPropertyIfNull(RECEIVE_DESTINATION_NAME_ROOT_PROPNAME, RECEIVE_DESTINATION_NAME_ROOT_DEFAULT);
- defaults.setPropertyIfNull(PERSISTENT_MODE_PROPNAME, PERSISTENT_MODE_DEFAULT);
- defaults.setPropertyIfNull(TRANSACTED_PROPNAME, TRANSACTED_DEFAULT);
- defaults.setPropertyIfNull(VIRTUAL_HOST_PROPNAME, VIRTUAL_HOST_DEFAULT);
- defaults.setPropertyIfNull(RATE_PROPNAME, RATE_DEFAULT);
- defaults.setPropertyIfNull(VERBOSE_PROPNAME, VERBOSE_DEFAULT);
- defaults.setPropertyIfNull(PUBSUB_PROPNAME, PUBSUB_DEFAULT);
- defaults.setPropertyIfNull(USERNAME_PROPNAME, USERNAME_DEFAULT);
- defaults.setPropertyIfNull(PASSWORD_PROPNAME, PASSWORD_DEFAULT);
- defaults.setPropertyIfNull(SELECTOR_PROPNAME, SELECTOR_DEFAULT);
- defaults.setPropertyIfNull(DESTINATION_COUNT_PROPNAME, DESTINATION_COUNT_DEFAULT);
- defaults.setPropertyIfNull(TIMEOUT_PROPNAME, TIMEOUT_DEFAULT);
- defaults.setPropertyIfNull(TX_BATCH_SIZE_PROPNAME, TX_BATCH_SIZE_DEFAULT);
- defaults.setPropertyIfNull(DURABLE_DESTS_PROPNAME, DURABLE_DESTS_DEFAULT);
- defaults.setPropertyIfNull(ACK_MODE_PROPNAME, ACK_MODE_DEFAULT);
- defaults.setPropertyIfNull(DURABLE_SUBSCRIPTION_PROPNAME, DURABLE_SUBSCRIPTION_DEFAULT);
- defaults.setPropertyIfNull(MAX_PENDING_PROPNAME, MAX_PENDING_DEFAULT);
- defaults.setPropertyIfNull(PREFECTH_PROPNAME, PREFETCH_DEFAULT);
- defaults.setPropertyIfNull(NO_LOCAL_PROPNAME, NO_LOCAL_DEFAULT);
- defaults.setPropertyIfNull(EXCLUSIVE_PROPNAME, EXCLUSIVE_DEFAULT);
- defaults.setPropertyIfNull(IMMEDIATE_PROPNAME, IMMEDIATE_DEFAULT);
- defaults.setPropertyIfNull(MANDATORY_PROPNAME, MANDATORY_DEFAULT);
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java
deleted file mode 100644
index e32edff692..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/DerbyMessageStoreLoggingTest.java
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.server.logging;
-
-import org.apache.qpid.server.configuration.ServerConfiguration;
-import org.apache.qpid.server.logging.subjects.AbstractTestLogSubject;
-
-import javax.jms.Connection;
-import javax.jms.Queue;
-import javax.jms.Session;
-import java.io.File;
-import java.util.List;
-
-/**
- * The MessageStore test suite validates that the follow log messages as
- * specified in the Functional Specification.
- *
- * This suite of tests validate that the MessageStore messages occur correctly
- * and according to the following format:
- *
- * MST-1001 : Created : <name>
- * MST-1003 : Closed
- *
- * NOTE: Only for Persistent Stores
- * MST-1002 : Store location : <path>
- * MST-1004 : Recovery Start [: <queue.name>]
- * MST-1005 : Recovered <count> messages for queue <queue.name>
- * MST-1006 : Recovery Complete [: <queue.name>]
- */
-public class DerbyMessageStoreLoggingTest extends MemoryMessageStoreLoggingTest
-{
-
- @Override
- public void setUp() throws Exception
- {
- super.setUp();
- // MemoryMessageStoreLoggingTest setUp itself does not call super.setUp
- //We call super.setUp but this will not start the broker as that is
- //part of the test case.
-
- // Load the default configuration file to get the list of defined vhosts
- ServerConfiguration configuration = new ServerConfiguration(new File(_configFile.getParent() + "/config.xml"));
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- // Make them all persistent i.e. Use DerbyMessageStore and
- // test that it logs correctly.
- for (String vhost : vhosts)
- {
- makeVirtualHostPersistent(vhost);
- }
- }
-
- /**
- * Description:
- * Persistent MessageStores will require space on disk to persist the data.
- * This value will be logged on startup after the MessageStore has been
- * created.
- * Input:
- * Default configuration
- * Output:
- *
- * <date> MST-1002 : Store location : <path>
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. This must occur after MST-1001
- */
- public void testMessageStoreStoreLocation() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1002");
-
- assertEquals("Each vhost did not close its store.", vhosts.size(), results.size());
-
- for (int index = 0; index < results.size(); index++)
- {
- String result = getLogMessage(results, index);;
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertTrue("MST-1002 does not contain a store path" + getMessageString(result),
- getMessageString(result).length() > 0);
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- }
-
- /**
- * Description:
- * Persistent message stores may have state on disk that they must recover
- * during startup. As the MessageStore starts up it will report that it is
- * about to start the recovery process by logging MST-1004. This message
- * will always be logged for persistent MessageStores. If there is no data
- * to recover then there will be no subsequent recovery messages.
- * Input:
- * Default persistent configuration
- * Output:
- * <date> MST-1004 : Recovery Start
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. The MessageStore must have first logged a creation event.
- */
- public void testMessageStoreRecoveryStart() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1004");
-
- assertTrue("Each vhost did not close its store.", vhosts.size() <= results.size());
-
- for (int index = 0; index < results.size(); index++)
- {
- String result = getLogMessage(results, index);;
-
- if (getMessageString(result).contains("Recovery Start :"))
- {
- //Don't test queue start recoveries
- continue;
- }
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertEquals("MST-1004 does have expected message", "Recovery Start",
- getMessageString(result));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- }
-
- /**
- * Description:
- * Once all persistent queues have been recovered and the MessageStore has completed all recovery it must logged that the recovery process has completed.
- * Input:
- * Default persistent configuration
- * Output:
- *
- * <date> MST-1006 : Recovery Complete
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. This is the last message from the MessageStore during startup.
- * 3. This must be proceeded by a MST-1006 Recovery Start.
- */
- public void testMessageStoreRecoveryComplete() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1006");
-
- assertTrue("Each vhost did not close its store.", vhosts.size() <= results.size());
-
- for (int index = 0; index < results.size(); index++)
- {
- String result = getLogMessage(results, index);
-
- if (getMessageString(result).contains("Recovery Complete :"))
- {
- //Don't test queue start recoveries
- continue;
- }
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertEquals("MST-1006 does have expected message", "Recovery Complete",
- getMessageString(result));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- }
-
- /**
- * Description:
- * A persistent MessageStore may have data to recover from disk. The message store will use MST-1004 to report the start of recovery for a specific queue that it has previously persisted.
- * Input:
- * Default persistent configuration
- * Output:
- *
- * <date> MST-1004 : Recovery Start : <queue.name>
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. This must occur after the recovery start MST-1004 has been logged.
- */
- public void testMessageStoreQueueRecoveryStart() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1004 : Recovery Start :");
-
- // We are only looking for the default queue defined in local host being
- // recovered. If other tests have made queues in test then we want to
- // exclude them here.
- results = filterResultsByVirtualHost(results, "/localhost");
-
- assertEquals("Recovered test queue not found.", 1, results.size());
-
- String result = getLogMessage(results, 0);
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertTrue("MST-1006 does end with queue 'test-queue':" + getMessageString(result),
- getMessageString(result).endsWith("test-queue"));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
-
- }
-
- /**
- * Description:
- * After the queue has been recovered the store will log that recovery has been completed. The MessageStore must not report further status about the recovery of this queue after this message. In addition every MST-1004 queue recovery start message must be matched with a MST-1006 recovery complete.
- * Input:
- * Default persistent configuration
- * Output:
- *
- * <date> MST-1006 : Recovery Complete : <queue.name>
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. This must occur after the queue recovery start MST-1004 has been logged.
- * 3. The queue.name is non-empty
- * 4. The queue.name correlates with a previous recovery start
- */
- public void testMessageStoreQueueRecoveryComplete() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1006 : Recovery Complete :");
-
- // We are only looking for the default queue defined in local host being
- // recovered. If other tests have made queues in test then we want to
- // exclude them here.
- results = filterResultsByVirtualHost(results, "/localhost");
-
- assertEquals("Recovered test queue not found.", 1, results.size());
-
- String result = getLogMessage(results, 0);
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertTrue("MST-1006 does end with queue 'test-queue':" + getMessageString(result),
- getMessageString(result).endsWith("test-queue"));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
-
- results = findMatches("MST-1004 : Recovery Start : test-queue");
-
- assertEquals("MST-1004 for test-queue not found", 1, results.size());
- }
-
- /**
- * Description:
- * A persistent queue must be persisted so that on recovery it can be restored independently of any messages that may be stored on it. This test verifies that the MessageStore will log that it has recovered 0 messages for persistent queues that do not have any messages.
- * Input:
- *
- * 1. Default persistent configuration
- * 2. Persistent queue with no messages enqueued
- * Output:
- *
- * <date> MST-1005 : Recovered 0 messages for queue <queue.name>
- *
- * Validation Steps:
- * 3. The MST ID is correct
- * 4. This must occur after the queue recovery start MST-1004 has been logged.
- * 5. The count is 0
- * 6. 'messages' is correctly printed
- * 7. The queue.name is non-empty
- */
- public void testMessageStoreQueueRecoveryCountEmpty() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- String queueName = getTestQueueName();
-
- startBroker();
- Connection connetion = getConnection();
- Session session = connetion.createSession(false, Session.AUTO_ACKNOWLEDGE);
- Queue queue = session.createQueue("direct://amq.direct/" + queueName + "/" + queueName + "?durable='true'");
-
- session.createConsumer(queue).close();
-
- // Stop the broker so that we can test recovery
- stopBroker();
-
- int COUNT = 0;
- testDurableRecoveryCount(COUNT, queueName);
- }
-
- /**
- * Description:
- * On recovery all the persistent messages that are stored on disk must be returned to the queue. MST-1005 will report the number of messages that have been recovered from disk.
- * Input:
- *
- * 1. Default persistent configuration
- * 2. Persistent queue with multiple messages enqueued
- * Output:
- *
- * <date> MST-1005 : Recovered <count> messages for queue <queue.name>
- *
- * Validation Steps:
- * 3. The MST ID is correct
- * 4. This must occur after the queue recovery start MST-1004 has been logged.
- * 5. The count is > 1
- * 6. 'messages' is correctly printed
- * 7. The queue.name is non-empty
- */
- public void testMessageStoreQueueRecoveryCountPlural() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- String queueName = getTestQueueName();
-
- int COUNT = 10;
-
- testDurableRecoveryCount(COUNT, queueName);
- }
-
- /**
- * Send a set number of messages to a new durable queue, as specified. Then
- * restart the broker and validate that they are restored.
- *
- * @param COUNT - the count to send
- * @param queueName - the new queue name
- * @throws Exception - if a problem occured.
- */
- private void testDurableRecoveryCount(int COUNT, String queueName) throws Exception
- {
- startBroker();
- Connection connetion = getConnection();
- Session session = connetion.createSession(false, Session.AUTO_ACKNOWLEDGE);
- Queue queue = session.createQueue("direct://amq.direct/" + queueName + "/" + queueName + "?durable='true'");
-
- session.createConsumer(queue).close();
-
- sendMessage(session, queue, COUNT);
- try
- {
- connetion.close();
-
- stopBroker();
-
- // Clear our monitor
- _monitor.markDiscardPoint();
-
- startBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = configuration.getConfig().getList("virtualhosts.virtualhost.name");
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1004 : Recovery Start : " + queueName);
-
- assertEquals("Recovered test queue not found.", 1, results.size());
-
- String result = getLogMessage(results, 0);
-
- validateMessageID("MST-1004", result);
-
- assertTrue("MST-1004 does end with queue '" + queueName + "':" + getMessageString(result),
- getMessageString(result).endsWith(queueName));
-
- results = waitAndFindMatches("MST-1005");
-
- assertTrue("Insufficient MST-1005 logged.", results.size()>0);
-
- result = null;
-
- // If the first message is not our queue the second one will be
- for(String resultEntry : results)
- {
- // Look for first match and set that to result
- if (resultEntry.contains(queueName))
- {
- result = getLog(resultEntry);
- break;
- }
- }
-
- assertNotNull("MST-1005 entry for queue:" + queueName + ". Not found", result);
-
- // getSlize will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // To get the store class used in the configuration we need to know
- // the virtualhost name, found above. AND
- // the index that the virtualhost is within the configuration.
- // we can retrive that from the vhosts list previously extracted.
- String fullStoreName = configuration.getConfig().getString("virtualhosts.virtualhost(" + vhosts.indexOf(vhostName) + ")." + vhostName + ".store.class");
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertTrue("MST-1005 does end with queue 'test-queue':" + getMessageString(result),
- getMessageString(result).endsWith(queueName));
-
- assertTrue("MST-1005 does end show correct count:" + getMessageString(result),
- getMessageString(result).contains("Recovered " + COUNT + " messages"));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- finally
- {
- //Ensure we attempt to drain the queue.
- assertEquals("Unable to drain queue", COUNT, drainQueue(queue));
- }
- }
-
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java
deleted file mode 100644
index e6e1196cc6..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/server/logging/MemoryMessageStoreLoggingTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
-*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied. See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*
-*/
-package org.apache.qpid.server.logging;
-
-import org.apache.qpid.server.configuration.ServerConfiguration;
-import org.apache.qpid.server.logging.subjects.AbstractTestLogSubject;
-import org.apache.qpid.util.LogMonitor;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * The MessageStore test suite validates that the follow log messages as
- * specified in the Functional Specification.
- *
- * This suite of tests validate that the MessageStore messages occur correctly
- * and according to the following format:
- *
- * MST-1001 : Created : <name>
- * MST-1003 : Closed
- *
- * NOTE: Only for Persistent Stores
- * MST-1002 : Store location : <path>
- * MST-1004 : Recovery Start [: <queue.name>]
- * MST-1005 : Recovered <count> messages for queue <queue.name>
- * MST-1006 : Recovery Complete [: <queue.name>]
- */
-public class MemoryMessageStoreLoggingTest extends AbstractTestLogging
-{
- protected static final String MESSAGES_STORE_PREFIX = "MST-";
-
- public void setUp() throws Exception
- {
- //We explicitly do not call super.setUp as starting up the broker is
- //part of the test case.
- // So we have to make the new Log Monitor here
-
- _monitor = new LogMonitor(_outputFile);
- }
-
- /**
- * Description:
- * During Virtualhost startup a MessageStore will be created. The first MST
- * message that must be logged is the MST-1001 MessageStore creation.
- * Input:
- * Default configuration
- * Output:
- * <date> MST-1001 : Created : <name>
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. The <name> is the correct MessageStore type as specified in the Default configuration
- *
- * @throws Exception caused by broker startup
- */
- public void testMessageStoreCreation() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- super.setUp();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- String log = getLogMessage(results, 0);
- //1
- assertEquals("MST-1001 is not the first MST message", "MST-1001", getMessageID(fromMessage(log)));
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1001");
-
- // Load VirtualHost list from file.
- List<String> vhosts = Arrays.asList(getServerConfig().getVirtualHosts());
-
- assertEquals("Each vhost did not create a store.", vhosts.size(), results.size());
-
- for (int index = 0; index < results.size(); index++)
- {
- String result = getLogMessage(results, index);
-
- // getSlice will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // Get the store class used in the configuration for the virtualhost.
- String fullStoreName = getServerConfig().getVirtualHostConfig(vhostName).getMessageStoreClass();
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertTrue("MST-1001 does not contains correct store name:"
- + storeName + ":" + result, getMessageString(result).endsWith(storeName));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- }
-
- /**
- * Description:
- * During shutdown the MessageStore will also cleanly close. When this has
- * completed a MST-1003 closed message will be logged. No further messages
- * from this MessageStore will be logged after this message.
- *
- * Input:
- * Default configuration
- * Output:
- * <date> MST-1003 : Closed
- *
- * Validation Steps:
- *
- * 1. The MST ID is correct
- * 2. This is teh last log message from this MessageStore
- *
- * @throws Exception caused by broker startup
- */
- public void testMessageStoreClose() throws Exception
- {
- assertLoggingNotYetOccured(MESSAGES_STORE_PREFIX);
-
- super.setUp();
-
- //Stop the broker so we get the close messages.
- stopBroker();
-
- List<String> results = waitAndFindMatches(MESSAGES_STORE_PREFIX);
-
- // Validation
-
- assertTrue("MST messages not logged", results.size() > 0);
-
- // Load VirtualHost list from file.
- ServerConfiguration configuration = new ServerConfiguration(_configFile);
- configuration.initialise();
- List<String> vhosts = Arrays.asList(configuration.getVirtualHosts());
-
- //Validate each vhost logs a creation
- results = waitAndFindMatches("MST-1003");
-
- assertEquals("Each vhost did not close its store.", vhosts.size(), results.size());
-
- for (int index = 0; index < results.size(); index++)
- {
- String result = getLogMessage(results, index);
-
- // getSlice will return extract the vhost from vh(/test) -> '/test'
- // so remove the '/' to get the name
- String vhostName = AbstractTestLogSubject.getSlice("vh", result).substring(1);
-
- // Get the store class used in the configuration for the virtualhost.
- String fullStoreName = configuration.getVirtualHostConfig(vhostName).getMessageStoreClass();
-
- // Get the Simple class name from the expected class name of o.a.q.s.s.MMS
- String storeName = fullStoreName.substring(fullStoreName.lastIndexOf(".") + 1);
-
- assertEquals("MST-1003 does not close:",
- "Closed", getMessageString(result));
-
- assertEquals("The store name does not match expected value",
- storeName, AbstractTestLogSubject.getSlice("ms", fromSubject(result)));
- }
- }
-
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/queue/PriorityQueueTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/queue/PriorityQueueTest.java
index 7cb58ff1ed..a6c9885568 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/server/queue/PriorityQueueTest.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/server/queue/PriorityQueueTest.java
@@ -21,8 +21,10 @@
package org.apache.qpid.server.queue;
import org.apache.qpid.AMQException;
+import org.apache.qpid.client.AMQConnection;
import org.apache.qpid.client.AMQDestination;
import org.apache.qpid.client.AMQSession;
+import org.apache.qpid.configuration.ClientProperties;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.test.utils.QpidBrokerTestCase;
@@ -30,12 +32,15 @@ import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.naming.NamingException;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
public class PriorityQueueTest extends QpidBrokerTestCase
{
@@ -197,4 +202,99 @@ public class PriorityQueueTest extends QpidBrokerTestCase
return send;
}
+
+ /**
+ * Test that after sending an initial message with priority 0, it is able to be repeatedly reflected back to the queue using
+ * default priority and then consumed again, with separate transacted sessions with prefetch 1 for producer and consumer.
+ *
+ * Highlighted defect with PriorityQueues resolved in QPID-3927.
+ */
+ public void testMessageReflectionWithPriorityIncreaseOnTransactedSessionsWithPrefetch1() throws Exception
+ {
+ setTestClientSystemProperty(ClientProperties.MAX_PREFETCH_PROP_NAME, "1");
+ Connection conn = getConnection();
+ conn.start();
+ assertEquals("Prefetch not reset", 1, ((AMQConnection) conn).getMaxPrefetch());
+
+ final Session producerSess = conn.createSession(true, Session.SESSION_TRANSACTED);
+ final Session consumerSess = conn.createSession(true, Session.SESSION_TRANSACTED);
+
+ //declare a priority queue with 10 priorities
+ final Map<String,Object> arguments = new HashMap<String, Object>();
+ arguments.put("x-qpid-priorities",10);
+ ((AMQSession<?,?>) producerSess).createQueue(new AMQShortString(getTestQueueName()), false, true, false, arguments);
+
+ Queue queue = producerSess.createQueue(getTestQueueName());
+
+ //create the consumer, producer, add message listener
+ CountDownLatch latch = new CountDownLatch(5);
+ MessageConsumer cons = producerSess.createConsumer(queue);
+ MessageProducer producer = producerSess.createProducer(queue);
+
+ ReflectingMessageListener listener = new ReflectingMessageListener(producerSess,producer,consumerSess,latch);
+ cons.setMessageListener(listener);
+
+ //Send low priority 0 message to kick start the asynchronous reflection process
+ producer.setPriority(0);
+ producer.send(nextMessage(1, true, producerSess, producer));
+ producerSess.commit();
+
+ //wait for the reflection process to complete
+ assertTrue("Test process failed to complete in allowed time", latch.await(10, TimeUnit.SECONDS));
+ assertNull("Unexpected throwable encountered", listener.getThrown());
+ }
+
+ private static class ReflectingMessageListener implements MessageListener
+ {
+ private Session _prodSess;
+ private Session _consSess;
+ private CountDownLatch _latch;
+ private MessageProducer _prod;
+ private long _origCount;
+ private Throwable _lastThrown;
+
+ public ReflectingMessageListener(final Session prodSess, final MessageProducer prod,
+ final Session consSess, final CountDownLatch latch)
+ {
+ _latch = latch;
+ _origCount = _latch.getCount();
+ _prodSess = prodSess;
+ _consSess = consSess;
+ _prod = prod;
+ }
+
+ @Override
+ public void onMessage(final Message message)
+ {
+ try
+ {
+ _latch.countDown();
+ long msgNum = _origCount - _latch.getCount();
+ System.out.println("Received message " + msgNum + " with ID: " + message.getIntProperty("msg"));
+
+ if(_latch.getCount() > 0)
+ {
+ //reflect the message, updating its ID and using default priority
+ message.clearProperties();
+ message.setIntProperty("msg", (int) msgNum + 1);
+ _prod.setPriority(Message.DEFAULT_PRIORITY);
+ _prod.send(message);
+ _prodSess.commit();
+ }
+
+ //commit the consumer session to consume the message
+ _consSess.commit();
+ }
+ catch(Throwable t)
+ {
+ t.printStackTrace();
+ _lastThrown = t;
+ }
+ }
+
+ public Throwable getThrown()
+ {
+ return _lastThrown;
+ }
+ }
}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java
index 8ffc09930e..f2d4a513be 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStore.java
@@ -26,10 +26,10 @@ import org.apache.log4j.Logger;
import org.apache.qpid.AMQStoreException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.FieldTable;
+import org.apache.qpid.server.binding.Binding;
import org.apache.qpid.server.exchange.Exchange;
import org.apache.qpid.server.federation.Bridge;
import org.apache.qpid.server.federation.BrokerLink;
-import org.apache.qpid.server.logging.LogSubject;
import org.apache.qpid.server.message.EnqueableMessage;
import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.server.queue.AMQQueue;
@@ -38,7 +38,7 @@ import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Iterator;
-public class SlowMessageStore implements MessageStore, DurableConfigurationStore
+public class SlowMessageStore implements MessageStore
{
private static final Logger _logger = Logger.getLogger(SlowMessageStore.class);
private static final String DELAYS = "delays";
@@ -55,11 +55,8 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
public void configureConfigStore(String name,
ConfigurationRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
+ Configuration config) throws Exception
{
- //To change body of implemented methods use File | Settings | File Templates.
-
_logger.info("Starting SlowMessageStore on Virtualhost:" + name);
Configuration delays = config.subset(DELAYS);
@@ -74,7 +71,7 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
if (messageStoreClass != null)
{
- Class clazz = Class.forName(messageStoreClass);
+ Class<?> clazz = Class.forName(messageStoreClass);
Object o = clazz.newInstance();
@@ -89,13 +86,14 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
_durableConfigurationStore = (DurableConfigurationStore)o;
}
}
- _durableConfigurationStore.configureConfigStore(name, recoveryHandler, config, logSubject);
+ _durableConfigurationStore.configureConfigStore(name, recoveryHandler, config);
}
private void configureDelays(Configuration config)
{
- Iterator delays = config.getKeys();
+ @SuppressWarnings("unchecked")
+ Iterator<String> delays = config.getKeys();
while (delays.hasNext())
{
@@ -160,11 +158,11 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
public void configureMessageStore(String name,
- MessageStoreRecoveryHandler recoveryHandler,
- Configuration config,
- LogSubject logSubject) throws Exception
+ MessageStoreRecoveryHandler messageRecoveryHandler,
+ TransactionLogRecoveryHandler tlogRecoveryHandler,
+ Configuration config) throws Exception
{
- _realStore.configureMessageStore(name, recoveryHandler, config, logSubject);
+ _realStore.configureMessageStore(name, messageRecoveryHandler, tlogRecoveryHandler, config);
}
public void close() throws Exception
@@ -194,17 +192,17 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
doPostDelay("removeExchange");
}
- public void bindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
+ public void bindQueue(Binding binding) throws AMQStoreException
{
doPreDelay("bindQueue");
- _durableConfigurationStore.bindQueue(exchange, routingKey, queue, args);
+ _durableConfigurationStore.bindQueue(binding);
doPostDelay("bindQueue");
}
- public void unbindQueue(Exchange exchange, AMQShortString routingKey, AMQQueue queue, FieldTable args) throws AMQStoreException
+ public void unbindQueue(Binding binding) throws AMQStoreException
{
doPreDelay("unbindQueue");
- _durableConfigurationStore.unbindQueue(exchange, routingKey, queue, args);
+ _durableConfigurationStore.unbindQueue(binding);
doPostDelay("unbindQueue");
}
@@ -227,14 +225,6 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
doPostDelay("removeQueue");
}
- public void configureTransactionLog(String name,
- TransactionLogRecoveryHandler recoveryHandler,
- Configuration storeConfiguration, LogSubject logSubject)
- throws Exception
- {
- _realStore.configureTransactionLog(name, recoveryHandler, storeConfiguration, logSubject);
- }
-
public Transaction newTransaction()
{
doPreDelay("beginTran");
@@ -361,4 +351,23 @@ public class SlowMessageStore implements MessageStore, DurableConfigurationStore
_durableConfigurationStore.deleteBridge(bridge);
doPostDelay("deleteBridge");
}
+
+ @Override
+ public void activate() throws Exception
+ {
+ _realStore.activate();
+ }
+
+ @Override
+ public void addEventListener(EventListener eventListener, Event... events)
+ {
+ _realStore.addEventListener(eventListener, events);
+ }
+
+ @Override
+ public String getStoreLocation()
+ {
+ return _realStore.getStoreLocation();
+ }
+
}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStoreFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStoreFactory.java
new file mode 100644
index 0000000000..6497a640d2
--- /dev/null
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/server/store/SlowMessageStoreFactory.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.store;
+
+public class SlowMessageStoreFactory implements MessageStoreFactory
+{
+
+ @Override
+ public MessageStore createMessageStore()
+ {
+ return new SlowMessageStore();
+ }
+
+ @Override
+ public String getStoreClassName()
+ {
+ return SlowMessageStore.class.getSimpleName();
+ }
+
+}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java
index ee81e7c372..91f5cb7770 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/client/timeouts/SyncWaitDelayTest.java
@@ -54,7 +54,7 @@ public class SyncWaitDelayTest extends QpidBrokerTestCase
public void setUp() throws Exception
{
- setConfigurationProperty("virtualhosts.virtualhost." + VIRTUALHOST+".store.class", "org.apache.qpid.server.store.SlowMessageStore");
+ setConfigurationProperty("virtualhosts.virtualhost." + VIRTUALHOST+".store.factoryclass", "org.apache.qpid.server.store.SlowMessageStoreFactory");
setConfigurationProperty("virtualhosts.virtualhost." + VIRTUALHOST+".store.delays.commitTran.post", String.valueOf(POST_COMMIT_DELAY));
setConfigurationProperty("management.enabled", "false");
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java
deleted file mode 100644
index 13465741bd..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-/**
- * An AMQPPublisher represents the status of the publishing side of a test circuit that exposes AMQP specific features.
- * Its provides additional assertions not available through the plain JMS {@link Publisher} interface.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide assertion that the publishers received a no consumers error code on every message.
- * <tr><td> Provide assertion that the publishers received a no route error code on every message.
- * </table>
- */
-public interface AMQPPublisher extends Publisher
-{
- /**
- * Provides an assertion that the publisher got a no consumers exception on every message.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the publisher got a no consumers exception on every message.
- */
- Assertion noConsumersAssertion(ParsedProperties testProps);
-
- /**
- * Provides an assertion that the publisher got a no rout exception on every message.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the publisher got a no rout exception on every message.
- */
- Assertion noRouteAssertion(ParsedProperties testProps);
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java
deleted file mode 100644
index 60d54f1f6f..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * Assertion models an assertion on a test {@link Circuit}.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Indicate whether or not the assertion passes when applied.
- * </table>
- */
-public interface Assertion
-{
- /**
- * Applies the assertion.
- *
- * @return <tt>true</tt> if the assertion passes, <tt>false</tt> if it fails.
- */
- public boolean apply();
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java
deleted file mode 100644
index 0bb4911d4c..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * AssertionBase is a base class for implenmenting assertions. It provides a mechanism to store error messages, and
- * report all error messages when its {@link #toString()} method is called.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Collect error messages.
- * </table>
- */
-public abstract class AssertionBase implements Assertion
-{
- /** Holds the error messages. */
- List<String> errors = new LinkedList<String>();
-
- /**
- * Adds an error message to the assertion.
- *
- * @param error An error message to add to the assertion.
- */
- public void addError(String error)
- {
- errors.add(error);
- }
-
- /**
- * Prints all of the error messages in the assertion into a string.
- *
- * @return All of the error messages in the assertion as a string.
- */
- public String toString()
- {
- String result = "";
-
- for (String error : errors)
- {
- result += error;
- }
-
- return result;
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java
deleted file mode 100644
index 41614f92fc..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * BrokerLifecycleAware is an awareness interface implemented by test cases that can run control the life-cycle of
- * the brokers on which they run. Its purpose is to expose additional instrumentation of brokers during testing, that
- * enables tests to use an automated failure mechanism to simulate broker failures, and to re-start failed brokers.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Indicate whether or not a test case is using an in-vm broker.
- * <tr><td> Track which in-vm broker is currently in use.
- * <tr><td> Accept setting of a failure mechanism. <td> {@link CauseFailure}.
- * </table>
- *
- * @todo Need to think about how to present the brokers through this interface. Thinking numbering the available
- * brokers from 1 will do. Then can kill 1 and assume failing onto 2. Restart 1 and kill 2 and fail back onto
- * 1 again?
- */
-public interface BrokerLifecycleAware
-{
- public void setInVmBrokers();
-
- /**
- * Indicates whether or not a test case is using in-vm brokers.
- *
- * @return <tt>true</tt> if the test is using in-vm brokers, <tt>false</tt> otherwise.
- */
- public boolean usingInVmBroker();
-
- /**
- * Sets the currently live in-vm broker.
- *
- * @param i The currently live in-vm broker.
- */
- public void setLiveBroker(int i);
-
- /**
- * Reports the currently live in-vm broker.
- *
- * @return The currently live in-vm broker.
- */
- public int getLiveBroker();
-
- /**
- * Accepts a failure mechanism.
- *
- * @param failureMechanism The failure mechanism.
- */
- public void setFailureMechanism(CauseFailure failureMechanism);
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java
deleted file mode 100644
index 9bdd5a72c5..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * CauseFailure provides a method to cause a failure in a messaging broker, usually used in conjunction with fail-over
- * or other failure mode testing. In some cases failures may be automated, for example by shutting down an in-vm broker,
- * or by sending a special control signal to a broker over a network connection. In other cases, it may be preferable
- * to ask a user interactively to cause a failure scenario, in which case an implementation may display a prompt or
- * dialog box asking for notification once the failure has been caused. The purpose of this interface is to abstract
- * the exact cause and nature of a failure out of failure test cases.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Cause messaging broker failure.
- * </table>
- */
-public interface CauseFailure
-{
- /**
- * Causes the active message broker to fail.
- */
- void causeFailure();
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java
deleted file mode 100644
index 118ddff48b..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import java.io.IOException;
-
-/**
- * Causes a message broker failure by interactively prompting the user to cause it.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Cause messaging broker failure.
- * </table>
- */
-public class CauseFailureUserPrompt implements CauseFailure
-{
- /**
- * Causes the active message broker to fail.
- */
- public void causeFailure()
- {
- waitForUser("Cause a broker failure now, then press Return.");
- }
-
- /**
- * Outputs a prompt to the console and waits for the user to press return.
- *
- * @param prompt The prompt to display on the console.
- */
- private void waitForUser(String prompt)
- {
- System.out.println(prompt);
-
- try
- {
- System.in.read();
- }
- catch (IOException e)
- {
- // Ignored.
- }
-
- System.out.println("Continuing.");
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java
deleted file mode 100644
index 4f9ab1a273..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import java.util.List;
-
-/**
- * A Circuit is the basic test unit against which test cases are to be written. A circuit consists of two 'ends', an
- * instigating 'publisher' end and a more passive 'receivers' end.
- *
- * <p/>Once created, the life-cycle of a circuit may be controlled by {@link #start()}ing it, or {@link #close()}ing it.
- * Once started, the circuit is ready to send messages over. Once closed the circuit can no longer be used.
- *
- * <p/>The state of the circuit may be taken with the {@link #check()} method, and asserted against by the
- * {@link #applyAssertions(java.util.List)} method.
- *
- * <p/>There is a default test procedure which may be performed against the circuit. The outline of this procedure is:
- *
- * <p/><pre>
- * Start the circuit.
- * Send test messages.
- * Request a status report.
- * Assert conditions on the publishing end of the circuit.
- * Assert conditions on the receiving end of the circuit.
- * Close the circuit.
- * Pass with no failed assertions or fail with a list of failed assertions.
- * </pre>
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Supply the publishing and receiving ends of a test messaging circuit.
- * <tr><td> Start the circuit running.
- * <tr><td> Close the circuit down.
- * <tr><td> Take a reading of the circuits state.
- * <tr><td> Apply assertions against the circuits state.
- * <tr><td> Send test messages over the circuit.
- * <tr><td> Perform the default test procedue on the circuit.
- * </table>
- */
-public interface Circuit
-{
- /**
- * Gets the interface on the publishing end of the circuit.
- *
- * @return The publishing end of the circuit.
- */
- public Publisher getPublisher();
-
- /**
- * Gets the interface on the receiving end of the circuit.
- *
- * @return The receiving end of the circuit.
- */
- public Receiver getReceiver();
-
- /**
- * Connects and starts the circuit. After this method is called the circuit is ready to send messages.
- */
- public void start();
-
- /**
- * Checks the test circuit. The effect of this is to gather the circuits state, for both ends of the circuit,
- * into a report, against which assertions may be checked.
- */
- public void check();
-
- /**
- * Closes the circuit. All associated resources are closed.
- */
- public void close();
-
- /**
- * Applied a list of assertions against the test circuit. The {@link #check()} method should be called before doing
- * this, to ensure that the circuit has gathered its state into a report to assert against.
- *
- * @param assertions The list of assertions to apply to the circuit.
- *
- * @return Any assertions that failed.
- */
- public List<Assertion> applyAssertions(List<Assertion> assertions);
-
- /**
- * Runs the default test procedure against the circuit, and checks that all of the specified assertions hold.
- *
- * @param numMessages The number of messages to send using the default test procedure.
- * @param assertions The list of assertions to apply.
- *
- * @return Any assertions that failed.
- */
- public List<Assertion> test(int numMessages, List<Assertion> assertions);
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java
deleted file mode 100644
index ffde385cfc..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * A CircuitEnd is a pair consisting of one message producer and one message consumer, that represents one end of a
- * test circuit. It is a standard unit of connectivity allowing a full-duplex conversation to be held, provided both
- * the consumer and producer are instantiated and configured.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide a message producer for sending messages.
- * <tr><td> Provide a message consumer for receiving messages.
- * </table>
- *
- * @todo Update the {@link org.apache.qpid.test.utils.ConversationFactory} so that it accepts these as the basic conversation
- * connection units.
- */
-public interface CircuitEnd
-{
- /**
- * Gets the message producer at this circuit end point.
- *
- * @return The message producer at with this circuit end point.
- */
- public MessageProducer getProducer();
-
- /**
- * Gets the message consumer at this circuit end point.
- *
- * @return The message consumer at this circuit end point.
- */
- public MessageConsumer getConsumer();
-
- /**
- * Send the specified message over the producer at this end point.
- *
- * @param message The message to send.
- *
- * @throws JMSException Any JMS exception occuring during the send is allowed to fall through.
- */
- public void send(Message message) throws JMSException;
-
- /**
- * Gets the JMS Session associated with this circuit end point.
- *
- * @return The JMS Session associated with this circuit end point.
- */
- public Session getSession();
-
- /**
- * Closes the message producers and consumers and the sessions, associated with this circuit end point.
- *
- * @throws JMSException Any JMSExceptions occurring during the close are allowed to fall through.
- */
- public void close() throws JMSException;
-
- /**
- * Returns the message monitor for reporting on received messages on this circuit end.
- *
- * @return The message monitor for this circuit end.
- */
- public MessageMonitor getMessageMonitor();
-
- /**
- * Returns the exception monitor for reporting on exceptions received on this circuit end.
- *
- * @return The exception monitor for this circuit end.
- */
- public ExceptionMonitor getExceptionMonitor();
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java
deleted file mode 100644
index 5730752eae..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * A CircuitEndBase is a pair consisting of one message producer and one message consumer, that represents one end of a
- * test circuit. It is a standard unit of connectivity allowing a full-duplex conversation to be held, provided both
- * the consumer and producer are instantiated and configured.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide a message producer for sending messages.
- * <tr><td> Provide a message consumer for receiving messages.
- * </table>
- */
-public class CircuitEndBase implements CircuitEnd
-{
- /** Holds the single message producer. */
- MessageProducer producer;
-
- /** Holds the single message consumer. */
- MessageConsumer consumer;
-
- /** Holds the controlSession for the circuit end. */
- Session session;
-
- /** Holds the message monitor for the circuit end. */
- MessageMonitor messageMonitor;
-
- /** Holds the exception monitor for the circuit end. */
- ExceptionMonitor exceptionMonitor;
-
- /**
- * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured
- * for messages and exceptions received by the circuit end.
- *
- * @param producer The message producer for the circuit end point.
- * @param consumer The message consumer for the circuit end point.
- * @param session The controlSession for the circuit end point.
- * @param messageMonitor The monitor to notify of all messages received by the circuit end.
- * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end.
- */
- public CircuitEndBase(MessageProducer producer, MessageConsumer consumer, Session session, MessageMonitor messageMonitor,
- ExceptionMonitor exceptionMonitor)
- {
- this.producer = producer;
- this.consumer = consumer;
- this.session = session;
-
- this.messageMonitor = messageMonitor;
- this.exceptionMonitor = exceptionMonitor;
- }
-
- /**
- * Gets the message producer at this circuit end point.
- *
- * @return The message producer at with this circuit end point.
- */
- public MessageProducer getProducer()
- {
- return producer;
- }
-
- /**
- * Gets the message consumer at this circuit end point.
- *
- * @return The message consumer at this circuit end point.
- */
- public MessageConsumer getConsumer()
- {
- return consumer;
- }
-
- /**
- * Send the specified message over the producer at this end point.
- *
- * @param message The message to send.
- * @throws javax.jms.JMSException Any JMS exception occuring during the send is allowed to fall through.
- */
- public void send(Message message) throws JMSException
- {
- producer.send(message);
- }
-
- /**
- * Gets the JMS Session associated with this circuit end point.
- *
- * @return The JMS Session associated with this circuit end point.
- */
- public Session getSession()
- {
- return session;
- }
-
- /**
- * Closes the message producers and consumers and the sessions, associated with this circuit end point.
- *
- * @throws javax.jms.JMSException Any JMSExceptions occurring during the close are allowed to fall through.
- */
- public void close() throws JMSException
- {
- if (producer != null)
- {
- producer.close();
- }
-
- if (consumer != null)
- {
- consumer.close();
- }
- }
-
- /**
- * Returns the message monitor for reporting on received messages on this circuit end.
- *
- * @return The message monitor for this circuit end.
- */
- public MessageMonitor getMessageMonitor()
- {
- return messageMonitor;
- }
-
- /**
- * Returns the exception monitor for reporting on exceptions received on this circuit end.
- *
- * @return The exception monitor for this circuit end.
- */
- public ExceptionMonitor getExceptionMonitor()
- {
- return exceptionMonitor;
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java
deleted file mode 100644
index 78b5a72c1f..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-
-/**
- * A DropIn test is a test case that can accept late joining test clients into a running test. This can be usefull,
- * for interactive experimentation.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Accept late joining test clients.
- * </table>
- */
-public interface DropInTest
-{
- /**
- * Should accept a late joining client into a running test case. The client will be enlisted with a control message
- * with the 'CONTROL_TYPE' field set to the value 'LATEJOIN'. It should also provide values for the fields:
- *
- * <p/><table>
- * <tr><td> CLIENT_NAME <td> A unique name for the new client.
- * <tr><td> CLIENT_PRIVATE_CONTROL_KEY <td> The key for the route on which the client receives its control messages.
- * </table>
- *
- * @param message The late joiners join message.
- *
- * @throws JMSException Any JMS Exception are allowed to fall through, indicating that the join failed.
- */
- public void lateJoin(Message message) throws JMSException;
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java
deleted file mode 100644
index afb7b5bc5b..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import javax.jms.ExceptionListener;
-import javax.jms.JMSException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * An exception monitor, listens for JMS exception on a connection or consumer. It record all exceptions that it receives
- * and provides methods to test the number and type of exceptions received.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Record all exceptions received.
- * </table>
- */
-public class ExceptionMonitor implements ExceptionListener
-{
- /** Used for debugging. */
- private final Logger log = Logger.getLogger(ExceptionMonitor.class);
-
- /** Holds the received exceptions. */
- private List<Exception> exceptions = new ArrayList<Exception>();
-
- /**
- * Receives incoming exceptions.
- *
- * @param e The exception to record.
- */
- public synchronized void onException(JMSException e)
- {
- log.debug("public void onException(JMSException e): called", e);
-
- exceptions.add(e);
- }
-
- /**
- * Checks that no exceptions have been received.
- *
- * @return <tt>true</tt> if no exceptions have been received, <tt>false</tt> otherwise.
- */
- public synchronized boolean assertNoExceptions()
- {
- return exceptions.isEmpty();
- }
-
- /**
- * Checks that exactly one exception has been received.
- *
- * @return <tt>true</tt> if exactly one exception been received, <tt>false</tt> otherwise.
- */
- public synchronized boolean assertOneJMSException()
- {
- return exceptions.size() == 1;
- }
-
- /**
- * Checks that exactly one exception, with a linked cause of the specified type, has been received.
- *
- * @param aClass The type of the linked cause.
- *
- * @return <tt>true</tt> if exactly one exception, with a linked cause of the specified type, been received,
- * <tt>false</tt> otherwise.
- */
- public synchronized boolean assertOneJMSExceptionWithLinkedCause(Class aClass)
- {
- if (exceptions.size() == 1)
- {
- Exception e = exceptions.get(0);
-
- if (e instanceof JMSException)
- {
- JMSException jmse = (JMSException) e;
-
- Exception linkedCause = jmse.getLinkedException();
-
- if ((linkedCause != null) && aClass.isInstance(linkedCause))
- {
- return true;
- }
- }
- }
-
- return false;
- }
-
- /**
- * Checks that at least one exception of the the specified type, has been received.
- *
- * @param exceptionClass The type of the exception.
- *
- * @return <tt>true</tt> if at least one exception of the specified type has been received, <tt>false</tt> otherwise.
- */
- public synchronized boolean assertExceptionOfType(Class exceptionClass)
- {
- // Start by assuming that the exception has no been received.
- boolean passed = false;
-
- // Scan all the exceptions for a match.
- for (Exception e : exceptions)
- {
- if (exceptionClass.isInstance(e))
- {
- passed = true;
-
- break;
- }
- }
-
- return passed;
- }
-
- /**
- * Reports the number of exceptions held by this monitor.
- *
- * @return The number of exceptions held by this monitor.
- */
- public synchronized int size()
- {
- return exceptions.size();
- }
-
- /**
- * Clears the record of received exceptions.
- */
- public synchronized void reset()
- {
- exceptions = new ArrayList<Exception>();
- }
-
- /**
- * Provides a dump of the stack traces of all exceptions that this exception monitor was notified of. Mainly
- * use for debugging/test failure reporting purposes.
- *
- * @return A string containing a dump of the stack traces of all exceptions.
- */
- public synchronized String toString()
- {
- String result = "ExceptionMonitor: holds " + exceptions.size() + " exceptions.\n\n";
-
- for (Exception ex : exceptions)
- {
- result += getStackTrace(ex) + "\n";
- }
-
- return result;
- }
-
- /**
- * Prints an exception stack trace into a string.
- *
- * @param t The throwable to get the stack trace from.
- *
- * @return A string containing the throwables stack trace.
- */
- public static String getStackTrace(Throwable t)
- {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw, true);
- t.printStackTrace(pw);
- pw.flush();
- sw.flush();
-
- return sw.toString();
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java
deleted file mode 100644
index ecbb710a6b..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.NDC;
-
-import org.apache.qpid.junit.extensions.SetupTaskAware;
-import org.apache.qpid.junit.extensions.SetupTaskHandler;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * FrameworkBaseCase provides a starting point for writing test cases against the test framework. Its main purpose is
- * to provide some convenience methods for testing.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create and clean up in-vm brokers on every test case.
- * <tr><td> Produce lists of assertions from assertion creation calls.
- * <tr><td> Produce JUnit failures from assertion failures.
- * <tr><td> Convert failed assertions to error messages.
- * </table>
- */
-public class FrameworkBaseCase extends QpidBrokerTestCase implements FrameworkTestContext, SetupTaskAware,
- BrokerLifecycleAware
-{
- /** Used for debugging purposes. */
- private static final Logger log = Logger.getLogger(FrameworkBaseCase.class);
-
- private CircuitFactory circuitFactory = new LocalAMQPCircuitFactory();
-
- private ParsedProperties testProps;
-
- private SetupTaskHandler taskHandler = new SetupTaskHandler();
-
- private boolean isUsingInVM;
-
- private CauseFailure failureMechanism = new CauseFailureUserPrompt();
-
- /**
- * Creates a new test case with the specified name.
- *
- * @param name The test case name.
- */
- public FrameworkBaseCase(String name)
- {
- super(name);
- }
-
- /** Holds the test sequencer to create and run test circuits with. */ /**
- * Returns the test case sequencer that provides test circuit, and test sequence implementations. The sequencer
- * that this base case returns by default is suitable for running a test circuit with both circuit ends colocated
- * on the same JVM.
- *
- * @return The test case sequencer.
- */
- protected CircuitFactory getCircuitFactory()
- {
- return circuitFactory;
- }
-
- /**
- * Overrides the default test circuit factory. Test decorators can use this to supply distributed test sequencers or
- * other test circuit factory specializations.
- *
- * @param circuitFactory The new test circuit factory.
- */
- public void setCircuitFactory(CircuitFactory circuitFactory)
- {
- this.circuitFactory = circuitFactory;
- }
-
- /**
- * Reports the current test case name.
- *
- * @return The current test case name.
- */
- public TestCaseVector getTestCaseVector()
- {
- return new TestCaseVector(this.getName(), 0);
- }
-
- /**
- * Reports the current test case parameters.
- *
- * @return The current test case parameters.
- */
- public MessagingTestConfigProperties getTestParameters()
- {
- return new MessagingTestConfigProperties(testProps);
- }
-
- /**
- * Creates a list of assertions.
- *
- * @param asserts The assertions to compile in a list.
- *
- * @return A list of assertions.
- */
- protected List<Assertion> assertionList(Assertion... asserts)
- {
- List<Assertion> result = new ArrayList<Assertion>();
-
- for (Assertion assertion : asserts)
- {
- result.add(assertion);
- }
-
- return result;
- }
-
- /**
- * Generates a JUnit assertion exception (failure) if any assertions are passed into this method, also concatenating
- * all of the error messages in the assertions together to form an error message to diagnose the test failure with.
- *
- * @param asserts The list of failed assertions.
- */
- protected static void assertNoFailures(List<Assertion> asserts)
- {
- log.debug("protected void assertNoFailures(List<Assertion> asserts = " + asserts + "): called");
-
- // Check if there are no assertion failures, and return without doing anything if so.
- if ((asserts == null) || asserts.isEmpty())
- {
- return;
- }
-
- // Compile all of the assertion failure messages together.
- String errorMessage = assertionsToString(asserts);
-
- // Fail with the error message from all of the assertions.
- fail(errorMessage);
- }
-
- /**
- * Converts a list of failed assertions into an error message.
- *
- * @param asserts The failed assertions.
- *
- * @return The error message.
- */
- protected static String assertionsToString(List<Assertion> asserts)
- {
- String errorMessage = "";
-
- for (Assertion assertion : asserts)
- {
- errorMessage += assertion.toString() + "\n";
- }
-
- return errorMessage;
- }
-
- /**
- * Ensures that the in-vm broker is created and initialized.
- *
- * @throws Exception Any exceptions allowed to fall through and fail the test.
- */
- protected void setUp() throws Exception
- {
- super.setUp();
- NDC.push(getName());
-
- testProps = TestContextProperties.getInstance(MessagingTestConfigProperties.defaults);
- }
-
- /**
- * Ensures that the in-vm broker is cleaned up after each test run.
- */
- protected void tearDown()
- {
- NDC.pop();
-
- // Process all optional tear down tasks. This may include in-vm broker clean up, if a decorator has added it.
- taskHandler.runTearDownTasks();
- }
-
- /**
- * Adds the specified task to the tests setup.
- *
- * @param task The task to add to the tests setup.
- */
- public void chainSetupTask(Runnable task)
- {
- taskHandler.chainSetupTask(task);
- }
-
- /**
- * Adds the specified task to the tests tear down.
- *
- * @param task The task to add to the tests tear down.
- */
- public void chainTearDownTask(Runnable task)
- {
- taskHandler.chainTearDownTask(task);
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as known to the test
- * clients that will run the test. The purpose of this is to convert the JUnit method name into the correct test
- * case name to place into the test invite. For example the method "testP2P" might map onto the interop test case
- * name "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- *
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return methodName;
- }
-
- public void setInVmBrokers()
- {
- isUsingInVM = true;
- }
-
- /**
- * Indicates whether or not a test case is using in-vm brokers.
- *
- * @return <tt>true</tt> if the test is using in-vm brokers, <tt>false</tt> otherwise.
- */
- public boolean usingInVmBroker()
- {
- return isUsingInVM;
- }
-
- /**
- * Sets the currently live in-vm broker.
- *
- * @param i The currently live in-vm broker.
- */
- public void setLiveBroker(int i)
- { }
-
- /**
- * Reports the currently live in-vm broker.
- *
- * @return The currently live in-vm broker.
- */
- public int getLiveBroker()
- {
- return 0;
- }
-
- /**
- * Accepts a failure mechanism.
- *
- * @param failureMechanism The failure mechanism.
- */
- public void setFailureMechanism(CauseFailure failureMechanism)
- {
- this.failureMechanism = failureMechanism;
- }
-
- protected ParsedProperties getTestProps()
- {
- return testProps;
- }
-
- protected void setTestProps(ParsedProperties testProps)
- {
- this.testProps = testProps;
- }
-
- protected SetupTaskHandler getTaskHandler()
- {
- return taskHandler;
- }
-
- protected CauseFailure getFailureMechanism()
- {
- return failureMechanism;
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java
deleted file mode 100644
index 9a4668e86f..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * A FrameworkTestContext provides context information to test code about the current test case being run; its name, its
- * parameters.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide the name of the current test case.
- * <tr><td> Provide the test parameters.
- * </table>
- */
-public interface FrameworkTestContext
-{
- /**
- * Reports the current test case name.
- *
- * @return The current test case name.
- */
- TestCaseVector getTestCaseVector();
-
- /**
- * Reports the current test case parameters.
- *
- * @return The current test case parameters.
- */
- MessagingTestConfigProperties getTestParameters();
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java
deleted file mode 100644
index 899a808bdd..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.client.AMQSession;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.localcircuit.LocalAMQPPublisherImpl;
-import org.apache.qpid.test.framework.localcircuit.LocalPublisherImpl;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-import javax.jms.Topic;
-
-/**
- * LocalAMQPCircuitFactory is a test sequencer that creates test circuits with publishing and receiving ends rooted
- * on the same JVM, allowing AMQP/Qpid specific options to be applied to the circuit.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a standard test procedure over a test circuit.
- * <tr><td> Construct test circuits appropriate to a tests context.
- * <tr><td> Construct test circuits the support AMQP specific options.
- * </table>
- */
-public class LocalAMQPCircuitFactory extends LocalCircuitFactory
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(LocalAMQPCircuitFactory.class);
-
- /**
- * Builds a circuit end suitable for the publishing side of a test circuit, from standard test parameters.
- *
- * @param connection The connection to build the circuit end on.
- * @param testProps The test parameters to configure the circuit end construction.
- * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique.
- *
- * @return A circuit end suitable for the publishing side of a test circuit.
- *
- * @throws javax.jms.JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation.
- */
- public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId)
- throws JMSException
- {
- log.debug(
- "public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = "
- + uniqueId + "): called");
-
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode());
-
- Destination destination =
- props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId)
- : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId);
-
- MessageProducer producer =
- props.getPublisherProducerBind()
- ? ((props.getImmediate() || props.getMandatory())
- ? ((AMQSession) session).createProducer(destination, props.getMandatory(), props.getImmediate())
- : session.createProducer(destination)) : null;
-
- MessageConsumer consumer =
- props.getPublisherConsumerBind()
- ? session.createConsumer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null;
-
- MessageMonitor messageMonitor = new MessageMonitor();
-
- if (consumer != null)
- {
- consumer.setMessageListener(messageMonitor);
- }
-
- ExceptionMonitor exceptionMonitor = new ExceptionMonitor();
- connection.setExceptionListener(exceptionMonitor);
-
- if (!props.getPublisherConsumerActive() && (consumer != null))
- {
- consumer.close();
- }
-
- return new CircuitEndBase(producer, consumer, session, messageMonitor, exceptionMonitor);
- }
-
- /**
- * Builds a circuit end suitable for the receiving side of a test circuit, from standard test parameters.
- *
- * @param connection The connection to build the circuit end on.
- * @param testProps The test parameters to configure the circuit end construction.
- * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique.
- *
- * @return A circuit end suitable for the receiving side of a test circuit.
- *
- * @throws JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation.
- */
- public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId)
- throws JMSException
- {
- log.debug(
- "public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = "
- + uniqueId + "): called");
-
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode());
-
- MessageProducer producer =
- props.getReceiverProducerBind()
- ? session.createProducer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null;
-
- Destination destination =
- props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId)
- : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId);
-
- MessageConsumer consumer =
- props.getReceiverConsumerBind()
- ? ((props.getDurableSubscription() && props.getPubsub())
- ? session.createDurableSubscriber((Topic) destination, "testsub") : session.createConsumer(destination))
- : null;
-
- MessageMonitor messageMonitor = new MessageMonitor();
-
- if (consumer != null)
- {
- consumer.setMessageListener(messageMonitor);
- }
-
- if (!props.getReceiverConsumerActive() && (consumer != null))
- {
- consumer.close();
- }
-
- return new CircuitEndBase(producer, consumer, session, messageMonitor, null);
- }
-
- /**
- * Creates a local {@link Publisher} from a {@link CircuitEnd}. The publisher implementation provides AMQP
- * specific assertion methods, for testing beyond JMS.
- *
- * @param publisherEnd The publishing circuit end.
- *
- * @return A {@link Receiver}.
- */
- protected LocalPublisherImpl createPublisherFromCircuitEnd(CircuitEndBase publisherEnd)
- {
- return new LocalAMQPPublisherImpl(publisherEnd);
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java
deleted file mode 100644
index b8fd4cc7e7..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.localcircuit.LocalCircuitImpl;
-import org.apache.qpid.test.framework.localcircuit.LocalPublisherImpl;
-import org.apache.qpid.test.framework.localcircuit.LocalReceiverImpl;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-import javax.jms.Topic;
-import java.util.List;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * LocalCircuitFactory is a circuit factory that creates test circuits with publishing and receiving ends rooted
- * on the same JVM. The ends of the circuit are presented as {@link Publisher} and {@link Receiver} interfaces, which
- * in turn provide methods to apply assertions to the circuit. The creation of the circuit ends, and the presentation
- * of the ends as publisher/receiver interfaces, are designed to be overriden, so that circuits and assertions that
- * use messaging features not available in JMS can be written. This provides an extension point for writing tests
- * against proprietary features of JMS implementations.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a standard test procedure over a test circuit.
- * <tr><td> Construct test circuits appropriate to a tests context.
- * </table>
- */
-public class LocalCircuitFactory implements CircuitFactory
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(LocalCircuitFactory.class);
-
- /** Used to create unique destination names for each test. */
- protected static AtomicLong uniqueDestsId = new AtomicLong();
-
- /**
- * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles,
- * begining the test and gathering the test reports from the participants.
- *
- * @param testCircuit The test circuit.
- * @param assertions The list of assertions to apply to the test circuit.
- * @param testProperties The test case definition.
- */
- public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties)
- {
- if (testCircuit != null)
- {
- FrameworkBaseCase.assertNoFailures(testCircuit.test(1, assertions));
- }
- }
-
- /**
- * Creates a test circuit for the test, configered by the test parameters specified.
- *
- * @param testProperties The test parameters.
- *
- * @return A test circuit.
- */
- public Circuit createCircuit(Connection connection, ParsedProperties testProperties)
- {
- Circuit result;
-
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProperties);
-
- // Create a standard publisher/receivers test client pair on a shared connection, individual sessions.
- try
- {
- // Get a unique offset to append to destination names to make them unique to the connection.
- long uniqueId = uniqueDestsId.incrementAndGet();
-
- // Add the connection exception listener to assert on exception conditions with.
- // ExceptionMonitor exceptionMonitor = new ExceptionMonitor();
- // connection.setExceptionListener(exceptionMonitor);
-
- // Set up the publisher.
- CircuitEndBase publisherEnd = createPublisherCircuitEnd(connection, props, uniqueId);
-
- // Set up the receiver.
- CircuitEndBase receiverEnd = createReceiverCircuitEnd(connection, props, uniqueId);
-
- // Start listening for incoming messages.
- connection.start();
-
- // Package everything up.
- LocalPublisherImpl publisher = createPublisherFromCircuitEnd(publisherEnd);
- LocalReceiverImpl receiver = createReceiverFromCircuitEnd(receiverEnd);
-
- result = new LocalCircuitImpl(testProperties, publisher, receiver, connection, publisher.getExceptionMonitor());
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Could not create publisher/receivers pair due to a JMSException.", e);
- }
-
- return result;
- }
-
- /**
- * Creates a local {@link Receiver} from a {@link CircuitEnd}. Sub-classes may override this to provide more
- * specialized receivers if necessary.
- *
- * @param receiverEnd The receiving circuit end.
- *
- * @return A {@link Receiver}.
- */
- protected LocalReceiverImpl createReceiverFromCircuitEnd(CircuitEndBase receiverEnd)
- {
- return new LocalReceiverImpl(receiverEnd);
- }
-
- /**
- * Creates a local {@link Publisher} from a {@link CircuitEnd}. Sub-classes may override this to provide more
- * specialized receivers if necessary.
- *
- * @param publisherEnd The publishing circuit end.
- *
- * @return A {@link Receiver}.
- */
- protected LocalPublisherImpl createPublisherFromCircuitEnd(CircuitEndBase publisherEnd)
- {
- return new LocalPublisherImpl(publisherEnd);
- }
-
- /**
- * Builds a circuit end suitable for the publishing side of a test circuit, from standard test parameters.
- *
- * @param connection The connection to build the circuit end on.
- * @param testProps The test parameters to configure the circuit end construction.
- * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique.
- *
- * @return A circuit end suitable for the publishing side of a test circuit.
- *
- * @throws JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation.
- */
- public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId)
- throws JMSException
- {
- log.debug(
- "public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = "
- + uniqueId + "): called");
-
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- // Check that the test properties do not contain AMQP/Qpid specific settings, and fail if they do.
- if (props.getImmediate() || props.getMandatory())
- {
- throw new RuntimeException(
- "Cannot create a pure JMS circuit as the test properties require AMQP specific options.");
- }
-
- Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode());
-
- Destination destination =
- props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId)
- : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId);
-
- MessageProducer producer = props.getPublisherProducerBind() ? session.createProducer(destination) : null;
-
- MessageConsumer consumer =
- props.getPublisherConsumerBind()
- ? session.createConsumer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null;
-
- MessageMonitor messageMonitor = new MessageMonitor();
-
- if (consumer != null)
- {
- consumer.setMessageListener(messageMonitor);
- }
-
- ExceptionMonitor exceptionMonitor = new ExceptionMonitor();
- connection.setExceptionListener(exceptionMonitor);
-
- if (!props.getPublisherConsumerActive() && (consumer != null))
- {
- consumer.close();
- }
-
- return new CircuitEndBase(producer, consumer, session, messageMonitor, exceptionMonitor);
- }
-
- /**
- * Builds a circuit end suitable for the receiving side of a test circuit, from standard test parameters.
- *
- * @param connection The connection to build the circuit end on.
- * @param testProps The test parameters to configure the circuit end construction.
- * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique.
- *
- * @return A circuit end suitable for the receiving side of a test circuit.
- *
- * @throws JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation.
- */
- public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId)
- throws JMSException
- {
- log.debug(
- "public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = "
- + uniqueId + "): called");
-
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- // Check that the test properties do not contain AMQP/Qpid specific settings, and fail if they do.
- if (props.getImmediate() || props.getMandatory())
- {
- throw new RuntimeException(
- "Cannot create a pure JMS circuit as the test properties require AMQP specific options.");
- }
-
- Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode());
-
- MessageProducer producer =
- props.getReceiverProducerBind()
- ? session.createProducer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null;
-
- Destination destination =
- props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId)
- : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId);
-
- MessageConsumer consumer =
- props.getReceiverConsumerBind()
- ? ((props.getDurableSubscription() && props.getPubsub())
- ? session.createDurableSubscriber((Topic) destination, "testsub") : session.createConsumer(destination))
- : null;
-
- MessageMonitor messageMonitor = new MessageMonitor();
-
- if (consumer != null)
- {
- consumer.setMessageListener(messageMonitor);
- }
-
- if (!props.getReceiverConsumerActive() && (consumer != null))
- {
- consumer.close();
- }
-
- return new CircuitEndBase(producer, consumer, session, messageMonitor, null);
- }
-
- /**
- * Sets the sender test client to coordinate the test with.
- *
- * @param sender The contact details of the sending client in the test.
- */
- public void setSender(TestClientDetails sender)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Sets the receiving test client to coordinate the test with.
- *
- * @param receiver The contact details of the sending client in the test.
- */
- public void setReceiver(TestClientDetails receiver)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Supplies the sending test client.
- *
- * @return The sending test client.
- */
- public TestClientDetails getSender()
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Supplies the receiving test client.
- *
- * @return The receiving test client.
- */
- public List<TestClientDetails> getReceivers()
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Accepts the conversation factory over which to hold the test coordinating conversation.
- *
- * @param conversationFactory The conversation factory to coordinate the test over.
- */
- public void setConversationFactory(ConversationFactory conversationFactory)
- {
- throw new RuntimeException("Not implemented.");
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java
deleted file mode 100644
index 397c4e9fbd..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * MessageIdentityVector provides a message identification scheme, that matches individual messages with test cases.
- * Test messages are being sent by a number of test clients, sending messages over a set of routes, and being received
- * by another set of test clients. Each test is itself, being run within a test cycle, of which there could be many. It
- * is the job of the test coordinator to request and receive reports from the available test clients, on what has been
- * sent, what has been received, and what errors may have occurred, and to reconcile this information against the
- * assertions being applied by the test case. In order to be able to figure out which messages belong to which test,
- * there needs to be an identification scheme, that the coordinator can use to correlate messages in senders and
- * receiver reports. Every message sent in a test can be associated with this information.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Identify a test case, a handling client id, a circuit end within the client, and a test cycle number.
- * </table>
- */
-public class MessageIdentityVector
-{
- /** Holds the test case vector component of the message identity vector. */
- private TestCaseVector testCaseVector;
-
- /** The unique client id. */
- private String clientId;
-
- /** The unique circuit end number within the client id. */
- private int circuitEndId;
-
- /**
- * Creates a new identity vector for test messages.
- *
- * @param testCase The name of the test case generating the messages.
- * @param clientId The unique id of the client implementing a circuit end that is handling the messages.
- * @param circuitEndId The unique id number of the circuit end within the client.
- * @param testCycleNumber The cycle iteration number of the test case.
- */
- public MessageIdentityVector(String testCase, String clientId, int circuitEndId, int testCycleNumber)
- {
- this.testCaseVector = new TestCaseVector(testCase, testCycleNumber);
- this.clientId = clientId;
- this.circuitEndId = circuitEndId;
- }
-
- /**
- * Reports the test case vector component of the message identity vector.
- *
- * @return The test case vector component of the message identity vector.
- */
- public TestCaseVector getTestCaseVector()
- {
- return testCaseVector;
- }
-
- /**
- * Reports the name of the test case.
- *
- * @return The name of the test case.
- */
- public String getTestCase()
- {
- return testCaseVector.getTestCase();
- }
-
- /**
- * Reports the test iteration cycle number within the test case.
- *
- * @return The test iteration cycle number within the test case.
- */
- public int getTestCycleNumber()
- {
- return testCaseVector.getTestCycleNumber();
- }
-
- /**
- * Resports the client id.
- *
- * @return The client id.
- */
- public String getClientId()
- {
- return clientId;
- }
-
- /**
- * Reports the circuit end number within the test client.
- *
- * @return The circuit end number within the test client.
- */
- public int getCircuitEndId()
- {
- return circuitEndId;
- }
-
- /**
- * Compares this identity vector with another for equality. All fields must match.
- *
- * @param o The identity vector to compare with.
- *
- * @return <tt>true</tt> if the identity vector is identical to this one by all fields, <tt>false</tt> otherwise.
- */
- public boolean equals(Object o)
- {
- if (this == o)
- {
- return true;
- }
-
- if ((o == null) || (getClass() != o.getClass()))
- {
- return false;
- }
-
- MessageIdentityVector that = (MessageIdentityVector) o;
-
- if (circuitEndId != that.circuitEndId)
- {
- return false;
- }
-
- if ((clientId != null) ? (!clientId.equals(that.clientId)) : (that.clientId != null))
- {
- return false;
- }
-
- if ((testCaseVector != null) ? (!testCaseVector.equals(that.testCaseVector)) : (that.testCaseVector != null))
- {
- return false;
- }
-
- return true;
- }
-
- /**
- * Computes a hash code for this identity vector based on all fields.
- *
- * @return A hash code for this identity vector based on all fields.
- */
- public int hashCode()
- {
- int result;
- result = ((testCaseVector != null) ? testCaseVector.hashCode() : 0);
- result = (31 * result) + ((clientId != null) ? clientId.hashCode() : 0);
- result = (31 * result) + circuitEndId;
-
- return result;
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java
deleted file mode 100644
index 5265c0416f..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import javax.jms.Message;
-import javax.jms.MessageListener;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * MessageMonitor is used to record information about messages received. This will provide methods to check various
- * properties, such as the type, number and content of messages received in order to verify the correct behaviour of
- * tests.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Count incoming messages.
- * <tr><td> Record time ellapsed since the arrival of the first message.
- * <tr><td> Reset all counts and timings.
- * </table>
- */
-public class MessageMonitor implements MessageListener
-{
- /** Used for debugging. */
- private final Logger log = Logger.getLogger(MessageMonitor.class);
-
- /** Holds the count of messages received since the last query. */
- protected AtomicInteger numMessages = new AtomicInteger();
-
- /** Holds the time of arrival of the first message. */
- protected Long firstMessageTime = null;
-
- /**
- * Handles received messages. Does Nothing.
- *
- * @param message The message. Ignored.
- */
- public void onMessage(Message message)
- {
- // log.debug("public void onMessage(Message message): called");
-
- numMessages.getAndIncrement();
- }
-
- /**
- * Gets the count of messages.
- *
- * @return The count of messages.
- */
- public int getNumMessage()
- {
- if (firstMessageTime == null)
- {
- firstMessageTime = System.nanoTime();
- }
-
- return numMessages.get();
- }
-
- /**
- * Gets the time elapsed since the first message arrived, in nanos, or zero if no messages have arrived yet.
- *
- * @return The time elapsed since the first message arrived, in nanos, or zero if no messages have arrived yet.
- */
- public long getTime()
- {
- if (firstMessageTime != null)
- {
- return System.nanoTime() - firstMessageTime;
- }
- else
- {
- return 0L;
- }
- }
-
- /**
- * Resets the message count and timer to zero.
- */
- public void reset()
- {
- numMessages.set(0);
- firstMessageTime = null;
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java
deleted file mode 100644
index ceece2dae2..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java
+++ /dev/null
@@ -1,684 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import javax.jms.Session;
-import java.util.Properties;
-
-/**
- * MessagingTestConfigProperties defines a set of property names and default values for specifying a messaging topology,
- * and test parameters for running a messaging test over that topology. A Properties object holding some of these
- * properties, superimposed onto the defaults, is used to establish test topologies and control test behaviour.
- *
- * <p/>A complete list of the parameters, default values and comments on their usage is provided here:
- *
- * <p/><table><caption>Parameters</caption>
- * <tr><th> Parameter <th> Default <th> Comments
- * <tr><td> messageSize <td> 0 <td> Message size in bytes. Not including any headers.
- * <tr><td> destinationName <td> ping <td> The root name to use to generate destination names to ping.
- * <tr><td> persistent <td> false <td> Determines whether peristent delivery is used.
- * <tr><td> transacted <td> false <td> Determines whether messages are sent/received in transactions.
- * <tr><td> broker <td> tcp://localhost:5672 <td> Determines the broker to connect to.
- * <tr><td> virtualHost <td> test <td> Determines the virtual host to send all ping over.
- * <tr><td> rate <td> 0 <td> The maximum rate (in hertz) to send messages at. 0 means no limit.
- * <tr><td> verbose <td> false <td> The verbose flag for debugging. Prints to console on every message.
- * <tr><td> pubsub <td> false <td> Whether to ping topics or queues. Uses p2p by default.
- * <tr><td> username <td> guest <td> The username to access the broker with.
- * <tr><td> password <td> guest <td> The password to access the broker with.
- * <tr><td> selector <td> null <td> Not used. Defines a message selector to filter pings with.
- * <tr><td> destinationCount <td> 1 <td> The number of receivers listening to the pings.
- * <tr><td> timeout <td> 30000 <td> In milliseconds. The timeout to stop waiting for replies.
- * <tr><td> commitBatchSize <td> 1 <td> The number of messages per transaction in transactional mode.
- * <tr><td> uniqueDests <td> true <td> Whether each receivers only listens to one ping destination or all.
- * <tr><td> durableDests <td> false <td> Whether or not durable destinations are used.
- * <tr><td> ackMode <td> AUTO_ACK <td> The message acknowledgement mode. Possible values are:
- * 0 - SESSION_TRANSACTED
- * 1 - AUTO_ACKNOWLEDGE
- * 2 - CLIENT_ACKNOWLEDGE
- * 3 - DUPS_OK_ACKNOWLEDGE
- * 257 - NO_ACKNOWLEDGE
- * 258 - PRE_ACKNOWLEDGE
- * <tr><td> maxPending <td> 0 <td> The maximum size in bytes, of messages sent but not yet received.
- * Limits the volume of messages currently buffered on the client
- * or broker. Can help scale test clients by limiting amount of buffered
- * data to avoid out of memory errors.
- * </table>
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide the names and defaults of all test parameters.
- * </table>
- *
- * @todo Put a type-safe wrapper around these properties, but continue to store the parameters as properties. This is
- * simply to ensure that it is a simple matter to serialize/deserialize string/string pairs onto messages.
- */
-public class MessagingTestConfigProperties extends ParsedProperties
-{
- // ====================== Connection Properties ==================================
-
- /** Holds the name of the default connection configuration. */
- public static final String CONNECTION_NAME = "broker";
-
- /** Holds the name of the property to get the initial context factory name from. */
- public static final String INITIAL_CONTEXT_FACTORY_PROPNAME = "java.naming.factory.initial";
-
- /** Defines the class to use as the initial context factory by default. */
- public static final String INITIAL_CONTEXT_FACTORY_DEFAULT = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
-
- /** Holds the name of the property to get the test broker url from. */
- public static final String BROKER_PROPNAME = "qpid.test.broker";
-
- /** Holds the default broker url for the test. */
- public static final String BROKER_DEFAULT = "vm://:1";
-
- /** Holds the name of the property to get the test broker virtual path. */
- public static final String VIRTUAL_HOST_PROPNAME = "virtualHost";
-
- /** Holds the default virtual path for the test. */
- public static final String VIRTUAL_HOST_DEFAULT = "test";
-
- /** Holds the name of the property to get the broker access username from. */
- public static final String USERNAME_PROPNAME = "username";
-
- /** Holds the default broker log on username. */
- public static final String USERNAME_DEFAULT = "guest";
-
- /** Holds the name of the property to get the broker access password from. */
- public static final String PASSWORD_PROPNAME = "password";
-
- /** Holds the default broker log on password. */
- public static final String PASSWORD_DEFAULT = "guest";
-
- // ====================== Messaging Topology Properties ==========================
-
- /** Holds the name of the property to get the bind publisher procuder flag from. */
- public static final String PUBLISHER_PRODUCER_BIND_PROPNAME = "publisherProducerBind";
-
- /** Holds the default value of the publisher producer flag. */
- public static final boolean PUBLISHER_PRODUCER_BIND_DEFAULT = true;
-
- /** Holds the name of the property to get the bind publisher procuder flag from. */
- public static final String PUBLISHER_CONSUMER_BIND_PROPNAME = "publisherConsumerBind";
-
- /** Holds the default value of the publisher consumer flag. */
- public static final boolean PUBLISHER_CONSUMER_BIND_DEFAULT = false;
-
- /** Holds the name of the property to get the bind receivers procuder flag from. */
- public static final String RECEIVER_PRODUCER_BIND_PROPNAME = "receiverProducerBind";
-
- /** Holds the default value of the receivers producer flag. */
- public static final boolean RECEIVER_PRODUCER_BIND_DEFAULT = false;
-
- /** Holds the name of the property to get the bind receivers procuder flag from. */
- public static final String RECEIVER_CONSUMER_BIND_PROPNAME = "receiverConsumerBind";
-
- /** Holds the default value of the receivers consumer flag. */
- public static final boolean RECEIVER_CONSUMER_BIND_DEFAULT = true;
-
- /** Holds the name of the property to get the publishers consumer active flag from. */
- public static final String PUBLISHER_CONSUMER_ACTIVE_PROPNAME = "publisherConsumerActive";
-
- /** Holds the default value of the publishers consumer active flag. */
- public static final boolean PUBLISHER_CONSUMER_ACTIVE_DEFAULT = true;
-
- /** Holds the name of the property to get the receivers consumer active flag from. */
- public static final String RECEIVER_CONSUMER_ACTIVE_PROPNAME = "receiverConsumerActive";
-
- /** Holds the default value of the receivers consumer active flag. */
- public static final boolean RECEIVER_CONSUMER_ACTIVE_DEFAULT = true;
-
- /** Holds the name of the property to get the destination name root from. */
- public static final String SEND_DESTINATION_NAME_ROOT_PROPNAME = "sendDestinationRoot";
-
- /** Holds the root of the name of the default destination to send to. */
- public static final String SEND_DESTINATION_NAME_ROOT_DEFAULT = "sendTo";
-
- /** Holds the name of the property to get the destination name root from. */
- public static final String RECEIVE_DESTINATION_NAME_ROOT_PROPNAME = "receiveDestinationRoot";
-
- /** Holds the root of the name of the default destination to send to. */
- public static final String RECEIVE_DESTINATION_NAME_ROOT_DEFAULT = "receiveFrom";
-
- /** Holds the name of the proeprty to get the destination count from. */
- public static final String DESTINATION_COUNT_PROPNAME = "destinationCount";
-
- /** Defines the default number of destinations to ping. */
- public static final int DESTINATION_COUNT_DEFAULT = 1;
-
- /** Holds the name of the property to get the p2p or pub/sub messaging mode from. */
- public static final String PUBSUB_PROPNAME = "pubsub";
-
- /** Holds the pub/sub mode default, true means ping a topic, false means ping a queue. */
- public static final boolean PUBSUB_DEFAULT = false;
-
- // ====================== JMS Options and Flags =================================
-
- /** Holds the name of the property to get the test delivery mode from. */
- public static final String PERSISTENT_MODE_PROPNAME = "persistent";
-
- /** Holds the message delivery mode to use for the test. */
- public static final boolean PERSISTENT_MODE_DEFAULT = false;
-
- /** Holds the name of the property to get the test transactional mode from. */
- public static final String TRANSACTED_PUBLISHER_PROPNAME = "transactedPublisher";
-
- /** Holds the transactional mode to use for the test. */
- public static final boolean TRANSACTED_PUBLISHER_DEFAULT = false;
-
- /** Holds the name of the property to get the test transactional mode from. */
- public static final String TRANSACTED_RECEIVER_PROPNAME = "transactedReceiver";
-
- /** Holds the transactional mode to use for the test. */
- public static final boolean TRANSACTED_RECEIVER_DEFAULT = false;
-
- /** Holds the name of the property to set the no local flag from. */
- public static final String NO_LOCAL_PROPNAME = "noLocal";
-
- /** Defines the default value of the no local flag to use when consuming messages. */
- public static final boolean NO_LOCAL_DEFAULT = false;
-
- /** Holds the name of the property to get the message acknowledgement mode from. */
- public static final String ACK_MODE_PROPNAME = "ackMode";
-
- /** Defines the default message acknowledgement mode. */
- public static final int ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE;
-
- /** Holds the name of the property to get the durable subscriptions flag from, when doing pub/sub messaging. */
- public static final String DURABLE_SUBSCRIPTION_PROPNAME = "durableSubscription";
-
- /** Defines the default value of the durable subscriptions flag. */
- public static final boolean DURABLE_SUBSCRIPTION_DEFAULT = false;
-
- // ====================== Qpid/AMQP Options and Flags ================================
-
- /** Holds the name of the property to set the exclusive flag from. */
- public static final String EXCLUSIVE_PROPNAME = "exclusive";
-
- /** Defines the default value of the exclusive flag to use when consuming messages. */
- public static final boolean EXCLUSIVE_DEFAULT = false;
-
- /** Holds the name of the property to set the immediate flag from. */
- public static final String IMMEDIATE_PROPNAME = "immediate";
-
- /** Defines the default value of the immediate flag to use when sending messages. */
- public static final boolean IMMEDIATE_DEFAULT = false;
-
- /** Holds the name of the property to set the mandatory flag from. */
- public static final String MANDATORY_PROPNAME = "mandatory";
-
- /** Defines the default value of the mandatory flag to use when sending messages. */
- public static final boolean MANDATORY_DEFAULT = false;
-
- /** Holds the name of the property to get the durable destinations flag from. */
- public static final String DURABLE_DESTS_PROPNAME = "durableDests";
-
- /** Default value for the durable destinations flag. */
- public static final boolean DURABLE_DESTS_DEFAULT = false;
-
- /** Holds the name of the property to set the prefetch size from. */
- public static final String PREFETCH_PROPNAME = "prefetch";
-
- /** Defines the default prefetch size to use when consuming messages. */
- public static final int PREFETCH_DEFAULT = 100;
-
- // ====================== Common Test Parameters ================================
-
- /** Holds the name of the property to get the test message size from. */
- public static final String MESSAGE_SIZE_PROPNAME = "messageSize";
-
- /** Used to set up a default message size. */
- public static final int MESSAGE_SIZE_DEAFULT = 0;
-
- /** Holds the name of the property to get the message rate from. */
- public static final String RATE_PROPNAME = "rate";
-
- /** Defines the default rate (in pings per second) to send pings at. 0 means as fast as possible, no restriction. */
- public static final int RATE_DEFAULT = 0;
-
- /** Holds the name of the proeprty to get the. */
- public static final String SELECTOR_PROPNAME = "selector";
-
- /** Holds the default message selector. */
- public static final String SELECTOR_DEFAULT = "";
-
- /** Holds the name of the property to get the waiting timeout for response messages. */
- public static final String TIMEOUT_PROPNAME = "timeout";
-
- /** Default time to wait before assuming that a ping has timed out. */
- public static final long TIMEOUT_DEFAULT = 30000;
-
- /** Holds the name of the property to get the commit batch size from. */
- public static final String TX_BATCH_SIZE_PROPNAME = "commitBatchSize";
-
- /** Defines the default number of pings to send in each transaction when running transactionally. */
- public static final int TX_BATCH_SIZE_DEFAULT = 1;
-
- /** Holds the name of the property to set the maximum amount of pending message data for a producer to hold. */
- public static final String MAX_PENDING_PROPNAME = "maxPending";
-
- /** Defines the default maximum quantity of pending message data to allow producers to hold. */
- public static final int MAX_PENDING_DEFAULT = 0;
-
- /** Holds the name of the property to get the publisher rollback flag from. */
- public static final String ROLLBACK_PUBLISHER_PROPNAME = "rollbackPublisher";
-
- /** Holds the default publisher roll back setting. */
- public static final boolean ROLLBACK_PUBLISHER_DEFAULT = false;
-
- /** Holds the name of the property to get the publisher rollback flag from. */
- public static final String ROLLBACK_RECEIVER_PROPNAME = "rollbackReceiver";
-
- /** Holds the default publisher roll back setting. */
- public static final boolean ROLLBACK_RECEIVER_DEFAULT = false;
-
- // ====================== Options that control the bahviour of the test framework. =========================
-
- /** Holds the name of the property to get the behavioural mode of not applicable assertions. */
- public static final String NOT_APPLICABLE_ASSERTION_PROPNAME = "notApplicableAssertion";
-
- /** Holds the default behavioral mode of not applicable assertions, which is logging them as a warning. */
- public static final String NOT_APPLICABLE_ASSERTION_DEFAULT = "warn";
-
- /** Holds the name of the property to get the verbose mode proeprty from. */
- public static final String VERBOSE_PROPNAME = "verbose";
-
- /** Holds the default verbose mode. */
- public static final boolean VERBOSE_DEFAULT = false;
-
- /** Holds the default configuration properties. */
- public static ParsedProperties defaults = new ParsedProperties();
-
- static
- {
- defaults.setPropertyIfNull(INITIAL_CONTEXT_FACTORY_PROPNAME, INITIAL_CONTEXT_FACTORY_DEFAULT);
- defaults.setPropertyIfNull(BROKER_PROPNAME, BROKER_DEFAULT);
- defaults.setPropertyIfNull(VIRTUAL_HOST_PROPNAME, VIRTUAL_HOST_DEFAULT);
- defaults.setPropertyIfNull(USERNAME_PROPNAME, USERNAME_DEFAULT);
- defaults.setPropertyIfNull(PASSWORD_PROPNAME, PASSWORD_DEFAULT);
-
- defaults.setPropertyIfNull(PUBLISHER_PRODUCER_BIND_PROPNAME, PUBLISHER_PRODUCER_BIND_DEFAULT);
- defaults.setPropertyIfNull(PUBLISHER_CONSUMER_BIND_PROPNAME, PUBLISHER_CONSUMER_BIND_DEFAULT);
- defaults.setPropertyIfNull(RECEIVER_PRODUCER_BIND_PROPNAME, RECEIVER_PRODUCER_BIND_DEFAULT);
- defaults.setPropertyIfNull(RECEIVER_CONSUMER_BIND_PROPNAME, RECEIVER_CONSUMER_BIND_DEFAULT);
- defaults.setPropertyIfNull(PUBLISHER_CONSUMER_ACTIVE_PROPNAME, PUBLISHER_CONSUMER_ACTIVE_DEFAULT);
- defaults.setPropertyIfNull(RECEIVER_CONSUMER_ACTIVE_PROPNAME, RECEIVER_CONSUMER_ACTIVE_DEFAULT);
- defaults.setPropertyIfNull(SEND_DESTINATION_NAME_ROOT_PROPNAME, SEND_DESTINATION_NAME_ROOT_DEFAULT);
- defaults.setPropertyIfNull(RECEIVE_DESTINATION_NAME_ROOT_PROPNAME, RECEIVE_DESTINATION_NAME_ROOT_DEFAULT);
- defaults.setPropertyIfNull(DESTINATION_COUNT_PROPNAME, DESTINATION_COUNT_DEFAULT);
- defaults.setPropertyIfNull(PUBSUB_PROPNAME, PUBSUB_DEFAULT);
-
- defaults.setPropertyIfNull(PERSISTENT_MODE_PROPNAME, PERSISTENT_MODE_DEFAULT);
- defaults.setPropertyIfNull(TRANSACTED_PUBLISHER_PROPNAME, TRANSACTED_PUBLISHER_DEFAULT);
- defaults.setPropertyIfNull(TRANSACTED_RECEIVER_PROPNAME, TRANSACTED_RECEIVER_DEFAULT);
- defaults.setPropertyIfNull(NO_LOCAL_PROPNAME, NO_LOCAL_DEFAULT);
- defaults.setPropertyIfNull(ACK_MODE_PROPNAME, ACK_MODE_DEFAULT);
- defaults.setPropertyIfNull(DURABLE_SUBSCRIPTION_PROPNAME, DURABLE_SUBSCRIPTION_DEFAULT);
-
- defaults.setPropertyIfNull(EXCLUSIVE_PROPNAME, EXCLUSIVE_DEFAULT);
- defaults.setPropertyIfNull(IMMEDIATE_PROPNAME, IMMEDIATE_DEFAULT);
- defaults.setPropertyIfNull(MANDATORY_PROPNAME, MANDATORY_DEFAULT);
- defaults.setPropertyIfNull(DURABLE_DESTS_PROPNAME, DURABLE_DESTS_DEFAULT);
- defaults.setPropertyIfNull(PREFETCH_PROPNAME, PREFETCH_DEFAULT);
-
- defaults.setPropertyIfNull(MESSAGE_SIZE_PROPNAME, MESSAGE_SIZE_DEAFULT);
- defaults.setPropertyIfNull(RATE_PROPNAME, RATE_DEFAULT);
- defaults.setPropertyIfNull(SELECTOR_PROPNAME, SELECTOR_DEFAULT);
- defaults.setPropertyIfNull(TIMEOUT_PROPNAME, TIMEOUT_DEFAULT);
- defaults.setPropertyIfNull(TX_BATCH_SIZE_PROPNAME, TX_BATCH_SIZE_DEFAULT);
- defaults.setPropertyIfNull(MAX_PENDING_PROPNAME, MAX_PENDING_DEFAULT);
- defaults.setPropertyIfNull(ROLLBACK_PUBLISHER_PROPNAME, ROLLBACK_PUBLISHER_DEFAULT);
- defaults.setPropertyIfNull(ROLLBACK_RECEIVER_PROPNAME, ROLLBACK_RECEIVER_DEFAULT);
-
- defaults.setPropertyIfNull(NOT_APPLICABLE_ASSERTION_PROPNAME, NOT_APPLICABLE_ASSERTION_DEFAULT);
- defaults.setPropertyIfNull(VERBOSE_PROPNAME, VERBOSE_DEFAULT);
- }
-
- /**
- * Creates a test configuration based on the defaults.
- */
- public MessagingTestConfigProperties()
- {
- super(defaults);
- }
-
- /**
- * Creates a test configuration based on the supplied properties.
- *
- * @param properties The test configuration.
- */
- public MessagingTestConfigProperties(Properties properties)
- {
- super(properties);
- }
-
- /**
- * The size of test messages to send.
- *
- * @return The size of test messages to send.
- */
- public int getMessageSize()
- {
- return getPropertyAsInteger(MESSAGE_SIZE_PROPNAME);
- }
-
- /**
- * Flag to indicate that the publishing producer should be set up to publish to a destination.
- *
- * @return Flag to indicate that the publishing producer should be set up to publish to a destination.
- */
- public boolean getPublisherProducerBind()
- {
- return getPropertyAsBoolean(PUBLISHER_PRODUCER_BIND_PROPNAME);
- }
-
- /**
- * Flag to indicate that the publishing consumer should be set up to receive from a destination.
- *
- * @return Flag to indicate that the publishing consumer should be set up to receive from a destination.
- */
- public boolean getPublisherConsumerBind()
- {
- return getPropertyAsBoolean(PUBLISHER_CONSUMER_BIND_PROPNAME);
- }
-
- /**
- * Flag to indicate that the receiving producer should be set up to publish to a destination.
- *
- * @return Flag to indicate that the receiving producer should be set up to publish to a destination.
- */
- public boolean getReceiverProducerBind()
- {
- return getPropertyAsBoolean(RECEIVER_PRODUCER_BIND_PROPNAME);
- }
-
- /**
- * Flag to indicate that the receiving consumer should be set up to receive from a destination.
- *
- * @return Flag to indicate that the receiving consumer should be set up to receive from a destination.
- */
- public boolean getReceiverConsumerBind()
- {
- return getPropertyAsBoolean(RECEIVER_CONSUMER_BIND_PROPNAME);
- }
-
- /**
- * Flag to indicate that the publishing consumer should be created and actively listening.
- *
- * @return Flag to indicate that the publishing consumer should be created.
- */
- public boolean getPublisherConsumerActive()
- {
- return getPropertyAsBoolean(PUBLISHER_CONSUMER_ACTIVE_PROPNAME);
- }
-
- /**
- * Flag to indicate that the receiving consumers should be created and actively listening.
- *
- * @return Flag to indicate that the receiving consumers should be created and actively listening.
- */
- public boolean getReceiverConsumerActive()
- {
- return getPropertyAsBoolean(RECEIVER_CONSUMER_ACTIVE_PROPNAME);
- }
-
- /**
- * A root to create all test destination names from.
- *
- * @return A root to create all test destination names from.
- */
- public String getSendDestinationNameRoot()
- {
- return getProperty(SEND_DESTINATION_NAME_ROOT_PROPNAME);
- }
-
- /**
- * A root to create all receiving destination names from.
- *
- * @return A root to create all receiving destination names from.
- */
- public String getReceiveDestinationNameRoot()
- {
- return getProperty(RECEIVE_DESTINATION_NAME_ROOT_PROPNAME);
- }
-
- /**
- * Flag to indicate that persistent messages should be used.
- *
- * @return Flag to indicate that persistent messages should be used.
- */
- public boolean getPersistentMode()
- {
- return getPropertyAsBoolean(PERSISTENT_MODE_PROPNAME);
- }
-
- /**
- * Flag to indicate that transactional messages should be sent by the publisher.
- *
- * @return Flag to indicate that transactional messages should be sent by the publisher.
- */
- public boolean getPublisherTransacted()
- {
- return getPropertyAsBoolean(TRANSACTED_PUBLISHER_PROPNAME);
- }
-
- /**
- * Flag to indicate that transactional receives should be used by the receiver.
- *
- * @return Flag to indicate that transactional receives should be used by the receiver.
- */
- public boolean getReceiverTransacted()
- {
- return getPropertyAsBoolean(TRANSACTED_PUBLISHER_PROPNAME);
- }
-
- /**
- * The name of the virtual host to run all tests over.
- *
- * @return The name of the virtual host to run all tests over.
- */
- public String getVirtualHost()
- {
- return getProperty(VIRTUAL_HOST_PROPNAME);
- }
-
- /**
- * Limiting rate for each sender in messages per second, or zero for unlimited.
- *
- * @return Limiting rate for each sender in messages per second, or zero for unlimited.
- */
- public String getRate()
- {
- return getProperty(RATE_PROPNAME);
- }
-
- /**
- * Flag to indicate that test messages should be received publish/subscribe style by all receivers.
- *
- * @return Flag to indicate that test messages should be received publish/subscribe style by all receivers.
- */
- public boolean getPubsub()
- {
- return getPropertyAsBoolean(PUBSUB_PROPNAME);
- }
-
- /**
- * The username credentials to run tests with.
- *
- * @return The username credentials to run tests with.
- */
- public String getUsername()
- {
- return getProperty(USERNAME_PROPNAME);
- }
-
- /**
- * The password credentials to run tests with.
- *
- * @return The password credentials to run tests with.
- */
- public String getPassword()
- {
- return getProperty(PASSWORD_PROPNAME);
- }
-
- /**
- * The timeout duration to fail tests on, should they receive no messages within it.
- *
- * @return The timeout duration to fail tests on, should they receive no messages within it.
- */
- public long getTimeout()
- {
- return getPropertyAsLong(TIMEOUT_PROPNAME);
- }
-
- /**
- * The number of messages to batch into each transaction in transational tests.
- *
- * @return The number of messages to batch into each transaction in transational tests.
- */
- public int getTxBatchSize()
- {
- return getPropertyAsInteger(TX_BATCH_SIZE_PROPNAME);
- }
-
- /**
- * Flag to indicate that tests should use durable destinations.
- *
- * @return Flag to indicate that tests should use durable destinations.
- */
- public boolean getDurableDests()
- {
- return getPropertyAsBoolean(DURABLE_DESTS_PROPNAME);
- }
-
- /**
- * The ack mode for message receivers to use.
- *
- * @return The ack mode for message receivers to use.
- */
- public int getAckMode()
- {
- return getPropertyAsInteger(ACK_MODE_PROPNAME);
- }
-
- /**
- * Flag to indicate that tests should use durable subscriptions.
- *
- * @return Flag to indicate that tests should use durable subscriptions.
- */
- public boolean getDurableSubscription()
- {
- return getPropertyAsBoolean(DURABLE_SUBSCRIPTION_PROPNAME);
- }
-
- /**
- * The maximum amount of in-flight data, in bytes, that tests should send at any time.
- *
- * @return The maximum amount of in-flight data, in bytes, that tests should send at any time.
- */
- public int getMaxPending()
- {
- return getPropertyAsInteger(MAX_PENDING_PROPNAME);
- }
-
- /**
- * The size of the prefetch queue to use.
- *
- * @return The size of the prefetch queue to use.
- */
- public int getPrefetch()
- {
- return getPropertyAsInteger(PREFETCH_PROPNAME);
- }
-
- /**
- * Flag to indicate that subscriptions should be no-local.
- *
- * @return Flag to indicate that subscriptions should be no-local.
- */
- public boolean getNoLocal()
- {
- return getPropertyAsBoolean(NO_LOCAL_PROPNAME);
- }
-
- /**
- * Flag to indicate that subscriptions should be exclusive.
- *
- * @return Flag to indicate that subscriptions should be exclusive.
- */
- public boolean getExclusive()
- {
- return getPropertyAsBoolean(EXCLUSIVE_PROPNAME);
- }
-
- /**
- * Flag to indicate that messages must be delivered immediately.
- *
- * @return Flag to indicate that messages must be delivered immediately.
- */
- public boolean getImmediate()
- {
- return getPropertyAsBoolean(IMMEDIATE_PROPNAME);
- }
-
- /**
- * Flag to indicate that messages must be routable.
- *
- * @return Flag to indicate that messages must be routable.
- */
- public boolean getMandatory()
- {
- return getPropertyAsBoolean(MANDATORY_PROPNAME);
- }
-
- /**
- * Gets the value of a flag to indicate that the publisher should rollback all messages sent.
- *
- * @return A flag to indicate that the publisher should rollback all messages sent.
- */
- public boolean getRollbackPublisher()
- {
- return getPropertyAsBoolean(ROLLBACK_PUBLISHER_PROPNAME);
- }
-
- /**
- * Gets the value of a flag to indicate that the receiver should rollback all messages received, then receive them
- * again.
- *
- * @return A flag to indicate that the publisher should rollback all messages received.
- */
- public boolean getRollbackReceiver()
- {
- return getPropertyAsBoolean(ROLLBACK_RECEIVER_PROPNAME);
- }
-
- /**
- * Gets the behavioural mode of not applicable assertions. Should be one of 'quiet', 'warn' or 'fail'.
- *
- * @return The behavioural mode of not applicable assertions.
- */
- public String getNotApplicableAssertionMode()
- {
- return getProperty(NOT_APPLICABLE_ASSERTION_PROPNAME);
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java
deleted file mode 100644
index 2a20be12d6..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-/**
- * NotApplicableAssertion is a messaging assertion that can be used when an assertion requested by a test-case is not
- * applicable to the testing scenario. For example an assertion may relate to AMQP functionality, but a test case may be
- * being run over a non-AMQP JMS implementation, in which case the request to create the assertion may return this
- * instead of the proper assertion. The test framework is configurable to quietly drop these assertions, log them
- * as warnings to the console, or raise them as test failures.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Quitely pass.
- * <tr><td> Log a warning.
- * <tr><td> Raise a test failure.
- * </table>
- */
-public class NotApplicableAssertion implements Assertion
-{
- /** Used for logging to the console. */
- private static final Logger console = Logger.getLogger("CONSOLE." + NotApplicableAssertion.class.getName());
-
- /** The possible behavioural modes of this assertion. */
- private enum Mode
- {
- /** Quietly ignore the assertion by passing. */
- Quiet,
-
- /** Ignore the assertion by passing but log a warning about it. */
- Warn,
-
- /** Fail the assertion. */
- Fail;
- }
-
- /** The behavioural mode of the assertion. */
- private Mode mode;
-
- /**
- * Creates an assertion that is driven by the value of the 'notApplicableAssertion' property of the test
- * configuration. Its value should match one of 'quiet', 'warn' or 'fail' and if it does not it is automatically
- * read as 'fail'.
- *
- * @param testProperties The test configuration properties.
- */
- public NotApplicableAssertion(ParsedProperties testProperties)
- {
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProperties);
-
- String modeName = props.getNotApplicableAssertionMode();
-
- if ("quiet".equals(modeName))
- {
- mode = Mode.Quiet;
- }
- else if ("warn".equals(modeName))
- {
- mode = Mode.Warn;
- }
- else
- {
- mode = Mode.Fail;
- }
- }
-
- /**
- * Applies the assertion.
- *
- * @return <tt>true</tt> if the assertion passes, <tt>false</tt> if it fails.
- */
- public boolean apply()
- {
- switch (mode)
- {
- case Quiet:
- return true;
-
- case Warn:
- console.warn("Warning: Not applicable assertion being ignored.");
-
- return true;
-
- case Fail:
- default:
- return false;
- }
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java
deleted file mode 100644
index 2c8be4f787..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-/**
- * A Publisher represents the status of the publishing side of a test circuit. Its main purpose is to provide assertions
- * that can be applied to test the behaviour of the publishers.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide assertion that the publishers received no exceptions.
- * </table>
- *
- * @todo There are mixtures of AMQP and JMS assertions in this interface. Either keep them here, but quietly (or with a
- * warning or error) drop them from test cases where they are not relevant, or push them down into sub-classes.
- * I am tempted to go with the dropping/warning/error approach, that would imply that it makes sense to pull
- * the assertions back from AMQPPublisher to here.
- */
-public interface Publisher
-{
- // Assertions that are meaningfull to AMQP and to JMS.
-
- /**
- * Provides an assertion that the publisher encountered no exceptions.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the publisher encountered no exceptions.
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps);
-
- // Assertions that are meaningfull only to AMQP.
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps);
-
- // Assertions that are meaningfull only to Java/JMS.
-
- /**
- * Provides an assertion that the publisher got a given exception during the test.
- *
- * @param testProps The test configuration properties.
- * @param exceptionClass The exception class to check for.
- *
- * @return An assertion that the publisher got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass);
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java
deleted file mode 100644
index 19dc4d90e7..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-/**
- * A Receiver is a {@link CircuitEnd} that represents the status of the receiving side of a test circuit. Its main
- * purpose is to provide assertions that can be applied to check the behaviour of the receivers.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide assertion that the receivers received no exceptions.
- * <tr><td> Provide assertion that the receivers received all test messages sent to it.
- * </table>
- *
- * @todo There are mixtures of AMQP and JMS assertions in this interface. Either keep them here, but quietly (or with a
- * warning or error) drop them from test cases where they are not relevant, or push them down into sub-classes.
- * I am tempted to go with the dropping/warning/error approach.
- */
-public interface Receiver
-{
- // Assertions that are meaningfull to AMQP and to JMS.
-
- /**
- * Provides an assertion that the receivers encountered no exceptions.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers encountered no exceptions.
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps);
-
- /**
- * Provides an assertion that the receivers got all messages that were sent to it.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers got all messages that were sent to it.
- */
- public Assertion allMessagesReceivedAssertion(ParsedProperties testProps);
-
- /**
- * Provides an assertion that the receivers got none of the messages that were sent to it.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers got none of the messages that were sent to it.
- */
- public Assertion noMessagesReceivedAssertion(ParsedProperties testProps);
-
- // Assertions that are meaningfull only to AMQP.
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps);
-
- // Assertions that are meaningfull only to Java/JMS.
-
- /**
- * Provides an assertion that the receiver got a given exception during the test.
- *
- * @param testProps The test configuration properties.
- * @param exceptionClass The exception class to check for.
- *
- * @return An assertion that the receiver got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass);
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java
deleted file mode 100644
index ad1e70f6f7..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td>
- * </table>
- */
-public class TestCaseVector
-{
- /** The test case name. */
- private String testCase;
-
- /** The test cycle number within the test case. */
- private int testCycleNumber;
-
- public TestCaseVector(String testCase, int testCycleNumber)
- {
- this.testCase = testCase;
- this.testCycleNumber = testCycleNumber;
- }
-
- public String getTestCase()
- {
- return testCase;
- }
-
- public int getTestCycleNumber()
- {
- return testCycleNumber;
- }
-
- public boolean equals(Object o)
- {
- if (this == o)
- {
- return true;
- }
-
- if ((o == null) || (getClass() != o.getClass()))
- {
- return false;
- }
-
- TestCaseVector that = (TestCaseVector) o;
-
- if (testCycleNumber != that.testCycleNumber)
- {
- return false;
- }
-
- if ((testCase != null) ? (!testCase.equals(that.testCase)) : (that.testCase != null))
- {
- return false;
- }
-
- return true;
- }
-
- public int hashCode()
- {
- int result;
- result = ((testCase != null) ? testCase.hashCode() : 0);
- result = (31 * result) + testCycleNumber;
-
- return result;
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java
deleted file mode 100644
index 7498f2b6b5..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-/**
- * TestClientDetails is used to encapsulate information about an interop test client. It pairs together the unique
- * name of the client, and the route on which it listens to its control messages.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Record test clients control addresses together with their names.
- * </table>
- */
-public class TestClientDetails
-{
- /** The test clients name. */
- public String clientName;
-
- /* The test clients unique sequence number. Not currently used. */
-
- /** The routing key of the test clients control topic. */
- public String privateControlKey;
-
- /**
- * Two TestClientDetails are considered to be equal, iff they have the same client name.
- *
- * @param o The object to compare to.
- *
- * @return <tt>If the object to compare to is a TestClientDetails equal to this one, <tt>false</tt> otherwise.
- */
- public boolean equals(Object o)
- {
- if (this == o)
- {
- return true;
- }
-
- if (!(o instanceof TestClientDetails))
- {
- return false;
- }
-
- final TestClientDetails testClientDetails = (TestClientDetails) o;
-
- return !((clientName != null) ? (!clientName.equals(testClientDetails.clientName))
- : (testClientDetails.clientName != null));
- }
-
- /**
- * Computes a hash code compatible with the equals method; based on the client name alone.
- *
- * @return A hash code for this.
- */
- public int hashCode()
- {
- return ((clientName != null) ? clientName.hashCode() : 0);
- }
-
- /**
- * Outputs the client name and address details. Mostly used for debugging purposes.
- *
- * @return The client name and address.
- */
- public String toString()
- {
- return "TestClientDetails: [ clientName = " + clientName + ", privateControlKey = " + privateControlKey + " ]";
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java
deleted file mode 100644
index 919faa4754..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import static org.apache.qpid.test.framework.MessagingTestConfigProperties.BROKER_PROPNAME;
-import static org.apache.qpid.test.framework.MessagingTestConfigProperties.CONNECTION_NAME;
-import static org.apache.qpid.test.framework.MessagingTestConfigProperties.PASSWORD_PROPNAME;
-import static org.apache.qpid.test.framework.MessagingTestConfigProperties.USERNAME_PROPNAME;
-import static org.apache.qpid.test.framework.MessagingTestConfigProperties.VIRTUAL_HOST_PROPNAME;
-
-import javax.jms.BytesMessage;
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import java.util.Map;
-
-/**
- * TestUtils provides static helper methods that are usefull for writing tests against QPid.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create connections from test properties. <td> {@link MessagingTestConfigProperties}
- * <tr><td> Create test messages.
- * <tr><td> Inject a short pause in a test.
- * <tr><td> Serialize properties into a message.
- * </table>
- */
-public class TestUtils
-{
- /** Used for debugging. */
- private static Logger log = Logger.getLogger(TestUtils.class);
-
- /** Some dummy data to stuff all test messages with. */
- private static final byte[] MESSAGE_DATA_BYTES =
- "Test Message -- Test Message -- Test Message -- Test Message -- Test Message -- Test Message -- Test Message -- "
- .getBytes();
-
- /**
- * Establishes a JMS connection using a set of properties and qpids built in JNDI implementation. This is a simple
- * convenience method for code that does not anticipate handling connection failures. All exceptions that indicate
- * that the connection has failed, are wrapped as rutime exceptions, presumably handled by a top level failure
- * handler.
- *
- * <p/>This utility makes use of the following test parameters from {@link MessagingTestConfigProperties} to control
- * the connection creation:
- *
- * <p/><table>
- * <tr><td> {@link MessagingTestConfigProperties#USERNAME_PROPNAME} <td> The username.
- * <tr><td> {@link MessagingTestConfigProperties#PASSWORD_PROPNAME} <td> The password.
- * <tr><td> {@link MessagingTestConfigProperties#VIRTUAL_HOST_PROPNAME} <td> The virtual host name.
- * <tr><td> {@link MessagingTestConfigProperties#BROKER_PROPNAME} <td> The broker URL.
- * <tr><td> {@link MessagingTestConfigProperties#CONNECTION_NAME} <td> The broker name in the initial context.
- *
- * @param messagingProps Connection properties as defined in {@link MessagingTestConfigProperties}.
- *
- * @return A JMS conneciton.
- */
- public static Connection createConnection(ParsedProperties messagingProps)
- {
- log.debug("public static Connection createConnection(ParsedProperties messagingProps = " + messagingProps
- + "): called");
-
- try
- {
- // Extract the configured connection properties from the test configuration.
- String conUsername = messagingProps.getProperty(USERNAME_PROPNAME);
- String conPassword = messagingProps.getProperty(PASSWORD_PROPNAME);
- String virtualHost = messagingProps.getProperty(VIRTUAL_HOST_PROPNAME);
- String brokerUrl = messagingProps.getProperty(BROKER_PROPNAME);
-
- // Create the broker connection url.
- String connectionString =
- "amqp://" + conUsername + ":" + conPassword + "@clientid/" + ((virtualHost != null) ? virtualHost : "")
- + "?brokerlist='" + brokerUrl + "'";
-
- // Create properties to create the initial context from, and inject the connection factory configuration
- // for the defined connection name into it.
- messagingProps.setProperty("connectionfactory." + CONNECTION_NAME, connectionString);
-
- Context ctx = new InitialContext(messagingProps);
-
- ConnectionFactory cf = (ConnectionFactory) ctx.lookup(CONNECTION_NAME);
-
- return cf.createConnection();
- }
- catch (NamingException e)
- {
- throw new RuntimeException("Got JNDI NamingException whilst looking up the connection factory.", e);
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Could not establish connection due to JMSException.", e);
- }
- }
-
- /**
- * Creates a test message of the specified size, on the given JMS session.
- *
- * @param session The JMS session.
- * @param size The size of the message in bytes.
- *
- * @return A bytes message, of the specified size, filled with dummy data.
- *
- * @throws JMSException Any underlying JMSExceptions are allowed to fall through.
- */
- public static Message createTestMessageOfSize(Session session, int size) throws JMSException
- {
- BytesMessage message = session.createBytesMessage();
-
- if (size > 0)
- {
- int div = size / MESSAGE_DATA_BYTES.length;
- int mod = size % MESSAGE_DATA_BYTES.length;
-
- for (int i = 0; i < div; i++)
- {
- message.writeBytes(MESSAGE_DATA_BYTES);
- }
-
- if (mod != 0)
- {
- message.writeBytes(MESSAGE_DATA_BYTES, 0, mod);
- }
- }
-
- return message;
- }
-
- /**
- * Pauses for the specified length of time. In the event of failing to pause for at least that length of time
- * due to interuption of the thread, a RutimeException is raised to indicate the failure. The interupted status
- * of the thread is restores in that case. This method should only be used when it is expected that the pause
- * will be succesfull, for example in test code that relies on inejecting a pause.
- *
- * @param t The minimum time to pause for in milliseconds.
- */
- public static void pause(long t)
- {
- try
- {
- Thread.sleep(t);
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted status
- Thread.currentThread().interrupt();
-
- throw new RuntimeException("Failed to generate the requested pause length.", e);
- }
- }
-
- /**
- * Sets properties of different types on a JMS Message.
- *
- * @param message The message to set properties on.
- * @param properties The property name/value pairs to set.
- *
- * @throws javax.jms.JMSException All underlying JMSExceptions are allowed to fall through.
- *
- * @todo Move this helper method somewhere else. For example, TestUtils.
- */
- public static void setPropertiesOnMessage(Message message, Map<Object, Object> properties) throws JMSException
- {
- for (Map.Entry<Object, Object> entry : properties.entrySet())
- {
- String name = entry.getKey().toString();
- Object value = entry.getValue();
-
- message.setObjectProperty(name, value);
- }
- }
-}
-
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java
deleted file mode 100644
index 00cc2d8966..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-/**
- * ClockSynchFailureException represents failure of a {@link ClockSynchronizer} to achieve synchronization. For example,
- * this could be because a reference signal is not available, or because a desired accurracy cannot be attained.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Represent failure to achieve synchronization.
- * </table>
- */
-public class ClockSynchFailureException extends Exception
-{
- /**
- * Creates a clock synch failure exception.
- *
- * @param message The detail message (which is saved for later retrieval by the {@link #getMessage()} method).
- * @param cause The cause (which is saved for later retrieval by the {@link #getCause()} method). (A <tt>null</tt>
- * value is permitted, and indicates that the cause is nonexistent or unknown.)
- */
- public ClockSynchFailureException(String message, Throwable cause)
- {
- super(message, cause);
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java
deleted file mode 100644
index 3d4c4f7d12..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.ShutdownHookable;
-import org.apache.qpid.junit.extensions.Throttle;
-
-/**
- * ClockSynchThread is a convenient utility for running a thread that periodically synchronizes the clock against
- * a reference. Supply it with a {@link ClockSynchronizer} and a {@link Throttle} and it will continually keep the
- * clock up-to-date at a rate determined by the throttle.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Continually sychronize the clock at a throttled rate.
- * </table>
- */
-public class ClockSynchThread extends Thread implements ShutdownHookable
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(ClockSynchThread.class);
-
- /** Holds the clock syncher for the synch thread. */
- private ClockSynchronizer clockSyncher;
-
- /** Holds the throttle to limit the synch rate. */
- private Throttle throttle;
-
- /** Flag to indicate that the periodic clock syncher should keep running. */
- boolean doSynch = true;
-
- /**
- * Creates a clock synchronizer thread from a clock synchronizer and a throttle.
- *
- * @param syncher The clock synchronizer.
- * @param throttle The throttle.
- */
- public ClockSynchThread(ClockSynchronizer syncher, Throttle throttle)
- {
- this.clockSyncher = syncher;
- this.throttle = throttle;
- }
-
- /**
- * Terminates the synchronization thread.
- */
- public void terminate()
- {
- doSynch = false;
- }
-
- /**
- * Continually updates the clock, until {@link #terminate()} is called.
- */
- public void run()
- {
- while (doSynch)
- {
- // Perform a clock clockSynch.
- try
- {
- // Wait controlled by the throttle before doing the next synch.
- throttle.throttle();
-
- clockSyncher.synch();
- log.debug("Clock synched, delta = " + clockSyncher.getDelta() + ", epsilon = " + clockSyncher.getEpsilon()
- + ".");
- }
- // Terminate the synch thread if the synchronization cannot be achieved.
- catch (ClockSynchFailureException e)
- {
- log.debug("Cannot synchronize the clock (reference service may be down). Terminating the synch thread.");
- doSynch = false;
- }
- }
- }
-
- /**
- * Gets the clock synchronizer that is kept continually up to date.
- *
- * @return The clock synchronizer that is kept continually up to date.
- */
- public ClockSynchronizer getClockSyncher()
- {
- return clockSyncher;
- }
-
- /**
- * Supplies a shutdown hook, that terminates the synching thread.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- doSynch = false;
- }
- });
- }
-}
-
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java
deleted file mode 100644
index a92c551bc2..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-/**
- * ClockSynchronizer provides an interface through which two nodes may synchronize their clocks. It is expected that one
- * node will act as the reference clock, to which no delta need be applied, and the other node will act as the slave,
- * and which must apply a delta to its local clock to get a clock synchronized with the reference.
- *
- * <p/>The slave side will initiate the computation of a clock delta by calling the {@link #synch} method. This method
- * will not return until the delta has been computed, at which point there is a method to return its value, as well as
- * an estimate of the likely error (usually one standard deviation), in the synchronization. For convenience there is a
- * {@link #nanoTime} method to return the value of System.nanoTime() with the delta added in.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Trigger a clock synchronization.
- * <tr><td> Compute a clock delta to apply to the local clock.
- * <tr><td> Estimate the error in the synchronzation.
- * </table>
- */
-public interface ClockSynchronizer
-{
- /**
- * The slave side should call this to copute a clock delta with the reference.
- *
- * @throws ClockSynchFailureException If synchronization cannot be achieved.
- */
- public void synch() throws ClockSynchFailureException;
-
- /**
- * Gets the clock delta in nano seconds.
- *
- * @return The clock delta in nano seconds.
- */
- public long getDelta();
-
- /**
- * Gets an estimate of the clock error in nan seconds.
- *
- * @return An estimate of the clock error in nan seconds.
- */
- public long getEpsilon();
-
- /**
- * Gets the local clock time with any computed delta added in.
- *
- * @return The local clock time with any computed delta added in.
- */
- public long nanoTime();
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java
deleted file mode 100644
index f448d5f23c..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-/**
- * LocalClockSynchronizer is a fake {@link ClockSynchronizer} that simply calls System.nanoTime(). It exists so that
- * the same tests can be run distributed or locally, taking timings against the ClockSynchronizer interface without
- * being aware of how they are being run.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the local clock with no delta.
- * </table>
- */
-public class LocalClockSynchronizer implements ClockSynchronizer
-{
- /**
- * The slave side should call this to copute a clock delta with the reference.
- *
- * @throws org.apache.qpid.test.framework.clocksynch.ClockSynchFailureException
- * If synchronization cannot be achieved.
- */
- public void synch() throws ClockSynchFailureException
- { }
-
- /**
- * Gets the clock delta in nano seconds.
- *
- * @return The clock delta in nano seconds.
- */
- public long getDelta()
- {
- return 0L;
- }
-
- /**
- * Gets an estimate of the clock error in nan seconds.
- *
- * @return An estimate of the clock error in nan seconds.
- */
- public long getEpsilon()
- {
- return 0L;
- }
-
- /**
- * Gets the local clock time with any computed delta added in.
- *
- * @return The local clock time with any computed delta added in.
- */
- public long nanoTime()
- {
- return System.nanoTime();
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java
deleted file mode 100644
index 8ee8d82636..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-import org.apache.qpid.junit.extensions.ShutdownHookable;
-
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.nio.ByteBuffer;
-
-/**
- * UDPClockReference supplies a refernce clock signal (generated from System.nanoTime()).
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply a reference clock signal.
- * </table>
- *
- * @todo Port hard coded. Make configurable.
- *
- * @todo Errors rethrown as runtimes, or silently terminate the service. Could add better error handling if needed.
- */
-public class UDPClockReference implements Runnable, ShutdownHookable
-{
- /** Used for debugging. */
- // private static final Logger log = Logger.getLogger(UDPClockReference.class);
-
- /** Defines the timeout to use when polling the socket for time requests. */
- private static final int TIMEOUT = 200;
-
- /** Defines the port to run the clock reference on. */
- public static final int REFERENCE_PORT = 4444;
-
- /** Holds the socket to receive clock reference requests on. */
- protected DatagramSocket socket = null;
-
- /** Flag used to indicate that the time server should keep running. Set to false to terminate. */
- protected boolean publish = true;
-
- /**
- * Creates a clock reference service on the standard port.
- */
- public UDPClockReference()
- {
- try
- {
- socket = new DatagramSocket(REFERENCE_PORT);
- socket.setSoTimeout(TIMEOUT);
- }
- catch (SocketException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Implements the run loop for this reference time server. This waits for incoming time requests, and replies to
- * any, with a message with the local time stamp in it. Periodically (controlled by {@link #TIMEOUT}), the run
- * loop will check if the {@link #publish} flag has been cleared, and terminate the reference time service if so.
- */
- public void run()
- {
- byte[] buf = new byte[256];
- ByteBuffer bbuf = ByteBuffer.wrap(buf);
-
- while (publish)
- {
- try
- {
- // Wait for a reference time request.
- DatagramPacket packet = new DatagramPacket(buf, buf.length);
- boolean timedOut = false;
-
- try
- {
- socket.receive(packet);
- }
- catch (SocketTimeoutException e)
- {
- timedOut = true;
- }
-
- if (!timedOut)
- {
- // Work out from the received packet, where to reply to.
- InetAddress address = packet.getAddress();
- int port = packet.getPort();
-
- // Respond to the time request by sending back the local clock as the reference time.
- bbuf.putLong(System.nanoTime());
- bbuf.flip();
- packet = new DatagramPacket(bbuf.array(), bbuf.capacity(), address, port);
-
- socket.send(packet);
- }
- }
- catch (IOException e)
- {
- publish = false;
- }
- }
-
- socket.close();
- }
-
- /**
- * Supplies a shutdown hook.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- publish = false;
- }
- });
- }
-
- /**
- * For testing purposes. Runs a reference clock on the default port.
- *
- * @param args None.
- */
- public static void main(String[] args)
- {
- try
- {
- // Create the clock reference service.
- UDPClockReference clock = new UDPClockReference();
-
- // Set up a shutdown hook for it.
- Runtime.getRuntime().addShutdownHook(clock.getShutdownHook());
-
- // Start the service.
- clock.run();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- System.exit(1);
- }
- }
-}
-
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java
deleted file mode 100644
index 226c84611d..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.clocksynch;
-
-import org.apache.qpid.junit.extensions.util.CommandLineParser;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.SocketException;
-import java.net.SocketTimeoutException;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-
-/**
- * UDPClockSynchronizer is a {@link ClockSynchronizer} that sends pings as UDP datagrams, and uses the following simple
- * algorithm to perform clock synchronization:
- *
- * <ol>
- * <li>Slave initiates synchronization with a Reference clock.</li>
- * <li>Slave stamps current local time on a "time request" message and sends to the Reference.</li>
- * <li>Upon receipt by Reference, Reference stamps Reference-time and returns.</li>
- * <li>Upon receipt by Slave, Slave subtracts current time from sent time and divides by two to compute latency. It
- * subtracts current time from Reference time to determine Slave-Reference time delta and adds in the
- * half-latency to get the correct clock delta.</li>
- * <li>The first result is immediately used to update the clock since it will get the local clock into at least
- * the right ballpark.</li>
- * <li>The Slave repeats steps 2 through 4, 15 more times.</li>
- * <li>The results of the packet receipts are accumulated and sorted in lowest-latency to highest-latency order. The
- * median latency is determined by picking the mid-point sample from this ordered list.</li>
- * <li>All samples outside 1 standard-deviation from the median are discarded and the remaining samples
- * are averaged using an arithmetic mean.</li>
- * </ol>
- *
- * <p/>The use of UDP datagrams, instead of TCP based communication eliminates the hidden delays that TCP can introduce,
- * as it can transparently re-order or re-send packets, or introduce delays as packets are naggled.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Trigger a clock synchronziation.
- * <tr><td> Compute a clock delta to apply to the local clock.
- * <tr><td> Estimate the error in the synchronzation.
- * </table>
- */
-public class UDPClockSynchronizer implements ClockSynchronizer
-{
- /** Used for debugging. */
- // private static final Logger log = Logger.getLogger(UDPClockSynchronizer.class);
-
- /** Defines the timeout to use when waiting for responses to time requests. */
- private static final int TIMEOUT = 50;
-
- /** The clock delta. */
- private long delta = 0L;
-
- /** Holds an estimate of the clock error relative to the reference clock. */
- private long epsilon = 0L;
-
- /** Holds the address of the reference clock. */
- private InetAddress referenceAddress;
-
- /** Holds the socket to communicate with the reference service over. */
- private DatagramSocket socket;
-
- /** Used to control the shutdown in the main test loop. */
- private static boolean doSynch = true;
-
- /**
- * Creates a clock synchronizer against the specified address for the reference.
- *
- * @param address The address of the reference service.
- */
- public UDPClockSynchronizer(String address)
- {
- try
- {
- referenceAddress = InetAddress.getByName(address);
- }
- catch (UnknownHostException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * The slave side should call this to compute a clock delta with the reference.
- *
- * @throws ClockSynchFailureException If synchronization cannot be achieved, due to unavailability of the reference
- * time service.
- */
- public void synch() throws ClockSynchFailureException
- {
- try
- {
- socket = new DatagramSocket();
- socket.setSoTimeout(TIMEOUT);
-
- // Synchronize on a single ping, to get the clock into the right ball-park.
- synch(1);
-
- // Synchronize on 15 pings.
- synch(15);
-
- // And again, for greater accuracy, on 31.
- synch(31);
-
- socket.close();
- }
- catch (SocketException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Updates the synchronization delta by performing the specified number of reference clock requests.
- *
- * @param n The number of reference clock request cycles to perform.
- *
- * @throws ClockSynchFailureException If synchronization cannot be achieved, due to unavailability of the reference
- * time service.
- */
- protected void synch(int n) throws ClockSynchFailureException
- {
- // log.debug("protected void synch(int n = " + n + "): called");
-
- // Create an array of deltas by performing n reference pings.
- long[] delta = new long[n];
-
- for (int i = 0; i < n; i++)
- {
- delta[i] = ping();
- }
-
- // Reject any deltas that are larger than 1 s.d. above the median.
- long median = median(delta);
- long sd = standardDeviation(delta);
-
- // log.debug("median = " + median);
- // log.debug("sd = " + sd);
-
- long[] tempDeltas = new long[n];
- int count = 0;
-
- for (int i = 0; i < n; i++)
- {
- if ((delta[i] <= (median + sd)) && (delta[i] >= (median - sd)))
- {
- tempDeltas[count] = delta[i];
- count++;
- }
- else
- {
- // log.debug("Rejected: " + delta[i]);
- }
- }
-
- System.arraycopy(tempDeltas, 0, delta, 0, count);
-
- // Estimate the delta as the mean of the remaining deltas.
- this.delta += mean(delta);
-
- // Estimate the error as the standard deviation of the remaining deltas.
- this.epsilon = standardDeviation(delta);
-
- // log.debug("this.delta = " + this.delta);
- // log.debug("this.epsilon = " + this.epsilon);
- }
-
- /**
- * Performs a single reference clock request cycle and returns the estimated delta relative to the local clock.
- * This is computed as the half-latency of the requst cycle, plus the reference clock, minus the local clock.
- *
- * @return The estimated clock delta.
- *
- * @throws ClockSynchFailureException If the reference service is not responding.
- */
- protected long ping() throws ClockSynchFailureException
- {
- // log.debug("protected long ping(): called");
-
- try
- {
- byte[] buf = new byte[256];
-
- boolean timedOut = false;
- long start = 0L;
- long refTime = 0L;
- long localTime = 0L;
- long latency = 0L;
- int failCount = 0;
-
- // Keep trying the ping until it gets a response, or 10 tries in a row all time out.
- do
- {
- // Start timing the request latency.
- start = nanoTime();
-
- // Get the reference time.
- DatagramPacket packet =
- new DatagramPacket(buf, buf.length, referenceAddress, UDPClockReference.REFERENCE_PORT);
- socket.send(packet);
- packet = new DatagramPacket(buf, buf.length);
-
- timedOut = false;
-
- try
- {
- socket.receive(packet);
- }
- catch (SocketTimeoutException e)
- {
- timedOut = true;
- failCount++;
-
- continue;
- }
-
- ByteBuffer bbuf = ByteBuffer.wrap(packet.getData());
- refTime = bbuf.getLong();
-
- // Stop timing the request latency.
- localTime = nanoTime();
- latency = localTime - start;
-
- // log.debug("refTime = " + refTime);
- // log.debug("localTime = " + localTime);
- // log.debug("start = " + start);
- // log.debug("latency = " + latency);
- // log.debug("delta = " + ((latency / 2) + (refTime - localTime)));
-
- }
- while (timedOut && (failCount < 10));
-
- // Fail completely if the fail count is too high.
- if (failCount >= 10)
- {
- throw new ClockSynchFailureException("Clock reference not responding.", null);
- }
-
- // Estimate delta as (ref clock + half-latency) - local clock.
- return (latency / 2) + (refTime - localTime);
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Gets the clock delta in nano seconds.
- *
- * @return The clock delta in nano seconds.
- */
- public long getDelta()
- {
- return delta;
- }
-
- /**
- * Gets an estimate of the clock error in nan seconds.
- *
- * @return An estimate of the clock error in nan seconds.
- */
- public long getEpsilon()
- {
- return epsilon;
- }
-
- /**
- * Gets the local clock time with any computed delta added in.
- *
- * @return The local clock time with any computed delta added in.
- */
- public long nanoTime()
- {
- return System.nanoTime() + delta;
- }
-
- /**
- * Computes the median of a series of values.
- *
- * @param values The values.
- *
- * @return The median.
- */
- public static long median(long[] values)
- {
- // log.debug("public static long median(long[] values = " + Arrays.toString(values) + "): called");
-
- long median;
-
- // Order the list of values.
- long[] orderedValues = new long[values.length];
- System.arraycopy(values, 0, orderedValues, 0, values.length);
- Arrays.sort(orderedValues);
-
- // Check if the median is computed from a pair of middle value.
- if ((orderedValues.length % 2) == 0)
- {
- int middle = orderedValues.length / 2;
-
- median = (orderedValues[middle] + orderedValues[middle - 1]) / 2;
- }
- // The median is computed from a single middle value.
- else
- {
- median = orderedValues[orderedValues.length / 2];
- }
-
- // log.debug("median = " + median);
-
- return median;
- }
-
- /**
- * Computes the mean of a series of values.
- *
- * @param values The values.
- *
- * @return The mean.
- */
- public static long mean(long[] values)
- {
- // log.debug("public static long mean(long[] values = " + Arrays.toString(values) + "): called");
-
- long total = 0L;
-
- for (long value : values)
- {
- total += value;
- }
-
- long mean = total / values.length;
-
- // log.debug("mean = " + mean);
-
- return mean;
- }
-
- /**
- * Computes the variance of series of values.
- *
- * @param values The values.
- *
- * @return The variance of the values.
- */
- public static long variance(long[] values)
- {
- // log.debug("public static long variance(long[] values = " + Arrays.toString(values) + "): called");
-
- long mean = mean(values);
-
- long totalVariance = 0;
-
- for (long value : values)
- {
- long diff = (value - mean);
- totalVariance += diff * diff;
- }
-
- long variance = totalVariance / values.length;
-
- // log.debug("variance = " + variance);
-
- return variance;
- }
-
- /**
- * Computes the standard deviation of a series of values.
- *
- * @param values The values.
- *
- * @return The standard deviation.
- */
- public static long standardDeviation(long[] values)
- {
- // log.debug("public static long standardDeviation(long[] values = " + Arrays.toString(values) + "): called");
-
- long sd = Double.valueOf(Math.sqrt(variance(values))).longValue();
-
- // log.debug("sd = " + sd);
-
- return sd;
- }
-
- /**
- * For testing purposes. Supply address of reference clock as arg 1.
- *
- * @param args Address of reference clock as arg 1.
- */
- public static void main(String[] args)
- {
- ParsedProperties options =
- new ParsedProperties(CommandLineParser.processCommandLine(args,
- new CommandLineParser(
- new String[][]
- {
- { "1", "Address of clock reference service.", "address", "true" }
- }), System.getProperties()));
-
- String address = options.getProperty("1");
-
- // Create a clock synchronizer.
- UDPClockSynchronizer clockSyncher = new UDPClockSynchronizer(address);
-
- // Set up a shutdown hook for it.
- Runtime.getRuntime().addShutdownHook(new Thread(new Runnable()
- {
- public void run()
- {
- doSynch = false;
- }
- }));
-
- // Repeat the clock synching until the user kills the progam.
- while (doSynch)
- {
- // Perform a clock clockSynch.
- try
- {
- clockSyncher.synch();
-
- // Print out the clock delta and estimate of the error.
- System.out.println("Delta = " + clockSyncher.getDelta());
- System.out.println("Epsilon = " + clockSyncher.getEpsilon());
-
- try
- {
- Thread.sleep(250);
- }
- catch (InterruptedException e)
- {
- // Restore the interrupted status and terminate the loop.
- Thread.currentThread().interrupt();
- doSynch = false;
- }
- }
- // Terminate if the reference time service is unavailable.
- catch (ClockSynchFailureException e)
- {
- doSynch = false;
- }
- }
- }
-}
-
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java
deleted file mode 100644
index 6c950fc307..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedcircuit;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.TimingController;
-import org.apache.qpid.junit.extensions.TimingControllerAware;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.Publisher;
-import org.apache.qpid.test.framework.Receiver;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * DistributedCircuitImpl is a distributed implementation of the test {@link Circuit}. Many publishers and receivers
- * accross multiple machines may be combined to form a single test circuit. The test circuit extracts reports from
- * all of its publishers and receivers, and applies its assertions to these reports.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the publishing and receiving ends of a test messaging circuit.
- * <tr><td> Start the circuit running.
- * <tr><td> Close the circuit down.
- * <tr><td> Take a reading of the circuits state.
- * <tr><td> Apply assertions against the circuits state.
- * <tr><td> Send test messages over the circuit.
- * <tr><td> Perform the default test procedue on the circuit.
- * </table>
- *
- * @todo There is a short pause after receiving sender reports before asking for receiver reports, because receivers may
- * not have finished receiving all their test messages before the report request arrives. This is going to be a
- * problem for taking test timings and needs to be eliminiated. Suggested solution: have receiver send back reports
- * asynchronously, on test batch size boundaries, and do so automatically rather than having to have the report
- * request sent to them. Number each test run, or otherwise uniquely identify it, when a receiver does not get
- * any more messages on a test run for more than a timeout, it can assume the test is complete and send a final
- * report. On the coordinator end a future will need to be created to wait for all final reports to come in, and
- * to register results and timings for the test. This must work in such a way that a new test cycle can be started
- * without waiting for the results of the old one to come in.
- *
- * @todo Add in setting of timing controller, from timing aware test cases.
- */
-public class DistributedCircuitImpl implements Circuit, TimingControllerAware
-{
- /** Used for debugging purposes. */
- private static final Logger log = Logger.getLogger(DistributedCircuitImpl.class);
-
- /** Holds the conversation factory over which to coordinate the test. */
- protected ConversationFactory conversationFactory;
-
- /** Holds the controlSession over which to hold the control conversation. */
- protected Session controlSession;
-
- /** Holds the sender nodes in the test circuit. */
- protected List<TestClientDetails> senders;
-
- /** Holds the receiver nodes in the test circuit. */
- protected List<TestClientDetails> receivers;
-
- /** Holds the sender control conversations. */
- protected ConversationFactory.Conversation[] senderConversation;
-
- /** Holds the receiver control conversations. */
- protected ConversationFactory.Conversation[] receiverConversation;
-
- /** Holds the control topics for the senders in the test circuit. */
- protected Destination[] senderControlTopic;
-
- /** Holds the control topics for the receivers in the test circuit. */
- protected Destination[] receiverControlTopic;
-
- /** Holds the number of messages to send per test run. */
- protected int numMessages;
-
- /**
- * Holds the timing controller for the circuit. This is used to log test times asynchronously, when reciever nodes
- * return their reports after senders have completed a test case.
- */
- TimingController timingController;
-
- /**
- * Creates a distributed test circuit on the specified senders and receivers.
- *
- * @param session The controlSession for all control conversations.
- * @param senders The senders.
- * @param receivers The receivers.
- * @param senderConversation A control conversation with the senders.
- * @param receiverConversation A control conversation with the receivers.
- * @param senderControlTopic The senders control topic.
- * @param receiverControlTopic The receivers control topic.
- */
- protected DistributedCircuitImpl(Session session, List<TestClientDetails> senders, List<TestClientDetails> receivers,
- ConversationFactory.Conversation[] senderConversation, ConversationFactory.Conversation[] receiverConversation,
- Destination[] senderControlTopic, Destination[] receiverControlTopic)
- {
- this.controlSession = session;
- this.senders = senders;
- this.receivers = receivers;
- this.senderConversation = senderConversation;
- this.receiverConversation = receiverConversation;
- this.senderControlTopic = senderControlTopic;
- this.receiverControlTopic = receiverControlTopic;
- }
-
- /**
- * Creates a distributed test circuit from the specified test parameters, on the senders and receivers
- * given.
- *
- * @param testProps The test parameters.
- * @param senders The sender ends in the test circuit.
- * @param receivers The receiver ends in the test circuit.
- * @param conversationFactory A conversation factory for creating the control conversations with senders and receivers.
- *
- * @return A connected and ready to start, test circuit.
- */
- public static Circuit createCircuit(ParsedProperties testProps, List<TestClientDetails> senders,
- List<TestClientDetails> receivers, ConversationFactory conversationFactory)
- {
- log.debug("public static Circuit createCircuit(ParsedProperties testProps, List<TestClientDetails> senders, "
- + " List<TestClientDetails> receivers, ConversationFactory conversationFactory)");
-
- try
- {
- Session session = conversationFactory.getSession();
-
- // Create control conversations with each of the senders.
- ConversationFactory.Conversation[] senderConversation = new ConversationFactory.Conversation[senders.size()];
- Destination[] senderControlTopic = new Destination[senders.size()];
-
- for (int i = 0; i < senders.size(); i++)
- {
- TestClientDetails sender = senders.get(i);
-
- senderControlTopic[i] = session.createTopic(sender.privateControlKey);
- senderConversation[i] = conversationFactory.startConversation();
- }
-
- log.debug("Sender conversations created.");
-
- // Create control conversations with each of the receivers.
- ConversationFactory.Conversation[] receiverConversation = new ConversationFactory.Conversation[receivers.size()];
- Destination[] receiverControlTopic = new Destination[receivers.size()];
-
- for (int i = 0; i < receivers.size(); i++)
- {
- TestClientDetails receiver = receivers.get(i);
-
- receiverControlTopic[i] = session.createTopic(receiver.privateControlKey);
- receiverConversation[i] = conversationFactory.startConversation();
- }
-
- log.debug("Receiver conversations created.");
-
- // Assign the sender role to each of the sending test clients.
- for (int i = 0; i < senders.size(); i++)
- {
- TestClientDetails sender = senders.get(i);
-
- Message assignSender = conversationFactory.getSession().createMessage();
- TestUtils.setPropertiesOnMessage(assignSender, testProps);
- assignSender.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignSender.setStringProperty("ROLE", "SENDER");
-
- senderConversation[i].send(senderControlTopic[i], assignSender);
- }
-
- log.debug("Sender role assignments sent.");
-
- // Assign the receivers role to each of the receiving test clients.
- for (int i = 0; i < receivers.size(); i++)
- {
- TestClientDetails receiver = receivers.get(i);
-
- Message assignReceiver = session.createMessage();
- TestUtils.setPropertiesOnMessage(assignReceiver, testProps);
- assignReceiver.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignReceiver.setStringProperty("ROLE", "RECEIVER");
-
- receiverConversation[i].send(receiverControlTopic[i], assignReceiver);
- }
-
- log.debug("Receiver role assignments sent.");
-
- // Wait for the senders and receivers to confirm their roles.
- for (int i = 0; i < senders.size(); i++)
- {
- senderConversation[i].receive();
- }
-
- log.debug("Got all sender role confirmations");
-
- for (int i = 0; i < receivers.size(); i++)
- {
- receiverConversation[i].receive();
- }
-
- log.debug("Got all receiver role confirmations");
-
- // Package everything up as a circuit.
- return new DistributedCircuitImpl(session, senders, receivers, senderConversation, receiverConversation,
- senderControlTopic, receiverControlTopic);
- }
- catch (JMSException e)
- {
- throw new RuntimeException("JMSException not handled.");
- }
- }
-
- /**
- * Used by tests cases that can supply a {@link org.apache.qpid.junit.extensions.TimingController} to set the
- * controller on an aware test.
- *
- * @param controller The timing controller.
- */
- public void setTimingController(TimingController controller)
- {
- this.timingController = controller;
- }
-
- /**
- * Gets the interface on the publishing end of the circuit.
- *
- * @return The publishing end of the circuit.
- */
- public Publisher getPublisher()
- {
- throw new RuntimeException("Not Implemented.");
- }
-
- /**
- * Gets the interface on the receiving end of the circuit.
- *
- * @return The receiving end of the circuit.
- */
- public Receiver getReceiver()
- {
- throw new RuntimeException("Not Implemented.");
- }
-
- /**
- * Connects and starts the circuit. After this method is called the circuit is ready to send messages.
- */
- public void start()
- {
- log.debug("public void start(): called");
-
- try
- {
- // Start the test on each of the senders.
- Message start = controlSession.createMessage();
- start.setStringProperty("CONTROL_TYPE", "START");
- start.setIntProperty("MESSAGE_COUNT", numMessages);
-
- for (int i = 0; i < senders.size(); i++)
- {
- senderConversation[i].send(senderControlTopic[i], start);
- }
-
- log.debug("All senders told to start their tests.");
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Unhandled JMSException.", e);
- }
- }
-
- /**
- * Checks the test circuit. The effect of this is to gather the circuits state, for both ends of the circuit,
- * into a report, against which assertions may be checked.
- *
- * @todo Replace the asynch receiver report thread with a choice of direct or asynch executor, so that asynch
- * or synch logging of test timings is optional. Also need to provide an onMessage method that is capable
- * of receiving timing reports that receivers will generate during an ongoing test, on the test sample
- * size boundaries. The message timing logging code should be factored out as a common method that can
- * be called in response to the final report responses, or the onMessage method. Another alternative is
- * to abandon the final report request altogether and just use the onMessage method? I think the two
- * differ though, as the final report is used to apply assertions, and the ongoing report is just for
- * periodic timing results... In which case, maybe there needs to be a way for the onMessage method
- * to process just some of the incoming messages, and forward the rest on to the conversion helper, as
- * a sort of pre-conversation helper filter? Make conversation expose its onMessage method (it should
- * already) and allow another delivery thread to filter the incoming messages to the conversation.
- */
- public void check()
- {
- log.debug("public void check(): called");
-
- try
- {
- // Wait for all the test senders to return their reports.
- for (int i = 0; i < senders.size(); i++)
- {
- Message senderReport = senderConversation[i].receive();
- log.debug("Sender " + senderReport.getStringProperty("CLIENT_NAME") + " reports message count: "
- + senderReport.getIntProperty("MESSAGE_COUNT"));
- log.debug("Sender " + senderReport.getStringProperty("CLIENT_NAME") + " reports message time: "
- + senderReport.getLongProperty("TEST_TIME"));
- }
-
- log.debug("Got all sender test reports.");
-
- // Apply sender assertions to pass/fail the tests.
-
- // Inject a short pause to give the receivers time to finish receiving their test messages.
- TestUtils.pause(500);
-
- // Ask the receivers for their reports.
- Message statusRequest = controlSession.createMessage();
- statusRequest.setStringProperty("CONTROL_TYPE", "STATUS_REQUEST");
-
- for (int i = 0; i < receivers.size(); i++)
- {
- receiverConversation[i].send(receiverControlTopic[i], statusRequest);
- }
-
- log.debug("All receiver test reports requested.");
-
- // Wait for all receiver reports to come in, but do so asynchronously.
- Runnable gatherAllReceiverReports =
- new Runnable()
- {
- public void run()
- {
- try
- {
- // Wait for all the receivers to send their reports.
- for (int i = 0; i < receivers.size(); i++)
- {
- Message receiverReport = receiverConversation[i].receive();
-
- String clientName = receiverReport.getStringProperty("CLIENT_NAME");
- int messageCount = receiverReport.getIntProperty("MESSAGE_COUNT");
- long testTime = receiverReport.getLongProperty("TEST_TIME");
-
- log.debug("Receiver " + clientName + " reports message count: " + messageCount);
- log.debug("Receiver " + receiverReport.getStringProperty("CLIENT_NAME")
- + " reports message time: " + testTime);
-
- // Apply receiver assertions to pass/fail the tests.
-
- // Log the test timings on the asynchronous test timing controller.
- /*try
- {
- timingController.completeTest(true, messageCount, testTime);
- }
- // The timing controll can throw InterruptedException is the current test is to be
- // interrupted.
- catch (InterruptedException e)
- {
- e.printStackTrace();
- }*/
- }
-
- log.debug("All receiver test reports received.");
- }
- catch (JMSException e)
- {
- throw new RuntimeException(e);
- }
- }
- };
-
- Thread receiverReportsThread = new Thread(gatherAllReceiverReports);
- receiverReportsThread.start();
-
- // return new Message[] { senderReport, receiverReport };
-
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Unhandled JMSException.", e);
- }
- }
-
- /**
- * Closes the circuit. All associated resources are closed.
- */
- public void close()
- {
- log.debug("public void close(): called");
-
- // End the current test on all senders and receivers.
- }
-
- /**
- * Applies a list of assertions against the test circuit. The {@link #check()} method should be called before doing
- * this, to ensure that the circuit has gathered its state into a report to assert against.
- *
- * @param assertions The list of assertions to apply.
- *
- * @return Any assertions that failed.
- */
- public List<Assertion> applyAssertions(List<Assertion> assertions)
- {
- log.debug("public List<Assertion> applyAssertions(List<Assertion> assertions = " + assertions + "): called");
-
- List<Assertion> failures = new LinkedList<Assertion>();
-
- for (Assertion assertion : assertions)
- {
- if (!assertion.apply())
- {
- failures.add(assertion);
- }
- }
-
- return failures;
- }
-
- /**
- * Runs the default test procedure against the circuit, and checks that all of the specified assertions hold.
- *
- * @param numMessages The number of messages to send using the default test procedure.
- * @param assertions The list of assertions to apply.
- *
- * @return Any assertions that failed.
- *
- * @todo From check onwards needs to be handled as a future. The future must call back onto the test case to
- * report results asynchronously.
- */
- public List<Assertion> test(int numMessages, List<Assertion> assertions)
- {
- log.debug("public List<Assertion> test(int numMessages = " + numMessages + ", List<Assertion> assertions = "
- + assertions + "): called");
-
- // Keep the number of messages to send per test run, where the send method can reference it.
- this.numMessages = numMessages;
-
- // Start the test running on all sender circuit ends.
- start();
-
- // Request status reports to be handed in.
- check();
-
- // Assert conditions on the publishing end of the circuit.
- // Assert conditions on the receiving end of the circuit.
- List<Assertion> failures = applyAssertions(assertions);
-
- // Close the circuit ending the current test case.
- close();
-
- // Pass with no failed assertions or fail with a list of failed assertions.
- return failures;
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java
deleted file mode 100644
index 130e908b0e..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedcircuit;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Publisher;
-
-/**
- * DistributedPublisherImpl represents the status of the publishing side of a test circuit. Its main purpose is to
- * provide assertions that can be applied to verify the behaviour of a non-local publisher.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide assertion that the publishers received no exceptions.
- * <tr><td> Provide assertion that the publishers received a no consumers error code on every message.
- * <tr><td> Provide assertion that the publishers received a no route error code on every message.
- * </table>
- */
-public class DistributedPublisherImpl implements Publisher
-{
- /**
- * Provides an assertion that the publisher encountered no exceptions.
- *
- * @return An assertion that the publisher encountered no exceptions.
- * @param testProps
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the publisher got a no consumers exception on every message.
- *
- * @return An assertion that the publisher got a no consumers exception on every message.
- */
- public Assertion noConsumersAssertion()
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the publisher got a no rout exception on every message.
- *
- * @return An assertion that the publisher got a no rout exception on every message.
- */
- public Assertion noRouteAssertion()
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the publisher got a given exception during the test.
- *
- * @param testProps The test configuration properties.
- * @param exceptionClass The exception class to check for.
- * @return An assertion that the publisher got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass)
- {
- throw new RuntimeException("Not implemented.");
- }
-}
-
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java
deleted file mode 100644
index 4b801e7b66..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedcircuit;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Receiver;
-
-/**
- * DistributedReceiverImpl represents the status of the receiving side of a test circuit. Its main purpose is to
- * provide assertions that can be applied to verify the behaviour of a non-local receiver.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide assertion that the receivers received no exceptions.
- * <tr><td> Provide assertion that the receivers received all test messages sent to it.
- * </table>
- */
-public class DistributedReceiverImpl implements Receiver
-{
- /**
- * Provides an assertion that the receivers encountered no exceptions.
- *
- * @return An assertion that the receivers encountered no exceptions.
- * @param testProps
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the receivers got all messages that were sent to it.
- *
- * @return An assertion that the receivers got all messages that were sent to it.
- * @param testProps
- */
- public Assertion allMessagesReceivedAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the receivers got none of the messages that were sent to it.
- *
- * @return An assertion that the receivers got none of the messages that were sent to it.
- * @param testProps
- */
- public Assertion noMessagesReceivedAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Provides an assertion that the receiver got a given exception during the test.
- *
- * @param testProps
- *@param exceptionClass The exception class to check for. @return An assertion that the receiver got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass)
- {
- throw new RuntimeException("Not implemented.");
- }
-}
-
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java
deleted file mode 100644
index 09bcf24da5..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedcircuit;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-import org.apache.qpid.test.framework.CircuitEnd;
-import org.apache.qpid.test.framework.ExceptionMonitor;
-import org.apache.qpid.test.framework.LocalCircuitFactory;
-import org.apache.qpid.test.framework.MessageMonitor;
-import org.apache.qpid.test.framework.MessagingTestConfigProperties;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest;
-
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * A TestClientCircuitEnd is a {@link CircuitEnd} that may be controlled from a
- * {@link org.apache.qpid.test.framework.distributedtesting.TestClient}, and that forms a single publishing or
- * receiving end point in a distributed test {@link org.apache.qpid.test.framework.Circuit}.
- *
- * <p/>When operating in the SENDER role, this circuit end is capable of acting as part of the default circuit test
- * procedure (described in the class comment for {@link org.apache.qpid.test.framework.Circuit}). That is, it will
- * send the number of test messages required, using the test configuration parameters given in the test invite, and
- * return a report on its activities to the circuit controller.
- *
- * <p/>When operation in the RECEIVER role, this circuit end acts as part of the default circuit test procedure. It will
- * receive test messages, on the setup specified in the test configuration parameters, and keep count of the messages
- * received, and time taken to receive them. When requested by the circuit controller to provide a report, it will
- * return this report of its activities.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a message producer for sending messages.
- * <td> {@link CircuitEnd}, {@link LocalCircuitFactory}, {@link TestUtils}
- * <tr><td> Provide a message consumer for receiving messages.
- * <td> {@link CircuitEnd}, {@link LocalCircuitFactory}, {@link TestUtils}
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters. <td> {@link MessagingTestConfigProperties}
- * <tr><td> Adapt to assigned roles. <td> {@link TestClientControlledTest.Roles}
- * <tr><td> Perform test case actions. <td> {@link MessageMonitor}
- * <tr><td> Generate test reports. <td> {@link MessageMonitor}
- * </table>
- */
-public class TestClientCircuitEnd implements CircuitEnd, TestClientControlledTest
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestClientCircuitEnd.class);
-
- /** Holds the test parameters. */
- ParsedProperties testProps;
-
- /** The number of test messages to send. */
- private int numMessages;
-
- /** The role to be played by the test. */
- private Roles role;
-
- /** The connection to send the test messages on. */
- private Connection connection;
-
- /** Holds the circuit end for this test. */
- CircuitEnd circuitEnd;
-
- /**
- * Holds a message monitor for this circuit end, either the monitor on the consumer when in RECEIVER more, or
- * a monitor updated on every message sent, when acting as a SENDER.
- */
- MessageMonitor messageMonitor;
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName()
- {
- return "DEFAULT_CIRCUIT_TEST";
- }
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException
- {
- log.debug("public boolean acceptInvite(Message inviteMessage): called");
-
- // Populate the test parameters from the invitation.
- testProps = TestContextProperties.getInstance(MessagingTestConfigProperties.defaults);
-
- for (Object key : testProps.keySet())
- {
- String propName = (String) key;
-
- // If the test parameters is overridden by the invitation, use it instead.
- String inviteValue = inviteMessage.getStringProperty(propName);
-
- if (inviteValue != null)
- {
- testProps.setProperty(propName, inviteValue);
- log.debug("Test invite supplied override to " + propName + " of " + inviteValue);
- }
-
- }
-
- // Accept the invitation.
- return true;
- }
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException
- {
- log.debug("public void assignRole(Roles role, Message assignRoleMessage): called");
-
- // Take note of the role to be played.
- this.role = role;
-
- // Extract and retain the test parameters.
- numMessages = 1; // assignRoleMessage.getIntProperty("NUM_MESSAGES");
-
- // Connect using the test parameters.
- connection = TestUtils.createConnection(testProps);
-
- // Create a circuit end that matches the assigned role and test parameters.
- LocalCircuitFactory circuitFactory = new LocalCircuitFactory();
-
- switch (role)
- {
- // Check if the sender role is being assigned, and set up a message producer if so.
- case SENDER:
-
- // Set up the publisher.
- circuitEnd = circuitFactory.createPublisherCircuitEnd(connection, testProps, 0L);
-
- // Create a custom message monitor that will be updated on every message sent.
- messageMonitor = new MessageMonitor();
-
- break;
-
- // Otherwise the receivers role is being assigned, so set this up to listen for messages.
- case RECEIVER:
-
- // Set up the receiver.
- circuitEnd = circuitFactory.createReceiverCircuitEnd(connection, testProps, 0L);
-
- // Use the message monitor from the consumer for stats.
- messageMonitor = getMessageMonitor();
-
- break;
- }
-
- // Reset all messaging stats for the report.
- messageMonitor.reset();
-
- connection.start();
- }
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- *
- * @todo Add round robin on destinations where multiple destinations being used.
- *
- * @todo Add rate limiting when rate limit specified on publishers.
- *
- * @todo Add Max pending message size protection. The receiver will have to send back some acks once in a while,
- * to notify the publisher that its messages are being consumed. This makes the safety valve harder to
- * implement than in the single VM case. For example, if the limit is 1000 messages, might want to get back
- * an ack every 500, to notify the publisher that it can keep sending. What about pub/sub tests? Will it be
- * necessary to wait for an ack from every receiver? This will have the effect of rate limiting to slow
- * consumers too.
- *
- * @todo Add commits on every commit batch size boundary.
- */
- public void start(int numMessages) throws JMSException
- {
- log.debug("public void start(): called");
-
- // If in the SENDER role, send the specified number of test messages to the circuit destinations.
- if (role.equals(Roles.SENDER))
- {
- Message testMessage = getSession().createMessage();
-
- for (int i = 0; i < numMessages; i++)
- {
- getProducer().send(testMessage);
-
- // Increment the message count and timings.
- messageMonitor.onMessage(testMessage);
- }
- }
- }
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException
- {
- Message report = session.createMessage();
- report.setStringProperty("CONTROL_TYPE", "REPORT");
-
- // Add the count of messages sent/received to the report.
- report.setIntProperty("MESSAGE_COUNT", messageMonitor.getNumMessage());
-
- // Add the time to send/receive messages to the report.
- report.setLongProperty("TEST_TIME", messageMonitor.getTime());
-
- // Add any exceptions detected to the report.
-
- return report;
- }
-
- /**
- * Gets the message producer at this circuit end point.
- *
- * @return The message producer at with this circuit end point.
- */
- public MessageProducer getProducer()
- {
- return circuitEnd.getProducer();
- }
-
- /**
- * Gets the message consumer at this circuit end point.
- *
- * @return The message consumer at this circuit end point.
- */
- public MessageConsumer getConsumer()
- {
- return circuitEnd.getConsumer();
- }
-
- /**
- * Send the specified message over the producer at this end point.
- *
- * @param message The message to send.
- *
- * @throws JMSException Any JMS exception occuring during the send is allowed to fall through.
- */
- public void send(Message message) throws JMSException
- {
- // Send the message on the circuit ends producer.
- circuitEnd.send(message);
- }
-
- /**
- * Gets the JMS Session associated with this circuit end point.
- *
- * @return The JMS Session associated with this circuit end point.
- */
- public Session getSession()
- {
- return circuitEnd.getSession();
- }
-
- /**
- * Closes the message producers and consumers and the sessions, associated with this circuit end point.
- *
- * @throws JMSException Any JMSExceptions occurring during the close are allowed to fall through.
- */
- public void close() throws JMSException
- {
- // Close the producer and consumer.
- circuitEnd.close();
- }
-
- /**
- * Returns the message monitor for reporting on received messages on this circuit end.
- *
- * @return The message monitor for this circuit end.
- */
- public MessageMonitor getMessageMonitor()
- {
- return circuitEnd.getMessageMonitor();
- }
-
- /**
- * Returns the exception monitor for reporting on exceptions received on this circuit end.
- *
- * @return The exception monitor for this circuit end.
- */
- public ExceptionMonitor getExceptionMonitor()
- {
- return circuitEnd.getExceptionMonitor();
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java
deleted file mode 100644
index e07b141cb5..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-import org.apache.log4j.Logger;
-import org.apache.log4j.NDC;
-
-import org.apache.qpid.junit.extensions.TKTestRunner;
-import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator;
-import org.apache.qpid.junit.extensions.util.CommandLineParser;
-import org.apache.qpid.junit.extensions.util.MathUtils;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-import org.apache.qpid.test.framework.MessagingTestConfigProperties;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.clocksynch.UDPClockReference;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.LinkedBlockingQueue;
-
-/**
- * <p/>Implements the coordinator client described in the interop testing specification
- * (http://cwiki.apache.org/confluence/display/qpid/Interop+Testing+Specification). This coordinator is built on
- * top of the JUnit testing framework.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Find out what test clients are available. <td> {@link ConversationFactory}
- * <tr><td> Decorate available tests to run on all available clients. <td> {@link DistributedTestDecorator}
- * <tr><td> Attach XML test result logger.
- * <tr><td> Terminate the interop testing framework.
- * </table>
- *
- * @todo Should accumulate failures over all tests, and return with success or fail code based on all results. May need
- * to write a special TestResult to do this properly. At the moment only the last one used will be tested for
- * errors, as the start method creates a fresh one for each test case run.
- */
-public class Coordinator extends TKTestRunner
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(Coordinator.class);
-
- /** Used for reporting to the console. */
- private static final Logger console = Logger.getLogger("CONSOLE");
-
- /** Defines the possible distributed test engines available to run coordinated test cases with. */
- public enum TestEngine
- {
- /** Specifies the interop test engine. This tests all available clients in pairs. */
- INTEROP,
-
- /** Specifies the fanout test engine. This sets up one publisher role, and many reciever roles. */
- FANOUT
- }
-
- /**
- * Holds the test context properties that provides the default test parameters, plus command line overrides.
- * This is initialized with the default test parameters, to which command line overrides may be applied.
- */
- protected static ParsedProperties testContextProperties =
- TestContextProperties.getInstance(MessagingTestConfigProperties.defaults);
-
- /** Holds the URL of the broker to coordinate the tests on. */
- protected String brokerUrl;
-
- /** Holds the virtual host to coordinate the tests on. If <tt>null</tt>, then the default virtual host is used. */
- protected String virtualHost;
-
- /** Holds the list of all clients that enlisted, when the compulsory invite was issued. */
- protected Set<TestClientDetails> enlistedClients = new HashSet<TestClientDetails>();
-
- /** Holds the conversation helper for the control conversation. */
- protected ConversationFactory conversationFactory;
-
- /** Holds the connection that the coordinating messages are sent over. */
- protected Connection connection;
-
- /** Holds the path of the directory to output test results too, if one is defined. */
- protected String reportDir;
-
- /** Holds the coordinating test engine type to run the tests through. */
- protected TestEngine engine;
-
- /** Flag that indicates that all test clients should be terminated upon completion of the test cases. */
- protected boolean terminate;
-
- /**
- * Creates an interop test coordinator on the specified broker and virtual host.
- *
- * @param repetitions The number of times to repeat the test, or test batch size.
- * @param duration The length of time to run the tests for. -1 means no duration has been set.
- * @param threads The concurrency levels to ramp up to.
- * @param delay A delay in milliseconds between test runs.
- * @param params The sets of 'size' parameters to pass to test.
- * @param testCaseName The name of the test case to run.
- * @param reportDir The directory to output the test results to.
- * @param runName The name of the test run; used to name the output file.
- * @param verbose Whether to print comments during test run.
- * @param brokerUrl The URL of the broker to connect to.
- * @param virtualHost The virtual host to run all tests on. Optional, may be <tt>null</tt>.
- * @param engine The distributed test engine type to run the tests with.
- * @param terminate <tt>true</tt> if test client nodes should be terminated at the end of the tests.
- * @param csv <tt>true</tt> if the CSV results listener should be attached.
- * @param xml <tt>true</tt> if the XML results listener should be attached.
- * @param decoratorFactories List of factories for user specified decorators.
- */
- public Coordinator(Integer repetitions, Long duration, int[] threads, int delay, int[] params, String testCaseName,
- String reportDir, String runName, boolean verbose, String brokerUrl, String virtualHost, TestEngine engine,
- boolean terminate, boolean csv, boolean xml, List<TestDecoratorFactory> decoratorFactories)
- {
- super(repetitions, duration, threads, delay, params, testCaseName, reportDir, runName, csv, xml, decoratorFactories);
-
- log.debug("public Coordinator(Integer repetitions = " + repetitions + " , Long duration = " + duration
- + ", int[] threads = " + Arrays.toString(threads) + ", int delay = " + delay + ", int[] params = "
- + Arrays.toString(params) + ", String testCaseName = " + testCaseName + ", String reportDir = " + reportDir
- + ", String runName = " + runName + ", boolean verbose = " + verbose + ", String brokerUrl = " + brokerUrl
- + ", String virtualHost =" + virtualHost + ", TestEngine engine = " + engine + ", boolean terminate = "
- + terminate + ", boolean csv = " + csv + ", boolean xml = " + xml + "): called");
-
- // Retain the connection parameters.
- this.brokerUrl = brokerUrl;
- this.virtualHost = virtualHost;
- this.reportDir = reportDir;
- this.engine = engine;
- this.terminate = terminate;
- }
-
- /**
- * The entry point for the interop test coordinator. This client accepts the following command line arguments:
- *
- * <p/><table>
- * <tr><td> -b <td> The broker URL. <td> Mandatory.
- * <tr><td> -h <td> The virtual host. <td> Optional.
- * <tr><td> -o <td> The directory to output test results to. <td> Optional.
- * <tr><td> -e <td> The type of test distribution engine to use. <td> Optional. One of: interop, fanout.
- * <tr><td> ... <td> Free arguments. The distributed test cases to run.
- * <td> Mandatory. At least one must be defined.
- * <tr><td> name=value <td> Trailing argument define name/value pairs. Added to the test contenxt properties.
- * <td> Optional.
- * </table>
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- NDC.push("coordinator");
- log.debug("public static void main(String[] args = " + Arrays.toString(args) + "): called");
- console.info("Qpid Distributed Test Coordinator.");
-
- // Override the default broker url to be localhost:5672.
- testContextProperties.setProperty(MessagingTestConfigProperties.BROKER_PROPNAME, "tcp://localhost:5672");
-
- try
- {
- // Use the command line parser to evaluate the command line with standard handling behaviour (print errors
- // and usage then exist if there are errors).
- // Any options and trailing name=value pairs are also injected into the test context properties object,
- // to override any defaults that may have been set up.
- ParsedProperties options =
- new ParsedProperties(CommandLineParser.processCommandLine(args,
- new CommandLineParser(
- new String[][]
- {
- { "b", "The broker URL.", "broker", "false" },
- { "h", "The virtual host to use.", "virtual host", "false" },
- { "o", "The name of the directory to output test timings to.", "dir", "false" },
- {
- "e", "The test execution engine to use. Default is interop.", "engine", "interop",
- "^interop$|^fanout$", "true"
- },
- { "t", "Terminate test clients on completion of tests.", null, "false" },
- { "-csv", "Output test results in CSV format.", null, "false" },
- { "-xml", "Output test results in XML format.", null, "false" },
- {
- "-trefaddr", "To specify an alternative to hostname for time singal reference.",
- "address", "false"
- },
- {
- "c", "The number of tests to run concurrently.", "num", "false",
- MathUtils.SEQUENCE_REGEXP
- },
- { "r", "The number of times to repeat each test.", "num", "false" },
- {
- "d", "The length of time to run the tests for.", "duration", "false",
- MathUtils.DURATION_REGEXP
- },
- {
- "f", "The maximum rate to call the tests at.", "frequency", "false",
- "^([1-9][0-9]*)/([1-9][0-9]*)$"
- },
- { "s", "The size parameter to run tests with.", "size", "false", MathUtils.SEQUENCE_REGEXP },
- { "v", "Verbose mode.", null, "false" },
- { "n", "A name for this test run, used to name the output file.", "name", "true" },
- {
- "X:decorators", "A list of additional test decorators to wrap the tests in.",
- "\"class.name[:class.name]*\"", "false"
- }
- }), testContextProperties));
-
- // Extract the command line options.
- String brokerUrl = options.getProperty("b");
- String virtualHost = options.getProperty("h");
- String reportDir = options.getProperty("o");
- reportDir = (reportDir == null) ? "." : reportDir;
- String testEngine = options.getProperty("e");
- TestEngine engine = "fanout".equals(testEngine) ? TestEngine.FANOUT : TestEngine.INTEROP;
- boolean terminate = options.getPropertyAsBoolean("t");
- boolean csvResults = options.getPropertyAsBoolean("-csv");
- boolean xmlResults = options.getPropertyAsBoolean("-xml");
- String threadsString = options.getProperty("c");
- Integer repetitions = options.getPropertyAsInteger("r");
- String durationString = options.getProperty("d");
- String paramsString = options.getProperty("s");
- boolean verbose = options.getPropertyAsBoolean("v");
- String testRunName = options.getProperty("n");
- String decorators = options.getProperty("X:decorators");
-
- int[] threads = (threadsString == null) ? null : MathUtils.parseSequence(threadsString);
- int[] params = (paramsString == null) ? null : MathUtils.parseSequence(paramsString);
- Long duration = (durationString == null) ? null : MathUtils.parseDuration(durationString);
-
- // If broker or virtual host settings were specified as command line options, override the defaults in the
- // test context properties with them.
-
- // Collection all of the test cases to be run.
- Collection<Class<? extends FrameworkBaseCase>> testCaseClasses =
- new ArrayList<Class<? extends FrameworkBaseCase>>();
-
- // Create a list of test decorator factories for use specified decorators to be applied.
- List<TestDecoratorFactory> decoratorFactories = parseDecorators(decorators);
-
- // Scan for available test cases using a classpath scanner.
- // ClasspathScanner.getMatches(DistributedTestCase.class, "^Test.*", true);
-
- // Hard code the test classes till the classpath scanner is fixed.
- // Collections.addAll(testCaseClasses, InteropTestCase1DummyRun.class, InteropTestCase2BasicP2P.class,
- // InteropTestCase3BasicPubSub.class);
-
- // Parse all of the free arguments as test cases to run.
- for (int i = 1; true; i++)
- {
- String nextFreeArg = options.getProperty(Integer.toString(i));
-
- // Terminate the loop once all free arguments have been consumed.
- if (nextFreeArg == null)
- {
- break;
- }
-
- try
- {
- Class nextClass = Class.forName(nextFreeArg);
-
- if (FrameworkBaseCase.class.isAssignableFrom(nextClass))
- {
- testCaseClasses.add(nextClass);
- console.info("Found distributed test case: " + nextFreeArg);
- }
- }
- catch (ClassNotFoundException e)
- {
- console.info("Unable to instantiate the test case: " + nextFreeArg + ".");
- }
- }
-
- // Check that some test classes were actually found.
- if (testCaseClasses.isEmpty())
- {
- throw new RuntimeException(
- "No test cases implementing FrameworkBaseCase were specified on the command line.");
- }
-
- // Extract the names of all the test classes, to pass to the start method.
- int i = 0;
- String[] testClassNames = new String[testCaseClasses.size()];
-
- for (Class testClass : testCaseClasses)
- {
- testClassNames[i++] = testClass.getName();
- }
-
- // Create a coordinator and begin its test procedure.
- Coordinator coordinator =
- new Coordinator(repetitions, duration, threads, 0, params, null, reportDir, testRunName, verbose, brokerUrl,
- virtualHost, engine, terminate, csvResults, xmlResults, decoratorFactories);
-
- TestResult testResult = coordinator.start(testClassNames);
-
- // Return different error codes, depending on whether or not there were test failures.
- if (testResult.failureCount() > 0)
- {
- System.exit(FAILURE_EXIT);
- }
- else
- {
- System.exit(SUCCESS_EXIT);
- }
- }
- catch (Exception e)
- {
- log.debug("Top level handler caught execption.", e);
- console.info(e.getMessage());
- e.printStackTrace();
- System.exit(EXCEPTION_EXIT);
- }
- }
-
- /**
- * Starts all of the test classes to be run by this coordinator.
- *
- * @param testClassNames An array of all the coordinating test case implementations.
- *
- * @return A JUnit TestResult to run the tests with.
- *
- * @throws Exception Any underlying exceptions are allowed to fall through, and fail the test process.
- */
- public TestResult start(String[] testClassNames) throws Exception
- {
- log.debug("public TestResult start(String[] testClassNames = " + Arrays.toString(testClassNames) + ": called");
-
- // Connect to the broker.
- connection = TestUtils.createConnection(TestContextProperties.getInstance());
- Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- Destination controlTopic = session.createTopic("iop.control");
- Destination responseQueue = session.createQueue("coordinator");
-
- conversationFactory = new ConversationFactory(connection, responseQueue, LinkedBlockingQueue.class);
- ConversationFactory.Conversation conversation = conversationFactory.startConversation();
-
- connection.start();
-
- // Broadcast the compulsory invitation to find out what clients are available to test.
- Message invite = session.createMessage();
- invite.setStringProperty("CONTROL_TYPE", "INVITE");
- invite.setJMSReplyTo(responseQueue);
-
- conversation.send(controlTopic, invite);
-
- // Wait for a short time, to give test clients an opportunity to reply to the invitation.
- Collection<Message> enlists = conversation.receiveAll(0, 500);
- enlistedClients = extractEnlists(enlists);
-
- for (TestClientDetails client : enlistedClients)
- {
- log.debug("Got enlisted test client: " + client);
- console.info("Test node " + client.clientName + " available.");
- }
-
- // Start the clock reference service running.
- UDPClockReference clockReference = new UDPClockReference();
- Thread clockRefThread = new Thread(clockReference);
- registerShutdownHook(clockReference);
- clockRefThread.start();
-
- // Broadcast to all clients to synchronize their clocks against the coordinators clock reference.
- Message clockSynchRequest = session.createMessage();
- clockSynchRequest.setStringProperty("CONTROL_TYPE", "CLOCK_SYNCH");
-
- String localAddress = InetAddress.getByName(InetAddress.getLocalHost().getHostName()).getHostAddress();
- clockSynchRequest.setStringProperty("ADDRESS", localAddress);
-
- conversation.send(controlTopic, clockSynchRequest);
-
- // Run the test in the suite using JUnit.
- TestResult result = null;
-
- for (String testClassName : testClassNames)
- {
- // Record the current test class, so that the test results can be output to a file incorporating this name.
- this.currentTestClassName = testClassName;
-
- result = super.start(new String[] { testClassName });
- }
-
- // At this point in time, all tests have completed. Broadcast the shutdown message, if the termination option
- // was set on the command line.
- if (terminate)
- {
- Message terminate = session.createMessage();
- terminate.setStringProperty("CONTROL_TYPE", "TERMINATE");
-
- conversation.send(controlTopic, terminate);
- }
-
- return result;
- }
-
- /**
- * For a collection of enlist messages, this method pulls out of the client details for the enlisting clients.
- *
- * @param enlists The enlist messages.
- *
- * @return A set of enlisting clients, extracted from the enlist messages.
- *
- * @throws JMSException Any underlying JMSException is allowed to fall through.
- */
- public static Set<TestClientDetails> extractEnlists(Collection<Message> enlists) throws JMSException
- {
- log.debug("public static Set<TestClientDetails> extractEnlists(Collection<Message> enlists = " + enlists
- + "): called");
-
- Set<TestClientDetails> enlistedClients = new HashSet<TestClientDetails>();
-
- // Retain the list of all available clients.
- for (Message enlist : enlists)
- {
- TestClientDetails clientDetails = new TestClientDetails();
- clientDetails.clientName = enlist.getStringProperty("CLIENT_NAME");
- clientDetails.privateControlKey = enlist.getStringProperty("CLIENT_PRIVATE_CONTROL_KEY");
-
- String replyType = enlist.getStringProperty("CONTROL_TYPE");
-
- if ("ENLIST".equals(replyType))
- {
- enlistedClients.add(clientDetails);
- }
- else if ("DECLINE".equals(replyType))
- {
- log.debug("Test client " + clientDetails.clientName + " declined the invite.");
- }
- else
- {
- log.warn("Got an unknown reply type, " + replyType + ", to the invite.");
- }
- }
-
- return enlistedClients;
- }
-
- /**
- * Runs a test or suite of tests, using the super class implemenation. This method wraps the test to be run
- * in any test decorators needed to add in the coordinators ability to invite test clients to participate in
- * tests.
- *
- * @param test The test to run.
- * @param wait Undocumented. Nothing in the JUnit javadocs to say what this is for.
- *
- * @return The results of the test run.
- */
- public TestResult doRun(Test test, boolean wait)
- {
- log.debug("public TestResult doRun(Test \"" + test + "\", boolean " + wait + "): called");
-
- // Wrap all tests in the test suite with WrappedSuiteTestDecorators. This is quite ugly and a bit baffling,
- // but the reason it is done is because the JUnit implementation of TestDecorator has some bugs in it.
- WrappedSuiteTestDecorator targetTest = null;
-
- if (test instanceof TestSuite)
- {
- log.debug("targetTest is a TestSuite");
-
- TestSuite suite = (TestSuite)test;
-
- int numTests = suite.countTestCases();
- log.debug("There are " + numTests + " in the suite.");
-
- for (int i = 0; i < numTests; i++)
- {
- Test nextTest = suite.testAt(i);
- log.debug("suite.testAt(" + i + ") = " + nextTest);
-
- if (nextTest instanceof FrameworkBaseCase)
- {
- log.debug("nextTest is a FrameworkBaseCase");
- }
- }
-
- targetTest = new WrappedSuiteTestDecorator(suite);
- log.debug("Wrapped with a WrappedSuiteTestDecorator.");
- }
-
- // Apply any optional user specified decorators.
- targetTest = applyOptionalUserDecorators(targetTest);
-
- // Wrap the tests in a suitable distributed test decorator, to perform the invite/test cycle.
- targetTest = newTestDecorator(targetTest, enlistedClients, conversationFactory, connection);
-
- // TestSuite suite = new TestSuite();
- // suite.addTest(targetTest);
-
- // Wrap the tests in a scaled test decorator to them them as a 'batch' in one thread.
- // targetTest = new ScaledTestDecorator(targetTest, new int[] { 1 });
-
- return super.doRun(targetTest, wait);
- }
-
- /**
- * Creates a wrapped test decorator, that is capable of inviting enlisted clients to participate in a specified
- * test. This is the test engine that sets up the roles and sequences a distributed test case.
- *
- * @param targetTest The test decorator to wrap.
- * @param enlistedClients The enlisted clients available to run the test.
- * @param conversationFactory The conversation factory used to build conversation helper over the specified connection.
- * @param connection The connection to talk to the enlisted clients over.
- *
- * @return An invititing test decorator, that invites all the enlisted clients to participate in tests, in pairs.
- */
- protected DistributedTestDecorator newTestDecorator(WrappedSuiteTestDecorator targetTest,
- Set<TestClientDetails> enlistedClients, ConversationFactory conversationFactory, Connection connection)
- {
- switch (engine)
- {
- case FANOUT:
- return new FanOutTestDecorator(targetTest, enlistedClients, conversationFactory, connection);
- case INTEROP:
- default:
- return new InteropTestDecorator(targetTest, enlistedClients, conversationFactory, connection);
- }
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java
deleted file mode 100644
index 49a01d3127..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import junit.framework.TestResult;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator;
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * DistributedTestDecorator is a base class for writing test decorators that invite test clients to participate in
- * distributed test cases. It provides a helper method, {@link #signupClients}, that broadcasts an invitation and
- * returns the set of test clients that are available to particiapte in the test.
- *
- * <p/>When used to wrap a {@link FrameworkBaseCase} test, it replaces the default {@link CircuitFactory} implementations
- * with a suitable circuit factory for distributed tests. Concrete implementations can use this to configure the sending
- * and receiving roles on the test.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Broadcast test invitations and collect enlists. <td> {@link ConversationFactory}.
- * </table>
- */
-public abstract class DistributedTestDecorator extends WrappedSuiteTestDecorator
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(DistributedTestDecorator.class);
-
- /** Holds the contact information for all test clients that are available and that may take part in the test. */
- Set<TestClientDetails> allClients;
-
- /** Holds the conversation helper for the control level conversation for coordinating the test through. */
- ConversationFactory conversationFactory;
-
- /** Holds the connection that the control conversation is held over. */
- Connection connection;
-
- /** Holds the underlying test suite that this decorator wraps. */
- WrappedSuiteTestDecorator testSuite;
-
- /** Holds the control topic, on which test invitations are broadcast. */
- protected Destination controlTopic;
-
- /**
- * Creates a wrapped suite test decorator from another one.
- *
- * @param suite The test suite.
- * @param availableClients The list of all clients that responded to the compulsory invite.
- * @param controlConversation The conversation helper for the control level, test coordination conversation.
- * @param controlConnection The connection that the coordination messages are sent over.
- */
- public DistributedTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> availableClients,
- ConversationFactory controlConversation, Connection controlConnection)
- {
- super(suite);
-
- log.debug("public DistributedTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> allClients = "
- + availableClients + ", ConversationHelper controlConversation = " + controlConversation + "): called");
-
- testSuite = suite;
- allClients = availableClients;
- conversationFactory = controlConversation;
- connection = controlConnection;
-
- // Set up the test control topic.
- try
- {
- controlTopic = conversationFactory.getSession().createTopic("iop.control");
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Unable to create the coordinating control topic to broadcast test invites on.", e);
- }
- }
-
- /**
- * Should run all of the tests in the wrapped test suite.
- *
- * @param testResult The the results object to monitor the test results with.
- */
- public abstract void run(TestResult testResult);
-
- /**
- * Should provide the distributed test sequencer to pass to {@link org.apache.qpid.test.framework.FrameworkBaseCase}
- * tests.
- *
- * @return A distributed test sequencer.
- */
- public abstract CircuitFactory getTestSequencer();
-
- /**
- * Broadcasts an invitation to participate in a coordinating test case to find out what clients are available to
- * run the test case.
- *
- * @param coordTest The coordinating test case to broadcast an inviate for.
- *
- * @return A set of test clients that accepted the invitation.
- */
- protected Set<TestClientDetails> signupClients(FrameworkBaseCase coordTest)
- {
- // Broadcast the invitation to find out what clients are available to test.
- Set<TestClientDetails> enlists;
- try
- {
- Message invite = conversationFactory.getSession().createMessage();
-
- ConversationFactory.Conversation conversation = conversationFactory.startConversation();
-
- invite.setStringProperty("CONTROL_TYPE", "INVITE");
- invite.setStringProperty("TEST_NAME", coordTest.getTestCaseNameForTestMethod(coordTest.getName()));
-
- conversation.send(controlTopic, invite);
-
- // Wait for a short time, to give test clients an opportunity to reply to the invitation.
- Collection<Message> replies = conversation.receiveAll(allClients.size(), 500);
- enlists = Coordinator.extractEnlists(replies);
- }
- catch (JMSException e)
- {
- throw new RuntimeException("There was a JMSException during the invite/enlist conversation.", e);
- }
-
- return enlists;
- }
-
- /**
- * Prints a string summarizing this test decorator, mainly for debugging purposes.
- *
- * @return String representation for debugging purposes.
- */
- public String toString()
- {
- return "DistributedTestDecorator: [ testSuite = " + testSuite + " ]";
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java
deleted file mode 100644
index 809bb1dd2f..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator;
-import org.apache.qpid.test.framework.DropInTest;
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-import org.apache.qpid.test.framework.sequencers.FanOutCircuitFactory;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageListener;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * FanOutTestDecorator is an {@link DistributedTestDecorator} that runs one test client in the sender role, and the remainder
- * in the receivers role. It also has the capability to listen for new test cases joining the test beyond the initial start
- * point. This feature can be usefull when experimenting with adding more load, in the form of more test clients, to assess
- * its impact on a running test.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Execute coordinated test cases. <td> {@link FrameworkBaseCase}
- * <tr><td> Accept test clients joining a running test.
- * </table>
- */
-public class FanOutTestDecorator extends DistributedTestDecorator implements MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(FanOutTestDecorator.class);
-
- /** Holds the currently running test case. */
- private FrameworkBaseCase currentTest = null;
-
- /**
- * Creates a wrapped suite test decorator from another one.
- *
- * @param suite The test suite.
- * @param availableClients The list of all clients that responded to the compulsory invite.
- * @param controlConversation The conversation helper for the control level, test coordination conversation.
- * @param controlConnection The connection that the coordination messages are sent over.
- */
- public FanOutTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> availableClients,
- ConversationFactory controlConversation, Connection controlConnection)
- {
- super(suite, availableClients, controlConversation, controlConnection);
-
- log.debug("public DistributedTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> allClients = "
- + availableClients + ", ConversationHelper controlConversation = " + controlConversation + "): called");
-
- testSuite = suite;
- allClients = availableClients;
- conversationFactory = controlConversation;
- connection = controlConnection;
-
- // Sign available clients up to the test.
- for (Test test : getAllUnderlyingTests())
- {
- FrameworkBaseCase coordTest = (FrameworkBaseCase) test;
-
- // Get all of the clients able to participate in the test.
- Set<TestClientDetails> enlists = signupClients(coordTest);
-
- // Check that there were some clients available.
- if (enlists.size() == 0)
- {
- throw new RuntimeException("No clients to test with");
- }
-
- // Create a distributed test circuit factory for the test.
- CircuitFactory circuitFactory = getTestSequencer();
-
- // Set up the first client in the sender role, and the remainder in the receivers role.
- Iterator<TestClientDetails> clients = enlists.iterator();
- circuitFactory.setSender(clients.next());
-
- while (clients.hasNext())
- {
- // Set the sending and receiving client details on the test case.
- circuitFactory.setReceiver(clients.next());
- }
-
- // Pass down the connection to hold the coordinating conversation over.
- circuitFactory.setConversationFactory(conversationFactory);
-
- // If the current test case is a drop-in test, set it up as the currently running test for late joiners to
- // add in to. Otherwise the current test field is set to null, to indicate that late joiners are not allowed.
- currentTest = (coordTest instanceof DropInTest) ? coordTest : null;
-
- // Execute the test case.
- coordTest.setCircuitFactory(circuitFactory);
- }
- }
-
- /**
- * Broadcasts a test invitation and accepts enlists from participating clients. The wrapped test cases are run
- * with one test client in the sender role, and the remaining test clients in the receiving role.
- *
- * <p/>Any JMSExceptions during the invite/enlist conversation will be allowed to fall through as runtime
- * exceptions, resulting in the non-completion of the test run.
- *
- * @param testResult The the results object to monitor the test results with.
- *
- * @todo Better error recovery for failure of the invite/enlist conversation could be added.
- */
- public void run(TestResult testResult)
- {
- log.debug("public void run(TestResult testResult): called");
-
- // Listen for late joiners on the control topic.
- try
- {
- conversationFactory.getSession().createConsumer(controlTopic).setMessageListener(this);
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Unable to set up the message listener on the control topic.", e);
- }
-
- // Run all of the test cases in the test suite.
- /*for (Test test : getAllUnderlyingTests())
- {
- FrameworkBaseCase coordTest = (FrameworkBaseCase) test;
-
- // Get all of the clients able to participate in the test.
- Set<TestClientDetails> enlists = signupClients(coordTest);
-
- // Check that there were some clients available.
- if (enlists.size() == 0)
- {
- throw new RuntimeException("No clients to test with");
- }
-
- // Create a distributed test circuit factory for the test.
- CircuitFactory circuitFactory = getTestSequencer();
-
- // Set up the first client in the sender role, and the remainder in the receivers role.
- Iterator<TestClientDetails> clients = enlists.iterator();
- circuitFactory.setSender(clients.next());
-
- while (clients.hasNext())
- {
- // Set the sending and receiving client details on the test case.
- circuitFactory.setReceiver(clients.next());
- }
-
- // Pass down the connection to hold the coordinating conversation over.
- circuitFactory.setConversationFactory(conversationFactory);
-
- // If the current test case is a drop-in test, set it up as the currently running test for late joiners to
- // add in to. Otherwise the current test field is set to null, to indicate that late joiners are not allowed.
- currentTest = (coordTest instanceof DropInTest) ? coordTest : null;
-
- // Execute the test case.
- coordTest.setCircuitFactory(circuitFactory);
- }*/
-
- // Run all of the test cases in the test suite.
- for (Test test : getAllUnderlyingTests())
- {
- FrameworkBaseCase coordTest = (FrameworkBaseCase) test;
-
- coordTest.run(testResult);
-
- currentTest = null;
- }
- }
-
- /**
- * Should provide the distributed test sequencer to pass to {@link org.apache.qpid.test.framework.FrameworkBaseCase}
- * tests.
- *
- * @return A distributed test sequencer.
- */
- public CircuitFactory getTestSequencer()
- {
- return new FanOutCircuitFactory();
- }
-
- /**
- * Listens to incoming messages on the control topic. If the messages are 'join' messages, signalling a new
- * test client wishing to join the current test, then the new client will be added to the current test in the
- * receivers role.
- *
- * @param message The incoming control message.
- */
- public void onMessage(Message message)
- {
- try
- {
- // Check if the message is from a test client attempting to join a running test, and join it to the current
- // test case if so.
- if (message.getStringProperty("CONTROL_TYPE").equals("JOIN") && (currentTest != null))
- {
- ((DropInTest) currentTest).lateJoin(message);
- }
- }
- // There is not a lot can be done with this error, so it is deliberately ignored.
- catch (JMSException e)
- {
- log.debug("Unable to process message:" + message);
- }
- }
-
- /**
- * Prints a string summarizing this test decorator, mainly for debugging purposes.
- *
- * @return String representation for debugging purposes.
- */
- public String toString()
- {
- return "FanOutTestDecorator: [ testSuite = " + testSuite + " ]";
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java
deleted file mode 100644
index dd5007090b..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import junit.framework.Test;
-import junit.framework.TestResult;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator;
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-import org.apache.qpid.test.framework.sequencers.InteropCircuitFactory;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * DistributedTestDecorator is a test decorator, written to implement the interop test specification. Given a list
- * of enlisted test clients, that are available to run interop tests, this decorator invites them to participate
- * in each test in the wrapped test suite. Amongst all the clients that respond to the invite, all pairs are formed,
- * and each pairing (in both directions, but excluding the reflexive pairings) is split into a sender and receivers
- * role and a test case run between them. Any enlisted combinations that do not accept a test invite are automatically
- * failed.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Broadcast test invitations and collect enlists. <td> {@link org.apache.qpid.test.utils.ConversationFactory}.
- * <tr><td> Output test failures for clients unwilling to run the test case. <td> {@link Coordinator}
- * <tr><td> Execute distributed test cases. <td> {@link FrameworkBaseCase}
- * <tr><td> Fail non-participating pairings. <td> {@link OptOutTestCase}
- * </table>
- */
-public class InteropTestDecorator extends DistributedTestDecorator
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(InteropTestDecorator.class);
-
- /**
- * Creates a wrapped suite test decorator from another one.
- *
- * @param suite The test suite.
- * @param availableClients The list of all clients that responded to the compulsory invite.
- * @param controlConversation The conversation helper for the control level, test coordination conversation.
- * @param controlConnection The connection that the coordination messages are sent over.
- */
- public InteropTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> availableClients,
- ConversationFactory controlConversation, Connection controlConnection)
- {
- super(suite, availableClients, controlConversation, controlConnection);
- }
-
- /**
- * Broadcasts a test invitation and accetps enlisting from participating clients. The wrapped test case is
- * then repeated for every combination of test clients (provided the wrapped test case extends
- * {@link FrameworkBaseCase}.
- *
- * <p/>Any JMSExceptions during the invite/enlist conversation will be allowed to fall through as runtime exceptions,
- * resulting in the non-completion of the test run.
- *
- * @todo Better error recovery for failure of the invite/enlist conversation could be added.
- *
- * @param testResult The the results object to monitor the test results with.
- */
- public void run(TestResult testResult)
- {
- log.debug("public void run(TestResult testResult): called");
-
- Collection<Test> tests = testSuite.getAllUnderlyingTests();
-
- for (Test test : getAllUnderlyingTests())
- {
- FrameworkBaseCase coordTest = (FrameworkBaseCase) test;
-
- // Broadcast the invitation to find out what clients are available to test.
- Set<TestClientDetails> enlists = signupClients(coordTest);
-
- // Compare the list of willing clients to the list of all available.
- Set<TestClientDetails> optOuts = new HashSet<TestClientDetails>(allClients);
- optOuts.removeAll(enlists);
-
- // Output test failures for clients that will not particpate in the test.
- Set<List<TestClientDetails>> failPairs = allPairs(optOuts, allClients);
-
- for (List<TestClientDetails> failPair : failPairs)
- {
- // Create a distributed test circuit factory for the test.
- CircuitFactory circuitFactory = getTestSequencer();
-
- // Create an automatic failure test for the opted out test pair.
- FrameworkBaseCase failTest = new OptOutTestCase("testOptOut");
- circuitFactory.setSender(failPair.get(0));
- circuitFactory.setReceiver(failPair.get(1));
- failTest.setCircuitFactory(circuitFactory);
-
- failTest.run(testResult);
- }
-
- // Loop over all combinations of clients, willing to run the test.
- Set<List<TestClientDetails>> enlistedPairs = allPairs(enlists, enlists);
-
- for (List<TestClientDetails> enlistedPair : enlistedPairs)
- {
- // Create a distributed test circuit factory for the test.
- CircuitFactory circuitFactory = getTestSequencer();
-
- // Set the sending and receiving client details on the test circuitFactory.
- circuitFactory.setSender(enlistedPair.get(0));
- circuitFactory.setReceiver(enlistedPair.get(1));
-
- // Pass down the connection to hold the coordination conversation over.
- circuitFactory.setConversationFactory(conversationFactory);
-
- // Execute the test case.
- coordTest.setCircuitFactory(circuitFactory);
- coordTest.run(testResult);
- }
- }
- }
-
- /**
- * Should provide the distributed test sequencer to pass to {@link org.apache.qpid.test.framework.FrameworkBaseCase}
- * tests.
- *
- * @return A distributed test sequencer.
- */
- public CircuitFactory getTestSequencer()
- {
- return new InteropCircuitFactory();
- }
-
- /**
- * Produces all pairs of combinations of elements from two sets. The ordering of the elements in the pair is
- * important, that is the pair <l, r> is distinct from <r, l>; both pairs are generated. For any element, i, in
- * both the left and right sets, the reflexive pair <i, i> is not generated.
- *
- * @param left The left set.
- * @param right The right set.
- * @param <E> The type of the content of the pairs.
- *
- * @return All pairs formed from the permutations of all elements of the left and right sets.
- */
- private <E> Set<List<E>> allPairs(Set<E> left, Set<E> right)
- {
- log.debug("private <E> Set<List<E>> allPairs(Set<E> left = " + left + ", Set<E> right = " + right + "): called");
-
- Set<List<E>> results = new HashSet<List<E>>();
-
- // Form all pairs from left to right.
- // Form all pairs from right to left.
- for (E le : left)
- {
- for (E re : right)
- {
- if (!le.equals(re))
- {
- results.add(new Pair<E>(le, re));
- results.add(new Pair<E>(re, le));
- }
- }
- }
-
- log.debug("results = " + results);
-
- return results;
- }
-
- /**
- * A simple implementation of a pair, using a list.
- */
- private class Pair<T> extends ArrayList<T>
- {
- /**
- * Creates a new pair of elements.
- *
- * @param first The first element.
- * @param second The second element.
- */
- public Pair(T first, T second)
- {
- super();
- super.add(first);
- super.add(second);
- }
- }
-}
-
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java
deleted file mode 100644
index 229c6a34da..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import org.apache.qpid.test.framework.FrameworkBaseCase;
-import org.apache.qpid.test.framework.sequencers.CircuitFactory;
-
-/**
- * An OptOutTestCase is a test case that automatically fails. It is used when a list of test clients has been generated
- * from a compulsory invite, but only some of those clients have responded to a specific test case invite. The clients
- * that did not respond, may automatically be given a fail for some tests.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Fail the test with a suitable reason.
- * </table>
- */
-public class OptOutTestCase extends FrameworkBaseCase
-{
- /**
- * Creates a new coordinating test case with the specified name.
- *
- * @param name The test case name.
- */
- public OptOutTestCase(String name)
- {
- super(name);
- }
-
- /** Generates an appropriate test failure assertion. */
- public void testOptOut()
- {
- CircuitFactory circuitFactory = getCircuitFactory();
-
- fail("One of " + circuitFactory.getSender() + " and " + getCircuitFactory().getReceivers()
- + " opted out of the test.");
- }
-
- /**
- * Should provide a translation from the junit method name of a test to its test case name as defined in the
- * interop testing specification. For example the method "testP2P" might map onto the interop test case name
- * "TC2_BasicP2P".
- *
- * @param methodName The name of the JUnit test method.
- * @return The name of the corresponding interop test case.
- */
- public String getTestCaseNameForTestMethod(String methodName)
- {
- return "OptOutTest";
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java
deleted file mode 100644
index f9b8cbb898..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.NDC;
-
-import org.apache.qpid.junit.extensions.SleepThrottle;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.junit.extensions.util.TestContextProperties;
-import org.apache.qpid.test.framework.MessagingTestConfigProperties;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.clocksynch.ClockSynchThread;
-import org.apache.qpid.test.framework.clocksynch.UDPClockSynchronizer;
-import org.apache.qpid.test.utils.ReflectionUtils;
-import org.apache.qpid.test.utils.ReflectionUtilsException;
-
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-import javax.jms.Topic;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Implements a test client as described in the interop testing spec
- * (http://cwiki.apache.org/confluence/display/qpid/Interop+Testing+Specification). A test client is an agent that
- * reacts to control message sequences send by the test {@link Coordinator}.
- *
- * <p/><table><caption>Messages Handled by TestClient</caption>
- * <tr><th> Message <th> Action
- * <tr><td> Invite(compulsory) <td> Reply with Enlist.
- * <tr><td> Invite(test case) <td> Reply with Enlist if test case available.
- * <tr><td> AssignRole(test case) <td> Reply with Accept Role if matches an enlisted test. Keep test parameters.
- * <tr><td> Start <td> Send test messages defined by test parameters. Send report on messages sent.
- * <tr><td> Status Request <td> Send report on messages received.
- * <tr><td> Terminate <td> Terminate the test client.
- * <tr><td> ClockSynch <td> Synch clock against the supplied UDP address.
- * </table>
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Handle all incoming control messages. <td> {@link TestClientControlledTest}
- * <tr><td> Configure and look up test cases by name. <td> {@link TestClientControlledTest}
- * </table>
- */
-public class TestClient implements MessageListener
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(TestClient.class);
-
- /** Used for reporting to the console. */
- private static final Logger console = Logger.getLogger("CONSOLE");
-
- /** Holds the default identifying name of the test client. */
- public static final String CLIENT_NAME = "java";
-
- /**
- * Holds the test context properties that provides the default test parameters, plus command line overrides.
- * This is initialized with the default test parameters, to which command line overrides may be applied.
- */
- public static ParsedProperties testContextProperties =
- TestContextProperties.getInstance(MessagingTestConfigProperties.defaults);
-
- /** Holds all the test cases loaded from the classpath. */
- Map<String, TestClientControlledTest> testCases = new HashMap<String, TestClientControlledTest>();
-
- /** Holds the test case currently being run by this client. */
- protected TestClientControlledTest currentTestCase;
-
- /** Holds the connection to the broker that the test is being coordinated on. */
- protected Connection connection;
-
- /** Holds the message producer to hold the test coordination over. */
- protected MessageProducer producer;
-
- /** Holds the JMS controlSession for the test coordination. */
- protected Session session;
-
- /** Holds the name of this client, with a default value. */
- protected String clientName = CLIENT_NAME;
-
- /** This flag indicates that the test client should attempt to join the currently running test case on start up. */
- protected boolean join;
-
- /** Holds the clock synchronizer for the test node. */
- ClockSynchThread clockSynchThread;
-
- /**
- * Creates a new interop test client, listenting to the specified broker and virtual host, with the specified client
- * identifying name.
- *
- * @param pBrokerUrl The url of the broker to connect to.
- * @param pVirtualHost The virtual host to conect to.
- * @param clientName The client name to use.
- * @param join Flag to indicate that this client should attempt to join running tests.
- */
- public TestClient(String pBrokerUrl, String pVirtualHost, String clientName, boolean join)
- {
- log.debug("public TestClient(String pBrokerUrl = " + pBrokerUrl + ", String pVirtualHost = " + pVirtualHost
- + ", String clientName = " + clientName + ", boolean join = " + join + "): called");
-
- // Retain the connection parameters.
- this.clientName = clientName;
- this.join = join;
-
- // Save properies from command line to defaults
- if (pBrokerUrl != null)
- {
- testContextProperties.setProperty(MessagingTestConfigProperties.BROKER_PROPNAME, pBrokerUrl);
- }
- if (pVirtualHost != null)
- {
- testContextProperties.setProperty(MessagingTestConfigProperties.VIRTUAL_HOST_PROPNAME, pVirtualHost);
- }
- }
-
- /**
- * The entry point for the interop test coordinator. This client accepts the following command line arguments:
- *
- * <p/><table>
- * <tr><td> -b <td> The broker URL. <td> Optional.
- * <tr><td> -h <td> The virtual host. <td> Optional.
- * <tr><td> -n <td> The test client name. <td> Optional.
- * <tr><td> name=value <td> Trailing argument define name/value pairs. Added to system properties. <td> Optional.
- * </table>
- *
- * @param args The command line arguments.
- */
- public static void main(String[] args)
- {
- log.debug("public static void main(String[] args = " + Arrays.toString(args) + "): called");
- console.info("Qpid Distributed Test Client.");
-
- // Override the default broker url to be localhost:5672.
- testContextProperties.setProperty(MessagingTestConfigProperties.BROKER_PROPNAME, "tcp://localhost:5672");
-
- // Use the command line parser to evaluate the command line with standard handling behaviour (print errors
- // and usage then exist if there are errors).
- // Any options and trailing name=value pairs are also injected into the test context properties object,
- // to override any defaults that may have been set up.
- ParsedProperties options =
- new ParsedProperties(org.apache.qpid.junit.extensions.util.CommandLineParser.processCommandLine(args,
- new org.apache.qpid.junit.extensions.util.CommandLineParser(
- new String[][]
- {
- { "b", "The broker URL.", "broker", "false" },
- { "h", "The virtual host to use.", "virtual host", "false" },
- { "o", "The name of the directory to output test timings to.", "dir", "false" },
- { "n", "The name of the test client.", "name", "false" },
- { "j", "Join this test client to running test.", "false" }
- }), testContextProperties));
-
- // Extract the command line options.
- String brokerUrl = options.getProperty("b");
- String virtualHost = options.getProperty("h");
- String clientName = options.getProperty("n");
- clientName = (clientName == null) ? CLIENT_NAME : clientName;
- boolean join = options.getPropertyAsBoolean("j");
-
- // To distinguish logging output set up an NDC on the client name.
- NDC.push(clientName);
-
- // Create a test client and start it running.
- TestClient client = new TestClient(brokerUrl, virtualHost, clientName, join);
-
- // Use a class path scanner to find all the interop test case implementations.
- // Hard code the test classes till the classpath scanner is fixed.
- Collection<Class<? extends TestClientControlledTest>> testCaseClasses =
- new ArrayList<Class<? extends TestClientControlledTest>>();
- // ClasspathScanner.getMatches(TestClientControlledTest.class, "^TestCase.*", true);
- testCaseClasses.addAll(loadTestCases("org.apache.qpid.interop.clienttestcases.TestCase1DummyRun",
- "org.apache.qpid.interop.clienttestcases.TestCase2BasicP2P",
- "org.apache.qpid.interop.clienttestcases.TestCase3BasicPubSub",
- "org.apache.qpid.interop.clienttestcases.TestCase4P2PMessageSize",
- "org.apache.qpid.interop.clienttestcases.TestCase5PubSubMessageSize",
- "org.apache.qpid.test.framework.distributedcircuit.TestClientCircuitEnd"));
-
- try
- {
- client.start(testCaseClasses);
- }
- catch (Exception e)
- {
- log.error("The test client was unable to start.", e);
- console.info(e.getMessage());
- System.exit(1);
- }
- }
-
- /**
- * Parses a list of class names, and loads them if they are available on the class path.
- *
- * @param classNames The names of the classes to load.
- *
- * @return A list of the loaded test case classes.
- */
- public static List<Class<? extends TestClientControlledTest>> loadTestCases(String... classNames)
- {
- List<Class<? extends TestClientControlledTest>> testCases =
- new LinkedList<Class<? extends TestClientControlledTest>>();
-
- for (String className : classNames)
- {
- try
- {
- Class<?> cls = ReflectionUtils.forName(className);
- testCases.add((Class<? extends TestClientControlledTest>) cls);
- }
- catch (ReflectionUtilsException e)
- {
- // Ignore, class could not be found, so test not available.
- console.warn("Requested class " + className + " cannot be found, ignoring it.");
- }
- catch (ClassCastException e)
- {
- // Ignore, class was not of correct type to be a test case.
- console.warn("Requested class " + className + " is not an instance of TestClientControlledTest.");
- }
- }
-
- return testCases;
- }
-
- /**
- * Starts the interop test client running. This causes it to start listening for incoming test invites.
- *
- * @param testCaseClasses The classes of the available test cases. The test case names from these are used to
- * matchin incoming test invites against.
- *
- * @throws JMSException Any underlying JMSExceptions are allowed to fall through.
- */
- protected void start(Collection<Class<? extends TestClientControlledTest>> testCaseClasses) throws JMSException
- {
- log.debug("protected void start(Collection<Class<? extends TestClientControlledTest>> testCaseClasses = "
- + testCaseClasses + "): called");
-
- // Create all the test case implementations and index them by the test names.
- for (Class<? extends TestClientControlledTest> nextClass : testCaseClasses)
- {
- try
- {
- TestClientControlledTest testCase = nextClass.newInstance();
- testCases.put(testCase.getName(), testCase);
- }
- catch (InstantiationException e)
- {
- log.warn("Could not instantiate test case class: " + nextClass.getName(), e);
- // Ignored.
- }
- catch (IllegalAccessException e)
- {
- log.warn("Could not instantiate test case class due to illegal access: " + nextClass.getName(), e);
- // Ignored.
- }
- }
-
- // Open a connection to communicate with the coordinator on.
- connection = TestUtils.createConnection(testContextProperties);
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- // Set this up to listen for control messages.
- Topic privateControlTopic = session.createTopic("iop.control." + clientName);
- MessageConsumer consumer = session.createConsumer(privateControlTopic);
- consumer.setMessageListener(this);
-
- Topic controlTopic = session.createTopic("iop.control");
- MessageConsumer consumer2 = session.createConsumer(controlTopic);
- consumer2.setMessageListener(this);
-
- // Create a producer to send replies with.
- producer = session.createProducer(null);
-
- // If the join flag was set, then broadcast a join message to notify the coordinator that a new test client
- // is available to join the current test case, if it supports it. This message may be ignored, or it may result
- // in this test client receiving a test invite.
- if (join)
- {
- Message joinMessage = session.createMessage();
-
- joinMessage.setStringProperty("CONTROL_TYPE", "JOIN");
- joinMessage.setStringProperty("CLIENT_NAME", clientName);
- joinMessage.setStringProperty("CLIENT_PRIVATE_CONTROL_KEY", "iop.control." + clientName);
- producer.send(controlTopic, joinMessage);
- }
-
- // Start listening for incoming control messages.
- connection.start();
- }
-
- /**
- * Handles all incoming control messages.
- *
- * @param message The incoming message.
- */
- public void onMessage(Message message)
- {
- NDC.push(clientName);
- log.debug("public void onMessage(Message message = " + message + "): called");
-
- try
- {
- String controlType = message.getStringProperty("CONTROL_TYPE");
- String testName = message.getStringProperty("TEST_NAME");
-
- log.debug("Received control of type '" + controlType + "' for the test '" + testName + "'");
-
- // Check if the message is a test invite.
- if ("INVITE".equals(controlType))
- {
- // Flag used to indicate that an enlist should be sent. Only enlist to compulsory invites or invites
- // for which test cases exist.
- boolean enlist = false;
-
- if (testName != null)
- {
- log.debug("Got an invite to test: " + testName);
-
- // Check if the requested test case is available.
- TestClientControlledTest testCase = testCases.get(testName);
-
- if (testCase != null)
- {
- log.debug("Found implementing class for test '" + testName + "', enlisting for it.");
-
- // Check if the test case will accept the invitation.
- enlist = testCase.acceptInvite(message);
-
- log.debug("The test case "
- + (enlist ? " accepted the invite, enlisting for it."
- : " did not accept the invite, not enlisting."));
-
- // Make the requested test case the current test case.
- currentTestCase = testCase;
- }
- else
- {
- log.debug("Received an invite to the test '" + testName + "' but this test is not known.");
- }
- }
- else
- {
- log.debug("Got a compulsory invite, enlisting for it.");
-
- enlist = true;
- }
-
- if (enlist)
- {
- // Reply with the client name in an Enlist message.
- Message enlistMessage = session.createMessage();
- enlistMessage.setStringProperty("CONTROL_TYPE", "ENLIST");
- enlistMessage.setStringProperty("CLIENT_NAME", clientName);
- enlistMessage.setStringProperty("CLIENT_PRIVATE_CONTROL_KEY", "iop.control." + clientName);
- enlistMessage.setJMSCorrelationID(message.getJMSCorrelationID());
-
- log.debug("Sending enlist message '" + enlistMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo());
-
- producer.send(message.getJMSReplyTo(), enlistMessage);
- }
- else
- {
- // Reply with the client name in an Decline message.
- Message enlistMessage = session.createMessage();
- enlistMessage.setStringProperty("CONTROL_TYPE", "DECLINE");
- enlistMessage.setStringProperty("CLIENT_NAME", clientName);
- enlistMessage.setStringProperty("CLIENT_PRIVATE_CONTROL_KEY", "iop.control." + clientName);
- enlistMessage.setJMSCorrelationID(message.getJMSCorrelationID());
-
- log.debug("Sending decline message '" + enlistMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo());
-
- producer.send(message.getJMSReplyTo(), enlistMessage);
- }
- }
- else if ("ASSIGN_ROLE".equals(controlType))
- {
- // Assign the role to the current test case.
- String roleName = message.getStringProperty("ROLE");
-
- log.debug("Got a role assignment to role: " + roleName);
-
- TestClientControlledTest.Roles role = Enum.valueOf(TestClientControlledTest.Roles.class, roleName);
-
- currentTestCase.assignRole(role, message);
-
- // Reply by accepting the role in an Accept Role message.
- Message acceptRoleMessage = session.createMessage();
- acceptRoleMessage.setStringProperty("CLIENT_NAME", clientName);
- acceptRoleMessage.setStringProperty("CONTROL_TYPE", "ACCEPT_ROLE");
- acceptRoleMessage.setJMSCorrelationID(message.getJMSCorrelationID());
-
- log.debug("Sending accept role message '" + acceptRoleMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo());
-
- producer.send(message.getJMSReplyTo(), acceptRoleMessage);
- }
- else if ("START".equals(controlType) || "STATUS_REQUEST".equals(controlType))
- {
- if ("START".equals(controlType))
- {
- log.debug("Got a start notification.");
-
- // Extract the number of test messages to send from the start notification.
- int numMessages;
-
- try
- {
- numMessages = message.getIntProperty("MESSAGE_COUNT");
- }
- catch (NumberFormatException e)
- {
- // If the number of messages is not specified, use the default of one.
- numMessages = 1;
- }
-
- // Start the current test case.
- currentTestCase.start(numMessages);
- }
- else
- {
- log.debug("Got a status request.");
- }
-
- // Generate the report from the test case and reply with it as a Report message.
- Message reportMessage = currentTestCase.getReport(session);
- reportMessage.setStringProperty("CLIENT_NAME", clientName);
- reportMessage.setStringProperty("CONTROL_TYPE", "REPORT");
- reportMessage.setJMSCorrelationID(message.getJMSCorrelationID());
-
- log.debug("Sending report message '" + reportMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo());
-
- producer.send(message.getJMSReplyTo(), reportMessage);
- }
- else if ("TERMINATE".equals(controlType))
- {
- console.info("Received termination instruction from coordinator.");
-
- // Is a cleaner shutdown needed?
- connection.close();
- System.exit(0);
- }
- else if ("CLOCK_SYNCH".equals(controlType))
- {
- log.debug("Received clock synch command.");
- String address = message.getStringProperty("ADDRESS");
-
- log.debug("address = " + address);
-
- // Re-create (if necessary) and start the clock synch thread to synch the clock every ten seconds.
- if (clockSynchThread != null)
- {
- clockSynchThread.terminate();
- }
-
- SleepThrottle throttle = new SleepThrottle();
- throttle.setRate(0.1f);
-
- clockSynchThread = new ClockSynchThread(new UDPClockSynchronizer(address), throttle);
- clockSynchThread.start();
- }
- else
- {
- // Log a warning about this but otherwise ignore it.
- log.warn("Got an unknown control message, controlType = " + controlType + ", message = " + message);
- }
- }
- catch (JMSException e)
- {
- // Log a warning about this, but otherwise ignore it.
- log.warn("Got JMSException whilst handling message: " + message, e);
- }
- // Log any runtimes that fall through this message handler. These are fatal errors for the test client.
- catch (RuntimeException e)
- {
- log.error("The test client message handler got an unhandled exception: ", e);
- console.info("The message handler got an unhandled exception, terminating the test client.");
- System.exit(1);
- }
- finally
- {
- NDC.pop();
- }
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java
deleted file mode 100644
index 2e64c9ca2d..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.distributedtesting;
-
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-
-/**
- * TestClientControlledTest provides an interface that classes implementing test cases to run on a {@link TestClient}
- * node can use. Implementations must be Java beans, that is, to provide a default constructor and to implement the
- * {@link #getName} method.
- *
- * <p/>The methods specified in this interface are called when the {@link TestClient} receives control instructions to
- * apply to the test. There are control instructions to present the test case with the test invite, so that it may
- * choose whether or not to participate in the test, assign the test to play the sender or receiver role, start the
- * test and obtain the test status report.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Supply the name of the test case that this implements.
- * <tr><td> Accept/Reject invites based on test parameters.
- * <tr><td> Adapt to assigned roles.
- * <tr><td> Perform test case actions.
- * <tr><td> Generate test reports.
- * </table>
- */
-public interface TestClientControlledTest
-{
- /** Defines the possible test case roles that an interop test case can take on. */
- public enum Roles
- {
- /** Specifies the sender role. */
- SENDER,
-
- /** Specifies the receivers role. */
- RECEIVER
- }
-
- /**
- * Should provide the name of the test case that this class implements. The exact names are defined in the
- * interop testing spec.
- *
- * @return The name of the test case that this implements.
- */
- public String getName();
-
- /**
- * Determines whether the test invite that matched this test case is acceptable.
- *
- * @param inviteMessage The invitation to accept or reject.
- *
- * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public boolean acceptInvite(Message inviteMessage) throws JMSException;
-
- /**
- * Assigns the role to be played by this test case. The test parameters are fully specified in the
- * assignment message. When this method return the test case will be ready to execute.
- *
- * @param role The role to be played; sender or receivers.
- * @param assignRoleMessage The role assingment message, contains the full test parameters.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void assignRole(Roles role, Message assignRoleMessage) throws JMSException;
-
- /**
- * Performs the test case actions. Returning from here, indicates that the sending role has completed its test.
- *
- * @param numMessages The number of test messages to send.
- *
- * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through.
- */
- public void start(int numMessages) throws JMSException;
-
- /**
- * Gets a report on the actions performed by the test case in its assigned role.
- *
- * @param session The controlSession to create the report message in.
- *
- * @return The report message.
- *
- * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through.
- */
- public Message getReport(Session session) throws JMSException;
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java
deleted file mode 100644
index ad2c196adb..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.listeners;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.ShutdownHookable;
-import org.apache.qpid.junit.extensions.listeners.TKTestListener;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Listens for test results for a named test and outputs these in the standard JUnit XML format to the specified
- * writer.
- *
- * <p/>The API for this listener accepts notifications about different aspects of a tests results through different
- * methods, so some assumption needs to be made as to which test result a notification refers to. For example
- * {@link #startTest} will be called, then possibly {@link #timing} will be called, even though the test instance is
- * passed in both cases, it is not enough to distinguish a particular run of the test, as the test case instance may
- * be being shared between multiple threads, or being run a repeated number of times, and can therfore be re-used
- * between calls. The listeners make the assumption that, for every test, a unique thread will call {@link #startTest}
- * and {@link #endTest} to delimit each test. All calls to set test parameters, timings, state and so on, will occur
- * between the start and end and will be given with the same thread id as the start and end, so the thread id provides
- * a unqiue value to identify a particular test run against.
- *
- * <p><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Listen to test lifecycle notifications.
- * <tr><td> Listen to test errors and failures.
- * <tr><td> Listen to test timings.
- * <tr><td> Listen to test memory usages.
- * <tr><td> Listen to parameterized test parameters.
- * <tr><th> Responsibilities
- * </table>
- *
- * @todo Merge this class with CSV test listener, making the collection of results common to both, and only factoring
- * out the results printing code into sub-classes. Provide a simple XML results formatter with the same format as
- * the ant XML formatter, and a more structured one for outputing results with timings and summaries from
- * performance tests.
- */
-public class XMLTestListener implements TKTestListener, ShutdownHookable
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(XMLTestListener.class);
-
- /** The results file writer. */
- protected Writer writer;
-
- /** Holds the results for individual tests. */
- // protected Map<Result, Result> results = new LinkedHashMap<Result, Result>();
- // protected List<Result> results = new ArrayList<Result>();
-
- /**
- * Map for holding results on a per thread basis as they come in. A ThreadLocal is not used as sometimes an
- * explicit thread id must be used, where notifications come from different threads than the ones that called
- * the test method.
- */
- Map<Long, Result> threadLocalResults = Collections.synchronizedMap(new LinkedHashMap<Long, Result>());
-
- /**
- * Holds results for tests that have ended. Transferring these results here from the per-thread results map, means
- * that the thread id is freed for the thread to generate more results.
- */
- List<Result> results = new ArrayList<Result>();
-
- /** Holds the overall error count. */
- protected int errors = 0;
-
- /** Holds the overall failure count. */
- protected int failures = 0;
-
- /** Holds the overall tests run count. */
- protected int runs = 0;
-
- /** Holds the name of the class that tests are being run for. */
- String testClassName;
-
- /**
- * Creates a new XML results output listener that writes to the specified location.
- *
- * @param writer The location to write results to.
- * @param testClassName The name of the test class to include in the test results.
- */
- public XMLTestListener(Writer writer, String testClassName)
- {
- log.debug("public XMLTestListener(Writer writer, String testClassName = " + testClassName + "): called");
-
- this.writer = writer;
- this.testClassName = testClassName;
- }
-
- /**
- * Resets the test results to the default state of time zero, memory usage zero, parameter zero, test passed.
- *
- * @param test The test to resest any results for.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void reset(Test test, Long threadId)
- {
- log.debug("public void reset(Test test = " + test + ", Long threadId = " + threadId + "): called");
-
- XMLTestListener.Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
-
- r.error = null;
- r.failure = null;
-
- }
-
- /**
- * Notification that a test started.
- *
- * @param test The test that started.
- */
- public void startTest(Test test)
- {
- log.debug("public void startTest(Test test = " + test + "): called");
-
- Result newResult = new Result(test.getClass().getName(), ((TestCase) test).getName());
-
- // Initialize the thread local test results.
- threadLocalResults.put(Thread.currentThread().getId(), newResult);
- runs++;
- }
-
- /**
- * Should be called every time a test completes with the run time of that test.
- *
- * @param test The name of the test.
- * @param nanos The run time of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing(Test test, long nanos, Long threadId)
- { }
-
- /**
- * Optionally called every time a test completes with the second timing test.
- *
- * @param test The name of the test.
- * @param nanos The second timing information of the test in nanoseconds.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void timing2(Test test, Long nanos, Long threadId)
- { }
-
- /**
- * Should be called every time a test completed with the amount of memory used before and after the test was run.
- *
- * @param test The test which memory was measured for.
- * @param memStart The total JVM memory used before the test was run.
- * @param memEnd The total JVM memory used after the test was run.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void memoryUsed(Test test, long memStart, long memEnd, Long threadId)
- { }
-
- /**
- * Should be called every time a parameterized test completed with the int value of its test parameter.
- *
- * @param test The test which memory was measured for.
- * @param parameter The int parameter value.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void parameterValue(Test test, int parameter, Long threadId)
- { }
-
- /**
- * Should be called every time a test completes with the current number of test threads running.
- *
- * @param test The test for which the measurement is being generated.
- * @param threads The number of tests being run concurrently.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void concurrencyLevel(Test test, int threads, Long threadId)
- { }
-
- /**
- * Notifies listeners of the tests read/set properties.
- *
- * @param properties The tests read/set properties.
- */
- public void properties(Properties properties)
- { }
-
- /**
- * Notification that a test ended.
- *
- * @param test The test that ended.
- */
- public void endTest(Test test)
- {
- log.debug("public void endTest(Test test = " + test + "): called");
-
- // Move complete test results into the completed tests list.
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- results.add(r);
-
- // Clear all the test results for the thread.
- threadLocalResults.remove(Thread.currentThread().getId());
- }
-
- /**
- * Called when a test completes. Success, failure and errors. This method should be used when registering an
- * end test from a different thread than the one that started the test.
- *
- * @param test The test which completed.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void endTest(Test test, Long threadId)
- {
- log.debug("public void endTest(Test test = " + test + ", Long threadId = " + threadId + "): called");
-
- // Move complete test results into the completed tests list.
- Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
- results.add(r);
-
- // Clear all the test results for the thread.
- threadLocalResults.remove(Thread.currentThread().getId());
- }
-
- /**
- * An error occurred.
- *
- * @param test The test in which the error occurred.
- * @param t The throwable that resulted from the error.
- */
- public void addError(Test test, Throwable t)
- {
- log.debug("public void addError(Test test = " + test + ", Throwable t = " + t + "): called");
-
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- r.error = t;
- errors++;
- }
-
- /**
- * A failure occurred.
- *
- * @param test The test in which the failure occurred.
- * @param t The JUnit assertions that led to the failure.
- */
- public void addFailure(Test test, AssertionFailedError t)
- {
- log.debug("public void addFailure(Test test = " + test + ", AssertionFailedError t = " + t + "): called");
-
- Result r = threadLocalResults.get(Thread.currentThread().getId());
- r.failure = t;
- failures++;
- }
-
- /**
- * Called when a test completes to mark it as a test fail. This method should be used when registering a
- * failure from a different thread than the one that started the test.
- *
- * @param test The test which failed.
- * @param e The assertion that failed the test.
- * @param threadId Optional thread id if not calling from thread that started the test method. May be null.
- */
- public void addFailure(Test test, AssertionFailedError e, Long threadId)
- {
- log.debug("public void addFailure(Test test, AssertionFailedError e, Long threadId): called");
-
- Result r =
- (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId);
- r.failure = e;
- failures++;
- }
-
- /**
- * Notifies listeners of the start of a complete run of tests.
- */
- public void startBatch()
- {
- log.debug("public void startBatch(): called");
-
- // Reset all results counts.
- threadLocalResults = Collections.synchronizedMap(new HashMap<Long, Result>());
- errors = 0;
- failures = 0;
- runs = 0;
-
- // Write out the file header.
- try
- {
- writer.write("<?xml version=\"1.0\" ?>\n");
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write the test results.", e);
- }
- }
-
- /**
- * Notifies listeners of the end of a complete run of tests.
- *
- * @param parameters The optional test parameters to log out with the batch results.
- */
- public void endBatch(Properties parameters)
- {
- log.debug("public void endBatch(Properties parameters = " + parameters + "): called");
-
- // Write out the results.
- try
- {
- // writer.write("<?xml version=\"1.0\" ?>\n");
- writer.write("<testsuite errors=\"" + errors + "\" failures=\"" + failures + "\" tests=\"" + runs + "\" name=\""
- + testClassName + "\">\n");
-
- for (Result result : results)
- {
- writer.write(" <testcase classname=\"" + result.testClass + "\" name=\"" + result.testName + "\">\n");
-
- if (result.error != null)
- {
- writer.write(" <error type=\"" + result.error.getClass() + "\">");
- result.error.printStackTrace(new PrintWriter(writer));
- writer.write(" </error>");
- }
- else if (result.failure != null)
- {
- writer.write(" <failure type=\"" + result.failure.getClass() + "\">");
- result.failure.printStackTrace(new PrintWriter(writer));
- writer.write(" </failure>");
- }
-
- writer.write(" </testcase>\n");
- }
-
- writer.write("</testsuite>\n");
- writer.flush();
- }
- catch (IOException e)
- {
- throw new RuntimeException("Unable to write the test results.", e);
- }
- }
-
- /**
- * Supplies the shutdown hook.
- *
- * @return The shut down hook.
- */
- public Thread getShutdownHook()
- {
- return new Thread(new Runnable()
- {
- public void run()
- {
- log.debug("XMLTestListener::ShutdownHook: called");
- }
- });
- }
-
- /**
- * Used to capture the results of a particular test run.
- */
- protected static class Result
- {
- /** Holds the name of the test class. */
- public String testClass;
-
- /** Holds the name of the test method. */
- public String testName;
-
- /** Holds the exception that caused error in this test. */
- public Throwable error;
-
- /** Holds the assertion exception that caused failure in this test. */
- public AssertionFailedError failure;
-
- /**
- * Creates a placeholder for the results of a test.
- *
- * @param testClass The test class.
- * @param testName The name of the test that was run.
- */
- public Result(String testClass, String testName)
- {
- this.testClass = testClass;
- this.testName = testName;
- }
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java
deleted file mode 100644
index 6a0e8cba4b..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.localcircuit;
-
-import org.apache.qpid.client.AMQNoConsumersException;
-import org.apache.qpid.client.AMQNoRouteException;
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.AMQPPublisher;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.AssertionBase;
-import org.apache.qpid.test.framework.CircuitEndBase;
-import org.apache.qpid.test.framework.ExceptionMonitor;
-import org.apache.qpid.test.framework.MessageMonitor;
-
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * LocalAMQPPublisherImpl is an extension of {@link LocalPublisherImpl} that adds AMQP specific features. Specifically
- * extra assertions for AMQP features not available through generic JMS.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td>
- * </table>
- */
-public class LocalAMQPPublisherImpl extends LocalPublisherImpl implements AMQPPublisher
-{
- /**
- * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured
- * for messages and exceptions received by the circuit end.
- *
- * @param producer The message producer for the circuit end point.
- * @param consumer The message consumer for the circuit end point.
- * @param session The controlSession for the circuit end point.
- * @param messageMonitor The monitor to notify of all messages received by the circuit end.
- * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end.
- */
- public LocalAMQPPublisherImpl(MessageProducer producer, MessageConsumer consumer, Session session,
- MessageMonitor messageMonitor, ExceptionMonitor exceptionMonitor)
- {
- super(producer, consumer, session, messageMonitor, exceptionMonitor);
- }
-
- /**
- * Creates a circuit end point from the producer, consumer and controlSession in a circuit end base implementation.
- *
- * @param end The circuit end base implementation to take producers and consumers from.
- */
- public LocalAMQPPublisherImpl(CircuitEndBase end)
- {
- super(end);
- }
-
- /**
- * Provides an assertion that the publisher got a no consumers exception on every message.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the publisher got a no consumers exception on every message.
- */
- public Assertion noConsumersAssertion(ParsedProperties testProps)
- {
- return new AssertionBase()
- {
- public boolean apply()
- {
- boolean passed = true;
- ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor();
-
- if (!connectionExceptionMonitor.assertOneJMSExceptionWithLinkedCause(AMQNoConsumersException.class))
- {
- passed = false;
-
- addError("Was expecting linked exception type " + AMQNoConsumersException.class.getName()
- + " on the connection.\n");
- addError((connectionExceptionMonitor.size() > 0)
- ? ("Actually got the following exceptions on the connection, " + connectionExceptionMonitor)
- : "Got no exceptions on the connection.");
- }
-
- return passed;
- }
- };
- }
-
- /**
- * Provides an assertion that the publisher got a no rout exception on every message.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the publisher got a no rout exception on every message.
- */
- public Assertion noRouteAssertion(ParsedProperties testProps)
- {
- return new AssertionBase()
- {
- public boolean apply()
- {
- boolean passed = true;
- ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor();
-
- if (!connectionExceptionMonitor.assertOneJMSExceptionWithLinkedCause(AMQNoRouteException.class))
- {
- passed = false;
-
- addError("Was expecting linked exception type " + AMQNoRouteException.class.getName()
- + " on the connection.\n");
- addError((connectionExceptionMonitor.size() > 0)
- ? ("Actually got the following exceptions on the connection, " + connectionExceptionMonitor)
- : "Got no exceptions on the connection.");
- }
-
- return passed;
- }
- };
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java
deleted file mode 100644
index dc9ee0ac28..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.localcircuit;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.CircuitEnd;
-import org.apache.qpid.test.framework.ExceptionMonitor;
-import org.apache.qpid.test.framework.MessagingTestConfigProperties;
-import org.apache.qpid.test.framework.Publisher;
-import org.apache.qpid.test.framework.Receiver;
-import org.apache.qpid.test.framework.TestUtils;
-
-import javax.jms.Connection;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * LocalCircuitImpl provides an implementation of the test circuit. This is a local only circuit implementation that
- * supports a single producer/consumer on each end of the circuit, with both ends of the circuit on the same JVM.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Supply the publishing and receiving ends of a test messaging circuit.
- * <td> {@link LocalPublisherImpl}, {@link LocalReceiverImpl}
- * <tr><td> Start the circuit running.
- * <tr><td> Close the circuit down.
- * <tr><td> Take a reading of the circuits state.
- * <tr><td> Apply assertions against the circuits state. <td> {@link Assertion}
- * <tr><td> Send test messages over the circuit.
- * <tr><td> Perform the default test procedure on the circuit.
- * <tr><td> Provide access to connection and controlSession exception monitors. <td> {@link ExceptionMonitor}
- * </table>
- */
-public class LocalCircuitImpl implements Circuit
-{
- /** Used for debugging. */
- private static final Logger log = Logger.getLogger(LocalCircuitImpl.class);
-
- /** Holds the test configuration for the circuit. */
- private ParsedProperties testProps;
-
- /** Holds the publishing end of the circuit. */
- private LocalPublisherImpl publisher;
-
- /** Holds the receiving end of the circuit. */
- private LocalReceiverImpl receiver;
-
- /** Holds the connection for the publishing end of the circuit. */
- private Connection connection;
-
- /** Holds the exception listener for the connection on the publishing end of the circuit. */
- private ExceptionMonitor connectionExceptionMonitor;
-
- /** Holds the exception listener for the controlSession on the publishing end of the circuit. */
- private ExceptionMonitor exceptionMonitor;
-
- /**
- * Creates a test circuit using the specified test parameters. The publisher, receivers, connection and
- * connection monitor must already have been created, to assemble the circuit.
- *
- * @param testProps The test parameters.
- * @param publisher The test publisher.
- * @param receiver The test receivers.
- * @param connection The connection.
- * @param connectionExceptionMonitor The connection exception monitor.
- */
- public LocalCircuitImpl(ParsedProperties testProps, LocalPublisherImpl publisher, LocalReceiverImpl receiver,
- Connection connection, ExceptionMonitor connectionExceptionMonitor)
- {
- this.testProps = testProps;
- this.publisher = publisher;
- this.receiver = receiver;
- this.connection = connection;
- this.connectionExceptionMonitor = connectionExceptionMonitor;
- this.exceptionMonitor = new ExceptionMonitor();
-
- // Set this as the parent circuit on the publisher and receivers.
- publisher.setCircuit(this);
- receiver.setCircuit(this);
- }
-
- /**
- * Gets the interface on the publishing end of the circuit.
- *
- * @return The publishing end of the circuit.
- */
- public Publisher getPublisher()
- {
- return publisher;
- }
-
- /**
- * Gets the local publishing circuit end, for direct manipulation.
- *
- * @return The local publishing circuit end.
- */
- public CircuitEnd getLocalPublisherCircuitEnd()
- {
- return publisher;
- }
-
- /**
- * Gets the interface on the receiving end of the circuit.
- *
- * @return The receiving end of the circuit.
- */
- public Receiver getReceiver()
- {
- return receiver;
- }
-
- /**
- * Gets the local receiving circuit end, for direct manipulation.
- *
- * @return The local receiving circuit end.
- */
- public CircuitEnd getLocalReceiverCircuitEnd()
- {
- return receiver;
- }
-
- /**
- * Checks the test circuit. The effect of this is to gather the circuits state, for both ends of the circuit,
- * into a report, against which assertions may be checked.
- */
- public void check()
- { }
-
- /**
- * Applied a list of assertions against the test circuit. The {@link #check()} method should be called before doing
- * this, to ensure that the circuit has gathered its state into a report to assert against.
- *
- * @param assertions The list of assertions to apply.
- * @return Any assertions that failed.
- */
- public List<Assertion> applyAssertions(List<Assertion> assertions)
- {
- List<Assertion> failures = new LinkedList<Assertion>();
-
- for (Assertion assertion : assertions)
- {
- if (!assertion.apply())
- {
- failures.add(assertion);
- }
- }
-
- return failures;
- }
-
- /**
- * Connects and starts the circuit. After this method is called the circuit is ready to send messages.
- */
- public void start()
- { }
-
- /**
- * Closes the circuit. All associated resources are closed.
- */
- public void close()
- {
- try
- {
- publisher.close();
- receiver.close();
- connection.close();
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Got JMSException during close:" + e.getMessage(), e);
- }
- }
-
- /**
- * Sends a message on the test circuit. The exact nature of the message sent is controlled by the test parameters.
- */
- protected void send()
- {
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- boolean transactional = props.getPublisherTransacted();
- boolean rollback = props.getRollbackPublisher();
-
- // Send a message through the publisher and log any exceptions raised.
- try
- {
- CircuitEnd end = getLocalPublisherCircuitEnd();
-
- end.send(createTestMessage(end));
-
- if (rollback)
- {
- end.getSession().rollback();
- }
- else if (transactional)
- {
- end.getSession().commit();
- }
- }
- catch (JMSException e)
- {
- exceptionMonitor.onException(e);
- }
- }
-
- /**
- * Runs the default test procedure against the circuit, and checks that all of the specified assertions hold. The
- * outline of the default test procedure is:
- *
- * <p/><pre>
- * Start the circuit.
- * Send test messages.
- * Request a status report.
- * Assert conditions on the publishing end of the circuit.
- * Assert conditions on the receiving end of the circuit.
- * Close the circuit.
- * Pass with no failed assertions or fail with a list of failed assertions.
- * </pre>
- *
- * @param numMessages The number of messages to send using the default test procedure.
- * @param assertions The list of assertions to apply.
- * @return Any assertions that failed.
- */
- public List<Assertion> test(int numMessages, List<Assertion> assertions)
- {
- // Start the test circuit.
- start();
-
- // Send the requested number of test messages.
- for (int i = 0; i < numMessages; i++)
- {
- send();
- }
-
- // Inject a short pause to allow time for exceptions to come back asynchronously.
- TestUtils.pause(500L);
-
- // Request a status report.
- check();
-
- // Clean up the publisher/receivers/controlSession/connections.
- close();
-
- // Apply all of the requested assertions, keeping record of any that fail.
- List<Assertion> failures = applyAssertions(assertions);
-
- // Return any failed assertions to the caller.
- return failures;
- }
-
- /**
- * Creates a message with the properties defined as per the test parameters.
- *
- * @param client The circuit end to create the message on.
- *
- * @return The test message.
- *
- * @throws JMSException Any JMSException occurring during creation of the message is allowed to fall through.
- */
- private Message createTestMessage(CircuitEnd client) throws JMSException
- {
- // Cast the test properties into a typed interface for convenience.
- MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps);
-
- return TestUtils.createTestMessageOfSize(client.getSession(), props.getMessageSize());
- }
-
- /**
- * Gets the exception monitor for the publishing ends connection.
- *
- * @return The exception monitor for the publishing ends connection.
- */
- public ExceptionMonitor getConnectionExceptionMonitor()
- {
- return connectionExceptionMonitor;
- }
-
- /**
- * Gets the exception monitor for the publishing ends controlSession.
- *
- * @return The exception monitor for the publishing ends controlSession.
- */
- public ExceptionMonitor getExceptionMonitor()
- {
- return exceptionMonitor;
- }
-}
-
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java
deleted file mode 100644
index 9920be003a..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.localcircuit;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.AssertionBase;
-import org.apache.qpid.test.framework.CircuitEnd;
-import org.apache.qpid.test.framework.CircuitEndBase;
-import org.apache.qpid.test.framework.ExceptionMonitor;
-import org.apache.qpid.test.framework.MessageMonitor;
-import org.apache.qpid.test.framework.NotApplicableAssertion;
-import org.apache.qpid.test.framework.Publisher;
-
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * Provides an implementation of the {@link Publisher} interface and wraps a single message producer and consumer on
- * a single controlSession, as a {@link CircuitEnd}. A local publisher also acts as a circuit end, because for a locally
- * located circuit the assertions may be applied directly, there does not need to be any inter-process messaging
- * between the publisher and its single circuit end, in order to ascertain its status.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a message producer for sending messages.
- * <tr><td> Provide a message consumer for receiving messages.
- * <tr><td> Provide assertion that the publisher received no exceptions.
- * <tr><td> Provide assertion that the publisher received a no consumers error code.
- * <tr><td> Provide assertion that the publisher received a no route error code.
- * </table>
- */
-public class LocalPublisherImpl extends CircuitEndBase implements Publisher
-{
- /** Holds a reference to the containing circuit. */
- protected LocalCircuitImpl circuit;
-
- /**
- * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured
- * for messages and exceptions received by the circuit end.
- *
- * @param producer The message producer for the circuit end point.
- * @param consumer The message consumer for the circuit end point.
- * @param session The controlSession for the circuit end point.
- * @param messageMonitor The monitor to notify of all messages received by the circuit end.
- * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end.
- */
- public LocalPublisherImpl(MessageProducer producer, MessageConsumer consumer, Session session,
- MessageMonitor messageMonitor, ExceptionMonitor exceptionMonitor)
- {
- super(producer, consumer, session, messageMonitor, exceptionMonitor);
- }
-
- /**
- * Creates a circuit end point from the producer, consumer and controlSession in a circuit end base implementation.
- *
- * @param end The circuit end base implementation to take producers and consumers from.
- */
- public LocalPublisherImpl(CircuitEndBase end)
- {
- super(end.getProducer(), end.getConsumer(), end.getSession(), end.getMessageMonitor(), end.getExceptionMonitor());
- }
-
- /**
- * Provides an assertion that the publisher encountered no exceptions.
- *
- * @param testProps
- *
- * @return An assertion that the publisher encountered no exceptions.
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps)
- {
- return new AssertionBase()
- {
- public boolean apply()
- {
- boolean passed = true;
- ExceptionMonitor sessionExceptionMonitor = circuit.getExceptionMonitor();
- ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor();
-
- if (!connectionExceptionMonitor.assertNoExceptions())
- {
- passed = false;
-
- addError("Was expecting no exceptions.\n");
- addError("Got the following exceptions on the connection, "
- + circuit.getConnectionExceptionMonitor());
- }
-
- if (!sessionExceptionMonitor.assertNoExceptions())
- {
- passed = false;
-
- addError("Was expecting no exceptions.\n");
- addError("Got the following exceptions on the producer, " + circuit.getExceptionMonitor());
- }
-
- return passed;
- }
- };
- }
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Provides an assertion that the publisher got a given exception during the test.
- *
- * @param testProps The test configuration properties.
- * @param exceptionClass The exception class to check for.
- *
- * @return An assertion that the publisher got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, final Class<? extends Exception> exceptionClass)
- {
- return new AssertionBase()
- {
- public boolean apply()
- {
- boolean passed = true;
- ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor();
-
- if (!connectionExceptionMonitor.assertExceptionOfType(exceptionClass))
- {
- passed = false;
-
- addError("Was expecting linked exception type " + exceptionClass.getName()
- + " on the connection.\n");
- addError((connectionExceptionMonitor.size() > 0)
- ? ("Actually got the following exceptions on the connection, " + connectionExceptionMonitor)
- : "Got no exceptions on the connection.");
- }
-
- return passed;
- }
- };
- }
-
- /**
- * Sets the contianing circuit.
- *
- * @param circuit The containing circuit.
- */
- public void setCircuit(LocalCircuitImpl circuit)
- {
- this.circuit = circuit;
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java
deleted file mode 100644
index bb242faf90..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.localcircuit;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.CircuitEnd;
-import org.apache.qpid.test.framework.CircuitEndBase;
-import org.apache.qpid.test.framework.ExceptionMonitor;
-import org.apache.qpid.test.framework.MessageMonitor;
-import org.apache.qpid.test.framework.NotApplicableAssertion;
-import org.apache.qpid.test.framework.Receiver;
-
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-/**
- * Provides an implementation of the {@link Receiver} interface that wraps a single message producer and consumer on
- * a single controlSession, as a {@link CircuitEnd}. A local receiver also acts as a circuit end, because for a locally
- * located circuit the assertions may be applied directly, there does not need to be any inter process messaging
- * between the publisher and its single circuit end, in order to ascertain its status.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Provide a message producer for sending messages.
- * <tr><td> Provide a message consumer for receiving messages.
- * <tr><td> Provide assertion that the receivers received no exceptions.
- * <tr><td> Provide assertion that the receivers received all test messages sent to it.
- * </table>
- */
-public class LocalReceiverImpl extends CircuitEndBase implements Receiver
-{
- /** Holds a reference to the containing circuit. */
- private LocalCircuitImpl circuit;
-
- /**
- * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured
- * for messages and exceptions received by the circuit end.
- *
- * @param producer The message producer for the circuit end point.
- * @param consumer The message consumer for the circuit end point.
- * @param session The controlSession for the circuit end point.
- * @param messageMonitor The monitor to notify of all messages received by the circuit end.
- * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end.
- */
- public LocalReceiverImpl(MessageProducer producer, MessageConsumer consumer, Session session,
- MessageMonitor messageMonitor, ExceptionMonitor exceptionMonitor)
- {
- super(producer, consumer, session, messageMonitor, exceptionMonitor);
- }
-
- /**
- * Creates a circuit end point from the producer, consumer and controlSession in a circuit end base implementation.
- *
- * @param end The circuit end base implementation to take producers and consumers from.
- */
- public LocalReceiverImpl(CircuitEndBase end)
- {
- super(end.getProducer(), end.getConsumer(), end.getSession(), end.getMessageMonitor(), end.getExceptionMonitor());
- }
-
- /**
- * Provides an assertion that the receivers encountered no exceptions.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers encountered no exceptions.
- */
- public Assertion noExceptionsAssertion(ParsedProperties testProps)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Provides an assertion that the AMQP channel was forcibly closed by an error condition.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the AMQP channel was forcibly closed by an error condition.
- */
- public Assertion channelClosedAssertion(ParsedProperties testProps)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Provides an assertion that the receivers got all messages that were sent to it.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers got all messages that were sent to it.
- */
- public Assertion allMessagesReceivedAssertion(ParsedProperties testProps)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Provides an assertion that the receivers got none of the messages that were sent to it.
- *
- * @param testProps The test configuration properties.
- *
- * @return An assertion that the receivers got none of the messages that were sent to it.
- */
- public Assertion noMessagesReceivedAssertion(ParsedProperties testProps)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Provides an assertion that the receiver got a given exception during the test.
- *
- * @param testProps The test configuration properties.
- * @param exceptionClass The exception class to check for. @return An assertion that the receiver got a given exception during the test.
- */
- public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass)
- {
- return new NotApplicableAssertion(testProps);
- }
-
- /**
- * Sets the contianing circuit.
- *
- * @param circuit The containing circuit.
- */
- public void setCircuit(LocalCircuitImpl circuit)
- {
- this.circuit = circuit;
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/package.html b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/package.html
deleted file mode 100644
index ac4e30d312..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/package.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-
--->
-
-<html>
-<body>
-<p/>A framework for testing Qpid, built around a standard 'test circuit' design. The idea behind this framework is the
-use of a test circuit which is configured by a set of test parameters, that may be projected onto a topology of
-test nodes, with tests scripted to run over test circuits, making as few assumptions as possible about the underlying
-topology. The standardization of the design, whilst limiting in some respectes, allows a large variety of test
-scenarios to be written with minimal amounts of coding.
-
-<p/>The standard consruction block for a test, is a test circuit. This consists of a publisher, and a receiver. The
-publisher and receiver may reside on the same machine, or may be distributed. Will use a standard set of properties to
-define the desired circuit topology.
-
-<p/>Tests are always to be controlled from the publishing side only. The receiving end of the circuit is to be exposed
-to the test code through an interface, that abstracts as much as possible the receiving end of the test. The interface
-exposes a set of 'assertions' that may be applied to the receiving end of the test circuit.
-
-<p/>In the case where the receiving end of the circuit resides on the same JVM, the assertions will call the receivers
-code locally. Where the receiving end is distributed accross one or more machines, the assertions will be applied to a
-test report gethered from all of the receivers. Test code will be written to the assertions making as few assumptions
-as possible about the exact test topology.
-</body>
-</html>
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java
deleted file mode 100644
index bd27fc3d90..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.sequencers;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * BaseCircuitFactory provides some functionality common to all {@link CircuitFactory}s, such as the details of
- * all {@link org.apache.qpid.test.framework.distributedtesting.TestClient}s that make up the end-points of
- * the circuits that the factory creates, and an active {@link ConversationFactory} that can be used to generate
- * control conversations with those circuit end-points.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Hold the details of the sending and receiving end-points to create circuits from.
- * <tr><td> Provide a conversation factory to create control conversations with the end-points.
- * </table>
- */
-public abstract class BaseCircuitFactory implements CircuitFactory
-{
-
- /** Used for debugging. */
- private final Logger log = Logger.getLogger(BaseCircuitFactory.class);
-
- /** Holds the contact details for the sending test client. */
- protected TestClientDetails sender;
-
- /** Holds the contact details for the receving test client. */
- protected List<TestClientDetails> receivers = new LinkedList<TestClientDetails>();
-
- /** Holds the conversation factory over which to coordinate the test. */
- protected ConversationFactory conversationFactory;
-
- /**
- * Creates a test circuit for the test, configered by the test parameters specified.
- *
- * @param testProperties The test parameters.
- * @return A test circuit.
- */
- public Circuit createCircuit(Properties testProperties)
- {
- throw new RuntimeException("Not implemented.");
- }
-
- /**
- * Sets the sender test client to coordinate the test with.
- *
- * @param sender The contact details of the sending client in the test.
- */
- public void setSender(TestClientDetails sender)
- {
- log.debug("public void setSender(TestClientDetails sender = " + sender + "): called");
-
- this.sender = sender;
- }
-
- /**
- * Sets the receiving test client to coordinate the test with.
- *
- * @param receiver The contact details of the sending client in the test.
- */
- public void setReceiver(TestClientDetails receiver)
- {
- log.debug("public void setReceiver(TestClientDetails receivers = " + receiver + "): called");
-
- this.receivers.add(receiver);
- }
-
- /**
- * Supplies the sending test client.
- *
- * @return The sending test client.
- */
- public TestClientDetails getSender()
- {
- return sender;
- }
-
- /**
- * Supplies the receiving test client.
- *
- * @return The receiving test client.
- */
- public List<TestClientDetails> getReceivers()
- {
- return receivers;
- }
-
- /**
- * Accepts the conversation factory over which to hold the test coordinating conversation.
- *
- * @param conversationFactory The conversation factory to coordinate the test over.
- */
- public void setConversationFactory(ConversationFactory conversationFactory)
- {
- this.conversationFactory = conversationFactory;
- }
-
- /**
- * Provides the conversation factory for providing the distributed test sequencing conversations over the test
- * connection.
- *
- * @return The conversation factory to create test sequencing conversations with.
- */
- public ConversationFactory getConversationFactory()
- {
- return conversationFactory;
- }
-}
-
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java
deleted file mode 100644
index 9b5d40fd48..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.sequencers;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * A CircuitFactory is responsibile for creating test circuits appropriate to the context that a test case is
- * running in, and providing an implementation of a standard test procedure over a test circuit.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities
- * <tr><td> Provide a standard test procedure over a test circuit.
- * <tr><td> Construct test circuits appropriate to a tests context.
- * </table>
- */
-public interface CircuitFactory
-{
- /**
- * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles,
- * begining the test, gathering the test reports from the participants, and checking for assertion failures against
- * the test reports.
- *
- * @param testCircuit The test circuit.
- * @param assertions The list of assertions to apply to the test circuit.
- * @param testProperties The test case definition.
- *
- * @deprecated Use test circuits and Circuit.test instead.
- */
- public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties);
-
- /**
- * Creates a test circuit for the test, configered by the test parameters specified.
- *
- * @param testProperties The test parameters.
- *
- * @return A test circuit.
- */
- public Circuit createCircuit(Connection connection, ParsedProperties testProperties);
-
- /**
- * Sets the sender test client to coordinate the test with.
- *
- * @param sender The contact details of the sending client in the test.
- */
- public void setSender(TestClientDetails sender);
-
- /**
- * Sets the receiving test client to coordinate the test with.
- *
- * @param receiver The contact details of the sending client in the test.
- */
- public void setReceiver(TestClientDetails receiver);
-
- /**
- * Supplies the sending test client.
- *
- * @return The sending test client.
- */
- public TestClientDetails getSender();
-
- /**
- * Supplies the receiving test client.
- *
- * @return The receiving test client.
- */
- public List<TestClientDetails> getReceivers();
-
- /**
- * Accepts the conversation factory over which to hold the test coordinating conversation.
- *
- * @param conversationFactory The conversation factory to coordinate the test over.
- */
- public void setConversationFactory(ConversationFactory conversationFactory);
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java
deleted file mode 100644
index 833f5fb674..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.sequencers;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedcircuit.DistributedCircuitImpl;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * FanOutCircuitFactory is a circuit factory that creates distributed test circuits. Given a set of participating
- * test client nodes, it assigns one node to the SENDER role and the remainder to the RECEIVER role.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create distributed circuits from one to many test nodes, for fanout style testing.
- * </table>
- *
- * @todo Adapt this to be an n*m topology circuit factory. Need to add circuit topology definitions to the test
- * parameters. Place n senders onto the available test clients, and m receivers. Where n or m is larger than
- * the available nodes, start stacking multiple test clients on each node. There will also be an option that
- * indicates whether nodes can play both roles, and how many nodes out of all available may be assigned to
- * each role.
- *
- * @todo The createCircuit methods on this and InteropCircuitFactory are going to be identical. This is because the
- * partitioning into senders and receivers is already done by the test decorators. Either eliminate these factories
- * as unnesesary, or move the partitioning functionality into the factories, in which case the test decorators
- * can probably be merged or eliminated. There is confusion over the placement of responsibilities between the
- * factories and the test decorators... although the test decorators may well do more than just circuit creation
- * in the future. For example, there may have to be a special decorator for test repetition that does one circuit
- * creation, but the runs many tests over it, in which case the handling of responsibilities becomes clearer.
- */
-public class FanOutCircuitFactory extends BaseCircuitFactory
-{
- /** Used for debugging. */
- private Logger log = Logger.getLogger(FanOutCircuitFactory.class);
-
- /**
- * Creates a test circuit for the test, configered by the test parameters specified.
- *
- * @param testProperties The test parameters.
- * @return A test circuit.
- */
- public Circuit createCircuit(Connection connection, ParsedProperties testProperties)
- {
- log.debug("public Circuit createCircuit(ParsedProperties testProperties): called");
-
- List<TestClientDetails> senders = new LinkedList<TestClientDetails>();
- senders.add(getSender());
- List<TestClientDetails> receivers = getReceivers();
- ConversationFactory conversationFactory = getConversationFactory();
-
- return DistributedCircuitImpl.createCircuit(testProperties, senders, receivers, conversationFactory);
- }
-
- /**
- * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles,
- * begining the test, gathering the test reports from the participants, and checking for assertion failures against
- * the test reports.
- *
- * @param testCircuit The test circuit.
- * @param assertions The list of assertions to apply to the test circuit.
- * @param testProperties The test case definition.
- *
- * @deprecated Scheduled for removal once existing tests converted over to use test circuits.
- */
- public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties)
- {
- log.debug("protected Message[] sequenceTest(Object... testProperties = " + testProperties + "): called");
-
- TestClientDetails sender = getSender();
- List<TestClientDetails> receivers = getReceivers();
- ConversationFactory conversationFactory = getConversationFactory();
-
- try
- {
- // Create a conversation on the sender clients private control route.
- Session session = conversationFactory.getSession();
- Destination senderControlTopic = session.createTopic(sender.privateControlKey);
- ConversationFactory.Conversation senderConversation = conversationFactory.startConversation();
-
- // Assign the sender role to the sending test client.
- Message assignSender = conversationFactory.getSession().createMessage();
- TestUtils.setPropertiesOnMessage(assignSender, testProperties);
- assignSender.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignSender.setStringProperty("ROLE", "SENDER");
- assignSender.setStringProperty("CLIENT_NAME", "Sustained_SENDER");
-
- senderConversation.send(senderControlTopic, assignSender);
-
- // Wait for the sender to confirm its role.
- senderConversation.receive();
-
- // Assign the receivers roles.
- for (TestClientDetails receiver : receivers)
- {
- assignReceiverRole(receiver, testProperties, true);
- }
-
- // Start the test on the sender.
- Message start = session.createMessage();
- start.setStringProperty("CONTROL_TYPE", "START");
-
- senderConversation.send(senderControlTopic, start);
-
- // Wait for the test sender to return its report.
- Message senderReport = senderConversation.receive();
- TestUtils.pause(500);
-
- // Ask the receivers for their reports.
- Message statusRequest = session.createMessage();
- statusRequest.setStringProperty("CONTROL_TYPE", "STATUS_REQUEST");
-
- // Gather the reports from all of the receiving clients.
-
- // Return all of the test reports, the senders report first.
- // return new Message[] { senderReport };
- }
- catch (JMSException e)
- {
- throw new RuntimeException("Unhandled JMSException.");
- }
- }
-
- /**
- * Assigns the receivers role to the specified test client that is to act as a receivers during the test. This method
- * does not always wait for the receiving clients to confirm their role assignments. This is because this method
- * may be called from an 'onMessage' method, when a client is joining the test at a later point in time, and it
- * is not possible to do a synchronous receive during an 'onMessage' method. There is a flag to indicate whether
- * or not to wait for role confirmations.
- *
- * @param receiver The test client to assign the receivers role to.
- * @param testProperties The test parameters.
- * @param confirm Indicates whether role confirmation should be waited for.
- *
- * @throws JMSException Any JMSExceptions occurring during the conversation are allowed to fall through.
- *
- * @deprecated Scheduled for removal once existing tests converted over to use test circuits.
- */
- protected void assignReceiverRole(TestClientDetails receiver, Properties testProperties, boolean confirm)
- throws JMSException
- {
- log.info("assignReceiverRole(TestClientDetails receivers = " + receiver + ", Map<String, Object> testProperties = "
- + testProperties + "): called");
-
- ConversationFactory conversationFactory = getConversationFactory();
-
- // Create a conversation with the receiving test client.
- Session session = conversationFactory.getSession();
- Destination receiverControlTopic = session.createTopic(receiver.privateControlKey);
- ConversationFactory.Conversation receiverConversation = conversationFactory.startConversation();
-
- // Assign the receivers role to the receiving client.
- Message assignReceiver = session.createMessage();
- TestUtils.setPropertiesOnMessage(assignReceiver, testProperties);
- assignReceiver.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignReceiver.setStringProperty("ROLE", "RECEIVER");
- assignReceiver.setStringProperty("CLIENT_NAME", receiver.clientName);
-
- receiverConversation.send(receiverControlTopic, assignReceiver);
-
- // Wait for the role confirmation to come back.
- if (confirm)
- {
- receiverConversation.receive();
- }
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java
deleted file mode 100644
index a4c6888d68..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.framework.sequencers;
-
-import org.apache.log4j.Logger;
-
-import org.apache.qpid.junit.extensions.util.ParsedProperties;
-import org.apache.qpid.test.framework.Assertion;
-import org.apache.qpid.test.framework.Circuit;
-import org.apache.qpid.test.framework.TestClientDetails;
-import org.apache.qpid.test.framework.TestUtils;
-import org.apache.qpid.test.framework.distributedcircuit.DistributedCircuitImpl;
-import org.apache.qpid.test.utils.ConversationFactory;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.Session;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * InteropCircuitFactory is a circuit factory that creates distributed test circuits. Given a set of participating
- * test client nodes, it assigns one node to the SENDER role and one the RECEIVER role.
- *
- * <p/><table id="crc"><caption>CRC Card</caption>
- * <tr><th> Responsibilities <th> Collaborations
- * <tr><td> Create distributed circuits from pairs of test nodes, for interop style testing.
- * </table>
- *
- * @todo The partitioning of a set of nodes into sender and receiver roles is actually done by the interop test
- * decorator. See the todo comment in FanOutCircuitFactory about merging the factories with the decorators, or
- * more carefully dividing up responsibilities between them.
- *
- * @todo The squenceTest code is deprecated, but currently still used by the interop tests. It will be removed once it
- * have been fully replaced by the default test procedure.
- */
-public class InteropCircuitFactory extends BaseCircuitFactory
-{
- /** Used for debugging. */
- private Logger log = Logger.getLogger(InteropCircuitFactory.class);
-
- /**
- * Creates a test circuit for the test, configered by the test parameters specified.
- *
- * @param testProperties The test parameters.
- * @return A test circuit.
- */
- public Circuit createCircuit(Connection connection, ParsedProperties testProperties)
- {
- log.debug("public Circuit createCircuit(ParsedProperties testProperties): called");
-
- List<TestClientDetails> senders = new LinkedList<TestClientDetails>();
- senders.add(getSender());
- List<TestClientDetails> receivers = getReceivers();
- ConversationFactory conversationFactory = getConversationFactory();
-
- return DistributedCircuitImpl.createCircuit(testProperties, senders, receivers, conversationFactory);
- }
-
- /**
- * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles,
- * begining the test, gathering the test reports from the participants, and checking for assertion failures against
- * the test reports.
- *
- * @param testCircuit The test circuit.
- * @param assertions The list of assertions to apply to the test circuit.
- * @param testProperties The test case definition.
- */
- public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties)
- {
- log.debug("protected Message[] sequenceTest(Object... testProperties = " + testProperties + "): called");
-
- TestClientDetails sender = getSender();
- List<TestClientDetails> receivers = getReceivers();
- ConversationFactory conversationFactory = getConversationFactory();
-
- try
- {
- Session session = conversationFactory.getSession();
- Destination senderControlTopic = session.createTopic(sender.privateControlKey);
- Destination receiverControlTopic = session.createTopic(receivers.get(0).privateControlKey);
-
- ConversationFactory.Conversation senderConversation = conversationFactory.startConversation();
- ConversationFactory.Conversation receiverConversation = conversationFactory.startConversation();
-
- Message assignSender = conversationFactory.getSession().createMessage();
- TestUtils.setPropertiesOnMessage(assignSender, testProperties);
- assignSender.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignSender.setStringProperty("ROLE", "SENDER");
-
- senderConversation.send(senderControlTopic, assignSender);
-
- // Assign the receivers role the receiving client.
- Message assignReceiver = session.createMessage();
- TestUtils.setPropertiesOnMessage(assignReceiver, testProperties);
- assignReceiver.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE");
- assignReceiver.setStringProperty("ROLE", "RECEIVER");
-
- receiverConversation.send(receiverControlTopic, assignReceiver);
-
- // Wait for the senders and receivers to confirm their roles.
- senderConversation.receive();
- receiverConversation.receive();
-
- // Start the test.
- Message start = session.createMessage();
- start.setStringProperty("CONTROL_TYPE", "START");
-
- senderConversation.send(senderControlTopic, start);
-
- // Wait for the test sender to return its report.
- Message senderReport = senderConversation.receive();
- TestUtils.pause(500);
-
- // Ask the receivers for its report.
- Message statusRequest = session.createMessage();
- statusRequest.setStringProperty("CONTROL_TYPE", "STATUS_REQUEST");
-
- receiverConversation.send(receiverControlTopic, statusRequest);
-
- // Wait for the receivers to send its report.
- Message receiverReport = receiverConversation.receive();
-
- // return new Message[] { senderReport, receiverReport };
-
- // Apply assertions.
- }
- catch (JMSException e)
- {
- throw new RuntimeException("JMSException not handled.");
- }
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java
deleted file mode 100644
index 4da9a1db29..0000000000
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.test.unit.close;
-
-import junit.framework.Assert;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.qpid.junit.concurrency.TestRunnable;
-import org.apache.qpid.junit.concurrency.ThreadTestCoordinator;
-import org.apache.qpid.test.utils.QpidBrokerTestCase;
-
-import javax.jms.Connection;
-import javax.jms.Message;
-import javax.jms.MessageListener;
-import javax.jms.Session;
-
-/**
- * This test forces the situation where a session is closed whilst a message consumer is still in its onMessage method.
- * Running in AUTO_ACK mode, the close call ought to wait until the onMessage method completes, and the ack is sent
- * before closing the connection.
- *
- * <p><table id="crc"><caption>CRC Card</caption> <tr><th> Responsibilities <th> Collaborations <tr><td> Check that
- * closing a connection whilst handling a message, blocks till completion of the handler. </table>
- */
-public class CloseBeforeAckTest extends QpidBrokerTestCase
-{
- private static final Logger log = LoggerFactory.getLogger(CloseBeforeAckTest.class);
-
- private Connection connection;
- private Session session;
- public static final String TEST_QUEUE_NAME = "TestQueue";
- private int TEST_COUNT = 25;
-
- class TestThread1 extends TestRunnable implements MessageListener
- {
- public void runWithExceptions() throws Exception
- {
- // Set this up to listen for message on the test session.
- session.createConsumer(session.createQueue(TEST_QUEUE_NAME)).setMessageListener(this);
- }
-
- public void onMessage(Message message)
- {
- // Give thread 2 permission to close the session.
- allow(new int[] { 1 });
-
- // Wait until thread 2 has closed the connection, or is blocked waiting for this to complete.
- waitFor(new int[] { 1 }, true);
- }
- }
-
- private TestThread1 testThread1 = new TestThread1();
-
- private TestRunnable testThread2 =
- new TestRunnable()
- {
- public void runWithExceptions() throws Exception
- {
- // Send a message to be picked up by thread 1.
- session.createProducer(null).send(session.createQueue(TEST_QUEUE_NAME),
- session.createTextMessage("Hi there thread 1!"));
-
- // Wait for thread 1 to pick up the message and give permission to continue.
- waitFor(new int[] { 0 }, false);
-
- // Close the connection.
- session.close();
-
- // Allow thread 1 to continue to completion, if it is erronously still waiting.
- allow(new int[] { 1 });
- }
- };
-
- public void testCloseBeforeAutoAck_QPID_397() throws Exception
- {
- // Create a session in auto acknowledge mode. This problem shows up in auto acknowledge if the client acks
- // message at the end of the onMessage method, after a close has been sent.
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- ThreadTestCoordinator tt = new ThreadTestCoordinator(2);
-
- tt.addTestThread(testThread1, 0);
- tt.addTestThread(testThread2, 1);
- tt.setDeadlockTimeout(500);
- tt.run();
-
- String errorMessage = tt.joinAndRetrieveMessages();
-
- // Print any error messages or exceptions.
- log.debug(errorMessage);
-
- if (!tt.getExceptions().isEmpty())
- {
- for (Exception e : tt.getExceptions())
- {
- log.debug("Exception thrown during test thread: ", e);
- }
- }
-
- Assert.assertTrue(errorMessage, "".equals(errorMessage));
- }
-
- public void closeBeforeAutoAckManyTimes() throws Exception
- {
- for (int i = 0; i < TEST_COUNT; i++)
- {
- testCloseBeforeAutoAck_QPID_397();
- }
- }
-
- protected void setUp() throws Exception
- {
- super.setUp();
- connection = getConnection("guest", "guest");
- }
-
- protected void tearDown() throws Exception
- {
- super.tearDown();
- }
-}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/MessageConsumerCloseTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/MessageConsumerCloseTest.java
new file mode 100644
index 0000000000..df32bd7858
--- /dev/null
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/MessageConsumerCloseTest.java
@@ -0,0 +1,77 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.test.unit.close;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import javax.jms.Connection;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.Session;
+
+import org.apache.qpid.test.utils.QpidBrokerTestCase;
+
+public class MessageConsumerCloseTest extends QpidBrokerTestCase
+{
+ Exception _exception;
+
+ public void testConsumerCloseAndSessionRollback() throws Exception
+ {
+ Connection connection = getConnection();
+ final CountDownLatch receiveLatch = new CountDownLatch(1);
+ final Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
+ Destination destination = getTestQueue();
+ MessageConsumer consumer = session.createConsumer(destination);
+ sendMessage(session, destination, 2);
+ connection.start();
+ consumer.setMessageListener(new MessageListener()
+ {
+ @Override
+ public void onMessage(Message message)
+ {
+ try
+ {
+ receiveLatch.countDown();
+ session.rollback();
+ }
+ catch (JMSException e)
+ {
+ _exception = e;
+ }
+ }
+ });
+ boolean messageReceived = receiveLatch.await(1l, TimeUnit.SECONDS);
+ consumer.close();
+
+ assertNull("Exception occured on rollback:" + _exception, _exception);
+ assertTrue("Message is not received", messageReceived);
+
+ consumer = session.createConsumer(destination);
+ Message message1 = consumer.receive(1000l);
+ assertNotNull("message1 is not received", message1);
+ Message message2 = consumer.receive(1000l);
+ assertNotNull("message2 is not received", message2);
+ }
+}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/JMXTestUtils.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/JMXTestUtils.java
index 2b7c3f2664..d9c259c389 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/JMXTestUtils.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/JMXTestUtils.java
@@ -329,7 +329,11 @@ public class JMXTestUtils
public boolean isManagedObjectExist(String query)
{
return !queryObjects(query).isEmpty();
+ }
+ public int getNumberOfObjects(String query)
+ {
+ return queryObjects(query).size();
}
public <T> T getManagedObject(Class<T> managedClass, ObjectName objectName)
@@ -430,8 +434,7 @@ public class JMXTestUtils
}
/**
- * Returns the Set of ObjectNames returned by the broker for the given query,
- * or null if there is problem while performing the query.
+ * Returns the Set of ObjectNames returned by the broker for the given query.
*/
private Set<ObjectName> queryObjects(String query)
{
@@ -441,8 +444,7 @@ public class JMXTestUtils
}
catch (Exception e)
{
- e.printStackTrace();
- return null;
+ throw new RuntimeException("Error using query: " + query, e);
}
}
}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
index 32c6094adb..c070fb4de0 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java
@@ -35,7 +35,8 @@ import org.apache.qpid.server.BrokerOptions;
import org.apache.qpid.server.ProtocolExclusion;
import org.apache.qpid.server.configuration.ServerConfiguration;
import org.apache.qpid.server.protocol.AmqpProtocolVersion;
-import org.apache.qpid.server.store.DerbyMessageStore;
+import org.apache.qpid.server.store.MessageStoreConstants;
+import org.apache.qpid.server.store.derby.DerbyMessageStoreFactory;
import org.apache.qpid.url.URLSyntaxException;
import org.apache.qpid.util.FileUtils;
import org.apache.qpid.util.LogMonitor;
@@ -63,9 +64,12 @@ import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
@@ -195,6 +199,7 @@ public class QpidBrokerTestCase extends QpidTestCase
return QpidBrokerTestCase._logger;
}
+ @Override
public void runBare() throws Throwable
{
String qname = getClass().getName() + "." + getName();
@@ -243,14 +248,7 @@ public class QpidBrokerTestCase extends QpidTestCase
}
finally
{
- try
- {
- stopBroker();
- }
- catch (Exception e)
- {
- _logger.error("exception stopping broker", e);
- }
+ stopAllBrokers();
// reset properties used in the test
revertSystemProperties();
@@ -634,12 +632,21 @@ public class QpidBrokerTestCase extends QpidTestCase
}
}
- public void stopBroker() throws Exception
+ public void stopBroker()
{
stopBroker(0);
}
- public void stopBroker(int port) throws Exception
+ public void stopAllBrokers()
+ {
+ Set<Integer> runningBrokerPorts = new HashSet<Integer>(getBrokerPortNumbers());
+ for (int brokerPortNumber : runningBrokerPorts)
+ {
+ stopBroker(brokerPortNumber);
+ }
+ }
+
+ public void stopBroker(int port)
{
if (isBrokerPresent(port))
{
@@ -651,12 +658,12 @@ public class QpidBrokerTestCase extends QpidTestCase
}
}
- public void killBroker() throws Exception
+ public void killBroker()
{
killBroker(0);
}
- public void killBroker(int port) throws Exception
+ public void killBroker(int port)
{
if (isBrokerPresent(port))
{
@@ -668,7 +675,7 @@ public class QpidBrokerTestCase extends QpidTestCase
}
}
- public boolean isBrokerPresent(int port) throws Exception
+ public boolean isBrokerPresent(int port)
{
port = getPort(port);
@@ -681,6 +688,11 @@ public class QpidBrokerTestCase extends QpidTestCase
return _brokers.get(port);
}
+ public Set<Integer> getBrokerPortNumbers()
+ {
+ return new HashSet<Integer>(_brokers.keySet());
+ }
+
/**
* Attempt to set the Java Broker to use the BDBMessageStore for persistence
* Falling back to the DerbyMessageStore if
@@ -693,22 +705,22 @@ public class QpidBrokerTestCase extends QpidTestCase
protected void makeVirtualHostPersistent(String virtualhost)
throws ConfigurationException, IOException
{
- Class<?> storeClass = null;
+ Class<?> storeFactoryClass = null;
try
{
// Try and lookup the BDB class
- storeClass = Class.forName("org.apache.qpid.server.store.berkeleydb.BDBMessageStore");
+ storeFactoryClass = Class.forName("org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory");
}
catch (ClassNotFoundException e)
{
// No BDB store, we'll use Derby instead.
- storeClass = DerbyMessageStore.class;
+ storeFactoryClass = DerbyMessageStoreFactory.class;
}
- setConfigurationProperty("virtualhosts.virtualhost." + virtualhost + ".store.class",
- storeClass.getName());
- setConfigurationProperty("virtualhosts.virtualhost." + virtualhost + ".store." + DerbyMessageStore.ENVIRONMENT_PATH_PROPERTY,
+ setConfigurationProperty("virtualhosts.virtualhost." + virtualhost + ".store.factoryclass",
+ storeFactoryClass.getName());
+ setConfigurationProperty("virtualhosts.virtualhost." + virtualhost + ".store." + MessageStoreConstants.ENVIRONMENT_PATH_PROPERTY,
"${QPID_WORK}/" + virtualhost);
}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
index 50b1ea7cea..787fc164d5 100644
--- a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java
@@ -114,7 +114,7 @@ public class SpawnedBrokerHolder implements BrokerHolder
}
catch (ReflectionUtilsException e)
{
- LOGGER.warn("Could not get pid for process, Broker process shutdown will be ungraceful");
+ LOGGER.warn("Could not get pid for process, Broker process shutdown will be graceful");
}
}
return null;
diff --git a/qpid/java/test-profiles/CPPExcludes b/qpid/java/test-profiles/CPPExcludes
index 74b02153ac..1943049a7b 100755
--- a/qpid/java/test-profiles/CPPExcludes
+++ b/qpid/java/test-profiles/CPPExcludes
@@ -91,6 +91,7 @@ org.apache.qpid.server.store.MessageStoreTest#testQueuePersistence
org.apache.qpid.server.store.MessageStoreTest#testDurableQueueRemoval
org.apache.qpid.server.store.MessageStoreTest#testExchangePersistence
org.apache.qpid.server.store.MessageStoreTest#testDurableExchangeRemoval
+org.apache.qpid.server.store.DurableConfigurationStoreTest#*
// CPP Broker does not follow the same Logging convention as the Java broker
org.apache.qpid.server.BrokerStartupTest#*
@@ -171,3 +172,8 @@ org.apache.qpid.scripts.QpidPasswdTest#*
// QPID-3604: Immediate Prefetch no longer supported by 0-10
org.apache.qpid.client.AsynchMessageListenerTest#testImmediatePrefetchWithMessageListener
+
+// QPID-3936: Exclude Performance Test Framework tests
+org.apache.qpid.systest.disttest.*
+org.apache.qpid.disttest.*
+
diff --git a/qpid/java/test-profiles/Excludes b/qpid/java/test-profiles/Excludes
index 9c07fea574..c0532e0b97 100644
--- a/qpid/java/test-profiles/Excludes
+++ b/qpid/java/test-profiles/Excludes
@@ -30,3 +30,4 @@ org.apache.qpid.server.logging.MemoryMessageStoreLoggingTest#testMessageStoreClo
org.apache.qpid.server.logging.DerbyMessageStoreLoggingTest#*
org.apache.qpid.client.ssl.SSLTest#testVerifyLocalHostLocalDomain
+
diff --git a/qpid/java/test-profiles/JavaBDBExcludes b/qpid/java/test-profiles/JavaBDBExcludes
index 3fac01cb6d..0750beb339 100644
--- a/qpid/java/test-profiles/JavaBDBExcludes
+++ b/qpid/java/test-profiles/JavaBDBExcludes
@@ -20,3 +20,4 @@
//This test is subclassed within the bdbstore module to enable it to run and
//also add some bdb-specific tests. It is excluded to prevent running twice.
org.apache.qpid.server.store.MessageStoreTest#*
+org.apache.qpid.server.store.DurableConfigurationStoreTest#*
diff --git a/qpid/java/test-profiles/JavaDerbyExcludes b/qpid/java/test-profiles/JavaDerbyExcludes
index 931a0b0ddb..7ea00680c1 100644
--- a/qpid/java/test-profiles/JavaDerbyExcludes
+++ b/qpid/java/test-profiles/JavaDerbyExcludes
@@ -17,6 +17,4 @@
// under the License.
//
-org.apache.qpid.server.store.berkeleydb.BDBMessageStoreTest#*
-org.apache.qpid.server.store.berkeleydb.BDBUpgradeTest#*
-org.apache.qpid.server.store.berkeleydb.BDBBackupTest#*
+org.apache.qpid.server.store.berkeleydb.*
diff --git a/qpid/java/test-profiles/JavaTransientExcludes b/qpid/java/test-profiles/JavaTransientExcludes
index cf11e99e89..eb4c1f814d 100644
--- a/qpid/java/test-profiles/JavaTransientExcludes
+++ b/qpid/java/test-profiles/JavaTransientExcludes
@@ -40,6 +40,6 @@ org.apache.qpid.server.store.MessageStoreTest#testDurableQueueRemoval
org.apache.qpid.server.store.MessageStoreTest#testExchangePersistence
org.apache.qpid.server.store.MessageStoreTest#testDurableExchangeRemoval
-org.apache.qpid.server.store.berkeleydb.BDBMessageStoreTest#*
-org.apache.qpid.server.store.berkeleydb.BDBUpgradeTest#*
-org.apache.qpid.server.store.berkeleydb.BDBBackupTest#*
+org.apache.qpid.server.store.berkeleydb.*
+
+org.apache.qpid.server.store.DurableConfigurationStoreTest#* \ No newline at end of file
diff --git a/qpid/java/test-profiles/java-bdb-spawn.0-10.testprofile b/qpid/java/test-profiles/java-bdb-spawn.0-10.testprofile
index cba348b67f..2cef1fd53e 100644
--- a/qpid/java/test-profiles/java-bdb-spawn.0-10.testprofile
+++ b/qpid/java/test-profiles/java-bdb-spawn.0-10.testprofile
@@ -23,7 +23,7 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT -c @CONFIG_FILE -l test-
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
profile.excludes=JavaExcludes JavaPersistentExcludes Java010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/qpid/java/test-profiles/java-bdb-spawn.0-8.testprofile b/qpid/java/test-profiles/java-bdb-spawn.0-8.testprofile
index 011fd9fe91..62c9385835 100644
--- a/qpid/java/test-profiles/java-bdb-spawn.0-8.testprofile
+++ b/qpid/java/test-profiles/java-bdb-spawn.0-8.testprofile
@@ -23,11 +23,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
broker.version=v0_8
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/qpid/java/test-profiles/java-bdb-spawn.0-9-1.testprofile b/qpid/java/test-profiles/java-bdb-spawn.0-9-1.testprofile
index 7d178d958f..cfc2a12dde 100644
--- a/qpid/java/test-profiles/java-bdb-spawn.0-9-1.testprofile
+++ b/qpid/java/test-profiles/java-bdb-spawn.0-9-1.testprofile
@@ -23,11 +23,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
broker.version=v0_9_1
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/qpid/java/test-profiles/java-bdb-spawn.0-9.testprofile b/qpid/java/test-profiles/java-bdb-spawn.0-9.testprofile
index f5c321dc02..9cfa25eb9a 100644
--- a/qpid/java/test-profiles/java-bdb-spawn.0-9.testprofile
+++ b/qpid/java/test-profiles/java-bdb-spawn.0-9.testprofile
@@ -23,11 +23,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
broker.version=v0_9
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/qpid/java/test-profiles/java-bdb.0-10.testprofile b/qpid/java/test-profiles/java-bdb.0-10.testprofile
index 3ef93a68cb..4ac4c3baf2 100644
--- a/qpid/java/test-profiles/java-bdb.0-10.testprofile
+++ b/qpid/java/test-profiles/java-bdb.0-10.testprofile
@@ -24,7 +24,7 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT -c @CONFIG_FILE -l test-
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
profile.excludes=JavaExcludes JavaPersistentExcludes Java010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/qpid/java/test-profiles/java-bdb.0-8.testprofile b/qpid/java/test-profiles/java-bdb.0-8.testprofile
index 322168064f..76c3ea0b72 100644
--- a/qpid/java/test-profiles/java-bdb.0-8.testprofile
+++ b/qpid/java/test-profiles/java-bdb.0-8.testprofile
@@ -24,11 +24,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
broker.version=v0_8
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/qpid/java/test-profiles/java-bdb.0-9-1.testprofile b/qpid/java/test-profiles/java-bdb.0-9-1.testprofile
index f0b34c5f67..afc5f7bfd1 100644
--- a/qpid/java/test-profiles/java-bdb.0-9-1.testprofile
+++ b/qpid/java/test-profiles/java-bdb.0-9-1.testprofile
@@ -24,11 +24,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
broker.version=v0_9_1
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/qpid/java/test-profiles/java-bdb.0-9.testprofile b/qpid/java/test-profiles/java-bdb.0-9.testprofile
index 1ac4ef74c0..76bde0defc 100644
--- a/qpid/java/test-profiles/java-bdb.0-9.testprofile
+++ b/qpid/java/test-profiles/java-bdb.0-9.testprofile
@@ -24,11 +24,11 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-bdb.xml
-messagestore.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.berkeleydb.BDBMessageStoreFactory
profile.excludes=JavaExcludes JavaPersistentExcludes XAExcludes JavaPre010Excludes JavaBDBExcludes
broker.clean.between.tests=true
broker.persistent=true
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
broker.version=v0_9
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
diff --git a/qpid/java/test-profiles/java-dby-spawn.0-10.testprofile b/qpid/java/test-profiles/java-dby-spawn.0-10.testprofile
index 5bd6f330d5..3b57dca346 100644
--- a/qpid/java/test-profiles/java-dby-spawn.0-10.testprofile
+++ b/qpid/java/test-profiles/java-dby-spawn.0-10.testprofile
@@ -23,7 +23,7 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT -c @CONFIG_FILE -l test-
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
profile.excludes=JavaPersistentExcludes JavaDerbyExcludes Java010Excludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/qpid/java/test-profiles/java-dby-spawn.0-8.testprofile b/qpid/java/test-profiles/java-dby-spawn.0-8.testprofile
index 3a6023e78f..9d421f706e 100644
--- a/qpid/java/test-profiles/java-dby-spawn.0-8.testprofile
+++ b/qpid/java/test-profiles/java-dby-spawn.0-8.testprofile
@@ -23,8 +23,8 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/qpid/java/test-profiles/java-dby-spawn.0-9-1.testprofile b/qpid/java/test-profiles/java-dby-spawn.0-9-1.testprofile
index 0e910e8ce5..3038dd324e 100644
--- a/qpid/java/test-profiles/java-dby-spawn.0-9-1.testprofile
+++ b/qpid/java/test-profiles/java-dby-spawn.0-9-1.testprofile
@@ -23,8 +23,8 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/qpid/java/test-profiles/java-dby-spawn.0-9.testprofile b/qpid/java/test-profiles/java-dby-spawn.0-9.testprofile
index 232586623c..6007105097 100644
--- a/qpid/java/test-profiles/java-dby-spawn.0-9.testprofile
+++ b/qpid/java/test-profiles/java-dby-spawn.0-9.testprofile
@@ -23,8 +23,8 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/qpid/java/test-profiles/java-dby.0-10.testprofile b/qpid/java/test-profiles/java-dby.0-10.testprofile
index 9c23d18f45..51f6c4ca6f 100644
--- a/qpid/java/test-profiles/java-dby.0-10.testprofile
+++ b/qpid/java/test-profiles/java-dby.0-10.testprofile
@@ -24,7 +24,7 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT -c @CONFIG_FILE -l test-
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
profile.excludes=JavaPersistentExcludes JavaDerbyExcludes Java010Excludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/qpid/java/test-profiles/java-dby.0-8.testprofile b/qpid/java/test-profiles/java-dby.0-8.testprofile
index 161c3dcfe2..c841c69922 100644
--- a/qpid/java/test-profiles/java-dby.0-8.testprofile
+++ b/qpid/java/test-profiles/java-dby.0-8.testprofile
@@ -24,8 +24,8 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/qpid/java/test-profiles/java-dby.0-9-1.testprofile b/qpid/java/test-profiles/java-dby.0-9-1.testprofile
index b5561782a7..fa01010d52 100644
--- a/qpid/java/test-profiles/java-dby.0-9-1.testprofile
+++ b/qpid/java/test-profiles/java-dby.0-9-1.testprofile
@@ -24,8 +24,8 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/qpid/java/test-profiles/java-dby.0-9.testprofile b/qpid/java/test-profiles/java-dby.0-9.testprofile
index 289554e618..d343185591 100644
--- a/qpid/java/test-profiles/java-dby.0-9.testprofile
+++ b/qpid/java/test-profiles/java-dby.0-9.testprofile
@@ -24,8 +24,8 @@ broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FIL
broker.ready=BRK-1004
broker.stopped=Exception
broker.config=build/etc/config-systests-derby.xml
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
-messagestore.class.name=org.apache.qpid.server.store.DerbyMessageStore
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+messagestorefactory.class.name=org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
profile.excludes=JavaPersistentExcludes JavaDerbyExcludes XAExcludes JavaPre010Excludes
broker.clean.between.tests=true
broker.persistent=true
diff --git a/qpid/java/test-profiles/java-mms-spawn.0-8.testprofile b/qpid/java/test-profiles/java-mms-spawn.0-8.testprofile
index b075890e58..1b6b6f28a3 100644
--- a/qpid/java/test-profiles/java-mms-spawn.0-8.testprofile
+++ b/qpid/java/test-profiles/java-mms-spawn.0-8.testprofile
@@ -22,7 +22,7 @@ broker.type=spawned
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
diff --git a/qpid/java/test-profiles/java-mms-spawn.0-9-1.testprofile b/qpid/java/test-profiles/java-mms-spawn.0-9-1.testprofile
index 7f80dc743a..e87ae2b204 100644
--- a/qpid/java/test-profiles/java-mms-spawn.0-9-1.testprofile
+++ b/qpid/java/test-profiles/java-mms-spawn.0-9-1.testprofile
@@ -22,7 +22,7 @@ broker.type=spawned
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
diff --git a/qpid/java/test-profiles/java-mms-spawn.0-9.testprofile b/qpid/java/test-profiles/java-mms-spawn.0-9.testprofile
index 57e670ec31..2a9430242e 100644
--- a/qpid/java/test-profiles/java-mms-spawn.0-9.testprofile
+++ b/qpid/java/test-profiles/java-mms-spawn.0-9.testprofile
@@ -22,7 +22,7 @@ broker.type=spawned
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
diff --git a/qpid/java/test-profiles/java-mms.0-8.testprofile b/qpid/java/test-profiles/java-mms.0-8.testprofile
index d7ef32ae3b..1f02a49b28 100644
--- a/qpid/java/test-profiles/java-mms.0-8.testprofile
+++ b/qpid/java/test-profiles/java-mms.0-8.testprofile
@@ -23,7 +23,7 @@ broker.type=internal
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT --exclude-0-9 @PORT --exclude-0-9 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
diff --git a/qpid/java/test-profiles/java-mms.0-9-1.testprofile b/qpid/java/test-profiles/java-mms.0-9-1.testprofile
index a2dc90bc63..ae707f025d 100644
--- a/qpid/java/test-profiles/java-mms.0-9-1.testprofile
+++ b/qpid/java/test-profiles/java-mms.0-9-1.testprofile
@@ -23,7 +23,7 @@ broker.type=internal
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
diff --git a/qpid/java/test-profiles/java-mms.0-9.testprofile b/qpid/java/test-profiles/java-mms.0-9.testprofile
index 398a9ac4d0..8f372299ea 100644
--- a/qpid/java/test-profiles/java-mms.0-9.testprofile
+++ b/qpid/java/test-profiles/java-mms.0-9.testprofile
@@ -23,7 +23,7 @@ broker.type=internal
broker.command=build/bin/qpid-server -p @PORT -m @MPORT @EXCLUDES -c @CONFIG_FILE -l test-profiles/log4j-test.xml
broker.ready=BRK-1004
broker.stopped=Exception
-broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
+broker.protocol.excludes=--exclude-0-10 @PORT --exclude-0-10 @SSL_PORT --exclude-1-0 @PORT --exclude-1-0 @SSL_PORT --exclude-0-9-1 @PORT --exclude-0-9-1 @SSL_PORT
#
# Do not enable. Allow client to attempt 0-10 and negotiate downwards
#
diff --git a/qpid/java/test-profiles/testprofile.defaults b/qpid/java/test-profiles/testprofile.defaults
index b0c1aea661..2c3c92e922 100644
--- a/qpid/java/test-profiles/testprofile.defaults
+++ b/qpid/java/test-profiles/testprofile.defaults
@@ -21,7 +21,7 @@ java.naming.provider.url=${test.profiles}/test-provider.properties
broker.ready=Listening on TCP
broker.config=build/etc/config-systests.xml
-messagestore.class.name=org.apache.qpid.server.store.MemoryMessageStore
+messagestorefactory.class.name=org.apache.qpid.server.store.MemoryMessageStoreFactory
broker.protocol.excludes=
broker.persistent=false
diff --git a/qpid/java/tools/bin/perf-report b/qpid/java/tools/bin/jms-quick-perf-report
index 7de3f2b602..7de3f2b602 100755
--- a/qpid/java/tools/bin/perf-report
+++ b/qpid/java/tools/bin/jms-quick-perf-report
diff --git a/qpid/java/tools/bin/controller b/qpid/java/tools/bin/mercury-controller
index fab8614039..fab8614039 100644
--- a/qpid/java/tools/bin/controller
+++ b/qpid/java/tools/bin/mercury-controller
diff --git a/qpid/java/tools/bin/start-consumers b/qpid/java/tools/bin/mercury-start-consumers
index c71fc0c21f..c71fc0c21f 100644
--- a/qpid/java/tools/bin/start-consumers
+++ b/qpid/java/tools/bin/mercury-start-consumers
diff --git a/qpid/java/tools/bin/start-producers b/qpid/java/tools/bin/mercury-start-producers
index 7ba0286f7c..7ba0286f7c 100644
--- a/qpid/java/tools/bin/start-producers
+++ b/qpid/java/tools/bin/mercury-start-producers
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/Clock.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/Clock.java
index 979d2ef76f..4e79dd62a8 100644
--- a/qpid/java/tools/src/main/java/org/apache/qpid/tools/Clock.java
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/Clock.java
@@ -27,6 +27,8 @@ package org.apache.qpid.tools;
public class Clock
{
+ public final static long SEC = 60000;
+
private static Precision precision;
private static long offset = -1; // in nano secs
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/JVMArgConfiguration.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/JVMArgConfiguration.java
new file mode 100644
index 0000000000..c6abdf6c84
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/JVMArgConfiguration.java
@@ -0,0 +1,411 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.text.DecimalFormat;
+
+import javax.jms.Connection;
+import javax.jms.Session;
+
+import org.apache.qpid.client.AMQConnection;
+
+public class JVMArgConfiguration implements TestConfiguration
+{
+ /*
+ * By default the connection URL is used.
+ * This allows a user to easily specify a fully fledged URL any given property.
+ * Ex. SSL parameters
+ *
+ * By providing a host & port allows a user to simply override the URL.
+ * This allows to create multiple clients in test scripts easily,
+ * without having to deal with the long URL format.
+ */
+ private String url = "amqp://guest:guest@clientid/testpath?brokerlist='tcp://localhost:5672'";
+
+ private String host = "";
+
+ private int port = -1;
+
+ private String address = "queue; {create : always}";
+
+ private int msg_size = 1024;
+
+ private int random_msg_size_start_from = 1;
+
+ private boolean cacheMessage = false;
+
+ private boolean disableMessageID = false;
+
+ private boolean disableTimestamp = false;
+
+ private boolean durable = false;
+
+ private int transaction_size = 0;
+
+ private int ack_mode = Session.AUTO_ACKNOWLEDGE;
+
+ private int msg_count = 10;
+
+ private int warmup_count = 1;
+
+ private boolean random_msg_size = false;
+
+ private String msgType = "bytes";
+
+ private boolean printStdDev = false;
+
+ private int sendRate = 0;
+
+ private boolean externalController = false;
+
+ private boolean useUniqueDest = false; // useful when using multiple connections.
+
+ private int ackFrequency = 100;
+
+ private DecimalFormat df = new DecimalFormat("###.##");
+
+ private int reportEvery = 0;
+
+ private boolean isReportTotal = false;
+
+ private boolean isReportHeader = true;
+
+ private boolean isReportLatency = false;
+
+ private int sendEOS = 0;
+
+ private int connectionCount = 1;
+
+ private int rollbackFrequency = 0;
+
+ private boolean printHeaders;
+
+ public JVMArgConfiguration()
+ {
+
+ url = System.getProperty("url",url);
+ host = System.getProperty("host","");
+ port = Integer.getInteger("port", -1);
+ address = System.getProperty("address",address);
+
+ msg_size = Integer.getInteger("msg-size", 1024);
+ cacheMessage = Boolean.getBoolean("cache-msg");
+ disableMessageID = Boolean.getBoolean("disable-message-id");
+ disableTimestamp = Boolean.getBoolean("disable-timestamp");
+ durable = Boolean.getBoolean("durable");
+ transaction_size = Integer.getInteger("tx",1000);
+ ack_mode = Integer.getInteger("ack-mode",Session.AUTO_ACKNOWLEDGE);
+ msg_count = Integer.getInteger("msg-count",msg_count);
+ warmup_count = Integer.getInteger("warmup-count",warmup_count);
+ random_msg_size = Boolean.getBoolean("random-msg-size");
+ msgType = System.getProperty("msg-type","bytes");
+ printStdDev = Boolean.getBoolean("print-std-dev");
+ sendRate = Integer.getInteger("rate",0);
+ externalController = Boolean.getBoolean("ext-controller");
+ useUniqueDest = Boolean.getBoolean("use-unique-dest");
+ random_msg_size_start_from = Integer.getInteger("random-msg-size-start-from", 1);
+ reportEvery = Integer.getInteger("report-every");
+ isReportTotal = Boolean.getBoolean("report-total");
+ isReportHeader = (System.getProperty("report-header") == null) ? true : Boolean.getBoolean("report-header");
+ isReportLatency = Boolean.getBoolean("report-latency");
+ sendEOS = Integer.getInteger("send-eos");
+ connectionCount = Integer.getInteger("con_count",1);
+ ackFrequency = Integer.getInteger("ack-frequency");
+ rollbackFrequency = Integer.getInteger("rollback-frequency");
+ printHeaders = Boolean.getBoolean("print-headers");
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getUrl()
+ */
+ @Override
+ public String getUrl()
+ {
+ return url;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getHost()
+ */
+ @Override
+ public String getHost()
+ {
+ return host;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getPort()
+ */
+ @Override
+ public int getPort()
+ {
+ return port;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getAddress()
+ */
+ @Override
+ public String getAddress()
+ {
+ return address;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getAckMode()
+ */
+ @Override
+ public int getAckMode()
+ {
+ return ack_mode;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getMsgCount()
+ */
+ @Override
+ public int getMsgCount()
+ {
+ return msg_count;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getMsgSize()
+ */
+ @Override
+ public int getMsgSize()
+ {
+ return msg_size;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getRandomMsgSizeStartFrom()
+ */
+ @Override
+ public int getRandomMsgSizeStartFrom()
+ {
+ return random_msg_size_start_from;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isDurable()
+ */
+ @Override
+ public boolean isDurable()
+ {
+ return durable;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isTransacted()
+ */
+ @Override
+ public boolean isTransacted()
+ {
+ return transaction_size > 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getTransactionSize()
+ */
+ @Override
+ public int getTransactionSize()
+ {
+ return transaction_size;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getWarmupCount()
+ */
+ @Override
+ public int getWarmupCount()
+ {
+ return warmup_count;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isCacheMessage()
+ */
+ @Override
+ public boolean isCacheMessage()
+ {
+ return cacheMessage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isDisableMessageID()
+ */
+ @Override
+ public boolean isDisableMessageID()
+ {
+ return disableMessageID;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isDisableTimestamp()
+ */
+ @Override
+ public boolean isDisableTimestamp()
+ {
+ return disableTimestamp;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isRandomMsgSize()
+ */
+ @Override
+ public boolean isRandomMsgSize()
+ {
+ return random_msg_size;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getMessageType()
+ */
+ @Override
+ public String getMessageType()
+ {
+ return msgType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isPrintStdDev()
+ */
+ @Override
+ public boolean isPrintStdDev()
+ {
+ return printStdDev;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getSendRate()
+ */
+ @Override
+ public int getSendRate()
+ {
+ return sendRate;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isExternalController()
+ */
+ @Override
+ public boolean isExternalController()
+ {
+ return externalController;
+ }
+
+ public void setAddress(String addr)
+ {
+ address = addr;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#isUseUniqueDests()
+ */
+ @Override
+ public boolean isUseUniqueDests()
+ {
+ return useUniqueDest;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getAckFrequency()
+ */
+ @Override
+ public int getAckFrequency()
+ {
+ return ackFrequency;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#createConnection()
+ */
+ @Override
+ public Connection createConnection() throws Exception
+ {
+ if (getHost().equals("") || getPort() == -1)
+ {
+ return new AMQConnection(getUrl());
+ }
+ else
+ {
+ return new AMQConnection(getHost(),getPort(),"guest","guest","test","test");
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.TestConfiguration#getDecimalFormat()
+ */
+ @Override
+ public DecimalFormat getDecimalFormat()
+ {
+ return df;
+ }
+
+ @Override
+ public int reportEvery()
+ {
+ return reportEvery;
+ }
+
+ @Override
+ public boolean isReportTotal()
+ {
+ return isReportTotal;
+ }
+
+ @Override
+ public boolean isReportHeader()
+ {
+ return isReportHeader;
+ }
+
+ @Override
+ public boolean isReportLatency()
+ {
+ return isReportLatency;
+ }
+
+ @Override
+ public int getSendEOS()
+ {
+ return sendEOS;
+ }
+
+ @Override
+ public int getConnectionCount()
+ {
+ return connectionCount;
+ }
+
+ @Override
+ public int getRollbackFrequency()
+ {
+ return rollbackFrequency;
+ }
+
+ @Override
+ public boolean isPrintHeaders()
+ {
+ return printHeaders;
+ }
+}
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/LatencyTest.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/LatencyTest.java
deleted file mode 100644
index 16149d17c9..0000000000
--- a/qpid/java/tools/src/main/java/org/apache/qpid/tools/LatencyTest.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import java.io.FileOutputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import javax.jms.BytesMessage;
-import javax.jms.DeliveryMode;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-import javax.jms.TextMessage;
-
-import org.apache.qpid.thread.Threading;
-
-/**
- * Latency test sends an x number of messages in warmup mode and wait for a confirmation
- * from the consumer that it has successfully consumed them and ready to start the
- * test. It will start sending y number of messages and each message will contain a time
- * stamp. This will be used at the receiving end to measure the latency.
- *
- * It is important to have a sufficiently large number for the warmup count to
- * ensure the system is in steady state before the test is started.
- *
- * If you plan to plot the latencies then msg_count should be a smaller number (ex 500 or 1000)
- * You also need to specify a file name using -Dfile=/home/rajith/latency.log.1
- *
- * The idea is to get a latency sample for the system once it achieves steady state.
- *
- */
-
-public class LatencyTest extends PerfBase implements MessageListener
-{
- private MessageProducer producer;
- private MessageConsumer consumer;
- private Message msg;
- private byte[] payload;
- private long maxLatency = 0;
- private long minLatency = Long.MAX_VALUE;
- private long totalLatency = 0; // to calculate avg latency.
- private int rcvdMsgCount = 0;
- private double stdDev = 0;
- private double avgLatency = 0;
- private boolean warmup_mode = true;
- private boolean transacted = false;
- private int transSize = 0;
-
- private final List<Long> latencies;
- private final Lock lock = new ReentrantLock();
- private final Condition warmedUp;
- private final Condition testCompleted;
-
- public LatencyTest()
- {
- super("");
- warmedUp = lock.newCondition();
- testCompleted = lock.newCondition();
- // Storing the following two for efficiency
- transacted = params.isTransacted();
- transSize = params.getTransactionSize();
- latencies = new ArrayList <Long>(params.getMsgCount());
- }
-
- public void setUp() throws Exception
- {
- super.setUp();
- consumer = session.createConsumer(dest);
- consumer.setMessageListener(this);
-
- // if message caching is enabled we pre create the message
- // else we pre create the payload
- if (params.isCacheMessage())
- {
- msg = MessageFactory.createBytesMessage(session, params.getMsgSize());
- msg.setJMSDeliveryMode(params.isDurable()?
- DeliveryMode.PERSISTENT :
- DeliveryMode.NON_PERSISTENT
- );
- }
- else
- {
- payload = MessageFactory.createMessagePayload(params.getMsgSize()).getBytes();
- }
-
- producer = session.createProducer(dest);
- producer.setDisableMessageID(params.isDisableMessageID());
- producer.setDisableMessageTimestamp(params.isDisableTimestamp());
- }
-
- protected Message getNextMessage() throws Exception
- {
- if (params.isCacheMessage())
- {
- return msg;
- }
- else
- {
- msg = session.createBytesMessage();
- ((BytesMessage)msg).writeBytes(payload);
- return msg;
- }
- }
-
- public void warmup()throws Exception
- {
- System.out.println("Warming up......");
- int count = params.getWarmupCount();
- for (int i=0; i < count; i++)
- {
- producer.send(getNextMessage());
- }
- Message msg = session.createTextMessage("End");
- producer.send(msg);
-
- if (params.isTransacted())
- {
- session.commit();
- }
-
- try
- {
- lock.lock();
- warmedUp.await();
- }
- finally
- {
- lock.unlock();
- }
- }
-
- public void onMessage(Message msg)
- {
- try
- {
- if (msg instanceof TextMessage && ((TextMessage)msg).getText().equals("End"))
- {
- if (warmup_mode)
- {
- warmup_mode = false;
- try
- {
- lock.lock();
- warmedUp.signal();
- }
- finally
- {
- lock.unlock();
- }
- }
- else
- {
- computeStats();
- }
- }
- else if (!warmup_mode)
- {
- long time = System.currentTimeMillis();
- rcvdMsgCount ++;
-
- if (transacted && (rcvdMsgCount % transSize == 0))
- {
- session.commit();
- }
-
- long latency = time - msg.getJMSTimestamp();
- latencies.add(latency);
- totalLatency = totalLatency + latency;
- }
-
- }
- catch(Exception e)
- {
- handleError(e,"Error when receiving messages");
- }
-
- }
-
- private void computeStats()
- {
- avgLatency = (double)totalLatency/(double)rcvdMsgCount;
- double sigma = 0;
-
- for (long latency: latencies)
- {
- maxLatency = Math.max(maxLatency, latency);
- minLatency = Math.min(minLatency, latency);
- sigma = sigma + Math.pow(latency - avgLatency,2);
- }
-
- stdDev = Math.sqrt(sigma/(rcvdMsgCount -1));
-
- try
- {
- lock.lock();
- testCompleted.signal();
- }
- finally
- {
- lock.unlock();
- }
- }
-
- public void writeToFile() throws Exception
- {
- String fileName = System.getProperty("file");
- PrintWriter writer = new PrintWriter(new FileOutputStream(fileName));
- for (long latency: latencies)
- {
- writer.println(String.valueOf(latency));
- }
- writer.flush();
- writer.close();
- }
-
- public void printToConsole()
- {
- System.out.println(new StringBuilder("Total Msgs Received : ").append(rcvdMsgCount).toString());
- System.out.println(new StringBuilder("Standard Deviation : ").
- append(df.format(stdDev)).
- append(" ms").toString());
- System.out.println(new StringBuilder("Avg Latency : ").
- append(df.format(avgLatency)).
- append(" ms").toString());
- System.out.println(new StringBuilder("Min Latency : ").
- append(minLatency).
- append(" ms").toString());
- System.out.println(new StringBuilder("Max Latency : ").
- append(maxLatency).
- append(" ms").toString());
- System.out.println("Completed the test......\n");
- }
-
- public void startTest() throws Exception
- {
- System.out.println("Starting test......");
- int count = params.getMsgCount();
-
- for(int i=0; i < count; i++ )
- {
- Message msg = getNextMessage();
- msg.setJMSTimestamp(System.currentTimeMillis());
- producer.send(msg);
- if ( transacted && ((i+1) % transSize == 0))
- {
- session.commit();
- }
- }
- Message msg = session.createTextMessage("End");
- producer.send(msg);
- if (params.isTransacted())
- {
- session.commit();
- }
- }
-
- public void tearDown() throws Exception
- {
- try
- {
- lock.lock();
- testCompleted.await();
- }
- finally
- {
- lock.unlock();
- }
-
- producer.close();
- consumer.close();
- session.close();
- con.close();
- }
-
- public void test()
- {
- try
- {
- setUp();
- warmup();
- startTest();
- tearDown();
- }
- catch(Exception e)
- {
- handleError(e,"Error when running test");
- }
- }
-
-
- public static void main(String[] args)
- {
- final LatencyTest latencyTest = new LatencyTest();
- Runnable r = new Runnable()
- {
- public void run()
- {
- latencyTest.test();
- latencyTest.printToConsole();
- if (System.getProperty("file") != null)
- {
- try
- {
- latencyTest.writeToFile();
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- }
- };
-
- Thread t;
- try
- {
- t = Threading.getThreadFactory().createThread(r);
- }
- catch(Exception e)
- {
- throw new Error("Error creating latency test thread",e);
- }
- t.start();
- }
-}
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryBase.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryBase.java
new file mode 100644
index 0000000000..097b021b3e
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryBase.java
@@ -0,0 +1,191 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.net.InetAddress;
+import java.util.UUID;
+
+import javax.jms.Connection;
+import javax.jms.Destination;
+import javax.jms.MapMessage;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+
+import org.apache.qpid.client.AMQAnyDestination;
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.client.AMQSession_0_10;
+import org.apache.qpid.messaging.Address;
+import org.apache.qpid.tools.TestConfiguration.MessageType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MercuryBase
+{
+ private static final Logger _logger = LoggerFactory.getLogger(MercuryBase.class);
+
+ public final static String CODE = "CODE";
+ public final static String ID = "ID";
+ public final static String REPLY_ADDR = "REPLY_ADDR";
+ public final static String MAX_LATENCY = "MAX_LATENCY";
+ public final static String MIN_LATENCY = "MIN_LATENCY";
+ public final static String AVG_LATENCY = "AVG_LATENCY";
+ public final static String STD_DEV = "STD_DEV";
+ public final static String CONS_RATE = "CONS_RATE";
+ public final static String PROD_RATE = "PROD_RATE";
+ public final static String MSG_COUNT = "MSG_COUNT";
+ public final static String TIMESTAMP = "Timestamp";
+
+ String CONTROLLER_ADDR = System.getProperty("CONT_ADDR","CONTROLLER;{create: always, node:{x-declare:{auto-delete:true}}}");
+
+ TestConfiguration config;
+ Connection con;
+ Session session;
+ Session controllerSession;
+ Destination dest;
+ Destination myControlQueue;
+ Destination controllerQueue;
+ String id;
+ String myControlQueueAddr;
+
+ MessageProducer sendToController;
+ MessageConsumer receiveFromController;
+ String prefix = "";
+
+ enum OPCode
+ {
+ REGISTER_CONSUMER, REGISTER_PRODUCER,
+ PRODUCER_STARTWARMUP, CONSUMER_STARTWARMUP,
+ CONSUMER_READY, PRODUCER_READY,
+ PRODUCER_START,
+ RECEIVED_END_MSG, CONSUMER_STOP,
+ RECEIVED_PRODUCER_STATS, RECEIVED_CONSUMER_STATS,
+ CONTINUE_TEST, STOP_TEST
+ };
+
+ MessageType msgType = MessageType.BYTES;
+
+ public MercuryBase(TestConfiguration config,String prefix)
+ {
+ this.config = config;
+ String host = "";
+ try
+ {
+ host = InetAddress.getLocalHost().getHostName();
+ }
+ catch (Exception e)
+ {
+ }
+ id = host + "-" + UUID.randomUUID().toString();
+ this.prefix = prefix;
+ this.myControlQueueAddr = id + ";{create: always}";
+ }
+
+ public void setUp() throws Exception
+ {
+ con = config.createConnection();
+ con.start();
+
+ controllerSession = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+ dest = createDestination();
+ controllerQueue = AMQDestination.createDestination(CONTROLLER_ADDR);
+ myControlQueue = session.createQueue(myControlQueueAddr);
+ msgType = MessageType.getType(config.getMessageType());
+ _logger.debug("Using " + msgType + " messages");
+
+ sendToController = controllerSession.createProducer(controllerQueue);
+ receiveFromController = controllerSession.createConsumer(myControlQueue);
+ }
+
+ private Destination createDestination() throws Exception
+ {
+ if (config.isUseUniqueDests())
+ {
+ _logger.debug("Prefix : " + prefix);
+ Address addr = Address.parse(config.getAddress());
+ AMQDestination temp = (AMQDestination) AMQDestination.createDestination(config.getAddress());
+ int type = ((AMQSession_0_10)session).resolveAddressType(temp);
+
+ if ( type == AMQDestination.TOPIC_TYPE)
+ {
+ addr = new Address(addr.getName(),addr.getSubject() + "." + prefix,addr.getOptions());
+ System.out.println("Setting subject : " + addr);
+ }
+ else
+ {
+ addr = new Address(addr.getName() + "_" + prefix,addr.getSubject(),addr.getOptions());
+ System.out.println("Setting name : " + addr);
+ }
+
+ return AMQDestination.createDestination(addr.toString());
+ }
+ else
+ {
+ return AMQDestination.createDestination(config.getAddress());
+ }
+ }
+
+ public synchronized void sendMessageToController(MapMessage m) throws Exception
+ {
+ m.setString(ID, id);
+ m.setString(REPLY_ADDR,myControlQueueAddr);
+ sendToController.send(m);
+ }
+
+ public void receiveFromController(OPCode expected) throws Exception
+ {
+ MapMessage m = (MapMessage)receiveFromController.receive();
+ OPCode code = OPCode.values()[m.getInt(CODE)];
+ _logger.debug("Received Code : " + code);
+ if (expected != code)
+ {
+ throw new Exception("Expected OPCode : " + expected + " but received : " + code);
+ }
+
+ }
+
+ public boolean continueTest() throws Exception
+ {
+ MapMessage m = (MapMessage)receiveFromController.receive();
+ OPCode code = OPCode.values()[m.getInt(CODE)];
+ _logger.debug("Received Code : " + code);
+ return (code == OPCode.CONTINUE_TEST);
+ }
+
+ public void tearDown() throws Exception
+ {
+ session.close();
+ controllerSession.close();
+ con.close();
+ }
+
+ public void handleError(Exception e,String msg)
+ {
+ StringBuilder sb = new StringBuilder();
+ sb.append(msg);
+ sb.append(" ");
+ sb.append(e.getMessage());
+ System.err.println(sb.toString());
+ e.printStackTrace();
+ }
+}
+
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryConsumerController.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryConsumerController.java
new file mode 100644
index 0000000000..b35adc45d6
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryConsumerController.java
@@ -0,0 +1,231 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.util.concurrent.CountDownLatch;
+
+import javax.jms.MapMessage;
+
+import org.apache.qpid.thread.Threading;
+import org.apache.qpid.tools.report.MercuryReporter;
+import org.apache.qpid.tools.report.MercuryReporter.MercuryThroughputAndLatency;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * PerfConsumer will receive x no of messages in warmup mode.
+ * Once it receives the Start message it will then signal the PerfProducer.
+ * It will start recording stats from the first message it receives after
+ * the warmup mode is done.
+ *
+ * The following calculations are done.
+ * The important numbers to look at is
+ * a) Avg Latency
+ * b) System throughput.
+ *
+ * Latency.
+ * =========
+ * Currently this test is written with the assumption that either
+ * a) The Perf Producer and Consumer are on the same machine
+ * b) They are on separate machines that have their time synced via a Time Server
+ *
+ * In order to calculate latency the producer inserts a timestamp
+ * when the message is sent. The consumer will note the current time the message is
+ * received and will calculate the latency as follows
+ * latency = rcvdTime - msg.getJMSTimestamp()
+ *
+ * Through out the test it will keep track of the max and min latency to show the
+ * variance in latencies.
+ *
+ * Avg latency is measured by adding all latencies and dividing by the total msgs.
+ *
+ * Throughput
+ * ===========
+ * Consumer rate is calculated as
+ * rcvdMsgCount/(rcvdTime - startTime)
+ *
+ * Note that the testStartTime referes to when the producer sent the first message
+ * and startTime is when the consumer first received a message.
+ *
+ * rcvdTime keeps track of when the last message is received.
+ *
+ * All throughput rates are given as msg/sec so the rates are multiplied by 1000.
+ *
+ */
+
+public class MercuryConsumerController extends MercuryBase
+{
+ private static final Logger _logger = LoggerFactory.getLogger(MercuryConsumerController.class);
+ MercuryReporter reporter;
+ TestConfiguration config;
+ QpidReceive receiver;
+
+ public MercuryConsumerController(TestConfiguration config, MercuryReporter reporter, String prefix)
+ {
+ super(config,prefix);
+ this.reporter = reporter;
+ if (_logger.isInfoEnabled())
+ {
+ _logger.info("Consumer ID : " + id);
+ }
+ }
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ receiver = new QpidReceive(reporter,config, con,dest);
+ receiver.setUp();
+ MapMessage m = controllerSession.createMapMessage();
+ m.setInt(CODE, OPCode.REGISTER_CONSUMER.ordinal());
+ sendMessageToController(m);
+ }
+
+ public void warmup()throws Exception
+ {
+ receiveFromController(OPCode.CONSUMER_STARTWARMUP);
+ receiver.waitforCompletion(config.getWarmupCount());
+
+ // It's more realistic for the consumer to signal this.
+ MapMessage m1 = controllerSession.createMapMessage();
+ m1.setInt(CODE, OPCode.PRODUCER_READY.ordinal());
+ sendMessageToController(m1);
+
+ MapMessage m2 = controllerSession.createMapMessage();
+ m2.setInt(CODE, OPCode.CONSUMER_READY.ordinal());
+ sendMessageToController(m2);
+ }
+
+ public void runReceiver() throws Exception
+ {
+ if (_logger.isInfoEnabled())
+ {
+ _logger.info("Consumer: " + id + " Starting iteration......" + "\n");
+ }
+ resetCounters();
+ receiver.waitforCompletion(config.getMsgCount());
+ MapMessage m = controllerSession.createMapMessage();
+ m.setInt(CODE, OPCode.RECEIVED_END_MSG.ordinal());
+ sendMessageToController(m);
+ }
+
+ public void resetCounters()
+ {
+ reporter.clear();
+ }
+
+ public void sendResults() throws Exception
+ {
+ receiveFromController(OPCode.CONSUMER_STOP);
+ reporter.report();
+
+ MapMessage m = controllerSession.createMapMessage();
+ m.setInt(CODE, OPCode.RECEIVED_CONSUMER_STATS.ordinal());
+ m.setDouble(AVG_LATENCY, reporter.getAvgLatency());
+ m.setDouble(MIN_LATENCY, reporter.getMinLatency());
+ m.setDouble(MAX_LATENCY, reporter.getMaxLatency());
+ m.setDouble(STD_DEV, reporter.getStdDev());
+ m.setDouble(CONS_RATE, reporter.getRate());
+ m.setLong(MSG_COUNT, reporter.getSampleSize());
+ sendMessageToController(m);
+
+ reporter.log(new StringBuilder("Total Msgs Received : ").append(reporter.getSampleSize()).toString());
+ reporter.log(new StringBuilder("Consumer rate : ").
+ append(config.getDecimalFormat().format(reporter.getRate())).
+ append(" msg/sec").toString());
+ reporter.log(new StringBuilder("Avg Latency : ").
+ append(config.getDecimalFormat().format(reporter.getAvgLatency())).
+ append(" ms").toString());
+ reporter.log(new StringBuilder("Min Latency : ").
+ append(config.getDecimalFormat().format(reporter.getMinLatency())).
+ append(" ms").toString());
+ reporter.log(new StringBuilder("Max Latency : ").
+ append(config.getDecimalFormat().format(reporter.getMaxLatency())).
+ append(" ms").toString());
+ if (config.isPrintStdDev())
+ {
+ reporter.log(new StringBuilder("Std Dev : ").
+ append(reporter.getStdDev()).toString());
+ }
+ }
+
+ public void run()
+ {
+ try
+ {
+ setUp();
+ warmup();
+ boolean nextIteration = true;
+ while (nextIteration)
+ {
+ System.out.println("=========================================================\n");
+ System.out.println("Consumer: " + id + " starting a new iteration ......\n");
+ runReceiver();
+ sendResults();
+ nextIteration = continueTest();
+ }
+ tearDown();
+ }
+ catch(Exception e)
+ {
+ handleError(e,"Error when running test");
+ }
+ }
+
+ @Override
+ public void tearDown() throws Exception
+ {
+ super.tearDown();
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ TestConfiguration config = new JVMArgConfiguration();
+ MercuryReporter reporter= new MercuryReporter(MercuryThroughputAndLatency.class,System.out,10,true);
+ String scriptId = (args.length == 1) ? args[0] : "";
+ int conCount = config.getConnectionCount();
+ final CountDownLatch testCompleted = new CountDownLatch(conCount);
+ for (int i=0; i < conCount; i++)
+ {
+ final MercuryConsumerController cons = new MercuryConsumerController(config, reporter, scriptId + i);
+ Runnable r = new Runnable()
+ {
+ public void run()
+ {
+ cons.run();
+ testCompleted.countDown();
+ }
+ };
+
+ Thread t;
+ try
+ {
+ t = Threading.getThreadFactory().createThread(r);
+ }
+ catch(Exception e)
+ {
+ throw new Error("Error creating consumer thread",e);
+ }
+ t.start();
+ }
+ testCompleted.await();
+ reporter.log("Consumers have completed the test......\n");
+ }
+} \ No newline at end of file
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryProducerController.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryProducerController.java
new file mode 100644
index 0000000000..02377bb853
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryProducerController.java
@@ -0,0 +1,210 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.util.concurrent.CountDownLatch;
+
+import javax.jms.MapMessage;
+
+import org.apache.qpid.thread.Threading;
+import org.apache.qpid.tools.report.MercuryReporter;
+import org.apache.qpid.tools.report.MercuryReporter.MercuryThroughput;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * PerfProducer sends an x no of messages in warmup mode and wait for a confirmation
+ * from the consumer that it has successfully consumed them and ready to start the
+ * test. It will start sending y no of messages and each message will contain a time
+ * stamp. This will be used at the receiving end to measure the latency.
+ *
+ * This is done with the assumption that both consumer and producer are running on
+ * the same machine or different machines which have time synced using a time server.
+ *
+ * This test also calculates the producer rate as follows.
+ * rate = msg_count/(time_before_sending_msgs - time_after_sending_msgs)
+ *
+ * All throughput rates are given as msg/sec so the rates are multiplied by 1000.
+ *
+ * Rajith - Producer rate is not an accurate perf metric IMO.
+ * It is heavily inlfuenced by any in memory buffering.
+ * System throughput and latencies calculated by the PerfConsumer are more realistic
+ * numbers.
+ *
+ * Answer by rajith : I agree about in memory buffering affecting rates. But Based on test runs
+ * I have done so far, it seems quite useful to compute the producer rate as it gives an
+ * indication of how the system behaves. For ex if there is a gap between producer and consumer rates
+ * you could clearly see the higher latencies and when producer and consumer rates are very close,
+ * latency is good.
+ *
+ */
+public class MercuryProducerController extends MercuryBase
+{
+ private static final Logger _logger = LoggerFactory.getLogger(MercuryProducerController.class);
+ MercuryReporter reporter;
+ QpidSend sender;
+
+ public MercuryProducerController(TestConfiguration config, MercuryReporter reporter, String prefix)
+ {
+ super(config,prefix);
+ this.reporter = reporter;
+ System.out.println("Producer ID : " + id);
+ }
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ sender = new QpidSend(reporter,config, con,dest);
+ sender.setUp();
+ MapMessage m = controllerSession.createMapMessage();
+ m.setInt(CODE, OPCode.REGISTER_PRODUCER.ordinal());
+ sendMessageToController(m);
+ }
+
+ public void warmup()throws Exception
+ {
+ receiveFromController(OPCode.PRODUCER_STARTWARMUP);
+ if (_logger.isInfoEnabled())
+ {
+ _logger.info("Producer: " + id + " Warming up......");
+ }
+ sender.send(config.getWarmupCount());
+ sender.sendEndMessage();
+ }
+
+ public void runSender() throws Exception
+ {
+ resetCounters();
+ receiveFromController(OPCode.PRODUCER_START);
+ sender.send(config.getMsgCount());
+ }
+
+ public void resetCounters()
+ {
+ sender.resetCounters();
+ }
+
+ public void sendResults() throws Exception
+ {
+ MapMessage msg = controllerSession.createMapMessage();
+ msg.setInt(CODE, OPCode.RECEIVED_PRODUCER_STATS.ordinal());
+ msg.setDouble(PROD_RATE, reporter.getRate());
+ sendMessageToController(msg);
+ reporter.log(new StringBuilder("Producer rate: ").
+ append(config.getDecimalFormat().format(reporter.getRate())).
+ append(" msg/sec").
+ toString());
+ }
+
+ @Override
+ public void tearDown() throws Exception
+ {
+ sender.tearDown();
+ super.tearDown();
+ }
+
+ public void run()
+ {
+ try
+ {
+ setUp();
+ warmup();
+ boolean nextIteration = true;
+ while (nextIteration)
+ {
+ if(_logger.isInfoEnabled())
+ {
+ _logger.info("=========================================================\n");
+ _logger.info("Producer: " + id + " starting a new iteration ......\n");
+ }
+ runSender();
+ sendResults();
+ nextIteration = continueTest();
+ }
+ tearDown();
+ }
+ catch(Exception e)
+ {
+ handleError(e,"Error when running test");
+ }
+ }
+
+ public void startControllerIfNeeded()
+ {
+ if (!config.isExternalController())
+ {
+ final MercuryTestController controller = new MercuryTestController(config);
+ Runnable r = new Runnable()
+ {
+ public void run()
+ {
+ controller.run();
+ }
+ };
+
+ Thread t;
+ try
+ {
+ t = Threading.getThreadFactory().createThread(r);
+ }
+ catch(Exception e)
+ {
+ throw new Error("Error creating controller thread",e);
+ }
+ t.start();
+ }
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ TestConfiguration config = new JVMArgConfiguration();
+ MercuryReporter reporter= new MercuryReporter(MercuryThroughput.class,System.out,10,true);
+ String scriptId = (args.length == 1) ? args[0] : "";
+ int conCount = config.getConnectionCount();
+ final CountDownLatch testCompleted = new CountDownLatch(conCount);
+ for (int i=0; i < conCount; i++)
+ {
+ final MercuryProducerController prod = new MercuryProducerController(config, reporter, scriptId + i);
+ prod.startControllerIfNeeded();
+ Runnable r = new Runnable()
+ {
+ public void run()
+ {
+ prod.run();
+ testCompleted.countDown();
+ }
+ };
+
+ Thread t;
+ try
+ {
+ t = Threading.getThreadFactory().createThread(r);
+ }
+ catch(Exception e)
+ {
+ throw new Error("Error creating producer thread",e);
+ }
+ t.start();
+ }
+ testCompleted.await();
+ reporter.log("Producers have completed the test......");
+ }
+} \ No newline at end of file
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryTestController.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryTestController.java
new file mode 100644
index 0000000000..8c66a1e44d
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/MercuryTestController.java
@@ -0,0 +1,450 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.io.FileWriter;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CountDownLatch;
+
+import javax.jms.MapMessage;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+
+import org.apache.qpid.client.message.AMQPEncodedMapMessage;
+import org.apache.qpid.tools.report.Reporter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The Controller coordinates a test run between a number
+ * of producers and consumers, configured via -Dprod_count and -Dcons_count.
+ *
+ * It waits till all the producers and consumers have registered and then
+ * conducts a warmup run. Once all consumers and producers have completed
+ * the warmup run and is ready, it will conduct the actual test run and
+ * collect all stats from the participants and calculates the system
+ * throughput, the avg/min/max for producer rates, consumer rates and latency.
+ *
+ * These stats are then printed to std out.
+ * The Controller also prints events to std out to give a running account
+ * of the test run in progress. Ex registering of participants, starting warmup ..etc.
+ * This allows a scripting tool to monitor the progress.
+ *
+ * The Controller can be run in two modes.
+ * 1. A single test run (default) where it just runs until the message count specified
+ * for the producers via -Dmsg_count is sent and received.
+ *
+ * 2. Time based, configured via -Dduration=x, where x is in mins.
+ * In this mode, the Controller repeatedly cycles through the tests (after an initial
+ * warmup run) until the desired time is reached. If a test run is in progress
+ * and the time is up, it will allow the run the complete.
+ *
+ * After each iteration, the stats will be printed out in csv format to a separate log file.
+ * System throughput is calculated as follows
+ * totalMsgCount/(totalTestTime)
+ */
+public class MercuryTestController extends MercuryBase implements MessageListener
+{
+ private static final Logger _logger = LoggerFactory.getLogger(MercuryProducerController.class);
+
+ enum TestMode { SINGLE_RUN, TIME_BASED };
+
+ TestMode testMode = TestMode.SINGLE_RUN;
+
+ long totalTestTime;
+
+ private double avgSystemLatency = 0.0;
+ private double minSystemLatency = Double.MAX_VALUE;
+ private double maxSystemLatency = 0;
+ private double avgSystemLatencyStdDev = 0.0;
+
+ private double avgSystemConsRate = 0.0;
+ private double maxSystemConsRate = 0.0;
+ private double minSystemConsRate = Double.MAX_VALUE;
+
+ private double avgSystemProdRate = 0.0;
+ private double maxSystemProdRate = 0.0;
+ private double minSystemProdRate = Double.MAX_VALUE;
+
+ private long totalMsgCount = 0;
+ private double totalSystemThroughput = 0.0;
+
+ private int consumerCount = Integer.getInteger("cons_count", 1);
+ private int producerCount = Integer.getInteger("prod_count", 1);
+ private int duration = Integer.getInteger("duration", -1); // in mins
+ private Map<String,MapMessage> consumers;
+ private Map<String,MapMessage> producers;
+
+ private CountDownLatch consRegistered;
+ private CountDownLatch prodRegistered;
+ private CountDownLatch consReady;
+ private CountDownLatch prodReady;
+ private CountDownLatch receivedEndMsg;
+ private CountDownLatch receivedConsStats;
+ private CountDownLatch receivedProdStats;
+
+ private MessageConsumer consumer;
+ private boolean printStdDev = false;
+ private FileWriter writer;
+ private Reporter report;
+
+ public MercuryTestController(TestConfiguration config)
+ {
+ super(config,"");
+
+ consumers = new ConcurrentHashMap<String,MapMessage>(consumerCount);
+ producers = new ConcurrentHashMap<String,MapMessage>(producerCount);
+
+ consRegistered = new CountDownLatch(consumerCount);
+ prodRegistered = new CountDownLatch(producerCount);
+ consReady = new CountDownLatch(consumerCount);
+ prodReady = new CountDownLatch(producerCount);
+ printStdDev = config.isPrintStdDev();
+ testMode = (duration == -1) ? TestMode.SINGLE_RUN : TestMode.TIME_BASED;
+ }
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ if (testMode == TestMode.TIME_BASED)
+ {
+ writer = new FileWriter("stats-csv.log");
+ }
+ consumer = controllerSession.createConsumer(controllerQueue);
+ report.log("\nController: " + producerCount + " producers are expected");
+ report.log("Controller: " + consumerCount + " consumers are expected \n");
+ consumer.setMessageListener(this);
+ consRegistered.await();
+ prodRegistered.await();
+ report.log("\nController: All producers and consumers have registered......\n");
+ }
+
+ public void warmup() throws Exception
+ {
+ report.log("Controller initiating warm up sequence......");
+ sendMessageToNodes(OPCode.CONSUMER_STARTWARMUP,consumers.values());
+ sendMessageToNodes(OPCode.PRODUCER_STARTWARMUP,producers.values());
+ prodReady.await();
+ consReady.await();
+ report.log("\nController : All producers and consumers are ready to start the test......\n");
+ }
+
+ public void startTest() throws Exception
+ {
+ resetCounters();
+ report.log("\nController Starting test......");
+ long start = Clock.getTime();
+ sendMessageToNodes(OPCode.PRODUCER_START,producers.values());
+ receivedEndMsg.await();
+ totalTestTime = Clock.getTime() - start;
+ sendMessageToNodes(OPCode.CONSUMER_STOP,consumers.values());
+ receivedProdStats.await();
+ receivedConsStats.await();
+ }
+
+ public void resetCounters()
+ {
+ minSystemLatency = Double.MAX_VALUE;
+ maxSystemLatency = 0;
+ maxSystemConsRate = 0.0;
+ minSystemConsRate = Double.MAX_VALUE;
+ maxSystemProdRate = 0.0;
+ minSystemProdRate = Double.MAX_VALUE;
+
+ totalMsgCount = 0;
+
+ receivedConsStats = new CountDownLatch(consumerCount);
+ receivedProdStats = new CountDownLatch(producerCount);
+ receivedEndMsg = new CountDownLatch(producerCount);
+ }
+
+ public void calcStats() throws Exception
+ {
+ double totLatency = 0.0;
+ double totStdDev = 0.0;
+ double totalConsRate = 0.0;
+ double totalProdRate = 0.0;
+
+ MapMessage conStat = null; // for error handling
+ try
+ {
+ for (MapMessage m: consumers.values())
+ {
+ conStat = m;
+ minSystemLatency = Math.min(minSystemLatency,m.getDouble(MIN_LATENCY));
+ maxSystemLatency = Math.max(maxSystemLatency,m.getDouble(MAX_LATENCY));
+ totLatency = totLatency + m.getDouble(AVG_LATENCY);
+ totStdDev = totStdDev + m.getDouble(STD_DEV);
+
+ minSystemConsRate = Math.min(minSystemConsRate,m.getDouble(CONS_RATE));
+ maxSystemConsRate = Math.max(maxSystemConsRate,m.getDouble(CONS_RATE));
+ totalConsRate = totalConsRate + m.getDouble(CONS_RATE);
+
+ totalMsgCount = totalMsgCount + m.getLong(MSG_COUNT);
+ }
+ }
+ catch(Exception e)
+ {
+ System.err.println("Error calculating stats from Consumer : " + conStat);
+ }
+
+
+ MapMessage prodStat = null; // for error handling
+ try
+ {
+ for (MapMessage m: producers.values())
+ {
+ prodStat = m;
+ minSystemProdRate = Math.min(minSystemProdRate,m.getDouble(PROD_RATE));
+ maxSystemProdRate = Math.max(maxSystemProdRate,m.getDouble(PROD_RATE));
+ totalProdRate = totalProdRate + m.getDouble(PROD_RATE);
+ }
+ }
+ catch(Exception e)
+ {
+ System.err.println("Error calculating stats from Producer : " + conStat);
+ }
+
+ avgSystemLatency = totLatency/consumers.size();
+ avgSystemLatencyStdDev = totStdDev/consumers.size();
+ avgSystemConsRate = totalConsRate/consumers.size();
+ avgSystemProdRate = totalProdRate/producers.size();
+
+ report.log("Total test time : " + totalTestTime + " in " + Clock.getPrecision());
+
+ totalSystemThroughput = (totalMsgCount*Clock.convertToSecs()/totalTestTime);
+ }
+
+ public void printResults() throws Exception
+ {
+ report.log(new StringBuilder("Total Msgs Received : ").append(totalMsgCount).toString());
+ report.log(new StringBuilder("System Throughput : ").
+ append(config.getDecimalFormat().format(totalSystemThroughput)).
+ append(" msg/sec").toString());
+ report.log(new StringBuilder("Avg Consumer rate : ").
+ append(config.getDecimalFormat().format(avgSystemConsRate)).
+ append(" msg/sec").toString());
+ report.log(new StringBuilder("Min Consumer rate : ").
+ append(config.getDecimalFormat().format(minSystemConsRate)).
+ append(" msg/sec").toString());
+ report.log(new StringBuilder("Max Consumer rate : ").
+ append(config.getDecimalFormat().format(maxSystemConsRate)).
+ append(" msg/sec").toString());
+
+ report.log(new StringBuilder("Avg Producer rate : ").
+ append(config.getDecimalFormat().format(avgSystemProdRate)).
+ append(" msg/sec").toString());
+ report.log(new StringBuilder("Min Producer rate : ").
+ append(config.getDecimalFormat().format(minSystemProdRate)).
+ append(" msg/sec").toString());
+ report.log(new StringBuilder("Max Producer rate : ").
+ append(config.getDecimalFormat().format(maxSystemProdRate)).
+ append(" msg/sec").toString());
+
+ report.log(new StringBuilder("Avg System Latency : ").
+ append(config.getDecimalFormat().format(avgSystemLatency)).
+ append(" ms").toString());
+ report.log(new StringBuilder("Min System Latency : ").
+ append(config.getDecimalFormat().format(minSystemLatency)).
+ append(" ms").toString());
+ report.log(new StringBuilder("Max System Latency : ").
+ append(config.getDecimalFormat().format(maxSystemLatency)).
+ append(" ms").toString());
+ if (printStdDev)
+ {
+ report.log(new StringBuilder("Avg System Std Dev : ").
+ append(avgSystemLatencyStdDev).toString());
+ }
+ }
+
+ private synchronized void sendMessageToNodes(OPCode code,Collection<MapMessage> nodes) throws Exception
+ {
+ report.log("\nController: Sending code " + code);
+ MessageProducer tmpProd = controllerSession.createProducer(null);
+ MapMessage msg = controllerSession.createMapMessage();
+ msg.setInt(CODE, code.ordinal());
+ for (MapMessage node : nodes)
+ {
+ if (node.getString(REPLY_ADDR) == null)
+ {
+ report.log("REPLY_ADDR is null " + node);
+ }
+ else
+ {
+ report.log("Controller: Sending " + code + " to " + node.getString(REPLY_ADDR));
+ }
+ tmpProd.send(controllerSession.createQueue(node.getString(REPLY_ADDR)), msg);
+ }
+ }
+
+ public void onMessage(Message msg)
+ {
+ try
+ {
+ MapMessage m = (MapMessage)msg;
+ OPCode code = OPCode.values()[m.getInt(CODE)];
+
+ report.log("\n---------Controller Received Code : " + code);
+ report.log("---------Data : " + ((AMQPEncodedMapMessage)m).getMap());
+
+ switch (code)
+ {
+ case REGISTER_CONSUMER :
+ if (consRegistered.getCount() == 0)
+ {
+ report.log("Warning : Expected number of consumers have already registered," +
+ "ignoring extra consumer");
+ break;
+ }
+ consumers.put(m.getString(ID),m);
+ consRegistered.countDown();
+ break;
+
+ case REGISTER_PRODUCER :
+ if (prodRegistered.getCount() == 0)
+ {
+ report.log("Warning : Expected number of producers have already registered," +
+ "ignoring extra producer");
+ break;
+ }
+ producers.put(m.getString(ID),m);
+ prodRegistered.countDown();
+ break;
+
+ case CONSUMER_READY :
+ consReady.countDown();
+ break;
+
+ case PRODUCER_READY :
+ prodReady.countDown();
+ break;
+
+ case RECEIVED_END_MSG :
+ receivedEndMsg.countDown();
+ break;
+
+ case RECEIVED_CONSUMER_STATS :
+ consumers.put(m.getString(ID),m);
+ receivedConsStats.countDown();
+ break;
+
+ case RECEIVED_PRODUCER_STATS :
+ producers.put(m.getString(ID),m);
+ receivedProdStats.countDown();
+ break;
+
+ default:
+ throw new Exception("Invalid OPCode " + code);
+ }
+ }
+ catch (Exception e)
+ {
+ handleError(e,"Error when receiving messages " + msg);
+ }
+ }
+
+ public void run()
+ {
+ try
+ {
+ setUp();
+ warmup();
+ if (testMode == TestMode.SINGLE_RUN)
+ {
+ startTest();
+ calcStats();
+ printResults();
+ }
+ else
+ {
+ long startTime = Clock.getTime();
+ long timeLimit = duration * 60 * 1000; // duration is in mins.
+ boolean nextIteration = true;
+ while (nextIteration)
+ {
+ startTest();
+ calcStats();
+ writeStatsToFile();
+ if (Clock.getTime() - startTime < timeLimit)
+ {
+ sendMessageToNodes(OPCode.CONTINUE_TEST,consumers.values());
+ sendMessageToNodes(OPCode.CONTINUE_TEST,producers.values());
+ nextIteration = true;
+ }
+ else
+ {
+ nextIteration = false;
+ }
+ }
+ }
+ tearDown();
+
+ }
+ catch(Exception e)
+ {
+ handleError(e,"Error when running test");
+ }
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ report.log("Controller: Completed the test......\n");
+ if (testMode == TestMode.TIME_BASED)
+ {
+ writer.close();
+ }
+ sendMessageToNodes(OPCode.STOP_TEST,consumers.values());
+ sendMessageToNodes(OPCode.STOP_TEST,producers.values());
+ super.tearDown();
+ }
+
+ public void writeStatsToFile() throws Exception
+ {
+ writer.append(String.valueOf(totalMsgCount)).append(",");
+ writer.append(config.getDecimalFormat().format(totalSystemThroughput)).append(",");
+ writer.append(config.getDecimalFormat().format(avgSystemConsRate)).append(",");
+ writer.append(config.getDecimalFormat().format(minSystemConsRate)).append(",");
+ writer.append(config.getDecimalFormat().format(maxSystemConsRate)).append(",");
+ writer.append(config.getDecimalFormat().format(avgSystemProdRate)).append(",");
+ writer.append(config.getDecimalFormat().format(minSystemProdRate)).append(",");
+ writer.append(config.getDecimalFormat().format(maxSystemProdRate)).append(",");
+ writer.append(config.getDecimalFormat().format(avgSystemLatency)).append(",");
+ writer.append(config.getDecimalFormat().format(minSystemLatency)).append(",");
+ writer.append(config.getDecimalFormat().format(maxSystemLatency));
+ if (printStdDev)
+ {
+ writer.append(",").append(String.valueOf(avgSystemLatencyStdDev));
+ }
+ writer.append("\n");
+ writer.flush();
+ }
+
+ public static void main(String[] args)
+ {
+ TestConfiguration config = new JVMArgConfiguration();
+ MercuryTestController controller = new MercuryTestController(config);
+ controller.run();
+ }
+}
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfBase.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfBase.java
deleted file mode 100644
index 121e94cea1..0000000000
--- a/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfBase.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import java.net.InetAddress;
-import java.text.DecimalFormat;
-import java.util.UUID;
-
-import javax.jms.Connection;
-import javax.jms.Destination;
-import javax.jms.MapMessage;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Session;
-
-import org.apache.qpid.client.AMQAnyDestination;
-import org.apache.qpid.client.AMQConnection;
-import org.apache.qpid.client.AMQDestination;
-import org.apache.qpid.client.AMQSession_0_10;
-import org.apache.qpid.framing.AMQShortString;
-import org.apache.qpid.messaging.Address;
-
-public class PerfBase
-{
- public final static String CODE = "CODE";
- public final static String ID = "ID";
- public final static String REPLY_ADDR = "REPLY_ADDR";
- public final static String MAX_LATENCY = "MAX_LATENCY";
- public final static String MIN_LATENCY = "MIN_LATENCY";
- public final static String AVG_LATENCY = "AVG_LATENCY";
- public final static String STD_DEV = "STD_DEV";
- public final static String CONS_RATE = "CONS_RATE";
- public final static String PROD_RATE = "PROD_RATE";
- public final static String MSG_COUNT = "MSG_COUNT";
- public final static String TIMESTAMP = "Timestamp";
-
- String CONTROLLER_ADDR = System.getProperty("CONT_ADDR","CONTROLLER;{create: always, node:{x-declare:{auto-delete:true}}}");
-
- TestParams params;
- Connection con;
- Session session;
- Session controllerSession;
- Destination dest;
- Destination myControlQueue;
- Destination controllerQueue;
- DecimalFormat df = new DecimalFormat("###.##");
- String id;
- String myControlQueueAddr;
-
- MessageProducer sendToController;
- MessageConsumer receiveFromController;
- String prefix = "";
-
- enum OPCode {
- REGISTER_CONSUMER, REGISTER_PRODUCER,
- PRODUCER_STARTWARMUP, CONSUMER_STARTWARMUP,
- CONSUMER_READY, PRODUCER_READY,
- PRODUCER_START,
- RECEIVED_END_MSG, CONSUMER_STOP,
- RECEIVED_PRODUCER_STATS, RECEIVED_CONSUMER_STATS,
- CONTINUE_TEST, STOP_TEST
- };
-
- enum MessageType {
- BYTES, TEXT, MAP, OBJECT;
-
- public static MessageType getType(String s) throws Exception
- {
- if ("text".equalsIgnoreCase(s))
- {
- return TEXT;
- }
- else if ("bytes".equalsIgnoreCase(s))
- {
- return BYTES;
- }
- /*else if ("map".equalsIgnoreCase(s))
- {
- return MAP;
- }
- else if ("object".equalsIgnoreCase(s))
- {
- return OBJECT;
- }*/
- else
- {
- throw new Exception("Unsupported message type");
- }
- }
- };
-
- MessageType msgType = MessageType.BYTES;
-
- public PerfBase(String prefix)
- {
- params = new TestParams();
- String host = "";
- try
- {
- host = InetAddress.getLocalHost().getHostName();
- }
- catch (Exception e)
- {
- }
- id = host + "-" + UUID.randomUUID().toString();
- this.prefix = prefix;
- this.myControlQueueAddr = id + ";{create: always}";
- }
-
- public void setUp() throws Exception
- {
- if (params.getHost().equals("") || params.getPort() == -1)
- {
- con = new AMQConnection(params.getUrl());
- }
- else
- {
- con = new AMQConnection(params.getHost(),params.getPort(),"guest","guest","test","test");
- }
- con.start();
- session = con.createSession(params.isTransacted(),
- params.isTransacted()? Session.SESSION_TRANSACTED:params.getAckMode());
-
- controllerSession = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
- dest = createDestination();
- controllerQueue = new AMQAnyDestination(CONTROLLER_ADDR);
- myControlQueue = session.createQueue(myControlQueueAddr);
- msgType = MessageType.getType(params.getMessageType());
- System.out.println("Using " + msgType + " messages");
-
- sendToController = controllerSession.createProducer(controllerQueue);
- receiveFromController = controllerSession.createConsumer(myControlQueue);
- }
-
- private Destination createDestination() throws Exception
- {
- if (params.isUseUniqueDests())
- {
- System.out.println("Prefix : " + prefix);
- Address addr = Address.parse(params.getAddress());
- AMQAnyDestination temp = new AMQAnyDestination(params.getAddress());
- int type = ((AMQSession_0_10)session).resolveAddressType(temp);
-
- if ( type == AMQDestination.TOPIC_TYPE)
- {
- addr = new Address(addr.getName(),addr.getSubject() + "." + prefix,addr.getOptions());
- System.out.println("Setting subject : " + addr);
- }
- else
- {
- addr = new Address(addr.getName() + "_" + prefix,addr.getSubject(),addr.getOptions());
- System.out.println("Setting name : " + addr);
- }
-
- return new AMQAnyDestination(addr);
- }
- else
- {
- return new AMQAnyDestination(params.getAddress());
- }
- }
-
- public synchronized void sendMessageToController(MapMessage m) throws Exception
- {
- m.setString(ID, id);
- m.setString(REPLY_ADDR,myControlQueueAddr);
- sendToController.send(m);
- }
-
- public void receiveFromController(OPCode expected) throws Exception
- {
- MapMessage m = (MapMessage)receiveFromController.receive();
- OPCode code = OPCode.values()[m.getInt(CODE)];
- System.out.println("Received Code : " + code);
- if (expected != code)
- {
- throw new Exception("Expected OPCode : " + expected + " but received : " + code);
- }
-
- }
-
- public boolean continueTest() throws Exception
- {
- MapMessage m = (MapMessage)receiveFromController.receive();
- OPCode code = OPCode.values()[m.getInt(CODE)];
- System.out.println("Received Code : " + code);
- return (code == OPCode.CONTINUE_TEST);
- }
-
- public void tearDown() throws Exception
- {
- session.close();
- controllerSession.close();
- con.close();
- }
-
- public void handleError(Exception e,String msg)
- {
- StringBuilder sb = new StringBuilder();
- sb.append(msg);
- sb.append(" ");
- sb.append(e.getMessage());
- System.err.println(sb.toString());
- e.printStackTrace();
- }
-}
-
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfConsumer.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfConsumer.java
deleted file mode 100644
index b63892bb51..0000000000
--- a/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfConsumer.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-
-import javax.jms.MapMessage;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.TextMessage;
-
-import org.apache.qpid.client.AMQDestination;
-import org.apache.qpid.thread.Threading;
-
-/**
- * PerfConsumer will receive x no of messages in warmup mode.
- * Once it receives the Start message it will then signal the PerfProducer.
- * It will start recording stats from the first message it receives after
- * the warmup mode is done.
- *
- * The following calculations are done.
- * The important numbers to look at is
- * a) Avg Latency
- * b) System throughput.
- *
- * Latency.
- * =========
- * Currently this test is written with the assumption that either
- * a) The Perf Producer and Consumer are on the same machine
- * b) They are on separate machines that have their time synced via a Time Server
- *
- * In order to calculate latency the producer inserts a timestamp
- * when the message is sent. The consumer will note the current time the message is
- * received and will calculate the latency as follows
- * latency = rcvdTime - msg.getJMSTimestamp()
- *
- * Through out the test it will keep track of the max and min latency to show the
- * variance in latencies.
- *
- * Avg latency is measured by adding all latencies and dividing by the total msgs.
- *
- * Throughput
- * ===========
- * Consumer rate is calculated as
- * rcvdMsgCount/(rcvdTime - startTime)
- *
- * Note that the testStartTime referes to when the producer sent the first message
- * and startTime is when the consumer first received a message.
- *
- * rcvdTime keeps track of when the last message is received.
- *
- * All throughput rates are given as msg/sec so the rates are multiplied by 1000.
- *
- */
-
-public class PerfConsumer extends PerfBase implements MessageListener
-{
- MessageConsumer consumer;
- long maxLatency = 0;
- long minLatency = Long.MAX_VALUE;
- long totalLatency = 0; // to calculate avg latency.
- int rcvdMsgCount = 0;
- long startTime = 0; // to measure consumer throughput
- long rcvdTime = 0;
- boolean transacted = false;
- int transSize = 0;
-
- boolean printStdDev = false;
- List<Long> sample;
-
- final Object lock = new Object();
-
- public PerfConsumer(String prefix)
- {
- super(prefix);
- System.out.println("Consumer ID : " + id);
- }
-
- public void setUp() throws Exception
- {
- super.setUp();
- consumer = session.createConsumer(dest);
- System.out.println("Consumer: " + id + " Receiving messages from : " + ((AMQDestination)dest).getQueueName() + "\n");
-
- // Storing the following two for efficiency
- transacted = params.isTransacted();
- transSize = params.getTransactionSize();
- printStdDev = params.isPrintStdDev();
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.REGISTER_CONSUMER.ordinal());
- sendMessageToController(m);
- }
-
- public void warmup()throws Exception
- {
- receiveFromController(OPCode.CONSUMER_STARTWARMUP);
- Message msg = consumer.receive();
- // This is to ensure we drain the queue before we start the actual test.
- while ( msg != null)
- {
- if (msg.getBooleanProperty("End") == true)
- {
- // It's more realistic for the consumer to signal this.
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.PRODUCER_READY.ordinal());
- sendMessageToController(m);
- }
- msg = consumer.receive(1000);
- }
-
- if (params.isTransacted())
- {
- session.commit();
- }
-
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.CONSUMER_READY.ordinal());
- sendMessageToController(m);
- consumer.setMessageListener(this);
- }
-
- public void startTest() throws Exception
- {
- System.out.println("Consumer: " + id + " Starting test......" + "\n");
- resetCounters();
- }
-
- public void resetCounters()
- {
- rcvdMsgCount = 0;
- maxLatency = 0;
- minLatency = Long.MAX_VALUE;
- totalLatency = 0;
- if (printStdDev)
- {
- sample = null;
- sample = new ArrayList<Long>(params.getMsgCount());
- }
- }
-
- public void sendResults() throws Exception
- {
- receiveFromController(OPCode.CONSUMER_STOP);
-
- double avgLatency = (double)totalLatency/(double)rcvdMsgCount;
- double consRate = (double)rcvdMsgCount*Clock.convertToSecs()/(double)(rcvdTime - startTime);
- double stdDev = 0.0;
- if (printStdDev)
- {
- stdDev = calculateStdDev(avgLatency);
- }
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.RECEIVED_CONSUMER_STATS.ordinal());
- m.setDouble(AVG_LATENCY, avgLatency/Clock.convertToMiliSecs());
- m.setDouble(MIN_LATENCY,minLatency/Clock.convertToMiliSecs());
- m.setDouble(MAX_LATENCY,maxLatency/Clock.convertToMiliSecs());
- m.setDouble(STD_DEV, stdDev/Clock.convertToMiliSecs());
- m.setDouble(CONS_RATE, consRate);
- m.setLong(MSG_COUNT, rcvdMsgCount);
- sendMessageToController(m);
-
- System.out.println(new StringBuilder("Total Msgs Received : ").append(rcvdMsgCount).toString());
- System.out.println(new StringBuilder("Consumer rate : ").
- append(df.format(consRate)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Avg Latency : ").
- append(df.format(avgLatency/Clock.convertToMiliSecs())).
- append(" ms").toString());
- System.out.println(new StringBuilder("Min Latency : ").
- append(df.format(minLatency/Clock.convertToMiliSecs())).
- append(" ms").toString());
- System.out.println(new StringBuilder("Max Latency : ").
- append(df.format(maxLatency/Clock.convertToMiliSecs())).
- append(" ms").toString());
- if (printStdDev)
- {
- System.out.println(new StringBuilder("Std Dev : ").
- append(stdDev/Clock.convertToMiliSecs()).toString());
- }
- }
-
- public double calculateStdDev(double mean)
- {
- double v = 0;
- for (double latency: sample)
- {
- v = v + Math.pow((latency-mean), 2);
- }
- v = v/sample.size();
- return Math.round(Math.sqrt(v));
- }
-
- public void onMessage(Message msg)
- {
- try
- {
- // To figure out the decoding overhead of text
- if (msgType == MessageType.TEXT)
- {
- ((TextMessage)msg).getText();
- }
-
- if (msg.getBooleanProperty("End"))
- {
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.RECEIVED_END_MSG.ordinal());
- sendMessageToController(m);
- }
- else
- {
- rcvdTime = Clock.getTime();
- rcvdMsgCount ++;
-
- if (rcvdMsgCount == 1)
- {
- startTime = rcvdTime;
- }
-
- if (transacted && (rcvdMsgCount % transSize == 0))
- {
- session.commit();
- }
-
- long latency = rcvdTime - msg.getLongProperty(TIMESTAMP);
- maxLatency = Math.max(maxLatency, latency);
- minLatency = Math.min(minLatency, latency);
- totalLatency = totalLatency + latency;
- if (printStdDev)
- {
- sample.add(latency);
- }
- }
-
- }
- catch(Exception e)
- {
- handleError(e,"Error when receiving messages");
- }
-
- }
-
- public void run()
- {
- try
- {
- setUp();
- warmup();
- boolean nextIteration = true;
- while (nextIteration)
- {
- System.out.println("=========================================================\n");
- System.out.println("Consumer: " + id + " starting a new iteration ......\n");
- startTest();
- sendResults();
- nextIteration = continueTest();
- }
- tearDown();
- }
- catch(Exception e)
- {
- handleError(e,"Error when running test");
- }
- }
-
- @Override
- public void tearDown() throws Exception
- {
- super.tearDown();
- }
-
- public static void main(String[] args) throws InterruptedException
- {
- String scriptId = (args.length == 1) ? args[0] : "";
- int conCount = Integer.getInteger("con_count",1);
- final CountDownLatch testCompleted = new CountDownLatch(conCount);
- for (int i=0; i < conCount; i++)
- {
-
- final PerfConsumer cons = new PerfConsumer(scriptId + i);
- Runnable r = new Runnable()
- {
- public void run()
- {
- cons.run();
- testCompleted.countDown();
- }
- };
-
- Thread t;
- try
- {
- t = Threading.getThreadFactory().createThread(r);
- }
- catch(Exception e)
- {
- throw new Error("Error creating consumer thread",e);
- }
- t.start();
-
- }
- testCompleted.await();
- System.out.println("Consumers have completed the test......\n");
- }
-} \ No newline at end of file
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfProducer.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfProducer.java
deleted file mode 100644
index ac6129ab68..0000000000
--- a/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfProducer.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.CountDownLatch;
-
-import javax.jms.BytesMessage;
-import javax.jms.DeliveryMode;
-import javax.jms.MapMessage;
-import javax.jms.Message;
-import javax.jms.MessageProducer;
-
-import org.apache.qpid.client.AMQDestination;
-import org.apache.qpid.thread.Threading;
-
-/**
- * PerfProducer sends an x no of messages in warmup mode and wait for a confirmation
- * from the consumer that it has successfully consumed them and ready to start the
- * test. It will start sending y no of messages and each message will contain a time
- * stamp. This will be used at the receiving end to measure the latency.
- *
- * This is done with the assumption that both consumer and producer are running on
- * the same machine or different machines which have time synced using a time server.
- *
- * This test also calculates the producer rate as follows.
- * rate = msg_count/(time_before_sending_msgs - time_after_sending_msgs)
- *
- * All throughput rates are given as msg/sec so the rates are multiplied by 1000.
- *
- * Rajith - Producer rate is not an accurate perf metric IMO.
- * It is heavily inlfuenced by any in memory buffering.
- * System throughput and latencies calculated by the PerfConsumer are more realistic
- * numbers.
- *
- * Answer by rajith : I agree about in memory buffering affecting rates. But Based on test runs
- * I have done so far, it seems quite useful to compute the producer rate as it gives an
- * indication of how the system behaves. For ex if there is a gap between producer and consumer rates
- * you could clearly see the higher latencies and when producer and consumer rates are very close,
- * latency is good.
- *
- */
-public class PerfProducer extends PerfBase
-{
- private static long SEC = 60000;
-
- MessageProducer producer;
- Message msg;
- Object payload;
- List<Object> payloads;
- boolean cacheMsg = false;
- boolean randomMsgSize = false;
- boolean durable = false;
- Random random;
- int msgSizeRange = 1024;
- boolean rateLimitProducer = false;
- double rateFactor = 0.4;
- double rate = 0.0;
-
- public PerfProducer(String prefix)
- {
- super(prefix);
- System.out.println("Producer ID : " + id);
- }
-
- public void setUp() throws Exception
- {
- super.setUp();
- durable = params.isDurable();
- rateLimitProducer = params.getRate() > 0 ? true : false;
- if (rateLimitProducer)
- {
- System.out.println("The test will attempt to limit the producer to " + params.getRate() + " msg/sec");
- }
-
- // if message caching is enabled we pre create the message
- // else we pre create the payload
- if (params.isCacheMessage())
- {
- cacheMsg = true;
- msg = createMessage(createPayload(params.getMsgSize()));
- msg.setJMSDeliveryMode(durable?
- DeliveryMode.PERSISTENT :
- DeliveryMode.NON_PERSISTENT
- );
- }
- else if (params.isRandomMsgSize())
- {
- random = new Random(20080921);
- randomMsgSize = true;
- msgSizeRange = params.getMsgSize();
- payloads = new ArrayList<Object>(msgSizeRange);
-
- for (int i=0; i < msgSizeRange; i++)
- {
- payloads.add(createPayload(i));
- }
- }
- else
- {
- payload = createPayload(params.getMsgSize());
- }
-
- producer = session.createProducer(dest);
- System.out.println("Producer: " + id + " Sending messages to: " + ((AMQDestination)dest).getQueueName());
- producer.setDisableMessageID(params.isDisableMessageID());
- producer.setDisableMessageTimestamp(params.isDisableTimestamp());
-
- MapMessage m = controllerSession.createMapMessage();
- m.setInt(CODE, OPCode.REGISTER_PRODUCER.ordinal());
- sendMessageToController(m);
- }
-
- Object createPayload(int size)
- {
- if (msgType == MessageType.TEXT)
- {
- return MessageFactory.createMessagePayload(size);
- }
- else
- {
- return MessageFactory.createMessagePayload(size).getBytes();
- }
- }
-
- Message createMessage(Object payload) throws Exception
- {
- if (msgType == MessageType.TEXT)
- {
- return session.createTextMessage((String)payload);
- }
- else
- {
- BytesMessage m = session.createBytesMessage();
- m.writeBytes((byte[])payload);
- return m;
- }
- }
-
- protected Message getNextMessage() throws Exception
- {
- if (cacheMsg)
- {
- return msg;
- }
- else
- {
- Message m;
-
- if (!randomMsgSize)
- {
- m = createMessage(payload);
- }
- else
- {
- m = createMessage(payloads.get(random.nextInt(msgSizeRange)));
- }
- m.setJMSDeliveryMode(durable?
- DeliveryMode.PERSISTENT :
- DeliveryMode.NON_PERSISTENT
- );
- return m;
- }
- }
-
- public void warmup()throws Exception
- {
- receiveFromController(OPCode.PRODUCER_STARTWARMUP);
- System.out.println("Producer: " + id + " Warming up......");
-
- for (int i=0; i < params.getWarmupCount() -1; i++)
- {
- producer.send(getNextMessage());
- }
- sendEndMessage();
-
- if (params.isTransacted())
- {
- session.commit();
- }
- }
-
- public void startTest() throws Exception
- {
- resetCounters();
- receiveFromController(OPCode.PRODUCER_START);
- int count = params.getMsgCount();
- boolean transacted = params.isTransacted();
- int tranSize = params.getTransactionSize();
-
- long limit = (long)(params.getRate() * rateFactor); // in msecs
- long timeLimit = (long)(SEC * rateFactor); // in msecs
-
- long start = Clock.getTime(); // defaults to nano secs
- long interval = start;
- for(int i=0; i < count; i++ )
- {
- Message msg = getNextMessage();
- msg.setLongProperty(TIMESTAMP, Clock.getTime());
- producer.send(msg);
- if ( transacted && ((i+1) % tranSize == 0))
- {
- session.commit();
- }
-
- if (rateLimitProducer && i%limit == 0)
- {
- long elapsed = (Clock.getTime() - interval)*Clock.convertToMiliSecs(); // in msecs
- if (elapsed < timeLimit)
- {
- Thread.sleep(elapsed);
- }
- interval = Clock.getTime();
-
- }
- }
- sendEndMessage();
- if ( transacted)
- {
- session.commit();
- }
- long time = Clock.getTime() - start;
- rate = (double)count*Clock.convertToSecs()/(double)time;
- System.out.println(new StringBuilder("Producer rate: ").
- append(df.format(rate)).
- append(" msg/sec").
- toString());
- }
-
- public void resetCounters()
- {
-
- }
-
- public void sendEndMessage() throws Exception
- {
- Message msg = session.createMessage();
- msg.setBooleanProperty("End", true);
- producer.send(msg);
- }
-
- public void sendResults() throws Exception
- {
- MapMessage msg = controllerSession.createMapMessage();
- msg.setInt(CODE, OPCode.RECEIVED_PRODUCER_STATS.ordinal());
- msg.setDouble(PROD_RATE, rate);
- sendMessageToController(msg);
- }
-
- @Override
- public void tearDown() throws Exception
- {
- super.tearDown();
- }
-
- public void run()
- {
- try
- {
- setUp();
- warmup();
- boolean nextIteration = true;
- while (nextIteration)
- {
- System.out.println("=========================================================\n");
- System.out.println("Producer: " + id + " starting a new iteration ......\n");
- startTest();
- sendResults();
- nextIteration = continueTest();
- }
- tearDown();
- }
- catch(Exception e)
- {
- handleError(e,"Error when running test");
- }
- }
-
- public void startControllerIfNeeded()
- {
- if (!params.isExternalController())
- {
- final PerfTestController controller = new PerfTestController();
- Runnable r = new Runnable()
- {
- public void run()
- {
- controller.run();
- }
- };
-
- Thread t;
- try
- {
- t = Threading.getThreadFactory().createThread(r);
- }
- catch(Exception e)
- {
- throw new Error("Error creating controller thread",e);
- }
- t.start();
- }
- }
-
-
- public static void main(String[] args) throws InterruptedException
- {
- String scriptId = (args.length == 1) ? args[0] : "";
- int conCount = Integer.getInteger("con_count",1);
- final CountDownLatch testCompleted = new CountDownLatch(conCount);
- for (int i=0; i < conCount; i++)
- {
- final PerfProducer prod = new PerfProducer(scriptId + i);
- prod.startControllerIfNeeded();
- Runnable r = new Runnable()
- {
- public void run()
- {
- prod.run();
- testCompleted.countDown();
- }
- };
-
- Thread t;
- try
- {
- t = Threading.getThreadFactory().createThread(r);
- }
- catch(Exception e)
- {
- throw new Error("Error creating producer thread",e);
- }
- t.start();
- }
- testCompleted.await();
- System.out.println("Producers have completed the test......");
- }
-} \ No newline at end of file
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfTestController.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfTestController.java
deleted file mode 100644
index 5fca1fa4bd..0000000000
--- a/qpid/java/tools/src/main/java/org/apache/qpid/tools/PerfTestController.java
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import java.io.FileWriter;
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
-
-import javax.jms.MapMessage;
-import javax.jms.Message;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageListener;
-import javax.jms.MessageProducer;
-
-import org.apache.qpid.client.message.AMQPEncodedMapMessage;
-
-/**
- * The Controller coordinates a test run between a number
- * of producers and consumers, configured via -Dprod_count and -Dcons_count.
- *
- * It waits till all the producers and consumers have registered and then
- * conducts a warmup run. Once all consumers and producers have completed
- * the warmup run and is ready, it will conduct the actual test run and
- * collect all stats from the participants and calculates the system
- * throughput, the avg/min/max for producer rates, consumer rates and latency.
- *
- * These stats are then printed to std out.
- * The Controller also prints events to std out to give a running account
- * of the test run in progress. Ex registering of participants, starting warmup ..etc.
- * This allows a scripting tool to monitor the progress.
- *
- * The Controller can be run in two modes.
- * 1. A single test run (default) where it just runs until the message count specified
- * for the producers via -Dmsg_count is sent and received.
- *
- * 2. Time based, configured via -Dduration=x, where x is in mins.
- * In this mode, the Controller repeatedly cycles through the tests (after an initial
- * warmup run) until the desired time is reached. If a test run is in progress
- * and the time is up, it will allow the run the complete.
- *
- * After each iteration, the stats will be printed out in csv format to a separate log file.
- * System throughput is calculated as follows
- * totalMsgCount/(totalTestTime)
- */
-public class PerfTestController extends PerfBase implements MessageListener
-{
- enum TestMode { SINGLE_RUN, TIME_BASED };
-
- TestMode testMode = TestMode.SINGLE_RUN;
-
- long totalTestTime;
-
- private double avgSystemLatency = 0.0;
- private double minSystemLatency = Double.MAX_VALUE;
- private double maxSystemLatency = 0;
- private double avgSystemLatencyStdDev = 0.0;
-
- private double avgSystemConsRate = 0.0;
- private double maxSystemConsRate = 0.0;
- private double minSystemConsRate = Double.MAX_VALUE;
-
- private double avgSystemProdRate = 0.0;
- private double maxSystemProdRate = 0.0;
- private double minSystemProdRate = Double.MAX_VALUE;
-
- private long totalMsgCount = 0;
- private double totalSystemThroughput = 0.0;
-
- private int consumerCount = Integer.getInteger("cons_count", 1);
- private int producerCount = Integer.getInteger("prod_count", 1);
- private int duration = Integer.getInteger("duration", -1); // in mins
- private Map<String,MapMessage> consumers;
- private Map<String,MapMessage> producers;
-
- private CountDownLatch consRegistered;
- private CountDownLatch prodRegistered;
- private CountDownLatch consReady;
- private CountDownLatch prodReady;
- private CountDownLatch receivedEndMsg;
- private CountDownLatch receivedConsStats;
- private CountDownLatch receivedProdStats;
-
- private MessageConsumer consumer;
- private boolean printStdDev = false;
- FileWriter writer;
-
- public PerfTestController()
- {
- super("");
- consumers = new ConcurrentHashMap<String,MapMessage>(consumerCount);
- producers = new ConcurrentHashMap<String,MapMessage>(producerCount);
-
- consRegistered = new CountDownLatch(consumerCount);
- prodRegistered = new CountDownLatch(producerCount);
- consReady = new CountDownLatch(consumerCount);
- prodReady = new CountDownLatch(producerCount);
- printStdDev = params.isPrintStdDev();
- testMode = (duration == -1) ? TestMode.SINGLE_RUN : TestMode.TIME_BASED;
- }
-
- public void setUp() throws Exception
- {
- super.setUp();
- if (testMode == TestMode.TIME_BASED)
- {
- writer = new FileWriter("stats-csv.log");
- }
- consumer = controllerSession.createConsumer(controllerQueue);
- System.out.println("\nController: " + producerCount + " producers are expected");
- System.out.println("Controller: " + consumerCount + " consumers are expected \n");
- consumer.setMessageListener(this);
- consRegistered.await();
- prodRegistered.await();
- System.out.println("\nController: All producers and consumers have registered......\n");
- }
-
- public void warmup() throws Exception
- {
- System.out.println("Controller initiating warm up sequence......");
- sendMessageToNodes(OPCode.CONSUMER_STARTWARMUP,consumers.values());
- sendMessageToNodes(OPCode.PRODUCER_STARTWARMUP,producers.values());
- prodReady.await();
- consReady.await();
- System.out.println("\nController : All producers and consumers are ready to start the test......\n");
- }
-
- public void startTest() throws Exception
- {
- resetCounters();
- System.out.println("\nController Starting test......");
- long start = Clock.getTime();
- sendMessageToNodes(OPCode.PRODUCER_START,producers.values());
- receivedEndMsg.await();
- totalTestTime = Clock.getTime() - start;
- sendMessageToNodes(OPCode.CONSUMER_STOP,consumers.values());
- receivedProdStats.await();
- receivedConsStats.await();
- }
-
- public void resetCounters()
- {
- minSystemLatency = Double.MAX_VALUE;
- maxSystemLatency = 0;
- maxSystemConsRate = 0.0;
- minSystemConsRate = Double.MAX_VALUE;
- maxSystemProdRate = 0.0;
- minSystemProdRate = Double.MAX_VALUE;
-
- totalMsgCount = 0;
-
- receivedConsStats = new CountDownLatch(consumerCount);
- receivedProdStats = new CountDownLatch(producerCount);
- receivedEndMsg = new CountDownLatch(producerCount);
- }
-
- public void calcStats() throws Exception
- {
- double totLatency = 0.0;
- double totStdDev = 0.0;
- double totalConsRate = 0.0;
- double totalProdRate = 0.0;
-
- MapMessage conStat = null; // for error handling
- try
- {
- for (MapMessage m: consumers.values())
- {
- conStat = m;
- minSystemLatency = Math.min(minSystemLatency,m.getDouble(MIN_LATENCY));
- maxSystemLatency = Math.max(maxSystemLatency,m.getDouble(MAX_LATENCY));
- totLatency = totLatency + m.getDouble(AVG_LATENCY);
- totStdDev = totStdDev + m.getDouble(STD_DEV);
-
- minSystemConsRate = Math.min(minSystemConsRate,m.getDouble(CONS_RATE));
- maxSystemConsRate = Math.max(maxSystemConsRate,m.getDouble(CONS_RATE));
- totalConsRate = totalConsRate + m.getDouble(CONS_RATE);
-
- totalMsgCount = totalMsgCount + m.getLong(MSG_COUNT);
- }
- }
- catch(Exception e)
- {
- System.out.println("Error calculating stats from Consumer : " + conStat);
- }
-
-
- MapMessage prodStat = null; // for error handling
- try
- {
- for (MapMessage m: producers.values())
- {
- prodStat = m;
- minSystemProdRate = Math.min(minSystemProdRate,m.getDouble(PROD_RATE));
- maxSystemProdRate = Math.max(maxSystemProdRate,m.getDouble(PROD_RATE));
- totalProdRate = totalProdRate + m.getDouble(PROD_RATE);
- }
- }
- catch(Exception e)
- {
- System.out.println("Error calculating stats from Producer : " + conStat);
- }
-
- avgSystemLatency = totLatency/consumers.size();
- avgSystemLatencyStdDev = totStdDev/consumers.size();
- avgSystemConsRate = totalConsRate/consumers.size();
- avgSystemProdRate = totalProdRate/producers.size();
-
- System.out.println("Total test time : " + totalTestTime + " in " + Clock.getPrecision());
-
- totalSystemThroughput = (totalMsgCount*Clock.convertToSecs()/totalTestTime);
- }
-
- public void printResults() throws Exception
- {
- System.out.println(new StringBuilder("Total Msgs Received : ").append(totalMsgCount).toString());
- System.out.println(new StringBuilder("System Throughput : ").
- append(df.format(totalSystemThroughput)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Avg Consumer rate : ").
- append(df.format(avgSystemConsRate)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Min Consumer rate : ").
- append(df.format(minSystemConsRate)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Max Consumer rate : ").
- append(df.format(maxSystemConsRate)).
- append(" msg/sec").toString());
-
- System.out.println(new StringBuilder("Avg Producer rate : ").
- append(df.format(avgSystemProdRate)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Min Producer rate : ").
- append(df.format(minSystemProdRate)).
- append(" msg/sec").toString());
- System.out.println(new StringBuilder("Max Producer rate : ").
- append(df.format(maxSystemProdRate)).
- append(" msg/sec").toString());
-
- System.out.println(new StringBuilder("Avg System Latency : ").
- append(df.format(avgSystemLatency)).
- append(" ms").toString());
- System.out.println(new StringBuilder("Min System Latency : ").
- append(df.format(minSystemLatency)).
- append(" ms").toString());
- System.out.println(new StringBuilder("Max System Latency : ").
- append(df.format(maxSystemLatency)).
- append(" ms").toString());
- if (printStdDev)
- {
- System.out.println(new StringBuilder("Avg System Std Dev : ").
- append(avgSystemLatencyStdDev));
- }
- }
-
- private synchronized void sendMessageToNodes(OPCode code,Collection<MapMessage> nodes) throws Exception
- {
- System.out.println("\nController: Sending code " + code);
- MessageProducer tmpProd = controllerSession.createProducer(null);
- MapMessage msg = controllerSession.createMapMessage();
- msg.setInt(CODE, code.ordinal());
- for (MapMessage node : nodes)
- {
- if (node.getString(REPLY_ADDR) == null)
- {
- System.out.println("REPLY_ADDR is null " + node);
- }
- else
- {
- System.out.println("Controller: Sending " + code + " to " + node.getString(REPLY_ADDR));
- }
- tmpProd.send(controllerSession.createQueue(node.getString(REPLY_ADDR)), msg);
- }
- }
-
- public void onMessage(Message msg)
- {
- try
- {
- MapMessage m = (MapMessage)msg;
- OPCode code = OPCode.values()[m.getInt(CODE)];
-
- System.out.println("\n---------Controller Received Code : " + code);
- System.out.println("---------Data : " + ((AMQPEncodedMapMessage)m).getMap());
-
- switch (code)
- {
- case REGISTER_CONSUMER :
- if (consRegistered.getCount() == 0)
- {
- System.out.println("Warning : Expected number of consumers have already registered," +
- "ignoring extra consumer");
- break;
- }
- consumers.put(m.getString(ID),m);
- consRegistered.countDown();
- break;
-
- case REGISTER_PRODUCER :
- if (prodRegistered.getCount() == 0)
- {
- System.out.println("Warning : Expected number of producers have already registered," +
- "ignoring extra producer");
- break;
- }
- producers.put(m.getString(ID),m);
- prodRegistered.countDown();
- break;
-
- case CONSUMER_READY :
- consReady.countDown();
- break;
-
- case PRODUCER_READY :
- prodReady.countDown();
- break;
-
- case RECEIVED_END_MSG :
- receivedEndMsg.countDown();
- break;
-
- case RECEIVED_CONSUMER_STATS :
- consumers.put(m.getString(ID),m);
- receivedConsStats.countDown();
- break;
-
- case RECEIVED_PRODUCER_STATS :
- producers.put(m.getString(ID),m);
- receivedProdStats.countDown();
- break;
-
- default:
- throw new Exception("Invalid OPCode " + code);
- }
- }
- catch (Exception e)
- {
- handleError(e,"Error when receiving messages " + msg);
- }
- }
-
- public void run()
- {
- try
- {
- setUp();
- warmup();
- if (testMode == TestMode.SINGLE_RUN)
- {
- startTest();
- calcStats();
- printResults();
- }
- else
- {
- long startTime = Clock.getTime();
- long timeLimit = duration * 60 * 1000; // duration is in mins.
- boolean nextIteration = true;
- while (nextIteration)
- {
- startTest();
- calcStats();
- writeStatsToFile();
- if (Clock.getTime() - startTime < timeLimit)
- {
- sendMessageToNodes(OPCode.CONTINUE_TEST,consumers.values());
- sendMessageToNodes(OPCode.CONTINUE_TEST,producers.values());
- nextIteration = true;
- }
- else
- {
- nextIteration = false;
- }
- }
- }
- tearDown();
-
- }
- catch(Exception e)
- {
- handleError(e,"Error when running test");
- }
- }
-
- @Override
- public void tearDown() throws Exception {
- System.out.println("Controller: Completed the test......\n");
- if (testMode == TestMode.TIME_BASED)
- {
- writer.close();
- }
- sendMessageToNodes(OPCode.STOP_TEST,consumers.values());
- sendMessageToNodes(OPCode.STOP_TEST,producers.values());
- super.tearDown();
- }
-
- public void writeStatsToFile() throws Exception
- {
- writer.append(String.valueOf(totalMsgCount)).append(",");
- writer.append(df.format(totalSystemThroughput)).append(",");
- writer.append(df.format(avgSystemConsRate)).append(",");
- writer.append(df.format(minSystemConsRate)).append(",");
- writer.append(df.format(maxSystemConsRate)).append(",");
- writer.append(df.format(avgSystemProdRate)).append(",");
- writer.append(df.format(minSystemProdRate)).append(",");
- writer.append(df.format(maxSystemProdRate)).append(",");
- writer.append(df.format(avgSystemLatency)).append(",");
- writer.append(df.format(minSystemLatency)).append(",");
- writer.append(df.format(maxSystemLatency));
- if (printStdDev)
- {
- writer.append(",").append(String.valueOf(avgSystemLatencyStdDev));
- }
- writer.append("\n");
- writer.flush();
- }
-
- public static void main(String[] args)
- {
- PerfTestController controller = new PerfTestController();
- controller.run();
- }
-}
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/QpidReceive.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/QpidReceive.java
new file mode 100644
index 0000000000..02f011f1b9
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/QpidReceive.java
@@ -0,0 +1,181 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
+
+import javax.jms.Connection;
+import javax.jms.Destination;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.tools.TestConfiguration.MessageType;
+import org.apache.qpid.tools.report.BasicReporter;
+import org.apache.qpid.tools.report.Reporter;
+import org.apache.qpid.tools.report.Statistics.Throughput;
+import org.apache.qpid.tools.report.Statistics.ThroughputAndLatency;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class QpidReceive implements MessageListener
+{
+ private static final Logger _logger = LoggerFactory.getLogger(QpidSend.class);
+ private final CountDownLatch testCompleted = new CountDownLatch(1);
+
+ private Connection con;
+ private Session session;
+ private Destination dest;
+ private MessageConsumer consumer;
+ private boolean transacted = false;
+ private boolean isRollback = false;
+ private int txSize = 0;
+ private int rollbackFrequency = 0;
+ private int ackFrequency = 0;
+ private int expected = 0;
+ private int received = 0;
+ private Reporter report;
+ private TestConfiguration config;
+
+ public QpidReceive(Reporter report, TestConfiguration config, Connection con, Destination dest)
+ {
+ this(report,config, con, dest, UUID.randomUUID().toString());
+ }
+
+ public QpidReceive(Reporter report, TestConfiguration config, Connection con, Destination dest, String prefix)
+ {
+ //System.out.println("Producer ID : " + id);
+ this.report = report;
+ this.config = config;
+ this.con = con;
+ this.dest = dest;
+ }
+
+ public void setUp() throws Exception
+ {
+ if (config.isTransacted())
+ {
+ session = con.createSession(true, Session.SESSION_TRANSACTED);
+ }
+ else if (config.getAckFrequency() > 0)
+ {
+ session = con.createSession(false, Session.DUPS_OK_ACKNOWLEDGE);
+ }
+ else
+ {
+ session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ }
+ consumer = session.createConsumer(dest);
+ consumer.setMessageListener(this);
+ System.out.println("Consumer: " + /*id +*/ " Receiving messages from : " + ((AMQDestination)dest).getAddressName() + "\n");
+
+ transacted = config.isTransacted();
+ txSize = config.getTransactionSize();
+ isRollback = config.getRollbackFrequency() > 0;
+ rollbackFrequency = config.getRollbackFrequency();
+ ackFrequency = config.getAckFrequency();
+ }
+
+ public void resetCounters()
+ {
+ received = 0;
+ expected = 0;
+ report.clear();
+ }
+
+ public void onMessage(Message msg)
+ {
+ try
+ {
+ if (msg instanceof TextMessage &&
+ TestConfiguration.EOS.equals(((TextMessage)msg).getText()))
+ {
+ testCompleted.countDown();
+ return;
+ }
+
+ received++;
+ report.message(msg);
+
+ if (transacted && (received % txSize == 0))
+ {
+ if (isRollback && (received % rollbackFrequency == 0))
+ {
+ session.rollback();
+ }
+ else
+ {
+ session.commit();
+ }
+ }
+ else if (ackFrequency > 0)
+ {
+ msg.acknowledge();
+ }
+
+ if (expected >= received)
+ {
+ testCompleted.countDown();
+ }
+
+ }
+ catch(Exception e)
+ {
+ _logger.error("Error when receiving messages",e);
+ }
+
+ }
+
+ public void waitforCompletion(int expected) throws Exception
+ {
+ this.expected = expected;
+ testCompleted.await();
+ }
+
+ public void tearDown() throws Exception
+ {
+ session.close();
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ TestConfiguration config = new JVMArgConfiguration();
+ Reporter reporter = new BasicReporter(config.isReportLatency()? ThroughputAndLatency.class : Throughput.class,
+ System.out,
+ config.reportEvery(),
+ config.isReportHeader()
+ );
+ Destination dest = AMQDestination.createDestination(config.getAddress());
+ QpidReceive receiver = new QpidReceive(reporter,config, config.createConnection(),dest);
+ receiver.setUp();
+ receiver.waitforCompletion(config.getMsgCount());
+ if (config.isReportTotal())
+ {
+ reporter.report();
+ }
+ receiver.tearDown();
+ }
+
+}
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/QpidSend.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/QpidSend.java
new file mode 100644
index 0000000000..c058b83d41
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/QpidSend.java
@@ -0,0 +1,291 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.UUID;
+
+import javax.jms.BytesMessage;
+import javax.jms.Connection;
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.Message;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+
+import org.apache.qpid.client.AMQDestination;
+import org.apache.qpid.tools.TestConfiguration.MessageType;
+import org.apache.qpid.tools.report.BasicReporter;
+import org.apache.qpid.tools.report.Reporter;
+import org.apache.qpid.tools.report.Statistics.Throughput;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class QpidSend
+{
+ private Connection con;
+ private Session session;
+ private Destination dest;
+ private MessageProducer producer;
+ private MessageType msgType;
+ private Message msg;
+ private Object payload;
+ private List<Object> payloads;
+ private boolean cacheMsg = false;
+ private boolean randomMsgSize = false;
+ private boolean durable = false;
+ private Random random;
+ private int msgSizeRange = 1024;
+ private int totalMsgCount = 0;
+ private boolean rateLimitProducer = false;
+ private boolean transacted = false;
+ private int txSize = 0;
+
+ private static final Logger _logger = LoggerFactory.getLogger(QpidSend.class);
+ Reporter report;
+ TestConfiguration config;
+
+ public QpidSend(Reporter report, TestConfiguration config, Connection con, Destination dest)
+ {
+ this(report,config, con, dest, UUID.randomUUID().toString());
+ }
+
+ public QpidSend(Reporter report, TestConfiguration config, Connection con, Destination dest, String prefix)
+ {
+ //System.out.println("Producer ID : " + id);
+ this.report = report;
+ this.config = config;
+ this.con = con;
+ this.dest = dest;
+ }
+
+ public void setUp() throws Exception
+ {
+ if (config.isTransacted())
+ {
+ session = con.createSession(true, Session.SESSION_TRANSACTED);
+ }
+ else
+ {
+ session = con.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ }
+
+ durable = config.isDurable();
+ rateLimitProducer = config.getSendRate() > 0 ? true : false;
+ if (_logger.isDebugEnabled() && rateLimitProducer)
+ {
+ System.out.println("The test will attempt to limit the producer to " + config.getSendRate() + " msg/sec");
+ }
+
+ transacted = config.isTransacted();
+ txSize = config.getTransactionSize();
+
+ msgType = MessageType.getType(config.getMessageType());
+ // if message caching is enabled we pre create the message
+ // else we pre create the payload
+ if (config.isCacheMessage())
+ {
+ cacheMsg = true;
+ msg = createMessage(createPayload(config.getMsgSize()));
+ msg.setJMSDeliveryMode(durable?
+ DeliveryMode.PERSISTENT :
+ DeliveryMode.NON_PERSISTENT
+ );
+ }
+ else if (config.isRandomMsgSize())
+ {
+ random = new Random(20080921);
+ randomMsgSize = true;
+ msgSizeRange = config.getMsgSize();
+ payloads = new ArrayList<Object>(msgSizeRange);
+
+ for (int i=0; i < msgSizeRange; i++)
+ {
+ payloads.add(createPayload(i));
+ }
+ }
+ else
+ {
+ payload = createPayload(config.getMsgSize());
+ }
+
+ producer = session.createProducer(dest);
+ if (_logger.isDebugEnabled())
+ {
+ System.out.println("Producer: " + /*id +*/ " Sending messages to: " + ((AMQDestination)dest).getAddressName());
+ }
+ producer.setDisableMessageID(config.isDisableMessageID());
+ producer.setDisableMessageTimestamp(config.isDisableTimestamp());
+ }
+
+ Object createPayload(int size)
+ {
+ if (msgType == MessageType.TEXT)
+ {
+ return MessageFactory.createMessagePayload(size);
+ }
+ else
+ {
+ return MessageFactory.createMessagePayload(size).getBytes();
+ }
+ }
+
+ Message createMessage(Object payload) throws Exception
+ {
+ if (msgType == MessageType.TEXT)
+ {
+ return session.createTextMessage((String)payload);
+ }
+ else
+ {
+ BytesMessage m = session.createBytesMessage();
+ m.writeBytes((byte[])payload);
+ return m;
+ }
+ }
+
+ protected Message getNextMessage() throws Exception
+ {
+ if (cacheMsg)
+ {
+ return msg;
+ }
+ else
+ {
+ Message m;
+
+ if (!randomMsgSize)
+ {
+ m = createMessage(payload);
+ }
+ else
+ {
+ m = createMessage(payloads.get(random.nextInt(msgSizeRange)));
+ }
+ m.setJMSDeliveryMode(durable?
+ DeliveryMode.PERSISTENT :
+ DeliveryMode.NON_PERSISTENT
+ );
+ return m;
+ }
+ }
+
+ public void commit() throws Exception
+ {
+ session.commit();
+ }
+
+ public void send() throws Exception
+ {
+ send(config.getMsgCount());
+ }
+
+ public void send(int count) throws Exception
+ {
+ int sendRate = config.getSendRate();
+ if (rateLimitProducer)
+ {
+ int iterations = count/sendRate;
+ int remainder = count%sendRate;
+ for (int i=0; i < iterations; i++)
+ {
+ long iterationStart = Clock.getTime();
+ sendMessages(sendRate);
+ long elapsed = (Clock.getTime() - iterationStart)*Clock.convertToMiliSecs();
+ long diff = Clock.SEC - elapsed;
+ if (diff > 0)
+ {
+ // We have sent more messages in a sec than specified by the rate.
+ Thread.sleep(diff);
+ }
+ }
+ sendMessages(remainder);
+ }
+ else
+ {
+ sendMessages(count);
+ }
+ }
+
+ private void sendMessages(int count) throws Exception
+ {
+ boolean isTimestamp = config.isReportLatency();
+ for(int i=0; i < count; i++ )
+ {
+ Message msg = getNextMessage();
+ if (isTimestamp)
+ {
+ msg.setLongProperty(TestConfiguration.TIMESTAMP, Clock.getTime());
+ }
+ producer.send(msg);
+ report.message(msg);
+ totalMsgCount++;
+
+ if ( transacted && ((totalMsgCount) % txSize == 0))
+ {
+ session.commit();
+ }
+ }
+ }
+
+ public void resetCounters()
+ {
+ totalMsgCount = 0;
+ report.clear();
+ }
+
+ public void sendEndMessage() throws Exception
+ {
+ Message msg = session.createMessage();
+ msg.setBooleanProperty(TestConfiguration.EOS, true);
+ producer.send(msg);
+ }
+
+ public void tearDown() throws Exception
+ {
+ session.close();
+ }
+
+ public static void main(String[] args) throws Exception
+ {
+ TestConfiguration config = new JVMArgConfiguration();
+ Reporter reporter = new BasicReporter(Throughput.class,
+ System.out,
+ config.reportEvery(),
+ config.isReportHeader()
+ );
+ Destination dest = AMQDestination.createDestination(config.getAddress());
+ QpidSend sender = new QpidSend(reporter,config, config.createConnection(),dest);
+ sender.setUp();
+ sender.send();
+ if (config.getSendEOS() > 0)
+ {
+ sender.sendEndMessage();
+ }
+ if (config.isReportTotal())
+ {
+ reporter.report();
+ }
+ sender.tearDown();
+ }
+}
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/TestConfiguration.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/TestConfiguration.java
new file mode 100644
index 0000000000..7f7df0e5e6
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/TestConfiguration.java
@@ -0,0 +1,126 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools;
+
+import java.text.DecimalFormat;
+
+import javax.jms.Connection;
+
+public interface TestConfiguration
+{
+ enum MessageType {
+ BYTES, TEXT, MAP, OBJECT;
+
+ public static MessageType getType(String s) throws Exception
+ {
+ if ("text".equalsIgnoreCase(s))
+ {
+ return TEXT;
+ }
+ else if ("bytes".equalsIgnoreCase(s))
+ {
+ return BYTES;
+ }
+ /*else if ("map".equalsIgnoreCase(s))
+ {
+ return MAP;
+ }
+ else if ("object".equalsIgnoreCase(s))
+ {
+ return OBJECT;
+ }*/
+ else
+ {
+ throw new Exception("Unsupported message type");
+ }
+ }
+ };
+
+ public final static String TIMESTAMP = "ts";
+
+ public final static String EOS = "eos";
+
+ public final static String SEQUENCE_NUMBER = "sn";
+
+ public String getUrl();
+
+ public String getHost();
+
+ public int getPort();
+
+ public String getAddress();
+
+ public int getAckMode();
+
+ public int getMsgCount();
+
+ public int getMsgSize();
+
+ public int getRandomMsgSizeStartFrom();
+
+ public boolean isDurable();
+
+ public boolean isTransacted();
+
+ public int getTransactionSize();
+
+ public int getWarmupCount();
+
+ public boolean isCacheMessage();
+
+ public boolean isDisableMessageID();
+
+ public boolean isDisableTimestamp();
+
+ public boolean isRandomMsgSize();
+
+ public String getMessageType();
+
+ public boolean isPrintStdDev();
+
+ public int getSendRate();
+
+ public boolean isExternalController();
+
+ public boolean isUseUniqueDests();
+
+ public int getAckFrequency();
+
+ public Connection createConnection() throws Exception;
+
+ public DecimalFormat getDecimalFormat();
+
+ public int reportEvery();
+
+ public boolean isReportTotal();
+
+ public boolean isReportHeader();
+
+ public boolean isReportLatency();
+
+ public int getSendEOS();
+
+ public int getConnectionCount();
+
+ public int getRollbackFrequency();
+
+ public boolean isPrintHeaders();
+} \ No newline at end of file
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/TestParams.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/TestParams.java
deleted file mode 100644
index d73be0181b..0000000000
--- a/qpid/java/tools/src/main/java/org/apache/qpid/tools/TestParams.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.qpid.tools;
-
-import javax.jms.Session;
-
-public class TestParams
-{
- /*
- * By default the connection URL is used.
- * This allows a user to easily specify a fully fledged URL any given property.
- * Ex. SSL parameters
- *
- * By providing a host & port allows a user to simply override the URL.
- * This allows to create multiple clients in test scripts easily,
- * without having to deal with the long URL format.
- */
- private String url = "amqp://guest:guest@clientid/testpath?brokerlist='tcp://localhost:5672'";
-
- private String host = "";
-
- private int port = -1;
-
- private String address = "queue; {create : always}";
-
- private int msg_size = 1024;
-
- private int random_msg_size_start_from = 1;
-
- private boolean cacheMessage = false;
-
- private boolean disableMessageID = false;
-
- private boolean disableTimestamp = false;
-
- private boolean durable = false;
-
- private boolean transacted = false;
-
- private int transaction_size = 1000;
-
- private int ack_mode = Session.AUTO_ACKNOWLEDGE;
-
- private int msg_count = 10;
-
- private int warmup_count = 1;
-
- private boolean random_msg_size = false;
-
- private String msgType = "bytes";
-
- private boolean printStdDev = false;
-
- private long rate = -1;
-
- private boolean externalController = false;
-
- private boolean useUniqueDest = false; // useful when using multiple connections.
-
- public TestParams()
- {
-
- url = System.getProperty("url",url);
- host = System.getProperty("host","");
- port = Integer.getInteger("port", -1);
- address = System.getProperty("address",address);
-
- msg_size = Integer.getInteger("msg_size", 1024);
- cacheMessage = Boolean.getBoolean("cache_msg");
- disableMessageID = Boolean.getBoolean("disableMessageID");
- disableTimestamp = Boolean.getBoolean("disableTimestamp");
- durable = Boolean.getBoolean("durable");
- transacted = Boolean.getBoolean("transacted");
- transaction_size = Integer.getInteger("trans_size",1000);
- ack_mode = Integer.getInteger("ack_mode",Session.AUTO_ACKNOWLEDGE);
- msg_count = Integer.getInteger("msg_count",msg_count);
- warmup_count = Integer.getInteger("warmup_count",warmup_count);
- random_msg_size = Boolean.getBoolean("random_msg_size");
- msgType = System.getProperty("msg_type","bytes");
- printStdDev = Boolean.getBoolean("print_std_dev");
- rate = Long.getLong("rate",-1);
- externalController = Boolean.getBoolean("ext_controller");
- useUniqueDest = Boolean.getBoolean("use_unique_dest");
- random_msg_size_start_from = Integer.getInteger("random_msg_size_start_from", 1);
- }
-
- public String getUrl()
- {
- return url;
- }
-
- public String getHost()
- {
- return host;
- }
-
- public int getPort()
- {
- return port;
- }
-
- public String getAddress()
- {
- return address;
- }
-
- public int getAckMode()
- {
- return ack_mode;
- }
-
- public int getMsgCount()
- {
- return msg_count;
- }
-
- public int getMsgSize()
- {
- return msg_size;
- }
-
- public int getRandomMsgSizeStartFrom()
- {
- return random_msg_size_start_from;
- }
-
- public boolean isDurable()
- {
- return durable;
- }
-
- public boolean isTransacted()
- {
- return transacted;
- }
-
- public int getTransactionSize()
- {
- return transaction_size;
- }
-
- public int getWarmupCount()
- {
- return warmup_count;
- }
-
- public boolean isCacheMessage()
- {
- return cacheMessage;
- }
-
- public boolean isDisableMessageID()
- {
- return disableMessageID;
- }
-
- public boolean isDisableTimestamp()
- {
- return disableTimestamp;
- }
-
- public boolean isRandomMsgSize()
- {
- return random_msg_size;
- }
-
- public String getMessageType()
- {
- return msgType;
- }
-
- public boolean isPrintStdDev()
- {
- return printStdDev;
- }
-
- public long getRate()
- {
- return rate;
- }
-
- public boolean isExternalController()
- {
- return externalController;
- }
-
- public void setAddress(String addr)
- {
- address = addr;
- }
-
- public boolean isUseUniqueDests()
- {
- return useUniqueDest;
- }
-}
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/BasicReporter.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/BasicReporter.java
new file mode 100644
index 0000000000..a9896c1d4e
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/BasicReporter.java
@@ -0,0 +1,113 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools.report;
+
+import java.io.PrintStream;
+import java.lang.reflect.Constructor;
+
+import javax.jms.Message;
+
+public class BasicReporter implements Reporter
+{
+ PrintStream out;
+ int batchSize = 0;
+ int batchCount = 0;
+ boolean headerPrinted = false;
+ protected Statistics overall;
+ Statistics batch;
+ Constructor<? extends Statistics> statCtor;
+
+ public BasicReporter(Class<? extends Statistics> clazz, PrintStream out,
+ int batchSize, boolean printHeader) throws Exception
+ {
+ this.out = out;
+ this.batchSize = batchSize;
+ this.headerPrinted = !printHeader;
+ statCtor = clazz.getConstructor();
+ overall = statCtor.newInstance();
+ if (batchSize > 0)
+ {
+ batch = statCtor.newInstance();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.report.Reporter#message(javax.jms.Message)
+ */
+ @Override
+ public void message(Message msg)
+ {
+ overall.message(msg);
+ if (batchSize > 0)
+ {
+ batch.message(msg);
+ if (++batchCount == batchSize)
+ {
+ if (!headerPrinted)
+ {
+ header();
+ }
+ batch.report(out);
+ batch.clear();
+ batchCount = 0;
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.report.Reporter#report()
+ */
+ @Override
+ public void report()
+ {
+ if (!headerPrinted)
+ {
+ header();
+ }
+ overall.report(out);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.report.Reporter#header()
+ */
+ @Override
+ public void header()
+ {
+ headerPrinted = true;
+ overall.header(out);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.qpid.tools.report.Reporter#log()
+ */
+ @Override
+ public void log(String s)
+ {
+ // NOOP
+ }
+
+ @Override
+ public void clear()
+ {
+ batch.clear();
+ overall.clear();
+ }
+}
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/MercuryReporter.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/MercuryReporter.java
new file mode 100644
index 0000000000..e9bf7100c1
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/MercuryReporter.java
@@ -0,0 +1,167 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools.report;
+
+import java.io.PrintStream;
+
+import org.apache.qpid.tools.report.Statistics.Throughput;
+import org.apache.qpid.tools.report.Statistics.ThroughputAndLatency;
+
+public class MercuryReporter extends BasicReporter
+{
+ MercuryStatistics stats;
+
+ public MercuryReporter(Class<? extends MercuryStatistics> clazz, PrintStream out,
+ int batchSize, boolean printHeader) throws Exception
+ {
+ super(clazz, out, batchSize, printHeader);
+ stats = (MercuryStatistics)overall;
+ }
+
+ public double getRate()
+ {
+ return stats.getRate();
+ }
+
+ public double getAvgLatency()
+ {
+ return stats.getAvgLatency();
+ }
+
+ public double getStdDev()
+ {
+ return stats.getStdDev();
+ }
+
+ public double getMinLatency()
+ {
+ return stats.getMinLatency();
+ }
+
+ public double getMaxLatency()
+ {
+ return stats.getMaxLatency();
+ }
+
+ public int getSampleSize()
+ {
+ return stats.getSampleSize();
+ }
+
+ public interface MercuryStatistics extends Statistics
+ {
+ public double getRate();
+ public long getMinLatency();
+ public long getMaxLatency();
+ public double getAvgLatency();
+ public double getStdDev();
+ public int getSampleSize();
+ }
+
+ public static class MercuryThroughput extends Throughput implements MercuryStatistics
+ {
+ double rate = 0;
+
+ @Override
+ public void report(PrintStream out)
+ {
+ long elapsed = System.currentTimeMillis() - start;
+ rate = (double)messages/(double)elapsed;
+ }
+
+ @Override
+ public void clear()
+ {
+ super.clear();
+ rate = 0;
+ }
+
+ public double getRate()
+ {
+ return rate;
+ }
+
+ public int getSampleSize()
+ {
+ return messages;
+ }
+
+ public long getMinLatency() { return 0; }
+ public long getMaxLatency() { return 0; }
+ public double getAvgLatency(){ return 0; }
+ public double getStdDev(){ return 0; }
+
+ }
+
+ public static class MercuryThroughputAndLatency extends ThroughputAndLatency implements MercuryStatistics
+ {
+ double rate = 0;
+ double avgLatency = 0;
+ double stdDev;
+
+ @Override
+ public void report(PrintStream out)
+ {
+ long elapsed = System.currentTimeMillis() - start;
+ rate = (double)messages/(double)elapsed;
+ avgLatency = totalLatency/(double)sampleCount;
+ }
+
+ @Override
+ public void clear()
+ {
+ super.clear();
+ rate = 0;
+ avgLatency = 0;
+ }
+
+ public double getRate()
+ {
+ return rate;
+ }
+
+ public long getMinLatency()
+ {
+ return minLatency;
+ }
+
+ public long getMaxLatency()
+ {
+ return maxLatency;
+ }
+
+ public double getAvgLatency()
+ {
+ return avgLatency;
+ }
+
+ public double getStdDev()
+ {
+ return stdDev;
+ }
+
+ public int getSampleSize()
+ {
+ return messages;
+ }
+ }
+
+}
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/Reporter.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/Reporter.java
new file mode 100644
index 0000000000..5e481458be
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/Reporter.java
@@ -0,0 +1,40 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools.report;
+
+import javax.jms.Message;
+
+public interface Reporter
+{
+
+ public void message(Message msg);
+
+ public void report();
+
+ public void header();
+
+ // Will be used by some reporters to print statements which are greped by
+ // scripts. Example see java/tools/bin/perf-report
+ public void log(String s);
+
+ public void clear();
+
+} \ No newline at end of file
diff --git a/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/Statistics.java b/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/Statistics.java
new file mode 100644
index 0000000000..73efd1f1e0
--- /dev/null
+++ b/qpid/java/tools/src/main/java/org/apache/qpid/tools/report/Statistics.java
@@ -0,0 +1,139 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.tools.report;
+
+import java.io.PrintStream;
+import java.text.DecimalFormat;
+
+import javax.jms.Message;
+
+public interface Statistics
+{
+ public void message(Message msg);
+ public void report(PrintStream out);
+ public void header(PrintStream out);
+ public void clear();
+
+ static class Throughput implements Statistics
+ {
+ DecimalFormat df = new DecimalFormat("###.##");
+ int messages = 0;
+ long start = 0;
+ boolean started = false;
+
+ @Override
+ public void message(Message msg)
+ {
+ ++messages;
+ if (!started)
+ {
+ start = System.currentTimeMillis();
+ started = true;
+ }
+ }
+
+ @Override
+ public void report(PrintStream out)
+ {
+ long elapsed = System.currentTimeMillis() - start;
+ out.print(df.format((double)messages/(double)elapsed));
+ }
+
+ @Override
+ public void header(PrintStream out)
+ {
+ out.print("tp(m/s)");
+ }
+
+ public void clear()
+ {
+ messages = 0;
+ start = 0;
+ started = false;
+ }
+ }
+
+ static class ThroughputAndLatency extends Throughput
+ {
+ long minLatency = Long.MAX_VALUE;
+ long maxLatency = Long.MIN_VALUE;
+ double totalLatency = 0;
+ int sampleCount = 0;
+
+ @Override
+ public void message(Message msg)
+ {
+ super.message(msg);
+ try
+ {
+ long ts = msg.getLongProperty("ts");
+ long latency = System.currentTimeMillis() - ts;
+ minLatency = Math.min(latency, minLatency);
+ maxLatency = Math.min(latency, maxLatency);
+ totalLatency = totalLatency + latency;
+ sampleCount++;
+ }
+ catch(Exception e)
+ {
+ System.out.println("Error calculating latency");
+ }
+ }
+
+ @Override
+ public void report(PrintStream out)
+ {
+ super.report(out);
+ double avgLatency = totalLatency/(double)sampleCount;
+ out.append('\t')
+ .append(String.valueOf(minLatency))
+ .append('\t')
+ .append(String.valueOf(maxLatency))
+ .append('\t')
+ .append(df.format(avgLatency));
+
+ out.flush();
+ }
+
+ @Override
+ public void header(PrintStream out)
+ {
+ super.header(out);
+ out.append('\t')
+ .append("l-min")
+ .append('\t')
+ .append("l-max")
+ .append('\t')
+ .append("l-avg");
+
+ out.flush();
+ }
+
+ public void clear()
+ {
+ super.clear();
+ minLatency = 0;
+ maxLatency = 0;
+ totalLatency = 0;
+ sampleCount = 0;
+ }
+ }
+
+}
diff --git a/qpid/python/qpid/messaging/driver.py b/qpid/python/qpid/messaging/driver.py
index 0358659111..3cb62d75c9 100644
--- a/qpid/python/qpid/messaging/driver.py
+++ b/qpid/python/qpid/messaging/driver.py
@@ -226,7 +226,11 @@ class LinkIn:
def do_link(self, sst, rcv, _rcv, type, subtype, action):
link_opts = _rcv.options.get("link", {})
- reliability = link_opts.get("reliability", "at-least-once")
+ if type == "topic":
+ default_reliability = "unreliable"
+ else:
+ default_reliability = "at-least-once"
+ reliability = link_opts.get("reliability", default_reliability)
declare = link_opts.get("x-declare", {})
subscribe = link_opts.get("x-subscribe", {})
acq_mode = acquire_mode.pre_acquired
diff --git a/qpid/specs/management-schema.xml b/qpid/specs/management-schema.xml
index f0f5c0f9d2..06e0b99af0 100644
--- a/qpid/specs/management-schema.xml
+++ b/qpid/specs/management-schema.xml
@@ -125,8 +125,8 @@
<statistic name="abandonedViaAlt" type="count64" unit="message" desc="Messages routed to alternate exchange from a deleted queue"/>
<method name="echo" desc="Request a response to test the path to the management broker">
- <arg name="sequence" dir="IO" type="uint32" default="0"/>
- <arg name="body" dir="IO" type="lstr" default=""/>
+ <arg name="sequence" dir="IO" type="uint32"/>
+ <arg name="body" dir="IO" type="lstr"/>
</method>
<method name="connect" desc="Establish a connection to another broker">
@@ -143,7 +143,7 @@
<arg name="srcQueue" dir="I" type="sstr" desc="Source queue"/>
<arg name="destQueue" dir="I" type="sstr" desc="Destination queue"/>
<arg name="qty" dir="I" type="uint32" desc="# of messages to move. 0 means all messages"/>
- <arg name="filter" dir="I" type="map" default="{}" desc="if specified, move only those messages matching this filter"/>
+ <arg name="filter" dir="I" type="map" desc="if specified, move only those messages matching this filter"/>
</method>
<method name="setLogLevel" desc="Set the log level">
@@ -272,14 +272,14 @@
<method name="purge" desc="Discard all or some messages on a queue">
<arg name="request" dir="I" type="uint32" desc="0 for all messages or n>0 for n messages"/>
- <arg name="filter" dir="I" type="map" default="{}" desc="if specified, purge only those messages matching this filter"/>
+ <arg name="filter" dir="I" type="map" desc="if specified, purge only those messages matching this filter"/>
</method>
<method name="reroute" desc="Remove all or some messages on this queue and route them to an exchange">
<arg name="request" dir="I" type="uint32" desc="0 for all messages or n>0 for n messages"/>
<arg name="useAltExchange" dir="I" type="bool" desc="Iff true, use the queue's configured alternate exchange; iff false, use exchange named in the 'exchange' argument"/>
<arg name="exchange" dir="I" type="sstr" desc="Name of the exchange to route the messages through"/>
- <arg name="filter" dir="I" type="map" default="{}" desc="if specified, reroute only those messages matching this filter"/>
+ <arg name="filter" dir="I" type="map" desc="if specified, reroute only those messages matching this filter"/>
</method>
</class>
diff --git a/qpid/tests/src/py/qpid_tests/broker_0_10/management.py b/qpid/tests/src/py/qpid_tests/broker_0_10/management.py
index a17a945e29..2dd2291b2e 100644
--- a/qpid/tests/src/py/qpid_tests/broker_0_10/management.py
+++ b/qpid/tests/src/py/qpid_tests/broker_0_10/management.py
@@ -385,6 +385,30 @@ class ManagementTest (TestBase010):
# Cleanup
for e in ["A", "B"]: session.exchange_delete(exchange=e)
+ def test_reroute_invalid_alt_exchange(self):
+ """
+ Test that an error is returned for an attempt to reroute to
+ alternate exchange on a queue for which no such exchange has
+ been defined.
+ """
+ self.startQmf()
+ session = self.session
+ # create queue with no alt-exchange, and send a message to it
+ session.queue_declare(queue="q", exclusive=True, auto_delete=True)
+ props = session.delivery_properties(routing_key="q")
+ session.message_transfer(message=Message(props, "don't reroute me!"))
+
+ # attempt to reroute the message to alt-exchange
+ q = self.qmf.getObjects(_class="queue", name="q")[0]
+ result = q.reroute(1, True, "", {})
+ # verify the attempt fails...
+ self.assertEqual(result.status, 4) #invalid parameter
+
+ # ...and message is still on the queue
+ self.subscribe(destination="d", queue="q")
+ self.assertEqual("don't reroute me!", session.incoming("d").get(timeout=1).body)
+
+
def test_methods_async (self):
"""
"""
diff --git a/qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py b/qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py
index 5e03a7b487..05c4815e57 100644
--- a/qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py
+++ b/qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py
@@ -57,7 +57,7 @@ class GeneralTests(Base):
sess2 = self.setup_session()
tx = sess1.sender("amq.direct/key")
- rx_main = sess1.receiver("amq.direct/key;{link:{x-declare:{alternate-exchange:'amq.fanout'}}}")
+ rx_main = sess1.receiver("amq.direct/key;{link:{reliability:at-least-once,x-declare:{alternate-exchange:'amq.fanout'}}}")
rx_alt = sess2.receiver("amq.fanout")
rx_alt.capacity = 10
diff --git a/qpid/tools/src/py/qmf-tool b/qpid/tools/src/py/qmf-tool
index 8413ca2ca0..db51c96796 100755
--- a/qpid/tools/src/py/qmf-tool
+++ b/qpid/tools/src/py/qmf-tool
@@ -266,7 +266,7 @@ class QmfData:
self.conn_options = conn_options
self.qmf_options = qmf_options
self.agent_filter = '[]'
- self.connection = cqpid.Connection(self.url, self.conn_options)
+ self.connection = cqpid.Connection(self.url, **self.conn_options)
self.connection.open()
self.session = qmf2.ConsoleSession(self.connection, self.qmf_options)
self.session.setAgentFilter(self.agent_filter)
diff --git a/qpid/tools/src/py/qpid-ha b/qpid/tools/src/py/qpid-ha
index ac35e3ed2c..bd8040cfbe 100755
--- a/qpid/tools/src/py/qpid-ha
+++ b/qpid/tools/src/py/qpid-ha
@@ -113,7 +113,8 @@ class QueryCmd(Command):
for x in [("Status:", hb.status),
("Brokers URL:", hb.brokers),
("Public URL:", hb.publicBrokers),
- ("Expected Backups:", hb.expectedBackups)
+ ("Expected Backups:", hb.expectedBackups),
+ ("Replicate: ", hb.replicateDefault)
]:
print "%-20s %s"%(x[0], x[1])
QueryCmd()
diff --git a/qpid/tools/src/py/qpidtoollibs/broker.py b/qpid/tools/src/py/qpidtoollibs/broker.py
index c2340de9dd..0bae786306 100644
--- a/qpid/tools/src/py/qpidtoollibs/broker.py
+++ b/qpid/tools/src/py/qpidtoollibs/broker.py
@@ -268,6 +268,20 @@ class BrokerAgent(object):
def reloadAclFile(self):
self._method('reloadACLFile', {}, "org.apache.qpid.acl:acl:org.apache.qpid.broker:broker:amqp-broker")
+ def acl_lookup(self, userName, action, aclObj, aclObjName, propMap):
+ args = {'userId': userName,
+ 'action': action,
+ 'object': aclObj,
+ 'objectName': aclObjName,
+ 'propertyMap': propMap}
+ return self._method('Lookup', args, "org.apache.qpid.acl:acl:org.apache.qpid.broker:broker:amqp-broker")
+
+ def acl_lookupPublish(self, userName, exchange, key):
+ args = {'userId': userName,
+ 'exchangeName': exchange,
+ 'routingKey': key}
+ return self._method('LookupPublish', args, "org.apache.qpid.acl:acl:org.apache.qpid.broker:broker:amqp-broker")
+
def create(self, _type, name, properties, strict):
"""Create an object of the specified type"""
pass
diff --git a/qpid/wcf/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp b/qpid/wcf/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp
index 33d125e3c6..ec98289923 100644
--- a/qpid/wcf/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp
+++ b/qpid/wcf/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp
@@ -49,6 +49,7 @@
#include "qpid/client/AsyncSession.h"
#include "qpid/client/Connection.h"
+#include "qpid/framing/FieldValue.h"
#include <map>
@@ -472,13 +473,15 @@ INT ResourceManager::recover(XID *xids, long count, long flags) {
try {
// status if we can't talk to the broker
status = XAER_RMFAIL;
- std::vector<std::string> wireFormatXids;
DtxRecoverResult dtxrr = qpidSession.dtxRecover(true);
// status if we can't process the xids
status = XAER_RMERR;
- dtxrr.getInDoubt().collect(wireFormatXids);
+
+ std::vector<std::string> wireFormatXids(dtxrr.getInDoubt().size());
+ std::transform(dtxrr.getInDoubt().begin(), dtxrr.getInDoubt().end(), wireFormatXids.begin(), Array::get<std::string, Array::ValuePtr>);
+
size_t nXids = wireFormatXids.size();
if (nXids > 0) {